ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0NDk0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUucGF0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjUwMjYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUucGF0Y2guaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWY4ODk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPG1ldGEgbmFtZT0iQnVpbGQiIGNvbnRlbnQ9IkJ1aWxkIj4KLTx0aXRsZT5XVFAgMy4wLjUgUGF0Y2hlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDE+V1RQIDMuMC41IFBhdGNoZXM8L2gxPgotCi08aDI+b3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlPC9oMj4KLTxwPkJ1ZyA8YQotCWhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODA2MjQnPjI4MDYyNDwvYT4uCi1XZWJTZXJ2aWNlc01hbmFnZXIncyBnZXRBbGxXb3Jrc3BhY2VTZXJ2aWNlUmVmcyBzaG91bGQgZ2V0IHRoZSBKRUUgNSB2ZXJzaW9ucyBhcyB3ZWxsPC9wPgotPHA+QnVnIDxhCi0JaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MTIyNSc+MjkxMjI1PC9hPi4KLU91dHB1dCBmb2xkZXIgc3VwcG9ydCBpbiBKYXZhRUUgcHJvamVjdHM8L3A+Ci08cD5CdWcgPGEKLQlocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyNDU3Jz4yOTI0NTc8L2E+LgotRUpCIGNsaWVudCBwcm9qZWN0IHNvdXJjZSBhbmQgb3VwdXQgc2hvdWxkIHN5bmNoIHVwIHdpdGggRUpCIHByb2plY3Q8L3A+Ci08cD5CdWcgPGEKLQlocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk5NzcwJz4yOTk3NzA8L2E+LgotV2FybmluZyBvY2N1cnMgb24gTWVzc2FnZURyaXZlbkJlYW4gY3JlYXRpb24gZHVlIHRvIC5qYXZhamV0IHRlbXBsYXRlPC9wPgotPHA+QnVnIDxhCi0JaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxMzYzMCc+MzEzNjMwPC9hPi4gCi1WMSBWYWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50IGNoYW5nZXMgZm9yIHBlcmZvcm1hbmNlPC9wPgotPHA+QnVnIDxhCi0JaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxOTczNSc+MzE5NzM1PC9hPi4KLVVud2FudGVkIG5ld2xpbmVzIGJlZm9yZSBkaXNwbGF5IG5hbWUgdmFsdWU8L3A+Ci08cD5CdWcgPGEKLQlocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzQ2MzAwJz4zNDYzMDA8L2E+LgotQ3JlYXRlIEVKQiBDbGllbnQgSmFyIGFjdGlvbiBjcmVhdGVzIGFuIGVtcHR5IHByb2plY3QgYnV0IHdpdGggbm8gc291cmNlIGNvZGUgb3IgaW50ZXJmYWNlczwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQzOGJiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XVFAgUGF0Y2ggZm9yIG9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVwKLVRoaXMgcGF0Y2ggZmVhdHVyZSBmaXhlcyBwcm9ibGVtcyBhcyBkZXNjcmliZWQgaW4gZm9sbG93aW5nIGJ1Z3M6XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MDYyNCBXZWJTZXJ2aWNlc01hbmFnZXIncyBnZXRBbGxXb3Jrc3BhY2VTZXJ2aWNlUmVmcyBzaG91bGQgZ2V0IHRoZSBKRUUgNSB2ZXJzaW9ucyBhcyB3ZWxsXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MTIyNSBPdXRwdXQgZm9sZGVyIHN1cHBvcnQgaW4gSmF2YUVFIHByb2plY3RzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MjQ1NyBFSkIgY2xpZW50IHByb2plY3Qgc291cmNlIGFuZCBvdXB1dCBzaG91bGQgc3luY2ggdXAgd2l0aCBFSkIgcHJvamVjdFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTk3NzAgV2FybmluZyBvY2N1cnMgb24gTWVzc2FnZURyaXZlbkJlYW4gY3JlYXRpb24gZHVlIHRvIC5qYXZhamV0IHRlbXBsYXRlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxMzYzMCBWMSBWYWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50IGNoYW5nZXMgZm9yIHBlcmZvcm1hbmNlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxOTczNSBVbndhbnRlZCBuZXdsaW5lcyBiZWZvcmUgZGlzcGxheSBuYW1lIHZhbHVlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM0NjMwMCBDcmVhdGUgRUpCIENsaWVudCBKYXIgYWN0aW9uIGNyZWF0ZXMgYW4gZW1wdHkgcHJvamVjdCBidXQgd2l0aCBubyBzb3VyY2UgY29kZSBvciBpbnRlcmZhY2VzXG5cCi1cblwKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotU2VwdGVtYmVyIDI3LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjIxMTQ5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZS5wYXRjaCIKLSAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgIHZlcnNpb249IjMuMC41LnF1YWxpZmllciIKLSAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgIDxkZXNjcmlwdGlvbj4lZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNvcHlyaWdodD4lY29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0KLSAgICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4lbGljZW5zZTwvbGljZW5zZT4KLQotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjUudjIwMDkwNTA3MDQzMC00MkVfNV9rRTc3ZDlJQ1I3Wl9IIiBwYXRjaD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDZkMzAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1mZWF0dXJlLnRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkyZGI2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1MDI2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGM2NjcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxtZXRhIG5hbWU9IkJ1aWxkIiBjb250ZW50PSJCdWlsZCI+Ci08dGl0bGU+V2ViIFRvb2xzIFBsYXRmb3JtIFBhdGNoIEJ1aWxkIE5vdGVzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMT5XVFAgMy4wLjUgUGF0Y2hlczwvaDE+Ci0KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjcyMzg5Jz4yNzIzODk8L2E+LiB0b2tlbml6ZXJzIHN0dWNrIGluIGxvb3Agd2hlbiBpbnB1dCBub3QgbWF0Y2hlZDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjc4MTMxJz4yNzgxMzE8L2E+LiBTdGFja092ZXJmbG93IHRocm93biBpbiBKRE9NU2VhcmNoSGVscGVyLmZpbmRJbm5lckphdmFFbGVtZW50PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yNzkwMzgnPjI3OTAzODwvYT4uIEpTUCBvcGVucyBkaXJ0eSBpZiBjb250ZW50IHR5cGUgaGVhZGVyIG1pc3NwZWxscyAiY2hhcnNldCI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI3OTE3NSc+Mjc5MTc1PC9hPi4gQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgZHVyaW5nOiAiVmFsaWRhdGlvbiBUZXN0RUpCIi48L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4MTE0Nyc+MjgxMTQ3PC9hPi4gcHJvYmxlbSBhZGRpbmcgZWU1IGxpYnMgdG8gY29udGFpbmVyPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODE1NjInPjI4MTU2MjwvYT4uIFVuc2FmZSBKRFQgY2FsbHMgaW4gY2xhc3NwYXRoIGNvbnRhaW5lciBjb2RlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODMxNzYnPjI4MzE3NjwvYT4uIE5QRSBpbiBFQVJBcnRpZmFjdEVkaXQuZ2V0TW9kdWxlQnlNYW5pZmVzdFVSSShTdHJpbmcgdXJpKTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgzMjA5Jz4yODMyMDk8L2E+LiAhTUVTU0FHRSBFeGNlcHRpb24gd2hpbGUgcmVhZGluZyAvRUFSNUNsaWVudC8uY2xhc3NwYXRoPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODMzMTgnPjI4MzMxODwvYT4uIFNpbmdsZSByb290IGNoZWNrIGZhaWxpbmcgd2hlbiBzb3VyY2UgZm9sZGVyIG1hcHBlZCBidXQgZGVsZXRlZDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgzNTgwJz4yODM1ODA8L2E+LiBFQVIgNS4wIGxpYnMgcGVyZm9ybWFuY2UgYW5kIG1pc3NpbmcgdXBkYXRlczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgzNjAxJz4yODM2MDE8L2E+LiBGb3IgV2ViIFByb2plY3QgdmVyaWZ5IHNvdXJjZSBmb2xkZXJzIGFuZCB3ZWIgY29udGVudCBkbyBub3QgY29sbGlkZTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgzNjMyJz4yODM2MzI8L2E+LiBFSmIgcmVmIHZhbGlkYXRpb24gaW4gRUFSIHZhbGlkYXRvciBuZWVkIHRvIHRocm93IGVycm9yIG1lc3NhZ2U8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4NDMwMic+Mjg0MzAyPC9hPi4gTWVtb3J5IGxlYWtzIGluIElBcmNoaXZlIGNsYXNzZXM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4NDMyNyc+Mjg0MzI3PC9hPi4gTWVtb3J5IGxlYWtzIGJlY2F1c2Ugb2YgZmluYWwgc3RhdGljIGNvbnN0YW50czwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg0OTMyJz4yODQ5MzI8L2E+LiBUYWdsaWJJbmRleCBvcHRpbWl6YXRpb24gaWdub3JlcyBpbXBvcnRhbnQgcmVzb3VyY2UgY2hhbmdlIGV2ZW50czwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg1MDg3Jz4yODUwODc8L2E+LiBKU1AgVHJhbnNsYXRvciBkb2VzIG5vdCBzdXBwb3J0IEl0ZXJhdGlvblRhZyBjb25zdHJ1Y3RzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODY5MzcnPjI4NjkzNzwvYT4uIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBmcm9tIFRhZ2xpYkhlbHBlci5pc0l0ZXJhdGlvblRhZyBpbiBsb2c8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4Njk2OSc+Mjg2OTY5PC9hPi4gSmF2YSBzdHJpbmcgY29uc3RhbnRzIGNvbnRhaW5pbmcgZW50aXR5IHJlZmVyZW5jZXMgZ2V0IGRlY29kZWQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4Nzc0Mic+Mjg3NzQyPC9hPi4gRUFSIGltcG9ydCBzaG93aW5nIGVqYiBjbGllbnQgamFycyBvbiBzZWNvbmQgcGFnZSB3aGVuIGl0IHNob3VsZCBub3Q8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4Nzc0OSc+Mjg3NzQ5PC9hPi4gQ29yZSBleGNlcHRpb25zIGR1cmluZyBFQVIgaW1wb3J0PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODgxODQnPjI4ODE4NDwvYT4uIEVhciBpbXBvcnQgZmFpbHMgaWYgdHdvIEVKQiBtb2R1bGVzIHVzZSBzYW1lIGNsaWVudCBqYXI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4ODgzMic+Mjg4ODMyPC9hPi4gSUFyY2hpdmUgcGVyZm9ybWFuY2UgcHJvYmxlbXMgd2l0aCBsYXJnZSBhbW91bnQgb2YgZmlsZXMgd2l0aGluIHNpbmdsZSBhcmNoaXZlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODkyMDMnPjI4OTIwMzwvYT4uIEZhY2V0IGNsYXNzcGF0aCB1dGlsaXR5IG5vdCBwcm9wZXJseSBtaWdyYXRpbmcgbGVnYWN5IHByb2plY3RzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODgyOTAnPjI4ODI5MDwvYT4uIE5QRXMgaW4gVExEQ01Eb2N1bWVudE1hbmFnZXI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4OTI1Nyc+Mjg5MjU3PC9hPi4gW3RyYW5zbGF0aW9uXSBKU1BUcmFuc2xhdG9yIHNob3VsZCBoYW5kbGUgYXNzaWdubWVudCBpbiBKU1AgZXhwcmVzc2lvbnM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDgzMic+MjkwODMyPC9hPi4gQmFja3BvcnQgdGhlIGZpeCBmb3IgYnVnemlsbGEjMjYwOTMxIHRvIHd0cCAzLjAuNTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwNzM4Jz4yOTA3Mzg8L2E+LiBGYWxzZSBlcnJvcnMvd2FybmluZ3Mgd2hlbiB2YWxpZGF0aW5nIGV4cHJlc3Npb25zIHdpdGggbWFwczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwNTQzJz4yOTA1NDM8L2E+LiBCYWNrcG9ydCB0aGUgZml4IGZvciBidWdpbGxhIzI4MjkzNiB0byB3dHAgMy4wLjU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDQxMic+MjkwNDEyPC9hPi4gUGVyZm9ybWFuY2UgcHJvYmxlbSBpbiBtZXRob2QgVHlwZVV0aWwucmVzb2x2ZUluUGFyZW50cygpPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA1ODEnPjI5MDU4MTwvYT4uIE1hbnVhbCB2YWxpZGF0aW9uIGlzIGNsZWFuaW5nIHVwIHRoZSBhbHJlYWR5IHZhbGlkYXRlZCBjYWNoZSBvbiBldmVyeSBjYWxsPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA3NDInPjI5MDc0MjwvYT4uIEVBUiBFeHBvcnQgbm90IHByb3Blcmx5IGNsb3NpbmcgMS40IGFyY2hpdmVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA3NTcnPjI5MDc1NzwvYT4uICdQcmVwYXJlIGZvciBEZXBsb3ltZW50JyBlcnJvciBtZXNzYWdlIHN0YXRlcyAiSjJFRURlcGxveU9wZXJhdGlvbl8yX1VJXyI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDgzNyc+MjkwODM3PC9hPi4gRXhjZXB0aW9ucyBmcm9tIEpFTSBpbiBhZG9wdGVyIHByb2R1Y3Q8L3A+Ci08cD5CdWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDk2NiI+MjkwOTY2PC9hPi4gSlNQIGluY2x1ZGUgZGlyZWN0aXZlcyBkbyBub3QgaGFuZGxlIG5vbi1KU1AgY29udGVudCB0eXBlczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkxMTQzIj4yOTExNDM8L2E+LiBNZWNoYW5pc20gdG8gZXhwb3NlIFdFQi1JTkYvbGliIGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jaWVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTEyMjUnPjI5MTIyNTwvYT4uIE91dHB1dCBmb2xkZXIgc3VwcG9ydCBpbiBKYXZhRUUgcHJvamVjdHM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MTI1MSc+MjkxMjUxPC9hPi4gQVBJIG5lZWRlZCB0byBkZXRlcm1pbmUgaWYgcHJvamVjdCBoYXMgbm8gc2luZ2xlIHJvb3QgYW5kIHJlYXNvbnMgd2h5PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTEyNjYnPjI5MTI2NjwvYT4uIERlbGV0aW5nIGphdmEgc291cmNlIGZvbGRlcnMgc2hvdWxkIHJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBhcnRpZmFjdHMgZnJvbSB0aGUgLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50IGZpbGU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MTUzNic+MjkxNTM2PC9hPi4gU2Vzc2lvbiBCZWFuIHJlbW90ZSBpbnRlcmZhY2UgdmFsaWRhdGlvbiBzaG91bGQgYmUgZXJyb3IgZm9yIG1pc3NpbmcgbWV0aG9kczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjQ5MDQ0Jz4yNDkwNDQ8L2E+LiBXZWIgbW9kdWxlJ3MgamFyIG1vZHVsZXMgZnJvbSBhbm90aGVyIHByb2plY3QgYXJlIG5vdCBwdWJsaXNoZWQgZm9yIFRvbWNhdC48L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI3MjAxMyc+MjcyMDEzPC9hPi4gSkVNIEplbVByb2plY3RVdGlsaXRpZXMjZ2V0Q2xhc3NwYXRoQXNVUkxBcnJheShJSmF2YVByb2plY3QpIGZhaWxzIHRvIGhhbmRsZSBjbGFzcyBmb2xkZXJzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA3MzknPjI5MDczOTwvYT4uIERvbid0IHZhbGlkYXRlIHRoZSBleHByZXNzaW9uIHNlZ21lbnRzIGFmdGVyIHRoZSBtYXAgaWYgdGhlIG1hcCB2YWx1ZSB0eXBlIGlzIE9iamVjdDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkyMDc5Jz4yOTIwNzk8L2E+LiBbcGFyc2VyXSBTY3JpcHRsZXQgaW4gc2NyaXB0IGF0dHJpYnV0ZSB0YWdzIGNhbiBjYXVzZSB0aGUgcmVnaW9uIHRvIG5vdCBiZSBibG9jayB0ZXh0PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTIwODEnPjI5MjA4MTwvYT4uIFt0cmFuc2xhdGlvbl0gSmF2YXNjcmlwdCBjYW4gY2F1c2UgY3VzdG9tIHRhZ3MgdG8gbm90IGJlIHRyYW5zbGF0ZWQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MjE2Mic+MjkyMTYyPC9hPi4gaXNTaW5nbGVSb290IEFQSSBzaG91bGQgYWxsb3cgbm9uIEphdmEgc3JjIGZvbGRlciBhcyBvdXRwdXQgZm9yIEpDQTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkyMTc3Jz4yOTIxNzc8L2E+LiBbdmFsaWRhdGlvbl0gSlNQRGlyZWN0aXZlVmFsaWRhdG9yI3Byb2Nlc3NUYWdsaWJEaXJlY3RpdmUgc2hvdWxkIGhhbmRsZSBVUkwgVGFnbGliIFJlY29yZHM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MjE4Nic+MjkyMTg2PC9hPi4gV2ViTGliIFF1aWNrIGZpeGVzIHJldmVydGluZyBleGNsdXNpb25zPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTMwNDcnPjI5MzA0NzwvYT4uIFByb2JsZW0gd2l0aCBXVFBXb3JraW5nQ29weU1hbmFnZXIgYW5kIGRlbGV0aW5nIHByb2plY3RzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTM1MDInPjI5MzUwMjwvYT4uIFBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGJlY2F1c2Ugb2YgSmF2YUxpdGUgY2FsbHM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MzY4NSc+MjkzNjg1PC9hPi4gSkFYLVJQQyBjbGllbnQgSlNQczogSlNQRzAwMzZFOiBGYWlsZWQgdG8gZmluZCByZXNvdXJjZSAvc2FtcGxlRWNob1Byb3h5L1Rlc3RDbGllbnQuanNwPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTM5OTInPjI5Mzk5MjwvYT4uIFt2YWxpZGF0aW9uXSBKU1BCYXRjaFZhbGlkYXRvciBpcyB0YWtpbmcgc3Vic3RhbnRpYWxseSBsb25nZXIgd2hlbiBuZWVkZWQgdGFnbGlicyBhcmUgbm90IG9uIGNsYXNzIHBhdGg8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5Mzk4MSc+MjkzOTgxPC9hPi4gW3ZhbGlkYXRpb25dIEF0dHJpYnV0ZXMgZG8gbm90IGluZGljYXRlIHByb2JsZW1zIHdpdGggZHluYW1pYyBjb250ZW50IGluIHJ0ZXhwcnZhbHVlIGF0dHJpYnV0ZXM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NDM2OSc+Mjk0MzY5PC9hPi4gRUFSIDUuMCBMaWIgdXRpbGl0eSBkZXBsb3ltZW50PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTQ0OTAnPjI5NDQ5MDwvYT4uIEVBUiBMaWJyYXJpZXMgY29udGFpbmVyIG1pc2NvbXB1dGluZyBiZWNhdXNlIG9mIHN0YWxlIElKYXZhTGl0ZTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkzMjExJz4yOTMyMTE8L2E+LiBQZXJmb3JtYW5jZSBwcm9ibGVtIHdoZW4gdmFsaWRhdGUgbWFuYWdlZCBwcm9wZXJ0aWVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTQ2MjcnPjI5NDYyNzwvYT4uIERlbGV0aW5nIGZvbGRlcnMgc2hvdWxkIHJlbW92ZSBlbnRyeSBmcm9tIC5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCBmaWxlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTUzNTMnPjI5NTM1MzwvYT4uIEFkZGluZyBtb2R1bGUgdG8gYXBwbGljYXRpb24ueG1sIG5vIGxvbmdlciBnZW5lcmF0aW5nICJpZCIgYXR0cmlidXRlczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk0NzE2Jz4yOTQ3MTY8L2E+LiBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIgbWF5IGNhdXNlIFNBWFBhcnNlRXhjZXB0aW9uPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTU2MTcnPjI5NTYxNzwvYT4uIFdlYiBwcm9qZWN0IGNyZWF0aW9uIGRvZXMgbm90IGhvbm91ciB1c2VyIGlucHV0PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTU3MjgnPjI5NTcyODwvYT4uIERlZmVycmVkIEVMIGV4cHJlc3Npb25zIGFyZSBiZWluZyBtYXJrZWQgd2l0aCB2YWxpZGF0aW9uIHByb2JsZW1zPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTY3MTknPjI5NjcxOTwvYT4uIFJ1bnRpbWUgQ2hhbmdlIERlbGVnYXRlIHRocm93cyBOUEUgd2hlbiBjaGFuZ2luZyBmcm9tIFVua25vd24gUnVudGltZSB0eXBlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTg3OTYnPjI5ODc5NjwvYT4uIGlzU2luZ2xlUm9vdCBBUEkgc2hvdWxkIG5vdCByZXF1aXJlIGEgSmF2YSBzcmMgZm9sZGVyPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTM1MDQnPjI5MzUwNDwvYT4uIFt2YWxpZGF0aW9uXSBKU1Agc3ludGF4IHZhbGlkYXRvciByZXF1aXJlcyBicmFja2V0cyBhZnRlciBJRiBzdGF0ZW1lbnQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5Nzg1Mic+Mjk3ODUyPC9hPi4gRXJyb3IgbG9nIGVudHJ5IGZvciBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gcmVsYXRlZCB0byBBbm5vdGF0aW9ucyBhbmQgRU1GPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTg4OTEnPjI5ODg5MTwvYT4uIENsYXNzcGF0aCBpbml0aWFsaXphdGlvbiBpcyB2ZXJ5IHNsb3cgZm9yIGNvbXBsZXggRUFSczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5MTU2Jz4yOTkxNTY8L2E+LiBbcGFyc2VyXSBKU1BUb2tlbml6ZXIgZG9lcyBub3QgZGV0ZWN0IFVuaWNvZGUgY2hhcmFjdGVyIHJlZmVyZW5jZXMgYXMgeW91IHR5cGU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTM5Myc+Mjk5MzkzPC9hPi4gVmFsaWRhdGlvbiBvZiBydW50aW1lIGV4cHJlc3Npb25zIGluIEpTUCBjdXN0b20gdGFnIGF0dHJpYnV0ZXM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTQzMic+Mjk5NDMyPC9hPi4gSjJFRSBEZXBsb3ltZW50IGZyYW1ld29yayBkb2Vzbid0IGFsbG93IGZhY2V0IGV4Y2x1c2lvbnM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTQzNyc+Mjk5NDM3PC9hPi4gTlBFcyBsb2dnZWQgZHVlIHRvIGJ1ZyAyOTUzNTM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTQ4OCc+Mjk5NDg4PC9hPi4gW3RyYW5zbGF0aW9uXSBYTUxKU1BSZWdpb25IZWxwZXIjZGVjb2RlUmVtYWluaW5nUmVnaW9ucyBjYW4gY2F1c2UgTlBFPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTk0ODknPjI5OTQ4OTwvYT4uIFtjb250ZW50IG1vZGVsXSBDTURvY3VtZW50RmFjdG9yeVRMRCNnZXRDb250YWluZWRUZXh0IGNhbiBjYXVzZSBOUEU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTU0MSc+Mjk5NTQxPC9hPi4gRXhjZXNzaXZlIGxvZ2dpbmcgaW4gVGFnbGliQ2xhc3NMb2FkZXI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTY1NSc+Mjk5NjU1PC9hPi4gQ2xhc3NwYXRoU2VsZWN0aW9uIG5lZWRzIGJldHRlciBlcnJvciBoYW5kbGluZzwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5Nzg1Jz4yOTk3ODU8L2E+LiBIVE1MIGNhdXNlcyB2YWxpZGF0aW9uIGVycm9ycyBpbiBUYWcgZmlsZXM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMDA2Mic+MzAwMDYyPC9hPi4gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb2YgVmlydHVhbENvbXBvbmVudCBjYWNoaW5nPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDAwOTgnPjMwMDA5ODwvYT4uICdJbiBMaWIgRGlyJyBjaGVja2JveCBiZWluZyBpZ25vcmVkIHdoZW4gYSBqYXIgZGVwZW5kZW5jeSBpcyBhZGRlZCB0byBhbiBFQVI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMDE4Myc+MzAwMTgzPC9hPi4gQ29tcG9uZW50Y29yZS5jcmVhdGVDb21wb25lbnQgcmV0dXJucyBhIG51bGwgdmFsdWUgd2hlbiBjYWxsZWQgZnJvbSBhZG9wdGVyIHByb2R1Y3Q8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMDM4Nyc+MzAwMzg3PC9hPi4gTmVlZCB0byBwcm90ZWN0IGFnYWluc3QgTlBFIGluIGFkb3B0ZXIgSjJFRUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMTQxOSc+MzAxNDE5PC9hPi4gSWxsZWdhbEV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIGRlcGxveW1lbnQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMTQ3Nyc+MzAxNDc3PC9hPi4gRUFSIExpYnJhcmllcyBjb250YWluZXIgbWlzc2luZyBlbnRyaWVzIG9uIHJlc3RhcnQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMTU0MCc+MzAxNTQwPC9hPi4gSW5jb3JyZWN0IHJlcG9ydGluZyBvZiBKU1AgcHJvYmxlbXM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMTU5OCc+MzAxNTk4PC9hPi4gW3RyYW5zbGF0aW9uXSBDYW5ub3QgYmUgcmVzb2x2ZWQgZXJyb3JzIHdoZW4gU3RydXRzIDxiZWFuOmRlZmluZT4gaXMgZGVmaW5lZCB3aXRoaW4gaW5wdXQgdHlwZSBIVE1MIHRhZzwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAzMDcwJz4zMDMwNzA8L2E+LiByYW5kb20gYnVpbGQvY29tcGlsZSBlcnJvciBkdWUgdG8gb3V0IG9mIHN5bmMgZGVwbG95bWVudCBkZXNjcmlwdG9yPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDMxNDAnPjMwMzE0MDwvYT4uIENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciBpbmNvcnJlY3RseSBoYW5kbGVzIC5zZXR0aW5ncyBmaWxlczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAzMTMxJz4zMDMxMzE8L2E+LiBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyLmdldEVBUkxpYkRpciBzaG91bGQgY2hlY2sgYm90aCBERCBhbmQgZmFjZXQgdmVyc2lvbjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAzOTYzJz4zMDM5NjM8L2E+LiBFcnJvciBFeGNlcHRpb24gbG9nZ2VkIGR1cmluZyBkZXBsb3k8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwNTI1Mic+MzA1MjUyPC9hPi4gQ2xhc3NDYXN0RXhjZXB0aW9uOmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwgaW5jb21wYXRpYmxlIHdpdGggamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDUyNTMnPjMwNTI1MzwvYT4uIFBlcmZvcm1hbmNlIGlzc3VlIGluIE1hbnVhbCBFQVIgdmFsaWRhdGlvbjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzA2MDU4Jz4zMDYwNTg8L2E+LiBOb0NsYXNzRGVmRm91bmRFcnJvciBjb21pbmcgZnJvbSB0aGUgVGFnbGliSGVscGVyPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTMxODEnPjMxMzE4MTwvYT4uIEphdmEgRUUgaW1wb3J0IGZhaWxzIGlmIHppcCBlbnRyaWVzIGNvbnRhaW4gbGVhZGluZyBzbGFzaGVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTMzOTknPjMxMzM5OTwvYT4uIE9wZW5lciBvZiBBcmNoaXZlIGRpZG4ndCBjbG9zZSBhIGZpbGU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxMzYwOCc+MzEzNjA4PC9hPi4gcmFuZG9tIGJ1aWxkL2NvbXBpbGUgZXJyb3IgZHVlIHRvIG91dCBvZiBzeW5jIGZpbGVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTM2MzAnPjMxMzYzMDwvYT4uIFYxIFZhbGlkYXRvciBleHRlbnNpb24gcG9pbnQgY2hhbmdlcyBmb3IgcGVyZm9ybWFuY2U8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxNjIyMic+MzE2MjIyPC9hPi4gW3BhcnNlcl0gPCBvciA+IGluIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxNjI5MSc+MzE2MjkxPC9hPi4gW2hvdGJ1Z10gQmFja3BvcnQgMjkyOTQzIHRvIHd0cCAzLjAuNVBhdGNoPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTc1NjAnPjMxNzU2MDwvYT4uIEVycm9ycyBmbGFnZ2VkIGJ5IGVycm9yIGFubm90YXRpb25zIG5vdCByZWZsZWN0ZWQgaW4gdGhlIFByb2JsZW1zLCBFeHBsb3JlciwgYW5kL29yIE5hdmlnYXRvciB2aWV3cy48L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxODczNic+MzE4NzM2PC9hPi4gSW1wb3J0RGF0YU1vZGVsIHVuc2FmZWx5IGNoZWNrcyBqYXZhIGZhY2V0IG5hbWU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxOTMxMSc+MzE5MzExPC9hPi4gSmFycyBleHBvcnRlZCBhcyB2YXJpYWJsZSBuYW1lcyBpbnN0ZWFkIG9mIGphciBuYW1lczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE5NDM5Jz4zMTk0Mzk8L2E+LiBFQVIgVmFsaWRhdGlvbiB0aHJvd3MgZXhjZXB0aW9ucyBvbiBwcm9qZWN0IGNsb3NlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTk3MzUnPjMxOTczNTwvYT4uIFVud2FudGVkIG5ld2xpbmVzIGJlZm9yZSBkaXNwbGF5IG5hbWUgdmFsdWU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMDMxMic+MzIwMzEyPC9hPi4gTkxTIG1pc3NpbmcgbWVzc2FnZXMgaW4gLmxvZzwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIwMzIyJz4zMjAzMjI8L2E+LiBbdmFsaWRhdGlvbl0gSlNQIHNvdXJjZSB2YWxpZGF0b3JzIHJ1bm5pbmcgZXZlbiB3aGVuIHJlc3BlY3RpdmUgYmF0Y2ggdmFsaWRhdG9ycyBoYXZlIGJlZW4gdHVybmVkIG9mZjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIwNDM2Jz4zMjA0MzY8L2E+LiBqYXIncyBwbGFjZWQgaW4gSmF2YSBFRSA1IEVhcidzIGxpYiBkaXJlY3Rvcnkgc2hvdWxkIG5ldmVyIGJlIGNvbnNpZGVyZWQgIm1vZHVsZXMiPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjIxNzMnPjMyMjE3MzwvYT4uIEoyRUVEZXBsb3lPcGVyYXRpb24gZG9lcyBub3QgYWxsb3cgY2FsbGVycyB0byBnZXQgYSBsaXN0IG9mIGFmZmVjdGVkIHByb2plY3RzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjI0MTEnPjMyMjQxMTwvYT4uIFdlYmxpYiBjbGFzc3BhdGggZGVwZW5kZW5jaWVzIG5vdCByZXR1cm5lZCBmcm9tIG1lbWJlcnMoKSB3aGVuIHNpbmdsZS1yb290PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjI2NzgnPjMyMjY3ODwvYT4uIEluIEVBUlZpcnR1YWxDb21wb25lbnQuZ2V0SGFyZFJlZmVyZW5jZXMsIG5lZWQgdG8gZ2V0IHRoZSBhcmNoaXZlTmFtZSBkaXJlY3RseSBmcm9tIHRoZSByZWZlcmVuY2VkQ29tcG9uZW50LCBpbnN0ZWFkIG9mIGdldHRpbmcgaXQgZnJvbSB0aGUgZGVwZW5kZW50T2JqZWN0PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjI5NTMnPjMyMjk1MzwvYT4uIEoyRUVEZXBsb3lPcGVyYXRpb24gYWZmZWN0IHByb2plY3RzIHN1cHBvcnQgbmVlZHMgYSB3YXkgdG8gdGVsbCBpZiBhbnkgZGVwbG95ZXIgZG8gbm90IHByb3ZpZGUgdGhhdCBpbmZvPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjQyMjEnPjMyNDIyMTwvYT4uIEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuaW5MaWJEaXIgbmVlZHMgdG8gY29uc2lkZXIgY29tcG9uZW50IHBhcmFtZXRlciB3aGlsZSByZXR1cm5pbmcgcmVzdWx0PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjU4MDMnPjMyNTgwMzwvYT4uIE5QRSBpbiBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5YTUxKU1BSZWdpb25IZWxwZXIuZGVjb2RlUmVtYWluaW5nUmVnaW9ucyhYTUxKU1BSZWdpb25IZWxwZXIuamF2YToyNzgpPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjYwMTUnPjMyNjAxNTwvYT4uIEVhclZpcnR1YWxDb21wb25lbnQgbmVlZHMgdG8gY29udGludWUgdG8gdXNlIGNvbXBsZXRlIEFyY2hpdmVOYW1lPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjgwOTMnPjMyODA5MzwvYT4uIEVBUiBMaWJyYXJ5IERpcmVjdG9yeSBmaWVsZCBzaG91bGQgbm90IGhhdmUgcHJlY2VkaW5nIHNsYXNoPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMzQxNTEnPjMzNDE1MTwvYT4uIE5lZWQgdG8gYmFjayBvdXQgYnVnIDI5NDYyNzwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzM0NTU2Jz4zMzQ1NTY8L2E+LiBOZWVkIHRvIHJlc3RvcmUgc3VwcG9ydCBmYWxsYmFjayB0byBkZXBlbmRlbnRPYmplY3QgaW4gbWFpbnRlbmFuY2Ugc3RyZWFtPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMzkzMDcnPjMzOTMwNzwvYT4uIE5hbWUgY29sbGlzaW9ucyBub3QgcHJvcGVybHkgaGFuZGxlZCBvbiBFQVIgaW1wb3J0PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNDI3NDcnPjM0Mjc0NzwvYT4uIFJlZ3VsYXIgamFycyBhcmUgaW1wb3J0ZWQgYXMgQXBwIENsaWVudCBwcm9qZWN0cyB3aGVuIGltcG9ydGluZyBhbiBFQVIgNS4wIGlmIGphcnMgaGF2ZSBNQUlOLUNMQVNTIGF0dHJpYnV0ZSBpbiBNQU5JRkVTVC5NRjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzQzNTU5Jz4zNDM1NTk8L2E+LiBKRU0gbmVlZHMgdG8gaGFuZGxlIGEgZmx1c2ggYmV0dGVyPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNDgyMjEnPjM0ODIyMTwvYT4uIEpFTSBuZWVkcyB0byBoYW5kbGUgYSBmbHVzaCBiZXR0ZXIgKHJlZHV4KTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzUyMTQ4Jz4zNTIxNDg8L2E+LiBYTUwgSlNQIGNhbiBjcmVhdGUgdW5iYWxhbmNlZCBET00uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2YWQ2Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICBib2R5IHsKLSAgICBzaXplOiA4LjVpbiAxMS4waW47Ci0gICAgbWFyZ2luOiAwLjI1aW4gMC41aW4gMC4yNWluIDAuNWluOwotICAgIHRhYi1pbnRlcnZhbDogMC41aW47Ci0gICAgfQotICBwIHsgICAKLSAgICBtYXJnaW4tbGVmdDogYXV0bzsKLSAgICBtYXJnaW4tdG9wOiAgMC41ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0gICAgfQotICBwLmxpc3QgewotICAgIG1hcmdpbi1sZWZ0OiAwLjVpbjsKLSAgICBtYXJnaW4tdG9wOiAgMC4wNWVtOwotICAgIG1hcmdpbi1ib3R0b206IDAuMDVlbTsKLSAgICB9Ci0gIDwvc3R5bGU+Ci0KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotCi08cCBhbGlnbj1jZW50ZXI+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPjwvcD4KLQotPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKLVBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKLUFHUkVFTUVOVC48L3A+Ci0KLTxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KLQotPHA+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbAotY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Ci08cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Ci08cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KLW9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCi1Db250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCi1Qcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAotQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCi1jb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKLWFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMKLXRoZSBQcm9ncmFtLjwvcD4KLQotPHA+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyZxdW90OyBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCi1Db250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMKLUNvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgotCi08cD4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKLXdpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgotCi08cD4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KLQotPHA+PGI+Mi4gR1JBTlQgT0YgUklHSFRTPC9iPjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3Jrcwotb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlCi1Db250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbgotc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKLUNvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLAotb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQKLWxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZQotUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsCi1zdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAotYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCi1jb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yCi1ncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMKLWFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKLXBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKLUNvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkKLWFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLW9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcwotZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yCi1leGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudAotdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQotdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdAotaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50Ci10aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+PGI+My4gUkVRVUlSRU1FTlRTPC9iPjwvcD4KLQotPHA+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUKLWZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQ7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcwotb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvcgotY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycwotYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi1pbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcwotQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIKLXBhcnR5OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZQotZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhCi1yZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlCi1leGNoYW5nZS48L3A+Ci0KLTxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2gKLWNvcHkgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZAotd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKLVJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+Ci0KLTxwPjxiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9iPjwvcD4KLQotPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCi1yZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUKLWxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZgotdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUKLXBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yCi1pbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgotKCZxdW90O0NvbW1lcmNpYWwgQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZAotaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykKLWFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspCi1hcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQKLXBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZQotYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCi1vYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4KLW9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeQotdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlCi1JbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93bgotZXhwZW5zZS48L3A+Ci0KLTxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKLWNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKLWFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KLWRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UKLXBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyCi1Db250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi1tdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvcD4KLQotPHA+PGI+NS4gTk8gV0FSUkFOVFk8L2I+PC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMKLVBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUwotT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCi1BTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkKLU9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCi1leGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi10aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLAotZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKLWludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KLQotPHA+PGI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2I+PC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQKLU5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi1JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCi1XSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAotSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+Ci0KLTxwPjxiPjcuIEdFTkVSQUw8L2I+PC9wPgotCi08cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCi10aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24KLWJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0KLWV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgotCi08cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKLShpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZQotUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlcgotc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZQotZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgotCi08cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAotZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKLUFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lCi1hZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMKLXVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgotCi08cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcwotQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQotQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcKLXJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZQotQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlCi1Gb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQotYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYQotc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZQotZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZwotQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZQotQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMKLWV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vCi1yaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIKLXRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCi1vdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMKLUFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9wPgotCi08cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkKLXRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZQotdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMKLXJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvcD4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODJmMjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1RQIFBhdGNoZXMgZm9yIG9yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249XAotVGhlIGJ1Z3MgYW5kIGZpeGVzIGFyZSBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBidWd6aWxsYSBlbnRyaWVzOlxuXAotXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI3MjM4OSB0b2tlbml6ZXJzIHN0dWNrIGluIGxvb3Agd2hlbiBpbnB1dCBub3QgbWF0Y2hlZFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yNzgxMzEgU3RhY2tPdmVyZmxvdyB0aHJvd24gaW4gSkRPTVNlYXJjaEhlbHBlci5maW5kSW5uZXJKYXZhRWxlbWVudFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yNzkwMzggSlNQIG9wZW5zIGRpcnR5IGlmIGNvbnRlbnQgdHlwZSBoZWFkZXIgbWlzc3BlbGxzICJjaGFyc2V0IlxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yNzkxNzUgQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgZHVyaW5nOiAiVmFsaWRhdGlvbiBUZXN0RUpCIi5cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgxMTQ3IHByb2JsZW0gYWRkaW5nIGVlNSBsaWJzIHRvIGNvbnRhaW5lclxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODE1NjIgVW5zYWZlIEpEVCBjYWxscyBpbiBjbGFzc3BhdGggY29udGFpbmVyIGNvZGVcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgzMTc2IE5QRSBpbiBFQVJBcnRpZmFjdEVkaXQuZ2V0TW9kdWxlQnlNYW5pZmVzdFVSSShTdHJpbmcgdXJpKVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODMyMDkgIU1FU1NBR0UgRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgL0VBUjVDbGllbnQvLmNsYXNzcGF0aFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODMzMTggU2luZ2xlIHJvb3QgY2hlY2sgZmFpbGluZyB3aGVuIHNvdXJjZSBmb2xkZXIgbWFwcGVkIGJ1dCBkZWxldGVkXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4MzU4MCBFQVIgNS4wIGxpYnMgcGVyZm9ybWFuY2UgYW5kIG1pc3NpbmcgdXBkYXRlc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODM2MDEgRm9yIFdlYiBQcm9qZWN0IHZlcmlmeSBzb3VyY2UgZm9sZGVycyBhbmQgd2ViIGNvbnRlbnQgZG8gbm90IGNvbGxpZGVcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgzNjMyIEVKYiByZWYgdmFsaWRhdGlvbiBpbiBFQVIgdmFsaWRhdG9yIG5lZWQgdG8gdGhyb3cgZXJyb3IgbWVzc2FnZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODQzMDIgTWVtb3J5IGxlYWtzIGluIElBcmNoaXZlIGNsYXNzZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg0MzI3IE1lbW9yeSBsZWFrcyBiZWNhdXNlIG9mIGZpbmFsIHN0YXRpYyBjb25zdGFudHNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg0OTMyIFRhZ2xpYkluZGV4IG9wdGltaXphdGlvbiBpZ25vcmVzIGltcG9ydGFudCByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4NTA4NyBKU1AgVHJhbnNsYXRvciBkb2VzIG5vdCBzdXBwb3J0IEl0ZXJhdGlvblRhZyBjb25zdHJ1Y3RzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4NjkzNyBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IgZnJvbSBUYWdsaWJIZWxwZXIuaXNJdGVyYXRpb25UYWcgaW4gbG9nXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4Njk2OSBKYXZhIHN0cmluZyBjb25zdGFudHMgY29udGFpbmluZyBlbnRpdHkgcmVmZXJlbmNlcyBnZXQgZGVjb2RlZFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODc3NDIgRUFSIGltcG9ydCBzaG93aW5nIGVqYiBjbGllbnQgamFycyBvbiBzZWNvbmQgcGFnZSB3aGVuIGl0IHNob3VsZCBub3RcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg3NzQ5IENvcmUgZXhjZXB0aW9ucyBkdXJpbmcgRUFSIGltcG9ydFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODgxODQgRWFyIGltcG9ydCBmYWlscyBpZiB0d28gRUpCIG1vZHVsZXMgdXNlIHNhbWUgY2xpZW50IGphclxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODg4MzIgSUFyY2hpdmUgcGVyZm9ybWFuY2UgcHJvYmxlbXMgd2l0aCBsYXJnZSBhbW91bnQgb2YgZmlsZXMgd2l0aGluIHNpbmdsZSBhcmNoaXZlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4OTIwMyBGYWNldCBjbGFzc3BhdGggdXRpbGl0eSBub3QgcHJvcGVybHkgbWlncmF0aW5nIGxlZ2FjeSBwcm9qZWN0c1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODgyOTAgTlBFcyBpbiBUTERDTURvY3VtZW50TWFuYWdlclxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODkyNTcgW3RyYW5zbGF0aW9uXSBKU1BUcmFuc2xhdG9yIHNob3VsZCBoYW5kbGUgYXNzaWdubWVudCBpbiBKU1AgZXhwcmVzc2lvbnNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwODMyIEJhY2twb3J0IHRoZSBmaXggZm9yIGJ1Z3ppbGxhIzI2MDkzMSB0byB3dHAgMy4wLjVcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwNzM4IEZhbHNlIGVycm9ycy93YXJuaW5ncyB3aGVuIHZhbGlkYXRpbmcgZXhwcmVzc2lvbnMgd2l0aCBtYXBzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDU0MyBCYWNrcG9ydCB0aGUgZml4IGZvciBidWdpbGxhIzI4MjkzNiB0byB3dHAgMy4wLjVcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwNDEyIFBlcmZvcm1hbmNlIHByb2JsZW0gaW4gbWV0aG9kIFR5cGVVdGlsLnJlc29sdmVJblBhcmVudHMoKVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA1ODEgTWFudWFsIHZhbGlkYXRpb24gaXMgY2xlYW5pbmcgdXAgdGhlIGFscmVhZHkgdmFsaWRhdGVkIGNhY2hlIG9uIGV2ZXJ5IGNhbGxcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwNzQyIEVBUiBFeHBvcnQgbm90IHByb3Blcmx5IGNsb3NpbmcgMS40IGFyY2hpdmVzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDc1NyAnUHJlcGFyZSBmb3IgRGVwbG95bWVudCcgZXJyb3IgbWVzc2FnZSBzdGF0ZXMgIkoyRUVEZXBsb3lPcGVyYXRpb25fMl9VSV8iXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDgzNyBFeGNlcHRpb25zIGZyb20gSkVNIGluIGFkb3B0ZXIgcHJvZHVjdFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA5NjYgSlNQIGluY2x1ZGUgZGlyZWN0aXZlcyBkbyBub3QgaGFuZGxlIG5vbi1KU1AgY29udGVudCB0eXBlc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTExNDMgTWVjaGFuaXNtIHRvIGV4cG9zZSBXRUItSU5GL2xpYiBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTEyMjUgT3V0cHV0IGZvbGRlciBzdXBwb3J0IGluIEphdmFFRSBwcm9qZWN0c1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTEyNTEgQVBJIG5lZWRlZCB0byBkZXRlcm1pbmUgaWYgcHJvamVjdCBoYXMgbm8gc2luZ2xlIHJvb3QgYW5kIHJlYXNvbnMgd2h5XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MTI2NiBEZWxldGluZyBqYXZhIHNvdXJjZSBmb2xkZXJzIHNob3VsZCByZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXJ0aWZhY3RzIGZyb20gdGhlIC5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCBmaWxlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MTUzNiBTZXNzaW9uIEJlYW4gcmVtb3RlIGludGVyZmFjZSB2YWxpZGF0aW9uIHNob3VsZCBiZSBlcnJvciBmb3IgbWlzc2luZyBtZXRob2RzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI0OTA0NCBXZWIgbW9kdWxlJ3MgamFyIG1vZHVsZXMgZnJvbSBhbm90aGVyIHByb2plY3QgYXJlIG5vdCBwdWJsaXNoZWQgZm9yIFRvbWNhdC5cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjcyMDEzIEpFTSBKZW1Qcm9qZWN0VXRpbGl0aWVzI2dldENsYXNzcGF0aEFzVVJMQXJyYXkoSUphdmFQcm9qZWN0KSBmYWlscyB0byBoYW5kbGUgY2xhc3MgZm9sZGVyc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA3MzkgRG9uJ3QgdmFsaWRhdGUgdGhlIGV4cHJlc3Npb24gc2VnbWVudHMgYWZ0ZXIgdGhlIG1hcCBpZiB0aGUgbWFwIHZhbHVlIHR5cGUgaXMgT2JqZWN0XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MjA3OSBbcGFyc2VyXSBTY3JpcHRsZXQgaW4gPHNjcmlwdD4gYXR0cmlidXRlIHRhZ3MgY2FuIGNhdXNlIHRoZSByZWdpb24gdG8gbm90IGJlIGJsb2NrIHRleHRcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkyMDgxIFt0cmFuc2xhdGlvbl0gSmF2YXNjcmlwdCBjYW4gY2F1c2UgY3VzdG9tIHRhZ3MgdG8gbm90IGJlIHRyYW5zbGF0ZWRcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkyMTYyIGlzU2luZ2xlUm9vdCBBUEkgc2hvdWxkIGFsbG93IG5vbiBKYXZhIHNyYyBmb2xkZXIgYXMgb3V0cHV0IGZvciBKQ0FcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkyMTc3IFt2YWxpZGF0aW9uXSBKU1BEaXJlY3RpdmVWYWxpZGF0b3IjcHJvY2Vzc1RhZ2xpYkRpcmVjdGl2ZSBzaG91bGQgaGFuZGxlIFVSTCBUYWdsaWIgUmVjb3Jkc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTIxODYgV2ViTGliIFF1aWNrIGZpeGVzIHJldmVydGluZyBleGNsdXNpb25zXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MzA0NyBQcm9ibGVtIHdpdGggV1RQV29ya2luZ0NvcHlNYW5hZ2VyIGFuZCBkZWxldGluZyBwcm9qZWN0c1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTM1MDIgUGVyZm9ybWFuY2UgZGVncmFkYXRpb24gYmVjYXVzZSBvZiBKYXZhTGl0ZSBjYWxsc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTM2ODUgSkFYLVJQQyBjbGllbnQgSlNQczogSlNQRzAwMzZFOiBGYWlsZWQgdG8gZmluZCByZXNvdXJjZSAvc2FtcGxlRWNob1Byb3h5L1Rlc3RDbGllbnQuanNwXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5Mzk5MiBbdmFsaWRhdGlvbl0gSlNQQmF0Y2hWYWxpZGF0b3IgaXMgdGFraW5nIHN1YnN0YW50aWFsbHkgbG9uZ2VyIHdoZW4gbmVlZGVkIHRhZ2xpYnMgYXJlIG5vdCBvbiBjbGFzcyBwYXRoXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5Mzk4MSBbdmFsaWRhdGlvbl0gQXR0cmlidXRlcyBkbyBub3QgaW5kaWNhdGUgcHJvYmxlbXMgd2l0aCBkeW5hbWljIGNvbnRlbnQgaW4gcnRleHBydmFsdWUgYXR0cmlidXRlc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTQzNjkgRUFSIDUuMCBMaWIgdXRpbGl0eSBkZXBsb3ltZW50XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NDQ5MCBFQVIgTGlicmFyaWVzIGNvbnRhaW5lciBtaXNjb21wdXRpbmcgYmVjYXVzZSBvZiBzdGFsZSBJSmF2YUxpdGVcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkzMjExIFBlcmZvcm1hbmNlIHByb2JsZW0gd2hlbiB2YWxpZGF0ZSBtYW5hZ2VkIHByb3BlcnRpZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk0NjI3IERlbGV0aW5nIGZvbGRlcnMgc2hvdWxkIHJlbW92ZSBlbnRyeSBmcm9tIC5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCBmaWxlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NTM1MyBBZGRpbmcgbW9kdWxlIHRvIGFwcGxpY2F0aW9uLnhtbCBubyBsb25nZXIgZ2VuZXJhdGluZyAiaWQiIGF0dHJpYnV0ZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk0NzE2IENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciBtYXkgY2F1c2UgU0FYUGFyc2VFeGNlcHRpb25cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk1NjE3IFdlYiBwcm9qZWN0IGNyZWF0aW9uIGRvZXMgbm90IGhvbm91ciB1c2VyIGlucHV0XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NTcyOCBEZWZlcnJlZCBFTCBleHByZXNzaW9ucyBhcmUgYmVpbmcgbWFya2VkIHdpdGggdmFsaWRhdGlvbiBwcm9ibGVtc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTY3MTkgUnVudGltZSBDaGFuZ2UgRGVsZWdhdGUgdGhyb3dzIE5QRSB3aGVuIGNoYW5naW5nIGZyb20gVW5rbm93biBSdW50aW1lIHR5cGVcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk4Nzk2IGlzU2luZ2xlUm9vdCBBUEkgc2hvdWxkIG5vdCByZXF1aXJlIGEgSmF2YSBzcmMgZm9sZGVyXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MzUwNCBbdmFsaWRhdGlvbl0gSlNQIHN5bnRheCB2YWxpZGF0b3IgcmVxdWlyZXMgYnJhY2tldHMgYWZ0ZXIgSUYgc3RhdGVtZW50XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5Nzg1MiBFcnJvciBsb2cgZW50cnkgZm9yIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiByZWxhdGVkIHRvIEFubm90YXRpb25zIGFuZCBFTUZcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk4ODkxIENsYXNzcGF0aCBpbml0aWFsaXphdGlvbiBpcyB2ZXJ5IHNsb3cgZm9yIGNvbXBsZXggRUFSc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTkxNTYgW3BhcnNlcl0gSlNQVG9rZW5pemVyIGRvZXMgbm90IGRldGVjdCBVbmljb2RlIGNoYXJhY3RlciByZWZlcmVuY2VzIGFzIHlvdSB0eXBlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTM5MyBWYWxpZGF0aW9uIG9mIHJ1bnRpbWUgZXhwcmVzc2lvbnMgaW4gSlNQIGN1c3RvbSB0YWcgYXR0cmlidXRlc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTk0MzIgSjJFRSBEZXBsb3ltZW50IGZyYW1ld29yayBkb2Vzbid0IGFsbG93IGZhY2V0IGV4Y2x1c2lvbnNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5NDM3IE5QRXMgbG9nZ2VkIGR1ZSB0byBidWcgMjk1MzUzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTQ4OCBbdHJhbnNsYXRpb25dIFhNTEpTUFJlZ2lvbkhlbHBlciNkZWNvZGVSZW1haW5pbmdSZWdpb25zIGNhbiBjYXVzZSBOUEVcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5NDg5IFtjb250ZW50IG1vZGVsXSBDTURvY3VtZW50RmFjdG9yeVRMRCNnZXRDb250YWluZWRUZXh0IGNhbiBjYXVzZSBOUEVcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5NTQxIEV4Y2Vzc2l2ZSBsb2dnaW5nIGluIFRhZ2xpYkNsYXNzTG9hZGVyXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTY1NSBDbGFzc3BhdGhTZWxlY3Rpb24gbmVlZHMgYmV0dGVyIGVycm9yIGhhbmRsaW5nXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTc4NSBIVE1MIGNhdXNlcyB2YWxpZGF0aW9uIGVycm9ycyBpbiBUYWcgZmlsZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAwMDYyIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9mIFZpcnR1YWxDb21wb25lbnQgY2FjaGluZ1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDAwOTggJ0luIExpYiBEaXInIGNoZWNrYm94IGJlaW5nIGlnbm9yZWQgd2hlbiBhIGphciBkZXBlbmRlbmN5IGlzIGFkZGVkIHRvIGFuIEVBUlxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDAxODMgQ29tcG9uZW50Y29yZS5jcmVhdGVDb21wb25lbnQgcmV0dXJucyBhIG51bGwgdmFsdWUgd2hlbiBjYWxsZWQgZnJvbSBhZG9wdGVyIHByb2R1Y3RcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAwMzg3IE5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IE5QRSBpbiBhZG9wdGVyIEoyRUVFbGVtZW50Q2hhbmdlZExpc3RlbmVyXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMTQxOSBJbGxlZ2FsRXhjZXB0aW9uIHRocm93biBkdXJpbmcgZGVwbG95bWVudFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDE0NzcgRUFSIExpYnJhcmllcyBjb250YWluZXIgbWlzc2luZyBlbnRyaWVzIG9uIHJlc3RhcnRcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAxNTQwIEluY29ycmVjdCByZXBvcnRpbmcgb2YgSlNQIHByb2JsZW1zXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMTU5OCBbdHJhbnNsYXRpb25dIENhbm5vdCBiZSByZXNvbHZlZCBlcnJvcnMgd2hlbiBTdHJ1dHMgPGJlYW46ZGVmaW5lPiBpcyBkZWZpbmVkIHdpdGhpbiA8aW5wdXQgdHlwZT4gSFRNTCB0YWdcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAzMDcwIHJhbmRvbSBidWlsZC9jb21waWxlIGVycm9yIGR1ZSB0byBvdXQgb2Ygc3luYyBkZXBsb3ltZW50IGRlc2NyaXB0b3JcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAzMTQwIENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciBpbmNvcnJlY3RseSBoYW5kbGVzIC5zZXR0aW5ncyBmaWxlc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDMxMzEgSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lci5nZXRFQVJMaWJEaXIgc2hvdWxkIGNoZWNrIGJvdGggREQgYW5kIGZhY2V0IHZlcnNpb25cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAzOTYzIEVycm9yIEV4Y2VwdGlvbiBsb2dnZWQgZHVyaW5nIGRlcGxveVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDUyNTIgQ2xhc3NDYXN0RXhjZXB0aW9uOmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwgaW5jb21wYXRpYmxlIHdpdGggamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwNTI1MyBQZXJmb3JtYW5jZSBpc3N1ZSBpbiBNYW51YWwgRUFSIHZhbGlkYXRpb25cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzA2MDU4IE5vQ2xhc3NEZWZGb3VuZEVycm9yIGNvbWluZyBmcm9tIHRoZSBUYWdsaWJIZWxwZXJcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzEzMTgxIEphdmEgRUUgaW1wb3J0IGZhaWxzIGlmIHppcCBlbnRyaWVzIGNvbnRhaW4gbGVhZGluZyBzbGFzaGVzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxMzM5OSBPcGVuZXIgb2YgQXJjaGl2ZSBkaWRuJ3QgY2xvc2UgYSBmaWxlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxMzYwOCByYW5kb20gYnVpbGQvY29tcGlsZSBlcnJvciBkdWUgdG8gb3V0IG9mIHN5bmMgZmlsZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzEzNjMwIFYxIFZhbGlkYXRvciBleHRlbnNpb24gcG9pbnQgY2hhbmdlcyBmb3IgcGVyZm9ybWFuY2VcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE2MjIyIFtwYXJzZXJdIDwgb3IgPiBpbiBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxNjI5MSBbaG90YnVnXSBCYWNrcG9ydCAyOTI5NDMgdG8gd3RwIDMuMC41UGF0Y2hcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE3NTYwIEVycm9ycyBmbGFnZ2VkIGJ5IGVycm9yIGFubm90YXRpb25zIG5vdCByZWZsZWN0ZWQgaW4gdGhlIFByb2JsZW1zLCBFeHBsb3JlciwgYW5kL29yIE5hdmlnYXRvciB2aWV3cy5cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE4NzM2IEltcG9ydERhdGFNb2RlbCB1bnNhZmVseSBjaGVja3MgamF2YSBmYWNldCBuYW1lXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxOTMxMSBKYXJzIGV4cG9ydGVkIGFzIHZhcmlhYmxlIG5hbWVzIGluc3RlYWQgb2YgamFyIG5hbWVzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxOTQzOSBFQVIgVmFsaWRhdGlvbiB0aHJvd3MgZXhjZXB0aW9ucyBvbiBwcm9qZWN0IGNsb3NlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxOTczNSBVbndhbnRlZCBuZXdsaW5lcyBiZWZvcmUgZGlzcGxheSBuYW1lIHZhbHVlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMDMxMiBOTFMgbWlzc2luZyBtZXNzYWdlcyBpbiAubG9nXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMDMyMiBbdmFsaWRhdGlvbl0gSlNQIHNvdXJjZSB2YWxpZGF0b3JzIHJ1bm5pbmcgZXZlbiB3aGVuIHJlc3BlY3RpdmUgYmF0Y2ggdmFsaWRhdG9ycyBoYXZlIGJlZW4gdHVybmVkIG9mZlxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjA0MzYgamFyJ3MgcGxhY2VkIGluIEphdmEgRUUgNSBFYXIncyBsaWIgZGlyZWN0b3J5IHNob3VsZCBuZXZlciBiZSBjb25zaWRlcmVkICJtb2R1bGVzIlxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjIxNzMgSjJFRURlcGxveU9wZXJhdGlvbiBkb2VzIG5vdCBhbGxvdyBjYWxsZXJzIHRvIGdldCBhIGxpc3Qgb2YgYWZmZWN0ZWQgcHJvamVjdHNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIyNDExIFdlYmxpYiBjbGFzc3BhdGggZGVwZW5kZW5jaWVzIG5vdCByZXR1cm5lZCBmcm9tIG1lbWJlcnMoKSB3aGVuIHNpbmdsZS1yb290XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMjY3OCBJbiBFQVJWaXJ0dWFsQ29tcG9uZW50LmdldEhhcmRSZWZlcmVuY2VzLCBuZWVkIHRvIGdldCB0aGUgYXJjaGl2ZU5hbWUgZGlyZWN0bHkgZnJvbSB0aGUgcmVmZXJlbmNlZENvbXBvbmVudCwgaW5zdGVhZCBvZiBnZXR0aW5nIGl0IGZyb20gdGhlIGRlcGVuZGVudE9iamVjdFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjI5NTMgSjJFRURlcGxveU9wZXJhdGlvbiBhZmZlY3QgcHJvamVjdHMgc3VwcG9ydCBuZWVkcyBhIHdheSB0byB0ZWxsIGlmIGFueSBkZXBsb3llciBkbyBub3QgcHJvdmlkZSB0aGF0IGluZm9cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzI0MjIxIEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuaW5MaWJEaXIgbmVlZHMgdG8gY29uc2lkZXIgY29tcG9uZW50IHBhcmFtZXRlciB3aGlsZSByZXR1cm5pbmcgcmVzdWx0XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyNTgwMyBOUEUgaW4gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuWE1MSlNQUmVnaW9uSGVscGVyLmRlY29kZVJlbWFpbmluZ1JlZ2lvbnMoWE1MSlNQUmVnaW9uSGVscGVyLmphdmE6Mjc4KVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjYwMTUgRWFyVmlydHVhbENvbXBvbmVudCBuZWVkcyB0byBjb250aW51ZSB0byB1c2UgY29tcGxldGUgQXJjaGl2ZU5hbWVcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzI4MDkzIEVBUiBMaWJyYXJ5IERpcmVjdG9yeSBmaWVsZCBzaG91bGQgbm90IGhhdmUgcHJlY2VkaW5nIHNsYXNoXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMzNDE1MSBOZWVkIHRvIGJhY2sgb3V0IGJ1ZyAyOTQ2MjdcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzM0NTU2IE5lZWQgdG8gcmVzdG9yZSBzdXBwb3J0IGZhbGxiYWNrIHRvIGRlcGVuZGVudE9iamVjdCBpbiBtYWludGVuYW5jZSBzdHJlYW1cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzM5MzA3IE5hbWUgY29sbGlzaW9ucyBub3QgcHJvcGVybHkgaGFuZGxlZCBvbiBFQVIgaW1wb3J0XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM0Mjc0NyBSZWd1bGFyIGphcnMgYXJlIGltcG9ydGVkIGFzIEFwcCBDbGllbnQgcHJvamVjdHMgd2hlbiBpbXBvcnRpbmcgYW4gRUFSIDUuMCBpZiBqYXJzIGhhdmUgTUFJTi1DTEFTUyBhdHRyaWJ1dGUgaW4gTUFOSUZFU1QuTUZcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzQzNTU5IEpFTSBuZWVkcyB0byBoYW5kbGUgYSBmbHVzaCBiZXR0ZXJcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzQ4MjIxIEpFTSBuZWVkcyB0byBoYW5kbGUgYSBmbHVzaCBiZXR0ZXIgKHJlZHV4KVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNTIxNDggWE1MIEpTUCBjYW4gY3JlYXRlIHVuYmFsYW5jZWQgRE9NLlxuXAotXG5cCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1BdWd1c3QsIDIwMDhcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTY1NmNiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC41LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjAuNS52MjAwOTA0MjQyMTMxLTdRN0FFZkpFSGhIZWhQbFc2U2FFNHUiIHBhdGNoPSJ0cnVlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNmLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNmLmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc2Yuc3RhbmRhcmQudGFnc3VwcG9ydCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwM2E2Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmE1YTRjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGJ1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMjA5MjQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotPHRpdGxlPldUUCAzLjAuNSBQYXRjaGVzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMT5XVFAgMy4wLjUgUGF0Y2hlczwvaDE+Ci0KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgwNDgzJz4yODA0ODM8L2E+LiAiQSBoYW5kbGVyIGNvbmZsaWN0IG9jY3VycmVkLiBUaGlzIG1heSBkaXNhYmxlIHNvbWUgY29tbWFuZHMuIiB3YXJuaW5nIG9uIHJlc3RhcnQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4NTI4NCc+Mjg1Mjg0PC9hPi4gUmVtb3ZpbmcgY29tbWVudCBlbmQgdGFnIGFuZCBhZGRpbmcgaXQgYmFjayBsZWF2ZXMgdmFsaWRhdGlvbiBlcnJvcnM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxNjQzMSc+MzE2NDMxPC9hPi4gRXJyb3IgYW5ub3RhdGlvbnMgbm90IHJlbW92ZWQgZnJvbSB0aGUgSlNQIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgdXBvbiByZXNvbHV0aW9uPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTc1NjAnPjMxNzU2MDwvYT4uIEVycm9ycyBmbGFnZ2VkIGJ5IGVycm9yIGFubm90YXRpb25zIG5vdCByZWZsZWN0ZWQgaW4gdGhlIFByb2JsZW1zLCBFeHBsb3JlciwgYW5kL29yIE5hdmlnYXRvciB2aWV3cy48L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMzI4NCc+MzIzMjg0PC9hPi4gUHJlZmVyZW5jZSBpbml0aWFsaXplcnMgYXJlIGxvYWRpbmcgdGVtcGxhdGUgc3RvcmVzIGFkZGluZyB0byBlZGl0b3IgbG9hZGluZyB0aW1lPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjc2ODAnPjMyNzY4MDwvYT4uIFN0cnVjdHVyZWQgTW9kZWwgYWNxdWlyZWQgd2l0aG91dCBiZWluZyByZWxlYXNlZDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzM0Njk2Jz4zMzQ2OTY8L2E+LiBWYWxpZGF0aW9uIHJ1bGUgbm90IGJlaW5nIHJlc3BlY3RlZC48L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM1MjE0OCc+MzUyMTQ4PC9hPi4gWE1MIEpTUCBjYW4gY3JlYXRlIHVuYmFsYW5jZWQgRE9NLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwNzNhMi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1RQIFBhdGNoIGZvciBqc3Qud2ViX3VpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249XAotVGhpcyBwYXRjaCBmaXhlcyBwcm9ibGVtcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBidWdzOiBcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgwNDgzICJBIGhhbmRsZXIgY29uZmxpY3Qgb2NjdXJyZWQuIFRoaXMgbWF5IGRpc2FibGUgc29tZSBjb21tYW5kcy4iIHdhcm5pbmcgb24gcmVzdGFydFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODUyODQgUmVtb3ZpbmcgY29tbWVudCBlbmQgdGFnIGFuZCBhZGRpbmcgaXQgYmFjayBsZWF2ZXMgdmFsaWRhdGlvbiBlcnJvcnNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE2NDMxIEVycm9yIGFubm90YXRpb25zIG5vdCByZW1vdmVkIGZyb20gdGhlIEpTUCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHVwb24gcmVzb2x1dGlvblxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTc1NjAgRXJyb3JzIGZsYWdnZWQgYnkgZXJyb3IgYW5ub3RhdGlvbnMgbm90IHJlZmxlY3RlZCBpbiB0aGUgUHJvYmxlbXMsIEV4cGxvcmVyLCBhbmQvb3IgTmF2aWdhdG9yIHZpZXdzLlxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjMyODQgUHJlZmVyZW5jZSBpbml0aWFsaXplcnMgYXJlIGxvYWRpbmcgdGVtcGxhdGUgc3RvcmVzIGFkZGluZyB0byBlZGl0b3IgbG9hZGluZyB0aW1lXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyNzY4MCBTdHJ1Y3R1cmVkIE1vZGVsIGFjcXVpcmVkIHdpdGhvdXQgYmVpbmcgcmVsZWFzZWRcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzM0Njk2IFZhbGlkYXRpb24gcnVsZSBub3QgYmVpbmcgcmVzcGVjdGVkLlxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNTIxNDggWE1MIEpTUCBjYW4gY3JlYXRlIHVuYmFsYW5jZWQgRE9NLlxuXAotXG5cCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUsIDIwMDhcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGQ4ODAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC41LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjUudjIwMDkwMzMwMDAzMS03RTRFQXpEZ3otWTFpdEJpNzR0NENVbVg3VGJGIiBwYXRjaD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmQzYTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3b3JrYmVuY2gvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDliYTk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotQGRvdAotb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaF8yLjAuMTAwLjIwMDgwNjAzMTMwNC5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmNzM1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjI2NjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gQXByIDE1IDIxOjE1OjU0IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTJhZWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotI1NhdCBNYXIgMzEgMjI6NTU6MjIgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4ZTFiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBGZWIgMjEgMTA6MDk6MTkgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1mb3JtYXR0ZXJfcHJvZmlsZT1fanZlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMAotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWVmMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMC4xMDQucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyxvcmcuZWNsaXBzZS5qZW0udGVzdHMiLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW47eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qZW07YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhY2VhNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD48aGVhZD48dGl0bGU+QWJvdXQ8L3RpdGxlPgotCi0KLQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PC9oZWFkPjxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlNDgyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQotc291cmNlLi4gPSB3b3JrYmVuY2gvCi1vdXRwdXQuLiA9IGJpbi8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzMjIzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMToxMzo1MyAkCi0jCi0KLQotcGx1Z2luTmFtZT1KYXZhIEVNRiBNb2RlbCBXb3JrYmVuY2ggU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQotSmF2YUVNRk5hdHVyZU5hbWU9SmF2YUVNRk5hdHVyZSBQcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTA4OTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkphdmFFTUZOYXR1cmUiCi0gICAgICAgICBuYW1lPSIlSmF2YUVNRk5hdHVyZU5hbWUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmF0dXJlcyI+Ci0gICAgICA8cnVudGltZT4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFFTUZOYXR1cmUiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3J1bnRpbWU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLm5hdHVyZV9yZWdpc3RyYXRpb24iPgotICAgICAgPG5hdHVyZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2guSmF2YUVNRk5hdHVyZSI+Ci0gICAgICA8L25hdHVyZT4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTUFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTUFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlZGYyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZkZhY3RvcnlJbXBsOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKRE9NQWRhcHRvciBleHRlbmRzIEphdmFSZWZsZWN0aW9uQWRhcHRvciB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIEphdmFSZWZQYWNrYWdlIEpBVkFfUEFDSyA9IEphdmFSZWZGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBzb3VyY2VQcm9qZWN0OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IElOVkFMSURfTElORU5PID0gLTE7Ci0JZmluYWwgcHJvdGVjdGVkIEludGVnZXIgZkxJTkVOT0xvY2sgPSBuZXcgSW50ZWdlcihJTlZBTElEX0xJTkVOTyk7Ci0JLy8gVGhpcyBvYmplY3QgaXMgbm90IHN0YXRpYywgYXMgaXQgaXMgdXNlZCBhcyBzeW5jaHJvbml6YXRpb24gZWxlbWVudC4KLQlwcml2YXRlIGludCBmUmVzb2x2ZWRMaW5lTm8gPSBJTlZBTElEX0xJTkVOTzsgLy8gTGluZSBvZmZzZXQgaW4gc291cmNlIGZpbGUKLQlwcml2YXRlIGludCBmUmVzb2x2ZWRDb2xObyA9IElOVkFMSURfTElORU5POyAvLyBDb2x1bW4gb2Zmc2V0IGluIHNvdXJjZSBmaWxlCi0JcHVibGljIEpET01BZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSUphdmFQcm9qZWN0IHdvcmtpbmdQcm9qZWN0KSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JCXNldFNvdXJjZVByb2plY3Qod29ya2luZ1Byb2plY3QpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclNvdXJjZSgpIHsKLQkJLy8gVG8gYmUgb3ZlcmlkZGVuIGlmIG5lZWRlZC4KLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgaW4gY2FuUmVmbGVjdCgpLiBJZiB0aGUgdGFyZ2V0IGlzIG5vdCBpbiBhIHJlc291cmNlLCBvciB0aGUKLQkgKiByZXNvdXJjZSBpcyBub3QgbG9hZGVkLCB0aGVuIGl0IGNhbid0IHJlZmxlY3QuIE11c3RuJ3QgcmVmbGVjdCBpZiB0aGUgdGFyZ2V0Ci0JICogaGFzIGJlZW4gdW5sb2FkZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVzb3VyY2VMb2FkZWQoKSB7Ci0JCVJlc291cmNlIHJlcyA9ICgoRU9iamVjdCkgZ2V0VGFyZ2V0KCkpLmVSZXNvdXJjZSgpOwotCQlyZXR1cm4gcmVzICE9IG51bGwgJiYgcmVzLmlzTG9hZGVkKCk7Ci0JfQotCQotCS8qKgotCSAqIFNjYW4gZm9yIENScyBhbmQgTEZzIHdpdGhpbiBhIGNoYXJhY3RlciBidWZmZXIKLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDI6MTQ6MTMgUE0pCi0JICogQHJldHVybiBpbnQgIExpbmVObyBhdCBjaGFyT2Zmc2V0Ci0JICogQHBhcmFtIGNoYXJPZmZzZXQgaW50Ci0JICogQHBhcmFtIGJ1ZmZlciBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVMaW5lT2Zmc2V0KGludCBjaGFyT2Zmc2V0LCBJQnVmZmVyIGJ1ZmZlcikgewotCi0JCWZSZXNvbHZlZENvbE5vID0gZlJlc29sdmVkTGluZU5vID0gSU5WQUxJRF9MSU5FTk87Ci0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNoYXJbXSBjaGFyQnVmZiA9IGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCk7Ci0KLQkJaWYgKGNoYXJCdWZmID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IExpbmVDb3VudCA9IDA7Ci0JCWludCBDb2xObyA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGNoYXJPZmZzZXQ7IGkrKykgewotCQkJQ29sTm8rKzsKLQkJCWlmIChjaGFyQnVmZltpXSA9PSAnXHInKSB7Ci0JCQkJTGluZUNvdW50Kys7Ci0JCQkJQ29sTm8gPSAwOwotCQkJCWlmIChjaGFyQnVmZltpICsgMV0gPT0gJ1xuJykKLQkJCQkJaSsrOyAvLyBza2lwIExpbmVGZWVkIGZvbGxvd2VkICBhIENSCi0JCQl9IGVsc2UgaWYgKGNoYXJCdWZmW2ldID09ICdcbicpIHsKLQkJCQlMaW5lQ291bnQrKzsKLQkJCQlDb2xObyA9IDA7Ci0JCQl9Ci0KLQkJfQotCQlmUmVzb2x2ZWRDb2xObyA9IENvbE5vOwotCQlmUmVzb2x2ZWRMaW5lTm8gPSBMaW5lQ291bnQ7Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2RJRCAtIGdlbmVyYXRlIHRoZSB1bmlxdWUgSUQgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIG1ldGhvZC4KLQkgKiBTaW1pbGFyIHRvIGEgU2lnbmF0dXJlLCBidXQgaG9wZWZ1bGx5IG1vcmUgcmVhZGFibGUuCi0JICogVGhlIG5hbWUgZm9ybWF0IHdpbGwgYmU6Ci0JICogCXNpbXBsZVR5cGVOYW1lLm1ldGhvZE5hbWUobXkucGFja2FnZS5QYXJtX1R5cGUxLHBhcm1UeXBlMgotCSAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggUmVmbGVjdGlvbkFkYXB0ZXIuZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZElEKElNZXRob2QgamRvbU1ldGhvZCkgewotCQlyZXR1cm4gY29tcHV0ZU1ldGhvZElEKGpkb21NZXRob2QsIGpkb21NZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZElEIC0gZ2VuZXJhdGUgdGhlIHVuaXF1ZSBJRCB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWV0aG9kLgotCSAqIFNpbWlsYXIgdG8gYSBTaWduYXR1cmUsIGJ1dCBob3BlZnVsbHkgbW9yZSByZWFkYWJsZS4KLQkgKiBUaGUgbmFtZSBmb3JtYXQgd2lsbCBiZToKLQkgKiAJc2ltcGxlVHlwZU5hbWUubWV0aG9kTmFtZShteS5wYWNrYWdlLlBhcm1fVHlwZTEscGFybVR5cGUyCi0JICogTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aWdodGx5IGNvdXBsZWQgd2l0aCBSZWZsZWN0aW9uQWRhcHRlci5nZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kSUQoSU1ldGhvZCBqZG9tTWV0aG9kLCBJVHlwZSB0eXBlLCBNYXAgdHlwZUNhY2hlKSB7Ci0JCVN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCW91dC5hcHBlbmQodHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpKTsKLQkJb3V0LmFwcGVuZChDX0NMQVNTX01FTUJFUl9ERUxJTUlURVIpOwotCQlvdXQuYXBwZW5kKGpkb21NZXRob2QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCW91dC5hcHBlbmQoQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIpOwotCQlTdHJpbmdbXSBwYXJtVHlwZU5hbWVzID0gamRvbU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlTdHJpbmcgcGFybU5hbWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJcGFybU5hbWUgPSBjb252ZXJ0SkRPTXR5cGVOYW1lKHBhcm1UeXBlTmFtZXNbaV0pOwotCQkJcGFybU5hbWUgPSBKRE9NU2VhcmNoSGVscGVyLmdldFJlc29sdmVkVHlwZU5hbWUocGFybU5hbWUsIHR5cGUsIHR5cGVDYWNoZSk7Ci0JCQlvdXQuYXBwZW5kKHBhcm1OYW1lKTsKLQkJCWlmIChpIDwgKHBhcm1UeXBlTmFtZXMubGVuZ3RoIC0gMSkpCi0JCQkJb3V0LmFwcGVuZChDX1BBUk1fUEFSTV9ERUxJTUlURVIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAoamRvbU1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpCi0JCQkJb3V0LmFwcGVuZChTX0NPTlNUUlVDVE9SX1RPS0VOKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2ROYW1lIC0gZ2VuZXJhdGUgdGhlIG5hbWUgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIG1ldGhvZC4KLQkgKiBGb3IgdGhlIG1vbWVudCwgbmFtZXMgYXJlIHNpbXBsZSwgYW5kIFVVSUQncyBhcmUgY29tcGxleC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kTmFtZShJTWV0aG9kIGpkb21NZXRob2QpIHsKLQkJcmV0dXJuIGpkb21NZXRob2QuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0JLyoqCi0JICogSmF2YSBjb250ZW50IGhhcyBjaGFuZ2VkLCBidXQgbm8gc3RydWN0dXJhbCBjaGFuZ2VzIHRoYXQgcmVxdWlyZQotCSAqIHRvIHJlZmxlY3RWYWx1ZXMoKTsgIGUuZy4sIHRoZSBib2R5IG9mIGEgbWV0aG9kIGhhcyBjaGFuZ2VkLgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzE3LzIwMDEgMTA6NDc6NTggQU0pCi0JICovCi0JcHVibGljIHZvaWQgY29udGVudENoYW5nZWQoKSB7Ci0JCXN5bmNocm9uaXplZCAoZkxJTkVOT0xvY2spIHsKLQkJCWZSZXNvbHZlZExpbmVObyA9IElOVkFMSURfTElORU5POwotCQkJZlJlc29sdmVkQ29sTm8gPSBJTlZBTElEX0xJTkVOTzsKLQkJfQotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kSUQgLSBnZW5lcmF0ZSB0aGUgdW5pcXVlIElEIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QuCi0JICogU2ltaWxhciB0byBhIFNpZ25hdHVyZSwgYnV0IGhvcGVmdWxseSBtb3JlIHJlYWRhYmxlLgotCSAqIFRoZSBuYW1lIGZvcm1hdCB3aWxsIGJlOgotCSAqIAltZXRob2ROYW1lX3Bhcm1UeXBlMV9wYXJtVHlwZTIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0SkRPTXR5cGVOYW1lKFN0cmluZyBqZG9tVHlwZU5hbWUpIHsKLQkJcmV0dXJuIHNpZ25hdHVyZVRvU3RyaW5nKGpkb21UeXBlTmFtZSk7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUphdmFGaWVsZCAtIGluc3RhbnRpYXRlIGEgSmF2YSBGaWVsZCBiYXNlZCBvbiB0aGUgcGFzc2VkIEphdmEgTW9kZWwgSUZpZWxkCi0JICogV2UgYXJlIGRlZmVycmluZyBmaWVsZCBjb250ZW50cyBhc3N1bWluZyB0aGF0IGl0cyBhZGFwdG9yIHdpbGwgcmVmbGVjdCBpdHMgZGV0YWlscy4KLQkgKi8KLQlwdWJsaWMgRmllbGQgY3JlYXRlSmF2YUZpZWxkKElGaWVsZCBqZG9tRmllbGQsIFhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVN0cmluZyBuYW1lID0gamRvbUZpZWxkLmdldEVsZW1lbnROYW1lKCk7Ci0JCUZpZWxkIG5ld0ZpZWxkID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVGaWVsZCgpOwotCQluZXdGaWVsZC5zZXROYW1lKG5hbWUpOwotCQlyZXNvdXJjZS5zZXRJRChuZXdGaWVsZCwgKChKYXZhQ2xhc3MpIGdldFRhcmdldCgpKS5nZXROYW1lKCkgKyBDX0NMQVNTX01FTUJFUl9ERUxJTUlURVIgKyBuYW1lKTsKLQkJcmV0dXJuIG5ld0ZpZWxkOwotCX0KLQkvKioKLQkgKiBjcmVhdGVKYXZhTWV0aG9kIC0gaW5zdGFudGlhdGUgYSBKYXZhIE1ldGhvZCBiYXNlZCBvbiB0aGUgcGFzc2VkIEphdmEgTW9kZWwgSU1ldGhvZAotCSAqIFdlIGFyZSBkZWZlcnJpbmcgbWV0aG9kIGNvbnRlbnRzIGFzc3VtaW5nIHRoYXQgaXRzIGFkYXB0b3Igd2lsbCByZWZsZWN0IGl0cyBkZXRhaWxzLgotCSAqIFdlIG5lZWQgdG8gc3RvcmUgZW5vdWdoIGluZm8gaW4gdGhlIGVtcHR5IE1ldGhvZCB0byBmaW5kIGl0cyBKYXZhIHNvdXJjZS4KLQkgKiBUaGUgVVVJRCB3aWxsIGV2ZW50dWFsbHkgaG9sZCBlbm91Z2ggaW5mbyB0byBpZGVudGlmeSB0aGUgc291cmNlLCBzbyB3ZSB1c2UgaXQuCi0JICovCi0JcHVibGljIE1ldGhvZCBjcmVhdGVKYXZhTWV0aG9kKElNZXRob2QgamRvbU1ldGhvZCwgWE1JUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJTWV0aG9kIG5ld01ldGhvZCA9IGdldEphdmFGYWN0b3J5KCkuY3JlYXRlTWV0aG9kKCk7Ci0JCS8vIFdlIHVzZSBhIHNpbXBsZSBuYW1lLCBidXQgYSBjb21wbGV4IElEIAotCQluZXdNZXRob2Quc2V0TmFtZShjb21wdXRlTWV0aG9kTmFtZShqZG9tTWV0aG9kKSk7Ci0JCXJlc291cmNlLnNldElEKG5ld01ldGhvZCwgY29tcHV0ZU1ldGhvZElEKGpkb21NZXRob2QsIGdldFR5cGUoKSwgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpKSk7Ci0JCXJldHVybiBuZXdNZXRob2Q7Ci0JfQotCXByb3RlY3RlZCBJUGF0aCBnZXRCaW5hcnlQYXRoRnJvbVF1YWxpZmllZE5hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKHF1YWxpZmllZE5hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHVibGljIElUeXBlIGdldEJpbmFyeVR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRTb3VyY2VQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJCUlKYXZhRWxlbWVudCBmb3VuZCA9IGdldFNvdXJjZVByb2plY3QoKS5maW5kRWxlbWVudChnZXRCaW5hcnlQYXRoRnJvbVF1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSkpOwotCQkJCWlmIChmb3VuZCAhPSBudWxsKQotCQkJCQlyZXR1cm4gKChJQ2xhc3NGaWxlKSBmb3VuZCkuZ2V0VHlwZSgpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfTG9va2luZ19VcF9UeXBlX0VSUk9SXyIsIChuZXcgT2JqZWN0W10geyBxdWFsaWZpZWROYW1lLCBqbWUuZ2V0TWVzc2FnZSgpfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJFcnJvciBsb29raW5nIHVwIHR5cGU6ICIKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQ29tcHV0ZSBhIGNvbHVtbiBudW1iZXIgZnJvbSB0aGUgSVNvdXJjZVJhbmdlIG9mZnNldAotCSAqIENhY2hlIHRoZSBsaW5lIG51bWJlciB0aGVyZWFmdGVyLiAgU291cmNlIGNoYW5nZSB3aWxsCi0JICogSW52b2tlIHRoZSBjb250ZW50Q2hhbmdlZCgpIG1ldGhvZC4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDExOjE2OjUxIEFNKQotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDb2xObygpIHsKLQotCQlzeW5jaHJvbml6ZWQgKGZMSU5FTk9Mb2NrKSB7Ci0JCQlpZiAoZlJlc29sdmVkQ29sTm8gPT0gSU5WQUxJRF9MSU5FTk8pCi0JCQkJcmVzb2x2ZUxpbmVDb2xObygpOwotCQl9Ci0JCXJldHVybiBmUmVzb2x2ZWRDb2xObzsKLQl9Ci0JLyoqCi0JICogQ29tcHV0ZSBhIGxpbmUgbnVtYmVyIGZyb20gdGhlIElTb3VyY2VSYW5nZSBvZmZzZXQKLQkgKiBDYWNoZSB0aGUgbGluZSBudW1iZXIgdGhlcmVhZnRlci4gIFNvdXJjZSBjaGFuZ2Ugd2lsbAotCSAqIEludm9rZSB0aGUgY29udGVudENoYW5nZWQoKSBtZXRob2QuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSAxMToxNjo1MSBBTSkKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZU5vKCkgewotCi0JCXN5bmNocm9uaXplZCAoZkxJTkVOT0xvY2spIHsKLQkJCWlmIChmUmVzb2x2ZWRMaW5lTm8gPT0gSU5WQUxJRF9MSU5FTk8pCi0JCQkJcmVzb2x2ZUxpbmVDb2xObygpOwotCQl9Ci0JCXJldHVybiBmUmVzb2x2ZWRMaW5lTm87Ci0JfQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDE6MTg6MjkgUE0pCi0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRSZWZsZWN0aW9uU291cmNlKCk7Ci0JLyogCi0JICogUmVzb2x2ZSBhIHR5cGUgbmFtZSBpbiB0aGUgY29udGV4dCBvZiBhIFR5cGUuCi0JICogKEJvcnJvd2VkIGZyb20gb3JnLmVjbGlwc2UuamR0LnVpLmNvZGVtYW5pcHVsYXRpb24uU3R1YlV0aWxpdHkuZ2V0UmVzb2x2ZWRUeXBlTmFtZSgpKQotCSAqIFRoZSBpbnB1dCBpcyBhIHNpbXBsZSBvciBxdWFsaWZpZWQgbmFtZSwgTk9UIGEgc2lnbmF0dXJlCi0JICogVGhlIG91dHB1dCB3aWxsIGJlIGEgcXVhbGlmaWVkIG5hbWUsIE5PVCBhIHNpZ25hdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc29sdmVkVHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lLCBJVHlwZSBkZWNsYXJpbmdUeXBlKSB7Ci0JCVN0cmluZyBuYW1lID0gdHlwZU5hbWU7Ci0JCXRyeSB7Ci0JCQluYW1lID0gSkRPTVNlYXJjaEhlbHBlci5yZXNvbHZlU2ltcGxlVHlwZU5hbWUoZGVjbGFyaW5nVHlwZSwgdHlwZU5hbWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRTb3VyY2VQcm9qZWN0KCkgewotCQlyZXR1cm4gc291cmNlUHJvamVjdDsKLQl9Ci0JcHJvdGVjdGVkIGFic3RyYWN0IElUeXBlIGdldFR5cGUoKTsKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKTsKLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VTb3VyY2VUeXBlKCkgewotCQlmbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KHRydWUpOyAvLyBpbmR1Y2UgY2xpZW50cyB0byBnZXQgTm90aWZpZWQuCi0JfQotCi0JcHVibGljIE5vdGlmaWNhdGlvbiByZWxlYXNlU291cmNlVHlwZU5vTm90aWZpY2F0aW9uKCkgewotCQlyZXR1cm4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKHRydWUpOyAvLyBpbmR1Y2UgY2xpZW50cyB0byBnZXQgTm90aWZpZWQuCi0JfQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8yMS8yMDAxIDg6MDk6MzQgQU0pCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVMaW5lQ29sTm8oKSB7Ci0KLQkJSU1lbWJlciBycyA9IChJTWVtYmVyKSBnZXRSZWZsZWN0aW9uU291cmNlKCk7Ci0JCWlmIChycyAhPSBudWxsKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gSU5WQUxJRF9MSU5FTk87Ci0JCQl0cnkgewotCQkJCUlTb3VyY2VSYW5nZSBzciA9IHJzLmdldE5hbWVSYW5nZSgpOwotCQkJCWlmIChzci5nZXRMZW5ndGgoKSA8PSAwKQotCQkJCQlyZXR1cm47Ci0JCQkJb2Zmc2V0ID0gc3IuZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gamUpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcnMuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQlpZiAoY3UgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlCdWZmZXIgYnVmZmVyID0gY3UuZ2V0QnVmZmVyKCk7Ci0JCQkJCWNvbXB1dGVMaW5lT2Zmc2V0KG9mZnNldCwgYnVmZmVyKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gamUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlUHJvamVjdChJSmF2YVByb2plY3Qgd29ya2luZ1Byb2plY3QpIHsKLQkJc291cmNlUHJvamVjdCA9IHdvcmtpbmdQcm9qZWN0OwotCX0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHR5cGUgc2lnbmF0dXJlIHRvIGEgcmVhZGFibGUgc3RyaW5nLgotCSAqCi0JICogVXNlcyBTaWduYXR1cmUudG9TdHJpbmcoKSwgdGhlbiB0cmllcyB0byB1bmRvIGJhZCByZXBsYWNlbWVudCBmb3IgaW5uZXIgY2xhc3Nlcy4KLQkgKiAKLQkgKiBCdWc6IDE2NjIyNiBbaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NjIyNl0KLQkgKiBVcGRhdGUgdG8gdXNlIHRoZSBlcmFzdXJlIHR5cGUgZnJvbSB0aGUgc2lnbmF0dXJlIGluIG9yZGVyIHRvIAotCSAqIHRvbGVyYXRlIEpESyA1IGdlbmVyaWNzLgotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2lnbmF0dXJlVG9TdHJpbmcoU3RyaW5nIHNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaGFzRG9sbGFyID0gKHNpZ25hdHVyZS5pbmRleE9mKFNpZ25hdHVyZS5DX0RPTExBUikgIT0gLTEpOwotCQkvL2JlZ2luIDE2NjIyNiBmaXgKLQkJU3RyaW5nIHJlc3VsdCA9IFNpZ25hdHVyZS5nZXRUeXBlRXJhc3VyZShzaWduYXR1cmUpOwotCQlyZXN1bHQgPSBTaWduYXR1cmUudG9TdHJpbmcocmVzdWx0KTsKLQkJLy9lbmQgMTY2MjI2IGZpeAotCQlpZiAoaGFzRG9sbGFyKSB7Ci0JCQlpbnQgbmV3UG9zID0gcmVzdWx0Lmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuZXdQb3MgIT0gLTEpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIG5ld1BvcykgKyAiJCIgKyByZXN1bHQuc3Vic3RyaW5nKG5ld1BvcyArIDEpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgdHlwZSBoZXJlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlTmFtZUZyb21TaWduYXR1cmUoU3RyaW5nIHNpZykgewotCQlyZXR1cm4gdHlwZU5hbWVGcm9tU2lnbmF0dXJlKHNpZywgZ2V0VHlwZSgpKTsKLQl9Ci0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgdHlwZSBoZXJlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlTmFtZUZyb21TaWduYXR1cmUoU3RyaW5nIHNpZywgSVR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiB0eXBlTmFtZUZyb21TaWduYXR1cmUoc2lnLCBwYXJlbnQsIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSk7Ci0JfQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHR5cGUgaGVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVOYW1lRnJvbVNpZ25hdHVyZShTdHJpbmcgc2lnLCBJVHlwZSBwYXJlbnQsIE1hcCB0eXBlQ2FjaGUpIHsKLQkJU3RyaW5nIHJlc3VsdDsKLQkJU3RyaW5nIGNvbXBvbmVudFNpZ25hdHVyZSA9IFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZShzaWcpOwotCQlpbnQgYXJyYXlEaW1lbnNpb25zID0gU2lnbmF0dXJlLmdldEFycmF5Q291bnQoc2lnKTsKLQkJcmVzdWx0ID0gSkRPTVNlYXJjaEhlbHBlci5nZXRSZXNvbHZlZFR5cGVOYW1lKHNpZ25hdHVyZVRvU3RyaW5nKGNvbXBvbmVudFNpZ25hdHVyZSksIHBhcmVudCwgdHlwZUNhY2hlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheURpbWVuc2lvbnM7IGkrKykgewotCQkJcmVzdWx0ID0gcmVzdWx0ICsgIltdIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KRE9NU2VhcmNoSGVscGVyI2ZpbmRUeXBlKFN0cmluZywgYm9vbGVhbiwgSUphdmFQcm9qZWN0LCBKRE9NQWRhcHRvcikKLQkgKi8KLQlwdWJsaWMgSVR5cGUgZ2V0VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlyZXR1cm4gSkRPTVNlYXJjaEhlbHBlci5maW5kVHlwZShxdWFsaWZpZWROYW1lLCBmYWxzZSwgZ2V0U291cmNlUHJvamVjdCgpLCB0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01DbGFzc0ZpbmRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQ2xhc3NGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEzNjk5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01DbGFzc0ZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDgvMTYvMjAwMCAxMTowNjo0NiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEpET01DbGFzc0ZpbmRlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSkRPTUNsYXNzRmluZGVyIGluc3RhbmNlOwotLyoqCi0gKiBKRE9NQ2xhc3NGaW5kZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEpET01DbGFzc0ZpbmRlcigpIHsKLQlzdXBlcigpOwotfQotcHJvdGVjdGVkIElQYXRoIGdldEJpbmFyeVBhdGhGcm9tUXVhbGlmaWVkTmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCXJldHVybiBuZXcgUGF0aChxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyIpOy8vJE5PTi1OTFMtMSQKLX0KLXB1YmxpYyBJVHlwZSBnZXRCaW5hcnlUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCi0JSUphdmFFbGVtZW50IGZvdW5kID0gZ2V0SmF2YUVsZW1lbnQocXVhbGlmaWVkTmFtZSk7Ci0JaWYgKGZvdW5kICE9IG51bGwpCi0JCXJldHVybiAoKElDbGFzc0ZpbGUpIGZvdW5kKS5nZXRUeXBlKCk7Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JdHJ5IHsKLQkJaWYgKGdldFNvdXJjZVByb2plY3QoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFNvdXJjZVByb2plY3QoKS5maW5kRWxlbWVudChnZXRQYXRoRnJvbVF1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSkpOwotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHtxdWFsaWZpZWROYW1lLCBqbWUuZ2V0TWVzc2FnZSgpfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJFcnJvciBsb29raW5nIHVwIHR5cGU6ICIKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci1wcm90ZWN0ZWQgSVBhdGggZ2V0UGF0aEZyb21RdWFsaWZpZWROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JcmV0dXJuIG5ldyBQYXRoKHF1YWxpZmllZE5hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmphdmEiKTsvLyROT04tTkxTLTEkCi19Ci1wcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldFNvdXJjZVByb2plY3QoKSB7Ci0JLy9yZXR1cm4gKElKYXZhUHJvamVjdCkgKChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKSkuZ2V0SmF2YVJlZkZhY3RvcnkoKS5nZXRKYXZhQ29udGV4dCgpOwotCXJldHVybiBudWxsOwotfQotcHVibGljIElUeXBlIGdldFR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJSUphdmFFbGVtZW50IGZvdW5kID0gZ2V0SmF2YUVsZW1lbnQocXVhbGlmaWVkTmFtZSk7Ci0JCWlmIChmb3VuZCAhPSBudWxsKQotCQkJaWYgKGZvdW5kIGluc3RhbmNlb2YgSUNsYXNzRmlsZSkKLQkJCQlyZXR1cm4gKChJQ2xhc3NGaWxlKSBmb3VuZCkuZ2V0VHlwZSgpOwotCQkJZWxzZQotCQkJCWlmIChmb3VuZCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBmb3VuZENVID0gKElDb21waWxhdGlvblVuaXQpIGZvdW5kOwotCQkJCQkvLyBzdHJpcCB0aGUgIi5qYXZhIiwgbGlmdGVkIGZyb20gQ29tcGlsYXRpb25Vbml0LmdldE1haW5UeXBlTmFtZSgpCi0JCQkJCVN0cmluZyBjdU1haW5UeXBlTmFtZSA9IGZvdW5kQ1UuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQkJY3VNYWluVHlwZU5hbWUgPSBjdU1haW5UeXBlTmFtZS5zdWJzdHJpbmcoMCwgY3VNYWluVHlwZU5hbWUubGVuZ3RoKCkgLSA1KTsKLQkJCQkJcmV0dXJuIGZvdW5kQ1UuZ2V0VHlwZShjdU1haW5UeXBlTmFtZSk7Ci0JCQkJfQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8xNi8yMDAwIDExOjE5OjQ4IFBNKQotICogQHJldHVybiBjb20uaWJtLmV0b29scy5qYXZhLmFkYXB0ZXJzLkpET01DbGFzc0ZpbmRlcgotICovCi1wdWJsaWMgc3RhdGljIEpET01DbGFzc0ZpbmRlciBpbnN0YW5jZSgpIHsKLQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJaW5zdGFuY2UgPSBuZXcgSkRPTUNsYXNzRmluZGVyKCk7Ci0JcmV0dXJuIGluc3RhbmNlOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NU2VhcmNoSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01TZWFyY2hIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI5YTBjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01TZWFyY2hIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDkvMjYvMjAwMSAxMTowOTozMCBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEpET01TZWFyY2hIZWxwZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPTFZFRF9OQU1FID0gIiA6OiBSRVNPTFZFRF9OQU1FIDo6ICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSSU9EID0gIi4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU4gPSAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQllURSA9ICJieXRlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSID0gImNoYXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUID0gInNob3J0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlQgPSAiaW50IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HID0gImxvbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZMT0FUID0gImZsb2F0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEUgPSAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEID0gInZvaWQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSkRPTVNlYXJjaEhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKRE9NU2VhcmNoSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiBJZiB0aGUgQHNpbXBsZU5hbWUgaXMgYW4gaW5uZXIgY2xhc3MsIHdlIG5lZWQgdG8gcmVzb2x2ZSBvbmx5IHRoZSBkZWNsYXJpbmcgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW11bXSBnZXRUeXBlTmFtZUluZm8oSVR5cGUgdHlwZSwgU3RyaW5nIHNpbXBsZU5hbWUsIGJvb2xlYW4gaXNGb3JSZWZsZWN0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nW11bXSByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZGVjbGFyaW5nTmFtZSwgdHlwZU5hbWU7Ci0JCXR5cGVOYW1lID0gc2ltcGxlTmFtZTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJaWYgKGlzRm9yUmVmbGVjdGlvbikKLQkJCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnJlcGxhY2UoJy4nLCAnJCcpOwotCQkJaW50IGluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZigiJCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJZGVjbGFyaW5nTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJcmVzdWx0ID0gdHlwZS5yZXNvbHZlVHlwZShkZWNsYXJpbmdOYW1lKTsKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkJaWYgKGlzRm9yUmVmbGVjdGlvbikKLQkJCQkJCXJlc3VsdFswXVsxXSA9IHJlc3VsdFswXVsxXS5yZXBsYWNlKCcuJywgJyQnKTsKLQkJCQkJcmVzdWx0WzBdWzFdICs9IHR5cGVOYW1lLnN1YnN0cmluZyhpbmRleCwgdHlwZU5hbWUubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKCJbIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCWRlY2xhcmluZ05hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQlyZXN1bHQgPSB0eXBlLnJlc29sdmVUeXBlKGRlY2xhcmluZ05hbWUpOwotCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCQlyZXN1bHRbMF1bMV0gPSByZXN1bHRbMF1bMV0gKyB0eXBlTmFtZS5zdWJzdHJpbmcoaW5kZXgpOwotCQkJCX0gZWxzZQotCQkJCQlyZXN1bHQgPSB0eXBlLnJlc29sdmVUeXBlKHR5cGVOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgaXMgYSBwcmltaXRpdmUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAoQk9PTEVBTi5lcXVhbHModHlwZSkgfHwgSU5ULmVxdWFscyh0eXBlKSB8fCBDSEFSLmVxdWFscyh0eXBlKSB8fCBTSE9SVC5lcXVhbHModHlwZSkgfHwgTE9ORy5lcXVhbHModHlwZSkgfHwgRkxPQVQuZXF1YWxzKHR5cGUpIHx8IERPVUJMRS5lcXVhbHModHlwZSkgfHwgQllURS5lcXVhbHModHlwZSkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgaXMgYSBwcmltaXRpdmUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlT3JWb2lkKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBpc1ByaW1pdGl2ZSh0eXBlKSB8fCBpc1ZvaWQodHlwZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNWb2lkKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBWT0lELmVxdWFscyh0eXBlKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gc2lnbmF0dXJlcyBtYXRjaCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hUeXBlU2lnbmF0dXJlcyhJVHlwZSB0eXBlLCBTdHJpbmcgc2lnbmF0dXJlMSwgU3RyaW5nIHNpZ25hdHVyZTIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gbWF0Y2hUeXBlU2lnbmF0dXJlcyh0eXBlLCBzaWduYXR1cmUxLCBzaWduYXR1cmUyLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gc2lnbmF0dXJlcyBtYXRjaCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hUeXBlU2lnbmF0dXJlcyhJVHlwZSB0eXBlLCBTdHJpbmcgc2lnbmF0dXJlMSwgU3RyaW5nIHNpZ25hdHVyZTIsIE1hcCByZXNvbHZlZE5hbWVDYWNoZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyBzaWcxID0gc2lnbmF0dXJlMTsKLQkJU3RyaW5nIHNpZzIgPSBzaWduYXR1cmUyOwotCQkvLyBGaXJzdCBjaGVjayBhcnJheSBjb3VudC4KLQkJaWYgKFNpZ25hdHVyZS5nZXRBcnJheUNvdW50KHNpZzEpID09IFNpZ25hdHVyZS5nZXRBcnJheUNvdW50KHNpZzIpKSB7Ci0JCQkvLyBXZSBoYXZlIHRoZSBzYW1lIGFycmF5IGNvdW50LCBnZXQgdGhlIGVsZW1lbnQgdHlwZXMgZm9yIGNvbnNpZGVyYXRpb24uCi0JCQlzaWcxID0gU2lnbmF0dXJlLmdldEVsZW1lbnRUeXBlKHNpZzEpOwotCQkJc2lnMiA9IFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZShzaWcyKTsKLQotCQkJLy8gVGhlcmUgYXJlIHRocmVlIGNhc2VzOgotCQkJLy8JCTEpIEJvdGggYXJlIHVucXVhbGlmaWVkIChib3RoIGJlaW5nIHByaW1pdGl2ZSB3aWxsIGZhbGwgaW50byB0aGlzKSwKLQkJCS8vCQkyKSBCb3RoIGFyZSBxdWFsaWZpZWQsIGFuZAotCQkJLy8JCTMpIE9uZSBpcyBxdWFsaWZpZWQgYW5kIHRoZSBvdGhlciBpcyBub3QgKG9uZSBjb3VsZCBiZSBwcmltaXRpdmUpLgotCi0JCQkvLyBGb3IgdGhlIGZpcnN0IHR3byBjYXNlcyBhIGNvbXBhcmUgb2YgdGhlIHJlYWRhYmxlIG5hbWVzIHdpbGwgYWx3YXlzIGRvLgotCQkJaWYgKCEoKHNpZzEuaW5kZXhPZignLicpID09IC0xKSBeIChzaWcyLmluZGV4T2YoJy4nKSA9PSAtMSkpKSB7Ci0JCQkJcmVzdWx0ID0gU2lnbmF0dXJlLnRvU3RyaW5nKHNpZzEpLmVxdWFscyhTaWduYXR1cmUudG9TdHJpbmcoc2lnMikpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBUaGlzIGlzIGNhc2UgMy4KLQkJCQkvLyBGaXJzdCByb290IG91dCBvbmUgYmVpbmcgcHJpbWl0aXZlLgotCQkJCWlmICgoKHNpZzEuY2hhckF0KDApID09ICdRJykgfHwgKHNpZzEuY2hhckF0KDApID09ICdMJykpICYmICgoc2lnMi5jaGFyQXQoMCkgPT0gJ1EnKSB8fCAoc2lnMi5jaGFyQXQoMCkgPT0gJ0wnKSkpIHsKLQkJCQkJLy8gR2V0IHRoZSByZWFkYWJsZSBuYW1lIG9mIHRoZSBxdWFsaWZpZWQgc2lnbmF0dXJlCi0JCQkJCS8vIGFuZCB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIG90aGVyLgotCQkJCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IG51bGw7Ci0JCQkJCVN0cmluZyBzaW1wbGVOYW1lID0gbnVsbDsKLQkJCQkJaWYgKHNpZzEuaW5kZXhPZignLicpID09IC0xKSB7Ci0JCQkJCQlxdWFsaWZpZWROYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHNpZzIpOwotCQkJCQkJc2ltcGxlTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyhzaWcxKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXF1YWxpZmllZE5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnMSk7Ci0JCQkJCQlzaW1wbGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHNpZzIpOwotCQkJCQl9Ci0KLQkJCQkJLy8gSWYgdGhlIHNpbXBsZSBuYW1lIHJlc29sdmVzIHRvIHRoZSBxdWFsaWZpZWQgbmFtZSwgd2UgaGF2ZSBhIG1hdGNoLgotCQkJCQlyZXN1bHQgPSBxdWFsaWZpZWROYW1lLmVxdWFscyhyZXNvbHZlU2ltcGxlVHlwZU5hbWUodHlwZSwgc2ltcGxlTmFtZSwgcmVzb2x2ZWROYW1lQ2FjaGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5lZWRzVG9SZXNvbHZlTmFtZShJVHlwZSB0eXBlLCBTdHJpbmcgc2ltcGxlTmFtZSwgYm9vbGVhbiBpc0ZvclJlZmxlY3Rpb24pIHsKLQkJYm9vbGVhbiByZXRWYWwgPSBmYWxzZTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJewotCQkJcmV0VmFsID0gISh0eXBlLmlzQmluYXJ5KCkgfHwgKCFpc0ZvclJlZmxlY3Rpb24gJiYgc2ltcGxlTmFtZS5pbmRleE9mKFBFUklPRCkgPiAtMSkgfHwgaXNQcmltaXRpdmVPclZvaWQoc2ltcGxlTmFtZSkpOwotCQl9Ci0JCXJldHVybiByZXRWYWw7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgc2ltcGxlIG5hbWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgdHlwZS4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG5hbWUgY2FuIG5vdCBiZSByZXNvbHZlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlU2ltcGxlVHlwZU5hbWUoSVR5cGUgdHlwZSwgU3RyaW5nIHNpbXBsZU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gcmVzb2x2ZVNpbXBsZVR5cGVOYW1lKHR5cGUsIHNpbXBsZU5hbWUsIG51bGwpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNpbXBsZSBuYW1lIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHR5cGUuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBuYW1lIGNhbiBub3QgYmUgcmVzb2x2ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVNpbXBsZVR5cGVOYW1lKElUeXBlIHR5cGUsIFN0cmluZyBzaW1wbGVOYW1lLCBNYXAgcmVzb2x2ZWROYW1lQ2FjaGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gcmVzb2x2ZVNpbXBsZVR5cGVOYW1lKHR5cGUsIHNpbXBsZU5hbWUsIHJlc29sdmVkTmFtZUNhY2hlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzaW1wbGUgbmFtZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSB0eXBlLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbmFtZSBjYW4gbm90IGJlIHJlc29sdmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVTaW1wbGVUeXBlTmFtZShJVHlwZSB0eXBlLCBTdHJpbmcgc2ltcGxlTmFtZSwgTWFwIHJlc29sdmVkTmFtZUNhY2hlLCBib29sZWFuIGlzRm9yUmVmbGVjdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmICghbmVlZHNUb1Jlc29sdmVOYW1lKHR5cGUsIHNpbXBsZU5hbWUsIGlzRm9yUmVmbGVjdGlvbikpCi0JCQlyZXR1cm4gc2ltcGxlTmFtZTsKLQkJU3RyaW5nIGtleSA9IG51bGwsIHF1YWxpZmllZE5hbWUgPSBudWxsOwotCQlpZiAocmVzb2x2ZWROYW1lQ2FjaGUgIT0gbnVsbCkgewotCQkJa2V5ID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSArIFJFU09MVkVEX05BTUUgKyBzaW1wbGVOYW1lOwotCQkJcXVhbGlmaWVkTmFtZSA9IChTdHJpbmcpIHJlc29sdmVkTmFtZUNhY2hlLmdldChrZXkpOwotCQl9Ci0JCWlmIChxdWFsaWZpZWROYW1lID09IG51bGwpIHsKLQkJCVN0cmluZ1tdW10gcmVzdWx0ID0gZ2V0VHlwZU5hbWVJbmZvKHR5cGUsIHNpbXBsZU5hbWUsIGlzRm9yUmVmbGVjdGlvbik7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcGFja05hbWUgPSByZXN1bHRbMF1bMF07Ci0JCQkJaWYgKHBhY2tOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQkJcXVhbGlmaWVkTmFtZSA9IHJlc3VsdFswXVsxXTsKLQkJCQkJaWYgKGlzRm9yUmVmbGVjdGlvbikKLQkJCQkJCXF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCAnJCcpOwkJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWIuYXBwZW5kKHJlc3VsdFswXVswXSkuYXBwZW5kKFBFUklPRCk7Ci0JCQkJCVN0cmluZyB0eXBlTmFtZSA9IHJlc3VsdFswXVsxXTsKLQkJCQkJaWYgKGlzRm9yUmVmbGVjdGlvbikKLQkJCQkJCXR5cGVOYW1lID0gdHlwZU5hbWUucmVwbGFjZSgnLicsICckJyk7Ci0JCQkJCWIuYXBwZW5kKHR5cGVOYW1lKTsKLQkJCQkJcXVhbGlmaWVkTmFtZSA9IGIudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXF1YWxpZmllZE5hbWUgPSBzaW1wbGVOYW1lOwotCQkJfQotCQkJaWYgKHJlc29sdmVkTmFtZUNhY2hlICE9IG51bGwpCi0JCQkJcmVzb2x2ZWROYW1lQ2FjaGUucHV0KGtleSwgcXVhbGlmaWVkTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHF1YWxpZmllZE5hbWU7Ci0JfQotCS8qKgotCSAqIFNlYXJjaGVzIGZvciBhIG1hdGNoaW5nIG1ldGhvZCBhbmQgc2V0cyBpdCBpbiB0aGUKLQkgKiBkZXNjcmlwdG9yIGlmIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1ldGhvZCBzZWFyY2hGb3JNYXRjaGluZ01ldGhvZChJVHlwZSB0eXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFybVNpZ3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gc2VhcmNoRm9yTWF0Y2hpbmdNZXRob2QodHlwZSwgbWV0aG9kTmFtZSwgcGFybVNpZ3MsIG51bGwpOwotCX0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3IgYSBtYXRjaGluZyBtZXRob2QgYW5kIHNldHMgaXQgaW4gdGhlCi0JICogZGVzY3JpcHRvciBpZiBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZXRob2Qgc2VhcmNoRm9yTWF0Y2hpbmdNZXRob2QoSVR5cGUgdHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcm1TaWdzLCBNYXAgcmVzb2x2ZWROYW1lQ2FjaGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JCS8vIEZpcnN0IGdldCBhbGwgdGhlIG1ldGhvZHMgYnkgdGhpcyBuYW1lIGFuZCB3aXRoIHRoaXMgbWFueSBwYXJtcy4KLQkJSU1ldGhvZFtdIGFsbE1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKLQkJTGlzdCBjYW5kaWRhdGVNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBwYXJtU2lnc0xlbmd0aCA9IChwYXJtU2lncyAhPSBudWxsID8gcGFybVNpZ3MubGVuZ3RoIDogMCk7Ci0JCQlpZiAoKGFsbE1ldGhvZHNbaV0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpICYmIChhbGxNZXRob2RzW2ldLmdldE51bWJlck9mUGFyYW1ldGVycygpID09IHBhcm1TaWdzTGVuZ3RoKSkKLQkJCQljYW5kaWRhdGVNZXRob2RzLmFkZChhbGxNZXRob2RzW2ldKTsKLQkJfQotCi0JCS8vIEZvciBlYWNoIGNhbmRpZGF0ZSBjb25zaWRlciBlYWNoIHBhcm0gZm9yIGEgbWF0Y2guCi0JCS8vIFRha2UgdGhlIGZpcnN0IG9uZSB0aGF0IG1hdGNoZXMgb24gYWxsIHBhcm1zLgotCQlJTWV0aG9kIG5leHQgPSBudWxsOwotCQlTdHJpbmdbXSBuZXh0UGFybVNpZ3MgPSBudWxsOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGNhbmRpZGF0ZUl0ZXIgPSBjYW5kaWRhdGVNZXRob2RzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlICghZm91bmQgJiYgKGNhbmRpZGF0ZUl0ZXIuaGFzTmV4dCgpKSkgewotCQkJbmV4dCA9IChJTWV0aG9kKSBjYW5kaWRhdGVJdGVyLm5leHQoKTsKLQkJCW5leHRQYXJtU2lncyA9IG5leHQuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCWZvdW5kID0gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwOyhmb3VuZCAmJiAoaSA8IG5leHRQYXJtU2lncy5sZW5ndGgpKTsgaSsrKQotCQkJCWZvdW5kICY9IG1hdGNoVHlwZVNpZ25hdHVyZXModHlwZSwgcGFybVNpZ3NbaV0sIG5leHRQYXJtU2lnc1tpXSwgcmVzb2x2ZWROYW1lQ2FjaGUpOwotCQl9Ci0JCXJldHVybiBmb3VuZCA/IG5leHQgOiBudWxsOwotCX0KLQotCS8qKgotCSogVGhlIHJldHVybmVkIE9iamVjdFtdIHdpbGwgY29udGFpbiB0d28gZW50cmllcy4gIFRoZQotCSogZmlyc3Qgd2lsbCBiZSB0aGUgSUphdmFFbGVtZW50IHRoYXQgd2FzIGZvdW5kIGFuZCB0aGUKLQkqIHNlY29uZCB3aWxsIGJlIHRoZSBxdWFsaWZpZWROYW1lIHVzZWQgdG8gZmluZCBpdC4KLQkqLwotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0W10gZmluZEFjdHVhbEphdmFFbGVtZW50KFN0cmluZyBxdWFsaWZpZWROYW1lLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIEpET01BZGFwdG9yIGFkYXB0b3IpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsyXTsKLQkJaWYgKGFkYXB0b3IgPT0gbnVsbCkKLQkJCXJlc3VsdFsxXSA9IHF1YWxpZmllZE5hbWU7Ci0JCWVsc2UgCi0JCQkvL0Vuc3VyZSB0aGUgbmFtZSBpcyBxdWFsaWZpZWQKLQkJCXJlc3VsdFsxXSA9IGdldFJlc29sdmVkVHlwZU5hbWUocXVhbGlmaWVkTmFtZSwgYWRhcHRvci5nZXRUeXBlKCksIGFkYXB0b3IuZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpKTsKLQkJCi0JCXJlc3VsdFswXSA9IGZpbmRKYXZhRWxlbWVudCgoU3RyaW5nKSByZXN1bHRbMV0sIGphdmFQcm9qZWN0LCBhZGFwdG9yKTsKLQkJaWYgKHJlc3VsdFswXSA9PSBudWxsKQotCQkJZmluZElubmVySmF2YUVsZW1lbnQocmVzdWx0LCBqYXZhUHJvamVjdCwgYWRhcHRvcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJldHVybmVkIE9iamVjdFtdIHdpbGwgY29udGFpbiB0d28gZW50cmllcy4gIFRoZQotCSAqIGZpcnN0IHdpbGwgYmUgdGhlIElKYXZhRWxlbWVudCB0aGF0IHdhcyBmb3VuZCBhbmQgdGhlCi0JICogc2Vjb25kIHdpbGwgYmUgdGhlIHF1YWxpZmllZE5hbWUgdXNlZCB0byBmaW5kIGl0LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBmaW5kSW5uZXJKYXZhRWxlbWVudChPYmplY3RbXSBpbmZvLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIEpET01BZGFwdG9yIGFkYXB0b3IpIHsKLQkJU3RyaW5nIHF1YWxpZmllZE5hbWUsIGlubmVyTmFtZTsKLQkJcXVhbGlmaWVkTmFtZSA9IChTdHJpbmcpIGluZm9bMV07Ci0JCWludCBpbmRleCA9IHF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQlpbm5lck5hbWUgPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQlTdHJpbmcgcGtnTmFtZSA9IGlubmVyTmFtZTsKLQkJCWlubmVyTmFtZSArPSAiJCI7IC8vJE5PTi1OTFMtMSQKLQkJCWlubmVyTmFtZSArPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhpbmRleCArIDEsIHF1YWxpZmllZE5hbWUubGVuZ3RoKCkpOwotCQkJaWYgKGFkYXB0b3IgIT0gbnVsbCkgewotCQkJCS8vRW5zdXJlIHRoZSBuYW1lIGlzIHF1YWxpZmllZCB3aGljaCBpdCBtYXkgbm90IGJlIGlmIGFuIGlubmVyIGNsYXNzCi0JCQkJaW5uZXJOYW1lID0gZ2V0UmVzb2x2ZWRUeXBlTmFtZShpbm5lck5hbWUsIGFkYXB0b3IuZ2V0VHlwZSgpLCBhZGFwdG9yLmdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSk7Ci0JCQkJaWYgKHF1YWxpZmllZE5hbWUuZXF1YWxzKGlubmVyTmFtZSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWluZm9bMV0gPSBpbm5lck5hbWU7Ci0JCQlpbmZvWzBdID0gZmluZEphdmFFbGVtZW50KGlubmVyTmFtZSwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQkJaWYgKGphdmFQcm9qZWN0LmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSYmIGluZm9bMF0gPT0gbnVsbCkgewotCQkJCWluZGV4ID0gaW5uZXJOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaW5kZXggPiAwICYmIGlubmVyTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpLmVxdWFscyhwa2dOYW1lKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWZpbmRJbm5lckphdmFFbGVtZW50KGluZm8sIGphdmFQcm9qZWN0LCBhZGFwdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSUphdmFFbGVtZW50IGZpbmRKYXZhRWxlbWVudChTdHJpbmcgcXVhbGlmaWVkTmFtZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBqYXZhUHJvamVjdC5maW5kVHlwZShxdWFsaWZpZWROYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgSVBhdGggZ2V0UGF0aEZyb21RdWFsaWZpZWROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCXJldHVybiBuZXcgUGF0aChxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyogCi0JKiBSZXNvbHZlIGEgdHlwZSBuYW1lIGluIHRoZSBjb250ZXh0IG9mIGEgVHlwZS4KLQkqIChCb3Jyb3dlZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC51aS5jb2RlbWFuaXB1bGF0aW9uLlN0dWJVdGlsaXR5LmdldFJlc29sdmVkVHlwZU5hbWUoKSkKLQkqIFRoZSBpbnB1dCBpcyBhIHNpbXBsZSBvciBxdWFsaWZpZWQgbmFtZSwgTk9UIGEgc2lnbmF0dXJlCi0JKiBUaGUgb3V0cHV0IHdpbGwgYmUgYSBxdWFsaWZpZWQgbmFtZSwgTk9UIGEgc2lnbmF0dXJlCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgTWFwIHR5cGVDYWNoZSkgewotCQlTdHJpbmcgbmFtZSA9IHR5cGVOYW1lOwotCQl0cnkgewotCQkJbmFtZSA9IEpET01TZWFyY2hIZWxwZXIucmVzb2x2ZVNpbXBsZVR5cGVOYW1lKGRlY2xhcmluZ1R5cGUsIHR5cGVOYW1lLCB0eXBlQ2FjaGUsIHRydWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwgYm9vbGVhbiB1c2VBZHZhbmNlZEZvcklubmVycywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCQotCQlJSmF2YUVsZW1lbnQgZm91bmQgPSBudWxsOwotCQlTdHJpbmcgcmVzb2x2ZWROYW1lID0gcXVhbGlmaWVkTmFtZTsKLQkJaWYgKHVzZUFkdmFuY2VkRm9ySW5uZXJzKSB7Ci0JCQlPYmplY3RbXSByZXN1bHQgPSBmaW5kQWN0dWFsSmF2YUVsZW1lbnQocXVhbGlmaWVkTmFtZSwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQkJZm91bmQgPSAoSUphdmFFbGVtZW50KSByZXN1bHRbMF07Ci0JCQlyZXNvbHZlZE5hbWUgPSAoU3RyaW5nKSByZXN1bHRbMV07Ci0JCX0gZWxzZQotCQkJZm91bmQgPSBmaW5kSmF2YUVsZW1lbnQocXVhbGlmaWVkTmFtZSwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCWlmIChmb3VuZCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpCi0JCQkJcmV0dXJuICgoSUNsYXNzRmlsZSkgZm91bmQpLmdldFR5cGUoKTsKLQkJCWVsc2UgaWYgKGZvdW5kIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotCQkJCUlDb21waWxhdGlvblVuaXQgZm91bmRDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBmb3VuZDsKLQkJCQkvLyBzdHJpcCB0aGUgIi5qYXZhIiwgbGlmdGVkIGZyb20gQ29tcGlsYXRpb25Vbml0LmdldE1haW5UeXBlTmFtZSgpCi0JCQkJU3RyaW5nIGN1TWFpblR5cGVOYW1lID0gZm91bmRDVS5nZXRFbGVtZW50TmFtZSgpOwotCQkJCWN1TWFpblR5cGVOYW1lID0gY3VNYWluVHlwZU5hbWUuc3Vic3RyaW5nKDAsIGN1TWFpblR5cGVOYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCQkJcmV0dXJuIGZvdW5kQ1UuZ2V0VHlwZShjdU1haW5UeXBlTmFtZSk7Ci0JCQl9IGVsc2UgaWYgKGZvdW5kIGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCQlJVHlwZSB0eXBlID0gKChJVHlwZSkgZm91bmQpOwotCQkJCWlmICghdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJyQnKS5lcXVhbHMocmVzb2x2ZWROYW1lKSkgewotCQkJCQkvLyBJIGRvbid0IGtub3cgd2h5IHRoaXMgaXMgaGVyZS4gU29tZXRpbWUgaW4gdGhlIHBhc3QgZm9yIGFuIGlubmVyIGNsYXNzLCB0aGUKLQkJCQkJLy8gSVR5cGUgcmV0dXJuZWQgd2FzIGZvciB0aGUgb3V0ZXIgY2xhc3MsIHNvIHlvdSB3b3VsZCBuZWVkIHRvIHNlYXJjaCBhZ2FpbgotCQkJCQkvLyBmb3IgdGhlIGlubmVyIGNsYXNzIGFnYWluc3QgdGhlIG91dGVyIGNsYXNzLiBJIGRvbid0IGtub3cgaG93IHRoaXMgbm93IGNhbgotCQkJCQkvLyBoYXBwZW4uIFRoZSBjb2RlIGZvbGxvd2VkIGFib3ZlIGlzIGV4dHJlbWVsbHkgY29tcGxpY2F0ZWQsIGVzcGVjaWFsbHkgd2hlbgotCQkJCQkvLyBpdCBpcyBhbiBpbm5lciBjbGFzcyB0aGF0IGlzbid0IGZ1bGx5LXF1YWxpZmllZCB0aGF0IGlzIGluc2lkZSBhIHNvdXJjZSBmaWxlLgotCQkJCQkvLyBJdCBnb2VzIHRocm91Z2ggc29tZSBneXJhdGlvbnMgZm9yIHRoYXQuIEkgZG9uJ3Qga25vdyB3aGF0IGl0IHdvdWxkCi0JCQkJCS8vIHJldHVybiBpbiB0aGF0IGNhc2UuIEJ1dCBqdXN0IGluIGNhc2UsIHRoZSB0ZXN0IGlzIGhlcmUgdG8gYmUgc2FmZS4KLQkJCQkJaW50IGluZGV4ID0gcmVzb2x2ZWROYW1lLmxhc3RJbmRleE9mKCckJyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGluZGV4ID4gLTEpCi0JCQkJCQlyZXR1cm4gdHlwZS5nZXRUeXBlKHJlc29sdmVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCByZXNvbHZlZE5hbWUubGVuZ3RoKCkpKTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIHR5cGU7Ci0JCQkJfSBlbHNlCi0JCQkJCXJldHVybiB0eXBlOwotCQkJfQotCQkJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBqYXZhUHJvamVjdC5maW5kVHlwZShwYWNrYWdlTmFtZSwgcXVhbGlmaWVkVHlwZU5hbWUucmVwbGFjZSgnJCcsICcuJykpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfTG9va2luZ19VcF9UeXBlX0VSUk9SXyIsIChuZXcgT2JqZWN0W10geyBwYWNrYWdlTmFtZSArICIuIiArIHF1YWxpZmllZFR5cGVOYW1lLCBqbWUuZ2V0TWVzc2FnZSgpfSkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkID0gIkVycm9yIGxvb2tpbmcgdXAgdHlwZTogIgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhQ2xhc3NKRE9NQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhQ2xhc3NKRE9NQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDlmZmIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUNsYXNzSkRPTUFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5UaW1lclRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YUNsYXNzSkRPTUFkYXB0b3IgZXh0ZW5kcyBKRE9NQWRhcHRvciBpbXBsZW1lbnRzIElKYXZhQ2xhc3NBZGFwdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX1RZUEVfTkFNRSA9ICJqYXZhLmxhbmcuT2JqZWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBTdGVwIGlkcyB1c2VkIGZvciBUaW1lclRlc3RzIG9mIHBlcmZvcm1hbmNlIHRlc3RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9DTEFTUyA9ICJSZWZsZWN0IEpET00gQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9NRVRIT0RTID0gIlJlZmxlY3QgYWxsIEpET00gbWV0aG9kcyBmb3IgYSBjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZMRUNUX0ZJRUxEUyA9ICJSZWZsZWN0IGFsbCBKRE9NIGZpZWxkcyBmb3IgYSBjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwcm90ZWN0ZWQgSVR5cGUgc291cmNlVHlwZSA9IG51bGw7Ci0JcHJvdGVjdGVkIEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBNYXAgdHlwZVJlc29sdXRpb25DYWNoZSA9IG5ldyBIYXNoTWFwKDI1KTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzUmVmbGVjdGVkRmllbGRzLCBpc1JlZmxlY3RpbmdGaWVsZHM7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc1JlZmxlY3RlZE1ldGhvZHMsIGlzUmVmbGVjdGluZ01ldGhvZHM7Ci0JCi0JcHVibGljIEphdmFDbGFzc0pET01BZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSUphdmFQcm9qZWN0IHdvcmtpbmdQcm9qZWN0LCBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGluRmFjdG9yeSkgewotCQlzdXBlcih0YXJnZXQsIHdvcmtpbmdQcm9qZWN0KTsKLQkJc2V0QWRhcHRlckZhY3RvcnkoaW5GYWN0b3J5KTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgZXhpc3RpbmdGaWVsZHMgPSBuZXcgSGFzaE1hcCgpOyAKLQkvKgotCSAqIGFkZEZpZWxkcyAtIHJlZmxlY3Qgb3VyIGZpZWxkcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpZWxkcygpIHsKLQotCQkvLyBUaGUgYWxnb3JpdGhtIHdlIHdpbGwgdXNlIGlzOgotCQkvLyAxKSBQYXNzIHRocm91Z2ggdGhlIElGaWVsZCdzIG9mIHRoaXMgY2xhc3MKLQkJLy8gICAgYSkgSWYgaXQgaXMgaW4gZXhpc3RpbmdGaWVsZHMsIHRoZW4gYWRkIHRvIG5ld0V4aXN0aW5nIHRoZSBlbnRyeSBmcm9tCi0JCS8vICAgICAgIG9sZEV4aXN0aW5nIChkZWxldGluZyBmcm9tIG9sZEV4aXN0aW5nIGF0IHRoZSBzYW1lIHRpbWUpLCBhbmQgZmx1c2ggdGhlIGZpZWxkLiBUaGlzIGlzIHNvIG5leHQgd2UgcmUtZ2V0IGFueSBjaGFuZ2VkIHBhcnRzIG9mIGl0LgotCQkvLyAgICBiKSBlbHNlIG5vdCBleGlzdGluZywgdGhlbiBjcmVhdGUgbmV3IGZpZWxkIGFuZCBhZGQgdG8gdGhlIG5ldyBmaWVsZHMgbGlzdC4KLQkJLy8gMikgUmVtb3ZlIGZyb20gdGhlIGZpZWxkcyBsaXN0IGFueSBzdGlsbCBsZWZ0IGluIG9sZEV4aXN0aW5nLiBUaGVzZSBhcmUgb25lcyB0aGF0IG5vIGxvbmdlciBleGlzdC4KLQkJLy8gMykgQWRkIGFsbCBvZiB0aGUgbmV3cyBvbmVzIHRvIHRoZSBmaWVsZHMuCi0JCS8vICAgICAgIAotCQlJRmllbGRbXSBmaWVsZHMgPSBudWxsOwotCQl0cnkgewotCQkJZmllbGRzID0gZ2V0U291cmNlVHlwZSgpLmdldEZpZWxkcygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCXJldHVybiBmYWxzZTsJCi0JCX0KLQkJWE1JUmVzb3VyY2UgcmVzb3VyY2UgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwkJCi0JCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJSmF2YUZpZWxkSkRPTUFkYXB0b3IgYWRhcHRlciA9IG51bGw7Ci0JCU1hcCBuZXdFeGlzdGluZyA9IG5ldyBIYXNoTWFwKGZpZWxkcy5sZW5ndGgpOwotCQlMaXN0IG5ld0ZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCUlGaWVsZCBpZmllbGQgPSBmaWVsZHNbaV07Ci0JCQlmaWVsZCA9IChGaWVsZCkgZXhpc3RpbmdGaWVsZHMucmVtb3ZlKGlmaWVsZCk7CS8vIEdldCB0aGUgZXhpc3RpbmcgZmllbGQgKHdoaWNoIGlzIHRoZSB2YWx1ZSkgZnJvbSB0aGUgY29sbGVjdGlvbiBrZXllZCBieSBJRmllbGQuCi0JCQlpZiAoZmllbGQgIT0gbnVsbCkgewotCQkJCS8vIEl0IGlzIGFuIGV4aXN0aW5nIG1ldGhvZC4gU28ganVzdCBwdXQgb3ZlciB0byBuZXdFeGlzdGluZy4gVGhlbiBmbHVzaCBpdC4KLQkJCQluZXdFeGlzdGluZy5wdXQoaWZpZWxkLCBmaWVsZCk7Ci0JCQkJLy8gU2luY2UgdGhpcyBpcyBhIG5ldyBtZXRob2QsIGl0IGlzIG5vdCBhdHRhY2hlZCB0byBhIHJlc291cmNlLCBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBhZGFwdGVyLgotCQkJCWFkYXB0ZXIgPSAoSmF2YUZpZWxkSkRPTUFkYXB0b3IpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoZmllbGQsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJCQlhZGFwdGVyID0gKEphdmFGaWVsZEpET01BZGFwdG9yKSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0TmV3KGZpZWxkLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJZWxzZQotCQkJCQlhZGFwdGVyLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbih0cnVlKTsKLQkJCQlhZGFwdGVyLnNldFNvdXJjZUZpZWxkKGlmaWVsZCk7CS8vIEdpdmUgaXQgdGhpcyBuZXcgSUZpZWxkCi0JCQl9IGVsc2UgewotCQkJCS8vIEl0IGlzIGEgbmV3IG1ldGhvZC4gQ3JlYXRlIHRoZSBuZXcgbWV0aG9kLCBhZGQgdG8gbmV3RXhpc3RpbmcsIGFuZCBhZGQgdG8gbmV3TWV0aG9kcyBsaXN0LgotCQkJCWZpZWxkID0gY3JlYXRlSmF2YUZpZWxkKGlmaWVsZCwgcmVzb3VyY2UpOwotCQkJCW5ld0V4aXN0aW5nLnB1dChpZmllbGQsIGZpZWxkKTsJCQkJCi0JCQkJbmV3RmllbGRzLmFkZChmaWVsZCk7Ci0JCQkJYWRhcHRlciA9IChKYXZhRmllbGRKRE9NQWRhcHRvcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdE5ldyhmaWVsZCwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCWFkYXB0ZXIuc2V0U291cmNlRmllbGQoaWZpZWxkKTsKLQkJCX0KLQkJfQotCQkKLQkJQmFzaWNFTGlzdCBmaWVsZHNMaXN0ID0gKEJhc2ljRUxpc3QpIGdldEphdmFDbGFzc1RhcmdldCgpLmdldEZpZWxkc0dlbigpOwotCQlpZiAoIWV4aXN0aW5nRmllbGRzLmlzRW1wdHkoKSkgewotCQkJLy8gTm93IGFueSBzdGlsbCBsZWZ0IGluIG9sZCBleGlzdGluZyBhcmUgZGVsZXRlZC4gU28gd2UgbWFrZSB0aGVtIHByb3hpZXMgYW5kIHRoZW4gcmVtb3ZlIHRoZW0gZnJvbSBmaWVsZHMgbGlzdC4JCQkKLQkJCVVSSSBiYXNlVVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQlDb2xsZWN0aW9uIHRvRGVsZXRlID0gZXhpc3RpbmdGaWVsZHMudmFsdWVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHRvRGVsZXRlLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG0gPSAoSW50ZXJuYWxFT2JqZWN0KSBpdHIubmV4dCgpOwotCQkJCVN0cmluZyBpZCA9IHJlc291cmNlLmdldElEKG0pOwotCQkJCWlmIChpZCAhPSBudWxsKQotCQkJCQltLmVTZXRQcm94eVVSSShiYXNlVVJJLmFwcGVuZEZyYWdtZW50KGlkKSk7Ci0JCQl9Ci0JCQlmaWVsZHNMaXN0LnJlbW92ZUFsbCh0b0RlbGV0ZSk7Ci0JCX0KLQkJCi0JCWlmICghbmV3RmllbGRzLmlzRW1wdHkoKSkgewotCQkJLy8gTm93IGFkZCBpbiB0aGUgbmV3cyBvbmVzCi0JCQlmaWVsZHNMaXN0LmFkZEFsbFVuaXF1ZShuZXdGaWVsZHMpOwotCQl9Ci0JCQotCQkvLyBGaW5hbGx5IHNldCBjdXJyZW50IGV4aXN0aW5nIHRvIHRoZSBuZXcgbWFwIHdlIGNyZWF0ZWQuCi0JCWV4aXN0aW5nRmllbGRzID0gbmV3RXhpc3Rpbmc7Ci0JCXJldHVybiB0cnVlOwkJCQotCX0KLQkKLQlwcml2YXRlIE1hcCBleGlzdGluZ01ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOyAKLQkvKgotCSAqIGFkZE1ldGhvZHMgLSByZWZsZWN0IG91ciBtZXRob2RzLiBNZXJnZSBpbiB3aXRoIHRoZSBwcmV2aW91cy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRNZXRob2RzKCkgewotCQkvLyBUaGUgYWxnb3JpdGhtIHdlIHdpbGwgdXNlIGlzOgotCQkvLyAxKSBQYXNzIHRocm91Z2ggdGhlIElNZXRob2QncyBvZiB0aGlzIGNsYXNzCi0JCS8vICAgIGEpIElmIGl0IGlzIGluIGV4aXN0aW5nTWV0aG9kcywgdGhlbiBhZGQgdG8gbmV3RXhpc3RpbmcgdGhlIGVudHJ5IGZyb20KLQkJLy8gICAgICAgb2xkRXhpc3RpbmcgKGRlbGV0aW5nIGZyb20gb2xkRXhpc3RpbmcgYXQgdGhlIHNhbWUgdGltZSksIGFuZCBmbHVzaCB0aGUgbWV0aG9kLiBUaGlzIGlzIHNvIG5leHQgd2UgcmUtZ2V0IGFueSBjaGFuZ2VkIHBhcnRzIG9mIGl0LgotCQkvLyAgICBiKSBlbHNlIG5vdCBleGlzdGluZywgdGhlbiBjcmVhdGUgbmV3IG1ldGhvZCBhbmQgYWRkIHRvIHRoZSBuZXcgbWV0aG9kcyBsaXN0LgotCQkvLyAyKSBSZW1vdmUgZnJvbSB0aGUgbWV0aG9kcyBsaXN0IGFueSBzdGlsbCBsZWZ0IGluIG9sZEV4aXN0aW5nLiBUaGVzZSBhcmUgb25lcyB0aGF0IG5vIGxvbmdlciBleGlzdC4KLQkJLy8gMykgQWRkIGFsbCBvZiB0aGUgbmV3cyBvbmVzIHRvIHRoZSBtZXRob2RzLgotCQkvLyAgICAgICAKLQkJSU1ldGhvZFtdIG1ldGhvZHMgPSBudWxsOwotCQl0cnkgewotCQkJbWV0aG9kcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRNZXRob2RzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJcmV0dXJuIGZhbHNlOwkKLQkJfQotCQlYTUlSZXNvdXJjZSByZXNvdXJjZSA9IChYTUlSZXNvdXJjZSkgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZVJlc291cmNlKCk7CQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUphdmFNZXRob2RKRE9NQWRhcHRvciBhZGFwdGVyID0gbnVsbDsKLQkJTWFwIG5ld0V4aXN0aW5nID0gbmV3IEhhc2hNYXAobWV0aG9kcy5sZW5ndGgpOwotCQlMaXN0IG5ld01ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJSU1ldGhvZCBpbSA9IG1ldGhvZHNbaV07Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBleGlzdGluZ01ldGhvZHMucmVtb3ZlKGltKTsJLy8gR2V0IHRoZSBleGlzdGluZyBtZXRob2QgKHdoaWNoIGlzIHRoZSB2YWx1ZSkgZnJvbSB0aGUgY29sbGVjdGlvbiBrZXllZCBieSBJTWV0aG9kLgotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJLy8gSXQgaXMgYW4gZXhpc3RpbmcgbWV0aG9kLiBTbyBqdXN0IHB1dCBvdmVyIHRvIG5ld0V4aXN0aW5nLiBUaGVuIGZsdXNoIGl0LgotCQkJCW5ld0V4aXN0aW5nLnB1dChpbSwgbWV0aG9kKTsKLQkJCQlhZGFwdGVyID0gKEphdmFNZXRob2RKRE9NQWRhcHRvcikgcmV0cmlldmVBZGFwdG9yRnJvbShtZXRob2QpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24odHJ1ZSk7Ci0JCQkJCWFkYXB0ZXIuc2V0U291cmNlTWV0aG9kKGltKTsJLy8gR2l2ZSBpdCB0aGlzIG5ldyBJTWV0aG9kCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdCBpcyBhIG5ldyBtZXRob2QuIENyZWF0ZSB0aGUgbmV3IG1ldGhvZCwgYWRkIHRvIG5ld0V4aXN0aW5nLCBhbmQgYWRkIHRvIG5ld01ldGhvZHMgbGlzdC4KLQkJCQltZXRob2QgPSBjcmVhdGVKYXZhTWV0aG9kKGltLCByZXNvdXJjZSk7Ci0JCQkJbmV3RXhpc3RpbmcucHV0KGltLCBtZXRob2QpOwkJCQkKLQkJCQluZXdNZXRob2RzLmFkZChtZXRob2QpOwotCQkJCS8vIFNpbmNlIHRoaXMgaXMgYSBuZXcgbWV0aG9kLCBpdCBpcyBub3QgYXR0YWNoZWQgdG8gYSByZXNvdXJjZSwgc28gd2UgbmVlZCB0byBleHBsaWNpdGx5IGNyZWF0ZSB0aGUgYWRhcHRlci4KLQkJCQlhZGFwdGVyID0gKEphdmFNZXRob2RKRE9NQWRhcHRvcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdE5ldyhtZXRob2QsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLnNldFNvdXJjZU1ldGhvZChtZXRob2RzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJQmFzaWNFTGlzdCBtZXRob2RzTGlzdCA9IChCYXNpY0VMaXN0KSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRNZXRob2RzR2VuKCk7Ci0JCWlmICghZXhpc3RpbmdNZXRob2RzLmlzRW1wdHkoKSkgewotCQkJLy8gTm93IGFueSBzdGlsbCBsZWZ0IGluIG9sZCBleGlzdGluZyBhcmUgZGVsZXRlZC4gU28gd2UgbWFrZSB0aGVtIHByb3hpZXMgYW5kIHRoZW4gcmVtb3ZlIHRoZW0gZnJvbSBtZXRob2RzIGxpc3QuCi0JCQlVUkkgYmFzZVVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJQ29sbGVjdGlvbiB0b0RlbGV0ZSA9IGV4aXN0aW5nTWV0aG9kcy52YWx1ZXMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gdG9EZWxldGUuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbSA9IChJbnRlcm5hbEVPYmplY3QpIGl0ci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGlkID0gcmVzb3VyY2UuZ2V0SUQobSk7Ci0JCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJCW0uZVNldFByb3h5VVJJKGJhc2VVUkkuYXBwZW5kRnJhZ21lbnQoaWQpKTsKLQkJCX0KLQkJCW1ldGhvZHNMaXN0LnJlbW92ZUFsbCh0b0RlbGV0ZSk7Ci0JCX0KLQkJCi0JCWlmICghbmV3TWV0aG9kcy5pc0VtcHR5KCkpIHsKLQkJCS8vIE5vdyBhZGQgaW4gdGhlIG5ld3Mgb25lcwotCQkJbWV0aG9kc0xpc3QuYWRkQWxsVW5pcXVlKG5ld01ldGhvZHMpOwotCQl9Ci0JCQotCQkvLyBGaW5hbGx5IHNldCBjdXJyZW50IGV4aXN0aW5nIHRvIHRoZSBuZXcgbWFwIHdlIGNyZWF0ZWQuCi0JCWV4aXN0aW5nTWV0aG9kcyA9IG5ld0V4aXN0aW5nOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogQ2xlYXIgc291cmNlIFR5cGUgOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyU291cmNlKCkgewotCQlzb3VyY2VUeXBlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgcmVmbGVjdGVkIGZpZWxkcyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoRmllbGRzKCkgewotCQkvLyBGaXJzdCB0dXJuIHRoZW0gYWxsIGludG8gcHJveGllcyBzbyB0aGF0IGFueSBob2xkZXJzIHdpbGwgcmUtcmVzb2x2ZSB0byBtYXliZSB0aGUgbmV3IG9uZSBpZiBjbGFzcyBjb21lcyBiYWNrLgotCQlleGlzdGluZ0ZpZWxkcy5jbGVhcigpOwotCQlYTUlSZXNvdXJjZSByZXMgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwotCQlVUkkgYmFzZVVSSSA9IHJlcy5nZXRVUkkoKTsKLQkJTGlzdCBmaWVsZHMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRGaWVsZHNHZW4oKTsKLQkJaW50IG1zaXplID0gZmllbGRzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtc2l6ZTsgaSsrKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgZiA9IChJbnRlcm5hbEVPYmplY3QpIGZpZWxkcy5nZXQoaSk7Ci0JCQlTdHJpbmcgaWQgPSByZXMuZ2V0SUQoZik7Ci0JCQlpZiAoaWQgIT0gbnVsbCkKLQkJCQlmLmVTZXRQcm94eVVSSShiYXNlVVJJLmFwcGVuZEZyYWdtZW50KGlkKSk7Ci0JCX0KLQkJZmllbGRzLmNsZWFyKCk7CS8vIE5vdyB3ZSBjYW4gY2xlYXIgaXQuCi0JCXJldHVybiB0cnVlOwotCQl9Ci0JLyoqCi0JICogQ2xlYXIgdGhlIGltcGxlbWVudHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaEltcGxlbWVudHMoKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLmdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIENsZWFyIHRoZSByZWZsZWN0ZWQgbWV0aG9kcyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoTWV0aG9kcygpIHsKLQkJLy8gRmlyc3QgdHVybiB0aGVtIGFsbCBpbnRvIHByb3hpZXMgc28gdGhhdCBhbnkgaG9sZGVycyB3aWxsIHJlLXJlc29sdmUgdG8gbWF5YmUgdGhlIG5ldyBvbmUgaWYgY2xhc3MgY29tZXMgYmFjay4KLQkJZXhpc3RpbmdNZXRob2RzLmNsZWFyKCk7Ci0JCVhNSVJlc291cmNlIHJlcyA9IChYTUlSZXNvdXJjZSkgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZVJlc291cmNlKCk7Ci0JCVVSSSBiYXNlVVJJID0gcmVzLmdldFVSSSgpOwotCQlMaXN0IG1ldGhvZHMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRNZXRob2RzR2VuKCk7Ci0JCWludCBtc2l6ZSA9IG1ldGhvZHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1zaXplOyBpKyspIHsKLQkJCUludGVybmFsRU9iamVjdCBtID0gKEludGVybmFsRU9iamVjdCkgbWV0aG9kcy5nZXQoaSk7Ci0JCQlTdHJpbmcgaWQgPSByZXMuZ2V0SUQobSk7Ci0JCQlpZiAoaWQgIT0gbnVsbCkKLQkJCQltLmVTZXRQcm94eVVSSShiYXNlVVJJLmFwcGVuZEZyYWdtZW50KGlkKSk7Ci0JCX0KLQkJbWV0aG9kcy5jbGVhcigpOwkvLyBOb3cgd2UgY2FuIGNsZWFyIGl0LgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hNb2RpZmllcnMoKSB7Ci0JCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEFic3RyYWN0KGZhbHNlKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEZpbmFsKGZhbHNlKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldFB1YmxpYyhmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoSW5uZXJDbGFzc2VzKCkgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXREZWNsYXJlZENsYXNzZXNHZW4oKS5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hBbmRDbGVhckNhY2hlZE1vZGVsT2JqZWN0OwotCQotCS8qKgotCSAqIENsZWFyIHRoZSByZWZsZWN0ZWQgdmFsdWVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQlmbHVzaEFuZENsZWFyQ2FjaGVkTW9kZWxPYmplY3QgPSBjbGVhckNhY2hlZE1vZGVsT2JqZWN0OwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoKLQkgKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgYSByZWZsZWN0IGlmIGEgcmVhbCBmbHVzaCBpcyBuZWVkZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZsdXNoTm93KCkgewotCQlpZiAoZmx1c2hBbmRDbGVhckNhY2hlZE1vZGVsT2JqZWN0KQotCQkJc2V0U291cmNlVHlwZShudWxsKTsKLQkJdHlwZVJlc29sdXRpb25DYWNoZS5jbGVhcigpOwotCQlmbHVzaE1vZGlmaWVycygpOwotCQlmbHVzaFN1cGVyKCk7Ci0JCWZsdXNoSW1wbGVtZW50cygpOwotCQlpZiAoZmx1c2hBbmRDbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JCQkvLyBEb24ndCBmbHVzaCB0aGVzZSB5ZXQuIFdlIHdpbGwgdHJ5IHRvIHJldXNlIHRoZW0gb24gdGhlIG5leHQgcmVmbHVzaC4gSWYgY2xlYXIgbW9kZWwgdG9vLCB0aGVuIGZsdXNoIHRoZW0uIFRoaXMgdXN1YWxseSBtZWFucyBjbGFzcyBoYXMgYmVlbiBkZWxldGVkLCBzbyB3aHkga2VlcCB0aGVtIGFyb3VuZC4KLQkJCWZsdXNoTWV0aG9kcygpOwotCQkJZmx1c2hGaWVsZHMoKTsKLQkJfQotCQkvLyBFdmVuIGlmIHdlIGRpZG4ndCBmbHVzaCB0aGUgZmllbGRzL21ldGhvZHMsIHdlIGRvIG5lZWQgdG8gbWFyayBhcyBub3QgcmVmbGVjdGVkIHNvIG9uIG5leHQgdXNhZ2Ugd2Ugd2lsbCBtZXJnZSBpbiB0aGUgY2hhbmdlcy4KLQkJaGFzUmVmbGVjdGVkTWV0aG9kcyA9IGZhbHNlOwotCQloYXNSZWZsZWN0ZWRGaWVsZHMgPSBmYWxzZTsKLQkJCi0JCWZsdXNoSW5uZXJDbGFzc2VzKCk7Ci0JCWZsdXNoQW5kQ2xlYXJDYWNoZWRNb2RlbE9iamVjdCA9IGZhbHNlOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLnNldFJlZmxlY3RlZChmYWxzZSk7Ci0JCXN1cGVyLnBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGlzRXhpc3RpbmcpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3VwZXJ0eXBlIHRvIGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hTdXBlcigpIHsKLQkJTGlzdCB0YXJnZXRTdXBlcnMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5wcmltR2V0RVN1cGVyVHlwZXMoKTsKLQkJdGFyZ2V0U3VwZXJzLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwcm90ZWN0ZWQgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkvKioKLQkgKiBnZXRCaW5hcnlUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3MgZmlsZQotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBnZXRCaW5hcnlUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRCaW5hcnlUeXBlKCgoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB0YXJnZXQgdHlwZWQgdG8gYSBKYXZhQ2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzc0ltcGwgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkgewotCQlyZXR1cm4gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlVHlwZSAhPSBudWxsOwotICAgIH0KLQkvKioKLQkgKiBnZXRTb3VyY2VUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3Mgb3Igc291cmNlIGZpbGUKLQkgKi8KLQlwdWJsaWMgSVR5cGUgZ2V0U291cmNlVHlwZSgpIHsKLQkJaWYgKHNvdXJjZVR5cGUgPT0gbnVsbCB8fCBmbHVzaEFuZENsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQkJCUphdmFDbGFzc0ltcGwgamF2YUNsYXNzID0gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCQkJc291cmNlVHlwZSA9IEpET01TZWFyY2hIZWxwZXIuZmluZFR5cGUoamF2YUNsYXNzLmdldEphdmFQYWNrYWdlKCkuZ2V0TmFtZSgpLCBqYXZhQ2xhc3MucHJpbUdldE5hbWUoKSwgZ2V0U291cmNlUHJvamVjdCgpKTsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgc291cmNlVHlwZSB3YXMgZm91bmQgYW5kIHdlIGFyZSBub3QgaW4gdGhlIG1pZGRsZSBvZgotCQkJICogcmVmbGVjdGluZyBpdCBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIGhhc1JlZmxlY3RlZAotCQkJICogaXMgc2V0IGJhY2sgdG8gZmFsc2UuICBJZiB0aGlzIGlzIG5vdCBkb25lIHRoZW4gdGhlIHN5c3RlbQotCQkJICogYXNzdW1lcyB0aGF0IHRoZSBjb250ZW50IGluIHRoZSB0YXJnZXQgbW9kZWwgb2JqZWN0IGhhcyBiZWVuCi0JCQkgKiByZWZsZWN0ZWQgZnJvbSB0aGlzIGZvdW5kIHNvdXJjZVR5cGUgd2hpY2ggaXMgbm90IHRoZSBjYXNlLgotCQkJICovCi0JCQlpZiAoaGFzVmFsaWRSZWZsZWN0aW9uKCkpCi0JCQkJZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gc291cmNlVHlwZTsKLQl9Ci0JLyoqCi0JICogZ2V0U291cmNlVHlwZSAtIHJldHVybiB0aGUgSVR5cGUgd2hpY2ggZGVzY3JpYmVzIG91ciBleGlzdGluZyBKYXZhIGNsYXNzIG9yIHNvdXJjZSBmaWxlCi0JICovCi0JcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCk7Ci0JfQotCXByb3RlY3RlZCBNYXAgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpIHsKLQkJcmV0dXJuIHR5cGVSZXNvbHV0aW9uQ2FjaGU7Ci0JfQotCS8qKgotCSAqIGdldFZhbHVlSW4gbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewotCQkvLyBBdCB0aGlzIHBvaW50LCB0aGlzIGFkYXB0ZXIgZG9lcyBub3QgZHluYW1pY2FsbHkgY29tcHV0ZSBhbnkgdmFsdWVzLAotCQkvLyBhbGwgdmFsdWVzIGFyZSBwdXNoZWQgYmFjayBpbnRvIHRoZSB0YXJnZXQgb24gdGhlIGluaXRpYWwgY2FsbC4KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlVHlwZSBpcyBudWxsIG9yIGlmCi0JICogaXQgaXMgYSBiaW5hcnkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NvdXJjZVR5cGVGcm9tQmluYXJ5KCkgewotCQlpZiAoZ2V0U291cmNlVHlwZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vbXVzdCBiZSBuZXc/Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCkuaXNCaW5hcnkoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgcmVmbGVjdEphdmFDbGFzcyhTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlJVHlwZSB0eXBlID0gSkRPTVNlYXJjaEhlbHBlci5maW5kVHlwZShxdWFsaWZpZWROYW1lLCB0cnVlLCBnZXRTb3VyY2VQcm9qZWN0KCksIHRoaXMpOwotCQlpZiAodHlwZSAhPSBudWxsKQotCQkJcmV0dXJuIHJlZmxlY3RKYXZhQ2xhc3ModHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBjcmVhdGVKYXZhQ2xhc3NSZWYocXVhbGlmaWVkTmFtZSk7Ci0JfQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgcmVmbGVjdEphdmFDbGFzcyhJVHlwZSBhVHlwZSkgewotCQlpZiAoYVR5cGUgIT0gbnVsbCkgewotCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShhVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgKEVPYmplY3QpIGdldFRhcmdldCgpKTsKLQkJCWlmIChqYXZhQ2xhc3MgIT0gbnVsbCkgewotCQkJCUphdmFDbGFzc0pET01BZGFwdG9yIGFkYXB0b3IgPSAoSmF2YUNsYXNzSkRPTUFkYXB0b3IpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKGphdmFDbGFzcy5lQWRhcHRlcnMoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJCWlmIChhZGFwdG9yICE9IG51bGwpCi0JCQkJCWFkYXB0b3Iuc2V0U291cmNlVHlwZShhVHlwZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gamF2YUNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiByZWZsZWN0VmFsdWVzIC0gdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIHB1bXAgdmFsdWVzIGludG8gdGFyZ2V0LgotCSAqIG9uIGVudHJ5OiBuYW1lLCBjb250YWluaW5nIHBhY2thZ2UgKGFuZCBxdWFsaWZpZWQgbmFtZSksIGFuZCBkb2N1bWVudCBtdXN0IGJlIHNldC4KLQkgKiBSZXR1cm4gdHJ1ZSBhbHdheXMgYW5kIHRoZSBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplciB3aWxsIGZsdXNoIHdpdGggdGhlIHR5cGUgY2FuCi0JICogYmUgZm91bmQgYWdhaW4uICBJbiBoZWFkbGVzcyBtb2RlLCByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSB0eXBlIGlzIGZvdW5kLiAgVGhpcyBpcwotCSAqIG5lZWRlZCBiZWNhdWNlIG1vc3QgaGVhZGxlc3MgdGFza3MgYXJlIGRvbmUgdW5kZXIgb25lIG9wZXJhdGlvbiBhbmQgdGhlIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyCi0JICogbWF5IG5vdCBoYXZlIGEgY2hhbmNlIHRvIGZsdXNoIGEgYmFkIHJlZmxlY3Rpb24gYmVmb3JlIHRoZSByZWFsIHR5cGUgbmVlZHMgdG8gYmUgZm91bmQgYW5kIGNhbiBiZSBmb3VuZC4KLQkgKiBKYXZhQ2xhc3MgYWRhcHRvcjoKLQkgKiAtIHNldCBtb2RpZmllcnMKLQkgKiAtIHNldCBuYW1lCi0JICogLSBzZXQgcmVmZXJlbmNlIHRvIHN1cGVyCi0JICogLSBjcmVhdGUgbWV0aG9kcwotCSAqIC0gY3JlYXRlIGZpZWxkcwotCSAqIC0gYWRkIGltcG9ydHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlpZiAoaGFzRmx1c2hlZCkgewotCQkJLy8gV2UgZmx1c2ggc29tZXRpbWUgaW4gdGhlIHBhc3Qgc2luY2UgbGFzdCByZWZsZWN0LiBTbyBub3cgZG8gdGhlIGFjdHVhbCBmbHVzaC4KLQkJCWZsdXNoTm93KCk7Ci0JCX0KLQkJc3VwZXIucmVmbGVjdFZhbHVlcygpOwotCQlib29sZWFuIGlzSGVhZGxlc3MgPSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmdldEN1cnJlbnRDb250ZXh0KCkgPT0gVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5IRUFETEVTU19DT05URVhUOwotCQlpZiAoY2FuUmVmbGVjdCgpKSB7Ci0JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfQ0xBU1MpOwotCQkJdHJ5IHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0U291cmNlVHlwZSgpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCWJvb2xlYW4gaXNXQyA9IGN1ICE9IG51bGwgPyBjdS5pc1dvcmtpbmdDb3B5KCkgOiBmYWxzZTsKLQkJCQlJUmVzb3VyY2UgcmVzID0gaXNXQyA/IGdldFNvdXJjZVR5cGUoKS5nZXRSZXNvdXJjZSgpIDogbnVsbDsKLQkJCQkvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHBoeXNpY2FsIGNsYXNzZXMuIElmIHN0aWxsIGp1c3QgaW4gd29ya2luZyBjb3B5IGFuZCBub3QgeWV0IHB1dCBvdXQgdG8KLQkJCQkvLyBkaXNrLCB3ZSBkb24ndCBzaG91bGQgdHJlYXQgYXMgbm90IGV4aXN0LiBBbnl0aGluZyBlbHNlIGlzIGNvbnNpZGVyZWQgZXhpc3RpbmcgYmVjYXVzZSB3ZSBnb3QgcGFzdAotCQkJCS8vIGdldFNvdXJjZVR5cGUuZXhpc3RzLiBUaGlzIHdpbGwgcmV0dXJuIHRoZSB0cnV0aCBmb3Igbm9uLXdjLiBCdXQgZm9yIHdjIHR5cGVzIGl0IHdpbGwgcmV0dXJuIHRydWUsCi0JCQkJLy8gZXZlbiB0aG91Z2ggbm90IHBoeXNpY2FsbHkgb24gZGlzayAoc3VjaCBhcyBqdXN0IGNyZWF0aW5nIGl0IGFuZCBoYWRuJ3Qgc2F2ZWQgaXQgeWV0KS4gU28gZm9yIHdjIHR5cGVzCi0JCQkJLy8gd2UgbmVlZCB0byB0ZXN0IHRoZSBhY3R1YWwgcmVzb3VyY2UuCi0JCQkJLy8gVGVzdCBpcyBPSyBpZiBub3Qgd2MsIG9yIGlmIHdjLCB0aGVuIHRoZXJlIGlzIGEgcmVzLiBhbmQgaXQgaXMgYWNjZXNzaWJsZS4KLQkJCQlpZiAoIWlzV0MgfHwgKHJlcyAhPSBudWxsICYmIHJlcy5pc0FjY2Vzc2libGUoKSkpIHsKLQkJCQkJc2V0TW9kaWZpZXJzKCk7Ci0JCQkJCXNldE5hbWluZygpOwotCQkJCQl0cnkgewotCQkJCQkJc2V0U3VwZXIoKTsKLQkJCQkJfSBjYXRjaCAoSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCX0KLQkJCQkJc2V0SW1wbGVtZW50cygpOwotCQkJCQlyZWZsZWN0SW5uZXJDbGFzc2VzKCk7Ci0JCQkJCXNldERlY2xhcmluZ0NsYXNzKCk7Ci0JCQkJCS8vYWRkSW1wb3J0cygpOwotCQkJCQlpZiAoaXNIZWFkbGVzcykgewotCQkJCQkJcmVnaXN0ZXJXaXRoRmFjdG9yeSgpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BDdW11bGF0aXZlU3RlcChSRUZMRUNUX0NMQVNTKTsKLQkJCX0KLQkJfQotCQlpZiAoaXNIZWFkbGVzcykKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZSB7Ci0JCQlyZWdpc3RlcldpdGhGYWN0b3J5KCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWNsYXJpbmdDbGFzcygpIHsKLQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGdldFNvdXJjZVR5cGUoKS5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCWlmIChkZWNsYXJpbmdUeXBlICE9IG51bGwpIHsKLQkJCS8vIE5lZWQgdG8gZ2V0IGl0IGFuZCByZWZsZWN0IGl0IHNvIHRoYXQgdGhlIGRlY2xhcmVkIHR5cGUgb2YgdGhpcyB0YXJnZXQgaXMgc2V0IGNvcnJlY3RseS4gV2UgY2FuIGp1c3QKLQkJCS8vIHNldCBpdCBvdXJzZWx2ZXMgZGlyZWN0bHkgYmVjYXVzZSBFQ29yZSB3b3VsZCB0cnkgdG8gYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGlubmVyIGNsYXNzZXMgb2YgdGhlIGRlY2xhcmluZyB0eXBlLiBUaGlzCi0JCQkvLyB3b3VsZCBjYXVzZSBpdCB0byBiZSBhZGRlZCB0d2ljZSwgb25jZSBmcm9tIHRoZSByZWZsZWN0aW9uIGNhdXNlZCBieSB0aGUgaW52ZXJzZSBzZXR0aW5nLCBhbmQgb25jZSBmcm9tIG91ciBkb2luZwotCQkJLy8gdGhlIGludmVyc2Ugc2V0dGluZyBpdHNlbGYuCi0JCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRUYXJnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBkZWNsYXJpbmdUeXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlKYXZhQ2xhc3NJbXBsIGRlY2xhcmluZ0NsYXNzID0gKEphdmFDbGFzc0ltcGwpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShwYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpLCBzZXQpOwotCQkJZGVjbGFyaW5nQ2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCk7CS8vIFRoaXMgd2lsbCBjYXVzZSBpdCB0byBwdXQgdXMgaW50byBpdHMgbGlzdCBhbmQgYWxzbyBzZXQgb3VyIGRlY2xhcmluZyBjbGFzcyB0byB0aGlzIGRlY2xhcmluZyB0eXBlLgotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVmbGVjdCgpIHsKLQkJcmV0dXJuIGlzUmVzb3VyY2VMb2FkZWQoKSAmJiBnZXRTb3VyY2VQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VUeXBlKCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VUeXBlKCkuZXhpc3RzKCk7Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWZsZWN0RmllbGRzSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChyZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKSAmJiBjYW5SZWZsZWN0KCkpIHsKLQkJCWlmICghaGFzUmVmbGVjdGVkRmllbGRzICYmICFpc1JlZmxlY3RpbmdGaWVsZHMpIHsKLQkJCQlpc1JlZmxlY3RpbmdGaWVsZHMgPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9GSUVMRFMpOwotCQkJCQlhZGRGaWVsZHMoKTsKLQkJCQkJaGFzUmVmbGVjdGVkRmllbGRzID0gdHJ1ZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQloYXNSZWZsZWN0ZWRGaWVsZHMgPSBmYWxzZTsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkgewotCQkJCQkJbG9nZ2VyLmxvZyhSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGYWlsZWRfcmVmbGVjdGluZ192YWx1ZXNfRVJST1JfIiksIExldmVsLldBUk5JTkcpOyAvLyROT04tTkxTLTEkID0gIkZhaWxlZCByZWZsZWN0aW5nIHZhbHVlcyEhISIKLQkJCQkJCWxvZ2dlci5sb2dXYXJuaW5nKGUpOyAKLQkJCQkJfQkJCQkJCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaXNSZWZsZWN0aW5nRmllbGRzID0gZmFsc2U7Ci0JCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BDdW11bGF0aXZlU3RlcChSRUZMRUNUX0ZJRUxEUyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGhhc1JlZmxlY3RlZEZpZWxkczsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7CS8vIENvdWxkbid0IHJlZmxlY3QgdGhlIGJhc2UgdmFsdWVzLCBzbyBjb3VsZG4ndCBkbyBmaWVsZHMgZWl0aGVyCi0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCkgewotCQlpZiAocmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkgJiYgY2FuUmVmbGVjdCgpKSB7Ci0JCQlpZiAoIWhhc1JlZmxlY3RlZE1ldGhvZHMgJiYgIWlzUmVmbGVjdGluZ01ldGhvZHMpIHsKLQkJCQlpc1JlZmxlY3RpbmdNZXRob2RzID0gdHJ1ZTsKLQkJCQl0cnkgewotCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfTUVUSE9EUyk7Ci0JCQkJCWhhc1JlZmxlY3RlZE1ldGhvZHMgPSBhZGRNZXRob2RzKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaGFzUmVmbGVjdGVkTWV0aG9kcyA9IGZhbHNlOwotCQkJCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKSB7Ci0JCQkJCQlsb2dnZXIubG9nKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZhaWxlZF9yZWZsZWN0aW5nX3ZhbHVlc19FUlJPUl8iKSwgTGV2ZWwuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQgPSAiRmFpbGVkIHJlZmxlY3RpbmcgdmFsdWVzISEhIgotCQkJCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoZSk7IAotCQkJCQl9CQkJCQkKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpc1JlZmxlY3RpbmdNZXRob2RzID0gZmFsc2U7Ci0JCQkJCWlmICghaGFzUmVmbGVjdGVkKQotCQkJCQkJZmx1c2hNZXRob2RzKCk7CS8vIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQsIHNvIHdlIHdpbGwgZG8gYSBjb21wbGV0ZSBmbHVzaCB0byBiZSBvbiBzYWZlIHNpZGUuCi0JCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BDdW11bGF0aXZlU3RlcChSRUZMRUNUX01FVEhPRFMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBoYXNSZWZsZWN0ZWRNZXRob2RzOwotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsJLy8gQ291bGRuJ3QgcmVmbGVjdCB0aGUgYmFzZSB2YWx1ZXMsIHNvIGNvdWxkbid0IGRvIGZpZWxkcyBlaXRoZXIKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyV2l0aEZhY3RvcnkoKSB7Ci0JCWdldEFkYXB0ZXJGYWN0b3J5KCkucmVnaXN0ZXJSZWZsZWN0aW9uKGdldEphdmFDbGFzc1RhcmdldCgpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCksIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuamF2YS5hZGFwdGVycy5SZWZsZWN0aW9uQWRhcHRvciNub3RpZnlDaGFuZ2VkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KU5vdGlmaWVyLCBpbnQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRU9iamVjdCwgT2JqZWN0LCBPYmplY3QsIGludCkpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WSU5HX0FEQVBURVIKLQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpID09IHRoaXMKLQkJCSYmIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpID09IGdldFRhcmdldCgpKQotCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS51bnJlZ2lzdGVyUmVmbGVjdGlvbihnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFkYXB0ZXJGYWN0b3J5KEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkgaW5GYWN0b3J5KSB7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gaW5GYWN0b3J5OwotCX0KLQkvKioKLQkgKiBzZXRJbXBsZW1lbnRzIC0gc2V0IG91ciBpbXBsZW1lbnRlZC9zdXBlciBpbnRlcmZhY2VzIGhlcmUKLQkgKiBGb3IgYW4gaW50ZXJmYWNlLCB0aGVzZSBhcmUgc3VwZXJjbGFzc2VzLgotCSAqIEZvciBhIGNsYXNzLCB0aGVzZSBhcmUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbXBsZW1lbnRzKCkgewotCQl0cnkgewotCQkJU3RyaW5nW10gaW50ZXJmYWNlTmFtZXMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpOwotCQkJSmF2YUNsYXNzIHJlZjsKLQkJCS8vIG5lZWRzIHdvcmssIHRoZSBuYW1lcyBhYm92ZSB3aWxsIGJlIHNpbXBsZSBuYW1lcyBpZiB3ZSBhcmUgcmVsZmVjdGluZyBmcm9tIGEgc291cmNlIGZpbGUKLQkJCUxpc3QgbGlzdCA9IGdldEphdmFDbGFzc1RhcmdldCgpLmdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpbnRlcmZhY2VOYW1lc1tpXTsKLQkJCQkvLyBpZiBhIGNsYXNzIGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIHRoYXQgaXMgYWN0dWFsbHkgYW4gaW5uZXIgaW50ZXJmYWNlLCB0aGUgaW5uZXIgaW50ZXJmYWNlCi0JCQkJLy8gcGFja2FnZSBpcyBub3QgcmVzb2x2ZWQgY29ycmVjdGx5IHdpdGhvdXQgZ2V0dGluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIEZvciBleGFtcGxlLAotCQkJCS8vIHB1YmxpYyBjbGFzcyBUZXN0QmVhbiBpbXBsZW1lbnRzIFNvbWVPdGhlclNpbXBsZUNsYXNzLlNvbWVJbnRlcmZhY2UKLQkJCQkvLyB3aXRob3V0IGdldHRpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCB3ZSBhcmUgdXNpbmcgU29tZU90aGVyU2ltcGxlQ2xhc3MgYXMgdGhlIAotCQkJCS8vIHBhY2thZ2UgbmFtZSB3aGljaCBpcyBpbmNvcnJlY3QuCi0JCQkJU3RyaW5nIGlubmVydHlwZU5hbWUgPSBKRE9NU2VhcmNoSGVscGVyLmdldFJlc29sdmVkVHlwZU5hbWUobmFtZSwgZ2V0VHlwZSgpLCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkpOwotCQkJCWlmIChpbm5lcnR5cGVOYW1lICE9IG51bGwpIHsKLQkJCQkJbmFtZSA9IGlubmVydHlwZU5hbWU7Ci0JCQkJfQotCQkJCXJlZiA9IHJlZmxlY3RKYXZhQ2xhc3MobmFtZSk7Ci0JCQkJbGlzdC5hZGQocmVmKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJLy8gbmFtZSBzdGF5cyBudWxsIGFuZCB3ZSBjYXJyeSBvbgotCQl9Ci0JfQotCS8qKgotCSAqIHNldE1vZGlmaWVycyAtIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlcyByZWxhdGVkIHRvIG1vZGlmaWVycyBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKCkgewotCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2xhc3NUYXJnZXQuc2V0QWJzdHJhY3QoRmxhZ3MuaXNBYnN0cmFjdChnZXRTb3VyY2VUeXBlKCkuZ2V0RmxhZ3MoKSkpOwotCQkJamF2YUNsYXNzVGFyZ2V0LnNldEZpbmFsKEZsYWdzLmlzRmluYWwoZ2V0U291cmNlVHlwZSgpLmdldEZsYWdzKCkpKTsKLQkJCWphdmFDbGFzc1RhcmdldC5zZXRQdWJsaWMoRmxhZ3MuaXNQdWJsaWMoZ2V0U291cmNlVHlwZSgpLmdldEZsYWdzKCkpKTsKLQkJCS8vIFNldCB0eXBlIHRvIGNsYXNzIG9yIGludGVyZmFjZSwgbm90IHlldCBoYW5kbGluZyBFWENFUFRJT04KLQkJCWlmIChnZXRTb3VyY2VUeXBlKCkuaXNDbGFzcygpKQotCQkJCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwpOwotCQkJZWxzZQotCQkJCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkKLQkJCQlsb2dnZXIubG9nKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0ludHJvc3BlY3RpbmdfRmxhZ3NfRVJST1JfIiwgbmV3IE9iamVjdFtdIHsgamF2YUNsYXNzVGFyZ2V0LmdldFF1YWxpZmllZE5hbWUoKSwgbnBlLmdldE1lc3NhZ2UoKX0pLCBMZXZlbC5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJCA9ICJlcnJvciBpbnRyb3NwZWN0aW5nIGZsYWdzIG9uIHswfSIKLQkJfQotCX0KLQkvKioKLQkgKiBzZXROYW1pbmcgLSBzZXQgdGhlIG5hbWluZyB2YWx1ZXMgaGVyZQotCSAqIAktIHF1YWxpZmllZCBuYW1lIChwYWNrYWdlIG5hbWUgKyBuYW1lKSBtdXN0IGJlIHNldCBmaXJzdCwgdGhhdCBpcyB0aGUgcGF0aCB0byB0aGUgcmVhbCBKYXZhIGNsYXNzCi0JICoJLSBJRCAtIHNpbXBsZSBuYW1lLCBpZGVudGl0eSB3aXRoaW4gYSBwYWNrYWdlIGRvY3VtZW50Ci0JICogCS0gbnVsbCBVVUlECi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtaW5nKCkgewotCQkvKiBOYW1pbmcgaGFzIGJlZW4gcHJvdmlkZWQgYnkgdGhlIEphdmFSZWZsZWN0aW9uS2V5IAotCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFNvdXJjZVR5cGUoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlqYXZhQ2xhc3NUYXJnZXQucmVmU2V0VVVJRCgoU3RyaW5nKW51bGwpOwotCQkoKFhNSVJlc291cmNlKWphdmFDbGFzc1RhcmdldC5lUmVzb3VyY2UoKSkuc2V0SUQoamF2YUNsYXNzVGFyZ2V0LGdldFNvdXJjZVR5cGUoKS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJKi8KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlVHlwZShJVHlwZSBhVHlwZSkgewotCQlzb3VyY2VUeXBlID0gYVR5cGU7Ci0JfQotCS8qKgotCSAqIHNldFN1cGVyIC0gc2V0IG91ciBzdXBlcnR5cGUgaGVyZSwgaW1wbGVtZW50ZWQgaW50ZXJmYWNlIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdXBlcigpIHRocm93cyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN1cGVyTmFtZSA9IG51bGw7Ci0JCUlUeXBlIHN1cGVyVHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoIWdldFNvdXJjZVR5cGUoKS5pc0ludGVyZmFjZSgpKSB7Ci0JCQkJc3VwZXJOYW1lID0gZ2V0U291cmNlVHlwZSgpLmdldFN1cGVyY2xhc3NOYW1lKCk7Ci0JCQkJLy8gYmluYXJ5IHR5cGVzIHdpbGwgYWx3YXlzIGhhdmUgZnVsbHktcXVhbGlmaWVkIHN1cGVyIG5hbWVzLCBzbyBubyBuZWVkIHRvIGRvIGFueSBzZWFyY2hpbmcuCi0JCQkJaWYgKCFnZXRTb3VyY2VUeXBlKCkuaXNCaW5hcnkoKSAmJiBzdXBlck5hbWUgIT0gbnVsbCAmJiBpc1RhcmdldElubmVyKCkpIHsKLQkJCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGdldFNvdXJjZVR5cGUoKS5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCQkJCWlmIChkZWNsYXJpbmdUeXBlICE9IG51bGwpIHsKLQkJCQkJCS8vR2V0IGFsbCBwYXJlbnQgSW5uZXJUeXBlcwotCQkJCQkJSVR5cGVbXSBpbm5lcnMgPSBkZWNsYXJpbmdUeXBlLmdldFR5cGVzKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGlubmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCUlUeXBlIHR5cGUgPSBpbm5lcnNbaV07Ci0JCQkJCQkJaWYgKHN1cGVyTmFtZS5lcXVhbHModHlwZS5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJCQkJCQlzdXBlck5hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCkgKyAnLicgKyBzdXBlck5hbWU7Ci0JCQkJCQkJCXJlZmxlY3RJbm5lckNsYXNzZXMoZGVjbGFyaW5nVHlwZSk7Ci0JCQkJCQkJCXN1cGVyVHlwZSA9IHR5cGU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvL1NvdXJjZSBmaWxlcyByZXR1cm4gbnVsbCBpZiBleHRlbmRzIGRvZXMgbm90IGV4aXN0LgotCQkJCWlmIChzdXBlck5hbWUgPT0gbnVsbCAmJiAhZ2V0U291cmNlVHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhPQkpFQ1RfVFlQRV9OQU1FKSkKLQkJCQkJc3VwZXJOYW1lID0gT0JKRUNUX1RZUEVfTkFNRTsKLQkJCQlpZiAoc3VwZXJOYW1lICE9IG51bGwpIHsKLQkJCQkJSmF2YUNsYXNzIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3MpIGdldFRhcmdldCgpOwotCQkJCQlpZiAoc3VwZXJUeXBlICE9IG51bGwpCi0JCQkJCQlqYXZhQ2xhc3NUYXJnZXQuc2V0U3VwZXJ0eXBlKHJlZmxlY3RKYXZhQ2xhc3Moc3VwZXJUeXBlKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWphdmFDbGFzc1RhcmdldC5zZXRTdXBlcnR5cGUocmVmbGVjdEphdmFDbGFzcyhzdXBlck5hbWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJfQotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNUYXJnZXRJbm5lcigpIHsKLQkJSmF2YUNsYXNzSW1wbCBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JCXJldHVybiAoamF2YUNsYXNzLmdldE5hbWUoKS5pbmRleE9mKCckJykgIT0gLTEpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlVHlwZSBjYW4gYmUgZm91bmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc291cmNlVHlwZUV4aXN0cygpIHsKLQkJcmV0dXJuIGdldFNvdXJjZVR5cGUoKSAhPSBudWxsOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0SW5uZXJDbGFzc2VzKCkgewotCQlJVHlwZVtdIGlubmVyQ2xhc3NlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbm5lckNsYXNzZXMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0VHlwZXMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlpZiAoaW5uZXJDbGFzc2VzICE9IG51bGwgJiYgaW5uZXJDbGFzc2VzLmxlbmd0aCAhPSAwKSB7Ci0JCQlMaXN0IGRlY2xhcmVkQ2xhc3NlcyA9IGdldEphdmFDbGFzc1RhcmdldCgpLmdldERlY2xhcmVkQ2xhc3Nlc0dlbigpOwotCQkJSmF2YUNsYXNzIGlubmVyOwotCQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0VGFyZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0U291cmNlVHlwZSgpLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlubmVyQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCWlubmVyID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKHBhY2thZ2VOYW1lLCBpbm5lckNsYXNzZXNbaV0uZ2V0VHlwZVF1YWxpZmllZE5hbWUoKSwgc2V0KTsKLQkJCQlkZWNsYXJlZENsYXNzZXMuYWRkKGlubmVyKTsKLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0SW5uZXJDbGFzc2VzKElUeXBlIGFUeXBlKSB7Ci0JCUlUeXBlW10gaW5uZXJDbGFzc2VzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlubmVyQ2xhc3NlcyA9IGFUeXBlLmdldFR5cGVzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKGlubmVyQ2xhc3NlcyAhPSBudWxsICYmIGlubmVyQ2xhc3Nlcy5sZW5ndGggIT0gMCkgewotCQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0VGFyZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gYVR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCUphdmFDbGFzc0ltcGwgcGFyZW50VHlwZSA9IChKYXZhQ2xhc3NJbXBsKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUocGFja2FnZU5hbWUsIGFUeXBlLmdldFR5cGVRdWFsaWZpZWROYW1lKCksIHNldCk7Ci0JCQlMaXN0IGRlY2xhcmVkQ2xhc3NlcyA9IHBhcmVudFR5cGUuZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCk7Ci0JCQlKYXZhQ2xhc3MgaW5uZXI7Ci0JCQkKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbm5lckNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbm5lciA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShwYWNrYWdlTmFtZSwgaW5uZXJDbGFzc2VzW2ldLmdldFR5cGVRdWFsaWZpZWROYW1lKCksIHNldCk7Ci0JCQkJZGVjbGFyZWRDbGFzc2VzLmFkZChpbm5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBpZiB3ZSBoYXZlIGEgdmFsaWQgc291cmNlIGFuZCBoYXMgYmVlbiByZWZsZWN0ZWQuIFRoaXMgaXMgdG8gb25seQotCSAqIHRvIGJlIHVzZWQgYnkgdGhpcyBhZGFwdGVyIGFuZCBieSB0aGUgSkRPTSBhZGFwdGVyIGZhY3RvcnkuIEl0IGhhcyBhIAotCSAqIHZlcnkgc3BlY2lmaWMgbWVhbmluZyBhbmQgbWF5IGNoYW5nZSBhcyBuZWVkZWQuIEl0IHNob3VsZCBub3QgYmUgdXNlZAotCSAqIGZvciBhbnkgb3RoZXIgcHVycG9zZS4gSXQgaXMgbm90IGFuIEFQSS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0Jc3luY2hyb25pemVkIGJvb2xlYW4gaGFzVmFsaWRSZWZsZWN0aW9uKCkgewotCQlyZXR1cm4gc291cmNlVHlwZSAhPSBudWxsICYmIGhhc1JlZmxlY3RlZCAmJiAhaXNSZWZsZWN0aW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUZpZWxkSkRPTUFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUZpZWxkSkRPTUFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwMWRmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFGaWVsZEpET01BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5GaWVsZEltcGw7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0Mjo1MCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFGaWVsZEpET01BZGFwdG9yIGV4dGVuZHMgSkRPTUFkYXB0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRUdJTl9DT01NRU5UID0gIi8qIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfQ09NTUVOVCA9ICIqLyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgSUZpZWxkIHNvdXJjZUZpZWxkID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVR5cGUgcGFyZW50VHlwZSA9IG51bGw7Ci0JcHVibGljIEphdmFGaWVsZEpET01BZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSUphdmFQcm9qZWN0IHdvcmtpbmdQcm9qZWN0KSB7Ci0JCXN1cGVyKHRhcmdldCwgd29ya2luZ1Byb2plY3QpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclNvdXJjZSgpIHsKLQkJc291cmNlRmllbGQgPSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaFJlZmxlY3RlZFZhbHVlcyhib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQkJaWYgKGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpCi0JCQljbGVhclNvdXJjZSgpOwotCQlGaWVsZEltcGwgZmllbGQgPSBnZXRUYXJnZXRGaWVsZCgpOwotCQlmaWVsZC5zZXRJbml0aWFsaXplcihudWxsKTsKLQkJZmllbGQuc2V0RmluYWwoZmFsc2UpOwotCQlmaWVsZC5zZXRTdGF0aWMoZmFsc2UpOwotCQlmaWVsZC5zZXRUcmFuc2llbnQoZmFsc2UpOwotCQlmaWVsZC5zZXRWb2xhdGlsZShmYWxzZSk7Ci0JCWZpZWxkLnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCk7Ci0JCWZpZWxkLnNldEVUeXBlKG51bGwpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0JCWdldFRhcmdldEZpZWxkKCkuc2V0UmVmbGVjdGVkKGZhbHNlKTsKLQkJc3VwZXIucG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoaXNFeGlzdGluZyk7Ci0JfQotCS8qKgotCSAqIFJldHVybiBhIFN0cmluZyBmb3IgdGhlIHNvdXJjZSBzdGFydGluZyBhZnRlciB0aGUgZmllbGQncyBuYW1lIHRvIHRoZSBlbmQgb2YKLQkgKiB0aGUgc291cmNlIHJhbmdlLiAgVGhpcyB3aWxsIGJlIHRoZSBzb3VyY2UgYWZ0ZXIgdGhlIG5hbWUgd2hpY2ggY291bGQgaW5jbHVkZSBjb21tZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpZWxkSW5pdGlhbGl6ZXJTb3VyY2UoKSB7Ci0JCUlPcGVuYWJsZSBvcGVuYWJsZSA9IGdldFNvdXJjZUZpZWxkKCkuZ2V0T3BlbmFibGUoKTsKLQkJdHJ5IHsKLQkJCUlTb3VyY2VSYW5nZSBuYW1lUmFuZ2UsIHNvdXJjZVJhbmdlOwotCQkJaW50IHN0YXJ0ID0gLTEsIGxlbmd0aCA9IDA7Ci0JCQlJQnVmZmVyIGJ1ZmZlciA9IG9wZW5hYmxlLmdldEJ1ZmZlcigpOwotCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluYW1lUmFuZ2UgPSBnZXRTb3VyY2VGaWVsZCgpLmdldE5hbWVSYW5nZSgpOwotCQkJc3RhcnQgPSBuYW1lUmFuZ2UuZ2V0T2Zmc2V0KCkgKyBuYW1lUmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoc3RhcnQgIT0gLTEpIHsKLQkJCQlzb3VyY2VSYW5nZSA9IGdldFNvdXJjZUZpZWxkKCkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQlpZiAoc291cmNlUmFuZ2UuZ2V0T2Zmc2V0KCkgIT0gLTEpCi0JCQkJCWxlbmd0aCA9IHNvdXJjZVJhbmdlLmdldE9mZnNldCgpICsgc291cmNlUmFuZ2UuZ2V0TGVuZ3RoKCkgLSBzdGFydDsKLQkJCQlyZXR1cm4gYnVmZmVyLmdldFRleHQoc3RhcnQsIGxlbmd0aCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgZmllbGQgc291cmNlIHN0cmluZyB3aXRob3V0IGNvbW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWVsZEluaXRpYWxpemVyU291cmNlV2l0aG91dENvbW1lbnRzKCkgewotCQlTdHJpbmcgcyA9IGdldEZpZWxkSW5pdGlhbGl6ZXJTb3VyY2UoKTsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IHN0YXJ0Q29tbWVudCA9IC0xOwotCQlpbnQgZW5kQ29tbWVudCA9IC0xOwotCQl3aGlsZSAoc3RhcnQgPCBzLmxlbmd0aCgpKSB7Ci0JCQlzdGFydENvbW1lbnQgPSBzLmluZGV4T2YoQkVHSU5fQ09NTUVOVCwgc3RhcnQpOwotCQkJaWYgKHN0YXJ0Q29tbWVudCA+IDApIHsKLQkJCQlTdHJpbmcgbmV3U3RyaW5nOwotCQkJCWVuZENvbW1lbnQgPSBzLmluZGV4T2YoRU5EX0NPTU1FTlQsIHN0YXJ0KTsKLQkJCQluZXdTdHJpbmcgPSBzLnN1YnN0cmluZyhzdGFydCwgc3RhcnRDb21tZW50KTsKLQkJCQlzID0gbmV3U3RyaW5nICsgcy5zdWJzdHJpbmcoZW5kQ29tbWVudCArIEVORF9DT01NRU5ULmxlbmd0aCgpLCBzLmxlbmd0aCgpKTsKLQkJCQlzdGFydCA9IDA7Ci0JCQkJc3RhcnRDb21tZW50ID0gLTE7Ci0JCQkJZW5kQ29tbWVudCA9IC0xOwotCQkJfSBlbHNlIHsKLQkJCQlzdGFydCA9IHMubGVuZ3RoKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCS8qKgotCSAqIGdldEZpZWxkSW5pdGlhbGl6ZXJTdHJpbmcgLSBwYXJzZSB0aGUgc291cmNlIGZvciBvdXIgc291cmNlIGZpZWxkIAotCSAqIAlhbmQgcmV0dXJuIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcuCi0JICogIFJldHVybiBudWxsIGlmIG5vIGluaXRpYWxpemF0aW9uIHN0cmluZyBvciBjb25zdGFudCB2YWx1ZSBpcyBwcmVzZW50LgotCSAqIGkuZS4gLSBwdWJsaWMgU3RyaW5nIGZvbyA9ICJmb28gZGVmYXVsdCI7IHNob3VsZCByZXR1cm4gImZvbyBkZWZhdWx0IiAoaW5jbHVkaW5nIHF1b3RlcykKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpZWxkSW5pdGlhbGl6ZXJTdHJpbmcoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKCFnZXRQYXJlbnRUeXBlKCkuaXNCaW5hcnkoKSkgewotCQkJCVN0cmluZyBzb3VyY2UgPSBnZXRGaWVsZEluaXRpYWxpemVyU291cmNlV2l0aG91dENvbW1lbnRzKCk7Ci0JCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCWludCBlcXVhbHNQb3MgPSBzb3VyY2UuaW5kZXhPZignPScpOy8vJE5PTi1OTFMtMSQKLQkJCQkJaW50IGVuZFBvcyA9IHNvdXJjZS5pbmRleE9mKCcsJyk7Ly8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZW5kUG9zID09IC0xKQotCQkJCQkJZW5kUG9zID0gc291cmNlLmxlbmd0aCgpIC0gMTsKLQkJCQkJaWYgKGVxdWFsc1BvcyAhPSAtMSAmJiBlcXVhbHNQb3MgPCBlbmRQb3MpIHsKLQkJCQkJCS8vIENvcHkgZnJvbSBhZnRlciAiPSIgdG8gYmVmb3JlICI7IiBvciAiLCIKLQkJCQkJCXJlc3VsdCA9IHNvdXJjZS5zdWJzdHJpbmcoZXF1YWxzUG9zICsgMSwgZW5kUG9zKTsKLQkJCQkJCXJlc3VsdCA9IHJlc3VsdC50cmltKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIEJpbmFyeSB0eXBlLCBzZWUgaWYgd2UgY2FuIHVzZSB0aGUgY29uc3RhbnQKLQkJCQkvLyBpdCdzIG5vdCBjbGVhciBmcm9tIHRoZSBBUEkncywgYnV0IHRoaXMgaXMgcHJvYmFibHkgb25seQotCQkJCS8vIGF2YWlsYWJsZSBmb3Igc3RhdGljcy4KLQkJCQlPYmplY3QgY29uc3RhbnRWYWx1ZSA9IGdldFNvdXJjZUZpZWxkKCkuZ2V0Q29uc3RhbnQoKTsKLQkJCQkvLyBOZWVkIHRvIGNvbnZlcnQgdGhlIGNvbnN0YW50IHRvIGEgU3RyaW5nCi0JCQkJaWYgKGNvbnN0YW50VmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBjb25zdGFudFZhbHVlLnRvU3RyaW5nKCk7Ci0JCQkJCWlmIChjb25zdGFudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCQlyZXN1bHQgPSAiXCIiICsgcmVzdWx0ICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHB1bnQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBnZXRQYXJlbnRUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBjb3JyZXNwb25kcyB0byBvdXIgcGFyZW50IEphdmFDbGFzcwotCSAqIHdlJ3JlIGdvaW5nIHRvIGRvIHRoaXMgYSBsb3QsIHNvIGNhY2hlIGl0LgotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBnZXRQYXJlbnRUeXBlKCkgewotCQlpZiAocGFyZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlGaWVsZCB0YXJnZXRGaWVsZCA9IChGaWVsZCkgZ2V0VGFyZ2V0KCk7Ci0JCQlKYXZhQ2xhc3MgcGFyZW50SmF2YUNsYXNzID0gdGFyZ2V0RmllbGQuZ2V0SmF2YUNsYXNzKCk7Ci0JCQlpZiAocGFyZW50SmF2YUNsYXNzICE9IG51bGwpIHsKLQkJCQlKYXZhQ2xhc3NKRE9NQWRhcHRvciBwYSA9IChKYXZhQ2xhc3NKRE9NQWRhcHRvcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIocGFyZW50SmF2YUNsYXNzLmVBZGFwdGVycygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKHBhICE9IG51bGwpCi0JCQkJCXBhcmVudFR5cGUgPSBwYS5nZXRTb3VyY2VUeXBlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudFR5cGU7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZUZpZWxkKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlRmllbGQgIT0gbnVsbDsKLSAgICB9Ci0JCi0JLyoKLQkgKiBVc2VkIGJ5IEphdmEgQ2xhc3MgSkRPTSBhZGFwdGVyIHRvIGNyZWF0ZSBhbmQgc2V0IHdpdGggYSBzb3VyY2UgZmllbGQKLQkgKi8JCi0JcHVibGljIHZvaWQgc2V0U291cmNlRmllbGQoSUZpZWxkIGZpZWxkKSB7Ci0JCXNvdXJjZUZpZWxkID0gZmllbGQ7Ci0JfQkKLQkvKioKLQkgKiBnZXRTb3VyY2VGaWVsZCAtIHJldHVybiB0aGUgSUZpZWxkIHdoaWNoIGRlc2NyaWJlcyBvdXIgaW1wbGVtZW50aW5nIGZpZWxkCi0JICovCi0JcHJvdGVjdGVkIElGaWVsZCBnZXRTb3VyY2VGaWVsZCgpIHsKLQkJaWYgKHNvdXJjZUZpZWxkID09IG51bGwgfHwgIXNvdXJjZUZpZWxkLmV4aXN0cygpKSB7Ci0JCQlJVHlwZSBwYXJlbnQgPSB0aGlzLmdldFBhcmVudFR5cGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCQlzb3VyY2VGaWVsZCA9IHBhcmVudC5nZXRGaWVsZCgoKEZpZWxkKSBnZXRUYXJnZXQoKSkuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gc291cmNlRmllbGQ7Ci0JfQotCXB1YmxpYyBGaWVsZEltcGwgZ2V0VGFyZ2V0RmllbGQoKSB7Ci0JCXJldHVybiAoRmllbGRJbXBsKSBnZXRUYXJnZXQoKTsKLQl9Ci0JcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRUeXBlKCk7Ci0JfQotCXByb3RlY3RlZCBNYXAgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpIHsKLQkJRmllbGQgZmllbGQgPSBnZXRUYXJnZXRGaWVsZCgpOwotCQlpZiAoZmllbGQgIT0gbnVsbCkgewotCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IGZpZWxkLmdldEphdmFDbGFzcygpOwotCQkJaWYgKGphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCQkJSkRPTUFkYXB0b3IgY2xhc3NBZGFwdG9yID0gKEpET01BZGFwdG9yKSByZXRyaWV2ZUFkYXB0b3JGcm9tKGphdmFDbGFzcyk7Ci0JCQkJaWYgKGNsYXNzQWRhcHRvciAhPSBudWxsKQotCQkJCQlyZXR1cm4gY2xhc3NBZGFwdG9yLmdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuCi0JICogb24gZW50cnk6IG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwgYW5kIGRvY3VtZW50IG11c3QgYmUgc2V0LgotCSAqIEphdmFDbGFzcyBhZGFwdG9yOgotCSAqCS0gc2V0IG1vZGlmaWVycwotCSAqCS0gc2V0IG5hbWUKLQkgKiAJLSBzZXQgdHlwZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCXN1cGVyLnJlZmxlY3RWYWx1ZXMoKTsKLQkJaWYgKGlzUmVzb3VyY2VMb2FkZWQoKSAmJiBnZXRTb3VyY2VQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VGaWVsZCgpICE9IG51bGwpIHsKLQkJCXNldE1vZGlmaWVycygpOwotCQkJLy8Jc2V0TmFtaW5nKCk7Ci0JCQlzZXRUeXBlKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIHNldE1vZGlmaWVycyAtIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlcyByZWxhdGVkIHRvIG1vZGlmaWVycyBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKCkgewotCQlGaWVsZCBqYXZhRmllbGRUYXJnZXQgPSAoRmllbGQpIGdldFRhcmdldCgpOwotCQl0cnkgewotCQkJU3RyaW5nIGluaXRpYWxpemVyID0gZ2V0RmllbGRJbml0aWFsaXplclN0cmluZygpOwotCQkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpCi0JCQkJamF2YUZpZWxkVGFyZ2V0LnNldEluaXRpYWxpemVyKGNyZWF0ZUJsb2NrKGphdmFGaWVsZFRhcmdldC5nZXROYW1lKCksIGluaXRpYWxpemVyKSk7Ci0JCQlpbnQgZmxhZ3MgPSBnZXRTb3VyY2VGaWVsZCgpLmdldEZsYWdzKCk7Ci0JCQlqYXZhRmllbGRUYXJnZXQuc2V0RmluYWwoRmxhZ3MuaXNGaW5hbChmbGFncykpOwotCQkJamF2YUZpZWxkVGFyZ2V0LnNldFN0YXRpYyhGbGFncy5pc1N0YXRpYyhmbGFncykpOwotCQkJamF2YUZpZWxkVGFyZ2V0LnNldFRyYW5zaWVudChGbGFncy5pc1RyYW5zaWVudChmbGFncykpOwotCQkJamF2YUZpZWxkVGFyZ2V0LnNldFZvbGF0aWxlKEZsYWdzLmlzVm9sYXRpbGUoZmxhZ3MpKTsKLQkJCS8vIFNldCB2aXNpYmlsaXR5Ci0JCQlpZiAoRmxhZ3MuaXNQdWJsaWMoZmxhZ3MpKQotCQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQkJZWxzZSBpZiAoRmxhZ3MuaXNQcml2YXRlKGZsYWdzKSkKLQkJCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBSSVZBVEVfTElURVJBTCk7Ci0JCQllbHNlIGlmIChGbGFncy5pc1Byb3RlY3RlZChmbGFncykpCi0JCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURURfTElURVJBTCk7Ci0JCQllbHNlCi0JCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QQUNLQUdFX0xJVEVSQUwpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfSW50cm9zcGVjdGluZ19GbGFnc19FUlJPUl8iLCBuZXcgT2JqZWN0W10geygoWE1JUmVzb3VyY2UpIGphdmFGaWVsZFRhcmdldC5lUmVzb3VyY2UoKSkuZ2V0SUQoamF2YUZpZWxkVGFyZ2V0KSwgbnBlLmdldE1lc3NhZ2UoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJlcnJvciBpbnRyb3NwZWN0aW5nIGZsYWdzIG9uIHswfSIKLQkJfQotCX0KLQkvKioKLQkgKiBzZXROYW1pbmcgLSBzZXQgdGhlIG5hbWluZyB2YWx1ZXMgaGVyZQotCSAqIAktIHF1YWxpZmllZCBuYW1lIG11c3QgYmUgc2V0IGZpcnN0LCB0aGF0IGlzIHRoZSBwYXRoIHRvIHRoZSByZWFsIEphdmEgY2xhc3MKLQkgKgktIElECi0JICogCS0gbnVsbCBVVUlECi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtaW5nKCkgewotCQlGaWVsZCBqYXZhRmllbGRUYXJnZXQgPSAoRmllbGQpIGdldFRhcmdldCgpOwotCQlKYXZhQ2xhc3MgcGFyZW50ID0gamF2YUZpZWxkVGFyZ2V0LmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJKChYTUlSZXNvdXJjZSkgamF2YUZpZWxkVGFyZ2V0LmVSZXNvdXJjZSgpKS5zZXRJRChqYXZhRmllbGRUYXJnZXQsIHBhcmVudC5nZXROYW1lKCkgKyAiXyIgKyBqYXZhRmllbGRUYXJnZXQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBzZXRUeXBlIC0gc2V0IG91ciB0eXBlIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUeXBlKCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBudWxsOwotCQl0cnkgewotCQkJdHlwZU5hbWUgPSB0eXBlTmFtZUZyb21TaWduYXR1cmUoZ2V0U291cmNlRmllbGQoKS5nZXRUeXBlU2lnbmF0dXJlKCkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQkvLyBuYW1lIHN0YXlzIG51bGwgYW5kIHdlIGNhcnJ5IG9uCi0JCX0KLQkJc2V0RmllbGRUeXBlKGdldFRhcmdldEZpZWxkKCksIHR5cGVOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFKRE9NQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUpET01BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzU3NGRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUpET01BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3I7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi8xMy8yMDAwIDE6MjA6MzEgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSB7Ci0JCi0JcHJvdGVjdGVkIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIHN5bmNocm9uaXplcjsKLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotLyoqCi0gKiBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5KCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEphdmFKRE9NQWRhcHRlckZhY3RvcnkoSUphdmFQcm9qZWN0IGFKYXZhUHJvamVjdCkgewotCXRoaXMoKTsKLQlzZXRKYXZhUHJvamVjdChhSmF2YVByb2plY3QpOwotfQotcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFDbGFzc0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JcmV0dXJuIG5ldyBKYXZhQ2xhc3NKRE9NQWRhcHRvcih0YXJnZXQsIGdldEphdmFQcm9qZWN0KCksIHRoaXMpOwotfQotcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFGaWVsZEFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JcmV0dXJuIG5ldyBKYXZhRmllbGRKRE9NQWRhcHRvcih0YXJnZXQsIGdldEphdmFQcm9qZWN0KCkpOwotfQotcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFNZXRob2RBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCXJldHVybiBuZXcgSmF2YU1ldGhvZEpET01BZGFwdG9yKHRhcmdldCwgZ2V0SmF2YVByb2plY3QoKSk7Ci19Ci0vKioKLSAqICBGbHVzaCBBTEwgYWRhcHRlcnMsIHdvcnN0IGNhc2UKLSAqIFdlIGFsc28gd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgc291cmNlIHR5cGVzIGFyZSBhbHNvIGNsZWFyZWQKLSAqIGluIHRoaXMgd29yc3QgY2FzZSBzY2VuYXJpby4KLSAqLwotcHVibGljIHZvaWQgZmx1c2hBbGwoKSB7Ci0JZG9GbHVzaChyZWZsZWN0ZWQudmFsdWVzKCksdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLXB1YmxpYyBMaXN0IGZsdXNoQWxsTm9Ob3RpZmljYXRpb24oKSB7Ci0JcmV0dXJuIGRvRmx1c2gocmVmbGVjdGVkLnZhbHVlcygpLHRydWUsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgZmx1c2hQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBub0ZsdXNoSWZTb3VyY2VGb3VuZCkgewotCUxpc3QgYWRhcHRvcnMgPSBnZXRSZWZsZWN0ZWRGb3JQYWNrYWdlKHBhY2thZ2VOYW1lLCBub0ZsdXNoSWZTb3VyY2VGb3VuZCk7Ci0JZG9GbHVzaChhZGFwdG9ycywgdHJ1ZSwgdHJ1ZSk7Ci19Ci1wdWJsaWMgTGlzdCBmbHVzaFBhY2thZ2VOb05vdGlmaWNhdGlvbihTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gbm9GbHVzaElmU291cmNlRm91bmQpIHsKLQlMaXN0IGFkYXB0b3JzID0gZ2V0UmVmbGVjdGVkRm9yUGFja2FnZShwYWNrYWdlTmFtZSwgbm9GbHVzaElmU291cmNlRm91bmQpOwotCXJldHVybiBkb0ZsdXNoKGFkYXB0b3JzLCB0cnVlLCBmYWxzZSk7Ci19Ci0vKioKLSAqIFJldHVybiBhIExpc3Qgb2YgcmVmbGVjdGlvbiBhZGFwdG9ycyB0aGF0IGJlbG9uZyB0byAKLSAqIHRoZSBwYWNrYWdlTmFtZS4KLSAqIEBwYXJhbSBwYWNrYWdlTmFtZQotICogQHJldHVybgotICovCi1wcml2YXRlIExpc3QgZ2V0UmVmbGVjdGVkRm9yUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gZmlsdGVyRm91bmRUeXBlcykgewotCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmICFyZWZsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCWlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCA9IHRydWU7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUl0ZXJhdG9yIGl0ID0gcmVmbGVjdGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCU1hcC5FbnRyeSBlbnRyeTsKLQkJCVN0cmluZyBrZXk7Ci0JCQlKYXZhQ2xhc3NKRE9NQWRhcHRvciBhZGFwdG9yOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCWFkYXB0b3IgPSAoSmF2YUNsYXNzSkRPTUFkYXB0b3IpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJLyoKLQkJCQkgKiBFbnN1cmUgdGhhdCB0aGUgdGhlIGFkYXB0b3IgaXMgb25seSBmaWx0ZXJlZCBvdXQgaWYgaXQgaGFzCi0JCQkJICogYWN0dWFsbHkgcmVmbGVjdGVkIHRoZSBjb250ZW50LiAgSXQgaXMgbm90IGdvb2QgZW5vdWdoIGp1c3QKLQkJCQkgKiB0byB0ZXN0IGZvciB0aGUgc291cmNlVHlwZS4KLQkJCQkgKi8KLQkJCQlpZiAoZmlsdGVyRm91bmRUeXBlcyAmJiBhZGFwdG9yLmhhc1ZhbGlkUmVmbGVjdGlvbigpKQotCQkJCQljb250aW51ZTsKLQkJCQlrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlpZiAoa2V5LnN0YXJ0c1dpdGgocGFja2FnZU5hbWUpICYmIGtleS5pbmRleE9mKCcuJywgcGFja2FnZU5hbWUubGVuZ3RoKCkgKyAxKSA8IDApIHsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlyZXN1bHQuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0JCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JfQotCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotfQotcHJpdmF0ZSBMaXN0IGRvRmx1c2goQ29sbGVjdGlvbiBhZGFwdG9ycywgYm9vbGVhbiBjbGVhclNvdXJjZVR5cGUsIGJvb2xlYW4gZG9Ob3RpZnkpIHsKLQlpZiAoIWFkYXB0b3JzLmlzRW1wdHkoKSkgewotCQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCQlMaXN0IG5vdGlmaWNhdGlvbnMgPSBkb05vdGlmeSA/IG51bGwgOiBuZXcgQXJyYXlMaXN0KGFkYXB0b3JzLnNpemUoKSk7Ci0JCXRyeSB7Ci0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uOwotCQkJSXRlcmF0b3IgaSA9IGFkYXB0b3JzLml0ZXJhdG9yKCk7Ci0JCQlKRE9NQWRhcHRvciBhZGFwdG9yOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJYWRhcHRvciA9IChKRE9NQWRhcHRvcikgaS5uZXh0KCk7Ci0JCQkJaWYgKGRvTm90aWZ5KQotCQkJCQlhZGFwdG9yLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoY2xlYXJTb3VyY2VUeXBlKTsKLQkJCQllbHNlIHsKLQkJCQkJbm90aWZpY2F0aW9uID0gYWRhcHRvci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oY2xlYXJTb3VyY2VUeXBlKTsKLQkJCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKQotCQkJCQkJbm90aWZpY2F0aW9ucy5hZGQobm90aWZpY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCQl9Ci0JCXJldHVybiBub3RpZmljYXRpb25zOwotCX0KLQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLX0KLS8vIEZsdXNoIHRoZSBhZGFwdGVyIGZvciBhIHNvdXJjZSBvYmplY3QKLXB1YmxpYyB2b2lkIGZsdXNoUmVmbGVjdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JSkRPTUFkYXB0b3IgYSA9IChKRE9NQWRhcHRvcikgcmVmbGVjdGVkLmdldChzb3VyY2UpOwotCWlmIChhICE9IG51bGwpCi0JCWEuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotfQotcHVibGljIE5vdGlmaWNhdGlvbiBmbHVzaFJlZmxlY3Rpb25Ob05vdGlmaWNhdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JSkRPTUFkYXB0b3IgYSA9IChKRE9NQWRhcHRvcikgcmVmbGVjdGVkLmdldChzb3VyY2UpOwotCWlmIChhICE9IG51bGwpCi0JCXJldHVybiBhLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbihmYWxzZSk7Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXB1YmxpYyBOb3RpZmljYXRpb24gZmx1c2hSZWZsZWN0aW9uUGx1c0lubmVyTm9Ob3RpZmljYXRpb24oU3RyaW5nIHNvdXJjZSkgewotCWlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCA9IHRydWU7Ci0JTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG51bGw7Ci0JdHJ5IHsKLQkJU3RyaW5nIGlubmVyTmFtZSA9IHNvdXJjZSArICckJzsKLQkJSXRlcmF0b3IgaXQgPSByZWZsZWN0ZWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCVN0cmluZyBrZXk7Ci0JCUphdmFSZWZsZWN0aW9uQWRhcHRvciBhZGFwdG9yOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGtleS5lcXVhbHMoc291cmNlKSB8fCBrZXkuc3RhcnRzV2l0aChpbm5lck5hbWUpKSB7Ci0JCQkJYWRhcHRvciA9IChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIHJlZmxlY3RlZC5nZXQoa2V5KTsKLQkJCQlpZiAoYWRhcHRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChub3RpZmljYXRpb24gPT0gbnVsbCkKLQkJCQkJCW5vdGlmaWNhdGlvbiA9IGFkYXB0b3IuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGZhbHNlKTsKLQkJCQkJZWxzZQotCQkJCQkJKChOb3RpZmljYXRpb25DaGFpbikgbm90aWZpY2F0aW9uKS5hZGQoYWRhcHRvci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCX0KLQlyZXR1cm4gbm90aWZpY2F0aW9uOwotCi19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yLzIwMDAgMzowMjozMSBQTSkKLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamR0LmNvcmUuYXBpLklKYXZhUHJvamVjdAotICovCi1wdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCXJldHVybiBqYXZhUHJvamVjdDsKLX0KLS8qKgotICogQ3JlYXRlIGEgSmF2YSBNb2RlbCBsaXN0ZW5lciB3aGljaCB3aWxsIGZsdXNoIGludmFsaWRhdGVkIGFkYXB0b3JzLgotICogVGhpcyB3aWxsIGNhdXNlIHRob3NlIGFkYXB0ZXJzIHRvIHJlLXJlZmxlY3QgdGhlaXIgdGFyZ2V0IG9iamVjdCdzIGNvbnRlbnRzLgotICovCi1wcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3luY2hyb25pemVyKCkgewotCXN5bmNocm9uaXplciA9IG5ldyBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplcih0aGlzKTsKLX0KLS8qKgotICogTm90aWZ5IGFsbCBKRE9NQWRhcHRlcnMgd2hpY2ggdXNlIHRoZSBzYW1lIHRhcmdldCBJQ29tcGlsYXRpb25Vbml0Ci0gKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDQ6NDU6NDMgUE0pCi0gKi8KLXB1YmxpYyB2b2lkIG5vdGlmeUNvbnRlbnRDaGFuZ2VkKElDb21waWxhdGlvblVuaXQgdGFyZ2V0Q1UpIHsKLQotCWlmICh0YXJnZXRDVSA9PSBudWxsIHx8IHJlZmxlY3RlZC52YWx1ZXMoKT09bnVsbCkgcmV0dXJuIDsKLQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCXRyeSB7Ci0JCUl0ZXJhdG9yIGkgPSByZWZsZWN0ZWQudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgYSA9IGkubmV4dCgpIDsKLQkJCWlmIChhIGluc3RhbmNlb2YgSkRPTUFkYXB0b3IpIHsKLQkJCQlKRE9NQWRhcHRvciBhZGFwdG9yID0gKEpET01BZGFwdG9yKSBhOwotCQkJCUlNZW1iZXIgcmVmbGVjdGlvblNvdXJjZSA9IChJTWVtYmVyKSBhZGFwdG9yLmdldFJlZmxlY3Rpb25Tb3VyY2UoKTsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGFkYXB0ZXJDVSA9IG51bGwgOwotCQkJCWlmIChyZWZsZWN0aW9uU291cmNlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJICAgYWRhcHRlckNVID0gcmVmbGVjdGlvblNvdXJjZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCX0KLQkJCQlpZiAoYWRhcHRlckNVICE9IG51bGwgJiYgdGFyZ2V0Q1UuZXF1YWxzKGFkYXB0ZXJDVSkpIHsKLQkJCSAgICAgICBhZGFwdG9yLmNvbnRlbnRDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsgIAkKLQl9Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yLzIwMDAgMzowMjozMSBQTSkKLSAqIEBwYXJhbSBuZXdKYXZhUHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QKLSAqLwotcHVibGljIHZvaWQgc2V0SmF2YVByb2plY3QoSUphdmFQcm9qZWN0IG5ld0phdmFQcm9qZWN0KSB7Ci0JamF2YVByb2plY3QgPSBuZXdKYXZhUHJvamVjdDsKLQlpZiAobmV3SmF2YVByb2plY3QgIT0gbnVsbCAmJiBzeW5jaHJvbml6ZXIgPT0gbnVsbCkKLQkJaW5pdGlhbGl6ZVN5bmNocm9uaXplcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhTWV0aG9kSkRPTUFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1ldGhvZEpET01BZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxN2I1OGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhTWV0aG9kSkRPTUFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFNZXRob2RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLk1ldGhvZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLQotLyoqCi0gKiBKYXZhIE1ldGhvZCBSZWZsZWN0aW9uIEFkYXB0ZXIgZm9yIEpET00gKGkuZS4gSkRUIG1vZGVsKQotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhTWV0aG9kSkRPTUFkYXB0b3IgZXh0ZW5kcyBKRE9NQWRhcHRvciBpbXBsZW1lbnRzIElKYXZhTWV0aG9kQWRhcHRlciAgewotCi0JLyoKLQkgKiBTdGVwIGlkcyB1c2VkIGZvciBUaW1lclRlc3RzIG9mIHBlcmZvcm1hbmNlIHRlc3RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9NRVRIT0QgPSAiUmVmbGVjdCBKRE9NIE1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJTWV0aG9kIHNvdXJjZU1ldGhvZCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVR5cGUgcGFyZW50VHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgSmF2YU1ldGhvZEpET01BZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSUphdmFQcm9qZWN0IHdvcmtpbmdQcm9qZWN0KSB7Ci0JCXN1cGVyKHRhcmdldCwgd29ya2luZ1Byb2plY3QpOwotCX0KLQotCQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQlpZiAoY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkKLQkJCWNsZWFyU291cmNlKCk7Ci0JCU1ldGhvZEltcGwgbWV0aG9kID0gKE1ldGhvZEltcGwpIGdldFRhcmdldCgpOwotCQltZXRob2Quc2V0SXNHZW5lcmF0ZWQoZmFsc2UpOwotCQltZXRob2Quc2V0RmluYWwoZmFsc2UpOwotCQltZXRob2Quc2V0TmF0aXZlKGZhbHNlKTsKLQkJbWV0aG9kLnNldFN0YXRpYyhmYWxzZSk7Ci0JCW1ldGhvZC5zZXRTeW5jaHJvbml6ZWQoZmFsc2UpOwotCQltZXRob2Quc2V0Q29uc3RydWN0b3IoZmFsc2UpOwotCQltZXRob2Quc2V0QWJzdHJhY3QoZmFsc2UpOwotCQltZXRob2Quc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJbWV0aG9kLnNldEVUeXBlKG51bGwpOwotCQltZXRob2QuZ2V0UGFyYW1ldGVyc0dlbigpLmNsZWFyKCk7Ci0JCW1ldGhvZC5nZXRKYXZhRXhjZXB0aW9uc0dlbigpLmNsZWFyKCk7CQkKLQkJcGFyZW50VHlwZSA9IG51bGw7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShib29sZWFuIGlzRXhpc3RpbmcpIHsKLQkJKChNZXRob2RJbXBsKSBnZXRUYXJnZXQoKSkuc2V0UmVmbGVjdGVkKGZhbHNlKTsKLQkJc3VwZXIucG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoaXNFeGlzdGluZyk7Ci0JfQkKLQkvKioKLQkgKiBhZGRFeGNlcHRpb25zIC0gcmVmbGVjdCBvdXIgZXhjZXB0aW9uIGxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGNlcHRpb25zKCkgewotCQl0cnkgewotCQkJSU1ldGhvZCBzb3VyY2VNZXRob2QgPSBnZXRTb3VyY2VNZXRob2QoKTsKLQkJCVN0cmluZ1tdIGV4Y2VwdGlvbk5hbWVzID0gc291cmNlTWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCk7Ci0JCQlMaXN0IGV4Y2VwdGlvbnMgPSAoKE1ldGhvZEltcGwpIGdldFRhcmdldCgpKS5nZXRKYXZhRXhjZXB0aW9uc0dlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWV4Y2VwdGlvbnMuYWRkKGNyZWF0ZUphdmFDbGFzc1JlZih0eXBlTmFtZUZyb21TaWduYXR1cmUoZXhjZXB0aW9uTmFtZXNbaV0pKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCS8vIG5hbWUgc3RheXMgbnVsbCBhbmQgd2UgY2Fycnkgb24KLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7Ci0JCVN0cmluZ1tdIHBhcm1OYW1lcyA9IG5ldyBTdHJpbmdbMF0sIHBhcm1UeXBlTmFtZXMgPSBnZXRTb3VyY2VNZXRob2QoKS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQl0cnkgewotCQkJcGFybU5hbWVzID0gZ2V0U291cmNlTWV0aG9kKCkuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJLy8gbmFtZSBzdGF5cyBudWxsIGFuZCB3ZSBjYXJyeSBvbgotCQl9Ci0JCS8vIFRlbXAgaGFjayB0byB3b3JrIGFyb3VuZCBhIEphdmFNb2RlbCBidWcsIGFib3ZlIGNhbGwgb24gYSBCaW5hcnkgbWV0aG9kIG1heSByZXR1cm4gbnVsbAotCQlpZiAocGFybU5hbWVzID09IG51bGwgfHwgcGFybU5hbWVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlwYXJtTmFtZXMgPSBuZXcgU3RyaW5nW3Bhcm1UeXBlTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCXBhcm1OYW1lc1tpXSA9ICJhcmciICsgaTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0JCi0JCXJldHVybiBwYXJtTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogYWRkUGFyYW1ldGVycyAtIHJlZmxlY3Qgb3VyIHBhcm1zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1ldGVycygpIHsKLQkJU3RyaW5nW10gcGFybVR5cGVOYW1lcyA9IGdldFNvdXJjZU1ldGhvZCgpLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCU1ldGhvZEltcGwgamF2YU1ldGhvZFRhcmdldCA9IChNZXRob2RJbXBsKSBnZXRUYXJnZXQoKTsKLQkJTGlzdCBwYXJhbXMgPSBqYXZhTWV0aG9kVGFyZ2V0LmdldFBhcmFtZXRlcnNHZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXJhbXMuYWRkKGNyZWF0ZUphdmFQYXJhbWV0ZXIoamF2YU1ldGhvZFRhcmdldCwgbnVsbCwgdHlwZU5hbWVGcm9tU2lnbmF0dXJlKHBhcm1UeXBlTmFtZXNbaV0pKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclNvdXJjZSgpIHsKLQkJc291cmNlTWV0aG9kID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoKE1ldGhvZCkgZ2V0VGFyZ2V0KCkpLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJlbnRUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBjb3JyZXNwb25kcyB0byBvdXIgcGFyZW50IEphdmFDbGFzcyB3ZSdyZSBnb2luZyB0byBkbyB0aGlzIGEgbG90LCBzbyBjYWNoZSBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgZ2V0UGFyZW50VHlwZSgpIHsKLQkJaWYgKHBhcmVudFR5cGUgPT0gbnVsbCkgewotCQkJTWV0aG9kIHRhcmdldE1ldGhvZCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQkJaWYodGFyZ2V0TWV0aG9kICE9IG51bGwpewotCQkJCUphdmFDbGFzcyBwYXJlbnRKYXZhQ2xhc3MgPSB0YXJnZXRNZXRob2QuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCQkJCUphdmFDbGFzc0pET01BZGFwdG9yIHBhID0gKEphdmFDbGFzc0pET01BZGFwdG9yKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihwYXJlbnRKYXZhQ2xhc3MuZUFkYXB0ZXJzKCksIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCQlpZiAocGEgIT0gbnVsbCkKLQkJCQkJcGFyZW50VHlwZSA9IHBhLmdldFNvdXJjZVR5cGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJtVHlwZVNpZ25hdHVyZXMgLSByZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5ncyAoaW4gU2lnbmF0dXJlIGZvcm1hdCkgZm9yIG91ciBwYXJhbWV0ZXIgdHlwZXMgRm9yIHJlZmxlY3Rpb24gcHVycG9zZXMsIHdlIGNhbiBvbmx5IHJlbHkgb24KLQkgKiBvdXIgVVVJRCwgc2luY2Ugb3VyIHBhcm1zIG1heSBub3QgeWV0IGJlIGtub3duLiBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuU291cmNlTWFwcGVyLmNvbnZlcnRUeXBlTmFtZXNUb1NpZ3MoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJtVHlwZVNpZ25hdHVyZXMoKSB7Ci0JCU1ldGhvZCBqYXZhTWV0aG9kVGFyZ2V0ID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCVN0cmluZ1tdIHR5cGVOYW1lcyA9IGdldFR5cGVOYW1lc0Zyb21NZXRob2RJRCgoKFhNSVJlc291cmNlKSBqYXZhTWV0aG9kVGFyZ2V0LmVSZXNvdXJjZSgpKS5nZXRJRChqYXZhTWV0aG9kVGFyZ2V0KSk7Ci0JCWlmICh0eXBlTmFtZXMgPT0gbnVsbCkKLQkJCXJldHVybiBlbXB0eVN0cmluZ0FycmF5OwotCQlpbnQgbiA9IHR5cGVOYW1lcy5sZW5ndGg7Ci0JCWlmIChuID09IDApCi0JCQlyZXR1cm4gZW1wdHlTdHJpbmdBcnJheTsKLQkJU3RyaW5nW10gdHlwZVNpZ3MgPSBuZXcgU3RyaW5nW25dOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJCQl0eXBlU2lnc1tpXSA9IFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKG5ldyBTdHJpbmcodHlwZU5hbWVzW2ldKSwgZ2V0UGFyZW50VHlwZSgpLmlzQmluYXJ5KCkpOwotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdHlwZVNpZ3M7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSZWZsZWN0aW9uU291cmNlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlTWV0aG9kKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlTWV0aG9kICE9IG51bGw7Ci0gICAgfQotCi0JLyoKLQkgKiBVc2VkIGJ5IEphdmEgQ2xhc3MgSkRPTSBhZGFwdGVyIHRvIGNyZWF0ZSBhbmQgc2V0IHdpdGggYSBzb3VyY2UgbWV0aG9kLwotCSAqLwkKLQlwdWJsaWMgdm9pZCBwcmltU2V0TWV0aG9kKElNZXRob2QgbWV0aG9kKSB7Ci0JCXNvdXJjZU1ldGhvZCA9IG1ldGhvZDsKLQl9Ci0JLyoqCi0JICogZ2V0c291cmNlTWV0aG9kIC0gcmV0dXJuIHRoZSBJTWV0aG9kIHdoaWNoIGRlc2NyaWJlcyBvdXIgaW1wbGVtZW50aW5nIG1ldGhvZAotCSAqLwotCXB1YmxpYyBJTWV0aG9kIGdldFNvdXJjZU1ldGhvZCgpIHsKLQkJaWYgKChzb3VyY2VNZXRob2QgPT0gbnVsbCkgfHwgKCFzb3VyY2VNZXRob2QuZXhpc3RzKCkpKSB7Ci0JCQl0cnkgewotCQkJCUlUeXBlIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50VHlwZSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmdbXSBwYXJtTmFtZXMgPSB0aGlzLmdldFBhcm1UeXBlU2lnbmF0dXJlcygpOwotCQkJCQlzb3VyY2VNZXRob2QgPSBKRE9NU2VhcmNoSGVscGVyLnNlYXJjaEZvck1hdGNoaW5nTWV0aG9kKHBhcmVudCwgKChNZXRob2QpIGdldFRhcmdldCgpKS5nZXROYW1lKCksIHBhcm1OYW1lcyk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlTWV0aG9kOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50VHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpIHsKLQkJTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBtZXRob2QuZ2V0SmF2YUNsYXNzKCk7Ci0JCQlpZiAoamF2YUNsYXNzICE9IG51bGwpIHsKLQkJCQlKRE9NQWRhcHRvciBjbGFzc0FkYXB0b3IgPSAoSkRPTUFkYXB0b3IpIHJldHJpZXZlQWRhcHRvckZyb20oamF2YUNsYXNzKTsKLQkJCQlpZiAoY2xhc3NBZGFwdG9yICE9IG51bGwpCi0JCQkJCXJldHVybiBjbGFzc0FkYXB0b3IuZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlSW4gbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewotCQkvLyBBdCB0aGlzIHBvaW50LCB0aGlzIGFkYXB0ZXIgZG9lcyBub3QgZHluYW1pY2FsbHkgY29tcHV0ZSBhbnkgdmFsdWVzLAotCQkvLyBhbGwgdmFsdWVzIGFyZSBwdXNoZWQgYmFjayBpbnRvIHRoZSB0YXJnZXQgb24gdGhlIGluaXRpYWwgY2FsbC4KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotCX0KLQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuIG9uIGVudHJ5OiBVVUlELCBuYW1lLCBjb250YWluaW5nIHBhY2thZ2UgKGFuZCBxdWFsaWZpZWQgbmFtZSksCi0JICogYW5kIGRvY3VtZW50IG11c3QgYmUgc2V0LiBNZXRob2QgYWRhcHRvcjogLSBzZXQgbW9kaWZpZXJzIC0gc2V0IG5hbWUgLSBzZXQgcmV0dXJuIHR5cGUgLSBhZGQgcGFyYW1ldGVycyAtIGFkZCBleGNlcHRpb25zCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQkJc3VwZXIucmVmbGVjdFZhbHVlcygpOwotCQl0cnkgewotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChSRUZMRUNUX01FVEhPRCk7Ci0JCQlpZiAoaXNSZXNvdXJjZUxvYWRlZCgpICYmIGdldFNvdXJjZVByb2plY3QoKSAhPSBudWxsICYmIGdldFNvdXJjZU1ldGhvZCgpICE9IG51bGwgJiYgc291cmNlTWV0aG9kLmV4aXN0cygpKSB7Ci0JCQkJc2V0TW9kaWZpZXJzKCk7Ci0JCQkJc2V0TmFtaW5nKCk7Ci0JCQkJc2V0UmV0dXJuVHlwZSgpOwotCQkJCWFkZFBhcmFtZXRlcnMoKTsKLQkJCQlhZGRFeGNlcHRpb25zKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9NRVRIT0QpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGdlbmVyYXRlZCBmbGFnIGlmIEBnZW5lcmF0ZWQgaXMgZm91bmQgaW4gdGhlIHNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRHZW5lcmF0ZWRGbGFnKCkgewotCQlNZXRob2QgbWV0aG9kVGFyZ2V0ID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlTWV0aG9kKCkuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpIHsKLQkJCQlpbnQgaW5kZXggPSBzb3VyY2UuaW5kZXhPZihNZXRob2QuR0VORVJBVEVEX0NPTU1FTlRfVEFHKTsKLQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQltZXRob2RUYXJnZXQuc2V0SXNHZW5lcmF0ZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX1NldHRpbmdfR2VuRmxhZ19FUlJPUl8iLCBuZXcgT2JqZWN0W10KLQkJCS8vIHsoKFhNSVJlc291cmNlKW1ldGhvZFRhcmdldC5lUmVzb3VyY2UoKSkuZ2V0SUQobWV0aG9kVGFyZ2V0KSwgbnBlLmdldE1lc3NhZ2UoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJlcnJvciBzZXR0aW5nIHRoZSBnZW5lcmF0ZWQgZmxhZyBvbgotCQkJLy8gezB9LCBleGNlcHRpb246IHsxfSIKLQkJfQotCX0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhTWV0aG9kQWRhcHRlciNyZWZsZWN0R2VuZXJhdGVkSWZOZWNlc3NhcnkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RHZW5lcmF0ZWRJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpKSB7Ci0JCQlzZXRHZW5lcmF0ZWRGbGFnKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RQYXJhbU5hbWVzSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChyZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKSkgewotCQkJU3RyaW5nIFtdIHBhcmFtTmFtZXMgPSBnZXRQYXJhbWV0ZXJOYW1lcygpOwotCQkJTGlzdCBwYXJhbSA9ICgoTWV0aG9kSW1wbClnZXRUYXJnZXQoKSkuZ2V0UGFyYW1ldGVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChKYXZhUGFyYW1ldGVyKXBhcmFtLmdldChpKSkuc2V0TmFtZShwYXJhbU5hbWVzW2ldKTsJCQkJCi0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIHNldE1vZGlmaWVycyAtIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlcyByZWxhdGVkIHRvIG1vZGlmaWVycyBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKCkgewotCQlNZXRob2QgbWV0aG9kVGFyZ2V0ID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCXRyeSB7Ci0JCQltZXRob2RUYXJnZXQuc2V0RmluYWwoRmxhZ3MuaXNGaW5hbChnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSk7Ci0JCQltZXRob2RUYXJnZXQuc2V0TmF0aXZlKEZsYWdzLmlzTmF0aXZlKGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKTsKLQkJCW1ldGhvZFRhcmdldC5zZXRTdGF0aWMoRmxhZ3MuaXNTdGF0aWMoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpOwotCQkJbWV0aG9kVGFyZ2V0LnNldFN5bmNocm9uaXplZChGbGFncy5pc1N5bmNocm9uaXplZChnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSk7Ci0JCQltZXRob2RUYXJnZXQuc2V0Q29uc3RydWN0b3IoZ2V0U291cmNlTWV0aG9kKCkuaXNDb25zdHJ1Y3RvcigpKTsKLQotCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJCS8vU2V0IGFic3RyYWN0Ci0JCQlpZiAoamF2YUNsYXNzLmdldEtpbmQoKS5nZXRWYWx1ZSgpID09IFR5cGVLaW5kLklOVEVSRkFDRSkKLQkJCQltZXRob2RUYXJnZXQuc2V0QWJzdHJhY3QodHJ1ZSk7Ci0JCQllbHNlCi0JCQkJbWV0aG9kVGFyZ2V0LnNldEFic3RyYWN0KEZsYWdzLmlzQWJzdHJhY3QoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpOwotCQkJLy8gU2V0IHZpc2liaWxpdHkKLQkJCWlmIChqYXZhQ2xhc3MuZ2V0S2luZCgpLmdldFZhbHVlKCkgPT0gVHlwZUtpbmQuSU5URVJGQUNFIHx8IEZsYWdzLmlzUHVibGljKGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKQotCQkJCW1ldGhvZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQkJZWxzZSBpZiAoRmxhZ3MuaXNQcml2YXRlKGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKQotCQkJCW1ldGhvZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFJJVkFURV9MSVRFUkFMKTsKLQkJCWVsc2UgaWYgKEZsYWdzLmlzUHJvdGVjdGVkKGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKQotCQkJCW1ldGhvZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFJPVEVDVEVEX0xJVEVSQUwpOwotCQkJZWxzZQotCQkJCS8vVmlzaWJpbGl0eSBtdXN0IGJlIHBhY2thZ2UKLQkJCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBBQ0tBR0VfTElURVJBTCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oUmVzb3VyY2VIYW5kbGVyCi0JCQkJCQkJLmdldFN0cmluZygKLQkJCQkJCQkJCSJFcnJvcl9JbnRyb3NwZWN0aW5nX0ZsYWdzX0VSUk9SXyIsIChuZXcgT2JqZWN0W10geyAoKFhNSVJlc291cmNlKSBtZXRob2RUYXJnZXQuZVJlc291cmNlKCkpLmdldElEKG1ldGhvZFRhcmdldCksIG5wZS5nZXRNZXNzYWdlKCl9KSkpOyAvLyROT04tTkxTLTEkID0gImVycm9yIGludHJvc3BlY3RpbmcgZmxhZ3Mgb24gezB9LCBleGNlcHRpb246IHsxfSIKLQkJfQotCX0KLQotCS8qKgotCSAqIHNldE5hbWluZyAtIHNldCB0aGUgbmFtaW5nIHZhbHVlcyBoZXJlIC0gcXVhbGlmaWVkIG5hbWUgbXVzdCBiZSBzZXQgZmlyc3QsIHRoYXQgaXMgdGhlIHBhdGggdG8gdGhlIHJlYWwgSmF2YSBjbGFzcyAtIElEIC0gbmFtZS1iYXNlZCBVVUlECi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtaW5nKCkgewotCQkvLwotCQkvLwluYW1pbmcgaXMgY3VycmVudGx5IGEgbm8tb3Agc2luY2UgdGhlIG5hbWUgYW5kIFVVSUQgbXVzdCBiZSBzZXQgcHJpb3IgdG8gcmVmbGVjdGlvbgotCQkvLwkuLi5hbmQgSUQgaXMgcmVkdW5kYW50IHdpdGggVVVJRC4KLQkJLy8JamF2YUZpZWxkVGFyZ2V0LnNldElEKHBhcmVudC5nZXRRdWFsaWZpZWROYW1lKCkgKyAiXyIgKyBqYXZhRmllbGRUYXJnZXQuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUeXBlIC0gc2V0IG91ciByZXR1cm4gdHlwZSBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmV0dXJuVHlwZSgpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXR5cGVOYW1lID0gdHlwZU5hbWVGcm9tU2lnbmF0dXJlKGdldFNvdXJjZU1ldGhvZCgpLmdldFJldHVyblR5cGUoKSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCS8vIG5hbWUgc3RheXMgbnVsbCBhbmQgd2UgY2Fycnkgb24KLQkJfQotCQlpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCQkJTWV0aG9kIGphdmFNZXRob2RUYXJnZXQgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJCWphdmFNZXRob2RUYXJnZXQuc2V0RVR5cGUoY3JlYXRlSmF2YUNsYXNzUmVmKHR5cGVOYW1lKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMC8zLzIwMDEgMTA6MDg6MzQgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld1NvdXJjZU1ldGhvZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZU1ldGhvZChvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kIG5ld1NvdXJjZU1ldGhvZCkgewotCQlzb3VyY2VNZXRob2QgPSBuZXdTb3VyY2VNZXRob2Q7Ci0JfQotCQotCS8qCi0JICogT3ZlcnJpZGUgdG8gdG9sZXJhdGUgSkRLIDUgdmFyaWFibGUgdHlwZXMuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KRE9NQWRhcHRvciN0eXBlTmFtZUZyb21TaWduYXR1cmUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVOYW1lRnJvbVNpZ25hdHVyZShTdHJpbmcgdHlwZVNpZ25hdHVyZSkgewotCQlTdHJpbmcgZXJhc3VyZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllcmFzdXJlID0gU2lnbmF0dXJlLmdldFR5cGVFcmFzdXJlKHR5cGVTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy9UaGUgc2lnbmF0dXJlIGlzIG5vdCB0aGUgY29ycmVjdCBmb3JtYXQgZm9yIGEgdmFyaWFibGUuCi0JCX0KLQkJaWYgKGVyYXN1cmUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhcmlhYmxlTmFtZSA9IG51bGw7Ci0JCQlTdHJpbmcgcmVzb2x2ZWRWYXJpYWJsZSA9IG51bGw7Ci0JCQkKLQkJCWludCBhcnJheUNvdW50ID0gU2lnbmF0dXJlLmdldEFycmF5Q291bnQoZXJhc3VyZSk7Ci0JCQlpZiAoYXJyYXlDb3VudCA+IDApIHsKLQkJCQkvL1dlIGhhdmUgYW4gYXJyYXkuICBDaGVjayBpZiB0aGUgZWxlbWVudCB0eXBlIGlzIGEgdmFyaWFibGUuCi0JCQkJU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSA9IFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZShlcmFzdXJlKTsKLQkJCQl2YXJpYWJsZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoZWxlbWVudFR5cGVOYW1lKTsKLQkJCQlyZXNvbHZlZFZhcmlhYmxlID0gcmVzb2x2ZVZhcmlhYmxlTmFtZShlcmFzdXJlLCB2YXJpYWJsZU5hbWUpOwotCQkJCWlmIChyZXNvbHZlZFZhcmlhYmxlICE9IG51bGwpIHsKLQkJCQkJLy9BZGQgYXJyYXkgaW5mby4KLQkJCQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKHJlc29sdmVkVmFyaWFibGUpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Q291bnQ7IGkrKykgewotCQkJCQkJYi5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXNvbHZlZFZhcmlhYmxlID0gYi50b1N0cmluZygpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdmFyaWFibGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKGVyYXN1cmUpOwotCQkJCS8vTmVlZCB0byByZXNvbHZlIHRoZSB2YXJpYWJsZS4KLQkJCQlyZXNvbHZlZFZhcmlhYmxlID0gcmVzb2x2ZVZhcmlhYmxlTmFtZShlcmFzdXJlLCB2YXJpYWJsZU5hbWUpOwotCQkJfQotCQkJaWYgKHJlc29sdmVkVmFyaWFibGUgPT0gbnVsbCkgewotCQkJCXJldHVybiBzdXBlci50eXBlTmFtZUZyb21TaWduYXR1cmUoZXJhc3VyZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiByZXNvbHZlZFZhcmlhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci50eXBlTmFtZUZyb21TaWduYXR1cmUodHlwZVNpZ25hdHVyZSk7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyByZXNvbHZlVmFyaWFibGVOYW1lKFN0cmluZyBlcmFzdXJlLCBTdHJpbmcgdmFyaWFibGVOYW1lKSB7Ci0JCUlNZXRob2QgbWV0aG9kID0gZ2V0U291cmNlTWV0aG9kKCk7Ci0JCUlUeXBlUGFyYW1ldGVyW10gdHlwZVBhcmFtZXRlcnMgPSBudWxsOwotCQl0cnkgewotCQkJdHlwZVBhcmFtZXRlcnMgPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcnMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUxKSB7Ci0JCQkvL0ZhaWxlZCB0byByZXRyaWV2ZSB0eXBlIHBhcmFtZXRlcnMgZm9yIGFueSBudW1iZXIgb2YgcmVhc29ucy4KLQkJfQotCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW0gPSBudWxsOwotCQlpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCAmJiB0eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHR5cGVQYXJhbWV0ZXJzW2ldLmV4aXN0cygpICYmIHZhcmlhYmxlTmFtZS5lcXVhbHModHlwZVBhcmFtZXRlcnNbaV0uZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCQkJdHlwZVBhcmFtID0gdHlwZVBhcmFtZXRlcnNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0eXBlUGFyYW0gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIGJvdW5kcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJYm91bmRzID0gdHlwZVBhcmFtLmdldEJvdW5kcygpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7fQotCQkJCWlmIChib3VuZHMgIT0gbnVsbCAmJiBib3VuZHMubGVuZ3RoID4gMCkgewotCQkJCQlyZXR1cm4gSkRPTVNlYXJjaEhlbHBlci5nZXRSZXNvbHZlZFR5cGVOYW1lKGJvdW5kc1swXSwgZ2V0VHlwZSgpLCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiAiamF2YS5sYW5nLk9iamVjdCI7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSUphdmFFbGVtZW50IHBhcmVudCA9IG1ldGhvZC5nZXRQYXJlbnQoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElUeXBlKQotCQl7Ci0JCQl0cnkgewotCQkJCXR5cGVQYXJhbWV0ZXJzID0gKChJVHlwZSlwYXJlbnQpLmdldFR5cGVQYXJhbWV0ZXJzKCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZTEpIHsKLQkJCQkvL0ZhaWxlZCB0byByZXRyaWV2ZSB0eXBlIHBhcmFtZXRlcnMgZm9yIGFueSBudW1iZXIgb2YgcmVhc29ucy4KLQkJCX0KLQkJfQotCQlpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCAmJiB0eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHR5cGVQYXJhbWV0ZXJzW2ldLmV4aXN0cygpICYmIHZhcmlhYmxlTmFtZS5lcXVhbHModHlwZVBhcmFtZXRlcnNbaV0uZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCQkJdHlwZVBhcmFtID0gdHlwZVBhcmFtZXRlcnNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0eXBlUGFyYW0gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIGJvdW5kcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJYm91bmRzID0gdHlwZVBhcmFtLmdldEJvdW5kcygpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7fQotCQkJCWlmIChib3VuZHMgIT0gbnVsbCAmJiBib3VuZHMubGVuZ3RoID4gMCkgewotCQkJCQlyZXR1cm4gSkRPTVNlYXJjaEhlbHBlci5nZXRSZXNvbHZlZFR5cGVOYW1lKGJvdW5kc1swXSwgZ2V0VHlwZSgpLCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiAiamF2YS5sYW5nLk9iamVjdCI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1vZGVsTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1vZGVsTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1MDhjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFNb2RlbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMC8zMS8yMDAwIDE6MTM6MTIgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KYXZhTW9kZWxMaXN0ZW5lcn0gaW5zdGVhZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFNb2RlbExpc3RlbmVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkphdmFNb2RlbExpc3RlbmVyIHsKLQotCS8qKgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBKYXZhTW9kZWxMaXN0ZW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnRzVG9MaXN0ZW4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgSmF2YU1vZGVsTGlzdGVuZXIoaW50IGV2ZW50c1RvTGlzdGVuKSB7Ci0JCXN1cGVyKGV2ZW50c1RvTGlzdGVuKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFSZWZsZWN0aW9uU3luY2hyb25pemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFSZWZsZWN0aW9uU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YWQ1YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhUmVmbGVjdGlvblN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmF2YU1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8xLzIwMDAgMTE6NDI6MDUgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplciBleHRlbmRzIEphdmFNb2RlbExpc3RlbmVyIHsKLQkKLQlwcm90ZWN0ZWQgSmF2YUpET01BZGFwdGVyRmFjdG9yeSBmQWRhcHRlckZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaGVkQWxsID0gZmFsc2U7Ci0JcHJvdGVjdGVkIExpc3QgZmx1c2hUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTGlzdCBmbHVzaFR5cGVQbHVzSW5uZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIExpc3Qgbm90aWZpY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvKioKLQkgKiBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplcihKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IHN5bmNocm9uaXplZSkgewotCQlzdXBlcigpOwotCQlmQWRhcHRlckZhY3RvcnkgPSBzeW5jaHJvbml6ZWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFNb2RlbExpc3RlbmVyI2dldEphdmFQcm9qZWN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRKYXZhUHJvamVjdCgpOwotCX0JCi0JLyoqCi0JICogVGVsbCB0aGUgcmVmbGVjdGlvbiBmYWN0b3J5IHRvIGZsdXNoIHRoZSBwYXNzZWQgSVR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgTm90aWZpY2F0aW9uIGRvRmx1c2goSVR5cGUgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlckZhY3RvcnkoKS5mbHVzaFJlZmxlY3Rpb25Ob05vdGlmaWNhdGlvbihlbGVtZW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JLyoKLQkgKiBGbHVzaCB0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQgYW55IGlubmVyIGNsYXNzZXMgc2luY2Ugd2UgZG9uJ3QgaWYgdGhleSBtYXkgb3IgbWF5IG5vdCBvZiBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCBOb3RpZmljYXRpb24gZG9GbHVzaChJQ29tcGlsYXRpb25Vbml0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXJGYWN0b3J5KCkuZmx1c2hSZWZsZWN0aW9uUGx1c0lubmVyTm9Ob3RpZmljYXRpb24oZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChlbGVtZW50KSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZsdXNoKElUeXBlIGVsZW1lbnQpIHsKLQkJaWYgKCFmbHVzaFR5cGVzLmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJZmx1c2hUeXBlcy5hZGQoZWxlbWVudCk7Ci0JfQotCS8qCi0JICogZmx1c2ggdGhlIGNvbXBpbGF0aW9uIHVuaXQuIFNpbmNlIHdlIGRvbid0IGtub3cgaWYgaW5uZXIgY2xhc3NlcyBtYXkgYWxzbwotCSAqIG9mIGJlZW4gYWZmZWN0ZWQsIHRoZXkgdG8gd2lsbCBiZSBmbHVzaGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZsdXNoKElDb21waWxhdGlvblVuaXQgZWxlbWVudCkgewotCQlpZiAoIWZsdXNoVHlwZVBsdXNJbm5lci5jb250YWlucyhlbGVtZW50KSkKLQkJCWZsdXNoVHlwZVBsdXNJbm5lci5hZGQoZWxlbWVudCk7CQkKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZmx1c2hQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBub0ZsdXNoSWZTb3VyY2VGb3VuZCkgewotCQlub3RpZmljYXRpb25zLmFkZEFsbChnZXRBZGFwdGVyRmFjdG9yeSgpLmZsdXNoUGFja2FnZU5vTm90aWZpY2F0aW9uKHBhY2thZ2VOYW1lLCBub0ZsdXNoSWZTb3VyY2VGb3VuZCkpOwotCX0KLQlwcm90ZWN0ZWQgSmF2YUpET01BZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZBZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJQ29tcGlsYXRpb25Vbml0IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQgOiB7Ci0JCQkJLy8gQSBmaWxlIHNhdmUgaGFkIG9jY3VycmVkLiBJdCBkb2Vzbid0IG1hdHRlciBpZiBjdXJyZW50bHkgd29ya2luZyBjb3B5IG9yIG5vdC4KLQkJCQkvLyBJdCBtZWFucyBzb21ldGhpbmcgaGFzIGNoYW5nZWQgdG8gdGhlIGZpbGUgb24gZGlzaywgYnV0IGRvbid0IGtub3cgd2hhdC4KLQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1BSSU1BUllfUkVTT1VSQ0UpICE9IDApIHsKLQkJCQkJZmx1c2goZWxlbWVudCk7CS8vIEZsdXNoIGV2ZXJ5dGhpbmcsIGluY2x1ZGluZyBpbm5lciBjbGFzc2VzLgkJCQkJCi0JCQkJfSBlbHNlIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ09OVEVOVCkgPT0gMCAmJiAKLQkJCQkJCShkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DSElMRFJFTikgIT0gMCkgIC8vQSB0eXBlIG1heSBoYXZlIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC4KLQkJCQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCA6Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkFEREVEIDoKLQkJCQlpZiAoIWVsZW1lbnQuaXNXb3JraW5nQ29weSgpKQotCQkJCQlkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChlbGVtZW50KSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJSmF2YVByb2plY3QgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGlzSW5DbGFzc3BhdGgoZWxlbWVudCkpIHsKLQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCB8fCAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMT1NFRCkgIT0gMCkpIHsKLQkJCQlpZiAoZWxlbWVudC5lcXVhbHMoZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRKYXZhUHJvamVjdCgpKSkKLQkJCQkJc3RvcFN5bmNocm9uaXplcigpOwotCQkJCWVsc2UKLQkJCQkJZmx1c2hBbGwoKTsgLy9hbm90aGVyIGRlcGVuZGVudCBwcm9qZWN0IGhhcyBjaGFuZ2VkIHNvIGZsdXNoIGFsbCB0byBiZSBzYWZlCi0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQgfHwgaXNDbGFzc3BhdGhSZXNvdXJjZUNoYW5nZShkZWx0YSkpIHsKLQkJCQlmbHVzaEFsbCgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUNsYXNzRmlsZSBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJaWYgKGtpbmQgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCB8fCBraW5kID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKSB7Ci0JCQkvLyBJdCBkb2Vzbid0IG1hdHRlciBpZiB0b3RhbGx5IHJlbW92ZWQgb3IganVzdCBtb3ZlZCBzb21ld2hlcmUgZWxzZSwgd2Ugd2lsbCBjbGVhciBvdXQgYW5kIHJlbW92ZSB0aGUKLQkJCS8vIGFkYXB0ZXIgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhIHJlbmFtZSB3aGljaCB3b3VsZCBiZSBhIGRpZmZlcmVudCBjbGFzcy4KLQkJCS8vIEN1cnJlbnRseSB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGRlbGV0ZWQgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBmaW5kIHRoZSB0eXBlcyBpbiB0aGUgdW5pdCB0byByZW1vdmUuCi0JCQkvLyBTbyBpbnN0ZWFkIHdlIGFzayBmYWN0b3J5IHRvIHJlbW92ZSBhbGwgaXQgYW55IHRoYXQgc3RhcnQgd2l0aCBpdCBwbHVzIGZvciBpbm5lciBjbGFzc2VzLgotCQkJZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoZWxlbWVudCkpOwotCQkJcmV0dXJuOyAvLyBTaW5jZSB0aGUgY2xhc3NmaWxlIHdhcyByZW1vdmVkIHdlIGRvbid0IG5lZWQgdG8gcHJvY2VzcyB0aGUgY2hpbGRyZW4gKGFjdHVhbGx5IHRoZSBjaGlsZHJlbiBsaXN0IHdpbGwgYmUgZW1wdHkKLQkJfQotCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7Ci0JCQlwcm9jZXNzRGVsdGEoY2hpbGRyZW5baWldKTsKLQkJfQotCX0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnRSb290IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChmbHVzaGVkQWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDbGFzc1BhdGhDaGFuZ2UoZGVsdGEpKQotCQkJZmx1c2hBbGwoKTsKLQkJZWxzZQotCQkJc3VwZXIucHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChlbGVtZW50LCBkZWx0YSk7Ci0JfQotCQotCS8qIAotCSAqIFdlIHdpbGwgZm9yY2UgdGhlIGZsdXNoaW5nIG9mIGFsbCBhZGFwdG9ycyBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZS4KLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBpZiBhIHR5cGUgd2FzIHJlZmxlY3RlZCBwcmlvciB0byB0aGUgcGFja2FnZSBleGlzdGluZyBvcgotCSAqIGlmIHRoZSBwYWNrYWdlIGlzIGRlbGV0ZWQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhTW9kZWxMaXN0ZW5lciNwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCA6IAotCQkJCS8vIEV2ZW4gdGhvdWdoIGFkZGVkIHRoZXJlIGlzIHBvc3NpYmlsaXR5IHRoYXQgcGFja2FnZSBleGlzdHMgaW4gb3RoZXIgcm9vdCBidXQgdGhpcwotCQkJCS8vIG9uZSBtYXkgbm93IHRha2UgcHJpb3JpdHksIHNvIHdlIHdpbGwgY2xlYXIgdGhlIHBhY2thZ2UgYW55d2F5LgotCQkJCWZsdXNoUGFja2FnZShkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSwgZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIDoKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLmZsdXNoUGFja2FnZShkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSwgZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJc3VwZXIucHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChlbGVtZW50LCBkZWx0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElUeXBlIGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotCQlpZiAoa2luZCA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIHx8IGtpbmQgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpIHsKLQkJCWRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihlbGVtZW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWZsdXNoKGVsZW1lbnQpOwotCQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQkJCS8vIE5vdGUsIGlmIGEgbWV0aG9kIGVsZW1lbnQgb3IgYSBmaWVsZCB3YXMgY2hhbmdlZCwgdGhlcmUgbWF5IGJlIGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKQotCQkJLy8gICAgICAgdGhhdCB3aWxsIGhhdmUgdG8gYmUgcHJvY2Vzc2VkIGlmIHdlIGFyZSB0byB1cGRhdGUgdGhlIEphdmFNZXRob2QvSmF2YUZpZWxkIEpET01BZGFwdG9yIHMuCQotCQl9Ci0JfQotCS8qKgotCSAqIEdpdmVuIHRoYXQgYW4gSVR5cGUgZG9lcyBub3QgZXhpc3RzIGFueW1vcmUsIGFzc3VtZQotCSAqIHRoYXQgdGhlIHR5cGUncyBuYW1lIGlzIHBhY2thZ2UuZmlsZW5hbWUgKHdpdGhvdXQgdGhlIC5qYXZhKQotCSAqIElmIHdlIGFyZSB3cm9uZyAoaWYsIHRoZW4gYSByYXJlIGNhc2UpLCAgd2Ugd2lsbCBmbHVzaC4KLQkgKiBOZXh0IGFjY2VzcyB3aWxsIGluZHVjZSBhIHJlZmxlY3Rpb24gYXR0ZW1wdC4KLQkgKiBAZGVwcmVjYXRlZCBUaGlzIGRvZXNuJ3QgbG9vayBsaWtlIGl0IGlzIGV2ZXIgY2FsbGVkLiBJdCBzb21lb25lIGVsc2UgY2FsbHMgaXQsIHBsZWFzZSBjb250YWN0IGRldmVsb3BtZW50IHRvIHNlZSBpZiByaWdodCBtZXRob2QgdG8gYmUgY2FsbGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NSZW1vdmVPckFkZChJQ29tcGlsYXRpb25Vbml0IGVsZW1lbnQpIHsKLQkJZGlzQXNzb2NpYXRlU291cmNlKGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoZWxlbWVudCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlJVHlwZSBwcmltYXJ5ID0gY3UuZmluZFByaW1hcnlUeXBlKCk7Ci0JCWlmIChwcmltYXJ5ICE9IG51bGwpCi0JCQlyZXR1cm4gcHJpbWFyeS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBjdS5nZXRFbGVtZW50TmFtZSgpOwotCQkJLy8gSnVzdCBzdHJpcCBvZmYgZXh0ZW5zaW9uLiBUaGVyZSBpcyBhY3R1YWxseSBhIG1vcmUgY29tcGxpY2F0ZWQgdGVzdCBmb3IgImphdmEgbGlrZSBleHRlbnN0aW9ucyIgYnV0IEpEVCBoYXMgdGhhdCBoaWRkZW5cCi0JCQkvLyBzbyB3ZSB3aWxsIGp1c3QgZ3Vlc3MgYW5kIHRha2Ugb2ZmIHRoZSBleHRlbnNpb24uCi0JCQlpbnQgaWR4ID0gZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChpZHggIT0gLTEpCi0JCQkJZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgaWR4KTsKLQkJCXJldHVybiAoKElQYWNrYWdlRnJhZ21lbnQpIGN1LmdldFBhcmVudCgpKS5nZXRFbGVtZW50TmFtZSgpKycuJytmaWxlbmFtZTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoSUNsYXNzRmlsZSBjZikgewotCQkKLQkJcmV0dXJuIGNmLmdldFR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpIDw9IDUgfHwgIW5hbWUuc3Vic3RyaW5nKG5hbWUubGVuZ3RoKCkgLSA1KS5lcXVhbHMoIi5qYXZhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gU2hvdWxkIG5vdCBiZSBoZXJlLCAKLQkJCUxvZ2dlciBsb2dnZXIgPSBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpCi0JCQkJbG9nZ2VyLmxvZygiSW52YWxpZCAuamF2YSBmaWxlOiAiICsgbmFtZSwgTGV2ZWwuRklORSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIE1ha2UgYSBndWVzcywgYXQgd29yc3QgY2FzZSwgbm90aGluZyB3aWxsIGNvbWUgb3V0IG9mIHRoaXMuCi0JCQlpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmRleCA+PSAwKQotCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCkgKyAiLmphdmEiOyAvLyByZW5hbWUgdGhlIGV4dGVuc2lvbiB0byAuamF2YSAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJbmFtZSA9IG5hbWUgKyAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKSA9PSBudWxsIHx8IGVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSA1KTsKLQkJZWxzZQotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKSArICIuIiArIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSA1KTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBTdG9wIHRoZSBzeW5jaHJvbml6ZXIgZnJvbSBsaXN0ZW5pbmcgdG8gYW55IG1vcmUgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wU3luY2hyb25pemVyKCkgewotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFNb2RlbExpc3RlbmVyI2VsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQl0cnkgewotCQkJZmx1c2hUeXBlcy5jbGVhcigpOwotCQkJZmx1c2hUeXBlUGx1c0lubmVyLmNsZWFyKCk7Ci0JCQlub3RpZmljYXRpb25zLmNsZWFyKCk7Ci0JCQlzdXBlci5lbGVtZW50Q2hhbmdlZChldmVudCk7Ci0JCQlmbHVzaFR5cGVzKCk7Ci0JCQlwcm9jZXNzTm90aWZpY2F0aW9ucygpOwotCQl9IGZpbmFsbHkgewotCQkJZmx1c2hlZEFsbCA9IGZhbHNlOwotCQkJZmx1c2hUeXBlcy5jbGVhcigpOwotCQkJZmx1c2hUeXBlUGx1c0lubmVyLmNsZWFyKCk7Ci0JCQlub3RpZmljYXRpb25zLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZsdXNoVHlwZXMoKSB7Ci0JCWlmICghZmx1c2hUeXBlcy5pc0VtcHR5KCkpIHsKLQkJCUlUeXBlIHR5cGUgPSBudWxsOwotCQkJTm90aWZpY2F0aW9uIG5vdDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmx1c2hUeXBlcy5zaXplKCk7IGkrKykgewotCQkJCXR5cGUgPSAoSVR5cGUpIGZsdXNoVHlwZXMuZ2V0KGkpOwotCQkJCW5vdCA9IGRvRmx1c2godHlwZSk7Ci0JCQkJaWYgKG5vdCAhPSBudWxsKQotCQkJCQlub3RpZmljYXRpb25zLmFkZChub3QpOwotCQkJfQotCQl9Ci0JCWlmICghZmx1c2hUeXBlUGx1c0lubmVyLmlzRW1wdHkoKSkgewotCQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gbnVsbDsKLQkJCU5vdGlmaWNhdGlvbiBub3Q7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZsdXNoVHlwZVBsdXNJbm5lci5zaXplKCk7IGkrKykgewotCQkJCXVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZmx1c2hUeXBlUGx1c0lubmVyLmdldChpKTsKLQkJCQlub3QgPSBkb0ZsdXNoKHVuaXQpOwotCQkJCWlmIChub3QgIT0gbnVsbCkKLQkJCQkJbm90aWZpY2F0aW9ucy5hZGQobm90KTsKLQkJCX0KLQkJfQkJCi0JfQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmljYXRpb25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NOb3RpZmljYXRpb25zKCkgewotCQlOb3RpZmllciBub3RpZmllcjsKLQkJTm90aWZpY2F0aW9uIG5vdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3RpZmljYXRpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlub3QgPSAoTm90aWZpY2F0aW9uKSBub3RpZmljYXRpb25zLmdldChpKTsKLQkJCW5vdGlmaWVyID0gKE5vdGlmaWVyKSBub3QuZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmllciAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCW5vdGlmaWVyLmVOb3RpZnkobm90KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2coZSk7IC8vY2F0Y2ggZXhjZXB0aW9ucyBzbyBhbGwgbm90aWZpY2F0aW9ucyBhcmUgcHJvY2Vzc2VkCi0JCQkJfSAKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNBc3NvY2lhdGVTb3VyY2UoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJTm90aWZpY2F0aW9uIG5vdCA9IGdldEFkYXB0ZXJGYWN0b3J5KCkuZGlzQXNzb2NpYXRlU291cmNlKHF1YWxpZmllZE5hbWUsIGZhbHNlKTsKLQkJaWYgKG5vdCAhPSBudWxsKQotCQkJbm90aWZpY2F0aW9ucy5hZGQobm90KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCU5vdGlmaWNhdGlvbiBub3QgPSBnZXRBZGFwdGVyRmFjdG9yeSgpLmRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihxdWFsaWZpZWROYW1lLCBmYWxzZSk7Ci0JCWlmIChub3QgIT0gbnVsbCkKLQkJCW5vdGlmaWNhdGlvbnMuYWRkKG5vdCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGZsdXNoQWxsKCkgewotCQlub3RpZmljYXRpb25zLmFkZEFsbChnZXRBZGFwdGVyRmFjdG9yeSgpLmZsdXNoQWxsTm9Ob3RpZmljYXRpb24oKSk7Ci0JCWZsdXNoZWRBbGwgPSB0cnVlOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFNb2RlbExpc3RlbmVyI3Byb2Nlc3NDaGlsZHJlbihJSmF2YUVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDaGlsZHJlbihJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKCFmbHVzaGVkQWxsKQotCQkJc3VwZXIucHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhTW9kZWxMaXN0ZW5lciNwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEpCi0JICovCi0JcHVibGljIHZvaWQgcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmICghZmx1c2hlZEFsbCkKLQkJCXN1cGVyLnByb2Nlc3NEZWx0YShkZWx0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0lKYXZhUHJvamVjdEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9JSmF2YVByb2plY3RJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTMxMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0lKYXZhUHJvamVjdEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDA1LzA3LzAxIDEwOjA2OjI4IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhUHJvamVjdEluZm8gewotcHVibGljIFN0cmluZyBnZXRTb3VyY2VQYXRoKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YUVNRk5hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0phdmFFTUZOYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2YmM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YUVNRk5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbjsKLS8qCi0gKiAkUkNTZmlsZTogSmF2YUVNRk5hdHVyZS5qYXZhLHYgJCAkUmV2aXNpb246IDEuMTcgJCAkRGF0ZTogMjAwNi8wOS8xNCAxODozMTowOCAkCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5KYXZhWE1JRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSUphdmFFTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRU1GTmF0dXJlIGV4dGVuZHMgRU1GTmF0dXJlIGltcGxlbWVudHMgSUphdmFFTUZOYXR1cmUgewotLyoqCi0gKiBKYXZhTU9GTmF0dXJlUnVudGltZSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSmF2YUVNRk5hdHVyZSgpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBHZXQgYSBJSmF2YU1PRk5hdHVyZVJ1bnRpbWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3VwcGxpZWQgcHJvamVjdC4KLSAqIEByZXR1cm4gSUphdmFNT0ZOYXR1cmVSdW50aW1lCi0gKiBAcGFyYW0gcHJvamVjdCBjb20uaWJtLml0cC5jb3JlLmFwaS5yZXNvdXJjZXMuSVByb2plY3QKLSAqLwotcHVibGljIHN0YXRpYyBKYXZhRU1GTmF0dXJlIGNyZWF0ZVJ1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWlmKCFoYXNSdW50aW1lKHByb2plY3QpKQotCQlpZiAoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpLmV4aXN0cygpKQotCQkJYWRkTmF0dXJlVG9Qcm9qZWN0KHByb2plY3QsIElKYXZhRU1GTmF0dXJlLk5BVFVSRV9JRCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCi0JcmV0dXJuIGdldFJ1bnRpbWUocHJvamVjdCk7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBuYXR1cmUncyBJRC4KLSAqLwotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmF0dXJlSUQoKSB7Ci0JcmV0dXJuIElKYXZhRU1GTmF0dXJlLk5BVFVSRV9JRDsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBJRCBvZiB0aGUgcGx1Z2luIHRoYXQgdGhpcyBuYXR1cmUgaXMgY29udGFpbmVkIHdpdGhpbi4KLSAqLwotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JcmV0dXJuIEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotfQotLyoqCi0gKiBHZXQgYSBJSmF2YU1PRk5hdHVyZVJ1bnRpbWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3VwcGxpZWQgcHJvamVjdC4KLSAqIEZpcnN0IGNoZWNrIGZvciByZWdpc3RlcmVkIG5hdHVyZXMuCi0gKiBAcmV0dXJuIElKYXZhTU9GTmF0dXJlUnVudGltZQotICogQHBhcmFtIHByb2plY3QgY29tLmlibS5pdHAuY29yZS5hcGkucmVzb3VyY2VzLklQcm9qZWN0Ci0gKi8KLXB1YmxpYyBzdGF0aWMgSmF2YUVNRk5hdHVyZSBnZXRSdW50aW1lKElQcm9qZWN0IHByb2plY3QpIHsKLQlKYXZhRU1GTmF0dXJlIG5hdHVyZSA9IG51bGw7Ci0JTGlzdCBydW50aW1lcyA9IEVNRk5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZXMocHJvamVjdCk7Ci0JZm9yIChpbnQgaT0wOyBpPHJ1bnRpbWVzLnNpemUoKTsgaSsrKSB7Ci0JCWlmIChydW50aW1lcy5nZXQoaSkgaW5zdGFuY2VvZiBKYXZhRU1GTmF0dXJlKQotCQkJbmF0dXJlID0gKEphdmFFTUZOYXR1cmUpIHJ1bnRpbWVzLmdldChpKTsKLQl9Ci0JaWYgKG5hdHVyZSA9PSBudWxsKQotCQluYXR1cmUgPSBwcmltR2V0UnVudGltZShwcm9qZWN0KTsKLQlyZXR1cm4gbmF0dXJlOwotfQotLyoqCi0gKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHByb2plY3QgaGFzIGEgcnVudGltZSBjcmVhdGVkIG9uIGl0LgotICogQ2hlY2sgZm9yIHJlZ2lzdGVyZWQgbmF0dXJlcyBmaXJzdC4KLSAqIEByZXR1cm4gYm9vbGVhbgotICogQHBhcmFtIHByb2plY3QgY29tLmlibS5pdHAuY29yZS5hcGkucmVzb3VyY2VzLklQcm9qZWN0Ci0gKi8KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSdW50aW1lKElQcm9qZWN0IHByb2plY3QpIHsKLQlKYXZhRU1GTmF0dXJlIG5hdHVyZSA9IG51bGw7Ci0JTGlzdCBydW50aW1lcyA9IEVNRk5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZXMocHJvamVjdCk7Ci0JZm9yIChpbnQgaT0wOyBpPHJ1bnRpbWVzLnNpemUoKTsgaSsrKSB7Ci0JCWlmIChydW50aW1lcy5nZXQoaSkgaW5zdGFuY2VvZiBKYXZhRU1GTmF0dXJlKQotCQkJbmF0dXJlID0gKEphdmFFTUZOYXR1cmUpIHJ1bnRpbWVzLmdldChpKTsKLQl9Ci0JaWYgKG5hdHVyZSA9PSBudWxsKQotCQlyZXR1cm4gcHJpbUhhc1J1bnRpbWUocHJvamVjdCk7Ci0JZWxzZQotCQlyZXR1cm4gdHJ1ZTsKLQotfQotLyoqCi0gKiBHZXQgYSBJSmF2YU1PRk5hdHVyZVJ1bnRpbWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3VwcGxpZWQgcHJvamVjdC4KLSAqIERvIG5vdCBjaGVjayBmb3Igb3RoZXIgcmVnaXN0ZXJlZCB0eXBlcy4KLSAqIEByZXR1cm4gSUphdmFNT0ZOYXR1cmVSdW50aW1lCi0gKiBAcGFyYW0gcHJvamVjdCBjb20uaWJtLml0cC5jb3JlLmFwaS5yZXNvdXJjZXMuSVByb2plY3QKLSAqLwotcHVibGljIHN0YXRpYyBKYXZhRU1GTmF0dXJlIHByaW1HZXRSdW50aW1lKElQcm9qZWN0IHByb2plY3QpIHsKLQl0cnkgewotCQlyZXR1cm4gKEphdmFFTUZOYXR1cmUpIHByb2plY3QuZ2V0TmF0dXJlKElKYXZhRU1GTmF0dXJlLk5BVFVSRV9JRCk7Ci0JfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLS8qKgotICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9qZWN0IGhhcyBhIHJ1bnRpbWUgY3JlYXRlZCBvbiBpdC4KLSAqIERvIG5vdCBjaGVjayBmb3IgcmVnaXN0ZXJlZCBuYXR1cmUgaWRzLgotICogQHJldHVybiBib29sZWFuCi0gKiBAcGFyYW0gcHJvamVjdCBjb20uaWJtLml0cC5jb3JlLmFwaS5yZXNvdXJjZXMuSVByb2plY3QKLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIHByaW1IYXNSdW50aW1lKElQcm9qZWN0IHByb2plY3QpIHsKLQl0cnkgewotCQlyZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoSUphdmFFTUZOYXR1cmUuTkFUVVJFX0lEKTsKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQotLyoqCi0gKiBwcmltYXJ5IGNvbnRyaWJ1dGUgdG8gY29udGV4dAotICovCi1wdWJsaWMgdm9pZCBwcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBhTmF0dXJlKSB7Ci0JaWYgKGVtZkNvbnRleHQgPT0gYU5hdHVyZSkgcmV0dXJuOwotCWVtZkNvbnRleHQgPSBhTmF0dXJlOwotCVJlc291cmNlU2V0IHNldCA9IGFOYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKTsKLQlzZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRQcm90b2NvbFRvRmFjdG9yeU1hcCgpLnB1dChKYXZhWE1JRmFjdG9yeS5TQ0hFTUUsIEphdmFYTUlGYWN0b3J5LklOU1RBTkNFKTsJCi0JV29ya2JlbmNoVVJJQ29udmVydGVyIGNvbnYgPSAoV29ya2JlbmNoVVJJQ29udmVydGVyKSBzZXQuZ2V0VVJJQ29udmVydGVyKCk7Ci0JY29uZmlndXJlVVJJQ29udmVydGVyKGNvbnYpOwotCWFkZEFkYXB0ZXJGYWN0b3JpZXMoc2V0KTsJCi19Ci0KLS8qKgotICogc2Vjb25kYXJ5IGNvbnRyaWJ1dGUgdG8gY29udGV4dAotICovCi1wdWJsaWMgdm9pZCBzZWNvbmRhcnlDb250cmlidXRlVG9Db250ZXh0KEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGFOYXR1cmUpIHsKLQlwcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChhTmF0dXJlKTsKLX0KLQotLyoqCi0gKiBSZW1vdmUgdGhlIHByb2plY3QgYXMgYSBjb250YWluZXIgZnJvbSB0aGUgY29udmVydGVyIGFuZCBhZGQKLSAqIHRoZSBzb3VyY2UgZm9sZGVyLgotICovCi1wcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVVUklDb252ZXJ0ZXIoV29ya2JlbmNoVVJJQ29udmVydGVyIGNvbnYpIHsKLQljb252LnJlbW92ZUlucHV0Q29udGFpbmVyKGdldFByb2plY3QoKSk7Ci0JY29udi5hZGRJbnB1dENvbnRhaW5lcihnZXRFTUZSb290KCkpOwotfQotCi0vKioKLSAqIEFkZCBBZGFwdG9yIGZhY3RvcmllcyB0byBhQ29udGV4dCB3aGljaCBpcyBub3cKLSAqIGJlaW5nIHVzZWQgZm9yIHRoaXMgbmF0dXJlLgotICovCi1wcm90ZWN0ZWQgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKFJlc291cmNlU2V0IGFTZXQpIHsKLQlhZGRKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3JpZXMoYVNldCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGFkZEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcmllcyhSZXNvdXJjZVNldCBhU2V0KSB7Ci0JTGlzdCBmYWN0b3JpZXMgPSBhU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQkvLyBUaGUgY29udGV4dCBtYXkgYWxyZWFkeSBoYXZlIGEgSmF2YVJlZmxlY3Rpb24gYWRhcHRvciBmYWN0b3J5LCBzbyByZW1vdmUgaXQKLQkvLyBUaGlzIHNob3VsZCBtYXliZSBiZSBjb25zaWRlcmVkIGEgbG9naWMgZXJyb3IsIGJ1dCB3ZSBjYW4gcmVjb3ZlciBlYXNpbHkKLQlpZiAoIWZhY3Rvcmllcy5pc0VtcHR5KCkpIHsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEVjb3JlVXRpbC5nZXRBZGFwdGVyRmFjdG9yeShmYWN0b3JpZXMsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCWZhY3Rvcmllcy5yZW1vdmUoZmFjdG9yeSk7Ci0JfQotCi0JZmFjdG9yaWVzLmFkZChhZGFwdGVyRmFjdG9yeSk7Ci19Ci0KLXByaXZhdGUgSmF2YUpET01BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZS5FTUZOYXR1cmUjc2V0UHJvamVjdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLSAqLwotcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBuZXdQcm9qZWN0KSB7Ci0Jc3VwZXIuc2V0UHJvamVjdChuZXdQcm9qZWN0KTsKLQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5KEplbVByb2plY3RVdGlsaXRpZXMuZ2V0SmF2YVByb2plY3QocHJvamVjdCkpOwotfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0phdmFQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2YjBiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW47Ci0vKgotICogJFJDU2ZpbGU6IEphdmFQbHVnaW4uamF2YSx2ICQgJFJldmlzaW9uOiAxLjEzICQgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NTggJAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YUpET01BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGsuSmF2YUpES0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWwuSmF2YUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuRWNsaXBzZUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgdG9wLWxldmVsIGNsYXNzIG9mIHRoZSBqYXZhIHBsdWdpbiB0b29sLgotICogCi0gKiBAc2VlIEFic3RyYWN0VUlQbHVnaW4gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gVUkgcGx1Z2lucwotICovCi0KLXB1YmxpYyBjbGFzcyBKYXZhUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCXByaXZhdGUgc3RhdGljIEphdmFQbHVnaW4gSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBKYXZhIHBsdWdpbiBhbmQgY2FjaGUgaXRzIGRlZmF1bHQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgSmF2YVBsdWdpbigpIHsKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlpZiAobG9nZ2VyID09IG51bGwpCi0JCQlsb2dnZXIgPSBFY2xpcHNlTG9nZ2VyLmdldEVjbGlwc2VMb2dnZXIodGhpcyk7Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwbHVnaW4gc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgSmF2YVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQkJSmF2YUNvbnRleHQuc2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoSmF2YUpET01BZGFwdGVyRmFjdG9yeS5jbGFzcyk7Ci0JCUpFTVV0aWxQbHVnaW4uZ2V0UGx1Z2luUmVzb3VyY2VTZXQoKS5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBKYXZhSkRLQWRhcHRlckZhY3RvcnkoKSk7CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUHJvamVjdEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUHJvamVjdEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2ZTU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YVByb2plY3RJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW47Ci0vKgotCi0KLSAqLwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDA1LzA3LzAxIDEwOjA5OjI2IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVByb2plY3RJbmZvIGltcGxlbWVudHMgSUphdmFQcm9qZWN0SW5mbyB7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9KQVZBX09VVFBVVF9QQVRIID0gImJpbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfU09VUkNFX1BBVEggPSAic291cmNlIjsvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBzb3VyY2VQYXRoOwotLyoqCi0gKiBKYXZhUHJvamVjdEluZm8gY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEphdmFQcm9qZWN0SW5mbygpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkKLSAqLwotcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U291cmNlUGF0aCgpIHsKLQlyZXR1cm4gREVGQVVMVF9TT1VSQ0VfUEFUSDsKLX0KLS8qKgotICogR2V0IHRoZSBjbGFzcyBwYXRoIGZvciB0aGUgcmVjaWV2ZXIuIEJ5IGRlZmF1bHQgYXNrIHRoZSB0ZW1wbGF0ZQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlUGF0aCgpIHsKLQlpZiAoc291cmNlUGF0aCA9PSBudWxsKQotCQlzb3VyY2VQYXRoID0gZ2V0RGVmYXVsdFNvdXJjZVBhdGgoKTsKLQlyZXR1cm4gc291cmNlUGF0aDsKLX0KLXB1YmxpYyB2b2lkIHNldFNvdXJjZVBhdGgoU3RyaW5nIHBhdGgpIHsKLQlzb3VyY2VQYXRoID0gcGF0aDsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0FTVEJvdW5kUmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0FTVEJvdW5kUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmZjRlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9BU1RCb3VuZFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5JbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLSAKLS8qKgotICogVGhpcyB3b3JrcyBvbiByZXNvbHZlZCBBU1Qgbm9kZXMuIElmIHRoZSBub2RlcyBoYWQgbm90IGJlZW4gcmVzb2x2ZWQsIHRoaXMgd2lsbCByZXR1cm4gbm90aW5nLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEFTVEJvdW5kUmVzb2x2ZXIgZXh0ZW5kcyBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuUmVzb2x2ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5JUmVzb2x2ZXIjcmVzb2x2ZU5hbWUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWUpCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiByZXNvbHZlTmFtZShOYW1lIG5hbWUpIHsKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJc3dpdGNoIChiaW5kaW5nLmdldEtpbmQoKSkgewotCQkJY2FzZSBJQmluZGluZy5UWVBFOgotCQkJCVN0cmluZyB0eXBlbmFtZSA9IGdldFR5cGVOYW1lKChJVHlwZUJpbmRpbmcpIGJpbmRpbmcpOwotCQkJCVBUTmFtZSBwdG5hbWUgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFROYW1lKCk7Ci0JCQkJcHRuYW1lLnNldE5hbWUodHlwZW5hbWUpOwotCQkJCXJldHVybiBwdG5hbWU7Ci0JCQljYXNlIElCaW5kaW5nLlZBUklBQkxFOgotCQkJCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCQkJaWYgKHZhcmlhYmxlQmluZGluZy5pc0ZpZWxkKCkpIHsKLQkJCQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKHZhcmlhYmxlQmluZGluZy5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCQkJCVBURmllbGRBY2Nlc3MgZmEgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRGaWVsZEFjY2VzcygpOwotCQkJCQkJLy8gSWYganVzdCBhIHNpbXBsZSBuYW1lLCB0aGVuIGl0IGlzIGxpa2UgdGhpcy5maWVsZCwgc28gbm8gcmVjZWl2ZXIuIE5vdCBzdXJlIGhvdyB0byBoYW5kbGUgdGhpcyB5ZXQuCi0JCQkJCQlpZiAobmFtZS5pc1F1YWxpZmllZE5hbWUoKSkgewotCQkJCQkJCS8vIFRoZXJlIGFyZSBwYXJ0cyBiZWZvcmUgdGhpcyBvbmUuIEdldCB0aGVtIGFzIGFuIGV4cHJlc3Npb24gKGVpdGhlciBhIG5hbWUsIG9yIGFub3RoZXIgZmllbGQgYWNjZXNzKQotCQkJCQkJCWZhLnNldFJlY2VpdmVyKHJlc29sdmVOYW1lKCgoUXVhbGlmaWVkTmFtZSkgbmFtZSkuZ2V0UXVhbGlmaWVyKCkpKTsKLQkJCQkJCX0KLQkJCQkJCWZhLnNldEZpZWxkKHZhcmlhYmxlQmluZGluZy5nZXROYW1lKCkpOwotCQkJCQkJcmV0dXJuIGZhOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdGhyb3dJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChXb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuQVNUQm91bmRSZXNvbHZlcl9DYW5ub3RIYW5kbGVMb2NhbEZpZWxkX0VYQ18sIG5ldyBPYmplY3RbXXt2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpfSkpOyAKLS8vCQkJCQkJcHVzaChuZXcgUHVzaEZpZWxkVmFyaWFibGUodmFyaWFibGVJZCwgZ2V0VHlwZVNpZ25hdHVyZShkZWNsYXJpbmdUeXBlQmluZGluZyksIGZDb3VudGVyKSk7Ci0vLwkJCQkJCXB1c2gobmV3IFB1c2hUaGlzKGdldEVuY2xvc2luZ0xldmVsKG5vZGUsIGRlY2xhcmluZ1R5cGVCaW5kaW5nKSkpOwotLy8JCQkJCQlzdG9yZUluc3RydWN0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvd0ludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5BU1RCb3VuZFJlc29sdmVyX0Nhbm5vdEhhbmRsZUxvY2FsVmFyaWFibGVfRVhDXywgbmV3IE9iamVjdFtde3ZhcmlhYmxlQmluZGluZy5nZXROYW1lKCl9KSk7IAotLy8JCQkJCXB1c2gobmV3IFB1c2hMb2NhbFZhcmlhYmxlKHZhcmlhYmxlSWQpKTsKLQkJCQl9CQkJCQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5JUmVzb2x2ZXIjcmVzb2x2ZVR5cGUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUpCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlVHlwZShUeXBlIHR5cGUpIHsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0eXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCXJldHVybiAoYmluZGluZyAhPSBudWxsKSA/IGdldFR5cGVOYW1lKGJpbmRpbmcpIDogbnVsbDsgCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuUmVzb2x2ZXIjcmVzb2x2ZVR5cGUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWUpCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlVHlwZShOYW1lIG5hbWUpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbiB7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gbmFtZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJcmV0dXJuIChiaW5kaW5nICE9IG51bGwpID8gZ2V0VHlwZU5hbWUoYmluZGluZykgOiBudWxsOyAKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlTmFtZShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIG5hbWU7Ci0JCWlmICh0eXBlQmluZGluZy5pc0FycmF5KCkpIHsKLQkJCW5hbWU9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0VHlwZU5hbWUodHlwZUJpbmRpbmcuZ2V0RWxlbWVudFR5cGUoKSkpOwotCQkJaW50IGRpbWVuc2lvbnM9IHR5cGVCaW5kaW5nLmdldERpbWVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspIHsKLQkJCQluYW1lLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG5hbWUudG9TdHJpbmcoKTsKLQkJfQotCQluYW1lPSBuZXcgU3RyaW5nQnVmZmVyKHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7Ci0JCUlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZz0gdHlwZUJpbmRpbmcuZ2V0UGFja2FnZSgpOwotCQl0eXBlQmluZGluZz0gdHlwZUJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJd2hpbGUodHlwZUJpbmRpbmcgIT0gbnVsbCkgewotCQkJbmFtZS5pbnNlcnQoMCwgJyQnKS5pbnNlcnQoMCwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsKLQkJCXR5cGVCaW5kaW5nPSB0eXBlQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpOwotCQl9Ci0JCWlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsICYmICFwYWNrYWdlQmluZGluZy5pc1VubmFtZWQoKSkgewotCQkJbmFtZS5pbnNlcnQoMCwgJy4nKS5pbnNlcnQoMCwgcGFja2FnZUJpbmRpbmcuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gbmFtZS50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULlJlc29sdmVyI3Jlc29sdmVUaGlzKCkKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIHJlc29sdmVUaGlzKCkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVFRoaXNMaXRlcmFsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSUphdmFFTUZOYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0lKYXZhRU1GTmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ODg1M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSUphdmFFTUZOYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eTsKLSAKLS8qKgotICogSW50ZXJmYWNlIGZvciBKYXZhIEVNRiBOYXR1cmUgY29uc3RhbnRzLgotICogCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YUVNRk5hdHVyZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkVfSUQgPSAib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC5KYXZhRU1GTmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KYXZhTW9kZWxMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSmF2YU1vZGVsTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1MjdmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KYXZhTW9kZWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotCi0vKgotICogJFJDU2ZpbGU6IEphdmFNb2RlbExpc3RlbmVyLmphdmEsdiAkICRSZXZpc2lvbjogMS42LjYuMSAkICREYXRlOiAyMDA4LzA2LzE5IDAxOjU4OjQ3ICQKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmNvcmUuSkVNUGx1Z2luOwotCi0vKioKLSAqIEFuIGVsZW1lbnQgY2hhbmdlIGxpc3RlbmVyIHRvIGxpc3RlbiBmb3IgSmF2YSBNb2RlbCBjaGFuZ2VzLiBJdCBicmVha3MgdGhlIG5vdGlmaWNhdGlvbiB1cCBpbnRvIGluZGl2aWR1YWwgbWV0aG9kIGNhbGxzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdhbGsKLSAqIHRoZSBub3RpZmljYXRpb24gdHJlZS4KLSAqIAotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGxpc3RlbmluZyBvbmx5IGZvciB7QGxpbmsgRWxlbWVudENoYW5nZWRFdmVudCNQT1NUX0NIQU5HRX0gZXZlbnRzLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByaXZhdGUgSGFzaE1hcCByZXNvbHZlZENvbnRhaW5lcnMgPSBuZXcgSGFzaE1hcCgpOwotCXB1YmxpYyBKYXZhTW9kZWxMaXN0ZW5lcigpIHsKLQkJdGhpcyhFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBzdXBwbHlpbmcgdGhlIHR5cGUgb2YgZXZlbnRzIHRvIGxpc3RlbiBmb3IuCi0JICogCi0JICogQHBhcmFtIGV2ZW50c1RvTGlzdGVuCi0JICogICAgICAgICAgICBvcidkIHRvZ2V0aGVyIGV2ZW50IGxpc3RlbmluZyB0eXBlcy4gU2VlIHtAbGluayBFbGVtZW50Q2hhbmdlZEV2ZW50fSBmb3IgdGhlIHR5cGVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBKYXZhTW9kZWxMaXN0ZW5lcihpbnQgZXZlbnRzVG9MaXN0ZW4pIHsKLQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzLCBldmVudHNUb0xpc3Rlbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lciNlbGVtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCi0JCXByb2Nlc3NEZWx0YSgoSUphdmFFbGVtZW50RGVsdGEpIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJCi0JfQotCi0JLyoqCi0JICogR2VuZXJhbGx5IGRpc3BhdGNoIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGVsdGEuIE5vcm1hbGx5IHRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgb3ZlcnJpZGRlbi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDaGlsZHJlbihJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJcHJvY2Vzc0RlbHRhKGNoaWxkcmVuW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNvdXJjZSBjb250ZW50IGhhcyBjaGFuZ2VkLiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBwZXJmb3JtIG93biBmdW5jdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGRlbHRhCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbnRlbnRDaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JfQotCi0JLyoqCi0JICogRGlzcGF0Y2ggdGhlIGphdmEgZWxlbWVudCBkZWx0YS4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vcm1hbGx5IG5vdCBiZSBvdmVycmlkZGVuLiBPbmUKLQkgKiB1c2FnZSB3b3VsZCBiZSB0byBhZGQgZGVsdGEgdHlwZXMgdGhhdCBhcmUgdG8gYmUgcHJvY2Vzc2VkIGFuZCBkaXNwYXRjaGVkIGJ5IHRoZQotCSAqIHN1YmNsYXNzZXMuIEZvciBleGFtcGxlIGFsc28gZGlzcGF0Y2ggb24ge0BsaW5rIElKYXZhRWxlbWVudCNJTVBPUlRfQ09OVEFJTkVSfS4gU3ViY2xhc3NlcwotCSAqIHNob3VsZCBjYWxsIDxjb2RlPnN1cGVyLnByb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSk8L2NvZGU+IGlmIGl0IGlzIG5vdCBvbmUgdGhleQotCSAqIGFyZSBpbnRlcmVzdGVkIGluLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJLy8gaWYgdGhlIGNsYXNzIHBhdGggaGFzIGNoYW5nZWQgd2UgcmVmcmVzaCB0aGUgcmVzb2x2ZWQgY29udGFpbmVyIGNhY2hlCi0JCWludCBmbGFncz0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJaWYgKCgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFU09MVkVEX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKSAmJiAhcmVzb2x2ZWRDb250YWluZXJzLmlzRW1wdHkoKSl7Ci0JCQlyZXNvbHZlZENvbnRhaW5lcnMuY2xlYXIoKTsJCQkKLQkJfQotCi0JCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMOgotCQkJCXByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoKElKYXZhTW9kZWwpIGVsZW1lbnQsIGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDoKLQkJCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJSmF2YVByb2plY3QpIGVsZW1lbnQsIGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDoKLQkJCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudCwgZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDoKLQkJCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50LCBkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOgotCQkJCXByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQsIGRlbHRhKTsKLQkJCQlwcm9jZXNzQ29udGVudENoYW5nZWQoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ0xBU1NfRklMRToKLQkJCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJQ2xhc3NGaWxlKSBlbGVtZW50LCBkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOgotCQkJCXByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoKElUeXBlKSBlbGVtZW50LCBkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQkvLyBOb3RlOiBpZiB3ZSBhcmUgdG8gdXBkYXRlIHRoZSBNZXRob2QvRmllbGQgYWRhcHRlcnMsIHdlIHNob3VsZCBwcm9jZXNzIHRoZQotCQkJLy8gSUphdmFFbGVtZW50Lk1FVEhPRCBhbmQgSUphdmFFbGVtZW50LkZJRUxECi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBjbGFzc2ZpbGUgY2hhbmdlZCBldmVudC4gVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4gSXQgd2lsbCBub3Qgd2FsayBhbnkgY2hpbGRyZW4gb2YgdGhlIGRlbHRhIGVpdGhlci4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKLQkgKiB0byBwZXJmb3JtIHRoZWlyIG93biBmdW5jdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElDbGFzc0ZpbGUgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBjb21waWxhdGlvbiB1bml0IGNoYW5nZWQgZXZlbnQuIFRoZSBkZWZhdWx0IGlzIHRvIHByb2Nlc3MgdGhlIGNoaWxkcmVuIG9mIHRoZSBkZWx0YS4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcGVyZm9ybSB0aGVpciBvd24KLQkgKiBmdW5jdGlvbnMuIElmIHRoZXkgd2lzaCB0byB3YWxrIHRoZSBjaGlsZHJlbiB0aGV5IHNob3VsZCB0aGVuIGFsc28gY2FsbAotCSAqIDxjb2RlPnN1cGVyLnByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUNvbXBpbGF0aW9uVW5pdCwgSUphdmFFbGVtZW50RGVsdGEpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGphdmEgbW9kZWwgY2hhbmdlZCBldmVudC4gVGhlIGRlZmF1bHQgaXMgdG8gcHJvY2VzcyB0aGUgY2hpbGRyZW4gb2YgdGhlIGRlbHRhLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBwZXJmb3JtIHRoZWlyIG93bgotCSAqIGZ1bmN0aW9ucy4gSWYgdGhleSB3aXNoIHRvIHdhbGsgdGhlIGNoaWxkcmVuIHRoZXkgc2hvdWxkIHRoZW4gYWxzbyBjYWxsCi0JICogPGNvZGU+c3VwZXIucHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJSmF2YU1vZGVsLCBJSmF2YUVsZW1lbnREZWx0YSk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGRlbHRhCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJSmF2YU1vZGVsIGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgamF2YSBwcm9qZWN0IGNoYW5nZWQgZXZlbnQuIFRoZSBkZWZhdWx0IGlzIHRvIHByb2Nlc3MgdGhlIGNoaWxkcmVuIG9mIHRoZSBkZWx0YS4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcGVyZm9ybSB0aGVpciBvd24KLQkgKiBmdW5jdGlvbnMuIElmIHRoZXkgd2lzaCB0byB3YWxrIHRoZSBjaGlsZHJlbiB0aGV5IHNob3VsZCB0aGVuIGFsc28gY2FsbAotCSAqIDxjb2RlPnN1cGVyLnByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFQcm9qZWN0LCBJSmF2YUVsZW1lbnREZWx0YSk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGRlbHRhCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJSmF2YVByb2plY3QgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBwYWNrYWdlIGZyYWdtZW50IGNoYW5nZWQgZXZlbnQuIFRoZSBkZWZhdWx0IGlzIHRvIHByb2Nlc3MgdGhlIGNoaWxkcmVuIG9mIHRoZSBkZWx0YS4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcGVyZm9ybSB0aGVpciBvd24KLQkgKiBmdW5jdGlvbnMuIElmIHRoZXkgd2lzaCB0byB3YWxrIHRoZSBjaGlsZHJlbiB0aGV5IHNob3VsZCB0aGVuIGFsc28gY2FsbAotCSAqIDxjb2RlPnN1cGVyLnByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudCwgSUphdmFFbGVtZW50RGVsdGEpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBjaGFuZ2VkIGV2ZW50LiBUaGUgZGVmYXVsdCBpcyB0byBwcm9jZXNzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGVsdGEuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHBlcmZvcm0gdGhlaXIKLQkgKiBvd24gZnVuY3Rpb25zLiBJZiB0aGV5IHdpc2ggdG8gd2FsayB0aGUgY2hpbGRyZW4gdGhleSBzaG91bGQgdGhlbiBhbHNvIGNhbGwKLQkgKiA8Y29kZT5zdXBlci5wcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnRSb290LCBJSmF2YUVsZW1lbnREZWx0YSk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGRlbHRhCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJUGFja2FnZUZyYWdtZW50Um9vdCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIElUeXBlIGNoYW5nZWQgZXZlbnQuIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuIEl0IHdpbGwgbm90IHdhbGsgYW55IGNoaWxkcmVuIG9mIHRoZSBkZWx0YSBlaXRoZXIuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvCi0JICogcGVyZm9ybSB0aGVpciBvd24gZnVuY3Rpb25zLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGRlbHRhCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJVHlwZSBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgd2hldGhlciB0aGlzIGVsZW1lbnQgZGVsdGEgaXMgYSBjbGFzc3BhdGggY2hhbmdlLiBJLmUuIHNvbWV0aGluZyBhZGRlZC9yZW1vdmVkL21vdmVkIGFyb3VuZCBmb3IgdGhlIGNsYXNzcGF0aC4gVGhpcyBzaG91bGQgb25seSBiZQotCSAqIGNhbGxlZCBmb3IgYSBkZWx0YSB0aGF0IGlzIGZvciBhbiB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudFJvb3R9LiBTaG91bGQgYmUgY2FsbGVkIGZyb20gYW4gb3ZlcnJpZGUgb2YKLQkgKiB7QGxpbmsgI3Byb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudFJvb3QsIElKYXZhRWxlbWVudERlbHRhKX0KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIGNsYXNzcGF0aCBjaGFuZ2Ugb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NsYXNzUGF0aENoYW5nZShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwotCQlyZXR1cm4gKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEICYmICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FEREVEX1RPX0NMQVNTUEFUSCkgIT0gMCkKLQkJCQl8fCAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSAhPSAwKSB8fCAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU9SREVSKSAhPSAwKSk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhlIGNoYW5nZSBpcyB0aGlzIGlzIGEgcmF3IGNsYXNzcGF0aCBjaGFuZ2UsIG9yIGlmIGEgZmlsZSB0aGF0IGlzIGluIHRoZSByb290IG9mIHRoZSBwcm9qZWN0IHdhcyBjaGFuZ2VkIHRoYXQgYWxzbyBjYW4gbWVhbiBhCi0JICogcmF3IGNsYXNzcGF0aCBjaGFuZ2UuIFRoaXMgbXVzdCBvbmx5IGJlIGNhbGxlZCBmb3IgYSBkZWx0YSB0aGF0IGlzIGZvciBhbiB7QGxpbmsgSUphdmFQcm9qZWN0fS4KLQkgKiA8cD4KLQkgKiBTZWUge0BsaW5rIElKYXZhRWxlbWVudERlbHRhLiNGX0NMQVNTUEFUSF9DSEFOR0VEfSBhbmQge0BsaW5rICNpc0Fsc29DbGFzc3BhdGhDaGFuZ2UoSVBhdGgpfSBmb3IgZGV0YWlscy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbGFzc3BhdGhSZXNvdXJjZUNoYW5nZShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCUlSZXNvdXJjZURlbHRhW10gcmVzb3VyY2VzID0gZGVsdGEuZ2V0UmVzb3VyY2VEZWx0YXMoKTsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyZXNvdXJjZXNbaV0uZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQlwYXRoID0gcmVzb3VyY2VzW2ldLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQlpZiAoaXNBbHNvQ2xhc3NwYXRoQ2hhbmdlKHBhdGgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VycyB3aGV0aGVyIHRoZSBmaWxlIHNwZWNpZmllZCBieSB0aGUgcGF0aCBpcyBvbmUgdGhhdCB3aGVuIGNoYW5nZWQgY2FuIHJlc3VsdCBpbiBhIGNsYXNzcGF0aCBjaGFuZ2UuIFRoaXMgaXMgY2FsbGVkIGZyb20KLQkgKiB7QGxpbmsgI2lzQ2xhc3NwYXRoUmVzb3VyY2VDaGFuZ2UoSUphdmFFbGVtZW50RGVsdGEpfS4gVGhlIGZpbGUgbXVzdCBiZSBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZpbGUgYmVpbmcgY2hhbmdlZCB3b3VsZCByZXN1bHQgaW4gYSBjbGFzc3BhdGggY2hhbmdlLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWxzb0NsYXNzcGF0aENoYW5nZShJUGF0aCBwYXRoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHdoZXRoZXIgdGhlIGdpdmVuIGphdmEgcHJvamVjdCBpcyBpbiB0aGUgY2xhc3NwYXRoIChpbmNsdWRpbmcgcmVjdXJzaXZlKS4gVGhpcyBjdXJyZW50bHkgd2lsbCBub3Qgd2FsayB0aHJvdWdoIGNvbnRhaW5lcnMgKHN1Y2ggYXMgdGhlCi0JICogUERFIGNvbnRhaW5lcikuIE9ubHkgdGhyb3VnaCB0aGUgZGlyZWN0IGFuZCByZWN1cnNpdmUgcHJvamVjdCByZWZlcmVuY2VzLiBUaGUgamF2YSBwcm9qZWN0IGlzIGRldGVybWluZWQgYnkgc3ViY2xhc3Nlcywgc2VlCi0JICoge0BsaW5rICNnZXRKYXZhUHJvamVjdCgpfS4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2plY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHByb2plY3QgaXMgaW4gY2xhc3NwYXRoIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbkNsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJSUphdmFQcm9qZWN0IGxpc3RlbmVySmF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwotCQlpZiAoamF2YVByb2plY3QuZXF1YWxzKGxpc3RlbmVySmF2YVByb2plY3QpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBpc0luQ2xhc3NwYXRoKGphdmFQcm9qZWN0LCBsaXN0ZW5lckphdmFQcm9qZWN0LCB0cnVlLCBuZXcgSGFzaFNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgamF2YSBwcm9qZWN0IGZvciB0aGlzIGxpc3RlbmVyLiBTdWJjbGFzc2VzIG11c3QgcHJvdmlkZSBhIGphdmEgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBqYXZhIHByb2plY3QuIDxjb2RlPm51bGw8L2NvZGU+IGlzIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCk7Ci0KLQkvKgotCSAqIHRlc3QgdG8gc2VlIGlmIHRoZSB0ZXN0UHJvamVjdCBpcyBpbiB0aGUgY2xhc3NwYXRoIChpbmNsdWRpbmcgZnJvbSBhbnkgcmVmZXJlbmNlZCBwcm9qZWN0cykgb2YgdGhlIHRhcmdldCBwcm9qZWN0LiBLZWVwIHRyYWNrIG9mIHRob3NlIGFscmVhZHkKLQkgKiB2aXNpdGVkIHNvIGFzIG5vdCB0byB2aXNpdCBhZ2Fpbi4gVG9vIGxhdGUgdG8gbWFrZSBwcml2YXRlLiBCdXQgaXQgc2hvdWxkIG5vdCBiZSBvdmVycmlkZGVuLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5DbGFzc3BhdGgoSUphdmFQcm9qZWN0IHRlc3RQcm9qZWN0LCBJSmF2YVByb2plY3QgdGFyZ2V0UHJvamVjdCwgYm9vbGVhbiBpc0ZpcnN0TGV2ZWwsIFNldCB2aXNpdGVkKSB7Ci0JCWlmICh2aXNpdGVkLmNvbnRhaW5zKHRhcmdldFByb2plY3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCQl2aXNpdGVkLmFkZCh0YXJnZXRQcm9qZWN0KTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbnRyaWVzID0gdGFyZ2V0UHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlMaXN0IHByb2plY3RzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk7Ci0JCQllbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q6Ci0JCQkJCUlKYXZhUHJvamVjdCBlbnRyeVByb2plY3QgPSBnZXRWaXNpYmxlSmF2YVByb2plY3QoZW50cnksIGlzRmlyc3RMZXZlbCk7Ci0JCQkJCWlmIChlbnRyeVByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJaWYgKGVudHJ5UHJvamVjdC5lcXVhbHModGVzdFByb2plY3QpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmIChwcm9qZWN0cyA9PSBudWxsKSB7Ci0JCQkJCQkJCXByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCX0KLQkJCQkJCQlwcm9qZWN0cy5hZGQoZW50cnlQcm9qZWN0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQkvL0EgY29udGFpbmVyIG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gcHJvamVjdHMuCi0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiA6Ci0JCQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihlbnRyeS5nZXRQYXRoKCksIHRhcmdldFByb2plY3QpOwotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJSkVNUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJCWlmIChjb250YWluZXIgPT0gbnVsbCB8fCBjb250YWluZXIuZ2V0S2luZCgpICE9IElDbGFzc3BhdGhDb250YWluZXIuS19BUFBMSUNBVElPTikKLQkJCQkJCWJyZWFrOwotCQkJCQkvL0ZpcnN0IHNlZSBpZiB3ZSBhbHJlYWR5IHJlc29sdmVkCi0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNvbnRhaW5lckVudHJpZXMgPSBudWxsOwotCQkJCQljb250YWluZXJFbnRyaWVzID0gKElDbGFzc3BhdGhFbnRyeVtdKXJlc29sdmVkQ29udGFpbmVycy5nZXQoY29udGFpbmVyKTsKLQkJCQkJaWYgKGNvbnRhaW5lckVudHJpZXMgPT0gbnVsbCkgewotCQkJCQkJY29udGFpbmVyRW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQkJCQlyZXNvbHZlZENvbnRhaW5lcnMucHV0KGNvbnRhaW5lciwgY29udGFpbmVyRW50cmllcyk7Ci0JCQkJCX0KLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb250YWluZXJFbnRyaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAoY29udGFpbmVyRW50cmllc1tqXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpIHsKLQkJCQkJCQlJSmF2YVByb2plY3QgY29uRW50cnlQcm9qZWN0ID0gZ2V0VmlzaWJsZUphdmFQcm9qZWN0KGNvbnRhaW5lckVudHJpZXNbal0sIGlzRmlyc3RMZXZlbCk7Ci0JCQkJCQkJaWYgKGNvbkVudHJ5UHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChjb25FbnRyeVByb2plY3QuZXF1YWxzKHRlc3RQcm9qZWN0KSkgewotCQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAocHJvamVjdHMgPT0gbnVsbCkgewotCQkJCQkJCQkJCXByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJcHJvamVjdHMuYWRkKGNvbkVudHJ5UHJvamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzSW5DbGFzc3BhdGgodGVzdFByb2plY3QsIHByb2plY3RzLCBmYWxzZSwgdmlzaXRlZCk7Ci0JfQotCQotCS8qCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZXR1cm4gYW4gSUphdmFQcm9qZWN0IHRoYXQgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgZW50cnkKLQkgKiBpZiBpdCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byBkb3duc3RyZWFtIHByb2plY3RzLgotCSAqLwotCXByaXZhdGUgSUphdmFQcm9qZWN0IGdldFZpc2libGVKYXZhUHJvamVjdChJQ2xhc3NwYXRoRW50cnkgZW50cnksIGJvb2xlYW4gaXNGaXJzdExldmVsKSB7Ci0JCWlmIChpc0ZpcnN0TGV2ZWwgfHwgZW50cnkuaXNFeHBvcnRlZCgpKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgcmVzRW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGVudHJ5KTsKLQkJCXJldHVybiBnZXRKYXZhUHJvamVjdChyZXNFbnRyeSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBTZWUgaWYgdGhlIHRlc3RQcm9qZWN0IGlzIGluIHRoZSBjbGFzc3BhdGggb2YgYW55IG9mIHRoZSBsaXN0IG9mIHByb2plY3RzIG9yIGluIGFueSBwcm9qZWN0IHRoYXQgYW4gZW50cnkgaW4gdGhlIGxpc3QgbWF5IG9mIHZpc2l0ZWQuIFRvbyBsYXRlCi0JICogdG8gbWFrZSBwcml2YXRlLiBCdXQgaXQgc2hvdWxkIG5vdCBiZSBvdmVycmlkZGVuLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5DbGFzc3BhdGgoSUphdmFQcm9qZWN0IHRlc3RQcm9qZWN0LCBMaXN0IHNvbWVKYXZhUHJvamVjdHMsIGJvb2xlYW4gaXNGaXJzdExldmVsLCBTZXQgdmlzaXRlZCkgewotCQlpZiAoc29tZUphdmFQcm9qZWN0cyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgc2l6ZSA9IHNvbWVKYXZhUHJvamVjdHMuc2l6ZSgpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJamF2YVByb2ogPSAoSUphdmFQcm9qZWN0KSBzb21lSmF2YVByb2plY3RzLmdldChpKTsKLQkJCXJldHVybiBpc0luQ2xhc3NwYXRoKHRlc3RQcm9qZWN0LCBqYXZhUHJvaiwgaXNGaXJzdExldmVsLCB2aXNpdGVkKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBqYXZhIHByb2plY3QgdGhhdCBjbGFzc3BhdGggZW50cnkgaXMgZm9yLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBjbGFzc3BhdGggZW50cmllcyBvZiB0eXBlIHtAbGluayBJQ2xhc3NwYXRoRW50cnkjQ1BFX1BST0pFQ1R9Ci0JICogCi0JICogQHBhcmFtIGVudHJ5Ci0JICogICAgICAgICAgICBjbGFzc3BhdGggZW50cnkgb2YgdHlwZSB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5I0NQRV9QUk9KRUNUfS4KLQkgKiBAcmV0dXJuIHRoZSBqYXZhIHByb2plY3QgZm9yIHRoaXMgZW50cnkuIFRoZSBwcm9qZWN0IG1pZ2h0IG5vdCBhY3R1YWxseSBleGlzdC4gVGhhdCBpcyBub3QgdmVyaWZpZWQuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJSVByb2plY3QgcHJvaiA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApKTsKLQkJaWYgKHByb2ogIT0gbnVsbCkKLQkJCXJldHVybiBKYXZhQ29yZS5jcmVhdGUocHJvaik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgd29ya3NwYWNlIHJvb3QuIEEgdXRpbGl0eSBtZXRob2QuCi0JICogQHJldHVybiB0aGUgd29ya3NwYWNlIHJvb3QuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0plbVByb2plY3RVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0plbVByb2plY3RVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhZWMyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHk7Ci0vKgotICogJFJDU2ZpbGU6IEplbVByb2plY3RVdGlsaXRpZXMuamF2YSx2ICQgJFJldmlzaW9uOiAxLjExLjIuMS4yLjEgJCAkRGF0ZTogMjAwOS8xMC8yMiAxOTowODoxMyAkCi0gKi8KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YUVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotLyoqCi0gKiBQcm9qZWN0IFV0aWxpdGllcyBmb3IgSkVNIGFuZCBKYXZhLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEplbVByb2plY3RVdGlsaXRpZXMgZXh0ZW5kcyBQcm9qZWN0VXRpbGl0aWVzIHsKLQkKLQlwcml2YXRlIEplbVByb2plY3RVdGlsaXRpZXMoKXsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIG5hdHVyZSBpZCBmb3IgSkVNIE5hdHVyZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKRU1fRU1GX05hdHVyZUlEID0gSUphdmFFTUZOYXR1cmUuTkFUVVJFX0lEOwotCQotCS8qKgotCSAqIEdldCB0aGUgRU1GIG5hdHVyZSBmb3IgSkVNIGZvciB0aGUgcHJvamVjdC4gCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gYWRkTmF0dXJlIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFkZCB0aGUgbmF0dXJlIHRvIHRoZSBwcm9qZWN0IGlmIG5vdCBzZXQuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBkb24ndCBhZGQgbmF0dXJlIGlmIG5vdCBhbHJlYWR5IG9uIHByb2plY3QuCi0JICogQHJldHVybiB0aGUgRU1GTmF0dXJlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZCBhbmQgYWRkTmF0dXJlIHdhcyA8Y29kZT5mYWxzZTwvY29kZT4gb3IgaXQgd2FzIG5vdCBhIGphdmEgcHJvamVjdC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBFTUZOYXR1cmUgZ2V0SkVNX0VNRl9OYXR1cmUoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBhZGROYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGFkZE5hdHVyZSA/IEphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZShwcm9qZWN0KSA6IEphdmFFTUZOYXR1cmUuZ2V0UnVudGltZShwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIEphdmFDbGFzcyBmcm9tIGFuIElGaWxlLgotCSAqIEBwYXJhbSBhRmlsZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoSUZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IGFGaWxlLmdldFByb2plY3QoKTsKLQkJTGlzdCBmb2xkZXJzID0gZ2V0U291cmNlQ29udGFpbmVycyhwcm9qZWN0KTsKLQkJZm9sZGVycy5hZGRBbGwoZ2V0TGlicmFyeUNvbnRhaW5lcnMocHJvamVjdCkpOwotCQlJQ29udGFpbmVyIGZvbGRlciA9IG51bGw7Ci0JCUlQYXRoIGZvbGRlclBhdGgsIGZpbGVQYXRoLCBqYXZhUGF0aDsKLQkJZmlsZVBhdGggPSBhRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCWlmIChmb2xkZXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZm9sZGVycy5zaXplKCk7IGkrKykgewotCQkJCWZvbGRlciA9IChJQ29udGFpbmVyKSBmb2xkZXJzLmdldChpKTsKLQkJCQlmb2xkZXJQYXRoID0gZm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQlpbnQgc2VnbWVudHMgPSBmaWxlUGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMoZm9sZGVyUGF0aCk7Ci0JCQkJaWYgKHNlZ21lbnRzID4gMCkgewotCQkJCQlqYXZhUGF0aCA9IGZpbGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudHMpOwotCQkJCQlqYXZhUGF0aCA9IGphdmFQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkJCQkJU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBqYXZhUGF0aC50b1N0cmluZygpLnJlcGxhY2UoJy8nLCAnLicpOwotCQkJCQlyZXR1cm4gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKHF1YWxpZmllZE5hbWUsIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZVNldChwcm9qZWN0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgc291cmNlIGNvbnRhaW5lcnMgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBsaXN0IG9mIHNvdXJjZSBjb250YWluZXJzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTb3VyY2VDb250YWluZXJzKElQcm9qZWN0IHApIHsKLQkJdHJ5IHsKLQkJCUxpc3Qgc291cmNlQ29udGFpbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3Qgc291cmNlUGF0aHMgPSBnZXRTb3VyY2VQYXRocyhwKTsKLQkJCWlmIChzb3VyY2VQYXRocyAhPSBudWxsICYmICFzb3VyY2VQYXRocy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVBhdGhzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIHNvdXJjZVBhdGhzLmdldChpKTsKLQkJCQkJaWYgKHBhdGguaXNFbXB0eSgpKQotCQkJCQkJc291cmNlQ29udGFpbmVycy5hZGQocCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXNvdXJjZUNvbnRhaW5lcnMuYWRkKHAuZ2V0Rm9sZGVyKHBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc291cmNlQ29udGFpbmVyczsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZ2V0U291cmNlUGF0aHMoSVByb2plY3QgcCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChwKTsKLQkJaWYgKGphdmFQcm9qID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY3AgPSBudWxsOwotCQl0cnkgewotCQkJY3AgPSBqYXZhUHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKRU1VdGlsUGx1Z2luLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpc3Qgc291cmNlUGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjcFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCXNvdXJjZVBhdGhzLmFkZChjcFtpXS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZVBhdGhzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gbGlzdCBvZiBJQ29udGFpbmVycyB0aGF0IGFyZSBMaWJyYXJpZXMgaW4gdGhlIGNsYXNzcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEByZXR1cm4gbGlzdCBvZiBsaWJyYXJ5IElDb250YWluZXJzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRMaWJyYXJ5Q29udGFpbmVycyhJUHJvamVjdCBwKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0IGxpYnJhcnlDb250YWluZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTGlzdCBsaWJyYXJ5UGF0aHMgPSBnZXRsaWJyYXJ5UGF0aHMocCk7Ci0JCQlpZiAobGlicmFyeVBhdGhzICE9IG51bGwgJiYgIWxpYnJhcnlQYXRocy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYnJhcnlQYXRocy5zaXplKCk7IGkrKykgewotCQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBsaWJyYXJ5UGF0aHMuZ2V0KGkpOwotCQkJCQlpZiAocGF0aC5pc0VtcHR5KCkpCi0JCQkJCQlsaWJyYXJ5Q29udGFpbmVycy5hZGQocCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWxpYnJhcnlDb250YWluZXJzLmFkZChwLmdldEZvbGRlcihwYXRoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGxpYnJhcnlDb250YWluZXJzOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnZXRsaWJyYXJ5UGF0aHMoSVByb2plY3QgcCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChwKTsKLQkJaWYgKGphdmFQcm9qID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY3AgPSBudWxsOwotCQl0cnkgewotCQkJY3AgPSBqYXZhUHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKRU1VdGlsUGx1Z2luLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpc3QgbGlicmFyeVBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY3BbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7Ci0JCQkJbGlicmFyeVBhdGhzLmFkZChjcFtpXS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpYnJhcnlQYXRoczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBqYXZhIHByb2plY3QgbmF0dXJlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIGphdmEgcHJvamVjdCBuYXR1cmUgZm9yIHRoZSBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhIGphdmEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCWlmIChwICE9IG51bGwpCi0JCXsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIChJSmF2YVByb2plY3QpIHAuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRvdWNoIGNsYXNzcGF0aC4gSXQgc2ltcGx5IHRha2VzIHRoZSBjbGFzc3BhdGggYW5kIHNldHMgaXQgYmFjayBpbi4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2plY3QKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVDbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpCi0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGJpbmFyeSBvdXRwdXQgZmlsZXMgZm9yIHRoZSBKYXZhUHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEByZXR1cm4gcGF0aCB0byBiaW5hcnkgb3V0cHV0IGZvbGRlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgamF2YSBwcm9qZWN0IG9yIG90aGVyIHByb2JsZW0uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhUHJvamVjdE91dHB1dExvY2F0aW9uKElQcm9qZWN0IHApIHsKLQkJdHJ5IHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHApOwotCQkJaWYgKGphdmFQcm9qID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoIWphdmFQcm9qLmlzT3BlbigpKQotCQkJCWphdmFQcm9qLm9wZW4obnVsbCk7Ci0JCQlyZXR1cm4gamF2YVByb2ouZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0J3MgYmluYXJ5IG91dHB1dCBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIHByb2plY3QncyBvdXRwdXQgY29udGFpbmVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBqYXZhIHByb2plY3Qgb3Igc29tZSBvdGhlciBlcnJvci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0SmF2YVByb2plY3RPdXRwdXRDb250YWluZXIoSVByb2plY3QgcCkgewotCQlJUGF0aCBwYXRoID0gZ2V0SmF2YVByb2plY3RPdXRwdXRMb2NhdGlvbihwKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKQotCQkJcmV0dXJuIHA7Ci0JCXJldHVybiBwLmdldEZvbGRlcihwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYmluYXJ5IG91dHB1dCBhYnNvbHV0ZSAobG9jYWwgZmlsZSBzeXN0ZW0pIHBhdGguCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIHByb2plY3QncyBvdXRwdXQgcGF0aCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgamF2YSBwcm9qZWN0IG9yIHNvbWUgb3RoZXIgZXJyb3IuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhUHJvamVjdE91dHB1dEFic29sdXRlTG9jYXRpb24oSVByb2plY3QgcCkgewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldEphdmFQcm9qZWN0T3V0cHV0Q29udGFpbmVyKHApOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpCi0JCQlyZXR1cm4gY29udGFpbmVyLmdldExvY2F0aW9uKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgSkRUIEphdmFNb2RlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIEpEVCdzIEphdmFNb2RlbAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFNb2RlbCBnZXRKYXZhTW9kZWwoKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290cy4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2oKLQkgKiBAcmV0dXJuIHNvdXJjZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U291cmNlUGFja2FnZUZyYWdtZW50Um9vdHMoSUphdmFQcm9qZWN0IGphdmFQcm9qKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBqYXZhUHJvai5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcm9vdHNbaV07Ci0JCQlpZiAocm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpCi0JCQkJcmVzdWx0LmFkZChyb290KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgY2xhc3NwYXRoCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gcmVzCi0JICogICAgICAgICAgICByZXNvdXJjZQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKElQcm9qZWN0IHAsIElSZXNvdXJjZSByZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocmVzLmdldEZ1bGxQYXRoKCksIG51bGwsIG51bGwpOwotCQlyZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChwLCBlbnRyeSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBwYXRoIGZyb20gdGhlIGNsYXNzcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gcmVtb3ZlCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoSVByb2plY3QgcCwgSVBhdGggcGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIGYgPSBwLmdldEZpbGUocGF0aCk7Ci0JCXJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKHAsIGYpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgY2xhc3NwYXRoIGVudHJ5IGZyb20gdGhlIHByb2plY3QncyBjbGFzc3BhdGguCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiBAcGFyYW0gZW50cnkKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQl9Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChwcmltUmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoY2xhc3NwYXRoLCBlbnRyeSksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBsaXN0IG9mIGVudHJpZXMgZnJvbSB0aGUgY2xhc3NwYXRoIG9mIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHBhcmFtIGVudHJpZXMKLQkgKiAgICAgICAgICAgIGxpc3Qgb2YgSUNsYXNzUGF0aEVudHJ5J3MKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBMaXN0IGVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQl9Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChwcmltUmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoY2xhc3NwYXRoLCBlbnRyaWVzKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElDbGFzc3BhdGhFbnRyeVtdIHByaW1SZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlib29sZWFuIGRpZFJlbW92ZSA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGNwRW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQlpZiAoIWVudHJ5LmdldFBhdGgoKS5lcXVhbHMoY2xhc3NwYXRoW2ldLmdldFBhdGgoKSkpCi0JCQkJcmVzdWx0LmFkZChjcEVudHJ5KTsKLQkJCWVsc2UKLQkJCQlkaWRSZW1vdmUgPSB0cnVlOwotCQl9Ci0JCWlmICghZGlkUmVtb3ZlKQotCQkJcmV0dXJuIGNsYXNzcGF0aDsKLQkJcmV0dXJuIChJQ2xhc3NwYXRoRW50cnlbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBwcmltUmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBMaXN0IGVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlMaXN0IGFycmF5TGlzdCA9IEFycmF5cy5hc0xpc3QoY2xhc3NwYXRoKTsKLQkJTGlzdCByZW1vdmVhYmxlID0gbmV3IEFycmF5TGlzdChhcnJheUxpc3QpOwotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk7Ci0JCWJvb2xlYW4gZGlkUmVtb3ZlID0gZmFsc2U7Ci0JCWludCBzaXplID0gZW50cmllcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQllbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGVudHJpZXMuZ2V0KGkpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGFzc3BhdGgubGVuZ3RoOyBqKyspIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSA9IGNsYXNzcGF0aFtqXTsKLQkJCQlpZiAoZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhjbGFzc3BhdGhbal0uZ2V0UGF0aCgpKSkgewotCQkJCQlpZiAocmVtb3ZlYWJsZS5yZW1vdmUoY3BFbnRyeSkpCi0JCQkJCQlkaWRSZW1vdmUgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWRpZFJlbW92ZSkKLQkJCXJldHVybiBjbGFzc3BhdGg7Ci0JCXJldHVybiAoSUNsYXNzcGF0aEVudHJ5W10pIHJlbW92ZWFibGUudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W3JlbW92ZWFibGUuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzc3BhdGggYXMgYW4gYXJyYXkgb3IgVVJMJ3MuCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHJldHVybiBhcnJheSBvZiBVUkwncyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBqYXZhUHJvamVjdCB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkxbXSBnZXRDbGFzc3BhdGhBc1VSTEFycmF5KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTZXQgdmlzaXRlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoMjApOwotCQljb2xsZWN0Q2xhc3NwYXRoVVJMcyhqYXZhUHJvamVjdCwgdXJscywgdmlzaXRlZCwgdHJ1ZSk7Ci0JCVVSTFtdIHJlc3VsdCA9IG5ldyBVUkxbdXJscy5zaXplKCldOwotCQl1cmxzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbGxlY3RDbGFzc3BhdGhVUkxzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgTGlzdCB1cmxzLCBTZXQgdmlzaXRlZCwgYm9vbGVhbiBpc0ZpcnN0UHJvamVjdCkgewotCQlpZiAodmlzaXRlZC5jb250YWlucyhqYXZhUHJvamVjdCkpCi0JCQlyZXR1cm47Ci0JCXZpc2l0ZWQuYWRkKGphdmFQcm9qZWN0KTsKLQkJSVBhdGggb3V0UGF0aCA9IGdldEphdmFQcm9qZWN0T3V0cHV0QWJzb2x1dGVMb2NhdGlvbihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlvdXRQYXRoID0gb3V0UGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQlVUkwgb3V0ID0gUHJvamVjdFV0aWxpdGllcy5jcmVhdGVGaWxlVVJMKG91dFBhdGgpOwotCQl1cmxzLmFkZChvdXQpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOgotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgotCQkJCQljb2xsZWN0Q2xhc3NwYXRoRW50cnlVUkwoZW50cnksIHVybHMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDogewotCQkJCQlpZiAoaXNGaXJzdFByb2plY3QgfHwgZW50cnkuaXNFeHBvcnRlZCgpKQotCQkJCQkJY29sbGVjdENsYXNzcGF0aFVSTHMoZ2V0SmF2YVByb2plY3QoZW50cnkpLCB1cmxzLCB2aXNpdGVkLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdENsYXNzcGF0aEVudHJ5VVJMKElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgTGlzdCB1cmxzKSB7Ci0JCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCWlmIChudWxsID09IHBhdGguZ2V0RGV2aWNlKCkpIHsKLQkJCS8vIHdvcmtzcGFjZSByZXNvdXJjZSAtIGlzIHRoZSBJUGF0aCBhIGZpbGUsIGZvbGRlciwgb3IgYSBjbGFzcyBmb2xkZXIgd2hvc2UgbG9jYXRpb24gaXMgdGhlIHByb2plY3Qgcm9vdD8KLQkJCWlmKHBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJCS8vIEl0J3MgYSBjbGFzcyBmb2xkZXIgd2hvc2UgbG9jYXRpb24gaXMgdGhlIHByb2plY3Qgcm9vdAotCQkJCXBhdGggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC5sYXN0U2VnbWVudCgpKS5nZXRMb2NhdGlvbigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gSXQncyBhIGZpbGUgb3IgZm9sZGVyIC0gY2FwdHVyZSBpdCdzIGFic29sdXRlIGxvY2F0aW9uCi0JCQkJSUZpbGUgamFyRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQlpZihqYXJGaWxlLmV4aXN0cygpKXsKLQkJCQkJcGF0aCA9IGphckZpbGUuZ2V0TG9jYXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlVUkwgdXJsID0gUHJvamVjdFV0aWxpdGllcy5jcmVhdGVGaWxlVVJMKHBhdGgpOwotCQlpZiAodXJsICE9IG51bGwpCi0JCQl1cmxzLmFkZCh1cmwpOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlJUHJvamVjdCBwcm9qID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApKTsKLQkJaWYgKHByb2ogIT0gbnVsbCkKLQkJCXJldHVybiBnZXRKYXZhUHJvamVjdChwcm9qKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBwcm9qZWN0IGEgYmluYXJ5IHByb2plY3QuCi0JICogPHA+Ci0JICogVHlwaWNhbGx5IGEgSmF2YSBwcm9qZWN0IGlzIGNvbnNpZGVyZWQgYmluYXJ5IGlmIGl0IGRvZXMgbm90IGhhdmUgYSBzb3VyY2UgZW50cnkgaW4gdGhlIGNsYXNzcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgUHJvamVjdCB0byB0ZXN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwcm9qZWN0IGlzIGEgYmluYXJ5IHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmluYXJ5UHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQotCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChhUHJvamVjdCk7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVudHJpZXMgPSBqYXZhUHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRvIGphdmEgY2xhc3MgcGF0aC4KLQkgKiA8cD4KLQkgKiBBcHBlbmQgYSBsaXN0IG9mIElDbGFzc3BhdGhFbnRyeSdzIHRvIHRoZSBidWlsZCBwYXRoIG9mIHRoZSBwYXNzZWQgcHJvamVjdC4gVXBkYXRlZCB0byByZW1vdmUgZXhpc3Rpbmcgb2NjdXJyZW5jZXMgb2YgdGhlIHBhc3NlZCBlbnRyaWVzIGJlZm9yZQotCSAqIGFwcGVuZGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gYXBwZW5kQ2xhc3NwYXRoRW50cmllcwotCSAqICAgICAgICAgICAgbGlzdCBvZiBlbnRyaWVzCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBMaXN0IGFwcGVuZENsYXNzcGF0aEVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQl9Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCUxpc3QgbmV3UGF0aExpc3QgPSBuZXcgQXJyYXlMaXN0KGNsYXNzcGF0aC5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQkJLy8gU2tpcCBlbnRyaWVzIHdoaWNoIGFyZSBpbiB0aGUgYXBwZW5kIGxpc3QKLQkJCQlpZiAoYXBwZW5kQ2xhc3NwYXRoRW50cmllcy5pbmRleE9mKGVudHJ5KSA8IDApCi0JCQkJCW5ld1BhdGhMaXN0LmFkZChlbnRyeSk7Ci0JCQl9Ci0JCQluZXdQYXRoTGlzdC5hZGRBbGwoYXBwZW5kQ2xhc3NwYXRoRW50cmllcyk7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSAoSUNsYXNzcGF0aEVudHJ5W10pIG5ld1BhdGhMaXN0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtuZXdQYXRoTGlzdC5zaXplKCldKTsKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGNsYXNzcGF0aCBlbnRyeS4KLQkgKiA8cD4KLQkgKiBBcHBlbmQgb25lIElDbGFzc3BhdGhFbnRyeSB0byB0aGUgYnVpbGQgcGF0aCBvZiB0aGUgcGFzc2VkIHByb2plY3QuIElmIGEgY2xhc3NwYXRoIGVudHJ5IGhhdmluZyB0aGUgc2FtZSBwYXRoIGFzIHRoZSBwYXJhbWV0ZXIgYWxyZWFkeSBleGlzdHMsCi0JICogdGhlbiBkb2VzIG5vdGhpbmcuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBQcm9qZWN0Ci0JICogQHBhcmFtIG5ld0VudHJ5Ci0JICogICAgICAgICAgICBFbnRyeQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZEphdmFDbGFzc1BhdGgoSVByb2plY3QgcCwgSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QocCk7Ci0JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJTGlzdCBuZXdQYXRoTGlzdCA9IG5ldyBBcnJheUxpc3QoY2xhc3NwYXRoLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQkvLyBmaXggZHVwIGNsYXNzIHBhdGggZW50cnkgZm9yIC5KRVRFbWl0dGVyIHByb2plY3QKLQkJCS8vIFNraXAgdGhlIGVudHJ5IHRvIGJlIGFkZGVkIGlmIGl0IGFscmVhZHkgZXhpc3RzCi0JCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoUGxhdGZvcm0uT1NfV0lOMzIpKSB7Ci0JCQkJaWYgKCFlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKG5ld0VudHJ5LmdldFBhdGgoKS50b1N0cmluZygpKSkKLQkJCQkJbmV3UGF0aExpc3QuYWRkKGVudHJ5KTsKLQkJCQllbHNlCi0JCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKG5ld0VudHJ5LmdldFBhdGgoKSkpCi0JCQkJCW5ld1BhdGhMaXN0LmFkZChlbnRyeSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJbmV3UGF0aExpc3QuYWRkKG5ld0VudHJ5KTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gKElDbGFzc3BhdGhFbnRyeVtdKSBuZXdQYXRoTGlzdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3UGF0aExpc3Quc2l6ZSgpXSk7Ci0JCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc291cmNlIHBhdGggbWF0Y2hpbmcgdGhlIHBhcmFtZXRlcjsgaWYgdGhlIHBhcmFtZXRlciBpcyBudWxsLCBvciBpZiB0aGUgc291cmNlIGZvbGRlciBpcyBub3Qgb24gdGhlIGNsYXNzcGF0aCwgcmV0dXJuIHRoZSBmaXJzdAotCSAqIHNvdXJjZSBwYXRoIG9uIHRoZSBjbGFzc3BhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEBwYXJhbSBkZWZhdWx0U291cmNlTmFtZQotCSAqICAgICAgICAgICAgc291cmNlIGZvbGRlciB0byBmaW5kIGlmIG9uIGNsYXNzcGF0aCwgb3IgaWYgPGNvZGU+bnVsbDwvY29kZT4gdGhlIGZpcnN0IGZvbGRlcgotCSAqIEByZXR1cm4gcGF0aCBzZWFyY2hlZCBmb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBzb21lIG90aGVyIHByb2JsZW0uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRTb3VyY2VQYXRoT3JGaXJzdChJUHJvamVjdCBwLCBTdHJpbmcgZGVmYXVsdFNvdXJjZU5hbWUpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QocCk7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNwID0gamF2YVByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSkVNVXRpbFBsdWdpbi5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJQ2xhc3NwYXRoRW50cnkgZmlyc3RTb3VyY2UgPSBudWxsOwotCQlJUGF0aCBkZWZhdWx0U291cmNlUGF0aCA9IG51bGw7Ci0JCWlmIChkZWZhdWx0U291cmNlTmFtZSAhPSBudWxsKQotCQkJZGVmYXVsdFNvdXJjZVBhdGggPSBQcm9qZWN0VXRpbGl0aWVzLmNyZWF0ZVBhdGgocCwgZGVmYXVsdFNvdXJjZU5hbWUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY3BbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlpZiAoZmlyc3RTb3VyY2UgPT0gbnVsbCkgewotCQkJCQlmaXJzdFNvdXJjZSA9IGNwW2ldOwotCQkJCQlpZiAoZGVmYXVsdFNvdXJjZVBhdGggPT0gbnVsbCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY3BbaV0uZ2V0UGF0aCgpLmVxdWFscyhkZWZhdWx0U291cmNlUGF0aCkpCi0JCQkJCXJldHVybiBkZWZhdWx0U291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJfQotCQl9Ci0JCWlmIChmaXJzdFNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmaXJzdFNvdXJjZS5nZXRQYXRoKCkuc2VnbWVudCgwKS5lcXVhbHMocC5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGZpcnN0U291cmNlLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBIYWNrIHRvIGZvcmNlIGEgcmVsb2FkIG9mIHRoZSAuY2xhc3NwYXRoIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgcHJvamVjdCB0byByZWxvYWQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZm9yY2VDbGFzc3BhdGhSZWxvYWQoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCQlpZiAoamF2YVByb2ogIT0gbnVsbCkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qLnJlYWRSYXdDbGFzc3BhdGgoKTsKLQkJCWlmIChlbnRyaWVzICE9IG51bGwpIHsKLQkJCQlJUGF0aCBvdXRwdXQgPSBqYXZhUHJvai5yZWFkT3V0cHV0TG9jYXRpb24oKTsKLQkJCQlpZiAob3V0cHV0ICE9IG51bGwpCi0JCQkJCWphdmFQcm9qLnNldFJhd0NsYXNzcGF0aChlbnRyaWVzLCBvdXRwdXQsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwYXRocyBvZiBhbGwgb2YgdGhlIGxvY2FsIGphcnMgaW4gdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHByb2plY3QuIEl0IGRvZXMgbm90IHJlY3Vyc2UgaW50byByZWZlcmVuY2VkIHByb2plY3RzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qCi0JICogICAgICAgICAgICBwcm9qZWN0IHRvIHNlYXJjaCAoc2hvdWxkIGJlIGEgamF2YSBwcm9qZWN0KS4KLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBJUGF0aCwgd2hlcmUgZWFjaCBlbnRyeSBpcyBhIHByb2plY3QgcmVsYXRpdmUgcGF0aCB0byBhIEpBUiBjb250YWluZWQgaW4gdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldExvY2FsSkFSUGF0aHNGcm9tQ2xhc3NwYXRoKElQcm9qZWN0IHByb2opIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QocHJvaik7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gcHJvai5nZXRGdWxsUGF0aCgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgewotCQkJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCQlpbnQgc2VnbWVudHMgPSBwYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhwcm9qZWN0UGF0aCk7Ci0JCQkJCWlmIChzZWdtZW50cyA+IDApCi0JCQkJCQlyZXN1bHQuYWRkKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50cykpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc291cmNlIGZvbGRlciBtYXRjaGluZyB0aGUgcGFyYW1ldGVyOyBpZiB0aGUgcGFyYW1ldGVyIGlzIG51bGwsIG9yIGlmIHRoZSBzb3VyY2UgZm9sZGVyIGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoLCByZXR1cm4gdGhlIGZpcnN0Ci0JICogc291cmNlIGZvbGRlciBvbiB0aGUgY2xhc3NwYXRoCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gZGVmYXVsdFNvdXJjZU5hbWUKLQkgKiAgICAgICAgICAgIHNvdXJjZSBmb2xkZXIgdG8gZmluZCBpZiBvbiBjbGFzc3BhdGgsIG9yIGlmIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBmaXJzdCBmb2xkZXIKLQkgKiBAcmV0dXJuIGNvbnRhaW5lciBzZWFyY2hlZCBmb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBzb21lIG90aGVyIHByb2JsZW0uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIGdldFNvdXJjZUZvbGRlck9yRmlyc3QoSVByb2plY3QgcCwgU3RyaW5nIGRlZmF1bHRTb3VyY2VOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBzb3VyY2VQYXRoID0gZ2V0U291cmNlUGF0aE9yRmlyc3QocCwgZGVmYXVsdFNvdXJjZU5hbWUpOwotCQkJaWYgKHNvdXJjZVBhdGggPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWVsc2UgaWYgKHNvdXJjZVBhdGguaXNFbXB0eSgpKQotCQkJCXJldHVybiBwOwotCQkJZWxzZQotCQkJCXJldHVybiBwLmdldEZvbGRlcihzb3VyY2VQYXRoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIElGb2xkZXIgdGhhdCByZXByZXNlbnRzIGVhY2ggc291cmNlIGZvbGRlciBpbiBhIGphdmEgcHJvamVjdAotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFNvdXJjZUNvbnRhaW5lcnMoSVByb2plY3QpfWJlY2F1c2UgdGhlIHByb2plY3QgaXRzZWxmIG1pZ2h0IGJlIGEgc291cmNlIGNvbnRhaW5lcgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTb3VyY2VGb2xkZXJzKElQcm9qZWN0IHApIHsKLQkJdHJ5IHsKLQkJCUxpc3Qgc291cmNlRm9sZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3Qgc291cmNlUGF0aHMgPSBnZXRTb3VyY2VQYXRocyhwKTsKLQkJCWlmIChzb3VyY2VQYXRocyAhPSBudWxsICYmICFzb3VyY2VQYXRocy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVBhdGhzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIHNvdXJjZVBhdGhzLmdldChpKTsKLQkJCQkJaWYgKCFwYXRoLmlzRW1wdHkoKSkKLQkJCQkJCXNvdXJjZUZvbGRlcnMuYWRkKHAuZ2V0Rm9sZGVyKHBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc291cmNlRm9sZGVyczsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Ob0FTVFJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Ob0FTVFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Mjg1MjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvTm9BU1RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5JbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHVzZWQgZm9yIEFTVCBSZXNvbHV0aW9uLCBidXQgaXQgc2ltcGx5IHR1cm5zIE5hbWUgaW50byBQVE5hbWUuIFVzZWZ1bCB3aGVuCi0gKiBqdXN0IGNyZWF0aW5nIGEgcGFyc2UgdHJlZSB3aGVyZSB3ZSBrbm93IHRoZSBuYW1lcyBhcmUgb2sgYW5kIGp1c3QgdHlwZXMuIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb0FTVFJlc29sdmVyIGV4dGVuZHMgQVNUQm91bmRSZXNvbHZlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULlJlc29sdmVyI3Jlc29sdmVOYW1lKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lKQotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gcmVzb2x2ZU5hbWUoTmFtZSBuYW1lKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24gewotCQlyZXR1cm4gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUTmFtZShuYW1lLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuUmVzb2x2ZXIjcmVzb2x2ZVR5cGUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUpCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlVHlwZShUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUudG9TdHJpbmcoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciNyZXNvbHZlVHlwZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVUeXBlKE5hbWUgbmFtZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5hbWUudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L1BhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2U1OGE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L1BhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci0gCi0vKioKLSAqIENyZWF0ZSBhIHBhcnNlIHRyZWUgZnJvbSBhbiBBU1Qgbm9kZS4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUIGV4dGVuZHMgQVNUVmlzaXRvciB7Ci0JcHJvdGVjdGVkIGZpbmFsIFJlc29sdmVyIHJlc29sdmVyOwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbjsJLy8gRWFjaCB2aXNpdCAob3IgZW5kdmlzaXQpIHdpbGwgcHV0IGludG8gZXhwcmVzc2lvbiB0aGUgcmVzdWx0IG9mIHRoZSB2aXNpdCBpZiBpdCBwcm9kdWNlZCBhbiBleHByZXNzaW9uLgotCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgdXNlZCBieSBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QgdG8gcmVzb2x2ZSB0aGUgdHlwZXMgdG8gdGhlIGFwcHJvcHJpYXRlCi0JICogdHlwZXMgKGUuZy4gIlN0cmluZyIgdG8gImphdmEubGFuZy5TdHJpbmciKS4gCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBSZXNvbHZlciB7Ci0JCQotCQkvKioKLQkJICogUmVzb2x2ZSB0aGUgTmFtZS4gSXQgY2FuIHJldHVybiBlaXRoZXIgYSBQVE5hbWUgaWYgaXQgaXMganVzdCBhIGNsYXNzbmFtZSwKLQkJICogb3IgYSBQVEZpZWxkQWNjZXNzIGlmIGl0IHJlc29sdmVzIHRvIGEgUFRGaWVsZEFjY2Vzcy4gVGhlIFBURmllbGRBY2Nlc3Mgc2hvdWxkCi0JCSAqIGJlIGNvbXBsZXRlLiBlLmcgd2UgaGF2ZSBjbGFzcyBsaWtlOgotCQkgKiA8Y29kZT4KLQkJICogCXBhY2thZ2UgeHl6OyAKLQkJICogCXB1YmxpYyBjbGFzcyBBQ2xhc3MgewotCQkgKiAJCXB1YmxpYyBqYXZhLmF3dC5SZWN0YW5nbGUgcmVjdDsKLQkJICogCX0gCi0JCSAqIDwvY29kZT4KLQkJICogVGhlbiBhIE5hbWUgbGlrZSA8Y29kZT5BQ2xhc3MucmVjdC54PC9jb2RlPiBzaG91bGQgcmVzb2x2ZSB0bzoKLQkJICogCi0JCSAqIFBURmllbGRBY2Nlc3M6Ci0JCSAqIAlyZWNlaXZlcjogCi0JCSAqIAkJUFRGaWVsZEFjY2VzcwotCQkgKiAJCQlyZWNlaXZlcjogeHl6LkFDbGFzcwotCQkgKiAJCQlmaWVsZDogInJlY3QiCi0JCSAqIAlmaWVsZDogIngiCi0JCSAqCi0JCSAqIEFjdHVhbGx5IGl0IGNhbiByZXR1cm4gYW55IHZhbGlkIGV4cHJlc3Npb24gdGhhdCBoYXMgYSB2YWx1ZSAoaS5lLiBpdCBjYW5ub3QgYmUgYSBtZXRob2QgaW52b2NhdGlvbiB3aXRoIGEgPGNvZGU+dm9pZDwvY29kZT4gcmV0dXJuIHR5cGUpLiAKLQkJICogCi0JCSAqIEBwYXJhbSBuYW1lCi0JCSAqIEByZXR1cm4gRWl0aGVyIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUgKGFzIGEgUFROYW1lKSBvciBhIFBURmllbGRBY2Nlc3MsIGFueSBvdGhlciB0eXBlIG9mIGV4cHJlc3Npb24uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCBQVEV4cHJlc3Npb24gcmVzb2x2ZU5hbWUoTmFtZSBuYW1lKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb247Ci0JCQotCQkvKioKLQkJICogUmVzb2x2ZSB0aGUgdHlwZS4gSWYgaXQgaXMgYW4gYXJyYXkgdHlwZSByZXR1cm4gaXQgaW4gZm9ybWF0ICJ0eXBlW11bXSIuCi0JCSAqIAotCQkgKiBAcGFyYW0gdHlwZQotCQkgKiBAcmV0dXJuIFRoZSB0eXBlIG5hbWUsIGluY2x1ZGluZyBicmFja2V0cyBpZiBhcnJheSB0eXBlLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHJlc29sdmVUeXBlKFR5cGUgdHlwZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotCQkKLQkJLyoqCi0JCSAqIFRoaXMgaXMgZm9yIHJlc29sdmluZyAidGhpcyIgbGl0ZXJhbC4gSXQgc2hvdWxkIGVpdGhlciByZXR1cm4gYSBQVFRoaXNMaXRlcmFsLCBpZiBpdAotCQkgKiBjYW4ndCBkbyByZXNvbHZlLCBvciBzb21lIFBURXhwcmVzc2lvbiB0aGF0IGNhbiByZXNvbHZlIHRvICJ0aGlzIiBmb3IgZXZhbHVhdGlvbi4KLQkJICogCi0JCSAqIEByZXR1cm4gSWYgcmVzb2x2YWJsZSwgYSBQVEV4cHJlc3Npb24sIGVsc2UgYSBQVFRoaXNMaXRlcmFsIGlmIG5vdCByZXNvbHZhYmxlLgotCQkgKiBAdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCBQVEV4cHJlc3Npb24gcmVzb2x2ZVRoaXMoKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb247Ci0JCQotCQkvKioKLQkJICogUmVzb2x2ZSB0aGUgdHlwZSBzcGVjaWZpZWQgYXMgYSBOYW1lLiBJdCBtYXkgYmUgYSBzaW1wbGUgbmFtZSBvciBpdCBtYXkgYmUKLQkJICogYSBxdWFsaWZpZWQgbmFtZS4gVGhpcyBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBOYW1lIHRoYXQgd2Uga25vdyBtdXN0IGJlIGEKLQkJICogdHlwZS4gVGhpcyBpcyBzbyB0aGF0IHRoZXJlIGlzIG5vIGNvbmZ1c2lvbiB3aXRoIGl0IHBvc3NpYmx5IGJlaW5nIGEgZmllbGQgb3IgdmFyaWFibGUKLQkJICogdGhhdCBoYXMgdGhlIHNhbWUgY2FzZSBhbmQgc3BlbGxpbmcgYXMgYSB0eXBlIG5hbWUuCi0JCSAqIEBwYXJhbSBuYW1lCi0JCSAqIEByZXR1cm4gdGhlIHR5cGUgbmFtZS4KLQkJICogQHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHJlc29sdmVUeXBlKE5hbWUgbmFtZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotCQkKLQkJLyoqCi0JCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgcmVzb2x2ZXIgaWYgaXQgY2FuJ3QgcmVzb2x2ZSBmb3Igc29tZSByZWFzb24uIFRoaXMgd2lsbCB0aHJvdwotCQkgKiBhbiBpbnZhbGlkIGV4cHJlc3Npb24gZXhjZXB0aW9uIHdoaWNoIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULgotCQkgKiAKLQkJICogQHBhcmFtIG1zZyBNZXNzYWdlIHRvIGJlIHB1dCBpbnRvIHRoZSBleGNlcHRpb24uCi0JCSAqIEB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHJvdGVjdGVkIGZpbmFsIHZvaWQgdGhyb3dJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbihTdHJpbmcgbXNnKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24gewotCQkJdGhyb3cgbmV3IEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBXaGVuIGFuIGludmFsaWQgZXhwcmVzc2lvbiBoYXMgYmVlbiBmb3VuZCB0aGlzIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duLiBJdCB3aWxsCi0JICogYmUgY2F1Z2h0IGF0IHRoZSB0b3AgYW5kIGNvbnZlcnRlZCBpbnRvIGFuIEludmFsaWRFeHByZXNzaW9uIGFuZCB0aGUgcmVzdCBvZiB0aGUgcGFyc2UgdHJlZSB3aWxsIGJlCi0JICogdGhyb3duIGF3YXkuIAotCSAqIAotCSAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgYSBtZXNzYWdlIGFzIHRvIHdoeSBpdCBpcyBpbnZhbGlkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQkKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI0Mjk4NDU2MzE5MTUyMDY2NzhMOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gcyBUaGUgbWVzc2FnZSB0byBiZSB1c2VkIGluIHRoZSBmaW5hbCBpbnZhbGlkIGV4cHJlc3Npb24uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbihTdHJpbmcgcykgewotCQkJc3VwZXIocyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCB0aGUgZ2l2ZW4gcmVzb2x2ZXIuCi0JICogCi0JICogQHBhcmFtIHJlc29sdmVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVChSZXNvbHZlciByZXNvbHZlcikgewotCQl0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgQVNUIEV4cHJlc3Npb24gYW5kIHJldHVybiBhIFBURXhwcmVzc2lvbi4gSWYgYW55IHBhcnQgd2FzIGludmFsaWQsIHRoZW4KLQkgKiBvbmx5IGFuIFBUSW52YWxpZEV4cHJlc3Npb24gd2lsbCBiZSByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gYXN0RXhwcmVzc2lvbgotCSAqIEByZXR1cm4gVGhlIFBURXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgUFRFeHByZXNzaW9uIGNyZWF0ZUV4cHJlc3Npb24oRXhwcmVzc2lvbiBhc3RFeHByZXNzaW9uKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcGVyZm9ybShhc3RFeHByZXNzaW9uKTsKLQkJfSBjYXRjaCAoSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24gZSkgewotCQkJLy8gQ3JlYXRlIGEgbXNnIHRoYXQgaXMgZm9ybWVkIG9mIHRoZSBleGNlcHRpb24gbWVzc2FnZSBhbmQgdGhlIGZ1bGwgaW5pdCBzdHJpbmcuCi0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF8wLCBuZXcgT2JqZWN0W10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBhc3RFeHByZXNzaW9uLnRvU3RyaW5nKCl9KTsgCi0JCQlQVEludmFsaWRFeHByZXNzaW9uIGV4cCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEludmFsaWRFeHByZXNzaW9uKCk7Ci0JCQlleHAuc2V0TWVzc2FnZShtc2cpOwotCQkJcmV0dXJuIGV4cDsKLQkJfQkKLQl9Ci0JCi0JLyoKLQkgKiBWaXNpdCB0aGUgQVNUIGV4cHJlc3Npb24gYW5kIGdldCB0aGUgUGFyc2VUcmVlIEV4cHJlc3Npb24uCi0JICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBpbmRpdmlkdWFsIHZpc2l0cyB3aGVuIHBhcnNpbmcgYSB0cmVlLgotCSAqIEl0IHBhc3NlcyB0byB0aGUgdG9wIG1ldGhvZCAoY3JlYXRlRXhwcmVzc2lvbiksIHdoaWNoIGNhbgotCSAqIGhhbmRsZSB0aGUgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24uCi0JICogCi0JICogSWYgYW55IHZpc2l0IGRvZXNuJ3QgcmV0dXJuIGFuIGV4cHJlc3Npb24sIHRoZW4gYW4gaW52YWxpZAotCSAqIGV4cHJlc3Npb24gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIHRvIGluZGljYXRlIHRoaXMuIElmIHRoZQotCSAqIGluY29taW5nIGV4cHJlc3Npb24gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gcmV0dXJuIG9mIDxjb2RlPm51bGw8L2NvZGU+IGlzIG9rIGJlY2F1c2UKLQkgKiB0aGlzIHdvdWxkIGJlIGZvciBhbiBvcHRpb25hbCBleHByZXNzaW9uIHdoaWNoIGRpZG4ndCBleGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXcgUGFyc2VUcmVlIEV4cHJlc3Npb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaW5jb21pbmcgZXhwcmVzc2lvbiB3YXMgbnVsbC4gCi0JICogCi0JICogQHNlZSBjcmVhdGVFeHByZXNzaW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uKQotCSAqIEBleGNlcHRpb24gSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUFRFeHByZXNzaW9uIHBlcmZvcm0oRXhwcmVzc2lvbiBhc3RFeHByZXNzaW9uKSB7Ci0JCWlmIChhc3RFeHByZXNzaW9uICE9IG51bGwpIHsKLQkJCWV4cHJlc3Npb24gPSBudWxsOwotCQkJYXN0RXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7Ci0JCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKQotCQkJCXRocm93IG5ldyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChXb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX0V4cHJlc3Npb25Ub29Db21wbGljYXRlZF9FWENfLCBuZXcgT2JqZWN0W10ge2FzdEV4cHJlc3Npb24udG9TdHJpbmcoKX0pKTsgCi0JCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsJLy8gVGhpcyBpcyBvay4gSXQgbWVhbnMgYW4gb3B0aW9uYWwgZXhwcmVzc2lvbiB3YXMgYmVpbmcgcHJvY2Vzc2VkIGFuZCB0aGUgZXhwcmVzc2lvbiBkaWRuJ3QgZXhpc3QuCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5QWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJUFRBcnJheUFjY2VzcyBhYSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEFycmF5QWNjZXNzKCk7Ci0JCUxpc3QgaW5kZXhlcyA9IGFhLmdldEluZGV4ZXMoKTsKLQkJRXhwcmVzc2lvbiBhcnJheUV4cCA9IG5vZGU7Ci0JCXdoaWxlIChhcnJheUV4cC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfQUNDRVNTKSB7Ci0JCQkvLyBWaXNpdCB0aGUgaW5kZXggdG8gZ2V0IHRoZSBpbmRleCBleHByZXNzaW9uLgotCQkJQXJyYXlBY2Nlc3MgYXJyYXkgPSAoQXJyYXlBY2Nlc3MpIGFycmF5RXhwOyAKLQkJCWluZGV4ZXMuYWRkKDAsIHBlcmZvcm0oYXJyYXkuZ2V0SW5kZXgoKSkpOwkvLyBXZSdyZSB0cnlpbmcgdG8gY3JlYXRlIHRoZSBmaW5hbCBleHByZXNzaW9uIGZyb20gaW5zaWRlIG91dCwgdGhlIGluZGV4ZXMgYXJlIGNyZWF0ZWQgaW4gcmV2ZXJzZSBvcmRlci4KLQkJCWFycmF5RXhwID0gYXJyYXkuZ2V0QXJyYXkoKTsKLQkJfQotCQlhYS5zZXRBcnJheShwZXJmb3JtKGFycmF5RXhwKSk7CS8vIEZpbmFsIGFycmF5RXhwIGlzIHRoZSB0cnVlIGV4cHJlc3Npb24uCi0JCWV4cHJlc3Npb24gPSBhYTsJLy8gU2V0IHRoZSByZXR1cm4gZXhwcmVzc2lvbiBmb3IgdGhpcyB2aXNpdC4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlDcmVhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUNyZWF0aW9uIG5vZGUpIHsKLQkJUFRBcnJheUNyZWF0aW9uIGFjID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQXJyYXlDcmVhdGlvbigpOwotCQlhYy5zZXRUeXBlKHJlc29sdmVyLnJlc29sdmVUeXBlKG5vZGUuZ2V0VHlwZSgpKSk7Ci0JCUxpc3QgYWNEaW1zID0gYWMuZ2V0RGltZW5zaW9ucygpOwotCQlMaXN0IG5EaW1zID0gbm9kZS5kaW1lbnNpb25zKCk7Ci0JCWludCBuc2l6ZSA9IG5EaW1zLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuc2l6ZTsgaSsrKSB7Ci0JCQlhY0RpbXMuYWRkKHBlcmZvcm0oKEV4cHJlc3Npb24pIG5EaW1zLmdldChpKSkpOwotCQl9Ci0JCWFjLnNldEluaXRpYWxpemVyKChQVEFycmF5SW5pdGlhbGl6ZXIpIHBlcmZvcm0obm9kZS5nZXRJbml0aWFsaXplcigpKSk7Ci0JCWV4cHJlc3Npb24gPSBhYzsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewotCQlQVEFycmF5SW5pdGlhbGl6ZXIgYWkgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRBcnJheUluaXRpYWxpemVyKCk7Ci0JCUxpc3QgZXhwcyA9IG5vZGUuZXhwcmVzc2lvbnMoKTsKLQkJTGlzdCBhaWV4cHMgPSBhaS5nZXRFeHByZXNzaW9ucygpOwotCQlpbnQgbmV4cCA9IGV4cHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHA7IGkrKykgewotCQkJYWlleHBzLmFkZChwZXJmb3JtKChFeHByZXNzaW9uKSBleHBzLmdldChpKSkpOwotCQl9Ci0JCWV4cHJlc3Npb24gPSBhaTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bc3NpZ25tZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFzc2lnbm1lbnQgbm9kZSkgewotCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGNhbid0IGhhbmRsZSBhc3NpZ25tZW50LgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCVBUQm9vbGVhbkxpdGVyYWwgYmwgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRCb29sZWFuTGl0ZXJhbCgpOwotCQlibC5zZXRCb29sZWFuVmFsdWUobm9kZS5ib29sZWFuVmFsdWUoKSk7Ci0JCWV4cHJlc3Npb24gPSBibDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DYXN0RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCVBUQ2FzdEV4cHJlc3Npb24gY3QJPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRDYXN0RXhwcmVzc2lvbigpOwotCQljdC5zZXRUeXBlKHJlc29sdmVyLnJlc29sdmVUeXBlKG5vZGUuZ2V0VHlwZSgpKSk7Ci0JCWN0LnNldEV4cHJlc3Npb24ocGVyZm9ybShub2RlLmdldEV4cHJlc3Npb24oKSkpOwotCQlleHByZXNzaW9uID0gY3Q7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2hhcmFjdGVyTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJUFRDaGFyYWN0ZXJMaXRlcmFsIGNsID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbCgpOwotCQljbC5zZXRFc2NhcGVkVmFsdWUobm9kZS5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JCWNsLnNldENoYXJWYWx1ZShub2RlLmNoYXJWYWx1ZSgpKTsKLQkJZXhwcmVzc2lvbiA9IGNsOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNsYXNzSW5zdGFuY2VDcmVhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewotCQlpZiAobm9kZS5nZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCkgIT0gbnVsbCkgeyAKLQkJCVBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhZGVjbCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCWFkZWNsLnNldERlY2xhcmF0aW9uKG5vZGUudG9TdHJpbmcoKSk7Ci0JCQlleHByZXNzaW9uID0gYWRlY2w7Ci0JCX0gZWxzZSB7Ci0JCQlQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjaWMgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJCS8vIElmIGFzdCBsZXZlbCA9IDIsIHRoZW4geW91IG11c3QgdXNlIGdldE5hbWUsIGJ1dCB0aGUgbmFtZSBuZWVkcyB0byBiZSB0dXJuZWQgaW50byBhIHR5cGUKLQkJCS8vIHNvIHRoYXQgaXQgY2FuIGJlIHJlc29sdmVkLiBJZiBhc3QgbGV2ZWwgPiAyLCB0aGVuIGl0IHdpbGwgcmV0dXJuIGEgdHlwZSB0byBiZSByZXNvbHZlZC4KLQkJCS8vIE5vdGU6IGNhbid0IGp1c3QgdXNlIHJlc29sdmUgbmFtZSBvbiB0aGUgbmFtZSBiZWNhdXNlIGlmIGEgZmllbGQgYW5kIGEgY2xhc3Mgd2VyZSBzcGVsbGVkCi0JCQkvLyB0aGUgc2FtZSB0aGVuIHRoZSBjb2RlZ2VuIHJlc29sdmVyIHdvdWxkIHJldHVybiBhbiBpbnN0YW5jZSByZWYgdG8gdGhlIGZpZWxkIGluc3RlYWQuCi0JCQlTdHJpbmcgdHlwZSA9IG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBBU1QuSkxTMiA/IHJlc29sdmVyLnJlc29sdmVUeXBlKG5vZGUuZ2V0TmFtZSgpKSA6IHJlc29sdmVyLnJlc29sdmVUeXBlKG5vZGUuZ2V0VHlwZSgpKTsKLQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQl0eXBlID0gbm9kZS5nZXRBU1QoKS5hcGlMZXZlbCgpID09IEFTVC5KTFMyID8gbm9kZS5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgOiBub2RlLmdldFR5cGUoKS50b1N0cmluZygpOwotCQkJfQotCQkJY2ljLnNldFR5cGUodHlwZSk7Ci0JCQlMaXN0IGFyZ3MgPSBjaWMuZ2V0QXJndW1lbnRzKCk7Ci0JCQlMaXN0IG5hcmdzID0gbm9kZS5hcmd1bWVudHMoKTsKLQkJCWludCBuc2l6ZSA9IG5hcmdzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnNpemU7IGkrKykgewotCQkJCWFyZ3MuYWRkKHBlcmZvcm0oKEV4cHJlc3Npb24pIG5hcmdzLmdldChpKSkpOwotCQkJfQotCQkJZXhwcmVzc2lvbiA9IGNpYzsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db25kaXRpb25hbEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJUFRDb25kaXRpb25hbEV4cHJlc3Npb24gY2UgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQkJY2Uuc2V0Q29uZGl0aW9uKHBlcmZvcm0obm9kZS5nZXRFeHByZXNzaW9uKCkpKTsKLQkJY2Uuc2V0VHJ1ZShwZXJmb3JtKG5vZGUuZ2V0VGhlbkV4cHJlc3Npb24oKSkpOwotCQljZS5zZXRGYWxzZShwZXJmb3JtKG5vZGUuZ2V0RWxzZUV4cHJlc3Npb24oKSkpOwotCQlleHByZXNzaW9uID0gY2U7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGRBY2Nlc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRmllbGRBY2Nlc3Mgbm9kZSkgewotCQlleHByZXNzaW9uID0gY3JlYXRlRmllbGRBY2Nlc3Mobm9kZS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLCBwZXJmb3JtKG5vZGUuZ2V0RXhwcmVzc2lvbigpKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBjcmVhdGVGaWVsZEFjY2VzcyhTdHJpbmcgbmFtZSwgUFRFeHByZXNzaW9uIHJlY2VpdmVyKSB7Ci0JCVBURmllbGRBY2Nlc3MgZmEgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRGaWVsZEFjY2VzcygpOwotCQlmYS5zZXRSZWNlaXZlcihyZWNlaXZlcik7Ci0JCWZhLnNldEZpZWxkKG5hbWUpOwotCQlyZXR1cm4gZmE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBpbmZpeE9wZXJUb1BhcnNlT3BlcjsKLQlwcml2YXRlIGZpbmFsIFBUSW5maXhPcGVyYXRvciBnZXRQYXJzZUluZml4KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvcikgewotCQlpZiAocHJlZml4T3BlclRvUGFyc2VPcGVyID09IG51bGwpIHsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyID0gbmV3IEhhc2hNYXAoNSk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkFORCwgUFRJbmZpeE9wZXJhdG9yLkFORF9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuQ09ORElUSU9OQUxfQU5ELCBQVEluZml4T3BlcmF0b3IuQ09ORElUSU9OQUxfQU5EX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5DT05ESVRJT05BTF9PUiwgUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX09SX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5ESVZJREUsIFBUSW5maXhPcGVyYXRvci5ESVZJREVfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkVRVUFMUywgUFRJbmZpeE9wZXJhdG9yLkVRVUFMU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuR1JFQVRFUl9FUVVBTFMsIFBUSW5maXhPcGVyYXRvci5HUkVBVEVSX0VRVUFMU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuR1JFQVRFUiwgUFRJbmZpeE9wZXJhdG9yLkdSRUFURVJfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFRlRfU0hJRlQsIFBUSW5maXhPcGVyYXRvci5MRUZUX1NISUZUX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5MRVNTX0VRVUFMUywgUFRJbmZpeE9wZXJhdG9yLkxFU1NfRVFVQUxTX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5MRVNTLCBQVEluZml4T3BlcmF0b3IuTEVTU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMsIFBUSW5maXhPcGVyYXRvci5NSU5VU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTk9UX0VRVUFMUywgUFRJbmZpeE9wZXJhdG9yLk5PVF9FUVVBTFNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk9SLCBQVEluZml4T3BlcmF0b3IuT1JfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMsIFBUSW5maXhPcGVyYXRvci5QTFVTX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SRU1BSU5ERVIsIFBUSW5maXhPcGVyYXRvci5SRU1BSU5ERVJfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlJJR0hUX1NISUZUX1NJR05FRCwgUFRJbmZpeE9wZXJhdG9yLlJJR0hUX1NISUZUX1NJR05FRF9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORUQsIFBUSW5maXhPcGVyYXRvci5SSUdIVF9TSElGVF9VTlNJR05FRF9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuVElNRVMsIFBUSW5maXhPcGVyYXRvci5USU1FU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuWE9SLCBQVEluZml4T3BlcmF0b3IuWE9SX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiAoUFRJbmZpeE9wZXJhdG9yKSBpbmZpeE9wZXJUb1BhcnNlT3Blci5nZXQob3BlcmF0b3IpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW5maXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KEluZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCVBUSW5maXhFeHByZXNzaW9uIGluZiA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEluZml4RXhwcmVzc2lvbigpOwotCQlpbmYuc2V0TGVmdE9wZXJhbmQocGVyZm9ybShub2RlLmdldExlZnRPcGVyYW5kKCkpKTsKLQkJUFRJbmZpeE9wZXJhdG9yIGlub3BlciA9IGdldFBhcnNlSW5maXgobm9kZS5nZXRPcGVyYXRvcigpKTsKLQkJaWYgKGlub3BlciA9PSBudWxsKSB7Ci0JCQkvLyBJdCBpcyBub3Qgb25lIHdlIGNhbiBoYW5kbGUuCi0JCQl0aHJvdyBuZXcgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oCi0JCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfT3BlcmF0b3JUb29Db21wbGljYXRlZFRvSGFuZGxlX0VYQ18sIG5ldyBPYmplY3RbXSB7IG5vZGUuZ2V0T3BlcmF0b3IoKS50b1N0cmluZygpIH0pKTsgCi0JCX0KLQkJaW5mLnNldE9wZXJhdG9yKGlub3Blcik7Ci0JCWluZi5zZXRSaWdodE9wZXJhbmQocGVyZm9ybShub2RlLmdldFJpZ2h0T3BlcmFuZCgpKSk7Ci0JCUxpc3QgZW9wcyA9IGluZi5nZXRFeHRlbmRlZE9wZXJhbmRzKCk7Ci0JCUxpc3QgbmVvcHMgPSBub2RlLmV4dGVuZGVkT3BlcmFuZHMoKTsKLQkJaW50IG5zaXplID0gbmVvcHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5zaXplOyBpKyspIHsKLQkJCWVvcHMuYWRkKHBlcmZvcm0oKEV4cHJlc3Npb24pIG5lb3BzLmdldChpKSkpOwotCQl9Ci0JCWV4cHJlc3Npb24gPSBpbmY7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW5zdGFuY2VvZkV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSkgewotCQlQVEluc3RhbmNlb2YgaW5vZiA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEluc3RhbmNlb2YoKTsKLQkJaW5vZi5zZXRPcGVyYW5kKHBlcmZvcm0obm9kZS5nZXRMZWZ0T3BlcmFuZCgpKSk7Ci0JCWlub2Yuc2V0VHlwZShyZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldFJpZ2h0T3BlcmFuZCgpKSk7Ci0JCWV4cHJlc3Npb24gPSBpbm9mOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBvc3RmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBjYW4ndCBoYW5kbGUgcG9zdCBmaXguCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSBjcmVhdGVNZXRob2RJbnZvY2F0aW9uKG5vZGUuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSwgcGVyZm9ybShub2RlLmdldEV4cHJlc3Npb24oKSksIG5vZGUuYXJndW1lbnRzKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbWV0aG9kIGludm9jYXRpb24gdXNpbmcgdGhlIGdpdmluZyByZWNlaXZlciwgbmFtZSwgYXJncy4KLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgUFRNZXRob2RJbnZvY2F0aW9uIGNyZWF0ZU1ldGhvZEludm9jYXRpb24oU3RyaW5nIG5hbWUsIFBURXhwcmVzc2lvbiByZWNlaXZlciwgTGlzdCBhcmdFeHByZXNzaW9ucykgewotCQlQVE1ldGhvZEludm9jYXRpb24gbWkgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCW1pLnNldFJlY2VpdmVyKHJlY2VpdmVyKTsKLQkJbWkuc2V0TmFtZShuYW1lKTsKLQkJTGlzdCBhcmdzID0gbWkuZ2V0QXJndW1lbnRzKCk7Ci0JCWludCBuc2l6ZSA9IGFyZ0V4cHJlc3Npb25zLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuc2l6ZTsgaSsrKSB7Ci0JCQlhcmdzLmFkZChwZXJmb3JtKChFeHByZXNzaW9uKSBhcmdFeHByZXNzaW9ucy5nZXQoaSkpKTsKLQkJfQotCQlyZXR1cm4gbWk7Ci0JfQotCQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bGxMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJZXhwcmVzc2lvbiA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVE51bGxMaXRlcmFsKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJUFROdW1iZXJMaXRlcmFsIG5sID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUTnVtYmVyTGl0ZXJhbCgpOwotCQlubC5zZXRUb2tlbihub2RlLmdldFRva2VuKCkpOwotCQlleHByZXNzaW9uID0gbmw7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFyZW50aGVzaXplZEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCQlQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHBlID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQkJcGUuc2V0RXhwcmVzc2lvbihwZXJmb3JtKG5vZGUuZ2V0RXhwcmVzc2lvbigpKSk7Ci0JCWV4cHJlc3Npb24gPSBwZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEhhc2hNYXAgcHJlZml4T3BlclRvUGFyc2VPcGVyOwotCXByaXZhdGUgZmluYWwgUFRQcmVmaXhPcGVyYXRvciBnZXRQYXJzZVByZWZpeChQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yIG9wZXJhdG9yKSB7Ci0JCWlmIChwcmVmaXhPcGVyVG9QYXJzZU9wZXIgPT0gbnVsbCkgewotCQkJcHJlZml4T3BlclRvUGFyc2VPcGVyID0gbmV3IEhhc2hNYXAoNSk7Ci0JCQlwcmVmaXhPcGVyVG9QYXJzZU9wZXIucHV0KFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuQ09NUExFTUVOVCwgUFRQcmVmaXhPcGVyYXRvci5DT01QTEVNRU5UX0xJVEVSQUwpOwotCQkJcHJlZml4T3BlclRvUGFyc2VPcGVyLnB1dChQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLk1JTlVTLCBQVFByZWZpeE9wZXJhdG9yLk1JTlVTX0xJVEVSQUwpOwotCQkJcHJlZml4T3BlclRvUGFyc2VPcGVyLnB1dChQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLk5PVCwgUFRQcmVmaXhPcGVyYXRvci5OT1RfTElURVJBTCk7Ci0JCQlwcmVmaXhPcGVyVG9QYXJzZU9wZXIucHV0KFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUywgUFRQcmVmaXhPcGVyYXRvci5QTFVTX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiAoUFRQcmVmaXhPcGVyYXRvcikgcHJlZml4T3BlclRvUGFyc2VPcGVyLmdldChvcGVyYXRvcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QcmVmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlpZiAobm9kZS5nZXRPcGVyYW5kKCkuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk5VTUJFUl9MSVRFUkFMKSB7Ci0JCQkvLyBGb3IgbnVtYmVyIGxpdGVyYWxzIHdlIHNlZSBpZiBpdCBpcyBhICIrIiBvciAiLSIgcHJlZml4LCBhbmQgaWYgaXQgaXMsIHdlIHNpbXBseQotCQkJLy8gY3JlYXRlIGEgUFROdW1iZXJMaXRlcmFsIHdpdGggdGhlIG9wZXJhdG9yIGFscmVhZHkgaW4gaXQuIEl0IGlzIGEgc2ltcGxpZmljYXRpb24uCi0JCQkvLyBBbnkgb3RoZXIgb3BlcmF0b3Igd2UndmUgbGVmdCBhbG9uZSBzaW5jZSB0aG9zZSB3b24ndCBiZSBkZWNvZGVkIHNpbXBseSBieSB0aGUKLQkJCS8vIE51bWJlciBkZWNvZGVyLgotCQkJLy8gSWYgbm90IGEgbnVtYmVyIGxpdGVyYWwsIHRoZW4gbGVhdmUgYWxvbmUgc2luY2UgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhIHByZWZpeAotCQkJLy8gb3BlcmF0aW9uLgotCQkJUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvciA9IG5vZGUuZ2V0T3BlcmF0b3IoKTsKLQkJCWlmIChvcGVyYXRvciA9PSBQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMgfHwgb3BlcmF0b3IgPT0gUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5NSU5VUykgewotCQkJCVBUTnVtYmVyTGl0ZXJhbCBubSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVE51bWJlckxpdGVyYWwoKTsKLQkJCQlubS5zZXRUb2tlbihvcGVyYXRvci50b1N0cmluZygpICsgKChOdW1iZXJMaXRlcmFsKSBub2RlLmdldE9wZXJhbmQoKSkuZ2V0VG9rZW4oKSk7Ci0JCQkJZXhwcmVzc2lvbiA9IG5tOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCVBUUHJlZml4RXhwcmVzc2lvbiBwZSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVFByZWZpeEV4cHJlc3Npb24oKTsKLQkJUFRQcmVmaXhPcGVyYXRvciBwdG9wZXIgPSBnZXRQYXJzZVByZWZpeChub2RlLmdldE9wZXJhdG9yKCkpOwotCQlpZiAocHRvcGVyID09IG51bGwpIHsKLQkJCS8vIEl0IGlzIG5vdCBvbmUgd2UgY2FuIGhhbmRsZS4KLQkJCXRocm93IG5ldyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbigKLQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChXb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX09wZXJhdG9yVG9vQ29tcGxpY2F0ZWRUb0hhbmRsZV9FWENfLCBuZXcgT2JqZWN0W10geyBub2RlLmdldE9wZXJhdG9yKCkudG9TdHJpbmcoKSB9KSk7IAotCQl9Ci0JCXBlLnNldE9wZXJhdG9yKHB0b3Blcik7Ci0JCXBlLnNldEV4cHJlc3Npb24ocGVyZm9ybShub2RlLmdldE9wZXJhbmQoKSkpOwotCQlleHByZXNzaW9uID0gcGU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChRdWFsaWZpZWROYW1lIG5vZGUpIHsKLQkJZXhwcmVzc2lvbiA9IHJlc29sdmVyLnJlc29sdmVOYW1lKG5vZGUpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbXBsZU5hbWUgbm9kZSkgewotCQlleHByZXNzaW9uID0gcmVzb2x2ZXIucmVzb2x2ZU5hbWUobm9kZSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJUFRTdHJpbmdMaXRlcmFsIHNsID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUU3RyaW5nTGl0ZXJhbCgpOwotCQlzbC5zZXRFc2NhcGVkVmFsdWUobm9kZS5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JCXNsLnNldExpdGVyYWxWYWx1ZShub2RlLmdldExpdGVyYWxWYWx1ZSgpKTsKLQkJZXhwcmVzc2lvbiA9IHNsOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN1cGVyRmllbGRBY2Nlc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSBjcmVhdGVGaWVsZEFjY2Vzcyhub2RlLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCksIHJlc29sdmVyLnJlc29sdmVUaGlzKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN1cGVyTWV0aG9kSW52b2NhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlleHByZXNzaW9uID0gY3JlYXRlTWV0aG9kSW52b2NhdGlvbihub2RlLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCksIHJlc29sdmVyLnJlc29sdmVUaGlzKCksIG5vZGUuYXJndW1lbnRzKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRoaXNFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFRoaXNFeHByZXNzaW9uIG5vZGUpIHsKLQkJZXhwcmVzc2lvbiA9IHJlc29sdmVyLnJlc29sdmVUaGlzKCk7Ci0JCXJldHVybiBmYWxzZTsJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJUFRUeXBlTGl0ZXJhbCBwdGwgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRUeXBlTGl0ZXJhbCgpOwotCQlwdGwuc2V0VHlwZShyZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldFR5cGUoKSkpOwotCQlleHByZXNzaW9uID0gcHRsOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Xb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L1dvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2YwOWUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L1dvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF9FeHByZXNzaW9uVG9vQ29tcGxpY2F0ZWRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfT3BlcmF0b3JUb29Db21wbGljYXRlZFRvSGFuZGxlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVNUQm91bmRSZXNvbHZlcl9DYW5ub3RIYW5kbGVMb2NhbEZpZWxkX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVNUQm91bmRSZXNvbHZlcl9DYW5ub3RIYW5kbGVMb2NhbFZhcmlhYmxlX0VYQ187Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBXb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxN2YzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB7MH0gLSB7MX0KLVBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF9FeHByZXNzaW9uVG9vQ29tcGxpY2F0ZWRfRVhDXyAgICAgICAgICAgPSBJV0FWMDE3N0UgRXhwcmVzc2lvbiAiezB9IiBpcyB0b28gY29tcGxpY2F0ZWQuCi1QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfT3BlcmF0b3JUb29Db21wbGljYXRlZFRvSGFuZGxlX0VYQ18gICAgID0gSVdBVjAxNzlFIE9wZXJhdG9yICJ7MH0iIGlzIHRvbyBjb21wbGljYXRlZCB0byBoYW5kbGUuCi1BU1RCb3VuZFJlc29sdmVyX0Nhbm5vdEhhbmRsZUxvY2FsRmllbGRfRVhDXz1DYW5ub3QgaGFuZGxlIGxvY2FsIGZpZWxkIGFjY2VzcyBvZiAiezB9IgotQVNUQm91bmRSZXNvbHZlcl9DYW5ub3RIYW5kbGVMb2NhbFZhcmlhYmxlX0VYQ189Q2Fubm90IGhhbmRsZSBsb2NhbCB2YXJpYWJsZSBhY2Nlc3Mgb2YgInswfSIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTc0NTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImphdmFpbnN0LyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vZmphdmEvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2NzQwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotQGRvdAotb3JnLmVjbGlwc2UuamVtXzIuMC4yMDAuMjAwODA2MDMxMzA0LmphcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzZjhkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ3RyYWNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2d0cmFjZWZpbGU9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ2xldmVsPWRlZmF1bHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzEzOTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0gICAgPG5hbWU+b3JnLmVjbGlwc2UuamVtPC9uYW1lPgotICAgIDxjb21tZW50PjwvY29tbWVudD4KLSAgICA8cHJvamVjdHM+PC9wcm9qZWN0cz4KLSAgICA8YnVpbGRTcGVjPgotICAgICAgICA8YnVpbGRDb21tYW5kPgotICAgICAgICAgICAgPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0gICAgICAgICAgICA8YXJndW1lbnRzPjwvYXJndW1lbnRzPgotICAgICAgICA8L2J1aWxkQ29tbWFuZD4KLSAgICAgICAgPGJ1aWxkQ29tbWFuZD4KLSAgICAgICAgICAgIDxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0gICAgICAgICAgICA8YXJndW1lbnRzPjwvYXJndW1lbnRzPgotICAgICAgICA8L2J1aWxkQ29tbWFuZD4KLSAgICAgICAgPGJ1aWxkQ29tbWFuZD4KLSAgICAgICAgICAgIDxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotICAgICAgICAgICAgPGFyZ3VtZW50cz48L2FyZ3VtZW50cz4KLSAgICAgICAgPC9idWlsZENvbW1hbmQ+Ci0gICAgPC9idWlsZFNwZWM+Ci0gICAgPG5hdHVyZXM+Ci0gICAgICAgIDxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotICAgICAgICA8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLSAgICA8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1MDQ2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gQXByIDE1IDIxOjE0OjM2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwMmU4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotI1NhdCBNYXIgMzEgMjM6MDg6MDMgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjMyY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBGZWIgMjEgMTA6MDk6MDMgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1mb3JtYXR0ZXJfcHJvZmlsZT1fanZlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMAotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTMxN2Y1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4wLjIwNC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5jb3JlLkpFTVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmNvcmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLG9yZy5lY2xpcHNlLmplbS5wcm94eSxvcmcuZWNsaXBzZS5qZW0udGVzdHMsb3JnLmVjbGlwc2UuamVtLnVpLG9yZy5lY2xpcHNlLmplbS51dGlsLG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbCwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8sb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5sczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5iZWFuaW5mbywKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbml0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbiwKLSBvcmcuZWNsaXBzZS5qZW0uamF2YSwKLSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycywKLSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLAotIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLAotIG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4zLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ucHJveHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgImEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vUkVBRF9NRV9CRUZPUkVfQ0hBTkdJTkdfTUFOSUZFU1RcMDQxXDA0MVwwNDEiICJiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL1JFQURfTUVfQkVGT1JFX0NIQU5HSU5HX01BTklGRVNUXDA0MVwwNDFcMDQxIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkNmIyZS4uMDAwMDAwMAotLS0gImEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vUkVBRF9NRV9CRUZPUkVfQ0hBTkdJTkdfTUFOSUZFU1RcMDQxXDA0MVwwNDEiCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1EbyBub3QgaW5jbHVkZSBhIG5ldyBkZXBlbmRlbmN5IHBsdWdpbiB0byB0aGUgTUFOSUZFU1QgZm9yIHRoaXMgcGx1Z2luZCEhIQotCi1UaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhpcyBwbHVnaW4gaXMgYWxzbyBleGVjdXRlZCBvdXRzaWRlIG9mIEVjbGlwc2UgZnJhbWV3b3JrLCBzdWNoIElCTSBXZWJzcGhlcmUgQXBwbGljYXRpb24gU2VydmVyIChjKSBJQk0uIFdlIGNhbm5vdCBhZGQKLW5ldyBkZXBlbmRlbmNpZXMgdG8gdGhlIHBsdWdpbiBiZWNhdXNlIHRoZSBjdXJyZW50IHNldCBpcyBjb25zaWRlcmVkIHRvIGJlIEFQSS4gQWRkaW5nIGEgbmV3IHNldCB3aXRob3V0IGNvbnN1bHRpbmcgdGhvc2UgdXNlcnMgd291bGQgYnJlYWsKLXRoZW0uCi0KLVRoZSBleHRlcm5hbCBBUEkgaXMgYW55dGhpbmcgaW4gdGhlIG1vZmphdmEgZm9sZGVyLiBJZiBpdCBpcyBvbmx5IGZvciBhIGNsYXNzIGluIHRoZSBvdGhlciBzb3VyY2UgZm9sZGVyKHMpIGl0IG1heSBiZSBPSyBzaW5jZSB0aGV5IHdvdWxkIG5vdCBiZSAKLXVzaW5nIHRoYXQgY29kZS4gQnV0IGl0IHdvdWxkIGJlIGJlc3QgdG8gY29uc3VsdCB3aXRoIHRoZW0gZmlyc3QuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhY2VhNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPjxoZWFkPjx0aXRsZT5BYm91dDwvdGl0bGU+Ci0KLQotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj48L2hlYWQ+PGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5pbmkgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzE0ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5tYXBwaW5ncyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U1MTY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDYvMDUvMTggMTk6MDk6NTggJAotIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1KYXZhIEVNRiBNb2RlbFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy4gMjAwMCwgMjAwNi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3ZlcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OWFkZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zcmMuZXhjbHVkZXMgPSAqKi8uY3ZzaWdub3JlCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBvdmVycmlkZXMvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIG1vZGVsLwotamFycy5jb21waWxlLm9yZGVyID0gLgotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBtb2RlbC8sXAotICAgICAgICAgICAgICAgcm9zZS8KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBtb2ZqYXZhLyxcCi0gICAgICAgICAgIGphdmFpbnN0LwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNmViYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuamVtIj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmplbSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmplbS51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamVtLnV0aWwiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vZWNsaXBzZTMyLnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGZhYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0ltcGxpY2l0QWxsb2NhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW1wbGljaXRBbGxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZDA0ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW1wbGljaXRBbGxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW1wbGljaXQgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgZm9yIGFuIGltcGxpY2l0IGFsbG9jYXRpb24gd2hlcmUgdGhlIG9iamVjdCBjb21lcyBmcm9tIHRoZSBmZWF0dXJlIG9mIGFub3RoZXIgb2JqZWN0LiBJdCBpcyB0aGUgbGl2ZSBKYXZhIHZhbHVlIGZyb20gdGhlIHJlbW90ZSB2bS4KLSAqIDwvcD4gCi0gKiBAc2luY2UgMS4wLjAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyBpcyBmb3IgYW4gaW1wbGljaXQgYWxsb2NhdGlvbiB3aGVyZSB0aGUgb2JqZWN0IGNvbWVzIGZyb20gdGhlIGZlYXR1cmUgb2YgYW5vdGhlciBvYmplY3QuIEl0IGlzIHRoZSBsaXZlIEphdmEgdmFsdWUgZnJvbSB0aGUgcmVtb3RlIHZtLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRQYXJlbnQgPGVtPlBhcmVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uI2dldEZlYXR1cmUgPGVtPkZlYXR1cmU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEltcGxpY2l0QWxsb2NhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbXBsaWNpdEFsbG9jYXRpb24gZXh0ZW5kcyBKYXZhQWxsb2NhdGlvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJlbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIFRoZSBwYXJlbnQgd2hvIGlzIHRvIGdpdmUgdXAgdGhlIHZhbHVlLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcmVudChFT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0SW1wbGljaXRBbGxvY2F0aW9uX1BhcmVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFT2JqZWN0IGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uI2dldFBhcmVudCA8ZW0+UGFyZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBhcmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyZW50KEVPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmVhdHVyZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogVGhlIGZlYXR1cmUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcXVlcnkgdGhlIGxpdmUgdmFsdWUuCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZlYXR1cmU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0SW1wbGljaXRBbGxvY2F0aW9uX0ZlYXR1cmUoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRGZWF0dXJlIDxlbT5GZWF0dXJlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GZWF0dXJlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRGZWF0dXJlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSB2YWx1ZSk7Ci0KLX0gLy8gSW1wbGljaXRBbGxvY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9Jbml0U3RyaW5nQWxsb2NhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5pdFN0cmluZ0FsbG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2OGM1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9Jbml0U3RyaW5nQWxsb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPHA+Ci0gKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYWxsb2NhdGlvbiBzdHJpbmcgY2FuIGJlIHBhcnNlZCBieSB0aGUgcmVtb3RlIHZtLiBJdCB1c2VzIHRoZSBhbGxvY1N0cmluZy4gCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkphdmFBbGxvY2F0aW9uI2dldEFsbG9jU3RyaW5nKCkKLSAqIEBzaW5jZSAxLjAuMAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYWxsb2NhdGlvbiBzdHJpbmcgY2FuIGJlIHBhcnNlZCBieSB0aGUgcmVtb3RlIHZtLiBJdCB1c2VzIHRoZSBhbGxvY1N0cmluZy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbiNnZXRJbml0U3RyaW5nIDxlbT5Jbml0IFN0cmluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5pdFN0cmluZ0FsbG9jYXRpb24gZXh0ZW5kcyBKYXZhQWxsb2NhdGlvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0IFN0cmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdCBTdHJpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nIGZvciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdCBTdHJpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluaXRTdHJpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb25fSW5pdFN0cmluZygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbml0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbiNnZXRJbml0U3RyaW5nIDxlbT5Jbml0IFN0cmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdCBTdHJpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluaXRTdHJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluaXRTdHJpbmcoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBJbml0U3RyaW5nQWxsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luc3RhbnRpYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZWEzM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluc3RhbnRpYXRpb25GYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnN0YW50aWF0aW9uRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5pdCBTdHJpbmcgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5pdCBTdHJpbmcgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5pdFN0cmluZ0FsbG9jYXRpb24gY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW1wbGljaXRBbGxvY2F0aW9uIGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcnNlIFRyZWUgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGFyc2VUcmVlQWxsb2NhdGlvbiBjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIHBhcnNlIHRyZWUgYWxsb2NhdGlvbiB3aXRoIGFuIGV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcmV0dXJuIFRoZSBuZXcgcGFyc2UgdHJlZSBhbGxvY2F0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBhcnNlVHJlZUFsbG9jYXRpb24gY3JlYXRlUGFyc2VUcmVlQWxsb2NhdGlvbihQVEV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBcnJheSBBY2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEFycmF5IEFjY2VzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRBcnJheUFjY2VzcyBjcmVhdGVQVEFycmF5QWNjZXNzKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBhcnJheSBhY2Nlc3Mgd2l0aCB0aGUgYXJyYXkgYW5kIGluZGV4ZXMuCi0JICogCi0JICogQHBhcmFtIGFycmF5Ci0JICogQHBhcmFtIGluZGV4ZXMgbGlzdCBvZiBpbmRleCBleHByZXNzaW9ucwotCSAqIEByZXR1cm4gVGhlIG5ldyBhcnJheSBhY2Nlc3MuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRBcnJheUFjY2VzcyBjcmVhdGVQVEFycmF5QWNjZXNzKFBURXhwcmVzc2lvbiBhcnJheSwgTGlzdCBpbmRleGVzKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQXJyYXkgQ3JlYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEFycmF5IENyZWF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEFycmF5Q3JlYXRpb24gY3JlYXRlUFRBcnJheUNyZWF0aW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhbiBhcnJheSBjcmVhdGlvbiB3aXRoIHRoZSB0eXBlLCBkaW1lbnNpb25zLCBhbmQgaW5pdGlhbGl6ZXIuCi0JICogCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUsIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4uCi0JICogQHBhcmFtIGRpbWVuc2lvbnMgVGhlIGRpbWVuc2lvbiBleHByZXNzaW9ucywgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZGltZW5zaW9uIGV4cHJlc3Npb25zLgotCSAqIEBwYXJhbSBpbml0aWFsaXplciBUaGUgaW5pdGlhbGl6ZXIsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGluaXRpYWxpemVyLgotCSAqIEByZXR1cm4gVGhlIG5ldyBhcnJheSBjcmVhdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVEFycmF5Q3JlYXRpb24gY3JlYXRlUFRBcnJheUNyZWF0aW9uKFN0cmluZyB0eXBlLCBMaXN0IGRpbWVuc2lvbnMsIFBUQXJyYXlJbml0aWFsaXplciBpbml0aWFsaXplcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEFycmF5IEluaXRpYWxpemVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBcnJheSBJbml0aWFsaXplcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRBcnJheUluaXRpYWxpemVyIGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYW4gYXJyYXkgaW5pdGlsaXplciB3aXRoIGluaXRpYWxpemUgZXhwZXNzaW9ucy4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbnMgVGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMsIDxjb2RlPm51bGw8L2NvZGU+IGlmIGVtcHR5IGFycmF5IGluaXRpYWxpemVyLgotCSAqIEByZXR1cm4gVGhlIG5ldyBhcnJheSBpbml0aWFsaXplci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVEFycmF5SW5pdGlhbGl6ZXIgY3JlYXRlUFRBcnJheUluaXRpYWxpemVyKExpc3QgZXhwcmVzc2lvbnMpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBCb29sZWFuIExpdGVyYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEJvb2xlYW4gTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRCb29sZWFuTGl0ZXJhbCBjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIGJvb2xlYW4gbGl0ZXJhbCB3aXRoIGEgZ2l2ZW4gdmFsdWUuCi0JICogQHBhcmFtIGJvb2xlYW5WYWx1ZQotCSAqIEByZXR1cm4gVGhlIG5ldyBib29sZWFuIGxpdGVyYWwuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRCb29sZWFuTGl0ZXJhbCBjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKGJvb2xlYW4gYm9vbGVhblZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENhc3QgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQ2FzdCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVENhc3RFeHByZXNzaW9uIGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IGNhc3QgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiwgZS5nLiA8Y29kZT5zaG9ydDwvY29kZT4gb3IgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiBiZWluZyBjYXN0LgotCSAqIEByZXR1cm4gVGhlIG5ldyBjYXN0IGV4cHJlc3Npb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRDYXN0RXhwcmVzc2lvbiBjcmVhdGVQVENhc3RFeHByZXNzaW9uKFN0cmluZyB0eXBlLCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENoYXJhY3RlciBMaXRlcmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBDaGFyYWN0ZXIgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRDaGFyYWN0ZXJMaXRlcmFsIGNyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgY2hhcmFjdGVyIGxpdGVyYWwuCi0JICogQHBhcmFtIGVzY2FwZWRWYWx1ZSBUaGUgZXNjYXBlZCB2YWx1ZSB0byB1c2UuCi0JICogQHJldHVybiBUaGUgbmV3IGNoYXJhY3RlciBsaXRlcmFsLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQ2hhcmFjdGVyTGl0ZXJhbCBjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoU3RyaW5nIGVzY2FwZWRWYWx1ZSk7CQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBDbGFzcyBJbnN0YW5jZSBDcmVhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgY2xhc3MsIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4uCi0JICogQHBhcmFtIGFyZ3VtZW50cyBUaGUgbGlzdCBvZiBleHByZXNzaW9ucyBmb3IgYXJndW1lbnRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gYXJncy4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oU3RyaW5nIHR5cGUsIExpc3QgYXJndW1lbnRzKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQ29uZGl0aW9uYWwgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQ29uZGl0aW9uYWwgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRDb25kaXRpb25hbEV4cHJlc3Npb24gY3JlYXRlUFRDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gd2l0aCB0aGUgY29uZGl0aW9uIGFuZCB0cnVlL2ZhbHNlIGV4cHJlc3Npb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25kaXRpb24KLQkgKiBAcGFyYW0gdHJ1ZUV4cHJlc3NvaW4KLQkgKiBAcGFyYW0gZmFsc2VFeHByZXNzaW9uCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNyZWF0ZVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBjb25kaXRpb24sIFBURXhwcmVzc2lvbiB0cnVlRXhwcmVzc29pbiwgUFRFeHByZXNzaW9uIGZhbHNlRXhwcmVzc2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEZpZWxkIEFjY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgRmllbGQgQWNjZXNzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEZpZWxkQWNjZXNzIGNyZWF0ZVBURmllbGRBY2Nlc3MoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IGZpZWxkIGFjY2VzcyB3aXRoIHJlY2VpdmVyIGFuZCBmaWVsZCBuYW1lLgotCSAqIEBwYXJhbSByZWNlaXZlciBUaGUgcmVjZWl2ZXIgZXhwcmVzc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcGFyYW0gZmllbGQgVGhlIGZpZWxkIG5hbWUuCi0JICogQHJldHVybiBUaGUgbmV3IGZpZWxkIGFjY2Vzcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVEZpZWxkQWNjZXNzIGNyZWF0ZVBURmllbGRBY2Nlc3MoUFRFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgZmllbGQpOwkKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW5maXggRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW5maXggRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRJbmZpeEV4cHJlc3Npb24gY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IGluZml4IGV4cHJlc3Npb24gd2l0aCB0aGUgbGVmdC9yaWdodC9leHRlbmRlZCBvcGVyYW5kcyBhbmQgdGhlIG9wZXJhdG9yLgotCSAqIEBwYXJhbSBsZWZ0T3BlcmFuZAotCSAqIEBwYXJhbSBvcGVyYXRvcgotCSAqIEBwYXJhbSByaWdodE9wZXJhbmQKLQkgKiBAcGFyYW0gZXh0ZW5kZWRPcGVyYW5kcyBUaGUgbGlzdCBvZiBleHRlbmRlZCBvcGVyYW5kcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZXh0ZW5kZWQgb3BlcmFuZHMuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUSW5maXhFeHByZXNzaW9uIGNyZWF0ZVBUSW5maXhFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBsZWZ0T3BlcmFuZCwgUFRJbmZpeE9wZXJhdG9yIG9wZXJhdG9yLCBQVEV4cHJlc3Npb24gcmlnaHRPcGVyYW5kLCBMaXN0IGV4dGVuZGVkT3BlcmFuZHMpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBJbnN0YW5jZW9mPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBJbnN0YW5jZW9mPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEluc3RhbmNlb2YgY3JlYXRlUFRJbnN0YW5jZW9mKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB3aXRoIGFuIG9wZXJhbmQgYW5kIGEgdHlwZS4KLQkgKiBAcGFyYW0gb3BlcmFuZAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlIG9mLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUSW5zdGFuY2VvZiBjcmVhdGVQVEluc3RhbmNlb2YoUFRFeHByZXNzaW9uIG9wZXJhbmQsIFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgTWV0aG9kIEludm9jYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIE1ldGhvZCBJbnZvY2F0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVE1ldGhvZEludm9jYXRpb24gY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBtZXRob2QgaW52b2NhdGlvbiB3aXRoIGEgcmVjZWl2ZXIsIG5hbWUsIGFuZCBhcmd1bWVudHMuCi0JICogCi0JICogQHBhcmFtIHJlY2VpdmVyIFRoZSByZWNlaXZlciBleHByZXNzaW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyByZWNlaXZlci4KLQkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kLgotCSAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGFyZ3VtZW50cy4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgbWV0aG9kIGludm9jYXRpb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRNZXRob2RJbnZvY2F0aW9uIGNyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbihQVEV4cHJlc3Npb24gcmVjZWl2ZXIsIFN0cmluZyBuYW1lLCBMaXN0IGFyZ3VtZW50cyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIE5hbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUTmFtZSBjcmVhdGVQVE5hbWUoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IG5hbWUgd2l0aCB0aGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gVGhlIG5ldyBuYW1lLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUTmFtZSBjcmVhdGVQVE5hbWUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBOdWxsIExpdGVyYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIE51bGwgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFROdWxsTGl0ZXJhbCBjcmVhdGVQVE51bGxMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIE51bWJlciBMaXRlcmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBOdW1iZXIgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFROdW1iZXJMaXRlcmFsIGNyZWF0ZVBUTnVtYmVyTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgbnVtYmVyIGxpdGVyYWwgd2l0aCB0aGUgdG9rZW4uCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybiBUaGUgbmV3IG51bWJlciBsaXRlcmFsLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUTnVtYmVyTGl0ZXJhbCBjcmVhdGVQVE51bWJlckxpdGVyYWwoU3RyaW5nIHRva2VuKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgUGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBQYXJlbnRoZXNpemVkIEV4cHJlc3Npb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIHdpdGggdGhlIGV4cHJlc3Npb24uCi0JICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdGhhdCBpcyBpbiB0aGUgcGFyZW50aGVzaXMuCi0JICogQHJldHVybiBUaGUgbmV3IHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGNyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBQcmVmaXggRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgUHJlZml4IEV4cHJlc3Npb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUUHJlZml4RXhwcmVzc2lvbiBjcmVhdGVQVFByZWZpeEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IHByZWZpeCBleHByZXNzaW9uIGdpdmVuIGFuIG9wZXJhdG9yIGFuZCBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBvcGVyYXRvcgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHJldHVybiBUaGUgbmV3IHByZWZpeCBleHByZXNzaW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUUHJlZml4RXhwcmVzc2lvbiBjcmVhdGVQVFByZWZpeEV4cHJlc3Npb24oUFRQcmVmaXhPcGVyYXRvciBvcGVyYXRvciwgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBTdHJpbmcgTGl0ZXJhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgU3RyaW5nIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUU3RyaW5nTGl0ZXJhbCBjcmVhdGVQVFN0cmluZ0xpdGVyYWwoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IHN0cmluZyBsaXRlcmFsIGdpdmVuIHRoZSBlc2NhcGVkIGxpdGVyYWwgc3RyaW5nLgotCSAqIEBwYXJhbSBlc2NhcGVMaXRlcmFsCi0JICogQHJldHVybiBUaGUgbmV3IHN0cmluZyBsaXRlcmFsLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUU3RyaW5nTGl0ZXJhbCBjcmVhdGVQVFN0cmluZ0xpdGVyYWwoU3RyaW5nIGVzY2FwZUxpdGVyYWwpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBUaGlzIExpdGVyYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFRoaXMgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRUaGlzTGl0ZXJhbCBjcmVhdGVQVFRoaXNMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFR5cGUgTGl0ZXJhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgVHlwZSBMaXRlcmFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVFR5cGVMaXRlcmFsIGNyZWF0ZVBUVHlwZUxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IHR5cGUgbGl0ZXJhbCBnaXZlbiB0aGUgdHlwZS4KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gVGhlIG5ldyB0eXBlIGxpdGVyYWwuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRUeXBlTGl0ZXJhbCBjcmVhdGVQVFR5cGVMaXRlcmFsKFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW52YWxpZCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBJbnZhbGlkIEV4cHJlc3Npb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUSW52YWxpZEV4cHJlc3Npb24gY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRJbnN0YW5jZVJlZmVyZW5jZSBjcmVhdGVQVEluc3RhbmNlUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEFub255bW91cyBDbGFzcyBEZWNsYXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQW5vbnltb3VzIENsYXNzIERlY2xhcmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gY3JlYXRlUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBQVEluc3RhbmNlUmVmZXJlbmNlIHdpdGggYSByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGluc3RhbmNlCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2VtPicuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JUFRJbnN0YW5jZVJlZmVyZW5jZSBjcmVhdGVQVEluc3RhbmNlUmVmZXJlbmNlKElKYXZhSW5zdGFuY2UgaW5zdGFuY2UpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgaW52YWxpZCBleHByZXNzaW9uIHdpdGggYSBtZXNzYWdlLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHJldHVybiBUaGUgbmV3IGludmFsaWQgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVEludmFsaWRFeHByZXNzaW9uIGNyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbXBsaWNpdCBBbGxvY2F0aW9uPC9lbT4nIGFzCi0JICogdXRpbGl0eSB3aXRoIGEgZ2l2ZW4gaW5pdCBzdHJpbmcuCi0JICogQHBhcmFtIGluaXRTdHJpbmcgLSBTdHJpbmcgdG8gcHV0IGludG8gaW5pdGlhbGl6YXRpb24uCi0JICogQHJldHVybiBUaGUgYWxsb2NhdGlvbiBpbml0aWFsaXplZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJbml0U3RyaW5nQWxsb2NhdGlvbiBjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbihTdHJpbmcgaW5pdFN0cmluZyk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbXBsaWNpdCBBbGxvY2F0aW9uPC9lbT4nIGFzCi0JICogdXRpbGl0eSB3aXRoIGEgZ2l2ZW4gcGFyZW50IGFuZCBmZWF0dXJlLgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHNvdXJjZSB0byBnZXQgdGhlIHZhbHVlIGZyb20uCi0JICogQHBhcmFtIHNmIFRoZSBmZWF0dXJlIG9uIHRoZSBzb3VyY2UgZm9yIHRoZSB2YWx1ZS4KLQkgKiBAcmV0dXJuIFRoZSBhbGxvY2F0aW9uIGluaXRpYWxpemVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUltcGxpY2l0QWxsb2NhdGlvbiBjcmVhdGVJbXBsaWNpdEFsbG9jYXRpb24oRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzZik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUluc3RhbnRpYXRpb25QYWNrYWdlIGdldEluc3RhbnRpYXRpb25QYWNrYWdlKCk7Ci0KLX0gLy9JbnN0YW50aWF0aW9uRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvblBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luc3RhbnRpYXRpb25QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZTc0MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvblBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBKYXZhIEluc3RhbnRpYXRpb24gUGFja2FnZQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5zdGFudGlhdGlvblBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJpbnN0YW50aWF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUluc3RhbnRpYXRpb25QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlIDxlbT5JSmF2YSBJbnN0YW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0SUphdmFJbnN0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSkFWQV9JTlNUQU5DRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklKYXZhIEluc3RhbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElKQVZBX0lOU1RBTkNFX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UgPGVtPklKYXZhIE9iamVjdCBJbnN0YW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFPYmplY3RJbnN0YW5jZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0SUphdmFPYmplY3RJbnN0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSkFWQV9PQkpFQ1RfSU5TVEFOQ0UgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZSA8ZW0+SUphdmEgRGF0YSBUeXBlIEluc3RhbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2UKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldElKYXZhRGF0YVR5cGVJbnN0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSkFWQV9EQVRBX1RZUEVfSU5TVEFOQ0UgPSAwOwotCi0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklKYXZhIERhdGEgVHlwZSBJbnN0YW5jZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJSkFWQV9EQVRBX1RZUEVfSU5TVEFOQ0VfRkVBVFVSRV9DT1VOVCA9IElKQVZBX0lOU1RBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSmF2YSBPYmplY3QgSW5zdGFuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUpBVkFfT0JKRUNUX0lOU1RBTkNFX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9JTlNUQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5KYXZhQWxsb2NhdGlvbkltcGwgPGVtPkphdmEgQWxsb2NhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSmF2YUFsbG9jYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRKYXZhQWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKQVZBX0FMTE9DQVRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5KYXZhIEFsbG9jYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluaXRTdHJpbmdBbGxvY2F0aW9uSW1wbCA8ZW0+SW5pdCBTdHJpbmcgQWxsb2NhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRJbml0U3RyaW5nQWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTklUX1NUUklOR19BTExPQ0FUSU9OID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0IFN0cmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOSVRfU1RSSU5HX0FMTE9DQVRJT05fX0lOSVRfU1RSSU5HID0gSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Jbml0IFN0cmluZyBBbGxvY2F0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOSVRfU1RSSU5HX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbXBsaWNpdEFsbG9jYXRpb25JbXBsIDxlbT5JbXBsaWNpdCBBbGxvY2F0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbXBsaWNpdEFsbG9jYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRJbXBsaWNpdEFsbG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU1QTElDSVRfQUxMT0NBVElPTiA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5UID0gSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFID0gSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JbXBsaWNpdCBBbGxvY2F0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNUExJQ0lUX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBhcnNlVHJlZUFsbG9jYXRpb25JbXBsIDxlbT5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBhcnNlVHJlZUFsbG9jYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQYXJzZVRyZWVBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBUlNFX1RSRUVfQUxMT0NBVElPTiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTiA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUlNFX1RSRUVfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UID0gSkFWQV9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURXhwcmVzc2lvbkltcGwgPGVtPlBUIEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURXhwcmVzc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBURXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9FWFBSRVNTSU9OID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlBY2Nlc3NJbXBsIDxlbT5QVCBBcnJheSBBY2Nlc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlBY2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEFycmF5QWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0FSUkFZX0FDQ0VTUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXJyYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9BQ0NFU1NfX0FSUkFZID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmRleGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBBcnJheSBBY2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQUNDRVNTX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlDcmVhdGlvbkltcGwgPGVtPlBUIEFycmF5IENyZWF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5Q3JlYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEFycmF5Q3JlYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQ1JFQVRJT04gPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9DUkVBVElPTl9fVFlQRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGltZW5zaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWxpemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQXJyYXkgQ3JlYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQ1JFQVRJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUluaXRpYWxpemVySW1wbCA8ZW0+UFQgQXJyYXkgSW5pdGlhbGl6ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlJbml0aWFsaXplckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQXJyYXlJbml0aWFsaXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9BUlJBWV9JTklUSUFMSVpFUiA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cHJlc3Npb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBBcnJheSBJbml0aWFsaXplcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BUlJBWV9JTklUSUFMSVpFUl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEJvb2xlYW5MaXRlcmFsSW1wbCA8ZW0+UFQgQm9vbGVhbiBMaXRlcmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEJvb2xlYW5MaXRlcmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRCb29sZWFuTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9CT09MRUFOX0xJVEVSQUwgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb29sZWFuIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQm9vbGVhbiBMaXRlcmFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0JPT0xFQU5fTElURVJBTF9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENhc3RFeHByZXNzaW9uSW1wbCA8ZW0+UFQgQ2FzdCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENhc3RFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRDYXN0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9DQVNUX0VYUFJFU1NJT04gPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQ2FzdCBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NBU1RfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENoYXJhY3RlckxpdGVyYWxJbXBsIDxlbT5QVCBDaGFyYWN0ZXIgTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0NIQVJBQ1RFUl9MSVRFUkFMID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXNjYXBlZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NIQVJBQ1RFUl9MSVRFUkFMX19FU0NBUEVEX1ZBTFVFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFyIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBDaGFyYWN0ZXIgTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DSEFSQUNURVJfTElURVJBTF9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwgPGVtPlBUIENsYXNzIEluc3RhbmNlIENyZWF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19UWVBFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bcmd1bWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBDbGFzcyBJbnN0YW5jZSBDcmVhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwgPGVtPlBUIENvbmRpdGlvbmFsIEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTiA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJ1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZhbHNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0UgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBDb25kaXRpb25hbCBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRGaWVsZEFjY2Vzc0ltcGwgPGVtPlBUIEZpZWxkIEFjY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRGaWVsZEFjY2Vzc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBURmllbGRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfRklFTERfQUNDRVNTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjZWl2ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0ZJRUxEX0FDQ0VTU19fRklFTEQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBGaWVsZCBBY2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfRklFTERfQUNDRVNTX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5maXhFeHByZXNzaW9uSW1wbCA8ZW0+UFQgSW5maXggRXhwcmVzc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbmZpeEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEluZml4RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9JTkZJWF9FWFBSRVNTSU9OID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGVmdCBPcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcGVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lORklYX0VYUFJFU1NJT05fX09QRVJBVE9SID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SaWdodCBPcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgT3BlcmFuZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgSW5maXggRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTkZJWF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VvZkltcGwgPGVtPlBUIEluc3RhbmNlb2Y8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VvZkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUSW5zdGFuY2VvZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9JTlNUQU5DRU9GID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3BlcmFuZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lOU1RBTkNFT0ZfX09QRVJBTkQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlNUQU5DRU9GX19UWVBFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgSW5zdGFuY2VvZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlNUQU5DRU9GX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTWV0aG9kSW52b2NhdGlvbkltcGwgPGVtPlBUIE1ldGhvZCBJbnZvY2F0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE1ldGhvZEludm9jYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVE1ldGhvZEludm9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfTUVUSE9EX0lOVk9DQVRJT04gPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNlaXZlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX01FVEhPRF9JTlZPQ0FUSU9OX19OQU1FID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bcmd1bWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFMgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBNZXRob2QgSW52b2NhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9NRVRIT0RfSU5WT0NBVElPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE5hbWVJbXBsIDxlbT5QVCBOYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE5hbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfTkFNRSA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9OQU1FX19OQU1FID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgTmFtZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9OQU1FX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTnVsbExpdGVyYWxJbXBsIDxlbT5QVCBOdWxsIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTnVsbExpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVE51bGxMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX05VTExfTElURVJBTCA9IDIxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBOdWxsIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTlVMTF9MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTnVtYmVyTGl0ZXJhbEltcGwgPGVtPlBUIE51bWJlciBMaXRlcmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE51bWJlckxpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVE51bWJlckxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfTlVNQkVSX0xJVEVSQUwgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub2tlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX05VTUJFUl9MSVRFUkFMX19UT0tFTiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIE51bWJlciBMaXRlcmFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX05VTUJFUl9MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsIDxlbT5QVCBQYXJlbnRoZXNpemVkIEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTiA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT04gPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBQYXJlbnRoZXNpemVkIEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUHJlZml4RXhwcmVzc2lvbkltcGwgPGVtPlBUIFByZWZpeCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFByZWZpeEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFByZWZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfUFJFRklYX0VYUFJFU1NJT04gPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcGVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1BSRUZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgUHJlZml4IEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfUFJFRklYX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRTdHJpbmdMaXRlcmFsSW1wbCA8ZW0+UFQgU3RyaW5nIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUU3RyaW5nTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUU3RyaW5nTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9TVFJJTkdfTElURVJBTCA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzY2FwZWQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGl0ZXJhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgU3RyaW5nIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfU1RSSU5HX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRUaGlzTGl0ZXJhbEltcGwgPGVtPlBUIFRoaXMgTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRUaGlzTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUVGhpc0xpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfVEhJU19MSVRFUkFMID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIFRoaXMgTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9USElTX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRUeXBlTGl0ZXJhbEltcGwgPGVtPlBUIFR5cGUgTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRUeXBlTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUVHlwZUxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfVFlQRV9MSVRFUkFMID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1RZUEVfTElURVJBTF9fVFlQRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIFR5cGUgTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9UWVBFX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwgPGVtPlBUIEludmFsaWQgRXhwcmVzc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUSW52YWxpZEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfSU5WQUxJRF9FWFBSRVNTSU9OID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEludmFsaWQgRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlZBTElEX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwgPGVtPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUSW5zdGFuY2VSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VfUkVGRVJFTkNFID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0UgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwgPGVtPlBUIEFub255bW91cyBDbGFzcyBEZWNsYXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiA9IDMwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlY2xhcmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19ERUNMQVJBVElPTiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wb3J0czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19JTVBPUlRTID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQW5vbnltb3VzIENsYXNzIERlY2xhcmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yIDxlbT5QVCBJbmZpeCBPcGVyYXRvcjwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEluZml4T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfT1BFUkFUT1IgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvciA8ZW0+UFQgUHJlZml4IE9wZXJhdG9yPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFByZWZpeE9wZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1BSRUZJWF9PUEVSQVRPUiA9IDMyOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UgPGVtPklKYXZhIE9iamVjdCBJbnN0YW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSmF2YSBPYmplY3QgSW5zdGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUphdmFPYmplY3RJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSmF2YUFsbG9jYXRpb24gPGVtPkphdmEgQWxsb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KYXZhIEFsbG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SmF2YUFsbG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uIDxlbT5Jbml0IFN0cmluZyBBbGxvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb24jZ2V0SW5pdFN0cmluZyA8ZW0+SW5pdCBTdHJpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0IFN0cmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uI2dldEluaXRTdHJpbmcoKQotCSAqIEBzZWUgI2dldEluaXRTdHJpbmdBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbml0U3RyaW5nQWxsb2NhdGlvbl9Jbml0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24gPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW1wbGljaXRBbGxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRQYXJlbnQgPGVtPlBhcmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlBhcmVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRQYXJlbnQoKQotCSAqIEBzZWUgI2dldEltcGxpY2l0QWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW1wbGljaXRBbGxvY2F0aW9uX1BhcmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0RmVhdHVyZSA8ZW0+RmVhdHVyZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkZlYXR1cmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0RmVhdHVyZSgpCi0JICogQHNlZSAjZ2V0SW1wbGljaXRBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbXBsaWNpdEFsbG9jYXRpb25fRmVhdHVyZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbiA8ZW0+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhcnNlIFRyZWUgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVHJlZUFsbG9jYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVHJlZUFsbG9jYXRpb24jZ2V0RXhwcmVzc2lvbigpCi0JICogQHNlZSAjZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbl9FeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24gPGVtPlBUIEV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzIDxlbT5QVCBBcnJheSBBY2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQXJyYXkgQWNjZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRBcnJheUFjY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzI2dldEFycmF5IDxlbT5BcnJheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkFycmF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcyNnZXRBcnJheSgpCi0JICogQHNlZSAjZ2V0UFRBcnJheUFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRBcnJheUFjY2Vzc19BcnJheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MjZ2V0SW5kZXhlcyA8ZW0+SW5kZXhlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5kZXhlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MjZ2V0SW5kZXhlcygpCi0JICogQHNlZSAjZ2V0UFRBcnJheUFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRBcnJheUFjY2Vzc19JbmRleGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24gPGVtPlBUIEFycmF5IENyZWF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEFycmF5IENyZWF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEFycmF5Q3JlYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFBUQXJyYXlDcmVhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRBcnJheUNyZWF0aW9uX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0RGltZW5zaW9ucyA8ZW0+RGltZW5zaW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGltZW5zaW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXREaW1lbnNpb25zKCkKLQkgKiBAc2VlICNnZXRQVEFycmF5Q3JlYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQXJyYXlDcmVhdGlvbl9EaW1lbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXRJbml0aWFsaXplciA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Jbml0aWFsaXplcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXRJbml0aWFsaXplcigpCi0JICogQHNlZSAjZ2V0UFRBcnJheUNyZWF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEFycmF5Q3JlYXRpb25fSW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplciA8ZW0+UFQgQXJyYXkgSW5pdGlhbGl6ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQXJyYXkgSW5pdGlhbGl6ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQXJyYXlJbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplciNnZXRFeHByZXNzaW9ucyA8ZW0+RXhwcmVzc2lvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4cHJlc3Npb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyI2dldEV4cHJlc3Npb25zKCkKLQkgKiBAc2VlICNnZXRQVEFycmF5SW5pdGlhbGl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQXJyYXlJbml0aWFsaXplcl9FeHByZXNzaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbCA8ZW0+UFQgQm9vbGVhbiBMaXRlcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEJvb2xlYW4gTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQm9vbGVhbkxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbCNpc0Jvb2xlYW5WYWx1ZSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvb2xlYW4gVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsI2lzQm9vbGVhblZhbHVlKCkKLQkgKiBAc2VlICNnZXRQVEJvb2xlYW5MaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEJvb2xlYW5MaXRlcmFsX0Jvb2xlYW5WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiA8ZW0+UFQgQ2FzdCBFeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIENhc3QgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQ2FzdEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24jZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UFRDYXN0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRDYXN0RXhwcmVzc2lvbl9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uI2dldEV4cHJlc3Npb24oKQotCSAqIEBzZWUgI2dldFBUQ2FzdEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQ2FzdEV4cHJlc3Npb25fRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsIDxlbT5QVCBDaGFyYWN0ZXIgTGl0ZXJhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBDaGFyYWN0ZXIgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Fc2NhcGVkIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVENoYXJhY3RlckxpdGVyYWxfRXNjYXBlZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCNnZXRDaGFyVmFsdWUgPGVtPkNoYXIgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DaGFyIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldENoYXJWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVENoYXJhY3RlckxpdGVyYWxfQ2hhclZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiA8ZW0+UFQgQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb25fVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uI2dldEFyZ3VtZW50cyA8ZW0+QXJndW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bcmd1bWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiNnZXRBcmd1bWVudHMoKQotCSAqIEBzZWUgI2dldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9Bcmd1bWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIDxlbT5QVCBDb25kaXRpb25hbCBFeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIENvbmRpdGlvbmFsIEV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0Q29uZGl0aW9uIDxlbT5Db25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRDb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9Db25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0VHJ1ZSA8ZW0+VHJ1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlRydWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRUcnVlKCkKLQkgKiBAc2VlICNnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fVHJ1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRGYWxzZSA8ZW0+RmFsc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5GYWxzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldEZhbHNlKCkKLQkgKiBAc2VlICNnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fRmFsc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MgPGVtPlBUIEZpZWxkIEFjY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBGaWVsZCBBY2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEZpZWxkQWNjZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MjZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVjZWl2ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldFJlY2VpdmVyKCkKLQkgKiBAc2VlICNnZXRQVEZpZWxkQWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEZpZWxkQWNjZXNzX1JlY2VpdmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MjZ2V0RmllbGQgPGVtPkZpZWxkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldEZpZWxkKCkKLQkgKiBAc2VlICNnZXRQVEZpZWxkQWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEZpZWxkQWNjZXNzX0ZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiA8ZW0+UFQgSW5maXggRXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBJbmZpeCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUSW5maXhFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldExlZnRPcGVyYW5kIDxlbT5MZWZ0IE9wZXJhbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5MZWZ0IE9wZXJhbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRMZWZ0T3BlcmFuZCgpCi0JICogQHNlZSAjZ2V0UFRJbmZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUSW5maXhFeHByZXNzaW9uX0xlZnRPcGVyYW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9wZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IoKQotCSAqIEBzZWUgI2dldFBUSW5maXhFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEluZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRSaWdodE9wZXJhbmQgPGVtPlJpZ2h0IE9wZXJhbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5SaWdodCBPcGVyYW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0UmlnaHRPcGVyYW5kKCkKLQkgKiBAc2VlICNnZXRQVEluZml4RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRJbmZpeEV4cHJlc3Npb25fUmlnaHRPcGVyYW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0RXh0ZW5kZWRPcGVyYW5kcyA8ZW0+RXh0ZW5kZWQgT3BlcmFuZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4dGVuZGVkIE9wZXJhbmRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0RXh0ZW5kZWRPcGVyYW5kcygpCi0JICogQHNlZSAjZ2V0UFRJbmZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUSW5maXhFeHByZXNzaW9uX0V4dGVuZGVkT3BlcmFuZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiA8ZW0+UFQgSW5zdGFuY2VvZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBJbnN0YW5jZW9mPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEluc3RhbmNlb2YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldE9wZXJhbmQgPGVtPk9wZXJhbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PcGVyYW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldE9wZXJhbmQoKQotCSAqIEBzZWUgI2dldFBUSW5zdGFuY2VvZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRJbnN0YW5jZW9mX09wZXJhbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFBUSW5zdGFuY2VvZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRJbnN0YW5jZW9mX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiA8ZW0+UFQgTWV0aG9kIEludm9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgTWV0aG9kIEludm9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUTWV0aG9kSW52b2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVjZWl2ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0UmVjZWl2ZXIoKQotCSAqIEBzZWUgI2dldFBUTWV0aG9kSW52b2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRNZXRob2RJbnZvY2F0aW9uX1JlY2VpdmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRQVE1ldGhvZEludm9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUTWV0aG9kSW52b2NhdGlvbl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldEFyZ3VtZW50cyA8ZW0+QXJndW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bcmd1bWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0QXJndW1lbnRzKCkKLQkgKiBAc2VlICNnZXRQVE1ldGhvZEludm9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUTWV0aG9kSW52b2NhdGlvbl9Bcmd1bWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZSA8ZW0+UFQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFBUTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFROYW1lX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVsbExpdGVyYWwgPGVtPlBUIE51bGwgTGl0ZXJhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBOdWxsIExpdGVyYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bGxMaXRlcmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVE51bGxMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWwgPGVtPlBUIE51bWJlciBMaXRlcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIE51bWJlciBMaXRlcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVE51bWJlckxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsI2dldFRva2VuIDxlbT5Ub2tlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRva2VuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsI2dldFRva2VuKCkKLQkgKiBAc2VlICNnZXRQVE51bWJlckxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUTnVtYmVyTGl0ZXJhbF9Ub2tlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA8ZW0+UFQgUGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIFBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbigpCi0JICogQHNlZSAjZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9FeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24gPGVtPlBUIFByZWZpeCBFeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIFByZWZpeCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVFByZWZpeEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9wZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uI2dldE9wZXJhdG9yKCkKLQkgKiBAc2VlICNnZXRQVFByZWZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUUHJlZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbigpCi0JICogQHNlZSAjZ2V0UFRQcmVmaXhFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVFByZWZpeEV4cHJlc3Npb25fRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsIDxlbT5QVCBTdHJpbmcgTGl0ZXJhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBTdHJpbmcgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRTdHJpbmdMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Fc2NhcGVkIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UFRTdHJpbmdMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVFN0cmluZ0xpdGVyYWxfRXNjYXBlZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRMaXRlcmFsVmFsdWUgPGVtPkxpdGVyYWwgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaXRlcmFsIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsI2dldExpdGVyYWxWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UFRTdHJpbmdMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVFN0cmluZ0xpdGVyYWxfTGl0ZXJhbFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFRoaXNMaXRlcmFsIDxlbT5QVCBUaGlzIExpdGVyYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgVGhpcyBMaXRlcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUaGlzTGl0ZXJhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRUaGlzTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbCA8ZW0+UFQgVHlwZSBMaXRlcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIFR5cGUgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUVHlwZUxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWwjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UFRUeXBlTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRUeXBlTGl0ZXJhbF9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uIDxlbT5QVCBJbnZhbGlkIEV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgSW52YWxpZCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uI2dldE1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbiNnZXRNZXNzYWdlKCkKLQkgKiBAc2VlICNnZXRQVEludmFsaWRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEludmFsaWRFeHByZXNzaW9uX01lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VSZWZlcmVuY2UgPGVtPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlUmVmZXJlbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEluc3RhbmNlUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VSZWZlcmVuY2UjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlUmVmZXJlbmNlI2dldFJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZV9SZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiA8ZW0+UFQgQW5vbnltb3VzIENsYXNzIERlY2xhcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEFub255bW91cyBDbGFzcyBEZWNsYXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiNnZXREZWNsYXJhdGlvbiA8ZW0+RGVjbGFyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWNsYXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiNnZXREZWNsYXJhdGlvbigpCi0JICogQHNlZSAjZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25fRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24jZ2V0SW1wb3J0cyA8ZW0+SW1wb3J0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW1wb3J0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiNnZXRJbXBvcnRzKCkKLQkgKiBAc2VlICNnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9JbXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvciA8ZW0+UFQgSW5maXggT3BlcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5QVCBJbmZpeCBPcGVyYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRQVEluZml4T3BlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvciA8ZW0+UFQgUHJlZml4IE9wZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UFQgUHJlZml4IE9wZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRQVFByZWZpeE9wZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZSA8ZW0+SUphdmEgRGF0YSBUeXBlIEluc3RhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklKYXZhIERhdGEgVHlwZSBJbnN0YW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUphdmFEYXRhVHlwZUluc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2UgPGVtPklKYXZhIEluc3RhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklKYXZhIEluc3RhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElKYXZhSW5zdGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUluc3RhbnRpYXRpb25GYWN0b3J5IGdldEluc3RhbnRpYXRpb25GYWN0b3J5KCk7Ci0KLX0gLy9JbnN0YW50aWF0aW9uUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSmF2YUFsbG9jYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0phdmFBbGxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTY1OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSmF2YUFsbG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhIEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIHRoZSBhbGxvY2F0aW9uIGNsYXNzLiBJdCBpcyB0aGUgdmFsdWUgb2YgdGhlICJhbGxvY2F0aW9uIiBwcm9wZXJ0eSBvbiBhIEphdmEgT2JqZWN0IHNvIHRoYXQgdGhlIGFjdHVhbCBhbGxvY2F0aW9uIGNhbiBiZSBjb250cm9sbGVkLiBGb3IgZXhhbXBsZSwgdGhlcmUgY291bGQgYmUgb25lIGZvciBqdXN0IGluaXQgc3RyaW5nLCBvciBvbmUgZm9yIHNlcmlhbGl6ZWQuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMS4wLjAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiB0aGUgYWxsb2NhdGlvbiBjbGFzcy4gSXQgaXMgdGhlIHZhbHVlIG9mIHRoZSAiYWxsb2NhdGlvbiIgcHJvcGVydHkgb24gYSBKYXZhIE9iamVjdCBzbyB0aGF0IHRoZSBhY3R1YWwgYWxsb2NhdGlvbiBjYW4gYmUgY29udHJvbGxlZC4gRm9yIGV4YW1wbGUsIHRoZXJlIGNvdWxkIGJlIG9uZSBmb3IganVzdCBpbml0IHN0cmluZywgb3Igb25lIGZvciBzZXJpYWxpemVkLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEphdmFBbGxvY2F0aW9uKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQWxsb2NhdGlvbiBleHRlbmRzIEVPYmplY3R7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhlIGFsbG9jYXRpb24gaXMgYSBwYXJzZSB0cmVlIGFsbG9jYXRpb24uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwYXJzZSB0cmVlIGFsbG9jYXRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlVHJlZSgpOwotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoZSBhbGxvY2F0aW9uIGlzIGFuIGltcGxpY2l0IGFsbG9jYXRpb24uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpbXBsaWNpdCBhbGxvY2F0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpOwotfSAvLyBKYXZhQWxsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViNmI4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmphdmEsdiAxLjEgMjAwNS8xMC8yOCAyMjo1Njo0NiBya3VscCBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBUIEFub255bW91cyBDbGFzcyBEZWNsYXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbi4gQ3VycmVudGx5IHdlIG9ubHkgc3RvcmUgdGhlIAotICogZW50aXJlIGRlY2xhcmF0aW9uIGFzIGEgc3RyaW5nLCBpbmNsdWRpbmcgdGhlICJuZXcgQUNsYXNzKCkgey4uLn0iLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiNnZXREZWNsYXJhdGlvbiA8ZW0+RGVjbGFyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiNnZXRJbXBvcnRzIDxlbT5JbXBvcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlY2xhcmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVjbGFyYXRpb24gdGV4dC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVjbGFyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlY2xhcmF0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9EZWNsYXJhdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uI2dldERlY2xhcmF0aW9uIDxlbT5EZWNsYXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVjbGFyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlY2xhcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWNsYXJhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wb3J0czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyB0aGUgaW1wb3J0cyBuZWVkZWQgaW4gdGhlIG1haW4gY2xhc3MgYnkgdGhpcyBkZWNsYXJhdGlvbi4gVGhpcyBpcyBhIHRyYW5zaWVudCBhdHRyaWJ1dGUuIEl0IGlzIG5vdCBzZXJpYWxpemVkLCBub3IgaXMgaXQgcGFyc2VkIGludG8gZnJvbSBleGlzdGluZyBjb2RlLiBJdHMgb25seSBwdXJwb3NlIGlzIHRvIGhlbHAgY29kZSBnZW5lcmF0aW9uIG9uIGEgYnJhbmQgbmV3IGRlY2xhcmF0aW9uIHRvIGtub3cgd2hhdCBpbXBvcnRzIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbWFpbiBjbGFzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wb3J0czwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9JbXBvcnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbXBvcnRzKCk7Ci0KLX0gLy8gUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFycmF5QWNjZXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFycmF5QWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMjcyYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnJheSBBY2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBcnJheSBhY2Nlc3MuIGUuZy4geFszXS4gCi0gKiAKLSAqIFVubGlrZSBBU1QsIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiBvZiB0eXBlIHhbM11bNF0gd2lsbCBiZSBkb25lIGluIG9uZSBleHByZXNzaW9uIHJhdGhlciB0aGFuIGhhdmluZyBhIHNlcGFyYXRlIEFycmF5QWNjZXNzIGZvciBlYWNoIGRpbWVuc2lvbi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxpZmljYXRpb24uIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBpZiBpdCBpcyBhIHNpbXBsZSBhcnJheSBhY2Nlc3Mgd2hlcmUgaXQgaXMgb2YgdGhlIGZvcm0ge2V4cHJlc3Npb259W2V4cHJlc3Npb25dW2V4cHJlc3Npb25dLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MjZ2V0QXJyYXkgPGVtPkFycmF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzI2dldEluZGV4ZXMgPGVtPkluZGV4ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlBY2Nlc3MoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRBcnJheUFjY2VzcyBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcnJheTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBhcnJheSB0byBhY2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFycmF5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBcnJheShQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5QWNjZXNzX0FycmF5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRBcnJheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcyNnZXRBcnJheSA8ZW0+QXJyYXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFycmF5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBcnJheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXJyYXkoUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZGV4ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4cHJlc3Npb25zIHJlcHJlc2VudGluZyB0aGUgaW5kZXhlcyBvZiB0aGUgYWNjZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUFjY2Vzc19JbmRleGVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEluZGV4ZXMoKTsKLQotfSAvLyBBcnJheUFjY2VzcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUNyZWF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFycmF5Q3JlYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4Y2FhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFycmF5Q3JlYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFycmF5IENyZWF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQXJyYXkgQ3JlYXRpb24gZXhwcmVzc2lvbiwgZS5nLiBuZXcgaW50WzNdIG9yIG5ldyBqYXZhLmxhbmdTdHJpbmdbXVtdIHt7ImEifSwgeyJiIn19Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXREaW1lbnNpb25zIDxlbT5EaW1lbnNpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0SW5pdGlhbGl6ZXIgPGVtPkluaXRpYWxpemVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5Q3JlYXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRBcnJheUNyZWF0aW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSwgZS5nLiBpbnRbXVtdIG9yIGphdmEubGFuZy5TdHJpbmdbXSwgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2YgZGltZW5zaW9uIGJyYWNrZXRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlDcmVhdGlvbl9UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaW1lbnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsaXN0IG9mIGV4cHJlc3Npb25zIGZvciB0aGUgZGltZW5zaW9ucy4gWW91IGNhbiBoYXZlIFszXVs0XVtdIGJ1dCBbXVszM10gaXMgaW52YWxpZC4gU28gZm9yIGVhY2ggZGltZW5zaW9uIHRoYXQgaGFzIGFuIGV4cHJlc3Npb24sIHRoZXJlIHdpbGwgYmUgYW4gZW50cnkgaW4gdGhlIGxpc3QsIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBXaGVuIHlvdSByZWFjaCB0aGUgZW1wdHkgZGltZW5zaW9ucywgdGhlIGxpc3Qgd2lsbCBlbmQgdG9vLiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGltZW5zaW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlDcmVhdGlvbl9EaW1lbnNpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGltZW5zaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbGl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGluaXRpYWxpemVyLCBpZiBhbnksIGZvciB0aGlzIGFycmF5LiBFLmcuIG5ldyBpbnRbXSB7MiwzfS4gSXQgaXMgdGhlIHsyLDN9LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsaXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5pdGlhbGl6ZXIoUFRBcnJheUluaXRpYWxpemVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUNyZWF0aW9uX0luaXRpYWxpemVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQXJyYXlJbml0aWFsaXplciBnZXRJbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldEluaXRpYWxpemVyIDxlbT5Jbml0aWFsaXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluaXRpYWxpemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbml0aWFsaXplcihQVEFycmF5SW5pdGlhbGl6ZXIgdmFsdWUpOwotCi19IC8vIEFycmF5Q3JlYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNmY1ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFycmF5IEluaXRpYWxpemVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQXJyYXkgaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbi4gVGhpcyBpcyB0aGUgZW50aXJlIGV4cHJlc3Npb24sIGUuZy4gezIsIDN9LCBvciB7ezIsM30sIDR9LiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSB7MiwzfSB3aWxsIGJlIGFuIEFycmF5SW5pdGlhbGl6ZXIgY29udGFpbmVkIHdpdGhpbiB0aGUgZXhwcmVzc2lvbnMgbGlzdCBmb3IgdGhlIHRvcCBBcnJheUluaXRpYWxpemVyLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplciNnZXRFeHByZXNzaW9ucyA8ZW0+RXhwcmVzc2lvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlJbml0aWFsaXplcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEFycmF5SW5pdGlhbGl6ZXIgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpc3RoZSBsaXN0IG9mIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgaW5pdGlhbGl6ZXIsIGUuZy4gezIsIDN9LCBvciB7ezIsM30sIDR9LiBJbiB0aGUgZmlyc3QgY2FzZSBpdCB3aWxsIGJlIHR3byBOdW1iZXJMaXRlcmFscy4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgezIsM30gd2lsbCBiZSBhbiBBcnJheUluaXRpYWxpemVyLCBmb2xsb3dlZCBieSBhIE51bWJlckxpdGVyYWwuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUluaXRpYWxpemVyX0V4cHJlc3Npb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXhwcmVzc2lvbnMoKTsKLQotfSAvLyBBcnJheUluaXRpYWxpemVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEJvb2xlYW5MaXRlcmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEJvb2xlYW5MaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTZkZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRCb29sZWFuTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJvb2xlYW4gTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSBib29sZWFuIGxpdGVyYWwsIGkuZS4gdHJ1ZSBvciBmYWxzZSBkaXJlY3RseSBpbiB0aGUgY29kZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsI2lzQm9vbGVhblZhbHVlIDxlbT5Cb29sZWFuIFZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEJvb2xlYW5MaXRlcmFsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQm9vbGVhbkxpdGVyYWwgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Qm9vbGVhbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIG9mIHRoZSBsaXRlcmFsLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29sZWFuIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCb29sZWFuVmFsdWUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQm9vbGVhbkxpdGVyYWxfQm9vbGVhblZhbHVlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0Jvb2xlYW5WYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbCNpc0Jvb2xlYW5WYWx1ZSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNCb29sZWFuVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJvb2xlYW5WYWx1ZShib29sZWFuIHZhbHVlKTsKLQotfSAvLyBCb29sZWFuTGl0ZXJhbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDYXN0RXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDYXN0RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWJkMjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ2FzdEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ2FzdCBleHByZXNzaW9uLCBlLmcuIChzaG9ydCkgMTAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDYXN0RXhwcmVzc2lvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVENhc3RFeHByZXNzaW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG9mIHRoZSBjYXN0LCBlLmcuIGludCBvciBqYXZhLmxhbmcuU3RyaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDYXN0RXhwcmVzc2lvbl9UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4cHJlc3Npb24gYmVpbmcgY2FzdGVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHByZXNzaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2FzdEV4cHJlc3Npb25fRXhwcmVzc2lvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHByZXNzaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLX0gLy8gQ2FzdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDaGFyYWN0ZXJMaXRlcmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENoYXJhY3RlckxpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyMWQ2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENoYXJhY3RlckxpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFyYWN0ZXIgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSBjaGFyYWN0ZXIgZXhwcmVzc2lvbiwgZS5nLiAnYScgb3IgJ1xyJy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwjZ2V0RXNjYXBlZFZhbHVlIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwjZ2V0Q2hhclZhbHVlIDxlbT5DaGFyIFZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENoYXJhY3RlckxpdGVyYWwoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRDaGFyYWN0ZXJMaXRlcmFsIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzY2FwZWQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLiBJbiBvdGhlciB3b3JkcyB0aGUgbGl0ZXJhbCBleGFjdGx5IGFzIGl0IGlzIGluIHRoZSBqYXZhIGZpbGUuIEUuZy4gJ2EnIG9yICdccicuIEluY2x1ZGluZyB0aGUgc3Vycm91bmRpbmcgc2luZ2xlIHF1b3RlcyB0aGVtc2VsdmVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc2NhcGVkIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFc2NhcGVkVmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsX0VzY2FwZWRWYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFc2NhcGVkVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzY2FwZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXNjYXBlZFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFyIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHByaW1pdGl2ZSBjaGFyYWN0ZXIgd2l0aG91dCB0aGUgcXVvdGVzLiBFc2NhcGUgYXJlIGV2YWx1YXRlZCBhbmQgdHVybmVkIGludG8gdGhlaXIgY2hhcmFjdGVyIHZhbHVlLiBUaGlzIGlzIGEgdHJhbnNpZW50IGZpZWxkLiBJZiBub3Qgc2V0IHdoZW4gY3JlYXRlZCB3aGVuIHF1ZXJpZWQgaXQgd2lsbCBjcmVhdGUgaXQuIFR5cGljYWxseSBpdCB3aWxsIGJlIHNldCB3aGVuIGNyZWF0ZWQgZnJvbSBhbiBBU1Qgbm9kZSBzaW5jZSB0aGUgbm9kZSBhbHJlYWR5IGhhcyBldmFsdWF0ZWQgaXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYXIgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENoYXJWYWx1ZShjaGFyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsX0NoYXJWYWx1ZSgpCi0JICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JY2hhciBnZXRDaGFyVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCNnZXRDaGFyVmFsdWUgPGVtPkNoYXIgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYXIgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYXJWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2hhclZhbHVlKGNoYXIgdmFsdWUpOwotCi19IC8vIENoYXJhY3RlckxpdGVyYWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzFlMzEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNsYXNzIEluc3RhbmNlIENyZWF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbi4gRS5nLiBuZXcgU3RyaW5nKCJhIikKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiNnZXRBcmd1bWVudHMgPGVtPkFyZ3VtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgY2xhc3MuIEUuZy4gamF2YS5sYW5nLlN0cmluZy4gVGhpcyBzaG91bGQgYmUgZnVsbHktcXVhbGlmaWVkIGZvciBhbGxvY2F0aW9uIHB1cnBvc2VzLiBJdCBzaG91bGQgYWxzbyBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBpZiBYIGlzIGFuIGlubmVyIGNsYXNzIG9mIGouWSwgdGhlbiB0aGUgdHlwZSBoZXJlIHNob3VsZCBiZSAiai5ZJFgiLiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFyZ3VtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXJndW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb25fQXJndW1lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXJndW1lbnRzKCk7Ci0KLX0gLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDb25kaXRpb25hbEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEyMTVhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25kaXRpb25hbCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHRlc3QgRXhwcmVzc29uLCBlLmcuICh4PTMpID8gMSA6IDIKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRDb25kaXRpb24gPGVtPkNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0VHJ1ZSA8ZW0+VHJ1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0RmFsc2UgPGVtPkZhbHNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb25kaXRpb24gZXhwcmVzc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb25kaXRpb24oUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fQ29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRDb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldENvbmRpdGlvbiA8ZW0+Q29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29uZGl0aW9uKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcnVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHJ1ZSBleHByZXNzaW9uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRydWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRydWUoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fVHJ1ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0VHJ1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0VHJ1ZSA8ZW0+VHJ1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJ1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VHJ1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHJ1ZShQVEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmFsc2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmYWxzZSBleHByZXNzaW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GYWxzZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RmFsc2UoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fRmFsc2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldEZhbHNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRGYWxzZSA8ZW0+RmFsc2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZhbHNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRGYWxzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmFsc2UoUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotfSAvLyBDb25kaXRpb25hbEV4cHJlc3Npb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BURXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTZjMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEV4cHJlc3Npb24oKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBURXhwcmVzc2lvbiBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvciBvbiBhIHZpc2l0IG9mIHRoZSBjdXJyZW50IG5vZGUuCi0JICogCi0JICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3Igb2JqZWN0Ci0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHZpc2l0b3IgaXMgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VwdChQYXJzZVZpc2l0b3IgdmlzaXRvcik7Ci19IC8vIEV4cHJlc3Npb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BURmllbGRBY2Nlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BURmllbGRBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0N2ZiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEZpZWxkQWNjZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmllbGQgQWNjZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQWNjZXNzIGEgZmllbGQgZXhwcmVzc2lvbiwgZS5nLiBqYXZhLmF3dC5Db2xvci5yZWQKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldFJlY2VpdmVyIDxlbT5SZWNlaXZlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcyNnZXRGaWVsZCA8ZW0+RmllbGQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBURmllbGRBY2Nlc3MoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRGaWVsZEFjY2VzcyBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWNlaXZlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBvYmplY3QgdGhhdCB0aGUgZmllbGQgaXMgaW4sIGUuZy4gamF2YS5hd3QuQ29sb3IuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlY2VpdmVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZWNlaXZlcihQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEZpZWxkQWNjZXNzX1JlY2VpdmVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRSZWNlaXZlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcyNnZXRSZWNlaXZlciA8ZW0+UmVjZWl2ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlY2VpdmVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZWNlaXZlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVjZWl2ZXIoUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgYWNjZXNzZWQsIGUuZy4gcmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRGaWVsZEFjY2Vzc19GaWVsZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcyNnZXRGaWVsZCA8ZW0+RmllbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBGaWVsZEFjY2VzcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbmZpeEV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5maXhFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjZjM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbmZpeEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluZml4IEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBleHByZXNzaW9uIHdpdGggYW4gb3BlcmF0b3IgdGhhdCBoYXMgdHdvIG9wZXJhbmRzLCBlLmcuIDMgKyA0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldExlZnRPcGVyYW5kIDxlbT5MZWZ0IE9wZXJhbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0UmlnaHRPcGVyYW5kIDxlbT5SaWdodCBPcGVyYW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRFeHRlbmRlZE9wZXJhbmRzIDxlbT5FeHRlbmRlZCBPcGVyYW5kczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbmZpeEV4cHJlc3Npb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRJbmZpeEV4cHJlc3Npb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVmdCBPcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MZWZ0IE9wZXJhbmQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVmdCBPcGVyYW5kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRMZWZ0T3BlcmFuZChQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluZml4RXhwcmVzc2lvbl9MZWZ0T3BlcmFuZCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0TGVmdE9wZXJhbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldExlZnRPcGVyYW5kIDxlbT5MZWZ0IE9wZXJhbmQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxlZnQgT3BlcmFuZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TGVmdE9wZXJhbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExlZnRPcGVyYW5kKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcGVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3BlcmF0b3IsIGUuZy4gKwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcGVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3IKLQkgKiBAc2VlICNzZXRPcGVyYXRvcihQVEluZml4T3BlcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUSW5maXhPcGVyYXRvciBnZXRPcGVyYXRvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcGVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3IKLQkgKiBAc2VlICNnZXRPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3BlcmF0b3IoUFRJbmZpeE9wZXJhdG9yIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJpZ2h0IE9wZXJhbmQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByaWdodCBleHByZXNzaW9uLiBpLmUuIDQgb2YgIjMgKyA0IgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SaWdodCBPcGVyYW5kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSaWdodE9wZXJhbmQoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbmZpeEV4cHJlc3Npb25fUmlnaHRPcGVyYW5kKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRSaWdodE9wZXJhbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldFJpZ2h0T3BlcmFuZCA8ZW0+UmlnaHQgT3BlcmFuZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmlnaHQgT3BlcmFuZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmlnaHRPcGVyYW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSaWdodE9wZXJhbmQoUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIE9wZXJhbmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFVzZWQgd2hlbiB0aGVyZSBhcmUgYSBzZXJpZXMgb2YgaW5maXggb3BlcmF0aW9ucyBvZiB0aGUgc2FtZSBvcGVyYXRvciwgZS5nLiAxICsgMiArIDMgKyA0LiAxIGFuZCAyIHdpbGwgZ28gaW50byBsZWZ0IGFuZCByaWdodCwgd2hpbGUgezMsIDR9IHdpbGwgZ28gaW50byB0aGUgZXh0ZW5kZWQgb3BlcmFuZHMuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBPcGVyYW5kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5maXhFeHByZXNzaW9uX0V4dGVuZGVkT3BlcmFuZHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHRlbmRlZE9wZXJhbmRzKCk7Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgZXhwcmVzc2lvbgotCSAqIElmIHRoZXJlIGlzIG5vIGxlZnQgb3BlcmFuZCBhbmQgYSByaWdodCBvcGVyYW5kLCBvciB2aWNlIHZlcnNhLCBhbmQgbm8gZXh0ZW5kZWQgb3BlcmFuZHMKLQkgKiByZXR1cm4gdGhlIHJlbWFpbmluZyBzaW5nbGUgb3BlcmFuZAotCSAqIElmIHRoZXJlIGlzIG5vIGxlZnQgb3BlcmFuZCBhbmQgYSByaWdodCBhbmQgc29tZSBleHRlbmRlZCBvbmVzIHNodWZmbGUgZXZlcnl0aGluZyBhbG9uZwotCSAqIHNvIHRoYXQgdGhlIHJpZ2h0IGJlY29tZXMgdGhlIGxlZnQgYW5kIHRoZSBmaXJzdCBleHRlbmRlZCBtb3ZlcyBpbnRvIHRoZSByaWdodAotCSAqIG9yIGlmIG5vIHJpZ2h0IGFuZCBhIGxlZnQgdGhlbiBqdXN0IG1vdmUgdGhlIGZpcnN0IGV4dGVuZGVkIGludG8gdGhlIHJpZ2h0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRFeHByZXNzaW9uIGFzQ29tcHJlc3NlZEV4cHJlc3Npb24oKTsKLQotfSAvLyBJbmZpeEV4cHJlc3Npb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5maXhPcGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbmZpeE9wZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwN2MxNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbmZpeE9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5JbmZpeCBPcGVyYXRvcjwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBFbnVtZXJhdG9yIGZvciB0aGUgb3BlcmF0b3Igb24gYW4gSW5maXhFeHByZXNzaW9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluZml4T3BlcmF0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQVEluZml4T3BlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUVTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogKiBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNUSU1FU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRVMgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RElWSURFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogLyBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNESVZJREVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJVklERSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRU1BSU5ERVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAlIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1JFTUFJTkRFUl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNQUlOREVSID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBMVVM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiArIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1BMVVNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMVVMgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TUlOVVM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAtIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI01JTlVTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5VUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5MRUZUIFNISUZUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPDwgb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjTEVGVF9TSElGVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9TSElGVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SSUdIVCBTSElGVCBTSUdORUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA+PiBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNSSUdIVF9TSElGVF9TSUdORURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1NISUZUX1NJR05FRCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SSUdIVCBTSElGVCBVTlNJR05FRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqID4+PiBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNSSUdIVF9TSElGVF9VTlNJR05FRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfU0hJRlRfVU5TSUdORUQgPSA3OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TEVTUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIDwgIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0xFU1NfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFU1MgPSA4OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+R1JFQVRFUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqID4gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjR1JFQVRFUl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JFQVRFUiA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5MRVNTIEVRVUFMUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIDw9IG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0xFU1NfRVFVQUxTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVNTX0VRVUFMUyA9IDEwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+R1JFQVRFUiBFUVVBTFM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA+PSBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNHUkVBVEVSX0VRVUFMU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JFQVRFUl9FUVVBTFMgPSAxMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVRVUFMUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqID09IG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0VRVUFMU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVFVQUxTID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT1QgRVFVQUxTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogIT0gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjTk9UX0VRVUFMU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0VRVUFMUyA9IDEzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WE9SPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogXiBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNYT1JfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhPUiA9IDE0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QU5EPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogJiBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNBTkRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFORCA9IDE1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1I8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiB8ICBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNPUl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1IgPSAxNjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNPTkRJVElPTkFMIEFORDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICYmIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0NPTkRJVElPTkFMX0FORF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORElUSU9OQUxfQU5EID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DT05ESVRJT05BTCBPUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIHx8IG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0NPTkRJVElPTkFMX09SX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ESVRJT05BTF9PUiA9IDE4OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVElNRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBUSU1FU19MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihUSU1FUywgIlRJTUVTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ESVZJREU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRElWSURFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgRElWSURFX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKERJVklERSwgIkRJVklERSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVNQUlOREVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFTUFJTkRFUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIFJFTUFJTkRFUl9MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihSRU1BSU5ERVIsICJSRU1BSU5ERVIiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBMVVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUExVUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIFBMVVNfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoUExVUywgIlBMVVMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk1JTlVTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI01JTlVTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgTUlOVVNfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoTUlOVVMsICJNSU5VUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TEVGVCBTSElGVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMRUZUX1NISUZUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgTEVGVF9TSElGVF9MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihMRUZUX1NISUZULCAiTEVGVF9TSElGVCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UklHSFQgU0hJRlQgU0lHTkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JJR0hUX1NISUZUX1NJR05FRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIFJJR0hUX1NISUZUX1NJR05FRF9MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihSSUdIVF9TSElGVF9TSUdORUQsICJSSUdIVF9TSElGVF9TSUdORUQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJJR0hUIFNISUZUIFVOU0lHTkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JJR0hUX1NISUZUX1VOU0lHTkVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgUklHSFRfU0hJRlRfVU5TSUdORURfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoUklHSFRfU0hJRlRfVU5TSUdORUQsICJSSUdIVF9TSElGVF9VTlNJR05FRCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TEVTUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMRVNTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgTEVTU19MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihMRVNTLCAiTEVTUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+R1JFQVRFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNHUkVBVEVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgR1JFQVRFUl9MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihHUkVBVEVSLCAiR1JFQVRFUiIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TEVTUyBFUVVBTFM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTEVTU19FUVVBTFMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBMRVNTX0VRVUFMU19MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihMRVNTX0VRVUFMUywgIkxFU1NfRVFVQUxTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5HUkVBVEVSIEVRVUFMUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNHUkVBVEVSX0VRVUFMUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIEdSRUFURVJfRVFVQUxTX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKEdSRUFURVJfRVFVQUxTLCAiR1JFQVRFUl9FUVVBTFMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVRVUFMUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFUVVBTFMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBFUVVBTFNfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoRVFVQUxTLCAiRVFVQUxTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT1QgRVFVQUxTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PVF9FUVVBTFMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBOT1RfRVFVQUxTX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKE5PVF9FUVVBTFMsICJOT1RfRVFVQUxTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5YT1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjWE9SCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgWE9SX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKFhPUiwgIlhPUiIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QU5EPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FORAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIEFORF9MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihBTkQsICJBTkQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9SPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09SCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgT1JfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoT1IsICJPUiIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q09ORElUSU9OQUwgQU5EPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTkRJVElPTkFMX0FORAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIENPTkRJVElPTkFMX0FORF9MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihDT05ESVRJT05BTF9BTkQsICJDT05ESVRJT05BTF9BTkQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNPTkRJVElPTkFMIE9SPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTkRJVElPTkFMX09SCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgQ09ORElUSU9OQUxfT1JfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoQ09ORElUSU9OQUxfT1IsICJDT05ESVRJT05BTF9PUiIpOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlBUIEluZml4IE9wZXJhdG9yPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3JbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgUFRJbmZpeE9wZXJhdG9yW10gewotCQkJVElNRVNfTElURVJBTCwKLQkJCURJVklERV9MSVRFUkFMLAotCQkJUkVNQUlOREVSX0xJVEVSQUwsCi0JCQlQTFVTX0xJVEVSQUwsCi0JCQlNSU5VU19MSVRFUkFMLAotCQkJTEVGVF9TSElGVF9MSVRFUkFMLAotCQkJUklHSFRfU0hJRlRfU0lHTkVEX0xJVEVSQUwsCi0JCQlSSUdIVF9TSElGVF9VTlNJR05FRF9MSVRFUkFMLAotCQkJTEVTU19MSVRFUkFMLAotCQkJR1JFQVRFUl9MSVRFUkFMLAotCQkJTEVTU19FUVVBTFNfTElURVJBTCwKLQkJCUdSRUFURVJfRVFVQUxTX0xJVEVSQUwsCi0JCQlFUVVBTFNfTElURVJBTCwKLQkJCU5PVF9FUVVBTFNfTElURVJBTCwKLQkJCVhPUl9MSVRFUkFMLAotCQkJQU5EX0xJVEVSQUwsCi0JCQlPUl9MSVRFUkFMLAotCQkJQ09ORElUSU9OQUxfQU5EX0xJVEVSQUwsCi0JCQlDT05ESVRJT05BTF9PUl9MSVRFUkFMLAotCQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9QRVJBVE9SX1NUUklORzsKLQlzdGF0aWMgewotCQlPUEVSQVRPUl9TVFJJTkcgPSBuZXcgU3RyaW5nW1ZBTFVFU19BUlJBWS5sZW5ndGhdOwotCQlPUEVSQVRPUl9TVFJJTkdbVElNRVNdID0gIioiOwotCQlPUEVSQVRPUl9TVFJJTkdbRElWSURFXSA9ICIvIjsKLQkJT1BFUkFUT1JfU1RSSU5HW1JFTUFJTkRFUl0gPSAiJSI7Ci0JCU9QRVJBVE9SX1NUUklOR1tQTFVTXSA9ICIrIjsKLQkJT1BFUkFUT1JfU1RSSU5HW01JTlVTXSA9ICItIjsKLQkJT1BFUkFUT1JfU1RSSU5HW0xFRlRfU0hJRlRdID0gIjwiOwotCQlPUEVSQVRPUl9TVFJJTkdbUklHSFRfU0hJRlRfU0lHTkVEXSA9ICI+PiI7Ci0JCU9QRVJBVE9SX1NUUklOR1tSSUdIVF9TSElGVF9VTlNJR05FRF0gPSAiPj4+IjsKLQkJT1BFUkFUT1JfU1RSSU5HW0xFU1NdID0gIjwiOwotCQlPUEVSQVRPUl9TVFJJTkdbR1JFQVRFUl0gPSAiPiI7Ci0JCU9QRVJBVE9SX1NUUklOR1tMRVNTX0VRVUFMU10gPSAiPD0iOwotCQlPUEVSQVRPUl9TVFJJTkdbR1JFQVRFUl9FUVVBTFNdID0gIj49IjsKLQkJT1BFUkFUT1JfU1RSSU5HW0VRVUFMU10gPSAiPT0iOwotCQlPUEVSQVRPUl9TVFJJTkdbTk9UX0VRVUFMU10gPSAiIT0iOwotCQlPUEVSQVRPUl9TVFJJTkdbWE9SXSA9ICJeIjsKLQkJT1BFUkFUT1JfU1RSSU5HW0FORF0gPSAiJiI7Ci0JCU9QRVJBVE9SX1NUUklOR1tPUl0gPSAifCI7Ci0JCU9QRVJBVE9SX1NUUklOR1tDT05ESVRJT05BTF9BTkRdID0gIiYmIjsKLQkJT1BFUkFUT1JfU1RSSU5HW0NPTkRJVElPTkFMX09SXSA9ICJ8fCI7Ci0JfQotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlBUIEluZml4IE9wZXJhdG9yPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5QVCBJbmZpeCBPcGVyYXRvcjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBUSW5maXhPcGVyYXRvciBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVBUSW5maXhPcGVyYXRvciByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlBUIEluZml4IE9wZXJhdG9yPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBUSW5maXhPcGVyYXRvciBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgVElNRVM6IHJldHVybiBUSU1FU19MSVRFUkFMOwotCQkJY2FzZSBESVZJREU6IHJldHVybiBESVZJREVfTElURVJBTDsKLQkJCWNhc2UgUkVNQUlOREVSOiByZXR1cm4gUkVNQUlOREVSX0xJVEVSQUw7Ci0JCQljYXNlIFBMVVM6IHJldHVybiBQTFVTX0xJVEVSQUw7Ci0JCQljYXNlIE1JTlVTOiByZXR1cm4gTUlOVVNfTElURVJBTDsKLQkJCWNhc2UgTEVGVF9TSElGVDogcmV0dXJuIExFRlRfU0hJRlRfTElURVJBTDsKLQkJCWNhc2UgUklHSFRfU0hJRlRfU0lHTkVEOiByZXR1cm4gUklHSFRfU0hJRlRfU0lHTkVEX0xJVEVSQUw7Ci0JCQljYXNlIFJJR0hUX1NISUZUX1VOU0lHTkVEOiByZXR1cm4gUklHSFRfU0hJRlRfVU5TSUdORURfTElURVJBTDsKLQkJCWNhc2UgTEVTUzogcmV0dXJuIExFU1NfTElURVJBTDsKLQkJCWNhc2UgR1JFQVRFUjogcmV0dXJuIEdSRUFURVJfTElURVJBTDsKLQkJCWNhc2UgTEVTU19FUVVBTFM6IHJldHVybiBMRVNTX0VRVUFMU19MSVRFUkFMOwotCQkJY2FzZSBHUkVBVEVSX0VRVUFMUzogcmV0dXJuIEdSRUFURVJfRVFVQUxTX0xJVEVSQUw7Ci0JCQljYXNlIEVRVUFMUzogcmV0dXJuIEVRVUFMU19MSVRFUkFMOwotCQkJY2FzZSBOT1RfRVFVQUxTOiByZXR1cm4gTk9UX0VRVUFMU19MSVRFUkFMOwotCQkJY2FzZSBYT1I6IHJldHVybiBYT1JfTElURVJBTDsKLQkJCWNhc2UgQU5EOiByZXR1cm4gQU5EX0xJVEVSQUw7Ci0JCQljYXNlIE9SOiByZXR1cm4gT1JfTElURVJBTDsKLQkJCWNhc2UgQ09ORElUSU9OQUxfQU5EOiByZXR1cm4gQ09ORElUSU9OQUxfQU5EX0xJVEVSQUw7Ci0JCQljYXNlIENPTkRJVElPTkFMX09SOiByZXR1cm4gQ09ORElUSU9OQUxfT1JfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUFRJbmZpeE9wZXJhdG9yKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb3BlcmF0b3Igc3RyaW5nIChpLmUuIGZvciBQTFVTIHJldHVybiAiKyIpLgotCSAqIEByZXR1cm4gVGhlIG9wZXJhdG9yIHN0cmluZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9wZXJhdG9yKCkgewotCQlyZXR1cm4gT1BFUkFUT1JfU1RSSU5HW2dldFZhbHVlKCldOwotCX0KLQotfSAvL0luZml4T3BlcmF0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5zdGFuY2VSZWZlcmVuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5zdGFuY2VSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmNTE2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluc3RhbmNlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VSZWZlcmVuY2UjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5zdGFuY2VSZWZlcmVuY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRJbnN0YW5jZVJlZmVyZW5jZSBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlZmVyZW5jZShJSmF2YUluc3RhbmNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZV9SZWZlcmVuY2UoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSUphdmFJbnN0YW5jZSBnZXRSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VSZWZlcmVuY2UjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZlcmVuY2UoSUphdmFJbnN0YW5jZSB2YWx1ZSk7Ci0KLX0gLy8gUFRJbnN0YW5jZVJlZmVyZW5jZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbnN0YW5jZW9mLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluc3RhbmNlb2YuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjNjliYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluc3RhbmNlb2YuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnN0YW5jZW9mPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogSW5zdGFuY2VvZiBleHByZXNzaW9uLCBlLmcuIHggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldE9wZXJhbmQgPGVtPk9wZXJhbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluc3RhbmNlb2YoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRJbnN0YW5jZW9mIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wZXJhbmQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSB0byB0ZXN0LCBlLmcuIHggaW4geCBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3BlcmFuZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T3BlcmFuZChQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluc3RhbmNlb2ZfT3BlcmFuZCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0T3BlcmFuZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldE9wZXJhbmQgPGVtPk9wZXJhbmQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wZXJhbmQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE9wZXJhbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9wZXJhbmQoUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSB0ZXN0LCBlLmcuIGphdmEubGFuZy5TdHJpbmcuIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5zdGFuY2VvZl9UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW5zdGFuY2VvZgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbnZhbGlkRXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbnZhbGlkRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzEwOTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW52YWxpZEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnZhbGlkIEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGlzIHVzZWQgd2hlbiB3ZSBoYXZlIHNvbWUgZXhwcmVzc2lvbiB3ZSBqdXN0IGNhbid0IGV2YWx1YXRlIGZvciBvdXIgcHVycG9zZXMuIEl0IGFsbG93cyB1cyB0byB0ZWxsIHRoZSBldmFsdWF0aW9uIHdoYXQgaXMgYWN0dWFsbHkgd3JvbmcuIEl0IHNob3VsZCBiZSBwbGFjZWQgYXMgdGhlIHJvb3QgZXhwcmVzc2lvbiB0byBwcmV2ZW50IHByb2Nlc3NpbmcgbXVjaCBvZiB0aGUgdHJlZSBhbmQgdGhlbiBmaW5hbGx5IGZhaWwuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbiNnZXRNZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEludmFsaWRFeHByZXNzaW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUSW52YWxpZEV4cHJlc3Npb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBtZXNzYWdlIGFzIHRvIHdoeSBpdCBpcyBpbnZhbGlkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXNzYWdlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW52YWxpZEV4cHJlc3Npb25fTWVzc2FnZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uI2dldE1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1lc3NhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBJbnZhbGlkRXhwcmVzc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRNZXRob2RJbnZvY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE1ldGhvZEludm9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2MjViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE1ldGhvZEludm9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBJbnZvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogTWV0aG9kSW52b2NhdGlvbiBleHByZXNzaW9uLCBlLmcuIHguZ2V0WSgzKQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXRSZWNlaXZlciA8ZW0+UmVjZWl2ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0QXJndW1lbnRzIDxlbT5Bcmd1bWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTWV0aG9kSW52b2NhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVE1ldGhvZEludm9jYXRpb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVjZWl2ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdobyB0aGUgbWV0aG9kIGlzIGludm9rZWQgYWdhaW5zdC4gVGhpcyBtYXkgYmUgbm90IHNldCwgd2hpY2ggbWVhbnMgInRoaXMiLiBJdCBtYXkgYWxzbyBiZSBhIE5hbWUsIHdoaWNoIHdvdWxkIG1lYW4gYSBjbGFzcyBsaWtlICJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWNlaXZlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVjZWl2ZXIoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRNZXRob2RJbnZvY2F0aW9uX1JlY2VpdmVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRSZWNlaXZlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldFJlY2VpdmVyIDxlbT5SZWNlaXZlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVjZWl2ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlY2VpdmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWNlaXZlcihQVEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyBpbnZva2VkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTWV0aG9kSW52b2NhdGlvbl9OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bcmd1bWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxpc3Qgb2YgYXJndW1lbnRzLCBpZiBhbnksIHRvIHRoZSBtZXRob2QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFyZ3VtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTWV0aG9kSW52b2NhdGlvbl9Bcmd1bWVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBcmd1bWVudHMoKTsKLQotfSAvLyBNZXRob2RJbnZvY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTdjYmU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIHJlcHJlc2VudHMgYSBuYW1lLiBUaGlzIGNhbiBoYXBwZW4gZm9yIHRoZSByZWNlaXZlciBvZiBhIG1ldGhvZCBpbnZvY2F0aW9uLCBlLmcuIHguZ2V0WSgpIG9yIGphdmEubGFuZy5TdHJpbmcudmFsdWVPZigxMCkuIEluIHRoZXNlIGNhc2VzIHlvdSB3b3VsZCBoYXZlIGEgbmFtZSBvZiAieCIgb3IgImphdmEubGFuZy5TdHJpbmciLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVE5hbWUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFROYW1lIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lLCB3aGljaCBjYW4gYmUgYSB0eXBlIG9yIGEgdmFyaWFibGUuIElmIGl0IGlzIGEgdHlwZSwgdGhlbiAgaXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFROYW1lX05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBOYW1lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE51bGxMaXRlcmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE51bGxMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZjA2YWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFROdWxsTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk51bGwgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJlcHJlc2VudHMgdGhlIGV4cHJlc3Npb24gIm51bGwiCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFROdWxsTGl0ZXJhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVE51bGxMaXRlcmFsIGV4dGVuZHMgUFRFeHByZXNzaW9uewotfSAvLyBOdWxsTGl0ZXJhbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFROdW1iZXJMaXRlcmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE51bWJlckxpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNDIzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE51bWJlckxpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk51bWJlciBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUmVwcmVzZW50IGEgbnVtYmVyIHByaW1pdGl2ZSBsaXRlcmFsLCBlLmcuIDEwLiBPbmUgb3B0aW1pemF0aW9uIHRoYXQgd2lsbCBiZSBwZXJmb3JtZWQgaXMgdGhhdCBpZiBhbiBleHByZXNzaW9uIGlzIG9mIHRoZSBmb3JtICtudW1iZXIgb3IgLW51bWJlciwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbSBhIFByZWZpeEV4cHJlc3Npb24gd2l0aCBhIE51bWJlckxpdGVyYWwgdG8ganVzdCBhIE51bWJlckxpdGVyYWwuIFRoaXMgd2lsbCBzaW1wbGlmeSB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsI2dldFRva2VuIDxlbT5Ub2tlbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFROdW1iZXJMaXRlcmFsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUTnVtYmVyTGl0ZXJhbCBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub2tlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRva2VuIHZhbHVlLCBlLmcuIDEwLCAxMGQsIG9yIC0xMC43NQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub2tlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VG9rZW4oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFROdW1iZXJMaXRlcmFsX1Rva2VuKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRva2VuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWwjZ2V0VG9rZW4gPGVtPlRva2VuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ub2tlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VG9rZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRva2VuKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTnVtYmVyTGl0ZXJhbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY5ZWI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUUGFyZW50aGVzaXplZEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJlbnRoZXNpemVkIEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBleHByZXNzaW9uIHdpdGhpbiBwYXJlbnRoZXNpcywgZS5nLiAoeCszKQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBleHByZXNzaW9uIHdyYXBwZWQgYnkgdGhlIHBhcmVudGhlc2lzLCBlLmcuICh4KzMpIHRoZW4gdGhlIGV4cHJlc3Npb24gaXMgIngrMyIKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0V4cHJlc3Npb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gdmFsdWUpOwotCi19IC8vIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFByZWZpeEV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUUHJlZml4RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTkwNDFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUUHJlZml4RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByZWZpeCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBvbmUgb3BlcmFuZCBvcGVyYXRvciwgd2hlcmUgdGhlIG9wZXJhdG9yIGNvbWVzIGJlZm9yZSB0aGUgb3BlcmFuZCwgZS5nLiAtICh4KzMpLiBJbiBBU1QsIGV2ZW4gLTMgaXMgbW9kZWxlZCBhcyBhIFByZWZpeEV4cHJlc3Npb24gb2Ygb3BlcmF0b3IgIi0iIGFuZCBleHByZXNzaW9uIG9mIE51bWJlckxpdGVyYWwoMykuIEJ1dCB3ZSBvcHRpbWl6ZSB0aGlzIGF3YXkgYW5kIGp1c3QgdXNlIGEgTnVtYmVyTGl0ZXJhbCgtMykgZGlyZWN0bHkgaW5zdGVhZC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRQcmVmaXhFeHByZXNzaW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUUHJlZml4RXhwcmVzc2lvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcGVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG9wZXJhdG9yIG9mIHRoaXMgZXhwcmVzc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3BlcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvcgotCSAqIEBzZWUgI3NldE9wZXJhdG9yKFBUUHJlZml4T3BlcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFByZWZpeEV4cHJlc3Npb25fT3BlcmF0b3IoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVFByZWZpeE9wZXJhdG9yIGdldE9wZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcGVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yCi0JICogQHNlZSAjZ2V0T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9wZXJhdG9yKFBUUHJlZml4T3BlcmF0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4cHJlc3Npb24gdGhhdCB0aGUgb3BlcmF0b3IgaXMgYXBwbGllZCB0by4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFByZWZpeEV4cHJlc3Npb25fRXhwcmVzc2lvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotfSAvLyBQcmVmaXhFeHByZXNzaW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFByZWZpeE9wZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFByZWZpeE9wZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NWQ0YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRQcmVmaXhPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+UHJlZml4IE9wZXJhdG9yPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBwcmVmaXggZXhwcmVzc2lvbiBvcGVyYXRvci4gV2UgYXJlIG5vdCBtb2RlbGluZyArKyBhbmQgLS0uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUUHJlZml4T3BlcmF0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQVFByZWZpeE9wZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QTFVTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogKyBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNQTFVTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTFVTID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk1JTlVTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogLSBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNNSU5VU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOVVMgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q09NUExFTUVOVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIH4gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjQ09NUExFTUVOVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFTUVOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT1Q8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAhIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI05PVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBMVVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUExVUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRQcmVmaXhPcGVyYXRvciBQTFVTX0xJVEVSQUwgPSBuZXcgUFRQcmVmaXhPcGVyYXRvcihQTFVTLCAiUExVUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TUlOVVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTUlOVVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUUHJlZml4T3BlcmF0b3IgTUlOVVNfTElURVJBTCA9IG5ldyBQVFByZWZpeE9wZXJhdG9yKE1JTlVTLCAiTUlOVVMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNPTVBMRU1FTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09NUExFTUVOVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRQcmVmaXhPcGVyYXRvciBDT01QTEVNRU5UX0xJVEVSQUwgPSBuZXcgUFRQcmVmaXhPcGVyYXRvcihDT01QTEVNRU5ULCAiQ09NUExFTUVOVCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRQcmVmaXhPcGVyYXRvciBOT1RfTElURVJBTCA9IG5ldyBQVFByZWZpeE9wZXJhdG9yKE5PVCwgIk5PVCIpOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlBUIFByZWZpeCBPcGVyYXRvcjwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUFRQcmVmaXhPcGVyYXRvcltdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBQVFByZWZpeE9wZXJhdG9yW10gewotCQkJUExVU19MSVRFUkFMLAotCQkJTUlOVVNfTElURVJBTCwKLQkJCUNPTVBMRU1FTlRfTElURVJBTCwKLQkJCU5PVF9MSVRFUkFMLAotCQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9QRVJBVE9SX1NUUklORzsKLQlzdGF0aWMgewotCQlPUEVSQVRPUl9TVFJJTkcgPSBuZXcgU3RyaW5nW1ZBTFVFU19BUlJBWS5sZW5ndGhdOwotCQlPUEVSQVRPUl9TVFJJTkdbUExVU10gPSAiKyI7Ci0JCU9QRVJBVE9SX1NUUklOR1tNSU5VU10gPSAiLSI7Ci0JCU9QRVJBVE9SX1NUUklOR1tDT01QTEVNRU5UXSA9ICJ+IjsKLQkJT1BFUkFUT1JfU1RSSU5HW05PVF0gPSAiISI7Ci0JfQotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlBUIFByZWZpeCBPcGVyYXRvcjwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UFQgUHJlZml4IE9wZXJhdG9yPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUFRQcmVmaXhPcGVyYXRvciBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVBUUHJlZml4T3BlcmF0b3IgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5QVCBQcmVmaXggT3BlcmF0b3I8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUFRQcmVmaXhPcGVyYXRvciBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgUExVUzogcmV0dXJuIFBMVVNfTElURVJBTDsKLQkJCWNhc2UgTUlOVVM6IHJldHVybiBNSU5VU19MSVRFUkFMOwotCQkJY2FzZSBDT01QTEVNRU5UOiByZXR1cm4gQ09NUExFTUVOVF9MSVRFUkFMOwotCQkJY2FzZSBOT1Q6IHJldHVybiBOT1RfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUFRQcmVmaXhPcGVyYXRvcihpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9wZXJhdG9yIHN0cmluZyAoaS5lLiBmb3IgUExVUyByZXR1cm4gIisiKS4KLQkgKiBAcmV0dXJuIFRoZSBvcGVyYXRvciBzdHJpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIE9QRVJBVE9SX1NUUklOR1tnZXRWYWx1ZSgpXTsKLQl9Ci19IC8vUHJlZml4T3BlcmF0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUU3RyaW5nTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRTdHJpbmdMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYTVlY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRTdHJpbmdMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RyaW5nIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSZXByZXNlbnRhdGlvbiBvZiBhIHN0cmluZyBsaXRlcmFsLCBlLmcuICJhc2RmIi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwjZ2V0RXNjYXBlZFZhbHVlIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwjZ2V0TGl0ZXJhbFZhbHVlIDxlbT5MaXRlcmFsIFZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFN0cmluZ0xpdGVyYWwoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRTdHJpbmdMaXRlcmFsIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzY2FwZWQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGVzY2FwZWQgc3RyaW5nLiBJbiBvdGhlciB3b3JkcyB0aGUgbGl0ZXJhbCBleGFjdGx5IGFzIGl0IGlzIGluIHRoZSBqYXZhIGZpbGUuIEUuZy4gImFiIiBvciAiY1xyIi4gSW5jbHVkaW5nIHRoZSBzdXJyb3VuZGluZyBxdW90ZXMgdGhlbXNlbHZlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXNjYXBlZFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUU3RyaW5nTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXNjYXBlZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwjZ2V0RXNjYXBlZFZhbHVlIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Fc2NhcGVkIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVzY2FwZWRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGl0ZXJhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBzdHJpbmcgd2l0aG91dCB0aGUgcXVvdGVzLiBFc2NhcGUgYXJlIGV2YWx1YXRlZCBhbmQgdHVybmVkIGludG8gdGhlaXIgY2hhcmFjdGVyIHZhbHVlLiBUaGlzIGlzIGEgdHJhbnNpZW50IGZpZWxkLiBJZiBub3Qgc2V0IHdoZW4gY3JlYXRlZCB3aGVuIHF1ZXJpZWQgaXQgd2lsbCBjcmVhdGUgaXQuIFR5cGljYWxseSBpdCB3aWxsIGJlIHNldCB3aGVuIGNyZWF0ZWQgZnJvbSBhbiBBU1Qgbm9kZSBzaW5jZSB0aGUgbm9kZSBhbHJlYWR5IGhhcyBldmFsdWF0ZWQgaXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpdGVyYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExpdGVyYWxWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFN0cmluZ0xpdGVyYWxfTGl0ZXJhbFZhbHVlKCkKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGl0ZXJhbFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwjZ2V0TGl0ZXJhbFZhbHVlIDxlbT5MaXRlcmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaXRlcmFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMaXRlcmFsVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpdGVyYWxWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFN0cmluZ0xpdGVyYWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUVGhpc0xpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUVGhpc0xpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzOWNhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFRoaXNMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGhpcyBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUmVwcmVzZW50cyAidGhpcyIsIGUuZy4gdGhpcy5nZXRYKCkgd2lsbCBiZSBhIE1ldGhvZEludm9jYXRpb24gd2l0aCB0aGUgcmVjZWl2ZXIgYmVpbmcgYSBUaGlzTGl0ZXJhbC4gV2UgY2FuJ3QgaGFuZGxlIHRoZSBmb3JtYXQgWFlaLnRoaXMgYmVjYXVzZSB0aGF0IGlzIGZvciBpbm5lciBjbGFzc2VzIGFuZCB3ZSBkb24ndCBzdXBwb3J0IHRoYXQgcmlnaHQgbm93LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUVGhpc0xpdGVyYWwoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRUaGlzTGl0ZXJhbCBleHRlbmRzIFBURXhwcmVzc2lvbnsKLX0gLy8gVGhpc0xpdGVyYWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUVHlwZUxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUVHlwZUxpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNhOTE3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFR5cGVMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZSBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyByZXByZXNlbnRzIGEgbGl0ZXJhbCBvZiB0aGUgZm9ybSBqLlhZWi5jbGFzcy4gRm9yIGluc3RhbmNlIGluIGEgbWV0aG9kIGludm9jYXRpb24geC5nZXRYKGpYWVouY2xhc3MpIHRoZSBhcmd1bWVudCB3aWxsIGJlIGEgVHlwZUxpdGVyYWwuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFR5cGVMaXRlcmFsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUVHlwZUxpdGVyYWwgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHR5cGUgb2YgdGhlIGxpdGVyYWwuICBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFR5cGVMaXRlcmFsX1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVHlwZUxpdGVyYWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BhcnNlVHJlZUFsbG9jYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BhcnNlVHJlZUFsbG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMzNTZiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QYXJzZVRyZWVBbGxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQWxsb2NhdGlvbnMgdmlhIFBhcnNlIFRyZWVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVHJlZUFsbG9jYXRpb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYXJzZVRyZWVBbGxvY2F0aW9uIGV4dGVuZHMgSmF2YUFsbG9jYXRpb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbl9FeHByZXNzaW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHByZXNzaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLX0gLy8gUGFyc2VUcmVlQWxsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUGFyc2VWaXNpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QYXJzZVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyYTQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QYXJzZVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLSAKLS8qKgotICogQSB2aXNpdG9yIGZvciBhYnN0cmFjdCBwYXJzZSBleHByZXNzaW9uIHRyZWVzLgotICogPHA+Ci0gKiBGb3IgZWFjaCBkaWZmZXJlbnQgY29uY3JldGUgRXhwcmVzc2lvbiBub2RlIHR5cGUgPGl0PlQ8L2l0PiB0aGVyZSBhcmUKLSAqIGEgcGFpciBvZiBtZXRob2RzOgotICogPHVsPgotICogPGxpPjxjb2RlPnB1YmxpYyBib29sZWFuIHZpc2l0KDxpdD5UPC9pdD4gbm9kZSk8L2NvZGU+IC0gVmlzaXRzCi0gKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4gSWYgPGNvZGU+dHJ1ZTwvY29kZT4KLSAqIGlzIHJldHVybmVkLCB0aGUgZ2l2ZW4gbm9kZSdzIGNoaWxkIG5vZGVzIHdpbGwgYmUgdmlzaXRlZCBuZXh0OyBob3dldmVyLAotICogaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkLCB0aGUgZ2l2ZW4gbm9kZSdzIGNoaWxkIG5vZGVzIHdpbGwgCi0gKiBub3QgYmUgdmlzaXRlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyBkb2VzCi0gKiBub3RoaW5nIGFuZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudAotICogdGhpcyBtZXRob2QgYXMgbmVlZGVkLjwvbGk+Ci0gKiA8bGk+PGNvZGU+cHVibGljIHZvaWQgZW5kVmlzaXQoPGl0PlQ8L2l0PiBub2RlKTwvY29kZT4gLSBWaXNpdHMKLSAqIHRoZSBnaXZlbiBub2RlIHRvIHBlcmZvcm0gc29tZSBhcmJpdHJhcnkgb3BlcmF0aW9uLiBXaGVuIHVzZWQgaW4gdGhlCi0gKiBjb252ZW50aW9uYWwgd2F5LCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIG9mIHRoZSBnaXZlbiBub2RlJ3MKLSAqIGNoaWxkcmVuIGhhdmUgYmVlbiB2aXNpdGVkIChvciBpbW1lZGlhdGVseSwgaWYgPGNvZGU+dmlzaXQ8L2NvZGU+IHJldHVybmVkCi0gKiA8Y29kZT5mYWxzZTwvY29kZT4pLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIGRvZXMKLSAqIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50IHRoaXMgbWV0aG9kIGFzIG5lZWRlZC48L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIEluIGFkZGl0aW9uLCB0aGVyZSBhcmUgYSBwYWlyIG9mIG1ldGhvZHMgZm9yIHZpc2l0aW5nIEFTVCBub2RlcyBpbiB0aGUgCi0gKiBhYnN0cmFjdCwgcmVnYXJkbGVzcyBvZiBub2RlIHR5cGU6Ci0gKiA8dWw+Ci0gKiA8bGk+PGNvZGU+cHVibGljIHZvaWQgcHJlVmlzaXQoQVNUTm9kZSBub2RlKTwvY29kZT4gLSBWaXNpdHMKLSAqIHRoZSBnaXZlbiBub2RlIHRvIHBlcmZvcm0gc29tZSBhcmJpdHJhcnkgb3BlcmF0aW9uLiAKLSAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgcHJpb3IgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUtc3BlY2lmaWMKLSAqIDxjb2RlPnZpc2l0PC9jb2RlPiBtZXRob2QuCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0gKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudCB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuPC9saT4KLSAqIDxsaT48Y29kZT5wdWJsaWMgdm9pZCBwb3N0VmlzaXQoQVNUTm9kZSBub2RlKTwvY29kZT4gLSBWaXNpdHMKLSAqIHRoZSBnaXZlbiBub2RlIHRvIHBlcmZvcm0gc29tZSBhcmJpdHJhcnkgb3BlcmF0aW9uLiAKLSAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYWZ0ZXIgdGhlIGFwcHJvcHJpYXRlIHR5cGUtc3BlY2lmaWMKLSAqIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QuCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0gKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudCB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuPC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIEZvciBub2RlcyB3aXRoIGxpc3QtdmFsdWVkIHByb3BlcnRpZXMsIHRoZSBjaGlsZCBub2RlcyB3aXRoaW4gdGhlIGxpc3QKLSAqIGFyZSB2aXNpdGVkIGluIG9yZGVyLiBGb3Igbm9kZXMgd2l0aCBtdWx0aXBsZSBwcm9wZXJ0aWVzLCB0aGUgY2hpbGQgbm9kZXMKLSAqIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciB0aGF0IG1vc3QgY2xvc2VseSBjb3JyZXNwb25kcyB0byB0aGUgbGV4aWNhbAotICogcmVhZGluZyBvcmRlciBvZiB0aGUgc291cmNlIHByb2dyYW0uIEZvciBpbnN0YW5jZSwgZm9yIGEgdHlwZSBkZWNsYXJhdGlvbgotICogbm9kZSwgdGhlIGNoaWxkIG9yZGVyaW5nIGlzOiBuYW1lLCBzdXBlcmNsYXNzLCBzdXBlcmludGVyZmFjZXMsIGFuZCAKLSAqIGJvZHkgZGVjbGFyYXRpb25zLgotICogPC9wPgotICogPHA+Ci0gKiBXaGlsZSBpdCBpcyBwb3NzaWJsZSB0byBtb2RpZnkgdGhlIHRyZWUgaW4gdGhlIHZpc2l0b3IsIGNhcmUgaXMgcmVxdWlyZWQgdG8KLSAqIGVuc3VyZSB0aGF0IHRoZSBjb25zZXF1ZW5jZXMgYXJlIGFzIGV4cGVjdGVkIGFuZCBkZXNpcmFibGUuCi0gKiBEdXJpbmcgdGhlIGNvdXJzZSBvZiBhbiBvcmRpbmFyeSB2aXNpdCBzdGFydGluZyBhdCBhIGdpdmVuIG5vZGUsIGV2ZXJ5IG5vZGUKLSAqIGluIHRoZSBzdWJ0cmVlIGlzIHZpc2l0ZWQgZXhhY3RseSB0d2ljZSwgZmlyc3Qgd2l0aCA8Y29kZT52aXNpdDwvY29kZT4gYW5kCi0gKiB0aGVuIHdpdGggPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+LiBEdXJpbmcgYSB0cmF2ZXJzYWwgb2YgYSBzdGF0aW9uYXJ5IHRyZWUsIAotICogZWFjaCBub2RlIGlzIGVpdGhlciBiZWhpbmQgKGFmdGVyIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiksIGFoZWFkIChiZWZvcmUgCi0gKiA8Y29kZT52aXNpdDwvY29kZT4pLCBvciBpbiBwcm9ncmVzcyAoYmV0d2VlbiA8Y29kZT52aXNpdDwvY29kZT4gYW5kCi0gKiB0aGUgbWF0Y2hpbmcgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+KS4gQ2hhbmdlcyB0byB0aGUgImJlaGluZCIgcmVnaW9uIG9mIHRoZQotICogdHJlZSBhcmUgb2Ygbm8gY29uc2VxdWVuY2UgdG8gdGhlIHZpc2l0IGluIHByb2dyZXNzLiBDaGFuZ2VzIHRvIHRoZSAiYWhlYWQiCi0gKiByZWdpb24gd2lsbCBiZSB0YWtlbiBpbiBzdHJpZGUuIENoYW5nZXMgdG8gdGhlICJpbiBwcm9ncmVzcyIgcG9ydGlvbiBhcmUKLSAqIHRoZSBtb3JlIGludGVyZXN0aW5nIGNhc2VzLiBXaXRoIGEgbm9kZSwgdGhlIHZhcmlvdXMgcHJvcGVydGllcyBhcmUgYXJyYW5nZWQKLSAqIGluIGEgbGluZWFyIGxpc3QsIHdpdGggYSBjdXJzb3IgdGhhdCBzZXBhcmF0ZXMgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlCi0gKiBiZWVuIHZpc2l0ZWQgZnJvbSB0aGUgb25lcyB0aGF0IGFyZSBzdGlsbCB0byBiZSB2aXNpdGVkICh0aGUgY3Vyc29yCi0gKiBpcyBiZXR3ZWVuIHRoZSBlbGVtZW50cywgcmF0aGVyIHRoYW4gb24gYW4gZWxlbWVudCkuIFRoZSBjdXJzb3IgbW92ZXMgZnJvbQotICogdGhlIGhlYWQgdG8gdGhlIHRhaWwgb2YgdGhpcyBsaXN0LCBhZHZhbmNpbmcgdG8gdGhlIG5leHQgcG9zaXRpb24ganVzdAotICogPGl0PmJlZm9yZTwvaXQ+IDxjb2RlPnZpc2l0PC9jb2RlPiBpZiBjYWxsZWQgZm9yIHRoYXQgY2hpbGQuIEFmdGVyIHRoZSBjaGlsZAotICogc3VidHJlZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHZpc2l0ZWQsIHRoZSB2aXNpdCBtb3ZlcyBvbiB0aGUgY2hpbGQgCi0gKiBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3Vyc29yLiBSZW1vdmluZyBhIGNoaWxkIHdoaWxlIGl0IGlzIGJlaW5nIHZpc2l0ZWQKLSAqIGRvZXMgbm90IGFsdGVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHZpc2l0LiBCdXQgYW55IGNoaWxkcmVuIGFkZGVkIGF0IHBvc2l0aW9ucwotICogYWZ0ZXIgdGhlIGN1cnNvciBhcmUgY29uc2lkZXJlZCBpbiB0aGUgImFoZWFkIiBwb3J0aW9uIGFuZCB3aWxsIGJlIHZpc2l0ZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIENhc2VzIHRvIHdhdGNoIG91dCBmb3I6Ci0gKiA8dWw+Ci0gKiA8bGk+TW92aW5nIGEgY2hpbGQgbm9kZSBmdXJ0aGVyIGRvd24gdGhlIGxpc3QuIFRoaXMgY291bGQgcmVzdWx0IGluIHRoZQotICogY2hpbGQgc3VidHJlZSBiZWluZyB2aXNpdGVkIG11bHRpcGxlIHRpbWVzOyB0aGVzZSB2aXNpdHMgYXJlIHNlcXVlbnRpYWwuPC9saT4KLSAqIDxsaT5Nb3ZpbmcgYSBjaGlsZCBub2RlIHVwIGludG8gYW4gYW5jZXN0b3IuIElmIHRoZSBuZXcgaG9tZSBmb3IKLSAqIHRoZSBub2RlIGlzIGluIHRoZSAiYWhlYWQiIHBvcnRpb24sIHRoZSBzdWJ0cmVlIHdpbGwgYmUgdmlzaXRlZCAKLSAqIGEgc2Vjb25kIHRpbWU7IGFnYWluLCB0aGVzZSB2aXNpdHMgYXJlIHNlcXVlbnRpYWwuPC9saT4KLSAqIDxsaT5Nb3ZpbmcgYSBub2RlIGRvd24gaW50byBhIGNoaWxkLiBJZiB0aGUgbmV3IGhvbWUgZm9yCi0gKiB0aGUgbm9kZSBpcyBpbiB0aGUgImFoZWFkIiBwb3J0aW9uLCB0aGUgc3VidHJlZSB3aWxsIGJlIHZpc2l0ZWQgCi0gKiBhIHNlY29uZCB0aW1lOyBpbiB0aGlzIGNhc2UsIHRoZSB2aXNpdHMgd2lsbCBiZSBuZXN0ZWQuIEluIHNvbWUgY2FzZXMsCi0gKiB0aGlzIGNhbiBsZWFkIHRvIGEgc3RhY2sgb3ZlcmZsb3cgb3Igb3V0IG9mIG1lbW9yeSBjb25kaXRpb24uPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogTm90ZTogVGhpcyBpcyBiYXNlZCB1cG9uIHRoZSB2aXNpdCBjb25jZXB0IGluIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yLiAKLSAqCi0gKiBAc2VlIEV4cHJlc3Npb24jYWNjZXB0Ci0gKiAgCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFBhcnNlVmlzaXRvciB7Ci0JCi0JLyoqCi0JICogRXhjZXB0aW9uIHRvIHRocm93IHRvIGp1c3Qgc3RvcCB2aXNpdGluZyBhIHBhcnNlIHZpc2l0LiBJdCBkb2Vzbid0IG1lYW4gZXJyb3IsIGl0Ci0JICoganVzdCBtZWFucyBzdG9wIHZpc2l0aW5nLiBQYXJzZVZpc2l0b3JzIHNob3VsZCB0aHJvdyB0aGlzIHdoZW4gdGhleSB3YW50IHRvIHN0b3AKLQkgKiB2aXNpdGluZyBmdXJ0aGVyIHdpdGhvdXQgYW4gZXhwbGljaXQgZXJyb3IuCi0JICogPHA+Ci0JICogSWYgdGhleSB3YW50IHRvIGluZGljYXRlIGFuIGVycm9yLCBwYXJzZSB2aXNpdG9ycyBjYW4gdGhyb3cgYW55IG90aGVyIFJ1bnRpbWVFeGNlcHRpb24uIAotCSAqIFRob3NlIHdpbGwgYWxzbyBzdG9wIHZpc2l0aW5nLCBidXQgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHBhc3NlZCBvbiBvdXQgb2YgdGhlIAotCSAqIHtAbGluayBQVEV4cHJlc3Npb24jYWNjZXB0KFBhcnNlVmlzaXRvcil9LiBTdG9wVmlzaXRpbmcgd2lsbCBub3QgYmUgcGFzc2VkIG9uCi0JICogYnV0IHdpbGwgYmUgY2F1Z2h0IGluc2lkZSBhY2NlcHQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN0b3BWaXNpdGluZyBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wLjEKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MjQ2ODYwODA2NTY4MzU1NTIwTDsKLQkJCi0JfQotCS8qKgotCSAqIFZpc2l0cyB0aGUgZ2l2ZW4gcGFyc2Ugbm9kZSBwcmlvciB0byB0aGUgdHlwZS1zcGVjaWZpYyB2aXNpdC4gKGJlZm9yZSA8Y29kZT52aXNpdDwvY29kZT4pLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICB0aGUgbm9kZSB0byB2aXNpdAotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZpc2l0KFBURXhwcmVzc2lvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBWaXNpdHMgdGhlIGdpdmVuIHBhcnNlIG5vZGUgZm9sbG93aW5nIHRoZSB0eXBlLXNwZWNpZmljIHZpc2l0IChhZnRlciA8Y29kZT5lbmRWaXNpdDwvY29kZT4pLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICB0aGUgbm9kZSB0byB2aXNpdAotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RWaXNpdChQVEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUNyZWF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBURmllbGRBY2Nlc3Mgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbnN0YW5jZW9mIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTmFtZSBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRUaGlzTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5zdGFuY2VSZWZlcmVuY2Ugbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBURmllbGRBY2Nlc3Mgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEluc3RhbmNlb2Ygbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFROYW1lIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVE51bWJlckxpdGVyYWwgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVFRoaXNMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEluc3RhbmNlUmVmZXJlbmNlIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvRmVhdHVyZVZhbHVlUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvRmVhdHVyZVZhbHVlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5NjkyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0ZlYXR1cmVWYWx1ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogSW1wbGVtZW50ZXJzIG9mIHRoaXMgaW50ZXJmYWNlIChhbiBFTUYgRU9iamVjdCBzdWJjbGFzcykgcHJvdmlkZSBhIHZpc2l0ZXIKLSAqIGNhcGFiaWxpdHkgdG8gdGhlIHNldCBmZWF0dXJlcyBvbiB0aGUgRU9iamVjdC4gVGhpcyB3YXkgb25seSB0aGUgc2V0IGZlYXR1cmVzCi0gKiBhcmUgcHJlc2VudGVkIHRvIHRoZSB2aXNpdG9yLiBUaGlzIGNhbiBzYXZlIGEgbG90IG9mIHRpbWUuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVWYWx1ZVByb3ZpZGVyIHsKLQkKLQkvKioKLQkgKiBBIGhlbHBlciBjbGFzcyBmb3IgRmVhdHVyZVZhbHVlUHJvdmlkZXIuCi0JICogCi0JICogQHNlZSBGZWF0dXJlVmFsdWVQcm92aWRlckhlbHBlciN2aXNpdFNldEZlYXR1cmVzKEVPYmplY3QsIFZpc2l0b3IpCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGZWF0dXJlVmFsdWVQcm92aWRlckhlbHBlciB7Ci0JCQotCQkvKioKLQkJICogQSBoZWxwZXIgdG8gaGFuZGxlIHdoZXJlIHRoZSBvYmplY3QgbWF5IG9yIG1heSBub3QgYmUKLQkJICogaW1wbGVtZW50IEZlYXR1cmVWYWx1ZVByb3ZpZGVyLiBUaGlzIHdheSBpdCBjYW4gYmUgYQotCQkgKiBjb21tb24gYWNjZXNzIHRvIGRvIGl0LgotCQkgKiAKLQkJICogQHBhcmFtIGVvYmplY3QKLQkJICogQHBhcmFtIHZpc2l0b3IKLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIE9iamVjdCB2aXNpdFNldEZlYXR1cmVzKEVPYmplY3QgZW9iamVjdCwgVmlzaXRvciB2aXNpdG9yKSB7Ci0JCQlpZiAoZW9iamVjdCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVByb3ZpZGVyKQotCQkJCXJldHVybiAoKEZlYXR1cmVWYWx1ZVByb3ZpZGVyKWVvYmplY3QpLnZpc2l0U2V0RmVhdHVyZXModmlzaXRvcik7Ci0JCQllbHNlIHsKLQkJCQkvLyBOb3QgYSBGZWF0dXJlVmFsdWVQcm92aWRlciwgc28gZG8gbm9ybWFsLgotCQkJCUl0ZXJhdG9yIGZlYXR1cmVzID0gZW9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZShmZWF0dXJlcy5oYXNOZXh0KCkpewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmVzLm5leHQoKTsKLQkJCQkJaWYoZW9iamVjdC5lSXNTZXQoc2YpKXsKLQkJCQkJCU9iamVjdCByZXN1bHQgPSB2aXNpdG9yLmlzU2V0KHNmLCBlb2JqZWN0LmVHZXQoc2YpKTsKLQkJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogQW5zd2VycyB3aGV0aGVyIGFueSBmZWF0dXJlIGlzIHNldCBvciBub3QuCi0JCSAqIDxwPgotCQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBTSE9VTEQgTk9UIGJlIHVzZWQgYXMgYSB0ZXN0IGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIHRvIGRvIHZpc2l0U2V0RmVhdHVyZXMgb3Igbm90LiBJdCBpcyBtb3JlIGVmZmljaWVudCB0byBqdXN0IGNhbGwKLQkJICogdmlzaXRTZXRGZWF0dXJlcy4gSXQgc2hvdWxkIGJlIHVzZWQgb25seSB0byBzZWUgaWYgYW55IGZlYXR1cmVzIGFyZSBzZXQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZW9iamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FueUZlYXR1cmVTZXQoRU9iamVjdCBlb2JqZWN0KSB7Ci0JCQlpZiAoZW9iamVjdCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVByb3ZpZGVyKQotCQkJCXJldHVybiAoKEZlYXR1cmVWYWx1ZVByb3ZpZGVyKWVvYmplY3QpLmlzQW55RmVhdHVyZVNldCgpOwotCQkJZWxzZSB7Ci0JCQkJLy8gTm90IGEgRmVhdHVyZVZhbHVlUHJvdmlkZXIsIHNvIGRvIG5vcm1hbC4KLQkJCQlJdGVyYXRvciBmZWF0dXJlcyA9IGVvYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoZmVhdHVyZXMuaGFzTmV4dCgpKXsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlcy5uZXh0KCk7Ci0JCQkJCWlmKGVvYmplY3QuZUlzU2V0KHNmKSl7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCXByaXZhdGUgRmVhdHVyZVZhbHVlUHJvdmlkZXJIZWxwZXIoKSB7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHZpc2l0ZXIgY2FsbGJhY2suCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBWaXNpdG9yewotCQkvKioKLQkJICogQ2FsbGVkIGZvciBlYWNoIHNldCBmZWF0dXJlIG9uIHRoZSBGZWF0dXJlVmFsdWVQcm92aWRlci4KLQkJICogCi0JCSAqIEBwYXJhbSBmZWF0dXJlCi0JCSAqIEBwYXJhbSB2YWx1ZQotCQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNvbnRpbnVlIHRvIG5leHQgc2V0dGluZywgb3IgYSB2YWx1ZSB0byBzdG9wIHZpc2l0aW5nIGFuZCByZXR1cm4gdGhhdCB2YWx1ZSBiZSB0aGUgcmVhbCBleGNlcHRpb24uCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJT2JqZWN0IGlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpOwotCX0JCi0KLQkvKioKLQkgKiBWaXNpdCB0aGUgc2V0IGZlYXR1cmVzLgotCSAqIEBwYXJhbSBhVmlzaXRvcgotCSAqIEBwYXJhbSA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbGwgc2V0dGluZ3MgdmlzaXRlZCwgb3IgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIHZpc2l0IChpc1NldCkgdGhhdCByZXR1cm5lZCBhIG5vbi1udWxsU2UuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdFNldEZlYXR1cmVzKFZpc2l0b3IgYVZpc2l0b3IpOwotCQotCS8qKgotCSAqIEFuc3dlcnMgd2hldGhlciBhbnkgZmVhdHVyZSBpcyBzZXQgb3Igbm90LgotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIFNIT1VMRCBOT1QgYmUgdXNlZCBhcyBhIHRlc3QgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgdG8gZG8gdmlzaXRTZXRGZWF0dXJlcyBvciBub3QuIEl0IGlzCi0JICogbW9yZSBlZmZpY2llbnQgdG8ganVzdCBjYWxsIHZpc2l0U2V0RmVhdHVyZXMuIEl0IHNob3VsZCBiZSB1c2VkIG9ubHkgdG8gc2VlIGlmIGFueSBmZWF0dXJlcyBhcmUgc2V0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IGZlYXR1cmVzIGFyZSBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbnlGZWF0dXJlU2V0KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhRGF0YVR5cGVJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0Zjc3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhRGF0YVR5cGVJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotLyoKLQotCi0gKi8KLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGluc3RhbmNlcyBvZiBqYXZhIGRhdGEgdHlwZXMuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJSmF2YURhdGFUeXBlSW5zdGFuY2UgZXh0ZW5kcyBJSmF2YUluc3RhbmNlIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YUluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwNGE1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkphdmFBbGxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25JbnN0YW5jZTsKLS8qKgotICogQSBjb21tb24gaW50ZXJmYWNlIGZvciBKYXZhIGluc3RhbmNlcy4gSXQgd2lsbCBiZQotICogc2hhcmVkIGJ5IEphdmEgT2JqZWN0cyBhbmQgSmF2YSBEYXRhVHlwZSBpbnN0YW5jZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFJbnN0YW5jZSBleHRlbmRzIEVPYmplY3QsIEZlYXR1cmVWYWx1ZVByb3ZpZGVyLCBJSW5zdGFudGlhdGlvbkluc3RhbmNlIHsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGFsbG9jYXRpb24gb2JqZWN0LgotCSAqIEByZXR1cm4gVGhlIGFsbG9jYXRpb24gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBKYXZhQWxsb2NhdGlvbiBnZXRBbGxvY2F0aW9uKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBhbGxvY2F0aW9uIGZvciB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gYWxsb2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG9jYXRpb24oSmF2YUFsbG9jYXRpb24gYWxsb2NhdGlvbik7CQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhbGxvY2F0aW9uIGhhcyBiZWVuIHNldCBvciBub3QuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzZXQuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QWxsb2NhdGlvbigpOwotCQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIHdlIGFyZSBhbiBpbnN0YW5jZSBvZiBvbmUgb2YgSmF2YSdzIHByaW1pdGl2ZSBkYXRhIHR5cGVzLgotCSAqIGUuZy4gYm9vbGVhbiwgY2hhciAtIHRydWUgb3RoZXJ3aXNlLCBlLmcuIGphdmEubGFuZy5Cb29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGlzIGhhcyBhbiBpbXBsaWNpdCBhbGxvY2F0aW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaW1wbGljaXQgYWxsb2NhdGlvbi4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdCBzZXQgb3Igbm90IGltcGxpY2l0LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRBbGxvY2F0aW9uKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhpcyBoYXMgYW4gcGFyc2V0cmVlIGFsbG9jYXRpb24uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwYXJzZXRyZWUgYWxsb2NhdGlvbi4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdCBzZXQgb3Igbm90IHBhcnNldHJlZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YU9iamVjdEluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhT2JqZWN0SW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjMjc3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhT2JqZWN0SW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0KLQotICovCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGphdmEgb2JqZWN0IGluc3RhbmNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YU9iamVjdEluc3RhbmNlIGV4dGVuZHMgSUphdmFJbnN0YW5jZSB7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0luc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDUyNDUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbnN0YW50aWF0aW9uQmFzZU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3JfQ3VycmVudGx5VGhpc05vdFN1cHBvcnRlZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcl9DYW5ub3RQcm9jZXNzQW5vbnltb3VzRGVjbGFyYXRpb25zX0VYQ187Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbnN0YW50aWF0aW9uQmFzZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhRGF0YVR5cGVJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhRGF0YVR5cGVJbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODRiNTMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIGEgSmF2YSBNb2RlbCBEYXRhdHlwZSAoaS5lLiBwcmltaXRpdmUpLgotICogSXQgY2FuIGJlIGNyZWF0ZWQgZnJvbSBhIHN0cmluZywgd2hpY2ggYmVjb21lcyB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nCi0gKiBmb3IgdGhlIGluc3RhbmNlLiBJdCdzIHRvU3RyaW5nIHdpbGwgYmUgdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZy4KLSAqCi0gKiBJdCBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgZGlyZWN0bHksIHRoZSBJSmF2YURhdGFUeXBlSW5zdGFuY2UgaW50ZXJmYWNlIHNob3VsZCBiZQotICogdXNlZCBpbnN0ZWFkLiBJdCBpcyBwdWJsaWMgc28gdGhhdCBpdCBjYW4gYmUgc3ViY2xhc3NlZC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRGF0YVR5cGVJbnN0YW5jZSBleHRlbmRzIEphdmFJbnN0YW5jZSBpbXBsZW1lbnRzIElKYXZhRGF0YVR5cGVJbnN0YW5jZSB7Ci0KLQlwcm90ZWN0ZWQgSmF2YURhdGFUeXBlSW5zdGFuY2UoKSB7Ci0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFGYWN0b3J5SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhRmFjdG9yeUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3ZWMzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFGYWN0b3J5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlcjsKLQotLyoqCi0gKiBBZGFwdGVyIG9uIEphdmFGYWN0b3J5SW1wbCB0byBkbyBpbnN0YW50aWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUZhY3RvcnlIYW5kbGVyIGltcGxlbWVudHMgSUluc3RhbnRpYXRpb25IYW5kbGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSmF2YUZhY3RvcnlIYW5kbGVyIElOU1RBTkNFID0gbmV3IEphdmFGYWN0b3J5SGFuZGxlcigpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphdmFGYWN0b3J5QWRhcHRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUZhY3RvcnlIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyI2hhbmRsZXNDbGFzcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhbmRsZXNDbGFzcyhFQ2xhc3MgdHlwZSkgewotCQlyZXR1cm4gdHlwZSBpbnN0YW5jZW9mIEphdmFDbGFzcyB8fCB0eXBlIGluc3RhbmNlb2YgSmF2YURhdGFUeXBlOwotCQkvLyBEdXJpbmcgWE1JIGxvYWRpbmcsIGl0IGNhbid0IHRlbGwgdGhlIEphdmFEYXRhVHlwZSBpcyBkaWZmZXJlbnQgdGhhbiBKYXZhQ2xhc3MuCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXIjaGFuZGxlc0RhdGFUeXBlKG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFEYXRhVHlwZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVzRGF0YVR5cGUoSmF2YURhdGFUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXIjY3JlYXRlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJRU9iamVjdCByZXN1bHQgPSBqYXZhQ2xhc3MgaW5zdGFuY2VvZiBKYXZhQ2xhc3MgPyAoRU9iamVjdCkgbmV3IEphdmFPYmplY3RJbnN0YW5jZSgpIDogbmV3IEphdmFEYXRhVHlwZUluc3RhbmNlKCk7Ci0JCSgoSW50ZXJuYWxFT2JqZWN0KSByZXN1bHQpLmVTZXRDbGFzcyhqYXZhQ2xhc3MpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWIxNDliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotICogICRSQ1NmaWxlJAotICogICRSZXZpc2lvbiQgICREYXRlJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZS5JbnRlcm5hbC5EeW5hbWljVmFsdWVIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkphdmFBbGxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW5zdGFuY2UgZm9yIGphdmEgbW9kZWwgb2JqZWN0cy4KLSAqIEl0IHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBkaXJlY3RseSwgdGhlIElKYXZhT2JqZWN0SW5zdGFuY2UgaW50ZXJmYWNlIHNob3VsZCBiZQotICogdXNlZCBpbnN0ZWFkLiBJdCBpcyBwdWJsaWMgc28gdGhhdCBpdCBjYW4gYmUgc3ViY2xhc3NlZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFJbnN0YW5jZSBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSUphdmFJbnN0YW5jZSB7Ci0JCi0JcHVibGljIEphdmFIZWxwZXJzIGdldEphdmFUeXBlKCl7Ci0JCXJldHVybiAoSmF2YUhlbHBlcnMpIGVDbGFzcygpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUFsbG9jYXRpb24gZ2V0QWxsb2NhdGlvbigpIHsKLQkJcmV0dXJuIGlzU2V0QWxsb2NhdGlvbigpID8gKEphdmFBbGxvY2F0aW9uKSBlR2V0KEphdmFJbnN0YW50aWF0aW9uLmdldEFsbG9jYXRpb25GZWF0dXJlKHRoaXMpKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRBbGxvY2F0aW9uKCkgewotCQlyZXR1cm4gaXNTZXRBbGxvY2F0aW9uKCkgJiYgZ2V0QWxsb2NhdGlvbigpLmlzSW1wbGljaXQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzZVRyZWVBbGxvY2F0aW9uKCkgewotCQlyZXR1cm4gaXNTZXRBbGxvY2F0aW9uKCkgJiYgZ2V0QWxsb2NhdGlvbigpLmlzUGFyc2VUcmVlKCk7Ci0JfQotCQotCS8qKiAKLQkgKiBWaXNpdCB0aGUgYXJndW1lbnQgd2l0aCBhbGwgb2YgdGhlIHNldCBmZWF0dXJlcyBpbiBhbiBvcHRpbWl6ZWQgZmFzaGlvbiAKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBPYmplY3QgTklMID0gRVN0cnVjdHVyYWxGZWF0dXJlSW1wbC5JbnRlcm5hbFNldHRpbmdEZWxlZ2F0ZVNpbmdsZS5OSUw7Ci0JcHVibGljIE9iamVjdCB2aXNpdFNldEZlYXR1cmVzKFZpc2l0b3IgYVZpc2l0b3IpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChlSGFzU2V0dGluZ3MoKSkgewotCQkJSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlciBzZXR0aW5ncyA9IChKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyKSBlU2V0dGluZ3MoKTsKLQotCQkJT2JqZWN0W10gc2V0UHJvcGVydHlWYWx1ZXMgPSBzZXR0aW5ncy5lU2V0dGluZ3MoKTsKLQkJCWlmIChzZXRQcm9wZXJ0eVZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJTGlzdCBhbGxGZWF0dXJlcyA9IHNldHRpbmdzLmdldEFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2V0UHJvcGVydHlWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IHByb3BlcnR5VmFsdWUgPSBzZXRQcm9wZXJ0eVZhbHVlc1tpXTsKLQkJCQkJaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJLy8gPG51bGw+IGlzIGhhbmRsZWQgYnkgdGhlIHBsYWNlaG9sZGVyIE5JTC4gQSBzZXR0aW5nIG9mIHRydWUgbnVsbCBtZWFucyBub3Qgc2V0LiBBIHNldHRpbmcgb2YgTklMIG1lYW5zIHNldCB0byBudWxsLgotCQkJCQkJaWYgKHByb3BlcnR5VmFsdWUgPT0gTklMKQotCQkJCQkJCXByb3BlcnR5VmFsdWUgPSBudWxsOwotCQkJCQkJaWYgKChyZXN1bHQgPSBhVmlzaXRvci5pc1NldCgoRVN0cnVjdHVyYWxGZWF0dXJlKSBhbGxGZWF0dXJlcy5nZXQoaSksIHByb3BlcnR5VmFsdWUpKSAhPSBudWxsKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfSAKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FueUZlYXR1cmVTZXQoKSB7Ci0JCWlmIChlSGFzU2V0dGluZ3MoKSkgewotCQkJSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlciBzZXR0aW5ncyA9IChKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyKSBlU2V0dGluZ3MoKTsKLQotCQkJT2JqZWN0W10gc2V0UHJvcGVydHlWYWx1ZXMgPSBzZXR0aW5ncy5lU2V0dGluZ3MoKTsKLQkJCWlmIChzZXRQcm9wZXJ0eVZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXRQcm9wZXJ0eVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgcHJvcGVydHlWYWx1ZSA9IHNldFByb3BlcnR5VmFsdWVzW2ldOwotCQkJCQlpZiAocHJvcGVydHlWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBbGxvY2F0aW9uKCkgewotCQlFUmVmZXJlbmNlIGFsbG9jYXRpb25GZWF0dXJlID0gSmF2YUluc3RhbnRpYXRpb24uZ2V0QWxsb2NhdGlvbkZlYXR1cmUodGhpcyk7Ci0JCXJldHVybiBhbGxvY2F0aW9uRmVhdHVyZSAhPSBudWxsICYmIGVJc1NldChhbGxvY2F0aW9uRmVhdHVyZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFsbG9jYXRpb24oSmF2YUFsbG9jYXRpb24gYWxsb2NhdGlvbikgewotCQlFUmVmZXJlbmNlIGFsbG9jYXRpb25GZWF0dXJlID0gSmF2YUluc3RhbnRpYXRpb24uZ2V0QWxsb2NhdGlvbkZlYXR1cmUodGhpcyk7Ci0JCWlmIChhbGxvY2F0aW9uRmVhdHVyZSAhPSBudWxsKQotCQkJZVNldChhbGxvY2F0aW9uRmVhdHVyZSwgYWxsb2NhdGlvbik7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIEVPYmplY3QncyB0b1N0cmluZyBpcyB0b28gYmlnIGZvciB1cywgc28gd2UgZG8gYSBjdXN0b21pemVkIG9uZS4KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQlyZXN1bHQuYXBwZW5kKCdAJyk7Ci0JCXJlc3VsdC5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSk7Ci0JCQotCQlpZiAoZUlzUHJveHkoKSkKLQkJewotCQkgIHJlc3VsdC5hcHBlbmQoIiAoZVByb3h5VVJJOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkgIHJlc3VsdC5hcHBlbmQoZVByb3h5VVJJKCkpOwotCQkgIHJlc3VsdC5hcHBlbmQoJyknKTsKLQkJfQotCQlpZihnZXRKYXZhVHlwZSgpICE9IG51bGwpewotCQkJcmVzdWx0LmFwcGVuZCgneycpOwotCQkJcmVzdWx0LmFwcGVuZChnZXRKYXZhVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQlyZXN1bHQuYXBwZW5kKCd9Jyk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlKYXZhQWxsb2NhdGlvbiBhbGxvY2F0aW9uID0gZ2V0QWxsb2NhdGlvbigpOwotCQkJaWYgKGFsbG9jYXRpb24gIT0gbnVsbCkgewotCQkJCXJlc3VsdC5hcHBlbmQoJzonKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoYWxsb2NhdGlvbi50b1N0cmluZygpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBjYW4gb2NjdXIgYmVjYXVzZSBzb21ldGltZXMgdGhpcyBlQ2xhc3MgY2FuJ3QgYmUgY29uc3RydWN0ZWQgcmlnaHQgYW5kIHdvbid0IGhhdmUgYW4gaW5pdHN0cmluZyBmZWF0dXJlLgotCQkJLy8gSW4gdGhhdCBjYXNlIGFuIE5QRSBpcyB0aHJvd24uCi0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIgZXh0ZW5kcyBFUHJvcGVydGllc0hvbGRlckltcGwgewotCQlwcml2YXRlIEVMaXN0IGFsbFN0cnVjdHVyYWxGZWF0dXJlczsKLQkJCi0JCXB1YmxpYyBKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyKCkgewotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZVNldHRpbmdzKCkgewotCQkJcmV0dXJuIGVTZXR0aW5nczsKLQkJfQotCi0JCXB1YmxpYyBFTGlzdCBnZXRBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSB7Ci0JCQlyZXR1cm4gYWxsU3RydWN0dXJhbEZlYXR1cmVzOwotCQl9Ci0JCQotCQkvKgotCQkgKiBDbGVhciB0aGUgY2FjaGUuIFRoaXMgaXMgZHVlIHRvIAotCQkgKiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIGhhdmUgY2hhbmdlZC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0JCQllU2V0dGluZ3MgPSBudWxsOwotCQkJc2V0RUNvbnRlbnRzKG51bGwpOwotCQkJc2V0RUNyb3NzUmVmZXJlbmNlcyhudWxsKTsKLQkJCWFsbFN0cnVjdHVyYWxGZWF0dXJlcyA9IG51bGw7CQkJCi0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGwuRVByb3BlcnRpZXNIb2xkZXJJbXBsI2FsbG9jYXRlU2V0dGluZ3MoaW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWxsb2NhdGVTZXR0aW5ncyhpbnQgbWF4aW11bUR5bmFtaWNGZWF0dXJlSUQpIHsKLQkJCWlmIChhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPT0gbnVsbCkKLQkJCQlhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPSBnZXRFQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7CQkJCi0JCQlzdXBlci5hbGxvY2F0ZVNldHRpbmdzKG1heGltdW1EeW5hbWljRmVhdHVyZUlEKTsKLQkJfQotCQkKLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGwuRVByb3BlcnRpZXNIb2xkZXJJbXBsI3NldEVDb250ZW50cyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFQ29udGVudHMoRUxpc3QgZUNvbnRlbnRzKSB7Ci0JCQlpZiAoYWxsU3RydWN0dXJhbEZlYXR1cmVzID09IG51bGwpCi0JCQkJYWxsU3RydWN0dXJhbEZlYXR1cmVzID0gZ2V0RUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJc3VwZXIuc2V0RUNvbnRlbnRzKGVDb250ZW50cyk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGwuRVByb3BlcnRpZXNIb2xkZXJJbXBsI3NldEVDcm9zc1JlZmVyZW5jZXMob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RUNyb3NzUmVmZXJlbmNlcyhFTGlzdCBlQ3Jvc3NSZWZlcmVuY2VzKSB7Ci0JCQlpZiAoYWxsU3RydWN0dXJhbEZlYXR1cmVzID09IG51bGwpCi0JCQkJYWxsU3RydWN0dXJhbEZlYXR1cmVzID0gZ2V0RUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJc3VwZXIuc2V0RUNyb3NzUmVmZXJlbmNlcyhlQ3Jvc3NSZWZlcmVuY2VzKTsKLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCBFUHJvcGVydGllc0hvbGRlciBlUHJvcGVydGllcygpCi0JewotCSAgaWYgKGVQcm9wZXJ0aWVzID09IG51bGwpCi0JICB7Ci0JCWVQcm9wZXJ0aWVzID0gbmV3IEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIoKTsKLQkgIH0KLQkgIHJldHVybiBlUHJvcGVydGllczsKLQl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlU2V0Q2xhc3MoRUNsYXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXRDbGFzcyhFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyLmVTZXRDbGFzcyhlQ2xhc3MpOwotCQltaWdyYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0VDbGFzcyBOZXcgZUNsYXNzIHNldCB0by4gKG51bGwpIHdoZW4gbWlncmF0aW5nIHdoaWxlIG5vdCBzZXR0aW5nIGEgbmV3IEVDbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtaWdyYXRlKCkgewotCQkvLyBOb3RlOiBUaGlzIGlzIGV4dHJlbWVsbHkgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiBJdCBtYXkgY2hhbmdlIGZvciBhbnkgaW1wbGVtZW50YXRpb24gb2YgRU1GLgkKLQkJaWYgKGVQcm9wZXJ0aWVzICE9IG51bGwgJiYgKGVQcm9wZXJ0aWVzLmhhc1NldHRpbmdzKCkgfHwgZVByb3BlcnRpZXMuZ2V0RUNvbnRlbnRzKCkgIT0gbnVsbCB8fCBlUHJvcGVydGllcy5nZXRFQ3Jvc3NSZWZlcmVuY2VzKCkgIT0gbnVsbCkpIHsKLQkJCS8vIE1heWJlIG5lZWQgdG8gcmVjb25zdHJ1Y3Qgc2V0dGluZ3Mgb3IgY2xlYXIgY2FjaGUuCi0JCQlKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyIHByb3BlcnRpZXMgPSAoSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlcikgZVByb3BlcnRpZXM7Ci0JCQlFTGlzdCBvbGRBbGxGZWF0dXJlcyA9IHByb3BlcnRpZXMuZ2V0QWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQkKLQkJCS8vIFNlZSBpZiBtaWdyYXRpb24gbmVlZGVkLgotCQkJaWYgKHByb3BlcnRpZXMuZ2V0RUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpID09IG9sZEFsbEZlYXR1cmVzKQotCQkJCXJldHVybjsJLy8gTm8gbWlncmF0aW9uIG5lZWRlZC4KLQkJCQotCQkJT2JqZWN0W10gb2xkU2V0dGluZ3MgPSBwcm9wZXJ0aWVzLmVTZXR0aW5ncygpOwkJCQotCQkJcHJvcGVydGllcy5jbGVhckNhY2hlKCk7CS8vIENsZWFyIHRoZSBjYWNoZSBzbyB3ZSBjYW4gcmVidWlsZCBpdC4KLQkJCWlmIChvbGRTZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwkvLyBJdCB3YXMganVzdCBlaXRoZXIgY29udGVudHMgb3IgY3Jvc3NyZWZzLCBhbmQgdGhleSBoYXZlIGJlZW4gYXBwcm9wcmlhdGVseSBjbGVhcmVkLgkJCQotCQkJfQotCQkJCi0JCQkvLyBJdCBpcyBhc3N1bWVkIHRoYXQgYW55IFNGIHRoYXQgKGJ5IGlkZW50aXR5KSBpcyBpbgotCQkJLy8gYm90aCB0aGUgb2xkIGFuZCB0aGUgbmV3IGVDbGFzcywgdGhlbiBpdCBkb2Vzbid0IGhhdmUgYW55IGludGVybmFsIGNoYW5nZXMuIEl0IHNpbXBseSBjaGFuZ2VkIHBvc2l0aW9uCi0JCQkvLyBpbiB0aGUgc2V0dGluZ3MgbGlzdC4gT3RoZXJ3aXNlLCBuZWVkIHRvIHNlZSBpZiBjb21wYXRpYmxlIGJ5IHNhbWUgbmFtZSwgYW5kIGlmIHNvLCBtb3ZlIGl0LgkJCQotCQkJZVNldHRpbmdzKCk7CS8vIENyZWF0ZSBuZXcgc2V0dGluZ3MKLQkJCU9iamVjdFtdIG5ld1NldHRpbmdzID0gcHJvcGVydGllcy5lU2V0dGluZ3MoKTsKLQkJCWludCBzdGF0aWNGZWF0dXJlQ250ID0gZVN0YXRpY0ZlYXR1cmVDb3VudCgpOwkJCQotCQkJZm9yIChpbnQgb2xkSW5kZXggPSAwOyBvbGRJbmRleCA8IG9sZFNldHRpbmdzLmxlbmd0aDsgb2xkSW5kZXgrKykgewotCQkJCWlmIChvbGRTZXR0aW5nc1tvbGRJbmRleF0gIT0gbnVsbCkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBvbGRBbGxGZWF0dXJlcy5nZXQob2xkSW5kZXgrc3RhdGljRmVhdHVyZUNudCk7Ci0JCQkJCWludCBuZXdJbmRleCA9IHN1cGVyLmVEeW5hbWljRmVhdHVyZUlEKHNmKTsJLy8gVG8gYXZvaWQgcmVjdXJzZSBvbiBtaWdyYXRlLgotCQkJCQlpZiAobmV3SW5kZXggPiAtMSkgewotCQkJCQkJbW92ZUVTZXR0aW5nKG9sZFNldHRpbmdzLCBuZXdTZXR0aW5ncywgb2xkSW5kZXgsIHNmLCBuZXdJbmRleCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBTZWUgaWYgaXQgZXhpc3RzIGJ5IG5hbWUgYW5kIGlzIGNvbXBhdGlibGUuCi0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgbmV3U0YgPSBwcm9wZXJ0aWVzLmdldEVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShzZi5nZXROYW1lKCkpOwotCQkJCQkJaWYgKG5ld1NGICE9IG51bGwgJiYgbmV3U0YuZ2V0Q2xhc3MoKS5lcXVhbHMoc2YuZ2V0Q2xhc3MoKSkgJiYKLQkJCQkJCQluZXdTRi5pc01hbnkoKSA9PSBzZi5pc01hbnkoKSAmJiBuZXdTRi5pc0NoYW5nZWFibGUoKSA9PSBzZi5pc0NoYW5nZWFibGUoKSkgewotCQkJCQkJCWJvb2xlYW4gY29tcGF0aWJsZSA9IG5ld1NGLmlzVW5pcXVlKCkgPT0gc2YuaXNVbmlxdWUoKSB8fCAhbmV3U0YuaXNVbmlxdWUoKTsJLy8gSWYgbmV3IGlzIG5vdCB1bmlxdWUsIHRoZW4gZG9lc24ndCBtYXR0ZXIgaWYgb2xkIGFuZCBuZXcgYXJlIHRoZSBzYW1lCi0JCQkJCQkJaWYgKG5ld1NGIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQkJCQlFUmVmZXJlbmNlIG5ld1JlZiA9IChFUmVmZXJlbmNlKSBuZXdTRjsKLQkJCQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgc2Y7Ci0JCQkJCQkJCWNvbXBhdGlibGUgPSBuZXdSZWYuaXNDb250YWlubWVudCgpID09IHJlZi5pc0NvbnRhaW5tZW50KCkgJiYgbmV3UmVmLmdldEVSZWZlcmVuY2VUeXBlKCkuaXNTdXBlclR5cGVPZihyZWYuZ2V0RVJlZmVyZW5jZVR5cGUoKSk7Ci0JCQkJCQkJfSBlbHNlCi0JCQkJCQkJCWNvbXBhdGlibGUgPSBuZXdTRi5nZXRFVHlwZSgpLmVxdWFscyhzZi5nZXRFVHlwZSgpKTsKLQkJCQkJCQkJCi0JCQkJCQkJaWYgKGNvbXBhdGlibGUpIHsKLQkJCQkJCQkJbmV3SW5kZXggPSBlRHluYW1pY0ZlYXR1cmVJRChuZXdTRik7Ci0JCQkJCQkJCW1vdmVFU2V0dGluZyhvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3MsIG9sZEluZGV4LCBuZXdTRiwgbmV3SW5kZXgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSAKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbW92ZUVTZXR0aW5nKE9iamVjdFtdIG9sZFNldHRpbmdzLCBPYmplY3RbXSBuZXdTZXR0aW5ncywgaW50IG9sZEluZGV4LCBFU3RydWN0dXJhbEZlYXR1cmUgc2YsIGludCBuZXdJbmRleCkgewotCQkvLyBTZWUgaWYgc2luZ2xlIHZzIG1hbnkuCi0JCWlmICghc2YuaXNNYW55KCkpCi0JCQluZXdTZXR0aW5nc1tuZXdJbmRleF0gPSBvbGRTZXR0aW5nc1tvbGRJbmRleF07CS8vIEdyZWF0LCB3ZSBjYW4ganVzdCBtb3ZlIGl0IG92ZXIuCi0JCWVsc2UgewotCQkJLy8gTWFueSBpcyBtb3JlIGRpZmZpY3VsdC4gTmVlZCB0byBjcmVhdGUgYSBuZXcgZHluYW1pYyBsaXN0IG9mIHJpZ2h0IHR5cGUsIGFuZAotCQkJLy8gdGhlbiBqdXN0IGNvcHkgb3ZlciB0aGUgZGF0YSBmcm9tIHRoZSBvbGQgb25lLiBXZSBjcmVhdGUgbmV3IG9uZSBieSBkb2luZyBhIHNpbXBsZSBlR2V0LgotCQkJLy8gVGhpcyB3aWxsIGNvbnN0cnVjdCBhbiBlbXB0eSBvbmUgd2l0aCBubyBub3RpZmljYXRpb25zIGdvaW5nIG91dC4KLQkJCS8vIE5vdGU6IFRoaXMgaXMgZXh0cmVtZWxseSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIFdlIHdpbGwgYmUgdGhyb3dpbmcgYXdheSB0aGUgb2xkCi0JCQkvLyBvbGRNYW55LCBzbyBpdCBpcyBvayB0byByZXVzZSB0aGUgYWN0dWFsIGFycmF5IG9mIGRhdGEgZm9yIHRoZSBuZXdNYW55LgotCQkJQmFzaWNFTGlzdCBuZXdNYW55ID0gKEJhc2ljRUxpc3QpIGVHZXQoc2YpOwotCQkJQmFzaWNFTGlzdCBvbGRNYW55ID0gKEJhc2ljRUxpc3QpIG9sZFNldHRpbmdzW29sZEluZGV4XTsKLQkJCW5ld01hbnkuc2V0RGF0YShvbGRNYW55LnNpemUoKSwgb2xkTWFueS5kYXRhKCkpOyAKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRHluYW1pY1ZhbHVlSG9sZGVyIGVTZXR0aW5ncygpIHsKLQkJbWlncmF0ZSgpOwotCQlyZXR1cm4gc3VwZXIuZVNldHRpbmdzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW50aWF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW50aWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTNhMDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbml0aWFsaXplIGphdmEgbW9kZWwgaW5zdGFudGlhdGlvbiBjb2RlIGFuZCB0byBhY2Nlc3MgZHluYW1pYyBmZWF0dXJlcy4KLSAqLwotcHVibGljIGNsYXNzIEphdmFJbnN0YW50aWF0aW9uIHsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExPQ0FUSU9OID0gImFsbG9jYXRpb24iOyAgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2V0IGEgc3RydWN0dXJhbCBmZWF0dXJlIGZyb20gYW4gaW5zdGFuY2Ugb2YgYW4gSUphdmFPYmplY3RJbnN0YW5jZSwgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0U0ZlYXR1cmUoSUphdmFPYmplY3RJbnN0YW5jZSBqb2JqZWN0LCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJcmV0dXJuIGpvYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgcmVmZXJlbmNlIGZyb20gYW4gaW5zdGFuY2Ugb2YgYW4gSUphdmFPYmplY3RJbnN0YW5jZSwgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBFUmVmZXJlbmNlIGdldFJlZmVyZW5jZShJSmF2YU9iamVjdEluc3RhbmNlIGpvYmplY3QsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdldFNGZWF0dXJlKGpvYmplY3QsIGZlYXR1cmVOYW1lKTsKLQl9CQotCQotCS8qKgotCSAqIEdldCBhIHN0cnVjdHVyYWwgZmVhdHVyZSBmcm9tIGFuIGluc3RhbmNlIG9mIGFuIElKYXZhT2JqZWN0SW5zdGFuY2UsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBVUkkgKGUuZy4gImphdmE6L2phdmEubGFuZyNPYmplY3QvY2xhc3MiKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRTRmVhdHVyZShJSmF2YU9iamVjdEluc3RhbmNlIGpvYmplY3QsIFVSSSBzZlVSSSkgewotCQlyZXR1cm4gZ2V0U0ZlYXR1cmUoKEphdmFDbGFzcykgam9iamVjdC5nZXRKYXZhVHlwZSgpLCBzZlVSSSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgc3RydWN0dXJhbCBmZWF0dXJlIGZyb20gYSBKYXZhQ2xhc3MsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBVUkkgKGUuZy4gImphdmE6L2phdmEubGFuZyNPYmplY3QvY2xhc3MiKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRTRmVhdHVyZShKYXZhQ2xhc3MgamNsYXNzLCBVUkkgc2ZVUkkpIHsKLQkJcmV0dXJuIGdldFNGZWF0dXJlKGpjbGFzcy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLCBzZlVSSSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIHN0cnVjdHVyYWwgZmVhdHVyZSBmcm9tIGEgUmVzb3VyY2VTZXQsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBVUkkgKGUuZy4gImphdmE6L2phdmEubGFuZyNPYmplY3QvY2xhc3MiKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRTRmVhdHVyZShSZXNvdXJjZVNldCByc2V0LCBVUkkgc2ZVUkkpIHsKLQkJcmV0dXJuIChFU3RydWN0dXJhbEZlYXR1cmUpIHJzZXQuZ2V0RU9iamVjdChzZlVSSSwgdHJ1ZSk7Ci0JfQkKLQkKLQkvKioKLQkgKiBHZXQgYSByZWZlcmVuY2UgZnJvbSBhbiBpbnN0YW5jZSBvZiBhbiBJSmF2YU9iamVjdEluc3RhbmNlLCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFUmVmZXJlbmNlIGdldFJlZmVyZW5jZShJSmF2YU9iamVjdEluc3RhbmNlIGpvYmplY3QsIFVSSSBzZlVSSSkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdldFNGZWF0dXJlKChKYXZhQ2xhc3MpIGpvYmplY3QuZ2V0SmF2YVR5cGUoKSwgc2ZVUkkpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHJlZmVyZW5jZSBmcm9tIGEgSmF2YUNsYXNzLCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFUmVmZXJlbmNlIGdldFJlZmVyZW5jZShKYXZhQ2xhc3MgamNsYXNzLCBVUkkgc2ZVUkkpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBnZXRTRmVhdHVyZShqY2xhc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSwgc2ZVUkkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSByZWZlcmVuY2UgZnJvbSBhIFJlc291cmNlU2V0LCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFUmVmZXJlbmNlIGdldFJlZmVyZW5jZShSZXNvdXJjZVNldCByc2V0LCBVUkkgc2ZVUkkpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByc2V0LmdldEVPYmplY3Qoc2ZVUkksIHRydWUpOwotCX0JCi0JCi0JLyoqCi0JICogR2V0IHRoZSBhbGxvY2F0aW9uIEZlYXR1cmUgZm9yIHRoaXMgb2JqZWN0LiBTaW5jZSBpdCBkZXBlbmRzCi0JICogb24gd2hhdCByZXNvdXJjZSB0aGF0IHRoZSBtZXRhY2xhc3MgaXMgZGVmaW5lZCBpbiwgd2UgbXVzdCBsb29rIGZvciBpdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVSZWZlcmVuY2UgZ2V0QWxsb2NhdGlvbkZlYXR1cmUoSUphdmFJbnN0YW5jZSBqaW5zdGFuY2UpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBqaW5zdGFuY2UuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKEFMTE9DQVRJT04pOwotCX0KLQkJCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplKFJlc291cmNlU2V0IHJzZXQpIHsKLQkJCWlmIChFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHJzZXQsIElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLkFEQVBURVJfS0VZKSA9PSBudWxsKQotCQkJCXJzZXQuZUFkYXB0ZXJzKCkuYWRkKG5ldyBKYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZjNiYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBpcyBhdHRhY2hlZCB0byB0aGUgcmVzb3VyY2Ugc2V0IGZvciBhIGphdmEgbW9kZWwuIFRoZQotICogSmF2YVhNSUZhY3Rvcnkgd2lsbCBhc2sgZm9yIHRoaXMgYWRhcHRlciBhbmQgYXNrIGl0IGZvciB0aGUgSUluc3RhbnRpYXRpb25IYW5kbGVyLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgSmF2YUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlciNnZXRJbnN0YW50aWF0aW9uSGFuZGxlcihKYXZhRmFjdG9yeUltcGwpCi0JICovCi0JcHVibGljIElJbnN0YW50aWF0aW9uSGFuZGxlciBnZXRJbnN0YW50aWF0aW9uSGFuZGxlcihKYXZhRmFjdG9yeUltcGwgZmFjdG9yeSkgewotCQlyZXR1cm4gSmF2YUZhY3RvcnlIYW5kbGVyLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5BREFQVEVSX0tFWSA9PSB0eXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhT2JqZWN0SW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YU9iamVjdEluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZjJiMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhT2JqZWN0SW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0gCi0KLS8qKgotICogSmF2YSBPYmplY3QgSW5zdGFuY2UgaW1wbGVtZW50YXRpb24uCi0gKiBAc2luY2UgMS4xLjAuMQotICovCi1wdWJsaWMgY2xhc3MgSmF2YU9iamVjdEluc3RhbmNlIGV4dGVuZHMgSmF2YUluc3RhbmNlIGltcGxlbWVudHMgSUphdmFPYmplY3RJbnN0YW5jZSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2UjaXNQcmltaXRpdmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL1BhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9QYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjODM0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL1BhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLio7Ci0gCi0vKioKLSAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHBhcnNlIHZpc2l0b3IgZm9yIGluc3RhbnRpYXRpbmcgYSBiZWFuIHByb3h5IGZyb20gYSBqYXZhIHBhcnNlIHRyZWUgYWxsb2NhdGlvbi4KLSAqIEl0IGNhbiBiZSByZXVzZWQsIGJ1dCBpcyBub3QgdGhyZWFkLXNhZmUuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yIGV4dGVuZHMgUGFyc2VWaXNpdG9yIHsKLQkJCi0JLyoqCi0JICogVGhlIGV4cHJlc3Npb24gdGhhdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBldmFsdWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBJRXhwcmVzc2lvbiBleHByZXNzaW9uOwotCQotCS8qCi0JICogVGhlIG5leHQgZXhwcmVzc2lvbiB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQuIEl0IGlzIHVzZWQgd2hlbiBvbmUgZXhwcmVzc2lvbiBpcyBzZW5kaW5nIHRoZQotCSAqIHZpc2l0YXRpb24gdG8gdGhlIG5leHQgZXhwcmVzc2lvbi4gSXQgd2lsbCBzZXQgdGhpcyB0byB3aGF0IHRoYXQgZXhwcmVzc2lvbiBzaG91bGQgYmUgdXNpbmcuIFRoaXMKLQkgKiBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgbmV4dCBleHByZXNzaW9uIGRvZXNuJ3Qga25vdyB3aGF0IGl0IHNob3VsZCBiZS4KLQkgKi8KLQlwcml2YXRlIEZvckV4cHJlc3Npb24gbmV4dEV4cHJlc3Npb24gPSBGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OOwotCQotCS8qKgotCSAqIEFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZy4gSXQgaXMgYSBSdW50aW1lRXhjZXB0aW9uIGJlY2F1c2UKLQkgKiBpdCBjYW4gYmUgdGhyb3duIGF0IGFueSB0aW1lLiBJdCB3cmFwcGVycyBhbm90aGVyIGV4Y2VwdGlvbi4gVGhhdCBleGNlcHRpb24KLQkgKiBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGNhdXNlIG9mIHRoZSBQcm9jZXNzaW5nRXhjZXB0aW9uLgotCSAqIAotCSAqIEBzZWUgVGhyb3dhYmxlI2dldENhdXNlKCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NpbmdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkJCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMjY4NjI0MjIyNDkwNDA2NjQzTDsKLQotCQkvKioKLQkJICogQHBhcmFtIGNhdXNlCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBQcm9jZXNzaW5nRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotCQkJc3VwZXIoY2F1c2UpOwotCQl9Ci0JfQotCQotCXN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yW10gSU5GSVhUT1BST1hZOwotCXN0YXRpYyB7Ci0JCUlORklYVE9QUk9YWSA9IG5ldyBJbmZpeE9wZXJhdG9yW1BUSW5maXhPcGVyYXRvci5WQUxVRVMuc2l6ZSgpXTsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5BTkRdID0gSW5maXhPcGVyYXRvci5JTl9BTkQ7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuQ09ORElUSU9OQUxfQU5EXSA9IEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfQU5EOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX09SXSA9IEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfT1I7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuRElWSURFXSA9IEluZml4T3BlcmF0b3IuSU5fRElWSURFOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkVRVUFMU10gPSBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5HUkVBVEVSXSA9IEluZml4T3BlcmF0b3IuSU5fR1JFQVRFUjsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5HUkVBVEVSX0VRVUFMU10gPSBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVJfRVFVQUxTOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkxFRlRfU0hJRlRdID0gSW5maXhPcGVyYXRvci5JTl9MRUZUX1NISUZUOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkxFU1NdID0gSW5maXhPcGVyYXRvci5JTl9MRVNTOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkxFU1NfRVFVQUxTXSA9IEluZml4T3BlcmF0b3IuSU5fTEVTU19FUVVBTFM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuTUlOVVNdID0gSW5maXhPcGVyYXRvci5JTl9NSU5VUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5OT1RfRVFVQUxTXSA9IEluZml4T3BlcmF0b3IuSU5fTk9UX0VRVUFMUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5PUl0gPSBJbmZpeE9wZXJhdG9yLklOX09SOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLlBMVVNdID0gSW5maXhPcGVyYXRvci5JTl9QTFVTOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLlJFTUFJTkRFUl0gPSBJbmZpeE9wZXJhdG9yLklOX1JFTUFJTkRFUjsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5SSUdIVF9TSElGVF9TSUdORURdID0gSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9TSUdORUQ7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORURdID0gSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9VTlNJR05FRDsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5USU1FU10gPSBJbmZpeE9wZXJhdG9yLklOX1RJTUVTOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLlhPUl0gPSBJbmZpeE9wZXJhdG9yLklOX1hPUjsKLQl9Ci0JCi0JLyoqCi0JICogQSBoZWxwZXIgbWV0aG9kIHRvIGNvbnZlcnQgdGhlIHBhcnNlIHRyZWUncyBpbmZpeCBvcGVyYXRvciB0byB0aGUgUHJveHkgaW5maXggb3BlcmF0b3IuCi0JICogCi0JICogQHBhcmFtIG9wZXJhdG9yCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5maXhPcGVyYXRvciBjb252ZXJ0UFRJbmZpeE9wZXJhdG9yVG9Qcm94eUluZml4T3BlcmF0b3IoUFRJbmZpeE9wZXJhdG9yIG9wZXJhdG9yKSB7Ci0JCXJldHVybiBJTkZJWFRPUFJPWFlbb3BlcmF0b3IuZ2V0VmFsdWUoKV07Ci0JfQotCi0Jc3RhdGljIGZpbmFsIFByZWZpeE9wZXJhdG9yW10gUFJFRklYVE9QUk9YWTsKLQlzdGF0aWMgewotCQlQUkVGSVhUT1BST1hZID0gbmV3IFByZWZpeE9wZXJhdG9yW1BUUHJlZml4T3BlcmF0b3IuVkFMVUVTLnNpemUoKV07Ci0JCVBSRUZJWFRPUFJPWFlbUFRQcmVmaXhPcGVyYXRvci5DT01QTEVNRU5UXSA9IFByZWZpeE9wZXJhdG9yLlBSRV9DT01QTEVNRU5UOwotCQlQUkVGSVhUT1BST1hZW1BUUHJlZml4T3BlcmF0b3IuTUlOVVNdID0gUHJlZml4T3BlcmF0b3IuUFJFX01JTlVTOwotCQlQUkVGSVhUT1BST1hZW1BUUHJlZml4T3BlcmF0b3IuTk9UXSA9IFByZWZpeE9wZXJhdG9yLlBSRV9OT1Q7Ci0JCVBSRUZJWFRPUFJPWFlbUFRQcmVmaXhPcGVyYXRvci5QTFVTXSA9IFByZWZpeE9wZXJhdG9yLlBSRV9QTFVTOwotCX0KLQkKLQkvKioKLQkgKiBBIGhlbHBlciBtZXRob2QgdG8gY29udmVydCB0aGUgcGFyc2UgdHJlZSdzIHByZWZpeCBvcGVyYXRvciB0byB0aGUgUHJveHkgcHJlZml4IG9wZXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRvcgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZWZpeE9wZXJhdG9yIGNvbnZlcnRQVFByZWZpeE9wZXJhdG9yVG9Qcm94eVByZWZpeE9wZXJhdG9yKFBUUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IpIHsKLQkJcmV0dXJuIFBSRUZJWFRPUFJPWFlbb3BlcmF0b3IuZ2V0VmFsdWUoKV07Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgdmlzaXRvciB3aXRoIHRoZSBnaXZlbiByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yKCkgewotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnQgcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb24uZ2V0UmVnaXN0cnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50IGV4cHJlc3Npb24uCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9CQotCi0JLyoqCi0JICogR2V0IHRoZSBiZWFucHJveHkgZm9yIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCByZWdpc3RyeS4gSXQgd2lsbCBldmFsdWF0ZSBpbW1lZGlhdGVseS4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSByZWdpc3RyeQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgZ2V0QmVhblByb3h5KFBURXhwcmVzc2lvbiBleHByZXNzaW9uLCBQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24sIFByb2Nlc3NpbmdFeGNlcHRpb24gewotCQl0aGlzLmV4cHJlc3Npb24gPSByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJdHJ5IHsKLQkJCWV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwotCQl9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEhhbmRsZSB0aGUgbW9zdCBjb21tb24gdGhhdCBtYWtlIHNlbnNlIHRvIGJlIGtub3cgZGlzdGluY3RseSBhbmQgdGhyb3cgdGhlbSBpbnN0ZWFkIG9mIFByb2Nlc3NpbmdFeGNlcHRpb24uCi0JCQlUaHJvd2FibGUgdCA9IGUuZ2V0Q2F1c2UoKTsKLQkJCWlmICh0IGluc3RhbmNlb2YgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24pCi0JCQkJdGhyb3cgKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKSB0OwotCQkJZWxzZSBpZiAodCBpbnN0YW5jZW9mIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbikKLQkJCQl0aHJvdyAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uKSB0OwotCQkJZWxzZQotCQkJCXRocm93IGU7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JfQotCQotCS8qKgotCSAqIFVzaW5nIHRoZSBnaXZlbiBleHByZXNzaW9uIHByb2Nlc3NvciBhbGxvY2F0ZSB0aGUgcHJveHkuIEl0IHdpbGwgbm90IGV2YWx1YXRlIGltbWVkaWF0ZWx5LCBidXQganVzdCBwdXNoIG9udG8gdGhlIGV4cHJlc3Npb24uCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gZXhwcmVzc2lvblByb2Nlc3NvcgotCSAqIEByZXR1cm4gdGhlIEV4cHJlc3Npb25Qcm94eSBmb3IgdGhlIGFsbG9jYXRpb24uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uUHJveHkgZ2V0UHJveHkoUFRFeHByZXNzaW9uIGV4cHJlc3Npb24sIElFeHByZXNzaW9uIGV4cHJlc3Npb25Qcm9jZXNzb3IpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25Qcm9jZXNzb3I7Ci0JCXRyeSB7Ci0JCQlFeHByZXNzaW9uUHJveHkgcHJveHkgPSBleHByZXNzaW9uUHJvY2Vzc29yLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQpOwotCQkJZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7Ci0JCQlyZXR1cm4gcHJveHk7Ci0JCX0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gSGFuZGxlIHRoZSBtb3N0IGNvbW1vbiB0aGF0IG1ha2Ugc2Vuc2UgdG8gYmUga25vdyBkaXN0aW5jdGx5IGFuZCB0aHJvdyB0aGVtIGluc3RlYWQgb2YgUHJvY2Vzc2luZ0V4Y2VwdGlvbi4KLQkJCVRocm93YWJsZSB0ID0gZS5nZXRDYXVzZSgpOwotCQkJaWYgKHQgaW5zdGFuY2VvZiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24pCi0JCQkJdGhyb3cgKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbikgdDsKLQkJCWVsc2UKLQkJCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogU2V0IHRoZSBuZXh0IGV4cHJlc3Npb24gdHlwZS4gKGkuZS4gdGhlIDxjb2RlPmZvckV4cHJlc3Npb248L2NvZGU+IGZpZWxkIG9mIG1vc3Qgb2YgdGhlIGNyZWF0ZSBleHByZXNzaW9uIG1ldGhvZHMuCi0JICogCi0JICogQHBhcmFtIG5leHRFeHByZXNzaW9uCi0JICogCi0JICogQHNlZSBJRXhwcmVzc2lvbiNjcmVhdGVJbmZpeEV4cHJlc3Npb24oaW50LCBpbnQsIGludCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIG5leHRFeHByZXNzaW9uKSB7Ci0JCXRoaXMubmV4dEV4cHJlc3Npb24gPSBuZXh0RXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5leHQgZXhwcmVzc2lvbiB0eXBlLiAoaS5lLiB0aGUgPGNvZGU+Zm9yRXhwcmVzc2lvbjwvY29kZT4gZmllbGQgb2YgbW9zdCBvZiB0aGUgY3JlYXRlIGV4cHJlc3Npb24gbWV0aG9kcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNlZSBJRXhwcmVzc2lvbiNjcmVhdGVJbmZpeEV4cHJlc3Npb24oaW50LCBpbnQsIGludCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRm9yRXhwcmVzc2lvbiBnZXROZXh0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5leHRFeHByZXNzaW9uOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcy5QYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3JfQ2Fubm90UHJvY2Vzc0Fub255bW91c0RlY2xhcmF0aW9uc19FWENfLCBuZXcgT2JqZWN0W10ge25vZGUuZ2V0RGVjbGFyYXRpb24oKX0pKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUFycmF5QWNjZXNzKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0SW5kZXhlcygpLnNpemUoKSk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVkpOwotCQlub2RlLmdldEFycmF5KCkuYWNjZXB0KHRoaXMpOwotCQlMaXN0IGlkeCA9IG5vZGUuZ2V0SW5kZXhlcygpOwotCQlpbnQgcyA9IGlkeC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYKTsKLQkJCSgoUFRFeHByZXNzaW9uKSBpZHguZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUNyZWF0aW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUFycmF5Q3JlYXRpb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRUeXBlKCksIG5vZGUuZ2V0RGltZW5zaW9ucygpLnNpemUoKSk7Ci0JCWlmIChub2RlLmdldERpbWVuc2lvbnMoKS5pc0VtcHR5KCkpIHsKLQkJCW5vZGUuZ2V0SW5pdGlhbGl6ZXIoKS5hY2NlcHQodGhpcyk7CS8vIEFycmF5IGluaXRpYWxpemVyIGRvZXNuJ3QgcmVxdWlyZSBhIG5leHQgZXhwcmVzc2lvbi4KLQkJfSBlbHNlIHsKLQkJCUxpc3QgZGltcyA9IG5vZGUuZ2V0RGltZW5zaW9ucygpOwotCQkJaW50IHMgPSBkaW1zLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTik7Ci0JCQkJKChQVEV4cHJlc3Npb24pIGRpbXMuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXIpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIobm9kZS5nZXRFeHByZXNzaW9ucygpLnNpemUoKSk7Ci0JCUxpc3QgZXhwcyA9IG5vZGUuZ2V0RXhwcmVzc2lvbnMoKTsKLQkJaW50IHMgPSBleHBzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzOyBpKyspIHsKLQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OKTsKLQkJCSgoUFRFeHByZXNzaW9uKSBleHBzLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5pc0Jvb2xlYW5WYWx1ZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlQ2FzdEV4cHJlc3Npb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRUeXBlKCkpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNBU1RfRVhQUkVTU0lPTik7Ci0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRDaGFyVmFsdWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0VHlwZSgpLCBub2RlLmdldEFyZ3VtZW50cygpLnNpemUoKSk7Ci0JCUxpc3QgYXJncyA9IG5vZGUuZ2V0QXJndW1lbnRzKCk7Ci0JCWludCBzID0gYXJncy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCk7Ci0JCQkoKFBURXhwcmVzc2lvbikgYXJncy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihnZXROZXh0RXhwcmVzc2lvbigpKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04pOwotCQlub2RlLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9UUlVFKTsKLQkJbm9kZS5nZXRUcnVlKCkuYWNjZXB0KHRoaXMpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFKTsKLQkJbm9kZS5nZXRGYWxzZSgpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBURmllbGRBY2Nlc3Mgbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlRmllbGRBY2Nlc3MoZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRGaWVsZCgpLCBub2RlLmdldFJlY2VpdmVyKCkgIT0gbnVsbCk7Ci0JCWlmIChub2RlLmdldFJlY2VpdmVyKCkgIT0gbnVsbCkgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUik7Ci0JCQlub2RlLmdldFJlY2VpdmVyKCkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlSW5maXhFeHByZXNzaW9uKGdldE5leHRFeHByZXNzaW9uKCksIGNvbnZlcnRQVEluZml4T3BlcmF0b3JUb1Byb3h5SW5maXhPcGVyYXRvcihub2RlLmdldE9wZXJhdG9yKCkpLCBub2RlLmdldEV4dGVuZGVkT3BlcmFuZHMoKS5zaXplKCkpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0xFRlQpOwotCQlub2RlLmdldExlZnRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX1JJR0hUKTsKLQkJbm9kZS5nZXRSaWdodE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7Ci0JCUxpc3QgZXh0ZW5kZWQgPSBub2RlLmdldEV4dGVuZGVkT3BlcmFuZHMoKTsKLQkJaW50IHMgPSBleHRlbmRlZC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVEKTsKLQkJCSgoUFRFeHByZXNzaW9uKSBleHRlbmRlZC5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEluc3RhbmNlb2Ygbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlSW5zdGFuY2VvZkV4cHJlc3Npb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRUeXBlKCkpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklOU1RBTkNFT0ZfVkFMVUUpOwotCQlub2RlLmdldE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihub2RlLmdldE1lc3NhZ2UoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlTWV0aG9kSW52b2NhdGlvbihnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldE5hbWUoKSwgbm9kZS5nZXRSZWNlaXZlcigpICE9IG51bGwsIG5vZGUuZ2V0QXJndW1lbnRzKCkuc2l6ZSgpKTsKLQkJaWYgKG5vZGUuZ2V0UmVjZWl2ZXIoKSAhPSBudWxsKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9SRUNFSVZFUik7Ci0JCQlub2RlLmdldFJlY2VpdmVyKCkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCUxpc3QgYXJncyA9IG5vZGUuZ2V0QXJndW1lbnRzKCk7Ci0JCWludCBzID0gYXJncy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9BUkdVTUVOVCk7Ci0JCQkoKFBURXhwcmVzc2lvbikgYXJncy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE5hbWUgbm9kZSkgewotCQkvLyBUaGlzIGlzIHNwZWNpYWwgaW4gdGhlIFBUTmFtZSBjYW4gb25seSBiZSB1c2VkIGFzIGEgdHlwZSByZWNlaXZlciBhdCB0aGlzIHRpbWUuCi0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVUeXBlUmVjZWl2ZXIobm9kZS5nZXROYW1lKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVsbExpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIFRoaXMgaXMgc3BlY2lhbCBpbiB0aGUgUFROYW1lIGNhbiBvbmx5IGJlIHVzZWQgYXMgYSB0eXBlIHJlY2VpdmVyIGF0IHRoaXMgdGltZS4KLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZU51bGwoZ2V0TmV4dEV4cHJlc3Npb24oKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIEl0IGlzIGFzc3VtZWQgdGhlIHRva2VucyBhcmUgdHJpbW1lZC4KLQkJU3RyaW5nIGxpdCA9IG5vZGUuZ2V0VG9rZW4oKTsKLQkJY2hhciBsYXN0Q2hhciA9IGxpdC5jaGFyQXQobGl0Lmxlbmd0aCgpLTEpOwotCQlpZiAobGFzdENoYXIgPT0gJ2wnIHx8IGxhc3RDaGFyID09ICdMJyApIHsKLQkJCS8vIEl0IGlzIGRlZmluaXRlbHkgYSBsb25nLgotCQkJLy8gVXNpbmcgZGVjb2RlIHNvIHRoYXQgdGhpbmdzIGxpa2UgMHgzIHdpbGwgYmUgcGFyc2VkLiBwYXJzZUxvbmcgd29uJ3QgcmVjb2duaXplIHRob3NlLgotCQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgTG9uZy5kZWNvZGUobGl0LnN1YnN0cmluZygwLCBsaXQubGVuZ3RoKCktMSkpLmxvbmdWYWx1ZSgpKTsKLQkJfSBlbHNlIGlmIChsYXN0Q2hhciA9PSAnRicgfHwgbGFzdENoYXIgPT0gJ2YnKSB7Ci0JCQkvLyBJdCBpcyBkZWZpbml0ZWx5IGEgZmxvYXQuCi0JCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChnZXROZXh0RXhwcmVzc2lvbigpLCBGbG9hdC5wYXJzZUZsb2F0KGxpdC5zdWJzdHJpbmcoMCwgbGl0Lmxlbmd0aCgpLTEpKSk7Ci0JCX0gZWxzZSBpZiAobGFzdENoYXIgPT0gJ0QnIHx8IGxhc3RDaGFyID09ICdkJykgIHsKLQkJCS8vIEl0IGlzIGRlZmluaXRlbHkgYSBkb3VibGUuCi0JCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChnZXROZXh0RXhwcmVzc2lvbigpLCBEb3VibGUucGFyc2VEb3VibGUobGl0LnN1YnN0cmluZygwLCBsaXQubGVuZ3RoKCktMSkpKTsKLQkJfSBlbHNlIGlmIChsaXQuaW5kZXhPZignLicpICE9IC0xIHx8IGxpdC5pbmRleE9mKCdlJykgIT0gLTEgfHwgbGl0LmluZGV4T2YoJ0UnKSAhPSAtMSkgewotCQkJCS8vIEl0IGlzIGRlZmluaXRlbHkgYSBkb3VibGUuIChoYXMgYSBwZXJpb2Qgb3IgYW4gZXhwb25lbnQsIGJ1dCBkb2VzIG5vdCBoYXZlIGFuICdmJyBvbiB0aGUgZW5kIGlzIGFsd2F5cyBhIGRvdWJsZSkuCi0JCQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgRG91YmxlLnBhcnNlRG91YmxlKGxpdC5zdWJzdHJpbmcoMCwgbGl0Lmxlbmd0aCgpKSkpOwotCQl9IGVsc2UgewotCQkJLy8gVXNpbmcgZGVjb2RlIHNvIHRoYXQgdGhpbmdzIGxpa2UgMHgzIHdpbGwgYmUgcGFyc2VkLiBwYXJzZUludCB3b24ndCByZWNvZ25pemUgdGhvc2UuCi0JCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChnZXROZXh0RXhwcmVzc2lvbigpLCBJbnRlZ2VyLmRlY29kZShsaXQpLmludFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOwkvLyBGb3IgaW5zdGFudGlhdGlvbiBwdXJwb3NlcywgdGhlIHBhcmVudGhlc2lzIGNhbiBiZSBpZ25vcmVkLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJlZml4RXhwcmVzc2lvbihnZXROZXh0RXhwcmVzc2lvbigpLCBjb252ZXJ0UFRQcmVmaXhPcGVyYXRvclRvUHJveHlQcmVmaXhPcGVyYXRvcihub2RlLmdldE9wZXJhdG9yKCkpKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5QUkVGSVhfT1BFUkFORCk7Ci0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihnZXROZXh0RXhwcmVzc2lvbigpLCBnZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKG5vZGUuZ2V0TGl0ZXJhbFZhbHVlKCkpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFRoaXNMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUVGhpc0xpdGVyYWwgbm9kZSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEluc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMuUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yX0N1cnJlbnRseVRoaXNOb3RTdXBwb3J0ZWRfRVhDXyk7IAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUVHlwZUxpdGVyYWwgbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlVHlwZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRUeXBlKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZTFmMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcl9DdXJyZW50bHlUaGlzTm90U3VwcG9ydGVkX0VYQ18gPSBJV0FWMDAwMUUgQ3VycmVudGx5ICJ0aGlzIiBpcyBub3Qgc3VwcG9ydGVkCi1QYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3JfQ2Fubm90UHJvY2Vzc0Fub255bW91c0RlY2xhcmF0aW9uc19FWENfID0gQ2Fubm90IHByb2Nlc3MgYW5vbnltb3VzIGRlY2xhcmF0aW9uczogInswfSIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW1wbGljaXRBbGxvY2F0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbXBsaWNpdEFsbG9jYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2M2RlNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbXBsaWNpdEFsbG9jYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbXBsaWNpdCBBbGxvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkltcGxpY2l0QWxsb2NhdGlvbkltcGwjZ2V0UGFyZW50IDxlbT5QYXJlbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW1wbGljaXRBbGxvY2F0aW9uSW1wbCNnZXRGZWF0dXJlIDxlbT5GZWF0dXJlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW1wbGljaXRBbGxvY2F0aW9uSW1wbCBleHRlbmRzIEphdmFBbGxvY2F0aW9uSW1wbCBpbXBsZW1lbnRzIEltcGxpY2l0QWxsb2NhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyZW50KCkgPGVtPlBhcmVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBwYXJlbnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmVhdHVyZSgpIDxlbT5GZWF0dXJlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGZWF0dXJlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltcGxpY2l0QWxsb2NhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW1wbGljaXRBbGxvY2F0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0UGFyZW50KCkgewotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmVJc1Byb3h5KCkpIHsKLQkJCUVPYmplY3Qgb2xkUGFyZW50ID0gcGFyZW50OwotCQkJcGFyZW50ID0gZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXBhcmVudCk7Ci0JCQlpZiAocGFyZW50ICE9IG9sZFBhcmVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX1BBUkVOVCwgb2xkUGFyZW50LCBwYXJlbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGJhc2ljR2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChFT2JqZWN0IG5ld1BhcmVudCkgewotCQlFT2JqZWN0IG9sZFBhcmVudCA9IHBhcmVudDsKLQkJcGFyZW50ID0gbmV3UGFyZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19QQVJFTlQsIG9sZFBhcmVudCwgcGFyZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlpZiAoZmVhdHVyZSAhPSBudWxsICYmIGZlYXR1cmUuZUlzUHJveHkoKSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIG9sZEZlYXR1cmUgPSBmZWF0dXJlOwotCQkJZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWZlYXR1cmUpOwotCQkJaWYgKGZlYXR1cmUgIT0gb2xkRmVhdHVyZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX0ZFQVRVUkUsIG9sZEZlYXR1cmUsIGZlYXR1cmUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGJhc2ljR2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgbmV3RmVhdHVyZSkgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgb2xkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCWZlYXR1cmUgPSBuZXdGZWF0dXJlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFLCBvbGRGZWF0dXJlLCBmZWF0dXJlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19QQVJFTlQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRQYXJlbnQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRQYXJlbnQoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fRkVBVFVSRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEZlYXR1cmUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRGZWF0dXJlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19QQVJFTlQ6Ci0JCQkJc2V0UGFyZW50KChFT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX0ZFQVRVUkU6Ci0JCQkJc2V0RmVhdHVyZSgoRVN0cnVjdHVyYWxGZWF0dXJlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19QQVJFTlQ6Ci0JCQkJc2V0UGFyZW50KChFT2JqZWN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fRkVBVFVSRToKLQkJCQlzZXRGZWF0dXJlKChFU3RydWN0dXJhbEZlYXR1cmUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX1BBUkVOVDoKLQkJCQlyZXR1cm4gcGFyZW50ICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX0ZFQVRVUkU6Ci0JCQkJcmV0dXJuIGZlYXR1cmUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJJbXBsaWNpdEFsbG9jYXRpb24oIiArIGdldFBhcmVudCgpICsgIi0iICsgZ2V0RmVhdHVyZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLX0gLy9JbXBsaWNpdEFsbG9jYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luaXRTdHJpbmdBbGxvY2F0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9Jbml0U3RyaW5nQWxsb2NhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0MmFhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luaXRTdHJpbmdBbGxvY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsI2dldEluaXRTdHJpbmcgPGVtPkluaXQgU3RyaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsIGV4dGVuZHMgSmF2YUFsbG9jYXRpb25JbXBsIGltcGxlbWVudHMgSW5pdFN0cmluZ0FsbG9jYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0U3RyaW5nKCkgPGVtPkluaXQgU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0U3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUX1NUUklOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0U3RyaW5nKCkgPGVtPkluaXQgU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0U3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRTdHJpbmcgPSBJTklUX1NUUklOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbml0U3RyaW5nQWxsb2NhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRTdHJpbmcoKSB7Ci0JCXJldHVybiBpbml0U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRTdHJpbmcoU3RyaW5nIG5ld0luaXRTdHJpbmcpIHsKLQkJU3RyaW5nIG9sZEluaXRTdHJpbmcgPSBpbml0U3RyaW5nOwotCQlpbml0U3RyaW5nID0gbmV3SW5pdFN0cmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuSU5JVF9TVFJJTkdfQUxMT0NBVElPTl9fSU5JVF9TVFJJTkcsIG9sZEluaXRTdHJpbmcsIGluaXRTdHJpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklOSVRfU1RSSU5HX0FMTE9DQVRJT05fX0lOSVRfU1RSSU5HOgotCQkJCXJldHVybiBnZXRJbml0U3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTklUX1NUUklOR19BTExPQ0FUSU9OX19JTklUX1NUUklORzoKLQkJCQlzZXRJbml0U3RyaW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklOSVRfU1RSSU5HX0FMTE9DQVRJT05fX0lOSVRfU1RSSU5HOgotCQkJCXNldEluaXRTdHJpbmcoSU5JVF9TVFJJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTklUX1NUUklOR19BTExPQ0FUSU9OX19JTklUX1NUUklORzoKLQkJCQlyZXR1cm4gSU5JVF9TVFJJTkdfRURFRkFVTFQgPT0gbnVsbCA/IGluaXRTdHJpbmcgIT0gbnVsbCA6ICFJTklUX1NUUklOR19FREVGQVVMVC5lcXVhbHMoaW5pdFN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlyZXN1bHQuYXBwZW5kKCJJbml0U3RyaW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbml0U3RyaW5nKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0luaXRTdHJpbmdBbGxvY2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllY2YyZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YW50aWF0aW9uRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBJbnN0YW50aWF0aW9uRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklOSVRfU1RSSU5HX0FMTE9DQVRJT046IHJldHVybiBjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OOiByZXR1cm4gY3JlYXRlSW1wbGljaXRBbGxvY2F0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTjogcmV0dXJuIGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTOiByZXR1cm4gY3JlYXRlUFRBcnJheUFjY2VzcygpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTjogcmV0dXJuIGNyZWF0ZVBUQXJyYXlDcmVhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUjogcmV0dXJuIGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT046IHJldHVybiBjcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTOiByZXR1cm4gY3JlYXRlUFRGaWVsZEFjY2VzcygpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRjogcmV0dXJuIGNyZWF0ZVBUSW5zdGFuY2VvZigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTjogcmV0dXJuIGNyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FOiByZXR1cm4gY3JlYXRlUFROYW1lKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTExfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUTnVsbExpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVNQkVSX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVE51bWJlckxpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUU3RyaW5nTGl0ZXJhbCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9USElTX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVFRoaXNMaXRlcmFsKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUVHlwZUxpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0U6IHJldHVybiBjcmVhdGVQVEluc3RhbmNlUmVmZXJlbmNlKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTjogcmV0dXJuIGNyZWF0ZVBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfT1BFUkFUT1I6IHsKLQkJCQlQVEluZml4T3BlcmF0b3IgcmVzdWx0ID0gUFRJbmZpeE9wZXJhdG9yLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9PUEVSQVRPUjogewotCQkJCVBUUHJlZml4T3BlcmF0b3IgcmVzdWx0ID0gUFRQcmVmaXhPcGVyYXRvci5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfT1BFUkFUT1I6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9PUEVSQVRPUjoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbml0U3RyaW5nQWxsb2NhdGlvbiBjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbigpIHsKLQkJSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsIGluaXRTdHJpbmdBbGxvY2F0aW9uID0gbmV3IEluaXRTdHJpbmdBbGxvY2F0aW9uSW1wbCgpOwotCQlyZXR1cm4gaW5pdFN0cmluZ0FsbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltcGxpY2l0QWxsb2NhdGlvbiBjcmVhdGVJbXBsaWNpdEFsbG9jYXRpb24oKSB7Ci0JCUltcGxpY2l0QWxsb2NhdGlvbkltcGwgaW1wbGljaXRBbGxvY2F0aW9uID0gbmV3IEltcGxpY2l0QWxsb2NhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGltcGxpY2l0QWxsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VUcmVlQWxsb2NhdGlvbiBjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKCkgewotCQlQYXJzZVRyZWVBbGxvY2F0aW9uSW1wbCBwYXJzZVRyZWVBbGxvY2F0aW9uID0gbmV3IFBhcnNlVHJlZUFsbG9jYXRpb25JbXBsKCk7Ci0JCXJldHVybiBwYXJzZVRyZWVBbGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEFycmF5QWNjZXNzIGNyZWF0ZVBUQXJyYXlBY2Nlc3MoKSB7Ci0JCVBUQXJyYXlBY2Nlc3NJbXBsIHB0QXJyYXlBY2Nlc3MgPSBuZXcgUFRBcnJheUFjY2Vzc0ltcGwoKTsKLQkJcmV0dXJuIHB0QXJyYXlBY2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQXJyYXlDcmVhdGlvbiBjcmVhdGVQVEFycmF5Q3JlYXRpb24oKSB7Ci0JCVBUQXJyYXlDcmVhdGlvbkltcGwgcHRBcnJheUNyZWF0aW9uID0gbmV3IFBUQXJyYXlDcmVhdGlvbkltcGwoKTsKLQkJcmV0dXJuIHB0QXJyYXlDcmVhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRBcnJheUluaXRpYWxpemVyIGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpIHsKLQkJUFRBcnJheUluaXRpYWxpemVySW1wbCBwdEFycmF5SW5pdGlhbGl6ZXIgPSBuZXcgUFRBcnJheUluaXRpYWxpemVySW1wbCgpOwotCQlyZXR1cm4gcHRBcnJheUluaXRpYWxpemVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEJvb2xlYW5MaXRlcmFsIGNyZWF0ZVBUQm9vbGVhbkxpdGVyYWwoKSB7Ci0JCVBUQm9vbGVhbkxpdGVyYWxJbXBsIHB0Qm9vbGVhbkxpdGVyYWwgPSBuZXcgUFRCb29sZWFuTGl0ZXJhbEltcGwoKTsKLQkJcmV0dXJuIHB0Qm9vbGVhbkxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQ2FzdEV4cHJlc3Npb24gY3JlYXRlUFRDYXN0RXhwcmVzc2lvbigpIHsKLQkJUFRDYXN0RXhwcmVzc2lvbkltcGwgcHRDYXN0RXhwcmVzc2lvbiA9IG5ldyBQVENhc3RFeHByZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gcHRDYXN0RXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRDaGFyYWN0ZXJMaXRlcmFsIGNyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbCgpIHsKLQkJUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCBwdENoYXJhY3RlckxpdGVyYWwgPSBuZXcgUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHRDaGFyYWN0ZXJMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpIHsKLQkJUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsIHB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uID0gbmV3IFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHRDbGFzc0luc3RhbmNlQ3JlYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNyZWF0ZVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkgewotCQlQVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwgcHRDb25kaXRpb25hbEV4cHJlc3Npb24gPSBuZXcgUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsKCk7Ci0JCXJldHVybiBwdENvbmRpdGlvbmFsRXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRGaWVsZEFjY2VzcyBjcmVhdGVQVEZpZWxkQWNjZXNzKCkgewotCQlQVEZpZWxkQWNjZXNzSW1wbCBwdEZpZWxkQWNjZXNzID0gbmV3IFBURmllbGRBY2Nlc3NJbXBsKCk7Ci0JCXJldHVybiBwdEZpZWxkQWNjZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEluZml4RXhwcmVzc2lvbiBjcmVhdGVQVEluZml4RXhwcmVzc2lvbigpIHsKLQkJUFRJbmZpeEV4cHJlc3Npb25JbXBsIHB0SW5maXhFeHByZXNzaW9uID0gbmV3IFBUSW5maXhFeHByZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gcHRJbmZpeEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUSW5zdGFuY2VvZiBjcmVhdGVQVEluc3RhbmNlb2YoKSB7Ci0JCVBUSW5zdGFuY2VvZkltcGwgcHRJbnN0YW5jZW9mID0gbmV3IFBUSW5zdGFuY2VvZkltcGwoKTsKLQkJcmV0dXJuIHB0SW5zdGFuY2VvZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRNZXRob2RJbnZvY2F0aW9uIGNyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbigpIHsKLQkJUFRNZXRob2RJbnZvY2F0aW9uSW1wbCBwdE1ldGhvZEludm9jYXRpb24gPSBuZXcgUFRNZXRob2RJbnZvY2F0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHRNZXRob2RJbnZvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVE5hbWUgY3JlYXRlUFROYW1lKCkgewotCQlQVE5hbWVJbXBsIHB0TmFtZSA9IG5ldyBQVE5hbWVJbXBsKCk7Ci0JCXJldHVybiBwdE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUTnVsbExpdGVyYWwgY3JlYXRlUFROdWxsTGl0ZXJhbCgpIHsKLQkJUFROdWxsTGl0ZXJhbEltcGwgcHROdWxsTGl0ZXJhbCA9IG5ldyBQVE51bGxMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHROdWxsTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFROdW1iZXJMaXRlcmFsIGNyZWF0ZVBUTnVtYmVyTGl0ZXJhbCgpIHsKLQkJUFROdW1iZXJMaXRlcmFsSW1wbCBwdE51bWJlckxpdGVyYWwgPSBuZXcgUFROdW1iZXJMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHROdW1iZXJMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGNyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKSB7Ci0JCVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsIHB0UGFyZW50aGVzaXplZEV4cHJlc3Npb24gPSBuZXcgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHB0UGFyZW50aGVzaXplZEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUUHJlZml4RXhwcmVzc2lvbiBjcmVhdGVQVFByZWZpeEV4cHJlc3Npb24oKSB7Ci0JCVBUUHJlZml4RXhwcmVzc2lvbkltcGwgcHRQcmVmaXhFeHByZXNzaW9uID0gbmV3IFBUUHJlZml4RXhwcmVzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHB0UHJlZml4RXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRTdHJpbmdMaXRlcmFsIGNyZWF0ZVBUU3RyaW5nTGl0ZXJhbCgpIHsKLQkJUFRTdHJpbmdMaXRlcmFsSW1wbCBwdFN0cmluZ0xpdGVyYWwgPSBuZXcgUFRTdHJpbmdMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHRTdHJpbmdMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVFRoaXNMaXRlcmFsIGNyZWF0ZVBUVGhpc0xpdGVyYWwoKSB7Ci0JCVBUVGhpc0xpdGVyYWxJbXBsIHB0VGhpc0xpdGVyYWwgPSBuZXcgUFRUaGlzTGl0ZXJhbEltcGwoKTsKLQkJcmV0dXJuIHB0VGhpc0xpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUVHlwZUxpdGVyYWwgY3JlYXRlUFRUeXBlTGl0ZXJhbCgpIHsKLQkJUFRUeXBlTGl0ZXJhbEltcGwgcHRUeXBlTGl0ZXJhbCA9IG5ldyBQVFR5cGVMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHRUeXBlTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRJbnZhbGlkRXhwcmVzc2lvbiBjcmVhdGVQVEludmFsaWRFeHByZXNzaW9uKCkgewotCQlQVEludmFsaWRFeHByZXNzaW9uSW1wbCBwdEludmFsaWRFeHByZXNzaW9uID0gbmV3IFBUSW52YWxpZEV4cHJlc3Npb25JbXBsKCk7Ci0JCXJldHVybiBwdEludmFsaWRFeHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEluc3RhbmNlUmVmZXJlbmNlIGNyZWF0ZVBUSW5zdGFuY2VSZWZlcmVuY2UoKSB7Ci0JCVBUSW5zdGFuY2VSZWZlcmVuY2VJbXBsIHB0SW5zdGFuY2VSZWZlcmVuY2UgPSBuZXcgUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwoKTsKLQkJcmV0dXJuIHB0SW5zdGFuY2VSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBjcmVhdGVQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSB7Ci0JCVBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwgcHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uID0gbmV3IFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIHB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgUFRJbnN0YW5jZVJlZmVyZW5jZSBjcmVhdGVQVEluc3RhbmNlUmVmZXJlbmNlKElKYXZhSW5zdGFuY2UgaW5zdGFuY2UpIHsKLQkJUFRJbnN0YW5jZVJlZmVyZW5jZSBwdEluc3RhbmNlUmVmZXJlbmNlID0gY3JlYXRlUFRJbnN0YW5jZVJlZmVyZW5jZSgpOwotCQlwdEluc3RhbmNlUmVmZXJlbmNlLnNldFJlZmVyZW5jZShpbnN0YW5jZSk7Ci0JCXJldHVybiBwdEluc3RhbmNlUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnN0YW50aWF0aW9uUGFja2FnZSBnZXRJbnN0YW50aWF0aW9uUGFja2FnZSgpIHsKLQkJcmV0dXJuIChJbnN0YW50aWF0aW9uUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnN0YW50aWF0aW9uUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgSW1wbGljaXRBbGxvY2F0aW9uIGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbihFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIHNmKSB7Ci0JCUltcGxpY2l0QWxsb2NhdGlvbiBhbGxvYyA9IGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbigpOwotCQlhbGxvYy5zZXRQYXJlbnQocGFyZW50KTsKLQkJYWxsb2Muc2V0RmVhdHVyZShzZik7Ci0JCXJldHVybiBhbGxvYzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbml0U3RyaW5nQWxsb2NhdGlvbiBjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbihTdHJpbmcgaW5pdFN0cmluZykgewotCQlJbml0U3RyaW5nQWxsb2NhdGlvbiBhbGxvYyA9IGNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCk7Ci0JCWFsbG9jLnNldEluaXRTdHJpbmcoaW5pdFN0cmluZyk7Ci0JCXJldHVybiBhbGxvYzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgUGFyc2VUcmVlQWxsb2NhdGlvbiBjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBhcnNlVHJlZUFsbG9jYXRpb24gYSA9IGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQkJYS5zZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEFycmF5QWNjZXNzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIFBUQXJyYXlBY2Nlc3MgY3JlYXRlUFRBcnJheUFjY2VzcyhQVEV4cHJlc3Npb24gYXJyYXksIExpc3QgaW5kZXhlcykgewotCQlQVEFycmF5QWNjZXNzIGEgPSBjcmVhdGVQVEFycmF5QWNjZXNzKCk7Ci0JCWEuc2V0QXJyYXkoYXJyYXkpOwotCQlhLmdldEluZGV4ZXMoKS5hZGRBbGwoaW5kZXhlcyk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQXJyYXlDcmVhdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyKQotCSAqLwotCXB1YmxpYyBQVEFycmF5Q3JlYXRpb24gY3JlYXRlUFRBcnJheUNyZWF0aW9uKFN0cmluZyB0eXBlLCBMaXN0IGRpbWVuc2lvbnMsIFBUQXJyYXlJbml0aWFsaXplciBpbml0aWFsaXplcikgewotCQlQVEFycmF5Q3JlYXRpb24gYSA9IGNyZWF0ZVBUQXJyYXlDcmVhdGlvbigpOwotCQlhLnNldFR5cGUodHlwZSk7Ci0JCWlmIChkaW1lbnNpb25zICE9IG51bGwpCi0JCQlhLmdldERpbWVuc2lvbnMoKS5hZGRBbGwoZGltZW5zaW9ucyk7Ci0JCWEuc2V0SW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIFBUQXJyYXlJbml0aWFsaXplciBjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoTGlzdCBleHByZXNzaW9ucykgewotCQlQVEFycmF5SW5pdGlhbGl6ZXIgYSA9IGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpOwotCQlpZiAoZXhwcmVzc2lvbnMgIT0gbnVsbCkKLQkJCWEuZ2V0RXhwcmVzc2lvbnMoKS5hZGRBbGwoZXhwcmVzc2lvbnMpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKGJvb2xlYW4pCi0JICovCi0JcHVibGljIFBUQm9vbGVhbkxpdGVyYWwgY3JlYXRlUFRCb29sZWFuTGl0ZXJhbChib29sZWFuIGJvb2xlYW5WYWx1ZSkgewotCQlQVEJvb2xlYW5MaXRlcmFsIGEgPSBjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKCk7Ci0JCWEuc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW5WYWx1ZSk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBQVENhc3RFeHByZXNzaW9uIGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oU3RyaW5nIHR5cGUsIFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBUQ2FzdEV4cHJlc3Npb24gYSA9IGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oKTsKLQkJYS5zZXRUeXBlKHR5cGUpOwotCQlhLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVENoYXJhY3RlckxpdGVyYWwgY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKFN0cmluZyBlc2NhcGVkVmFsdWUpIHsKLQkJUFRDaGFyYWN0ZXJMaXRlcmFsIGEgPSBjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQkJYS5zZXRFc2NhcGVkVmFsdWUoZXNjYXBlZFZhbHVlKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKFN0cmluZyB0eXBlLCBMaXN0IGFyZ3VtZW50cykgewotCQlQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBhID0gY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJYS5zZXRUeXBlKHR5cGUpOwotCQlpZiAoYXJndW1lbnRzICE9IG51bGwpCi0JCQlhLmdldEFyZ3VtZW50cygpLmFkZEFsbChhcmd1bWVudHMpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigKLQkJUFRFeHByZXNzaW9uIGNvbmRpdGlvbiwKLQkJUFRFeHByZXNzaW9uIHRydWVFeHByZXNzb2luLAotCQlQVEV4cHJlc3Npb24gZmFsc2VFeHByZXNzaW9uKSB7Ci0JCVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGEgPSBjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwotCQlhLnNldENvbmRpdGlvbihjb25kaXRpb24pOwotCQlhLnNldFRydWUodHJ1ZUV4cHJlc3NvaW4pOwotCQlhLnNldEZhbHNlKGZhbHNlRXhwcmVzc2lvbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBURmllbGRBY2Nlc3Mob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVEZpZWxkQWNjZXNzIGNyZWF0ZVBURmllbGRBY2Nlc3MoUFRFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgZmllbGQpIHsKLQkJUFRGaWVsZEFjY2VzcyBhID0gY3JlYXRlUFRGaWVsZEFjY2VzcygpOwotCQlhLnNldFJlY2VpdmVyKHJlY2VpdmVyKTsKLQkJYS5zZXRGaWVsZChmaWVsZCk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUSW5maXhFeHByZXNzaW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBQVEluZml4RXhwcmVzc2lvbiBjcmVhdGVQVEluZml4RXhwcmVzc2lvbigKLQkJUFRFeHByZXNzaW9uIGxlZnRPcGVyYW5kLAotCQlQVEluZml4T3BlcmF0b3Igb3BlcmF0b3IsCi0JCVBURXhwcmVzc2lvbiByaWdodE9wZXJhbmQsCi0JCUxpc3QgZXh0ZW5kZWRPcGVyYW5kcykgewotCQlQVEluZml4RXhwcmVzc2lvbiBhID0gY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oKTsKLQkJYS5zZXRMZWZ0T3BlcmFuZChsZWZ0T3BlcmFuZCk7Ci0JCWEuc2V0T3BlcmF0b3Iob3BlcmF0b3IpOwotCQlhLnNldFJpZ2h0T3BlcmFuZChyaWdodE9wZXJhbmQpOwotCQlpZiAoZXh0ZW5kZWRPcGVyYW5kcyAhPSBudWxsKQotCQkJYS5nZXRFeHRlbmRlZE9wZXJhbmRzKCkuYWRkQWxsKGV4dGVuZGVkT3BlcmFuZHMpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEluc3RhbmNlb2Yob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVEluc3RhbmNlb2YgY3JlYXRlUFRJbnN0YW5jZW9mKFBURXhwcmVzc2lvbiBvcGVyYW5kLCBTdHJpbmcgdHlwZSkgewotCQlQVEluc3RhbmNlb2YgYSA9IGNyZWF0ZVBUSW5zdGFuY2VvZigpOwotCQlhLnNldE9wZXJhbmQob3BlcmFuZCk7Ci0JCWEuc2V0VHlwZSh0eXBlKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVEludmFsaWRFeHByZXNzaW9uIGNyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJUFRJbnZhbGlkRXhwcmVzc2lvbiBhID0gY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCQlhLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBQVE1ldGhvZEludm9jYXRpb24gY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKFBURXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIG5hbWUsIExpc3QgYXJndW1lbnRzKSB7Ci0JCVBUTWV0aG9kSW52b2NhdGlvbiBhID0gY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCWEuc2V0UmVjZWl2ZXIocmVjZWl2ZXIpOwotCQlhLnNldE5hbWUobmFtZSk7Ci0JCWlmIChhcmd1bWVudHMgIT0gbnVsbCkKLQkJCWEuZ2V0QXJndW1lbnRzKCkuYWRkQWxsKGFyZ3VtZW50cyk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVE5hbWUgY3JlYXRlUFROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVBUTmFtZSBhID0gY3JlYXRlUFROYW1lKCk7Ci0JCWEuc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFROdW1iZXJMaXRlcmFsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBUTnVtYmVyTGl0ZXJhbCBjcmVhdGVQVE51bWJlckxpdGVyYWwoU3RyaW5nIHRva2VuKSB7Ci0JCVBUTnVtYmVyTGl0ZXJhbCBhID0gY3JlYXRlUFROdW1iZXJMaXRlcmFsKCk7Ci0JCWEuc2V0VG9rZW4odG9rZW4pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gYSA9IGNyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQkJYS5zZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVFByZWZpeEV4cHJlc3Npb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvciwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBQVFByZWZpeEV4cHJlc3Npb24gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKFBUUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IsIFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBUUHJlZml4RXhwcmVzc2lvbiBhID0gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKCk7Ci0JCWEuc2V0T3BlcmF0b3Iob3BlcmF0b3IpOwotCQlhLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUU3RyaW5nTGl0ZXJhbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVFN0cmluZ0xpdGVyYWwgY3JlYXRlUFRTdHJpbmdMaXRlcmFsKFN0cmluZyBlc2NhcGVMaXRlcmFsKSB7Ci0JCVBUU3RyaW5nTGl0ZXJhbCBhID0gY3JlYXRlUFRTdHJpbmdMaXRlcmFsKCk7Ci0JCWEuc2V0RXNjYXBlZFZhbHVlKGVzY2FwZUxpdGVyYWwpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVFR5cGVMaXRlcmFsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBUVHlwZUxpdGVyYWwgY3JlYXRlUFRUeXBlTGl0ZXJhbChTdHJpbmcgdHlwZSkgewotCQlQVFR5cGVMaXRlcmFsIGEgPSBjcmVhdGVQVFR5cGVMaXRlcmFsKCk7Ci0JCWEuc2V0VHlwZSh0eXBlKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi19IC8vSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luc3RhbnRpYXRpb25JbXBsTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGViZTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXJfSW52YWxpZEV4cHJlc3Npb247Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5M2Q3OGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2Y7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVsbExpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFRoaXNMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEluc3RhbnRpYXRpb25QYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpSmF2YURhdGFUeXBlSW5zdGFuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaUphdmFPYmplY3RJbnN0YW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqYXZhQWxsb2NhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGFyc2VUcmVlQWxsb2NhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRBcnJheUFjY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEFycmF5Q3JlYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRBcnJheUluaXRpYWxpemVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0Qm9vbGVhbkxpdGVyYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRDYXN0RXhwcmVzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRGaWVsZEFjY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEluZml4RXhwcmVzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEluc3RhbmNlb2ZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0TmFtZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdE51bGxMaXRlcmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0TnVtYmVyTGl0ZXJhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0UHJlZml4RXhwcmVzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdFN0cmluZ0xpdGVyYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRUaGlzTGl0ZXJhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdFR5cGVMaXRlcmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0SW52YWxpZEV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBwdEluZml4T3BlcmF0b3JFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHB0UHJlZml4T3BlcmF0b3JFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpSmF2YUluc3RhbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJbnN0YW50aWF0aW9uUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluc3RhbnRpYXRpb25QYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChJbnN0YW50aWF0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShJbnN0YW50aWF0aW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCB0aGVJbnN0YW50aWF0aW9uUGFja2FnZSA9IChJbnN0YW50aWF0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlSW5zdGFudGlhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVJbnN0YW50aWF0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVJbnN0YW50aWF0aW9uUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJSmF2YU9iamVjdEluc3RhbmNlKCkgewotCQlyZXR1cm4gaUphdmFPYmplY3RJbnN0YW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEphdmFBbGxvY2F0aW9uKCkgewotCQlyZXR1cm4gamF2YUFsbG9jYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbml0U3RyaW5nQWxsb2NhdGlvbigpIHsKLQkJcmV0dXJuIGluaXRTdHJpbmdBbGxvY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEluaXRTdHJpbmdBbGxvY2F0aW9uX0luaXRTdHJpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW1wbGljaXRBbGxvY2F0aW9uKCkgewotCQlyZXR1cm4gaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEltcGxpY2l0QWxsb2NhdGlvbl9QYXJlbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBsaWNpdEFsbG9jYXRpb25fRmVhdHVyZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbigpIHsKLQkJcmV0dXJuIHBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbl9FeHByZXNzaW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGFyc2VUcmVlQWxsb2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRFeHByZXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRBcnJheUFjY2VzcygpIHsKLQkJcmV0dXJuIHB0QXJyYXlBY2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRBcnJheUFjY2Vzc19BcnJheSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0QXJyYXlBY2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEFycmF5QWNjZXNzX0luZGV4ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEFycmF5QWNjZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEFycmF5Q3JlYXRpb24oKSB7Ci0JCXJldHVybiBwdEFycmF5Q3JlYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRBcnJheUNyZWF0aW9uX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEFycmF5Q3JlYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEFycmF5Q3JlYXRpb25fRGltZW5zaW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0QXJyYXlDcmVhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQXJyYXlDcmVhdGlvbl9Jbml0aWFsaXplcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0QXJyYXlDcmVhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRBcnJheUluaXRpYWxpemVyKCkgewotCQlyZXR1cm4gcHRBcnJheUluaXRpYWxpemVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQXJyYXlJbml0aWFsaXplcl9FeHByZXNzaW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0QXJyYXlJbml0aWFsaXplckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRCb29sZWFuTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0Qm9vbGVhbkxpdGVyYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRCb29sZWFuTGl0ZXJhbF9Cb29sZWFuVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEJvb2xlYW5MaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVENhc3RFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRDYXN0RXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVENhc3RFeHByZXNzaW9uX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdENhc3RFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRDYXN0RXhwcmVzc2lvbl9FeHByZXNzaW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRDYXN0RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCkgewotCQlyZXR1cm4gcHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQ2hhcmFjdGVyTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVENoYXJhY3RlckxpdGVyYWxfQ2hhclZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpIHsKLQkJcmV0dXJuIHB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uX0FyZ3VtZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0NvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fVHJ1ZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fRmFsc2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRGaWVsZEFjY2VzcygpIHsKLQkJcmV0dXJuIHB0RmllbGRBY2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRGaWVsZEFjY2Vzc19SZWNlaXZlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0RmllbGRBY2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVEZpZWxkQWNjZXNzX0ZpZWxkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRGaWVsZEFjY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRJbmZpeEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdEluZml4RXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEluZml4RXhwcmVzc2lvbl9MZWZ0T3BlcmFuZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0SW5maXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRJbmZpeEV4cHJlc3Npb25fT3BlcmF0b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEluZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUSW5maXhFeHByZXNzaW9uX1JpZ2h0T3BlcmFuZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0SW5maXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRJbmZpeEV4cHJlc3Npb25fRXh0ZW5kZWRPcGVyYW5kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0SW5maXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEluc3RhbmNlb2YoKSB7Ci0JCXJldHVybiBwdEluc3RhbmNlb2ZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRJbnN0YW5jZW9mX09wZXJhbmQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEluc3RhbmNlb2ZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVEluc3RhbmNlb2ZfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0SW5zdGFuY2VvZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRNZXRob2RJbnZvY2F0aW9uKCkgewotCQlyZXR1cm4gcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUTWV0aG9kSW52b2NhdGlvbl9SZWNlaXZlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUTWV0aG9kSW52b2NhdGlvbl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRNZXRob2RJbnZvY2F0aW9uX0FyZ3VtZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFROYW1lKCkgewotCQlyZXR1cm4gcHROYW1lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUTmFtZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHROYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVE51bGxMaXRlcmFsKCkgewotCQlyZXR1cm4gcHROdWxsTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUTnVtYmVyTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0TnVtYmVyTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVE51bWJlckxpdGVyYWxfVG9rZW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdE51bWJlckxpdGVyYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25fRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0UGFyZW50aGVzaXplZEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUUHJlZml4RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHB0UHJlZml4RXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVFByZWZpeEV4cHJlc3Npb25fT3BlcmF0b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVFByZWZpeEV4cHJlc3Npb25fRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0UHJlZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRTdHJpbmdMaXRlcmFsKCkgewotCQlyZXR1cm4gcHRTdHJpbmdMaXRlcmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUU3RyaW5nTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdFN0cmluZ0xpdGVyYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVFN0cmluZ0xpdGVyYWxfTGl0ZXJhbFZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRTdHJpbmdMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVFRoaXNMaXRlcmFsKCkgewotCQlyZXR1cm4gcHRUaGlzTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUVHlwZUxpdGVyYWwoKSB7Ci0JCXJldHVybiBwdFR5cGVMaXRlcmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUVHlwZUxpdGVyYWxfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0VHlwZUxpdGVyYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUSW52YWxpZEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdEludmFsaWRFeHByZXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUSW52YWxpZEV4cHJlc3Npb25fTWVzc2FnZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0SW52YWxpZEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUSW5zdGFuY2VSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBwdEluc3RhbmNlUmVmZXJlbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUSW5zdGFuY2VSZWZlcmVuY2VfUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gcHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9EZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9JbXBvcnRzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFBUSW5maXhPcGVyYXRvcigpIHsKLQkJcmV0dXJuIHB0SW5maXhPcGVyYXRvckVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRQVFByZWZpeE9wZXJhdG9yKCkgewotCQlyZXR1cm4gcHRQcmVmaXhPcGVyYXRvckVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFEYXRhVHlwZUluc3RhbmNlKCkgewotCQlyZXR1cm4gaUphdmFEYXRhVHlwZUluc3RhbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGlKYXZhSW5zdGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluc3RhbnRpYXRpb25GYWN0b3J5IGdldEluc3RhbnRpYXRpb25GYWN0b3J5KCkgewotCQlyZXR1cm4gKEluc3RhbnRpYXRpb25GYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWlKYXZhRGF0YVR5cGVJbnN0YW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9EQVRBX1RZUEVfSU5TVEFOQ0UpOwotCi0JCWlKYXZhSW5zdGFuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUpBVkFfSU5TVEFOQ0UpOwotCi0JCWlKYXZhT2JqZWN0SW5zdGFuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUpBVkFfT0JKRUNUX0lOU1RBTkNFKTsKLQotCQlqYXZhQWxsb2NhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0FMTE9DQVRJT04pOwotCi0JCWluaXRTdHJpbmdBbGxvY2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOSVRfU1RSSU5HX0FMTE9DQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRTdHJpbmdBbGxvY2F0aW9uRUNsYXNzLCBJTklUX1NUUklOR19BTExPQ0FUSU9OX19JTklUX1NUUklORyk7Ci0KLQkJaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElNUExJQ0lUX0FMTE9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcywgSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MsIElNUExJQ0lUX0FMTE9DQVRJT05fX0ZFQVRVUkUpOwotCi0JCXBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFSU0VfVFJFRV9BTExPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwYXJzZVRyZWVBbGxvY2F0aW9uRUNsYXNzLCBQQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT04pOwotCi0JCXB0RXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9FWFBSRVNTSU9OKTsKLQotCQlwdEFycmF5QWNjZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0FSUkFZX0FDQ0VTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRBcnJheUFjY2Vzc0VDbGFzcywgUFRfQVJSQVlfQUNDRVNTX19BUlJBWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRBcnJheUFjY2Vzc0VDbGFzcywgUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTKTsKLQotCQlwdEFycmF5Q3JlYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQVJSQVlfQ1JFQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0QXJyYXlDcmVhdGlvbkVDbGFzcywgUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0QXJyYXlDcmVhdGlvbkVDbGFzcywgUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0QXJyYXlDcmVhdGlvbkVDbGFzcywgUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSKTsKLQotCQlwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQVJSQVlfSU5JVElBTElaRVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0QXJyYXlJbml0aWFsaXplckVDbGFzcywgUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TKTsKLQotCQlwdEJvb2xlYW5MaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0JPT0xFQU5fTElURVJBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRCb29sZWFuTGl0ZXJhbEVDbGFzcywgUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFKTsKLQotCQlwdENhc3RFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0NBU1RfRVhQUkVTU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRDYXN0RXhwcmVzc2lvbkVDbGFzcywgUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdENhc3RFeHByZXNzaW9uRUNsYXNzLCBQVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT04pOwotCi0JCXB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9DSEFSQUNURVJfTElURVJBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzLCBQVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzLCBQVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRSk7Ci0KLQkJcHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzLCBQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MsIFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFMpOwotCi0JCXB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcywgUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0UpOwotCi0JCXB0RmllbGRBY2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfRklFTERfQUNDRVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEZpZWxkQWNjZXNzRUNsYXNzLCBQVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEZpZWxkQWNjZXNzRUNsYXNzLCBQVF9GSUVMRF9BQ0NFU1NfX0ZJRUxEKTsKLQotCQlwdEluZml4RXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9JTkZJWF9FWFBSRVNTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEluZml4RXhwcmVzc2lvbkVDbGFzcywgUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEluZml4RXhwcmVzc2lvbkVDbGFzcywgUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0SW5maXhFeHByZXNzaW9uRUNsYXNzLCBQVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEluZml4RXhwcmVzc2lvbkVDbGFzcywgUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFMpOwotCi0JCXB0SW5zdGFuY2VvZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9JTlNUQU5DRU9GKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEluc3RhbmNlb2ZFQ2xhc3MsIFBUX0lOU1RBTkNFT0ZfX09QRVJBTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0SW5zdGFuY2VvZkVDbGFzcywgUFRfSU5TVEFOQ0VPRl9fVFlQRSk7Ci0KLQkJcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX01FVEhPRF9JTlZPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MsIFBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLCBQVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLCBQVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTKTsKLQotCQlwdE5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHROYW1lRUNsYXNzLCBQVF9OQU1FX19OQU1FKTsKLQotCQlwdE51bGxMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX05VTExfTElURVJBTCk7Ci0KLQkJcHROdW1iZXJMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX05VTUJFUl9MSVRFUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdE51bWJlckxpdGVyYWxFQ2xhc3MsIFBUX05VTUJFUl9MSVRFUkFMX19UT0tFTik7Ci0KLQkJcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0UGFyZW50aGVzaXplZEV4cHJlc3Npb25FQ2xhc3MsIFBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTik7Ci0KLQkJcHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX1BSRUZJWF9FWFBSRVNTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUX1BSRUZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzLCBQVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTik7Ci0KLQkJcHRTdHJpbmdMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX1NUUklOR19MSVRFUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdFN0cmluZ0xpdGVyYWxFQ2xhc3MsIFBUX1NUUklOR19MSVRFUkFMX19FU0NBUEVEX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdFN0cmluZ0xpdGVyYWxFQ2xhc3MsIFBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFKTsKLQotCQlwdFRoaXNMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX1RISVNfTElURVJBTCk7Ci0KLQkJcHRUeXBlTGl0ZXJhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9UWVBFX0xJVEVSQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0VHlwZUxpdGVyYWxFQ2xhc3MsIFBUX1RZUEVfTElURVJBTF9fVFlQRSk7Ci0KLQkJcHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9JTlZBTElEX0VYUFJFU1NJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0SW52YWxpZEV4cHJlc3Npb25FQ2xhc3MsIFBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRSk7Ci0KLQkJcHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9JTlNUQU5DRV9SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0SW5zdGFuY2VSZWZlcmVuY2VFQ2xhc3MsIFBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFKTsKLQotCQlwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3MsIFBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fREVDTEFSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzcywgUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19JTVBPUlRTKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJcHRJbmZpeE9wZXJhdG9yRUVudW0gPSBjcmVhdGVFRW51bShQVF9JTkZJWF9PUEVSQVRPUik7Ci0JCXB0UHJlZml4T3BlcmF0b3JFRW51bSA9IGNyZWF0ZUVFbnVtKFBUX1BSRUZJWF9PUEVSQVRPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUVjb3JlUGFja2FnZUltcGwgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJaUphdmFEYXRhVHlwZUluc3RhbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFJbnN0YW5jZSgpKTsKLQkJaUphdmFPYmplY3RJbnN0YW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElKYXZhSW5zdGFuY2UoKSk7Ci0JCWluaXRTdHJpbmdBbGxvY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YUFsbG9jYXRpb24oKSk7Ci0JCWltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFBbGxvY2F0aW9uKCkpOwotCQlwYXJzZVRyZWVBbGxvY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YUFsbG9jYXRpb24oKSk7Ci0JCXB0QXJyYXlBY2Nlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0QXJyYXlDcmVhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRBcnJheUluaXRpYWxpemVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEJvb2xlYW5MaXRlcmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdENhc3RFeHByZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRGaWVsZEFjY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0SW5zdGFuY2VvZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdE5hbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0TnVsbExpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0TnVtYmVyTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdFN0cmluZ0xpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0VGhpc0xpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0VHlwZUxpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0SW52YWxpZEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0SW5zdGFuY2VSZWZlcmVuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGlKYXZhRGF0YVR5cGVJbnN0YW5jZUVDbGFzcywgSUphdmFEYXRhVHlwZUluc3RhbmNlLmNsYXNzLCAiSUphdmFEYXRhVHlwZUluc3RhbmNlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhpSmF2YUluc3RhbmNlRUNsYXNzLCBJSmF2YUluc3RhbmNlLmNsYXNzLCAiSUphdmFJbnN0YW5jZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoaUphdmFPYmplY3RJbnN0YW5jZUVDbGFzcywgSUphdmFPYmplY3RJbnN0YW5jZS5jbGFzcywgIklKYXZhT2JqZWN0SW5zdGFuY2UiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGphdmFBbGxvY2F0aW9uRUNsYXNzLCBKYXZhQWxsb2NhdGlvbi5jbGFzcywgIkphdmFBbGxvY2F0aW9uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzcywgSW5pdFN0cmluZ0FsbG9jYXRpb24uY2xhc3MsICJJbml0U3RyaW5nQWxsb2NhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb25fSW5pdFN0cmluZygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5pdFN0cmluZyIsIG51bGwsIDAsIDEsIEluaXRTdHJpbmdBbGxvY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzLCBJbXBsaWNpdEFsbG9jYXRpb24uY2xhc3MsICJJbXBsaWNpdEFsbG9jYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEltcGxpY2l0QWxsb2NhdGlvbl9QYXJlbnQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVPYmplY3QoKSwgbnVsbCwgInBhcmVudCIsIG51bGwsIDEsIDEsIEltcGxpY2l0QWxsb2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW1wbGljaXRBbGxvY2F0aW9uX0ZlYXR1cmUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBudWxsLCAiZmVhdHVyZSIsIG51bGwsIDEsIDEsIEltcGxpY2l0QWxsb2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MsIFBhcnNlVHJlZUFsbG9jYXRpb24uY2xhc3MsICJQYXJzZVRyZWVBbGxvY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQYXJzZVRyZWVBbGxvY2F0aW9uX0V4cHJlc3Npb24oKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImV4cHJlc3Npb24iLCBudWxsLCAxLCAxLCBQYXJzZVRyZWVBbGxvY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRFeHByZXNzaW9uRUNsYXNzLCBQVEV4cHJlc3Npb24uY2xhc3MsICJQVEV4cHJlc3Npb24iLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHB0QXJyYXlBY2Nlc3NFQ2xhc3MsIFBUQXJyYXlBY2Nlc3MuY2xhc3MsICJQVEFycmF5QWNjZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEFycmF5QWNjZXNzX0FycmF5KCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJhcnJheSIsIG51bGwsIDAsIDEsIFBUQXJyYXlBY2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQXJyYXlBY2Nlc3NfSW5kZXhlcygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiaW5kZXhlcyIsIG51bGwsIDEsIC0xLCBQVEFycmF5QWNjZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRBcnJheUNyZWF0aW9uRUNsYXNzLCBQVEFycmF5Q3JlYXRpb24uY2xhc3MsICJQVEFycmF5Q3JlYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQXJyYXlDcmVhdGlvbl9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgUFRBcnJheUNyZWF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEFycmF5Q3JlYXRpb25fRGltZW5zaW9ucygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZGltZW5zaW9ucyIsIG51bGwsIDAsIC0xLCBQVEFycmF5Q3JlYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQXJyYXlDcmVhdGlvbl9Jbml0aWFsaXplcigpLCB0aGlzLmdldFBUQXJyYXlJbml0aWFsaXplcigpLCBudWxsLCAiaW5pdGlhbGl6ZXIiLCBudWxsLCAwLCAxLCBQVEFycmF5Q3JlYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3MsIFBUQXJyYXlJbml0aWFsaXplci5jbGFzcywgIlBUQXJyYXlJbml0aWFsaXplciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRBcnJheUluaXRpYWxpemVyX0V4cHJlc3Npb25zKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJleHByZXNzaW9ucyIsIG51bGwsIDAsIC0xLCBQVEFycmF5SW5pdGlhbGl6ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEJvb2xlYW5MaXRlcmFsRUNsYXNzLCBQVEJvb2xlYW5MaXRlcmFsLmNsYXNzLCAiUFRCb29sZWFuTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRCb29sZWFuTGl0ZXJhbF9Cb29sZWFuVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJib29sZWFuVmFsdWUiLCBudWxsLCAwLCAxLCBQVEJvb2xlYW5MaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRDYXN0RXhwcmVzc2lvbkVDbGFzcywgUFRDYXN0RXhwcmVzc2lvbi5jbGFzcywgIlBUQ2FzdEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQ2FzdEV4cHJlc3Npb25fVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFBUQ2FzdEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQ2FzdEV4cHJlc3Npb25fRXhwcmVzc2lvbigpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXhwcmVzc2lvbiIsIG51bGwsIDAsIDEsIFBUQ2FzdEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MsIFBUQ2hhcmFjdGVyTGl0ZXJhbC5jbGFzcywgIlBUQ2hhcmFjdGVyTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsX0VzY2FwZWRWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXNjYXBlZFZhbHVlIiwgbnVsbCwgMCwgMSwgUFRDaGFyYWN0ZXJMaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVENoYXJhY3RlckxpdGVyYWxfQ2hhclZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFQ2hhcigpLCAiY2hhclZhbHVlIiwgbnVsbCwgMCwgMSwgUFRDaGFyYWN0ZXJMaXRlcmFsLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcywgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24uY2xhc3MsICJQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb25fVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9Bcmd1bWVudHMoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImFyZ3VtZW50cyIsIG51bGwsIDAsIC0xLCBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLCBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5jbGFzcywgIlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9Db25kaXRpb24oKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9UcnVlKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJ0cnVlIiwgbnVsbCwgMCwgMSwgUFRDb25kaXRpb25hbEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0ZhbHNlKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJmYWxzZSIsIG51bGwsIDAsIDEsIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRGaWVsZEFjY2Vzc0VDbGFzcywgUFRGaWVsZEFjY2Vzcy5jbGFzcywgIlBURmllbGRBY2Nlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBURmllbGRBY2Nlc3NfUmVjZWl2ZXIoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgInJlY2VpdmVyIiwgbnVsbCwgMCwgMSwgUFRGaWVsZEFjY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRGaWVsZEFjY2Vzc19GaWVsZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGQiLCBudWxsLCAwLCAxLCBQVEZpZWxkQWNjZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUSW5maXhFeHByZXNzaW9uLmNsYXNzLCAiUFRJbmZpeEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUSW5maXhFeHByZXNzaW9uX0xlZnRPcGVyYW5kKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJsZWZ0T3BlcmFuZCIsIG51bGwsIDAsIDEsIFBUSW5maXhFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVEluZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpLCB0aGlzLmdldFBUSW5maXhPcGVyYXRvcigpLCAib3BlcmF0b3IiLCBudWxsLCAwLCAxLCBQVEluZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRJbmZpeEV4cHJlc3Npb25fUmlnaHRPcGVyYW5kKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJyaWdodE9wZXJhbmQiLCBudWxsLCAwLCAxLCBQVEluZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRJbmZpeEV4cHJlc3Npb25fRXh0ZW5kZWRPcGVyYW5kcygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXh0ZW5kZWRPcGVyYW5kcyIsIG51bGwsIDAsIC0xLCBQVEluZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0SW5zdGFuY2VvZkVDbGFzcywgUFRJbnN0YW5jZW9mLmNsYXNzLCAiUFRJbnN0YW5jZW9mIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEluc3RhbmNlb2ZfT3BlcmFuZCgpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAib3BlcmFuZCIsIG51bGwsIDAsIDEsIFBUSW5zdGFuY2VvZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRJbnN0YW5jZW9mX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQVEluc3RhbmNlb2YuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MsIFBUTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgIlBUTWV0aG9kSW52b2NhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRNZXRob2RJbnZvY2F0aW9uX1JlY2VpdmVyKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJyZWNlaXZlciIsIG51bGwsIDAsIDEsIFBUTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRNZXRob2RJbnZvY2F0aW9uX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQVE1ldGhvZEludm9jYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUTWV0aG9kSW52b2NhdGlvbl9Bcmd1bWVudHMoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImFyZ3VtZW50cyIsIG51bGwsIDAsIC0xLCBQVE1ldGhvZEludm9jYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdE5hbWVFQ2xhc3MsIFBUTmFtZS5jbGFzcywgIlBUTmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFROYW1lX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQVE5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdE51bGxMaXRlcmFsRUNsYXNzLCBQVE51bGxMaXRlcmFsLmNsYXNzLCAiUFROdWxsTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHB0TnVtYmVyTGl0ZXJhbEVDbGFzcywgUFROdW1iZXJMaXRlcmFsLmNsYXNzLCAiUFROdW1iZXJMaXRlcmFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVE51bWJlckxpdGVyYWxfVG9rZW4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRva2VuIiwgbnVsbCwgMCwgMSwgUFROdW1iZXJMaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzcywgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5jbGFzcywgIlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25fRXhwcmVzc2lvbigpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXhwcmVzc2lvbiIsIG51bGwsIDAsIDEsIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUUHJlZml4RXhwcmVzc2lvbi5jbGFzcywgIlBUUHJlZml4RXhwcmVzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRQcmVmaXhFeHByZXNzaW9uX09wZXJhdG9yKCksIHRoaXMuZ2V0UFRQcmVmaXhPcGVyYXRvcigpLCAib3BlcmF0b3IiLCBudWxsLCAwLCAxLCBQVFByZWZpeEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUUHJlZml4RXhwcmVzc2lvbl9FeHByZXNzaW9uKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJleHByZXNzaW9uIiwgbnVsbCwgMCwgMSwgUFRQcmVmaXhFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRTdHJpbmdMaXRlcmFsRUNsYXNzLCBQVFN0cmluZ0xpdGVyYWwuY2xhc3MsICJQVFN0cmluZ0xpdGVyYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUU3RyaW5nTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVzY2FwZWRWYWx1ZSIsIG51bGwsIDAsIDEsIFBUU3RyaW5nTGl0ZXJhbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRTdHJpbmdMaXRlcmFsX0xpdGVyYWxWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGl0ZXJhbFZhbHVlIiwgbnVsbCwgMCwgMSwgUFRTdHJpbmdMaXRlcmFsLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdFRoaXNMaXRlcmFsRUNsYXNzLCBQVFRoaXNMaXRlcmFsLmNsYXNzLCAiUFRUaGlzTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHB0VHlwZUxpdGVyYWxFQ2xhc3MsIFBUVHlwZUxpdGVyYWwuY2xhc3MsICJQVFR5cGVMaXRlcmFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVFR5cGVMaXRlcmFsX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQVFR5cGVMaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzcywgUFRJbnZhbGlkRXhwcmVzc2lvbi5jbGFzcywgIlBUSW52YWxpZEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUSW52YWxpZEV4cHJlc3Npb25fTWVzc2FnZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWVzc2FnZSIsIG51bGwsIDAsIDEsIFBUSW52YWxpZEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEluc3RhbmNlUmVmZXJlbmNlRUNsYXNzLCBQVEluc3RhbmNlUmVmZXJlbmNlLmNsYXNzLCAiUFRJbnN0YW5jZVJlZmVyZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZV9SZWZlcmVuY2UoKSwgdGhpcy5nZXRJSmF2YUluc3RhbmNlKCksIG51bGwsICJyZWZlcmVuY2UiLCBudWxsLCAxLCAxLCBQVEluc3RhbmNlUmVmZXJlbmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzLCBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24uY2xhc3MsICJQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9EZWNsYXJhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVjbGFyYXRpb24iLCBudWxsLCAwLCAxLCBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbl9JbXBvcnRzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpbXBvcnRzIiwgbnVsbCwgMCwgLTEsIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLmNsYXNzLCAiUFRJbmZpeE9wZXJhdG9yIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlRJTUVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5ESVZJREVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlJFTUFJTkRFUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuUExVU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuTUlOVVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkxFRlRfU0hJRlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlJJR0hUX1NISUZUX1NJR05FRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkxFU1NfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkdSRUFURVJfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkxFU1NfRVFVQUxTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5HUkVBVEVSX0VRVUFMU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuRVFVQUxTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5OT1RfRVFVQUxTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5YT1JfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkFORF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuT1JfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX0FORF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuQ09ORElUSU9OQUxfT1JfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHB0UHJlZml4T3BlcmF0b3JFRW51bSwgUFRQcmVmaXhPcGVyYXRvci5jbGFzcywgIlBUUHJlZml4T3BlcmF0b3IiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0UHJlZml4T3BlcmF0b3JFRW51bSwgUFRQcmVmaXhPcGVyYXRvci5QTFVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRQcmVmaXhPcGVyYXRvckVFbnVtLCBQVFByZWZpeE9wZXJhdG9yLk1JTlVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRQcmVmaXhPcGVyYXRvckVFbnVtLCBQVFByZWZpeE9wZXJhdG9yLkNPTVBMRU1FTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdFByZWZpeE9wZXJhdG9yRUVudW0sIFBUUHJlZml4T3BlcmF0b3IuTk9UX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9JbnN0YW50aWF0aW9uUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSmF2YUFsbG9jYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0phdmFBbGxvY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDliMzkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSmF2YUFsbG9jYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotIAotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSmF2YUFsbG9jYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhIEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhQWxsb2NhdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEphdmFBbGxvY2F0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUFsbG9jYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFBbGxvY2F0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUGFyc2VUcmVlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfSAvL0phdmFBbGxvY2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9OYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTEwNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9OYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotIAotLyoqCi0gKiBUaGlzIG5haXZlbHkgZmxhdHRlbnMgdGhlIFBhcnNlVHJlZS4gSXQganVzdCB3b3JrcyB3aXRoIHdoYXQncyB0aGVyZS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXIgZXh0ZW5kcyBQYXJzZVZpc2l0b3IgewotCQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nQnVmZmVyIGdldFN0cmluZ0J1ZmZlcigpIHsKLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJpbmcgcmVzdWx0IG9mIHRoZSBmbGF0dGVuaW5nLgotCSAqIEByZXR1cm4gVGhlIGZsYXR0ZW5lZCBzdHJpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVzZXQgdGhlIHJlc3VsdCBzbyB0aGF0IGZsYXR0ZW5lciBjYW4gYmUgdXNlZCBhZ2Fpbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJYnVmZmVyLnNldExlbmd0aCgwKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0RGVjbGFyYXRpb24oKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJbm9kZS5nZXRBcnJheSgpLmFjY2VwdCh0aGlzKTsKLQkJaWYgKCFub2RlLmdldEluZGV4ZXMoKS5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgaW5kZXhlcyA9IG5vZGUuZ2V0SW5kZXhlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnWycpOwotCQkJCSgoUFRFeHByZXNzaW9uKSBpbmRleGVzLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJ10nKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUNyZWF0aW9uIG5vZGUpIHsKLSAgICAgICAgU3RyaW5nIGFycmF5VHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotICAgICAgICBpbnQgb2IgPSBhcnJheVR5cGUuaW5kZXhPZignWycpOwotICAgICAgICBTdHJpbmcgdHlwZSA9IGhhbmRsZVF1YWxpZmllZE5hbWUoYXJyYXlUeXBlLnN1YnN0cmluZygwLCBvYikpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCJuZXcgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmZmVyLmFwcGVuZCh0eXBlKTsKLSAgICAgICAgaW50IHJlYWxkaW1zID0gMDsKLSAgICAgICAgd2hpbGUgKG9iICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgcmVhbGRpbXMrKzsKLSAgICAgICAgICAgICAgICBvYiA9IGFycmF5VHlwZS5pbmRleE9mKCdbJyxvYisxKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0IGRpbXMgPSBub2RlLmdldERpbWVuc2lvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnWycpOwotICAgICAgICAgICAgICAgICgoUFRFeHByZXNzaW9uKSBkaW1zLmdldChpKSkuYWNjZXB0KHRoaXMpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJ10nKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpPWRpbXMuc2l6ZSgpOyBpIDwgcmVhbGRpbXM7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChub2RlLmdldEluaXRpYWxpemVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAoKFBURXhwcmVzc2lvbikgbm9kZS5nZXRJbml0aWFsaXplcigpKS5hY2NlcHQodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXIpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZCgneycpOwotCQlMaXN0IGV4cCA9IG5vZGUuZ2V0RXhwcmVzc2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHAuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChpICE9IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJKChQVEV4cHJlc3Npb24pIGV4cC5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCd9Jyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmlzQm9vbGVhblZhbHVlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlidWZmZXIuYXBwZW5kKGhhbmRsZVF1YWxpZmllZE5hbWUobm9kZS5nZXRUeXBlKCkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiKSAiKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKCJuZXcgIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChoYW5kbGVRdWFsaWZpZWROYW1lKG5vZGUuZ2V0VHlwZSgpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJTGlzdCBhcmdzID0gbm9kZS5nZXRBcmd1bWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCSgoUFRFeHByZXNzaW9uKSBhcmdzLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCW5vZGUuZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMpOwotCQlidWZmZXIuYXBwZW5kKCIgPyAiKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLmdldFRydWUoKS5hY2NlcHQodGhpcyk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiA6ICIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUuZ2V0RmFsc2UoKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJbm9kZS5nZXRSZWNlaXZlcigpLmFjY2VwdCh0aGlzKTsKLQkJYnVmZmVyLmFwcGVuZCgnLicpOwotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0RmllbGQoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlub2RlLmdldExlZnRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOwotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCVN0cmluZyBvcGVyID0gbm9kZS5nZXRPcGVyYXRvcigpLmdldE9wZXJhdG9yKCk7Ci0JCWJ1ZmZlci5hcHBlbmQob3Blcik7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJbm9kZS5nZXRSaWdodE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7Ci0JCUxpc3QgZXh0ID0gbm9kZS5nZXRFeHRlbmRlZE9wZXJhbmRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0LnNpemUoKTsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlidWZmZXIuYXBwZW5kKG9wZXIpOwotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJKChQVEV4cHJlc3Npb24pIGV4dC5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEluc3RhbmNlb2Ygbm9kZSkgewotCQlub2RlLmdldE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiBpbnN0YW5jZW9mICIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoaGFuZGxlUXVhbGlmaWVkTmFtZShub2RlLmdldFR5cGUoKSkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcy5OYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXJfSW52YWxpZEV4cHJlc3Npb24sIG5ldyBPYmplY3RbXXtub2RlLmdldE1lc3NhZ2UoKX0pKTsgCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCWlmIChub2RlLmdldFJlY2VpdmVyKCkgIT0gbnVsbCkgewotCQkJbm9kZS5nZXRSZWNlaXZlcigpLmFjY2VwdCh0aGlzKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJy4nKTsKLQkJfQotCQkKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldE5hbWUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJTGlzdCBhcmdzID0gbm9kZS5nZXRBcmd1bWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCSgoUFRFeHByZXNzaW9uKSBhcmdzLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTmFtZSBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoaGFuZGxlUXVhbGlmaWVkTmFtZShub2RlLmdldE5hbWUoKSkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVsbExpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIm51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE51bWJlckxpdGVyYWwgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0VG9rZW4oKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRQcmVmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldE9wZXJhdG9yKCkuZ2V0T3BlcmF0b3IoKSk7Ci0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFRoaXNMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUVGhpc0xpdGVyYWwgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKCJ0aGlzIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUVHlwZUxpdGVyYWwgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKGhhbmRsZVF1YWxpZmllZE5hbWUobm9kZS5nZXRUeXBlKCkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiLmNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBlbmFibGVzIG9uZSB0byBvdmVyaWRlIHRoZSBoYW5kbGluZyBvZiBxdWFsaWZpZWQgbmFtZXMuCi0JICogVGhlIGRlZmF1bHQgb3BlcmF0aW9uIGlzIHRvIGRvIG5vdGhpbmcuCi0JICogCi0JICogT3ZlcnJpZGVycyBtYXkgY2hvb3NlIHRvIHVzZSBzaG9ydCBuYW1lcywgcmVseWluZyBvbiBpbXBvcnQgc3RhdGVtZW50IGhhbmRsaW5nLgotCSAqIAotCSAqIEBwYXJhbSBxTmFtZSAgCi0JICogQHJldHVybiBOYW1lIHRvIHVzZSBmb3IgdGhlIGZsYXR0ZW5lZCByZXN1bHQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGhhbmRsZVF1YWxpZmllZE5hbWUoU3RyaW5nIHFOYW1lKSB7Ci0JCXJldHVybiBxTmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOWQ4YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UFQgQW5vbnltb3VzIENsYXNzIERlY2xhcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwjZ2V0RGVjbGFyYXRpb24gPGVtPkRlY2xhcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwjZ2V0SW1wb3J0cyA8ZW0+SW1wb3J0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVjbGFyYXRpb24oKSA8ZW0+RGVjbGFyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlY2xhcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUNMQVJBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWNsYXJhdGlvbigpIDxlbT5EZWNsYXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVjbGFyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjbGFyYXRpb24gPSBERUNMQVJBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcG9ydHMoKSA8ZW0+SW1wb3J0czwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBvcnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW1wb3J0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gZGVjbGFyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVjbGFyYXRpb24oU3RyaW5nIG5ld0RlY2xhcmF0aW9uKSB7Ci0JCVN0cmluZyBvbGREZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCQlkZWNsYXJhdGlvbiA9IG5ld0RlY2xhcmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0RFQ0xBUkFUSU9OLCBvbGREZWNsYXJhdGlvbiwgZGVjbGFyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW1wb3J0cygpIHsKLQkJaWYgKGltcG9ydHMgPT0gbnVsbCkgewotCQkJaW1wb3J0cyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fSU1QT1JUUyk7Ci0JCX0KLQkJcmV0dXJuIGltcG9ydHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0RFQ0xBUkFUSU9OOgotCQkJCXJldHVybiBnZXREZWNsYXJhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0lNUE9SVFM6Ci0JCQkJcmV0dXJuIGdldEltcG9ydHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fREVDTEFSQVRJT046Ci0JCQkJc2V0RGVjbGFyYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0lNUE9SVFM6Ci0JCQkJZ2V0SW1wb3J0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW1wb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19ERUNMQVJBVElPTjoKLQkJCQlzZXREZWNsYXJhdGlvbihERUNMQVJBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0lNUE9SVFM6Ci0JCQkJZ2V0SW1wb3J0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fREVDTEFSQVRJT046Ci0JCQkJcmV0dXJuIERFQ0xBUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZWNsYXJhdGlvbiAhPSBudWxsIDogIURFQ0xBUkFUSU9OX0VERUZBVUxULmVxdWFscyhkZWNsYXJhdGlvbik7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fSU1QT1JUUzoKLQkJCQlyZXR1cm4gaW1wb3J0cyAhPSBudWxsICYmICFpbXBvcnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlY2xhcmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWNsYXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW1wb3J0czogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW1wb3J0cyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlBY2Nlc3NJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlBY2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YjBjNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5QWNjZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnJheSBBY2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUFjY2Vzc0ltcGwjZ2V0QXJyYXkgPGVtPkFycmF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlBY2Nlc3NJbXBsI2dldEluZGV4ZXMgPGVtPkluZGV4ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEFycmF5QWNjZXNzSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEFycmF5QWNjZXNzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcnJheSgpIDxlbT5BcnJheTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXJyYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gYXJyYXkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5kZXhlcygpIDxlbT5JbmRleGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluZGV4ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmRleGVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEFycmF5QWNjZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEFycmF5QWNjZXNzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRBcnJheSgpIHsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFycmF5KFBURXhwcmVzc2lvbiBuZXdBcnJheSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkQXJyYXkgPSBhcnJheTsKLQkJYXJyYXkgPSBuZXdBcnJheTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWSwgb2xkQXJyYXksIG5ld0FycmF5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcnJheShQVEV4cHJlc3Npb24gbmV3QXJyYXkpIHsKLQkJaWYgKG5ld0FycmF5ICE9IGFycmF5KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhcnJheSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhcnJheSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FycmF5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FycmF5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBcnJheShuZXdBcnJheSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZLCBuZXdBcnJheSwgbmV3QXJyYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW5kZXhlcygpIHsKLQkJaWYgKGluZGV4ZXMgPT0gbnVsbCkgewotCQkJaW5kZXhlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQVEV4cHJlc3Npb24uY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUyk7Ci0JCX0KLQkJcmV0dXJuIGluZGV4ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRBcnJheShudWxsLCBtc2dzKTsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbmRleGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWToKLQkJCQlyZXR1cm4gZ2V0QXJyYXkoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTOgotCQkJCXJldHVybiBnZXRJbmRleGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZOgotCQkJCXNldEFycmF5KChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTOgotCQkJCWdldEluZGV4ZXMoKS5jbGVhcigpOwotCQkJCWdldEluZGV4ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVk6Ci0JCQkJc2V0QXJyYXkoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUzoKLQkJCQlnZXRJbmRleGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWToKLQkJCQlyZXR1cm4gYXJyYXkgIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTOgotCQkJCXJldHVybiBpbmRleGVzICE9IG51bGwgJiYgIWluZGV4ZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEFycmF5KCkpOwotCQkJaWYgKGluZGV4ZXMgIT0gbnVsbCkKLQkJCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBpbmRleGVzKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi0KLX0gLy9BcnJheUFjY2Vzc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUNyZWF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5Q3JlYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYThiM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5Q3JlYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFycmF5IENyZWF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlDcmVhdGlvbkltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5Q3JlYXRpb25JbXBsI2dldERpbWVuc2lvbnMgPGVtPkRpbWVuc2lvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUNyZWF0aW9uSW1wbCNnZXRJbml0aWFsaXplciA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEFycmF5Q3JlYXRpb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQXJyYXlDcmVhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaW1lbnNpb25zKCkgPGVtPkRpbWVuc2lvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGltZW5zaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpbWVuc2lvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbGl6ZXIoKSA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxpemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRBcnJheUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEFycmF5Q3JlYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQXJyYXlDcmVhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREaW1lbnNpb25zKCkgewotCQlpZiAoZGltZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlkaW1lbnNpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBURXhwcmVzc2lvbi5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlMpOwotCQl9Ci0JCXJldHVybiBkaW1lbnNpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEFycmF5SW5pdGlhbGl6ZXIgZ2V0SW5pdGlhbGl6ZXIoKSB7Ci0JCXJldHVybiBpbml0aWFsaXplcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbml0aWFsaXplcihQVEFycmF5SW5pdGlhbGl6ZXIgbmV3SW5pdGlhbGl6ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRBcnJheUluaXRpYWxpemVyIG9sZEluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXI7Ci0JCWluaXRpYWxpemVyID0gbmV3SW5pdGlhbGl6ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUiwgb2xkSW5pdGlhbGl6ZXIsIG5ld0luaXRpYWxpemVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXplcihQVEFycmF5SW5pdGlhbGl6ZXIgbmV3SW5pdGlhbGl6ZXIpIHsKLQkJaWYgKG5ld0luaXRpYWxpemVyICE9IGluaXRpYWxpemVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbml0aWFsaXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbml0aWFsaXplcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW5pdGlhbGl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5pdGlhbGl6ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW5pdGlhbGl6ZXIobmV3SW5pdGlhbGl6ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSLCBuZXdJbml0aWFsaXplciwgbmV3SW5pdGlhbGl6ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpbWVuc2lvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRJbml0aWFsaXplcihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlM6Ci0JCQkJcmV0dXJuIGdldERpbWVuc2lvbnMoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSOgotCQkJCXJldHVybiBnZXRJbml0aWFsaXplcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TOgotCQkJCWdldERpbWVuc2lvbnMoKS5jbGVhcigpOwotCQkJCWdldERpbWVuc2lvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSOgotCQkJCXNldEluaXRpYWxpemVyKChQVEFycmF5SW5pdGlhbGl6ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUzoKLQkJCQlnZXREaW1lbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUjoKLQkJCQlzZXRJbml0aWFsaXplcigoUFRBcnJheUluaXRpYWxpemVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUzoKLQkJCQlyZXR1cm4gZGltZW5zaW9ucyAhPSBudWxsICYmICFkaW1lbnNpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSOgotCQkJCXJldHVybiBpbml0aWFsaXplciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBkaW1lbnNpb25zKTsKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEluaXRpYWxpemVyKCkpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQkKLX0gLy9BcnJheUNyZWF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5SW5pdGlhbGl6ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlJbml0aWFsaXplckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlYmE5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlJbml0aWFsaXplckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnJheSBJbml0aWFsaXplcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5SW5pdGlhbGl6ZXJJbXBsI2dldEV4cHJlc3Npb25zIDxlbT5FeHByZXNzaW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQXJyYXlJbml0aWFsaXplckltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRBcnJheUluaXRpYWxpemVyIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHByZXNzaW9ucygpIDxlbT5FeHByZXNzaW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV4cHJlc3Npb25zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEFycmF5SW5pdGlhbGl6ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQXJyYXlJbml0aWFsaXplcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHByZXNzaW9ucygpIHsKLQkJaWYgKGV4cHJlc3Npb25zID09IG51bGwpIHsKLQkJCWV4cHJlc3Npb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBURXhwcmVzc2lvbi5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TKTsKLQkJfQotCQlyZXR1cm4gZXhwcmVzc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXhwcmVzc2lvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlM6Ci0JCQkJcmV0dXJuIGdldEV4cHJlc3Npb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlM6Ci0JCQkJZ2V0RXhwcmVzc2lvbnMoKS5jbGVhcigpOwotCQkJCWdldEV4cHJlc3Npb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlM6Ci0JCQkJZ2V0RXhwcmVzc2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlM6Ci0JCQkJcmV0dXJuIGV4cHJlc3Npb25zICE9IG51bGwgJiYgIWV4cHJlc3Npb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBleHByZXNzaW9ucyk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vQXJyYXlJbml0aWFsaXplckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRCb29sZWFuTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRCb29sZWFuTGl0ZXJhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmM2RjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQm9vbGVhbkxpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJvb2xlYW4gTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEJvb2xlYW5MaXRlcmFsSW1wbCNpc0Jvb2xlYW5WYWx1ZSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQm9vbGVhbkxpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQm9vbGVhbkxpdGVyYWwgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Jvb2xlYW5WYWx1ZSgpIDxlbT5Cb29sZWFuIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Jvb2xlYW5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEJPT0xFQU5fVkFMVUVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQm9vbGVhblZhbHVlKCkgPGVtPkJvb2xlYW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQm9vbGVhblZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBCT09MRUFOX1ZBTFVFX0VGTEFHID0gMSA8PCA4OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQm9vbGVhbkxpdGVyYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQm9vbGVhbkxpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Jvb2xlYW5WYWx1ZSgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBCT09MRUFOX1ZBTFVFX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWx1ZShib29sZWFuIG5ld0Jvb2xlYW5WYWx1ZSkgewotCQlib29sZWFuIG9sZEJvb2xlYW5WYWx1ZSA9IChlRmxhZ3MgJiBCT09MRUFOX1ZBTFVFX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3Qm9vbGVhblZhbHVlKSBlRmxhZ3MgfD0gQk9PTEVBTl9WQUxVRV9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkJPT0xFQU5fVkFMVUVfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0JPT0xFQU5fTElURVJBTF9fQk9PTEVBTl9WQUxVRSwgb2xkQm9vbGVhblZhbHVlLCBuZXdCb29sZWFuVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0JPT0xFQU5fTElURVJBTF9fQk9PTEVBTl9WQUxVRToKLQkJCQlyZXR1cm4gaXNCb29sZWFuVmFsdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUU6Ci0JCQkJc2V0Qm9vbGVhblZhbHVlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0JPT0xFQU5fTElURVJBTF9fQk9PTEVBTl9WQUxVRToKLQkJCQlzZXRCb29sZWFuVmFsdWUoQk9PTEVBTl9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0JPT0xFQU5fTElURVJBTF9fQk9PTEVBTl9WQUxVRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBCT09MRUFOX1ZBTFVFX0VGTEFHKSAhPSAwKSAhPSBCT09MRUFOX1ZBTFVFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCi19IC8vQm9vbGVhbkxpdGVyYWxJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2FzdEV4cHJlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2FzdEV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MTM0YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENhc3RFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2FzdEV4cHJlc3Npb25JbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDYXN0RXhwcmVzc2lvbkltcGwjZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQ2FzdEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQ2FzdEV4cHJlc3Npb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwcmVzc2lvbigpIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQ2FzdEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQ2FzdEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRFeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLQkJZXhwcmVzc2lvbiA9IG5ld0V4cHJlc3Npb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgb2xkRXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbikgewotCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBleHByZXNzaW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChleHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4cHJlc3Npb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RXhwcmVzc2lvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeHByZXNzaW9uKG5ld0V4cHJlc3Npb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBuZXdFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJCXJldHVybiBiYXNpY1NldEV4cHJlc3Npb24obnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGdldEV4cHJlc3Npb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBleHByZXNzaW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vQ2FzdEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENoYXJhY3RlckxpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYTFkMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENoYXJhY3RlckxpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcmFjdGVyIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCNnZXRDaGFyVmFsdWUgPGVtPkNoYXIgVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVENoYXJhY3RlckxpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQ2hhcmFjdGVyTGl0ZXJhbCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzY2FwZWRWYWx1ZSgpIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRURfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXNjYXBlZFZhbHVlKCkgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlc2NhcGVkVmFsdWUgPSBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYXJWYWx1ZSgpIDxlbT5DaGFyIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFyVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBDSEFSX1ZBTFVFX0VERUZBVUxUID0gJ1x1MDAwMCc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFyVmFsdWUoKSA8ZW0+Q2hhciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhclZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgY2hhciBjaGFyVmFsdWUgPSBDSEFSX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFc2NhcGVkVmFsdWUoKSB7Ci0JCXJldHVybiBlc2NhcGVkVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXNjYXBlZFZhbHVlKFN0cmluZyBuZXdFc2NhcGVkVmFsdWUpIHsKLQkJY2hhclZhbHVlU2V0ID0gZmFsc2U7Ci0JCXNldENoYXJWYWx1ZUdlbihDSEFSX1ZBTFVFX0VERUZBVUxUKTsKLQkJc2V0RXNjYXBlZFZhbHVlR2VuKG5ld0VzY2FwZWRWYWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzY2FwZWRWYWx1ZUdlbihTdHJpbmcgbmV3RXNjYXBlZFZhbHVlKSB7Ci0JCVN0cmluZyBvbGRFc2NhcGVkVmFsdWUgPSBlc2NhcGVkVmFsdWU7Ci0JCWVzY2FwZWRWYWx1ZSA9IG5ld0VzY2FwZWRWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUUsIG9sZEVzY2FwZWRWYWx1ZSwgZXNjYXBlZFZhbHVlKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoYXJWYWx1ZVNldDsKLQkKLQlwdWJsaWMgY2hhciBnZXRDaGFyVmFsdWUoKSB7Ci0JCWlmICghY2hhclZhbHVlU2V0ICYmIGVzY2FwZWRWYWx1ZSAhPSBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUKSB7Ci0JCQlTdHJpbmcgcyA9IGdldEVzY2FwZWRWYWx1ZSgpOwotCQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCQlpZiAobGVuIDwgMiB8fCBzLmNoYXJBdCgwKSAhPSAnXCcnIHx8IHMuY2hhckF0KGxlbi0xKSAhPSAnXCcnICkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWNoYXIgYyA9IHMuY2hhckF0KDEpOwotCQkJaWYgKGMgPT0gJ1wnJykgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChjID09ICdcXCcpIHsKLQkJCQlpZiAobGVuID09IDQpIHsKLQkJCQkJc2V0Q2hhclZhbHVlR2VuKGdldENoYXJFc2NhcGVkKHMuY2hhckF0KDIpKSk7Ci0JCQkJfSBlbHNlIGlmIChsZW4gPT0gOCkgewotCQkJCQkvL2hhbmRsZSB0aGUgY2FzZSBvZiB1bmljb2RlLgotCQkJCQlpbnQgY3VycmVudFBvc2l0aW9uID0gMjsKLQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKLQkJCQkJaWYgKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSA9PSAndScpIHsKLQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSkpID4gMTUKLQkJCQkJCQkJfHwgYzEgPCAwCi0JCQkJCQkJCXx8IChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspKSkgPiAxNQotCQkJCQkJCQl8fCBjMiA8IDAKLQkJCQkJCQkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykpKSA+IDE1Ci0JCQkJCQkJCXx8IGMzIDwgMAotCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSkpID4gMTUKLQkJCQkJCQkJfHwgYzQgPCAwKXsKLQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGNoYXJhY3RlciBsaXRlcmFsIik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzZXRDaGFyVmFsdWVHZW4oKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGNoYXJhY3RlciBsaXRlcmFsIik7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXNldENoYXJWYWx1ZUdlbihjKTsKLQkJCQotCQkJY2hhclZhbHVlU2V0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZ2V0Q2hhclZhbHVlR2VuKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2hhciBnZXRDaGFyRXNjYXBlZChjaGFyIG5leHRDaGFyKSB7Ci0JCXN3aXRjaChuZXh0Q2hhcikgewotCQkJY2FzZSAnYicgOgotCQkJCXJldHVybiAnXGInOwotCQkJY2FzZSAndCcgOgotCQkJCXJldHVybiAnXHQnOwotCQkJY2FzZSAnbicgOgotCQkJCXJldHVybiAnXG4nOwotCQkJY2FzZSAnZicgOgotCQkJCXJldHVybiAnXGYnOwotCQkJY2FzZSAncicgOgotCQkJCXJldHVybiAnXHInOwotCQkJY2FzZSAnXCInOgotCQkJCXJldHVybiAnXCInOwotCQkJY2FzZSAnXCcnOgotCQkJCXJldHVybiAnXCcnOwotCQkJY2FzZSAnXFwnOgotCQkJCXJldHVybiAnXFwnOwotCQkJY2FzZSAnMCcgOgotCQkJCXJldHVybiAnXDAnOwotCQkJY2FzZSAnMScgOgotCQkJCXJldHVybiAnXDEnOwotCQkJY2FzZSAnMicgOgotCQkJCXJldHVybiAnXDInOwotCQkJY2FzZSAnMycgOgotCQkJCXJldHVybiAnXDMnOwotCQkJY2FzZSAnNCcgOgotCQkJCXJldHVybiAnXDQnOwotCQkJY2FzZSAnNScgOgotCQkJCXJldHVybiAnXDUnOwotCQkJY2FzZSAnNicgOgotCQkJCXJldHVybiAnXDYnOwotCQkJY2FzZSAnNycgOgotCQkJCXJldHVybiAnXDcnOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGNoYXJhY3RlciIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjaGFyIGdldENoYXJWYWx1ZUdlbigpIHsKLQkJcmV0dXJuIGNoYXJWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFyVmFsdWUoY2hhciBuZXdDaGFyVmFsdWUpIHsJCQotCQljaGFyVmFsdWVTZXQgPSB0cnVlOwotCQlzZXRDaGFyVmFsdWVHZW4obmV3Q2hhclZhbHVlKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcig4KTsKLQkJYi5hcHBlbmQoJ1wnJyk7IC8vIG9wZW5pbmcgZGVsaW1pdGVyCi0JCWFwcGVuZENoYXJhY3RlcihuZXdDaGFyVmFsdWUsIGIpOwotCQliLmFwcGVuZCgnXCcnKTsgLy8gY2xvc2luZyBkZWxpbWl0ZXIKLQkJc2V0RXNjYXBlZFZhbHVlR2VuKGIudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRDaGFyYWN0ZXIoY2hhciBjaGFyYWN0ZXIsIFN0cmluZ0J1ZmZlciBiKSB7Ci0JCXN3aXRjaChjaGFyYWN0ZXIpIHsKLQkJCWNhc2UgJ1xiJyA6Ci0JCQkJYi5hcHBlbmQoIlxcYiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcdCcgOgotCQkJCWIuYXBwZW5kKCJcXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXG4nIDoKLQkJCQliLmFwcGVuZCgiXFxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xmJyA6Ci0JCQkJYi5hcHBlbmQoIlxcZiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdccicgOgotCQkJCWIuYXBwZW5kKCJcXHIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCInOgotCQkJCWIuYXBwZW5kKCJcXFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wnJzoKLQkJCQliLmFwcGVuZCgiXFxcJyIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcXCc6Ci0JCQkJYi5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDAnIDoKLQkJCQliLmFwcGVuZCgiXFwwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wxJyA6Ci0JCQkJYi5hcHBlbmQoIlxcMSIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcMicgOgotCQkJCWIuYXBwZW5kKCJcXDIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDMnIDoKLQkJCQliLmFwcGVuZCgiXFwzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1w0JyA6Ci0JCQkJYi5hcHBlbmQoIlxcNCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcNScgOgotCQkJCWIuYXBwZW5kKCJcXDUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDYnIDoKLQkJCQliLmFwcGVuZCgiXFw2Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1w3JyA6Ci0JCQkJYi5hcHBlbmQoIlxcNyIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7CQkJCi0JCQlkZWZhdWx0OgotCQkJCWIuYXBwZW5kKGNoYXJhY3Rlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFyVmFsdWVHZW4oY2hhciBuZXdDaGFyVmFsdWUpIHsKLQkJY2hhciBvbGRDaGFyVmFsdWUgPSBjaGFyVmFsdWU7Ci0JCWNoYXJWYWx1ZSA9IG5ld0NoYXJWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUUsIG9sZENoYXJWYWx1ZSwgY2hhclZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RXNjYXBlZFZhbHVlKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19DSEFSX1ZBTFVFOgotCQkJCXJldHVybiBuZXcgQ2hhcmFjdGVyKGdldENoYXJWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXNldEVzY2FwZWRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19DSEFSX1ZBTFVFOgotCQkJCXNldENoYXJWYWx1ZSgoKENoYXJhY3RlciluZXdWYWx1ZSkuY2hhclZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXNldEVzY2FwZWRWYWx1ZShFU0NBUEVEX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19DSEFSX1ZBTFVFOgotCQkJCXNldENoYXJWYWx1ZShDSEFSX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJcmV0dXJuIEVTQ0FQRURfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGVzY2FwZWRWYWx1ZSAhPSBudWxsIDogIUVTQ0FQRURfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGVzY2FwZWRWYWx1ZSk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19DSEFSX1ZBTFVFOgotCQkJCXJldHVybiBjaGFyVmFsdWUgIT0gQ0hBUl9WQUxVRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLX0gLy9DaGFyYWN0ZXJMaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkN2Q0ZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNsYXNzIEluc3RhbmNlIENyZWF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCNnZXRBcmd1bWVudHMgPGVtPkFyZ3VtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcmd1bWVudHMoKSA8ZW0+QXJndW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFyZ3VtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFyZ3VtZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFyZ3VtZW50cygpIHsKLQkJaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7Ci0JCQlhcmd1bWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUFRFeHByZXNzaW9uLmNsYXNzLCB0aGlzLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gYXJndW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBcmd1bWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTOgotCQkJCXJldHVybiBnZXRBcmd1bWVudHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTOgotCQkJCWdldEFyZ3VtZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXJndW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlnZXRBcmd1bWVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTOgotCQkJCXJldHVybiBhcmd1bWVudHMgIT0gbnVsbCAmJiAhYXJndW1lbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgYXJndW1lbnRzKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLX0gLy9DbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkzMzE4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uZGl0aW9uYWwgRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwjZ2V0Q29uZGl0aW9uIDxlbT5Db25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsI2dldFRydWUgPGVtPlRydWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsI2dldEZhbHNlIDxlbT5GYWxzZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZGl0aW9uKCkgPGVtPkNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGNvbmRpdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcnVlKCkgPGVtPlRydWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRydWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gdHJ1ZV8gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmFsc2UoKSA8ZW0+RmFsc2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZhbHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGZhbHNlXyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRDb25kaXRpb24oKSB7Ci0JCXJldHVybiBjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29uZGl0aW9uKFBURXhwcmVzc2lvbiBuZXdDb25kaXRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZENvbmRpdGlvbiA9IGNvbmRpdGlvbjsKLQkJY29uZGl0aW9uID0gbmV3Q29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT04sIG9sZENvbmRpdGlvbiwgbmV3Q29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oUFRFeHByZXNzaW9uIG5ld0NvbmRpdGlvbikgewotCQlpZiAobmV3Q29uZGl0aW9uICE9IGNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbmRpdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbmRpdGlvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb25kaXRpb24obmV3Q29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTiwgbmV3Q29uZGl0aW9uLCBuZXdDb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldFRydWUoKSB7Ci0JCXJldHVybiB0cnVlXzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUcnVlKFBURXhwcmVzc2lvbiBuZXdUcnVlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRUcnVlID0gdHJ1ZV87Ci0JCXRydWVfID0gbmV3VHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRSwgb2xkVHJ1ZSwgbmV3VHJ1ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJ1ZShQVEV4cHJlc3Npb24gbmV3VHJ1ZSkgewotCQlpZiAobmV3VHJ1ZSAhPSB0cnVlXykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodHJ1ZV8gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdHJ1ZV8pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUcnVlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RydWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRydWUobmV3VHJ1ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFLCBuZXdUcnVlLCBuZXdUcnVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRGYWxzZSgpIHsKLQkJcmV0dXJuIGZhbHNlXzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRGYWxzZShQVEV4cHJlc3Npb24gbmV3RmFsc2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZEZhbHNlID0gZmFsc2VfOwotCQlmYWxzZV8gPSBuZXdGYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0UsIG9sZEZhbHNlLCBuZXdGYWxzZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmFsc2UoUFRFeHByZXNzaW9uIG5ld0ZhbHNlKSB7Ci0JCWlmIChuZXdGYWxzZSAhPSBmYWxzZV8pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGZhbHNlXyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClmYWxzZV8pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RmFsc2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RmFsc2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRGYWxzZShuZXdGYWxzZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRSwgbmV3RmFsc2UsIG5ld0ZhbHNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT046Ci0JCQkJCXJldHVybiBiYXNpY1NldENvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUU6Ci0JCQkJCXJldHVybiBiYXNpY1NldFRydWUobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RmFsc2UobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUU6Ci0JCQkJcmV0dXJuIGdldFRydWUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0U6Ci0JCQkJcmV0dXJuIGdldEZhbHNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT046Ci0JCQkJc2V0Q29uZGl0aW9uKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRToKLQkJCQlzZXRUcnVlKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0U6Ci0JCQkJc2V0RmFsc2UoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OOgotCQkJCXNldENvbmRpdGlvbigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRToKLQkJCQlzZXRUcnVlKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRToKLQkJCQlzZXRGYWxzZSgoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT046Ci0JCQkJcmV0dXJuIGNvbmRpdGlvbiAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFOgotCQkJCXJldHVybiB0cnVlXyAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRToKLQkJCQlyZXR1cm4gZmFsc2VfICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0Q29uZGl0aW9uKCkpOwotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0VHJ1ZSgpKTsKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEZhbHNlKCkpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQkKLQotfSAvL0NvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjEyM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBURXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBURXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uRXhwcmVzc2lvbiNhY2NlcHQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFjY2VwdChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl0cnkgewotCQkJY2hpbGRBY2NlcHQwKHZpc2l0b3IpOwotCQl9IGNhdGNoIChQYXJzZVZpc2l0b3IuU3RvcFZpc2l0aW5nIGUpIHsKLQkJCS8vIERvIG5vdGhpbmcsIHRoaXMgaXMgYSBub3JtYWwgd2F5IHRvIGp1c3Qgc3RvcCB2aXNpdGluZy4KLQkJfQotCX0KLQotCS8qKgotCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3Igb24gYSB0eXBlLXNwZWNpZmljIHZpc2l0IG9mIHRoZSBjdXJyZW50IG5vZGUuCi0JICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhbGwgY29uY3JldGUgRXhwcmVzc2lvbiBub2RlIHR5cGVzLgotCSAqIDxwPgotCSAqIEdlbmVyYWwgdGVtcGxhdGUgZm9yIGltcGxlbWVudGF0aW9uIG9uIGVhY2ggY29uY3JldGUgQVNUTm9kZSBjbGFzczoKLQkgKiA8cHJlPgotCSAqIDxjb2RlPgotCSAqIGJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JICogaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkgKiAgICAvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JICogICAgYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UHJvcGVydHkxKCkpOwotCSAqICAgIGFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIHJhd0xpc3RQcm9wZXJ0eSk7Ci0JICogICAgYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UHJvcGVydHkyKCkpOwotCSAqIH0KLQkgKiB2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCSAqIDwvY29kZT4KLQkgKiA8L3ByZT4KLQkgKiBOb3RlIHRoYXQgdGhlIGNhbGxlciAoPGNvZGU+YWNjZXB0PC9jb2RlPikgdGFrZSBjYXJlcyBvZiBpbnZva2luZwotCSAqIDxjb2RlPnZpc2l0b3IucHJlVmlzaXQodGhpcyk8L2NvZGU+IGFuZCA8Y29kZT52aXNpdG9yLnBvc3RWaXNpdCh0aGlzKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpOwotCi0JLyoqCi0JICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvciBvbiBhIHZpc2l0IG9mIHRoZSBjdXJyZW50IG5vZGUuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZgotCSAqIDxjb2RlPmFjY2VwdDA8L2NvZGU+IHRvIHRyYXZlcnNlIG9wdGlvbmFsIHByb3BlcnRpZXMuIEVxdWl2YWxlbnQKLQkgKiB0byA8Y29kZT5jaGlsZC5hY2NlcHQodmlzaXRvcik8L2NvZGU+IGlmIDxjb2RlPmNoaWxkPC9jb2RlPgotCSAqIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3Igb2JqZWN0Ci0JICogQHBhcmFtIGNoaWxkIHRoZSBjaGlsZCBFeHByZXNzaW9uIG5vZGUgdG8gZGlzcGF0Y2ggdG9vLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgIGlmIG5vbmUuIEl0IGFjdHVhbGx5IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgUFRFeHByZXNzaW9uSW1wbCwgYnV0IAotCSAqICAgIGl0IHdvdWxkIGJlIHRvbyBkaWZmaWN1bHQgdG8gcHV0IHRoZSBjYXN0IGluIGVhY2ggY2FsbCB0byBhY2NlcHRDaGlsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhY2NlcHRDaGlsZChQYXJzZVZpc2l0b3IgdmlzaXRvciwgUFRFeHByZXNzaW9uIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJKChQVEV4cHJlc3Npb25JbXBsKSBjaGlsZCkuY2hpbGRBY2NlcHQwKHZpc2l0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgT05MWSBieSBQVEV4cHJlc3Npb25JbXBsIGZvciB0aGUgY2hpbGQgdG8gYWNjZXB0IHRoZSB2aXNpdG9yLCBidXQKLQkgKiBpdCBkb2Vzbid0IGNhdGNoIFN0b3BWaXNpdGluZy4KLQkgKiBAcGFyYW0gdmlzaXRvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hpbGRBY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWlmICh2aXNpdG9yID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQkvLyBiZWdpbiB3aXRoIHRoZSBnZW5lcmljIHByZS12aXNpdAotCQl2aXNpdG9yLnByZVZpc2l0KHRoaXMpOwotCQkvLyBkeW5hbWljIGRpc3BhdGNoIHRvIGludGVybmFsIG1ldGhvZCBmb3IgdHlwZS1zcGVjaWZpYyB2aXNpdC9lbmRWaXNpdAotCQlhY2NlcHQwKHZpc2l0b3IpOwotCQkvLyBlbmQgd2l0aCB0aGUgZ2VuZXJpYyBwb3N0LXZpc2l0Ci0JCXZpc2l0b3IucG9zdFZpc2l0KHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBBY2NlcHRzIHRoZSBnaXZlbiB2aXNpdG9yIG9uIGEgdmlzaXQgb2YgdGhlIGdpdmVuIGxpdmUgbGlzdCBvZgotCSAqIGNoaWxkIG5vZGVzLiAKLQkgKiBAcGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciBvYmplY3QKLQkgKiBAcGFyYW0gY2hpbGRyZW4gdGhlIGNoaWxkIEV4cHJlc3Npb24gbm9kZXMgdG8gZGlzcGF0Y2ggdG8sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWNjZXB0Q2hpbGRyZW4oUGFyc2VWaXNpdG9yIHZpc2l0b3IsIExpc3QgY2hpbGRyZW4pIHsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCAoUFRFeHByZXNzaW9uKSBjaGlsZHJlbi5nZXQoaSkpOwotCQkJfQotCQl9IAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkvLyBhbGxvY2F0ZSBhIGJ1ZmZlciB0aGF0IGlzIGxhcmdlIGVub3VnaCB0byBob2xkIGFuIGF2ZXJhZ2UgY29tcGlsYXRpb24gdW5pdAotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcig2MDAwKTsKLQkJaW50IHAgPSBidWZmZXIubGVuZ3RoKCk7Ci0JCXRyeSB7Ci0JCQlhcHBlbmREZWJ1Z1N0cmluZyhidWZmZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNpbmNlIGRlYnVnZ2VyIHNvbWV0aW1lcyBjYWxsIHRvU3RyaW5nIG1ldGhvZHMsIHByb2JsZW1zIGNhbiBlYXNpbHkgaGFwcGVuIHdoZW4KLQkJCS8vIHRvU3RyaW5nIGlzIGNhbGxlZCBvbiBhbiBpbnN0YW5jZSB0aGF0IGlzIGJlaW5nIGluaXRpYWxpemVkCi0JCQlidWZmZXIuc2V0TGVuZ3RoKHApOwotCQkJYnVmZmVyLmFwcGVuZCgiISIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHN0YW5kYXJkVG9TdHJpbmcoKSk7Ci0JCX0KLQkJLy8gY29udmVydCB0byBhIHN0cmluZywgYnV0IGxvc2UgdGhlIGV4dHJhIHNwYWNlIGluIHRoZSBzdHJpbmcgYnVmZmVyIGJ5IGNvcHlpbmcKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHN0YW5kYXJkVG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmREZWJ1Z1N0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCS8vIHByaW50IHRoZSBzdWJ0cmVlIGJ5IGRlZmF1bHQKLQkJYXBwZW5kUHJpbnRTdHJpbmcoYnVmZmVyKTsKLQl9Ci0JCi0JLyoKLQkgKiBBcHBlbmRzIGEgc3RhbmRhcmQgSmF2YSBzb3VyY2UgY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHN1YnRyZWUgdG8gdGhlIGdpdmVuCi0JICogc3RyaW5nIGJ1ZmZlci4KLQkgKiAKLQkgKiBAcGFyYW0gYnVmZmVyIHRoZSBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0bwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFwcGVuZFByaW50U3RyaW5nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyIHByaW50ZXIgPSBuZXcgTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyKCk7Ci0JCXRoaXMuYWNjZXB0KHByaW50ZXIpOwotCQlidWZmZXIuYXBwZW5kKHByaW50ZXIuZ2V0UmVzdWx0KCkpOwotCX0JCi0KLX0gLy9FeHByZXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEZpZWxkQWNjZXNzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEZpZWxkQWNjZXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjExNGUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRGaWVsZEFjY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmllbGQgQWNjZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURmllbGRBY2Nlc3NJbXBsI2dldFJlY2VpdmVyIDxlbT5SZWNlaXZlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEZpZWxkQWNjZXNzSW1wbCNnZXRGaWVsZCA8ZW0+RmllbGQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEZpZWxkQWNjZXNzSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEZpZWxkQWNjZXNzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWNlaXZlcigpIDxlbT5SZWNlaXZlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVjZWl2ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gcmVjZWl2ZXIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkKCkgPGVtPkZpZWxkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGQoKSA8ZW0+RmllbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkID0gRklFTERfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRGaWVsZEFjY2Vzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRGaWVsZEFjY2VzcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0UmVjZWl2ZXIoKSB7Ci0JCXJldHVybiByZWNlaXZlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWNlaXZlcihQVEV4cHJlc3Npb24gbmV3UmVjZWl2ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZFJlY2VpdmVyID0gcmVjZWl2ZXI7Ci0JCXJlY2VpdmVyID0gbmV3UmVjZWl2ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVIsIG9sZFJlY2VpdmVyLCBuZXdSZWNlaXZlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVjZWl2ZXIoUFRFeHByZXNzaW9uIG5ld1JlY2VpdmVyKSB7Ci0JCWlmIChuZXdSZWNlaXZlciAhPSByZWNlaXZlcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVjZWl2ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVjZWl2ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZWNlaXZlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZWNlaXZlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVjZWl2ZXIobmV3UmVjZWl2ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUiwgbmV3UmVjZWl2ZXIsIG5ld1JlY2VpdmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZCgpIHsKLQkJcmV0dXJuIGZpZWxkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkKFN0cmluZyBuZXdGaWVsZCkgewotCQlTdHJpbmcgb2xkRmllbGQgPSBmaWVsZDsKLQkJZmllbGQgPSBuZXdGaWVsZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19GSUVMRCwgb2xkRmllbGQsIGZpZWxkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSZWNlaXZlcihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUjoKLQkJCQlyZXR1cm4gZ2V0UmVjZWl2ZXIoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19GSUVMRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVI6Ci0JCQkJc2V0UmVjZWl2ZXIoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX0ZJRUxEOgotCQkJCXNldEZpZWxkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVI6Ci0JCQkJc2V0UmVjZWl2ZXIoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fRklFTEQ6Ci0JCQkJc2V0RmllbGQoRklFTERfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSOgotCQkJCXJldHVybiByZWNlaXZlciAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX0ZJRUxEOgotCQkJCXJldHVybiBGSUVMRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGQgIT0gbnVsbCA6ICFGSUVMRF9FREVGQVVMVC5lcXVhbHMoZmllbGQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRSZWNlaXZlcigpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi0KLX0gLy9GaWVsZEFjY2Vzc0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbmZpeEV4cHJlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5maXhFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU2ZDI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbmZpeEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5maXggRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluZml4RXhwcmVzc2lvbkltcGwjZ2V0TGVmdE9wZXJhbmQgPGVtPkxlZnQgT3BlcmFuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluZml4RXhwcmVzc2lvbkltcGwjZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5maXhFeHByZXNzaW9uSW1wbCNnZXRSaWdodE9wZXJhbmQgPGVtPlJpZ2h0IE9wZXJhbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbmZpeEV4cHJlc3Npb25JbXBsI2dldEV4dGVuZGVkT3BlcmFuZHMgPGVtPkV4dGVuZGVkIE9wZXJhbmRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRJbmZpeEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUSW5maXhFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZWZ0T3BlcmFuZCgpIDxlbT5MZWZ0IE9wZXJhbmQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlZnRPcGVyYW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGxlZnRPcGVyYW5kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcGVyYXRvcigpIDxlbT5PcGVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIE9QRVJBVE9SX0VERUZBVUxUID0gUFRJbmZpeE9wZXJhdG9yLlRJTUVTX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcGVyYXRvcigpIDxlbT5PcGVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEluZml4T3BlcmF0b3Igb3BlcmF0b3IgPSBPUEVSQVRPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpZ2h0T3BlcmFuZCgpIDxlbT5SaWdodCBPcGVyYW5kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaWdodE9wZXJhbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gcmlnaHRPcGVyYW5kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuZGVkT3BlcmFuZHMoKSA8ZW0+RXh0ZW5kZWQgT3BlcmFuZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRPcGVyYW5kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV4dGVuZGVkT3BlcmFuZHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUSW5maXhFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEluZml4RXhwcmVzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0TGVmdE9wZXJhbmQoKSB7Ci0JCXJldHVybiBsZWZ0T3BlcmFuZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRMZWZ0T3BlcmFuZChQVEV4cHJlc3Npb24gbmV3TGVmdE9wZXJhbmQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZExlZnRPcGVyYW5kID0gbGVmdE9wZXJhbmQ7Ci0JCWxlZnRPcGVyYW5kID0gbmV3TGVmdE9wZXJhbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORCwgb2xkTGVmdE9wZXJhbmQsIG5ld0xlZnRPcGVyYW5kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWZ0T3BlcmFuZChQVEV4cHJlc3Npb24gbmV3TGVmdE9wZXJhbmQpIHsKLQkJaWYgKG5ld0xlZnRPcGVyYW5kICE9IGxlZnRPcGVyYW5kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChsZWZ0T3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClsZWZ0T3BlcmFuZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TGVmdE9wZXJhbmQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TGVmdE9wZXJhbmQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TGVmdE9wZXJhbmQobmV3TGVmdE9wZXJhbmQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5ELCBuZXdMZWZ0T3BlcmFuZCwgbmV3TGVmdE9wZXJhbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRJbmZpeE9wZXJhdG9yIGdldE9wZXJhdG9yKCkgewotCQlyZXR1cm4gb3BlcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3BlcmF0b3IoUFRJbmZpeE9wZXJhdG9yIG5ld09wZXJhdG9yKSB7Ci0JCVBUSW5maXhPcGVyYXRvciBvbGRPcGVyYXRvciA9IG9wZXJhdG9yOwotCQlvcGVyYXRvciA9IG5ld09wZXJhdG9yID09IG51bGwgPyBPUEVSQVRPUl9FREVGQVVMVCA6IG5ld09wZXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUiwgb2xkT3BlcmF0b3IsIG9wZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRSaWdodE9wZXJhbmQoKSB7Ci0JCXJldHVybiByaWdodE9wZXJhbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmlnaHRPcGVyYW5kKFBURXhwcmVzc2lvbiBuZXdSaWdodE9wZXJhbmQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZFJpZ2h0T3BlcmFuZCA9IHJpZ2h0T3BlcmFuZDsKLQkJcmlnaHRPcGVyYW5kID0gbmV3UmlnaHRPcGVyYW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5ELCBvbGRSaWdodE9wZXJhbmQsIG5ld1JpZ2h0T3BlcmFuZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmlnaHRPcGVyYW5kKFBURXhwcmVzc2lvbiBuZXdSaWdodE9wZXJhbmQpIHsKLQkJaWYgKG5ld1JpZ2h0T3BlcmFuZCAhPSByaWdodE9wZXJhbmQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJpZ2h0T3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyaWdodE9wZXJhbmQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSaWdodE9wZXJhbmQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmlnaHRPcGVyYW5kKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSaWdodE9wZXJhbmQobmV3UmlnaHRPcGVyYW5kLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQsIG5ld1JpZ2h0T3BlcmFuZCwgbmV3UmlnaHRPcGVyYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4dGVuZGVkT3BlcmFuZHMoKSB7Ci0JCWlmIChleHRlbmRlZE9wZXJhbmRzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkT3BlcmFuZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUFRFeHByZXNzaW9uLmNsYXNzLCB0aGlzLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUyk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkT3BlcmFuZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQ6Ci0JCQkJCXJldHVybiBiYXNpY1NldExlZnRPcGVyYW5kKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UmlnaHRPcGVyYW5kKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZW5kZWRPcGVyYW5kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORDoKLQkJCQlyZXR1cm4gZ2V0TGVmdE9wZXJhbmQoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJcmV0dXJuIGdldE9wZXJhdG9yKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQ6Ci0JCQkJcmV0dXJuIGdldFJpZ2h0T3BlcmFuZCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUzoKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRPcGVyYW5kcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EOgotCQkJCXNldExlZnRPcGVyYW5kKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJc2V0T3BlcmF0b3IoKFBUSW5maXhPcGVyYXRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EOgotCQkJCXNldFJpZ2h0T3BlcmFuZCgoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTOgotCQkJCWdldEV4dGVuZGVkT3BlcmFuZHMoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkT3BlcmFuZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORDoKLQkJCQlzZXRMZWZ0T3BlcmFuZCgoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJc2V0T3BlcmF0b3IoT1BFUkFUT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORDoKLQkJCQlzZXRSaWdodE9wZXJhbmQoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTOgotCQkJCWdldEV4dGVuZGVkT3BlcmFuZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQ6Ci0JCQkJcmV0dXJuIGxlZnRPcGVyYW5kICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXJldHVybiBvcGVyYXRvciAhPSBPUEVSQVRPUl9FREVGQVVMVDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORDoKLQkJCQlyZXR1cm4gcmlnaHRPcGVyYW5kICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTOgotCQkJCXJldHVybiBleHRlbmRlZE9wZXJhbmRzICE9IG51bGwgJiYgIWV4dGVuZGVkT3BlcmFuZHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRMZWZ0T3BlcmFuZCgpKTsKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFJpZ2h0T3BlcmFuZCgpKTsKLQkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGV4dGVuZGVkT3BlcmFuZHMpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2FzQ29tcHJlc3NlZEV4cHJlc3Npb24oKQotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gYXNDb21wcmVzc2VkRXhwcmVzc2lvbigpIHsKLQkJLy8gSWYgbm8gbGVmdCBhbmQgbm8gcmlnaHQKLQkJaWYoZ2V0TGVmdE9wZXJhbmQoKSA9PSBudWxsICYmIGdldFJpZ2h0T3BlcmFuZCgpICE9IG51bGwpewotCQkJLy8gbm8gZXh0ZW5kcyBzbyBqdXN0IHVzZSB0aGUgcmlnaHQgb3BlcmFuZAotCQkJaWYoZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLmlzRW1wdHkoKSl7Ci0JCQkJcmV0dXJuIGdldFJpZ2h0T3BlcmFuZCgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBUaGUgcmlnaHQgYmVjb21lcyB0aGUgbmV3IGxlZnQKLQkJCQlzZXRMZWZ0T3BlcmFuZChnZXRSaWdodE9wZXJhbmQoKSk7Ci0JCQkJLy8gVGhlIGZpcnN0IG9wZXJhbmQgYmVjb21lcyB0aGUgcmlnaHQgb25lCi0JCQkJc2V0UmlnaHRPcGVyYW5kKChQVEV4cHJlc3Npb24pIGdldEV4dGVuZGVkT3BlcmFuZHMoKS5yZW1vdmUoMCkpOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCQl9IGVsc2UgaWYgKGdldFJpZ2h0T3BlcmFuZCgpID09IG51bGwgJiYgZ2V0TGVmdE9wZXJhbmQoKSAhPSBudWxsKXsKLQkJCS8vIG5vIGV4dGVuZHMgc28ganVzdCB1c2UgdGhlIGxlZnQgb3BlcmFuZAotCQkJaWYoZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLmlzRW1wdHkoKSl7Ci0JCQkJcmV0dXJuIGdldExlZnRPcGVyYW5kKCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoZSByaWdodCBiZWNvbWVzIHRoZSBmaXJzdCBleHRlbmRlZAotCQkJCXNldFJpZ2h0T3BlcmFuZCgoUFRFeHByZXNzaW9uKWdldEV4dGVuZGVkT3BlcmFuZHMoKS5yZW1vdmUoMCkpOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQkJCQotCQl9CQotCQlyZXR1cm4gdGhpczsKLQl9Ci19IC8vSW5maXhFeHByZXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlUmVmZXJlbmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlUmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmY1ZDBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAlVyUKLSAqIEB2ZXJzaW9uICVJJSAlSCUKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEluc3RhbmNlUmVmZXJlbmNlSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEluc3RhbmNlUmVmZXJlbmNlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2UoKSA8ZW0+UmVmZXJlbmNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJSmF2YUluc3RhbmNlIHJlZmVyZW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJSmF2YUluc3RhbmNlIGdldFJlZmVyZW5jZSgpIHsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsICYmIHJlZmVyZW5jZS5lSXNQcm94eSgpKSB7Ci0JCQlJSmF2YUluc3RhbmNlIG9sZFJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKLQkJCXJlZmVyZW5jZSA9IChJSmF2YUluc3RhbmNlKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClyZWZlcmVuY2UpOwotCQkJaWYgKHJlZmVyZW5jZSAhPSBvbGRSZWZlcmVuY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRSwgb2xkUmVmZXJlbmNlLCByZWZlcmVuY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJSmF2YUluc3RhbmNlIGJhc2ljR2V0UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZShJSmF2YUluc3RhbmNlIG5ld1JlZmVyZW5jZSkgewotCQlJSmF2YUluc3RhbmNlIG9sZFJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKLQkJcmVmZXJlbmNlID0gbmV3UmVmZXJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRSwgb2xkUmVmZXJlbmNlLCByZWZlcmVuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVmZXJlbmNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UmVmZXJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRToKLQkJCQlzZXRSZWZlcmVuY2UoKElKYXZhSW5zdGFuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFOgotCQkJCXNldFJlZmVyZW5jZSgoSUphdmFJbnN0YW5jZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkluc3RhbmNlUmVmeyIgKyByZWZlcmVuY2UgKyAifSI7Ci0JfQotCi19IC8vUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnN0YW5jZW9mSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlb2ZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNmYxNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlb2ZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5zdGFuY2VvZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlb2ZJbXBsI2dldE9wZXJhbmQgPGVtPk9wZXJhbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnN0YW5jZW9mSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRJbnN0YW5jZW9mSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEluc3RhbmNlb2YgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wZXJhbmQoKSA8ZW0+T3BlcmFuZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3BlcmFuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBvcGVyYW5kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUSW5zdGFuY2VvZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRJbnN0YW5jZW9mKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRPcGVyYW5kKCkgewotCQlyZXR1cm4gb3BlcmFuZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPcGVyYW5kKFBURXhwcmVzc2lvbiBuZXdPcGVyYW5kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRPcGVyYW5kID0gb3BlcmFuZDsKLQkJb3BlcmFuZCA9IG5ld09wZXJhbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQsIG9sZE9wZXJhbmQsIG5ld09wZXJhbmQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZXJhbmQoUFRFeHByZXNzaW9uIG5ld09wZXJhbmQpIHsKLQkJaWYgKG5ld09wZXJhbmQgIT0gb3BlcmFuZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvcGVyYW5kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPcGVyYW5kKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPcGVyYW5kKG5ld09wZXJhbmQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORCwgbmV3T3BlcmFuZCwgbmV3T3BlcmFuZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5EOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRPcGVyYW5kKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5EOgotCQkJCXJldHVybiBnZXRPcGVyYW5kKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQ6Ci0JCQkJc2V0T3BlcmFuZCgoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5EOgotCQkJCXNldE9wZXJhbmQoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORDoKLQkJCQlyZXR1cm4gb3BlcmFuZCAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldE9wZXJhbmQoKSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9JbnN0YW5jZW9mSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEludmFsaWRFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEludmFsaWRFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzhjNTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW52YWxpZCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW52YWxpZEV4cHJlc3Npb25JbXBsI2dldE1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEludmFsaWRFeHByZXNzaW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEludmFsaWRFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZSgpIDxlbT5NZXNzYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2UoKSA8ZW0+TWVzc2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlID0gTUVTU0FHRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEludmFsaWRFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEludmFsaWRFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlKSB7Ci0JCVN0cmluZyBvbGRNZXNzYWdlID0gbWVzc2FnZTsKLQkJbWVzc2FnZSA9IG5ld01lc3NhZ2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRSwgb2xkTWVzc2FnZSwgbWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFOgotCQkJCXJldHVybiBnZXRNZXNzYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlZBTElEX0VYUFJFU1NJT05fX01FU1NBR0U6Ci0JCQkJc2V0TWVzc2FnZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlZBTElEX0VYUFJFU1NJT05fX01FU1NBR0U6Ci0JCQkJc2V0TWVzc2FnZShNRVNTQUdFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFOgotCQkJCXJldHVybiBNRVNTQUdFX0VERUZBVUxUID09IG51bGwgPyBtZXNzYWdlICE9IG51bGwgOiAhTUVTU0FHRV9FREVGQVVMVC5lcXVhbHMobWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9JbnZhbGlkRXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRNZXRob2RJbnZvY2F0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE1ldGhvZEludm9jYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiN2E2MGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE1ldGhvZEludm9jYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEludm9jYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRNZXRob2RJbnZvY2F0aW9uSW1wbCNnZXRSZWNlaXZlciA8ZW0+UmVjZWl2ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRNZXRob2RJbnZvY2F0aW9uSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTWV0aG9kSW52b2NhdGlvbkltcGwjZ2V0QXJndW1lbnRzIDxlbT5Bcmd1bWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVE1ldGhvZEludm9jYXRpb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUTWV0aG9kSW52b2NhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVjZWl2ZXIoKSA8ZW0+UmVjZWl2ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlY2VpdmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIHJlY2VpdmVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJndW1lbnRzKCkgPGVtPkFyZ3VtZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcmd1bWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhcmd1bWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUTWV0aG9kSW52b2NhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRNZXRob2RJbnZvY2F0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRSZWNlaXZlcigpIHsKLQkJcmV0dXJuIHJlY2VpdmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlY2VpdmVyKFBURXhwcmVzc2lvbiBuZXdSZWNlaXZlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkUmVjZWl2ZXIgPSByZWNlaXZlcjsKLQkJcmVjZWl2ZXIgPSBuZXdSZWNlaXZlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSLCBvbGRSZWNlaXZlciwgbmV3UmVjZWl2ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlY2VpdmVyKFBURXhwcmVzc2lvbiBuZXdSZWNlaXZlcikgewotCQlpZiAobmV3UmVjZWl2ZXIgIT0gcmVjZWl2ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlY2VpdmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlY2VpdmVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZWNlaXZlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZWNlaXZlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZWNlaXZlcihuZXdSZWNlaXZlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVIsIG5ld1JlY2VpdmVyLCBuZXdSZWNlaXZlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBcmd1bWVudHMoKSB7Ci0JCWlmIChhcmd1bWVudHMgPT0gbnVsbCkgewotCQkJYXJndW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBURXhwcmVzc2lvbi5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGFyZ3VtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UmVjZWl2ZXIobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFyZ3VtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUjoKLQkJCQlyZXR1cm4gZ2V0UmVjZWl2ZXIoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0QXJndW1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVI6Ci0JCQkJc2V0UmVjZWl2ZXIoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlnZXRBcmd1bWVudHMoKS5jbGVhcigpOwotCQkJCWdldEFyZ3VtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSOgotCQkJCXNldFJlY2VpdmVyKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlnZXRBcmd1bWVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVI6Ci0JCQkJcmV0dXJuIHJlY2VpdmVyICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFM6Ci0JCQkJcmV0dXJuIGFyZ3VtZW50cyAhPSBudWxsICYmICFhcmd1bWVudHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRSZWNlaXZlcigpKTsKLQkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGFyZ3VtZW50cyk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vTWV0aG9kSW52b2NhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZjU3ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTmFtZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUTmFtZUltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFROYW1lIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVE5hbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTkFNRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9OYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE51bGxMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE51bGxMaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGE4NjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdWxsTGl0ZXJhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdWxsTGl0ZXJhbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk51bGwgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUTnVsbExpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUTnVsbExpdGVyYWwgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVE51bGxMaXRlcmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVE51bGxMaXRlcmFsKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQkKLQotfSAvL051bGxMaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE51bWJlckxpdGVyYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTnVtYmVyTGl0ZXJhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExOWE2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTnVtYmVyTGl0ZXJhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OdW1iZXIgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE51bWJlckxpdGVyYWxJbXBsI2dldFRva2VuIDxlbT5Ub2tlbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUTnVtYmVyTGl0ZXJhbEltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFROdW1iZXJMaXRlcmFsIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9rZW4oKSA8ZW0+VG9rZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRva2VuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb2tlbigpIDxlbT5Ub2tlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9rZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdG9rZW4gPSBUT0tFTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVE51bWJlckxpdGVyYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUTnVtYmVyTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oKSB7Ci0JCXJldHVybiB0b2tlbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb2tlbihTdHJpbmcgbmV3VG9rZW4pIHsKLQkJU3RyaW5nIG9sZFRva2VuID0gdG9rZW47Ci0JCXRva2VuID0gbmV3VG9rZW47Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTUJFUl9MSVRFUkFMX19UT0tFTiwgb2xkVG9rZW4sIHRva2VuKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OVU1CRVJfTElURVJBTF9fVE9LRU46Ci0JCQkJcmV0dXJuIGdldFRva2VuKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OVU1CRVJfTElURVJBTF9fVE9LRU46Ci0JCQkJc2V0VG9rZW4oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVNQkVSX0xJVEVSQUxfX1RPS0VOOgotCQkJCXNldFRva2VuKFRPS0VOX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVNQkVSX0xJVEVSQUxfX1RPS0VOOgotCQkJCXJldHVybiBUT0tFTl9FREVGQVVMVCA9PSBudWxsID8gdG9rZW4gIT0gbnVsbCA6ICFUT0tFTl9FREVGQVVMVC5lcXVhbHModG9rZW4pOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodG9rZW46ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRva2VuKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotfSAvL051bWJlckxpdGVyYWxJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YzI4NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJlbnRoZXNpemVkIEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwjZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cHJlc3Npb24oKSA8ZW0+RXhwcmVzc2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRFeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLQkJZXhwcmVzc2lvbiA9IG5ld0V4cHJlc3Npb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgb2xkRXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbikgewotCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBleHByZXNzaW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChleHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4cHJlc3Npb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RXhwcmVzc2lvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeHByZXNzaW9uKG5ld0V4cHJlc3Npb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBuZXdFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJCXJldHVybiBiYXNpY1NldEV4cHJlc3Npb24obnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBleHByZXNzaW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RXhwcmVzc2lvbigpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi0KLX0gLy9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRQcmVmaXhFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFByZWZpeEV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjhhZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFByZWZpeEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmVmaXggRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFByZWZpeEV4cHJlc3Npb25JbXBsI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFByZWZpeEV4cHJlc3Npb25JbXBsI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFByZWZpeEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUUHJlZml4RXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wZXJhdG9yKCkgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQVFByZWZpeE9wZXJhdG9yIE9QRVJBVE9SX0VERUZBVUxUID0gUFRQcmVmaXhPcGVyYXRvci5QTFVTX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcGVyYXRvcigpIDxlbT5PcGVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yID0gT1BFUkFUT1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHByZXNzaW9uKCkgPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRQcmVmaXhFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVFByZWZpeEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRQcmVmaXhPcGVyYXRvciBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIG9wZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZXJhdG9yKFBUUHJlZml4T3BlcmF0b3IgbmV3T3BlcmF0b3IpIHsKLQkJUFRQcmVmaXhPcGVyYXRvciBvbGRPcGVyYXRvciA9IG9wZXJhdG9yOwotCQlvcGVyYXRvciA9IG5ld09wZXJhdG9yID09IG51bGwgPyBPUEVSQVRPUl9FREVGQVVMVCA6IG5ld09wZXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1IsIG9sZE9wZXJhdG9yLCBvcGVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0JCWV4cHJlc3Npb24gPSBuZXdFeHByZXNzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgb2xkRXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbikgewotCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBleHByZXNzaW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChleHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4cHJlc3Npb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHByZXNzaW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXhwcmVzc2lvbihuZXdFeHByZXNzaW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBuZXdFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RXhwcmVzc2lvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXJldHVybiBnZXRPcGVyYXRvcigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXNldE9wZXJhdG9yKChQVFByZWZpeE9wZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXNldE9wZXJhdG9yKE9QRVJBVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXJldHVybiBvcGVyYXRvciAhPSBPUEVSQVRPUl9FREVGQVVMVDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGV4cHJlc3Npb24gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RXhwcmVzc2lvbigpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL1ByZWZpeEV4cHJlc3Npb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUU3RyaW5nTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRTdHJpbmdMaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWIxNzFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRTdHJpbmdMaXRlcmFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0cmluZyBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUU3RyaW5nTGl0ZXJhbEltcGwjZ2V0RXNjYXBlZFZhbHVlIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUU3RyaW5nTGl0ZXJhbEltcGwjZ2V0TGl0ZXJhbFZhbHVlIDxlbT5MaXRlcmFsIFZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRTdHJpbmdMaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVFN0cmluZ0xpdGVyYWwgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc2NhcGVkVmFsdWUoKSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXNjYXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzY2FwZWRWYWx1ZSgpIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXNjYXBlZFZhbHVlID0gRVNDQVBFRF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaXRlcmFsVmFsdWUoKSA8ZW0+TGl0ZXJhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGl0ZXJhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSVRFUkFMX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpdGVyYWxWYWx1ZSgpIDxlbT5MaXRlcmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaXRlcmFsVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGl0ZXJhbFZhbHVlID0gTElURVJBTF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVFN0cmluZ0xpdGVyYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUU3RyaW5nTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXNjYXBlZFZhbHVlKCkgewotCQlyZXR1cm4gZXNjYXBlZFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVzY2FwZWRWYWx1ZShTdHJpbmcgbmV3RXNjYXBlZFZhbHVlKSB7Ci0JCXN0cmluZ0xpdGVyYWxTZXQgPSBmYWxzZTsKLQkJc2V0TGl0ZXJhbFZhbHVlR2VuKExJVEVSQUxfVkFMVUVfRURFRkFVTFQpOwotCQlzZXRFc2NhcGVkVmFsdWVHZW4obmV3RXNjYXBlZFZhbHVlKTsJCQotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFc2NhcGVkVmFsdWVHZW4oU3RyaW5nIG5ld0VzY2FwZWRWYWx1ZSkgewotCQlTdHJpbmcgb2xkRXNjYXBlZFZhbHVlID0gZXNjYXBlZFZhbHVlOwotCQllc2NhcGVkVmFsdWUgPSBuZXdFc2NhcGVkVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19FU0NBUEVEX1ZBTFVFLCBvbGRFc2NhcGVkVmFsdWUsIGVzY2FwZWRWYWx1ZSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzdHJpbmdMaXRlcmFsU2V0OwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbFZhbHVlKCkgewotCQlpZiAoIXN0cmluZ0xpdGVyYWxTZXQgJiYgZXNjYXBlZFZhbHVlICE9IEVTQ0FQRURfVkFMVUVfRURFRkFVTFQpIHsKLQkJCVN0cmluZyBzID0gZ2V0RXNjYXBlZFZhbHVlKCk7Ci0JCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPCAyIHx8IHMuY2hhckF0KDApICE9ICdcIicgfHwgcy5jaGFyQXQobGVuLTEpICE9ICdcIicgKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOwotCQkJaW50IHN0b3AgPSBsZW4tMTsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgc3RvcDsgaSsrKSB7Ci0JCQkJY2hhciBhdGkgPSBzLmNoYXJBdChpKTsKLQkJCQlpZiAoYXRpID09ICdcXCcpIHsKLQkJCQkJaWYgKCsraSA8IHN0b3ApIHsKLQkJCQkJCWF0aSA9IHMuY2hhckF0KGkpOwotCQkJCQkJaWYgKGF0aSA9PSAndScpIHsKLQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOwotCQkJCQkJCWlmIChpKzQgPj0gc3RvcAotCQkJCQkJCQkJfHwgKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdCgrK2kpKSkgPiAxNQotCQkJCQkJCQkJfHwgYzEgPCAwCi0JCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KCsraSkpKSA+IDE1Ci0JCQkJCQkJCQl8fCBjMiA8IDAKLQkJCQkJCQkJCXx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoKytpKSkpID4gMTUKLQkJCQkJCQkJCXx8IGMzIDwgMAotCQkJCQkJCQkJfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdCgrK2kpKSkgPiAxNQotCQkJCQkJCQkJfHwgYzQgPCAwKXsKLQkJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBzdHJpbmcgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCkpOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJYnVmZmVyLmFwcGVuZChQVENoYXJhY3RlckxpdGVyYWxJbXBsLmdldENoYXJFc2NhcGVkKGF0aSkpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgc3RyaW5nIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlCi0JCQkJCWJ1ZmZlci5hcHBlbmQoYXRpKTsJCi0JCQl9Ci0JCQkKLQkJCXN0cmluZ0xpdGVyYWxTZXQgPSB0cnVlOwotCQkJc2V0TGl0ZXJhbFZhbHVlR2VuKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGdldExpdGVyYWxWYWx1ZUdlbigpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWxWYWx1ZUdlbigpIHsKLQkJcmV0dXJuIGxpdGVyYWxWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXRlcmFsVmFsdWUoU3RyaW5nIG5ld0xpdGVyYWxWYWx1ZSkgewotCQlzdHJpbmdMaXRlcmFsU2V0ID0gdHJ1ZTsKLQkJc2V0TGl0ZXJhbFZhbHVlR2VuKG5ld0xpdGVyYWxWYWx1ZSk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIobmV3TGl0ZXJhbFZhbHVlLmxlbmd0aCgpKzIpOwotCQliLmFwcGVuZCgnXCInKTsgLy8gb3BlbmluZyBkZWxpbWl0ZXIKLQkJaW50IHN0b3AgPSBuZXdMaXRlcmFsVmFsdWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RvcDsgaSsrKSB7Ci0JCQlQVENoYXJhY3RlckxpdGVyYWxJbXBsLmFwcGVuZENoYXJhY3RlcihuZXdMaXRlcmFsVmFsdWUuY2hhckF0KGkpLCBiKTsJCi0JCX0KLQkJYi5hcHBlbmQoJ1wiJyk7IC8vIGNsb3NpbmcgZGVsaW1pdGVyCi0JCXNldEVzY2FwZWRWYWx1ZUdlbihiLnRvU3RyaW5nKCkpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXRlcmFsVmFsdWVHZW4oU3RyaW5nIG5ld0xpdGVyYWxWYWx1ZSkgewotCQlTdHJpbmcgb2xkTGl0ZXJhbFZhbHVlID0gbGl0ZXJhbFZhbHVlOwotCQlsaXRlcmFsVmFsdWUgPSBuZXdMaXRlcmFsVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFLCBvbGRMaXRlcmFsVmFsdWUsIGxpdGVyYWxWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldEVzY2FwZWRWYWx1ZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0TGl0ZXJhbFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlzZXRFc2NhcGVkVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRToKLQkJCQlzZXRMaXRlcmFsVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJc2V0RXNjYXBlZFZhbHVlKEVTQ0FQRURfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0xJVEVSQUxfVkFMVUU6Ci0JCQkJc2V0TGl0ZXJhbFZhbHVlKExJVEVSQUxfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlyZXR1cm4gRVNDQVBFRF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZXNjYXBlZFZhbHVlICE9IG51bGwgOiAhRVNDQVBFRF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoZXNjYXBlZFZhbHVlKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0xJVEVSQUxfVkFMVUU6Ci0JCQkJcmV0dXJuIExJVEVSQUxfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGxpdGVyYWxWYWx1ZSAhPSBudWxsIDogIUxJVEVSQUxfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGxpdGVyYWxWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9TdHJpbmdMaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFRoaXNMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFRoaXNMaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDUzNzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRUaGlzTGl0ZXJhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUaGlzTGl0ZXJhbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRoaXMgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUVGhpc0xpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUVGhpc0xpdGVyYWwgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVFRoaXNMaXRlcmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVFRoaXNMaXRlcmFsKCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQkKLQotfSAvL1RoaXNMaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFR5cGVMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFR5cGVMaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ1YjdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRUeXBlTGl0ZXJhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZSBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUVHlwZUxpdGVyYWxJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFR5cGVMaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVFR5cGVMaXRlcmFsIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVFR5cGVMaXRlcmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVFR5cGVMaXRlcmFsKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTF9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfVFlQRV9MSVRFUkFMX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9UWVBFX0xJVEVSQUxfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9UWVBFX0xJVEVSQUxfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfVFlQRV9MSVRFUkFMX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vVHlwZUxpdGVyYWxJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BhcnNlVHJlZUFsbG9jYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BhcnNlVHJlZUFsbG9jYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjVjYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVHJlZUFsbG9jYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwjZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhcnNlVHJlZUFsbG9jYXRpb25JbXBsIGV4dGVuZHMgSmF2YUFsbG9jYXRpb25JbXBsIGltcGxlbWVudHMgUGFyc2VUcmVlQWxsb2NhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwcmVzc2lvbigpIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhcnNlVHJlZUFsbG9jYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZEV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotCQlleHByZXNzaW9uID0gbmV3RXhwcmVzc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OLCBvbGRFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uKSB7Ci0JCWlmIChuZXdFeHByZXNzaW9uICE9IGV4cHJlc3Npb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZXhwcmVzc2lvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHByZXNzaW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEV4cHJlc3Npb24obmV3RXhwcmVzc2lvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT04sIG5ld0V4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RXhwcmVzc2lvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBnZXRFeHByZXNzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGV4cHJlc3Npb24gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldEV4cHJlc3Npb24oKSAhPSBudWxsID8gZ2V0RXhwcmVzc2lvbigpLnRvU3RyaW5nKCkgOiBzdXBlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFyc2VUcmVlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0gLy9QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2I0NGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1OYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXJfSW52YWxpZEV4cHJlc3Npb249IGludmFsaWQ6ICJ7MH0iCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9pbnN0YW5jZS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2luc3RhbmNlLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTRmZjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2luc3RhbmNlLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Imluc3RhbnRpYXRpb24iCi0gICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbiI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJKYXZhIEluc3RhbnRpYXRpb24gUGFja2FnZSIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSmF2YURhdGFUeXBlSW5zdGFuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZSIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9JSmF2YUluc3RhbmNlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFJbnN0YW5jZSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSmF2YU9iamVjdEluc3RhbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhSW5zdGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaW50ZXJmYWNlIGlzIHRoZSBpbnN0YW5jZSBvZiBhbiBqYXZhIG9iamVjdCBpbiB0aGUgamF2YSBtb2RlbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUFsbG9jYXRpb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIHRoZSBhbGxvY2F0aW9uIGNsYXNzLiBJdCBpcyB0aGUgdmFsdWUgb2YgdGhlICZxdW90O2FsbG9jYXRpb24mcXVvdDsgcHJvcGVydHkgb24gYSBKYXZhIE9iamVjdCBzbyB0aGF0IHRoZSBhY3R1YWwgYWxsb2NhdGlvbiBjYW4gYmUgY29udHJvbGxlZC4gRm9yIGV4YW1wbGUsIHRoZXJlIGNvdWxkIGJlIG9uZSBmb3IganVzdCBpbml0IHN0cmluZywgb3Igb25lIGZvciBzZXJpYWxpemVkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbml0U3RyaW5nQWxsb2NhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0phdmFBbGxvY2F0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYWxsb2NhdGlvbiBzdHJpbmcgY2FuIGJlIHBhcnNlZCBieSB0aGUgcmVtb3RlIHZtLiBJdCB1c2VzIHRoZSBhbGxvY1N0cmluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5pdFN0cmluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZyBmb3IgdGhpcyBvYmplY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkltcGxpY2l0QWxsb2NhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0phdmFBbGxvY2F0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIGlzIGZvciBhbiBpbXBsaWNpdCBhbGxvY2F0aW9uIHdoZXJlIHRoZSBvYmplY3QgY29tZXMgZnJvbSB0aGUgZmVhdHVyZSBvZiBhbm90aGVyIG9iamVjdC4gSXQgaXMgdGhlIGxpdmUgSmF2YSB2YWx1ZSBmcm9tIHRoZSByZW1vdGUgdm0uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZlYXR1cmUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cnVjdHVyYWxGZWF0dXJlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhcnNlVHJlZUFsbG9jYXRpb24iIGVTdXBlclR5cGVzPSIjLy9KYXZhQWxsb2NhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQWxsb2NhdGlvbnMgdmlhIFBhcnNlIFRyZWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHByZXNzaW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEV4cHJlc3Npb24iIGFic3RyYWN0PSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRBcnJheUFjY2VzcyIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJyYXkgYWNjZXNzLiBlLmcuIHhbM10uICYjeEQ7JiN4QTsmI3hEOyYjeEE7VW5saWtlIEFTVCwgdGhlIGVudGlyZSBleHByZXNzaW9uIG9mIHR5cGUgeFszXVs0XSB3aWxsIGJlIGRvbmUgaW4gb25lIGV4cHJlc3Npb24gcmF0aGVyIHRoYW4gaGF2aW5nIGEgc2VwYXJhdGUgQXJyYXlBY2Nlc3MgZm9yIGVhY2ggZGltZW5zaW9uLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGlmaWNhdGlvbi4gVGhpcyBjYW4gb25seSBiZSB1c2VkIGlmIGl0IGlzIGEgc2ltcGxlIGFycmF5IGFjY2VzcyB3aGVyZSBpdCBpcyBvZiB0aGUgZm9ybSB7ZXhwcmVzc2lvbn1bZXhwcmVzc2lvbl1bZXhwcmVzc2lvbl0uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFycmF5IiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgYXJyYXkgdG8gYWNjZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmRleGVzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhwcmVzc2lvbnMgcmVwcmVzZW50aW5nIHRoZSBpbmRleGVzIG9mIHRoZSBhY2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQXJyYXlDcmVhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJyYXkgQ3JlYXRpb24gZXhwcmVzc2lvbiwgZS5nLiBuZXcgaW50WzNdIG9yIG5ldyBqYXZhLmxhbmdTdHJpbmdbXVtdIHt7JnF1b3Q7YSZxdW90O30sIHsmcXVvdDtiJnF1b3Q7fX0iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSwgZS5nLiBpbnRbXVtdIG9yIGphdmEubGFuZy5TdHJpbmdbXSwgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2YgZGltZW5zaW9uIGJyYWNrZXRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaW1lbnNpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGlzdCBvZiBleHByZXNzaW9ucyBmb3IgdGhlIGRpbWVuc2lvbnMuIFlvdSBjYW4gaGF2ZSBbM11bNF1bXSBidXQgW11bMzNdIGlzIGludmFsaWQuIFNvIGZvciBlYWNoIGRpbWVuc2lvbiB0aGF0IGhhcyBhbiBleHByZXNzaW9uLCB0aGVyZSB3aWxsIGJlIGFuIGVudHJ5IGluIHRoZSBsaXN0LCBpbiB0aGUgY29ycmVjdCBvcmRlci4gV2hlbiB5b3UgcmVhY2ggdGhlIGVtcHR5IGRpbWVuc2lvbnMsIHRoZSBsaXN0IHdpbGwgZW5kIHRvby4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRpYWxpemVyIiBlVHlwZT0iIy8vUFRBcnJheUluaXRpYWxpemVyIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGluaXRpYWxpemVyLCBpZiBhbnksIGZvciB0aGlzIGFycmF5LiBFLmcuIG5ldyBpbnRbXSB7MiwzfS4gSXQgaXMgdGhlIHsyLDN9LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEFycmF5SW5pdGlhbGl6ZXIiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFycmF5IGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24uIFRoaXMgaXMgdGhlIGVudGlyZSBleHByZXNzaW9uLCBlLmcuIHsyLCAzfSwgb3Ige3syLDN9LCA0fS4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgezIsM30gd2lsbCBiZSBhbiBBcnJheUluaXRpYWxpemVyIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGV4cHJlc3Npb25zIGxpc3QgZm9yIHRoZSB0b3AgQXJyYXlJbml0aWFsaXplci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhwcmVzc2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXN0aGUgbGlzdCBvZiBleHByZXNzaW9ucyB3aXRoaW4gdGhlIGluaXRpYWxpemVyLCBlLmcuIHsyLCAzfSwgb3Ige3syLDN9LCA0fS4gSW4gdGhlIGZpcnN0IGNhc2UgaXQgd2lsbCBiZSB0d28gTnVtYmVyTGl0ZXJhbHMuIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlIHsyLDN9IHdpbGwgYmUgYW4gQXJyYXlJbml0aWFsaXplciwgZm9sbG93ZWQgYnkgYSBOdW1iZXJMaXRlcmFsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEJvb2xlYW5MaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgYm9vbGVhbiBsaXRlcmFsLCBpLmUuIHRydWUgb3IgZmFsc2UgZGlyZWN0bHkgaW4gdGhlIGNvZGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvb2xlYW5WYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIGxpdGVyYWwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQ2FzdEV4cHJlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNhc3QgZXhwcmVzc2lvbiwgZS5nLiAoc2hvcnQpIDEwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBvZiB0aGUgY2FzdCwgZS5nLiBpbnQgb3IgamF2YS5sYW5nLlN0cmluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHByZXNzaW9uIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHByZXNzaW9uIGJlaW5nIGNhc3RlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRDaGFyYWN0ZXJMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgY2hhcmFjdGVyIGV4cHJlc3Npb24sIGUuZy4gJ2EnIG9yICdccicuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzY2FwZWRWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLiBJbiBvdGhlciB3b3JkcyB0aGUgbGl0ZXJhbCBleGFjdGx5IGFzIGl0IGlzIGluIHRoZSBqYXZhIGZpbGUuIEUuZy4gJ2EnIG9yICdccicuIEluY2x1ZGluZyB0aGUgc3Vycm91bmRpbmcgc2luZ2xlIHF1b3RlcyB0aGVtc2VsdmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFyVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VDaGFyIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHByaW1pdGl2ZSBjaGFyYWN0ZXIgd2l0aG91dCB0aGUgcXVvdGVzLiBFc2NhcGUgYXJlIGV2YWx1YXRlZCBhbmQgdHVybmVkIGludG8gdGhlaXIgY2hhcmFjdGVyIHZhbHVlLiBUaGlzIGlzIGEgdHJhbnNpZW50IGZpZWxkLiBJZiBub3Qgc2V0IHdoZW4gY3JlYXRlZCB3aGVuIHF1ZXJpZWQgaXQgd2lsbCBjcmVhdGUgaXQuIFR5cGljYWxseSBpdCB3aWxsIGJlIHNldCB3aGVuIGNyZWF0ZWQgZnJvbSBhbiBBU1Qgbm9kZSBzaW5jZSB0aGUgbm9kZSBhbHJlYWR5IGhhcyBldmFsdWF0ZWQgaXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uLiBFLmcuIG5ldyBTdHJpbmcoJnF1b3Q7YSZxdW90OykiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIHR5cGUgb2YgdGhlIGNsYXNzLiBFLmcuIGphdmEubGFuZy5TdHJpbmcuIFRoaXMgc2hvdWxkIGJlIGZ1bGx5LXF1YWxpZmllZCBmb3IgYWxsb2NhdGlvbiBwdXJwb3Nlcy4gSXQgc2hvdWxkIGFsc28gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gaWYgWCBpcyBhbiBpbm5lciBjbGFzcyBvZiBqLlksIHRoZW4gdGhlIHR5cGUgaGVyZSBzaG91bGQgYmUgJnF1b3Q7ai5ZJFgmcXVvdDsuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhcmd1bWVudHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRlc3QgRXhwcmVzc29uLCBlLmcuICh4PTMpID8gMSA6IDIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uZGl0aW9uIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb25kaXRpb24gZXhwcmVzc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHJ1ZSIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHJ1ZSBleHByZXNzaW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZhbHNlIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmYWxzZSBleHByZXNzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEZpZWxkQWNjZXNzIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBY2Nlc3MgYSBmaWVsZCBleHByZXNzaW9uLCBlLmcuIGphdmEuYXd0LkNvbG9yLnJlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWNlaXZlciIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIG9iamVjdCB0aGF0IHRoZSBmaWVsZCBpcyBpbiwgZS5nLiBqYXZhLmF3dC5Db2xvci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgYWNjZXNzZWQsIGUuZy4gcmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEluZml4RXhwcmVzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXhwcmVzc2lvbiB3aXRoIGFuIG9wZXJhdG9yIHRoYXQgaGFzIHR3byBvcGVyYW5kcywgZS5nLiAzICsgNC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGVmdE9wZXJhbmQiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9wZXJhdG9yIiBlVHlwZT0iIy8vUFRJbmZpeE9wZXJhdG9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG9wZXJhdG9yLCBlLmcuICsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmlnaHRPcGVyYW5kIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByaWdodCBleHByZXNzaW9uLiBpLmUuIDQgb2YgJnF1b3Q7MyArIDQmcXVvdDsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRPcGVyYW5kcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVXNlZCB3aGVuIHRoZXJlIGFyZSBhIHNlcmllcyBvZiBpbmZpeCBvcGVyYXRpb25zIG9mIHRoZSBzYW1lIG9wZXJhdG9yLCBlLmcuIDEgKyAyICsgMyArIDQuIDEgYW5kIDIgd2lsbCBnbyBpbnRvIGxlZnQgYW5kIHJpZ2h0LCB3aGlsZSB7MywgNH0gd2lsbCBnbyBpbnRvIHRoZSBleHRlbmRlZCBvcGVyYW5kcy4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUFRJbmZpeE9wZXJhdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbnVtZXJhdG9yIGZvciB0aGUgb3BlcmF0b3Igb24gYW4gSW5maXhFeHByZXNzaW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVElNRVMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIqIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkRJVklERSIgdmFsdWU9IjEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIvIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJFTUFJTkRFUiIgdmFsdWU9IjIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIlIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBMVVMiIHZhbHVlPSIzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iKyBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJNSU5VUyIgdmFsdWU9IjQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSItIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxFRlRfU0hJRlQiIHZhbHVlPSI1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJmx0OyZsdDsgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUklHSFRfU0hJRlRfU0lHTkVEIiB2YWx1ZT0iNiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ij4+IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJJR0hUX1NISUZUX1VOU0lHTkVEIiB2YWx1ZT0iNyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ij4+PiBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJMRVNTIiB2YWx1ZT0iOCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiZsdDsgIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkdSRUFURVIiIHZhbHVlPSI5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iPiBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJMRVNTX0VRVUFMUyIgdmFsdWU9IjEwIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJmx0Oz0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iR1JFQVRFUl9FUVVBTFMiIHZhbHVlPSIxMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ij49IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkVRVUFMUyIgdmFsdWU9IjEyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iPT0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTk9UX0VRVUFMUyIgdmFsdWU9IjEzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iIT0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iWE9SIiB2YWx1ZT0iMTQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJeIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkFORCIgdmFsdWU9IjE1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJmFtcDsgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1IiIHZhbHVlPSIxNiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9InwgIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNPTkRJVElPTkFMX0FORCIgdmFsdWU9IjE3Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJmFtcDsmYW1wOyBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDT05ESVRJT05BTF9PUiIgdmFsdWU9IjE4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0ifHwgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEluc3RhbmNlb2YiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikluc3RhbmNlb2YgZXhwcmVzc2lvbiwgZS5nLiB4IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcGVyYW5kIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSB0byB0ZXN0LCBlLmcuIHggaW4geCBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSB0ZXN0LCBlLmcuIGphdmEubGFuZy5TdHJpbmcuIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVE1ldGhvZEludm9jYXRpb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1ldGhvZEludm9jYXRpb24gZXhwcmVzc2lvbiwgZS5nLiB4LmdldFkoMykiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVjZWl2ZXIiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hvIHRoZSBtZXRob2QgaXMgaW52b2tlZCBhZ2FpbnN0LiBUaGlzIG1heSBiZSBub3Qgc2V0LCB3aGljaCBtZWFucyAmcXVvdDt0aGlzJnF1b3Q7LiBJdCBtYXkgYWxzbyBiZSBhIE5hbWUsIHdoaWNoIHdvdWxkIG1lYW4gYSBjbGFzcyBsaWtlICZxdW90O2phdmEubGFuZy5TdHJpbmcmcXVvdDsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYmVpbmcgaW52b2tlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXJndW1lbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGlzdCBvZiBhcmd1bWVudHMsIGlmIGFueSwgdG8gdGhlIG1ldGhvZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFROYW1lIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHJlcHJlc2VudHMgYSBuYW1lLiBUaGlzIGNhbiBoYXBwZW4gZm9yIHRoZSByZWNlaXZlciBvZiBhIG1ldGhvZCBpbnZvY2F0aW9uLCBlLmcuIHguZ2V0WSgpIG9yIGphdmEubGFuZy5TdHJpbmcudmFsdWVPZigxMCkuIEluIHRoZXNlIGNhc2VzIHlvdSB3b3VsZCBoYXZlIGEgbmFtZSBvZiAmcXVvdDt4JnF1b3Q7IG9yICZxdW90O2phdmEubGFuZy5TdHJpbmcmcXVvdDsuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSwgd2hpY2ggY2FuIGJlIGEgdHlwZSBvciBhIHZhcmlhYmxlLiBJZiBpdCBpcyBhIHR5cGUsIHRoZW4gIGl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVE51bGxMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXByZXNlbnRzIHRoZSBleHByZXNzaW9uICZxdW90O251bGwmcXVvdDsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFROdW1iZXJMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXByZXNlbnQgYSBudW1iZXIgcHJpbWl0aXZlIGxpdGVyYWwsIGUuZy4gMTAuIE9uZSBvcHRpbWl6YXRpb24gdGhhdCB3aWxsIGJlIHBlcmZvcm1lZCBpcyB0aGF0IGlmIGFuIGV4cHJlc3Npb24gaXMgb2YgdGhlIGZvcm0gK251bWJlciBvciAtbnVtYmVyLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCBmcm9tIGEgUHJlZml4RXhwcmVzc2lvbiB3aXRoIGEgTnVtYmVyTGl0ZXJhbCB0byBqdXN0IGEgTnVtYmVyTGl0ZXJhbC4gVGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBtb2RlbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9rZW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG9rZW4gdmFsdWUsIGUuZy4gMTAsIDEwZCwgb3IgLTEwLjc1Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4cHJlc3Npb24gd2l0aGluIHBhcmVudGhlc2lzLCBlLmcuICh4KzMpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4cHJlc3Npb24iIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4cHJlc3Npb24gd3JhcHBlZCBieSB0aGUgcGFyZW50aGVzaXMsIGUuZy4gKHgrMykgdGhlbiB0aGUgZXhwcmVzc2lvbiBpcyAmcXVvdDt4KzMmcXVvdDsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRQcmVmaXhFeHByZXNzaW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIG9uZSBvcGVyYW5kIG9wZXJhdG9yLCB3aGVyZSB0aGUgb3BlcmF0b3IgY29tZXMgYmVmb3JlIHRoZSBvcGVyYW5kLCBlLmcuIC0gKHgrMykuIEluIEFTVCwgZXZlbiAtMyBpcyBtb2RlbGVkIGFzIGEgUHJlZml4RXhwcmVzc2lvbiBvZiBvcGVyYXRvciAmcXVvdDstJnF1b3Q7IGFuZCBleHByZXNzaW9uIG9mIE51bWJlckxpdGVyYWwoMykuIEJ1dCB3ZSBvcHRpbWl6ZSB0aGlzIGF3YXkgYW5kIGp1c3QgdXNlIGEgTnVtYmVyTGl0ZXJhbCgtMykgZGlyZWN0bHkgaW5zdGVhZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3BlcmF0b3IiIGVUeXBlPSIjLy9QVFByZWZpeE9wZXJhdG9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG9wZXJhdG9yIG9mIHRoaXMgZXhwcmVzc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhwcmVzc2lvbiIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhwcmVzc2lvbiB0aGF0IHRoZSBvcGVyYXRvciBpcyBhcHBsaWVkIHRvLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlBUUHJlZml4T3BlcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcmVmaXggZXhwcmVzc2lvbiBvcGVyYXRvci4gV2UgYXJlIG5vdCBtb2RlbGluZyArKyBhbmQgLS0uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQTFVTIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iKyBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJNSU5VUyIgdmFsdWU9IjEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSItIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNPTVBMRU1FTlQiIHZhbHVlPSIyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0ifiBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJOT1QiIHZhbHVlPSIzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iISBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUU3RyaW5nTGl0ZXJhbCIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZS5nLiAmcXVvdDthc2RmJnF1b3Q7LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc2NhcGVkVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBlc2NhcGVkIHN0cmluZy4gSW4gb3RoZXIgd29yZHMgdGhlIGxpdGVyYWwgZXhhY3RseSBhcyBpdCBpcyBpbiB0aGUgamF2YSBmaWxlLiBFLmcuICZxdW90O2FiJnF1b3Q7IG9yICZxdW90O2NcciZxdW90Oy4gSW5jbHVkaW5nIHRoZSBzdXJyb3VuZGluZyBxdW90ZXMgdGhlbXNlbHZlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGl0ZXJhbFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHN0cmluZyB3aXRob3V0IHRoZSBxdW90ZXMuIEVzY2FwZSBhcmUgZXZhbHVhdGVkIGFuZCB0dXJuZWQgaW50byB0aGVpciBjaGFyYWN0ZXIgdmFsdWUuIFRoaXMgaXMgYSB0cmFuc2llbnQgZmllbGQuIElmIG5vdCBzZXQgd2hlbiBjcmVhdGVkIHdoZW4gcXVlcmllZCBpdCB3aWxsIGNyZWF0ZSBpdC4gVHlwaWNhbGx5IGl0IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRlZCBmcm9tIGFuIEFTVCBub2RlIHNpbmNlIHRoZSBub2RlIGFscmVhZHkgaGFzIGV2YWx1YXRlZCBpdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRUaGlzTGl0ZXJhbCIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50cyAmcXVvdDt0aGlzJnF1b3Q7LCBlLmcuIHRoaXMuZ2V0WCgpIHdpbGwgYmUgYSBNZXRob2RJbnZvY2F0aW9uIHdpdGggdGhlIHJlY2VpdmVyIGJlaW5nIGEgVGhpc0xpdGVyYWwuIFdlIGNhbid0IGhhbmRsZSB0aGUgZm9ybWF0IFhZWi50aGlzIGJlY2F1c2UgdGhhdCBpcyBmb3IgaW5uZXIgY2xhc3NlcyBhbmQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGF0IHJpZ2h0IG5vdy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRUeXBlTGl0ZXJhbCIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyByZXByZXNlbnRzIGEgbGl0ZXJhbCBvZiB0aGUgZm9ybSBqLlhZWi5jbGFzcy4gRm9yIGluc3RhbmNlIGluIGEgbWV0aG9kIGludm9jYXRpb24geC5nZXRYKGpYWVouY2xhc3MpIHRoZSBhcmd1bWVudCB3aWxsIGJlIGEgVHlwZUxpdGVyYWwuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB0aGUgbGl0ZXJhbC4gIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEludmFsaWRFeHByZXNzaW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHVzZWQgd2hlbiB3ZSBoYXZlIHNvbWUgZXhwcmVzc2lvbiB3ZSBqdXN0IGNhbid0IGV2YWx1YXRlIGZvciBvdXIgcHVycG9zZXMuIEl0IGFsbG93cyB1cyB0byB0ZWxsIHRoZSBldmFsdWF0aW9uIHdoYXQgaXMgYWN0dWFsbHkgd3JvbmcuIEl0IHNob3VsZCBiZSBwbGFjZWQgYXMgdGhlIHJvb3QgZXhwcmVzc2lvbiB0byBwcmV2ZW50IHByb2Nlc3NpbmcgbXVjaCBvZiB0aGUgdHJlZSBhbmQgdGhlbiBmaW5hbGx5IGZhaWwuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1lc3NhZ2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIG1lc3NhZ2UgYXMgdG8gd2h5IGl0IGlzIGludmFsaWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUSW5zdGFuY2VSZWZlcmVuY2UiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9JSmF2YUluc3RhbmNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uLiBDdXJyZW50bHkgd2Ugb25seSBzdG9yZSB0aGUgJiN4RDsmI3hBO2VudGlyZSBkZWNsYXJhdGlvbiBhcyBhIHN0cmluZywgaW5jbHVkaW5nIHRoZSAmcXVvdDtuZXcgQUNsYXNzKCkgey4uLn0mcXVvdDsuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlY2xhcmF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlY2xhcmF0aW9uIHRleHQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcG9ydHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBpbXBvcnRzIG5lZWRlZCBpbiB0aGUgbWFpbiBjbGFzcyBieSB0aGlzIGRlY2xhcmF0aW9uLiBUaGlzIGlzIGEgdHJhbnNpZW50IGF0dHJpYnV0ZS4gSXQgaXMgbm90IHNlcmlhbGl6ZWQsIG5vciBpcyBpdCBwYXJzZWQgaW50byBmcm9tIGV4aXN0aW5nIGNvZGUuIEl0cyBvbmx5IHB1cnBvc2UgaXMgdG8gaGVscCBjb2RlIGdlbmVyYXRpb24gb24gYSBicmFuZCBuZXcgZGVjbGFyYXRpb24gdG8ga25vdyB3aGF0IGltcG9ydHMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBtYWluIGNsYXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9pbnN0YW5jZS5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2luc3RhbmNlLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWM3NjRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2luc3RhbmNlLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdCIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0uZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSIiIG1vZGVsTmFtZT0iaW5zdGFuY2UiIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24ucHJvdmlkZXIuaW5zdGFuY2VFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5wcmVzZW50YXRpb24uaW5zdGFuY2VFZGl0b3JQbHVnaW4iCi0gICAgdXBkYXRlQ2xhc3NwYXRoPSJmYWxzZSIgYm9vbGVhbkZsYWdzRmllbGQ9ImVGbGFncyIgYm9vbGVhbkZsYWdzUmVzZXJ2ZWRCaXRzPSI4IgotICAgIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5yb3NlIiB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlIj4KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXGluc3RhbmNlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPldvcmtzcGFjZVJvb3Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLjwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJJbnN0YW50aWF0aW9uIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsIiBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiCi0gICAgICBlY29yZVBhY2thZ2U9Imluc3RhbmNlLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvVElNRVMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvRElWSURFIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL1JFTUFJTkRFUiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9QTFVTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL01JTlVTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0xFRlRfU0hJRlQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvUklHSFRfU0hJRlRfU0lHTkVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL1JJR0hUX1NISUZUX1VOU0lHTkVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0xFU1MiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvR1JFQVRFUiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9MRVNTX0VRVUFMUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9HUkVBVEVSX0VRVUFMUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9FUVVBTFMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvTk9UX0VRVUFMUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9YT1IiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvQU5EIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL09SIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0NPTkRJVElPTkFMX0FORCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9DT05ESVRJT05BTF9PUiIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iaW5zdGFuY2UuZWNvcmUjLy9QVFByZWZpeE9wZXJhdG9yIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVFByZWZpeE9wZXJhdG9yL1BMVVMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVFByZWZpeE9wZXJhdG9yL01JTlVTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRQcmVmaXhPcGVyYXRvci9DT01QTEVNRU5UIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRQcmVmaXhPcGVyYXRvci9OT1QiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vSUphdmFEYXRhVHlwZUluc3RhbmNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9JSmF2YUluc3RhbmNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9JSmF2YU9iamVjdEluc3RhbmNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vSW5pdFN0cmluZ0FsbG9jYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vSW5pdFN0cmluZ0FsbG9jYXRpb24vaW5pdFN0cmluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL0ltcGxpY2l0QWxsb2NhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9JbXBsaWNpdEFsbG9jYXRpb24vcGFyZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9JbXBsaWNpdEFsbG9jYXRpb24vZmVhdHVyZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BhcnNlVHJlZUFsbG9jYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BhcnNlVHJlZUFsbG9jYXRpb24vZXhwcmVzc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BURXhwcmVzc2lvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUFjY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUFjY2Vzcy9hcnJheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQXJyYXlBY2Nlc3MvaW5kZXhlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQXJyYXlDcmVhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5Q3JlYXRpb24vdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQXJyYXlDcmVhdGlvbi9kaW1lbnNpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUNyZWF0aW9uL2luaXRpYWxpemVyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUluaXRpYWxpemVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5SW5pdGlhbGl6ZXIvZXhwcmVzc2lvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEJvb2xlYW5MaXRlcmFsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUQm9vbGVhbkxpdGVyYWwvYm9vbGVhblZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRDYXN0RXhwcmVzc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVENhc3RFeHByZXNzaW9uL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVENhc3RFeHByZXNzaW9uL2V4cHJlc3Npb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVENoYXJhY3RlckxpdGVyYWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRDaGFyYWN0ZXJMaXRlcmFsL2VzY2FwZWRWYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRDaGFyYWN0ZXJMaXRlcmFsL2NoYXJWYWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbi9hcmd1bWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRDb25kaXRpb25hbEV4cHJlc3Npb24vY29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRDb25kaXRpb25hbEV4cHJlc3Npb24vdHJ1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uL2ZhbHNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRGaWVsZEFjY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRGaWVsZEFjY2Vzcy9yZWNlaXZlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRGaWVsZEFjY2Vzcy9maWVsZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhFeHByZXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4RXhwcmVzc2lvbi9sZWZ0T3BlcmFuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeEV4cHJlc3Npb24vb3BlcmF0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4RXhwcmVzc2lvbi9yaWdodE9wZXJhbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4RXhwcmVzc2lvbi9leHRlbmRlZE9wZXJhbmRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRJbnN0YW5jZW9mIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEluc3RhbmNlb2Yvb3BlcmFuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRJbnN0YW5jZW9mL3R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVE1ldGhvZEludm9jYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUTWV0aG9kSW52b2NhdGlvbi9yZWNlaXZlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRNZXRob2RJbnZvY2F0aW9uL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVE1ldGhvZEludm9jYXRpb24vYXJndW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFROYW1lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUTmFtZS9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFROdWxsTGl0ZXJhbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFROdW1iZXJMaXRlcmFsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUTnVtYmVyTGl0ZXJhbC90b2tlbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUUGFyZW50aGVzaXplZEV4cHJlc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUUGFyZW50aGVzaXplZEV4cHJlc3Npb24vZXhwcmVzc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4RXhwcmVzc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVFByZWZpeEV4cHJlc3Npb24vb3BlcmF0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVFByZWZpeEV4cHJlc3Npb24vZXhwcmVzc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUU3RyaW5nTGl0ZXJhbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVFN0cmluZ0xpdGVyYWwvZXNjYXBlZFZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVFN0cmluZ0xpdGVyYWwvbGl0ZXJhbFZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRUaGlzTGl0ZXJhbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRUeXBlTGl0ZXJhbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVFR5cGVMaXRlcmFsL3R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEludmFsaWRFeHByZXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUSW52YWxpZEV4cHJlc3Npb24vbWVzc2FnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5zdGFuY2VSZWZlcmVuY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRJbnN0YW5jZVJlZmVyZW5jZS9yZWZlcmVuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uL2RlY2xhcmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24vaW1wb3J0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4YWEzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImphdmEiCi0gICAgbnNVUkk9ImphdmEueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuamVtLmphdmEiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2hhbmdlcyB0byBzeW5jaCB1cCB3aXRoIEphdmEzZTomI3hEOyYjeEE7LSBkZWxldGVkIEphdmFFbGVtZW50LCBCb2R5RWxlbWVudCB3aGljaCBkaWRuJ3QgYWRkIGFueXRoaW5nIHVzZWZ1bCYjeEQ7JiN4QTstIGRlbGV0ZWQgTmVzdGVkQ2xhc3MgYW5kIHRoZSBhc3NvY2lhdGlvbiB3aGljaCBkZXNjcmliZWQgbmVzdGluZywgY29udGVudHMgY2FuIGJlIHVzZWQgaW5zdGVhZCYjeEQ7JiN4QTstIGRlbGV0ZWQgZXh0ZW5kcy9leHRlbmRlZEJ5IHdoaWNoIGlzIHJlcGxhY2VkIHdpdGggTU9GIHN1YnR5cGUvc3VwZXJ0eXBlJiN4RDsmI3hBOy0gZGVsZXRlZCB0aGUgY2x1bXN5IG1haW4gZGlhZ3JhbSYjeEQ7JiN4QTstIG1vdmVkIHRoZSBNT0YgaW5oZXJpdGFuY2UgZGV0YWlscyB0byB0aGUgTU9GIGJpbmRpbmcgZGlhZ3JhbSYjeEQ7JiN4QTstIGRlbGV0ZWQgJnF1b3Q7ZmluYWwmcXVvdDsgb24gSmF2YVBhcmFtZXRlciwgZG9uJ3Qga25vdyB3aGF0IHRoYXQgd2FzIHN1cHBvc2VkIHRvIGJlJiN4RDsmI3hBOy0gZGVsZXRlZCB0aGUgQ2F0ZWdvcnkganVuayYjeEQ7JiN4QTstIGNoYW5nZWQgdGhlIEJsb2NrLXR5cGVkIGF0dHJpYnV0ZXMgb24gRmllbGQsIE1ldGhvZCwgSW5pdGlhbGl6ZXIgdG8gYmUgYXNzb2NpYXRpb25zIHRvIEJsb2NrJiN4RDsmI3hBOyYjeEQ7JiN4QTtPdXRzdGFuZGluZyBxdWVzdGlvbnMvaXNzdWVzOiYjeEQ7JiN4QTstIEphdmFQYXJhbWV0ZXJLaW5kIHNob3VsZCBnbyBhd2F5IGlmIHdlIGdldCB0aGUgYmFzZSBQYXJhbWV0ZXIga2luZCBmaXhlZCB1cCYjeEQ7JiN4QTsiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUNsYXNzIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUNsYXNzIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNOZXN0ZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZpZWxkIiBlVHlwZT0iIy8vRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJmaWVsZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGaWVsZEV4dGVuZGVkIiBlVHlwZT0iIy8vRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIgUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lIGZyb20gdGhpcyBKYXZhQ2xhc3Mgb3IgYW55IHN1cGVydHlwZXMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtSZXR1cm4gbnVsbCBpZiBhIEZpZWxkIG5hbWVkIGZpZWxkTmFtZSBpcyBub3QgZm91bmQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJmaWVsZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGaWVsZE5hbWVkIiBlVHlwZT0iIy8vRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJmaWVsZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGaWVsZHNFeHRlbmRlZCIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhbGwgZmllbGRzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWV0aG9kIiBlVHlwZT0iIy8vTWV0aG9kIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWV0aG9kTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcmFtZXRlclR5cGVzIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLiIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZVBhcmFtZXRlcnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYSBMaXN0IG9mIFN0cmluZ3MgdGhhdCByZXByZXNlbnQgTWV0aG9kRWxlbWVudCBzaWduYXR1cmVzIGZyb20gbW9zdCBnZW5lcmFsIHRvIG1vc3Qgc3BlY2lmaWMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXRob2RFeHRlbmRlZCIgZVR5cGU9IiMvL01ldGhvZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWV0aG9kTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcmFtZXRlclR5cGVzIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLiIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZVBhcmFtZXRlcnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWV0aG9kc0V4dGVuZGVkIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0T25seVNwZWNpZmljTWV0aG9kcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhIExpc3Qgb2YgTWV0aG9kcyB0aGF0IGJlZ2lucyB3aXRoIEBhTWV0aG9kTmFtZVByZWZpeCBhbmQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBAZXhjbHVkZWROYW1lcyBsaXN0LiBJZiBAYU1ldGhvZE5hbWVQcmVmaXggaXMgbnVsbCwgYWxsIG1ldGhvZHMgd2lsbCBiZSByZXR1cm5lZC4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJhTWV0aG9kTmFtZVByZWZpeCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImV4Y2x1ZGVkTmFtZXMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQdWJsaWNNZXRob2QiIGVUeXBlPSIjLy9NZXRob2QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseSBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiAgSXQgd2lsbCBub3QgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1ldGhvZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJhbWV0ZXJUeXBlcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0IG9mIHBhcmFtZXRlciB0eXBlcy4iLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2VQYXJhbWV0ZXJzPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFB1YmxpY01ldGhvZHMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYWxsIG1ldGhvZHMsIGl0IHdpbGwgbm90IGdvIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGFsbCBwdWJsaWMgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFB1YmxpY01ldGhvZHNOYW1lZCIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MsIGhhdmluZyBhIG5hbWUgZXF1YWwgdG8gdGhhdCBvZiB0aGUgcGFyYW1ldGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFN1cGVydHlwZSIgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpbXBsZW1lbnRzSW50ZXJmYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRlc3Qgd2hldGhlciB0aGUgcmVjZWl2ZXIgaW1wbGVtZW50cyB0aGUgcGFzc2VkIGludGVyZmFjZSAob3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImludGVyZmFjZVR5cGUiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpbmZvU3RyaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGEgc3RyaW5nIHNob3dpbmcgb3VyIGRldGFpbHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpbmhlcml0c0Zyb20iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVzdHMgd2hldGhlciB0aGlzIGNsYXNzIGluaGVyaXRzIGZyb20gdGhlIHBhc3NlZCBpbiBjbGFzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImphdmFDbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzRXhpc3RpbmdUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRvZXMgdGhpcyB0eXBlIGV4aXN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNJbnRlcmZhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXMgdGhpcyBhbiBpbnRlcmZhY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRTdXBlcnR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTZXQgdGhlIHN1cGVydHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImphdmFjbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtpbmQiIGVUeXBlPSIjLy9UeXBlS2luZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdWJsaWMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBsZW1lbnRzSW50ZXJmYWNlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2xhc3NJbXBvcnQiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhY2thZ2VJbXBvcnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZpZWxkcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9GaWVsZCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRmllbGQvamF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9NZXRob2QvamF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRpYWxpemVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Jbml0aWFsaXplciIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vSW5pdGlhbGl6ZXIvamF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlY2xhcmVkQ2xhc3NlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhQ2xhc3MiIGVPcHBvc2l0ZT0iIy8vSmF2YUNsYXNzL2RlY2xhcmluZ0NsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlY2xhcmluZ0NsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL0phdmFDbGFzcy9kZWNsYXJlZENsYXNzZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iamF2YVBhY2thZ2UiIGVUeXBlPSIjLy9KYXZhUGFja2FnZSIKLSAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vSmF2YVBhY2thZ2UvamF2YUNsYXNzZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXZlbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFFdmVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWxsRXZlbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFFdmVudCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbml0aWFsaXplciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3RhdGljIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9KYXZhQ2xhc3MvaW5pdGlhbGl6ZXJzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvdXJjZSIgZVR5cGU9IiMvL0Jsb2NrIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFQYXJhbWV0ZXIiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FUGFyYW1ldGVyIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNBcnJheSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIHBhcmFtZXRlciB0eXBlIGFuIGFycmF5IHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc1JldHVybiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGEgcmV0dXJuIHBhcmFtZXRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEphdmFUeXBlIiBlVHlwZT0iIy8vSlR5cGVKYXZhSGVscGVycyIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRRdWFsaWZpZWROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbWV0ZXJLaW5kIiBlVHlwZT0iIy8vSmF2YVBhcmFtZXRlcktpbmQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU9wZXJhdGlvbiI+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldENvbnRhaW5pbmdKYXZhQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gdGhlIGphdmEgY2xhc3MgdGhhdCB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhIFN0cmluZyB3aXRoIHRoZSB0aGUgbWV0aG9kIG5hbWUgYW5kIGl0cyBwYXJhbWV0ZXJzLiBlLmcuICZsdDtjb2RlPiBzZXRGaXJzdE5hbWUoamF2YS5sYW5nLlN0cmluZykgJmx0Oy9jb2RlPiAuJiN4RDsmI3hBOyAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBhcmFtZXRlciIgZVR5cGU9IiMvL0phdmFQYXJhbWV0ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYSBQYXJhbWV0ZXIgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJhbWV0ZXJOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UmV0dXJuVHlwZSIgZVR5cGU9IiMvL0pUeXBlSmF2YUhlbHBlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHZXQgdGhlIHJldHVybiB0eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0UmV0dXJuVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0aGUgcmV0dXJuIHR5cGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InR5cGUiIGVUeXBlPSIjLy9KVHlwZUphdmFIZWxwZXJzIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0U2lnbmF0dXJlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC50b1N0cmluZygpLiYjeEQ7JiN4QTsmI3hEOyYjeEE7UmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgTWV0aG9kLiAgVGhlIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgdGhlIG1ldGhvZCBhY2Nlc3MgbW9kaWZpZXJzLCBpZiBhbnksIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgcmV0dXJuIHR5cGUsIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSBjbGFzcyBkZWNsYXJpbmcgdGhlIG1ldGhvZCwgZm9sbG93ZWQgYnkgYSBwZXJpb2QsIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgbmFtZSwgZm9sbG93ZWQgYnkgYSBwYXJlbnRoZXNpemVkLCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbWV0aG9kJ3MgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG1ldGhvZCB0aHJvd3MgY2hlY2tlZCBleGNlcHRpb25zLCB0aGUgcGFyYW1ldGVyIGxpc3QgaXMgZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIHdvcmQgdGhyb3dzIGZvbGxvd2VkIGJ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRocm93biBleGNlcHRpb24gdHlwZXMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtGb3IgZXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBwdWJsaWMgYm9vbGVhbiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KSYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGFjY2VzcyBtb2RpZmllcnMgYXJlIHBsYWNlZCBpbiBjYW5vbmljYWwgb3JkZXIgYXMgc3BlY2lmaWVkIGJ5ICZxdW90O1RoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24mcXVvdDsuICBUaGlzIGlzIHB1YmxpYywgJmx0O3R0PnByb3RlY3RlZCZsdDsvdHQ+IG9yICZsdDt0dD5wcml2YXRlJmx0Oy90dD4gZmlyc3QsIGFuZCB0aGVuIG90aGVyIG1vZGlmaWVycyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiAmbHQ7dHQ+YWJzdHJhY3QmbHQ7L3R0PiwgJmx0O3R0PnN0YXRpYyZsdDsvdHQ+LCAmbHQ7dHQ+ZmluYWwmbHQ7L3R0PiwgJmx0O3R0PnN5bmNocm9uaXplZCZsdDsvdHQ+ICZsdDt0dD5uYXRpdmUmbHQ7L3R0Pi4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc0dlbmVyYXRlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBzeXN0ZW0gZ2VuZXJhdGVkLiYjeEQ7JiN4QTtUaGlzIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgQGdlbmVyYXRlZCB0YWcgaW4gdGhlIGNvbW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRJc0dlbmVyYXRlZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0aGUgaXNHZW5lcmF0ZWQgZmxhZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImdlbmVyYXRlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc1ZvaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXMgdGhpcyBhIHZvaWQgcmV0dXJuIHR5cGUgbWV0aG9kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWJzdHJhY3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hdGl2ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3luY2hyb25pemVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RydWN0b3IiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXRpYyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YVZpc2liaWxpdHkiIGVUeXBlPSIjLy9KYXZhVmlzaWJpbGl0eUtpbmQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFyYW1ldGVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhUGFyYW1ldGVyIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhRXhjZXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iamF2YUNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vSmF2YUNsYXNzL21ldGhvZHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic291cmNlIiBlVHlwZT0iIy8vQmxvY2siLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmllbGQiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FVHlwZWRFbGVtZW50Ij4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgY2xhc3MgdGhhdCB0aGlzIGZpZWxkIGlzIHdpdGhpbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzQXJyYXkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXMgdGhpcyBmaWVsZCBhbiBhcnJheSB0eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXRpYyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YVZpc2liaWxpdHkiIGVUeXBlPSIjLy9KYXZhVmlzaWJpbGl0eUtpbmQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNpZW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2b2xhdGlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iamF2YUNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vSmF2YUNsYXNzL2ZpZWxkcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbml0aWFsaXplciIgZVR5cGU9IiMvL0Jsb2NrIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlR5cGVLaW5kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTkRFRklORUQ9MSBDTEFTUz0yIElOVEVSRkFDRT0zIEVYQ0VQVElPTj00Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJVTkRFRklORUQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNMQVNTIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5URVJGQUNFIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRVhDRVBUSU9OIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCbG9jayI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvdXJjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jsb2NrIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21tZW50IiBlU3VwZXJUeXBlcz0iIy8vQmxvY2siLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGF0ZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9CbG9jayIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFQYWNrYWdlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVBhY2thZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhQ2xhc3NlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhQ2xhc3MiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0phdmFDbGFzcy9qYXZhUGFja2FnZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkphdmFWaXNpYmlsaXR5S2luZCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUEFDS0FHRT0xJiN4RDsmI3hBO1BVQkxJQz0yJiN4RDsmI3hBO1BSSVZBVEU9MyYjeEQ7JiN4QTtQUk9URUNURUQ9NCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUFVCTElDIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQUklWQVRFIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUFJPVEVDVEVEIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUEFDS0FHRSIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJKYXZhUGFyYW1ldGVyS2luZCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSU49MCYjeEQ7JiN4QTtPVVQ9MSYjeEQ7JiN4QTtJTk9VVD0yJiN4RDsmI3hBO1JFVFVSTj0zIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1VUIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5PVVQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSRVRVUk4iIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFEYXRhVHlwZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VDbGFzcyI+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldERlZmF1bHRWYWx1ZVN0cmluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmltaXRpdmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnJheVR5cGUiIGVTdXBlclR5cGVzPSIjLy9KYXZhQ2xhc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBhIEphdmEgQXJyYXkgdHlwZSYjeEQ7JiN4QTsgICBGb3IgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLCBpdCBpcyB1bmxpa2VseSB0aGF0IHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlJiN4RDsmI3hBOyAgIHNwZWNpZmllZCBkaXJlY3RseS4gIFRoaXMgd291bGQgcmVxdWlyZSBpbnN0YW50aWF0aW5nIGEgY2hhaW4gb2YgY29tcG9uZW50IHR5cGVzJiN4RDsmI3hBOyAgIHN1Y2ggYXMgU3RyaW5nW11bXVtdW10tPlN0cmluZ1tdW11bXS0+U3RyaW5nW11bXS0+U3RyaW5nW10tPlN0cmluZy4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgVGhlIGNvbXBvbmVudCB0eXBlIHJlbGF0aW9uc2hpcCB3aWxsIGJlIGNvbXB1dGVkIGlmIHRoZSBmaW5hbENvbXBvbmVudFR5cGUmI3hEOyYjeEE7ICBhbmQgYXJyYXkgZGltZW5zaW9ucyBpcyBzcGVjaWZpZWQuJiN4RDsmI3hBOyAmI3hEOyYjeEE7ICBGb3IgdGhpcyByZWFzb24sIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGNyZWF0ZSBpcyB0aHJvdWdoIHRoZSBKYXZhUmVmRmFjdG9yeSBmYWN0b3J5IG1ldGhvZDomI3hEOyYjeEE7ICAgICAgIGNyZWF0ZUFycmF5VHlwZShKYXZhQ2xhc3MgZmluYWxDb21wb25lbnRUeXBlLCBpbnQgZGltZW5zaW9ucykiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RmluYWxDb21wb25lbnRUeXBlIiBlVHlwZT0iIy8vSlR5cGVKYXZhSGVscGVycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgZmluYWwgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgQXJyYXkgVHlwZS4mI3hEOyYjeEE7JiN4RDsmI3hBO0luIG9yZGVyIHRvIGVuc3VyZSBhIHVuaXF1ZSBpbnN0YW5jZSwgd2Ugd2lsbCByZXNvbHZlIHRoaXMgdHlwZSB1c2luZyByZWZsZWN0aW9uLiBJdCB0dXJucyBvdXQgdG8gYmUgbW9zdCBlZmZpY2llbnQgdG8ganVzdCBkbyB0aGlzIGJ5IHRyaW1taW5nIHRoZSBuYW1lLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyIiBlVHlwZT0iIy8vSlR5cGVKYXZhSGVscGVycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhpcyBhcnJheS4gJiN4RDsmI3hBOyYjeEQ7JiN4QTtJZiB0aGlzIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXksIHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlIHRoZSBuZXN0ZWQgYXJyYXkgdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzUHJpbWl0aXZlQXJyYXkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXMgdGhpcyBhbiBhcnJheSBvZiBqYXZhIHByaW1pdGl2ZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldENvbXBvbmVudFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTZXQgdGhlIGNvbXBvbmVudCB0eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iaGVscGVyQ29tcG9uZW50VHlwZSIgZVR5cGU9IiMvL0pUeXBlSmF2YUhlbHBlcnMiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcnJheURpbWVuc2lvbnMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tcG9uZW50VHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQ2xhc3NpZmllciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJKVHlwZUphdmFIZWxwZXJzIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaW50ZXJmYWNlIGlzIGEgY29tbW9uIGludGVyZmFjZSBiZXR3ZWVuIEphdmFDbGFzcyBhbmQgSmF2YURhdGFUeXBlIHBsdXMgc29tZSBjb21tb24gaGVscGVyIG1ldGhvZHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkpUeXBlTGlzdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJqYXZhLnV0aWwuTGlzdCB0eXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFFdmVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RydWN0dXJhbEZlYXR1cmUiLz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhTW9kZWwuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhTW9kZWwuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NGZkNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YU1vZGVsLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0uZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9IiIgbW9kZWxOYW1lPSJKYXZhIiBtb2RlbFBsdWdpbkNsYXNzPSIiIGVkaXRQbHVnaW5DbGFzcz0iamF2YS5wcm92aWRlci5KYXZhRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0iamF2YS5wcmVzZW50YXRpb24uSmF2YUVkaXRvclBsdWdpbiIgdXBkYXRlQ2xhc3NwYXRoPSJmYWxzZSIKLSAgICBib29sZWFuRmxhZ3NGaWVsZD0iZUZsYWdzIiBib29sZWFuRmxhZ3NSZXNlcnZlZEJpdHM9IjgiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUiPgotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcamF2YU1vZGVsLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPldvcmtzcGFjZVJvb3Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLjwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJKYXZhUmVmIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuamVtIiBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiCi0gICAgICBlY29yZVBhY2thZ2U9ImphdmEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iamF2YS5lY29yZSMvL1R5cGVLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL1R5cGVLaW5kL1VOREVGSU5FRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vVHlwZUtpbmQvQ0xBU1MiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL1R5cGVLaW5kL0lOVEVSRkFDRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vVHlwZUtpbmQvRVhDRVBUSU9OIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJqYXZhLmVjb3JlIy8vSmF2YVZpc2liaWxpdHlLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFWaXNpYmlsaXR5S2luZC9QVUJMSUMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFWaXNpYmlsaXR5S2luZC9QUklWQVRFIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhVmlzaWJpbGl0eUtpbmQvUFJPVEVDVEVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhVmlzaWJpbGl0eUtpbmQvUEFDS0FHRSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXJLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXJLaW5kL0lOIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyS2luZC9PVVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXJLaW5kL0lOT1VUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyS2luZC9SRVRVUk4iLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iamF2YS5lY29yZSMvL0pUeXBlSmF2YUhlbHBlcnMiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImphdmEuZWNvcmUjLy9KVHlwZUxpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2tpbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL3B1YmxpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZmluYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbXBsZW1lbnRzSW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2NsYXNzSW1wb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvcGFja2FnZUltcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9maWVsZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9tZXRob2RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW5pdGlhbGl6ZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZGVjbGFyZWRDbGFzc2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZGVjbGFyaW5nQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvamF2YVBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9ldmVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9hbGxFdmVudHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2lzTmVzdGVkIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRGaWVsZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkL2ZpZWxkTmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGRFeHRlbmRlZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkRXh0ZW5kZWQvZmllbGROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRGaWVsZE5hbWVkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGROYW1lZC9maWVsZE5hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkc0V4dGVuZGVkIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2QiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2QvbWV0aG9kTmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2QvcGFyYW1ldGVyVHlwZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2RFeHRlbmRlZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZEV4dGVuZGVkL21ldGhvZE5hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kRXh0ZW5kZWQvcGFyYW1ldGVyVHlwZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZHNFeHRlbmRlZCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0T25seVNwZWNpZmljTWV0aG9kcyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE9ubHlTcGVjaWZpY01ldGhvZHMvYU1ldGhvZE5hbWVQcmVmaXgiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0T25seVNwZWNpZmljTWV0aG9kcy9leGNsdWRlZE5hbWVzIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2QiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2QvbWV0aG9kTmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2QvcGFyYW1ldGVyVHlwZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZHNFeHRlbmRlZCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0UHVibGljTWV0aG9kc05hbWVkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0UHVibGljTWV0aG9kc05hbWVkL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFN1cGVydHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW1wbGVtZW50c0ludGVyZmFjZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2ltcGxlbWVudHNJbnRlcmZhY2UvaW50ZXJmYWNlVHlwZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW5mb1N0cmluZyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW5oZXJpdHNGcm9tIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW5oZXJpdHNGcm9tL2phdmFDbGFzcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaXNFeGlzdGluZ1R5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2lzSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9zZXRTdXBlcnR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9zZXRTdXBlcnR5cGUvamF2YWNsYXNzIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9Jbml0aWFsaXplciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0luaXRpYWxpemVyL2lzU3RhdGljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9Jbml0aWFsaXplci9qYXZhQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9Jbml0aWFsaXplci9zb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyL2ZpbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIvcGFyYW1ldGVyS2luZCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyL2lzQXJyYXkiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlci9pc1JldHVybiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyL2dldEphdmFUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIvZ2V0UXVhbGlmaWVkTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vTWV0aG9kIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL2Fic3RyYWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL01ldGhvZC9uYXRpdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL3N5bmNocm9uaXplZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2QvZmluYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL2NvbnN0cnVjdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL01ldGhvZC9zdGF0aWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL2phdmFWaXNpYmlsaXR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9NZXRob2QvcGFyYW1ldGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vTWV0aG9kL2phdmFFeGNlcHRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9NZXRob2QvamF2YUNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vTWV0aG9kL3NvdXJjZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0UGFyYW1ldGVyIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0UGFyYW1ldGVyL3BhcmFtZXRlck5hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL2dldFJldHVyblR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL3NldFJldHVyblR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL01ldGhvZC9zZXRSZXR1cm5UeXBlL3R5cGUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL2dldFNpZ25hdHVyZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvaXNHZW5lcmF0ZWQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL3NldElzR2VuZXJhdGVkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9NZXRob2Qvc2V0SXNHZW5lcmF0ZWQvZ2VuZXJhdGVkIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9pc1ZvaWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0ZpZWxkIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vRmllbGQvZmluYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vRmllbGQvc3RhdGljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0ZpZWxkL2phdmFWaXNpYmlsaXR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0ZpZWxkL3RyYW5zaWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9GaWVsZC92b2xhdGlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vRmllbGQvamF2YUNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9GaWVsZC9pbml0aWFsaXplciIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9GaWVsZC9nZXRDb250YWluaW5nSmF2YUNsYXNzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0ZpZWxkL2lzQXJyYXkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0Jsb2NrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vQmxvY2svc291cmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0Jsb2NrL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0Jsb2NrL2NvbnRlbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9Db21tZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL1N0YXRlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9KYXZhUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhUGFja2FnZS9qYXZhQ2xhc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vSmF2YURhdGFUeXBlIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YURhdGFUeXBlL2dldERlZmF1bHRWYWx1ZVN0cmluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vQXJyYXlUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL2FycmF5RGltZW5zaW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0FycmF5VHlwZS9jb21wb25lbnRUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0FycmF5VHlwZS9nZXRGaW5hbENvbXBvbmVudFR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL2dldENvbXBvbmVudFR5cGVBc0hlbHBlciIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9BcnJheVR5cGUvaXNQcmltaXRpdmVBcnJheSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9BcnJheVR5cGUvc2V0Q29tcG9uZW50VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL3NldENvbXBvbmVudFR5cGUvaGVscGVyQ29tcG9uZW50VHlwZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vSmF2YUV2ZW50Ii8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9qYXZhYWRhcHRlcnMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvamF2YWFkYXB0ZXJzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTFiNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9qYXZhYWRhcHRlcnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL2phdmFhZGFwdGVycy5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8wMy8yNSAxMzoxMjo1MiAkCi0jCi0KLUZhaWxlZF9yZWZsZWN0aW5nX3ZhbHVlc19FUlJPUl8gICAgICAgPSBJV0FWMDAwMkUgRmFpbGVkIHJlZmxlY3RpbmcgdmFsdWVzLiBDaGVjayBjbGFzc3BhdGguCi1Db3VsZF9Ob3RfUmVmbGVjdF9NZXRob2RzX0VSUk9SXyAgICAgID0gSVdBVjAwMDNFIENvdWxkIG5vdCByZWZsZWN0IG1ldGhvZHMgZm9yIHswfSBiZWNhdXNlIG9uZSBvZiB0aGUgbWV0aG9kcyByZWZlcmVuY2VzIGEgdHlwZSB0aGF0IGNvdWxkIG5vdCBiZSBsb2FkZWQuICBFeGNlcHRpb246IHsxfSBDaGVjayBjbGFzc3BhdGguCi1Db3VsZF9Ob3RfUmVmbGVjdF9Db25zdHJ1Y3RvcnNfRVJST1JfID0gSVdBVjAxNDJFIENvdWxkIG5vdCByZWZsZWN0IGNvbnN0cnVjdG9ycyBmb3IgezB9IGJlY2F1c2Ugb25lIG9mIHRoZSBtZXRob2RzIHJlZmVyZW5jZXMgYSB0eXBlIHRoYXQgY291bGQgbm90IGJlIGxvYWRlZC4gIEV4Y2VwdGlvbjogezF9IENoZWNrIGNsYXNzcGF0aC4KLUNvdWxkX05vdF9SZWZsZWN0X0ZpZWxkc19FUlJPUl8gICAgICAgPSBJV0FWMDE0M0UgQ291bGQgbm90IHJlZmxlY3QgZmllbGRzIGZvciB7MH0gYmVjYXVzZSBvbmUgb2YgdGhlIGZpZWxkcyBpcyBhIHR5cGUgdGhhdCBjb3VsZCBub3QgYmUgbG9hZGVkLiBFeGNlcHRpb246IHsxfSBDaGVjayBjbGFzc3BhdGguCi1FcnJvcl9Mb29raW5nX1VwX1R5cGVfRVJST1JfICAgICAgICAgID0gSVdBVjAxNDRFIEVycm9yIGxvb2tpbmcgdXAgdHlwZSB7MH0uICBFeGNlcHRpb246IHsxfSBDaGVjayBjbGFzc3BhdGguCi1FcnJvcl9JbnRyb3NwZWN0aW5nX0ZsYWdzX0VSUk9SXyAgICAgID0gSVdBVjAxNDVFIEVycm9yIGludHJvc3BlY3RpbmcgZmxhZ3Mgb24gezB9LiAgRXhjZXB0aW9uOiB7MX0KLUVycm9yX1NldHRpbmdfR2VuRmxhZ19FUlJPUl8gICAgICAgICAgPSBJV0FWMDE1M0UgRXJyb3Igc2V0dGluZyB0aGUgZ2VuZXJhdGVkIGZsYWcgb24gezB9LiAgRXhjZXB0aW9uOiB7MX0KLUphdmFfSW5oX0N5Y2xlX0VSUk9SXyAgICAgICAgICAgICAgICAgPSBJV0FWMDE1NEUgRGV0ZWN0ZWQgYW4gaW5oZXJpdGFuY2UgY3ljbGUgd2hlbiB7MH0gdHJ5cyB0byBleHRlbmQgezF9LgotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvY29yZS9KRU1QbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2NvcmUvSkVNUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Y2U2Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvY29yZS9KRU1QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkVjbGlwc2VMb2dnZXI7Ci0KLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5qZW0gcGx1Z2luCi0gKi8KLXB1YmxpYyBjbGFzcyBKRU1QbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JcHJpdmF0ZSBzdGF0aWMgSkVNUGx1Z2luIFBMVUdJTjsKLQlwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qZW0iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIEpFTVBsdWdpbigpIHsKLQkJUExVR0lOID0gdGhpczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKRU1QbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gUExVR0lOOwotCX0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCWxvZ2dlciA9IEVjbGlwc2VMb2dnZXIuZ2V0RWNsaXBzZUxvZ2dlcih0aGlzKTsJCQotCX0KLQkKLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIFBMVUdJTl9JRDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSAsIGV4Y2VwdGlvbikpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlICwgZXhjZXB0aW9uKSk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSUphdmFDbGFzc0FkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSUphdmFDbGFzc0FkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwNjY3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0lKYXZhQ2xhc3NBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLQotCi0gKi8KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzI3LzIwMDEgMToxNzo0NiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YUNsYXNzQWRhcHRvciB7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBzb3VyY2VUeXBlIGlzIG51bGwgb3IgaWYKLSAqIGl0IGlzIGEgYmluYXJ5IHR5cGUuCi0gKi8KLWJvb2xlYW4gaXNTb3VyY2VUeXBlRnJvbUJpbmFyeSgpIDsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZVR5cGUgY2FuIGJlIGZvdW5kLgotICovCi1ib29sZWFuIHNvdXJjZVR5cGVFeGlzdHMoKSA7Ci0KLS8qKgotICogUmVmbGVjdCB0aGUgZmllbGRzCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlZmxlY3Rpb24gb2NjdXJyZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1ib29sZWFuIHJlZmxlY3RGaWVsZHNJZk5lY2Vzc2FyeSgpOwkKLQotLyoqCi0gKiBSZWZsZWN0IHRoZSBtZXRob2RzLgotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWZsZWN0aW9uIG9jY3VycmVkLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotYm9vbGVhbiByZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCk7Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSUphdmFNZXRob2RBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0lKYXZhTWV0aG9kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGRiMDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSUphdmFNZXRob2RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLSAKLQotLyoqCi0gKiBVc2VkIHRvIHJlZmxlY3QgbWV0aG9kcwotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFNZXRob2RBZGFwdGVyIHsKLQotCS8qKgotCSAqIFJlZmxlY3QgdGhlIGdlbmVyYXRlZCBpZiBuZWNlc3NhcnkuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWZsZWN0aW9uIG9jY3VycmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RHZW5lcmF0ZWRJZk5lY2Vzc2FyeSgpOwotCQotCS8qKgotCSAqIFJlZmxlY3QgdGhlIG5hbWVzIG9mIHRoZSBtZXRob2QgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnkuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWZsZWN0aW9uIG9jY3VycmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RQYXJhbU5hbWVzSWZOZWNlc3NhcnkoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSW50ZXJuYWxSZWFkQWRhcHRhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0ludGVybmFsUmVhZEFkYXB0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2M0NzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSW50ZXJuYWxSZWFkQWRhcHRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLQotCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJbnRlcm5hbFJlYWRBZGFwdGFibGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciB7Ci0vKioKLSAqIEltcGxlbWVudGVycyBvZiB0aGlzIGludGVyZmFjZSBuZWVkIHRvIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBtZXRob2QKLSAqIGltcGxlbWVudGF0aW9uczoKLSAqIHB1YmxpYyBPYmplY3QgcHJpbVJlZlZhbHVlKEVPYmplY3QgYSkgewotICoJcmV0dXJuIHN1cGVyLmdldFZhbHVlKGEpOwotICogfQotICogcHVibGljIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IGEpIHsKLSAqCXJldHVybiBSZWZsZWN0aW9uQWRhcHRvci5nZXRWYWx1ZSh0aGlzLCBhKTsKLSAqIH0KLSAqLwotLy9wdWJsaWMgT2JqZWN0IHByaW1SZWZWYWx1ZShFT2JqZWN0IGEpOwotdm9pZCBzZXRSZWZsZWN0ZWQoYm9vbGVhbiBhQm9vbGVhbik7Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFBcnJheVR5cGVSZWZsZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGUxYTY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5BcnJheVR5cGVJbXBsOwotCi0vKioKLSAqIEFycmF5IHR5cGUgcmVmbGVjdGlvbiBhZGFwdGVyLiBTaW5jZSBhcnJheXMgYXJlIHZlcnkgY29uc3RhbnQgd2UgZG9uJ3QgbmVlZCBhbnkgZmFuY3kgcmVmbGVjdGlvbiB0byB0aGUgc291cmNlIHR5cGUgKGNsYXNzIG9iamVjdCkuIEl0IHJlYWxseQotICogZG9lc24ndCBkbyBhbnl0aGluZy4gSXQgaXMganVzdCBoZXJlIHNvIHRoYXQgaXQgZXhpc3RzLiBFdmVyeXRoaW5nIGlzIGNvbnN0YW50IG9yIGRlcGVuZHMgb24gdGhlIGZpbmFsIGNvbXBvbmVudCB0eXBlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFBcnJheVR5cGVSZWZsZWN0aW9uQWRhcHRlciBleHRlbmRzIEphdmFSZWZsZWN0aW9uQWRhcHRvciBpbXBsZW1lbnRzIElKYXZhQ2xhc3NBZGFwdG9yIHsKLQotCXB1YmxpYyBKYXZhQXJyYXlUeXBlUmVmbGVjdGlvbkFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjZ2V0UmVmbGVjdGlvblNvdXJjZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWZsZWN0aW9uU291cmNlKCkgewotCQlyZXR1cm4gbnVsbDsgLy8gVGhlcmUgaXNuJ3QgYW55IGZvciBhcnJheXMuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjaGFzUmVmbGVjdGlvblNvdXJjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdmFsaWQsIHNvIHdlIHBhc3Mgb24gdG8gdXNlIHRoZSBmaW5hbCBjb21wb25lbnQuCi0JCUFycmF5VHlwZSBqaCA9IChBcnJheVR5cGUpIGdldFRhcmdldCgpOwotCQlKYXZhSGVscGVycyBmYyA9IGpoLmdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQlyZXR1cm4gKGZjLmlzUHJpbWl0aXZlKCkgfHwgKChKYXZhQ2xhc3MpIGZjKS5pc0V4aXN0aW5nVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJQXJyYXlUeXBlIGpoID0gKEFycmF5VHlwZSkgZ2V0VGFyZ2V0KCk7Ci0JCUphdmFIZWxwZXJzIGZjID0gamguZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0JCWlmKGZjLmlzUHJpbWl0aXZlKCkpCi0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJZWxzZSB7Ci0JCSAgICBKYXZhUmVmbGVjdGlvbkFkYXB0b3IgcmVmbGVjdGlvbkFkYXB0b3IgPSAoSmF2YVJlZmxlY3Rpb25BZGFwdG9yKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGZjLCBSZWZsZWN0aW9uQWRhcHRvci5UWVBFX0tFWSk7Ci0JCSAgICByZXR1cm4gKHJlZmxlY3Rpb25BZGFwdG9yICE9IG51bGwpID8gcmVmbGVjdGlvbkFkYXB0b3IuaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpIDogZmFsc2U7CQkgICAgCi0JCX0gCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWZsZWN0aW9uQWRhcHRvciNyZWZsZWN0VmFsdWVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlBcnJheVR5cGVJbXBsIGF0ID0gKEFycmF5VHlwZUltcGwpIGdldFRhcmdldCgpOwotCi0JCS8vIEFycmF5cyBhcmUgYWx3YXlzOgotCQkvLwkJZmluYWwKLQkJLy8JCVN1cGVydHlwZSBvZiBqYXZhLmxhbmcuT2JqZWN0Ci0JCS8vCQlpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0JCWF0LnNldEZpbmFsKHRydWUpOwotCQl0cnkgewotCQkJYXQuc2V0U3VwZXJ0eXBlKChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiamF2YS5sYW5nLk9iamVjdCIsIChFT2JqZWN0KSBnZXRUYXJnZXQoKSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gZSkgewotCQl9Ci0JCUxpc3QgbGlzdCA9IGF0LmdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCk7Ci0JCWxpc3QuYWRkKEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5sYW5nLkNsb25lYWJsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlsaXN0LmFkZChKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEuaW8uU2VyaWFsaXphYmxlIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdXBlci5yZWZsZWN0VmFsdWVzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaFJlZmxlY3RlZFZhbHVlcyhib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQkJQXJyYXlUeXBlSW1wbCBhdCA9IChBcnJheVR5cGVJbXBsKSBnZXRUYXJnZXQoKTsKLQkJYXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXNHZW4oKS5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YUNsYXNzQWRhcHRvciNpc1NvdXJjZVR5cGVGcm9tQmluYXJ5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NvdXJjZVR5cGVGcm9tQmluYXJ5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFDbGFzc0FkYXB0b3IjcmVmbGVjdEZpZWxkc0lmTmVjZXNzYXJ5KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVmbGVjdEZpZWxkc0lmTmVjZXNzYXJ5KCkgewotCQlyZXR1cm4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFDbGFzc0FkYXB0b3IjcmVmbGVjdE1ldGhvZHNJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlZmxlY3RNZXRob2RzSWZOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YUNsYXNzQWRhcHRvciNzb3VyY2VUeXBlRXhpc3RzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzb3VyY2VUeXBlRXhpc3RzKCkgewotCQlyZXR1cm4gaGFzUmVmbGVjdGlvblNvdXJjZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTM3NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8vIE1haW50YWluIGEgbWFwcGluZyBvZiB0aGUgc291cmNlIG9iamVjdHMgdG8gdGhlIGFkYXB0b3JzIHdoaWNoIGhhdmUKLQkvLyByZWxmZWN0ZWQgZnJvbSB0aGVtLiAgVGhpcyBhbGxvd3MgYSBmbHVzaCBvcGVyYXRpb24gdG8gZm9yY2UgdGhvc2UKLQkvLyBhZGFwdGVycyB0byByZS1yZWZsZWN0LgotCXByb3RlY3RlZCBIYXNoTWFwIHJlZmxlY3RlZCA9IG5ldyBIYXNoTWFwKCk7Ci0JLyoqCi0JICogS2V5IGZvciB0aGUgdHlwZSBvZiBhZGFwdGVycyB0aGF0IHRoaXMgZmFjdG9yeSBjcmVhdGVzLiAoVXNlZCBpbiBpc0ZhY3RvcnlGb3JUeXBlKCkpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfS0VZID0gUmVhZEFkYXB0b3IuVFlQRV9LRVk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIE1hcCByZWdpc3RlclF1ZXVlOwotCXByb3RlY3RlZCBMaXN0IHVucmVnaXN0ZXJRdWV1ZTsKLS8qKgotICogSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSgpIHsKLQlzdXBlcigpOwotfQotcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQlSZWZsZWN0aW9uQWRhcHRvciBhZGFwdGVyID0gbnVsbDsKLQlFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSB0YXJnZXQ7Ci0JSmF2YVJlZlBhY2thZ2UgcGFjayA9IGdldEphdmFSZWZQYWNrYWdlKCk7Ci0JaWYgKG9iamVjdC5lQ2xhc3MoKSA9PSBwYWNrLmdldEphdmFDbGFzcygpKQotCQlhZGFwdGVyID0gY3JlYXRlSmF2YUNsYXNzQWRhcHRvcih0YXJnZXQpOwotCWVsc2UKLQkJaWYgKG9iamVjdC5lQ2xhc3MoKSA9PSBwYWNrLmdldEFycmF5VHlwZSgpKQotCQkJYWRhcHRlciA9IGNyZWF0ZUFycmF5VHlwZUFkYXB0b3IodGFyZ2V0KTsKLQkJZWxzZQotCQkJaWYgKG9iamVjdC5lQ2xhc3MoKSA9PSBwYWNrLmdldE1ldGhvZCgpKQotCQkJCWFkYXB0ZXIgPSBjcmVhdGVKYXZhTWV0aG9kQWRhcHRvcih0YXJnZXQpOwotCQkJZWxzZQotCQkJCWlmIChvYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRGaWVsZCgpKQotCQkJCQlhZGFwdGVyID0gY3JlYXRlSmF2YUZpZWxkQWRhcHRvcih0YXJnZXQpOwotCXJldHVybiBhZGFwdGVyOwotfQotCi1wcm90ZWN0ZWQgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlQXJyYXlUeXBlQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQlyZXR1cm4gbmV3IEphdmFBcnJheVR5cGVSZWZsZWN0aW9uQWRhcHRlcih0YXJnZXQpOwotfQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YUNsYXNzQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIDsKLXByb3RlY3RlZCBhYnN0cmFjdCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhRmllbGRBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgOwotcHJvdGVjdGVkIGFic3RyYWN0IFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFNZXRob2RBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgOwotLy8gRmx1c2ggdGhlIGFkYXB0ZXIgZm9yIGEgc291cmNlIG9iamVjdAotcHVibGljIE5vdGlmaWNhdGlvbiBkaXNBc3NvY2lhdGVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCXJldHVybiBkaXNBc3NvY2lhdGVTb3VyY2Uoc291cmNlLCB0cnVlKTsKLX0KLQotcHVibGljIE5vdGlmaWNhdGlvbiBkaXNBc3NvY2lhdGVTb3VyY2UoU3RyaW5nIHNvdXJjZSwgYm9vbGVhbiBkb05vdGlmeSkgewotCUphdmFSZWZsZWN0aW9uQWRhcHRvciBhID0gKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgcmVmbGVjdGVkLmdldChzb3VyY2UpOwotCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBudWxsOwotCWlmIChhICE9IG51bGwpIHsKLQkJaWYgKGRvTm90aWZ5KQotCQkJYS5yZWxlYXNlU291cmNlVHlwZSgpOwotCQllbHNlCi0JCQlub3RpZmljYXRpb24gPSBhLnJlbGVhc2VTb3VyY2VUeXBlTm9Ob3RpZmljYXRpb24oKTsKLQl9Ci0JcmV0dXJuIG5vdGlmaWNhdGlvbjsKLX0KLXB1YmxpYyB2b2lkIGZsdXNoQWxsKCkge30KLS8vIEZsdXNoIHRoZSBhZGFwdGVyIGZvciBhIHNvdXJjZSBvYmplY3QKLXB1YmxpYyB2b2lkIGZsdXNoUmVmbGVjdGlvbihTdHJpbmcgc291cmNlKSB7fQotcHJvdGVjdGVkIEphdmFSZWZQYWNrYWdlIGdldEphdmFSZWZQYWNrYWdlKCkgewotCXJldHVybiAoSmF2YVJlZlBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwotfQotcHVibGljIHZvaWQgcmVnaXN0ZXJSZWZsZWN0aW9uKFN0cmluZyBzb3VyY2UsIFJlZmxlY3Rpb25BZGFwdG9yIGFkYXB0ZXIpIHsKLQlpZiAoaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkKSB7Ci0JCWlmIChyZWdpc3RlclF1ZXVlID09IG51bGwpCi0JCQlyZWdpc3RlclF1ZXVlID0gbmV3IEhhc2hNYXAoKTsKLQkJcmVnaXN0ZXJRdWV1ZS5wdXQoc291cmNlLCBhZGFwdGVyKTsKLQl9IGVsc2UKLQkJcmVmbGVjdGVkLnB1dChzb3VyY2UsIGFkYXB0ZXIpOwotfQotcHVibGljIHZvaWQgdW5yZWdpc3RlclJlZmxlY3Rpb24oU3RyaW5nIHNvdXJjZSkgewotCWlmIChpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQpIHsKLQkJaWYgKHVucmVnaXN0ZXJRdWV1ZSA9PSBudWxsKQotCQkJdW5yZWdpc3RlclF1ZXVlID0gbmV3IEFycmF5TGlzdCgpOwotCQl1bnJlZ2lzdGVyUXVldWUuYWRkKHNvdXJjZSk7Ci0JfSBlbHNlCi0JCXJlZmxlY3RlZC5yZW1vdmUoc291cmNlKTsKLX0KLXB1YmxpYyB2b2lkIGRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihTdHJpbmcgc291cmNlKSB7Ci0JZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKHNvdXJjZSwgdHJ1ZSk7Ci19Ci0KLXB1YmxpYyBOb3RpZmljYXRpb24gZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKFN0cmluZyBzb3VyY2UsIGJvb2xlYW4gZG9Ob3RpZnkpIHsKLQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBudWxsOwotCXRyeSB7Ci0JCVN0cmluZyBpbm5lck5hbWUgPSBzb3VyY2UgKyAnJCc7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVmbGVjdGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQlTdHJpbmcga2V5OwotCQlKYXZhUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRvcjsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCWlmIChrZXkuZXF1YWxzKHNvdXJjZSkgfHwga2V5LnN0YXJ0c1dpdGgoaW5uZXJOYW1lKSkgewotCQkJCWFkYXB0b3IgPSAoSmF2YVJlZmxlY3Rpb25BZGFwdG9yKSByZWZsZWN0ZWQuZ2V0KGtleSk7Ci0JCQkJaWYgKGFkYXB0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZG9Ob3RpZnkpCi0JCQkJCQlhZGFwdG9yLnJlbGVhc2VTb3VyY2VUeXBlKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCW5vdGlmaWNhdGlvbiA9IGFkYXB0b3IucmVsZWFzZVNvdXJjZVR5cGVOb05vdGlmaWNhdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZmluYWxseSB7Ci0JCWZpbmlzaGVkSXRlcmF0aW5nUmVmbGVjdGVkKCk7Ci0JfQotCXJldHVybiBub3RpZmljYXRpb247Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkSXRlcmF0aW5nUmVmbGVjdGVkKCkgewotCWlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCA9IGZhbHNlOwotCWlmICh1bnJlZ2lzdGVyUXVldWUgIT0gbnVsbCAmJiAhdW5yZWdpc3RlclF1ZXVlLmlzRW1wdHkoKSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHVucmVnaXN0ZXJRdWV1ZS5zaXplKCk7IGkrKykgewotCQkJcmVmbGVjdGVkLnJlbW92ZSh1bnJlZ2lzdGVyUXVldWUuZ2V0KGkpKTsKLQkJfQotCQl1bnJlZ2lzdGVyUXVldWUuY2xlYXIoKTsKLQl9Ci0JaWYgKHJlZ2lzdGVyUXVldWUgIT0gbnVsbCAmJiAhcmVnaXN0ZXJRdWV1ZS5pc0VtcHR5KCkpIHsKLQkJSXRlcmF0b3IgaXQgPSByZWdpc3RlclF1ZXVlLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCXJlZmxlY3RlZC5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotCQl9Ci0JCXJlZ2lzdGVyUXVldWUuY2xlYXIoKTsKLQl9Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JcmV0dXJuIFRZUEVfS0VZLmVxdWFscyh0eXBlKTsKLX0KLX0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbkFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExZjdjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0JCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGV4dGVuZHMgUmVmbGVjdGlvbkFkYXB0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDX01FVEhPRF9ERUZBVUxUX0NUT1IgPSBTdHJpbmcudmFsdWVPZihDX01FVEhPRF9QQVJNX0RFTElNSVRFUikgKyBTX0NPTlNUUlVDVE9SX1RPS0VOOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfQlJBQ0tFVCA9ICJbIjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogU3BlY2lhbCBub3RpZmljYXRpb24gZXZlbnQgdHlwZS4gVGhpcyBpcyBzZW50IGFnYWluc3QgYSBKYXZhQ2xhc3MgKGFzIHRoZSB0YXJnZXQpIHdoZW5ldmVyIGZsdXNoIG9mIHRoZSByZWZsZWN0aW9uIG9jY3Vycy4gSXQgd2lsbCBiZQotCSAqIHNlbnQgdW5kZXIgdGhlIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlIG9mIFJFRkxFQ1RJT05fRVZFTlQuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEZMVVNIX1JFRkxFQ1RJT05fRVZFTlQgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVjb3JlRmFjdG9yeSgpLmNyZWF0ZUVBdHRyaWJ1dGUoKTsKLQkKLQkvKioKLQkgKiBTcGVjaWFsIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlLiBUaGlzIGlzIHNlbnQgYWdhaW5zdCBhIEphdmFDbGFzcyAoYXMgdGhlIHRhcmdldCkgd2hlbmV2ZXIgZmx1c2ggb2YgYSBuZXcgY2xhc3MgKGkuZS4gCi0JICogbm8gc291cmNlIHdhcyBmb3VuZCkgb2YgdGhlIHJlZmxlY3Rpb24gb2NjdXJzLiBJdCB3aWxsIGJlCi0JICogc2VudCB1bmRlciB0aGUgbm90aWZpY2F0aW9uIGV2ZW50IHR5cGUgb2YgUkVGTEVDVElPTl9FVkVOVC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgRkxVU0hfTkVXX1JFRkxFQ1RJT05fRVZFTlQgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVjb3JlRmFjdG9yeSgpLmNyZWF0ZUVBdHRyaWJ1dGUoKTsKLQotCS8qCi0JICogRmlsbCBpbiB0aGUgbmFtZS4gTm90IHJlYWxseSBuZWVkZWQgYnV0IGl0IHdvdWxkIGJlIG5pY2UuCi0JICovCi0Jc3RhdGljIHsKLQkJRkxVU0hfUkVGTEVDVElPTl9FVkVOVC5zZXROYW1lKCJmbHVzaFJlZmxlY3RlZFZhbHVlcyIpOyAgICAvLyROT04tTkxTLTEkCi0JCUZMVVNIX05FV19SRUZMRUNUSU9OX0VWRU5ULnNldE5hbWUoImZsdXNoTmV3UmVmbGVjdGVkVmFsdWVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRmx1c2hlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGlzRmx1c2hpbmcgPSBmYWxzZTsKLS8qKgotICogSmF2YVJlZmxlY3Rpb25BZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhUmVmbGVjdGlvbkFkYXB0b3IoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogSmF2YVJlZmxlY3Rpb25BZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gdGFyZ2V0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyCi0gKi8KLXB1YmxpYyBKYXZhUmVmbGVjdGlvbkFkYXB0b3Iob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIgdGFyZ2V0KSB7Ci0Jc3VwZXIodGFyZ2V0KTsKLX0KLS8qKgotICogY3JlYXRlQmxvY2sgLSBpbnN0YW50aWF0ZSBhIEJsb2NrIGNvbnRhaW5pbmcgdGhlIHBhc3NlZCBzb3VyY2UKLSAqLwotcHVibGljIEJsb2NrIGNyZWF0ZUJsb2NrKFN0cmluZyBuYW1lLCBTdHJpbmcgc291cmNlU3RyaW5nKSB7Ci0JQmxvY2sgbmV3QmxvY2sgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUJsb2NrKCk7Ci0JbmV3QmxvY2suc2V0TmFtZShuYW1lICsgIl8iICsgImJsb2NrIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQluZXdCbG9jay5zZXRTb3VyY2Uoc291cmNlU3RyaW5nKTsKLQlyZXR1cm4gbmV3QmxvY2s7Ci19Ci0vKioKLSAqIHNldFN1cGVyIC0gc2V0IG91ciBzdXBlcnR5cGUgaGVyZSwgaW1wbGVtZW50ZWQgaW50ZXJmYWNlIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkKLSAqLwotcHVibGljIEphdmFDbGFzcyBjcmVhdGVKYXZhQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKHRhcmdldE5hbWUpOwotfQotLyoqCi0gKiBjcmVhdGVKYXZhUGFyYW1ldGVyIC0gaW5zdGFudGlhdGUgYSBKYXZhIFBhcmFtZXRlciBiYXNlZCBvbiB0aGUgcGFzc2VkIG5hbWUgYW5kIHR5cGUgbmFtZSAoYSBzaW1wbGUgbmFtZSwgTk9UIEEgU0lHTkFUVVJFISEhKQotICogVGhlIGlkIGZvciBhIHBhcmFtZXRlciBoYXMgdG8gYmUgY29tcGxleCBpbiBvcmRlciB0byBiZSBwYXJzYWJsZSBpbnRvIGNsYXNzLCBtZXRob2QsIGFuZCBwYXJtLgotICogSXQgaXMgY3JlYXRlZCBieSBhcHBlbmRpbmcgdGhlIHBhcm0gbmFtZSB0byB0aGUgbWV0aG9kIGlkLCB3aXRoIGEga25vd24gc2VwYXJhdG9yLgotICogSXQgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlICJGb28uZG9Tb21ldGhpbmcoamF2YS5sYW5nLkludGVnZXItYXJnMCIKLSAqLwotcHVibGljIEphdmFQYXJhbWV0ZXIgY3JlYXRlSmF2YVBhcmFtZXRlcihNZXRob2QgcGFyZW50TWV0aG9kLCBTdHJpbmcgcGFybU5hbWUsIFN0cmluZyBwYXJtVHlwZU5hbWUpIHsKLQlKYXZhUGFyYW1ldGVyIG5ld1Bhcm0gPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLQlpZiAocGFybU5hbWUhPW51bGwpCi0JICAgbmV3UGFybS5zZXROYW1lKHBhcm1OYW1lKTsKLS8vICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bhcm0pLmVTZXRJRChwYXJlbnRNZXRob2QuZUlEKCkgKyBDX01FVEhPRElEX1BBUk1JRF9ERUxJTUlURVIgKyBwYXJtTmFtZSk7Ci0JU3RyaW5nIGNsYXNzUmVmU3RyaW5nID0gcGFybVR5cGVOYW1lOwotCW5ld1Bhcm0uc2V0RVR5cGUoY3JlYXRlSmF2YUNsYXNzUmVmKGNsYXNzUmVmU3RyaW5nKSk7Ci0JcmV0dXJuIG5ld1Bhcm07Ci19Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgTGlzdCBvZiBkaW1lbnNpb25zIGZvciBhIHR5cGVOYW1lLgotICogRm9yIGV4YW1wbGUgImZvb1tdW10iIHdvdWxkIHJldHVybiBhIExpc3Qgb2YgSW50ZWdlcnMKLSAqIDEsIDEuICBBdCBzb21lIHBvaW50IHdlIG1heSB3YW50IHRvIGFjdHVhbGx5IGNhcHR1cmUgdGhlIHNpemUKLSAqIGZvciBGaWVsZHMgYnV0IHdlIHdvdWxkIG5lZWQgdGhlIGluaXRpYWxpemVyIHNvdXJjZSB0byBkZXRlcm1pbmUgdGhhdC4KLSAqLwotcHVibGljIExpc3QgZ2V0QXJyYXlEaW1lbnNpb25zKFN0cmluZyB0eXBlTmFtZSkgewotCUxpc3QgZGltZW5zaW9ucyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0JaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKLQkJaW50IGJlZ2luID0gMDsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCXdoaWxlIChiZWdpbiA8IHR5cGVOYW1lLmxlbmd0aCgpKSB7Ci0JCQlpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoTEVGVF9CUkFDS0VULCBiZWdpbik7Ci0JCQlpZiAoaW5kZXggPiAtMSkgewotCQkJCWRpbWVuc2lvbnMuYWRkKG5ldyBJbnRlZ2VyKDEpKTsKLQkJCQliZWdpbiA9IGluZGV4ICsgMTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmVnaW4gPSB0eXBlTmFtZS5sZW5ndGgoKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZGltZW5zaW9uczsKLX0KLS8qIEdldCB0aGUgSmF2YSBGYWN0b3J5Ci0gKi8KLXByb3RlY3RlZCBzdGF0aWMgSmF2YVJlZkZhY3RvcnkgZ2V0SmF2YUZhY3RvcnkoKSB7Ci0JcmV0dXJuICgob3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2Uob3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSkpLmdldEphdmFSZWZGYWN0b3J5KCk7Ci19Ci1wdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKTsKLS8qKgotICogZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZFVVSUQgLSBQdWxsIHRoZSBwYXJtIHR5cGUgbmFtZXMgb3V0IG9mIGEgbWV0aG9kIElECi0gKiAJCUl0IHdpbGwgYmUgaW4gdGhlIGZvcm06ICJzaW1wbGVjbGFzcy5tZXRob2ROYW1lKGNvbS5mcm9uay5QYXJtMV90eXBlLHBhcm0ydHlwZSIKLSAqLwotcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBnZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoU3RyaW5nIG1ldGhvZElEKSB7Ci0JaWYgKG1ldGhvZElELmNoYXJBdChtZXRob2RJRC5sZW5ndGgoKS0xKSA9PSBDX01FVEhPRF9QQVJNX0RFTElNSVRFUiB8fCBtZXRob2RJRC5lbmRzV2l0aChDX01FVEhPRF9ERUZBVUxUX0NUT1IpKQotCQlyZXR1cm4gZW1wdHlTdHJpbmdBcnJheTsKLQkJCi0JLy8gQ291bnQgdGhlIHBhcm1zIGZpcnN0LiAgVGhlIG51bWJlciBvZiBwYXJtcyBpcyB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mICcsJyArIDEKLQlpbnQgbnVtUGFybXMgPSAxOwotCWludCBwb3MgPSAtMTsKLQkvLyBTa2lwIHRoZSAnLicgYWZ0ZXIgY2xhc3NuYW1lCi0JcG9zID0gbWV0aG9kSUQuaW5kZXhPZihDX0NMQVNTX01FTUJFUl9ERUxJTUlURVIsICsrcG9zKTsKLQkvLyBMb29rIGZvciB0aGUgc3RhcnQgb2YgdGhlIHBhcm1zCi0JaW50IHBhcm1Qb3MgPSBtZXRob2RJRC5pbmRleE9mKENfTUVUSE9EX1BBUk1fREVMSU1JVEVSLCArK3Bvcyk7Ci0JcG9zID0gcGFybVBvczsKLQl3aGlsZSAoKHBvcyA9IG1ldGhvZElELmluZGV4T2YoQ19QQVJNX1BBUk1fREVMSU1JVEVSLCArK3BvcykpICE9IC0xKQotCQludW1QYXJtcysrOwotCVN0cmluZ1tdIHBhcm1UeXBlTmFtZXMgPSBuZXcgU3RyaW5nW251bVBhcm1zXTsKLQkvLyBub3cgY29sbGVjdCB0aGUgcGFybSBuYW1lcwotCS8vIHNraXAgdGhlIG1ldGhvZCBuYW1lCi0JcG9zID0gcGFybVBvczsKLQlpbnQgaSA9IDAsIGVuZDsKLQlkbyB7Ci0JCWVuZCA9IG1ldGhvZElELmluZGV4T2YoQ19QQVJNX1BBUk1fREVMSU1JVEVSLCBwb3MgKyAxKTsKLQkJLy8gVGhpcyBpcyB0aGUgbGFzdCBwYXJhbWV0ZXIsIHdlIG1heSBuZWVkIHRvIHN0cmlwIGEgdHJhaWxpbmcgJlYgZm9yIGEgY29uc3RydWN0b3IKLQkJaWYgKGVuZCA9PSAtMSkKLQkJCWVuZCA9IG1ldGhvZElELmluZGV4T2YoU19DT05TVFJVQ1RPUl9UT0tFTiwgcG9zICsgMSk7Ci0JCS8vIG90aGVyd2lzZSB0YWtlIHRoZSByZXN0IG9mIHRoZSBJRAotCQlpZiAoZW5kID09IC0xKQotCQkJZW5kID0gbWV0aG9kSUQubGVuZ3RoKCk7Ci0JCXBhcm1UeXBlTmFtZXNbaSsrXSA9IG1ldGhvZElELnN1YnN0cmluZyhwb3MgKyAxLCBlbmQpOwotCX0gd2hpbGUgKChwb3MgPSBtZXRob2RJRC5pbmRleE9mKENfUEFSTV9QQVJNX0RFTElNSVRFUiwgKytwb3MpKSAhPSAtMSk7Ci0JcmV0dXJuIHBhcm1UeXBlTmFtZXM7Ci19Ci1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCk7Ci0KLXB1YmxpYyBib29sZWFuIGhhc1JlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0gICAgcmV0dXJuIGdldFJlZmxlY3Rpb25Tb3VyY2UoKSAhPSBudWxsOwotfQotCi0vKioKLSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotICoKLSAqLwotcHVibGljIHZvaWQgcmVsZWFzZVNvdXJjZVR5cGUoKXsKLX0KLQotLyoqCi0gKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4KLSAqIEByZXR1cm4KLSAqLwotcHVibGljIE5vdGlmaWNhdGlvbiByZWxlYXNlU291cmNlVHlwZU5vTm90aWZpY2F0aW9uKCkgewotCXJldHVybiBudWxsOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZVNvdXJjZVR5cGUoSmF2YUNsYXNzIGphdmFDbGFzcykgewotCWlmIChqYXZhQ2xhc3MgPT0gbnVsbCkKLQkJcmV0dXJuOwotCi0JSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGV4aXN0aW5nID0gKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgcmV0cmlldmVBZGFwdG9yRnJvbShqYXZhQ2xhc3MpOwotCWlmIChleGlzdGluZyAhPSBudWxsKQotCQlleGlzdGluZy5yZWxlYXNlU291cmNlVHlwZSgpOwotfQotLyoKLSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBhIEZpZWxkIEFkYXB0b3IgdG8gc2V0IHRoZSB0eXBlIG9mIGFGaWVsZAotICogdG8gYmUgYVR5cGVOYW1lLiAgYVR5cGVOYW1lIG1heSBjb250YWluIGFycmF5IGJyYWNrZXRzIHdoaWNoIG5lZWQKLSAqIHRvIGJlIGRldGVjdGVkIGluIG9yZGVyIHRvIHNldCB0aGUgYXJyYXkgZGltZW5zaW9ucyBvbiBhRmllbGQuCi0gKi8KLXByb3RlY3RlZCB2b2lkIHNldEZpZWxkVHlwZShGaWVsZCBhRmllbGQsIFN0cmluZyBhVHlwZU5hbWUpIHsKLQlpZiAoYUZpZWxkICE9IG51bGwgJiYgYVR5cGVOYW1lICE9IG51bGwpIHsKLQkJU3RyaW5nIGNsYXNzUmVmU3RyaW5nID0gYVR5cGVOYW1lOwotCQlhRmllbGQuc2V0RVR5cGUoY3JlYXRlSmF2YUNsYXNzUmVmKGNsYXNzUmVmU3RyaW5nKSk7Ci0JfQotfQotcHVibGljIGZpbmFsIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpIHsKLQlyZXR1cm4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShmYWxzZSk7Ci19Ci1wdWJsaWMgZmluYWwgYm9vbGVhbiBmbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCU5vdGlmaWNhdGlvbiBub3QgPSBmbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oY2xlYXJDYWNoZWRNb2RlbE9iamVjdCk7Ci0JaWYgKG5vdCAhPSBudWxsKQotCQlnZXRUYXJnZXQoKS5lTm90aWZ5KG5vdCk7Ci0JcmV0dXJuIGhhc0ZsdXNoZWQ7Ci19Ci0KLXB1YmxpYyBzeW5jaHJvbml6ZWQgTm90aWZpY2F0aW9uIGZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbihib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQlpZiAoIWhhc0ZsdXNoZWQgJiYgIWlzRmx1c2hpbmcpIHsKLQkJYm9vbGVhbiBpc0V4aXN0aW5nID0gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpOwotCQl0cnkgewotCQkJaXNGbHVzaGluZyA9IHRydWU7Ci0JCQloYXNSZWZsZWN0ZWQgPSBmYWxzZTsKLQkJCWhhc0ZsdXNoZWQgPSBmbHVzaFJlZmxlY3RlZFZhbHVlcyhjbGVhckNhY2hlZE1vZGVsT2JqZWN0KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWhhc0ZsdXNoZWQgPSBmYWxzZTsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCi0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7Ci0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpCi0JCQkJdGhyb3cgKEVycm9yKSBlOwotCQkJZWxzZQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzRmx1c2hpbmcgPSBmYWxzZTsKLQkJCXBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGlzRXhpc3RpbmcpOwotCQl9Ci0JCXJldHVybiBjcmVhdGVGbHVzaE5vdGlmaWNhdGlvbihpc0V4aXN0aW5nKTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLS8qKgotICogQHBhcmFtIGlzRXhpc3RpbmcKLSAqIEByZXR1cm4KLSAqLwotcHJvdGVjdGVkIE5vdGlmaWNhdGlvbiBjcmVhdGVGbHVzaE5vdGlmaWNhdGlvbihib29sZWFuIGlzRXhpc3RpbmcpIHsKLQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGlzRXhpc3RpbmcgPyBGTFVTSF9SRUZMRUNUSU9OX0VWRU5UIDogRkxVU0hfTkVXX1JFRkxFQ1RJT05fRVZFTlQ7Ci0JcmV0dXJuIG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KWdldFRhcmdldCgpLEVWRU5ULCBmZWF0dXJlLCBudWxsLCBudWxsKTsKLX0KLXByb3RlY3RlZCB2b2lkIHBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGJvb2xlYW4gaXNFeGlzdGluZykgewotfQotLyoqCi0gKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBwZXJmb3JtIHRoZSBhY3R1YWwgY2xlYXJpbmcgb2YgdGhlIHZhbHVlcy4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKioKLSAqIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHJlZmxlY3Rpb24gaGFkIG9jY3VycmVkLgotICovCi1wdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKSB7Ci0JaWYgKGlzRmx1c2hpbmcpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gc3VwZXIucmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci19Ci0KLS8qKgotICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldAotICovCi1wdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCWhhc0ZsdXNoZWQgPSBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbktleS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWM0ODJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25LZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLkNoYXJhY3RlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuQ2hhcmFjdGVyVXRpbC5TdHJpbmdJdGVyYXRvcjsKLQotLyoqCi0gKiBUaGlzIGtleSBoYW5kbGVzIEphdmEgUmVmbGVjdGlvbi4gSXQgY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZiBlbnRyaWVzIGlmCi0gKiB0aGV5IGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgcmVzb3VyY2UuIFRoZXJlIGlzIGFuIGV4dGVuc2lvbiBtZWNoYW5pc20gZm9yIG90aGVyCi0gKiB0eXBlcyBvZiBpZHMgdGhhdCBhcmUgbm90IHJlY29nbml6ZWQgYnkgdGhpcyBrZXkuIFRoZXkgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUKLSAqIEphdmFYTUlGYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgdGhlc2Uga2V5cywgYW5kIHRoZSBmYWN0b3J5IHdpbGwgcGFzcyBpbgotICogYSBMaXN0IG9mIHRoZXNlIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uIHByb2Nlc3NlcnMgKElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbikuCi0gKiAKLSAqIENyZWF0aW9uIGRhdGU6ICgxMC80LzIwMDAgODoyNDozNiBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZWZsZWN0aW9uS2V5IGltcGxlbWVudHMgSUphdmFSZWZsZWN0aW9uS2V5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFBSSU1JVElWRVMgPSBuZXcgQXJyYXlMaXN0KDgpOwotCi0Jc3RhdGljIHsgaW5pdGlhbGl6ZVByaW1pdGl2ZXNDb2xsZWN0aW9uKCk7IH0KLQkKLQlwcm90ZWN0ZWQgSmF2YVhNSUZhY3RvcnlJbXBsLkphdmFYTUlSZXNvdXJjZSByZXNvdXJjZTsgLy9GQgotCXByb3RlY3RlZCBMaXN0IGV4dGVuc2lvbnM7Ci0KLXB1YmxpYyBKYXZhUmVmbGVjdGlvbktleShMaXN0IGV4dGVuc2lvbnMsIEphdmFYTUlGYWN0b3J5SW1wbC5KYXZhWE1JUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLSAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotfQotLy9GQiBFTkQKLQotLyogCi0gKiBDcmVhdGUgYW4gQXJyYXlUeXBlIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gKiBIYW5kbGVzIHRoZSBwdXNoIGFuZCBwb3Agb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0gKi8KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2NyZWF0ZUFycmF5VHlwZSgpCi0gKi8KLXB1YmxpYyBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKCkgewotCXJldHVybiBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUFycmF5VHlwZSgpOwotfQotLyogCi0gKiBDcmVhdGUgYSBKYXZhQ2xhc3MgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLSAqLwotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjY3JlYXRlSmF2YUNsYXNzKCkKLSAqLwotcHVibGljIEphdmFDbGFzcyBjcmVhdGVKYXZhQ2xhc3MoKSB7Ci0JcmV0dXJuIGdldEphdmFGYWN0b3J5KCkuY3JlYXRlSmF2YUNsYXNzKCk7Ci19Ci0vKioKLSAqIENyZWF0ZSBhIGRhdGEgdHlwZSBhbmQgcHV0IGl0IGluIHRoZSBwcmltaXRpdmVzIHJlc291cmNlCi0gKi8KLXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRKYXZhRGF0YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JSmF2YURhdGFUeXBlIHJlc3VsdCA9IGdldEphdmFGYWN0b3J5KCkuY3JlYXRlSmF2YURhdGFUeXBlKCk7Ci0JcmVzdWx0LnNldE5hbWUodHlwZU5hbWUpOwotCS8vICgoSW50ZXJuYWxFT2JqZWN0KXJlc3VsdCkuZVNldElEKHR5cGVOYW1lKTsKLQkvL3Jlc3VsdC5lU2V0VVVJRCgoVVVJRCkgbnVsbCk7Ci0JLy9yZXN1bHQuc2V0RVBhY2thZ2UoZ2V0UGFja2FnZSgpKTsKLQlnZXRQYWNrYWdlKCkuZ2V0RUNsYXNzaWZpZXJzKCkuYWRkKHJlc3VsdCk7Ci0JcmVzb3VyY2Uuc2V0SUQocmVzdWx0LCB0eXBlTmFtZSk7CQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKiAKLSAqIENyZWF0ZSBhIEZpZWxkIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gKiBIYW5kbGVzIHRoZSBwdXNoIGFuZCBwb3Agb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0gKi8KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2NyZWF0ZUphdmFGaWVsZCgpCi0gKi8KLXB1YmxpYyBGaWVsZCBjcmVhdGVKYXZhRmllbGQoKSB7Ci0JcmV0dXJuIGdldEphdmFGYWN0b3J5KCkuY3JlYXRlRmllbGQoKTsKLX0KLS8qIAotICogQ3JlYXRlIGEgTWV0aG9kIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gKiBIYW5kbGVzIHRoZSBwdXNoIGFuZCBwb3Agb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0gKi8KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2NyZWF0ZUphdmFNZXRob2QoKQotICovCi1wdWJsaWMgTWV0aG9kIGNyZWF0ZUphdmFNZXRob2QoKSB7Ci0JcmV0dXJuIGdldEphdmFGYWN0b3J5KCkuY3JlYXRlTWV0aG9kKCk7Ci19Ci0vKiAKLSAqIENyZWF0ZSBhIEphdmFQYXJhbWV0ZXIgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAqLwotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjY3JlYXRlSmF2YVBhcmFtZXRlcigpCi0gKi8KLXB1YmxpYyBKYXZhUGFyYW1ldGVyIGNyZWF0ZUphdmFQYXJhbWV0ZXIoKSB7Ci0JcmV0dXJuIGdldEphdmFGYWN0b3J5KCkuY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotfQotLy9GQi8qKgotLy9GQiAqIE92ZXJyaWRlIHRvIHRyeSB0byBpbnRyb3NwZWN0IG9iamVjdHMKLS8vRkIgKiB0aGF0IGFyZW4ndCBmb3VuZCB1c2luZyB0aGUgZGVmYXVsdCBtZWNoYW5pc20uCi0vL0ZCICovCi0vL0ZCcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotLy9GQiAJT2JqZWN0IGphdmFPYmplY3QgPSBzdXBlci5nZXQoa2V5KTsKLS8vRkIgCWlmIChqYXZhT2JqZWN0ID09IG51bGwpIHsKLS8vRkIgCQlqYXZhT2JqZWN0ID0gZ2V0T2JqZWN0RnJvbUV4dGVuc2lvbnMoKFN0cmluZykga2V5KTsKLS8vRkIgCQlpZiAoamF2YU9iamVjdCA9PSBudWxsKQotLy9GQiAJCQlqYXZhT2JqZWN0ID0gZ2V0SmF2YU9iamVjdCgoU3RyaW5nKSBrZXkpOwotLy9GQiAJfQotLy9GQglyZXR1cm4gamF2YU9iamVjdDsKLS8vRkJ9Ci0KLS8vRkIgQURERUQKLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2dldChqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgT2JqZWN0IGdldChTdHJpbmcga2V5KSB7Ci0JT2JqZWN0IGphdmFPYmplY3QgPSBnZXRPYmplY3RGcm9tRXh0ZW5zaW9ucyhrZXkpOwotCWlmIChqYXZhT2JqZWN0ID09IG51bGwpCi0JCWphdmFPYmplY3QgPSBnZXRKYXZhT2JqZWN0KGtleSk7Ci0JcmV0dXJuIGphdmFPYmplY3Q7Ci19Ci0vL0ZCIEVORAotCi0vKgotICogSW5zdGFudGlhdGUgdGhlIG5hbWVkIGNsYXNzLgotICogSWYgd2UgbWFrZSBpdCB0byB0aGlzIHBvaW50LCB0aGUgY2xhc3MgaGFzIG5vdCB5ZXQgYmVlbiBpbnN0YW50aWF0ZWQgb3IgcmVmbGVjdGVkLgotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNnZXRBcnJheVR5cGUoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIEVDbGFzc2lmaWVyIGdldEFycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQlBcnJheVR5cGUgYXJyYXlUeXBlID0gdGhpcy5jcmVhdGVBcnJheVR5cGUoKTsKLQlhcnJheVR5cGUuc2V0TmFtZSh0eXBlTmFtZSk7Ci0JLy8gKChJbnRlcm5hbEVPYmplY3QpYXJyYXlUeXBlKS5lU2V0SUQodHlwZU5hbWUpOwotCS8vYXJyYXlUeXBlLmVTZXRVVUlEKChVVUlEKSBudWxsKTsKLQlpbnQgcG9zID0gLTEsIGJyYWNlcyA9IDA7Ci0JZG8gewotCQlwb3MgPSB0eXBlTmFtZS5pbmRleE9mKCJbIiwgcG9zKzEpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKHBvcyAhPSAtMSkKLQkJCWJyYWNlcysrOwotCX0gd2hpbGUgKHBvcyAhPSAtMSk7Ci0JYXJyYXlUeXBlLnNldEFycmF5RGltZW5zaW9ucyhicmFjZXMpOwotCS8vYXJyYXlUeXBlLnNldEVQYWNrYWdlKGdldFBhY2thZ2UoKSk7Ci0JZ2V0UGFja2FnZSgpLmdldEVDbGFzc2lmaWVycygpLmFkZChhcnJheVR5cGUpOwotCXJlc291cmNlLnNldElEKGFycmF5VHlwZSwgdHlwZU5hbWUpOwkKLQlyZXR1cm4gYXJyYXlUeXBlOwotfQotLyoKLSAqIEluc3RhbnRpYXRlIHRoZSBuYW1lZCBjbGFzcy4KLSAqIElmIHdlIG1ha2UgaXQgdG8gdGhpcyBwb2ludCwgdGVoIGNsYXNzIGhhcyBub3QgeWV0IGJlZW4gaW5zdGFudGlhdGVkIG9yIHJlZmxlY3RlZC4KLSAqLwotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjZ2V0SmF2YUNsYXNzKGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBFQ2xhc3NpZmllciBnZXRKYXZhQ2xhc3MoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JSmF2YUNsYXNzIGphdmFDbGFzcyA9IHRoaXMuY3JlYXRlSmF2YUNsYXNzKCk7Ci0JamF2YUNsYXNzLnNldE5hbWUodHlwZU5hbWUpOwotCS8vICgoSW50ZXJuYWxFT2JqZWN0KWphdmFDbGFzcykuZVNldElEKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCS8vamF2YUNsYXNzLmVTZXRVVUlEKChVVUlEKSBudWxsKTsKLQkvLyBqYXZhQ2xhc3Muc2V0RVBhY2thZ2UoZ2V0UGFja2FnZSgpKTsKLQlnZXRQYWNrYWdlKCkuZ2V0RUNsYXNzaWZpZXJzKCkuYWRkKGphdmFDbGFzcyk7Ci0JcmVzb3VyY2Uuc2V0SUQoamF2YUNsYXNzLCB0eXBlTmFtZSk7Ci0JcmV0dXJuIGphdmFDbGFzczsKLX0KLS8qIEdldCB0aGUgSmF2YSBGYWN0b3J5Ci0gKi8KLXByb3RlY3RlZCBzdGF0aWMgSmF2YVJlZkZhY3RvcnkgZ2V0SmF2YUZhY3RvcnkoKSB7Ci0JcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRTsKLX0KLS8qKgotICogVGhpcyBhbGxvd3MgZm9yIHRoZSBkaXJlY3QgcmV0cmlldmFsIG9mIGZpZWxkcyB3aXRoIHRoZSBmb2xsb3dpbmcgbm90YXRpb246Ci0gKiBmaWVsZDogamF2YTovY29tLmlibS5mb28jVGVzdC5mb28KLSAqIAotICovCi1wcm90ZWN0ZWQgRmllbGQgZ2V0SmF2YUZpZWxkKFN0cmluZyBrZXlWYWx1ZSkgewotCUZpZWxkIHJlc3VsdCA9IG51bGw7Ci0JU3RyaW5nIGNsYXNzTmFtZSwgbWVtYmVyTmFtZTsKLQlpbnQgbWVtYmVyRGVsaW1pdGVyID0ga2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX0NMQVNTX01FTUJFUl9ERUxJTUlURVIpOwotCWNsYXNzTmFtZSA9IGtleVZhbHVlLnN1YnN0cmluZygwLCBtZW1iZXJEZWxpbWl0ZXIpOwotCW1lbWJlck5hbWUgPSBrZXlWYWx1ZS5zdWJzdHJpbmcobWVtYmVyRGVsaW1pdGVyICsgMSk7Ci0JRUNsYXNzaWZpZXIgamF2YUNsYXNzID0gKEVDbGFzc2lmaWVyKSBwcmltR2V0KGNsYXNzTmFtZSk7Ci0JLy8gaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGluc3RhbnRpYXRlZCB0aGUgY29udGFpbmluZyBjbGFzcywgdGhlbiBnbyBkbyBpdC4KLQlpZiAoamF2YUNsYXNzID09IG51bGwpCi0JCWphdmFDbGFzcyA9IGdldEphdmFUeXBlKGNsYXNzTmFtZSk7Ci0JaWYgKChqYXZhQ2xhc3MgIT0gbnVsbCkgJiYgISgoSmF2YUhlbHBlcnMpIGphdmFDbGFzcykuaXNQcmltaXRpdmUoKSkgewotCQkvLyBXZSBoYXZlIGEgY2xhc3MuIE5vdyB3ZSBuZWVkIHRvIGZvcmNlIHJlZmxlY3Rpb24sIHRoaXMgd2lsbCBjYXVzZQotCQkvLyB0aGUgSmF2YVJlZmxlY3Rpb25LZXkgdG8gYmUgdXBkYXRlZCBhbmQgaGF2ZSB0aGUgbWVtYmVyIGFkZGVkIHRvIHRoZQotCQkvLyBsaXN0LgotCQkoKEphdmFDbGFzcykgamF2YUNsYXNzKS5nZXRGaWVsZHMoKTsKLQkJLy9GQiByZXN1bHQgPSAoRmllbGQpIHN1cGVyLmdldChrZXlWYWx1ZSk7IC8vIEl0IHNob3VsZCBub3cgYmUgcmVnaXN0ZXJlZC4KLQkJcmVzdWx0ID0gKEZpZWxkKSBwcmltR2V0KGtleVZhbHVlKTsgLy8gSXQgc2hvdWxkIG5vdyBiZSByZWdpc3RlcmVkLgotCQkKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlGaWVsZCB0ZW1wRmllbGQgPSBjcmVhdGVKYXZhRmllbGQoKTsKLQkJCXRlbXBGaWVsZC5zZXROYW1lKG1lbWJlck5hbWUpOwotCQkJLy8gKChJbnRlcm5hbEVPYmplY3QpdGVtcEZpZWxkKS5lU2V0SUQoa2V5VmFsdWUpOwotCQkJLy90ZW1wRmllbGQuZVNldFVVSUQoKFVVSUQpIG51bGwpOwotCQkJKChKYXZhQ2xhc3MpIGphdmFDbGFzcykuZ2V0RmllbGRzKCkuYWRkKHRlbXBGaWVsZCk7Ci0JCQlyZXN1bHQgPSB0ZW1wRmllbGQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qKgotICogVGhpcyBhbGxvd3MgZm9yIHRoZSByZXRyaWV2YWwgb2YgbWV0aG9kcyB3aXRoIHRoZSBmb2xsb3dpbmcgbm90YXRpb246Ci0gKiBtZXRob2Q6IGphdmE6L2NvbS5pYm0uZm9vI1Rlc3QuZm9vZm9vKAotICogCi0gKi8KLXByb3RlY3RlZCBNZXRob2QgZ2V0SmF2YU1ldGhvZChTdHJpbmcga2V5VmFsdWUpIHsKLQlNZXRob2QgcmVzdWx0ID0gbnVsbDsKLQlTdHJpbmcgY2xhc3NOYW1lLCBtZW1iZXJOYW1lOwotCWludCBtZW1iZXJEZWxpbWl0ZXIgPSBrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JY2xhc3NOYW1lID0ga2V5VmFsdWUuc3Vic3RyaW5nKDAsIG1lbWJlckRlbGltaXRlcik7Ci0JaW50IHBhcm1EZWxpbWl0ZXIgPSBrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfTUVUSE9EX1BBUk1fREVMSU1JVEVSLCBtZW1iZXJEZWxpbWl0ZXIpOwotCW1lbWJlck5hbWUgPSBrZXlWYWx1ZS5zdWJzdHJpbmcobWVtYmVyRGVsaW1pdGVyICsgMSwgcGFybURlbGltaXRlcik7Ci0JRUNsYXNzaWZpZXIgamF2YUNsYXNzID0gKEVDbGFzc2lmaWVyKSBwcmltR2V0KGNsYXNzTmFtZSk7Ci0JLy8gaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGluc3RhbnRpYXRlZCB0aGUgY29udGFpbmluZyBjbGFzcywgdGhlbiBnbyBkbyBpdC4KLQlpZiAoamF2YUNsYXNzID09IG51bGwpCi0JCWphdmFDbGFzcyA9IGdldEphdmFUeXBlKGNsYXNzTmFtZSk7Ci0JaWYgKChqYXZhQ2xhc3MgIT0gbnVsbCkgJiYgISgoSmF2YUhlbHBlcnMpIGphdmFDbGFzcykuaXNQcmltaXRpdmUoKSkgewotCQkvLyBXZSBoYXZlIGEgY2xhc3MuIE5vdyB3ZSBuZWVkIHRvIGZvcmNlIHJlZmxlY3Rpb24sIHRoaXMgd2lsbCBjYXVzZQotCQkvLyB0aGUgSmF2YVJlZmxlY3Rpb25LZXkgdG8gYmUgdXBkYXRlZCBhbmQgaGF2ZSB0aGUgbWVtYmVyIGFkZGVkIHRvIHRoZQotCQkvLyBsaXN0LgotCQkoKEphdmFDbGFzcykgamF2YUNsYXNzKS5nZXRNZXRob2RzKCk7Ci0JCXJlc3VsdCA9IChNZXRob2QpIHByaW1HZXQoa2V5VmFsdWUpOyAvLyBJdCBzaG91bGQgbm93IGJlIHJlZ2lzdGVyZWQuCi0JCQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCU1ldGhvZCB0ZW1wTWV0aG9kID0gY3JlYXRlSmF2YU1ldGhvZCgpOwotCQkJdGVtcE1ldGhvZC5zZXROYW1lKG1lbWJlck5hbWUpOwotCQkJcmVzb3VyY2Uuc2V0SUQodGVtcE1ldGhvZCwga2V5VmFsdWUpOwotCQkJKChKYXZhQ2xhc3MpIGphdmFDbGFzcykuZ2V0TWV0aG9kcygpLmFkZCh0ZW1wTWV0aG9kKTsKLQkJCXJlc3VsdCA9IHRlbXBNZXRob2Q7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2dldEphdmFPYmplY3QoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIEVPYmplY3QgZ2V0SmF2YU9iamVjdChTdHJpbmcga2V5VmFsdWUpIHsKLQlFT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JaW50IGluZGV4ID0ga2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX0NMQVNTX01FTUJFUl9ERUxJTUlURVIpOwotCWlmIChpbmRleCA+IDApIHsKLQkJLy8gVGhlIHJlZmVyZW5jZSBpcyB0byBhIG1lbWJlcjogZmllbGQsIG1ldGhvZCwgb3IgcGFyYW1ldGVyLgotCQkvLyBUYWtlIHRoZSBtb3N0IHNwZWNpZmljIGNhc2UgZmlyc3QsIGEgcGFyYW1ldGVyLgotCQkvLyBPbmx5IGEgcGFyYW1ldGVyIHNob3VsZCBjb250YWluIHRoZSBtZXRob2RJRCB0byBwYXJtSUQgZGVsaW1pdGVyLgotCQlib29sZWFuIGlzUGFyYW1ldGVyID0gKGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19NRVRIT0RJRF9QQVJNSURfREVMSU1JVEVSLCBpbmRleCkgIT0gLTEpOwotCQlpZiAoaXNQYXJhbWV0ZXIpIHsKLQkJCXJlc3VsdCA9IGdldEphdmFQYXJhbWV0ZXIoa2V5VmFsdWUpOwotCQl9IGVsc2UgewotCQkJLy8gVGhlIHRhcmdldCBpcyBhIGZpZWxkIG9yIG1ldGhvZC4gSWYgaXQgaGFzIGEgIigiLCB0aGVuIGl0IGlzIGEgbWV0aG9kLgotCQkJLy8gSWYgaXQgaXMgbm90IGZvdW5kLCB0aGVuIHdlIHdpbGwgY3JlYXRlIGEgdGVtcG9yYXJ5IG9iamVjdC4KLQkJCWludCBwYXJtU3RhcnQgPSBrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfTUVUSE9EX1BBUk1fREVMSU1JVEVSLCBpbmRleCk7Ci0JCQlib29sZWFuIGlzRmllbGQgPSBwYXJtU3RhcnQgPT0gLTE7Ci0JCQlpZiAoaXNGaWVsZCkgewotCQkJCXJlc3VsdCA9IGdldEphdmFGaWVsZChrZXlWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IGdldEphdmFNZXRob2Qoa2V5VmFsdWUpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gZ2V0SmF2YVR5cGUoa2V5VmFsdWUpOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFNlZSBpZiB0aGUgZXh0ZW5zaW9ucyBjYW4gcmVzb2x2ZSB0aGlzIGZpcnN0LgotICovCi1wcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdEZyb21FeHRlbnNpb25zKFN0cmluZyBrZXlWYWx1ZSkgewotCWlmIChleHRlbnNpb25zICE9IG51bGwpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiBleHRlbnNpb24gPSAoSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBvYmogPSBleHRlbnNpb24uZ2V0T2JqZWN0KGtleVZhbHVlLCB0aGlzKTsKLQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQlyZXR1cm4gb2JqOwotCQl9Ci0JfQotCi0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFRoaXMgYWxsb3dzIGZvciB0aGUgcmV0cmlldmFsIG9mIHBhcmFtZXRlcnMgd2l0aCB0aGUgZm9sbG93aW5nIG5vdGF0aW9uOgotICogcGFyYW1ldGVyOiBqYXZhOi9jb20uaWJtLmZvbyNUZXN0LmZvb2ZvbygtYXJnMAotICogCi0gKi8KLXByb3RlY3RlZCBKYXZhUGFyYW1ldGVyIGdldEphdmFQYXJhbWV0ZXIoU3RyaW5nIGtleVZhbHVlKSB7Ci0JSmF2YVBhcmFtZXRlciByZXN1bHQgPSBudWxsOwotCVN0cmluZyBwYXJtTmFtZTsKLQlpbnQgbWVtYmVyRGVsaW1pdGVyID0ga2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX0NMQVNTX01FTUJFUl9ERUxJTUlURVIpOwotCWludCBwYXJtRGVsaW1pdGVyID0ga2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX01FVEhPRElEX1BBUk1JRF9ERUxJTUlURVIsIG1lbWJlckRlbGltaXRlcik7Ci0JcGFybU5hbWUgPSBrZXlWYWx1ZS5zdWJzdHJpbmcocGFybURlbGltaXRlciArIDEpOwotCS8vIGdldE1ldGhvZCgpIHdpbGwgZmluZCBvciBjcmVhdGUgYSBtZXRob2QKLQlNZXRob2QgbWV0aG9kID0gdGhpcy5nZXRKYXZhTWV0aG9kKGtleVZhbHVlLnN1YnN0cmluZyhwYXJtRGVsaW1pdGVyKSk7Ci0JaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCXJlc3VsdCA9IG1ldGhvZC5nZXRQYXJhbWV0ZXIocGFybU5hbWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCUphdmFQYXJhbWV0ZXIgdGVtcFBhcmFtZXRlciA9IGNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLQkJCXRlbXBQYXJhbWV0ZXIuc2V0TmFtZShwYXJtTmFtZSk7Ci0JCQkvLyAoKEludGVybmFsRU9iamVjdCl0ZW1wUGFyYW1ldGVyKS5lU2V0SUQoa2V5VmFsdWUpOwotCQkJLy8gdGVtcFBhcmFtZXRlci5lU2V0VVVJRCgoVVVJRCkgbnVsbCk7Ci0JCQltZXRob2QuZ2V0UGFyYW1ldGVycygpLmFkZCh0ZW1wUGFyYW1ldGVyKTsKLQkJCXJlc3VsdCA9IHRlbXBQYXJhbWV0ZXI7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2dldEphdmFUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBFQ2xhc3NpZmllciBnZXRKYXZhVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQlpZiAoaXNQcmltaXRpdmUodHlwZU5hbWUpKQotCQlyZXR1cm4gZ2V0SmF2YURhdGFUeXBlKHR5cGVOYW1lKTsKLQllbHNlIGlmIChpc0FycmF5KHR5cGVOYW1lKSkKLQkJcmV0dXJuIGdldEFycmF5VHlwZSh0eXBlTmFtZSk7Ci0JZWxzZSBpZiAoaXNWYWxpZEphdmFJZGVudGlmaWVyKHR5cGVOYW1lKSkKLQkJcmV0dXJuIGdldEphdmFDbGFzcyh0eXBlTmFtZSk7Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRKYXZhSWRlbnRpZmllcihTdHJpbmcgdHlwZU5hbWUpIHsKLQlpZiAodHlwZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCVN0cmluZ0l0ZXJhdG9yIGNoYXJJdGVyID0gbmV3IFN0cmluZ0l0ZXJhdG9yKHR5cGVOYW1lKTsKLQkJaWYgKENoYXJhY3RlclV0aWwuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXJJdGVyLm5leHQoKSkpIHsKLQkJCS8vIFN0YXJ0cyB3aXRoIGEgdmFsaWQgamF2YSBpZGVudGlmaWVyIGNoYXJhY3Rlci4KLQkJCS8vIE5vdyBzZWUgaWYgdGhlIHJlc3QgYXJlIHZhbGlkLgotCQkJd2hpbGUgKGNoYXJJdGVyLmhhc05leHQoKSkgewotCQkJCWlmICghQ2hhcmFjdGVyVXRpbC5pc0phdmFJZGVudGlmaWVyUGFydChjaGFySXRlci5uZXh0KCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIE5vdCB2YWxpZAotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNwcmltR2V0KGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBPYmplY3QgcHJpbUdldChTdHJpbmcga2V5KSB7Ci0JcmV0dXJuIHJlc291cmNlLnByaW1HZXRFT2JqZWN0KGtleSk7Ci19Ci1wcm90ZWN0ZWQgRVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkvL0ZCIHJldHVybiAoRVBhY2thZ2UpIHN1cGVyLmdldChKYXZhUGFja2FnZS5QQUNLQUdFX0lEKTsKLQkvLyByZXR1cm4gKEVQYWNrYWdlKSByZXNvdXJjZS5nZXRFT2JqZWN0KEphdmFQYWNrYWdlLlBBQ0tBR0VfSUQpOyAvL0ZCCi0JLy9yZXR1cm4gKEVQYWNrYWdlKSByZXNvdXJjZS5nZXRFT2JqZWN0KEphdmFQYWNrYWdlLlBBQ0tBR0VfSUQpOyAvL0ZCCi0JcmV0dXJuIChFUGFja2FnZSlFY29yZVV0aWwuZ2V0T2JqZWN0QnlUeXBlKHJlc291cmNlLmdldENvbnRlbnRzKCksIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoKSk7Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMC80LzIwMDAgOTo1Njo1MyBBTSkKLSAqLwotcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFsaXplUHJpbWl0aXZlc0NvbGxlY3Rpb24oKSB7Ci0JUFJJTUlUSVZFUy5hZGQoTl9WT0lEKTsKLQlQUklNSVRJVkVTLmFkZChOX0JPT0xFQU4pOwotCVBSSU1JVElWRVMuYWRkKE5fQllURSk7Ci0JUFJJTUlUSVZFUy5hZGQoTl9DSEFSKTsKLQlQUklNSVRJVkVTLmFkZChOX0RPVUJMRSk7Ci0JUFJJTUlUSVZFUy5hZGQoTl9GTE9BVCk7Ci0JUFJJTUlUSVZFUy5hZGQoTl9JTlQpOwotCVBSSU1JVElWRVMuYWRkKE5fTE9ORyk7Ci0JUFJJTUlUSVZFUy5hZGQoTl9TSE9SVCk7Ci19Ci0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNpc0FycmF5KGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzQXJyYXkoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JcmV0dXJuIHR5cGVOYW1lLmVuZHNXaXRoKCJbXSIpOy8vJE5PTi1OTFMtMSQKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEwLzQvMjAwMCA5OjU0OjIzIEFNKQotICogQHJldHVybiBib29sZWFuCi0gKiBAcGFyYW0gdHlwZU5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wcml2YXRlIGJvb2xlYW4gaXNQcmltaXRpdmUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JcmV0dXJuIFBSSU1JVElWRVMuY29udGFpbnModHlwZU5hbWUpOwotfQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFYTUlGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhWE1JRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2ZTlhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFYTUlGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGNyZWF0ZSB0aGUgUmVzb3VyY2UgZm9yIHRoZSBKYXZhIHByb3RvY29sLgotICogCi0gKiBJdCBhbGxvd3MgZXh0ZW5zaW9ucyB0byB0aGUgcmVmbGVjdGlvbiBrZXkgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIGl0LgotICogCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvNC8yMDAwIDg6MjI6MjMgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhWE1JRmFjdG9yeUltcGwgZXh0ZW5kcyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSmF2YVhNSUZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfU0VQRVJBVE9SID0gIjovIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBMaXN0IGV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBKYXZhWE1JRmFjdG9yeUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSmF2YVhNSUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVmbGVjdGlvbktleUV4dGVuc2lvbihJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCWV4dGVuc2lvbnMuYWRkKGV4dGVuc2lvbik7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgZGVyZWdpc3RlclJlZmxlY3Rpb25LZXlFeHRlbnNpb24oSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlleHRlbnNpb25zLnJlbW92ZShleHRlbnNpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUphdmFQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHhtaXVyaSwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJLy8gY2hhbmdlZCB0byBhbGxvdyBhIHplcm8tbGVuZ3RoIHBhY2thZ2UgbmFtZSAKLQkJLy8gZm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgImphdmE6LyNpbnQiLCBldGMuCi0JCUphdmFSZWZGYWN0b3J5IGpmYWMgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCUphdmFQYWNrYWdlIHBhY2sgPSBqZmFjLmNyZWF0ZUphdmFQYWNrYWdlKCk7Ci0JCS8vIE5lZWQgdG8gY3JlYXRlIGFuZCBhZGQgc3BlY2lhbCBKYXZhRmFjdG9yeSBmb3IgaW5zdGFudGlhdGlvbiB0byB3b3JrLgotCQlKYXZhRmFjdG9yeUltcGwgZmFjdCA9IG5ldyBKYXZhRmFjdG9yeUltcGwoKTsKLQkJcGFjay5zZXRFRmFjdG9yeUluc3RhbmNlKGZhY3QpOwotCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBTdGFuZGFyZCBKYXZhIHBhY2thZ2UKLQkJCXBhY2suc2V0TnNQcmVmaXgocGFja2FnZU5hbWUpOwotCQkJcGFjay5zZXROYW1lKHBhY2thZ2VOYW1lKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFByaW1pdGl2ZSBwYWNrYWdlCi0JCQlwYWNrLnNldE5zUHJlZml4KEphdmFQYWNrYWdlLlBSSU1JVElWRV9QQUNLQUdFX05BTUUpOwotCQkJcGFjay5zZXROYW1lKEphdmFQYWNrYWdlLlBSSU1JVElWRV9QQUNLQUdFX05BTUUpOwotCQl9Ci0KLQkJcGFjay5zZXROc1VSSSh4bWl1cmkpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChwYWNrKTsKLQkJKChYTUlSZXNvdXJjZSkgcGFjay5lUmVzb3VyY2UoKSkuc2V0SUQocGFjaywgSmF2YVBhY2thZ2UuUEFDS0FHRV9JRCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSmF2YVhNSVJlc291cmNlIGV4dGVuZHMgWE1JUmVzb3VyY2VJbXBsIHsKLQkJcHJvdGVjdGVkIElKYXZhUmVmbGVjdGlvbktleSByZWZsZWN0aW9uS2V5OwotCi0JCXB1YmxpYyBKYXZhWE1JUmVzb3VyY2UoVVJJIHVyaSkgewotCQkJc3VwZXIodXJpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFJlZmxlY3Rpb25LZXkoSUphdmFSZWZsZWN0aW9uS2V5IGtleSkgewotCQkJcmVmbGVjdGlvbktleSA9IGtleTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCXN1cGVyLmxvYWQob3B0aW9ucyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KFN0cmluZyB1cmlGcmFnbWVudCkgewotCQkJRU9iamVjdCByZXN1bHQgPSBzdXBlci5nZXRFT2JqZWN0KHVyaUZyYWdtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCAmJiByZWZsZWN0aW9uS2V5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSAoRU9iamVjdCkgcmVmbGVjdGlvbktleS5nZXQodXJpRnJhZ21lbnQpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFVzZWQgYnkgSmF2YVJlZmxlY3Rpb25LZXkgdG8gbG9vayBkaXJlY3RseSBpbnRvIElEIHRhYmxlIHRvIGJ5cGFzcyBhbiBpbmZpbml0ZSBsb29wLiBJdCB3aWxsIAotCQkgKiBjYWxsIGhlcmUgYmVjYXVzZSBpdCBtYXkgbm90IG9mIGZpcnN0IGJlZW4gZm91bmQsIGJ1dCB0aGVuIGFkZGVkLCBzbyBub3cgaXMgZm91bmQuCi0JCSAqIAotCQkgKiBAcGFyYW0gdXJpRnJhZ21lbnQKLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlFT2JqZWN0IHByaW1HZXRFT2JqZWN0KFN0cmluZyB1cmlGcmFnbWVudCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEVPYmplY3QodXJpRnJhZ21lbnQpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCN1c2VJREF0dHJpYnV0ZXMoKQotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlSURBdHRyaWJ1dGVzKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlKYXZhWE1JUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgSmF2YVhNSVJlc291cmNlKHVyaSk7Ci0JCXJlc291cmNlLnNldFJlZmxlY3Rpb25LZXkobmV3IEphdmFSZWZsZWN0aW9uS2V5KGV4dGVuc2lvbnMsIHJlc291cmNlKSk7Ci0KLQkJU3RyaW5nIHVyaVN0cmluZyA9IHVyaS50b1N0cmluZygpOwotCQljcmVhdGVKYXZhUGFja2FnZShzdHJpcFNjaGVtZSh1cmlTdHJpbmcpLCB1cmlTdHJpbmcsIHJlc291cmNlKTsKLQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKCkgewotCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCkucHV0KEphdmFYTUlGYWN0b3J5LlNDSEVNRSwgSmF2YVhNSUZhY3RvcnkuSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIFN0cmlwIHRoZSB0cmFpbGluZyBpZGVudGlmaWVyLCBpZiBhbnksIGZyb20gdGhlIHVyaS4gIEFuIGlkZW50aWZpZXIKLQkgKiBiZWdpbnMgd2l0aCAjIG9yIHwuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3RyaXBTY2hlbWUoU3RyaW5nIHVyaSkgewotCQlpbnQgaW5kZXggPSB1cmkuaW5kZXhPZihTQ0hFTUFfU0VQRVJBVE9SKTsKLQkJaWYgKGluZGV4ICE9IC0xKQotCQkJcmV0dXJuIHVyaS5zdWJzdHJpbmcoaW5kZXggKyBTQ0hFTUFfU0VQRVJBVE9SLmxlbmd0aCgpLCB1cmkubGVuZ3RoKCkpOwotCQllbHNlCi0JCQlyZXR1cm4gdXJpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9SZWFkQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9SZWFkQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzNkYWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvUmVhZEFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIEV4dGVuZGVkIEFkYXB0b3IgaW50ZXJmYWNlIHdoaWNoIGFkZHMgc3VwcG9ydCBmb3IgYW4gYWRhcHRlcgotICogcHJvdmlkaW5nIGRlZmF1bHQgdmFsdWVzIGZvciBhdHRyaWJ1dGVzLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDE6MTkgUE0pCi0gKiBAYXV0aG9yOiBTY290dCBSaWNoCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZEFkYXB0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0tFWSA9ICJKYXZhUmVmbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKTsKLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsgLy9GQgotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlZmxlY3Rpb25BZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlZmxlY3Rpb25BZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjODljYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9SZWZsZWN0aW9uQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5jb3JlLkpFTVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0vKioKLSAqIFJlZmxlY3Rpb25BZGFwdG9yIC0gYSByZWFkIGFkYXB0b3IgYmFzZSBpbXBsZW1lbnRhdGlvbiB3aGljaCBkb2VzIGEgYnVsawotICogCWxvYWQgb2YgcmVsZmxlY3RlZCB2YWx1ZXMgb24gdGhlIGZpcnN0IHJlcXVlc3QuCi0gKiAJU3ViY2xhc3NlcyBjYW4gb3B0aW1pemUgdG8gZGVmZXIgc29tZSBwcm9wZXJ0aWVzLgotICogCVByb3BlcnRpZXMgbWF5IGFsc28gYmUgZGVmZXJyZWQgYnkgc2V0dGluZyB0aGVpciB2YWx1ZXMgd2l0aCBwcm94eSByZWZlcmVuY2VzLAotICogCWZvciBleGFtcGxlLCBmb3Igc3VwZXJ0eXBlIGFuZCBvdGhlciByZWZlcmVuY2VkIHR5cGVzLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZsZWN0aW9uQWRhcHRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwgaW1wbGVtZW50cyBSZWFkQWRhcHRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUiA9ICcuJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIgPSAnKCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfTUVUSE9ESURfUEFSTUlEX0RFTElNSVRFUiA9ICctJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19QQVJNX1BBUk1fREVMSU1JVEVSID0gJywnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBQQVRIX0RFTElNSVRFUiA9ICcvJzsKLQkvLyBTVyBpZCBjb250YWlucyAmIGluIHhtbCBmaWxlIGNhc3VlcyBleGNlcHRpb24gdGhyb3cgZHVyaW5nIGxvYWQKLSAgICAgICAgLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU19DT05TVFJVQ1RPUl9UT0tFTiA9ICImViI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNfQ09OU1RSVUNUT1JfVE9LRU4gPSAiX1YiOy8vJE5PTi1OTFMtMSQgLy8gU1cKLQkvLyBjYWNoZSBhIHN0YXRpYyBlbXB0eSBTdHJpbmdbXSBmb3Igbm8gcGFybSBtZXRob2RzCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBlbXB0eVN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1swXTsKLQkKLQkKLQkvKioKLQkgKiBOb3RpZmljYXRpb24gZXZlbnQgdHlwZSBmb3Igc3BlY2lhbCBSZWZsZWN0aW9uIG5vdGlmaWNhdGlvbnMuIFRoaXMgd2lsbCBiZSB0aGUgZXZlbnQgdHlwZSBmb3IgdGhlIHNwZWNpYWwgb25lcywgbGlrZSBSRUZMRUNUSU9OX0VWRU5ULgotCSAqIFRoZSBsaXN0ZW5lciBzaG91bGQgbGlzdGVuIGZvciB0aGlzIGV2ZW50IHR5cGUsIGFuZCB0aGVuIGNoZWNrIHRoZSBmZWF0dXJlIGZvciB0aGUgdHlwZSBvZiBzcGVjaWFsIGV2ZW50IChsaWtlIFJFRkxFQ1RJT05fRVZFTlQpLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UID0gLTM0NTY7CS8vIFVzaW5nIGEgZnVubnkgbnVtYmVyIHRvIHRyeSB0byBlbGltaW5hdGUgY29uZmxpY3Rpb24gd2l0aCBhbnkgb3RoZXIgc3BlY2lhbHMgdGhhdCBtYXkgb2Ygb2NjdXIgZnJvbSBvdGhlciBjb2RlIG9uIHRoZSBKYXZhQ2xhc3MuCi0JCi0JLyoqCi0JICogU3BlY2lhbCBub3RpZmljYXRpb24gZXZlbnQgdHlwZS4gVGhpcyBpcyBzZW50IGFnYWluc3QgYSBKYXZhQ2xhc3MgKGFzIHRoZSB0YXJnZXQpIHdoZW5ldmVyIHJlZmxlY3Rpb24gb2NjdXJzLiBJdCB3aWxsIGJlCi0JICogc2VudCB1bmRlciB0aGUgbm90aWZpY2F0aW9uIGV2ZW50IHR5cGUgb2YgUkVGTEVDVElPTl9FVkVOVC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgUkVGTEVDVElPTl9FVkVOVCA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUF0dHJpYnV0ZSgpOwotCi0JLyoKLQkgKiBGaWxsIGluIHRoZSBuYW1lLiBOb3QgcmVhbGx5IG5lZWRlZCBidXQgaXQgd291bGQgYmUgbmljZS4KLQkgKi8KLQlzdGF0aWMge1JFRkxFQ1RJT05fRVZFTlQuc2V0TmFtZSgicmVmbGVjdFZhbHVlcyIpO30gLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBib29sZWFuIGhhc1JlZmxlY3RlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVmbGVjdGluZyA9IGZhbHNlOwotcHVibGljIFJlZmxlY3Rpb25BZGFwdG9yKCkgewotCXN1cGVyKCk7Ci19Ci1wdWJsaWMgUmVmbGVjdGlvbkFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0Jc3VwZXIoKTsKLQlzZXRUYXJnZXQodGFyZ2V0KTsKLX0KLS8qKgotICogSGVscGVyIG1ldGhvZCB0byBlbnN1cmUgZnVsbCBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGFyZ2V0LiAgUmVxdWlyZWQKLSAqIGZvciBzZXJpYWxpemF0aW9uLgotICovCi1wdWJsaWMgc3RhdGljIHZvaWQgZm9yY2VEZWZlcnJlZFJlYWRGb3IoRU9iamVjdCB0YXJnZXQpIHsKLQlSZWZsZWN0aW9uQWRhcHRvciBhZGFwdG9yID0gcmV0cmlldmVBZGFwdG9yRnJvbSh0YXJnZXQpOwotCWlmIChhZGFwdG9yICE9IG51bGwpIHsKLQkJYWRhcHRvci5yZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci19Ci1wcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0VGFyZ2V0UmVzb3VyY2UoKSB7Ci0JaWYgKGdldFRhcmdldCgpICE9IG51bGwpCi0JCXJldHVybiAoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBnZXRUYXJnZXQoKSkuZVJlc291cmNlKCk7Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIEhlbHBlciBtZXRob2QgdG8gZmV0Y2ggdGhlIGFkYXB0b3IgZnJvbSB0aGUgb2JqZWN0LCBhbmQgaWYgaXQgZXhpc3RzLCBnZXQgdGhlIGFkYXB0ZWQKLSAqIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLiAgT3ZlcmxvYWRlZCBmb3IgbWFueS1zaWRlZCBhdHRyaWJ1dGVzIHdoZXJlIHRoZSByZXR1cm4gdmFsdWUgd291bGQKLSAqIG90aGVyd2lzZSBiZSBhbiBlbnVtZXJhdGlvbjsgaW4gdGhpcyBjYXNlIHdpbGwgcmV0dXJuIGFuIEFycmF5IGluc3RlYWQuIAotICovCi1wdWJsaWMgc3RhdGljIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwgRVJlZmVyZW5jZSBhdHRyaWJ1dGUpIHsJCi0vL0ZCCVJlZmxlY3Rpb25BZGFwdG9yIGFkYXB0b3IgPSByZXRyaWV2ZUFkYXB0b3JGcm9tKG9iamVjdCk7Ci0vL0ZCCWlmIChhZGFwdG9yICE9IG51bGwpCi0vL0ZCCQlyZXR1cm4gYWRhcHRvci5nZXRWYWx1ZUluKG9iamVjdCwgYXR0cmlidXRlKTsKLS8vRkIJcmV0dXJuICgoSVJlYWRBZGFwdGFibGUpIG9iamVjdCkucHJpbVJlZlZhbHVlKGF0dHJpYnV0ZSk7Ci0JcmV0dXJuIG9iamVjdC5lR2V0KGF0dHJpYnV0ZSk7IC8vRkIKLQkKLX0KLS8qSGVscGVyIG1ldGhvZCB0byBmZXRjaCB0aGUgYWRhcHRvciBmcm9tIHRoZSBvYmplY3QsIGFuZCBpZiBpdCBleGlzdHMsIGdldCB0aGUgYWRhcHRlZAotICp2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4KLSAqLwotcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VmFsdWUoRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7CQotLy9GQglSZWZsZWN0aW9uQWRhcHRvciBhZGFwdG9yID0gcmV0cmlldmVBZGFwdG9yRnJvbShvYmplY3QpOwotLy9GQglpZiAoYWRhcHRvciAhPSBudWxsKQotLy9GQgkJcmV0dXJuIGFkYXB0b3IuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0vL0ZCCXJldHVybiAoKElSZWFkQWRhcHRhYmxlKSBvYmplY3QpLnByaW1SZWZWYWx1ZShhdHRyaWJ1dGUpOwotCXJldHVybiBvYmplY3QuZUdldCgoRVN0cnVjdHVyYWxGZWF0dXJlKWF0dHJpYnV0ZSk7IC8vRkIKLX0KLS8qKgotICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewotLy9GQglyZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLS8vRkIJcmV0dXJuICgoSVJlYWRBZGFwdGFibGUpIG9iamVjdCkucHJpbVJlZlZhbHVlKGF0dHJpYnV0ZSk7Ci0JcmV0dXJuIG9iamVjdC5lR2V0KChFU3RydWN0dXJhbEZlYXR1cmUpYXR0cmlidXRlKTsgLy9GQgotfQotLyoqCi0gKiBpc0FkYXB0b3JGb3JUeXBlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JcmV0dXJuICh0eXBlID09IFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLX0KLS8qKgotICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldAotICovCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCk7Ci0vKioKLSAqIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHJlZmxlY3Rpb24gaGFkIG9jY3VycmVkLgotICovCi1wdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkgewotCWlmICghaGFzUmVmbGVjdGVkICYmICFpc1JlZmxlY3RpbmcpIHsKLQkJdHJ5IHsKLQkJCWlzUmVmbGVjdGluZyA9IHRydWU7Ci0JCQlFT2JqZWN0IGV0YXJnZXQgPSAoRU9iamVjdClnZXRUYXJnZXQoKTsKLQkJCWlmICghZXRhcmdldC5lSXNQcm94eSgpICYmIGV0YXJnZXQuZVJlc291cmNlKCkgIT0gbnVsbCAmJiBldGFyZ2V0LmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkKLQkJCQloYXNSZWZsZWN0ZWQgPSByZWZsZWN0VmFsdWVzKCk7Ci0JCQllbHNlCi0JCQkJaGFzUmVmbGVjdGVkID0gZmFsc2U7CS8vIEFTIGxvbmcgd2UgYXJlIGEgcHJveHkgb3IgaXMgbm90IGluIGEgdmFsaWQgcmVzb3VyY2Ugb3Igc2V0LCB3ZSB3b24ndCByZWZsZWN0LgotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFzUmVmbGVjdGVkID0gZmFsc2U7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkgewotCQkJCWxvZ2dlci5sb2coUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmFpbGVkX3JlZmxlY3RpbmdfdmFsdWVzX0VSUk9SXyIpLCBMZXZlbC5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJCA9ICJGYWlsZWQgcmVmbGVjdGluZyB2YWx1ZXMhISEiCi0JCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoZSk7Ci0JCQkJSkVNUGx1Z2luLmxvZ1dhcm5pbmcoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmFpbGVkX3JlZmxlY3RpbmdfdmFsdWVzX0VSUk9SXyIpLCBlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlzUmVmbGVjdGluZyA9IGZhbHNlOwotCQkJZ2V0VGFyZ2V0KCkuZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClnZXRUYXJnZXQoKSwgRVZFTlQsIFJFRkxFQ1RJT05fRVZFTlQsIG51bGwsIG51bGwsIE5vdGlmaWNhdGlvbi5OT19JTkRFWCkpOwotCQl9Ci0JfQotCXJldHVybiBoYXNSZWZsZWN0ZWQ7Ci19Ci1wdWJsaWMgc3RhdGljIFJlZmxlY3Rpb25BZGFwdG9yIHJldHJpZXZlQWRhcHRvckZyb20oRU9iamVjdCBvYmplY3QpIHsKLQlzeW5jaHJvbml6ZWQgKG9iamVjdCkgewotCQlyZXR1cm4gKFJlZmxlY3Rpb25BZGFwdG9yKUVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihvYmplY3QsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQl9Ci19Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0pES0FkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0pES0FkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZjMTZlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KREtBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGs7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKREtBZGFwdG9yIGV4dGVuZHMgSmF2YVJlZmxlY3Rpb25BZGFwdG9yIHsKLQlwdWJsaWMgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXB1YmxpYyBKREtBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGFuQWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQkJc2V0QWRhcHRlckZhY3RvcnkoYW5BZGFwdGVyRmFjdG9yeSk7Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2RJRCAtIGdlbmVyYXRlIHRoZSB1bmlxdWUgSUQgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIGNvbnN0cnVjdG9yLgotCSAqIFNpbWlsYXIgdG8gYSBTaWduYXR1cmUsIGJ1dCBob3BlZnVsbHkgbW9yZSByZWFkYWJsZS4KLQkgKiBUaGUgbmFtZSBmb3JtYXQgd2lsbCBiZToKLQkgKiAJc2ltcGxlQ2xhc3NOYW1lLnNpbXBsZUNsYXNzTmFtZShjb20uZnJvbmsuUGFybVR5cGUxX3Bhcm1UeXBlMiZWCi0JICogTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aWdodGx5IGNvdXBsZWQgd2l0aCBSZWZsZWN0aW9uQWRhcHRlci5nZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoKS4KLQkgKgotCSAqIEl0IGhhcyB0byBiZSBkb25lIHNlcGFyYXRlbHkgZm9yIEpESyBiZWNhdXNlIENvbnN0cnVjdG9ycyBhbmQgTWV0aG9kcyBhcmUgZGlmZmVyZW50IGNsYXNzZXMuCi0JICogSG93ZXZlciwgaW4gdGhlIEphdmEgTW9kZWwgdGhleSBhcmUgYm90aCBqdXN0IE1ldGhvZHMgd2l0aCBhIGZsYWcgaW5kaWNhdGluZyBDb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kSUQoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgamRrQ29uc3RydWN0b3IpIHsKLQkJU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldFNpbXBsZU5hbWUoamRrQ29uc3RydWN0b3IuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpOwotCQlvdXQuYXBwZW5kKGNsYXNzTmFtZSk7Ci0JCW91dC5hcHBlbmQoQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQkJb3V0LmFwcGVuZChjb21wdXRlTWV0aG9kTmFtZShqZGtDb25zdHJ1Y3RvcikpOwotCQlvdXQuYXBwZW5kKENfTUVUSE9EX1BBUk1fREVMSU1JVEVSKTsKLQkJQ2xhc3NbXSBwYXJtVHlwZXMgPSBqZGtDb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJb3V0LmFwcGVuZChwYXJtVHlwZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCWlmIChpIDwgcGFybVR5cGVzLmxlbmd0aCAtIDEpCi0JCQkJb3V0LmFwcGVuZChDX1BBUk1fUEFSTV9ERUxJTUlURVIpOwotCQl9Ci0JCW91dC5hcHBlbmQoU19DT05TVFJVQ1RPUl9UT0tFTik7IC8vSXQncyBhIGNvbnN0cnVjdG9yCi0JCXJldHVybiBvdXQudG9TdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZElEIC0gZ2VuZXJhdGUgdGhlIHVuaXF1ZSBJRCB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWV0aG9kLgotCSAqIFNpbWlsYXIgdG8gYSBTaWduYXR1cmUsIGJ1dCBob3BlZnVsbHkgbW9yZSByZWFkYWJsZS4KLQkgKiBJZiB0aGVyZSBhcmUgbm8gcGFybXMsIGl0IHdpbGwgZW5kIHdpdGggYSAiKCIgc28gdGhhdCBpdCBjYW4gYmUgZGlzdGljdGl2ZSBmcm9tIGEgZmllbGQuCi0JICogVGhlIG5hbWUgZm9ybWF0IHdpbGwgYmU6Ci0JICogCXNpbXBsZUNsYXNzTmFtZS5tZXRob2ROYW1lKGNvbS5mcm9uay5QYXJtVHlwZTFfcGFybVR5cGUyCi0JICogTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aWdodGx5IGNvdXBsZWQgd2l0aCBSZWZsZWN0aW9uQWRhcHRlci5nZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kSUQoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGpka01ldGhvZCkgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0U2ltcGxlTmFtZShqZGtNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpOwotCQlvdXQuYXBwZW5kKGNsYXNzTmFtZSk7Ci0JCW91dC5hcHBlbmQoQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQkJb3V0LmFwcGVuZChjb21wdXRlTWV0aG9kTmFtZShqZGtNZXRob2QpKTsKLQkJb3V0LmFwcGVuZChDX01FVEhPRF9QQVJNX0RFTElNSVRFUik7Ci0JCUNsYXNzW10gcGFybVR5cGVzID0gamRrTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlvdXQuYXBwZW5kKHBhcm1UeXBlc1tpXS5nZXROYW1lKCkpOwotCQkJaWYgKGkgPCBwYXJtVHlwZXMubGVuZ3RoIC0gMSkKLQkJCQlvdXQuYXBwZW5kKENfUEFSTV9QQVJNX0RFTElNSVRFUik7Ci0JCX0KLQkJaWYgKGpka01ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoamRrTWV0aG9kLmdldE5hbWUoKSkpCi0JCQlvdXQuYXBwZW5kKFNfQ09OU1RSVUNUT1JfVE9LRU4pOyAvL0l0J3MgYSBjb25zdHJ1Y3RvcgotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2ROYW1lIC0gZ2VuZXJhdGUgdGhlIG5hbWUgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIGNvbnN0cnVjdG9yLgotCSAqIEZvciB0aGUgbW9tZW50LCBuYW1lcyBhcmUgc2ltcGxlLCBhbmQgVVVJRCdzIGFyZSBjb21wbGV4LgotCSAqCi0JICogSXQgaGFzIHRvIGJlIGRvbmUgc2VwYXJhdGVseSBmb3IgSkRLIGJlY2F1c2UgQ29uc3RydWN0b3JzIGFuZCBNZXRob2RzIGFyZSBkaWZmZXJlbnQgY2xhc3Nlcy4KLQkgKiBIb3dldmVyLCBpbiB0aGUgSmF2YSBNb2RlbCB0aGV5IGFyZSBib3RoIGp1c3QgTWV0aG9kcyB3aXRoIGEgZmxhZyBpbmRpY2F0aW5nIENvbnN0cnVjdG9yLiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kTmFtZShqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBqZGtDb25zdHJ1Y3RvcikgewotCQlyZXR1cm4gZ2V0U2ltcGxlTmFtZShqZGtDb25zdHJ1Y3Rvci5nZXROYW1lKCkpOyAvLyBDVE9SIG5hbWVzIGNvbWUgYmFjayBmdWxseS1xdWFsaWZpZWQgd2l0aCBwYWNrYWdlLgotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kTmFtZSAtIGdlbmVyYXRlIHRoZSBuYW1lIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QuCi0JICogRm9yIHRoZSBtb21lbnQsIG5hbWVzIGFyZSBzaW1wbGUsIGFuZCBVVUlEJ3MgYXJlIGNvbXBsZXguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZE5hbWUoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGpka01ldGhvZCkgewotCQlyZXR1cm4gamRrTWV0aG9kLmdldE5hbWUoKTsKLQl9Ci0JLyoqCi0JICogY3JlYXRlSmF2YUZpZWxkIC0gaW5zdGFudGlhdGUgYSBKYXZhIEZpZWxkIGJhc2VkIG9uIHRoZSBwYXNzZWQgRmllbGQKLQkgKiBXZSBhcmUgZGVmZXJyaW5nIGZpZWxkIGNvbnRlbnRzIGFzc3VtaW5nIHRoYXQgaXRzIGFkYXB0b3Igd2lsbCByZWZsZWN0IGl0cyBkZXRhaWxzLgotCSAqLwotCXB1YmxpYyBGaWVsZCBjcmVhdGVKYXZhRmllbGQoamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgcmVmbGVjdGVkRmllbGQsIFhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUZpZWxkIG5ld0ZpZWxkID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVGaWVsZCgpOwotCQluZXdGaWVsZC5zZXROYW1lKHJlZmxlY3RlZEZpZWxkLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRTaW1wbGVOYW1lKHJlZmxlY3RlZEZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJcmVzb3VyY2Uuc2V0SUQobmV3RmllbGQsIGNsYXNzTmFtZSArIENfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUiArIHJlZmxlY3RlZEZpZWxkLmdldE5hbWUoKSk7Ci0JCXJldHVybiBuZXdGaWVsZDsKLQl9Ci0JLyoqCi0JICogY3JlYXRlSmF2YU1ldGhvZCAtIGluc3RhbnRpYXRlIGEgSmF2YSBNZXRob2QgYmFzZWQgb24gdGhlIHBhc3NlZCBKYXZhIFJlZmxlY3Rpb24gQ29uc3RydWN0b3IKLQkgKiBXZSBhcmUgZGVmZXJyaW5nIG1ldGhvZCBjb250ZW50cyBhc3N1bWluZyB0aGF0IGl0cyBhZGFwdG9yIHdpbGwgcmVmbGVjdCBpdHMgZGV0YWlscy4KLQkgKiBXZSBuZWVkIHRvIHN0b3JlIGVub3VnaCBpbmZvIGluIHRoZSBlbXB0eSBNZXRob2QgdG8gZmluZCBpdHMgSmF2YSBzb3VyY2UuCi0JICogVGhlIElEIHdpbGwgZXZlbnR1YWxseSBob2xkIGVub3VnaCBpbmZvIHRvIGlkZW50aWZ5IHRoZSBzb3VyY2UsIHNvIHdlIHVzZSBpdC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGNyZWF0ZUphdmFNZXRob2QoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgamRrQ29uc3RydWN0b3IsIFhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1ldGhvZCBuZXdNZXRob2QgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotCQkvLyBXZSB1c2UgYSBzaW1wbGUgbmFtZSwgYnV0IGEgY29tcGxleCBJRCAKLQkJbmV3TWV0aG9kLnNldE5hbWUoY29tcHV0ZU1ldGhvZE5hbWUoamRrQ29uc3RydWN0b3IpKTsKLQkJcmVzb3VyY2Uuc2V0SUQobmV3TWV0aG9kLCBjb21wdXRlTWV0aG9kSUQoamRrQ29uc3RydWN0b3IpKTsKLQkJcmV0dXJuIG5ld01ldGhvZDsKLQl9Ci0JLyoqCi0JICogY3JlYXRlSmF2YU1ldGhvZCAtIGluc3RhbnRpYXRlIGEgSmF2YSBNZXRob2QgYmFzZWQgb24gdGhlIHBhc3NlZCBKYXZhIFJlZmxlY3Rpb24gTWV0aG9kCi0JICogV2UgYXJlIGRlZmVycmluZyBtZXRob2QgY29udGVudHMgYXNzdW1pbmcgdGhhdCBpdHMgYWRhcHRvciB3aWxsIHJlZmxlY3QgaXRzIGRldGFpbHMuCi0JICogV2UgbmVlZCB0byBzdG9yZSBlbm91Z2ggaW5mbyBpbiB0aGUgZW1wdHkgTWV0aG9kIHRvIGZpbmQgaXRzIEphdmEgc291cmNlLgotCSAqIFRoZSBJRCB3aWxsIGV2ZW50dWFsbHkgaG9sZCBlbm91Z2ggaW5mbyB0byBpZGVudGlmeSB0aGUgc291cmNlLCBzbyB3ZSB1c2UgaXQuCi0JICovCi0JcHVibGljIE1ldGhvZCBjcmVhdGVKYXZhTWV0aG9kKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBqZGtNZXRob2QsIFhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1ldGhvZCBuZXdNZXRob2QgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotCQkvLyBXZSB1c2UgYSBzaW1wbGUgbmFtZSwgYnV0IGEgY29tcGxleCBJRCAKLQkJbmV3TWV0aG9kLnNldE5hbWUoY29tcHV0ZU1ldGhvZE5hbWUoamRrTWV0aG9kKSk7Ci0JCXJlc291cmNlLnNldElEKG5ld01ldGhvZCwgY29tcHV0ZU1ldGhvZElEKGpka01ldGhvZCkpOwotCQlyZXR1cm4gbmV3TWV0aG9kOwotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDExLzA3LzAwIDM6NDM6NTUgUE0pCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5KYXZhSkRLQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCXB1YmxpYyBDbGFzc0xvYWRlciBnZXRBbHRlcm5hdGVDbGFzc0xvYWRlcigpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXJGYWN0b3J5KCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JfQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogTWV0aG9kIHRvIGNvbnZlcnQgdGhlIHRleHR1YWwgZm9ybSBvZiBhIHByaW1pdGl2ZSB0eXBlIGludG8gaXRzIENsYXNzIG9iamVjdAotCSoKLQkqIEBwYXJhbSB0eXBlIFRoZSBwcmltaXRpdmUgdHlwZSdzIHRleHR1YWwgcmVwcmVzZW50YXRpb24KLQkqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0UHJpbWl0aXZlVHlwZShTdHJpbmcgdHlwZSkgewotCQlDbGFzcyBjID0gbnVsbDsKLQotCQlpZiAodHlwZS5lcXVhbHMoYnl0ZS5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gYnl0ZS5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhzaG9ydC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gc2hvcnQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBpbnQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMobG9uZy5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gbG9uZy5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhmbG9hdC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gZmxvYXQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoZG91YmxlLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBkb3VibGUuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gYm9vbGVhbi5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhjaGFyLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBjaGFyLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IHZvaWQuY2xhc3M7Ci0JCX0KLQotCQlyZXR1cm4gYzsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFzdCBzZWdtZW50IG9mIGEgJy4nLXNlcGFyYXRlZCBxdWFsaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm5zIHRoZSBnaXZlbiBuYW1lIGlmIGl0IGlzIG5vdCBxdWFsaWZpZWQuCi0JICogRm9yIGV4YW1wbGU6Ci0JICogPHByZT4KLQkgKiBnZXRTaW1wbGVOYW1lKCJqYXZhLmxhbmcuT2JqZWN0IikgLT4gIk9iamVjdCIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWludCBsYXN0RG90ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobGFzdERvdCA9PSAtMSkKLQkJCXJldHVybiBuYW1lOwotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpOwotCX0KLQlwdWJsaWMgQ2xhc3MgZ2V0VHlwZShKYXZhSGVscGVycyBtb2RlbENsYXNzKSB7Ci0JCUNsYXNzIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChtb2RlbENsYXNzLmlzQXJyYXkoKSkgewotCQkJQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIG1vZGVsQ2xhc3M7Ci0JCQlDbGFzcyBjb21wb25lbnRDbGFzcyA9IGdldFR5cGUoYXJyYXlUeXBlLmdldEZpbmFsQ29tcG9uZW50VHlwZSgpKTsKLQkJCXJlc3VsdCA9IChBcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRDbGFzcywgbmV3IGludFthcnJheVR5cGUuZ2V0QXJyYXlEaW1lbnNpb25zKCldKSkuZ2V0Q2xhc3MoKTsKLQkJfSBlbHNlIGlmIChtb2RlbENsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXJlc3VsdCA9IGdldFR5cGUobW9kZWxDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gZ2V0VHlwZSgoKEphdmFDbGFzcykgbW9kZWxDbGFzcykuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIENsYXNzIGdldFR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJLy8gVHJ5IGZvciBhIHByaW1pdGl2ZSB0eXBlICgiaW50IiwiY2hhciIsZXRjLikgZmlyc3QKLQkJQ2xhc3MgcHJpbVR5cGUgPSBnZXRQcmltaXRpdmVUeXBlKHF1YWxpZmllZE5hbWUpOwotCQlpZiAocHJpbVR5cGUgPT0gbnVsbCkgewotCQkJLy8gQ2hhbmdlZCBmb3IgZGVmZWN0ICMyMTIxNDcgYm90cEBhdXNhaXgxOS5hdXN0aW4uaWJtLmNvbUA3NjMwIHN5c3RlbS4KLQkJCS8vCi0JCQkvLyBTZWFyY2ggb25seSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzc2xvYWRlcnMgKHRoZSBmaXJzdCBvbmUgdGhhdCBleGlzdHMpIGluIHRoaXMgb3JkZXIuIElmIG5vdCBmb3VuZAotCQkJLy8gaW4gYSBjbGFzc2xvYWRlciwgaXQgd2lsbCBub3Qgcm9sbC1vdmVyIHRvIGFub3RoZXIgY2xhc3MgbG9hZGVyLiBUaGlzIGlzIHRvIGF2b2lkIHByb2JsZW1zIHdoZXJlIGEKLQkJCS8vIGNsYXNzIG1heSBleGlzdCBpbiBtb3JlIHRoYW4gb25lIGNsYXNzbG9hZGVyLiBZb3UgZ2V0IGVycm9ycyB3aGVuIHRoaXMgaGFwcGVucyBkdWUgdG8gb25lIGNsYXNzIHRoYXQKLQkJCS8vIHdhcyBmb3VuZCBpbiBvbmx5IG9uZSBjbGFzc2xvYWRlciB0aGF0IHJlZmVycyB0byBhbm90aGVyIGNsYXNzIHRoYXQgd2FzIGZvdW5kIGluIGJvdGggY2xhc3Nsb2FkZXJzLgotCQkJLy8gVGhleSBkb24ndCBtYXRjaCB3aGVuIHRyeWluZyB0byByZWZsZWN0IGxhdGVyLgotCQkJLy8gMSkgQWx0ZXJuYXRlIGNsYXNzbG9hZGVyIChpZiBleGlzdHMpCi0JCQkvLyAyKSBUaHJlYWQgY29udGV4dCBjbGFzc2xvYWRlciAoaWYgZXhpc3RzKQotCQkJLy8gMykgU3lzdGVtIGNsYXNzbG9hZGVyIChpZiBleGlzdHMpCi0JCQkvLyA0KSBDbGFzcy5mb3JOYW1lKCkuCi0JCQlpZiAoZ2V0QWx0ZXJuYXRlQ2xhc3NMb2FkZXIoKSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIGdldEFsdGVybmF0ZUNsYXNzTG9hZGVyKCkubG9hZENsYXNzKHF1YWxpZmllZE5hbWUpOwotCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mMikgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUNsYXNzTG9hZGVyIGNvbnRleHRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCQlpZiAoY29udGV4dENsYXNzTG9hZGVyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gY29udGV4dENsYXNzTG9hZGVyLmxvYWRDbGFzcyhxdWFsaWZpZWROYW1lKTsKLQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlDbGFzc0xvYWRlciBzeXN0ZW1DbGFzc0xvYWRlciA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7Ci0JCQlpZiAoc3lzdGVtQ2xhc3NMb2FkZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBzeXN0ZW1DbGFzc0xvYWRlci5sb2FkQ2xhc3MocXVhbGlmaWVkTmFtZSk7Ci0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShxdWFsaWZpZWROYW1lKTsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9IGVsc2UKLQkJCXJldHVybiBwcmltVHlwZTsKLQl9Ci0JLyoKLQkgKiBVdGlsaXR5IHJvdXRpbmUgdG8gcGFwZXIgb3ZlciBhcnJheSB0eXBlIG5hbWVzCi0JICogQm9ycm93ZWQgZnJvbSBhIHBhY2thZ2UtdmlzaWJpbGl0eSBoZWxwZXIgb24gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKENsYXNzIHR5cGUpIHsKLQkJaWYgKHR5cGUuaXNBcnJheSgpKSB7Ci0JCQl0cnkgewotCQkJCUNsYXNzIGNsID0gdHlwZTsKLQkJCQlpbnQgZGltZW5zaW9ucyA9IDA7Ci0JCQkJd2hpbGUgKGNsLmlzQXJyYXkoKSkgewotCQkJCQlkaW1lbnNpb25zKys7Ci0JCQkJCWNsID0gY2wuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCX0KLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJc2IuYXBwZW5kKGNsLmdldE5hbWUoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspIHsKLQkJCQkJc2IuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLypGQUxMVEhSVSovCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogTWV0aG9kIHRvIGNvbnZlcnQgdGhlIHRleHR1YWwgZm9ybSBvZiBhIHByaW1pdGl2ZSB0eXBlIGludG8gaXRzIENsYXNzIG9iamVjdAotCSoKLQkqIEBwYXJhbSB0eXBlIFRoZSBwcmltaXRpdmUgdHlwZSdzIHRleHR1YWwgcmVwcmVzZW50YXRpb24KLQkqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgcHJpbWl0aXZlRm9yTmFtZShTdHJpbmcgdHlwZSkgewotCQlDbGFzcyBjID0gbnVsbDsKLQotCQlpZiAodHlwZS5lcXVhbHMoYnl0ZS5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gYnl0ZS5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhzaG9ydC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gc2hvcnQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBpbnQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMobG9uZy5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gbG9uZy5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhmbG9hdC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gZmxvYXQuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoZG91YmxlLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBkb3VibGUuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gYm9vbGVhbi5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhjaGFyLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSBjaGFyLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IHZvaWQuY2xhc3M7Ci0JCX0KLQotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDExLzA3LzAwIDM6NDM6NTUgUE0pCi0JICogQHBhcmFtIG5ld0FkYXB0ZXJGYWN0b3J5IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLkphdmFKREtBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkYXB0ZXJGYWN0b3J5KEphdmFKREtBZGFwdGVyRmFjdG9yeSBuZXdBZGFwdGVyRmFjdG9yeSkgewotCQlhZGFwdGVyRmFjdG9yeSA9IG5ld0FkYXB0ZXJGYWN0b3J5OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFDbGFzc0pES0FkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFDbGFzc0pES0FkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2Zjk5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhQ2xhc3NKREtBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGs7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFDbGFzc0FkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0vKioKLSAqIFJlZmxlY3QgdGhlIGNsYXNzIHVzaW5nIHN0YW5kYXJkIGphdmEucmVmbGVjdCBtZXRob2RzLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ2xhc3NKREtBZGFwdG9yIGV4dGVuZHMgSkRLQWRhcHRvciBpbXBsZW1lbnRzIElKYXZhQ2xhc3NBZGFwdG9yIHsKLQotCXByb3RlY3RlZCBDbGFzcyBzb3VyY2VUeXBlID0gbnVsbDsKLQotCXB1YmxpYyBKYXZhQ2xhc3NKREtBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGFuQWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0LCBhbkFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBhZGRGaWVsZHMgLSByZWZsZWN0IG91ciBmaWVsZHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWVsZHMoKSB7Ci0JCVhNSVJlc291cmNlIHJlc291cmNlID0gKFhNSVJlc291cmNlKSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5lUmVzb3VyY2UoKTsKLQkJTGlzdCB0YXJnZXRGaWVsZHMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRGaWVsZHNHZW4oKTsKLQkJdGFyZ2V0RmllbGRzLmNsZWFyKCk7Ci0JCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkW10gZmllbGRzID0ge307Ci0JCXRyeSB7Ci0JCQlmaWVsZHMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZXJyb3IpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKAotCQkJCQkiQ291bGRfTm90X1JlZmxlY3RfRmllbGRzX0VSUk9SXyIsIG5ldyBPYmplY3RbXSB7IGdldEphdmFDbGFzc1RhcmdldCgpLmdldFF1YWxpZmllZE5hbWUoKSwgZXJyb3IuZ2V0TWVzc2FnZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCXRhcmdldEZpZWxkcy5hZGQoY3JlYXRlSmF2YUZpZWxkKGZpZWxkc1tpXSwgcmVzb3VyY2UpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZE1ldGhvZHMgLSByZWZsZWN0IG91ciBtZXRob2RzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0aG9kcygpIHsKLQkJLy8gV2UgbmVlZCB0byBmaXJzdCBkbyBtZXRob2RzIGFuZCB0aGVuIGRvIGNvbnN0cnVjdG9ycyBiZWNhdXNlIHRoZSBKREsgdHJlYXRzIHRoZW0gYXMgdHdvCi0JCS8vIGRpZmZlcmVudCBvYmplY3RzLCB3aGljaCB0aGUgSmF2YSBNb2RlbCB0cmVhdHMgdGhlbSBhcyBib3RoIE1ldGhvZCdzLgotCQlYTUlSZXNvdXJjZSByZXNvdXJjZSA9IChYTUlSZXNvdXJjZSkgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZVJlc291cmNlKCk7Ci0JCUxpc3QgdGFyZ2V0TWV0aG9kcyA9IGdldEphdmFDbGFzc1RhcmdldCgpLmdldE1ldGhvZHNHZW4oKTsKLQkJdGFyZ2V0TWV0aG9kcy5jbGVhcigpOwotCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2RbXSBtZXRob2RzID0ge307Ci0JCXRyeSB7Ci0JCQltZXRob2RzID0gZ2V0U291cmNlVHlwZSgpLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQl9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlcnJvcikgewotCQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpIHsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2coCi0JCQkJCQkJCVJlc291cmNlSGFuZGxlcgotCQkJCQkJCQkJCS5nZXRTdHJpbmcoCi0JCQkJCQkJCQkJCQkiQ291bGRfTm90X1JlZmxlY3RfTWV0aG9kc19FUlJPUl8iLCBuZXcgT2JqZWN0W10geyBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRRdWFsaWZpZWROYW1lKCksIGVycm9yLnRvU3RyaW5nKCl9KSwgTGV2ZWwuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCXRhcmdldE1ldGhvZHMuYWRkKGNyZWF0ZUphdmFNZXRob2QobWV0aG9kc1tpXSwgcmVzb3VyY2UpKTsKLQkJfQotCi0JCS8vIE5vdyBkbyB0aGUgY29uc3RydWN0b3JzCi0JCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yW10gY3RvcnMgPSB7fTsKLQkJdHJ5IHsKLQkJCWN0b3JzID0gZ2V0U291cmNlVHlwZSgpLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCk7Ci0JCX0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGVycm9yKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkgewotCQkJCWxvZ2dlcgotCQkJCQkJLmxvZygKLQkJCQkJCQkJUmVzb3VyY2VIYW5kbGVyCi0JCQkJCQkJCQkJLmdldFN0cmluZygKLQkJCQkJCQkJCQkJCSJDb3VsZF9Ob3RfUmVmbGVjdF9Db25zdHJ1Y3RvcnNfRVJST1JfIiwgbmV3IE9iamVjdFtdIHsgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBlcnJvci5nZXRNZXNzYWdlKCl9KSwgTGV2ZWwuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0YXJnZXRNZXRob2RzLmFkZChjcmVhdGVKYXZhTWV0aG9kKGN0b3JzW2ldLCByZXNvdXJjZSkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgcmVmbGVjdGVkIGZpZWxkcyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoRmllbGRzKCkgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRGaWVsZHNHZW4oKS5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgaW1wbGVtZW50cyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoSW1wbGVtZW50cygpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXNHZW4oKS5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgcmVmbGVjdGVkIG1ldGhvZHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaE1ldGhvZHMoKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLmdldE1ldGhvZHNHZW4oKS5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaElubmVyQ2xhc3NlcygpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hNb2RpZmllcnMoKSB7Ci0JCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEFic3RyYWN0KGZhbHNlKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEZpbmFsKGZhbHNlKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldFB1YmxpYyhmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaFJlZmxlY3RlZFZhbHVlcyhib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmbHVzaE1vZGlmaWVycygpOwotCQlyZXN1bHQgJj0gZmx1c2hTdXBlcigpOwotCQlyZXN1bHQgJj0gZmx1c2hJbXBsZW1lbnRzKCk7Ci0JCXJlc3VsdCAmPSBmbHVzaE1ldGhvZHMoKTsKLQkJcmVzdWx0ICY9IGZsdXNoRmllbGRzKCk7Ci0JCXJlc3VsdCAmPSBmbHVzaElubmVyQ2xhc3NlcygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI3Bvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShib29sZWFuIGlzRXhpc3RpbmcpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuc2V0UmVmbGVjdGVkKGZhbHNlKTsKLQkJc3VwZXIucG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoaXNFeGlzdGluZyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzdXBlcnR5cGUgdG8gYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaFN1cGVyKCkgewotCQlMaXN0IHRhcmdldFN1cGVycyA9IGdldEphdmFDbGFzc1RhcmdldCgpLnByaW1HZXRFU3VwZXJUeXBlcygpOwotCQl0YXJnZXRTdXBlcnMuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YXJnZXQgdHlwZWQgdG8gYSBKYXZhQ2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzc0ltcGwgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkgewotCQlyZXR1cm4gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZVR5cGUoKTsKLQl9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2hhc1JlZmxlY3Rpb25Tb3VyY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2VUeXBlICE9IG51bGw7Ci0gICAgfQotCi0JLyoqCi0JICogZ2V0U291cmNlVHlwZSAtIHJldHVybiB0aGUgamF2YS5sYW5nLkNsYXNzIHdoaWNoIGRlc2NyaWJlcyBvdXIgZXhpc3RpbmcgSmF2YSBjbGFzcwotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRTb3VyY2VUeXBlKCkgewotCQlpZiAoc291cmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlzb3VyY2VUeXBlID0gZ2V0VHlwZSgoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZVR5cGUgaXMgbnVsbCBvciBpZiBpdCBpcyBhIGJpbmFyeSB0eXBlLiBSZWZsZWN0aW9uIGZyb20gdGhlIEpESyBpcyBhbHdheXMgZnJvbSBiaW5hcnkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTb3VyY2VUeXBlRnJvbUJpbmFyeSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldC4gb24gZW50cnk6IG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwgYW5kCi0JICogZG9jdW1lbnQgbXVzdCBiZSBzZXQuIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwgSmF2YUNsYXNzIGFkYXB0b3I6IC0gc2V0IG1vZGlmaWVycyAtIHNldCBuYW1lIC0gc2V0IHJlZmVyZW5jZSB0byBzdXBlciAtIGNyZWF0ZSBtZXRob2RzIC0KLQkgKiBjcmVhdGUgZmllbGRzIC0gYWRkIGltcG9ydHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlzdXBlci5yZWZsZWN0VmFsdWVzKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0U291cmNlVHlwZSgpICE9IG51bGwpIHsKLQkJCQlzZXRNb2RpZmllcnMoKTsKLQkJCQlzZXROYW1pbmcoKTsKLQkJCQl0cnkgewotCQkJCQlzZXRTdXBlcigpOwotCQkJCX0gY2F0Y2ggKEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCX0KLQkJCQlzZXRJbXBsZW1lbnRzKCk7Ci0JCQkJYWRkTWV0aG9kcygpOwotCQkJCWFkZEZpZWxkcygpOwotCQkJCXJlZmxlY3RJbm5lckNsYXNzZXMoKTsKLQkJCQlzZXREZWNsYXJpbmdDbGFzcygpOwotCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkucmVnaXN0ZXJSZWZsZWN0aW9uKGdldFNvdXJjZVR5cGUoKS5nZXROYW1lKCksIHRoaXMpOwotCQkJCS8vCWFkZEltcG9ydHMoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vRG9uJ3QgY2FjaGUgdGhlIGNsYXNzIGJleW9uZCB0aGUgb3BlcmF0aW9uIG9mIHJlZmxlY3QgdmFsdWVzOwotCQkJLy90aGlzIGVuYWJsZXMgZHluYW1pYyBzd2FwcGluZyBvZiB0aGUgYWx0ZXJuYXRlIGNsYXNzIGxvYWRlcgotCQkJLy9mb3IgamF2YSByZWZsZWN0aW9uLCBhcyB3ZWxsIGFzIGF2b2lkcyBwb3RlbnRpYWwgbWVtb3J5IGxlYWthZ2UKLQkJCXNvdXJjZVR5cGUgPSBudWxsOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlY2xhcmluZ0NsYXNzKCkgewotCQlDbGFzcyBkZWNsYXJpbmdUeXBlID0gZ2V0U291cmNlVHlwZSgpLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0JCWlmIChkZWNsYXJpbmdUeXBlICE9IG51bGwpIHsKLQkJCS8vIE5lZWQgdG8gZ2V0IGl0IGFuZCByZWZsZWN0IGl0IHNvIHRoYXQgdGhlIGRlY2xhcmVkIHR5cGUgb2YgdGhpcyB0YXJnZXQgaXMgc2V0IGNvcnJlY3RseS4gV2UgY2FuIGp1c3QKLQkJCS8vIHNldCBpdCBvdXJzZWx2ZXMgZGlyZWN0bHkgYmVjYXVzZSBFQ29yZSB3b3VsZCB0cnkgdG8gYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGlubmVyIGNsYXNzZXMgb2YgdGhlIGRlY2xhcmluZyB0eXBlLiBUaGlzCi0JCQkvLyB3b3VsZCBjYXVzZSBpdCB0byBiZSBhZGRlZCB0d2ljZSwgb25jZSBmcm9tIHRoZSByZWZsZWN0aW9uIGNhdXNlZCBieSB0aGUgaW52ZXJzZSBzZXR0aW5nLCBhbmQgb25jZSBmcm9tIG91ciBkb2luZwotCQkJLy8gdGhlIGludmVyc2Ugc2V0dGluZyBpdHNlbGYuCi0JCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRUYXJnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlKYXZhQ2xhc3NJbXBsIGRlY2xhcmluZ0NsYXNzID0gKEphdmFDbGFzc0ltcGwpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShkZWNsYXJpbmdUeXBlLmdldE5hbWUoKSwgc2V0KTsKLQkJCWRlY2xhcmluZ0NsYXNzLmdldERlY2xhcmVkQ2xhc3NlcygpOwkvLyBUaGlzIHdpbGwgY2F1c2UgaXQgdG8gcHV0IHVzIGludG8gaXRzIGxpc3QgYW5kIGFsc28gc2V0IG91ciBkZWNsYXJpbmcgY2xhc3MgdG8gdGhpcyBkZWNsYXJpbmcgdHlwZS4KLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0SW5uZXJDbGFzc2VzKCkgewotCQlDbGFzc1tdIGlubmVyQ2xhc3NlcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRDbGFzc2VzKCk7Ci0JCWlmIChpbm5lckNsYXNzZXMubGVuZ3RoICE9IDApIHsKLQkJCUxpc3QgZGVjbGFyZWRDbGFzc2VzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCk7Ci0JCQlKYXZhQ2xhc3MgaW5uZXI7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRUYXJnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlubmVyQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCWlubmVyID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGlubmVyQ2xhc3Nlc1tpXS5nZXROYW1lKCksIHNldCk7Ci0JCQkJZGVjbGFyZWRDbGFzc2VzLmFkZChpbm5lcik7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHNldEltcGxlbWVudHMgLSBzZXQgb3VyIGltcGxlbWVudGVkL3N1cGVyIGludGVyZmFjZXMgaGVyZSBGb3IgYW4gaW50ZXJmYWNlLCB0aGVzZSBhcmUgc3VwZXJjbGFzc2VzLiBGb3IgYSBjbGFzcywgdGhlc2UgYXJlIGltcGxlbWVudGVkCi0JICogaW50ZXJmYWNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbXBsZW1lbnRzKCkgewotCQlDbGFzc1tdIGludGVyZmFjZXMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0SW50ZXJmYWNlcygpOwotCQkvLyBuZWVkcyB3b3JrLCB0aGUgbmFtZXMgYWJvdmUgd2lsbCBiZSBzaW1wbGUgbmFtZXMgaWYgd2UgYXJlIHJlbGZlY3RpbmcgZnJvbSBhIHNvdXJjZSBmaWxlCi0JCUphdmFDbGFzc0ltcGwgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCQlKYXZhQ2xhc3MgcmVmOwotCQlMaXN0IGludExpc3QgPSBqYXZhQ2xhc3NUYXJnZXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXNHZW4oKTsKLQkJaW50TGlzdC5jbGVhcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlZiA9IGNyZWF0ZUphdmFDbGFzc1JlZihpbnRlcmZhY2VzW2ldLmdldE5hbWUoKSk7Ci0JCQlpbnRMaXN0LmFkZChyZWYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0TW9kaWZpZXJzIC0gc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHJlbGF0ZWQgdG8gbW9kaWZpZXJzIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RpZmllcnMoKSB7Ci0JCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldEFic3RyYWN0KGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzQWJzdHJhY3QoZ2V0U291cmNlVHlwZSgpLmdldE1vZGlmaWVycygpKSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRGaW5hbChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0ZpbmFsKGdldFNvdXJjZVR5cGUoKS5nZXRNb2RpZmllcnMoKSkpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0UHVibGljKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHVibGljKGdldFNvdXJjZVR5cGUoKS5nZXRNb2RpZmllcnMoKSkpOwotCQkvLyBTZXQgdHlwZSB0byBjbGFzcyBvciBpbnRlcmZhY2UsIG5vdCB5ZXQgaGFuZGxpbmcgRVhDRVBUSU9OCi0JCWlmIChnZXRTb3VyY2VUeXBlKCkuaXNJbnRlcmZhY2UoKSkKLQkJCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMKTsKLQkJZWxzZQotCQkJamF2YUNsYXNzVGFyZ2V0LnNldEtpbmQoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCk7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtaW5nIC0gc2V0IHRoZSBuYW1pbmcgdmFsdWVzIGhlcmUgLSBxdWFsaWZpZWQgbmFtZSAocGFja2FnZSBuYW1lICsgbmFtZSkgbXVzdCBiZSBzZXQgZmlyc3QsIHRoYXQgaXMgdGhlIHBhdGggdG8gdGhlIHJlYWwgSmF2YSBjbGFzcyAtIElEIC0KLQkgKiBzaW1wbGUgbmFtZSwgaWRlbnRpdHkgd2l0aGluIGEgcGFja2FnZSBkb2N1bWVudCAtIE5PIFVVSUQhISEKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1pbmcoKSB7Ci0JCS8vCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJLy8JamF2YUNsYXNzVGFyZ2V0LnJlZlNldFVVSUQoKFN0cmluZykgbnVsbCk7Ci0JCS8vCSgoWE1JUmVzb3VyY2UpamF2YUNsYXNzVGFyZ2V0LmVSZXNvdXJjZSgpKS5zZXRJRChqYXZhQ2xhc3NUYXJnZXQsZ2V0U2ltcGxlTmFtZShnZXRTb3VyY2VUeXBlKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogc2V0U3VwZXIgLSBzZXQgb3VyIHN1cGVydHlwZSBoZXJlLCBpbXBsZW1lbnRlZCBpbnRlcmZhY2UgYXJlIGhhbmRsZWQgc2VwYXJhdGVseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN1cGVyKCkgdGhyb3dzIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gewotCQlDbGFzcyBzdXBlckNsYXNzID0gbnVsbDsKLQkJc3VwZXJDbGFzcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRTdXBlcmNsYXNzKCk7Ci0JCWlmIChzdXBlckNsYXNzICE9IG51bGwpIHsKLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJCWphdmFDbGFzc1RhcmdldC5zZXRTdXBlcnR5cGUoY3JlYXRlSmF2YUNsYXNzUmVmKHN1cGVyQ2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlVHlwZSBjYW4gYmUgZm91bmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc291cmNlVHlwZUV4aXN0cygpIHsKLQkJcmV0dXJuIGdldFNvdXJjZVR5cGUoKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RGaWVsZHNJZk5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RNZXRob2RzSWZOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFGaWVsZEpES0FkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFGaWVsZEpES0FkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0NjkxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhRmllbGRKREtBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGs7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRmllbGRKREtBZGFwdG9yIGV4dGVuZHMgSkRLQWRhcHRvciB7Ci0JcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHNvdXJjZUZpZWxkID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ2xhc3MgcGFyZW50VHlwZSA9IG51bGw7Ci0JcHVibGljIEphdmFGaWVsZEpES0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0LCBKYXZhSkRLQWRhcHRlckZhY3RvcnkgYW5BZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih0YXJnZXQsIGFuQWRhcHRlckZhY3RvcnkpOwotCX0KLQkvKioKLQkgKiBnZXRQYXJlbnRUeXBlIC0gcmV0dXJuIHRoZSBDbGFzcyB3aGljaCBjb3JyZXNwb25kcyB0byBvdXIgcGFyZW50IEphdmFDbGFzcwotCSAqIHdlJ3JlIGdvaW5nIHRvIGRvIHRoaXMgYSBsb3QsIHNvIGNhY2hlIGl0LgotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRQYXJlbnRUeXBlKCkgewotCQlpZiAocGFyZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlGaWVsZCB0YXJnZXRGaWVsZCA9IChGaWVsZCkgZ2V0VGFyZ2V0KCk7Ci0JCQlKYXZhQ2xhc3MgcGFyZW50SmF2YUNsYXNzID0gdGFyZ2V0RmllbGQuZ2V0SmF2YUNsYXNzKCk7Ci0JCQlKYXZhQ2xhc3NKREtBZGFwdG9yIHBhID0gKEphdmFDbGFzc0pES0FkYXB0b3IpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKHBhcmVudEphdmFDbGFzcy5lQWRhcHRlcnMoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJaWYgKHBhICE9IG51bGwpCi0JCQkJcGFyZW50VHlwZSA9IHBhLmdldFNvdXJjZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gcGFyZW50VHlwZTsKLQl9Ci0JcHVibGljIE9iamVjdCBnZXRSZWZsZWN0aW9uU291cmNlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlRmllbGQoKTsKLQl9Ci0JCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2hhc1JlZmxlY3Rpb25Tb3VyY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2VGaWVsZCAhPSBudWxsOwotICAgIH0KLQkvKioKLQkgKiBnZXRTb3VyY2VGaWVsZCAtIHJldHVybiB0aGUgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgd2hpY2ggZGVzY3JpYmVzIG91ciBpbXBsZW1lbnRpbmcgZmllbGQKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZ2V0U291cmNlRmllbGQoKSB7Ci0JCWlmIChzb3VyY2VGaWVsZCA9PSBudWxsKSB7Ci0JCQlDbGFzcyBwYXJlbnQgPSB0aGlzLmdldFBhcmVudFR5cGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXNvdXJjZUZpZWxkID0gcGFyZW50LmdldERlY2xhcmVkRmllbGQoKChGaWVsZCkgZ2V0VGFyZ2V0KCkpLmdldE5hbWUoKSk7Ci0JCQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBPSywgY2Fycnkgb24KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZUZpZWxkOwotCX0KLQlwdWJsaWMgRmllbGQgZ2V0VGFyZ2V0RmllbGQoKSB7Ci0JCXJldHVybiAoRmllbGQpIGdldFRhcmdldCgpOwotCX0KLQkvKioKLQkgKiBnZXRWYWx1ZUluIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpIHsKLQkJLy8gQXQgdGhpcyBwb2ludCwgdGhpcyBhZGFwdGVyIGRvZXMgbm90IGR5bmFtaWNhbGx5IGNvbXB1dGUgYW55IHZhbHVlcywKLQkJLy8gYWxsIHZhbHVlcyBhcmUgcHVzaGVkIGJhY2sgaW50byB0aGUgdGFyZ2V0IG9uIHRoZSBpbml0aWFsIGNhbGwuCi0JCXJldHVybiBzdXBlci5nZXRWYWx1ZUluKG9iamVjdCwgYXR0cmlidXRlKTsKLQl9Ci0JLyoqCi0JICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldC4KLQkgKiBvbiBlbnRyeTogbmFtZSwgY29udGFpbmluZyBwYWNrYWdlIChhbmQgcXVhbGlmaWVkIG5hbWUpLCBhbmQgZG9jdW1lbnQgbXVzdCBiZSBzZXQuCi0JICogSmF2YUNsYXNzIGFkYXB0b3I6Ci0JICoJLSBzZXQgbW9kaWZpZXJzCi0JICoJLSBzZXQgbmFtZQotCSAqIAktIHNldCB0eXBlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQkJaWYgKGdldFNvdXJjZUZpZWxkKCkgIT0gbnVsbCkgewotCQkJc2V0TW9kaWZpZXJzKCk7Ci0JCQlzZXRUeXBlKCk7Ci0JCQlzZXRJbml0aWFsaXplcklmUG9zc2libGUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogVXNlZCBmb3IgdGhlIHZlcnkgbmFycm93IGNhc2Ugb2YgZmluYWwgc3RhdGljIFN0cmluZ3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbml0aWFsaXplcklmUG9zc2libGUoKSB7Ci0JCWlmICghKGdldFRhcmdldEZpZWxkKCkuaXNTdGF0aWMoKSAmJiBnZXRUYXJnZXRGaWVsZCgpLmlzRmluYWwoKSAmJiAiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKCgoSmF2YUhlbHBlcnMpIGdldFRhcmdldEZpZWxkKCkuZ2V0RVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJdmFsdWUgPSAoU3RyaW5nKSBnZXRTb3VyY2VGaWVsZCgpLmdldChudWxsKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UKLQkJCXZhbHVlID0gIlwiIi5jb25jYXQodmFsdWUpLmNvbmNhdCgiXCIiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQlCbG9jayBhQmxvY2sgPSBjcmVhdGVCbG9jayhnZXRUYXJnZXRGaWVsZCgpLmdldE5hbWUoKSwgdmFsdWUpOwotCQlnZXRUYXJnZXRGaWVsZCgpLnNldEluaXRpYWxpemVyKGFCbG9jayk7Ci0JfQotCS8qKgotCSAqIHNldE1vZGlmaWVycyAtIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlcyByZWxhdGVkIHRvIG1vZGlmaWVycyBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKCkgewotCQlGaWVsZCBqYXZhRmllbGRUYXJnZXQgPSAoRmllbGQpIGdldFRhcmdldCgpOwotCQkvLyBGb3IgSkRLIHJlZmxlY3Rpb24sIEkgZG9uJ3QgdGhpbmsgd2UgY2FuIHNldCB0aGUgaW5pdGlhbGl6ZXIKLQkJaW50IG1vZGlmaWVycyA9IGdldFNvdXJjZUZpZWxkKCkuZ2V0TW9kaWZpZXJzKCk7Ci0JCWphdmFGaWVsZFRhcmdldC5zZXRTdGF0aWMoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSk7Ci0JCWphdmFGaWVsZFRhcmdldC5zZXRUcmFuc2llbnQoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNUcmFuc2llbnQobW9kaWZpZXJzKSk7Ci0JCWphdmFGaWVsZFRhcmdldC5zZXRWb2xhdGlsZShqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1ZvbGF0aWxlKG1vZGlmaWVycykpOwotCQlqYXZhRmllbGRUYXJnZXQuc2V0RmluYWwoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNGaW5hbChtb2RpZmllcnMpKTsKLQkJLy8gU2V0IHZpc2liaWxpdHkKLQkJaWYgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpCi0JCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJZWxzZSBpZiAoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykpCi0JCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBSSVZBVEVfTElURVJBTCk7Ci0JCWVsc2UgaWYgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykpCi0JCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBST1RFQ1RFRF9MSVRFUkFMKTsKLQkJZWxzZQotCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QQUNLQUdFX0xJVEVSQUwpOwotCX0KLQkvKioKLQkgKiBzZXRUeXBlIC0gc2V0IG91ciB0eXBlIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUeXBlKCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZShnZXRTb3VyY2VGaWVsZCgpLmdldFR5cGUoKSk7Ci0JCXNldEZpZWxkVHlwZShnZXRUYXJnZXRGaWVsZCgpLCB0eXBlTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUpES0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhSkRLQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5NGViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhSkRLQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvMTMvMjAwMCAxOjIwOjMxIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSB7Ci0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGNvbnRleHRDbGFzc0xvYWRlcjsKLQkvKioKLQkgKiBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFKREtBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJLy9hZGFwdGVyS2V5ID0gVFlQRV9OQU1FOwotCX0KLQkvKioKLQkgKiBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFKREtBZGFwdGVyRmFjdG9yeShDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpIHsKLQkJdGhpcygpOwotCQlzZXRDb250ZXh0Q2xhc3NMb2FkZXIoYUNsYXNzTG9hZGVyKTsKLQl9Ci0JcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFDbGFzc0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiBuZXcgSmF2YUNsYXNzSkRLQWRhcHRvcih0YXJnZXQsIHRoaXMpOwotCX0KLQlwcm90ZWN0ZWQgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YUZpZWxkQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRmllbGRKREtBZGFwdG9yKHRhcmdldCwgdGhpcyk7Ci0JfQotCXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhTWV0aG9kQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhTWV0aG9kSkRLQWRhcHRvcih0YXJnZXQsIHRoaXMpOwotCX0KLQkvLyBGbHVzaCBBTEwgYWRhcHRlcnMsIHdvcnN0IGNhc2UKLQlwdWJsaWMgdm9pZCBmbHVzaEFsbCgpIHsKLQkJaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCUl0ZXJhdG9yIGkgPSByZWZsZWN0ZWQudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkKLQkJCQkgKChKYXZhQ2xhc3NKREtBZGFwdG9yKSBpLm5leHQoKSkuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCQl9IGZpbmFsbHkgewotCQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsKLQkJfQotCX0KLQkvLyBGbHVzaCB0aGUgYWRhcHRlciBmb3IgYSBzb3VyY2Ugb2JqZWN0Ci0JcHVibGljIHZvaWQgZmx1c2hSZWZsZWN0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQkJSmF2YUNsYXNzSkRLQWRhcHRvciBhID0gKEphdmFDbGFzc0pES0FkYXB0b3IpIHJlZmxlY3RlZC5nZXQoc291cmNlKTsKLQkJaWYgKGEgIT0gbnVsbCkKLQkJCWEuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDExLzA3LzAwIDM6Mzg6MTIgUE0pCi0JICogQHJldHVybiBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsKLQkJcmV0dXJuIGNvbnRleHRDbGFzc0xvYWRlcjsKLQl9Ci0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wNy8wMCAzOjM4OjEyIFBNKQotCSAqIEBwYXJhbSBuZXdDb250ZXh0Q2xhc3NMb2FkZXIgamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dENsYXNzTG9hZGVyKGphdmEubGFuZy5DbGFzc0xvYWRlciBuZXdDb250ZXh0Q2xhc3NMb2FkZXIpIHsKLQkJY29udGV4dENsYXNzTG9hZGVyID0gbmV3Q29udGV4dENsYXNzTG9hZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFNZXRob2RKREtBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhTWV0aG9kSkRLQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTczNWNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFNZXRob2RKREtBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGs7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhTWV0aG9kQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLk1ldGhvZEltcGw7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0Mjo1MCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFNZXRob2RKREtBZGFwdG9yIGV4dGVuZHMgSkRLQWRhcHRvciBpbXBsZW1lbnRzIElKYXZhTWV0aG9kQWRhcHRlciB7Ci0JcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Qgc291cmNlQWNjZXNzaWJsZSA9IG51bGw7IC8vIENvdWxkIGJlIG1ldGhvZCBvciBjdG9yLgotCXByb3RlY3RlZCBDbGFzcyBwYXJlbnRUeXBlID0gbnVsbDsKLQkvLyBjYWNoZSBhIHN0YXRpYyBlbXB0eSBDbGFzc1tdIGZvciBubyBwYXJtIG1ldGhvZHMKLQlwcm90ZWN0ZWQgc3RhdGljIENsYXNzW10gZW1wdHlDbGFzc0FycmF5ID0gbmV3IENsYXNzWzBdOwotCS8vIGNhY2hlIGEgc3RhdGljIGVtcHR5IFN0cmluZ1tdLCB0b28KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGVtcHR5U3RyaW5nQXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotCXB1YmxpYyBKYXZhTWV0aG9kSkRLQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIEphdmFKREtBZGFwdGVyRmFjdG9yeSBhbkFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHRhcmdldCwgYW5BZGFwdGVyRmFjdG9yeSk7Ci0JfQotCS8qKgotCSAqIGFkZEV4Y2VwdGlvbnMgLSByZWZsZWN0IG91ciBleGNlcHRpb24gbGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4Y2VwdGlvbnMoKSB7Ci0JCUNsYXNzW10gZXhjZXB0aW9ucyA9Ci0JCQkoZ2V0U291cmNlQWNjZXNzaWJsZSgpIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotCQkJCT8gKChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0RXhjZXB0aW9uVHlwZXMoKQotCQkJCTogKChqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcikgZ2V0U291cmNlQWNjZXNzaWJsZSgpKS5nZXRFeGNlcHRpb25UeXBlcygpOwotCQkvLwlFTGlzdCBleExpc3QgPSAoRUxpc3QpIGphdmFNZXRob2RUYXJnZXQucHJpbVJlZlZhbHVlKEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RfSmF2YUV4Y2VwdGlvbnMoKSk7Ci0JCUxpc3QgZXhMaXN0ID0gZ2V0TWV0aG9kVGFyZ2V0KCkuZ2V0SmF2YUV4Y2VwdGlvbnNHZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlleExpc3QuYWRkKGNyZWF0ZUphdmFDbGFzc1JlZihleGNlcHRpb25zW2ldLmdldE5hbWUoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEltcGwgZ2V0TWV0aG9kVGFyZ2V0KCkgewotCQlyZXR1cm4gKE1ldGhvZEltcGwpIGdldFRhcmdldCgpOwotCX0KLQkvKioKLQkgKiBhZGRQYXJhbWV0ZXJzIC0gcmVmbGVjdCBvdXIgcGFybXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbWV0ZXJzKCkgewotCQlDbGFzc1tdIHBhcm1UeXBlcyA9Ci0JCQkoZ2V0U291cmNlQWNjZXNzaWJsZSgpIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotCQkJCT8gKChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0UGFyYW1ldGVyVHlwZXMoKQotCQkJCTogKChqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcikgZ2V0U291cmNlQWNjZXNzaWJsZSgpKS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlNZXRob2RJbXBsIGphdmFNZXRob2RUYXJnZXQgPSBnZXRNZXRob2RUYXJnZXQoKTsKLQkJLy8gCUxpc3QgcExpc3QgPSAoTGlzdCkgamF2YU1ldGhvZFRhcmdldC5wcmltUmVmVmFsdWUoSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZF9QYXJhbWV0ZXJzKCkpOwotCQlMaXN0IHBMaXN0ID0gamF2YU1ldGhvZFRhcmdldC5nZXRQYXJhbWV0ZXJzR2VuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwTGlzdC5hZGQoY3JlYXRlSmF2YVBhcmFtZXRlcihqYXZhTWV0aG9kVGFyZ2V0LCAiYXJnIiArIGksIGdldFR5cGVOYW1lKHBhcm1UeXBlc1tpXSkpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpIHsKLQkJcmV0dXJuICgoTWV0aG9kKSBnZXRUYXJnZXQoKSkuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCX0KLQkvKioKLQkgKiBnZXRQYXJlbnRUeXBlIC0gcmV0dXJuIHRoZSBDbGFzcyB3aGljaCBjb3JyZXNwb25kcyB0byBvdXIgcGFyZW50IEphdmFDbGFzcwotCSAqIHdlJ3JlIGdvaW5nIHRvIGRvIHRoaXMgYSBsb3QsIHNvIGNhY2hlIGl0LgotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRQYXJlbnRUeXBlKCkgewotCQlpZiAocGFyZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlNZXRob2QgdGFyZ2V0TWV0aG9kID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCQlKYXZhQ2xhc3MgcGFyZW50SmF2YUNsYXNzID0gdGFyZ2V0TWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJCUphdmFDbGFzc0pES0FkYXB0b3IgcGEgPSAoSmF2YUNsYXNzSkRLQWRhcHRvcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIocGFyZW50SmF2YUNsYXNzLmVBZGFwdGVycygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQlpZiAocGEgIT0gbnVsbCkKLQkJCQlwYXJlbnRUeXBlID0gcGEuZ2V0U291cmNlVHlwZSgpOwotCQl9Ci0JCXJldHVybiBwYXJlbnRUeXBlOwotCX0KLQkvKioKLQkgKiBnZXRQYXJtVHlwZVNpZ25hdHVyZXMgLSByZXR1cm4gYW4gYXJyYXkgb2YgQ2xhc3NlcyBmb3Igb3VyIHBhcmFtZXRlciB0eXBlcwotCSAqIAlGb3IgcmVmbGVjdGlvbiBwdXJwb3Nlcywgd2UgY2FuIG9ubHkgcmVseSBvbiBvdXIgSUQsIHNpbmNlIG91ciBwYXJtcyBtYXkKLQkgKiAgbm90IHlldCBiZSBrbm93bi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3NbXSBnZXRQYXJtVHlwZXMoKSB7Ci0JCU1ldGhvZCBqYXZhTWV0aG9kVGFyZ2V0ID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCVN0cmluZyBpZCA9ICgoWE1JUmVzb3VyY2UpIGphdmFNZXRob2RUYXJnZXQuZVJlc291cmNlKCkpLmdldElEKGphdmFNZXRob2RUYXJnZXQpOwotCQlTdHJpbmdbXSB0eXBlTmFtZXMgPSBnZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoaWQpOwotCQlpZiAodHlwZU5hbWVzID09IG51bGwpCi0JCQlyZXR1cm4gZW1wdHlDbGFzc0FycmF5OwotCQlpbnQgbiA9IHR5cGVOYW1lcy5sZW5ndGg7Ci0JCWlmIChuID09IDApCi0JCQlyZXR1cm4gZW1wdHlDbGFzc0FycmF5OwotCQlDbGFzc1tdIHR5cGVzID0gbmV3IENsYXNzW25dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotCQkJdHlwZXNbaV0gPSBnZXRUeXBlKHR5cGVOYW1lc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VBY2Nlc3NpYmxlKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgeyAKLSAgICAgICAgcmV0dXJuIHNvdXJjZUFjY2Vzc2libGUgIT0gbnVsbDsKLSAgICB9Ci0JLyoqCi0JICogZ2V0c291cmNlTWV0aG9kIC0gcmV0dXJuIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Qgd2hpY2ggZGVzY3JpYmVzIG91ciBpbXBsZW1lbnRpbmcgbWV0aG9kCi0JICovCi0JcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QgZ2V0U291cmNlQWNjZXNzaWJsZSgpIHsKLQkJaWYgKHNvdXJjZUFjY2Vzc2libGUgPT0gbnVsbCkgewotCQkJQ2xhc3MgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnRUeXBlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlDbGFzc1tdIHBhcm1UeXBlcyA9IHRoaXMuZ2V0UGFybVR5cGVzKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc291cmNlQWNjZXNzaWJsZSA9IHBhcmVudC5nZXREZWNsYXJlZE1ldGhvZCgoKE1ldGhvZCkgZ2V0VGFyZ2V0KCkpLmdldE5hbWUoKSwgcGFybVR5cGVzKTsKLQkJCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCQkvLyBPSywgY2FuJ3QgcmVmbGVjdCBpdAotCQkJCX0KLQotCQkJCWlmIChzb3VyY2VBY2Nlc3NpYmxlID09IG51bGwpIHsKLQkJCQkJLy8gSXQgd2Fzbid0IGEgbWV0aG9kLCB0cnkgZm9yIGNvbnN0cnVjdG9yLgotCQkJCQl0cnkgewotCQkJCQkJc291cmNlQWNjZXNzaWJsZSA9IHBhcmVudC5nZXREZWNsYXJlZENvbnN0cnVjdG9yKHBhcm1UeXBlcyk7Ci0JCQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBPSywgY2FuJ3QgcmVmbGVjdCBpdAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2VBY2Nlc3NpYmxlOwotCX0KLQkvKioKLQkgKiBnZXRWYWx1ZUluIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpIHsKLQkJLy8gQXQgdGhpcyBwb2ludCwgdGhpcyBhZGFwdGVyIGRvZXMgbm90IGR5bmFtaWNhbGx5IGNvbXB1dGUgYW55IHZhbHVlcywKLQkJLy8gYWxsIHZhbHVlcyBhcmUgcHVzaGVkIGJhY2sgaW50byB0aGUgdGFyZ2V0IG9uIHRoZSBpbml0aWFsIGNhbGwuCi0JCXJldHVybiBzdXBlci5nZXRWYWx1ZUluKG9iamVjdCwgYXR0cmlidXRlKTsKLQl9Ci0JLyoqCi0JICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldC4KLQkgKiBvbiBlbnRyeTogVVVJRCwgbmFtZSwgY29udGFpbmluZyBwYWNrYWdlIChhbmQgcXVhbGlmaWVkIG5hbWUpLCBhbmQgZG9jdW1lbnQgbXVzdCBiZSBzZXQuCi0JICogTWV0aG9kIGFkYXB0b3I6Ci0JICoJLSBzZXQgbW9kaWZpZXJzCi0JICoJLSBzZXQgbmFtZQotCSAqIAktIHNldCByZXR1cm4gdHlwZQotCSAqIAktIGFkZCBwYXJhbWV0ZXJzCi0JICogCS0gYWRkIGV4Y2VwdGlvbnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlpZiAoZ2V0U291cmNlQWNjZXNzaWJsZSgpICE9IG51bGwpIHsKLQkJCSgoTWV0aG9kKSBnZXRUYXJnZXQoKSkuc2V0SXNHZW5lcmF0ZWQoZmFsc2UpOwotCQkJc2V0TW9kaWZpZXJzKCk7Ci0JCQlzZXROYW1pbmcoKTsKLQkJCXNldFJldHVyblR5cGUoKTsKLQkJCWFkZFBhcmFtZXRlcnMoKTsKLQkJCWFkZEV4Y2VwdGlvbnMoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFNZXRob2RBZGFwdGVyI3JlZmxlY3RHZW5lcmF0ZWRJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdEdlbmVyYXRlZElmTmVjZXNzYXJ5KCkgewotCQlyZXR1cm4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RQYXJhbU5hbWVzSWZOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogc2V0TW9kaWZpZXJzIC0gc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHJlbGF0ZWQgdG8gbW9kaWZpZXJzIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RpZmllcnMoKSB7Ci0JCU1ldGhvZCBtZXRob2RUYXJnZXQgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJaW50IG1vZGlmaWVycyA9Ci0JCQkoZ2V0U291cmNlQWNjZXNzaWJsZSgpIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotCQkJCT8gKChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0TW9kaWZpZXJzKCkKLQkJCQk6ICgoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0TW9kaWZpZXJzKCk7Ci0JCW1ldGhvZFRhcmdldC5zZXRBYnN0cmFjdChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0Fic3RyYWN0KG1vZGlmaWVycykpOwotCQltZXRob2RUYXJnZXQuc2V0RmluYWwoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNGaW5hbChtb2RpZmllcnMpKTsKLQkJbWV0aG9kVGFyZ2V0LnNldE5hdGl2ZShqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc05hdGl2ZShtb2RpZmllcnMpKTsKLQkJbWV0aG9kVGFyZ2V0LnNldFN0YXRpYyhqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N0YXRpYyhtb2RpZmllcnMpKTsKLQkJbWV0aG9kVGFyZ2V0LnNldFN5bmNocm9uaXplZChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N5bmNocm9uaXplZChtb2RpZmllcnMpKTsKLQkJbWV0aG9kVGFyZ2V0LnNldENvbnN0cnVjdG9yKGdldFNvdXJjZUFjY2Vzc2libGUoKSBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yKTsKLQkJLy8gU2V0IHZpc2liaWxpdHkKLQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJaWYgKChqYXZhQ2xhc3MuZ2V0S2luZCgpID09IFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMKSB8fCAoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkpCi0JCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJZWxzZSBpZiAoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykpCi0JCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBSSVZBVEVfTElURVJBTCk7Ci0JCWVsc2UgaWYgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykpCi0JCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBST1RFQ1RFRF9MSVRFUkFMKTsKLQkJZWxzZQotCQkJLy9WaXNpYmlsaXR5IG11c3QgYmUgcGFja2FnZQotCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QQUNLQUdFX0xJVEVSQUwpOwotCX0KLQkvKioKLQkgKiBzZXROYW1pbmcgLSBzZXQgdGhlIG5hbWluZyB2YWx1ZXMgaGVyZQotCSAqIAktIHF1YWxpZmllZCBuYW1lIG11c3QgYmUgc2V0IGZpcnN0LCB0aGF0IGlzIHRoZSBwYXRoIHRvIHRoZSByZWFsIEphdmEgY2xhc3MKLQkgKgktIElECi0JICogCS0gbmFtZS1iYXNlZCBVVUlECi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtaW5nKCkgewotCQkvLwotCQkvLwluYW1pbmcgaXMgY3VycmVudGx5IGEgbm8tb3Agc2luY2UgdGhlIG5hbWUgYW5kIFVVSUQgbXVzdCBiZSBzZXQgcHJpb3IgdG8gcmVmbGVjdGlvbgotCQkvLwkuLi5hbmQgSUQgaXMgcmVkdW5kYW50IHdpdGggVVVJRC4KLQkJLy8JamF2YUZpZWxkVGFyZ2V0LnNldElEKHBhcmVudC5nZXRRdWFsaWZpZWROYW1lKCkgKyAiXyIgKyBqYXZhRmllbGRUYXJnZXQuZ2V0TmFtZSgpKTsKLQl9Ci0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgcmV0dXJuIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJldHVyblR5cGUoKSB7Ci0JCWlmIChnZXRTb3VyY2VBY2Nlc3NpYmxlKCkgaW5zdGFuY2VvZiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIHsKLQkJCUNsYXNzIHR5cGUgPSAoKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkgZ2V0U291cmNlQWNjZXNzaWJsZSgpKS5nZXRSZXR1cm5UeXBlKCk7Ci0JCQlNZXRob2QgamF2YU1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQkJLyoKLQkJCQkJSmF2YVBhcmFtZXRlciBuZXdQYXJhbWV0ZXIgPSBjcmVhdGVKYXZhUGFyYW1ldGVyKGphdmFNZXRob2RUYXJnZXQsICJyZXN1bHQiLCBnZXRUeXBlTmFtZSh0eXBlKSk7Ly8kTk9OLU5MUy0xJAotCQkJCQluZXdQYXJhbWV0ZXIuc2V0UGFyYW1ldGVyS2luZChNZXRhSmF2YVBhcmFtZXRlcktpbmQuUkVUVVJOKTsKLQkJCQkJamF2YU1ldGhvZFRhcmdldC5nZXRQYXJhbWV0ZXJzKCkuYWRkKG5ld1BhcmFtZXRlcik7Ci0JCQkqLwotCQkJamF2YU1ldGhvZFRhcmdldC5zZXRFVHlwZShjcmVhdGVKYXZhQ2xhc3NSZWYoZ2V0VHlwZU5hbWUodHlwZSkpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvbmxzL1Jlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9ubHMvUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmUyOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9ubHMvUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5sczsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJqYXZhYWRhcHRlcnMiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZywgU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZT0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCQkKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCXRyeSB7cmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7cmV0dXJuIGdldFN0cmluZyhrZXkpO30KLQotfQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2JlYW5pbmZvL0lJbnRyb3NwZWN0aW9uQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9iZWFuaW5mby9JSW50cm9zcGVjdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyZjk1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2JlYW5pbmZvL0lJbnRyb3NwZWN0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5iZWFuaW5mbzsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgdGhlIEJlYW5pbmZvIGFkYXB0ZXIuIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24KLSAqIGlzIGluIGEgc2VwYXJhdGUgcHJvamVjdCBzbyB0aGF0IGJlYW5pbmZvIGNvZGUgd2lsbCBub3QgYmUgbG9hZGVkCi0gKiB1bmxlc3MgaXQgbmVlZHMgdG8gYmUuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJSW50cm9zcGVjdGlvbkFkYXB0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfS0VZID0gSUludHJvc3BlY3Rpb25BZGFwdGVyLmNsYXNzOwotCXB1YmxpYyB2b2lkIGludHJvc3BlY3RJZk5lY2Vzc2FyeSgpOwotCXB1YmxpYyBib29sZWFuIGlzU3RhbGUoKTsKLQlwdWJsaWMgRUxpc3QgZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCXB1YmxpYyBFTGlzdCBnZXRFT3BlcmF0aW9ucygpOwotCXB1YmxpYyBCYXNpY0VMaXN0IGdldEVBbGxPcGVyYXRpb25zKCk7Ci0JcHVibGljIEVMaXN0IGdldEV2ZW50cygpOwotCXB1YmxpYyBFTGlzdCBnZXRBbGxFdmVudHMoKTsKLQlwdWJsaWMgRUxpc3QgZ2V0QWxsUHJvcGVydGllcygpOwkKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luaXQvSmF2YUluaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5pdC9KYXZhSW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjZmMWM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5pdC9KYXZhSW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhWE1JRmFjdG9yeUltcGw7Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgSmF2YSBSZWZsZWN0aW9uIG1lY2hhbmlzbXMuIAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUluaXQgewotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBwbHVnaW5faW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgewotCQlpbml0KHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KGJvb2xlYW4gc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcykgewotCQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQlpZiAoc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcykgewotCQkJCXByZVJlZ2lzdGVyUGFja2FnZXMoKTsKLQkJCQlzZXREZWZhdWx0UmVzb3VyY2VGYWN0b3J5KCk7Ci0JCQl9Ci0JCQkvL1JlZ2lzdGVyIHJlc291cmNlIGZhY3RvcnkKLQkJCUphdmFYTUlGYWN0b3J5SW1wbC5yZWdpc3RlcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVSZWdpc3RlclBhY2thZ2VzKCkgewotCQkvL2Vjb3JlCi0JCWlmICghRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuY29udGFpbnNLZXkoImVjb3JlLnhtaSIpKSAvLyROT04tTkxTLTEkCi0JCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoImVjb3JlLnhtaSIsIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UpOyAvLyROT04tTkxTLTEkCi0JCS8vamF2YQotCQlpZiAoIUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmNvbnRhaW5zS2V5KCJqYXZhLnhtaSIpKSAvLyROT04tTkxTLTEkCi0JCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoImphdmEueG1pIiwgSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFJlc291cmNlRmFjdG9yeSgpIHsKLQkJLy9UaGlzIGlzIG5vdCBkb25lIG91dHNpZGUgb2YgRWNsaXBzZQotCQlpZiAoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5nZXQoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTikgPT0gbnVsbCkKLQkJCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KAotCQkJCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sCi0JCQkJbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFBsdWdpbkluaXQoYm9vbGVhbiBiUGx1Z2luSW5pdCkgewotCQkvLyBIZXJlJ3Mgd2hlcmUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3b3VsZCBiZSByZWFkLgotCQlwbHVnaW5faW5pdGlhbGl6ZWQgPSBiUGx1Z2luSW5pdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0ODk1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YURhdGFUeXBlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBJbnN0YW50aWF0aW9uIGhhbmRsZXIuIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24KLSAqIGlzIGluIGEgc2VwYXJhdGUgcHJvamVjdCBzbyB0aGF0IGluc3RhbnRpYXRpb24gY29kZSB3aWxsIG5vdCBiZSBsb2FkZWQKLSAqIHVubGVzcyBpdCBuZWVkcyB0byBiZS4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YW50aWF0aW9uSGFuZGxlciB7Ci0JLyoqCi0JICogQW5zd2VycyB3aGV0aGVyIHRoZSBhZGFwdGVyIGhhbmRsZXMgdGhlIGRhdGF0eXBlCi0JICogb3Igd2hldGhlciB0aGUgc3RhbmRhcmQgRUZhY3RvcnkgZG9lcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVzRGF0YVR5cGUoSmF2YURhdGFUeXBlIHR5cGUpOwotCQotCS8qKgotCSAqIEFuc3dlcnMgd2hldGhlciB0aGUgYWRhcHRlciBoYW5kbGVzIHRoZSBFQ2xhc3Mgb3IgdGhlCi0JICogc3RhbmRhcmQgRUZhY3RvcnkgZG9lcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVzQ2xhc3MoRUNsYXNzIHR5cGUpOwotCQotCS8qKgotCSAqIElmIGFkYXB0ZXJIYW5kbGVzSW5zdGFuY2UgcmV0dXJucyB0cnVlLCB0aGVuCi0JICogdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgdG8gY3JlYXRlIHRoZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGphdmFDbGFzcyk7Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTRlNWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhRmFjdG9yeUltcGw7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGlzIGEgZmFjdG9yeSBmb3IgSUluc3RhbnRpYXRpb25IYW5kbGVyJ3MuIEl0IGlzIGF0dGFjaGVkIGFzCi0gKiBhbiBhZGFwdGVyIG9uIHRoZSBSZXNvdXJjZVNldCB0aGF0IGNvbnRhaW5zIHRoZSBqYXZhIG1vZGVsLiBKYXZhWE1JRmFjdG9yeQotICogd2lsbCB1c2UgaXQgdG8gcmV0cmlldmUgaXRzIElJbnN0YW50aWF0aW9uSGFuZGxlci4gSWYgdGhlIGFkYXB0ZXIgaXMgbm90Ci0gKiBmb3VuZCwgdGhlbiBubyBpbnN0YW50aWF0aW9uIGhhbmRsZXIgZXhpc3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyIGV4dGVuZHMgQWRhcHRlciB7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDbGFzcyBBREFQVEVSX0tFWSA9IElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmNsYXNzOwotCQotCS8qKgotCSAqIFJldHVybiBhbiBJSW5zdGFudGlhdGlvbkhhbmRsZXIuCi0JICovCi0JcHVibGljIElJbnN0YW50aWF0aW9uSGFuZGxlciBnZXRJbnN0YW50aWF0aW9uSGFuZGxlcihKYXZhRmFjdG9yeUltcGwgZmFjdG9yeSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25JbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGU5NTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFuIGluc3RhbmNlLiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uCi0gKiBpcyBpbiBhIHNlcGFyYXRlIHByb2plY3Qgc28gdGhhdCBpbnN0YW50aWF0aW9uIGNvZGUgd2lsbCBub3QgYmUgbG9hZGVkCi0gKiB1bmxlc3MgaXQgbmVlZHMgdG8gYmUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbnRpYXRpb25JbnN0YW5jZSB7Ci0JLyoqCi0JICogQHJldHVybiBUaGUgSmF2YUhlbHBlcnMgZm9yIHRoZSBqYXZhIHR5cGUgb2YgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRKYXZhVHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0FycmF5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9BcnJheVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1ZjY5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0FycmF5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLS8qKgotICogRGVzY3JpYmVzIGEgSmF2YSBBcnJheSB0eXBlCi0gKiAgICBGb3IgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLCBpdCBpcyB1bmxpa2VseSB0aGF0IHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlCi0gKiAgICBzcGVjaWZpZWQgZGlyZWN0bHkuICBUaGlzIHdvdWxkIHJlcXVpcmUgaW5zdGFudGlhdGluZyBhIGNoYWluIG9mIGNvbXBvbmVudCB0eXBlcwotICogICAgc3VjaCBhcyBTdHJpbmdbXVtdW11bXS0+U3RyaW5nW11bXVtdLT5TdHJpbmdbXVtdLT5TdHJpbmdbXS0+U3RyaW5nLgotICogCi0gKiAgIFRoZSBjb21wb25lbnQgdHlwZSByZWxhdGlvbnNoaXAgd2lsbCBiZSBjb21wdXRlZCBpZiB0aGUgZmluYWxDb21wb25lbnRUeXBlCi0gKiAgIGFuZCBhcnJheSBkaW1lbnNpb25zIGlzIHNwZWNpZmllZC4KLSAqICAKLSAqICAgRm9yIHRoaXMgcmVhc29uLCB0aGUgcHJlZmVycmVkIHdheSB0byBjcmVhdGUgaXMgdGhyb3VnaCB0aGUgSmF2YVJlZkZhY3RvcnkgZmFjdG9yeSBtZXRob2Q6Ci0gKiAgICAgICAgY3JlYXRlQXJyYXlUeXBlKEphdmFDbGFzcyBmaW5hbENvbXBvbmVudFR5cGUsIGludCBkaW1lbnNpb25zKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFycmF5VHlwZSBleHRlbmRzIEphdmFDbGFzc3sKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBBcnJheURpbWVuc2lvbnMgYXR0cmlidXRlCi0JICovCi0JaW50IGdldEFycmF5RGltZW5zaW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEFycmF5RGltZW5zaW9ucyBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEFycmF5RGltZW5zaW9ucyhpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgQ29tcG9uZW50VHlwZSByZWZlcmVuY2UKLQkgKi8KLQlFQ2xhc3NpZmllciBnZXRDb21wb25lbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGUjZ2V0Q29tcG9uZW50VHlwZSA8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21wb25lbnRUeXBlKEVDbGFzc2lmaWVyIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEdldCB0aGUgZmluYWwgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgQXJyYXkgVHlwZS4KLQkgKiAKLQkgKiBJbiBvcmRlciB0byBlbnN1cmUgYSB1bmlxdWUgaW5zdGFuY2UsIHdlIHdpbGwgcmVzb2x2ZSB0aGlzIHR5cGUgdXNpbmcKLQkgKiByZWZsZWN0aW9uLiBJdCB0dXJucyBvdXQgdG8gYmUgbW9zdCBlZmZpY2llbnQgdG8ganVzdCBkbyB0aGlzIGJ5IHRyaW1taW5nIHRoZQotCSAqIG5hbWUuCi0JICovCi0JSmF2YUhlbHBlcnMgZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBHZXQgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkuIAotCSAqIAotCSAqIElmIHRoaXMgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSwgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUgdGhlIG5lc3RlZAotCSAqIGFycmF5IHR5cGUuCi0JICovCi0JSmF2YUhlbHBlcnMgZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBJcyB0aGlzIGFuIGFycmF5IG9mIGphdmEgcHJpbWl0aXZlcwotCSAqLwotCWJvb2xlYW4gaXNQcmltaXRpdmVBcnJheSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU2V0IHRoZSBjb21wb25lbnQgdHlwZS4KLQkgKi8KLQl2b2lkIHNldENvbXBvbmVudFR5cGUoSmF2YUhlbHBlcnMgaGVscGVyQ29tcG9uZW50VHlwZSk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0Jsb2NrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0Jsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZjg5YTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9CbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJsb2NrIGV4dGVuZHMgRU9iamVjdHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBTb3VyY2UgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldFNvdXJjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFNvdXJjZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFNvdXJjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBDb250ZW50cyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0Q29udGVudHMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQ29tbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Db21tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4Njc3MWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Db21tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tZW50IGV4dGVuZHMgQmxvY2sgewotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9GaWVsZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9GaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2RhODU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGaWVsZCBleHRlbmRzIEVUeXBlZEVsZW1lbnR7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNGaW5hbCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzRmluYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNTdGF0aWMgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc1N0YXRpYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNTdGF0aWMgPGVtPlN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdGljPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhdGljKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEphdmFWaXNpYmlsaXR5IGF0dHJpYnV0ZQotCSAqLwotCUphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjZ2V0SmF2YVZpc2liaWxpdHkgPGVtPkphdmEgVmlzaWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBWaXNpYmlsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZAotCSAqIEBzZWUgI2dldEphdmFWaXNpYmlsaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UcmFuc2llbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNpZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUcmFuc2llbnQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEZpZWxkX1RyYW5zaWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNUcmFuc2llbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzVHJhbnNpZW50IDxlbT5UcmFuc2llbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zaWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNUcmFuc2llbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zaWVudChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Wb2xhdGlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Wb2xhdGlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Vm9sYXRpbGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEZpZWxkX1ZvbGF0aWxlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1ZvbGF0aWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1ZvbGF0aWxlIDxlbT5Wb2xhdGlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Vm9sYXRpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzVm9sYXRpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZvbGF0aWxlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgSmF2YUNsYXNzIHJlZmVyZW5jZQotCSAqLwotCUphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2dldEphdmFDbGFzcyA8ZW0+SmF2YSBDbGFzczwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgQ2xhc3M8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRKYXZhQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEphdmFDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgSW5pdGlhbGl6ZXIgcmVmZXJlbmNlCi0JICovCi0JQmxvY2sgZ2V0SW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2dldEluaXRpYWxpemVyIDxlbT5Jbml0aWFsaXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluaXRpYWxpemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbml0aWFsaXplcihCbG9jayB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBHZXQgdGhlIGNsYXNzIHRoYXQgdGhpcyBmaWVsZCBpcyB3aXRoaW4uCi0JICovCi0JSmF2YUNsYXNzIGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIElzIHRoaXMgZmllbGQgYW4gYXJyYXkgdHlwZS4KLQkgKi8KLQlib29sZWFuIGlzQXJyYXkoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Jbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjJmZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Jbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjM4NTY5MDg0NzQyNzg5NzY1Nkw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1TR19QQVRURVJOID0gUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSmF2YV9JbmhfQ3ljbGVfRVJST1JfIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24oSmF2YUNsYXNzIGFTdWJjbGFzcywgSmF2YUNsYXNzIGFTdXBlcmNsYXNzKSB7Ci0JCXRoaXMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoTVNHX1BBVFRFUk4sIG5ldyBPYmplY3RbXXthU3ViY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpLCBhU3VwZXJjbGFzcy5nZXRRdWFsaWZpZWROYW1lKCl9KSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllODg5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0luaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5pdGlhbGl6ZXIgZXh0ZW5kcyBFT2JqZWN0ewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzU3RhdGljIGF0dHJpYnV0ZQotCSAqLwotCUJvb2xlYW4gZ2V0SXNTdGF0aWMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBJc1N0YXRpYyBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldElzU3RhdGljKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgSmF2YUNsYXNzIHJlZmVyZW5jZQotCSAqLwotCUphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkluaXRpYWxpemVyI2dldEphdmFDbGFzcyA8ZW0+SmF2YSBDbGFzczwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgQ2xhc3M8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRKYXZhQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEphdmFDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgU291cmNlIHJlZmVyZW5jZQotCSAqLwotCUJsb2NrIGdldFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSW5pdGlhbGl6ZXIjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvdXJjZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTb3VyY2UoQmxvY2sgdmFsdWUpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhQ2xhc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjdhZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQGV4dGVuZHMgSmF2YUhlbHBlcnMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNQdWJsaWMgPGVtPlB1YmxpYzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMgPGVtPkltcGxlbWVudHMgSW50ZXJmYWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldENsYXNzSW1wb3J0IDxlbT5DbGFzcyBJbXBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRQYWNrYWdlSW1wb3J0cyA8ZW0+UGFja2FnZSBJbXBvcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0RmllbGRzIDxlbT5GaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRNZXRob2RzIDxlbT5NZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0SW5pdGlhbGl6ZXJzIDxlbT5Jbml0aWFsaXplcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXREZWNsYXJlZENsYXNzZXMgPGVtPkRlY2xhcmVkIENsYXNzZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXREZWNsYXJpbmdDbGFzcyA8ZW0+RGVjbGFyaW5nIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0SmF2YVBhY2thZ2UgPGVtPkphdmEgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEV2ZW50cyA8ZW0+RXZlbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0QWxsRXZlbnRzIDxlbT5BbGwgRXZlbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhQ2xhc3MoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNsYXNzIGV4dGVuZHMgRUNsYXNzLCBKYXZhSGVscGVyc3sKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTUVUSE9EX05BTUUgPSAiKiI7Ci0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIG1hdGNoaW5nIHRoZSBuYW1lLCBhbmQgbm9uLXJldHVybiBwYXJhbWV0ZXJzIHdpdGggZnVsbHkgcXVhbGlmaWVkIHR5cGVzIG1hdGNoaW5nIGFsbCB0aGUgdHlwZXMgaW4gdGhlIGxpc3QsIGlmIGl0IGV4aXN0cy4gIEl0IHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRQdWJsaWNNZXRob2RFeHRlbmRlZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcykgOwotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MsIGhhdmluZyBhIG5hbWUgZXF1YWwgdG8gdGhhdCBvZiB0aGUgcGFyYW1ldGVyLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFB1YmxpY01ldGhvZHNFeHRlbmRlZE5hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIG91ciBGaWVsZHMsIGluY2x1ZGluZyBpbmhlcml0ZWQgZmllbGRzLgotCSAqIFRoZSBmaWVsZCByZWxhdGlvbnNoaXAgaXMgZGVyaXZlZCBmcm9tIGNvbnRlbnRzLgotCSAqLyAgCi0JcHVibGljIEZpZWxkW10gbGlzdEZpZWxkRXh0ZW5kZWQoKTsKLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyBvdXIgTWV0aG9kcywgaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLgotCSAqIFRoZSBtZXRob2QgcmVsYXRpb25zaGlwIGlzIGRlcml2ZWQgZnJvbSBjb250ZW50cy4KLQkgKi8gIAotCXB1YmxpYyBNZXRob2RbXSBsaXN0TWV0aG9kRXh0ZW5kZWQoKTsKLS8vRkIgICAvKioKLS8vRkIgICAgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCByZWZsZWN0aW9uLiBEbyBub3QgdXNlLgotLy9GQiAgICAqLwotLy9GQiAgIE9iamVjdCBwcmltUmVmVmFsdWUoRU9iamVjdCBmZWF0dXJlKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgS2luZCBhdHRyaWJ1dGUKLQkgKi8KLQlUeXBlS2luZCBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5UeXBlS2luZAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEtpbmQoVHlwZUtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzUHVibGljIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNQdWJsaWMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc1B1YmxpYyA8ZW0+UHVibGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaWM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzUHVibGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdWJsaWMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNGaW5hbCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzRmluYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBJbXBsZW1lbnRzSW50ZXJmYWNlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgQ2xhc3NJbXBvcnQgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldENsYXNzSW1wb3J0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFBhY2thZ2VJbXBvcnRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRQYWNrYWdlSW1wb3J0cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBGaWVsZHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEZpZWxkcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBNZXRob2RzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEluaXRpYWxpemVycyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0SW5pdGlhbGl6ZXJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBEZWNsYXJpbmdDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXREZWNsYXJpbmdDbGFzcyA8ZW0+RGVjbGFyaW5nIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWNsYXJpbmcgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERlY2xhcmluZ0NsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWNsYXJpbmdDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBEZWNsYXJlZENsYXNzZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldERlY2xhcmVkQ2xhc3NlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgSmF2YVBhY2thZ2UgcmVmZXJlbmNlCi0JICovCi0JSmF2YVBhY2thZ2UgZ2V0SmF2YVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRXZlbnRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRFdmVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbCBFdmVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRXZlbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsIEV2ZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBFdmVudHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhQ2xhc3NfQWxsRXZlbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUV2ZW50IiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBbGxFdmVudHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCWJvb2xlYW4gaXNOZXN0ZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4KLQkgKi8KLQlGaWVsZCBnZXRGaWVsZChTdHJpbmcgZmllbGROYW1lKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqICBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUgZnJvbSB0aGlzIEphdmFDbGFzcyBvciBhbnkgc3VwZXJ0eXBlcy4KLQkgKiAKLQkgKiBSZXR1cm4gbnVsbCBpZiBhIEZpZWxkIG5hbWVkIGZpZWxkTmFtZSBpcyBub3QgZm91bmQuCi0JICovCi0JRmllbGQgZ2V0RmllbGRFeHRlbmRlZChTdHJpbmcgZmllbGROYW1lKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4KLQkgKi8KLQlGaWVsZCBnZXRGaWVsZE5hbWVkKFN0cmluZyBmaWVsZE5hbWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGFsbCBmaWVsZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuCi0JICovCi0JTGlzdCBnZXRGaWVsZHNFeHRlbmRlZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZQotCSAqIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIFN0cmluZ3MgdGhhdCByZXByZXNlbnQgTWV0aG9kRWxlbWVudCBzaWduYXR1cmVzIGZyb20gbW9zdAotCSAqIGdlbmVyYWwgdG8gbW9zdCBzcGVjaWZpYy4KLQkgKi8KLQlMaXN0IGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIAotCSAqIGhpZXJhcmNoeS4KLQkgKi8KLQlNZXRob2QgZ2V0TWV0aG9kRXh0ZW5kZWQoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCUxpc3QgZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMgZXhjbHVkaW5nIHBhcnRpY3VsYXIgY2xhc3NlcyBhbmQgbWV0aG9kcy4KLQkgKiBAcGFyYW0gZXhjbHVkZWRDbGFzc2VzIC0gQSBsaXN0IG9mIEphdmFDbGFzcyBpbnN0YW5jZXMgdG8gYmUgaWdub3JlZC4KLQkgKiBAcGFyYW0gZXhjbHVkZWRNZXRob2RzIC0gQSBsaXN0IG9mIE1ldGhvZCBpbnN0YW5jZXMgdG8gYmUgaWdub3JlZC4KLQkgKi8KLQlMaXN0IGdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKExpc3QgZXhjbHVkZWRDbGFzc2VzLCBMaXN0IGV4Y2x1ZGVkTWV0aG9kcykgOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RzIHRoYXQgYmVnaW5zIHdpdGggQGFNZXRob2ROYW1lUHJlZml4IGFuZCBpcyBub3QKLQkgKiBpbmNsdWRlZCBpbiB0aGUgQGV4Y2x1ZGVkTmFtZXMgbGlzdC4gSWYgQGFNZXRob2ROYW1lUHJlZml4IGlzIG51bGwsIGFsbCBtZXRob2RzIAotCSAqIHdpbGwgYmUgcmV0dXJuZWQuCi0KLQkgKi8KLQlMaXN0IGdldE9ubHlTcGVjaWZpY01ldGhvZHMoU3RyaW5nIGFNZXRob2ROYW1lUHJlZml4LCBMaXN0IGV4Y2x1ZGVkTmFtZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGEgbWV0aG9kIG1hdGNoaW5nIHRoZSBuYW1lLCBhbmQgbm9uLXJldHVybiBwYXJhbWV0ZXJzIHdpdGggZnVsbHkKLQkgKiBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiAgSXQgd2lsbCBub3QKLQkgKiBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCU1ldGhvZCBnZXRQdWJsaWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpdCB3aWxsIG5vdCBnbyB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlMaXN0IGdldFB1YmxpY01ldGhvZHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbGwgcHVibGljIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuCi0JICovCi0JTGlzdCBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MsIGhhdmluZyBhIG5hbWUgZXF1YWwgdG8KLQkgKiB0aGF0IG9mIHRoZSBwYXJhbWV0ZXIuCi0JICovCi0JTGlzdCBnZXRQdWJsaWNNZXRob2RzTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JSmF2YUNsYXNzIGdldFN1cGVydHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGVzdCB3aGV0aGVyIHRoZSByZWNlaXZlciBpbXBsZW1lbnRzIHRoZSBwYXNzZWQgaW50ZXJmYWNlIChvciBvbmUgb2YgaXRzCi0JICogc3VwZXJ0eXBlcykuCi0JICovCi0JYm9vbGVhbiBpbXBsZW1lbnRzSW50ZXJmYWNlKEphdmFDbGFzcyBpbnRlcmZhY2VUeXBlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhIHN0cmluZyBzaG93aW5nIG91ciBkZXRhaWxzLgotCSAqLwotCVN0cmluZyBpbmZvU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUZXN0cyB3aGV0aGVyIHRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbSB0aGUgcGFzc2VkIGluIGNsYXNzLgotCSAqLwotCWJvb2xlYW4gaW5oZXJpdHNGcm9tKEphdmFDbGFzcyBqYXZhQ2xhc3MpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRG9lcyB0aGlzIHR5cGUgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBpc0V4aXN0aW5nVHlwZSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSXMgdGhpcyBhbiBpbnRlcmZhY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBtb2RlbCBraW5kPSJvcGVyYXRpb24iCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTZXQgdGhlIHN1cGVydHlwZS4KLQkgKi8KLQl2b2lkIHNldFN1cGVydHlwZShKYXZhQ2xhc3MgamF2YWNsYXNzKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXNzZWQgSmF2YUNsYXNzIGNhbiBiZSBzZXQgYXMgdGhlIHN1cGVydHlwZQotCSAqIG9mIHRoaXMgSmF2YUNsYXNzLiAgVGhpcyBtZXRob2Qgd2lsbCB0ZXN0IHRvIHNlZSBpZiBhSmF2YUNsYXNzIHdpbGwKLQkgKiBjcmVhdGUgYSBjeWNsZSBpbiB0aGUgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLiAgUmV0dXJuIHRydWUgaWYgbm8KLQkgKiBpbmhlcml0YW5jZSBjeWNsZSB3aWxsIGJlIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZFN1cGVydHlwZShKYXZhQ2xhc3MgYUphdmFDbGFzcykgOwotCi0JLyoqCi0JICogR2V0IHRoZSBFU3RydWN0dXJhbEZlYXR1cmVzIHRoYXQgcmVwcmVzZW50IHRoZSBCZWFuSW5mbyBwcm9wZXJ0aWVzIGZvcgotCSAqIGp1c3QgdGhpcyBKYXZhIGNsYXNzLCBub3QgaW5jbHVkaW5nIGluaGVyaXRlZC4gSXQgd2lsbCByZXR1cm4gYW55IEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIHRoYXQgd2FzIHNwZWNpZmllZCBhcyBiZWluZyBhdCB0aGlzIGNsYXNzIGVpdGhlciB0aHJvdWdoIHRoZSBYTUkgb3ZlcnJpZGUgZG9jdW1lbnQgb3IKLQkgKiB0aHJvdWdoIHRoZSBCZWFuSW5mby4gU3RydWN0dXJhbCBmZWF0dXJlcyB0aHJvdWdoIHRoZSBYTUkgbWF5IG5vdCBiZSBiZWFuIHByb3BlcnRpZXMsCi0JICogYnV0IHRoZXkgYXJlIHBhcnQgb2YgdGhlIGZlYXR1cmVzIGF2YWlsYWJsZSBhdCB0aGlzIGNsYXNzIG9ubHkuIAotCSAqIAotCSAqIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiBnZXRFQXR0cmlidXRlcygpIGFuZCBnZXRFUmVmZXJlbmNlcygpLgotCSAqIAotCSAqIFRvIHJldHJpZXZlIG9ubHkgdGhlIEJlYW4gUHJvcGVydGllcywgdGhlbiB1c2UgQmVhbmluZm8gCi0JICogVXRpbGl0aWVzLmdldFByb3BlcnRpZXNJdGVyYXRvcihqYXZhY2xhc3MuZ2V0UHJvcGVydGllcygpKSBhbmQgdGhpcyB3aWxsIGl0ZXJhdGUgb3ZlcgotCSAqIHRoZSBCZWFuIFByb3BlcnR5RGVjb3JhdG9ycywgYW5kIGZpbHRlciBvdXQgdGhlIG5vbi1iZWFuIGZlYXR1cmVzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgcHJvcGVydGllcyAoYXMgRVN0cnVjdHVyYWxGZWF0dXJlJ3MpIGZvciB0aGlzIGphdmEgY2xhc3MuIFRoaXMgbGlzdCBpcwotCSAqIG5vdCBtb2RpZmlhYmxlLgotCSAqLwotCUVMaXN0IGdldFByb3BlcnRpZXMoKTsKLQkKLQkvKioKLQkgKiBHZXQgYWxsIG9mIHRoZSBFU3RydWN0dXJhbEZlYXR1cmVzIHRoYXQgcmVwcmVzZW50IHRoZSBCZWFuSW5mbyBwcm9wZXJ0aWVzIGZvcgotCSAqIGp1c3QgdGhpcyBKYXZhIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkLiBJdCB3aWxsIHJldHVybiBhbnkgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogdGhhdCB3YXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIFhNSSBvdmVycmlkZSBkb2N1bWVudCBvcgotCSAqIHRocm91Z2ggdGhlIEJlYW5JbmZvLiBTdHJ1Y3R1cmFsIGZlYXR1cmVzIHRocm91Z2ggdGhlIFhNSSBtYXkgbm90IGJlIGJlYW4gcHJvcGVydGllcywKLQkgKiBidXQgdGhleSBhcmUgcGFydCBvZiB0aGUgZmVhdHVyZXMgYXZhaWxhYmxlLgotCSAqIAotCSAqIFRoZSBpcyBsaWtlIGdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSBleGNlcHQgdGhhdCBpZiBCZWFuSW5mbyBoaWRlcyBhbnkgYmVhbiBwcm9wZXJ0aWVzCi0JICogZnJvbSB0aGUgc3VwZXIgY2xhc3MsIHRoaXMgbGlzdCB3aWxsIGFsc28gaGlkZSB0aGVtLCB3aGlsZSBnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzCi0JICogd2lsbCBub3QuCi0JICogCi0JICogVG8gcmV0cmlldmUgb25seSB0aGUgQmVhbiBQcm9wZXJ0aWVzLCB0aGVuIHVzZSBCZWFuaW5mbyAKLQkgKiBVdGlsaXRpZXMuZ2V0UHJvcGVydGllc0l0ZXJhdG9yKGphdmFjbGFzcy5nZXRBbGxQcm9wZXJ0aWVzKCkpIGFuZCB0aGlzIHdpbGwgaXRlcmF0ZSBvdmVyCi0JICogdGhlIEJlYW4gUHJvcGVydHlEZWNvcmF0b3JzLCBhbmQgZmlsdGVyIG91dCB0aGUgbm9uLWJlYW4gZmVhdHVyZXMuCi0JICogCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBhbGwgcHJvcGVydGllcywgaW5jbHVkaW5nIGluaGVyaXRlZCwgKGFzIEVTdHJ1Y3R1cmFsRmVhdHVyZSdzKSBmb3IgdGhpcyBjbGFzcy4gVGhpcyBsaXN0IGlzCi0JICogbm90IG1vZGlmaWFibGUuCi0JICovCi0JRUxpc3QgZ2V0QWxsUHJvcGVydGllcygpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVmbGVjdGlvbiB0eXBlLCBpZiBpdCBleGlzdHMsIGZvciB0aGlzIGNsYXNzLiBJZiBydW5uaW5nIHdpdGhpbiBFY2xpcHNlIHRoaXMKLQkgKiB3aWxsIGJlIGFuIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZX0sIG9yIHJ1bm5pbmcgb3V0c2lkZSBvZiBFY2xpcHNlIGl0IHdpbGwgYmUgYSB7QGxpbmsgamF2YS5sYW5nLkNsYXNzfS4KLQkgKiAKLQkgKiBAcmV0dXJuIElUeXBlIGlmIGluIEVjbGlwc2UsIENsYXNzIGlmIG91dHNpZGUgRWNsaXBzZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdHlwZSBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JT2JqZWN0IGdldFJlZmxlY3Rpb25UeXBlKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFEYXRhVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjMGI1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFEYXRhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBAZXh0ZW5kcyBKYXZhSGVscGVycwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0SmF2YURhdGFUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFEYXRhVHlwZSBleHRlbmRzIEVDbGFzcywgSmF2YUhlbHBlcnN7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlLgotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTVlOTVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhIEV2ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEphdmFFdmVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUV2ZW50IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhSGVscGVycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhSGVscGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjJmZjE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUhlbHBlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi8yNy8yMDAwIDQ6NDI6MDQgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUhlbHBlcnMgZXh0ZW5kcyBFQ2xhc3MgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTl9OQU1FID0gImphdmEubGFuZy5Cb29sZWFuIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUkFDVEVSX05BTUUgPSAiamF2YS5sYW5nLkNoYXJhY3RlciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEJZVEVfTkFNRSA9ICJqYXZhLmxhbmcuQnl0ZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9OQU1FID0gImphdmEubGFuZy5Eb3VibGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBGTE9BVF9OQU1FID0gImphdmEubGFuZy5GbG9hdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVHRVJfTkFNRSA9ICJqYXZhLmxhbmcuSW50ZWdlciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIExPTkdfTkFNRSA9ICJqYXZhLmxhbmcuTG9uZyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUX05BTUUgPSAiamF2YS5sYW5nLlNob3J0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9CT09MRUFOX05BTUUgPSAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fQ0hBUkFDVEVSX05BTUUgPSAiY2hhciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fQllURV9OQU1FID0gImJ5dGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0RPVUJMRV9OQU1FID0gImRvdWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fRkxPQVRfTkFNRSA9ICJmbG9hdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fSU5URUdFUl9OQU1FID0gImludCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fTE9OR19OQU1FID0gImxvbmciOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX1NIT1JUX05BTUUgPSAic2hvcnQiOyAvLyROT04tTkxTLTEkCi0JCi0Jc3RhdGljIGZpbmFsIGludCBQUklNX05PVF9JRCA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX0JPT0xFQU5fSUQgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9DSEFSQUNURVJfSUQgPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9CWVRFX0lEID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fRE9VQkxFX0lEID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fRkxPQVRfSUQgPSA1OwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9JTlRFR0VSX0lEID0gNjsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fTE9OR19JRCA9IDc7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX1NIT1JUX0lEID0gODsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHF1YWxpZmllZCBuYW1lICh3aXRoIHVzaW5nICcuJyBmb3IgaW5uZXIgY2xhc3NlcykuIFdpbGwgcmV0dXJuIHRoZSBuYW1lIGlmIHByaW1pdGl2ZSB0b28gKGUuZy4gImJvb2xlYW4iKQotCSAqIE5vdGU6IFRoaXMgc2hvdWxkIG9mIGJlZW4gZ2V0IHRoZSBzaW1wbGUgbmFtZSBhbmQgbm90IHRoZSBxdWFsaWZlZCBuYW1lLCBidXQgaXQgaXMgdG9vIGxhdGUgYW5kIGhhcyBiZWVuIGVzdGFibGlzaGVkCi0JICogYXMgdGhlIEFQSS4gVXNlIDxjb2RlPmdldFNpbXBsZU5hbWUoKTwvY29kZT4gaW5zdGVhZCBpZiB5b3Ugd2FudCB0aGUgbmFtZSBub3QgcXVhbGlmaWVkLgotCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlLgotCSAqIEBzZWUgSmF2YUhlbHBlcnMjZ2V0U2ltcGxlTmFtZSgpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXZhTmFtZSgpOwotCS8qKgotCSAqIEdldCB0aGUgc2ltcGxlIG5hbWUuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHByaW1pdGl2ZSwgb3IgaWYgYSBjbGFzcywgdGhlIG5hbWUgd2l0aG91dCB0aGUgcGFja2FnZS4gQW5kIGlmIGl0IGlzIGFuCi0JICogaW5uZXIgY2xhc3MsIGl0IHdpbGwgdXNlICcuJyBpbnN0ZWFkIG9mICckJy4gSWYgeW91IHdhbnQgdGhlIHNpbXBsZSBuYW1lIGZvciByZWZsZWN0aW9uIChpLmUuIHdpdGggJyQnKSB1c2UgPGNvZGU+Z2V0TmFtZSgpPC9jb2RlPi4KLQkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgbmFtZSAobm8gcGFja2FnZSkgb2YgdGhlIHR5cGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByaW1pdGl2ZSB0eXBlIHRoYXQgdGhpcyBoZWxwZXIgd3JhcHBlcnMgb3IgaXMgKGUuZy4gImphdmEubGFuZy5JbnRlZ2VyIiBhbmQgImludCIgdHlwZXMgcmV0dXJuICJpbnQiIHR5cGUpLiBJZiBub3QgYSBwcmltaXRpdmUKLQkgKiBvciBhIHdyYXBwZXIgZm9yIGEgcHJpbWl0aXZlLCB0aGVuIHJldHVybiBudWxsLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSmF2YURhdGFUeXBlIGdldFByaW1pdGl2ZSgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgcHJpbWl0aXZlIGlkIHRoYXQgdGhpcyBoZWxwZXIgd3JhcHBlcnMgb3IgaXMgKGUuZy4gImphdmEubGFuZy5JbnRlZ2VyIiBhbmQgImludCIgd2lsbCByZXR1cm4ge0BsaW5rIEphdmFIZWxwZXJzI1BSSU1fSU5URUdFUl9JRH0pLiBJZgotCSAqIG5vdCBhIHdyYXBwZXIgZm9yIGEgcHJpbWl0aXZlIHRoZW4gcmV0dXJuIHtAbGluayBKYXZhSGVscGVycyNQUklNX05PVF9JRH0uCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJpbWl0aXZlSUQoKTsKLQkvKioKLQkgKiBUbyBiZSB1c2VkIGJ5IHBlb3BsZSB0aGF0IG5lZWQgdG8gZ2V0IHRoZSBxdWFsaWZpZWQgbmFtZS4gVGhpcyB3b3VsZCB1c2UgJy4nIGZvciBpbm5lciBjbGFzc2VzCi0JICogYW5kIGluY2x1ZGUgdGhlIHBhY2thZ2UgbmFtZS4KLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSwgaW5jbHVkaW5nIHBhY2thZ2UuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpOwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0V3JhcHBlcigpOwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKTsKLQkvKioKLQkgKiBDYW4gYW4gb2JqZWN0IG9mIHRoZSBwYXNzZWQgaW4gY2xhc3MgYmUgYXNzaWduZWQgdG8gYW4KLQkgKiBvYmplY3Qgb2YgdGhpcyBjbGFzcz8gSW4gb3RoZXIgd29yZHMgaXMgdGhpcyBjbGFzcyBhCi0JICogc3VwZXJ0eXBlIG9mIHRoZSBwYXNzZWQgaW4gY2xhc3MsIG9yIGlzIGl0IHN1cGVyaW50ZXJmYWNlCi0JICogb2YgaXQ/IE9yIGluIHRoZSBjYXNlIG9mIHByaW1pdGl2ZXMsIGFyZSB0aGV5IHRoZSBzYW1lLiAKLQkgKiBAcGFyYW0gYUNsYXNzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhc3NpZ25hYmxlIGZyb20gdGhlIGdpdmVuIGNsYXNzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUZyb20oRUNsYXNzaWZpZXIgYUNsYXNzKTsKLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOwotCi0JLyoqCi0JICogVG8gYmUgdXNlZCBieSBwZW9wbGUgdGhhdCBuZWVkIHRvIGdldCB0aGUgcXVhbGlmaWVkIG5hbWUgdXNlZCBmb3IgcmVmbGVjdGlvbi4gVGhpcyB3b3VsZCB1c2UgJyQnIGluc3RlYWQgb2YgJy4nIGZvciBpbm5lciBjbGFzc2VzCi0JICogYW5kIGluY2x1ZGUgdGhlIHBhY2thZ2UgbmFtZS4KLQkgKiBUeXBpY2FsbHkgYmVhbiBpbmZvIHdvdWxkIG5lZWQgdG8gdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMuCi0JICogQHJldHVybiB0aGUgcXVhbGlmaWVkIG5hbWUsIHVzZSAnJCcgZm9yIGlubmVyIGNsYXNzZXMKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCkgOwkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3YzM3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX0lEID0gIipwYWNrYWdlIjsJLy8gVGhlIGlkICh0aGUgcGFydCB0aGF0IGdvZXMgYWZ0ZXIgdGhlICcjJyBmb3IgYSBqYXZhIHBhY2thZ2UuKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCS8vIFRoZXJlIHdpbGwgb25seSBiZSBvbmUgcGFja2FnZSBwZXIgamF2YSByZXNvdXJjZSBzbyBpdAotCQkJCQkJCQkJCQkJCQkvLyBjYW4gYmUgdW5pcXVlLiBObyBqYXZhIHR5cGVzLCBtZXRob2RzLCBmaWVsZHMgaWRzIGNhbgotCQkJCQkJCQkJCQkJCQkvLyBzdGFydCB3aXRoIGFuIGFzdGVyaWNrIHNvIHdpbGwgYmUgdW5pcXVlLgotCQkJCQkJCQkJCQkJCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNSVRJVkVfUEFDS0FHRV9OQU1FID0gIl8tamF2YXByaW0iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBKYXZhQ2xhc3NlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0SmF2YUNsYXNzZXMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSA7Ci0KLX0gLy9KYXZhUGFja2FnZQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZjQyZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYXJhbWV0ZXI7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFQYXJhbWV0ZXIgZXh0ZW5kcyBFUGFyYW1ldGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc0ZpbmFsIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNGaW5hbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlciNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFBhcmFtZXRlcktpbmQgYXR0cmlidXRlCi0JICovCi0JSmF2YVBhcmFtZXRlcktpbmQgZ2V0UGFyYW1ldGVyS2luZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlciNnZXRQYXJhbWV0ZXJLaW5kIDxlbT5QYXJhbWV0ZXIgS2luZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW1ldGVyIEtpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcktpbmQKLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXJLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJhbWV0ZXJLaW5kKEphdmFQYXJhbWV0ZXJLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIElzIHRoaXMgcGFyYW1ldGVyIHR5cGUgYW4gYXJyYXkgdHlwZS4KLQkgKi8KLQlib29sZWFuIGlzQXJyYXkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIElzIHRoaXMgYSByZXR1cm4gcGFyYW1ldGVyLgotCSAqLwotCWJvb2xlYW4gaXNSZXR1cm4oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCUphdmFIZWxwZXJzIGdldEphdmFUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFyYW1ldGVyS2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFyYW1ldGVyS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2MyNGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlcktpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+SmF2YSBQYXJhbWV0ZXIgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBJTj0wCi0gKiBPVVQ9MQotICogSU5PVVQ9MgotICogUkVUVVJOPTMKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0SmF2YVBhcmFtZXRlcktpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhUGFyYW1ldGVyS2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjSU5fTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOID0gMDsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNPVVRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVCA9IDE7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNJTk9VVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5PVVQgPSAyOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFVFVSTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI1JFVFVSTl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVUVVJOID0gMzsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNJTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJhbWV0ZXJLaW5kIElOX0xJVEVSQUwgPSBuZXcgSmF2YVBhcmFtZXRlcktpbmQoSU4sICJJTiIsICJJTiIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNPVVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhUGFyYW1ldGVyS2luZCBPVVRfTElURVJBTCA9IG5ldyBKYXZhUGFyYW1ldGVyS2luZChPVVQsICJPVVQiLCAiT1VUIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOT1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNJTk9VVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJhbWV0ZXJLaW5kIElOT1VUX0xJVEVSQUwgPSBuZXcgSmF2YVBhcmFtZXRlcktpbmQoSU5PVVQsICJJTk9VVCIsICJJTk9VVCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVUVVJOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVUVVJOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNSRVRVUk4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhUGFyYW1ldGVyS2luZCBSRVRVUk5fTElURVJBTCA9IG5ldyBKYXZhUGFyYW1ldGVyS2luZChSRVRVUk4sICJSRVRVUk4iLCAiUkVUVVJOIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+SmF2YSBQYXJhbWV0ZXIgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFQYXJhbWV0ZXJLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEphdmFQYXJhbWV0ZXJLaW5kW10gewotCQkJSU5fTElURVJBTCwKLQkJCU9VVF9MSVRFUkFMLAotCQkJSU5PVVRfTElURVJBTCwKLQkJCVJFVFVSTl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkphdmEgUGFyYW1ldGVyIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KYXZhIFBhcmFtZXRlciBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIEphdmFQYXJhbWV0ZXJLaW5kIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJSmF2YVBhcmFtZXRlcktpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KYXZhIFBhcmFtZXRlciBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVBhcmFtZXRlcktpbmQgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlKYXZhUGFyYW1ldGVyS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SmF2YSBQYXJhbWV0ZXIgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBKYXZhUGFyYW1ldGVyS2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgSU46IHJldHVybiBJTl9MSVRFUkFMOwotCQkJY2FzZSBPVVQ6IHJldHVybiBPVVRfTElURVJBTDsKLQkJCWNhc2UgSU5PVVQ6IHJldHVybiBJTk9VVF9MSVRFUkFMOwotCQkJY2FzZSBSRVRVUk46IHJldHVybiBSRVRVUk5fTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSmF2YVBhcmFtZXRlcktpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL0phdmFQYXJhbWV0ZXJLaW5kCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUmVmRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUmVmRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTYxYjMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVJlZkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVmRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YVJlZkZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmRmFjdG9yeUltcGwuaW5pdCgpOwotCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBwcm94eSByZWZlcmVuY2UgdG8gdGhlIGNsYXNzIG5hbWUuCi0JICogQHBhcmFtIHRhcmdldE5hbWUgQ2xhc3NuYW1lIHRvIGNyZWF0ZSBhIHByb3h5IHJlZmVyZW5jZSB0by4gVGhpcyBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4KLQkgKiBAcmV0dXJuIEEgcHJveHkgcmVmZXJlbmNlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBjcmVhdGVDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSk7Ci0JCi0JLyoqCi0JICogcmVmbGVjdCAtIHJlZmxlY3QgYSBqYXZhIHR5cGUgKGNsYXNzIG9yIHByaW1pdGl2ZSkgZm9yIGEgZ2l2ZW4gcXVhbGlmaWVkIG5hbWUuCi0JICogPHA+SWYgdGhlIHBhY2thZ2Ugb3IgdHlwZSBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoCi0JICogdGhlIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIDxwPkxvb2t1cCB0aGUgSmF2YUNsYXNzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwYXNzZWQgb2JqZWN0LCBoYW5kbGluZyBzb21lIGVycm9yIGNhc2VzLgotCSAqIEBwYXJhbSBhUXVhbGlmaWVkTmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBjbGFzcyBvciBwcmltaXRpdmUgKGUuZy4gPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4gb3IgPGNvZGU+aW50PC9jb2RlPgotCSAqIEBwYXJhbSByZWxhdGVkT2JqZWN0IEVPYmplY3QgdGhhdCBpdCB3aWxsIGJlIHJlbGF0ZWQgdG9vIChpdCB3aWxsIGxvb2sgdGhyb3VnaCB0aGUgcmVzb3VyY2Ugc2V0J3MgcHJvamVjdCBvZiB0aGUgRU9iamVjdCkKLQkgKiBAcmV0dXJuIFRoZSB0eXBlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBuYW1lIGlzIG5vdCBvZiBjb3JyZWN0IGZvcm1hdCwgcmVsYXRlZE9iamVjdCBpcyBub3QgY29udGFpbmVkIGJ5IGEgcmVzb3VyY2Ugc2V0LCBvciByZXNvdXJjZSBzZXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIHJlZmxlY3RUeXBlKFN0cmluZyBhUXVhbGlmaWVkTmFtZSwgRU9iamVjdCByZWxhdGVkT2JqZWN0KTsKLQkKLQkKLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIGphdmEgdHlwZSAoY2xhc3Mgb3IgcHJpbWl0aXZlKSBmb3IgYSBnaXZlbiBxdWFsaWZpZWQgbmFtZS4KLQkgKiA8cD5JZiB0aGUgcGFja2FnZSBvciBjbGFzcyBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoCi0JICogdGhlIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIEBwYXJhbSBhUXVhbGlmaWVkTmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBjbGFzcyBvciBwcmltaXRpdmUgKGUuZy4gPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4gb3IgPGNvZGU+aW50PC9jb2RlPi4gCi0JICogQHBhcmFtIHNldCBSZXNvdXJjZSBzZXQgdG8gdXNlLiBJdHMgcHJvamVjdCB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgdHlwZS4KLQkgKiBAcmV0dXJuIFRoZSB0eXBlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBuYW1lIGlzIG5vdCBvZiBjb3JyZWN0IGZvcm1hdCwgb3IgcmVzb3VyY2Ugc2V0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyByZWZsZWN0VHlwZShTdHJpbmcgYVF1YWxpZmllZE5hbWUsIFJlc291cmNlU2V0IHNldCk7CQotCQotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgdHlwZSBmb3IgYSBnaXZlbiBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIG5hbWUuCi0JICogPHA+SWYgdGhlIHBhY2thZ2Ugb3IgY2xhc3MgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaAotCSAqIHRoZSByZWZsZWN0aW9uIG1lY2hhbmlzbS4KLQkgKiBAcGFyYW0gYVBhY2thZ2VOYW1lIFBhY2thZ2UgbmFtZQotCSAqIEBwYXJhbSBhVHlwZU5hbWUgVHlwZSBuYW1lIAotCSAqIEBwYXJhbSBzZXQgUmVzb3VyY2Ugc2V0IHRvIHVzZS4gSXRzIHByb2plY3Qgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIHR5cGUuCi0JICogQHJldHVybiBUaGUgdHlwZS4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbmFtZSBpcyBub3Qgb2YgY29ycmVjdCBmb3JtYXQsIG9yIHJlc291cmNlIHNldCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgcmVmbGVjdFR5cGUoU3RyaW5nIGFQYWNrYWdlTmFtZSwgU3RyaW5nIGFUeXBlTmFtZSwgUmVzb3VyY2VTZXQgc2V0KTsKLQkKLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIEphdmEgcGFja2FnZSBmb3IgYSBnaXZlbiBwYWNrYWdlIG5hbWUuCi0JICogPHA+SWYgdGhlIHBhY2thZ2UgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaAotCSAqIHRoZSByZWZsZWN0aW9uIG1lY2hhbmlzbS4KLQkgKiBAcGFyYW0gcGFja2FnZU5hbWUgTmFtZSBvZiBwYWNrYWdlCi0JICogQHBhcmFtIHNldCBSZXNvdXJjZSBzZXQgdG8gdXNlLiBJdHMgcHJvamVjdCB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgcGFja2FnZS4KLQkgKiBAcmV0dXJuIFRoZSBwYWNrYWdlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBuYW1lIGlzIG5vdCBvZiBjb3JyZWN0IGZvcm1hdCwgb3IgcmVzb3VyY2Ugc2V0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSByZWZsZWN0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIFJlc291cmNlU2V0IHNldCk7Ci0JCi0JLyoqCi0JICogVGhlIHNjaGVtZSBmb3IgYSBqYXZhIFVSSS4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1BST1RPQ09MX1VSSV9TQ0hFTUUgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIFVSSSBmb3IgYWNjZXNzaW5nIGEgdHlwZSB0aHJvdWdoIHtAbGluayBSZXNvdXJjZVNldCNnZXRFT2JqZWN0KFVSSSwgYm9vbGVhbil9LgotCSAqIEBwYXJhbSBhUXVhbGlmaWVkTmFtZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVR5cGVVUkkoU3RyaW5nIGFRdWFsaWZpZWROYW1lKTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIFVSSSBmb3IgYWNjZXNzaW5nIGEgdHlwZSB0aHJvdWdoIHtAbGluayBSZXNvdXJjZVNldCNnZXRFT2JqZWN0KFVSSSwgYm9vbGVhbil9LgotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBwYWNrYWdlIG5hbWUgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciA8Y29kZT4iIjwvY29kZT4gZm9yIHByaW1pdGl2ZXMgb3IgZGVmYXVsdCBwYWNrYWdlKQotCSAqIEBwYXJhbSB0eXBlTmFtZSB0eXBlIG5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFVSSSBjcmVhdGVUeXBlVVJJKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVOYW1lKTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIFVSSSBmb3IgYWNjZXNzaW5nIGEgcGFja2FnZSB0aHJvdWdoIHtAbGluayBSZXNvdXJjZVNldCNnZXRFT2JqZWN0KFVSSSwgYm9vbGVhbil9LgotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBwYWNrYWdlIG5hbWUgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciA8Y29kZT4iIjwvY29kZT4gZm9yIHByaW1pdGl2ZXMgb3IgZGVmYXVsdCBwYWNrYWdlKQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVBhY2thZ2VVUkkoU3RyaW5nIHBhY2thZ2VOYW1lKTsKLQkKLQkvKioKLQkgKiBHZXQganVzdCB0aGUgdHlwZSBuYW1lIHdpdGhvdXQgdGhlIHBhY2thZ2UgbmFtZS4KLQkgKiBAcGFyYW0gdHlwZVVSSQotCSAqIEByZXR1cm4gdGhlIHR5cGUgbmFtZSBvciA8Y29kZT4iIjwvY29kZT4gaWYgbm90IGEgdmFsaWQgdHlwZSBVUkkKLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBub3QgYSB2YWxpZCB0eXBlIFVSSQotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoVVJJIHR5cGVVUkkpOwotCQotCS8qKgotCSAqIEdldCBqdXN0IHRoZSBwYWNrYWdlIG5hbWUuCi0JICogQHBhcmFtIGphdmFVUkkgZWl0aGVyIGEgdHlwZSBvciBhIHBhY2thZ2UgVVJJLgotCSAqIEByZXR1cm4gcGFja2FnZSBuYW1lIG9yIDxjb2RlPiIiPC9jb2RlPiBpZiBkZWZhdWx0IHBhY2thZ2Ugb3IgcHJpbWl0aXZlLgotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vdCBhIHZhbGlkIHBhY2thZ2Ugb3IgdHlwZSBVUkkKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKFVSSSBqYXZhVVJJKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUuCi0JICogQHBhcmFtIHR5cGVVUkkKLQkgKiBAcmV0dXJuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9yIDxjb2RlPiIiPC9jb2RlPiBpZiBub3QgYSB2YWxpZCB0eXBlIFVSSQotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vdCBhIHZhbGlkIHR5cGUgVVJJCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVHlwZU5hbWUoVVJJIHR5cGVVUkkpOwotCQotCS8qKgotCSAqIElzIHRoaXMgYSB2YWxpZCBqYXZhIHVyaS4KLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSmF2YVVSSShVUkkgdXJpKTsKLQotCS8qKgotCSAqIElzIHRoaXMgYSB2YWxpZCB0eXBlIHVyaS4KLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHlwZVVSSShVUkkgdXJpKTsKLQkKLQkvKioKLQkgKiBJcyB0aGlzIGEgdmFsaWQgcGFja2FnZSB1cmkuCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2VVUkkoVVJJIHVyaSk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBBcnJheVR5cGUgdmFsdWUgd2l0aCBhbiBhcnJheSBvZiB0aGUgY29tcG9uZW50IHR5cGUKLQkgKi8KLQlwdWJsaWMgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZShKYXZhSGVscGVycyBjb21wb25lbnRUeXBlKTsKLQkvKioKLQkgKiBAcmV0dXJuIEFycmF5VHlwZSB2YWx1ZSB3aXRoIGFuIGFycmF5IG9mIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9ucyBhbmQgZmluYWwgY29tcG9uZW50IHR5cGUuCi0JICovCi0JcHVibGljIEFycmF5VHlwZSBjcmVhdGVBcnJheVR5cGUoSmF2YUhlbHBlcnMgZmluYWxDb21wb25lbnRUeXBlLCBpbnQgZGltZW5zaW9ucyk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXRob2QgdmFsdWUKLQkgKi8KLQlNZXRob2QgY3JlYXRlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFDbGFzcyB2YWx1ZQotCSAqLwotCUphdmFDbGFzcyBjcmVhdGVKYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRmllbGQgdmFsdWUKLQkgKi8KLQlGaWVsZCBjcmVhdGVGaWVsZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBCbG9jayB2YWx1ZQotCSAqLwotCUJsb2NrIGNyZWF0ZUJsb2NrKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENvbW1lbnQgdmFsdWUKLQkgKi8KLQlDb21tZW50IGNyZWF0ZUNvbW1lbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU3RhdGVtZW50IHZhbHVlCi0JICovCi0JU3RhdGVtZW50IGNyZWF0ZVN0YXRlbWVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBJbml0aWFsaXplciB2YWx1ZQotCSAqLwotCUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFQYXJhbWV0ZXIgdmFsdWUKLQkgKi8KLQlKYXZhUGFyYW1ldGVyIGNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXJyYXlUeXBlIHZhbHVlCi0JICovCi0JQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhRGF0YVR5cGUgdmFsdWUKLQkgKi8KLQlKYXZhRGF0YVR5cGUgY3JlYXRlSmF2YURhdGFUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFQYWNrYWdlIHZhbHVlCi0JICovCi0JSmF2YVBhY2thZ2UgY3JlYXRlSmF2YVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUphdmFSZWZQYWNrYWdlIGdldEphdmFSZWZQYWNrYWdlKCk7Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVJlZlBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVJlZlBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzYWY0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFSZWZQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgSmF2YVJlZlBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7fQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZWZQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImphdmEiOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1MgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0lOU1RBTkNFX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBUeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19JTlNUQU5DRV9UWVBFX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9UWVBFX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRVBBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZSBQYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FVFlQRV9QQVJBTUVURVJTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVRZUEVfUEFSQU1FVEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0FCU1RSQUNUID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSU5URVJGQUNFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5URVJGQUNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRVNVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVNVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VPUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFMTF9BVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFMTF9SRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VSRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQ29udGFpbm1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FQUxMX0NPTlRBSU5NRU5UUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQ09OVEFJTk1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgT3BlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFMTF9PUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9PUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTExfU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJRCBBdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfQ0xBU1NfX0VJRF9BVFRSSUJVVEUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FSURfQVRUUklCVVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVHZW5lcmljIFN1cGVyIFR5cGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FR0VORVJJQ19TVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VHRU5FUklDX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgR2VuZXJpYyBTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFMTF9HRU5FUklDX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9HRU5FUklDX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0tJTkQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdWJsaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19QVUJMSUMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRklOQUwgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX1BBQ0tBR0VfSU1QT1JUUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0ZJRUxEUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX01FVEhPRFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19JTklUSUFMSVpFUlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0pBVkFfUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDExOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19FVkVOVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fQUxMX0VWRU5UUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJRUxEID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVIgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRSA9IDEwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRSA9IDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfRVZFTlQgPSAxMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFID0gODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQkxPQ0sgPSA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT01NRU5UID0gNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU1RBVEVNRU5UID0gNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSU5JVElBTElaRVIgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJTklUSUFMSVpFUl9fSVNfU1RBVElDID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJTklUSUFMSVpFUl9fU09VUkNFID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Jbml0aWFsaXplcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTklUSUFMSVpFUl9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19OQU1FID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fT1JERVJFRCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19PUkRFUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19VTklRVUUgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX0xPV0VSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX1VQUEVSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fTUFOWSA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX1JFUVVJUkVEID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX0VUWVBFID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVHZW5lcmljIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fRUdFTkVSSUNfVFlQRSA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19FR0VORVJJQ19UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX0VPUEVSQVRJT04gPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fRU9QRVJBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19GSU5BTCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIFBhcmFtZXRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX19OQU1FID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX09SREVSRUQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fT1JERVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX1VOSVFVRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG93ZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0xPV0VSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19VUFBFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19NQU5ZID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX01BTlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX1JFUVVJUkVEID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FVFlQRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FR2VuZXJpYyBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FR0VORVJJQ19UWVBFID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VHRU5FUklDX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUNvbnRhaW5pbmcgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FQ09OVEFJTklOR19DTEFTUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FQ09OVEFJTklOR19DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZSBQYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0VUWVBFX1BBUkFNRVRFUlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRVRZUEVfUEFSQU1FVEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FUEFSQU1FVEVSUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FUEFSQU1FVEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXhjZXB0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FRVhDRVBUSU9OUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FRVhDRVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FR2VuZXJpYyBFeGNlcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0VHRU5FUklDX0VYQ0VQVElPTlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRUdFTkVSSUNfRVhDRVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fQUJTVFJBQ1QgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYXRpdmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX05BVElWRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN5bmNocm9uaXplZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fU1lOQ0hST05JWkVEID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0ZJTkFMID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RydWN0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0NPTlNUUlVDVE9SID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhdGljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19TVEFUSUMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfX0pBVkFfVklTSUJJTElUWSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfX1BBUkFNRVRFUlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX19KQVZBX0VYQ0VQVElPTlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX19KQVZBX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9fU09VUkNFID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklFTERfX05BTUUgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fT1JERVJFRCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fT1JERVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG93ZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fTE9XRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX1VQUEVSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX01BTlkgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX01BTlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fUkVRVUlSRUQgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX0VUWVBFID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FR2VuZXJpYyBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX0VHRU5FUklDX1RZUEUgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX0VHRU5FUklDX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fRklOQUwgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhdGljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX1NUQVRJQyA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUVMRF9fSkFWQV9WSVNJQklMSVRZID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fVFJBTlNJRU5UID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX1ZPTEFUSUxFID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJRUxEX19KQVZBX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUVMRF9fSU5JVElBTElaRVIgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZpZWxkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQkxPQ0tfX1NPVVJDRSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEJMT0NLX19OQU1FID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQkxPQ0tfX0NPTlRFTlRTID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CbG9jazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCTE9DS19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT01NRU5UX19TT1VSQ0UgPSBCTE9DS19fU09VUkNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT01NRU5UX19OQU1FID0gQkxPQ0tfX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTU1FTlRfX0NPTlRFTlRTID0gQkxPQ0tfX0NPTlRFTlRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NTUVOVF9GRUFUVVJFX0NPVU5UID0gQkxPQ0tfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU1RBVEVNRU5UX19TT1VSQ0UgPSBCTE9DS19fU09VUkNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTVEFURU1FTlRfX05BTUUgPSBCTE9DS19fTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU1RBVEVNRU5UX19DT05URU5UUyA9IEJMT0NLX19DT05URU5UUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdGF0ZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RBVEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBCTE9DS19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX05TX1VSSSA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fTlNfVVJJOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OcyBQcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX05TX1BSRUZJWCA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fTlNfUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVGYWN0b3J5IEluc3RhbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19FRkFDVE9SWV9JTlNUQU5DRSA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRUZBQ1RPUllfSU5TVEFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUNsYXNzaWZpZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX0VDTEFTU0lGSUVSUyA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRUNMQVNTSUZJRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdWJwYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19FU1VCUEFDS0FHRVMgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VTVUJQQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3VwZXIgUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX0VTVVBFUl9QQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FU1VQRVJfUEFDS0FHRTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX0pBVkFfQ0xBU1NFUyA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SmF2YSBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0lOU1RBTkNFX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgVHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0lOU1RBTkNFX1RZUEVfTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX1RZUEVfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRVBBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZSBQYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRVRZUEVfUEFSQU1FVEVSUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VUWVBFX1BBUkFNRVRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fQUJTVFJBQ1QgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fSU5URVJGQUNFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5URVJGQUNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VTVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VPUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRU9QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFMTF9BVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTExfUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VSRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVJFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQ29udGFpbm1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFMTF9DT05UQUlOTUVOVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0NPTlRBSU5NRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIE9wZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX09QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX09QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSUQgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VJRF9BVFRSSUJVVEUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FSURfQVRUUklCVVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FR2VuZXJpYyBTdXBlciBUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VHRU5FUklDX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUdFTkVSSUNfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBHZW5lcmljIFN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFMTF9HRU5FUklDX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9HRU5FUklDX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkphdmEgRGF0YSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFOTk9UQVRJT05TID0gSkFWQV9DTEFTU19fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX05BTUUgPSBKQVZBX0NMQVNTX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA9IEpBVkFfQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgPSBKQVZBX0NMQVNTX19JTlNUQU5DRV9DTEFTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0RFRkFVTFRfVkFMVUUgPSBKQVZBX0NMQVNTX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIFR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0lOU1RBTkNFX1RZUEVfTkFNRSA9IEpBVkFfQ0xBU1NfX0lOU1RBTkNFX1RZUEVfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FUEFDS0FHRSA9IEpBVkFfQ0xBU1NfX0VQQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlIFBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VUWVBFX1BBUkFNRVRFUlMgPSBKQVZBX0NMQVNTX19FVFlQRV9QQVJBTUVURVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fQUJTVFJBQ1QgPSBKQVZBX0NMQVNTX19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19JTlRFUkZBQ0UgPSBKQVZBX0NMQVNTX19JTlRFUkZBQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FU1VQRVJfVFlQRVMgPSBKQVZBX0NMQVNTX19FU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VPUEVSQVRJT05TID0gSkFWQV9DTEFTU19fRU9QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX0FUVFJJQlVURVMgPSBKQVZBX0NMQVNTX19FQUxMX0FUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX1JFRkVSRU5DRVMgPSBKQVZBX0NMQVNTX19FQUxMX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VSRUZFUkVOQ0VTID0gSkFWQV9DTEFTU19fRVJFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBVFRSSUJVVEVTID0gSkFWQV9DTEFTU19fRUFUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBDb250YWlubWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTID0gSkFWQV9DTEFTU19fRUFMTF9DT05UQUlOTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBPcGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX09QRVJBVElPTlMgPSBKQVZBX0NMQVNTX19FQUxMX09QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgPSBKQVZBX0NMQVNTX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9TVVBFUl9UWVBFUyA9IEpBVkFfQ0xBU1NfX0VBTExfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUlEIEF0dHJpYnV0ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgQVJSQVlfVFlQRV9fRUlEX0FUVFJJQlVURSA9IEpBVkFfQ0xBU1NfX0VJRF9BVFRSSUJVVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTID0gSkFWQV9DTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUdlbmVyaWMgU3VwZXIgVHlwZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VHRU5FUklDX1NVUEVSX1RZUEVTID0gSkFWQV9DTEFTU19fRUdFTkVSSUNfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBHZW5lcmljIFN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX0dFTkVSSUNfU1VQRVJfVFlQRVMgPSBKQVZBX0NMQVNTX19FQUxMX0dFTkVSSUNfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fS0lORCA9IEpBVkFfQ0xBU1NfX0tJTkQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1YmxpYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX1BVQkxJQyA9IEpBVkFfQ0xBU1NfX1BVQkxJQzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0ZJTkFMID0gSkFWQV9DTEFTU19fRklOQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fSU1QTEVNRU5UU19JTlRFUkZBQ0VTID0gSkFWQV9DTEFTU19fSU1QTEVNRU5UU19JTlRFUkZBQ0VTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19DTEFTU19JTVBPUlQgPSBKQVZBX0NMQVNTX19DTEFTU19JTVBPUlQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX1BBQ0tBR0VfSU1QT1JUUyA9IEpBVkFfQ0xBU1NfX1BBQ0tBR0VfSU1QT1JUUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRklFTERTID0gSkFWQV9DTEFTU19fRklFTERTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19NRVRIT0RTID0gSkFWQV9DTEFTU19fTUVUSE9EUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fSU5JVElBTElaRVJTID0gSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19ERUNMQVJFRF9DTEFTU0VTID0gSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fREVDTEFSSU5HX0NMQVNTID0gSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19KQVZBX1BBQ0tBR0UgPSBKQVZBX0NMQVNTX19KQVZBX1BBQ0tBR0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VWRU5UUyA9IEpBVkFfQ0xBU1NfX0VWRU5UUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fQUxMX0VWRU5UUyA9IEpBVkFfQ0xBU1NfX0FMTF9FVkVOVFM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlMgPSBKQVZBX0NMQVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRSA9IEpBVkFfQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFycmF5IFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9GRUFUVVJFX0NPVU5UID0gSkFWQV9DTEFTU19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fTkFNRSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fT1JERVJFRCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19PUkRFUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX1VOSVFVRSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG93ZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19MT1dFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX1VQUEVSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19NQU5ZID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX01BTlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19SRVFVSVJFRCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0VUWVBFID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVHZW5lcmljIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19FR0VORVJJQ19UWVBFID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0VHRU5FUklDX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0NIQU5HRUFCTEUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fQ0hBTkdFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX1ZPTEFUSUxFID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX1ZPTEFUSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX1RSQU5TSUVOVCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19UUkFOU0lFTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZSBMaXRlcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0RFRkFVTFRfVkFMVUVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuc2V0dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19VTlNFVFRBQkxFID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX1VOU0VUVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVyaXZlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0RFUklWRUQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fREVSSVZFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQ29udGFpbmluZyBDbGFzczwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19FQ09OVEFJTklOR19DTEFTUyA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19FQ09OVEFJTklOR19DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIEV2ZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfVklTSUJJTElUWV9LSU5EID0gMTM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX0tJTkQgPSAxNDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkpUeXBlIEphdmEgSGVscGVyczwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKVHlwZUphdmFIZWxwZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpUWVBFX0pBVkFfSEVMUEVSUyA9IDE1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5KVHlwZSBMaXN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEpUeXBlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKVFlQRV9MSVNUID0gMTY7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUWVBFX0tJTkQgPSAxMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJqYXZhLnhtaSI7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuamVtLmphdmEiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhUmVmUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFDbGFzcyBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEphdmFDbGFzc19LaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc1B1YmxpYyA8ZW0+UHVibGljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVibGljPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzUHVibGljKCkKLQkgKiBAc2VlICNnZXRKYXZhQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEphdmFDbGFzc19QdWJsaWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNGaW5hbCgpCi0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKYXZhQ2xhc3NfRmluYWwoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0ltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19DbGFzc0ltcG9ydCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfUGFja2FnZUltcG9ydHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0ZpZWxkcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfTWV0aG9kcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfSW5pdGlhbGl6ZXJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19EZWNsYXJpbmdDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRGVjbGFyZWRDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19KYXZhUGFja2FnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19BbGxFdmVudHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRmllbGQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc0ZpbmFsKCkKLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmllbGRfRmluYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNTdGF0aWMgPGVtPlN0YXRpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXRpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzU3RhdGljKCkKLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmllbGRfU3RhdGljKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpZWxkX0phdmFWaXNpYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzVHJhbnNpZW50IDxlbT5UcmFuc2llbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc2llbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1RyYW5zaWVudCgpCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpZWxkX1RyYW5zaWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1ZvbGF0aWxlIDxlbT5Wb2xhdGlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZvbGF0aWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNWb2xhdGlsZSgpCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpZWxkX1ZvbGF0aWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpZWxkX0phdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWVsZF9Jbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXRob2Qgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNBYnN0cmFjdCA8ZW0+QWJzdHJhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BYnN0cmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZF9BYnN0cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNOYXRpdmUgPGVtPk5hdGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hdGl2ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc05hdGl2ZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfTmF0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc1N5bmNocm9uaXplZCA8ZW0+U3luY2hyb25pemVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3luY2hyb25pemVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzU3luY2hyb25pemVkKCkKLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZF9TeW5jaHJvbml6ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNGaW5hbCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfRmluYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzQ29uc3RydWN0b3IgPGVtPkNvbnN0cnVjdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uc3RydWN0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNDb25zdHJ1Y3RvcigpCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfQ29uc3RydWN0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzU3RhdGljIDxlbT5TdGF0aWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGF0aWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNTdGF0aWMoKQotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX1N0YXRpYygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfSmF2YVZpc2liaWxpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kX1BhcmFtZXRlcnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kX0phdmFFeGNlcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kX1NvdXJjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhUGFyYW1ldGVyIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRKYXZhUGFyYW1ldGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXIjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5hbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXIjaXNGaW5hbCgpCi0JICogQHNlZSAjZ2V0SmF2YVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SmF2YVBhcmFtZXRlcl9GaW5hbCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKYXZhUGFyYW1ldGVyX1BhcmFtZXRlcktpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXJyYXlUeXBlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBcnJheVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJyYXlUeXBlX0FycmF5RGltZW5zaW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcnJheVR5cGVfQ29tcG9uZW50VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhRGF0YVR5cGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEphdmFEYXRhVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhRXZlbnQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEphdmFFdmVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhUGFja2FnZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SmF2YVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YVBhY2thZ2VfSmF2YUNsYXNzZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQmxvY2sgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEJsb2NrKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEJsb2NrX1NvdXJjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCbG9ja19OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJsb2NrX0NvbnRlbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENvbW1lbnQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENvbW1lbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU3RhdGVtZW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRTdGF0ZW1lbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSW5pdGlhbGl6ZXIgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEluaXRpYWxpemVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEluaXRpYWxpemVyX0lzU3RhdGljKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEluaXRpYWxpemVyX0phdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbml0aWFsaXplcl9Tb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVZpc2liaWxpdHlLaW5kIG9iamVjdAotCSAqLwotCUVFbnVtIGdldEphdmFWaXNpYmlsaXR5S2luZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhUGFyYW1ldGVyS2luZCBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRKYXZhUGFyYW1ldGVyS2luZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUeXBlS2luZCBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRUeXBlS2luZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKVHlwZUxpc3Qgb2JqZWN0Ci0JICovCi0JRURhdGFUeXBlIGdldEpUeXBlTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKVHlwZUphdmFIZWxwZXJzIG9iamVjdAotCSAqLwotCUVEYXRhVHlwZSBnZXRKVHlwZUphdmFIZWxwZXJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlKYXZhUmVmRmFjdG9yeSBnZXRKYXZhUmVmRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsIDxlbT5KYXZhIENsYXNzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SmF2YUNsYXNzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpBVkFfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSkFWQV9DTEFTU19fS0lORCA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfS2luZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVibGljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSkFWQV9DTEFTU19fUFVCTElDID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19QdWJsaWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSkFWQV9DTEFTU19fRklOQUwgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0ZpbmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRzIEludGVyZmFjZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUyA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfSW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIEltcG9ydDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9DTEFTU19fQ0xBU1NfSU1QT1JUID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19DbGFzc0ltcG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnZSBJbXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX0NMQVNTX19QQUNLQUdFX0lNUE9SVFMgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX1BhY2thZ2VJbXBvcnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWVsZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfQ0xBU1NfX0ZJRUxEUyA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfRmllbGRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX0NMQVNTX19NRVRIT0RTID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19NZXRob2RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsaXplcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUyA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfSW5pdGlhbGl6ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWNsYXJlZCBDbGFzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19EZWNsYXJlZENsYXNzZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlY2xhcmluZyBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUyA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfRGVjbGFyaW5nQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgUGFja2FnZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfQ0xBU1NfX0pBVkFfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfSmF2YVBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV2ZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9DTEFTU19fRVZFTlRTID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19FdmVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsbCBFdmVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfQ0xBU1NfX0FMTF9FVkVOVFMgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0FsbEV2ZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5Jbml0aWFsaXplckltcGwgPGVtPkluaXRpYWxpemVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5Jbml0aWFsaXplckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRJbml0aWFsaXplcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJTklUSUFMSVpFUiA9IGVJTlNUQU5DRS5nZXRJbml0aWFsaXplcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU3RhdGljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5JVElBTElaRVJfX0lTX1NUQVRJQyA9IGVJTlNUQU5DRS5nZXRJbml0aWFsaXplcl9Jc1N0YXRpYygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBDbGFzczwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTklUSUFMSVpFUl9fSkFWQV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRJbml0aWFsaXplcl9KYXZhQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOSVRJQUxJWkVSX19TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0SW5pdGlhbGl6ZXJfU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFQYXJhbWV0ZXJJbXBsIDxlbT5KYXZhIFBhcmFtZXRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVBhcmFtZXRlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKYXZhUGFyYW1ldGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpBVkFfUEFSQU1FVEVSID0gZUlOU1RBTkNFLmdldEphdmFQYXJhbWV0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSkFWQV9QQVJBTUVURVJfX0ZJTkFMID0gZUlOU1RBTkNFLmdldEphdmFQYXJhbWV0ZXJfRmluYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBLaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSkFWQV9QQVJBTUVURVJfX1BBUkFNRVRFUl9LSU5EID0gZUlOU1RBTkNFLmdldEphdmFQYXJhbWV0ZXJfUGFyYW1ldGVyS2luZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5NZXRob2RJbXBsIDxlbT5NZXRob2Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLk1ldGhvZEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRNZXRob2QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EID0gZUlOU1RBTkNFLmdldE1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfX0FCU1RSQUNUID0gZUlOU1RBTkNFLmdldE1ldGhvZF9BYnN0cmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmF0aXZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX19OQVRJVkUgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kX05hdGl2ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3luY2hyb25pemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX19TWU5DSFJPTklaRUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kX1N5bmNocm9uaXplZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfX0ZJTkFMID0gZUlOU1RBTkNFLmdldE1ldGhvZF9GaW5hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RydWN0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfX0NPTlNUUlVDVE9SID0gZUlOU1RBTkNFLmdldE1ldGhvZF9Db25zdHJ1Y3RvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhdGljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX19TVEFUSUMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kX1N0YXRpYygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFkgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kX0phdmFWaXNpYmlsaXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfX1BBUkFNRVRFUlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kX1BhcmFtZXRlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgRXhjZXB0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX19KQVZBX0VYQ0VQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kX0phdmFFeGNlcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIENsYXNzPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9fSkFWQV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RfSmF2YUNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RfU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkZpZWxkSW1wbCA8ZW0+RmllbGQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkZpZWxkSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEZpZWxkKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEZJRUxEID0gZUlOU1RBTkNFLmdldEZpZWxkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJRUxEX19GSU5BTCA9IGVJTlNUQU5DRS5nZXRGaWVsZF9GaW5hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhdGljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklFTERfX1NUQVRJQyA9IGVJTlNUQU5DRS5nZXRGaWVsZF9TdGF0aWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgVmlzaWJpbGl0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJRUxEX19KQVZBX1ZJU0lCSUxJVFkgPSBlSU5TVEFOQ0UuZ2V0RmllbGRfSmF2YVZpc2liaWxpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJRUxEX19UUkFOU0lFTlQgPSBlSU5TVEFOQ0UuZ2V0RmllbGRfVHJhbnNpZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJRUxEX19WT0xBVElMRSA9IGVJTlNUQU5DRS5nZXRGaWVsZF9Wb2xhdGlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBDbGFzczwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGSUVMRF9fSkFWQV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRGaWVsZF9KYXZhQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWxpemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRklFTERfX0lOSVRJQUxJWkVSID0gZUlOU1RBTkNFLmdldEZpZWxkX0luaXRpYWxpemVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkJsb2NrSW1wbCA8ZW0+QmxvY2s8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkJsb2NrSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEJsb2NrKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEJMT0NLID0gZUlOU1RBTkNFLmdldEJsb2NrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCTE9DS19fU09VUkNFID0gZUlOU1RBTkNFLmdldEJsb2NrX1NvdXJjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJMT0NLX19OQU1FID0gZUlOU1RBTkNFLmdldEJsb2NrX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCTE9DS19fQ09OVEVOVFMgPSBlSU5TVEFOQ0UuZ2V0QmxvY2tfQ29udGVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuQ29tbWVudEltcGwgPGVtPkNvbW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkNvbW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0Q29tbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT01NRU5UID0gZUlOU1RBTkNFLmdldENvbW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuU3RhdGVtZW50SW1wbCA8ZW0+U3RhdGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5TdGF0ZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0U3RhdGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNUQVRFTUVOVCA9IGVJTlNUQU5DRS5nZXRTdGF0ZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVBhY2thZ2VJbXBsIDxlbT5KYXZhIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEphdmFQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpBVkFfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRKYXZhUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBDbGFzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX1BBQ0tBR0VfX0pBVkFfQ0xBU1NFUyA9IGVJTlNUQU5DRS5nZXRKYXZhUGFja2FnZV9KYXZhQ2xhc3NlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhRGF0YVR5cGVJbXBsIDxlbT5KYXZhIERhdGEgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YURhdGFUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEphdmFEYXRhVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKQVZBX0RBVEFfVFlQRSA9IGVJTlNUQU5DRS5nZXRKYXZhRGF0YVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuQXJyYXlUeXBlSW1wbCA8ZW0+QXJyYXkgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuQXJyYXlUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEFycmF5VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUlJBWV9UWVBFID0gZUlOU1RBTkNFLmdldEFycmF5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXJyYXkgRGltZW5zaW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlMgPSBlSU5TVEFOQ0UuZ2V0QXJyYXlUeXBlX0FycmF5RGltZW5zaW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29tcG9uZW50IFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRSA9IGVJTlNUQU5DRS5nZXRBcnJheVR5cGVfQ29tcG9uZW50VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhRXZlbnRJbXBsIDxlbT5KYXZhIEV2ZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhRXZlbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SmF2YUV2ZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpBVkFfRVZFTlQgPSBlSU5TVEFOQ0UuZ2V0SmF2YUV2ZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5UeXBlS2luZCA8ZW0+VHlwZSBLaW5kPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5UeXBlS2luZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldFR5cGVLaW5kKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gVFlQRV9LSU5EID0gZUlOU1RBTkNFLmdldFR5cGVLaW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQgPGVtPkphdmEgVmlzaWJpbGl0eSBLaW5kPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKYXZhVmlzaWJpbGl0eUtpbmQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBKQVZBX1ZJU0lCSUxJVFlfS0lORCA9IGVJTlNUQU5DRS5nZXRKYXZhVmlzaWJpbGl0eUtpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXJLaW5kIDxlbT5KYXZhIFBhcmFtZXRlciBLaW5kPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyS2luZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEphdmFQYXJhbWV0ZXJLaW5kKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gSkFWQV9QQVJBTUVURVJfS0lORCA9IGVJTlNUQU5DRS5nZXRKYXZhUGFyYW1ldGVyS2luZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+SlR5cGUgSmF2YSBIZWxwZXJzPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKVHlwZUphdmFIZWxwZXJzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEpUWVBFX0pBVkFfSEVMUEVSUyA9IGVJTlNUQU5DRS5nZXRKVHlwZUphdmFIZWxwZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5KVHlwZSBMaXN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKVHlwZUxpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgSlRZUEVfTElTVCA9IGVJTlNUQU5DRS5nZXRKVHlwZUxpc3QoKTsKLQotCX0KLQotfSAvL0phdmFSZWZQYWNrYWdlCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFVUkwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVVSTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWMxMjA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVVSTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0KLQotICovCi0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGFwcHJvcHJpYXRlIHtAbGluayBKYXZhUmVmRmFjdG9yeX0gVVJJIG1ldGhvZHMgaW5zdGVhZC4KLSAqIAotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVVJMIGV4dGVuZHMgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5VUkwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfUFJPVE9DT0xfVVJJX1BSRUZJWCA9ICJqYXZhOi8iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSmF2YVVSTCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSB1cmxTdHJpbmcgamF2YS5sYW5nLlN0cmluZwotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSmF2YVJlZkZhY3RvcnkjY3JlYXRlVHlwZVVSSShTdHJpbmcpfSBvciB7QGxpbmsgSmF2YVJlZkZhY3RvcnkjY3JlYXRlUGFja2FnZVVSSShTdHJpbmcpfQotCSAqLwotCXB1YmxpYyBKYXZhVVJMKFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJc3VwZXIodXJsU3RyaW5nKTsKLQl9Ci0JLyoqCi0JICogSmF2YVVSTCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBuYW1lU3BhY2VOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaUQgamF2YS5sYW5nLlN0cmluZwotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSmF2YVJlZkZhY3RvcnkjY3JlYXRlVHlwZVVSSShTdHJpbmcsIFN0cmluZyl9Ci0JICogCi0JICovCi0JcHVibGljIEphdmFVUkwoU3RyaW5nIG5hbWVTcGFjZU5hbWUsIFN0cmluZyBpRCkgewotCQlzdXBlcihudWxsLCBudWxsKTsKLQkJaW5pdGlhbGl6ZU5hbWVzcGFjZVN0cmluZyhuYW1lU3BhY2VOYW1lKTsKLQkJdGhpcy5JRCA9IGlEOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBKYXZhUmVmRmFjdG9yeSNnZXRUeXBlTmFtZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKX0gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2FzIGNyZWF0ZWQgaW4gVmlzdWFsQWdlLgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSmF2YVJlZkZhY3RvcnkjZ2V0RnVsbFR5cGVOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5hbWVzcGFjZU5hbWUgIT0gbnVsbCkgewotCQkJYnVmLmFwcGVuZChuYW1lc3BhY2VOYW1lKTsKLQkJCWlmIChJRCAhPSBudWxsKQotCQkJCWJ1Zi5hcHBlbmQoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChJRCAhPSBudWxsKQotCQkJYnVmLmFwcGVuZChJRCk7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSmF2YVJlZkZhY3RvcnkjZ2V0UGFja2FnZU5hbWUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSl9Ci0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLQkJU3RyaW5nIGludGVybmFsTmFtZSA9IG5hbWVzcGFjZU5hbWUuc3Vic3RyaW5nKEpBVkFfUFJPVE9DT0xfVVJJX1BSRUZJWC5sZW5ndGgoKSwgbmFtZXNwYWNlTmFtZS5sZW5ndGgoKSk7Ci0JCXJldHVybiBKYXZhUGFja2FnZS5QUklNSVRJVkVfUEFDS0FHRV9OQU1FLmVxdWFscyhpbnRlcm5hbE5hbWUpID8gIiIgOiBpbnRlcm5hbE5hbWU7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyogSWYgd2UgZG9uJ3QgaGF2ZSBhICMgc2lnbiB0byBkZWxpbWl0IHRoZSBzdGFydCBvZiB0aGUgamF2YSBwYWNrYWdlIHVzIHRoZSBpbmhlcml0ZWQgYmVoYXZpb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVN0cmluZyhTdHJpbmcgdXJsKSB7Ci0JCWlmICh1cmwuaW5kZXhPZigiIyIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQlzdXBlci5pbml0aWFsaXplRnJvbVN0cmluZyh1cmwpOwotCQllbHNlIHsKLQkJCWludCBlbmRPZlBhY2thZ2VOYW1lID0gdXJsLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoZW5kT2ZQYWNrYWdlTmFtZSA9PSAtMSkKLQkJCQlpbml0aWFsaXplTmFtZXNwYWNlU3RyaW5nKG51bGwpOwotCQkJZWxzZQotCQkJCWluaXRpYWxpemVOYW1lc3BhY2VTdHJpbmcodXJsLnN1YnN0cmluZygwLCBlbmRPZlBhY2thZ2VOYW1lKSk7Ci0JCQlJRCA9IHVybC5zdWJzdHJpbmcoZW5kT2ZQYWNrYWdlTmFtZSArIDEpOwotCQl9Ci0KLQl9Ci0JLyogCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5hbWVzcGFjZVN0cmluZyhTdHJpbmcgYU5hbWVzcGFjZU5hbWUpIHsKLQkJaWYgKGFOYW1lc3BhY2VOYW1lID09IG51bGwpCi0JCQluYW1lc3BhY2VOYW1lID0gSkFWQV9QUk9UT0NPTF9VUklfUFJFRklYOwotCQllbHNlCi0JCQluYW1lc3BhY2VOYW1lID0gSkFWQV9QUk9UT0NPTF9VUklfUFJFRklYICsgYU5hbWVzcGFjZU5hbWU7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhVXJsU3RyaW5nCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSmF2YVJlZkZhY3RvcnkjaXNKYXZhVVJJKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpfSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhVVJMKFN0cmluZyBhVXJsU3RyaW5nKSB7Ci0JCWlmIChhVXJsU3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhVXJsU3RyaW5nLnN0YXJ0c1dpdGgoSkFWQV9QUk9UT0NPTF9VUklfUFJFRklYKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlVSTCgiICsgZ2V0RnVsbFN0cmluZygpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFWaXNpYmlsaXR5S2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhVmlzaWJpbGl0eUtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZjNjNjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFWaXNpYmlsaXR5S2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUEFDS0FHRT0xCi0gKiBQVUJMSUM9MgotICogUFJJVkFURT0zCi0gKiBQUk9URUNURUQ9NAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhVmlzaWJpbGl0eUtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhVmlzaWJpbGl0eUtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QVUJMSUM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFVCTElDX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBSSVZBVEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJJVkFURV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFJPVEVDVEVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BST1RFQ1RFRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RFQ1RFRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QQUNLQUdFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BBQ0tBR0VfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBVQkxJQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UFVCTElDPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BVQkxJQwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZCBQVUJMSUNfTElURVJBTCA9IG5ldyBKYXZhVmlzaWJpbGl0eUtpbmQoUFVCTElDLCAiUFVCTElDIiwgIlBVQkxJQyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFJJVkFURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UFJJVkFURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQUklWQVRFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kIFBSSVZBVEVfTElURVJBTCA9IG5ldyBKYXZhVmlzaWJpbGl0eUtpbmQoUFJJVkFURSwgIlBSSVZBVEUiLCAiUFJJVkFURSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFJPVEVDVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QUk9URUNURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJPVEVDVEVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kIFBST1RFQ1RFRF9MSVRFUkFMID0gbmV3IEphdmFWaXNpYmlsaXR5S2luZChQUk9URUNURUQsICJQUk9URUNURUQiLCAiUFJPVEVDVEVEIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QQUNLQUdFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QQUNLQUdFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BBQ0tBR0UKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhVmlzaWJpbGl0eUtpbmQgUEFDS0FHRV9MSVRFUkFMID0gbmV3IEphdmFWaXNpYmlsaXR5S2luZChQQUNLQUdFLCAiUEFDS0FHRSIsICJQQUNLQUdFIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEphdmFWaXNpYmlsaXR5S2luZFtdIHsKLQkJCVBVQkxJQ19MSVRFUkFMLAotCQkJUFJJVkFURV9MSVRFUkFMLAotCQkJUFJPVEVDVEVEX0xJVEVSQUwsCi0JCQlQQUNLQUdFX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUphdmFWaXNpYmlsaXR5S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkphdmEgVmlzaWJpbGl0eSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVZpc2liaWxpdHlLaW5kIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJSmF2YVZpc2liaWxpdHlLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KYXZhIFZpc2liaWxpdHkgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgSmF2YVZpc2liaWxpdHlLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBQVUJMSUM6IHJldHVybiBQVUJMSUNfTElURVJBTDsKLQkJCWNhc2UgUFJJVkFURTogcmV0dXJuIFBSSVZBVEVfTElURVJBTDsKLQkJCWNhc2UgUFJPVEVDVEVEOiByZXR1cm4gUFJPVEVDVEVEX0xJVEVSQUw7Ci0JCQljYXNlIFBBQ0tBR0U6IHJldHVybiBQQUNLQUdFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEphdmFWaXNpYmlsaXR5S2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vSmF2YVZpc2liaWxpdHlLaW5kCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL01ldGhvZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9NZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjYTVjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL01ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2QgZXh0ZW5kcyBFT3BlcmF0aW9uewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEX0NPTU1FTlRfVEFHID0gIkBnZW5lcmF0ZWQiOwotCS8qKgotCSAqIExpc3RzIGFsbCB0aGUgcGFyYW1ldGVycywgZXhjbHVkaW5nIHRoZSByZXR1cm4gdHlwZQotCSAqLyAKLQlwdWJsaWMgSmF2YVBhcmFtZXRlcltdIGxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzQWJzdHJhY3QgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc0Fic3RyYWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNBYnN0cmFjdCA8ZW0+QWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBYnN0cmFjdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc05hdGl2ZSBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzTmF0aXZlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNOYXRpdmUgPGVtPk5hdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmF0aXZlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc05hdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmF0aXZlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzU3luY2hyb25pemVkIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc1N5bmNocm9uaXplZCA8ZW0+U3luY2hyb25pemVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TeW5jaHJvbml6ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU3luY2hyb25pemVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTeW5jaHJvbml6ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNGaW5hbCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzRmluYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzQ29uc3RydWN0b3IgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNDb25zdHJ1Y3RvciA8ZW0+Q29uc3RydWN0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cnVjdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0NvbnN0cnVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25zdHJ1Y3Rvcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc1N0YXRpYyBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzU3RhdGljKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNTdGF0aWMgPGVtPlN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdGljPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhdGljKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEphdmFWaXNpYmlsaXR5IGF0dHJpYnV0ZQotCSAqLwotCUphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2dldEphdmFWaXNpYmlsaXR5IDxlbT5KYXZhIFZpc2liaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgVmlzaWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQKLQkgKiBAc2VlICNnZXRKYXZhVmlzaWJpbGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgUGFyYW1ldGVycyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0UGFyYW1ldGVycygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBKYXZhRXhjZXB0aW9ucyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEphdmFDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjZ2V0SmF2YUNsYXNzIDxlbT5KYXZhIENsYXNzPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBDbGFzczwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEphdmFDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SmF2YUNsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTb3VyY2UgcmVmZXJlbmNlCi0JICovCi0JQmxvY2sgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvdXJjZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTb3VyY2UoQmxvY2sgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIHRoZSBqYXZhIGNsYXNzIHRoYXQgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBpbi4KLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHRoZSBtZXRob2QgbmFtZSBhbmQgaXRzIHBhcmFtZXRlcnMuIGUuZy4gPGNvZGU+Ci0JICogc2V0Rmlyc3ROYW1lKGphdmEubGFuZy5TdHJpbmcpIDwvL2NvZGU+IC4KLQkgKiAgCi0JICovCi0JU3RyaW5nIGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhIFBhcmFtZXRlciB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4KLQkgKi8KLQlKYXZhUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgcGFyYW1ldGVyTmFtZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBHZXQgdGhlIHJldHVybiB0eXBlLgotCSAqLwotCUphdmFIZWxwZXJzIGdldFJldHVyblR5cGUoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2V0IHRoZSByZXR1cm4gdHlwZQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAbW9kZWwgdHlwZURhdGFUeXBlPSJvcmcuZWNsaXBzZS5qZW0uamF2YS5KVHlwZUphdmFIZWxwZXJzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJldHVyblR5cGUoSmF2YUhlbHBlcnMgdHlwZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLnRvU3RyaW5nKCkuCi0JICogCi0JICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgTWV0aG9kLiAgVGhlIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgdGhlIG1ldGhvZCAKLQkgKiBhY2Nlc3MgbW9kaWZpZXJzLCBpZiBhbnksIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgcmV0dXJuIHR5cGUsIGZvbGxvd2VkIGJ5IGEKLQkgKiBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWV0aG9kLCBmb2xsb3dlZCBieSBhIHBlcmlvZCwKLQkgKiBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIG5hbWUsIGZvbGxvd2VkIGJ5IGEgcGFyZW50aGVzaXplZCwgY29tbWEtc2VwYXJhdGVkIGxpc3QKLQkgKiBvZiB0aGUgbWV0aG9kJ3MgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG1ldGhvZCB0aHJvd3MgY2hlY2tlZAotCSAqIGV4Y2VwdGlvbnMsIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcyBmb2xsb3dlZCBieSBhIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgd29yZAotCSAqIHRocm93cyBmb2xsb3dlZCBieSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aHJvd24gZXhjZXB0aW9uIHR5cGVzLgotCSAqIAotCSAqIEZvciBleGFtcGxlOgotCSAqIAotCSAqICAgICBwdWJsaWMgYm9vbGVhbiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqIAotCSAqIFRoZSBhY2Nlc3MgbW9kaWZpZXJzIGFyZSBwbGFjZWQgaW4gY2Fub25pY2FsIG9yZGVyIGFzIHNwZWNpZmllZCBieSAiVGhlIEphdmEKLQkgKiBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIi4gIFRoaXMgaXMgcHVibGljLCA8dHQ+cHJvdGVjdGVkPC8vdHQ+IG9yCi0JICogPHR0PnByaXZhdGU8Ly90dD4gZmlyc3QsIGFuZCB0aGVuIG90aGVyIG1vZGlmaWVycyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotCSAqIDx0dD5hYnN0cmFjdDwvL3R0PiwgPHR0PnN0YXRpYzwvL3R0PiwgPHR0PmZpbmFsPC8vdHQ+LCA8dHQ+c3luY2hyb25pemVkPC8vdHQ+Ci0JICogPHR0Pm5hdGl2ZTwvL3R0Pi4KLQotCSAqLwotCVN0cmluZyBnZXRTaWduYXR1cmUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIHN5c3RlbSBnZW5lcmF0ZWQuCi0JICogVGhpcyBpcyB1c3VhbGx5IGRldGVybWluZWQgYnkgdGhlIEBnZW5lcmF0ZWQgdGFnIGluIHRoZSBjb21tZW50LgotCSAqLwotCWJvb2xlYW4gaXNHZW5lcmF0ZWQoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2V0IHRoZSBpc0dlbmVyYXRlZCBmbGFnLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0dlbmVyYXRlZChib29sZWFuIGdlbmVyYXRlZCk7Ci0KLSAgICAvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBJcyB0aGlzIGEgdm9pZCByZXR1cm4gdHlwZSBtZXRob2QuCi0JICovCi0JYm9vbGVhbiBpc1ZvaWQoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvU3RhdGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL1N0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDYyZGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdGVtZW50IGV4dGVuZHMgQmxvY2sgewotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9UeXBlS2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9UeXBlS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTEzM2MyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvVHlwZUtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlR5cGUgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTkRFRklORUQ9MSBDTEFTUz0yIElOVEVSRkFDRT0zIEVYQ0VQVElPTj00Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldFR5cGVLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHlwZUtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5VTkRFRklORUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVU5ERUZJTkVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNMQVNTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NMQVNTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1MgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5URVJGQUNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOVEVSRkFDRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSRkFDRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FWENFUFRJT048L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhDRVBUSU9OX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDRVBUSU9OID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVOREVGSU5FRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VU5ERUZJTkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1VOREVGSU5FRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVLaW5kIFVOREVGSU5FRF9MSVRFUkFMID0gbmV3IFR5cGVLaW5kKFVOREVGSU5FRCwgIlVOREVGSU5FRCIsICJVTkRFRklORUQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNMQVNTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DTEFTUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDTEFTUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVLaW5kIENMQVNTX0xJVEVSQUwgPSBuZXcgVHlwZUtpbmQoQ0xBU1MsICJDTEFTUyIsICJDTEFTUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5URVJGQUNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTlRFUkZBQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5URVJGQUNFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUtpbmQgSU5URVJGQUNFX0xJVEVSQUwgPSBuZXcgVHlwZUtpbmQoSU5URVJGQUNFLCAiSU5URVJGQUNFIiwgIklOVEVSRkFDRSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVhDRVBUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FWENFUFRJT048L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhDRVBUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUtpbmQgRVhDRVBUSU9OX0xJVEVSQUwgPSBuZXcgVHlwZUtpbmQoRVhDRVBUSU9OLCAiRVhDRVBUSU9OIiwgIkVYQ0VQVElPTiIpOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlR5cGUgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlS2luZFtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBUeXBlS2luZFtdIHsKLQkJCVVOREVGSU5FRF9MSVRFUkFMLAotCQkJQ0xBU1NfTElURVJBTCwKLQkJCUlOVEVSRkFDRV9MSVRFUkFMLAotCQkJRVhDRVBUSU9OX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VHlwZSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlR5cGUgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgVHlwZUtpbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUeXBlS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlR5cGUgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFR5cGVLaW5kIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHlwZUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlR5cGUgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgVHlwZUtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFVOREVGSU5FRDogcmV0dXJuIFVOREVGSU5FRF9MSVRFUkFMOwotCQkJY2FzZSBDTEFTUzogcmV0dXJuIENMQVNTX0xJVEVSQUw7Ci0JCQljYXNlIElOVEVSRkFDRTogcmV0dXJuIElOVEVSRkFDRV9MSVRFUkFMOwotCQkJY2FzZSBFWENFUFRJT046IHJldHVybiBFWENFUFRJT05fTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHlwZUtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1R5cGVLaW5kCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0lKYXZhUmVmbGVjdGlvbktleS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9JSmF2YVJlZmxlY3Rpb25LZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmZTgxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0lKYXZhUmVmbGVjdGlvbktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLQotcHVibGljIGludGVyZmFjZSBJSmF2YVJlZmxlY3Rpb25LZXkgewotCi0JLyogQ29uc3RhbnRzIGZvciB0aGUgcHJpbWl0aXZlIHR5cGUgbmFtZXMKLQkgKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyB3aGljaCBhcmUgdXNlZCB0byByZWZlciB0byBhIHByaW1pdGl2ZSB0eXBlLAotCSAqIGkuZS4gbmV3IEphdmFVUkwoImludCIpICBvciBuZXcgVVJMKCJqYXZhOi8vI2ludCIpCi0JICogVGhlc2UgdHlwZXMgYXJlIGNhY2hlZCBieSBwcmUtbG9hZGluZyBkb2N1bWVudHMgZm9yIHRoZSBwcmltaXRpdmVzLAotCSAqIGluICJqYXZhOi8vIiwgYW5kIGZvciB0aGUgamF2YS5sYW5nIChPYmplY3QgYW5kIFN0cmluZykgY2xhc3NlcwotCSAqLwotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fVk9JRCA9ICJ2b2lkIjsJIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0lOVCA9ICJpbnQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0JPT0xFQU4gPSAiYm9vbGVhbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fQ0hBUiA9ICJjaGFyIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9CWVRFID0gImJ5dGUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0xPTkcgPSAibG9uZyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fRkxPQVQgPSAiZmxvYXQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0RPVUJMRSA9ICJkb3VibGUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX1NIT1JUID0gInNob3J0IjsvLyROT04tTkxTLTEkCi0KLQkvKiAKLQkgKiBDcmVhdGUgYW4gQXJyYXlUeXBlIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBKYXZhQ2xhc3MgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiBIYW5kbGVzIHRoZSBwdXNoIGFuZCBwb3Agb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEphdmFDbGFzcyBjcmVhdGVKYXZhQ2xhc3MoKTsKLQotCS8qIAotCSAqIENyZWF0ZSBhIEZpZWxkIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBGaWVsZCBjcmVhdGVKYXZhRmllbGQoKTsKLQotCS8qIAotCSAqIENyZWF0ZSBhIE1ldGhvZCBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTWV0aG9kIGNyZWF0ZUphdmFNZXRob2QoKTsKLQotCS8qIAotCSAqIENyZWF0ZSBhIEphdmFQYXJhbWV0ZXIgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSmF2YVBhcmFtZXRlciBjcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0KLQkvL0ZCLyoqCi0JLy9GQiAqIE92ZXJyaWRlIHRvIHRyeSB0byBpbnRyb3NwZWN0IG9iamVjdHMKLQkvL0ZCICogdGhhdCBhcmVuJ3QgZm91bmQgdXNpbmcgdGhlIGRlZmF1bHQgbWVjaGFuaXNtLgotCS8vRkIgKi8KLQkvL0ZCcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotCS8vRkIgCU9iamVjdCBqYXZhT2JqZWN0ID0gc3VwZXIuZ2V0KGtleSk7Ci0JLy9GQiAJaWYgKGphdmFPYmplY3QgPT0gbnVsbCkgewotCS8vRkIgCQlqYXZhT2JqZWN0ID0gZ2V0T2JqZWN0RnJvbUV4dGVuc2lvbnMoKFN0cmluZykga2V5KTsKLQkvL0ZCIAkJaWYgKGphdmFPYmplY3QgPT0gbnVsbCkKLQkvL0ZCIAkJCWphdmFPYmplY3QgPSBnZXRKYXZhT2JqZWN0KChTdHJpbmcpIGtleSk7Ci0JLy9GQiAJfQotCS8vRkIJcmV0dXJuIGphdmFPYmplY3Q7Ci0JLy9GQn0KLQotCS8vRkIgQURERUQKLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldChTdHJpbmcga2V5KTsKLQotCS8vRkIgRU5ECi0KLQkvKgotCSAqIEluc3RhbnRpYXRlIHRoZSBuYW1lZCBjbGFzcy4KLQkgKiBJZiB3ZSBtYWtlIGl0IHRvIHRoaXMgcG9pbnQsIHRoZSBjbGFzcyBoYXMgbm90IHlldCBiZWVuIGluc3RhbnRpYXRlZCBvciByZWZsZWN0ZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEVDbGFzc2lmaWVyIGdldEFycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpOwotCi0JLyoKLQkgKiBJbnN0YW50aWF0ZSB0aGUgbmFtZWQgY2xhc3MuCi0JICogSWYgd2UgbWFrZSBpdCB0byB0aGlzIHBvaW50LCB0ZWggY2xhc3MgaGFzIG5vdCB5ZXQgYmVlbiBpbnN0YW50aWF0ZWQgb3IgcmVmbGVjdGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBFQ2xhc3NpZmllciBnZXRKYXZhQ2xhc3MoU3RyaW5nIHR5cGVOYW1lKTsKLQotCS8qKgotCSAqIFRoaXMgYWxsb3dzIGZvciB0aGUgcmV0cmlldmFsIG9mIGF0dHJpYnV0ZXMvbWV0aG9kcyB3aXRoIHRoZSBmb2xsb3dpbmcgbm90YXRpb246Ci0JICogZmllbGQ6IGphdmE6L2NvbS5pYm0uZm9vI1Rlc3QuZm9vCi0JICogbWV0aG9kOiBqYXZhOi9jb20uaWJtLmZvbyNUZXN0LmZvb2ZvbygKLQkgKiBwYXJhbWV0ZXI6IGphdmE6L2NvbS5pYm0uZm9vI1Rlc3QuZm9vZm9vKC1hcmcwCi0JICogCi0JICovCi0JcHVibGljIGFic3RyYWN0IEVPYmplY3QgZ2V0SmF2YU9iamVjdChTdHJpbmcga2V5VmFsdWUpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMC80LzIwMDAgOTo1MjoyOCBBTSkKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcgotCSAqIEBwYXJhbSB0eXBlTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IEVDbGFzc2lmaWVyIGdldEphdmFUeXBlKFN0cmluZyB0eXBlTmFtZSk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBmcm9tIHRoZSBrZXkgYnV0IGRvbid0IGRvIGFueSAKLQkgKiB0cmllcyBhdCBjcmVhdGlvbiBvZiB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKiBUaGUgS2V5IG11c3QgYmUgYW4gSUQgZm9yIGl0IHRvIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgcHJpbUdldChTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXNzZWQgdHlwZSByZXByZXNlbnRzIGEgSmF2YSBBcnJheSB0eXBlCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBcnJheShTdHJpbmcgdHlwZU5hbWUpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9JSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTdmYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9JSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzOwotCi0vKioKLSAqIEV4dGVuc2lvbiBpbnRlcmZhY2UgdG8gYWRkIGFuIGFkZGl0aW9uYWwgcmVmbGVjdGlvbiBrZXkgaW4gdG8gaGFuZGxlCi0gKiBvdGhlciB0eXBlcyBvZiBrZXkncyBub3Qgc3BlY2lmaWNhbGx5IGhhbmRsZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiB7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBpZC4KLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gcmVmbGVjdGlvbktleQotCSAqIEByZXR1cm4gdGhlIG9iamVjdCAoaXQgc2hvdWxkIGFkZCB0aGUgaWQgd2l0aCBvYmplY3QgdG8gdGhlIHJlc291cmNlJ3MgaWQgdGFibGUgYmVmb3JlIHJldHVybmluZyBpdCkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IG9uZSBpdCBoYW5kbGVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBpZCwgSUphdmFSZWZsZWN0aW9uS2V5IHJlZmxlY3Rpb25LZXkpOwotCQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9KYXZhWE1JRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9KYXZhWE1JRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJmYWU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSmF2YVhNSUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVhNSUZhY3RvcnlJbXBsOwotIAotCi0vKioKLSAqIEZhY3RvcnkgZm9yIEphdmEgWE1JIFJlc291cmNlcy4KLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFYTUlGYWN0b3J5IHsKLQotCS8qKgotCSAqIFNjaGVtZSB1c2VkIGluIFVSSSdzIGZvciBqZW0gZWxlbWVudHMuCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhWE1JRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBKYXZhWE1JRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJlZ2lzdGVyIHRoZSByZWZsZWN0aW9uIGtleSBleHRlbnNpb24uCi0JICogQHBhcmFtIGV4dGVuc2lvbgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVmbGVjdGlvbktleUV4dGVuc2lvbihJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gZXh0ZW5zaW9uKTsKLQkKLQkvKioKLQkgKiBEZXJlZ2lzdGVyIHRoZSByZWZsZWN0aW9uIGtleSBleHRlbnNpb24uCi0JICogQHBhcmFtIGV4dGVuc2lvbgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiBleHRlbnNpb24pOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbXBsL0phdmFSZWZQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbXBsL0phdmFSZWZQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjA5MDQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW1wbC9KYXZhUmVmUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLQotIAotCi0vKioKLSAqIAotICogRG8gbm90IHVzZS4gVGhpcyBpcyBoZXJlIG9ubHkgZm9yIHRoZSBvbGRlciBwcmUtRU1GIDIuMiBnZW5lcmF0ZWQgY29kZSB0aGF0IGFjY2Vzc2VzIHRoZSBwYWNrYWdlIGRpcmVjdGx5IGluc3RlYWQgb2YgdGhyb3VnaCB0aGUgaW50ZXJmYWNlLgotICogVGhpcyBpcyBraW5kIG9mIEFQSSBhbmQgbXVzdCBub3QgZ28gYXdheSwgYnV0IG5ldyBjbGllbnRzIHNob3VsZCBub3QgcmVmZXJlbmNlIHRoaXMgY2xhc3MuCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZWZQYWNrYWdlSW1wbCBleHRlbmRzIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsIHsKLQotCXB1YmxpYyBKYXZhUmVmUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBEbyBub3QgdXNlLiBUaGlzIGlzIGhlcmUgb25seSBmb3IgdGhlIG9sZGVyIHByZS1FTUYgMi4yIGdlbmVyYXRlZCBjb2RlIHRoYXQgYWNjZXNzZXMgdGhlIHBhY2thZ2UgZGlyZWN0bHkgaW5zdGVhZCBvZiB0aHJvdWdoIHRoZSBpbnRlcmZhY2UuCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UuIFRoaXMgaXMgaGVyZSBvbmx5IGZvciB0aGUgb2xkZXIgcHJlLUVNRiAyLjIgZ2VuZXJhdGVkIGNvZGUgdGhhdCBhY2Nlc3NlcyB0aGUgcGFja2FnZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHRocm91Z2ggdGhlIGludGVyZmFjZS4KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZQYWNrYWdlIGluaXQoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbC5pbml0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQXJyYXlUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0FycmF5VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5OGI4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQXJyYXlUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIERlc2NyaWJlcyBhIEphdmEgQXJyYXkgdHlwZQotICogICAgRm9yIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cywgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZQotICogICAgc3BlY2lmaWVkIGRpcmVjdGx5LiAgVGhpcyB3b3VsZCByZXF1aXJlIGluc3RhbnRpYXRpbmcgYSBjaGFpbiBvZiBjb21wb25lbnQgdHlwZXMKLSAqICAgIHN1Y2ggYXMgU3RyaW5nW11bXVtdW10tPlN0cmluZ1tdW11bXS0+U3RyaW5nW11bXS0+U3RyaW5nW10tPlN0cmluZy4KLSAqIAotICogICBUaGUgY29tcG9uZW50IHR5cGUgcmVsYXRpb25zaGlwIHdpbGwgYmUgY29tcHV0ZWQgaWYgdGhlIGZpbmFsQ29tcG9uZW50VHlwZQotICogICBhbmQgYXJyYXkgZGltZW5zaW9ucyBpcyBzcGVjaWZpZWQuCi0gKiAgCi0gKiAgIEZvciB0aGlzIHJlYXNvbiwgdGhlIHByZWZlcnJlZCB3YXkgdG8gY3JlYXRlIGlzIHRocm91Z2ggdGhlIEphdmFSZWZGYWN0b3J5IGZhY3RvcnkgbWV0aG9kOgotICogICAgICAgIGNyZWF0ZUFycmF5VHlwZShKYXZhQ2xhc3MgZmluYWxDb21wb25lbnRUeXBlLCBpbnQgZGltZW5zaW9ucykKLSAqLwotcHVibGljIGNsYXNzIEFycmF5VHlwZUltcGwgZXh0ZW5kcyBKYXZhQ2xhc3NJbXBsIGltcGxlbWVudHMgQXJyYXlUeXBlLCBKYXZhQ2xhc3MgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFycmF5RGltZW5zaW9ucygpIDxlbT5BcnJheSBEaW1lbnNpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcnJheURpbWVuc2lvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFSUkFZX0RJTUVOU0lPTlNfRURFRkFVTFQgPSAwOwotCi0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGludCBhcnJheURpbWVuc2lvbnMgPSBBUlJBWV9ESU1FTlNJT05TX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBvbmVudFR5cGUoKSA8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBvbmVudFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3NpZmllciBjb21wb25lbnRUeXBlID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgSmF2YUhlbHBlcnMgZmluYWxDb21wb25lbnRUeXBlID0gbnVsbDsKLQotCXByb3RlY3RlZCBBcnJheVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLkFSUkFZX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZSB0aGUgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgYXJyYXkgdHlwZSBmcm9tIG91ciB0eXBlIG5hbWUuCi0JICogVGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkgdHlwZSBpcyBlc3NlbnRpYWxseTogbmV3IEFycmF5VHlwZUltcGwoZmluYWxDb21wb25lbnRUeXBlLCBhcnJheURpbWVuc2lvbnMtMSkKLQkgKiB1bmxlc3Mgb3VyIGFycmF5IGRpbWVuc2lvbiBpcyAxLCBpbiB3aGljaCBjYXNlIGl0IGlzIG9ubHkgb3VyIGZpbmFsIGNvbXBvbmVudCB0eXBlLgotCSAqCi0JICogSW4gb3JkZXIgdG8gZW5zdXJlIGEgdW5pcXVlIGluc3RhbmNlLCB3ZSB3aWxsIHJlc29sdmUgdGhpcyB0eXBlIHVzaW5nIHJlZmxlY3Rpb24uCi0JICogImphdmEubGFuZy5TdHJpbmdbXVtdIiBjb21wb25lbnQgdHlwZSBpcyAiamF2YS5sYW5nLlN0cmluZ1tdIgotCSAqCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIGNvbXB1dGVDb21wb25lbnRUeXBlKCkgewotCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IGdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCS8vIFN0cmlwIHRoZSBsYXN0IFtdIGZvcm0gbXkgbmFtZSB0byBnZXQgbXkgY29tcG9uZW50IHR5cGUncyBuYW1lCi0JCWNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lLnN1YnN0cmluZygwLCBjb21wb25lbnROYW1lLmxlbmd0aCgpIC0gMik7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoY29tcG9uZW50TmFtZSwgdGhpcyk7Ci0JfQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHBlcmZvcm0gc29tZSBsYXp5IGluaXRpYWxpemF0aW9uCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGdldENvbXBvbmVudFR5cGUoKSB7Ci0JCS8vIElmIHdlIGRvIG5vdCBoYXZlIGEgY29tcG9uZW50IHR5cGUgc2V0LCBidXQgd2UgaGF2ZSBhIG5hbWUgKHdoaWNoIGNvbnRhaW5zIG91ciBjb21wb25lbnQgdHlwZSBuYW1lKQotCQkvLyB3ZSBjYW4gY29tcHV0ZSB0aGUgY29tcG9uZW50IHR5cGUuCi0JCWlmICgodGhpcy5nZXRDb21wb25lbnRUeXBlR2VuKCkgPT0gbnVsbCkgJiYgKHRoaXMuZ2V0TmFtZSgpICE9IG51bGwpKSB7Ci0JCQljb21wb25lbnRUeXBlID0gY29tcHV0ZUNvbXBvbmVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZ2V0Q29tcG9uZW50VHlwZUdlbigpOwotCX0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkuIAotCSAqIAotCSAqIElmIHRoaXMgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSwgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUgdGhlIG5lc3RlZCBhcnJheSB0eXBlLgotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRDb21wb25lbnRUeXBlQXNIZWxwZXIoKSB7Ci0JCXJldHVybiAoSmF2YUhlbHBlcnMpIGdldENvbXBvbmVudFR5cGUoKTsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBBcnJheSBUeXBlLgotCSAqIAotCSAqIEluIG9yZGVyIHRvIGVuc3VyZSBhIHVuaXF1ZSBpbnN0YW5jZSwgd2Ugd2lsbCByZXNvbHZlIHRoaXMgdHlwZSB1c2luZyByZWZsZWN0aW9uLiBJdCB0dXJucyBvdXQgdG8gYmUgbW9zdCBlZmZpY2llbnQgdG8ganVzdCBkbyB0aGlzIGJ5IHRyaW1taW5nIHRoZSBuYW1lLgotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRGaW5hbENvbXBvbmVudFR5cGUoKSB7Ci0JCWlmIChmaW5hbENvbXBvbmVudFR5cGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJLy8gU3RyaXAgYWxsIHRoZSBbXSBmcm9tIG15IG5hbWUgdG8gZ2V0IG15IEZJTkFMIGNvbXBvbmVudCB0eXBlJ3MgbmFtZQotCQkJY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUuc3Vic3RyaW5nKDAsIGNvbXBvbmVudE5hbWUuaW5kZXhPZigiWyIpKTsKLQkJCWZpbmFsQ29tcG9uZW50VHlwZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShjb21wb25lbnROYW1lLCB0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmluYWxDb21wb25lbnRUeXBlOwotCX0KLQkvKioKLQkgKiAoSmF2YUhlbHBlcnMpaXNBcnJheSAtIEFycmF5VHlwZXMgYXJlIGFycmF5cwotCSAqIE92ZXJyaWRlIGZyb20gSmF2YUNsYXNzLgotCSAqLyAgICAKLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogSXMgdGhpcyBhbiBhcnJheSBvZiBqYXZhIHByaW1pdGl2ZXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZUFycmF5KCkgewotCQlyZXR1cm4gZ2V0RmluYWxDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKTsKLQl9Ci0JLyoqCi0JICogU2V0IHRoZSBjb21wb25lbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlKEphdmFIZWxwZXJzIGhlbHBlckNvbXBvbmVudFR5cGUpIHsKLQkJc2V0Q29tcG9uZW50VHlwZSgoRUNsYXNzaWZpZXIpIGhlbHBlckNvbXBvbmVudFR5cGUpOwkJCi0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUzoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXJyYXlEaW1lbnNpb25zKCkpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldENvbXBvbmVudFR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUzoKLQkJCQlzZXRBcnJheURpbWVuc2lvbnMoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFOgotCQkJCXNldENvbXBvbmVudFR5cGUoKEVDbGFzc2lmaWVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TOgotCQkJCXNldEFycmF5RGltZW5zaW9ucyhBUlJBWV9ESU1FTlNJT05TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFOgotCQkJCXNldENvbXBvbmVudFR5cGUoKEVDbGFzc2lmaWVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TOgotCQkJCXJldHVybiBhcnJheURpbWVuc2lvbnMgIT0gQVJSQVlfRElNRU5TSU9OU19FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbXBvbmVudFR5cGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIGludCBnZXRBcnJheURpbWVuc2lvbnMoKSB7Ci0JCXJldHVybiBhcnJheURpbWVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJyYXlEaW1lbnNpb25zKGludCBuZXdBcnJheURpbWVuc2lvbnMpIHsKLQkJaW50IG9sZEFycmF5RGltZW5zaW9ucyA9IGFycmF5RGltZW5zaW9uczsKLQkJYXJyYXlEaW1lbnNpb25zID0gbmV3QXJyYXlEaW1lbnNpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TLCBvbGRBcnJheURpbWVuc2lvbnMsIGFycmF5RGltZW5zaW9ucykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhcnJheURpbWVuc2lvbnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFycmF5RGltZW5zaW9ucyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBnZXRDb21wb25lbnRUeXBlR2VuKCkgewotCQlpZiAoY29tcG9uZW50VHlwZSAhPSBudWxsICYmIGNvbXBvbmVudFR5cGUuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZENvbXBvbmVudFR5cGUgPSAoSW50ZXJuYWxFT2JqZWN0KWNvbXBvbmVudFR5cGU7Ci0JCQljb21wb25lbnRUeXBlID0gKEVDbGFzc2lmaWVyKWVSZXNvbHZlUHJveHkob2xkQ29tcG9uZW50VHlwZSk7Ci0JCQlpZiAoY29tcG9uZW50VHlwZSAhPSBvbGRDb21wb25lbnRUeXBlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEUsIG9sZENvbXBvbmVudFR5cGUsIGNvbXBvbmVudFR5cGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcG9uZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzaWZpZXIgYmFzaWNHZXRDb21wb25lbnRUeXBlKCkgewotCQlyZXR1cm4gY29tcG9uZW50VHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlKEVDbGFzc2lmaWVyIG5ld0NvbXBvbmVudFR5cGUpIHsKLQkJZmluYWxDb21wb25lbnRUeXBlID0gbnVsbDsKLQkJc2V0Q29tcG9uZW50VHlwZUdlbihuZXdDb21wb25lbnRUeXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZUdlbihFQ2xhc3NpZmllciBuZXdDb21wb25lbnRUeXBlKSB7Ci0JCUVDbGFzc2lmaWVyIG9sZENvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlOwotCQljb21wb25lbnRUeXBlID0gbmV3Q29tcG9uZW50VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEUsIG9sZENvbXBvbmVudFR5cGUsIGNvbXBvbmVudFR5cGUpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIFR5cGVLaW5kIGdldEtpbmQoKSB7Ci0JCS8vIE92ZXJyaWRlIHRvIGFsd2F5cyByZXR1cm4gdGhlIGNsYXNzIGlmIGZpbmFsIHR5cGUgaXMgdmFsaWQuCi0JCUphdmFIZWxwZXJzIGZ0ID0gZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0JCWlmICghZnQuaXNQcmltaXRpdmUoKSkgewotCQkJVHlwZUtpbmQgZnRLaW5kID0gKChKYXZhQ2xhc3MpIGZ0KS5nZXRLaW5kKCk7IAotCQkJcmV0dXJuICBmdEtpbmQgIT0gVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwgPyBUeXBlS2luZC5DTEFTU19MSVRFUkFMIDogVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUw7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIFR5cGVLaW5kLkNMQVNTX0xJVEVSQUw7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc1B1YmxpYygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaWMoKSB7Ci0JCS8vIE92ZXJyaWRlIHRvIHJldHVybiB0aGUga2luZCBvZiB0aGUgZmluYWwgY29tcG9uZW50LCBiZWNhdXNlIHRoYXQgZGV0ZXJtaW5lcyBpdC4KLQkJSmF2YUhlbHBlcnMgZnQgPSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJaWYgKCFmdC5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlyZXR1cm4gKChKYXZhQ2xhc3MpIGZ0KS5pc1B1YmxpYygpOwotCQl9IGVsc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQmxvY2tJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQmxvY2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzM0MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0Jsb2NrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmxvY2sgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZSgpIDxlbT5Tb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0VERUZBVUxUID0gbnVsbDsKLQotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc291cmNlID0gU09VUkNFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZW50cygpIDxlbT5Db250ZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbnRlbnRzID0gbnVsbDsKLQotCXByb3RlY3RlZCBCbG9ja0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBuZXdTb3VyY2UpIHsKLQkJU3RyaW5nIG9sZFNvdXJjZSA9IHNvdXJjZTsKLQkJc291cmNlID0gbmV3U291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5CTE9DS19fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5CTE9DS19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb250ZW50cygpIHsKLQkJaWYgKGNvbnRlbnRzID09IG51bGwpIHsKLQkJCWNvbnRlbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEJsb2NrLmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5CTE9DS19fQ09OVEVOVFMpOwotCQl9Ci0JCXJldHVybiBjb250ZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19DT05URU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX0NPTlRFTlRTOgotCQkJCXJldHVybiBnZXRDb250ZW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKFNPVVJDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19DT05URU5UUzoKLQkJCQlyZXR1cm4gY29udGVudHMgIT0gbnVsbCAmJiAhY29udGVudHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc291cmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzb3VyY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQ29tbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9Db21tZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWI2N2RmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9Db21tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotCi0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRJbXBsIGV4dGVuZHMgQmxvY2tJbXBsIGltcGxlbWVudHMgQ29tbWVudCB7Ci0KLQkKLQlwcm90ZWN0ZWQgQ29tbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuQ09NTUVOVDsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvRmllbGRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvRmllbGRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzllN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0ZpZWxkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FVHlwZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ3Jvc3NSZWZlcmVuY2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWZsZWN0aW9uQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZpZWxkSW1wbCBleHRlbmRzIEVUeXBlZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRmllbGQgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSU5BTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfRUZMQUcgPSAxIDw8IDEwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3RhdGljKCkgPGVtPlN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdGF0aWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTVEFUSUNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3RhdGljKCkgPGVtPlN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdGF0aWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNUQVRJQ19FRkxBRyA9IDEgPDwgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVZpc2liaWxpdHkoKSA8ZW0+SmF2YSBWaXNpYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhVmlzaWJpbGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhVmlzaWJpbGl0eUtpbmQgSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUID0gSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFWaXNpYmlsaXR5S2luZCBqYXZhVmlzaWJpbGl0eSA9IEpBVkFfVklTSUJJTElUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1RyYW5zaWVudCgpIDxlbT5UcmFuc2llbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVHJhbnNpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBTlNJRU5UX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1RyYW5zaWVudCgpIDxlbT5UcmFuc2llbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVHJhbnNpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUUkFOU0lFTlRfRUZMQUcgPSAxIDw8IDEyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVm9sYXRpbGUoKSA8ZW0+Vm9sYXRpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVm9sYXRpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBWT0xBVElMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNWb2xhdGlsZSgpIDxlbT5Wb2xhdGlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNWb2xhdGlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVk9MQVRJTEVfRUZMQUcgPSAxIDw8IDEzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbGl6ZXIoKSA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxpemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmxvY2sgaW5pdGlhbGl6ZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIEZpZWxkSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLkZJRUxEOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUZpZWxkUmVmIC0gcmV0dXJuIGEgSmF2YVVSTCByZWZlcmVuY2UgdG8gdGhlIG5hbWVkIGZpZWxkIGluIHRoZSBuYW1lZCBKYXZhIGNsYXNzIGluIHRoZSBmb3JtICJwYWNrYWdlLmNsYXNzX2ZpZWxkIgotCSAqIEBkZXByZWNhdGVkIG5vIHJlcGxhY2VtZW50IGF0IHRoaXMgdGltZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkIGNyZWF0ZUZpZWxkUmVmKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJRmllbGQgcmVmID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpZWxkKCk7Ci0JCVVSSSBjbGFzc1VSSSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlVVJJKGNsYXNzTmFtZSk7Ci0JCSgoSW50ZXJuYWxFT2JqZWN0KSByZWYpLmVTZXRQcm94eVVSSShVUkkuY3JlYXRlVVJJKGNsYXNzVVJJLnRvU3RyaW5nKCkrUmVmbGVjdGlvbkFkYXB0b3IuQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSK2ZpZWxkTmFtZSkpOwotCQlyZXR1cm4gcmVmOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY2xhc3MgdGhhdCB0aGlzIGZpZWxkIGlzIHdpdGhpbi4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFDbGFzcygpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlcyB0byBwZXJmb3JtIGxhenkgaW5pdGlhbGl6YXRpb25zL3JlZmxlY3Rpb24uCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGdldEVUeXBlKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBzdXBlci5nZXRFVHlwZSgpOwotCX0KLQotCXB1YmxpYyBCbG9jayBnZXRJbml0aWFsaXplcigpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gZ2V0SW5pdGlhbGl6ZXJHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc0ZpbmFsR2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzU3RhdGljR2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzVHJhbnNpZW50R2VuKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVm9sYXRpbGUoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzVm9sYXRpbGVHZW4oKTsKLQl9CQotCi0JcHVibGljIEphdmFIZWxwZXJzIGdldEphdmFUeXBlKCkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBnZXRFVHlwZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0SmF2YVZpc2liaWxpdHkoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGdldEphdmFWaXNpYmlsaXR5R2VuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBSZWFkQWRhcHRvciBnZXRSZWFkQWRhcHRlcigpIHsKLQkJcmV0dXJuIChSZWFkQWRhcHRvcikgRWNvcmVVdGlsLmdldFJlZ2lzdGVyZWRBZGFwdGVyKHRoaXMsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNSZWZsZWN0ZWQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKCFoYXNSZWZsZWN0ZWQpIHsKLQkJCQlyZWFkQWRhcHRvciA9IGdldFJlYWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRBZGFwdG9yICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2V0UmVmbGVjdGVkID0gcmVhZEFkYXB0b3IucmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJaGFzUmVmbGVjdGVkID0gc2V0UmVmbGVjdGVkOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBVc2VkIGJ5IHJlZmxlY3Rpb24gYWRhcHRlciB0byBjbGVhciB0aGUgcmVmbGVjdGlvbi4gVGhpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlcnMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlZmxlY3RlZChib29sZWFuIHJlZmxlY3RlZCkgewotCQloYXNSZWZsZWN0ZWQgPSByZWZsZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBmaWVsZCBhbiBhcnJheSB0eXBlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiBnZXRKYXZhVHlwZSgpLmlzQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRKYXZhQ2xhc3MoKEphdmFDbGFzcylvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SmF2YUNsYXNzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SW5pdGlhbGl6ZXIobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19GSU5BTDoKLQkJCQlyZXR1cm4gaXNGaW5hbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1NUQVRJQzoKLQkJCQlyZXR1cm4gaXNTdGF0aWMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJcmV0dXJuIGdldEphdmFWaXNpYmlsaXR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19UUkFOU0lFTlQ6Ci0JCQkJcmV0dXJuIGlzVHJhbnNpZW50KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVk9MQVRJTEU6Ci0JCQkJcmV0dXJuIGlzVm9sYXRpbGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSOgotCQkJCXJldHVybiBnZXRJbml0aWFsaXplcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19GSU5BTDoKLQkJCQlzZXRGaW5hbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19TVEFUSUM6Ci0JCQkJc2V0U3RhdGljKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfVklTSUJJTElUWToKLQkJCQlzZXRKYXZhVmlzaWJpbGl0eSgoSmF2YVZpc2liaWxpdHlLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19UUkFOU0lFTlQ6Ci0JCQkJc2V0VHJhbnNpZW50KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1ZPTEFUSUxFOgotCQkJCXNldFZvbGF0aWxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSOgotCQkJCXNldEluaXRpYWxpemVyKChCbG9jayluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0ZJTkFMOgotCQkJCXNldEZpbmFsKEZJTkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19TVEFUSUM6Ci0JCQkJc2V0U3RhdGljKFNUQVRJQ19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXNldEphdmFWaXNpYmlsaXR5KEpBVkFfVklTSUJJTElUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVFJBTlNJRU5UOgotCQkJCXNldFRyYW5zaWVudChUUkFOU0lFTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1ZPTEFUSUxFOgotCQkJCXNldFZvbGF0aWxlKFZPTEFUSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTOgotCQkJCXNldEphdmFDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSOgotCQkJCXNldEluaXRpYWxpemVyKChCbG9jayludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0ZJTkFMOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKSAhPSBGSU5BTF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1NUQVRJQzoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBTVEFUSUNfRUZMQUcpICE9IDApICE9IFNUQVRJQ19FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfVklTSUJJTElUWToKLQkJCQlyZXR1cm4gamF2YVZpc2liaWxpdHkgIT0gSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVFJBTlNJRU5UOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFRSQU5TSUVOVF9FRkxBRykgIT0gMCkgIT0gVFJBTlNJRU5UX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVk9MQVRJTEU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVk9MQVRJTEVfRUZMQUcpICE9IDApICE9IFZPTEFUSUxFX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCkgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSOgotCQkJCXJldHVybiBpbml0aWFsaXplciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIHByZXZlbnQgdGhlIHJlZmxlY3Rpb24gb2YgdGhlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBFTGlzdCBlQ29udGVudHMoKSB7Ci0JCUVMaXN0IHJlc3VsdHMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQkvL0ZCCi0JCS8vRkIgRUxpc3QgY29udGFpbm1lbnRzID0gZUNsYXNzKCkuZ2V0RUFsbENvbnRhaW5tZW50cygpOwotCQkvL0ZCIGlmIChjb250YWlubWVudHMgIT0gbnVsbCkgewotCQkvL0ZCIEl0ZXJhdG9yIGkgPSBjb250YWlubWVudHMuaXRlcmF0b3IoKTsKLQkJLy9GQiB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJLy9GQiBFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpLm5leHQoKTsKLQkJLy9GQiAvL0NoYW5nZSBmcm9tIHN1cGVyIHRvIHByaW1SZWZWYWx1ZQotCQkvL0ZCIE9iamVjdCB2YWx1ZSA9IHByaW1SZWZWYWx1ZShzZik7Ci0JCS8vRkIgLy9FbmRDaGFuZ2UKLQkJLy9GQiBpZiAodmFsdWUgIT0gbnVsbCkKLQkJLy9GQiBpZiAoc2YuaXNNYW55KCkpCi0JCS8vRkIgcmVzdWx0cy5hZGRBbGwoKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJLy9GQiBlbHNlCi0JCS8vRkIgcmVzdWx0cy5hZGQodmFsdWUpOwotCQkvL0ZCIH0KLQkJLy9GQiB9Ci0JCWlmIChnZXRJbml0aWFsaXplckdlbigpICE9IG51bGwpCi0JCQlyZXN1bHRzLmFkZChnZXRJbml0aWFsaXplckdlbigpKTsgLy9GQgotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiICIgKyAiKCIgKyBnZXROYW1lKCkgKyAiKSI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eUdlbigpIHsKLQkJcmV0dXJuIGphdmFWaXNpYmlsaXR5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmluYWxHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluYWwoYm9vbGVhbiBuZXdGaW5hbCkgewotCQlib29sZWFuIG9sZEZpbmFsID0gKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3RmluYWwpIGVGbGFncyB8PSBGSU5BTF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkZJTkFMX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRklOQUwsIG9sZEZpbmFsLCBuZXdGaW5hbCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGljR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0aWMoYm9vbGVhbiBuZXdTdGF0aWMpIHsKLQkJYm9vbGVhbiBvbGRTdGF0aWMgPSAoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3U3RhdGljKSBlRmxhZ3MgfD0gU1RBVElDX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+U1RBVElDX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fU1RBVElDLCBvbGRTdGF0aWMsIG5ld1N0YXRpYykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZCBuZXdKYXZhVmlzaWJpbGl0eSkgewotCQlKYXZhVmlzaWJpbGl0eUtpbmQgb2xkSmF2YVZpc2liaWxpdHkgPSBqYXZhVmlzaWJpbGl0eTsKLQkJamF2YVZpc2liaWxpdHkgPSBuZXdKYXZhVmlzaWJpbGl0eSA9PSBudWxsID8gSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUIDogbmV3SmF2YVZpc2liaWxpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX1ZJU0lCSUxJVFksIG9sZEphdmFWaXNpYmlsaXR5LCBqYXZhVmlzaWJpbGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50R2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFRSQU5TSUVOVF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2llbnQoYm9vbGVhbiBuZXdUcmFuc2llbnQpIHsKLQkJYm9vbGVhbiBvbGRUcmFuc2llbnQgPSAoZUZsYWdzICYgVFJBTlNJRU5UX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3VHJhbnNpZW50KSBlRmxhZ3MgfD0gVFJBTlNJRU5UX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+VFJBTlNJRU5UX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVFJBTlNJRU5ULCBvbGRUcmFuc2llbnQsIG5ld1RyYW5zaWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVm9sYXRpbGVHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgVk9MQVRJTEVfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vm9sYXRpbGUoYm9vbGVhbiBuZXdWb2xhdGlsZSkgewotCQlib29sZWFuIG9sZFZvbGF0aWxlID0gKGVGbGFncyAmIFZPTEFUSUxFX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3Vm9sYXRpbGUpIGVGbGFncyB8PSBWT0xBVElMRV9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflZPTEFUSUxFX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVk9MQVRJTEUsIG9sZFZvbGF0aWxlLCBuZXdWb2xhdGlsZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUykgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSmF2YUNsYXNzKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIG5ld0phdmFDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3SmF2YUNsYXNzLCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhKYXZhQ2xhc3MgbmV3SmF2YUNsYXNzKSB7Ci0JCWlmIChuZXdKYXZhQ2xhc3MgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1MgJiYgbmV3SmF2YUNsYXNzICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3SmF2YUNsYXNzKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3SmF2YUNsYXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0phdmFDbGFzcykuZUludmVyc2VBZGQodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SmF2YUNsYXNzKG5ld0phdmFDbGFzcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUywgbmV3SmF2YUNsYXNzLCBuZXdKYXZhQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQmxvY2sgZ2V0SW5pdGlhbGl6ZXJHZW4oKSB7Ci0JCXJldHVybiBpbml0aWFsaXplcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbml0aWFsaXplcihCbG9jayBuZXdJbml0aWFsaXplciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlCbG9jayBvbGRJbml0aWFsaXplciA9IGluaXRpYWxpemVyOwotCQlpbml0aWFsaXplciA9IG5ld0luaXRpYWxpemVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVIsIG9sZEluaXRpYWxpemVyLCBuZXdJbml0aWFsaXplcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6ZXIoQmxvY2sgbmV3SW5pdGlhbGl6ZXIpIHsKLQkJaWYgKG5ld0luaXRpYWxpemVyICE9IGluaXRpYWxpemVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbml0aWFsaXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbml0aWFsaXplcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW5pdGlhbGl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5pdGlhbGl6ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW5pdGlhbGl6ZXIobmV3SW5pdGlhbGl6ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSLCBuZXdJbml0aWFsaXplciwgbmV3SW5pdGlhbGl6ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZmluYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhdGljOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXZhVmlzaWJpbGl0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamF2YVZpc2liaWxpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRyYW5zaWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFRSQU5TSUVOVF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdm9sYXRpbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBWT0xBVElMRV9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCSAgQE92ZXJyaWRlCi0JICBwdWJsaWMgRUxpc3Q8RU9iamVjdD4gZUNyb3NzUmVmZXJlbmNlcygpCi0JICB7Ci0JICAgIGlmIChlQ3Jvc3NSZWZlcmVuY2VzID09IG51bGwpCi0JICAgIHsKLQkgICAgICBlQ3Jvc3NSZWZlcmVuY2VzID0gRUNyb3NzUmVmZXJlbmNlRUxpc3QuY3JlYXRlRUNyb3NzUmVmZXJlbmNlRUxpc3QodGhpcyk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGVDcm9zc1JlZmVyZW5jZXM7Ci0JICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0luaXRpYWxpemVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0luaXRpYWxpemVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODI0MjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9Jbml0aWFsaXplckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbGl6ZXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNTdGF0aWMoKSA8ZW0+SXMgU3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1NUQVRJQ19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1N0YXRpYyA9IElTX1NUQVRJQ19FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2UoKSA8ZW0+U291cmNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCbG9jayBzb3VyY2UgPSBudWxsOwotCi0JcHJvdGVjdGVkIEluaXRpYWxpemVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5MaXRlcmFscy5JTklUSUFMSVpFUjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1N0YXRpYygpIHsKLQkJcmV0dXJuIGlzU3RhdGljOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3RhdGljKEJvb2xlYW4gbmV3SXNTdGF0aWMpIHsKLQkJQm9vbGVhbiBvbGRJc1N0YXRpYyA9IGlzU3RhdGljOwotCQlpc1N0YXRpYyA9IG5ld0lzU3RhdGljOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSVNfU1RBVElDLCBvbGRJc1N0YXRpYywgaXNTdGF0aWMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEphdmFDbGFzcyllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SmF2YUNsYXNzKEphdmFDbGFzcyBuZXdKYXZhQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0phdmFDbGFzcywgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIG5ld0phdmFDbGFzcykgewotCQlpZiAobmV3SmF2YUNsYXNzICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTICYmIG5ld0phdmFDbGFzcyAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0phdmFDbGFzcykpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0phdmFDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEphdmFDbGFzcyhuZXdKYXZhQ2xhc3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MsIG5ld0phdmFDbGFzcywgbmV3SmF2YUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEJsb2NrIGdldFNvdXJjZSgpIHsKLQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU291cmNlID0gKEludGVybmFsRU9iamVjdClzb3VyY2U7Ci0JCQlzb3VyY2UgPSAoQmxvY2spZVJlc29sdmVQcm94eShvbGRTb3VyY2UpOwotCQkJaWYgKHNvdXJjZSAhPSBvbGRTb3VyY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJsb2NrIGJhc2ljR2V0U291cmNlKCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShCbG9jayBuZXdTb3VyY2UpIHsKLQkJQmxvY2sgb2xkU291cmNlID0gc291cmNlOwotCQlzb3VyY2UgPSBuZXdTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19TT1VSQ0UsIG9sZFNvdXJjZSwgc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SmF2YUNsYXNzKChKYXZhQ2xhc3Mpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBiYXNpY1NldEphdmFDbGFzcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTklUSUFMSVpFUlMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0lTX1NUQVRJQzoKLQkJCQlyZXR1cm4gZ2V0SXNTdGF0aWMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEphdmFDbGFzcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0U291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0lTX1NUQVRJQzoKLQkJCQlzZXRJc1N0YXRpYygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQlzZXRKYXZhQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoQmxvY2spbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19JU19TVEFUSUM6Ci0JCQkJc2V0SXNTdGF0aWMoSVNfU1RBVElDX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTOgotCQkJCXNldEphdmFDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKEJsb2NrKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSVNfU1RBVElDOgotCQkJCXJldHVybiBJU19TVEFUSUNfRURFRkFVTFQgPT0gbnVsbCA/IGlzU3RhdGljICE9IG51bGwgOiAhSVNfU1RBVElDX0VERUZBVUxULmVxdWFscyhpc1N0YXRpYyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFOgotCQkJCXJldHVybiBzb3VyY2UgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzU3RhdGljOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpc1N0YXRpYyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhQ2xhc3NJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUNsYXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWUxYjI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhQ2xhc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FQ29sbGVjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5iZWFuaW5mby5JSW50cm9zcGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkluc3RhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjaXNQdWJsaWMgPGVtPlB1YmxpYzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMgPGVtPkltcGxlbWVudHMgSW50ZXJmYWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldENsYXNzSW1wb3J0IDxlbT5DbGFzcyBJbXBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRQYWNrYWdlSW1wb3J0cyA8ZW0+UGFja2FnZSBJbXBvcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0RmllbGRzIDxlbT5GaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRNZXRob2RzIDxlbT5NZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0SW5pdGlhbGl6ZXJzIDxlbT5Jbml0aWFsaXplcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXREZWNsYXJlZENsYXNzZXMgPGVtPkRlY2xhcmVkIENsYXNzZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXREZWNsYXJpbmdDbGFzcyA8ZW0+RGVjbGFyaW5nIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0SmF2YVBhY2thZ2UgPGVtPkphdmEgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldEV2ZW50cyA8ZW0+RXZlbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0QWxsRXZlbnRzIDxlbT5BbGwgRXZlbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUNsYXNzSW1wbCBleHRlbmRzIEVDbGFzc0ltcGwgaW1wbGVtZW50cyBKYXZhQ2xhc3MgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtpbmQoKSA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUeXBlS2luZCBLSU5EX0VERUZBVUxUID0gVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVHlwZUtpbmQga2luZCA9IEtJTkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQdWJsaWMoKSA8ZW0+UHVibGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1B1YmxpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBVQkxJQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQdWJsaWMoKSA8ZW0+UHVibGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1B1YmxpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDX0VGTEFHID0gMSA8PCAxMDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklOQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTkFMX0VGTEFHID0gMSA8PCAxMTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGxlbWVudHNJbnRlcmZhY2VzKCkgPGVtPkltcGxlbWVudHMgSW50ZXJmYWNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGltcGxlbWVudHNJbnRlcmZhY2VzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzSW1wb3J0KCkgPGVtPkNsYXNzIEltcG9ydDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc0ltcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNsYXNzSW1wb3J0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2VJbXBvcnRzKCkgPGVtPlBhY2thZ2UgSW1wb3J0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWNrYWdlSW1wb3J0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBhY2thZ2VJbXBvcnRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkcygpIDxlbT5GaWVsZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZmllbGRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZHMoKSA8ZW0+TWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsaXplcnMoKSA8ZW0+SW5pdGlhbGl6ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxpemVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRpYWxpemVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWNsYXJlZENsYXNzZXMoKSA8ZW0+RGVjbGFyZWQgQ2xhc3NlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWNsYXJlZENsYXNzZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZWNsYXJlZENsYXNzZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVjbGFyaW5nQ2xhc3MoKSA8ZW0+RGVjbGFyaW5nIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWNsYXJpbmdDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBkZWNsYXJpbmdDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFdmVudHMoKSA8ZW0+RXZlbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV2ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV2ZW50cyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIEVMaXN0IGdldEVBbm5vdGF0aW9uc0ludGVybmFsKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5MaXRlcmFscy5KQVZBX0NMQVNTOwotCX0KLQotCS8qKgotCSAqIFByb3RlY3RlZCBoZWxwZXIgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0RmllbGRzRXh0ZW5kZWQoTGlzdCBmaWVsZHMpIHsKLQkJZmllbGRzLmFkZEFsbChnZXRGaWVsZHMoKSk7Ci0JCUl0ZXJhdG9yIGl0OwotCQlpdCA9IGdldEV4dGVuZGVkTG9va3VwSXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkKLQkJCSgoSmF2YUNsYXNzSW1wbCkgaXQubmV4dCgpKS5jb2xsZWN0RmllbGRzRXh0ZW5kZWQoZmllbGRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TWV0aG9kc0V4dGVuZGVkKE1hcCBtZXRob2RzLCBib29sZWFuIG9ubHlQdWJsaWMsIExpc3QgZXhjbHVkZWRDbGFzc2VzLCBMaXN0IGV4Y2x1ZGVkTWV0aG9kcykgewotCQlJdGVyYXRvciBpdDEsIGl0MjsKLQkJLy8gY29weSBvdmVyIHRoZSBjb250ZW50cwotCQlMaXN0IGV4dGVuZGVkTG9va3VwQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZXh0ZW5kZWRMb29rdXBFTGlzdCA9IG51bGw7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJZXh0ZW5kZWRMb29rdXBFTGlzdCA9IGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCWVsc2UKLQkJCWV4dGVuZGVkTG9va3VwRUxpc3QgPSBnZXRFU3VwZXJUeXBlcygpOwotCQlleHRlbmRlZExvb2t1cENsYXNzZXMuYWRkQWxsKGV4dGVuZGVkTG9va3VwRUxpc3QpOwotCQlpdDIgPSBleHRlbmRlZExvb2t1cENsYXNzZXMuaXRlcmF0b3IoKTsKLQkJSmF2YUNsYXNzSW1wbCBqYXZhQ2xhc3M7Ci0JCXdoaWxlIChpdDIuaGFzTmV4dCgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzSW1wbCkgaXQyLm5leHQoKTsKLQkJCWlmICghZXhjbHVkZWRDbGFzc2VzLmNvbnRhaW5zKGphdmFDbGFzcykpCi0JCQkJamF2YUNsYXNzLmNvbGxlY3RNZXRob2RzRXh0ZW5kZWQobWV0aG9kcywgb25seVB1YmxpYywgZXhjbHVkZWRDbGFzc2VzLCBleGNsdWRlZE1ldGhvZHMpOwotCQl9Ci0JCQotCQlMaXN0IGFsbE1ldGhvZHMgPSBudWxsOwotCQlpZihvbmx5UHVibGljKXsKLQkJCWFsbE1ldGhvZHMgPSBnZXRQdWJsaWNNZXRob2RzKCk7Ci0JCX0gZWxzZXsKLQkJCWFsbE1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzeW5jaHJvbml6ZWQoZ2V0TWV0aG9kcygpKXsKLQkJCQlhbGxNZXRob2RzLmFkZEFsbChnZXRNZXRob2RzKCkpOwotCQkJfQotCQl9Ci0JCWl0MSA9IGFsbE1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJTWV0aG9kIG5leHRNZXRob2Q7Ci0JCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQluZXh0TWV0aG9kID0gKE1ldGhvZCkgaXQxLm5leHQoKTsKLQkJCWlmICghZXhjbHVkZWRNZXRob2RzLmNvbnRhaW5zKG5leHRNZXRob2QpKQotCQkJCW1ldGhvZHMucHV0KG5leHRNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLCBuZXh0TWV0aG9kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUNsYXNzUmVmIC0gcmV0dXJuIGEgSmF2YVVSTCByZWZlcmVuY2UgdG8gdGhlIG5hbWVkIEphdmEgY2xhc3MKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZUNsYXNzUmVmKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIGZpbmRDbGFzc01ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAobWV0aG9kICE9IG51bGwpCi0JCQlyZXR1cm4gbWV0aG9kOwotCQllbHNlIHsKLQkJCUphdmFDbGFzc0ltcGwgbXlTdXBlcjsKLQkJCW15U3VwZXIgPSAoSmF2YUNsYXNzSW1wbCkgZ2V0U3VwZXJ0eXBlKCk7Ci0JCQlpZiAobXlTdXBlciAhPSBudWxsKQotCQkJCXJldHVybiBteVN1cGVyLmZpbmRDbGFzc01ldGhvZEV4dGVuZGVkKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIGZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcykgewotCQlNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKQotCQkJcmV0dXJuIG1ldGhvZDsKLQkJZWxzZSB7Ci0JCQlKYXZhQ2xhc3NJbXBsIHN1cGVySW50ZXJmYWNlOwotCQkJTGlzdCBsaXN0ID0gZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCXN1cGVySW50ZXJmYWNlID0gKEphdmFDbGFzc0ltcGwpIGxpc3QuZ2V0KGkpOwotCQkJCW1ldGhvZCA9IHN1cGVySW50ZXJmYWNlLmZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCQkJaWYgKG1ldGhvZCAhPSBudWxsKQotCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCBJZiBhbnlvbmUgaXMgcmVmZXJlbmNpbmcgdGhpcywgcGxlYXNlIHVzZSBnZXRFQWxsU3VwZXJUeXBlcygpIGluc3RlYWQuIFRoaXMgd2FzIHBsYWNlZCBoZXJlIGFuZCBtaXNzcGVsbGVkIGJ5IG1pc3Rha2UuCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFsbFN1cGVydHlwZXMoKSB7Ci0JCWdldEVTdXBlclR5cGVzKCk7IC8vRm9yY2UgcmVmbGVjdGlvbiwgaWYgbmVlZGVkLCBiZWZvcmUgZ2V0dGluZyBhbGwgc3VwZXJ0eXBlcy4KLQkJcmV0dXJuIHN1cGVyLmdldEVBbGxTdXBlclR5cGVzKCk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGVzIHRvIHBlcmZvcm0gcmVmbGVjdGlvbiBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q2xhc3NJbXBvcnQoKSB7Ci0JCXJlZmxlY3RCYXNlKCk7Ci0JCXJldHVybiBnZXRDbGFzc0ltcG9ydEdlbigpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFQWxsT3BlcmF0aW9ucygpIHsKLQkJSUludHJvc3BlY3Rpb25BZGFwdGVyIGlhID0gZ2V0SW50cm9zcGVjdGlvbkFkYXB0ZXIoKTsKLQkJaWYgKGlhID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0RUFsbE9wZXJhdGlvbnMoKTsgLy8gTm8gaW50cm9zcGVjdGlvbiwgZG8gbm9ybWFsLgotCQlpZiAoZUFsbE9wZXJhdGlvbnMgPT0gbnVsbCkKLQkJCWVBbGxPcGVyYXRpb25zID0gaWEuZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJcmV0dXJuIGVBbGxPcGVyYXRpb25zOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IG90aGVycy4gSXQgaXMgaGVyZSBzbyB0aGF0IEJlYW5JbmZvIGFkYXB0ZXIgY2FuIGFjY2VzcwotCSAqIHVuLWludHJvc3BlY3RlZCBhbGwgb3BlcmF0aW9ucy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEVMaXN0IHByaW1HZXRFQWxsT3BlcmF0aW9ucygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEVBbGxPcGVyYXRpb25zKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEVPcGVyYXRpb25zKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgYWRhcHRlciA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRFT3BlcmF0aW9ucygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RU9wZXJhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBvdGhlcnMuIEl0IGlzIGhlcmUgc28gdGhhdCBCZWFuSW5mbyBhZGFwdGVycyBjYW4gZ28gdG8KLQkgKiB0aGUgbm9uLWludHJvc3BlY3RlZCBvcGVyYXRpb25zLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnNJbnRlcm5hbCgpIHsKLQkJLy8gQW4gaW50ZXJuYWwgbWV0aG9kIGZvciByZXR1cm5pbmcgYWN0dWFsIHdvIGZsdWZmaW5nIHVwLgotCQlyZXR1cm4gc3VwZXIuZ2V0RU9wZXJhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RUFubm90YXRpb25zKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgYWRhcHRlciA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLmludHJvc3BlY3RJZk5lY2Vzc2FyeSgpOyAvLyBUbyBjYXVzZSBpbnRyb3NwZWN0aW9uIHNvIHRoZSBhcHByb3ByaWF0ZSBkZWNvcmF0b3IgaXMgYWRkZWQuCi0JCXJldHVybiBzdXBlci5nZXRFQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpIHsKLQkJSUludHJvc3BlY3Rpb25BZGFwdGVyIGFkYXB0ZXIgPSBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFU3RydWN0dXJhbEZlYXR1cmVzSW50ZXJuYWwoKSB7Ci0JCS8vIEFuIGludGVybmFsIG1ldGhvZCBmb3IgcmV0dXJuaW5nIGFjdHVhbCB3byBmbHVmZmluZyB1cC4KLQkJcmV0dXJuIHN1cGVyLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb24gdGhlIGltcGxlbW50c0luZmVyZmFjZSBMaXN0IGlmIHRoaXMgaXMgYW4gaW50ZXJmYWNlIGNsYXNzIG9yIG9uIHRoZSBzdXBlciBMaXN0IGlmIGl0IGlzIGEgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldEV4dGVuZGVkTG9va3VwSXRlcmF0b3IoKSB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuaXRlcmF0b3IoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldEVTdXBlclR5cGVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkKFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJamF2YS51dGlsLkxpc3QgZmllbGRzID0gZ2V0RmllbGRzKCk7Ci0JCUZpZWxkIGZpZWxkOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotCQkJZmllbGQgPSAoRmllbGQpIGZpZWxkcy5nZXQoaSk7Ci0JCQlpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhmaWVsZE5hbWUpKQotCQkJCXJldHVybiBmaWVsZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUgZnJvbSB0aGlzIEphdmFDbGFzcyBvciBhbnkgc3VwZXJ0eXBlcy4KLQkgKiAKLQkgKiBSZXR1cm4gbnVsbCBpZiBhIEZpZWxkIG5hbWVkIGZpZWxkTmFtZSBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkRXh0ZW5kZWQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlGaWVsZCBmaWVsZCA9IGdldEZpZWxkTmFtZWQoZmllbGROYW1lKTsKLQkJaWYgKGZpZWxkICE9IG51bGwpCi0JCQlyZXR1cm4gZmllbGQ7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RXh0ZW5kZWRMb29rdXBJdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlGaWVsZCByZXN1bHQgPSAoKEphdmFDbGFzcykgaXQubmV4dCgpKS5nZXRGaWVsZEV4dGVuZGVkKGZpZWxkTmFtZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkTmFtZWQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gZ2V0RmllbGQoZmllbGROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RmllbGRzKCkgewotCQlyZWZsZWN0RmllbGRzKCk7Ci0JCXJldHVybiBnZXRGaWVsZHNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIGZpZWxkcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWVsZHNFeHRlbmRlZCgpIHsKLQkJTGlzdCBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNvbGxlY3RGaWVsZHNFeHRlbmRlZChmaWVsZHMpOwotCQlyZXR1cm4gZmllbGRzOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIEludHJvc3BlY3Rpb25BZGFwdG9yIHdoaWNoIGNhbiBpbnRyb3NwZWN0IG91ciBKYXZhIHByb3BlcnRpZXMKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIElJbnRyb3NwZWN0aW9uQWRhcHRlciBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpIHsKLQkJLy8gTmVlZCB0byBzeW5jIHRoaXMgYmVjYXVzZSB3ZSBhcmUgbm93IGluIG11bHRpLXRocmVhZCBlbnYuCi0JCXJldHVybiAoSUludHJvc3BlY3Rpb25BZGFwdGVyKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFOYW1lKCkgewotCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzI2dldFNpbXBsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpIHsKLQkJcmV0dXJuIHByaW1HZXROYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7Ci0JfQotCS8qKgotCSAqIGdldEphdmFQYWNrYWdlLiBUaGlzIGlzIGEgZGVyaXZlZCByZWxhdGlvbnNoaXAsIHNvIHdlIG11c3QgaW1wbGVtZW50IGl0IGhlcmUgdG8gZ2V0IHRoZSBFUGFja2FnZSB0aGF0IHRoaXMgb2JqZWN0IGlzIGNvbnRhaW5lZCBpbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgZ2V0SmF2YVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSmF2YVBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGdldE1ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMsIExpc3QgbWV0aG9kTGlzdCkgewotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCU1ldGhvZCBtZXRob2Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kTGlzdC5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kTGlzdC5nZXQoaSk7Ci0JCQlKYXZhUGFyYW1ldGVyW10gcGFyYW1zOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcGFyYW1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCWlmIChwYXJhbXMubGVuZ3RoID09IHBhcmFtZXRlclR5cGVzLnNpemUoKSkgewotCQkJCQlmb3VuZCA9IHRydWU7IC8vTWF5YmU7IHdlIG5lZWQgbW9yZSBpbmZvCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkvL2lmIGFueSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgZG9lc24ndCBtYXRjaCB0aGVuIGZsaXAgYmFjayB0byBmYWxzZQotCQkJCQkJSmF2YUhlbHBlcnMgamggPSAoSmF2YUhlbHBlcnMpIHBhcmFtc1tqXS5nZXRFVHlwZSgpOwotCQkJCQkJaWYgKCFqaC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHBhcmFtZXRlclR5cGVzLmdldChqKSkpIHsKLQkJCQkJCQlmb3VuZCA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfSAvLyBlbmQgaWYgcGFyYW1zIGVxdWFsCi0JCQkJCX0gLy8gZW5kIGNvbXBhcmUgYWxsIHBhcmFtcwotCQkJCQlpZiAoZm91bmQpIC8vc2hvcnQgY2lyY3VpdCBvdXQgb2YgdGhpcyBsb29wIGFuZCByZXR1cm4gdGhlIHdpbm5lcgotCQkJCQkJcmV0dXJuIG1ldGhvZDsKLQkJCQl9IC8vIGVuZCBjb21wYXJlIGxlbmd0aHMKLQkJCX0gLy8gZW5kIGNvbXBhcmUgbmFtZXMKLQkJfSAvLyBlbmQgbG9vcCB0aHJvdWdoIGFsbCBtZXRob2RMaXN0Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIExpc3Qgb2YgU3RyaW5ncyB0aGF0IHJlcHJlc2VudCBNZXRob2RFbGVtZW50IHNpZ25hdHVyZXMgZnJvbSBtb3N0IGdlbmVyYWwgdG8gbW9zdCBzcGVjaWZpYy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpIHsKLQkJTGlzdCBtZXRob2RzLCBzaWduYXR1cmVzLCBzYW1lTmFtZXM7Ci0JCW1ldGhvZHMgPSBnZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJc2FtZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzaWduYXR1cmVzID0gbmV3IEFycmF5TGlzdChtZXRob2RzLnNpemUoKSArIDEpOwotCQlzaWduYXR1cmVzLmFkZChERUZBVUxUX01FVEhPRF9OQU1FKTsKLQkJSXRlcmF0b3IgaXQgPSBtZXRob2RzLml0ZXJhdG9yKCk7Ci0JCU1ldGhvZCBhTWV0aG9kOwotCQlTdHJpbmcgbWV0aG9kTmFtZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYU1ldGhvZCA9IChNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW1ldGhvZE5hbWUgPSBhTWV0aG9kLmdldE5hbWUoKTsKLQkJCWlmIChzYW1lTmFtZXMuY29udGFpbnMobWV0aG9kTmFtZSkpIHsKLQkJCQlpZiAoIXNpZ25hdHVyZXMuY29udGFpbnMobWV0aG9kTmFtZSkpCi0JCQkJCXNpZ25hdHVyZXMuYWRkKG1ldGhvZE5hbWUpOwotCQkJfSBlbHNlCi0JCQkJc2FtZU5hbWVzLmFkZChtZXRob2ROYW1lKTsKLQkJCXNpZ25hdHVyZXMuYWRkKGFNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHNpZ25hdHVyZXMpOwotCQlyZXR1cm4gc2lnbmF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIGZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBmaW5kQ2xhc3NNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZHMoKSB7Ci0JCXJlZmxlY3RNZXRob2RzKCk7Ci0JCXJldHVybiBnZXRNZXRob2RzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZHNFeHRlbmRlZCgpIHsKLQkJTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHMsIGZhbHNlLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QobWV0aG9kcy52YWx1ZXMoKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIGdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKExpc3QsIExpc3QpIG9uIEphdmFDbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RzRXh0ZW5kZWRXaXRoRmlsdGVycyhMaXN0IGV4Y2x1ZGVkQ2xhc3NlcywgTGlzdCBleGNsdWRlZE1ldGhvZHMpIHsKLQkJTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHMsIGZhbHNlLCBleGNsdWRlZENsYXNzZXMsIGV4Y2x1ZGVkTWV0aG9kcyk7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KG1ldGhvZHMudmFsdWVzKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IHRoaXMucHJpbUdldE5hbWUoKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIGVJc1Byb3h5KCkpIHsKLQkJCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuZ2V0VHlwZU5hbWUoZVByb3h5VVJJKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RzIHRoYXQgYmVnaW5zIHdpdGggQGFNZXRob2ROYW1lUHJlZml4IGFuZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEBleGNsdWRlZE5hbWVzIGxpc3QuIElmIEBhTWV0aG9kTmFtZVByZWZpeCBpcyBudWxsLCBhbGwgbWV0aG9kcyB3aWxsIGJlIHJldHVybmVkLgotCSAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRPbmx5U3BlY2lmaWNNZXRob2RzKFN0cmluZyBhTWV0aG9kTmFtZVByZWZpeCwgTGlzdCBleGNsdWRlZE5hbWVzKSB7Ci0JCUxpc3QgbWV0aG9kcywgc3BlY2lmaWM7Ci0JCW1ldGhvZHMgPSBnZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJc3BlY2lmaWMgPSBuZXcgQXJyYXlMaXN0KG1ldGhvZHMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXQgPSBtZXRob2RzLml0ZXJhdG9yKCk7Ci0JCU1ldGhvZCBhTWV0aG9kOwotCQlTdHJpbmcgbWV0aG9kTmFtZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYU1ldGhvZCA9IChNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW1ldGhvZE5hbWUgPSBhTWV0aG9kLmdldE5hbWUoKTsKLQkJCWlmIChhTWV0aG9kTmFtZVByZWZpeCAhPSBudWxsICYmIG1ldGhvZE5hbWUuc3RhcnRzV2l0aChhTWV0aG9kTmFtZVByZWZpeCkgJiYgZXhjbHVkZWROYW1lcyAhPSBudWxsICYmICFleGNsdWRlZE5hbWVzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKQotCQkJCXNwZWNpZmljLmFkZChhTWV0aG9kKTsKLQkJfQotCQlyZXR1cm4gc3BlY2lmaWM7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldFBhY2thZ2VJbXBvcnRzKCkgewotCQlyZWZsZWN0QmFzZSgpOwotCQlyZXR1cm4gZ2V0UGFja2FnZUltcG9ydHNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcmltaXRpdmUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFEYXRhVHlwZSBnZXRQcmltaXRpdmUoKSB7Ci0JCVN0cmluZyBwcmltaXRpdmVOYW1lID0gZ2V0UHJpbWl0aXZlTmFtZSgpOwotCQlpZiAocHJpbWl0aXZlTmFtZSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSBlUmVzb3VyY2UoKTsKLQkJCXJldHVybiAoSmF2YURhdGFUeXBlKSBKYXZhQ2xhc3NJbXBsLnJlZmxlY3QocHJpbWl0aXZlTmFtZSwgcmVzLmdldFJlc291cmNlU2V0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyNnZXRQcmltaXRpdmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmltaXRpdmVJRCgpIHsKLQkJU3RyaW5nIG15TmFtZSA9IGdldFF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoSU5URUdFUl9OQU1FKSkKLQkJCXJldHVybiBQUklNX0lOVEVHRVJfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEJPT0xFQU5fTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9CT09MRUFOX0lEOwotCQlpZiAobXlOYW1lLmVxdWFscyhCWVRFX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQllURV9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoU0hPUlRfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9TSE9SVF9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoTE9OR19OQU1FKSkKLQkJCXJldHVybiBQUklNX0xPTkdfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEZMT0FUX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fRkxPQVRfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKERPVUJMRV9OQU1FKSkKLQkJCXJldHVybiBQUklNX0RPVUJMRV9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoQ0hBUkFDVEVSX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQ0hBUkFDVEVSX0lEOwotCQlyZXR1cm4gUFJJTV9OT1RfSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltaXRpdmUgbmFtZSBmb3IgdGhpcyB0eXBlIGlmIG9uZSBleGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmltaXRpdmVOYW1lKCkgewotCQlTdHJpbmcgbXlOYW1lID0gZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQlpZiAobXlOYW1lLmVxdWFscyhJTlRFR0VSX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fSU5URUdFUl9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhCT09MRUFOX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQk9PTEVBTl9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhCWVRFX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQllURV9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhTSE9SVF9OQU1FKSkKLQkJCXJldHVybiBQUklNX1NIT1JUX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKExPTkdfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9MT05HX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEZMT0FUX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fRkxPQVRfTkFNRTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoRE9VQkxFX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fRE9VQkxFX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKENIQVJBQ1RFUl9OQU1FKSkKLQkJCXJldHVybiBQUklNX0NIQVJBQ1RFUl9OQU1FOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseSBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiBJdAotCSAqIHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRQdWJsaWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgZ2V0UHVibGljTWV0aG9kcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseSBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiBJdAotCSAqIHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRQdWJsaWNNZXRob2RFeHRlbmRlZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpdCB3aWxsIG5vdCBnbyB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzKCkgewotCQlMaXN0IHB1YmxpY01ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGhlTWV0aG9kcyA9IGdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVNZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgbSA9IChNZXRob2QpIHRoZU1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCA9PSBtLmdldEphdmFWaXNpYmlsaXR5KCkpCi0JCQkJcHVibGljTWV0aG9kcy5hZGQobSk7Ci0JCX0KLQkJcmV0dXJuIHB1YmxpY01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBwdWJsaWMgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKSB7Ci0JCU1hcCBtZXRob2RzID0gbmV3IEhhc2hNYXAoKTsKLQkJY29sbGVjdE1ldGhvZHNFeHRlbmRlZChtZXRob2RzLCB0cnVlLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QobWV0aG9kcy52YWx1ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcywgaGF2aW5nIGEgbmFtZSBlcXVhbCB0byB0aGF0IG9mIHRoZSBwYXJhbWV0ZXIuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdCBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRoZU1ldGhvZHMgPSBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVNZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgbSA9IChNZXRob2QpIHRoZU1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG0uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlwdWJsaWNNZXRob2RzLmFkZChtKTsKLQkJfQotCQlyZXR1cm4gcHVibGljTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLCBoYXZpbmcgYSBuYW1lIGVxdWFsIHRvIHRoYXQgb2YgdGhlIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdCBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRoZU1ldGhvZHMgPSBnZXRQdWJsaWNNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlTWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kIG0gPSAoTWV0aG9kKSB0aGVNZXRob2RzLmdldChpKTsKLQkJCWlmIChtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcHVibGljTWV0aG9kcy5hZGQobSk7Ci0JCX0KLQkJcmV0dXJuIHB1YmxpY01ldGhvZHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGVJc1Byb3h5KCkpIHsKLQkJCXJlc3VsdCA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5nZXRGdWxsVHlwZU5hbWUoZVByb3h5VVJJKCkpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gcHJpbUdldFF1YWxpZmllZE5hbWUoKTsKLQkJfQotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZSgnJCcsICcuJyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCBieSBwZW9wbGUgdGhhdCBuZWVkIHRvIGdldCB0aGUgcXVhbGlmaWVkIG5hbWUgdXNlZCBmb3IgcmVmbGVjdGlvbi4gVHlwaWNhbGx5IGJlYW4gaW5mbyB3b3VsZCBuZWVkIHRvIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSB7Ci0JCXJldHVybiBwcmltR2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlYWRBZGFwdG9yIHdoaWNoIGNhbiByZWZsZWN0IG91ciBKYXZhIHByb3BlcnRpZXMKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlYWRBZGFwdG9yIGdldFJlYWRBZGFwdGVyKCkgewotCQkvLyBOZWVkIHRvIHN5bmMgYmVjYXVzZSBub3cgaW4gYSBtdWx0aS10aHJlYWQgZW52LgotCQlyZXR1cm4gKFJlYWRBZGFwdG9yKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfUkVGTEVDVEVEID0gMHgwLCBSRUZMRUNURURfQkFTRSA9IDB4MSwgUkVGTEVDVEVEX01FVEhPRFMgPSAweDIsIFJFRkxFQ1RFRF9GSUVMRFMgPSAweDQ7Ci0KLQlwcm90ZWN0ZWQgaW50IHJlZmxlY3Rpb25TdGF0dXMgPSBOT1RfUkVGTEVDVEVEOwotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdEJhc2UoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKChyZWZsZWN0aW9uU3RhdHVzICYgUkVGTEVDVEVEX0JBU0UpID09IDApIHsKLQkJCQlyZWFkQWRhcHRvciA9IGdldFJlYWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRBZGFwdG9yICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2V0UmVmbGVjdGVkID0gcmVhZEFkYXB0b3IucmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSBSRUZMRUNURURfQkFTRTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RGaWVsZHMoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKChyZWZsZWN0aW9uU3RhdHVzICYgUkVGTEVDVEVEX0ZJRUxEUykgPT0gMCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSAoKElKYXZhQ2xhc3NBZGFwdG9yKSByZWFkQWRhcHRvcikucmVmbGVjdEZpZWxkc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSAoUkVGTEVDVEVEX0ZJRUxEUyB8IFJFRkxFQ1RFRF9CQVNFKTsgLy8gV2UgY2FuIGJlIGNlcnRhaW4gYmFzZSB3aWxsIGJlIGRvbmUgYnkgcmVmbGVjdCBmaWVsZHMgaWYgbm90IGFscmVhZHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkgLy8gZG9uZS4KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RNZXRob2RzKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICgocmVmbGVjdGlvblN0YXR1cyAmIFJFRkxFQ1RFRF9NRVRIT0RTKSA9PSAwKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9ICgoSUphdmFDbGFzc0FkYXB0b3IpIHJlYWRBZGFwdG9yKS5yZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSAoUkVGTEVDVEVEX01FVEhPRFMgfCBSRUZMRUNURURfQkFTRSk7IC8vIFdlIGNhbiBiZSBjZXJ0YWluIGJhc2Ugd2lsbCBiZSBkb25lIGJ5IHJlZmxlY3QgZmllbGRzIGlmIG5vdCBhbHJlYWR5Ci0JCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBkb25lLgotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEphdmFDbGFzcyBnZXRTdXBlcnR5cGUoKSB7Ci0JCS8vIElmIHRoaXMgaXMgYW4gaW50ZXJmYWNlLCB0aGVyZSBpcyBubyBzdXBlcnR5cGUuIEhvd2V2ZXIsIHRoZSBlU3VwZXJUeXBlcyBJUyBmaWxsZWQgaW4gd2l0aCBhbnkgaW50ZXJmYWNlIHRoYXQgdGhpcyBleHRlbmRzLiAKLQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBsaXN0ID0gZ2V0RVN1cGVyVHlwZXMoKTsKLQkJcmV0dXJuICghbGlzdC5pc0VtcHR5KCkpID8gKEphdmFDbGFzcykgbGlzdC5nZXQoMCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB3aGV0aGVyIHRoZSByZWNlaXZlciBpbXBsZW1lbnRzIHRoZSBwYXNzZWQgaW50ZXJmYWNlIChvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMpLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGltcGxlbWVudHNJbnRlcmZhY2UoSmF2YUNsYXNzIGludGVyZmFjZVR5cGUpIHsKLQkJaWYgKHRoaXMgPT0gaW50ZXJmYWNlVHlwZSkKLQkJCXJldHVybiB0cnVlOwotCQlFTGlzdCBpbXBsZW1lbnRlZCA9IGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCUphdmFDbGFzcyBhbkludGVyZmFjZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBsZW1lbnRlZC5zaXplKCk7IGkrKykgewotCQkJYW5JbnRlcmZhY2UgPSAoSmF2YUNsYXNzKSBpbXBsZW1lbnRlZC5nZXQoaSk7Ci0JCQlpZiAoYW5JbnRlcmZhY2UuaW1wbGVtZW50c0ludGVyZmFjZShpbnRlcmZhY2VUeXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZ2V0U3VwZXJ0eXBlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRTdXBlcnR5cGUoKS5pbXBsZW1lbnRzSW50ZXJmYWNlKGludGVyZmFjZVR5cGUpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHNob3dpbmcgb3VyIGRldGFpbHMuCi0JICovCi0JcHVibGljIFN0cmluZyBpbmZvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyB0cmlwIGNsYXNzIHJlZmxlY3Rpb24KLQkJLy9GQiB0aGlzLmVHZXQoSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFDbGFzc19QdWJsaWMoKSk7Ci0JCXJlZmxlY3RCYXNlKCk7IC8vRkIKLQkJb3V0LmFwcGVuZCgiSmF2YSBjbGFzczogIiArIGdldFF1YWxpZmllZE5hbWUoKSArICJcbiIpOwotCQlvdXQuYXBwZW5kKCIgIHN1cGVyY2xhc3M6ICIgKyB0aGlzLmdldFN1cGVydHlwZSgpICsgIlxuIik7Ci0JCUVMaXN0IGZpZWxkcyA9IGdldEZpZWxkcygpOwotCQlGaWVsZCBmaWVsZDsKLQkJaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0JCQlvdXQuYXBwZW5kKCIgIEZpZWxkczpcbiIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlmaWVsZCA9IChGaWVsZCkgZmllbGRzLmdldChpKTsKLQkJCQlvdXQuYXBwZW5kKCIgICAgIiArICgoSmF2YUhlbHBlcnMpIGZpZWxkLmdldEVUeXBlKCkpLmdldEphdmFOYW1lKCkgKyAiICIgKyBmaWVsZC5nZXROYW1lKCkgKyAiXG4iKTsKLQkJCX0KLQkJfQotCQlFTGlzdCBtZXRob2RzID0gZ2V0TWV0aG9kcygpOwotCQlNZXRob2QgbWV0aG9kOwotCQlpZiAobWV0aG9kcy5zaXplKCkgPiAwKSB7Ci0JCQlvdXQuYXBwZW5kKCIgIE1ldGhvZHM6XG4iKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJCW1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJCS8vIHRyaXAgbWV0aG9kIHJlZmxlY3Rpb24KLQkJCQltZXRob2QuaXNTdGF0aWMoKTsKLQkJCQlpZiAobWV0aG9kLmdldFJldHVyblR5cGUoKSAhPSBudWxsKQotCQkJCQlvdXQuYXBwZW5kKCIgICAgIiArIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0SmF2YU5hbWUoKSArICIgIik7Ci0JCQkJZWxzZQotCQkJCQlvdXQuYXBwZW5kKCIgICAgdm9pZCAiKTsKLQkJCQlvdXQuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkgKyAiKCIpOwotCQkJCUVMaXN0IHBhcm1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJCQlKYXZhUGFyYW1ldGVyIHBhcm07Ci0JCQkJaWYgKHBhcm1zLnNpemUoKSA+IDApIHsKLQkJCQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHBhcm1zLnNpemUoKTsgaWkrKykgewotCQkJCQkJcGFybSA9IChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoaWkpOwotCQkJCQkJLy9GQiBpZiAoIXBhcm0uaXNSZXR1cm4oKSkgewotCQkJCQkJb3V0LmFwcGVuZCgoKEphdmFIZWxwZXJzKSBwYXJtLmdldEVUeXBlKCkpLmdldEphdmFOYW1lKCkgKyAiICIgKyBwYXJtLmdldE5hbWUoKSk7Ci0JCQkJCQlpZiAoaWkgPCBwYXJtcy5zaXplKCkgLSAxKQotCQkJCQkJCW91dC5hcHBlbmQoIiwgIik7Ci0JCQkJCQkvL0ZCIH0KLQkJCQkJfQotCQkJCX0KLQkJCQlvdXQuYXBwZW5kKCIpXG4iKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGlzIGNsYXNzIGluaGVyaXRzIGZyb20gdGhlIHBhc3NlZCBpbiBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmhlcml0c0Zyb20oSmF2YUNsYXNzIGphdmFDbGFzcykgewotCQlpZiAodGhpcyA9PSBqYXZhQ2xhc3MpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoZ2V0U3VwZXJ0eXBlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRTdXBlcnR5cGUoKS5pbmhlcml0c0Zyb20oamF2YUNsYXNzKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDYW4gYW4gb2JqZWN0IG9mIHRoZSBwYXNzZWQgaW4gY2xhc3MgYmUgYXNzaWduZWQgdG8gYW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MuIEluIG90aGVyIHdvcmRzIGlzIHRoaXMgY2xhc3MgYSBzdXBlcnR5cGUgb2YgdGhlIHBhc3NlZCBpbiBjbGFzcywKLQkgKiBvciBpcyBpdCBzdXBlcmludGVyZmFjZSBvZiBpdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKEVDbGFzc2lmaWVyIGFDbGFzcykgewotCQlpZiAoYUNsYXNzIGluc3RhbmNlb2YgSmF2YUNsYXNzKSB7Ci0JCQlKYXZhQ2xhc3MgdGhlQ2xhc3MgPSAoSmF2YUNsYXNzKSBhQ2xhc3M7Ci0JCQkvLyBJZiBlaXRoZXIgdGhpcyBjbGFzcyBvciBhQ2xhc3Mga2luZCBpcyB1bmtub3duIHRoZW4gaXQgaXNuJ3QgYXNzaWduYWJsZUZyb20uCi0JCQlpZiAoZ2V0S2luZCgpID09IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMIHx8IHRoZUNsYXNzLmdldEtpbmQoKSA9PSBUeXBlS2luZC5VTkRFRklORURfTElURVJBTCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBJZiB0aGUgImFDbGFzcyIgaXMgbm90IGEgSmF2YUNsYXNzIChpLmUuIGl0IGlzIGVpdGhlciBhIEphdmFEYXRhdHlwZSBvcgotCQkJLy8gc29tZSBvdGhlciBraW5kIG9mIE1PRiBjbGFzc2lmaWVyKSwgdGhlbiBpdCBjYW5ub3QgYmUKLQkJCS8vIGFzc2lnbmVkIHRvIHNvbWV0aGluZyBvZiB0aGlzIGNsYXNzLgotCQkJaWYgKGdldEtpbmQoKSAhPSBUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCkKLQkJCQlpZiAodGhlQ2xhc3MuZ2V0S2luZCgpICE9IFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMKQotCQkJCQlyZXR1cm4gdGhlQ2xhc3MuaW5oZXJpdHNGcm9tKHRoaXMpOwotCQkJCWVsc2UgewotCQkJCQkvLyBhQ2xhc3MgaXMgYW4gaW50ZXJmYWNlLCBzbyBpdCBpcyBhc3NpZ25hYmxlIG9ubHkgaWYKLQkJCQkJLy8gInRoaXMiIGlzICJqYXZhLmxhbmcuT2JqZWN0Ii4KLQkJCQkJcmV0dXJuIGdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5PYmplY3QiKTsKLQkJCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRoZUNsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERvZXMgdGhpcyB0eXBlIGV4aXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhpc3RpbmdUeXBlKCkgewotCQkvLyBUT0RPOiBUZW1wb3JhcnksIGluZWZmaWNpZW50IGltcGxlbWVudGF0aW9uCi0JCUphdmFSZWZsZWN0aW9uQWRhcHRvciBhZGFwdGVyID0gKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJICAgIHJldHVybiAoYWRhcHRlcikuaGFzUmVmbGVjdGlvblNvdXJjZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2VlIGlmIHRoaXMgaXMgdmFsaWQgb2JqZWN0IG9mIHRoaXMgdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbmNlKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgSUluc3RhbnRpYXRpb25JbnN0YW5jZSA/IGlzQXNzaWduYWJsZUZyb20oKChJSW5zdGFudGlhdGlvbkluc3RhbmNlKSBvKS5nZXRKYXZhVHlwZSgpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgYW4gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gZ2V0S2luZCgpID09IFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkKCkgewotCQlyZXR1cm4gZ2V0RGVjbGFyaW5nQ2xhc3MoKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGxpc3Rpbmcgb3VyIGZpZWxkcywgaW5jbHVkaW5nIGluaGVyaXRlZCBmaWVsZHMuIFRoZSBmaWVsZCByZWxhdGlvbnNoaXAgaXMgZGVyaXZlZCBmcm9tIGNvbnRlbnRzLiBUaGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24KLQkgKiB0aGUgYXNzdW1wdGlvbiB0aGF0IHN1cGVydHlwZXMgYWJvdmUgSmF2YUNsYXNzIHdpbGwgaG9sZCBBdHRyaWJ1dGVzIHJhdGhlciB0aGFuIEZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgRmllbGRbXSBsaXN0RmllbGRFeHRlbmRlZCgpIHsKLQkJTGlzdCBmaWVsZHMgPSBnZXRGaWVsZHNFeHRlbmRlZCgpOwotCQlGaWVsZFtdIHJlc3VsdCA9IG5ldyBGaWVsZFtmaWVsZHMuc2l6ZSgpXTsKLQkJZmllbGRzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyBvdXIgTWV0aG9kcywgaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLiBUaGUgbWV0aG9kIHJlbGF0aW9uc2hpcCBpcyBkZXJpdmVkIGZyb20gY29udGVudHMuIFRoaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kcwotCSAqIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgc3VwZXJ0eXBlcyBhYm92ZSBKYXZhQ2xhc3Mgd2lsbCBob2xkIE9wZXJhdGlvbnMgcmF0aGVyIHRoYW4gTWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kW10gbGlzdE1ldGhvZEV4dGVuZGVkKCkgewotCQlqYXZhLnV0aWwuTGlzdCBtZXRob2RzID0gZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCU1ldGhvZFtdIHJlc3VsdCA9IG5ldyBNZXRob2RbbWV0aG9kcy5zaXplKCldOwotCQltZXRob2RzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCByZWZsZWN0aW9uIGRvIG5vdCB1c2UuCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0TmFtZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCByZWZsZWN0aW9uIGRvIG5vdCB1c2UuCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOwotCQlpZiAoZUlzUHJveHkoKSkgewotCQkJcmVzdWx0ID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmdldEZ1bGxUeXBlTmFtZShlUHJveHlVUkkoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlKYXZhUGFja2FnZSBwYWNrID0gZ2V0SmF2YVBhY2thZ2UoKTsKLQkJCWlmIChwYWNrICE9IG51bGwgJiYgcGFjay5nZXRQYWNrYWdlTmFtZSgpLmxlbmd0aCgpICE9IDApCi0JCQkJcmVzdWx0ID0gcGFjay5nZXRQYWNrYWdlTmFtZSgpICsgIi4iICsgKChKYXZhUmVmRmFjdG9yeUltcGwpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRSkucHJpbUdldFR5cGVOYW1lKHRoaXMucHJpbUdldE5hbWUoKSk7Ci0JCQllbHNlCi0JCQkJcmVzdWx0ID0gdGhpcy5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIEphdmFDbGFzcyBmb3IgYSBnaXZlbiBxdWFsaWZpZWQgbmFtZS4gSWYgdGhlIHBhY2thZ2Ugb3IgY2xhc3MgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgcmVmbGVjdGlvbgotCSAqIG1lY2hhbmlzbS4gTG9va3VwIHRoZSBKYXZhQ2xhc3MgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBhc3NlZCBvYmplY3QsIGhhbmRsaW5nIHNvbWUgZXJyb3IgY2FzZXMuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0VHlwZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyByZWZsZWN0KFN0cmluZyBhUXVhbGlmaWVkTmFtZSwgRU9iamVjdCByZWxhdGVkT2JqZWN0KSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoYVF1YWxpZmllZE5hbWUsIHJlbGF0ZWRPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YUNsYXNzIGZvciBhIGdpdmVuIHF1YWxpZmllZCBuYW1lLiBJZiB0aGUgcGFja2FnZSBvciBjbGFzcyBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoIHRoZSByZWZsZWN0aW9uCi0JICogbWVjaGFuaXNtLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgcmVmbGVjdChTdHJpbmcgYVF1YWxpZmllZE5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGFRdWFsaWZpZWROYW1lLCBzZXQpOwotCX0KLQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YUNsYXNzIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZSBvciBjbGFzcyBuYW1lLiBJZiB0aGUgcGFja2FnZSBvciBjbGFzcyBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoIHRoZQotCSAqIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyByZWZsZWN0KFN0cmluZyBhUGFja2FnZU5hbWUsIFN0cmluZyBhQ2xhc3NOYW1lLCBSZXNvdXJjZVNldCBzZXQpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShhUGFja2FnZU5hbWUsIGFDbGFzc05hbWUsIHNldCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3VwZXJ0eXBlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlU3VwZXJ0eXBlKGFKYXZhQ2xhc3MpOwotCQlMaXN0IHMgPSBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCQlzLmNsZWFyKCk7Ci0JCWlmIChhSmF2YUNsYXNzICE9IG51bGwpCi0JCQlzLmFkZChhSmF2YUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpZWxkcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdGlhbGl6ZXJzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlY2xhcmVkQ2xhc3NlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlY2xhcmluZ0NsYXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldERlY2xhcmluZ0NsYXNzKChKYXZhQ2xhc3Mpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpZWxkcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdGlhbGl6ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlY2xhcmVkQ2xhc3NlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXREZWNsYXJpbmdDbGFzcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXZlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19LSU5EOgotCQkJCXJldHVybiBnZXRLaW5kKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX1BVQkxJQzoKLQkJCQlyZXR1cm4gaXNQdWJsaWMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJTkFMOgotCQkJCXJldHVybiBpc0ZpbmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVDoKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NJbXBvcnQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOgotCQkJCXJldHVybiBnZXRQYWNrYWdlSW1wb3J0cygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFM6Ci0JCQkJcmV0dXJuIGdldEZpZWxkcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRNZXRob2RzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbGl6ZXJzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGdldERlY2xhcmVkQ2xhc3NlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZWNsYXJpbmdDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldERlY2xhcmluZ0NsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0pBVkFfUEFDS0FHRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEphdmFQYWNrYWdlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0SmF2YVBhY2thZ2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCXJldHVybiBnZXRFdmVudHMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQUxMX0VWRU5UUzoKLQkJCQlyZXR1cm4gZ2V0QWxsRXZlbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fS0lORDoKLQkJCQlzZXRLaW5kKChUeXBlS2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QVUJMSUM6Ci0JCQkJc2V0UHVibGljKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklOQUw6Ci0JCQkJc2V0RmluYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJCWdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVDoKLQkJCQlnZXRDbGFzc0ltcG9ydCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2xhc3NJbXBvcnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOgotCQkJCWdldFBhY2thZ2VJbXBvcnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRQYWNrYWdlSW1wb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFM6Ci0JCQkJZ2V0RmllbGRzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWVsZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUzoKLQkJCQlnZXRNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQlnZXRJbml0aWFsaXplcnMoKS5jbGVhcigpOwotCQkJCWdldEluaXRpYWxpemVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTOgotCQkJCWdldERlY2xhcmVkQ2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVjbGFyZWRDbGFzc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlzZXREZWNsYXJpbmdDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VWRU5UUzoKLQkJCQlnZXRFdmVudHMoKS5jbGVhcigpOwotCQkJCWdldEV2ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19BTExfRVZFTlRTOgotCQkJCWdldEFsbEV2ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0QWxsRXZlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19LSU5EOgotCQkJCXNldEtpbmQoS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QVUJMSUM6Ci0JCQkJc2V0UHVibGljKFBVQkxJQ19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSU5BTDoKLQkJCQlzZXRGaW5hbChGSU5BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQ0xBU1NfSU1QT1JUOgotCQkJCWdldENsYXNzSW1wb3J0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX1BBQ0tBR0VfSU1QT1JUUzoKLQkJCQlnZXRQYWNrYWdlSW1wb3J0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFM6Ci0JCQkJZ2V0RmllbGRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTklUSUFMSVpFUlM6Ci0JCQkJZ2V0SW5pdGlhbGl6ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJZ2V0RGVjbGFyZWRDbGFzc2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlzZXREZWNsYXJpbmdDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCWdldEV2ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19BTExfRVZFTlRTOgotCQkJCWdldEFsbEV2ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0tJTkQ6Ci0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUFVCTElDOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFBVQkxJQ19FRkxBRykgIT0gMCkgIT0gUFVCTElDX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSU5BTDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCkgIT0gRklOQUxfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUzoKLQkJCQlyZXR1cm4gaW1wbGVtZW50c0ludGVyZmFjZXMgIT0gbnVsbCAmJiAhaW1wbGVtZW50c0ludGVyZmFjZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19DTEFTU19JTVBPUlQ6Ci0JCQkJcmV0dXJuIGNsYXNzSW1wb3J0ICE9IG51bGwgJiYgIWNsYXNzSW1wb3J0LmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOgotCQkJCXJldHVybiBwYWNrYWdlSW1wb3J0cyAhPSBudWxsICYmICFwYWNrYWdlSW1wb3J0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gZmllbGRzICE9IG51bGwgJiYgIWZpZWxkcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJcmV0dXJuIG1ldGhvZHMgIT0gbnVsbCAmJiAhbWV0aG9kcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQlyZXR1cm4gaW5pdGlhbGl6ZXJzICE9IG51bGwgJiYgIWluaXRpYWxpemVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGRlY2xhcmVkQ2xhc3NlcyAhPSBudWxsICYmICFkZWNsYXJlZENsYXNzZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0pBVkFfUEFDS0FHRToKLQkJCQlyZXR1cm4gYmFzaWNHZXRKYXZhUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VWRU5UUzoKLQkJCQlyZXR1cm4gZXZlbnRzICE9IG51bGwgJiYgIWV2ZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0FMTF9FVkVOVFM6Ci0JCQkJcmV0dXJuICFnZXRBbGxFdmVudHMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYXNzZWQgSmF2YUNsYXNzIGlzIGEgdmFsaWQgc3VwZXIgY2xhc3MgKGkuZS4sIGl0IGRvZXMgbm90IGNyZWF0ZSBhbnkgY3ljbGVzIGluIHRoZSBpbmhlcml0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYUphdmFDbGFzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU3VwZXJ0eXBlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZFN1cGVydHlwZShhSmF2YUNsYXNzKSkKLQkJCXRocm93IG5ldyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uKHRoaXMsIGFKYXZhQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRTdXBlcnR5cGUoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHsKLQkJaWYgKGFKYXZhQ2xhc3MgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZXF1YWxzKGFKYXZhQ2xhc3MpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBleHRlbmRlZElzVmFsaWRTdXBlcnR5cGUoZ2V0U3VidHlwZXMoKSwgYUphdmFDbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN1YnR5cGVzCi0JICogQHBhcmFtIGFKYXZhQ2xhc3MKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kZWRJc1ZhbGlkU3VwZXJ0eXBlKExpc3Qgc3VidHlwZXMsIEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JCWlmICghYmFzaWNJc1ZhbGlkU3VwZXJ0eXBlKHN1YnR5cGVzLCBhSmF2YUNsYXNzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSmF2YUNsYXNzIHN1YnR5cGU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VidHlwZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXN1YnR5cGUgPSAoSmF2YUNsYXNzKSBzdWJ0eXBlcy5nZXQoaSk7Ci0JCQlpZiAoIXN1YnR5cGUuaXNWYWxpZFN1cGVydHlwZShhSmF2YUNsYXNzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJhc2ljSXNWYWxpZFN1cGVydHlwZShMaXN0IHN1YnR5cGVzLCBKYXZhQ2xhc3MgYUphdmFDbGFzcykgewotCQlKYXZhQ2xhc3Mgc3VidHlwZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJ0eXBlcy5zaXplKCk7IGkrKykgewotCQkJc3VidHlwZSA9IChKYXZhQ2xhc3MpIHN1YnR5cGVzLmdldChpKTsKLQkJCWlmIChzdWJ0eXBlLmVxdWFscyhhSmF2YUNsYXNzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0U3VidHlwZXMoKSB7Ci0JCXJldHVybiBnZXRFU3VwZXJBZGFwdGVyKCkuZ2V0U3ViY2xhc3NlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIoIiArIGdldFF1YWxpZmllZE5hbWUoKSArICIpIjsKLQl9Ci0KLQlwdWJsaWMgVHlwZUtpbmQgZ2V0S2luZCgpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGdldEtpbmRHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLaW5kKFR5cGVLaW5kIG5ld0tpbmQpIHsKLQkJVHlwZUtpbmQgb2xkS2luZCA9IGtpbmQ7Ci0JCWtpbmQgPSBuZXdLaW5kID09IG51bGwgPyBLSU5EX0VERUZBVUxUIDogbmV3S2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fS0lORCwgb2xkS2luZCwga2luZCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHVibGljKCkgewotCQlyZWZsZWN0QmFzZSgpOwotCQlyZXR1cm4gaXNQdWJsaWNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWMoYm9vbGVhbiBuZXdQdWJsaWMpIHsKLQkJYm9vbGVhbiBvbGRQdWJsaWMgPSAoZUZsYWdzICYgUFVCTElDX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3UHVibGljKSBlRmxhZ3MgfD0gUFVCTElDX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+UFVCTElDX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QVUJMSUMsIG9sZFB1YmxpYywgbmV3UHVibGljKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGlzRmluYWxHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbChib29sZWFuIG5ld0ZpbmFsKSB7Ci0JCWJvb2xlYW4gb2xkRmluYWwgPSAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdGaW5hbCkgZUZsYWdzIHw9IEZJTkFMX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RklOQUxfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJTkFMLCBvbGRGaW5hbCwgbmV3RmluYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHlwZUtpbmQgZ2V0S2luZEdlbigpIHsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaWNHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgUFVCTElDX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmluYWxHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEluaXRpYWxpemVycygpIHsKLQkJaWYgKGluaXRpYWxpemVycyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChJbml0aWFsaXplci5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTLAotCQkJCQlKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRpYWxpemVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJpbmdDbGFzcyhKYXZhQ2xhc3MgbmV3RGVjbGFyaW5nQ2xhc3MpIHsKLQkJaWYgKG5ld0RlY2xhcmluZ0NsYXNzICE9IGRlY2xhcmluZ0NsYXNzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkZWNsYXJpbmdDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkZWNsYXJpbmdDbGFzcykuZUludmVyc2VSZW1vdmUodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdEZWNsYXJpbmdDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEZWNsYXJpbmdDbGFzcykuZUludmVyc2VBZGQodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldERlY2xhcmluZ0NsYXNzKG5ld0RlY2xhcmluZ0NsYXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUywgbmV3RGVjbGFyaW5nQ2xhc3MsIG5ld0RlY2xhcmluZ0NsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpIHsKLQkJaWYgKGRlY2xhcmluZ0NsYXNzICE9IG51bGwgJiYgZGVjbGFyaW5nQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERlY2xhcmluZ0NsYXNzID0gKEludGVybmFsRU9iamVjdClkZWNsYXJpbmdDbGFzczsKLQkJCWRlY2xhcmluZ0NsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZERlY2xhcmluZ0NsYXNzKTsKLQkJCWlmIChkZWNsYXJpbmdDbGFzcyAhPSBvbGREZWNsYXJpbmdDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUywgb2xkRGVjbGFyaW5nQ2xhc3MsIGRlY2xhcmluZ0NsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXREZWNsYXJpbmdDbGFzcygpIHsKLQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERlY2xhcmluZ0NsYXNzKEphdmFDbGFzcyBuZXdEZWNsYXJpbmdDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlKYXZhQ2xhc3Mgb2xkRGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKLQkJZGVjbGFyaW5nQ2xhc3MgPSBuZXdEZWNsYXJpbmdDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTLCBvbGREZWNsYXJpbmdDbGFzcywgbmV3RGVjbGFyaW5nQ2xhc3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXREZWNsYXJlZENsYXNzZXMoKSB7Ci0JCXJlZmxlY3RCYXNlKCk7Ci0JCXJldHVybiBnZXREZWNsYXJlZENsYXNzZXNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCkgewotCQlpZiAoZGVjbGFyZWRDbGFzc2VzID09IG51bGwpIHsKLQkJCWRlY2xhcmVkQ2xhc3NlcyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUyk7Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmVkQ2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsgLy8gQXMgb2YgRU1GIDIuMCwgbG9jYWwgcHJvcGVydGllcyBhcmUgdGhlIGxvY2FsIGZlYXR1cmVzLiBVc2VkIHRvIGJlIGEgbWVyZ2Ugb2YgZWF0dHJpYnV0ZXMgYW5kIGVyZWZlcmVuY2VzLgotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFdmVudHMoKSB7Ci0JCUlJbnRyb3NwZWN0aW9uQWRhcHRlciBhZGFwdGVyID0gZ2V0SW50cm9zcGVjdGlvbkFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldEV2ZW50cygpOwotCQlyZXR1cm4gZ2V0RXZlbnRzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV2ZW50c0dlbigpIHsKLQkJaWYgKGV2ZW50cyA9PSBudWxsKSB7Ci0JCQlldmVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSmF2YUV2ZW50LmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FVkVOVFMpOwotCQl9Ci0JCXJldHVybiBldmVudHM7Ci0JfQotCi0JcHJpdmF0ZSBFTGlzdCBhbGxFdmVudHM7Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsRXZlbnRzKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgaWEgPSBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpOwotCQlpZiAoaWEgPT0gbnVsbCkKLQkJCXJldHVybiBFQ29sbGVjdGlvbnMuRU1QVFlfRUxJU1Q7IC8vIE5vIGludHJvc3BlY3Rpb24sIGRvIG5vcm1hbC4KLQkJcmV0dXJuIGFsbEV2ZW50cyA9IGlhLmdldEFsbEV2ZW50cygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRBbGxFdmVudHNHZW4oKSB7Ci0JCXJldHVybiBhbGxFdmVudHM7Ci0JfQotCi0JcHJpdmF0ZSBFTGlzdCBhbGxQcm9wZXJ0aWVzOwotCi0JcHVibGljIEVMaXN0IGdldEFsbFByb3BlcnRpZXMoKSB7Ci0JCUlJbnRyb3NwZWN0aW9uQWRhcHRlciBpYSA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChpYSA9PSBudWxsKQotCQkJcmV0dXJuIEVDb2xsZWN0aW9ucy5FTVBUWV9FTElTVDsgLy8gTm8gaW50cm9zcGVjdGlvbiwgZG8gbm9ybWFsLgotCQlyZXR1cm4gYWxsUHJvcGVydGllcyA9IGlhLmdldEFsbFByb3BlcnRpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsUHJvcGVydGllc0dlbigpIHsKLQkJcmV0dXJuIGFsbFByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpIHsKLQkJaWYgKGltcGxlbWVudHNJbnRlcmZhY2VzID09IG51bGwpIHsKLQkJCWltcGxlbWVudHNJbnRlcmZhY2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUykgewotCi0JCQkJLyoqCi0JCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkgKiAKLQkJCQkgKiBAc2luY2UgMS4xLjAKLQkJCQkgKi8KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5nZXQoaW5kZXgpOyAvL2ZvcmNlIHJlc29sdXRpb24gc28gdGhlIEVTdXBlckFkYXB0ZXIgd2lsbCBiZSB1cGRhdGVkIGNvcnJlY3RseQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0KGluZGV4KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCQkJc3VwZXIuY2xlYXIoKTsKLQkJCQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQkJCQlnZXRJbnRlcmZhY2VTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IHN1cGVyLnJlbW92ZShpbmRleCk7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLnJlbW92ZShpbmRleCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucmVtb3ZlQWxsKGNvbGxlY3Rpb24pOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5yZW1vdmVBbGwoY29sbGVjdGlvbik7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotCQkJCQlzdXBlci5hZGQoaW5kZXgsIG9iamVjdCk7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLmFkZChpbmRleCwgb2JqZWN0KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotCQkJCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLmFkZChvYmplY3QpOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5hZGQob2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5hZGRBbGwoY29sbGVjdGlvbik7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuYWRkQWxsKGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJCQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQkJCQlnZXRJbnRlcmZhY2VTdXBlclR5cGVzKCkuYWRkQWxsKGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBpbXBsZW1lbnRzSW50ZXJmYWNlczsKLQl9Ci0KLQlwcml2YXRlIEVMaXN0IGdldEludGVyZmFjZVN1cGVyVHlwZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDbGFzc0ltcG9ydEdlbigpIHsKLQkJaWYgKGNsYXNzSW1wb3J0ID09IG51bGwpIHsKLQkJCWNsYXNzSW1wb3J0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVCk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzSW1wb3J0OwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFQWxsU3VwZXJUeXBlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsvL0ZvcmNlIHJlZmxlY3Rpb24sIGlmIG5lZWRlZCwgYmVmb3JlIGdldHRpbmcgYWxsIHN1cGVydHlwZXMuCi0JCXJldHVybiBzdXBlci5nZXRFQWxsU3VwZXJUeXBlcygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFU3VwZXJUeXBlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVTdXBlclR5cGVzKCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IG90aGVycy4gSXQgaXMgaGVyZSBzbyB0aGF0IHRoZSByZWZsZWN0aW9uCi0JICogYWRhcHRlcnMgY2FuIHJlZmVyZW5jZSB0aGUgdW5yZWZsZWN0ZWQgc3VwZXJ0eXBlcy4KLQkgKiAgCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFTGlzdCBwcmltR2V0RVN1cGVyVHlwZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQYWNrYWdlSW1wb3J0c0dlbigpIHsKLQkJaWYgKHBhY2thZ2VJbXBvcnRzID09IG51bGwpIHsKLQkJCXBhY2thZ2VJbXBvcnRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhUGFja2FnZS5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTKTsKLQkJfQotCQlyZXR1cm4gcGFja2FnZUltcG9ydHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZpZWxkc0dlbigpIHsKLQkJaWYgKGZpZWxkcyA9PSBudWxsKSB7Ci0JCQlmaWVsZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChGaWVsZC5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTLCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUyk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kc0dlbigpIHsKLQkJaWYgKG1ldGhvZHMgPT0gbnVsbCkgewotCQkJbWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KE1ldGhvZC5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUywgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgZ2V0SmF2YVBhY2thZ2VHZW4oKSB7Ci0JCUphdmFQYWNrYWdlIGphdmFQYWNrYWdlID0gYmFzaWNHZXRKYXZhUGFja2FnZSgpOwotCQlyZXR1cm4gamF2YVBhY2thZ2UgIT0gbnVsbCAmJiBqYXZhUGFja2FnZS5lSXNQcm94eSgpID8gKEphdmFQYWNrYWdlKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClqYXZhUGFja2FnZSkgOiBqYXZhUGFja2FnZTsKLQl9Ci0KLQkvKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSBiYXNpY0dldEphdmFQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0SmF2YVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoa2luZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoa2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVibGljOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgUFVCTElDX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5hbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgd2l0aCB0cnVlLiBJdCBpcyBiYXNpY2FsbHkgb25seSBmb3IgcmVzZXQgb2YgcmVmbGVjdGlvbiwgbm90IHRvIHNldCBhIHBhcnRpY3VsYXIgc3RhdGUuIEJ1dCBJbnRlcm5hbFJlYWRBZGFwdGFibGUKLQkgKiBtYXkgYmUgdXNlZCBieSBzb21lb25lIHRoYXQgc2hvdWxkbid0IHNvIHRvIGJlIGJlIHNhZmUgd2Uga2VlcCBpdC4gVE9ETyBSZW1vdmUgSW50ZXJuYWxSZWFkQWRhcHRhYmxlIGluIG5leHQgdmVyc2lvbi4gTmVlZCB0byB3YWl0IGJlY2F1c2Ugd2UKLQkgKiBuZWVkIHRpbWUgdG8gbm90aWZ5IGV2ZXJ5b25lLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSW50ZXJuYWxSZWFkQWRhcHRhYmxlI3NldFJlZmxlY3RlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZWZsZWN0ZWQoYm9vbGVhbiBhQm9vbGVhbikgewotCQlpZiAoIWFCb29sZWFuKQotCQkJcmVmbGVjdGlvblN0YXR1cyA9IE5PVF9SRUZMRUNURUQ7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRSZWZsZWN0aW9uVHlwZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWZsZWN0aW9uVHlwZSgpIHsKLQkJSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGphID0gKChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIGdldFJlYWRBZGFwdGVyKCkpOwotCQlyZXR1cm4gamEgIT0gbnVsbCA/IGphLmdldFJlZmxlY3Rpb25Tb3VyY2UoKSA6IG51bGw7Ci0JfQotCUBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDb250ZW50cygpCi0JICB7Ci0JICAgIGlmIChlQ29udGVudHMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDb250ZW50cyA9IEVDb250ZW50c0VMaXN0LmNyZWF0ZUVDb250ZW50c0VMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ29udGVudHM7Ci0JICB9Ci0KLQkgIEBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDcm9zc1JlZmVyZW5jZXMoKQotCSAgewotCSAgICBpZiAoZUNyb3NzUmVmZXJlbmNlcyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUNyb3NzUmVmZXJlbmNlcyA9IEVDcm9zc1JlZmVyZW5jZUVMaXN0LmNyZWF0ZUVDcm9zc1JlZmVyZW5jZUVMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ3Jvc3NSZWZlcmVuY2VzOwotCSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFEYXRhVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhRGF0YVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDZhYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFEYXRhVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNyb3NzUmVmZXJlbmNlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YURhdGFUeXBlSW1wbCBleHRlbmRzIEVDbGFzc0ltcGwgaW1wbGVtZW50cyBKYXZhRGF0YVR5cGUgewotCi0JCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfWkVSTyA9ICIwLjAiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPQVRfWkVSTyA9ICIwLjBmIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJfWkVSTyA9ICInMCciOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWkVSTyA9ICIwIjsKLQkKLQlwcml2YXRlIGludCBwcmltaXRpdmVfdHlwZSA9IFBSSU1fTk9UX0lEOwotCQotCXByb3RlY3RlZCBKYXZhRGF0YVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLkpBVkFfREFUQV9UWVBFOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmltaXRpdmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IGdldEphdmFOYW1lKCk7Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoUFJJTV9CT09MRUFOX05BTUUpKQotCQkJcmV0dXJuIEZBTFNFOwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKFBSSU1fRE9VQkxFX05BTUUpKQotCQkJcmV0dXJuIERPVUJMRV9aRVJPOwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKFBSSU1fRkxPQVRfTkFNRSkpCi0JCQlyZXR1cm4gRkxPQVRfWkVSTzsJCQkKLQkJaWYgKHR5cGVOYW1lLmVxdWFscyhQUklNX0NIQVJBQ1RFUl9OQU1FKSkKLQkJCXJldHVybiBDSEFSX1pFUk87Ci0JCXJldHVybiBaRVJPOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFOYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQlwdWJsaWMgSmF2YURhdGFUeXBlIGdldFByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzI2dldFByaW1pdGl2ZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByaW1pdGl2ZUlEKCkgewotCQlpZiAocHJpbWl0aXZlX3R5cGUgPT0gUFJJTV9OT1RfSUQpIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fQk9PTEVBTl9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fQk9PTEVBTl9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX0NIQVJBQ1RFUl9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fQ0hBUkFDVEVSX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fQllURV9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fQllURV9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX1NIT1JUX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9TSE9SVF9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX0lOVEVHRVJfTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX0lOVEVHRVJfSUQ7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJJTV9MT05HX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9MT05HX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fRkxPQVRfTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX0ZMT0FUX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fRE9VQkxFX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9ET1VCTEVfSUQ7Ci0JCX0KLQkJcmV0dXJuIHByaW1pdGl2ZV90eXBlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIGdldEphdmFOYW1lKCk7Ci0JfQotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0V3JhcHBlcigpIHsKLQkJU3RyaW5nIHdyYXBwZXJOYW1lID0gZ2V0V3JhcHBlclF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKHdyYXBwZXJOYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUod3JhcHBlck5hbWUsIHRoaXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBnZXRXcmFwcGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V3JhcHBlclF1YWxpZmllZE5hbWUoKSB7Ci0JCXN3aXRjaCAoZ2V0UHJpbWl0aXZlSUQoKSkgewotCQkJY2FzZSBQUklNX0lOVEVHRVJfSUQ6Ci0JCQkJcmV0dXJuIElOVEVHRVJfTkFNRTsKLQkJCWNhc2UgUFJJTV9DSEFSQUNURVJfSUQ6Ci0JCQkJcmV0dXJuIENIQVJBQ1RFUl9OQU1FOwotCQkJY2FzZSBQUklNX0JPT0xFQU5fSUQ6Ci0JCQkJcmV0dXJuIEJPT0xFQU5fTkFNRTsKLQkJCWNhc2UgUFJJTV9CWVRFX0lEOgotCQkJCXJldHVybiBCWVRFX05BTUU7Ci0JCQljYXNlIFBSSU1fU0hPUlRfSUQ6Ci0JCQkJcmV0dXJuIFNIT1JUX05BTUU7Ci0JCQljYXNlIFBSSU1fTE9OR19JRDoKLQkJCQlyZXR1cm4gTE9OR19OQU1FOwotCQkJY2FzZSBQUklNX0ZMT0FUX0lEOgotCQkJCXJldHVybiBGTE9BVF9OQU1FOwotCQkJY2FzZSBQUklNX0RPVUJMRV9JRDoKLQkJCQlyZXR1cm4gRE9VQkxFX05BTUU7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8qCi0JICogSmF2YUhlbHBlcnMuaXNBcnJheSgpIC0gYXJyYXkgdHlwZXMgYXJlIGFsd2F5cyBKYXZhQ2xhc3NlcywgZXZlbiBpZiB0aGVpciBjb21wb25lbnQgdHlwZSBpcwotCSAqCQlhIHByaW1pdGl2ZSBkYXRhIHR5cGUuIFJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIENhbiBhbiBvYmplY3Qgb2YgdGhlIHBhc3NlZCBpbiBjbGFzcyBiZSBhc3NpZ25lZCB0byBhbgotCSAqIG9iamVjdCBvZiB0aGlzIGNsYXNzPyBJbiB0aGUgY2FzZSBvZiBwcmltaXRpdmVzLCBhcmUgdGhleSB0aGUgc2FtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKEVDbGFzc2lmaWVyIGFDbGFzcykgewotCQlyZXR1cm4gdGhpcyA9PSBhQ2xhc3M7Ci0JfQotCS8qKgotCSAqIFNlZSBpZiB0aGlzIGlzIHZhbGlkIG9iamVjdCBvZiB0aGlzIHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnN0YW5jZShPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIElJbnN0YW50aWF0aW9uSW5zdGFuY2UgPyBpc0Fzc2lnbmFibGVGcm9tKCgoSUluc3RhbnRpYXRpb25JbnN0YW5jZSkgbykuZ2V0SmF2YVR5cGUoKSkgOiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyNnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpIHsKLQkJcmV0dXJuIGdldEphdmFOYW1lKCk7Ci0JfQotCUBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDb250ZW50cygpCi0JICB7Ci0JICAgIGlmIChlQ29udGVudHMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDb250ZW50cyA9IEVDb250ZW50c0VMaXN0LmNyZWF0ZUVDb250ZW50c0VMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ29udGVudHM7Ci0JICB9Ci0KLQkgIEBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDcm9zc1JlZmVyZW5jZXMoKQotCSAgewotCSAgICBpZiAoZUNyb3NzUmVmZXJlbmNlcyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUNyb3NzUmVmZXJlbmNlcyA9IEVDcm9zc1JlZmVyZW5jZUVMaXN0LmNyZWF0ZUVDcm9zc1JlZmVyZW5jZUVMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ3Jvc3NSZWZlcmVuY2VzOwotCSAgfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFFdmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhRXZlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhN2E1Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFFdmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBFdmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFFdmVudEltcGwgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsIGltcGxlbWVudHMgSmF2YUV2ZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUV2ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLkpBVkFfRVZFTlQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNmZhYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcjsKLQotLyoqCi0gKiBUaGUgZmFjdG9yeSB0byB1c2UgSmF2YVJlZiBwYWNrYWdlcy4gSXQgd2lsbCB1c2UgdGhlCi0gKiBJSW5zdGFudGlhdGlvbkhhbmRsZXIsIGlmIHRoZXJlIGlzIG9uZSwgdG8gZG8gdGhlCi0gKiBmYWN0b3J5IHJlcXVlc3RzLiBFbHNlIGl0IHdpbGwgbGV0IHRoZSBzdXBlcmNsYXNzIGhhbmRsZSBpdC4KLSAqLwotcHVibGljIGNsYXNzIEphdmFGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCB7Ci0JCi0JcHJpdmF0ZSBJSW5zdGFudGlhdGlvbkhhbmRsZXIgaW5zdGFudGlhdGlvbkhhbmRsZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHJldHJpZXZlZEhhbmRsZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSmF2YUZhY3RvcnlJbXBsLgotCSAqLwotCXB1YmxpYyBKYXZhRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElJbnN0YW50aWF0aW9uSGFuZGxlciBnZXRJbnN0YW50aWF0aW9uSGFuZGxlcigpIHsKLQkJaWYgKCFyZXRyaWV2ZWRIYW5kbGVyKSB7Ci0JCQkvLyBOZWVkIHRvIHJldHJpZXZlIGhhbmRsZXIgbGF6aWx5IGJlY2F1c2Ugd2hlbiBmYWN0b3J5IGlzIGNyZWF0ZWQgaXQgZG9lcyBub3QgeWV0IGtub3cgd2hhdCBSZXNvdXJjZVNldCBpdCBpcyBpbi4KLQkJCS8vIENhbid0IGtub3cgdGhhdCB1bnRpbCB0aGUgZmlyc3QgdGltZSB3ZSBuZWVkIGEgaGFuZGxlci4KLQkJCVJlc291cmNlU2V0IHJzZXQgPSBnZXRFUGFja2FnZSgpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAocnNldCAhPSBudWxsKSB7Ci0JCQkJcmV0cmlldmVkSGFuZGxlciA9IHRydWU7Ci0JCQkJSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIgZmFjdG9yeSA9IChJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyc2V0LCBJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5BREFQVEVSX0tFWSk7Ci0JCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCQkJaW5zdGFudGlhdGlvbkhhbmRsZXIgPSBmYWN0b3J5LmdldEluc3RhbnRpYXRpb25IYW5kbGVyKHRoaXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW50aWF0aW9uSGFuZGxlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3RvcnkjY3JlYXRlKEVDbGFzcykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlJSW5zdGFudGlhdGlvbkhhbmRsZXIgaWEgPSBnZXRJbnN0YW50aWF0aW9uSGFuZGxlcigpOwotCQlpZiAoaWEgPT0gbnVsbCB8fCAhaWEuaGFuZGxlc0NsYXNzKGVDbGFzcykpCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlKGVDbGFzcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBpYS5jcmVhdGUoZUNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkNmEzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FQ29sbGVjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNyb3NzUmVmZXJlbmNlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi1wdWJsaWMgY2xhc3MgSmF2YVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF2YVBhY2thZ2UsIEVQYWNrYWdlIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiBjbGFzc2VzIHRoYXQgdGhpcyBwYWNrYWdlIGNvbnRhaW5zLgotCSAqIFNpbmNlIHRoaXMgaXMgYSBkZXJpdmVkIHJlbGF0aW9uc2hpcCwgd2UgbmVlZCB0byBpbXBsZW1lbnQKLQkgKiBpdCBoZXJlLiBJdCB3aWxsIGdldCB0aGUgbWV0YW9iamVjdHMgbGlzdC4gVGhlc2UgYXJlIHRoZQotCSAqIGphdmEgY2xhc3NlcyB0aGlzIHBhY2thZ2UgY29udGFpbnMuCi0JICoKLQkgKiBJZiB0aGlzIGlzIHRoZSBwcmltaXRpdmVzIHBhY2thZ2UsIHRoZW4gaXQgbXVzdCByZXR1cm4KLQkgKiBhbiBlbXB0eSBsaXN0IGJlY2F1c2UgaXQgZG9lc24ndCBjb250YWluIGFueSBjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRKYXZhQ2xhc3NlcygpIHsKLQkJcmV0dXJuICFQUklNSVRJVkVfUEFDS0FHRV9OQU1FLmVxdWFscyhnZXROYW1lKCkpID8KLQkJCUVDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVFTGlzdChnZXRFQ2xhc3NpZmllcnMoKSkgOgotCQkJRUNvbGxlY3Rpb25zLkVNUFRZX0VMSVNUOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fSkFWQV9DTEFTU0VTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3NlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fSkFWQV9DTEFTU0VTOgotCQkJCXJldHVybiAhZ2V0SmF2YUNsYXNzZXMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoaXMgcGFja2FnZS4KLSAqIFdlIGRvIG5vdCB3YW50IHRvIGV4cG9zZSB0aGUgLmphdmFwcmltIHBhY2thZ2UKLSAqIHNpbmNlIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgcGFja2FnZS4KLSAqLwotcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCWlmIChpc0RlZmF1bHQoKSkKLQkJcmV0dXJuICIiOwotCWVsc2UKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLX0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCi0JU3RyaW5nIGludGVybmFsTmFtZSA9IHN1cGVyLmdldE5hbWUoKSA7Ci0JcmV0dXJuIEphdmFQYWNrYWdlLlBSSU1JVElWRV9QQUNLQUdFX05BTUUuZXF1YWxzKGludGVybmFsTmFtZSkgPyAiIiA6IGludGVybmFsTmFtZSA7CQotfQotcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCXJldHVybiBKYXZhUGFja2FnZS5QUklNSVRJVkVfUEFDS0FHRV9OQU1FLmVxdWFscyhzdXBlci5nZXROYW1lKCkpOwkKLX0KLQkvKioKLQkgKiBTaW5jZSBjbGFzc2VzIGFyZSBsb2FkZWQgZHluYW1pY2FsbHkgYW5kIG5vdCBmcm9tIGEgc2NoZW1hLCBhCi0JICogY2xhc3MgY291bGQgYmUgYXNrZWQgZm9yIHRocm91Z2ggdGhpcyBtZXRob2QsIGFuZCBpZiBub3QgeWV0IHJlZmxlY3RlZCwKLQkgKiBpdCB3b3VsZG4ndCBiZSBmb3VuZC4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbnkgY2xhc3MgYXNrZWQgZm9yCi0JICogaW4gdGhpcyBwYWNrYWdlIGlzIGZvdW5kIChpLmUuIHBvb2ZlZCB1cCkuIE90aGVyd2lzZSBsb2FkaW5nIGFuIGluc3RhbmNlCi0JICogZG9jdW1lbnQgdGhhdCByZWZlcnMgdG8gamF2YSBjbGFzcyB0aHJvdWdoIG5hbWVzcGFjZXMgd29uJ3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGdldEVDbGFzc2lmaWVyKFN0cmluZyBjbGFzc05hbWUpIHsJCQkKLQkJLy8gVHJ5IHRvIGdldCB0aGUgY2xhc3MgZnJvbSB0aGUgcmVzb3VyY2UgdGhhdCB0aGlzIHBhY2thZ2UgaXMgaW4uCi0JCS8vIFRoaXMgd2lsbCBjcmVhdGUgaXQgaWYgbm90IGZvdW5kLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlCi0JCS8vIHN0cnVjdHVyZSBpcyB0aGVyZSBpcyBvbmUgamF2YSBwYWNrYWdlIHBlciByZXNvdXJjZSwgYW5kCi0JCS8vIHRoZSBpZCBvZiB0aGUgY2xhc3MgaXMgdGhlIGNsYXNzIG5hbWUgd2l0aG91dCB0aGUgcGFja2FnZQotCQkvLyBwb3J0aW9uLCB3aGljaCBpcyB3aGF0IGNsYXNzTmFtZSBhYm92ZSBpcy4KLQkJT2JqZWN0IHJlc3VsdCA9IGVSZXNvdXJjZSgpLmdldEVPYmplY3QoY2xhc3NOYW1lKTsKLQkJcmV0dXJuIChyZXN1bHQgaW5zdGFuY2VvZiBFQ2xhc3NpZmllcikgPyAoRUNsYXNzaWZpZXIpIHJlc3VsdCA6IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YSBwYWNrYWdlIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZS4KLQkgKiBJZiB0aGUgcGFja2FnZSBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoCi0JICogdGhlIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIEBkZXByZWNhdGVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0UGFja2FnZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVBhY2thZ2UgcmVmbGVjdChTdHJpbmcgcGFja2FnZU5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RQYWNrYWdlKHBhY2thZ2VOYW1lLCBzZXQpOwotICAgIH0KLQlAT3ZlcnJpZGUKLQkgIHB1YmxpYyBFTGlzdDxFT2JqZWN0PiBlQ29udGVudHMoKQotCSAgewotCSAgICBpZiAoZUNvbnRlbnRzID09IG51bGwpCi0JICAgIHsKLQkgICAgICBlQ29udGVudHMgPSBFQ29udGVudHNFTGlzdC5jcmVhdGVFQ29udGVudHNFTGlzdCh0aGlzKTsKLQkgICAgfQotCSAgICByZXR1cm4gZUNvbnRlbnRzOwotCSAgfQotCi0JICBAT3ZlcnJpZGUKLQkgIHB1YmxpYyBFTGlzdDxFT2JqZWN0PiBlQ3Jvc3NSZWZlcmVuY2VzKCkKLQkgIHsKLQkgICAgaWYgKGVDcm9zc1JlZmVyZW5jZXMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDcm9zc1JlZmVyZW5jZXMgPSBFQ3Jvc3NSZWZlcmVuY2VFTGlzdC5jcmVhdGVFQ3Jvc3NSZWZlcmVuY2VFTGlzdCh0aGlzKTsKLQkgICAgfQotCSAgICByZXR1cm4gZUNyb3NzUmVmZXJlbmNlczsKLQkgIH0KLQotfSAvL0phdmFQYWNrYWdlSW1wbAotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFyYW1ldGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFQYXJhbWV0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmIyY2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFQYXJhbWV0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotCi0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFyYW1ldGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFNZXRob2RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVBhcmFtZXRlckltcGwgZXh0ZW5kcyBFUGFyYW1ldGVySW1wbCBpbXBsZW1lbnRzIEphdmFQYXJhbWV0ZXIgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSU5BTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfRUZMQUcgPSAxIDw8IDEwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtZXRlcktpbmQoKSA8ZW0+UGFyYW1ldGVyIEtpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtZXRlcktpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmQgUEFSQU1FVEVSX0tJTkRfRURFRkFVTFQgPSBKYXZhUGFyYW1ldGVyS2luZC5JTl9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFQYXJhbWV0ZXJLaW5kIHBhcmFtZXRlcktpbmQgPSBQQVJBTUVURVJfS0lORF9FREVGQVVMVDsKLQlwcm90ZWN0ZWQgSmF2YVBhcmFtZXRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9QQVJBTUVURVI7Ci0JfQotCi0JcHVibGljIEphdmFIZWxwZXJzIGdldEphdmFUeXBlKCkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKWdldEVUeXBlKCk7Ci0JfQotICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7Ci0gICAgcmV0dXJuIChlQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBNZXRob2QpID8gKChNZXRob2QpZUNvbnRhaW5lcigpKS5nZXROYW1lKCkgKyAiLiIgKyB0aGlzLmdldE5hbWUoKSA6IHRoaXMuZ2V0TmFtZSgpOwotICB9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRklOQUw6Ci0JCQkJcmV0dXJuIGlzRmluYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVyS2luZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19GSU5BTDoKLQkJCQlzZXRGaW5hbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlzZXRQYXJhbWV0ZXJLaW5kKChKYXZhUGFyYW1ldGVyS2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0ZJTkFMOgotCQkJCXNldEZpbmFsKEZJTkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlzZXRQYXJhbWV0ZXJLaW5kKFBBUkFNRVRFUl9LSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0ZJTkFMOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKSAhPSBGSU5BTF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1BBUkFNRVRFUl9LSU5EOgotCQkJCXJldHVybiBwYXJhbWV0ZXJLaW5kICE9IFBBUkFNRVRFUl9LSU5EX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIHBhcmFtZXRlciB0eXBlIGFuIGFycmF5IHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGdldEphdmFUeXBlKCkuaXNBcnJheSgpOwotCX0KLQkvKioKLQkgKiBJcyB0aGlzIGEgcmV0dXJuIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JldHVybigpIHsKLQkJcmV0dXJuIEphdmFQYXJhbWV0ZXJLaW5kLlJFVFVSTiA9PSBnZXRQYXJhbWV0ZXJLaW5kKCkuZ2V0VmFsdWUoKTsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbChib29sZWFuIG5ld0ZpbmFsKSB7Ci0JCWJvb2xlYW4gb2xkRmluYWwgPSAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdGaW5hbCkgZUZsYWdzIHw9IEZJTkFMX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RklOQUxfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19GSU5BTCwgb2xkRmluYWwsIG5ld0ZpbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFQYXJhbWV0ZXJLaW5kIGdldFBhcmFtZXRlcktpbmQoKSB7Ci0JCXJldHVybiBwYXJhbWV0ZXJLaW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcktpbmQoSmF2YVBhcmFtZXRlcktpbmQgbmV3UGFyYW1ldGVyS2luZCkgewotCQlKYXZhUGFyYW1ldGVyS2luZCBvbGRQYXJhbWV0ZXJLaW5kID0gcGFyYW1ldGVyS2luZDsKLQkJcGFyYW1ldGVyS2luZCA9IG5ld1BhcmFtZXRlcktpbmQgPT0gbnVsbCA/IFBBUkFNRVRFUl9LSU5EX0VERUZBVUxUIDogbmV3UGFyYW1ldGVyS2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1BBUkFNRVRFUl9LSU5ELCBvbGRQYXJhbWV0ZXJLaW5kLCBwYXJhbWV0ZXJLaW5kKSk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIHJlZmxlY3Rpb24gYWRhcHRlcnMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBSZWFkQWRhcHRvciBnZXRSZWFkQWRhcHRlcigpIHsKLQkJcmV0dXJuIChSZWFkQWRhcHRvcikgRWNvcmVVdGlsLmdldFJlZ2lzdGVyZWRBZGFwdGVyKGVDb250YWluZXIoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIFJFRkxFQ1RFRF9CQVNFID0gMHgxLCBSRUZMRUNURURfUEFSQU1fTkFNRSA9IDB4MjsKLQotCXByb3RlY3RlZCBpbnQgcmVmbGVjdGlvblN0YXR1cyA9IFJFRkxFQ1RFRF9CQVNFOyAgLy8gQXQgdGhpcyB0aW1lIGJhc2UgcmVmbGVjdGlvbgotCQkJCQkJCQkJCQkJCSAgLy8gaXMgcGVyZm9ybWVkIGF0IGNyZWF0aW9uLgotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdFBhcmFtTmFtZSgpIHsKLQkJLy8gV2Ugb25seSB3YW50IHRoZSB0ZXN0aW5nIG9mIHRoZSBoYXNSZWZsZWN0ZWQgYW5kIGdldCByZWFkYWRhcHRlciB0byBiZSBzeW5jKHRoaXMpIHNvIHRoYXQKLQkJLy8gaXQgaXMgc2hvcnQgYW5kIG5vIGRlYWRsb2NrIHBvc3NpYmlsaXR5ICh0aGlzIGlzIGJlY2F1c2UgdGhlIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBhZGFwdGVyIG1heSBnbwotCQkvLyBiYWNrIHRvIHRoZSBjb250YWluaW5nIGphdmEgY2xhc3MgdG8gZ2V0IGl0cyByZWZsZWN0aW9uIGFkYXB0ZXIsIHdoaWNoIHdvdWxkIGxvY2sgb24gaXRzZWxmLiBTbwotCQkvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNlY3Rpb25zIHRoYXQgYXJlIHN5bmModGhpcykgdG8gbm90IGJlIGRlYWRsb2NrYWJsZSBieSBub3QgZG9pbmcgc2lnbmlmaWNhbnQgd29yawotCQkvLyBkdXJpbmcgdGhlIHN5bmMuCi0JCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoKHJlZmxlY3Rpb25TdGF0dXMgJiBSRUZMRUNURURfUEFSQU1fTkFNRSkgPT0gMCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSAoKElKYXZhTWV0aG9kQWRhcHRlcikgcmVhZEFkYXB0b3IpLnJlZmxlY3RQYXJhbU5hbWVzSWZOZWNlc3NhcnkoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCS8vIERvbid0IHdhbnQgdG8gc2V0IGl0IGZhbHNlLiBUaGF0IGlzIGpvYiBvZiByZWZsZWN0aW9uIGFkYXB0ZXIuIE90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIGEgcmFjZS4KLQkJCQkvLyBOb3JtYWxseSB3ZSB3b3VsZG4ndCBuZWVkIHRvIHNldCB0aGlzIGJlY2F1c2UgaXQgd291bGQgYmUgc2V0IGR1cmluZyB0aGUgcmVmbGVjdFBhcmFtTmFtZXNJZk5lY2Vzc2FyeSwgYnV0Ci0JCQkJLy8gaW4gY2FzZSB0aGVyZSB3YXMgYSBwcm9ibGVtIHdlIG1hcmsgaXQgc3RpbGwgcmVmbGVjdGVkIHNvIHdlIGRvbid0IHRyeSBhZ2Fpbi4KLQkJCQlpZiAoc2V0UmVmbGVjdGVkKQotCQkJCQlyZWZsZWN0aW9uU3RhdHVzIHw9IChSRUZMRUNURURfQkFTRSB8IFJFRkxFQ1RFRF9QQVJBTV9OQU1FKTsgLy8gV2UgY2FuIGJlIGNlcnRhaW4gYmFzZSB3aWxsIGJlIGRvbmUgYnkgcmVmbGVjdCBnZW5lcmF0ZWQgaWYgbm90IGFscmVhZHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGRvbmUuCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZWZsZWN0UGFyYW1OYW1lKCk7Ci0JCXJldHVybiBzdXBlci5nZXROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIuc2V0TmFtZShuYW1lKTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCSAgIHJlZmxlY3Rpb25TdGF0dXMgfD0gKFJFRkxFQ1RFRF9QQVJBTV9OQU1FKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaW5hbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbWV0ZXJLaW5kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbWV0ZXJLaW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCUBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDb250ZW50cygpCi0JICB7Ci0JICAgIGlmIChlQ29udGVudHMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDb250ZW50cyA9IEVDb250ZW50c0VMaXN0LmNyZWF0ZUVDb250ZW50c0VMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ29udGVudHM7Ci0JICB9Ci0KLQkgIEBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDcm9zc1JlZmVyZW5jZXMoKQotCSAgewotCSAgICBpZiAoZUNyb3NzUmVmZXJlbmNlcyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUNyb3NzUmVmZXJlbmNlcyA9IEVDcm9zc1JlZmVyZW5jZUVMaXN0LmNyZWF0ZUVDcm9zc1JlZmVyZW5jZUVMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ3Jvc3NSZWZlcmVuY2VzOwotCSAgfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhkM2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUmVmRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEudXRpbC5KYXZhQ29udGV4dDsKLQotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSmF2YVJlZkZhY3RvcnkgewotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhUmVmRmFjdG9yeSB0aGVKYXZhUmVmRmFjdG9yeSA9IChKYXZhUmVmRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiamF2YS54bWkiKTsgCi0JCQlpZiAodGhlSmF2YVJlZkZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVKYXZhUmVmRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBKYXZhUmVmRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlcyBhYm91dCBUeXBlIFVSSSdzLgotCSAqIDxwPgotCSAqIFRoZSBmb3JtYXQgb2YgYSB0eXBlIHVyaSBpczogImphdmE6L3BhY2thZ2UjY2xhc3NuYW1lIi4gInBhY2thZ2UiIGlzIGVpdGhlciB0aGUgcGFja2FnZSBuYW1lLAotCSAqIHdpdGggJy4nIGZvciBwYWNrYWdlIHNlcGFyYXRvciAoZS5nLiAiamF2YTovYS5iI1hZWiIpLiBPciBmb3IgcHJpbWl0aXZlIChlLmcuICJqYXZhOi8jaW50Iikgb3IKLQkgKiBmb3IgZGVmYXVsdCBwYWNrYWdlIChlLmcuICJqYXZhOi8jWFlaIikuCi0JICogPHA+Ci0JICogVGhlIGNsYXNzbmFtZSBoYXMgc29tZSBzcGVjaWFsIGNoYW5nZXMuIEZpcnN0IGl0IG11c3QgdXNlIHJlZmxlY3Rpb24gZm9ybWF0IHdoaWNoIG1lYW5zCi0JICogdGhhdCBhbnkgaW5uZXIgY2xhc3MgbXVzdCB1c2UgdGhlICckJyBmb3JtYXQsIGkuZS4gIkEuQiIgbXVzdCBiZSAiQSRCIi4KLQkgKiA8cD4KLQkgKiBOZXh0IGlmIHRoZXJlIGlzCi0JICogYSBnZW5lcmljIGludm9sdmVkIHRoZW4gaXQgbXVzdCBiZSBjaGFuZ2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5OiAiQTw/IGV4dGVuZHMgYS5CPiIgd2lsbAotCSAqIGJlIGNoYW5nZWQgdG8gIkF7PyBleHRlbmRzIGEhQn0iLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIGZpcnN0IHRoYXQgJzwnIGFuZCAnPicgYXJlCi0JICogaW52YWxpZCBpbiBhIGZyYWdtZW50IChpZCkgb2YgYSBVUkkuIFNvIHdlIHJlcGxhY2UgdGhlbSB3aXRoICd7fScuIE5leHQgYmVjYXVzZSB3ZSB1c2UKLQkgKiB0aGUgZnJhZ21lbnQgIkEuZmllbGQiIG9yICJBLm1ldGhvZCgiIHRvIG1lYW4gYSBmaWVsZCBvciBtZXRob2QgaWQsIHdlIGNhbid0IGhhdmUgdGhlCi0JICogJy4nIGluIHRoZSBnZW5lcmljIHBvcnRpb24uIElmIGl0IHdhcyB0aGVyZSB3ZSBjb3VsZG4ndCBxdWlja2x5IGZpbmQgdGhlIGFwcHJvcHJpYXRlIG5lc3RpbmcKLQkgKiBvZiB0aGUgZ2VuZXJpYydzICd7fScgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhbm90aGVyIGdlbmVyaWMgd2l0aGluIHRoZSBnZW5lcmljLCBhbmQgdGhlbgotCSAqIHNheSB0byBmaW5kIHRoZSAnLicgYWZ0ZXIgdGhhdCBuZXN0ZWQgc2V0LgotCSAqLwotCi0JCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+R0VORVJJQ19JRF9TRVBBUkFUT1I8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBHRU5FUklDX0lEX1NFUEFSQVRPUiA9ICchJzsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5HRU5FUklDX1NFUEFSQVRPUjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEdFTkVSSUNfU0VQQVJBVE9SID0gJy4nOwotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPkdFTkVSSUNfSURfRU5EPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgR0VORVJJQ19JRF9FTkQgPSAnfSc7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+R0VORVJJQ19FTkQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBHRU5FUklDX0VORCA9ICc+JzsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5HRU5FUklDX0lEX1NUQVJUPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgR0VORVJJQ19JRF9TVEFSVCA9ICd7JzsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5HRU5FUklDX1NUQVJUPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgR0VORVJJQ19TVEFSVCA9ICc8JzsKLQkKLQotCXB1YmxpYyBKYXZhUmVmRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1M6IHJldHVybiBjcmVhdGVKYXZhQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVI6IHJldHVybiBjcmVhdGVJbml0aWFsaXplcigpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUjogcmV0dXJuIGNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EOiByZXR1cm4gY3JlYXRlTWV0aG9kKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEOiByZXR1cm4gY3JlYXRlRmllbGQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0s6IHJldHVybiBjcmVhdGVCbG9jaygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UOiByZXR1cm4gY3JlYXRlQ29tbWVudCgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlQ6IHJldHVybiBjcmVhdGVTdGF0ZW1lbnQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFOiByZXR1cm4gY3JlYXRlSmF2YVBhY2thZ2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEU6IHJldHVybiBjcmVhdGVKYXZhRGF0YVR5cGUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRTogcmV0dXJuIGNyZWF0ZUFycmF5VHlwZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuVFlQRV9LSU5EOgotCQkJCXJldHVybiBjcmVhdGVUeXBlS2luZEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1ZJU0lCSUxJVFlfS0lORDoKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YVZpc2liaWxpdHlLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX0tJTkQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFQYXJhbWV0ZXJLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpUWVBFX0pBVkFfSEVMUEVSUzoKLQkJCQlyZXR1cm4gY3JlYXRlSlR5cGVKYXZhSGVscGVyc0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KVFlQRV9MSVNUOgotCQkJCXJldHVybiBjcmVhdGVKVHlwZUxpc3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlRZUEVfS0lORDoKLQkJCQlyZXR1cm4gY29udmVydFR5cGVLaW5kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9WSVNJQklMSVRZX0tJTkQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRKYXZhVmlzaWJpbGl0eUtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9LSU5EOgotCQkJCXJldHVybiBjb252ZXJ0SmF2YVBhcmFtZXRlcktpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KVFlQRV9KQVZBX0hFTFBFUlM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRKVHlwZUphdmFIZWxwZXJzVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSlRZUEVfTElTVDoKLQkJCQlyZXR1cm4gY29udmVydEpUeXBlTGlzdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZShKYXZhSGVscGVycyBjb21wb25lbnRUeXBlKSB7Ci0JCUFycmF5VHlwZSBhdCA9IGNyZWF0ZUFycmF5VHlwZSgpOwotCQkKLQkJU3RyaW5nIGNvbXB1dGVkTmFtZSA9IGNvbXBvbmVudFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIltdIjsKLQkJYXQuc2V0TmFtZShjb21wdXRlZE5hbWUpOwotCQlyZXR1cm4gYXQ7Ci0JfQotCXB1YmxpYyBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKEphdmFIZWxwZXJzIGZpbmFsQ29tcG9uZW50VHlwZSwgaW50IGRpbWVuc2lvbnMpIHsKLQkJQXJyYXlUeXBlIGF0ID0gY3JlYXRlQXJyYXlUeXBlKCk7Ci0JCQotCQlTdHJpbmcgY29tcHV0ZWROYW1lID0gZmluYWxDb21wb25lbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspewotCQkJY29tcHV0ZWROYW1lID0gY29tcHV0ZWROYW1lICsgIltdIjsKLQkJfQotCQlhdC5zZXROYW1lKGNvbXB1dGVkTmFtZSk7Ci0JCXJldHVybiBhdDsKLQl9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgamF2YSBjb250ZXh0Ci0gICAqIEByZXR1cm4KLSAgICogCi0gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQVBJIHtAbGluayBKYXZhQ29udGV4dCNjcmVhdGVKYXZhQ29udGV4dCgpfSBpbnN0ZWFkLgotICAgKiBAc2luY2UgMS4yLjAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlSmF2YUNvbnRleHQoKSB7Ci0gICAgcmV0dXJuIEphdmFDb250ZXh0LmNyZWF0ZUphdmFDb250ZXh0KCk7Ci0gIH0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENsYXNzIGZvciB0aGUgSmF2YSByZWZlY3Rpb24gYWRhcHRlciBmYWN0b3J5LgotCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQVBJIHtAbGluayBKYXZhQ29udGV4dCNnZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcygpfSBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhQ29udGV4dC5nZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIENsYXNzIGZvciB0aGUgSmF2YSByZWZlY3Rpb24gYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQVBJIHtAbGluayBKYXZhQ29udGV4dCNzZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcyhDbGFzcyl9IGluc3RlYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeUNsYXNzKENsYXNzIGphdmFSZWZsZWN0aW9uRmFjdG9yeUNsYXNzKSB7Ci0JCUphdmFDb250ZXh0LnNldFJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeUNsYXNzKGphdmFSZWZsZWN0aW9uRmFjdG9yeUNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1ldGhvZCBjcmVhdGVNZXRob2QoKSB7Ci0JCU1ldGhvZEltcGwgbWV0aG9kID0gbmV3IE1ldGhvZEltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUphdmFDbGFzcygpIHsKLQkJSmF2YUNsYXNzSW1wbCBqYXZhQ2xhc3MgPSBuZXcgSmF2YUNsYXNzSW1wbCgpOwotCQlyZXR1cm4gamF2YUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBGaWVsZCBjcmVhdGVGaWVsZCgpIHsKLQkJRmllbGRJbXBsIGZpZWxkID0gbmV3IEZpZWxkSW1wbCgpOwotCQlyZXR1cm4gZmllbGQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEJsb2NrIGNyZWF0ZUJsb2NrKCkgewotCQlCbG9ja0ltcGwgYmxvY2sgPSBuZXcgQmxvY2tJbXBsKCk7Ci0JCXJldHVybiBibG9jazsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29tbWVudCBjcmVhdGVDb21tZW50KCkgewotCQlDb21tZW50SW1wbCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KCkgewotCQlTdGF0ZW1lbnRJbXBsIHN0YXRlbWVudCA9IG5ldyBTdGF0ZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBzdGF0ZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKCkgewotCQlJbml0aWFsaXplckltcGwgaW5pdGlhbGl6ZXIgPSBuZXcgSW5pdGlhbGl6ZXJJbXBsKCk7Ci0JCXJldHVybiBpbml0aWFsaXplcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhcmFtZXRlciBjcmVhdGVKYXZhUGFyYW1ldGVyKCkgewotCQlKYXZhUGFyYW1ldGVySW1wbCBqYXZhUGFyYW1ldGVyID0gbmV3IEphdmFQYXJhbWV0ZXJJbXBsKCk7Ci0JCXJldHVybiBqYXZhUGFyYW1ldGVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKCkgewotCQlBcnJheVR5cGVJbXBsIGFycmF5VHlwZSA9IG5ldyBBcnJheVR5cGVJbXBsKCk7Ci0JCXJldHVybiBhcnJheVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFR5cGVLaW5kIGNyZWF0ZVR5cGVLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVR5cGVLaW5kIHJlc3VsdCA9IFR5cGVLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlS2luZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhVmlzaWJpbGl0eUtpbmQgY3JlYXRlSmF2YVZpc2liaWxpdHlLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUphdmFWaXNpYmlsaXR5S2luZCByZXN1bHQgPSBKYXZhVmlzaWJpbGl0eUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEphdmFWaXNpYmlsaXR5S2luZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhUGFyYW1ldGVyS2luZCBjcmVhdGVKYXZhUGFyYW1ldGVyS2luZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlKYXZhUGFyYW1ldGVyS2luZCByZXN1bHQgPSBKYXZhUGFyYW1ldGVyS2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SmF2YVBhcmFtZXRlcktpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgY3JlYXRlSlR5cGVKYXZhSGVscGVyc0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEpUeXBlSmF2YUhlbHBlcnNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgY3JlYXRlSlR5cGVMaXN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoTGlzdClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRKVHlwZUxpc3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFEYXRhVHlwZSBjcmVhdGVKYXZhRGF0YVR5cGUoKSB7Ci0JCUphdmFEYXRhVHlwZUltcGwgamF2YURhdGFUeXBlID0gbmV3IEphdmFEYXRhVHlwZUltcGwoKTsKLQkJcmV0dXJuIGphdmFEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgY3JlYXRlSmF2YVBhY2thZ2UoKSB7Ci0JCUphdmFQYWNrYWdlSW1wbCBqYXZhUGFja2FnZSA9IG5ldyBKYXZhUGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIGphdmFQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKYXZhUmVmUGFja2FnZSBnZXRKYXZhUmVmUGFja2FnZSgpIHsKLQkJcmV0dXJuIChKYXZhUmVmUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZGYWN0b3J5IGdldEFjdGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNjcmVhdGVDbGFzc1JlZihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQkJSmF2YUNsYXNzIHJlZiA9IGNyZWF0ZUphdmFDbGFzcygpOwotCQkoKEludGVybmFsRU9iamVjdCkgcmVmKS5lU2V0UHJveHlVUkkoY3JlYXRlVHlwZVVSSSh0YXJnZXROYW1lKSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIHJlZmxlY3RUeXBlKFN0cmluZyBhUXVhbGlmaWVkTmFtZSwgRU9iamVjdCByZWxhdGVkT2JqZWN0KSB7Ci0JCVJlc291cmNlIHIgPSByZWxhdGVkT2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAociAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZVNldCBycyA9IHIuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChycyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlZmxlY3RUeXBlKGFRdWFsaWZpZWROYW1lLCBycyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyByZWZsZWN0VHlwZShTdHJpbmcgYVF1YWxpZmllZE5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlpZiAoYVF1YWxpZmllZE5hbWUgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gYVF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQkJCWlmIChpbmRleCA+IDApCi0JCQkJcmV0dXJuIHJlZmxlY3RUeXBlKGFRdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCksIGFRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhpbmRleCArIDEsIGFRdWFsaWZpZWROYW1lLmxlbmd0aCgpKSwgc2V0KTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gcmVmbGVjdFR5cGUoIiIsIGFRdWFsaWZpZWROYW1lLCBzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I3JlZmxlY3RUeXBlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgcmVmbGVjdFR5cGUoU3RyaW5nIGFQYWNrYWdlTmFtZSwgU3RyaW5nIGFUeXBlTmFtZSwgUmVzb3VyY2VTZXQgc2V0KSB7Ci0JCWlmIChhVHlwZU5hbWUgIT0gbnVsbCAmJiBhUGFja2FnZU5hbWUgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdC5KYXZhSW5pdC5pbml0KCk7Ci0JCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBzZXQuZ2V0RU9iamVjdChjcmVhdGVUeXBlVVJJKGFQYWNrYWdlTmFtZSwgYVR5cGVOYW1lKSwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFBhY2thZ2UoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSByZWZsZWN0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdC5KYXZhSW5pdC5pbml0KCk7Ci0JCQlyZXR1cm4gKEphdmFQYWNrYWdlKSBzZXQuZ2V0RU9iamVjdChjcmVhdGVQYWNrYWdlVVJJKHBhY2thZ2VOYW1lKSwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZVR5cGVVUkkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVR5cGVVUkkoU3RyaW5nIGFRdWFsaWZpZWROYW1lKSB7Ci0JCS8vIGZvciBuZWVkIHRvIGp1c3QgdG9sZXJhdGUgZ2VuZXJpY3MgKGkuZS4gIjwuLi4+Ii4gRnVsbHkgc3VwcG9ydCBsYXRlci4KLQkJLy9JbiB0aGlzIGNhc2UgdG9sZXJhdGUgbWVhbnMgaWdub3JlIHRoZSBwYXJhbWV0ZXIgdHlwZXMuCi0JCWludCBnZW5OZHggPSBhUXVhbGlmaWVkTmFtZS5pbmRleE9mKEdFTkVSSUNfU1RBUlQpOwotCQlpbnQgcGtnTmR4ID0gZ2VuTmR4ID09IC0xID8gYVF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoJy4nKSA6IGFRdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCcuJywgZ2VuTmR4KTsKLQkJaWYgKHBrZ05keCA+IC0xKQotCQkJcmV0dXJuIGNyZWF0ZVR5cGVVUkkoYVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKDAsIHBrZ05keCksIGdlbk5keCA9PSAtMSA/IGFRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhwa2dOZHgrMSkgOiBhUXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcocGtnTmR4KzEsIGdlbk5keCkpOwotCQllbHNlCi0JCQlyZXR1cm4gY3JlYXRlVHlwZVVSSShudWxsLCBhUXVhbGlmaWVkTmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZVR5cGVVUkkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVR5cGVVUkkoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJU3RyaW5nW10gcGtnbmFtZSA9IG51bGw7Ci0JCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkKLQkJCXBrZ25hbWUgPSBuZXcgU3RyaW5nW10ge3BhY2thZ2VOYW1lfTsKLQkJcmV0dXJuIFVSSS5jcmVhdGVIaWVyYXJjaGljYWxVUkkoSkFWQV9QUk9UT0NPTF9VUklfU0NIRU1FLCBudWxsLCBudWxsLCBwa2duYW1lLCBudWxsLCBjcmVhdGVUeXBlTmFtZSh0eXBlTmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBVUkknZCB0eXBlIG5hbWUgZnJvbSBhIHJlZ3VsYXIgdHlwZW5hbWUuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGZyaWVuZHMgb2YgdGhlIEltcGwgcGFja2FnZS4KLQkgKiBAcGFyYW0gdHlwZU5hbWUgdHlwZSBuYW1lLCBubyBwYWNrYWdlIGFsbG93ZWQsIGFuZCBtdXN0IGJlIGluIGZvcm0gZm9yIHJlZmxlY3Rpb24gKGkuZS4gJyQnIG5vdCAnLicgdG8gc2VwYXJhdGUgb3V0ZXIgYW5kIGlubmVyIGNsYXNzZXMpLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSkgewotCi0JCWludCBnZW5TdGFydCA9IHR5cGVOYW1lLmluZGV4T2YoR0VORVJJQ19TVEFSVCk7Ci0JCWlmIChnZW5TdGFydCA+IC0xKSB7Ci0JCQljaGFyW10gY2hOYW1lID0gbmV3IGNoYXJbdHlwZU5hbWUubGVuZ3RoKCldOwotCQkJdHlwZU5hbWUuZ2V0Q2hhcnMoMCwgY2hOYW1lLmxlbmd0aCwgY2hOYW1lLCAwKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hOYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3dpdGNoIChjaE5hbWVbaV0pIHsKLQkJCQkJY2FzZSBHRU5FUklDX1NUQVJUOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19JRF9TVEFSVDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEdFTkVSSUNfRU5EOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19JRF9FTkQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBHRU5FUklDX1NFUEFSQVRPUjoKLQkJCQkJCWNoTmFtZVtpXSA9IEdFTkVSSUNfSURfU0VQQVJBVE9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQl0eXBlTmFtZSA9IG5ldyBTdHJpbmcoY2hOYW1lKTsKLQkJfQotCQlyZXR1cm4gdHlwZU5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2dldFR5cGVOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZShVUkkgdHlwZVVSSSkgewotCQlpZiAoaXNUeXBlVVJJKHR5cGVVUkkpKSB7Ci0JCQlyZXR1cm4gcHJpbUdldFR5cGVOYW1lKHR5cGVVUkkuZnJhZ21lbnQoKSk7Ci0JCX0gZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0eXBlVVJJLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdHlwZSBuYW1lIGZyb20gVVJJJ2QgdHlwZW5hbWUuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGZyaWVuZHMgb2YgdGhlIEltcGwgcGFja2FnZS4KLQkgKiBAcGFyYW0gdHlwZSB1cmkgZnJhZ21lbnQgdmFsdWUgZm9yIHR5cGUgbmFtZS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0VHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCWludCBnZW5TdGFydCA9IHR5cGVOYW1lLmluZGV4T2YoR0VORVJJQ19JRF9TVEFSVCk7Ci0JCWlmIChnZW5TdGFydCA+IC0xKSB7Ci0JCQljaGFyW10gY2hOYW1lID0gbmV3IGNoYXJbdHlwZU5hbWUubGVuZ3RoKCldOwotCQkJdHlwZU5hbWUuZ2V0Q2hhcnMoMCwgY2hOYW1lLmxlbmd0aCwgY2hOYW1lLCAwKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hOYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3dpdGNoIChjaE5hbWVbaV0pIHsKLQkJCQkJY2FzZSBHRU5FUklDX0lEX1NUQVJUOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19TVEFSVDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEdFTkVSSUNfSURfRU5EOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19FTkQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBHRU5FUklDX0lEX1NFUEFSQVRPUjoKLQkJCQkJCWNoTmFtZVtpXSA9IEdFTkVSSUNfU0VQQVJBVE9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQl0eXBlTmFtZSA9IG5ldyBTdHJpbmcoY2hOYW1lKTsKLQkJfQotCQlyZXR1cm4gdHlwZU5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2dldFBhY2thZ2VOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShVUkkgamF2YVVSSSkgewotCQlpZiAoaXNUeXBlVVJJKGphdmFVUkkpIHx8IGlzUGFja2FnZVVSSShqYXZhVVJJKSkgewotCQkJaWYgKGphdmFVUkkuc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJCXJldHVybiBqYXZhVVJJLnNlZ21lbnQoMCk7Ci0JCQl9IGVsc2UgaWYgKGphdmFVUkkuc2VnbWVudENvdW50KCkgPT0gMCkKLQkJCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQJCi0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqYXZhVVJJLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oamF2YVVSSS50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjZ2V0RnVsbFR5cGVOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVHlwZU5hbWUoVVJJIHR5cGVVUkkpIHsKLQkJU3RyaW5nIHBrZ05hbWUgPSBnZXRQYWNrYWdlTmFtZSh0eXBlVVJJKTsKLQkJaWYgKCFpc1R5cGVVUkkodHlwZVVSSSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHR5cGVVUkkudG9TdHJpbmcoKSk7Ci0JCQotCQlpZiAocGtnTmFtZS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gcGtnTmFtZSsnLicrZ2V0VHlwZU5hbWUodHlwZVVSSSk7Ci0JCWVsc2UKLQkJCXJldHVybiB0eXBlVVJJLmZyYWdtZW50KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZVBhY2thZ2VVUkkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVBhY2thZ2VVUkkoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCVN0cmluZ1tdIHBrZ25hbWUgPSBudWxsOwotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApCi0JCQlwa2duYW1lID0gbmV3IFN0cmluZ1tdIHtwYWNrYWdlTmFtZX07Ci0JCXJldHVybiBVUkkuY3JlYXRlSGllcmFyY2hpY2FsVVJJKEpBVkFfUFJPVE9DT0xfVVJJX1NDSEVNRSwgbnVsbCwgbnVsbCwgcGtnbmFtZSwgbnVsbCwgSmF2YVBhY2thZ2UuUEFDS0FHRV9JRCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2lzSmF2YVVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSmF2YVVSSShVUkkgdXJpKSB7Ci0JCXJldHVybiBKQVZBX1BST1RPQ09MX1VSSV9TQ0hFTUUuZXF1YWxzKHVyaS5zY2hlbWUoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2lzVHlwZVVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHlwZVVSSShVUkkgdXJpKSB7Ci0JCWlmIChpc0phdmFVUkkodXJpKSkgewotCQkJU3RyaW5nIGZyYWcgPSB1cmkuZnJhZ21lbnQoKTsKLQkJCWlmIChmcmFnICE9IG51bGwgJiYgIUphdmFQYWNrYWdlLlBBQ0tBR0VfSUQuZXF1YWxzKGZyYWcpKSB7Ci0JCQkJaW50IGRlbGltTmR4ID0gZnJhZy5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCQkJaWYgKGRlbGltTmR4ICE9IC0xKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZGVsaW1OZHggPSBmcmFnLmluZGV4T2YoJy8nKTsJLy8gRnJvbSBiZWFuaW5mbyBmb3IgcHJvcGVydHkuCi0JCQkJaWYgKGRlbGltTmR4ICE9IC0xKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2lzUGFja2FnZVVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFja2FnZVVSSShVUkkgdXJpKSB7Ci0JCXJldHVybiBpc0phdmFVUkkodXJpKSAmJiBKYXZhUGFja2FnZS5QQUNLQUdFX0lELmVxdWFscyh1cmkuZnJhZ21lbnQoKSk7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNGQ1MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgSmF2YVJlZlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF2YVJlZlBhY2thZ2UsIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKYXZhUmVmUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgamF2YUNsYXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluaXRpYWxpemVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFQYXJhbWV0ZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZpZWxkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJsb2NrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc3RhdGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFEYXRhVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnJheVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgamF2YUV2ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdHlwZUtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGphdmFWaXNpYmlsaXR5S2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gamF2YVBhcmFtZXRlcktpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBqVHlwZUphdmFIZWxwZXJzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGpUeXBlTGlzdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkJICAgLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcml2YXRlIEphdmFSZWZQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBub3QgdXNlLiBUaGlzIGlzIGhlcmUgb25seSBmb3IgdGhlIHVzZSBvZiB0aGUgb2xkZXIgZGVwcmVjYXRlZCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbC4KLQkgKiBAcGFyYW0gYgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVmUGFja2FnZUltcGwoYm9vbGVhbiBiKSB7Ci0JCXRoaXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGhlcmUgb25seSBmb3Igb2xkZXIgcHJlLUVNRiAyLjIgZ2VuZXJhdGVkIGNvZGUgdGhhdCBhY2Nlc3NlcyB0aGUgcGFja2FnZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHRocm91Z2ggdGhlIGludGVyZmFjZS4gTmV3Ci0JICogY29kZSBzaG91bGQgbm90IHVzZSB0aGlzIGRpcmVjdGx5LgotCSAqIEByZXR1cm4KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBOb3RlOiBOZWVkIHRvIGJlIGNhcmVmdWwgaGVyZS4gSWYgRU1GIGV2ZXIgY2hhbmdlcyBob3cgaXQgZ2VuZXJhdGVzIHRoZSBpbml0IG1ldGhvZCBhbmQgYXNzaWducyB0aGUKLQkJLy8gcGFja2FnZSBpbiBhIGRpZmZlcmVudCB3YXkgdGhlbiB0aGlzIHdpbGwgbmVlZCB0byBjaGFuZ2UgdG9vLgotCQlpZiAoIShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsKSkKLQkJCW5ldyBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gaW5pdEdlbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgaW5pdEdlbigpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJSmF2YVJlZlBhY2thZ2VJbXBsIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBKYXZhUmVmUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBKYXZhUmVmUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUphdmFSZWZQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlSmF2YVJlZlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlSmF2YVJlZlBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUphdmFSZWZQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlyZXR1cm4gamF2YUNsYXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFDbGFzc19LaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YUNsYXNzX1B1YmxpYygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFDbGFzc19GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19JbXBsZW1lbnRzSW50ZXJmYWNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19DbGFzc0ltcG9ydCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19QYWNrYWdlSW1wb3J0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19GaWVsZHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfTWV0aG9kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19Jbml0aWFsaXplcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRGVjbGFyaW5nQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0RlY2xhcmVkQ2xhc3NlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19KYXZhUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRXZlbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19BbGxFdmVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGaWVsZCgpIHsKLQkJcmV0dXJuIGZpZWxkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX0ZpbmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWVsZF9TdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX0phdmFWaXNpYmlsaXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWVsZF9UcmFuc2llbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX1ZvbGF0aWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWVsZF9KYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpZWxkX0luaXRpYWxpemVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfQWJzdHJhY3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfTmF0aXZlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kX1N5bmNocm9uaXplZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9Db25zdHJ1Y3RvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9TdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfSmF2YVZpc2liaWxpdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RfUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhRXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RfU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SmF2YVBhcmFtZXRlcigpIHsKLQkJcmV0dXJuIGphdmFQYXJhbWV0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YVBhcmFtZXRlcl9GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhUGFyYW1ldGVyX1BhcmFtZXRlcktpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqYXZhUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnJheVR5cGUoKSB7Ci0JCXJldHVybiBhcnJheVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJyYXlUeXBlX0FycmF5RGltZW5zaW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFycmF5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFycmF5VHlwZV9Db21wb25lbnRUeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXJyYXlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhRGF0YVR5cGUoKSB7Ci0JCXJldHVybiBqYXZhRGF0YVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhRXZlbnQoKSB7Ci0JCXJldHVybiBqYXZhRXZlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhUGFja2FnZSgpIHsKLQkJcmV0dXJuIGphdmFQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFQYWNrYWdlX0phdmFDbGFzc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YVBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJsb2NrKCkgewotCQlyZXR1cm4gYmxvY2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmxvY2tfU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmxvY2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCbG9ja19OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmxvY2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCbG9ja19Db250ZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWJsb2NrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIHN0YXRlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEluaXRpYWxpemVyKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5pdGlhbGl6ZXJfSXNTdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0aWFsaXplckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEluaXRpYWxpemVyX0phdmFDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluaXRpYWxpemVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5pdGlhbGl6ZXJfU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0SmF2YVZpc2liaWxpdHlLaW5kKCkgewotCQlyZXR1cm4gamF2YVZpc2liaWxpdHlLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldEphdmFQYXJhbWV0ZXJLaW5kKCkgewotCQlyZXR1cm4gamF2YVBhcmFtZXRlcktpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VHlwZUtpbmQoKSB7Ci0JCXJldHVybiB0eXBlS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SlR5cGVMaXN0KCkgewotCQlyZXR1cm4galR5cGVMaXN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SlR5cGVKYXZhSGVscGVycygpIHsKLQkJcmV0dXJuIGpUeXBlSmF2YUhlbHBlcnNFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFSZWZGYWN0b3J5IGdldEphdmFSZWZGYWN0b3J5KCkgewotCQlyZXR1cm4gKEphdmFSZWZGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWphdmFDbGFzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0tJTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fUFVCTElDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0ZJTkFMKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19DTEFTU19JTVBPUlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0ZJRUxEUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19NRVRIT0RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19KQVZBX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fRVZFTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0FMTF9FVkVOVFMpOwotCi0JCWluaXRpYWxpemVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOSVRJQUxJWkVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbml0aWFsaXplckVDbGFzcywgSU5JVElBTElaRVJfX0lTX1NUQVRJQyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW5pdGlhbGl6ZXJFQ2xhc3MsIElOSVRJQUxJWkVSX19KQVZBX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbml0aWFsaXplckVDbGFzcywgSU5JVElBTElaRVJfX1NPVVJDRSk7Ci0KLQkJamF2YVBhcmFtZXRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX1BBUkFNRVRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoamF2YVBhcmFtZXRlckVDbGFzcywgSkFWQV9QQVJBTUVURVJfX0ZJTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhUGFyYW1ldGVyRUNsYXNzLCBKQVZBX1BBUkFNRVRFUl9fUEFSQU1FVEVSX0tJTkQpOwotCi0JCW1ldGhvZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19BQlNUUkFDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX05BVElWRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX1NZTkNIUk9OSVpFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX0ZJTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fQ09OU1RSVUNUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19TVEFUSUMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19QQVJBTUVURVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fSkFWQV9FWENFUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fSkFWQV9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRUNsYXNzLCBNRVRIT0RfX1NPVVJDRSk7Ci0KLQkJZmllbGRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklFTEQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fRklOQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fU1RBVElDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWVsZEVDbGFzcywgRklFTERfX0pBVkFfVklTSUJJTElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmllbGRFQ2xhc3MsIEZJRUxEX19UUkFOU0lFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fVk9MQVRJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpZWxkRUNsYXNzLCBGSUVMRF9fSkFWQV9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmllbGRFQ2xhc3MsIEZJRUxEX19JTklUSUFMSVpFUik7Ci0KLQkJYmxvY2tFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQkxPQ0spOwotCQljcmVhdGVFQXR0cmlidXRlKGJsb2NrRUNsYXNzLCBCTE9DS19fU09VUkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShibG9ja0VDbGFzcywgQkxPQ0tfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJsb2NrRUNsYXNzLCBCTE9DS19fQ09OVEVOVFMpOwotCi0JCWNvbW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NTUVOVCk7Ci0KLQkJc3RhdGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUQVRFTUVOVCk7Ci0KLQkJamF2YVBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQV9QQUNLQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhUGFja2FnZUVDbGFzcywgSkFWQV9QQUNLQUdFX19KQVZBX0NMQVNTRVMpOwotCi0JCWphdmFEYXRhVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0RBVEFfVFlQRSk7Ci0KLQkJYXJyYXlUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSUkFZX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFycmF5VHlwZUVDbGFzcywgQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXJyYXlUeXBlRUNsYXNzLCBBUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRSk7Ci0KLQkJamF2YUV2ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfRVZFTlQpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl0eXBlS2luZEVFbnVtID0gY3JlYXRlRUVudW0oVFlQRV9LSU5EKTsKLQkJamF2YVZpc2liaWxpdHlLaW5kRUVudW0gPSBjcmVhdGVFRW51bShKQVZBX1ZJU0lCSUxJVFlfS0lORCk7Ci0JCWphdmFQYXJhbWV0ZXJLaW5kRUVudW0gPSBjcmVhdGVFRW51bShKQVZBX1BBUkFNRVRFUl9LSU5EKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlqVHlwZUphdmFIZWxwZXJzRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEpUWVBFX0pBVkFfSEVMUEVSUyk7Ci0JCWpUeXBlTGlzdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShKVFlQRV9MSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJamF2YUNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3MoKSk7Ci0JCWphdmFQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVQYXJhbWV0ZXIoKSk7Ci0JCW1ldGhvZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RU9wZXJhdGlvbigpKTsKLQkJZmllbGRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVUeXBlZEVsZW1lbnQoKSk7Ci0JCWNvbW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCbG9jaygpKTsKLQkJc3RhdGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmxvY2soKSk7Ci0JCWphdmFQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFUGFja2FnZSgpKTsKLQkJamF2YURhdGFUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3MoKSk7Ci0JCWFycmF5VHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFDbGFzcygpKTsKLQkJamF2YUV2ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhqYXZhQ2xhc3NFQ2xhc3MsIEphdmFDbGFzcy5jbGFzcywgIkphdmFDbGFzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YUNsYXNzX0tpbmQoKSwgdGhpcy5nZXRUeXBlS2luZCgpLCAia2luZCIsIG51bGwsIDAsIDEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YUNsYXNzX1B1YmxpYygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInB1YmxpYyIsIG51bGwsIDAsIDEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YUNsYXNzX0ZpbmFsKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmluYWwiLCBudWxsLCAwLCAxLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19JbXBsZW1lbnRzSW50ZXJmYWNlcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCBudWxsLCAiaW1wbGVtZW50c0ludGVyZmFjZXMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfQ2xhc3NJbXBvcnQoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImNsYXNzSW1wb3J0IiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX1BhY2thZ2VJbXBvcnRzKCksIHRoaXMuZ2V0SmF2YVBhY2thZ2UoKSwgbnVsbCwgInBhY2thZ2VJbXBvcnRzIiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX0ZpZWxkcygpLCB0aGlzLmdldEZpZWxkKCksIHRoaXMuZ2V0RmllbGRfSmF2YUNsYXNzKCksICJmaWVsZHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfTWV0aG9kcygpLCB0aGlzLmdldE1ldGhvZCgpLCB0aGlzLmdldE1ldGhvZF9KYXZhQ2xhc3MoKSwgIm1ldGhvZHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfSW5pdGlhbGl6ZXJzKCksIHRoaXMuZ2V0SW5pdGlhbGl6ZXIoKSwgdGhpcy5nZXRJbml0aWFsaXplcl9KYXZhQ2xhc3MoKSwgImluaXRpYWxpemVycyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19EZWNsYXJlZENsYXNzZXMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3NfRGVjbGFyaW5nQ2xhc3MoKSwgImRlY2xhcmVkQ2xhc3NlcyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19EZWNsYXJpbmdDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzc19EZWNsYXJlZENsYXNzZXMoKSwgImRlY2xhcmluZ0NsYXNzIiwgbnVsbCwgMCwgMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfSmF2YVBhY2thZ2UoKSwgdGhpcy5nZXRKYXZhUGFja2FnZSgpLCB0aGlzLmdldEphdmFQYWNrYWdlX0phdmFDbGFzc2VzKCksICJqYXZhUGFja2FnZSIsIG51bGwsIDAsIDEsIEphdmFDbGFzcy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfRXZlbnRzKCksIHRoaXMuZ2V0SmF2YUV2ZW50KCksIG51bGwsICJldmVudHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfQWxsRXZlbnRzKCksIHRoaXMuZ2V0SmF2YUV2ZW50KCksIG51bGwsICJhbGxFdmVudHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlFT3BlcmF0aW9uIG9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNOZXN0ZWQiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEZpZWxkKCksICJnZXRGaWVsZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRGaWVsZCgpLCAiZ2V0RmllbGRFeHRlbmRlZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRGaWVsZCgpLCAiZ2V0RmllbGROYW1lZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldEZpZWxkc0V4dGVuZGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRNZXRob2QoKSwgImdldE1ldGhvZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWV0aG9kTmFtZSIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAicGFyYW1ldGVyVHlwZXMiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldE1ldGhvZCgpLCAiZ2V0TWV0aG9kRXh0ZW5kZWQiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1ldGhvZE5hbWUiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKVHlwZUxpc3QoKSwgInBhcmFtZXRlclR5cGVzIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldE1ldGhvZHNFeHRlbmRlZCIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVMaXN0KCksICJnZXRPbmx5U3BlY2lmaWNNZXRob2RzIiwgMCwgMSk7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhTWV0aG9kTmFtZVByZWZpeCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZXhjbHVkZWROYW1lcyIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0TWV0aG9kKCksICJnZXRQdWJsaWNNZXRob2QiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1ldGhvZE5hbWUiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKVHlwZUxpc3QoKSwgInBhcmFtZXRlclR5cGVzIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldFB1YmxpY01ldGhvZHMiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldFB1YmxpY01ldGhvZHNOYW1lZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJnZXRTdXBlcnR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImltcGxlbWVudHNJbnRlcmZhY2UiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgImludGVyZmFjZVR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5mb1N0cmluZyIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaW5oZXJpdHNGcm9tIiwgMCwgMSk7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJqYXZhQ2xhc3MiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzRXhpc3RpbmdUeXBlIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc0ludGVyZmFjZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIG51bGwsICJzZXRTdXBlcnR5cGUiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgImphdmFjbGFzcyIsIDAsIDEpOwotCi0JCWluaXRFQ2xhc3MoaW5pdGlhbGl6ZXJFQ2xhc3MsIEluaXRpYWxpemVyLmNsYXNzLCAiSW5pdGlhbGl6ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRpYWxpemVyX0lzU3RhdGljKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLCAiaXNTdGF0aWMiLCBudWxsLCAwLCAxLCBJbml0aWFsaXplci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5pdGlhbGl6ZXJfSmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzX0luaXRpYWxpemVycygpLCAiamF2YUNsYXNzIiwgbnVsbCwgMCwgMSwgSW5pdGlhbGl6ZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEluaXRpYWxpemVyX1NvdXJjZSgpLCB0aGlzLmdldEJsb2NrKCksIG51bGwsICJzb3VyY2UiLCBudWxsLCAwLCAxLCBJbml0aWFsaXplci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIEphdmFQYXJhbWV0ZXIuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhUGFyYW1ldGVyX0ZpbmFsKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmluYWwiLCBudWxsLCAwLCAxLCBKYXZhUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhUGFyYW1ldGVyX1BhcmFtZXRlcktpbmQoKSwgdGhpcy5nZXRKYXZhUGFyYW1ldGVyS2luZCgpLCAicGFyYW1ldGVyS2luZCIsIG51bGwsIDAsIDEsIEphdmFQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNBcnJheSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhUGFyYW1ldGVyRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzUmV0dXJuIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiZ2V0SmF2YVR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YVBhcmFtZXRlckVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldFF1YWxpZmllZE5hbWUiLCAwLCAxKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZEVDbGFzcywgTWV0aG9kLmNsYXNzLCAiTWV0aG9kIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfQWJzdHJhY3QoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhYnN0cmFjdCIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX05hdGl2ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgIm5hdGl2ZSIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX1N5bmNocm9uaXplZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN5bmNocm9uaXplZCIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX0ZpbmFsKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmluYWwiLCBudWxsLCAwLCAxLCBNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZF9Db25zdHJ1Y3RvcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImNvbnN0cnVjdG9yIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfU3RhdGljKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAic3RhdGljIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfSmF2YVZpc2liaWxpdHkoKSwgdGhpcy5nZXRKYXZhVmlzaWJpbGl0eUtpbmQoKSwgImphdmFWaXNpYmlsaXR5IiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RfUGFyYW1ldGVycygpLCB0aGlzLmdldEphdmFQYXJhbWV0ZXIoKSwgbnVsbCwgInBhcmFtZXRlcnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RfSmF2YUV4Y2VwdGlvbnMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImphdmFFeGNlcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kX0phdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzc19NZXRob2RzKCksICJqYXZhQ2xhc3MiLCBudWxsLCAwLCAxLCBNZXRob2QuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZF9Tb3VyY2UoKSwgdGhpcy5nZXRCbG9jaygpLCBudWxsLCAic291cmNlIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJnZXRDb250YWluaW5nSmF2YUNsYXNzIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCB0aGlzLmdldEphdmFQYXJhbWV0ZXIoKSwgImdldFBhcmFtZXRlciIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1ldGVyTmFtZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiZ2V0UmV0dXJuVHlwZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIG51bGwsICJzZXRSZXR1cm5UeXBlIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAidHlwZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXRTaWduYXR1cmUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzR2VuZXJhdGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgbnVsbCwgInNldElzR2VuZXJhdGVkIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc1ZvaWQiLCAwLCAxKTsKLQotCQlpbml0RUNsYXNzKGZpZWxkRUNsYXNzLCBGaWVsZC5jbGFzcywgIkZpZWxkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZF9GaW5hbCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZpbmFsIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpZWxkX1N0YXRpYygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN0YXRpYyIsIG51bGwsIDAsIDEsIEZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZF9KYXZhVmlzaWJpbGl0eSgpLCB0aGlzLmdldEphdmFWaXNpYmlsaXR5S2luZCgpLCAiamF2YVZpc2liaWxpdHkiLCBudWxsLCAwLCAxLCBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmllbGRfVHJhbnNpZW50KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidHJhbnNpZW50IiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpZWxkX1ZvbGF0aWxlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidm9sYXRpbGUiLCBudWxsLCAwLCAxLCBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmllbGRfSmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzX0ZpZWxkcygpLCAiamF2YUNsYXNzIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpZWxkX0luaXRpYWxpemVyKCksIHRoaXMuZ2V0QmxvY2soKSwgbnVsbCwgImluaXRpYWxpemVyIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGZpZWxkRUNsYXNzLCB0aGlzLmdldEphdmFDbGFzcygpLCAiZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihmaWVsZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc0FycmF5IiwgMCwgMSk7Ci0KLQkJaW5pdEVDbGFzcyhibG9ja0VDbGFzcywgQmxvY2suY2xhc3MsICJCbG9jayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmxvY2tfU291cmNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzb3VyY2UiLCBudWxsLCAwLCAxLCBCbG9jay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmxvY2tfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEJsb2NrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRCbG9ja19Db250ZW50cygpLCB0aGlzLmdldEJsb2NrKCksIG51bGwsICJjb250ZW50cyIsIG51bGwsIDAsIC0xLCBCbG9jay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbW1lbnRFQ2xhc3MsIENvbW1lbnQuY2xhc3MsICJDb21tZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Moc3RhdGVtZW50RUNsYXNzLCBTdGF0ZW1lbnQuY2xhc3MsICJTdGF0ZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhUGFja2FnZUVDbGFzcywgSmF2YVBhY2thZ2UuY2xhc3MsICJKYXZhUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVBhY2thZ2VfSmF2YUNsYXNzZXMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3NfSmF2YVBhY2thZ2UoKSwgImphdmFDbGFzc2VzIiwgbnVsbCwgMCwgLTEsIEphdmFQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhRGF0YVR5cGVFQ2xhc3MsIEphdmFEYXRhVHlwZS5jbGFzcywgIkphdmFEYXRhVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YURhdGFUeXBlRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIiwgMCwgMSk7Ci0KLQkJaW5pdEVDbGFzcyhhcnJheVR5cGVFQ2xhc3MsIEFycmF5VHlwZS5jbGFzcywgIkFycmF5VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJyYXlUeXBlX0FycmF5RGltZW5zaW9ucygpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiYXJyYXlEaW1lbnNpb25zIiwgbnVsbCwgMCwgMSwgQXJyYXlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcnJheVR5cGVfQ29tcG9uZW50VHlwZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoKSwgbnVsbCwgImNvbXBvbmVudFR5cGUiLCBudWxsLCAxLCAxLCBBcnJheVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGFycmF5VHlwZUVDbGFzcywgdGhpcy5nZXRKVHlwZUphdmFIZWxwZXJzKCksICJnZXRGaW5hbENvbXBvbmVudFR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oYXJyYXlUeXBlRUNsYXNzLCB0aGlzLmdldEpUeXBlSmF2YUhlbHBlcnMoKSwgImdldENvbXBvbmVudFR5cGVBc0hlbHBlciIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihhcnJheVR5cGVFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNQcmltaXRpdmVBcnJheSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihhcnJheVR5cGVFQ2xhc3MsIG51bGwsICJzZXRDb21wb25lbnRUeXBlIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiaGVscGVyQ29tcG9uZW50VHlwZSIsIDAsIDEpOwotCi0JCWluaXRFQ2xhc3MoamF2YUV2ZW50RUNsYXNzLCBKYXZhRXZlbnQuY2xhc3MsICJKYXZhRXZlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0odHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuY2xhc3MsICJUeXBlS2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwodHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuQ0xBU1NfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0eXBlS2luZEVFbnVtLCBUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0eXBlS2luZEVFbnVtLCBUeXBlS2luZC5FWENFUFRJT05fTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGphdmFWaXNpYmlsaXR5S2luZEVFbnVtLCBKYXZhVmlzaWJpbGl0eUtpbmQuY2xhc3MsICJKYXZhVmlzaWJpbGl0eUtpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFWaXNpYmlsaXR5S2luZEVFbnVtLCBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVZpc2liaWxpdHlLaW5kRUVudW0sIEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVZpc2liaWxpdHlLaW5kRUVudW0sIEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqYXZhVmlzaWJpbGl0eUtpbmRFRW51bSwgSmF2YVZpc2liaWxpdHlLaW5kLlBBQ0tBR0VfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGphdmFQYXJhbWV0ZXJLaW5kRUVudW0sIEphdmFQYXJhbWV0ZXJLaW5kLmNsYXNzLCAiSmF2YVBhcmFtZXRlcktpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFQYXJhbWV0ZXJLaW5kRUVudW0sIEphdmFQYXJhbWV0ZXJLaW5kLklOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVBhcmFtZXRlcktpbmRFRW51bSwgSmF2YVBhcmFtZXRlcktpbmQuT1VUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVBhcmFtZXRlcktpbmRFRW51bSwgSmF2YVBhcmFtZXRlcktpbmQuSU5PVVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqYXZhUGFyYW1ldGVyS2luZEVFbnVtLCBKYXZhUGFyYW1ldGVyS2luZC5SRVRVUk5fTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoalR5cGVKYXZhSGVscGVyc0VEYXRhVHlwZSwgSmF2YUhlbHBlcnMuY2xhc3MsICJKVHlwZUphdmFIZWxwZXJzIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZShqVHlwZUxpc3RFRGF0YVR5cGUsIExpc3QuY2xhc3MsICJKVHlwZUxpc3QiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9NZXRob2RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvTWV0aG9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDkxNDBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9NZXRob2RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEltcGwgZXh0ZW5kcyBFT3BlcmF0aW9uSW1wbCBpbXBsZW1lbnRzIE1ldGhvZCB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpZ25hdHVyZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Fic3RyYWN0KCkgPGVtPkFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQUJTVFJBQ1RfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWJzdHJhY3QoKSA8ZW0+QWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX0VGTEFHID0gMSA8PCAxMDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05hdGl2ZSgpIDxlbT5OYXRpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmF0aXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTkFUSVZFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05hdGl2ZSgpIDxlbT5OYXRpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmF0aXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOQVRJVkVfRUZMQUcgPSAxIDw8IDExOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3luY2hyb25pemVkKCkgPGVtPlN5bmNocm9uaXplZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTeW5jaHJvbml6ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTWU5DSFJPTklaRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3luY2hyb25pemVkKCkgPGVtPlN5bmNocm9uaXplZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTeW5jaHJvbml6ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNZTkNIUk9OSVpFRF9FRkxBRyA9IDEgPDwgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJTkFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSU5BTF9FRkxBRyA9IDEgPDwgMTM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb25zdHJ1Y3RvcigpIDxlbT5Db25zdHJ1Y3RvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25zdHJ1Y3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENPTlNUUlVDVE9SX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NvbnN0cnVjdG9yKCkgPGVtPkNvbnN0cnVjdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NvbnN0cnVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05TVFJVQ1RPUl9FRkxBRyA9IDEgPDwgMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdGF0aWMoKSA8ZW0+U3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNUQVRJQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdGF0aWMoKSA8ZW0+U3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDX0VGTEFHID0gMSA8PCAxNTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhVmlzaWJpbGl0eSgpIDxlbT5KYXZhIFZpc2liaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFWaXNpYmlsaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZCBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQgPSBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUw7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGlzR2VuZXJhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVZpc2liaWxpdHlLaW5kIGphdmFWaXNpYmlsaXR5ID0gSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1ldGVycygpIDxlbT5QYXJhbWV0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtZXRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwYXJhbWV0ZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFFeGNlcHRpb25zKCkgPGVtPkphdmEgRXhjZXB0aW9uczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhRXhjZXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGphdmFFeGNlcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZSgpIDxlbT5Tb3VyY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJsb2NrIHNvdXJjZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0R2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFic3RyYWN0KGJvb2xlYW4gbmV3QWJzdHJhY3QpIHsKLQkJYm9vbGVhbiBvbGRBYnN0cmFjdCA9IChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0Fic3RyYWN0KSBlRmxhZ3MgfD0gQUJTVFJBQ1RfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5BQlNUUkFDVF9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19BQlNUUkFDVCwgb2xkQWJzdHJhY3QsIG5ld0Fic3RyYWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOYXRpdmVHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgTkFUSVZFX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hdGl2ZShib29sZWFuIG5ld05hdGl2ZSkgewotCQlib29sZWFuIG9sZE5hdGl2ZSA9IChlRmxhZ3MgJiBOQVRJVkVfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdOYXRpdmUpIGVGbGFncyB8PSBOQVRJVkVfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5OQVRJVkVfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTkFUSVZFLCBvbGROYXRpdmUsIG5ld05hdGl2ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFNZTkNIUk9OSVpFRF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZWQoYm9vbGVhbiBuZXdTeW5jaHJvbml6ZWQpIHsKLQkJYm9vbGVhbiBvbGRTeW5jaHJvbml6ZWQgPSAoZUZsYWdzICYgU1lOQ0hST05JWkVEX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3U3luY2hyb25pemVkKSBlRmxhZ3MgfD0gU1lOQ0hST05JWkVEX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+U1lOQ0hST05JWkVEX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NZTkNIUk9OSVpFRCwgb2xkU3luY2hyb25pemVkLCBuZXdTeW5jaHJvbml6ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmFsKGJvb2xlYW4gbmV3RmluYWwpIHsKLQkJYm9vbGVhbiBvbGRGaW5hbCA9IChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0ZpbmFsKSBlRmxhZ3MgfD0gRklOQUxfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5GSU5BTF9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19GSU5BTCwgb2xkRmluYWwsIG5ld0ZpbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvckdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBDT05TVFJVQ1RPUl9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25zdHJ1Y3Rvcihib29sZWFuIG5ld0NvbnN0cnVjdG9yKSB7Ci0JCWJvb2xlYW4gb2xkQ29uc3RydWN0b3IgPSAoZUZsYWdzICYgQ09OU1RSVUNUT1JfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdDb25zdHJ1Y3RvcikgZUZsYWdzIHw9IENPTlNUUlVDVE9SX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+Q09OU1RSVUNUT1JfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQ09OU1RSVUNUT1IsIG9sZENvbnN0cnVjdG9yLCBuZXdDb25zdHJ1Y3RvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGljR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0aWMoYm9vbGVhbiBuZXdTdGF0aWMpIHsKLQkJYm9vbGVhbiBvbGRTdGF0aWMgPSAoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3U3RhdGljKSBlRmxhZ3MgfD0gU1RBVElDX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+U1RBVElDX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NUQVRJQywgb2xkU3RhdGljLCBuZXdTdGF0aWMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGphdmEgY2xhc3MgdGhhdCB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIGluLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YUNsYXNzKCk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGVzIHRvIGVuc3VyZSByZWZsZWN0aW9uIGlzIGRvbmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNBYnN0cmFjdEdlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzQ29uc3RydWN0b3JHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc0ZpbmFsR2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOYXRpdmUoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzTmF0aXZlR2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzU3RhdGljR2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkR2VuKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEphdmFFeGNlcHRpb25zKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBnZXRKYXZhRXhjZXB0aW9uc0dlbigpOwotCX0KLQotCXB1YmxpYyBKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0SmF2YVZpc2liaWxpdHkoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGdldEphdmFWaXNpYmlsaXR5R2VuKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldFBhcmFtZXRlcnMoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGdldFBhcmFtZXRlcnNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50I2dldEVUeXBlKCkKLQkgKi8KLQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0RVR5cGUoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHRoZSBtZXRob2QgbmFtZSBhbmQgaXRzIHBhcmFtZXRlcnMuIGUuZy4gPGNvZGU+IHNldEZpcnN0TmFtZShqYXZhLmxhbmcuU3RyaW5nKSA8Ly9jb2RlPiAuCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoNzUpOwotCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJc2IuYXBwZW5kKCIoIik7Ci0JCUxpc3QgcGFyYW1zID0gZ2V0UGFyYW1ldGVycygpOwotCQlKYXZhUGFyYW1ldGVyIHBhcmFtOwotCQlpbnQgcGFybVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotCQlpbnQgY29tbWFUZXN0ID0gMDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJtU2l6ZTsgaisrKSB7Ci0JCQlpZiAoaiA+IGNvbW1hVGVzdCkgewotCQkJCXNiLmFwcGVuZCgiLCIpOwotCQkJfQotCQkJcGFyYW0gPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldChqKTsKLQkJCS8vRkIgaWYgKHBhcmFtLmlzUmV0dXJuKCkpIHsKLQkJCS8vRkIgY29tbWFUZXN0ICsrOwotCQkJLy9GQiBjb250aW51ZTsKLQkJCS8vRkIgfQotCQkJc2IuYXBwZW5kKCgoSmF2YUhlbHBlcnMpIHBhcmFtLmdldEVUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCIpIik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFBhcmFtZXRlciB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLQkJTGlzdCBwYXJtcyA9IGdldFBhcmFtZXRlcnMoKTsKLQkJSmF2YVBhcmFtZXRlciBwYXJtOwotCQlpbnQgcGFybVNpemUgPSBwYXJtcy5zaXplKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcGFybVNpemU7IGorKykgewotCQkJcGFybSA9IChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoaik7Ci0JCQlpZiAocGFybS5nZXROYW1lKCkuZXF1YWxzKHBhcmFtZXRlck5hbWUpKQotCQkJCXJldHVybiBwYXJtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfUkVGTEVDVEVEID0gMHgwLCBSRUZMRUNURURfQkFTRSA9IDB4MSwgUkVGTEVDVEVEX0dFTkVSQVRFRCA9IDB4MjsKLQotCXByb3RlY3RlZCBpbnQgcmVmbGVjdGlvblN0YXR1cyA9IE5PVF9SRUZMRUNURUQ7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0VmFsdWVzKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICgocmVmbGVjdGlvblN0YXR1cyAmIFJFRkxFQ1RFRF9CQVNFKSA9PSAwKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9IHJlYWRBZGFwdG9yLnJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJLy8gRG9uJ3Qgd2FudCB0byBzZXQgaXQgZmFsc2UuIFRoYXQgaXMgam9iIG9mIHJlZmxlY3Rpb24gYWRhcHRlci4gT3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgYSByYWNlLgotCQkJCWlmIChzZXRSZWZsZWN0ZWQpCi0JCQkJCXJlZmxlY3Rpb25TdGF0dXMgfD0gUkVGTEVDVEVEX0JBU0U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgcmVmbGVjdGlvbiBhZGFwdGVycy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFJlYWRBZGFwdG9yIGdldFJlYWRBZGFwdGVyKCkgewotCQlyZXR1cm4gKFJlYWRBZGFwdG9yKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLQotCS8qCi0JICogVXNlZCBieSByZWZsZWN0aW9uIGFkYXB0ZXIgdG8gY2xlYXIgdGhlIHJlZmxlY3Rpb24uIFRoaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXJzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZWZsZWN0ZWQoYm9vbGVhbiByZWZsZWN0ZWQpIHsKLQkJaWYgKCFyZWZsZWN0ZWQpCi0JCQlyZWZsZWN0aW9uU3RhdHVzID0gTk9UX1JFRkxFQ1RFRDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJldHVybiB0eXBlLgotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRSZXR1cm5UeXBlKCkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBnZXRFVHlwZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewotCQlpZiAoc2lnbmF0dXJlID09IG51bGwpCi0JCQlzaWduYXR1cmUgPSBkb0dldFNpZ25hdHVyZSgpOwotCQlyZXR1cm4gc2lnbmF0dXJlOwotCX0KLQotCS8qKgotCSAqIFJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QudG9TdHJpbmcoKS4KLQkgKiAKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBNZXRob2QuIFRoZSBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIHRoZSBtZXRob2QgYWNjZXNzIG1vZGlmaWVycywgaWYgYW55LCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIHJldHVybiB0eXBlLAotCSAqIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSBjbGFzcyBkZWNsYXJpbmcgdGhlIG1ldGhvZCwgZm9sbG93ZWQgYnkgYSBwZXJpb2QsIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgbmFtZSwgZm9sbG93ZWQgYnkgYQotCSAqIHBhcmVudGhlc2l6ZWQsIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBtZXRob2QncyBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgbWV0aG9kIHRocm93cyBjaGVja2VkIGV4Y2VwdGlvbnMsIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSB3b3JkIHRocm93cyBmb2xsb3dlZCBieSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aHJvd24gZXhjZXB0aW9uIHR5cGVzLgotCSAqIAotCSAqIEZvciBleGFtcGxlOgotCSAqIAotCSAqIHB1YmxpYyBib29sZWFuIGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICogCi0JICogVGhlIGFjY2VzcyBtb2RpZmllcnMgYXJlIHBsYWNlZCBpbiBjYW5vbmljYWwgb3JkZXIgYXMgc3BlY2lmaWVkIGJ5ICJUaGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIi4gVGhpcyBpcyBwdWJsaWMsCi0JICogPHR0PnByb3RlY3RlZDwvL3R0PiBvciA8dHQ+cHJpdmF0ZTwvL3R0PiBmaXJzdCwgYW5kIHRoZW4gb3RoZXIgbW9kaWZpZXJzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IDx0dD5hYnN0cmFjdDwvL3R0PiwgPHR0PnN0YXRpYzwvL3R0PiwgPHR0PmZpbmFsPC8vdHQ+LCA8dHQ+c3luY2hyb25pemVkPC8vdHQ+IDx0dD5uYXRpdmU8Ly90dD4uCi0KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRvR2V0U2lnbmF0dXJlKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN3aXRjaCAoZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpKSB7Ci0JCQljYXNlIEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUM6Ci0JCQkJc2IuYXBwZW5kKCJQdWJsaWMgIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURUQ6Ci0JCQkJc2IuYXBwZW5kKCJQcm90ZWN0ZWQgIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFOgotCQkJCXNiLmFwcGVuZCgiUHJpdmF0ZSAiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSmF2YVZpc2liaWxpdHlLaW5kLlBBQ0tBR0U6Ci0JCQkJc2IuYXBwZW5kKCJQYWNrYWdlICIpOwotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpc0Fic3RyYWN0KCkpCi0JCQlzYi5hcHBlbmQoImFic3RyYWN0ICIpOwotCQlpZiAoaXNTdGF0aWMoKSkKLQkJCXNiLmFwcGVuZCgic3RhdGljICIpOwotCQlpZiAoaXNGaW5hbCgpKQotCQkJc2IuYXBwZW5kKCJmaW5hbCAiKTsKLQkJaWYgKGlzU3luY2hyb25pemVkKCkpCi0JCQlzYi5hcHBlbmQoInN5bmNocm9uaXplZCAiKTsKLQkJaWYgKGlzTmF0aXZlKCkpCi0JCQlzYi5hcHBlbmQoIm5hdGl2ZSAiKTsKLQkJaWYgKGlzVm9pZCgpKQotCQkJc2IuYXBwZW5kKCJ2b2lkICIpOwotCQllbHNlCi0JCQlzYi5hcHBlbmQoZ2V0UmV0dXJuVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSArICIgIik7Ci0JCXNiLmFwcGVuZChnZXRDb250YWluaW5nSmF2YUNsYXNzKCkuZ2V0SmF2YU5hbWUoKSArICIuIik7Ci0JCXNiLmFwcGVuZChnZXROYW1lKCkgKyAiKCIpOwotCQlMaXN0IHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoKTsKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTsKLQkJaW50IHBhcm1TaXplID0gcGFyYW1zLnNpemUoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJtU2l6ZTsgaisrKSB7Ci0JCQlwYXJhbSA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KGopOwotCQkJLy9GQiBpZiAocGFyYW0uaXNSZXR1cm4oKSkKLQkJCS8vRkIgY29udGludWU7IC8vIGxpc3RQYXJhbWV0ZXJzKCkgaW5jbHVkZXMgcmV0dXJuIHR5cGUgaW4gYXJyYXkKLQkJCXNiLmFwcGVuZCgoKEphdmFIZWxwZXJzKSBwYXJhbS5nZXRFVHlwZSgpKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJaWYgKGogPCAocGFyYW1zLnNpemUoKSAtIDEpKSB7Ci0JCQkJc2IuYXBwZW5kKCIsIik7Ci0JCQl9Ci0JCX0KLQkJc2IuYXBwZW5kKCIpIik7Ci0JCUxpc3QgZXhjZXB0aW9ucyA9IGdldEphdmFFeGNlcHRpb25zKCk7Ci0JCUphdmFDbGFzcyBleGNlcHRpb247Ci0JCWlmIChleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCXNiLmFwcGVuZCgiIHRocm93cyAiKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZXhjZXB0aW9ucy5zaXplKCk7IGsrKykgewotCQkJCWV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpIGV4Y2VwdGlvbnMuZ2V0KGspOwotCQkJCXNiLmFwcGVuZChleGNlcHRpb24uZ2V0SmF2YU5hbWUoKSk7Ci0JCQkJaWYgKGsgPCAoZXhjZXB0aW9ucy5zaXplKCkgLSAxKSkgewotCQkJCQlzYi5hcHBlbmQoIiwiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdEdlbmVyYXRlZCgpIHsKLQkJLy8gV2Ugb25seSB3YW50IHRoZSB0ZXN0aW5nIG9mIHRoZSBoYXNSZWZsZWN0ZWQgYW5kIGdldCByZWFkYWRhcHRlciB0byBiZSBzeW5jKHRoaXMpIHNvIHRoYXQKLQkJLy8gaXQgaXMgc2hvcnQgYW5kIG5vIGRlYWRsb2NrIHBvc3NpYmlsaXR5ICh0aGlzIGlzIGJlY2F1c2UgdGhlIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBhZGFwdGVyIG1heSBnbwotCQkvLyBiYWNrIHRvIHRoZSBjb250YWluaW5nIGphdmEgY2xhc3MgdG8gZ2V0IGl0cyByZWZsZWN0aW9uIGFkYXB0ZXIsIHdoaWNoIHdvdWxkIGxvY2sgb24gaXRzZWxmLiBTbwotCQkvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNlY3Rpb25zIHRoYXQgYXJlIHN5bmModGhpcykgdG8gbm90IGJlIGRlYWRsb2NrYWJsZSBieSBub3QgZG9pbmcgc2lnbmlmaWNhbnQgd29yawotCQkvLyBkdXJpbmcgdGhlIHN5bmMuCi0JCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoKHJlZmxlY3Rpb25TdGF0dXMgJiBSRUZMRUNURURfR0VORVJBVEVEKSA9PSAwKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9ICgoSUphdmFNZXRob2RBZGFwdGVyKSByZWFkQWRhcHRvcikucmVmbGVjdEdlbmVyYXRlZElmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSAoUkVGTEVDVEVEX0dFTkVSQVRFRCB8IFJFRkxFQ1RFRF9CQVNFKTsgLy8gV2UgY2FuIGJlIGNlcnRhaW4gYmFzZSB3aWxsIGJlIGRvbmUgYnkgcmVmbGVjdCBnZW5lcmF0ZWQgaWYgbm90IGFscmVhZHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGRvbmUuCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBzeXN0ZW0gZ2VuZXJhdGVkLiBUaGlzIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgImdlbmVyYXRlZCIgdGFnIGluIHRoZSBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVkKCkgewotCQlyZWZsZWN0R2VuZXJhdGVkKCk7Ci0JCXJldHVybiBpc0dlbmVyYXRlZDsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlZEdlbigpIHsKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBhIHZvaWQgcmV0dXJuIHR5cGUgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVm9pZCgpIHsKLQkJLy9GQiByZXR1cm4gKGdldFJldHVyblBhcmFtZXRlcigpID09IG51bGwgfHwgInZvaWQiLmVxdWFscyhnZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpKSk7Ci0JCXJldHVybiAoZ2V0UmV0dXJuVHlwZSgpID09IG51bGwgfHwgInZvaWQiLmVxdWFscyhnZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEphdmFDbGFzcygoSmF2YUNsYXNzKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQYXJhbWV0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCUphdmFDbGFzcyBuZXdDb250YWluZXIgPSBudWxsOwotCQkJCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCQlpZiAocmVhZEFkYXB0b3IgaW5zdGFuY2VvZiBKYXZhUmVmbGVjdGlvbkFkYXB0b3IgJiYgb3RoZXJFbmQgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpCi0JCQkJewotCQkJCQluZXdDb250YWluZXIgPSAoKEphdmFSZWZsZWN0aW9uQWRhcHRvcilyZWFkQWRhcHRvcikuY3JlYXRlSmF2YUNsYXNzUmVmKCgoSmF2YUNsYXNzKW90aGVyRW5kKS5nZXRKYXZhTmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SmF2YUNsYXNzKG5ld0NvbnRhaW5lciwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gaXNBYnN0cmFjdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQVRJVkU6Ci0JCQkJcmV0dXJuIGlzTmF0aXZlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NZTkNIUk9OSVpFRDoKLQkJCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRklOQUw6Ci0JCQkJcmV0dXJuIGlzRmluYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQ09OU1RSVUNUT1I6Ci0JCQkJcmV0dXJuIGlzQ29uc3RydWN0b3IoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1RBVElDOgotCQkJCXJldHVybiBpc1N0YXRpYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJcmV0dXJuIGdldEphdmFWaXNpYmlsaXR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVycygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfRVhDRVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TT1VSQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTb3VyY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0FCU1RSQUNUOgotCQkJCXNldEFic3RyYWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQVRJVkU6Ci0JCQkJc2V0TmF0aXZlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TWU5DSFJPTklaRUQ6Ci0JCQkJc2V0U3luY2hyb25pemVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19GSU5BTDoKLQkJCQlzZXRGaW5hbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQ09OU1RSVUNUT1I6Ci0JCQkJc2V0Q29uc3RydWN0b3IoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NUQVRJQzoKLQkJCQlzZXRTdGF0aWMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfVklTSUJJTElUWToKLQkJCQlzZXRKYXZhVmlzaWJpbGl0eSgoSmF2YVZpc2liaWxpdHlLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9FWENFUFRJT05TOgotCQkJCWdldEphdmFFeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRKYXZhRXhjZXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChCbG9jayluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19BQlNUUkFDVDoKLQkJCQlzZXRBYnN0cmFjdChBQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX05BVElWRToKLQkJCQlzZXROYXRpdmUoTkFUSVZFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1lOQ0hST05JWkVEOgotCQkJCXNldFN5bmNocm9uaXplZChTWU5DSFJPTklaRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19GSU5BTDoKLQkJCQlzZXRGaW5hbChGSU5BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0NPTlNUUlVDVE9SOgotCQkJCXNldENvbnN0cnVjdG9yKENPTlNUUlVDVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1RBVElDOgotCQkJCXNldFN0YXRpYyhTVEFUSUNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJc2V0SmF2YVZpc2liaWxpdHkoSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9FWENFUFRJT05TOgotCQkJCWdldEphdmFFeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUzoKLQkJCQlzZXRKYXZhQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoQmxvY2spbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDApICE9IEFCU1RSQUNUX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX05BVElWRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBOQVRJVkVfRUZMQUcpICE9IDApICE9IE5BVElWRV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TWU5DSFJPTklaRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgU1lOQ0hST05JWkVEX0VGTEFHKSAhPSAwKSAhPSBTWU5DSFJPTklaRURfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRklOQUw6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDApICE9IEZJTkFMX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0NPTlNUUlVDVE9SOgotCQkJCXJldHVybiAoKGVGbGFncyAmIENPTlNUUlVDVE9SX0VGTEFHKSAhPSAwKSAhPSBDT05TVFJVQ1RPUl9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TVEFUSUM6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwKSAhPSBTVEFUSUNfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXJldHVybiBqYXZhVmlzaWJpbGl0eSAhPSBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gcGFyYW1ldGVycyAhPSBudWxsICYmICFwYXJhbWV0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0VYQ0VQVElPTlM6Ci0JCQkJcmV0dXJuIGphdmFFeGNlcHRpb25zICE9IG51bGwgJiYgIWphdmFFeGNlcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NPVVJDRToKLQkJCQlyZXR1cm4gc291cmNlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCXB1YmxpYyBKYXZhUGFyYW1ldGVyW10gbGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkgewotCQlDb2xsZWN0aW9uIHYgPSBnZXRQYXJhbWV0ZXJzKCk7Ci0JCUphdmFQYXJhbWV0ZXJbXSByZXN1bHQgPSBuZXcgSmF2YVBhcmFtZXRlclt2LnNpemUoKV07Ci0JCXYudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBFTGlzdCBlQ29udGVudHMoKSB7Ci0JCUVMaXN0IHJlc3VsdHMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlyZXN1bHRzLmFkZEFsbChnZXRQYXJhbWV0ZXJzR2VuKCkpOyAvL0ZCCi0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgaXNHZW5lcmF0ZWQgZmxhZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0dlbmVyYXRlZChib29sZWFuIGdlbmVyYXRlZCkgewotCQlpc0dlbmVyYXRlZCA9IGdlbmVyYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJldHVybiB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZShKYXZhSGVscGVycyB0eXBlKSB7Ci0JCXRoaXMuc2V0RVR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eUdlbigpIHsKLQkJcmV0dXJuIGphdmFWaXNpYmlsaXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZCBuZXdKYXZhVmlzaWJpbGl0eSkgewotCQlKYXZhVmlzaWJpbGl0eUtpbmQgb2xkSmF2YVZpc2liaWxpdHkgPSBqYXZhVmlzaWJpbGl0eTsKLQkJamF2YVZpc2liaWxpdHkgPSBuZXdKYXZhVmlzaWJpbGl0eSA9PSBudWxsID8gSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUIDogbmV3SmF2YVZpc2liaWxpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9WSVNJQklMSVRZLCBvbGRKYXZhVmlzaWJpbGl0eSwgamF2YVZpc2liaWxpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEphdmFDbGFzcyhKYXZhQ2xhc3MgbmV3SmF2YUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhKYXZhQ2xhc3MgbmV3SmF2YUNsYXNzKSB7Ci0JCWlmIChuZXdKYXZhQ2xhc3MgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTICYmIG5ld0phdmFDbGFzcyAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0phdmFDbGFzcykpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0phdmFDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRKYXZhQ2xhc3MobmV3SmF2YUNsYXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUywgbmV3SmF2YUNsYXNzLCBuZXdKYXZhQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQmxvY2sgZ2V0U291cmNlKCkgewotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTb3VyY2UgPSAoSW50ZXJuYWxFT2JqZWN0KXNvdXJjZTsKLQkJCXNvdXJjZSA9IChCbG9jayllUmVzb2x2ZVByb3h5KG9sZFNvdXJjZSk7Ci0JCQlpZiAoc291cmNlICE9IG9sZFNvdXJjZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJsb2NrIGJhc2ljR2V0U291cmNlKCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShCbG9jayBuZXdTb3VyY2UpIHsKLQkJQmxvY2sgb2xkU291cmNlID0gc291cmNlOwotCQlzb3VyY2UgPSBuZXdTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhYnN0cmFjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYXRpdmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBOQVRJVkVfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5bmNocm9uaXplZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFNZTkNIUk9OSVpFRF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29uc3RydWN0b3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBDT05TVFJVQ1RPUl9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhdGljOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXZhVmlzaWJpbGl0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamF2YVZpc2liaWxpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UGFyYW1ldGVyc0dlbigpIHsKLQkJaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkgewotCQkJcGFyYW1ldGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKYXZhUGFyYW1ldGVyLmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlMpOwotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXJzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRKYXZhRXhjZXB0aW9uc0dlbigpIHsKLQkJaWYgKGphdmFFeGNlcHRpb25zID09IG51bGwpIHsKLQkJCWphdmFFeGNlcHRpb25zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9FWENFUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gamF2YUV4Y2VwdGlvbnM7Ci0JfQotCi0JICBAT3ZlcnJpZGUKLQkgIHB1YmxpYyBFTGlzdDxFT2JqZWN0PiBlQ3Jvc3NSZWZlcmVuY2VzKCkKLQkgIHsKLQkgICAgaWYgKGVDcm9zc1JlZmVyZW5jZXMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDcm9zc1JlZmVyZW5jZXMgPSBFQ3Jvc3NSZWZlcmVuY2VFTGlzdC5jcmVhdGVFQ3Jvc3NSZWZlcmVuY2VFTGlzdCh0aGlzKTsKLQkgICAgfQotCSAgICByZXR1cm4gZUNyb3NzUmVmZXJlbmNlczsKLQkgIH0KLQotCQkvKioKLQkgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgICAqLwotCXB1YmxpYyB2b2lkIHNldEVUeXBlKEVDbGFzc2lmaWVyIG5ld0VUeXBlKQotCXsKLQkJRUNsYXNzaWZpZXIgbmV3Q29udGFpbmVyID0gbmV3RVR5cGU7Ci0JCWlmIChlVHlwZSAhPSBudWxsICYmIG5ld0VUeXBlID09IG51bGwpCi0JCXsKLQkJCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCWlmIChyZWFkQWRhcHRvciBpbnN0YW5jZW9mIEphdmFSZWZsZWN0aW9uQWRhcHRvcikKLQkJCXsKLQkJCQluZXdDb250YWluZXIgPSAoKEphdmFSZWZsZWN0aW9uQWRhcHRvcilyZWFkQWRhcHRvcikuY3JlYXRlSmF2YUNsYXNzUmVmKCgoSmF2YUhlbHBlcnMpZVR5cGUpLmdldEphdmFOYW1lKCkpOwotCQkJfQotCQl9Ci0JICAgIHN1cGVyLnNldEVUeXBlKG5ld0NvbnRhaW5lcik7Ci0JICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1N0YXRlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9TdGF0ZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmZlN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1N0YXRlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLlN0YXRlbWVudDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RhdGVtZW50SW1wbCBleHRlbmRzIEJsb2NrSW1wbCBpbXBsZW1lbnRzIFN0YXRlbWVudCB7Ci0KLQlwcm90ZWN0ZWQgU3RhdGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5MaXRlcmFscy5TVEFURU1FTlQ7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1VSTC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1VSTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGZkMzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9VUkwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFVSTCB7Ci0JcHVibGljIFN0cmluZyBuYW1lc3BhY2VOYW1lOwotCXB1YmxpYyBTdHJpbmcgSUQ7Ci0JTGlzdCBhdHRyaWJ1dGVOYW1lczsKLS8qKgotICogVVJMIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBVUkwoU3RyaW5nIHVybFN0cmluZykgewotCWluaXRpYWxpemVGcm9tU3RyaW5nKHVybFN0cmluZyk7Ci19Ci0vKioKLSAqIFVSTCBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgVVJMKFN0cmluZyBuYW1lU3BhY2VOYW1lLCBTdHJpbmcgYW5JRCkgewotCXRoaXMubmFtZXNwYWNlTmFtZSA9IG5hbWVTcGFjZU5hbWU7Ci0JdGhpcy5JRCA9IGFuSUQ7Ci19Ci1wdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKLQlyZXR1cm4gYXR0cmlidXRlTmFtZXM7Ci19Ci1wdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVN0cmluZyhTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JaW50IHBvdW5kSW54ID0gdXJsU3RyaW5nLmxhc3RJbmRleE9mKCcjJyk7Ci0JaWYgKHBvdW5kSW54ID4gLTEpIHsKLQkJbmFtZXNwYWNlTmFtZSA9IHVybFN0cmluZy5zdWJzdHJpbmcoMCwgcG91bmRJbngpOwotCQl1cmxTdHJpbmcgPSB1cmxTdHJpbmcuc3Vic3RyaW5nKHBvdW5kSW54ICsgMSk7Ci0JCWludCBkb3RJbmRleCA9IHVybFN0cmluZy5pbmRleE9mKCItPiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkb3RJbmRleCA+IC0xKSB7Ci0JCQlJRCA9IHVybFN0cmluZy5zdWJzdHJpbmcoMCwgZG90SW5kZXgpOwotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWVTdHJpbmcgPSB1cmxTdHJpbmcuc3Vic3RyaW5nKGRvdEluZGV4ICsgMik7Ci0JCQlhdHRyaWJ1dGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWRvIHsKLQkJCQlkb3RJbmRleCA9IGF0dHJpYnV0ZU5hbWVTdHJpbmcuaW5kZXhPZigiLT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChkb3RJbmRleCA+IC0xKSB7Ci0JCQkJCWF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVOYW1lU3RyaW5nLnN1YnN0cmluZygwLCBkb3RJbmRleCkpOwotCQkJCQlhdHRyaWJ1dGVOYW1lU3RyaW5nID0gYXR0cmlidXRlTmFtZVN0cmluZy5zdWJzdHJpbmcoZG90SW5kZXggKyAyKTsKLQkJCQl9IGVsc2UKLQkJCQkJYXR0cmlidXRlTmFtZXMuYWRkKGF0dHJpYnV0ZU5hbWVTdHJpbmcpOwotCQkJfSB3aGlsZSAoZG90SW5kZXggPiAtMSk7Ci0JCX0gZWxzZSB7Ci0JCQlJRCA9IHVybFN0cmluZzsKLQkJfQotCX0gZWxzZSB7Ci0JCS8vIGFzc3VtZSB0aGF0IGFueSBVUkwgc3RyaW5nIHRoYXQgZW5kcyB3aXRoIC54bWkgaXMgYSBuYW1lc3BhY2UuCi0JCWlmICh1cmxTdHJpbmcuZW5kc1dpdGgoIi54bWkiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWVzcGFjZU5hbWUgPSB1cmxTdHJpbmc7Ci0JCQlJRCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQluYW1lc3BhY2VOYW1lID0gIj9kZWZhdWx0VVJMPyI7IC8vJE5PTi1OTFMtMSQKLQkJCUlEID0gdXJsU3RyaW5nOwotCQl9Ci0JfQotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gIlVSTCgiICsgKChuYW1lc3BhY2VOYW1lID09IG51bGwpID8gIiIgOiBuYW1lc3BhY2VOYW1lICsgIiMiKSArICgoSUQgPT0gbnVsbCkgPyAiIiA6IElEKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzODZmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrLkphdmFKREtBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIGNsYXNzIHRvIGhhbmRsZSB0aGUgamF2YSBjb250ZXh0LiBUaGUgamF2YSBjb250ZXh0IGlzIGEgcmVzb3VyY2Ugc2V0Ci0gKiB0aGF0IGhhcyB0aGUgYXBwcm9wcmlhdGUgcmVmbGVjdGlvbiBhZGFwdGVyIGF0dGFjaGVkLCBlaXRoZXIgZm9yIGphdmEgcmVmbGVjdGlvbiBvcgotICogZm9yIEpEVCByZWZsZWN0aW9uLiBUaGUgZGVmYXVsdCBpcyBmb3IgamF2YSByZWZsZWN0aW9uLiBXaGVuIHJ1bm5pbmcgaW4gRWNsaXBzZSBpdAotICogd2lsbCBiZSB0aGUgSkRUIHJlZmxlY3Rpb24uCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPlRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjdXN0b21lcnMgdGhhdCBhcmUgbm90IGRvaW5nIG5vcm1hbCBFY2xpcHNlIEpEVCBKRU0KLSAqIHJlZmxlY3Rpb24uIE5vcm1hbCBKRU0gc2hvdWxkIGJlIHVzaW5nIHRoZSBKRU0gRU1GIG5hdHVyZSBhY2Nlc3MgaW5zdGVhZC4KLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUNvbnRleHQgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgUmVmbGVjdGlvbkZhY3RvcnlDbGFzcyA9IEphdmFKREtBZGFwdGVyRmFjdG9yeS5jbGFzczsKLQkKLQlwcml2YXRlIEphdmFDb250ZXh0KCkgewotCQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBqYXZhIGNvbnRleHQuIFRvIGJlIHVzZWQgb3V0c2lkZSBvZiBFY2xpcHNlLgotCSAqIFdpdGhpbiBub3JtYWwgRWNsaXBzZSBKRU0gdXNhZ2UgdGhlIEpFTSBFTUYgbmF0dXJlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlSmF2YUNvbnRleHQoKSB7Ci0JCW9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluaXQuSmF2YUluaXQuaW5pdCgpOwotCQlSZXNvdXJjZVNldCBzZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCXNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKGNyZWF0ZUphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkoKSk7Ci0JCXJldHVybiBzZXQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnlJbnN0YW5jZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoKSAhPSBudWxsKQotCQkJCWZhY3RvcnlJbnN0YW5jZSA9IChBZGFwdGVyRmFjdG9yeSkgZ2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoKS5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gUmVmbGVjdGlvbiBvciBpbnN0YW50aWF0aW9uIHByb2JsZW1zLgotCQkJLy8gT0ssIGNhbid0IGRvIEphdmEgTW9kZWwgcmVmbGVjdGlvbgotCQl9Ci0JCXJldHVybiBmYWN0b3J5SW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBDbGFzcyBmb3IgdGhlIEphdmEgcmVmZWN0aW9uIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzcyBnZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIFJlZmxlY3Rpb25GYWN0b3J5Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBDbGFzcyBmb3IgdGhlIEphdmEgcmVmZWN0aW9uIGFkYXB0ZXIgZmFjdG9yeS4gV2l0aGluIEVjbGlwc2UgdGhpcyBzaG91bGQgbm90Ci0JICogYmUgc2V0IGJ5IGN1c3RvbWVycy4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YVJlZmxlY3Rpb25GYWN0b3J5Q2xhc3MKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoQ2xhc3MgamF2YVJlZmxlY3Rpb25GYWN0b3J5Q2xhc3MpIHsKLQkJUmVmbGVjdGlvbkZhY3RvcnlDbGFzcyA9IGphdmFSZWZsZWN0aW9uRmFjdG9yeUNsYXNzOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWM2ZTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9KYXZhUmVmQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZWZBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEphdmFSZWZQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVJlZkFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVmU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEphdmFSZWZTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhQ2xhc3MoSmF2YUNsYXNzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKYXZhQ2xhc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0aWFsaXplcihJbml0aWFsaXplciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdGlhbGl6ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhUGFyYW1ldGVyKEphdmFQYXJhbWV0ZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFQYXJhbWV0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2QoTWV0aG9kIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VGaWVsZChGaWVsZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRmllbGRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCbG9jayhCbG9jayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQmxvY2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21tZW50KENvbW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTdGF0ZW1lbnQoU3RhdGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTdGF0ZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhUGFja2FnZShKYXZhUGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YVBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhRGF0YVR5cGUoSmF2YURhdGFUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKYXZhRGF0YVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcnJheVR5cGUoQXJyYXlUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcnJheVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhRXZlbnQoSmF2YUV2ZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKYXZhRXZlbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3NpZmllcihFQ2xhc3NpZmllciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUNsYXNzaWZpZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3MoRUNsYXNzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFQ2xhc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFVHlwZWRFbGVtZW50KEVUeXBlZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFUGFyYW1ldGVyKEVQYXJhbWV0ZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVQYXJhbWV0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFT3BlcmF0aW9uKEVPcGVyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPcGVyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFUGFja2FnZShFUGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRVBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzIDxlbT5KYXZhIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhQ2xhc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkluaXRpYWxpemVyIDxlbT5Jbml0aWFsaXplcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5Jbml0aWFsaXplcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0aWFsaXplckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlciA8ZW0+SmF2YSBQYXJhbWV0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhUGFyYW1ldGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QgPGVtPk1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCA8ZW0+RmllbGQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRmllbGRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkJsb2NrIDxlbT5CbG9jazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5CbG9jawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCbG9ja0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuQ29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5Db21tZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLlN0YXRlbWVudCA8ZW0+U3RhdGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLlN0YXRlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0ZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYWNrYWdlIDxlbT5KYXZhIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YVBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFEYXRhVHlwZSA8ZW0+SmF2YSBEYXRhIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YURhdGFUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFEYXRhVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlIDxlbT5BcnJheSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkFycmF5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnJheVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudCA8ZW0+SmF2YSBFdmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRXZlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YUV2ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudCA8ZW0+RU1vZGVsIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQgPGVtPkVOYW1lZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllciA8ZW0+RUNsYXNzaWZpZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVDbGFzc2lmaWVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIDxlbT5FQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQ2xhc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50IDxlbT5FVHlwZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFVHlwZWRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhcmFtZXRlciA8ZW0+RVBhcmFtZXRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhcmFtZXRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFUGFyYW1ldGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbiA8ZW0+RU9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT3BlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIDxlbT5FU3RydWN0dXJhbCBGZWF0dXJlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVN0cnVjdHVyYWxGZWF0dXJlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UgPGVtPkVQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9KYXZhUmVmQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9KYXZhUmVmU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YVJlZlN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmY0MjgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9KYXZhUmVmU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS51dGlsOwotCi0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZlN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKYXZhUmVmUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFSZWZTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1M6IHsKLQkJCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSmF2YUNsYXNzKGphdmFDbGFzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUNsYXNzKGphdmFDbGFzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoamF2YUNsYXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGphdmFDbGFzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChqYXZhQ2xhc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVI6IHsKLQkJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVI6IHsKLQkJCQlKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgPSAoSmF2YVBhcmFtZXRlcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSmF2YVBhcmFtZXRlcihqYXZhUGFyYW1ldGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFUGFyYW1ldGVyKGphdmFQYXJhbWV0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVUeXBlZEVsZW1lbnQoamF2YVBhcmFtZXRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChqYXZhUGFyYW1ldGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGphdmFQYXJhbWV0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EOiB7Ci0JCQkJTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZChtZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVPcGVyYXRpb24obWV0aG9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KG1ldGhvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChtZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQobWV0aG9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEOiB7Ci0JCQkJRmllbGQgZmllbGQgPSAoRmllbGQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZpZWxkKGZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLOiB7Ci0JCQkJQmxvY2sgYmxvY2sgPSAoQmxvY2spdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUJsb2NrKGJsb2NrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlQ6IHsKLQkJCQlDb21tZW50IGNvbW1lbnQgPSAoQ29tbWVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29tbWVudChjb21tZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCbG9jayhjb21tZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVDogewotCQkJCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTdGF0ZW1lbnQoc3RhdGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCbG9jayhzdGF0ZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFOiB7Ci0JCQkJSmF2YVBhY2thZ2UgamF2YVBhY2thZ2UgPSAoSmF2YVBhY2thZ2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUphdmFQYWNrYWdlKGphdmFQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFUGFja2FnZShqYXZhUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChqYXZhUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChqYXZhUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRTogewotCQkJCUphdmFEYXRhVHlwZSBqYXZhRGF0YVR5cGUgPSAoSmF2YURhdGFUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhRGF0YVR5cGUoamF2YURhdGFUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFQ2xhc3MoamF2YURhdGFUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFQ2xhc3NpZmllcihqYXZhRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoamF2YURhdGFUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGphdmFEYXRhVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFOiB7Ci0JCQkJQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFycmF5VHlwZShhcnJheVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUphdmFDbGFzcyhhcnJheVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVDbGFzcyhhcnJheVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVDbGFzc2lmaWVyKGFycmF5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChhcnJheVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoYXJyYXlUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlQ6IHsKLQkJCQlKYXZhRXZlbnQgamF2YUV2ZW50ID0gKEphdmFFdmVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSmF2YUV2ZW50KGphdmFFdmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKGphdmFFdmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVR5cGVkRWxlbWVudChqYXZhRXZlbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoamF2YUV2ZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGphdmFFdmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgQ2xhc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSmF2YUNsYXNzKEphdmFDbGFzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXRpYWxpemVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXRpYWxpemVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0aWFsaXplcihJbml0aWFsaXplciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgUGFyYW1ldGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgUGFyYW1ldGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhUGFyYW1ldGVyKEphdmFQYXJhbWV0ZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2QoTWV0aG9kIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmllbGQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmllbGQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUZpZWxkKEZpZWxkIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmxvY2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmxvY2s8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUJsb2NrKEJsb2NrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21tZW50KENvbW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0ZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTdGF0ZW1lbnQoU3RhdGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSmF2YVBhY2thZ2UoSmF2YVBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIERhdGEgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIERhdGEgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSmF2YURhdGFUeXBlKEphdmFEYXRhVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFycmF5IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJyYXkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXJyYXlUeXBlKEFycmF5VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgRXZlbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBFdmVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSmF2YUV2ZW50KEphdmFFdmVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRU5hbWVkRWxlbWVudChFTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUNsYXNzaWZpZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUNsYXNzaWZpZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzc2lmaWVyKEVDbGFzc2lmaWVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUNsYXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVDbGFzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUNsYXNzKEVDbGFzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVUeXBlZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVUeXBlZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFVHlwZWRFbGVtZW50KEVUeXBlZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FUGFyYW1ldGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVQYXJhbWV0ZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVQYXJhbWV0ZXIoRVBhcmFtZXRlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPcGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRU9wZXJhdGlvbihFT3BlcmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FU3RydWN0dXJhbCBGZWF0dXJlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVQYWNrYWdlKEVQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9KYXZhUmVmU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvTm90aWZpY2F0aW9uVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL05vdGlmaWNhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5MjYxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvTm90aWZpY2F0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3I7Ci0gCi0KLS8qKgotICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3Mgb2Ygc3RhdGljIG1ldGhvZHMgZm9yIGhhbmRsaW5nIHNwZWNpYWwgSkVNIG5vdGlmaWNhdGlvbnMuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uVXRpbCB7Ci0JLyoKLQkgKiBOb3QgbWVhbnQgdG8gYmUgY29uc3RydWN0ZWQuCi0JICovCi0JcHJpdmF0ZSBOb3RpZmljYXRpb25VdGlsKCkgewotCQkKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhpcyBub3RpZmljYXRpb24gaXMgYSByZWZsZWN0aW9uIG5vdGlmaWNhdGlvbi4gSWYgaXQgaXMsIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGUgSmF2YUNsYXNzIGhhcwotCSAqIGp1c3QgaGFkIHJlZmxlY3Rpb24gcGVyZm9ybWVkIG9uIGl0LgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSByZWZsZWN0aW9uIGV2ZW50LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZmxlY3Rpb25FdmVudChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJldHVybiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gUmVmbGVjdGlvbkFkYXB0b3IuRVZFTlQgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBSZWZsZWN0aW9uQWRhcHRvci5SRUZMRUNUSU9OX0VWRU5UOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGlzIG5vdGlmaWNhdGlvbiBpcyBhIHJlZmxlY3Rpb24gZmx1c2ggZXZlbnQgb2YgYSBKYXZhQ2xhc3Mgd2l0aCBleGlzdGluZyBjb2RlLiBJZiBpdCBpcywgdGhlbiBpdCBtZWFucyB0aGF0IHRoZSAKLQkgKiBKYXZhQ2xhc3MgaGFzIGp1c3QgaGFkIHRoZSByZWZsZWN0aW9uIHJlc3VsdHMgZmx1c2hlZCwgQU5EIHRoaXMgd2FzIGEgY2xhc3MgdGhhdCBoYWQgZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgY29kZSBvbiBpdC4uCi0JICogQHBhcmFtIG1zZwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGZsdXNoIGV2ZW50LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZsdXNoRXZlbnQoTm90aWZpY2F0aW9uIG1zZykgewotCQlyZXR1cm4gbXNnLmdldEV2ZW50VHlwZSgpID09IFJlZmxlY3Rpb25BZGFwdG9yLkVWRU5UICYmIG1zZy5nZXRGZWF0dXJlKCkgPT0gSmF2YVJlZmxlY3Rpb25BZGFwdG9yLkZMVVNIX1JFRkxFQ1RJT05fRVZFTlQ7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhpcyBub3RpZmljYXRpb24gaXMgYSByZWZsZWN0aW9uIGZsdXNoIGV2ZW50IG9mIGEgSmF2YUNsYXNzIHRoYXQgaXMgbmV3IGFuZCBkb2Vzbid0IGhhdmUgZXhpc3RpbmcgY29kZS4KLQkgKiBJZiBpdCBpcywgdGhlbiBpdCBtZWFucyB0aGF0IHRoZSBKYXZhQ2xhc3MgaGFzIGp1c3QgaGFkIHRoZSByZWZsZWN0aW9uIHJlc3VsdHMgZmx1c2hlZCwgQU5EIHRoaXMgd2FzIGEgY2xhc3MgdGhhdCB3YXMgbmV3IGFuZAotCSAqIGhhZCBubyBjb2RlIGJlaGluZCBpdC4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgZmx1c2ggZXZlbnQgb2YgbmV3IGNsYXNzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZsdXNoTmV3RXZlbnQoTm90aWZpY2F0aW9uIG1zZykgewotCQlyZXR1cm4gbXNnLmdldEV2ZW50VHlwZSgpID09IFJlZmxlY3Rpb25BZGFwdG9yLkVWRU5UICYmIG1zZy5nZXRGZWF0dXJlKCkgPT0gSmF2YVJlZmxlY3Rpb25BZGFwdG9yLkZMVVNIX05FV19SRUZMRUNUSU9OX0VWRU5UOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vb3ZlcnJpZGVzLy4uUk9PVC4uLm92ZXJyaWRlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vb3ZlcnJpZGVzLy4uUk9PVC4uLm92ZXJyaWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE0YWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL292ZXJyaWRlcy8uLlJPT1QuLi5vdmVycmlkZQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hhbmdlOkNoYW5nZURlc2NyaXB0aW9uIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmNoYW5nZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9DaGFuZ2UiIHhtaTp2ZXJzaW9uPSIyLjAiPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJYOlJPT1QjLy9Acm9vdCI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgICAgIDwhLS0gdG9vIHJlbWluZCB1cyB0aGF0IHRoZXNlIGFyZSBuZWVkIHRvIGJlIGRvbmUgeWV0IGluIHRoZSBuZXcgYWxsb2NhdGlvbiBzY2hlbWUuIAotICA8YWRkZWRFT2JqZWN0cyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zdGFudGlhdGVVc2luZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8YWRkZWRFT2JqZWN0cyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VyaWFsaXplRGF0YSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotLS0+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJfZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiLz4KLTwvY2hhbmdlOkNoYW5nZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vb3ZlcnJpZGVzL2phdmEvbGFuZy9PYmplY3Qub3ZlcnJpZGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvamF2YS9sYW5nL09iamVjdC5vdmVycmlkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4OTJmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvamF2YS9sYW5nL09iamVjdC5vdmVycmlkZQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hhbmdlOkNoYW5nZURlc2NyaXB0aW9uIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYmVhbmluZm89Imh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2JlYW5pbmZvLmVjb3JlIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmNoYW5nZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9DaGFuZ2UiIHhtaTp2ZXJzaW9uPSIyLjAiPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJYOlJPT1QjLy9Acm9vdCI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8IS0tIFR1cm4gY2xhc3MgcHJvcGVydHkgdG8gYSBoaWRkZW4gYW5kIG5vdCBpbnRyb3NwZWN0ZWQgcHJvcGVydHkuIFRoaXMgaXMgYmVjYXVzZSB3ZSBkb24ndCBoYW5kbGUgSmF2YSAxLjUgdGVtcGxhdGVzCi0gICAgICAgIHlldCBhcyB2YWxpZCBKYXZhQ2xhc3NlcyBhbmQgaXQgY2F1c2VzIFhNSSBzZXJpYWxpemF0aW9uIGVycm9ycyBiZWNhdXNlIGl0IGluY2x1ZGVzIHRoZSAiPCIgaW4gdGhlIHNlcmlhbGl6YXRpb24gb2YgdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgZm9yIHRoZSBzdGFuZGFyZCBqYXZhIGNsYXNzIHdoaWNoIGlzOiAiamF2YTovamF2YS5sYW5nI0NsYXNzPD8gZXh0ZW5kcyBDbGFzcz4iLiB0aGlzIGlzIGludmFsaWQgaW4gdGhlIHNlcmlhbGl6YXRpb24uIC0tPgotICAgICAgICAKLSAgIDxvYmplY3RzVG9BdHRhY2ggbmFtZT0iY2xhc3MiIHhtaTppZD0iX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FT2JqZWN0Ij4KLSAgICAgPGVBbm5vdGF0aW9ucyBoaWRkZW49InRydWUiIG1lcmdlSW50cm9zcGVjdGlvbj0iZmFsc2UiIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYmVhbmluZm86UHJvcGVydHlEZWNvcmF0b3IiLz4KLSAgIDwvb2JqZWN0c1RvQXR0YWNoPgotICAgCi0gICA8IS0tIAotICAgICAgVGhpcyBpcyBraW5kIG9mIGNoZWF0LCBidXQgZGF0YXR5cGVzIGFyZSBuZXZlciBpbnRyb3NwZWN0ZWQsIHNvIHdlIGNhbid0IGdldCB0aGVzZSBhdHRyaWJ1dGVzCi0gICAgICBhZGRlZCB0byB0aGVtIGluIGEgbm9ybWFsIHdheS4gQnkgZG9pbmcgaXQgaGVyZSwgd2hlbiBqYXZhLmxhbmcuT2JqZWN0IGlzIGludHJvc3BlY3RlZCwgdGhlc2UKLSAgICAgIHdpbGwgYmUgZG9uZSBhdCB0aGUgc2FtZSB0aW1lLiBBbmQgc2luY2UgT2JqZWN0IG5lZWRzIHRvIGJlIGludHJvc3BlY3RlZCBiZWZvcmUgYW55dGhpbmcgZWxzZQotICAgICAgY2FuIGJlIGRvbmUsIHRoZXNlIHdpbGwgYmUgZG9uZSBiZWZvcmUgYW55dGhpbmcgbmVlZHMgdGhlbS4gLS0+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNib29sZWFuIj4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJib29sZWFuX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSMvL0phdmFBbGxvY2F0aW9uIiBuYW1lPSJhbGxvY2F0aW9uIiB4bWk6aWQ9ImJvb2xlYW5fZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiLz4KLSAgIDxvYmplY3RDaGFuZ2VzIGtleT0iamF2YTovI2NoYXIiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9ImNoYXJfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iY2hhcl9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jaW50Ij4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJpbnRfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iaW50X2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNmbG9hdCI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iZmxvYXRfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iZmxvYXRfZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiLz4KLSAgIDxvYmplY3RDaGFuZ2VzIGtleT0iamF2YTovI3Nob3J0Ij4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJzaG9ydF9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJzaG9ydF9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jbG9uZyI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0ibG9uZ19lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJsb25nX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNkb3VibGUiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9ImRvdWJsZV9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJkb3VibGVfZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiLz4KLSAgIDxvYmplY3RDaGFuZ2VzIGtleT0iamF2YTovI2J5dGUiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9ImJ5dGVfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iYnl0ZV9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotPC9jaGFuZ2U6Q2hhbmdlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGJlYTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkCi0jCi0KLQotcGx1Z2luTmFtZSA9IEphdmEgRU1GIE1vZGVsCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzM0NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSIKLSAgICAgICAgICAgIGdlbk1vZGVsPSJtb2RlbC9pbnN0YW5jZS5nZW5tb2RlbCIKLSAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlIgotICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL2phdmFNb2RlbC5nZW5tb2RlbCIKLSAgICAgICAgICAgIHVyaT0iamF2YS54bWkiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnJlZ2lzdHJhdGlvbnMiPgotICAgICAgPHJlZ2lzdHJhdGlvbiBjb250YWluZXI9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI+Ci0gICAgICAgIDxvdmVycmlkZQotICAgICAgICAgICAgcGFja2FnZT0iamF2YS5sYW5nIgotICAgICAgICAgICAgcGF0aD0ib3ZlcnJpZGVzL2phdmEvbGFuZyI+Ci0gICAgICAgIDwvb3ZlcnJpZGU+Ci0gICAgICAgIDxvdmVycmlkZQotICAgICAgICAgICAgcGFja2FnZT0iLi5ST09ULi4iCi0gICAgICAgICAgICBwYXRoPSJvdmVycmlkZXMiPgotICAgICAgICA8L292ZXJyaWRlPgotICAgICAgPC9yZWdpc3RyYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTNhMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLm1kfgotKi5jYX4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2Vkb2NqYXZhMi5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2Vkb2NqYXZhMi5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YjFlZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9lZG9jamF2YTIuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsNTYxMyArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0NwotICAgIF93cml0dGVuICAgCSJSb3NlIDguMC4wMzAzLjE0MDAiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiamF2YSIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSURMIgotCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwMC0wMDVkOWU2YWRlYzQ6MSIpKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuamVtIikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkicHJlZml4IgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiSmF2YVJlZiIpKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkgICAgbmFtZSAgICAgICAJIm5zVVJJIgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiamF2YS54bWkiKSkpCi0gICAgcXVpZCAgICAgICAJIjM2NTQ5RjJDMDA0RSIKLSAgICBkb2N1bWVudGF0aW9uIAkKLXxDaGFuZ2VzIHRvIHN5bmNoIHVwIHdpdGggSmF2YTNlOgotfC0gZGVsZXRlZCBKYXZhRWxlbWVudCwgQm9keUVsZW1lbnQgd2hpY2ggZGlkbid0IGFkZCBhbnl0aGluZyB1c2VmdWwKLXwtIGRlbGV0ZWQgTmVzdGVkQ2xhc3MgYW5kIHRoZSBhc3NvY2lhdGlvbiB3aGljaCBkZXNjcmliZWQgbmVzdGluZywgY29udGVudHMgY2FuIGJlIHVzZWQgaW5zdGVhZAotfC0gZGVsZXRlZCBleHRlbmRzL2V4dGVuZGVkQnkgd2hpY2ggaXMgcmVwbGFjZWQgd2l0aCBNT0Ygc3VidHlwZS9zdXBlcnR5cGUKLXwtIGRlbGV0ZWQgdGhlIGNsdW1zeSBtYWluIGRpYWdyYW0KLXwtIG1vdmVkIHRoZSBNT0YgaW5oZXJpdGFuY2UgZGV0YWlscyB0byB0aGUgTU9GIGJpbmRpbmcgZGlhZ3JhbQotfC0gZGVsZXRlZCAiZmluYWwiIG9uIEphdmFQYXJhbWV0ZXIsIGRvbid0IGtub3cgd2hhdCB0aGF0IHdhcyBzdXBwb3NlZCB0byBiZQotfC0gZGVsZXRlZCB0aGUgQ2F0ZWdvcnkganVuawotfC0gY2hhbmdlZCB0aGUgQmxvY2stdHlwZWQgYXR0cmlidXRlcyBvbiBGaWVsZCwgTWV0aG9kLCBJbml0aWFsaXplciB0byBiZSBhc3NvY2lhdGlvbnMgdG8gQmxvY2sKLXwKLXxPdXRzdGFuZGluZyBxdWVzdGlvbnMvaXNzdWVzOgotfC0gSmF2YVBhcmFtZXRlcktpbmQgc2hvdWxkIGdvIGF3YXkgaWYgd2UgZ2V0IHRoZSBiYXNlIFBhcmFtZXRlciBraW5kIGZpeGVkIHVwCi18Ci0gICAgCi0gICAgc3RlcmVvdHlwZSAJIm1ldGFtb2RlbCIKLSAgICB2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODFEREY0NzAyNzEiCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZiIKLQkgICAgcXVpZHUgICAgICAJIjM3NEFBOEY5MDI4RSIpCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDAyLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzlCRDM2NjAwMEZFIgotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZSIKLQkgICAgcXVpZHUgICAgICAJIjM5QTVFRDA0MDA0RSIpKQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzICJKYXZhQ2xhc3MiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDA0LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5OTA5NTAwMDBCMyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzTmVzdGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNBOUQ3QzIxMDFENiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEZpZWxkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNUIzMDA0NCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImZpZWxkTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUFBIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJGaWVsZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmllbGRFeHRlbmRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjYyNTAxMUEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXwgUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lIGZyb20gdGhpcyBKYXZhQ2xhc3Mgb3IgYW55IHN1cGVydHlwZXMuCi18Ci18UmV0dXJuIG51bGwgaWYgYSBGaWVsZCBuYW1lZCBmaWVsZE5hbWUgaXMgbm90IGZvdW5kLgotCQkgICAgCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZmllbGROYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQUMiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIkZpZWxkIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGaWVsZE5hbWVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNjY3MDI1NSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImZpZWxkTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUFFIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJGaWVsZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmllbGRzRXh0ZW5kZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI2OEEwMzI4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbGwgZmllbGRzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1ldGhvZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjkxMTAyMUEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJtZXRob2ROYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQjEiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyVHlwZXMiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCMiIKLQkJCSAgICBkb2N1bWVudGF0aW9uIAkiTGlzdCBvZiBwYXJhbWV0ZXIgdHlwZXMuIgotCQkJICAgIHR5cGUgICAgICAgCSJKVHlwZUxpc3QiCi0JCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpKQotCQkgICAgcmVzdWx0ICAgICAJIk1ldGhvZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI5RUEwM0NBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhIExpc3Qgb2YgU3RyaW5ncyB0aGF0IHJlcHJlc2VudCBNZXRob2RFbGVtZW50IHNpZ25hdHVyZXMgZnJvbSBtb3N0IGdlbmVyYWwgdG8gbW9zdCBzcGVjaWZpYy4iCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXRob2RFeHRlbmRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkE1MTAxMTUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm1ldGhvZE5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCNSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJUeXBlcyIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUI2IgotCQkJICAgIGRvY3VtZW50YXRpb24gCSJMaXN0IG9mIHBhcmFtZXRlciB0eXBlcy4iCi0JCQkgICAgdHlwZSAgICAgICAJIkpUeXBlTGlzdCIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikpCi0JCSAgICByZXN1bHQgICAgIAkiTWV0aG9kIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXRob2RzRXh0ZW5kZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJBN0QwMzU0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbGwgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4iCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRPbmx5U3BlY2lmaWNNZXRob2RzIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQUMzMDIxRSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFJldHVybiBhIExpc3Qgb2YgTWV0aG9kcyB0aGF0IGJlZ2lucyB3aXRoIEBhTWV0aG9kTmFtZVByZWZpeCBhbmQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBAZXhjbHVkZWROYW1lcyBsaXN0LiBJZiBAYU1ldGhvZE5hbWVQcmVmaXggaXMgbnVsbCwgYWxsIG1ldGhvZHMgd2lsbCBiZSByZXR1cm5lZC4KLXwKLQkJICAgIAotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImFNZXRob2ROYW1lUHJlZml4IgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQjkiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZXhjbHVkZWROYW1lcyIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUJBIgotCQkJICAgIHR5cGUgICAgICAgCSJKVHlwZUxpc3QiCi0JCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpKQotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHVibGljTWV0aG9kIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQkM5MDM4MyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseSBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiAgSXQgd2lsbCBub3QgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibWV0aG9kTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUJDIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInBhcmFtZXRlclR5cGVzIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQkQiCi0JCQkgICAgZG9jdW1lbnRhdGlvbiAJIkxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLiIKLQkJCSAgICB0eXBlICAgICAgIAkiSlR5cGVMaXN0IgotCQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJNZXRob2QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFB1YmxpY01ldGhvZHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJDM0QwMzRFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbGwgbWV0aG9kcywgaXQgd2lsbCBub3QgZ28gdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQzYzMDMyMCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYWxsIHB1YmxpYyBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFB1YmxpY01ldGhvZHNOYW1lZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkNBQTAwNUIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcywgaGF2aW5nIGEgbmFtZSBlcXVhbCB0byB0aGF0IG9mIHRoZSBwYXJhbWV0ZXIuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFDMSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRTdXBlcnR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJDRjkwMENEIgotCQkgICAgcmVzdWx0ICAgICAJIkphdmFDbGFzcyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaW1wbGVtZW50c0ludGVyZmFjZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkQzOTAwOUQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGVzdCB3aGV0aGVyIHRoZSByZWNlaXZlciBpbXBsZW1lbnRzIHRoZSBwYXNzZWQgaW50ZXJmYWNlIChvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMpLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJpbnRlcmZhY2VUeXBlIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQzQiCi0JCQkgICAgdHlwZSAgICAgICAJIkphdmFDbGFzcyIKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIikpCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpbmZvU3RyaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRDgyMDJEMyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gYSBzdHJpbmcgc2hvd2luZyBvdXIgZGV0YWlscy4iCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImluaGVyaXRzRnJvbSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkQ5RTAyRTciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGVzdHMgd2hldGhlciB0aGlzIGNsYXNzIGluaGVyaXRzIGZyb20gdGhlIHBhc3NlZCBpbiBjbGFzcy4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiamF2YUNsYXNzIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQzciCi0JCQkgICAgdHlwZSAgICAgICAJIkphdmFDbGFzcyIKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIikpCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc0V4aXN0aW5nVHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkUxMTAxMjAiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiRG9lcyB0aGlzIHR5cGUgZXhpc3QuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNJbnRlcmZhY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJFMkYwMTM3IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIklzIHRoaXMgYW4gaW50ZXJmYWNlLiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldFN1cGVydHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkU3QjAwQTAiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2V0IHRoZSBzdXBlcnR5cGUuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImphdmFjbGFzcyIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUNCIgotCQkJICAgIHR5cGUgICAgICAgCSJKYXZhQ2xhc3MiCi0JCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpKQotCQkgICAgcmVzdWx0ICAgICAJInZvaWQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2luZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDA1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRBNDVFMDIzMiIKLQkJICAgIHR5cGUgICAgICAgCSJUeXBlS2luZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QjQ2MDAyQkYiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjhDRTgwMjBDIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwOC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGOEY5QzAyRDciCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIm5vbmUiKQotCShvYmplY3QgQ2xhc3MgIkluaXRpYWxpemVyIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDA5LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEE1REMwMEJCIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpc1N0YXRpYyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDBhLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRBODY1MDAwRiIKLQkJICAgIHR5cGUgICAgICAgCSJCb29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkibm9uZSIpCi0JKG9iamVjdCBDbGFzcyAiSmF2YVBhcmFtZXRlciIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwYi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRBRDc4MDI4MCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCNzgxOEIwMDE4NiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFUGFyYW1ldGVyIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDNFNjE1MDEwNCIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc0FycmF5IgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRkQ0MDM0RiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJJcyB0aGlzIHBhcmFtZXRlciB0eXBlIGFuIGFycmF5IHR5cGUuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNSZXR1cm4iCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJGRUYwMDA1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIklzIHRoaXMgYSByZXR1cm4gcGFyYW1ldGVyLiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEphdmFUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDOEU3MDAxQSIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUphdmFIZWxwZXJzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRRdWFsaWZpZWROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDOTI2MDAyRiIKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwYy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QjY0NzAyQUYiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbWV0ZXJLaW5kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMGUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkxQzFFQjQwMEMyIgotCQkgICAgdHlwZSAgICAgICAJIkphdmFQYXJhbWV0ZXJLaW5kIgotCQkgICAgcXVpZHUgICAgICAJIjM5MUMxRThGMDEyMyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIm5vbmUiKQotCShvYmplY3QgQ2xhc3MgIk1ldGhvZCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwZi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzk5MDk1MzgwM0FEIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNERBQTIwMEEwIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldENvbnRhaW5pbmdKYXZhQ2xhc3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMwNDIwMkEzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiB0aGUgamF2YSBjbGFzcyB0aGF0IHRoaXMgbWV0aG9kIGlzIGRlZmluZWQgaW4uIgotCQkgICAgcmVzdWx0ICAgICAJIkphdmFDbGFzcyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzA3NjAxM0YiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxSZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgdGhlIG1ldGhvZCBuYW1lIGFuZCBpdHMgcGFyYW1ldGVycy4gZS5nLiA8Y29kZT4gc2V0Rmlyc3ROYW1lKGphdmEubGFuZy5TdHJpbmcpIDwvY29kZT4gLgotfCAKLQkJICAgIAotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJhbWV0ZXIiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMwQjgwMTFDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhIFBhcmFtZXRlciB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUUzIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJKYXZhUGFyYW1ldGVyIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRDc4MDI4MCIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRSZXR1cm5UeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMTQ3MDAxMyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJHZXQgdGhlIHJldHVybiB0eXBlLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUphdmFIZWxwZXJzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRSZXR1cm5UeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMjc0MDNDRSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTZXQgdGhlIHJldHVybiB0eXBlIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInR5cGUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFFOCIKLQkJCSAgICB0eXBlICAgICAgIAkiSlR5cGVKYXZhSGVscGVycyIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IikpCi0JCSAgICByZXN1bHQgICAgIAkidm9pZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRTaWduYXR1cmUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMxN0QwMDQzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC50b1N0cmluZygpLgotfAotfFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIE1ldGhvZC4gIFRoZSBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIHRoZSBtZXRob2QgYWNjZXNzIG1vZGlmaWVycywgaWYgYW55LCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIHJldHVybiB0eXBlLCBmb2xsb3dlZCBieSBhIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgY2xhc3MgZGVjbGFyaW5nIHRoZSBtZXRob2QsIGZvbGxvd2VkIGJ5IGEgcGVyaW9kLCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIG5hbWUsIGZvbGxvd2VkIGJ5IGEgcGFyZW50aGVzaXplZCwgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG1ldGhvZCdzIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBtZXRob2QgdGhyb3dzIGNoZWNrZWQgZXhjZXB0aW9ucywgdGhlIHBhcmFtZXRlciBsaXN0IGlzIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSB3b3JkIHRocm93cyBmb2xsb3dlZCBieSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aHJvd24gZXhjZXB0aW9uIHR5cGVzLgotfAotfEZvciBleGFtcGxlOgotfAotfCAgICBwdWJsaWMgYm9vbGVhbiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotfAotfFRoZSBhY2Nlc3MgbW9kaWZpZXJzIGFyZSBwbGFjZWQgaW4gY2Fub25pY2FsIG9yZGVyIGFzIHNwZWNpZmllZCBieSAiVGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiIuICBUaGlzIGlzIHB1YmxpYywgPHR0PnByb3RlY3RlZDwvdHQ+IG9yIDx0dD5wcml2YXRlPC90dD4gZmlyc3QsIGFuZCB0aGVuIG90aGVyIG1vZGlmaWVycyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiA8dHQ+YWJzdHJhY3Q8L3R0PiwgPHR0PnN0YXRpYzwvdHQ+LCA8dHQ+ZmluYWw8L3R0PiwgPHR0PnN5bmNocm9uaXplZDwvdHQ+IDx0dD5uYXRpdmU8L3R0Pi4KLXwKLQkJICAgIAotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc0dlbmVyYXRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzFGQzAwNkUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBzeXN0ZW0gZ2VuZXJhdGVkLgotfFRoaXMgaXMgdXN1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSBAZ2VuZXJhdGVkIHRhZyBpbiB0aGUgY29tbWVudC4KLQkJICAgIAotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0SXNHZW5lcmF0ZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMyNDQwMzdGIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNldCB0aGUgaXNHZW5lcmF0ZWQgZmxhZy4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZ2VuZXJhdGVkIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxRUMiCi0JCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKSkKLQkJICAgIHJlc3VsdCAgICAgCSJ2b2lkIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzVm9pZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzIxODAzOEYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSXMgdGhpcyBhIHZvaWQgcmV0dXJuIHR5cGUgbWV0aG9kLiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjkwQkMwMjJCIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmF0aXZlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjkwRDEwMzY0IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3luY2hyb25pemVkIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjkwREIwM0MxIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxNC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzZFMDAwMzMiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJ1Y3RvciIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDE1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MUFERDI4MDI0NSIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0YXRpYyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDE2LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNkU0MDM1MCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmFWaXNpYmlsaXR5IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTctMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM2RUIwMzk3IgotCQkgICAgdHlwZSAgICAgICAJIkphdmFWaXNpYmlsaXR5S2luZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzODIzMzNCRTAzMkUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJub25lIikKLQkob2JqZWN0IENsYXNzICJGaWVsZCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxOC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDQ4N0Y5MDMzNCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFVHlwZWRFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEY2MDM5OCIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRDb250YWluaW5nSmF2YUNsYXNzIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNTEyMDAyNCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJHZXQgdGhlIGNsYXNzIHRoYXQgdGhpcyBmaWVsZCBpcyB3aXRoaW4uIgotCQkgICAgcmVzdWx0ICAgICAJIkphdmFDbGFzcyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNBcnJheSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjU1RjAxRTciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSXMgdGhpcyBmaWVsZCBhbiBhcnJheSB0eXBlLiIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMWQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM2QkUwMjZGIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3RhdGljIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMWUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM2QzIwMkVEIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YVZpc2liaWxpdHkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxZi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzZDNzAzNEYiCi0JCSAgICB0eXBlICAgICAgIAkiSmF2YVZpc2liaWxpdHlLaW5kIgotCQkgICAgcXVpZHUgICAgICAJIjM4MjMzM0JFMDMyRSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0cmFuc2llbnQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwNDg4MDEwM0I4IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidm9sYXRpbGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwNDg4MDgwMTJEIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJub25lIikKLQkob2JqZWN0IENsYXNzICJUeXBlS2luZCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyMC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRCNDYwMDJCRiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlVOREVGSU5FRD0xIENMQVNTPTIgSU5URVJGQUNFPTMgRVhDRVBUSU9OPTQiCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVU5ERUZJTkVEIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwQjlFMzYwMUExIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkNMQVNTIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwQjlFNDQwMjVEIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIklOVEVSRkFDRSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDIzLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEI5RTU2MDEyNCIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJFWENFUFRJT04iCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyNC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBCOUU2NTAxQTEiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJub25lIikKLQkob2JqZWN0IENsYXNzICJCbG9jayIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyNS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic291cmNlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgxMEU3RkMwMjM5IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNBNkM1M0UxMDAyOSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkNvbW1lbnQiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjctMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODBGODg5QjAyQjgiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDI4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEY4OEQ2MDBBNSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIpKSkKLQkob2JqZWN0IENsYXNzICJTdGF0ZW1lbnQiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjktMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODBGODhCOTAyNUEiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDJhLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEY4OERBMDA1NiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIpKSkKLQkob2JqZWN0IENsYXNzICJKYXZhUGFja2FnZSIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyYi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MTA4RTAzMDFEMiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMmMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzk5MDk0RDcwMDQ2IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVQYWNrYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDVDM0Y3MDAwQSIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiSmF2YVZpc2liaWxpdHlLaW5kIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDMwLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgyMzMzQkUwMzJFIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxQQUNLQUdFPTEKLXxQVUJMSUM9MgotfFBSSVZBVEU9MwotfFBST1RFQ1RFRD00Ci0JICAgIAotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBVQkxJQyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDMxLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjMzM0UyMDIyQyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQUklWQVRFIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyMzMzRTcwMDNFIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBST1RFQ1RFRCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDMzLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjMzM0U4MDM4OSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQQUNLQUdFIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyMzMzRUEwMzhDIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJKYXZhUGFyYW1ldGVyS2luZCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzNS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MUMxRThGMDEyMyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18SU49MAotfE9VVD0xCi18SU5PVVQ9MgotfFJFVFVSTj0zCi0JICAgIAotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIklOIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkxQzFFRkMwMkVDIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk9VVCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDM3LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MUMxRUZGMDE2QSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJJTk9VVCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDM4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MUMxRjAxMDA0MCIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJSRVRVUk4iCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzOS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTFDMjE5NDAzODciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkphdmFEYXRhVHlwZSIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzYS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5NTkxMzM0MDMxNiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2OEUyMDFCMSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldERlZmF1bHRWYWx1ZVN0cmluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkY5MTAzMDMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByaW1pdGl2ZS4iCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpKQotCShvYmplY3QgQ2xhc3MgIkFycmF5VHlwZSIKLQkgICAgcXVpZCAgICAgICAJIjNBOUQ3OUVEMDFERiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18RGVzY3JpYmVzIGEgSmF2YSBBcnJheSB0eXBlCi18ICAgRm9yIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cywgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZQotfCAgIHNwZWNpZmllZCBkaXJlY3RseS4gIFRoaXMgd291bGQgcmVxdWlyZSBpbnN0YW50aWF0aW5nIGEgY2hhaW4gb2YgY29tcG9uZW50IHR5cGVzCi18ICAgc3VjaCBhcyBTdHJpbmdbXVtdW11bXS0+U3RyaW5nW11bXVtdLT5TdHJpbmdbXVtdLT5TdHJpbmdbXS0+U3RyaW5nLgotfAotfCAgVGhlIGNvbXBvbmVudCB0eXBlIHJlbGF0aW9uc2hpcCB3aWxsIGJlIGNvbXB1dGVkIGlmIHRoZSBmaW5hbENvbXBvbmVudFR5cGUKLXwgIGFuZCBhcnJheSBkaW1lbnNpb25zIGlzIHNwZWNpZmllZC4KLXwgCi18ICBGb3IgdGhpcyByZWFzb24sIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGNyZWF0ZSBpcyB0aHJvdWdoIHRoZSBKYXZhUmVmRmFjdG9yeSBmYWN0b3J5IG1ldGhvZDoKLXwgICAgICAgY3JlYXRlQXJyYXlUeXBlKEphdmFDbGFzcyBmaW5hbENvbXBvbmVudFR5cGUsIGludCBkaW1lbnNpb25zKQotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBOUQ3OUZEMDEwRiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmluYWxDb21wb25lbnRUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNBOUQ3QTgyMDE5MyIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfEdldCB0aGUgZmluYWwgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgQXJyYXkgVHlwZS4KLXwKLXxJbiBvcmRlciB0byBlbnN1cmUgYSB1bmlxdWUgaW5zdGFuY2UsIHdlIHdpbGwgcmVzb2x2ZSB0aGlzIHR5cGUgdXNpbmcgcmVmbGVjdGlvbi4gSXQgdHVybnMgb3V0IHRvIGJlIG1vc3QgZWZmaWNpZW50IHRvIGp1c3QgZG8gdGhpcyBieSB0cmltbWluZyB0aGUgbmFtZS4KLQkJICAgIAotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldENvbXBvbmVudFR5cGVBc0hlbHBlciIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QUY5ODAxMzYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxHZXQgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkuIAotfAotfElmIHRoaXMgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSwgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUgdGhlIG5lc3RlZCBhcnJheSB0eXBlLgotCQkgICAgCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVKYXZhSGVscGVycyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1QURFNDAzQTYiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNQcmltaXRpdmVBcnJheSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjQxNzAyQjgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSXMgdGhpcyBhbiBhcnJheSBvZiBqYXZhIHByaW1pdGl2ZXMiCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRDb21wb25lbnRUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNDU1MDNCQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTZXQgdGhlIGNvbXBvbmVudCB0eXBlLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJoZWxwZXJDb21wb25lbnRUeXBlIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAyMjYiCi0JCQkgICAgdHlwZSAgICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiCi0JCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFycmF5RGltZW5zaW9ucyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCQkgICAgbmFtZSAgICAgICAJIkZpbmFsIgotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJCSAgICBuYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkJICAgIG5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkJICAgIG5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0IgotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJCSAgICBuYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIgotCQkJICAgIHZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJCSAgICBuYW1lICAgICAgIAkiUmVhZC9Xcml0ZSIKLQkJCSAgICB2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpKQotCQkgICAgcXVpZCAgICAgICAJIjNBOUQ3QUM4MDI4NCIKLQkJICAgIHR5cGUgICAgICAgCSJpbnQiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJKVHlwZUphdmFIZWxwZXJzIgotCSAgICBxdWlkICAgICAgIAkiM0I2NUFERTQwM0E2IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpbnRlcmZhY2UgaXMgYSBjb21tb24gaW50ZXJmYWNlIGJldHdlZW4gSmF2YUNsYXNzIGFuZCBKYXZhRGF0YVR5cGUgcGx1cyBzb21lIGNvbW1vbiBoZWxwZXIgbWV0aG9kcy4iCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUFFMTcwMjY5IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiSlR5cGVMaXN0IgotCSAgICBxdWlkICAgICAgIAkiM0I2NUI4NzYwMkMxIgotCSAgICBkb2N1bWVudGF0aW9uIAkiamF2YS51dGlsLkxpc3QgdHlwZSIKLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuTGlzdCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1Qjg4RjAzOTkiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJKYXZhRXZlbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQzYyRkFGMTAzQzgiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzREY0Q0U4MzAzOTAiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENTlEMDIzMCIpKQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQotCShvYmplY3QgQXNzb2NpYXRpb24gIkltcGxlbWVudHMiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwM2MtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QTBENzAyNDIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJDb25zdHJhaW50IC0gU291cmNlIG9mIGltcGxlbWVudHMgaXMgb2YgVHlwZUtpbmQgQ0xBU1NUWVBFIGFuZCB0YXJnZXQgaXMgSU5URVJGQUNFVFlQRSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiaW1wbGVtZW50c0ludGVyZmFjZXMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzZC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QTBEQTAxMDkiCi0JCSAgICBsYWJlbCAgICAgIAkiaW1wbGVtZW50c0ludGVyZmFjZXMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImltcGxlbWVudGVkQnkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzZS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QTBEQTAxMzgiCi0JCSAgICBsYWJlbCAgICAgIAkiaW1wbGVtZW50ZWRCeSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiTWV0aG9kSGFzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDNmLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEFGMDMwMkNFIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwYXJhbWV0ZXJzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEFGMDgwMTk2IgotCQkgICAgbGFiZWwgICAgICAJInBhcmFtZXRlcnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFyYW1ldGVyIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRDc4MDI4MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAibWV0aG9kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEFGMDgwMTk3IgotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQyLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEIwODgwMUE1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIvdHlwZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQzLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRCMDkxMDA3RCIKLQkJICAgIGxhYmVsICAgICAgCSIvdHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiL3R5cGVkRWxlbWVudCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQ0LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRCMDkxMDA4QyIKLQkJICAgIGxhYmVsICAgICAgCSIvdHlwZWRFbGVtZW50IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhcmFtZXRlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiTWV0aG9kVGhyb3dzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQ1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgxMEI2MUIwMTc4IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGFyZ2V0IG11c3QgYmUgb2Yga2luZCBFWENFUFRJT05UWVBFIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJqYXZhRXhjZXB0aW9ucyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDQ2LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MTBCNjFFMDFDMyIKLQkJICAgIGxhYmVsICAgICAgCSJqYXZhRXhjZXB0aW9ucyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAibWV0aG9kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDctMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgxMEI2MUUwMjI3IgotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiQ29udGVudHMiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODEwRTYwODAyNjgiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImNvbnRhaW5lZEJ5IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDktMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgxMEU2MEUwMTQ0IgotCQkgICAgbGFiZWwgICAgICAJImNvbnRhaW5lZEJ5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNGEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgxMEU2MEUwMTYyIgotCQkgICAgbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIkNsYXNzSW1wb3J0cyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0Yi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MjlDNEJGMDAwRCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiY2xhc3NJbXBvcnQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0Yy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzRCRjAwMEUiCi0JCSAgICBsYWJlbCAgICAgIAkiY2xhc3NJbXBvcnQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImltcG9ydGVkQnkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0ZC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzRCRjAwMEYiCi0JCSAgICBsYWJlbCAgICAgIAkiaW1wb3J0ZWRCeSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiUGFja2FnZUltcG9ydHMiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNGUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODI5QzRFQzAyMDciCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInBhY2thZ2VJbXBvcnRzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNGYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM0RUUwMEZCIgotCQkgICAgbGFiZWwgICAgICAJInBhY2thZ2VJbXBvcnRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhY2thZ2UiCi0JCSAgICBxdWlkdSAgICAgIAkiMzgxMDhFMDMwMUQyIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImltcG9ydGVkQnkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1MC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzRFRTAxMDUiCi0JCSAgICBsYWJlbCAgICAgIAkiaW1wb3J0ZWRCeSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1MS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MkEyOUJEMDIxOSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZmllbGRzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyQTI5QkUwMzUwIgotCQkgICAgbGFiZWwgICAgICAJImZpZWxkcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiamF2YUNsYXNzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyQTI5QkUwM0JGIgotCQkgICAgbGFiZWwgICAgICAJImphdmFDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODJBMjlDMDAxN0QiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIm1ldGhvZHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1NS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODJBMjlDMTAxNzQiCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImphdmFDbGFzcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDU2LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MkEyOUMxMDIwQSIKLQkJICAgIGxhYmVsICAgICAgCSJqYXZhQ2xhc3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDU3LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQTlFQjQwM0M2IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIvc3VwZXJ0eXBlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQTlFQjgwM0I3IgotCQkgICAgbGFiZWwgICAgICAJIi9zdXBlcnR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIi9zdWJ0eXBlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTktMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQTlFQjkwMDk4IgotCQkgICAgbGFiZWwgICAgICAJIi9zdWJ0eXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDVhLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQTlGMDMwMUFDIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICIvc3VwZXJ0eXBlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQTlGMDkwMzI4IgotCQkgICAgbGFiZWwgICAgICAJIi9zdXBlcnR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIi9zdWJ0eXBlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQTlGMEEwMDFDIgotCQkgICAgbGFiZWwgICAgICAJIi9zdWJ0eXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBQTA5NTAzRTUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImluaXRpYWxpemVycyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDVlLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMDk3MDE1MyIKLQkJICAgIGxhYmVsICAgICAgCSJpbml0aWFsaXplcnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpJbml0aWFsaXplciIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QTVEQzAwQkIiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImphdmFDbGFzcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDVmLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMDk3MDE1RCIKLQkJICAgIGxhYmVsICAgICAgCSJqYXZhQ2xhc3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDYwLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQUEyMTIwMEMyIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJkZWNsYXJlZENsYXNzZXMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2MS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQTIxNzAxRDgiCi0JCSAgICBsYWJlbCAgICAgIAkiZGVjbGFyZWRDbGFzc2VzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJkZWNsYXJpbmdDbGFzcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDYyLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMjE3MDJEQyIKLQkJICAgIGxhYmVsICAgICAgCSJkZWNsYXJpbmdDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBQTJBNzAxQzEiCi0JICAgIHN0ZXJlb3R5cGUgCSJkZXJpdmVkIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJqYXZhQ2xhc3NlcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDY0LTAwNWQ5ZTZhZGVjNDoxIikpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQTJBODAzNjciCi0JCSAgICBsYWJlbCAgICAgIAkiamF2YUNsYXNzZXMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImphdmFQYWNrYWdlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjUtMDA1ZDllNmFkZWM0OjEiKSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMkE5MDA4MyIKLQkJICAgIGxhYmVsICAgICAgCSJqYXZhUGFja2FnZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYWNrYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjM4MTA4RTAzMDFEMiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2Ni0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkFBQzMzMDM2QSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAic291cmNlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjctMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUFDMzgwMTQwIgotCQkgICAgbGFiZWwgICAgICAJInNvdXJjZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJpbml0aWFsaXplciIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDY4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBQzM4MDE2OCIKLQkJICAgIGxhYmVsICAgICAgCSJpbml0aWFsaXplciIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkluaXRpYWxpemVyIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBNURDMDBCQiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDY5LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQUFDNTYwMkEyIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJpbml0aWFsaXplciIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDZhLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBQzU3MDJERiIKLQkJICAgIGxhYmVsICAgICAgCSJpbml0aWFsaXplciIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiZmllbGQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2Yi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQUM1NzAzMDciCi0JCSAgICBsYWJlbCAgICAgIAkiZmllbGQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpGaWVsZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2Yy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkFBQ0E1MDFFNyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAic291cmNlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NmFjNDAtODgyNi0xMWUxLTAwMDAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUFDQTcwMTdDIgotCQkgICAgbGFiZWwgICAgICAJInNvdXJjZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIgotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJtZXRob2QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ2YWM0MC04ODI2LTExZTEtMDAwMS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQUNBNzAxQjgiCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMSIKLQkgICAgcXVpZCAgICAgICAJIjNDNjJGQkUwMDE2OCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZXZlbnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQkUyMDA4RiIKLQkJICAgIGxhYmVsICAgICAgCSJldmVudHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhRXZlbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MkZBRjEwM0M4IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMiIKLQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkJFMjAwOTEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMiCi0JICAgIHF1aWQgICAgICAgCSIzQzg5Mzg3NzAyNTMiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImFsbEV2ZW50cyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0M4OTM4NzgwMkNDIgotCQkgICAgbGFiZWwgICAgICAJImFsbEV2ZW50cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFFdmVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkFGMTAzQzgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg5Mzg3ODAyQ0UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUiCi0JICAgIHF1aWQgICAgICAgCSIzREY0Q0FBRDAxQTMiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImNvbXBvbmVudFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0RGNENBQUUwMUVCIgotCQkgICAgbGFiZWwgICAgICAJImNvbXBvbmVudFR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzaWZpZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDRTRGRUUwMzcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2IgotCQkgICAgcXVpZCAgICAgICAJIjNERjRDQUFFMDFGNSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkFycmF5VHlwZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTlENzlFRDAxREYiKSkpKQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFY29yZSBiaW5kaW5nIgotCSAgICBxdWlkICAgICAgIAkiMzgxMDlDMEYwMDlCIgotCSAgICB0aXRsZSAgICAgIAkiRWNvcmUgYmluZGluZyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJNDA5NAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIiBAMQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTA0LCA1NzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEKLQkJCWxvY2F0aW9uICAgCSg2ODksIDM2OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk4MzAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGaWVsZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDY4OSwgNDI0KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTgKLQkJCW1heF93aWR0aCAgCTcwOSkKLQkJICAgIHdpZHRoICAgICAgCTg0OAotCQkgICAgaGVpZ2h0ICAgICAJNDM4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYWNrYWdlIiBAMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIDQ4MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDMxLCA0MzQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhY2thZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzODEwOEUwMzAxRDIiCi0JCSAgICB3aWR0aCAgICAgIAkzNDAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RVBhY2thZ2UiIEAzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5MiwgMTQ0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzCi0JCQlsb2NhdGlvbiAgIAkoMTAzLCA0NSkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTE3OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVQYWNrYWdlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwNUMzRjcwMDBBIgotCQkgICAgd2lkdGggICAgICAJMTk2Ci0JCSAgICBoZWlnaHQgICAgIAkyMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTkwOTRENzAwNDYiCi0JCSAgICBjbGllbnQgICAgIAlAMgotCQkgICAgc3VwcGxpZXIgICAJQDMKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIgQDUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcyOCwgMTgyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANQotCQkJbG9jYXRpb24gICAJKDE0NjUsIDE2MTUpCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1MjYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA1Ci0JCQlsb2NhdGlvbiAgIAkoMTQ2NSwgMTcxNSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTYKLQkJCW1heF93aWR0aCAgCTQ1MikKLQkJICAgIHdpZHRoICAgICAgCTU0NAotCQkgICAgaGVpZ2h0ICAgICAJNDQwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFT3BlcmF0aW9uIiBANgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMzIwLCAxNDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDYKLQkJCWxvY2F0aW9uICAgCSgyMjMxLCA0NSkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTE3OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVPcGVyYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0REFBMjAwQTAiCi0JCSAgICB3aWR0aCAgICAgIAkxOTYKLQkJICAgIGhlaWdodCAgICAgCTIyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhRGF0YVR5cGUiIEA3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM1MiwgMTIxNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANwotCQkJbG9jYXRpb24gICAJKDExLCAxMTQzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY4MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFEYXRhVHlwZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM5NTkxMzM0MDMxNiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDcKLQkJCWxvY2F0aW9uICAgCSgxMSwgMTE5OSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1ODUpCi0JCSAgICB3aWR0aCAgICAgIAk3MDAKLQkJICAgIGhlaWdodCAgICAgCTE2OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiIEA4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIzMzYsIDc2OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOAotCQkJbG9jYXRpb24gICAJKDE3MzYsIDM1NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxMjAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA4Ci0JCQlsb2NhdGlvbiAgIAkoMTczNiwgNDEzKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTE3Ci0JCQltYXhfd2lkdGggIAkxMDI3KQotCQkgICAgd2lkdGggICAgICAJMTIxOAotCQkgICAgaGVpZ2h0ICAgICAJODQ0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzk5MDk1MzgwM0FEIgotCQkgICAgY2xpZW50ICAgICAJQDgKLQkJICAgIHN1cHBsaWVyICAgCUA2Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzNzYsIDM0NikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzc2LCAyNTUpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDEwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzMTIsIDI4NjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwCi0JCQlsb2NhdGlvbiAgIAkoMzMwLCAyMjczKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE5NjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxMAotCQkJbG9jYXRpb24gICAJKDMzMCwgMjMyOSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyNQotCQkJbWF4X3dpZHRoICAJMTY4MCkKLQkJICAgIHdpZHRoICAgICAgCTE5ODIKLQkJICAgIGhlaWdodCAgICAgCTEyMDQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTkwOTUwMDAwQjMiCi0JCSAgICBjbGllbnQgICAgIAlAMTAKLQkJICAgIHN1cHBsaWVyICAgCUA1Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1OTQsIDIyNjIpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU5NCwgMjA0NCkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhcmFtZXRlciIgQDEyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwMDgsIDE0NzIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEyCi0JCQlsb2NhdGlvbiAgIAkoNjA4LCAxMjg2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTgwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFQYXJhbWV0ZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxMgotCQkJbG9jYXRpb24gICAJKDYwOCwgMTM0MikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk3Ci0JCQltYXhfd2lkdGggIAk2ODUpCi0JCSAgICB3aWR0aCAgICAgIAk4MTgKLQkJICAgIGhlaWdodCAgICAgCTM5NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RVBhcmFtZXRlciIgQDEzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwMDgsIDk2MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTMKLQkJCWxvY2F0aW9uICAgCSg5MTksIDg2MSkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTE3OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVQYXJhbWV0ZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNFNjE1MDEwNCIKLQkJICAgIHdpZHRoICAgICAgCTE5NgotCQkgICAgaGVpZ2h0ICAgICAJMjIyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCNzgxOEIwMDE4NiIKLQkJICAgIGNsaWVudCAgICAgCUAxMgotCQkgICAgc3VwcGxpZXIgICAJQDEzCi0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiIEAxNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMjAsIDgxNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCWxvY2F0aW9uICAgCSg1NiwgNjMwKQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTI4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJbG9jYXRpb24gICAJKDU2LCA3MzApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk2Ci0JCQltYXhfd2lkdGggIAk0NTIpCi0JCSAgICB3aWR0aCAgICAgIAk1NDYKLQkJICAgIGhlaWdodCAgICAgCTM5NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUyNjhFMjAxQjEiCi0JCSAgICBjbGllbnQgICAgIAlANwotCQkgICAgc3VwcGxpZXIgICAJQDE1Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFVHlwZWRFbGVtZW50IiBAMTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEwNCwgMTEyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3Ci0JCQlsb2NhdGlvbiAgIAkoOTE2LCA0MSkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM3NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVUeXBlZEVsZW1lbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEY2MDM5OCIKLQkJICAgIHdpZHRoICAgICAgCTM5NAotCQkgICAgaGVpZ2h0ICAgICAJMTY0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDQ4N0Y5MDMzNCIKLQkJICAgIGNsaWVudCAgICAgCUAxCi0JCSAgICBzdXBwbGllciAgIAlAMTcKLQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiUG9seW1vcnBoaXNtIgotCSAgICBxdWlkICAgICAgIAkiMzgxMDlEMDAwMzczIgotCSAgICB0aXRsZSAgICAgIAkiUG9seW1vcnBoaXNtIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMTkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDk2LCA1NzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE5Ci0JCQlsb2NhdGlvbiAgIAkoMzY1LCA1MzApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICB3aWR0aCAgICAgIAkyODAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMiIEAyMAotCQkgICAgbG9jYXRpb24gICAJKDE2NiwgNTM3KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkE5RUI0MDNDNiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiL3N1cGVydHlwZSIgQDIxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMAotCQkJICAgIGxvY2F0aW9uICAgCSgtMzMwLCAyMTcpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMgotCQkJCVBhcmVudF9WaWV3IAlAMjEKLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCA0ODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIyNgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiKy9zdXBlcnR5cGUiCi0JCQkJcGN0RGlzdCAgICAJMC40MTkxOTIKLQkJCQloZWlnaHQgICAgIAkzOAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkE5RUI4MDNCNyIKLQkJCSAgICBjbGllbnQgICAgIAlAMjAKLQkJCSAgICBzdXBwbGllciAgIAlAMTkKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTY2LCA1MzcpCi0JCQkJKDE2NiwgNTE3KQotCQkJCSgzNTYsIDUxNykpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY2LCA1MzcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM1NiwgNTE3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzCi0JCQkJUGFyZW50X1ZpZXcgCUAyMQotCQkJCWxvY2F0aW9uICAgCSgzMzQsIDQ2NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIi9zdWJ0eXBlIiBAMjQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMzAsIDIxNykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNAotCQkJCWxvY2F0aW9uICAgCSgyNTcsIDU4MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTg4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrL3N1YnR5cGUiCi0JCQkJcGN0RGlzdCAgICAJMC41MzI0NjgKLQkJCQloZWlnaHQgICAgIAkyNAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkE5RUI5MDA5OCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjAKLQkJCSAgICBzdXBwbGllciAgIAlAMTkKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTY2LCA1MzcpCi0JCQkJKDE2NiwgNTU4KQotCQkJCSgzNTYsIDU1OCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY2LCA1MzcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM1NiwgNTU4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNAotCQkJCWxvY2F0aW9uICAgCSgzMzQsIDYxMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDI3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzOTIsIDU3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjcKLQkJCWxvY2F0aW9uICAgCSgxMjYxLCA1MzApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgd2lkdGggICAgICAJMjgwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJJbXBsZW1lbnRzIiBAMjgKLQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDUyMSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QTBENzAyNDIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImltcGxlbWVudHNJbnRlcmZhY2VzIiBAMjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Ci0JCQkgICAgbG9jYXRpb24gICAJKDQzMCwgLTU0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAKLQkJCQlQYXJlbnRfVmlldyAJQDI5Ci0JCQkJbG9jYXRpb24gICAJKDgzOSwgNDg4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0MDcKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbXBsZW1lbnRzSW50ZXJmYWNlcyIKLQkJCQlwY3REaXN0ICAgIAktMC4zNDM1NTgKLQkJCQloZWlnaHQgICAgIAkzNAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM2NTRBMERBMDEwOSIKLQkJCSAgICBjbGllbnQgICAgIAlAMjgKLQkJCSAgICBzdXBwbGllciAgIAlAMjcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NDQsIDUyMSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1MiwgNTIxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQotCQkJCWxvY2F0aW9uICAgCSgxMTgxLCA0ODUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuNzczMDA2Ci0JCQkJaGVpZ2h0ICAgICAJMzcKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbXBsZW1lbnRlZEJ5IiBAMzIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Ci0JCQkgICAgbG9jYXRpb24gICAJKDQzMCwgLTU0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMKLQkJCQlQYXJlbnRfVmlldyAJQDMyCi0JCQkJbG9jYXRpb24gICAJKDEwODcsIDU3NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzEyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraW1wbGVtZW50ZWRCeSIKLQkJCQlwY3REaXN0ICAgIAktMC40NzA3NjkKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM2NTRBMERBMDEzOCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjgKLQkJCSAgICBzdXBwbGllciAgIAlAMTkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NDQsIDUyMSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCA1MjEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQKLQkJCQlQYXJlbnRfVmlldyAJQDMyCi0JCQkJbG9jYXRpb24gICAJKDY4NCwgNTY0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjg0MzIzMAotCQkJCWhlaWdodCAgICAgCTQzCi0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBAMzUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzUwLCA2MDEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQTlGMDMwMUFDIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvc3VwZXJ0eXBlIiBAMzYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Ci0JCQkgICAgbG9jYXRpb24gICAJKDM1OCwgMjY1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcKLQkJCQlQYXJlbnRfVmlldyAJQDM2Ci0JCQkJbG9jYXRpb24gICAJKDE3MjEsIDY0MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjI2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrL3N1cGVydHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjIyNzI3MwotCQkJCWhlaWdodCAgICAgCTEzCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQTlGMDkwMzI4IgotCQkJICAgIGNsaWVudCAgICAgCUAzNQotCQkJICAgIHN1cHBsaWVyICAgCUAyNwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxNzUwLCA2MDEpCi0JCQkJKDE3NTAsIDYyNykKLQkJCQkoMTUzMiwgNjI3KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA2MDEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MzIsIDYyNykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOAotCQkJCVBhcmVudF9WaWV3IAlAMzYKLQkJCQlsb2NhdGlvbiAgIAkoMTU1NywgNTc0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiL3N1YnR5cGUiIEAzOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzU4LCAyNjUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MAotCQkJCVBhcmVudF9WaWV3IAlAMzkKLQkJCQlsb2NhdGlvbiAgIAkoMTYyNiwgNTUzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxODgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIisvc3VidHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjYxNTk3MAotCQkJCWhlaWdodCAgICAgCTI0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQTlGMEEwMDFDIgotCQkJICAgIGNsaWVudCAgICAgCUAzNQotCQkJICAgIHN1cHBsaWVyICAgCUAyNwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxNzUwLCA2MDEpCi0JCQkJKDE3NTAsIDU3NikKLQkJCQkoMTUzMiwgNTc2KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA2MDEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MzIsIDU3NikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MQotCQkJCVBhcmVudF9WaWV3IAlAMzkKLQkJCQlsb2NhdGlvbiAgIAkoMTU1NywgNjMwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkgICAgcXVpZCAgICAgICAJIjM4MTA5RjkyMDAwQiIKLQkgICAgdGl0bGUgICAgICAJIk1haW4iCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTI3NjAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBOb3RlVmlldyBANDIKLQkJICAgIGxvY2F0aW9uICAgCSg4NDgsIDE4NDApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQyCi0JCQlsb2NhdGlvbiAgIAkoNTUxLCAxNzE4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTU1OQotCQkJbGFiZWwgICAgICAJIlRoaXMgc2hvdWxkIHJlYWxseSBiZSBKYXZhQ2xhc3MgYW5kIEphdmFEYXRhVHlwZSwgZUNsYXNzaWZpZXIgaXMgdGhlaXIgY2xvc2VzdCBjb21tb24gYW5jZXN0b3IuIikKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTg0MjE2MzEKLQkJICAgIHdpZHRoICAgICAgCTYxOQotCQkgICAgaGVpZ2h0ICAgICAJMjU2KQotCQkob2JqZWN0IE5vdGVWaWV3IEA0MwotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMzIwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MwotCQkJbG9jYXRpb24gICAJKDEwNywgMTY2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTYKLQkJCW1heF93aWR0aCAgCTI5NQotCQkJbGFiZWwgICAgICAJIlRoZSBjbGFzc2VzIHdpbGwgYmUgY29udGFpbmVkIGJ5IHRoZSBzdGFuZGFyZCBFUGFja2FnZSBtZXRhT2JqZWN0cyByZWxhdGlvbnNoaXAuIikKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICB3aWR0aCAgICAgIAkzNTUKLQkJICAgIGhlaWdodCAgICAgCTMyMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpGaWVsZCIgQDQ0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3NzYsIDQ4MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDQKLQkJCWxvY2F0aW9uICAgCSgxNjgwLCA0MzQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRmllbGQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIHdpZHRoICAgICAgCTIxMAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkluaXRpYWxpemVyIiBANDUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgMjI0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0NQotCQkJbG9jYXRpb24gICAJKDEzNjMsIDE1MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbml0aWFsaXplciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEE1REMwMEJCIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANDUKLQkJCWxvY2F0aW9uICAgCSgxMzYzLCAyMDcpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMzQ1KQotCQkgICAgd2lkdGggICAgICAJNDI4Ci0JCSAgICBoZWlnaHQgICAgIAkxNjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhY2thZ2UiIEA0NgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg2MDgsIDk2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0NgotCQkJbG9jYXRpb24gICAJKDQ0NywgNTApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhY2thZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzODEwOEUwMzAxRDIiCi0JCSAgICB3aWR0aCAgICAgIAkzNDAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFyYW1ldGVyIiBANDcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc0NCwgMTU4NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDcKLQkJCWxvY2F0aW9uICAgCSgxMzQ0LCAxNDg4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTgwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFQYXJhbWV0ZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUQ3ODAyODAiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA0NwotCQkJbG9jYXRpb24gICAJKDEzNDQsIDE1NDQpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMwotCQkJbWF4X3dpZHRoICAJNjc4KQotCQkgICAgd2lkdGggICAgICAJODE4Ci0JCSAgICBoZWlnaHQgICAgIAkyMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIiBANDgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcxMiwgOTkyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0OAotCQkJbG9jYXRpb24gICAJKDE2MTMsIDk0NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxOTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXRob2QiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIHdpZHRoICAgICAgCTIxNgotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiTWV0aG9kSGFzIiBANDkKLQkJICAgIGxvY2F0aW9uICAgCSgxNzAwLCAxMjYyKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjAzMDJDRSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kIiBANTAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Ci0JCQkgICAgbG9jYXRpb24gICAJKDMwOCwgMjM4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGMDgwMTk3IgotCQkJICAgIGNsaWVudCAgICAgCUA0OQotCQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3MDAsIDEyNjIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDAsIDEwNDkpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTEKLQkJCQlQYXJlbnRfVmlldyAJQDUwCi0JCQkJbG9jYXRpb24gICAJKDE2MzMsIDEwOTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNzgxNjU5Ci0JCQkJaGVpZ2h0ICAgICAJNjgKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJhbWV0ZXJzIiBANTIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Ci0JCQkgICAgbG9jYXRpb24gICAJKDMwOCwgMjM4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMKLQkJCQlQYXJlbnRfVmlldyAJQDUyCi0JCQkJbG9jYXRpb24gICAJKDE4MzcsIDE0MzMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIzNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhcmFtZXRlcnMiCi0JCQkJcGN0RGlzdCAgICAJMC44MDM1NjUKLQkJCQloZWlnaHQgICAgIAkxMzcKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUYwODAxOTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDQ5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTcwMCwgMTI2MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMCwgMTQ3NikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NAotCQkJCVBhcmVudF9WaWV3IAlANTIKLQkJCQlsb2NhdGlvbiAgIAkoMTYzNiwgMTQ1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDUxMjgKLQkJCQloZWlnaHQgICAgIAk2NQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1Ci0JCQkJUGFyZW50X1ZpZXcgCUA1MgotCQkJCWxvY2F0aW9uICAgCSgxNTkyLCAxMzk3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjYyODgyMQotCQkJCWhlaWdodCAgICAgCTEwOQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFFdmVudCIgQDU2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIxOTIsIDY1NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1NgotCQkJbG9jYXRpb24gICAJKDIwNjQsIDYwNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhRXZlbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNDNjJGQUYxMDNDOCIKLQkJICAgIHdpZHRoICAgICAgCTI3NAotCQkgICAgaGVpZ2h0ICAgICAJMTIyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDU3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDU2MCwgNjcyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1NwotCQkJbG9jYXRpb24gICAJKDM3NCwgNTU0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANTcKLQkJCWxvY2F0aW9uICAgCSgzNzQsIDYxMCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk0Ci0JCQltYXhfd2lkdGggIAkzMTMpCi0JCSAgICB3aWR0aCAgICAgIAkzOTAKLQkJICAgIGhlaWdodCAgICAgCTI1OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEA1OAotCQkgICAgbG9jYXRpb24gICAJKDEyMTMsIDUzOCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODJBMjlCRDAyMTkiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImZpZWxkcyIgQDU5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA1OAotCQkJICAgIGxvY2F0aW9uICAgCSg3MzMsIDI4MikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQotCQkJCWxvY2F0aW9uICAgCSgxNTExLCA1MTMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE5MgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ZpZWxkcyIKLQkJCQlwY3REaXN0ICAgIAkwLjY1MzAxNwotCQkJCWhlaWdodCAgICAgCTI2Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyQTI5QkUwMzUwIgotCQkJICAgIGNsaWVudCAgICAgCUA1OAotCQkJICAgIHN1cHBsaWVyICAgCUA0NAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTMsIDUzOCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3MSwgNTM4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQotCQkJCWxvY2F0aW9uICAgCSgxNjI0LCA0ODUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhQ2xhc3MiIEA2MgotCQkJICAgIFBhcmVudF9WaWV3IAlANTgKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzMzLCAyODIpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyQTI5QkUwM0JGIgotCQkJICAgIGNsaWVudCAgICAgCUA1OAotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTMsIDUzOCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzU1LCA1MzgpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1IiBANjMKLQkJICAgIGxvY2F0aW9uICAgCSg5MTYsIDMwNykKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTA5NTAzRTUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImluaXRpYWxpemVycyIgQDY0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2MwotCQkJICAgIGxvY2F0aW9uICAgCSgyNzYsIDk5KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjUKLQkJCQlQYXJlbnRfVmlldyAJQDY0Ci0JCQkJbG9jYXRpb24gICAJKDEwOTYsIDIxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjEyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraW5pdGlhbGl6ZXJzIgotCQkJCXBjdERpc3QgICAgCTAuNDEwNzE5Ci0JCQkJaGVpZ2h0ICAgICAJOTIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTA5NzAxNTMiCi0JCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ1Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTE2LCAzMDcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTQsIDMwNykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NgotCQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCQlsb2NhdGlvbiAgIAkoMTM0NSwgMzY4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjk3OTY4NwotCQkJCWhlaWdodCAgICAgCTYxCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiamF2YUNsYXNzIiBANjcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDYzCi0JCQkgICAgbG9jYXRpb24gICAJKDI3NiwgOTkpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUEwOTcwMTVEIgotCQkJICAgIGNsaWVudCAgICAgCUA2MwotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg5MTYsIDMwNykKLQkJCQkoNzEzLCAzMDcpCi0JCQkJKDcxMywgNTQzKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTYsIDMwNykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzEzLCA1NDMpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBANjgKLQkJICAgIGxvY2F0aW9uICAgCSgyMDYsIDY0MikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTIxMjAwQzIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImRlY2xhcmVkQ2xhc3NlcyIgQDY5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJICAgIGxvY2F0aW9uICAgCSgtNTc4LCAyNzQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MAotCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA1ODIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMyNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2RlY2xhcmVkQ2xhc3NlcyIKLQkJCQlwY3REaXN0ICAgIAkwLjM0MzE5NQotCQkJCWhlaWdodCAgICAgCTMxCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUEyMTcwMUQ4IgotCQkJICAgIGNsaWVudCAgICAgCUA2OAotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyMDYsIDY0MikKLQkJCQkoMjA2LCA2MTIpCi0JCQkJKDM2NSwgNjEyKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDYsIDY0MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY1LCA2MTIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEKLQkJCQlQYXJlbnRfVmlldyAJQDY5Ci0JCQkJbG9jYXRpb24gICAJKDM0NywgNTU2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMjM2NwotCQkJCWhlaWdodCAgICAgCTU3Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVjbGFyaW5nQ2xhc3MiIEA3MgotCQkJICAgIFBhcmVudF9WaWV3IAlANjgKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU3OCwgMjc0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzMKLQkJCQlQYXJlbnRfVmlldyAJQDcyCi0JCQkJbG9jYXRpb24gICAJKDI1OCwgNjc1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyOTgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitkZWNsYXJpbmdDbGFzcyIKLQkJCQlwY3REaXN0ICAgIAkwLjQzNDI4NgotCQkJCWhlaWdodCAgICAgCTMKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTIxNzAyREMiCi0JCQkgICAgY2xpZW50ICAgICAJQDY4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDIwNiwgNjQyKQotCQkJCSgyMDYsIDY3MikKLQkJCQkoMzY1LCA2NzIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwNiwgNjQyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjUsIDY3MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NAotCQkJCVBhcmVudF9WaWV3IAlANzIKLQkJCQlsb2NhdGlvbiAgIAkoMzQ1LCA3MjYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEA3NQotCQkgICAgbG9jYXRpb24gICAJKDYwMywgMzQ3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA3NgotCQkJUGFyZW50X1ZpZXcgCUA3NQotCQkJbG9jYXRpb24gICAJKDYwMywgMjI4KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlhbmNob3JfbG9jIAkxCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGRlcml2ZWQ+PiIKLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQloZWlnaHQgICAgIAkxMjAKLQkJCW9yaWVudGF0aW9uIAkwKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMkE3MDFDMSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiamF2YUNsYXNzZXMiIEA3NwotCQkJICAgIFBhcmVudF9WaWV3IAlANzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjcsIDIxOSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4Ci0JCQkJUGFyZW50X1ZpZXcgCUA3NwotCQkJCWxvY2F0aW9uICAgCSg3MjAsIDQxOSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjQ4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIramF2YUNsYXNzZXMiCi0JCQkJcGN0RGlzdCAgICAJMC4zNjc1MjEKLQkJCQloZWlnaHQgICAgIAkxMTcKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTJBODAzNjciCi0JCQkgICAgY2xpZW50ICAgICAJQDc1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjAzLCAzNDcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYwMywgNTQzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5Ci0JCQkJUGFyZW50X1ZpZXcgCUA3NwotCQkJCWxvY2F0aW9uICAgCSg2NTcsIDUyMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImphdmFQYWNrYWdlIiBAODAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Ci0JCQkgICAgbG9jYXRpb24gICAJKDI3LCAyMTkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MQotCQkJCVBhcmVudF9WaWV3IAlAODAKLQkJCQlsb2NhdGlvbiAgIAkoNDgyLCAxNzkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI2MwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2phdmFQYWNrYWdlIgotCQkJCXBjdERpc3QgICAgCTAuODYyOTAzCi0JCQkJaGVpZ2h0ICAgICAJMTIyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUEyQTkwMDgzIgotCQkJICAgIGNsaWVudCAgICAgCUA3NQotCQkJICAgIHN1cHBsaWVyICAgCUA0NgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDYwMywgMzQ3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDMsIDE1MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MgotCQkJCVBhcmVudF9WaWV3IAlAODAKLQkJCQlsb2NhdGlvbiAgIAkoNjU3LCAxNzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA4MwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgY2xpZW50ICAgICAJQDQzCi0JCSAgICBzdXBwbGllciAgIAlANzUKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAODQKLQkJICAgIGxvY2F0aW9uICAgCSg2MTYsIDE1MjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1Ci0JCQlQYXJlbnRfVmlldyAJQDg0Ci0JCQlsb2NhdGlvbiAgIAkoNjE2LCAxNDY1KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaGlkZGVuICAgICAJVFJVRQotCQkJYW5jaG9yICAgICAJMQotCQkJYW5jaG9yX2xvYyAJMQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiIgotCQkJcGN0RGlzdCAgICAJMC41MDAwMDAKLQkJCWhlaWdodCAgICAgCTYwCi0JCQlvcmllbnRhdGlvbiAJMCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QjA4ODAxQTUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIi90eXBlZEVsZW1lbnQiIEA4NgotCQkJICAgIFBhcmVudF9WaWV3IAlAODQKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDk0OCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM2NTRCMDkxMDA4QyIKLQkJCSAgICBjbGllbnQgICAgIAlAODQKLQkJCSAgICBzdXBwbGllciAgIAlANDcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNjE2LCAxNTI0KQotCQkJCSg2MTYsIDE1ODQpCi0JCQkJKDEzMzUsIDE1ODQpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDYxNiwgMTUyNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMzNSwgMTU4NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NwotCQkJCVBhcmVudF9WaWV3IAlAODYKLQkJCQlsb2NhdGlvbiAgIAkoMTI1NiwgMTUzMSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIi90eXBlIiBAODgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDg0Ci0JCQkgICAgbG9jYXRpb24gICAJKDU2LCA5NDgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OQotCQkJCVBhcmVudF9WaWV3IAlAODgKLQkJCQlsb2NhdGlvbiAgIAkoNjk3LCAxMDk5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxMTYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIisvdHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjU4ODE2MQotCQkJCWhlaWdodCAgICAgCTgxCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NEIwOTEwMDdEIgotCQkJICAgIGNsaWVudCAgICAgCUA4NAotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDYxNiwgMTUyNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjE2LCA4MDEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAOTAKLQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA5NjEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgyQTI5QzAwMTdEIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2RzIiBAOTEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDkwCi0JCQkgICAgbG9jYXRpb24gICAJKDYwOCwgNzA1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTIKLQkJCQlQYXJlbnRfVmlldyAJQDkxCi0JCQkJbG9jYXRpb24gICAJKDE0MDksIDg4OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTkyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrbWV0aG9kcyIKLQkJCQlwY3REaXN0ICAgIAkwLjYyNDAyMwotCQkJCWhlaWdodCAgICAgCTczCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyQTI5QzEwMTc0IgotCQkJICAgIGNsaWVudCAgICAgCUA5MAotCQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwODgsIDk2MSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwNCwgOTYxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzCi0JCQkJUGFyZW50X1ZpZXcgCUA5MQotCQkJCWxvY2F0aW9uICAgCSgxNDgzLCAxMDE3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjc2NjA0MAotCQkJCWhlaWdodCAgICAgCTU2Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiamF2YUNsYXNzIiBAOTQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDkwCi0JCQkgICAgbG9jYXRpb24gICAJKDYwOCwgNzA1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MkEyOUMxMDIwQSIKLQkJCSAgICBjbGllbnQgICAgIAlAOTAKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTA4OCwgOTYxKQotCQkJCSg3MzIsIDk2MSkKLQkJCQkoNzMyLCA4MDEpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwODgsIDk2MSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzMyLCA4MDEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJNZXRob2RUaHJvd3MiIEA5NQotCQkgICAgbG9jYXRpb24gICAJKDEwNDcsIDk4MSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODEwQjYxQjAxNzgiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZCIgQDk2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA5NQotCQkJICAgIGxvY2F0aW9uICAgCSg0ODcsIDQwNSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODEwQjYxRTAyMjciCi0JCQkgICAgY2xpZW50ICAgICAJQDk1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA0NywgOTgxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjA0LCA5ODEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiamF2YUV4Y2VwdGlvbnMiIEA5NwotCQkJICAgIFBhcmVudF9WaWV3IAlAOTUKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDg3LCA0MDUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OAotCQkJCVBhcmVudF9WaWV3IAlAOTcKLQkJCQlsb2NhdGlvbiAgIAkoNzMzLCA5NDUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMxMgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2phdmFFeGNlcHRpb25zIgotCQkJCXBjdERpc3QgICAgCTAuNTYzNjY0Ci0JCQkJaGVpZ2h0ICAgICAJMzcKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODEwQjYxRTAxQzMiCi0JCQkgICAgY2xpZW50ICAgICAJQDk1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEwNDcsIDk4MSkKLQkJCQkoNjY5LCA5ODEpCi0JCQkJKDY2OSwgODAxKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQ3LCA5ODEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY2OSwgODAxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5Ci0JCQkJUGFyZW50X1ZpZXcgCUA5NwotCQkJCWxvY2F0aW9uICAgCSg3MjMsIDg1NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEAxMDAKLQkJICAgIGxvY2F0aW9uICAgCSgxNTQxLCA4MDYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkJFMDAxNjgiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImV2ZW50cyIgQDEwMQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwCi0JCQkgICAgbG9jYXRpb24gICAJKDk4MSwgMTM0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDEKLQkJCQlsb2NhdGlvbiAgIAkoMjE2OSwgNzY1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitldmVudHMiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDNjJGQkUyMDA4RiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTAwCi0JCQkgICAgc3VwcGxpZXIgICAJQDU2Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE1NDEsIDgwNikKLQkJCQkoMjIzOCwgODA2KQotCQkJCSgyMjM4LCA3MTcpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NDEsIDgwNikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIzOCwgNzE3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMwotCQkJCVBhcmVudF9WaWV3IAlAMTAxCi0JCQkJbG9jYXRpb24gICAJKDIyOTIsIDc5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyIiBAMTA0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTgxLCAxMzQpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MkZCRTIwMDkxIgotCQkJICAgIGNsaWVudCAgICAgCUAxMDAKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTQxLCA4MDYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc1NSwgODA2KSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMiIEAxMDUKLQkJICAgIGxvY2F0aW9uICAgCSgxNDA1LCA2NjMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQzg5Mzg3NzAyNTMiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImFsbEV2ZW50cyIgQDEwNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Ci0JCQkgICAgbG9jYXRpb24gICAJKDg0NSwgLTkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcKLQkJCQlQYXJlbnRfVmlldyAJQDEwNgotCQkJCWxvY2F0aW9uICAgCSgxOTI1LCA2MjIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE5MwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2FsbEV2ZW50cyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M4OTM4NzgwMkNDIgotCQkJICAgIGNsaWVudCAgICAgCUAxMDUKLQkJCSAgICBzdXBwbGllciAgIAlANTYKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA1LCA2NjMpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwNTUsIDY2MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgKLQkJCQlQYXJlbnRfVmlldyAJQDEwNgotCQkJCWxvY2F0aW9uICAgCSgxOTc1LCA3MDIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuODc2MzM2Ci0JCQkJaGVpZ2h0ICAgICAJMzkKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNCIgQDEwOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Ci0JCQkgICAgbG9jYXRpb24gICAJKDg0NSwgLTkpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M4OTM4NzgwMkNFIgotCQkJICAgIGNsaWVudCAgICAgCUAxMDUKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA1LCA2NjMpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc1NSwgNjYzKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3NpZmllciIgQDExMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDIyNTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTEwCi0JCQlsb2NhdGlvbiAgIAkoMTMwLCAyMDU5KQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjM2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRUNsYXNzaWZpZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjNBQ0U0RkVFMDM3MSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDExMAotCQkJbG9jYXRpb24gICAJKDEzMCwgMjE2MikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNgotCQkJbWF4X3dpZHRoICAJNTM4KQotCQkgICAgd2lkdGggICAgICAJNjU0Ci0JCSAgICBoZWlnaHQgICAgIAk0MTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6QXJyYXlUeXBlIiBAMTExCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM1MiwgMTMyOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTExCi0JCQlsb2NhdGlvbiAgIAkoMTEyLCAxMjU1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ4MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkFycmF5VHlwZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBOUQ3OUVEMDFERiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDExMQotCQkJbG9jYXRpb24gICAJKDExMiwgMTMxMSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk0MDUpCi0JCSAgICB3aWR0aCAgICAgIAk0OTgKLQkJICAgIGhlaWdodCAgICAgCTE2OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E5RDc5RkQwMTBGIgotCQkgICAgY2xpZW50ICAgICAJQDExMQotCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQzMSwgMTI0MykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzEsIDgwMSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDExMwotCQkgICAgbG9jYXRpb24gICAJKDM5MywgMTcyOSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNERjRDQUFEMDFBMyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50VHlwZSIgQDExNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzCi0JCQkgICAgbG9jYXRpb24gICAJKC01NSwgMzg1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMTQKLQkJCQlsb2NhdGlvbiAgIAkoMzc4LCAxOTg2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitjb21wb25lbnRUeXBlIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzREY0Q0FBRTAxRUIiCi0JCQkgICAgY2xpZW50ICAgICAJQDExMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMTAKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMTQKLQkJCQlsb2NhdGlvbiAgIAkoNDc3LCAyMDA4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYiIEAxMTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMwotCQkJICAgIGxvY2F0aW9uICAgCSgtNTUsIDM4NSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzREY0Q0FBRTAxRjUiCi0JCQkgICAgY2xpZW50ICAgICAJQDExMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMTEKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSIgQDExOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMjI0LCAyMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTE4Ci0JCQlsb2NhdGlvbiAgIAkoMjAzMywgMTQ1KQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzgyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRVN0cnVjdHVyYWxGZWF0dXJlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDU5RDAyMzAiCi0JCSAgICB3aWR0aCAgICAgIAk0MDAKLQkJICAgIGhlaWdodCAgICAgCTE4MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0RGNENFODMwMzkwIgotCQkgICAgY2xpZW50ICAgICAJQDU2Ci0JCSAgICBzdXBwbGllciAgIAlAMTE4Ci0JCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkltcG9ydHMiCi0JICAgIHF1aWQgICAgICAgCSIzODEwQTBEQzAxNUQiCi0JICAgIHRpdGxlICAgICAgCSJJbXBvcnRzIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMTIwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDMyMCwgNjcyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMjAKLQkJCWxvY2F0aW9uICAgCSgxODksIDYyNikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIHdpZHRoICAgICAgCTI4MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiQ2xhc3NJbXBvcnRzIiBAMTIxCi0JCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAxMTE1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIKLQkJCVBhcmVudF9WaWV3IAlAMTIxCi0JCQlsb2NhdGlvbiAgIAkoNjc3LCAxMDQwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJYW5jaG9yICAgICAJMQotCQkJYW5jaG9yX2xvYyAJMQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQ2xhc3NJbXBvcnRzIgotCQkJcGN0RGlzdCAgICAJMS4wNjY2NjcKLQkJCWhlaWdodCAgICAgCTc2Ci0JCQlvcmllbnRhdGlvbiAJMCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRCRjAwMEQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImNsYXNzSW1wb3J0IiBAMTIzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjEKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3LCAzMzEpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQKLQkJCQlQYXJlbnRfVmlldyAJQDEyMwotCQkJCWxvY2F0aW9uICAgCSg2NjUsIDY3MSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjQwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrY2xhc3NJbXBvcnQiCi0JCQkJcGN0RGlzdCAgICAJMC43MjcxNTQKLQkJCQloZWlnaHQgICAgIAkyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyOUM0QkYwMDBFIgotCQkJICAgIGNsaWVudCAgICAgCUAxMjEKLQkJCSAgICBzdXBwbGllciAgIAlAMTIwCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDY0MywgMTExNSkKLQkJCQkoNzAzLCAxMTE1KQotCQkJCSg3MDMsIDY3MikKLQkJCQkoNDYwLCA2NzIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0MywgMTExNSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDYwLCA2NzIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjMKLQkJCQlsb2NhdGlvbiAgIAkoNTI1LCA3MjMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTE0Njc2Ci0JCQkJaGVpZ2h0ICAgICAJNTEKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjYKLQkJCQlQYXJlbnRfVmlldyAJQDEyMwotCQkJCWxvY2F0aW9uICAgCSg3NDIsIDczNykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC41ODc0NjcKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImltcG9ydGVkQnkiIEAxMjcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMQotCQkJICAgIGxvY2F0aW9uICAgCSgyMjcsIDMzMSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOAotCQkJCVBhcmVudF9WaWV3IAlAMTI3Ci0JCQkJbG9jYXRpb24gICAJKDMzMCwgOTM2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbXBvcnRlZEJ5IgotCQkJCXBjdERpc3QgICAgCTAuNzA4MDQwCi0JCQkJaGVpZ2h0ICAgICAJMTAKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRCRjAwMEYiCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjAKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNjQzLCAxMTE1KQotCQkJCSgzMjAsIDExMTUpCi0JCQkJKDMyMCwgNzI5KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDMsIDExMTUpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMyMCwgNzI5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQotCQkJCVBhcmVudF9WaWV3IAlAMTI3Ci0JCQkJbG9jYXRpb24gICAJKDI4MCwgODAyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjg5NzYxMQotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhY2thZ2UiIEAxMzAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQwOCwgMjI0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMzAKLQkJCWxvY2F0aW9uICAgCSgxMjQ3LCAxNzgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhY2thZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MTA4RTAzMDFEMiIKLQkJICAgIHdpZHRoICAgICAgCTM0MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiUGFja2FnZUltcG9ydHMiIEAxMzEKLQkJICAgIGxvY2F0aW9uICAgCSgxMDIzLCAzODIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMgotCQkJUGFyZW50X1ZpZXcgCUAxMzEKLQkJCWxvY2F0aW9uICAgCSgxMDM4LCA0MTkpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlhbmNob3IgICAgIAkxCi0JCQlhbmNob3JfbG9jIAkxCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQYWNrYWdlSW1wb3J0cyIKLQkJCXBjdERpc3QgICAgCTAuNzUwMDAwCi0JCQloZWlnaHQgICAgIAkzNwotCQkJb3JpZW50YXRpb24gCTEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgyOUM0RUMwMjA3IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbXBvcnRlZEJ5IiBAMTMzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQxNywgLTMwNikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNAotCQkJCVBhcmVudF9WaWV3IAlAMTMzCi0JCQkJbG9jYXRpb24gICAJKDY0OCwgNDMwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbXBvcnRlZEJ5IgotCQkJCXBjdERpc3QgICAgCTAuNjQ2NTI2Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRFRTAxMDUiCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjAKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTAyMywgMzgyKQotCQkJCSgxMDIzLCAyNTUpCi0JCQkJKDQxMywgNjE0KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzMKLQkJCQlsb2NhdGlvbiAgIAkoNTEyLCA2MTgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYWNrYWdlSW1wb3J0cyIgQDEzNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxCi0JCQkgICAgbG9jYXRpb24gICAJKC00MTcsIC0zMDYpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcKLQkJCQlQYXJlbnRfVmlldyAJQDEzNgotCQkJCWxvY2F0aW9uICAgCSgxMjIzLCA1NzkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMxMgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhY2thZ2VJbXBvcnRzIgotCQkJCXBjdERpc3QgICAgCTAuNTIyNDcyCi0JCQkJaGVpZ2h0ICAgICAJNDAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRFRTAwRkIiCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMQotCQkJICAgIHN1cHBsaWVyICAgCUAxMzAKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTAyMywgMzgyKQotCQkJCSgxMDIzLCA2MTgpCi0JCQkJKDEyNjUsIDYxOCkKLQkJCQkoMTM4NiwgMjgxKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzYKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOSwgMzc4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzYKLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgNTAwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjc2OTY2MwotCQkJCWhlaWdodCAgICAgCTEwOQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlNvdXJjZSBjb2RlIgotCSAgICBxdWlkICAgICAgIAkiMzgxMEExM0IwMTU5IgotCSAgICB0aXRsZSAgICAgIAkiU291cmNlIGNvZGUiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpDb21tZW50IiBAMTQwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDU5MiwgNjg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNDAKLQkJCWxvY2F0aW9uICAgCSg0NzUsIDY0MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMzQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJDb21tZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODg5QjAyQjgiCi0JCSAgICB3aWR0aCAgICAgIAkyNTIKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpTdGF0ZW1lbnQiIEAxNDEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEwNCwgNjg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNDEKLQkJCWxvY2F0aW9uICAgCSg5ODMsIDY0MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNDIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTdGF0ZW1lbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4OEI5MDI1QSIKLQkJICAgIHdpZHRoICAgICAgCTI2MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkluaXRpYWxpemVyIiBAMTQyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE0NCwgMjg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNDIKLQkJCWxvY2F0aW9uICAgCSgzMywgMjQyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTIyMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkluaXRpYWxpemVyIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEE1REMwMEJCIgotCQkgICAgd2lkdGggICAgICAJMjQwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6RmllbGQiIEAxNDMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU2LCAxMTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE0MwotCQkJbG9jYXRpb24gICAJKDE2MCwgNjYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRmllbGQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiCi0JCSAgICB3aWR0aCAgICAgIAkyMTAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpCbG9jayIgQDE0NAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4NjQsIDM1MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTQ0Ci0JCQlsb2NhdGlvbiAgIAkoNjkyLCAyNTYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzQ0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmxvY2siKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODM3MDE1MCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE0NAotCQkJbG9jYXRpb24gICAJKDY5MiwgMzEyKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTMKLQkJCW1heF93aWR0aCAgCTI5MCkKLQkJICAgIHdpZHRoICAgICAgCTM2MgotCQkgICAgaGVpZ2h0ICAgICAJMjE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQ1Ci0JCSAgICBsb2NhdGlvbiAgIAkoODY0LCA1ODApCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDE0NAotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoODY0LCA1ODApCi0JCQkoODY0LCA0NTkpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4RDYwMEE1IgotCQkgICAgY2xpZW50ICAgICAJQDE0MAotCQkgICAgc3VwcGxpZXIgICAJQDE0NAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1ODEsIDYzMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODEsIDU4MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDE0NSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4REEwMDU2IgotCQkgICAgY2xpZW50ICAgICAJQDE0MQotCQkgICAgc3VwcGxpZXIgICAJQDE0NAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIxLCA2MzApCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMSwgNTgwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTQ1KQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDE0OAotCQkgICAgbG9jYXRpb24gICAJKDQ3MywgMzAwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQzMzMDM2QSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic291cmNlIiBAMTQ5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzLCAtMzg4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDkKLQkJCQlsb2NhdGlvbiAgIAkoNTk5LCAyNjcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NvdXJjZSIKLQkJCQlwY3REaXN0ICAgIAkwLjU5OTM5MwotCQkJCWhlaWdodCAgICAgCTM0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDMzgwMTQwIgotCQkJICAgIGNsaWVudCAgICAgCUAxNDgKLQkJCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDczLCAzMDApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY4MywgMzAwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MQotCQkJCVBhcmVudF9WaWV3IAlAMTQ5Ci0JCQkJbG9jYXRpb24gICAJKDYwNSwgMzM0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjYzNTI2NgotCQkJCWhlaWdodCAgICAgCTM0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdGlhbGl6ZXIiIEAxNTIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OAotCQkJICAgIGxvY2F0aW9uICAgCSgxNTMsIC0zODgpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDMzgwMTY4IgotCQkJICAgIGNsaWVudCAgICAgCUAxNDgKLQkJCSAgICBzdXBwbGllciAgIAlAMTQyCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDczLCAzMDApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2NCwgMzAwKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDE1MwotCQkgICAgbG9jYXRpb24gICAJKDY3MSwgMTE0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTQKLQkJCVBhcmVudF9WaWV3IAlAMTUzCi0JCQlsb2NhdGlvbiAgIAkoNjcxLCA1NSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCWFuY2hvciAgICAgCTEKLQkJCWFuY2hvcl9sb2MgCTEKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiIgotCQkJcGN0RGlzdCAgICAJMC41MDAwMDAKLQkJCWhlaWdodCAgICAgCTYwCi0JCQlvcmllbnRhdGlvbiAJMCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUM1NjAyQTIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImluaXRpYWxpemVyIiBAMTU1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzE5LCAtMzM0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNTUKLQkJCQlsb2NhdGlvbiAgIAkoOTU0LCAyMTApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE5NQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2luaXRpYWxpemVyIgotCQkJCXBjdERpc3QgICAgCTAuODkxODI3Ci0JCQkJaGVpZ2h0ICAgICAJMTA0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDNTcwMkRGIgotCQkJICAgIGNsaWVudCAgICAgCUAxNTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDY3MSwgMTE0KQotCQkJCSg4NTAsIDExNCkKLQkJCQkoODUwLCAyNDUpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY3MSwgMTE0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTAsIDI0NSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTcKLQkJCQlQYXJlbnRfVmlldyAJQDE1NQotCQkJCWxvY2F0aW9uICAgCSg3OTAsIDIxOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MTM0NjIKLQkJCQloZWlnaHQgICAgIAk2MQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImZpZWxkIiBAMTU4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzE5LCAtMzM0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQzU3MDMwNyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTUzCi0JCQkgICAgc3VwcGxpZXIgICAJQDE0MwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY3MSwgMTE0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjEsIDExNCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiIEAxNTkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg4LCA0OTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE1OQotCQkJbG9jYXRpb24gICAJKDE5MCwgNDUwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE5NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1ldGhvZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIHdpZHRoICAgICAgCTIxNAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAiIEAxNjAKLQkJICAgIGxvY2F0aW9uICAgCSg1OTYsIDQ5NikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUNBNTAxRTciCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInNvdXJjZSIgQDE2MQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTYwCi0JCQkgICAgbG9jYXRpb24gICAJKDI3NiwgLTQ0OCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MgotCQkJCVBhcmVudF9WaWV3IAlAMTYxCi0JCQkJbG9jYXRpb24gICAJKDY5MCwgNDYzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNDUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzb3VyY2UiCi0JCQkJcGN0RGlzdCAgICAJMC40NzQ3NzcKLQkJCQloZWlnaHQgICAgIAkzNAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQ0E3MDE3QyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTYwCi0JCQkgICAgc3VwcGxpZXIgICAJQDE0NAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg1OTYsIDQ5NikKLQkJCQkoNzU5LCA0OTYpCi0JCQkJKDc1OSwgNDU5KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTYsIDQ5NikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzU5LCA0NTkpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYzCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjEKLQkJCQlsb2NhdGlvbiAgIAkoODE3LCA0NzcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuOTE1MzY3Ci0JCQkJaGVpZ2h0ICAgICAJNTgKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2QiIEAxNjQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MAotCQkJICAgIGxvY2F0aW9uICAgCSgyNzYsIC00NDgpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDQTcwMUI4IgotCQkJICAgIGNsaWVudCAgICAgCUAxNjAKLQkJCSAgICBzdXBwbGllciAgIAlAMTU5Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTk2LCA0OTYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM5NSwgNDk2KSkpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkRhdGEgVHlwZXMiCi0JICAgIHF1aWQgICAgICAgCSIzODEwQTFDRTAyRUIiCi0JICAgIHRpdGxlICAgICAgCSJEYXRhIFR5cGVzIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6VHlwZUtpbmQiIEAxNjUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCAyMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NQotCQkJbG9jYXRpb24gICAJKDc3LCA4NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJUeXBlS2luZCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjUKLQkJCWxvY2F0aW9uICAgCSg3NywgMzkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEI0NjAwMkJGIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTY1Ci0JCQlsb2NhdGlvbiAgIAkoNzcsIDE0MCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk1Ci0JCQltYXhfd2lkdGggIAkyNzcpCi0JCSAgICB3aWR0aCAgICAgIAkzNDQKLQkJICAgIGhlaWdodCAgICAgCTM5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhVmlzaWJpbGl0eUtpbmQiIEAxNjYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCA2NDApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NgotCQkJbG9jYXRpb24gICAJKDY4LCA1MDApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzQ0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVZpc2liaWxpdHlLaW5kIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NgotCQkJbG9jYXRpb24gICAJKDY4LCA0NTUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM0NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgyMzMzQkUwMzJFIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTY2Ci0JCQlsb2NhdGlvbiAgIAkoNjgsIDU1NikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk1Ci0JCQltYXhfd2lkdGggIAkyOTIpCi0JCSAgICB3aWR0aCAgICAgIAkzNjIKLQkJICAgIGhlaWdodCAgICAgCTM5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBOb3RlVmlldyBAMTY3Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTI5NiwgMjA4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjcKLQkJCWxvY2F0aW9uICAgCSg4ODcsIDUyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTYKLQkJCW1heF93aWR0aCAgCTc4MwotCQkJbGFiZWwgICAgICAJCi18VGhlIEphdmEgcHJpbWl0aXZlIHR5cGVzIGFyZSBpbnN0YW5jZXMgb2YgSmF2YURhdGFUeXBlLiAgVGhlIGNvbW1vbiBwYXJlbnQgY2xhc3Mgd2l0aCBKYXZhQ2xhc3MgaXMgQ2xhc3NpZmllci4gIFRoZSBwcmltaXRpdmUgdHlwZXMgY2FuIGJlIG9idGFpbmVkIHZpYSBhIEphdmFVUkwoImludCIpLCB3aGljaCByZXNvbHZlcyB0byBhIHJlZmVyZW5jZSBsaWtlOiAiamF2YTovI2ludCIKLQkJCSkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICB3aWR0aCAgICAgIAk4NDMKLQkJICAgIGhlaWdodCAgICAgCTMyNSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFyYW1ldGVyS2luZCIgQDE2OAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNTYsIDEwODgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2OAotCQkJbG9jYXRpb24gICAJKDYzLCA5NDgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzg2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhcmFtZXRlcktpbmQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY4Ci0JCQlsb2NhdGlvbiAgIAkoNjMsIDkwMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzg2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkxQzFFOEYwMTIzIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTY4Ci0JCQlsb2NhdGlvbiAgIAkoNjMsIDEwMDQpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNQotCQkJbWF4X3dpZHRoICAJMjA3KQotCQkgICAgd2lkdGggICAgICAJNDA0Ci0JCSAgICBoZWlnaHQgICAgIAkzOTIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgTm90ZVZpZXcgQDE2OQotCQkgICAgbG9jYXRpb24gICAJKDc2OCwgMTEyMCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY5Ci0JCQlsb2NhdGlvbiAgIAkoNTc0LCAxMDE3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTM1MgotCQkJbGFiZWwgICAgICAJIlRlbXBvcmFyeSBlbnVtIGZvciBKYXZhIHBhcmFtZXRlciBraW5kIHVudGlsIHdlIGdldCB0aGUgYmFzZSBzb3J0ZWQgb3V0IikKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICB3aWR0aCAgICAgIAk0MTIKLQkJICAgIGhlaWdodCAgICAgCTIxOSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhRGF0YVR5cGUiIEAxNzAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTE2OCwgMTQwOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTcwCi0JCQlsb2NhdGlvbiAgIAkoOTk5LCAxMzYyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFEYXRhVHlwZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM5NTkxMzM0MDMxNiIKLQkJICAgIHdpZHRoICAgICAgCTM1NgotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFRGF0YVR5cGUiIEAxNzEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgNjQwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNzEKLQkJCWxvY2F0aW9uICAgCSg4MTIsIDUxMSkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU1MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVEYXRhVHlwZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENTI1MDMzRSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE3MQotCQkJbG9jYXRpb24gICAJKDgxMiwgNjExKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTIyKQotCQkgICAgd2lkdGggICAgICAJNTcwCi0JCSAgICBoZWlnaHQgICAgIAkyODIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTcyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBjbGllbnQgICAgIAlAMTY5Ci0JCSAgICBzdXBwbGllciAgIAlAMTY4Ci0JCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkphdmEgVHlwZXMiCi0JICAgIHF1aWQgICAgICAgCSIzQjY1QjgyMzAyMEQiCi0JICAgIHRpdGxlICAgICAgCSJKYXZhIFR5cGVzIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyBkaWFncmFtIGNvbnRhaW5zIHRoZSBKYXZhIFR5cGVzIHRoYXQgYXJlIG5vdCBFTUYgY2xhc3NlcyBidXQgYXJlIHJlZmVyZW5jZWQgaW4gdGhpcyBkaWFncmFtLiIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTQ3OAotCSAgICBvcmlnaW5feSAgIAkzNQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkpUeXBlSmF2YUhlbHBlcnMiIEAxNzMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEyLCAyMDgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3MwotCQkJbG9jYXRpb24gICAJKDM5OCwgMTU0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTEwMjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKVHlwZUphdmFIZWxwZXJzIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3MwotCQkJbG9jYXRpb24gICAJKDM5OCwgMTA5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxMDI4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1QURFNDAzQTYiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNzMKLQkJCWxvY2F0aW9uICAgCSgzOTgsIDIxMCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk4NzMpCi0JCSAgICB3aWR0aCAgICAgIAkxMDQ2Ci0JCSAgICBoZWlnaHQgICAgIAkyMjAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SlR5cGVMaXN0IiBAMTc0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDg4MCwgNTc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNzQKLQkJCWxvY2F0aW9uICAgCSg2MjgsIDUyMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKVHlwZUxpc3QiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTc0Ci0JCQlsb2NhdGlvbiAgIAkoNjI4LCA0NzgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUwNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTc0Ci0JCQlsb2NhdGlvbiAgIAkoNjI4LCA1NzkpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTA3KQotCQkgICAgd2lkdGggICAgICAJNTIyCi0JCSAgICBoZWlnaHQgICAgIAkyMTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpKSkpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9pbnN0YW5jZS5tZGwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2luc3RhbmNlLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwMDdlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2luc3RhbmNlLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDg2NjkgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDcKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJJREUiCi0JICAgIHZhbHVlICAgICAgCSJJbnRlcm5hbCBFZGl0b3IiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiCi0JICAgIHZhbHVlICAgICAgCSIiKSkKLSAgICBxdWlkICAgICAgIAkiM0E3OUVCQTUwMzMxIgotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMKLQlyaWdodE1hcmdpbiAJMC4yNTAwMDAKLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMAotCXRvcE1hcmdpbiAgCTAuMjUwMDAwCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMAotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMAotCWNsaXBJY29uTGFiZWxzIAlUUlVFCi0JYXV0b1Jlc2l6ZSAJVFJVRQotCXNuYXBUb0dyaWQgCUZBTFNFCi0JZ3JpZFggICAgICAJMTYKLQlncmlkWSAgICAgIAkxNgotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQKLQkgICAgc2l6ZSAgICAgICAJMTAKLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCSAgICBib2xkICAgICAgIAlGQUxTRQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCSAgICBjb2xvciAgICAgIAkwCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0Jc2hvd01lc3NhZ2VOdW0gCTEKLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikKLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyIKLQlxdWlkICAgICAgIAkiM0E3OTk5QUQwMjk3IgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0E3OTk5QjcwMkY2IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciCi0JcXVpZCAgICAgICAJIjNBNzk5OUFEMDI4RSIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciCi0JcXVpZHUgICAgICAJIjNCODZGMTcyMDE2RiIKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJpbnN0YW50aWF0aW9uIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV29ya3NwYWNlUm9vdFxcb3JnLmVjbGlwc2UuamVtXFxyb3NlXFxpbnN0YW50aWF0aW9uLmNhdCIKLQkJcXVpZCAgICAgICAJIjNCODZGMTcyMDE4MCIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImVjb3JlIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV29ya3NwYWNlUm9vdFxcb3JnLmVjbGlwc2UuZW1mLmVjb3JlXFxtb2RlbFxcb3JnLmVjbGlwc2UuZW1mLkVjb3JlLmNhdCIKLQkJcXVpZCAgICAgICAJIjM5QTVFRDA0MDA0RSIpKQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNCODZGMTcyMDE3MyIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb24iIEAxCi0JCQlsb2NhdGlvbiAgIAkoMzM0LCAyNDApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwLCAxNTYpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJpbnN0YW50aWF0aW9uIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzQjg2RjE3MjAxODAiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkpKQotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiRGVwZW5kZW5jaWVzIChEb24ndCBlZGl0KSIKLQkJcXVpZCAgICAgICAJIjNCODZGMzFGMDI4MSIKLQkJdGl0bGUgICAgICAJIkRlcGVuZGVuY2llcyAoRG9uJ3QgZWRpdCkiCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJICAgIChvYmplY3QgTm90ZVZpZXcgQDIKLQkJCWxvY2F0aW9uICAgCSg3NTMsIDY4NSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJICAgIGxvY2F0aW9uICAgCSgzMDUsIDUzOSkKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTYKLQkJCSAgICBtYXhfd2lkdGggIAk4NjAKLQkJCSAgICBsYWJlbCAgICAgIAkiVGhlc2UgYXJlIHRoZSBkZXBlbmRlbmNpZXMuIFRoZXkgYXJlIG5vdCB0byBiZSBlZGl0ZWQuIFRoZXkgbXVzdCBvbmx5IGJlIGVkaXRlZCBieSB0aGVpciBvd25lciBtb2RlbHMuIikKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTg0MjE2MzEKLQkJCXdpZHRoICAgICAgCTkyMAotCQkJaGVpZ2h0ICAgICAJMzA1KQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZWNvcmUiIEAzCi0JCQlsb2NhdGlvbiAgIAkoMjYzLCAxODUpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5LCAxMDEpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJlY29yZSIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciCi0JcXVpZCAgICAgICAJIjNCODZGMTcyMDE2RiIKLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTc2IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMKLQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTcwIgotCVByb2NzTkRldnMgCShsaXN0Ci0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciCi0JCXF1aWQgICAgICAgCSIzQjg2RjE3MjAxNzIiCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5jcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SW1wbGVtZW50YXRpb25GaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCSgiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3RyaXBDbGFzc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5kZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk0KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAktMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiCi0JCQl2YWx1ZSAgICAgIAkoIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUGFnZVdpZHRoIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIgotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VzIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJTYW1lIGFzIG1vZGVsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIxIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMiIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjMiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI0IgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOZXZlciBnZW5lcmF0ZSBtb2RlbCBJRHMiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHkiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyU291cmNlRmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQm9keVNvdXJjZUZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFOU0kgQysrIEV2ZW50IFdhdGNoZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFOU0lDb252ZXJ0IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQURBODNfU09VUkNFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NBY2Nlc3MiCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0MykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlBvbHltb3JwaGljVW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJIYW5kbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZUFjY2VzcyIKLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4IgotCQkJdmFsdWUgICAgICAJIkFfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSJUaGlzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJGcmVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0VxdWFsaXR5T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZUVxdWFsaXR5T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzVGFzayIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiTGltaXRlZFByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTW9kZSIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiU3BlYyIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciCi0JCQkJdmFsdWUgICAgICAJMjIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiSW4iCi0JCQkJdmFsdWUgICAgICAJMjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJPdXQiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJJbk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uUmV0dXJuIgotCQkJCXZhbHVlICAgICAgCTIwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJWYXJpYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVXNlQ29sb25Ob3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQURBOTVfU09VUkNFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJUeXBlSW1wbGVtZW50YXRpb25TZXQiIDIwOCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sIgotCQkJdmFsdWUgICAgICAJKCJUeXBlQ29udHJvbFNldCIgMjI1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xOYW1lIgotCQkJdmFsdWUgICAgICAJIkNvbnRyb2xsZWRfJHt0eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiIDIwOSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEtpbmRQYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke2NsYXNzfV9SZWNvcmRfS2luZHMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0xpbWl0ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZURlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0NsYXNzV2lkZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk1heWJlQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIgMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRDbGFzc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU3VwZXJjbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJBXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4IgotCQkJdmFsdWUgICAgICAJIlRoZV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBcnJheU9mVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHt0eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHt0eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZBY2Nlc3NUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZBY2Nlc3NUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBcnJheUluZGV4RGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSJQb3NpdGl2ZSByYW5nZSA8PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSJUaGlzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkZyZWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVHlwZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVFcXVhbGl0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtxdW90ZX09JHtxdW90ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJUYWdnZWQiCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJSZWNvcmQiCi0JCQkJdmFsdWUgICAgICAJMjEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJNaXhpbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVGFzayIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVR5cGUiCi0JCQkJdmFsdWUgICAgICAJMjA5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJNdWx0aXBsZVR5cGVzIgotCQkJCXZhbHVlICAgICAgCTIxMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiCi0JCQkJdmFsdWUgICAgICAJMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlVuY29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJMjE0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTIyNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW5pdGlhbGl6YXRpb25Pbmx5IgotCQkJCXZhbHVlICAgICAgCTIyNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXNzaWdubWVudEZpbmFsaXphdGlvbk9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjI3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMjI4KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIgotCQkJCXZhbHVlICAgICAgCTIyOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXV0byIKLQkJCQl2YWx1ZSAgICAgIAkyMzApKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1ByaXZhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkaW5nIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJNb2RlIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlckNsYXNzV2lkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc09wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUJhcnJpZXJDb25kaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiVHJ1ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiCi0JCQkJdmFsdWUgICAgICAJMjI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJCb2R5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciCi0JCQkJdmFsdWUgICAgICAJMjIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZ0FzQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIgotCQkJCXZhbHVlICAgICAgCTIyMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluT3V0IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiCi0JCQkJdmFsdWUgICAgICAJMjE2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyMTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiCi0JCQkJdmFsdWUgICAgICAJMjE2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiCi0JCQkJdmFsdWUgICAgICAJMjE2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyMTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9yZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNsZWFyQ2FzZSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJwcm9qZWN0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVmlld0NvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRG9tYWluQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTUFBhY2thZ2VDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluZGV4Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSm9pbkNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiY09OVEFJTkVSQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVmlld1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRG9tYWluUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJbmRleFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RhdGFiYXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYXJnZXREYXRhYmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVGFibGVTcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGVhdWx0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJCdWZmZXJQb29sIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJFeHRlbnRTaXplIgotCQkJdmFsdWUgICAgICAJMSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByZWZldGNoU2l6ZSIKLQkJCXZhbHVlICAgICAgCTEpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYWdlU2l6ZSIKLQkJCXZhbHVlICAgICAgCTQpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJNYW5hZ2VkQnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckxpc3QiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbVNjaGVtYSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1Eb21haW5QYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEb21haW5QYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1Jvb3RTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm9vdERvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGF0YWJhc2VJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiREJNUyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVmlldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEb21haW4iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU1BQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTeW5vbnltbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvcnJlbGF0aW9uTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0Q2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tPcHRpb24iCi0JCQl2YWx1ZSAgICAgIAkiTm9uZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NuYXBTaG90IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RyaWdnZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tQcmVkaWNhdGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENoZWNrVGltZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZOZXdUYWJsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmT2xkUm93IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm93IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSIKLQkJCXZhbHVlICAgICAgCSJTUUwiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJvY1R5cGUiCi0JCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJldHVybmVkTnVsbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25JRCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImZyYW1ld29yayIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb290RGlyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVByZWZpeGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOb3RTaG93Um9zZUlERGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2hvd0NvZGVnZW5EbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJvc2VJRCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFNpbmNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY051bUFzdGVyaXNrcyIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk0iCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiCi0JCQl2YWx1ZSAgICAgIAkiO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcY2hhcnNldHMuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcamNlLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGpzc2UuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxccnQuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcc3VucnNhc2lnbi5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXGRuc25zLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcbGRhcHNlYy5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXGxvY2FsZWRhdGEuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxzdW5qY2VfcHJvdmlkZXIuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcc2VjdXJpdHlcXGxvY2FsX3BvbGljeS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxzZWN1cml0eVxcVVNfZXhwb3J0X3BvbGljeS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGxpYlxcZHQuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxsaWJcXGh0bWxjb252ZXJ0ZXIuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxsaWJcXHRvb2xzLmphciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVmZXJlbmNlQ2xhc3NwYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN1biIKLQkJCQl2YWx1ZSAgICAgIAkyMDApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWQUphdmFXb3JraW5nRm9sZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJ2b2lkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIgotCQkJdmFsdWUgICAgICAJMykKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5QcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVtb3RlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVtb3RlU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSG9tZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkhvbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkRURExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERURExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U2VydmxldFZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRKMkVFSmF2YWRvYyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZUphdmFEb2NUYWdzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbFN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUNvbnRyb2wiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NTZWxlY3RlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3RTb3VyY2VSb290IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NDb21tZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMi4wIgotCQkJCXZhbHVlICAgICAgCTIzMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIxLngiCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0NvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIgotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJNzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQm91bmQiCi0JCQkJdmFsdWUgICAgICAJNzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJNzQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSIKLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiCi0JCQkJdmFsdWUgICAgICAJODEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIl9JRCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCIKLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50IgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTE5MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIgotCQkJCXZhbHVlICAgICAgCTE5MDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQUZURVIiCi0JCQkJdmFsdWUgICAgICAJMTgwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiCi0JCQkJdmFsdWUgICAgICAJMTgwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIgotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJST1ciCi0JCQkJdmFsdWUgICAgICAJMTcwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiCi0JCQkJdmFsdWUgICAgICAJMTYwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSI2IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNvbXBvbmVudFRlc3QiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJlcXVpc2l0ZVBybyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiY29tcGlsZXIyLjFfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcyksJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlKCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlKCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjMuMF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5IgotCQkJdmFsdWUgICAgICAJImNsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQdXRCb2RpZXNJblNwZWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRSZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlcmVmZXJlbmNlT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VSZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZURlcmVmZXJlbmNlT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lSW5kaXJlY3Rpb25PcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUaHJlZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGcmllbmRLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlQW5kRGVmaW5lIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiCi0JCQkJdmFsdWUgICAgICAJMjA2KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAKLXwvLyAkcGFja2FnZQotfCNpbmNsdWRlICIkZmlsZSIKLXwKLQkJCSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAKLXwvLyAkcGFja2FnZQotfCNpbmNsdWRlICIkZmlsZSIKLXwKLQkJCSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk9wZXJhdGlvbktpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBYnN0cmFjdEJvZHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmRCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kRGVjbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTcGVjaWFsRGVjbFJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kZW50IgotCQkJdmFsdWUgICAgICAJMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5IgotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiCi0JCQkJdmFsdWUgICAgICAJNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciIKLQkJCQl2YWx1ZSAgICAgIAk3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiU29EQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVG9wTGluayIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiVHlwZUtpbmRzIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiZW51bSIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJyZWNvcmQiCi0JCQkJdmFsdWUgICAgICAJMTAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkibW9kdWxlIgotCQkJCXZhbHVlICAgICAgCTEwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImludGVyZmFjZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJkaXNwaW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTEwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImNvY2xhc3MiCi0JCQkJdmFsdWUgICAgICAJMTA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiYWxpYXMiCi0JCQkJdmFsdWUgICAgICAJMTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkidW5pb24iCi0JCQkJdmFsdWUgICAgICAJMTA3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkibWF4IgotCQkJCXZhbHVlICAgICAgCTEwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIihub25lKSIKLQkJCQl2YWx1ZSAgICAgIAkxMDkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVLaW5kcyIgMTA5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInV1aWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJkbGxuYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhbGlhcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJsaWJyYXJ5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ1dWlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwZmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImxjaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmdTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIxOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIyMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQmFzZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIihub25lKSIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIwIgotCQkJCXZhbHVlICAgICAgCTIyMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIjEiCi0JCQkJdmFsdWUgICAgICAJMjI0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIgotCQkJdmFsdWUgICAgICAJKCJCYXNlU2V0IiAyMjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSIKLQkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmciCi0JCQl2YWx1ZSAgICAgIAkoIkluc3RhbmNpbmdTZXQiIDIxOSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJUZXh0IgotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEJvZHkiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJ5VmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCeVJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlBhcmFtQXJyYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcG9ydFJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUXVpY2tJbXBvcnQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wb3J0QmluYXJ5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJXZWIgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVudGl0eV9TeXN0ZW1JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVudGl0eV9QdWJsaWNJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJJbnRlcm5hbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyRW50aXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxFbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9TeXN0ZW1JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1B1YmxpY0lEIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RGVjbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQXNzaWduIEFsbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudFBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5oIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIgotCQkJdmFsdWUgICAgICAJOCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJLTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIgotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciIKLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjEiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMyIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjQiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI1IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRlcGxveSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiY2xhc3NpZmllck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiY29uc3RyYWludHMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29udGVudEtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRW1wdHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk1peGVkIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnRPbmx5IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJvcGVyYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNJRCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ2aXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJyZWZlcmVuY2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ2aXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2OSIpKQotCXF1aWQgICAgICAgCSIzQjg2RjE3MjAxNzEiKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvaW5zdGFudGlhdGlvbi5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2luc3RhbnRpYXRpb24uY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGFkMGQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvaW5zdGFudGlhdGlvbi5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUzICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJpbnN0YW50aWF0aW9uIgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuamVtLmludGVybmFsIikpKQotICAgIHF1aWQgICAgICAgCSIzQjg2RjE3MjAxODAiCi0gICAgZG9jdW1lbnRhdGlvbiAJIkphdmEgSW5zdGFudGlhdGlvbiBQYWNrYWdlIgotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzICJJSmF2YURhdGFUeXBlSW5zdGFuY2UiCi0JICAgIHF1aWQgICAgICAgCSIzQjhBQjE3ODAyQjEiCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRTUyOTU2MjAxNEUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YUluc3RhbmNlIgotCQkgICAgcXVpZHUgICAgICAJIjNFNTE1NzVBMDJENCIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjhBQjE5MTAwQzIiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklKYXZhSW5zdGFuY2UiCi0JICAgIHF1aWQgICAgICAgCSIzRTUxNTc1QTAyRDQiCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTUxNTc3ODAyQjkiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklKYXZhT2JqZWN0SW5zdGFuY2UiCi0JICAgIHF1aWQgICAgICAgCSIzQjc4MkQ3OTAyOTYiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGludGVyZmFjZSBpcyB0aGUgaW5zdGFuY2Ugb2YgYW4gamF2YSBvYmplY3QgaW4gdGhlIGphdmEgbW9kZWwuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MTU3REEwM0REIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFJbnN0YW5jZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUxNTc1QTAyRDQiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNzgzMDE4MDFDOSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSmF2YUFsbG9jYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RTY5MDAwNjEiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgY2xhc3MgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgdGhlIGFsbG9jYXRpb24gY2xhc3MuIEl0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgImFsbG9jYXRpb24iIHByb3BlcnR5IG9uIGEgSmF2YSBPYmplY3Qgc28gdGhhdCB0aGUgYWN0dWFsIGFsbG9jYXRpb24gY2FuIGJlIGNvbnRyb2xsZWQuIEZvciBleGFtcGxlLCB0aGVyZSBjb3VsZCBiZSBvbmUgZm9yIGp1c3QgaW5pdCBzdHJpbmcsIG9yIG9uZSBmb3Igc2VyaWFsaXplZC4KLQkgICAgCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpCi0JKG9iamVjdCBDbGFzcyAiSW5pdFN0cmluZ0FsbG9jYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RUFGOTAwMUUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYWxsb2NhdGlvbiBzdHJpbmcgY2FuIGJlIHBhcnNlZCBieSB0aGUgcmVtb3RlIHZtLiBJdCB1c2VzIHRoZSBhbGxvY1N0cmluZy4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUI3NTAyREEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpKYXZhQWxsb2NhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RTY5MDAwNjEiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5pdFN0cmluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzRkZERTFERTAzMkUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpcyB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nIGZvciB0aGlzIG9iamVjdC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJJbXBsaWNpdEFsbG9jYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RUMxNDAyNDIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIGlzIGZvciBhbiBpbXBsaWNpdCBhbGxvY2F0aW9uIHdoZXJlIHRoZSBvYmplY3QgY29tZXMgZnJvbSB0aGUgZmVhdHVyZSBvZiBhbm90aGVyIG9iamVjdC4gSXQgaXMgdGhlIGxpdmUgSmF2YSB2YWx1ZSBmcm9tIHRoZSByZW1vdGUgdm0uIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0ZEOUVDNDcwMEU3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SmF2YUFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUU2OTAwMDYxIikpKQotCShvYmplY3QgQ2xhc3MgIlBhcnNlVHJlZUFsbG9jYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4MkM5MTAwMDUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJBbGxvY2F0aW9ucyB2aWEgUGFyc2UgVHJlZXMuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODJDQjcwMUQ2IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SmF2YUFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUU2OTAwMDYxIikpKQotCShvYmplY3QgQ2xhc3MgIlBURXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkgICAgYWJzdHJhY3QgICAJVFJVRSkKLQkob2JqZWN0IENsYXNzICJQVEFycmF5QWNjZXNzIgotCSAgICBxdWlkICAgICAgIAkiNDAwODJFMTQwMjUwIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxBcnJheSBhY2Nlc3MuIGUuZy4geFszXS4gCi18Ci18VW5saWtlIEFTVCwgdGhlIGVudGlyZSBleHByZXNzaW9uIG9mIHR5cGUgeFszXVs0XSB3aWxsIGJlIGRvbmUgaW4gb25lIGV4cHJlc3Npb24gcmF0aGVyIHRoYW4gaGF2aW5nIGEgc2VwYXJhdGUgQXJyYXlBY2Nlc3MgZm9yIGVhY2ggZGltZW5zaW9uLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGlmaWNhdGlvbi4gVGhpcyBjYW4gb25seSBiZSB1c2VkIGlmIGl0IGlzIGEgc2ltcGxlIGFycmF5IGFjY2VzcyB3aGVyZSBpdCBpcyBvZiB0aGUgZm9ybSB7ZXhwcmVzc2lvbn1bZXhwcmVzc2lvbl1bZXhwcmVzc2lvbl0uCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODJFNkYwMUY3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcnJheSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MkU4RTAyMzciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBhcnJheSB0byBhY2Nlc3MuIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5kZXhlcyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MkU5QjAwN0QiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGV4cHJlc3Npb25zIHJlcHJlc2VudGluZyB0aGUgaW5kZXhlcyBvZiB0aGUgYWNjZXNzLiIKLQkJICAgIHN0ZXJlb3R5cGUgCSIxLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQXJyYXlDcmVhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgzNzEyMDI1QSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18QXJyYXkgQ3JlYXRpb24gZXhwcmVzc2lvbiwgZS5nLiBuZXcgaW50WzNdIG9yIG5ldyBqYXZhLmxhbmdTdHJpbmdbXVtdIHt7ImEifSwgeyJiIn19Ci0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM3MjEwMDQ5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzN0U5MDJCRCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZnVsbHktcXVhbGlmaWVkIHR5cGUsIGUuZy4gaW50W11bXSBvciBqYXZhLmxhbmcuU3RyaW5nW10sIGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbiBicmFja2V0cy4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRpbWVuc2lvbnMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM4OTUwMUU4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBsaXN0IG9mIGV4cHJlc3Npb25zIGZvciB0aGUgZGltZW5zaW9ucy4gWW91IGNhbiBoYXZlIFszXVs0XVtdIGJ1dCBbXVszM10gaXMgaW52YWxpZC4gU28gZm9yIGVhY2ggZGltZW5zaW9uIHRoYXQgaGFzIGFuIGV4cHJlc3Npb24sIHRoZXJlIHdpbGwgYmUgYW4gZW50cnkgaW4gdGhlIGxpc3QsIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBXaGVuIHlvdSByZWFjaCB0aGUgZW1wdHkgZGltZW5zaW9ucywgdGhlIGxpc3Qgd2lsbCBlbmQgdG9vLiAiCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluaXRpYWxpemVyIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzOTdDMDIzMSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHRoZSBpbml0aWFsaXplciwgaWYgYW55LCBmb3IgdGhpcyBhcnJheS4gRS5nLiBuZXcgaW50W10gezIsM30uIEl0IGlzIHRoZSB7MiwzfS4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRBcnJheUluaXRpYWxpemVyIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzOTY4MDE0QyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRBcnJheUluaXRpYWxpemVyIgotCSAgICBxdWlkICAgICAgIAkiNDAwODM5NjgwMTRDIgotCSAgICBkb2N1bWVudGF0aW9uIAkiQXJyYXkgaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbi4gVGhpcyBpcyB0aGUgZW50aXJlIGV4cHJlc3Npb24sIGUuZy4gezIsIDN9LCBvciB7ezIsM30sIDR9LiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSB7MiwzfSB3aWxsIGJlIGFuIEFycmF5SW5pdGlhbGl6ZXIgY29udGFpbmVkIHdpdGhpbiB0aGUgZXhwcmVzc2lvbnMgbGlzdCBmb3IgdGhlIHRvcCBBcnJheUluaXRpYWxpemVyLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzOTc5MDAzOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhwcmVzc2lvbnMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODNBNTcwMEVCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXN0aGUgbGlzdCBvZiBleHByZXNzaW9ucyB3aXRoaW4gdGhlIGluaXRpYWxpemVyLCBlLmcuIHsyLCAzfSwgb3Ige3syLDN9LCA0fS4gSW4gdGhlIGZpcnN0IGNhc2UgaXQgd2lsbCBiZSB0d28gTnVtYmVyTGl0ZXJhbHMuIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlIHsyLDN9IHdpbGwgYmUgYW4gQXJyYXlJbml0aWFsaXplciwgZm9sbG93ZWQgYnkgYSBOdW1iZXJMaXRlcmFsLiIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQm9vbGVhbkxpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4M0FFNzAyNDciCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgYm9vbGVhbiBsaXRlcmFsLCBpLmUuIHRydWUgb3IgZmFsc2UgZGlyZWN0bHkgaW4gdGhlIGNvZGUuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODNCMUQwMDAwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJib29sZWFuVmFsdWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODNCM0QwMDFBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB2YWx1ZSBvZiB0aGUgbGl0ZXJhbC4iCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRDYXN0RXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgzQjZGMDA1OCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkNhc3QgZXhwcmVzc2lvbiwgZS5nLiAoc2hvcnQpIDEwIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODNCRDYwMzA5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzQjk2MDBGNCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBvZiB0aGUgY2FzdCwgZS5nLiBpbnQgb3IgamF2YS5sYW5nLlN0cmluZyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhwcmVzc2lvbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4M0JCNjAzM0YiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGV4cHJlc3Npb24gYmVpbmcgY2FzdGVkLiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVENoYXJhY3RlckxpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NERGMTAyNzciCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgY2hhcmFjdGVyIGV4cHJlc3Npb24sIGUuZy4gJ2EnIG9yICdcXHInLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg0RTEzMDFFQSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXNjYXBlZFZhbHVlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg0RTM5MDE0RSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4gSW4gb3RoZXIgd29yZHMgdGhlIGxpdGVyYWwgZXhhY3RseSBhcyBpdCBpcyBpbiB0aGUgamF2YSBmaWxlLiBFLmcuICdhJyBvciAnXFxyJy4gSW5jbHVkaW5nIHRoZSBzdXJyb3VuZGluZyBzaW5nbGUgcXVvdGVzIHRoZW1zZWx2ZXMuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaGFyVmFsdWUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODRFQjcwMkNDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBhY3R1YWwgcHJpbWl0aXZlIGNoYXJhY3RlciB3aXRob3V0IHRoZSBxdW90ZXMuIEVzY2FwZSBhcmUgZXZhbHVhdGVkIGFuZCB0dXJuZWQgaW50byB0aGVpciBjaGFyYWN0ZXIgdmFsdWUuIFRoaXMgaXMgYSB0cmFuc2llbnQgZmllbGQuIElmIG5vdCBzZXQgd2hlbiBjcmVhdGVkIHdoZW4gcXVlcmllZCBpdCB3aWxsIGNyZWF0ZSBpdC4gVHlwaWNhbGx5IGl0IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRlZCBmcm9tIGFuIEFTVCBub2RlIHNpbmNlIHRoZSBub2RlIGFscmVhZHkgaGFzIGV2YWx1YXRlZCBpdC4iCi0JCSAgICB0eXBlICAgICAgIAkiY2hhciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NEY0MDAyNkYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfENsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24uIEUuZy4gbmV3IFN0cmluZygiYSIpCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODRGNEMwMkY4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg0RkFEMDI5NCIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgaXMgdGhlIHR5cGUgb2YgdGhlIGNsYXNzLiBFLmcuIGphdmEubGFuZy5TdHJpbmcuIFRoaXMgc2hvdWxkIGJlIGZ1bGx5LXF1YWxpZmllZCBmb3IgYWxsb2NhdGlvbiBwdXJwb3Nlcy4gSXQgc2hvdWxkIGFsc28gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gaWYgWCBpcyBhbiBpbm5lciBjbGFzcyBvZiBqLlksIHRoZW4gdGhlIHR5cGUgaGVyZSBzaG91bGQgYmUgImouWSRYIi4gCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXJndW1lbnRzIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MTVFMDEzOCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3Rvci4iCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1MUZCMDI2QSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB0ZXN0IEV4cHJlc3NvbiwgZS5nLiAoeD0zKSA/IDEgOiAyIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUyNzQwMTJFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25kaXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUyMUQwMkFGIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBjb25kaXRpb24gZXhwcmVzc2lvbi4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0cnVlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MjQxMDMzMyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdHJ1ZSBleHByZXNzaW9uIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmFsc2UiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUyNUYwMjk2IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBmYWxzZSBleHByZXNzaW9uLiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEZpZWxkQWNjZXNzIgotCSAgICBxdWlkICAgICAgIAkiNDAwODUyREYwMjA0IgotCSAgICBkb2N1bWVudGF0aW9uIAkiQWNjZXNzIGEgZmllbGQgZXhwcmVzc2lvbiwgZS5nLiBqYXZhLmF3dC5Db2xvci5yZWQiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTM1RDAyNDEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlY2VpdmVyIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MzEzMDEyQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIG9iamVjdCB0aGF0IHRoZSBmaWVsZCBpcyBpbiwgZS5nLiBqYXZhLmF3dC5Db2xvci4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaWVsZCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTM0NTAwQUMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIGFjY2Vzc2VkLCBlLmcuIHJlZC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEluZml4RXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1MzhCMDE0MyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkFuIGV4cHJlc3Npb24gd2l0aCBhbiBvcGVyYXRvciB0aGF0IGhhcyB0d28gb3BlcmFuZHMsIGUuZy4gMyArIDQuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU1NzAwMDMyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZWZ0T3BlcmFuZCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTNBQzAwMDAiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcGVyYXRvciIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTNCNjAwRDciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG9wZXJhdG9yLCBlLmcuICsiCi0JCSAgICB0eXBlICAgICAgIAkiUFRJbmZpeE9wZXJhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1M0UxMDM1OSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyaWdodE9wZXJhbmQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU0MEQwMTg2IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHJpZ2h0IGV4cHJlc3Npb24uIGkuZS4gNCBvZiAiMyArIDQiCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuZGVkT3BlcmFuZHMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU1MTEwMzlDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlVzZWQgd2hlbiB0aGVyZSBhcmUgYSBzZXJpZXMgb2YgaW5maXggb3BlcmF0aW9ucyBvZiB0aGUgc2FtZSBvcGVyYXRvciwgZS5nLiAxICsgMiArIDMgKyA0LiAxIGFuZCAyIHdpbGwgZ28gaW50byBsZWZ0IGFuZCByaWdodCwgd2hpbGUgezMsIDR9IHdpbGwgZ28gaW50byB0aGUgZXh0ZW5kZWQgb3BlcmFuZHMuICIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUSW5maXhPcGVyYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1M0UxMDM1OSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkVudW1lcmF0b3IgZm9yIHRoZSBvcGVyYXRvciBvbiBhbiBJbmZpeEV4cHJlc3Npb24uIgotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlRJTUVTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NjgzMDI0MCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIqIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkRJVklERSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTY4RTAxRTIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiLyBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJSRU1BSU5ERVIiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2OTIwMkJBIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIiUgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUExVUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTY5NzAzOUQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiKyBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJNSU5VUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTY5QzAxRDgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiLSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJMRUZUX1NISUZUIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkI1MDI3NCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI8PCBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJSSUdIVF9TSElGVF9TSUdORUQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2QkEwMENEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIj4+IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlJJR0hUX1NISUZUX1VOU0lHTkVEIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkMzMDM4RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI+Pj4gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTEVTUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZDQzAzQ0MiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPCAgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiR1JFQVRFUiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZEOTAwMUQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJMRVNTX0VRVUFMUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZERDAwNEIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPD0gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiR1JFQVRFUl9FUVVBTFMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2RTUwMjlCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIj49IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkVRVUFMUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZFQzAyNzMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPT0gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTk9UX0VRVUFMUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZGOTAzOUUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiIT0gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiWE9SIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NzAxMDMyOCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJeIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkFORCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTcxMjAzNEEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiJiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJPUiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTcwNDAyRkEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkifCAgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ09ORElUSU9OQUxfQU5EIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NzE2MDA3NSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSImJiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDT05ESVRJT05BTF9PUiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTcyNjAyQkQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkifHwgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUSW5zdGFuY2VvZiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1N0QzMDNBMiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkluc3RhbmNlb2YgZXhwcmVzc2lvbiwgZS5nLiB4IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZyIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1ODkxMDNBRiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3BlcmFuZCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTgwNzAyMzQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHZhbHVlIHRvIHRlc3QsIGUuZy4geCBpbiB4IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZyIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU4MkEwMjIwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSB0ZXN0LCBlLmcuIGphdmEubGFuZy5TdHJpbmcuIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUTWV0aG9kSW52b2NhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1OEI2MDE4QiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIk1ldGhvZEludm9jYXRpb24gZXhwcmVzc2lvbiwgZS5nLiB4LmdldFkoMykiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUI5RDAwNjciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlY2VpdmVyIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1QjBBMDFFQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFdobyB0aGUgbWV0aG9kIGlzIGludm9rZWQgYWdhaW5zdC4gVGhpcyBtYXkgYmUgbm90IHNldCwgd2hpY2ggbWVhbnMgInRoaXMiLiBJdCBtYXkgYWxzbyBiZSBhIE5hbWUsIHdoaWNoIHdvdWxkIG1lYW4gYSBjbGFzcyBsaWtlICJqYXZhLmxhbmcuU3RyaW5nIgotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1QjYxMDBEOSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGludm9rZWQuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcmd1bWVudHMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVCNjkwMkVEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBsaXN0IG9mIGFyZ3VtZW50cywgaWYgYW55LCB0byB0aGUgbWV0aG9kLiIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUTmFtZSIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1OEVBMDI4MCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyByZXByZXNlbnRzIGEgbmFtZS4gVGhpcyBjYW4gaGFwcGVuIGZvciB0aGUgcmVjZWl2ZXIgb2YgYSBtZXRob2QgaW52b2NhdGlvbiwgZS5nLiB4LmdldFkoKSBvciBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoMTApLiBJbiB0aGVzZSBjYXNlcyB5b3Ugd291bGQgaGF2ZSBhIG5hbWUgb2YgIngiIG9yICJqYXZhLmxhbmcuU3RyaW5nIi4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUJBMTAwREIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwQzExMDQwMUJFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBuYW1lLCB3aGljaCBjYW4gYmUgYSB0eXBlIG9yIGEgdmFyaWFibGUuIElmIGl0IGlzIGEgdHlwZSwgdGhlbiAgaXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFROdWxsTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1QkJGMDAyMCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmVwcmVzZW50cyB0aGUgZXhwcmVzc2lvbiAibnVsbCIKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUJENDAyRjEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpKQotCShvYmplY3QgQ2xhc3MgIlBUTnVtYmVyTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg1QzQwMDM1QiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlJlcHJlc2VudCBhIG51bWJlciBwcmltaXRpdmUgbGl0ZXJhbCwgZS5nLiAxMC4gT25lIG9wdGltaXphdGlvbiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkIGlzIHRoYXQgaWYgYW4gZXhwcmVzc2lvbiBpcyBvZiB0aGUgZm9ybSArbnVtYmVyIG9yIC1udW1iZXIsIGl0IHdpbGwgYmUgY29udmVydGVkIGZyb20gYSBQcmVmaXhFeHByZXNzaW9uIHdpdGggYSBOdW1iZXJMaXRlcmFsIHRvIGp1c3QgYSBOdW1iZXJMaXRlcmFsLiBUaGlzIHdpbGwgc2ltcGxpZnkgdGhlIG1vZGVsLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1Q0VGMDI0NCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidG9rZW4iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVDQUEwMjRGIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB0b2tlbiB2YWx1ZSwgZS5nLiAxMCwgMTBkLCBvciAtMTAuNzUiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODVDRjkwMDdDIgotCSAgICBkb2N1bWVudGF0aW9uIAkiQW4gZXhwcmVzc2lvbiB3aXRoaW4gcGFyZW50aGVzaXMsIGUuZy4gKHgrMykiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUY0RTAzRTEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4cHJlc3Npb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVGMjIwMTJCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIGV4cHJlc3Npb24gd3JhcHBlZCBieSB0aGUgcGFyZW50aGVzaXMsIGUuZy4gKHgrMykgdGhlbiB0aGUgZXhwcmVzc2lvbiBpcyAieCszIgotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRQcmVmaXhFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODVGQUQwMDhCIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxBIG9uZSBvcGVyYW5kIG9wZXJhdG9yLCB3aGVyZSB0aGUgb3BlcmF0b3IgY29tZXMgYmVmb3JlIHRoZSBvcGVyYW5kLCBlLmcuIC0gKHgrMykuIEluIEFTVCwgZXZlbiAtMyBpcyBtb2RlbGVkIGFzIGEgUHJlZml4RXhwcmVzc2lvbiBvZiBvcGVyYXRvciAiLSIgYW5kIGV4cHJlc3Npb24gb2YgTnVtYmVyTGl0ZXJhbCgzKS4gQnV0IHdlIG9wdGltaXplIHRoaXMgYXdheSBhbmQganVzdCB1c2UgYSBOdW1iZXJMaXRlcmFsKC0zKSBkaXJlY3RseSBpbnN0ZWFkLgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MkRDMDFENyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3BlcmF0b3IiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwQkMwMTk5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBvcGVyYXRvciBvZiB0aGlzIGV4cHJlc3Npb24uIgotCQkgICAgdHlwZSAgICAgICAJIlBUUHJlZml4T3BlcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODYwMjQwMEQyIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4cHJlc3Npb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwQzUwMDY1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBleHByZXNzaW9uIHRoYXQgdGhlIG9wZXJhdG9yIGlzIGFwcGxpZWQgdG8uIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUUHJlZml4T3BlcmF0b3IiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NjAyNDAwRDIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgcHJlZml4IGV4cHJlc3Npb24gb3BlcmF0b3IuIFdlIGFyZSBub3QgbW9kZWxpbmcgKysgYW5kIC0tLiIKLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQTFVTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MDZGMDFCNiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIrIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk1JTlVTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MDcyMDNCOSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSItIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkNPTVBMRU1FTlQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwNzgwMEFCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIn4gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTk9UIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MDdEMDE0OCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIhIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVFN0cmluZ0xpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NjFFMjAwMEIiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nIGxpdGVyYWwsIGUuZy4gImFzZGYiLgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MkQ3MDMzOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXNjYXBlZFZhbHVlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2MUZDMDFDQiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgaXMgdGhlIGVzY2FwZWQgc3RyaW5nLiBJbiBvdGhlciB3b3JkcyB0aGUgbGl0ZXJhbCBleGFjdGx5IGFzIGl0IGlzIGluIHRoZSBqYXZhIGZpbGUuIEUuZy4gImFiIiBvciAiY1xyIi4gSW5jbHVkaW5nIHRoZSBzdXJyb3VuZGluZyBxdW90ZXMgdGhlbXNlbHZlcy4KLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaXRlcmFsVmFsdWUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYyMEEwMEJEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBhY3R1YWwgc3RyaW5nIHdpdGhvdXQgdGhlIHF1b3Rlcy4gRXNjYXBlIGFyZSBldmFsdWF0ZWQgYW5kIHR1cm5lZCBpbnRvIHRoZWlyIGNoYXJhY3RlciB2YWx1ZS4gVGhpcyBpcyBhIHRyYW5zaWVudCBmaWVsZC4gSWYgbm90IHNldCB3aGVuIGNyZWF0ZWQgd2hlbiBxdWVyaWVkIGl0IHdpbGwgY3JlYXRlIGl0LiBUeXBpY2FsbHkgaXQgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGVkIGZyb20gYW4gQVNUIG5vZGUgc2luY2UgdGhlIG5vZGUgYWxyZWFkeSBoYXMgZXZhbHVhdGVkIGl0LiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUVGhpc0xpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NjNBNzAwQ0IiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFJlcHJlc2VudHMgInRoaXMiLCBlLmcuIHRoaXMuZ2V0WCgpIHdpbGwgYmUgYSBNZXRob2RJbnZvY2F0aW9uIHdpdGggdGhlIHJlY2VpdmVyIGJlaW5nIGEgVGhpc0xpdGVyYWwuIFdlIGNhbid0IGhhbmRsZSB0aGUgZm9ybWF0IFhZWi50aGlzIGJlY2F1c2UgdGhhdCBpcyBmb3IgaW5uZXIgY2xhc3NlcyBhbmQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGF0IHJpZ2h0IG5vdy4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjQxODAxOUYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpKQotCShvYmplY3QgQ2xhc3MgIlBUVHlwZUxpdGVyYWwiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NjQ5NTAxODEiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIHJlcHJlc2VudHMgYSBsaXRlcmFsIG9mIHRoZSBmb3JtIGouWFlaLmNsYXNzLiBGb3IgaW5zdGFuY2UgaW4gYSBtZXRob2QgaW52b2NhdGlvbiB4LmdldFgoalhZWi5jbGFzcykgdGhlIGFyZ3VtZW50IHdpbGwgYmUgYSBUeXBlTGl0ZXJhbC4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjU0QzAwMDgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODY0RDcwMzdCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB0eXBlIG9mIHRoZSBsaXRlcmFsLiAgSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRJbnZhbGlkRXhwcmVzc2lvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg2NUFGMDIwOSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgc29tZSBleHByZXNzaW9uIHdlIGp1c3QgY2FuJ3QgZXZhbHVhdGUgZm9yIG91ciBwdXJwb3Nlcy4gSXQgYWxsb3dzIHVzIHRvIHRlbGwgdGhlIGV2YWx1YXRpb24gd2hhdCBpcyBhY3R1YWxseSB3cm9uZy4gSXQgc2hvdWxkIGJlIHBsYWNlZCBhcyB0aGUgcm9vdCBleHByZXNzaW9uIHRvIHByZXZlbnQgcHJvY2Vzc2luZyBtdWNoIG9mIHRoZSB0cmVlIGFuZCB0aGVuIGZpbmFsbHkgZmFpbC4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjZGNTAyNTgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1lc3NhZ2UiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODY2RTQwMjk5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkEgbWVzc2FnZSBhcyB0byB3aHkgaXQgaXMgaW52YWxpZC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEluc3RhbmNlUmVmZXJlbmNlIgotCSAgICBxdWlkICAgICAgIAkiNDAxN0RCMTgwMkIzIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAxN0RCNEEwMzQxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKSkKLQkob2JqZWN0IENsYXNzICJQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSI0MzYyN0MxNDAzOTYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfEFuIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbi4gQ3VycmVudGx5IHdlIG9ubHkgc3RvcmUgdGhlIAotfGVudGlyZSBkZWNsYXJhdGlvbiBhcyBhIHN0cmluZywgaW5jbHVkaW5nIHRoZSAibmV3IEFDbGFzcygpIHsuLi59Ii4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MzYyN0Q0RTAwRDAiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlY2xhcmF0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjQzNjI3RDY5MDE0NyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZGVjbGFyYXRpb24gdGV4dC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImltcG9ydHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiNDM2Mjg5RTUwMzRCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdGhlIGltcG9ydHMgbmVlZGVkIGluIHRoZSBtYWluIGNsYXNzIGJ5IHRoaXMgZGVjbGFyYXRpb24uIFRoaXMgaXMgYSB0cmFuc2llbnQgYXR0cmlidXRlLiBJdCBpcyBub3Qgc2VyaWFsaXplZCwgbm9yIGlzIGl0IHBhcnNlZCBpbnRvIGZyb20gZXhpc3RpbmcgY29kZS4gSXRzIG9ubHkgcHVycG9zZSBpcyB0byBoZWxwIGNvZGUgZ2VuZXJhdGlvbiBvbiBhIGJyYW5kIG5ldyBkZWNsYXJhdGlvbiB0byBrbm93IHdoYXQgaW1wb3J0cyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIG1haW4gY2xhc3MuIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RUQ3MTAzRDUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgcGFyZW50IHdobyBpcyB0byBnaXZlIHVwIHRoZSB2YWx1ZS4iCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInBhcmVudCIKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUQ3MjAzOTAiCi0JCSAgICBsYWJlbCAgICAgIAkicGFyZW50IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPYmplY3QiCi0JCSAgICBxdWlkdSAgICAgIAkiM0M0RjFDODYwMTIzIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSIKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUQ3MjAzOUEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJbXBsaWNpdEFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVDMTQwMjQyIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RUREMDAwODgiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZmVhdHVyZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBxdWVyeSB0aGUgbGl2ZSB2YWx1ZS4iCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImZlYXR1cmUiCi0JCSAgICBxdWlkICAgICAgIAkiM0ZEOUVERDEwMTQ4IgotCQkgICAgbGFiZWwgICAgICAJImZlYXR1cmUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENTlEMDIzMCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMiCi0JCSAgICBxdWlkICAgICAgIAkiM0ZEOUVERDEwMTUyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SW1wbGljaXRBbGxvY2F0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFQzE0MDI0MiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0IgotCSAgICBxdWlkICAgICAgIAkiNDAwODM0Q0UwMDFCIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHJvb3QgZXhwcmVzc2lvbiBvZiB0aGUgcGFyc2UgdHJlZS4gVGhlIHJlc3VsdCBvZiBpdCBpcyB0aGUgYWxsb2NhdGlvbi4iCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImV4cHJlc3Npb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM0Q0YwMkU0IgotCQkgICAgbGFiZWwgICAgICAJImV4cHJlc3Npb24iCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1IgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzNENGMDJFNiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBhcnNlVHJlZUFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJDOTEwMDA1IgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiCi0JICAgIHF1aWQgICAgICAgCSI0MDE3REJFMzAxMzgiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInJlZmVyZW5jZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDE3REJFNjAwMDYiCi0JCSAgICBsYWJlbCAgICAgIAkicmVmZXJlbmNlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFJbnN0YW5jZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUxNTc1QTAyRDQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDE3REJFNjAxNjQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEluc3RhbmNlUmVmZXJlbmNlIgotCQkgICAgcXVpZHUgICAgICAJIjQwMTdEQjE4MDJCMyIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIikpKSkKLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkgICAgcXVpZCAgICAgICAJIjNCNzgyRDFCMDM0RiIKLQkgICAgdGl0bGUgICAgICAJIk1haW4iCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBOb3RlVmlldyBAMQotCQkgICAgbG9jYXRpb24gICAJKDc0NywgMTAwOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDM0MiwgODU0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTYKLQkJCW1heF93aWR0aCAgCTc3NQotCQkJbGFiZWwgICAgICAJIlRoaXMgaXMgdXNlZCBhcyB0aGUgRUNsYXNzaWZpZXIgd2hlbiB5b3Ugd2FudCBhIGNvZGUtZ2VuZXJhdGVkIGNsYXNzIHRvIHBvaW50IHRvIGFuIGluc3RhbmNlIG9mIGEgSUphdmFPYmplY3RJbnN0YW5jZSBpbXBsZW1lbnRlci4gKFdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIGEgamF2YSBtb2RlbCBqYXZhIG9iamVjdCkuIikKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICB3aWR0aCAgICAgIAk4MzUKLQkJICAgIGhlaWdodCAgICAgCTMyMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YURhdGFUeXBlSW5zdGFuY2UiIEAyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI2NTksIDY2NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDE3NzcsIDYwNSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxNzY0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUphdmFEYXRhVHlwZUluc3RhbmNlIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSgxNzc3LCA1NTUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE3NjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCOEFCMTc4MDJCMSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSgxNzc3LCA2NjYpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTUxMikKLQkJICAgIHdpZHRoICAgICAgCTE3ODIKLQkJICAgIGhlaWdodCAgICAgCTI0MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBOb3RlVmlldyBAMwotCQkgICAgbG9jYXRpb24gICAJKDIzNzgsIDEwNTMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMKLQkJCWxvY2F0aW9uICAgCSgxOTcwLCA4ODkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNwotCQkJbWF4X3dpZHRoICAJNzgwCi0JCQlsYWJlbCAgICAgIAkiVGhpcyBpcyB1c2VkIGFzIHRoZSBFQ2xhc3NpZmllciB3aGVuIHlvdSB3YW50IGEgY29kZS1nZW5lcmF0ZWQgY2xhc3MgdG8gcG9pbnQgdG8gYW4gaW5zdGFuY2Ugb2YgYW4gSUphdmFEYXRhVHlwZUluc3RhbmNlIGltcGxlbWVudGVyLiAoV2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgYSBqYXZhIG1vZGVsIGphdmEgcHJpbWl0aXZlKS4iKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTg0MAotCQkgICAgaGVpZ2h0ICAgICAJMzQwKQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUAyCi0JCSAgICBzdXBwbGllciAgIAlAMwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YUluc3RhbmNlIiBANQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNTg0LCAxNjYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUKLQkJCWxvY2F0aW9uICAgCSg4MDQsIDg1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE1NjAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJSmF2YUluc3RhbmNlIikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTm9uZSIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U1MTU3NUEwMkQ0IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANQotCQkJbG9jYXRpb24gICAJKDgwNCwgMTQ2KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTEzNDApCi0JCSAgICB3aWR0aCAgICAgIAkxNTc4Ci0JCSAgICBoZWlnaHQgICAgIAkxODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTU4NCwgNDU1KQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUA1Ci0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxNTg0LCA0NTUpCi0JCQkoMTU4NCwgMjU5KSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFPYmplY3RJbnN0YW5jZSIgQDcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODU4LCA2NjYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDcKLQkJCWxvY2F0aW9uICAgCSg2MjcsIDYxNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0ODAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJSmF2YU9iamVjdEluc3RhbmNlIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDcKLQkJCWxvY2F0aW9uICAgCSg2MjcsIDU2NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjc4MkQ3OTAyOTYiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA3Ci0JCQlsb2NhdGlvbiAgIAkoNjI3LCA2NzUpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTQ1OSkKLQkJICAgIHdpZHRoICAgICAgCTQ4MAotCQkgICAgaGVpZ2h0ICAgICAJMjI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUAxCi0JCSAgICBzdXBwbGllciAgIAlANwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNTE1N0RBMDNERCIKLQkJICAgIGNsaWVudCAgICAgCUA3Ci0JCSAgICBzdXBwbGllciAgIAlANQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3OTUsIDU1MikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3OTUsIDQ1NSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDYpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U1Mjk1NjIwMTRFIgotCQkgICAgY2xpZW50ICAgICAJQDIKLQkJICAgIHN1cHBsaWVyICAgCUA1Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI2NTksIDU0MykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjU5LCA0NTUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2KSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkphdmEgQ29uc3RydWN0b3JzIgotCSAgICBxdWlkICAgICAgIAkiM0ZEOUU2NkQwMDdGIgotCSAgICB0aXRsZSAgICAgIAkiSmF2YSBDb25zdHJ1Y3RvcnMiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpKYXZhQWxsb2NhdGlvbiIgQDExCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDEyMCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMQotCQkJbG9jYXRpb24gICAJKDkwMiwgNjkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzQyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUFsbG9jYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFNjkwMDA2MSIKLQkJICAgIHdpZHRoICAgICAgCTM2MAotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkluaXRTdHJpbmdBbGxvY2F0aW9uIiBAMTIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNTUzLCA0OTUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEyCi0JCQlsb2NhdGlvbiAgIAkoMzI5LCA0MTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDQ4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSW5pdFN0cmluZ0FsbG9jYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFQUY5MDAxRSIKLQkJICAgIHdpZHRoICAgICAgCTQ2NgotCQkgICAgaGVpZ2h0ICAgICAJMTg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTMKLQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCAzMjMpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDExCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMDczLCAzMjMpCi0JCQkoMTA3MywgMTgzKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVCNzUwMkRBIgotCQkgICAgY2xpZW50ICAgICAJQDEyCi0JCSAgICBzdXBwbGllciAgIAlAMTEKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjY4LCA0MDEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY4LCAzMjMpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxMykKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RU9iamVjdCIgQDE1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3NTEsIDk0MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCWxvY2F0aW9uICAgCSgxNjQ1LCA4OTYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjEyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRU9iamVjdCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc2OTYwCi0JCSAgICBxdWlkdSAgICAgIAkiM0M0RjFDODYwMTIzIgotCQkgICAgd2lkdGggICAgICAJMjMwCi0JCSAgICBoZWlnaHQgICAgIAkxMTcKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSIgQDE2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIxNDIsIDkyNykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNgotCQkJbG9jYXRpb24gICAJKDE5MTgsIDg4MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NDgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFU3RydWN0dXJhbEZlYXR1cmUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENTlEMDIzMCIKLQkJICAgIHdpZHRoICAgICAgCTQ2NgotCQkgICAgaGVpZ2h0ICAgICAJMTE3Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkltcGxpY2l0QWxsb2NhdGlvbiIgQDE3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIwMTgsIDUxMCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTcKLQkJCWxvY2F0aW9uICAgCSgxODE5LCA0NTgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzk4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSW1wbGljaXRBbGxvY2F0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUMxNDAyNDIiCi0JCSAgICB3aWR0aCAgICAgIAk0MTYKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUM0NzAwRTciCi0JCSAgICBjbGllbnQgICAgIAlAMTcKLQkJICAgIHN1cHBsaWVyICAgCUAxMQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDIzLCA0NDYpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyMywgMzIzKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTMpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTkKLQkJICAgIGxvY2F0aW9uICAgCSgxODgxLCA3MjgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUQ3MTAzRDUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcmVudCIgQDIwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOQotCQkJICAgIGxvY2F0aW9uICAgCSg3MTYsIDIyOCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxCi0JCQkJUGFyZW50X1ZpZXcgCUAyMAotCQkJCWxvY2F0aW9uICAgCSgxNzI3LCA4NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTEzNwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhcmVudCIKLQkJCQlwY3REaXN0ICAgIAkwLjk5MTIyNAotCQkJCWhlaWdodCAgICAgCTcyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVENzIwMzkwIgotCQkJICAgIGNsaWVudCAgICAgCUAxOQotCQkJICAgIHN1cHBsaWVyICAgCUAxNQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMgotCQkJCVBhcmVudF9WaWV3IAlAMjAKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MSwgNzk0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjMzNzgxNwotCQkJCWhlaWdodCAgICAgCTI2Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDIzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOQotCQkJICAgIGxvY2F0aW9uICAgCSg3MTYsIDIyOCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUQ3MjAzOUEiCi0JCQkgICAgY2xpZW50ICAgICAJQDE5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE3Ci0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDI0Ci0JCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgNzIxKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVERDAwMDg4IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmZWF0dXJlIiBAMjUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Ci0JCQkgICAgbG9jYXRpb24gICAJKDkxNSwgMjIxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYKLQkJCQlQYXJlbnRfVmlldyAJQDI1Ci0JCQkJbG9jYXRpb24gICAJKDIwMjgsIDc2NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZmVhdHVyZSIKLQkJCQlwY3REaXN0ICAgIAkwLjE4MTM0NgotCQkJCWhlaWdodCAgICAgCTY0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVERDEwMTQ4IgotCQkJICAgIGNsaWVudCAgICAgCUAyNAotCQkJICAgIHN1cHBsaWVyICAgCUAxNgotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNwotCQkJCVBhcmVudF9WaWV3IAlAMjUKLQkJCQlsb2NhdGlvbiAgIAkoMjE3MiwgODM5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDI4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJICAgIGxvY2F0aW9uICAgCSg5MTUsIDIyMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUREMTAxNTIiCi0JCQkgICAgY2xpZW50ICAgICAJQDI0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE3Ci0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIgQDI5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyNjQsIDc3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyOQotCQkJbG9jYXRpb24gICAJKDEwOTUsIDcyNSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMjYxNTkzNQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIHdpZHRoICAgICAgCTM1NgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBhcnNlVHJlZUFsbG9jYXRpb24iIEAzMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjY1LCA0OTUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMwCi0JCQlsb2NhdGlvbiAgIAkoMTAzMiwgNDQzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ2NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBhcnNlVHJlZUFsbG9jYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyQzkxMDAwNSIKLQkJICAgIHdpZHRoICAgICAgCTQ4NAotCQkgICAgaGVpZ2h0ICAgICAJMTI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyQ0I3MDFENiIKLQkJICAgIGNsaWVudCAgICAgCUAzMAotCQkgICAgc3VwcGxpZXIgICAJQDExCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNjUsIDQzMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjY1LCAzMjMpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxMykKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAzMgotCQkgICAgbG9jYXRpb24gICAJKDEyNjQsIDYzNSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzNENFMDAxQiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZXhwcmVzc2lvbiIgQDMzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMgotCQkJICAgIGxvY2F0aW9uICAgCSgtMSwgMTQwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQKLQkJCQlQYXJlbnRfVmlldyAJQDMzCi0JCQkJbG9jYXRpb24gICAJKDExMTEsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjIwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZXhwcmVzc2lvbiIKLQkJCQlwY3REaXN0ICAgIAkwLjQ5MjUzNwotCQkJCWhlaWdodCAgICAgCTE1NAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQwMDgzNENGMDJFNCIKLQkJCSAgICBjbGllbnQgICAgIAlAMzIKLQkJCSAgICBzdXBwbGllciAgIAlAMjkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUKLQkJCQlQYXJlbnRfVmlldyAJQDMzCi0JCQkJbG9jYXRpb24gICAJKDEzMDcsIDY3OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC41NjcxNjQKLQkJCQloZWlnaHQgICAgIAk0MwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAzNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMzIKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEsIDE0MCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MzRDRjAyRTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDMyCi0JCQkgICAgc3VwcGxpZXIgICAJQDMwCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBhcnNlIFRyZWUgRXhwcmVzc2lvbnMiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4MkNDMjAxNDYiCi0JICAgIHRpdGxlICAgICAgCSJQYXJzZSBUcmVlIEV4cHJlc3Npb25zIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMjUKLQkgICAgb3JpZ2luX3kgICAJNTc2OAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIgQDM3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzNDgsIDEyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNwotCQkJbG9jYXRpb24gICAJKDExNzksIDczKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRBcnJheUFjY2VzcyIgQDM4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIyMzUsIDU0NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzgKLQkJCWxvY2F0aW9uICAgCSgxODQ4LCA0MTMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNzc0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRBcnJheUFjY2VzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJFMTQwMjUwIgotCQkgICAgd2lkdGggICAgICAJNzkyCi0JCSAgICBoZWlnaHQgICAgIAkyODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRBcnJheUNyZWF0aW9uIiBAMzkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDM0LCA1MTkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM5Ci0JCQlsb2NhdGlvbiAgIAkoOSwgMzYzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTg1MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQXJyYXlDcmVhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODM3MTIwMjVBIgotCQkgICAgd2lkdGggICAgICAJODY4Ci0JCSAgICBoZWlnaHQgICAgIAkzMzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRBcnJheUluaXRpYWxpemVyIiBANDAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM2MSwgNTE5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MAotCQkJbG9jYXRpb24gICAJKDkyOSwgNDM4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTg2NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQXJyYXlJbml0aWFsaXplciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODM5NjgwMTRDIgotCQkgICAgd2lkdGggICAgICAJODgyCi0JCSAgICBoZWlnaHQgICAgIAkxODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRCb29sZWFuTGl0ZXJhbCIgQDQxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDk5NywgODcwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MQotCQkJbG9jYXRpb24gICAJKDcxOSwgNzkwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU1NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQm9vbGVhbkxpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzQUU3MDI0NyIKLQkJICAgIHdpZHRoICAgICAgCTU3NAotCQkgICAgaGVpZ2h0ICAgICAJMTg0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQ2FzdEV4cHJlc3Npb24iIEA0MgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzkxLCA4ODkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQyCi0JCQlsb2NhdGlvbiAgIAkoMTQ3NCwgNzU4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTYzNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQ2FzdEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzQjZGMDA1OCIKLQkJICAgIHdpZHRoICAgICAgCTY1MgotCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDMKLQkJICAgIGxvY2F0aW9uICAgCSgxMzQ4LCAzMzApCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDM3Ci0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMzQ4LCAzMzApCi0JCQkoMTM0OCwgMTg3KSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODM5NzkwMDM4IgotCQkgICAgY2xpZW50ICAgICAJQDQwCi0JCSAgICBzdXBwbGllciAgIAlAMzcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM4MSwgNDI1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzODEsIDMzMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQzKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzQjFEMDAwMCIKLQkJICAgIGNsaWVudCAgICAgCUA0MQotCQkgICAgc3VwcGxpZXIgICAJQDM3Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkxOCwgNzc4KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkxOCwgMzMwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDMpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODNCRDYwMzA5IgotCQkgICAgY2xpZW50ICAgICAJQDQyCi0JCSAgICBzdXBwbGllciAgIAlAMzcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc5MSwgNzQ2KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3OTEsIDMzMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQzKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRTZGMDFGNyIKLQkJICAgIGNsaWVudCAgICAgCUAzOAotCQkgICAgc3VwcGxpZXIgICAJQDM3Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyMzUsIDQwMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM1LCAzMzApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0MykKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iIEA0OAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzcyLCAxMDk1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ4Ci0JCQlsb2NhdGlvbiAgIAkoMTIwMywgMTA0NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMjYxNTkzNQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIHdpZHRoICAgICAgCTM1NgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQ2hhcmFjdGVyTGl0ZXJhbCIgQDQ5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQzMCwgMTQzOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDkKLQkJCWxvY2F0aW9uICAgCSgxNjQsIDEzMzIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTMyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRDaGFyYWN0ZXJMaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NERGMTAyNzciCi0JCSAgICB3aWR0aCAgICAgIAk1NTAKLQkJICAgIGhlaWdodCAgICAgCTIzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTAKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MzcyMTAwNDkiCi0JCSAgICBjbGllbnQgICAgIAlAMzkKLQkJICAgIHN1cHBsaWVyICAgCUAzNwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1NjEsIDM1MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjEsIDMzMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQzKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIiBANTEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM0NiwgMTQ2NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANTEKLQkJCWxvY2F0aW9uICAgCSg5MzAsIDEzMzMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJODMyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg0RjQwMDI2RiIKLQkJICAgIHdpZHRoICAgICAgCTg1MAotCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANTIKLQkJICAgIGxvY2F0aW9uICAgCSgxMzcyLCAxMjYwKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMTM3MiwgMTI2MCkKLQkJCSgxMzcyLCAxMTU4KSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUzCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODRFMTMwMUVBIgotCQkgICAgY2xpZW50ICAgICAJQDQ5Ci0JCSAgICBzdXBwbGllciAgIAlANDgKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTY0LCAxMzE5KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU2NCwgMTI2MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1NAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg0RjRDMDJGOCIKLQkJICAgIGNsaWVudCAgICAgCUA1MQotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNjcsIDEzMjApCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2NywgMTI2MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIiBANTUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE2OSwgMTQ4MSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANTUKLQkJCWxvY2F0aW9uICAgCSgxODcyLCAxMzI1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU5NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTFGQjAyNkEiCi0JCSAgICB3aWR0aCAgICAgIAk2MTIKLQkJICAgIGhlaWdodCAgICAgCTMzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTI3NDAxMkUiCi0JCSAgICBjbGllbnQgICAgIAlANTUKLQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTY4LCAxMzEzKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNjgsIDEyNjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1MikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEZpZWxkQWNjZXNzIiBANTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNzYxLCAxNzk0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1NwotCQkJbG9jYXRpb24gICAJKDQ3OSwgMTY2MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1NjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEZpZWxkQWNjZXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTJERjAyMDQiCi0JCSAgICB3aWR0aCAgICAgIAk1ODIKLQkJICAgIGhlaWdodCAgICAgCTI4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTM1RDAyNDEiCi0JCSAgICBjbGllbnQgICAgIAlANTcKLQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3NjAsIDE2NTEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzYwLCAxMjYwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTIpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbmZpeEV4cHJlc3Npb24iIEA1OQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzkwLCAxODQ1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1OQotCQkJbG9jYXRpb24gICAJKDEyODYsIDE2NjQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTAwOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW5maXhFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTM4QjAxNDMiCi0JCSAgICB3aWR0aCAgICAgIAkxMDI2Ci0JCSAgICBoZWlnaHQgICAgIAkzODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbmZpeE9wZXJhdG9yIiBANjAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjY2MCwgMjIwNykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANjAKLQkJCWxvY2F0aW9uICAgCSgyMzQ1LCAxNjk5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYzMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW5maXhPcGVyYXRvciIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2MAotCQkJbG9jYXRpb24gICAJKDIzNDUsIDE2NDkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYzMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODUzRTEwMzU5IgotCQkgICAgd2lkdGggICAgICAJNjQ4Ci0JCSAgICBoZWlnaHQgICAgIAkxMTQwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1NTcwMDAzMiIKLQkJICAgIGNsaWVudCAgICAgCUA1OQotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3ODksIDE2NTIpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4OSwgMTI2MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIgQDYyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyNzIsIDI4NTMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANjIKLQkJCWxvY2F0aW9uICAgCSgxMTAzLCAyODAyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjE1OTM1Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbnN0YW5jZW9mIiBANjMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzcxLCAzMjU1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2MwotCQkJbG9jYXRpb24gICAJKDg1LCAzMTI0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW5zdGFuY2VvZiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODU3RDMwM0EyIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANjMKLQkJCWxvY2F0aW9uICAgCSg4NSwgMzE4NSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk0OTMpCi0JCSAgICB3aWR0aCAgICAgIAk1OTAKLQkJICAgIGhlaWdodCAgICAgCTI4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVE1ldGhvZEludm9jYXRpb24iIEA2NAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjQ2LCAzMjU4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJbG9jYXRpb24gICAJKDg2MCwgMzExNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk3NzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVE1ldGhvZEludm9jYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1OEI2MDE4QiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDY0Ci0JCQlsb2NhdGlvbiAgIAkoODYwLCAzMTc4KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTcxNSkKLQkJICAgIHdpZHRoICAgICAgCTc5MAotCQkgICAgaGVpZ2h0ICAgICAJMzA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUTmFtZSIgQDY1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5NjIsIDMyMTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDY1Ci0JCQlsb2NhdGlvbiAgIAkoMTgwOSwgMzEyMSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMDcKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVE5hbWUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1OEVBMDI4MCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDY1Ci0JCQlsb2NhdGlvbiAgIAkoMTgwOSwgMzE4MikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkzMDMpCi0JCSAgICB3aWR0aCAgICAgIAkzMjUKLQkJICAgIGhlaWdodCAgICAgCTIwNQotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY2Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTI3MiwgMzA2MSkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlANjIKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEyNzIsIDMwNjEpCi0JCQkoMTI3MiwgMjkxNikpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1ODkxMDNBRiIKLQkJICAgIGNsaWVudCAgICAgCUA2MwotCQkgICAgc3VwcGxpZXIgICAJQDYyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ3NCwgMzExMikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NzQsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUI5RDAwNjciCi0JCSAgICBjbGllbnQgICAgIAlANjQKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjQ1LCAzMTA2KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDUsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUJBMTAwREIiCi0JCSAgICBjbGllbnQgICAgIAlANjUKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA1LCAzMTEwKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDUsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVE51bGxMaXRlcmFsIiBANzAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMyOCwgMzE5NSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzAKLQkJCWxvY2F0aW9uICAgCSgyMTcwLCAzMTQzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMxNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUTnVsbExpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1QkJGMDAyMCIKLQkJICAgIHdpZHRoICAgICAgCTMzNAotCQkgICAgaGVpZ2h0ICAgICAJMTI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1QkQ0MDJGMSIKLQkJICAgIGNsaWVudCAgICAgCUA3MAotCQkgICAgc3VwcGxpZXIgICAJQDYyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyOTcsIDMxMzEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5NywgMzA2MSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDY2KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIgQDcyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyNDMsIDM4NjcpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzIKLQkJCWxvY2F0aW9uICAgCSgxMDc0LCAzODE2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjE1OTM1Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFROdW1iZXJMaXRlcmFsIiBANzMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODAyLCAzNTgzKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3MwotCQkJbG9jYXRpb24gICAJKDYxOSwgMzQ4OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNjcKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVE51bWJlckxpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1QzQwMDM1QiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDczCi0JCQlsb2NhdGlvbiAgIAkoNjE5LCAzNTUwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTMwMykKLQkJICAgIHdpZHRoICAgICAgCTM4NQotCQkgICAgaGVpZ2h0ICAgICAJMjEwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1Q0VGMDI0NCIKLQkJICAgIGNsaWVudCAgICAgCUA3MwotCQkgICAgc3VwcGxpZXIgICAJQDYyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDczMCwgMzQ3OCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MzAsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIiBANzUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTY3OSwgMzYwOSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzUKLQkJCWxvY2F0aW9uICAgCSgxMzgxLCAzNTEzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU5NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1Q0Y5MDA3QyIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDc1Ci0JCQlsb2NhdGlvbiAgIAkoMTM4MSwgMzU3NCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1NDYpCi0JCSAgICB3aWR0aCAgICAgIAk2MTQKLQkJICAgIGhlaWdodCAgICAgCTIxNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUY0RTAzRTEiCi0JCSAgICBjbGllbnQgICAgIAlANzUKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc3LCAzNTAyKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzcsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFByZWZpeEV4cHJlc3Npb24iIEA3NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMzAsIDQyMjEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDc3Ci0JCQlsb2NhdGlvbiAgIAkoOSwgNDA5MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk2NDIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVFByZWZpeEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1RkFEMDA4QiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDc3Ci0JCQlsb2NhdGlvbiAgIAkoOSwgNDE1MSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk1NTMpCi0JCSAgICB3aWR0aCAgICAgIAk2NjAKLQkJICAgIGhlaWdodCAgICAgCTI4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFByZWZpeE9wZXJhdG9yIiBANzgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMzLCA0NjAyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3OAotCQkJbG9jYXRpb24gICAJKDM0LCA0NDY4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUUHJlZml4T3BlcmF0b3IiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzgKLQkJCWxvY2F0aW9uICAgCSgzNCwgNDQxOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzk4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjAyNDAwRDIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA3OAotCQkJbG9jYXRpb24gICAJKDM0LCA0NTI5KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTUKLQkJCW1heF93aWR0aCAgCTM0MykKLQkJICAgIHdpZHRoICAgICAgCTQxNgotCQkgICAgaGVpZ2h0ICAgICAJMzkyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUU3RyaW5nTGl0ZXJhbCIgQDc5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDQxOTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDc5Ci0JCQlsb2NhdGlvbiAgIAkoODQ5LCA0MDkyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM1MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUU3RyaW5nTGl0ZXJhbCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODYxRTIwMDBCIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANzkKLQkJCWxvY2F0aW9uICAgCSg4NDksIDQxNTMpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMwotCQkJbWF4X3dpZHRoICAJNDU5KQotCQkgICAgd2lkdGggICAgICAJMzcwCi0JCSAgICBoZWlnaHQgICAgIAkyMzAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4MAotCQkgICAgbG9jYXRpb24gICAJKDEyNDMsIDQwMjApCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDcyCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMjQzLCA0MDIwKQotCQkJKDEyNDMsIDM5MzApKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODEKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjJENzAzMzgiCi0JCSAgICBjbGllbnQgICAgIAlANzkKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDA4LCA0MDgxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDgsIDQwMjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODIKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjJEQzAxRDciCi0JCSAgICBjbGllbnQgICAgIAlANzcKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTcsIDQwNzgpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk3LCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRUaGlzTGl0ZXJhbCIgQDgzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE2NTUsIDQxODApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDgzCi0JCQlsb2NhdGlvbiAgIAkoMTQ5NCwgNDEyOSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVFRoaXNMaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjNBNzAwQ0IiCi0JCSAgICB3aWR0aCAgICAgIAkzNDAKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjQxODAxOUYiCi0JCSAgICBjbGllbnQgICAgIAlAODMKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI3LCA0MTE3KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjcsIDQwMjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFR5cGVMaXRlcmFsIiBAODUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI1NiwgNDIwMSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAODUKLQkJCWxvY2F0aW9uICAgCSgyMDkzLCA0MTA2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyNwotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUVHlwZUxpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2NDk1MDE4MSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDg1Ci0JCQlsb2NhdGlvbiAgIAkoMjA5MywgNDE2NykKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkyODEpCi0JCSAgICB3aWR0aCAgICAgIAkzNDUKLQkJICAgIGhlaWdodCAgICAgCTIxNQotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjU0QzAwMDgiCi0JCSAgICBjbGllbnQgICAgIAlAODUKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTk3LCA0MDkzKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxOTcsIDQwMjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEludmFsaWRFeHByZXNzaW9uIiBAODcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ1NywgNDU0NSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAODcKLQkJCWxvY2F0aW9uICAgCSgxMjc5LCA0NDQ5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM1NwotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW52YWxpZEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2NUFGMDIwOSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDg3Ci0JCQlsb2NhdGlvbiAgIAkoMTI3OSwgNDUxMCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkzNjgpCi0JCSAgICB3aWR0aCAgICAgIAkzNzUKLQkJICAgIGhlaWdodCAgICAgCTIxNQotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjZGNTAyNTgiCi0JCSAgICBjbGllbnQgICAgIAlAODcKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDEzLCA0NDM4KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTMsIDQwMjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YUluc3RhbmNlIiBAODkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMwMSwgNDkxNykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAODkKLQkJCWxvY2F0aW9uICAgCSgyMTM3LCA0ODg3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklKYXZhSW5zdGFuY2UiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAODkKLQkJCWxvY2F0aW9uICAgCSgyMTM3LCA0ODM3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFNTE1NzVBMDJENCIKLQkJICAgIHdpZHRoICAgICAgCTM0NgotCQkgICAgaGVpZ2h0ICAgICAJMTg0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUSW5zdGFuY2VSZWZlcmVuY2UiIEA5MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMDA1LCA0NTA5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA5MAotCQkJbG9jYXRpb24gICAJKDE4MDUsIDQzOTMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDAxCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRJbnN0YW5jZVJlZmVyZW5jZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAxN0RCMTgwMkIzIgotCQkgICAgd2lkdGggICAgICAJNDE5Ci0JCSAgICBoZWlnaHQgICAgIAkyNTcKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAxN0RCNEEwMzQxIgotCQkgICAgY2xpZW50ICAgICAJQDkwCi0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk0MywgNDM4MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTQzLCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBAOTIKLQkJICAgIGxvY2F0aW9uICAgCSgyMTY1LCA0NzMwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAxN0RCRTMwMTM4IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2UiIEA5MwotCQkJICAgIFBhcmVudF9WaWV3IAlAOTIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3LCAyNTkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NAotCQkJCVBhcmVudF9WaWV3IAlAOTMKLQkJCQlsb2NhdGlvbiAgIAkoMjEyMCwgNDc5NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTg5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcmVmZXJlbmNlIgotCQkJCXBjdERpc3QgICAgCTAuMjMxOTYwCi0JCQkJaGVpZ2h0ICAgICAJNzcKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MDE3REJFNjAwMDYiCi0JCQkgICAgY2xpZW50ICAgICAJQDkyCi0JCQkgICAgc3VwcGxpZXIgICAJQDg5Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk1Ci0JCQkJUGFyZW50X1ZpZXcgCUA5MwotCQkJCWxvY2F0aW9uICAgCSgyMjcwLCA0NzgzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNyIgQDk2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA5MgotCQkJICAgIGxvY2F0aW9uICAgCSgyMjcsIDI1OSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MDE3REJFNjAxNjQiCi0JCQkgICAgY2xpZW50ICAgICAJQDkyCi0JCQkgICAgc3VwcGxpZXIgICAJQDkwCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiIgQDk3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDg1MiwgNDU3NykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOTcKLQkJCWxvY2F0aW9uICAgCSg0OTUsIDQ0NzEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNzE0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MzYyN0MxNDAzOTYiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA5NwotCQkJbG9jYXRpb24gICAJKDQ5NSwgNDUzMikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk1MDMpCi0JCSAgICB3aWR0aCAgICAgIAk3MzIKLQkJICAgIGhlaWdodCAgICAgCTIzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MzYyN0Q0RTAwRDAiCi0JCSAgICBjbGllbnQgICAgIAlAOTcKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzcsIDQ0NTkpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjc3LCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApKSkpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9qYXZhTW9kZWwubWRsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9qYXZhTW9kZWwubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZiOTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvamF2YU1vZGVsLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDg4MTkgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDcKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJJREUiCi0JICAgIHZhbHVlICAgICAgCSJJbnRlcm5hbCBFZGl0b3IiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiCi0JICAgIHZhbHVlICAgICAgCSIiKSkKLSAgICBxdWlkICAgICAgIAkiMzlFREZCRTAwM0I0IgotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMKLQlyaWdodE1hcmdpbiAJMC4yNTAwMDAKLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMAotCXRvcE1hcmdpbiAgCTAuMjUwMDAwCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMAotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMAotCWNsaXBJY29uTGFiZWxzIAlUUlVFCi0JYXV0b1Jlc2l6ZSAJVFJVRQotCXNuYXBUb0dyaWQgCVRSVUUKLQlncmlkWCAgICAgIAkxNgotCWdyaWRZICAgICAgCTE2Ci0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udAotCSAgICBzaXplICAgICAgIAkxMAotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JICAgIGJvbGQgICAgICAgCUZBTFNFCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JICAgIHVuZGVybGluZSAgCUZBTFNFCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JICAgIGNvbG9yICAgICAgCTAKLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQlzaG93TWVzc2FnZU51bSAJMQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3IgotCXF1aWQgICAgICAgCSIzOUVERkJFMDAzQjYiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzOUVERkJFMjAwOEQiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyIKLQlxdWlkICAgICAgIAkiMzlFREZCRTAwM0I1IgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyIKLQlxdWlkdSAgICAgIAkiMzlFREZCRTAwM0I3IgotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImphdmEiCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXb3Jrc3BhY2VSb290XFxvcmcuZWNsaXBzZS5qZW1cXHJvc2VcXGVkb2NqYXZhMi5jYXQiCi0JCXF1aWQgICAgICAgCSIzNjU0OUYyQzAwNEUiKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlY29yZSIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdvcmtzcGFjZVJvb3RcXG9yZy5lY2xpcHNlLmVtZi5lY29yZVxcbW9kZWxcXG9yZy5lY2xpcHNlLmVtZi5FY29yZS5jYXQiCi0JCXF1aWQgICAgICAgCSIzOUE1RUQwNDAwNEUiKSkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzOUVERkJFMjAwOEUiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpqYXZhIiBAMQotCQkJbG9jYXRpb24gICAJKDc4NCwgNTI4KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkgICAgbG9jYXRpb24gICAJKDYzMCwgNDkzKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTMwOAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiamF2YSIpCi0JCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMQotCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDQ0MykKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkgICAgbmxpbmVzICAgICAJMQotCQkJICAgIG1heF93aWR0aCAgCTMwOAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiPDxtZXRhbW9kZWw+PiIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiMzY1NDlGMkMwMDRFIgotCQkJd2lkdGggICAgICAJMzIwCi0JCQloZWlnaHQgICAgIAkxODIpCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjplY29yZSIgQDIKLQkJCWxvY2F0aW9uICAgCSgzMDQsIDU0NCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJICAgIGxvY2F0aW9uICAgCSgxNjAsIDQ2MCkKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJImVjb3JlIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzOUE1RUQwNDAwNEUiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyIKLQlxdWlkICAgICAgIAkiMzlFREZCRTAwM0I3IgotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzOUVERkJFMjAwOEMiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3NlcwotCXF1aWQgICAgICAgCSIzOUVERkJFMDAzQjgiCi0JUHJvY3NORGV2cyAJKGxpc3QKLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyIKLQkJcXVpZCAgICAgICAJIjM5RURGQkUwMDNCQSIKLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMKLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJInJvc2VJZCIKLQkJdmFsdWUgICAgICAJIjc1MzExNzU0MCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjkiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzSUQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkidmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRmVhdHVyZUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkF0dHJpYnV0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInJlZmVyZW5jZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkidmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLW9ubHkgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRmVhdHVyZUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkF0dHJpYnV0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTQpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCS0yKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyIKLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjEiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMyIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjQiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI1IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keSIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJTb3VyY2VGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCb2R5U291cmNlRmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQU5TSSBDKysgRXZlbnQgV2F0Y2hlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQU5TSUNvbnZlcnQiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE4M19TT1VSQ0UiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTmFtZSIKLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0FjY2VzcyIKLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUG9seW1vcnBoaWNVbml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlQWNjZXNzIgotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJUaGVfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIlRoaXMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb3B5IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkZyZWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzRXF1YWxpdHlPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlRXF1YWxpdHlPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNUYXNrIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJMaW1pdGVkUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJTcGVjIgotCQkJCXZhbHVlICAgICAgCTIyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIgotCQkJCXZhbHVlICAgICAgCTIyMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJJbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkluT3V0IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb25SZXR1cm4iCi0JCQkJdmFsdWUgICAgICAJMjA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJVc2VDb2xvbk5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE5NV9TT1VSQ0UiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVJbXBsZW1lbnRhdGlvblNldCIgMjA4KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2wiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29udHJvbGxlZF8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZURlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7Y2xhc3N9X1JlY29yZF9LaW5kcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzTGltaXRlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQ2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTWF5YmVBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IiAxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmVudENsYXNzTmFtZSIKLQkJCXZhbHVlICAgICAgCSJTdXBlcmNsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4IgotCQkJdmFsdWUgICAgICAJIkFfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7YWNjZXNzX3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5SW5kZXhEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIlRoaXMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb3B5IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUeXBlRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUVxdWFsaXR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3F1b3RlfT0ke3F1b3RlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlRhZ2dlZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlY29yZCIKLQkJCQl2YWx1ZSAgICAgIAkyMTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk1peGluIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJUYXNrIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpcGxlVHlwZXMiCi0JCQkJdmFsdWUgICAgICAJMjEzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVW5jb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMjI1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbml0aWFsaXphdGlvbk9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjI2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMjcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkyMjgpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiCi0JCQkJdmFsdWUgICAgICAJMjI5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBdXRvIgotCQkJCXZhbHVlICAgICAgCTIzMCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzUHJpdmF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRpbmciCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck1vZGUiCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyQ2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVudHJ5QmFycmllckNvbmRpdGlvbiIKLQkJCXZhbHVlICAgICAgCSJUcnVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU3BlYyIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nQXNCb2R5IgotCQkJCXZhbHVlICAgICAgCTIzMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluIgotCQkJCXZhbHVlICAgICAgCTIwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiT3V0IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW5PdXQiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTIxNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTIxNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ2xlYXJDYXNlIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJInByb2plY3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJWaWV3Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNQUGFja2FnZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJKb2luQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEb21haW5QcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGF0YWJhc2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEZWF1bHQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkJ1ZmZlclBvb2wiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiCi0JCQl2YWx1ZSAgICAgIAkxKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJlZmV0Y2hTaXplIgotCQkJdmFsdWUgICAgICAJMSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhZ2VTaXplIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyTGlzdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtU2NoZW1hIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb290RG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWFQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEQk1TIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNWaWV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTUFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29ycmVsYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGVja09wdGlvbiIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NuYXBTaG90IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0lkZW50aXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOYXRpdmUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT0lEIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSZWxhdGlvbnNoaXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSSU1ldGhvZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUcmlnZ2VyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1N0b3JlZFByb2NlZHVyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNDbHVzdGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGaWxsRmFjdG9yIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIktleUxpc3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoZWNrUHJlZGljYXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmZXJhbE1vZGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDaGVja1RpbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luc2VydEV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZUV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RlbGV0ZUV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZPbGRUYWJsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmTmV3VGFibGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk9sZFJvdyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmTmV3Um93IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1JvdyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiV2hlbkNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGFuZ3VhZ2UiCi0JCQl2YWx1ZSAgICAgIAkiU1FMIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByb2NUeXBlIgotCQkJdmFsdWUgICAgICAJIlByb2NlZHVyZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RldGVybWluaXN0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlclN0eWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5lZE51bGwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtZXRlciIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5QYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNPdXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIgQ29tbXVuaWNhdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5vdFNob3dSb3NlSUREbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUm9zZUlEIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0VmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNYXhOdW1DaGFycyIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWTSIKLQkJCXZhbHVlICAgICAgCSgiVk1UeXBlIiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGF0aCIKLQkJCXZhbHVlICAgICAgCSI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxjaGFyc2V0cy5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxqY2UuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcanNzZS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxydC5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxzdW5yc2FzaWduLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcZG5zbnMuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxsZGFwc2VjLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcbG9jYWxlZGF0YS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXHN1bmpjZV9wcm92aWRlci5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxzZWN1cml0eVxcbG9jYWxfcG9saWN5LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHNlY3VyaXR5XFxVU19leHBvcnRfcG9saWN5LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcbGliXFxkdC5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGxpYlxcaHRtbGNvbnZlcnRlci5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGxpYlxcdG9vbHMuamFyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWZlcmVuY2VDbGFzc3BhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3VuIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJNaWNyb3NvZnQiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIklCTSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWQUphdmFXb3JraW5nRm9sZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJtXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJzXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyIKLQkJCXZhbHVlICAgICAgCTMpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5QcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVtb3RlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVtb3RlU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSG9tZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkhvbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkRURExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERURExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U2VydmxldFZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRKMkVFSmF2YWRvYyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZUphdmFEb2NUYWdzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbFN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUNvbnRyb2wiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NTZWxlY3RlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3RTb3VyY2VSb290IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NDb21tZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiX0lEIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uT2ZSRUZTIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIgotCQkJdmFsdWUgICAgICAJKCJNZXRob2RLaW5kU2V0IiAxOTAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPdmVybG9hZElEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTZWxmaXNoIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJFdmVudFNldCIgMTYwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRm9yRWFjaFNldCIgMTcwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlcldoZW5DbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTkwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMTkwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcGVyYXRvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlRyaWdnZXIiCi0JCQkJdmFsdWUgICAgICAJMTkwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIgotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJBRlRFUiIKLQkJCQl2YWx1ZSAgICAgIAkxODAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSIKLQkJCQl2YWx1ZSAgICAgIAkxODAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiCi0JCQkJdmFsdWUgICAgICAJMTgwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlJPVyIKLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCIKLQkJCQl2YWx1ZSAgICAgIAkxNzAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCIKLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIjIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIjYiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1ByaW1hcnlLZXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ29tcG9uZW50VGVzdCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUmVxdWlzaXRlUHJvIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjIuMV9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2UoJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2UoJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMy4wX19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFic3RyYWN0Qm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZEJvZHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmREZWNsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNwZWNpYWxEZWNsUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiCi0JCQl2YWx1ZSAgICAgIAkyKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAk2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIgotCQkJCXZhbHVlICAgICAgCTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJTb0RBIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJUb3BMaW5rIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJUeXBlS2luZHMiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJlbnVtIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJInJlY29yZCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJtb2R1bGUiCi0JCQkJdmFsdWUgICAgICAJMTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiaW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTEwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImRpc3BpbnRlcmZhY2UiCi0JCQkJdmFsdWUgICAgICAJMTA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiY29jbGFzcyIKLQkJCQl2YWx1ZSAgICAgIAkxMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJhbGlhcyIKLQkJCQl2YWx1ZSAgICAgIAkxMDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJ1bmlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJtYXgiCi0JCQkJdmFsdWUgICAgICAJMTA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTEwOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkia2luZCIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUtpbmRzIiAxMDkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidXVpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImRsbG5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImFsaWFzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiZmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImxpYnJhcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInV1aWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBmaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkibGNpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZ1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTIxMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCYXNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIjAiCi0JCQkJdmFsdWUgICAgICAJMjIzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiMSIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiCi0JCQl2YWx1ZSAgICAgIAkoIkJhc2VTZXQiIDIyMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIgotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZyIKLQkJCXZhbHVlICAgICAgCSgiSW5zdGFuY2luZ1NldCIgMjE5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiQmluYXJ5IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlRleHQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Qm9keSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQnlWYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJ5UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUGFyYW1BcnJheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wb3J0UmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJRdWlja0ltcG9ydCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBvcnRCaW5hcnkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1N5c3RlbUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1B1YmxpY0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25WYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkludGVybmFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJFbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbEVudGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1N5c3RlbUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fUHVibGljSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHREZWNsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ24gQWxsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQ29tcG9uZW50UGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlIyRWRpdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTQpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCS0yKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyIKLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VzIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJTYW1lIGFzIG1vZGVsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIxIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMiIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjMiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI0IgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOZXZlciBnZW5lcmF0ZSBtb2RlbCBJRHMiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEZXBsb3kiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiY2xhc3NpZmllck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiY29uc3RyYWludHMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29udGVudEtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRW1wdHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk1peGVkIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnRPbmx5IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJvcGVyYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpKQotCXF1aWQgICAgICAgCSIzOUVERkJFMDAzQjkiKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU0ZDhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4JCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmMzNWM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWFubm90YXRpb25zLWNvcmUuamFyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjAyZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQ3OTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBBcHIgMTYgMTc6MTU6MTEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmYwNTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1NhdCBKdW4gMDIgMTc6MDY6MzggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2JkNzY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jU3VuIEFwciAxNiAxNzoxNDo1MiBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTY2NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDEucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6ICBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMGMwMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotamFycy5jb21waWxlLm9yZGVyID0gLgotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjlkODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUKLUJ1bmRsZS1OYW1lLjAgPSBBbm5vdGF0aW9uIENvcmUgUGx1Zy1pbgotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLWV4dGVuc2lvbi1wb2ludC5uYW1lLjAgPSBBbm5vdGF0aW9ucyBQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTQzZDYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFubm90YXRpb25zUHJvdmlkZXIiIG5hbWU9IiVleHRlbnNpb24tcG9pbnQubmFtZS4wIiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uc1Byb3ZpZGVyLmV4c2QiLz4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgaWQ9IkFubm90YXRpb25zVHJhbnNsYXRvciIKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYudHJhbnNsYXRvckV4dGVuc2lvbiI+Ci0gICAgICAgPHRyYW5zbGF0b3IKLSAgICAgICAJCWNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zVHJhbnNsYXRvciI+Ci0gICAgICAgPC90cmFuc2xhdG9yPgotIDwvZXh0ZW5zaW9uPgotICAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzcxOGE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuYW5ub3RhdGlvbnMuY29yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3Byb3BlcnR5X2ZpbGVzIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vcHJvcGVydHlfZmlsZXMiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wcm9wZXJ0eV9maWxlcy9hbm5vdGF0aW9uY29yZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcHJvcGVydHlfZmlsZXMvYW5ub3RhdGlvbmNvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhMzRjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wcm9wZXJ0eV9maWxlcy9hbm5vdGF0aW9uY29yZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UYWdTcGVjXzM9VW5rbm93biB0YWcgc2NvcGU6Ci1UYWdTcGVjXzQ9TnVsbCB0YWcgc2NvcGUuCi1UYWdBdHRyaWJTcGVjXzY9Ci1Bbm5vdGF0aW9uVGFnUGFyc2VyXzA9TnVsbCBldmVudCBoYW5kbGVyLgotQW5ub3RhdGlvblRhZ1BhcnNlcl8xPQotQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5XzA9TW9yZSB0aGFuIG9uZSAnQW5ub3RhdGlvblRhZ0luZm8nIHRhZyBmb3IgdGhlIHRhZyAnCi1Bbm5vdGF0aW9uVGFnUmVnaXN0cnlfOT1wYXJzZVRhZ0F0dHJpYnM6IHVua25vd24gJ3VzZScgdmFsdWU6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbnNQcm92aWRlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25zUHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYwZGNlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbnNQcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlIiBpZD0iYW5ub3RhdGlvbnNQcm92aWRlciIgbmFtZT0iQW5ub3RhdGlvbnMgUHJvdmlkZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgYnkgY2xpZW50cyB0byBhbGxvdyB0aGVpciBvd24gYW5ub3RhdGlvbiBwcm92aWRlciB0byBkZXRhaWwgaW5mb3JtYXRpb24gb24gd2hldGhlciBvciBub3QgYSBnaXZlbiBFT2JqZWN0IGlzIGFubm90YXRlZCBmb3Igb25lIG9mIHRoZWlyIHRhZyBzZXRzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5ub3RhdGlvbnNQcm92aWRlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uc1Byb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIGEgY2xhc3Mgd2hpY2ggaW1wbG1lbnRzIHRoZSBJQW5ub3RhdGlvbnNQcm92aWRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFsxLjAuMl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtUaGlzIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRlZENvbW1lbnRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRlZENvbW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzY3ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0ZWRDb21tZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIgaW1wbGVtZW50cyBUYWdQYXJzZUV2ZW50SGFuZGxlciB7Ci0KLQlwcml2YXRlIE1hcCBhbm5vdGF0aW9uczsKLQotCXByaXZhdGUgVG9rZW4gYW5ub3RhdGlvblRva2VuOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBbm5vdGF0ZWRDb21tZW50SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5UYWdQYXJzZUV2ZW50SGFuZGxlciNhbm5vdGF0aW9uVGFnKG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5Ub2tlbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhbm5vdGF0aW9uVGFnKFRva2VuIHRhZykgewotCQl0aGlzLmFubm90YXRpb25Ub2tlbiA9IHRhZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5UYWdQYXJzZUV2ZW50SGFuZGxlciNlbmRPZlRhZyhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kT2ZUYWcoaW50IHBvcykgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVGFnUGFyc2VFdmVudEhhbmRsZXIjYXR0cmlidXRlKG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5Ub2tlbiwKLQkgKiAgICAgIGludCwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRva2VuKQotCSAqLwotCXB1YmxpYyB2b2lkIGF0dHJpYnV0ZShUb2tlbiBuYW1lLCBpbnQgZXF1YWxzUG9zaXRpb24sIFRva2VuIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZS5nZXRUZXh0KCkgPT0gbnVsbCB8fCB2YWx1ZS5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkKLQkJCWdldEFubm90YXRpb25zKCkucHV0KHRoaXMuYW5ub3RhdGlvblRva2VuLmdldFRleHQoKSwgbmFtZS5nZXRUZXh0KCkpOwotCQllbHNlCi0JCQlnZXRBbm5vdGF0aW9ucygpLnB1dChuYW1lLmdldFRleHQoKSwgdmFsdWUuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFubm90YXRpb25zLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0QW5ub3RhdGlvbnMoKSB7Ci0JCWlmIChhbm5vdGF0aW9ucyA9PSBudWxsKQotCQkJYW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gYW5ub3RhdGlvbnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvblRhZ1BhcnNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uVGFnUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzIwZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uVGFnUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMTEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLS8qKgotICogQGF1dGhvciBQYXQgS2VsbGV5Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVGFnUGFyc2VyIHsKLQotCXByaXZhdGUgVGFnUGFyc2VFdmVudEhhbmRsZXIgaGFuZGxlcjsKLQotCXByaXZhdGUgY2hhcltdIGlucHV0OwotCi0JaW50IHBvczsKLQotCWludCBlbmRPZkxhc3RHb29kQXR0UGFyc2U7Ci0JCi0JcHJpdmF0ZSBPYmplY3QgYW5ub3RhdGlvbkxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvblRhZ1BhcnNlcihUYWdQYXJzZUV2ZW50SGFuZGxlciB0cCkgewotCQlpZiAodHAgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihBbm5vdGF0aW9uc0NvcmVSZXNvdXJjZXMuQW5ub3RhdGlvblRhZ1BhcnNlcl8wKTsgCi0JCX0KLQkJaGFuZGxlciA9IHRwOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBlb3MoKSB7Ci0JCXJldHVybiBwb3MgPj0gaW5wdXQubGVuZ3RoOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1dTKGNoYXIgYykgewotCQlyZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcdCc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNraXBXUygpIHsKLQkJd2hpbGUgKHBvcyA8IGlucHV0Lmxlbmd0aCAmJiAoaXNXUyhpbnB1dFtwb3NdKSB8fCBpbnB1dFtwb3NdID09ICcqJykpIHsKLQkJCXBvcysrOwotCQl9Ci0JfQotCi0JLy8gQ2FsbGVyIGlzIGV4cGVjdGVkIHRvIG1ha2Ugc3VyZSB0aGUgZW9zIGhhcyBub3QgYmVlbiByZWFjaGVkLgotCXByaXZhdGUgY2hhciBwZWVrKCkgewotCQlyZXR1cm4gaW5wdXRbcG9zXTsKLQl9Ci0KLQkvLyBDYWxsZXIgaXMgZXhwZWN0ZWQgdG8gY2hlY2sgZm9yIEVPUy4KLQlwcml2YXRlIGNoYXIgbmV4dENoYXIoKSB7Ci0JCXJldHVybiBpbnB1dFtwb3MrK107Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmV4dENoYXIoY2hhciBjKSB7Ci0JCWlmIChlb3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHBlZWsoKSA9PSBjOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0lEQ2hhcihjaGFyIGMpIHsKLQkJcmV0dXJuICFpc1dTKGMpICYmIGMgIT0gJz0nICYmIGMgIT0gJ0AnICYmIGMgIT0gJ1wiJzsKLQl9Ci0KLQlwcml2YXRlIFRva2VuIGNvbGxlY3RJRCgpIHsKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDE2KTsKLQkJVG9rZW4gdCA9IG5ldyBUb2tlbigpOwotCi0JCXQuc2V0QmVnaW5uaW5nKHBvcyk7Ci0JCXdoaWxlICghZW9zKCkgJiYgaXNJRENoYXIocGVlaygpKSkgewotCQkJYi5hcHBlbmQobmV4dENoYXIoKSk7Ci0JCX0KLQkJdC5zZXRFbmQocG9zIC0gMSk7Ci0JCXQuc2V0VGV4dChiLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gdDsKLQl9Ci0KLQlwcml2YXRlIFRva2VuIGV4cGVjdEF0dHJpYk5hbWUoKSB7Ci0JCWlmIChlb3MoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IHNhdmUgPSBwb3M7Ci0KLQkJVG9rZW4gcmV0dmFsID0gY29sbGVjdElEKCk7Ci0JCWlmIChyZXR2YWwubGVuZ3RoKCkgPT0gMCkgewotCQkJcG9zID0gc2F2ZTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0JcHJpdmF0ZSBUb2tlbiBleHBlY3RUYWcoKSB7Ci0JCWlmIChlb3MoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IHNhdmVQb3MgPSBwb3M7Ci0KLQkJaWYgKG5leHRDaGFyKCkgIT0gJ0AnKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChlb3MoKSB8fCBpc1dTKHBlZWsoKSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVG9rZW4gcmV0dmFsID0gZXhwZWN0QXR0cmliTmFtZSgpOwotCi0JCWlmIChyZXR2YWwubGVuZ3RoKCkgPT0gMCkgewotCQkJcG9zID0gc2F2ZVBvcyArIDE7Ci0JCX0KLQkJcmV0dmFsLnNldEJlZ2lubmluZyhzYXZlUG9zKTsKLQotCQkvLyBTYXZlIGVuZCBvZiBwYXJzZSBzbyB3ZSBjYW4gcGFzcyBpdCBhcyB0aGUgZW5kIG9mIHRoZSBwYXJzZWQgdGFnLgotCQllbmRPZkxhc3RHb29kQXR0UGFyc2UgPSBwb3M7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0JcHJpdmF0ZSBUb2tlbiBleHBlY3RRdW90ZWRWYWx1ZSgpIHsKLQkJc2tpcFdTKCk7Ci0JCWlmIChlb3MoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlUb2tlbiB0b2sgPSBuZXcgVG9rZW4oKTsKLQotCQl0b2suc2V0QmVnaW5uaW5nKHBvcyk7Ci0JCWlmIChwZWVrKCkgIT0gJ1wiJykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJbmV4dENoYXIoKTsKLQotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDY0KTsKLQotCQl3aGlsZSAoIWVvcygpICYmIHBlZWsoKSAhPSAnXCInKSB7Ci0JCQliLmFwcGVuZChuZXh0Q2hhcigpKTsKLQkJfQotCQlpZiAoIWVvcygpKSB7Ci0JCQluZXh0Q2hhcigpOwotCQl9Ci0KLQkJdG9rLnNldEVuZChwb3MgLSAxKTsKLQkJdG9rLnNldFRleHQoYi50b1N0cmluZygpKTsKLQkJcmV0dXJuIHRvazsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXhwZWN0QXNzaWduKCkgewotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChuZXh0Q2hhcigpID09ICc9JykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcG9zLS07Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIFRva2VuIG1rTnVsbFRva2VuKCkgewotCQlUb2tlbiByZXR2YWwgPSBuZXcgVG9rZW4oKTsKLQotCQlyZXR2YWwuc2V0QmVnaW5uaW5nKHBvcyk7Ci0JCXJldHZhbC5zZXRFbmQocG9zIC0gMSk7Ci0JCXJldHZhbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwYXJzZU5leHRBdHRyaWJ1dGUoKSB7Ci0JCXNraXBXUygpOwotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlUb2tlbiBrZXkgPSBjb2xsZWN0SUQoKTsKLQotCQlpZiAoa2V5ID09IG51bGwgfHwga2V5Lmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXNraXBXUygpOwotCQlpZiAoZW9zKCkpIHsKLQkJCS8vIEdvIGFoZWFkIGFuZCByZXBvcnQgaXQsIGV2ZW4gdGhvdWdoIGl0IGlzIGEgcGFydGlhbCBhdHRyaWJ1dGUuICgKLQkJCS8vIHdlIHN0aWxsIGZhaWwgaGVyZSApCi0JCQloYW5kbGVyLmF0dHJpYnV0ZShrZXksIC0xLCBta051bGxUb2tlbigpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWludCBlcVBvcyA9IHBvczsKLQotCQlpZiAoIWV4cGVjdEFzc2lnbigpKSB7Ci0JCQkvLyBFdmVuIHRob3VnaCB3ZSB3b24ndCBwYXJzZSB0aGlzIGFzIGEgZnVsbCBhdHRyaWJ1dGUsIGdvIGFoZWFkIGFuZAotCQkJLy8gY2FsbCB0aGUgaGFuZGxlciB3aXRoIGl0LiBTb21lIGNsaWVudHMgd2FudCB0byBzZWUgcGFydGlhbAotCQkJLy8gYXR0cmlidXRlcy4KLQkJCWhhbmRsZXIuYXR0cmlidXRlKGtleSwgLTEsIG1rTnVsbFRva2VuKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXNraXBXUygpOwotCi0JCWlmIChlb3MoKSkgewotCQkJLy8gU2FtZSBoZXJlIC0gd2UgZmFpbCBvbiBpdCwgYnV0IHdlIHJlcG9ydCBpdCBhbnl3YXkKLQkJCWhhbmRsZXIuYXR0cmlidXRlKGtleSwgZXFQb3MsIG1rTnVsbFRva2VuKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVRva2VuIHZhbHVlID0gZXhwZWN0UXVvdGVkVmFsdWUoKTsKLQotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBjb2xsZWN0SUQoKTsKLQkJCWlmIChpc05leHRDaGFyKCc9JykpIHsKLQkJCQlwb3MgPSB2YWx1ZS5nZXRCZWdpbm5pbmcoKTsKLQkJCQl2YWx1ZSA9IG1rTnVsbFRva2VuKCk7Ci0JCQl9Ci0JCX0KLQkJZW5kT2ZMYXN0R29vZEF0dFBhcnNlID0gcG9zOwotCQloYW5kbGVyLmF0dHJpYnV0ZShrZXksIGVxUG9zLCB2YWx1ZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUF0dHJpYnV0ZXMoKSB7Ci0JCXdoaWxlICghZW9zKCkgJiYgcGFyc2VOZXh0QXR0cmlidXRlKCkpIHsKLQkJCS8vIGxvb3Agd2hpbGUgbm90IGVuZCBvZiBzdHJpbmcKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBza2lwVG9UYWdDaGFyKCkgewotCQl3aGlsZSAoIWVvcygpICYmIHBlZWsoKSAhPSAnQCcpIHsKLQkJCW5leHRDaGFyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZXJJbnB1dChjaGFyW10gdGV4dCkgewotCQlzeW5jaHJvbml6ZWQoYW5ub3RhdGlvbkxvY2spIHsKLQkJCWlucHV0ID0gdGV4dDsKLQkJCXBvcyA9IDA7Ci0JCQllbmRPZkxhc3RHb29kQXR0UGFyc2UgPSAwOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VySW5wdXQoU3RyaW5nIHRleHQpIHsKLQkJc2V0UGFyc2VySW5wdXQodGV4dC50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYXJzZSgpIHsKLQkJc3luY2hyb25pemVkIChhbm5vdGF0aW9uTG9jaykgewotCQkJd2hpbGUgKCFlb3MoKSkgewotCQkJCXNraXBUb1RhZ0NoYXIoKTsKLQkJCQlUb2tlbiB0YWcgPSBleHBlY3RUYWcoKTsKLQkJCQlpZiAodGFnID09IG51bGwpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWhhbmRsZXIuYW5ub3RhdGlvblRhZyh0YWcpOwotCQkJCXBhcnNlQXR0cmlidXRlcygpOwotCQkJCWhhbmRsZXIuZW5kT2ZUYWcoZW5kT2ZMYXN0R29vZEF0dFBhcnNlKTsKLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQzMWNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkNsb25lYWJsZVB1YmxpYzsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIENsb25lYWJsZVB1YmxpYyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURUQgPSAiZ2VuZXJhdGVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURBUFRFUl9UWVBFID0gQW5ub3RhdGlvbnNBZGFwdGVyLmNsYXNzLmdldE5hbWUoKTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIE5PVElGSUNBVElPTl9GRUFUVVJFID0gbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwoKSB7Ci0JCS8vIGFub255bW91cyBpbm5lciBjbGFzcwotCX07Ci0KLQlwcml2YXRlIE1hcCBhbm5vdGF0aW9uc01hcDsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNjbG9uZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsgLy8gdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJLy9yZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVtZk9iamVjdAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQW5ub3RhdGlvbnMoRU9iamVjdCBlbWZPYmplY3QsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKGVtZk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlBbm5vdGF0aW9uc0FkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoZW1mT2JqZWN0KTsKLQkJYWRhcHRlci5hZGRBbm5vdGF0aW9ucyhuYW1lLCB2YWx1ZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gZW1mT2JqZWN0Ci0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFubm90YXRpb25zKEVPYmplY3QgZW1mT2JqZWN0LCBTdHJpbmcgbmFtZSkgewotCQlpZiAoZW1mT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGludGVybmFsR2V0QW5ub3RhdGlvbnMoZW1mT2JqZWN0LCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBpbnRlcm5hbEdldEFubm90YXRpb25zKEVPYmplY3QgZW1mT2JqZWN0LCBTdHJpbmcgbmFtZSkgewotCQlpZiAoZW1mT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVtZk9iamVjdCk7Ci0JCXJldHVybiAoYWRhcHRlciA9PSBudWxsKSA/IGludGVybmFsR2V0QW5ub3RhdGlvbnMoZW1mT2JqZWN0LmVDb250YWluZXIoKSwgbmFtZSkgOiBhZGFwdGVyLmdldEFubm90YXRpb25zKG5hbWUpOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIGVtZk9iamVjdAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCByZW1vdmVBbm5vdGF0aW9ucyhFT2JqZWN0IGVtZk9iamVjdCwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGVtZk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUFubm90YXRpb25zQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbWZPYmplY3QpOwotCQlyZXR1cm4gYWRhcHRlci5yZW1vdmVBbm5vdGF0aW9ucyhuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25zKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJZ2V0QW5ubm90YXRpb25zKCkucHV0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldEFubm90YXRpb25zKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5ub3RhdGlvbnMoKS5nZXQobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCByZW1vdmVBbm5vdGF0aW9ucyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0QW5ubm90YXRpb25zKCkucmVtb3ZlKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldEFubm5vdGF0aW9ucygpIHsKLQkJaWYgKGFubm90YXRpb25zTWFwID09IG51bGwpCi0JCQlhbm5vdGF0aW9uc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBhbm5vdGF0aW9uc01hcDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZW1mT2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQW5ub3RhdGlvbnNBZGFwdGVyIGdldEFkYXB0ZXIoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyIGFkYXB0ZXIgPSByZXRyaWV2ZUV4aXN0aW5nQWRhcHRlcihlbWZPYmplY3QpOwotCQlyZXR1cm4gYWRhcHRlciA9PSBudWxsID8gY3JlYXRlQWRhcHRlcihlbWZPYmplY3QpIDogYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZW1mT2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQW5ub3RhdGlvbnNBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQW5ub3RhdGlvbnNBZGFwdGVyKCk7Ci0JCWFkYXB0ZXIuc2V0VGFyZ2V0KGVtZk9iamVjdCk7Ci0JCWVtZk9iamVjdC5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBBbm5vdGF0aW9uc0FkYXB0ZXIgcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJcmV0dXJuIChBbm5vdGF0aW9uc0FkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoZW1mT2JqZWN0LCBBREFQVEVSX1RZUEUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gQURBUFRFUl9UWVBFLmVxdWFscyh0eXBlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVJlc291cmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiODI3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uc0NvcmVSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImFubm90YXRpb25jb3JlIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFubm90YXRpb25zQ29yZVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnU3BlY18zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ1NwZWNfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdBdHRyaWJTcGVjXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblRhZ1BhcnNlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UYWdQYXJzZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVGFnUmVnaXN0cnlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVGFnUmVnaXN0cnlfOTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEFubm90YXRpb25zQ29yZVJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNQcm92aWRlck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNQcm92aWRlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5OGI2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zUHJvdmlkZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1Byb3ZpZGVyTWFuYWdlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFubm90YXRpb25zUHJvdmlkZXJNYW5hZ2VyIElOU1RBTkNFID0gbmV3IEFubm90YXRpb25zUHJvdmlkZXJNYW5hZ2VyKCk7Ci0JCi0Jc3RhdGljIHsKLQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEZXNjcmlwdG9yIHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUFRfUExVR0lOID0gIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTlNfUFJPVklERVIgPSAiYW5ub3RhdGlvbnNQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXByaXZhdGUgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQ7Ci0KLQkJcHVibGljIERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFDb25maWdFbGVtZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJY29uZmlnRWxlbWVudCA9IGFDb25maWdFbGVtZW50OwotCQl9Ci0KLQkJcHVibGljIElBbm5vdGF0aW9uc1Byb3ZpZGVyIGNyZWF0ZUluc3RhbmNlKCkgewotCQkJSUFubm90YXRpb25zUHJvdmlkZXIgaW5zdGFuY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpbnN0YW5jZSA9IChJQW5ub3RhdGlvbnNQcm92aWRlcikgY29uZmlnRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTTkFNRSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGFubm90YXRpb25zUHJvdmlkZXJzOwotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNQcm92aWRlck1hbmFnZXIoKSB7Ci0JCXN1cGVyKERlc2NyaXB0b3IuRVhURU5TSU9OX1BUX1BMVUdJTiwgRGVzY3JpcHRvci5BTk5PVEFUSU9OU19QUk9WSURFUik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKERlc2NyaXB0b3IuQU5OT1RBVElPTlNfUFJPVklERVIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlhZGRBbm5vdGF0aW9uc1Byb3ZpZGVyKG5ldyBEZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbnNQcm92aWRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJSUFubm90YXRpb25zUHJvdmlkZXIgcHJvdmlkZXIgPSBkZXNjcmlwdG9yLmNyZWF0ZUluc3RhbmNlKCk7Ci0JCWlmIChwcm92aWRlciAhPSBudWxsKQotCQkJZ2V0QW5ub3RhdGlvbnNQcm92aWRlcnMoKS5hZGQocHJvdmlkZXIpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFubm90YXRpb25zUHJvdmlkZXJzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFubm90YXRpb25zUHJvdmlkZXJzKCkgewotCQlpZiAoYW5ub3RhdGlvbnNQcm92aWRlcnMgPT0gbnVsbCkKLQkJCWFubm90YXRpb25zUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gYW5ub3RhdGlvbnNQcm92aWRlcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExMGFkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwcml2YXRlIEFubm90YXRlZENvbW1lbnRIYW5kbGVyIGhhbmRsZXI7Ci0KLQlwcml2YXRlIEFubm90YXRpb25UYWdQYXJzZXIgcGFyc2VyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uc1RyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgQW5ub3RhdGlvbnNUcmFuc2xhdG9yKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNUcmFuc2xhdG9yKCkgewotCQlzdXBlcigiI2NvbW1lbnQiLCBBbm5vdGF0aW9uc0FkYXB0ZXIuTk9USUZJQ0FUSU9OX0ZFQVRVUkUsIFRyYW5zbGF0b3IuQ09NTUVOVF9GRUFUVVJFKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBBbm5vdGF0aW9uc0FkYXB0ZXIuTk9USUZJQ0FUSU9OX0ZFQVRVUkUsIFRyYW5zbGF0b3IuQ09NTUVOVF9GRUFUVVJFKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBBbm5vdGF0aW9uc0FkYXB0ZXIuTk9USUZJQ0FUSU9OX0ZFQVRVUkUsIHN0eWxlIHwgVHJhbnNsYXRvci5DT01NRU5UX0ZFQVRVUkUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53dHAuZW1mLnhtbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRIYW5kbGVyKCkuZ2V0QW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQlnZXRQYXJzZXIoKS5zZXRQYXJzZXJJbnB1dCh2YWx1ZS50b1N0cmluZygpKTsKLQkJZ2V0UGFyc2VyKCkucGFyc2UoKTsKLQkJU3RyaW5nIG5hbWU7Ci0JCU1hcCBhbm5vdGF0aW9ucyA9IGdldEhhbmRsZXIoKS5nZXRBbm5vdGF0aW9ucygpOwotCQlmb3IgKEl0ZXJhdG9yIGtleXMgPSBhbm5vdGF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOyBrZXlzLmhhc05leHQoKTspIHsKLQkJCW5hbWUgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLQkJCUFubm90YXRpb25zQWRhcHRlci5hZGRBbm5vdGF0aW9ucyhlbWZPYmplY3QsIG5hbWUsIGFubm90YXRpb25zLmdldChuYW1lKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gZ2V0TU9GVmFsdWUoZW1mT2JqZWN0KSAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gQW5ub3RhdGlvbnNBZGFwdGVyLmdldEFubm90YXRpb25zKGVtZk9iamVjdCwgQW5ub3RhdGlvbnNBZGFwdGVyLkdFTkVSQVRFRCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciN1blNldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHVuU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyLnJlbW92ZUFubm90YXRpb25zKGVtZk9iamVjdCwgQW5ub3RhdGlvbnNBZGFwdGVyLkdFTkVSQVRFRCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNmZWF0dXJlRXhpc3RzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGZlYXR1cmVFeGlzdHMoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc0RhdGFUeXBlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RhdGFUeXBlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzTWFwRm9yKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFwRm9yKE9iamVjdCBhRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIChhRmVhdHVyZSA9PSBmZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXIuCi0JICovCi0JcHJvdGVjdGVkIEFubm90YXRlZENvbW1lbnRIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQloYW5kbGVyID0gbmV3IEFubm90YXRlZENvbW1lbnRIYW5kbGVyKCk7Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyc2VyLgotCSAqLwotCXByb3RlY3RlZCBBbm5vdGF0aW9uVGFnUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKQotCQkJcGFyc2VyID0gbmV3IEFubm90YXRpb25UYWdQYXJzZXIoZ2V0SGFuZGxlcigpKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9JQW5ub3RhdGlvbnNQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9JQW5ub3RhdGlvbnNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDFmM2IxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvSUFubm90YXRpb25zUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGNsaWVudHMgdG8gYWxsb3cgdGhlaXIgb3duIGFubm90YXRpb24gcHJvdmlkZXIgdG8gZGV0YWlsIGluZm9ybWF0aW9uCi0gKiBvbiB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIEVPYmplY3QgaXMgYW5ub3RhdGVkIGZvciBvbmUgb2YgdGhlaXIgdGFnIHNldHMuCi0gKiAKLSAqIEBhdXRob3IgamxhbnV0aQotICogQHBsYW5uZWQgZm9yIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uc1Byb3ZpZGVyIHsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHBhc3NlZCBFT2JqZWN0IGlzIGFubm90YXRlZCBieSB5b3VyIGFubm90YXRpb24gcHJvdmlkZXIKLQkgKiAKLQkgKiBAcGxhbm5lZCBmb3IgMi4wCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUgb2YgaXNBbm5vdGF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRlZChFT2JqZWN0IGVPYmplY3QpOwotCi0JLyoqCi0JICogVGhlIHBhc3NlZCBlT2JqZWN0IG1heSBoYXZlIGJlZW4gYW5ub3RlZC4gIElmIHRydWUsIGl0IGlzIGRlc2lyZWQgdG8KLQkgKiBkZXRlcm1pbmUgd2hpY2gge0BsaW5rIElDb21waWxhdGlvblVuaXR9IGhhcyB0aGUgdGFnIG9yIHRhZ3MgdGhhdCBjcmVhdGVkCi0JICogdGhpcyBvYmplY3QuCi0JICogCi0JICogQHBsYW5uZWQgZm9yIDIuMAotCSAqIEBwYXJhbSBlT2JqZWN0IC0gQW4ge0BsaW5rIEVPYmplY3R9IHRoYXQgbWF5IGJlIGFubm90YXRlZC4KLQkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdH0gdGhhdCBoYXMgdGhlIHRhZyB0aGF0IGNyZWF0ZWQgdGhpcyBlT2JqZWN0LgotCSAqIAotCSAqIEBzZWUgI2dldFByaW1hcnlUYWdzZXQoRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRQcmltYXJ5QW5ub3RhdGVkQ29tcGlsYXRpb25Vbml0KEVPYmplY3QgZU9iamVjdCk7Ci0KLQkvKioKLQkgKiBJdCBpcyBkZXNpcmVkIHRvIG9idGFpbiB0aGUgdGFnc2V0IG5hbWUgd2hpY2ggaXMgdXNlZCB0byBjcmVhdGUgdGhlIHBhc3NlZAotCSAqIGVPYmplY3QuCi0JICogCi0JICogQHBsYW5uZWQgZm9yIDIuMAotCSAqIEBwYXJhbSBlT2JqZWN0IEFuIHtAbGluayBFT2JqZWN0fSB3aGljaCBtYXkgYmUgYW5ub3RhdGVkLgotCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHRhZ3NldCB3aGljaCBjcmVhdGVzIHRoZSBwYXNzZWQgZU9iamVjdC4KLQkgKiAKLQkgKiBAc2VlICNnZXRQcmltYXJ5QW5ub3RhdGVkQ29tcGlsYXRpb25Vbml0KEVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5VGFnc2V0KEVPYmplY3QgZU9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1RhZ1BhcnNlRXZlbnRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1RhZ1BhcnNlRXZlbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Nzk0MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9UYWdQYXJzZUV2ZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMTEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLQotLyoqCi0gKiBQYXJzZXIgYW5kIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHdhbnQgdG8gcmVjZWl2ZSBwYXJzaW5nIGV2ZW50cy4gV2hlbiBwYXJzaW5nIGlzIHN0YXJ0ZWQKLSAqIHRocm91Z2ggdGhlIDxjb2RlPnBhcnNlKCk8L2NvZGU+IG1ldGhvZCwgZXZlbnQgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBpbnRlcmVzdGluZyBmZWF0dXJlcyBpbgotICogdGhlIHBhcnNlLiAoIGxpa2UgYSBTQVggQ29udGVudEhhbmRsZXIgKQotICogCi0gKiBAYXV0aG9yIFBhdCBLZWxsZXkKLSAqLwotcHVibGljIGludGVyZmFjZSBUYWdQYXJzZUV2ZW50SGFuZGxlciB7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgYW5ub3RhdGlvbiB0YWcgaXMgZW5jb3VudGVyZWQuIFRoaXMgd2lsbCBhbHdheXMgYmUgdGhlIGZpcnN0IHBpZWNlIG9mIGNvbnRlbnQKLQkgKiBlbmNvdW50ZXJlZC4gRm9sbG93ZWQgYnkgYSBlbmRPZlRhZyggKSBjYWxsIHdoZW4gdGhlIGVuZCBvZiB0aGUgdGFnIGlzIHJlYWNoZWQuCi0JICovCi0JcHVibGljIHZvaWQgYW5ub3RhdGlvblRhZyhUb2tlbiB0YWcpOwotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIGVudGlyZSBhbm5vdGF0aW9uIGZvciBhIHNpbmdsZSB0YWcgaGFzIGJlZW4gcGFyc2VkLgotCSAqIAotCSAqIEBwYXJhbSBwb3MKLQkgKiAgICAgICAgICAgIFBvc2l0aW9uIGluIHRoZSBzdHJlYW0gb2YgdGhlIGVuZCBvZiB0aGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRPZlRhZyhpbnQgcG9zKTsKLQotCS8qKgotCSAqIENhbGxlZCBmb3IgZXZlcnkgYXR0cmlidXRlIHNldHRpbmcgZW5jb3VudGVyZWQgZm9yIGFuIGFubm90YXRpb24gdGFnLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGVxdWFsc1Bvc2l0aW9uCi0JICogICAgICAgICAgICBTb3VyY2UgcG9zaXRpb24gb2YgdGhlIGVxdWFscyBzaWduLCBvciAtMSBpZiBubyBlcXVhbHMgc2lnbiB3YXMgZm91bmQuCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlLCB3aXRoIGFueSBxdW90ZXMgc3RyaXBwZWQgb2ZmLiBXaWxsIGJlIHplcm8gbGVuZ3RoIHRva2VuIGlmCi0JICogICAgICAgICAgICBubyBhdHRyaWJ1dGUgd2FzIGZvdW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGF0dHJpYnV0ZShUb2tlbiBuYW1lLCBpbnQgZXF1YWxzUG9zaXRpb24sIFRva2VuIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1Rva2VuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMDMxMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDExLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi0vKioKLSAqIEEgc3RyaW5nLCBhbmQgdGhlIHJhbmdlIGl0IHdhcyB0YWtlbiBmcm9tIGluIHRoZSBzb3VyY2UgZmlsZS4gVGhlIHJhbmdlIGlzIGluY2x1c2l2ZS4gKGllLCB3aXRoCi0gKiBzb3VyY2UgIkFCQ0QiLCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgZm9yIHRoZSBUb2tlbiAiQkMiIHdvdWxkIGJlICgxLDIpICkKLSAqIAotICogQGF1dGhvciBQYXQgS2VsbGV5Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2tlbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQlwcml2YXRlIGludCBiZWdpbm5pbmc7Ci0JcHJpdmF0ZSBpbnQgZW5kOwotCi0KLQotCS8qKgotCSAqIEByZXR1cm4gUG9zaXRpb24gaW4gb3JpZ2luYWwgc291cmNlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhpcyB0b2tlbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEJlZ2lubmluZygpIHsKLQkJcmV0dXJuIGJlZ2lubmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFBvc2l0aW9uIGluIHRoZSBvcmlnaW5hbCBzb3VyY2Ugb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoaXMgdG9rZW4uCi0JICovCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUaGUgdG9rZW4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIEEgc291cmNlIHBvc2l0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmVnaW5uaW5nKGludCBpKSB7Ci0JCWJlZ2lubmluZyA9IGk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIEEgc291cmNlIHBvc2l0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZChpbnQgaSkgewotCQllbmQgPSBpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBzdHJpbmcpIHsKLQkJdGV4dCA9IHN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGxlbmd0aCgpIHsKLQkJcmV0dXJuIHRleHQubGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciA8Y29kZT5zcmNQb3M8L2NvZGU+IGNvbWVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGlzIHRva2VuLgotCSAqIAotCSAqIEBwYXJhbSBzcmNQb3MKLQkgKiAgICAgICAgICAgIEEgcG9zaXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGUgdG9rZW4gY2FtZSBmcm9tLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzcmNQb3MgY29tZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyB0b2tlbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbW1lZGlhdGVseVByZWNlZGVzKGludCBzcmNQb3MpIHsKLQkJcmV0dXJuIGVuZCArIDEgPT0gc3JjUG9zOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgc3JjUG9zIGlzIHdpdGhpbiB0aGUgb3JpZ2luYWwgc291cmNlIHJhbmdlIHJhbmdlIG9mIHRoZSB0b2tlbi4KLQkgKiAKLQkgKiBAcGFyYW0gc3JjUG9zCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBzcmNQb3MpIHsKLQkJcmV0dXJuIHNyY1BvcyA+PSBiZWdpbm5pbmcgJiYgc3JjUG9zIDw9IGVuZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmMxYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQyOWMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotamR0X2ludGVncmF0aW9uLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjMGJjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTgzNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDQgMjM6MjQ6NTIgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjYzZTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrczsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwMy5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5WZW5kb3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGg7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLkNvbW1vbkZyYW1ld29ya3NQbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVkZjM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmM5NzlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIgotCW5hbWU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcyI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIiCi0JCWZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUiCi0JCWZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGFkMDNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1JbnRlZ3JhdGlvbiBQbHVnLWluCi1wbHVnaW5WZW5kb3I9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlZWFmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImNvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLndvcmtpbmdDb3B5TWFuYWdlciIKLSAgICAgICAgIG5hbWU9IldvcmtpbmcgQ29weSBNYW5hZ2VyIC0gSGVhZGxlc3MgQ29udGV4dCBDbGFzcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGtleT0id29ya2luZ0NvcHlNYW5hZ2VyIgotICAgICAgICAgICAgY29udGV4dD0iSGVhZGxlc3MiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uLldUUFdvcmtpbmdDb3B5TWFuYWdlciI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgaWQ9ImphdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIiCi0gICAgICAgIG5hbWU9ImphdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIiCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciI+Ci0gICAgICA8dmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIKLSAgICAgICAgaWQ9ImphdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIiCi0gICAgICAgIGhhbmRsZXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uSmF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlciIKLSAgICAgICAgc2VsZWN0aW9uVHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWwiPgotICAgICAgPGVkaXRNb2RlbAotICAgICAgICAgICAgZWRpdE1vZGVsSUQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5KYXZhQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5Ij4KLSAgICAgIDwvZWRpdE1vZGVsPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICA8ZmFjdG9yeSAKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuaW50ZXJuYWwuSmF2YUZhY2V0SW5zdGFsbENvbmZpZ1RvRGF0YU1vZGVsQWRhcHRlciIgCi0gICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXRJbnN0YWxsQ29uZmlnIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbCIvPgotICAgIDwvZmFjdG9yeT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICA8ZmFjdG9yeSAKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuaW50ZXJuYWwuRGF0YU1vZGVsVG9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnQWRhcHRlciIgCi0gICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwiPgotICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZyIvPgotICAgIDwvZmFjdG9yeT4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vZnJhbWV3b3Jrcy9Db21tb25GcmFtZXdvcmtzUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9mcmFtZXdvcmtzL0NvbW1vbkZyYW1ld29ya3NQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjOGRhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9mcmFtZXdvcmtzL0NvbW1vbkZyYW1ld29ya3NQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tb25GcmFtZXdvcmtzUGx1Z2luIAotCi0gICAgZXh0ZW5kcyBXVFBQbHVnaW4KLQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TT1VSQ0VfRk9MREVSID0gImRlZmF1bHRTb3VyY2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0ZPTERFUiA9ICJvdXRwdXRGb2xkZXIiOyAvLyROT04tTkxTLTEkCi0gICAKLSAgICBwcml2YXRlIHN0YXRpYyBDb21tb25GcmFtZXdvcmtzUGx1Z2luIGluc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHBsdWdpbiBzaW5nbGV0b24uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBDb21tb25GcmFtZXdvcmtzUGx1Z2luIGdldERlZmF1bHQoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbigpIHsKLSAgICAJc3VwZXIoKTsKLQkJaWYgKGluc3QgPT0gbnVsbCkKLQkJCWluc3QgPSB0aGlzOwotCX0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgCi0gICAgewotICAgICAgICByZXR1cm4gUExVR0lOX0lEOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBFeGNlcHRpb24gZSApCi0gICAgewotICAgICAgICBmaW5hbCBJTG9nIGxvZyA9IENvbW1vbkZyYW1ld29ya3NQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIkVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGxvZy5sb2coIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBlICkgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aERlY29yYXRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aERlY29yYXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNGNiNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhEZWNvcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NwYXRoRGVjb3JhdGlvbnMKLXsKLSAgICBwcml2YXRlIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoOwotICAgIHByaXZhdGUgSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IGV4dHJhQXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBwdWJsaWMgSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlQXR0YWNobWVudFBhdGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCBmaW5hbCBJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aCApCi0gICAgewotICAgICAgICB0aGlzLnNvdXJjZUF0dGFjaG1lbnRQYXRoID0gc291cmNlQXR0YWNobWVudFBhdGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUGF0aCBnZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlQXR0YWNobWVudFJvb3RQYXRoOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoIGZpbmFsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCApCi0gICAgewotICAgICAgICB0aGlzLnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCA9IHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBnZXRFeHRyYUF0dHJpYnV0ZXMoKQotICAgIHsKLSAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGFycmF5IAotICAgICAgICAgICAgPSBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVsgdGhpcy5leHRyYUF0dHJpYnV0ZXMuc2l6ZSgpIF07Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gKElDbGFzc3BhdGhBdHRyaWJ1dGVbXSkgdGhpcy5leHRyYUF0dHJpYnV0ZXMudG9BcnJheSggYXJyYXkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmFBdHRyaWJ1dGVzKCBmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlW10gYXR0cnMgKQotICAgIHsKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXh0cmFBdHRyaWJ1dGVzLmFkZCggYXR0cnNbIGkgXSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRXh0cmFBdHRyaWJ1dGUoIGZpbmFsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSApCi0gICAgewotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHIKLSAgICAgICAgICAgID0gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKCBuYW1lLCB2YWx1ZSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5leHRyYUF0dHJpYnV0ZXMuYWRkKCBhdHRyICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YTM5OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLkNvbW1vbkZyYW1ld29ya3NQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIKLXsKLQlwcml2YXRlIGZpbmFsIEZpbGUgZjsKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXAgZGVjb3JhdGlvbnM7Ci0gICAgCi0gICAgcHVibGljIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciggZmluYWwgU3RyaW5nIHBsdWdpbiApCi0gICAgewotICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBmaW5hbCBGaWxlIHdzZGlyID0gd3MuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0gICAgICAgIGZpbmFsIEZpbGUgd3NtZHJvb3QgPSBuZXcgRmlsZSggd3NkaXIsICIubWV0YWRhdGEvLnBsdWdpbnMiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmluYWwgRmlsZSBwbWRyb290ID0gbmV3IEZpbGUoIHdzbWRyb290LCBwbHVnaW4gKTsKLSAgICAKLSAgICAgICAgdGhpcy5mID0gbmV3IEZpbGUoIHBtZHJvb3QsICJjbGFzc3BhdGguZGVjb3JhdGlvbnMueG1sIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSByZWFkKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDbGFzc3BhdGhEZWNvcmF0aW9ucyBnZXREZWNvcmF0aW9ucyggZmluYWwgU3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRyeSApCi0gICAgewotICAgICAgICBmaW5hbCBIYXNoTWFwIHN1Ym1hcCA9IChIYXNoTWFwKSB0aGlzLmRlY29yYXRpb25zLmdldCgga2V5ICk7Ci0gICAgICAgIAotICAgICAgICBpZiggc3VibWFwID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIChDbGFzc3BhdGhEZWNvcmF0aW9ucykgc3VibWFwLmdldCggZW50cnkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvcmF0aW9ucyggZmluYWwgU3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgKQotICAgIHsKLSAgICAJSGFzaE1hcCBzdWJtYXAgPSAoSGFzaE1hcCkgdGhpcy5kZWNvcmF0aW9ucy5nZXQoIGtleSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHN1Ym1hcCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VibWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMucHV0KCBrZXksIHN1Ym1hcCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzdWJtYXAucHV0KCBlbnRyeSwgZGVjICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsZWFyQWxsRGVjb3JhdGlvbnMoIGZpbmFsIFN0cmluZyBrZXkgKQotICAgIHsKLSAgICAJdGhpcy5kZWNvcmF0aW9ucy5yZW1vdmUoIGtleSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoKQotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSBmb2xkZXIgPSB0aGlzLmYuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAKLSAgICAgICAgaWYoICEgZm9sZGVyLmV4aXN0cygpICYmICEgZm9sZGVyLm1rZGlycygpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBQcmludFdyaXRlciB3ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB3ID0gbmV3IFByaW50V3JpdGVyKCBuZXcgQnVmZmVyZWRXcml0ZXIoIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG5ldyBGaWxlT3V0cHV0U3RyZWFtKCB0aGlzLmYgKSwgIlVURi04IiApICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAKLSAgICAgICAgICAgIHcucHJpbnRsbiggIjxjbGFzc3BhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSXRlcmF0b3IgaXRyMSA9IGRlY29yYXRpb25zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgCi0gICAgICAgICAgICAgICAgIGl0cjEuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5IGVudHJ5MSA9IChNYXAuRW50cnkpIGl0cjEubmV4dCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcCBzdWJtYXAgPSAoTWFwKSBlbnRyeTEuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3LnByaW50KCAiICA8Y29udGFpbmVyIGlkPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdy5wcmludCggKFN0cmluZykgZW50cnkxLmdldEtleSgpICk7Ci0gICAgICAgICAgICAgICAgdy5wcmludGxuKCAiXCI+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIyID0gc3VibWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgCi0gICAgICAgICAgICAgICAgICAgICBpdHIyLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5IGVudHJ5MiA9IChNYXAuRW50cnkpIGl0cjIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NwYXRoRGVjb3JhdGlvbnMgZGVjIAotICAgICAgICAgICAgICAgICAgICAgICAgPSAoQ2xhc3NwYXRoRGVjb3JhdGlvbnMpIGVudHJ5Mi5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdy5wcmludCggIiAgICA8ZW50cnkgaWQ9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgdy5wcmludCggKFN0cmluZykgZW50cnkyLmdldEtleSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHcucHJpbnRsbiggIlwiPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGRlYy5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCAiICAgICAgPHNvdXJjZS1hdHRhY2htZW50LXBhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCBkZWMuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50bG4oICI8L3NvdXJjZS1hdHRhY2htZW50LXBhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCAiICAgICAgPHNvdXJjZS1hdHRhY2htZW50LXJvb3QtcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoIGRlYy5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50bG4oICI8L3NvdXJjZS1hdHRhY2htZW50LXJvb3QtcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBkZWMuZ2V0RXh0cmFBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyID0gYXR0cnNbIGkgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggIiAgICAgIDxhdHRyaWJ1dGUgbmFtZT1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggYXR0ci5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoICJcIj4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoIGF0dHIuZ2V0VmFsdWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludGxuKCAiPC9hdHRyaWJ1dGU+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHcucHJpbnRsbiggIiAgICA8L2VudHJ5PiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3LnByaW50bG4oICIgIDwvY29udGFpbmVyPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3LnByaW50bG4oICI8L2NsYXNzcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB3LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBIYXNoTWFwIHJlYWQoKQotICAgIHsKLSAgICAgICAgZmluYWwgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBpZiggISB0aGlzLmYuZXhpc3RzKCkgKSByZXR1cm4gbWFwOwotCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKLSAgICAgICAgRWxlbWVudCByb290ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5IAotICAgICAgICAgICAgICAgID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgZG9jYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlciggbmV3IEZpbGVJbnB1dFN0cmVhbSggZi5nZXRQYXRoKCkpLCJVVEYtOCIpKTsKLSAgICAgICAgICAgIHJvb3QgPSBkb2NidWlsZGVyLnBhcnNlKCBuZXcgSW5wdXRTb3VyY2UoaW4pKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21tb25GcmFtZXdvcmtzUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgcmV0dXJuIG1hcDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBpbiAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBlICkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIxID0gZWxlbWVudHMoIHJvb3QsICJjb250YWluZXIiICk7IGl0cjEuaGFzTmV4dCgpOyApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRWxlbWVudCBlMSA9IChFbGVtZW50KSBpdHIxLm5leHQoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaWQgPSBlMS5nZXRBdHRyaWJ1dGUoICJpZCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBIYXNoTWFwIHN1Ym1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBtYXAucHV0KCBjaWQsIHN1Ym1hcCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0cjIgPSBlbGVtZW50cyggZTEsICJlbnRyeSIgKTsgaXRyMi5oYXNOZXh0KCk7ICkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgZTIgPSAoRWxlbWVudCkgaXRyMi5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVpZCA9IGUyLmdldEF0dHJpYnV0ZSggImlkIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NwYXRoRGVjb3JhdGlvbnMgZGVjID0gbmV3IENsYXNzcGF0aERlY29yYXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3VibWFwLnB1dCggZWlkLCBkZWMgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0cjMgPSBlbGVtZW50cyggZTIgKTsgaXRyMy5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgZTMgPSAoRWxlbWVudCkgaXRyMy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuID0gZTMuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBuLmVxdWFscyggInNvdXJjZS1hdHRhY2htZW50LXBhdGgiICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYy5zZXRTb3VyY2VBdHRhY2htZW50UGF0aCggbmV3IFBhdGgoIHRleHQoIGUzICkgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIG4uZXF1YWxzKCAic291cmNlLWF0dGFjaG1lbnQtcm9vdC1wYXRoIiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWMuc2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCBuZXcgUGF0aCggdGV4dCggZTMgKSApICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggbi5lcXVhbHMoICJhdHRyaWJ1dGUiICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZTMuZ2V0QXR0cmlidXRlKCAibmFtZSIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjLmFkZEV4dHJhQXR0cmlidXRlKCBuYW1lLCB0ZXh0KCBlMyApICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXh0KCBmaW5hbCBFbGVtZW50IGVsICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIE5vZGVMaXN0IG5vZGVzID0gZWwuZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgICAgIFN0cmluZyBzdHIgPSBudWxsOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gbm9kZXMuZ2V0TGVuZ3RoKCk7IGkgPCBuOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKCBpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWwgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBidWYgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCB2YWwgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggc3RyICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBzdHIgKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggdmFsICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzdHIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHIgPSB2YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggYnVmICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3IgZWxlbWVudHMoIGZpbmFsIEVsZW1lbnQgZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50c0l0ZXJhdG9yKCBlbCwgbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJdGVyYXRvciBlbGVtZW50cyggZmluYWwgRWxlbWVudCBlbCApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRzSXRlcmF0b3IoIGVsLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRWxlbWVudHNJdGVyYXRvcgotICAgIAotICAgICAgICBpbXBsZW1lbnRzIEl0ZXJhdG9yCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBOb2RlTGlzdCBub2RlczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgICAgICBwcml2YXRlIGludCBwb3NpdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICAgICAgcHVibGljIEVsZW1lbnRzSXRlcmF0b3IoIGZpbmFsIEVsZW1lbnQgcGFyZW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ub2RlcyA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG5vZGVzLmdldExlbmd0aCgpOwotICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IC0xOwotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLQotICAgICAgICAgICAgYWR2YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkdmFuY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgdGhpcy5wb3NpdGlvbisrOwotCi0gICAgICAgICAgICBmb3IoIDsgdGhpcy5wb3NpdGlvbiA8IHRoaXMubGVuZ3RoICYmIHRoaXMuZWxlbWVudCA9PSBudWxsOyAKLSAgICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBOb2RlIG5vZGUgPSB0aGlzLm5vZGVzLml0ZW0oIHRoaXMucG9zaXRpb24gKTsKLQotICAgICAgICAgICAgICAgIGlmKCBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYKLSAgICAgICAgICAgICAgICAgICAgKCB0aGlzLm5hbWUgPT0gbnVsbCB8fCAKLSAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCB0aGlzLm5hbWUgKSApICkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoIHRoaXMuZWxlbWVudCAhPSBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSAKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRWxlbWVudCBlbCA9IHRoaXMuZWxlbWVudDsKLQotICAgICAgICAgICAgaWYoIGVsID09IG51bGwgKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZHZhbmNlKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBlbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIAotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTYxZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NwYXRoVXRpbAotewotICAgIHByaXZhdGUgQ2xhc3NwYXRoVXRpbCgpIHt9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQgZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggZW50cnlUb0lnbm9yZSApCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoIGpwcm9qLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGVudHJ5VG9JZ25vcmUgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldCBnZXRSZXNvbHZlZENsYXNzcGF0aCggZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQgZW50cmllc1RvSWdub3JlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldCByZXNvbHZlZCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIAotICAgICAgICB0cnkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzWyBpIF07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGVudHJpZXNUb0lnbm9yZS5jb250YWlucyggZW50cnkuZ2V0UGF0aCgpICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN3aXRjaCggZW50cnkuZ2V0RW50cnlLaW5kKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZC5hZGQoIGVudHJ5LmdldFBhdGgoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoIGVudHJ5ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlbnRyeSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZC5hZGQoIGVudHJ5LmdldFBhdGgoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKCBlbnRyeS5nZXRQYXRoKCksIGpwcm9qICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCggSmF2YU1vZGVsRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvciggZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY29udGFpbmVyICE9IG51bGwgKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjb250YWluZXJFbnRyaWVzCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKTsKLQkKLQkgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IGNvbnRhaW5lckVudHJpZXMubGVuZ3RoOyBqKysgKQotCSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQuYWRkKCBjb250YWluZXJFbnRyaWVzWyBqIF0uZ2V0UGF0aCgpICk7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgICAgICBjYXRjaCggSmF2YU1vZGVsRXhjZXB0aW9uIGUgKSAKLSAgICAgICAgewotICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXNvbHZlZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvRmxleGlibGVQcm9qZWN0Q29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWVmMDliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvRmxleGlibGVQcm9qZWN0Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBY2Nlc3NSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MuQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGbGV4aWJsZVByb2plY3RDb250YWluZXIKLQotICAgIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lcgotCi17Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXRoVHlwZQotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoVHlwZSAKLSAgICAgICAgICAgIExJQl9ESVJFQ1RPUlkgPSBuZXcgUGF0aFR5cGUoKSwKLSAgICAgICAgICAgIENMQVNTRVNfRElSRUNUT1JZID0gbmV3IFBhdGhUeXBlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciBkZWNvcmF0aW9uczsgCi0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSByZXNvdXJjZSBsaXN0ZW5lciB0aGF0IHdpbGwgbGlzdGVuIGZvciBjaGFuZ2VzIHRvCi0gICAgICAgIC8vIHJlc291cmNlcyByZWxldmFudCB0byBmbGV4aWJsZSBwcm9qZWN0IGNvbnRhaW5lcnMgYWNyb3NzIHRoZQotICAgICAgICAvLyB3b3Jrc3BhY2UgYW5kIHJlZnJlc2ggdGhlbSBhcyBuZWNlc3NhcnkuCi0gICAgICAgIAotICAgICAgICBMaXN0ZW5lci5yZWdpc3RlcigpOwotICAgICAgICAKLSAgICAgICAgLy8gUmVhZCB0aGUgZGVjb3JhdGlvbnMgZnJvbSB0aGUgd29ya3NwYWNlIG1ldGFkYXRhLgotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbiA9IENvbW1vbkZyYW1ld29ya3NQbHVnaW4uUExVR0lOX0lEOwotICAgICAgICBkZWNvcmF0aW9ucyA9IG5ldyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIoIHBsdWdpbiApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiISI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWNvcmF0aW9uTWFuYWdlcktleShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29udGFpbmVyKXsKLSAgICAJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpICsgU0VQQVJBVE9SICsgY29udGFpbmVyOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgSVBhdGggcGF0aDsKLSAgICBwcm90ZWN0ZWQgZmluYWwgSUphdmFQcm9qZWN0IG93bmVyOwotICAgIHByb3RlY3RlZCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgZmluYWwgSVBhdGhbXSBwYXRoczsKLSAgICBwcml2YXRlIGZpbmFsIFBhdGhUeXBlW10gcGF0aFR5cGVzOwotICAgIHByaXZhdGUgZmluYWwgTGlzdCBlbnRyaWVzOwotICAgIHByaXZhdGUgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY3BlbnRyaWVzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldCBjb250YWluZXJUeXBlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgCi0gICAgcHVibGljIEZsZXhpYmxlUHJvamVjdENvbnRhaW5lciggZmluYWwgSVBhdGggcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3Qgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aFtdIHBhdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhdGhUeXBlW10gdHlwZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOwotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICB0aGlzLnBhdGhzID0gcGF0aHM7Ci0gICAgICAgIHRoaXMucGF0aFR5cGVzID0gdHlwZXM7Ci0gICAgICAgIAotICAgICAgICBpZiggISBpc0ZsZXhpYmxlUHJvamVjdCggdGhpcy5wcm9qZWN0ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTaWxlbnRseSBub29wIGlmIHRoZSByZWZlcmVuY2VkIHByb2plY3QgaXMgbm90IGEgZmxleGlibGUKLSAgICAgICAgICAgIC8vIHByb2plY3QuIFNob3VsZCBJIGJlIGRvaW5nIHNvbWV0aGluZyBlbHNlIGhlcmU/Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuZW50cmllcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgICAgICB0aGlzLmNwZW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbIDAgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhZGRGbGV4aWJsZVByb2plY3RDb250YWluZXJUeXBlKCBwYXRoLnNlZ21lbnQoIDAgKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5lbnRyaWVzID0gY29tcHV0ZUNsYXNzcGF0aEVudHJpZXMoKTsKLSAgICAgICAgdGhpcy5jcGVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5WyB0aGlzLmVudHJpZXMuc2l6ZSgpIF07Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IHRoaXMuZW50cmllcy5zaXplKCk7IGkgPCBuOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBJUGF0aCBlbnRyeVBhdGggPSAoSVBhdGgpIHRoaXMuZW50cmllcy5nZXQoIGkgKTsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9UmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGVudHJ5UGF0aCk7IAotICAgICAgICAgICAgaWYobnVsbCAhPSByZXNvdXJjZSAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0gICAgICAgICAgICAgICAgdGhpcy5jcGVudHJpZXNbIGkgXSA9IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShlbnRyeVBhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0aGlzLmNwZW50cmllc1sgaSBdID0gbmV3TGlicmFyeUVudHJ5KCBlbnRyeVBhdGggKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEtpbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEtfQVBQTElDQVRJT047Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldFBhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY3BlbnRyaWVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc091dE9mRGF0ZSggZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEgKQotICAgIHsKLSAgICAgICAgaWYoIGRlbHRhID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3QgY3VycmVudEVudHJpZXMgPSBjb21wdXRlQ2xhc3NwYXRoRW50cmllcygpOwotICAgICAgICByZXR1cm4gISB0aGlzLmVudHJpZXMuZXF1YWxzKCBjdXJyZW50RW50cmllcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWZyZXNoKCk7Ci0gICAgCi0gICAgc3RhdGljIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciBnZXREZWNvcmF0aW9uc01hbmFnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlY29yYXRpb25zOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSVZpcnR1YWxSZWZlcmVuY2UgW10gY29tcHV0ZVJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgdmMpewotICAgIAlyZXR1cm4gdmMuZ2V0UmVmZXJlbmNlcygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExpc3QgY29tcHV0ZUNsYXNzcGF0aEVudHJpZXMoKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgdmMgCi0gICAgICAgICAgICA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KCB0aGlzLnByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB2YyA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVudHJpZXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNvbXB1dGVSZWZlcmVuY2VzKHZjKTsKLSAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IG51bGw7Ci0gICAgICAgIFNldCBqYXJzSGFuZGxlZCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFN0cmluZyBqYXJOYW1lID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjb21wID0gcmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICBpZiAoIXJlZnNbaV0uZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMocGF0aHNbMF0ubWFrZUFic29sdXRlKCkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgamFyTmFtZSA9IHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKTsKLSAgICAgICAgICAgIGlmKG51bGwgIT0gamFyTmFtZSl7Ci0gICAgICAgICAgICAgICAgamFyc0hhbmRsZWQuYWRkKGphck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSVBhdGggbmV3UGF0aCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoY29tcC5pc0JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgICAgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgYXJjaGl2ZUNvbXAgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIGNvbXA7Ci0gICAgICAgICAgICAgICAgaWYgKGFyY2hpdmVDb21wLmdldEFyY2hpdmVUeXBlKCkuZXF1YWxzKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkNMQVNTUEFUSEFSQ0hJVkVUWVBFKSkgewotICAgICAgICAgICAgICAgIAkvLyBkbyBub3QgcHJvY2VzcyBjb21wb25lbnRzIGR5bmFtaWNhbGx5IGNvbXB1dGVkIGZyb20gdGhlIEphdmEgY2xhc3NwYXRoCi0gICAgICAgICAgICAgICAgCWNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGlza0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAJbmV3UGF0aCA9bmV3IFBhdGgoZGlza0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIElGaWxlIGlGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRyaWVzLmNvbnRhaW5zKGlGaWxlLmdldEZ1bGxQYXRoKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGggPSBpRmlsZS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gY29tcC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgbmV3UGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgCWlmKCBuZXdQYXRoICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVudHJpZXMuYWRkKCBuZXdQYXRoICk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgdGhpcy5wYXRocy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSB2Yy5nZXRSb290Rm9sZGVyKCk7Ci0gICAgICAgICAgICBmaW5hbCBJVmlydHVhbEZvbGRlciB2ZiA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKCBwYXRoc1sgaSBdICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLnBhdGhUeXBlc1sgaSBdID09IFBhdGhUeXBlLkxJQl9ESVJFQ1RPUlkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElWaXJ0dWFsUmVzb3VyY2VbXSBjb250ZW50czsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gbWVtYmVycyggdmYgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb21tb25GcmFtZXdvcmtzUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IGNvbnRlbnRzLmxlbmd0aDsgaisrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElSZXNvdXJjZSByID0gY29udGVudHNbIGogXS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggcCA9IHIuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCFqYXJzSGFuZGxlZC5jb250YWlucyhwLmxhc3RTZWdtZW50KCkpICYmICBpc0phckZpbGUoIHIgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphcnNIYW5kbGVkLmFkZChwLmxhc3RTZWdtZW50KCkpOyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAJZW50cmllcy5hZGQoIHAgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJQ29udGFpbmVyW10gdWYgPSB2Zi5nZXRVbmRlcmx5aW5nRm9sZGVycygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgdWYubGVuZ3RoOyBqKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggcCA9IHVmWyBqIF0uZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCAhIGphcnNIYW5kbGVkLmNvbnRhaW5zKCBwLmxhc3RTZWdtZW50KCkgKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICEgaXNTb3VyY2VPck91dHB1dERpcmVjdG9yeSggcCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgamFyc0hhbmRsZWQuYWRkKHAubGFzdFNlZ21lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAllbnRyaWVzLmFkZCggcCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVudHJpZXM7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogVGhpcyBtZXRob2Qgd2FzIGNyZWF0ZWQgdG8gcHJvdmlkZSBhIHNhZmUgbGFzdC1taW51dGUgd29ya2Fyb3VuZAotICAgIC8vIGZvciB0aGUgaXNzdWUgZGVzY3JpYmVkIGluIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjI5NzQuCi0gICAgLy8gVGhpcyBjb2RlIG5lZWRzIHRvIGJlIHJldmlzaXRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlIHRvIGZpbmQgYSBtb3JlCi0gICAgLy8gcGVybWFuZW50IHNvbHV0aW9uLgotCi0gICAgcHJvdGVjdGVkIElWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzKCBmaW5hbCBJVmlydHVhbEZvbGRlciB2ZiApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gdmYubWVtYmVycygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElDbGFzc3BhdGhFbnRyeSBuZXdMaWJyYXJ5RW50cnkoIGZpbmFsIElQYXRoIHAgKQotICAgIHsKLSAgICAgICAgSVBhdGggc3JjcGF0aCA9IG51bGw7Ci0gICAgICAgIElQYXRoIHNyY3Jvb3RwYXRoID0gbnVsbDsKLSAgICAgICAgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzID0ge307Ci0gICAgICAgIElBY2Nlc3NSdWxlW10gYWNjZXNzID0ge307Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgCi0gICAgICAgICAgICA9IGRlY29yYXRpb25zLmdldERlY29yYXRpb25zKCBnZXREZWNvcmF0aW9uTWFuYWdlcktleShwcm9qZWN0LCBnZXRQYXRoKCkudG9TdHJpbmcoKSksIHAudG9TdHJpbmcoKSApOwotICAgICAgICAKLSAgICAgICAgaWYoIGRlYyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgc3JjcGF0aCA9IGRlYy5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOwotICAgICAgICAgICAgc3Jjcm9vdHBhdGggPSBkZWMuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCk7Ci0gICAgICAgICAgICBhdHRycyA9IGRlYy5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSggcCwgc3JjcGF0aCwgc3Jjcm9vdHBhdGgsIGFjY2VzcywgYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTb3VyY2VPck91dHB1dERpcmVjdG9yeSggZmluYWwgSVBhdGggYVBhdGggKQotICAgIHsKLSAgICAgICAgaWYoIGlzSmF2YVByb2plY3QoIHRoaXMucHJvamVjdCApICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKCB0aGlzLnByb2plY3QgKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IGpwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGNwWyBpIF07Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggc3JjID0gY3BlLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIG91dHB1dCA9IGNwZS5nZXRPdXRwdXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggc3JjLmVxdWFscyggYVBhdGggKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5lcXVhbHMoIGFQYXRoICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBqcHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpLmVxdWFscyggYVBhdGggKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggSmF2YU1vZGVsRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0phdmFQcm9qZWN0KCBmaW5hbCBJUHJvamVjdCBwaiApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBqLmdldE5hdHVyZSggSmF2YUNvcmUuTkFUVVJFX0lEICkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ZsZXhpYmxlUHJvamVjdCggZmluYWwgSVByb2plY3QgcGogKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwai5nZXROYXR1cmUoIElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCApICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSmFyRmlsZSggZmluYWwgSVJlc291cmNlIGYgKQotICAgIHsKLSAgICAgICAgaWYoIGYuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZuYW1lID0gZi5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmbmFtZS5lbmRzV2l0aCggIi5qYXIiICkgfHwgZm5hbWUuZW5kc1dpdGgoICIuemlwIiApICkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01ldGFkYXRhRmlsZSggZmluYWwgSVJlc291cmNlIGYgKQotICAgIHsKLSAgICAgICAgaWYoIGYuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZuYW1lID0gZi5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmKCBmbmFtZS5lcXVhbHMoICIuY29tcG9uZW50IiApIHx8IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBmbmFtZS5lcXVhbHMoICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCIgKSB8fCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgZm5hbWUuZXF1YWxzKCAiLmNsYXNzcGF0aCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lciggZmluYWwgSVBhdGggcGF0aCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIGNvbnRhaW5lclR5cGVzICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lclR5cGVzLmNvbnRhaW5zKCBwYXRoLnNlZ21lbnQoIDAgKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmxleGlibGVQcm9qZWN0Q29udGFpbmVyVHlwZSggZmluYWwgU3RyaW5nIHR5cGUgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCBjb250YWluZXJUeXBlcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRhaW5lclR5cGVzLmFkZCggdHlwZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIExpc3RlbmVyCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpOwotICAgICAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgIHdzLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoIGxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKCBmaW5hbCBJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNjcmVlbiB0aGUgZGVsdGEgYmVmb3JlIGdvaW5nIGFueSBmdXJ0aGVyLiAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICEgaXNJbnRlcmVzdGluZ0V2ZW50KCBldmVudCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIExvY2F0ZSBhbGwgb2YgdGhlIGZsZXhpYmxlIHByb2plY3QgY29udGFpbmVycy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0IGNvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0W10gcHJvamVjdHMgCi0gICAgICAgICAgICAgICAgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1sgaSBdOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGlzSmF2YVByb2plY3QoIHByb2plY3QgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZSggcHJvamVjdCApOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY3BlcyA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IGNwZXMubGVuZ3RoOyBqKysgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcGUgPSBjcGVzWyBqIF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggcGF0aCA9IGNwZS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNwZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lciggcGF0aCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhDb250YWluZXIgY29udAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoIHBhdGgsIGpwcm9qICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJzLmFkZCggY29udCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSmF2YU1vZGVsRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIGNvbnRhaW5lcnMgdGhhdCBhcmUgb3V0IG9mIGRhdGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDAsIG4gPSBjb250YWluZXJzLnNpemUoKTsgaSA8IG47IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRmxleGlibGVQcm9qZWN0Q29udGFpbmVyIGMgCi0gICAgICAgICAgICAgICAgICAgID0gKEZsZXhpYmxlUHJvamVjdENvbnRhaW5lcikgY29udGFpbmVycy5nZXQoIGkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggYy5pc091dE9mRGF0ZSggZGVsdGEgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW50ZXJlc3RpbmdFdmVudCggZmluYWwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bIDEgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdCggZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEgKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElSZXNvdXJjZSByID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggci5nZXRUeXBlKCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5ST09UOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2UuUFJPSkVDVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdCggKElQcm9qZWN0KSByICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5GT0xERVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsgMCBdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5GSUxFOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpc0phckZpbGUoIHIgKSB8fCBpc01ldGFkYXRhRmlsZSggciApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsgMCBdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBldmVudC5nZXREZWx0YSgpLmFjY2VwdCggdmlzaXRvciwgZmFsc2UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiByZXN1bHRbIDAgXTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lckluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNTQwNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9GbGV4aWJsZVByb2plY3RDb250YWluZXJJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmxleGlibGVQcm9qZWN0Q29udGFpbmVySW5pdGlhbGl6ZXIgCi0KLSAgICBleHRlbmRzIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyCi0KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIgZGVjb3JhdGlvbnMKLSAgICAgICAgPSBGbGV4aWJsZVByb2plY3RDb250YWluZXIuZ2V0RGVjb3JhdGlvbnNNYW5hZ2VyKCk7Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuVXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKCBmaW5hbCBJUGF0aCBjb250YWluZXJQYXRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0KSAKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKCBmaW5hbCBJUGF0aCBjb250YWluZXJQYXRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aENvbnRhaW5lciBzZyApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgCWZpbmFsIFN0cmluZyBrZXkgPSBGbGV4aWJsZVByb2plY3RDb250YWluZXIuZ2V0RGVjb3JhdGlvbk1hbmFnZXJLZXkocHJvamVjdC5nZXRQcm9qZWN0KCksIGNvbnRhaW5lclBhdGgudG9TdHJpbmcoKSk7Ci0gICAgCQotICAgIAlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gc2cuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotICAgICAgICAKLSAgICAgICAgZGVjb3JhdGlvbnMuY2xlYXJBbGxEZWNvcmF0aW9ucygga2V5ICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzWyBpIF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElQYXRoIHNyY3BhdGggPSBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOwotICAgICAgICAgICAgZmluYWwgSVBhdGggc3Jjcm9vdHBhdGggPSBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBhdHRycyA9IGVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggc3JjcGF0aCAhPSBudWxsIHx8IGF0dHJzLmxlbmd0aCA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlaWQgPSBlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgPSBuZXcgQ2xhc3NwYXRoRGVjb3JhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZWMuc2V0U291cmNlQXR0YWNobWVudFBhdGgoIHNyY3BhdGggKTsKLSAgICAgICAgICAgICAgICBkZWMuc2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCBzcmNyb290cGF0aCApOwotICAgICAgICAgICAgICAgIGRlYy5zZXRFeHRyYUF0dHJpYnV0ZXMoIGF0dHJzICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnMuc2V0RGVjb3JhdGlvbnMoIGtleSwgZWlkLCBkZWMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZGVjb3JhdGlvbnMuc2F2ZSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIKLSAgICAgICAgICAgID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKCBjb250YWluZXJQYXRoLCBwcm9qZWN0ICk7Ci0gICAgICAgIAotICAgICAgICAoIChGbGV4aWJsZVByb2plY3RDb250YWluZXIpIGNvbnRhaW5lciApLnJlZnJlc2goKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODcwNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFBcnRpZmFjdEVkaXRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSmF2YUFydGlmYWN0RWRpdE1vZGVsIGV4dGVuZHMgQXJ0aWZhY3RFZGl0TW9kZWwgaW1wbGVtZW50cyBXb3JraW5nQ29weVByb3ZpZGVyIHsKLQotCXByaXZhdGUgV29ya2luZ0NvcHlNYW5hZ2VyIHdvcmtpbmdDb3B5TWFuYWdlciA9IG51bGw7Ci0KLQlwdWJsaWMgSmF2YUFydGlmYWN0RWRpdE1vZGVsKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gdG9NYWtlUmVhZE9ubHksCi0JCQlib29sZWFuIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHksIFVSSSBtb2R1bGVVUkksIFVSSSByb290VVJJLCBTdHJpbmcgcm9vdENvbnRlbnRUeXBlKSB7Ci0JCXN1cGVyKGFuRWRpdE1vZGVsSWQsIGNvbnRleHQsIHRvTWFrZVJlYWRPbmx5LCB0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5LCBtb2R1bGVVUkksIHJvb3RVUkksIHJvb3RDb250ZW50VHlwZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gdG9NYWtlUmVhZE9ubHksIFVSSSBtb2R1bGVVUkksIFVSSSByb290VVJJLAotCQkJU3RyaW5nIHJvb3RDb250ZW50VHlwZSkgewotCQlzdXBlcihlZGl0TW9kZWxJRCwgY29udGV4dCwgdG9NYWtlUmVhZE9ubHksIG1vZHVsZVVSSSwgcm9vdFVSSSwgcm9vdENvbnRlbnRUeXBlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuRWRpdE1vZGVsSWQKLQkgKiBAcGFyYW0gYUNvbnRleHQKLQkgKiBAcGFyYW0gdG9NYWtlUmVhZE9ubHkKLQkgKiBAcGFyYW0gdG9BY2Nlc3NVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seQotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICovCi0JcHVibGljIEphdmFBcnRpZmFjdEVkaXRNb2RlbChTdHJpbmcgYW5FZGl0TW9kZWxJZCwgRU1GV29ya2JlbmNoQ29udGV4dCBhQ29udGV4dCwgYm9vbGVhbiB0b01ha2VSZWFkT25seSwgYm9vbGVhbiB0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5LCBVUkkgYU1vZHVsZVVSSSkgewotCQlzdXBlcihhbkVkaXRNb2RlbElkLCBhQ29udGV4dCwgdG9NYWtlUmVhZE9ubHksCi0JCQkJdG9BY2Nlc3NVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seSwgYU1vZHVsZVVSSSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbkVkaXRNb2RlbElkCi0JICogQHBhcmFtIGFDb250ZXh0Ci0JICogQHBhcmFtIHRvTWFrZVJlYWRPbmx5Ci0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKi8KLQlwdWJsaWMgSmF2YUFydGlmYWN0RWRpdE1vZGVsKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBib29sZWFuIHRvTWFrZVJlYWRPbmx5LCBVUkkgYU1vZHVsZVVSSSkgewotCQlzdXBlcihhbkVkaXRNb2RlbElkLCBhQ29udGV4dCwgdG9NYWtlUmVhZE9ubHksIGFNb2R1bGVVUkkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgZGVsZXRlCi0JICogCi0JICogQGN1IGZyb20gdGhlIHdvcmtiZW5jaCBhbmQgZml4IHRoZSBpbnRlcm5hbCByZWZlcmVuY2VzIGZvciB0aGlzIHdvcmtpbmcgY29weSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IGN1LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFdvcmtpbmdDb3B5TWFuYWdlcigpLmRlbGV0ZShjdSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBKMkVFTmF0dXJlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRGlzcG9zZSgpIHsKLQkJc3VwZXIuZG9EaXNwb3NlKCk7Ci0JCXJlc2V0V29ya2luZ0NvcHlNYW5hZ2VyKCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlqYXZhLnV0aWwuU2V0IGFmZmVjdGVkID0gc3VwZXIuZ2V0QWZmZWN0ZWRGaWxlcygpOwotCQlpZiAoZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWFmZmVjdGVkLmFkZEFsbChnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5nZXRBZmZlY3RlZEZpbGVzKCkpOwotCQotCQlyZXR1cm4gYWZmZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IGVuY29kZWQgaW4gdGhlIGdpdmVuIGVkaXRvcgotCSAqIGlucHV0LiBEb2VzIG5vdCBjb25uZWN0IHRoZSBlZGl0IG1vZGVsIHRvIHRoZSB3b3JraW5nIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgZG9lcwotCSAqICAgICAgICAgbm90IGVuY29kZSBhbiBlZGl0b3IgaW5wdXQsIG9yIGlmIHRoZXJlIGlzIG5vIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzCi0JICogICAgICAgICBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgZ2V0RXhpc3RpbmdXb3JraW5nQ29weShvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdXb3JraW5nQ29weShjdSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdAotCSAqIEByZXR1cm4gdGhlIHdvcmtpbmcgY29weSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBnZXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1LCBib29sZWFuIGZvck5ld0NVKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5nZXRXb3JraW5nQ29weShjdSwgZm9yTmV3Q1UpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIG5ldyBjb21waWxhdGlvbiB1bml0cyBvbmx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNhdmVJZk5lY2Vzc2FyeURpZE5vdFNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFdvcmtpbmdDb3B5TWFuYWdlcigpLnNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndvcmtiZW5jaC5KMkVFRWRpdE1vZGVsI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWJvb2xlYW4gZGlydHlCb29sID0gc3VwZXIuaXNEaXJ0eSgpOwotCQlpZiAoIWRpcnR5Qm9vbCAmJiBnZXRXb3JraW5nQ29weU1hbmFnZXIoKSAhPSBudWxsKQotCQkJZGlydHlCb29sID0gZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuaGFzV29ya2luZ0NvcGllcygpOwotCQlyZXR1cm4gZGlydHlCb29sOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBmb3JjZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgUmVzb3VyY2VzIHRvIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzYXZlQ29tcGlsYXRpb25Vbml0cyhtb25pdG9yKTsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCB8fCAhbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlzdXBlci5wcmltU2F2ZShtb25pdG9yKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcnVuU2F2ZU9wZXJhdGlvbihJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFNhdmVGYWlsZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbnVsbCxJV29ya3NwYWNlLkFWT0lEX1VQREFURSxtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWxlZEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSA0OjE0OjI2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLlNldAotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3NSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmICFnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpKSB7Ci0JCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgUmVmZXJlbmNlZFJlc291cmNlKSB7Ci0JCQkJYWNjZXNzKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0JCQkJLy9XZSBuZWVkIGEgYmV0dGVyIHdheSB0byBwYXNzIHRoaXMgdGhyb3VnaCB0aGUgc2F2ZSBvcHRpb25zIGluc3RlYWQuCi0JCQkJLy9XZSBhbHNvIG5lZWQgdG8gbWFrZSB0aGlzIGR5bmFtaWMgYmFzZWQgb24gdGhlIHByb2plY3QgdGFyZ2V0Ci0JCQkJKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSkuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7Ci0JCQl9IGVsc2UgaWYgKCFpc1JlYWRPbmx5KCkpCi0JCQkJYVJlc291cmNlLnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQkJYWRkUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgZWFjaCBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkKLQkJcmVtb3ZlUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGlzUmVmUmVzID0gYVJlc291cmNlIGluc3RhbmNlb2YgUmVmZXJlbmNlZFJlc291cmNlOwotCQkJaWYgKGlzUmVmUmVzKQotCQkJCXJlbGVhc2UoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKTsKLQkJCWlmICghaXNEaXNwb3NpbmcoKSkKLQkJCQlyZXNldFdvcmtpbmdDb3B5TWFuYWdlcigpOwotCQkJfQotCQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndvcmtiZW5jaC5KMkVFRWRpdE1vZGVsI3Jlc291cmNlSXNMb2FkZWRDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSwKLQkgKiAgICAgIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoUmVzb3VyY2UgYVJlc291cmNlLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWlmICghaXNSZXZlcnRpbmcgJiYgIWRpc3Bvc2luZyAmJiAhaXNSZWFkT25seSgpICYmIG9sZFZhbHVlICYmICFuZXdWYWx1ZSAmJiBhUmVzb3VyY2UgaW5zdGFuY2VvZiBUcmFuc2xhdG9yUmVzb3VyY2UpCi0JCQlyZXNldFdvcmtpbmdDb3B5TWFuYWdlcigpOwotCQlzdXBlci5yZXNvdXJjZUlzTG9hZGVkQ2hhbmdlZChhUmVzb3VyY2UsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmV2ZXJ0ZWQoUmVmZXJlbmNlZFJlc291cmNlIHJldmVydGVkUmVzb3VyY2UpIHsKLQkJaWYgKGdldFdvcmtpbmdDb3B5TWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5yZXZlcnQoKTsKLQkJcmV2ZXJ0QWxsUmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSByZWZlcmVuY2VkIENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUNvbXBpbGF0aW9uVW5pdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFdvcmtpbmdDb3B5TWFuYWdlcigpLnNhdmVDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBXb3JraW5nQ29weU1hbmFnZXIgZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkgewotCQlpZiAod29ya2luZ0NvcHlNYW5hZ2VyID09IG51bGwpCi0JCQl3b3JraW5nQ29weU1hbmFnZXIgPSBXb3JraW5nQ29weU1hbmFnZXJGYWN0b3J5Lm5ld1JlZ2lzdGVyZWRJbnN0YW5jZSgpOwotCQlyZXR1cm4gd29ya2luZ0NvcHlNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJlc2V0IHRoZSB3b3JraW5nIGNvcHkgbWFuYWdlciBiZWNhdXNlIHRoZSBlamItamFyLnhtbCB3YXMgcmVtb3ZlZCB3aXRob3V0IGRpc3Bvc2luZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldFdvcmtpbmdDb3B5TWFuYWdlcigpIHsKLQkJaWYgKHdvcmtpbmdDb3B5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQl3b3JraW5nQ29weU1hbmFnZXIuZGlzcG9zZSgpOwotCQkJd29ya2luZ0NvcHlNYW5hZ2VyID0gbnVsbDsKLQkJfQotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NWE1MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5IGV4dGVuZHMgRWRpdE1vZGVsRmFjdG9yeSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0VESVRfTU9ERUxfSUQgPSAib3JnLmVjbGlwc2UuanN0Lm1vZHVsZWNvcmUuZWRpdE1vZGVsIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX01PRFVMRV9VUkkgPSAiTU9EVUxFX1VSSSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9ST09UX1VSSSA9ICJST09UX1VSSSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9ST09UX0NPTlRFTlRfVFlQRSA9ICJST09UX0NPTlRFTlRfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5I2NyZWF0ZUVkaXRNb2RlbEZvclJlYWQoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dCwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKLQkJVVJJIG1vZHVsZVVSSSA9IChVUkkpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9NT0RVTEVfVVJJKSA6IG51bGwpOwotCQlVUkkgcm9vdFVSSSA9IChVUkkpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9ST09UX1VSSSkgOiBudWxsKTsKLQkJU3RyaW5nIHJvb3RDb250ZW50VHlwZSA9IChTdHJpbmcpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9ST09UX0NPTlRFTlRfVFlQRSkgOiBudWxsKTsKLQkJaWYobW9kdWxlVVJJID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBIE1vZHVsZSBVUkkgbXVzdCBiZSBwcm92aWRlZCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlyZXR1cm4gIG5ldyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIGNvbnRleHQsIHRydWUsIG1vZHVsZVVSSSxyb290VVJJLHJvb3RDb250ZW50VHlwZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dCwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKSB7Ci0JCVVSSSBtb2R1bGVVUkkgPSAoVVJJKSAoKHBhcmFtcyAhPSBudWxsKSA/IHBhcmFtcy5nZXQoUEFSQU1fTU9EVUxFX1VSSSkgOiBudWxsKTsKLQkJVVJJIHJvb3RVUkkgPSAoVVJJKSAoKHBhcmFtcyAhPSBudWxsKSA/IHBhcmFtcy5nZXQoUEFSQU1fUk9PVF9VUkkpIDogbnVsbCk7Ci0JCVN0cmluZyByb290Q29udGVudFR5cGUgPSAoU3RyaW5nKSAoKHBhcmFtcyAhPSBudWxsKSA/IHBhcmFtcy5nZXQoUEFSQU1fUk9PVF9DT05URU5UX1RZUEUpIDogbnVsbCk7Ci0JCWlmKG1vZHVsZVVSSSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQSBNb2R1bGUgVVJJIG11c3QgYmUgcHJvdmlkZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gIG5ldyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIGNvbnRleHQsIGZhbHNlLGZhbHNlLCBtb2R1bGVVUkkscm9vdFVSSSxyb290Q29udGVudFR5cGUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5I2dldENhY2hlSUQoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhY2hlSUQoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zKSB7IAotCQlVUkkgbW9kdWxlVVJJID0gKFVSSSlwYXJhbXMuZ2V0KFBBUkFNX01PRFVMRV9VUkkpOwotCQlpZihtb2R1bGVVUkkgIT0gbnVsbCkKLQkJCXJldHVybiBlZGl0TW9kZWxJRCsiOiIrbW9kdWxlVVJJLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVkaXRNb2RlbElEKyI6Tk9VUkkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlOTkxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyOwotCi0KLS8qKgotICogSmF2YSBQcm9qZWN0IHZhbGlkYXRpb24gCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyIGltcGxlbWVudHMgSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIHsKLQkKLQlwcml2YXRlIFN0cmluZyB2YWxpZGF0aW9uVHlwZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjZ2V0QmFzZVZhbGlkYXRpb25UeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRCYXNlVmFsaWRhdGlvblR5cGUoT2JqZWN0IHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KQotCQkJcmV0dXJuICgoSUphdmFQcm9qZWN0KXNlbGVjdGlvbikuZ2V0UHJvamVjdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyI2dldFZhbGlkYXRpb25UeXBlU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25UeXBlU3RyaW5nKCkgewotCQlyZXR1cm4gdmFsaWRhdGlvblR5cGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciNzZXRWYWxpZGF0aW9uVHlwZVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25UeXBlU3RyaW5nKFN0cmluZyB2YWxpZGF0aW9uVHlwZSkgewotCQl0aGlzLnZhbGlkYXRpb25UeXBlID0gdmFsaWRhdGlvblR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV1RQV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV1RQV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MTMzNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dUUFdvcmtpbmdDb3B5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVNhdmVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlSGFuZGxlckhlYWRsZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlSGFuZGxlclJlZ2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzI3LzIwMDEgNDoxNDozMCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgV1RQV29ya2luZ0NvcHlNYW5hZ2VyIGltcGxlbWVudHMgV29ya2luZ0NvcHlNYW5hZ2VyIHsKLQotCS8vTmV3IENVcyB0aGF0IHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIHVwb24gZGlzcG9zZQotCXByaXZhdGUgTGlzdCBvcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHM7Ci0JLy9OZXcgQ1VzIHRoYXQgd2VyZSBjcmVhdGVkIHRoYXQgbmVlZCBzYXZlZCBpbW1lZGlhdGVseSAoYWZ0ZXIgZWFjaCBnZW4pCi0JcHJpdmF0ZSBMaXN0IG5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0czsKLQkvL0EgY29tcGxldGUgbGlzdCBvZiBuZXcgQ1VzIHRoYXQgaXMgb25seSBjbGVhcmVkIG9uIHNhdmUgYW5kIGRpc3Bvc2UKLQlwcml2YXRlIExpc3QgbmV3Q29tcGlsYXRpb25Vbml0czsKLQlwcml2YXRlIEhhc2hNYXAgZGVsZXRlZENvbXBpbGF0aW9uVW5pdHM7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBJUkVTT1VSQ0VfQ0xBU1MgPSBJUmVzb3VyY2UuY2xhc3M7Ci0KLQkvKioKLQkgKiBXVFBXb3JraW5nQ29weU1hbmFnZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgV1RQV29ya2luZ0NvcHlNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlbGV0ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlnZXROZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMoKS5yZW1vdmUoY3UpOwotCQlpZiAoIWdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zKGN1KSAmJiAhZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5jb250YWluc0tleShjdSkpCi0JCQlwcmltQWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChjdSk7Ci0JCWdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpLnJlbW92ZShjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmV3Q29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY3UsIElDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkpIHsKLQkJZ2V0TmV3Q29tcGlsYXRpb25Vbml0cygpLmFkZChjdSk7Ci0JCWdldE5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cygpLmFkZCh3b3JraW5nQ29weSk7Ci0JCWlmICghZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5jb250YWluc0tleShjdSkpCi0JCQlnZXRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKS5hZGQoY3UpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgbmV3IENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tbWl0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCB3YywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCXdjLmNvbW1pdFdvcmtpbmdDb3B5KGZhbHNlLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShlKSAmJiBzaG91bGRTYXZlUmVhZE9ubHkod2MpKQotCQkJCQl3Yy5jb21taXRXb3JraW5nQ29weShmYWxzZSwgbW9uaXRvcik7Ci0JCQkJZWxzZQotCQkJCQl0aHJvdyBlOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQl3Yy5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlMSkgewotCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZTEpOwotCQkJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKGUxKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBkZWxldGUKLQkgKiAKLQkgKiBAY3UgZnJvbSB0aGUgd29ya2JlbmNoIGFuZCBmaXggdGhlIGludGVybmFsIHJlZmVyZW5jZXMgZm9yIHRoaXMgd29ya2luZyBjb3B5IG1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKElDb21waWxhdGlvblVuaXQgY3UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpKQotCQkJY3UgPSBjdS5nZXRQcmltYXJ5KCk7Ci0JCWFkZERlbGV0ZWRDb21waWxhdGlvblVuaXQoY3UpOwotCQl0cnkgewotCQkJY3UuZGVsZXRlKGZhbHNlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldFN0YXR1cygpLmdldENvZGUoKSAhPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QpCi0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2NhcmRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChnZXRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUxpc3QgY3VzID0gZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U7Ci0JCUlDb21waWxhdGlvblVuaXQgd2MgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cy5zaXplKCk7IGkrKykgewotCQkJY3UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgY3VzLmdldChpKTsKLQkJCWlmIChjdS5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCQl3YyA9IGN1OwotCQkJCWN1ID0gd2MuZ2V0UHJpbWFyeSgpOwotCQkJfQotCQkJcHJpbURlbGV0ZShjdSk7Ci0JCQlpZiAod2MgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQl3Yy5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQkJcHJpbURpc3Bvc2UoKTsKLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCWlmICghV1RQQ29tbW9uUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpKSB7Ci0JCQkJV1RQQ29tbW9uUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSxudWxsLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSxudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcnVubmFibGUucnVuKG51bGwpOwotCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCS8vcnVuT3BlcmF0aW9uKHJ1bm5hYmxlLCBudWxsLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXZlcnQoKSB7Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQkJCXByaW1SZXZlcnQoKTsKLQkJCX0KLQkJfTsKLQkJcnVuT3BlcmF0aW9uKHJ1bm5hYmxlLCBudWxsLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEFmZmVjdGVkRmlsZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xMS8yMDAxIDY6NDM6MzcgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuSGFzaE1hcAotCSAqLwotCXByb3RlY3RlZCBIYXNoTWFwIGdldERlbGV0ZWRDb21waWxhdGlvblVuaXRzKCkgewotCQlpZiAoZGVsZXRlZENvbXBpbGF0aW9uVW5pdHMgPT0gbnVsbCkKLQkJCWRlbGV0ZWRDb21waWxhdGlvblVuaXRzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGRlbGV0ZWRDb21waWxhdGlvblVuaXRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBlbmNvZGVkIGluIHRoZSBnaXZlbiBlZGl0b3IKLQkgKiBpbnB1dC4gRG9lcyBub3QgY29ubmVjdCB0aGUgZWRpdCBtb2RlbCB0byB0aGUgd29ya2luZyBjb3B5LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdAotCSAqIEByZXR1cm4gdGhlIHdvcmtpbmcgY29weSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlucHV0IGRvZXMKLQkgKiAgICAgICAgIG5vdCBlbmNvZGUgYW4gZWRpdG9yIGlucHV0LCBvciBpZiB0aGVyZSBpcyBubyByZW1lbWJlcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcwotCSAqICAgICAgICAgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IGdldEV4aXN0aW5nV29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IG5ld0NVID0gZ2V0TmV3Q29tcGlsYXRpb25Vbml0V29ya2luZ0NvcHkoY3UpOwotCQlpZiAobmV3Q1UgIT0gbnVsbCkKLQkJCXJldHVybiBuZXdDVTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xOS8yMDAxIDExOjAwOjE5IEFNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0TmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzKCkgewotCQlpZiAobmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzID09IG51bGwpCi0JCQluZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBuZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8yNi8yMDAxIDM6NDk6MDUgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXROZXdDb21waWxhdGlvblVuaXRzKCkgewotCQlpZiAobmV3Q29tcGlsYXRpb25Vbml0cyA9PSBudWxsKQotCQkJbmV3Q29tcGlsYXRpb25Vbml0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIG5ld0NvbXBpbGF0aW9uVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogSXQgaXMgcG9zc2libGUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCB0aGlzIENvbXBpbGF0aW9uVW5pdCBhbmQgaXRzIHdvcmtpbmcgY29weS4gSWYKLQkgKiB0aGlzIGlzIHRoZSBjYXNlLCByZXR1cm4gb3VyIG5ldyB3b3JraW5nIGNvcHkgYW5kIGRvIG5vdCBjcmVhdGUgYSBuZXcgb25lLgotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGdldE5ld0NvbXBpbGF0aW9uVW5pdFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJaWYgKGhhc05ld0NvbXBpbGF0aW9uVW5pdChjdSkpIHsKLQkJCUxpc3QgbGlzdCA9IGdldE5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cygpOwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb3B5OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJY29weSA9IChJQ29tcGlsYXRpb25Vbml0KSBsaXN0LmdldChpKTsKLQkJCQlpZiAoY3UuZXF1YWxzKGNvcHkuZ2V0UHJpbWFyeSgpKSkKLQkJCQkJcmV0dXJuIGNvcHk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8yNi8yMDAxIDM6NDk6MDUgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChvcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMgPT0gbnVsbCkKLQkJCW9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIG9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElQYWNrYWdlRnJhZ21lbnQgZm9yIHRoZSBnaXZlbiBJQ29tcGlsYXRpb25Vbml0LgotCSAqLwotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWlmIChjdSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlKYXZhRWxlbWVudCBwYXJlbnQgPSBjdTsKLQkJaW50IGVsZW1lbnRUeXBlID0gY3UuZ2V0RWxlbWVudFR5cGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsICYmIGVsZW1lbnRUeXBlICE9IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQkJZWxlbWVudFR5cGUgPSBwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWVsc2UKLQkJCQllbGVtZW50VHlwZSA9IC0xOwotCQl9Ci0JCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudCkgcGFyZW50OwotCX0KLQotCXByb3RlY3RlZCBJU2F2ZUhhbmRsZXIgZ2V0U2F2ZUhhbmRsZXIoKSB7Ci0JCXJldHVybiBTYXZlSGFuZGxlclJlZ2lzdGVyLmdldFNhdmVIYW5kbGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdAotCSAqIEByZXR1cm4gdGhlIHdvcmtpbmcgY29weSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1LCBib29sZWFuIGZvck5ld0NVKSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQlpZiAoY3UgPT0gbnVsbCB8fCBjdS5pc1dvcmtpbmdDb3B5KCkpCi0JCQlyZXR1cm4gY3U7Ci0JCUlDb21waWxhdGlvblVuaXQgbmV3Q1UgPSBnZXROZXdDb21waWxhdGlvblVuaXRXb3JraW5nQ29weShjdSk7Ci0JCWlmIChuZXdDVSAhPSBudWxsKQotCQkJcmV0dXJuIG5ld0NVOwotCQlJQ29tcGlsYXRpb25Vbml0IHdvcmtpbmdDb3B5ID0gY3UuZ2V0V29ya2luZ0NvcHkobnVsbCk7Ci0JCWFkZE5ld0NvbXBpbGF0aW9uVW5pdChjdSwgd29ya2luZ0NvcHkpOwotCQlyZXR1cm4gd29ya2luZ0NvcHk7Ci0JfQotCi0JLyoqCi0JICogSGFzIGEgbmV3IGNvbXBpbGF0aW9uIHVuaXQgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmV3Q29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIGdldE5ld0NvbXBpbGF0aW9uVW5pdHMoKS5jb250YWlucyhjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKEV4Y2VwdGlvbiBleCkgewotCQlyZXR1cm4gU2F2ZUhhbmRsZXJIZWFkbGVzcy5pc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1BZGREZWxldGVkQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJaWYgKGN1ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU9iamVjdFtdIGluZm8gPSBuZXcgT2JqZWN0WzJdOwotCQlpbmZvWzBdID0gZ2V0UGFja2FnZUZyYWdtZW50KGN1KTsKLQkJdHJ5IHsKLQkJCWluZm9bMV0gPSBjdS5nZXRTb3VyY2UoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWluZm9bMV0gPSBudWxsOwotCQl9Ci0JCWdldERlbGV0ZWRDb21waWxhdGlvblVuaXRzKCkucHV0KGN1LCBpbmZvKTsKLQl9Ci0KLQkvLyBUaGlzIGlzIGFuIGludGVybmFsIGRlbGV0ZSBjYWxsLgotCXByb3RlY3RlZCB2b2lkIHByaW1EZWxldGUoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQl0cnkgewotCQkJaWYgKGN1LmV4aXN0cygpKQotCQkJCWN1LmRlbGV0ZSh0cnVlLCBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJLy9XaGF0IHRvIGRvIGhlcmU/Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltRGlzcG9zZSgpIHsKLQkJZGlzY2FyZE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpOwotCQlyZXZpdmVEZWxldGVkQ29tcGlsYXRpb25Vbml0cygpOwotCQluZXdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJb3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJZGVsZXRlZENvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1SZXZlcnQoKSB7Ci0JCWRpc2NhcmRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKTsKLQkJcmV2aXZlRGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKTsKLQkJbmV3Q29tcGlsYXRpb25Vbml0cyA9IG51bGw7Ci0JCW5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cyA9IG51bGw7Ci0JCW9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cyA9IG51bGw7Ci0JCWRlbGV0ZWRDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZWRpdG9yCi0JICogaW5wdXQuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgZG9lcwotCSAqICAgICAgICAgbm90IGVuY29kZSBhbiBlZGl0b3IgaW5wdXQsIG9yIGlmIHRoZXJlIGlzIG5vIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzCi0JICogICAgICAgICBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgcHJpbUdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSByZWZlcmVuY2VkIENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVNhdmVDb21waWxhdGlvblVuaXRzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc2F2ZU5ld0NvbXBpbGF0aW9uVW5pdHMobW9uaXRvcik7Ci0JCWdldERlbGV0ZWRDb21waWxhdGlvblVuaXRzKCkuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIG5ldyBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1TYXZlT25seU5ld0NvbXBpbGF0aW9uVW5pdHMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IGN1cyA9IGdldE5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cygpOwotCQlJQ29tcGlsYXRpb25Vbml0IHdjOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cy5zaXplKCk7IGkrKykgewotCQkJd2MgPSAoSUNvbXBpbGF0aW9uVW5pdCkgY3VzLmdldChpKTsKLQkJCWNvbW1pdFdvcmtpbmdDb3B5KHdjLCBtb25pdG9yKTsKLQkJfQotCQljdXMuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVEZWxldGVkQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJaWYgKGdldERlbGV0ZWRDb21waWxhdGlvblVuaXRzKCkucmVtb3ZlKGN1KSAhPSBudWxsKSB7Ci0JCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpKSB7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBvcmlnaW5hbCwgbmV4dENVLCB0ZXN0Q1U7Ci0JCQkJb3JpZ2luYWwgPSBjdS5nZXRQcmltYXJ5KCk7Ci0JCQkJU2V0IGN1cyA9IGdldERlbGV0ZWRDb21waWxhdGlvblVuaXRzKCkua2V5U2V0KCk7Ci0JCQkJSXRlcmF0b3IgaXQgPSBjdXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCW5leHRDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBpdC5uZXh0KCk7Ci0JCQkJCXRlc3RDVSA9IG5leHRDVS5pc1dvcmtpbmdDb3B5KCkgPyAoSUNvbXBpbGF0aW9uVW5pdCkgbmV4dENVLmdldFByaW1hcnkoKSA6IG5leHRDVTsKLQkJCQkJaWYgKHRlc3RDVS5lcXVhbHMob3JpZ2luYWwpKSB7Ci0JCQkJCQljdXMucmVtb3ZlKG5leHRDVSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXZpdmVEZWxldGVkQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY3UsIE9iamVjdFtdIGluZm8sIElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJaWYoY3UuZ2V0SmF2YVByb2plY3QoKS5pc09wZW4oKSkgewotCQkJaWYgKGluZm9bMF0gIT0gbnVsbCAmJiBpbmZvWzFdICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdHlwZU5hbWUgPSBjdS5nZXRFbGVtZW50TmFtZSgpOwotCQkJCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IChJUGFja2FnZUZyYWdtZW50KSBpbmZvWzBdOwotCQkJCVN0cmluZyBzb3VyY2UgPSAoU3RyaW5nKSBpbmZvWzFdOwotCQkJCXRyeSB7Ci0JCQkJCUlDb21waWxhdGlvblVuaXQgZXhpc3RpbmdDVSA9IHBhY2suZ2V0Q29tcGlsYXRpb25Vbml0KHR5cGVOYW1lKTsKLQkJCQkJaWYgKGV4aXN0aW5nQ1UuZXhpc3RzKCkgJiYgZ2V0TmV3Q29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zKGV4aXN0aW5nQ1UpKQotCQkJCQkJZXhpc3RpbmdDVS5kZWxldGUoZmFsc2UsIHBtKTsKLQkJCQkJcGFjay5jcmVhdGVDb21waWxhdGlvblVuaXQodHlwZU5hbWUsIHNvdXJjZSwgZmFsc2UsIHBtKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXRzKCkgewotCQlpZiAoZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCQotCQlJUHJvZ3Jlc3NNb25pdG9yIHBtID0gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTsKLQkJT2JqZWN0W10gaW5mbzsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQljdSA9IChJQ29tcGlsYXRpb25Vbml0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCWluZm8gPSAoT2JqZWN0W10pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlyZXZpdmVEZWxldGVkQ29tcGlsYXRpb25Vbml0KGN1LCBpbmZvLCBwbSk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJ1bk9wZXJhdGlvbihJV29ya3NwYWNlUnVubmFibGUgYVJ1bm5hYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGJvb2xlYW4gdmFsaWRhdGUpIHsKLQkJcHJpbVJ1bk9wZXJhdGlvbihhUnVubmFibGUsIG1vbml0b3IpOwotCi0JCS8vIFRPRE8gQnJlYWsgdGhlIHZhbGlkYXRvciBkZXBlZGVuY3kKLQkJLy8JaWYgKHZhbGlkYXRlKQotCQkvLwkJcHJpbVJ1bk9wZXJhdGlvbihhUnVubmFibGUsIG1vbml0b3IpOwotCQkvLwllbHNlIHsKLQkJLy8JCUlQcm9qZWN0IHByb2ogPSBnZXRWYWxpZGF0aW9uUHJvamVjdCgpOwotCQkvLwkJCQotCQkvLwkJVmFsaWRhdG9yTWFuYWdlciBtZ3IgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKTsKLQkJLy8JCWJvb2xlYW4gZGlzYWJsZVZhbGlkYXRvcnMgPSBwcm9qICE9IG51bGw7Ci0JCS8vCQlib29sZWFuIHdhc1N1c3BlbmRlZCA9IGZhbHNlOwotCQkvLwkJaWYgKGRpc2FibGVWYWxpZGF0b3JzKSB7Ci0JCS8vCQkJd2FzU3VzcGVuZGVkID0gbWdyLmlzU3VzcGVuZGVkKHByb2opOwotCQkvLwkJCWlmICghd2FzU3VzcGVuZGVkKQotCQkvLwkJCQltZ3Iuc3VzcGVuZFZhbGlkYXRpb24ocHJvaiwgdHJ1ZSk7Ci0JCS8vCQl9Ci0JCS8vCQl0cnkgewotCQkvLwkJCXByaW1SdW5PcGVyYXRpb24oYVJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJLy8JCX0gZmluYWxseSB7Ci0JCS8vCQkJaWYgKGRpc2FibGVWYWxpZGF0b3JzICYmICF3YXNTdXNwZW5kZWQpCi0JCS8vCQkJCW1nci5zdXNwZW5kVmFsaWRhdGlvbihwcm9qLCBmYWxzZSk7Ci0JCS8vCQl9Ci0JCS8vCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuT3BlcmF0aW9uKElXb3Jrc3BhY2VSdW5uYWJsZSBhUnVubmFibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJaWYgKGFSdW5uYWJsZSAhPSBudWxsKSB7Ci0JCQkvL2lmICh3b3Jrc3BhY2UuaXNUcmVlTG9ja2VkKCkpCi0JCQkvL0xvZ2dlci5nZXRMb2dnZXIoKS5sb2dUcmFjZShSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDYW5ub3RfcnVuX0oyRUVVSVdvcmtpbmdDb19FUlJPUl8iKSk7Ci0JCQkvLyAvLyROT04tTkxTLTEkID0gIkNhbm5vdCBydW4gSjJFRVVJV29ya2luZ0NvcHlNYW5hZ2VyIG9wZXJhdGlvbiBiZWNhdXNlIHRoZSBXb3Jrc3BhY2UKLQkJCS8vIHRyZWUgaXMgbG9ja2VkLiIKLQkJCS8vZWxzZSB7Ci0JCQlpZiAoIVdUUENvbW1vblBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc1RyZWVMb2NrZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCVdUUENvbW1vblBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oYVJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSByZWZlcmVuY2VkIENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUNvbXBpbGF0aW9uVW5pdHMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlnZXRTYXZlSGFuZGxlcigpLmFjY2VzcygpOwotCQl0cnkgewotCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQkJCQlwcmltU2F2ZUNvbXBpbGF0aW9uVW5pdHMoYU1vbml0b3IpOwotCQkJCX0KLQkJCX07Ci0JCQlydW5PcGVyYXRpb24ocnVubmFibGUsIG1vbml0b3IsIHRydWUpOwotCQl9IGNhdGNoIChTYXZlRmFpbGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlnZXRTYXZlSGFuZGxlcigpLmhhbmRsZVNhdmVGYWlsZWQoZXgsIG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJZ2V0U2F2ZUhhbmRsZXIoKS5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTmV3Q29tcGlsYXRpb25Vbml0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcHJpbVNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhtb25pdG9yKTsKLQkJZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkuY2xlYXIoKTsKLQkJZ2V0TmV3Q29tcGlsYXRpb25Vbml0cygpLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSBuZXcgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlT25seU5ld0NvbXBpbGF0aW9uVW5pdHMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlnZXRTYXZlSGFuZGxlcigpLmFjY2VzcygpOwotCQl0cnkgewotCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQkJCQlwcmltU2F2ZU9ubHlOZXdDb21waWxhdGlvblVuaXRzKGFNb25pdG9yKTsKLQkJCQl9Ci0JCQl9OwotCQkJcnVuT3BlcmF0aW9uKHJ1bm5hYmxlLCBtb25pdG9yLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKFNhdmVGYWlsZWRFeGNlcHRpb24gZXgpIHsKLQkJCWdldFNhdmVIYW5kbGVyKCkuaGFuZGxlU2F2ZUZhaWxlZChleCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlnZXRTYXZlSGFuZGxlcigpLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmVSZWFkT25seShJQ29tcGlsYXRpb25Vbml0IHdjKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0KLQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSB3Yy5nZXRQcmltYXJ5KCkuZ2V0QWRhcHRlcihJUkVTT1VSQ0VfQ0xBU1MpOwotCi0JCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8IHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSB8fCAhcmVzb3VyY2UuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuaXNSZWFkT25seSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBnZXRTYXZlSGFuZGxlcigpLnNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZSgoSUZpbGUpIHJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUud29ya2JlbmNoLklKMkVFV29ya2luZ0NvcHlNYW5hZ2VyI2hhc1dvcmtpbmdDb3BpZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1dvcmtpbmdDb3BpZXMoKSB7Ci0JCXJldHVybiAoZGVsZXRlZENvbXBpbGF0aW9uVW5pdHMgIT0gbnVsbCAmJiAhZGVsZXRlZENvbXBpbGF0aW9uVW5pdHMuaXNFbXB0eSgpKSB8fCAobmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzICE9IG51bGwgJiYgIW5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cy5pc0VtcHR5KCkpIHx8IChuZXdDb21waWxhdGlvblVuaXRzICE9IG51bGwgJiYgIW5ld0NvbXBpbGF0aW9uVW5pdHMuaXNFbXB0eSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjY2M4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2luZ0NvcHlNYW5hZ2VyIGV4dGVuZHMgV29ya2luZ0NvcHlQcm92aWRlciB7Ci0KLQl2b2lkIGRpc3Bvc2UoKTsKLQotCWphdmEudXRpbC5TZXQgZ2V0QWZmZWN0ZWRGaWxlcygpOwotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSByZWZlcmVuY2VkIENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0Jdm9pZCBzYXZlQ29tcGlsYXRpb25Vbml0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSBuZXcgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQl2b2lkIHNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogTWV0aG9kIGhhc1dvcmtpbmdDb3BpZXMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNXb3JraW5nQ29waWVzKCk7Ci0KLQkvKioKLQkgKiBSZXZlcnQgYWxsIHdvcmtpbmcgY29waWVzLgotCSAqLwotCXZvaWQgcmV2ZXJ0KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5TWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1M2Y5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtpbmdDb3B5TWFuYWdlckZhY3RvcnkgewotCi0JLy8JcHJvdGVjdGVkIHN0YXRpYyBDbGFzcyB3b3JraW5nQ29weU1hbmFnZXJDbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgV29ya2luZ0NvcHlNYW5hZ2VyIG5ld1JlZ2lzdGVyZWRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIChXb3JraW5nQ29weU1hbmFnZXIpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoIndvcmtpbmdDb3B5TWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8JcHVibGljIHN0YXRpYyBJV29ya2luZ0NvcHlNYW5hZ2VyIGNyZWF0ZVdvcmtpbmdDb3B5TWFuYWdlcigpIHsKLQkvLwkJaWYgKGdldFdvcmtpbmdDb3B5TWFuYWdlckNsYXNzKCkgIT0gbnVsbCkKLQkvLwkJCXRyeSB7Ci0JLy8JCQkJcmV0dXJuIChJV29ya2luZ0NvcHlNYW5hZ2VyKSBnZXRXb3JraW5nQ29weU1hbmFnZXJDbGFzcygpLm5ld0luc3RhbmNlKCk7Ci0JLy8JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JLy8JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUyKSB7Ci0JLy8JCQl9Ci0JLy8JCXJldHVybiBudWxsOwotCS8vCX0KLQkvLwkKLQkvLwkvKioKLQkvLwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JLy8JICogQ3JlYXRpb24gZGF0ZTogKDQvMjYvMjAwMSA3OjUzOjE1IEFNKQotCS8vCSAqIEByZXR1cm4gamF2YS5sYW5nLkNsYXNzCi0JLy8JICovCi0JLy8JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuQ2xhc3MgZ2V0V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MoKSB7Ci0JLy8JCXJldHVybiB3b3JraW5nQ29weU1hbmFnZXJDbGFzczsKLQkvLwl9Ci0JLy8JCi0JLy8JLyoqCi0JLy8JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCS8vCSAqIENyZWF0aW9uIGRhdGU6ICg0LzI2LzIwMDEgNzo1MzoxNSBBTSkKLQkvLwkgKiBAcGFyYW0gbmV3V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0JLy8JICovCi0JLy8JcHVibGljIHN0YXRpYyB2b2lkIHNldFdvcmtpbmdDb3B5TWFuYWdlckNsYXNzKGphdmEubGFuZy5DbGFzcyBuZXdXb3JraW5nQ29weU1hbmFnZXJDbGFzcykgewotCS8vCQl3b3JraW5nQ29weU1hbmFnZXJDbGFzcyA9IG5ld1dvcmtpbmdDb3B5TWFuYWdlckNsYXNzOwotCS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTZmNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci0KLQotLyoqCi0gKiBUaGUgdXNlciBvZiB0aGUgSmF2YSBjb2RlIGdlbmVyYXRpb24gZnJhbWV3b3JrIG11c3Qgc3VwcGx5IGFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlLgotICogVGhlIGZyYW1ld29yayB3aWxsIG9idGFpbiBjb21waWxhdGlvbiB3b3JraW5nIGNvcGllcyBmcm9tIHRoaXMgaW50ZXJmYWNlLiBUaGUgc3VwcGxpZXIgb2YgdGhlCi0gKiBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY29tbWl0dGluZyB0aGUgd29ya2luZyBjb3BpZXMgd2hlbiBhcHByb3ByaWF0ZSBmb3IgdGhlIHVzZXIncwotICogZWRpdCBtb2RlbC4KLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JraW5nQ29weVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgd2lsbCBkZWxldGUgY29tcGlsYXRpb24gdW5pdCBmcm9tIHRoZSB3b3JrYmVuY2ggYW5kIGZpeCB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlcyBmb3IgdGhpcwotCSAqIHdvcmtpbmcgY29weSBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBjdQotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdG8gZGVsZXRlCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSBmb3IgdGhlIGRlbGV0ZQotCSAqLwotCXZvaWQgZGVsZXRlKElDb21waWxhdGlvblVuaXQgY3UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQuIFRoYXQgaXMsIHRoZSBtYW5hZ2VyIGFscmVhZHkKLQkgKiBoYXMgYSB3b3JraW5nIGNvcHkgZm9yIHRoaXMgdW5pdCwgaXQgZG9lcyBub3QgY3JlYXRlIGEgbmV3IHdvcmtpbmcgY29weS4gRG9lcyBub3QgY29ubmVjdCB0aGUKLQkgKiBlZGl0IG1vZGVsIHRvIHRoZSB3b3JraW5nIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdAotCSAqIEByZXR1cm4gdGhlIHdvcmtpbmcgY29weSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaXQgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlJQ29tcGlsYXRpb25Vbml0IGdldEV4aXN0aW5nV29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgb3IgY3JlYXRlcyBhIG5ldyB3b3JraW5nIGNvcHkKLQkgKiBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgYW5kIHJldHVybnMgaXQuIElmIGEgd29ya2luZyBjb3B5IGlzIHBhc3NlZCBpbiwgaXQgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdAotCSAqIEByZXR1cm4gdGhlIHdvcmtpbmcgY29weSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSB3b3JraW5nIGNvcHkgY2FuIG5vdCBiZSBjcmVhdGVkCi0JICovCi0JSUNvbXBpbGF0aW9uVW5pdCBnZXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1LCBib29sZWFuIGZvck5ld0NVKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSUphdmFQcm9qZWN0TGl0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0lKYXZhUHJvamVjdExpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkMGFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSUphdmFQcm9qZWN0TGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuamF2YWxpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi0vKioKLSAqIDxwPgotICogUmVwcmVzZW50cyBhIHNjYWxlZCBkb3duIHZlcnNpb24gb2YgYW4ge0BsaW5rIElKYXZhUHJvamVjdH0uIFRoaXMgc3Vic2V0IG9mCi0gKiBtZXRob2RzIGlzIGd1YXJhbnRlZWQgdG8gbm90IGZvcmNlIGEgbG9hZCBvZiB0aGUgdW5kZXJseWluZwotICoge0BsaW5rIElKYXZhTW9kZWx9LiBUaGlzIGVuYWJsZXMgc2FmZSBhY2Nlc3MgdG8gYSBsaW1pdGVkIHNldCBvZgotICoge0BsaW5rIElKYXZhUHJvamVjdH0gQVBJIGZvciBtdWx0aS10aHJlYWRlZCBjbGllbnRzIHRvIGNhbGwgZHVyaW5nIHRpbWVzIG9mCi0gKiBleHRyZW1lIGNvbmN1cnJlbmN5LCBlLmcuIHdvcmtiZW5jaCBzdGFydHVwLgotICogPC9wPgotICogPHA+Ci0gKiBBbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlc2UgaGFuZGxlcyBjYW4gYmUgY3JlYXRlZCB2aWEKLSAqIDxjb2RlPkphdmFDb3JlTGl0ZS5jcmVhdGUocHJvamVjdCk8L2NvZGU+LgotICogPC9wPgotICogCi0gKiBAc2VlIEphdmFDb3JlI2NyZWF0ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLSAqIEBzZWUgSUphdmFQcm9qZWN0Ci0gKiBAc2VlIElDbGFzc3BhdGhFbnRyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhUHJvamVjdExpdGUgewotCS8qKgotCSAqIEBzZWUgSUphdmFQcm9qZWN0I3JlYWRSYXdDbGFzc3BhdGgoKQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlJQ2xhc3NwYXRoRW50cnlbXSByZWFkUmF3Q2xhc3NwYXRoKCk7Ci0KLQkvKioKLQkgKiBAc2VlIElKYXZhUHJvamVjdCNyZWFkT3V0cHV0TG9jYXRpb24oKQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlJUGF0aCByZWFkT3V0cHV0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEBzZWUgSUphdmFQcm9qZWN0I2dldFByb2plY3QoKQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBAc2VlIElKYXZhUHJvamVjdCNleGlzdHMoKQotCSAqLwotCWJvb2xlYW4gZXhpc3RzKCk7Ci0JCi0JLyoqCi0JICogQHNlZSBJSmF2YVByb2plY3QjaXNPcGVuKCkKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc09wZW4oKTsKLQotCS8qKgotCSAqIEBzZWUgSUphdmFQcm9qZWN0I2hhc0J1aWxkU3RhdGUoKQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNCdWlsZFN0YXRlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSmF2YUNvcmVMaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSmF2YUNvcmVMaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OWFhNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0phdmFDb3JlTGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhQ29yZUxpdGUgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkFUVVJFX0lEID0gSmF2YUNvcmUuTkFUVVJFX0lEOwotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBKYXZhQ29yZUxpdGUgSU5TVEFOQ0UgPSBudWxsOwotCi0JcHJpdmF0ZSBjbGFzcyBKYXZhQ29yZUxpdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCUlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJvY2Vzc0RlbHRhKGNoaWxkcmVuW2ldKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQlpZiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTE9TRUQpICE9IDApIHsKLQkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBlbGVtZW50OwotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJCWluaXRpYWxpemVkSmF2YVByb2plY3RzLnJlbW92ZShwcm9qZWN0KTsKLQkJCQkJamF2YVByb2plY3RMaXRlQ2FjaGUucmVtb3ZlKHByb2plY3QpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTEFTU1BBVEhfQ0hBTkdFRCkgIT0gMCkgewotCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZGVsdGEuZ2V0RWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBlbGVtZW50OwotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQkJCWlmICghaW5pdGlhbGl6ZWRKYXZhUHJvamVjdHMuY29udGFpbnMocHJvamVjdCkgJiYgamF2YVByb2plY3RMaXRlQ2FjaGUuY29udGFpbnNLZXkocHJvamVjdCkpIHsKLQkJCQkJCQlKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlID0gamF2YVByb2plY3RMaXRlQ2FjaGUuZ2V0KHByb2plY3QpOwotCQkJCQkJCWphdmFQcm9qZWN0TGl0ZS5mbHVzaENsYXNzcGF0aCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFU09MVkVEX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKSB7Ci0JCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7Ci0JCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIGVsZW1lbnQ7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCQkJaWYgKCFpbml0aWFsaXplZEphdmFQcm9qZWN0cy5jb250YWlucyhwcm9qZWN0KSkgewotCQkJCQkJCWluaXRpYWxpemVkSmF2YVByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJCQkJCQlpZiAoamF2YVByb2plY3RMaXRlQ2FjaGUuY29udGFpbnNLZXkocHJvamVjdCkpIHsKLQkJCQkJCQkJSmF2YVByb2plY3RMaXRlIGphdmFQcm9qZWN0TGl0ZSA9IGphdmFQcm9qZWN0TGl0ZUNhY2hlLmdldChwcm9qZWN0KTsKLQkJCQkJCQkJamF2YVByb2plY3RMaXRlLm1hcmtKYXZhUHJvamVjdEluaXRpYWxpemVkKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgewotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0U6Ci0JCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEU6Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQkJCWluaXRpYWxpemVkSmF2YVByb2plY3RzLnJlbW92ZShwcm9qZWN0KTsKLQkJCQkJCWphdmFQcm9qZWN0TGl0ZUNhY2hlLnJlbW92ZShwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU2V0PElQcm9qZWN0PiBpbml0aWFsaXplZEphdmFQcm9qZWN0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0PigpOwotCXByaXZhdGUgTWFwPElQcm9qZWN0LCBKYXZhUHJvamVjdExpdGU+IGphdmFQcm9qZWN0TGl0ZUNhY2hlID0gbmV3IEhhc2hNYXA8SVByb2plY3QsIEphdmFQcm9qZWN0TGl0ZT4oKTsKLQlwcml2YXRlIEphdmFDb3JlTGl0ZUxpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIEphdmFDb3JlTGl0ZSBnZXRJbnN0YW5jZSgpIHsKLQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJCUlOU1RBTkNFID0gbmV3IEphdmFDb3JlTGl0ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIEphdmFDb3JlTGl0ZSgpIHsKLQkJbGlzdGVuZXIgPSBuZXcgSmF2YUNvcmVMaXRlTGlzdGVuZXIoKTsKLQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFKTsKLQl9Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdExpdGUgY3JlYXRlSW1wbChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJaWYgKGphdmFQcm9qZWN0TGl0ZUNhY2hlLmNvbnRhaW5zS2V5KHByb2plY3QpKSB7Ci0JCQkJcmV0dXJuIGphdmFQcm9qZWN0TGl0ZUNhY2hlLmdldChwcm9qZWN0KTsKLQkJCX0KLQkJfQotCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gamF2YVByb2plY3RJbml0aWFsaXplZCA9IGZhbHNlOwotCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJamF2YVByb2plY3RJbml0aWFsaXplZCA9IGluaXRpYWxpemVkSmF2YVByb2plY3RzLmNvbnRhaW5zKHByb2plY3QpOwotCQkJfQotCQkJaWYgKCFqYXZhUHJvamVjdEluaXRpYWxpemVkKSB7Ci0JCQkJaWYgKGlzSW5pdGlhbGl6ZWQoamF2YVByb2plY3QpKSB7Ci0JCQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCQkJaW5pdGlhbGl6ZWRKYXZhUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQkJCQl9Ci0JCQkJCWphdmFQcm9qZWN0SW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUgPSBuZXcgSmF2YVByb2plY3RMaXRlKGphdmFQcm9qZWN0LCBqYXZhUHJvamVjdEluaXRpYWxpemVkKTsKLQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCWphdmFQcm9qZWN0TGl0ZUNhY2hlLnB1dChwcm9qZWN0LCBqYXZhUHJvamVjdExpdGUpOwotCQkJfQotCQkJcmV0dXJuIGphdmFQcm9qZWN0TGl0ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAoamF2YVByb2plY3QuaXNPcGVuKCkpIHsKLQkJCUphdmFNb2RlbE1hbmFnZXIuUGVyUHJvamVjdEluZm8gcHJvamVjdEluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRQZXJQcm9qZWN0SW5mbyhqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCksIGZhbHNlKTsKLQkJCWlmIChwcm9qZWN0SW5mbyAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2plY3RJbmZvLmdldFJlc29sdmVkQ2xhc3NwYXRoKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUphdmFQcm9qZWN0TGl0ZSBjcmVhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5jcmVhdGVJbXBsKHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUphdmFQcm9qZWN0TGl0ZSBjcmVhdGUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciBnZXRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcihTdHJpbmcgY29udGFpbmVySUQpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyKGNvbnRhaW5lcklEKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdQcm9qZWN0RW50cnkoSVBhdGggcGF0aCkgewotCQlyZXR1cm4gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBhdGgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld1Byb2plY3RFbnRyeShJUGF0aCBwYXRoLCBib29sZWFuIGlzRXhwb3J0ZWQpIHsKLQkJcmV0dXJuIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwYXRoLCBpc0V4cG9ydGVkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdQcm9qZWN0RW50cnkoSVBhdGggcGF0aCwgSUFjY2Vzc1J1bGVbXSBhY2Nlc3NSdWxlcywgYm9vbGVhbiBjb21iaW5lQWNjZXNzUnVsZXMsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBleHRyYUF0dHJpYnV0ZXMsIGJvb2xlYW4gaXNFeHBvcnRlZCkgewotCQlyZXR1cm4gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBhdGgsIGFjY2Vzc1J1bGVzLCBjb21iaW5lQWNjZXNzUnVsZXMsIGV4dHJhQXR0cmlidXRlcywgaXNFeHBvcnRlZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3TGlicmFyeUVudHJ5KElQYXRoIHBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpIHsKLQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShwYXRoLCBzb3VyY2VBdHRhY2htZW50UGF0aCwgc291cmNlQXR0YWNobWVudFJvb3RQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdMaWJyYXJ5RW50cnkoSVBhdGggcGF0aCwgSVBhdGggc291cmNlQXR0YWNobWVudFBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgYm9vbGVhbiBpc0V4cG9ydGVkKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocGF0aCwgc291cmNlQXR0YWNobWVudFBhdGgsIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgaXNFeHBvcnRlZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3TGlicmFyeUVudHJ5KElQYXRoIHBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsIElBY2Nlc3NSdWxlW10gYWNjZXNzUnVsZXMsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBleHRyYUF0dHJpYnV0ZXMsIGJvb2xlYW4gaXNFeHBvcnRlZCkgewotCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsIGFjY2Vzc1J1bGVzLCBleHRyYUF0dHJpYnV0ZXMsIGlzRXhwb3J0ZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9qYXZhbGl0ZS9KYXZhTGl0ZVV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0phdmFMaXRlVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYWRhYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0phdmFMaXRlVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuamF2YWxpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MuQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFMaXRlVXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgc291cmNlIChpLmUuIHdoZXJlIHRoZSAuamF2YSBmaWxlcyBhcmUpIElDb250YWluZXJzIGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgSUphdmFQcm9qZWN0TGl0ZQotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdExpdGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0PElDb250YWluZXI+IGdldEphdmFTb3VyY2VDb250YWluZXJzKGZpbmFsIElKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlKSB7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdExpdGUucmVhZFJhd0NsYXNzcGF0aCgpOwotCQlMaXN0PElDb250YWluZXI+IGNvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0PElDb250YWluZXI+KCk7Ci0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogZW50cmllcykgewotCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBqYXZhUHJvamVjdExpdGUuZ2V0UHJvamVjdCgpLmdldEZvbGRlcihlbnRyeS5nZXRQYXRoKCkpOwotCQkJCWNvbnRhaW5lcnMuYWRkKGNvbnRhaW5lcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBzb3VyY2UgKGkuZS4gd2hlcmUgdGhlIGNvbXBpbGVkIC5jbGFzcyBmaWxlcyBhcmUpIElDb250YWluZXJzIGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgSUphdmFQcm9qZWN0TGl0ZQotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdExpdGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0PElDb250YWluZXI+IGdldEphdmFPdXRwdXRDb250YWluZXJzKGZpbmFsIElKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlKSB7Ci0JCUxpc3Q8SUNvbnRhaW5lcj4gY29udGFpbmVycyA9IG5ldyBBcnJheUxpc3Q8SUNvbnRhaW5lcj4oKTsKLQkJSUNvbnRhaW5lciBkZWZhdWx0T3V0cHV0Q29udGFpbmVyID0gZ2V0RGVmYXVsdEphdmFPdXRwdXRDb250YWluZXIoamF2YVByb2plY3RMaXRlKTsKLQkJY29udGFpbmVycy5hZGQoZGVmYXVsdE91dHB1dENvbnRhaW5lcik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdExpdGUucmVhZFJhd0NsYXNzcGF0aCgpOwotCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGVudHJpZXMpIHsKLQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCUlDb250YWluZXIgb3V0cHV0Q29udGFpbmVyID0gZ2V0SmF2YU91dHB1dENvbnRhaW5lcihqYXZhUHJvamVjdExpdGUsIGVudHJ5KTsKLQkJCQlpZiAoIWNvbnRhaW5lcnMuY29udGFpbnMob3V0cHV0Q29udGFpbmVyKSkgewotCQkJCQljb250YWluZXJzLmFkZChvdXRwdXRDb250YWluZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbmVyczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBlbnVtIEphdmFDb250YWluZXJUeXBlIHsKLQkJU09VUkNFLCBPVVRQVVQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBKYXZhIG91dHB1dCAoaS5lLiB3aGVyZSB0aGUgY29tcGlsZWQgLmNsYXNzIGZpbGVzIGFyZSkKLQkgKiBJQ29udGFpbmVycyB3aG9zZSBzb3VyY2UgaXMgZXhwbGljaXRseSBtYXBwZWQgYnkgdGhlIHNwZWNpZmllZCBjb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIHZpcnR1YWxDb21wb25lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PElDb250YWluZXI+IGdldEphdmFPdXRwdXRDb250YWluZXJzKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQpIHsKLQkJcmV0dXJuIGdldEphdmFDb250YWluZXJzKHZpcnR1YWxDb21wb25lbnQsIEphdmFDb250YWluZXJUeXBlLk9VVFBVVCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgSmF2YSBzb3VyY2UgKGkuZS4gd2hlcmUgdGhlIC5qYXZhIGZpbGVzIGFyZSkgSUNvbnRhaW5lcnMKLQkgKiBleHBsaWNpdGx5IG1hcHBlZCBieSB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlydHVhbENvbXBvbmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8SUNvbnRhaW5lcj4gZ2V0SmF2YVNvdXJjZUNvbnRhaW5lcnMoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCkgewotCQlyZXR1cm4gZ2V0SmF2YUNvbnRhaW5lcnModmlydHVhbENvbXBvbmVudCwgSmF2YUNvbnRhaW5lclR5cGUuU09VUkNFKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PElDb250YWluZXI+IGdldEphdmFDb250YWluZXJzKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIEphdmFDb250YWluZXJUeXBlIGphdmFDb250YWluZXJUeXBlKSB7Ci0JCWlmICh2aXJ0dWFsQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlJUHJvamVjdCBwcm9qZWN0ID0gdmlydHVhbENvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoIXByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlTGl0ZS5OQVRVUkVfSUQpKSB7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLQkJSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUgPSBKYXZhQ29yZUxpdGUuY3JlYXRlKHByb2plY3QpOwotCQlMaXN0PElDb250YWluZXI+IGNvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0PElDb250YWluZXI+KCk7Ci0JCWlmIChqYXZhQ29udGFpbmVyVHlwZSA9PSBKYXZhQ29udGFpbmVyVHlwZS5PVVRQVVQpIHsKLQkJCUlDb250YWluZXIgZGVmYXVsdE91dHB1dENvbnRhaW5lciA9IGdldERlZmF1bHRKYXZhT3V0cHV0Q29udGFpbmVyKGphdmFQcm9qZWN0TGl0ZSk7Ci0JCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGRlZmF1bHRPdXRwdXRDb250YWluZXIpOwotCQkJZm9yIChJVmlydHVhbFJlc291cmNlIHZpcnR1YWxSZXNvdXJjZSA6IHZpcnR1YWxSZXNvdXJjZXMpIHsKLQkJCQlpZiAodmlydHVhbFJlc291cmNlLmdldENvbXBvbmVudCgpLmVxdWFscyh2aXJ0dWFsQ29tcG9uZW50KSkgewotCQkJCQljb250YWluZXJzLmFkZChkZWZhdWx0T3V0cHV0Q29udGFpbmVyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdExpdGUucmVhZFJhd0NsYXNzcGF0aCgpOwotCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGVudHJpZXMpIHsKLQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCUlQYXRoIHNvdXJjZVBhdGggPSBlbnRyeS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsgLy8gcmVtb3ZlIHRoZSBwcm9qZWN0IGZyb20gdGhlIHBhdGgKLQkJCQlJQ29udGFpbmVyIHNvdXJjZUNvbnRhaW5lciA9IHNvdXJjZVBhdGguc2VnbWVudENvdW50KCkgPT0gMCA/IHByb2plY3QgOiBwcm9qZWN0LmdldEZvbGRlcihzb3VyY2VQYXRoKTsKLQkJCQlpZiAoc291cmNlQ29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhzb3VyY2VDb250YWluZXIpOwotCQkJCQlmb3IgKElWaXJ0dWFsUmVzb3VyY2UgdmlydHVhbFJlc291cmNlIDogdmlydHVhbFJlc291cmNlcykgewotCQkJCQkJaWYgKHZpcnR1YWxSZXNvdXJjZS5nZXRDb21wb25lbnQoKS5lcXVhbHModmlydHVhbENvbXBvbmVudCkpIHsKLQkJCQkJCQlzd2l0Y2ggKGphdmFDb250YWluZXJUeXBlKSB7Ci0JCQkJCQkJY2FzZSBTT1VSQ0U6Ci0JCQkJCQkJCWlmICghY29udGFpbmVycy5jb250YWlucyhzb3VyY2VDb250YWluZXIpKSB7Ci0JCQkJCQkJCQljb250YWluZXJzLmFkZChzb3VyY2VDb250YWluZXIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgT1VUUFVUOgotCQkJCQkJCQlJQ29udGFpbmVyIG91dHB1dENvbnRhaW5lciA9IGdldEphdmFPdXRwdXRDb250YWluZXIoamF2YVByb2plY3RMaXRlLCBlbnRyeSk7Ci0JCQkJCQkJCWlmICghY29udGFpbmVycy5jb250YWlucyhvdXRwdXRDb250YWluZXIpKSB7Ci0JCQkJCQkJCQljb250YWluZXJzLmFkZChvdXRwdXRDb250YWluZXIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IEphdmEgb3V0cHV0IElDb250YWluZXIgKGkuZS4gd2hlcmUgdGhlIGNvbXBpbGVkCi0JICogLmNsYXNzIGZpbGVzIGdvKQotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdExpdGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIGdldERlZmF1bHRKYXZhT3V0cHV0Q29udGFpbmVyKElKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdExpdGUuZ2V0UHJvamVjdCgpOwotCQlJUGF0aCBkZWZhdWx0T3V0cHV0UGF0aCA9IGphdmFQcm9qZWN0TGl0ZS5yZWFkT3V0cHV0TG9jYXRpb24oKTsKLQkJaWYgKGRlZmF1bHRPdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpIHsKLQkJCXJldHVybiBwcm9qZWN0OwotCQl9Ci0JCXJldHVybiBwcm9qZWN0LmdldEZvbGRlcihkZWZhdWx0T3V0cHV0UGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKYXZhIG91dHB1dCAoaS5lLiB3aGVyZSB0aGUgY29tcGlsZWQgLmNsYXNzIGZpbGVzIGdvKQotCSAqIElDb250YWluZXIgZm9yIHRoZSBzcGVjaWZpZWQgSUNsYXNzcGF0aEVudHJ5Ci0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0TGl0ZQotCSAqIEBwYXJhbSBlbnRyeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0SmF2YU91dHB1dENvbnRhaW5lcihJSmF2YVByb2plY3RMaXRlIGphdmFQcm9qZWN0TGl0ZSwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdExpdGUuZ2V0UHJvamVjdCgpOwotCQlJUGF0aCBvdXRwdXRQYXRoID0gZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJaWYgKG91dHB1dFBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHByb2plY3QuZ2V0Rm9sZGVyKG91dHB1dFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCX0KLQkJcmV0dXJuIGdldERlZmF1bHRKYXZhT3V0cHV0Q29udGFpbmVyKGphdmFQcm9qZWN0TGl0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0phdmFQcm9qZWN0TGl0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0phdmFQcm9qZWN0TGl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGIwNTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9qYXZhbGl0ZS9KYXZhUHJvamVjdExpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MuQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbjsKLQotLyoqCi0gKiBAc2VlIElKYXZhUHJvamVjdExpdGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEphdmFQcm9qZWN0TGl0ZSBpbXBsZW1lbnRzIElKYXZhUHJvamVjdExpdGUgewotCXByaXZhdGUgZmluYWwgSUphdmFQcm9qZWN0IF9qYXZhUHJvamVjdDsKLQotCXByaXZhdGUgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIF9qYXZhUHJvamVjdEluaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIF9yYXdDbGFzc3BhdGhSZWFkID0gZmFsc2U7Ci0JcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBfcmF3Q2xhc3NwYXRoOwotCXByaXZhdGUgYm9vbGVhbiBfcmF3T3V0cHV0TG9jYXRpb25SZWFkID0gZmFsc2U7Ci0JcHJpdmF0ZSBJUGF0aCBfcmF3T3V0cHV0TG9jYXRpb247Ci0JcHJpdmF0ZSBsb25nIF9kb3RDbGFzc3BhdGhNb2RpZmljYXRpb25TdGFtcCA9IElGaWxlLk5VTExfU1RBTVA7Ci0KLQlKYXZhUHJvamVjdExpdGUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBib29sZWFuIGphdmFQcm9qZWN0SW5pdGlhbGl6ZWQpIHsKLQkJdGhpcy5famF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQkJdGhpcy5famF2YVByb2plY3RJbml0aWFsaXplZCA9IGphdmFQcm9qZWN0SW5pdGlhbGl6ZWQ7Ci0JfQotCi0Jdm9pZCBtYXJrSmF2YVByb2plY3RJbml0aWFsaXplZCgpIHsKLQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQlpZiAoIV9qYXZhUHJvamVjdEluaXRpYWxpemVkKSB7Ci0JCQkJX2phdmFQcm9qZWN0SW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJCWZsdXNoQ2xhc3NwYXRoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNKYXZhUHJvamVjdEluaXRpYWxpemVkKCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCXJldHVybiBfamF2YVByb2plY3RJbml0aWFsaXplZDsKLQkJfQotCX0KLQotCXZvaWQgZmx1c2hDbGFzc3BhdGgoKSB7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJX3Jhd0NsYXNzcGF0aFJlYWQgPSBmYWxzZTsKLQkJCV9yYXdDbGFzc3BhdGggPSBudWxsOwotCQkJX3Jhd091dHB1dExvY2F0aW9uUmVhZCA9IGZhbHNlOwotCQkJX3Jhd091dHB1dExvY2F0aW9uID0gbnVsbDsKLQkJCV9kb3RDbGFzc3BhdGhNb2RpZmljYXRpb25TdGFtcCA9IElGaWxlLk5VTExfU1RBTVA7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RG90Q2xhc3NwYXRoTW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXAgPSBJRmlsZS5OVUxMX1NUQU1QOwotCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCW1vZGlmaWNhdGlvblN0YW1wID0gX2RvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0JCWlmIChtb2RpZmljYXRpb25TdGFtcCA9PSBJRmlsZS5OVUxMX1NUQU1QKSB7Ci0JCQlmbHVzaENsYXNzcGF0aCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlGaWxlIGRvdENsYXNzcGF0aCA9IF9qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZSgiLmNsYXNzcGF0aCIpOwotCQlpZiAoIWRvdENsYXNzcGF0aC5leGlzdHMoKSkgewotCQkJZmx1c2hDbGFzc3BhdGgoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobW9kaWZpY2F0aW9uU3RhbXAgIT0gZG90Q2xhc3NwYXRoLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpIHsKLQkJCWZsdXNoQ2xhc3NwYXRoKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRG90Q2xhc3NwYXRoTW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0JCUlGaWxlIGRvdENsYXNzcGF0aCA9IF9qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZSgiLmNsYXNzcGF0aCIpOwotCQlsb25nIG1vZGlmaWNhdGlvblN0YW1wID0gZG90Q2xhc3NwYXRoLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJX2RvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wID0gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gcmVhZFJhd0NsYXNzcGF0aCgpIHsKLQkJaWYgKCFpc0phdmFQcm9qZWN0SW5pdGlhbGl6ZWQoKSkgewotCQkJaWYgKEphdmFDb3JlTGl0ZS5pc0luaXRpYWxpemVkKF9qYXZhUHJvamVjdCkpIHsKLQkJCQltYXJrSmF2YVByb2plY3RJbml0aWFsaXplZCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGlzSmF2YVByb2plY3RJbml0aWFsaXplZCgpKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBfamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0KLQkJdmVyaWZ5RG90Q2xhc3NwYXRoTW9kaWZpY2F0aW9uU3RhbXAoKTsKLQotCQlib29sZWFuIGRhdGFSZWFkID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJZGF0YVJlYWQgPSBfcmF3Q2xhc3NwYXRoUmVhZDsKLQkJfQotCQlpZiAoIWRhdGFSZWFkKSB7Ci0JCQl1cGRhdGVEb3RDbGFzc3BhdGhNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gcmF3Q2xhc3NwYXRoID0gX2phdmFQcm9qZWN0LnJlYWRSYXdDbGFzc3BhdGgoKTsKLQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCV9yYXdDbGFzc3BhdGhSZWFkID0gdHJ1ZTsKLQkJCQlfcmF3Q2xhc3NwYXRoID0gcmF3Q2xhc3NwYXRoOwotCQkJfQotCQl9Ci0JCXJldHVybiBfcmF3Q2xhc3NwYXRoOwotCX0KLQotCXB1YmxpYyBmaW5hbCBJUGF0aCByZWFkT3V0cHV0TG9jYXRpb24oKSB7Ci0JCWlmICghaXNKYXZhUHJvamVjdEluaXRpYWxpemVkKCkpIHsKLQkJCWlmIChKYXZhQ29yZUxpdGUuaXNJbml0aWFsaXplZChfamF2YVByb2plY3QpKSB7Ci0JCQkJbWFya0phdmFQcm9qZWN0SW5pdGlhbGl6ZWQoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChpc0phdmFQcm9qZWN0SW5pdGlhbGl6ZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gX2phdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0KLQkJdmVyaWZ5RG90Q2xhc3NwYXRoTW9kaWZpY2F0aW9uU3RhbXAoKTsKLQotCQlib29sZWFuIGRhdGFSZWFkID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJZGF0YVJlYWQgPSBfcmF3T3V0cHV0TG9jYXRpb25SZWFkOwotCQl9Ci0JCWlmICghZGF0YVJlYWQpIHsKLQkJCXVwZGF0ZURvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQlJUGF0aCByYXdPdXRwdXRMb2NhdGlvbiA9IF9qYXZhUHJvamVjdC5yZWFkT3V0cHV0TG9jYXRpb24oKTsKLQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCV9yYXdPdXRwdXRMb2NhdGlvblJlYWQgPSB0cnVlOwotCQkJCV9yYXdPdXRwdXRMb2NhdGlvbiA9IHJhd091dHB1dExvY2F0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBfcmF3T3V0cHV0TG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJSmF2YVByb2plY3RMaXRlI2dldFByb2plY3QoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX2phdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBfamF2YVByb2plY3QuZXhpc3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJSmF2YVByb2plY3RMaXRlI2lzT3BlbigpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPcGVuKCkgewotCQlyZXR1cm4gX2phdmFQcm9qZWN0LmlzT3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUphdmFQcm9qZWN0TGl0ZSNoYXNCdWlsZFN0YXRlKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNCdWlsZFN0YXRlKCkgewotCQlyZXR1cm4gX2phdmFQcm9qZWN0Lmhhc0J1aWxkU3RhdGUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0lKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0MGIxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0lKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRk9MREVSX05BTUUgPSAiSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVJfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX09VVFBVVF9GT0xERVJfTkFNRSA9ICJJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuREVGQVVMVF9PVVRQVVRfRk9MREVSX05BTUUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9GQUNFVF9JTlNUQUxMX0NPTkZJRyA9ICJJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9GQUNFVF9JTlNUQUxMX0NPTkZJRyI7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlZjZmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldEluc3RhbGxDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuSUV2ZW50TGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEphdmFGYWNldEluc3RhbGxDb25maWcgaW5zdGFsbENvbmZpZzsKLSAgICAKLQlwdWJsaWMgSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQl0aGlzKCBuZXcgSmF2YUZhY2V0SW5zdGFsbENvbmZpZygpICk7Ci0JfQotCQotCXB1YmxpYyBKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoIGZpbmFsIEphdmFGYWNldEluc3RhbGxDb25maWcgaW5zdGFsbENvbmZpZyApCi0JewotCSAgICB0aGlzLmluc3RhbGxDb25maWcgPSBpbnN0YWxsQ29uZmlnOwotCSAgICAKLQkgICAgZmluYWwgSUV2ZW50TGlzdGVuZXI8SmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudD4gbGlzdGVuZXIKLQkgICAgICAgID0gbmV3IElFdmVudExpc3RlbmVyPEphdmFGYWNldEluc3RhbGxDb25maWcuQ2hhbmdlRXZlbnQ+KCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIENoYW5nZUV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJRGF0YU1vZGVsIGRtID0gZ2V0RGF0YU1vZGVsKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXZlbnQuZ2V0VHlwZSgpID09IEphdmFGYWNldEluc3RhbGxDb25maWcuQ2hhbmdlRXZlbnQuVHlwZS5TT1VSQ0VfRk9MREVSU19DSEFOR0VEICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGluc3RhbGxDb25maWcuZ2V0U291cmNlRm9sZGVycygpLnNpemUoKSA+IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBpbnN0YWxsQ29uZmlnLmdldFNvdXJjZUZvbGRlcnMoKS5nZXQoIDAgKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGRtLnNldFByb3BlcnR5KCBTT1VSQ0VfRk9MREVSX05BTUUsIHZhbCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBldmVudC5nZXRUeXBlKCkgPT0gSmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudC5UeXBlLkRFRkFVTFRfT1VUUFVUX0ZPTERFUl9DSEFOR0VEICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWwgPSBpbnN0YWxsQ29uZmlnLmdldERlZmF1bHRPdXRwdXRGb2xkZXIoKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRtLnNldFByb3BlcnR5KCBERUZBVUxUX09VVFBVVF9GT0xERVJfTkFNRSwgdmFsICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgdGhpcy5pbnN0YWxsQ29uZmlnLmFkZExpc3RlbmVyKCBsaXN0ZW5lciApOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEpBVkFfRkFDRVRfSU5TVEFMTF9DT05GSUcpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChTT1VSQ0VfRk9MREVSX05BTUUpOwotICAgICAgICBwcm9wZXJ0eU5hbWVzLmFkZChERUZBVUxUX09VVFBVVF9GT0xERVJfTkFNRSk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHByb3BlcnR5VmFsdWUgKQotICAgIHsKLSAgICAgICAgaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIFNPVVJDRV9GT0xERVJfTkFNRSApICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTGlzdDxJUGF0aD4gc291cmNlRm9sZGVyczsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHByb3BlcnR5VmFsdWUgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc291cmNlRm9sZGVycyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNvdXJjZUZvbGRlcnMgPSBDb2xsZWN0aW9ucy48SVBhdGg+c2luZ2xldG9uTGlzdCggbmV3IFBhdGgoIChTdHJpbmcpIHByb3BlcnR5VmFsdWUgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmluc3RhbGxDb25maWcuc2V0U291cmNlRm9sZGVycyggc291cmNlRm9sZGVycyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBERUZBVUxUX09VVFBVVF9GT0xERVJfTkFNRSApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pbnN0YWxsQ29uZmlnLnNldERlZmF1bHRPdXRwdXRGb2xkZXIoIG5ldyBQYXRoKCAoU3RyaW5nKSBwcm9wZXJ0eVZhbHVlICkgKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIEpBVkFfRkFDRVRfSU5TVEFMTF9DT05GSUcgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChGQUNFVF9JRC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIElNb2R1bGVDb25zdGFudHMuSlNUX0pBVkE7Ci0JCX0KLQkJZWxzZSBpZiggSkFWQV9GQUNFVF9JTlNUQUxMX0NPTkZJRy5lcXVhbHMoIHByb3BlcnR5TmFtZSApICkKLQkJewotCQkgICAgcmV0dXJuIHRoaXMuaW5zdGFsbENvbmZpZzsKLQkJfQotCQllbHNlIGlmKCBTT1VSQ0VfRk9MREVSX05BTUUuZXF1YWxzKCBwcm9wZXJ0eU5hbWUgKSApCi0JCXsKLQkJICAgIGlmKCB0aGlzLmluc3RhbGxDb25maWcuZ2V0U291cmNlRm9sZGVycygpLmlzRW1wdHkoKSApCi0JCSAgICB7Ci0JCSAgICAgICAgcmV0dXJuIG51bGw7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFsbENvbmZpZy5nZXRTb3VyY2VGb2xkZXJzKCkuZ2V0KCAwICkudG9Qb3J0YWJsZVN0cmluZygpOwotCQkgICAgfQotCQl9Ci0JCWVsc2UgaWYoIERFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FLmVxdWFscyggcHJvcGVydHlOYW1lICkgKQotCQl7Ci0JCSAgICBmaW5hbCBJUGF0aCBvdXRwdXRGb2xkZXIgPSB0aGlzLmluc3RhbGxDb25maWcuZ2V0RGVmYXVsdE91dHB1dEZvbGRlcigpOwotCQkgICAgCi0JCSAgICBpZiggb3V0cHV0Rm9sZGVyID09IG51bGwgKQotCQkgICAgewotCQkgICAgICAgIHJldHVybiBudWxsOwotCQkgICAgfQotCQkgICAgZWxzZQotCQkgICAgewotCQkgICAgICAgIHJldHVybiBvdXRwdXRGb2xkZXIudG9Qb3J0YWJsZVN0cmluZygpOwotCQkgICAgfQotCQl9Ci0gICAgICAgIAotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldFV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjY0OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhRmFjZXRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5KYXZhRmFjZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFGYWNldFV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEpBVkFfRkFDRVQgPSBKYXZhRmFjZXQuRkFDRVQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzEzID0gSmF2YUZhY2V0LkpBVkFfMTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzE0ID0gSmF2YUZhY2V0LkpBVkFfMTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzUwID0gSmF2YUZhY2V0LkpBVkFfNTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzYwID0gSmF2YUZhY2V0LkpBVkFfNjA7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcGlsZXJMZXZlbCgpCi0gICAgewotICAgICAgICByZXR1cm4gSmF2YUZhY2V0VXRpbC5nZXRDb21waWxlckxldmVsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcGlsZXJMZXZlbCggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgewotICAgICAgICByZXR1cm4gSmF2YUZhY2V0VXRpbC5nZXRDb21waWxlckxldmVsKCBwcm9qZWN0ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb21waWxlckxldmVsKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgSmF2YUZhY2V0VXRpbC5zZXRDb21waWxlckxldmVsKCBwcm9qZWN0LCBmdiApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb21waWxlckxldmVsKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGV2ZWwgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIEphdmFGYWNldFV0aWwuc2V0Q29tcGlsZXJMZXZlbCggcHJvamVjdCwgbGV2ZWwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNjaGVkdWxlRnVsbEJ1aWxkKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIEphdmFGYWNldFV0aWwuc2NoZWR1bGVGdWxsQnVpbGQoIHByb2plY3QgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q2xhc3NwYXRoKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gb2xkdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gbmV3dmVyICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBKYXZhRmFjZXRVdGlsLnJlc2V0Q2xhc3NwYXRoKCBwcm9qZWN0LCBvbGR2ZXIsIG5ld3ZlciApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGNvbXBpbGVyTGV2ZWxUb0ZhY2V0KCBmaW5hbCBTdHJpbmcgdmVyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhRmFjZXRVdGlsLmNvbXBpbGVyTGV2ZWxUb0ZhY2V0KCB2ZXIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldFRvQ29tcGlsZXJMZXZlbCggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEphdmFGYWNldFV0aWwuZmFjZXRUb0NvbXBpbGVyTGV2ZWwoIGZ2ICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhUHJvamVjdEZhY2V0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhUHJvamVjdEZhY2V0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWY1YjJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YVByb2plY3RGYWNldENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUHJvamVjdEZhY2V0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JcHVibGljIEphdmFQcm9qZWN0RmFjZXRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotICAgICAgICBDb2xsZWN0aW9uIHJlcXVpcmVkRmFjZXRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZXF1aXJlZEZhY2V0cy5hZGQoSmF2YUZhY2V0VXRpbHMuSkFWQV9GQUNFVCk7Ci0gICAgICAgIHNldFByb3BlcnR5KFJFUVVJUkVEX0ZBQ0VUU19DT0xMRUNUSU9OLCByZXF1aXJlZEZhY2V0cyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L1d0cFV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L1d0cFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MmQ3ZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9XdHBVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXdHBVdGlscyAKLXsKLSAgICBwcml2YXRlIFd0cFV0aWxzKCkge30KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1RQX05BVFVSRSAKLSAgICAgICAgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpFTV9OQVRVUkUKLSAgICAgICAgPSAib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC5KYXZhRU1GTmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5BVFVSRVMgPSB7V1RQX05BVFVSRSwgSkVNX05BVFVSRX07Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZXMoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkFUVVJFUy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShOQVRVUkVTW2ldKSkgewotCQkJCVByb2plY3RVdGlsaXRpZXMuYWRkTmF0dXJlVG9Qcm9qZWN0KHByb2plY3QsIE5BVFVSRVNbaV0pOwotCQkJfQotCQl9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZXN0b0VBUiggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAKLQl7Ci0JICAgIGZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkgICAgZmluYWwgU3RyaW5nW10gY3VycmVudCA9IGRlc2MuZ2V0TmF0dXJlSWRzKCk7Ci0JICAgIGZpbmFsIFN0cmluZ1tdIHJlcGxhY2VtZW50ID0gbmV3IFN0cmluZ1sgY3VycmVudC5sZW5ndGggKyAxIF07Ci0JICAgIFN5c3RlbS5hcnJheWNvcHkoIGN1cnJlbnQsIDAsIHJlcGxhY2VtZW50LCAwLCBjdXJyZW50Lmxlbmd0aCApOwotCSAgICByZXBsYWNlbWVudFsgY3VycmVudC5sZW5ndGggXSA9IFdUUF9OQVRVUkU7Ci0JICAgIGRlc2Muc2V0TmF0dXJlSWRzKCByZXBsYWNlbWVudCApOwotCSAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKCBkZXNjLCBudWxsICk7Ci0JfSAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU5hdHVyZXMoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIAotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgCi0JewotICAgIAlQcm9qZWN0VXRpbGl0aWVzLnJlbW92ZU5hdHVyZUZyb21Qcm9qZWN0KCBwcm9qZWN0LCBXVFBfTkFUVVJFICk7Ci0gICAgCVByb2plY3RVdGlsaXRpZXMucmVtb3ZlTmF0dXJlRnJvbVByb2plY3QoIHByb2plY3QsIEpFTV9OQVRVUkUgKTsKLQl9ICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9pbnRlcm5hbC9EYXRhTW9kZWxUb0phdmFGYWNldEluc3RhbGxDb25maWdBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2ludGVybmFsL0RhdGFNb2RlbFRvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwMmQ4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2ludGVybmFsL0RhdGFNb2RlbFRvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIERhdGFNb2RlbFRvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0FkYXB0ZXIKLQotICAgIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX1RZUEVTID0geyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnLmNsYXNzIH07Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkKLSAgICB7Ci0gICAgICAgIGlmKCBhZGFwdGVyVHlwZSA9PSBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnLmNsYXNzICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSURhdGFNb2RlbCBkbSA9IChJRGF0YU1vZGVsKSBhZGFwdGFibGU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAoSmF2YUZhY2V0SW5zdGFsbENvbmZpZykgZG0uZ2V0UHJvcGVydHkoIElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX0ZBQ0VUX0lOU1RBTExfQ09ORklHICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gQURBUFRFUl9UWVBFUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvaW50ZXJuYWwvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ1RvRGF0YU1vZGVsQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9pbnRlcm5hbC9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnVG9EYXRhTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MmM0YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9pbnRlcm5hbC9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnVG9EYXRhTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldEluc3RhbGxDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0SW5zdGFsbENvbmZpZ1RvRGF0YU1vZGVsQWRhcHRlcgotCi0gICAgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElEYXRhTW9kZWwuY2xhc3MgfTsKLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3MgYWRhcHRlclR5cGUgKQotICAgIHsKLSAgICAgICAgaWYoIGFkYXB0ZXJUeXBlID09IElEYXRhTW9kZWwuY2xhc3MgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgCi0gICAgICAgICAgICAgICAgPSBuZXcgSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCAoSmF2YUZhY2V0SW5zdGFsbENvbmZpZykgYWRhcHRhYmxlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCggcHJvdmlkZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBREFQVEVSX1RZUEVTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzMDAzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vZmoyZWUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJzZXJ2aWNlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbkFyY2hpdmUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqMmVlLXZhbGlkYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqMmVlQ29yZVBsdWdpbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImFyY2hpdmUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamVlLW1vZGVscyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzlmOGY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXJ1bnRpbWUKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0ZjQ1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzUxMGQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVGh1IE1heSAxMCAxODozMzo1MSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDg5ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgTWF5IDA4IDE2OjUwOjEwIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1YTI2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4yMDgucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLmJpbmRpbmdzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24ueG1sZXJyb3JjdXN0b21pemF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuYXBwbGljYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNsaWVudDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb25uZWN0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2ViYXBwbGljYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcCwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIsCi0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0Fic3RyYWN0QXJjaGl2ZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BYnN0cmFjdEFyY2hpdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YTJiYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0Fic3RyYWN0QXJjaGl2ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElBcmNoaXZlQWRhcHRlcn0gaW50ZW5kZWQgZm9yIHN1YmNsYXNzaW5nCi0gKiBieSBjbGllbnRzLiBTZWUge0BsaW5rIElBcmNoaXZlQWRhcHRlcn0gZm9yIGRldGFpbHMuIENsaWVudHMgd2lsbCwgaG93ZXZlciwKLSAqIG1vc3QgbGlrZWx5IHdpc2ggdG8gc3ViY2xzcyBlaXRoZXIge0BsaW5rIEFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyfSBvcgotICoge0BsaW5rIEFic3RyYWN0QXJjaGl2ZVNhdmVBZGFwdGVyfSBpbnN0ZWFkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcmNoaXZlQWRhcHRlciBpbXBsZW1lbnRzIElBcmNoaXZlQWRhcHRlciB7Ci0KLQlwcm90ZWN0ZWQgSUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0KLQlwdWJsaWMgSUFyY2hpdmUgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZShJQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCXRoaXMuYXJjaGl2ZSA9IGFyY2hpdmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQWJzdHJhY3RBcmNoaXZlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0Fic3RyYWN0QXJjaGl2ZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwYzJjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQWJzdHJhY3RBcmNoaXZlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZTsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUFyY2hpdmVIYW5kbGVyfSBpbnRlbmRlZCBmb3Igc3ViY2xhc3NpbmcKLSAqIGJ5IGNsaWVudHMuIFNlZSB7QGxpbmsgSUFyY2hpdmVIYW5kbGVyfSBmb3IgZGV0YWlscy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXJjaGl2ZUhhbmRsZXIgaW1wbGVtZW50cyBJQXJjaGl2ZUhhbmRsZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE4N2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkFyY2hpdmVSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLlppcFN0cmVhbUFyY2hpdmVTYXZlQWRhcHRlckltcGw7Ci0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElBcmNoaXZlTG9hZEFkYXB0ZXJ9IGludGVuZGVkIGZvcgotICogc3ViY2xhc3NpbmcgYnkgY2xpZW50cy4gU2VlIHtAbGluayBJQXJjaGl2ZUxvYWRBZGFwdGVyfSBmb3IgZGV0YWlscy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlQWRhcHRlciBpbXBsZW1lbnRzIElBcmNoaXZlTG9hZEFkYXB0ZXIgewotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgd2lzaCB0byBvdmVycmlkZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4ge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9IHJlcHJlc2VudGluZyBhCi0JICogZGlyZWN0b3J5IGVudHJ5IGZvciB0aGUgcGFzc2VkIHtAbGluayBJUGF0aH0uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElBcmNoaXZlUmVzb3VyY2UgY3JlYXRlRGlyZWN0b3J5KElQYXRoIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHsKLQkJdmVyaWZ5UmVsYXRpdmUoYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0JCUlBcmNoaXZlUmVzb3VyY2UgYUZpbGUgPSBudWxsOwotCQlhRmlsZSA9IG5ldyBBcmNoaXZlUmVzb3VyY2VJbXBsKCk7Ci0JCWFGaWxlLnNldFBhdGgoYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0JCWFGaWxlLnNldFR5cGUoSUFyY2hpdmVSZXNvdXJjZS5ESVJFQ1RPUllfVFlQRSk7Ci0JCWFGaWxlLnNldEFyY2hpdmUoZ2V0QXJjaGl2ZSgpKTsKLQkJcmV0dXJuIGFGaWxlOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0gcmVwcmVzZW50aW5nIGEKLQkgKiBmaWxlIGVudHJ5IGZvciB0aGUgcGFzc2VkIHtAbGluayBJUGF0aH0uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElBcmNoaXZlUmVzb3VyY2UgY3JlYXRlRmlsZShJUGF0aCBhcmNoaXZlUmVsYXRpdmVQYXRoKSB7Ci0JCXZlcmlmeVJlbGF0aXZlKGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQlJQXJjaGl2ZVJlc291cmNlIGFGaWxlID0gbnVsbDsKLQkJYUZpbGUgPSBuZXcgQXJjaGl2ZVJlc291cmNlSW1wbCgpOwotCQlhRmlsZS5zZXRQYXRoKGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQlhRmlsZS5zZXRUeXBlKElBcmNoaXZlUmVzb3VyY2UuRklMRV9UWVBFKTsKLQkJYUZpbGUuc2V0QXJjaGl2ZShnZXRBcmNoaXZlKCkpOwotCQlyZXR1cm4gYUZpbGU7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGVtcHR5IHtAbGluayBJQXJjaGl2ZVJlc291cmNlfSBtYW5maWVzdAotCSAqIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG1hbmlmZXN0UGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSUFyY2hpdmVSZXNvdXJjZSBjcmVhdGVNYW5pZmVzdChJUGF0aCBtYW5pZmVzdFBhdGgpIHsKLQkJdmVyaWZ5UmVsYXRpdmUobWFuaWZlc3RQYXRoKTsKLQkJSUFyY2hpdmVSZXNvdXJjZSBtYW5pZmVzdCA9IG51bGw7Ci0JCW1hbmlmZXN0ID0gbmV3IEFyY2hpdmVSZXNvdXJjZUltcGwoKSB7Ci0JCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCQkJU3RyaW5nIG1hbmlmZXN0Q29udGVudHMgPSAiTWFuaWZlc3QtVmVyc2lvbjogMS4wXHJcblxyXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtYW5pZmVzdENvbnRlbnRzLmdldEJ5dGVzKCkpKTsKLQkJCX0KLQkJfTsKLQkJbWFuaWZlc3Quc2V0UGF0aChtYW5pZmVzdFBhdGgpOwotCQltYW5pZmVzdC5zZXRUeXBlKElBcmNoaXZlUmVzb3VyY2UuRklMRV9UWVBFKTsKLQkJbWFuaWZlc3Quc2V0QXJjaGl2ZShnZXRBcmNoaXZlKCkpOwotCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVJlbGF0aXZlKElQYXRoIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHsKLQkJaWYgKGFyY2hpdmVSZWxhdGl2ZVBhdGguaXNBYnNvbHV0ZSgpICYmICFhcmNoaXZlUmVsYXRpdmVQYXRoLmVxdWFscyhJQXJjaGl2ZS5FTVBUWV9NT0RFTF9QQVRIKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYXJjaGl2ZVJlbGF0aXZlUGF0aCArICIgbXVzdCBiZSByZWxhdGl2ZS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbjsgc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoYXJjaGl2ZVJlc291cmNlLmdldFR5cGUoKSA9PSBJQXJjaGl2ZS5BUkNISVZFX1RZUEUpIHsKLQkJCUlBcmNoaXZlIHRoaXNBcmNoaXZlID0gKElBcmNoaXZlKSBhcmNoaXZlUmVzb3VyY2U7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZU91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCUlBcmNoaXZlU2F2ZUFkYXB0ZXIgc2F2ZUFkYXB0ZXIgPSBuZXcgWmlwU3RyZWFtQXJjaGl2ZVNhdmVBZGFwdGVySW1wbChieXRlT3V0KTsKLQkJCUFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlhcmNoaXZlT3B0aW9ucy5zZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuU0FWRV9BREFQVEVSLCBzYXZlQWRhcHRlcik7Ci0JCQl0cnkgewotCQkJCUlBcmNoaXZlRmFjdG9yeS5JTlNUQU5DRS5zYXZlQXJjaGl2ZSh0aGlzQXJjaGl2ZSwgYXJjaGl2ZU9wdGlvbnMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBzYXZlIG5lc3RlZCBBcmNoaXZlICIgKyBhcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpICsgIiBuZXN0ZWQgZXhjZXB0aW9uID0gIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZU91dC50b0J5dGVBcnJheSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uOyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uOyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb247IHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKi8KLQlwdWJsaWMgSUFyY2hpdmVSZXNvdXJjZSBnZXRBcmNoaXZlUmVzb3VyY2UoSVBhdGggcmVzb3VyY2VQYXRoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbjsgc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyBMaXN0PElBcmNoaXZlUmVzb3VyY2U+IGdldEFyY2hpdmVSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb247IHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BYnN0cmFjdEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0Fic3RyYWN0QXJjaGl2ZVNhdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMmM5NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0Fic3RyYWN0QXJjaGl2ZVNhdmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUFyY2hpdmVTYXZlQWRhcHRlcn0gaW50ZW5kZWQgZm9yCi0gKiBzdWJjbGFzc2luZyBieSBjbGllbnRzLiBTZWUge0BsaW5rIElBcmNoaXZlU2F2ZUFkYXB0ZXJ9IGZvciBkZXRhaWxzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcmNoaXZlU2F2ZUFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVBZGFwdGVyIGltcGxlbWVudHMgSUFyY2hpdmVTYXZlQWRhcHRlciB7Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFyY2hpdmVSZXNvdXJjZSBtYW5pZmVzdCA9IG51bGw7IAotCXByb3RlY3RlZCBJQXJjaGl2ZVJlc291cmNlIG1ldGFJbmYgPSBudWxsOyAKLQkKLQlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIGludCBHQVRIRVJfUkVTT1VSQ0VTX1RJQ0tTID0gMTAwMDsKLQkJZmluYWwgaW50IFNBVkVfUkVTT1VSQ0VTX1RJQ0tTID0gMTAwMDsKLQkJZmluYWwgaW50IEZJTklTSF9USUNLUyA9IDEwOwotCQlmaW5hbCBpbnQgVE9UQUxfVElDS1MgPSBHQVRIRVJfUkVTT1VSQ0VTX1RJQ0tTICsgU0FWRV9SRVNPVVJDRVNfVElDS1MgKyBGSU5JU0hfVElDS1M7Ci0JCUV4Y2VwdGlvbiBjYXVnaHRFeGNlcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIlNhdmluZyByZXNvdXJjZXMiLCBUT1RBTF9USUNLUyk7Ci0JCQkKLQkJCUxpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZmlsZXMgPSBnZXRBcmNoaXZlUmVzb3VyY2VzRm9yU2F2ZSgpOwotCQkJSVBhdGggbWFuaWZlc3RQYXRoID0gbmV3IFBhdGgoIk1FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCQlpZihnZXRBcmNoaXZlKCkuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobWFuaWZlc3RQYXRoKSl7Ci0JCQkJbWFuaWZlc3QgPSBnZXRBcmNoaXZlKCkuZ2V0QXJjaGl2ZVJlc291cmNlKG1hbmlmZXN0UGF0aCk7Ci0JCQl9Ci0JCQlJUGF0aCBtZXRhSW5mUGF0aCA9IG1hbmlmZXN0UGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJaWYoZ2V0QXJjaGl2ZSgpLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKG1ldGFJbmZQYXRoKSl7Ci0JCQkJbWV0YUluZiA9IGdldEFyY2hpdmUoKS5nZXRBcmNoaXZlUmVzb3VyY2UobWV0YUluZlBhdGgpOwotCQkJfQotCQkJCQotCQkJbW9uaXRvci53b3JrZWQoR0FUSEVSX1JFU09VUkNFU19USUNLUyk7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIHNhdmVTdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBTQVZFX1JFU09VUkNFU19USUNLUyk7Ci0JCQlpbnQgU1VCX1NBVkVfVElDS1MgPSAxMDsKLQkJCWludCBTVUJfVE9UQUxfVElDS1MgPSBTVUJfU0FWRV9USUNLUyAqIChmaWxlcy5zaXplKCkgKyAyKTsKLQkJCXRyeSB7Ci0JCQkJc2F2ZVN1Yk1vbml0b3IuYmVnaW5UYXNrKCJTYXZpbmcgcmVzb3VyY2VzIiwgU1VCX1RPVEFMX1RJQ0tTKTsKLQkJCQlpZihtYW5pZmVzdCAhPSBudWxsKXsKLQkJCQkJc2F2ZShtYW5pZmVzdCk7Ci0JCQkJfQotCQkJCXNhdmVTdWJNb25pdG9yLndvcmtlZChTVUJfU0FWRV9USUNLUyk7Ci0JCQkJaWYobWV0YUluZiAhPSBudWxsKXsKLQkJCQkJc2F2ZShtZXRhSW5mKTsKLQkJCQl9Ci0JCQkJc2F2ZVN1Yk1vbml0b3Iud29ya2VkKFNVQl9TQVZFX1RJQ0tTKTsKLQkJCQlmb3IgKElBcmNoaXZlUmVzb3VyY2UgZmlsZSA6IGZpbGVzKSB7Ci0JCQkJCWlmIChzaG91bGRTYXZlKGZpbGUpKSB7Ci0JCQkJCQlzYXZlKGZpbGUpOwotCQkJCQl9Ci0JCQkJCXNhdmVTdWJNb25pdG9yLndvcmtlZChTVUJfU0FWRV9USUNLUyk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlzYXZlU3ViTW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpewotCQkJY2F1Z2h0RXhjZXB0aW9uID0gZTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJZmluaXNoKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbihlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJaWYoY2F1Z2h0RXhjZXB0aW9uICE9IG51bGwpewotCQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uKGNhdWdodEV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlc0ZvclNhdmUoKSB7Ci0JCUxpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZmlsZXMgPSBnZXRBcmNoaXZlKCkuZ2V0QXJjaGl2ZVJlc291cmNlcygpOwotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBzYXZlIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0uCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNhdmUoSUFyY2hpdmVSZXNvdXJjZSBmaWxlKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3ViY2xhc3Nlc3Mgc2hvdWxkIG92ZXJyaWRlIHRvIGF2b2lkIHNhdmluZyB0aGUgc3BlY2lmaWVkCi0JICoge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9LiBlLmcuIHRvIGF2b2lkIHNhdmluZyBzb3VyY2UgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShJQXJjaGl2ZVJlc291cmNlIGZpbGUpIHsKLQkJaWYoZmlsZSA9PSBtYW5pZmVzdCB8fCBmaWxlID09IG1ldGFJbmYpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0FyY2hpdmVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYjQyMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0FyY2hpdmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM3OTY0Mzk0MTUzMTA5MDMzMTdMOwotCi0JcHVibGljIEFyY2hpdmVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKGNhdXNlKTsKLQl9Ci0JCi0JcHVibGljIEFyY2hpdmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSl7Ci0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGYwYTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDEwMzIyMDE2OTEzNDMzNDExMkw7Ci0KLQlwdWJsaWMgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKXsKLQkJc3VwZXIoY2F1c2UpOwotCX0KLQkKLQlwdWJsaWMgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKXsKLQkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzYTBlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzM2NjExNjEyMjc3NzcyMTE0OEw7Ci0KLQlwdWJsaWMgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKXsKLQkJc3VwZXIoY2F1c2UpOwotCX0KLQkKLQlwdWJsaWMgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0FyY2hpdmVPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQXJjaGl2ZU9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiMzRmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQXJjaGl2ZU9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICoge0BsaW5rIEFyY2hpdmVPcHRpb25zfSBpcyBhIG1lYW5zIGZvciBwYXNzaW5nIGRhdGEgcGVydGFpbmluZyB0byBvcGVuaW5nIGFuZAotICogc2F2aW5nIHtAbGluayBJQXJjaGl2ZX1zLiBUaGlzIGNsYXNzIGlzIHNpbXBseSBhIHdyYXBwZXIgYXJvdW5kIHtAbGluayBNYXB9Ci0gKiBhbmQgYSBmZXcgd2VsbCBkZWZpbmVkIE9wdGlvbktleXMuIENsaWVudHMgYXJlIHdlbGNvbWUgdG8gZGVmaW5lIGFuZCBzZXQvZ2V0Ci0gKiBhbnkgb3B0aW9ucyBkZWVtZWQgbmVjZXNzYXJ5LgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlT3B0aW9ucyB7Ci0KLQkvLyBUT0RPIGFkZCBkZWJ1ZyB0cmFjaW5nIHN1cHBvcnQKLQotCS8qKgotCSAqIEFuIE9wdGlvbktleSB1c2VkIGZvciBzcGVjaWZ5aW5nIGFuIHtAbGluayBJQXJjaGl2ZUxvYWRBZGFwdGVyfS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX0FEQVBURVIgPSAiTE9BRF9BREFQVEVSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gT3B0aW9uS2V5IHVzZWQgZm9yIHNwZWNpZnlpbmcgYW4ge0BsaW5rIElBcmNoaXZlU2F2ZUFkYXB0ZXJ9LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQURBUFRFUiA9ICJTQVZFX0FEQVBURVIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQW4gT3B0aW9uS2V5IHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlIHBhdGggZm9yIHRoZSBBcmNoaXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSQ0hJVkVfUEFUSCA9ICJBUkNISVZFX1BBVEgiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQW4gT3B0aW9uS2V5IHVzZWQgdG8gc3BlY2lmeSB0aGUgcGFyZW50IEFyY2hpdmUgdXNlZCB3aGVuIG9wZW5pbmcgbmVzdGVkIEFyY2hpdmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9BUkNISVZFID0gIlBBUkVOVF9BUkNISVZFIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgTWFwIG9wdGlvbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIEFyY2hpdmVPcHRpb25zKCkgewotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbihPYmplY3Qgb3B0aW9uS2V5KSB7Ci0JCXJldHVybiBvcHRpb25zTWFwLmNvbnRhaW5zS2V5KG9wdGlvbktleSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRPcHRpb24oT2JqZWN0IG9wdGlvbktleSkgewotCQlyZXR1cm4gb3B0aW9uc01hcC5nZXQob3B0aW9uS2V5KTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBzZXRPcHRpb24oT2JqZWN0IG9wdGlvbktleSwgT2JqZWN0IG9wdGlvblZhbHVlKSB7Ci0JCW9wdGlvbnNNYXAucHV0KG9wdGlvbktleSwgb3B0aW9uVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVPcHRpb24oT2JqZWN0IG9wdGlvbktleSl7Ci0JCW9wdGlvbnNNYXAucmVtb3ZlKG9wdGlvbktleSk7Ci0JfQotCQotCXB1YmxpYyBTZXQga2V5U2V0KCl7Ci0JCXJldHVybiBvcHRpb25zTWFwLmtleVNldCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0FyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0FyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmI4ZTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkxMDI3MDQzNzk0MTUzNjYwNjhMOwotCi0JcHVibGljIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihjYXVzZSk7Ci0JfQotCQotCXB1YmxpYyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjNmMTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBAYXV0aG9yIGphc2hvbGwKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJjaGl2ZSBleHRlbmRzIElBcmNoaXZlUmVzb3VyY2UgewotCi0JSVBhdGggRU1QVFlfTU9ERUxfUEFUSCA9IG5ldyBQYXRoKCIvIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBib29sZWFuIGlzT3BlbigpOwotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoSVBhdGggYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0gc3BlY2lmaWVkIGJ5IHRoZSBhcmNoaXZlIHJlbGF0aXZlCi0JICogcGF0aC4gVGhyb3dzIGEge0BsaW5rIFJ1bnRpbWVFeGNlcHRpb259IGlmIHRoZSBzcGVjaWZpZWQgcGF0aCBpcyBub3QKLQkgKiByZWxhdGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJjaGl2ZVJlbGF0aXZlUGF0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElBcmNoaXZlUmVzb3VyY2UgZ2V0QXJjaGl2ZVJlc291cmNlKElQYXRoIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYW4ge0BsaW5rIElBcmNoaXZlfSBmb3IgdGhlIHNwZWNpZmllZCBhcmNoaXZlUmVzb3VyY2UuIElmIHRoZQotCSAqIHtAbGluayBJQXJjaGl2ZX0gaXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkLCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0Ci0JICogcmV0dXJuZWQgYnkge0BsaW5rICNnZXROZXN0ZWRBcmNoaXZlcygpfS4gQWxzbywgdGhlIG9yaWdpbmFsCi0JICoge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoaXMge0BsaW5rIElBcmNoaXZlfSdzCi0JICogbGlzdCBvZiB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX1zIHJldHVybmVkIGJ5Ci0JICoge0BsaW5rICNnZXRBcmNoaXZlUmVzb3VyY2VzKCl9IGFuZCByZXBsYWNlZCB3aXRoIHRoZSByZXR1cm5lZAotCSAqIHtAbGluayBJQXJjaGl2ZX0uCi0JICogCi0JICogQHBhcmFtIGFyY2hpdmVSZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJQXJjaGl2ZSBnZXROZXN0ZWRBcmNoaXZlKElBcmNoaXZlUmVzb3VyY2UgYXJjaGl2ZVJlc291cmNlKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIExpc3Q8SUFyY2hpdmU+IGdldE5lc3RlZEFyY2hpdmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9cyBpbiB0aGUgYXJjaGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlcygpOwotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdCgpOwotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpOwotCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdCgpIHRocm93cyBBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwotCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHRocm93cyBBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwotCi0JcHVibGljIEFyY2hpdmVPcHRpb25zIGdldEFyY2hpdmVPcHRpb25zKCk7Ci0KLQlwdWJsaWMgSUFyY2hpdmVMb2FkQWRhcHRlciBnZXRMb2FkQWRhcHRlcigpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYjBiYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0lBcmNoaXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi0vKioKLSAqIEFuIHtAbGluayBJQXJjaGl2ZUFkYXB0ZXJ9IHByb3ZpZGVzIGEgYnJpZGdlIHNvIGFueSB7QGxpbmsgT2JqZWN0fSAob3IKLSAqIGNvbGxlY3Rpb24gb2Yge0BsaW5rIE9iamVjdH1zKSBtYXkgYmUgcmVwcmVzZW50ZWQgYXMgYW4ge0BsaW5rIElBcmNoaXZlfS4KLSAqIEVhY2gge0BsaW5rIElBcmNoaXZlQWRhcHRlcn0gc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBvbmUge0BsaW5rIElBcmNoaXZlfSBhdCBhCi0gKiB0aW1lLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogQ2xpZW50cyBzaG91bGQgaW5zdGVhZCBzdWJjbGFzcyB7QGxpbmsgQWJzdHJhY3RBcmNoaXZlQWRhcHRlcn0gb3Igb25lIGlmIGl0cwotICogc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJjaGl2ZUFkYXB0ZXIgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUge0BsaW5rIElBcmNoaXZlfSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhZGFwdGVyLiBFdmVyeQotCSAqIHtAbGluayBJQXJjaGl2ZUFkYXB0ZXJ9IGlzIGFzc29jaWF0ZWQgd2l0aCBleGFjdGx5IG9uZSB7QGxpbmsgSUFyY2hpdmV9LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUFyY2hpdmUgZ2V0QXJjaGl2ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUge0BsaW5rIElBcmNoaXZlfSBmb3IgdGhpcyB7QGxpbmsgSUFyY2hpdmVBZGFwdGVyfS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhZDY2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlRmFjdG9yeUltcGw7Ci0KLS8qKgotICoge0BsaW5rIElBcmNoaXZlRmFjdG9yeX0gaXMgdGhlIHdoZXJlIGNsaWVudHMgc2hvdWxkIG9wZW4gYW5kIHNhdmUgYXJjaGl2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhyb3VnaCB7QGxpbmsgI0lOU1RBTkNFfQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBcmNoaXZlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBBIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJQXJjaGl2ZUZhY3Rvcnl9LgotCSAqLwotCUlBcmNoaXZlRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBBcmNoaXZlRmFjdG9yeUltcGwoKTsKLQotCXB1YmxpYyBJQXJjaGl2ZSBvcGVuQXJjaGl2ZShJUGF0aCBhcmNoaXZlUGF0aCkgdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBhcmNoaXZlT3B0aW9ucykgdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIGNsb3NlQXJjaGl2ZShJQXJjaGl2ZSBhcmNoaXZlKTsKLQotCXB1YmxpYyB2b2lkIHNhdmVBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUsIElQYXRoIG91dHB1dFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNhdmVBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUsIEFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiNWMxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi0vKioKLSAqIEFuIHtAbGluayBJQXJjaGl2ZUhhbmRsZXJ9IGhhbmRsZXMgYSBzcGVjaWZpYyB0eXBlIG9mIHtAbGluayBJQXJjaGl2ZX0uCi0gKiB7QGxpbmsgSUFyY2hpdmVIYW5kbGVyfXMgYXJlIGRlZmluZWQgdmlhIGV4dGVuc2lvbiBwb2ludHMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiBDbGllbnRzIHNob3VsZCBpbnN0ZWFkIHN1YmNsYXNzIHtAbGluayBBYnN0cmFjdEFyY2hpdmVIYW5kbGVyfSBvciBvbmUgaWYgaXRzCi0gKiBzdWJjbGFzc2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBcmNoaXZlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMge0BsaW5rIElBcmNoaXZlSGFuZGxlcn0gY2FuIGhhbmRsZQotCSAqIHRoZSBzcGVjaWZpZWQge0BsaW5rIElBcmNoaXZlfS4gVmFyaW91cyB7QGxpbmsgSUFyY2hpdmV9IHR5cGVzIG1heSBiZQotCSAqIGRldGVybWluZWQgYnkgZXhhbWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUge0BsaW5rIElBcmNoaXZlfS4gZS5nLiBieQotCSAqIHRoZSBleGlzdGVuY2Ugb2YgY2VydGFpbiB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX1zIG9yIHRoZWlyIGNvbnRlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBhcmNoaXZlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhbmRsZXNBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVMb2FkQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0lBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExZWNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICoge0BsaW5rIElBcmNoaXZlTG9hZEFkYXB0ZXJ9IGtub3dzIGhvdyB0byBsb2FkIG9yIHJlYWQgdGhlIGNvbnRlbnRzIGZvciBhbgotICoge0BsaW5rIElBcmNoaXZlfS4gVGhpcyBwcm92aWRlcyBhIGRlbGVnYXRpb24gbW9kZWwgZm9yIHJlYWRpbmcgaW4gdGhlCi0gKiBjb250ZW50cyBvZiBhbiB7QGxpbmsgSUFyY2hpdmV9LgotICogCi0gKiBCeSBleHRlbmRpbmcge0BsaW5rIEFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyfSBhbmQgdXNpbmcKLSAqIHtAbGluayBBcmNoaXZlT3B0aW9uc30gY2xpZW50cyBtYXkgInBsdWcgaW4iIHRvIGFuIGluc3RhbmNlIG9mIGFuCi0gKiB7QGxpbmsgSUFyY2hpdmV9LiBFeGFtcGxlcyBtaWdodCBpbmNsdWRlIHJlYWRpbmcgZnJvbSBhIHppcCBmaWxlLCBmcm9tIGFuCi0gKiBpbnB1dCBzdHJlYW0sIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLCBvciBmcm9tIGEgd29ya2JlbmNoLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogQ2xpZW50cyBzaG91bGQgaW5zdGVhZCBzdWJjbGFzcyB7QGxpbmsgQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXJ9IG9yIG9uZSBpZgotICogaXRzIHN1YmNsYXNzZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFyY2hpdmVMb2FkQWRhcHRlciBleHRlbmRzIElBcmNoaXZlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gcmVsZWFzZSBhbnkgcmVzb3VyY2VzIGhlbGQgYnkgdGhpcyB7QGxpbmsgSUFyY2hpdmVMb2FkQWRhcHRlcn0uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB7QGxpbmsgSUFyY2hpdmVMb2FkQWRhcHRlcn0gY29udGFpbnMKLQkgKiB0aGUge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9IHNwZWNpZmllZCBieSB0aGUgcGFzc2VkIHtAbGluayBJUGF0aH0uIElmCi0JICogdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIHRoaXMKLQkgKiB7QGxpbmsgSUFyY2hpdmVMb2FkQWRhcHRlcn0gc2hvdWxkIGJlIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IHJldHVybiBhbgotCSAqIHtAbGluayBJQXJjaGl2ZVJlc291cmNlfSBmcm9tIHtAbGluayAjZ2V0QXJjaGl2ZVJlc291cmNlKElQYXRoKX0gdXNpbmcgYW4KLQkgKiBlcXVhbCBwYXNzZWQge0BsaW5rIElQYXRofS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VQYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKElQYXRoIHJlc291cmNlUGF0aCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0gc3BlY2lmaWVkIGJ5IHRoZSBwYXNzZWQKLQkgKiB7QGxpbmsgSVBhdGh9LiBBIHtAbGluayBGaWxlTm90Rm91bmRFeGNlcHRpb259IGlzIHRocm93biBpZiB0aGlzCi0JICoge0BsaW5rIElBcmNoaXZlTG9hZEFkYXB0ZXJ9IGRvZXMgbm90IGNvbnRhaW4gdGhlIHtAbGluayBJQXJjaGl2ZVJlc291cmNlfQotCSAqIGFzIHNwZWNpZmllZCBieSB7QGxpbmsgI2NvbnRhaW5zQXJjaGl2ZVJlc291cmNlKElQYXRoKX0uCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlUGF0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJQXJjaGl2ZVJlc291cmNlIGdldEFyY2hpdmVSZXNvdXJjZShJUGF0aCByZXNvdXJjZVBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEge0BsaW5rIExpc3R9IG9mIGFsbCB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0gY29udGFpbmVkIGJ5IHRoaXMKLQkgKiB7QGxpbmsgSUFyY2hpdmVMb2FkQWRhcHRlcn0uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IDxJQXJjaGl2ZVJlc291cmNlPiBnZXRBcmNoaXZlUmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHtAbGluayBJbnB1dFN0cmVhbX0gZm9yIHRoZSBzcGVjaWZpZWQge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9LgotCSAqIElmIHRoZSBzcGVjaWZpZWQge0BsaW5rIElBcmNoaXZlUmVzb3VyY2V9IGlzIG5vdCBjb250YWluZWQgYnkgdGhpcwotCSAqIHtAbGluayBJQXJjaGl2ZUxvYWRBZGFwdGVyfSwgdGhlbiBhIHtAbGluayBGaWxlTm90Rm91bmRFeGNlcHRpb259IGlzCi0JICogdGhyb3duLiBBbiB7QGxpbmsgSU9FeGNlcHRpb259IGlzIHRocm93biBmb3IgYWxsIG90aGVyIGVycm9ycy4KLQkgKiAKLQkgKiBAcGFyYW0gYXJjaGl2ZVJlc291cmNlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMge0BsaW5rIElBcmNoaXZlTG9hZEFkYXB0ZXJ9IGNvbnRhaW5zCi0JICogYSBtb2RlbCBPYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBwYXNzZWQge0BsaW5rIElQYXRofS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWxPYmplY3RQYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zTW9kZWxPYmplY3QoSVBhdGggbW9kZWxPYmplY3RQYXRoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGVsIE9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIHBhc3NlZCB7QGxpbmsgSVBhdGh9LiBBbgotCSAqIHtAbGluayBBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9ufSBpcyB0aHJvd24gaWYgdGhpcwotCSAqIHtAbGluayBJQXJjaGl2ZUxvYWRBZGFwdGVyfSBkb2VzIG5vdCBjb250YWluIHRoZSBtb2RlbCBPYmplY3QgYXMKLQkgKiBzcGVjaWZpZWQgYnkge0BsaW5rICNjb250YWluc01vZGVsT2JqZWN0KElQYXRoKX0uCi0JICogCi0JICogQHBhcmFtIG1vZGVsT2JqZWN0UGF0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZVJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGRlNzcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9JQXJjaGl2ZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIAotICogQGF1dGhvciBqYXNob2xsCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJjaGl2ZVJlc291cmNlIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IFVOS05PV05fVFlQRSA9IC0xOwotCi0JcHVibGljIHN0YXRpYyBpbnQgRklMRV9UWVBFID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgaW50IERJUkVDVE9SWV9UWVBFID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgaW50IEFSQ0hJVkVfVFlQRSA9IDI7Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpOwotCi0JcHVibGljIHZvaWQgc2V0UGF0aChJUGF0aCBwYXRoKTsKLQotCXB1YmxpYyBsb25nIGdldFNpemUoKTsKLQotCXB1YmxpYyB2b2lkIHNldFNpemUobG9uZyBzaXplKTsKLQotCXB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpOwotCi0JcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgbGFzdE1vZGlmaWVkKTsKLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpOwotCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgZmlsZVR5cGUpOwotCi0JcHVibGljIElBcmNoaXZlIGdldEFyY2hpdmUoKTsKLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGlucHV0IHN0cmVhbSBmb3IgdGhpcyB7QGxpbmsgSUFyY2hpdmVSZXNvdXJjZX0gaWYgaXRzIHR5cGUgaXMKLQkgKiBlaXRoZXIgYSB7QGxpbmsgI0ZJTEVfVFlQRX0gb3Ige0BsaW5rICNBUkNISVZFX1RZUEV9IGFzIGRlZmluZWQgYnkKLQkgKiB7QGxpbmsgI2dldFR5cGUoKX0uIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkIGlmIHRoZSB0eXBlIGlzCi0JICoge0BsaW5rICNESVJFQ1RPUllfVFlQRX0uCi0JICogCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVTYXZlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0lBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlZjgwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvSUFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElBcmNoaXZlU2F2ZUFkYXB0ZXIgZXh0ZW5kcyBJQXJjaGl2ZUFkYXB0ZXIgewotCi0JLyoqCi0JICogQ2xvc2UgYW5kIHJlbGVhc2UgYW55IHJlc291cmNlcyBiZWluZyBoZWxkIGJ5IHRoaXMgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5vdGlmeSByZXNvdXJjZXMgaWYgbmVjZXNzYXJ5IHRoYXQgc2F2ZSBpcyBjb21wbGV0ZSBmb3IgdGhpcyBhcmNoaXZlLAotCSAqIGJlaW5nIGNhcmVmdWwgbm90IHRvIGNsb3NlIGFueSByZXNvdXJjZXMgdGhhdCBhIHBhcmVudCBhcmNoaXZlIG1pZ2h0Ci0JICogc3RpbGwgYmUgdXNpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzVhODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlU2F2ZUFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlRmFjdG9yeUltcGwgaW1wbGVtZW50cyBJQXJjaGl2ZUZhY3RvcnkgewotCi0JcHVibGljIElBcmNoaXZlIG9wZW5BcmNoaXZlKElQYXRoIGFyY2hpdmVQYXRoKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGFyY2hpdmVQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCVppcEZpbGUgemlwRmlsZTsKLQkJdHJ5IHsKLQkJCXppcEZpbGUgPSBBcmNoaXZlVXRpbC5uZXdaaXBGaWxlKGZpbGUpOwotCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSkgewotCQkJQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIG9wZW5GYWlsdXJlRXhjZXB0aW9uID0gbmV3IEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbihlKTsKLQkJCXRocm93IG9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gb3BlbkZhaWx1cmVFeGNlcHRpb24gPSBuZXcgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKGUpOwotCQkJdGhyb3cgb3BlbkZhaWx1cmVFeGNlcHRpb247Ci0JCX0KLQkJWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwgbG9hZEFkYXB0ZXIgPSBuZXcgWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwoemlwRmlsZSk7Ci0JCUFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCWFyY2hpdmVPcHRpb25zLnNldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5MT0FEX0FEQVBURVIsIGxvYWRBZGFwdGVyKTsKLQkJYXJjaGl2ZU9wdGlvbnMuc2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLkFSQ0hJVkVfUEFUSCwgYXJjaGl2ZVBhdGgpOwotCQlyZXR1cm4gb3BlbkFyY2hpdmUoYXJjaGl2ZU9wdGlvbnMpOwotCX0KLQotCS8vIFRPRE8gYWRkIHRyYWNpbmcgc3VwcG9ydAotCS8vIGluZm8gaW4gc3BlYyBwYWdlIDE1NAotCXB1YmxpYyBJQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBhcmNoaXZlT3B0aW9ucykgdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmVJbXBsIGFyY2hpdmUgPSBuZXcgQXJjaGl2ZUltcGwoYXJjaGl2ZU9wdGlvbnMpOwotCQlhcmNoaXZlLnNldEFyY2hpdmVGYWN0b3J5KHRoaXMpOwotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZUFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSkgewotCQkoKEFyY2hpdmVJbXBsKSBhcmNoaXZlKS5jbG9zZSgpOwotCQkvLyBUT0RPIGFkZCB0cmFjaW5nIHN1cHBvcnQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZUFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSwgSVBhdGggb3V0cHV0UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJZmluYWwgaW50IFNBVkVfVElDS1MgPSAxOTg7Ci0JCWZpbmFsIGludCBDTEVBTlVQX1RJQ0tTID0gMTsKLQkJZmluYWwgaW50IFRPVEFMX1RJQ0tTID0gU0FWRV9USUNLUyArIENMRUFOVVBfVElDS1M7Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiU2F2aW5nIGFyY2hpdmUgdG86ICIgKyBvdXRwdXRQYXRoLnRvT1NTdHJpbmcoKSwgVE9UQUxfVElDS1MpOwotCQkJU3RyaW5nIGFVcmkgPSBvdXRwdXRQYXRoLnRvT1NTdHJpbmcoKTsKLQkJCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoYVVyaSk7Ci0JCQlBcmNoaXZlVXRpbC5jaGVja1dyaXRlYWJsZShhRmlsZSk7Ci0JCQlib29sZWFuIGZpbGVFeGlzdGVkID0gYUZpbGUuZXhpc3RzKCk7Ci0JCQlJQXJjaGl2ZVNhdmVBZGFwdGVyIGFTYXZlQWRhcHRlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWphdmEuaW8uRmlsZSBkZXN0aW5hdGlvbkZpbGUgPSBmaWxlRXhpc3RlZCA/IEFyY2hpdmVVdGlsLmNyZWF0ZVRlbXBGaWxlKGFVcmksIGFGaWxlLmdldENhbm9uaWNhbEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkpIDogYUZpbGU7Ci0JCQkJYVNhdmVBZGFwdGVyID0gY3JlYXRlU2F2ZUFkYXB0ZXJGb3JKYXIoZGVzdGluYXRpb25GaWxlKTsKLQkJCQlhU2F2ZUFkYXB0ZXIuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJCQlzYXZlKGFTYXZlQWRhcHRlciwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBTQVZFX1RJQ0tTKSk7Ci0KLQkJCQlhU2F2ZUFkYXB0ZXIuY2xvc2UoKTsKLQkJCQlpZiAoZmlsZUV4aXN0ZWQpIHsKLQkJCQkJQXJjaGl2ZVV0aWwuY2xlYW51cEFmdGVyVGVtcFNhdmUoYVVyaSwgYUZpbGUsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JCQkJfQotCQkJCW1vbml0b3Iud29ya2VkKENMRUFOVVBfVElDS1MpOwotCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbigiRXJyb3Igc2F2aW5nIGFyY2hpdmU6ICIgKyBhcmNoaXZlICsgIiB0byBvdXRwdXQgcGF0aDogIiArIG91dHB1dFBhdGgsIGUpOwotCQkJfSBjYXRjaCAoQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIGZhaWx1cmUpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoYVNhdmVBZGFwdGVyICE9IG51bGwpCi0JCQkJCQlhU2F2ZUFkYXB0ZXIuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB3ZVRyaWVkKSB7Ci0JCQkJCS8vIElnbm9yZQotCQkJCX0KLQkJCQlpZiAoIWZpbGVFeGlzdGVkKQotCQkJCQlhRmlsZS5kZWxldGUoKTsKLQkJCQl0aHJvdyBmYWlsdXJlOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUFyY2hpdmVTYXZlQWRhcHRlciBjcmVhdGVTYXZlQWRhcHRlckZvckphcihqYXZhLmlvLkZpbGUgYUZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlLmV4aXN0cygpICYmIGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhlIHNwZWNpZmllZCBmaWxlOiAiICsgYUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnkiKTsKLQkJfQotCQlqYXZhLmlvLkZpbGUgcGFyZW50ID0gYUZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlwYXJlbnQubWtkaXJzKCk7Ci0JCWphdmEuaW8uT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oYUZpbGUpOwotCQlyZXR1cm4gbmV3IFppcFN0cmVhbUFyY2hpdmVTYXZlQWRhcHRlckltcGwob3V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElBcmNoaXZlU2F2ZUFkYXB0ZXIgYW5BZGFwdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJYW5BZGFwdGVyLnNhdmUobW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWFuQWRhcHRlci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlQXJjaGl2ZShJQXJjaGl2ZSBhcmNoaXZlLCBBcmNoaXZlT3B0aW9ucyBhcmNoaXZlT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJZmluYWwgaW50IFNBVkVfVElDS1MgPSAxOTg7Ci0JCWZpbmFsIGludCBDTE9TRV9USUNLUyA9IDI7Ci0JCWZpbmFsIGludCBUT1RBTF9USUNLUyA9IFNBVkVfVElDS1MgKyBDTE9TRV9USUNLUzsKLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCJTYXZpbmcgYXJjaGl2ZSIsIFRPVEFMX1RJQ0tTKTsKLQkJCUlBcmNoaXZlU2F2ZUFkYXB0ZXIgYVNhdmVBZGFwdGVyID0gKElBcmNoaXZlU2F2ZUFkYXB0ZXIpIGFyY2hpdmVPcHRpb25zLmdldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5TQVZFX0FEQVBURVIpOwotCQkJdHJ5IHsKLQkJCQlhU2F2ZUFkYXB0ZXIuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJCQlzYXZlKGFTYXZlQWRhcHRlciwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBTQVZFX1RJQ0tTKSk7Ci0KLQkJCQlhU2F2ZUFkYXB0ZXIuY2xvc2UoKTsKLQkJCQltb25pdG9yLndvcmtlZChDTE9TRV9USUNLUyk7Ci0JCQl9IGNhdGNoIChBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24gZmFpbHVyZSkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChhU2F2ZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJCWFTYXZlQWRhcHRlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHdlVHJpZWQpIHsKLQkJCQkJLy8gSWdub3JlCi0JCQkJfQotCQkJCXRocm93IGZhaWx1cmU7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbigiRXJyb3Igc2F2aW5nIGFyY2hpdmU6ICIgKyBhcmNoaXZlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDYwMWNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVMb2FkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIEFyY2hpdmVJbXBsIGV4dGVuZHMgQXJjaGl2ZVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIElBcmNoaXZlIHsKLQotCXByaXZhdGUgQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnM7Ci0KLQlwcml2YXRlIElBcmNoaXZlTG9hZEFkYXB0ZXIgbG9hZEFkYXB0ZXI7Ci0KLQlwcml2YXRlIGNsYXNzIEFyY2hpdmVGaWxlSW5kZXggewotCQlwcml2YXRlIE1hcDxJUGF0aCwgSUFyY2hpdmVSZXNvdXJjZT4gaW5kZXggPSBuZXcgSGFzaE1hcDxJUGF0aCwgSUFyY2hpdmVSZXNvdXJjZT4oKTsKLQotCQlwcml2YXRlIExpc3Q8SUFyY2hpdmU+IG5lc3RlZEFyY2hpdmVzID0gbnVsbDsKLQotCQlwcml2YXRlIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZnVsbEluZGV4ID0gbnVsbDsKLQotCQlwcml2YXRlIGJvb2xlYW4gZnVsbHlJbmRleGVkID0gZmFsc2U7Ci0KLQkJcHVibGljIEFyY2hpdmVGaWxlSW5kZXgoKSB7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8SUFyY2hpdmU+IGdldE5lc3RlZEFyY2hpdmVzKCkgewotCQkJaWYgKG5lc3RlZEFyY2hpdmVzID09IG51bGwpIHsKLQkJCQluZXN0ZWRBcmNoaXZlcyA9IG5ldyBBcnJheUxpc3Q8SUFyY2hpdmU+KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmVzdGVkQXJjaGl2ZXM7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnNGaWxlKElQYXRoIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHsKLQkJCUFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyLnZlcmlmeVJlbGF0aXZlKGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQkJcmV0dXJuIGluZGV4LmNvbnRhaW5zS2V5KGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCBJQXJjaGl2ZVJlc291cmNlIGdldEZpbGUoSVBhdGggYXJjaGl2ZVJlbGF0aXZlUGF0aCkgewotCQkJQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIudmVyaWZ5UmVsYXRpdmUoYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0JCQlJQXJjaGl2ZVJlc291cmNlIGFGaWxlID0gaW5kZXguZ2V0KGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQkJcmV0dXJuIGFGaWxlOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG5vdGVFbXB0eUZpbGUoSVBhdGggYXJjaGl2ZVJlbGF0aXZlUGF0aCkgewotCQkJdmVyaWZ5Tm90RnVsbHlJbmRleGVkKCk7Ci0JCQlBYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlci52ZXJpZnlSZWxhdGl2ZShhcmNoaXZlUmVsYXRpdmVQYXRoKTsKLQkJCWluZGV4LnB1dChhcmNoaXZlUmVsYXRpdmVQYXRoLCBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRGaWxlKElBcmNoaXZlUmVzb3VyY2UgYUZpbGUpIHsKLQkJCXZlcmlmeU5vdEZ1bGx5SW5kZXhlZCgpOwotCQkJQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIudmVyaWZ5UmVsYXRpdmUoYUZpbGUuZ2V0UGF0aCgpKTsKLQkJCWluZGV4LnB1dChhRmlsZS5nZXRQYXRoKCksIGFGaWxlKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0Z1bGx5SW5kZXhlZCgpIHsKLQkJCXJldHVybiBmdWxseUluZGV4ZWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmdWxseUluZGV4KExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZmlsZXMpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChmdWxseUluZGV4ZWQpIHsKLQkJCQkJdmVyaWZ5Tm90RnVsbHlJbmRleGVkKCk7Ci0JCQkJfQotCQkJCWZ1bGx5SW5kZXhlZCA9IHRydWU7Ci0JCQl9Ci0KLQkJCWZvciAoSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSA6IGZpbGVzKSB7Ci0JCQkJQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIudmVyaWZ5UmVsYXRpdmUoYUZpbGUuZ2V0UGF0aCgpKTsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJaWYgKCFpbmRleC5jb250YWluc0tleShhRmlsZS5nZXRQYXRoKCkpKSB7Ci0JCQkJCQlpbmRleC5wdXQoYUZpbGUuZ2V0UGF0aCgpLCBhRmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0RnVsbEluZGV4KCkgewotCQkJaWYgKCFpc0Z1bGx5SW5kZXhlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZpbGUgbGlzdCBoYXMgbm90IGJlZW4gZnVsbHkgaW5kZXhlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZnVsbEluZGV4ID09IG51bGwpIHsKLQkJCQlMaXN0PElBcmNoaXZlUmVzb3VyY2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElBcmNoaXZlUmVzb3VyY2U+KCk7Ci0JCQkJbGlzdC5hZGRBbGwoaW5kZXgudmFsdWVzKCkpOwotCQkJCWZ1bGxJbmRleCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobGlzdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZnVsbEluZGV4OwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHZlcmlmeU5vdEZ1bGx5SW5kZXhlZCgpIHsKLQkJCWlmIChpc0Z1bGx5SW5kZXhlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHRpbmcgdG8gbW9kaWZ5IGEgZnVsbHkgaW5kZXhlZCBmaWxlIGxpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgQXJjaGl2ZUZpbGVJbmRleCBhcmNoaXZlRmlsZUluZGV4ID0gbmV3IEFyY2hpdmVGaWxlSW5kZXgoKTsKLQotCXByaXZhdGUgRmFpbGVkVG9DbG9zZUV4Y2VwdGlvbiBvcGVuZW5kQnkgPSBudWxsOwotCi0JcHVibGljIEFyY2hpdmVJbXBsKEFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zKSB7Ci0JCXNldFR5cGUoSUFyY2hpdmVSZXNvdXJjZS5BUkNISVZFX1RZUEUpOwotCQlzZXRBcmNoaXZlT3B0aW9ucyhhcmNoaXZlT3B0aW9ucyk7Ci0JCWxvYWRBZGFwdGVyID0gKElBcmNoaXZlTG9hZEFkYXB0ZXIpIGdldEFyY2hpdmVPcHRpb25zKCkuZ2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLkxPQURfQURBUFRFUik7Ci0JCWxvYWRBZGFwdGVyLnNldEFyY2hpdmUodGhpcyk7Ci0JCW9wZW5lbmRCeSA9IG5ldyBGYWlsZWRUb0Nsb3NlRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgewotCQlyZXR1cm4gb3BlbmVuZEJ5ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCWlmKGlzT3BlbigpKXsKLQkJCW9wZW5lbmRCeSA9IG51bGw7Ci0JCQlmb3IgKElBcmNoaXZlIG5lc3RlZEFyY2hpdmUgOiBnZXROZXN0ZWRBcmNoaXZlcygpKSB7Ci0JCQkJSUFyY2hpdmVGYWN0b3J5LklOU1RBTkNFLmNsb3NlQXJjaGl2ZShuZXN0ZWRBcmNoaXZlKTsKLQkJCX0KLQkJCWxvYWRBZGFwdGVyLmNsb3NlKCk7Ci0JCQlkaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWFyY2hpdmVGaWxlSW5kZXggPSBudWxsOwotCQlsb2FkQWRhcHRlciA9IG51bGw7Ci0JCWFyY2hpdmVGYWN0b3J5ID0gbnVsbDsKLQkJYXJjaGl2ZU9wdGlvbnMgPSBudWxsOwotCX0KLQotCXB1YmxpYyBJQXJjaGl2ZVJlc291cmNlIGdldEFyY2hpdmVSZXNvdXJjZShJUGF0aCBhcmNoaXZlUmVsYXRpdmVQYXRoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIudmVyaWZ5UmVsYXRpdmUoYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0JCUlBcmNoaXZlUmVzb3VyY2UgYUZpbGUgPSBudWxsOwotCQlpZiAoYXJjaGl2ZUZpbGVJbmRleC5jb250YWluc0ZpbGUoYXJjaGl2ZVJlbGF0aXZlUGF0aCkpIHsKLQkJCWFGaWxlID0gYXJjaGl2ZUZpbGVJbmRleC5nZXRGaWxlKGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQl9IGVsc2UgaWYgKCFhcmNoaXZlRmlsZUluZGV4LmlzRnVsbHlJbmRleGVkKCkpIHsKLQkJCWFGaWxlID0gbG9hZEFkYXB0ZXIuZ2V0QXJjaGl2ZVJlc291cmNlKGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQkJaWYgKGFGaWxlID09IG51bGwpIHsKLQkJCQlhcmNoaXZlRmlsZUluZGV4Lm5vdGVFbXB0eUZpbGUoYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0JCQl9IGVsc2UgewotCQkJCWFyY2hpdmVGaWxlSW5kZXguYWRkRmlsZShhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYoYUZpbGUgPT0gbnVsbCl7Ci0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGFyY2hpdmVSZWxhdGl2ZVBhdGgudG9TdHJpbmcoKSArIiBpbiAiK3RvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBhRmlsZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxJQXJjaGl2ZVJlc291cmNlPiBnZXRBcmNoaXZlUmVzb3VyY2VzKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICghYXJjaGl2ZUZpbGVJbmRleC5pc0Z1bGx5SW5kZXhlZCgpKSB7Ci0JCQkJYXJjaGl2ZUZpbGVJbmRleC5mdWxseUluZGV4KGxvYWRBZGFwdGVyLmdldEFyY2hpdmVSZXNvdXJjZXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFyY2hpdmVGaWxlSW5kZXguZ2V0RnVsbEluZGV4KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9hZEFkYXB0ZXIoSUFyY2hpdmVMb2FkQWRhcHRlciBsb2FkQWRhcHRlcikgewotCQl0aGlzLmxvYWRBZGFwdGVyID0gbG9hZEFkYXB0ZXI7Ci0JfQotCQotCXB1YmxpYyBJQXJjaGl2ZUxvYWRBZGFwdGVyIGdldExvYWRBZGFwdGVyKCkgewotCQlyZXR1cm4gbG9hZEFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QXJjaGl2ZU9wdGlvbnMoQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMpIHsKLQkJdGhpcy5hcmNoaXZlT3B0aW9ucyA9IGFyY2hpdmVPcHRpb25zOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlT3B0aW9ucyBnZXRBcmNoaXZlT3B0aW9ucygpIHsKLQkJcmV0dXJuIGFyY2hpdmVPcHRpb25zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBsb2FkQWRhcHRlci50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXN1cGVyLmZpbmFsaXplKCk7Ci0JCWlmIChpc09wZW4oKSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJBcmNoaXZlIG9wZW5lciBkaWQgbm90IGNsb3NlIGFyY2hpdmU6ICIgKyB0aGlzKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLmVyci5wcmludGxuKCJBcmNoaXZlIHdhcyBvcGVuZWQgaGVyZToiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3BlbmVuZEJ5LnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkJCWNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc01vZGVsT2JqZWN0KCkgewotCQlyZXR1cm4gY29udGFpbnNNb2RlbE9iamVjdChJQXJjaGl2ZS5FTVBUWV9NT0RFTF9QQVRIKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc01vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgewotCQlBYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlci52ZXJpZnlSZWxhdGl2ZShtb2RlbE9iamVjdFBhdGgpOwotCQlyZXR1cm4gZ2V0TG9hZEFkYXB0ZXIoKS5jb250YWluc01vZGVsT2JqZWN0KG1vZGVsT2JqZWN0UGF0aCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdCgpIHRocm93cyBBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldE1vZGVsT2JqZWN0KElBcmNoaXZlLkVNUFRZX01PREVMX1BBVEgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoSVBhdGggbW9kZWxPYmplY3RQYXRoKSB0aHJvd3MgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyLnZlcmlmeVJlbGF0aXZlKG1vZGVsT2JqZWN0UGF0aCk7Ci0JCXJldHVybiBnZXRMb2FkQWRhcHRlcigpLmdldE1vZGVsT2JqZWN0KG1vZGVsT2JqZWN0UGF0aCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoSVBhdGggYXJjaGl2ZVJlbGF0aXZlUGF0aCkgewotCQlBYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlci52ZXJpZnlSZWxhdGl2ZShhcmNoaXZlUmVsYXRpdmVQYXRoKTsKLQkJaWYgKGFyY2hpdmVGaWxlSW5kZXguY29udGFpbnNGaWxlKGFyY2hpdmVSZWxhdGl2ZVBhdGgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmICghYXJjaGl2ZUZpbGVJbmRleC5pc0Z1bGx5SW5kZXhlZCgpKSB7Ci0JCQlyZXR1cm4gbG9hZEFkYXB0ZXIuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoYXJjaGl2ZVJlbGF0aXZlUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJQXJjaGl2ZSBnZXROZXN0ZWRBcmNoaXZlKElBcmNoaXZlUmVzb3VyY2UgYXJjaGl2ZVJlc291cmNlKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChhcmNoaXZlUmVzb3VyY2UuZ2V0QXJjaGl2ZSgpICE9IHRoaXMpIHsKLQkJCQl0aHJvdyBuZXcgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKCJBdHRlbXB0ZWQgdG8gb3BlbiBuZXN0ZWQgSUFyY2hpdmUgIiArIGFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkgKyAiIHVzaW5nIGFuIElBcmNoaXZlUmVzb3VyY2Ugbm90IGNvbnRhaW5lZCBpbiB0aGlzIElBcmNoaXZlLiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJSUFyY2hpdmVSZXNvdXJjZSBjYWNoZWRBcmNoaXZlUmVzb3VyY2UgPSBnZXRBcmNoaXZlUmVzb3VyY2UoYXJjaGl2ZVJlc291cmNlLmdldFBhdGgoKSk7Ci0KLQkJCWlmIChjYWNoZWRBcmNoaXZlUmVzb3VyY2UuZ2V0VHlwZSgpID09IElBcmNoaXZlUmVzb3VyY2UuQVJDSElWRV9UWVBFKSB7Ci0JCQkJSUFyY2hpdmUgbmVzdGVkQXJjaGl2ZSA9IChJQXJjaGl2ZSkgY2FjaGVkQXJjaGl2ZVJlc291cmNlOwotCQkJCWlmICghYXJjaGl2ZUZpbGVJbmRleC5nZXROZXN0ZWRBcmNoaXZlcygpLmNvbnRhaW5zKG5lc3RlZEFyY2hpdmUpKSB7Ci0JCQkJCWFyY2hpdmVGaWxlSW5kZXguZ2V0TmVzdGVkQXJjaGl2ZXMoKS5hZGQobmVzdGVkQXJjaGl2ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBuZXN0ZWRBcmNoaXZlOwotCQkJfSBlbHNlIGlmIChjYWNoZWRBcmNoaXZlUmVzb3VyY2UuZ2V0VHlwZSgpID09IElBcmNoaXZlUmVzb3VyY2UuRElSRUNUT1JZX1RZUEUpIHsKLQkJCQl0aHJvdyBuZXcgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKCJBdHRlbXB0ZWQgdG8gb3BlbiBuZXN0ZWQgSUFyY2hpdmUgIiArIGNhY2hlZEFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkgKyAiIHVzaW5nIGEgZGlyZWN0b3J5LiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJSUFyY2hpdmVMb2FkQWRhcHRlciBuZXN0ZWRMb2FkQWRhcHRlciA9IG51bGw7Ci0KLQkJCXRyeSB7Ci0JCQkJamF2YS5pby5GaWxlIHRlbXBGaWxlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQl0ZW1wRmlsZSA9IEFyY2hpdmVVdGlsLmNyZWF0ZVRlbXBGaWxlKGNhY2hlZEFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlBcmNoaXZlVXRpbC53YXJuKCJXYXJuaW5nOiBVbmFibGUgdG8gY3JlYXRlIHRlbXAgZmlsZSBmb3IgIiArIGNhY2hlZEFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkgKyAiLiAgVGhpcyB3aWxsIGltcGFjdCBwZXJmb3JtYW5jZS4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJaWYgKHRlbXBGaWxlICE9IG51bGwpIHsKLQkJCQkJSW5wdXRTdHJlYW0gaW4gPSBjYWNoZWRBcmNoaXZlUmVzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsKLQkJCQkJQXJjaGl2ZVV0aWwuY29weShpbiwgb3V0KTsKLQkJCQkJbmVzdGVkTG9hZEFkYXB0ZXIgPSBuZXcgVGVtcFppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsKHRlbXBGaWxlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJaWYgKG5lc3RlZExvYWRBZGFwdGVyID09IG51bGwpIHsKLQkJCQkvLyBUT0RPIGltcGxlbWVudCBhIFppcFN0cmVhbSByZWFkZXIgaWYgbmVjZXNzYXJ5Ci0JCQl9Ci0KLQkJCUFyY2hpdmVPcHRpb25zIG5lc3RlZEFyY2hpdmVPcHRpb25zID0gY2xvbmVVbmtub3duT3B0aW9ucyhhcmNoaXZlT3B0aW9ucyk7Ci0JCQluZXN0ZWRBcmNoaXZlT3B0aW9ucy5zZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuUEFSRU5UX0FSQ0hJVkUsIHRoaXMpOwotCQkJbmVzdGVkQXJjaGl2ZU9wdGlvbnMuc2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLkxPQURfQURBUFRFUiwgbmVzdGVkTG9hZEFkYXB0ZXIpOwotCQkJbmVzdGVkQXJjaGl2ZU9wdGlvbnMuc2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLkFSQ0hJVkVfUEFUSCwgY2FjaGVkQXJjaGl2ZVJlc291cmNlLmdldFBhdGgoKSk7Ci0JCQlJQXJjaGl2ZSBuZXN0ZWRBcmNoaXZlID0gYXJjaGl2ZUZhY3Rvcnkub3BlbkFyY2hpdmUobmVzdGVkQXJjaGl2ZU9wdGlvbnMpOwotCQkJbmVzdGVkQXJjaGl2ZS5zZXRQYXRoKGNhY2hlZEFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkpOwotCQkJbmVzdGVkQXJjaGl2ZS5zZXRBcmNoaXZlKHRoaXMpOwotCQkJcmV0dXJuIG5lc3RlZEFyY2hpdmU7Ci0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZU9wdGlvbnMgY2xvbmVVbmtub3duT3B0aW9ucyhBcmNoaXZlT3B0aW9ucyBhcmNoaXZlT3B0aW9ucyl7Ci0JCUFyY2hpdmVPcHRpb25zIG5ld09wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBhcmNoaXZlT3B0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewotCQkJT2JqZWN0IGtleSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGtleSA9PSBBcmNoaXZlT3B0aW9ucy5BUkNISVZFX1BBVEggfHwga2V5ID09IEFyY2hpdmVPcHRpb25zLkxPQURfQURBUFRFUiB8fCBrZXkgPT0gQXJjaGl2ZU9wdGlvbnMuU0FWRV9BREFQVEVSKXsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3T3B0aW9ucy5zZXRPcHRpb24oa2V5LCBhcmNoaXZlT3B0aW9ucy5nZXRPcHRpb24oa2V5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld09wdGlvbnM7Ci0JfQotCQotCQotCXB1YmxpYyBMaXN0PElBcmNoaXZlPiBnZXROZXN0ZWRBcmNoaXZlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoYXJjaGl2ZUZpbGVJbmRleC5nZXROZXN0ZWRBcmNoaXZlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbAotCSAqIAotCSAqIEBwYXJhbSBhcmNoaXZlUmVzb3VyY2UKLQkgKi8KLQl2b2lkIGFkZEFyY2hpdmVSZXNvdXJjZUludGVybmFsKElBcmNoaXZlUmVzb3VyY2UgYXJjaGl2ZVJlc291cmNlKSB7Ci0JCWFyY2hpdmVGaWxlSW5kZXguaW5kZXgucHV0KGFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCksIGFyY2hpdmVSZXNvdXJjZSk7Ci0JCWlmKGFyY2hpdmVSZXNvdXJjZS5nZXRUeXBlKCkgPT0gQVJDSElWRV9UWVBFKXsKLQkJCWFyY2hpdmVGaWxlSW5kZXguZ2V0TmVzdGVkQXJjaGl2ZXMoKS5hZGQoKElBcmNoaXZlKWFyY2hpdmVSZXNvdXJjZSk7Ci0JCX0KLQkJYXJjaGl2ZUZpbGVJbmRleC5mdWxsSW5kZXggPSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUFyY2hpdmVGYWN0b3J5IGFyY2hpdmVGYWN0b3J5OwotCS8qKgotCSAqIEludGVybmFsOyBjbGllbnRzIHNob3VsZCBub3QgY2FsbC4KLQkgKiBAcGFyYW0gYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlRmFjdG9yeShJQXJjaGl2ZUZhY3RvcnkgYXJjaGl2ZUZhY3RvcnkpewotCQl0aGlzLmFyY2hpdmVGYWN0b3J5ID0gYXJjaGl2ZUZhY3Rvcnk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5N2EyNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVMb2FkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIEFyY2hpdmVSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBJQXJjaGl2ZVJlc291cmNlIHsKLQotCXByaXZhdGUgSUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0KLQlwcml2YXRlIGludCB0eXBlID0gVU5LTk9XTl9UWVBFOwotCi0JcHJpdmF0ZSBsb25nIHNpemUgPSAtMTsKLQotCXByaXZhdGUgbG9uZyBsYXN0TW9kaWZpZWQgPSAtMTsKLQotCXByaXZhdGUgSVBhdGggcGF0aCA9IG51bGw7Ci0KLQlwdWJsaWMgSUFyY2hpdmUgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiBsYXN0TW9kaWZpZWQ7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCXB1YmxpYyBsb25nIGdldFNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSkgewotCQl0aGlzLmFyY2hpdmUgPSBhcmNoaXZlOwotCQkoKEFyY2hpdmVJbXBsKWFyY2hpdmUpLmFkZEFyY2hpdmVSZXNvdXJjZUludGVybmFsKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQobG9uZyBsYXN0TW9kaWZpZWQpIHsKLQkJdGhpcy5sYXN0TW9kaWZpZWQgPSBsYXN0TW9kaWZpZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGF0aChJUGF0aCBwYXRoKSB7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShsb25nIHNpemUpIHsKLQkJdGhpcy5zaXplID0gc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAoZ2V0VHlwZSgpKSB7Ci0JCWNhc2UgSUFyY2hpdmVSZXNvdXJjZS5ESVJFQ1RPUllfVFlQRToKLQkJY2FzZSBJQXJjaGl2ZVJlc291cmNlLlVOS05PV05fVFlQRToKLQkJCXJldHVybiBudWxsOwotCQljYXNlIElBcmNoaXZlUmVzb3VyY2UuRklMRV9UWVBFOgotCQljYXNlIElBcmNoaXZlUmVzb3VyY2UuQVJDSElWRV9UWVBFOgotCQkJSUFyY2hpdmVMb2FkQWRhcHRlciBsb2FkQWRhcHRlciA9IG51bGw7Ci0JCQlsb2FkQWRhcHRlciA9IGdldEFyY2hpdmUoKS5nZXRMb2FkQWRhcHRlcigpOwotCQkJcmV0dXJuIGxvYWRBZGFwdGVyLmdldElucHV0U3RyZWFtKHRoaXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN3aXRjaCAoZ2V0VHlwZSgpKSB7Ci0JCWNhc2UgRklMRV9UWVBFOgotCQkJYnVmZmVyLmFwcGVuZCgiRmlsZTogIik7Ci0JCQlicmVhazsKLQkJY2FzZSBESVJFQ1RPUllfVFlQRToKLQkJCWJ1ZmZlci5hcHBlbmQoIkRpcmVjdG9yeTogIik7Ci0JCQlicmVhazsKLQkJY2FzZSBBUkNISVZFX1RZUEU6Ci0JCQlidWZmZXIuYXBwZW5kKCJBcmNoaXZlOiAiKTsKLQkJCWJyZWFrOwotCQljYXNlIFVOS05PV05fVFlQRToKLQkJCWJ1ZmZlci5hcHBlbmQoIlVua25vd246ICIpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0UGF0aCgpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWFyY2hpdmUgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVVUklDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlVVJJQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MWIxNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVVUklDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZVVSSUNvbnZlcnRlciBleHRlbmRzIFVSSUNvbnZlcnRlckltcGwgewotCi0JcHJpdmF0ZSBJQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKLQotCXB1YmxpYyBBcmNoaXZlVVJJQ29udmVydGVyKElBcmNoaXZlIGFyY2hpdmUpIHsKLQkJdGhpcy5hcmNoaXZlID0gYXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgSUFyY2hpdmUgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCA8VVJJLCBJUGF0aD4gdXJpVG9QYXRoTWFwID0gbmV3IEhhc2hNYXAgPFVSSSwgSVBhdGg+KCk7Ci0KLQlwcm90ZWN0ZWQgTWFwIDxJUGF0aCwgVVJJPiBwYXRoVG9VUklNYXAgPSBuZXcgSGFzaE1hcCA8SVBhdGgsIFVSST4oKTsKLQotCXB1YmxpYyBmaW5hbCBVUkkgZ2V0VVJJKElQYXRoIHBhdGgpIHsKLQkJaWYgKCFwYXRoVG9VUklNYXAuY29udGFpbnNLZXkocGF0aCkpIHsKLQkJCVVSSSB1cmkgPSBjb252ZXJ0UGF0aFRvVVJJKHBhdGgpOwotCQkJdXJpVG9QYXRoTWFwLnB1dCh1cmksIHBhdGgpOwotCQkJcGF0aFRvVVJJTWFwLnB1dChwYXRoLCB1cmkpOwotCQkJcmV0dXJuIHVyaTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwYXRoVG9VUklNYXAuZ2V0KHBhdGgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFVSSSBjb252ZXJ0UGF0aFRvVVJJKElQYXRoIHBhdGgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkocGF0aC50b1N0cmluZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggY29udmVydFVSSVRvUGF0aChVUkkgdXJpKSB7Ci0JCXJldHVybiBuZXcgUGF0aCh1cmkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIElQYXRoIGdldFBhdGgoVVJJIHVyaSkgewotCQlpZiAoIXVyaVRvUGF0aE1hcC5jb250YWluc0tleSh1cmkpKSB7Ci0JCQlJUGF0aCBwYXRoID0gY29udmVydFVSSVRvUGF0aCh1cmkpOwotCQkJdXJpVG9QYXRoTWFwLnB1dCh1cmksIHBhdGgpOwotCQkJcGF0aFRvVVJJTWFwLnB1dChwYXRoLCB1cmkpOwotCQkJcmV0dXJuIHBhdGg7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdXJpVG9QYXRoTWFwLmdldCh1cmkpOwotCQl9Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtKFVSSSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlQYXRoIHBhdGggPSBnZXRQYXRoKHVyaSk7Ci0JCUlBcmNoaXZlUmVzb3VyY2UgYXJjaGl2ZVJlc291cmNlID0gZ2V0QXJjaGl2ZSgpLmdldEFyY2hpdmVSZXNvdXJjZShwYXRoKTsKLQkJcmV0dXJuIGFyY2hpdmVSZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyNjY3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZVV0aWwgewotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHRlbXBEaXJlY3RvcnlOYW1lOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBqYXZhLmlvLkZpbGUgdGVtcERpcmVjdG9yeTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGVuYW1lIGZyb20gdGhlIHVyaSwgb3IgdGhlIHNlZ21lbnQgYWZ0ZXIgdGhlIGxhc3QKLQkgKiBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWVUYWlsKFN0cmluZyB1cmkpIHsKLQkJU3RyaW5nIHRlbXBVUkkgPSB1cmkucmVwbGFjZSgnXFwnLCAnLycpOwotCQl3aGlsZSAodGVtcFVSSS5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQl0ZW1wVVJJID0gdGVtcFVSSS5zdWJzdHJpbmcoMCwgdGVtcFVSSS5sZW5ndGgoKSAtIDEpOwotCQlpbnQgbGFzdEluZGV4ID0gdGVtcFVSSS5sYXN0SW5kZXhPZignLycpOwotCQlpZiAobGFzdEluZGV4ID09IC0xKQotCQkJcmV0dXJuIHVyaTsKLQkJcmV0dXJuIHVyaS5zdWJzdHJpbmcobGFzdEluZGV4ICsgMSwgdGVtcFVSSS5sZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgZ2V0VGVtcERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRlbXBEaXJlY3Rvcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIGJhc2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVtcEZpbGUoYmFzZU5hbWUsIGdldFRlbXBEaXJlY3RvcnkoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIGJhc2VOYW1lLCBqYXZhLmlvLkZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZVRhaWwoYmFzZU5hbWUpOwotCQlpZiAoZmlsZU5hbWUubGVuZ3RoKCkgPCAzKSB7Ci0JCQlmaWxlTmFtZSA9ICJXU1RNUCIgKyBmaWxlTmFtZTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWphdmEuaW8uRmlsZSB0ZW1wRmlsZSA9IGphdmEuaW8uRmlsZS5jcmVhdGVUZW1wRmlsZShmaWxlTmFtZSwgbnVsbCwgZGlyZWN0b3J5KTsKLQkJRGVsZXRlT25FeGl0VXRpbGl0eS5tYXJrRm9yRGVsZXRpb24odGVtcEZpbGUpOwotCQlyZXR1cm4gdGVtcEZpbGU7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGZpbGVzLCByZWN1cnNpdmUsIHRoYXQgY2FuJ3QgYmUgd3JpdHRlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXcml0ZVByb3RlY3RlZEZpbGVzKGphdmEuaW8uRmlsZSBhRmlsZSwgTGlzdCBhTGlzdCkgewotCQlpZiAoYUxpc3QgPT0gbnVsbCkKLQkJCWFMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYUZpbGUuZXhpc3RzKCkgJiYgIWFGaWxlLmNhbldyaXRlKCkpCi0JCQlhTGlzdC5hZGQoYUZpbGUpOwotCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJamF2YS5pby5GaWxlW10gZmlsZXMgPSBhRmlsZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlnZXRXcml0ZVByb3RlY3RlZEZpbGVzKGZpbGVzW2ldLCBhTGlzdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFMaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1dyaXRlYWJsZShqYXZhLmlvLkZpbGUgYUZpbGUpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlMaXN0IGxvY2tlZCA9IEFyY2hpdmVVdGlsLmdldFdyaXRlUHJvdGVjdGVkRmlsZXMoYUZpbGUsIG51bGwpOwotCQlpZiAobG9ja2VkLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlTdHJpbmdCdWZmZXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQltc2cuYXBwZW5kKCJDYW5ub3Qgd3JpdGUgdG8gZmlsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZChhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCW1zZy5hcHBlbmQoJ1xuJyk7Ci0JCW1zZy5hcHBlbmQoIk9uZSBvciBtb3JlIGZpbGVzIGlzIHdyaXRlIHByb3RlY3RlZCBvciBsb2NrZWQ6Iik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZCgnXG4nKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NrZWQuc2l6ZSgpOyBpKyspIHsKLQkJCWphdmEuaW8uRmlsZSBsb2NrZWRGaWxlID0gKGphdmEuaW8uRmlsZSkgbG9ja2VkLmdldChpKTsKLQkJCW1zZy5hcHBlbmQobG9ja2VkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQltc2cuYXBwZW5kKCdcbicpOwotCQl9Ci0JCXRocm93IG5ldyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24obXNnLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZXMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtOyBmb3IgZGlyZWN0b3JpZXMsIHJlY3Vyc2UgdGhlCi0JICogc3ViZGlyZWN0b3JpZXMgYW5kIGRlbGV0ZSB0aGVtIGFzIHdlbGwKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bDsgZmFsc2UgaWYgYW55IGZpbGUgb3Igc3ViIGZpbGUgY291bGQgbm90IGJlCi0JICogICAgICAgICBkZWxldGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZShqYXZhLmlvLkZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWphdmEuaW8uRmlsZVtdIGZpbGVzID0gYUZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFkZWxldGUoZmlsZXNbaV0pKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYUZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgY2FuIHJlbmFtZSBpdCB0aGVuIHdlIGNhbiBkZWxldGUgaXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZW5hbWVhYmxlKGphdmEuaW8uRmlsZSBvcmlnKSB7Ci0JCWphdmEuaW8uRmlsZSBvcmlnQ29weTEgPSBudWxsOwotCQlqYXZhLmlvLkZpbGUgb3JpZ0NvcHkyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW9yaWdDb3B5MSA9IG9yaWcuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQkJb3JpZ0NvcHkyID0gb3JpZy5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCVN0cmluZyBiYXNlTmFtZSA9ICJzYXZlLnRtcCI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWlmIChvcmlnLmdldFBhcmVudCgpICE9IG51bGwpCi0JCQkJYmFzZU5hbWUgPSBuZXcgamF2YS5pby5GaWxlKG9yaWcuZ2V0UGFyZW50KCksIGJhc2VOYW1lKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWphdmEuaW8uRmlsZSB0ZW1wID0gbnVsbDsKLQkJaW50IGluZGV4ID0gMDsKLQkJZG8gewotCQkJbmFtZSA9IGJhc2VOYW1lICsgaW5kZXg7Ci0JCQl0ZW1wID0gbmV3IGphdmEuaW8uRmlsZShuYW1lKTsKLQkJCWluZGV4Kys7Ci0JCX0gd2hpbGUgKHRlbXAuZXhpc3RzKCkpOwotCQlyZXR1cm4gb3JpZ0NvcHkxLnJlbmFtZVRvKHRlbXApICYmIHRlbXAucmVuYW1lVG8ob3JpZ0NvcHkyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYW51cEFmdGVyVGVtcFNhdmUoU3RyaW5nIGFVcmksIGphdmEuaW8uRmlsZSBvcmlnaW5hbCwgamF2YS5pby5GaWxlIGRlc3RpbmF0aW9uRmlsZSkgdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJY2hlY2tXcml0ZWFibGUob3JpZ2luYWwpOwotCQlib29sZWFuIGRlbGV0ZVdvcmtlZCA9IGZhbHNlOwotCQlpZiAob3JpZ2luYWwuaXNEaXJlY3RvcnkoKSAmJiAhaXNSZW5hbWVhYmxlKG9yaWdpbmFsKSkgewotCQkJLy8gVE9ETyB0aHJvdyBuZXcKLQkJCS8vIFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIudW5hYmxlX3JlcGxhY2VfRVhDXywKLQkJCS8vIChuZXcgT2JqZWN0W117b3JpZ2luYWwuZ2V0QWJzb2x1dGVQYXRoKCl9KSkpOyAvLyA9ICJVbmFibGUgdG8KLQkJCS8vIHJlcGxhY2Ugb3JpZ2luYWwgYXJjaGl2ZSAiCi0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCWlmIChBcmNoaXZlVXRpbC5kZWxldGUob3JpZ2luYWwpKSB7Ci0JCQkJZGVsZXRlV29ya2VkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJLy8gVE9ETyBNYWpvciBoYWNrIGhlcmU7IHRoZSBwcm9ibGVtIGlzIHRoYXQgYSBwcmV2aW91cyBjYWxsCi0JCQkJLy8gdG8gY2xvc2UgdGhlIHNvdXJjZSBmaWxlIG1heSBub3QgeWV0IGhhdmUKLQkJCQkvLyBiZWVuIHJlZmxlY3RlZCBpbiB0aGUgb3Mvdm07IHRoZXJlZm9yZSBhIHN1YnNlcXVlbnQgY2FsbAotCQkJCS8vIHRvIGRlbGV0ZSBmYWlscy4gVG8gZ2V0IGFyb3VuZCB0aGlzLAotCQkJCS8vIHdhaXQgZm9yIGEgYml0IGFuZCByZXRyeTsgaWYgaXQgY29udGludWVzIHRvIGZhaWwsIHRoZW4KLQkJCQkvLyB0aW1lIG91dCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uCi0JCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlCi0JCQl9Ci0JCX0KLQkJaWYgKGRlbGV0ZVdvcmtlZCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJaWYgKGRlc3RpbmF0aW9uRmlsZS5yZW5hbWVUbyhvcmlnaW5hbCkpewotCQkJCQlEZWxldGVPbkV4aXRVdGlsaXR5LmZpbGVIYXNCZWVuRGVsZXRlZChkZXN0aW5hdGlvbkZpbGUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFRPRE8gdGhyb3cgbmV3Ci0JCS8vIFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIudW5hYmxlX3JlcGxhY2VfRVhDXywKLQkJLy8gKG5ldyBPYmplY3RbXXtvcmlnaW5hbC5nZXRBYnNvbHV0ZVBhdGgoKX0pKSk7IC8vID0gIlVuYWJsZSB0byByZXBsYWNlCi0JCS8vIG9yaWdpbmFsIGFyY2hpdmUgIgotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbSB0byB0aGUgb3V0cHV0IHN0cmVhbSB1cCB1bnRpbCB0aGUKLQkgKiBmaXJzdCBlbmQgb2YgZmlsZSBjaGFyYWN0ZXIsIGFuZCBjbG9zZSB0aGUgdHdvIHN0cmVhbXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQl0cnkgewotCQkJaW50IG4gPSBpbi5yZWFkKGJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCBuKTsKLQkJCQluID0gaW4ucmVhZChidWZmZXIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKCEoaW4gaW5zdGFuY2VvZiBaaXBJbnB1dFN0cmVhbSkpCi0JCQkJaW4uY2xvc2UoKTsKLQkJCWlmICghKG91dCBpbnN0YW5jZW9mIFppcE91dHB1dFN0cmVhbSkpCi0JCQkJb3V0LmNsb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm4oVGhyb3dhYmxlIGUpewotCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuKFN0cmluZyBtZXNzYWdlKSB7Ci0JCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nV2FybmluZyhtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBaaXBGaWxlIG5ld1ppcEZpbGUoU3RyaW5nIGZpbGVOYW1lKXRocm93cyBaaXBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEFyY2hpdmVVdGlsLm5ld1ppcEZpbGUobmV3IEZpbGUoZmlsZU5hbWUpLCBaaXBGaWxlLk9QRU5fUkVBRCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgWmlwRmlsZSBuZXdaaXBGaWxlKEZpbGUgYUZpbGUpdGhyb3dzIFppcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gQXJjaGl2ZVV0aWwubmV3WmlwRmlsZShhRmlsZSwgWmlwRmlsZS5PUEVOX1JFQUQpOwotCX0KLQkKLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBaaXBGaWxlcyB3aGljaCBhdm9pZCBtZW1vcnkgbGVha3MgCi0JICogYmVjYXVzZSBjbG9zaW5nIHRoZW0gZmFpbHMgdG8gY2xvc2Ugb3BlbiBpbnB1dHN0cmVhbXMuCi0JICogVGhlcmUgaXMgYSBTVU4gYnVnIG9wZW4gZm9yIHRoaXM6IGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTY3MzUyNTUgCi0gICAgICogYnV0IGl0IGxvb2tzIGxpa2UgdGhlICJmaXgiIHdpbGwgYmUgdG8gY2hhbmdlIHRoZSBKYXZhZG9jIDotKCAgIAotCSAqIEBwYXJhbSBhRmlsZSBtb2RlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgWmlwRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWmlwRmlsZSBuZXdaaXBGaWxlKEZpbGUgYUZpbGUsIGludCBtb2RlKSB0aHJvd3MgWmlwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgWmlwRmlsZShhRmlsZSwgbW9kZSl7Ci0JCQlDb2xsZWN0aW9uIDxJbnB1dFN0cmVhbT4gb3BlblN0cmVhbXMgPSBudWxsOwotCQkJCi0JCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oWmlwRW50cnkgZW50cnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJSW5wdXRTdHJlYW0gaW4gPSBzdXBlci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJaWYoaW4gIT0gbnVsbCl7Ci0JCQkJCWlmKG9wZW5TdHJlYW1zID09IG51bGwpewotCQkJCQkJb3BlblN0cmVhbXMgPSBuZXcgQXJyYXlMaXN0PElucHV0U3RyZWFtPigpOwotCQkJCQl9Ci0JCQkJCW9wZW5TdHJlYW1zLmFkZChpbik7Ci0JCQkJfQotCQkJCXJldHVybiBpbjsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCWNsb3NlT3BlblN0cmVhbXMoKTsKLQkJCQlzdXBlci5jbG9zZSgpOwotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgY2xvc2VPcGVuU3RyZWFtcygpIHsKLQkJCQlpZihvcGVuU3RyZWFtcyAhPSBudWxsKXsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG9wZW5TdHJlYW1zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUlucHV0U3RyZWFtIGluID0gKElucHV0U3RyZWFtKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJd2FybihlKTsKLQkJCQkJCX0KLQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9EZWxldGVPbkV4aXRVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvRGVsZXRlT25FeGl0VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzY4Y2Q2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9EZWxldGVPbkV4aXRVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVPbkV4aXRVdGlsaXR5IHsKLQotCXByaXZhdGUgc3RhdGljIFNldCB0ZW1wRmlsZXNUb0RlbGV0ZTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGNsZWFudXBDb3VudCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENMRUFOVVBfVEhSRVNIT0xEID0gMTAwMDA7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFya0ZvckRlbGV0aW9uKEZpbGUgZmlsZSkgewotCQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQl0cnkgewotCQkJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHRlbXBGaWxlc1RvRGVsZXRlICE9IG51bGwpIHsKLQkJCQkJCQlzeW5jaHJvbml6ZWQgKHRlbXBGaWxlc1RvRGVsZXRlKSB7Ci0JCQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGVtcEZpbGVzVG9EZWxldGUuaXRlcmF0b3IoKTsKLQkJCQkJCQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlmaWxlID0gKEZpbGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pKTsKLQkJCQl0ZW1wRmlsZXNUb0RlbGV0ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRlbXBGaWxlc1RvRGVsZXRlICE9IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGVtcEZpbGVzVG9EZWxldGUpIHsKLQkJCQljbGVhbnVwQ291bnQrKzsKLQkJCQl0ZW1wRmlsZXNUb0RlbGV0ZS5hZGQoZmlsZSk7Ci0JCQl9Ci0JCQlpZiAoY2xlYW51cENvdW50ID4gQ0xFQU5VUF9USFJFU0hPTEQpIHsKLQkJCQlydW5DbGVhbnVwKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlsZUhhc0JlZW5EZWxldGVkKEZpbGUgZmlsZSkgewotCQlpZiAodGVtcEZpbGVzVG9EZWxldGUgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0ZW1wRmlsZXNUb0RlbGV0ZSkgewotCQkJCWNsZWFudXBDb3VudCsrOwotCQkJCXRyeSB7Ci0JCQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCQkJdGVtcEZpbGVzVG9EZWxldGUucmVtb3ZlKGZpbGUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCWlmIChjbGVhbnVwQ291bnQgPiBDTEVBTlVQX1RIUkVTSE9MRCkgewotCQkJCXJ1bkNsZWFudXAoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5DbGVhbnVwKCkgewotCQlpZiAodGVtcEZpbGVzVG9EZWxldGUgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0ZW1wRmlsZXNUb0RlbGV0ZSkgewotCQkJCWNsZWFudXBDb3VudCA9IDA7Ci0JCQkJTGlzdCBmaWxlc1RvUmVtb3ZlID0gbnVsbDsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IHRlbXBGaWxlc1RvRGVsZXRlLml0ZXJhdG9yKCk7Ci0JCQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmaWxlID0gKEZpbGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCWlmIChmaWxlc1RvUmVtb3ZlID09IG51bGwpIHsKLQkJCQkJCQkJZmlsZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmlsZXNUb1JlbW92ZS5hZGQoZmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZmlsZXNUb1JlbW92ZSAhPSBudWxsKSB7Ci0JCQkJCXRlbXBGaWxlc1RvRGVsZXRlLnJlbW92ZUFsbChmaWxlc1RvUmVtb3ZlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0ZhaWxlZFRvQ2xvc2VFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9GYWlsZWRUb0Nsb3NlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OWI3MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0ZhaWxlZFRvQ2xvc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRmFpbGVkVG9DbG9zZUV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDY1NDY4MTUxOTcwODM4NzY1OEw7Ci0KLQlwdWJsaWMgRmFpbGVkVG9DbG9zZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9UZW1wWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9UZW1wWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4MTg0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvVGVtcFppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkRlbGV0ZU9uRXhpdFV0aWxpdHk7Ci0KLQotLyoqCi0gKiBVc2VkIGFzIGFuIG9wdGltaXphdGlvbiBmb3IgcmVhZGluZyBqYXJzIHdpdGhpbiBqYXJzLiBSZWFkaW5nIGZyb20gYSBaaXBGaWxlIGlzIG11Y2ggZmFzdGVyIHRoYW4KLSAqIGZyb20gYSBaaXBJbnB1dFN0cmVhbSwgdGhlcmVmb3JlLCB3aGVuIHBvc3NpYmxlLCBpdCBtYWtlcyBzZW5zZSB0byBjb3B5IHRoZSBuZXN0ZWQgamFyIHRvIGEgdGVtcAotICogZmlsZS4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHRlbXAgZmlsZSBnZXRzIGRlbGV0ZWQgb24gbm9ybWFsCi0gKiBzeXN0ZW0gZXhpdCwgdXNpbmcgdGhlIGhlbHBlciBtZXRob2Qgb24gamF2YS5pby5GaWxlLiBUaGlzIGFkYXB0ZXIgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgZmlsZQotICogd2hlbiBjbG9zZWQgb3IgZmluYWxpemVkLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcFppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsIGV4dGVuZHMgWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwgewotCi0JcHJvdGVjdGVkIEZpbGUgZmlsZTsKLQkKLQlwdWJsaWMgVGVtcFppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUZW1wWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwoamF2YS5pby5GaWxlIGZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3VwZXIoQXJjaGl2ZVV0aWwubmV3WmlwRmlsZShmaWxlKSk7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldEZpbGUoKXsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlzdXBlci5jbG9zZSgpOwotCQlGaWxlIGZpbGUgPSBnZXRGaWxlKCk7Ci0JCWZpbGUuZGVsZXRlKCk7Ci0JCURlbGV0ZU9uRXhpdFV0aWxpdHkuZmlsZUhhc0JlZW5EZWxldGVkKGZpbGUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9aaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL1ppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDIxMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL1ppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwotCi0KLQotcHVibGljIGNsYXNzIFppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsIGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIgewotCXByb3RlY3RlZCBaaXBGaWxlIHppcEZpbGU7Ci0KLQlwdWJsaWMgWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsKFppcEZpbGUgemlwRmlsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnppcEZpbGUgPSB6aXBGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlzdXBlci5jbG9zZSgpOwotCQl0cnkgewotCQkJZ2V0WmlwRmlsZSgpLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCVppcEVudHJ5IGVudHJ5ID0gZ2V0WmlwRmlsZSgpLmdldEVudHJ5KHJlc291cmNlUGF0aC50b1N0cmluZygpKTsKLQkJcmV0dXJuIGVudHJ5ICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBJQXJjaGl2ZVJlc291cmNlIGdldEFyY2hpdmVSZXNvdXJjZShJUGF0aCBmaWxlUGF0aCkgewotCQlaaXBFbnRyeSBlbnRyeSA9IGdldFppcEZpbGUoKS5nZXRFbnRyeShmaWxlUGF0aC50b1N0cmluZygpKTsKLQkJSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSA9IG51bGw7Ci0JCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQlhRmlsZSA9IGNyZWF0ZUZpbGUoZW50cnkpOwotCQl9Ci0JCXJldHVybiBhRmlsZTsKLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QXJjaGl2ZVJlc291cmNlcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gZ2V0WmlwRmlsZSgpLmVudHJpZXMoKTsKLQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQlJQXJjaGl2ZVJlc291cmNlIGFGaWxlID0gY3JlYXRlRmlsZShlbnRyeSk7Ci0JCQlsaXN0LmFkZChhRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIElBcmNoaXZlUmVzb3VyY2UgY3JlYXRlRmlsZShaaXBFbnRyeSBlbnRyeSkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZW50cnkuZ2V0TmFtZSgpKS5tYWtlUmVsYXRpdmUoKTsKLQkJSUFyY2hpdmVSZXNvdXJjZSBhRmlsZSA9IG51bGw7Ci0JCWlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkgewotCQkJYUZpbGUgPSBjcmVhdGVGaWxlKHBhdGgpOwotCQkJYUZpbGUuc2V0U2l6ZShlbnRyeS5nZXRTaXplKCkpOwotCQkJYUZpbGUuc2V0TGFzdE1vZGlmaWVkKGVudHJ5LmdldFRpbWUoKSk7Ci0JCX0gZWxzZSB7IC8vIGFsd2F5cyBpbmNsdWRlIGRpcmVjdG9yaWVzCi0JCQlhRmlsZSA9IGNyZWF0ZURpcmVjdG9yeShwYXRoKTsKLQkJCWFGaWxlLnNldFNpemUoZW50cnkuZ2V0U2l6ZSgpKTsKLQkJCWFGaWxlLnNldExhc3RNb2RpZmllZChlbnRyeS5nZXRUaW1lKCkpOwotCQl9Ci0JCXJldHVybiBhRmlsZTsKLQl9Ci0KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJQXJjaGl2ZVJlc291cmNlIGFGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBwYXRoID0gYUZpbGUuZ2V0UGF0aCgpOwotCQkJU3RyaW5nIHVyaSA9IHBhdGgudG9TdHJpbmcoKTsKLQkJCVppcEVudHJ5IGVudHJ5ID0gZ2V0WmlwRmlsZSgpLmdldEVudHJ5KHVyaSk7Ci0JCQlpZiAoZW50cnkgPT0gbnVsbCkgewotCQkJCS8vIHRoaXMgaXMgYSBoYWNrLCBidXQgemlwIGZpbGVzIGFyZSBzZW5zaXRpdmUgdG8gdGhlIGRpZmZlcmVuY2UKLQkJCQkvLyBiZXR3ZWVuICcvJyBhbmQgJ1xcJwotCQkJCS8vIHNvIHRoZSBoYWNrIGlzIHRvIHRyeSBhbGwgY29tYmluYXRpb25zIHRvIHNlZSBpZiBhbnkgZXhpc3QKLQkJCQljaGFyW10gY2hhcnMgPSB1cmkudG9DaGFyQXJyYXkoKTsKLQkJCQlpbnRbXSBzbGFzaEluZGljZXMgPSBuZXcgaW50W2NoYXJzLmxlbmd0aF07Ci0JCQkJaW50IHNsYXNoQ291bnQgPSAwOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJaWYgKGNoYXJzW2ldID09ICcvJyB8fCBjaGFyc1tpXSA9PSAnXFwnKSB7Ci0JCQkJCQlzbGFzaEluZGljZXNbc2xhc2hDb3VudF0gPSBpOwotCQkJCQkJc2xhc2hDb3VudCsrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWludCBzbGFzaFBvdyA9IChpbnQpIE1hdGgucG93KDIsIHNsYXNoQ291bnQpOwotCQkJCWJvb2xlYW4gZm91bmRJdCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2xhc2hQb3cgJiYgIWZvdW5kSXQ7IGkrKykgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNsYXNoQ291bnQ7IGorKykgewotCQkJCQkJaWYgKChpID4+IGogJiAxKSA9PSAxKSB7Ci0JCQkJCQkJY2hhcnNbc2xhc2hJbmRpY2VzW2pdXSA9ICcvJzsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY2hhcnNbc2xhc2hJbmRpY2VzW2pdXSA9ICdcXCc7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZW50cnkgPSBnZXRaaXBGaWxlKCkuZ2V0RW50cnkobmV3IFN0cmluZyhjaGFycykpOwotCQkJCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCQkJZm91bmRJdCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVudHJ5ID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbih1cmkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKGdldFppcEZpbGUoKS5nZXRJbnB1dFN0cmVhbShlbnRyeSkpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gemlwQ2xvc2VkKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oemlwQ2xvc2VkLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIGphdmEudXRpbC56aXAuWmlwRmlsZSBnZXRaaXBGaWxlKCkgewotCQlyZXR1cm4gemlwRmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRaaXBGaWxlKGphdmEudXRpbC56aXAuWmlwRmlsZSBuZXdaaXBGaWxlKSB7Ci0JCXppcEZpbGUgPSBuZXdaaXBGaWxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gemlwRmlsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoSVBhdGggbW9kZWxPYmplY3RQYXRoKSB0aHJvd3MgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uKCJTaW1wbGUgWmlwIEFyY2hpdmVzIGhhdmUgbm8gbW9kZWwgb2JqZWN0cy4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL1ppcFN0cmVhbUFyY2hpdmVTYXZlQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9aaXBTdHJlYW1BcmNoaXZlU2F2ZUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDBlZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL1ppcFN0cmVhbUFyY2hpdmVTYXZlQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQWJzdHJhY3RBcmNoaXZlU2F2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlU2F2ZUFkYXB0ZXI7Ci0KLQotCi0vKioKLSAqIFRoaXMgaXMgYSBjb25jcmV0ZSBpbXBsZW50YXRpb24gb2YgSUFyY2hpdmVTYXZlQWRhcHRlci4gQWxsIHRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSwgaW5jbHVkaW5nIHhtaQotICogcmVzb3VyY2VzLCB3aWxsIGJlIG91dHB1dCB0byBhIFppcE91dHB1dFN0cmVhbS4gVGhlIG91dHB1dCBzdHJlYW0gc2hvdWxkIGJlIHBhc3NlZCBpbiBieSB0aGUKLSAqIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIFppcFN0cmVhbUFyY2hpdmVTYXZlQWRhcHRlckltcGwgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVTYXZlQWRhcHRlciBpbXBsZW1lbnRzIElBcmNoaXZlU2F2ZUFkYXB0ZXIgewotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb25TdHJlYW07Ci0JLyoqIFVzZWQgaW50ZXJuYWxseSAqLwotCXByb3RlY3RlZCBaaXBPdXRwdXRTdHJlYW0gemlwT3V0cHV0U3RyZWFtOwotCi0JLyoqCi0JICogV3JhcHMgYSBuZXcgemlwIG91dHB1dCBzdHJlYW0gYXJvdW5kIHRoZSBwYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgWmlwU3RyZWFtQXJjaGl2ZVNhdmVBZGFwdGVySW1wbChPdXRwdXRTdHJlYW0gb3V0KSB7Ci0JCXNldERlc3RpbmF0aW9uU3RyZWFtKG91dCk7Ci0JCXNldFppcE91dHB1dFN0cmVhbShuZXcgWmlwT3V0cHV0U3RyZWFtKG91dCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZ2V0RGVzdGluYXRpb25TdHJlYW0oKS5jbG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBJQXJjaGl2ZVNhdmVBZGFwdGVyIGNyZWF0ZU5lc3RlZFNhdmVBZGFwdGVyKElBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlyZXR1cm4gbmV3IFppcFN0cmVhbUFyY2hpdmVTYXZlQWRhcHRlckltcGwoZ2V0WmlwT3V0cHV0U3RyZWFtKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldFppcE91dHB1dFN0cmVhbSgpLmZpbmlzaCgpOwotCQkvL0lmIHRoaXMgaXMgbm90IG5lc3RlZCwgY2xvc2UgdGhlIHN0cmVhbSB0byBmcmVlIHVwIHRoZSByZXNvdXJjZQotCQkvL290aGVyd2lzZSwgZG9uJ3QgY2xvc2UgaXQgYmVjYXVzZSB0aGUgcGFyZW50IG1heSBub3QgYmUgZG9uZQotCQlpZiAoIShnZXREZXN0aW5hdGlvblN0cmVhbSgpIGluc3RhbmNlb2YgWmlwT3V0cHV0U3RyZWFtKSkKLQkJCWdldERlc3RpbmF0aW9uU3RyZWFtKCkuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEuaW8uT3V0cHV0U3RyZWFtCi0JICovCi0JcHVibGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldERlc3RpbmF0aW9uU3RyZWFtKCkgewotCQlyZXR1cm4gZGVzdGluYXRpb25TdHJlYW07Ci0JfQotCi0JcHJvdGVjdGVkIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbUZvclJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0WmlwT3V0cHV0U3RyZWFtKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbQotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbSBnZXRaaXBPdXRwdXRTdHJlYW0oKSB7Ci0JCXJldHVybiB6aXBPdXRwdXRTdHJlYW07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShJQXJjaGl2ZVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCk7Ci0JCQlpZihyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSUFyY2hpdmVSZXNvdXJjZS5ESVJFQ1RPUllfVFlQRSAmJiAhcGF0aC5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKXsKLQkJCQlwYXRoID0gcGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQkJfQotCQkJCi0JCQlaaXBFbnRyeSBlbnRyeSA9IG5ldyBaaXBFbnRyeShwYXRoLnRvU3RyaW5nKCkpOwotCQkJaWYgKHJlc291cmNlLmdldExhc3RNb2RpZmllZCgpID4gMCkKLQkJCQllbnRyeS5zZXRUaW1lKHJlc291cmNlLmdldExhc3RNb2RpZmllZCgpKTsKLQkJCWdldFppcE91dHB1dFN0cmVhbSgpLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElBcmNoaXZlUmVzb3VyY2UuRElSRUNUT1JZX1RZUEUpIHsKLQkJCQlBcmNoaXZlVXRpbC5jb3B5KHJlc291cmNlLmdldElucHV0U3RyZWFtKCksIGdldFppcE91dHB1dFN0cmVhbSgpKTsKLQkJCX0KLQkJCWdldFppcE91dHB1dFN0cmVhbSgpLmNsb3NlRW50cnkoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdEZXN0aW5hdGlvblN0cmVhbQotCSAqICAgICAgICAgICAgamF2YS5pby5PdXRwdXRTdHJlYW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvblN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSBuZXdEZXN0aW5hdGlvblN0cmVhbSkgewotCQlkZXN0aW5hdGlvblN0cmVhbSA9IG5ld0Rlc3RpbmF0aW9uU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdaaXBPdXRwdXRTdHJlYW0KLQkgKiAgICAgICAgICAgIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0WmlwT3V0cHV0U3RyZWFtKGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtIG5ld1ppcE91dHB1dFN0cmVhbSkgewotCQl6aXBPdXRwdXRTdHJlYW0gPSBuZXdaaXBPdXRwdXRTdHJlYW07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL3V0aWwvaW50ZXJuYWwvSmF2YUVFUXVpY2tQZWVrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL3V0aWwvaW50ZXJuYWwvSmF2YUVFUXVpY2tQZWVrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNTQ5MWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS91dGlsL2ludGVybmFsL0phdmFFRVF1aWNrUGVlay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIEEgVXRpbGl0eSBmb3IgcXVpY2tseSBkZXRlcm1pbmluZyB0aGUgdHlwZSBhbmQgdmVyc2lvbiBvZiBhIEphdmEgRUUKLSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqIAotICogQGF1dGhvciBqYXNob2xsCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFFRVF1aWNrUGVlayBpbXBsZW1lbnRzIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlNFVCA9IC0yOwotCi0JcHJpdmF0ZSBYTUxSb290SGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQotCXB1YmxpYyBKYXZhRUVRdWlja1BlZWsoaW50IHR5cGUsIGludCB2ZXJzaW9uKSB7Ci0JCXRoaXModHlwZSwgdmVyc2lvbiwgVU5TRVQpOwotCX0KLQotCXB1YmxpYyBKYXZhRUVRdWlja1BlZWsoaW50IHR5cGUsIGludCB2ZXJzaW9uLCBpbnQgamF2YUVFVmVyc2lvbikgewotCQlpZiAodHlwZSA9PSBVTktOT1dOKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidHlwZSBtdXN0IG5vdCBiZSBVTktOT1dOIik7Ci0JCX0gZWxzZSBpZiAodmVyc2lvbiA9PSBVTktOT1dOKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidmVyc2lvbiBtdXN0IG5vdCBiZSBVTktOT05XIik7Ci0JCX0gZWxzZSBpZiAoamF2YUVFVmVyc2lvbiA9PSBVTktOT1dOKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiamF2YUVFVmVyc2lvbiBtdXN0IG5vdCBiZSBVTktOT05XIik7Ci0JCX0KLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5qYXZhRUVWZXJzaW9uID0gamF2YUVFVmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVFUXVpY2tQZWVrKElucHV0U3RyZWFtIGluKSB7Ci0JCWlmIChpbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGluKTsKLQkJCQloYW5kbGVyID0gbmV3IFhNTFJvb3RIYW5kbGVyKCk7Ci0JCQkJaGFuZGxlci5wYXJzZUNvbnRlbnRzKGlucHV0U291cmNlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCQkJaW4ucmVzZXQoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXZlcnNpb24gPSBVTktOT1dOOwotCQkJamF2YUVFVmVyc2lvbiA9IFVOS05PV047Ci0JCQl0eXBlID0gVU5LTk9XTjsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IHZlcnNpb24gPSBVTlNFVDsKLQotCXByaXZhdGUgaW50IGphdmFFRVZlcnNpb24gPSBVTlNFVDsKLQotCXByaXZhdGUgaW50IHR5cGUgPSBVTlNFVDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0eXBlIGFzIGRlZmluZWQgYnkgb25lIG9mCi0JICoge0BsaW5rIEoyRUVWZXJzaW9uQ29uc3RhbnRzI1VOS05PV059LAotCSAqIHtAbGluayBKMkVFVmVyc2lvbkNvbnN0YW50cyNBUFBMSUNBVElPTl9DTElFTlRfVFlQRX0sCi0JICoge0BsaW5rIEoyRUVWZXJzaW9uQ29uc3RhbnRzI0FQUExJQ0FUSU9OX1RZUEV9LAotCSAqIHtAbGluayBKMkVFVmVyc2lvbkNvbnN0YW50cyNFSkJfVFlQRX0sCi0JICoge0BsaW5rIEoyRUVWZXJzaW9uQ29uc3RhbnRzI0NPTk5FQ1RPUl9UWVBFfSwKLQkgKiB7QGxpbmsgSjJFRVZlcnNpb25Db25zdGFudHMjV0VCX1RZUEV9LAotCSAqIHtAbGluayBKMkVFVmVyc2lvbkNvbnN0YW50cyNXRUJTRVJWSUNFU19UWVBFfQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCWlmICh0eXBlID09IFVOU0VUKSB7Ci0JCQlTdHJpbmcgcm9vdE5hbWUgPSBoYW5kbGVyLmdldFJvb3ROYW1lKCk7Ci0JCQlpZiAocm9vdE5hbWUgPT0gbnVsbCkgewotCQkJCXR5cGUgPSBVTktOT1dOOwotCQkJfSBlbHNlIGlmIChyb290TmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0RPQ1RZUEUpKSB7Ci0JCQkJdHlwZSA9IEFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFOwotCQkJfSBlbHNlIGlmIChyb290TmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ET0NUWVBFKSkgewotCQkJCXR5cGUgPSBBUFBMSUNBVElPTl9UWVBFOwotCQkJfSBlbHNlIGlmIChyb290TmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfRE9DVFlQRSkpIHsKLQkJCQl0eXBlID0gRUpCX1RZUEU7Ci0JCQl9IGVsc2UgaWYgKHJvb3ROYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9ET0NUWVBFKSkgewotCQkJCXR5cGUgPSBDT05ORUNUT1JfVFlQRTsKLQkJCX0gZWxzZSBpZiAocm9vdE5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX0RPQ1RZUEUpKSB7Ci0JCQkJdHlwZSA9IFdFQl9UWVBFOwotCQkJfSBlbHNlIGlmIChyb290TmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfRE9DVFlQRSkpIHsKLQkJCQl0eXBlID0gV0VCU0VSVklDRVNfVFlQRTsKLQkJCX1lbHNlIHsKLQkJCQl0eXBlID0gVU5LTk9XTjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemVTY2hlbWFMb2NhdGlvbihTdHJpbmcgc2NoZW1hTG9jYXRpb24pewotCQlpZihzY2hlbWFMb2NhdGlvbiA9PSBudWxsKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWNoYXIgW10gb2xkQ2hhcnMgPSBzY2hlbWFMb2NhdGlvbi50b0NoYXJBcnJheSgpOwotCQljaGFyIFtdIG5ld0NoYXJzID0gbmV3IGNoYXJbb2xkQ2hhcnMubGVuZ3RoXTsKLQkJaW50IG5ld0NoYXJJbmRleCA9IDA7Ci0JCWJvb2xlYW4gb25XaGl0ZVNwYWNlID0gdHJ1ZTsKLQkJYm9vbGVhbiBhZnRlcldoaXRlU3BhY2UgPSBmYWxzZTsKLQkJZm9yKGludCBvbGRDaGFySW5kZXg9MDsgb2xkQ2hhckluZGV4PG9sZENoYXJzLmxlbmd0aDsgb2xkQ2hhckluZGV4KyspewotCQkJYWZ0ZXJXaGl0ZVNwYWNlID0gb25XaGl0ZVNwYWNlOwotCQkJb25XaGl0ZVNwYWNlID0gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShvbGRDaGFyc1tvbGRDaGFySW5kZXhdKTsKLQkJCWJvb2xlYW4gc2hvdWxkU2tpcCA9IG9uV2hpdGVTcGFjZSAmJiBhZnRlcldoaXRlU3BhY2U7Ci0JCQlpZighc2hvdWxkU2tpcCl7Ci0JCQkJbmV3Q2hhcnNbbmV3Q2hhckluZGV4KytdID0gb25XaGl0ZVNwYWNlID8gJyAnIDogb2xkQ2hhcnNbb2xkQ2hhckluZGV4XTsKLQkJCX0KLQkJCWJvb2xlYW4gYXRFbmQgPSAoKG9sZENoYXJJbmRleCArIDEpID09IG9sZENoYXJzLmxlbmd0aCk7Ci0JCQlpZihhdEVuZCAmJiBvbldoaXRlU3BhY2UpewotCQkJCXdoaWxlKG5ld0NoYXJJbmRleCA+IDAgICYmIG5ld0NoYXJzW25ld0NoYXJJbmRleC0xXSA9PSAnICcpewotCQkJCQluZXdDaGFySW5kZXggLS07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKG5ld0NoYXJzICE9IG51bGwpewotCQkJcmV0dXJuIG5ldyBTdHJpbmcobmV3Q2hhcnMsIDAsIG5ld0NoYXJJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc2NoZW1hTG9jYXRpb247Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gZm9yIHRoaXMgZGVwbG95bWVudCBkZXNjcmlwdG9yIHR5cGUuIEZvcgotCSAqIGV4YW1wbGUsIGlmIHRoaXMgaXMgYSBFSkIgMy4wIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdGhpcyByZXR1cm5zIHRoZQotCSAqIGNvbnN0YW50IGZvciAzLjAgYXMgZGVmaW5lZCBieWUge0BsaW5rIEoyRUVWZXJzaW9uQ29uc3RhbnRzfQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7Ci0JCWlmICh2ZXJzaW9uID09IFVOU0VUKSB7Ci0JCQlTdHJpbmcgcHVibGljSUQgPSBoYW5kbGVyLmdldER0ZFB1YmxpY0lEKCk7Ci0JCQlTdHJpbmcgc3lzdGVtSUQgPSBoYW5kbGVyLmdldER0ZFN5c3RlbUlEKCk7Ci0JCQlTdHJpbmcgc2NoZW1hTmFtZSA9IG51bGw7Ci0JCQlpZiAocHVibGljSUQgPT0gbnVsbCB8fCBzeXN0ZW1JRCA9PSBudWxsKSB7Ci0JCQkJaWYgKGhhbmRsZXIuZ2V0Um9vdEF0dHJpYnV0ZXMoKSAhPSBudWxsKSB7Ci0JCQkJCXNjaGVtYU5hbWUgPSBub3JtYWxpemVTY2hlbWFMb2NhdGlvbihoYW5kbGVyLmdldFJvb3RBdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoInhzaTpzY2hlbWFMb2NhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoc2NoZW1hTmFtZSA9PSBudWxsKSB7Ci0JCQkJCXZlcnNpb24gPSBVTktOT1dOOwotCQkJCQlyZXR1cm4gdmVyc2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQlzd2l0Y2ggKGdldFR5cGUoKSkgewotCQkJY2FzZSBBUFBMSUNBVElPTl9DTElFTlRfVFlQRToKLQkJCQlpZiAocHVibGljSUQgIT0gbnVsbCAmJiBzeXN0ZW1JRCAhPSBudWxsKSB7Ci0JCQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMykKLQkJCQkJCQkmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzMpIHx8IHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfQUxUX1NZU1RFTUlEXzFfMykpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzIpCi0JCQkJCQkJJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8yKSB8fCBzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0FMVF9TWVNURU1JRF8xXzIpKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lICE9IG51bGwpIHsKLQkJCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TQ0hFTUFfMV80KSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJCQl9IGVsc2UgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TQ0hFTUFfNSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBBUFBMSUNBVElPTl9UWVBFOgotCQkJCWlmIChwdWJsaWNJRCAhPSBudWxsICYmIHN5c3RlbUlEICE9IG51bGwpIHsKLQkJCQkJaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMykKLQkJCQkJCQkmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU1lTVEVNSURfMV8zKSB8fCBzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9BTFRfU1lTVEVNSURfMV8zKSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCQkJfSBlbHNlIGlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9QVUJMSUNJRF8xXzIpCi0JCQkJCQkJJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMikgfHwgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fQUxUX1NZU1RFTUlEXzFfMikpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHNjaGVtYU5hbWUgIT0gbnVsbCkgewotCQkJCQlpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TQ0hFTUFfMV80KSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJCQl9IGVsc2UgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU0NIRU1BXzUpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRUpCX1RZUEU6Ci0JCQkJaWYgKHB1YmxpY0lEICE9IG51bGwgJiYgc3lzdGVtSUQgIT0gbnVsbCkgewotCQkJCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1BVQkxJQ0lEXzJfMCkgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8yXzApIHx8IHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9BTFRfU1lTVEVNSURfMl8wKSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOwotCQkJCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9QVUJMSUNJRF8xXzEpICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfU1lTVEVNSURfMV8xKSB8fCBzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfQUxUX1NZU1RFTUlEXzFfMSkpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9TQ0hFTUFfMl8xKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfU0NIRU1BXzNfMCkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBDT05ORUNUT1JfVFlQRToKLQkJCQlpZiAocHVibGljSUQgIT0gbnVsbCAmJiBzeXN0ZW1JRCAhPSBudWxsKSB7Ci0JCQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfUFVCTElDSURfMV8wKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NZU1RFTUlEXzFfMCkgfHwgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX0FMVF9TWVNURU1JRF8xXzApKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHNjaGVtYU5hbWUgIT0gbnVsbCkgewotCQkJCQlpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU0NIRU1BXzFfNSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBXRUJfVFlQRToKLQkJCQlpZiAocHVibGljSUQgIT0gbnVsbCAmJiBzeXN0ZW1JRCAhPSBudWxsKSB7Ci0JCQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8zKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMykgfHwgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX0FMVF9TWVNURU1JRF8yXzMpKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1BVQkxJQ0lEXzJfMikgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TWVNURU1JRF8yXzIpIHx8IHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9BTFRfU1lTVEVNSURfMl8yKSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lICE9IG51bGwpIHsKLQkJCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NDSEVNQV8yXzQpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLQkJCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TQ0hFTUFfMl81KSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzVfSUQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdFQlNFUlZJQ0VTX1RZUEU6Ci0JCQkJaWYgKHB1YmxpY0lEICE9IG51bGwgJiYgc3lzdGVtSUQgIT0gbnVsbCkgewotCQkJCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCU0VSVklDRV9QVUJMSUNJRCkgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQlNFUlZJQ0VfU1lTVEVNSUQpKSkgewotCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQlNFUlZJQ0VTXzFfMF9JRDsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BXzFfMSkpIHsKLQkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJTRVJWSUNFU18xXzFfSUQ7Ci0JCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJTRVJWSUNFX1NDSEVNQV8xXzIpKSB7Ci0JCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCU0VSVklDRVNfMV8yX0lEOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICh2ZXJzaW9uID09IFVOU0VUKSB7Ci0JCQkJdmVyc2lvbiA9IFVOS05PV047Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogTWFwcyB0aGUgdmVyc2lvbiByZXR1cm5lZCBmcm9tIHtAbGluayAjZ2V0VmVyc2lvbigpfSB0byB0aGUgSmF2YSBFRSBzcGVjCi0JICogdmVyc2lvbi4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgYW4gRUpCIDMuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHRoaXMKLQkgKiByZXR1cm5zIHRoZSBjb25zdGFudCBmb3IgNS4wICh3aGljaCBtYXBzIHRvIHRoZSBKYXZhIEVFIHNwZWMgdmVyc2lvbiBvZgotCSAqIDUuMCkuIGFzIGRlZmluZWQgYnkge0BsaW5rIEoyRUVWZXJzaW9uQ29uc3RhbnRzfQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEphdmFFRVZlcnNpb24oKSB7Ci0JCWlmIChqYXZhRUVWZXJzaW9uID09IFVOU0VUKSB7Ci0JCQlpbnQgdHlwZSA9IGdldFR5cGUoKTsKLQkJCWludCB2ZXJzaW9uID0gZ2V0VmVyc2lvbigpOwotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIEFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFOgotCQkJY2FzZSBBUFBMSUNBVElPTl9UWVBFOgotCQkJCWphdmFFRVZlcnNpb24gPSB2ZXJzaW9uOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFSkJfVFlQRToKLQkJCQlzd2l0Y2ggKHZlcnNpb24pIHsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ6Ci0JCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOgotCQkJCQlqYXZhRUVWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDoKLQkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzBfSUQ6Ci0JCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFQ29uc3RhbnRzLkpFRV81XzBfSUQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBDT05ORUNUT1JfVFlQRToKLQkJCQlzd2l0Y2ggKHZlcnNpb24pIHsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ6Ci0JCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6Ci0JCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdFQl9UWVBFOgotCQkJCXN3aXRjaCAodmVyc2lvbikgewotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDoKLQkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQ6Ci0JCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOgotCQkJCQlqYXZhRUVWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNV9JRDoKLQkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQljYXNlIFdFQlNFUlZJQ0VTX1RZUEU6Ci0JCQlzd2l0Y2ggKHZlcnNpb24pIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCU0VSVklDRVNfMV8wX0lEOgotCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCU0VSVklDRVNfMV8xX0lEOgotCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCU0VSVklDRVNfMV8yX0lEOgotCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJCWlmIChqYXZhRUVWZXJzaW9uID09IFVOU0VUKSB7Ci0JCQkJamF2YUVFVmVyc2lvbiA9IFVOS05PV047Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGphdmFFRVZlcnNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbikgewotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEphdmFFRVZlcnNpb24oaW50IGphdmFFRVZlcnNpb24pIHsKLQkJdGhpcy5qYXZhRUVWZXJzaW9uID0gamF2YUVFVmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL3V0aWwvaW50ZXJuYWwvWE1MUm9vdEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvdXRpbC9pbnRlcm5hbC9YTUxSb290SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGRjMjZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvdXRpbC9pbnRlcm5hbC9YTUxSb290SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MUm9vdEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciBpbXBsZW1lbnRzIExleGljYWxIYW5kbGVyIHsKLQkvKioKLQkgKiBBbiBleGNlcHRpb24gaW5kaWNhdGluZyB0aGF0IHRoZSBwYXJzaW5nIHNob3VsZCBzdG9wLiBUaGlzIGlzIHVzdWFsbHkKLQkgKiB0cmlnZ2VyZWQgd2hlbiB0aGUgdG9wLWxldmVsIGVsZW1lbnQgaGFzIGJlZW4gZm91bmQuCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXByaXZhdGUgY2xhc3MgU3RvcFBhcnNpbmdFeGNlcHRpb24gZXh0ZW5kcyBTQVhFeGNlcHRpb24gewotCQkvKioKLQkJICogQWxsIHNlcmlhbGl6YWJsZSBvYmplY3RzIHNob3VsZCBoYXZlIGEgc3RhYmxlIHNlcmlhbFZlcnNpb25VSUQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIDxjb2RlPlN0b3BQYXJzaW5nRXhjZXB0aW9uPC9jb2RlPiB3aXRoIGEKLQkJICogPGNvZGU+bnVsbDwvY29kZT4gZGV0YWlsIG1lc3NhZ2UuCi0JCSAqLwotCQlwdWJsaWMgU3RvcFBhcnNpbmdFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigoU3RyaW5nKSBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGR0ZE5hbWUgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgZHRkUHVibGljSUQgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgZHRkU3lzdGVtSUQgPSBudWxsOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgdG9wLWxldmVsIGVsZW1lbnQgZm91bmQgaW4gdGhlIFhNTCBmaWxlLiBUaGlzCi0JICogbWVtYmVyIHZhcmlhYmxlIGlzIDxjb2RlPm51bGw8L2NvZGU+IHVubGVzcyB0aGUgZmlsZSBoYXMgYmVlbiBwYXJzZWQKLQkgKiBzdWNjZXNzZnVsIHRvIHRoZSBwb2ludCBvZiBmaW5kaW5nIHRoZSB0b3AtbGV2ZWwgZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50Rm91bmQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlc2UgYXJlIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBmb3VuZCBpbiB0aGUgWE1MIGZpbGUuCi0JICogVGhpcyBtZW1iZXIgdmFyaWFibGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gdW5sZXNzIHRoZSBmaWxlIGhhcyBiZWVuCi0JICogcGFyc2VkIHN1Y2Nlc3NmdWwgdG8gdGhlIHBvaW50IG9mIGZpbmRpbmcgdGhlIHRvcC1sZXZlbCBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgQXR0cmlidXRlcyBhdHRyaWJ1dGVzRm91bmQgPSBudWxsOwotCi0JcHVibGljIFN0cmluZyBnZXREdGROYW1lKCkgewotCQlyZXR1cm4gZHRkTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldER0ZFB1YmxpY0lEKCkgewotCQlyZXR1cm4gZHRkUHVibGljSUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREdGRTeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIGR0ZFN5c3RlbUlEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50Rm91bmQ7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZXMgZ2V0Um9vdEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzRm91bmQ7Ci0JfQotCi0JcHVibGljIFhNTFJvb3RIYW5kbGVyKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2NvbW1lbnQoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb21tZW50KGZpbmFsIGNoYXJbXSBjaCwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgU0FYIHBhcnNlciBmb3IgdXNlIHdpdGhpbiB0aGlzIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgcGFyc2VyLgotCSAqIAotCSAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIGEgcGFyc2VyIG9mIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBjcmVhdGVkLgotCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgc29tZXRoaW5nIGluIGdlbmVyYWwgZ29lcyB3cm9uZyB3aGVuIGNyZWF0aW5nIHRoZSBwYXJzZXIuCi0JICogQHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIDxjb2RlPlhNTFJlYWRlcjwvY29kZT4gZG9lcyBub3QgcmVjb2duaXplIHRoZQotCSAqICAgICAgICAgICAgIGxleGljYWwgaGFuZGxlciBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQkgKiBAdGhyb3dzIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSA8Y29kZT5YTUxSZWFkZXI8L2NvZGU+IGRvZXMgbm90IHN1cHBvcnQgdGhlIGxleGljYWwKLQkgKiAgICAgICAgICAgICBoYW5kbGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgU0FYUGFyc2VyIGNyZWF0ZVBhcnNlcihTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIHBhcnNlci4KLQkJZmluYWwgU0FYUGFyc2VyIHBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCWZpbmFsIFhNTFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZGlzYWJsZSBEVEQgdmFsaWRhdGlvbiAoYnVnIDYzNjI1KQotCQl0cnkgewotCQkJLy8gYmUgc3VyZSB2YWxpZGF0aW9uIGlzICJvZmYiIG9yIHRoZSBmZWF0dXJlIHRvIGlnbm9yZSBEVEQncyB3aWxsCi0JCQkvLyBub3QgYXBwbHkKLQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9ub252YWxpZGF0aW5nL2xvYWQtZXh0ZXJuYWwtZHRkIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gbm90IGEgYmlnIGRlYWwgaWYgdGhlIHBhcnNlciBkb2VzIG5vdCByZWNvZ25pemUgdGhlIGZlYXR1cmVzCi0JCX0gY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBub3QgYSBiaWcgZGVhbCBpZiB0aGUgcGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZlYXR1cmVzCi0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNlbmRDREFUQSgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZW5kQ0RBVEEoKSB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZERURCgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZW5kRFREKCkgewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNlbmRFbnRpdHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBlbmRFbnRpdHkoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyc2VDb250ZW50cyhJbnB1dFNvdXJjZSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQkvLyBQYXJzZSB0aGUgZmlsZSBpbnRvIHdlIGhhdmUgd2hhdCB3ZSBuZWVkIChvciBhbiBlcnJvciBvY2N1cnMpLgotCQl0cnkgewotCQkJU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmaW5hbCBTQVhQYXJzZXIgcGFyc2VyID0gY3JlYXRlUGFyc2VyKGZhY3RvcnkpOwotCQkJLy8gdG8gc3VwcG9ydCBleHRlcm5hbCBlbnRpdGllcyBzcGVjaWZpZWQgYXMgcmVsYXRpdmUgVVJJcyAoc2VlIGJ1ZwotCQkJLy8gNjMyOTgpCi0JCQljb250ZW50cy5zZXRTeXN0ZW1JZCgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlwYXJzZXIucGFyc2UoY29udGVudHMsIHRoaXMpOwotCQl9IGNhdGNoIChTdG9wUGFyc2luZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBBYm9ydCB0aGUgcGFyc2luZyBub3JtYWxseS4gRmFsbCB0aHJvdWdoLi4uCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBSZXNvbHZlIGV4dGVybmFsIGVudGl0eSBkZWZpbml0aW9ucyB0byBhbiBlbXB0eSBzdHJpbmcuIFRoaXMgaXMgdG8gc3BlZWQKLQkgKiB1cCBwcm9jZXNzaW5nIG9mIGZpbGVzIHdpdGggZXh0ZXJuYWwgRFREcy4gTm90IHJlc29sdmluZyB0aGUgY29udGVudHMgb2YKLQkgKiB0aGUgRFREIGlzIG9rLCBhcyBvbmx5IHRoZSBTeXN0ZW0gSUQgb2YgdGhlIERURCBkZWNsYXJhdGlvbiBpcyB1c2VkLgotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNyZXNvbHZlRW50aXR5KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKCIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydENEQVRBKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydENEQVRBKCkgewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydERURChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydERURChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHB1YmxpY0lkLCBmaW5hbCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlkdGROYW1lID0gbmFtZTsKLQkJZHRkUHVibGljSUQgPSBwdWJsaWNJZDsKLQkJZHRkU3lzdGVtSUQgPSBzeXN0ZW1JZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydEVsZW1lbnQoZmluYWwgU3RyaW5nIHVyaSwgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgZmluYWwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJZWxlbWVudEZvdW5kID0gZWxlbWVudE5hbWUgPT0gbnVsbCB8fCBlbGVtZW50TmFtZS5sZW5ndGgoKSA9PSAwID8gcXVhbGlmaWVkTmFtZTogZWxlbWVudE5hbWU7Ci0JCWlmKGVsZW1lbnRGb3VuZC5pbmRleE9mKCc6JykgIT0gLTEpewotCQkJZWxlbWVudEZvdW5kID0gZWxlbWVudEZvdW5kLnN1YnN0cmluZyhlbGVtZW50Rm91bmQuaW5kZXhPZignOicpKzEpOwotCQl9Ci0JCWF0dHJpYnV0ZXNGb3VuZCA9IGF0dHJpYnV0ZXM7Ci0JCXRocm93IG5ldyBTdG9wUGFyc2luZ0V4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0RW50aXR5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc3RhcnRFbnRpdHkoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWY4MTk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgc2NoZW1hLwotc3JjLmluY2x1ZGVzID0gcm9zZS8sXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBtb2RlbC8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBtb2ZqMmVlLyxcCi0gICAgICAgICAgIHdlYnNlcnZpY2VzLyxcCi0gICAgICAgICAgIGNvbW1vbkFyY2hpdmUvLFwKLSAgICAgICAgICAgajJlZUNvcmVQbHVnaW4vLFwKLSAgICAgICAgICAgajJlZS12YWxpZGF0aW9uLyxcCi0gICAgICAgICAgIGFyY2hpdmUvLFwKLSAgICAgICAgICAgamVlLW1vZGVscy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL2NvbW1vbmFyY2hpdmUucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL2NvbW1vbmFyY2hpdmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwZjU0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9jb21tb25hcmNoaXZlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXN1YmNsYXNzX3Jlc3BvbnNpYmlsdHlfRVhDXz1JV0FFMDAwMUUgezB9IG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MKLWtleV9jbGFzc19yZWZsZWN0aW9uX0VSUk9SXz1JV0FFMDAwMkUgVW5hYmxlIHRvIHJlZmxlY3QgdGhlIGNsYXNzICJ7MH0iIGluIG9yZGVyIHRvIGNvbXBhcmUgdGhlIHByaW1hcnkga2V5IGZpZWxkICJ7MX0iIGZyb20gZW50aXR5ICJ7Mn0iCi1rZXlfZmllbGRfcmVmbGVjdGlvbl9FUlJPUl89SVdBRTAwMDNFIFVuYWJsZSB0byByZWZsZWN0IHRoZSB0eXBlIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZCAiezB9IiBmcm9tIGVudGl0eSAiezF9IgotcmVtb3Zpbmdfa2V5X2ZpZWxkX0lORk9fPUlXQUUwMDA0SSBSZW1vdmluZyBpbnZhbGlkIHByaW0ta2V5LWZpZWxkICJ7MH0iIGZyb20gZW50aXR5ICJ7MX0iCi1yZXBhaXJfdXNhZ2VfRVJST1JfPUlXQUUwMDA1RSBSZXBhaXJBcmNoaXZlQ29tbWFuZCB1c2FnZTogY2Fubm90IHdyaXRlIHRvIGRlc3RpbmF0aW9uUGF0aDogezB9Ci1pbnZhbGlkX2FyY2hpdmVfRVhDXz1JV0FFMDAwNkUgQXJjaGl2ZSBpcyBub3QgYSB2YWxpZCB7MH0gYmVjYXVzZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNhbiBub3QgYmUgZm91bmQgKGNhc2Ugc2Vuc2l0aXZlKTogezF9Ci1sb2FkX3Jlc291cmNlX0VYQ189SVdBRTAwMDdFIENvdWxkIG5vdCBsb2FkIHJlc291cmNlICJ7MH0iIGluIGFyY2hpdmUgInsxfSIKLW5lc3RlZF9qYXJfRVhDXz1JV0FFMDAwOEUgQW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyB7MH0gZnJvbSB7MX0KLW1ha2VfdGVtcF9kaXJfRVhDXz1JV0FFMDAwOUUgVW5hYmxlIHRvIG1ha2UgdGVtcCBkaXJlY3Rvcnk6IHswfQotaW52YWxpZF9jbGFzc3BhdGhfV0FSTl89SVdBRTAwMTBXIENsYXNzcGF0aCBlbGVtZW50ICJ7MH0iIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIFppcCBmaWxlCi1pbnZhbGlkX2NwX2ZpbGVfV0FSTl89SVdBRTAwMTFXIENsYXNzcGF0aCBlbGVtZW50ICJ7MH0iIGRvZXMgbm90IHBvaW50IHRvIGEgbG9jYWwgZmlsZQotaW9fZXhfbG9hZGluZ19FWENfPUlXQUUwMDEyRSBBbiBJTyBleGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyB7MH0KLXR4X2JlYW5fbWdkX1dBUk5fPUlXQUUwMDEzVyBFSkIgMS4wIEltcG9ydDogTm90IG1hcHBpbmcgVFhfQkVBTl9NQU5BR0VEIGNvbnRyb2wgZGVzY3JpcHRvciBmb3IgezB9Ci1lcnJvcl9zYXZpbmdfRVhDXz1JV0FFMDAxNEUgRXJyb3Igc2F2aW5nIHswfQotaW9fZXhfbWFuaWZlc3RfRVhDXz1JV0FFMDAxNUUgQW4gSU9FeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyB0aGUgbWFuaWZlc3QgaW4gYXJjaGl2ZTogezB9Ci1pb19leF9yZW9wZW5fRVhDXz1JV0FFMDAxNkUgSU9FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcmVvcGVuaW5nIHswfQotdW5hYmxlX3JlcGxhY2VfRVhDXz1JV0FFMDAxN0UgVW5hYmxlIHRvIHJlcGxhY2Ugb3JpZ2luYWwgYXJjaGl2ZTogezB9Ci1kdXBsaWNhdGVfZmlsZV9FWENfPUlXQUUwMDE4RSBUaGUgYXJjaGl2ZSBuYW1lZCB7MH0gYWxyZWFkeSBjb250YWlucyBhIGZpbGUgbmFtZWQgezF9Ci1kdXBsaWNhdGVfZW50cnlfRVhDXz1JV0FFMDAxOUUgQSBmaWxlIG9yIHJlc291cmNlIHdpdGggdXJpIHswfSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYXJjaGl2ZSBuYW1lZCB7MX0KLWZpbGVfZXhpc3RfYXNfZGlyX0VYQ189SVdBRTAwMjBFIEEgZmlsZSBuYW1lZCB7MH0gZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeQotdW5jb250YWluZWRfbW9kdWxlX0VYQ189SVdBRTAwMjFFIE1vZHVsZSB7MH0gaXMgbm90IGNvbnRhaW5lZCBieSBhbiBFQVIgZmlsZQotZGRfaW5fZWFyX2xvYWRfRVhDXz1JV0FFMDAyMkUgRXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBtb2R1bGUgInswfSIgaW4gRUFSIGZpbGUgInsxfSIKLW5lc3RlZF9vcGVuX2ZhaWxfRVhDXz1JV0FFMDAyM0UgVW5hYmxlIHRvIG9wZW4gbW9kdWxlIGZpbGUgInswfSIgaW4gRUFSIGZpbGUgInsxfSIKLWR1cGxpY2F0ZV9tb2R1bGVfRVhDXz1JV0FFMDAyNEUgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgdGhlIEVBUiBmaWxlICJ7MH0iIGFscmVhZHkgY29udGFpbnMgYSBtb2R1bGUgaGF2aW5nIHVyaSAiezF9Igotbm9fc2VjX3JvbGVfRVhDXz1JV0FFMDAyNUUgezB9OiBFQVIgRmlsZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgezF9Ci1kdXBfc2VjX3JvbGVfRVhDXz1JV0FFMDAyNkUgezB9OiBFQVIgRmlsZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWxyZWFkeSBjb250YWlucyBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgezF9Ci1kdXBfc2VjX3JvbGVfbW9kdWxlX0VYQ189SVdBRTAwMjdFIERlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgezB9IGFscmVhZHkgY29udGFpbnMgYSBzZWN1cml0eSByb2xlIG5hbWVkIHsxfQotZHVwX3Jlc291cmNlX0VYQ189SVdBRTAwMjhFIFJlc291cmNlIG5hbWVkICJ7MH0iIGFscmVhZHkgZXhpc3RzIGluIGFyY2hpdmUgInsxfSIKLWVycm9yX3NhdmluZ19FWENfPUlXQUUwMDMwRSBFcnJvciBzYXZpbmcgezB9Ci1hZGRfY29weV9jbGFzc19kaXJfRVhDXz1JV0FFMDAzMUUgVGhlIG1ldGhvZCAiYWRkQ29weUNsYXNzIiBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3Rvcmllcy4gVVJJOiB7MH0KLWFkZF9jb3B5X2xpYl9kaXJfRVhDXz1JV0FFMDAzMkUgVGhlIG1ldGhvZCAiYWRkQ29weUxpYiIgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3JpZXMuIFVSSTogezB9Ci1saXN0X2NvbXBvbmVudHNfd2FyX0VYQ189SVdBRTAwMzNFIEV4Y2VwdGlvbiBvY2N1cnJlZCBsaXN0aW5nIGNvbXBvbmVudHMgaW4gV0FSIGZpbGU6IHswfQotb3Blbl9uZXN0ZWRfRVhDXz1JV0FFMDAzNEUgQ291bGQgbm90IG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlICJ7MH0iIGluICJ7MX0iCi1tYWtlX3RlbXBfZmlsZV9XQVJOXz1JV0FFMDAzNVcgV2FybmluZzogVW5hYmxlIHRvIGNyZWF0ZSB0ZW1wIGZpbGUgZm9yIHswfS4gIFRoaXMgd2lsbCBpbXBhY3QgcGVyZm9ybWFuY2UuCi1maWxlX25vdF9mb3VuZF9FWENfPUlXQUUwMDM2RSBVUkkgTmFtZTogezB9OyBGaWxlIG5hbWU6IHsxfQotY291bGRfbm90X29wZW5fRVhDXz1JV0FFMDAzN0UgQ291bGQgbm90IG9wZW4gezB9Ci1jb3VsZF9ub3RfZmluZF9kaXJfRVhDXz1JV0FFMDAzOEUgVW5hYmxlIHRvIG9wZW4gZGlyZWN0b3J5IHswfQotbm90X2FfZGlyX0VYQ189SVdBRTAwMzlFIFVuYWJsZSB0byBvcGVuIGRpcmVjdG9yeSBiZWNhdXNlIGZpbGUgaXMgbm90IGEgZGlyZWN0b3J5OiB7MH0KLWluZmVycmVkX2Rkc19FWENfPUlXQUUwMDQwRSBUaGUgRUpCIEpBUiBmaWxlICJ7MH0iIHdhcyBpbmZlcnJlZCB0byBiZSBvZiB2ZXJzaW9uIDEuMCBiZWNhdXNlIHRoZSBtYW5pZmVzdCBkb2VzIG5vdCBkZWNsYXJlIGVudGVycHJpc2UgYmVhbnMgYnV0IHNlcmlhbGl6ZWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBleGlzdCBpbiB0aGUgSkFSLgotZmlsZW5hbWVfZXhjZXB0aW9uX0VYQ189SVdBRTAwNDFFIEZpbGVuYW1lOiB7MH07IEV4Y2VwdGlvbjogezF9Ci1ub19kZHNfMTBfRVhDXz1JV0FFMDA0MkUgTm8gZGVwbG95bWVudCBkZXNjcmlwdG9ycyBpbiBFSkIgMS4wIEpBUiBmaWxlOiB7MH0KLW1hbmlmZXN0X2RkX2xvYWRfRVhDXz1JV0FFMDA0M0UgVGhlIEpBUiBtYW5pZmVzdCBkZWNsYXJlcyBhbiBlbnRlcnByaXNlIGJlYW4gZm9yIHdoaWNoIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSBjYW4gbm90IGJlIGxvYWRlZDogezB9Ci1tYW5pZmVzdF9kZF9maW5kX0VYQ189SVdBRTAwNDRFIFRoZSBKQVIgbWFuaWZlc3QgZGVjbGFyZXMgYW4gZW50ZXJwcmlzZSBiZWFuIGZvciB3aGljaCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgY2FuIG5vdCBiZSBmb3VuZDogezB9Ci1pb19leF9yZWFkaW5nX2RkX0VYQ189SVdBRTAwNDVFIElPIEV4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIHswfQotc2VyX25vdF9kZF9FWENfPUlXQUUwMDQ2RSBUaGUgc2VyaWFsaXplZCBvYmplY3QgaW4gZmlsZSAiezB9IiBpcyBub3QgYSBhbiBpbnN0YW5jZSBvZiBqYXZheC5lamIuZGVwbG95bWVudC5EZXBsb3ltZW50RGVzY3JpcHRvcgotcmVhZGluZ19kZF9FWENfPUlXQUUwMDQ3RSBFeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyB7MH0KLW1pc3NpbmdfY2xhc3NfRVhDXz1JV0FFMDA0OEUgQ291bGQgbm90IGRlc2VyaWFsaXplIHswfSBiZWNhdXNlIGEgcmVxdWlyZWQgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kLiAgRXhjZXB0aW9uOiB7MX0KLUNvbnZlcnRlZD1Db252ZXJ0ZWQKLVN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlX0VYQ189SVdBRTAwNDlFIFN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Ci1JT0V4Y2VwdGlvbl9vY2N1cnJlZF93aGlsZV9FWENfPUlXQUUwMDUwRSBJT0V4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBjb3B5aW5nIG1hbmlmZXN0Ci1FeHRyYWN0X2Rlc3RpbmF0aW9uX2lzX3RoZV9FWENfPUlXQUUwMDUxRSBFeHRyYWN0IGRlc3RpbmF0aW9uIGlzIHRoZSBzYW1lIHBhdGggYXMgc291cmNlIGZpbGUKLVBhcmFtZXRlcl9zaG91bGRfbm90X2JlX251X0VYQ189SVdBRTAwNTJFIFBhcmFtZXRlciBzaG91bGQgbm90IGJlIG51bGwKLUFyY2hpdmVfaXNfbm90X2FfdmFsaWRfRUpCX0VYQ189SVdBRTAwNTVFIEFyY2hpdmUgaXMgbm90IGEgdmFsaWQgRUpCIEpBUiBmaWxlICgxLjApIGJlY2F1c2Ugbm8gc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGNhbiBiZSBmb3VuZCwgZWl0aGVyIGluIHRoZSBtYW5pZmVzdCBvciBpbiBlbnRyaWVzIHdpdGggYSAiLnNlciIgZXh0ZW5zaW9uCi1fVGhlX2ZvbGxvd2luZ19maWxlc19jb3VsZF9FWENfPUlXQUUwMDU2RSBUaGUgZm9sbG93aW5nIGZpbGVzIGNvdWxkIG5vdCBiZSBsb2FkZWQ6Ci1GaXhQcmltS2V5Q29tbWFuZF9mYWlsZWRfX19FWENfPUlXQUUwMDU3RSBGaXhQcmltS2V5Q29tbWFuZCBmYWlsZWQgLSBleGNlcHRpb24gc3RhY2sgdHJhY2U6Ci1GaXhQcmltS2V5Q29tbWFuZF91c2FnZV9fXz1GaXhQcmltS2V5Q29tbWFuZCB1c2FnZTogIDxzb3VyY2VKYXJGaWxlUGF0aD4gW2Rlc3RpbmF0aW9uUGF0aF0KLUZpeFByaW1LZXlDb21tYW5kX3VzYWdlX19zX0VYQ189SVdBRTAwNThFIEZpeFByaW1LZXlDb21tYW5kIHVzYWdlOiBzb3VyY2VKYXJGaWxlUGF0aCBtdXN0IHBvaW50IHRvIGEgdmFsaWQgRUpCIEpBUiBmaWxlIG9yIGRpcmVjdG9yeSBvZiBhbiBpbmZsYXRlZCBFSkIgSkFSIGZpbGUKLVJlcGFpcl9jb21tYW5kX2ZhaWxlZF9fX2V4X0VYQ189SVdBRTAwNTlFIFJlcGFpciBjb21tYW5kIGZhaWxlZCAtIGV4Y2VwdGlvbiBzdGFjayB0cmFjZToKLVJlcGFpcnNfYWxsX2VudHJpZXNfaW5fdGhlPVJlcGFpcnMgYWxsIGVudHJpZXMgaW4gdGhlIE1FVEEtSU5GIGFuZC9vciBXRUItSU5GIGRpcmVjdG9yaWVzIHRvIGJlIHRoZSBjb3JyZWN0IGNhc2UKLVJlcGFpckFyY2hpdmVDb21tYW5kX3VzYWdlPVJlcGFpckFyY2hpdmVDb21tYW5kIHVzYWdlOiAgPHNvdXJjZUphckZpbGVQYXRoPiA8ZGVzdGluYXRpb25QYXRoPgotUmVwYWlyQXJjaGl2ZUNvbW1hbmRfdXNhZ2UxX0VSUk9SXz1JV0FFMDA2MEUgUmVwYWlyQXJjaGl2ZUNvbW1hbmQgdXNhZ2U6IHNvdXJjZUphckZpbGVQYXRoIG11c3QgcG9pbnQgdG8gYSB2YWxpZCBhcmNoaXZlIG9yIGRpcmVjdG9yeSBvZiBhbiBpbmZsYXRlZCBhcmNoaXZlCi1BcHBsaWNhdGlvbl9DbGllbnRfSmFyX0ZpbD1BcHBsaWNhdGlvbiBDbGllbnQgSkFSIEZpbGUKLUVBUl9GaWxlPUVBUiBGaWxlCi1FSkJfSmFyX0ZpbGU9RUpCIEpBUiBGaWxlCi1SQVJfRmlsZT1SQVIgRmlsZQotV0FSX0ZpbGU9V0FSIEZpbGUKLUVycm9yX29jY3VycmVkX2l0ZXJhdGluZ19mX0VYQ189SVdBRTAwNjFFIEVycm9yIG9jY3VycmVkIGl0ZXJhdGluZyBmaWxlcwotRW5kX29mX2xpc3RfcmVhY2hlZF9FWENfPUlXQUUwMDYyRSBSZWFjaGVkIGVuZCBvZiBsaXN0Ci1JbnRlcm5hbF9FcnJvcl9fSXRlcmF0b3Jfb19FWENfPUlXQUUwMDYzRSBJbnRlcm5hbCBFcnJvcjogSXRlcmF0b3Igb3V0IG9mIHN5bmMgd2l0aCB6aXAgZW50cmllcwotRXJyb3JfaXRlcmF0aW5nX3RoZV9hcmNoaXZfRVhDXz1JV0FFMDA2NEUgRXJyb3IgaXRlcmF0aW5nIHRoZSBhcmNoaXZlCi1BYnNvbHV0ZV9wYXRoX3Vua25vd25fRVhDXz1JV0FFMDA2NUUgQWJzb2x1dGUgcGF0aCB1bmtub3duCi1PcmlnaW5hbF9hcmNoaXZlX2lzX25vdF9hX19FWENfPUlXQUUwMDY2RSBPcmlnaW5hbCBhcmNoaXZlIGlzIG5vdCBhIGRpcmVjdG9yeQotTnVsbF91cmlfRVhDXz1JV0FFMDA2N0UgTnVsbCB1cmkKLU1vZHVsZV9maWxlPU1vZHVsZSBmaWxlCi1BX1dBUl9maWxlPVdBUiBmaWxlCi1Bbl9FSkJfSkFSX2ZpbGU9RUpCIEpBUiBmaWxlCi1Bbl9BcHBsaWNhdGlvbl9DbGllbnRfSkFSX2ZpbGU9QXBwbGljYXRpb24gQ2xpZW50IEpBUiBmaWxlCi1BX1JBUl9maWxlPVJBUiBmaWxlCi1BX0FwcGxpY2F0aW9uX2ZpbGU9QXBwbGljYXRpb24gZmlsZQotQV9maWxlX2RvZXNfbm90X2V4aXN0X2Zvcl9tb2R1bGU9QSBmaWxlIGRvZXMgbm90IGV4aXN0IGZvciBtb2R1bGUgZWxlbWVudCBoYXZpbmcgdXJpOiB7MH0KLUZpbGVfbm90X2NvcnJlY3RfdHlwZT1UaGUgZmlsZSB7MH0gaW4gRUFSIGZpbGUgezF9IGlzIG5vdCB0aGUgY29ycmVjdCB0eXBlIGJhc2VkIG9uIHRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBFeHBlY3RlZCB0eXBlOiB7Mn0iOwotTW9kdWxlX25vdF9pbl9FQVI9TW9kdWxlIGlzIG5vdCBpbiBhbiBFQVI6IHswfQotTW9kdWxlX2ZpbGVfZG9lc19ub3RfZXhpc3RfMj1Nb2R1bGUgZmlsZSBkb2VzIG5vdCBleGlzdCBmb3IgTW9kdWxlIHJlZi4gIE1vZHVsZSA9IHswfQotRmlsZUltcGxfX0Vycm9yXzA9UmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQXBwbGljYXRpb25DbGllbnRGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcHBsaWNhdGlvbkNsaWVudEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiODQ5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcHBsaWNhdGlvbkNsaWVudEZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkRlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbkNsaWVudEZpbGUgZXh0ZW5kcyBNb2R1bGVGaWxlIHsKLQotCS8qKgotCSAqIEB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGNhbid0IG92ZXJyaWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGdlbmVyYXRlZAotCSAqICAgICAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCUFwcGxpY2F0aW9uQ2xpZW50IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoQXBwbGljYXRpb25DbGllbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcmNoaXZlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcmNoaXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOTJkMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQXJjaGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZW9wZW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5GaWxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5SdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyY2hpdmUgZXh0ZW5kcyBDb250YWluZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX05PTkUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9XQVJfRklMRVMgPSAxIDw8IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0VBUl9GSUxFUyA9IDEgPDwgMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfRUpCSkFSX0ZJTEVTID0gMSA8PCAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9BUFBDTElFTlRfRklMRVMgPSAxIDw8IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0FSQ0hJVkVTID0gMSA8PCA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9SQVJfRklMRVMgPSAxIDw8IDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0FMTCA9ICgxIDw8IDEpIHwgKDEgPDwgMikgfCAoMSA8PCAzKSB8ICgxIDw8IDQpIHwgKDEgPDwgNSkgfCAoMSA8PCA2KTsKLQotCXB1YmxpYyBBcmNoaXZlIGFkZENvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JcHVibGljIEZpbGUgYWRkQ29weShGaWxlIGFGaWxlKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldCBhIGZsYXR0ZW5lZCBsaXN0IGZyb20gdGhlIGRpcmVjdG9yeSwgdGhlbiBhZGRDb3B5IHRoZSBsaXN0Ci0JICogCi0JICogQHRocm93cyBjb20uaWJtLmV0b29scy5hcmNoaXZlLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIGZpbGUgd2l0aCBhIHVyaSB0aGF0IGVxdWFscyBvbmUgb2YgdGhlIG5lc3RlZCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGV4aXN0cwotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QgdGhlIGNvcGllZCBmaWxlcyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgTGlzdCBhZGRDb3B5KFJlYWRPbmx5RGlyZWN0b3J5IGRpcikgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQlwdWJsaWMgTGlzdCBhZGRDb3B5RmlsZXMoTGlzdCBsaXN0T2ZGaWxlcykgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCBhZGRPclJlcGxhY2VNb2ZSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0RGVwZW5kZW50T3BlbkFyY2hpdmVzKCl9Ci0JICogCi0JICogSWYgYW55IG9wZW5lZCBhcmNoaXZlIGNvbnRhaW5zIGZpbGVzIHRoYXQgaGF2ZSB0aGlzIGFyY2hpdmUgYXMgaXRzIGxvYWRpbmcgY29udGFpbmVyLCByZXR1cm4KLQkgKiBmYWxzZTsgb3RoZXJ3aXNlIHJldHVybiB0cnVlLiBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOiBvcGVuIGphciBBLiBjcmVhdGUKLQkgKiBqYXIgQi4gQ29weSBmaWxlcyBmcm9tIEEgdG8gQi4gQXR0ZW1wdCB0byBjbG9zZSBqYXIgQSBiZWZvcmUgc2F2aW5nIGphciBCLiBUaGVuIGF0dGVtcHQgdG8KLQkgKiBzYXZlIEIsIGFuZCB0aGUgc2F2ZSBmYWlscyBiZWNhdXNlIEEgaXMgY2xvc2VkLiBUaGlzIG1ldGhvZCBhbGxvd3MgY2xpZW50IGNvZGUgdG8gdGVzdCBmb3IKLQkgKiBkZXBlbmRlbnQgb3BlbiBhcmNoaXZlcyBiZWZvcmUgc2F2aW5nIHRoZSBzb3VyY2UgYXJjaGl2ZS4gSWYgdGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSwgdGhlCi0JICogc29sdXRpb24gaXMgdG8gZWl0aGVyIGNsb3NlIG9yIHNhdmUgQiBiZWZvcmUgY2xvc2luZyBBLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNsb3NlKCk7Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGxvYWQgc3RyYXRlZ3kgZm9yIHRoaXMgYXJjaGl2ZSBhbmQgY2xvc2VzIGFsbCBjb250YWluZWQgYXJjaGl2ZXM7IFdBUk5JTkc6IElmCi0JICogZmlsZXMgaGF2ZSBiZWVuIGNvcGllZCBmcm9tIHRoaXMgYXJjaGl2ZSB0byBhbm90aGVyIGFyY2hpdmUsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIGFyY2hpdmUKLQkgKiBzaG91bGQgYmUgc2F2ZWQgb3IgY2xvc2VkIGJlZm9yZSB0aGlzIGFyY2hpdmUgY2FuIGJlIHNhZmVseSBjbG9zZWQ7IHRvIHRlc3QgaWYgdGhpcyBhcmNoaXZlCi0JICogY2FuIHNhZmVseSBjbG9zZSBpbnZva2Uge0BsaW5rICNjYW5DbG9zZSgpfQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCk7Ci0KLQkvKioKLQkgKiBTYXZlIHRoaXMgYXJjaGl2ZSBhcyBhbiBleHBhbmRlZCBkaXJlY3Rvcnkgd2hlcmUgdGhlIGZsYWdzIGlzIHRoZSByZXN1bHQgb2YgYml0d2lzZSBvciBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgdHlwZXMgdG8gYmUgZXhwYW5kZWQ7IGV4YW1wbGU6Ci0JICogPGNvZGU+YW5FYXJGaWxlLnNhdmVBc0RpcmVjdG9yeShhbkVhckZpbGUuRVhQQU5EX1dBUl9GSUxFUyB8IGFuRWFyRmlsZS5FWFBBTkRfRUpCSkFSRklMRVMpPC9jb2RlPjsKLQkgKiAKLQkgKiBJZiB0aGlzIGFyY2hpdmUgd2FzIGxvYWRlZCBmcm9tIHRoZSBzYW1lIHVyaSBhcyBpdCBpcyBiZWluZyBleHRyYWN0ZWQgdG8sIHRoZSBvcmlnbmFsIHdpbGwgYmUKLQkgKiBkZWxldGVkIGFuZCByZXBsYWNlZCB3aXRoIHRoZSBkaXJlY3RvcnkKLQkgKiAKLQkgKiBAdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzYXZpbmcKLQkgKiAKLQkgKiBAdGhyb3dzIFJlb3BlbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgcmUtc3luY2luZyB0aGUgYXJjaGl2ZSB0byB0aGUgbmV3bHkgc2F2ZWQKLQkgKiAgICAgICAgICAgICBkZXN0aW5hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGV4dHJhY3QoaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIFJlb3BlbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZvciBwZXJmb3JtYW5jZSwgc2F2ZSB0aGUgYXJjaGl2ZSB3aXRob3V0IHJlb3BlbmluZzsgRnVydGhlciBvcGVyYXRpb25zIG9uIHRoaXMgaW5zdGFuY2UKLQkgKiB3aXRob3V0IGZpcnN0IGNhbGxpbmcge0BsaW5rICNyZW9wZW59d2lsbCB5aWVsZCB1bmV4cGVjdGVkIHJlc3VsdHMuCi0JICogCi0JICogQHNlZSAjZXh0cmFjdChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdE5vUmVvcGVuKGludCBleHBhbnNpb25GbGFncykgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZSB0aGlzIGFyY2hpdmUgYXMgYSBkaXJlY3RvcnkgdXNpbmcgdGhlIHNwZWNpZmllZCB1cmkKLQkgKiAKLQkgKiBUaGUgYXJjaGl2ZSB3aWxsIG5vdCBiZSByZW5hbWVkCi0JICogCi0JICogQHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc2F2aW5nCi0JICogCi0JICogQHNlZSAjZXh0cmFjdChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdFRvKFN0cmluZyB1cmksIGludCBleHBhbnNpb25GbGFncykgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5DbGFzc0xvYWRlcgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0QXJjaGl2ZUNsYXNzTG9hZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBBUmNoaXZlIHRoYXQgc3RhcnQgd2l0aCB0aGUgcHJlZml4Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGZpbHRlckZpbGVzQnlQcmVmaXgoU3RyaW5nIHByZWZpeCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBBcmNoaXZlIGV4Y2x1ZGluZyBhbnkgZmlsZSB0aGF0IHN0YXJ0cyB3aXRoIG9uZSBvZiB0aGUgcHJlZml4ZXMKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZmlsdGVyRmlsZXNXaXRob3V0UHJlZml4KFN0cmluZ1tdIHByZWZpeGVzKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIGFyY2hpdmUgZmlsZXM7IGFkZHMgd2lsbCBub3QgYmUgcmVmbGVjdGVkOyB1c2UKLQkgKiAKLQkgKiBAbGluayBBcmNoaXZlI2FkZChGaWxlKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFyY2hpdmVGaWxlcygpOwotCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCByb290IGxldmVsIChub24tbmVzdGVkKSBvcGVuZWQgYXJjaGl2ZXMgY29udGFpbmluZyBmaWxlcyB0aGF0IGhhdmUgdGhpcwotCSAqIGFyY2hpdmUgYXMgaXRzIGxvYWRpbmcgY29udGFpbmVyOyB0aGUgc2V0IHdpbGwgYmUgZW1wdHkgaWYgbm8gc3VjaCBvcGVuZWQgYXJjaGl2ZSBleGlzdHMuCi0JICogVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzY2VuYXJpbzogb3BlbiBqYXIgQS4gY3JlYXRlIGphciBCLiBDb3B5IGZpbGVzIGZyb20gQSB0bwotCSAqIEIuIEF0dGVtcHQgdG8gY2xvc2UgamFyIEEgYmVmb3JlIHNhdmluZyBqYXIgQi4gVGhlbiBhdHRlbXB0IHRvIHNhdmUgQiwgYW5kIHRoZSBzYXZlIGZhaWxzCi0JICogYmVjYXVzZSBBIGlzIGNsb3NlZC4gVGhpcyBtZXRob2QgYWxsb3dzIGNsaWVudCBjb2RlIHRvIHRlc3QgZm9yIGRlcGVuZGVudCBvcGVuIGFyY2hpdmVzCi0JICogYmVmb3JlIHNhdmluZyB0aGUgc291cmNlIGFyY2hpdmUuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IGVtcHR5LCB0aGUgc29sdXRpb24gaXMgdG8gZWl0aGVyCi0JICogY2xvc2Ugb3Igc2F2ZSBCIGJlZm9yZSBjbG9zaW5nIEEuCi0JICovCi0JcHVibGljIFNldCBnZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RXh0cmFDbGFzc3BhdGgoKTsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgZnJhbWV3b3JrLCBzcGVjaWZpY2FsbHkgYXMgYW4gb3B0aW1pemF0aW9uIHdoZW4gc2F2aW5nL2V4cGxvZGluZwotCSAqIGFyY2hpdmVzIHdpdGggbmVzdGVkIGFyY2hpdmVzCi0JICovCi0JcHVibGljIEZpbGVJdGVyYXRvciBnZXRGaWxlc0ZvclNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKTsKLQotCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKTsKLQotCXB1YmxpYyBSZXNvdXJjZSBnZXRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9ucyBnZXRPcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAc2VlIExvYWRTdHJhdGVneSNnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVc2VkIGZvciB3ZWJzcGhlcmUgcnVudGltZSB3aGVyZSBhcmNoaXZlcyBhcmUgb24gZGlzayAobm90IG5lc3RlZCBpbiBqYXJzKQotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiBhYnNvbHV0ZSBwYXRocyB0aGF0IHJlcHJlc2VudHMgdGhpcyBhcmNoaXZlIG9ubHksIGFuZCBpbiB0aGUgY2FzZSBvZgotCSAqICAgICAgICAgV0FSRmlsZXMsIHRoZSBuZXN0ZWQgbG9hZGFibGUgY29udGVudHMuCi0JICovCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldExvY2FsUnVudGltZUNsYXNzUGF0aCgpOwotCi0JLyoqCi0JICogVXNlZCBmb3Igd2Vic3BoZXJlIHJ1bnRpbWUgd2hlcmUgYXJjaGl2ZXMgYXJlIG9uIGRpc2sgKG5vdCBuZXN0ZWQgaW4gamFycykgdG8gZ2V0IHRoZQotCSAqIHJlY3Vyc2l2ZSBiZWhhdmlvciwgdGhlIEFyY2hpdmUgbXVzdCBiZWxvbmcgdG8gYW4gRUFSIGZpbGUKLQkgKiAKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgYWJzb2x1dGUgcGF0aHMgdGhhdCByZXByZXNlbnRzIHRoaXMgYXJjaGl2ZSwgYWxsIGl0J3MgcHJlcmVxcywgcmVjdXJzaXZlLgotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXRGdWxsUnVudGltZUNsYXNzUGF0aCgpOwotCi0JLyoqCi0JICogVXNlZCBmb3Igd2Vic3BoZXJlIHJ1bnRpbWUgd2hlcmUgYXJjaGl2ZXMgYXJlIG9uIGRpc2sgKG5vdCBuZXN0ZWQgaW4gamFycykgdG8gZ2V0IHRoZQotCSAqIHJlY3Vyc2l2ZSBiZWhhdmlvciwgdGhlIEFyY2hpdmUgbXVzdCBiZWxvbmcgdG8gYW4gRUFSIGZpbGUKLQkgKiAKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgYWJzb2x1dGUgcGF0aHMgdGhhdCByZXByZXNlbnRzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBBcmNoaXZlLCBhbGwgaXQncwotCSAqICAgICAgICAgcHJlcmVxcywgcmVjdXJzaXZlLgotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJvb3QgZnJvbSB3aGljaCBtZXRhIHJlc291cmNlcyBnZXQgbG9hZGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXNQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcm9vdCBmcm9tIHdoaWNoIGNsYXNzZXMgYW5kIHByb3BlcnRpZXMgYXJlIGxvYWRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmluYXJpZXNQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE9wdGlvbmFsIGZpbHRlciBmb3Igc2F2aW5nIGEgc3Vic2V0IG9mIGZpbGVzOyBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIGZvciBhbGwgc2F2ZSBhbmQgZXh0cmFjdAotCSAqIGludm9rYXRpb25zCi0JICovCi0JcHVibGljIFNhdmVGaWx0ZXIgZ2V0U2F2ZUZpbHRlcigpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneSBnZXRTYXZlU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgQXJjaGl2ZSBoYXMKLQkgKiAKLQkgKiBAb3RoZXIgb24gaXQncyBjbGFzc3BhdGgsIGVpdGhlciBkaXJlY3RseSBvciB0cmFuc2l0aXZlbHkKLQkgKiBAcGFyYW0gQXJjaGl2ZQotCSAqICAgICAgICAgICAgb3RoZXIgLSBhbm90aGVyIGFyY2hpdmUgaW4gdGhlIHNhbWUgRUFSIGZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDbGFzc3BhdGhWaXNpYmlsaXR5VG8oQXJjaGl2ZSBvdGhlcik7Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBBUEk7IFVzZWQgZm9yIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayAjaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKEFyY2hpdmUpfQotCSAqIAotCSAqIEBwYXJhbSBBcmNoaXZlCi0JICogICAgICAgICAgICBvdGhlciAtIGFub3RoZXIgYXJjaGl2ZSBpbiB0aGUgc2FtZSBFQVIgZmlsZQotCSAqIEBwYXJhbSBTZXQKLQkgKiAgICAgICAgICAgIHZpc2l0ZWQgLSB0aGUgc2V0IG9mIGFyY2hpdmVzIGFscmVhZHkgdmlzaXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NsYXNzcGF0aFZpc2liaWxpdHlUbyhBcmNoaXZlIG90aGVyLCBTZXQgdmlzaXRlZCwgRUFSRmlsZSBlYXIpOwotCi0JLyoqCi0JICogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIGFmdGVyIHRoZSBhcmNoaXZlIGhhcyBiZWVuIG9wZW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQWZ0ZXJPcGVuKCk7Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGxvYWQgc3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQotCS8qKgotCSAqIEFuIGl0ZW0gaXMgY29uc2lkZXJlZCBhIGR1cGxpY2F0ZSBpZiB0aGUgYXJjaGl2ZSBjb250YWlucyBhIGZpbGUgb3IgbG9hZGVkIG1vZiByZXNvdXJjZSB3aXRoCi0JICogdGhlIHVyaSwgb3IgaWYgdGhlIHVyaSBpcyBlcXVhbCB0byB0aGUgbWFuaWZlc3QgdXJpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEdXBsaWNhdGUoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBVc2VkIGFzIGFuIG9wdGltaXphdGlvbiBhdCBjb3B5IHRpbWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hbmlmZXN0U2V0KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZlJlc291cmNlTG9hZGVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciBkaXNwYXRjaCBiZXR3ZWVuIHRoZSBhcmNoaXZlIGFuZCB0aGUgbG9hZCBzdHJhdGVneSB3aGVuIGJ1aWxkaW5nIHRoZSBmaWxlCi0JICogbGlzdDsgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05lc3RlZEFyY2hpdmUoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXJjaGl2ZSBpcyBzdGlsbCBvcGVuZWQgZm9yIHJlYWQ7IGlmIG5vdCwgSU9FeGNlcHRpb25zIGNvdWxkIGJlIHRocm93bgotCSAqIG9uIGF0dGVtcHRzIHRvIGdldCBpbnB1dCBzdHJlYW1zIG9uIGZpbGUgZW50cmllcy4gcmVvcGVuKCkgd2lsbCBjYXVzZSB0aGlzIGFyY2hpdmUgYW5kIGl0cwotCSAqIG5lc3RlZCBhcmNoaXZlcyB0byByZWJ1aWxkIHRoZWlyIGxvYWQgc3RyYXRlZ2llcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3BlbigpOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vZiByZXNvdXJjZSBhbmQgYWRkIGl0IHRvIHRoZSByZXNvdXJjZSBzZXQgb2YgdGhlIGNvbnRleHQgb2YgdGhpcyBhcmNoaXZlOyBhbGwKLQkgKiByZXNvdXJjZXMgaW4gbWVtb3J5IGFyZSBzYXZlZCB3aGVuIHRoZSBhcmNoaXZlIGlzIHNhdmVkCi0JICogCi0JICogQHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgYXJjaGl2ZSBoYXZpbmcgdGhlIHVyaQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBtb2YgcmVzb3VyY2UgYW5kIGFkZCBpdCB0byB0aGUgcmVzb3VyY2Ugc2V0IG9mIHRoZSBjb250ZXh0IG9mIHRoaXMgYXJjaGl2ZTsgYWxsCi0JICogcmVzb3VyY2VzIGluIG1lbW9yeSBhcmUgc2F2ZWQgd2hlbiB0aGUgYXJjaGl2ZSBpcyBzYXZlZAotCSAqIAotCSAqIEB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGFyY2hpdmUgaGF2aW5nIHRoZSB1cmkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgbWFrZU1vZlJlc291cmNlKFN0cmluZyB1cmksIEVMaXN0IGV4dGVudCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBmb3IgZGlzcGF0Y2ggYmV0d2VlbiB0aGUgYXJjaGl2ZSBhbmQgdGhlIGxvYWQgc3RyYXRlZ3kgd2hlbiBidWlsZGluZyB0aGUgZmlsZQotCSAqIGxpc3Q7IGNsaWVudHMgc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciBkaXNwYXRjaCBiZXR3ZWVuIHRoZSBhcmNoaXZlIGFuZCB0aGUgbG9hZCBzdHJhdGVneSB3aGVuIGJ1aWxkaW5nIHRoZSBmaWxlCi0JICogbGlzdDsgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGV4dHJhIGNsYXNzIHBhdGggd2l0aCBubyByZWZyZXNoIG9mIHRoZSBjbGFzcyBsb2FkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltU2V0RXh0cmFDbGFzc3BhdGgoamF2YS5sYW5nLlN0cmluZyBuZXdFeHRyYUNsYXNzcGF0aCk7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoRmlsZSBhRmlsZSk7Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yICJyZS1zeW5jaW5nIiBhbiBhcmNoaXZlIGFmdGVyIHNhdmU7IGNsaWVudHMgbm9ybWFsbHkgc2hvdWxkIG5vdCBuZWVkIHRoaXMKLQkgKiBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW9wZW4oKSB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciByZW9wZW5pbmcgbmVzdGVkIGFyY2hpdmVzOyBjbGllbnRzIG5vcm1hbGx5IHNob3VsZCBub3QgbmVlZCB0aGlzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlb3BlbihBcmNoaXZlIHBhcmVudCkgdGhyb3dzIFJlb3BlbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmUgdGhpcyBhcmNoaXZlIGFzIGEgamFyIGZpbGUgd2l0aCB0aGUgdXJpIG9mIHRoZSBhcmNoaXZlOwotCSAqIAotCSAqIEB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHNhdmluZwotCSAqIAotCSAqIEB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSByZS1zeW5jaW5nIHRoZSBhcmNoaXZlIHRvIHRoZSBuZXdseSBzYXZlZAotCSAqICAgICAgICAgICAgIGRlc3RpbmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgUmVvcGVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZSB0aGlzIGFyY2hpdmUgdXNpbmcgdGhlIHNhdmUgc3RyYXRlZ3kgc3BlY2lmaWVkCi0JICogCi0JICogQHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc2F2aW5nCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShTYXZlU3RyYXRlZ3kgYVN0cmF0ZWd5KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTYXZlIHRoaXMgYXJjaGl2ZSBhcyBhIGphciBmaWxlIHVzaW5nIHVyaSBwcm92aWRlZDsgSWYgdGhlIHVyaSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgVVJJIG9mCi0JICogdGhpcyBhcmNoaXZlLCB0aGUgdXJpIG9mIHRoaXMgYXJjaGl2ZSB3aWxsIGNoYW5nZSB0byB0aGUgbmV3IHVyaSAoZm9yIHJlb3BlbikKLQkgKiAKLQkgKiBAdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzYXZpbmcKLQkgKiAKLQkgKiBAdGhyb3dzIFJlb3BlbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgcmUtc3luY2luZyB0aGUgYXJjaGl2ZSB0byB0aGUgbmV3bHkgc2F2ZWQKLQkgKiAgICAgICAgICAgICBkZXN0aW5hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVBcyhTdHJpbmcgdXJpKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIFJlb3BlbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZvciBwZXJmb3JtYW5jZSwgc2F2ZSB0aGUgYXJjaGl2ZSB3aXRob3V0IHJlb3BlbmluZzsgRnVydGhlciBvcGVyYXRpb25zIG9uIHRoaXMgaW5zdGFuY2UKLQkgKiB3aXRob3V0IGZpcnN0IGNhbGxpbmcge0BsaW5rICNyZW9wZW59d2lsbCB5aWVsZCB1bmV4cGVjdGVkIHJlc3VsdHMuCi0JICogCi0JICogQHNlZSAjc2F2ZUFzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQXNOb1Jlb3BlbihTdHJpbmcgdXJpKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGb3IgcGVyZm9ybWFuY2UsIHNhdmUgdGhlIGFyY2hpdmUgd2l0aG91dCByZW9wZW5pbmc7IEZ1cnRoZXIgb3BlcmF0aW9ucyBvbiB0aGlzIGluc3RhbmNlCi0JICogd2l0aG91dCBmaXJzdCBjYWxsaW5nIHtAbGluayAjcmVvcGVufXdpbGwgeWllbGQgdW5leHBlY3RlZCByZXN1bHRzLgotCSAqIAotCSAqIEBzZWUgI3NhdmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVOb1Jlb3BlbigpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0FyY2hpdmVDbGFzc0xvYWRlcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZUNsYXNzTG9hZGVyKGphdmEubGFuZy5DbGFzc0xvYWRlciBuZXdBcmNoaXZlQ2xhc3NMb2FkZXIpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXh0cmFDbGFzc3BhdGgKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRyYUNsYXNzcGF0aChqYXZhLmxhbmcuU3RyaW5nIG5ld0V4dHJhQ2xhc3NwYXRoKTsKLQotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0KEFyY2hpdmVNYW5pZmVzdCBuZXdNYW5pZmVzdCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChqYXZhLnV0aWwuamFyLk1hbmlmZXN0IGFNYW5pZmVzdCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBDbGFzcy1wYXRoIG1hbmlmZXN0IGVudHJ5LCByZWJ1aWxkcyB0aGUgY2xhc3MgbG9hZGVyLCBhbmQgcmVmcmVzaGVzIGFueSByZWZsZWN0ZWQKLQkgKiBqYXZhIGNsYXNzZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdENsYXNzUGF0aEFuZFJlZnJlc2goU3RyaW5nIGNsYXNzcGF0aCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25zKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnMgbmV3T3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCBmaWx0ZXIgZm9yIHNhdmluZyBhIHN1YnNldCBvZiBmaWxlczsgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCBmb3IgYWxsIHNhdmUgYW5kIGV4dHJhY3QKLQkgKiBpbnZva2F0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVGaWx0ZXIoU2F2ZUZpbHRlciBhRmlsdGVyKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1NhdmVTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYXZlU3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5IG5ld1NhdmVTdHJhdGVneSk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdYbWxFbmNvZGluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhtbEVuY29kaW5nKGphdmEubGFuZy5TdHJpbmcgbmV3WG1sRW5jb2RpbmcpOwotCi0JLyoqCi0JICogRGV0ZXJtaW5lIHdoZXRoZXIgamF2YSByZWZsZWN0aW9uIHNob3VsZCBiZSBzZXQgdXAgZm9yIHRoaXMgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUphdmFSZWZsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUKLQkgKiBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLkNvbW1vbmFyY2hpdmVQYWNrYWdlI2dldEFyY2hpdmVfVHlwZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUeXBlcygpOwotCi0JYm9vbGVhbiBpc1R5cGUoU3RyaW5nIHR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTc2MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZGlzY3JpbWluYXRvcnMgPSBudWxsOwotCXByaXZhdGUgQ29sbGVjdGlvbiBjdXN0b21UeXBlcyA9IG51bGw7Ci0KLQkvKgotCSAqIE1vc3Qga25vd24gdHlwZXMgYXJlIG9mIGxlbmd0aCAzLiBXaGVudmVyIGEgbmV3IHR5cGUgaXMgYWRkZWQgdGhhdCBpcyBub3Qgb2YgbGVuZ3RoIDMsCi0JICogbW9kaWZpY2F0aW9ucyBtYXkgYmUgbmVjZXNzYXJ5IHRvIHRoZSAnaXNLbm93bkFyY2hpdmVUeXBlKCkgbWV0aG9kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGVmYXVsdEtub3duVHlwZXMgPSBuZXcgU3RyaW5nW117ImVhciIsICJ3YXIiLCAiamFyIiwgInppcCIsICJmYXIifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkoKTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RvckRpc2NyaW1pbmF0b3IoR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjcmltaW5hdG9yKSB7Ci0JCUlOU1RBTkNFLmdldERpc2NyaW1pbmF0b3JzKCkuYWRkKGRpc2NyaW1pbmF0b3IpOwotCQlJTlNUQU5DRS5hZGRLbm93bkFyY2hpdmVUeXBlcyhkaXNjcmltaW5hdG9yLmdldEN1c3RvbUZpbGVFeHRlbnNpb25zKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RGlzY3JpbWluYXRvcnMoKSB7Ci0JCWlmIChkaXNjcmltaW5hdG9ycyA9PSBudWxsKQotCQkJZGlzY3JpbWluYXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBkaXNjcmltaW5hdG9yczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVHlwZXMoQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCWlmIChkaXNjcmltaW5hdG9ycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlHZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3IgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGRpc2NyaW1pbmF0b3JzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlkaXNjcmltaW5hdG9yID0gKEdlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoZGlzY3JpbWluYXRvci5kaXNjcmltaW5hdGUoYXJjaGl2ZSkpCi0JCQkJYXJjaGl2ZS5nZXRUeXBlcygpLmFkZChkaXNjcmltaW5hdG9yLmdldFR5cGVLZXkoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRLbm93bkFyY2hpdmVUeXBlcyhTdHJpbmdbXSBuZXdUeXBlcykgewotCQlpZiAoY3VzdG9tVHlwZXMgPT0gbnVsbCkgewotCQkJY3VzdG9tVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJY3VzdG9tVHlwZXMuYWRkKG5ld1R5cGVzW2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzS25vd25BcmNoaXZlVHlwZShTdHJpbmcgZmlsZVVSSSkgewotCQlpZiAoZmlsZVVSSSA9PSBudWxsIHx8IGZpbGVVUkkubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgbG93ZXJDYXNlVXJpID0gZmlsZVVSSS50b0xvd2VyQ2FzZSgpOwotCQkvKgotCQkgKiBFbnN1cmUgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBVUkkgaXMgbG9uZyBlbm91Z2ggdG8gY29udGFpbiBhIC4zIHN0eWxlIGV4dGVuc2lvbgotCQkgKi8KLQkJaWYgKGxvd2VyQ2FzZVVyaS5sZW5ndGgoKSA+IDQgJiYgbG93ZXJDYXNlVXJpLmNoYXJBdChsb3dlckNhc2VVcmkubGVuZ3RoKCkgLSA0KSA9PSAnLicpIHsKLQkJCVN0cmluZyBlbmRpbmcgPSBsb3dlckNhc2VVcmkuc3Vic3RyaW5nKGxvd2VyQ2FzZVVyaS5sZW5ndGgoKSAtIDMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0S25vd25UeXBlcy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoZGVmYXVsdEtub3duVHlwZXNbaV0uZXF1YWxzKGVuZGluZykpCi0JCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGN1c3RvbVR5cGUgPSBudWxsOwotCQlpZiAoY3VzdG9tVHlwZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgY3VzdG9tVHlwZXNJdGVyYXRvciA9IGN1c3RvbVR5cGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoY3VzdG9tVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQljdXN0b21UeXBlID0gKFN0cmluZykgY3VzdG9tVHlwZXNJdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGZpbGVVUkkuZW5kc1dpdGgoY3VzdG9tVHlwZSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ2xpZW50TW9kdWxlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9DbGllbnRNb2R1bGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmNzE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9DbGllbnRNb2R1bGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDbGllbnRNb2R1bGVSZWYgZXh0ZW5kcyBNb2R1bGVSZWYgewotCUFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotfSAvL0NsaWVudE1vZHVsZVJlZgotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTMwODEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsOwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5IHsKLQotCXB1YmxpYyBzdGF0aWMgQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeSBJTlNUQU5DRSA9IG5ldyBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQlwcm90ZWN0ZWQgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgY29tbW9uQXJjaGl2ZUZhY3RvcnkgPSAoKENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbCkgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkpLmdldERlbGVnYXRlKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGNvbW1vbkFyY2hpdmVGYWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbW1vbkFyY2hpdmVGYWN0b3J5KENvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJY29tbW9uQXJjaGl2ZUZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5NjI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImNvbW1vbmFyY2hpdmUiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm90X2FfZGlyX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUltcGxfX0Vycm9yXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVwYWlyQXJjaGl2ZUNvbW1hbmRfdXNhZ2UxX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlX2V4aXN0X2FzX2Rpcl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZV9lbnRyeV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcl9ub3RfZGRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJfRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSQVJfRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlbmFtZV9leGNlcHRpb25fRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbl9BcHBsaWNhdGlvbl9DbGllbnRfSkFSX2ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9fc2VjX3JvbGVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmlnaW5hbF9hcmNoaXZlX2lzX25vdF9hX19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZV9tb2R1bGVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkaW5nX2RkX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW9kdWxlX2ZpbGVfZG9lc19ub3RfZXhpc3RfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBX1dBUl9maWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElPRXhjZXB0aW9uX29jY3VycmVkX3doaWxlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW9fZXhfbWFuaWZlc3RfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaXhQcmltS2V5Q29tbWFuZF91c2FnZV9fc19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpeFByaW1LZXlDb21tYW5kX3VzYWdlX19fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcmFtZXRlcl9zaG91bGRfbm90X2JlX251X0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGRfaW5fZWFyX2xvYWRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub19kZHNfMTBfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaXN0X2NvbXBvbmVudHNfd2FyX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5fRUpCX0pBUl9maWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5fbmVzdGVkX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVwYWlyX2NvbW1hbmRfZmFpbGVkX19fZXhfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWRfb3Blbl9mYWlsX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JfaXRlcmF0aW5nX3RoZV9hcmNoaXZfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlX3RlbXBfZmlsZV9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nX2NsYXNzX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwYWlyX3VzYWdlX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBsaWNhdGlvbl9DbGllbnRfSmFyX0ZpbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXQVJfRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3VsZF9ub3RfZmluZF9kaXJfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb252ZXJ0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzb2x1dGVfcGF0aF91bmtub3duX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkX2NvcHlfbGliX2Rpcl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92aW5nX2tleV9maWVsZF9JTkZPXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2R1bGVfZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR4X2JlYW5fbWdkX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hbmlmZXN0X2RkX2xvYWRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBrZXlfY2xhc3NfcmVmbGVjdGlvbl9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5jb250YWluZWRfbW9kdWxlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZV9ub3RfZm91bmRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpb19leF9yZWFkaW5nX2RkX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZF9jcF9maWxlX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRfYXJjaGl2ZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRfcmVzb3VyY2VfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkX2NsYXNzcGF0aF9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRyYWN0X2Rlc3RpbmF0aW9uX2lzX3RoZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1YmNsYXNzX3Jlc3BvbnNpYmlsdHlfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2R1bGVfbm90X2luX0VBUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlX25vdF9jb3JyZWN0X3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW9fZXhfbG9hZGluZ19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvdWxkX25vdF9vcGVuX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFuaWZlc3RfZGRfZmluZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZF9qYXJfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBfcmVzb3VyY2VfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXBhaXJzX2FsbF9lbnRyaWVzX2luX3RoZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRfY29weV9jbGFzc19kaXJfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpb19leF9yZW9wZW5fRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9vY2N1cnJlZF9pdGVyYXRpbmdfZl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cF9zZWNfcm9sZV9tb2R1bGVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVfZmlsZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluZmVycmVkX2Rkc19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuYWJsZV9yZXBsYWNlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUpCX0phcl9GaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFfZmlsZV9kb2VzX25vdF9leGlzdF9mb3JfbW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFfUkFSX2ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwX3NlY19yb2xlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1RoZV9mb2xsb3dpbmdfZmlsZXNfY291bGRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBrZXlfZmllbGRfcmVmbGVjdGlvbl9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX29mX2xpc3RfcmVhY2hlZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX3NhdmluZ19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFyY2hpdmVfaXNfbm90X2FfdmFsaWRfRUpCX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZV90ZW1wX2Rpcl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlcGFpckFyY2hpdmVDb21tYW5kX3VzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpeFByaW1LZXlDb21tYW5kX2ZhaWxlZF9fX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQV9BcHBsaWNhdGlvbl9maWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE51bGxfdXJpX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW50ZXJuYWxfRXJyb3JfX0l0ZXJhdG9yX29fRVhDXzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbmFyY2hpdmVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25hcmNoaXZlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTQ1NDAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbmFyY2hpdmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21tb25hcmNoaXZlRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUZWxsIHRoZSBmYWN0b3J5IHRoYXQgYW4gYXJjaGl2ZSBoYXMgYmVlbiBvcGVuZWQ7IHRoZSBmYWN0b3J5IG1haW50YWlucyBhIHdlYWsgc2V0IG9mIGFsbCB0aGUKLQkgKiBvcGVuIGFyY2hpdmVzIHRvIGRldGVybWluZSBpZiBhbm90aGVyIGFyY2hpdmUgY2FuIGJlIGNsb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcmNoaXZlQ2xvc2VkKEFyY2hpdmUgYUNsb3NlZEFyY2hpdmUpOwotCi0JLyoqCi0JICogVGVsbCB0aGUgZmFjdG9yeSB0aGF0IGFuIGFyY2hpdmUgaGFzIGJlZW4gb3BlbmVkOyB0aGUgZmFjdG9yeSBtYWludGFpbnMgYSB3ZWFrIHNldCBvZiBhbGwgdGhlCi0JICogb3BlbiBhcmNoaXZlcyB0byBkZXRlcm1pbmUgaWYgYW5vdGhlciBhcmNoaXZlIGNhbiBiZSBjbG9zZWQuCi0JICovCi0JcHVibGljIHZvaWQgYXJjaGl2ZU9wZW5lZChBcmNoaXZlIGFuT3BlbkFyY2hpdmUpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24oQXJjaGl2ZSl9Ci0JICogCi0JICogSWYgYW55IG9wZW5lZCBhcmNoaXZlIGNvbnRhaW5zIGZpbGVzIHRoYXQgaGF2ZSB0aGUgcGFyYW1ldGVyIGFzIGl0cyBsb2FkaW5nIGNvbnRhaW5lciwgcmV0dXJuCi0JICogZmFsc2U7IG90aGVyd2lzZSByZXR1cm4gdHJ1ZS4gVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzY2VuYXJpbzogb3BlbiBqYXIgQS4gY3JlYXRlCi0JICogamFyIEIuIENvcHkgZmlsZXMgZnJvbSBBIHRvIEIuIEF0dGVtcHQgdG8gY2xvc2UgamFyIEEgYmVmb3JlIHNhdmluZyBqYXIgQi4gVGhlbiBhdHRlbXB0IHRvCi0JICogc2F2ZSBCLCBhbmQgdGhlIHNhdmUgZmFpbHMgYmVjYXVzZSBBIGlzIGNsb3NlZC4gVGhpcyBtZXRob2QgYWxsb3dzIGNsaWVudCBjb2RlIHRvIHRlc3QgZm9yCi0JICogZGVwZW5kZW50IG9wZW4gYXJjaGl2ZXMgYmVmb3JlIHNhdmluZyB0aGUgc291cmNlIGFyY2hpdmUuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoZQotCSAqIHNvbHV0aW9uIGlzIHRvIGVpdGhlciBjbG9zZSBvciBzYXZlIEIgYmVmb3JlIGNsb3NpbmcgQS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5DbG9zZShBcmNoaXZlIGFuQXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBDbG9zZSBhbnkgb3BlbiBhcmNoaXZlcyBhbmQgZGVsZXRlIHRoZSB0ZW1wIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBuZXN0ZWQgYXJjaGl2ZXMuIER1ZSB0bwotCSAqIGxpbWl0YXRpb25zIGluIHRoZSBkZWxldGVPbkV4aXQoKSBtZXRob2Qgb2YgZmlsZSwgaW4gMS4yLjIgdGhlcmUgaXMgbm8gd2F5IHRvIGVuc3VyZSB0aGVzZQotCSAqIGZpbGVzIGdldCBkZWxldGVkLiBDbGllbnQgY29kZSBzaG91bGQgdXNlIGdvb2QgcHJhY3RpY2UgYnkgY2FsbGluZyB7QGxpbmsgQXJjaGl2ZSNjbG9zZX13aGVuCi0JICogZmluaXNoZWQgd2l0aCBhbiBBcmNoaXZlIGluc3RhbmNlLCByYXRoZXIgdGhhbiBqdXN0IGRpc2NhcmQgYW4gaW5zdGFuY2Ugd2l0aCBvcGVuIGZpbGUKLQkgKiBoYW5kbGVzIGFuZCB3YWl0IGZvciBpdCB0byBiZSBnYydkLiBCZXlvbmQgdGhhdCwgcHJvZ3JhbSBjb2RlIGNvbXBpbGVkIGZvciAxLjMgY2FuIChhbmQKLQkgKiBzaG91bGQpIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHNodXRkb3duIGhvb2s6IDxjb2RlPgotCSAqIAlSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZCgpIHsKLQkgcHVibGljIHZvaWQgcnVuKCkgewotCSAoKENvbW1vbmFyY2hpdmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpKS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpLmNsb3NlT3BlbkFyY2hpdmVzKCk7Ci0JIH0KLQkgfSk7PC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlT3BlbkFyY2hpdmVzKCk7Ci0KLQlwdWJsaWMgQXJjaGl2ZSBjb3B5KEFyY2hpdmUgYW5BcmNoaXZlKTsKLQotCXB1YmxpYyBNb2R1bGVGaWxlIGNvcHkoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFyY2hpdmUgZm9yIGVkaXRpbmcsIGFuZCBpbml0aWFsaXplcyBpdCBhcHByb3ByaWF0ZWx5IChhZGRzIGFuIGVtcHR5IGRlcGxveW1lbnQKLQkgKiBkZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlSW5pdGlhbGl6ZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFyY2hpdmUgZm9yIGVkaXRpbmcsIGFuZCBpbml0aWFsaXplcyBpdCBhcHByb3ByaWF0ZWx5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgY3JlYXRlQXJjaGl2ZUluaXRpYWxpemVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5OyBjbGllbnRzIHVzdWFsbHkgc2hvdWxkIG5vdCBuZWVkIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIExvYWRTdHJhdGVneSBjcmVhdGVDaGlsZExvYWRTdHJhdGVneShTdHJpbmcgdXJpLCBMb2FkU3RyYXRlZ3kgcGFyZW50KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFyY2hpdmUgZm9yIGVkaXRpbmcsIGFuZCBpbml0aWFsaXplcyBpdCBhcHByb3ByaWF0ZWx5IChhZGRzIGFuIGVtcHR5IGRlcGxveW1lbnQKLQkgKiBkZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYXJjaGl2ZSBmb3IgZWRpdGluZywgYW5kIGluaXRpYWxpemVzIGl0IGFwcHJvcHJpYXRlbHkgKGFkZHMgYW4gZW1wdHkgZGVwbG95bWVudAotCSAqIGRlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluaXRpYWxpemVkIGFyY2hpdmUgYmFzZWQgb24gdGhlIGdpdmVuIFVSSSBhbmQgb3B0aW9ucwotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUFyY2hpdmVJbml0aWFsaXplZChBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5pdGlhbGl6ZWQgRUFSIGJhc2VkIG9uIHRoZSBnaXZlbiBVUkkgYW5kIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBjcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgamF2YS5sYW5nLlN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluaXRpYWxpemVkIEVKQiBiYXNlZCBvbiB0aGUgZ2l2ZW4gVVJJIGFuZCBvcHRpb25zCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgYXJjaGl2ZSBiYXNlZCBvbiB0aGUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdBcHBsaWNhdGlvbkNsaWVudEZpbGUoQXBwbGljYXRpb25DbGllbnRGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGFyY2hpdmUgYmFzZWQgb24gdGhlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3QXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGFyY2hpdmUgYmFzZWQgb24gdGhlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3RUFSRmlsZShFQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplZCBhcmNoaXZlIGJhc2VkIG9uIHRoZSBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0VKQkphckZpbGUoRUpCSmFyRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZWQgYXJjaGl2ZSBiYXNlZCBvbiB0aGUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdNb2R1bGVGaWxlKE1vZHVsZUZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVkIGFyY2hpdmUgYmFzZWQgb24gdGhlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3UkFSRmlsZShSQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplZCBhcmNoaXZlIGJhc2VkIG9uIHRoZSBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld1dBUkZpbGUoV0FSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIE51bGxMb2FkU3RyYXRlZ3lJbXBsOyB1c2VkIGZvciBuZXcgYXJjaGl2ZXMKLQkgKi8KLQlMb2FkU3RyYXRlZ3kgY3JlYXRlRW1wdHlMb2FkU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gZHluYW1pY2FsbHkgYnVpbGQgYSBsb2FkIHN0cmF0ZWd5IGZyb20gdGhlIGZpbGUgc3lzdGVtLiBEZXRlcm1pbmVzIHdoZXRoZXIKLQkgKiB0aGUgdXJpIHBvaW50cyB0byBhIGphciBmaWxlIG9yIGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5IGNyZWF0ZUxvYWRTdHJhdGVneShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSQVJGaWxlIGNyZWF0ZVJBUkZpbGVJbml0aWFsaXplZChqYXZhLmxhbmcuU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFyY2hpdmUgZm9yIGVkaXRpbmcsIGFuZCBpbml0aWFsaXplcyBpdCBhcHByb3ByaWF0ZWx5IChhZGRzIGFuIGVtcHR5IGRlcGxveW1lbnQKLQkgKiBkZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBXQVJGaWxlIGNyZWF0ZVdBUkZpbGVJbml0aWFsaXplZChTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gaW50cm9zcGVjdCBhbiBhcmNoaXZlIGFuZCBnZXQgaXQncyBjbGFzcyBwYXRoIGVudHJpZXMgYmVmb3JlIGZ1bGx5IG9wZW5pbmcKLQkgKiB0aGUgYXJjaGl2ZTsgbmVlZGVkIGJlY2F1c2Ugd2UgbWF5IG5lZWQgZXh0cmEgY2xhc3NwYXRoIGluZm8gdG8gYmUgYWJsZSB0byBvcGVuIHRoZSAxLjAgZmlsZQotCSAqIGFuZCBkZXNlcmlhbGl6ZSBpdHMgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICogCi0JICogQHJldHVybiBhIHRva2VuaXplZCBhcnJheSBvZiBjbGFzcyBwYXRoIGNvbXBvbmVudHMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TWFuaWZlc3RDbGFzc1BhdGhWYWx1ZXMoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgcm9vdCBsZXZlbCAobm9uLW5lc3RlZCkgb3BlbmVkIGFyY2hpdmVzIGNvbnRhaW5pbmcgZmlsZXMgdGhhdCBoYXZlIHRoZQotCSAqIHBhcmFtZXRlciBhcyBpdHMgbG9hZGluZyBjb250YWluZXI7IHRoZSBzZXQgd2lsbCBiZSBlbXB0eSBpZiBubyBzdWNoIG9wZW5lZCBhcmNoaXZlIGV4aXN0cy4KLQkgKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOiBvcGVuIGphciBBLiBjcmVhdGUgamFyIEIuIENvcHkgZmlsZXMgZnJvbSBBIHRvCi0JICogQi4gQXR0ZW1wdCB0byBjbG9zZSBqYXIgQSBiZWZvcmUgc2F2aW5nIGphciBCLiBUaGVuIGF0dGVtcHQgdG8gc2F2ZSBCLCBhbmQgdGhlIHNhdmUgZmFpbHMKLQkgKiBiZWNhdXNlIEEgaXMgY2xvc2VkLiBUaGlzIG1ldGhvZCBhbGxvd3MgY2xpZW50IGNvZGUgdG8gdGVzdCBmb3IgZGVwZW5kZW50IG9wZW4gYXJjaGl2ZXMKLQkgKiBiZWZvcmUgc2F2aW5nIHRoZSBzb3VyY2UgYXJjaGl2ZS4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgZW1wdHksIHRoZSBzb2x1dGlvbiBpcyB0byBlaXRoZXIKLQkgKiBjbG9zZSBvciBzYXZlIEIgYmVmb3JlIGNsb3NpbmcgQS4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldE9wZW5BcmNoaXZlc0RlcGVuZGluZ09uKEFyY2hpdmUgYW5BcmNoaXZlKTsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgb3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIG9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgb3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSBieSB0aGUgcGFzc2VkIHVyaQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGtpbmQgb2YgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUgYnkgdGhlIHBhc3NlZCB1cmksIGFuZCB1c2UgdGhlIGV4dHJhQ2xhc3NQYXRoIGZvciBqYXZhIHJlZmxlY3Rpb24sIGluCi0JICogYWRkaXRpb24gdG8gdGhlIG1hbmlmZXN0IGNsYXNzLXBhdGg7IG1vc3RseSB1c2VkIGZvciBlamIgMS4wIGphciBmaWxlcyB0byBiZSBjb252ZXJ0ZWQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBraW5kIG9mIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShTdHJpbmcgdXJpLCBTdHJpbmcgZXh0cmFDbGFzc1BhdGgpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFQVJGaWxlIG9wZW5FQVJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFQVJGaWxlIG9wZW5FQVJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgRUFSRmlsZSBvcGVuRUFSRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCMTFKYXJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkIxMUphckZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkIxMUphckZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpLCBTdHJpbmcgZXh0cmFDbGFzc1BhdGgpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKFN0cmluZyB1cmksIFN0cmluZyBleHRyYUNsYXNzUGF0aCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciBvcGVubmluZyBhbiBBcmNoaXZlIGluIGFuIEFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShTdHJpbmcgdXJpLCBBcmNoaXZlIHBhcmVudCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciBvcGVubmluZyBhbiBBcmNoaXZlIGluIGFuIEFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UsIEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgUkFSRmlsZSBvcGVuUkFSRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFJBUkZpbGUgb3BlblJBUkZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSQVJGaWxlIG9wZW5SQVJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBSZWFkT25seURpcmVjdG9yeSBvcGVuUmVhZE9ubHlEaXJlY3RvcnkoU3RyaW5nIHVyaSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBvcGVuV0FSRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBvcGVuV0FSRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIFdBUkZpbGUgb3BlbldBUkZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbiB0aGUgYXJjaGl2ZSBieSB0aGUgcGFzc2VkIHBhcmFtZXRlciwgd2l0aG91dCBhdHRlbXB0aW5nIHRvIGRldGVybWluZSB3aGF0IGtpbmQgb2YKLQkgKiBhcmNoaXZlIGl0IGlzCi0JICogCi0JICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiBBcmNoaXZlLCBidXQgbm90IGEgc3ViY2xhc3MKLQkgKi8KLQlBcmNoaXZlIHByaW1PcGVuQXJjaGl2ZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlBcmNoaXZlIHByaW1PcGVuQXJjaGl2ZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JQXJjaGl2ZSBwcmltT3BlbkFyY2hpdmUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFdBUkZpbGUgdmFsdWUKLQkgKi8KLQlXQVJGaWxlIGNyZWF0ZVdBUkZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBFSkJKYXJGaWxlIHZhbHVlCi0JICovCi0JRUpCSmFyRmlsZSBjcmVhdGVFSkJKYXJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQXBwbGljYXRpb25DbGllbnRGaWxlIHZhbHVlCi0JICovCi0JQXBwbGljYXRpb25DbGllbnRGaWxlIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEVBUkZpbGUgdmFsdWUKLQkgKi8KLQlFQVJGaWxlIGNyZWF0ZUVBUkZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBSQVJGaWxlIHZhbHVlCi0JICovCi0JUkFSRmlsZSBjcmVhdGVSQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQXJjaGl2ZSB2YWx1ZQotCSAqLwotCUFyY2hpdmUgY3JlYXRlQXJjaGl2ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEZpbGUgdmFsdWUKLQkgKi8KLQlGaWxlIGNyZWF0ZUZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBSZWFkT25seURpcmVjdG9yeSB2YWx1ZQotCSAqLwotCVJlYWRPbmx5RGlyZWN0b3J5IGNyZWF0ZVJlYWRPbmx5RGlyZWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlDb21tb25hcmNoaXZlUGFja2FnZSBnZXRDb21tb25hcmNoaXZlUGFja2FnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEVKQk1vZHVsZVJlZiB2YWx1ZQotCSAqLwotCUVKQk1vZHVsZVJlZiBjcmVhdGVFSkJNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIENvbnZpZW5pbmNlIG1ldGhvZCBmb3Igd3JhcHBpbmcgYSBzdGFuZGFsb25lIEVKQiBKQVIgZmlsZQotCSAqLwotCUVKQk1vZHVsZVJlZiBjcmVhdGVFSkJNb2R1bGVSZWYoRUpCSmFyRmlsZSBlamJKYXJGaWxlKTsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFdlYk1vZHVsZVJlZiB2YWx1ZQotCSAqLwotCVdlYk1vZHVsZVJlZiBjcmVhdGVXZWJNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIENvbnZpZW5pbmNlIG1ldGhvZCBmb3Igd3JhcHBpbmcgYSBzdGFuZGFsb25lIFdBUiBmaWxlCi0JICovCi0JV2ViTW9kdWxlUmVmIGNyZWF0ZVdlYk1vZHVsZVJlZihXQVJGaWxlIHdhckZpbGUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIENsaWVudE1vZHVsZVJlZiB2YWx1ZQotCSAqLwotCUNsaWVudE1vZHVsZVJlZiBjcmVhdGVDbGllbnRNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIENvbnZpZW5pbmNlIG1ldGhvZCBmb3Igd3JhcHBpbmcgYSBzdGFuZGFsb25lIEFwcGxpY2F0aW9uIENsaWVudCBKQVIgZmlsZQotCSAqLwotCUNsaWVudE1vZHVsZVJlZiBjcmVhdGVDbGllbnRNb2R1bGVSZWYoQXBwbGljYXRpb25DbGllbnRGaWxlIGNsaWVudEZpbGUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIENvbm5lY3Rvck1vZHVsZVJlZiB2YWx1ZQotCSAqLwotCUNvbm5lY3Rvck1vZHVsZVJlZiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIENvbnZpZW5pbmNlIG1ldGhvZCBmb3Igd3JhcHBpbmcgYSBzdGFuZGFsb25lIFJBUiBmaWxlCi0JICovCi0JQ29ubmVjdG9yTW9kdWxlUmVmIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZihSQVJGaWxlIHJhckZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uYXJjaGl2ZVBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbmFyY2hpdmVQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Yjg2MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uYXJjaGl2ZVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBDb21tb25hcmNoaXZlUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImNvbW1vbmFyY2hpdmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUiA9IDc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdBUl9GSUxFID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEUgPSA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfRklMRSA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9SRUYgPSAxMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX01PRFVMRV9SRUYgPSAxMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX01PRFVMRV9SRUYgPSAxMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ0xJRU5UX01PRFVMRV9SRUYgPSAxMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX01PRFVMRV9SRUYgPSAxNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFID0gNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkFSX0ZJTEUgPSA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUkNISVZFID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMRSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTEVfX1VSSSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxFX19MQVNUX01PRElGSUVEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTEVfX1NJWkUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMRV9fRElSRUNUT1JZX0VOVFJZID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMRV9fT1JJR0lOQUxfVVJJID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTEVfX0xPQURJTkdfQ09OVEFJTkVSID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTEVfX0NPTlRBSU5FUiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX19VUkkgPSBGSUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9fTEFTVF9NT0RJRklFRCA9IEZJTEVfX0xBU1RfTU9ESUZJRUQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9fU0laRSA9IEZJTEVfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9fRElSRUNUT1JZX0VOVFJZID0gRklMRV9fRElSRUNUT1JZX0VOVFJZOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9fT1JJR0lOQUxfVVJJID0gRklMRV9fT1JJR0lOQUxfVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfX0xPQURJTkdfQ09OVEFJTkVSID0gRklMRV9fTE9BRElOR19DT05UQUlORVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9fQ09OVEFJTkVSID0gRklMRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9fRklMRVMgPSBGSUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IEZJTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJDSElWRV9fVVJJID0gQ09OVEFJTkVSX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSQ0hJVkVfX0xBU1RfTU9ESUZJRUQgPSBDT05UQUlORVJfX0xBU1RfTU9ESUZJRUQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSQ0hJVkVfX1NJWkUgPSBDT05UQUlORVJfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSQ0hJVkVfX0RJUkVDVE9SWV9FTlRSWSA9IENPTlRBSU5FUl9fRElSRUNUT1JZX0VOVFJZOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSQ0hJVkVfX09SSUdJTkFMX1VSSSA9IENPTlRBSU5FUl9fT1JJR0lOQUxfVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUkNISVZFX19MT0FESU5HX0NPTlRBSU5FUiA9IENPTlRBSU5FUl9fTE9BRElOR19DT05UQUlORVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSQ0hJVkVfX0NPTlRBSU5FUiA9IENPTlRBSU5FUl9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSQ0hJVkVfX0ZJTEVTID0gQ09OVEFJTkVSX19GSUxFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSQ0hJVkVfX1RZUEVTID0gQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BcmNoaXZlPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUkNISVZFX0ZFQVRVUkVfQ09VTlQgPSBDT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEVfX1VSSSA9IEFSQ0hJVkVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEVfX0xBU1RfTU9ESUZJRUQgPSBBUkNISVZFX19MQVNUX01PRElGSUVEOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfRklMRV9fU0laRSA9IEFSQ0hJVkVfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9GSUxFX19ESVJFQ1RPUllfRU5UUlkgPSBBUkNISVZFX19ESVJFQ1RPUllfRU5UUlk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEVfX09SSUdJTkFMX1VSSSA9IEFSQ0hJVkVfX09SSUdJTkFMX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSID0gQVJDSElWRV9fTE9BRElOR19DT05UQUlORVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9GSUxFX19DT05UQUlORVIgPSBBUkNISVZFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEVfX0ZJTEVTID0gQVJDSElWRV9fRklMRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfRklMRV9fVFlQRVMgPSBBUkNISVZFX19UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TW9kdWxlIEZpbGU8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBBUkNISVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfRklMRV9fVVJJID0gTU9EVUxFX0ZJTEVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFX19MQVNUX01PRElGSUVEID0gTU9EVUxFX0ZJTEVfX0xBU1RfTU9ESUZJRUQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfRklMRV9fU0laRSA9IE1PRFVMRV9GSUxFX19TSVpFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWSA9IE1PRFVMRV9GSUxFX19ESVJFQ1RPUllfRU5UUlk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFX19PUklHSU5BTF9VUkkgPSBNT0RVTEVfRklMRV9fT1JJR0lOQUxfVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX0ZJTEVfX0NPTlRBSU5FUiA9IE1PRFVMRV9GSUxFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFX19GSUxFUyA9IE1PRFVMRV9GSUxFX19GSUxFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfRklMRV9fVFlQRVMgPSBNT0RVTEVfRklMRV9fVFlQRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVKQiBKYXIgRmlsZTwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXQVJfRklMRV9fVVJJID0gTU9EVUxFX0ZJTEVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0FSX0ZJTEVfX0xBU1RfTU9ESUZJRUQgPSBNT0RVTEVfRklMRV9fTEFTVF9NT0RJRklFRDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0FSX0ZJTEVfX1NJWkUgPSBNT0RVTEVfRklMRV9fU0laRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0FSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWSA9IE1PRFVMRV9GSUxFX19ESVJFQ1RPUllfRU5UUlk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0FSX0ZJTEVfX09SSUdJTkFMX1VSSSA9IE1PRFVMRV9GSUxFX19PUklHSU5BTF9VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUiA9IE1PRFVMRV9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0FSX0ZJTEVfX0NPTlRBSU5FUiA9IE1PRFVMRV9GSUxFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0FSX0ZJTEVfX0ZJTEVTID0gTU9EVUxFX0ZJTEVfX0ZJTEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0FSX0ZJTEVfX1RZUEVTID0gTU9EVUxFX0ZJTEVfX1RZUEVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldBUiBGaWxlPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQVJfRklMRV9GRUFUVVJFX0NPVU5UID0gTU9EVUxFX0ZJTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUFSX0ZJTEVfX1VSSSA9IE1PRFVMRV9GSUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9GSUxFX19MQVNUX01PRElGSUVEID0gTU9EVUxFX0ZJTEVfX0xBU1RfTU9ESUZJRUQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9GSUxFX19TSVpFID0gTU9EVUxFX0ZJTEVfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlkgPSBNT0RVTEVfRklMRV9fRElSRUNUT1JZX0VOVFJZOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9GSUxFX19PUklHSU5BTF9VUkkgPSBNT0RVTEVfRklMRV9fT1JJR0lOQUxfVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfRklMRV9fTE9BRElOR19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fTE9BRElOR19DT05UQUlORVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9GSUxFX19DT05UQUlORVIgPSBNT0RVTEVfRklMRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9GSUxFX19GSUxFUyA9IE1PRFVMRV9GSUxFX19GSUxFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVBUl9GSUxFX19UWVBFUyA9IE1PRFVMRV9GSUxFX19UWVBFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfRklMRV9fTU9EVUxFX1JFRlMgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RUFSIEZpbGU8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVBUl9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fVVJJID0gTU9EVUxFX0ZJTEVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0xBU1RfTU9ESUZJRUQgPSBNT0RVTEVfRklMRV9fTEFTVF9NT0RJRklFRDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX1NJWkUgPSBNT0RVTEVfRklMRV9fU0laRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWSA9IE1PRFVMRV9GSUxFX19ESVJFQ1RPUllfRU5UUlk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX09SSUdJTkFMX1VSSSA9IE1PRFVMRV9GSUxFX19PUklHSU5BTF9VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19MT0FESU5HX0NPTlRBSU5FUiA9IE1PRFVMRV9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0NPTlRBSU5FUiA9IE1PRFVMRV9GSUxFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0ZJTEVTID0gTU9EVUxFX0ZJTEVfX0ZJTEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX1RZUEVTID0gTU9EVUxFX0ZJTEVfX1RZUEVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50IEZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRUFEX09OTFlfRElSRUNUT1JZID0gODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fVVJJID0gQ09OVEFJTkVSX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX0xBU1RfTU9ESUZJRUQgPSBDT05UQUlORVJfX0xBU1RfTU9ESUZJRUQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX1NJWkUgPSBDT05UQUlORVJfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX0RJUkVDVE9SWV9FTlRSWSA9IENPTlRBSU5FUl9fRElSRUNUT1JZX0VOVFJZOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX09SSUdJTkFMX1VSSSA9IENPTlRBSU5FUl9fT1JJR0lOQUxfVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRUFEX09OTFlfRElSRUNUT1JZX19MT0FESU5HX0NPTlRBSU5FUiA9IENPTlRBSU5FUl9fTE9BRElOR19DT05UQUlORVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX0NPTlRBSU5FUiA9IENPTlRBSU5FUl9fQ09OVEFJTkVSOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fRklMRVMgPSBDT05UQUlORVJfX0ZJTEVTOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVhZCBPbmx5IERpcmVjdG9yeTwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9GRUFUVVJFX0NPVU5UID0gQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19VUkkgPSBNT0RVTEVfRklMRV9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fTEFTVF9NT0RJRklFRCA9IE1PRFVMRV9GSUxFX19MQVNUX01PRElGSUVEOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fU0laRSA9IE1PRFVMRV9GSUxFX19TSVpFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZID0gTU9EVUxFX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fT1JJR0lOQUxfVVJJID0gTU9EVUxFX0ZJTEVfX09SSUdJTkFMX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkFSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fRklMRVMgPSBNT0RVTEVfRklMRV9fRklMRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVJfRklMRV9fVFlQRVMgPSBNT0RVTEVfRklMRV9fVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UkFSIEZpbGU8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBUl9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfUkVGX19NT0RVTEVfRklMRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfUkVGX19FQVJfRklMRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9SRUZfX01PRFVMRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Nb2R1bGUgUmVmPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEUgPSBNT0RVTEVfUkVGX19NT0RVTEVfRklMRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX01PRFVMRV9SRUZfX0VBUl9GSUxFID0gTU9EVUxFX1JFRl9fRUFSX0ZJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX01PRFVMRV9SRUZfX01PRFVMRSA9IE1PRFVMRV9SRUZfX01PRFVMRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RUpCIE1vZHVsZSBSZWY8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9NT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRSA9IE1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfTU9EVUxFX1JFRl9fRUFSX0ZJTEUgPSBNT0RVTEVfUkVGX19FQVJfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfTU9EVUxFX1JFRl9fTU9EVUxFID0gTU9EVUxFX1JFRl9fTU9EVUxFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XZWIgTW9kdWxlIFJlZjwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX01PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ0xJRU5UX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFID0gTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENMSUVOVF9NT0RVTEVfUkVGX19FQVJfRklMRSA9IE1PRFVMRV9SRUZfX0VBUl9GSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENMSUVOVF9NT0RVTEVfUkVGX19NT0RVTEUgPSBNT0RVTEVfUkVGX19NT0RVTEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNsaWVudCBNb2R1bGUgUmVmPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTElFTlRfTU9EVUxFX1JFRl9GRUFUVVJFX0NPVU5UID0gTU9EVUxFX1JFRl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEUgPSBNT0RVTEVfUkVGX19NT0RVTEVfRklMRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX01PRFVMRV9SRUZfX0VBUl9GSUxFID0gTU9EVUxFX1JFRl9fRUFSX0ZJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OTkVDVE9SX01PRFVMRV9SRUZfX01PRFVMRSA9IE1PRFVMRV9SRUZfX01PRFVMRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Q29ubmVjdG9yIE1vZHVsZSBSZWY8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiY29tbW9uYXJjaGl2ZS54bWkiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tbW9uYXJjaGl2ZVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIENvbnRhaW5lciBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRhaW5lcl9GaWxlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFdBUkZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFdBUkZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V0FSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIE1vZHVsZUZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1vZHVsZUZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBFQVJGaWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUFSRmlsZV9Nb2R1bGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gTW9kdWxlUmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TW9kdWxlUmVmX01vZHVsZUZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TW9kdWxlUmVmX0VhckZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmI2dldE1vZHVsZSA8ZW0+TW9kdWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmI2dldE1vZHVsZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNb2R1bGVSZWZfTW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gRUpCTW9kdWxlUmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFSkJNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBXZWJNb2R1bGVSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFdlYk1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIENsaWVudE1vZHVsZVJlZiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2xpZW50TW9kdWxlUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQ29ubmVjdG9yTW9kdWxlUmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBBcHBsaWNhdGlvbkNsaWVudEZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBFSkJKYXJGaWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFSkJKYXJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQkphckZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBSQVJGaWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRSQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGUjZ2V0RGVwbG95bWVudERlc2NyaXB0b3IgPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlI2dldERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAc2VlICNnZXRSQVJGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQXJjaGl2ZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJjaGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLkFyY2hpdmUjZ2V0VHlwZXMgPGVtPlR5cGVzPC9lbT59Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VHlwZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5BcmNoaXZlI2dldFR5cGVzKCkKLQkgKiBAc2VlICNnZXRBcmNoaXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcmNoaXZlX1R5cGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gRmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWxlX1VSSSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWxlX0xhc3RNb2RpZmllZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWxlX1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSNpc0RpcmVjdG9yeUVudHJ5IDxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSNpc0RpcmVjdG9yeUVudHJ5KCkKLQkgKiBAc2VlICNnZXRGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWxlX0RpcmVjdG9yeUVudHJ5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbGVfT3JpZ2luYWxVUkkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmlsZV9Mb2FkaW5nQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpbGVfQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gUmVhZE9ubHlEaXJlY3Rvcnkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFJlYWRPbmx5RGlyZWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5GaWxlSW1wbCA8ZW0+RmlsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuRmlsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCNnZXRGaWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEZJTEUgPSBlSU5TVEFOQ0UuZ2V0RmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMRV9fVVJJID0gZUlOU1RBTkNFLmdldEZpbGVfVVJJKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYXN0IE1vZGlmaWVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMRV9fTEFTVF9NT0RJRklFRCA9IGVJTlNUQU5DRS5nZXRGaWxlX0xhc3RNb2RpZmllZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTEVfX1NJWkUgPSBlSU5TVEFOQ0UuZ2V0RmlsZV9TaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUxFX19ESVJFQ1RPUllfRU5UUlkgPSBlSU5TVEFOQ0UuZ2V0RmlsZV9EaXJlY3RvcnlFbnRyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMRV9fT1JJR0lOQUxfVVJJID0gZUlOU1RBTkNFLmdldEZpbGVfT3JpZ2luYWxVUkkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvYWRpbmcgQ29udGFpbmVyPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRklMRV9fTE9BRElOR19DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0RmlsZV9Mb2FkaW5nQ29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRklMRV9fQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldEZpbGVfQ29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkFyY2hpdmVJbXBsIDxlbT5BcmNoaXZlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5BcmNoaXZlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldEFyY2hpdmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJDSElWRSA9IGVJTlNUQU5DRS5nZXRBcmNoaXZlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJDSElWRV9fVFlQRVMgPSBlSU5TVEFOQ0UuZ2V0QXJjaGl2ZV9UeXBlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5FSkJKYXJGaWxlSW1wbCA8ZW0+RUpCIEphciBGaWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5FSkJKYXJGaWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldEVKQkphckZpbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUpCX0pBUl9GSUxFID0gZUlOU1RBTkNFLmdldEVKQkphckZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldEVKQkphckZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuV0FSRmlsZUltcGwgPGVtPldBUiBGaWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5XQVJGaWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldFdBUkZpbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0FSX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0V0FSRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRXQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkVBUkZpbGVJbXBsIDxlbT5FQVIgRmlsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuRUFSRmlsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCNnZXRFQVJGaWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVBUl9GSUxFID0gZUlOU1RBTkNFLmdldEVBUkZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFQVJfRklMRV9fTU9EVUxFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0RUFSRmlsZV9Nb2R1bGVSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldEVBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbCA8ZW0+QXBwbGljYXRpb24gQ2xpZW50IEZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCNnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVGaWxlSW1wbCA8ZW0+TW9kdWxlIEZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZUZpbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlUGFja2FnZUltcGwjZ2V0TW9kdWxlRmlsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNT0RVTEVfRklMRSA9IGVJTlNUQU5DRS5nZXRNb2R1bGVGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbnRhaW5lckltcGwgPGVtPkNvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29udGFpbmVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldENvbnRhaW5lcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0Q29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEFJTkVSX19GSUxFUyA9IGVJTlNUQU5DRS5nZXRDb250YWluZXJfRmlsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuUmVhZE9ubHlEaXJlY3RvcnlJbXBsIDxlbT5SZWFkIE9ubHkgRGlyZWN0b3J5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5SZWFkT25seURpcmVjdG9yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCNnZXRSZWFkT25seURpcmVjdG9yeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRUFEX09OTFlfRElSRUNUT1JZID0gZUlOU1RBTkNFLmdldFJlYWRPbmx5RGlyZWN0b3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLlJBUkZpbGVJbXBsIDxlbT5SQVIgRmlsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuUkFSRmlsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCNnZXRSQVJGaWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJBUl9GSUxFID0gZUlOU1RBTkNFLmdldFJBUkZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0UkFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVSZWZJbXBsIDxlbT5Nb2R1bGUgUmVmPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVSZWZJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlUGFja2FnZUltcGwjZ2V0TW9kdWxlUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1PRFVMRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0TW9kdWxlUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGUgRmlsZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1PRFVMRV9SRUZfX01PRFVMRV9GSUxFID0gZUlOU1RBTkNFLmdldE1vZHVsZVJlZl9Nb2R1bGVGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FYXIgRmlsZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNT0RVTEVfUkVGX19FQVJfRklMRSA9IGVJTlNUQU5DRS5nZXRNb2R1bGVSZWZfRWFyRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTU9EVUxFX1JFRl9fTU9EVUxFID0gZUlOU1RBTkNFLmdldE1vZHVsZVJlZl9Nb2R1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuRUpCTW9kdWxlUmVmSW1wbCA8ZW0+RUpCIE1vZHVsZSBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkVKQk1vZHVsZVJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCNnZXRFSkJNb2R1bGVSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUpCX01PRFVMRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0RUpCTW9kdWxlUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLldlYk1vZHVsZVJlZkltcGwgPGVtPldlYiBNb2R1bGUgUmVmPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5XZWJNb2R1bGVSZWZJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlUGFja2FnZUltcGwjZ2V0V2ViTW9kdWxlUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFQl9NT0RVTEVfUkVGID0gZUlOU1RBTkNFLmdldFdlYk1vZHVsZVJlZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5DbGllbnRNb2R1bGVSZWZJbXBsIDxlbT5DbGllbnQgTW9kdWxlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ2xpZW50TW9kdWxlUmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsI2dldENsaWVudE1vZHVsZVJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDTElFTlRfTU9EVUxFX1JFRiA9IGVJTlNUQU5DRS5nZXRDbGllbnRNb2R1bGVSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29ubmVjdG9yTW9kdWxlUmVmSW1wbCA8ZW0+Q29ubmVjdG9yIE1vZHVsZSBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rvck1vZHVsZVJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCNnZXRDb25uZWN0b3JNb2R1bGVSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OTkVDVE9SX01PRFVMRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yTW9kdWxlUmVmKCk7Ci0KLQl9Ci0KLX0gLy9Db21tb25hcmNoaXZlUGFja2FnZQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29ubmVjdG9yTW9kdWxlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db25uZWN0b3JNb2R1bGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0MDIxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db25uZWN0b3JNb2R1bGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdG9yTW9kdWxlUmVmIGV4dGVuZHMgTW9kdWxlUmVmIHsKLQlDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotCi19IC8vQ29ubmVjdG9yTW9kdWxlUmVmCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWEzMzRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGFpbmVyIGV4dGVuZHMgRmlsZSB7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBhcmNoaXZlIGNvbnRhaW5zIGEgZmlsZSBoYXZpbmcgYSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBwYXJhbWV0ZXI7IHRoZSB1cmkKLQkgKiBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgbGVhZGluZyBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpbGUoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSBpdHMgbG9hZCBzdHJhdGVneSwgaWYgaXQgaXMga25vd24uIFNob3VsZCBiZSB1c2VkCi0JICogbWFpbmx5IGZvciByZWFkLW9ubHkgcnVudGltZSBwdXJwb3NlcywgYXMgZWRpdC10aW1lIG1vZGlmaWNhdGlvbnMgbWF5IG1ha2UgdGhlIHJlc3VsdAotCSAqIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBhcmNoaXZlIGlzICJ2aXJ0dWFsIiwgZWcsIGEgbmVzdGVkIGphcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBGaWxlIGdldEZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3kgZ2V0TG9hZFN0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXJjaGl2ZSBoYXMgZXZlciBoYWQgaXRzIGZpbGVzIGVudW1lcmF0ZWQ7IHVzZWQgYXMgYW4gb3B0aW1pemF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCk7Ci0KLQkvKioKLQkgKiBHb2VzIGRpcmVjdGx5IHRvIHRoZSBzdHJhdGVneQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBwcmltR2V0SW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCByZWJ1aWxkRmlsZUluZGV4KCk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdMb2FkU3RyYXRlZ3kKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TG9hZFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneSBuZXdMb2FkU3RyYXRlZ3kpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEZpbGVzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRGaWxlcygpOwotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBsaXN0IG9mIGZpbGVzIGluIHRoaXMgQ29udGFpbmVyIGFuZCBkcm9wcyB0aGUgaW5kZXgKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhckZpbGVzKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FQVJGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FQVJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYzc1NDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRUFSRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkNvbm5lY3Rvck1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5FamJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFQVJGaWxlIGV4dGVuZHMgTW9kdWxlRmlsZSB7Ci0KLQkvKioKLQkgKiBNYWtlcyBhIGNvcHkgb2YKLQkgKiAKLQkgKiBAYU1vZHVsZUZpbGUsIHVzaW5nIGl0cyBsb2NhbCBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IGNyZWF0ZXMgYSBuZXcgTW9kdWxlIGFuZCBhZGRzIGl0IHRvIHRoZQotCSAqICAgICAgICAgICAgICAgQXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG9mIHRoaXMgRUFSIGZpbGUgYW5kIGFkZHMgdGhlIGNvcHkgb2YgdGhlCi0JICogICAgICAgICAgICAgICBNb2R1bGVGaWxlIHRvIHRoaXMgRUFSLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvcGllZCBtb2R1bGUgZmlsZQotCSAqIAotCSAqIEBleGNlcHRpb24gRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhpcyBFQVIgYWxyZWFkeSBjb250YWlucyBhIGZpbGUgd2l0aCB0aGUgc2FtZSB1cmkgYXMKLQkgKiBAYU1vZHVsZUZpbGUKLQkgKi8KLQotCXB1YmxpYyBNb2R1bGVGaWxlIGFkZENvcHkoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgc2FtZSBhcyBhZGRDb3B5KE1vZHVsZUZpbGUpIGV4Y2VwdCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBuZXcgTW9kdWxlUmVmCi0JICovCi0JcHVibGljIE1vZHVsZVJlZiBhZGRDb3B5UmVmKE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBBZGQgYSBjb3B5IG9mIHRoZSBzZWN1cml0eSByb2xlIHRvIHRoZSBkZCBmb3IgdGhlIG1vZHVsZTsgaWYgYW4gYWx0IGRkIGlzIHNwZWNpZmllZCwgYWRkIHRvCi0JICogdGhhdCBkZDsgb3RoZXJ3aXNlIGFkZCB0byB0aGUgc3RhbmRhcmQgZGQgb2YgdGhlIG1vZHVsZTsgYWxzbyBhZGQgYSBjb3B5IG9mIHRoZSByb2xlIHRvIHRoZQotCSAqIGVhciBmaWxlIGRkIGlmIGEgcm9sZSB3aXRoIHRoYXQgbmFtZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Ci0JICogCi0JICogQHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgZGQgZm9yIGFNb2R1bGUgYWxyZWFkeSBjb250YWlucyBhIHJvbGUgd2l0aCB0aGF0IG5hbWUKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlIGFkZENvcHkoU2VjdXJpdHlSb2xlIGFSb2xlLCBNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFkZCBhIGNvcHkgb2YgdGhlIHNlY3VyaXR5IHJvbGUgdG8gdGhlIGVhciBmaWxlJ3MgZGQsIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBhIHJvbGUKLQkgKiB3aXRoIHRoZSBzYW1lIG5hbWUKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlIGFkZENvcHlJZk5vdEV4aXN0cyhTZWN1cml0eVJvbGUgYVJvbGUpOwotCi0JRU9iamVjdCBnZXRBbHREZXBsb3ltZW50RGVzY3JpcHRvcihNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgQXBwbGljYXRpb25DbGllbnRGaWxlczsgYWRkcyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQ7IHVzZQotCSAqIAotCSAqIEBsaW5rIEFyY2hpdmUjYWRkKEZpbGUpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgQ2xpZW50TW9kdWxlUmVmcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldENsaWVudE1vZHVsZVJlZnMoKTsKLQotCS8qKgotCSAqIEB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGNhbid0IG92ZXJyaWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGdlbmVyYXRlZAotCSAqICAgICAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCUFwcGxpY2F0aW9uIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLQotCUNvbm5lY3RvciBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihDb25uZWN0b3JNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uOwotCi0JRUpCSmFyIGdldERlcGxveW1lbnREZXNjcmlwdG9yKEVqYk1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQlBcHBsaWNhdGlvbkNsaWVudCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihKYXZhQ2xpZW50TW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCUVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCVdlYkFwcCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihXZWJNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgRUpCSmFyRmlsZXM7IGFkZHMgd2lsbCBub3QgYmUgcmVmbGVjdGVkOyB1c2UKLQkgKiAKLQkgKiBAbGluayBBcmNoaXZlI2FkZChGaWxlKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVKQkphckZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBFSkJNb2R1bGVSZWZzCi0JICovCi0JcHVibGljIExpc3QgZ2V0RUpCTW9kdWxlUmVmcygpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZWQgYnkgdGhlIEVqYlJlZiwgaWYgb25lIGV4aXN0cy4gVGhlIGVqYi1saW5rIHZhbHVlIG9mIHRoZQotCSAqIHJlZiBtdXN0IGVxdWF0ZSB0byBhIG5hbWVkIGVudGVycHJpc2UgYmVhbiBjb250YWluZWQgaW4gdGhlIGphcjsgb3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGhpdCBmb3VuZDsgYXNzdW1wdGlvbiB0aGF0IHRoZSBlamIgbmFtZXMgYXJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZQotCSAqIGVhciBmaWxlLiBUaGlzIHdpbGwgbGlrZWx5IGJlIHJlcGxhY2VkIHdpdGggYSBiZXR0ZXIgd2F5IGZvciBkZXJlZmVyZW5jaW5nIGVqYiByZWZzLgotCSAqIAotCSAqIENhbiBiZSB1c2VkIHdpdGggZWpiIDEuMSByZWZlcmVuY2VzIG9ubHkuCi0JICogCi0JICogQGRlcHJlY2F0ZWQge0BsaW5rI2dldEVudGVycGlzZUJlYW5Gcm9tUmVmKEVqYlJlZiByZWYsIFN0cmluZyBtb2R1bGVVcmkgKQotCSAqIEBwYXJhbSBFamJSZWYKLQkgKiAgICAgICAgICAgIHJlZiAtIEFuIGVqYiByZWZlcmVuY2UKLQkgKiBAcmV0dXJuIEVudGVycHJpc2VCZWFuCi0JICovCi0JcHVibGljIEVudGVycHJpc2VCZWFuIGdldEVudGVycGlzZUJlYW5Gcm9tUmVmKEVqYlJlZiByZWYpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYgYW5kIGEgbW9kdWxlIHVyaSwgaWYgb25lIGV4aXN0cy4gVGhlCi0JICogZWpiLWxpbmsgdmFsdWUgb2YgdGhlIHJlZiBtdXN0IGVxdWF0ZSB0byBhIG5hbWVkIGVudGVycHJpc2UgYmVhbiBjb250YWluZWQgaW4gdGhlIGphcjsKLQkgKiBvdGhlcndpc2UgcmV0dXJuIG51bGwuIFJldHVybnMgdGhlIGZpcnN0IGhpdCBmb3VuZDsgYXNzdW1wdGlvbiB0aGF0IHRoZSBlamIgbmFtZXMgYXJlIHVuaXF1ZQotCSAqIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGVhciBmaWxlLiBUaGlzIHdpbGwgbGlrZWx5IGJlIHJlcGxhY2VkIHdpdGggYSBiZXR0ZXIgd2F5IGZvcgotCSAqIGRlcmVmZXJlbmNpbmcgZWpiIHJlZnMuCi0JICogCi0JICogQ2FuIGJlIHVzZWQgd2l0aCBlamIgMS4xICYgZWpiIDIuMCByZWZlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBFamJSZWYKLQkgKiAgICAgICAgICAgIHJlZiAtIEFuIGVqYiByZWZlcmVuY2UKLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBtb2R1bGVVcmkgLSBUaGUgbW9kdWxlIHVyaQotCSAqIEByZXR1cm4gRW50ZXJwcmlzZUJlYW4KLQkgKi8KLQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoRWpiUmVmIHJlZiwgU3RyaW5nIG1vZHVsZVVyaSk7Ci0KLQlwdWJsaWMgTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgdXJpLCBTdHJpbmcgYWx0REQpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHJlZiB3aGljaCByZWZlcmVuY2VzCi0JICogQG1vZHVsZURlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgTW9kdWxlUmVmIGdldE1vZHVsZVJlZihNb2R1bGUgbW9kdWxlRGVzY3JpcHRvcik7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0IG9mIGFsbCBtb2R1bGUgcmVmcyBpbiB0aGlzIEVBUiBoYXZpbmcgYSByZWZlcmVuY2UgdG8KLQkgKiBAYU1vZHVsZUZpbGUKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNb2R1bGVSZWZzKE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgTW9kdWxlRmlsZXM7IGFkZHMgd2lsbCBub3QgYmUgcmVmbGVjdGVkOyB1c2UKLQkgKiAKLQkgKiBAbGluayBBcmNoaXZlI2FkZChGaWxlKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZHVsZUZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBSYXJGaWxlczsgYWRkcyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQ7IHVzZQotCSAqIAotCSAqIEBsaW5rIEFyY2hpdmUjYWRkKEZpbGUpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UkFSRmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIEZBUkZpbGVzOyBhZGRzIHdpbGwgbm90IGJlIHJlZmxlY3RlZDsgdXNlCi0JICoge0BsaW5rIEFyY2hpdmUjYWRkKEZpbGUpfQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZBUkZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBDb25uZWN0b3JNb2R1bGVSZWZzCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29ubmVjdG9yTW9kdWxlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBzZWN1cml0eSByb2xlcyBmcm9tIGFsbCBleGlzdGluZyBtb2R1bGVzIChFamJNb2R1bGUgYW5kIFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Um9sZXNGcm9tQWxsTW9kdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBzZWN1cml0eSByb2xlcyBmcm9tIGFuIGV4aXN0aW5nIG1vZHVsZSAoRWpiTW9kdWxlIGFuZCBXZWJNb2R1bGUpCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvbGVzRnJvbU1vZHVsZShNb2R1bGUgYU1vZHVsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBXYXJGaWxlczsgYWRkcyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQ7IHVzZQotCSAqIAotCSAqIEBsaW5rIEFyY2hpdmUjYWRkKEZpbGUpCi0JICovCi0JcHVibGljIExpc3QgZ2V0V0FSRmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIFdlYk1vZHVsZVJlZnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJNb2R1bGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBDb3B5IHRoZSByb2xlIGludG8gZWFjaCBNb2R1bGVGaWxlIGluIHRoZSBlYXIgZmlsZSB3aGljaCBkb2VzIG5vdCBhbHJlYWR5IGNvbnRhaW4gdGhlIHJvbGUKLQkgKiBBc3N1bXB0aW9uOiBhIHJvbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzCi0JICogCi0JICogQHJvbGUgZXhpc3RzIGluIHRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoRG93blJvbGUoU2VjdXJpdHlSb2xlIHJvbGUpOwotCi0JLyoqCi0JICogQ29weSB0aGUgcm9sZSBpbnRvIHRoZSBNb2R1bGVGaWxlIGZvciB0aGUgbW9kdWxlLCBpZiB0aGUgbW9kdWxlIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiB0aGUKLQkgKiByb2xlIEFzc3VtcHRpb246IGEgcm9sZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMKLQkgKiAKLQkgKiBAcm9sZSBleGlzdHMgaW4gdGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hEb3duUm9sZShTZWN1cml0eVJvbGUgcm9sZSwgTW9kdWxlIGFNb2R1bGUpOwotCi0JLyoqCi0JICogQXR0ZW1wdCB0byByZW1vdmUgdGhlIG1vZHVsZSBmb3IgdGhlIHBhcmFtZXRlciBmcm9tIHRoaXMgb2JqZWN0J3MgZGQsIHRoZW4gcmVtb3ZlIHRoZSBtb2R1bGUKLQkgKiBmaWxlLCBpZiBpdCBpcyBub3QgcmVmZXJlbmNlZCBmcm9tIGFueSBvdGhlciBNb2R1bGVSZWYsIGZyb20gdGhlIGxpc3Qgb2YgZmlsZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoTW9kdWxlUmVmIGFNb2R1bGVSZWYpOwotCi0JLyoqCi0JICogUmVuYW1lIHRoZSBzZWN1cml0eSByb2xlIGluIHRoZSBlYXIgZmlsZSdzIGRkOyBwdXNoIHRoaXMgY2hhbmdlIGRvd24gdG8gYW55IGNvbnRhaW5lZCBtb2R1bGUKLQkgKiBkZCdzOyBpZiB0aGUgbW9kdWxlIHNwZWNpZmllcyBhbiBhbHQtZGQsIHRoZSBjaGFuZ2Ugd2lsbCBiZSByZWZsZWN0ZWQgdGhlcmU7IG90aGVyd2lzZSBpdAotCSAqIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBzdGFuZGFyZCBkZCBvZiB0aGUgbW9kdWxlCi0JICogCi0JICogQHRocm93cyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBkZCBmb3IgdGhlIGVhciBkb2VzIG5vdCBjb250YWluIGEgcm9sZSB3aXRoIHRoZSBleGlzdGluZ1JvbGVOYW1lCi0JICogCi0JICogQHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgZGQgZm9yIHRoZSBlYXIgZmlsZSBhbHJlYWR5IGNvbnRhaW5zIGEgcm9sZSB3aXRoIHRoZSBuZXcgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmFtZVNlY3VyaXR5Um9sZShTdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSwgU3RyaW5nIG5ld1JvbGVOYW1lKSB0aHJvd3MgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZvciBlYWNoIHNlY3VyaXR5IHJvbGUgaW4gdGhlIGRkIGZvciBlYWNoIG1vZHVsZSwgYWRkIGEgY29weSB0byB0aGUgZWFyIGZpbGUncyBkZDsgaWYgYW4KLQkgKiBhbHQtZGQgaXMgc3BlY2lmaWVkIGZvciB0aGUgbW9kdWxlLCB1c2UgdGhhdCBkZDsgb3RoZXJ3aXNlIHVzZSB0aGUgc3RhbmRhcmQgZGQgaW4gdGhlIG1vZHVsZQotCSAqIGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByb2xsVXBSb2xlcygpOwotCi0JLyoqCi0JICogRm9yIGVhY2ggc2VjdXJpdHkgcm9sZSBpbiB0aGUgZGQgZm9yIGEgbW9kdWxlLCBhZGQgYSBjb3B5IHRvIHRoZSBlYXIgZmlsZSdzIGRkOyBpZiBhbiBhbHQtZGQKLQkgKiBpcyBzcGVjaWZpZWQgZm9yIHRoZSBtb2R1bGUsIHVzZSB0aGF0IGRkOyBvdGhlcndpc2UgdXNlIHRoZSBzdGFuZGFyZCBkZCBpbiB0aGUgbW9kdWxlIGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByb2xsVXBSb2xlcyhNb2R1bGUgYU1vZHVsZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXBsb3ltZW50RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBNb2R1bGVSZWZzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRNb2R1bGVSZWZzKCk7Ci0KLQlwdWJsaWMgTGlzdCBnZXRBcmNoaXZlc09mVHlwZShTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBNYXAgb2YgTW9kdWxlcyBhcyBrZXlzIGFuZCBhIExpc3Qgb2YgRUpCIFJlZmVyZW5jZXMgYXMgdGhlIHZhbHVlcy4gVGhpcyB3aWxsIGxldCB5b3UKLQkgKiBrbm93IHdoaWNoIE1vZHVsZXMgdGhlIHJlZmVyZW5jZXMgY2FtZSBmcm9tLiBZb3UgY2FuIGZpbHRlciB0aGUgbGlzdCBvZiBFSkIgUmVmZXJlbmNlcwotCSAqIHJldHVybmVkIG9uIHRoZSBsaW5rZWQgYXR0cmlidXRlZCBvZiB0aGUgcmVmZXJlbmNlLiBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiBmaWx0ZXIgbGlua2VkCi0JICogcmVmZXJlbmNlcywgbm9uLWxpbmtlZCByZWZlcmVuY2VzLCBvciBuZWl0aGVyIChpLmUuLCByZXR1cm4gYWxsIHJlZmVyZW5jZXMpLgotCSAqLwotCU1hcCBnZXRFSkJSZWZlcmVuY2VzKGJvb2xlYW4gZmlsdGVyTGlua2VkUmVmZXJlbmNlcywgYm9vbGVhbiBmaWx0ZXJOb25MaW5rZWRSZWZlcmVuY2VzKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FSkJKYXJGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FSkJKYXJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmQwYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRUpCSmFyRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkRlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFSkJKYXJGaWxlIGV4dGVuZHMgTW9kdWxlRmlsZSB7Ci0KLQkvKioKLQkgKiBVc2VkIGZvciB0b29scyBwZXJmb3JtaW5nIHNlbGVjdGl2ZSBpbXBvcnQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBc3NvY2lhdGVkRmlsZXMoRW50ZXJwcmlzZUJlYW4gZWpiKTsKLQotCS8qKgotCSAqIEB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGNhbid0IG92ZXJyaWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGdlbmVyYXRlZAotCSAqICAgICAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCUVKQkphciBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcG9ydGVkRnJvbTEwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXBsb3ltZW50RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKEVKQkphciB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VKQk1vZHVsZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRUpCTW9kdWxlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MjI2ZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRUpCTW9kdWxlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQk1vZHVsZVJlZiBleHRlbmRzIE1vZHVsZVJlZiB7Ci0KLQlFSkJKYXIgZ2V0RUpCSmFyKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotCi19IC8vRUpCTW9kdWxlUmVmCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9GaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9GaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMDUzYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbGUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhdGggdXAgdG8gdGhlIGZpbGVuYW1lOyBlLmcuLCBmcm9tIGNvbS9pYm0vZm9vL2Jhci5jbGFzcywgY29tL2libS9mb28KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeVVSSSgpOwotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWlsIG9mIHRoZSBmaWxlIHBhdGg7IGUuZy4sIGZyb20gY29tL2libS9mb28vYmFyLmNsYXNzLCByZXR1cm4gYmFyLmNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNBcmNoaXZlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpOwotCi0JcHVibGljIGJvb2xlYW4gaXNFQVJGaWxlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZBUkZpbGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzRUpCSmFyRmlsZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNNb2R1bGVGaWxlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JBUkZpbGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHlEaXJlY3RvcnkoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzV0FSRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVVJJIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRVUkkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBVUkkgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVUkkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExhc3RNb2RpZmllZCBhdHRyaWJ1dGUKLQkgKi8KLQlsb25nIGdldExhc3RNb2RpZmllZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSNnZXRMYXN0TW9kaWZpZWQgPGVtPkxhc3QgTW9kaWZpZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYXN0IE1vZGlmaWVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExhc3RNb2RpZmllZCgpCi0JICogQHNlZSAjdW5zZXRMYXN0TW9kaWZpZWQoKQotCSAqIEBzZWUgI2dldExhc3RNb2RpZmllZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2dldExhc3RNb2RpZmllZCA8ZW0+TGFzdCBNb2RpZmllZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TGFzdE1vZGlmaWVkKCkKLQkgKiBAc2VlICNnZXRMYXN0TW9kaWZpZWQoKQotCSAqIEBzZWUgI3NldExhc3RNb2RpZmllZChsb25nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGFzdE1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjZ2V0TGFzdE1vZGlmaWVkIDxlbT5MYXN0IE1vZGlmaWVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFzdCBNb2RpZmllZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGFzdE1vZGlmaWVkKCkKLQkgKiBAc2VlICNnZXRMYXN0TW9kaWZpZWQoKQotCSAqIEBzZWUgI3NldExhc3RNb2RpZmllZChsb25nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TGFzdE1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBTaXplIGF0dHJpYnV0ZQotCSAqLwotCWxvbmcgZ2V0U2l6ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUuRmlsZSNnZXRTaXplIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U2l6ZSgpCi0JICogQHNlZSAjdW5zZXRTaXplKCkKLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTaXplKGxvbmcgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5GaWxlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNpc1NldFNpemUoKQotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBzZWUgI3NldFNpemUobG9uZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNpemUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSNnZXRTaXplIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U2l6ZSgpCi0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQHNlZSAjc2V0U2l6ZShsb25nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkKLQkgKiBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERpcmVjdG9yeUVudHJ5KCkKLQkgKiBAc2VlICN1bnNldERpcmVjdG9yeUVudHJ5KCkKLQkgKiBAc2VlICNzZXREaXJlY3RvcnlFbnRyeShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUuQ29tbW9uYXJjaGl2ZVBhY2thZ2UjZ2V0RmlsZV9EaXJlY3RvcnlFbnRyeSgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNEaXJlY3RvcnlFbnRyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSNpc0RpcmVjdG9yeUVudHJ5IDxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI3Vuc2V0RGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI2lzRGlyZWN0b3J5RW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERpcmVjdG9yeUVudHJ5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2lzRGlyZWN0b3J5RW50cnkgPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI2lzRGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI3NldERpcmVjdG9yeUVudHJ5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXREaXJlY3RvcnlFbnRyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2lzRGlyZWN0b3J5RW50cnkgPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI2lzRGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI3NldERpcmVjdG9yeUVudHJ5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREaXJlY3RvcnlFbnRyeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgT3JpZ2luYWxVUkkgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldE9yaWdpbmFsVVJJKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgT3JpZ2luYWxVUkkgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRPcmlnaW5hbFVSSShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBMb2FkaW5nQ29udGFpbmVyIHJlZmVyZW5jZQotCSAqLwotCUNvbnRhaW5lciBnZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMb2FkaW5nQ29udGFpbmVyIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TG9hZGluZ0NvbnRhaW5lcihDb250YWluZXIgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBDb250YWluZXIgcmVmZXJlbmNlCi0JICovCi0JQ29udGFpbmVyIGdldENvbnRhaW5lcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQ29udGFpbmVyIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0dlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0dlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhY2NlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9HZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgewotCi0JLyoqCi0JICogVGhpcyBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgY29udHJpYnV0b3JzIHNob3VsZCB1c2UgdG8gc3BlY2lmeSB0aGUgZ2VuZXJpYyB0eXBlIHRoYXQKLQkgKiBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGFyY2hpdmVzLiBFeGFtcGxlOiBjb20ueW91cmNvbXBhbnkuajJlZS5leHRlbnNpb24uY3VzdG9tTW9kdWxlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUtleSgpOwotCi0JLyoqCi0JICogSWYgY29tbW9uIGFyY2hpdmUgc2hvdWxkIHJlY29nbml6ZSBmaWxlIGV4dGVuc2lvbnMgb3RoZXIgdGhhbiB0aGUgc3RhbmRhcmQgb25lcywgZS5nLiwgLmphciwKLQkgKiAuemlwLCB0aGVuIHRoZXNlIGZpbGUgZXh0ZW5zaW9ucyBjYW4gYmUgc3BlY2lmaWVkIGhlcmUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDdXN0b21GaWxlRXh0ZW5zaW9ucygpOwotCi0JLyoqCi0JICogTWV0aG9kIHRoYXQgaW5kaXZpZHVhbCBkaXNjcmltaW5hdG9ycyBjYW4gaW1wbGVtZW50IHRvIGRldGVybWluZSBpZiBhbiBBcmNoaXZlIGlzIG9mIGEKLQkgKiBwYXJ0aWN1bGFyIHR5cGUuIEltcGxlbWVudGVycyBzaG91bGQgYmUgc2Vuc2l0aXZlIHRvIHBlcmZvcm1hbmNlIHJlcXVpcm1lbnRzLiBVc3VhbGx5IHNpbXBsZQotCSAqIHRlc3RzIHNob3VsZCBiZSBwZXJmb3JtZWQsIHN1Y2ggYXM6Ci0JICogPGNvZGU+aWYgKGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoInh4eC54bWwiKTxjb2RlPi4gIFRoZSByZXN1bHQgd2lsbAotCSAqIGJlIHN0b3JlZCBpbiB0aGUgQXJjaGl2ZSdzICJ0eXBlcyIgYXR0cmlidXRlLgotCSAqIEBwYXJhbSBhbkFyY2hpdmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzY3JpbWluYXRlKEFyY2hpdmUgYW5BcmNoaXZlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvTW9kdWxlRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvTW9kdWxlRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA0YjgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL01vZHVsZUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkRlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2R1bGVGaWxlIGV4dGVuZHMgQXJjaGl2ZSB7Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotCi0JcHVibGljIFN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIgZm9yIHRoaXMgYXJjaGl2ZSBjYXN0ZWQgdG8gRUFSRmlsZTsgbnVsbCBpZiB0aGlzIGZpbGUgaXMgbm90IGNvbnRhaW5lZAotCSAqIGluIGFuIEVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBnZXRFQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5FeHBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkV4cG9ydFN0cmF0ZWd5IGdldEV4cG9ydFN0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBnZXRJbXBvcnRTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgZmlsZS4gRm9yIGV4YW1wbGUsICIyLjAiCi0JICogCi0JICogQGRlcHJlY2F0ZWQsIFVzZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2ZXJzaW9uIElEIG9mIHRoZSBtb2R1bGUgRm9yIGV4YW1wbGUsICIyMCIKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3BlY1ZlcnNpb25JRCgpOwotCi0JRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFuc3dlcnMgd2hldGhlciB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIG51bGw7IHVzZWQgZm9yIGNvcHksIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQotCSAqIGltcG9ydCBzdHJhdGVneSBuZWVkcyB0byBiZSBjb3BpZWQgb3Igbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpOwotCi0JcHVibGljIFJlc291cmNlIG1ha2VEZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHBvcnRTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5FeHBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRXhwb3J0U3RyYXRlZ3kgbmV3RXhwb3J0U3RyYXRlZ3kpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SW1wb3J0U3RyYXRlZ3kKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBvcnRTdHJhdGVneShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBuZXdJbXBvcnRTdHJhdGVneSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBKMkVFIHZlcnNpb24gZm9yIHRoaXMgYXJjaGl2ZQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbihpbnQgdmVyc2lvbklEKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvTW9kdWxlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Nb2R1bGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxMjMwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Nb2R1bGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZVJlZiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFyc2VkIGxvY2FsIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBNb2R1bGVGaWxlCi0JICovCi0JRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhcnNlZCBhbHQgZGQsIGlmIGl0IGV4aXN0cywgZnJvbSB0aGUgRUFSIGZpbGUgY29udGFpbmluZyB0aGlzIG1vZHVsZQotCSAqLwotCUVPYmplY3QgZ2V0QWx0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYWx0IGRkIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHRoZSBsb2NhbCBkZAotCSAqLwotCUVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVyaSBmcm9tIHRoZSB7QGxpbmsgTW9kdWxlfXJlZmVyZW5jZWQgYnkgdGhpcyByZWY7IGlmIHRoZXJlIGlzIG5vIG1vZHVsZSwgKGVnLiBhCi0JICogc3RhbmRhbG9uZSBKQVIpLCBnZXRzIHRoZSB1cmkgZnJvbSB0aGUge0BsaW5rIE1vZHVsZUZpbGV9LiBBc3N1bXB0aW9uOiBUaGUgdXJpIG9mIHRoZQotCSAqIHtAbGluayBNb2R1bGV9YW5kIHtAbGluayBNb2R1bGVGaWxlfXNob3VsZCBzdGF5IGluIHN5bmMKLQkgKi8KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIE1vZHVsZUZpbGUgcmVmZXJlbmNlCi0JICovCi0JTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlKCk7Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIHtAbGluayBBcmNoaXZlI2dldE1vZlJlc291cmNlKFN0cmluZyl9LCBleGNlcHQgdGhhdCBhbHQtZGQgaW5kaXJlY3Rpb24gaXMKLQkgKiBjb25zaWRlcmVkLiBJZiB0aGlzIG1vZHVsZSB1c2VzIGFuIGFsdC1kZCwgdGhlbiB0aGUgdXJpIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggdGhlICJhbHQtcm9vdCIKLQkgKiBhbmQgdGhlIHJlc291cmNlIHdpbGwgYmUgbG9hZGVkIGZyb20gdGhlIG93bmluZyBFQVIgZmlsZS4gSW4gdGhpcyBjYXNlLCBhbGwgaHJlZnMgaW50byBhbmQKLQkgKiBvdXQgb2YgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIEVBUi4gVGhlIGhyZWZzIGFyZSB0YWtlbiBjYXJlIG9mCi0JICogZm9yIGZyZWUgd2hlbiB0aGUgY2xpZW50IHVzZXMge0BsaW5rICNtYWtlQWx0RGVzY3JpcHRvcnNBbmRSZXNvdXJjZXMoKX0uIFRoZSBhbHQgcm9vdCBpcwotCSAqIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHdoZW4gaXQgZG9lcyBub3QgZXhpc3QuCi0JICogCi0JICogQHNlZSBNb2R1bGVFeHRlbnNpb24jZ2V0QWx0Um9vdCgpCi0JICovCi0JUmVzb3VyY2UgZ2V0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotCi0JcHVibGljIElucHV0U3RyZWFtIGdldEFsdFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JcHVibGljIElucHV0U3RyZWFtIGdldExvY2FsUmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5wdXQgc3RyZWFtIGZyb20gdGhlIHJlc291cmNlcyBwYXRoIG9mIGVpdGhlciB0aGUgTW9kdWxlRmlsZSwgaWYgdGhlIG1vZHVsZSBkb2VzCi0JICogbm90IHVzZSBhbHQtZGQsIG9yIGZyb20gdGhlIGFsdFJvb3Qgb2YgdGhlIG1vZHVsZSwgZm91bmQgaW4gdGhlIHJlc291cmNlcyBwYXRoIG9mIHRoZSBFQVIKLQkgKiAKLQkgKiBAc2VlIExvYWRTdHJhdGVneSNnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFJldHJpZXZlIGEgcmVzb3VyY2UgZnJvbSB0aGUgTW9kdWxlRmlsZQotCSAqIAotCSAqIEBzZWUgQXJjaGl2ZSNnZXRNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JUmVzb3VyY2UgZ2V0TG9jYWxNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGUgdXJpIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggdGhlICJhbHQtcm9vdCIgYW5kIHRoZSByZXNvdXJjZSB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBvd25pbmcKLQkgKiBFQVIgZmlsZS4KLQkgKi8KLQlSZXNvdXJjZSBnZXRBbHRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9mIHJlc291cmNlIGFuZCBhZGQgaXQgdG8gdGhlIHJlc291cmNlIHNldCBvZiB0aGUgY29udGV4dCBvZiBlaXRoZXIgdGhlIG1vZHVsZQotCSAqIGZpbGUgaWYgdGhpcyBNb2R1bGVSZWYgaXMgbm90IGFuIGFsdCwgb3IgdG8gdGhlIEVBUiBmaWxlIGlmIGl0IGlzIGFuIGFsdC4gSWYgdGhpcyBtb2R1bGUgaXMKLQkgKiB1c2VzIGFuIGFsdC1kZCwgdGhlbiB0aGUgdXJpIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggdGhlICJhbHQtcm9vdCIgVGhlIGFsdCByb290IGlzCi0JICogYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgd2hlbiBpdCBkb2VzIG5vdCBleGlzdC4KLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBhcmNoaXZlIGhhdmluZyB0aGUgdXJpCi0JICovCi0JUmVzb3VyY2UgbWFrZU1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQlSZXNvdXJjZSBtYWtlTG9jYWxNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JUmVzb3VyY2UgbWFrZUFsdE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE1vZHVsZUZpbGUgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRNb2R1bGVGaWxlKE1vZHVsZUZpbGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmVuYW1lIHRoaXMgbW9kdWxlOyBib3RoIGl0cyBNb2R1bGVGaWxlIGFuZCBNb2R1bGUgZWxlbWVudCBmcm9tIHRoZSBBcHBsaWNhdGlvbiBkZXBsb3ltZW50Ci0JICogZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSk7Ci0KLQlib29sZWFuIGlzRUpCKCk7Ci0KLQlib29sZWFuIGlzV2ViKCk7Ci0KLQlib29sZWFuIGlzQ2xpZW50KCk7Ci0KLQlib29sZWFuIGlzQ29ubmVjdG9yKCk7Ci0KLQlib29sZWFuIHVzZXNBbHRERCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBFYXJGaWxlIHJlZmVyZW5jZQotCSAqLwotCUVBUkZpbGUgZ2V0RWFyRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRWFyRmlsZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEVhckZpbGUoRUFSRmlsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1vZHVsZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1vZHVsZShNb2R1bGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5Db21tb25hcmNoaXZlUGFja2FnZSNnZXRNb2R1bGVSZWZfTW9kdWxlKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZHVsZSBnZXRNb2R1bGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZiNnZXRNb2R1bGUgPGVtPk1vZHVsZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1vZHVsZShNb2R1bGUgdmFsdWUpOwotCi19IC8vTW9kdWxlUmVmCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SQVJGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SQVJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZjU1MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUkFSRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUkFSRmlsZSBleHRlbmRzIE1vZHVsZUZpbGV7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwgdGhlcmUKLQkgKiByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGVwbG95bWVudERlc2NyaXB0b3IoQ29ubmVjdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUuQ29tbW9uYXJjaGl2ZVBhY2thZ2UjZ2V0UkFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25uZWN0b3IgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGUjZ2V0RGVwbG95bWVudERlc2NyaXB0b3IgPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKENvbm5lY3RvciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgUkFSIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGZvciBleHBhbmRpbmcKLQkgKiB0aGUgUkFSIGZpbGUgaWYgaXQgaXMgYSBzdGFuZGFsb25lIFJBUi4gSWYgdGhlIFJBUiBmaWxlIGlzIHBhY2thZ2VkIGFzIHBhcnQgb2YgYW4gRUFSLCB0aGlzCi0JICogbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC4gSW5zdGVhZCwgdGhlIGV4cGFuZFRvKCkgb2YgdGhlIEVBUiBzaG91bGQgYmUgdXNlZCBleHBhbmQgdGhlCi0JICogY29udGVudHMgb2YgdGhlIGVhciBhbmQgdGhlIG5lc3RlZCBSQVIgcmVsYXRpdmUgdG8gdGhlIEVBUidzIGRpcmVjdG9yeSAoc2ltaWxhciB0byBXQVIncykuCi0JICogQ3JlYXRpb24gZGF0ZTogKDIvNi8yMDAxIDc6NDQ6NDEgUE0pCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBleHBhbmRGbGFncwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0Jdm9pZCBleHRyYWN0VG9Db25uZWN0b3JEaXJlY3RvcnkoU3RyaW5nIGRpciwgaW50IGV4cGFuZEZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SZWFkT25seURpcmVjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUmVhZE9ubHlEaXJlY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlZjc2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SZWFkT25seURpcmVjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seURpcmVjdG9yeSBleHRlbmRzIENvbnRhaW5lciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpbGVJblNlbGZPclN1YmRpcmVjdG9yeShTdHJpbmcgdXJpKTsKLQotCXB1YmxpYyBGaWxlIGdldEZpbGVJblNlbGZPclN1YmRpcmVjdG9yeShTdHJpbmcgdXJpKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmxhdCBsaXN0IG9mIGFsbCB0aGUgZmlsZXMgY29udGFpbmVkIGluIHRoaXMgZGlyZWN0b3J5IGFuZCBzdWJkaXJlY3Rvcmllcywgd2l0aCB0aGUKLQkgKiBkaXJlY3RvcmllcyBmaWx0ZXJlZCBvdXQsIGFzIHRoZSBsaXN0IHdvdWxkIGFwcGVhciBpbiBhbiBhcmNoaXZlCi0JICovCi0JcHVibGljIExpc3QgZ2V0RmlsZXNSZWN1cnNpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIGZpbGVzIHdpdGgganVzdCB0aGUgaW5zdGFuY2VzIG9mIFJlYWRPbmx5RGlyZWN0b3J5Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UmVhZE9ubHlEaXJlY3RvcmllcygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUmVwYWlyQXJjaGl2ZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JlcGFpckFyY2hpdmVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZWU1YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUmVwYWlyQXJjaGl2ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZVV0aWw7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjcvMDEgMjoyMDo0NCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUmVwYWlyQXJjaGl2ZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByb3RlY3RlZCBBcmNoaXZlIGFyY2hpdmU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgZGlyZWN0b3J5TmFtZXM7Ci0KLQkvKioKLQkgKiBSZXBhaXJNZXRhSW5mQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBSZXBhaXJBcmNoaXZlQ29tbWFuZChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlzdXBlcigiUmVwYWlyIEFyY2hpdmUiLCBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLlJlcGFpcnNfYWxsX2VudHJpZXNfaW5fdGhlKTsgLy8gPSAiUmVwYWlycyBhbGwgZW50cmllcyBpbiB0aGUgTUVUQS1JTkYgYW5kL29yIFdFQi1JTkYgZGlyZWN0b3JpZXMgdG8gYmUgdGhlIGNvcnJlY3QgY2FzZSIvLyROT04tTkxTLTEkCi0JCWFyY2hpdmUgPSBhbkFyY2hpdmU7Ci0JCS8vRW5zdXJlIEluaXRpYWlsaXphdGlvbgotCQlnZXREaXJlY3RvcnlOYW1lcygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uLmNvbW1hbmQuQ29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUxpc3QgZmlsZXMgPSBhcmNoaXZlLmdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzQXJjaGl2ZSgpKSB7Ci0JCQkJbmV3IFJlcGFpckFyY2hpdmVDb21tYW5kKChBcmNoaXZlKSBhRmlsZSkuZXhlY3V0ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgdXBwZXJVcmkgPSBhRmlsZS5nZXRVUkkoKS50b1VwcGVyQ2FzZSgpOwotCQkJCUl0ZXJhdG9yIGtleXNBbmRWYWx1ZXMgPSBkaXJlY3RvcnlOYW1lcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGtleXNBbmRWYWx1ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyB1cmkgPSBhRmlsZS5nZXRVUkkoKTsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkga2V5c0FuZFZhbHVlcy5uZXh0KCk7Ci0JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHVwcGVyVXJpLnN0YXJ0c1dpdGgoa2V5KSAmJiAhdXJpLnN0YXJ0c1dpdGgodmFsdWUpKSB7Ci0JCQkJCQlTdHJpbmcgdGFpbCA9IHVyaS5zdWJzdHJpbmcoa2V5Lmxlbmd0aCgpKTsKLQkJCQkJCWFGaWxlLnNldFVSSSh2YWx1ZS5jb25jYXQodGFpbCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8xNC8wMSA1OjU1OjE0IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLlNldAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgamF2YS51dGlsLk1hcCBnZXREaXJlY3RvcnlOYW1lcygpIHsKLQkJaWYgKGRpcmVjdG9yeU5hbWVzID09IG51bGwpIHsKLQkJCWRpcmVjdG9yeU5hbWVzID0gbmV3IEhhc2hNYXAoNik7Ci0JCQlkaXJlY3RvcnlOYW1lcy5wdXQoSjJFRUNvbnN0YW50cy5NRVRBX0lORi50b1VwcGVyQ2FzZSgpLCBKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKTsKLQkJCWRpcmVjdG9yeU5hbWVzLnB1dChKMkVFQ29uc3RhbnRzLldFQl9JTkYudG9VcHBlckNhc2UoKSwgSjJFRUNvbnN0YW50cy5XRUJfSU5GKTsKLQkJCWRpcmVjdG9yeU5hbWVzLnB1dChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJLnRvVXBwZXJDYXNlKCksIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkkpOwotCQkJZGlyZWN0b3J5TmFtZXMucHV0KEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJLnRvVXBwZXJDYXNlKCksIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJKTsKLQkJfQotCQlyZXR1cm4gZGlyZWN0b3J5TmFtZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117YXJjaGl2ZX0pOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzE0LzAxIDY6NDY6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKCF2YWxpZGF0ZUFyZ3MoYXJncykpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5wcmltT3BlbkFyY2hpdmUoYXJnc1swXSk7Ci0JCQluZXcgUmVwYWlyQXJjaGl2ZUNvbW1hbmQoYW5BcmNoaXZlKS5leGVjdXRlKCk7Ci0JCQlhbkFyY2hpdmUuc2F2ZUFzKGFyZ3NbMV0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLlJlcGFpcl9jb21tYW5kX2ZhaWxlZF9fX2V4X0VYQ18pOyAvLyA9ICJSZXBhaXIgY29tbWFuZCBmYWlsZWQgLSBleGNlcHRpb24gc3RhY2sgdHJhY2U6IgotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkvL0RlZmF1bHQKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVBcmdzKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKCEoYXJncy5sZW5ndGggPT0gMikpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5SZXBhaXJBcmNoaXZlQ29tbWFuZF91c2FnZSk7IC8vID0gIlJlcGFpckFyY2hpdmVDb21tYW5kIHVzYWdlOiAgPHNvdXJjZUphckZpbGVQYXRoPiA8ZGVzdGluYXRpb25QYXRoPiIKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlqYXZhLmlvLkZpbGUgZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoYXJnc1swXSk7Ci0JCWJvb2xlYW4gaXNaaXAgPSBmYWxzZTsKLQkJamF2YS51dGlsLnppcC5aaXBGaWxlIHppcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXAgPSBBcmNoaXZlVXRpbC5uZXdaaXBGaWxlKGZpbGUpOwotCQkJaXNaaXAgPSB0cnVlOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQlpc1ppcCA9IGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHppcCAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCXppcC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCX0KLQkJaWYgKCFpc1ppcCAmJiAhZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5SZXBhaXJBcmNoaXZlQ29tbWFuZF91c2FnZTFfRVJST1JfKTsgLy8gPSAiUmVwYWlyQXJjaGl2ZUNvbW1hbmQgdXNhZ2U6IHNvdXJjZUphckZpbGVQYXRoIG11c3QgcG9pbnQgdG8gYSB2YWxpZCBhcmNoaXZlIG9yIGRpcmVjdG9yeSBvZiBhbiBpbmZsYXRlZCBhcmNoaXZlIgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChuZXcgamF2YS5pby5GaWxlKGFyZ3NbMV0pLmNhbldyaXRlKCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLnJlcGFpcl91c2FnZV9FUlJPUl8sIChuZXcgT2JqZWN0W117YXJnc1sxXX0pKSk7IC8vID0gIlJlcGFpckFyY2hpdmVDb21tYW5kIHVzYWdlOiBjYW5ub3Qgd3JpdGUgdG8gZGVzdGluYXRpb25QYXRoICIKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9WYWxpZGF0ZVhtbENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1ZhbGlkYXRlWG1sQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWRlOTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1ZhbGlkYXRlWG1sQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5Db2xsZWN0aW5nRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5YbWxEb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTkvMDEgMTA6MDQ6MDggQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlWG1sQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJvdGVjdGVkIExpc3QgcmVzdWx0czsKLQlwcm90ZWN0ZWQgTW9kdWxlRmlsZSBhcmNoaXZlOwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmVzdGVkID0gdHJ1ZTsKLQotCS8qKgotCSAqIFZhbGlkYXRlWG1sQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBWYWxpZGF0ZVhtbENvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVYbWxDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFZhbGlkYXRlWG1sQ29tbWFuZChNb2R1bGVGaWxlIG0pIHsKLQkJc3VwZXIoKTsKLQkJYXJjaGl2ZSA9IG07Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVYbWxDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFZhbGlkYXRlWG1sQ29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlWG1sQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBWYWxpZGF0ZVhtbENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlyZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl2YWxpZGF0YXRlWG1sKCk7Ci0JCWlmIChpc1ZhbGlkYXRlTmVzdGVkKCkpIHsKLQkJCUxpc3QgYXJjaGl2ZXMgPSBhcmNoaXZlLmdldEFyY2hpdmVGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJCUFyY2hpdmUgYSA9IChBcmNoaXZlKSBhcmNoaXZlcy5nZXQoaSk7Ci0JCQkJaWYgKCFhLmlzTW9kdWxlRmlsZSgpKQotCQkJCQljb250aW51ZTsKLQkJCQlNb2R1bGVGaWxlIG0gPSAoTW9kdWxlRmlsZSkgYTsKLQkJCQlWYWxpZGF0ZVhtbENvbW1hbmQgY21kID0gbmV3IFZhbGlkYXRlWG1sQ29tbWFuZChtKTsKLQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCXJlc3VsdHMuYWRkQWxsKGNtZC5nZXRSZXN1bHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIExpc3Qgb2YgWG1sVmFsaWRhdGlvblJlc3VsdDsgMSBmb3IgdGhlIGFyY2hpdmUsIGFuZCBvbmUgZm9yIGVhY2ggbmVzdGVkIG1vZHVsZSBmaWxlCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMC8yMi8yMDAxIDE6MDY6NTIgUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0ZU5lc3RlZCgpIHsKLQkJcmV0dXJuIHZhbGlkYXRlTmVzdGVkOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzIyLzIwMDEgMTowNjo1MiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsaWRhdGVOZXN0ZWQKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZU5lc3RlZChib29sZWFuIG5ld1ZhbGlkYXRlTmVzdGVkKSB7Ci0JCXZhbGlkYXRlTmVzdGVkID0gbmV3VmFsaWRhdGVOZXN0ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGF0ZVhtbCgpIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJUmVzb3VyY2UgcmVzID0gYXJjaGl2ZS5nZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCkuZVJlc291cmNlKCk7Ci0JCVhtbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IFhtbFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJcmVzdWx0LnNldEFyY2hpdmUoYXJjaGl2ZSk7Ci0JCXRyeSB7Ci0JCQlyZXMuc2F2ZShib3MsIG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3MudG9CeXRlQXJyYXkoKSk7Ci0JCUlucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpblN0cmVhbSk7Ci0JCUNvbGxlY3RpbmdFcnJvckhhbmRsZXIgaGFuZGxlciA9IG5ldyBDb2xsZWN0aW5nRXJyb3JIYW5kbGVyKCk7Ci0JCVhtbERvY3VtZW50UmVhZGVyIHBhcnNlQWRhcHRlciA9IG5ldyBYbWxEb2N1bWVudFJlYWRlcihzb3VyY2UsIG51bGwsIGhhbmRsZXIpOwotCi0JCS8vIHRoZSBmb2xsb3dpbmcgdHJ5L2NhdGNoIGNsYXVzZSBpcyBhZGRlZCB0byBoYW5kbGUgdGhlIGNhc2UKLQkJLy8gd2hlbiBTQVggcGFyc2VyIHRocm93cyBhIGZhdGFsIGV4Y2VwdGlvbiAodHlwZSBTQVhFeGNlcHRpb24pCi0JCS8vIGZvciB1bm1hdGNoaW5nIGVuZCB0YWcgdGhhdCByZXN1bHRzIGluIGEgUnVudGltZUV4Y2VwdGlvbiB0bwotCQkvLyBiZSB0aHJvd24uIE5lZWQgdG8gY2F0Y2ggaXQgc28gd2UgY2FuIGdldCB0aGUgcGFyc2VyIGV4Y2VwdGlvbnMKLQkJLy8gYW5kIGRpc3BsYXkgdGhlbSB0byB0aGUgdXNlci4KLQkJdHJ5IHsKLQkJCXBhcnNlQWRhcHRlci5wYXJzZURvY3VtZW50KCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQotCQkJaWYgKGhhbmRsZXIuZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpICE9IG51bGwpIHsKLQkJCQlyZXN1bHQuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJCQlyZXN1bHQuc2V0Q2F1Z2h0RXhjZXB0aW9ucyhoYW5kbGVyLmdldENhdWdodEV4Y2VwdGlvbnMoKSk7Ci0JCQkJcmVzdWx0cy5hZGQocmVzdWx0KTsKLQkJCX0KLQotCQkJdGhyb3cgcmU7Ci0JCX0KLQotCQlyZXN1bHQuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJcmVzdWx0LnNldENhdWdodEV4Y2VwdGlvbnMoaGFuZGxlci5nZXRDYXVnaHRFeGNlcHRpb25zKCkpOwotCQlyZXN1bHRzLmFkZChyZXN1bHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1dBUkZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1dBUkZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3YjA4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9XQVJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdBUkZpbGUgZXh0ZW5kcyBNb2R1bGVGaWxlIHsKLQotCS8qKgotCSAqIENvcHkgdGhlIGZpbGUsIGFuZCBzd2l6emxlIHRoZSBmaWxlIHVyaSBpZiBuZWNlc3NhcnkgYnkgcHJlcGVuZGluZyB0aGUgY2xhc3NlcyBkaXJlY3RvcnkKLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIG9mIGEgZmlsZSB3aXRoIHRoZSBtb2RpZmllZCB1cmkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFyY2hpdmUKLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBSZWFkT25seURpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBGaWxlIGFkZENvcHlDbGFzcyhGaWxlIGFGaWxlKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvcHkgdGhlIGZpbGUsIGFuZCBzd2l6emxlIHRoZSBmaWxlIHVyaSBpZiBuZWNlc3NhcnkgYnkgcHJlcGVuZGluZyB0aGUgbGlicyBkaXJlY3RvcnkKLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIG9mIGEgZmlsZSB3aXRoIHRoZSBtb2RpZmllZCB1cmkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFyY2hpdmUKLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBSZWFkT25seURpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBGaWxlIGFkZENvcHlMaWIoRmlsZSBhRmlsZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBnZXRDbGFzc2VzKCkgLSBmaWx0ZXIgZmlsZXMgdG8gcmV0dXJuIHRoZSBjbGFzcyBmaWxlcyBmcm9tIFx3ZWItaW5mXGNsYXNzZXMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBEZXBsb3ltZW50RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQlXZWJBcHAgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRmlsdGVyIGZpbGVzIHRvIHJldHVybiB0aGUgZmlsZXMgZnJvbSBcd2UtaW5mXGxpYgotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpYnMoKTsKLQotCS8qKgotCSAqIEZpbHRlciBmaWxlcyB0byByZXR1cm4gdGhlIEpBUnMgYW5kIFppcHMgZnJvbSBcd2UtaW5mXGxpYgotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpYkFyY2hpdmVzKCk7Ci0KLQkvKioKLQkgKiBnZXRSZXNvdXJjZXMoKSAtIGZpbHRlciBmaWxlcyB0byByZXR1cm4gdGhlIFdlYiByZXNvdXJjZXMgd2l0aGluIHRoZSBXQVIgKG5vCi0JICogY2xhc3Nlcy9saWJzL21ldGFkYXRhKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzb3VyY2UgZmlsZSB0aGF0IG1hdGNoZXMgdGhlIG91dHB1dCBmaWxlIHBhc3NlZCBpbgotCSAqIAotCSAqIEBwYXJhbSBhQ2xhc3NGaWxlCi0JICogICAgICAgICAgICBUaGUgLmNsYXNzIGZpbGUgb3Igb3RoZXIgb3V0cHV0IGZpbGUgdG8gZmluZCB0aGUgc291cmNlIGZvcgotCSAqIEByZXR1cm4gU3RyaW5nIFRoZSBtYXRjaGluZyBzb3VyY2UuIE51bGwgaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc291cmNlIGZvdW5kCi0JICovCi0JcHVibGljIEZpbGUgZ2V0U291cmNlRmlsZShGaWxlIGFDbGFzc0ZpbGUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihXZWJBcHAgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9XZWJNb2R1bGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1dlYk1vZHVsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzkwOTkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1dlYk1vZHVsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYk1vZHVsZVJlZiBleHRlbmRzIE1vZHVsZVJlZiB7Ci0JV2ViQXBwIGdldFdlYkFwcCgpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLQotfSAvL1dlYk1vZHVsZVJlZgotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvWG1sVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvWG1sVmFsaWRhdGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTU5NTg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1htbFZhbGlkYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzE5LzAxIDM6MzE6NTMgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFhtbFZhbGlkYXRpb25SZXN1bHQgewotCXByb3RlY3RlZCBNb2R1bGVGaWxlIGFyY2hpdmU7Ci0JcHJvdGVjdGVkIExpc3QgY2F1Z2h0RXhjZXB0aW9uczsKLQotCS8qKgotCSAqIFhtbFZhbGlkYXRpb25SZXN1bHQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWG1sVmFsaWRhdGlvblJlc3VsdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAzOjM0OjQ1IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Nb2R1bGVGaWxlCi0JICovCi0JcHVibGljIE1vZHVsZUZpbGUgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTkvMDEgMzozNDo0NSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldENhdWdodEV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiBjYXVnaHRFeGNlcHRpb25zOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzE5LzAxIDM6MzQ6NDUgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0FyY2hpdmUKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuTW9kdWxlRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoTW9kdWxlRmlsZSBuZXdBcmNoaXZlKSB7Ci0JCWFyY2hpdmUgPSBuZXdBcmNoaXZlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzE5LzAxIDM6MzQ6NDUgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0NhdWdodEV4Y2VwdGlvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F1Z2h0RXhjZXB0aW9ucyhqYXZhLnV0aWwuTGlzdCBuZXdDYXVnaHRFeGNlcHRpb25zKSB7Ci0JCWNhdWdodEV4Y2VwdGlvbnMgPSBuZXdDYXVnaHRFeGNlcHRpb25zOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzU3YjQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBub24tcnVudGltZSBleGNlcHRpb25zIG9jY3VycmluZyB3aXRoIG1hbmlwdWxhdGlvbiBvZiBhcmNoaXZlcwotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDM0MDE0NTQ2NTk1NjUwNTU3MEw7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFyY2hpdmVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBcmNoaXZlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVSdW50aW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYjFhNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5JV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5XcmFwcGVkUnVudGltZUV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogQmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIHJ1bnRpbWUgZXhjZXB0aW9ucyBvY2N1cnJpbmcgd2l0aCBtYW5pcHVsYXRpb24gb2YgYXJjaGl2ZXM7IHRoZXJlIGFyZQotICogc29tZSBzaXR1YXRpb25zIHdoZXJlIHdlIGNhbiBvbmx5IHRocm93IGEgcnVudGltZSBleGNlcHRpb24gaW5zdGVhZCBvZiBhIHN1YnR5cGUgb2YgZXhjZXB0aW9uLAotICogYmVjYXVzZSB0aGUgc2lnbmF0dXJlcyBvZiBldG9vbHMgZ2VuZXJhdGVkIG1ldGhvZHMgY2Fubm90IGJlIG92ZXJyaWRkZW4gdG8gdGhyb3cgYW55IGV4Y2VwdGlvbgotICogb3RoZXIgdGhhbiBydW50aW1lLgotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIElXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDcyNzYwMzIxNTA1MjE4Njk1OEw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24uCi0JICovCi0JcHVibGljIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5NmNiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldyYXBwZWRFeGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBub24tcnVudGltZSBleGNlcHRpb25zIG9jY3VycmluZyB3aXRoIG1hbmlwdWxhdGlvbiBvZiBhcmNoaXZlcywgd2hlcmUgYQotICogY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGhpcyBleGNlcHRpb24gdG8gYmUgdGhyb3duCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRFeGNlcHRpb24gaW1wbGVtZW50cyBJV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzAxMTY1NTE2NjAzNzMwMDU0Nkw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uCi0JICovCi0JcHVibGljIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0RlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0RlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2I4ZTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogRXhjZXB0aW9uIHdoaWNoIGNhbiBvY2N1ciBpZiBhbiBlcnJvci9leGNlcHRpb24gb2NjdXJzIHdoaWxlIGxvYWRpbmcgYSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAqLwotcHVibGljIGNsYXNzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzg3MDMxNDQ4MTE0ODg3MTY2NUw7Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUxvYWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUxvYWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4YmU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEV4Y2VwdGlvbiB3aGljaCBjYW4gb2NjdXIgd2hlbiBhbiBhdHRlbXAgaXMgbWFkZSB0byBhZGQgdG8gYSBsaXN0IGFuIG9iamVjdCBlcXVhbGluZywgb3IgaGF2aW5nCi0gKiB0aGUgc2FtZSBuYW1lLCBpZCwgZXRjLCBhcyBhbm90aGVyIG9iamVjdCBpbiB0aGUgbGlzdC4KLSAqLwotcHVibGljIGNsYXNzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcyNjkxMzk1MTg5NTc4MjYxMzBMOwotCXByb3RlY3RlZCBPYmplY3QgZHVwbGljYXRlOwotCi0JLyoqCi0JICogRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKFN0cmluZyBzLCBPYmplY3QgbykgewotCQlzdXBlcihzKTsKLQkJc2V0RHVwbGljYXRlKG8pOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA0LzE2LzAxIDk6NDM6MDAgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RHVwbGljYXRlKCkgewotCQlyZXR1cm4gZHVwbGljYXRlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA0LzE2LzAxIDk6NDM6MDAgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld0R1cGxpY2F0ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldER1cGxpY2F0ZShqYXZhLmxhbmcuT2JqZWN0IG5ld0R1cGxpY2F0ZSkgewotCQlkdXBsaWNhdGUgPSBuZXdEdXBsaWNhdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0VtcHR5UmVzb3VyY2VFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9FbXB0eVJlc291cmNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMzlmODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0VtcHR5UmVzb3VyY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogRXhjZXB0aW9uIHdoaWNoIG9jY3VycyB3aGVuIGEgbW9mIHJlc291cmNlJ3MgZXh0ZW50IGNvbnRhaW5zIHplcm8gZWxlbWVudHMgYW5kIGFuIGF0dGVtcHQgaXMgbWFkZQotICogdG8gYWNjZXNzIGFuIGVsZW1lbXQgZnJvbSB0aGUgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbXB0eVJlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY0ODIzOTMzMDQyODAxNjA1ODVMOwotCi0JLyoqCi0JICogRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFbXB0eVJlc291cmNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBFbXB0eVJlc291cmNlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9JQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9JQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5NzI0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vSUFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklXcmFwcGVkRXhjZXB0aW9uOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmV4Y2VwdGlvbi5JV3JhcHBlZEV4Y2VwdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiBleHRlbmRzIElXcmFwcGVkRXhjZXB0aW9uIHsKLQkvL0RlZmF1bHQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9NYW5pZmVzdEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL01hbmlmZXN0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZmUyMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL01hbmlmZXN0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIE1hbmlmZXN0RXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTA0NTE0MDg5OTA3ODE5MjAxOUw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFuaWZlc3RFeGNlcHRpb24uCi0JICovCi0JcHVibGljIE1hbmlmZXN0RXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYW5pZmVzdEV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBNYW5pZmVzdEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFuaWZlc3RFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgTWFuaWZlc3RFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hbmlmZXN0RXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgTWFuaWZlc3RFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05lc3RlZEphckV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05lc3RlZEphckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODI4ZjU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9OZXN0ZWRKYXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogUnVudGltZSBleGNlcHRpb24gdGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHJlYWRpbmcgYSBqYXIgd2l0aGluIGEgamFyCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRKYXJFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTU5OTU0NzIzMjQyNjQ2MzgxTDsKLQotCXB1YmxpYyBOZXN0ZWRKYXJFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5lc3RlZEphckV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGVkSmFyRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGVkSmFyRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5NzNlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm9FSkIxMERlc2NyaXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNS8wMSA3OjMxOjI3IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBOb0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MjIyMjkwODg2MzMzMTc5MjIzTDsKLQotCS8qKgotCSAqIE5vRUpCMTBEZXNjcmlwdG9yc0V4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOb0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm9FSkIxMERlc2NyaXB0b3JzRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm9FSkIxMERlc2NyaXB0b3JzRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob01vZHVsZUVsZW1lbnRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob01vZHVsZUVsZW1lbnRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiYzdlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm9Nb2R1bGVFbGVtZW50RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIE5vIExvbmdlciB1c2VkOyBjaGVjayBmb3IgbnVsbCBpbnN0ZWFkIEV4Y2VwdGlvbiB3aGljaCBvY2N1cnMgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlCi0gKiAgICAgICAgICAgICB0byBhY2Nlc3MgYSBub24tZXhpc3RlbnQgbW9kdWxlIGRkIGVsZW1lbnQgZnJvbSBhbiBlYXIgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgTm9Nb2R1bGVFbGVtZW50RXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzc4MTgxMzM1MTE2MDIyMjc3NEw7Ci0KLQkvKioKLQkgKiBOb01vZHVsZUVsZW1lbnRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTm9Nb2R1bGVFbGVtZW50RXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vTW9kdWxlRWxlbWVudEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vTW9kdWxlRWxlbWVudEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjQzNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vTW9kdWxlRmlsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBOb01vZHVsZUZpbGVFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzI2MTA4NDY0NjE0NzM2Mjc3Nkw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBOb01vZHVsZUZpbGVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBOb01vZHVsZUZpbGVFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBOb01vZHVsZUZpbGVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODk3NDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vdEFEZXBsb3ltZW50RGVzY3JpcHRvckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMDYvMDEgOToyNjo0MyBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTA3MjI1MjQxNzM0MzkxMDk2M0w7Ci0KLQkvKioKLQkgKiBOb3RBRGVwbG95bWVudERlc2NyaXB0b3JFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdEFEZXBsb3ltZW50RGVzY3JpcHRvckV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vdEFEZXBsb3ltZW50RGVzY3JpcHRvckV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNWQxM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjY5MDYzMTYzMTU5MzEwMTM4Mkw7Ci0KLQkvKioKLQkgKiBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL09iamVjdE5vdEZvdW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjY2YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL09iamVjdE5vdEZvdW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8wOC8wMSA4OjMzOjUxIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM1MzkzMTc3NjI1MTA0ODU2OTlMOwotCi0JLyoqCi0JICogT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vT3BlbkZhaWx1cmVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9PcGVuRmFpbHVyZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzhkNGE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9PcGVuRmFpbHVyZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBFeGNlcHRpb24gd2hpY2ggb2NjdXJzIHdoaWxlIG9wZW5pbmcgYW4gYXJjaGl2ZTsgY291bGQgb2NjdXIgZm9yIGEgdmFyaWV0eSBvZiByZWFzb25zLCBlZywgaW8KLSAqIGZhaWx1cmUsIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlcnJvcnMsIGV0Yy4gQ2hlY2sgdGhlIG5lc3RlZCBleGNlcHRpb24gZm9yIG1vcmUgaW5mby4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNzg2OTI0MTU2MDUxMDkxMzQwTDsKLQotCS8qKgotCSAqIE9wZW5GYWlsdXJlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9wZW5GYWlsdXJlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE9wZW5GYWlsdXJlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgT3BlbkZhaWx1cmVFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbkZhaWx1cmVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuRmFpbHVyZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgT3BlbkZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9SZW9wZW5FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9SZW9wZW5FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0NzlkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vUmVvcGVuRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEV4Y2VwdGlvbiB3aGljaCBjYW4gYmUgdGhyb3duIGFzIGEgcmVzdWx0IG9mIGFuIElPIGV4Y2VwdGlvbiB3aGljaCBtYXkgb2NjdXIgd2hpbGUgInJlLXN5bmNpbmciCi0gKiBhbiBhcmNoaXZlIGFmdGVyIGl0IGhhcyBiZWVuIHNhdmVkLiBGb3IgZXhhbXBsZSwgaWYgMTAgZmlsZXMgYXJlIGNvcGllZCBmcm9tIEFyY2hpdmUgQSB0byBBcmNoaXZlCi0gKiBCLCB0aGVuIGFyY2hpdmUgYiBpcyBzYXZlZCwgaXRzIGNvbnRlbnRzIHdpbGwgYmUgbG9hZGVkIGZyb20gYSBuZXcgc291cmNlLCB0aGUgbmV3bHkgc2F2ZWQgamFyCi0gKiBmaWxlLiBUaGVyZWZvcmUsIHRoZSBhcmNoaXZlIHdpbGwgYmUgcmVvcGVuZWQgYWZ0ZXIgc2F2aW5nLCB3aGljaCBjb3VsZCByZXN1bHQgaW4gYW4gSU9FeGNlcHRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW9wZW5FeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI3OTc1OTU3MjE4NDIzMzYzNjBMOwotCi0JLyoqCi0JICogUmVvcGVuRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlb3BlbkV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW9wZW5FeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBSZW9wZW5FeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogUmVvcGVuRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgUmVvcGVuRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIFJlb3BlbkV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgUmVvcGVuRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vUmVzb3VyY2VMb2FkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vUmVzb3VyY2VMb2FkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NGM4MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1Jlc291cmNlTG9hZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBFeGNlcHRpb24gdGhyb3duIGlmIGluIGV4Y2VwdGlvbiBvdGhlciB0aGFuIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlzIGNhdWdodCB3aGlsZQotICogYXR0ZW1wdGluZyB0byBsb2FkIGEgbW9mIHJlc291cmNlLgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMzM3MjI1NDg5MTAyNjM1MzM5TDsKLQotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvYWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2FkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFJlc291cmNlTG9hZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUxvYWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFJlc291cmNlTG9hZEV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1NhdmVGYWlsdXJlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vU2F2ZUZhaWx1cmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiZDU1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vU2F2ZUZhaWx1cmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogRXhjZXB0aW9uIHdoaWNoIG9jY3VycyB3aGlsZSBzYXZpbmcgYW4gYXJjaGl2ZTsgY291bGQgb2NjdXIgZm9yIGEgdmFyaWV0eSBvZiByZWFzb25zLCBlZywgaW8KLSAqIGZhaWx1cmUsIGV0Yy4gQ2hlY2sgdGhlIG5lc3RlZCBleGNlcHRpb24gZm9yIG1vcmUgaW5mby4KLSAqLwotcHVibGljIGNsYXNzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg1OTMyNTMzMzk4NDc2NTAyNDZMOwotCi0JLyoqCi0JICogU2F2ZUZhaWx1cmVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2F2ZUZhaWx1cmVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZUZhaWx1cmVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlRmFpbHVyZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFNhdmVGYWlsdXJlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsdXJlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU2F2ZUZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9TdWJjbGFzc1Jlc3BvbnNpYmlsaXR5RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vU3ViY2xhc3NSZXNwb25zaWJpbGl0eUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzFlZjZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9TdWJjbGFzc1Jlc3BvbnNpYmlsaXR5RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLQotLyoqCi0gKiBSdW50aW1lIGV4Y2VwdGlvbiB1c2VkIGFzIGEgd2F5IHRvIGVuZm9yY2UgYWJzdHJhY3QgYmVoYXZpb3Igd2l0aG91dCBkZWNsYXJpbmcgdGhlIG1ldGhvZHMKLSAqIGFic3RyYWN0LiBOZWNlc3NhcnkgYmVjYXVzZSBpbXBsIGNsYXNzZXMgaW4gdGhlIGV0b29scyBnZW5lcmF0ZWQgaGllcmFyY2h5IGNhbm5vdCBiZSBhYnN0cmFjdCBpZgotICogdGhleSBoYXZlIHN1YnR5cGVzLgotICovCi1wdWJsaWMgY2xhc3MgU3ViY2xhc3NSZXNwb25zaWJpbGl0eUV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjgxNTY3MzY3MTc3NTU2NDM1NEw7Ci0KLQkvKioKLQkgKiBTdWJjbGFzc1Jlc3BvbnNpYmlsaXR5RXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN1YmNsYXNzUmVzcG9uc2liaWxpdHlFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NSZXNwb25zaWJpbGl0eUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN1YmNsYXNzUmVzcG9uc2liaWxpdHlFeGNlcHRpb24oU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJc3VwZXIoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5zdWJjbGFzc19yZXNwb25zaWJpbHR5X0VYQ18sIChuZXcgT2JqZWN0W117bWV0aG9kTmFtZX0pKSk7IC8vID0gIiBtdXN0IGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzIgotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9VbmNvbnRhaW5lZE1vZHVsZUZpbGVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9VbmNvbnRhaW5lZE1vZHVsZUZpbGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZDgyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vVW5jb250YWluZWRNb2R1bGVGaWxlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgRXhjZXB0aW9uIG5vIGxvbmdlciB0aHJvd247IGNoZWNrIGZvciBudWxsIGluc3RlYWQuIEV4Y2VwdGlvbiB3aGljaCBtYXkgYmUgdGhyb3duCi0gKiAgICAgICAgICAgICB3aGVuZXZlciBhIHtAbGluayBNb2R1bGVGaWxlfWlzIGV4cGVjdGVkIHRvIGJlIGNvbnRhaW5lZCB3aXRoaW4gYW4gZWFyIGZpbGUgYnV0IGl0Ci0gKiAgICAgICAgICAgICBpcyBub3QKLSAqLwotcHVibGljIGNsYXNzIFVuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MzExNzc1NzQ2NTQ5NzE4MTkwTDsKLQotCS8qKgotCSAqIFVuY29udGFpbmVkTW9kdWxlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmNvbnRhaW5lZE1vZHVsZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFVuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQxOGVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotCi0KLQotLyoqCi0gKiBUaGlzIGlzIGEgY2F0YWxvZyBvZiB1c2VmdWwgY29uc3RhbnRzIGZvciB0aGUgYXJjaGl2ZSBzdXBwb3J0LiBDYW4gYmUgdXNlZCB0byBzdG9yZSByZWxhdGl2ZQotICogcGF0aHMgdG8gc3BlY2lmaWMgeG1sIGFuZCB4bWkgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyY2hpdmVDb25zdGFudHMgZXh0ZW5kcyBKMkVFQ29uc3RhbnRzIHsKLQkvL1N0YW5kYXJkIEphciBpbmZvCi0JLyoqICJjb20iICovCi0JU3RyaW5nIFJBUl9DTEFTU0VTX1VSSSA9ICJjb20iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZWxhdGl2ZSBwYXRoIGluIGEgd2FyIGZpbGUgd2l0aCBubyBsZWFkaW5nIHNsYXNoICJXRUItSU5GL2xpYi8iCi0JICovCi0JU3RyaW5nIFdFQkFQUF9MSUJfVVJJID0gIldFQi1JTkYvbGliLyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlbGF0aXZlIHBhdGggaW4gYSB3YXIgZmlsZSB3aXRoIG5vIGxlYWRpbmcgc2xhc2ggIldFQi1JTkYvY2xhc3Nlcy8iCi0JICovCi0JU3RyaW5nIFdFQkFQUF9DTEFTU0VTX1VSSSA9ICJXRUItSU5GL2NsYXNzZXMvIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlSW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlSW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGE0ZDQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZUluaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci0KLQotLyoqCi0gKiBJbml0aWFsaXplciBjbGFzcyB0byBwcmVyZWdpc3RlciBwYWNrYWdlcwotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUluaXQgewotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBwbHVnaW5faW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgewotCQlpbml0KHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KGJvb2xlYW4gc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcykgewotCQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQlpbnZva2VQcmVyZXFJbml0cyhzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKTsKLQkJCWlmIChzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKQotCQkJCXByZVJlZ2lzdGVyUGFja2FnZXMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlUmVnaXN0ZXJQYWNrYWdlcygpIHsKLQkJLy9Db21tb25hcmNoaXZlUGFja2FnZSByZWcKLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJjb21tb25hcmNoaXZlLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJCQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCQkJCX0KLQkJCQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQkJCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJCQkJcmV0dXJuIExvb3NlY29uZmlnUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQkJCQl9Ci0JCQkJCQlwdWJsaWMgRUZhY3RvcnkgZ2V0RUZhY3RvcnkoKSB7Ci0JCQkJCQkJcmV0dXJuIExvb3NlY29uZmlnRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnZva2VQcmVyZXFJbml0cyhib29sZWFuIHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpIHsKLQkJSjJFRUluaXQuaW5pdChzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlTWFuaWZlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0ZDM1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBBUEkgb2YKLSAqIAotICogQGxpbmsgamF2YS51dGlsLmphci5NYW5pZmVzdCwgYWxvbmcgd2l0aCBhZGRlZCBoZWxwZXJzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJjaGl2ZU1hbmlmZXN0IHsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1hbmlmZXN0IGVudHJ5IChhdHRyaWJ1dGVzKSBmb3IgdGhlIGdpdmVuIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZW50cnlOYW1lKTsKLQotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBlbnRyeU5hbWUsIEF0dHJpYnV0ZXMgYXR0cik7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBrZXkvdmFsdWUgcGFpciB0byB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGVudHJ5IG5hbWU7IGlmIHRoZSBlbnRyeSBkb2VzIG5vdAotCSAqIGV4aXN0LCBjcmVhdGVzIGEgbmV3IGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogRGVmYXVsdHMgdGhlIHZlcnNpb24gdG8gIjEuMCIgaWYgbm90IGFscmVhZHkgc2V0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkVmVyc2lvbklmTmVjZXNzYXJ5KCk7Ci0KLQlwdWJsaWMgdm9pZCBhcHBlbmRDbGFzc1BhdGgoU3RyaW5nIGV4dGVuc2lvbik7Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjY2xlYXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I2dldEF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NQYXRoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjZ2V0RW50cmllcwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0RW50cmllcygpOwotCi0JcHVibGljIFN0cmluZyBnZXRFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNnZXRBdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZXMgZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIGlmZiB0aGUgZW50cnkgZXhpc3RzIGluIGEgY2FzZS1zZW5zaXRpdmUgbWFubmVyOyBtYW5pZmVzdCB2ZXJzaW9uIGlzCi0JICogcmVxdWlyZWQgZm9yIHRoZSBtYW5pZmVzdCB0byBzYXZlIGNvcnJlY3RseQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFuaWZlc3RWZXJzaW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBpZmYgdGhlIGVudHJ5IGV4aXN0cyBpbiBhIGNhc2Utc2Vuc2l0aXZlIG1hbm5lcjsgaW1wbGVtZW50YXRpb24gdmVyc2lvbiBpcwotCSAqIG9wdGlvbmFsIGluICB0aGUgbWFuaWZlc3QKLQkgKiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbnRyaWVzIG5vdCBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgY2xhc3MgcGF0aCBvZiB0aGlzIG1hbmlmZXN0Ci0JICovCi0JcHVibGljIHZvaWQgbWVyZ2VDbGFzc1BhdGgoU3RyaW5nW10gY2xhc3NQYXRoRW50cmllcyk7Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjcmVhZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWQoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5KFN0cmluZyBlbnRyeU5hbWUpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50cnlBdHRyaWJ1dGUoU3RyaW5nIGVudHJ5TmFtZSwgT2JqZWN0IGtleSk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc1BhdGgoU3RyaW5nIGFTcGFjZURlbGltaXRlZFBhdGgpOwotCi0JcHVibGljIHZvaWQgc2V0TWFpbkNsYXNzKFN0cmluZyBjbGFzc05hbWUpOwotCi0JcHVibGljIHZvaWQgc2V0TWFuaWZlc3RWZXJzaW9uKGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbik7Ci0JCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW5hdGlvblZlcnNpb24oamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCN3cml0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgTWFuaWZlc3QgdG8gdGhlIHNwZWNpZmllZCBPdXRwdXRTdHJlYW0sIHNwbGl0dGluZyBlYWNoIGNsYXNzcGF0aCBlbnRyeSBvbiBhIGxpbmUKLQkgKiBieSBpdHNlbGYuCi0JICogCi0JICogQHBhcmFtIG91dAotCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBzdHJlYW0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIGhhcyBvY2N1cnJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlU3BsaXR0aW5nQ2xhc3NwYXRoKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU1hbmlmZXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlTWFuaWZlc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMjFiM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlTWFuaWZlc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBtYW5pZmVzdCBmaWxlcwotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZU1hbmlmZXN0SW1wbCBleHRlbmRzIGphdmEudXRpbC5qYXIuTWFuaWZlc3QgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdCB7Ci0JLyoqCi0JICogQXJjaGl2ZU1hbmlmZXN0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQXJjaGl2ZU1hbmlmZXN0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlzCi0JICogICAgICAgICAgICBqYXZhLmlvLklucHV0U3RyZWFtCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0SW1wbChqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZWFkKGlzKTsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0JCQlJT0V4Y2VwdGlvbiBpb2UgPSBuZXcgSU9FeGNlcHRpb24oZS50b1N0cmluZygpKTsKLQkJCWlvZS5pbml0Q2F1c2UoZSk7Ci0JCQl0aHJvdyBpb2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcmNoaXZlTWFuaWZlc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuamFyLk1hbmlmZXN0Ci0JICovCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdEltcGwoamF2YS51dGlsLmphci5NYW5pZmVzdCBtYW4pIHsKLQkJc3VwZXIobWFuKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1hbmlmZXN0IGVudHJ5IChhdHRyaWJ1dGVzKSBmb3IgdGhlIGdpdmVuIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0ciA9IG5ldyBBdHRyaWJ1dGVzKCk7Ci0JCWFkZEVudHJ5KGVudHJ5TmFtZSwgYXR0cik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIGVudHJ5TmFtZSwgQXR0cmlidXRlcyBhdHRyKSB7Ci0JCWdldEVudHJpZXMoKS5wdXQoZW50cnlOYW1lLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBrZXkvdmFsdWUgcGFpciB0byB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGVudHJ5IG5hbWU7IGlmIHRoZSBlbnRyeSBkb2VzIG5vdAotCSAqIGV4aXN0LCBjcmVhdGVzIGEgbmV3IGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJQXR0cmlidXRlcyBhdHRyID0gZ2V0QXR0cmlidXRlcyhlbnRyeU5hbWUpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJYWRkRW50cnkoZW50cnlOYW1lKTsKLQkJYXR0ciA9IGdldEF0dHJpYnV0ZXMoZW50cnlOYW1lKTsKLQkJYXR0ci5wdXRWYWx1ZShrZXksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRWZXJzaW9uSWZOZWNlc3NhcnkoKSB7Ci0JCS8vVGhpcyBpcyBhIGhhY2sgYmVjYXVzZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBtYW5pZmVzdCBkb2VzIG5vdCBzZXJpYWxpemUgY29ycmVjdGx5IGlmCi0JCS8vVGhlIHZlcnNpb24gaXMgbm90IHNldC4gSW4gYWRkaXRpb24gdG8gc2F2ZXMsIHRoZSBzZXJpYWxpemF0aW9uIGlzIHVzZWQgZm9yIGNvcHkKLQkJaWYgKGdldE1hbmlmZXN0VmVyc2lvbigpID09IG51bGwgfHwgZ2V0TWFuaWZlc3RWZXJzaW9uKCkuZXF1YWxzKCIiKSkvLyROT04tTkxTLTEkCi0JCQlzZXRNYW5pZmVzdFZlcnNpb24oIjEuMCIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kQ2xhc3NQYXRoKGphdmEubGFuZy5TdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCVN0cmluZyBjbGFzc1BhdGggPSBnZXRDbGFzc1BhdGgoKTsKLQkJaWYgKGNsYXNzUGF0aCAhPSBudWxsKQotCQkJc2V0Q2xhc3NQYXRoKGNsYXNzUGF0aCArICIgIiArIGV4dGVuc2lvbik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlzZXRDbGFzc1BhdGgoZXh0ZW5zaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2xhc3NQYXRoKCkgewotCQlyZXR1cm4gQXJjaGl2ZVV0aWwuZ2V0VmFsdWVJZ25vcmVLZXlDYXNlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRILnRvU3RyaW5nKCksIGdldE1haW5BdHRyaWJ1dGVzKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldENsYXNzUGF0aFRva2VuaXplZCgpIHsKLQkJU3RyaW5nIGNsYXNzUGF0aCA9IGdldENsYXNzUGF0aCgpOwotCQlpZiAoY2xhc3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuZ2V0VG9rZW5zKGNsYXNzUGF0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBTdHJpbmcga2V5KSB7Ci0JCUF0dHJpYnV0ZXMgYXR0ciA9IGdldEF0dHJpYnV0ZXMoZW50cnlOYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZShrZXkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkNsYXNzKCkgewotCQlyZXR1cm4gQXJjaGl2ZVV0aWwuZ2V0VmFsdWVJZ25vcmVLZXlDYXNlKEF0dHJpYnV0ZXMuTmFtZS5NQUlOX0NMQVNTLnRvU3RyaW5nKCksIGdldE1haW5BdHRyaWJ1dGVzKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFuaWZlc3RWZXJzaW9uKCkgewotCQlyZXR1cm4gZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuTUFOSUZFU1RfVkVSU0lPTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIG1lcmdlQ2xhc3NQYXRoKGphdmEubGFuZy5TdHJpbmdbXSBjbGFzc1BhdGhFbnRyaWVzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJamF2YS51dGlsLkxpc3QgZXhpc3RpbmcgPSBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChnZXRDbGFzc1BhdGhUb2tlbml6ZWQoKSk7Ci0JCVN0cmluZyBjcCA9IGdldENsYXNzUGF0aCgpOwotCQlpZiAoY3AgIT0gbnVsbCkKLQkJCXNiLmFwcGVuZChjcCk7Ci0JCWJvb2xlYW4gZW1wdHkgPSBjcCA9PSBudWxsIHx8ICIiLmVxdWFscyhjcCk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc1BhdGhFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWV4aXN0aW5nLmNvbnRhaW5zKGNsYXNzUGF0aEVudHJpZXNbaV0pKSB7Ci0JCQkJaWYgKCFlbXB0eSkKLQkJCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlCi0JCQkJCWVtcHR5ID0gZmFsc2U7Ci0JCQkJc2IuYXBwZW5kKGNsYXNzUGF0aEVudHJpZXNbaV0pOwotCQkJfQotCQl9Ci0JCXNldENsYXNzUGF0aChzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeShTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCWdldEVudHJpZXMoKS5yZW1vdmUoZW50cnlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBPYmplY3Qga2V5KSB7Ci0JCUF0dHJpYnV0ZXMgYXR0ciA9IGdldEF0dHJpYnV0ZXMoZW50cnlOYW1lKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHIucmVtb3ZlKGtleSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzUGF0aChqYXZhLmxhbmcuU3RyaW5nIGFTcGFjZURlbGltaXRlZFBhdGgpIHsKLQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJaWYgKGFTcGFjZURlbGltaXRlZFBhdGggPT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucmVtb3ZlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRIKTsKLQkJZWxzZQotCQkJYXR0cmlidXRlcy5wdXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuQ0xBU1NfUEFUSC50b1N0cmluZygpLCBhU3BhY2VEZWxpbWl0ZWRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWFpbkNsYXNzKGphdmEubGFuZy5TdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucmVtb3ZlKEF0dHJpYnV0ZXMuTmFtZS5NQUlOX0NMQVNTKTsKLQkJZWxzZQotCQkJYXR0cmlidXRlcy5wdXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuTUFJTl9DTEFTUy50b1N0cmluZygpLCBjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdFZlcnNpb24oamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCWF0dHJpYnV0ZXMucHV0VmFsdWUoQXR0cmlidXRlcy5OYW1lLk1BTklGRVNUX1ZFUlNJT04udG9TdHJpbmcoKSwgdmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBNYW5pZmVzdCB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbSwgc3BsaXR0aW5nIGVhY2ggY2xhc3NwYXRoIGVudHJ5IG9uIGEgbGluZQotCSAqIGJ5IGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGVTcGxpdHRpbmdDbGFzc3BhdGgoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXQpOwotCQkvLyBXcml0ZSBvdXQgdGhlIG1haW4gYXR0cmlidXRlcyBmb3IgdGhlIG1hbmlmZXN0Ci0JCXdyaXRlTWFpblNwbGl0dGluZ0NsYXNzcGF0aChnZXRNYWluQXR0cmlidXRlcygpLCBkb3MpOwotCQkvLyBOb3cgd3JpdGUgb3V0IHRoZSBwcmUtZW50cnkgYXR0cmlidXRlcwotCQlJdGVyYXRvciBpdCA9IGdldEVudHJpZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKChTdHJpbmcpIGUuZ2V0S2V5KCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlsb2NhbE1ha2U3MlNhZmUoYnVmZmVyKTsKLQkJCWRvcy53cml0ZUJ5dGVzKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCXdyaXRlKChBdHRyaWJ1dGVzKSBlLmdldFZhbHVlKCksIGRvcyk7Ci0JCX0KLQkJZG9zLmZsdXNoKCk7Ci0JfQotCi0JLyoKLQkgKiBXcml0ZXMgdGhlIGN1cnJlbnQgYXR0cmlidXRlcyB0byB0aGUgc3BlY2lmaWVkIGRhdGEgb3V0cHV0IHN0cmVhbS4gWFhYIE5lZWQgdG8gaGFuZGxlIFVURjgKLQkgKiB2YWx1ZXMgYW5kIGJyZWFrIHVwIGxpbmVzIGxvbmdlciB0aGFuIDcyIGJ5dGVzCi0JICogCi0JICogQHNlZSBBdHRyaWJ1dGVzI3dyaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBEYXRhT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCgoQXR0cmlidXRlcy5OYW1lKSBlLmdldEtleSgpKS50b1N0cmluZygpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQodG9VdGY4KChTdHJpbmcpIGUuZ2V0VmFsdWUoKSkpOwotCQkJYnVmZmVyLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlsb2NhbE1ha2U3MlNhZmUoYnVmZmVyKTsKLQkJCW9zLndyaXRlQnl0ZXMoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JCW9zLndyaXRlQnl0ZXMoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogV3JpdGVzIHRoZSBjdXJyZW50IGF0dHJpYnV0ZXMgdG8gdGhlIHNwZWNpZmllZCBkYXRhIG91dHB1dCBzdHJlYW0sIG1ha2Ugc3VyZSB0byB3cml0ZSBvdXQgdGhlCi0JICogTUFOSUZFU1RfVkVSU0lPTiBvciBTSUdOQVRVUkVfVkVSU0lPTiBhdHRyaWJ1dGVzIGZpcnN0LgotCSAqIAotCSAqIEBzZWUgQXR0cmlidXRlcyN3cml0ZU1haW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZU1haW5TcGxpdHRpbmdDbGFzc3BhdGgoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBEYXRhT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gd3JpdGUgb3V0IHRoZSAqLVZlcnNpb24gaGVhZGVyIGZpcnN0LCBpZiBpdCBleGlzdHMKLQkJU3RyaW5nIHZlcm5hbWUgPSBBdHRyaWJ1dGVzLk5hbWUuTUFOSUZFU1RfVkVSU0lPTi50b1N0cmluZygpOwotCQlTdHJpbmcgdmVyc2lvbiA9IHRvVXRmOChhdHRyaWJ1dGVzLmdldFZhbHVlKHZlcm5hbWUpKTsKLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJdmVybmFtZSA9IEF0dHJpYnV0ZXMuTmFtZS5TSUdOQVRVUkVfVkVSU0lPTi50b1N0cmluZygpOwotCQkJdmVyc2lvbiA9IHRvVXRmOChhdHRyaWJ1dGVzLmdldFZhbHVlKHZlcm5hbWUpKTsKLQkJfQotCi0JCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKLQkJCW91dC53cml0ZUJ5dGVzKHZlcm5hbWUgKyAiOiAiICsgdmVyc2lvbiArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJLy8gd3JpdGUgb3V0IGFsbCBhdHRyaWJ1dGVzIGV4Y2VwdCBmb3IgdGhlIHZlcnNpb24KLQkJLy8gd2Ugd3JvdGUgb3V0IGVhcmxpZXIKLQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoQXR0cmlidXRlcy5OYW1lKSBlLmdldEtleSgpKS50b1N0cmluZygpOwotCQkJaWYgKCh2ZXJzaW9uICE9IG51bGwpICYmICEobmFtZS5lcXVhbHNJZ25vcmVDYXNlKHZlcm5hbWUpKSkgewotCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgudG9TdHJpbmcoKSkpIHsKLQkJCQkJd3JpdGVTcGxpdChvdXQsIG5hbWUsIHRvVXRmOCgoU3RyaW5nKSBlLmdldFZhbHVlKCkpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKHRvVXRmOCgoU3RyaW5nKSBlLmdldFZhbHVlKCkpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlsb2NhbE1ha2U3MlNhZmUoYnVmZmVyKTsKLQkJCQlvdXQud3JpdGVCeXRlcyhidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJb3V0LndyaXRlQnl0ZXMoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdyaXRlU3BsaXQoRGF0YU91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlKTsKLQkJaW50IGluYyA9IDA7Ci0JCXdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJCWlmIChpbmMgPT0gMCkgewotCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZCh0b2submV4dFRva2VuKCkpOwotCQkJaWYgKHRvay5jb3VudFRva2VucygpID4gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCIgXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYnVmZmVyLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlsb2NhbE1ha2U3MlNhZmUoYnVmZmVyKTsKLQkJCW91dC53cml0ZUJ5dGVzKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCWluYysrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaW5lIGJyZWFrcyB0byBlbmZvcmNlIGEgbWF4aW11bSA3MiBieXRlcyBwZXIgbGluZS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9jYWxNYWtlNzJTYWZlKFN0cmluZ0J1ZmZlciBsaW5lKSB7Ci0JCWludCBsZW5ndGggPSBsaW5lLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID4gNzIpIHsKLQkJCWludCBpbmRleCA9IDcwOwotCQkJLy8gYnVnIDIzMzgwMSAtIHdlIGFyZSBzcGxpdHRpbmcgZXZlcnkgNzIgYnl0ZXMsIGJ1dCBhZGRpbmcgdHdvIGJ5dGVzIHRvIHRoZSBlbmQgb2YsIAotCQkJLy8gYW5kIG9uZSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGxpbmUgYWZ0ZXIgdGhlIGZpcnN0Ci0JCQl3aGlsZSAoaW5kZXggLSAxIDwgbGVuZ3RoKSB7Ci0JCQkJaWYgKGxpbmUuY2hhckF0KGluZGV4KSA9PSAnICcpCi0JCQkJewotCQkJCQlpbmRleC0tOwotCQkJCX0KLQkJCQlsaW5lLmluc2VydChpbmRleCwgIlxyXG4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRleCArPSA3MjsKLQkJCQlsZW5ndGggKz0gMzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKSB7Ci0JCXJldHVybiBnZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbmF0aW9uVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBnZXRNYWluQXR0cmlidXRlcygpOwotCQlhdHRyaWJ1dGVzLnB1dFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OLnRvU3RyaW5nKCksIHZlcnNpb24pOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBFbmNvZGVzIGEgZG91YmxlLWJ5dGUgc3RyaW5nIGludG8gVVRGOCBmb3JtLiBFdmVyeSBjaGFyYWN0ZXIgaW4gdGhlCi0gICAgICogcmV0dXJuZWQgc3RyaW5nIHJlcHJlc2VudHMgb25lIGJ5dGUgb2YgdGhlIFVURjggZW5jb2RpbmcuIAotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHRvVXRmOCggZmluYWwgU3RyaW5nIHN0ciApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIHN0ciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBieXRlW10gdXRmOCA9IHN0ci5nZXRCeXRlcyggIlVURi04IiApOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIHV0ZjgsIDAsIDAsIHV0ZjgubGVuZ3RoICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU9wdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhZmRmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzAyLzAxIDI6NTg6NDggUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVPcHRpb25zIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNBWCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9NID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUID0gMzsKLQotCXByaXZhdGUgaW50IHJlbmRlcmVyVHlwZSA9IERFRkFVTFQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FEX01PREVfQ09NUEFUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FEX01PREVfU1BFQyA9IDE7Ci0KLQlwcml2YXRlIGludCBjbGFzc0xvYWRpbmdNb2RlID0gTE9BRF9NT0RFX0NPTVBBVDsKLQotCQotCS8qKgotCSAqIExvYWQgc3RyYXRlZ3kgZm9yIG9wZW5pbmcvcmVhZGluZyB0aGUgYXJjaGl2ZTsgb3B0aW9uYWwgLSBpZiBudWxsIGEgbG9hZCBzdHJhdGVneSB3aWxsIGJlCi0JICogY3JlYXRlZCB3aGVuIHRoZSBhcmNoaXZlIGlzIG9wZW5lZAotCSAqLwotCXByaXZhdGUgTG9hZFN0cmF0ZWd5IGxvYWRTdHJhdGVneTsKLQkvKioKLQkgKiBJbmRpY2F0b3IgZm9yIHdoZXRoZXIgYXV0byBqYXZhIHJlZmxlY3Rpb24gc2hvdWxkIGJlIHR1cm5lZCBvbiBpbiB0aGUgYXJjaGl2ZSAtIGRlZmF1bHRzIHRvCi0JICogdHJ1ZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB1c2VKYXZhUmVmbGVjdGlvbiA9IHRydWU7Ci0JLyoqCi0JICogSW5kaWNhdG9yIGZvciB3aGV0aGVyIHRoZSBhcmNoaXZlIHdpbGwgYmUgbW9kaWZpZWQgYWZ0ZXIgb3BlbmluZyBvciBpZiBpdCBpcyBqdXN0IGJlaW5nCi0JICogb3BlbmVkLCByZWFkLCBzYXZlZCB0byBhIG5ldyBsb2NhdGlvbjsgdGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdGVtcCBmaWxlIGNyZWF0aW9uCi0JICogYW5kIHNhdmluZyBvZiBpbmRpdmlkdWFsIGZpbGVzIHdpdGhpbiBhIG5lc3RlZCBhcmNoaXZlIGlmIHRoZSBuZXN0ZWQgYXJjaGl2ZSB3aWxsIG5vdCBjaGFuZ2UgLQotCSAqIGRlZmF1bHRzIHRvIGZhbHNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVhZE9ubHk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0b3IgZm9yIHdoZXRoZXIgYSBsaWJhcnkgbmVzdGVkIGluIGFub3RoZXIgYXJjaGl2ZSAoZWcsIHV0aWxpdHkgSkFScyBpbiBhbiBFQVIpIHdpbGwgYmUKLQkgKiBzYXZlZCBvdXQgYXMgYW4gb3JkaW5hcnkgZmlsZSBvciBhcyBhIG5lc3RlZCBBcmNoaXZlLiBXaGVuIGxvYWRlZCBpbnRvIG1lbW9yeSB0aGVzZSBmaWxlcyBhcmUKLQkgKiB0cmVhdGVkIGFzIEFyY2hpdmVzLCB0byBzdXBwb3J0IGR5bmFtaWMgY2xhc3MgbG9hZGluZyBmb3IgSmF2YSByZWZsZWN0aW9uIG9mIGNsYXNzZXMgaW4KLQkgKiBFSkJKYXJGaWxlcyBhbmQgZGVwZW5kZW50IEpBUnMuIEFuIGFyY2hpdmUgb3BlbmVkIGZvciBlZGl0LCBlaXRoZXIgYnkgYWRkaW5nIG9yIHJlbW92aW5nCi0JICogZmlsZXMgb3IgY2hhbmduaW5nIHRoZSBNYW5pZmVzdCBvciBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgd2lsbCBiZSBzYXZlZCBhcyBhIG5ldyBmaWxlIG9uZQotCSAqIGZpbGUgYXQgYSB0aW1lLiBUaGUgZGVmYXVsdCBmb3IgdGhpcyBmbGFnIGlzIHRydWU7IGl0IG9ubHkgYXBwbGllcyB0byBsaWJyYXJ5IEFyY2hpdmVzLCBub3QKLQkgKiBpbnN0YW5jZXMgb2YgTW9kdWxlRmlsZS4gSWYgeW91IHdpc2ggdG8gZWRpdCBhIG5lc3RlZCBsaWJyYXJ5LCBzZXQgdGhpcyBmbGFnIHRvIGZhbHNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNhdmVMaWJyYXJpZXNBc0ZpbGVzID0gdHJ1ZTsKLQotCi0JcHJpdmF0ZSBib29sZWFuIHNhdmVPbmx5RGlydHlNb2ZSZXNvdXJjZXMgPSB0cnVlOwotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgbmVzdGVkIGFyY2hpdmVzIGFyZSB0cmVhdGVkIGFzIHByaW1pdGl2ZSBhcmNoaXZlcyBhbmQgYXJlIG5vdCBwaXBlZCB0aHJvdWdoIHRoZQotCSAqIGRpc2NyaW1pbmF0b3IgdHJlZSBvbiB0aGUgYXJjaGl2ZSBmYWN0b3J5OyBtb2R1bGUgZmlsZXMgaW4gYW4gRUFSIGFyZSBvcGVuZWQgdXNpbmcgdGhlCi0JICogc3BlY2lmaWMgb3BlbiBtZXRob2RzIG9uIHRoZSBmYWN0b3J5OyBjaGFuZ2UgdGhpcyBmbGFnIGlmIHlvdSdkIGxpa2UgbmVzdGVkIGFyY2hpdmVzIHRvIGJlCi0JICogZGlzY3JpbWluYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlcyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBNYXAgcmVhZE9ubHlGbGFnczsKLQotCS8qKgotCSAqIEFyY2hpdmVPcHRpb25zIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFyY2hpdmVPcHRpb25zKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1ha2UgYSBjb3B5IG9mIHRoZSByZWNpZXZlciwgc2V0dGluZyB0aGUgbG9hZFN0cmF0ZWd5IHRvIG51bGwKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQlyZXR1cm4gY2xvbmVXaXRoKG51bGwpOwotCX0KLQotCS8qKgotCSAqIE1ha2UgYSBjb3B5IG9mIHRoZSByZWNpZXZlciwgc2V0dGluZyB0aGUgbG9hZFN0cmF0ZWd5IHRvIG51bGwKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU9wdGlvbnMgY2xvbmVXaXRoKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5KSB7Ci0JCXRyeSB7Ci0JCQlBcmNoaXZlT3B0aW9ucyByZXN1bHQgPSAoQXJjaGl2ZU9wdGlvbnMpIHN1cGVyLmNsb25lKCk7Ci0JCQlyZXN1bHQuc2V0TG9hZFN0cmF0ZWd5KGFMb2FkU3RyYXRlZ3kpOwotCQkJcmVzdWx0LnJlYWRPbmx5RmxhZ3MgPSBudWxsOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gaWdub3JlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBBcmNoaXZlT3B0aW9ucyBjbG9uZVdpdGgoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHsKLQkJQXJjaGl2ZU9wdGlvbnMgcmVzdWx0ID0gY2xvbmVXaXRoKGFMb2FkU3RyYXRlZ3kpOwotCQlyZXN1bHQuc2V0SXNSZWFkT25seShpc1JlYWRPbmx5KHVyaSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3kgZ2V0TG9hZFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbG9hZFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBpc1JlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvMTgvMjAwMSAyOjQyOjExIFBNKQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhdmVPbmx5RGlydHlNb2ZSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBzYXZlT25seURpcnR5TW9mUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElzUmVhZE9ubHkoYm9vbGVhbiBuZXdJc1JlYWRPbmx5KSB7Ci0JCWlzUmVhZE9ubHkgPSBuZXdJc1JlYWRPbmx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElzUmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSwgU3RyaW5nIHVyaSkgewotCQlpZiAocmVhZE9ubHlGbGFncyA9PSBudWxsKQotCQkJcmVhZE9ubHlGbGFncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJlYWRPbmx5RmxhZ3MucHV0KHVyaSwgbmV3IEJvb2xlYW4ocmVhZE9ubHkpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KFN0cmluZyB1cmkpIHsKLQkJaWYgKHJlYWRPbmx5RmxhZ3MgIT0gbnVsbCkgewotCQkJQm9vbGVhbiBib29sID0gKEJvb2xlYW4pIHJlYWRPbmx5RmxhZ3MuZ2V0KHVyaSk7Ci0JCQlpZiAoYm9vbCAhPSBudWxsKQotCQkJCXJldHVybiBib29sLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBpc1JlYWRPbmx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvYWRTdHJhdGVneShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3kgbmV3TG9hZFN0cmF0ZWd5KSB7Ci0JCWxvYWRTdHJhdGVneSA9IG5ld0xvYWRTdHJhdGVneTsKLQkJbG9hZFN0cmF0ZWd5LnNldFJlYWRPbmx5KGlzUmVhZE9ubHkoKSk7Ci0JCWxvYWRTdHJhdGVneS5zZXRSZW5kZXJlclR5cGUoZ2V0UmVuZGVyZXJUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvMTgvMjAwMSAyOjQyOjExIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTYXZlT25seURpcnR5TW9mUmVzb3VyY2VzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlcyhib29sZWFuIG5ld1NhdmVPbmx5RGlydHlNb2ZSZXNvdXJjZXMpIHsKLQkJc2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlcyA9IG5ld1NhdmVPbmx5RGlydHlNb2ZSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXNlSmF2YVJlZmxlY3Rpb24oYm9vbGVhbiBuZXdVc2VKYXZhUmVmbGVjdGlvbikgewotCQl1c2VKYXZhUmVmbGVjdGlvbiA9IG5ld1VzZUphdmFSZWZsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZUphdmFSZWZsZWN0aW9uKCkgewotCQlyZXR1cm4gdXNlSmF2YVJlZmxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2F2ZUxpYnJhcmllc0FzRmlsZXMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUxpYnJhcmllc0FzRmlsZXMoKSB7Ci0JCXJldHVybiBzYXZlTGlicmFyaWVzQXNGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzYXZlTGlicmFyaWVzQXNGaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc2F2ZUxpYnJhcmllc0FzRmlsZXMKLQkgKiAgICAgICAgICAgIFRoZSBzYXZlTGlicmFyaWVzQXNGaWxlcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYXZlTGlicmFyaWVzQXNGaWxlcyhib29sZWFuIHNhdmVMaWJyYXJpZXNBc0ZpbGVzKSB7Ci0JCXRoaXMuc2F2ZUxpYnJhcmllc0FzRmlsZXMgPSBzYXZlTGlicmFyaWVzQXNGaWxlczsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlcygpIHsKLQkJcmV0dXJuIGRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzLgotCSAqIAotCSAqIEBwYXJhbSBkaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlcwotCSAqICAgICAgICAgICAgVGhlIGRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzKGJvb2xlYW4gZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMpIHsKLQkJdGhpcy5kaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlcyA9IGRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVuZGVyZXJUeXBlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVuZGVyZXJUeXBlKCkgewotCQlyZXR1cm4gcmVuZGVyZXJUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoZSByZW5kZXJlclR5cGUgYWxsb3dzIGEgdXNlciB0byBvdmVycmlkZSB0aGUgcmVuZGVyZXIgdXNlZCBieSBDb21tb24gQXJjaGl2ZSBmb3Igc3BlY2lhbAotCSAqIGNhc2VzIGluIHRoZSBVSSB3aGVyZSB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIGEgbm9uLXN5bmNocm9uaXppbmcgcmVuZGVyZXIuCi0JICogCi0JICogQHBhcmFtIHJlbmRlcmVyVHlwZQotCSAqICAgICAgICAgICAgVGhlIHJlbmRlcmVyVHlwZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVuZGVyZXJUeXBlKGludCByZW5kZXJlclR5cGUpIHsKLQkJdGhpcy5yZW5kZXJlclR5cGUgPSByZW5kZXJlclR5cGU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0Q2xhc3NMb2FkaW5nTW9kZSgpIHsKLQkJcmV0dXJuIGNsYXNzTG9hZGluZ01vZGU7Ci0JfQotCi0JLyoqCi0JICogVmFsaWQgdmFsdWVzIGFyZSBMT0FEX01PREVfQ09NUEFUIG9yIExPQURfTU9ERV9TUEVDLiBUaGUgZGVmYXVsdCBpcyBMT0FEX01PREVfQ09NUEFULiBUaGlzCi0JICogZmxhZyBpcyB0byBzZXQgdGhlIGNsYXNzIGxvYWRpbmcgbW9kZTsgdGhlIGRlZmF1bHQgaXMgTE9BRF9NT0RFX0NPTVBBVCBmb3IgYmFja3dhcmRzCi0JICogY29tcGF0aWJpbGl0eSwgd2hpbGUgTE9BRF9NT0RFX1NQRUMgd2lsbCBlbmZvcmNlIHNwZWMgZGVmaW5lZCBjbGFzcyBsb2FkaW5nLgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc0xvYWRpbmdNb2RlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkaW5nTW9kZShpbnQgY2xhc3NMb2FkaW5nTW9kZSkgewotCQl0aGlzLmNsYXNzTG9hZGluZ01vZGUgPSBjbGFzc0xvYWRpbmdNb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjM2NTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneTsKLQotCi0vKioKLSAqIEFuIGludGVyZmFjZSB0aGF0IGRlZmluZXMgYW4gQVBJIGZvciBvcGVuaW5nIGFyY2hpdmVzLiBUaGUge0BsaW5rIENvbW1vbkFyY2hpdmVGYWN0b3J5fQotICogaW1wbGVtZW50YXRpb24gdXNlcyBhIHJvb3QgbGV2ZWwgZGlzY3JpbWluYXRvciB0byBvcGVuIGFuIGFyY2hpdmUuIFRoZSBtYWluIGJlbmVmaXQgb2YgdGhpcyBhcGkKLSAqIGlzIGl0IGFsbG93cyBleHRlbmRlZCB0ZWFtcyBvciB0aGlyZCBwYXJ0aWVzIHRvIHBsdWcgaW4gdG8gdGhlIGZyYW1ld29yayB0byBhbGxvdyBzcGVjaWFsaXplZAotICoga2luZHMgb2YgamFyIGZpbGVzIGRvIGJlIGRpc2Nlcm5lZCBhdCBjcmVhdGlvbi9vcGVuIHRpbWUgd2l0aG91dCB0aGUgY2xpZW50IGhhdmluZyB0byBwcm92aWRlIGEKLSAqIGxvdCBvZiBsb2dpYy4gRm9yIGV4YW1wbGUsIGEgY2xpZW50IHdvdWxkIHNpbXBseSB3cml0ZQotICogPGNvZGU+KChDb21tb25BcmNoaXZlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25BcmNoaXZlUGFja2FnZS5lTlNfVVJJKSkuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5vcGVuKGFTdHJpbmcpPGNvZGU+LCBhbmQgZ2V0IGJhY2sgCi0gKiB0aGUgY29ycmVjdCBraW5kIG9mIGFyY2hpdmUgaW5zdGFuY2UuICBBIGRpc2NyaW1pbmF0b3IgY29udGFpbnMgY2hpbGRyZW4sIHdoaWNoIGlzIGFuIG9yZGVyZWQgbGlzdCBvZiBkaXNjcmltaW5hdG9ycywgZWFjaCBvZiB3aGljaCAKLSAqIGNhbiBoYXZlIGl0cyB0dXJuIHRvIGRldGVybWluZSBpZiBpdCBjYW4gb3BlbiBhbiBhcmNoaXZlLiAgVGhlIGZpcnN0IG9uZSB0byBzdWNjZWVkIHdpbnMuICBPbmNlIGEgZGlzY3JpbWluYXRvciBkZXRlcm1pbmVzIHRoYXQgaXQKLSAqIGNhbiBvcGVuIGFuIGFyY2hpdmUsIGl0IGdpdmVzIGVhY2ggb2YgaXRzIGNoaWxkcmVuIHRoZSBvcHBvcnR1bnRpdHkgdG8gZG8gc29tZXRoaW5nIG1vcmUgc3BlY2lmaWMsIGFuZCBzbyBvbi4gSW4gdGhlIGJhc2UKLSAqIGltcGxlbWVudGF0aW9uLCBkaXNjcmltaW5hdG9ycyBhcmUgZGVmaW5lZCBhcyBzaW5nbGUgaW5zdGFuY2VzIG9mIGFuIGlubmVyIGNsYXNzIGZvciBlYWNoIGltcG9ydCBzdHJhdGVneS4gIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyAKLSAqIGhvdyB0byByZWdpc3RlciBhIGRpc2NyaW1pbmF0b3IgZm9yIGEgc3BlY2lhbGl6ZWQgRUpCSmFyRmlsZTogCi0gKiA8Y29kZT5FamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCkuYWRkQ2hpbGQoYURpc2NyaW1pbmF0b3IpOzwvY29kZT4KLSAqIFRoaXMgd291bGQgYmUgZG9uZSBhcyBhbiBpbml0aWFsaXphdGlvbiBhdCBzdGFydHVwIHRpbWUuICBJZiB0aGUgY2hpbGQgZGlzY3JpbWluYXRvciBpcyBldmVyIGludm9rZWQsIHRoZSBwYXJlbnQgd2lsbCBoYXZlIGFscmVhZHkKLSAqIGRldGVybWluZWQgdGhhdCB0aGUgYXJjaGl2ZSBpcyBhbiBFSkJKYXJGaWxlIGFuZCB3aWxsIGhhdmUgY29udmVydGVkIGl0IHRvIHRoYXQgdHlwZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgewotCXB1YmxpYyB2b2lkIGFkZENoaWxkKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCk7Ci0KLQkvKioKLQkgKiBAdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIHByZWRlY2Vzc29yIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZiBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkQWZ0ZXIoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkLCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgcHJlZGVjZXNzb3IpIHRocm93cyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgc3VjY2Vzc29yIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZiBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkQmVmb3JlKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCwgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHN1Y2Nlc3NvcikgdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0JLyoqCi0JICogUGVyZm9ybXMgdGVzdHMgb24gdGhlIGFyY2hpdmUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHRoZSBraW5kIHRoaXMgZGlzY3JpbWluYXRvciBpcyBpbnRlcmVzdGVkCi0JICogaW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpOwotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIHRoZSBpbXBvcnQgc3RyYXRlZ3kgZm9yIGEgY29udmVydGVkIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgdG8gYmUgcHJlc2VudGVkIGVpdGhlciB0aHJvdWdoIGFuIGV4Y2VwdGlvbiBvciBlcnJvciBtZXNzYWdlIHdoZW4gYSBzcGVjaWZpYwotCSAqIGtpbmQgb2YgYXJjaGl2ZSBpcyBleHBlY3RlZCBhbmQgdGhpcyBkaXNjcmltaW5hdG9yIGNhbid0IG9wZW4gaXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpOwotCi0JLyoqCi0JICogUG9pbnQgb2YgZW50cnkgZm9yIGF0dGVtcHRpbmcgdG8gb3BlbiBhbiBhcmNoaXZlCi0JICogCi0JICogQHJldHVybiBhIGNvbnZlcnRlZCBhcmNoaXZlIG9yIG51bGwgaWYgdGhpcyBkaXNjcmltaW5hdG9yIGNhbid0IGNvbnZlcnQgaXQKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDZiM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneTsKLQotCi0vKioKLSAqIEBzZWUgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIGltcGxlbWVudHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHsKLQlwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbjsKLQotCXB1YmxpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQpIHsKLQkJaWYgKGhhc0NoaWxkKGNoaWxkKSkKLQkJCXJldHVybjsKLQkJZ2V0Q2hpbGRyZW4oKS5hZGQoY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZEFmdGVyKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkLCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBwcmVkZWNlc3NvcikgdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKLQkJaWYgKGhhc0NoaWxkKGNoaWxkKSkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gZ2V0Q2hpbGRyZW4oKS5pbmRleE9mKHByZWRlY2Vzc29yKTsKLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCWluZGV4Kys7Ci0JCQlnZXRDaGlsZHJlbigpLmFkZChpbmRleCwgY2hpbGQpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKHByZWRlY2Vzc29yLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkQmVmb3JlKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCwgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHN1Y2Nlc3NvcikgdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKLQkJaWYgKGhhc0NoaWxkKGNoaWxkKSkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gZ2V0Q2hpbGRyZW4oKS5pbmRleE9mKHN1Y2Nlc3Nvcik7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQlnZXRDaGlsZHJlbigpLmFkZChpbmRleCwgY2hpbGQpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKHN1Y2Nlc3Nvci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNvbnZlcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgZGVzdGluYXRpb24gPSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCk7Ci0KLQkJLy90dXJuIG9mIG5vdGlmaWNhdGlvbnMKLQkJZGVzdGluYXRpb24uZVNldERlbGl2ZXIoZmFsc2UpOwotCQlkZXN0aW5hdGlvbi5lU2V0RGVsaXZlcihmYWxzZSk7Ci0KLQkJLy9Db3B5IHRoZSByZWxldmFudCBhdHRyaWJ1dGVzCi0JCWRlc3RpbmF0aW9uLnNldFVSSShhbkFyY2hpdmUuZ2V0VVJJKCkpOwotCQlkZXN0aW5hdGlvbi5zZXRPcmlnaW5hbFVSSShhbkFyY2hpdmUuZ2V0VVJJKCkpOwotCQlkZXN0aW5hdGlvbi5zZXRTaXplKGFuQXJjaGl2ZS5nZXRTaXplKCkpOwotCQlkZXN0aW5hdGlvbi5zZXRMYXN0TW9kaWZpZWQoYW5BcmNoaXZlLmdldExhc3RNb2RpZmllZCgpKTsKLQotCQlkZXN0aW5hdGlvbi5zZXRMb2FkU3RyYXRlZ3koYW5BcmNoaXZlLmdldExvYWRTdHJhdGVneSgpKTsKLQkJZGVzdGluYXRpb24uc2V0T3B0aW9ucyhhbkFyY2hpdmUuZ2V0T3B0aW9ucygpKTsKLQkJZGVzdGluYXRpb24uc2V0RXh0cmFDbGFzc3BhdGgoYW5BcmNoaXZlLmdldEV4dHJhQ2xhc3NwYXRoKCkpOwotCQlpZiAoZGVzdGluYXRpb24uaXNNb2R1bGVGaWxlKCkpIHsKLQkJCUltcG9ydFN0cmF0ZWd5IGltcG9ydFN0cmF0ZWd5ID0gY3JlYXRlSW1wb3J0U3RyYXRlZ3koYW5BcmNoaXZlLCBkZXN0aW5hdGlvbik7Ci0JCQkoKE1vZHVsZUZpbGUpIGRlc3RpbmF0aW9uKS5zZXRJbXBvcnRTdHJhdGVneShpbXBvcnRTdHJhdGVneSk7Ci0JCX0KLQotCi0KLQkJLy90dXJuIG5vdGlmaWNhdGlvbnMgYmFjayBvbgotCQlkZXN0aW5hdGlvbi5lU2V0RGVsaXZlcih0cnVlKTsKLQkJZGVzdGluYXRpb24uZVNldERlbGl2ZXIodHJ1ZSk7Ci0KLQkJcmV0dXJuIGRlc3RpbmF0aW9uOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKTsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSk7Ci0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJY2hpbGRyZW4gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSB0aHJvdWdoIGVhY2ggY2hpbGQgYW5kIGF0dGVtcHQgdG8gY29udmVydCB0aGUgYXJjaGl2ZSB0byB0aGUgY2hpbGQncyB0eXBlOyByZXR1cm4gdGhlCi0JICogY29udmVydGVkIGFyY2hpdmUgZnJvbSB0aGUgZmlyc3QgY2hpbGQgdGhhdCBzdWNjZWVkcywgb3IgbnVsbCBpZiBubyBjaGlsZCBzdWNjZWVkcyBvciBubwotCSAqIGNoaWxkIGV4aXN0cwotCSAqLwotCXByb3RlY3RlZCBBcmNoaXZlIGdldEltcG9ydGFibGVBcmNoaXZlRnJvbUNoaWxkKEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAoIWhhc0NoaWxkcmVuKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpc3QgdGhlQ2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlBcmNoaXZlIGNoaWxkQ29udmVydGVkQXJjaGl2ZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCA9IChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IpIHRoZUNoaWxkcmVuLmdldChpKTsKLQkJCWNoaWxkQ29udmVydGVkQXJjaGl2ZSA9IGNoaWxkLm9wZW5BcmNoaXZlKGFuQXJjaGl2ZSk7Ci0JCQlpZiAoY2hpbGRDb252ZXJ0ZWRBcmNoaXZlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY2hpbGRDb252ZXJ0ZWRBcmNoaXZlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0WG1sRERNZXNzYWdlKFN0cmluZyBhcmNoaXZlVHlwZSwgU3RyaW5nIGRkVXJpKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmludmFsaWRfYXJjaGl2ZV9FWENfLCAobmV3IE9iamVjdFtde2FyY2hpdmVUeXBlLCBkZFVyaX0pKTsgLy8gPSAiQXJjaGl2ZSBpcyBub3QgYSB2YWxpZCB7MH0gYmVjYXVzZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNhbiBub3QgYmUgZm91bmQgKGNhc2Ugc2Vuc2l0aXZlKTogezF9IgotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjKSB7Ci0JCXJldHVybiBoYXNDaGlsZHJlbigpICYmIGdldENoaWxkcmVuKCkuY29udGFpbnMoZGlzYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLnNpemUoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAoIWNhbkltcG9ydChhbkFyY2hpdmUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBcmNoaXZlIGNvbnZlcnRlZEFyY2hpdmUgPSBjb252ZXJ0KGFuQXJjaGl2ZSk7Ci0JCUFyY2hpdmUgY2hpbGRDb252ZXJ0ZWRBcmNoaXZlID0gZ2V0SW1wb3J0YWJsZUFyY2hpdmVGcm9tQ2hpbGQoY29udmVydGVkQXJjaGl2ZSk7Ci0JCWlmIChjaGlsZENvbnZlcnRlZEFyY2hpdmUgIT0gbnVsbCkKLQkJCXJldHVybiBjaGlsZENvbnZlcnRlZEFyY2hpdmU7Ci0JCXJldHVybiBjb252ZXJ0ZWRBcmNoaXZlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCkgewotCQlnZXRDaGlsZHJlbigpLnJlbW92ZShjaGlsZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oamF2YS51dGlsLkxpc3QgbmV3Q2hpbGRyZW4pIHsKLQkJY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVVUklDb252ZXJ0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVVUklDb252ZXJ0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjhiZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVVJJQ29udmVydGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlVXRpbDsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB1c2VkIGZvciBsb2FkaW5nIG9mIG1vZiByZXNvdXJjZXMgY29udGFpbmVkIHdpdGhpbiBhbiBhcmNoaXZlOyBrbm93cyBob3cgdG8gcmV0cmlldmUKLSAqIGFuIGlucHV0IHN0cmVhbSBmb3IgYSBnaXZlbiB1cmkKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsIGV4dGVuZHMgVVJJQ29udmVydGVySW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGxhdGZvcm1Qcm90b2NvbCA9ICJwbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBpbkZpbGVwYXRoLCBvdXRGaWxlcGF0aDsKLQotCXB1YmxpYyBBcmNoaXZlVVJJQ29udmVydGVySW1wbChvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlIGFuQXJjaGl2ZSwgU3RyaW5nIHJlc291cmNlc1BhdGgpIHsKLQkJc2V0QXJjaGl2ZShhbkFyY2hpdmUpOwotCQl0aGlzLnJlc291cmNlc1BhdGggPSByZXNvdXJjZXNQYXRoOwotCQlzZXRJbnB1dEZpbGVwYXRoKHJlc291cmNlc1BhdGgpOwotCQlTdHJpbmcgb3V0cGF0aCA9IHJlc291cmNlc1BhdGg7Ci0JCWlmIChvdXRwYXRoID09IG51bGwpIHsKLQkJCUxvYWRTdHJhdGVneSBsID0gYW5BcmNoaXZlLmdldExvYWRTdHJhdGVneSgpOwotCQkJaWYgKGwgIT0gbnVsbCAmJiBsLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQl0cnkgewotCQkJCQlvdXRwYXRoID0gbC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JCXNldE91dHB1dEZpbGVwYXRoKG91dHBhdGgpOwotCX0KLQotCS8qKiBUaGUgYXJjaGl2ZSBmcm9tIHdoaWNoIHJlc291cmNlcyB3aWxsIGJlIGxvYWRlZCAqLwotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlIGFyY2hpdmU7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZXNQYXRoOwotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmUgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtKFVSSSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJaWYgKHJlc291cmNlc1BhdGggIT0gbnVsbCkKLQkJCWluID0gbWFrZUlucHV0U3RyZWFtKHVyaSk7Ci0JCWlmIChpbiAhPSBudWxsKQotCQkJcmV0dXJuIGluOwotCQlyZXR1cm4gZ2V0QXJjaGl2ZSgpLmdldElucHV0U3RyZWFtKHVyaS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlhcmNoaXZlID0gbmV3QXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXNvdXJjZXNQYXRoLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VzUGF0aCgpIHsKLQkJcmV0dXJuIHJlc291cmNlc1BhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVzb3VyY2VzUGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzUGF0aAotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlc1BhdGggdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzUGF0aChTdHJpbmcgcmVzb3VyY2VzUGF0aCkgewotCQl0aGlzLnJlc291cmNlc1BhdGggPSByZXNvdXJjZXNQYXRoOwotCQlzZXRJbnB1dEZpbGVwYXRoKHJlc291cmNlc1BhdGgpOwotCQlzZXRPdXRwdXRGaWxlcGF0aChyZXNvdXJjZXNQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIG5vcm1hbGl6ZShVUkkgdXJpKSB7Ci0JCXJldHVybiAoKFVSSUNvbnZlcnRlckltcGwuVVJJTWFwKWdldFVSSU1hcCgpKS5nZXRVUkkodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaW5wdXQgZmlsZSBwYXRoIGNvbnNpc3RzIG9mIGEgc3RyaW5nIG9mIGRpcmVjdG9yaWVzIG9yIHppcCBmaWxlcyBzZXBhcmF0ZWQgYnkgc2VtaS1jb2xvbnMKLQkgKiB0aGF0IGFyZSBzZWFyY2hlZCB3aGVuIGFuIGlucHV0IHN0cmVhbSBpcyBjb25zdHJ1Y3RlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RmlsZXBhdGgoKSB7Ci0JCXJldHVybiBpbkZpbGVwYXRoOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlcGF0aAotCSAqICAgICAgICAgICAgVGhlIGZpbGUgcGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0RmlsZXBhdGgoU3RyaW5nIGZpbGVwYXRoKSB7Ci0JCWluRmlsZXBhdGggPSBmaWxlcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBvdXRwdXQgZmlsZSBwYXRoCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRwdXRGaWxlcGF0aCgpIHsKLQkJcmV0dXJuIG91dEZpbGVwYXRoOwotCX0KLQotCS8qKgotCSAqIFRoZSBvdXRwdXQgZmlsZSBwYXRoIGlzIHRoZSBwYXRoIG5hbWUgb2YgYSBkaXJlY3RvcnkgdG8gcHJlcGVuZCB0byByZWxhdGl2ZSBmaWxlIHBhdGggbmFtZXMKLQkgKiB3aGVuIGFuIG91dHB1dCBzdHJlYW0gaXMgY29uc3RydWN0ZWQuCi0JICogCi0JICogQHBhcmFtIGZpbGVwYXRoCi0JICogICAgICAgICAgICBUaGUgb3V0cHV0IGZpbGUgcGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dHB1dEZpbGVwYXRoKFN0cmluZyBmaWxlcGF0aCkgewotCQlvdXRGaWxlcGF0aCA9IGZpbGVwYXRoOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIFVSSSB0byBhbiBpbnB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIHVyaQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBtYWtlSW5wdXRTdHJlYW0oVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJVVJJIGNvbnZlcnRlZCA9IHVyaTsKLQotCQlpZiAoKGZpbGVQcm90b2NvbC5lcXVhbHMoY29udmVydGVkLnNjaGVtZSgpKSB8fCBjb252ZXJ0ZWQuc2NoZW1lKCkgPT0gbnVsbCkgJiYgaW5GaWxlcGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2VhcmNoRmlsZVBhdGgoY29udmVydGVkLnRvU3RyaW5nKCkpOwotCQl9Ci0JCVVSTCB1cmwgPSBjcmVhdGVVUkwoY29udmVydGVkLnRvU3RyaW5nKCkpOwotCQlVUkxDb25uZWN0aW9uIHVybENvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJcmV0dXJuIHVybENvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2ggdGhlIGZpbGUgcGF0aCBpZiB0aGUgZmlsZSBwb3J0aW9uIG9mIHRoZSBVUkwgaXMgbm90IGFic29sdXRlIChkb2VzIG5vdCBiZWdpbiB3aXRoICIvIjsKLQkgKiBvdGhlcndpc2UsIGF0dGVtcHQgdG8gY3JlYXRlIGFuIGlucHV0IHN0cmVhbSBmb3IgdGhlIGZpbGUuCi0JICovCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIHNlYXJjaEZpbGVQYXRoKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotCQlpZiAoZmlsZS5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbkZpbGVwYXRoLCAiOyIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBmID0gc3QubmV4dFRva2VuKCk7Ci0JCQlaaXBGaWxlIHpmID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemYgPSBBcmNoaXZlVXRpbC5uZXdaaXBGaWxlKGYpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJaWYgKHpmICE9IG51bGwpIHsKLQkJCQlpbiA9IHNlYXJjaFppcEZpbGUoemYsIGZpbGVuYW1lKTsKLQkJCQlpZiAoaW4gPT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCXpmLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvL0lnbm9yZQotCQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWluID0gc2VhcmNoRGlyZWN0b3J5KGYsIGZpbGVuYW1lKTsKLQkJCX0KLQkJCWlmIChpbiAhPSBudWxsKQotCQkJCXJldHVybiBpbjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZpbGUgd2l0aCB0aGUgcmVsYXRpdmUgcGF0aCBuYW1lIG9mIGZpbGVuYW1lIGV4aXN0cyBpbiB0aGUKLQkgKiBnaXZlbiBkaXJlY3RvcnkuIElmIG5vdCwgaXQgcmV0dXJucyBudWxsOyBvdGhlcndpc2UsIGl0IG9wZW5zIHRoZSBmaWxlIHVwIGFuZCByZXR1cm5zIHRoZQotCSAqIGlucHV0IHNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBqYXZhLmlvLklucHV0U291cmNlCi0JICovCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIHNlYXJjaERpcmVjdG9yeShTdHJpbmcgZGlyLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChkaXIuZXF1YWxzKCIuIikpIC8vJE5PTi1OTFMtMSQKLQkJCWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIikgKyBmaWxlbmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFmLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRldGVybWluZXMgd2hldGhlciB0aGVyZSBpcyBhIFppcEVudHJ5IHdob3NlIG5hbWUgaXMgZmlsZW5hbWUgaW4gdGhlIGdpdmVuCi0JICogWmlwRmlsZS4gSWYgbm90LCBpdCByZXR1cm5zIG51bGw7IG90aGVyd2lzZSwgaXQgcmV0dXJucyBhbiBpbnB1dCBzb3VyY2UgdG8gcmVhZCBmcm9tIHRoZQotCSAqIFppcEVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSB6aXAKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZQotCSAqIEByZXR1cm4gamF2YS5pby5JbnB1dFNvdXJjZQotCSAqLwotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBzZWFyY2haaXBGaWxlKFppcEZpbGUgemlwLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVppcEVudHJ5IGVudHJ5ID0gemlwLmdldEVudHJ5KGZpbGVuYW1lKTsKLQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHppcC5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBhIFVSTCBmcm9tIHRoZSB1cmk7IGlmIHRoZSBhdHRlbXB0IGZhaWxzLCBhdHRlbXB0IHRvIGFwcGVuZCAiZmlsZToiIHRvIHRoZSBVUkk7IGlmIHRoZQotCSAqIGF0dGVtcHQgc3RpbGwgZmFpbHMsIGF0dGVtcHQgdG8gcmVwbGFjZSB0aGUgcHJvdG9jb2wgd2l0aCB0aGUgZmlsZSBwcm90b2NvbC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgc3RyaW5nIHVyaQotCSAqLwotCXB1YmxpYyBVUkwgY3JlYXRlVVJMKFN0cmluZyB1cmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlNYWxmb3JtZWRVUkxFeGNlcHRpb24gbSA9IG51bGw7Ci0JCWlmICh1cmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwodXJpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCW0gPSAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uKSBlOwotCQl9Ci0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCXJldHVybiB1cmw7Ci0JCS8vIEVpdGhlciB0cmVhdCB0aGUgVVJJIGFzIGEgZmlsZXBhdGggKGlmIHRoZXJlIGFyZSBubyA6IG9yCi0JCS8vIGEgOiBpbiBwb3NpdGlvbiAxKSBvciByZXBsYWNlIHRoZSBnaXZlbiBwcm90b2NvbCB3aXRoIHRoZQotCQkvLyBmaWxlIHByb3RvY29sLgotCQlpbnQgaW5kZXggPSB1cmkuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA9PSAxKQotCQkJdXJpID0gZmlsZVByb3RvY29sICsgIjoiICsgdXJpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGluZGV4ID4gMCkKLQkJCXVyaSA9IGZpbGVQcm90b2NvbCArICI6IiArIHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTCh1cmkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlpZiAodXJsICE9IG51bGwpCi0JCQlyZXR1cm4gdXJsOwotCQl0aHJvdyBtOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIFVSSSB0byBhbiBvdXRwdXQgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSB1cmkKLQkgKi8KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGNyZWF0ZU91dHB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlVUkkgY29udmVydGVkID0gdXJpOwotCQlpZiAocGxhdGZvcm1Qcm90b2NvbC5lcXVhbHMoY29udmVydGVkLnNjaGVtZSgpKSkgewotCQkJVVJMIHJlc29sdmVkVVJMID0gcmVzb2x2ZVBsYXRmb3JtKG5ldyBVUkwoY29udmVydGVkLnRvU3RyaW5nKCkpKTsKLQkJCWlmIChyZXNvbHZlZFVSTCAhPSBudWxsKSB7Ci0JCQkJY29udmVydGVkID0gVVJJLmNyZWF0ZUZpbGVVUkkocmVzb2x2ZWRVUkwuZ2V0RmlsZSgpKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZVByb3RvY29sLmVxdWFscyhjb252ZXJ0ZWQuc2NoZW1lKCkpIHx8IGNvbnZlcnRlZC5zY2hlbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gb3BlbkZpbGVPdXRwdXRTdHJlYW0oY29udmVydGVkKTsKLQkJfQotCQlVUkwgdXJsID0gY3JlYXRlVVJMKGNvbnZlcnRlZC50b1N0cmluZygpKTsKLQkJVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCXVybENvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7Ci0JCXJldHVybiB1cmxDb25uZWN0aW9uLmdldE91dHB1dFN0cmVhbSgpOwotCX0KLQotCXByb3RlY3RlZCBVUkwgcmVzb2x2ZVBsYXRmb3JtKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGxldCBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgaW1wbGVtZW50IHRoaXMgb25lLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgZmlsZSBvdXRwdXQgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gdXJpICh0aGUgdXJpIGhhcyBmaWxlIHByb3RvY29sKS4gSWYgYW4gb3V0cHV0IGZpbGUKLQkgKiBwYXRoIGlzIHNwZWNpZmllZCBhbmQgdGhlIGZpbGUgbmFtZSBpcyByZWxhdGl2ZSwgcHJlcGVuZCB0aGUgb3V0cHV0IGZpbGUgcGF0aCB0byB0aGUgZmlsZQotCSAqIG5hbWUuIE1ha2UgdGhlIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiB0aGUgZmlsZSBpZiB0aGV5IGRvIG5vdCBleGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG9wZW5GaWxlT3V0cHV0U3RyZWFtKFVSSSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCWlmICghZmlsZS5pc0Fic29sdXRlKCkgJiYgb3V0RmlsZXBhdGggIT0gbnVsbCkgewotCQkJZmlsZSA9IG5ldyBGaWxlKG91dEZpbGVwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyB1cmkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCVN0cmluZyBwYXJlbnQgPSBmaWxlLmdldFBhcmVudCgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCW5ldyBGaWxlKHBhcmVudCkubWtkaXJzKCk7Ci0JCX0KLQkJT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQlyZXR1cm4gb3V0cHV0U3RyZWFtOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRXhwb3J0U3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRXhwb3J0U3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliMDgwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0V4cG9ydFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkFyY2hpdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci0KLQotCi0vKioKLSAqIEV4cG9ydFN0cmF0ZWd5IGtub3dzIHdoYXQgdG8gZG8ganVzdCBiZWZvcmUgYSBkdW1wIG9mIGFuIGFyY2hpdmUgaXMgYWJvdXQgdG8gb2NjdXIsIHR5cGljYWxseQotICogYWRkaW5nIGl0ZW1zIHN1Y2ggYXMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhbmQgc3VjaC4gVGhpcyBwcm92aWRlcyBhIGRlbGVnYXRpb24gbW9kZWwgZm9yCi0gKiBhcmNoaXZlL3ZlcnNpb24vcGxhdGZvcm0gc3BlY2lmaWMgcnVsZXMgYWJvdXQgd2hpY2ggcmVzb3VyY2VzIGV0YyBuZWVkIHRvIGJlIGV4cG9ydGVkLiBDbGllbnRzCi0gKiBjYW4gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBhbmQgInBsdWcgaW4iIHRvIGFuIGluc3RhbmNlIG9mIGFuIGFyY2hpdmUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhwb3J0U3RyYXRlZ3kgZXh0ZW5kcyBBcmNoaXZlU3RyYXRlZ3kgewotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHN0cmF0ZWd5IGhhcyBhbHJlYWR5IHNhdmVkIGEgZmlsZSBlbnRyeSBoYXZpbmcgYSB1cmkgbmFtZWQgYnkgdGhlCi0JICogcGFyYW1ldGVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU2F2ZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBUaGUgYXJjaGl2ZSBpcyBzYXZpbmcgaXRzZWxmLCBhbmQgZ2l2aW5nIHRoZSBleHBvcnQgc3RyYXRlZ3kgdGhlIG9wcG9ydHVuaXR5IHRvIGRvIHdoYXRldmVyCi0JICogaXQgbmVlZHMgdG8gZG8uIFRoZSBleHBvcnQgc3RyYXRlZ3kgbWF5IHdyaXRlIGVudHJpZXMgZGlyZWN0bHkgdG8gdGhlIFNhdmVTdHJhdGVneSwgYnV0IGlmIGl0Ci0JICogZG9lcywgaXQgc2hvdWxkIHJlbWVtYmVyIHRoZSBuYW1lcyBvZiB0aGVzZSBlbnRyaWVzIHNvIHRoZSBhcmNoaXZlIGRvZXMgbm90IGF0dGVtcHQgdG8KLQkgKiBkdXBsaWNhdGUgYnkgc2F2aW5nIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVNhdmUoU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVFeHRlbnNpb25zRmlsdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiOWI3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVFeHRlbnNpb25zRmlsdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI4LzAxIDE6MjA6MDkgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbCBleHRlbmRzIFNhdmVGaWx0ZXJJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyIHsKLQlwcm90ZWN0ZWQgU2V0IGV4Y2x1ZGVkRXh0ZW5zaW9uczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgU2V0IGV4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlOwotCi0JLyoqCi0JICogRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbChTdHJpbmdbXSBleHRlbnNpb25zVG9FeGNsdWRlLCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJc3VwZXIoKTsKLQkJU2V0IGV4dGVuc2lvbnMgPSBuZXcgamF2YS51dGlsLkhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zVG9FeGNsdWRlLmxlbmd0aDsgaSsrKSB7Ci0JCQlleHRlbnNpb25zLmFkZChleHRlbnNpb25zVG9FeGNsdWRlW2ldKTsKLQkJfQotCQlzZXRFeGNsdWRlZEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0JCXNldElzQ2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBGaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwoU3RyaW5nIGV4dGVuc2lvbiwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCXN1cGVyKCk7Ci0JCVNldCBleHRlbnNpb25zID0gbmV3IGphdmEudXRpbC5IYXNoU2V0KDEpOwotCQlleHRlbnNpb25zLmFkZChleHRlbnNpb24pOwotCQlzZXRFeGNsdWRlZEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0JCXNldElzQ2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBGaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwoU2V0IGV4dGVuc2lvbnNUb0V4Y2x1ZGUsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQlzdXBlcigpOwotCQlzZXRFeGNsdWRlZEV4dGVuc2lvbnMoZXh0ZW5zaW9uc1RvRXhjbHVkZSk7Ci0JCXNldElzQ2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI4LzAxIDE6MjQ6MjggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5TZXQgZ2V0RXhjbHVkZWRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gZXhjbHVkZWRFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI4LzAxIDI6NDI6MjAgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5TZXQgZ2V0RXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2UoKSB7Ci0JCXJldHVybiBleGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoaXNDYXNlU2Vuc2l0aXZlKCkpCi0JCQlyZXR1cm47Ci0KLQkJamF2YS51dGlsLkhhc2hTZXQgYVNldCA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldCgpOwotCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBnZXRFeGNsdWRlZEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhU2V0LmFkZCgoKFN0cmluZykgaXQubmV4dCgpKS50b1VwcGVyQ2FzZSgpKTsKLQkJfQotCQlzZXRFeGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZShhU2V0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiBpc0Nhc2VTZW5zaXRpdmU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjgvMDEgMToyNDoyOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXhjbHVkZWRFeHRlbnNpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXhjbHVkZWRFeHRlbnNpb25zKGphdmEudXRpbC5TZXQgbmV3RXhjbHVkZWRFeHRlbnNpb25zKSB7Ci0JCWV4Y2x1ZGVkRXh0ZW5zaW9ucyA9IG5ld0V4Y2x1ZGVkRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yOC8wMSAyOjQyOjIwIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZQotCSAqICAgICAgICAgICAgamF2YS51dGlsLlNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlKGphdmEudXRpbC5TZXQgbmV3RXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2UpIHsKLQkJZXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2UgPSBuZXdFeGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJc0Nhc2VTZW5zaXRpdmUoYm9vbGVhbiB2YWx1ZSkgewotCQlpc0Nhc2VTZW5zaXRpdmUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZUZpbHRlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFNhdmUoU3RyaW5nIHVyaSwgQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJU3RyaW5nIGV4dGVuc2lvbiA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuZ2V0RmlsZU5hbWVFeHRlbnNpb24odXJpKTsKLQkJaWYgKGV4dGVuc2lvbi5lcXVhbHMoIiIpKS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCi0JCVNldCBleGNsdWRlZDsKLQkJaWYgKGlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlleGNsdWRlZCA9IGdldEV4Y2x1ZGVkRXh0ZW5zaW9ucygpOwotCQl9IGVsc2UgewotCQkJZXhjbHVkZWQgPSBnZXRFeGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZSgpOwotCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9uLnRvVXBwZXJDYXNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gIWV4Y2x1ZGVkLmNvbnRhaW5zKGV4dGVuc2lvbik7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVJdGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwMmI2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMDIvMDEgNToyMDowMCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbGVJdGVyYXRvciB7Ci0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKEZpbGUgYUZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKTsKLQotCXB1YmxpYyBGaWxlIG5leHQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRmlsZUl0ZXJhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlSXRlcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjQ2NDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlSXRlcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci0KLQotcHVibGljIGNsYXNzIEZpbGVJdGVyYXRvckltcGwgaW1wbGVtZW50cyBGaWxlSXRlcmF0b3IgewotCXByb3RlY3RlZCBMaXN0IGZpbGVzOwotCXByb3RlY3RlZCBpbnQgcG9zaXRpb24gPSAwOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMDIvMDEgNjoxNjo1MiBQTSkKLQkgKi8KLQlwdWJsaWMgRmlsZUl0ZXJhdG9ySW1wbCgpIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JcHVibGljIEZpbGVJdGVyYXRvckltcGwoTGlzdCB0aGVGaWxlcykgewotCQlzdXBlcigpOwotCQlmaWxlcyA9IHRoZUZpbGVzOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShGaWxlIGFGaWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gYUZpbGUuZ2V0SW5wdXRTdHJlYW0oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gcG9zaXRpb24gPCBmaWxlcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIEZpbGUgbmV4dCgpIHsKLQkJaWYgKCFoYXNOZXh0KCkpCi0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkVuZF9vZl9saXN0X3JlYWNoZWRfRVhDXyk7IC8vID0gIkVuZCBvZiBsaXN0IHJlYWNoZWQiCi0JCXJldHVybiAoRmlsZSkgZmlsZXMuZ2V0KHBvc2l0aW9uKyspOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvTWFuaWZlc3RQYWNrYWdlRW50cnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL01hbmlmZXN0UGFja2FnZUVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2VmODI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvTWFuaWZlc3RQYWNrYWdlRW50cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi0KLS8qKgotICogVXNlZCBmb3IgbWFuaWZlc3Qgc3VwcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIE1hbmlmZXN0UGFja2FnZUVudHJ5SW1wbCBleHRlbmRzIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIk5hbWUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUNJRklDQVRJT05fVElUTEUgPSAiU3BlY2lmaWNhdGlvbi1UaXRsZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ0lGSUNBVElPTl9WRVJTSU9OID0gIlNwZWNpZmljYXRpb24tVmVyc2lvbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ0lGSUNBVElPTl9WRU5ET1IgPSAiU3BlY2lmaWNhdGlvbi1WZW5kb3IiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElNUExFTUVOVEFUSU9OX1RJVExFID0gIkltcGxlbWVudGF0aW9uLVRpdGxlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRBVElPTl9WRVJTSU9OID0gIkltcGxlbWVudGF0aW9uLVZlcnNpb24iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElNUExFTUVOVEFUSU9OX1ZFTkRPUiA9ICJJbXBsZW1lbnRhdGlvbi1WZW5kb3IiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE1hbmlmZXN0UGFja2FnZUVudHJ5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1hbmlmZXN0UGFja2FnZUVudHJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBNYW5pZmVzdFBhY2thZ2VFbnRyeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzaXplCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTWFuaWZlc3RQYWNrYWdlRW50cnlJbXBsKGludCBzaXplKSB7Ci0JCXN1cGVyKHNpemUpOwotCX0KLQotCS8qKgotCSAqIE1hbmlmZXN0UGFja2FnZUVudHJ5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBNYW5pZmVzdFBhY2thZ2VFbnRyeUltcGwoamF2YS51dGlsLmphci5BdHRyaWJ1dGVzIGF0dHIpIHsKLQkJc3VwZXIoYXR0cik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblRpdGxlKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0KElNUExFTUVOVEFUSU9OX1RJVExFKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVmVuZG9yKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0KElNUExFTUVOVEFUSU9OX1ZFTkRPUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXQoSU1QTEVNRU5UQVRJT05fVkVSU0lPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0KE5BTUUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblRpdGxlKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0KFNQRUNJRklDQVRJT05fVElUTEUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblZlbmRvcigpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldChTUEVDSUZJQ0FUSU9OX1ZFTkRPUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uVmVyc2lvbigpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldChTUEVDSUZJQ0FUSU9OX1ZFUlNJT04pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uVGl0bGUoU3RyaW5nIHZhbHVlKSB7Ci0JCXB1dChJTVBMRU1FTlRBVElPTl9USVRMRSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uVmVuZG9yKFN0cmluZyB2YWx1ZSkgewotCQlwdXQoSU1QTEVNRU5UQVRJT05fVkVORE9SLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKFN0cmluZyB2YWx1ZSkgewotCQlwdXQoSU1QTEVNRU5UQVRJT05fVkVSU0lPTiwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXB1dChOQU1FLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvblRpdGxlKFN0cmluZyB2YWx1ZSkgewotCQlwdXQoU1BFQ0lGSUNBVElPTl9USVRMRSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmljYXRpb25WZW5kb3IoU3RyaW5nIHZhbHVlKSB7Ci0JCXB1dChTUEVDSUZJQ0FUSU9OX1ZFTkRPUiwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmljYXRpb25WZXJzaW9uKFN0cmluZyB2YWx1ZSkgewotCQlwdXQoU1BFQ0lGSUNBVElPTl9WRVJTSU9OLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9OZXN0ZWRBcmNoaXZlSXRlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvTmVzdGVkQXJjaGl2ZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMmQ5NDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9OZXN0ZWRBcmNoaXZlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgTmVzdGVkQXJjaGl2ZUl0ZXJhdG9yIGV4dGVuZHMgRmlsZUl0ZXJhdG9ySW1wbCB7Ci0JcHJvdGVjdGVkIFppcElucHV0U3RyZWFtIHppcElucHV0U3RyZWFtOwotCXByb3RlY3RlZCBaaXBFbnRyeSBjdXJyZW50RW50cnk7Ci0KLQlzdGF0aWMgY2xhc3MgV3JhcHBlcklucHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0gewotCQkvKioKLQkJICogQHBhcmFtIGluCi0JCSAqLwotCQlwdWJsaWMgV3JhcHBlcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7Ci0JCQlzdXBlcihpbik7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNjbG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkvL2RvIG5vdGhpbmcgYmVjYXVzZSB3ZSB3YW50IHRvIHByZXZlbnQgdGhlIGNsaWVudHMgZnJvbSBjbG9zaW5nIHRoZSB6aXAKLQkJfQotCX0KLQotCS8qKgotCSAqIE5lc3RlZEFyY2hpdmVJdGVyYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOZXN0ZWRBcmNoaXZlSXRlcmF0b3IoTGlzdCB0aGVGaWxlcywgWmlwSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0JCXN1cGVyKHRoZUZpbGVzKTsKLQkJemlwSW5wdXRTdHJlYW0gPSBzdHJlYW07Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKEZpbGUgYUZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICghYUZpbGUuZ2V0VVJJKCkuZXF1YWxzKGN1cnJlbnRFbnRyeS5nZXROYW1lKCkpKQotCQkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5JbnRlcm5hbF9FcnJvcl9fSXRlcmF0b3Jfb19FWENfKTsgLy8gPSAiSW50ZXJuYWwgRXJyb3I6IEl0ZXJhdG9yIG91dCBvZiBzeW5jIHdpdGggemlwIGVudHJpZXMiCi0JCXJldHVybiBuZXcgV3JhcHBlcklucHV0U3RyZWFtKHppcElucHV0U3RyZWFtKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBuZXh0KCkgewotCQlGaWxlIG5leHQgPSBzdXBlci5uZXh0KCk7Ci0JCXRyeSB7Ci0JCQlkbyB7Ci0JCQkJY3VycmVudEVudHJ5ID0gemlwSW5wdXRTdHJlYW0uZ2V0TmV4dEVudHJ5KCk7Ci0JCQl9IHdoaWxlIChjdXJyZW50RW50cnkuaXNEaXJlY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkVycm9yX2l0ZXJhdGluZ190aGVfYXJjaGl2X0VYQ18sIGV4KTsgLy8gPSAiRXJyb3IgaXRlcmF0aW5nIHRoZSBhcmNoaXZlIgotCQl9Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1Jlc291cmNlUHJveHlWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUmVzb3VyY2VQcm94eVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjhhM2I5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUmVzb3VyY2VQcm94eVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDExLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1maW5hbCBjbGFzcyBSZXNvdXJjZVByb3h5VmFsaWRhdG9yIHsKLQlzdGF0aWMgSGFzaE1hcCByZXNvdXJjZVVSSU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlc29sdmVDb250YWluZWRQcm94aWVzKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCUxpc3QgY29udGFpbmVkID0gcmVmT2JqZWN0LmVDb250ZW50cygpOwotCQlFT2JqZWN0IG1vZk9iamVjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZWQuc2l6ZSgpOyBpKyspIHsKLQkJCW1vZk9iamVjdCA9IChFT2JqZWN0KSBjb250YWluZWQuZ2V0KGkpOwotCQkJcmVzb2x2ZVByb3hpZXMobW9mT2JqZWN0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzb2x2ZU5vbkNvbnRhaW5lZFByb3hpZXMoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJTGlzdCByZWZlcmVuY2VzID0gcmVmT2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCUVSZWZlcmVuY2UgcmVmZXJlbmNlOwotCQlFT2JqZWN0IHByb3h5T3JPYmplY3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIHJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJaWYgKCFyZWZlcmVuY2UuaXNDb250YWlubWVudCgpICYmICFyZWZlcmVuY2UuaXNUcmFuc2llbnQoKSkgewotCQkJCWlmIChyZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQkJSXRlcmF0b3IgdmFsdWUgPSAoKExpc3QpIHJlZk9iamVjdC5lR2V0KHJlZmVyZW5jZSkpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlICh2YWx1ZS5oYXNOZXh0KCkpIHsKLQkJCQkJCXByb3h5T3JPYmplY3QgPSAoRU9iamVjdCkgdmFsdWUubmV4dCgpOwotCQkJCQkJaWYgKHByb3h5T3JPYmplY3QuZUlzUHJveHkoKSkKLQkJCQkJCQl2YWx1ZS5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb3h5T3JPYmplY3QgPSAoRU9iamVjdCkgcmVmT2JqZWN0LmVHZXQocmVmZXJlbmNlLCBmYWxzZSk7Ci0JCQkJCWlmIChwcm94eU9yT2JqZWN0ICE9IG51bGwgJiYgcHJveHlPck9iamVjdC5lSXNQcm94eSgpKSB7Ci0JCQkJCQlVUkkgcmVzb3VyY2VVUkkgPSAoKEVPYmplY3RJbXBsKSBwcm94eU9yT2JqZWN0KS5lUHJveHlVUkkoKS50cmltRnJhZ21lbnQoKTsKLQkJCQkJCVN0cmluZyBwcm90b2NvbCA9IHJlc291cmNlVVJJLnNjaGVtZSgpOwotCQkJCQkJaWYgKHByb3RvY29sID09IG51bGwgfHwgIXByb3RvY29sLmVxdWFscygiamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgaWQgPSAoKEVPYmplY3RJbXBsKSBwcm94eU9yT2JqZWN0KS5lUHJveHlVUkkoKS5mcmFnbWVudCgpOwotCQkJCQkJCWlmIChyZXNvdXJjZVVSSU1hcC5nZXQocmVzb3VyY2VVUkkpICE9IG51bGwpIHsKLQkJCQkJCQkJUmVzb3VyY2UgY2FjaGVkUmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlc291cmNlVVJJTWFwLmdldChyZXNvdXJjZVVSSSk7Ci0JCQkJCQkJCXByb3h5T3JPYmplY3QgPSAoRU9iamVjdCkgKChYTUxSZXNvdXJjZSkgY2FjaGVkUmVzb3VyY2UpLmdldElEVG9FT2JqZWN0TWFwKCkuZ2V0KGlkKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwcm94eU9yT2JqZWN0ID0gKEVPYmplY3QpIHJlZk9iamVjdC5lR2V0KHJlZmVyZW5jZSk7Ci0JCQkJCQkJCXJlc291cmNlVVJJTWFwLnB1dChyZXNvdXJjZVVSSSwgcHJveHlPck9iamVjdC5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChwcm94eU9yT2JqZWN0ID09IG51bGwgfHwgcHJveHlPck9iamVjdC5lSXNQcm94eSgpKQotCQkJCQkJCQlyZWZPYmplY3QuZVNldChyZWZlcmVuY2UsIG51bGwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXNvbHZlUHJveGllcyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlpZiAocmVmT2JqZWN0ICE9IG51bGwpIHsKLQkJCXJlc29sdmVOb25Db250YWluZWRQcm94aWVzKHJlZk9iamVjdCk7Ci0JCQlyZXNvbHZlQ29udGFpbmVkUHJveGllcyhyZWZPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yY2UgYWxsIG9mIHRoZSBwcm94aWVzIHdpdGggPGNvZGU+cmVzb3VyY2U8L2NvZGU+IHRvIGJlIHJlc29sdmVkLgotCSAqLwotCXN0YXRpYyB2b2lkIGNoZWNrRm9yVW5yZXNvbHZhYmxlUHJveGllcyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXNvdXJjZVVSSU1hcCA9IG5ldyBIYXNoTWFwKCk7IC8vUmVzZXQgaGFzaG1hcCBvbiBlYWNoIGNhbGwKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUxpc3QgdG9wTGV2ZWxzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQkJCUVPYmplY3QgbW9mT2JqZWN0OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BMZXZlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQltb2ZPYmplY3QgPSAoRU9iamVjdCkgdG9wTGV2ZWxzLmdldChpKTsKLQkJCQlyZXNvbHZlUHJveGllcyhtb2ZPYmplY3QpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1J1bnRpbWVDbGFzc3BhdGhFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SdW50aW1lQ2xhc3NwYXRoRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4MWM2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1J1bnRpbWVDbGFzc3BhdGhFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLQotcHVibGljIGludGVyZmFjZSBSdW50aW1lQ2xhc3NwYXRoRW50cnkgewotCi0KLQkvKioKLQkgKiBUaGUgcmVzb2x2ZWQgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZW50cnkKLQkgKi8KLQlTdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQl2b2lkIHNldEFic29sdXRlUGF0aChTdHJpbmcgYWJzb2x1dGVQYXRoKTsKLQotCS8qKgotCSAqIEEgc2luZ2xlIHRva2VuIGZyb20gdGhlIENsYXNzLVBhdGg6IGF0dHJidXRlCi0JICovCi0JU3RyaW5nIGdldE1hbmlmZXN0VmFsdWUoKTsKLQotCXZvaWQgc2V0TWFuaWZlc3RWYWx1ZShTdHJpbmcgbWFuaWZlc3RWYWx1ZSk7Ci0KLQkvKioKLQkgKiB2YWxpZCBvbmx5IGlmIHRoaXMgZW50cnkgaXMgYSBsaWJyYXJ5IGluIGEgV0FSRmlsZSwgdW5kZXIgV0VCLUlORi9saWIKLQkgKi8KLQlXQVJGaWxlIGdldFdhckZpbGUoKTsKLQotCXZvaWQgc2V0V2FyRmlsZShXQVJGaWxlIGFXYXJGaWxlKTsKLQotCS8qKgotCSAqIHRydWUgaWYgdGhpcyBlbnRyeSBpcyBhIGxpYnJhcnkgaW4gYSBXQVIgZmlsZQotCSAqLwotCWJvb2xlYW4gaXNXZWJMaWIoKTsKLQotCS8qKgotCSAqIFRoZSByZXNvbHZlZCBhcmNoaXZlIGluc2lkZSBhbiBFQVIgdGhhdCB0aGlzIGVudHJ5IHBvaW50cyB0bzsgTm90ZSB0aGF0IHRoaXMgaXMgTk9UIHRoZQotCSAqIEFyY2hpdmUgdGhhdCBoYXMgdGhlIGVudHJ5IGluIHRoZSBtYW5pZmVzdCwgYnV0IHJhdGhlciB0aGUgcmVmZXJlbmNlZCBhcmNoaXZlLwotCSAqLwotCUFyY2hpdmUgZ2V0UmVmZXJlbmNlZEFyY2hpdmUoKTsKLQotCXZvaWQgc2V0UmVmZXJlbmNlZEFyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1J1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWY2MGNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBSdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsIGltcGxlbWVudHMgUnVudGltZUNsYXNzcGF0aEVudHJ5IHsKLQotCS8qKiBBIHNpbmdsZSB0b2tlbiBmcm9tIHRoZSBDbGFzcy1QYXRoOiBhdHRyYnV0ZSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFuaWZlc3RWYWx1ZTsKLQkvKiogVGhlIHJlc29sdmVkIGFic29sdXRlIHBhdGggb2YgdGhlIGVudHJ5ICovCi0JcHJvdGVjdGVkIFN0cmluZyBhYnNvbHV0ZVBhdGg7Ci0JLyoqIHZhbGlkIG9ubHkgaWYgdGhpcyBlbnRyeSBpcyBhIGxpYnJhcnkgaW4gYSBXQVJGaWxlLCB1bmRlciBXRUItSU5GL2xpYiAqLwotCXByb3RlY3RlZCBXQVJGaWxlIHdhckZpbGU7Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZSByZWZlcmVuY2VkQXJjaGl2ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYW5pZmVzdENsYXNzcGF0aEVudHJ5SW1wbC4KLQkgKi8KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZVBhdGguCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB7Ci0JCXJldHVybiBhYnNvbHV0ZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWJzb2x1dGVQYXRoLgotCSAqIAotCSAqIEBwYXJhbSBhYnNvbHV0ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZVBhdGggdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWJzb2x1dGVQYXRoKFN0cmluZyBhYnNvbHV0ZVBhdGgpIHsKLQkJdGhpcy5hYnNvbHV0ZVBhdGggPSBhYnNvbHV0ZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWFuaWZlc3RWYWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hbmlmZXN0VmFsdWUoKSB7Ci0JCXJldHVybiBtYW5pZmVzdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1hbmlmZXN0VmFsdWUuCi0JICogCi0JICogQHBhcmFtIG1hbmlmZXN0VmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBtYW5pZmVzdFZhbHVlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0VmFsdWUoU3RyaW5nIG1hbmlmZXN0VmFsdWUpIHsKLQkJdGhpcy5tYW5pZmVzdFZhbHVlID0gbWFuaWZlc3RWYWx1ZTsKLQl9Ci0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgd2FyRmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBXQVJGaWxlCi0JICovCi0JcHVibGljIFdBUkZpbGUgZ2V0V2FyRmlsZSgpIHsKLQkJcmV0dXJuIHdhckZpbGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgd2FyRmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gd2FyRmlsZQotCSAqICAgICAgICAgICAgVGhlIHdhckZpbGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0V2FyRmlsZShXQVJGaWxlIHdhckZpbGUpIHsKLQkJdGhpcy53YXJGaWxlID0gd2FyRmlsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgUnVudGltZUNsYXNzcGF0aEVudHJ5KQotCQkJcmV0dXJuIGdldEFic29sdXRlUGF0aCgpLmVxdWFscygoKFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSkgbykuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldEFic29sdXRlUGF0aCgpLmhhc2hDb2RlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSNpc1dlYkxpYigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXZWJMaWIoKSB7Ci0JCXJldHVybiB3YXJGaWxlICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVmZXJlbmNlZEFyY2hpdmUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGdldFJlZmVyZW5jZWRBcmNoaXZlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlZEFyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVmZXJlbmNlZEFyY2hpdmUuCi0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZWRBcmNoaXZlCi0JICogICAgICAgICAgICBUaGUgcmVmZXJlbmNlZEFyY2hpdmUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZEFyY2hpdmUoQXJjaGl2ZSByZWZlcmVuY2VkQXJjaGl2ZSkgewotCQl0aGlzLnJlZmVyZW5jZWRBcmNoaXZlID0gcmVmZXJlbmNlZEFyY2hpdmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1NhdmVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2F2ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU5NDUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2F2ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLQotLyoqCi0gKiBPYmplY3QgdXNlZCBmb3Igc2F2aW5nIGFuIGFyY2hpdmUgd2l0aCBvbmx5IGEgc3Vic2V0IG9mIGl0cyBmaWxlcy4gQnkgZGVmYXVsdCBhbGwgZmlsZXMgYXJlCi0gKiBzYXZlZC4gQ2xpZW50cyBjYW4gY3JlYXRlIGEgY3VzdG9tIGZpbHRlciBhbmQgc2V0IGl0IG9uIGEgc2F2ZSBzdHJhdGVneSwgYW5kIGNhbGwKLSAqIHtAbGluayBBcmNoaXZlI3NhdmUoU2F2ZVN0cmF0ZWd5KX0KLSAqLwotcHVibGljIGludGVyZmFjZSBTYXZlRmlsdGVyIHsKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciBhbiBlbGVtZW50IGluIHRoZSBhcmNoaXZlIGhhdmluZyB0aGUgdXJpIHNob3VsZCBiZSBzYXZlZDsgdGhlIHVyaSBtYXkgYmUgZm9yIGEKLQkgKiBmaWxlLCBhIG5lc3RlZCBhcmNoaXZlLCBvciBhIGxvYWRlZCBtb2YgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTYXZlKFN0cmluZyB1cmksIEFyY2hpdmUgYW5BcmNoaXZlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2F2ZUZpbHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2F2ZUZpbHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwNDFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1NhdmVGaWx0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci0KLQotCi0vKioKLSAqIERlZmF1bHQgZmlsdGVyIHdoaWNoIGFsbG93cyBhbGwgZWxlbWVtdHMgdG8gc2F2ZQotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUZpbHRlckltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXIgewotCS8qKgotCSAqIFNhdmVGaWx0ZXJJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNhdmVGaWx0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlRmlsdGVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkU2F2ZShqYXZhLmxhbmcuU3RyaW5nIHVyaSwgQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TZWxlY3RlZEZpbGVzRmlsdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TZWxlY3RlZEZpbGVzRmlsdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjgxZjcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2VsZWN0ZWRGaWxlc0ZpbHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMjMvMDEgMTE6MDQ6NTIgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsIGV4dGVuZHMgU2F2ZUZpbHRlckltcGwgewotCS8qKiBTZXQgb2YgZmlsZSB1cmlzIHRvIGJlIHNhdmVkICovCi0JcHJvdGVjdGVkIFNldCBzZWxlY3RlZEZpbGVOYW1lczsKLQotCS8qKgotCSAqIFNlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIHdpdGggYSBwcmVzZWxlY3RlZCBzdWJzZXQgb2YgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlIHRvIGJlIHNhdmVkOyBlYWNoIGVsZW1lbnQKLQkgKiBpbiB0aGUgbGlzdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGV9Ci0JICovCi0JcHVibGljIFNlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsKExpc3QgYXJjaGl2ZUZpbGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCVNldCBmaWxlTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyY2hpdmVGaWxlcy5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBhcmNoaXZlRmlsZXMuZ2V0KGkpOwotCQkJZmlsZU5hbWVzLmFkZChhRmlsZS5nZXRVUkkoKSk7Ci0JCX0KLQkJc2V0U2VsZWN0ZWRGaWxlTmFtZXMoZmlsZU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJhbWV0ZXIgbXVzdCBiZSBhIHNldCBvZiB2YWxpZCB1cmlzIGluIHRoZSBhcmNoaXZlCi0JICovCi0JcHVibGljIFNlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsKFNldCBmaWxlTmFtZXMpIHsKLQkJc3VwZXIoKTsKLQkJc2V0U2VsZWN0ZWRGaWxlTmFtZXMoZmlsZU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8yMy8wMSAxMToxOTowMSBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5TZXQKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLlNldCBnZXRTZWxlY3RlZEZpbGVOYW1lcygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkRmlsZU5hbWVzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzIzLzAxIDExOjE5OjAxIEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTZWxlY3RlZEZpbGVOYW1lcwotCSAqICAgICAgICAgICAgamF2YS51dGlsLlNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkRmlsZU5hbWVzKGphdmEudXRpbC5TZXQgbmV3U2VsZWN0ZWRGaWxlTmFtZXMpIHsKLQkJc2VsZWN0ZWRGaWxlTmFtZXMgPSBuZXdTZWxlY3RlZEZpbGVOYW1lczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTYXZlKGphdmEubGFuZy5TdHJpbmcgdXJpLCBBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlyZXR1cm4gZ2V0U2VsZWN0ZWRGaWxlTmFtZXMoKS5jb250YWlucyh1cmkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQWx0UmVzb3VyY2VSZWdpc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BbHRSZXNvdXJjZVJlZ2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1M2Q3YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BbHRSZXNvdXJjZVJlZ2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIEFsdFJlc291cmNlUmVnaXN0ZXIgewotCXByb3RlY3RlZCBzdGF0aWMgU2V0IHJlZ2lzdGVyZWRVUklzID0gbmV3IEhhc2hTZXQoKTsKLQotCXByb3RlY3RlZCBBbHRSZXNvdXJjZVJlZ2lzdGVyKCkgewotCQkvL0RlZmF1bHQKLQl9Ci0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyBhbiBBcmNoaXZlIHJlbGF0aXZlIHBhdGggZm9yIHRoZSByZXNvdXJjZSB3aGljaCBjYW4gYmUgY29waWVkIHVwIGFzIGFuIGFsdCBpbiBhbgotCSAqIEVBUiBmaWxlLiBUaGUgdXJpIHNob3VsZCBiZSBpbiBjYW5hbm9uaWNhbCBmb3JtIGFuZCB1c2UgdGhlIGZvcndhcmQgc2xhc2gsIGVnLAotCSAqICJNRVRBLUlORi92ZW5kb3ItZXh0ZW5zaW9ucy54bWkiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVVJJKFN0cmluZyB1cmkpIHsKLQkJcmVnaXN0ZXJlZFVSSXMuYWRkKHVyaSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlUmVnaXN0ZXJVUkkoU3RyaW5nIHVyaSkgewotCQlyZWdpc3RlcmVkVVJJcy5yZW1vdmUodXJpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWdpc3RlcmVkKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIHJlZ2lzdGVyZWRVUklzLmNvbnRhaW5zKHVyaSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTZXQgZ2V0UmVnaXN0ZXJlZFVSSXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQocmVnaXN0ZXJlZFVSSXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTA4OTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsIGV4dGVuZHMgTW9kdWxlRmlsZUltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50IGRlcGxveW1lbnREZXNjcmlwdG9yID0gbnVsbDsKLQotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFOwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGNhbid0IG92ZXJyaWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGdlbmVyYXRlZAotCSAqICAgICAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJQXBwbGljYXRpb25DbGllbnQgZGQgPSB0aGlzLmdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCk7Ci0JCWlmIChkZCA9PSBudWxsICYmIGNhbkxhenlJbml0aWFsaXplKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0SW1wb3J0U3RyYXRlZ3koKS5pbXBvcnRNZXRhRGF0YSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCksIGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuaW1wbC5Nb2R1bGVGaWxlSW1wbAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERlcGxveWVtZW50RGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5pbXBsLk1vZHVsZUZpbGVJbXBsCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IG1ha2VEZXBsb3ltZW50RGVzY3JpcHRvcihYTUxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlBcHBsaWNhdGlvbkNsaWVudCBhQ2xpZW50ID0gKChDbGllbnRQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpKS5nZXRDbGllbnRGYWN0b3J5KCkuY3JlYXRlQXBwbGljYXRpb25DbGllbnQoKTsKLQkJcmVzb3VyY2Uuc2V0SUQoYUNsaWVudCwgSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0lEKTsKLQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oYUNsaWVudCk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGFDbGllbnQpOwotCQlyZXR1cm4gYUNsaWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihBcHBsaWNhdGlvbkNsaWVudCBsKSB7Ci0JCXRoaXMuc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4obCk7Ci0JCXJlcGxhY2VSb290KGdldE1vZlJlc291cmNlTWFrZUlmTmVjZXNzYXJ5KGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkpLCBsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBnZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpIHsKLQkJaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGwgJiYgZGVwbG95bWVudERlc2NyaXB0b3IuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERlcGxveW1lbnREZXNjcmlwdG9yID0gKEludGVybmFsRU9iamVjdClkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJCWRlcGxveW1lbnREZXNjcmlwdG9yID0gKEFwcGxpY2F0aW9uQ2xpZW50KWVSZXNvbHZlUHJveHkob2xkRGVwbG95bWVudERlc2NyaXB0b3IpOwotCQkJaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG9sZERlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiwgb2xkRGVwbG95bWVudERlc2NyaXB0b3IsIGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKEFwcGxpY2F0aW9uQ2xpZW50IG5ld0RlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50IG9sZERlcGxveW1lbnREZXNjcmlwdG9yID0gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWRlcGxveW1lbnREZXNjcmlwdG9yID0gbmV3RGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChBcHBsaWNhdGlvbkNsaWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoQXBwbGljYXRpb25DbGllbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0OTA1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlVdGlsaXR5OwotCi0KLS8qKgotICogT3ZlclJpZGUgY2xhc3MgdG8gdXNlIHRoZSBwcm9wZXIgY29weWluZyBvZiBYTUxSZXNvdXJjZSBkb2N0eXBlcy4gSGFkIHRvIGNyZWF0ZSB0aGlzIGNsYXNzIER1ZSB0bwotICogdGhlIHdheSBpdCdzIGhhbmRsZWQgaW4gdGhlIGNvcHkgY29tbWFuZHMgb2YgRXRvb2xzQ29weVV0aWxpdHkKLSAqIAotICogQ3JlYXRpb24gZGF0ZTogKDExLzE4LzAxIDg4ODg4ODg4OjQ4IFBNKQotICogCi0gKiBAYXV0aG9yOiBKYXJlZCBKdXJraWV3aWN6Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5IGV4dGVuZHMgRXRvb2xzQ29weVNlc3Npb24gewotCXB1YmxpYyBFT2JqZWN0IGNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBzdXBlci5jb3B5KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJaWYgKGNvcGllZCBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpCi0JCQljb3B5UHJpbUtleUluZm8oKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGFSZWZPYmplY3QsIChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBjb3BpZWQpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IHByaW1Db3B5KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUVPYmplY3QgY29waWVkID0gc3VwZXIucHJpbUNvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlpZiAoY29waWVkIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkKLQkJCWNvcHlQcmltS2V5SW5mbygoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYVJlZk9iamVjdCwgKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGNvcGllZCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkoRXRvb2xzQ29weVV0aWxpdHkgYUNvcHlVdGlsaXR5KSB7Ci0JCXN1cGVyKGFDb3B5VXRpbGl0eSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYuZWNvcmUudXRpbGl0aWVzLmNvcHkuRXRvb2xzQ29weVNlc3Npb24jbmV3SW5zdGFuY2UoUmVzb3VyY2UsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgbmV3SW5zdGFuY2UoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7Ci0JCVJlc291cmNlIGNvcHlSZXNvdXJjZSA9IHN1cGVyLm5ld0luc3RhbmNlKGFSZXNvdXJjZSwgbmV3VXJpKTsKLQotCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpCi0JCQkoKFhNTFJlc291cmNlKSBjb3B5UmVzb3VyY2UpLnNldFZlcnNpb25JRCgoKFhNTFJlc291cmNlKSBhUmVzb3VyY2UpLmdldFZlcnNpb25JRCgpKTsKLQkJcmV0dXJuIGNvcHlSZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5SWZGb3VuZChFT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCUVPYmplY3QgY29waWVkT2JqZWN0ID0gc3VwZXIuZ2V0Q29weUlmRm91bmQoYW5PYmplY3QpOwotCQlpZiAoKGFuT2JqZWN0IGluc3RhbmNlb2YgSmF2YUNsYXNzKSAmJiAoYW5PYmplY3QgPT0gY29waWVkT2JqZWN0KSkgewotCQkJY29waWVkT2JqZWN0ID0gbmV3SW5zdGFuY2UoYW5PYmplY3QpOwotCQkJVVJJIHVyaSA9IEVjb3JlVXRpbC5nZXRVUkkoYW5PYmplY3QpOwotCQkJKChJbnRlcm5hbEVPYmplY3QpIGNvcGllZE9iamVjdCkuZVNldFByb3h5VVJJKHVyaSk7Ci0JCX0KLQkJcmV0dXJuIGNvcGllZE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjb3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUVPYmplY3QgY29waWVkID0gc3VwZXIuY29weU9iamVjdChhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCWlmIChjb3BpZWQgaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KQotCQkJY29weVByaW1LZXlJbmZvKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBhUmVmT2JqZWN0LCAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgY29waWVkKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb3B5UHJpbUtleUluZm8oQ29udGFpbmVyTWFuYWdlZEVudGl0eSBzb3VyY2UsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY29waWVkKSB7Ci0JCUNNUEF0dHJpYnV0ZSBwcmltS2V5RmllbGQgPSBzb3VyY2UuZ2V0UHJpbUtleUZpZWxkKCk7Ci0JCWlmIChwcmltS2V5RmllbGQgIT0gbnVsbCkKLQkJCWNvcGllZC5zZXRQcmltS2V5RmllbGQocHJpbUtleUZpZWxkKTsKLQl9Ci0KLQkvKgotCSAqIFN1cGVyIGNsYXNzIG92ZXJyaWRlIHRvIGhhbmRsZSB1bnJlc29sdmFibGUgcHJveGllcyAoSmF2YUNsYXNzKQotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weVJlZmVyZW5jZShFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJaWYgKGFSZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCWlmIChzaG91bGRDb3B5UmVmZXJlbmNlKGFSZWZlcmVuY2UsIGFSZWZPYmplY3QpKSB7IC8vIEJ1Z3ppbGxhIDE3NzM5NwotCQkJCUxpc3QgdmFsdWUgPSAoTGlzdCkgYVJlZk9iamVjdC5lR2V0KGFSZWZlcmVuY2UpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCQljb3B5TWFueVJlZmVyZW5jZShhUmVmZXJlbmNlLCB2YWx1ZSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQkJfQotCQl9IGVsc2UgaWYgKGFSZWZPYmplY3QuZUlzU2V0KGFSZWZlcmVuY2UpKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBhUmVmT2JqZWN0LmVHZXQoYVJlZmVyZW5jZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQl2YWx1ZSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBhUmVmT2JqZWN0KS5lR2V0KGFSZWZlcmVuY2UsIGZhbHNlKTsKLQkJCWNvcHlTaW5nbGVSZWZlcmVuY2UoYVJlZmVyZW5jZSwgKEVPYmplY3QpIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5Db25zdGFudCBpbnRyb2R1Y2VkIGZvciBidWd6aWxsYSAxNzczOTc6IFRoZSBuYW1lIG9mIHRoZSBDTVAgJ2tleUF0dHJpYnV0ZXMnCi0gICAgICogYXR0cmlidXRlLCB3aGljaCBpcyBub3QgdG8gYmUgY29waWVkIGlmIGluIGFuIHVuaW5pdGlhbGl6ZWQgc3RhdGUuPC9wPgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNUF9LRVlfQVRUUklCVVRFU19OQU1FID0gImtleUF0dHJpYnV0ZXMiOwotCi0gICAgLyoqCi0gICAgICogPHA+VGVzdCBpbnRyb2R1Y2VkIGZvciBidWd6aWxsYSAxNzczOTc6IFRlbGwgaWYgYSBzcGVjaWZpZWQgcmVmZXJlbmNlCi0gICAgICogc2hvdWxkIGJlIGNvcGllZC4gIFRoaXMgaW1wbGVtZW50YXRpb24gY2hlY2tzIGZvciBhIENNUCBCZWFuLCBhbmQgZm9yCi0gICAgICogdGhlIGtleSBhdHRyaWJ1dGVzIGF0dHJpYnV0ZSwgYW5kIGFuc3dlcnMgZmFsc2Ugd2hlbiB0aGlzIGF0dHJpYnV0ZQotICAgICAqIGlzIGluIGFuIHVuaW5pdGlhbGl6ZWQgc3RhdGUuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoaXMgYXR0cmlidXRlIGlzIGluaXRpYWxpemVkIHVzaW5nIHJlZmxlY3Rpb247IHRoZXJlIGFyZSBjb3B5IGNhc2VzCi0gICAgICogd2hlcmUgdGhlIHBhcmVudCBFSkIgSmFyIGRvZXMgbm90IGhhdmUgaXRzIGZ1bGwgY2xhc3NwYXRoIGVudmlyb25tZW50Ci0gICAgICogYXZhaWxhYmxlLCB3aGljaCBwcmV2ZW50cyB0aGUgbG9hZGluZyBvZiBkZXBlbmRlbnQgY2xhc3Nlcy4gIFNpbmNlIHRoZQotICAgICAqIGluaXRpYWxpemF0aW9uIGlzIGxhenksIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzb2x2ZSB0aGlzIHdoZW4gY29weWluZzsKLSAgICAgKiBhY2Nlc3MgdG8gdGhlIGNvcHkgdGFyZ2V0IGNhbiBwZXJmb3JtIHRoZSBpbml0aWFsaXphdGlvbi48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYVJlZmVyZW5jZSBUaGUgcmVmZXJlbmNlIGF0dHJpYnV0ZSBiZWluZyBjb3BpZWQuCi0gICAgICogQHBhcmFtIGFSZWZPYmplY3QgVGhlIG1vZGVsIG9iamVjdCBiZWluZyBjb3BpZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlIGlzIHRvIGJlIGNvcGllZC4KLSAgICAgKiAgICAgICAgIEZhbHNlIGlmIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlIGlzIG5vdCB0byBiZSBjb3BpZWQuCi0gICAgICovCi0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQ29weVJlZmVyZW5jZShFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIEVPYmplY3QgYVJlZk9iamVjdCkKLSAgICB7ICAgICAgICAKLSAgICAgICAgaWYgKCAhKGFSZWZPYmplY3QgaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5SW1wbCkgfHwKLSAgICAgICAgICAgICAhYVJlZmVyZW5jZS5nZXROYW1lKCkuZXF1YWxzKENNUF9LRVlfQVRUUklCVVRFU19OQU1FKSApCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgICAgCi0gICAgICAgIAotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5SW1wbCBjbXBCZWFuID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsKSBhUmVmT2JqZWN0OwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNtcEJlYW4uZ2V0SXNJbml0aWFsaXplZEtleUF0dHJpYnV0ZXMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVDb3B5VXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlQ29weVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5YmM2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVDb3B5VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkRlZmF1bHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkNvcHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlVdGlsaXR5OwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTgvMDAgNjoyNjo0OCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUNvcHlVdGlsaXR5IGV4dGVuZHMgRXRvb2xzQ29weVV0aWxpdHkgewotCS8qKgotCSAqIE1vZHVsZUZpbGVDb3B5VXRpbHRpdHkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZUNvcHlVdGlsaXR5KCkgewotCQlzdXBlcigpOwotCQlzZXRDb3B5QWRhcHRlcnModHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiBFbmQgb2YgY29kZSBwdWxsZWQgZnJvbSBFdG9vbHNDb3B5VXRpbGl0eSB0byBvdmVyLXJpZGUgdGhlIHByaW1Db3B5IG1ldGhvZC4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weShFUmVmZXJlbmNlIHJlZmVyZW5jZSwgRU9iamVjdCBhVmFsdWUsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQlpZiAoKChEZWZhdWx0YWJsZSkgYVZhbHVlKS5pc0RlZmF1bHQoKSkKLQkJCXJldHVybjsKLQkJc3VwZXIuYWRkRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5KHJlZmVyZW5jZSwgYVZhbHVlLCBpZFN1ZmZpeCwgYUNvcHlDb250YWluZXIpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3QgY29weShBcmNoaXZlTWFuaWZlc3QgbWYpIHsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQltZi53cml0ZShvdXQpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpOwotCQkJcmV0dXJuIG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKGluKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQkvL1RoaXMgc2hvdWxkIGFsbW9zdCBuZXZlciBoYXBwZW4sIHVubGVzcyB0aGVyZSBpcyBhbiBpc3N1cmUgd2l0aCBtZW1vcnkgYWxsb2NhdGlvbgotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuSU9FeGNlcHRpb25fb2NjdXJyZWRfd2hpbGVfRVhDXywgaW94KTsgLy8gPSAiSU9FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgY29weWluZyBtYW5pZmVzdCIKLQkJfQotCX0KLQotCXB1YmxpYyBBcmNoaXZlIGNvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQotCQkvL0ZpcnN0IGNyZWF0ZSBhIGNvcHkgZ3JvdXAgYW5kIGNvcHkgdXRpbDsgY29weSB0aGUgYXJjaGl2ZSBhbmQgYWxsIGl0cyByZXNvdXJjZXMKLQkJQ29weUdyb3VwIGNvcHlHcm91cCA9IG5ldyBDb3B5R3JvdXAoKTsKLQkJY29weUdyb3VwLnNldFByZXNlcnZlSWRzKHRydWUpOwotCQlwcmVwYXJlUmVzb3VyY2VzRm9yQ29weShhbkFyY2hpdmUsIGNvcHlHcm91cCk7Ci0JCWNvcHlHcm91cC5hZGQoYW5BcmNoaXZlKTsKLQkJdGhpcy5jb3B5KGNvcHlHcm91cCk7Ci0KLQkJQXJjaGl2ZSBjb3BpZWRBcmNoaXZlID0gKEFyY2hpdmUpIGdldENvcHkoYW5BcmNoaXZlKTsKLQotCQlmaW5pc2hDb3B5KGFuQXJjaGl2ZSwgY29waWVkQXJjaGl2ZSwgY29weUdyb3VwKTsKLQkJcmV0dXJuIGNvcGllZEFyY2hpdmU7Ci0JfQotCi0JcHVibGljIE1vZHVsZUZpbGUgY29weShNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB7Ci0JCS8qKgotCQkgKiBUaW1pbmcgaXNzdWU7IGlmIHRoZSByZXNvdXJjZXMgY29udGFpbmluZyB0aGUgYmluZGluZ3MsIGV4dGVuc2lvbnMsIGFuZCBkZCBoYXZlIG5vdCB5ZXQKLQkJICogYmUgbG9hZGVkLCBmb3JjZSB0aGF0IGJlZm9yZSB0aGUgY29weSBvY2N1cnM7IG90aGVyd2lzZSwgdGhleSB3aWxsIGdldCBsb2FkZWQgYXMgdGhlCi0JCSAqIGFjY2Vzc29ycyBhcmUgaW52b2tlZCBkdXJpbmcgY29weS4gQmVjYXVzZSB0aGV5IHdpbGwgYmUgbG9hZGVkIGJ1dCBub3QgY29waWVkIGludG8gdGhlCi0JCSAqIG5ldyBhcmNoaXZlJ3MgY29udGV4dCwgdGhlbiBjaGFuZ2VzIHdpbGwgbm90IGdldCBzYXZlZC4gQnkgZm9yY2luZyB0aGUgbG9hZCBiZWZvcmUgdGhlCi0JCSAqIGNvcHkgY29tbWVuY2VzLCB0aGUgbG9hZGVkIHJlc291cmNlcyB3aWxsIGFsc28gYmUgY29waWVkIHRvIHRoZSBuZXcgYXJjaGl2ZQotCQkgKi8KLQkJYU1vZHVsZUZpbGUuZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCS8qCi0JCSAqIFJMUy04LzEyLzIwMDIgSGFjayB0byBmaXggYm90cCBkZWZlY3QgIjE0MTY0MC1mYWlsZWQgdG8gaW5zdGFsbCAud2FyIGZpbGUgd2l0aAotCQkgKiBmaWx0ZXItbWFwcGluZyIgVGhlIHByb2JsZW0gaXMgdGhhdCB0aGVyZSBpcyBhIHRyYW5zaWVudCBmaWVsZCBvbiB0aGUgZmlsdGVyIG1hcHBpbmcKLQkJICogY2xhc3MgZm9yIHRoZSBzZXJ2bGV0IG5hbWUgdGhlIHJlbGF0aW9uc2hpcCB0byB0aGUgc2VydmxldCBpcyBsYXppbHkgcG9wdWxhdGVkIHRoZSBmaXJzdAotCQkgKiB0aW1lIGl0IGlzIHJlcXVlc3RlZC4gSWYgd2UgZG9uJ3QgdHJpcCBpdCwgdGhlbiBpdCB3b24ndCBnZXQgY29waWVkLgotCQkgKi8KLQotCQlpZiAoYU1vZHVsZUZpbGUuaXNXQVJGaWxlKCkpIHsKLQkJCUxpc3QgZmlsdGVyTWFwcGluZ3MgPSAoKFdBUkZpbGUpIGFNb2R1bGVGaWxlKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpbHRlck1hcHBpbmdzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlck1hcHBpbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQkJKChGaWx0ZXJNYXBwaW5nKSBmaWx0ZXJNYXBwaW5ncy5nZXQoaSkpLmdldFNlcnZsZXQoKTsKLQkJCX0KLQkJfQotCQlNb2R1bGVGaWxlIGNvcGllZCA9IChNb2R1bGVGaWxlKSBjb3B5KChBcmNoaXZlKSBhTW9kdWxlRmlsZSk7Ci0KLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyB3ZXJlIHB1bGxlZCBvdXQgb2YgRXRvb2xzQ29weVV0aWxpdHkgc28gd2UgY2FuIG92ZXItcmlkZSB0aGUKLQkgKiBFdG9vbHNDb3B5U2Vzc2lvbiBvYmplY3Qgd2l0aCBvdXIgb3duIHN1Y2ggdGhhdCBkb2ljdHlwZXMgZG8gZ2V0IHByZXNlcnZlZCB3aXRoIFhNTAotCSAqIFJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5KENvcHlHcm91cCBhR3JvdXApIHsKLQkJaWYgKGFHcm91cCAhPSBudWxsKSB7Ci0JCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkodGhpcyk7Ci0JCQlzZXNzaW9uLnNldFByZXNlcnZlSWRzKGFHcm91cC5nZXRQcmVzZXJ2ZUlkcygpKTsKLQkJCXNlc3Npb24uY29weShhR3JvdXApOwotCQkJc2Vzc2lvbi5mbHVzaCgpOwotCQl9Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkodGhpcyk7Ci0JCUVPYmplY3QgY29waWVkID0gc2Vzc2lvbi5jb3B5KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJc2Vzc2lvbi5mbHVzaCgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkodGhpcyk7Ci0JCVJlc291cmNlIGNvcGllZCA9IHNlc3Npb24uY29weShhUmVzb3VyY2UsIG5ld1VyaSk7Ci0JCXNlc3Npb24uZmx1c2goKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5SW1wb3J0U3RyYXRlZ3lJZk5lY2Vzc2FyeShNb2R1bGVGaWxlIGFNb2R1bGVGaWxlLCBNb2R1bGVGaWxlIGNvcHkpIHsKLQkJaWYgKCFhTW9kdWxlRmlsZS5pc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkpCi0JCQljb3B5LnNldEltcG9ydFN0cmF0ZWd5KGFNb2R1bGVGaWxlLmdldEltcG9ydFN0cmF0ZWd5KCkuY3JlYXRlSW1wb3J0U3RyYXRlZ3koYU1vZHVsZUZpbGUsIGNvcHkpKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjb3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eSh0aGlzKTsKLQkJRU9iamVjdCBjb3BpZWQgPSBzZXNzaW9uLmNvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUNvcHkoQ29weUdyb3VwIGFHcm91cCkgewotCQlBcmNoaXZlQ29weVV0aWxpdHkgdXRpbGl0eSA9IG5ldyBBcmNoaXZlQ29weVV0aWxpdHkoKTsKLQkJdXRpbGl0eS5jb3B5KGFHcm91cCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmluaXNoQ29weShBcmNoaXZlIHNvdXJjZSwgQXJjaGl2ZSBjb3B5LCBDb3B5R3JvdXAgZ3JvdXApIHsKLQotCQljb3B5LnNldExvYWRTdHJhdGVneShnZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVtcHR5TG9hZFN0cmF0ZWd5KCkpOwotCQljb3B5LnNldEV4dHJhQ2xhc3NwYXRoKHNvdXJjZS5nZXRFeHRyYUNsYXNzcGF0aCgpKTsKLQkJY29weS5zZXRYbWxFbmNvZGluZyhzb3VyY2UuZ2V0WG1sRW5jb2RpbmcoKSk7Ci0JCWlmIChzb3VyY2UuaXNNYW5pZmVzdFNldCgpKSB7Ci0JCQljb3B5LnNldE1hbmlmZXN0KGNvcHkoc291cmNlLmdldE1hbmlmZXN0KCkpKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJRmlsZSBtYW5pZmVzdFRvQ29weSA9IHNvdXJjZS5nZXRGaWxlKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKLQkJCQlpZiAobWFuaWZlc3RUb0NvcHkgIT0gbnVsbCkgewotCQkJCQlGaWxlIGNvcGllZE1hbmlmZXN0ID0gKEZpbGUpIGdldENvcHkobWFuaWZlc3RUb0NvcHkpOwotCQkJCQljb3BpZWRNYW5pZmVzdC5zZXRMb2FkaW5nQ29udGFpbmVyKG1hbmlmZXN0VG9Db3B5LmdldExvYWRpbmdDb250YWluZXIoKSk7Ci0JCQkJCWNvcHkuYWRkQ29weShjb3BpZWRNYW5pZmVzdCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfSBjYXRjaCAoRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JCXJldHJpZXZlUmVzb3VyY2VzRnJvbUNvcHkoY29weSwgZ3JvdXApOwotCi0JCWlmIChzb3VyY2UuaXNNb2R1bGVGaWxlKCkpCi0JCQljb3B5SW1wb3J0U3RyYXRlZ3lJZk5lY2Vzc2FyeSgoTW9kdWxlRmlsZSkgc291cmNlLCAoTW9kdWxlRmlsZSkgY29weSk7Ci0KLQkJTGlzdCBmaWxlcyA9IHNvdXJjZS5nZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLQkJCUZpbGUgY29waWVkRmlsZSA9IChGaWxlKSBnZXRDb3B5KGFGaWxlKTsKLQkJCWNvcGllZEZpbGUuc2V0TG9hZGluZ0NvbnRhaW5lcihhRmlsZS5nZXRMb2FkaW5nQ29udGFpbmVyKCkpOwotCQkJaWYgKGFGaWxlLmlzQXJjaGl2ZSgpKQotCQkJCWZpbmlzaE5lc3RlZENvcHkoKEFyY2hpdmUpIGFGaWxlLCAoQXJjaGl2ZSkgY29waWVkRmlsZSk7Ci0JCX0KLQkJLy9Ob3RpZmljYXRpb24gd2FzIHN1c3BlbmRlZCBkdXJpbmcgY29weTsgdGhlcmVmb3JlIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBmaWxlcwotCQkvL0luIHRoZSBhcmNoaXZlIGdldCBpbmRleGVkCi0JCWNvcHkucmVidWlsZEZpbGVJbmRleCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbmlzaE5lc3RlZENvcHkoQXJjaGl2ZSBzb3VyY2UsIEFyY2hpdmUgY29weSkgewotCi0JCUNvcHlHcm91cCBncm91cCA9IG5ldyBDb3B5R3JvdXAoKTsKLQkJcHJlcGFyZVJlc291cmNlc0ZvckNvcHkoc291cmNlLCBncm91cCk7Ci0JCWNvcHkoZ3JvdXApOwotCQlmaW5pc2hDb3B5KHNvdXJjZSwgY29weSwgZ3JvdXApOwotCX0KLQotCXByaXZhdGUgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlUmVzb3VyY2VzRm9yQ29weShBcmNoaXZlIGFuQXJjaGl2ZSwgQ29weUdyb3VwIGNvcHlHcm91cCkgewotCQlJdGVyYXRvciBpdGVyID0gYW5BcmNoaXZlLmdldExvYWRlZE1vZlJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFBcmNoaXZlVXRpbC5pc0phdmFSZXNvdXJjZShyZXNvdXJjZSkpCi0JCQkJY29weUdyb3VwLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXRyaWV2ZVJlc291cmNlc0Zyb21Db3B5KEFyY2hpdmUgY29waWVkQXJjaGl2ZSwgQ29weUdyb3VwIGNvcHlHcm91cCkgewotCi0JCUxpc3QgcmVzb3VyY2VzID0gY29weUdyb3VwLmdldENvcGllZFJlc291cmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2UgY29waWVkUmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQljb3BpZWRBcmNoaXZlLmFkZE9yUmVwbGFjZU1vZlJlc291cmNlKGNvcGllZFJlc291cmNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhNDU5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkay5KYXZhSkRLQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uTWFuaWZlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZW9wZW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5SdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5SdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5EaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5DbGFzc3BhdGhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlSW1wbCBleHRlbmRzIENvbnRhaW5lckltcGwgaW1wbGVtZW50cyBBcmNoaXZlIHsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVzKCkgPGVtPlR5cGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRUeXBlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHR5cGVzID0gbnVsbDsKLQotCS8qKiBPdXIgc3BlY2lhbGl6ZWQgbWFuaWZlc3QgKi8KLQlwcm90ZWN0ZWQgQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0OwotCi0JLyoqIEltcGxlbWVudGVyIGZvciBzYXZpbmcgdGhpcyBhcmNoaXZlICovCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBzYXZlU3RyYXRlZ3k7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCBmaWx0ZXIgZm9yIHNhdmluZyBhIHN1YnNldCBvZiBmaWxlczsgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCBmb3IgYWxsIHNhdmUgYW5kIGV4dHJhY3QKLQkgKiBpbnZva2F0aW9ucwotCSAqLwotCXByb3RlY3RlZCBTYXZlRmlsdGVyIHNhdmVGaWx0ZXI7Ci0KLQkvKiogRW5jb2RpbmcgdG8gYmUgdXNlZCBmb3IgYWxsIHhtaSByZXNvdXJjZXMgYW5kIHhtbCBkZHM7IGRlZmF1bHRzIHRvIFVURi04ICovCi0JcHJvdGVjdGVkIFN0cmluZyB4bWxFbmNvZGluZyA9IEoyRUVDb25zdGFudHMuREVGQVVMVF9YTUxfRU5DT0RJTkc7Ci0KLQkvKiogQ3VzdG9tIGNsYXNzIGxvYWRlciB1c2VkIHRvIGxvYWQgY2xhc3NlcyBmcm9tIHRoZSBhcmNoaXZlICovCi0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGFyY2hpdmVDbGFzc0xvYWRlcjsKLQotCS8qKgotCSAqIHBhdGggb2YgdGhlIHN0YW5kYXJkIGNsYXNzcGF0aCBmb3JtYXQgd2hlcmUgdGhlIGFyY2hpdmUgbWF5IGxvb2sgZm9yIGNsYXNzZXMgbm90IGZvdW5kIGluIHRoZQotCSAqIHN5c3RlbSBjbGFzc3BhdGggb3IgaW4gdGhlIGFyY2hpdmUgLSB1c2VkIGZvciBqYXZhIHJlZmxlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhQ2xhc3NwYXRoOwotCi0JcHJvdGVjdGVkIEFyY2hpdmVPcHRpb25zIG9wdGlvbnM7Ci0KLQlwdWJsaWMgQXJjaGl2ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuYXJjaGl2ZU9wZW5lZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5BUkNISVZFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VHlwZXMoKSB7Ci0JCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0JCQl0eXBlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1RZUEVTKTsKLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19UWVBFUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19UWVBFUzoKLQkJCQlnZXRUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1RZUEVTOgotCQkJCWdldFR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIHR5cGVzICE9IG51bGwgJiYgIXR5cGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGFkZENvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJY2hlY2tBZGRWYWxpZChhbkFyY2hpdmUpOwotCQlBcmNoaXZlIGNvcHkgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNvcHkoYW5BcmNoaXZlKTsKLQkJZ2V0RmlsZXMoKS5hZGQoY29weSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlIEFkZHMgYSBjb3B5IG9mIHRoZSBwYXJhbWV0ZXIgdG8gdGhpcyBhcmNoaXZlCi0JICogQHRocm93cyBjb20uaWJtLmV0b29scy5hcmNoaXZlLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgYXJjaGl2ZSBhbHJlYWR5IGNvbnRhaW5zIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdXJpCi0JICovCi0JcHVibGljIEZpbGUgYWRkQ29weShGaWxlIGFGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlLmlzUmVhZE9ubHlEaXJlY3RvcnkoKSkgewotCQkJYWRkQ29weSgoUmVhZE9ubHlEaXJlY3RvcnkpIGFGaWxlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWNoZWNrQWRkVmFsaWQoYUZpbGUpOwotCQlGaWxlIGNvcHkgPSBjb3B5KGFGaWxlKTsKLQkJZ2V0RmlsZXMoKS5hZGQoY29weSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCS8qKgotCSAqIEdldCBhIGZsYXR0ZW5lZCBsaXN0IGZyb20gdGhlIGRpcmVjdG9yeSwgdGhlbiBhZGRDb3B5IHRoZSBsaXN0Ci0JICogCi0JICogQHRocm93cyBjb20uaWJtLmV0b29scy5hcmNoaXZlLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIGZpbGUgd2l0aCBhIHVyaSB0aGF0IGVxdWFscyBvbmUgb2YgdGhlIG5lc3RlZCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGV4aXN0cwotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QgdGhlIGNvcGllZCBmaWxlcyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgYWRkQ29weShSZWFkT25seURpcmVjdG9yeSBkaXIpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGFkZENvcHlGaWxlcyhkaXIuZ2V0RmlsZXNSZWN1cnNpdmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgTGlzdCBhZGRDb3B5RmlsZXMoamF2YS51dGlsLkxpc3QgbGlzdCkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQkvL09wdGltaXphdGlvbiAtIG1ha2Ugc3VyZSB0aGUgZmlsZUluZGV4IGlzIGFscmVhZHkgYnVpbHQgdG8gc3BlZWQgdXAKLQkJLy8gY29udGFpbnNGaWxlCi0JCWdldEZpbGVzKCk7Ci0JCUxpc3QgY29weUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBsaXN0LmdldChpKTsKLQkJCWNoZWNrQWRkVmFsaWQoYUZpbGUpOwotCQkJY29weUxpc3QuYWRkKGNvcHkoYUZpbGUpKTsKLQkJfQotCQlnZXRGaWxlcygpLmFkZEFsbChjb3B5TGlzdCk7Ci0JCXJldHVybiBjb3B5TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE9yUmVwbGFjZU1vZlJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJZ2V0TG9hZFN0cmF0ZWd5KCkuYWRkT3JSZXBsYWNlTW9mUmVzb3VyY2UoYVJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKX0KLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNsb3NlKCkgewotCQlyZXR1cm4gIWdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24odGhpcykuaXNFbXB0eSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrQWRkVmFsaWQoRmlsZSBhRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWNoZWNrQWRkVmFsaWQoYUZpbGUuZ2V0VVJJKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrQWRkVmFsaWQoU3RyaW5nIGFVcmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQl0cnkgewotCQkJRmlsZSBmID0gZ2V0RmlsZShhVXJpKTsKLQkJCWlmIChmICE9IG51bGwpCi0JCQkJdGhyb3cgbmV3IER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmR1cGxpY2F0ZV9maWxlX0VYQ18sIChuZXcgT2JqZWN0W117Z2V0VVJJKCksIGFVcml9KSksIGYpOyAvLyA9ICJUaGUgYXJjaGl2ZSBuYW1lZCB7MH0gYWxyZWFkeSBjb250YWlucyBhIGZpbGUgbmFtZWQgezF9IgotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gb2spIHsKLQkJCS8vSWdub3JlCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgYVVyaSwgamF2YS5pby5GaWxlIG9yaWdpbmFsLCBqYXZhLmlvLkZpbGUgZGVzdGluYXRpb25GaWxlKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCi0JCWNoZWNrV3JpdGVhYmxlKG9yaWdpbmFsKTsKLQkJYm9vbGVhbiBkZWxldGVXb3JrZWQgPSBmYWxzZTsKLQkJaWYgKG9yaWdpbmFsLmlzRGlyZWN0b3J5KCkgJiYgIWlzUmVuYW1lYWJsZShvcmlnaW5hbCkpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLnVuYWJsZV9yZXBsYWNlX0VYQ18sIChuZXcgT2JqZWN0W117b3JpZ2luYWwuZ2V0QWJzb2x1dGVQYXRoKCl9KSkpOyAvLyA9ICJVbmFibGUgdG8gcmVwbGFjZSBvcmlnaW5hbCBhcmNoaXZlICIKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJaWYgKEFyY2hpdmVVdGlsLmRlbGV0ZShvcmlnaW5hbCkpIHsKLQkJCQlkZWxldGVXb3JrZWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkvLyBUT0RPIE1ham9yIGhhY2sgaGVyZTsgdGhlIHByb2JsZW0gaXMgdGhhdCBhIHByZXZpb3VzIGNhbGwKLQkJCQkvLyB0byBjbG9zZSB0aGUgc291cmNlIGZpbGUgbWF5IG5vdCB5ZXQgaGF2ZQotCQkJCS8vYmVlbiByZWZsZWN0ZWQgaW4gdGhlIG9zL3ZtOyB0aGVyZWZvcmUgYSBzdWJzZXF1ZW50IGNhbGwKLQkJCQkvLyB0byBkZWxldGUgZmFpbHMuIFRvIGdldCBhcm91bmQgdGhpcywKLQkJCQkvL3dhaXQgZm9yIGEgYml0IGFuZCByZXRyeTsgaWYgaXQgY29udGludWVzIHRvIGZhaWwsIHRoZW4KLQkJCQkvLyB0aW1lIG91dCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uCi0JCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQlpZiAoZGVsZXRlV29ya2VkKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCQlpZiAoZGVzdGluYXRpb25GaWxlLnJlbmFtZVRvKG9yaWdpbmFsKSkKLQkJCQkJcmV0dXJuOwotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIudW5hYmxlX3JlcGxhY2VfRVhDXywgKG5ldyBPYmplY3RbXXtvcmlnaW5hbC5nZXRBYnNvbHV0ZVBhdGgoKX0pKSk7IC8vID0gIlVuYWJsZSB0byByZXBsYWNlIG9yaWdpbmFsIGFyY2hpdmUgIgotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCWdldExvYWRTdHJhdGVneSgpLmNsb3NlKCk7Ci0JCXJlbGVhc2VDbGFzc0xvYWRlcigpOwotCQlnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmFyY2hpdmVDbG9zZWQodGhpcyk7Ci0JCWlmIChpc0luZGV4ZWQoKSkgewotCQkJTGlzdCBhcmNoaXZlcyA9IGdldEFyY2hpdmVGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJCSgoQXJjaGl2ZSkgYXJjaGl2ZXMuZ2V0KGkpKS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgY29weShGaWxlIGFGaWxlKSB7Ci0JCUZpbGUgY29weSA9IG51bGw7Ci0JCWlmIChhRmlsZS5pc0FyY2hpdmUoKSkKLQkJCWNvcHkgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNvcHkoKEFyY2hpdmUpIGFGaWxlKTsKLQkJZWxzZQotCQkJY29weSA9IChGaWxlKSBFdG9vbHNDb3B5VXRpbGl0eS5jcmVhdGVDb3B5KGFGaWxlKTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHJvdGVjdGVkIExvYWRTdHJhdGVneSBjcmVhdGVMb2FkU3RyYXRlZ3lGb3JSZW9wZW4oQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUxvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5ID0gbnVsbDsKLQkJTG9vc2VBcmNoaXZlIGxvb3NlID0gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0TG9vc2VBcmNoaXZlKCk7Ci0KLQkJaWYgKGxvb3NlICE9IG51bGwpIHsKLQkJCWFMb2FkU3RyYXRlZ3kgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUxvYWRTdHJhdGVneShsb29zZS5nZXRCaW5hcmllc1BhdGgoKSk7Ci0JCQlhTG9hZFN0cmF0ZWd5LnNldExvb3NlQXJjaGl2ZShsb29zZSk7Ci0JCX0gZWxzZSBpZiAocGFyZW50ID09IG51bGwpCi0JCQlhTG9hZFN0cmF0ZWd5ID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVMb2FkU3RyYXRlZ3koZ2V0VVJJKCkpOwotCQllbHNlCi0JCQlhTG9hZFN0cmF0ZWd5ID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDaGlsZExvYWRTdHJhdGVneShnZXRVUkkoKSwgcGFyZW50LmdldExvYWRTdHJhdGVneSgpKTsKLQotCQlyZXR1cm4gYUxvYWRTdHJhdGVneTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZUNsYXNzcGF0aEVudHJ5IGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShTdHJpbmcgYWJzb2x1dGVQYXRoKSB7Ci0JCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsKCk7Ci0JCWVudHJ5LnNldEFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhbGwgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIHRvIGFic29sdXRlIHBhdGhzCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJpZXMoU3RyaW5nW10gZW50cmllcywgU3RyaW5nIHBhcmVudFBhdGgpIHsKLQotCQlMaXN0IGFMaXN0ID0gbmV3IEFycmF5TGlzdChlbnRyaWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCS8qCi0JCQkgKiBBZGRlZCBmb3IgbG9vc2UgbW9kdWxlIHN1cHBvcnQgLSBpZiB0aGUgY2FuYW5vbmljYWxpemVkIGVudHJ5IHJlc29sdmVzIHRvIGFuIGFyY2hpdmUKLQkJCSAqIGluIHRoZSBjb250YWluaW5nIGVhciwgdGhlbiBhZGQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhhdCBhcmNoaXZlCi0JCQkgKi8KLQkJCUFyY2hpdmUgZGVwZW5kZW50SmFyID0gcmVzb2x2ZUNsYXNzcGF0aEVudHJ5SW5FQVIoZW50cnkpOwotCQkJaWYgKGRlcGVuZGVudEphciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJUnVudGltZUNsYXNzcGF0aEVudHJ5IHJ1bkVudHJ5ID0gY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KGRlcGVuZGVudEphci5nZXRCaW5hcmllc1BhdGgoKSwgZW50cnkpOwotCQkJCQlydW5FbnRyeS5zZXRSZWZlcmVuY2VkQXJjaGl2ZShkZXBlbmRlbnRKYXIpOwotCQkJCQlhTGlzdC5hZGQocnVuRW50cnkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gc2hvdWxkbnRIYXBwZW5JblJ1bnRpbWUpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCQkvL090aGVyd2lzZSwgY29tcHV0ZSB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZW50cnkgcmVsYXRpdmUgdG8KLQkJCS8vIHRoaXMgamFyCi0JCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGVudHJ5KTsKLQkJCVN0cmluZyBhYnNQYXRoID0gbnVsbDsKLQkJCWlmIChhRmlsZS5pc0Fic29sdXRlKCkpCi0JCQkJYWJzUGF0aCA9IGFGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJZWxzZSB7Ci0JCQkJYWJzUGF0aCA9IEFyY2hpdmVVdGlsLmdldE9TVXJpKHBhcmVudFBhdGgsIGVudHJ5KTsKLQkJCQlhYnNQYXRoID0gQ2xhc3NwYXRoVXRpbC5ub3JtYWxpemVQYXRoKGFic1BhdGgpOwotCQkJfQotCQkJYUxpc3QuYWRkKGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShhYnNQYXRoLCBlbnRyeSkpOwotCQl9Ci0KLQkJcmV0dXJuIGFMaXN0OwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lQ2xhc3NwYXRoRW50cnkgY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KFN0cmluZyBhYnNvbHV0ZVBhdGgsIFN0cmluZyBtYW5pZmVzdFZhbHVlKSB7Ci0JCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShhYnNvbHV0ZVBhdGgpOwotCQllbnRyeS5zZXRNYW5pZmVzdFZhbHVlKG1hbmlmZXN0VmFsdWUpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JEaXJlY3RvcnkoamF2YS5pby5GaWxlIGRpciwgaW50IGV4cGFuc2lvbkZsYWdzKSB7Ci0JCXJldHVybiBuZXcgRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbChkaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGV4cGFuc2lvbkZsYWdzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZVNhdmVTdHJhdGVneUZvckRpcmVjdG9yeShTdHJpbmcgYVVyaSwgaW50IGV4cGFuc2lvbkZsYWdzKSB7Ci0JCXJldHVybiBuZXcgRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbChhVXJpLCBleHBhbnNpb25GbGFncyk7Ci0JfQotCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JKYXIoamF2YS5pby5GaWxlIGFGaWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCWlmIChhRmlsZS5leGlzdHMoKSAmJiBhRmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZmlsZV9leGlzdF9hc19kaXJfRVhDXywgKG5ldyBPYmplY3RbXXthRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX0pKSk7Ly8gPSAiQSBmaWxlIG5hbWVkIHswfSBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5IgotCQlqYXZhLmlvLkZpbGUgcGFyZW50ID0gYUZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlwYXJlbnQubWtkaXJzKCk7Ci0JCWphdmEuaW8uT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oYUZpbGUpOwotCQlyZXR1cm4gbmV3IFppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwob3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIGV4dHJhY3QoaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIFJlb3BlbkV4Y2VwdGlvbiB7Ci0JCWV4dHJhY3ROb1Jlb3BlbihleHBhbnNpb25GbGFncyk7Ci0JCXJlb3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdE5vUmVvcGVuKGludCBleHBhbnNpb25GbGFncykgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGFVcmkgPSBnZXRVUkkoKTsKLQkJamF2YS5pby5GaWxlIGFEaXIgPSBuZXcgamF2YS5pby5GaWxlKGFVcmkpOwotCQlib29sZWFuIGluVXNlID0gZ2V0TG9hZFN0cmF0ZWd5KCkuaXNVc2luZyhhRGlyKTsKLQotCQl0cnkgewotCQkJamF2YS5pby5GaWxlIGRlc3RpbmF0aW9uRGlyID0gaW5Vc2UgPyBBcmNoaXZlVXRpbC5jcmVhdGVUZW1wRGlyZWN0b3J5KGFVcmksIGFEaXIuZ2V0Q2Fub25pY2FsRmlsZSgpLmdldFBhcmVudEZpbGUoKSkgOiBhRGlyOwotCQkJU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kgPSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JEaXJlY3RvcnkoZGVzdGluYXRpb25EaXIsIGV4cGFuc2lvbkZsYWdzKTsKLQkJCXNhdmUoYVNhdmVTdHJhdGVneSk7Ci0JCQlhU2F2ZVN0cmF0ZWd5LmNsb3NlKCk7Ci0JCQljbG9zZSgpOwotCQkJaWYgKGluVXNlKSB7Ci0JCQkJY2xlYW51cEFmdGVyVGVtcFNhdmUoYVVyaSwgYURpciwgZGVzdGluYXRpb25EaXIpOwotCQkJfQotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5lcnJvcl9zYXZpbmdfRVhDXywgKG5ldyBPYmplY3RbXXt1cml9KSksIGV4KTsgLy8gPSAiRXJyb3Igc2F2aW5nICIKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdFRvKGphdmEubGFuZy5TdHJpbmcgYVVyaSwgaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlqYXZhLmlvLkZpbGUgYURpciA9IG5ldyBqYXZhLmlvLkZpbGUoYVVyaSk7Ci0JCWlmIChnZXRMb2FkU3RyYXRlZ3koKS5pc1VzaW5nKGFEaXIpKQotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuRXh0cmFjdF9kZXN0aW5hdGlvbl9pc190aGVfRVhDXyk7IC8vID0gIkV4dHJhY3QgZGVzdGluYXRpb24gaXMgdGhlIHNhbWUgcGF0aCBhcyBzb3VyY2UgZmlsZSIKLQotCQl0cnkgewotCQkJU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kgPSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JEaXJlY3RvcnkoYURpciwgZXhwYW5zaW9uRmxhZ3MpOwotCQkJc2F2ZShhU2F2ZVN0cmF0ZWd5KTsKLQkJCWFTYXZlU3RyYXRlZ3kuY2xvc2UoKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZXJyb3Jfc2F2aW5nX0VYQ18sIChuZXcgT2JqZWN0W117YVVyaX0pKSwgZXgpOyAvLyA9ICJFcnJvciBzYXZpbmcgIgotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZmlsdGVyRmlsZXNCeVByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBmaWx0ZXJGaWxlcyhwcmVmaXgsIG51bGwpOwotCX0KLQotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBmaWx0ZXJGaWxlcyhTdHJpbmcgcHJlZml4LCBTdHJpbmdbXSBzdWZmaXhlcykgewotCQlMaXN0IHN1YnNldCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0aGVGaWxlcyA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgdGhlRmlsZXMuZ2V0KGkpOwotCQkJaWYgKCFhRmlsZS5pc0RpcmVjdG9yeUVudHJ5KCkgJiYgYUZpbGUuZ2V0VVJJKCkuc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJCWlmIChzdWZmaXhlcyA9PSBudWxsIHx8IGhhc1N1ZmZpeChhRmlsZS5nZXRVUkkoKSwgc3VmZml4ZXMpKQotCQkJCQlzdWJzZXQuYWRkKGFGaWxlKTsKLQkJfQotCQlyZXR1cm4gc3Vic2V0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gc3VmZml4ZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc1N1ZmZpeChTdHJpbmcgYVVyaSwgU3RyaW5nW10gc3VmZml4ZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmaXhlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFVcmkuZW5kc1dpdGgoc3VmZml4ZXNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZmlsdGVyRmlsZXNXaXRob3V0UHJlZml4KFN0cmluZ1tdIHByZWZpeGVzKSB7Ci0JCUxpc3Qgc3Vic2V0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRoZUZpbGVzID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVGaWxlcy5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSB0aGVGaWxlcy5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnlFbnRyeSgpKQotCQkJCWNvbnRpbnVlOwotCQkJYm9vbGVhbiBzaG91bGRBZGQgPSB0cnVlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcmVmaXhlcy5sZW5ndGg7IGorKykgewotCQkJCWlmIChhRmlsZS5nZXRVUkkoKS5zdGFydHNXaXRoKHByZWZpeGVzW2pdKSkgewotCQkJCQlzaG91bGRBZGQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNob3VsZEFkZCkKLQkJCQlzdWJzZXQuYWRkKGFGaWxlKTsKLQkJfQotCQlyZXR1cm4gc3Vic2V0OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldEFyY2hpdmVDbGFzc0xvYWRlcigpIHsKLQkJaWYgKGFyY2hpdmVDbGFzc0xvYWRlciA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZUNsYXNzTG9hZGVyKCk7Ci0JCXJldHVybiBhcmNoaXZlQ2xhc3NMb2FkZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QXJjaGl2ZUZpbGVzKCkgewotCQlMaXN0IGFyY2hpdmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNBcmNoaXZlKCkpIHsKLQkJCQlhcmNoaXZlcy5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhcmNoaXZlczsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSB0aGUgbWFuaWZlc3QgY2xhc3MgcGF0aCBhbmQgdGhlIGV4dHJhIGNsYXNzIHBhdGgsIGFuZCBpbnN0YW50aWF0ZSBhIFVSTCBjbGFzc2xvYWRlciwKLQkgKiB3aXRoIGEgcGFyZW50IG9mIHRoZSBhcmNoaXZlQ2xhc3NMb2FkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NQYXRoQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50Q2wpIHsKLQotCQlMaXN0IGNsYXNzUGF0aENvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChnZXRNYW5pZmVzdCgpICE9IG51bGwpCi0JCQljbGFzc1BhdGhDb21wb25lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdldE1hbmlmZXN0KCkuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCkpKTsKLQkJU3RyaW5nIGV4dHJhQ3AgPSBnZXRFeHRyYUNsYXNzcGF0aCgpOwotCQlpZiAoZXh0cmFDcCAhPSBudWxsKQotCQkJY2xhc3NQYXRoQ29tcG9uZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChBcmNoaXZlVXRpbC5nZXRUb2tlbnMoZXh0cmFDcCwgIjsiKSkpOy8vJE5PTi1OTFMtMSQKLQotCQlqYXZhLm5ldC5VUkxbXSB1cmxBcnJheSA9IEFyY2hpdmVVdGlsLnRvTG9jYWxVUkxzKGNsYXNzUGF0aENvbXBvbmVudHMsIGdldFJvb3RGb3JSZWxhdGl2ZURlcGVuZGVudEphcnMoKSk7Ci0JCXJldHVybiBuZXcgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIodXJsQXJyYXksIHBhcmVudENsKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSBwYXJlbnQgZm9yIHRoZSBjdXN0b20gY2xhc3MgbG9hZGVyIHVzZWQgYnkgdGhpcyBhcmNoaXZlCi0JICovCi0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGdldERlZmF1bHRDbGFzc0xvYWRlcigpIHsKLQkJQ2xhc3NMb2FkZXIgcGx1Z2luQ2xhc3NMb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0JCXJldHVybiBwbHVnaW5DbGFzc0xvYWRlciA9PSBudWxsID8gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSA6IHBsdWdpbkNsYXNzTG9hZGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5TZXQgZ2V0RGVwZW5kZW50T3BlbkFyY2hpdmVzKCkgewotCQlyZXR1cm4gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5nZXRPcGVuQXJjaGl2ZXNEZXBlbmRpbmdPbih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGFsbCB0aGUgY2xhc3NwYXRoIGVudHJpZXMgdG8gYWJzb2x1dGUgcGF0aHMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFbnRyaWVzQXNBYnNvbHV0ZVBhdGhzKFN0cmluZ1tdIGVudHJpZXMsIFN0cmluZyBwYXJlbnRQYXRoKSB7Ci0KLQkJTGlzdCBhTGlzdCA9IG5ldyBBcnJheUxpc3QoZW50cmllcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkvKgotCQkJICogQWRkZWQgZm9yIGxvb3NlIG1vZHVsZSBzdXBwb3J0IC0gaWYgdGhlIGNhbmFub25pY2FsaXplZCBlbnRyeSByZXNvbHZlcyB0byBhbiBhcmNoaXZlCi0JCQkgKiBpbiB0aGUgY29udGFpbmluZyBlYXIsIHRoZW4gYWRkIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoYXQgYXJjaGl2ZQotCQkJICovCi0JCQlBcmNoaXZlIGRlcGVuZGVudEphciA9IHJlc29sdmVDbGFzc3BhdGhFbnRyeUluRUFSKGVudHJ5KTsKLQkJCWlmIChkZXBlbmRlbnRKYXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWFMaXN0LmFkZChkZXBlbmRlbnRKYXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gc2hvdWxkbnRIYXBwZW5JblJ1bnRpbWUpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCQkvL090aGVyd2lzZSwgY29tcHV0ZSB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZW50cnkgcmVsYXRpdmUgdG8KLQkJCS8vIHRoaXMgamFyCi0JCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGVudHJ5KTsKLQkJCWlmIChhRmlsZS5pc0Fic29sdXRlKCkpCi0JCQkJYUxpc3QuYWRkKGFGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWVsc2UKLQkJCQlhTGlzdC5hZGQoQXJjaGl2ZVV0aWwuZ2V0T1NVcmkocGFyZW50UGF0aCwgZW50cnkpKTsKLQkJfQotCi0JCXJldHVybiBhTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0cmFDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBleHRyYUNsYXNzcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGZyYW1ld29yaywgc3BlY2lmaWNhbGx5IGFzIGFuIG9wdGltaXphdGlvbiB3aGVuIHNhdmluZy9leHBsb2RpbmcKLQkgKiBhcmNoaXZlcyB3aXRoIG5lc3RlZCBhcmNoaXZlcwotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvciBnZXRGaWxlc0ZvclNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0RmlsZUl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCWlmIChnZXRMb2FkaW5nQ29udGFpbmVyKCkgIT0gbnVsbCB8fCBnZXRMb2FkU3RyYXRlZ3koKSA9PSBudWxsIHx8IGdldExvYWRTdHJhdGVneSgpLmlzRGlyZWN0b3J5KCkpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0SW5wdXRTdHJlYW0oKTsKLQotCQkvL1RoaXMgYXJjaGl2ZSB3YXMgY29waWVkIGluOyB0aGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvcgotCQkvLyBtb2R1bGUgZmlsZXMKLQkJaWYgKGlzTW9kdWxlRmlsZSgpIHx8ICFnZXRPcHRpb25zKCkuaXNTYXZlTGlicmFyaWVzQXNGaWxlcygpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmRlZmluZWQgc3RhdGUgb2YgbmVzdGVkIGFyY2hpdmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vV2UgaGF2ZSB0byBmaW5kIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBvcmlnaW5hbCBhcmNoaXZlIGZyb20gd2hpY2gKLQkJLy8gdGhpcyB3YXMgY29waWVkLAotCQkvL2lmIGl0IGlzIGtub3duCi0KLQkJTGlzdCBsaXN0ID0gZ2V0RmlsZXMoKTsKLQotCQlTdHJpbmcgYWJzb2x1dGVQYXRoID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzQXJjaGl2ZSgpKQotCQkJCWNvbnRpbnVlOwotCQkJYWJzb2x1dGVQYXRoID0gYUZpbGUuZ2V0TG9hZGluZ0NvbnRhaW5lcigpLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oYWJzb2x1dGVQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExvYWRTdHJhdGVneSNnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgYVVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmdldFJlc291cmNlSW5wdXRTdHJlYW0oYVVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFKREtBZGFwdGVyRmFjdG9yeSBnZXRKYXZhQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSmF2YUpES0FkYXB0ZXJGYWN0b3J5KSBFY29yZVV0aWwuZ2V0QWRhcHRlckZhY3RvcnkoZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRBZGFwdGVyRmFjdG9yaWVzKCksIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZSByZXR1cm5zIGFuIGltbXV0YWJsZSBjb2xsZWN0aW9uIG9mIHRoZSBsb2FkZWQKLQkgKiAgICAgIHJlc291cmNlcyBpbiB0aGUgcmVzb3VyY2Ugc2V0Ci0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0IGdldE1hbmlmZXN0KCkgewotCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkgewotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpbiA9IGdldElucHV0U3RyZWFtKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKLQkJCQltYWtlTWFuaWZlc3QoaW4pOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQkJbWFrZU1hbmlmZXN0KCk7Ci0JCQl9IGNhdGNoIChSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCQlXcmFwcGVkRXhjZXB0aW9uIHdyYXBFeCA9IG5ldyBXcmFwcGVkRXhjZXB0aW9uKChleCkuZ2V0V3JhcHBlZEV4Y2VwdGlvbigpKTsKLQkJCQlpZiAoRXh0ZW5kZWRFY29yZVV0aWwuZ2V0RmlsZU5vdEZvdW5kRGV0ZWN0b3IoKS5pc0ZpbGVOb3RGb3VuZCh3cmFwRXgpKQotCQkJCQltYWtlTWFuaWZlc3QoKTsKLQkJCQllbHNlCi0JCQkJCXRocm93IG5ldyBNYW5pZmVzdEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmlvX2V4X21hbmlmZXN0X0VYQ18sIChuZXcgT2JqZWN0W117Z2V0VVJJKCl9KSksIGV4KTsgLy8gPSAiQW4gSU9FeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyB0aGUgbWFuaWZlc3Q6ICIKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IE1hbmlmZXN0RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuaW9fZXhfbWFuaWZlc3RfRVhDXywgKG5ldyBPYmplY3RbXXtnZXRVUkkoKX0pKSwgZXgpOyAvLyA9ICJBbiBJT0V4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIHRoZSBtYW5pZmVzdDogIgotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJCQkJLy9JZ25vcmUKLQkJCQkJfQotCQkJfQotCQl9Ci0JCS8vVGhpcyBpcyBhIGhhY2sgYmVjYXVzZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBtYW5pZmVzdCBkb2VzIG5vdAotCQkvLyBzZXJpYWxpemUgY29ycmVjdGx5IGlmCi0JCS8vVGhlIHZlcnNpb24gaXMgbm90IHNldC4gSW4gYWRkaXRpb24gdG8gc2F2ZXMsIHRoZSBzZXJpYWxpemF0aW9uIGlzCi0JCS8vIHVzZWQgZm9yIGNvcHkKLQkJaWYgKG1hbmlmZXN0LmdldE1hbmlmZXN0VmVyc2lvbigpID09IG51bGwgfHwgbWFuaWZlc3QuZ2V0TWFuaWZlc3RWZXJzaW9uKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJbWFuaWZlc3Quc2V0TWFuaWZlc3RWZXJzaW9uKCIxLjAiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBtYW5pZmVzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UgZ2V0TW9mUmVzb3VyY2UoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0TW9mUmVzb3VyY2UoYVVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldE1vZlJlc291cmNlTWFrZUlmTmVjZXNzYXJ5KFN0cmluZyBhVXJpKSB7Ci0JCWlmIChnZXRMb2FkU3RyYXRlZ3koKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc291cmNlID0gZ2V0TW9mUmVzb3VyY2UoYVVyaSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlID0gbWFrZU1vZlJlc291cmNlKGFVcmkpOwotCQkJfSBjYXRjaCAoRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGRveCkgewotCQkJCS8vV2UganVzdCBjaGVja2VkIGZvciB0aGlzOyBpdCB3b24ndCBoYXBwZW4KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnMgZ2V0T3B0aW9ucygpIHsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQl9Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCS8qKgotCSAqIFdoZW4gbG9va2luZyBhdCB0aGUgY2xhc3MgcGF0aCBvZiB0aGlzIGphciAoZnJvbSB0aGUgbWFuaWZlc3QpLCBzb21lIG9mIHRoZSBlbGVtZW50cyBtYXkgaGF2ZQotCSAqIGEgcmVsYXRpdmUgcGF0aCwgdGh1cyB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgaW5zdGFsbCBsb2NhdGlvbiBvZiB0aGlzIGphci4gSWYgdGhlIGFic29sdXRlCi0JICogcGF0aCBmcm9tIHdoaWNoIHRoZSBhcmNoaXZlIHdhcyBsb2FkZWQsIHJldHVybiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGF0IHBhdGg7IG90aGVyd2lzZSwKLQkgKiBzZWUgaWYgdGhlIGNvbnRhaW5pbmcgYXJjaGl2ZSBoYXMgYW4gYWJzb2x1dGUgcGF0aDsgaWYgbmVpdGhlciB3b3JrLCBkZWZhdWx0IHRvIHRoZSBjdXJyZW50Ci0JICogd29ya2luZyBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJvb3RGb3JSZWxhdGl2ZURlcGVuZGVudEphcnMoKSB7Ci0JCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJQ29udGFpbmVyIHRoZUNvbnRhaW5lciA9IHRoaXM7Ci0JCXdoaWxlICh0aGVDb250YWluZXIgIT0gbnVsbCAmJiBwYXRoID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcGF0aCA9IHRoZUNvbnRhaW5lci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCQl0aGVDb250YWluZXIgPSB0aGVDb250YWluZXIuZ2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQl9Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCQkvL0F0IHRoaXMgcG9pbnQgd2hhdCBlbHNlIGNhbiB3ZSBkbz8KLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBqYXZhLmlvLkZpbGUocGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBqYXZhLmlvLkZpbGUocGF0aCkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRSdW50aW1lQ2xhc3NQYXRoKCkgewotCi0JCVN0cmluZyBhYnNvbHV0ZVBhdGg7Ci0JCXRyeSB7Ci0JCQlhYnNvbHV0ZVBhdGggPSBnZXRCaW5hcmllc1BhdGgoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQl9Ci0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbnRyaWVzLmFkZChhYnNvbHV0ZVBhdGgpOwotCi0JCVN0cmluZyBwYXJlbnRQYXRoID0gbmV3IGphdmEuaW8uRmlsZShhYnNvbHV0ZVBhdGgpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJU3RyaW5nW10gbWZFbnRyaWVzID0gZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJZW50cmllcy5hZGRBbGwoZ2V0RW50cmllc0FzQWJzb2x1dGVQYXRocyhtZkVudHJpZXMsIHBhcmVudFBhdGgpKTsKLQotCQlyZXR1cm4gKFN0cmluZ1tdKSBlbnRyaWVzLnRvQXJyYXkobmV3IFN0cmluZ1tlbnRyaWVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIE9wdGlvbmFsIGZpbHRlciBmb3Igc2F2aW5nIGEgc3Vic2V0IG9mIGZpbGVzOyBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIGZvciBhbGwgc2F2ZSBhbmQgZXh0cmFjdAotCSAqIGludm9rYXRpb25zCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlciBnZXRTYXZlRmlsdGVyKCkgewotCQlyZXR1cm4gc2F2ZUZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNC8wMCAzOjMxOjMyIFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5IGdldFNhdmVTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHNhdmVTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFhtbEVuY29kaW5nKCkgewotCQlyZXR1cm4geG1sRW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZzsgc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5Ci0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQWZ0ZXJPcGVuKCkgewotCQkvL0RlZmF1bHQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQ2xhc3NMb2FkZXIoKSB7Ci0JCS8vU29tZSBsb2FkIHN0cmF0ZWdpZXMgbWF5IHByb3ZpZGUgYSBtb2YgY29udGV4dCBmb3Igd2hpY2gKLQkJLy9hbiBhbHRlcm5hdGUgY2xhc3MgbG9hZGVyIGlzIG5vdCBuZWNlc3NhcnkKLQkJaWYgKCFzaG91bGRVc2VKYXZhUmVmbGVjdGlvbigpKQotCQkJcmV0dXJuOwotCQlDbGFzc0xvYWRlciBleHRyYUNsID0gbnVsbDsKLQkJQ2xhc3NMb2FkZXIgZGVmYXVsdENsID0gZ2V0RGVmYXVsdENsYXNzTG9hZGVyKCk7Ci0JCWlmIChnZXRDb250YWluZXIoKSA9PSBudWxsIHx8ICFnZXRDb250YWluZXIoKS5pc0VBUkZpbGUoKSkKLQkJCWV4dHJhQ2wgPSBnZXRDbGFzc1BhdGhDbGFzc0xvYWRlcihkZWZhdWx0Q2wpOwotCQlDbGFzc0xvYWRlciBjbCA9IGNyZWF0ZUR5bmFtaWNDbGFzc0xvYWRlcihkZWZhdWx0Q2wsIGV4dHJhQ2wpOwotCQlzZXRBcmNoaXZlQ2xhc3NMb2FkZXIoY2wpOwotCQlKYXZhSkRLQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEphdmFBZGFwdGVyRmFjdG9yeSgpOwotCQlmYWN0b3J5LnNldENvbnRleHRDbGFzc0xvYWRlcihjbCk7Ci0JCWZhY3RvcnkuZmx1c2hBbGwoKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NMb2FkZXIgY3JlYXRlRHluYW1pY0NsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsKSB7Ci0JCXJldHVybiBuZXcgQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIodGhpcywgcGFyZW50Q2wsIGV4dHJhQ2wpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcmNoaXZlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRHVwbGljYXRlKGphdmEubGFuZy5TdHJpbmcgYVVyaSkgewotCQlyZXR1cm4gY29udGFpbnNGaWxlKGFVcmkpIHx8IGlzTW9mUmVzb3VyY2VMb2FkZWQoYVVyaSkgfHwgSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkuZXF1YWxzKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYW5pZmVzdFNldCgpIHsKLQkJcmV0dXJuIG1hbmlmZXN0ICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZlJlc291cmNlTG9hZGVkKGphdmEubGFuZy5TdHJpbmcgYVVyaSkgewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuaXNNb2ZSZXNvdXJjZUxvYWRlZChhVXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGp1c3QgdGVzdCB0aGUgZXh0ZW5zaW9uIG9mIHRoZSB1cmkgZm9yIG9uZSBvZiB0aGUga25vd24gYXJjaGl2ZSB0eXBlczsgc3ViY2xhc3NlcwotCSAqIG1heSB3aGljaCB0byBvdmVycmlkZS4KLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkQXJjaGl2ZShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHsKLQkJLy8xMTAzOTAuMyBFcnJvciBsb2FkaW5nIGFsdC1iaW5kaW5ncwotCQkvKgotCQkgKiBEb24ndCBpbmZlciB0aGF0IGEgZm9sZGVyIHdoaWNoIGVuZHMgd2l0aCAuamFyIGlzIGFuIGV4cGxvZGVkIGFyY2hpdmU7IEVBUiBmaWxlIHdpbGwgZG8KLQkJICogdGhhdCBJRiB0aGUgZm9sZGVyIGlzIGRlY2xhcmVkIGFzIGEgbW9kdWxlIGluIHRoZSBFQVIKLQkJICovCi0JCWlmIChnZXRMb2FkU3RyYXRlZ3koKS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBwYXRoID0gQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoZ2V0QWJzb2x1dGVQYXRoKCksIGFVcmkpOwotCQkJCWphdmEuaW8uRmlsZSBpb0ZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgpOwotCQkJCWlmICghaW9GaWxlLmV4aXN0cygpIHx8IChpb0ZpbGUuaXNEaXJlY3RvcnkoKSAmJiBhVXJpLnN0YXJ0c1dpdGgoSjJFRUNvbnN0YW50cy5BTFRfSU5GKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeS5JTlNUQU5DRS5pc0tub3duQXJjaGl2ZVR5cGUoYVVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKSAhPSBudWxsICYmIGdldExvYWRTdHJhdGVneSgpLmlzT3BlbigpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3QgbWFrZU1hbmlmZXN0KCkgewotCQlBcmNoaXZlTWFuaWZlc3QgbWYgPSBuZXcgQXJjaGl2ZU1hbmlmZXN0SW1wbCgpOwotCQlzZXRNYW5pZmVzdChtZik7Ci0JCXJldHVybiBtZjsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0IG1ha2VNYW5pZmVzdChJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZU1hbmlmZXN0IG1mID0gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoaW4pOwotCQlzZXRNYW5pZmVzdChtZik7Ci0JCXJldHVybiBtZjsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbWFrZU1vZlJlc291cmNlKFN0cmluZyBhVXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ha2VNb2ZSZXNvdXJjZShhVXJpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZSNtYWtlTW9mUmVzb3VyY2UoU3RyaW5nLCBFTGlzdCkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgbWFrZU1vZlJlc291cmNlKFN0cmluZyBhVXJpLCBFTGlzdCBleHRlbnQpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlpZiAoaXNEdXBsaWNhdGUoYVVyaSkpCi0JCQl0aHJvdyBuZXcgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZHVwbGljYXRlX2VudHJ5X0VYQ18sIChuZXcgT2JqZWN0W117YVVyaSwgZ2V0VVJJKCl9KSkpOyAvLyA9ICJBIGZpbGUgb3IgcmVzb3VyY2Ugd2l0aCB1cmkgezB9IGFscmVhZHkgZXhpc3RzIGluIHRoZSBhcmNoaXZlIG5hbWVkIHsxfSIKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLm1ha2VNb2ZSZXNvdXJjZShhVXJpLCBleHRlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKFN0cmluZyBhVXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5vcGVuTmVzdGVkQXJjaGl2ZShhVXJpLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLm9wZW5OZXN0ZWRBcmNoaXZlKGxvb3NlLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBleHRyYSBjbGFzcyBwYXRoIHdpdGggbm8gcmVmcmVzaCBvZiB0aGUgY2xhc3MgbG9hZGVyCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVNldEV4dHJhQ2xhc3NwYXRoKGphdmEubGFuZy5TdHJpbmcgbmV3RXh0cmFDbGFzc3BhdGgpIHsKLQkJZXh0cmFDbGFzc3BhdGggPSBuZXdFeHRyYUNsYXNzcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgYXJjaGl2ZSBjbGFzcyBsb2FkZXIgdG8gcHJldmVudCBnYyBwcm9ibGVtcyBvciBwcm9ibGVtcyB3aXRoIHRlbXAKLQkgKiBmaWxlcyBub3QgZ2V0dGluZyBkZWxldGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUNsYXNzTG9hZGVyKCkgewotCQlpZiAoYXJjaGl2ZUNsYXNzTG9hZGVyICE9IG51bGwpIHsKLQkJCXNldEFyY2hpdmVDbGFzc0xvYWRlcihudWxsKTsKLQkJCWdldEphdmFBZGFwdGVyRmFjdG9yeSgpLnNldENvbnRleHRDbGFzc0xvYWRlcihudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKEZpbGUgYUZpbGUpIHsKLQkJZ2V0RmlsZXMoKS5yZW1vdmUoYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgcmVvcGVuKCkgdGhyb3dzIFJlb3BlbkV4Y2VwdGlvbiB7Ci0JCXJlb3BlbihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlb3BlbihBcmNoaXZlIHBhcmVudCkgdGhyb3dzIFJlb3BlbkV4Y2VwdGlvbiB7Ci0JCUxvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFMb2FkU3RyYXRlZ3kgPSBjcmVhdGVMb2FkU3RyYXRlZ3lGb3JSZW9wZW4ocGFyZW50KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSZW9wZW5FeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5pb19leF9yZW9wZW5fRVhDXywgKG5ldyBPYmplY3RbXXtnZXRVUkkoKX0pKSwgZXgpOyAvLyA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSByZW9wZW5pbmcgIgotCQl9Ci0JCS8vUFE1NDU3MgotCQlMb2FkU3RyYXRlZ3kgY3VycmVudCA9IGdldExvYWRTdHJhdGVneSgpOwotCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQlhTG9hZFN0cmF0ZWd5LnNldFJlc291cmNlU2V0KGN1cnJlbnQucHJpbUdldFJlc291cmNlU2V0KCkpOwotCQkJLyoKLQkJCSAqIGZpeGluZyBwcm9ibGVtIHdpdGggb3JwaGFuZWQgbG9hZCBzdHJhdGVneSBsaXN0ZW5pbmcgdG8gdGhlIHJlc291cmNlIHNldAotCQkJICovCi0JCQljdXJyZW50LnNldFJlc291cmNlU2V0KG51bGwpOwotCQl9Ci0KLQkJc2V0TG9hZFN0cmF0ZWd5KGFMb2FkU3RyYXRlZ3kpOwotCQlpbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQkJaWYgKCFpc0luZGV4ZWQoKSkKLQkJCXJldHVybjsKLQkJTGlzdCBmaWxlTGlzdCA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgZiA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlmLnNldE9yaWdpbmFsVVJJKGYuZ2V0VVJJKCkpOwotCQkJZi5zZXRMb2FkaW5nQ29udGFpbmVyKHRoaXMpOwotCQkJaWYgKGYuaXNBcmNoaXZlKCkpCi0JCQkJKChBcmNoaXZlKSBmKS5yZW9wZW4odGhpcyk7Ci0JCX0KLQkJZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5hcmNoaXZlT3BlbmVkKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VSb290KFJlc291cmNlIGFSZXNvdXJjZSwgRU9iamVjdCByb290KSB7Ci0JCWlmIChhUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRUxpc3QgZXh0ZW50ID0gYVJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JCUVPYmplY3QgZXhpc3RpbmdSb290ID0gbnVsbDsKLQkJaWYgKCFleHRlbnQuaXNFbXB0eSgpKSB7Ci0JCQlleGlzdGluZ1Jvb3QgPSAoRU9iamVjdCkgZXh0ZW50LmdldCgwKTsKLQkJCWlmIChleGlzdGluZ1Jvb3QgPT0gcm9vdCkKLQkJCQlyZXR1cm47Ci0JCQlleHRlbnQucmVtb3ZlKDApOwotCQl9Ci0JCWlmIChyb290ICE9IG51bGwpCi0JCQlleHRlbnQuYWRkKDAsIHJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlIHJlc29sdmVDbGFzc3BhdGhFbnRyeUluRUFSKFN0cmluZyBlbnRyeSkgewotCQkvKgotCQkgKiBBZGRlZCB0byBzdXBwb3J0IHJ1bnRpbWUgY2xhc3NwYXRoIGZvciBsb29zZSBtb2R1bGVzCi0JCSAqLwotCQlDb250YWluZXIgcGFyZW50ID0gZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCAhcGFyZW50LmlzRUFSRmlsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGFVcmkgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShlbnRyeSwgdGhpcyk7Ci0JCWlmIChhVXJpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlGaWxlIGFGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFGaWxlID0gcGFyZW50LmdldEZpbGUoYVVyaSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gYUZpbGUuaXNBcmNoaXZlKCkgPyAoQXJjaGl2ZSkgYUZpbGUgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgUmVvcGVuRXhjZXB0aW9uIHsKLQkJc2F2ZUFzKGdldFVSSSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5IGFTdHJhdGVneSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJc2V0U2F2ZVN0cmF0ZWd5KGFTdHJhdGVneSk7Ci0JCVNhdmVGaWx0ZXIgZXhpc3RpbmdGaWx0ZXIgPSBhU3RyYXRlZ3kuZ2V0RmlsdGVyKCk7Ci0JCWJvb2xlYW4gb2xkRGVsaXZlcnkgPSBlRGVsaXZlcigpOwotCQl0cnkgewotCQkJaWYgKGdldE9wdGlvbnMoKS5pc1JlYWRPbmx5KCkpCi0JCQkJZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJYVN0cmF0ZWd5LnNldEZpbHRlcihnZXRTYXZlRmlsdGVyKCkpOwotCQkJYVN0cmF0ZWd5LnNhdmUoKTsKLQkJCXRyeSB7Ci0JCQkJYVN0cmF0ZWd5LmZpbmlzaCgpOwotCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oZ2V0VVJJKCksIGlveCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQkvL1dlIGhhdmUgdG8gbGVhdmUgdGhlIGZpbGUgaW5kZXggaWYgd2UgYXJlIGEgZGlyZWN0b3J5IGJlY2F1c2Ugd2UKLQkJCS8vIG1pZ2h0IGhhdmUKLQkJCS8vb3BlbiBmaWxlIGhhbmRsZXMgdG8gYXJjaGl2ZXMKLQkJCWlmIChnZXRPcHRpb25zKCkuaXNSZWFkT25seSgpICYmICFnZXRMb2FkU3RyYXRlZ3koKS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJZmlsZXMuY2xlYXIoKTsKLQkJCQkvLygoQmFzaWNFTGlzdClmaWxlcykuc2V0TGlzdEltcGxlbWVudGF0aW9uKG5ldyBBcnJheUxpc3QoMCkpOwotCQkJCWVTZXREZWxpdmVyKG9sZERlbGl2ZXJ5KTsKLQkJCQllQWRhcHRlcnMoKS5yZW1vdmUoZ2V0RmlsZUluZGV4QWRhcHRlcigpKTsKLQkJCQlmaWxlSW5kZXhBZGFwdGVyID0gbnVsbDsKLQkJCQlmaWxlSW5kZXggPSBudWxsOwotCQkJfQotCQkJc2V0U2F2ZVN0cmF0ZWd5KG51bGwpOwotCQkJYVN0cmF0ZWd5LnNldEZpbHRlcihleGlzdGluZ0ZpbHRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVBcyhTdHJpbmcgYVVyaSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uLCBSZW9wZW5FeGNlcHRpb24gewotCQlzYXZlQXNOb1Jlb3BlbihhVXJpKTsKLQkJcmVvcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgY2FuIHJlbmFtZSBpdCB0aGVuIHdlIGNhbiBkZWxldGUgaXQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbmFtZWFibGUoamF2YS5pby5GaWxlIG9yaWcpIHsKLQkJamF2YS5pby5GaWxlIG9yaWdDb3B5MSA9IG51bGw7Ci0JCWphdmEuaW8uRmlsZSBvcmlnQ29weTIgPSBudWxsOwotCQl0cnkgewotCQkJb3JpZ0NvcHkxID0gb3JpZy5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCQlvcmlnQ29weTIgPSBvcmlnLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJU3RyaW5nIGJhc2VOYW1lID0gInNhdmUudG1wIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaWYgKG9yaWcuZ2V0UGFyZW50KCkgIT0gbnVsbCkKLQkJCQliYXNlTmFtZSA9IG5ldyBqYXZhLmlvLkZpbGUob3JpZy5nZXRQYXJlbnQoKSwgYmFzZU5hbWUpLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJamF2YS5pby5GaWxlIHRlbXAgPSBudWxsOwotCQlpbnQgaW5kZXggPSAwOwotCQlkbyB7Ci0JCQluYW1lID0gYmFzZU5hbWUgKyBpbmRleDsKLQkJCXRlbXAgPSBuZXcgamF2YS5pby5GaWxlKG5hbWUpOwotCQkJaW5kZXgrKzsKLQkJfSB3aGlsZSAodGVtcC5leGlzdHMoKSk7Ci0JCXJldHVybiBvcmlnQ29weTEucmVuYW1lVG8odGVtcCkgJiYgdGVtcC5yZW5hbWVUbyhvcmlnQ29weTIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrV3JpdGVhYmxlKGphdmEuaW8uRmlsZSBkZXN0KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlMaXN0IGxvY2tlZCA9IEFyY2hpdmVVdGlsLmdldFdyaXRlUHJvdGVjdGVkRmlsZXMoZGVzdCwgbnVsbCk7Ci0JCWlmIChsb2NrZWQuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCW1zZy5hcHBlbmQoIkNhbm5vdCB3cml0ZSB0byBmaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQltc2cuYXBwZW5kKGRlc3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQltc2cuYXBwZW5kKCdcbicpOwotCQltc2cuYXBwZW5kKCJPbmUgb3IgbW9yZSBmaWxlcyBpcyB3cml0ZSBwcm90ZWN0ZWQgb3IgbG9ja2VkOiIpOyAvLyROT04tTkxTLTEkCi0JCW1zZy5hcHBlbmQoJ1xuJyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9ja2VkLnNpemUoKTsgaSsrKSB7Ci0JCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSAoamF2YS5pby5GaWxlKSBsb2NrZWQuZ2V0KGkpOwotCQkJbXNnLmFwcGVuZChhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQltc2cuYXBwZW5kKCdcbicpOwotCQl9Ci0JCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihtc2cudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQXNOb1Jlb3BlbihTdHJpbmcgYVVyaSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShhVXJpKTsKLQkJY2hlY2tXcml0ZWFibGUoYUZpbGUpOwotCQlib29sZWFuIGZpbGVFeGlzdGVkID0gYUZpbGUuZXhpc3RzKCk7Ci0JCS8vYm90cCAxNDIxNDkKLQkJLy9ib29sZWFuIGluVXNlID0gZ2V0TG9hZFN0cmF0ZWd5KCkuaXNVc2luZyhhRmlsZSk7Ci0JCVNhdmVTdHJhdGVneSBhU2F2ZVN0cmF0ZWd5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJamF2YS5pby5GaWxlIGRlc3RpbmF0aW9uRmlsZSA9IGZpbGVFeGlzdGVkID8gQXJjaGl2ZVV0aWwuY3JlYXRlVGVtcEZpbGUoYVVyaSwgYUZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpLmdldFBhcmVudEZpbGUoKSkgOiBhRmlsZTsKLQkJCQlhU2F2ZVN0cmF0ZWd5ID0gY3JlYXRlU2F2ZVN0cmF0ZWd5Rm9ySmFyKGRlc3RpbmF0aW9uRmlsZSk7Ci0JCQkJc2F2ZShhU2F2ZVN0cmF0ZWd5KTsKLQkJCQlhU2F2ZVN0cmF0ZWd5LmNsb3NlKCk7Ci0JCQkJdGhpcy5jbG9zZSgpOwotCQkJCWlmIChmaWxlRXhpc3RlZCkgewotCQkJCQljbGVhbnVwQWZ0ZXJUZW1wU2F2ZShhVXJpLCBhRmlsZSwgZGVzdGluYXRpb25GaWxlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZXJyb3Jfc2F2aW5nX0VYQ18sIChuZXcgT2JqZWN0W117YVVyaX0pKSwgZXgpOyAvLyA9ICJFcnJvciBzYXZpbmcgIgotCQkJfQotCQl9IGNhdGNoIChTYXZlRmFpbHVyZUV4Y2VwdGlvbiBmYWlsdXJlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChhU2F2ZVN0cmF0ZWd5ICE9IG51bGwpCi0JCQkJCWFTYXZlU3RyYXRlZ3kuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHdlVHJpZWQpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQkJaWYgKCFmaWxlRXhpc3RlZCkKLQkJCQlhRmlsZS5kZWxldGUoKTsKLQkJCXRocm93IGZhaWx1cmU7Ci0JCX0KLQotCQlzZXRVUkkoYVVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTm9SZW9wZW4oKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlzYXZlQXNOb1Jlb3BlbihnZXRVUkkoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3QXJjaGl2ZUNsYXNzTG9hZGVyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlQ2xhc3NMb2FkZXIoamF2YS5sYW5nLkNsYXNzTG9hZGVyIG5ld0FyY2hpdmVDbGFzc0xvYWRlcikgewotCQlhcmNoaXZlQ2xhc3NMb2FkZXIgPSBuZXdBcmNoaXZlQ2xhc3NMb2FkZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXh0cmFDbGFzc3BhdGgKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRyYUNsYXNzcGF0aChqYXZhLmxhbmcuU3RyaW5nIG5ld0V4dHJhQ2xhc3NwYXRoKSB7Ci0JCXByaW1TZXRFeHRyYUNsYXNzcGF0aChuZXdFeHRyYUNsYXNzcGF0aCk7Ci0JCS8vT3B0aW1pemF0aW9uIC0gb25seSByZSBpbml0IGlmIGEgY2wgZXhpc3RzOyBvdGhlcndpc2UgaXQgd2lsbCBpbml0IG9uCi0JCS8vIGRlbWFuZAotCQlpZiAoYXJjaGl2ZUNsYXNzTG9hZGVyICE9IG51bGwpCi0JCQlpbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0KEFyY2hpdmVNYW5pZmVzdCBuZXdNYW5pZmVzdCkgewotCQltYW5pZmVzdCA9IG5ld01hbmlmZXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFuaWZlc3QoamF2YS51dGlsLmphci5NYW5pZmVzdCBhTWFuaWZlc3QpIHsKLQkJc2V0TWFuaWZlc3QoKEFyY2hpdmVNYW5pZmVzdCkgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0SW1wbChhTWFuaWZlc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBDbGFzcy1wYXRoIG1hbmlmZXN0IGVudHJ5LCByZWJ1aWxkcyB0aGUgY2xhc3MgbG9hZGVyLCBhbmQgcmVmcmVzaGVzIGFueSByZWZsZWN0ZWQKLQkgKiBqYXZhIGNsYXNzZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdENsYXNzUGF0aEFuZFJlZnJlc2goU3RyaW5nIGNsYXNzcGF0aCkgewotCQlBcmNoaXZlTWFuaWZlc3QgbWYgPSBnZXRNYW5pZmVzdCgpOwotCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkgewotCQkJbWFrZU1hbmlmZXN0KCk7Ci0JCX0KLQkJbWYuc2V0Q2xhc3NQYXRoKGNsYXNzcGF0aCk7Ci0JCS8vT3B0aW1pemF0aW9uIC0gb25seSByZSBpbml0IGlmIGEgY2wgZXhpc3RzOyBvdGhlcndpc2UgaXQgd2lsbCBpbml0IG9uCi0JCS8vIGRlbWFuZAotCQlpZiAoYXJjaGl2ZUNsYXNzTG9hZGVyICE9IG51bGwpCi0JCQlpbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25zKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnMgbmV3T3B0aW9ucykgewotCQlvcHRpb25zID0gbmV3T3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBPcHRpb25hbCBmaWx0ZXIgZm9yIHNhdmluZyBhIHN1YnNldCBvZiBmaWxlczsgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCBmb3IgYWxsIHNhdmUgYW5kIGV4dHJhY3QKLQkgKiBpbnZva2F0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVGaWx0ZXIob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyIG5ld1NhdmVGaWx0ZXIpIHsKLQkJc2F2ZUZpbHRlciA9IG5ld1NhdmVGaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDQvMDAgMzozMTozMiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2F2ZVN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVTdHJhdGVneShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3kgbmV3U2F2ZVN0cmF0ZWd5KSB7Ci0JCXNhdmVTdHJhdGVneSA9IG5ld1NhdmVTdHJhdGVneTsKLQkJaWYgKG5ld1NhdmVTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQluZXdTYXZlU3RyYXRlZ3kuc2V0QXJjaGl2ZSh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1htbEVuY29kaW5nCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0WG1sRW5jb2RpbmcoamF2YS5sYW5nLlN0cmluZyBuZXdYbWxFbmNvZGluZykgewotCQl4bWxFbmNvZGluZyA9IG5ld1htbEVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSB3aGV0aGVyIGphdmEgcmVmbGVjdGlvbiBzaG91bGQgYmUgc2V0IHVwIGZvciB0aGlzIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VKYXZhUmVmbGVjdGlvbigpIHsKLQkJcmV0dXJuIGdldE9wdGlvbnMoKS51c2VKYXZhUmVmbGVjdGlvbigpICYmIGdldExvYWRTdHJhdGVneSgpLmlzQ2xhc3NMb2FkZXJOZWVkZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0aHJvd1Jlc291cmNlTG9hZEV4Y2VwdGlvbihTdHJpbmcgcmVzb3VyY2VVcmksIEV4Y2VwdGlvbiBleCkgdGhyb3dzIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBSZXNvdXJjZUxvYWRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5sb2FkX3Jlc291cmNlX0VYQ18sIChuZXcgT2JqZWN0W117cmVzb3VyY2VVcmksIGdldFVSSSgpfSkpLCBleCk7IC8vID0gIkNvdWxkIG5vdCBsb2FkIHJlc291cmNlICJ7MH0iIGluIGFyY2hpdmUgInsxfSIiCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXNQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRSZXNvdXJjZXNQYXRoKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCaW5hcmllc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmdldEJpbmFyaWVzUGF0aCgpOwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBlbXB0eUNsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbMF07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBpbnRlcm5hbEdldEJpbmFyaWVzUGF0aCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRCaW5hcmllc1BhdGgoKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgcmV0dXJuIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXRMb2NhbFJ1bnRpbWVDbGFzc1BhdGgoKSB7Ci0KLQkJU3RyaW5nIGFic29sdXRlUGF0aCA9IGludGVybmFsR2V0QmluYXJpZXNQYXRoKCk7Ci0JCWlmIChhYnNvbHV0ZVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBlbXB0eUNsYXNzcGF0aCgpOwotCQlyZXR1cm4gbmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtde2NyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShhYnNvbHV0ZVBhdGgpfTsKLQl9Ci0KLQkKLSAJcHJvdGVjdGVkIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldERlcGVuZGVuY3lDbGFzc1BhdGhBdFRoaXNMZXZlbCgpIHsKLQkJLy8gQlogMTcwNTMyOiBEb24ndCB1c2UgdGhlIGFyY2hpdmUncyBhYnNvbHV0ZSBwYXRoIHdoZW4gdGhlCi0JCS8vIGFyY2hpdmUgaXMgbG9vc2VseSBtYXBwZWQuICBUaGUgY3VycmVudCBhcmNoaXZlJ3MgYWJzb2x1dGUKLQkJLy8gcGF0aCwgZ2VuZXJhbGx5LCB3aWxsIG5vdCBiZSBpbiBhIGZpeGVkIGxvY2F0aW9uIHJlbGF0aXZlCi0JCS8vIHRvIHRoZSBwYXRoIG9mIHRoZSBwYXJlbnQgYXBwbGljYXRpb24uCi0JCVN0cmluZyBwYXJlbnRQYXRoID0gZ2V0UGFyZW50UGF0aCgpOwotCQlpZiAoIHBhcmVudFBhdGggPT0gbnVsbCApCi0gCQkJcmV0dXJuIGVtcHR5Q2xhc3NwYXRoKCk7Ci0JCQotIAkJU3RyaW5nW10gbWZFbnRyaWVzID0gZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJaWYgKCBtZkVudHJpZXMubGVuZ3RoID09IDAgKQotIAkJCXJldHVybiBlbXB0eUNsYXNzcGF0aCgpOwotCQkKLSAJCUxpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZW50cmllcy5hZGRBbGwoIGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyaWVzKG1mRW50cmllcywgcGFyZW50UGF0aCkgKTsKLSAKLQkJcmV0dXJuIChSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSkgZW50cmllcy50b0FycmF5KCBuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5WyBlbnRyaWVzLnNpemUoKSBdICk7Ci0gCX0KLQotCS8qKgotCSAqIDxwPkFuc3dlciBhIHBhcmVudCBwYXRoIGZvciB1c2UgYnkgdGhlIHJlY2VpdmVyLiAgVGFrZSBpbnRvCi0JICogYWNjb3VudCB3ZWh0aGVyIHRoZSByZWNlaXZlciBpcyBhIGxvb3NlIGFwcGxpY2F0aW9uIG9yIG5vdC4KLQkgKiAKLQkgKiA8cD5BbnN3ZXIgbnVsbCBpbiBjYXNlIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIHdoaWxlIGRldGVybWluaW5nCi0JICogdGhlIHBhcmVudCBwYXRoLjwvcD4KLQkgKiAKLQkgKiA8cD5BZGRlZCBmb3IgQlogMTcwNTMyLjwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgcGFyZW50IHBhdGggZm9yIHVzZSBieSB0aGUgcmVjZWl2ZXIuICBOdWxsIGluIGNhc2Ugb2YgYW4gZXJyb3IuCi0JICogCi0JICogIEBzZWUgZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aEF0VGhpc0xldmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcmVudFBhdGgoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoIChnZXRMb2FkU3RyYXRlZ3koKS5nZXRMb29zZUFyY2hpdmUoKSAhPSBudWxsKSAmJiBnZXRDb250YWluZXIoKS5pc0VBUkZpbGUoKSApIHsKLQkJCQlyZXR1cm4gZ2V0RUFSRmlsZSgpLmdldEJpbmFyaWVzUGF0aCgpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShnZXRCaW5hcmllc1BhdGgoKSkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldEZ1bGxSdW50aW1lQ2xhc3NQYXRoKCkgewotCQlyZXR1cm4gY29uY2F0KGdldExvY2FsUnVudGltZUNsYXNzUGF0aCgpLCBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoKCkpOwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBjb25jYXQoUnVudGltZUNsYXNzcGF0aEVudHJ5W10gYXJyYXkxLCBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBhcnJheTIpIHsKLQkJTGlzdCB0ZW1wID0gbmV3IEFycmF5TGlzdCgpOwotCQl0ZW1wLmFkZEFsbChBcnJheXMuYXNMaXN0KGFycmF5MSkpOwotCQl0ZW1wLmFkZEFsbChBcnJheXMuYXNMaXN0KGFycmF5MikpOwotCQlyZXR1cm4gKFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdKSB0ZW1wLnRvQXJyYXkobmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVt0ZW1wLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoKCkgewotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVNldCB2aXNpdGVkID0gbmV3IEhhc2hTZXQoKTsKLQkJU2V0IHByb2Nlc3NlZEVudHJpZXMgPSBuZXcgSGFzaFNldCgpOwotCQl2aXNpdGVkLmFkZCh0aGlzKTsKLQkJZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aCh2aXNpdGVkLCBlbnRyaWVzLCBwcm9jZXNzZWRFbnRyaWVzLCB0aGlzKTsKLQkJcmV0dXJuIChSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSkgZW50cmllcy50b0FycmF5KG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbZW50cmllcy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoKFNldCB2aXNpdGVkQXJjaGl2ZXMsIExpc3QgZW50cmllcywgU2V0IHByb2Nlc3NlZEVudHJpZXMsIEFyY2hpdmUgY3VycmVudCkgewotCi0JCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGxvY2FsID0gKChBcmNoaXZlSW1wbCkgY3VycmVudCkuZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aEF0VGhpc0xldmVsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWwubGVuZ3RoOyBpKyspIHsKLQkJCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGxvY2FsW2ldOwotCQkJaWYgKCFwcm9jZXNzZWRFbnRyaWVzLmNvbnRhaW5zKGVudHJ5KSkgewotCQkJCWVudHJpZXMuYWRkKGVudHJ5KTsKLQkJCQlwcm9jZXNzZWRFbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQl9Ci0JCQlBcmNoaXZlIHJlc29sdmVkID0gZW50cnkuZ2V0UmVmZXJlbmNlZEFyY2hpdmUoKTsKLQkJCWlmIChyZXNvbHZlZCA9PSBudWxsKQotCQkJCUNsYXNzcGF0aFV0aWwucHJvY2Vzc01hbmlmZXN0KGVudHJ5LmdldEFic29sdXRlUGF0aCgpLCBlbnRyaWVzLCBwcm9jZXNzZWRFbnRyaWVzKTsKLQkJCWVsc2UgaWYgKCF2aXNpdGVkQXJjaGl2ZXMuY29udGFpbnMocmVzb2x2ZWQpKSB7Ci0JCQkJdmlzaXRlZEFyY2hpdmVzLmFkZChyZXNvbHZlZCk7Ci0JCQkJZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aCh2aXNpdGVkQXJjaGl2ZXMsIGVudHJpZXMsIHByb2Nlc3NlZEVudHJpZXMsIHJlc29sdmVkKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEVBUkZpbGUgZ2V0RUFSRmlsZSgpIHsKLQkJQ29udGFpbmVyIHBhcmVudCA9IGdldENvbnRhaW5lcigpOwotCQlpZiAocGFyZW50ID09IG51bGwgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBFQVJGaWxlKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEVBUkZpbGUpIHBhcmVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBnZXRSZXNvbHZlZEFyY2hpdmUoU3RyaW5nIG1mVmFsdWUsIEVBUkZpbGUgZWFyKSB7Ci0JCVN0cmluZyBhVXJpID0gQXJjaGl2ZVV0aWwuZGVyaXZlRUFSUmVsYXRpdmVVUkkobWZWYWx1ZSwgdGhpcyk7Ci0JCWlmIChhVXJpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiAoQXJjaGl2ZSkgZWFyLmdldEZpbGUoYVVyaSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleDIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUjaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKEFyY2hpdmUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKEFyY2hpdmUgb3RoZXIpIHsKLQkJaWYgKG90aGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUVBUkZpbGUgZWFyID0gZ2V0RUFSRmlsZSgpOwotCQlpZiAoZWFyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVNldCB2aXNpdGVkID0gbmV3IEhhc2hTZXQoKTsKLQkJcmV0dXJuIGhhc0NsYXNzcGF0aFZpc2liaWxpdHlUbyhvdGhlciwgdmlzaXRlZCwgZWFyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDbGFzc3BhdGhWaXNpYmlsaXR5VG8oQXJjaGl2ZSBvdGhlciwgU2V0IHZpc2l0ZWQsIEVBUkZpbGUgZWFyKSB7Ci0JCWlmICh0aGlzID09IG90aGVyKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh2aXNpdGVkLmNvbnRhaW5zKHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQl2aXNpdGVkLmFkZCh0aGlzKTsKLQkJU3RyaW5nW10gbWZFbnRyaWVzID0gZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZkVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0UmVzb2x2ZWRBcmNoaXZlKG1mRW50cmllc1tpXSwgZWFyKTsKLQkJCWlmIChhbkFyY2hpdmUgIT0gbnVsbCAmJiBhbkFyY2hpdmUuaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKG90aGVyLCB2aXNpdGVkLCBlYXIpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLkFyY2hpdmUjaXNUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUeXBlKFN0cmluZyB0eXBlKSB7Ci0KLQkJcmV0dXJuICh0eXBlcyAhPSBudWxsICYmIGdldFR5cGVzKCkuY29udGFpbnModHlwZSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9DbGllbnRNb2R1bGVSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NsaWVudE1vZHVsZVJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE5NzVhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NsaWVudE1vZHVsZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNsaWVudE1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50TW9kdWxlUmVmSW1wbCBleHRlbmRzIE1vZHVsZVJlZkltcGwgaW1wbGVtZW50cyBDbGllbnRNb2R1bGVSZWYgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDbGllbnRNb2R1bGVSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLkNMSUVOVF9NT0RVTEVfUkVGOwotCX0KLQotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBnZXRBcHBsaWNhdGlvbkNsaWVudCgpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnQpIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2lzQ2xpZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NsaWVudCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19IC8vQ2xpZW50TW9kdWxlUmVmSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Njc2NTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5DbGllbnRNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbm5lY3Rvck1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5BcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5EaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkRpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5OZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5OdWxsTG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5SYXJJbXBvcnRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlRlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5XYXIyMkltcG9ydFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuRGVsZXRlT25FeGl0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBDb21tb25hcmNoaXZlRmFjdG9yeSB7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlDb21tb25hcmNoaXZlRmFjdG9yeSB0aGVDb21tb25hcmNoaXZlRmFjdG9yeSA9IChDb21tb25hcmNoaXZlRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiY29tbW9uYXJjaGl2ZS54bWkiKTsgCi0JCQlpZiAodGhlQ29tbW9uYXJjaGl2ZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVDb21tb25hcmNoaXZlRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIG9wZW5BcmNoaXZlczsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlbGVnYXRlTmVlZHNJbml0ID0gdHJ1ZTsKLQlwcml2YXRlIENvbW1vbmFyY2hpdmVGYWN0b3J5IGRlbGVnYXRlID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCWluaXRQcmVyZXFzKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXREZWxlZ2F0ZSgpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGVOZWVkc0luaXQpIHsKLQkJCWRlbGVnYXRlTmVlZHNJbml0ID0gZmFsc2U7Ci0JCQlkZWxlZ2F0ZSA9IG5ldyBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwoKSB7Ci0KLQkJCQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUdlbigpOwotCQkJCX0KLQotCi0JCQkJcHVibGljIENsaWVudE1vZHVsZVJlZiBjcmVhdGVDbGllbnRNb2R1bGVSZWYoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVDbGllbnRNb2R1bGVSZWZHZW4oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgQ29ubmVjdG9yTW9kdWxlUmVmIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZkdlbigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGUoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVFQVJGaWxlR2VuKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZSgpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZUVKQkphckZpbGVHZW4oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgRUpCTW9kdWxlUmVmIGNyZWF0ZUVKQk1vZHVsZVJlZigpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZUVKQk1vZHVsZVJlZkdlbigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBSQVJGaWxlIGNyZWF0ZVJBUkZpbGUoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVSQVJGaWxlR2VuKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFdBUkZpbGUgY3JlYXRlV0FSRmlsZSgpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZVdBUkZpbGVHZW4oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgV2ViTW9kdWxlUmVmIGNyZWF0ZVdlYk1vZHVsZVJlZigpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZVJlZkdlbigpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFOiByZXR1cm4gY3JlYXRlRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFOiByZXR1cm4gY3JlYXRlQXJjaGl2ZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEU6IHJldHVybiBjcmVhdGVFSkJKYXJGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFOiByZXR1cm4gY3JlYXRlV0FSRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRTogcmV0dXJuIGNyZWF0ZUVBUkZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEU6IHJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWTogcmV0dXJuIGNyZWF0ZVJlYWRPbmx5RGlyZWN0b3J5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFOiByZXR1cm4gY3JlYXRlUkFSRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRjogcmV0dXJuIGNyZWF0ZUVKQk1vZHVsZVJlZigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRjogcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZVJlZigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRjogcmV0dXJuIGNyZWF0ZUNsaWVudE1vZHVsZVJlZigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRjogcmV0dXJuIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgYXJjaGl2ZUNsb3NlZChBcmNoaXZlIGFDbG9zZWRBcmNoaXZlKSB7Ci0JCWdldE9wZW5BcmNoaXZlcygpLnJlbW92ZShhQ2xvc2VkQXJjaGl2ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgYXJjaGl2ZU9wZW5lZChBcmNoaXZlIGFuT3BlbkFyY2hpdmUpIHsKLQkJZ2V0T3BlbkFyY2hpdmVzKCkucHV0KGFuT3BlbkFyY2hpdmUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldE9wZW5BcmNoaXZlc0RlcGVuZGluZ09uKEFyY2hpdmUpfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNsb3NlKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiAhZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24oYW5BcmNoaXZlKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2VPcGVuQXJjaGl2ZXMoKSB7Ci0JCWlmIChnZXRPcGVuQXJjaGl2ZXMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCXN5bmNocm9uaXplZCAoZ2V0T3BlbkFyY2hpdmVzKCkpIHsKLQkJCUxpc3Qgb3BlbmVkID0gbmV3IEFycmF5TGlzdChnZXRPcGVuQXJjaGl2ZXMoKS5zaXplKCkpOwotCQkJSXRlcmF0b3IgaXQgPSBnZXRPcGVuQXJjaGl2ZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCW9wZW5lZC5hZGQoaXQubmV4dCgpKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3BlbmVkLnNpemUoKTsgaSsrKSB7Ci0JCQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSAoQXJjaGl2ZSkgb3BlbmVkLmdldChpKTsKLQkJCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIG5ldyBBcmNoaXZlQ29weVV0aWxpdHkoKS5jb3B5KGFuQXJjaGl2ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIE1vZHVsZUZpbGUgY29weShNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB7Ci0JCXJldHVybiBuZXcgQXJjaGl2ZUNvcHlVdGlsaXR5KCkuY29weShhTW9kdWxlRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVJbml0aWFsaXplZChqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlBcHBsaWNhdGlvbkNsaWVudEZpbGUgY2xpZW50RmlsZSA9IGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCQlpbml0aWFsaXplTmV3QXBwbGljYXRpb25DbGllbnRGaWxlKGNsaWVudEZpbGUsIHVyaSk7Ci0JCXJldHVybiBjbGllbnRGaWxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUFyY2hpdmVJbml0aWFsaXplZChqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IGNyZWF0ZUFyY2hpdmUoKTsKLQkJaW5pdGlhbGl6ZU5ld0FyY2hpdmUoYW5BcmNoaXZlLCB1cmkpOwotCQlyZXR1cm4gYW5BcmNoaXZlOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgY3JlYXRlQXJjaGl2ZUluaXRpYWxpemVkKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gY3JlYXRlQXJjaGl2ZSgpOwotCQlpbml0aWFsaXplTmV3QXJjaGl2ZShhbkFyY2hpdmUsIHVyaSwgb3B0aW9ucyk7Ci0JCXJldHVybiBhbkFyY2hpdmU7Ci0KLQl9Ci0KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5IGNyZWF0ZUNoaWxkTG9hZFN0cmF0ZWd5KFN0cmluZyB1cmksIExvYWRTdHJhdGVneSBwYXJlbnQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0KLQkJTG9hZFN0cmF0ZWd5IGNoaWxkU3RyYXRlZ3kgPSBudWxsOwotCQlpZiAocGFyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZyBkaXJOYW1lID0gKChEaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5KSBwYXJlbnQpLmdldERpcmVjdG9yeVVyaSgpOwotCQkJU3RyaW5nIHF1YWxpZmllZFVyaSA9IEFyY2hpdmVVdGlsLmdldE9TVXJpKGRpck5hbWUsIHVyaSk7Ci0JCQljaGlsZFN0cmF0ZWd5ID0gY3JlYXRlTG9hZFN0cmF0ZWd5KHF1YWxpZmllZFVyaSk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZFN0cmF0ZWd5ID0gY3JlYXRlTmVzdGVkTG9hZFN0cmF0ZWd5KHVyaSwgcGFyZW50KTsKLQkJfQotCQlyZXR1cm4gY2hpbGRTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBjcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJRUFSRmlsZSBlYXJGaWxlID0gY3JlYXRlRUFSRmlsZSgpOwotCQlpbml0aWFsaXplTmV3RUFSRmlsZShlYXJGaWxlLCB1cmkpOwotCQlyZXR1cm4gZWFyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBjcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJRUFSRmlsZSBlYXJGaWxlID0gY3JlYXRlRUFSRmlsZSgpOwotCQlpbml0aWFsaXplTmV3RUFSRmlsZShlYXJGaWxlLCB1cmksIG9wdGlvbnMpOwotCQlyZXR1cm4gZWFyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBjcmVhdGVFSkJKYXJGaWxlSW5pdGlhbGl6ZWQoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gY3JlYXRlRUpCSmFyRmlsZSgpOwotCQlpbml0aWFsaXplTmV3RUpCSmFyRmlsZShlamJKYXJGaWxlLCB1cmkpOwotCQlyZXR1cm4gZWpiSmFyRmlsZTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIGNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZChBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBjcmVhdGVFSkJKYXJGaWxlKCk7Ci0JCWluaXRpYWxpemVOZXdFSkJKYXJGaWxlKGVqYkphckZpbGUsIHVyaSwgb3B0aW9ucyk7Ci0JCXJldHVybiBlamJKYXJGaWxlOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIE51bGxMb2FkU3RyYXRlZ3lJbXBsOyB1c2VkIGZvciBuZXcgYXJjaGl2ZXMKLQkgKi8KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5IGNyZWF0ZUVtcHR5TG9hZFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IE51bGxMb2FkU3RyYXRlZ3lJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBkeW5hbWljYWxseSBidWlsZCBhIGxvYWQgc3RyYXRlZ3kgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uIERldGVybWluZXMgd2hldGhlcgotCSAqIHRoZSB1cmkgcG9pbnRzIHRvIGEgamFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVneQotCSAqLwotCXB1YmxpYyBMb2FkU3RyYXRlZ3kgY3JlYXRlTG9hZFN0cmF0ZWd5KFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gdXJpLnJlcGxhY2UoJy8nLCBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShmaWxlbmFtZSk7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmZpbGVfbm90X2ZvdW5kX0VYQ18sIChuZXcgT2JqZWN0W117dXJpLCBmaWxlLmdldEFic29sdXRlUGF0aCgpfSkpKTsgLy8gPSAiVVJJIE5hbWU6IHswfTsgRmlsZSBuYW1lOiB7MX0iCi0JCX0KLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJcmV0dXJuIG5ldyBEaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbCh1cmkpOwotCQl9Ci0JCXJldHVybiBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuWmlwRmlsZUxvYWRTdHJhdGVneUltcGwoZmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbG9hZCBzdHJhdGVneSBmb3IgYSBuZXN0ZWQgYXJjaGl2ZTsgYnkgZGVmYXVsdCB3aWxsIGV4dHJhY3QgdGhlIG5lc3RlZCBhcmNoaXZlIHRvIGEKLQkgKiB0ZW1wIGZpbGUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIFRoaXMgaXMgYmVjYXVzZSByYW5kb20gYWNjZXNzIHRvIHRoZSB6aXAgZW50cmllcyBpbiBhCi0JICogbmVzdGVkIGFyY2hpdmUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgamF2YS51dGlsLnppcCBwYWNrYWdlLCBhbmQgaWYgdGhlIGFyY2hpdmUncyBjb250ZW50cwotCSAqIGFyZSBiZWluZyBtb2RpZmllZCwgY29waWVkLCBldGMsIHRoaXMgaXMgbXVjaCBmYXN0ZXIuIElmIGEgdGVtcCBmaWxlIGNhbiBub3QgYmUgY3JlYXRlZCwgb3IKLQkgKiBpZiB0aGUgYXJjaGl2ZSBpcyBvcGVuZWQgcmVhZCBvbmx5IChmb3IgcnVudGltZSksIHRoZW4gdXNlIGEgTmVzdGVkQXJjaGl2ZUxvYWRTdHJhdGVneSwgd2hpY2gKLQkgKiByZXRyaWV2ZXMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGVudHJ5IGJ5IHNlcXVlbnRpYWxseSBzZWFyY2hpbmcgYSB6aXAgaW5wdXQgc3RyZWFtCi0JICovCi0JcHVibGljIExvYWRTdHJhdGVneSBjcmVhdGVOZXN0ZWRMb2FkU3RyYXRlZ3koU3RyaW5nIHVyaSwgTG9hZFN0cmF0ZWd5IHBhcmVudCkgewotCQlMb2FkU3RyYXRlZ3kgbG9hZFN0cmF0ZWd5ID0gbnVsbDsKLQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9ICgoQXJjaGl2ZSkgcGFyZW50LmdldENvbnRhaW5lcigpKS5nZXRPcHRpb25zKCk7Ci0KLQkJaWYgKCFvcHRpb25zLmlzUmVhZE9ubHkodXJpKSkKLQkJCWxvYWRTdHJhdGVneSA9IGNyZWF0ZVRlbXBaaXBGaWxlU3RyYXRlZ3lJZlBvc3NpYmxlKHVyaSwgcGFyZW50KTsKLQotCQlpZiAobG9hZFN0cmF0ZWd5ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsKHBhcmVudCk7Ci0JCXJldHVybiBsb2FkU3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFJBUkZpbGUgY3JlYXRlUkFSRmlsZUluaXRpYWxpemVkKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCVJBUkZpbGUgcmFyRmlsZSA9IGNyZWF0ZVJBUkZpbGUoKTsKLQkJaW5pdGlhbGl6ZU5ld1JBUkZpbGUocmFyRmlsZSwgdXJpKTsKLQkJcmV0dXJuIHJhckZpbGU7Ci0JfQotCi0JcHVibGljIExvYWRTdHJhdGVneSBjcmVhdGVUZW1wWmlwRmlsZVN0cmF0ZWd5SWZQb3NzaWJsZShTdHJpbmcgdXJpLCBMb2FkU3RyYXRlZ3kgcGFyZW50KSB7Ci0KLQkJaWYgKCFBcmNoaXZlVXRpbC5zaG91bGRVc2VUZW1wRGlyZWN0b3J5Rm9yUmVhZCgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdHJ5IHsKLQkJCWphdmEuaW8uRmlsZSB0ZW1wRmlsZSA9IEFyY2hpdmVVdGlsLmNyZWF0ZVRlbXBGaWxlKHVyaSk7Ci0JCQlEZWxldGVPbkV4aXRVdGlsaXR5Lm1hcmtGb3JEZWxldGlvbih0ZW1wRmlsZSk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IHBhcmVudC5nZXRJbnB1dFN0cmVhbSh1cmkpOwotCQkJT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsKLQkJCUFyY2hpdmVVdGlsLmNvcHkoaW4sIG91dCk7Ci0JCQlyZXR1cm4gbmV3IFRlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCh0ZW1wRmlsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlBcmNoaXZlVXRpbC5pbmZvcm0oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5tYWtlX3RlbXBfZmlsZV9XQVJOXywgKG5ldyBPYmplY3RbXXt1cml9KSkgKyBleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAvLyA9ICJXYXJuaW5nOiBVbmFibGUgdG8gY3JlYXRlIHRlbXAgZmlsZSBmb3IgezB9LiAgVGhpcyB3aWxsIGltcGFjdCBwZXJmb3JtYW5jZS4iCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFdBUkZpbGUgY3JlYXRlV0FSRmlsZUluaXRpYWxpemVkKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCVdBUkZpbGUgd2FyRmlsZSA9IGNyZWF0ZVdBUkZpbGUoKTsKLQkJaW5pdGlhbGl6ZU5ld1dBUkZpbGUod2FyRmlsZSwgdXJpKTsKLQkJcmV0dXJuIHdhckZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmVPcHRpb25zIGRlZmF1bHRPcHRpb25zKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5KSB7Ci0JCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJb3B0aW9ucy5zZXRMb2FkU3RyYXRlZ3koYUxvYWRTdHJhdGVneSk7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QWN0aXZlRmFjdG9yeSgpIHsKLQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gZ2V0UGFja2FnZSgpOwotCQlpZiAocGtnICE9IG51bGwpCi0JCQlyZXR1cm4gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TWFuaWZlc3RDbGFzc1BhdGhWYWx1ZXMoamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlTdHJpbmdbXSByZXN1bHQgPSBhbkFyY2hpdmUuZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjMvMDEgMjozNTo1NSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5NYXAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLk1hcCBnZXRPcGVuQXJjaGl2ZXMoKSB7Ci0JCWlmIChvcGVuQXJjaGl2ZXMgPT0gbnVsbCkKLQkJCW9wZW5BcmNoaXZlcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgV2Vha0hhc2hNYXAoKSk7Ci0JCXJldHVybiBvcGVuQXJjaGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFNldCBnZXRPcGVuQXJjaGl2ZXNEZXBlbmRpbmdPbihBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlTZXQgZGVwZW5kZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXN5bmNocm9uaXplZCAoZ2V0T3BlbkFyY2hpdmVzKCkpIHsKLQkJCUl0ZXJhdG9yIG9wZW5lZCA9IGdldE9wZW5BcmNoaXZlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAob3BlbmVkLmhhc05leHQoKSkgewotCQkJCUFyY2hpdmUgb3BlbmVkQXJjaGl2ZSA9IChBcmNoaXZlKSBvcGVuZWQubmV4dCgpOwotCQkJCWlmIChvcGVuZWRBcmNoaXZlID09IGFuQXJjaGl2ZSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCFvcGVuZWRBcmNoaXZlLmlzSW5kZXhlZCgpKQotCQkJCQkvLyAqKioqKioqKioqT3B0aW1pemF0aW9uKioqKioqKioqKioKLQkJCQkJLy8gSWYgdGhlIGZpbGUgbGlzdCBoYXMgbmV2ZXIgYmVlbiBidWlsdCBmb3IgdGhlIGFyY2hpdmUsIHdlCi0JCQkJCS8vIGRvbid0IHdhbnQgdG8gdHJpZ2dlcgotCQkJCQkvLyBpdCBub3csCi0JCQkJCS8vIGFuZCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBhcmNoaXZlIGlzIG5vdCBwcmV2ZW50aW5nIHRoZQotCQkJCQkvLyBwYXJhbWV0ZXIgZnJvbSBjbG9zaW5nCi0JCQkJCWNvbnRpbnVlOwotCQkJCUxpc3QgZmlsZXMgPSBvcGVuZWRBcmNoaXZlLmdldEZpbGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotCQkJCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLQkJCQkJaWYgKGFGaWxlLmdldExvYWRpbmdDb250YWluZXIoKSA9PSBhbkFyY2hpdmUpIHsKLQkJCQkJCUFyY2hpdmUgb3V0ZXJtb3N0ID0gb3BlbmVkQXJjaGl2ZTsKLQkJCQkJCUNvbnRhaW5lciBjID0gb3BlbmVkQXJjaGl2ZS5nZXRDb250YWluZXIoKTsKLQkJCQkJCXdoaWxlIChjICE9IG51bGwgJiYgYy5pc0FyY2hpdmUoKSkgewotCQkJCQkJCW91dGVybW9zdCA9IChBcmNoaXZlKSBjOwotCQkJCQkJCWMgPSBjLmdldENvbnRhaW5lcigpOwotCQkJCQkJfQotCQkJCQkJZGVwZW5kZW50cy5hZGQob3V0ZXJtb3N0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvL0VsZW1lbnRzIGZyb20gb25lIG9mIHRoZSBjaGlsZHJlbiAoZS5nLiwgYSBtb2R1bGUgZmlsZSBpbiBhbiBlYXIpIG1heSBoYXZlIGJlZW4gY29waWVkIHRvCi0JCS8vYW5vdGhlciBhcmNoaXZlCi0JCUxpc3QgbmVzdGVkQXJjaGl2ZXMgPSBhbkFyY2hpdmUuZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkQXJjaGl2ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWRlcGVuZGVudHMuYWRkQWxsKGdldE9wZW5BcmNoaXZlc0RlcGVuZGluZ09uKChBcmNoaXZlKSBuZXN0ZWRBcmNoaXZlcy5nZXQoaSkpKTsKLQkJfQotCQlyZXR1cm4gZGVwZW5kZW50czsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdFByZXJlcXMoKSB7Ci0JCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUluaXQuaW52b2tlUHJlcmVxSW5pdHModHJ1ZSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCk7Ci0JCWRpc2MuYWRkQ2hpbGQoRWFyMTJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpKTsKLQkJZGlzYy5hZGRDaGlsZChXYXIyMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCkpOwotCQlkaXNjLmFkZENoaWxkKEFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKSk7Ci0JCWRpc2MuYWRkQ2hpbGQoUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKSk7Ci0JCWRpc2MuYWRkQ2hpbGQoUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3QXBwbGljYXRpb25DbGllbnRGaWxlKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmkpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdBcmNoaXZlKEFyY2hpdmUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpKSB7Ci0JCWFuQXJjaGl2ZS5zZXRVUkkodXJpKTsKLQkJYW5BcmNoaXZlLnNldFNpemUoMCk7Ci0JCWFuQXJjaGl2ZS5zZXRMYXN0TW9kaWZpZWQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhbkFyY2hpdmUuc2V0RGlyZWN0b3J5RW50cnkoZmFsc2UpOwotCQlhbkFyY2hpdmUuc2V0TG9hZFN0cmF0ZWd5KGNyZWF0ZUVtcHR5TG9hZFN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdFQVJGaWxlKEVBUkZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3RUpCSmFyRmlsZShFSkJKYXJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSkgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoTW9kdWxlRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmkpIHsKLQkJaW5pdGlhbGl6ZU5ld0FyY2hpdmUoYW5BcmNoaXZlLCB1cmkpOwotCQlhbkFyY2hpdmUubWFrZURlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3UkFSRmlsZShSQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSkgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld1dBUkZpbGUoV0FSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmkpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdBcHBsaWNhdGlvbkNsaWVudEZpbGUoQXBwbGljYXRpb25DbGllbnRGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucykgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSwgb3B0aW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0FyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpIHsKLQkJaWYgKG9wdGlvbnMuZ2V0TG9hZFN0cmF0ZWd5KCkgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlvcHRpb25zLnNldExvYWRTdHJhdGVneShjcmVhdGVFbXB0eUxvYWRTdHJhdGVneSgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQl9Ci0JCX0KLQotCQlhbkFyY2hpdmUuc2V0VVJJKHVyaSk7Ci0JCWFuQXJjaGl2ZS5zZXRTaXplKDApOwotCQlhbkFyY2hpdmUuc2V0TGFzdE1vZGlmaWVkKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYW5BcmNoaXZlLnNldERpcmVjdG9yeUVudHJ5KGZhbHNlKTsKLQkJYW5BcmNoaXZlLnNldExvYWRTdHJhdGVneShvcHRpb25zLmdldExvYWRTdHJhdGVneSgpKTsKLQkJYW5BcmNoaXZlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3RUFSRmlsZShFQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucykgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSwgb3B0aW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0VKQkphckZpbGUoRUpCSmFyRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmksIG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdNb2R1bGVGaWxlKE1vZHVsZUZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKSB7Ci0JCWluaXRpYWxpemVOZXdBcmNoaXZlKGFuQXJjaGl2ZSwgdXJpLCBvcHRpb25zKTsKLQkJYW5BcmNoaXZlLm1ha2VEZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld1JBUkZpbGUoUkFSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmksIG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdXQVJGaWxlKFdBUkZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIG9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBBcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnRGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShhTG9hZFN0cmF0ZWd5LCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIG9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBBcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnRGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJcmV0dXJuIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKSk7Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCXJldHVybiBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCkpOwotCX0KLQotCS8qKgotCSAqIG9wZW5BcmNoaXZlKFN0cmluZyB1cmkpIC0gb3BlbiB0aGUgYXJjaGl2ZSBieSB0aGUgcGFzc2VkIG5hbWUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlCi0JICogc3RyYXRlZ2llcy4gTmFtZSBtYXkgYmUgYSBwYXRoIHRvIGEgamFyLCBhIHppcCwgb3IgYSBkaXJlY3RvcnkgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBBcmNoaXZlCi0JICogdHlwZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKGphdmEubGFuZy5TdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlyZXR1cm4gb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIFJvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShTdHJpbmcgdXJpLCBTdHJpbmcgZXh0cmFDbGFzc1BhdGgpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCWFuQXJjaGl2ZS5zZXRFeHRyYUNsYXNzcGF0aChleHRyYUNsYXNzUGF0aCk7Ci0JCXJldHVybiBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCkpOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFQVJGaWxlIG9wZW5FQVJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gRWFyMTJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEVBUkZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBvcGVuRUFSRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUoYUxvYWRTdHJhdGVneSwgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBFYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoRUFSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIG9wZW5FQVJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gRWFyMTJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEVBUkZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCMTFKYXJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEVKQkphckZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCMTFKYXJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShhTG9hZFN0cmF0ZWd5LCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQjExSmFyRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsIGRpc2MgPSAoUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsKSBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCk7Ci0JCXJldHVybiAoRUpCSmFyRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShhTG9hZFN0cmF0ZWd5LCB1cmkpOwotCQlSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwgZGlzYyA9IChSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwpIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKTsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmksIFN0cmluZyBleHRyYUNsYXNzUGF0aCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUoYUxvYWRTdHJhdGVneSwgdXJpKTsKLQkJYW5BcmNoaXZlLnNldEV4dHJhQ2xhc3NwYXRoKGV4dHJhQ2xhc3NQYXRoKTsKLQkJUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsIGRpc2MgPSAoUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsKSBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCk7Ci0JCXJldHVybiAoRUpCSmFyRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCVJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCBkaXNjID0gKFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCkgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpOwotCQlyZXR1cm4gKEVKQkphckZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShTdHJpbmcgdXJpLCBTdHJpbmcgZXh0cmFDbGFzc1BhdGgpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCWFuQXJjaGl2ZS5zZXRFeHRyYUNsYXNzcGF0aChleHRyYUNsYXNzUGF0aCk7Ci0JCVJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCBkaXNjID0gKFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCkgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpOwotCQlyZXR1cm4gKEVKQkphckZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UsIEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gbG9vc2UuZ2V0VXJpKCk7Ci0JCXRyeSB7Ci0JCQlpZihsb29zZS5nZXRCaW5hcmllc1BhdGgoKSA9PSBudWxsKXsKLQkJCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5vcGVuX25lc3RlZF9FWENfLCAobmV3IE9iamVjdFtdIHt1cmkscGFyZW50LmdldFVSSSgpfSkpLCBudWxsKTsgLy8gPSAiQ291bGQgbm90IG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlICJ7MH0iIGluICJ7MX0iIgotCQkJfQotCQkJTG9hZFN0cmF0ZWd5IGNoaWxkU3RyYXRlZ3kgPSBjcmVhdGVMb2FkU3RyYXRlZ3kobG9vc2UuZ2V0QmluYXJpZXNQYXRoKCkpOwotCQkJY2hpbGRTdHJhdGVneS5zZXRMb29zZUFyY2hpdmUobG9vc2UpOwotCQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IHBhcmVudC5nZXRPcHRpb25zKCkuY2xvbmVXaXRoKGNoaWxkU3RyYXRlZ3ksIGxvb3NlLmdldFVyaSgpKTsKLQkJCXJldHVybiBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLm9wZW5fbmVzdGVkX0VYQ18sIChuZXcgT2JqZWN0W117dXJpLCBwYXJlbnQuZ2V0VVJJKCl9KSksIGV4KTsgLy8gPSAiQ291bGQgbm90IG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlICJ7MH0iIGluICJ7MX0iIgotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKFN0cmluZyB1cmksIEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJTG9hZFN0cmF0ZWd5IGNoaWxkU3RyYXRlZ3kgPSBjcmVhdGVDaGlsZExvYWRTdHJhdGVneSh1cmksIHBhcmVudC5nZXRMb2FkU3RyYXRlZ3koKSk7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gcGFyZW50LmdldE9wdGlvbnMoKS5jbG9uZVdpdGgoY2hpbGRTdHJhdGVneSwgdXJpKTsKLQkJCWlmIChvcHRpb25zLnNob3VsZERpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzKCkpCi0JCQkJcmV0dXJuIG9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCQlyZXR1cm4gcHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5vcGVuX25lc3RlZF9FWENfLCAobmV3IE9iamVjdFtde3VyaSwgcGFyZW50LmdldFVSSSgpfSkpLCBleCk7IC8vID0gIkNvdWxkIG5vdCBvcGVuIHRoZSBuZXN0ZWQgYXJjaGl2ZSAiezB9IiBpbiAiezF9IiIKLQkJfQotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBSQVJGaWxlIG9wZW5SQVJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IFJhckltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoUkFSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSQVJGaWxlIG9wZW5SQVJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShhTG9hZFN0cmF0ZWd5LCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IFJhckltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoUkFSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSQVJGaWxlIG9wZW5SQVJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChSQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogb3BlblJlYWRPbmx5RGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZWFkT25seURpcmVjdG9yeSBvcGVuUmVhZE9ubHlEaXJlY3RvcnkoamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZSh1cmkpOwotCQlpZiAoIWFGaWxlLmV4aXN0cygpKQotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmNvdWxkX25vdF9maW5kX2Rpcl9FWENfLCAobmV3IE9iamVjdFtde3VyaX0pKSk7IC8vID0gIlVuYWJsZSB0byBvcGVuIGRpcmVjdG9yeSAiCi0JCWlmICghYUZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLm5vdF9hX2Rpcl9FWENfLCAobmV3IE9iamVjdFtde3VyaX0pKSk7IC8vID0gIlVuYWJsZSB0byBvcGVuIGRpcmVjdG9yeSBiZWNhdXNlIGZpbGUgaXMgbm90IGEgZGlyZWN0b3J5IDoiCi0JCUxvYWRTdHJhdGVneSBzdHJhdGVneSA9IG5ldyBSZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwodXJpKTsKLQkJUmVhZE9ubHlEaXJlY3RvcnkgY29udGFpbmVyID0gY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnkoKTsKLQkJY29udGFpbmVyLnNldFVSSSh1cmkpOwotCQljb250YWluZXIuc2V0TG9hZFN0cmF0ZWd5KHN0cmF0ZWd5KTsKLQkJY29udGFpbmVyLnNldExhc3RNb2RpZmllZChhRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogVGFrZSB0aGUgcHJpbWl0aXZlIGFyY2hpdmUgYW5kIHJ1biBpdCB0aHJvdWdoIHRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3JzIHRvIGNvbnZlcnQgaXQgdG8gdGhlCi0JICogY29ycmVjdCBzcGVjaWFsaXplZCB0eXBlOyBhZnRlciBhZnRlciBjb252ZXJzaW9uLCB0ZWxsIHRoZSBhcmNoaXZlIHRvIGluaXRhbGl6ZSBpdHNlbGYgaWYKLQkgKiBuZWNlc3NhcnkuCi0JICovCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3BlblNwZWNpZmljQXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSwgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmICghZGlzYy5jYW5JbXBvcnQoYW5BcmNoaXZlKSkgewotCQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oZGlzYy5nZXRVbmFibGVUb09wZW5NZXNzYWdlKCkpOwotCQl9Ci0JCUFyY2hpdmUgc3BlY2lmaWNBcmNoaXZlID0gZGlzYy5vcGVuQXJjaGl2ZShhbkFyY2hpdmUpOwotCQlzcGVjaWZpY0FyY2hpdmUuaW5pdGlhbGl6ZUFmdGVyT3BlbigpOwotCQlyZXR1cm4gc3BlY2lmaWNBcmNoaXZlOwotCX0KLQotCS8qKgotCSAqIFNwZWNpYWwgY2FzZSBmb3IgZWpiIGphciBmaWxlcywgYmVjYXVzZSBvZiB0aGUgbmVlZCB0byBzdXBwb3J0IG5vbi1jb21wbGlhbnQgMS4wIGphcnMKLQkgKi8KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuU3BlY2lmaWNBcmNoaXZlKEFyY2hpdmUgYW5BcmNoaXZlLCBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwgZGlzYykgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBzcGVjaWZpYyA9IG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCAoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yKSBkaXNjKTsKLQkJaWYgKHNwZWNpZmljID09IGFuQXJjaGl2ZSkgewotCQkJLy9UaGUgZGlzY3JpbWluYXRvciBmYWlsZWQgdG8gY29udmVydCB0aGUgYXJjaHZlIHRvIGFuIGVqYiBqYXIgZmlsZQotCQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oZGlzYy5nZXRVbmFibGVUb09wZW5NZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBzcGVjaWZpYzsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBvcGVuV0FSRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBXYXIyMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoV0FSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXQVJGaWxlIG9wZW5XQVJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShhTG9hZFN0cmF0ZWd5LCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChXQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFdBUkZpbGUgb3BlbldBUkZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBXYXIyMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoV0FSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIHByaW1PcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAob3B0aW9ucy5nZXRMb2FkU3RyYXRlZ3koKSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW9wdGlvbnMuc2V0TG9hZFN0cmF0ZWd5KGNyZWF0ZUxvYWRTdHJhdGVneSh1cmkpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IE9wZW5GYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuY291bGRfbm90X29wZW5fRVhDXywgKG5ldyBPYmplY3RbXXt1cml9KSksIGV4KTsgLy8gPSAiQ291bGQgbm90IG9wZW4gIgotCQkJfQotCQl9Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gY3JlYXRlQXJjaGl2ZSgpOwotCQlhbkFyY2hpdmUuc2V0VVJJKHVyaSk7Ci0JCWFuQXJjaGl2ZS5zZXRPcmlnaW5hbFVSSSh1cmkpOwotCQlhbkFyY2hpdmUuc2V0TG9hZFN0cmF0ZWd5KG9wdGlvbnMuZ2V0TG9hZFN0cmF0ZWd5KCkpOwotCQlhbkFyY2hpdmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5jb250cmlidXRlVHlwZXMoYW5BcmNoaXZlKTsKLQkJcmV0dXJuIGFuQXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBwcmltT3BlbkFyY2hpdmUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwcmltT3BlbkFyY2hpdmUoZGVmYXVsdE9wdGlvbnMoYUxvYWRTdHJhdGVneSksIHVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgcHJpbU9wZW5BcmNoaXZlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwcmltT3BlbkFyY2hpdmUobmV3IEFyY2hpdmVPcHRpb25zKCksIHVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3BlbkFyY2hpdmVzKGphdmEudXRpbC5NYXAgbmV3T3BlbkFyY2hpdmVzKSB7Ci0JCW9wZW5BcmNoaXZlcyA9IG5ld09wZW5BcmNoaXZlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBjcmVhdGVXQVJGaWxlR2VuKCkgewotCQlXQVJGaWxlSW1wbCB3YXJGaWxlID0gbmV3IFdBUkZpbGVJbXBsKCk7Ci0JCXJldHVybiB3YXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIGNyZWF0ZUVKQkphckZpbGVHZW4oKSB7Ci0JCUVKQkphckZpbGVJbXBsIGVqYkphckZpbGUgPSBuZXcgRUpCSmFyRmlsZUltcGwoKTsKLQkJcmV0dXJuIGVqYkphckZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVHZW4oKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwgYXBwbGljYXRpb25DbGllbnRGaWxlID0gbmV3IEFwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwoKTsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBjcmVhdGVFQVJGaWxlR2VuKCkgewotCQlFQVJGaWxlSW1wbCBlYXJGaWxlID0gbmV3IEVBUkZpbGVJbXBsKCk7Ci0JCXJldHVybiBlYXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBSQVJGaWxlIGNyZWF0ZVJBUkZpbGVHZW4oKSB7Ci0JCVJBUkZpbGVJbXBsIHJhckZpbGUgPSBuZXcgUkFSRmlsZUltcGwoKTsKLQkJcmV0dXJuIHJhckZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEZpbGUgY3JlYXRlRmlsZSgpIHsKLQkJRmlsZUltcGwgZmlsZSA9IG5ldyBGaWxlSW1wbCgpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlEaXJlY3RvcnkgY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnkoKSB7Ci0JCVJlYWRPbmx5RGlyZWN0b3J5SW1wbCByZWFkT25seURpcmVjdG9yeSA9IG5ldyBSZWFkT25seURpcmVjdG9yeUltcGwoKTsKLQkJcmV0dXJuIHJlYWRPbmx5RGlyZWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb21tb25hcmNoaXZlUGFja2FnZSBnZXRDb21tb25hcmNoaXZlUGFja2FnZSgpIHsKLQkJcmV0dXJuIChDb21tb25hcmNoaXZlUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uYXJjaGl2ZVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUpCTW9kdWxlUmVmIGNyZWF0ZUVKQk1vZHVsZVJlZkdlbigpIHsKLQkJRUpCTW9kdWxlUmVmSW1wbCBlamJNb2R1bGVSZWYgPSBuZXcgRUpCTW9kdWxlUmVmSW1wbCgpOwotCQlyZXR1cm4gZWpiTW9kdWxlUmVmOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBXZWJNb2R1bGVSZWYgY3JlYXRlV2ViTW9kdWxlUmVmR2VuKCkgewotCQlXZWJNb2R1bGVSZWZJbXBsIHdlYk1vZHVsZVJlZiA9IG5ldyBXZWJNb2R1bGVSZWZJbXBsKCk7Ci0JCXJldHVybiB3ZWJNb2R1bGVSZWY7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENsaWVudE1vZHVsZVJlZiBjcmVhdGVDbGllbnRNb2R1bGVSZWZHZW4oKSB7Ci0JCUNsaWVudE1vZHVsZVJlZkltcGwgY2xpZW50TW9kdWxlUmVmID0gbmV3IENsaWVudE1vZHVsZVJlZkltcGwoKTsKLQkJcmV0dXJuIGNsaWVudE1vZHVsZVJlZjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yTW9kdWxlUmVmIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZkdlbigpIHsKLQkJQ29ubmVjdG9yTW9kdWxlUmVmSW1wbCBjb25uZWN0b3JNb2R1bGVSZWYgPSBuZXcgQ29ubmVjdG9yTW9kdWxlUmVmSW1wbCgpOwotCQlyZXR1cm4gY29ubmVjdG9yTW9kdWxlUmVmOwotCX0KLQotCXB1YmxpYyBDbGllbnRNb2R1bGVSZWYgY3JlYXRlQ2xpZW50TW9kdWxlUmVmKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjbGllbnRGaWxlKSB7Ci0JCUNsaWVudE1vZHVsZVJlZiByZWYgPSBjcmVhdGVDbGllbnRNb2R1bGVSZWYoKTsKLQkJcmVmLnNldE1vZHVsZUZpbGUoY2xpZW50RmlsZSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbW1vbmFyY2hpdmVGYWN0b3J5I2NyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZihSQVJGaWxlKQotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JNb2R1bGVSZWYgY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmKFJBUkZpbGUgcmFyRmlsZSkgewotCQlDb25uZWN0b3JNb2R1bGVSZWYgcmVmID0gY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmKCk7Ci0JCXJlZi5zZXRNb2R1bGVGaWxlKHJhckZpbGUpOwotCQlyZXR1cm4gcmVmOwotCi0JfQotCi0JLyoKLQkgKiBAc2VlIENvbW1vbmFyY2hpdmVGYWN0b3J5I2NyZWF0ZUVKQk1vZHVsZVJlZihFSkJKYXJGaWxlKQotCSAqLwotCXB1YmxpYyBFSkJNb2R1bGVSZWYgY3JlYXRlRUpCTW9kdWxlUmVmKEVKQkphckZpbGUgZWpiSmFyRmlsZSkgewotCQlFSkJNb2R1bGVSZWYgcmVmID0gY3JlYXRlRUpCTW9kdWxlUmVmKCk7Ci0JCXJlZi5zZXRNb2R1bGVGaWxlKGVqYkphckZpbGUpOwotCQlyZXR1cm4gcmVmOwotCX0KLQotCS8qCi0JICogQHNlZSBDb21tb25hcmNoaXZlRmFjdG9yeSNjcmVhdGVXZWJNb2R1bGVSZWYoV0FSRmlsZSkKLQkgKi8KLQlwdWJsaWMgV2ViTW9kdWxlUmVmIGNyZWF0ZVdlYk1vZHVsZVJlZihXQVJGaWxlIHdhckZpbGUpIHsKLQkJV2ViTW9kdWxlUmVmIHJlZiA9IGNyZWF0ZVdlYk1vZHVsZVJlZigpOwotCQlyZWYuc2V0TW9kdWxlRmlsZSh3YXJGaWxlKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVBcmNoaXZlKCkgewotCQlBcmNoaXZlSW1wbCBhcmNoaXZlID0gbmV3IEFyY2hpdmVJbXBsKCk7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCX0KLQotCi0JcHVibGljIENsaWVudE1vZHVsZVJlZiBjcmVhdGVDbGllbnRNb2R1bGVSZWYoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlQ2xpZW50TW9kdWxlUmVmKCk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rvck1vZHVsZVJlZiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmKCk7Ci0JfQotCi0JcHVibGljIEVBUkZpbGUgY3JlYXRlRUFSRmlsZSgpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlKCk7Ci0JfQotCi0JcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZSgpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFSkJKYXJGaWxlKCk7Ci0JfQotCi0JcHVibGljIEVKQk1vZHVsZVJlZiBjcmVhdGVFSkJNb2R1bGVSZWYoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCTW9kdWxlUmVmKCk7Ci0JfQotCi0JcHVibGljIFJBUkZpbGUgY3JlYXRlUkFSRmlsZSgpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVSQVJGaWxlKCk7Ci0JfQotCi0JcHVibGljIFdBUkZpbGUgY3JlYXRlV0FSRmlsZSgpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVXQVJGaWxlKCk7Ci0JfQotCi0JcHVibGljIFdlYk1vZHVsZVJlZiBjcmVhdGVXZWJNb2R1bGVSZWYoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlV2ViTW9kdWxlUmVmKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTk3ZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ2xpZW50TW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbm5lY3Rvck1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XZWJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2Vjb25maWdQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBjbGFzcyBDb21tb25hcmNoaXZlUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBDb21tb25hcmNoaXZlUGFja2FnZSwKLSAqICAgICAgICAgIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25hcmNoaXZlUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBDb21tb25hcmNoaXZlUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFyY2hpdmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYkphckZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdhckZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVhckZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2F0aW9uQ2xpZW50RmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbW9kdWxlRmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGFpbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZWFkT25seURpcmVjdG9yeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmFyRmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbW9kdWxlUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlamJNb2R1bGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlYk1vZHVsZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2xpZW50TW9kdWxlUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb25uZWN0b3JNb2R1bGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb21tb25hcmNoaXZlUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uYXJjaGl2ZVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKENvbW1vbmFyY2hpdmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsIHRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlID0gKENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25hcmNoaXZlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBDb21tb25hcmNoaXZlUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJRWpiUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUpzcFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlMb29zZWNvbmZpZ1BhY2thZ2VJbXBsIHRoZUxvb3NlY29uZmlnUGFja2FnZSA9IChMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMb29zZWNvbmZpZ1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBMb29zZWNvbmZpZ1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTG9vc2Vjb25maWdQYWNrYWdlLmVOU19VUkkpIDogTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlQ29tbW9uYXJjaGl2ZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUxvb3NlY29uZmlnUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlTG9vc2Vjb25maWdQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVDb21tb25hcmNoaXZlUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGNvbnRhaW5lckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250YWluZXJfRmlsZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdBUkZpbGUoKSB7Ci0JCXJldHVybiB3YXJGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3YXJGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNb2R1bGVGaWxlKCkgewotCQlyZXR1cm4gbW9kdWxlRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVBUkZpbGUoKSB7Ci0JCXJldHVybiBlYXJGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllYXJGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUFSRmlsZV9Nb2R1bGVSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWFyRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TW9kdWxlUmVmKCkgewotCQlyZXR1cm4gbW9kdWxlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1vZHVsZVJlZl9Nb2R1bGVGaWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbW9kdWxlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TW9kdWxlUmVmX0VhckZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltb2R1bGVSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2R1bGVSZWZfTW9kdWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbW9kdWxlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFSkJNb2R1bGVSZWYoKSB7Ci0JCXJldHVybiBlamJNb2R1bGVSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXZWJNb2R1bGVSZWYoKSB7Ci0JCXJldHVybiB3ZWJNb2R1bGVSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDbGllbnRNb2R1bGVSZWYoKSB7Ci0JCXJldHVybiBjbGllbnRNb2R1bGVSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25uZWN0b3JNb2R1bGVSZWYoKSB7Ci0JCXJldHVybiBjb25uZWN0b3JNb2R1bGVSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFSkJKYXJGaWxlKCkgewotCQlyZXR1cm4gZWpiSmFyRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UkFSRmlsZSgpIHsKLQkJcmV0dXJuIHJhckZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyYXJGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcmNoaXZlKCkgewotCQlyZXR1cm4gYXJjaGl2ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJjaGl2ZV9UeXBlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFyY2hpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZpbGUoKSB7Ci0JCXJldHVybiBmaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbGVfVVJJKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbGVfTGFzdE1vZGlmaWVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbGVfU2l6ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsZV9EaXJlY3RvcnlFbnRyeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWxlX09yaWdpbmFsVVJJKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbGVfTG9hZGluZ0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWxlX0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlYWRPbmx5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gcmVhZE9ubHlEaXJlY3RvcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gKENvbW1vbmFyY2hpdmVGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJZmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGSUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWxlRUNsYXNzLCBGSUxFX19VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbGVFQ2xhc3MsIEZJTEVfX0xBU1RfTU9ESUZJRUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbGVFQ2xhc3MsIEZJTEVfX1NJWkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbGVFQ2xhc3MsIEZJTEVfX0RJUkVDVE9SWV9FTlRSWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZUVDbGFzcywgRklMRV9fT1JJR0lOQUxfVVJJKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWxlRUNsYXNzLCBGSUxFX19MT0FESU5HX0NPTlRBSU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsZUVDbGFzcywgRklMRV9fQ09OVEFJTkVSKTsKLQotCQlhcmNoaXZlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSQ0hJVkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFyY2hpdmVFQ2xhc3MsIEFSQ0hJVkVfX1RZUEVTKTsKLQotCQllamJKYXJGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVKQl9KQVJfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiSmFyRmlsZUVDbGFzcywgRUpCX0pBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IpOwotCi0JCXdhckZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0FSX0ZJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdhckZpbGVFQ2xhc3MsIFdBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IpOwotCi0JCWVhckZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUFSX0ZJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVhckZpbGVFQ2xhc3MsIEVBUl9GSUxFX19NT0RVTEVfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWFyRmlsZUVDbGFzcywgRUFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0KLQkJYXBwbGljYXRpb25DbGllbnRGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IpOwotCi0JCW1vZHVsZUZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTU9EVUxFX0ZJTEUpOwotCi0JCWNvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRhaW5lckVDbGFzcywgQ09OVEFJTkVSX19GSUxFUyk7Ci0KLQkJcmVhZE9ubHlEaXJlY3RvcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVBRF9PTkxZX0RJUkVDVE9SWSk7Ci0KLQkJcmFyRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSQVJfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmFyRmlsZUVDbGFzcywgUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0KLQkJbW9kdWxlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1PRFVMRV9SRUYpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1vZHVsZVJlZkVDbGFzcywgTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1vZHVsZVJlZkVDbGFzcywgTU9EVUxFX1JFRl9fRUFSX0ZJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1vZHVsZVJlZkVDbGFzcywgTU9EVUxFX1JFRl9fTU9EVUxFKTsKLQotCQllamJNb2R1bGVSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX01PRFVMRV9SRUYpOwotCi0JCXdlYk1vZHVsZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUJfTU9EVUxFX1JFRik7Ci0KLQkJY2xpZW50TW9kdWxlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKENMSUVOVF9NT0RVTEVfUkVGKTsKLQotCQljb25uZWN0b3JNb2R1bGVSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OTkVDVE9SX01PRFVMRV9SRUYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUxvb3NlY29uZmlnUGFja2FnZSB0aGVMb29zZWNvbmZpZ1BhY2thZ2UgPSAoTG9vc2Vjb25maWdQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKExvb3NlY29uZmlnUGFja2FnZS5lTlNfVVJJKTsKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJRWpiUGFja2FnZSB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwotCQlBcHBsaWNhdGlvblBhY2thZ2UgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0JCUNsaWVudFBhY2thZ2UgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSk7Ci0JCUpjYVBhY2thZ2UgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1YnBhY2thZ2VzCi0JCWdldEVTdWJwYWNrYWdlcygpLmFkZCh0aGVMb29zZWNvbmZpZ1BhY2thZ2UpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJZmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlhcmNoaXZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGFpbmVyKCkpOwotCQllamJKYXJGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlRmlsZSgpKTsKLQkJd2FyRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZUZpbGUoKSk7Ci0JCWVhckZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOwotCQlhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOwotCQltb2R1bGVGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QXJjaGl2ZSgpKTsKLQkJY29udGFpbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RmlsZSgpKTsKLQkJcmVhZE9ubHlEaXJlY3RvcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250YWluZXIoKSk7Ci0JCXJhckZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOwotCQltb2R1bGVSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZWpiTW9kdWxlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlUmVmKCkpOwotCQl3ZWJNb2R1bGVSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVSZWYoKSk7Ci0JCWNsaWVudE1vZHVsZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZVJlZigpKTsKLQkJY29ubmVjdG9yTW9kdWxlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlUmVmKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoZmlsZUVDbGFzcywgRmlsZS5jbGFzcywgIkZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbGVfVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJVUkkiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlX0xhc3RNb2RpZmllZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgImxhc3RNb2RpZmllZCIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZV9TaXplKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAic2l6ZSIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZV9EaXJlY3RvcnlFbnRyeSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRpcmVjdG9yeUVudHJ5IiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlX09yaWdpbmFsVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJvcmlnaW5hbFVSSSIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpbGVfTG9hZGluZ0NvbnRhaW5lcigpLCB0aGlzLmdldENvbnRhaW5lcigpLCBudWxsLCAibG9hZGluZ0NvbnRhaW5lciIsIG51bGwsIDEsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpbGVfQ29udGFpbmVyKCksIHRoaXMuZ2V0Q29udGFpbmVyKCksIHRoaXMuZ2V0Q29udGFpbmVyX0ZpbGVzKCksICJjb250YWluZXIiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXJjaGl2ZUVDbGFzcywgQXJjaGl2ZS5jbGFzcywgIkFyY2hpdmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFyY2hpdmVfVHlwZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGVzIiwgbnVsbCwgMCwgLTEsIEFyY2hpdmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJKYXJGaWxlRUNsYXNzLCBFSkJKYXJGaWxlLmNsYXNzLCAiRUpCSmFyRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpLCB0aGVFamJQYWNrYWdlLmdldEVKQkphcigpLCBudWxsLCAiZGVwbG95bWVudERlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBFSkJKYXJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2FyRmlsZUVDbGFzcywgV0FSRmlsZS5jbGFzcywgIldBUkZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmdldFdlYkFwcCgpLCBudWxsLCAiZGVwbG95bWVudERlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBXQVJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWFyRmlsZUVDbGFzcywgRUFSRmlsZS5jbGFzcywgIkVBUkZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVBUkZpbGVfTW9kdWxlUmVmcygpLCB0aGlzLmdldE1vZHVsZVJlZigpLCB0aGlzLmdldE1vZHVsZVJlZl9FYXJGaWxlKCksICJtb2R1bGVSZWZzIiwgbnVsbCwgMSwgLTEsIEVBUkZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSwgdGhlQXBwbGljYXRpb25QYWNrYWdlLmdldEFwcGxpY2F0aW9uKCksIG51bGwsICJkZXBsb3ltZW50RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIEVBUkZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MsIEFwcGxpY2F0aW9uQ2xpZW50RmlsZS5jbGFzcywgIkFwcGxpY2F0aW9uQ2xpZW50RmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCksIHRoZUNsaWVudFBhY2thZ2UuZ2V0QXBwbGljYXRpb25DbGllbnQoKSwgbnVsbCwgImRlcGxveW1lbnREZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgQXBwbGljYXRpb25DbGllbnRGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobW9kdWxlRmlsZUVDbGFzcywgTW9kdWxlRmlsZS5jbGFzcywgIk1vZHVsZUZpbGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbnRhaW5lckVDbGFzcywgQ29udGFpbmVyLmNsYXNzLCAiQ29udGFpbmVyIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lcl9GaWxlcygpLCB0aGlzLmdldEZpbGUoKSwgdGhpcy5nZXRGaWxlX0NvbnRhaW5lcigpLCAiZmlsZXMiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocmVhZE9ubHlEaXJlY3RvcnlFQ2xhc3MsIFJlYWRPbmx5RGlyZWN0b3J5LmNsYXNzLCAiUmVhZE9ubHlEaXJlY3RvcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhyYXJGaWxlRUNsYXNzLCBSQVJGaWxlLmNsYXNzLCAiUkFSRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UkFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpLCB0aGVKY2FQYWNrYWdlLmdldENvbm5lY3RvcigpLCBudWxsLCAiZGVwbG95bWVudERlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBSQVJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobW9kdWxlUmVmRUNsYXNzLCBNb2R1bGVSZWYuY2xhc3MsICJNb2R1bGVSZWYiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kdWxlUmVmX01vZHVsZUZpbGUoKSwgdGhpcy5nZXRNb2R1bGVGaWxlKCksIG51bGwsICJtb2R1bGVGaWxlIiwgbnVsbCwgMSwgMSwgTW9kdWxlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNb2R1bGVSZWZfRWFyRmlsZSgpLCB0aGlzLmdldEVBUkZpbGUoKSwgdGhpcy5nZXRFQVJGaWxlX01vZHVsZVJlZnMoKSwgImVhckZpbGUiLCBudWxsLCAxLCAxLCBNb2R1bGVSZWYuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1vZHVsZVJlZl9Nb2R1bGUoKSwgdGhlQXBwbGljYXRpb25QYWNrYWdlLmdldE1vZHVsZSgpLCBudWxsLCAibW9kdWxlIiwgbnVsbCwgMSwgMSwgTW9kdWxlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWpiTW9kdWxlUmVmRUNsYXNzLCBFSkJNb2R1bGVSZWYuY2xhc3MsICJFSkJNb2R1bGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh3ZWJNb2R1bGVSZWZFQ2xhc3MsIFdlYk1vZHVsZVJlZi5jbGFzcywgIldlYk1vZHVsZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNsaWVudE1vZHVsZVJlZkVDbGFzcywgQ2xpZW50TW9kdWxlUmVmLmNsYXNzLCAiQ2xpZW50TW9kdWxlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29ubmVjdG9yTW9kdWxlUmVmRUNsYXNzLCBDb25uZWN0b3JNb2R1bGVSZWYuY2xhc3MsICJDb25uZWN0b3JNb2R1bGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvL0NvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JNb2R1bGVSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rvck1vZHVsZVJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3NDY3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rvck1vZHVsZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29ubmVjdG9yTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rvck1vZHVsZVJlZkltcGwgZXh0ZW5kcyBNb2R1bGVSZWZJbXBsIGltcGxlbWVudHMgQ29ubmVjdG9yTW9kdWxlUmVmIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdG9yTW9kdWxlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5DT05ORUNUT1JfTU9EVUxFX1JFRjsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcigpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoQ29ubmVjdG9yKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNDb25uZWN0b3IoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdG9yKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0gLy9Db25uZWN0b3JNb2R1bGVSZWZJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29udGFpbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGQ3Nzk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29udGFpbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRhaW5lckltcGwgZXh0ZW5kcyBGaWxlSW1wbCBpbXBsZW1lbnRzIENvbnRhaW5lciB7Ci0KLQotCS8qKgotCSAqIElubmVyIGNsYXNzIHdoaWNoIG1haW50YWlucyB0aGUgaW5kZXggZm9yIHRoZSBkb21haW4ncyBjb2xsZWN0aW9uIG9mIG5vZGVzIGtleWVkIGJ5IG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEZpbGVOb3RpZmljYXRpb25BZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gKHR5cGUgPT0gIkZpbGVOb3RpZmljYXRpb25BZGFwdGVyIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkSW5kZXhlZEZpbGUoU3RyaW5nIG5ld1ZhbHVlLCBOb3RpZmllciBub3RpZmllcikgewotCQkJZmlsZUluZGV4LnB1dChuZXdWYWx1ZSwgbm90aWZpZXIpOwotCQkJaWYgKG5vdGlmaWVyLmVBZGFwdGVycygpID09IG51bGwgfHwgIW5vdGlmaWVyLmVBZGFwdGVycygpLmNvbnRhaW5zKHRoaXMpKQotCQkJCW5vdGlmaWVyLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUluZGV4ZWRGaWxlKFN0cmluZyBvbGRWYWx1ZSwgTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJCWZpbGVJbmRleC5yZW1vdmUob2xkVmFsdWUpOwotCQkJbm90aWZpZXIuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAoZmlsZUluZGV4ID09IG51bGwgfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCS8vSWYgdGhlIG5hbWUgY2hhbmdlZCwgdXBkYXRlIHRoZSBpbmRleAotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkuZXF1YWxzKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxlX1VSSSgpKSAmJiAoKEZpbGUpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKS5nZXRDb250YWluZXIoKSA9PSBDb250YWluZXJJbXBsLnRoaXMpIHsKLQkJCQlmaWxlSW5kZXgucmVtb3ZlKG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKTsKLQkJCQlmaWxlSW5kZXgucHV0KG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCQl9Ci0JCQkvL0hhbmRsZSBhZGRzIGFuZCByZW1vdmVzCi0JCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKS5lcXVhbHMoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRhaW5lcl9GaWxlcygpKSAmJiBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSA9PSBDb250YWluZXJJbXBsLnRoaXMpIHsKLQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOiB7Ci0JCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlhZGRJbmRleGVkRmlsZShmaWxlLmdldFVSSSgpLCBmaWxlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6IHsKLQkJCQkJCXJlbW92ZUluZGV4ZWRGaWxlKCgoRmlsZSkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpLmdldFVSSSgpLCAoRmlsZSkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOiB7Ci0JCQkJCQlmaWxlc0FkZGVkKChMaXN0KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6IHsKLQkJCQkJCWZpbGVzUmVtb3ZlZCgoTGlzdCkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRSA6IHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVCA6IHsKLQkJCQkJCWlmIChub3RpZmljYXRpb24uZ2V0UG9zaXRpb24oKSAhPSBOb3RpZmljYXRpb24uTk9fSU5ERVgpIHsgLy9UaGlzIGlzIG5vdyBhCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIHJlcGxhY2UgaW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTU9GMgotCQkJCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCQlyZW1vdmVJbmRleGVkRmlsZSgoKEZpbGUpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKS5nZXRVUkkoKSwgKEZpbGUpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCQlhZGRJbmRleGVkRmlsZShmaWxlLmdldFVSSSgpLCBmaWxlKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZmlsZXNBZGRlZChMaXN0IG5ld0ZpbGVzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRmlsZSBmaWxlID0gKEZpbGUpIG5ld0ZpbGVzLmdldChpKTsKLQkJCQlhZGRJbmRleGVkRmlsZShmaWxlLmdldFVSSSgpLCBmaWxlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGZpbGVzUmVtb3ZlZChMaXN0IG9sZEZpbGVzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRmlsZSBmaWxlID0gKEZpbGUpIG9sZEZpbGVzLmdldChpKTsKLQkJCQlyZW1vdmVJbmRleGVkRmlsZShmaWxlLmdldFVSSSgpLCBmaWxlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlYnVpbGRGaWxlSW5kZXgoKSB7Ci0JCQlyZW1vdmVBZGFwdGVyc0lmTmVjZXNzYXJ5KCk7Ci0JCQlmaWxlSW5kZXggPSBuZXcgSGFzaE1hcCgpOwotCi0JCQkvLyBJZiB0aGUgcHJpbWFyeSBjb2xsZWN0aW9uIGFscmVhZHkgaGFzIGVsZW1lbnRzLAotCQkJLy8ncmVmbGVjdCB0aGVtIGluIHRoZSBpbmRleC4uLgotCQkJaWYgKGdldEZpbGVzKCkuc2l6ZSgpID4gMCkgewotCQkJCUl0ZXJhdG9yIGkgPSBnZXRGaWxlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBpLm5leHQoKTsKLQkJCQkJYWRkSW5kZXhlZEZpbGUoZmlsZS5nZXRVUkkoKSwgZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWRhcHRlcnNJZk5lY2Vzc2FyeSgpIHsKLQkJCWlmIChmaWxlSW5kZXggPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJdGVyYXRvciBpdGVyID0gZmlsZUluZGV4LnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlGaWxlIGFGaWxlID0gKEZpbGUpIGl0ZXIubmV4dCgpOwotCQkJCWFGaWxlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBJbXBsZW1lbnRlciBmb3IgbG9hZGluZyBlbnRyaWVzIGluIHRoaXMgY29udGFpbmVyICovCi0JcHJvdGVjdGVkIExvYWRTdHJhdGVneSBsb2FkU3RyYXRlZ3k7Ci0JLyoqCi0JICogSW5kZXggdG8gcHJvdmlkZSBmYXN0IGxvb2t1cCBieSBuYW1lIG9mIGZpbGVzLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZmlsZUluZGV4OwotCS8qKgotCSAqIEFuIGFkYXB0ZXIgd2hpY2ggbWFpbnRhaW5zIHRoZSBmaWxlIGluZGV4Ci0JICovCi0JcHJvdGVjdGVkIEZpbGVOb3RpZmljYXRpb25BZGFwdGVyIGZpbGVJbmRleEFkYXB0ZXI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGZpbGVzID0gbnVsbDsKLQotCXB1YmxpYyBDb250YWluZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLkNPTlRBSU5FUjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmlsZShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHsKLQkJU3RyaW5nIGtleSA9IGFVcmkuc3RhcnRzV2l0aCgiLyIpID8gQXJjaGl2ZVV0aWwudHJ1bmNhdGVGcm9tRnJvbnRJZ25vcmVDYXNlKGFVcmksICIvIikgOiBhVXJpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCWlmIChpc0luZGV4ZWQoKSkKLQkJCXJldHVybiBnZXRGaWxlSW5kZXgoKS5jb250YWluc0tleShrZXkpOwotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuY29udGFpbnMoa2V5KTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db250YWluZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RmlsZShTdHJpbmcgVVJJKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoIWlzSW5kZXhlZCgpKSB7Ci0JCQlnZXRGaWxlcygpOwotCQl9Ci0JCUZpbGUgZmlsZSA9IChGaWxlKSBnZXRGaWxlSW5kZXgoKS5nZXQoVVJJKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uKFVSSSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDUvMDAgNzoyMDoyMSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5NYXAKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLk1hcCBnZXRGaWxlSW5kZXgoKSB7Ci0JCWlmIChmaWxlSW5kZXggPT0gbnVsbCkKLQkJCWdldEZpbGVJbmRleEFkYXB0ZXIoKS5yZWJ1aWxkRmlsZUluZGV4KCk7Ci0JCXJldHVybiBmaWxlSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDUvMDAgNzoyMDoyMSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIEZpbGVOb3RpZmljYXRpb25BZGFwdGVyCi0JICovCi0JcHJvdGVjdGVkIEZpbGVOb3RpZmljYXRpb25BZGFwdGVyIGdldEZpbGVJbmRleEFkYXB0ZXIoKSB7Ci0JCWlmIChmaWxlSW5kZXhBZGFwdGVyID09IG51bGwpIHsKLQkJCWZpbGVJbmRleEFkYXB0ZXIgPSBuZXcgRmlsZU5vdGlmaWNhdGlvbkFkYXB0ZXIoKTsKLQkJCWVBZGFwdGVycygpLmFkZChmaWxlSW5kZXhBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gZmlsZUluZGV4QWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0IGlzIGJ1aWx0IG9uIGRlbWFuZCwgYnkgcmVxdWVzdGluZyBmcm9tIHRoZSBsb2FkIHN0cmF0ZWd5LgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRGaWxlcygpIHsKLQkJRUxpc3QgZmlsZXNMaXN0ID0gdGhpcy5nZXRGaWxlc0dlbigpOwotCQlpZiAoIWlzSW5kZXhlZCgpKSB7Ci0JCQlpZiAoZmlsZXNMaXN0LmlzRW1wdHkoKSAmJiBnZXRMb2FkU3RyYXRlZ3koKSAhPSBudWxsKSB7Ci0JCQkJZmlsZXNMaXN0LmFkZEFsbChnZXRMb2FkU3RyYXRlZ3koKS5jb2xsZWN0RmlsZXMoKSk7Ci0JCQl9Ci0JCQkvL0NhdXNlcyB0aGUgaW5kZXggdG8gYmUgYnVpbHQKLQkJCWdldEZpbGVJbmRleCgpOwotCQl9Ci0JCXJldHVybiBmaWxlc0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUgTG9va3MgZm9yIGEgZmlsZSB3aXRoIHRoZSBnaXZlbiB1cmksIGFuZCByZXR1cm5zIGFuCi0JICogICAgICBpbnB1dCBzdHJlYW07IG9wdGltaXphdGlvbjogaWYgdGhlIGZpbGUgbGlzdCBoYXMgbm90IGJlZW4gYnVpbHQsIGdvZXMgZGlyZWN0bHkgdG8gdGhlCi0JICogICAgICBsb2FkU3RyYXRlZ3kuCi0JICovCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZyBhVXJpKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoaXNJbmRleGVkKCkpIHsKLQkJCXJldHVybiBnZXRGaWxlKGFVcmkpLmdldElucHV0U3RyZWFtKCk7Ci0JCX0KLQkJcmV0dXJuIHByaW1HZXRJbnB1dFN0cmVhbShhVXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5IGdldExvYWRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGxvYWRTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCkgewotCQlyZXR1cm4gZmlsZUluZGV4ICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUgR29lcyBkaXJlY3RseSB0byB0aGUgbG9hZFN0cmF0ZWd5LgotCSAqLwotCXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIHByaW1HZXRJbnB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRJbnB1dFN0cmVhbShhVXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWJ1aWxkRmlsZUluZGV4KCkgewotCQlnZXRGaWxlSW5kZXhBZGFwdGVyKCkucmVidWlsZEZpbGVJbmRleCgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0xvYWRTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2FkU3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5IG5ld0xvYWRTdHJhdGVneSkgewotCi0JCWlmIChuZXdMb2FkU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJbmV3TG9hZFN0cmF0ZWd5LnNldENvbnRhaW5lcih0aGlzKTsKLQkJCWlmIChsb2FkU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJCW5ld0xvYWRTdHJhdGVneS5zZXRSZW5kZXJlclR5cGUobG9hZFN0cmF0ZWd5LmdldFJlbmRlcmVyVHlwZSgpKTsKLQkJCQluZXdMb2FkU3RyYXRlZ3kuc2V0UmVhZE9ubHkobG9hZFN0cmF0ZWd5LmlzUmVhZE9ubHkoKSk7Ci0JCQkJbG9hZFN0cmF0ZWd5LnNldENvbnRhaW5lcihudWxsKTsKLQkJCQlsb2FkU3RyYXRlZ3kuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlsb2FkU3RyYXRlZ3kgPSBuZXdMb2FkU3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RmlsZXNHZW4oKSB7Ci0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQlmaWxlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KEZpbGUuY2xhc3MsIHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUik7Ci0JCX0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6Ci0JCQkJcmV0dXJuIGdldEZpbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTOgotCQkJCXJldHVybiBmaWxlcyAhPSBudWxsICYmICFmaWxlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyRmlsZXMoKSB7Ci0JCWJvb2xlYW4gb2xkRGVsaXZlcnkgPSBlRGVsaXZlcigpOwotCQlmaWxlcy5jbGVhcigpOwotCQllU2V0RGVsaXZlcihvbGREZWxpdmVyeSk7Ci0JCWlmIChpc0luZGV4ZWQoKSkgewotCQkJZUFkYXB0ZXJzKCkucmVtb3ZlKGZpbGVJbmRleEFkYXB0ZXIpOwotCQkJZmlsZUluZGV4QWRhcHRlciA9IG51bGw7Ci0JCQlmaWxlSW5kZXggPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FQVJGaWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FQVJGaWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWVjODA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUFSRmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Db25uZWN0b3JNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkRlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5FbXB0eVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlVdGlsaXR5OwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRUFSRmlsZUltcGwgZXh0ZW5kcyBNb2R1bGVGaWxlSW1wbCBpbXBsZW1lbnRzIEVBUkZpbGUgewotCi0JLyoqCi0JICogSW50ZXJuYWw7IGNsaWVudHMgc2hvdWxkIHVzZSB7QGxpbmsgI2dldE1vZHVsZVJlZihNb2R1bGUpfQotCSAqLwotCXB1YmxpYyBNb2R1bGVGaWxlIGdldE1vZHVsZUZpbGUoTW9kdWxlIG1vZHVsZURlc2NyaXB0b3IpIHsKLQkJTW9kdWxlUmVmIHJlZiA9IGdldE1vZHVsZVJlZihtb2R1bGVEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIChyZWYgPT0gbnVsbCkgPyBudWxsIDogcmVmLmdldE1vZHVsZUZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBNb2R1bGVGaWxlIGFkZENvcHkoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCByZXN1bHQgPSBwcmltQWRkQ29weVJlZihhTW9kdWxlRmlsZSk7Ci0JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBNb2R1bGVSZWYpCi0JCQlyZXR1cm4gKChNb2R1bGVSZWYpIHJlc3VsdCkuZ2V0TW9kdWxlRmlsZSgpOwotCi0JCXJldHVybiAoTW9kdWxlRmlsZSkgcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbiBkZXBsb3ltZW50RGVzY3JpcHRvciA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1vZHVsZVJlZnMgPSBudWxsOwotCi0JcHVibGljIEVBUkZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLkVBUl9GSUxFOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlIGFkZENvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGFuQXJjaGl2ZS5pc01vZHVsZUZpbGUoKSkKLQkJCXJldHVybiBhZGRDb3B5KChNb2R1bGVGaWxlKSBhbkFyY2hpdmUpOwotCQlBcmNoaXZlIGNvcHkgPSBzdXBlci5hZGRDb3B5KGFuQXJjaGl2ZSk7Ci0JCWNvcHkuaW5pdGlhbGl6ZUNsYXNzTG9hZGVyKCk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgcHJpbUFkZENvcHlSZWYoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCS8vZm9yY2UgdGhpcyBsaXN0IHRvIGdldCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGFkZAotCQlFTGlzdCByZWZzID0gZ2V0TW9kdWxlUmVmcygpOwotCi0JCWlmIChhTW9kdWxlRmlsZS5pc0VBUkZpbGUoKSkKLQkJCS8vSWYgaXQncyBhbiBlYXIgdGhlbiBqdXN0IHRyZWF0IGl0IGxpa2UgYW55IG90aGVyIGFyY2hpdmUKLQkJCXJldHVybiBzdXBlci5hZGRDb3B5KGFNb2R1bGVGaWxlKTsKLQkJY2hlY2tBZGRWYWxpZChhTW9kdWxlRmlsZSk7Ci0JCU1vZHVsZUZpbGUgY29weSA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY29weShhTW9kdWxlRmlsZSk7Ci0JCU1vZHVsZSBuZXdNb2R1bGUgPSBjcmVhdGVNb2R1bGVGb3JDb3B5aW5nKGFNb2R1bGVGaWxlKTsKLQkJZ2V0RmlsZXMoKS5hZGQoY29weSk7Ci0JCWNvcHkuaW5pdGlhbGl6ZUNsYXNzTG9hZGVyKCk7Ci0JCWlmICghY29weS5nZXRVUkkoKS5lcXVhbHMobmV3TW9kdWxlLmdldFVyaSgpKSkKLQkJCWNvcHkuc2V0VVJJKG5ld01vZHVsZS5nZXRVcmkoKSk7Ci0KLQkJZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCkuYWRkKG5ld01vZHVsZSk7Ci0JCU1vZHVsZVJlZiBhUmVmID0gY3JlYXRlTW9kdWxlUmVmKG5ld01vZHVsZSwgY29weSk7Ci0JCXJlZnMuYWRkKGFSZWYpOwotCQlyZXR1cm4gYVJlZjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBNb2R1bGVSZWYgYWRkQ29weVJlZihNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJT2JqZWN0IHJlc3VsdCA9IHByaW1BZGRDb3B5UmVmKGFNb2R1bGVGaWxlKTsKLQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE1vZHVsZVJlZikKLQkJCXJldHVybiAoTW9kdWxlUmVmKSByZXN1bHQ7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIFNlY3VyaXR5Um9sZSBhZGRDb3B5KFNlY3VyaXR5Um9sZSBhUm9sZSwgTW9kdWxlIGFNb2R1bGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlFT2JqZWN0IGRkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRkID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoYU1vZHVsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZGRfaW5fZWFyX2xvYWRfRVhDXywgKG5ldyBPYmplY3RbXXthTW9kdWxlLmdldFVyaSgpLCBnZXRVUkkoKX0pKSwgZSk7IC8vID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgbW9kdWxlICJ7MH0iIGluIGVhciBmaWxlICJ7MX0iIgotCQl9Ci0JCVN0cmluZyByb2xlTmFtZSA9IGFSb2xlLmdldFJvbGVOYW1lKCk7Ci0JCVNlY3VyaXR5Um9sZSBjb3B5ID0gKFNlY3VyaXR5Um9sZSkgRXRvb2xzQ29weVV0aWxpdHkuY3JlYXRlQ29weShhUm9sZSk7Ci0JCWlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpIHsKLQkJCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKSBkZDsKLQkJCWlmIChlamJKYXIuY29udGFpbnNTZWN1cml0eVJvbGUocm9sZU5hbWUpKQotCQkJCXRocm93IG5ldyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5kdXBfc2VjX3JvbGVfbW9kdWxlX0VYQ18sIChuZXcgT2JqZWN0W117YU1vZHVsZS5nZXRVcmkoKSwgcm9sZU5hbWV9KSksIGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVOYW1lZChyb2xlTmFtZSkpOyAvLyA9ICJEZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIHswfSBhbHJlYWR5IGNvbnRhaW5zIGEgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MX0iCi0JCQlnZXRBc3NlbWJseURlc2NyaXB0b3JBZGRJZk5lY2Vzc2FyeShlamJKYXIpLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoY29weSk7Ci0JCX0gZWxzZSBpZiAoYU1vZHVsZS5pc1dlYk1vZHVsZSgpKSB7Ci0JCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgZGQ7Ci0JCQlpZiAod2ViQXBwLmNvbnRhaW5zU2VjdXJpdHlSb2xlKHJvbGVOYW1lKSkKLQkJCQl0aHJvdyBuZXcgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZHVwX3NlY19yb2xlX21vZHVsZV9FWENfLCAobmV3IE9iamVjdFtde2FNb2R1bGUuZ2V0VXJpKCksIHJvbGVOYW1lfSkpLCB3ZWJBcHAuZ2V0U2VjdXJpdHlSb2xlTmFtZWQocm9sZU5hbWUpKTsvLyA9ICJEZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIHswfSBhbHJlYWR5IGNvbnRhaW5zIGEgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MX0iCi0JCQl3ZWJBcHAuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChjb3B5KTsKLQkJfQotCQlhZGRDb3B5SWZOb3RFeGlzdHMoYVJvbGUpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGUgYWRkQ29weUlmTm90RXhpc3RzKFNlY3VyaXR5Um9sZSBhUm9sZSkgewotCQlBcHBsaWNhdGlvbiBkZCA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCVNlY3VyaXR5Um9sZSBjb3B5ID0gbnVsbDsKLQkJaWYgKCFkZC5jb250YWluc1NlY3VyaXR5Um9sZShhUm9sZS5nZXRSb2xlTmFtZSgpKSkgewotCQkJY29weSA9IChTZWN1cml0eVJvbGUpIEV0b29sc0NvcHlVdGlsaXR5LmNyZWF0ZUNvcHkoYVJvbGUpOwotCQkJZGQuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChjb3B5KTsKLQkJfQotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0R1cGxpY2F0ZShTdHJpbmcgYVVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0R1cGxpY2F0ZShhVXJpKSkKLQkJCXRocm93IG5ldyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5kdXBfcmVzb3VyY2VfRVhDXywgKG5ldyBPYmplY3RbXXthVXJpLCBnZXRVUkkoKX0pKSk7IC8vID0gIlJlc291cmNlIG5hbWVkICJ7MH0iIGFscmVhZHkgZXhpc3RzIGluIGFyY2hpdmUgInsxfSIiCi0JfQotCi0KLQlwcm90ZWN0ZWQgTW9kdWxlIGNyZWF0ZU1vZHVsZUZvckNvcHlpbmcoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgewotCQlNb2R1bGUgYU1vZHVsZSA9IG51bGw7Ci0JCWlmIChhTW9kdWxlRmlsZS5pc1dBUkZpbGUoKSkgewotCQkJYU1vZHVsZSA9IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZVdlYk1vZHVsZSgpOwotCQl9IGVsc2UgaWYgKGFNb2R1bGVGaWxlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQlhTW9kdWxlID0gZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkuY3JlYXRlRWpiTW9kdWxlKCk7Ci0JCX0gZWxzZSBpZiAoYU1vZHVsZUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJYU1vZHVsZSA9IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZUphdmFDbGllbnRNb2R1bGUoKTsKLQkJfSBlbHNlIGlmIChhTW9kdWxlRmlsZS5pc1JBUkZpbGUoKSkgewotCQkJYU1vZHVsZSA9IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpOwotCQl9Ci0JCWFNb2R1bGUuc2V0VXJpKGFNb2R1bGVGaWxlLmdldFVSSSgpKTsKLQkJcmV0dXJuIGFNb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gVGFrZXMgaW50byBhY2NvdW50Ci0JICogYWx0REQgaW5kaXJlY3Rpb24uCi0JICogCi0JICogQHJldHVybiBPbmx5IHJldHVybiBudWxsIGlmIGFuIGFsdEREIGlzIG5vdCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEFsdERlcGxveW1lbnREZXNjcmlwdG9yKE1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQkvLyBMb29rIGZvciBhbHRERAotCQlTdHJpbmcgYWx0REQgPSBhTW9kdWxlLmdldEFsdEREKCk7Ci0JCWlmIChBcmNoaXZlVXRpbC5pc051bGxPckVtcHR5KGFsdEREKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWlzTW9mUmVzb3VyY2VMb2FkZWQoYWx0REQudHJpbSgpKSkKLQkJCXJlZ2lzdGVyUmVzb3VyY2VGYWN0b3J5KGFNb2R1bGUsIGFsdEREKTsKLQkJWE1MUmVzb3VyY2UgZGRSZXMgPSAoWE1MUmVzb3VyY2UpIGdldE1vZlJlc291cmNlKGFsdERELnRyaW0oKSk7Ci0JCWlmICghZGRSZXMuaXNBbHQoKSkgewotCQkJZGRSZXMuc2V0SXNBbHQodHJ1ZSk7Ci0JCQlkZFJlcy5zZXRBcHBsaWNhdGlvbihnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpKTsKLQkJfQotCQlyZXR1cm4gQXJjaGl2ZVV0aWwuZ2V0Um9vdChkZFJlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGVzKCkgewotCQlMaXN0IGNsaWVudEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJCWNsaWVudEZpbGVzLmFkZChhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNsaWVudEZpbGVzOwotCX0KLQotCXByb3RlY3RlZCBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkgewotCQlyZXR1cm4gKChBcHBsaWNhdGlvblBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSkuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFzc2VtYmx5RGVzY3JpcHRvciBnZXRBc3NlbWJseURlc2NyaXB0b3JBZGRJZk5lY2Vzc2FyeShFSkJKYXIgZWpiSmFyKSB7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBhZCA9IGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJaWYgKGFkID09IG51bGwpIHsKLQkJCWFkID0gKChFamJQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpKS5nZXRFamJGYWN0b3J5KCkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCQllamJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKGFkKTsKLQkJfQotCQlyZXR1cm4gYWQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCUFwcGxpY2F0aW9uIGRkID0gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwotCQlpZiAoZGQgPT0gbnVsbCAmJiBjYW5MYXp5SW5pdGlhbGl6ZSgpKSB7Ci0JCQl0cnkgewotCQkJCWdldEltcG9ydFN0cmF0ZWd5KCkuaW1wb3J0TWV0YURhdGEoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3QgZWxlbWVudCBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuIFRha2VzIGludG8gYWNjb3VudAotCSAqIGFsdEREIGluZGlyZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3IgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoQ29ubmVjdG9yTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoQ29ubmVjdG9yKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoTW9kdWxlKSBhTW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IGVsZW1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiBUYWtlcyBpbnRvIGFjY291bnQKLQkgKiBhbHRERCBpbmRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyIGdldERlcGxveW1lbnREZXNjcmlwdG9yKEVqYk1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQlyZXR1cm4gKEVKQkphcikgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKE1vZHVsZSkgYU1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gVGFrZXMgaW50byBhY2NvdW50Ci0JICogYWx0REQgaW5kaXJlY3Rpb24uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldERlcGxveW1lbnREZXNjcmlwdG9yKEphdmFDbGllbnRNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudCkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKE1vZHVsZSkgYU1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gVGFrZXMgaW50byBhY2NvdW50Ci0JICogYWx0REQgaW5kaXJlY3Rpb24uCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCUVPYmplY3QgZGQgPSBnZXRBbHREZXBsb3ltZW50RGVzY3JpcHRvcihhTW9kdWxlKTsKLQkJaWYgKGRkID09IG51bGwpCi0JCQlkZCA9IGdldE1vZHVsZUZpbGUoYU1vZHVsZSkuZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlyZXR1cm4gZGQ7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gVGFrZXMgaW50byBhY2NvdW50Ci0JICogYWx0REQgaW5kaXJlY3Rpb24uCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihXZWJNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChXZWJBcHApIGdldERlcGxveW1lbnREZXNjcmlwdG9yKChNb2R1bGUpIGFNb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Nb2R1bGVGaWxlCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRFSkJKYXJGaWxlcygpIHsKLQkJTGlzdCBlamJKYXJGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlTGlzdCA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZUxpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQkJZWpiSmFyRmlsZXMuYWRkKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWpiSmFyRmlsZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMuIFRoZSBlamItbGluayB2YWx1ZSBvZiB0aGUKLQkgKiByZWYgbXVzdCBlcXVhdGUgdG8gYSBuYW1lZCBlbnRlcnByaXNlIGJlYW4gY29udGFpbmVkIGluIHRoZSBqYXI7IG90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBoaXQgZm91bmQ7IGFzc3VtcHRpb24gdGhhdCB0aGUgZWpiIG5hbWVzIGFyZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUKLQkgKiBlYXIgZmlsZS4gVGhpcyB3aWxsIGxpa2VseSBiZSByZXBsYWNlZCB3aXRoIGEgYmV0dGVyIHdheSBmb3IgZGVyZWZlcmVuY2luZyBlamIgcmVmcy4KLQkgKiAKLQkgKiBDYW4gYmUgdXNlZCB3aXRoIGVqYiAxLjEgcmVmZXJlbmNlcyBvbmx5LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHtAbGluayNnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmLCBTdHJpbmcgbW9kdWxlVXJpICkKLQkgKiBAcGFyYW0gRWpiUmVmCi0JICogICAgICAgICAgICByZWYgLSBBbiBlamIgcmVmZXJlbmNlCi0JICogQHJldHVybiBFbnRlcnByaXNlQmVhbgotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmKSB7Ci0JCVN0cmluZyBsaW5rID0gcmVmLmdldExpbmsoKTsKLQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBqYXJGaWxlcyA9IGdldEVKQkphckZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamFyRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoKEVKQkphckZpbGUpIGphckZpbGVzLmdldChpKSkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRFbnRlcnByaXNlQmVhbk5hbWVkKGxpbmspOwotCQkJaWYgKGJlYW4gIT0gbnVsbCkgewotCQkJCXJldHVybiBiZWFuOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmLCBpZiBvbmUgZXhpc3RzLiBUaGUgZWpiLWxpbmsgdmFsdWUgb2YgdGhlCi0JICogcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICogUmV0dXJucyB0aGUgZmlyc3QgaGl0IGZvdW5kOyBhc3N1bXB0aW9uIHRoYXQgdGhlIGVqYiBuYW1lcyBhcmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlCi0JICogZWFyIGZpbGUuIFRoaXMgd2lsbCBsaWtlbHkgYmUgcmVwbGFjZWQgd2l0aCBhIGJldHRlciB3YXkgZm9yIGRlcmVmZXJlbmNpbmcgZWpiIHJlZnMKLQkgKiAKLQkgKiBDYW4gYmUgdXNlZCB3aXRoIGVqYiAxLjEgJiBlamIgMi4wIHJlZmVyZW5jZXMuCi0JICogCi0JICogQHBhcmFtIEVqYlJlZgotCSAqICAgICAgICAgICAgcmVmIC0gQW4gZWpiIHJlZmVyZW5jZQotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIG1vZHVsZVVyaSAtIFRoZSBtb2R1bGUgdXJpCi0JICogQHJldHVybiBFbnRlcnByaXNlQmVhbgotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmLCBTdHJpbmcgbW9kdWxlVXJpKSB7Ci0JCVN0cmluZyBsaW5rID0gcmVmLmdldExpbmsoKTsKLQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0vLyBpZgotCi0JCWlmIChsaW5rLmluZGV4T2YoJyMnKSA9PSAtMSkgewotCQkJRW50ZXJwcmlzZUJlYW4gbGlua2VkRUpCID0gbnVsbDsKLQkJCVhNTFJlc291cmNlIHJlcyA9IChYTUxSZXNvdXJjZSkgcmVmLmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyBpbnN0YW5jZW9mIEVKQlJlc291cmNlKSB7Ci0JCQkJLy9NdXN0IGJlIGluIGFuIEVKQiBKQVIgdG8gYmUgaGVyZQotCQkJCUVKQkphciBqYXIgPSAoKEVKQlJlc291cmNlKSByZXMpLmdldEVKQkphcigpOwotCQkJCWlmIChqYXIgIT0gbnVsbCkKLQkJCQkJbGlua2VkRUpCID0gamFyLmdldEVudGVycGlzZUJlYW5Gcm9tUmVmKHJlZik7Ci0JCQl9Ci0JCQlpZiAobGlua2VkRUpCID09IG51bGwpIHsKLQkJCQlMaXN0IGphckZpbGVzID0gZ2V0RUpCSmFyRmlsZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGphckZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCWxpbmtlZEVKQiA9ICgoRUpCSmFyRmlsZSkgamFyRmlsZXMuZ2V0KGkpKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEVudGVycHJpc2VCZWFuTmFtZWQobGluayk7Ci0JCQkJCWlmIChsaW5rZWRFSkIgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGxpbmtlZEVKQjsKLQkJCQkJfS8vIGlmCi0JCQkJfS8vIGZvcgotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIGxpbmtlZEVKQjsKLQkJfSBlbHNlIHsKLQkJCS8vR3JhYiB0aGUgZWpiIG5hbWUgYW5kIGVqYiBqYXIgbmFtZSBmcm9tIHRoZSBsaW5rCi0JCQlTdHJpbmcgZWpiQmVhbk5hbWUgPSBsaW5rLnN1YnN0cmluZyhsaW5rLmluZGV4T2YoIiMiKSArIDEsIGxpbmsubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZWpiSmFyTmFtZSA9IGxpbmsuc3Vic3RyaW5nKDAsIGxpbmsuaW5kZXhPZigiIyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoZWpiQmVhbk5hbWUgIT0gbnVsbCAmJiBlamJKYXJOYW1lICE9IG51bGwpIHsKLQkJCQkvL0dldCB0aGUgdXJpIG9mIHRoZSBqYXIgbmFtZS4KLQkJCQlTdHJpbmcgZWpiSmFyVXJpID0gQXJjaGl2ZVV0aWwuZGVyaXZlRUFSUmVsYXRpdmVVUkkoZWpiSmFyTmFtZSwgbW9kdWxlVXJpKTsKLQkJCQlpZiAoZWpiSmFyVXJpICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vR2V0IHRoZSBhY3R1YWwgamFyIGZpbGUKLQkJCQkJCUZpbGUgYUZpbGUgPSBnZXRGaWxlKGVqYkphclVyaSk7Ci0JCQkJCQlpZiAoYUZpbGUgPT0gbnVsbCB8fCAhYUZpbGUuaXNFSkJKYXJGaWxlKCkpCi0JCQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQkJCUVKQkphckZpbGUgamFyRmlsZSA9IChFSkJKYXJGaWxlKSBnZXRGaWxlKGVqYkphclVyaSk7Ci0JCQkJCQlMaXN0IGVqYnMgPSBqYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCQkJCQkvL0NoZWNrIGlmIGFueSBvZiB0aGUgYmVhbnMgaW4gdGhlIGxpc3QgbWF0Y2ggdGhlIGdpdmVuIGVqYiBiZWFuIG5hbWUgZ2l2ZQotCQkJCQkJLy8gaW4KLQkJCQkJCS8vdGhlIGxpbmsKLQkJCQkJCWlmIChlamJzICE9IG51bGwgJiYgIWVqYnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJSXRlcmF0b3IgaXQgPSBlamJzLml0ZXJhdG9yKCk7Ci0JCQkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQkJCQlFbnRlcnByaXNlQmVhbiBlamJCZWFuID0gKEVudGVycHJpc2VCZWFuKSBpdC5uZXh0KCk7Ci0JCQkJCQkJCWlmIChlamJCZWFuICE9IG51bGwgJiYgZWpiQmVhbi5nZXROYW1lKCkuZXF1YWxzKGVqYkJlYW5OYW1lKSkgewotCQkJCQkJCQkJcmV0dXJuIGVqYkJlYW47Ci0JCQkJCQkJCX0vLyBpZgotCQkJCQkJCX0vLyB3aGlsZQotCQkJCQkJfS8vIGlmCi0JCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmZSkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0vLyB0cnkKLQkJCQl9Ly8gaWYKLQkJCX0vLyBpZgotCQl9Ly8gaWYKLQkJcmV0dXJuIG51bGw7Ci0JfS8vIGdldEVudGVycGlzZUJlYW5Gcm9tUmVmCi0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyBhVXJpLCBTdHJpbmcgYWx0REQpIHsKLQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlKGFVcmksIGFsdEREKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBNb2R1bGVSZWYgZ2V0TW9kdWxlUmVmKE1vZHVsZSBtb2R1bGVEZXNjcmlwdG9yKSB7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgcmVmcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmdldE1vZHVsZSgpID09IG1vZHVsZURlc2NyaXB0b3IpCi0JCQkJcmV0dXJuIHJlZjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWx0ZXJlZCBsaXN0IG9mIHRoZSBhcmNoaXZlcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZHVsZUZpbGVzKCkgewotCQlMaXN0IG1vZHVsZUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNNb2R1bGVGaWxlKCkpIHsKLQkJCQltb2R1bGVGaWxlcy5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGVGaWxlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZU9wdGlvbnMgZ2V0T3B0aW9uc0Zvck9wZW5pbmcoU3RyaW5nIGFVcmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJTG9hZFN0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDaGlsZExvYWRTdHJhdGVneShhVXJpLCBnZXRMb2FkU3RyYXRlZ3koKSk7Ci0JCXJldHVybiBnZXRPcHRpb25zKCkuY2xvbmVXaXRoKHN0cmF0ZWd5LCBhVXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZU9wdGlvbnMgZ2V0T3B0aW9uc0Zvck9wZW5pbmcoTG9vc2VBcmNoaXZlIGxvb3NlKSB0aHJvd3MgSU9FeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uewotCQlpZihsb29zZS5nZXRCaW5hcmllc1BhdGgoKSA9PSBudWxsKXsKLQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLm9wZW5fbmVzdGVkX0VYQ18sIChuZXcgT2JqZWN0W10ge2xvb3NlLmdldFVyaSgpLCBnZXRVUkkoKX0pKSwgbnVsbCk7IC8vID0gIkNvdWxkIG5vdCBvcGVuIHRoZSBuZXN0ZWQgYXJjaGl2ZSAiezB9IiBpbiAiezF9IiIKLQkJfQotCQlMb2FkU3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUxvYWRTdHJhdGVneShsb29zZS5nZXRCaW5hcmllc1BhdGgoKSk7Ci0JCXN0cmF0ZWd5LnNldExvb3NlQXJjaGl2ZShsb29zZSk7Ci0JCXJldHVybiBnZXRPcHRpb25zKCkuY2xvbmVXaXRoKHN0cmF0ZWd5LCBsb29zZS5nZXRVcmkoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UkFSRmlsZXMoKSB7Ci0JCUxpc3QgcmFyRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZUxpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc1JBUkZpbGUoKSkgewotCQkJCXJhckZpbGVzLmFkZChhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJhckZpbGVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvbGVzRnJvbUFsbE1vZHVsZXMoKSB7Ci0JCUVMaXN0IHJvbGVMaXN0ID0gbmV3IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0KCk7Ci0JCUxpc3QgbW9kdWxlcyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IG1vZHVsZXMuc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0JCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJRUxpc3Qgcm9sZXMgPSBnZXRSb2xlc0Zyb21Nb2R1bGUoYU1vZHVsZSk7Ci0JCQlmb3IgKGludCBqID0gMCwgbSA9IHJvbGVzLnNpemUoKTsgaiA8IG07IGorKykgewotCQkJCXJvbGVMaXN0LmFkZChyb2xlcy5nZXQoaikpOwotCQkJfQotCQl9Ci0JCXJldHVybiByb2xlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlc0Zyb21Nb2R1bGUoTW9kdWxlIGFNb2R1bGUpIHsKLQkJRUxpc3Qgcm9sZUxpc3QgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWlmIChhTW9kdWxlLmlzV2ViTW9kdWxlKCkpCi0JCQkJcm9sZUxpc3QgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoV2ViTW9kdWxlKSBhTW9kdWxlKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQllbHNlIGlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpCi0JCQkJcm9sZUxpc3QgPSBnZXRBc3NlbWJseURlc2NyaXB0b3JBZGRJZk5lY2Vzc2FyeShnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoRWpiTW9kdWxlKSBhTW9kdWxlKSkuZ2V0U2VjdXJpdHlSb2xlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmRkX2luX2Vhcl9sb2FkX0VYQ18sIChuZXcgT2JqZWN0W117YU1vZHVsZS5nZXRVcmkoKSwgZ2V0VVJJKCl9KSksIGUpOyAvLyA9ICJFeGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIG1vZHVsZSAiezB9IiBpbiBlYXIgZmlsZSAiezF9IiIKLQkJfQotCQlyZXR1cm4gcm9sZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEZXBsb3llbWVudERlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRXQVJGaWxlcygpIHsKLQkJTGlzdCB3YXJGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlTGlzdCA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZUxpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQkJd2FyRmlsZXMuYWRkKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gd2FyRmlsZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUFmdGVyT3BlbigpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUFmdGVyT3BlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFQVJGaWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBzdXBlciByZXR1cm5zIHRydWUsIG9yIHJldHVybiB3aGV0aGVyIHRoZSBhcHAgZGQgY29udGFpbnMgYSBtb2R1bGUgaGF2aW5nIHRoZQotCSAqIHVyaQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkQXJjaGl2ZShTdHJpbmcgYVVyaSkgewotCQlpZiAoc3VwZXIuaXNOZXN0ZWRBcmNoaXZlKGFVcmkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpcnN0TW9kdWxlKGFVcmkpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCUFwcGxpY2F0aW9uIGFwcGwgPSAoKEFwcGxpY2F0aW9uUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpKS5nZXRBcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotCQlyZXNvdXJjZS5zZXRJRChhcHBsLCBKMkVFQ29uc3RhbnRzLkFQUExfSUQpOwotCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihhcHBsKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoYXBwbCk7Ci0JCXJldHVybiBhcHBsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoTG9vc2VBcmNoaXZlIGxvb3NlKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCi0JCU1vZHVsZSBtID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRGaXJzdE1vZHVsZShsb29zZS5nZXRVcmkoKSk7Ci0JCWlmIChtID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIub3Blbk5lc3RlZEFyY2hpdmUobG9vc2UpOwotCi0JCXRyeSB7Ci0JCQlBcmNoaXZlT3B0aW9ucyBhcmNoaXZlT3B0aW9ucyA9IGdldE9wdGlvbnNGb3JPcGVuaW5nKGxvb3NlKTsKLQkJCXJldHVybiBvcGVuTmVzdGVkQXJjaGl2ZShtLCBhcmNoaXZlT3B0aW9ucyk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCS8vUHJvYmFibHkgdGhlIGZpbGUgZGlkIG5vdCBleGlzdDsgc2lsZW50bHkgZmFpbCwgcGVyIHJlcXVlc3QgZnJvbSBXUyBydW50aW1lCi0JCQkvL01vcmUgdGhhbiBsaWtlbHkgYSBmYWlsdXJlIGlzIGdvaW5nIHRvIG9jY3VyIGRvd24gdGhlIHJvYWQgd2hlbiBhIE1vZHVsZUZpbGUgZm9yIGEKLQkJCS8vIE1vZHVsZQotCQkJLy9pbiB0aGUgZGQgaXMgcmVxdWVzdGVkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShTdHJpbmcgYVVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQotCQlNb2R1bGUgbSA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0Rmlyc3RNb2R1bGUoYVVyaSk7Ci0JCWlmIChtID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIub3Blbk5lc3RlZEFyY2hpdmUoYVVyaSk7Ci0KLQkJdHJ5IHsKLQkJCUFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zID0gZ2V0T3B0aW9uc0Zvck9wZW5pbmcoYVVyaSk7Ci0JCQlyZXR1cm4gb3Blbk5lc3RlZEFyY2hpdmUobSwgYXJjaGl2ZU9wdGlvbnMpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL1Byb2JhYmx5IHRoZSBmaWxlIGRpZCBub3QgZXhpc3Q7IHNpbGVudGx5IGZhaWwsIHBlciByZXF1ZXN0IGZyb20gV1MgcnVudGltZQotCQkJLy9Nb3JlIHRoYW4gbGlrZWx5IGEgZmFpbHVyZSBpcyBnb2luZyB0byBvY2N1ciBkb3duIHRoZSByb2FkIHdoZW4gYSBNb2R1bGVGaWxlIGZvciBhCi0JCQkvLyBNb2R1bGUKLQkJCS8vaW4gdGhlIGRkIGlzIHJlcXVlc3RlZAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKE1vZHVsZSBtLCBBcmNoaXZlT3B0aW9ucyBhcmNoaXZlT3B0aW9ucykgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGFVcmkgPSBtLmdldFVyaSgpOwotCi0JCXRyeSB7Ci0JCQkvKgotCQkJICogU2luY2Ugd2UgaGF2ZSBhIGNsdWUgYWJvdXQgdGhlIHR5cGUgb2YgYXJjaGl2ZSB0byBvcGVuIFVzZSB0aGUgYXBwcm9wcmlhdGUgb3BlbgotCQkJICogbWV0aG9kLCBzbyBpZiBhIGZhaWx1cmUgb2NjdXJycywgd2UgY2FuIGdldCBhIG1vcmUgc3BlY2lmaWMgbWVzc2FnZQotCQkJICovCi0JCQlpZiAobS5pc1dlYk1vZHVsZSgpKQotCQkJCXJldHVybiBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLm9wZW5XQVJGaWxlKGFyY2hpdmVPcHRpb25zLCBhVXJpKTsKLQkJCWVsc2UgaWYgKG0uaXNFamJNb2R1bGUoKSkKLQkJCQlyZXR1cm4gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCSmFyRmlsZShhcmNoaXZlT3B0aW9ucywgYVVyaSk7Ci0JCQllbHNlIGlmIChtLmlzSmF2YU1vZHVsZSgpKQotCQkJCXJldHVybiBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLm9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoYXJjaGl2ZU9wdGlvbnMsIGFVcmkpOwotCQkJZWxzZSBpZiAobS5pc0Nvbm5lY3Rvck1vZHVsZSgpKQotCQkJCXJldHVybiBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLm9wZW5SQVJGaWxlKGFyY2hpdmVPcHRpb25zLCBhVXJpKTsKLQotCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IE9wZW5GYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIubmVzdGVkX29wZW5fZmFpbF9FWENfLCAobmV3IE9iamVjdFtde2FVcmksIGdldFVSSSgpfSkpLCBleCk7IC8vID0gIlVuYWJsZSB0byBvcGVuIG1vZHVsZSBmaWxlICJ7MH0iIGluIEVBUiBmaWxlICJ7MX0iIgotCQl9Ci0JCS8vU2hvdWxkIG5ldmVyIHJlYWNoIHRoZSBjb2RlIGJlbG93Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRUFSRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hEb3duUm9sZShTZWN1cml0eVJvbGUgcm9sZSkgewotCQlpZiAocm9sZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLlBhcmFtZXRlcl9zaG91bGRfbm90X2JlX251X0VYQ18pOyAvLyA9ICJQYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBudWxsIgotCi0JCUxpc3QgbW9kdWxlcyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBtID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlwdXNoRG93blJvbGUocm9sZSwgbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoRG93blJvbGUoU2VjdXJpdHlSb2xlIHJvbGUsIE1vZHVsZSBhTW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoYU1vZHVsZS5pc1dlYk1vZHVsZSgpKSB7Ci0JCQkJV2ViQXBwIGRkID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKFdlYk1vZHVsZSkgYU1vZHVsZSk7Ci0JCQkJaWYgKGRkLmdldFNlY3VyaXR5Um9sZU5hbWVkKHJvbGUuZ2V0Um9sZU5hbWUoKSkgPT0gbnVsbCkKLQkJCQkJZGQuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChFdG9vbHNDb3B5VXRpbGl0eS5jcmVhdGVDb3B5KHJvbGUpKTsKLQkJCX0gZWxzZSBpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKSB7Ci0JCQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5ID0gZ2V0QXNzZW1ibHlEZXNjcmlwdG9yQWRkSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEVqYk1vZHVsZSkgYU1vZHVsZSkpOwotCQkJCWlmIChhc3NlbWJseS5nZXRTZWN1cml0eVJvbGVOYW1lZChyb2xlLmdldFJvbGVOYW1lKCkpID09IG51bGwpCi0JCQkJCWFzc2VtYmx5LmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoRXRvb2xzQ29weVV0aWxpdHkuY3JlYXRlQ29weShyb2xlKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZGRfaW5fZWFyX2xvYWRfRVhDXywgKG5ldyBPYmplY3RbXXthTW9kdWxlLmdldFVyaSgpLCBnZXRVUkkoKX0pKSwgZSk7IC8vID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgbW9kdWxlICJ7MH0iIGluIGVhciBmaWxlICJ7MX0iIgotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4gYWx0LWRkIGlzIGFib3V0IHRvIGJlIGxvYWRlZDsgcmVnaXN0ZXIgdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlIGZhY3RvcnkgZm9yIHRoZSB1cmkgc28gaXQKLQkgKiB3aWxsIGdldCBsb2FkZWQgY29ycmVjdGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyUmVzb3VyY2VGYWN0b3J5KE1vZHVsZSBhTW9kdWxlLCBTdHJpbmcgYVVyaSkgewotCQlvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkKLQkJCWZhY3RvcnkgPSBFSkJKYXJSZXNvdXJjZUZhY3RvcnkuZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKTsKLQkJZWxzZSBpZiAoYU1vZHVsZS5pc1dlYk1vZHVsZSgpKQotCQkJZmFjdG9yeSA9IFdlYkFwcFJlc291cmNlRmFjdG9yeS5nZXRSZWdpc3RlcmVkRmFjdG9yeSgpOwotCQllbHNlIGlmIChhTW9kdWxlLmlzSmF2YU1vZHVsZSgpKQotCQkJZmFjdG9yeSA9IEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LmdldFJlZ2lzdGVyZWRGYWN0b3J5KCk7Ci0JCWVsc2UgaWYgKGFNb2R1bGUuaXNDb25uZWN0b3JNb2R1bGUoKSkKLQkJCWZhY3RvcnkgPSBDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkuZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKTsKLQotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldCgpOwotCQkJKChGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KSBzZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKSkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoYVVyaSwgZmFjdG9yeSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShNb2R1bGVSZWYgYU1vZHVsZVJlZikgewotCQlpZiAoYU1vZHVsZVJlZiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlNb2R1bGUgYU1vZHVsZSA9IGFNb2R1bGVSZWYuZ2V0TW9kdWxlKCk7Ci0KLQkJaWYgKGFNb2R1bGUgIT0gbnVsbCkKLQkJCWdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpLnJlbW92ZShhTW9kdWxlKTsKLQotCQlnZXRNb2R1bGVSZWZzKCkucmVtb3ZlKGFNb2R1bGVSZWYpOwotCQlpZiAoZ2V0TW9kdWxlUmVmcyhhTW9kdWxlUmVmLmdldE1vZHVsZUZpbGUoKSkuaXNFbXB0eSgpKQotCQkJZ2V0RmlsZXMoKS5yZW1vdmUoYU1vZHVsZVJlZi5nZXRNb2R1bGVGaWxlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRUFSRmlsZQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZHVsZVJlZnMoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgewotCQlMaXN0IHJlZnMgPSBnZXRNb2R1bGVSZWZzKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgcmVmcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmdldE1vZHVsZUZpbGUoKSA9PSBhTW9kdWxlRmlsZSkKLQkJCQlyZXN1bHQuYWRkKHJlZik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW5hbWVSb2xlc0luTW9kdWxlRERzKFN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBTdHJpbmcgbmV3Um9sZU5hbWUpIHsKLQkJTGlzdCBtb2R1bGVzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlIG0gPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKG0uaXNFamJNb2R1bGUoKSkKLQkJCQkJZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEVqYk1vZHVsZSkgbSkucmVuYW1lU2VjdXJpdHlSb2xlKGV4aXN0aW5nUm9sZU5hbWUsIG5ld1JvbGVOYW1lKTsKLQkJCQllbHNlIGlmIChtLmlzV2ViTW9kdWxlKCkpCi0JCQkJCWdldERlcGxveW1lbnREZXNjcmlwdG9yKChXZWJNb2R1bGUpIG0pLnJlbmFtZVNlY3VyaXR5Um9sZShleGlzdGluZ1JvbGVOYW1lLCBuZXdSb2xlTmFtZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5kZF9pbl9lYXJfbG9hZF9FWENfLCAobmV3IE9iamVjdFtde20uZ2V0VXJpKCksIGdldFVSSSgpfSkpLCBlKTsgLy8gPSAiRXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBtb2R1bGUgInswfSIgaW4gZWFyIGZpbGUgInsxfSIiCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmFtZVNlY3VyaXR5Um9sZShTdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSwgU3RyaW5nIG5ld1JvbGVOYW1lKSB0aHJvd3MgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCUFwcGxpY2F0aW9uIGFwcCA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCVNlY3VyaXR5Um9sZSBhUm9sZSA9IGFwcC5nZXRTZWN1cml0eVJvbGVOYW1lZChleGlzdGluZ1JvbGVOYW1lKTsKLQkJaWYgKGFSb2xlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5ub19zZWNfcm9sZV9FWENfLCAobmV3IE9iamVjdFtde2dldFVSSSgpLCBleGlzdGluZ1JvbGVOYW1lfSkpKTsgLy8gPSAiOiBFQVIgRmlsZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgIgotCQlpZiAoYXBwLmdldFNlY3VyaXR5Um9sZU5hbWVkKG5ld1JvbGVOYW1lKSAhPSBudWxsKQotCQkJdGhyb3cgbmV3IER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmR1cF9zZWNfcm9sZV9FWENfLCAobmV3IE9iamVjdFtde2dldFVSSSgpLCBuZXdSb2xlTmFtZX0pKSwgYXBwLmdldFNlY3VyaXR5Um9sZU5hbWVkKG5ld1JvbGVOYW1lKSk7IC8vID0gIjogRUFSIEZpbGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFscmVhZHkgY29udGFpbnMgYSBzZWN1cml0eSByb2xlIG5hbWVkICIKLQotCQlhUm9sZS5zZXRSb2xlTmFtZShuZXdSb2xlTmFtZSk7Ci0KLQkJcmVuYW1lUm9sZXNJbk1vZHVsZUREcyhleGlzdGluZ1JvbGVOYW1lLCBuZXdSb2xlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByb2xsVXBSb2xlcygpIHsKLQkJTGlzdCBtb2R1bGVzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlIGFNb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCXJvbGxVcFJvbGVzKGFNb2R1bGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByb2xsVXBSb2xlcyhNb2R1bGUgYU1vZHVsZSkgewotCQlMaXN0IHNlY3VyaXR5Um9sZXMgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGFNb2R1bGUuaXNXZWJNb2R1bGUoKSkKLQkJCQlzZWN1cml0eVJvbGVzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKFdlYk1vZHVsZSkgYU1vZHVsZSkuZ2V0U2VjdXJpdHlSb2xlcygpOwotCQkJZWxzZSBpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKQotCQkJCXNlY3VyaXR5Um9sZXMgPSBnZXRBc3NlbWJseURlc2NyaXB0b3JBZGRJZk5lY2Vzc2FyeShnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoRWpiTW9kdWxlKSBhTW9kdWxlKSkuZ2V0U2VjdXJpdHlSb2xlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmRkX2luX2Vhcl9sb2FkX0VYQ18sIChuZXcgT2JqZWN0W117YU1vZHVsZS5nZXRVcmkoKSwgZ2V0VVJJKCl9KSksIGUpOyAvLyA9ICJFeGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIG1vZHVsZSAiezB9IiBpbiBlYXIgZmlsZSAiezF9IiIKLQkJfQotCi0JCWlmIChzZWN1cml0eVJvbGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VjdXJpdHlSb2xlcy5zaXplKCk7IGkrKykgewotCQkJYWRkQ29weUlmTm90RXhpc3RzKChTZWN1cml0eVJvbGUpIHNlY3VyaXR5Um9sZXMuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uIGwpIHsKLQkJdGhpcy5zZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihsKTsKLQkJcmVwbGFjZVJvb3QoZ2V0TW9mUmVzb3VyY2VNYWtlSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSksIGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCkgewotCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXBsb3ltZW50RGVzY3JpcHRvci5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGVwbG95bWVudERlc2NyaXB0b3IgPSAoSW50ZXJuYWxFT2JqZWN0KWRlcGxveW1lbnREZXNjcmlwdG9yOwotCQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSAoQXBwbGljYXRpb24pZVJlc29sdmVQcm94eShvbGREZXBsb3ltZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gb2xkRGVwbG95bWVudERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SLCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciwgZGVwbG95bWVudERlc2NyaXB0b3IpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbiBiYXNpY0dldERlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oQXBwbGljYXRpb24gbmV3RGVwbG95bWVudERlc2NyaXB0b3IpIHsKLQkJQXBwbGljYXRpb24gb2xkRGVwbG95bWVudERlc2NyaXB0b3IgPSBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSBuZXdEZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiwgb2xkRGVwbG95bWVudERlc2NyaXB0b3IsIGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNb2R1bGVSZWZzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNb2R1bGVSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldE1vZHVsZVJlZnMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlM6Ci0JCQkJZ2V0TW9kdWxlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TW9kdWxlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChBcHBsaWNhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgotCQkJCWdldE1vZHVsZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUzoKLQkJCQlyZXR1cm4gbW9kdWxlUmVmcyAhPSBudWxsICYmICFtb2R1bGVSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TW9kdWxlUmVmc0dlbigpIHsKLQkJaWYgKG1vZHVsZVJlZnMgPT0gbnVsbCkgewotCQkJbW9kdWxlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KE1vZHVsZVJlZi5jbGFzcywgdGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTLCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRSk7Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZVJlZnM7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldE1vZHVsZVJlZnMoKSB7Ci0JCUVMaXN0IHJlZnMgPSBnZXRNb2R1bGVSZWZzR2VuKCk7Ci0KLQkJaWYgKHJlZnMuaXNFbXB0eSgpKQotCQkJaW5pdFJlZnMocmVmcyk7Ci0KLQkJcmV0dXJuIHJlZnM7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdFJlZnMoRUxpc3QgcmVmcykgewotCQlMaXN0IG1vZHVsZXMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgbW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlyZWZzLmFkZChjcmVhdGVNb2R1bGVSZWYobW9kdWxlLCBudWxsKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kdWxlUmVmIGNyZWF0ZU1vZHVsZVJlZihNb2R1bGUgYU1vZHVsZSwgTW9kdWxlRmlsZSBhRmlsZSkgewotCQlNb2R1bGVSZWYgbmV3UmVmID0gbnVsbDsKLQotCQlpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKQotCQkJbmV3UmVmID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFSkJNb2R1bGVSZWYoKTsKLQkJZWxzZSBpZiAoYU1vZHVsZS5pc1dlYk1vZHVsZSgpKQotCQkJbmV3UmVmID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVXZWJNb2R1bGVSZWYoKTsKLQkJZWxzZSBpZiAoYU1vZHVsZS5pc0Nvbm5lY3Rvck1vZHVsZSgpKQotCQkJbmV3UmVmID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQkJZWxzZSBpZiAoYU1vZHVsZS5pc0phdmFNb2R1bGUoKSkKLQkJCW5ld1JlZiA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlQ2xpZW50TW9kdWxlUmVmKCk7Ci0KLQkJbmV3UmVmLnNldE1vZHVsZShhTW9kdWxlKTsKLQkJbmV3UmVmLnNldE1vZHVsZUZpbGUoYUZpbGUpOwotCi0JCXJldHVybiBuZXdSZWY7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVBUkZpbGUjZ2V0Q2xpZW50TW9kdWxlUmVmcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q2xpZW50TW9kdWxlUmVmcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgcmVmcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmlzQ2xpZW50KCkpCi0JCQkJcmVzdWx0LmFkZChyZWYpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVBUkZpbGUjZ2V0Q29ubmVjdG9yTW9kdWxlUmVmcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29ubmVjdG9yTW9kdWxlUmVmcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgcmVmcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmlzQ29ubmVjdG9yKCkpCi0JCQkJcmVzdWx0LmFkZChyZWYpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVBUkZpbGUjZ2V0RUpCTW9kdWxlUmVmcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RUpCTW9kdWxlUmVmcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgcmVmcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmlzRUpCKCkpCi0JCQkJcmVzdWx0LmFkZChyZWYpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVBUkZpbGUjZ2V0V2ViTW9kdWxlUmVmcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViTW9kdWxlUmVmcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgcmVmcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmlzV2ViKCkpCi0JCQkJcmVzdWx0LmFkZChyZWYpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVBUkZpbGUjZ2V0RkFSRmlsZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZBUkZpbGVzKCkgewotCQlMaXN0IGZhckZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNGQVJGaWxlKCkpIHsKLQkJCQlmYXJGaWxlcy5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYXJGaWxlczsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlI2dldEFyY2hpdmVzT2ZUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXJjaGl2ZXNPZlR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRFSkJSZWZlcmVuY2VzKGJvb2xlYW4gZmlsdGVyTGlua2VkUmVmZXJlbmNlcywgYm9vbGVhbiBmaWx0ZXJOb25MaW5rZWRSZWZlcmVuY2VzKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCQlpZiAoIWZpbHRlckxpbmtlZFJlZmVyZW5jZXMgfHwgIWZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMpIHsKLQkJCUFwcGxpY2F0aW9uIGFwcCA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQlpZiAoYXBwICE9IG51bGwpIHsKLQkJCQlMaXN0IG1vZHVsZXMgPSBhcHAuZ2V0TW9kdWxlcygpOwotCQkJCU1vZHVsZSBtb2R1bGU7Ci0JCQkJTWFwIHJlZmVyZW5jZXMgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJCQltb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlZmVyZW5jZXMgPSBjb2xsZWN0RUpCUmVmZXJlbmNlcyhtb2R1bGUsIGZpbHRlckxpbmtlZFJlZmVyZW5jZXMsIGZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMsIHJlZmVyZW5jZXMpOwotCQkJCQl9IGNhdGNoIChSZXNvdXJjZUxvYWRFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQl9IGNhdGNoIChFbXB0eVJlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcmVmZXJlbmNlczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiBAcGFyYW0gZmlsdGVyTGlua2VkUmVmZXJlbmNlcwotCSAqIEBwYXJhbSBmaWx0ZXJOb25MaW5rZWRSZWZlcmVuY2VzCi0JICogQHBhcmFtIHJlZmVyZW5jZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNYXAgY29sbGVjdEVKQlJlZmVyZW5jZXMoTW9kdWxlIG1vZHVsZSwgYm9vbGVhbiBmaWx0ZXJMaW5rZWRSZWZlcmVuY2VzLCBib29sZWFuIGZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMsIE1hcCByZWZlcmVuY2VzKSB0aHJvd3MgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQlNYXAgbXlSZWZlcmVuY2VzID0gcmVmZXJlbmNlczsKLQkJTGlzdCBtb2R1bGVSZWZlcmVuY2VzID0gZ2V0RUpCUmVmZXJuZWNlcyhtb2R1bGUpOwotCQlpZiAobW9kdWxlUmVmZXJlbmNlcyAhPSBudWxsICYmICFtb2R1bGVSZWZlcmVuY2VzLmlzRW1wdHkoKSkgewotCQkJRWpiUmVmIHJlZiA9IG51bGw7Ci0JCQlMaXN0IGZpbHRlcmVkUmVmcyA9IG51bGw7Ci0JCQlTdHJpbmcgbGluayA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZVJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZWYgPSAoRWpiUmVmKSBtb2R1bGVSZWZlcmVuY2VzLmdldChpKTsKLQkJCQlsaW5rID0gcmVmLmdldExpbmsoKTsKLQkJCQlpZiAoKGxpbmsgIT0gbnVsbCAmJiBsaW5rLmxlbmd0aCgpID4gMCAmJiAhZmlsdGVyTGlua2VkUmVmZXJlbmNlcykgfHwgKChsaW5rID09IG51bGwgfHwgbGluay5sZW5ndGgoKSA9PSAwKSAmJiAhZmlsdGVyTm9uTGlua2VkUmVmZXJlbmNlcykpIHsKLQkJCQkJaWYgKGZpbHRlcmVkUmVmcyA9PSBudWxsKQotCQkJCQkJZmlsdGVyZWRSZWZzID0gbmV3IEFycmF5TGlzdChtb2R1bGVSZWZlcmVuY2VzLnNpemUoKSk7Ci0JCQkJCWZpbHRlcmVkUmVmcy5hZGQocmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZmlsdGVyZWRSZWZzICE9IG51bGwpIHsKLQkJCQlpZiAobXlSZWZlcmVuY2VzID09IG51bGwpCi0JCQkJCW15UmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJbXlSZWZlcmVuY2VzLnB1dChtb2R1bGUsIGZpbHRlcmVkUmVmcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG15UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRFSkJSZWZlcm5lY2VzKE1vZHVsZSBtb2R1bGUpIHRocm93cyBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJaWYgKG1vZHVsZS5pc0VqYk1vZHVsZSgpKSB7Ci0JCQkJRUpCSmFyIGVqYkphciA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKChFamJNb2R1bGUpIG1vZHVsZSk7Ci0JCQkJcmV0dXJuIGdldEVKQlJlZmVyZW5jZXMoZWpiSmFyKTsKLQkJCX0gZWxzZSBpZiAobW9kdWxlLmlzV2ViTW9kdWxlKCkpIHsKLQkJCQlXZWJBcHAgd2ViQXBwID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKFdlYk1vZHVsZSkgbW9kdWxlKTsKLQkJCQlpZiAod2ViQXBwICE9IG51bGwpCi0JCQkJCXJldHVybiB3ZWJBcHAuZ2V0RWpiUmVmcygpOwotCQkJfSBlbHNlIGlmIChtb2R1bGUuaXNKYXZhTW9kdWxlKCkpIHsKLQkJCQlBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnQgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoSmF2YUNsaWVudE1vZHVsZSkgbW9kdWxlKTsKLQkJCQlpZiAoYXBwQ2xpZW50ICE9IG51bGwpCi0JCQkJCXJldHVybiBhcHBDbGllbnQuZ2V0RWpiUmVmZXJlbmNlcygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlamJKYXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEVKQlJlZmVyZW5jZXMoRUpCSmFyIGVqYkphcikgewotCQlpZiAoZWpiSmFyICE9IG51bGwpIHsKLQkJCUxpc3QgZWpicyA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJCUxpc3QgcmVmcyA9IG51bGw7Ci0JCQlFbnRlcnByaXNlQmVhbiBlamIgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlamJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJZWpiID0gKEVudGVycHJpc2VCZWFuKSBlamJzLmdldChpKTsKLQkJCQlpZiAocmVmcyA9PSBudWxsKQotCQkJCQlyZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlZnMuYWRkQWxsKGVqYi5nZXRFamJSZWZzKCkpOwotCQkJfQotCQkJaWYgKHJlZnMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVmczsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCSmFyRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCSmFyRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjYjQyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VKQkphckZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJKYXJGaWxlSW1wbCBleHRlbmRzIE1vZHVsZUZpbGVJbXBsIGltcGxlbWVudHMgRUpCSmFyRmlsZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUpCSmFyIGRlcGxveW1lbnREZXNjcmlwdG9yID0gbnVsbDsKLQotCXB1YmxpYyBFSkJKYXJGaWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5FSkJfSkFSX0ZJTEU7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBmb3IgdG9vbHMgcGVyZm9ybWluZyBzZWxlY3RpdmUgaW1wb3J0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXNzb2NpYXRlZEZpbGVzKEVudGVycHJpc2VCZWFuIGVqYikgewotCi0JCUxpc3QgY2xhc3NOYW1lcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZWpiLmdldFZlcnNpb25JRCgpIDw9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQpIHsKLQkJCWNsYXNzTmFtZXMuYWRkKGVqYi5nZXRIb21lSW50ZXJmYWNlTmFtZSgpKTsKLQkJCWNsYXNzTmFtZXMuYWRkKGVqYi5nZXRSZW1vdGVJbnRlcmZhY2VOYW1lKCkpOwotCQl9IGVsc2UgaWYgKGVqYi5nZXRWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB7Ci0JCQlpZiAoZWpiLmhhc1JlbW90ZUNsaWVudCgpKSB7Ci0JCQkJY2xhc3NOYW1lcy5hZGQoZWpiLmdldEhvbWVJbnRlcmZhY2VOYW1lKCkpOwotCQkJCWNsYXNzTmFtZXMuYWRkKGVqYi5nZXRSZW1vdGVJbnRlcmZhY2VOYW1lKCkpOwotCQkJfQotCQkJaWYgKGVqYi5oYXNMb2NhbENsaWVudCgpKSB7Ci0JCQkJY2xhc3NOYW1lcy5hZGQoZWpiLmdldExvY2FsSG9tZUludGVyZmFjZU5hbWUoKSk7Ci0JCQkJY2xhc3NOYW1lcy5hZGQoZWpiLmdldExvY2FsSW50ZXJmYWNlTmFtZSgpKTsKLQkJCX0KLQkJfQotCQljbGFzc05hbWVzLmFkZChlamIuZ2V0RWpiQ2xhc3NOYW1lKCkpOwotCi0JCWlmIChlamIuaXNFbnRpdHkoKSkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9ICgoRW50aXR5KSBlamIpLmdldFByaW1hcnlLZXlOYW1lKCk7Ci0JCQlpZiAoIWNsYXNzTmFtZS5zdGFydHNXaXRoKCJqYXZhIikpLy8kTk9OLU5MUy0xJAotCQkJCWNsYXNzTmFtZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc05hbWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgY2xhc3NOYW1lcy5nZXQoaSk7Ci0JCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgY2xhc3NVcmkgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsLmNsYXNzTmFtZVRvVXJpKGNsYXNzTmFtZSk7Ci0JCQlTdHJpbmcgamF2YVVyaSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuY2xhc3NOYW1lVG9KYXZhVXJpKGNsYXNzTmFtZSk7Ci0JCQl0cnkgewotCQkJCXJlc3VsdC5hZGQoZ2V0RmlsZShjbGFzc1VyaSkpOwotCQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gaW94KSB7Ci0JCQkJLy9EbyBub3RoaW5nIC0gdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBqYXIgZmlsZQotCQkJfQotCQkJdHJ5IHsKLQkJCQlyZXN1bHQuYWRkKGdldEZpbGUoamF2YVVyaSkpOwotCQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gaW94KSB7Ci0JCQkJLy9EbyBub3RoaW5nIC0gdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBqYXIgZmlsZQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBFSkJKYXIgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJRUpCSmFyIGRkID0gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwotCQlpZiAoZGQgPT0gbnVsbCAmJiBjYW5MYXp5SW5pdGlhbGl6ZSgpKSB7Ci0JCQl0cnkgewotCQkJCWdldEltcG9ydFN0cmF0ZWd5KCkuaW1wb3J0TWV0YURhdGEoKTsKLQkJCX0gY2F0Y2ggKERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IGV4OwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCksIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCk7Ci0JfQotCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEZXBsb3llbWVudERlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCSmFyRmlsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVKQkphckZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcG9ydGVkRnJvbTEwKCkgewotCQlyZXR1cm4gZ2V0SW1wb3J0U3RyYXRlZ3koKSAhPSBudWxsICYmIGdldEltcG9ydFN0cmF0ZWd5KCkuaXNFSkIxMCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5pbXBsLk1vZHVsZUZpbGVJbXBsCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IG1ha2VEZXBsb3ltZW50RGVzY3JpcHRvcihYTUxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlFSkJKYXIgZWpiSmFyID0gKChFamJQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpKS5nZXRFamJGYWN0b3J5KCkuY3JlYXRlRUpCSmFyKCk7Ci0JCXJlc291cmNlLnNldElEKGVqYkphciwgSjJFRUNvbnN0YW50cy5FSkJKQVJfSUQpOwotCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihlamJKYXIpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChlamJKYXIpOwotCi0JCXJldHVybiBlamJKYXI7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihFSkJKYXIgbCkgewotCQl0aGlzLnNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKGwpOwotCQlyZXBsYWNlUm9vdChnZXRNb2ZSZXNvdXJjZU1ha2VJZk5lY2Vzc2FyeShnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpKSwgbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUpCSmFyIGdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCkgewotCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXBsb3ltZW50RGVzY3JpcHRvci5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGVwbG95bWVudERlc2NyaXB0b3IgPSAoSW50ZXJuYWxFT2JqZWN0KWRlcGxveW1lbnREZXNjcmlwdG9yOwotCQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSAoRUpCSmFyKWVSZXNvbHZlUHJveHkob2xkRGVwbG95bWVudERlc2NyaXB0b3IpOwotCQkJaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG9sZERlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVKQkphciBiYXNpY0dldERlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oRUpCSmFyIG5ld0RlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCUVKQkphciBvbGREZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlcGxveW1lbnREZXNjcmlwdG9yOwotCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IG5ld0RlcGxveW1lbnREZXNjcmlwdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiwgb2xkRGVwbG95bWVudERlc2NyaXB0b3IsIGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoRUpCSmFyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoRUpCSmFyKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VKQk1vZHVsZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCTW9kdWxlUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGY1MzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCTW9kdWxlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRUpCTW9kdWxlUmVmSW1wbCBleHRlbmRzIE1vZHVsZVJlZkltcGwgaW1wbGVtZW50cyBFSkJNb2R1bGVSZWYgewotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUpCTW9kdWxlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5FSkJfTU9EVUxFX1JFRjsKLQl9Ci0KLQlwdWJsaWMgRUpCSmFyIGdldEVKQkphcigpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoRUpCSmFyKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNFSkIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0gLy9FSkJNb2R1bGVSZWZJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0ZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0ZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMGNlNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9GaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLQotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRmlsZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBGaWxlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVUkkoKSA8ZW0+VVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVyaSA9IFVSSV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFzdE1vZGlmaWVkKCkgPGVtPkxhc3QgTW9kaWZpZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXN0TW9kaWZpZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBMQVNUX01PRElGSUVEX0VERUZBVUxUID0gMEw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgbG9uZyBsYXN0TW9kaWZpZWQgPSBMQVNUX01PRElGSUVEX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGFzdCBNb2RpZmllZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGFzdE1vZGlmaWVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpemUoKSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIFNJWkVfRURFRkFVTFQgPSAwTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBsb25nIHNpemUgPSBTSVpFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU2l6ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNpemVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEaXJlY3RvcnlFbnRyeSgpIDxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RpcmVjdG9yeUVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRElSRUNUT1JZX0VOVFJZX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RpcmVjdG9yeUVudHJ5KCkgPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGlyZWN0b3J5RW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRpcmVjdG9yeUVudHJ5ID0gRElSRUNUT1JZX0VOVFJZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEaXJlY3RvcnkgRW50cnkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRpcmVjdG9yeUVudHJ5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yaWdpbmFsVVJJKCkgPGVtPk9yaWdpbmFsIFVSSTwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE9yaWdpbmFsVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvcmlnaW5hbFVSSSA9IE9SSUdJTkFMX1VSSV9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGFpbmVyIGxvYWRpbmdDb250YWluZXIgPSBudWxsOwotCi0JcHVibGljIEZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLkZJTEU7Ci0JfQotCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlyZWN0b3J5VVJJKCkgewotCQlyZXR1cm4gQXJjaGl2ZVV0aWwuZ2V0RmlsZU5hbWVQYXJlbnQoZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZGluZ0NvbnRhaW5lcigpLnByaW1HZXRJbnB1dFN0cmVhbShnZXRPcmlnaW5hbFVSSSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBBcmNoaXZlVXRpbC5nZXRGaWxlTmFtZVRhaWwoZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGlzQ29udGFpbmVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUkZpbGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCSmFyRmlsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2R1bGVGaWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JBUkZpbGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBpc1JlYWRPbmx5RGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV0FSRmlsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyBuZXdVUkkpIHsKLQkJU3RyaW5nIG9sZFVSSSA9IHVyaTsKLQkJdXJpID0gbmV3VVJJOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19VUkksIG9sZFVSSSwgdXJpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiBsYXN0TW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChsb25nIG5ld0xhc3RNb2RpZmllZCkgewotCQlsb25nIG9sZExhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLQkJbGFzdE1vZGlmaWVkID0gbmV3TGFzdE1vZGlmaWVkOwotCQlib29sZWFuIG9sZExhc3RNb2RpZmllZEVTZXQgPSBsYXN0TW9kaWZpZWRFU2V0OwotCQlsYXN0TW9kaWZpZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTEFTVF9NT0RJRklFRCwgb2xkTGFzdE1vZGlmaWVkLCBsYXN0TW9kaWZpZWQsICFvbGRMYXN0TW9kaWZpZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGFzdE1vZGlmaWVkKCkgewotCQlsb25nIG9sZExhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLQkJYm9vbGVhbiBvbGRMYXN0TW9kaWZpZWRFU2V0ID0gbGFzdE1vZGlmaWVkRVNldDsKLQkJbGFzdE1vZGlmaWVkID0gTEFTVF9NT0RJRklFRF9FREVGQVVMVDsKLQkJbGFzdE1vZGlmaWVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xBU1RfTU9ESUZJRUQsIG9sZExhc3RNb2RpZmllZCwgTEFTVF9NT0RJRklFRF9FREVGQVVMVCwgb2xkTGFzdE1vZGlmaWVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldExhc3RNb2RpZmllZCgpIHsKLQkJcmV0dXJuIGxhc3RNb2RpZmllZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShsb25nIG5ld1NpemUpIHsKLQkJbG9uZyBvbGRTaXplID0gc2l6ZTsKLQkJc2l6ZSA9IG5ld1NpemU7Ci0JCWJvb2xlYW4gb2xkU2l6ZUVTZXQgPSBzaXplRVNldDsKLQkJc2l6ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19TSVpFLCBvbGRTaXplLCBzaXplLCAhb2xkU2l6ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTaXplKCkgewotCQlsb25nIG9sZFNpemUgPSBzaXplOwotCQlib29sZWFuIG9sZFNpemVFU2V0ID0gc2l6ZUVTZXQ7Ci0JCXNpemUgPSBTSVpFX0VERUZBVUxUOwotCQlzaXplRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1NJWkUsIG9sZFNpemUsIFNJWkVfRURFRkFVTFQsIG9sZFNpemVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U2l6ZSgpIHsKLQkJcmV0dXJuIHNpemVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeUVudHJ5KCkgewotCQlyZXR1cm4gZGlyZWN0b3J5RW50cnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcmVjdG9yeUVudHJ5KGJvb2xlYW4gbmV3RGlyZWN0b3J5RW50cnkpIHsKLQkJYm9vbGVhbiBvbGREaXJlY3RvcnlFbnRyeSA9IGRpcmVjdG9yeUVudHJ5OwotCQlkaXJlY3RvcnlFbnRyeSA9IG5ld0RpcmVjdG9yeUVudHJ5OwotCQlib29sZWFuIG9sZERpcmVjdG9yeUVudHJ5RVNldCA9IGRpcmVjdG9yeUVudHJ5RVNldDsKLQkJZGlyZWN0b3J5RW50cnlFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fRElSRUNUT1JZX0VOVFJZLCBvbGREaXJlY3RvcnlFbnRyeSwgZGlyZWN0b3J5RW50cnksICFvbGREaXJlY3RvcnlFbnRyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREaXJlY3RvcnlFbnRyeSgpIHsKLQkJYm9vbGVhbiBvbGREaXJlY3RvcnlFbnRyeSA9IGRpcmVjdG9yeUVudHJ5OwotCQlib29sZWFuIG9sZERpcmVjdG9yeUVudHJ5RVNldCA9IGRpcmVjdG9yeUVudHJ5RVNldDsKLQkJZGlyZWN0b3J5RW50cnkgPSBESVJFQ1RPUllfRU5UUllfRURFRkFVTFQ7Ci0JCWRpcmVjdG9yeUVudHJ5RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0RJUkVDVE9SWV9FTlRSWSwgb2xkRGlyZWN0b3J5RW50cnksIERJUkVDVE9SWV9FTlRSWV9FREVGQVVMVCwgb2xkRGlyZWN0b3J5RW50cnlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RGlyZWN0b3J5RW50cnkoKSB7Ci0JCXJldHVybiBkaXJlY3RvcnlFbnRyeUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9yaWdpbmFsVVJJKCkgewotCQlyZXR1cm4gb3JpZ2luYWxVUkk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JpZ2luYWxVUkkoU3RyaW5nIG5ld09yaWdpbmFsVVJJKSB7Ci0JCVN0cmluZyBvbGRPcmlnaW5hbFVSSSA9IG9yaWdpbmFsVVJJOwotCQlvcmlnaW5hbFVSSSA9IG5ld09yaWdpbmFsVVJJOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19PUklHSU5BTF9VUkksIG9sZE9yaWdpbmFsVVJJLCBvcmlnaW5hbFVSSSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIENvbnRhaW5lciBnZXRMb2FkaW5nQ29udGFpbmVyKCkgewotCQlpZiAobG9hZGluZ0NvbnRhaW5lciAhPSBudWxsICYmIGxvYWRpbmdDb250YWluZXIuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZExvYWRpbmdDb250YWluZXIgPSAoSW50ZXJuYWxFT2JqZWN0KWxvYWRpbmdDb250YWluZXI7Ci0JCQlsb2FkaW5nQ29udGFpbmVyID0gKENvbnRhaW5lcillUmVzb2x2ZVByb3h5KG9sZExvYWRpbmdDb250YWluZXIpOwotCQkJaWYgKGxvYWRpbmdDb250YWluZXIgIT0gb2xkTG9hZGluZ0NvbnRhaW5lcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xPQURJTkdfQ09OVEFJTkVSLCBvbGRMb2FkaW5nQ29udGFpbmVyLCBsb2FkaW5nQ29udGFpbmVyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvYWRpbmdDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250YWluZXIgYmFzaWNHZXRMb2FkaW5nQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbG9hZGluZ0NvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2FkaW5nQ29udGFpbmVyKENvbnRhaW5lciBuZXdMb2FkaW5nQ29udGFpbmVyKSB7Ci0JCUNvbnRhaW5lciBvbGRMb2FkaW5nQ29udGFpbmVyID0gbG9hZGluZ0NvbnRhaW5lcjsKLQkJbG9hZGluZ0NvbnRhaW5lciA9IG5ld0xvYWRpbmdDb250YWluZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xPQURJTkdfQ09OVEFJTkVSLCBvbGRMb2FkaW5nQ29udGFpbmVyLCBsb2FkaW5nQ29udGFpbmVyKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDb250YWluZXIpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnRhaW5lcihDb250YWluZXIgbmV3Q29udGFpbmVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdDb250YWluZXIsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgbmV3Q29udGFpbmVyKSB7Ci0JCWlmIChuZXdDb250YWluZXIgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSICYmIG5ld0NvbnRhaW5lciAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0NvbnRhaW5lcikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0NvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb250YWluZXIpLmVJbnZlcnNlQWRkKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVMsIENvbnRhaW5lci5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUiwgbmV3Q29udGFpbmVyLCBuZXdDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUjoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyKChDb250YWluZXIpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDb250YWluZXIobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVMsIENvbnRhaW5lci5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fVVJJOgotCQkJCXJldHVybiBnZXRVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19TSVpFOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRTaXplKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzRGlyZWN0b3J5RW50cnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gZ2V0T3JpZ2luYWxVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1VSSToKLQkJCQlzZXRVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXNldExhc3RNb2RpZmllZCgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlzZXREaXJlY3RvcnlFbnRyeSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1VSSToKLQkJCQlzZXRVUkkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJdW5zZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1NJWkU6Ci0JCQkJdW5zZXRTaXplKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJdW5zZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKE9SSUdJTkFMX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIGlzU2V0U2l6ZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzU2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBPUklHSU5BTF9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG9yaWdpbmFsVVJJICE9IG51bGwgOiAhT1JJR0lOQUxfVVJJX0VERUZBVUxULmVxdWFscyhvcmlnaW5hbFVSSSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXJldHVybiBsb2FkaW5nQ29udGFpbmVyICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKFVSSTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXJpKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXN0TW9kaWZpZWQ6ICIpOwotCQlpZiAobGFzdE1vZGlmaWVkRVNldCkgcmVzdWx0LmFwcGVuZChsYXN0TW9kaWZpZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzaXplOiAiKTsKLQkJaWYgKHNpemVFU2V0KSByZXN1bHQuYXBwZW5kKHNpemUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkaXJlY3RvcnlFbnRyeTogIik7Ci0JCWlmIChkaXJlY3RvcnlFbnRyeUVTZXQpIHJlc3VsdC5hcHBlbmQoZGlyZWN0b3J5RW50cnkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvcmlnaW5hbFVSSTogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3JpZ2luYWxVUkkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRmlsZSNpc0ZBUkZpbGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRkFSRmlsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVGaWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVGaWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWYwMzFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlRmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkV4cG9ydFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2R1bGVGaWxlSW1wbCBleHRlbmRzIEFyY2hpdmVJbXBsIGltcGxlbWVudHMgTW9kdWxlRmlsZSB7Ci0KLQkvKiogSW1wbGVtZW50ZXIgZm9yIGV4dHJhY3RpbmcgbWV0YS1kYXRhIGZyb20gdGhpcyBhcmNoaXZlIGludG8gdGhlIHJvb3Qgb2JqZWN0ICovCi0JcHJvdGVjdGVkIEltcG9ydFN0cmF0ZWd5IGltcG9ydFN0cmF0ZWd5OwotCS8qKiBJbXBsZW1lbnRlciBmb3IgYWRkaW5nIG1ldGEtZGF0YSB0byBhbiBhYm91dC10by1iZS1leHBvcnRlZCBhcmNoaXZlICovCi0JcHJvdGVjdGVkIEV4cG9ydFN0cmF0ZWd5IGV4cG9ydFN0cmF0ZWd5OwotCi0JcHVibGljIE1vZHVsZUZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLk1PRFVMRV9GSUxFOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkxhenlJbml0aWFsaXplKCkgewotCQlyZXR1cm4gZ2V0SW1wb3J0U3RyYXRlZ3koKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TW9mUmVzb3VyY2UoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLk1vZHVsZUZpbGUKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBnZXRFQVJGaWxlKCkgewotCQlDb250YWluZXIgYUNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwotCQlpZiAoYUNvbnRhaW5lciA9PSBudWxsIHx8ICFhQ29udGFpbmVyLmlzRUFSRmlsZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKChFQVJGaWxlKSBhQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5FeHBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkV4cG9ydFN0cmF0ZWd5IGdldEV4cG9ydFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZXhwb3J0U3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgZ2V0SW1wb3J0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBpbXBvcnRTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gb2YgdGhlIG1vZHVsZSBmaWxlLCBvciBlbXB0eSBzdHJpbmcgaWYgdW5rbm93biB2ZXJzaW9uLiBGb3IKLQkgKiBleGFtcGxlLCAiMi4wIgotCSAqIAotCSAqIEBkZXByZWNhdGVkLCBVc2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY1ZlcnNpb24oKSB7Ci0JCWZsb2F0IHZlciA9IGdldFNwZWNWZXJzaW9uSUQoKTsKLQkJRmxvYXQgc3BlY1ZlcnNpb24gPSBuZXcgRmxvYXQodmVyIC8gMTApOwotCQlyZXR1cm4gc3BlY1ZlcnNpb24udG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gSUQgb2YgdGhlIG1vZHVsZSBGb3IgZXhhbXBsZSwgIjIwIgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTcGVjVmVyc2lvbklEKCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoWE1MUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkuZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuTW9kdWxlRmlsZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKTsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2R1bGVGaWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCi0JLyoqCi0JICogc3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlCi0JICovCi0JcHVibGljIGFic3RyYWN0IEVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKTsKLQotCXB1YmxpYyBSZXNvdXJjZSBtYWtlRGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJWE1MUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQl0cnkgewotCQkJcmVzb3VyY2UgPSAoWE1MUmVzb3VyY2UpIG1ha2VNb2ZSZXNvdXJjZShnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpKTsKLQkJfSBjYXRjaCAoRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZFeCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXNldFNhdmVTdHJhdGVneShhU2F2ZVN0cmF0ZWd5KTsKLQkJaWYgKGdldEV4cG9ydFN0cmF0ZWd5KCkgIT0gbnVsbCkKLQkJCWdldEV4cG9ydFN0cmF0ZWd5KCkucHJlU2F2ZShhU2F2ZVN0cmF0ZWd5KTsKLQkJc3VwZXIuc2F2ZShhU2F2ZVN0cmF0ZWd5KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHBvcnRTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5FeHBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRXhwb3J0U3RyYXRlZ3kgbmV3RXhwb3J0U3RyYXRlZ3kpIHsKLQkJZXhwb3J0U3RyYXRlZ3kgPSBuZXdFeHBvcnRTdHJhdGVneTsKLQkJaWYgKG5ld0V4cG9ydFN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCW5ld0V4cG9ydFN0cmF0ZWd5LnNldEFyY2hpdmUodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdJbXBvcnRTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltcG9ydFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IG5ld0ltcG9ydFN0cmF0ZWd5KSB7Ci0JCWltcG9ydFN0cmF0ZWd5ID0gbmV3SW1wb3J0U3RyYXRlZ3k7Ci0JCWlmIChuZXdJbXBvcnRTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQluZXdJbXBvcnRTdHJhdGVneS5zZXRBcmNoaXZlKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLk1vZHVsZUZpbGUjc2V0SjJFRVZlcnNpb24oaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uKGludCB2ZXJzaW9uSUQpIHsKLQkJdHJ5IHsKLQkJCSgoWE1MUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkuc2V0VmVyc2lvbklEKHZlcnNpb25JRCk7Ci0JCX0gY2F0Y2ggKFJlc291cmNlTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2Q4N2U5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5Ob01vZHVsZUZpbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2R1bGVSZWZJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTW9kdWxlUmVmIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlRmlsZSBtb2R1bGVGaWxlID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGUoKSA8ZW0+TW9kdWxlPC9lbT59JyByZWZlcmVuY2UuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0TW9kdWxlKCkKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNb2R1bGUgbW9kdWxlID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLk1PRFVMRV9SRUY7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmc7IHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29tcG9uZW50TGlzdChFTGlzdCBsaXN0KSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZUdlbigpIHsKLQkJaWYgKG1vZHVsZUZpbGUgIT0gbnVsbCAmJiBtb2R1bGVGaWxlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRNb2R1bGVGaWxlID0gKEludGVybmFsRU9iamVjdCltb2R1bGVGaWxlOwotCQkJbW9kdWxlRmlsZSA9IChNb2R1bGVGaWxlKWVSZXNvbHZlUHJveHkob2xkTW9kdWxlRmlsZSk7Ci0JCQlpZiAobW9kdWxlRmlsZSAhPSBvbGRNb2R1bGVGaWxlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEUsIG9sZE1vZHVsZUZpbGUsIG1vZHVsZUZpbGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kdWxlRmlsZTsKLQl9Ci0KLQlwdWJsaWMgTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlKCkgewotCQlpZiAobW9kdWxlRmlsZSA9PSBudWxsKQotCQkJaW5pdE1vZHVsZUZpbGVGcm9tRUFSKCk7Ci0JCXJldHVybiBtb2R1bGVGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZSBiYXNpY0dldE1vZHVsZUZpbGUoKSB7Ci0JCXJldHVybiBtb2R1bGVGaWxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRNb2R1bGVGaWxlRnJvbUVBUigpIHsKLQkJY2hlY2tFQVJGaWxlKCk7Ci0JCU1vZHVsZUZpbGUgYUZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJYUZpbGUgPSAoTW9kdWxlRmlsZSkgZ2V0RWFyRmlsZSgpLmdldEZpbGUobW9kdWxlLmdldFVyaSgpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL0lnbm9yZQotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJY2hlY2tUeXBlKG1vZHVsZSwgYUZpbGUpOwotCQlzZXRNb2R1bGVGaWxlKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVGaWxlKE1vZHVsZUZpbGUgbmV3TW9kdWxlRmlsZSkgewotCQlNb2R1bGVGaWxlIG9sZE1vZHVsZUZpbGUgPSBtb2R1bGVGaWxlOwotCQltb2R1bGVGaWxlID0gbmV3TW9kdWxlRmlsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEUsIG9sZE1vZHVsZUZpbGUsIG1vZHVsZUZpbGUpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzQWx0REQoKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICFBcmNoaXZlVXRpbC5pc051bGxPckVtcHR5KG1vZHVsZS5nZXRBbHRERCgpKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRBbHREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRFYXJGaWxlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIGdldEVhckZpbGUoKS5nZXRBbHREZXBsb3ltZW50RGVzY3JpcHRvcihnZXRNb2R1bGUoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJaWYgKGdldEVhckZpbGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIGdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRFYXJGaWxlKCkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoZ2V0TW9kdWxlKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2dldEVBUkZpbGUoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCWlmIChnZXRNb2R1bGVGaWxlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0TW9kdWxlRmlsZSgpLmdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjc2V0VVJJKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSkgewotCQlpZiAoZ2V0TW9kdWxlRmlsZSgpICE9IG51bGwpCi0JCQlnZXRNb2R1bGVGaWxlKCkuc2V0VVJJKHVyaSk7Ci0KLQkJaWYgKGdldE1vZHVsZSgpICE9IG51bGwpCi0JCQlnZXRNb2R1bGUoKS5zZXRVcmkodXJpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2lzQ2xpZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NsaWVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNDb25uZWN0b3IoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdG9yKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNpc0VKQigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFSkIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2lzV2ViKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEVBUkZpbGUgZ2V0RWFyRmlsZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEUpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEVBUkZpbGUpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVhckZpbGUoRUFSRmlsZSBuZXdFYXJGaWxlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdFYXJGaWxlLCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRSwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVhckZpbGUoRUFSRmlsZSBuZXdFYXJGaWxlKSB7Ci0JCWlmIChuZXdFYXJGaWxlICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFICYmIG5ld0VhckZpbGUgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdFYXJGaWxlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RWFyRmlsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFYXJGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlMsIEVBUkZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RWFyRmlsZShuZXdFYXJGaWxlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFLCBuZXdFYXJGaWxlLCBuZXdFYXJGaWxlKSk7Ci0JfQotCi0JcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCAmJiBtb2R1bGUuZUlzUHJveHkoKSkgewotCQkJTW9kdWxlIG9sZE1vZHVsZSA9IG1vZHVsZTsKLQkJCW1vZHVsZSA9IChNb2R1bGUpIEVjb3JlVXRpbC5yZXNvbHZlKG1vZHVsZSwgdGhpcyk7Ci0JCQlpZiAobW9kdWxlICE9IG9sZE1vZHVsZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRSwgb2xkTW9kdWxlLCBtb2R1bGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2R1bGUgYmFzaWNHZXRNb2R1bGUoKSB7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlKE1vZHVsZSBuZXdNb2R1bGUpIHsKLQkJTW9kdWxlIG9sZE1vZHVsZSA9IG1vZHVsZTsKLQkJbW9kdWxlID0gbmV3TW9kdWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEUsIG9sZE1vZHVsZSwgbW9kdWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RWFyRmlsZSgoRUFSRmlsZSlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RWFyRmlsZShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlMsIEVBUkZpbGUuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TW9kdWxlRmlsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldE1vZHVsZUZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEVhckZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TW9kdWxlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TW9kdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJc2V0TW9kdWxlRmlsZSgoTW9kdWxlRmlsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlzZXRFYXJGaWxlKChFQVJGaWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlzZXRNb2R1bGUoKE1vZHVsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJc2V0TW9kdWxlRmlsZSgoTW9kdWxlRmlsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXNldEVhckZpbGUoKEVBUkZpbGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJc2V0TW9kdWxlKChNb2R1bGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCXJldHVybiBtb2R1bGVGaWxlICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXJldHVybiBnZXRFYXJGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXJldHVybiBtb2R1bGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGlucHV0IHN0cmVhbSBmcm9tIHRoZSAicmVzb3VyY2VzIHBhdGgiIG9mIGVpdGhlciB0aGUgTW9kdWxlRmlsZSwgaWYgdGhlIG1vZHVsZSBkb2VzCi0JICogbm90IHVzZSBhbHQtZGQsIG9yIGZyb20gdGhlIGFsdFJvb3Qgb2YgdGhlIG1vZHVsZSwgZm91bmQgaW4gdGhlIHJlc291cmNlcyBwYXRoIG9mIHRoZSBFQVIKLQkgKiAKLQkgKiBAc2VlIExvYWRTdHJhdGVneSNnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodXNlc0FsdEREKCkpCi0JCQlyZXR1cm4gZ2V0QWx0UmVzb3VyY2VJbnB1dFN0cmVhbSh1cmkpOwotCQlyZXR1cm4gZ2V0TG9jYWxSZXNvdXJjZUlucHV0U3RyZWFtKHVyaSk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldExvY2FsUmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljaGVja01vZHVsZUZpbGUoKTsKLQkJcmV0dXJuIG1vZHVsZUZpbGUuZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbSh1cmkpOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBbHRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoZWNrRUFSRmlsZSgpOwotCQlyZXR1cm4gZ2V0RWFyRmlsZSgpLmdldFJlc291cmNlSW5wdXRTdHJlYW0odXJpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2dldFVyaSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkKLQkJCXJldHVybiBtb2R1bGUuZ2V0VXJpKCk7Ci0JCWlmIChtb2R1bGVGaWxlICE9IG51bGwpCi0JCQlyZXR1cm4gbW9kdWxlRmlsZS5nZXRVUkkoKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZVJlZiNnZXRBbHRNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldEFsdE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCWNoZWNrRUFSRmlsZSgpOwotCQlyZXR1cm4gZ2V0RWFyRmlsZSgpLmdldE1vZlJlc291cmNlKHVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNb2R1bGVSZWYjZ2V0TG9jYWxNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldExvY2FsTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIHsKLQkJY2hlY2tNb2R1bGVGaWxlKCk7Ci0JCXJldHVybiBtb2R1bGVGaWxlLmdldE1vZlJlc291cmNlKHVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNb2R1bGVSZWYjZ2V0TW9mUmVzb3VyY2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24gewotCQlpZiAodXNlc0FsdEREKCkpCi0JCQlyZXR1cm4gZ2V0QWx0TW9mUmVzb3VyY2UodXJpKTsKLQkJcmV0dXJuIGdldExvY2FsTW9mUmVzb3VyY2UodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZVJlZiNtYWtlQWx0TW9mUmVzb3VyY2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlQWx0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWNoZWNrRUFSRmlsZSgpOwotCQlyZXR1cm4gZ2V0RWFyRmlsZSgpLm1ha2VNb2ZSZXNvdXJjZSh1cmkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrRUFSRmlsZSgpIHsKLQkJaWYgKGdldEVhckZpbGUoKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuTW9kdWxlX25vdF9pbl9FQVIsIG5ldyBPYmplY3RbXXtnZXRVcmkoKX0pKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBNb2R1bGVSZWYjbWFrZUxvY2FsTW9mUmVzb3VyY2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTG9jYWxNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJY2hlY2tNb2R1bGVGaWxlKCk7Ci0JCXJldHVybiBtb2R1bGVGaWxlLm1ha2VNb2ZSZXNvdXJjZSh1cmkpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tNb2R1bGVGaWxlKCkgewotCQlnZXRNb2R1bGVGaWxlKCk7Ci0JCWlmIChtb2R1bGVGaWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuTW9kdWxlX2ZpbGVfZG9lc19ub3RfZXhpc3RfMiwgbmV3IE9iamVjdFtde2dldFVyaSgpfSkpOyAKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoTW9kdWxlIG1vZHVsZURlc2NyaXB0b3IsIEZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlID09IG51bGwpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5BX2ZpbGVfZG9lc19ub3RfZXhpc3RfZm9yX21vZHVsZSwgbmV3IE9iamVjdFtde21vZHVsZURlc2NyaXB0b3IuZ2V0VXJpKCl9KTsgCi0JCQl0aHJvdyBuZXcgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JCS8vQWRkZWQgZm9yIGRlZmVjdCAxMTM5MjkKLQkJYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQkJU3RyaW5nIHR5cGUgPSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLk1vZHVsZV9maWxlOyAKLQkJaWYgKG1vZHVsZURlc2NyaXB0b3IuaXNXZWJNb2R1bGUoKSAmJiAhYUZpbGUuaXNXQVJGaWxlKCkpIHsKLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCXR5cGUgPSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFfV0FSX2ZpbGU7IAotCQl9IGVsc2UgaWYgKG1vZHVsZURlc2NyaXB0b3IuaXNFamJNb2R1bGUoKSAmJiAhYUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCXR5cGUgPSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFuX0VKQl9KQVJfZmlsZTsgCi0JCX0gZWxzZSBpZiAobW9kdWxlRGVzY3JpcHRvci5pc0phdmFNb2R1bGUoKSAmJiAhYUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJdHlwZSA9IENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQW5fQXBwbGljYXRpb25fQ2xpZW50X0pBUl9maWxlOyAKLQkJfSBlbHNlIGlmIChtb2R1bGVEZXNjcmlwdG9yLmlzQ29ubmVjdG9yTW9kdWxlKCkgJiYgIWFGaWxlLmlzUkFSRmlsZSgpKSB7Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl0eXBlID0gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5BX1JBUl9maWxlOyAKLQkJfSBlbHNlIGlmICghYUZpbGUuaXNNb2R1bGVGaWxlKCkpCi0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0KLQkJaWYgKGlzVmFsaWQpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGVhclVyaSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChnZXRFYXJGaWxlKCkgIT0gbnVsbCkKLQkJCWVhclVyaSA9IGdldEVhckZpbGUoKS5nZXRVUkkoKTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmlsZV9ub3RfY29ycmVjdF90eXBlIiwgbmV3IE9iamVjdFtde2FGaWxlLmdldFVSSSgpLCBlYXJVcmksIHR5cGV9KTsgLy8kTk9OLU5MUy0xJAotCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZVJlZiNtYWtlTW9mUmVzb3VyY2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VzQWx0REQoKSkKLQkJCXJldHVybiBtYWtlQWx0TW9mUmVzb3VyY2UodXJpKTsKLQkJcmV0dXJuIG1ha2VMb2NhbE1vZlJlc291cmNlKHVyaSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1JBUkZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1JBUkZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmU2NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SQVJGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkRlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuQ29ubmVjdG9yRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLlJhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJBUkZpbGVJbXBsIGV4dGVuZHMgTW9kdWxlRmlsZUltcGwgaW1wbGVtZW50cyBSQVJGaWxlIHsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlcGxveW1lbnREZXNjcmlwdG9yKCkgPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdG9yIGRlcGxveW1lbnREZXNjcmlwdG9yID0gbnVsbDsKLQotCXB1YmxpYyBSQVJGaWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5SQVJfRklMRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuV0FSRmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGFkZENvcHlDbGFzcyhGaWxlIGFGaWxlKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChhRmlsZS5pc1JlYWRPbmx5RGlyZWN0b3J5KCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuYWRkX2NvcHlfY2xhc3NfZGlyX0VYQ18sIChuZXcgT2JqZWN0W117YUZpbGUuZ2V0VVJJKCl9KSkpOyAvLyA9ICJNZXRob2QgYWRkQ29weUNsYXNzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yaWVzIDoiCi0JCXJldHVybiBhZGRDb3B5RmlsZUFkZGluZ1ByZWZpeChhRmlsZSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGFkZENvcHlGaWxlQWRkaW5nUHJlZml4KEZpbGUgYUZpbGUsIFN0cmluZyB1cmlQcmVmaXgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlTdHJpbmcgc3dpenpsZWRVcmkgPSBhRmlsZS5nZXRVUkkoKTsKLQkJaWYgKCFzd2l6emxlZFVyaS5zdGFydHNXaXRoKHVyaVByZWZpeCkpIHsKLQkJCXN3aXp6bGVkVXJpID0gQXJjaGl2ZVV0aWwuY29uY2F0VXJpKHVyaVByZWZpeCwgc3dpenpsZWRVcmksICcvJyk7Ci0JCX0KLQkJY2hlY2tBZGRWYWxpZChzd2l6emxlZFVyaSk7Ci0JCUZpbGUgY29weSA9IGNvcHkoYUZpbGUpOwotCQljb3B5LnNldFVSSShzd2l6emxlZFVyaSk7Ci0JCWdldEZpbGVzKCkuYWRkKGNvcHkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZVNhdmVTdHJhdGVneUZvckNvbm5lY3RvckRpcmVjdG9yeShqYXZhLmlvLkZpbGUgZGlyLCBpbnQgZXhwYW5zaW9uRmxhZ3MpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKGRpci5nZXRBYnNvbHV0ZVBhdGgoKSwgZXhwYW5zaW9uRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdFRvQ29ubmVjdG9yRGlyZWN0b3J5KGphdmEubGFuZy5TdHJpbmcgYVVyaSwgaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlqYXZhLmlvLkZpbGUgYURpciA9IG5ldyBqYXZhLmlvLkZpbGUoYVVyaSk7Ci0JCWlmIChnZXRMb2FkU3RyYXRlZ3koKS5pc1VzaW5nKGFEaXIpKQotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuRXh0cmFjdF9kZXN0aW5hdGlvbl9pc190aGVfRVhDXyk7IC8vID0gIkV4dHJhY3QgZGVzdGluYXRpb24gaXMgdGhlIHNhbWUgcGF0aCBhcyBzb3VyY2UgZmlsZSIKLQotCQl0cnkgewotCQkJU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kgPSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JDb25uZWN0b3JEaXJlY3RvcnkoYURpciwgZXhwYW5zaW9uRmxhZ3MpOwotCQkJc2F2ZShhU2F2ZVN0cmF0ZWd5KTsKLQkJCWFTYXZlU3RyYXRlZ3kuY2xvc2UoKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZXJyb3Jfc2F2aW5nX0VYQ18sIChuZXcgT2JqZWN0W117dXJpfSkpLCBleCk7IC8vID0gIkVycm9yIHNhdmluZyAiCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5SQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldENsYXNzZXMoKSB7Ci0JCXJldHVybiBmaWx0ZXJGaWxlc0J5UHJlZml4KEFyY2hpdmVDb25zdGFudHMuUkFSX0NMQVNTRVNfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0JcHVibGljIENvbm5lY3RvciBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlDb25uZWN0b3IgZGQgPSBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJaWYgKGRkID09IG51bGwgJiYgY2FuTGF6eUluaXRpYWxpemUoKSkKLQkJCXRyeSB7Ci0JCQkJZ2V0SW1wb3J0U3RyYXRlZ3koKS5pbXBvcnRNZXRhRGF0YSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCksIGUpOwotCQkJfQotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25uZWN0b3IgYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UmVzb3VyY2VzKCkgewotCQlTdHJpbmdbXSBwcmVmaXhlcyA9IHtKMkVFQ29uc3RhbnRzLk1FVEFfSU5GLCBKMkVFQ29uc3RhbnRzLldFQl9JTkZ9OwotCQlyZXR1cm4gZmlsdGVyRmlsZXNXaXRob3V0UHJlZml4KHByZWZpeGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERlcGxveWVtZW50RGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSQVJGaWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuaW1wbC5Nb2R1bGVGaWxlSW1wbAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBtYWtlRGVwbG95bWVudERlc2NyaXB0b3IoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSmNhUGFja2FnZSBwID0gKEpjYVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSk7Ci0JCUpjYUZhY3RvcnkgZmN0ID0gcC5nZXRKY2FGYWN0b3J5KCk7Ci0JCUNvbm5lY3RvciBjb25uZWN0b3IgPSBmY3QuY3JlYXRlQ29ubmVjdG9yKCk7Ci0JCXNldERlcGxveW1lbnREZXNjcmlwdG9yKGNvbm5lY3Rvcik7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGNvbm5lY3Rvcik7Ci0JCXJldHVybiBjb25uZWN0b3I7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihDb25uZWN0b3IgbCkgewotCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IGw7Ci0JCXJlcGxhY2VSb290KGdldE1vZlJlc291cmNlTWFrZUlmTmVjZXNzYXJ5KGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkpLCBsKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCXJldHVybiBiYXNpY0dldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoQ29ubmVjdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChDb25uZWN0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCXB1YmxpYyBDbGFzc0xvYWRlciBjcmVhdGVEeW5hbWljQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50Q2wsIENsYXNzTG9hZGVyIGV4dHJhQ2wpIHsKLQkJcmV0dXJuIG5ldyBSYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyKHRoaXMsIHBhcmVudENsLCBleHRyYUNsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUmVhZE9ubHlEaXJlY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1JlYWRPbmx5RGlyZWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTNlNjRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUmVhZE9ubHlEaXJlY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5RGlyZWN0b3J5SW1wbCBleHRlbmRzIENvbnRhaW5lckltcGwgaW1wbGVtZW50cyBSZWFkT25seURpcmVjdG9yeSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlEaXJlY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLlJFQURfT05MWV9ESVJFQ1RPUlk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpbGUoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB7Ci0JCWdldEZpbGVzKCk7Ci0JCXJldHVybiBnZXRGaWxlSW5kZXgoKS5jb250YWluc0tleShhVXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb250YWluc0ZpbGVJblJvb3RPclN1YmRpcmVjdG9yeSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpbGVJblNlbGZPclN1YmRpcmVjdG9yeShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmNvbnRhaW5zKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIGdldEZpbGVJblNlbGZPclN1YmRpcmVjdG9yeSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoIWNvbnRhaW5zRmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5KGFVcmkpKQotCQkJdGhyb3cgbmV3IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGFVcmkpOwotCi0JCWlmIChjb250YWluc0ZpbGUoYVVyaSkpCi0JCQlyZXR1cm4gZ2V0RmlsZShhVXJpKTsKLQotCQlMaXN0IHN1YmRpcnMgPSBnZXRSZWFkT25seURpcmVjdG9yaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViZGlycy5zaXplKCk7IGkrKykgewotCQkJUmVhZE9ubHlEaXJlY3Rvcnkgc3ViZGlyID0gKFJlYWRPbmx5RGlyZWN0b3J5KSBzdWJkaXJzLmdldChpKTsKLQkJCWlmIChzdWJkaXIuY29udGFpbnNGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoYVVyaSkpCi0JCQkJcmV0dXJuIHN1YmRpci5nZXRGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoYVVyaSk7Ci0JCX0KLQkJdGhyb3cgbmV3IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBmbGF0IGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBjb250YWluZWQgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIHN1YmRpcmVjdG9yaWVzLCB3aXRoIHRoZQotCSAqIGRpcmVjdG9yaWVzIGZpbHRlcmVkIG91dCwgYXMgdGhlIGxpc3Qgd291bGQgYXBwZWFyIGluIGFuIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXNSZWN1cnNpdmUoKSB7Ci0JCUxpc3QgYWxsRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZXNMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZXNMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc1JlYWRPbmx5RGlyZWN0b3J5KCkpCi0JCQkJYWxsRmlsZXMuYWRkQWxsKCgoUmVhZE9ubHlEaXJlY3RvcnkpIGFGaWxlKS5nZXRGaWxlc1JlY3Vyc2l2ZSgpKTsKLQkJCWVsc2UKLQkJCQlhbGxGaWxlcy5hZGQoYUZpbGUpOwotCQl9Ci0JCXJldHVybiBhbGxGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBmaWxlcyB3aXRoIGp1c3QgdGhlIGluc3RhbmNlcyBvZiBSZWFkT25seURpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlYWRPbmx5RGlyZWN0b3JpZXMoKSB7Ci0JCUxpc3QgZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZXNMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZXNMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc1JlYWRPbmx5RGlyZWN0b3J5KCkpCi0JCQkJZmlsdGVyZWQuYWRkKGFGaWxlKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyZWQ7Ci0JfQotCi0JLyoqCi0JICogaXNSZWFkT25seURpcmVjdG9yeSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1Jvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1Jvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MzU2NzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Sb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3k7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDQvMDAgNToyNDo0NCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHNpbmdsZXRvbjsKLQotCS8qKgotCSAqIENvbW1vbkFyY2hpdmVGYWN0b3J5RGVzY3JpbWluYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjb252ZXJ0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiBhbkFyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBUaGlzIG5ldmVyIGdldHMgY2FsbGVkIGZvciB0aGlzCi0JICogICAgICBpbXBsZW1lbnRlci4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBUaGlzIG5ldmVyIGdldHMgY2FsbGVkIGZvciB0aGlzCi0JICogICAgICBpbXBsZW1lbnRlci4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG51bGwgVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBnZXQgY2FsbGVkIGF0IHRoaXMgbGV2ZWwKLQkgKiAKLQkgKiBAc2VlIEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvciNnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHNpbmdsZXRvbigpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlzaW5nbGV0b24gPSBuZXcgUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwoKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1Jvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDlhY2M4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5OwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA0LzAwIDU6MjQ6NDQgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgc2luZ2xldG9uOwotCi0JLyoqCi0JICogQ29tbW9uQXJjaGl2ZUZhY3RvcnlEZXNjcmltaW5hdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJamF2YS51dGlsLkxpc3QgdGhlQ2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZUNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQgPSAoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yKSB0aGVDaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoY2hpbGQuY2FuSW1wb3J0KGFuQXJjaGl2ZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjb252ZXJ0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiBhbkFyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBUaGlzIG5ldmVyIGdldHMgY2FsbGVkIGZvciB0aGlzCi0JICogICAgICBpbXBsZW1lbnRlci4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBUaGlzIG5ldmVyIGdldHMgY2FsbGVkIGZvciB0aGlzCi0JICogICAgICBpbXBsZW1lbnRlci4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG51bGwgVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBnZXQgY2FsbGVkIGF0IHRoaXMgbGV2ZWwKLQkgKiAKLQkgKiBAc2VlIEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvciNnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQlTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJamF2YS51dGlsLkxpc3QgdGhlQ2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZUNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQgPSAoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yKSB0aGVDaGlsZHJlbi5nZXQoaSk7Ci0JCQltZXNzYWdlLmFwcGVuZChjaGlsZC5nZXRVbmFibGVUb09wZW5NZXNzYWdlKCkpOwotCQkJbWVzc2FnZS5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlhZGRDaGlsZChFamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yI29wZW5BcmNoaXZlKEFyY2hpdmUpCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgcmVzdWx0ID0gc3VwZXIub3BlbkFyY2hpdmUoYW5BcmNoaXZlKTsKLQkJaWYgKHJlc3VsdCA9PSBhbkFyY2hpdmUpCi0JCQkvL0NvdWxkbid0IGNvbnZlcnQKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHNpbmdsZXRvbigpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlzaW5nbGV0b24gPSBuZXcgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dBUkZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dBUkZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMWExMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XQVJGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5XYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdBUkZpbGVJbXBsIGV4dGVuZHMgTW9kdWxlRmlsZUltcGwgaW1wbGVtZW50cyBXQVJGaWxlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBXZWJBcHAgZGVwbG95bWVudERlc2NyaXB0b3IgPSBudWxsOwotCXByb3RlY3RlZCBMaXN0IHNvdXJjZUZpbGVzOwotCi0JcHVibGljIFdBUkZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLldBUl9GSUxFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIEZpbGUgYWRkQ29weUNsYXNzKEZpbGUgYUZpbGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlpZiAoYUZpbGUuaXNSZWFkT25seURpcmVjdG9yeSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmFkZF9jb3B5X2NsYXNzX2Rpcl9FWENfLCAobmV3IE9iamVjdFtde2FGaWxlLmdldFVSSSgpfSkpKTsgLy8gPSAiTWV0aG9kIGFkZENvcHlDbGFzcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcmllcyA6IgotCQlyZXR1cm4gYWRkQ29weUZpbGVBZGRpbmdQcmVmaXgoYUZpbGUsIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBhZGRDb3B5RmlsZUFkZGluZ1ByZWZpeChGaWxlIGFGaWxlLCBTdHJpbmcgdXJpUHJlZml4KSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN3aXp6bGVkVXJpID0gYUZpbGUuZ2V0VVJJKCk7Ci0JCWlmICghc3dpenpsZWRVcmkuc3RhcnRzV2l0aCh1cmlQcmVmaXgpKSB7Ci0JCQlzd2l6emxlZFVyaSA9IEFyY2hpdmVVdGlsLmNvbmNhdFVyaSh1cmlQcmVmaXgsIHN3aXp6bGVkVXJpLCAnLycpOwotCQl9Ci0JCWNoZWNrQWRkVmFsaWQoc3dpenpsZWRVcmkpOwotCQlGaWxlIGNvcHkgPSBjb3B5KGFGaWxlKTsKLQkJY29weS5zZXRVUkkoc3dpenpsZWRVcmkpOwotCQlnZXRGaWxlcygpLmFkZChjb3B5KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBhZGRDb3B5TGliKEZpbGUgYUZpbGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlpZiAoYUZpbGUuaXNSZWFkT25seURpcmVjdG9yeSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmFkZF9jb3B5X2xpYl9kaXJfRVhDXywgKG5ldyBPYmplY3RbXXthRmlsZS5nZXRVUkkoKX0pKSk7IC8vID0gIk1ldGhvZCBhZGRDb3B5TGliIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yaWVzIDoiCi0JCXJldHVybiBhZGRDb3B5RmlsZUFkZGluZ1ByZWZpeChhRmlsZSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBjcmVhdGVMaWJDbGFzc3BhdGhFbnRyeShTdHJpbmcgbGliUGF0aCkgewotCQlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkobGliUGF0aCk7Ci0JCWVudHJ5LnNldFdhckZpbGUodGhpcyk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yIGJ1aWxkaW5nIHRoZSBydW50aW1lIGNsYXNzIHBhdGgKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3Qgb2YgU3RyaW5ncywgdGhlIGFic29sdXRlIHBhdGhzIG9mIGFsbCBmaWxlIGVudHJpZXMgKG5vIGRpcmVjdG9yaWVzKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEFsbEZpbGVFbnRyaWVzUmVjdXJzaXZlKGphdmEuaW8uRmlsZSBhRmlsZSwgTGlzdCBhTGlzdCkgewotCQlpZiAoIWFGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIGFMaXN0OwotCQkvL21vZGlmaWVkIGZvciBib3RwIDEyNjE0MCAwNS4yOS4wMgotCQlTdHJpbmcgbmFtZSA9IGFGaWxlLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUucmVnaW9uTWF0Y2hlcyh0cnVlLCBuYW1lLmxlbmd0aCgpIC0gNCwgIi5qYXIiLCAwLCA0KSkgey8vJE5PTi1OTFMtMSQKLQkJCWFMaXN0LmFkZChhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0gZWxzZSBpZiAoYUZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJamF2YS5pby5GaWxlW10gY2hpbGRyZW4gPSBhRmlsZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlnZXRBbGxGaWxlRW50cmllc1JlY3Vyc2l2ZShjaGlsZHJlbltpXSwgYUxpc3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuV0FSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDbGFzc2VzKCkgewotCQlyZXR1cm4gZmlsdGVyRmlsZXNCeVByZWZpeChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJV2ViQXBwIGRkID0gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwotCQlpZiAoZGQgPT0gbnVsbCAmJiBjYW5MYXp5SW5pdGlhbGl6ZSgpKQotCQkJdHJ5IHsKLQkJCQlnZXRJbXBvcnRTdHJhdGVneSgpLmltcG9ydE1ldGFEYXRhKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSwgZSk7Ci0JCQl9Ci0JCXJldHVybiB0aGlzLmdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldExpYnMoKSB7Ci0JCXJldHVybiBmaWx0ZXJGaWxlc0J5UHJlZml4KEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGliQXJjaGl2ZXMoKSB7Ci0JCXJldHVybiBmaWx0ZXJGaWxlcyhBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJLCBuZXcgU3RyaW5nW117ImphciIsICJ6aXAifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFJlc291cmNlcygpIHsKLQkJU3RyaW5nW10gcHJlZml4ZXMgPSB7SjJFRUNvbnN0YW50cy5NRVRBX0lORiwgSjJFRUNvbnN0YW50cy5XRUJfSU5GfTsKLQkJcmV0dXJuIGZpbHRlckZpbGVzV2l0aG91dFByZWZpeChwcmVmaXhlcyk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiBmcm9tIHN1cGVyY2xhc3MgdG8gaW5jbHVkZSB0aGUgY2xhc2VzZXMgYW5kIGxpYnMgb2YgYSBXQVJGaWxlIFRoZXJlIGFsc28gaXMgYW4KLQkgKiBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyBhbiBleHBsb2RlZCB3YXIgZmlsZSBUaGUgZm9sbG93aW5nIGlzIHdoYXQgc2hvdWxkIGJlIHJldHVybmVkOgotCSAqIAotCSAqIDEpIFdBUiBkaXJlY3RvcnkgKyAvV0VCLUlORi9jbGFzc2VzIDIpIGFsbCBKQVIgZmlsZXMgY29udGFpbmVkIGluIFtXQVIgZGlyZWN0b3J5ICsKLQkgKiAvV0VCLUlORi9saWJdIDMpIFdBUiBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZ2V0TG9jYWxSdW50aW1lQ2xhc3NQYXRoKCkgewotCi0JCVN0cmluZyBhYnNvbHV0ZVBhdGg7Ci0JCXRyeSB7Ci0JCQlhYnNvbHV0ZVBhdGggPSBnZXRMb2FkU3RyYXRlZ3koKS5nZXRCaW5hcmllc1BhdGgoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5WzBdOwotCQl9Ci0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChnZXRMb2FkU3RyYXRlZ3koKS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmcgY2xhc3Nlc1BhdGggPSBBcmNoaXZlVXRpbC5nZXRPU1VyaShhYnNvbHV0ZVBhdGgsIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJKTsKLQkJCWVudHJpZXMuYWRkKGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShjbGFzc2VzUGF0aCkpOwotCQkJYWRkV2ViTGlicyhhYnNvbHV0ZVBhdGgsIGVudHJpZXMpOwotCQl9Ci0KLQkJZW50cmllcy5hZGQoY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KGFic29sdXRlUGF0aCkpOwotCQlyZXR1cm4gKFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdKSBlbnRyaWVzLnRvQXJyYXkobmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoQXRUaGlzTGV2ZWwoKSB7Ci0KLQkJU3RyaW5nIGFic29sdXRlUGF0aCA9IGludGVybmFsR2V0QmluYXJpZXNQYXRoKCk7Ci0JCWlmIChhYnNvbHV0ZVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBlbXB0eUNsYXNzcGF0aCgpOwotCQlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBtZkVudHJpZXMgPSBzdXBlci5nZXREZXBlbmRlbmN5Q2xhc3NQYXRoQXRUaGlzTGV2ZWwoKTsKLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KG1mRW50cmllcykpOwotCi0JCXJldHVybiAoUnVudGltZUNsYXNzcGF0aEVudHJ5W10pIGVudHJpZXMudG9BcnJheShuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2ViTGlicyhTdHJpbmcgYWJzb2x1dGVQYXRoLCBMaXN0IGVudHJpZXMpIHsKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJICogT3B0aW1pemF0aW9uKioqKioqKioqKiogV2UgY291bGQgaGF2ZSB1c2VkIHRoZSBoZWxwZXIgZ2V0bGlicyBoZXJlOyBob3dldmVyLCB0aGF0IGNvdWxkCi0JCSAqIGRyYWcgZG93biBwZXJmb3JtYW5jZSBhcyB0aGUgZnVsbCBmaWxlIGxpc3Qgd291bGQgaGF2ZSB0byBnZXQgYnVpbHQsIGFuZCB0aGlzIGlzIHJ1bnRpbWU7Ci0JCSAqIGlmIHRoZSBjbGFzc2VzIHBvcnRpb24gaXMgaHVnZSB0aGVuIGJ1aWxkaW5nIHRoZSBmaWxlIGxpc3Qgd291bGQgYmUgc2xvdzsgbW9yZW92ZXIsIHdlCi0JCSAqIHdvdWxkIHRoZW4gaGF2ZSB0byBjbGVhciB0aGUgaW5kZXggZnJvbSB0aGlzIHdhciBmaWxlLiB0aGVyZWZvcmUsIHdlJ2xsIGRvIGEgbGl0dGxlIGV4dHJhCi0JCSAqIHdvcmsgdG8gZ2V0IHRoZSBsaWJzCi0JCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoYWJzb2x1dGVQYXRoLCBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKSk7Ci0JCUxpc3QgbGlicyA9IGdldEFsbEZpbGVFbnRyaWVzUmVjdXJzaXZlKGFGaWxlLCBuZXcgQXJyYXlMaXN0KCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYnMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBsaWJQYXRoID0gKFN0cmluZykgbGlicy5nZXQoaSk7Ci0JCQllbnRyaWVzLmFkZChjcmVhdGVMaWJDbGFzc3BhdGhFbnRyeShsaWJQYXRoKSk7Ci0JCX0KLQkJYWRkTG9vc2VMaWJzVG9SdW50aW1lQ2xhc3NwYXRoKGVudHJpZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExvb3NlTGlic1RvUnVudGltZUNsYXNzcGF0aChMaXN0IGVudHJpZXMpIHsKLQkJTG9vc2VXQVJGaWxlIGxvb3NlID0gKExvb3NlV0FSRmlsZSkgZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0TG9vc2VBcmNoaXZlKCk7Ci0JCWlmIChsb29zZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUxpc3QgbG9vc2VMaWJzID0gbG9vc2UuZ2V0TG9vc2VMaWJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9vc2VMaWJzLnNpemUoKTsgaSsrKSB7Ci0JCQlMb29zZUxpYnJhcnkgbGliID0gKExvb3NlTGlicmFyeSkgbG9vc2VMaWJzLmdldChpKTsKLQkJCWVudHJpZXMuYWRkKGNyZWF0ZUxpYkNsYXNzcGF0aEVudHJ5KGxpYi5nZXRCaW5hcmllc1BhdGgoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgY2FsY3VsYXRlU291cmNlQ2FuZGlkYXRlRmlsZXMoKSB7Ci0JCUxpc3QgZmlsZXNMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJTGlzdCByZXRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmlsZXNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmlsZSBmaWxlID0gKEZpbGUpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGFVcmkgPSBmaWxlLmdldFVSSSgpOwotCQkJaWYgKGFVcmkuc3RhcnRzV2l0aChKMkVFQ29uc3RhbnRzLldFQl9JTkYpICYmICFhVXJpLnN0YXJ0c1dpdGgoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSkpCi0JCQkJcmV0RmlsZXMuYWRkKGZpbGUpOwotCQl9Ci0JCXJldHVybiByZXRGaWxlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTb3VyY2VDYW5kaWRhdGVGaWxlcygpIHsKLQkJaWYgKHNvdXJjZUZpbGVzID09IG51bGwpIHsKLQkJCXNvdXJjZUZpbGVzID0gY2FsY3VsYXRlU291cmNlQ2FuZGlkYXRlRmlsZXMoKTsKLQkJfQotCQlyZXR1cm4gc291cmNlRmlsZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBtYWtlUmVsYXRpdmUoU3RyaW5nIHBhdGhTdHJpbmcsIFN0cmluZyByZWxUb1BhdGhTdHJpbmcpIHsKLQotCQlpZiAocGF0aFN0cmluZy5zdGFydHNXaXRoKHJlbFRvUGF0aFN0cmluZykpCi0JCQlyZXR1cm4gQXJjaGl2ZVV0aWwudHJ1bmNhdGVGcm9tRnJvbnRJZ25vcmVDYXNlKHBhdGhTdHJpbmcsIHJlbFRvUGF0aFN0cmluZyk7Ci0KLQkJcmV0dXJuIHBhdGhTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzb3VyY2UgZmlsZSB0aGF0IG1hdGNoZXMgdGhlIG91dHB1dCBmaWxlIHBhc3NlZCBpbgotCSAqIAotCSAqIEBwYXJhbSBhQ2xhc3NGaWxlCi0JICogICAgICAgICAgICBUaGUgLmNsYXNzIGZpbGUgb3Igb3RoZXIgb3V0cHV0IGZpbGUgdG8gZmluZCB0aGUgc291cmNlIGZvcgotCSAqIEByZXR1cm4gU3RyaW5nIFRoZSBtYXRjaGluZyBzb3VyY2UuIE51bGwgaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc291cmNlIGZvdW5kCi0JICovCi0JcHVibGljIEZpbGUgZ2V0U291cmNlRmlsZShGaWxlIGFDbGFzc0ZpbGUpIHsKLQkJTGlzdCBzb3VyY2VGaWxlc0xpc3QgPSBnZXRTb3VyY2VDYW5kaWRhdGVGaWxlcygpOwotCQlTdHJpbmcgY2xhc3NVUkkgPSBhQ2xhc3NGaWxlLmdldFVSSSgpOwotCQlTdHJpbmcgY29udmVydGVkQ2xhc3NVUkkgPSBjbGFzc1VSSTsKLQkJaWYgKGNsYXNzVVJJLmVuZHNXaXRoKCIuY2xhc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJY29udmVydGVkQ2xhc3NVUkkgPSBBcmNoaXZlVXRpbC5jbGFzc1VyaVRvSmF2YVVyaShhQ2xhc3NGaWxlLmdldFVSSSgpKTsKLQkJZWxzZSAKLQkJCXJldHVybiBudWxsOwotCQljb252ZXJ0ZWRDbGFzc1VSSSA9IG1ha2VSZWxhdGl2ZShjb252ZXJ0ZWRDbGFzc1VSSSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwotCQlpbnQgYmVzdExlbmd0aCA9IDMyNzY3OwotCQlGaWxlIGJlc3RNYXRjaCA9IG51bGw7Ci0JCUZpbGUgZmlsZSA9IG51bGw7Ci0JCVN0cmluZyBhVXJpID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc291cmNlRmlsZXNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJZmlsZSA9IChGaWxlKSBpdGVyLm5leHQoKTsKLQkJCWFVcmkgPSBmaWxlLmdldFVSSSgpOwotCQkJaWYgKGFVcmkuZW5kc1dpdGgoY29udmVydGVkQ2xhc3NVUkkpICYmICFhVXJpLmVxdWFscyhjbGFzc1VSSSkpIHsKLQkJCQlpbnQgZXhjZXNzTGVuZ3RoID0gYVVyaS5sZW5ndGgoKSAtIGNvbnZlcnRlZENsYXNzVVJJLmxlbmd0aCgpOwotCQkJCWlmIChleGNlc3NMZW5ndGggPCBiZXN0TGVuZ3RoKSB7Ci0JCQkJCWJlc3RNYXRjaCA9IGZpbGU7Ci0JCQkJCWJlc3RMZW5ndGggPSBleGNlc3NMZW5ndGg7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBiZXN0TWF0Y2g7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEZXBsb3llbWVudERlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV0FSRmlsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVdlYkFwcCB3ZWJBcHAgPSAoKFdlYmFwcGxpY2F0aW9uUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpKS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVXZWJBcHAoKTsKLQkJcmVzb3VyY2Uuc2V0SUQod2ViQXBwLCBKMkVFQ29uc3RhbnRzLldFQkFQUF9JRCk7Ci0JCXNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKHdlYkFwcCk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHdlYkFwcCk7Ci0JCXJldHVybiB3ZWJBcHA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoV2ViQXBwIGwpIHsKLQkJdGhpcy5zZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihsKTsKLQkJcmVwbGFjZVJvb3QoZ2V0TW9mUmVzb3VyY2VNYWtlSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSksIGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpIHsKLQkJaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGwgJiYgZGVwbG95bWVudERlc2NyaXB0b3IuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERlcGxveW1lbnREZXNjcmlwdG9yID0gKEludGVybmFsRU9iamVjdClkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJCWRlcGxveW1lbnREZXNjcmlwdG9yID0gKFdlYkFwcCllUmVzb2x2ZVByb3h5KG9sZERlcGxveW1lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBvbGREZXBsb3ltZW50RGVzY3JpcHRvcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYkFwcCBiYXNpY0dldERlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oV2ViQXBwIG5ld0RlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCVdlYkFwcCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlcGxveW1lbnREZXNjcmlwdG9yOwotCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IG5ld0RlcGxveW1lbnREZXNjcmlwdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SLCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciwgZGVwbG95bWVudERlc2NyaXB0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCXJldHVybiBiYXNpY0dldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCXB1YmxpYyBDbGFzc0xvYWRlciBjcmVhdGVEeW5hbWljQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50Q2wsIENsYXNzTG9hZGVyIGV4dHJhQ2wpIHsKLQkJcmV0dXJuIG5ldyBXYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyKHRoaXMsIHBhcmVudENsLCBleHRyYUNsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvV2ViTW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NDFjZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYk1vZHVsZVJlZkltcGwgZXh0ZW5kcyBNb2R1bGVSZWZJbXBsIGltcGxlbWVudHMgV2ViTW9kdWxlUmVmIHsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFdlYk1vZHVsZVJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuV0VCX01PRFVMRV9SRUY7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFdlYk1vZHVsZVJlZiNnZXRXZWJBcHAoKQotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChXZWJBcHApIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNpc1dlYigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXZWIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfSAvL1dlYk1vZHVsZVJlZkltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FwcENsaWVudDEyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcHBDbGllbnQxMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGU1OTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FwcENsaWVudDEyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gZXhwb3J0IG1ldGEtZGF0YSBmb3IgYSAxLjIgQXBwbGljYXRpb24gQ2xpZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnQxMkV4cG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIEV4cG9ydFN0cmF0ZWd5SW1wbCB7Ci0JLyoqCi0JICogQXBwQ2xpZW50MTJFeHBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBcHBDbGllbnQxMkV4cG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyMzZmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBpbXBvcnQgbWV0YS1kYXRhIGZvciBhIDEuMiBBcHBsaWNhdGlvbiBDbGllbnQKLSAqLwotcHVibGljIGNsYXNzIEFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQkJcmV0dXJuIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCQkgKi8KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJCXJldHVybiBuZXcgQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5hYmxlVG9PcGVuTWVzc2FnZSgpIHsKLQkJCXJldHVybiBnZXRYbWxERE1lc3NhZ2UoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5BcHBsaWNhdGlvbl9DbGllbnRfSmFyX0ZpbCwgSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSk7IC8vID0gIkFwcGxpY2F0aW9uIENsaWVudCBKYXIgRmlsZSIKLQkJfQotCi0JCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCQlyZXR1cm4gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRGlzY3JpbWluYXRvciBkaXNjcmltaW5hdG9yOwotCi0JLyoqCi0JICogQXBwQ2xpZW50MjJJbXBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvcigpLmNyZWF0ZUltcG9ydFN0cmF0ZWd5KG9sZCwgbmV3QXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnRGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3IgPT0gbnVsbCkgewotCQkJZGlzY3JpbWluYXRvciA9IG5ldyBEaXNjcmltaW5hdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0TWV0YURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50IGNsaWVudCA9IG51bGw7Ci0KLQkJY2xpZW50ID0gKEFwcGxpY2F0aW9uQ2xpZW50KSBwcmltTG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlKCkuc2V0RGVwbG95bWVudERlc2NyaXB0b3IoY2xpZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcmNoaXZlU3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FyY2hpdmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNhZDE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FyY2hpdmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHN1cGVydHlwZSBmb3IgYWxsIHRoZSBhcmNoaXZlIHN0cmF0ZWdpZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJjaGl2ZVN0cmF0ZWd5IHsKLQlwdWJsaWMgQXJjaGl2ZSBnZXRBcmNoaXZlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKEFyY2hpdmUgYXJjaGl2ZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcmNoaXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcmNoaXZlU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTI0OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXJjaGl2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci0KLS8qKgotICogVGhpcyBhbiBhYnN0cmFjdCB0eXBlIG9mZiB3aGljaCBhbnkgaW1wbGVtZW50ZXJzIG9mIHRoZSBhcmNoaXZlIHN0cmF0ZWd5IGNhbiBzdWJjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFyY2hpdmVTdHJhdGVneUltcGwgaW1wbGVtZW50cyBBcmNoaXZlU3RyYXRlZ3kgewotCXByb3RlY3RlZCBBcmNoaXZlIGFyY2hpdmU7Ci0KLQkvKioKLQkgKiBBcmNoaXZlU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZSBnZXRBcmNoaXZlKCkgewotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlhcmNoaXZlID0gbmV3QXJjaGl2ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Db25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Db25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYjJlYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQ29ubmVjdG9yRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotCi0vKioKLSAqIEltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIHNhdmUgYW4gYXJjaGl2ZXMgY29udGVudHMgdG8gYSBkaXJlY3Rvcnkgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgU2F2ZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIFNhdmVTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBkaXJlY3RvcnlOYW1lOwotCXByb3RlY3RlZCBVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyOwotCS8qKiBJbmRpY2F0ZXMgd2hpY2ggdHlwZSBvZiBhcmNoaXZlcyBzaG91bGQgYmUgZXhwYW5kZWQgKi8KLQlwcm90ZWN0ZWQgaW50IGV4cGFuc2lvbkZsYWdzOwotCi0JLyoqCi0JICogRGlyZWN0b3J5RHVtcFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRGlyZWN0b3J5RHVtcFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwoU3RyaW5nIGRpck5hbWUsIGludCBmbGFncykgewotCQlzdXBlcigpOwotCQlzZXREaXJlY3RvcnlOYW1lKGRpck5hbWUpOwotCQlzZXRFeHBhbnNpb25GbGFncyhmbGFncyk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWREaXJlY3RvcnlTdHJhdGVneShBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlTdHJpbmcgdXJpID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbC5nZXRPU1VyaShnZXREaXJlY3RvcnlOYW1lKCksICIiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgQ29ubmVjdG9yRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbCh1cmksIGdldEV4cGFuc2lvbkZsYWdzKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZU5lc3RlZFNhdmVTdHJhdGVneShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHNob3VsZEV4cGFuZChhbkFyY2hpdmUpKQotCQkJcmV0dXJuIGNyZWF0ZU5lc3RlZERpcmVjdG9yeVN0cmF0ZWd5KGFuQXJjaGl2ZSk7Ci0JCXJldHVybiBjcmVhdGVOZXN0ZWRaaXBTdHJhdGVneShhbkFyY2hpdmUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZU5lc3RlZFppcFN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0VXJpQ29udmVydGVyKCkuY3JlYXRlT3V0cHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkoYW5BcmNoaXZlLmdldFVSSSgpKSk7Ci0JCXJldHVybiBuZXcgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbChvdXQpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzE1LzAwIDI6MjY6MzcgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlyZWN0b3J5TmFtZSgpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeU5hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMTA6MTg6MjEgQU0pCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4cGFuc2lvbkZsYWdzKCkgewotCQlyZXR1cm4gZXhwYW5zaW9uRmxhZ3M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Gb3JSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShhUmVzb3VyY2UuZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA4LzAwIDQ6NTA6MzIgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIgZ2V0VXJpQ29udmVydGVyKCkgewotCQlyZXR1cm4gdXJpQ29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCUFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsIGNvbnZlcnRlciA9IG5ldyBBcmNoaXZlVVJJQ29udmVydGVySW1wbChnZXRBcmNoaXZlKCksIGdldERpcmVjdG9yeU5hbWUoKSk7Ci0JCWNvbnZlcnRlci5zZXRPdXRwdXRGaWxlcGF0aChnZXREaXJlY3RvcnlOYW1lKCkpOwotCQlzZXRVcmlDb252ZXJ0ZXIoY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1rZGlycyhTdHJpbmcgZGlyZWN0b3J5UGF0aCkgewotCQlGaWxlIGFEaXJlY3RvcnkgPSBuZXcgRmlsZShnZXREaXJlY3RvcnlOYW1lKCkgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBkaXJlY3RvcnlQYXRoKTsKLQkJYURpcmVjdG9yeS5ta2RpcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdCBhTWFuaWZlc3QpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0VXJpQ29udmVydGVyKCkuY3JlYXRlT3V0cHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKTsKLQkJCWFNYW5pZmVzdC53cml0ZShvdXQpOwotCQkJb3V0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJLCBpb3gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSBhRmlsZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBlbnRyeU5hbWUgPSBhRmlsZS5nZXRVUkkoKTsKLQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5RW50cnkoKSkKLQkJCW1rZGlycyhlbnRyeU5hbWUpOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJT3V0cHV0U3RyZWFtIG91dCA9IGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKGVudHJ5TmFtZSkpOwotCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuY29weShpbiwgb3V0KTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihhRmlsZS5nZXRVUkkoKSwgaW94KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVNb2ZSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UgYVJlc291cmNlLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNhdmVNb2ZSZXNvdXJjZShhUmVzb3VyY2UsIG9zKTsKLQkJb3MuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8xNS8wMCAyOjI2OjM3IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdEaXJlY3RvcnlOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5TmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld0RpcmVjdG9yeU5hbWUpIHsKLQkJZGlyZWN0b3J5TmFtZSA9IG5ld0RpcmVjdG9yeU5hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMTA6MTg6MjEgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4cGFuc2lvbkZsYWdzCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbnNpb25GbGFncyhpbnQgbmV3RXhwYW5zaW9uRmxhZ3MpIHsKLQkJZXhwYW5zaW9uRmxhZ3MgPSBuZXdFeHBhbnNpb25GbGFnczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wOC8wMCA0OjUwOjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdVcmlDb252ZXJ0ZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmlDb252ZXJ0ZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlciBuZXdVcmlDb252ZXJ0ZXIpIHsKLQkJdXJpQ29udmVydGVyID0gbmV3VXJpQ29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEV4cGFuZChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCi0JCWludCBmbGFnID0gMDsKLQotCQlpZiAoYW5BcmNoaXZlLmlzV0FSRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX1dBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzRUFSRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX0VBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzRUpCSmFyRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX0VKQkpBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzUkFSRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX1JBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfQVBQQ0xJRU5UX0ZJTEVTOwotCQllbHNlCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfQVJDSElWRVM7Ci0KLQkJcmV0dXJuIChnZXRFeHBhbnNpb25GbGFncygpICYgZmxhZykgIT0gMDsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1NDljMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi0vKioKLSAqIFNwZWNpYWxpemVkIGxvYWQgc3RyYXRlZ3kgdGhhdCByZWFkcyBlbnRyaWVzIGluIGFuIGFyY2hpdmUgZnJvbSBhIGRpcmVjdG9yeSBvbiB0aGUgZmlsZSBzeXN0ZW0KLSAqLwotcHVibGljIGludGVyZmFjZSBEaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5IGV4dGVuZHMgTG9hZFN0cmF0ZWd5IHsKLQlwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeVVyaSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlODY2ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlnUmVnaXN0ZXI7Ci0KLQotLyoqCi0gKiBMb2FkIHN0cmF0ZWd5IHVzZWQgZm9yIHJlYWRpbmcgZXhwYW5kaW5nIGFyY2hpdmVzOyB0eXBpY2FsbHkgaW4gYSBydW5uaW5nIHNlcnZlciB0aGlzIHdvdWxkIGJlIGFuCi0gKiBFQVIgb3IgV0FSLCBhbHRob3VnaCBpdCBjYW4gYmUgYW55IEFyY2hpdmUKLSAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgRGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbCB7Ci0KLQotCi0JcHVibGljIERpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsKFN0cmluZyBhRGlyZWN0b3J5VXJpKSB7Ci0JCXN1cGVyKGFEaXJlY3RvcnlVcmkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERpcmVjdG9yeShqYXZhLmlvLkZpbGUgYUZpbGUsIGphdmEudXRpbC5MaXN0IGFMaXN0KSB7Ci0JCWFkZEZpbGVzKGFGaWxlLCBhTGlzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIGphdmEuaW8uRmlsZSBnZXREaXJlY3RvcnlGb3JMaXN0KCkgewotCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShnZXREaXJlY3RvcnlVcmkoKSk7Ci0JfQotCi0KLQotCXB1YmxpYyBMb29zZUFyY2hpdmUgZ2V0TG9vc2VBcmNoaXZlKCkgewotCQlpZiAobG9vc2VBcmNoaXZlID09IG51bGwgJiYgZ2V0Q29udGFpbmVyKCkuaXNFQVJGaWxlKCkpIHsKLQkJCVN0cmluZyBvc1N0cmluZyA9IEFyY2hpdmVVdGlsLmdldE9TVXJpKGdldENvbnRhaW5lcigpLmdldFVSSSgpKTsKLQkJCXNldExvb3NlQXJjaGl2ZShMb29zZUNvbmZpZ1JlZ2lzdGVyLnNpbmdsZXRvbigpLmZpbmRMb29zZUFwcGxpY2F0aW9uKG9zU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIGxvb3NlQXJjaGl2ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyMzk2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byByZWFkIGZpbGVzIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIGFuZCB0cmVhdCB0aGVtIGFzIGZpbGUKLSAqIGVudHJpZXMgaW4gYW4gYXJjaGl2ZQotICogCi0gKiBAc2VlIERpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3kKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBMb2FkU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneSB7Ci0JLyoqCi0JICogVGhlIHJvb3QgdXJpIGZyb20gd2hpY2ggYWxsIHJlbGF0aXZlIGZpbGVzIGVudHJpZXMgYXJlIGxvYWRlZDsgbXVzdCBwb2ludCB0byBhIHZhbGlkIGxvY2FsCi0JICogZGlyZWN0b3J5Ci0JICovCi0Jc3RhdGljIGJvb2xlYW4gSVNfQUlYID0gIkFJWCIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJvdGVjdGVkIFN0cmluZyBkaXJlY3RvcnlVcmk7Ci0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5OyB0aGUgZGlyZWN0b3J5IHVyaSB3aXRoIHRoZSBzeXN0ZW0gZGVwZW5kZW50IGZpbGUgc2VwYXJhdG9yIHJlcGxhY2VkIGJ5IGEKLQkgKiBmb3J3YXJkIHNsYXNoCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkaXJlY3RvcnlVcmlBc1ppcFN0cmluZzsKLQlwcm90ZWN0ZWQgc3RhdGljIGNoYXIgU0VQQVJBVE9SX0NIQVIgPSBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQotCXB1YmxpYyBEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsKFN0cmluZyBhRGlyZWN0b3J5VXJpKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERpcmVjdG9yeVVyaShhRGlyZWN0b3J5VXJpKTsKLQkJU3RyaW5nIG5vcm1hbGl6ZWQgPSBudWxsOwotCQl0cnkgewotCQkJbm9ybWFsaXplZCA9IG5ldyBGaWxlKGFEaXJlY3RvcnlVcmkpLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQlub3JtYWxpemVkID0gYURpcmVjdG9yeVVyaTsKLQkJfQotCQlzZXREaXJlY3RvcnlVcmlBc1ppcFN0cmluZyhub3JtYWxpemVkLnJlcGxhY2UoU0VQQVJBVE9SX0NIQVIsICcvJykpOwotCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkRGlyZWN0b3J5KGphdmEuaW8uRmlsZSBhRmlsZSwgTGlzdCBhTGlzdCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWxlKGphdmEuaW8uRmlsZSBhRmlsZSwgTGlzdCBhTGlzdCkgewotCi0JCVN0cmluZyB1cmkgPSBnZXRVUklGcm9tKGFGaWxlKTsKLQkJaWYgKGNvbGxlY3RlZExvb3NlQXJjaGl2ZUZpbGVzLmNvbnRhaW5zS2V5KHVyaSkpCi0JCQlyZXR1cm47Ci0KLQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSBjRmlsZSA9IGNyZWF0ZUZpbGUodXJpKTsKLQkJY0ZpbGUuc2V0U2l6ZShhRmlsZS5sZW5ndGgoKSk7Ci0JCWNGaWxlLnNldExhc3RNb2RpZmllZChhRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0JCWFMaXN0LmFkZChjRmlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmlsZXMoamF2YS5pby5GaWxlIGFEaXJlY3RvcnksIExpc3QgYUxpc3QpIHsKLQotCQlTdHJpbmdbXSBmaWxlTmFtZXMgPSBhRGlyZWN0b3J5Lmxpc3QoKTsKLQkJaWYgKGZpbGVOYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gQXJjaGl2ZVV0aWwuY29uY2F0VXJpKGFEaXJlY3RvcnkuZ2V0UGF0aCgpLCBmaWxlTmFtZXNbaV0sIFNFUEFSQVRPUl9DSEFSKTsKLQkJCWlmIChmaWxlTmFtZXNbaV0gPT0gbnVsbCB8fCAoSVNfQUlYICYmICIuYmFja3VwIi5lcXVhbHMoZmlsZU5hbWVzW2ldKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoZmlsZU5hbWUpOwotCQkJaWYgKCFhRmlsZS5leGlzdHMoKSkKLQkJCQljb250aW51ZTsKLQkJCS8vVGhpcyBjb3VsZCBvY2N1ciBvbiBzb21lIHdpbmRvd3MgbWFjaGluZXMsIGVnIEM6XHBhZ2VmaWxlLnN5cwotCQkJLy90aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igc2Nhbm5pbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSIpOwotCQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkgJiYgIWlzQXJjaGl2ZShnZXRVUklGcm9tKGFGaWxlKSkpIHsKLQkJCQlhZGREaXJlY3RvcnkoYUZpbGUsIGFMaXN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWRkRmlsZShhRmlsZSwgYUxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShnZXRGaWxlTmFtZUZyb20odXJpKSkuZXhpc3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgamF2YS5pby5GaWxlKGdldERpcmVjdG9yeVVyaSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS5pby5GaWxlIGdldERpcmVjdG9yeUZvckxpc3QoKTsKLQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpcmVjdG9yeVVyaSgpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeVVyaTsKLQl9Ci0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaXJlY3RvcnlVcmlBc1ppcFN0cmluZygpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeVVyaUFzWmlwU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gT1MgZmlsZW5hbWUgZnJvbSBhIHJlbGF0aXZlIHVyaQotCSAqLwotCS8vIFRPRE8gRml4IHRoZSB0eXBlIGNhc2luZyBpbiB2Ni4wCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlTmFtZUZyb20oU3RyaW5nIHVyaSkgewotCQlMb29zZUFyY2hpdmUgYUxvb3NlQXJjaGl2ZSA9IGdldExvb3NlQXJjaGl2ZSgpOwotCQlpZiAoYUxvb3NlQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCXN3aXRjaCAoYUxvb3NlQXJjaGl2ZS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OIDoKLQkJCQkJcmVzdWx0ID0gZ2V0VVJJRnJvbUxvb3NlQXJjaGl2ZXNJZkF2YWlsYWJsZSgoKExvb3NlQXBwbGljYXRpb24pIGFMb29zZUFyY2hpdmUpLmdldExvb3NlQXJjaGl2ZXMoKSwgdXJpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEUgOgotCQkJCQlyZXN1bHQgPSBnZXRVUklGcm9tTG9vc2VBcmNoaXZlc0lmQXZhaWxhYmxlKCgoTG9vc2VXQVJGaWxlKSBhTG9vc2VBcmNoaXZlKS5nZXRMb29zZUxpYnMoKSwgdXJpKTsKLQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCVN0cmluZyBuYW1lID0gdXJpOwotCQlpZiAoU0VQQVJBVE9SX0NIQVIgIT0gJy8nKQotCQkJbmFtZSA9IG5hbWUucmVwbGFjZSgnLycsIFNFUEFSQVRPUl9DSEFSKTsKLQkJcmV0dXJuIGdldERpcmVjdG9yeVVyaSgpICsgU0VQQVJBVE9SX0NIQVIgKyBuYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVSSUZyb21Mb29zZUFyY2hpdmVzSWZBdmFpbGFibGUoTGlzdCBsb29zZUFyY2hpdmVzLCBTdHJpbmcgdXJpKSB7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbG9vc2VBcmNoaXZlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUxvb3NlQXJjaGl2ZSBsb29zZUFyY2hpdmVFbGVtZW50ID0gKExvb3NlQXJjaGl2ZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAodXJpLmVxdWFscyhsb29zZUFyY2hpdmVFbGVtZW50LmdldFVyaSgpKSkKLQkJCQlyZXR1cm4gbG9vc2VBcmNoaXZlRWxlbWVudC5nZXRCaW5hcmllc1BhdGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEZpbGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWphdmEuaW8uRmlsZSBkaXJlY3RvcnkgPSBnZXREaXJlY3RvcnlGb3JMaXN0KCk7Ci0JCWFkZEZpbGVzKGRpcmVjdG9yeSwgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXMoU3RyaW5nIHN1YmZvbGRlclBhdGgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlqYXZhLmlvLkZpbGUgY29udGFpbmVyRGlyZWN0b3J5ID0gZ2V0RGlyZWN0b3J5Rm9yTGlzdCgpOwotCQlqYXZhLmlvLkZpbGUgc3ViZm9sZGVyID0gbmV3IGphdmEuaW8uRmlsZShjb250YWluZXJEaXJlY3RvcnksIHN1YmZvbGRlclBhdGgpOwotCQlhZGRGaWxlcyhzdWJmb2xkZXIsIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RmlsZU5hbWVGcm9tKHVyaSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSByZWxhdGl2ZSB1cmkgZnJvbSB0aGUgamF2YS5pby5GaWxlLCB0byBiZSB1c2VkIGZvciBhIGZpbGUgZW50cnk7IHRoZSBzZXBhcmF0b3Igd2lsbAotCSAqIGJlIHRoZSB6aXAgc3RhbmRhcmQgKGZvcndhcmQgc2xhc2ggKCIvIikpLgotCSAqLwotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVUklGcm9tKEZpbGUgYUZpbGUpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVsYXRpdmUgPSBudWxsOwotCQlTdHJpbmcgcm9vdCA9IGdldERpcmVjdG9yeVVyaUFzWmlwU3RyaW5nKCk7Ci0JCXRyeSB7Ci0JCQluYW1lID0gYUZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJcmVsYXRpdmUgPSBtYWtlUmVsYXRpdmUobmFtZSwgcm9vdCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJbmFtZSA9IG51bGw7Ci0JCX0KLQkJaWYgKHJlbGF0aXZlID09IG51bGwpIHsKLQkJCW5hbWUgPSBhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCXJlbGF0aXZlID0gbWFrZVJlbGF0aXZlKG5hbWUsIHJvb3QpOwotCQl9Ci0JCWlmIChyZWxhdGl2ZSA9PSBudWxsKSB7Ci0JCQluYW1lID0gYUZpbGUuZ2V0UGF0aCgpOwotCQkJcm9vdCA9IHJlcGxhY2VTZXBhcmF0b3JzKGdldERpcmVjdG9yeVVyaSgpKTsKLQkJCXJlbGF0aXZlID0gbWFrZVJlbGF0aXZlKG5hbWUsIHJvb3QpOwotCQl9Ci0JCXJldHVybiByZWxhdGl2ZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZXBsYWNlU2VwYXJhdG9ycyhTdHJpbmcgcGF0aCkgewotCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykKLQkJCXJldHVybiBwYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBtYWtlUmVsYXRpdmUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgcm9vdCkKLQl7Ci0JICAgIGlmICggKGZpbGVOYW1lID09IG51bGwpIHx8IChyb290ID09IG51bGwpICkKLQkgICAgICAgIHJldHVybiBudWxsOwotCi0JICAgIGludCBvZmZzZXQgPSByb290Lmxlbmd0aCgpOwotCi0JICAgIHdoaWxlICggKG9mZnNldCA+IDApICYmIHJvb3QuY2hhckF0KG9mZnNldCAtIDEpID09ICcvJyApCi0JICAgICAgICBvZmZzZXQtLTsKLQotCSAgICBpZiAoIG9mZnNldCA8IHJvb3QubGVuZ3RoKCkgKSB7Ci0JICAgICAgICBvZmZzZXQrKzsKLQotCSAgICAgICAgaWYgKCBvZmZzZXQgPCByb290Lmxlbmd0aCgpICkKLQkgICAgICAgICAgICByb290ID0gcm9vdC5zdWJzdHJpbmcoMCwgb2Zmc2V0KTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIHJvb3QgKz0gJy8nOwotCSAgICB9Ci0KLQkgICAgU3RyaW5nIG5hbWUgPSByZXBsYWNlU2VwYXJhdG9ycyhmaWxlTmFtZSk7Ci0KLQkgICAgaWYgKCBuYW1lLnN0YXJ0c1dpdGgocm9vdCkgKQotCSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKCByb290Lmxlbmd0aCgpICk7Ci0JICAgIGVsc2UKLQkgICAgICAgIG5hbWUgPSBudWxsOwotCi0JICAgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNpbmcoamF2YS5pby5GaWxlIGFTeXN0ZW1GaWxlKSB7Ci0JCWphdmEuaW8uRmlsZSBkaXIgPSBuZXcgamF2YS5pby5GaWxlKGdldERpcmVjdG9yeVVyaSgpKTsKLQkJcmV0dXJuIGRpci5lcXVhbHMoYVN5c3RlbUZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpcmVjdG9yeVVyaShqYXZhLmxhbmcuU3RyaW5nIG5ld0RpcmVjdG9yeVVyaSkgewotCQlkaXJlY3RvcnlVcmkgPSBuZXdEaXJlY3RvcnlVcmk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VXJpQXNaaXBTdHJpbmcoamF2YS5sYW5nLlN0cmluZyBuZXdEaXJlY3RvcnlVcmlBc1ppcFN0cmluZykgewotCQlkaXJlY3RvcnlVcmlBc1ppcFN0cmluZyA9IG5ld0RpcmVjdG9yeVVyaUFzWmlwU3RyaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwNGY1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBzYXZlIGFuIGFyY2hpdmVzIGNvbnRlbnRzIHRvIGEgZGlyZWN0b3J5IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbQotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIFNhdmVTdHJhdGVneUltcGwgaW1wbGVtZW50cyBTYXZlU3RyYXRlZ3kgewotCXByb3RlY3RlZCBTdHJpbmcgZGlyZWN0b3J5TmFtZTsKLQlwcm90ZWN0ZWQgVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlcjsKLQkvKiogSW5kaWNhdGVzIHdoaWNoIHR5cGUgb2YgYXJjaGl2ZXMgc2hvdWxkIGJlIGV4cGFuZGVkICovCi0JcHJvdGVjdGVkIGludCBleHBhbnNpb25GbGFnczsKLQotCS8qKgotCSAqIERpcmVjdG9yeUR1bXBTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpcmVjdG9yeUR1bXBTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKFN0cmluZyBkaXJOYW1lLCBpbnQgZmxhZ3MpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGlyZWN0b3J5TmFtZShkaXJOYW1lKTsKLQkJc2V0RXhwYW5zaW9uRmxhZ3MoZmxhZ3MpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkRGlyZWN0b3J5U3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJU3RyaW5nIHVyaSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoZ2V0RGlyZWN0b3J5TmFtZSgpLCBhbkFyY2hpdmUuZ2V0VVJJKCkpOwotCQlyZXR1cm4gbmV3IERpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwodXJpLCBnZXRFeHBhbnNpb25GbGFncygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWRTYXZlU3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzaG91bGRFeHBhbmQoYW5BcmNoaXZlKSkKLQkJCXJldHVybiBjcmVhdGVOZXN0ZWREaXJlY3RvcnlTdHJhdGVneShhbkFyY2hpdmUpOwotCQlyZXR1cm4gY3JlYXRlTmVzdGVkWmlwU3RyYXRlZ3koYW5BcmNoaXZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWRaaXBTdHJhdGVneShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKGFuQXJjaGl2ZS5nZXRVUkkoKSkpOwotCQlyZXR1cm4gbmV3IFppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwob3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8xNS8wMCAyOjI2OjM3IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpcmVjdG9yeU5hbWUoKSB7Ci0JCXJldHVybiBkaXJlY3RvcnlOYW1lOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDEwOjE4OjIxIEFNKQotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFeHBhbnNpb25GbGFncygpIHsKLQkJcmV0dXJuIGV4cGFuc2lvbkZsYWdzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtRm9yUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRVcmlDb252ZXJ0ZXIoKS5jcmVhdGVPdXRwdXRTdHJlYW0oYVJlc291cmNlLmdldFVSSSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wOC8wMCA0OjUwOjMyIFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyIGdldFVyaUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHVyaUNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlBcmNoaXZlVVJJQ29udmVydGVySW1wbCBjb252ZXJ0ZXIgPSBuZXcgQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwoZ2V0QXJjaGl2ZSgpLCBnZXREaXJlY3RvcnlOYW1lKCkpOwotCQljb252ZXJ0ZXIuc2V0T3V0cHV0RmlsZXBhdGgoZ2V0RGlyZWN0b3J5TmFtZSgpKTsKLQkJc2V0VXJpQ29udmVydGVyKGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBta2RpcnMoU3RyaW5nIGRpcmVjdG9yeVBhdGgpIHsKLQkJRmlsZSBhRGlyZWN0b3J5ID0gbmV3IEZpbGUoZ2V0RGlyZWN0b3J5TmFtZSgpICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgZGlyZWN0b3J5UGF0aCk7Ci0JCWFEaXJlY3RvcnkubWtkaXJzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QgYU1hbmlmZXN0KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtIG91dCA9IGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7Ci0JCQlhTWFuaWZlc3Qud3JpdGUob3V0KTsKLQkJCW91dC5jbG9zZSgpOwotCQkJaWYgKGdldEFyY2hpdmUoKS5nZXRPcHRpb25zKCkuaXNSZWFkT25seSgpKQotCQkJCXNldFRpbWVzdGFtcEFmdGVyU2F2aW5nKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkksIGlveCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlIGFGaWxlLCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVudHJ5TmFtZSA9IGFGaWxlLmdldFVSSSgpOwotCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnlFbnRyeSgpKQotCQkJbWtkaXJzKGVudHJ5TmFtZSk7Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0VXJpQ29udmVydGVyKCkuY3JlYXRlT3V0cHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkoZW50cnlOYW1lKSk7Ci0JCQkJQXJjaGl2ZVV0aWwuY29weShpbiwgb3V0KTsKLQkJCQlzZXRUaW1lc3RhbXBBZnRlclNhdmluZyhhRmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYUZpbGUuZ2V0VVJJKCksIGlveCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9mUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIGFSZXNvdXJjZSwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5zYXZlTW9mUmVzb3VyY2UoYVJlc291cmNlLCBvcyk7Ci0JCW9zLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMTUvMDAgMjoyNjozNyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RGlyZWN0b3J5TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcmVjdG9yeU5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdEaXJlY3RvcnlOYW1lKSB7Ci0JCWRpcmVjdG9yeU5hbWUgPSBuZXdEaXJlY3RvcnlOYW1lOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDEwOjE4OjIxIEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHBhbnNpb25GbGFncwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5zaW9uRmxhZ3MoaW50IG5ld0V4cGFuc2lvbkZsYWdzKSB7Ci0JCWV4cGFuc2lvbkZsYWdzID0gbmV3RXhwYW5zaW9uRmxhZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGltZXN0YW1wQWZ0ZXJTYXZpbmcob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSBhRmlsZSkgewotCQlsb25nIGxhc3RNb2QgPSBhRmlsZS5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJaWYgKGxhc3RNb2QgPT0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGFic1BhdGggPSBBcmNoaXZlVXRpbC5nZXRPU1VyaShnZXREaXJlY3RvcnlOYW1lKCksIGFGaWxlLmdldFVSSSgpKTsKLQkJRmlsZSBpb0ZpbGUgPSBuZXcgRmlsZShhYnNQYXRoKTsKLQkJaW9GaWxlLnNldExhc3RNb2RpZmllZChsYXN0TW9kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUaW1lc3RhbXBBZnRlclNhdmluZyhTdHJpbmcgdXJpKSB7Ci0JCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUgYUZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJYUZpbGUgPSBnZXRBcmNoaXZlKCkuZ2V0RmlsZSh1cmkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gbXVzdEJlQU5ld0VudHJ5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0VGltZXN0YW1wQWZ0ZXJTYXZpbmcoYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA4LzAwIDQ6NTA6MzIgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1VyaUNvbnZlcnRlcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaUNvbnZlcnRlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyIG5ld1VyaUNvbnZlcnRlcikgewotCQl1cmlDb252ZXJ0ZXIgPSBuZXdVcmlDb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRXhwYW5kKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0KLQkJaW50IGZsYWcgPSAwOwotCi0JCWlmIChhbkFyY2hpdmUuaXNXQVJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfV0FSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNFQVJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfRUFSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNSQVJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfUkFSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNFSkJKYXJGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfRUpCSkFSX0ZJTEVTOwotCQllbHNlIGlmIChhbkFyY2hpdmUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9BUFBDTElFTlRfRklMRVM7Ci0JCWVsc2UKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9BUkNISVZFUzsKLQotCQlyZXR1cm4gKGdldEV4cGFuc2lvbkZsYWdzKCkgJiBmbGFnKSAhPSAwOwotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSXRlcmF0ZU92ZXIoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIHN1cGVyLnNob3VsZEl0ZXJhdGVPdmVyKGFuQXJjaGl2ZSkgfHwgc2hvdWxkRXhwYW5kKGFuQXJjaGl2ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWFyMTJFeHBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VhcjEyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDJkMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWFyMTJFeHBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBleHBvcnQgbWV0YS1kYXRhIGZvciBhIDEuMiBBcHBsaWNhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWFyMTJFeHBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBFeHBvcnRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIEVhcjEyRXhwb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRWFyMTJFeHBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWFyMTJJbXBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VhcjEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MWQ1NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWFyMTJJbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gaW1wb3J0IG1ldGEtZGF0YSBmb3IgYSAxLjIgQXBwbGljYXRpb24gQ2xpZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBFYXIxMkltcG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIFhtbEJhc2VkSW1wb3J0U3RyYXRlZ3lJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGlzY3JpbWluYXRvciBleHRlbmRzIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgewotCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewotCQkJcmV0dXJuIGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCQlyZXR1cm4gYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCQkgKi8KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJCXJldHVybiBuZXcgRWFyMTJJbXBvcnRTdHJhdGVneUltcGwoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5hYmxlVG9PcGVuTWVzc2FnZSgpIHsKLQkJCXJldHVybiBnZXRYbWxERE1lc3NhZ2UoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5FQVJfRmlsZSwgSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpOyAvLyA9ICJFQVIgRmlsZSIKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRGlzY3JpbWluYXRvciBkaXNjcmltaW5hdG9yOwotCi0JLyoqCi0JICogRWFyMTJJbXBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFYXIxMkltcG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvcigpLmNyZWF0ZUltcG9ydFN0cmF0ZWd5KG9sZCwgbmV3QXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3IgPT0gbnVsbCkgewotCQkJZGlzY3JpbWluYXRvciA9IG5ldyBEaXNjcmltaW5hdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3I7Ci0JfQotCi0JcHVibGljIEVBUkZpbGUgZ2V0RUFSRmlsZSgpIHsKLQkJcmV0dXJuIChFQVJGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0TWV0YURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFwcGxpY2F0aW9uIGFwcGwgPSBudWxsOwotCi0JCWFwcGwgPSAoQXBwbGljYXRpb24pIHByaW1Mb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQlnZXRFQVJGaWxlKCkuc2V0RGVwbG95bWVudERlc2NyaXB0b3IoYXBwbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWpiSmFyMTFFeHBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VqYkphcjExRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTQ0Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWpiSmFyMTFFeHBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBleHBvcnQgbWV0YS1kYXRhIGZvciBhIDEuMSBFamIgSmFyCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJKYXIxMUV4cG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIEV4cG9ydFN0cmF0ZWd5SW1wbCB7Ci0JLyoqCi0JICogRWpiSmFyMTFFeHBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFamJKYXIxMUV4cG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhMjZjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGltcG9ydCBtZXRhLWRhdGEgZm9yIGEgMS4xIEVqYiBKYXIKLSAqLwotcHVibGljIGNsYXNzIEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQkJcmV0dXJuIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQkJcmV0dXJuIG5ldyBFamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQkJcmV0dXJuIGdldFhtbERETWVzc2FnZShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkVKQl9KYXJfRmlsZSwgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKTsgLy8gPSAiRUpCIEphciBGaWxlIgotCQl9Ci0KLQkJcHVibGljIEFyY2hpdmUgY3JlYXRlQ29udmVydGVkQXJjaGl2ZSgpIHsKLQkJCXJldHVybiBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQkphckZpbGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRGlzY3JpbWluYXRvciBkaXNjcmltaW5hdG9yOwotCi0JLyoqCi0JICogRWpiSmFyMTFJbXBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvcigpLmNyZWF0ZUltcG9ydFN0cmF0ZWd5KG9sZCwgbmV3QXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3IgPT0gbnVsbCkgewotCQkJZGlzY3JpbWluYXRvciA9IG5ldyBEaXNjcmltaW5hdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3I7Ci0JfQotCi0JcHVibGljIEVKQkphckZpbGUgZ2V0RUpCSmFyRmlsZSgpIHsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0TWV0YURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVKQkphciBlamJKYXIgPSBudWxsOwotCi0JCWVqYkphciA9IChFSkJKYXIpIHByaW1Mb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJZ2V0RUpCSmFyRmlsZSgpLnNldERlcGxveW1lbnREZXNjcmlwdG9yKGVqYkphcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FeHBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4NzVlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FeHBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkV4cG9ydFN0cmF0ZWd5OwotCi0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50ZXIgb2ZmIHdoaWNoIG90aGVyIGV4cG9ydCBzdHJhdGVnaWVzIGNhbiBzdWJjbGFzcwotICogCi0gKiBAc2VlIEV4cG9ydFN0cmF0ZWd5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBBcmNoaXZlU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgRXhwb3J0U3RyYXRlZ3kgewotCS8qKiBUaGUgbGlzdCBvZiBmaWxlcyBhbHJlYWR5IHNhdmVkIGJ5IHRoaXMgc3RyYXRlZ3kgZHVyaW5nIGludm9rYXRpb24gb2YgcHJlU2F2ZSgpICovCi0JcHJvdGVjdGVkIFNldCBzYXZlZEZpbGVzOwotCi0JcHVibGljIEV4cG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLlNldCBnZXRTYXZlZEZpbGVzKCkgewotCQlpZiAoc2F2ZWRGaWxlcyA9PSBudWxsKQotCQkJc2F2ZWRGaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXJldHVybiBzYXZlZEZpbGVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NhdmVkKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIHNhdmVkRmlsZXMgIT0gbnVsbCAmJiBnZXRTYXZlZEZpbGVzKCkuY29udGFpbnModXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nOyBzdWJjbGFzc2VzIG1heSB3aXNoIHRvIG92ZXJyaWRlOyB0eXBpY2FsIG9wZXJhdGlvbnMgd291bGQgYmUgdG8KLQkgKiBhZGQgZXh0cmEgZWxlbWVudHMgdG8gdGhlIG91dGdvaW5nIGFyY2hpdmUsIHVzaW5nIFNhdmVTdHJhdGVneSNzYXZlKEZpbGUsCi0JICogamF2YS5pby5JbnB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVTYXZlKFNhdmVTdHJhdGVneSBhU2F2ZVN0cmF0ZWd5KSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogVGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gdXJpIGhhcyBqdXN0IGJlZW4gc2F2ZWQ7IGFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mIHNhdmVkIGZpbGVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZWQoU3RyaW5nIHVyaSkgewotCQlnZXRTYXZlZEZpbGVzKCkuYWRkKHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2F2ZWRGaWxlcyhqYXZhLnV0aWwuU2V0IG5ld1NhdmVkRmlsZXMpIHsKLQkJc2F2ZWRGaWxlcyA9IG5ld1NhdmVkRmlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvSW1wb3J0U3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0ltcG9ydFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDg1Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvSW1wb3J0U3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotCi0vKioKLSAqIEltcG9ydFN0cmF0ZWd5IGtub3dzIGhvdyB0byBpbnRlcnByZXQgdGhlIGluZm9ybWF0aW9uIGluIGFuIGFyY2hpdmUsIHVzdWFsbHkgaW4gZGVwbG95bWVudAotICogZGVzY3JpcHRvcnMsIHRvIGJ1aWxkIHVwIGEgbW9kZWwgb2YgdGhlIGNvbnRhaW5lZCBvYmplY3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEltcG9ydFN0cmF0ZWd5IGV4dGVuZHMgQXJjaGl2ZVN0cmF0ZWd5IHsKLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHVzZWQgZm9yIGNvcHlpbmcgYXJjaGl2ZXM7IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGtpbmQgb2Ygc3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBEbyB3aGF0ZXZlciBpcyBuZWNlc3NhcnkgdG8gYnJpbmcgaW4gbWV0YWRhdGEgZnJvbSB0aGUgYXJjaGl2ZSBhbmQgc2V0IHRoZSBkZXBsb3ltZW50Ci0JICogZGVzY3JpcHRvcnMgdG8gdGhlIHN0YW5kYXJkIGZvcm0gdGhhdCB0aGUgYXBpcyBjYW4gcmVjb2duaXplCi0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0TWV0YURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JcHVibGljIGJvb2xlYW4gaXNFSkIxMCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9JbXBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0NjE3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9JbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLQotCi0vKioKLSAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mZiB3aGljaCBvdGhlciBpbXBvcnQgc3RyYXRlZ2llcyBjYW4gc3ViY2xhc3MKLSAqIAotICogQHNlZSBJbXBvcnRTdHJhdGVneQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgQXJjaGl2ZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIEltcG9ydFN0cmF0ZWd5IHsKLQkvKioKLQkgKiBBcmNoaXZlSW1wb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFSkIxMCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0xvYWRTdHJhdGVneS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTG9hZFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODcyOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTG9hZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5GaWxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotCi0KLS8qKgotICogTG9hZFN0cmF0ZWd5IGtub3dzIGhvdyB0byBsb2FkIG9yIHJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgY29udGFpbmVyLiBUaGlzIHByb3ZpZGVzIGEgZGVsZWdhdGlvbgotICogbW9kZWwgZm9yIHJlYWRpbmcgaW4gdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgZmlsZS4gQ2xpZW50cyBjYW4gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBhbmQKLSAqICJwbHVnIGluIiB0byBhbiBpbnN0YW5jZSBvZiBhbiBhcmNoaXZlLiBFeGFtcGxlcyBtaWdodCBpbmNsdWRlIHJlYWRpbmcgZnJvbSBhIHppcCBmaWxlLCBmcm9tIGFuCi0gKiBpbnB1dCBzdHJlYW0sIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLCBvciBmcm9tIGEgd29ya2JlbmNoLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvYWRTdHJhdGVneSB7Ci0JcHVibGljIHZvaWQgYWRkT3JSZXBsYWNlTW9mUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKTsKLQotCS8qKgotCSAqIFJlbGVhc2UgYW55IHJlc291cmNlcyBiZWluZyBoZWxkIGJ5IHRoaXMgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKTsKLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc3RyYXRlZ3ksIGlmIGl0IGV4aXN0czsgY2FzZXMgd2hlcmUgaXQgbWlnaHQgbm90IGV4aXN0IGlzIGlmCi0JICogdGhlIGxvYWQgc3RyYXRlZ3kgaXMgInZpcnR1YWwiLCBlLmcuLCBhIGphciB3aXRoaW4gYSBqYXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJvb3QgZnJvbSB3aGljaCBtZXRhIHJlc291cmNlcyBnZXQgbG9hZGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXNQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcm9vdCBmcm9tIHdoaWNoIGNsYXNzZXMgYW5kIHByb3BlcnRpZXMgYXJlIGxvYWRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmluYXJpZXNQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCi0JcHVibGljIENvbnRhaW5lciBnZXRDb250YWluZXIoKTsKLQotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpOwotCi0JcHVibGljIFJlc291cmNlU2V0IHByaW1HZXRSZXNvdXJjZVNldCgpOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5OyBjbGllbnRzIHNob3VsZCBub3QgbmVlZCB0byBjYWxsCi0JICovCi0JcHVibGljIEZpbGVJdGVyYXRvciBnZXRGaWxlSXRlcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IGFuIGFyY2hpdmUgdG8gb2J0YWluIGEgbGlzdCBvZiBpdCdzIGZpbGVzLCB3aGljaCBpcyB1c3VhbGx5IGRlZmVycmVkIHVudGlsIHRoZSBmaXJzdAotCSAqIHRpbWUgaXQgaXMgaW52b2tlZCwgYXMgYW4gb3B0aW1pemF0aW9uLgotCSAqLwotCXB1YmxpYyBMaXN0IGNvbGxlY3RGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbnB1dCBzdHJlYW0gb24gYW4gZW50cnkgbmFtZWQgYnkgdGhlIHBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5wdXQgc3RyZWFtIG9uIGFuIGVudHJ5IG5hbWVkIGJ5IHRoZSBwYXJhbWV0ZXIsIGZyb20gdGhlICJyZXNvdXJjZXMgcGF0aCIgb2YgdGhlCi0JICogbG9vc2UgYXJjaGl2ZSBpZiBpdCBleGlzdHMsIE90aGVyd2lzZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0aGUgc2FtZSBhcwotCSAqIHtAbGluayAjZ2V0SW5wdXRTdHJlYW0oU3RyaW5nKX0KLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKTsKLQotCXB1YmxpYyBSZXNvdXJjZSBnZXRFeGlzdGluZ01vZlJlc291cmNlKFN0cmluZyB1cmkpOwotCi0JcHVibGljIFJlc291cmNlIGdldE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFuIGFyY2hpdmUgdXNlcyBhIGN1c3RvbSBjbGFzcyBsb2FkZXIgZm9yIGphdmEgcmVmbGVjdGlvbiB3aXRoaW4gYSBtb2YgcmVzb3VyY2VTZXQ7Ci0JICogaW1wbGVtZW50ZXJzIG9mIExvYWRTdHJhdGVneSBtYXkgc3VwcGx5IGEgbW9mIHJlc291cmNlU2V0IGZvciB3aGljaCB0aGlzIGNsYXNzIGxvYWRlciBpcyBub3QKLQkgKiBuZWNlc3NhcnksIG9yIGNvdWxkIGV2ZW4gY2F1c2UgYnJlYWthZ2U7IHRoaXMgdGVzdCBnaXZlcyB0aGUgc3RyYXRlZ3kgdGhlIGNoYW5jZSB0byAib3B0IG91dCIKLQkgKiBvZiB0aGUgY2xhc3MgbG9hZGluZyBnYW1lCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGFzc0xvYWRlck5lZWRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYXJjaGl2ZSBpcyByZWFkaW5nIGZpbGVzIGZyb20gYSBkaXJlY3Rvcnkgb24gdGhlIGZpbGUgc3lzdGVtCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzTW9mUmVzb3VyY2VMb2FkZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgcmVzb3VyY2VzIGNhbiBiZSByZWFkIGJ5IHRoaXMgc3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09wZW4oKTsKLQotCS8qKgotCSAqIElzIHRoZSBwYXJhbWV0ZXIgaW4gdXNlIGJ5IHRoaXMgc3RyYXRlZ3k/IE5lZWRlZCBmb3Igd2hlbiB0aGUgYXJjaGl2ZSBpcyBzYXZlZCB0byB0aGUgc2FtZQotCSAqIGxvY2F0aW9uIGZyb20gd2hpY2ggaXQgd2FzIHJlYWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzaW5nKGphdmEuaW8uRmlsZSBhU3lzdGVtRmlsZSk7Ci0KLQkvKioKLQkgKiBVc2VkIGZvciBvcHRpbWl6YXRpb25zLCB3aGVyZSB0aGUgY29udGVudHMgb2YgdGhlIGFyY2hpdmUgaGF2ZSBub3QgYmVlbiBjaGFuZ2VkOyBpbnN0ZWFkIG9mCi0JICogaXRlcmF0aW5nIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZSwgd2UgbWF5IGJlIGFibGUgdG8gYnVsayBzYXZlIHRoZSB3aG9sZSB0aGluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlcXVpcmVzSXRlcmF0aW9uT25TYXZlKCk7Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbWFrZU1vZlJlc291cmNlKFN0cmluZyB1cmksIEVMaXN0IGV4dGVudCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGFDb250YWluZXIpOwotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VTZXQoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KTsKLQotCXB1YmxpYyBMb29zZUFyY2hpdmUgZ2V0TG9vc2VBcmNoaXZlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb29zZUFyY2hpdmUoTG9vc2VBcmNoaXZlIGFMb29zZUFyY2hpdmUpOwotCQotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRGaWxlcyhTdHJpbmcgc3ViZm9sZGVyUGF0aCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpOwotCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSk7Ci0KLQlwdWJsaWMgaW50IGdldFJlbmRlcmVyVHlwZSgpOwotCi0JcHVibGljIHZvaWQgc2V0UmVuZGVyZXJUeXBlKGludCBpKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmIxOWRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0xvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrLkphdmFKREtBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdWNlRmFjdG9yeVNheFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlEb21SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWdSZWdpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci0KLS8qKgotICogQWJzdGFjdCBpbXBsZW1lbnRlciBvZmYgd2hpY2ggYW5kIGxvYWQgc3RyYXRlZ3kgbWF5IHN1YmNsYXNzCi0gKiAKLSAqIEBzZWUgTG9hZFN0cmF0ZWd5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBMb2FkU3RyYXRlZ3kgewotCi0JLyoqIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB1bmRlcmx5aW5nIHJlc291cmNlcyBoYXZlIGJlZW4gY2xvc2VkICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPcGVuID0gdHJ1ZTsKLQotCS8qKiBUaGUgYXJjaGl2ZSBvciBkaXJlY3RvcnkgdG8gd2hpY2ggdGhpcyBzdHJhdGVneSBiZWxvbmdzICovCi0JcHJvdGVjdGVkIENvbnRhaW5lciBjb250YWluZXI7Ci0KLQkvKiogUmVzb3VyY2VTZXQgdXNlZCBmb3IgbW9mL3htaSByZXNvdXJjZXMgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQlwcm90ZWN0ZWQgTG9vc2VBcmNoaXZlIGxvb3NlQXJjaGl2ZTsKLQotCXByb3RlY3RlZCBNYXAgY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkT25seSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBpbnQgcmVuZGVyZXJUeXBlOwotCi0JcHVibGljIExvYWRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgYWRkT3JSZXBsYWNlTW9mUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCVJlc291cmNlIGV4aXN0aW5nUmVzb3VyY2UgPSBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKGFSZXNvdXJjZS5nZXRVUkkoKSwgZmFsc2UpOwotCQlpZiAoZXhpc3RpbmdSZXNvdXJjZSAhPSBudWxsKQotCQkJZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoZXhpc3RpbmdSZXNvdXJjZSk7Ci0JCWdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTW9kaWZpY2F0aW9uVHJhY2tpbmcoUmVzb3VyY2UgcmVzKSB7Ci0JCWJvb2xlYW4gdHJhY2tpbmdNb2RzID0gcmVzLmlzVHJhY2tpbmdNb2RpZmljYXRpb24oKTsKLQkJYm9vbGVhbiBpc1JlYWRPbmx5ID0gKGNvbnRhaW5lciAhPSBudWxsKSA/ICgoQXJjaGl2ZSkgY29udGFpbmVyKS5nZXRPcHRpb25zKCkuaXNSZWFkT25seSgpIDogZmFsc2U7Ci0JCWJvb2xlYW4gc2hvdWxkVHJhY2tNb2RzID0gIShpc1JlYWRPbmx5IHx8IEFyY2hpdmVVdGlsLmlzSmF2YVJlc291cmNlKHJlcykgfHwgQXJjaGl2ZVV0aWwuaXNSZWdpc3RlcmVkVVJJTWFwcGluZyhyZXMpKTsKLQkJaWYgKHNob3VsZFRyYWNrTW9kcyAmJiAhdHJhY2tpbmdNb2RzKQotCQkJcmVzLnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgYW55IHJlc291cmNlcyBiZWluZyBoZWxkIGJ5IHRoaXMgb2JqZWN0IGFuZCBzZXQgdGhlIHN0YXRlIHRvIGNsb3NlZC4gU3ViY2xhc3NlcwotCSAqIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJc2V0SXNPcGVuKGZhbHNlKTsKLSAgICAgICAgaWYocmVzb3VyY2VTZXQgIT0gbnVsbCAmJiByZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5jb250YWlucyh0aGlzKSkKLSAgICAgICAgCXJlc291cmNlU2V0LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHByaW1Db250YWlucyhTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIEBzZWUgTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHVyaSkgewotCQlpZiAoY29udGFpbnNVc2luZ0xvb3NlQXJjaGl2ZSh1cmkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBwcmltQ29udGFpbnModXJpKTsKLQl9Ci0KLQkvKgotCSAqIFRyeSB0aGUgcmVzb3VyY2VzIHBhdGggZmlyc3Q7IGlmIHRoYXQgZmFsc2UsIHNlZSBpZiB3ZSBoYXZlIGEgY2hpbGQgbG9vc2UgYXJjaGl2ZSB3aXRoIHRoZQotCSAqIHVyaQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zVXNpbmdMb29zZUFyY2hpdmUoU3RyaW5nIHVyaSkgewotCQlpZiAoZ2V0TG9vc2VBcmNoaXZlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlMb29zZUFyY2hpdmUgbG9vc2UgPSBnZXRMb29zZUFyY2hpdmUoKTsKLQkJaWYgKGxvb3NlLmdldFJlc291cmNlc1BhdGgoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUobG9vc2UuZ2V0UmVzb3VyY2VzUGF0aCgpLCB1cmkpOwotCQlpZiAoYUZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gTG9vc2VDb25maWdSZWdpc3Rlci5zaW5nbGV0b24oKS5maW5kRmlyc3RMb29zZUNoaWxkKHVyaSwgbG9vc2UpICE9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgY3JlYXRlRGlyZWN0b3J5KFN0cmluZyB1cmkpewotCQlGaWxlIGFGaWxlID0gbnVsbDsKLQkJYUZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUZpbGUoKTsKLQkJYUZpbGUuc2V0RGlyZWN0b3J5RW50cnkodHJ1ZSk7Ci0JCWFGaWxlLnNldFVSSSh1cmkpOwotCQlhRmlsZS5zZXRPcmlnaW5hbFVSSSh1cmkpOwotCQlhRmlsZS5zZXRMb2FkaW5nQ29udGFpbmVyKGdldENvbnRhaW5lcigpKTsKLQkJcmV0dXJuIGFGaWxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmlsZSBjcmVhdGVGaWxlKFN0cmluZyB1cmkpIHsKLQkJRmlsZSBhRmlsZSA9IG51bGw7Ci0JCWlmIChpc0FyY2hpdmUodXJpKSkKLQkJCWFGaWxlID0gb3Blbk5lc3RlZEFyY2hpdmUodXJpKTsKLQkJaWYgKGFGaWxlID09IG51bGwpIHsKLQkJCWFGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVGaWxlKCk7Ci0JCQlhRmlsZS5zZXRVUkkodXJpKTsKLQkJCWFGaWxlLnNldE9yaWdpbmFsVVJJKHVyaSk7Ci0JCX0KLQkJYUZpbGUuc2V0TG9hZGluZ0NvbnRhaW5lcihnZXRDb250YWluZXIoKSk7Ci0JCXJldHVybiBhRmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQlpZihpc09wZW4pewotCQkJY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5BYnNvbHV0ZV9wYXRoX3Vua25vd25fRVhDXyk7IC8vID0gIkFic29sdXRlIHBhdGggdW5rbm93biIKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvb3NlQXJjaGl2ZSgpID09IG51bGwgPyBnZXRBYnNvbHV0ZVBhdGgoKSA6IGdldExvb3NlQXJjaGl2ZSgpLmdldFJlc291cmNlc1BhdGgoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW1HZXRSZXNvdXJjZXNQYXRoKCkgewotCQlyZXR1cm4gZ2V0TG9vc2VBcmNoaXZlKCkgPT0gbnVsbCA/IG51bGwgOiBnZXRMb29zZUFyY2hpdmUoKS5nZXRSZXNvdXJjZXNQYXRoKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCaW5hcmllc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvb3NlQXJjaGl2ZSgpID09IG51bGwgPyBnZXRBYnNvbHV0ZVBhdGgoKSA6IGdldExvb3NlQXJjaGl2ZSgpLmdldEJpbmFyaWVzUGF0aCgpOwotCX0KLQotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXQgcHJpbUdldFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogU2hvdWxkIHdlIGl0ZXJhdGUgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZSBhcyBwYXJ0IG9mIHNhdmluZywgb3IgY2FuIHdlIHRyZWF0IHRoZSBhcmNoaXZlCi0JICogYXMgb25lIGJpZyBmaWxlIGR1cmluZyBzYXZlPyBUaGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5LCBpdGVyYXRpbmcgdGhlIGZpbGVzIGlmOiAxKSBJZiB0aGUKLQkgKiBhcmNoaXZlIGlzIGEgbW9kdWxlIGZpbGUgYW5kIGl0IGlzIE5PVCByZWFkLW9ubHkgMikgSWYgdGhlIGxvYWQgc3RyYXRlZ3kgaXMgYSBkaXJlY3RvcnkgMykgSWYKLQkgKiB0aGUgYXJjaGl2ZSBpcyBhIHV0aWxpdHkgSkFSLCBhbmQgdGhlIGZpbGVzIGxpc3QgaGFzIG5ldmVyIGJlZW4gaW5pdGlhbGl6ZWQsIG9yIGlmIHRoZQotCSAqIGxvYWRpbmcgY29udGFpbmVycyBmb3IgYWxsIHRoZSBmaWxlcyBhcmUgdGhlIHNhbWUgQU5EIG5vdCBkaXJlY3RvcmllcywgQU5EIHRoZQotCSAqIHtAbGluayBBcmNoaXZlT3B0aW9ucyNpc1NhdmVMaWJyYXJpZXNBc0ZpbGVzKCl9b2YgdGhlIGFyY2hpdmUgaXMgdHJ1ZS4KLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5I3JlcXVpcmVzSXRlcmF0aW9uT25TYXZlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0l0ZXJhdGlvbk9uU2F2ZSgpIHsKLQkJaWYgKCFnZXRDb250YWluZXIoKS5pc0FyY2hpdmUoKSB8fCBpc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gKEFyY2hpdmUpIGdldENvbnRhaW5lcigpOwotCQkvL1dlIHNob3VsZCBsZWF2ZSB1dGlsaXR5IEpBUnMgaW50YWN0LCB1bmxlc3Mgd2VyZSB0b2xkIG5vdCB0bwotCQkvL1RoZSBtYW5pZmVzdCBtYXkgaGF2ZSBiZWVuIHNpZ25lZAotCQlpZiAoYW5BcmNoaXZlLmlzTW9kdWxlRmlsZSgpKQotCQkJcmV0dXJuICFhbkFyY2hpdmUuZ2V0T3B0aW9ucygpLmlzUmVhZE9ubHkoKTsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmdldE9wdGlvbnMoKS5pc1NhdmVMaWJyYXJpZXNBc0ZpbGVzKCkgJiYgYW5BcmNoaXZlLmdldExvYWRpbmdDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlpZiAoYW5BcmNoaXZlLmlzSW5kZXhlZCgpKSB7Ci0JCQkJTGlzdCBmaWxlcyA9IGFuQXJjaGl2ZS5nZXRGaWxlcygpOwotCQkJCUZpbGUgYUZpbGUgPSBudWxsOwotCQkJCUNvbnRhaW5lciBmaXJzdENvbnRhaW5lciA9IG51bGw7Ci0JCQkJQ29udGFpbmVyIGxDb250YWluZXIgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJYUZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCQlmaXJzdENvbnRhaW5lciA9IGFGaWxlLmdldExvYWRpbmdDb250YWluZXIoKTsKLQkJCQkJCWlmIChmaXJzdENvbnRhaW5lci5nZXRMb2FkU3RyYXRlZ3koKS5pc0RpcmVjdG9yeSgpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCWxDb250YWluZXIgPSBhRmlsZS5nZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQkJCWlmIChsQ29udGFpbmVyICE9IGZpcnN0Q29udGFpbmVyKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVSZXNvdXJjZVNldCgpOwotCQkJcmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotCQkJCXVwZGF0ZU1vZGlmaWNhdGlvblRyYWNraW5nKChSZXNvdXJjZSkgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJdXBkYXRlTW9kaWZpY2F0aW9uVHJhY2tpbmcoKFJlc291cmNlKSBsaXN0LmdldChpKSk7Ci0JCQkJfQotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHk7IGNsaWVudHMgc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwKLQkgKi8KLQlwdWJsaWMgRmlsZUl0ZXJhdG9yIGdldEZpbGVJdGVyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgRmlsZUl0ZXJhdG9ySW1wbChnZXRDb250YWluZXIoKS5nZXRGaWxlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGFic3RyYWN0IExpc3QgZ2V0RmlsZXMoKTsKLQotCXB1YmxpYyBMaXN0IGNvbGxlY3RGaWxlcygpIHsKLQkJLy9UaGUgbG9vc2UgYXJjaGl2ZXMgbmVlZCB0byBiZSByZWFkIGZpcnN0Ci0JCWNvbGxlY3RGaWxlc0Zyb21Mb29zZUFyY2hpdmVzKCk7Ci0JCUxpc3QgZmlsZXMgPSBnZXRGaWxlcygpOwotCQlmaWxlcy5hZGRBbGwoY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMudmFsdWVzKCkpOwotCQljb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RGaWxlc0Zyb21Mb29zZUFyY2hpdmVzKCkgewotCQlpZiAoIWNhbkhhdmVMb29zZUNoaWxkcmVuKCkgfHwgZ2V0TG9vc2VBcmNoaXZlKCkgPT0gbnVsbCkgewotCQkJY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgY2hpbGRyZW4gPSBMb29zZUNvbmZpZ1JlZ2lzdGVyLnNpbmdsZXRvbigpLmdldExvb3NlQ2hpbGRyZW4oZ2V0TG9vc2VBcmNoaXZlKCkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUxvb3NlQXJjaGl2ZSBsb29zZSA9IChMb29zZUFyY2hpdmUpIGNoaWxkcmVuLmdldChpKTsKLQkJCVN0cmluZyB1cmkgPSBsb29zZS5nZXRVcmkoKTsKLQkJCWlmICghY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMuY29udGFpbnNLZXkodXJpKSkgewotCQkJCUFyY2hpdmUgYXJjaGl2ZSA9IG9wZW5OZXN0ZWRBcmNoaXZlKGxvb3NlKTsKLQkJCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQkJCWNvbGxlY3RlZExvb3NlQXJjaGl2ZUZpbGVzLnB1dCh1cmksIGFyY2hpdmUpOwotCQkJCQlhcmNoaXZlLnNldExvYWRpbmdDb250YWluZXIoZ2V0Q29udGFpbmVyKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKHVyaSkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlIHJldHVybnMgYW4gaW1tdXRhYmxlIGNvbGxlY3Rpb24gb2YgdGhlIGxvYWRlZAotCSAqICAgICAgcmVzb3VyY2VzIGluIHRoZSByZXNvdXJjZSBzZXQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKSB7Ci0JCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJaWYgKHJlc291cmNlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCBjb3B5UmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQljb3B5UmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXMpOwotCQkKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGNvcHlSZXNvdXJjZXMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRlciA9IGNvcHlSZXNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlcy5pc0xvYWRlZCgpKQotCQkJCXJlc3VsdC5hZGQocmVzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSksIHRydWUpOwotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIHdyYXBFeCkgewotCQkJaWYgKChFeHRlbmRlZEVjb3JlVXRpbC5nZXRGaWxlTm90Rm91bmREZXRlY3RvcigpLmlzRmlsZU5vdEZvdW5kKHdyYXBFeCkpKSB7Ci0JCQkJRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZpbGVOb3RGb3VuZEV4ID0gRXh0ZW5kZWRFY29yZVV0aWwuZ2V0SW5uZXJGaWxlTm90Rm91bmRFeGNlcHRpb24od3JhcEV4KTsKLQkJCQl0aHJvdyBmaWxlTm90Rm91bmRFeDsKLQkJCX0KLQkJCXRocm93UmVzb3VyY2VMb2FkRXhjZXB0aW9uKHVyaSwgd3JhcEV4KTsKLQkJCXJldHVybiBudWxsOyAvL25ldmVyIGhhcHBlbnMgLSBjb21waWxlciBleHBlY3RzIGl0IHRob3VnaAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVJlc291cmNlU2V0KCkgewotCQkvL05vdCB0aGUgYmVzdCBkZXNpZ24gaGVyZSwgYmVjYXVzZSBhIGxvYWQgc3RyYXRlZ3kgc2hvdWxkIG9ubHkga25vdwotCQkvLyBhYm91dAotCQkvL2NvbnRhaW5lcjsgaG93ZXZlciwgdGhpcyBtZXRob2Qgd2lsbCBvbmx5IGdldCBjYWxsZWQgd2hlbiB0aGUKLQkJLy8gY29udGFpbmVyCi0JCS8vaXMgYW4gYXJjaGl2ZQotCQlBcmNoaXZlIGFyY2hpdmUgPSAoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCk7Ci0JCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwoYXJjaGl2ZSwgcHJpbUdldFJlc291cmNlc1BhdGgoKSk7Ci0JCVJlc291cmNlU2V0IHJzID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5IHJlZyA9IGNyZWF0ZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCXJzLnNldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KHJlZyk7Ci0JCXNldFJlc291cmNlU2V0KHJzKTsKLQkJcnMuc2V0VVJJQ29udmVydGVyKGNvbnZlcnRlcik7Ci0JCWlmIChhcmNoaXZlLnNob3VsZFVzZUphdmFSZWZsZWN0aW9uKCkpIHsKLQkJCXJzLmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IEphdmFKREtBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQotCQkJLy8gVEZCOiBQcm9ibGVtIGhlcmU6Ci0JCQkvLyAnQXJjaGl2ZS5pbml0aWFsaXplQ2xhc3NMb2FkZXInIGNhbGxzCi0JCQkvLyAnQXJjaGl2ZS5nZXRKYXZhQWRhcHRlckZhY3RvcnknLCB3aGljaAotCQkJLy8gJ0FyY2hpdmUuZ2V0UmVzb3VyY2VTZXQnLCB3aGljaCBjYWxscwotCQkJLy8gJ0xvYWRTdHJhdGVneS5pbml0aWFsaXplUmVzb3VyY2VTZXQnLCB3aGljaCBjYWxscwotCQkJLy8gJ0FyY2hpdmUuaW5pdGlhbGl6ZUNsYXNzTG9hZGVyJyBhbGwgb3ZlciBhZ2Fpbi4KLQkJCS8vCi0JCQkvLyBUaGlzIGNyZWF0ZXMgYSBzZWNvbmQsIHJlZHVuZGFudCBjbGFzc2xvYWRlciwKLQkJCS8vIGFuZCBwbGFjZXMgdGhlIGZpcnN0IGNsYXNzbG9hZGVyIGluIHRoZSBKYXZhSkRLQWRhcHRlckZhY3RvcnkuCi0JCQkvLyBIZW5jZSBub3Qgb25seSBpcyB0aGUgY2xhc3Nsb2FkZXIgY3JlYXRlZCB0d2ljZSwgYnV0Ci0JCQkvLyBib3RoIGNvcGllcyBhcmUgYWN0aXZlLiAgV2hlbiB0aGVyZSBhcmUgbGFyZ2UgY2xhc3NwYXRocywKLQkJCS8vIHRoaXMgd2lsbCBsYXJnZSBkdXBsaWNhdGUgc3RydWN0dXJlcy4KLQkJCS8vCi0JCQkvLyBTaW5jZSB0aGUgY2xhc3Nsb2FkZXIgd2lsbCBiZSBpbml0aWFsaXplZCBieSAnZ2V0Q2xhc3NMb2FkZXInLAotCQkJLy8gdGhlIGluaXRpYWxpemF0aW9uLCBoZXJlLCBzZWVtcyB1bm5lY2Vzc2FyeS4KLQkJCQotCQkJLy8gYXJjaGl2ZS5pbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5IGNyZWF0ZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlpZiAoaXNSZWFkT25seSgpKQotCQkJcmV0dXJuIG5ldyBKMkVFUmVzb3VjZUZhY3RvcnlTYXhSZWdpc3RyeSgpOwotCi0JCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotCQlzd2l0Y2ggKGdldFJlbmRlcmVyVHlwZSgpKSB7Ci0JCQljYXNlIEFyY2hpdmVPcHRpb25zLlNBWCA6Ci0JCQkJcmVnaXN0cnkgPSBuZXcgSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQXJjaGl2ZU9wdGlvbnMuRE9NIDoKLQkJCQlyZWdpc3RyeSA9IG5ldyBKMkVFUmVzb3VyY2VGYWN0b3J5RG9tUmVnaXN0cnkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQXJjaGl2ZU9wdGlvbnMuREVGQVVMVCA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZWdpc3RyeSA9IG5ldyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVuZGVyZXJUeXBlKCkgewotCQlyZXR1cm4gcmVuZGVyZXJUeXBlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQXJjaGl2ZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiAoKEFyY2hpdmUpIGdldENvbnRhaW5lcigpKS5pc05lc3RlZEFyY2hpdmUodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBBbiBhcmNoaXZlIHVzZXMgYSBjdXN0b20gY2xhc3MgbG9hZGVyIGZvciBqYXZhIHJlZmxlY3Rpb24gd2l0aGluIGEgbW9mIHJlc291cmNlU2V0OwotCSAqIGltcGxlbWVudGVycyBvZiBMb2FkU3RyYXRlZ3kgbWF5IHN1cHBseSBhIG1vZiByZXNvdXJjZVNldCBmb3Igd2hpY2ggdGhpcyBjbGFzcyBsb2FkZXIgaXMgbm90Ci0JICogbmVjZXNzYXJ5LCBvciBjb3VsZCBldmVuIGNhdXNlIGJyZWFrYWdlOyB0aGlzIHRlc3QgZ2l2ZXMgdGhlIHN0cmF0ZWd5IHRoZSBjaGFuY2UgdG8gIm9wdCBvdXQiCi0JICogb2YgdGhlIGNsYXNzIGxvYWRpbmcgZ2FtZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xhc3NMb2FkZXJOZWVkZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kgVGhlIGRlZmF1bHQgaXMgZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kjZ2V0RXhpc3RpbmdNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldEV4aXN0aW5nTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSksIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZlJlc291cmNlTG9hZGVkKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCVJlc291cmNlIHJlcyA9IGdldEV4aXN0aW5nTW9mUmVzb3VyY2UodXJpKTsKLQkJcmV0dXJuIHJlcyAhPSBudWxsICYmIHJlcy5pc0xvYWRlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKLQkJcmV0dXJuIGlzT3BlbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5IHJldHVybiBmYWxzZSBieSBkZWZhdWx0OyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZQotCSAqICAgICAgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2luZyhqYXZhLmlvLkZpbGUgYVN5c3RlbUZpbGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSwgRUxpc3QgZXh0ZW50KSB7Ci0JCVJlc291cmNlIGV4aXN0aW5nID0gZ2V0RXhpc3RpbmdNb2ZSZXNvdXJjZSh1cmkpOwotCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkKLQkJCXJldHVybiBleGlzdGluZzsKLQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh1cmkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShTdHJpbmcgdXJpKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoKEFyY2hpdmUpIGdldENvbnRhaW5lcigpKS5vcGVuTmVzdGVkQXJjaGl2ZSh1cmkpOwotCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0NhdWdodCBhbiBleGNlcHRpb24gdHJ5aW5nIHRvIG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoTG9vc2VBcmNoaXZlIGxvb3NlKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoKEFyY2hpdmUpIGdldENvbnRhaW5lcigpKS5vcGVuTmVzdGVkQXJjaGl2ZShsb29zZSk7Ci0JCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCS8vQ2F1Z2h0IGFuIGV4Y2VwdGlvbiB0cnlpbmcgdG8gb3BlbiB0aGUgbmVzdGVkIGFyY2hpdmUKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIG5ld0NvbnRhaW5lcikgewotCQljb250YWluZXIgPSBuZXdDb250YWluZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VTZXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0IG5ld1Jlc291cmNlU2V0KSB7Ci0JCS8vIGZpeGVzIHByb2JsZW0gaW4gcmVvcGVuCi0JCWlmIChyZXNvdXJjZVNldCAhPSBuZXdSZXNvdXJjZVNldCkgewotCi0JCQkvLyByZW1vdmUgYWRhcHRlciBmcm9tIG9sZCByZXNvdXJjZSBzZXQKLQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKQotCQkJCXJlc291cmNlU2V0LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQotCQkJLy8gYWRkIGFzIGFkYXB0ZXIgdG8gbmV3IHJlc291cmNlIHNldCBpZiBuZWNlc3NhcnkKLQkJCWlmIChuZXdSZXNvdXJjZVNldCAhPSBudWxsICYmICFuZXdSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5jb250YWlucyh0aGlzKSkKLQkJCQluZXdSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0KLQkJCXJlc291cmNlU2V0ID0gbmV3UmVzb3VyY2VTZXQ7Ci0JCX0gLy8gbm8gbmVlZCB0byB1cGRhdGUgaWYgb2xkIHNldCBlcXVhbHMgbmV3IHNldCAoYnkgcmVmZXJlbmNlKQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldElzT3Blbihib29sZWFuIG5ld0lzT3BlbikgewotCQlpc09wZW4gPSBuZXdJc09wZW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGhyb3dSZXNvdXJjZUxvYWRFeGNlcHRpb24oU3RyaW5nIHJlc291cmNlVXJpLCBFeGNlcHRpb24gZXgpIHRocm93cyBSZXNvdXJjZUxvYWRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUmVzb3VyY2VMb2FkRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIubG9hZF9yZXNvdXJjZV9FWENfLCAobmV3IE9iamVjdFtde3Jlc291cmNlVXJpLCBnZXRDb250YWluZXIoKS5nZXRVUkkoKX0pKSwgZXgpOyAvLyA9ICJDb3VsZCBub3QgbG9hZCByZXNvdXJjZSAiezB9IiBpbiBhcmNoaXZlICJ7MX0iIgotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxvb3NlQXJjaGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMb29zZUFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgTG9vc2VBcmNoaXZlIGdldExvb3NlQXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGxvb3NlQXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsb29zZUFyY2hpdmUuCi0JICogCi0JICogQHBhcmFtIGxvb3NlQXJjaGl2ZQotCSAqICAgICAgICAgICAgVGhlIGxvb3NlQXJjaGl2ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb29zZUFyY2hpdmUoTG9vc2VBcmNoaXZlIGxvb3NlQXJjaGl2ZSkgewotCQl0aGlzLmxvb3NlQXJjaGl2ZSA9IGxvb3NlQXJjaGl2ZTsKLQkJY2hlY2tMb29zZVBhdGhzVmFsaWQoKTsKLQl9Ci0KLQkvKgotCSAqIEFkZGVkIHRvIHN1cHBvcnQgV0FTIHJ1bnRpbWU7IHRocm93IGFuIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIGlmIG9uZSBvZiB0aGUgcGF0aHMgaW4gdGhlCi0JICogbG9vc2UgY29uZmlnIGRvZXMgbm90IHBvaW50IHRvIGFuIGV4aXN0aW5nIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0xvb3NlUGF0aHNWYWxpZCgpIHsKLQkJaWYgKGxvb3NlQXJjaGl2ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBwYXRoID0gbG9vc2VBcmNoaXZlLmdldEJpbmFyaWVzUGF0aCgpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlqYXZhLmlvLkZpbGUgaW9GaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoKTsKLQkJCWlmICghaW9GaWxlLmV4aXN0cygpKQotCQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBiaW5hcmllcyBwYXRoOiAiICsgcGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwYXRoID0gbG9vc2VBcmNoaXZlLmdldFJlc291cmNlc1BhdGgoKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJamF2YS5pby5GaWxlIGlvRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aCk7Ci0JCQlpZiAoIWlvRmlsZS5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgcmVzb3VyY2VzIHBhdGg6ICIgKyBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSGF2ZUxvb3NlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjb250YWluZXIuaXNFQVJGaWxlKCkgfHwgY29udGFpbmVyLmlzV0FSRmlsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiByZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVuZGVyZXJUeXBlCi0JICogICAgICAgICAgICBUaGUgcmVuZGVyZXJUeXBlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclR5cGUoaW50IHJlbmRlcmVyVHlwZSkgewotCQl0aGlzLnJlbmRlcmVyVHlwZSA9IHJlbmRlcmVyVHlwZTsKLQl9Ci0JCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEZpbGVzKFN0cmluZyBzdWJmb2xkZXJQYXRoKSB7Ci0JCUxpc3Qgc3Vic2V0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRoZUZpbGVzID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVGaWxlcy5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKXRoZUZpbGVzLmdldChpKTsKLQkJCWlmIChhRmlsZS5nZXRVUkkoKS5zdGFydHNXaXRoKHN1YmZvbGRlclBhdGgpKQkKLQkJCQlzdWJzZXQuYWRkKGFGaWxlKTsKLQkJfQotCQlyZXR1cm4gc3Vic2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L05lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY1NWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L05lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uTmVzdGVkSmFyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRmlsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuTmVzdGVkQXJjaGl2ZUl0ZXJhdG9yOwotCi0KLS8qKgotICogTG9hZCBzdHJhdGVneSB1c2VkIGFzIGEgbGFzdCByZXNvcnQgdG8gcmVhZCBlbnRyaWVzIGZyb20gamFycyBpbnNpZGUgb2YgamFycy4gSXQgaXMgYSBsYXN0IHJlc29ydAotICogYmVjYXVzZSBvZiB0aGUgcG9vciBwZXJmb21hbmNlIGludm9sdmVkLCBhcyB0aGUgY29udGVudHMgb2YgdGhlIHppcCBlbnRyaWVzIGFyZSBub3QgY2FjaGVkLCBhbmQKLSAqIHNlcXVlbnRpYWwgc2NhbiBzZWFyY2hlcyB3aWxsIGNhdXNlIHRoZSB6aXAgc3RyZWFtIHRvIGJlIGluZmxhdGVkIG9uIGVhY2ggc2VhcmNoLiBXaGVuZXZlcgotICogcG9zc2libGUsCi0gKiAKLSAqIEBsaW5rIHtUZW1wRmlsZUxvYWRTdHJhdGVneX0gc2hvdWxkIGJlIHVzZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIExvYWRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIEluZGV4IHRvIGltcHJvdmUgbG9va3VwIHBlcmZvcm1hbmNlIC0gbm90IHVzZWQgaWYgaW4gUnVudGltZSB0byByZWR1Y2UgZm9vdHByaW50Ci0JICovCi0JcHJvdGVjdGVkIE1hcCB1cmlzVG9Qb3NpdGlvbnM7Ci0JcHJvdGVjdGVkIExvYWRTdHJhdGVneSBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBOZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbChMb2FkU3RyYXRlZ3kgcGFyZW50U3RyYXRlZ3kpIHsKLQkJc3VwZXIoKTsKLQkJc2V0UGFyZW50KHBhcmVudFN0cmF0ZWd5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEluZGV4KCkgewotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdHJ5IHsKLQkJCVppcElucHV0U3RyZWFtIHppcyA9IGdldFppcElucHV0U3RyZWFtKCk7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IG51bGw7Ci0JCQlsb25nIHBvc2l0aW9uID0gMDsKLQkJCXdoaWxlICgoZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLQkJCQlwb3NpdGlvbisrOwotCQkJCW1hcC5wdXQoZW50cnkuZ2V0TmFtZSgpLCBuZXcgTG9uZyhwb3NpdGlvbikpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93TmVzdGVkSmFyRXhjZXB0aW9uKGlveCk7Ci0JCX0KLQkJc2V0VXJpc1RvUG9zaXRpb25zKG1hcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhTdHJpbmcgdXJpKSB7Ci0JCWlmICh1c2luZ0luZGV4KCkpCi0JCQlyZXR1cm4gY29udGFpbnNVc2luZ0luZGV4KHVyaSk7Ci0JCXJldHVybiBjb250YWluc1NlcXVlbnRpYWxseSh1cmkpOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNTZXF1ZW50aWFsbHkoU3RyaW5nIHVyaSkgewotCQlaaXBJbnB1dFN0cmVhbSB6aXMgPSBudWxsOwotCQl0cnkgewotCQkJemlzID0gZ2V0WmlwSW5wdXRTdHJlYW1Ta2lwcGVkVG8odXJpKTsKLQkJCXJldHVybiB6aXMgIT0gbnVsbDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh6aXMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXppcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNVc2luZ0luZGV4KFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGdldFVyaXNUb1Bvc2l0aW9ucygpLmNvbnRhaW5zS2V5KHVyaSk7Ci0JfQotCi0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHk7IGNsaWVudHMgc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwKLQkgKi8KLQlwdWJsaWMgRmlsZUl0ZXJhdG9yIGdldEZpbGVJdGVyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICgoKEFyY2hpdmUpIGdldENvbnRhaW5lcigpKS5nZXRPcHRpb25zKCkuaXNSZWFkT25seSgpKQotCQkJcmV0dXJuIG5ldyBOZXN0ZWRBcmNoaXZlSXRlcmF0b3IoZ2V0Q29udGFpbmVyKCkuZ2V0RmlsZXMoKSwgZ2V0WmlwSW5wdXRTdHJlYW0oKSk7Ci0JCXJldHVybiBzdXBlci5nZXRGaWxlSXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEZpbGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KDUwMCk7Ci0JCVppcElucHV0U3RyZWFtIHppcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXMgPSBnZXRaaXBJbnB1dFN0cmVhbSgpOwotCQkJWmlwRW50cnkgZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCk7Ci0JCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotCQkJCWlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlGaWxlIGFGaWxlID0gY3JlYXRlRmlsZShlbnRyeS5nZXROYW1lKCkpOwotCQkJCQlhRmlsZS5zZXRTaXplKGVudHJ5LmdldFNpemUoKSk7Ci0JCQkJCWFGaWxlLnNldExhc3RNb2RpZmllZChlbnRyeS5nZXRUaW1lKCkpOwotCQkJCQlsaXN0LmFkZChhRmlsZSk7Ci0JCQkJfQotCQkJCWVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93TmVzdGVkSmFyRXhjZXB0aW9uKGlveCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoemlzICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl6aXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKHVzaW5nSW5kZXgoKSkKLQkJCXJldHVybiBnZXRJbnB1dFN0cmVhbVVzaW5nSW5kZXgodXJpKTsKLQkJcmV0dXJuIGdldElucHV0U3RyZWFtU2VxdWVudGlhbGx5KHVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW1TZXF1ZW50aWFsbHkoU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShnZXRaaXBJbnB1dFN0cmVhbVNraXBwZWRUbyh1cmkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbVVzaW5nSW5kZXgoU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlMb25nIHBvc2l0aW9uID0gKExvbmcpIGdldFVyaXNUb1Bvc2l0aW9ucygpLmdldCh1cmkpOwotCQlpZiAocG9zaXRpb24gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKTsKLQkJWmlwSW5wdXRTdHJlYW0gemlzID0gZ2V0WmlwSW5wdXRTdHJlYW0oKTsKLQkJbG9uZyBwb3MgPSBwb3NpdGlvbi5sb25nVmFsdWUoKTsKLQkJZm9yIChsb25nIGkgPSAwOyBpIDwgcG9zOyBpKyspIHsKLQkJCXppcy5nZXROZXh0RW50cnkoKTsKLQkJfQotCQlyZXR1cm4gbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSh6aXMpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA3LzAwIDY6MTI6MzYgUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3kgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA3LzAwIDQ6Mzg6MjEgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTWFwCi0JICovCi0JcHVibGljIGphdmEudXRpbC5NYXAgZ2V0VXJpc1RvUG9zaXRpb25zKCkgewotCQlpZiAodXNpbmdJbmRleCgpICYmIHVyaXNUb1Bvc2l0aW9ucyA9PSBudWxsKQotCQkJYnVpbGRJbmRleCgpOwotCQlyZXR1cm4gdXJpc1RvUG9zaXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBaaXBJbnB1dFN0cmVhbSBnZXRaaXBJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVyaSA9IGdldENvbnRhaW5lcigpLmdldFVSSSgpOwotCQlJbnB1dFN0cmVhbSBpbiA9IGdldFBhcmVudCgpLmdldElucHV0U3RyZWFtKHVyaSk7Ci0JCXJldHVybiBuZXcgWmlwSW5wdXRTdHJlYW0oaW4pOwotCX0KLQotCXByb3RlY3RlZCBaaXBJbnB1dFN0cmVhbSBnZXRaaXBJbnB1dFN0cmVhbVNraXBwZWRUbyhTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLk51bGxfdXJpX0VYQ18pOyAvLyA9ICJOdWxsIHVyaSIKLQkJWmlwSW5wdXRTdHJlYW0gemlzID0gbnVsbDsKLQkJWmlwRW50cnkgZW50cnkgPSBudWxsOwotCQl0cnkgewotCQkJemlzID0gZ2V0WmlwSW5wdXRTdHJlYW0oKTsKLQkJCWVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpOwotCQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlpZiAodXJpLmVxdWFscyhlbnRyeS5nZXROYW1lKCkpKQotCQkJCQlyZXR1cm4gemlzOwotCQkJCWVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy8gZW50cnkgd2FzIG5vdCBmb3VuZCBzbyBjbG9zZSB0aGUgc3RyZWFtCi0JCQlpZiAoZW50cnkgPT0gbnVsbCAmJiB6aXMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXppcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHVyaSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDcvMDAgNjoxMjozNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UGFyZW50Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3kgbmV3UGFyZW50KSB7Ci0JCXBhcmVudCA9IG5ld1BhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNy8wMCA0OjM4OjIxIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdVcmlzVG9Qb3NpdGlvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5NYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmlzVG9Qb3NpdGlvbnMoamF2YS51dGlsLk1hcCBuZXdVcmlzVG9Qb3NpdGlvbnMpIHsKLQkJdXJpc1RvUG9zaXRpb25zID0gbmV3VXJpc1RvUG9zaXRpb25zOwotCX0KLQotCS8qKgotCSAqIEFuIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IHJlYWRpbmcgdGhlIG5lc3RlZCBqYXI7IHRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGhyb3dOZXN0ZWRKYXJFeGNlcHRpb24oRXhjZXB0aW9uIGNhdWdodEV4Y2VwdGlvbikgewotCQl0aHJvdyBuZXcgTmVzdGVkSmFyRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIubmVzdGVkX2phcl9FWENfLCAobmV3IE9iamVjdFtde2dldENvbnRhaW5lcigpLmdldFVSSSgpLCBnZXRQYXJlbnQoKS5nZXRDb250YWluZXIoKS5nZXRVUkkoKX0pKSwgY2F1Z2h0RXhjZXB0aW9uKTsvLyA9ICJBbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIHswfSBmcm9tIHsxfSIKLQl9Ci0KLQkvKioKLQkgKiBEb24ndCB1c2UgdGhlIGluZGV4IGluIHRoZSBydW50aW1lIGVudmlyb25tZW50OyByZWR1Y2UgZm9vdHByaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gdXNpbmdJbmRleCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCQkvL3JldHVybiAhY29tLmlibS5ldG9vbHMuYXJjaGl2ZS51dGlsLkFyY2hpdmVVdGlsLmlzUnVudGltZSgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OdWxsTG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTnVsbExvYWRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmNjFjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OdWxsTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogTm8tb3AgaW1wbGVtZW50ZXIgdXNlZCBmb3IgbmV3IGFyY2hpdmUgaW5zdGFuY2VzLCB3aGljaCBoYXZlIHRoZWlyIGNvbnRlbnRzIGFkZGVkIGFuZCBjb3BpZWQgZnJvbQotICogb3RoZXIgc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgTnVsbExvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBMb2FkU3RyYXRlZ3lJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZW1wdHlMaXN0ID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCS8qKgotCSAqIE51bGxMb2FkU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTnVsbExvYWRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEZpbGVzKCkgewotCQlyZXR1cm4gZW1wdHlMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24odXJpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SYXJFeHBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JhckV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U3N2UzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JhckV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGV4cG9ydCBtZXRhLWRhdGEgZm9yIGEgSjJDIFJlc291cmNlIEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFJhckV4cG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIEV4cG9ydFN0cmF0ZWd5SW1wbCB7Ci0JLyoqCi0JICogUmFyRXhwb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmFyRXhwb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JhckltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOGRjMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBpbXBvcnQgbWV0YS1kYXRhIGZvciBhIEoyQyBSZXNvdXJjZSBBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSYXJJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3IgZXh0ZW5kcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHsKLQkJcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCQlyZXR1cm4gYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCQlyZXR1cm4gbmV3IFJhckltcG9ydFN0cmF0ZWd5SW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQkJcmV0dXJuIGdldFhtbERETWVzc2FnZShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLlJBUl9GaWxlLCBKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpOyAvLyA9ICJSQVIgRmlsZSIKLQkJfQotCi0JCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCQlyZXR1cm4gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVSQVJGaWxlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIERpc2NyaW1pbmF0b3IgZGlzY3JpbWluYXRvcjsKLQotCS8qKgotCSAqIFJhckltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJhckltcG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvcigpLmNyZWF0ZUltcG9ydFN0cmF0ZWd5KG9sZCwgbmV3QXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3IgPT0gbnVsbCkgewotCQkJZGlzY3JpbWluYXRvciA9IG5ldyBEaXNjcmltaW5hdG9yKCk7Ci0JCQkvLyBDb25uZWN0b3JzIHVzZSB0aGVpciBvd24gc3BlY2lhbCBlbnRpdHkgcmVzb2x2ZXIgZm9yIG5vdy4uLgotCQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NZU1RFTUlEXzFfMCwgImNvbm5lY3Rvcl8xXzAuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZGlzY3JpbWluYXRvcjsKLQl9Ci0KLQlwdWJsaWMgUkFSRmlsZSBnZXRSQVJGaWxlKCkgewotCQlyZXR1cm4gKFJBUkZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRNZXRhRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IG51bGw7Ci0KLQkJY29ubmVjdG9yID0gKENvbm5lY3RvcikgcHJpbUxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlnZXRSQVJGaWxlKCkuc2V0RGVwbG95bWVudERlc2NyaXB0b3IoY29ubmVjdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjA4ZWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLQotcHVibGljIGNsYXNzIFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIERpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwgewotCXByb3RlY3RlZCBqYXZhLmlvLkZpbGUgc3ViZGlyZWN0b3J5OwotCi0JLyoqCi0JICogUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsKFN0cmluZyBhRGlyZWN0b3J5VXJpKSB7Ci0JCXN1cGVyKGFEaXJlY3RvcnlVcmkpOwotCX0KLQotCS8qKgotCSAqIFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbChTdHJpbmcgcm9vdERpcmVjdG9yeVVyaSwgamF2YS5pby5GaWxlIHN1YmRpcikgewotCQlzdXBlcihyb290RGlyZWN0b3J5VXJpKTsKLQkJc2V0U3ViZGlyZWN0b3J5KHN1YmRpcik7Ci0JfQotCi0JLyoqCi0JICogYWRkRGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpcmVjdG9yeShqYXZhLmlvLkZpbGUgYUZpbGUsIGphdmEudXRpbC5MaXN0IGFMaXN0KSB7Ci0JCVJlYWRPbmx5RGlyZWN0b3J5IGRpciA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnkoKTsKLQkJZGlyLnNldExhc3RNb2RpZmllZChhRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0JCWRpci5zZXRVUkkoZ2V0VVJJRnJvbShhRmlsZSkpOwotCQlkaXIuc2V0TG9hZGluZ0NvbnRhaW5lcihnZXRDb250YWluZXIoKSk7Ci0JCWRpci5zZXRMb2FkU3RyYXRlZ3kobmV3IFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbChnZXREaXJlY3RvcnlVcmkoKSwgYUZpbGUpKTsKLQkJYUxpc3QuYWRkKGRpcik7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gc3VwZXIuY29udGFpbnModXJpKSAmJiAoZ2V0U3ViZGlyZWN0b3J5KCkgPT0gbnVsbCB8fCBzdWJkaXJlY3RvcnlDb250YWlucyh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJamF2YS5pby5GaWxlIHN1YmRpciA9IGdldFN1YmRpcmVjdG9yeSgpOwotCQlpZiAoc3ViZGlyID09IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gc3ViZGlyLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIGdldERpcmVjdG9yeUZvckxpc3QgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIGphdmEuaW8uRmlsZSBnZXREaXJlY3RvcnlGb3JMaXN0KCkgewotCQlpZiAoZ2V0U3ViZGlyZWN0b3J5KCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRTdWJkaXJlY3RvcnkoKTsKLQkJcmV0dXJuIG5ldyBqYXZhLmlvLkZpbGUoZ2V0RGlyZWN0b3J5VXJpKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAxLzA4LzAxIDE6MTA6NDcgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmlvLkZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS5pby5GaWxlIGdldFN1YmRpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHN1YmRpcmVjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBBbHdheXMgcmV0dXJuIGZhbHNlLCBiZWNhdXNlIHdlIHdhbnQgdG8gdHJlYXQgdGhlIGVudHJpZXMgaW4gYSBmaWxlIHN5c3RlbSBkaXJlY3RvcnkgYXMgYmFzaWMKLQkgKiBmaWxlcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQXJjaGl2ZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMS8wOC8wMSAxOjEwOjQ3IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTdWJkaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIGphdmEuaW8uRmlsZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN1YmRpcmVjdG9yeShqYXZhLmlvLkZpbGUgbmV3U3ViZGlyZWN0b3J5KSB7Ci0JCXN1YmRpcmVjdG9yeSA9IG5ld1N1YmRpcmVjdG9yeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdWJkaXJlY3RvcnlDb250YWlucyhTdHJpbmcgdXJpKSB7Ci0JCWlmIChnZXRTdWJkaXJlY3RvcnkoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGdldEZpbGVOYW1lRnJvbSh1cmkpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQkJd2hpbGUgKGFGaWxlICE9IG51bGwgJiYgIWNvbnRhaW5zKSB7Ci0JCQlpZiAoZ2V0U3ViZGlyZWN0b3J5KCkuZXF1YWxzKGFGaWxlKSkgewotCQkJCWNvbnRhaW5zID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYUZpbGUgPSBhRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5zOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1NhdmVTdHJhdGVneS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvU2F2ZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmNlMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvU2F2ZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5GaWxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyOwotCi0KLS8qKgotICogS25vd3MgaG93IHRvIGV4cG9ydCB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBmaWxlLiBUaGlzIHByb3ZpZGVzIGEgZGVsZWdhdGlvbiBtb2RlbCBzYXZpbmcgdGhlCi0gKiBhcmNoaXZlLiBFeGFtcGxlcyBtaWdodCBpbmNsdWRlIGV4cG9ydGluZyB0byBhIHppcCBvdXRwdXQgc3RyZWFtLCB0byB0aGUgZmlsZSBzeXN0ZW0sIG9yIGludG8gYQotICogd29ya2JlbmNoLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNhdmVTdHJhdGVneSBleHRlbmRzIEFyY2hpdmVTdHJhdGVneSB7Ci0JLyoqCi0JICogQ2xvc2UgYW5kIHJlbGVhc2UgYW55IHJlc291cmNlcyBiZWluZyBoZWxkIGJ5IHRoaXMgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5vdGlmeSByZXNvdXJjZXMgaWYgbmVjZXNzYXJ5IHRoYXQgc2F2ZSBpcyBjb21wbGV0ZSBmb3IgdGhpcyBhcmNoaXZlLCBiZWluZyBjYXJlZnVsIG5vdCB0bwotCSAqIGNsb3NlIGFueSByZXNvdXJjZXMgdGhhdCBhIHBhcmVudCBhcmNoaXZlIG1pZ2h0IHN0aWxsIGJlIHVzaW5nCi0JICovCi0JcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQlwdWJsaWMgU2F2ZUZpbHRlciBnZXRGaWx0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGFyY2hpdmUgaXMgc2F2aW5nIGZpbGVzIHRvIGEgZGlyZWN0b3J5IG9uIHRoZSBmaWxlIHN5c3RlbQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCk7Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNhdmUoQXJjaGl2ZU1hbmlmZXN0IGFNYW5pZmVzdCkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNhdmUoRmlsZSBhRmlsZSwgRmlsZUl0ZXJhdG9yIGl0ZXJhdG9yKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgc2F2ZShGaWxlIGFGaWxlLCBqYXZhLmlvLklucHV0U3RyZWFtIGluKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgc2F2ZU1vZlJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihTYXZlRmlsdGVyIGFGaWx0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDk5ODA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1NhdmVTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRmlsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXZpc2l0OwotCi0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50ZXIgb2ZmIHdoaWNoIGFueSBzYXZlIHN0cmF0ZWd5IGNhbiBzdWJjbGFzcwotICogCi0gKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBBcmNoaXZlU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgU2F2ZVN0cmF0ZWd5IHsKLQlwcm90ZWN0ZWQgU2F2ZUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBTYXZlU3RyYXRlZ3lJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNhdmVTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZyAtIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkvL0RlZmF1bHQKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU2F2ZVN0cmF0ZWd5IGNyZWF0ZU5lc3RlZFNhdmVTdHJhdGVneShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nIC0gc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkvL0RlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yOC8wMSA0OjExOjI4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlRmlsdGVyCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkKLQkJCWZpbHRlciA9IG5ldyBTYXZlRmlsdGVySW1wbCgpOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtRm9yUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTG9hZGVkUmVzb3VyY2VPck1hbmlmZXN0KEZpbGUgYUZpbGUpIHsKLQkJcmV0dXJuIGdldEFyY2hpdmUoKS5pc01vZlJlc291cmNlTG9hZGVkKGFGaWxlLmdldFVSSSgpKSB8fCBhRmlsZS5nZXRVUkkoKS5lcXVhbHMoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCi0JCXNhdmVNYW5pZmVzdCgpOwotCQlzYXZlTW9mUmVzb3VyY2VzKCk7Ci0JCXNhdmVGaWxlcygpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVNhdmVTdHJhdGVneSBzdHJhdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdHJhdCA9IGNyZWF0ZU5lc3RlZFNhdmVTdHJhdGVneShhbkFyY2hpdmUpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKGFuQXJjaGl2ZS5nZXRVUkkoKSwgaW94KTsKLQkJfQotCQlhbkFyY2hpdmUuc2F2ZShzdHJhdCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZShGaWxlIGFGaWxlLCBGaWxlSXRlcmF0b3IgaXRlcmF0b3IpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmIChhRmlsZS5pc0FyY2hpdmUoKSAmJiBzaG91bGRJdGVyYXRlT3ZlcigoQXJjaGl2ZSkgYUZpbGUpKQotCQkJc2F2ZSgoQXJjaGl2ZSkgYUZpbGUpOwotCQllbHNlIHsKLQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCWlmICghYUZpbGUuaXNEaXJlY3RvcnlFbnRyeSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4gPSBpdGVyYXRvci5nZXRJbnB1dFN0cmVhbShhRmlsZSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKGFGaWxlLmdldFVSSSgpLCBleCk7Ci0JCQkJfQotCQkJfQotCQkJc2F2ZShhRmlsZSwgaW4pOwotCQl9Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZShGaWxlIGFGaWxlLCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUZpbGVzKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUZpbGVJdGVyYXRvciBpdGVyYXRvciA9IGdldEFyY2hpdmUoKS5nZXRGaWxlc0ZvclNhdmUoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlGaWxlIGFGaWxlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChzaG91bGRTYXZlKGFGaWxlKSkKLQkJCQkJc2F2ZShhRmlsZSwgaXRlcmF0b3IpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkVycm9yX29jY3VycmVkX2l0ZXJhdGluZ19mX0VYQ18sIGlveCk7IC8vID0gIkVycm9yIG9jY3VycmVkIGl0ZXJhdGluZyBmaWxlcyIKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVNYW5pZmVzdCgpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmICghc2hvdWxkU2F2ZShKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpCi0JCQlyZXR1cm47Ci0JCUFyY2hpdmVNYW5pZmVzdCBtZiA9IGdldEFyY2hpdmUoKS5nZXRNYW5pZmVzdCgpOwotCQlpZiAobWYuZ2V0TWFuaWZlc3RWZXJzaW9uKCkgPT0gbnVsbCB8fCBtZi5nZXRNYW5pZmVzdFZlcnNpb24oKS5lcXVhbHMoIiIpKS8vJE5PTi1OTFMtMSQKLQkJCW1mLnNldE1hbmlmZXN0VmVyc2lvbigiMS4wIik7Ly8kTk9OLU5MUy0xJAotCQlzYXZlKG1mKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZlJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmICghc2hvdWxkU2F2ZShhUmVzb3VyY2UpKQotCQkJcmV0dXJuOwotCQlzZXRFbmNvZGluZyhhUmVzb3VyY2UpOwotCQl0cnkgewotCQkJYm9vbGVhbiB3YXNNb2RpZmllZCA9IGFSZXNvdXJjZS5pc01vZGlmaWVkKCk7Ci0JCQlPdXRwdXRTdHJlYW0gb3MgPSBnZXRPdXRwdXRTdHJlYW1Gb3JSZXNvdXJjZShhUmVzb3VyY2UpOwotCQkJc2F2ZU1vZlJlc291cmNlKGFSZXNvdXJjZSwgb3MpOwotCQkJYVJlc291cmNlLnNldE1vZGlmaWVkKHdhc01vZGlmaWVkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihhUmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1vZlJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSBhUmVzb3VyY2UsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYVJlc291cmNlLnNhdmUob3MsIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1vZlJlc291cmNlcygpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0QXJjaGl2ZSgpLmdldExvYWRlZE1vZlJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0JCS8vV2UgaGF2ZSB0byBnbyB0aHJvdWdoIHRoaXMgcHJvY2VzcyBiZWNhdXNlIGphdmEgcmVzb3VyY2VzIGNvdWxkIGdldCBhZGRlZCBkdXJpbmcgdGhlCi0JCS8vcHJvY2VzcyBvZiBpdGVyYXRpbmcgYW5kIHNhdmluZywgYW5kIGFkZGluZyB0byBhIGNvbGxlY3Rpb24gd2hpbGUgaXRlcmF0aW5nIGNhdXNlcyBhCi0JCS8vIGZhaWx1cmUKLQkJTGlzdCB4bWlSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vV2Ugd2lsbCBzYXZlIHRoZSB4bWkgcmVzb3VyY2VzIGZpcnN0LCB0aGVuIHRoZSB4bWwgcmVzb3VyY2VzLiBUaGlzIHdheSB0aGUKLQkJLy9hbnkgbmVjZXNzYXJ5IGlkJ3MgZm9yIHJlZmVyZW5jZWQgb2JqZWN0cyB3aWxsIGhhdmUgYmVlbiBnZW5lcmF0ZWQgcHJpb3IgdG8gc2F2ZQotCQlMaXN0IHhtbFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmVzID0gKFJlc291cmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvLwkJV2UgZG9uJ3Qgd2FudCB0byBzYXZlIHRoZSBqYXZhIHJlZmxlY3Rpb24gcmVzb3VyY2VzIG9yIHVyaSBtYXBwZWQgcmVzb3VyY2VzCi0JCQlpZiAoIUFyY2hpdmVVdGlsLmlzSmF2YVJlc291cmNlKHJlcykgJiYgIUFyY2hpdmVVdGlsLmlzUmVnaXN0ZXJlZFVSSU1hcHBpbmcocmVzKSAmJiAhQXJjaGl2ZVV0aWwuaXNQbGF0Zm9ybU1ldGFSZXNvdXJjZShyZXMpKSB7Ci0JCQkJUmV2aXNpdC5yZXZpc2l0KCk7Ci0JCQkJLy9Gb3Igbm93LCBhbHdheXMgdXNlIHRoZSBtb2Y1IGZvcm1hdAotCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpCi0JCQkJCSgoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSByZXMpLnNldEZvcm1hdChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX01PRjUpOwotCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBUcmFuc2xhdG9yUmVzb3VyY2UpCi0JCQkJCXhtbFJlc291cmNlcy5hZGQocmVzKTsKLQkJCQllbHNlIHsKLQkJCQkJeG1pUmVzb3VyY2VzLmFkZChyZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQliYXNpY1NhdmVNb2ZSZXNvdXJjZXMoeG1pUmVzb3VyY2VzKTsKLQkJYmFzaWNTYXZlTW9mUmVzb3VyY2VzKHhtbFJlc291cmNlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNTYXZlTW9mUmVzb3VyY2VzKExpc3QgcmVzb3VyY2VzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJc2F2ZU1vZlJlc291cmNlKHJlcyk7Ci0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVuY29kaW5nKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSkKLQkJCSgob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSkgYVJlc291cmNlKS5zZXRFbmNvZGluZyhhcmNoaXZlLmdldFhtbEVuY29kaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI4LzAxIDQ6MTE6MjggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0ZpbHRlcgotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlRmlsdGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlciBuZXdGaWx0ZXIpIHsKLQkJZmlsdGVyID0gbmV3RmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoZSBuZXN0ZWQgYXJjaGl2ZSBuZWVkcyB0byBiZSBzYXZlZCBvbmUgZmlsZSBhdCBhIHRpbWUsIG9yIGlmIHdlIGNhbiBidWxrCi0JICogc2F2ZSBpdCBmcm9tIHRoZSBvcmlnaW5hbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEl0ZXJhdGVPdmVyKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiBhbkFyY2hpdmUuZ2V0TG9hZFN0cmF0ZWd5KCkucmVxdWlyZXNJdGVyYXRpb25PblNhdmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKEZpbGUgYUZpbGUpIHsKLQkJYm9vbGVhbiBsb2FkZWQgPSBpc0xvYWRlZFJlc291cmNlT3JNYW5pZmVzdChhRmlsZSk7Ci0JCWlmIChsb2FkZWQpIHsKLQkJCVJlc291cmNlIHJlcyA9IGFyY2hpdmUuZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0RXhpc3RpbmdNb2ZSZXNvdXJjZShhRmlsZS5nZXRVUkkoKSk7Ci0JCQlpZiAocmVzID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy9tdXN0IGJlIG1hbmlmZXN0Ci0JCQlyZXR1cm4gIXNob3VsZFNhdmUocmVzKTsKLQkJfQotCi0JCWlmIChnZXRBcmNoaXZlKCkuaXNNb2R1bGVGaWxlKCkpIHsKLQkJCU1vZHVsZUZpbGUgbSA9IChNb2R1bGVGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JCQlpZiAobS5nZXRFeHBvcnRTdHJhdGVneSgpICE9IG51bGwgJiYgbS5nZXRFeHBvcnRTdHJhdGVneSgpLmhhc1NhdmVkKGFGaWxlLmdldFVSSSgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHNob3VsZFNhdmUoYUZpbGUuZ2V0VVJJKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmUoUmVzb3VyY2UgcmVzKSB7Ci0JCWlmICghcmVzLmlzTW9kaWZpZWQoKSAmJiBnZXRBcmNoaXZlKCkuZ2V0T3B0aW9ucygpLnNhdmVPbmx5RGlydHlNb2ZSZXNvdXJjZXMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gc2hvdWxkU2F2ZShyZXMuZ2V0VVJJKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBvbmUgbWV0aG9kIHRocm91Z2ggd2hpY2ggYWxsIGVsZW1lbnRzIG9mIGFuIGFyY2hpdmUgKGZpbGUsIG5lc3RlZCBhcmNoaXZlLCBtb2YKLQkgKiByZXNvdXJjZSwgb3IgbWFuaWZlc3QpIHdpbGwgYmUgdGVzdGVkIGJlZm9yZSBzYXZpbmcuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIGRvIHNvbWV0aGluZwotCSAqIG1vcmUgc3BlY2lmaWMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGdldEZpbHRlcigpLnNob3VsZFNhdmUodXJpLCBnZXRBcmNoaXZlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1RlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZjcyYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuRGVsZXRlT25FeGl0VXRpbGl0eTsKLQotCi0vKioKLSAqIFVzZWQgYXMgYW4gb3B0aW1pemF0aW9uIGZvciByZWFkaW5nIGphcnMgd2l0aGluIGphcnMuIFJlYWRpbmcgZnJvbSBhIFppcEZpbGUgaXMgbXVjaCBmYXN0ZXIgdGhhbgotICogZnJvbSBhIFppcElucHV0U3RyZWFtLCB0aGVyZWZvcmUsIHdoZW4gcG9zc2libGUsIGl0IG1ha2VzIHNlbnNlIHRvIGNvcHkgdGhlIG5lc3RlZCBqYXIgdG8gYSB0ZW1wCi0gKiBmaWxlLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBlbnN1cmUgdGhhdCB0aGUgdGVtcCBmaWxlIGdldHMgZGVsZXRlZCBvbiBub3JtYWwKLSAqIHN5c3RlbSBleGl0LCB1c2luZyB0aGUgaGVscGVyIG1ldGhvZCBvbiBqYXZhLmlvLkZpbGUuIFRoaXMgc3RyYXRlZ3kgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgZmlsZQotICogd2hlbiBjbG9zZWQgb3IgZmluYWxpemVkLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgWmlwRmlsZUxvYWRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIFRlbXBvcmFyeVppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFRlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZW1wb3JhcnlaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBqYXZhLmlvLkZpbGUKLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBUZW1wWmlwRmlsZUxvYWRTdHJhdGVneUltcGwoamF2YS5pby5GaWxlIGZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3VwZXIoZmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JCUZpbGUgZmlsZSA9IGdldEZpbGUoKTsKLQkJZmlsZS5kZWxldGUoKTsKLQkJRGVsZXRlT25FeGl0VXRpbGl0eS5maWxlSGFzQmVlbkRlbGV0ZWQoZmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5BYnNvbHV0ZV9wYXRoX3Vua25vd25fRVhDXyk7IC8vID0gIkFic29sdXRlIHBhdGggdW5rbm93biIKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9XYXIyMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvV2FyMjJFeHBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyMGVmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9XYXIyMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGV4cG9ydCBtZXRhLWRhdGEgZm9yIGEgMi4yIFdlYiBhcHAKLSAqLwotcHVibGljIGNsYXNzIFdhcjIyRXhwb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgRXhwb3J0U3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBXYXIyMkV4cG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdhcjIyRXhwb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9XYXIyMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVkNjVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBpbXBvcnQgbWV0YS1kYXRhIGZvciBhIDIuMiBXZWIgYXBwCi0gKi8KLXB1YmxpYyBjbGFzcyBXYXIyMkltcG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIFhtbEJhc2VkSW1wb3J0U3RyYXRlZ3lJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGlzY3JpbWluYXRvciBleHRlbmRzIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgewotCQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJCXJldHVybiBhbkFyY2hpdmUuY29udGFpbnNGaWxlKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCQkgKi8KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJCXJldHVybiBuZXcgV2FyMjJJbXBvcnRTdHJhdGVneUltcGwoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5hYmxlVG9PcGVuTWVzc2FnZSgpIHsKLQkJCXJldHVybiBnZXRYbWxERE1lc3NhZ2UoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5XQVJfRmlsZSwgSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJKTsgLy8gPSAiV0FSIEZpbGUiCi0JCX0KLQotCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewotCQkJcmV0dXJuIGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlV0FSRmlsZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3I7Ci0KLQkvKioKLQkgKiBXYXIyMkltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBnZXREaXNjcmltaW5hdG9yKCkuY3JlYXRlSW1wb3J0U3RyYXRlZ3kob2xkLCBuZXdBcmNoaXZlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCkgewotCQlpZiAoZGlzY3JpbWluYXRvciA9PSBudWxsKSB7Ci0JCQlkaXNjcmltaW5hdG9yID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGlzY3JpbWluYXRvcjsKLQl9Ci0KLQlwdWJsaWMgV0FSRmlsZSBnZXRXQVJGaWxlKCkgewotCQlyZXR1cm4gKFdBUkZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRNZXRhRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlXZWJBcHAgd2ViYXBwID0gbnVsbDsKLQkJd2ViYXBwID0gKFdlYkFwcCkgcHJpbUxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCWdldFdBUkZpbGUoKS5zZXREZXBsb3ltZW50RGVzY3JpcHRvcih3ZWJhcHApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1htbEJhc2VkSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9YbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZiZmUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1htbEJhc2VkSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLQotCi0vKioKLSAqIEFic3RyYWN0IGltcGxlbWVudGVyIGZvciBhcmNoaXZlcyB0aGF0IHVzZSB4bWwgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBJbXBvcnRTdHJhdGVneUltcGwgewotCS8qKgotCSAqIFhtbEJhc2VkSW1wb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZSgpIHsKLQkJcmV0dXJuIChNb2R1bGVGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVPYmplY3QgcHJpbUxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0KLQkJcmVzb3VyY2UgPSBnZXRNb2R1bGVGaWxlKCkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlFT2JqZWN0IHJvb3QgPSBudWxsOwotCi0JCXJvb3QgPSBBcmNoaXZlVXRpbC5nZXRSb290KHJlc291cmNlKTsKLQotCQlyZXR1cm4gcm9vdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwRmlsZUxvYWRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2MDI4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byByZWFkIGZpbGVzIGZyb20gYSB6aXAvamFyIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCi0gKiAKLSAqIEBzZWUgTG9hZFN0cmF0ZWd5Ci0gKi8KLQotcHVibGljIGNsYXNzIFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgTG9hZFN0cmF0ZWd5SW1wbCB7Ci0JcHJvdGVjdGVkIGphdmEuaW8uRmlsZSBmaWxlOwotCXByb3RlY3RlZCBaaXBGaWxlIHppcEZpbGU7Ci0JCi0JLyoqCi0JICogWmlwRmlsZUxvYWRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBaaXBGaWxlTG9hZFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsKGphdmEuaW8uRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlcigpOwotCQlzZXRGaWxlKGZpbGUpOwotCQlzZXRaaXBGaWxlKG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlVXRpbC5uZXdaaXBGaWxlKGZpbGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJc3VwZXIuY2xvc2UoKTsKLQkJdHJ5IHsKLQkJCWdldFppcEZpbGUoKS5jbG9zZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJLy9JZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltQ29udGFpbnMoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGdldFppcEZpbGUoKS5nZXRFbnRyeSh1cmkpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMjAvMDAgNDo0MDoxNCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEuaW8uRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLmlvLkZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRGaWxlcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gZ2V0WmlwRmlsZSgpLmVudHJpZXMoKTsKLQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpewotCQkJCWlmKCFjb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcy5jb250YWluc0tleShlbnRyeS5nZXROYW1lKCkpKSB7Ci0JCQkJCUZpbGUgYUZpbGUgPSBjcmVhdGVGaWxlKGVudHJ5LmdldE5hbWUoKSk7Ci0JCQkJCWFGaWxlLnNldFNpemUoZW50cnkuZ2V0U2l6ZSgpKTsKLQkJCQkJYUZpbGUuc2V0TGFzdE1vZGlmaWVkKGVudHJ5LmdldFRpbWUoKSk7Ci0JCQkJCWxpc3QuYWRkKGFGaWxlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYoaW5jbHVkZUVtcHR5RGlyZWN0b3JpZXMpIHsKLQkJCQlGaWxlIGFGaWxlID0gY3JlYXRlRGlyZWN0b3J5KGVudHJ5LmdldE5hbWUoKSk7Ci0JCQkJYUZpbGUuc2V0RGlyZWN0b3J5RW50cnkodHJ1ZSk7Ci0JCQkJYUZpbGUuc2V0U2l6ZShlbnRyeS5nZXRTaXplKCkpOwotCQkJCWFGaWxlLnNldExhc3RNb2RpZmllZChlbnRyeS5nZXRUaW1lKCkpOwotCQkJCWxpc3QuYWRkKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gZ2V0WmlwRmlsZSgpLmdldEVudHJ5KHVyaSk7Ci0JCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHVyaSk7Ci0KLQkJCXJldHVybiBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKGdldFppcEZpbGUoKS5nZXRJbnB1dFN0cmVhbShlbnRyeSkpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gemlwQ2xvc2VkKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oemlwQ2xvc2VkLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMDEvMDAgMTE6Mjg6MTIgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuemlwLlppcEZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLnppcC5aaXBGaWxlIGdldFppcEZpbGUoKSB7Ci0JCXJldHVybiB6aXBGaWxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzaW5nKGphdmEuaW8uRmlsZSBhU3lzdGVtRmlsZSkgewotCQlyZXR1cm4gZ2V0RmlsZSgpICE9IG51bGwgJiYgZ2V0RmlsZSgpLmVxdWFscyhhU3lzdGVtRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMjAvMDAgNDo0MDoxNCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RmlsZQotCSAqICAgICAgICAgICAgamF2YS5pby5GaWxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsZShqYXZhLmlvLkZpbGUgbmV3RmlsZSkgewotCQlmaWxlID0gbmV3RmlsZTsKLQl9Ci0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzAxLzAwIDExOjI4OjEyIEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdaaXBGaWxlCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRaaXBGaWxlKGphdmEudXRpbC56aXAuWmlwRmlsZSBuZXdaaXBGaWxlKSB7Ci0JCXppcEZpbGUgPSBuZXdaaXBGaWxlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBlbXB0eSBkaXJlY3RvcmllcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIAotCSAqIGZpbGUgbGlzdCBvZiB0aGlzIGFyY2hpdmUuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8ge0BsaW5rICNBcmNoaXZlVXRpbC5JTkNMVURFX0VNUFRZX0RJUkVDVE9SSUVTfQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlRW1wdHlEaXJlY3RvcmllcyA9IEFyY2hpdmVVdGlsLklOQ0xVREVfRU1QVFlfRElSRUNUT1JJRVM7Ci0JCi0JLyoqCi0JICogSWYgdGhpcyB2YWx1ZSBoYXMgbm90IGJlZW4gc2V0LCB0aGUgZGVmYXVsdCBpcyBkZWZpbmVkIGJ5IHtAbGluayAjQXJjaGl2ZVV0aWwuSU5DTFVERV9FTVBUWV9ESVJFQ1RPUklFU30uCi0JICogCi0JICogSWYgdGhpcyB2YWx1ZSBpcyA8Y29kZT50cnVlPjwvY29kZT4gdGhlbiBlbXB0eSBkaXJlY3RvcmllcyB3aWxsIGJlIGluY2x1ZGVkIGluIHtAbGluayAjZ2V0RmlsZXMoKX0uCi0JICogCi0JICogQHNlZSAjc2V0SW5jbHVkZUVtcHR5RGlyZWN0b3JpZXMoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVFbXB0eURpcmVjdG9yaWVzKCkgewotCQlyZXR1cm4gaW5jbHVkZUVtcHR5RGlyZWN0b3JpZXM7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyB2YWx1ZSBoYXMgbm90IGJlZW4gc2V0LCB0aGUgZGVmYXVsdCBpcyBkZWZpbmVkIGJ5IHtAbGluayAjQXJjaGl2ZVV0aWwuSU5DTFVERV9FTVBUWV9ESVJFQ1RPUklFU30uCi0JICogCi0JICogQHNlZSAjaXNJbmNsdWRlRW1wdHlEaXJlY3RvcmllcygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZUVtcHR5RGlyZWN0b3JpZXMoYm9vbGVhbiBpbmNsdWRlRW1wdHlEaXJlY3RvcmllcykgewotCQl0aGlzLmluY2x1ZGVFbXB0eURpcmVjdG9yaWVzID0gaW5jbHVkZUVtcHR5RGlyZWN0b3JpZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmVlMGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1ppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJldmlzaXQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgY29uY3JldGUgaW1wbGVudGF0aW9uIG9mIFNhdmVTdHJhdGVneS4gQWxsIHRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSwgaW5jbHVkaW5nIHhtaQotICogcmVzb3VyY2VzLCB3aWxsIGJlIG91dHB1dCB0byBhIFppcE91dHB1dFN0cmVhbS4gVGhlIG91dHB1dCBzdHJlYW0gc2hvdWxkIGJlIHBhc3NlZCBpbiBieSB0aGUKLSAqIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIFppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBTYXZlU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgU2F2ZVN0cmF0ZWd5IHsKLQlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uU3RyZWFtOwotCS8qKiBVc2VkIGludGVybmFsbHkgKi8KLQlwcm90ZWN0ZWQgWmlwT3V0cHV0U3RyZWFtIHppcE91dHB1dFN0cmVhbTsKLQotCS8qKgotCSAqIFdyYXBzIGEgbmV3IHppcCBvdXRwdXQgc3RyZWFtIGFyb3VuZCB0aGUgcGFyYW1ldGVyCi0JICovCi0JcHVibGljIFppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwoT3V0cHV0U3RyZWFtIG91dCkgewotCQlzZXREZXN0aW5hdGlvblN0cmVhbShvdXQpOwotCQlzZXRaaXBPdXRwdXRTdHJlYW0obmV3IFppcE91dHB1dFN0cmVhbShvdXQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldERlc3RpbmF0aW9uU3RyZWFtKCkuY2xvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZU5lc3RlZFNhdmVTdHJhdGVneShBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlyZXR1cm4gbmV3IFppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwoZ2V0WmlwT3V0cHV0U3RyZWFtKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldFppcE91dHB1dFN0cmVhbSgpLmZpbmlzaCgpOwotCQkvL0lmIHRoaXMgaXMgbm90IG5lc3RlZCwgY2xvc2UgdGhlIHN0cmVhbSB0byBmcmVlIHVwIHRoZSByZXNvdXJjZQotCQkvL290aGVyd2lzZSwgZG9uJ3QgY2xvc2UgaXQgYmVjYXVzZSB0aGUgcGFyZW50IG1heSBub3QgYmUgZG9uZQotCQlpZiAoIShnZXREZXN0aW5hdGlvblN0cmVhbSgpIGluc3RhbmNlb2YgWmlwT3V0cHV0U3RyZWFtKSkKLQkJCWdldERlc3RpbmF0aW9uU3RyZWFtKCkuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEuaW8uT3V0cHV0U3RyZWFtCi0JICovCi0JcHVibGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldERlc3RpbmF0aW9uU3RyZWFtKCkgewotCQlyZXR1cm4gZGVzdGluYXRpb25TdHJlYW07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Gb3JSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFppcE91dHB1dFN0cmVhbSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kjc2F2ZU1vZlJlc291cmNlKFJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNb2ZSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJldmlzaXQucmV2aXNpdCgpOwotCQlVUkkgdXJpID0gYVJlc291cmNlLmdldFVSSSgpOwotCQkvL0Vuc3VyZSBjb250YWluZXIgcmVsYXRpdmUgVVJJCi0JCVVSSUNvbnZlcnRlciBjb252ID0gZ2V0QXJjaGl2ZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCWlmIChjb252IGluc3RhbmNlb2YgQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlcikKLQkJCXVyaSA9ICgoQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlcikgY29udikuZGVOb3JtYWxpemUodXJpKTsKLQkJWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkodXJpLnRvU3RyaW5nKCkpOwotCQl6aXBPdXRwdXRTdHJlYW0ucHV0TmV4dEVudHJ5KGVudHJ5KTsKLQkJc3VwZXIuc2F2ZU1vZlJlc291cmNlKGFSZXNvdXJjZSwgb3V0KTsKLQkJemlwT3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtCi0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtIGdldFppcE91dHB1dFN0cmVhbSgpIHsKLQkJcmV0dXJuIHppcE91dHB1dFN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdCBhTWFuaWZlc3QpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IG5ldyBaaXBFbnRyeShKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JCQlnZXRaaXBPdXRwdXRTdHJlYW0oKS5wdXROZXh0RW50cnkoZW50cnkpOwotCQkJYU1hbmlmZXN0LndyaXRlKGdldFppcE91dHB1dFN0cmVhbSgpKTsKLQkJCWdldFppcE91dHB1dFN0cmVhbSgpLmNsb3NlRW50cnkoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkksIGlveCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkoYW5BcmNoaXZlLmdldFVSSSgpKTsKLQkJCWdldFppcE91dHB1dFN0cmVhbSgpLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0JCQlzdXBlci5zYXZlKGFuQXJjaGl2ZSk7Ci0JCQlnZXRaaXBPdXRwdXRTdHJlYW0oKS5jbG9zZUVudHJ5KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKGFuQXJjaGl2ZS5nZXRVUkkoKSwgaW94KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoRmlsZSBhRmlsZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZW50cnlOYW1lID0gYUZpbGUuZ2V0VVJJKCk7Ci0JCQlpZiAoYUZpbGUuaXNEaXJlY3RvcnlFbnRyeSgpICYmICFlbnRyeU5hbWUuZW5kc1dpdGgoIi8iKSkvLyROT04tTkxTLTEkCi0JCQkJZW50cnlOYW1lID0gZW50cnlOYW1lICsgJy8nOwotCQkJWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkoZW50cnlOYW1lKTsKLQkJCWlmIChhRmlsZS5nZXRMYXN0TW9kaWZpZWQoKSA+IDApCi0JCQkJZW50cnkuc2V0VGltZShhRmlsZS5nZXRMYXN0TW9kaWZpZWQoKSk7Ci0JCQlnZXRaaXBPdXRwdXRTdHJlYW0oKS5wdXROZXh0RW50cnkoZW50cnkpOwotCQkJaWYgKCFhRmlsZS5pc0RpcmVjdG9yeUVudHJ5KCkpIHsKLQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsLmNvcHkoaW4sIGdldFppcE91dHB1dFN0cmVhbSgpKTsKLQkJCX0KLQkJCWdldFppcE91dHB1dFN0cmVhbSgpLmNsb3NlRW50cnkoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYUZpbGUuZ2V0VVJJKCksIGlveCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3RGVzdGluYXRpb25TdHJlYW0KLQkgKiAgICAgICAgICAgIGphdmEuaW8uT3V0cHV0U3RyZWFtCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb25TdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0gbmV3RGVzdGluYXRpb25TdHJlYW0pIHsKLQkJZGVzdGluYXRpb25TdHJlYW0gPSBuZXdEZXN0aW5hdGlvblN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3WmlwT3V0cHV0U3RyZWFtCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFppcE91dHB1dFN0cmVhbShqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbSBuZXdaaXBPdXRwdXRTdHJlYW0pIHsKLQkJemlwT3V0cHV0U3RyZWFtID0gbmV3WmlwT3V0cHV0U3RyZWFtOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxNDFiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0FyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBDbGFzcyBsb2FkZXIgd2hpY2ggbG9hZHMgYSBnaXZlbiBzZXQgb2YgY2xhc3NlcyBzdG9yZWQgaW4gYnl0ZSBhcnJheXMuIChBc3N1bXB0aW9uOiBTeXN0ZW0KLSAqIGNsYXNzZXMgYW5kIHRob3NlIGluIHRoZSBzZXQgYXJlIHRoZSBvbmx5IGNsYXNzZXMgbmVlZGVkIHRvIHJlc29sdmUgZWFjaCBvbmUpCi0gKi8KLQotcHVibGljIGNsYXNzIEFyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgeyAgICAKLQlwcm90ZWN0ZWQgQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZXh0cmFDbGFzc0xvYWRlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbkVBUkZpbGU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QUk9UT0NPTCA9ICJhcmNoaXZlIjsKLQlwcml2YXRlIEFyY2hpdmVVUkxTdHJlYW1IYW5kbGVyIGhhbmRsZXI7Ci0gICAgCi0JcHJvdGVjdGVkIFByb3RlY3Rpb25Eb21haW4gcHJvdGVjdGlvbkRvbWFpbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5UaGlzIGNvbnN0cnVjdG9yIGFjY2VwdHMgYSBwcm90ZWN0aW9uIGRvbWFpbiwgd2hpY2ggaXMgdXNlZAotICAgICAqIGJ5IDxjb2RlPmZpbmRDbGFzczwvY29kZT4uPC9wPgotICAgICAqIAotICAgICAqIEBzZWUgQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIjZmluZENsYXNzKFN0cmluZykKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIoQXJjaGl2ZSBhbkFyY2hpdmUsIENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsLCBQcm90ZWN0aW9uRG9tYWluIHBEb21haW4pIHsKLSAgICAgICAgc3VwZXIocGFyZW50Q2wpOwotICAgICAgICBzZXRBcmNoaXZlKGFuQXJjaGl2ZSk7Ci0gICAgICAgIHNldEV4dHJhQ2xhc3NMb2FkZXIoZXh0cmFDbCk7Ci0gICAgICAgIGluRUFSRmlsZSA9IGFuQXJjaGl2ZS5nZXRDb250YWluZXIoKSAhPSBudWxsICYmIGFuQXJjaGl2ZS5nZXRDb250YWluZXIoKS5pc0VBUkZpbGUoKTsKLSAgICAgICAgaGFuZGxlciA9IG5ldyBBcmNoaXZlVVJMU3RyZWFtSGFuZGxlcigpOwotICAgICAgICBwcm90ZWN0aW9uRG9tYWluID0gcERvbWFpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIoQXJjaGl2ZSBhbkFyY2hpdmUsIENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsKSB7Ci0gICAgICAgIHRoaXMoYW5BcmNoaXZlLCBwYXJlbnRDbCwgZXh0cmFDbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+TG9hZHMgYSBzcGVjaWZpZWQgY2xhc3MuICBDYWxsZWQgb25seSBhZnRlciB0aGUgcGFyZW50IGNsYXNzIGxvYWRlciBoYXMgaGFkCi0gICAgICogaXRzIGNoYW5jZSB0byBsb2FkIHRoZSBjbGFzcywgYXMgcGVyIHRoZSBKYXZhMiBkZWxlZ2F0aW9uIG1vZGVsLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5XaGVuIG5vbi1udWxsLCB0aGUgcmVjZWl2ZXIncyBwcm90ZWN0aW9uCi0gICAgICogZG9tYWluIGlzIHBhc3NlZCBpbiB0byB0aGUgY2FsbCB0byA8Y29kZT5kZWZpbmVDbGFzczwvY29kZT4uPC9wPgotICAgICAqIAotICAgICAqIEBzZWUgQ2xhc3NMb2FkZXIjZGVmaW5lQ2xhc3MoU3RyaW5nLCBieXRlW10sIGludCkKLSAgICAgKiBAc2VlIENsYXNzTG9hZGVyI2RlZmluZUNsYXNzKFN0cmluZywgYnl0ZVtdLCBpbnQsIFByb3RlY3Rpb25Eb21haW4pCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCi0JCUNsYXNzIHJlc3VsdDsKLQkJLy8gTG9hZCBjbGFzcyBieXRlcyBmcm9tIGN1cnJlbnQgc2V0IG9mIGNsYXNzIGJ5dGVbXSdzCi0JCWJ5dGVbXSBieXRlcyA9IGdldENsYXNzQnl0ZXNGb3IobmFtZSk7Ci0KLQkJaWYgKGJ5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICggcHJvdGVjdGlvbkRvbWFpbiA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlZmluZUNsYXNzKG5hbWUsIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZpbmVDbGFzcyhuYW1lLCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoLCBwcm90ZWN0aW9uRG9tYWluKTsgCi0gICAgICAgICAgICB9Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLQkJCX0gLy8gZW5kaWYKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwotCQl9IC8vIGVuZGlmCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMDAgOTo1OTo1NyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXByaXZhdGUgYnl0ZVtdIGdldERhdGEoRmlsZSBmaWxlKSB7Ci0JCWlmIChudWxsICE9IGZpbGUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEFyY2hpdmVVdGlsLmlucHV0U3RyZWFtVG9CeXRlcyhmaWxlLmdldElucHV0U3RyZWFtKCkpOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5pb19leF9sb2FkaW5nX0VYQ18sIChuZXcgT2JqZWN0W117ZmlsZS5nZXROYW1lKCl9KSksIGUpOyAvLyA9ICJBbiBJTyBleGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyAiCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZ2V0Q2xhc3NCeXRlc0ZvcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBDaGFuZ2UgdGhlIGNsYXNzIG5hbWUgdG8gYSBqYXIgZW50cnkgbmFtZQotCQlTdHJpbmcgamFyRW50cnlOYW1lID0gQXJjaGl2ZVV0aWwuY2xhc3NOYW1lVG9VcmkoY2xhc3NOYW1lKTsKLQkJcmV0dXJuIGdldERhdGEoZ2V0RmlsZShqYXJFbnRyeU5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRUFSRmlsZSBnZXRFQVJGaWxlKCkgewotCQlyZXR1cm4gKEVBUkZpbGUpIGdldEFyY2hpdmUoKS5nZXRDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yMS8wMCA2OjU4OjA1IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRFeHRyYUNsYXNzTG9hZGVyKCkgewotCQlyZXR1cm4gZXh0cmFDbGFzc0xvYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGZvciBkeW5hbWljIGNsYXNzIGxvYWRpbmcgaW4gZGVwZW5kZW50IGphcnMgaW4gZWFyczsgdGhlIHNldCBpcyB1c2VkIHRvIHRlcm1pbmF0ZSBhCi0JICogY3ljbGUgaWYgb25lIGV4aXN0czsgdGhlIGN5Y2xlIGlzIGludmFsaWQsIGJ1dCB5b3UgbmV2ZXIga25vdyB3aGF0IHBlb3BsZSBtaWdodCB0cnkuLi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSwgU2V0IHZpc2l0ZWRBcmNoaXZlcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAodmlzaXRlZEFyY2hpdmVzLmNvbnRhaW5zKGdldEFyY2hpdmUoKSkpCi0JCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLQkJdmlzaXRlZEFyY2hpdmVzLmFkZChnZXRBcmNoaXZlKCkpOwotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhuYW1lLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBsb2FkQ2xhc3NJbkRlcGVuZGVudEphckluRUFSKG5hbWUsIHZpc2l0ZWRBcmNoaXZlcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSwgYm9vbGVhbiByZXNvbHZlKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIubG9hZENsYXNzKG5hbWUsIHJlc29sdmUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzcyBjID0gbG9hZENsYXNzSW5EZXBlbmRlbnRKYXIobmFtZSk7Ci0JCQlpZiAoYyAhPSBudWxsICYmIHJlc29sdmUpCi0JCQkJcmVzb2x2ZUNsYXNzKGMpOwotCQkJcmV0dXJuIGM7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzSW5EZXBlbmRlbnRKYXIoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQotCQlpZiAoaW5FQVJGaWxlKSB7Ci0JCQlyZXR1cm4gbG9hZENsYXNzSW5EZXBlbmRlbnRKYXJJbkVBUihuYW1lKTsKLQkJfSBlbHNlIGlmIChnZXRFeHRyYUNsYXNzTG9hZGVyKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEV4dHJhQ2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobmFtZSk7Ci0JCX0KLQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzIGxvYWRDbGFzc0luRGVwZW5kZW50SmFySW5FQVIoU3RyaW5nIG5hbWUsIFNldCB2aXNpdGVkQXJjaGl2ZXMpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG9iaiA9IGdldFJlc291cmNlSW5EZXBlbmRlbnRKYXJJbkVBUihuYW1lLCB2aXNpdGVkQXJjaGl2ZXMsIENMQVNTX1RZUEUpOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwotCQl9Ci0JCXJldHVybiAoQ2xhc3MpIG9iajsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzSW5EZXBlbmRlbnRKYXJJbkVBUihTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlPYmplY3Qgb2JqID0gZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKG5hbWUsIENMQVNTX1RZUEUpOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwotCQl9Ci0JCXJldHVybiAoQ2xhc3MpIG9iajsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBnZXRGaWxlRnJvbURlcGVuZGVudEphcihTdHJpbmcgbmFtZSkgewotCQlPYmplY3Qgb2JqID0gZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKG5hbWUsIEZJTEVfVFlQRSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJcmV0dXJuIChGaWxlKSBvYmo7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfVFlQRSA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFID0gMTsKLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKFN0cmluZyBuYW1lLCBpbnQgdHlwZSkgewotCQlTZXQgdmlzaXRlZEFyY2hpdmVzID0gbmV3IEhhc2hTZXQoNSk7Ci0JCXZpc2l0ZWRBcmNoaXZlcy5hZGQoZ2V0QXJjaGl2ZSgpKTsKLQkJcmV0dXJuIGdldFJlc291cmNlSW5EZXBlbmRlbnRKYXJJbkVBUihuYW1lLCB2aXNpdGVkQXJjaGl2ZXMsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKFN0cmluZyBuYW1lLCBTZXQgdmlzaXRlZEFyY2hpdmVzLCBpbnQgdHlwZSkgewotCQlTdHJpbmdbXSBjbGFzc3BhdGggPSBhcmNoaXZlLmdldE1hbmlmZXN0KCkuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB1cmkgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShjbGFzc3BhdGhbaV0sIGFyY2hpdmUpOwotCQkJCWlmICh1cmkgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJRmlsZSBqYXJGaWxlID0gZ2V0RUFSRmlsZSgpLmdldEZpbGUodXJpKTsKLQkJCQlpZiAoamFyRmlsZS5pc0FyY2hpdmUoKSkgewotCQkJCQlBcmNoaXZlIGRlcCA9IChBcmNoaXZlKSBqYXJGaWxlOwotCQkJCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQkJCWNhc2UgQ0xBU1NfVFlQRSA6Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcmV0dXJuICgoQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIpIGRlcC5nZXRBcmNoaXZlQ2xhc3NMb2FkZXIoKSkubG9hZENsYXNzKG5hbWUsIHZpc2l0ZWRBcmNoaXZlcyk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBub0RpY2UpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJY2FzZSBGSUxFX1RZUEUgOgotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXJldHVybiBkZXAuZ2V0RmlsZShuYW1lKTsKLQkJCQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gbm9EaWNlKSB7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGRlcEphck5vdEluRUFSKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMDAgOTo1OTo1NyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3QXJjaGl2ZQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZShBcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJYXJjaGl2ZSA9IG5ld0FyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjEvMDAgNjo1ODowNSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXh0cmFDbGFzc0xvYWRlcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0cmFDbGFzc0xvYWRlcihqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgbmV3RXh0cmFDbGFzc0xvYWRlcikgewotCQlleHRyYUNsYXNzTG9hZGVyID0gbmV3RXh0cmFDbGFzc0xvYWRlcjsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gZ2V0RmlsZShuYW1lKTsKLQkJCWlmIChudWxsICE9IGZpbGUpIHsKLQkJCQlyZXR1cm4gZmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5pb19leF9sb2FkaW5nX0VYQ18sIChuZXcgT2JqZWN0W117bmFtZX0pKSwgZSk7IC8vID0gIkFuIElPIGV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nICIKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBnZXRGaWxlRnJvbUFyY2hpdmUoU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRBcmNoaXZlKCkuZ2V0RmlsZShuYW1lKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSkgewotCQlGaWxlIGZpbGUgPSBnZXRGaWxlRnJvbUFyY2hpdmUobmFtZSk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCWZpbGUgPSBnZXRGaWxlRnJvbURlcGVuZGVudEphcihuYW1lKTsKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJMIGZpbmRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewotCQlpZiAoZ2V0RmlsZShuYW1lKSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgVVJMKG51bGwsIFVSTF9QUk9UT0NPTCArICI6Ly8iICsgbmFtZSwgaGFuZGxlcik7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBBcmNoaXZlVVJMU3RyZWFtSGFuZGxlciBleHRlbmRzIFVSTFN0cmVhbUhhbmRsZXIgewotCQlwdWJsaWMgQXJjaGl2ZVVSTFN0cmVhbUhhbmRsZXIoKSB7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbihVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJcmV0dXJuIG5ldyBBcmNoaXZlVVJMQ29ubmVjdGlvbih1cmwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBBcmNoaXZlVVJMQ29ubmVjdGlvbiBleHRlbmRzIFVSTENvbm5lY3Rpb24gewotCQlwcml2YXRlIFN0cmluZyByZXNvdXJjZU5hbWU7Ci0KLQkJcHJvdGVjdGVkIEFyY2hpdmVVUkxDb25uZWN0aW9uKFVSTCB1cmwpIHsKLQkJCXN1cGVyKHVybCk7Ci0JCQlyZXNvdXJjZU5hbWUgPSB1cmwudG9TdHJpbmcoKS5zdWJzdHJpbmcoVVJMX1BST1RPQ09MLmxlbmd0aCgpICsgMyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZU5hbWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0FyY2hpdmVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0FyY2hpdmVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MDUxNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9BcmNoaXZlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklNYXBwaW5nUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFVUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5HZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLlhtbERvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdG8gaG9sZCBoZWxwZXIgbWV0aG9kcyBjb21tb24gdG8gbXVsdGlwbGUgY2xhc3NlcyBpbiB0aGUgYXJjaGl2ZSBzdXBwb3J0Ci0gKiBwYWNrYWdlcwotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZVV0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9DTEFTUyA9ICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfSkFWQSA9ICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9TUUxKID0gIi5zcWxqIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9KU1AgPSAiLmpzcCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1J1bnRpbWUgPSBmYWxzZTsKLQotCS8qKgotCSAqIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgdGVtcCBkaXJlY3Rvcnkgc2hvdWxkIGJlIHVzZWQgZm9yIGV4dHJhY3RpbmcgbmVzdGVkIGphcnMgZm9yCi0JICogcmVhZDsgZGVmYXVsdHMgdG8gdHJ1ZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBzaG91bGRVc2VUZW1wRGlyZWN0b3J5Rm9yUmVhZCA9IHRydWU7Ci0KLQkvKioKLQkgKiBTZXR0YWJsZSBuYW1lIGZvciB0aGUgdGVtcCBkaXJlY3Rvcnk7IG11c3QgcmVzb2x2ZSB0byBhIHZhbGlkIGZpbGUgb24gdGhlIGZpbGUgc3lzdGVtOyBpZiBub3QKLQkgKiBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB0ZW1wRGlyZWN0b3J5TmFtZTsKLQotCXByb3RlY3RlZCBzdGF0aWMgamF2YS5pby5GaWxlIHRlbXBEaXJlY3Rvcnk7Ci0JCi0JLyoqCi0JICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGVtcHR5IGRpcmVjdG9yaWVzIHNob3VsZCBiZSBpbmNsdWRlZCBkdXJpbmcgaW1wb3J0OyBkZWZhdWx0cyB0byB0cnVlLgotCSAqIAotCSAqIEBzZWUgWmlwRmlsZUxvYWRTdHJhdGVneUltcGwjaXNJbmNsdWRlRW1wdHlEaXJlY3RvcmllcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIElOQ0xVREVfRU1QVFlfRElSRUNUT1JJRVMgPSB0cnVlOwotCQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lVG9KYXZhVXJpKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKS5jb25jYXQoRE9UX0pBVkEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZVRvVXJpKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKS5jb25jYXQoRE9UX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgYSBnaXZlbiB1cmkgb2YgYSAuY2xhc3MgZmlsZSwgZGVyaXZlIHRoZSB1cmkgb2YgdGhlIC5qYXZhIGZpbGU7IHRha2VzIGludG8gY29uc2lkZXJhdGlvbgotCSAqIGlubmVyIGNsYXNzZXMgYnkgc3BsaXR0aW5nIG9uIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICckJwotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGEgdXJpIG9yIG51bGwgaWYgdGhlIGlucHV0IGlzIG51bGwgb3IgZG9lc24ndCBlbmQgd2l0aCAiLmNsYXNzIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzVXJpVG9KYXZhVXJpKFN0cmluZyBjbGFzc1VyaSkgewotCQlpZiAoY2xhc3NVcmkgPT0gbnVsbCB8fCAhY2xhc3NVcmkuZW5kc1dpdGgoRE9UX0NMQVNTKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB0cnVuY2F0ZWQgPSB0cnVuY2F0ZUlnbm9yZUNhc2UoY2xhc3NVcmksIERPVF9DTEFTUyk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRydW5jYXRlZCwgIiQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdG9rLm5leHRUb2tlbigpLmNvbmNhdChET1RfSkFWQSk7Ci0JfQotCi0JLyoqCi0JICogQ29uY2F0ZW5hdGVzIHRoZSB0d28gc3RyaW5ncyB3aXRoIGEgc2VwYXJhdG9yLCBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jYXRVcmkoU3RyaW5nIGRpcmVjdG9yeW5hbWUsIFN0cmluZyBmaWxlbmFtZSwgY2hhciBzZXBhcmF0b3IpIHsKLQkJU3RyaW5nIHVyaSA9IGRpcmVjdG9yeW5hbWU7Ci0JCWlmICghZGlyZWN0b3J5bmFtZS5lbmRzV2l0aChzZXBhcmF0b3IgKyAiIikgJiYgIWZpbGVuYW1lLnN0YXJ0c1dpdGgoc2VwYXJhdG9yICsgIiIpKSAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJdXJpID0gdXJpICsgc2VwYXJhdG9yOwotCQlyZXR1cm4gdXJpICsgZmlsZW5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQgc3RyZWFtIHVwIHVudGlsIHRoZSBmaXJzdCBlbmQgb2YgZmlsZQotCSAqIGNoYXJhY3RlciwgYW5kIGNsb3NlIHRoZSB0d28gc3RyZWFtcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0JCXRyeSB7Ci0JCQlpbnQgbiA9IGluLnJlYWQoYnVmZmVyKTsKLQkJCXdoaWxlIChuID4gMCkgewotCQkJCW91dC53cml0ZShidWZmZXIsIDAsIG4pOwotCQkJCW4gPSBpbi5yZWFkKGJ1ZmZlcik7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoIShpbiBpbnN0YW5jZW9mIFppcElucHV0U3RyZWFtKSkKLQkJCQlpbi5jbG9zZSgpOwotCQkJaWYgKCEob3V0IGluc3RhbmNlb2YgWmlwT3V0cHV0U3RyZWFtKSkKLQkJCQlvdXQuY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRGlyZWN0b3J5KFN0cmluZyBiYXNlTmFtZSwgRmlsZSBwYXJlbnREaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJRmlsZSB0ZW1wRmlsZSA9IGNyZWF0ZVRlbXBGaWxlKGJhc2VOYW1lLCBwYXJlbnREaXJlY3RvcnkpOwotCQl0ZW1wRmlsZS5kZWxldGUoKTsKLQkJdGVtcEZpbGUubWtkaXIoKTsKLQkJcmV0dXJuIHRlbXBGaWxlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRmlsZShTdHJpbmcgYmFzZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZW1wRmlsZShiYXNlTmFtZSwgZ2V0VGVtcERpcmVjdG9yeSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIGJhc2VOYW1lLCBGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWVUYWlsKGJhc2VOYW1lKTsKLQkJaWYgKGZpbGVOYW1lLmxlbmd0aCgpIDwgMykgewotCQkJZmlsZU5hbWUgPSAiV1NUTVAiICsgZmlsZU5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShmaWxlTmFtZSwgbnVsbCwgZGlyZWN0b3J5KTsKLQkJcmV0dXJuIHRlbXBGaWxlOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZXMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtOyBmb3IgZGlyZWN0b3JpZXMsIHJlY3Vyc2UgdGhlIHN1YmRpcmVjdG9yaWVzIGFuZCBkZWxldGUKLQkgKiB0aGVtIGFzIHdlbGwKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bDsgZmFsc2UgaWYgYW55IGZpbGUgb3Igc3ViIGZpbGUgY291bGQgbm90IGJlIGRlbGV0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlKEZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGFGaWxlLmxpc3RGaWxlcygpOwotCQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghZGVsZXRlKGZpbGVzW2ldKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFGaWxlLmRlbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgYSBsaXN0IG9mIGFsbCBmaWxlcywgcmVjdXJzaXZlLCB0aGF0IGNhbid0IGJlIHdyaXR0ZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V3JpdGVQcm90ZWN0ZWRGaWxlcyhGaWxlIGFGaWxlLCBMaXN0IGFMaXN0KSB7Ci0JCWlmIChhTGlzdCA9PSBudWxsKQotCQkJYUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChhRmlsZS5leGlzdHMoKSAmJiAhYUZpbGUuY2FuV3JpdGUoKSkKLQkJCWFMaXN0LmFkZChhRmlsZSk7Ci0JCWlmIChhRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBhRmlsZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlnZXRXcml0ZVByb3RlY3RlZEZpbGVzKGZpbGVzW2ldLCBhTGlzdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFMaXN0OwotCX0KLQotCS8qKgotCSAqIDxwPkFsdGVybmF0ZSBtZXRob2QgZm9yIHJlc29sdmluZyBjbGFzcyBwYXRoIGVudHJpZXMuPC9wPgotCSAqIAotCSAqIDxwPk5vdGU6IE5vdCBzdXJlIHdoYXQgdGhpcyBpcyBmb3IsIGFzIGEgY2xhc3NwYXRoCi0JICogZW50cnkgc3VjaCBhcyAiLi4vdGFyZ2V0SmFyLmphciIgc2VlbXMgaW52YWxpZCwgYXMgaXQKLQkgKiByZWFjaGVzIG91dHNpZGUgb2YgdGhlIEVBUiBkaXJlY3RvcnkuPC9wPgotCSAqIAotCSAqIDxwPldoaWxlIHRoaXMgbWV0aG9kIHdpbGwgcmVtb3ZlICIuLyIgZnJvbSBhIGNsYXNzcGF0aCBlbnRyeSwKLQkgKiBpdCB3aWxsIG5vdCByZW1vdmUgIi4uLyIsIHdoaWNoIHdpbGwgYmUgYWRkZWQgYmFjayB3aGVuCi0JICogZGVyZXNvbHZpbmcgdGhlIGVudHJ5LiAgVGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBuYW1lIHRvIGFzc2lnbgotCSAqIHRvIGFuIGVudGl0eSBvdXRzaWRlIG9mIHRoZSBmaWxlc2V0IG9mIHRoZSBjb250YWluZXIuPC9wPgotCSAqIAotCSAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBlY2xpcHNlIFVSSSBmdW5jdGlvbiwgYXMgb3Bwb3NlZCB0byB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbiBpbiA8Y29kZT5kZXJpdmVFQVJSZWxhdGl2ZVVSSTwvY29kZT4uPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc3BhdGhFbnRyeSBUaGUgY2xhc3MtcGF0aCBlbnRyeSB3aGljaCBpcyB0byBiZSByZXNvbHZlZC4KLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgYWdhaW5zdCB3aGljaCB0byByZXNvbHZlIHRoZSBlbnRyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB0ZXh0IG9mIHRoZSByZXNvbHZlZCBlbnRyeS4KLQkgKi8KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXJpdmVSZWxhdGl2ZVVSSShTdHJpbmcgY2xhc3NwYXRoRW50cnksIENvbnRhaW5lciBjb250YWluZXIpCi0JewotCQlVUkkgY29udGFpbmVyVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoIGNvbnRhaW5lci5nZXRVUkkoKSApOwotCQkvLyAnY29udGFpbmVyLmdldFVSSSgpJyByZXR1cm5zIGEgc3RyaW5nLgotCi0JCVVSSSBlbnRyeVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKGNsYXNzcGF0aEVudHJ5KTsKLQkJCi0JCVVSSSByZXNvbHZlZFVSSSA9IGVudHJ5VVJJLnJlc29sdmUoY29udGFpbmVyVVJJKTsKLQkJVVJJIHJlY292ZXJlZFVSSSA9IHJlc29sdmVkVVJJLmRlcmVzb2x2ZShjb250YWluZXJVUkkpOwotCQkKLQkJcmV0dXJuIHJlY292ZXJlZFVSSS50b0ZpbGVTdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogTGV2ZXJhZ2UgdGhlIGphdmEuaW8uRmlsZSBhcGlzIHRvIHJlc29sdmUgdGhpbmdzIGxpa2UgIi4veHh4IiBhbmQgIi4uL3h4eCIgaW50byB1cmlzIG9mCi0JICogZW50cmllcyBpbiB0aGUgZWFyIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NwYXRoRW50cnkgLQotCSAqICAgICAgICAgICAgYSBjbGFzc3BhdGggZW50cnkgZnJvbSB0aGUgbWFuaWZlc3Qgb2YKLQkgKiBAYW5BcmNoaXZlCi0JICogQHBhcmFtIGFuQXJjaGl2ZSAtCi0JICogICAgICAgICAgICB0aGUgYXJjaGl2ZSB0byB3aGljaCB0aGUgZGVwZW5kZW50IGphciBpcyByZWxhdGl2ZQotCSAqIAotCSAqIEByZXR1cm4gYSBjYW5hbm9uaWNhbGl6ZWQgcmVsYXRpdmUgdXJpIG9mIGFuIGVudHJ5IGluIGFuIGVhciBmaWxlIHJlcHJlc2VudGluZyB0aGUgZGVwZW5kZW50Ci0JICogICAgICAgICBqYXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXJpdmVFQVJSZWxhdGl2ZVVSSShTdHJpbmcgY2xhc3NwYXRoRW50cnksIEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiBkZXJpdmVFQVJSZWxhdGl2ZVVSSShjbGFzc3BhdGhFbnRyeSwgYW5BcmNoaXZlLmdldFVSSSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBMZXZlcmFnZSB0aGUgamF2YS5pby5GaWxlIGFwaXMgdG8gcmVzb2x2ZSB0aGluZ3MgbGlrZSAiLi94eHgiIGFuZCAiLi4veHh4IiBpbnRvIHVyaXMgb2YKLQkgKiBlbnRyaWVzIGluIHRoZSBlYXIgZmlsZQotCSAqIAotCSAqIEBwYXJhbSBjbGFzc3BhdGhFbnRyeSAtCi0JICogICAgICAgICAgICBhIGNsYXNzcGF0aCBlbnRyeSBmcm9tIHRoZSBtYW5pZmVzdCBvZiBhbiBhcmNoaXZlCi0JICogQHBhcmFtIFN0cmluZyAtCi0JICogICAgICAgICAgICB0aGUgdXJpIG9mIHRoZSBhcmNoaXZlIHRvIHdoaWNoIHRoZSBkZXBlbmRlbnQgamFyIGlzIHJlbGF0aXZlCi0JICogCi0JICogQHJldHVybiBhIGNhbmFub25pY2FsaXplZCByZWxhdGl2ZSB1cmkgb2YgYW4gZW50cnkgaW4gYW4gZWFyIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBkZXBlbmRlbnQKLQkgKiAgICAgICAgIGphcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcml2ZUVBUlJlbGF0aXZlVVJJKFN0cmluZyBjbGFzc3BhdGhFbnRyeSwgU3RyaW5nIGFyY2hpdmVVcmkpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXJlbnQgPSBnZXRGaWxlTmFtZVBhcmVudChhcmNoaXZlVXJpKTsKLQkJCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXBhcmVudCA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHdvcmtpbmdEaXIgPSBuZXcgamF2YS5pby5GaWxlKCIuIikuZ2V0Q2Fub25pY2FsUGF0aCgpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVN0cmluZyByZXNvbHZlZFBhdGggPSBuZXcgamF2YS5pby5GaWxlKHBhcmVudCwgY2xhc3NwYXRoRW50cnkpLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCWlmICghcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgod29ya2luZ0RpcikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAocmVzb2x2ZWRQYXRoLmVxdWFscyh3b3JraW5nRGlyKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWludCBzdGFydCA9IHdvcmtpbmdEaXIuZW5kc1dpdGgoamF2YS5pby5GaWxlLnNlcGFyYXRvcikgPyB3b3JraW5nRGlyLmxlbmd0aCgpIDogd29ya2luZ0Rpci5sZW5ndGgoKSArIDE7Ci0JCQlyZXR1cm4gcmVzb2x2ZWRQYXRoLnN1YnN0cmluZyhzdGFydCwgcmVzb2x2ZWRQYXRoLmxlbmd0aCgpKS5yZXBsYWNlKGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL2dldENhbm9uaWNhbFBhdGggY291bGQgdGhyb3cgdGhpcwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gIiIgaWYgdGhlcmUgaXMgbm8gZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWVFeHRlbnNpb24oU3RyaW5nIHVyaSkgewotCi0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmRleCAhPSAtMSkKLQkJCQlyZXR1cm4gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpcmVjdG9yeSBmcm9tIHRoZSB1cmksIG9yIHRoZSB0cnVuY2F0aW9uIG9mIHRoZSBzZWdtZW50IGFmdGVyIHRoZSBsYXN0Ci0JICogb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVOYW1lUGFyZW50KFN0cmluZyB1cmkpIHsKLQkJaWYgKHVyaT09bnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdGVtcFVSSSA9IHVyaS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCXdoaWxlICh0ZW1wVVJJLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCXRlbXBVUkkgPSB0ZW1wVVJJLnN1YnN0cmluZygwLCB0ZW1wVVJJLmxlbmd0aCgpIC0gMSk7Ci0JCWludCBsYXN0SW5kZXggPSB0ZW1wVVJJLmxhc3RJbmRleE9mKCcvJyk7Ci0JCWlmIChsYXN0SW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAobGFzdEluZGV4ID09IDApCi0JCQlyZXR1cm4gIi8iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB1cmkuc3Vic3RyaW5nKDAsIGxhc3RJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgdXJpLCBvciB0aGUgc2VnbWVudCBhZnRlciB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWVUYWlsKFN0cmluZyB1cmkpIHsKLQkJU3RyaW5nIHRlbXBVUkkgPSB1cmkucmVwbGFjZSgnXFwnLCAnLycpOwotCQl3aGlsZSAodGVtcFVSSS5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQl0ZW1wVVJJID0gdGVtcFVSSS5zdWJzdHJpbmcoMCwgdGVtcFVSSS5sZW5ndGgoKSAtIDEpOwotCQlpbnQgbGFzdEluZGV4ID0gdGVtcFVSSS5sYXN0SW5kZXhPZignLycpOwotCQlpZiAobGFzdEluZGV4ID09IC0xKQotCQkJcmV0dXJuIHVyaTsKLQkJcmV0dXJuIHVyaS5zdWJzdHJpbmcobGFzdEluZGV4ICsgMSwgdGVtcFVSSS5sZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogRm9yIHRoZSBnaXZlbiBvYmplY3QgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgcmV0dXJuIHRoZSBvd25pbmcgbW9kdWxlIGZpbGU7IGZvcgotCSAqIGV4YW1wbGUsIHJldHJpZXZlIHRoZSBFSkJKYXJGaWxlIHRoYXQgb3ducyB0aGUgRUpCSmFyLiBUaGlzIHdvcmtzIGV2ZW4gZm9yIGFsdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZShFT2JqZWN0IGRkT2JqZWN0KSB7Ci0JCVJlc291cmNlIHJlcyA9IGRkT2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlBcmNoaXZlIGFyY2hpdmUgPSBnZXRBcmNoaXZlKHJlcyk7Ci0JCWlmIChhcmNoaXZlID09IG51bGwgfHwgIWFyY2hpdmUuaXNNb2R1bGVGaWxlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoIShyZXMgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlYTUxSZXNvdXJjZSB4bWxSZXMgPSAoWE1MUmVzb3VyY2UpIHJlczsKLQkJaWYgKHhtbFJlcy5pc0FsdCgpKQotCQkJcmV0dXJuIGdldE1vZHVsZUZpbGVVc2luZ0FsdEREKChFQVJGaWxlKSBhcmNoaXZlLCByZXMpOwotCi0JCXJldHVybiAoTW9kdWxlRmlsZSkgYXJjaGl2ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZVVzaW5nQWx0REQoRUFSRmlsZSBlYXIsIFJlc291cmNlIHJlcykgewotCQlpZiAocmVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdXJpID0gcmVzLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCU1vZHVsZSBtID0gZWFyLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlSGF2aW5nQWx0REQodXJpKTsKLQkJaWYgKG0gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2R1bGVSZWYgcmVmID0gZWFyLmdldE1vZHVsZVJlZihtKTsKLQkJaWYgKHJlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIHJlZi5nZXRNb2R1bGVGaWxlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kdWxlRmlsZVR5cGVOYW1lKGludCBtb2R1bGVUeXBlKSB7Ci0JCXN3aXRjaCAobW9kdWxlVHlwZSkgewotCQkJY2FzZSBYTUxSZXNvdXJjZS5BUFBMSUNBVElPTl9UWVBFIDoKLQkJCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5BX0FwcGxpY2F0aW9uX2ZpbGU7IAotCQkJY2FzZSBYTUxSZXNvdXJjZS5BUFBfQ0xJRU5UX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFuX0FwcGxpY2F0aW9uX0NsaWVudF9KQVJfZmlsZTsgCi0JCQljYXNlIFhNTFJlc291cmNlLkVKQl9UWVBFIDoKLQkJCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5Bbl9FSkJfSkFSX2ZpbGU7IAotCQkJY2FzZSBYTUxSZXNvdXJjZS5XRUJfQVBQX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFfV0FSX2ZpbGU7IAotCQkJY2FzZSBYTUxSZXNvdXJjZS5SQVJfVFlQRSA6Ci0JCQkJcmV0dXJuIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQV9SQVJfZmlsZTsgCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRm9yIHRoZSBnaXZlbiByZXNvdXJjZSwgcmV0dXJuIHRoZSBvd25pbmcgbW9kdWxlIGZpbGU7IGZvciBleGFtcGxlLCByZXRyaWV2ZSB0aGUgRUpCSmFyRmlsZQotCSAqIHRoYXQgb3ducyB0aGUgRUpCSmFyLiBJbiB0aGUgY2FzZSBvZiBhbHRzLCB0aGlzIHJldHVybnMgdGhlIEVBUkZpbGUgYW5kIG5vdCB0aGUgbW9kdWxlIGZpbGUuCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWw7IGNsaWVudHMgc2hvdWxkIHVzZSB7QGxpbmsgI2dldE1vZHVsZUZpbGUoRU9iamVjdCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlIGdldEFyY2hpdmUoUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVJlc291cmNlU2V0IHNldCA9IHJlcy5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoc2V0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlVUklDb252ZXJ0ZXIgY29udiA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJaWYgKGNvbnYgPT0gbnVsbCB8fCAhKGNvbnYgaW5zdGFuY2VvZiBBcmNoaXZlVVJJQ29udmVydGVySW1wbCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKChBcmNoaXZlVVJJQ29udmVydGVySW1wbCkgY29udikuZ2V0QXJjaGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbmNhdGVuYXRlcyB0aGUgdHdvIHN0cmluZ3MgYW5kIGVuc3VyZXMgdGhlIGNvcnJlY3Qgc2VwYXJhdG9yIGlzIHVzZWQgaW4gdGhlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPU1VyaShTdHJpbmcgdXJpKSB7Ci0JCWNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlpZiAoc2VwICE9ICcvJykKLQkJCXJldHVybiB1cmkucmVwbGFjZSgnLycsIHNlcCk7Ci0JCXJldHVybiB1cmkucmVwbGFjZSgnXFwnLCBzZXApOwotCX0KLQotCS8qKgotCSAqIENvbmNhdGVuYXRlcyB0aGUgdHdvIHN0cmluZ3MgYW5kIGVuc3VyZXMgdGhlIGNvcnJlY3Qgc2VwYXJhdG9yIGlzIHVzZWQgaW4gdGhlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPU1VyaShTdHJpbmcgZGlyZWN0b3J5bmFtZSwgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCVN0cmluZyBvc0Rpck5hbWUgPSBnZXRPU1VyaShkaXJlY3RvcnluYW1lKTsKLQkJU3RyaW5nIG9zRmlsZU5hbWUgPSBnZXRPU1VyaShmaWxlbmFtZSk7Ci0JCXJldHVybiBjb25jYXRVcmkob3NEaXJOYW1lLCBvc0ZpbGVOYW1lLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGV4dGVudCBvZiB0aGUgcmVzb3VyY2UKLQkgKiAKLQkgKiBAdGhyb3dzIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIHRocm93biBpZiB0aGUgZXh0ZW50IGlzIGVtcHR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGdldFJvb3QoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCUVMaXN0IGV4dGVudCA9IGFSZXNvdXJjZS5nZXRDb250ZW50cygpOwotCQlpZiAoZXh0ZW50LnNpemUoKSA8IDEpIHsKLQkJCXRocm93IG5ldyBFbXB0eVJlc291cmNlRXhjZXB0aW9uKGFSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gKEVPYmplY3QpIGV4dGVudC5nZXQoMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgZ2V0VGVtcERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRlbXBEaXJlY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMToxNjo0OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGVtcERpcmVjdG9yeU5hbWUoKSB7Ci0JCXJldHVybiB0ZW1wRGlyZWN0b3J5TmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFRva2VucyhTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gZ2V0VG9rZW5zKGFTdHJpbmcsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VG9rZW5zKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyKSB7Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IChkZWxpbWl0ZXIgPT0gbnVsbCkgPyBuZXcgU3RyaW5nVG9rZW5pemVyKGFTdHJpbmcpIDogbmV3IFN0cmluZ1Rva2VuaXplcihhU3RyaW5nLCBkZWxpbWl0ZXIpOwotCQlpbnQgc2l6ZSA9IHRvay5jb3VudFRva2VucygpOwotCQlTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgJiYgdG9rLmhhc01vcmVUb2tlbnMoKTsgaSsrKSB7Ci0JCQl0b2tlbnNbaV0gPSB0b2submV4dFRva2VuKCk7Ci0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZUlnbm9yZUtleUNhc2UgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlSWdub3JlS2V5Q2FzZShqYXZhLmxhbmcuU3RyaW5nIGtleSwgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzIGF0dHIpIHsKLQkJSXRlcmF0b3Iga2V5c0FuZFZhbHVlcyA9IGF0dHIuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoa2V5c0FuZFZhbHVlcy5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGtleXNBbmRWYWx1ZXMubmV4dCgpOwotCQkJU3RyaW5nIGVudHJ5S2V5ID0gZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKTsKLQkJCWlmIChlbnRyeUtleS5lcXVhbHNJZ25vcmVDYXNlKGtleSkpCi0JCQkJcmV0dXJuIGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCA/IG51bGwgOiBlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluZm9ybShTdHJpbmcgbWVzc2FnZSkgewotCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0luZm8obWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHVwIHVudGlsIHRoZSBmaXJzdCBlbmQgb2YgZmlsZSBjaGFyYWN0ZXIsIGFkZCB0aGlzCi0JICogZGF0YSB0byBhIGJ5dGUgYXJyYXksIGFuZCBjbG9zZSB0aGUgaW5wdXQgc3RyZWFtOyByZXR1cm5zIHRoZSBieXRlIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gaW5wdXRTdHJlYW1Ub0J5dGVzKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQljb3B5KGluLCBvdXQpOwotCQlyZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlyZXR1cm4gSmF2YVVSTC5pc0phdmFVUkwoYVJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWRVUklNYXBwaW5nKFJlc291cmNlIHJlcykgewotCQlyZXR1cm4gVVJJTWFwcGluZ1JlZ2lzdHJ5SW1wbC5JTlNUQU5DRS5nZXRVUkkocmVzLmdldFVSSSgpKSAhPSByZXMuZ2V0VVJJKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGxhdGZvcm1NZXRhUmVzb3VyY2UoUmVzb3VyY2UgcmVzKSB7Ci0JCVVSSSB1cmkgPSByZXMuZ2V0VVJJKCk7Ci0JCXJldHVybiAicGxhdGZvcm0iLmVxdWFscyh1cmkuc2NoZW1lKCkpICYmICJtZXRhIi5lcXVhbHModXJpLnNlZ21lbnQoMCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gYVN0cmluZyA9PSBudWxsIHx8IGFTdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUnVudGltZSgpIHsKLQkJcmV0dXJuIGlzUnVudGltZTsKLQl9Ci0KLQkvKioKLQkgKiBJcyBpdCB3aXRoaW4gdGhlIHNwZWMgZm9yIHRoZSBKQVIgb3IgbW9kdWxlIGZpbGUgdG8gcmVmZXJlbmNlIHRoZSBhcmNoaXZlIHZpYSB0aGUgTWFuaWZlc3QKLQkgKiBDbGFzcy1QYXRoPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRGVwZW5kZW5jeShBcmNoaXZlIHJlZmVyZW5jZWRKQVIsIEFyY2hpdmUgcmVmZXJlbmNpbmdKQVIpIHsKLQkJLy9ObyBvdGhlciBtb2R1bGVzIHNob3VsZCByZWZlcmVuY2Ugd2FycwotCQlpZiAocmVmZXJlbmNlZEpBUi5pc1dBUkZpbGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAocmVmZXJlbmNlZEpBUiA9PSByZWZlcmVuY2luZ0pBUikKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvL0NsaWVudHMgY2FuIHJlZmVyZW5jZSBhbGwgYnV0IHRoZSBXQVJzLCB3aGljaCB3ZSd2ZSBhbHJlYWR5IGNvdmVyZWQKLQkJLy8gYWJvdmU7IFdBUnMgYW5kIEVKQiBKQVJzCi0JCS8vY2FuIHJlZmVyZW5jZSBhbGwgYnV0IFdBUnMsIGFib3ZlLCBvciBBcHBsaWNhdGlvbkNsaWVudHMKLQkJcmV0dXJuIHJlZmVyZW5jaW5nSkFSLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkgfHwgIXJlZmVyZW5jZWRKQVIuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBhIHByb3BlcnRpZXMgZmlsZSB3aXRoIHRoZSBnaXZlbiB1cmkgZnJvbSB0aGUgZ2l2ZW4gYXJjaGl2ZQotCSAqIAotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFyY2hpdmUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3VycyByZWFkaW5nIHRoZSBwcm9wZXJ0aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKEFyY2hpdmUgYXJjaGl2ZSwgU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IGFyY2hpdmUuZ2V0SW5wdXRTdHJlYW0odXJpKTsKLQkJCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlwLmxvYWQoaW4pOwotCQkJcmV0dXJuIHA7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQlpbi5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldElzUnVudGltZShib29sZWFuIGFCb29sZWFuKSB7Ci0JCWlzUnVudGltZSA9IGFCb29sZWFuOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvdWxkVXNlVGVtcERpcmVjdG9yeUZvclJlYWQoYm9vbGVhbiB2YWx1ZSkgewotCQlzaG91bGRVc2VUZW1wRGlyZWN0b3J5Rm9yUmVhZCA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDE6MjY6MjggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1RlbXBEaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIGphdmEuaW8uRmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUZW1wRGlyZWN0b3J5KGphdmEuaW8uRmlsZSBuZXdUZW1wRGlyZWN0b3J5KSB7Ci0JCXRlbXBEaXJlY3RvcnkgPSBuZXdUZW1wRGlyZWN0b3J5OwotCQl0ZW1wRGlyZWN0b3J5TmFtZSA9IG5ld1RlbXBEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGVtcCBkaXJlY3RvcnkgdG8gdGhlIHNwZWNpZmllZCBwYXRoOyBjcmVhdGVzIGl0IGFuZCBzZXRzIGl0IHRvIGJlIGRlbGV0ZWQgb24gZXhpdAotCSAqIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqIAotCSAqIEBwYXJhbSBuZXdUZW1wRGlyZWN0b3J5TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEB0aHJvd3MgQXJjaGl2ZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHRocm93biBpZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGFuZCBjYW4gbm90IGJlIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGVtcERpcmVjdG9yeU5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdUZW1wRGlyZWN0b3J5TmFtZSkgdGhyb3dzIEFyY2hpdmVFeGNlcHRpb24gewotCQlqYXZhLmlvLkZpbGUgZGlyID0gbmV3IGphdmEuaW8uRmlsZShuZXdUZW1wRGlyZWN0b3J5TmFtZSk7Ci0JCWlmICghZGlyLmV4aXN0cygpKSB7Ci0JCQlkaXIubWtkaXJzKCk7Ci0JCQlpZiAoIWRpci5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgQXJjaGl2ZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLm1ha2VfdGVtcF9kaXJfRVhDXywgKG5ldyBPYmplY3RbXXtuZXdUZW1wRGlyZWN0b3J5TmFtZX0pKSk7IC8vID0gIlVuYWJsZSB0byBtYWtlIHRlbXAgZGlyZWN0b3J5OiAiCi0JCQlEZWxldGVPbkV4aXRVdGlsaXR5Lm1hcmtGb3JEZWxldGlvbihkaXIpOwotCQl9Ci0JCXNldFRlbXBEaXJlY3RvcnkoZGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xOS8wMCAxOjA4OjIwIFBNKQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRVc2VUZW1wRGlyZWN0b3J5Rm9yUmVhZCgpIHsKLQkJcmV0dXJuIHNob3VsZFVzZVRlbXBEaXJlY3RvcnlGb3JSZWFkOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGxpc3Qgb2Ygc3RyaW5nIGVsZW1lbnRzIHRvIGFuIGFycmF5IG9mIGZpbGUgVVJMczsgaWYgYW4gZW50cnkgaXMgcmVsYXRpdmUsIG1ha2UKLQkgKiBpdCByZWxhdGl2ZSB0byB0aGUgdXJpIHJvb3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubmV0LlVSTFtdIHRvTG9jYWxVUkxzKExpc3QgZW50cmllcywgU3RyaW5nIHVyaVJvb3QpIHsKLQkJTGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBwYXRoRW50cnkgPSAoU3RyaW5nKSBlbnRyaWVzLmdldChpKTsKLQkJCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aEVudHJ5KTsKLQkJCWlmICghYUZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJcGF0aEVudHJ5ID0gZ2V0T1NVcmkodXJpUm9vdCwgcGF0aEVudHJ5KTsKLQkJCQlhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aEVudHJ5KTsKLQkJCX0KLQkJCWlmICghYUZpbGUuZXhpc3RzKCkpIHsKLQkJCQkvL2luZm9ybSgiQ2xhc3NwYXRoIGVsZW1lbnQgIiArIHBhdGhFbnRyeSArICIgZG9lcyBub3QKLQkJCQkvLyBleGlzdCIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlpZiAoIXBhdGhFbnRyeS5lbmRzV2l0aChqYXZhLmlvLkZpbGUuc2VwYXJhdG9yKSkgewotCQkJCQlwYXRoRW50cnkgPSBwYXRoRW50cnkgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVppcEZpbGUgemlwID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQl6aXAgPSBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZVV0aWwubmV3WmlwRmlsZShhRmlsZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWluZm9ybShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmludmFsaWRfY2xhc3NwYXRoX1dBUk5fLCAobmV3IE9iamVjdFtde3BhdGhFbnRyeX0pKSk7IC8vID0gIkNsYXNzcGF0aCBlbGVtZW50ICJ7MH0iIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIFppcCBmaWxlIgotCQkJCQljb250aW51ZTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoemlwICE9IG51bGwpCi0JCQkJCQl0cnkgewotCQkJCQkJCXppcC5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7Ci0JCQkJCQkJLy9JZ25vcmUKLQkJCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoRW50cnkpOwotCQkJCWphdmEubmV0LlVSTCBhVXJsID0gYUZpbGUudG9VUkwoKTsgCi0JCQkJdXJscy5hZGQoYVVybCk7Ci0JCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKLQkJCQlpbmZvcm0oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5pbnZhbGlkX2NwX2ZpbGVfV0FSTl8sIChuZXcgT2JqZWN0W117cGF0aEVudHJ5fSkpKTsgLy8gPSAiQ2xhc3NwYXRoIGVsZW1lbnQgInswfSIgZG9lcyBub3QgcG9pbnQgdG8gYSBsb2NhbCBmaWxlIgotCQkJfQotCQl9Ci0JCWphdmEubmV0LlVSTFtdIHVybEFycmF5ID0gbmV3IGphdmEubmV0LlVSTFt1cmxzLnNpemUoKV07Ci0JCXJldHVybiAoamF2YS5uZXQuVVJMW10pIHVybHMudG9BcnJheSh1cmxBcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3Vic3RyaW5nIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIsIHN0YXJ0aW5nIGF0IHRoZSBlbmQgb2YgdGhlIHByZWZpeAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRydW5jYXRlRnJvbUZyb250SWdub3JlQ2FzZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIGxlYWRpbmdTdWJTdHJpbmcpIHsKLQkJaWYgKCFhU3RyaW5nLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChsZWFkaW5nU3ViU3RyaW5nLnRvTG93ZXJDYXNlKCkpKQotCQkJcmV0dXJuIGFTdHJpbmc7Ci0JCXJldHVybiBhU3RyaW5nLnN1YnN0cmluZyhsZWFkaW5nU3ViU3RyaW5nLmxlbmd0aCgpLCBhU3RyaW5nLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWJzdHJpbmcgb2YgdGhlIGZpcnN0IHBhcmFtZXRlciwgdXAgdG8gdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNlY29uZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRydW5jYXRlSWdub3JlQ2FzZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIHRyYWlsaW5nU3ViU3RyaW5nKSB7Ci0JCWludCBpbmRleCA9IGFTdHJpbmcudG9Mb3dlckNhc2UoKS5sYXN0SW5kZXhPZih0cmFpbGluZ1N1YlN0cmluZy50b0xvd2VyQ2FzZSgpKTsKLQkJaWYgKGluZGV4ICE9IC0xKQotCQkJcmV0dXJuIGFTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJcmV0dXJuIGFTdHJpbmc7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXJpVG9DbGFzc05hbWUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gdHJ1bmNhdGVJZ25vcmVDYXNlKHVyaS5yZXBsYWNlKCcvJywgJy4nKSwgRE9UX0NMQVNTKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKMkVFMTNGYXN0Q2hlY2soTW9kdWxlRmlsZSBtb2R1bGVGaWxlKSB7Ci0JCWlmIChtb2R1bGVGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgaWYgKG1vZHVsZUZpbGUuaXNSQVJGaWxlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlTdHJpbmcgdXJpID0gbW9kdWxlRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpOwotCQl0cnkgewotCQkJaW4gPSBtb2R1bGVGaWxlLmdldElucHV0U3RyZWFtKHVyaSk7Ci0KLQkJCURvY3VtZW50VHlwZSBkb2NUeXBlID0gWG1sRG9jdW1lbnRSZWFkZXIucmVhZERvY3VtZW50VHlwZShpbiwgdXJpKTsKLQkJCWlmIChkb2NUeXBlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nW10gaWRzID0gZ2V0SjJFRTEzUHVibGljQW5kU3lzdGVtSWRGb3IobW9kdWxlRmlsZSk7Ci0JCQlpZiAoaWRzID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIGlkc1swXS5lcXVhbHMoZG9jVHlwZS5nZXRQdWJsaWNJZCgpKSAmJiBpZHNbMV0uZXF1YWxzKGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGdldEoyRUUxM1B1YmxpY0FuZFN5c3RlbUlkRm9yKE1vZHVsZUZpbGUgbW9kdWxlRmlsZSkgewotCQlpZiAobW9kdWxlRmlsZS5pc0VBUkZpbGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9QVUJMSUNJRF8xXzMsIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU1lTVEVNSURfMV8zfTsKLQkJZWxzZSBpZiAobW9kdWxlRmlsZS5pc0VKQkphckZpbGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5FSkJKQVJfUFVCTElDSURfMl8wLCBKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8yXzB9OwotCQllbHNlIGlmIChtb2R1bGVGaWxlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzMsIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzN9OwotCQllbHNlIGlmIChtb2R1bGVGaWxlLmlzV0FSRmlsZSgpKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLldFQkFQUF9QVUJMSUNJRF8yXzMsIEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfM307Ci0JCWVsc2UgaWYgKG1vZHVsZUZpbGUuaXNSQVJGaWxlKCkpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuQ09OTkVDVE9SX1BVQkxJQ0lEXzFfMCwgSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU1lTVEVNSURfMV8wfTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy9UT0RPIGRvaW5nIHRoZSBwYXJzZSB3aXRoIFNBWCB3b3VsZCBiZSBmYXN0ZXIKLQlwdWJsaWMgc3RhdGljIGludCBnZXRGYXN0U3BlY1ZlcnNpb24oTW9kdWxlRmlsZSBtb2R1bGVGaWxlKSB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJU3RyaW5nIHVyaSA9IG1vZHVsZUZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKTsKLQkJdHJ5IHsKLQkJCWluID0gbW9kdWxlRmlsZS5nZXRJbnB1dFN0cmVhbSh1cmkpOwotCi0JCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IG51bGw7Ci0KLQkJCUlucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbik7Ci0JCQlHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIgYVJlYWRlciA9IG5ldyBYbWxEb2N1bWVudFJlYWRlcihzb3VyY2UpOwotCQkJYVJlYWRlci5zZXRWYWxpZGF0ZShmYWxzZSk7Ci0JCQlEb2N1bWVudCBhRG9jdW1lbnQgPSBhUmVhZGVyLnBhcnNlRG9jdW1lbnQoKTsKLQkJCWlmIChhRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWRvY1R5cGUgPSBhRG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCQkJfQotCQkJaW50IHZlcnNpb24gPSAtMTsKLQkJCWlmIChudWxsICE9IGRvY1R5cGUpIHsKLQkJCQlTdHJpbmcgcHVibGljSUQgPSBkb2NUeXBlLmdldFB1YmxpY0lkKCk7Ci0JCQkJU3RyaW5nIHN5c3RlbUlEID0gZG9jVHlwZS5nZXRTeXN0ZW1JZCgpOwotCQkJCWlmIChwdWJsaWNJRCAhPSBudWxsICYmIHN5c3RlbUlEICE9IG51bGwpIHsKLQkJCQkJdmVyc2lvbiA9IGxvb2t1cFZlcnNpb24obW9kdWxlRmlsZSwgcHVibGljSUQsIHN5c3RlbUlEKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodmVyc2lvbiA9PSAtMSkgewotCQkJCVN0cmluZyBzY2hlbWFOYW1lID0gbnVsbDsKLQkJCQlTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7Ci0JCQkJaWYgKGFEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCWlmIChudWxsID09IGRvY1R5cGUpIHsKLQkJCQkJCU5hbWVkTm9kZU1hcCBtYXAgPSBhRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJaWYgKG51bGwgIT0gbWFwKSB7Ci0JCQkJCQkJTm9kZSBzY2hlbWFOb2RlID0gbWFwLmdldE5hbWVkSXRlbSgieHNpOnNjaGVtYUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAobnVsbCAhPSBzY2hlbWFOb2RlKSB7Ci0JCQkJCQkJCXNjaGVtYU5hbWUgPSBzY2hlbWFOb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCX0KLQkJCQkJCQlOb2RlIHZlcnNpb25Ob2RlID0gbWFwLmdldE5hbWVkSXRlbSgidmVyc2lvbiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAobnVsbCAhPSB2ZXJzaW9uTm9kZSkgewotCQkJCQkJCQl2ZXJzaW9uU3RyaW5nID0gdmVyc2lvbk5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChudWxsICE9IHNjaGVtYU5hbWUpIHsKLQkJCQkJdmVyc2lvbiA9IGxvb2t1cFZlcnNpb24obW9kdWxlRmlsZSwgc2NoZW1hTmFtZSk7Ci0JCQkJfQotCQkJCWlmICh2ZXJzaW9uID09IC0xKSB7Ci0JCQkJCXZlcnNpb24gPSBwYXJzZVZlcnNpb25TdHJpbmcobW9kdWxlRmlsZSwgdmVyc2lvblN0cmluZyk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gdmVyc2lvbjsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiAtMTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VWZXJzaW9uU3RyaW5nKE1vZHVsZUZpbGUgbW9kdWxlRmlsZSwgU3RyaW5nIHZlcnNpb25BdHRyKSB7Ci0JCWludCB2ZXJzaW9uID0gLTE7Ci0JCWlmIChtb2R1bGVGaWxlLmlzRUFSRmlsZSgpKSB7Ci0JCQlpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQlpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzFfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8wX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJaWYgKG51bGwgPT0gdmVyc2lvbkF0dHIpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQl9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMl9URVhUKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc1dBUkZpbGUoKSkgewotCQkJaWYgKG51bGwgPT0gdmVyc2lvbkF0dHIpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8yX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQ7Ci0JCQl9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfM19URVhUKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzUkFSRmlsZSgpKSB7Ci0JCQlpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzBfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb247Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9va3VwVmVyc2lvbihNb2R1bGVGaWxlIG1vZHVsZUZpbGUsIFN0cmluZyBzY2hlbWFOYW1lKSB7Ci0JCWludCB2ZXJzaW9uID0gLTE7Ci0JCWlmIChtb2R1bGVGaWxlLmlzRUFSRmlsZSgpKSB7Ci0JCQlpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TQ0hFTUFfMV80KSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQlpZiAoKHNjaGVtYU5hbWUuaW5kZXhPZihKMkVFQ29uc3RhbnRzLkVKQkpBUl9TQ0hFTUFfMl8xX05TKSkgIT0gLTEpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpIHsKLQkJCWlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU0NIRU1BXzFfNCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc1dBUkZpbGUoKSkgewotCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NDSEVNQV8yXzQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc1JBUkZpbGUoKSkgewotCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NDSEVNQV8xXzUpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxvb2t1cFZlcnNpb24oTW9kdWxlRmlsZSBtb2R1bGVGaWxlLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCkgewotCQlpbnQgdmVyc2lvbiA9IC0xOwotCQlpZiAobW9kdWxlRmlsZS5pc0VBUkZpbGUoKSkgewotCQkJaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMykgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMyl8fHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0FMVF9TWVNURU1JRF8xXzMpKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCX0gZWxzZSBpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fUFVCTElDSURfMV8yKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU1lTVEVNSURfMV8yKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fQUxUX1NZU1RFTUlEXzFfMikpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc0VKQkphckZpbGUoKSkgewotCQkJaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9QVUJMSUNJRF8yXzApICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfU1lTVEVNSURfMl8wKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX0FMVF9TWVNURU1JRF8yXzApKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOwotCQkJfSBlbHNlIGlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfUFVCTElDSURfMV8xKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzFfMSl8fHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9BTFRfU1lTVEVNSURfMV8xKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzMpICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NZU1RFTUlEXzFfMyl8fHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfQUxUX1NZU1RFTUlEXzFfMykpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJfSBlbHNlIGlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMikgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8yKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9BTFRfU1lTVEVNSURfMV8yKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1BVQkxJQ0lEXzJfMykgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TWVNURU1JRF8yXzMpfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfQUxUX1NZU1RFTUlEXzJfMykpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQ7Ci0JCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9QVUJMSUNJRF8yXzIpICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8yKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX0FMVF9TWVNURU1JRF8yXzIpKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzUkFSRmlsZSgpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1BVQkxJQ0lEXzFfMCkgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzApfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfQUxUX1NZU1RFTUlEXzFfMCkpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOwotCQkJfQotCQl9Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9DbGFzc3BhdGhVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NsYXNzcGF0aFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3ZGNmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NsYXNzcGF0aFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlJ1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc01hbmlmZXN0KFN0cmluZyBpblBhdGgsIExpc3QgcnRDbGFzc3BhdGgsIFNldCBwcm9jZXNzZWRQYXRocykgewotCQlBcnJheUxpc3QgcGF0aHMgPSBnZXRNYW5pZmVzdFBhdGhzKGluUGF0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMuc2l6ZSgpOyBpKyspIHsKLQkJCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChSdW50aW1lQ2xhc3NwYXRoRW50cnkpIHBhdGhzLmdldChpKTsKLQkJCWlmICghcHJvY2Vzc2VkUGF0aHMuY29udGFpbnMoZW50cnkpKSB7Ci0JCQkJcHJvY2Vzc2VkUGF0aHMuYWRkKGVudHJ5KTsKLQkJCQlydENsYXNzcGF0aC5hZGQoZW50cnkpOwotCQkJCXByb2Nlc3NNYW5pZmVzdChlbnRyeS5nZXRBYnNvbHV0ZVBhdGgoKSwgcnRDbGFzc3BhdGgsIHByb2Nlc3NlZFBhdGhzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgUnVudGltZUNsYXNzcGF0aEVudHJ5IGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShTdHJpbmcgYWJzb2x1dGVQYXRoLCBTdHJpbmcgbWFuaWZlc3RWYWx1ZSkgewotCQlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbCgpOwotCQllbnRyeS5zZXRBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTsKLQkJZW50cnkuc2V0TWFuaWZlc3RWYWx1ZShtYW5pZmVzdFZhbHVlKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgQXJyYXlMaXN0IGdldE1hbmlmZXN0UGF0aHMoU3RyaW5nIHBhdGgpIHsKLQkJQXJyYXlMaXN0IG1hbmlmZXN0UGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAoZi5leGlzdHMoKSkgewotCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotCQkJCUZpbGUgbWFuaWZlc3RGaWxlID0gbmV3IEZpbGUocGF0aCArIEZpbGUuc2VwYXJhdG9yICsgIk1FVEEtSU5GIiArIEZpbGUuc2VwYXJhdG9yICsgIk1BTklGRVNULk1GIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWlmIChtYW5pZmVzdEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdEZpbGUpOwotCQkJCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaW5wdXRTdHJlYW0pOwotCQkJCQkJbWFuaWZlc3RQYXRocyA9IGdldE1hbmlmZXN0Q2xhc3NQYXRocyhtYW5pZmVzdCwgZi5nZXRQYXJlbnQoKSk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vSWdub3JlCi0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAobnVsbCAhPSBpbnB1dFN0cmVhbSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUphckZpbGUgamFyRmlsZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJamFyRmlsZSA9IG5ldyBKYXJGaWxlKGYpOwotCQkJCQlNYW5pZmVzdCBtYW5pZmVzdCA9IGphckZpbGUuZ2V0TWFuaWZlc3QoKTsKLQkJCQkJaWYgKG1hbmlmZXN0ICE9IG51bGwpCi0JCQkJCQltYW5pZmVzdFBhdGhzID0gZ2V0TWFuaWZlc3RDbGFzc1BhdGhzKG1hbmlmZXN0LCBmLmdldFBhcmVudCgpKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGphckZpbGUgIT0gbnVsbCkKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJamFyRmlsZS5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvL0lnbm9yZQotCQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWFuaWZlc3RQYXRoczsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEFycmF5TGlzdCBnZXRNYW5pZmVzdENsYXNzUGF0aHMoTWFuaWZlc3QgbWFuaWZlc3QsIFN0cmluZyBhcmNoaXZlUGF0aCkgewotCQlBcnJheUxpc3QgcGF0aExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUF0dHJpYnV0ZXMgbWFpbiA9IG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCVN0cmluZyBjbGFzc1BhdGggPSBtYWluLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRIKTsKLQkJaWYgKGNsYXNzUGF0aCAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsYXNzUGF0aCwgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotCQkJCVN0cmluZyBwYXRoID0gYXJjaGl2ZVBhdGggKyBGaWxlLnNlcGFyYXRvciArIHRva2VuOwotCQkJCXBhdGggPSBub3JtYWxpemVQYXRoKHBhdGgpOwotCQkJCWlmIChuZXcgRmlsZShwYXRoKS5leGlzdHMoKSkgewotCQkJCQlwYXRoTGlzdC5hZGQoY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KHBhdGgsIHRva2VuKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoTGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemVQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCQl0cnkgewotCQkJZiA9IGYuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIGYuZ2V0UGF0aCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uYXJjaGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vbmFyY2hpdmVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzY4Y2VhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uYXJjaGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNsaWVudE1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db25uZWN0b3JNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tb25hcmNoaXZlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgQ29tbW9uYXJjaGl2ZVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHVibGljIENvbW1vbmFyY2hpdmVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSAoQ29tbW9uYXJjaGl2ZVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgdHlwZSkuZUNsYXNzKCkuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1vbmFyY2hpdmVTd2l0Y2ggc3cgPSBuZXcgQ29tbW9uYXJjaGl2ZVN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyKENvbnRhaW5lciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb250YWluZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VXQVJGaWxlKFdBUkZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV0FSRmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZUZpbGUoTW9kdWxlRmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNb2R1bGVGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUFSRmlsZShFQVJGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVBUkZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudEZpbGUoQXBwbGljYXRpb25DbGllbnRGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphckZpbGUoRUpCSmFyRmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFSkJKYXJGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUkFSRmlsZShSQVJGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJBUkZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VBcmNoaXZlKEFyY2hpdmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXJjaGl2ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUZpbGUoRmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUmVhZE9ubHlEaXJlY3RvcnkoUmVhZE9ubHlEaXJlY3Rvcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnlBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKSBzdy5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuIEl0J3MgdXNlZnVsIHRvCi0JICogaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250YWluZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2R1bGVDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0Q29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV0FSRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZUZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQVJGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCSmFyRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJBUkZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcmNoaXZlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkNsaWVudEphckZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWFkT25seURpcmVjdG9yeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQk1vZHVsZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYk1vZHVsZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNsaWVudE1vZHVsZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlR2VuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tb25hcmNoaXZlU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IENvbW1vbmFyY2hpdmVTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VGaWxlKEZpbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcmNoaXZlKEFyY2hpdmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFyY2hpdmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXJGaWxlKEVKQkphckZpbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQkphckZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXQVJGaWxlKFdBUkZpbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdBUkZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFQVJGaWxlKEVBUkZpbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVBUkZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudEZpbGUoQXBwbGljYXRpb25DbGllbnRGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGVGaWxlKE1vZHVsZUZpbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZUZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXIoQ29udGFpbmVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250YWluZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWFkT25seURpcmVjdG9yeShSZWFkT25seURpcmVjdG9yeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSQVJGaWxlKFJBUkZpbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJBUkZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGVSZWYoTW9kdWxlUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNb2R1bGVSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJNb2R1bGVSZWYoRUpCTW9kdWxlUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFSkJNb2R1bGVSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJNb2R1bGVSZWYoV2ViTW9kdWxlUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWJNb2R1bGVSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDbGllbnRNb2R1bGVSZWYoQ2xpZW50TW9kdWxlUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDbGllbnRNb2R1bGVSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3JNb2R1bGVSZWYoQ29ubmVjdG9yTW9kdWxlUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyR2VuKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4gSXQncyB1c2VmdWwgdG8KLQkgKiBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRhaW5lckFkYXB0ZXJHZW4oKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV0FSRmlsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZUZpbGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQVJGaWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCSmFyRmlsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJBUkZpbGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcmNoaXZlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRmlsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlYWRPbmx5RGlyZWN0b3J5QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vQ29tbW9uYXJjaGl2ZUFkYXB0ZXJGYWN0b3J5Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vbmFyY2hpdmVTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uYXJjaGl2ZVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzdmYjE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uYXJjaGl2ZVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ2xpZW50TW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbm5lY3Rvck1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XZWJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlRmFjdG9yeUltcGw7Ci0KLQotcHVibGljIGNsYXNzIENvbW1vbmFyY2hpdmVTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbW1vbmFyY2hpdmVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCXByb3RlY3RlZCBzdGF0aWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeTsKLQotCXB1YmxpYyBDb21tb25hcmNoaXZlU3dpdGNoKCkgewotCQlmYWN0b3J5ID0gKENvbW1vbmFyY2hpdmVGYWN0b3J5KSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQkJbW9kZWxQYWNrYWdlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlFQ2xhc3MgdGhlRUNsYXNzID0gdGhlRU9iamVjdC5lQ2xhc3MoKTsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgIT0gbW9kZWxQYWNrYWdlKQotCQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCi0JCXN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFIDogewotCQkJCVdBUkZpbGUgY2FzdGVkT2JqZWN0ID0gKFdBUkZpbGUpIHRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXQVJGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUFyY2hpdmUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VDb250YWluZXIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRSA6IHsKLQkJCQlFQVJGaWxlIGNhc3RlZE9iamVjdCA9IChFQVJGaWxlKSB0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUFSRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VBcmNoaXZlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQ29udGFpbmVyKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEUgOiB7Ci0JCQkJQXBwbGljYXRpb25DbGllbnRGaWxlIGNhc3RlZE9iamVjdCA9IChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIHRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkNsaWVudEZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQXJjaGl2ZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRSA6IHsKLQkJCQlFSkJKYXJGaWxlIGNhc3RlZE9iamVjdCA9IChFSkJKYXJGaWxlKSB0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCSmFyRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VBcmNoaXZlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQ29udGFpbmVyKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEUgOiB7Ci0JCQkJUkFSRmlsZSBjYXN0ZWRPYmplY3QgPSAoUkFSRmlsZSkgdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJBUkZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQXJjaGl2ZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkUgOiB7Ci0JCQkJQXJjaGl2ZSBjYXN0ZWRPYmplY3QgPSAoQXJjaGl2ZSkgdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFyY2hpdmUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VDb250YWluZXIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFIDogewotCQkJCUZpbGUgY2FzdGVkT2JqZWN0ID0gKEZpbGUpIHRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZIDogewotCQkJCVJlYWRPbmx5RGlyZWN0b3J5IGNhc3RlZE9iamVjdCA9IChSZWFkT25seURpcmVjdG9yeSkgdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlYWRPbmx5RGlyZWN0b3J5KGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQ29udGFpbmVyKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0gLy8gZG9Td2l0Y2gKLQotCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRhaW5lcihDb250YWluZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZVdBUkZpbGUoV0FSRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlTW9kdWxlRmlsZShNb2R1bGVGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQVJGaWxlKEVBUkZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50RmlsZShBcHBsaWNhdGlvbkNsaWVudEZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphckZpbGUoRUpCSmFyRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlUkFSRmlsZShSQVJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcmNoaXZlKEFyY2hpdmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZUZpbGUoRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlUmVhZE9ubHlEaXJlY3RvcnkoUmVhZE9ubHlEaXJlY3Rvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTW9kdWxlUmVmKE1vZHVsZVJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUpCTW9kdWxlUmVmKEVKQk1vZHVsZVJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2ViTW9kdWxlUmVmKFdlYk1vZHVsZVJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ2xpZW50TW9kdWxlUmVmKENsaWVudE1vZHVsZVJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29ubmVjdG9yTW9kdWxlUmVmKENvbm5lY3Rvck1vZHVsZVJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoR2VuKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEU6IHsKLQkJCQlGaWxlIGZpbGUgPSAoRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRmlsZShmaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChmaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkU6IHsKLQkJCQlBcmNoaXZlIGFyY2hpdmUgPSAoQXJjaGl2ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXJjaGl2ZShhcmNoaXZlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250YWluZXIoYXJjaGl2ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShhcmNoaXZlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChhcmNoaXZlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRTogewotCQkJCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJKYXJGaWxlKGVqYkphckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoZWpiSmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXJjaGl2ZShlamJKYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250YWluZXIoZWpiSmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShlamJKYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChlamJKYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFOiB7Ci0JCQkJV0FSRmlsZSB3YXJGaWxlID0gKFdBUkZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdBUkZpbGUod2FyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kdWxlRmlsZSh3YXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcmNoaXZlKHdhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcih3YXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWxlKHdhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEU6IHsKLQkJCQlFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUFSRmlsZShlYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKGVhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFyY2hpdmUoZWFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKGVhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUoZWFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZWFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRTogewotCQkJCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBsaWNhdGlvbkNsaWVudEZpbGUgPSAoQXBwbGljYXRpb25DbGllbnRGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkNsaWVudEZpbGUoYXBwbGljYXRpb25DbGllbnRGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKGFwcGxpY2F0aW9uQ2xpZW50RmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXJjaGl2ZShhcHBsaWNhdGlvbkNsaWVudEZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihhcHBsaWNhdGlvbkNsaWVudEZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUoYXBwbGljYXRpb25DbGllbnRGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChhcHBsaWNhdGlvbkNsaWVudEZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEU6IHsKLQkJCQlNb2R1bGVGaWxlIG1vZHVsZUZpbGUgPSAoTW9kdWxlRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShtb2R1bGVGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcmNoaXZlKG1vZHVsZUZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihtb2R1bGVGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWxlKG1vZHVsZUZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KG1vZHVsZUZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSOiB7Ci0JCQkJQ29udGFpbmVyIGNvbnRhaW5lciA9IChDb250YWluZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihjb250YWluZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUoY29udGFpbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChjb250YWluZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWTogewotCQkJCVJlYWRPbmx5RGlyZWN0b3J5IHJlYWRPbmx5RGlyZWN0b3J5ID0gKFJlYWRPbmx5RGlyZWN0b3J5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZWFkT25seURpcmVjdG9yeShyZWFkT25seURpcmVjdG9yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKHJlYWRPbmx5RGlyZWN0b3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWxlKHJlYWRPbmx5RGlyZWN0b3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChyZWFkT25seURpcmVjdG9yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRTogewotCQkJCVJBUkZpbGUgcmFyRmlsZSA9IChSQVJGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSQVJGaWxlKHJhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUocmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXJjaGl2ZShyYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250YWluZXIocmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShyYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChyYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUY6IHsKLQkJCQlNb2R1bGVSZWYgbW9kdWxlUmVmID0gKE1vZHVsZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTW9kdWxlUmVmKG1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9NT0RVTEVfUkVGOiB7Ci0JCQkJRUpCTW9kdWxlUmVmIGVqYk1vZHVsZVJlZiA9IChFSkJNb2R1bGVSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQk1vZHVsZVJlZihlamJNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZVJlZihlamJNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGVqYk1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRjogewotCQkJCVdlYk1vZHVsZVJlZiB3ZWJNb2R1bGVSZWYgPSAoV2ViTW9kdWxlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJNb2R1bGVSZWYod2ViTW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVSZWYod2ViTW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3ZWJNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUY6IHsKLQkJCQlDbGllbnRNb2R1bGVSZWYgY2xpZW50TW9kdWxlUmVmID0gKENsaWVudE1vZHVsZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2xpZW50TW9kdWxlUmVmKGNsaWVudE1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kdWxlUmVmKGNsaWVudE1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoY2xpZW50TW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGOiB7Ci0JCQkJQ29ubmVjdG9yTW9kdWxlUmVmIGNvbm5lY3Rvck1vZHVsZVJlZiA9IChDb25uZWN0b3JNb2R1bGVSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbm5lY3Rvck1vZHVsZVJlZihjb25uZWN0b3JNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZVJlZihjb25uZWN0b3JNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGNvbm5lY3Rvck1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyR2VuKENvbnRhaW5lciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV0FSRmlsZUdlbihXQVJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGVGaWxlR2VuKE1vZHVsZUZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUdlbihBcHBsaWNhdGlvbkNsaWVudEZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVBUkZpbGVHZW4oRUFSRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUpCSmFyRmlsZUdlbihFSkJKYXJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSQVJGaWxlR2VuKFJBUkZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFyY2hpdmVHZW4oQXJjaGl2ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRmlsZUdlbihGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZWFkT25seURpcmVjdG9yeUdlbihSZWFkT25seURpcmVjdG9yeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZUdlbihFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Db21tb25hcmNoaXZlU3dpdGNoCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0RlbGV0ZU9uRXhpdFV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRGVsZXRlT25FeGl0VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWFkNWUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRGVsZXRlT25FeGl0VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZU9uRXhpdFV0aWxpdHkgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1hcmtGb3JEZWxldGlvbihGaWxlIGZpbGUpIHsKLQkJb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkRlbGV0ZU9uRXhpdFV0aWxpdHkubWFya0ZvckRlbGV0aW9uKGZpbGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxlSGFzQmVlbkRlbGV0ZWQoRmlsZSBmaWxlKSB7Ci0JCW9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5EZWxldGVPbkV4aXRVdGlsaXR5LmZpbGVIYXNCZWVuRGVsZXRlZChmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuQ2xlYW51cCgpIHsKLQkJb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkRlbGV0ZU9uRXhpdFV0aWxpdHkucnVuQ2xlYW51cCgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0VBUkZpbGVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0VBUkZpbGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMmU5NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9FQVJGaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotCi0KLXB1YmxpYyBjbGFzcyBFQVJGaWxlVXRpbCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRUFSRmlsZVV0aWwuCi0JICovCi0JcHJpdmF0ZSBFQVJGaWxlVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgbW9kdWxlIGZpbGVzIHdoaWNoIGFyZSBhIHNwZWMgbGV2ZWwgdG9vIGhpZ2ggZm9yIHRoZSBFQVIgZmlsZS4gSWYgdGhlCi0JICogRUFSIGlzIDEuMywgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiBPdGhlcndpc2UgcmV0dXJucyBhbnkgSjJFRSAxLjMgbW9kdWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0SW5jb21wYXRpYmxlMTNNb2R1bGVGaWxlcyhFQVJGaWxlIGVhckZpbGUpIHsKLQkJaWYgKGlzSjJFRTEzKGVhckZpbGUpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJTGlzdCBtb2R1bGVGaWxlcyA9IGVhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZUZpbGUgYU1vZHVsZUZpbGUgPSAoTW9kdWxlRmlsZSkgbW9kdWxlRmlsZXMuZ2V0KGkpOwotCQkJaWYgKGlzSjJFRTEzKGFNb2R1bGVGaWxlKSkKLQkJCQlyZXN1bHQuYWRkKGFNb2R1bGVGaWxlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBtb2R1bGUgZmlsZXMgd2hpY2ggYXJlIGEgc3BlYyBsZXZlbCB0b28gaGlnaCBmb3IgdGhlIEVBUiBmaWxlLiBJZiB0aGUKLQkgKiBFQVIgaXMgMS40LCByZXR1cm5zIGFuIGVtcHR5IGxpc3QuIE90aGVyd2lzZSByZXR1cm5zIGFueSBKMkVFIDEuNCBtb2R1bGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRJbmNvbXBhdGlibGUxNE1vZHVsZUZpbGVzKEVBUkZpbGUgZWFyRmlsZSkgewotCQlpZiAoaXNKMkVFMTQoZWFyRmlsZSkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotCQlMaXN0IG1vZHVsZUZpbGVzID0gZWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVGaWxlcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSA9IChNb2R1bGVGaWxlKSBtb2R1bGVGaWxlcy5nZXQoaSk7Ci0JCQlpZiAoaXNKMkVFMTQoYU1vZHVsZUZpbGUpKQotCQkJCXJlc3VsdC5hZGQoYU1vZHVsZUZpbGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSjJFRTEzKE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHsKLQkJdHJ5IHsKLQkJCVhNTFJlc291cmNlIHhtbFJlc291cmNlID0gKFhNTFJlc291cmNlKSBhTW9kdWxlRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCQlyZXR1cm4geG1sUmVzb3VyY2UuZ2V0SjJFRVZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0oyRUUxNChNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlYTUxSZXNvdXJjZSB4bWxSZXNvdXJjZSA9IChYTUxSZXNvdXJjZSkgYU1vZHVsZUZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkJcmV0dXJuIHhtbFJlc291cmNlLmdldEoyRUVWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0ZpbGVEdXBzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0ZpbGVEdXBzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZTZjOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9GaWxlRHVwcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMDoyODo0NCBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRmlsZUR1cHMgewotCXByaXZhdGUgc3RhdGljIGludCBzRmlsZXMgPSAwOwotCXByaXZhdGUgc3RhdGljIGludCBzRHVwcyA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IHNKQVJzID0gMDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBleGNsdWRlZEVudHJ5TmFtZXMgPSBuZXcgU3RyaW5nW117ImNvbS9pYm0vaXZqL2VqYi9ydW50aW1lL19Db3B5SGVscGVyX1N0dWIuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0JCQkJIm9yZy9vbWcvc3R1Yi9qYXZheC9lamIvX0hvbWVIYW5kbGVfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkib3JnL29tZy9zdHViL2phdmF4L2VqYi9fSGFuZGxlX1N0dWIuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0JCQkJIm9yZy9vbWcvc3R1Yi9qYXZheC9lamIvX0VKQk9iamVjdF9TdHViLmNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJvcmcvb21nL3N0dWIvamF2YXgvZWpiL19FSkJIb21lX1N0dWIuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0JCQkJIm9yZy9vbWcvc3R1Yi9qYXZhL2xhbmcvX0Nsb25lYWJsZV9TdHViLmNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJjb20vaWJtL3dlYnNwaGVyZS9jc2kvX1RyYW5zYWN0aW9uYWxPYmplY3RfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiY29tL2libS93ZWJzcGhlcmUvY3NpL19DU0lTZXJ2YW50X1N0dWIuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0JCQkJImNvbS9pYm0vZWpzL2NvbnRhaW5lci9fRUpTV3JhcHBlcl9UaWUuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0JCQkJImNvbS9pYm0vZWpzL2NvbnRhaW5lci9fRUpTV3JhcHBlcl9TdHViLmNsYXNzIiAvLyROT04tTkxTLTEkCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBIYXNoU2V0IGV4Y2x1ZGVkID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChleGNsdWRlZEVudHJ5TmFtZXMpKTsKLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIGVudHJ5LCBNYXAgbWFwLCBTdHJpbmcgamFyTmFtZSkgewotCQlzRmlsZXMrKzsKLQotCQlPYmplY3QgY3VycmVudCA9IG1hcC5nZXQoZW50cnkpOwotCQlpZiAoY3VycmVudCA9PSBudWxsKSB7Ci0JCQkvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBlbnRyeSBpcyBmb3VuZAotCQkJbWFwLnB1dChlbnRyeSwgamFyTmFtZSk7Ci0JCX0gZWxzZSBpZiAoY3VycmVudCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJLy8gVGhlcmUgaXMgb25lIG90aGVyIGVudHJ5Ci0JCQltYXAucmVtb3ZlKGVudHJ5KTsKLQotCQkJU3RyaW5nIG90aGVyID0gKFN0cmluZykgY3VycmVudDsKLQkJCUxpbmtlZExpc3QgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQlsaXN0LmFkZEZpcnN0KG90aGVyKTsKLQkJCWxpc3QuYWRkRmlyc3QoamFyTmFtZSk7Ci0JCQltYXAucHV0KGVudHJ5LCBsaXN0KTsKLQotCQkJc0R1cHMrKzsKLQkJfSBlbHNlIHsKLQkJCS8vIFRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIG90aGVyIGluc3RhbmNlcwotCQkJTGlua2VkTGlzdCBsaXN0ID0gKExpbmtlZExpc3QpIGN1cnJlbnQ7Ci0JCQlsaXN0LmFkZEZpcnN0KGphck5hbWUpOwotCi0JCQlzRHVwcysrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzLmxlbmd0aCAhPSAxKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoIkZpbGVEdXBzIHV0aWxpdHlcclxuXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoIlN5bm9wc2lzOlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJc2IuYXBwZW5kKCJBbmFseXplcyBKQVIgYW5kIFpJUCBmaWxlcyBpbiBhIGRpcmVjdG9yeSBmb3IgZHVwbGljYXRlIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBuYW1lLiAgVGhpcyBleGNsdWRlcyBhbGwgZW50cmllcyBpbiB0aGUgXCJNRVRBLUlORlwiIGRpcmVjdG9yeSBvZiB0aGUgYXJjaGl2ZS4gIFRoaXMgZG9lcyBub3QgY2hlY2sgdGltZXN0YW1wcyBvciBzaXplLlxyXG5cclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZCgiVXNhZ2U6IEZpbGVEdXBzIGRpck5hbWVcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVRyZWVNYXAgbWFwID0gbmV3IFRyZWVNYXAoKTsKLQotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSByb290ID0gbmV3IEZpbGUoYXJnc1tpXSk7Ci0JCQkJcHJvY2Vzc0RpcmVjdG9yeShyb290LCBtYXApOwotCQkJfQotCi0JCQlUcmVlTWFwIG91dHB1dE1hcCA9IG5ldyBUcmVlTWFwKCk7Ci0KLQkJCVNldCBzZXQgPSBtYXAuZW50cnlTZXQoKTsKLQkJCUl0ZXJhdG9yIGl0ID0gc2V0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJTWFwLkVudHJ5IG1lID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCU9iamVjdCBvID0gbWUuZ2V0VmFsdWUoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIExpbmtlZExpc3QpIHsKLQkJCQkJU3RyaW5nQnVmZmVyIGphcnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJCQkJTGlua2VkTGlzdCBsaXN0ID0gKExpbmtlZExpc3QpIG87Ci0JCQkJCUl0ZXJhdG9yIGVudHJ5SXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGVudHJ5SXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCWphcnMuYXBwZW5kKGVudHJ5SXRlci5uZXh0KCkpOwotCQkJCQkJamFycy5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJTGlua2VkTGlzdCBvdXRwdXRMaXN0ID0gKExpbmtlZExpc3QpIG91dHB1dE1hcC5nZXQoamFycy50b1N0cmluZygpKTsKLQkJCQkJaWYgKG91dHB1dExpc3QgPT0gbnVsbCkgewotCQkJCQkJb3V0cHV0TGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQkJCQlvdXRwdXRNYXAucHV0KGphcnMudG9TdHJpbmcoKSwgb3V0cHV0TGlzdCk7Ci0JCQkJCX0KLQkJCQkJb3V0cHV0TGlzdC5hZGRGaXJzdChtZS5nZXRLZXkoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlTZXQgb3V0U2V0ID0gb3V0cHV0TWFwLmVudHJ5U2V0KCk7Ci0JCQlpdCA9IG91dFNldC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBtZSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlTdHJpbmcgamFycyA9IChTdHJpbmcpIG1lLmdldEtleSgpOwotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGphcnMsICJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJCX0KLQotCQkJCUxpbmtlZExpc3QgbGlzdCA9IChMaW5rZWRMaXN0KSBtZS5nZXRWYWx1ZSgpOwotCQkJCUl0ZXJhdG9yIGVudHJ5SXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZW50cnlJdGVyLmhhc05leHQoKSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAiICsgKFN0cmluZykgZW50cnlJdGVyLm5leHQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblNlYXJjaGVkICIgKyBzSkFScyArICIgamFycywgZm91bmQgIiArIHNEdXBzICsgIiBkdXBzIGluICIgKyBzRmlsZXMgKyAiIGZpbGVzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0JCQl4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzRGlyZWN0b3J5KEZpbGUgcm9vdCwgTWFwIG1hcCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlGaWxlW10gZmlsZXMgPSByb290Lmxpc3RGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGYgPSBmaWxlc1tpXTsKLQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpCi0JCQkJcHJvY2Vzc0RpcmVjdG9yeShmLCBtYXApOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmIChuYW1lLmVuZHNXaXRoKCIuemlwIikgfHwgbmFtZS5lbmRzV2l0aCgiLmphciIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl7Ci0JCQkJCXByb2Nlc3NGaWxlKGYsIG1hcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzRmlsZShGaWxlIGZpbGUsIE1hcCBtYXApIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJSGFzaFNldCBmaWxlc0luRmlsZSA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJc0pBUnMrKzsKLQkJWmlwRmlsZSB6aXAgPSBudWxsOwotCQl0cnkgewotCQkJemlwID0gb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkFyY2hpdmVVdGlsLm5ld1ppcEZpbGUoZmlsZSk7Ci0JCQlFbnVtZXJhdGlvbiBlTnVtID0gemlwLmVudHJpZXMoKTsKLQkJCXdoaWxlIChlTnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpIGVOdW0ubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCQlpZiAoIW5hbWUuc3RhcnRzV2l0aCgiTUVUQS1JTkYiKSAmJiAhZXhjbHVkZWQuY29udGFpbnMobmFtZSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJZmlsZXNJbkZpbGUuYWRkKG5hbWUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24geCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqRXJyb3Igc2VhcmNoaW5nIGluICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoemlwICE9IG51bGwpCi0JCQkJCXppcC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCi0JCS8vIE5vdyBhZGQgdGhlIHBhY2thZ2VzIHRvIHRoZSBtYXAKLQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZS5nZXRQYXRoKCk7Ci0KLQkJSXRlcmF0b3IgaXQgPSBmaWxlc0luRmlsZS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgZW50cnlOYW1lID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJYWRkRW50cnkoZW50cnlOYW1lLCBtYXAsIGZpbGVuYW1lKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvSjJFRUZpbGVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0oyRUVGaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTM1YTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvSjJFRUZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuR2VuZXJhbFhtbERvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5YbWxEb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIHRvIGhvbGQgaGVscGVyIG1ldGhvZHMgY29tbW9uIHRvIG11bHRpcGxlIGNsYXNzZXMgaW4gdGhlIGFyY2hpdmUgc3VwcG9ydAotICogcGFja2FnZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVGaWxlVXRpbCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0NMQVNTID0gIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9KQVZBID0gIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX1NRTEogPSAiLnNxbGoiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0pTUCA9ICIuanNwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzUnVudGltZSA9IGZhbHNlOwotCi0JLyoqCi0JICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB0ZW1wIGRpcmVjdG9yeSBzaG91bGQgYmUgdXNlZCBmb3IgZXh0cmFjdGluZyBuZXN0ZWQgamFycyBmb3IKLQkgKiByZWFkOyBkZWZhdWx0cyB0byB0cnVlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHNob3VsZFVzZVRlbXBEaXJlY3RvcnlGb3JSZWFkID0gdHJ1ZTsKLQotCS8qKgotCSAqIFNldHRhYmxlIG5hbWUgZm9yIHRoZSB0ZW1wIGRpcmVjdG9yeTsgbXVzdCByZXNvbHZlIHRvIGEgdmFsaWQgZmlsZSBvbiB0aGUgZmlsZSBzeXN0ZW07IGlmIG5vdAotCSAqIHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHRlbXBEaXJlY3RvcnlOYW1lOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBqYXZhLmlvLkZpbGUgdGVtcERpcmVjdG9yeTsKLQkKLQkvKioKLQkgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgZW1wdHkgZGlyZWN0b3JpZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGR1cmluZyBpbXBvcnQ7IGRlZmF1bHRzIHRvIHRydWUuCi0JICogCi0JICogQHNlZSBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCNpc0luY2x1ZGVFbXB0eURpcmVjdG9yaWVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gSU5DTFVERV9FTVBUWV9ESVJFQ1RPUklFUyA9IHRydWU7Ci0JCi0KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZVVzaW5nQWx0REQoRUFSRmlsZSBlYXIsIFJlc291cmNlIHJlcykgewotCQlpZiAocmVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdXJpID0gcmVzLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCU1vZHVsZSBtID0gZWFyLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlSGF2aW5nQWx0REQodXJpKTsKLQkJaWYgKG0gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2R1bGVSZWYgcmVmID0gZWFyLmdldE1vZHVsZVJlZihtKTsKLQkJaWYgKHJlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIHJlZi5nZXRNb2R1bGVGaWxlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kdWxlRmlsZVR5cGVOYW1lKGludCBtb2R1bGVUeXBlKSB7Ci0JCXN3aXRjaCAobW9kdWxlVHlwZSkgewotCQkJY2FzZSBYTUxSZXNvdXJjZS5BUFBMSUNBVElPTl9UWVBFIDoKLQkJCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5BX0FwcGxpY2F0aW9uX2ZpbGU7IAotCQkJY2FzZSBYTUxSZXNvdXJjZS5BUFBfQ0xJRU5UX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFuX0FwcGxpY2F0aW9uX0NsaWVudF9KQVJfZmlsZTsgCi0JCQljYXNlIFhNTFJlc291cmNlLkVKQl9UWVBFIDoKLQkJCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5Bbl9FSkJfSkFSX2ZpbGU7IAotCQkJY2FzZSBYTUxSZXNvdXJjZS5XRUJfQVBQX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFfV0FSX2ZpbGU7IAotCQkJY2FzZSBYTUxSZXNvdXJjZS5SQVJfVFlQRSA6Ci0JCQkJcmV0dXJuIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQV9SQVJfZmlsZTsgCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29uY2F0ZW5hdGVzIHRoZSB0d28gc3RyaW5ncyBhbmQgZW5zdXJlcyB0aGUgY29ycmVjdCBzZXBhcmF0b3IgaXMgdXNlZCBpbiB0aGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9TVXJpKFN0cmluZyB1cmkpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCWlmIChzZXAgIT0gJy8nKQotCQkJcmV0dXJuIHVyaS5yZXBsYWNlKCcvJywgc2VwKTsKLQkJcmV0dXJuIHVyaS5yZXBsYWNlKCdcXCcsIHNlcCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBleHRlbnQgb2YgdGhlIHJlc291cmNlCi0JICogCi0JICogQHRocm93cyBFbXB0eVJlc291cmNlRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICB0aHJvd24gaWYgdGhlIGV4dGVudCBpcyBlbXB0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBnZXRSb290KFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQlFTGlzdCBleHRlbnQgPSBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQkJaWYgKGV4dGVudC5zaXplKCkgPCAxKSB7Ci0JCQl0aHJvdyBuZXcgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbihhUmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIChFT2JqZWN0KSBleHRlbnQuZ2V0KDApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgamF2YS5pby5GaWxlIGdldFRlbXBEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB0ZW1wRGlyZWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDE6MTY6NDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRlbXBEaXJlY3RvcnlOYW1lKCkgewotCQlyZXR1cm4gdGVtcERpcmVjdG9yeU5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRUb2tlbnMoU3RyaW5nIGFTdHJpbmcpIHsKLQkJcmV0dXJuIGdldFRva2VucyhhU3RyaW5nLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFRva2VucyhTdHJpbmcgYVN0cmluZywgU3RyaW5nIGRlbGltaXRlcikgewotCi0JCVN0cmluZ1Rva2VuaXplciB0b2sgPSAoZGVsaW1pdGVyID09IG51bGwpID8gbmV3IFN0cmluZ1Rva2VuaXplcihhU3RyaW5nKSA6IG5ldyBTdHJpbmdUb2tlbml6ZXIoYVN0cmluZywgZGVsaW1pdGVyKTsKLQkJaW50IHNpemUgPSB0b2suY291bnRUb2tlbnMoKTsKLQkJU3RyaW5nW10gdG9rZW5zID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplICYmIHRvay5oYXNNb3JlVG9rZW5zKCk7IGkrKykgewotCQkJdG9rZW5zW2ldID0gdG9rLm5leHRUb2tlbigpOwotCQl9Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCi0JLyoqCi0JICogZ2V0VmFsdWVJZ25vcmVLZXlDYXNlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZUlnbm9yZUtleUNhc2UoamF2YS5sYW5nLlN0cmluZyBrZXksIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyBhdHRyKSB7Ci0JCUl0ZXJhdG9yIGtleXNBbmRWYWx1ZXMgPSBhdHRyLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGtleXNBbmRWYWx1ZXMuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBrZXlzQW5kVmFsdWVzLm5leHQoKTsKLQkJCVN0cmluZyBlbnRyeUtleSA9IGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCk7Ci0JCQlpZiAoZW50cnlLZXkuZXF1YWxzSWdub3JlQ2FzZShrZXkpKQotCQkJCXJldHVybiBlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwgPyBudWxsIDogZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSjJFRTEzRmFzdENoZWNrKE1vZHVsZUZpbGUgbW9kdWxlRmlsZSkgewotCQlpZiAobW9kdWxlRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlIGlmIChtb2R1bGVGaWxlLmlzUkFSRmlsZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJU3RyaW5nIHVyaSA9IG1vZHVsZUZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKTsKLQkJdHJ5IHsKLQkJCWluID0gbW9kdWxlRmlsZS5nZXRJbnB1dFN0cmVhbSh1cmkpOwotCi0JCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IFhtbERvY3VtZW50UmVhZGVyLnJlYWREb2N1bWVudFR5cGUoaW4sIHVyaSk7Ci0JCQlpZiAoZG9jVHlwZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCVN0cmluZ1tdIGlkcyA9IGdldEoyRUUxM1B1YmxpY0FuZFN5c3RlbUlkRm9yKG1vZHVsZUZpbGUpOwotCQkJaWYgKGlkcyA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBpZHNbMF0uZXF1YWxzKGRvY1R5cGUuZ2V0UHVibGljSWQoKSkgJiYgaWRzWzFdLmVxdWFscyhkb2NUeXBlLmdldFN5c3RlbUlkKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBnZXRKMkVFMTNQdWJsaWNBbmRTeXN0ZW1JZEZvcihNb2R1bGVGaWxlIG1vZHVsZUZpbGUpIHsKLQkJaWYgKG1vZHVsZUZpbGUuaXNFQVJGaWxlKCkpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuQVBQTElDQVRJT05fUFVCTElDSURfMV8zLCBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfM307Ci0JCWVsc2UgaWYgKG1vZHVsZUZpbGUuaXNFSkJKYXJGaWxlKCkpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuRUpCSkFSX1BVQkxJQ0lEXzJfMCwgSjJFRUNvbnN0YW50cy5FSkJKQVJfU1lTVEVNSURfMl8wfTsKLQkJZWxzZSBpZiAobW9kdWxlRmlsZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfUFVCTElDSURfMV8zLCBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8zfTsKLQkJZWxzZSBpZiAobW9kdWxlRmlsZS5pc1dBUkZpbGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8zLCBKMkVFQ29uc3RhbnRzLldFQkFQUF9TWVNURU1JRF8yXzN9OwotCQllbHNlIGlmIChtb2R1bGVGaWxlLmlzUkFSRmlsZSgpKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9QVUJMSUNJRF8xXzAsIEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NZU1RFTUlEXzFfMH07Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEZhc3RTcGVjVmVyc2lvbihTdHJpbmcgZmlsZVVSSSkgewotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIAlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZVVSSSk7Ci0KLSAgICAgICAgICAgRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBudWxsOwotCi0gICAgICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbik7Ci0gICAgICAgICAgIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlciBhUmVhZGVyID0gbmV3IFhtbERvY3VtZW50UmVhZGVyKHNvdXJjZSk7Ci0gICAgICAgICAgIGFSZWFkZXIuc2V0VmFsaWRhdGUoZmFsc2UpOwotICAgICAgICAgICBEb2N1bWVudCBhRG9jdW1lbnQgPSBhUmVhZGVyLnBhcnNlRG9jdW1lbnQoKTsKLSAgICAgICAgICAgaWYgKGFEb2N1bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGRvY1R5cGUgPSBhRG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGludCB2ZXJzaW9uID0gLTE7Ci0gICAgICAgICAgIGlmIChudWxsICE9IGRvY1R5cGUpIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY0lEID0gZG9jVHlwZS5nZXRQdWJsaWNJZCgpOwotICAgICAgICAgICAgICBTdHJpbmcgc3lzdGVtSUQgPSBkb2NUeXBlLmdldFN5c3RlbUlkKCk7Ci0gICAgICAgICAgICAgIGlmIChwdWJsaWNJRCAhPSBudWxsICYmIHN5c3RlbUlEICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IGxvb2t1cFZlcnNpb24oZmlsZVVSSSwgcHVibGljSUQsIHN5c3RlbUlEKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmICh2ZXJzaW9uID09IC0xKSB7Ci0gICAgICAgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICBpZiAoYURvY3VtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZG9jVHlwZSkgewotICAgICAgICAgICAgICAgICAgICBOYW1lZE5vZGVNYXAgbWFwID0gYURvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIE5vZGUgc2NoZW1hTm9kZSA9IG1hcC5nZXROYW1lZEl0ZW0oInhzaTpzY2hlbWFMb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHNjaGVtYU5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTmFtZSA9IHNjaGVtYU5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgTm9kZSB2ZXJzaW9uTm9kZSA9IG1hcC5nZXROYW1lZEl0ZW0oInZlcnNpb24iKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHZlcnNpb25Ob2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uTm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAobnVsbCAhPSBzY2hlbWFOYW1lKSB7Ci0gICAgICAgICAgICAgICAgIHZlcnNpb24gPSBsb29rdXBWZXJzaW9uKGZpbGVVUkksIHNjaGVtYU5hbWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgIHZlcnNpb24gPSBwYXJzZVZlcnNpb25TdHJpbmcoZmlsZVVSSSwgdmVyc2lvblN0cmluZyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKQotICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAvL0lnbm9yZQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnNlVmVyc2lvblN0cmluZyhTdHJpbmcgZmlsZVVSSSwgU3RyaW5nIHZlcnNpb25BdHRyKSB7Ci0gICAgICAgIGludCB2ZXJzaW9uID0gLTE7Ci0gICAgICAgIGlmIChpc0VBUkZpbGUoZmlsZVVSSSkpIHsKLSAgICAgICAgICAgaWYgKG51bGwgPT0gdmVyc2lvbkF0dHIpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMl9URVhUKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zX1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVCkpIHsgLy9FSkIzCi0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCkpIHsgICAvL0VKQjMKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvL0VKQjMKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzRUpCSmFyRmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzFfVEVYVCkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8wX1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMV9URVhUKSkgeyAvL0VKQjMKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wX1RFWFQpKSB7IC8vRUpCMwotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzNfMF9JRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0VKQjMKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzQXBwbGljYXRpb25DbGllbnRGaWxlKGZpbGVVUkkpKSB7Ci0gICAgICAgICAgIGlmIChudWxsID09IHZlcnNpb25BdHRyKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVCkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80X1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCkpIHsgICAvL0VKQjMKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvL0VKQjMKLSAgICAgICAgICAgfSAKLSAgICAgICAgfSBlbHNlIGlmIChpc1dBUkZpbGUoZmlsZVVSSSkpIHsKLSAgICAgICAgICAgaWYgKG51bGwgPT0gdmVyc2lvbkF0dHIpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8yX1RFWFQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfM19URVhUKSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzRfVEVYVCkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl81X1RFWFQpKSB7IC8vRUpCMwotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNV9JRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0VKQjMKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzUkFSRmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzBfVEVYVCkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0KLSAgICAgfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxvb2t1cFZlcnNpb24oU3RyaW5nIGZpbGVVUkksIFN0cmluZyBzY2hlbWFOYW1lKSB7Ci0gICAgICAgIGludCB2ZXJzaW9uID0gLTE7Ci0gICAgICAgIGlmIChpc0VBUkZpbGUoZmlsZVVSSSkpIHsKLSAgICAgICAgICAgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU0NIRU1BXzUpKSB7ICAgICAgICAgIC8vRUpCMwotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsgICAgICAgICAgICAgICAgICAgICAgICAvL0VKQjMKLSAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NDSEVNQV8xXzQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzRUpCSmFyRmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAoKHNjaGVtYU5hbWUuaW5kZXhPZihKMkVFQ29uc3RhbnRzLkVKQkpBUl9TQ0hFTUFfM18wX05TKSkgIT0gLTEpIHsgLy9FSkIzCi0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEOyAgICAgICAgICAgICAgICAgICAgICAgICAvL0VKQjMKLSAgICAgICAgICAgfSBlbHNlIGlmICgoc2NoZW1hTmFtZS5pbmRleE9mKEoyRUVDb25zdGFudHMuRUpCSkFSX1NDSEVNQV8yXzFfTlMpKSAhPSAtMSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzQXBwbGljYXRpb25DbGllbnRGaWxlKGZpbGVVUkkpKSB7Ci0gICAgICAgICAgIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU0NIRU1BXzUpKSB7ICAgICAgICAgICAvL0VKQjMKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy9FSkIzCi0gICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NDSEVNQV8xXzQpKSB7Ci0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzV0FSRmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU0NIRU1BXzJfNSkpIHsgICAgICAgICAgICAgLy9FSkIzCi0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl81X0lEOyAgICAgICAgICAgICAgICAgICAgICAgICAvL0VKQjMKLSAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TQ0hFTUFfMl80KSkgewotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzUkFSRmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU0NIRU1BXzFfNSkpIHsKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmVyc2lvbjsKLSAgICAgfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxvb2t1cFZlcnNpb24oU3RyaW5nIGZpbGVVUkksIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB7Ci0JCWludCB2ZXJzaW9uID0gLTE7Ci0JCWlmIChpc0VBUkZpbGUoZmlsZVVSSSkpIHsKLQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9QVUJMSUNJRF8xXzMpICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzMpfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9BTFRfU1lTVEVNSURfMV8zKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMikgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMil8fHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0FMVF9TWVNURU1JRF8xXzIpKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKGlzRUpCSmFyRmlsZShmaWxlVVJJKSkgewotCQkJaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9QVUJMSUNJRF8yXzApICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfU1lTVEVNSURfMl8wKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX0FMVF9TWVNURU1JRF8yXzApKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOwotCQkJfSBlbHNlIGlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfUFVCTElDSURfMV8xKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzFfMSl8fHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9BTFRfU1lTVEVNSURfMV8xKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoZmlsZVVSSSkpIHsKLQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMykgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8zKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9BTFRfU1lTVEVNSURfMV8zKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQl9IGVsc2UgaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfUFVCTElDSURfMV8yKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzIpfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0FMVF9TWVNURU1JRF8xXzIpKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKGlzV0FSRmlsZShmaWxlVVJJKSkgewotCQkJaWYgKHB1YmxpY0lELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9QVUJMSUNJRF8yXzMpICYmIChzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8zKXx8c3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX0FMVF9TWVNURU1JRF8yXzMpKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEOwotCQkJfSBlbHNlIGlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8yKSAmJiAoc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMil8fHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9BTFRfU1lTVEVNSURfMl8yKSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNSQVJGaWxlKGZpbGVVUkkpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1BVQkxJQ0lEXzFfMCkgJiYgKHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzApfHxzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfQUxUX1NZU1RFTUlEXzFfMCkpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOwotCQkJfQotCQl9Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSQVJGaWxlKFN0cmluZyBmaWxlVVJJKSB7Ci0JCQotCQlyZXR1cm4gKGZpbGVVUkkuaW5kZXhPZihKMkVFQ29uc3RhbnRzLlJBUl9TSE9SVF9OQU1FKSAhPSAtMSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dBUkZpbGUoU3RyaW5nIGZpbGVVUkkpIHsKLQkJCi0JCXJldHVybiAoZmlsZVVSSS5pbmRleE9mKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1NIT1JUX05BTUUpICE9IC0xKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXBwbGljYXRpb25DbGllbnRGaWxlKFN0cmluZyBmaWxlVVJJKSB7Ci0JCXJldHVybiAoZmlsZVVSSS5pbmRleE9mKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9TSE9SVF9OQU1FKSAhPSAtMSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VKQkphckZpbGUoU3RyaW5nIGZpbGVVUkkpIHsKLQkJcmV0dXJuIChmaWxlVVJJLmluZGV4T2YoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSkgIT0gLTEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFQVJGaWxlKFN0cmluZyBmaWxlVVJJKSB7Ci0JCXJldHVybiAoZmlsZVVSSS5pbmRleE9mKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfU0hPUlRfTkFNRSkgIT0gLTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9PYmplY3RJbnB1dFN0cmVhbUN1c3RvbVJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL09iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjZWY4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL09iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzOwotaW1wb3J0IGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0SW5wdXRTdHJlYW1DdXN0b21SZXNvbHZlciBleHRlbmRzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gewotCXByaXZhdGUgQ2xhc3NMb2FkZXIgY2w7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCi0JcHVibGljIE9iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIoSW5wdXRTdHJlYW0gaXMsIENsYXNzTG9hZGVyIGxvYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gewotCi0JCXN1cGVyKGlzKTsKLQotCQlpZiAobG9hZGVyICE9IG51bGwpCi0JCQljbCA9IGxvYWRlcjsKLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGphdmEgdHlwZSBjbGFzcyBnaXZlbiBhIHNpZ25hdHVyZSBsZXR0ZXIuCi0JICovCi0KLQlwcml2YXRlIENsYXNzIGdldFR5cGUoY2hhciB0eXBlKSB7Ci0KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlICdCJyA6Ci0JCQkJcmV0dXJuIGJ5dGUuY2xhc3M7Ci0JCQljYXNlICdDJyA6Ci0JCQkJcmV0dXJuIGNoYXIuY2xhc3M7Ci0JCQljYXNlICdEJyA6Ci0JCQkJcmV0dXJuIGRvdWJsZS5jbGFzczsKLQkJCWNhc2UgJ0YnIDoKLQkJCQlyZXR1cm4gZmxvYXQuY2xhc3M7Ci0JCQljYXNlICdJJyA6Ci0JCQkJcmV0dXJuIGludC5jbGFzczsKLQkJCWNhc2UgJ0onIDoKLQkJCQlyZXR1cm4gbG9uZy5jbGFzczsKLQkJCWNhc2UgJ1MnIDoKLQkJCQlyZXR1cm4gc2hvcnQuY2xhc3M7Ci0JCQljYXNlICdaJyA6Ci0JCQkJcmV0dXJuIGJvb2xlYW4uY2xhc3M7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmVzb2x2ZUNsYXNzKCkgbWV0aG9kIHRvIHVzZSBhIGN1c3RvbSBjbGFzcyBsb2FkZXIuCi0JICovCi0KLQlwcm90ZWN0ZWQgQ2xhc3MgcmVzb2x2ZUNsYXNzKE9iamVjdFN0cmVhbUNsYXNzIGNsYXNzRGVzYykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NEZXNjLmdldE5hbWUoKTsKLQotCQkvL1V0aWxzVHJhY2UudHJhY2UoIiBPYmplY3RJbnB1dFN0cmVhbUN1c3RvbVJlc29sdmVyOiBSZXNvbHZpbmcgIiArIGNsYXNzTmFtZSk7Ci0KLQkJLy8gSGFuZGxlIGFycmF5cyBvZiBjbGFzc2VzIGRpZmZlcmVudGx5Ci0KLQkJaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKCJbIikpIHsvLyROT04tTkxTLTEkCi0KLQkJCUNsYXNzIGNvbXBvbmVudCA9IG51bGw7Ci0JCQlpbnQgZGltTnVtOwotCi0JCQlmb3IgKGRpbU51bSA9IDE7IGNsYXNzTmFtZS5jaGFyQXQoZGltTnVtKSA9PSAnWyc7IGRpbU51bSsrKQotCi0JCQlpZiAoY2xhc3NOYW1lLmNoYXJBdChkaW1OdW0pID09ICdMJykgewotCQkJCWNvbXBvbmVudCA9IGNsLmxvYWRDbGFzcyhjbGFzc05hbWUuc3Vic3RyaW5nKGRpbU51bSArIDEsIGNsYXNzTmFtZS5sZW5ndGgoKSAtIDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSAhPSBkaW1OdW0gKyAxKQotCQkJCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihjbGFzc05hbWUpOyAvLyBtYWxmb3JtZWQKLQkJCQljb21wb25lbnQgPSBnZXRUeXBlKGNsYXNzTmFtZS5jaGFyQXQoZGltTnVtKSk7Ci0JCQl9Ci0KLQkJCWludCBkaW1lbnNpb25zW10gPSBuZXcgaW50W2RpbU51bV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbU51bTsgaSsrKQotCQkJCWRpbWVuc2lvbnNbaV0gPSAwOwotCi0JCQlyZXR1cm4gQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50LCBkaW1lbnNpb25zKS5nZXRDbGFzcygpOwotCi0JCX0KLQkJcmV0dXJuIGNsLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvUmFyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9SYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTk2ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9SYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBSYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyIGV4dGVuZHMgQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIgewotCi0gICAgcHVibGljIFJhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIoQXJjaGl2ZSBhbkFyY2hpdmUsIENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsLCBQcm90ZWN0aW9uRG9tYWluIHBEb21haW4pIHsKLSAgICAgICAgc3VwZXIoYW5BcmNoaXZlLCBwYXJlbnRDbCwgZXh0cmFDbCwgcERvbWFpbik7Ci0gICAgfQotICAgIAotCXB1YmxpYyBSYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyKEFyY2hpdmUgYW5BcmNoaXZlLCBDbGFzc0xvYWRlciBwYXJlbnRDbCwgQ2xhc3NMb2FkZXIgZXh0cmFDbCkgewotCQlzdXBlcihhbkFyY2hpdmUsIHBhcmVudENsLCBleHRyYUNsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBnZXRGaWxlKFN0cmluZyBuYW1lKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBnZXRSYXJGaWxlKCkuZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoQXJjaGl2ZSkgY2hpbGRyZW4uZ2V0KGkpKS5nZXRGaWxlKG5hbWUpOwotCQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0RmlsZUZyb21EZXBlbmRlbnRKYXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBSQVJGaWxlIGdldFJhckZpbGUoKSB7Ci0JCXJldHVybiAoUkFSRmlsZSkgZ2V0QXJjaGl2ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvV2FyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9XYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODdiNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9XYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotCi0KLS8qKgotICogQGF1dGhvciBkZmhvbHR0cAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2FyRmlsZUR5bmFtaWNDbGFzc0xvYWRlciBleHRlbmRzIEFyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0xvYWRpbmdGcm9tV0FSID0gdHJ1ZTsKLQotCXB1YmxpYyBXYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyKEFyY2hpdmUgYW5BcmNoaXZlLCBDbGFzc0xvYWRlciBwYXJlbnRDbCwgQ2xhc3NMb2FkZXIgZXh0cmFDbCwgUHJvdGVjdGlvbkRvbWFpbiBwRG9tYWluKSB7Ci0JCXN1cGVyKGFuQXJjaGl2ZSwgcGFyZW50Q2wsIGV4dHJhQ2wsIHBEb21haW4pOwotCQlhbGxvd0xvYWRpbmdGcm9tV0FSID0gYW5BcmNoaXZlLmdldE9wdGlvbnMoKS5nZXRDbGFzc0xvYWRpbmdNb2RlKCkgPT0gQXJjaGl2ZU9wdGlvbnMuTE9BRF9NT0RFX0NPTVBBVDsKLQl9Ci0JCi0JcHVibGljIFdhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIoQXJjaGl2ZSBhbkFyY2hpdmUsIENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsKSB7Ci0JCXRoaXMoYW5BcmNoaXZlLCBwYXJlbnRDbCwgZXh0cmFDbCwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSkgewotCQkvL3NlYXJjaCBjbGFzc2VzIGRpcmVjdG9yeSBmaXJzdCwgdGhlbiB3YXIsIHRoZW4gbmVzdGVkIGFyY2hpdmVzLgotCQkvL3NlYXJjaCBjbGFzc2VzIGRpcmVjdG9yeQotCQlTdHJpbmcgc3dpenpsZWROYW1lID0gQXJjaGl2ZVV0aWwuY29uY2F0VXJpKEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJLCBuYW1lLCAnLycpOwotCQl0cnkgewotCQkJcmV0dXJuIGdldFdhckZpbGUoKS5nZXRGaWxlKHN3aXp6bGVkTmFtZSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJLy9zZWFyY2ggd2FyIGlmIHJ1bm5pbmcgd2l0aCBjb21wYXRpYmlsaXR5Ci0JCWlmIChhbGxvd0xvYWRpbmdGcm9tV0FSKSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRGaWxlRnJvbUFyY2hpdmUobmFtZSk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCX0KLQkJLy9zZWFyY2ggbmVzdGVkIGFyY2hpdmVzCi0JCUxpc3QgY2hpbGRyZW4gPSBnZXRXYXJGaWxlKCkuZ2V0TGlicygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKEFyY2hpdmUpIGNoaWxkcmVuLmdldChpKSkuZ2V0RmlsZShuYW1lKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJLy9maW5hbGx5IHNlYXJjaCBqYXJzIGluIGVhcgotCQlyZXR1cm4gZ2V0RmlsZUZyb21EZXBlbmRlbnRKYXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBXQVJGaWxlIGdldFdhckZpbGUoKSB7Ci0JCXJldHVybiAoV0FSRmlsZSkgZ2V0QXJjaGl2ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXBwbGljYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiYzYxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlQXBwbGljYXRpb24gZXh0ZW5kcyBMb29zZUFyY2hpdmUgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBMb29zZUFyY2hpdmVzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRMb29zZUFyY2hpdmVzKCk7Ci0KLX0gLy9Mb29zZUFwcGxpY2F0aW9uCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUFyY2hpdmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXJjaGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjVmMDVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXJjaGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMb29zZUFyY2hpdmUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRVcmkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBVcmkgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVcmkoU3RyaW5nIHZhbHVlKTsKLQotCWJvb2xlYW4gaXNFQVIoKTsKLQotCWJvb2xlYW4gaXNXQVIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEJpbmFyaWVzUGF0aCBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0QmluYXJpZXNQYXRoKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQmluYXJpZXNQYXRoIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0QmluYXJpZXNQYXRoKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSZXNvdXJjZXNQYXRoIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRSZXNvdXJjZXNQYXRoKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVzb3VyY2VzUGF0aCBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFJlc291cmNlc1BhdGgoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgTG9vc2VBcHAgcmVmZXJlbmNlCi0JICovCi0JTG9vc2VBcHBsaWNhdGlvbiBnZXRMb29zZUFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTG9vc2VBcHAgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMb29zZUFwcChMb29zZUFwcGxpY2F0aW9uIHZhbHVlKTsKLQotCWJvb2xlYW4gaXNNb2R1bGUoKTsKLQotfSAvL0xvb3NlQXJjaGl2ZQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VDb25maWdSZWdpc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VDb25maWdSZWdpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M2NzA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQ29uZmlnUmVnaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlN0cmluZ1V0aWw7Ci0KLQotLyoqCi0gKiBVc2VkIGludGVybmFsbHkgZm9yIGxvb3NlIG1vZHVsZSBzdXBwb3J0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb29zZUNvbmZpZ1JlZ2lzdGVyIHsKLQotCS8qKgotCSAqIFRoZSBzeXN0ZW0gcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBsb29zZSBjb25maWcgZG9jdW1lbnQ7Ci0JICogIndhcy5sb29zZS5jb25maWciCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9PU0VfQ09ORklHX1BST1BFUlRZID0gIndhcy5sb29zZS5jb25maWciOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIExvb3NlQ29uZmlnUmVnaXN0ZXIgc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIExvb3NlQ29uZmlndXJhdGlvbiBsb29zZUNvbmZpZ3VyYXRpb247Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQkvKiogSGF2ZSB3ZSBwcmV2aW91c2x5IGxvYWRlZCBvciB0cmllZCB0byBsb2FkIHRoZSBsb29zZSBjb25maWd1cmF0aW9uPyAqLwotCXByb3RlY3RlZCBib29sZWFuIGxvYWRBdHRlbXB0ZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgTWFwIGxvb3NlRWFyTWFwOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExvb3NlQ29uZmlnUmVnaXN0ZXIuCi0JICovCi0JcHJvdGVjdGVkIExvb3NlQ29uZmlnUmVnaXN0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExvb3NlQ29uZmlnUmVnaXN0ZXIgc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgTG9vc2VDb25maWdSZWdpc3RlcigpOwotCi0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgZm9yIHRoZSBlYXIgZmlsZSBpbiB0aGUgZmx1ZmZlZCBMb29zZUNvbmZpZ3VyYXRpb24gb2JqZWN0LCBhbmQgYXR0ZW1wdHMgdG8gbG9hZCB0aGUKLQkgKiBMb29zZUFwcGxpY2F0aW9uIG9uIGRlbWFuZCBmcm9tIHRoZSBleGlzdGluZyBtYXBwaW5ncyBpZiBpdCBpcyBub3QgYWxyZWFkeSBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIGVhckZpbGVVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExvb3NlQXBwbGljYXRpb24gZmluZExvb3NlQXBwbGljYXRpb24oU3RyaW5nIGVhckZpbGVVUkkpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbihTdHJpbmcKLQkJLy8gZWFyRmlsZVVSST1cIiIrZWFyRmlsZVVSSSsiXCIpIik7Ci0JCWlmIChnZXRMb29zZUNvbmZpZ3VyYXRpb24oKSAhPSBudWxsKSB7Ci0JCQlMaXN0IGFwcHMgPSBnZXRMb29zZUNvbmZpZ3VyYXRpb24oKS5nZXRBcHBsaWNhdGlvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXBwcy5zaXplKCk7IGkrKykgewotCQkJCUxvb3NlQXBwbGljYXRpb24gYXBwID0gKExvb3NlQXBwbGljYXRpb24pIGFwcHMuZ2V0KGkpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKToKLQkJCQkvLyBhcHBbIitpKyJdLmdldFVSSSgpPVwiIithcHAuZ2V0VXJpKCkrIlwiIiApOwotCQkJCWlmIChhcHAuZ2V0VXJpKCkuZXF1YWxzKGVhckZpbGVVUkkpKQotCQkJCQlyZXR1cm4gYXBwOwotCQkJfQotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKTogZGlkIG5vdCBmaW5kIGxvYWRlZAotCQkvLyBMb29zZUFwcGxpY2F0aW9uLCBsb2FkaW5nIG5ldyB2YWx1ZS4iICk7Ci0JCWlmIChnZXREb2N1bWVudFVSSSgpID09IG51bGwgfHwgZ2V0RG9jdW1lbnRVUkkoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJVVJJIGxvb3NlQ29uZmlnID0gKFVSSSkgZ2V0TG9vc2VFYXJNYXAoKS5nZXQoZWFyRmlsZVVSSSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uKCk6IGxvb3NlQ29uZmlnIFVSSQotCQkJLy8gZnJvbSBtYXAgXCIiK2xvb3NlQ29uZmlnKyJcIiIpOwotCQkJTG9vc2VBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IGxvYWRMb29zZUFwcGxpY2F0aW9uKGxvb3NlQ29uZmlnKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKToKLQkJCS8vIGxvb3NlQXBwbGljYXRpb249IithcHBsaWNhdGlvbik7Ci0JCQlpZiAoYXBwbGljYXRpb24gIT0gbnVsbCkgewotCQkJCUxpc3QgbW9kdWxlcyA9IGFwcGxpY2F0aW9uLmdldExvb3NlQXJjaGl2ZXMoKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uKCk6Ci0JCQkJLy8gbG9vc2VBcHBsaWNhdGlvbiBjb250YWlucyAiICsgbW9kdWxlcy5zaXplKCkgKyAiIG1vZHVsZXMuIik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uKCk6Ci0JCQkJCS8vIG1vZHVsZXMuZ2V0KCIraSsiKToiKyBtb2R1bGVzLmdldChpKSk7Ci0JCQkJCWdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpLmFkZChhcHBsaWNhdGlvbik7Ci0JCQkJcmV0dXJuIGFwcGxpY2F0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlYXJGaWxlVVJJCi0JICogICAgICAgICAgICBUaGUgY29udGFpbmluZyBFQVIgLS0gdGhlIGFic29sdXRlIGZpbGUgc3lzdGVtIFVSSSB3aWxsIGJlIGRldGVybWluZWQKLQkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkKLQkgKiBAcGFyYW0gbG9vc2VBcHBsaWNhdGlvblJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgZmlsZSBzeXN0ZW0gVVJJIG9mIGEgZG9jdW1lbnQgY29udGFpbmluZyBhIExvb3NlQXBwbGljYXRpb24gYXMgaXRzCi0JICogICAgICAgICAgICByb290Ci0JICovCi0JcHVibGljIHZvaWQgYWRkTG9vc2VNYXBwaW5nKENvbnRhaW5lciBjb250YWluZXIsIFN0cmluZyBsb29zZUFwcGxpY2F0aW9uUmVzb3VyY2UpIHsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKQotCQkJYWRkTG9vc2VNYXBwaW5nKEFyY2hpdmVVdGlsLmdldE9TVXJpKGNvbnRhaW5lci5nZXRVUkkoKSksIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVhckZpbGVVUkkKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBmaWxlIHN5c3RlbSBVUkkgb2YgdGhlIEVBUiBmaWxlIG9mIHRoZSBnaXZlbiBtYXBwaW5nCi0JICogQHBhcmFtIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIGZpbGUgc3lzdGVtIFVSSSBvZiBhIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBMb29zZUFwcGxpY2F0aW9uIGFzIGl0cwotCSAqICAgICAgICAgICAgcm9vdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExvb3NlTWFwcGluZyhTdHJpbmcgZWFyRmlsZVVSSSwgU3RyaW5nIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZSkgewotCQlpZiAoZWFyRmlsZVVSSSAhPSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmFkZExvb3NlTWFwcGluZyhTdHJpbmcKLQkJCS8vIGVhckZpbGVVUkk9XCIiK2VhckZpbGVVUkkrIlwiLCBTdHJpbmcKLQkJCS8vIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZT1cIiIrbG9vc2VBcHBsaWNhdGlvblJlc291cmNlKyJcIikiKTsKLQkJCWlmIChnZXRMb29zZUVhck1hcCgpLmNvbnRhaW5zS2V5KGVhckZpbGVVUkkpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5hZGRMb29zZU1hcHBpbmcoKTogRm91bmQgZXhpc3Rpbmcga2V5Ci0JCQkJLy8gd2l0aCBzYW1lIGVhckZpbGVVUkksIGxvb2tpbmcgZm9yIGxvYWRlZCBhcHAuIik7Ci0JCQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSBmaW5kTG9vc2VBcHBsaWNhdGlvbklmTG9hZGVkKGVhckZpbGVVUkkpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuYWRkTG9vc2VNYXBwaW5nKCk6IExvYWRlZCBhcHA9IiArCi0JCQkJLy8gYXBwKTsKLQkJCQlpZiAoYXBwICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gbG9hZExvb3NlQXBwbGljYXRpb25SZXNvdXJjZShVUkkuY3JlYXRlVVJJKGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZSkpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmFkZExvb3NlTWFwcGluZygpOiBjbGVhcmluZwotCQkJCQkvLyByZXNvdXJjZToiICsgcmVzKTsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCQlyZW1vdmVMb29zZUFwcGxpY2F0aW9uKGFwcCk7Ci0JCQkJfQotCQkJfQotCQkJZ2V0TG9vc2VFYXJNYXAoKS5wdXQoZWFyRmlsZVVSSSwgVVJJLmNyZWF0ZVVSSShsb29zZUFwcGxpY2F0aW9uUmVzb3VyY2UpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlYXJGaWxlVVJJCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMb29zZUFwcGxpY2F0aW9uIGZpbmRMb29zZUFwcGxpY2F0aW9uSWZMb2FkZWQoU3RyaW5nIGVhckZpbGVVUkkpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbklmTG9hZGVkKFN0cmluZwotCQkvLyBlYXJGaWxlVVJJPVwiIitlYXJGaWxlVVJJKyJcIikiKTsKLQkJaWYgKGdldExvb3NlQ29uZmlndXJhdGlvbigpICE9IG51bGwpIHsKLQkJCUxpc3QgYXBwcyA9IGdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBzLnNpemUoKTsgaSsrKSB7Ci0JCQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSAoTG9vc2VBcHBsaWNhdGlvbikgYXBwcy5nZXQoaSk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbklmTG9hZGVkKCk6Ci0JCQkJLy8gYXBwWyIraSsiXS5nZXRVUkkoKT1cIiIrYXBwLmdldFVyaSgpKyJcIiIgKTsKLQkJCQlpZiAoYXBwLmdldFVyaSgpLmVxdWFscyhlYXJGaWxlVVJJKSkKLQkJCQkJcmV0dXJuIGFwcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd3MgYWRkaW5nIExvb3NlQXBwbGljYXRpb25zIGR5bm1pY2FsbHkuCi0JICogCi0JICogQHBhcmFtIGFwcGxpY2F0aW9uCi0JICogICAgICAgICAgICBBbiBhcHBsaWNhdGlvbiBjcmVhdGVkIGFuZCBwZXJzaXN0ZWQgYnkgYW4gZXh0ZXJuYWwgZW50aXR5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkTG9vc2VBcHBsaWNhdGlvbihMb29zZUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0JCWdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpLmFkZChhcHBsaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dzIHJlbW92aW5nIExvb3NlQXBwbGljYXRpb25zIGR5bm1pY2FsbHkuCi0JICogCi0JICogQHBhcmFtIGFwcGxpY2F0aW9uCi0JICogICAgICAgICAgICBBbiBhcHBsaWNhdGlvbiBjcmVhdGVkIGFuZCBwZXJzaXN0ZWQgYnkgYW4gZXh0ZXJuYWwgZW50aXR5Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9vc2VBcHBsaWNhdGlvbihMb29zZUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIucmVtb3ZlTG9vc2VBcHBsaWNhdGlvbihMb29zZUFwcGxpY2F0aW9uCi0JCS8vIGFwcGxpY2F0aW9uPVwiIithcHBsaWNhdGlvbisiXCIpIik7Ci0JCWdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpLnJlbW92ZShhcHBsaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVhckZpbGVVUkkKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBmaWxlIHN5c3RlbSBVUkkgb2YgdGhlIEVBUiBmaWxlIG9mIHRoZSBnaXZlbiBtYXBwaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9vc2VNYXBwaW5nKFN0cmluZyBlYXJGaWxlVVJJKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIucmVtb3ZlTG9vc2VNYXBwaW5nKFN0cmluZwotCQkvLyBlYXJGaWxlVVJJPVwiIitlYXJGaWxlVVJJKyJcIikiKTsKLQkJaWYgKGVhckZpbGVVUkkgIT0gbnVsbCkKLQkJCWdldExvb3NlRWFyTWFwKCkucmVtb3ZlKGVhckZpbGVVUkkpOwotCX0KLQotCXB1YmxpYyBMb29zZU1vZHVsZSBmaW5kTG9vc2VNb2R1bGUoTG9vc2VBcHBsaWNhdGlvbiBhcHAsIFN0cmluZyB1cmksIFN0cmluZyBhbHRERCkgewotCQlMaXN0IGFyY2hpdmVzID0gYXBwLmdldExvb3NlQXJjaGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJTG9vc2VBcmNoaXZlIGVsZW1lbnQgPSAoTG9vc2VBcmNoaXZlKSBhcmNoaXZlcy5nZXQoaSk7Ci0JCQlpZiAoIWVsZW1lbnQuaXNNb2R1bGUoKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHVyaSwgZWxlbWVudC5nZXRVcmkoKSkgJiYgU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwoYWx0REQsICgoTG9vc2VNb2R1bGUpIGVsZW1lbnQpLmdldEFsdEREKCkpKQotCQkJCXJldHVybiAoTG9vc2VNb2R1bGUpIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExvb3NlTW9kdWxlIGZpbmRMb29zZU1vZHVsZShNb2R1bGUgbSwgRUFSRmlsZSBlYXIpIHsKLQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSBmaW5kTG9vc2VBcHBsaWNhdGlvbihlYXIuZ2V0VVJJKCkpOwotCQlyZXR1cm4gYXBwID09IG51bGwgPyBudWxsIDogZmluZExvb3NlTW9kdWxlKGFwcCwgbS5nZXRVcmkoKSwgbS5nZXRBbHRERCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGxvb3NlIGNvbmZpZ3VyYXRpb247IHRoZSBuZXh0IHRpbWUgaXQgaXMgcmVxdWVzdGVkIGl0IHdpbGwgYmUgcmVsb2FkZWQ7Ci0JICovCi0JcHVibGljIHZvaWQgZmx1c2goKSB7Ci0JCWxvYWRBdHRlbXB0ZWQgPSBmYWxzZTsKLQkJbG9vc2VDb25maWd1cmF0aW9uID0gbnVsbDsKLQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZExvb3NlQ29uZmlndXJhdGlvbigpIHsKLQkJUmVzb3VyY2UgcmVzID0gbG9hZExvb3NlQ29uZmlndXJhdGlvblJlc291cmNlKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiAhcmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJc2V0TG9vc2VDb25maWd1cmF0aW9uKChMb29zZUNvbmZpZ3VyYXRpb24pIHJlcy5nZXRDb250ZW50cygpLmdldCgwKSk7Ci0JCWVsc2UKLQkJCS8qCi0JCQkgKiBpZiB0aGUgZG9jdW1lbnQgaXMgZW1wdHkgdGhlbiBmbHVmZiB1cCBhIExvb3NlQ29uZmlndXJhdGlvbiBvYmplY3QKLQkJCSAqLwotCQkJc2V0TG9vc2VDb25maWd1cmF0aW9uKExvb3NlY29uZmlnRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTG9vc2VDb25maWd1cmF0aW9uKCkpOwotCQlsb2FkQXR0ZW1wdGVkID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgbG9hZExvb3NlQ29uZmlndXJhdGlvblJlc291cmNlKCkgewotCQlTdHJpbmcgdXJpID0gZ2V0RG9jdW1lbnRVUkkoKTsKLQkJaWYgKEFyY2hpdmVVdGlsLmlzTnVsbE9yRW1wdHkodXJpKSkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJpKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKCJFeGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyBsb29zZSBjb25maWd1cmF0aW9uIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTG9vc2VBcHBsaWNhdGlvbiBsb2FkTG9vc2VBcHBsaWNhdGlvbihVUkkgbG9vc2VBcHBVUkkpIHsKLQkJUmVzb3VyY2UgcmVzID0gbG9hZExvb3NlQXBwbGljYXRpb25SZXNvdXJjZShsb29zZUFwcFVSSSk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiAhcmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIChMb29zZUFwcGxpY2F0aW9uKSByZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBsb2FkTG9vc2VBcHBsaWNhdGlvblJlc291cmNlKFVSSSBsb29zZUNvbmZpZ1VSSSkgewotCQlpZiAobG9vc2VDb25maWdVUkkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlU2V0LmdldFJlc291cmNlKGxvb3NlQ29uZmlnVVJJLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGxvb3NlIGFwcGxpY2F0aW9uIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb29zZUNvbmZpZ3VyYXRpb24uIEJhc2ljIGFjY2Vzc29yIHdpdGggbm8gaW5pdGlhbGl6YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMb29zZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTG9vc2VDb25maWd1cmF0aW9uIHByaW1HZXRMb29zZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBsb29zZUNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqIFRoZSB2YWx1ZSBvZiB0aGUgbG9vc2UgY29uZmlnIHByb3BlcnR5ICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREb2N1bWVudFVSSSgpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShMT09TRV9DT05GSUdfUFJPUEVSVFkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxvb3NlQ29uZmlndXJhdGlvbi4gVHJpZXMgdG8gbG9hZCBpdCB1c2luZyB0aGUgc3lzdGVtIHByb3BlcnR5IHdhcy5sb29zZS5jb25maWcsIGlmCi0JICogbmVjZXNzYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExvb3NlQ29uZmlndXJhdGlvbiBvciBudWxsCi0JICovCi0JcHVibGljIExvb3NlQ29uZmlndXJhdGlvbiBnZXRMb29zZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChsb29zZUNvbmZpZ3VyYXRpb24gPT0gbnVsbCAmJiAhbG9hZEF0dGVtcHRlZCkKLQkJCWxvYWRMb29zZUNvbmZpZ3VyYXRpb24oKTsKLQkJcmV0dXJuIGxvb3NlQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3N1bXB0aW9uOiB0aGUgcGFyYW1ldGVyIG11c3QgYmUgYSB0eXBlIHRoYXQgY2FuIGhhdmUgY2hpbGRyZW4sIGUuZy4sIExvb3NlV0FSIG9yCi0JICogTG9vc2VBcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBMaXN0IGdldExvb3NlQ2hpbGRyZW4oTG9vc2VBcmNoaXZlIGxvb3NlKSB7Ci0JCWlmIChsb29zZSAhPSBudWxsKSB7Ci0JCQlpZiAobG9vc2UuaXNFQVIoKSkKLQkJCQlyZXR1cm4gKChMb29zZUFwcGxpY2F0aW9uKSBsb29zZSkuZ2V0TG9vc2VBcmNoaXZlcygpOwotCQkJZWxzZSBpZiAobG9vc2UuaXNXQVIoKSkKLQkJCQlyZXR1cm4gKChMb29zZVdBUkZpbGUpIGxvb3NlKS5nZXRMb29zZUxpYnMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBBc3N1bXB0aW9uOiB0aGUgcGFyYW1ldGVyIG11c3QgYmUgYSB0eXBlIHRoYXQgY2FuIGhhdmUgY2hpbGRyZW4sIGUuZy4sIExvb3NlV0FSIG9yCi0JICogTG9vc2VBcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBMb29zZUFyY2hpdmUgZmluZEZpcnN0TG9vc2VDaGlsZChTdHJpbmcgdXJpLCBMb29zZUFyY2hpdmUgbG9vc2UpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IGdldExvb3NlQ2hpbGRyZW4obG9vc2UpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlMb29zZUFyY2hpdmUgY2hpbGQgPSAoTG9vc2VBcmNoaXZlKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwodXJpLCBjaGlsZC5nZXRVcmkoKSkpCi0JCQkJcmV0dXJuIGxvb3NlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxvb3NlQ29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbG9vc2VDb25maWd1cmF0aW9uCi0JICogICAgICAgICAgICBUaGUgbG9vc2VDb25maWd1cmF0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvb3NlQ29uZmlndXJhdGlvbihMb29zZUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWxvb3NlQ29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBIYXZlIHdlIHByZXZpb3VzbHkgbG9hZGVkIG9yIHRyaWVkIHRvIGxvYWQgdGhlIGxvb3NlIGNvbmZpZ3VyYXRpb24/Ci0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldExvYWRBdHRlbXB0ZWQoKSB7Ci0JCXJldHVybiBsb2FkQXR0ZW1wdGVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9vc2VFYXJNYXAuCi0JICovCi0JcHVibGljIE1hcCBnZXRMb29zZUVhck1hcCgpIHsKLQkJaWYgKGxvb3NlRWFyTWFwID09IG51bGwpCi0JCQlsb29zZUVhck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBsb29zZUVhck1hcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUNvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhjZjhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9vc2VDb25maWd1cmF0aW9uIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBBcHBsaWNhdGlvbnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEFwcGxpY2F0aW9ucygpOwotCi19IC8vTG9vc2VDb25maWd1cmF0aW9uCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUxpYnJhcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODZlMzY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlTGlicmFyeSBleHRlbmRzIExvb3NlQXJjaGl2ZSB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBMb29zZVdBUiByZWZlcmVuY2UKLQkgKi8KLQlMb29zZVdBUkZpbGUgZ2V0TG9vc2VXQVIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExvb3NlV0FSIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TG9vc2VXQVIoTG9vc2VXQVJGaWxlIHZhbHVlKTsKLQotfSAvL0xvb3NlTGlicmFyeQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTAwOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMb29zZU1vZHVsZSBleHRlbmRzIExvb3NlQXJjaGl2ZSB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQWx0REQgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldEFsdEREKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQWx0REQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRBbHRERChTdHJpbmcgdmFsdWUpOwotCi19IC8vTG9vc2VNb2R1bGUKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlV0FSRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VXQVJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZmU1NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VXQVJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlV0FSRmlsZSBleHRlbmRzIExvb3NlTW9kdWxlIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTG9vc2VMaWJzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRMb29zZUxpYnMoKTsKLQotfSAvL0xvb3NlV0FSRmlsZQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZWNvbmZpZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1MmY3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZWNvbmZpZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLkxvb3NlY29uZmlnUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlY29uZmlnRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvb3NlY29uZmlnRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlY29uZmlnRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBBcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9vc2UgQXBwbGljYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvb3NlQXBwbGljYXRpb24gY3JlYXRlTG9vc2VBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBMaWJyYXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBMaWJyYXJ5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb29zZUxpYnJhcnkgY3JlYXRlTG9vc2VMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvb3NlIE1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9vc2UgTW9kdWxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb29zZU1vZHVsZSBjcmVhdGVMb29zZU1vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb29zZUNvbmZpZ3VyYXRpb24gY3JlYXRlTG9vc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvb3NlIFdBUiBGaWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb29zZSBXQVIgRmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTG9vc2VXQVJGaWxlIGNyZWF0ZUxvb3NlV0FSRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb29zZWNvbmZpZ1BhY2thZ2UgZ2V0TG9vc2Vjb25maWdQYWNrYWdlKCk7Ci0KLX0gLy9Mb29zZWNvbmZpZ0ZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlY29uZmlnUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmU2ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5Mb29zZWNvbmZpZ0ZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlY29uZmlnUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJsb29zZWNvbmZpZyI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImNvbW1vbmFyY2hpdmUubG9vc2Vjb25maWcueG1pIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTG9vc2Vjb25maWdQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2Vjb25maWdQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VBcmNoaXZlSW1wbCA8ZW0+TG9vc2UgQXJjaGl2ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VBcmNoaXZlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlQXJjaGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT09TRV9BUkNISVZFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9BUkNISVZFX19VUkkgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CaW5hcmllcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEggPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb29zZSBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TG9vc2UgQXJjaGl2ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9BUkNISVZFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZUFwcGxpY2F0aW9uSW1wbCA8ZW0+TG9vc2UgQXBwbGljYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlQXBwbGljYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlY29uZmlnUGFja2FnZUltcGwjZ2V0TG9vc2VBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT09TRV9BUFBMSUNBVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fX1VSSSA9IExPT1NFX0FSQ0hJVkVfX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CaW5hcmllcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fX0JJTkFSSUVTX1BBVEggPSBMT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fX1JFU09VUkNFU19QQVRIID0gTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9vc2UgQXBwPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUFAgPSBMT09TRV9BUkNISVZFX19MT09TRV9BUFA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9vc2UgQXJjaGl2ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUyA9IExPT1NFX0FSQ0hJVkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TG9vc2UgQXBwbGljYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fRkVBVFVSRV9DT1VOVCA9IExPT1NFX0FSQ0hJVkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VMaWJyYXJ5SW1wbCA8ZW0+TG9vc2UgTGlicmFyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VMaWJyYXJ5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT09TRV9MSUJSQVJZID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9MSUJSQVJZX19VUkkgPSBMT09TRV9BUkNISVZFX19VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmluYXJpZXMgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX0xJQlJBUllfX0JJTkFSSUVTX1BBVEggPSBMT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTElCUkFSWV9fUkVTT1VSQ0VTX1BBVEggPSBMT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb29zZSBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTElCUkFSWV9fTE9PU0VfQVBQID0gTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvb3NlIFdBUjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9MSUJSQVJZX19MT09TRV9XQVIgPSBMT09TRV9BUkNISVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvb3NlIExpYnJhcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTElCUkFSWV9GRUFUVVJFX0NPVU5UID0gTE9PU0VfQVJDSElWRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZU1vZHVsZUltcGwgPGVtPkxvb3NlIE1vZHVsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VNb2R1bGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlY29uZmlnUGFja2FnZUltcGwjZ2V0TG9vc2VNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9NT0RVTEVfX1VSSSA9IExPT1NFX0FSQ0hJVkVfX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CaW5hcmllcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFX19CSU5BUklFU19QQVRIID0gTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXMgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX01PRFVMRV9fUkVTT1VSQ0VTX1BBVEggPSBMT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb29zZSBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFX19MT09TRV9BUFAgPSBMT09TRV9BUkNISVZFX19MT09TRV9BUFA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0IEREPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFX19BTFRfREQgPSBMT09TRV9BUkNISVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvb3NlIE1vZHVsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9NT0RVTEVfRkVBVFVSRV9DT1VOVCA9IExPT1NFX0FSQ0hJVkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VDb25maWd1cmF0aW9uSW1wbCA8ZW0+TG9vc2UgQ29uZmlndXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VDb25maWd1cmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT09TRV9DT05GSUdVUkFUSU9OID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvb3NlIENvbmZpZ3VyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfQ09ORklHVVJBVElPTl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VXQVJGaWxlSW1wbCA8ZW0+TG9vc2UgV0FSIEZpbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlV0FSRmlsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2Vjb25maWdQYWNrYWdlSW1wbCNnZXRMb29zZVdBUkZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTE9PU0VfV0FSX0ZJTEUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX19VUkkgPSBMT09TRV9NT0RVTEVfX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CaW5hcmllcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfV0FSX0ZJTEVfX0JJTkFSSUVTX1BBVEggPSBMT09TRV9NT0RVTEVfX0JJTkFSSUVTX1BBVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2VzIFBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9XQVJfRklMRV9fUkVTT1VSQ0VTX1BBVEggPSBMT09TRV9NT0RVTEVfX1JFU09VUkNFU19QQVRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvb3NlIEFwcDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9XQVJfRklMRV9fTE9PU0VfQVBQID0gTE9PU0VfTU9EVUxFX19MT09TRV9BUFA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0IEREPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9PU0VfV0FSX0ZJTEVfX0FMVF9ERCA9IExPT1NFX01PRFVMRV9fQUxUX0REOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvb3NlIExpYnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTID0gTE9PU0VfTU9EVUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvb3NlIFdBUiBGaWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBMT09TRV9NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb24gPGVtPkxvb3NlIEFwcGxpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxvb3NlIEFwcGxpY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9vc2VBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb24jZ2V0TG9vc2VBcmNoaXZlcyA8ZW0+TG9vc2UgQXJjaGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxvb3NlIEFyY2hpdmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbiNnZXRMb29zZUFyY2hpdmVzKCkKLQkgKiBAc2VlICNnZXRMb29zZUFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb29zZUFwcGxpY2F0aW9uX0xvb3NlQXJjaGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZSA8ZW0+TG9vc2UgQXJjaGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Mb29zZSBBcmNoaXZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRMb29zZUFyY2hpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlI2dldFVyaSA8ZW0+VXJpPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXJpPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlI2dldFVyaSgpCi0JICogQHNlZSAjZ2V0TG9vc2VBcmNoaXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb29zZUFyY2hpdmVfVXJpKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZSNnZXRCaW5hcmllc1BhdGggPGVtPkJpbmFyaWVzIFBhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CaW5hcmllcyBQYXRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlI2dldEJpbmFyaWVzUGF0aCgpCi0JICogQHNlZSAjZ2V0TG9vc2VBcmNoaXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb29zZUFyY2hpdmVfQmluYXJpZXNQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZSNnZXRSZXNvdXJjZXNQYXRoIDxlbT5SZXNvdXJjZXMgUGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlcyBQYXRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlI2dldFJlc291cmNlc1BhdGgoKQotCSAqIEBzZWUgI2dldExvb3NlQXJjaGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9vc2VBcmNoaXZlX1Jlc291cmNlc1BhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZSNnZXRMb29zZUFwcCA8ZW0+TG9vc2UgQXBwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkxvb3NlIEFwcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZSNnZXRMb29zZUFwcCgpCi0JICogQHNlZSAjZ2V0TG9vc2VBcmNoaXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb29zZUFyY2hpdmVfTG9vc2VBcHAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeSA8ZW0+TG9vc2UgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Mb29zZSBMaWJyYXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRMb29zZUxpYnJhcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeSNnZXRMb29zZVdBUiA8ZW0+TG9vc2UgV0FSPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkxvb3NlIFdBUjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeSNnZXRMb29zZVdBUigpCi0JICogQHNlZSAjZ2V0TG9vc2VMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlIDxlbT5Mb29zZSBNb2R1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9vc2UgTW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExvb3NlTW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlI2dldEFsdEREIDxlbT5BbHQgREQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHQgREQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZU1vZHVsZSNnZXRBbHRERCgpCi0JICogQHNlZSAjZ2V0TG9vc2VNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExvb3NlTW9kdWxlX0FsdEREKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ3VyYXRpb24gPGVtPkxvb3NlIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9vc2UgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9vc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWd1cmF0aW9uI2dldEFwcGxpY2F0aW9ucyA8ZW0+QXBwbGljYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BcHBsaWNhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ3VyYXRpb24jZ2V0QXBwbGljYXRpb25zKCkKLQkgKiBAc2VlICNnZXRMb29zZUNvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExvb3NlQ29uZmlndXJhdGlvbl9BcHBsaWNhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZSA8ZW0+TG9vc2UgV0FSIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9vc2UgV0FSIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExvb3NlV0FSRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZSNnZXRMb29zZUxpYnMgPGVtPkxvb3NlIExpYnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxvb3NlIExpYnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGUjZ2V0TG9vc2VMaWJzKCkKLQkgKiBAc2VlICNnZXRMb29zZVdBUkZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExvb3NlV0FSRmlsZV9Mb29zZUxpYnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvb3NlY29uZmlnRmFjdG9yeSBnZXRMb29zZWNvbmZpZ0ZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZUFwcGxpY2F0aW9uSW1wbCA8ZW0+TG9vc2UgQXBwbGljYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlQXBwbGljYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlQXBwbGljYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTE9PU0VfQVBQTElDQVRJT04gPSBlSU5TVEFOQ0UuZ2V0TG9vc2VBcHBsaWNhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9vc2UgQXJjaGl2ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUyA9IGVJTlNUQU5DRS5nZXRMb29zZUFwcGxpY2F0aW9uX0xvb3NlQXJjaGl2ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VBcmNoaXZlSW1wbCA8ZW0+TG9vc2UgQXJjaGl2ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VBcmNoaXZlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2Vjb25maWdQYWNrYWdlSW1wbCNnZXRMb29zZUFyY2hpdmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTE9PU0VfQVJDSElWRSA9IGVJTlNUQU5DRS5nZXRMb29zZUFyY2hpdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExPT1NFX0FSQ0hJVkVfX1VSSSA9IGVJTlNUQU5DRS5nZXRMb29zZUFyY2hpdmVfVXJpKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CaW5hcmllcyBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSCA9IGVJTlNUQU5DRS5nZXRMb29zZUFyY2hpdmVfQmluYXJpZXNQYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXMgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExPT1NFX0FSQ0hJVkVfX1JFU09VUkNFU19QQVRIID0gZUlOU1RBTkNFLmdldExvb3NlQXJjaGl2ZV9SZXNvdXJjZXNQYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb29zZSBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQID0gZUlOU1RBTkNFLmdldExvb3NlQXJjaGl2ZV9Mb29zZUFwcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZUxpYnJhcnlJbXBsIDxlbT5Mb29zZSBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZUxpYnJhcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlTGlicmFyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMT09TRV9MSUJSQVJZID0gZUlOU1RBTkNFLmdldExvb3NlTGlicmFyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9vc2UgV0FSPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiA9IGVJTlNUQU5DRS5nZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2VNb2R1bGVJbXBsIDxlbT5Mb29zZSBNb2R1bGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlTW9kdWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGwuTG9vc2Vjb25maWdQYWNrYWdlSW1wbCNnZXRMb29zZU1vZHVsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMT09TRV9NT0RVTEUgPSBlSU5TVEFOQ0UuZ2V0TG9vc2VNb2R1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdCBERDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExPT1NFX01PRFVMRV9fQUxUX0REID0gZUlOU1RBTkNFLmdldExvb3NlTW9kdWxlX0FsdEREKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlQ29uZmlndXJhdGlvbkltcGwgPGVtPkxvb3NlIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlQ29uZmlndXJhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlY29uZmlnUGFja2FnZUltcGwjZ2V0TG9vc2VDb25maWd1cmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExPT1NFX0NPTkZJR1VSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0TG9vc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUyA9IGVJTlNUQU5DRS5nZXRMb29zZUNvbmZpZ3VyYXRpb25fQXBwbGljYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlV0FSRmlsZUltcGwgPGVtPkxvb3NlIFdBUiBGaWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZVdBUkZpbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsI2dldExvb3NlV0FSRmlsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMT09TRV9XQVJfRklMRSA9IGVJTlNUQU5DRS5nZXRMb29zZVdBUkZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvb3NlIExpYnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTID0gZUlOU1RBTkNFLmdldExvb3NlV0FSRmlsZV9Mb29zZUxpYnMoKTsKLQotCX0KLQotfSAvL0xvb3NlY29uZmlnUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFwcGxpY2F0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFwcGxpY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzhlNTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VBcHBsaWNhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb29zZUFwcGxpY2F0aW9uSW1wbCBleHRlbmRzIExvb3NlQXJjaGl2ZUltcGwgaW1wbGVtZW50cyBMb29zZUFwcGxpY2F0aW9uIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbG9vc2VBcmNoaXZlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VBcHBsaWNhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLkxpdGVyYWxzLkxPT1NFX0FQUExJQ0FUSU9OOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEVMaXN0IGdldExvb3NlQXJjaGl2ZXMoKSB7Ci0JCWlmIChsb29zZUFyY2hpdmVzID09IG51bGwpIHsKLQkJCWxvb3NlQXJjaGl2ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChMb29zZUFyY2hpdmUuY2xhc3MsIHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFApOwotCQl9Ci0JCXJldHVybiBsb29zZUFyY2hpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExvb3NlQXJjaGl2ZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMb29zZUFyY2hpdmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgotCQkJCXJldHVybiBnZXRMb29zZUFyY2hpdmVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUzoKLQkJCQlnZXRMb29zZUFyY2hpdmVzKCkuY2xlYXIoKTsKLQkJCQlnZXRMb29zZUFyY2hpdmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgotCQkJCWdldExvb3NlQXJjaGl2ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgotCQkJCXJldHVybiBsb29zZUFyY2hpdmVzICE9IG51bGwgJiYgIWxvb3NlQXJjaGl2ZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VBcmNoaXZlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFyY2hpdmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NzdhNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFyY2hpdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb29zZUFyY2hpdmVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTG9vc2VBcmNoaXZlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpKCkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1cmkgPSBVUklfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJpbmFyaWVzUGF0aCgpIDxlbT5CaW5hcmllcyBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmluYXJpZXNQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5BUklFU19QQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYmluYXJpZXNQYXRoID0gQklOQVJJRVNfUEFUSF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VzUGF0aCgpIDxlbT5SZXNvdXJjZXMgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlc1BhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFU19QQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VzUGF0aCA9IFJFU09VUkNFU19QQVRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIExvb3NlQXJjaGl2ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLkxpdGVyYWxzLkxPT1NFX0FSQ0hJVkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIG5ld1VyaSkgewotCQlTdHJpbmcgb2xkVXJpID0gdXJpOwotCQl1cmkgPSBuZXdVcmk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19VUkksIG9sZFVyaSwgdXJpKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFQVIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1dBUigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCaW5hcmllc1BhdGgoKSB7Ci0JCXJldHVybiBiaW5hcmllc1BhdGg7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmluYXJpZXNQYXRoKFN0cmluZyBuZXdCaW5hcmllc1BhdGgpIHsKLQkJU3RyaW5nIG9sZEJpbmFyaWVzUGF0aCA9IGJpbmFyaWVzUGF0aDsKLQkJYmluYXJpZXNQYXRoID0gbmV3QmluYXJpZXNQYXRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSCwgb2xkQmluYXJpZXNQYXRoLCBiaW5hcmllc1BhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VzUGF0aCgpIHsKLQkJcmV0dXJuIHJlc291cmNlc1BhdGg7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzUGF0aChTdHJpbmcgbmV3UmVzb3VyY2VzUGF0aCkgewotCQlTdHJpbmcgb2xkUmVzb3VyY2VzUGF0aCA9IHJlc291cmNlc1BhdGg7Ci0JCXJlc291cmNlc1BhdGggPSBuZXdSZXNvdXJjZXNQYXRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEgsIG9sZFJlc291cmNlc1BhdGgsIHJlc291cmNlc1BhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBMb29zZUFwcGxpY2F0aW9uIGdldExvb3NlQXBwKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChMb29zZUFwcGxpY2F0aW9uKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRMb29zZUFwcChMb29zZUFwcGxpY2F0aW9uIG5ld0xvb3NlQXBwLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdMb29zZUFwcCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvb3NlQXBwKExvb3NlQXBwbGljYXRpb24gbmV3TG9vc2VBcHApIHsKLQkJaWYgKG5ld0xvb3NlQXBwICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFAgJiYgbmV3TG9vc2VBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdMb29zZUFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0xvb3NlQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0xvb3NlQXBwKS5lSW52ZXJzZUFkZCh0aGlzLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTLCBMb29zZUFwcGxpY2F0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldExvb3NlQXBwKG5ld0xvb3NlQXBwLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFAsIG5ld0xvb3NlQXBwLCBuZXdMb29zZUFwcCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kdWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRMb29zZUFwcCgoTG9vc2VBcHBsaWNhdGlvbilvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRMb29zZUFwcChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFA6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVMsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVyaSgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0QmluYXJpZXNQYXRoKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzUGF0aCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgotCQkJCXJldHVybiBnZXRMb29zZUFwcCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19VUkk6Ci0JCQkJc2V0VXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJc2V0QmluYXJpZXNQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1JFU09VUkNFU19QQVRIOgotCQkJCXNldFJlc291cmNlc1BhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgotCQkJCXNldExvb3NlQXBwKChMb29zZUFwcGxpY2F0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fVVJJOgotCQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJc2V0QmluYXJpZXNQYXRoKEJJTkFSSUVTX1BBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1JFU09VUkNFU19QQVRIOgotCQkJCXNldFJlc291cmNlc1BhdGgoUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDoKLQkJCQlzZXRMb29zZUFwcCgoTG9vc2VBcHBsaWNhdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIOgotCQkJCXJldHVybiBCSU5BUklFU19QQVRIX0VERUZBVUxUID09IG51bGwgPyBiaW5hcmllc1BhdGggIT0gbnVsbCA6ICFCSU5BUklFU19QQVRIX0VERUZBVUxULmVxdWFscyhiaW5hcmllc1BhdGgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJcmV0dXJuIFJFU09VUkNFU19QQVRIX0VERUZBVUxUID09IG51bGwgPyByZXNvdXJjZXNQYXRoICE9IG51bGwgOiAhUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlc1BhdGgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgotCQkJCXJldHVybiBnZXRMb29zZUFwcCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1cmk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmluYXJpZXNQYXRoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiaW5hcmllc1BhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlc1BhdGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlc1BhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Mb29zZUFyY2hpdmVJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQ29uZmlndXJhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VDb25maWd1cmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU2MDgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VDb25maWd1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTG9vc2VDb25maWd1cmF0aW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExvb3NlQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFwcGxpY2F0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VDb25maWd1cmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuTGl0ZXJhbHMuTE9PU0VfQ09ORklHVVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBcHBsaWNhdGlvbnMoKSB7Ci0JCWlmIChhcHBsaWNhdGlvbnMgPT0gbnVsbCkgewotCQkJYXBwbGljYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExvb3NlQXBwbGljYXRpb24uY2xhc3MsIHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9DT05GSUdVUkFUSU9OX19BUFBMSUNBVElPTlMpOwotCQl9Ci0JCXJldHVybiBhcHBsaWNhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXBwbGljYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCWdldEFwcGxpY2F0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXBwbGljYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCWdldEFwcGxpY2F0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9DT05GSUdVUkFUSU9OX19BUFBMSUNBVElPTlM6Ci0JCQkJcmV0dXJuIGFwcGxpY2F0aW9ucyAhPSBudWxsICYmICFhcHBsaWNhdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Mb29zZUNvbmZpZ3VyYXRpb25JbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlTGlicmFyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VMaWJyYXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzYxNGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VMaWJyYXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvb3NlTGlicmFyeUltcGwgZXh0ZW5kcyBMb29zZUFyY2hpdmVJbXBsIGltcGxlbWVudHMgTG9vc2VMaWJyYXJ5IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VMaWJyYXJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuTGl0ZXJhbHMuTE9PU0VfTElCUkFSWTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBMb29zZVdBUkZpbGUgZ2V0TG9vc2VXQVIoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKExvb3NlV0FSRmlsZSllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TG9vc2VXQVIoTG9vc2VXQVJGaWxlIG5ld0xvb3NlV0FSLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdMb29zZVdBUiwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvb3NlV0FSKExvb3NlV0FSRmlsZSBuZXdMb29zZVdBUikgewotCQlpZiAobmV3TG9vc2VXQVIgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiAmJiBuZXdMb29zZVdBUiAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0xvb3NlV0FSKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3TG9vc2VXQVIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TG9vc2VXQVIpLmVJbnZlcnNlQWRkKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUywgTG9vc2VXQVJGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldExvb3NlV0FSKG5ld0xvb3NlV0FSLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIsIG5ld0xvb3NlV0FSLCBuZXdMb29zZVdBUikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TG9vc2VXQVIoKExvb3NlV0FSRmlsZSlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRMb29zZVdBUihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVI6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUywgTG9vc2VXQVJGaWxlLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgotCQkJCXJldHVybiBnZXRMb29zZVdBUigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVI6Ci0JCQkJc2V0TG9vc2VXQVIoKExvb3NlV0FSRmlsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKLQkJCQlzZXRMb29zZVdBUigoTG9vc2VXQVJGaWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgotCQkJCXJldHVybiBnZXRMb29zZVdBUigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0xvb3NlTGlicmFyeUltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VNb2R1bGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlTW9kdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI1OThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VNb2R1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvb3NlTW9kdWxlSW1wbCBleHRlbmRzIExvb3NlQXJjaGl2ZUltcGwgaW1wbGVtZW50cyBMb29zZU1vZHVsZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdEREKCkgPGVtPkFsdCBERDwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEFsdEREKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRfRERfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRERCA9IEFMVF9ERF9FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBMb29zZU1vZHVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLkxpdGVyYWxzLkxPT1NFX01PRFVMRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0REQoKSB7Ci0JCXJldHVybiBhbHRERDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRERChTdHJpbmcgbmV3QWx0REQpIHsKLQkJU3RyaW5nIG9sZEFsdEREID0gYWx0REQ7Ci0JCWFsdEREID0gbmV3QWx0REQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0FMVF9ERCwgb2xkQWx0REQsIGFsdEREKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19BTFRfREQ6Ci0JCQkJcmV0dXJuIGdldEFsdEREKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQUxUX0REOgotCQkJCXNldEFsdEREKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0FMVF9ERDoKLQkJCQlzZXRBbHRERChBTFRfRERfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19BTFRfREQ6Ci0JCQkJcmV0dXJuIEFMVF9ERF9FREVGQVVMVCA9PSBudWxsID8gYWx0REQgIT0gbnVsbCA6ICFBTFRfRERfRURFRkFVTFQuZXF1YWxzKGFsdEREKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFsdEREOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbHRERCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0xvb3NlTW9kdWxlSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZVdBUkZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlV0FSRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5MjcwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlV0FSRmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvb3NlV0FSRmlsZUltcGwgZXh0ZW5kcyBMb29zZU1vZHVsZUltcGwgaW1wbGVtZW50cyBMb29zZVdBUkZpbGUgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBsb29zZUxpYnMgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIExvb3NlV0FSRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLkxpdGVyYWxzLkxPT1NFX1dBUl9GSUxFOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzV0FSKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRMb29zZUxpYnMoKSB7Ci0JCWlmIChsb29zZUxpYnMgPT0gbnVsbCkgewotCQkJbG9vc2VMaWJzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTG9vc2VMaWJyYXJ5LmNsYXNzLCB0aGlzLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIpOwotCQl9Ci0JCXJldHVybiBsb29zZUxpYnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMb29zZUxpYnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExvb3NlTGlicygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTOgotCQkJCXJldHVybiBnZXRMb29zZUxpYnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6Ci0JCQkJZ2V0TG9vc2VMaWJzKCkuY2xlYXIoKTsKLQkJCQlnZXRMb29zZUxpYnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUzoKLQkJCQlnZXRMb29zZUxpYnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6Ci0JCQkJcmV0dXJuIGxvb3NlTGlicyAhPSBudWxsICYmICFsb29zZUxpYnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Mb29zZVdBUkZpbGVJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODAwZWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIExvb3NlY29uZmlnRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBMb29zZWNvbmZpZ0ZhY3RvcnksIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBMb29zZWNvbmZpZ0ZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCUxvb3NlY29uZmlnRmFjdG9yeSB0aGVMb29zZWNvbmZpZ0ZhY3RvcnkgPSAoTG9vc2Vjb25maWdGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIpOyAKLQkJCWlmICh0aGVMb29zZWNvbmZpZ0ZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVMb29zZWNvbmZpZ0ZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgTG9vc2Vjb25maWdGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZWNvbmZpZ0ZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT046IHJldHVybiBjcmVhdGVMb29zZUFwcGxpY2F0aW9uKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZOiByZXR1cm4gY3JlYXRlTG9vc2VMaWJyYXJ5KCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEU6IHJldHVybiBjcmVhdGVMb29zZU1vZHVsZSgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTjogcmV0dXJuIGNyZWF0ZUxvb3NlQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEU6IHJldHVybiBjcmVhdGVMb29zZVdBUkZpbGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZUFwcGxpY2F0aW9uIGNyZWF0ZUxvb3NlQXBwbGljYXRpb24oKSB7Ci0JCUxvb3NlQXBwbGljYXRpb25JbXBsIGxvb3NlQXBwbGljYXRpb24gPSBuZXcgTG9vc2VBcHBsaWNhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGxvb3NlQXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlTGlicmFyeSBjcmVhdGVMb29zZUxpYnJhcnkoKSB7Ci0JCUxvb3NlTGlicmFyeUltcGwgbG9vc2VMaWJyYXJ5ID0gbmV3IExvb3NlTGlicmFyeUltcGwoKTsKLQkJcmV0dXJuIGxvb3NlTGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2VXQVJGaWxlIGNyZWF0ZUxvb3NlV0FSRmlsZSgpIHsKLQkJTG9vc2VXQVJGaWxlSW1wbCBsb29zZVdBUkZpbGUgPSBuZXcgTG9vc2VXQVJGaWxlSW1wbCgpOwotCQlyZXR1cm4gbG9vc2VXQVJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZU1vZHVsZSBjcmVhdGVMb29zZU1vZHVsZSgpIHsKLQkJTG9vc2VNb2R1bGVJbXBsIGxvb3NlTW9kdWxlID0gbmV3IExvb3NlTW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gbG9vc2VNb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlQ29uZmlndXJhdGlvbiBjcmVhdGVMb29zZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCUxvb3NlQ29uZmlndXJhdGlvbkltcGwgbG9vc2VDb25maWd1cmF0aW9uID0gbmV3IExvb3NlQ29uZmlndXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGxvb3NlQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2Vjb25maWdQYWNrYWdlIGdldExvb3NlY29uZmlnUGFja2FnZSgpIHsKLQkJcmV0dXJuIChMb29zZWNvbmZpZ1BhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExvb3NlY29uZmlnUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Mb29zZWNvbmZpZ0ZhY3RvcnlJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI4NzQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIExvb3NlY29uZmlnUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBMb29zZWNvbmZpZ1BhY2thZ2UsCi0gKiAgICAgICAgICBFUGFja2FnZSB7fQotICovCi1wdWJsaWMgY2xhc3MgTG9vc2Vjb25maWdQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIExvb3NlY29uZmlnUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvb3NlQXBwbGljYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvb3NlQXJjaGl2ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9vc2VMaWJyYXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb29zZU1vZHVsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9vc2VDb25maWd1cmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb29zZVdBUkZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJpdmF0ZSBMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBMb29zZWNvbmZpZ0ZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBMb29zZWNvbmZpZ1BhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKExvb3NlY29uZmlnUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMb29zZWNvbmZpZ1BhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlMb29zZWNvbmZpZ1BhY2thZ2VJbXBsIHRoZUxvb3NlY29uZmlnUGFja2FnZSA9IChMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIExvb3NlY29uZmlnUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUVqYlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKc3BQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsIHRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlID0gKENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25hcmNoaXZlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25hcmNoaXZlUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlTG9vc2Vjb25maWdQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25hcmNoaXZlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUxvb3NlY29uZmlnUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUxvb3NlY29uZmlnUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlTG9vc2Vjb25maWdQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9vc2VBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGxvb3NlQXBwbGljYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9vc2VBcHBsaWNhdGlvbl9Mb29zZUFyY2hpdmVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9vc2VBcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9vc2VBcmNoaXZlKCkgewotCQlyZXR1cm4gbG9vc2VBcmNoaXZlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvb3NlQXJjaGl2ZV9VcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb29zZUFyY2hpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb29zZUFyY2hpdmVfQmluYXJpZXNQYXRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9vc2VBcmNoaXZlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9vc2VBcmNoaXZlX1Jlc291cmNlc1BhdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb29zZUFyY2hpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZUFyY2hpdmVfTG9vc2VBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsb29zZUFyY2hpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvb3NlTGlicmFyeSgpIHsKLQkJcmV0dXJuIGxvb3NlTGlicmFyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsb29zZUxpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvb3NlV0FSRmlsZSgpIHsKLQkJcmV0dXJuIGxvb3NlV0FSRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9vc2VXQVJGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMb29zZU1vZHVsZSgpIHsKLQkJcmV0dXJuIGxvb3NlTW9kdWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvb3NlTW9kdWxlX0FsdEREKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9vc2VNb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvb3NlQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGxvb3NlQ29uZmlndXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZUNvbmZpZ3VyYXRpb25fQXBwbGljYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9vc2VDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlY29uZmlnRmFjdG9yeSBnZXRMb29zZWNvbmZpZ0ZhY3RvcnkoKSB7Ci0JCXJldHVybiAoTG9vc2Vjb25maWdGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJbG9vc2VBcHBsaWNhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT09TRV9BUFBMSUNBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9vc2VBcHBsaWNhdGlvbkVDbGFzcywgTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTKTsKLQotCQlsb29zZUFyY2hpdmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9PU0VfQVJDSElWRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9vc2VBcmNoaXZlRUNsYXNzLCBMT09TRV9BUkNISVZFX19VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvb3NlQXJjaGl2ZUVDbGFzcywgTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9vc2VBcmNoaXZlRUNsYXNzLCBMT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9vc2VBcmNoaXZlRUNsYXNzLCBMT09TRV9BUkNISVZFX19MT09TRV9BUFApOwotCi0JCWxvb3NlTGlicmFyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT09TRV9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb29zZUxpYnJhcnlFQ2xhc3MsIExPT1NFX0xJQlJBUllfX0xPT1NFX1dBUik7Ci0KLQkJbG9vc2VNb2R1bGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9PU0VfTU9EVUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb29zZU1vZHVsZUVDbGFzcywgTE9PU0VfTU9EVUxFX19BTFRfREQpOwotCi0JCWxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT09TRV9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb29zZUNvbmZpZ3VyYXRpb25FQ2xhc3MsIExPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUyk7Ci0KLQkJbG9vc2VXQVJGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPT1NFX1dBUl9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb29zZVdBUkZpbGVFQ2xhc3MsIExPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJbG9vc2VBcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExvb3NlQXJjaGl2ZSgpKTsKLQkJbG9vc2VBcmNoaXZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWxvb3NlTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExvb3NlQXJjaGl2ZSgpKTsKLQkJbG9vc2VNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMb29zZUFyY2hpdmUoKSk7Ci0JCWxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlsb29zZVdBUkZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMb29zZU1vZHVsZSgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGxvb3NlQXBwbGljYXRpb25FQ2xhc3MsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsICJMb29zZUFwcGxpY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUFwcGxpY2F0aW9uX0xvb3NlQXJjaGl2ZXMoKSwgdGhpcy5nZXRMb29zZUFyY2hpdmUoKSwgdGhpcy5nZXRMb29zZUFyY2hpdmVfTG9vc2VBcHAoKSwgImxvb3NlQXJjaGl2ZXMiLCBudWxsLCAwLCAtMSwgTG9vc2VBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlQXJjaGl2ZUVDbGFzcywgTG9vc2VBcmNoaXZlLmNsYXNzLCAiTG9vc2VBcmNoaXZlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvb3NlQXJjaGl2ZV9VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsIExvb3NlQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9vc2VBcmNoaXZlX0JpbmFyaWVzUGF0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYmluYXJpZXNQYXRoIiwgbnVsbCwgMCwgMSwgTG9vc2VBcmNoaXZlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb29zZUFyY2hpdmVfUmVzb3VyY2VzUGF0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VzUGF0aCIsIG51bGwsIDAsIDEsIExvb3NlQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9vc2VBcmNoaXZlX0xvb3NlQXBwKCksIHRoaXMuZ2V0TG9vc2VBcHBsaWNhdGlvbigpLCB0aGlzLmdldExvb3NlQXBwbGljYXRpb25fTG9vc2VBcmNoaXZlcygpLCAibG9vc2VBcHAiLCBudWxsLCAwLCAxLCBMb29zZUFyY2hpdmUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJYWRkRU9wZXJhdGlvbihsb29zZUFyY2hpdmVFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNNb2R1bGUiLCAwLCAxKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlTGlicmFyeUVDbGFzcywgTG9vc2VMaWJyYXJ5LmNsYXNzLCAiTG9vc2VMaWJyYXJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKSwgdGhpcy5nZXRMb29zZVdBUkZpbGUoKSwgdGhpcy5nZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCksICJsb29zZVdBUiIsIG51bGwsIDAsIDEsIExvb3NlTGlicmFyeS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlTW9kdWxlRUNsYXNzLCBMb29zZU1vZHVsZS5jbGFzcywgIkxvb3NlTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb29zZU1vZHVsZV9BbHRERCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWx0REQiLCBudWxsLCAwLCAxLCBMb29zZU1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcywgTG9vc2VDb25maWd1cmF0aW9uLmNsYXNzLCAiTG9vc2VDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUNvbmZpZ3VyYXRpb25fQXBwbGljYXRpb25zKCksIHRoaXMuZ2V0TG9vc2VBcHBsaWNhdGlvbigpLCBudWxsLCAiYXBwbGljYXRpb25zIiwgbnVsbCwgMCwgLTEsIExvb3NlQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlV0FSRmlsZUVDbGFzcywgTG9vc2VXQVJGaWxlLmNsYXNzLCAiTG9vc2VXQVJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCksIHRoaXMuZ2V0TG9vc2VMaWJyYXJ5KCksIHRoaXMuZ2V0TG9vc2VMaWJyYXJ5X0xvb3NlV0FSKCksICJsb29zZUxpYnMiLCBudWxsLCAwLCAtMSwgTG9vc2VXQVJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCX0KLQotfSAvL0xvb3NlY29uZmlnUGFja2FnZUltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNDAyMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7fQotICovCi1wdWJsaWMgY2xhc3MgTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExvb3NlY29uZmlnUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2Vjb25maWdTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgTG9vc2Vjb25maWdTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUFwcGxpY2F0aW9uKExvb3NlQXBwbGljYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvb3NlQXBwbGljYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUFyY2hpdmUoTG9vc2VBcmNoaXZlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZUFyY2hpdmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUxpYnJhcnkoTG9vc2VMaWJyYXJ5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZUxpYnJhcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZU1vZHVsZShMb29zZU1vZHVsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9vc2VNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUNvbmZpZ3VyYXRpb24oTG9vc2VDb25maWd1cmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZUNvbmZpZ3VyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZVdBUkZpbGUoTG9vc2VXQVJGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZVdBUkZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4gSXQncyB1c2VmdWwgdG8KLQkgKiBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlQXBwbGljYXRpb25BZGFwdGVyKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlQXJjaGl2ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlV0FSRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb29zZU1vZHVsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0xvb3NlY29uZmlnQWRhcHRlckZhY3RvcnkKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1ZmFhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC91dGlsL0xvb3NlY29uZmlnU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBjbGFzcyBMb29zZWNvbmZpZ1N3aXRjaCB7fQotICovCi1wdWJsaWMgY2xhc3MgTG9vc2Vjb25maWdTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExvb3NlY29uZmlnUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2Vjb25maWdTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OOiB7Ci0JCQkJTG9vc2VBcHBsaWNhdGlvbiBsb29zZUFwcGxpY2F0aW9uID0gKExvb3NlQXBwbGljYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlQXBwbGljYXRpb24obG9vc2VBcHBsaWNhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTG9vc2VBcmNoaXZlKGxvb3NlQXBwbGljYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxvb3NlQXBwbGljYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkU6IHsKLQkJCQlMb29zZUFyY2hpdmUgbG9vc2VBcmNoaXZlID0gKExvb3NlQXJjaGl2ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9vc2VBcmNoaXZlKGxvb3NlQXJjaGl2ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobG9vc2VBcmNoaXZlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZOiB7Ci0JCQkJTG9vc2VMaWJyYXJ5IGxvb3NlTGlicmFyeSA9IChMb29zZUxpYnJhcnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlTGlicmFyeShsb29zZUxpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxvb3NlQXJjaGl2ZShsb29zZUxpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxvb3NlTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFOiB7Ci0JCQkJTG9vc2VNb2R1bGUgbG9vc2VNb2R1bGUgPSAoTG9vc2VNb2R1bGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlTW9kdWxlKGxvb3NlTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMb29zZUFyY2hpdmUobG9vc2VNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxvb3NlTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9DT05GSUdVUkFUSU9OOiB7Ci0JCQkJTG9vc2VDb25maWd1cmF0aW9uIGxvb3NlQ29uZmlndXJhdGlvbiA9IChMb29zZUNvbmZpZ3VyYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlQ29uZmlndXJhdGlvbihsb29zZUNvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxvb3NlQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEU6IHsKLQkJCQlMb29zZVdBUkZpbGUgbG9vc2VXQVJGaWxlID0gKExvb3NlV0FSRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9vc2VXQVJGaWxlKGxvb3NlV0FSRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTG9vc2VNb2R1bGUobG9vc2VXQVJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMb29zZUFyY2hpdmUobG9vc2VXQVJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChsb29zZVdBUkZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxvb3NlQXBwbGljYXRpb24oTG9vc2VBcHBsaWNhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9vc2VBcmNoaXZlKExvb3NlQXJjaGl2ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9vc2VMaWJyYXJ5KExvb3NlTGlicmFyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9vc2VXQVJGaWxlKExvb3NlV0FSRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZU1vZHVsZShMb29zZU1vZHVsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9vc2VDb25maWd1cmF0aW9uKExvb3NlQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Mb29zZWNvbmZpZ1N3aXRjaAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhNDQ4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIgotCW5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiPgotCTxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50IiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQ29tcG9uZW50U2NvcGVkUmVmcyIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJIYW5kbGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iUG9ydENvbXBvbmVudFJlZiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlNlcnZpY2VSZWYiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9IldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IldlYlNlcnZpY2VzQ2xpZW50IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iV2ViU2VydmljZXNSZXNvdXJjZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uIiBhcGk9ImZhbHNlIiA+Ci0JCTx0eXBlIG5hbWU9IkFwcGxpY2F0aW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkFwcGxpY2F0aW9uRmFjdG9yeSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkFwcGxpY2F0aW9uUmVzb3VyY2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJDb25uZWN0b3JNb2R1bGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9IkVqYk1vZHVsZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkphdmFDbGllbnRNb2R1bGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJNb2R1bGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJXZWJNb2R1bGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQiPjwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AiIGFwaT0iZmFsc2UiID4KLQkJPHR5cGUgbmFtZT0iSlNQQ29uZmlnIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkpzcEZhY3RvcnkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJKU1BQcm9wZXJ0eUdyb3VwIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iVGFnTGliUmVmVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50IiBhcGk9ImZhbHNlIiA+Ci0JCTx0eXBlIG5hbWU9IkFwcGxpY2F0aW9uQ2xpZW50IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJDbGllbnRGYWN0b3J5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24iIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJBdXRoQ29uc3RyYWludCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJBdXRoTWV0aG9kS2luZCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkNvbnRleHRQYXJhbSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkRpc3BhdGNoZXJUeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJFcnJvckNvZGVFcnJvclBhZ2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJFcnJvclBhZ2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJFeGNlcHRpb25UeXBlRXJyb3JQYWdlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iRmlsdGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkZpbHRlck1hcHBpbmciICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJGb3JtTG9naW5Db25maWciICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJIVFRQTWV0aG9kVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQkJPHR5cGUgbmFtZT0iSFRUUE1ldGhvZFR5cGVFbnVtIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iSW5pdFBhcmFtIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iSlNQVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IkxvY2FsRW5jb2RpbmdNYXBwaW5nIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkxvZ2luQ29uZmlnIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iTWltZU1hcHBpbmciICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9IlJlc0F1dGhTZXJ2bGV0VHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlJvbGVOYW1lVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IlNlY3VyaXR5Q29uc3RyYWludCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IlNlcnZsZXQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJTZXJ2bGV0TWFwcGluZyIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IlNlcnZsZXRUeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IlNlc3Npb25Db25maWciICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJUYWdMaWJSZWYiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJVUkxQYXR0ZXJuVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlVzZXJEYXRhQ29uc3RyYWludCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IldlYkFwcCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IldlYmFwcGxpY2F0aW9uRmFjdG9yeSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IldlYkFwcFJlc291cmNlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJXZWJUeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iV2VsY29tZUZpbGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJXZWxjb21lRmlsZUxpc3QiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIj48L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQ29tbW9uRmFjdG9yeSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkRlcGxveW1lbnRFeHRlbnNpb24iICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJEZXNjcmlwdGlvbiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQkJPHR5cGUgbmFtZT0iRGVzY3JpcHRpb25Hcm91cCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkRpc3BsYXlOYW1lIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iRUpCTG9jYWxSZWYiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJFamJSZWYiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkKLQkJPHR5cGUgbmFtZT0iRWpiUmVmVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkVudkVudHJ5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iRW52RW50cnlUeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJFeHRlbnNpYmxlVHlwZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9Ikljb25UeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iSWRlbnRpdHkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJKTkRJRW52UmVmc0dyb3VwIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9Ikxpc3RlbmVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iTWVzc2FnZURlc3RpbmF0aW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iTWVzc2FnZURlc3RpbmF0aW9uUmVmIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJQYXJhbVZhbHVlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iUU5hbWUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJSZXNBdXRoVHlwZUJhc2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJSZXNvdXJjZUVudlJlZiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IlJlc291cmNlUmVmIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IlJlc1NoYXJpbmdTY29wZVR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iU2VjdXJpdHlJZGVudGl0eSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQkJPHR5cGUgbmFtZT0iU2VjdXJpdHlSb2xlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iU2VjdXJpdHlSb2xlUmVmIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iVXNlQ2FsbGVySWRlbnRpdHkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcCI+Ci0JCTx0eXBlIG5hbWU9IkpheHJwY21hcFJlc291cmNlRmFjdG9yeSIgcmVmZXJlbmNlPSJmYWxzZSIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbiI+PC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYSIgYXBpPSJmYWxzZSIgPgotCQk8dHlwZSBuYW1lPSJBY3RpdmF0aW9uU3BlYyIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJBZG1pbk9iamVjdCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJDb25maWdQcm9wZXJ0eSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkNvbm5lY3Rpb25EZWZpbml0aW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iQ29ubmVjdG9yIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iQ29ubmVjdG9yUmVzb3VyY2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkpjYUZhY3RvcnkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJMaWNlbnNlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iTWVzc2FnZUFkYXB0ZXIiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9Ik1lc3NhZ2VMaXN0ZW5lciIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9Ik91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJSZXNvdXJjZUFkYXB0ZXIiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJTZWN1cml0eVBlcm1pc3Npb24iICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJUcmFuc2FjdGlvblN1cHBvcnRLaW5kIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQWNrbm93bGVkZ2VNb2RlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9IkFjdGl2YXRpb25Db25maWciICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJBc3NlbWJseURlc2NyaXB0b3IiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JCTx0eXBlIG5hbWU9IkNNUEF0dHJpYnV0ZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkNNUkZpZWxkIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iQ29tbW9uUmVsYXRpb25zaGlwIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iQ29tbW9uUmVsYXRpb25zaGlwUm9sZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJDb250YWluZXJNYW5hZ2VkRW50aXR5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iRGVzdGluYXRpb25UeXBlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iRUpCRXh0ZW5zaW9uRmlsdGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJFamJGYWN0b3J5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iRUpCSmFyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iRUpCTWV0aG9kQ2F0ZWdvcnkiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvciIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQotCQk8dHlwZSBuYW1lPSJFamJNZXRob2RFbGVtZW50SGVscGVyIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iRUpCUmVsYXRpb24iICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJFSkJSZWxhdGlvbnNoaXBSb2xlIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJFSkJSZXNvdXJjZSIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IkVudGVycHJpc2VCZWFuIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iRW50aXR5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iRXhjbHVkZUxpc3QiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJJUm9sZVNoYXBlU3RyYXRlZ3kiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJNZXNzYWdlRHJpdmVuIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCi0JCTx0eXBlIG5hbWU9Ik1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJNZXRob2RFbGVtZW50S2luZCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+CQkKLQkJPHR5cGUgbmFtZT0iTWV0aG9kUGVybWlzc2lvbiIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9Ik1ldGhvZFRyYW5zYWN0aW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iTXVsdGlwbGljaXR5S2luZCIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgCTx0eXBlIG5hbWU9IlF1ZXJ5IiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iUXVlcnlNZXRob2QiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJSZWxhdGlvbnNoaXBzIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4JCQotCQk8dHlwZSBuYW1lPSJSZXR1cm5UeXBlTWFwcGluZyIgIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlJvbGVTb3VyY2UiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIAk8dHlwZSBuYW1lPSJTZXNzaW9uIiAgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICAJPHR5cGUgbmFtZT0iU2Vzc2lvblR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkKLQkJPHR5cGUgbmFtZT0iU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotCQk8dHlwZSBuYW1lPSJUcmFuc2FjdGlvblR5cGUiICBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgkJCi0JPC9wYWNrYWdlPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vYXBwbGljYXRpb25jbGllbnR2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZDE5OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaG9sZHMgYWxsIHRoZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgdGhlIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0Ci0jCi0jIDpCZWdpbjogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6QmVnaW46Ci0jQ09NUE9ORU5UUFJFRklYIENIS0oKLSNDT01QT05FTlROQU1FRk9SIENIS0ogSUJNIFdlYlNwaGVyZSBWYWxpZGF0aW9uCi0jQ01WQ1BBVEhOQU1FIG5jZi9zcmMvamF2YS9jb20vaWJtL3dlYnNwaGVyZS92YWxpZGF0aW9uL2FwcGxpY2F0aW9uY2xpZW50dmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLQotCi1FUlJPUl9BUFBMSUNBVElPTkNMSUVOVF9JTlZBTElEX0FQUENMSUVOVF9GSUxFPUNIS0oxMDAwRTogVmFsaWRhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGZpbGUgaXMgbm90IHZhbGlkLiBFbnN1cmUgdGhhdCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIHZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1FUlJPUl9BUFBDTElFTlRfVkFMSURBVElPTl9GQUlMRUQ9Q0hLSjEwMDFFOiBWYWxpZGF0aW9uIGZhaWxlZDoKLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotRVJST1JfRUpCX1JFRlM9Q0hLSjEwMDJFOiBVbnJlc29sdmFibGUgRUpCIHJlZmVyZW5jZXMgaW4gezB9OwotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1JTlZBTElEX0REPUNIS0oxMDAzRTogVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGhhcyBhbiBpbnZhbGlkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9BUFBDTElFTlRfTUlTU0lOR19VUkk9Q0hLSjEwMDRFOiBUaGUgVVJJLCB7MH0sIGRvZXMgbm90IG1hdGNoIGFueXRoaW5nIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZmlsZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkVDT0w9Q0hLSjEwMDVFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvIGFuIHVua25vd24gc3ludGF4IGVycm9yLiBUaGUgYmFkIHNlY3Rpb24gc3RhcnRzIGF0IGxpbmUgezB9LCBjb2x1bW4gezF9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfRERfUEFSU0VfTElORT1DSEtKMTAwNkU6IFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8gYW4gdW5rbm93biBzeW50YXggZXJyb3IuIFRoZSBiYWQgc2VjdGlvbiBzdGFydHMgYXQgbGluZSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9ERF9QQVJTRV9OT0lORk89Q0hLSjEwMDdFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvIGFuIHVua25vd24gc3ludGF4IGVycm9yLiBUaGVyZSBpcyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gaGVscCBpZGVudGlmeSB0aGUgYmFkIHNlY3Rpb24uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9ERF9DQU5OT1RfT1BFTl9ERD1DSEtKMTAwOEU6IFZhbGlkYXRpb24gY2Fubm90IGNvbXBsZXRlIGJlY2F1c2UgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjYW5ub3QgYmUgb3BlbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfRFVQX1JFU19FTlZfUkVGX0VSUk9SXz1JV0FFMDAwMkUgRHVwbGljYXRlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSAiezB9IiBpbiBhcHBsaWNhdGlvbi1jbGllbnQueG1sLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl89SVdBRTAwMDNFIERvY3VtZW50IHR5cGUgdmVyc2lvbiAiezB9IiBmb3IgYXBwbGljYXRpb24tY2xpZW50LnhtbCBpbiBwcm9qZWN0ICJ7MX0iIG5lZWRzIHRvIGJlIHZlcnNpb24gInsyfSIuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9EVVBfRUpCX1JFRl9FUlJPUl89SVdBRTAwMDRFIER1cGxpY2F0ZSBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlICJ7MH0iIGluIGFwcGxpY2F0aW9uLWNsaWVudC54bWwuCi1BUFBDTElFTlRfTUFJTl9DTEFTU19FUlJPUl89SVdBRTAwMzVFIFRoZSBNYWluLUNsYXNzIGF0dHJpYnV0ZSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VhcnZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZWFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODBlYzkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZWFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGlzIHByb3BlcnRpZXMgZmlsZSBob2xkIGFsbCB0aGUgZXh0ZXJuYWxpc2VkIHN0cmluZ3MgZm9yIGVUb29scyAKLSMgRUFSIFZhbGlkYXRpb24gcHJvamVjdAotIwotIyBNZXNzYWdlcyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgYXQgCi0jICAgaHR0cDovL2hhbnkuYXVzdGluLmlibS5jb20vbWVzc2FnZXMvaW5kZXguaHRtbAotIwotIyBCcmllZmx5OgotIyAgICAgTUVTU0FHRV9JRD08Q29tcG9uZW50UHJlZml4PjxNZXNzYWdlTnVtYmVyPjxUeXBlQ29kZT46IDxNZXNzYWdlVGV4dD4KLSMKLSMgVGhlIHByZWZpeCBmb3IgdGhpcyBjb21wb25lbnQgaXM6Ci0jICAgICBDSEtXIChJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24pCi0jCi0jIE1lc3NhZ2UgbnVtYmVycyBhcmUgZm91ciBkaWdpdCBudW1iZXJzLCBmcm9tICcwMDAwJyB0byAnOTk5OScsIGluY2x1c2l2ZS4KLSMgTWVzc2FnZSBudW1iZXJzIGFyZSBmaWxsZWQgdG8gdGhlIGxlZnQgd2l0aCAnMCcsIHRvIGEgd2lkdGggb2YgNC4KLSMKLSMgVmFsaWQgbWVzc2FnZSB0eXBlIGNvZGVzIGFyZToKLSMgICAgIEkgKEluZm9ybWF0aW9uYWwpCi0jICAgICBXIChXYXJuaW5nKQotIyAgICAgRSAoRXJyb3IpCi0jCi0jIE5vdGUgdGhlICI6ICIgdGhhdCBhcHBlYXJzIGJldHdlZW4gdGhlIHR5cGUgY29kZSBhbmQgdGhlIG1lc3NhZ2UgdGV4dC4KLSMKLSMgOkJlZ2luOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpCZWdpbjoKLSNDT01QT05FTlRQUkVGSVggQ0hLSgotI0NPTVBPTkVOVE5BTUVGT1IgQ0hLSiBJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24KLSNDTVZDUEFUSE5BTUUgbmNmL3NyYy9qYXZhL2NvbS9pYm0vd2Vic3BoZXJlL3ZhbGlkYXRpb24vZWFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLSMKLSMgMjktSnVuZS0yMDAxOgotIyAgVGhpcyBmaWxlIGhhcyBiZWVuIHRlc3RlZCB1c2luZyB0aGUgUHJvY2Vzc01zZ0ZpbGUgdG9vbCwgd3JpdHRlbiBieSAKLSMgIEhhbnkgU2FsZW0gYW5kIG93bmVkIGJ5IERlbm5pcyBIZWJlcnQuICBBbnkgZnV0dXJlIGNoYW5nZXMgc2hvdWxkIAotIyAgYWxzbyBiZSB2ZXJpZmllZCB1c2luZyB0aGlzIHRvb2wuICBQbGVhc2UgY29udGFjdCBEZW5uaXMgCi0jICAoaGViZXJ0QHVzLmlibS5jb20gb3IgVC9MIDU0My0yNTIwKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNOT1RBTVNHCi12YWxpZGF0b3IubmFtZT1FQVIgVmFsaWRhdG9yCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9WQUxJREFUSU9OX0ZBSUxFRD1DSEtKMTAwMEU6IEVBUiBWYWxpZGF0aW9uIGZhaWxlZDogezB9Ci0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9JTlZBTElEX0VBUl9GSUxFPUNIS0oxMDAxRTogVGhlIEVBUiBwcm9qZWN0IHswfSBpcyBpbnZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfRFVQTElDQVRFX1JPTEVTPUNIS0oxMDAyRTogRHVwbGljYXRlIHNlY3VyaXR5IHJvbGUgbmFtZWQgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX0VBUl9OT19NT0RVTEVfVVJJPUNIS0oxMDAzRTogQSBtb2R1bGUgaGFzIGJlZW4gZGVmaW5lZCB3aXRoIG5vIFVSSS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9FQVJfTUlTU0lOR19VUkk9Q0hLSjEwMDRFOiBUaGUgVVJJLCB7MH0sIGRvZXMgbm90IG1hdGNoIGFueXRoaW5nIGluIHRoZSBFQVIgZmlsZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRUFSX0REX1BBUlNFX0xJTkVDT0w9Q0hLSjEwMDVFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFRoZSBzdGFydCBvZiB0aGUgYmFkIHNlY3Rpb24gaXMgYXQgbGluZSB7MH0sIGNvbHVtbiB7MX0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVBUl9ERF9QQVJTRV9MSU5FPUNIS0oxMDA2RTogVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgbG9hZGVkLiBUaGUgc3RhcnQgb2YgdGhlIGJhZCBzZWN0aW9uIGlzIGF0IGxpbmUgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FQVJfRERfUEFSU0VfTk9JTkZPPUNIS0oxMDA3RTogVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgbG9hZGVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FQVJfRERfQ0FOTk9UX09QRU5fREQ9Q0hLSjEwMDhFOiBDYW5ub3Qgb3BlbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBWYWxpZGF0aW9uIGNhbm5vdCBjb21wbGV0ZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyBlcnJvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1VUklfQ09OVEFJTlNfU1BBQ0VTX0VSUk9SXz1JV0FFMDAwNUUgVGhlIFVSSSB7MH0gY29udGFpbnMgYSBzcGFjZS4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgYmVjYXVzZSBpdCBjYW5ub3QgYmUgcmVmZXJlbmNlZCBmcm9tIGEgbWFuaWZlc3QgZmlsZS4KLU1FU1NBR0VfRUFSX0RVUExJQ0FURV9VUklfRVJST1JfPUlXQUUwMDA2RSBUaGUgbW9kdWxlIHswfSBoYXMgZHVwbGljYXRlIHVyaSBpbiBFQVI6IHsxfS4KLU1FU1NBR0VfRUFSX0RVUElDQVRFX1JPT1RDT05URVhUX0VSUk9SXz1JV0FFMDAwN0UgU2FtZSBjb250ZXh0IHJvb3QgInswfSIgZXhpc3RzIGluIFdlYiBtb2R1bGVzICJ7MX0iIGFuZCAiezJ9Ii4KLU1FU1NBR0VfRU1QVFlfQUxUX0REX0VSUk9SXz1JV0FFMDAwOUUgVGhlIG1vZHVsZSB7MH0gaGFzIGVtcHR5IDxhbHQtZGQ+IHRhZyBpbiBFQVIgezF9LiAgVGhlIHRhZyBzaG91bGQgYmUgcmVtb3ZlZCBvciB0aGUgdmFsdWUgc2hvdWxkIGJlIHZhbGlkLgotRFVQTElDQVRFX1VUSUxKQVJfRk9SX1BST0pFQ1RfTkFNRV9FUlJPUl89SVdBRTAwMTBFID1UaGUgcHJvamVjdCB7MH0gaW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBoYXMgZHVwbGljYXRlIHV0aWxpdHkgSkFSIFVSSSB7Mn0uCi1EVVBMSUNBVEVfTU9EVUxFX0ZPUl9QUk9KRUNUX05BTUVfRVJST1JfPUlXQUUwMDExRSBUaGUgcHJvamVjdCB7MH0gaW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBoYXMgZHVwbGljYXRlIG1vZHVsZSBuYW1lIHsyfS4KLU1FU1NBR0VfVVRJTF9VUklfTkFNRV9DT0xMSVNJT05fRVJST1JfPUlXQUUwMDEyRSBUaGUgbW9kdWxlIHswfSBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgezF9IGhhcyBzYW1lIG5hbWUgYXMgdXRpbGl0eSBKQVIgVVJJLgotTUVTU0FHRV9VVElMX1BST0pFQ1RfTkFNRV9DT0xMSVNJT05fRVJST1JfPUlXQUUwMDEzRSBUaGUgbW9kdWxlIHswfSBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgezF9IGhhcyBzYW1lIG5hbWUgYXMgdXRpbGl0eSBKQVIgcHJvamVjdCBuYW1lLgotRVJST1JfUkVBRElOR19NQU5JRkVTVF9FUlJPUl89SVdBRTAwMTRFIEFuIGVycm9yIG9jY3VycmVkIHZhbGlkYXRpbmcgdGhlIE1BTklGRVNULk1GIGZpbGUgaW4gYXJjaGl2ZSB7MH0uCi1NQU5JRkVTVF9MSU5FX0VORF9FUlJPUl89SVdBRTAwMTVFIFRoZSBNQU5JRkVTVC5NRiBmaWxlIGluIGFyY2hpdmUgezB9IGRvZXMgbm90IGVuZCB3aXRoIGEgbmV3bGluZS4KLU1BTklGRVNUX0xJTkVfRVhDRUVEU19MRU5HVEhfRVJST1JfPUlXQUUwMDE2RSBMaW5lIHswfSBpbiB0aGUgTUFOSUZFU1QuTUYgZmlsZSBpbiBhcmNoaXZlIHsxfSBleGNlZWRzIHRoZSBzcGVjaWZpY2F0aW9uIGxpbWl0IG9mIDcyIGJ5dGVzLgotCi1JTlZBTElEX1VSSV9GT1JfTU9EVUxFX0VSUk9SXz1JV0FFMDAxN0UgVGhlIG1vZHVsZSB7MH0gaGFzIGEgd3JvbmcgZGVmYXVsdCBleHRlbnNpb24gKC5qYXIgZm9yIEVKQiBtb2R1bGVzIGFuZCAud2FyIGZvciBXZWIgbW9kdWxlcykuCi1FQVJfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl89SVdBRTAwMThFIERvY3VtZW50IHR5cGUgdmVyc2lvbiAiezB9IiBmb3IgYXBwbGljYXRpb24ueG1sIGluIHByb2plY3QgInsxfSIgbmVlZHMgdG8gYmUgdmVyc2lvbiAiezJ9Ii4KLQotTU9EVUxFX0REX1BBUlNFX0xJTkVDT0xfRVJST1JfPUlXQUUwMDE5RSBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9mIG1vZHVsZSB7MH0gY291bGQgbm90IGJlIGxvYWRlZC4gVGhlIGJhZCBzZWN0aW9uIHN0YXJ0cyBhdCBsaW5lIHsxfSwgY29sdW1uIHsyfS4KLU1PRFVMRV9ERF9QQVJTRV9MSU5FX0VSUk9SXz1JV0FFMDAyMEUgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBvZiBtb2R1bGUgezB9IGNvdWxkIG5vdCBiZSBsb2FkZWQuIFRoZSBiYWQgc2VjdGlvbiBzdGFydHMgYXQgbGluZSB7MX0KLU1PRFVMRV9ERF9QQVJTRV9OT0lORk9fRVJST1JfPUlXQUUwMDIxRSBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9mIG1vZHVsZSB7MH0gY291bGQgbm90IGJlIGxvYWRlZC4KLUVKQl9CRUFOX0VKQl9MSU5LX0lOVEVGQUNFX01JU01BVENIX0VSUk9SXz1JV0FFMDAzN0UgVGhlIGludGVyZmFjZXMgb2YgdGhlIGxpbmtlZCBlbnRlcnByaXNlIGJlYW4gezB9IGRvIG5vdCBtYXRjaCB0aG9zZSBpbiBFSkIgcmVmIHsxfSBpbiBtb2R1bGUgezJ9LgotCi1DTEFTU1BBVEhfQ09NUE9ORU5UX1VSSV9NQVRDSEVTX0FSQ0hJVkVfVVJJPVVSSSB7MX0gZm9yIGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jeSBmcm9tIHByb2plY3QgezB9IGNsYXNoZXMgd2l0aCBleGlzdGluZyBhcmNoaXZlIGluIEVBUi4KLURVUExJQ0FURV9DTEFTU1BBVEhfQ09NUE9ORU5UX1VSST1VUkkgezF9IGZvciBjbGFzc3BhdGggZGVwZW5kZW5jeSBmcm9tIHByb2plY3QgezB9IG1hcHMgdG8gYSBkaWZmZXJlbnQgZmlsZSBzeXN0ZW0gcGF0aCBhcyBhbm90aGVyIGNsYXNzcGF0aCBkZXBlbmRlbmN5IHdpdGggdGhlIHNhbWUgVVJJLgotCi1KRUU1X1BST0pFQ1RfUkVGRVJFTkNFRF9CWV9QUkVfSkVFNV9FQVI9RmFjZXQgdmVyc2lvbiBmb3IgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHswfSBtdXN0IGJlIDUuMCB0byBjb250YWluIEphdmEgRUUgNS4wIHByb2plY3QgezF9LgotCi0jIHdhcm5pbmdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVdBUk5JTkdfTUVUQUZPTERFUl9NSVNTSU5HPUlXQUowMDAwVzogTWV0YSBmb2xkZXIgezB9IG11c3QgZXhpc3QgaW4gcHJvamVjdCB7MX0uCi1XQVJOSU5HX0ZJTEVfTUlTU0lORz1JV0FKMDAwMVc6IHswfSBtdXN0IGV4aXN0IGluIHByb2plY3QgezF9LgotTUVTU0FHRV9JTlZBTElEX0FMVF9ERF9XQVJOXz1JV0FFMDAyMlcgVGhlIG1vZHVsZSB7MH0gaGFzIGFsdC1kZCB7MX0sIGJ1dCB0aGUgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgaW4gRUFSIHsyfS4KLUlOVkFMSURfTUFOSUZFU1RfQ0xBU1NQQVRIX09ORV9XQVJOXz1JV0FFMDAyM1cgVGhlIE1hbmlmZXN0IENsYXNzLVBhdGggaW4gYXJjaGl2ZSB7MH0gY29udGFpbnMgYW4gZW50cnkgdGhhdCBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gdGhlIEVBUjogezF9LgotSU5WQUxJRF9NQU5JRkVTVF9DTEFTU1BBVEhfVFdPX1dBUk5fPUlXQUUwMDI0VyBUaGUgTWFuaWZlc3QgQ2xhc3MtUGF0aCBmb3IgYXJjaGl2ZSB7MH0gY29udGFpbnMgYW4gZW50cnksIHsxfSwgdGhhdCBpcyBub3QgcmVzb2x2YWJsZSB0byBhIGZpbGUgb3IgbW9kdWxlIGluIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uOiB7Mn0uCi1JTlZBTElEX01BTklGRVNUX0NMQVNTUEFUSF9ERVBFTkRFTkNZX1dBUk5fPUlXQUUwMDI1VyBUaGUgTWFuaWZlc3QgQ2xhc3MtUGF0aCBpbiBtb2R1bGUgezB9IGNvbnRhaW5zIGFuIGVudHJ5LCB7MX0sIHRoYXQgcmVzb2x2ZXMgdG8gYXJjaGl2ZSB7Mn0uICBUaGlzIGRlcGVuZGVuY3kgZG9lcyBub3QgY29tcGx5IHdpdGggdGhlIEphdmEgRUUgc3BlY2lmaWNhdGlvbi4KLVBST0pFQ1RfSVNfQ0xPU0VEX1dBUk5fPUlXQUUwMDI2VyBFQVIgVmFsaWRhdGlvbiBjYW5ub3QgcnVuIG9uIGNsb3NlZCBwcm9qZWN0OiB7MH0uIE9wZW4gdGhlIHByb2plY3QsIGFuZCB0cnkgYWdhaW4uCi1QUk9KRUNUX0RPRVNfTk9UX0VYSVNUX1dBUk5fPUlXQUUwMDI3VyBUaGUgcHJvamVjdCB7MH0gZm9yIG1vZHVsZSBvciB1dGlsaXR5IEpBUiB7MX0gaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHsyfSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlLgotTUlTU0lOR19XRUJOQVRVUkVfRk9STU9EVUxFX1dBUk5fPUlXQUUwMDI4VyBUaGUgd2ViIG1vZHVsZSB7MH0gaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBpcyBub3QgYSBKYXZhIEVFIFdlYiBwcm9qZWN0LgotREVQUkVDQVRFRF9BQlNQQVRIU19XQVJOXz1JV0FFMDAyOVcgVGhlIElCTSBleHRlbnNpb25zIGZpbGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHswfSBjb250YWlucyBkZXByZWNhdGVkIGFic29sdXRlIHBhdGhzLiAgVXNlIHRoZSBhcHBsaWNhdGlvbiBlZGl0b3IgdG8gY2xlYW4gdXAgdGhlIGZpbGUuCi1JTlZBTElEX0NPTlRFWFRST09UX1dFQk1PRFVMRV9XQVJOXz1JV0FFMDAzMFcgVGhlIGNvbnRleHQgcm9vdCBmb3IgV2ViIG1vZHVsZTogezB9IGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdDogezF9IGRvZXMgbm90IG1hdGNoIHRoZSBjb250ZXh0IHJvb3QgaW4gd2ViIHByb2plY3Qgc2V0dGluZ3Mgb2YgezJ9LgotTUlTU0lOR19DTElFTlROQVRVUkVfRk9STU9EVUxFX1dBUk5fPUlXQUUwMDMxVyBUaGUgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSB7MH0gaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0OnsxfSBpcyBub3QgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QuCi1NSVNTSU5HX0VKQk5BVFVSRV9GT1JNT0RVTEVfV0FSTl89SVdBRTAwMzJXIFRoZSBFSkIgbW9kdWxlIHswfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezF9IGlzIG5vdCBhbiBFSkIgcHJvamVjdC4KLU1JU1NJTkdfUFJPSkVDVF9GT1JNT0RVTEVfV0FSTl89SVdBRTAwMzNXIFRoZSBtb2R1bGUgezB9IGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MX0gaGFzIG5vdCBiZWVuIGNvbmZpZ3VyZWQgYXMgYSBKYXZhIEVFIG1vZHVsZSBkZXBlbmRlbmN5LiAKLUlOVkFMSURfQ0FTRV9GT1JfTUFOSUZFU1RfRVJST1JfPUlXQUUwMDM4RSBUaGUgY2FzZSBvZiB0aGUgbWFuaWZlc3QgZmlsZSBuYW1lICJ7MH0iIGluIGFyY2hpdmUgezF9IGluIGluY29ycmVjdC4gIEZpbGUgbmFtZSBtdXN0IGJlICJNRVRBLUlORi9NQU5JRkVTVC5NRiIsIGNhc2Ugc2Vuc2l0aXZlLgotVVJJX0FMUkVBRFlfRVhJU1RTX0lOX0VBUl9XQVJOXz1JV0FFMDAzOVcgUHJvamVjdCB1dGlsaXR5IEpBUiBVUkkgezB9IGNvbGxpZGVzIHdpdGggYW4gZXhpc3RpbmcgZmlsZSBpbiBwcm9qZWN0IHsxfS4KLU1JU1NJTkdfTU9EVUxFX0VYVEVOU0lPTl9FUlJPUl89SVdBRTAwNDBFIFRoZSBhcHBsaWNhdGlvbiBleHRlbnNpb24gaW4gRUFSIHByb2plY3Q6IHswfSBpcyBtaXNzaW5nIG1vZHVsZSBleHRlbnNpb24gZm9yIG1vZHVsZSBwcm9qZWN0OiB7MX0uCi1QUk9KRUNUX1NFUlZFUl9UQVJHRVRfRE9FU19OT1RfTUFUQ0hfRUFSPVRoZSB0YXJnZXQgc2VydmVyIG9mIHRoZSBtb2R1bGUgcHJvamVjdCAiezB9IiBkb2VzIG5vdCBtYXRjaCB0aGUgdGFyZ2V0IHNlcnZlciBvZiB0aGUgY29udGFpbmluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgInsxfSIKLU5PX1NFUlZFUl9UQVJHRVRfTU9EVUxFX0lOX0VBUl9XSVRIX1NFUlZFUl9UQVJHRVQ9VGhlIG1vZHVsZSBwcm9qZWN0ICJ7MH0iIHdpdGggbm8gdGFyZ2V0IHNlcnZlciBiZWxvbmdzIHRvIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCAiezF9IiB0aGF0IGhhcyBhIHRhcmdldCBzZXJ2ZXIKLU5PX1NFUlZFUl9UQVJHRVRfT05fRUFSX1dJVEhfTU9EVUxFX1NFUlZFUl9UQVJHRVRTPVRoZSBlYXIgcHJvamVjdCAiezB9IiB3aXRoIG5vIHRhcmdldCBzZXJ2ZXIgaGFzIG1vZHVsZSBwcm9qZWN0ICJ7MX0iIHRoYXQgaGFzIGEgdGFyZ2V0IHNlcnZlcgotSU5WQUxJRF9FQVJfU0VSVkVSX1RBUkdFVF9GT1JfMTRfU1BFQ19MRVZFTD1UaGUgSmF2YSBFRSAxLjQgc3BlY2lmaWNhdGlvbiBFQVIgcHJvamVjdCAiezB9IiBoYXMgYW4gaW5jb21wYXRpYmxlIHRhcmdldCBzZXJ2ZXIgInsxfSIKLUlOVkFMSURfTU9EVUxFX1NFUlZFUl9UQVJHRVRfRk9SXzE0X1NQRUNfTEVWRUw9VGhlIEphdmEgRUUgMS40IHNwZWNpZmljYXRpb24gbW9kdWxlIHByb2plY3QgInswfSIgaGFzIGFuIGluY29tcGF0aWJsZSB0YXJnZXQgc2VydmVyICJ7MX0iLgotTUVTU0FHRV9JTkNPTVBBVElCTEVfU1BFQ19XQVJOSU5HXz1JV0FFMDAwOEUgVGhlIG1vZHVsZSAiezB9IiBpcyBhdCBhbiBpbmNvbXBhdGlibGUgSmF2YSBFRSBzcGVjaWZpY2F0aW9uIGxldmVsIHRoYW4gdGhhdCBvZiB0aGUgInsxfSIgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbi4KLU1FU1NBR0VfSU5DT01QQVRJQkxFXzEzX1NQRUNfV0FSTklOR189SVdBRTAwMDhFIFRoZSBtb2R1bGUgInswfSIgaXMgSmF2YSBFRSB2MS4zIHNwZWNpZmljYXRpb24gbGV2ZWwsIHdoaWNoIGlzIGluY29tcGF0aWJsZSBpbiB0aGUgdjEuMiBFQVIuCi1NRVNTQUdFX0lOQ09NUEFUSUJMRV8xNF9TUEVDX1dBUk5JTkdfPVRoZSBtb2R1bGUgInswfSIgaXMgSmF2YSBFRSB2MS40IHNwZWNpZmljYXRpb24gbGV2ZWwsIHdoaWNoIGlzIGluY29tcGF0aWJsZSBpbiB0aGUgdjEuMyBFQVIuCi1FQVJfVkFMSURBVElPTl9JTlRFUk5BTF9FUlJPUl9VSV89SVdBRTAwNTNFIEFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZCBydW5uaW5nIHZhbGlkYXRpb24gb24gcHJvamVjdDp7MH0sIGNoZWNrIHRoZSBsb2cgZmlsZSBmb3IgZGV0YWlscwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lamJ2YWxpZGF0b3IucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZWpidmFsaWRhdG9yLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZmJjZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lamJ2YWxpZGF0b3IucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1MzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jICAgICAqIENvZGUgb3JpZW50ZWQgaW5zdHJ1Y3Rpb25zOgotIyAgICAgKgotIyAgICAgKiBJbiB0aGUgc3RyaW5nLCB5b3UgbWF5IHNlZSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgc2VxdWVuY2VzOgotIyAgICAgKiBhKSB7bn0gIHdoZXJlIG4gaXMgYSBudW1iZXIuIFRoZXNlIGFyZSByZXBsYWNlYWJsZSBwYXJhbWV0ZXJzLgotIyAgICAgKiBiKSAnJyAgSW4gLnByb3BlcnRpZXMgZmlsZXMsIGluIG9yZGVyIHRvIHNlZSBvbmUgYXBvc3Ryb3BoZSAoJykgaW4gdGhlIGZpbmFsCi0jICAgICAqICAgIHN0cmluZywgc29tZXRpbWVzIHR3byBhcG9zdHJvcGhlcyBtdXN0IGJlIGVudGVyZWQgaW4gdGhlIHN0cmluZy4gSW4gdGhlIHRyYW5zbGF0ZWQKLSMgICAgICogICAgc3RyaW5nLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUge259IGluIHRoZSBzdHJpbmcsIHRoZW4gdG8gc2hvdyBvbmUgYXBvc3Ryb3BoZQotIyAgICAgKiAgICB0byB0aGUgdXNlciwgcHV0IHR3byBhcG9zdHJvcGhlcyBpbiB0aGUgc3RyaW5nLiBJZiB0aGVyZSBhcmUgbm8ge259IGluIHRoZSBzdHJpbmcsCi0jICAgICAqICAgIHRoZW4gcHV0IG9uZSBhcG9zdHJvcGhlLgotIyAgICAgKiAgICBGb3IgZXhhbXBsZSwgc2F5IHRoYXQgeW91IHdhbnQgdGhlIHVzZXIgdG8gcmVhZCAiR2VvcmdlJ3MgZmlsZSIuIAotIyAgICAgKiAgICAgICAgR0VPUkdFPUdlb3JnZSdzIGZpbGUgd2FzIG9uIHRoZSBkZXNrLgotIyAgICAgKiAgICAgICAgR0VPUkdFMj1HZW9yZ2UnJ3MgZmlsZSBhbmQgezB9IHdlcmUgb24gdGhlIGRlc2suCi0jICAgICAqICAgIEdFT1JHRSB1c2VzIG9uZSBhcG9zdHJvcGhlIGJlY2F1c2UgdGhlcmUgYXJlIG5vIHtufSBhbmQgR0VPUkdFMgotIyAgICAgKiAgICB1c2VzIHR3byBhcG9zdHJvcGhlcyBiZWNhdXNlIHRoZXJlIGlzIGEge259LgotIyAgICAgKiBjKSAnJyB0ZXh0ICcnIHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBkb3VibGUKLSMgICAgICogICAgYXBvc3Ryb3BoZXMgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkLiAKLSMgICAgICogZCkgPHRleHQ+IHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBhbmdsZQotIyAgICAgKiAgICBicmFja2V0cyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCi0jICAgICAqIGUpICJ0ZXh0IiB3aGVyZSB0ZXh0IGNhbiBiZSBhbnkgd29yZChzKS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgcXVvdGF0aW9uIAotIyAgICAgKiAgICBtYXJrcyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCi0jICAgICAqICAgIAotIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyAgICAgKiBPdGhlciBpbnN0cnVjdGlvbnMKLSMgICAgICogYSkgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdGV4dCB0aGF0IGlzIG9uIGEgbGluZSB3aGljaCBiZWdpbnMgd2l0aCBhIGNvbW1lbnQgCi0jICAgICAqICAgIHN5bWJvbCAoIykuCi0jICAgICAqIGIpIERvIG5vdCB0cmFuc2xhdGUgdGhlc2Ugd29yZHM6IAotIyAgICAgKiAgICAgICAgc2NoZW1hLCBFSkIsIFJEQiwgSkFSLCBSTUksIEJNUCwgQ01QLCBPT1NRTAotIyAgICAgKiBjKSBQbGVhc2UgcmV0dXJuIHRoZSAucHJvcGVydGllcyBmaWxlcyB1c2luZyB0aGUgc2FtZSBkaXJlY3Rvcnkgc3RydWN0dXJlLgotIyAgICAgKiAgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHR3byBvZiB0aGUgZmlsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lLgotIyAgICAgKgotIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBBbnkgb3RoZXIgY29tbWVudHMgdG8gdGhlIHRyYW5zbGF0b3JzIGFyZSBvbiBsaW5lcyB3aGljaCBzdGFydCBsaWtlIHRoaXM6ICAjIDJUQzoKLSMKLSMgVmVyc2lvbiAxLjQyCi0jCi0KLSMKLSMgQmVnaW4gRUpCIFZhbGlkYXRvciBzdHJpbmdzLgotIwotIyBUaGUgcHVycG9zZSBvZgotIyBJRHM6Ci0jICAgIFNUQVRVUz1TdGF0dXMgbWVzc2FnZQotIyAgICBMT0M9VGV4dCBkZXNjcmlwdGlvbiBvZiBhIGxvY2F0aW9uIChpZGVudGlmaWVzIHRoZSBzb3VyY2Ugb2YgdGhlIHByb2JsZW0gd2hlbiBubyBsaW5lIG51bWJlciBpcyBhdmFpbGFibGUpCi0jICAgIENIS0o9RUpCIHZhbGlkYXRpb24gbWVzc2FnZQotIwotCi0jCi0jIFN0YXJ0IG9mIHN0YXR1cyBtZXNzYWdlcwotIwotU1RBVFVTX1ZBTElEQVRJTkc9VmFsaWRhdGluZyB7MH0uCi0KLUxPQ19DTEFTUz1DbGFzczogezB9Ci1MT0NfRklFTEQ9RmllbGQ6IHswfSwgQ2xhc3M6IHsxfQotTE9DX01FVEhPRD1NZXRob2Q6IHswfSwgQ2xhc3M6IHsxfQotTE9DX0JFQU49RW50ZXJwcmlzZSBiZWFuOiB7MH0KLUxPQ19ST0xFPTxsb2NhbFJlbGF0aW9uc2hpcFJvbGVzPjogezB9LCBFbnRlcnByaXNlIGJlYW46IHsxfQotTE9DX1JPTEVSRUY9PHNlY3VyaXR5LXJvbGUtcmVmPjogezB9Ci1MT0NfTUVUSE9ERUxFTUVOVD08bWV0aG9kPiBlbGVtZW50OiB7MH0KLUxPQ19NRVRIT0RQRVJNSVNTSU9OPTxtZXRob2QtcGVybWlzc2lvbj4gZWxlbWVudDogezB9Ci1MT0NfTUVUSE9EVFJBTlNBQ1RJT049PGNvbnRhaW5lci10cmFuc2FjdGlvbj4gZWxlbWVudDogezB9Ci1MT0NfRUpCUkVMQVRJT049PGVqYi1yZWxhdGlvbj46IHswfQotTE9DX0VKQlJFTEFUSU9OU0hJUFJPTEU9PGVqYi1yZWxhdGlvbnNoaXAtcm9sZT46IHswfSwgPGVqYi1yZWxhdGlvbj46IHsxfQotIwotIyBlbmQgb2Ygc3RhdHVzIG1lc3NhZ2VzCi0jCi0KLSMKLSMgU3RhcnQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcwotIwotIyBBbGwgdW5pcXVlIGVycm9yIGlkcyBmb2xsb3cgdGhpcyBmb3JtYXQ6Ci0jCi0jICAgIENIS0pubm5uW3NdCi0jCi0jIHdoZXJlCi0jICAgIC0gQ0hLSiBpcyB0aGUgZm91ciBjaGFyYWN0ZXIgdW5pcXVlIGNvbXBvbmVudCBwcmVmaXgKLSMgICAgLSBubm5uIGlzIHRoZSBudW1lcmljYWwgaWQsIHVuaXF1ZSB3aXRoaW4gRUpCIFZhbGlkYXRvcgotIyAgICAtIFtzXSBpcyB0aGUgc2V2ZXJpdHkgaW5kaWNhdG9yOiBFIChlcnJvciksIFcgKHdhcm5pbmcpLCBvciBJIChpbmZvcm1hdGlvbikuCi0jCi0jIG5ubm4gcmFuZ2VzIGZyb20gMjAwMCAtIDI5OTkKLSMgICAgMjAwMCAtIDIwOTkgTWVzc2FnZXMgb24gYSBjbGFzcwotIyAgICAyMTAwIC0gMjE5OSBNZXNzYWdlcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gV2Vic3BoZXJlIG9yIFdTQSAoaS5lLiwgbm90IG1lbnRpb25lZCBpbiBFSkIgc3BlY2lmaWNhdGlvbiwgc3VjaCBhcyBhc3NvY2lhdGlvbnMgJiBmaW5kZXJzKQotIyAgICAyMjAwIC0gMjM5OSBNZXNzYWdlcyBvbiBhIGZpZWxkCi0jICAgIDI0MDAgLSAyNzk5IE1lc3NhZ2VzIG9uIGEgbWV0aG9kCi0jICAgIDI4MDAgLSAyODk5IE1lc3NhZ2VzIG9uIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSMgICAgMjkwMCAtIDI5OTkgTWlzY2VsbGFuZW91cwotIwotCi0jIAotIyBNZXNzYWdlcyBjb21tb24gYWNyb3NzIEVKQiBzcGVjaWZpY2F0aW9ucwotIwotQ0hLSjI5MDA9Q0hLSjI5MDBJOiBJbnRlcm5hbCBlcnJvciB3aGVuIHJ1bm5pbmcgRUpCIHZhbGlkYXRvci4gUmVhZCB0aGUgbG9nIGZvciBkZXRhaWxzLgotQ0hLSjI4NTI9Q0hLSjI4NTJXOiBJbnRlcm5hbCBlcnJvciB3aGlsZSB2YWxpZGF0aW5nIHswfS4gVGhlIGJlYW4gYmVpbmcgdmFsaWRhdGVkIHdhcyB7MX0uCi1DSEtKMjQzMz1DSEtKMjQzM1c6IENhbm5vdCB2YWxpZGF0ZSB7MH0gYmVjYXVzZSB7MX0gY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyOTA3PUNIS0oyOTA3RTogVHlwZSB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyOTA1PUNIS0oyOTA1VzogVGhlIEVKQiBWYWxpZGF0b3IgZGlkIG5vdCBydW4gYmVjYXVzZSBlamItamFyLnhtbCBjb3VsZCBub3QgYmUgbG9hZGVkIG9yIGZvdW5kLiBSdW4gdGhlIFhNTCB2YWxpZGF0b3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1DSEtKMjA0MT1DSEtKMjA0MUk6IFBlcm1hbmVudCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIHNob3VsZCBiZSBpbiBhIG5hbWVkIHBhY2thZ2UuIChKTFMgMi4wOiA3LjQuMikuCi0KLUNIS0oyNDU2Lmk9Q0hLSjI0NTZXOiB7MH0gc2hvdWxkIHRocm93IHsxfSBmb3IgezJ9IG9yIHRoZXJlIG1heSBiZSBjb21waWxlIGVycm9ycyBpbiB0aGUgZGVwbG95bWVudCBjb2RlLgotQ0hLSjI0NTYubT1DSEtKMjQ1Nlc6IFRoaXMgbWV0aG9kIHNob3VsZCB0aHJvdyB7MH0gZm9yIHsxfSBvciB0aGVyZSBtYXkgYmUgY29tcGlsZSBlcnJvcnMgaW4gdGhlIGRlcGxveW1lbnQgY29kZS4KLQotIwotIyBlbmQgb2YgY29tbW9uIG1lc3NhZ2VzCi0jCi0KLSMKLSMgTWVzc2FnZXMgZm9yIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24KLSMKLUNIS0oyMDAxLmViLmVqYjExPUNIS0oyMDAxVzogVGhlIHswfSBrZXkgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIHsxfSBtZXRob2QuIChFSkIgMS4xOiA5LjIuOSkKLUNIS0oyMDAyLmViLmkuZWpiMTE9Q0hLSjIwMDJXOiBUaGlzIGNsYXNzIHNob3VsZCBpbXBsZW1lbnQgYSBtYXRjaGluZyBlamJQb3N0Q3JlYXRlIG1ldGhvZCBmb3IgezB9LiAoRUpCIDEuMTogOS4yLjQpCi1DSEtKMjAwMi5lYi5tLmVqYjExPUNIS0oyMDAyVzogVGhpcyBjbGFzcyBzaG91bGQgaW1wbGVtZW50IGEgbWF0Y2hpbmcgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9yIHRoaXMgbWV0aG9kLiAoRUpCIDEuMTogOS4yLjQpCi1DSEtKMjAwM0UuZWpiMTE9Q0hLSjIwMDNFOiBUaGlzIGNsYXNzIG11c3Qgbm90IGltcGxlbWVudCBqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbi4gKEVKQiAxLjE6IDYuNS4zKS4KLUNIS0oyMDAzSS5lamIxMT1DSEtKMjAwM0k6IEJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW5zIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCBqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbi4gKEVKQiAxLjE6IDYuNS4zKS4KLUNIS0oyMDA0LmViLmkuZWpiMTE9Q0hLSjIwMDRXOiBUaGUgezF9IGJlYW4gY2xhc3Mgc2hvdWxkIG5vdCBpbXBsZW1lbnQgdGhlIHswfSBlamJGaW5kIG1ldGhvZC4gKEVKQiAxLjE6IDkuNC42KQotQ0hLSjIwMDQuZWIubS5lamIxMT1DSEtKMjAwNFc6IFRoZSB7MH0gYmVhbiBjbGFzcyBzaG91bGQgbm90IGltcGxlbWVudCBhbiBlamJGaW5kIG1ldGhvZC4gKEVKQiAxLjE6IDkuNC42KQotQ0hLSjIwMDUuZWguaS5lamIxMT1DSEtKMjAwNUU6IHswfSBtdXN0IGJlIGVpdGhlciBhIGNyZWF0ZSBtZXRob2Qgb3IgYSBmaW5kIG1ldGhvZC4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjIwMDUuZWgubS5lamIxMT1DSEtKMjAwNUU6IFRoZSBtZXRob2QgbXVzdCBiZSBlaXRoZXIgYSBjcmVhdGUgbWV0aG9kIG9yIGEgZmluZCBtZXRob2QuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyMDA2LnNiLmVqYjExPUNIS0oyMDA2RTogVGhlIHswfSBiZWFuIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy4gKEVKQiAxLjE6IDYuMTAuMikKLUNIS0oyMDA2LmViLmVqYjExPUNIS0oyMDA2RTogVGhlIHswfSBiZWFuIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy4gKEVKQiAxLjE6IDkuMi4yKQotQ0hLSjIwMDcuc2IuZWpiMTE9Q0hLSjIwMDdXOiB7MH0gc2hvdWxkIG5vdCBkZWNsYXJlIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZC4gKEVKQiAxLjE6IDYuMTAuMikKLUNIS0oyMDA3LmViLmVqYjExPUNIS0oyMDA3VzogezB9IHNob3VsZCBub3QgZGVjbGFyZSB0aGUgZmluYWxpemUoKSBtZXRob2QuIChFSkIgMS4xOiA5LjIuMikKLUNIS0oyMDA4LnNiLmVqYjExPUNIS0oyMDA4RTogVGhlIHswfSBiZWFuIGNsYXNzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWpiQ3JlYXRlIG1ldGhvZC4gKEVKQiAxLjE6IDYuNS41LCA2LjEwLjMpCi1DSEtKMjAwOS5lYi5lamIxMT1DSEtKMjAwOUU6IFRoZSB7MH0gYmVhbiBjbGFzcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLiAoRUpCIDEuMTogOS4yLjUpCi1DSEtKMjAxMC5zaC5lamIxMT1DSEtKMjAxMEU6IFRoZSB7MH0gaG9tZSBpbnRlcmZhY2UgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjcmVhdGUgbWV0aG9kLiAoRUpCIDEuMTogNi4xMC42KQotQ0hLSjIwMTEuZWguZWpiMTE9Q0hLSjIwMTFFOiBUaGUgezB9IGhvbWUgaW50ZXJmYWNlIG11c3QgY29udGFpbiBvbmUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyMDEyLnNyLmVqYjExPUNIS0oyMDEyRTogVGhpcyB0eXBlIG11c3QgYmUgYW4gaW50ZXJmYWNlLiAoRUpCIDEuMTogNi4xMC41KS4KLUNIS0oyMDEyLnNoLmVqYjExPUNIS0oyMDEyRTogVGhpcyB0eXBlIG11c3QgYmUgYW4gaW50ZXJmYWNlLiAoRUpCIDEuMTogNi4xMC42KS4KLUNIS0oyMDEyLmVyLmVqYjExPUNIS0oyMDEyRTogVGhpcyB0eXBlIG11c3QgYmUgYW4gaW50ZXJmYWNlLiAoRUpCIDEuMTogOS4yLjcpLgotQ0hLSjIwMTIuZWguZWpiMTE9Q0hLSjIwMTJFOiBUaGlzIHR5cGUgbXVzdCBiZSBhbiBpbnRlcmZhY2UuIChFSkIgMS4xOiA5LjIuOCkuCi1DSEtKMjAxMy5zYi5lamIxMT1DSEtKMjAxM0U6IFRoZSB7MH0gYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCB7MX0uIChFSkIgMS4xOiA2LjEwLjIpLgotQ0hLSjIwMTMuZWIuZWpiMTE9Q0hLSjIwMTNFOiBUaGUgezB9IGJlYW4gY2xhc3MgbXVzdCBpbXBsZW1lbnQgezF9LiAoRUpCIDEuMTogOS4yLjIpLgotQ0hLSjIwMTQuc2IuZWpiMTE9Q0hLSjIwMTRFOiBUaGUgezB9IGJlYW4gY2xhc3MgY2Fubm90IGJlIGFic3RyYWN0LiAoRUpCIDEuMTogNi4xMC4yKQotQ0hLSjIwMTQuZWIuZWpiMTE9Q0hLSjIwMTRFOiBUaGUgezB9IGJlYW4gY2xhc3MgY2Fubm90IGJlIGFic3RyYWN0LiAoRUpCIDEuMTogOS4yLjIpCi1DSEtKMjAxNS5zYi5lamIxMT1DSEtKMjAxNUU6IFRoZSB7MH0gYmVhbiBjbGFzcyBjYW5ub3QgYmUgZmluYWwuIChFSkIgMS4xOiA2LjEwLjIpCi1DSEtKMjAxNS5lYi5lamIxMT1DSEtKMjAxNUU6IFRoZSB7MH0gYmVhbiBjbGFzcyBjYW5ub3QgYmUgZmluYWwuIChFSkIgMS4xOiA5LjIuMikKLUNIS0oyMDE3LnNyLmVqYjExPUNIS0oyMDE3RTogSW50ZXJmYWNlIG11c3QgZXh0ZW5kIHswfS4gKEVKQiAxLjE6IDYuMTAuNSkKLUNIS0oyMDE3LnNoLmVqYjExPUNIS0oyMDE3RTogSW50ZXJmYWNlIG11c3QgZXh0ZW5kIHswfS4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyMDE3LmVyLmVqYjExPUNIS0oyMDE3RTogSW50ZXJmYWNlIG11c3QgZXh0ZW5kIHswfS4gKEVKQiAxLjE6IDkuMi43KQotQ0hLSjIwMTcuZWguZWpiMTE9Q0hLSjIwMTdFOiBJbnRlcmZhY2UgbXVzdCBleHRlbmQgezB9LiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjAxOS5lYi5lamIxMT1DSEtKMjAxOUk6IFRoZSB7MH0ga2V5IGNsYXNzIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA5LjIuOSkgKFJNSSAxLjM6IDIuNikuCi0KLQotQ0hLSjIwMjAuZWIuZWpiMTE9Q0hLSjIwMjBFOiBUaGUgezB9IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuNC43LjIpCi1DSEtKMjAyMS5lYi5lamIxMT1DSEtKMjAyMUU6IFRoZSB7MH0ga2V5IGNsYXNzIG11c3QgZGVmaW5lIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IuIChFSkIgMS4xOiA5LjQuNy4yKQotQ0hLSjIwMjIuc2IuZWpiMTE9Q0hLSjIwMjJFOiB7MH0gYmVhbiBjbGFzcyBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDYuMTAuMikKLUNIS0oyMDIyLmViLmVqYjExPUNIS0oyMDIyRTogezB9IGJlYW4gY2xhc3MgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuMikKLUNIS0oyMDIzLnNyLmkuZWpiMTE9Q0hLSjIwMjNFOiB7MH0gbXVzdCBoYXZlIGEgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7MX0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDYuMTAuNSkKLUNIS0oyMDIzLnNyLm0uZWpiMTE9Q0hLSjIwMjNFOiBUaGlzIG1ldGhvZCBtdXN0IGhhdmUgYSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHswfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogNi4xMC41KQotQ0hLSjIwMjMuZXIuaS5lamIxMT1DSEtKMjAyM0U6IHswfSBtdXN0IGhhdmUgYSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsxfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogOS4yLjcpCi1DSEtKMjAyMy5lci5tLmVqYjExPUNIS0oyMDIzRTogVGhpcyBtZXRob2QgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7MH0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDkuMi43KQotQ0hLSjIwMjQuc2guaS5lamIxMT1DSEtKMjAyNEU6IHswfSBtdXN0IG5vdCBleGlzdC4gT25seSBjcmVhdGUoKSBtYXkgZXhpc3QgKEVKQiAxLjE6IDYuOCkuCi1DSEtKMjAyNC5zaC5tLmVqYjExPUNIS0oyMDI0RTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QuIE9ubHkgY3JlYXRlKCkgbWF5IGV4aXN0IChFSkIgMS4xOiA2LjgpLgotQ0hLSjIwMjUuc2IuaS5lamIxMT1DSEtKMjAyNUU6IHswfSBtdXN0IG5vdCBleGlzdC4gT25seSBlamJDcmVhdGUoKSBtYXkgZXhpc3QgKEVKQiAxLjE6IDYuOCkuCi1DSEtKMjAyNS5zYi5tLmVqYjExPUNIS0oyMDI1RTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QuIE9ubHkgZWpiQ3JlYXRlKCkgbWF5IGV4aXN0IChFSkIgMS4xOiA2LjgpLgotQ0hLSjIwMjYuc2guaS5lamIxMT1DSEtKMjAyNkU6IEJlYW4gY2xhc3MgezF9IG11c3QgaW1wbGVtZW50IGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIG1ldGhvZCBmb3IgezB9LiAoRUpCIDEuMTogNi4xMC42KQotQ0hLSjIwMjYuc2gubS5lamIxMT1DSEtKMjAyNkU6IEJlYW4gY2xhc3MgezB9IG11c3QgaW1wbGVtZW50IGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIG1ldGhvZCBmb3IgdGhpcyBtZXRob2QuIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjAyNi5laC5pLmVqYjExPUNIS0oyMDI2RTogQmVhbiBjbGFzcyB7MX0gbXVzdCBpbXBsZW1lbnQgYSBtYXRjaGluZyBlamJDcmVhdGUgbWV0aG9kIGZvciB7MH0uIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyMDI2LmVoLm0uZWpiMTE9Q0hLSjIwMjZFOiBCZWFuIGNsYXNzIHswfSBtdXN0IGltcGxlbWVudCBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QgZm9yIHRoaXMgbWV0aG9kLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjAyOC5lYi5pLmVqYjExPUNIS0oyMDI4VzogezB9IHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgYSBtYXRjaGluZyBlamJDcmVhdGUgbWV0aG9kIGlzIGRlZmluZWQuIChFSkIgMS4xOiA5LjEuNS4xKQotQ0hLSjIwMjguZWIubS5lamIxMT1DSEtKMjAyOFc6IFRoaXMgbWV0aG9kIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgYSBtYXRjaGluZyBlamJDcmVhdGUgbWV0aG9kIGlzIGRlZmluZWQuIChFSkIgMS4xOiA5LjEuNS4xKQotQ0hLSjIwMjkuZWIuaS5lamIxMT1DSEtKMjAyOVc6IHswfSBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGhvbWUgaW50ZXJmYWNlIHsxfS4gKEVKQiAxLjE6IDkuMi4zKQotQ0hLSjIwMjkuZWIubS5lamIxMT1DSEtKMjAyOVc6IFRoaXMgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvbiB0aGUgaG9tZSBpbnRlcmZhY2UgezB9LiAoRUpCIDEuMTogOS4yLjMpCi1DSEtKMjAzMC5laC5pLmVqYjExPUNIS0oyMDMwRTogezB9IG11c3QgaGF2ZSBhIG1hdGNoaW5nIGVqYkZpbmQgbWV0aG9kIGluIHRoZSB7MX0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjIwMzAuZWgubS5lamIxMT1DSEtKMjAzMEU6IFRoaXMgbWV0aG9kIG11c3QgaGF2ZSBhIG1hdGNoaW5nIGVqYkZpbmQgbWV0aG9kIGluIHRoZSB7MH0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjIwMzIuZWIuZWpiMTE9Q0hLSjIwMzJXOiBCZWFuIGNsYXNzIHswfSBtdXN0IGRlY2xhcmUgYXQgbGVhc3Qgb25lIGNvbnRhaW5lciBtYW5hZ2VkIGZpZWxkLiAoRUpCIDEuMTogOS40LjcpCi1DSEtKMjAzMy5lYi5lamIxMT1DSEtKMjAzM1c6IFRoZSBzZXRFbnRpdHlDb250ZXh0KEVudGl0eUNvbnRleHQgaWMpIG1ldGhvZCBtdXN0IGV4aXN0LiAoRUpCIDEuMTogOS4xLjUuMSkKLUNIS0oyMDM0LmViLmVqYjExPUNIS0oyMDM0VzogVGhlIHVuc2V0RW50aXR5Q29udGV4dCgpIG1ldGhvZCBtdXN0IGV4aXN0LiAoRUpCIDEuMTogOS4xLjUuMSkKLUNIS0oyMDM1LmViLmVqYjExPUNIS0oyMDM1VzogVGhlIGVqYkFjdGl2YXRlKCkgbWV0aG9kIG11c3QgZXhpc3QuIChFSkIgMS4xOiA5LjEuNS4xKQotQ0hLSjIwMzYuZWIuZWpiMTE9Q0hLSjIwMzZXOiBUaGUgZWpiUGFzc2l2YXRlKCkgbWV0aG9kIG11c3QgZXhpc3QuIChFSkIgMS4xOiA5LjEuNS4xKQotQ0hLSjIwMzcuZWIuZWpiMTE9Q0hLSjIwMzdXOiBUaGUgZWpiUmVtb3ZlKCkgbWV0aG9kIG11c3QgZXhpc3QuIChFSkIgMS4xOiA5LjEuNS4xKQotQ0hLSjIwMzguZWIuZWpiMTE9Q0hLSjIwMzhXOiBUaGUgZWpiTG9hZCgpIG1ldGhvZCBtdXN0IGV4aXN0LiAoRUpCIDEuMTogOS4xLjUuMSkKLUNIS0oyMDM5LmViLmVqYjExPUNIS0oyMDM5VzogVGhlIGVqYlN0b3JlKCkgbWV0aG9kIG11c3QgZXhpc3QuIChFSkIgMS4xOiA5LjEuNS4xKQotCi1DSEtKMjA0MC5zYi5lamIxMT1DSEtKMjA0MEk6ICJ0aGlzIiBtdXN0IG5vdCBiZSBwYXNzZWQgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0LiAoRUpCIDEuMTogNi4xMC4yKQotCi1DSEtKMjEwMC5lamIxMT1DSEtKMjEwMEU6IEJvdGggZW5kcyBvZiB0aGUgcm9sZSBtdXN0IHVzZSB0aGUgc2FtZSBudW1iZXIgb2YgYXR0cmlidXRlcy4KLUNIS0oyMTAxLmVqYjExPUNIS0oyMTAxRTogQm90aCBlbmRzIG9mIHRoZSByb2xlIG11c3QgdXNlIHRoZSBzYW1lIHR5cGUuCi1DSEtKMjEwMi5laC5lamIxMT1DSEtKMjEwMkU6IEVpdGhlciBhIGZpbmRlciBkZXNjcmlwdG9yLCBvciBhIG1hdGNoaW5nIGN1c3RvbSBmaW5kZXIgbWV0aG9kIG9uIHRoZSB7MH0gY2xhc3MsIG11c3QgYmUgZGVmaW5lZC4KLUNIS0oyMTAzLmVqYjExPUNIS0oyMTAzRTogSW4gY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgezB9IGJlYW4gY2xhc3MgbXVzdCBpbmhlcml0IHsxfS4gKEVKQiAxLjE6IEIuMikKLUNIS0oyMTA0LmVqYjExPUNIS0oyMTA0RTogSW4gY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgezB9IGhvbWUgaW50ZXJmYWNlIG11c3Qgbm90IGluaGVyaXQgezF9LiAoRUpCIDEuMTogQi4yKQotQ0hLSjIxMDUuZWpiMTE9Q0hLSjIxMDVFOiBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSB7MH0gcmVtb3RlIGludGVyZmFjZSBtdXN0IGluaGVyaXQgezF9LiAoRUpCIDEuMTogQi4yKQotQ0hLSjIxMDYuZWpiMTE9Q0hLSjIxMDZFOiBCZWFuIHswfSBtdXN0IHVzZSB7MX0gYXMgaXRzIDxwcmltLWtleS1jbGFzcz4gKEVKQiAxLjE6IEIuMikuCi0KLUNIS0oyMjAwLmkuZWpiMTE9Q0hLSjIyMDBXOiBUaGUgezB9IHN0YXRpYyBmaWVsZCBzaG91bGQgYmUgZmluYWwuIChFSkIgMS4xOiAxOC4xLjIpCi1DSEtKMjIwMC5tLmVqYjExPUNIS0oyMjAwVzogVGhpcyBzdGF0aWMgZmllbGQgc2hvdWxkIGJlIGZpbmFsLiAoRUpCIDEuMTogMTguMS4yKQotQ0hLSjIyMDEuZWIuaS5lamIxMT1DSEtKMjIwMUU6IHswfSBtdXN0IG5vdCBiZSB0cmFuc2llbnQuIChFSkIgMS4xOiA5LjQuMSkKLUNIS0oyMjAxLmViLm0uZWpiMTE9Q0hLSjIyMDFFOiBUaGUgZmllbGQgbXVzdCBub3QgYmUgdHJhbnNpZW50LiAoRUpCIDEuMTogOS40LjEpCi1DSEtKMjIwMi5lYi5pLmVqYjExPUNIS0oyMjAyVzogVGhlIGZpZWxkIHR5cGUgb2YgZmllbGQgezB9IGlzIGludmFsaWQgZm9yIGEgQ01QIGJlYW4uIChFSkIgMS4xOiA5LjQuMSkKLUNIS0oyMjAyLmViLm0uZWpiMTE9Q0hLSjIyMDJXOiBUaGUgZmllbGQgdHlwZSBpcyBpbnZhbGlkIGZvciBhIENNUCBiZWFuLiAoRUpCIDEuMTogOS40LjEpCi1DSEtKMjIwMy5lYi5pLmVqYjExPUNIS0oyMjAzRTogezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS40LjEpCi1DSEtKMjIwMy5lYi5tLmVqYjExPUNIS0oyMjAzRTogVGhlIGZpZWxkIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS40LjEpCi1DSEtKMjIwNS5lYi5pLmVqYjExPUNIS0oyMjA1VzogVGhlIHByaW1hcnkga2V5IGZpZWxkIG5hbWVkIHswfSBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuNC43LjIpCi1DSEtKMjIwNS5lYi5tLmVqYjExPUNIS0oyMjA1VzogVGhlIHByaW1hcnkga2V5IGZpZWxkIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS40LjcuMikKLUNIS0oyMjA2LmViLmkuZWpiMTE9Q0hLSjIyMDZXOiB7MH0gbXVzdCBiZSBhIDxjbXAtZmllbGQ+IG9mIHsxfSBhbmQgYSBmaWVsZCBvZiBiZWFuIGNsYXNzIHsyfS4gKEVKQiAxLjE6IDkuNC43LjIpLgotQ0hLSjIyMDYuZWIubS5lamIxMT1DSEtKMjIwNlc6IFRoaXMgZmllbGQgbXVzdCBiZSBhIDxjbXAtZmllbGQ+IG9mIHswfSBhbmQgYSBmaWVsZCBvZiBiZWFuIGNsYXNzIHsxfS4gKEVKQiAxLjE6IDkuNC43LjIpLgotQ0hLSjIyMDcuZWIuZWpiMTE9Q0hLSjIyMDdFOiBLZXkgZmllbGQgezB9IG11c3QgYmUgdGhlIHNhbWUgdHlwZSBhcyB0aGUgcHJpbWFyeSBrZXksIHsxfS4gKEVKQiAxLjE6IDkuNC43LjEpLgotCi1DSEtKMjQwMC5lamJDcmVhdGUuc2IuaS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIG9uIG1ldGhvZCB7MH0uIChFSkIgMS4xOiA2LjEwLjMpLgotQ0hLSjI0MDAuZWpiQ3JlYXRlLnNiLm0uZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQwMC5idXMuc2IuaS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIG9uIG1ldGhvZCB7MH0uIChFSkIgMS4xOiA2LjEwLjQpLgotQ0hLSjI0MDAuYnVzLnNiLm0uZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gKEVKQiAxLjE6IDYuMTAuNCkuCi1DSEtKMjQwMC5lamJDcmVhdGUuZWIuaS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIG9uIHswfS4gKEVKQiAxLjE6IDkuMi4zKS4KLUNIS0oyNDAwLmVqYkNyZWF0ZS5lYi5tLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIChFSkIgMS4xOiA5LjIuMykuCi1DSEtKMjQwMC5lamJQb3N0Q3JlYXRlLmViLmkuZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiBvbiB7MH0uIChFSkIgMS4xOiA5LjIuNCkuCi1DSEtKMjQwMC5lamJQb3N0Q3JlYXRlLmViLm0uZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gKEVKQiAxLjE6IDkuMi40KS4KLUNIS0oyNDAwLmVqYkZpbmQuZWIuaS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIG9uIHswfS4gKEVKQiAxLjE6IDkuMi41KS4KLUNIS0oyNDAwLmVqYkZpbmQuZWIubS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiAoRUpCIDEuMTogOS4yLjUpLgotQ0hLSjI0MDAuYnVzLmViLmkuZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiBvbiB7MH0uIChFSkIgMS4xOiA5LjIuNikuCi1DSEtKMjQwMC5idXMuZWIubS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiAoRUpCIDEuMTogOS4yLjYpLgotCi1DSEtKMjQwMS5zYi5pLmVqYjExPUNIS0oyNDAxRTogezB9IG11c3QgcmV0dXJuIHZvaWQuIChFSkIgMS4xOiA2LjEwLjMpCi1DSEtKMjQwMS5zYi5tLmVqYjExPUNIS0oyNDAxRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gKEVKQiAxLjE6IDYuMTAuMykKLUNIS0oyNDAyLnNoLmkuZWpiMTE9Q0hLSjI0MDJXOiB7MH0gbXVzdCByZXR1cm4gdGhlIHsxfSByZW1vdGUgaW50ZXJmYWNlIHR5cGUuICAoRUpCIDEuMTogNi4xMC42KS4KLUNIS0oyNDAyLnNoLm0uZWpiMTE9Q0hLSjI0MDJXOiBUaGlzIGNyZWF0ZSBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHswfSByZW1vdGUgaW50ZXJmYWNlIHR5cGUuICAoRUpCIDEuMTogNi4xMC42KS4KLUNIS0oyNDAyLmVoLmkuZWpiMTE9Q0hLSjI0MDJXOiB7MH0gbXVzdCByZXR1cm4gdGhlIHsxfSByZW1vdGUgaW50ZXJmYWNlIHR5cGUuICAoRUpCIDEuMTogOS4yLjgpLgotQ0hLSjI0MDIuZWgubS5lamIxMT1DSEtKMjQwMlc6IFRoaXMgY3JlYXRlIG1ldGhvZCBtdXN0IHJldHVybiB0aGUgezB9IHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4gIChFSkIgMS4xOiA5LjIuOCkuCi1DSEtKMjQwMy5laC5pLmVqYjExPUNIS0oyNDAzVzogezB9IG11c3QgcmV0dXJuIHsxfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZi4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjI0MDMuZWgubS5lamIxMT1DSEtKMjQwM1c6IFRoZSBtZXRob2QgbXVzdCByZXR1cm4gezB9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjQwNS5laC5pLmVqYjExPUNIS0oyNDA1VzogVGhlIG9yZGVyIGFuZCB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIGluIHswfSBtdXN0IG1hdGNoIHRoZSBvcmRlciBhbmQgdHlwZXMgb2YgdGhlIGZpZWxkcyBpbiB0aGUgezF9IGtleSBjbGFzcy4gKEVKQiAxLjE6IDkuMi44LCA5LjQuNy4zLCAxNi41KQotQ0hLSjI0MDUuZWgubS5lamIxMT1DSEtKMjQwNVc6IFRoZSBvcmRlciBhbmQgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyBtdXN0IG1hdGNoIHRoZSBvcmRlciBhbmQgdHlwZXMgb2YgdGhlIGZpZWxkcyBpbiB0aGUgezB9IGtleSBjbGFzcy4gKEVKQiAxLjE6IDkuMi44LCA5LjQuNy4zLCAxNi41KQotQ0hLSjI0MDYuZWIuaS5lamIxMT1DSEtKMjQwNlc6IHswfSBzaG91bGQgcmV0dXJuIHRoZSBwcmltYXJ5IGtleSB0eXBlIHsxfS4gKEVKQiAxLjE6IDkuMi4zLCA5LjQuMiwgOS40LjcuMykuCi1DSEtKMjQwNi5lYi5tLmVqYjExPUNIS0oyNDA2VzogVGhlIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBwcmltYXJ5IGtleSB0eXBlIHswfS4gKEVKQiAxLjE6IDkuMi4zLCA5LjQuMiwgOS40LjcuMykuCi1DSEtKMjQwNy5lYi5pLmVqYjExPUNIS0oyNDA3VzogezB9IHNob3VsZCByZXR1cm4gZWl0aGVyIHsxfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZi4gIChFSkIgMS4xOiA5LjIuNSkKLUNIS0oyNDA3LmViLm0uZWpiMTE9Q0hLSjI0MDdXOiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGVpdGhlciB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YuICAoRUpCIDEuMTogOS4yLjUpCi0KLUNIS0oyNDA4LmVqYkNyZWF0ZS5zYi5pLmVqYjExPUNIS0oyNDA4RTogezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogNi4xMC4zKS4KLUNIS0oyNDA4LmVqYkNyZWF0ZS5zYi5tLmVqYjExPUNIS0oyNDA4RTogVGhlIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQwOC5idXMuc2IuaS5lamIxMT1DSEtKMjQwOEU6IHswfSBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDYuMTAuNCkuCi1DSEtKMjQwOC5idXMuc2IubS5lamIxMT1DSEtKMjQwOEU6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogNi4xMC40KS4KLUNIS0oyNDA4LmVqYkNyZWF0ZS5lYi5pLmVqYjExPUNIS0oyNDA4RTogezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MDguZWpiQ3JlYXRlLmViLm0uZWpiMTE9Q0hLSjI0MDhFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi4zKS4KLUNIS0oyNDA4LmVqYlBvc3RDcmVhdGUuZWIuaS5lamIxMT1DSEtKMjQwOEU6IHswfSBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi40KS4KLUNIS0oyNDA4LmVqYlBvc3RDcmVhdGUuZWIubS5lamIxMT1DSEtKMjQwOEU6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MDguZWpiRmluZC5lYi5pLmVqYjExPUNIS0oyNDA4RTogezB9IG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjUpLgotQ0hLSjI0MDguZWpiRmluZC5lYi5tLmVqYjExPUNIS0oyNDA4RTogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuNSkuCi1DSEtKMjQwOC5idXMuZWIuaS5lamIxMT1DSEtKMjQwOEU6IHswfSBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi42KS4KLUNIS0oyNDA4LmJ1cy5lYi5tLmVqYjExPUNIS0oyNDA4RTogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuNikuCi0KLUNIS0oyNDA5LmVqYkNyZWF0ZS5zYi5pLmVqYjExPUNIS0oyNDA5RTogezB9IG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogNi4xMC4zKS4KLUNIS0oyNDA5LmVqYkNyZWF0ZS5zYi5tLmVqYjExPUNIS0oyNDA5RTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA2LjEwLjMpLgotQ0hLSjI0MDkuYnVzLnNiLmkuZWpiMTE9Q0hLSjI0MDlFOiB7MH0gbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA2LjEwLjQpLgotQ0hLSjI0MDkuYnVzLnNiLm0uZWpiMTE9Q0hLSjI0MDlFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDYuMTAuNCkuCi1DSEtKMjQwOS5lamJDcmVhdGUuZWIuaS5lamIxMT1DSEtKMjQwOUU6IHswfSBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi4zKS4KLUNIS0oyNDA5LmVqYkNyZWF0ZS5lYi5tLmVqYjExPUNIS0oyNDA5RTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA5LjIuMykuCi1DSEtKMjQwOS5lamJQb3N0Q3JlYXRlLmViLmkuZWpiMTE9Q0hLSjI0MDlFOiB7MH0gbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA5LjIuNCkuCi1DSEtKMjQwOS5lamJQb3N0Q3JlYXRlLmViLm0uZWpiMTE9Q0hLSjI0MDlFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi40KS4KLUNIS0oyNDA5LmVqYkZpbmQuZWIuaS5lamIxMT1DSEtKMjQwOUU6IHswfSBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi41KS4KLUNIS0oyNDA5LmVqYkZpbmQuZWIubS5lamIxMT1DSEtKMjQwOUU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjUpLgotQ0hLSjI0MDkuYnVzLmViLmkuZWpiMTE9Q0hLSjI0MDlFOiB7MH0gbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA5LjIuNikuCi1DSEtKMjQwOS5idXMuZWIubS5lamIxMT1DSEtKMjQwOUU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjYpLgotCi1DSEtKMjQxMC5lamJDcmVhdGUuc2IuaS5lamIxMT1DSEtKMjQxMEU6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA2LjEwLjMpLgotQ0hLSjI0MTAuZWpiQ3JlYXRlLnNiLm0uZWpiMTE9Q0hLSjI0MTBFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA2LjEwLjMpLgotQ0hLSjI0MTAuYnVzLnNiLmkuZWpiMTE9Q0hLSjI0MTBFOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogNi4xMC40KS4KLUNIS0oyNDEwLmJ1cy5zYi5tLmVqYjExPUNIS0oyNDEwRTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogNi4xMC40KS4KLUNIS0oyNDEwLmVqYkNyZWF0ZS5lYi5pLmVqYjExPUNIS0oyNDEwRTogezB9IG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDkuMi4zKS4KLUNIS0oyNDEwLmVqYkNyZWF0ZS5lYi5tLmVqYjExPUNIS0oyNDEwRTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MTAuZWpiUG9zdENyZWF0ZS5lYi5pLmVqYjExPUNIS0oyNDEwRTogezB9IG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDkuMi40KS4KLUNIS0oyNDEwLmVqYlBvc3RDcmVhdGUuZWIubS5lamIxMT1DSEtKMjQxMEU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDkuMi40KS4KLUNIS0oyNDEwLmVqYkZpbmQuZWIuaS5lamIxMT1DSEtKMjQxMEU6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA5LjIuNSkuCi1DSEtKMjQxMC5lamJGaW5kLmViLm0uZWpiMTE9Q0hLSjI0MTBFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA5LjIuNSkuCi1DSEtKMjQxMC5idXMuZWIuaS5lamIxMT1DSEtKMjQxMEU6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA5LjIuNikuCi1DSEtKMjQxMC5idXMuZWIubS5lamIxMT1DSEtKMjQxMEU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDkuMi42KS4KLQotQ0hLSjI0MTEuc2IuaS5lamIxMT1DSEtKMjQxMUU6IFRoZSBuYW1lIG9mIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiAoRUpCIDEuMTogNi4xMC40KQotQ0hLSjI0MTEuc2IubS5lamIxMT1DSEtKMjQxMUU6IFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIi4gKEVKQiAxLjE6IDYuMTAuNCkKLUNIS0oyNDExLmViLmkuZWpiMTE9Q0hLSjI0MTFFOiBUaGUgbmFtZSBvZiB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIi4gKEVKQiAxLjE6IDkuMi42KQotQ0hLSjI0MTEuZWIubS5lamIxMT1DSEtKMjQxMUU6IFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIi4gKEVKQiAxLjE6IDkuMi42KQotCi1DSEtKMjQxMi5zYi5pLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDYuMTApIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuc2IubS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDYuMTApIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuZWIuaS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA5LjIpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuZWIubS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDkuMikgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5zci5pLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDYuMTAuNSkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5zci5tLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogNi4xMC41KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLmVyLmkuZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogOS4yLjcpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuZXIubS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDkuMi43KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLnNoLmkuZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogNi4xMC42KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLnNoLm0uZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA2LjEwLjYpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuZWguaS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA5LjIuOCkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5laC5tLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogOS4yLjgpIChSTUkgMS4zOiAyLjYpLgotCi1DSEtKMjQxMy5zYi5pLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezF9IG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogNi4xMCkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5zYi5tLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA2LjEwKSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLmViLmkuZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA5LjIpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuZWIubS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogOS4yKSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLnNyLmkuZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA2LjEwLjUpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuc3IubS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogNi4xMC41KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLmVyLmkuZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MX0gb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA5LjIuNykgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5lci5tLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA5LjIuNykgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5zaC5pLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezF9IG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogNi4xMC42KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLnNoLm0uZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDYuMTAuNikgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5laC5pLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezF9IG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogOS4yLjgpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuZWgubS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogOS4yLjgpIChSTUkgMS4zOiAyLjYpLgotCi1DSEtKMjQxNC5zaC5pLmVqYjExPUNIS0oyNDE0RTogezB9IG11c3QgdGhyb3cgezF9LiAoRUpCIDEuMTogNi4xMC42KQotQ0hLSjI0MTQuc2gubS5lamIxMT1DSEtKMjQxNEU6IFRoZSBtZXRob2QgbXVzdCB0aHJvdyB7MH0uIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjQxNC5laC5pLmVqYjExPUNIS0oyNDE0RTogezB9IG11c3QgdGhyb3cgezF9LiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjQxNC5laC5tLmVqYjExPUNIS0oyNDE0RTogVGhlIG1ldGhvZCBtdXN0IHRocm93IHswfS4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjI0MTQuc3IuaS5lamIxMT1DSEtKMjQxNEU6IHswfSBtdXN0IHRocm93IHsxfS4gKEVKQiAxLjE6IDYuMTAuNSkKLUNIS0oyNDE0LnNyLm0uZWpiMTE9Q0hLSjI0MTRFOiBUaGUgbWV0aG9kIG11c3QgdGhyb3cgezB9LiAoRUpCIDEuMTogNi4xMC41KQotQ0hLSjI0MTQuZXIuaS5lamIxMT1DSEtKMjQxNEU6IHswfSBtdXN0IHRocm93IHsxfS4gKEVKQiAxLjE6IDkuMi43KQotQ0hLSjI0MTQuZXIubS5lamIxMT1DSEtKMjQxNEU6IFRoZSBtZXRob2QgbXVzdCB0aHJvdyB7MH0uIChFSkIgMS4xOiA5LjIuNykKLQotQ0hLSjI0MTUuc3IuaS5lamIxMT1DSEtKMjQxNUU6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHsxfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezJ9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA2LjEwLjUpCi1DSEtKMjQxNS5zci5tLmVqYjExPUNIS0oyNDE1RTogVGhlIHJldHVybiB0eXBlIG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCB7MH0sIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsxfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogNi4xMC41KQotQ0hLSjI0MTUuZXIuaS5lamIxMT1DSEtKMjQxNUU6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHsxfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezJ9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA5LjIuNykKLUNIS0oyNDE1LmVyLm0uZWpiMTE9Q0hLSjI0MTVFOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHswfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezF9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA5LjIuNykKLUNIS0oyNDE1LnNoLmkuZWpiMTE9Q0hLSjI0MTVFOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCB7MX0sIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsyfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogNi4xMC42KQotQ0hLSjI0MTUuc2gubS5lamIxMT1DSEtKMjQxNUU6IFRoZSByZXR1cm4gdHlwZSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgezB9LCBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7MX0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyNDE1LmVoLmkuZWpiMTE9Q0hLSjI0MTVFOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCB7MX0sIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsyfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjQxNS5laC5tLmVqYjExPUNIS0oyNDE1RTogVGhlIHJldHVybiB0eXBlIG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCB7MH0sIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsxfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogOS4yLjgpCi0KLUNIS0oyNDE4LmViLmkuZWpiMTE9Q0hLSjI0MThFOiB7MH0gbXVzdCByZXR1cm4gdm9pZC4gKEVKQiAxLjE6IDkuMi40KQotQ0hLSjI0MTguZWIubS5lamIxMT1DSEtKMjQxOEU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQuIChFSkIgMS4xOiA5LjIuNCkKLUNIS0oyNDE5LnNoLmkuZWpiMTE9Q0hLSjI0MTlFOiB7MH0gbXVzdCBiZSBhIGNyZWF0ZSBtZXRob2QuIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjQxOS5zaC5tLmVqYjExPUNIS0oyNDE5RTogVGhpcyBtZXRob2QgbXVzdCBiZSBhIGNyZWF0ZSBtZXRob2QuIChFSkIgMS4xOiA2LjEwLjYpCi0KLUNIS0oyNDIwLnNiLmkuZWpiMTE9Q0hLSjI0MjBFOiB7MX0gbXVzdCBiZSB0aHJvd24gYnkgezB9JydzIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSB7Mn0gaG9tZSBpbnRlcmZhY2UuIChFSkIgMS4xOiA2LjEwLjYsIDEyLjIuMSwgMTIuMi4yKQotQ0hLSjI0MjAuc2IubS5lamIxMT1DSEtKMjQyMEU6IHswfSBtdXN0IGJlIHRocm93biBieSB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIHsxfSBob21lIGludGVyZmFjZS4gKEVKQiAxLjE6IDYuMTAuNiwgMTIuMi4xLCAxMi4yLjIpCi1DSEtKMjQyMC5lYi5pLmVqYjExPUNIS0oyNDIwRTogezF9IG11c3QgYmUgdGhyb3duIGJ5IHswfScncyBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezJ9IGhvbWUgaW50ZXJmYWNlLiAoRUpCIDEuMTogOS4yLjgsIDEyLjIuMSwgMTIuMi4yKQotQ0hLSjI0MjAuZWIubS5lamIxMT1DSEtKMjQyMEU6IHswfSBtdXN0IGJlIHRocm93biBieSB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIHsxfSBob21lIGludGVyZmFjZS4gKEVKQiAxLjE6IDkuMi44LCAxMi4yLjEsIDEyLjIuMikKLUNIS0oyNDMyLnNiLmkuZWpiMTE9Q0hLSjI0MzJFOiB7MH0nJ3MgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIHsxfSByZW1vdGUgaW50ZXJmYWNlIG11c3QgdGhyb3cgezJ9LiAoRUpCIDEuMTogNi4xMC41LCAxMi4yLjEsIDEyLjIuMikKLUNIS0oyNDMyLnNiLm0uZWpiMTE9Q0hLSjI0MzJFOiBUaGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIHswfSByZW1vdGUgaW50ZXJmYWNlIG11c3QgdGhyb3cgezF9LiAoRUpCIDEuMTogNi4xMC41LCAxMi4yLjEsIDEyLjIuMikKLUNIS0oyNDMyLmViLmkuZWpiMTE9Q0hLSjI0MzJFOiB7MH0nJ3MgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIHsxfSByZW1vdGUgaW50ZXJmYWNlIG11c3QgdGhyb3cgezJ9LiAoRUpCIDEuMTogOS4yLjcsIDEyLjIuMSwgMTIuMi4yKQotQ0hLSjI0MzIuZWIubS5lamIxMT1DSEtKMjQzMkU6IFRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezB9IHJlbW90ZSBpbnRlcmZhY2UgbXVzdCB0aHJvdyB7MX0uIChFSkIgMS4xOiA5LjIuNywgMTIuMi4xLCAxMi4yLjIpCi0KLUNIS0oyODAxLmVqYjExPUNIS0oyODAxRTogVGhlIHZhbHVlIG9mIHRoZSA8ZWpiLW5hbWU+IGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQuIChFSkIgMS4xOiAxNi4yLCAxNi41KQotQ0hLSjI4MDIubmFtZWQuZWpiMTE9Q0hLSjI4MDJFOiA8ZWpiLWNsYXNzPiBjbGFzcyB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODAyLnVubmFtZWQuZWpiMTE9Q0hLSjI4MDJFOiBVbmtub3duIGNsYXNzIHNwZWNpZmllZCBpbiB0aGUgPGVqYi1jbGFzcz4gZWxlbWVudC4gKEVKQiAxLjE6IDE2LjIsIDE2LjUpLgotQ0hLSjI4MDMubmFtZWQuZWpiMTE9Q0hLSjI4MDNFOiA8aG9tZT4gaW50ZXJmYWNlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDMudW5uYW1lZC5lamIxMT1DSEtKMjgwM0U6IFVua25vd24gaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQuIChFSkIgMS4xOiAxNi4yLCAxNi41KS4KLUNIS0oyODA0Lm5hbWVkLmVqYjExPUNIS0oyODA0RTogPHJlbW90ZT4gaW50ZXJmYWNlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDQudW5uYW1lZC5lamIxMT1DSEtKMjgwNEU6IFVua25vd24gaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGUgPHJlbW90ZT4gZWxlbWVudC4gKEVKQiAxLjE6IDE2LjIsIDE2LjUpLgotQ0hLSjI4MDYuZWpiMTE9Q0hLSjI4MDZFOiBUaGUgdmFsdWUgb2YgdGhlIDxyZWVudHJhbnQ+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIlRydWUiIG9yICJGYWxzZSIuIChFSkIgMS4xOiAxNi4yLCAxNi41KQotQ0hLSjI4MDcuZWpiMTE9Q0hLSjI4MDdFOiBUaGUgdmFsdWUgb2YgdGhlIDxzZXNzaW9uLXR5cGU+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIlN0YXRlZnVsIiBvciAiU3RhdGVsZXNzIi4gKEVKQiAxLjE6IDE2LjIsIDE2LjUpCi1DSEtKMjgwOC5lamIxMT1DSEtKMjgwOEU6IFRoZSB2YWx1ZSBvZiB0aGUgPHRyYW5zYWN0aW9uLXR5cGU+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIkNvbnRhaW5lciIgb3IgIkJlYW4iLiAoRUpCIDEuMTogMTEuMy41LCAxNi4yLCwgMTYuNSkKLUNIS0oyODA5LmVqYjExPUNIS0oyODA5RTogVGhlIHZhbHVlIG9mIHRoZSA8cGVyc2lzdGVuY2UtdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiQ29udGFpbmVyIiBvciAiQmVhbiIuICAoRUpCIDEuMTogMTYuMiwgMTYuNSkKLUNIS0oyODEwLm5hbWVkLmVqYjExPUNIS0oyODEwRTogPHByaW0ta2V5LWNsYXNzPiBjbGFzcyB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODEwLnVubmFtZWQuZWpiMTE9Q0hLSjI4MTBFOiBVbmtub3duIGNsYXNzIHNwZWNpZmllZCBpbiB0aGUgPHByaW0ta2V5LWNsYXNzPiBlbGVtZW50LiAgKEVKQiAxLjE6IDE2LjIsIDE2LjUpLgotQ0hLSjI4MTEubmFtZWQuZWpiMTE9Q0hLSjI4MTFFOiA8ZmllbGQtbmFtZT4gezB9IGNhbm5vdCBiZSBsb2NhdGVkIG9uIGJlYW4gY2xhc3MgezF9LiAoRUpCIDEuMTogMTYuNSkuCi1DSEtKMjgxMS51bm5hbWVkLmVqYjExPUNIS0oyODExRTogPGNtcC1maWVsZD4gbXVzdCBzcGVjaWZ5IGEgPGZpZWxkLW5hbWU+LiAoRUpCIDEuMTogMTYuNSkuCi1DSEtKMjgxMi5lamIxMT1DSEtKMjgxMkU6IEJlYW4gY2xhc3MgezB9IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgb2YgaXRzIGZpZWxkcyBhcyBhIDxjbXAtZmllbGQ+LiAoRUpCIDEuMTogMTYuNSkKLUNIS0oyODE0LmVqYjExPUNIS0oyODE0VzogPGVqYi1uYW1lPiwgaW4gPG1ldGhvZD4sIHNob3VsZCBzcGVjaWZ5IGEga25vd24gZW50ZXJwcmlzZSBiZWFuLiAoRUpCIDEuMTogMTEuNC4xLCAxNS4zLjIsIDE2LjUpCi0KLUNIS0oyODIwLmVqYjExPUNIS0oyODIwVzogVGhlIHNlY3VyaXR5IHJvbGUgcmVmIG11c3QgYmUgZGVmaW5lZCBvbmx5IG9uY2UuCi1DSEtKMjgyMi5lamIxMT1DSEtKMjgyMlc6IDxzZWN1cml0eS1yb2xlLXJlZj4gZWxlbWVudCBmb3IgYmVhbiB7MH0gc2hvdWxkIGRlZmluZSB0aGUgPHJvbGUtbmFtZT4gZWxlbWVudC4gKEVKQiAxLjE6IDE1LjIuNS4zKQotQ0hLSjI4MjMuZWpiMTE9Q0hLSjI4MjNXOiA8c2VjdXJpdHktcm9sZS1yZWY+IGVsZW1lbnQgc2hvdWxkIGRlZmluZSB0aGUgPHJvbGUtbGluaz4gZWxlbWVudC4gKEVKQiAxLjE6IDE1LjMuMykKLUNIS0oyODI0LmVqYjExPUNIS0oyODI0VzogPHNlY3VyaXR5LXJvbGUtcmVmPiBlbGVtZW50IHJlZmVycyB0byB1bmtub3duIHJvbGUgezB9LiAoRUpCIDEuMTogMTUuMy4zKQotQ0hLSjI4MjUuZWpiMTE9Q0hLSjI4MjVXOiA8c2VjdXJpdHktcm9sZT4gZWxlbWVudCBpbiBlamItamFyLnhtbCBzaG91bGQgZGVmaW5lIHRoZSA8cm9sZS1uYW1lPiBlbGVtZW50LiAoRUpCIDEuMTogMTUuMy4xKQotQ0hLSjI4MjYuZWpiMTE9Q0hLSjI4MjZXOiBUaGUgc2VjdXJpdHktcm9sZSBuYW1lIG11c3QgYmUgdW5pcXVlLiAoRUpCIDEuMTogMTUuMy4xKQotQ0hLSjI4MjcuZWpiMTE9Q0hLSjI4MjdXOiBDYW5ub3QgdXNlIGEgPHJvbGUtbGluaz4gZWxlbWVudCB3aXRob3V0IDxzZWN1cml0eS1yb2xlPiBlbGVtZW50cy4gKEVKQiAxLjE6IDE1LjIuNS4zLCAxNS4zLjEsIDE1LjMuMykKLUNIS0oyODI4LmVqYjExPUNIS0oyODI4RTogQ2Fubm90IHVzZSBhIDxwcmlta2V5LWZpZWxkPiBlbGVtZW50IHdpdGhvdXQgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkuIChFSkIgMS4xOiA5LjQuNywgMTYuNSkKLUNIS0oyODI5LmVqYjExPUNIS0oyODI5RTogS2V5IGNsYXNzIHswfSBkb2VzIG5vdCBtYXAgdG8gYW55IGZpZWxkcyBpbiBlbnRlcnByaXNlIGJlYW4gezF9LiAoRUpCIDEuMTogOS40LjcsIDE2LjUpCi0KLUNIS0oyODMwLmVqYjExPUNIS0oyODMwVzogVGhlIHR5cGUgb2YgdGhlIHswfSBmaWVsZCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MzEuZWpiMTE9Q0hLSjI4MzFXOiB7MH0gbXVzdCBiZSBkZWNsYXJlZCBpbiBhIDxjbXAtZmllbGQ+IGVsZW1lbnQuIChFSkIgMS4xOiA5LjQuNy4yKQotQ0hLSjI4MzIuZWpiMTE9Q0hLSjI4MzJJOiBIb21lIHswfSwgc3BlY2lmaWVkIGluIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCwgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBFSkIgbW9kdWxlLiAoRUpCIDEuMTogMTQuMy4xLjIpCi1DSEtKMjgzMy5lamIxMT1DSEtKMjgzM0k6IFJlbW90ZSB7MH0sIHNwZWNpZmllZCBpbiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQsIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gKEVKQiAxLjE6IDE0LjMuMS4yKQotQ0hLSjI4MzQuZWpiMTE9Q0hLSjI4MzRJOiBCZWFuIHswfSwgc3BlY2lmaWVkIGluIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCwgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBFSkIgbW9kdWxlLiAoRUpCIDEuMTogMTQuMy4yKQotQ0hLSjI4MzUuZWpiMTE9Q0hLSjI4MzVJOiBCZWFuIHswfSBpcyBhIHsxfSB0eXBlLiBVcGRhdGUgdGhlIDxlamItcmVmLXR5cGU+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50LiAoRUpCIDEuMTogMTQuMy4yKQotQ0hLSjI4MzYuZWpiMTE9Q0hLSjI4MzZJOiBCZWFuIHswfSB1c2VzIGhvbWUgezF9LiBVcGRhdGUgdGhlIDxlamItcmVmPiBlbGVtZW50IG9mIHRoZSA8ZWpiLXJlZj4gZWxlbWVudC4gKEVKQiAxLjE6IDE0LjMuMikKLUNIS0oyODM3LmVqYjExPUNIS0oyODM3STogQmVhbiB7MH0gdXNlcyByZW1vdGUgezF9LiBVcGRhdGUgdGhlIDxlamItcmVmPiBlbGVtZW50IG9mIHRoZSA8ZWpiLXJlZj4gZWxlbWVudC4gKEVKQiAxLjE6IDE0LjMuMikuCi1DSEtKMjgzOC5lamIxMT1DSEtKMjgzOEk6IEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHJlZmVyZW5jZXMgdG8gZW50ZXJwcmlzZSBiZWFucyBiZSBvcmdhbml6ZWQgaW4gdGhlICJlamIiIHN1YmNvbnRleHQuIChFSkIgMS4xOiAxNC4zLjEuMSkuCi1DSEtKMjgzOS5lamIxMT1DSEtKMjgzOVc6IFRoZSA8ZW52LWVudHJ5LW5hbWU+IGVsZW1lbnQsIG9mIHRoZSA8ZW52LWVudHJ5PiBlbGVtZW50LCBpcyBpbnZhbGlkLiAoRUpCIDEuMTogMTQuMi4xLjIpCi0KLUNIS0oyODQwLmVqYjExPUNIS0oyODQwVzogVGhlIDxlbnYtZW50cnktdHlwZT4gZWxlbWVudCwgb2YgdGhlIDxlbnYtZW50cnk+IGVsZW1lbnQsIGlzIGludmFsaWQuIChFSkIgMS4xOiAxNC4yLjEuMikuCi1DSEtKMjg0MS5lamIxMT1DSEtKMjg0MVc6IFRoZSB7MH0gbmFtZSwgaW4gdGhlIDxlbnYtZW50cnktbmFtZT4gZWxlbWVudCwgY2FuIGJlIHVzZWQgb25seSBvbmNlIGluIHRoZSBiZWFuLiAoRUpCIDEuMTogMTQuMi4xLjIpLgotQ0hLSjI4NDIuZWpiMTE9Q0hLSjI4NDJXOiA8bWV0aG9kLXBhcmFtcz4gaXMgaWdub3JlZCB3aGVuIDxtZXRob2QtbmFtZT4gaXMgIioiLiAoRUpCIDEuMTogMTEuNC4xLCAxNS4zLjIpLgotQ0hLSjI4NDMuZWpiMTE9Q0hLSjI4NDNXOiBObyBtZXRob2RzLCBvbiB7MH0sIG1hdGNoIHRoaXMgPG1ldGhvZD4uIChFSkIgMS4xOiAxMS40LjEsIDE1LjMuMikuCi1DSEtKMjg0NC5lamIxMT1DSEtKMjg0NFc6IEF0IGxlYXN0IG9uZSA8bWV0aG9kPiBzaG91bGQgYmUgc2V0IGluIGEgPG1ldGhvZC1wZXJtaXNzaW9uPi4gKEVKQiAxLjE6IDExLjQuMSwgMTUuMy4yKS4KLUNIS0oyODQ1LmVqYjExPUNIS0oyODQ1VzogQXQgbGVhc3Qgb25lIDxyb2xlLW5hbWU+IHNob3VsZCBiZSBzZXQgaW4gYSA8bWV0aG9kLXBlcm1pc3Npb24+LiAoRUpCIDEuMTogMTEuNC4xLCAxNS4zLjIpLgotQ0hLSjI4NDYuZWpiMTE9Q0hLSjI4NDZXOiBObyBtZXRob2RzIGNhbiBiZSBmb3VuZCBmb3IgdGhpcyA8bWV0aG9kLXBlcm1pc3Npb24+LiAoRUpCIDEuMTogMTUuMy4yKS4KLUNIS0oyODQ3LmVqYjExPUNIS0oyODQ3VzogTm8gbWV0aG9kcyBjYW4gYmUgZm91bmQgZm9yIHRoaXMgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4uIChFSkIgMS4xOiAxMS40LjEpLgotQ0hLSjI4NDkuZWpiMTE9Q0hLSjI4NDlXOiBDYW5ub3QgdmFsaWRhdGUgY29tcG9uZW50IGluaGVyaXRhbmNlIG9mIHswfSBiZWNhdXNlIHsxfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4NTAuZWpiMTE9Q0hLSjI4NTBXOiBDYW5ub3QgdmFsaWRhdGUgPG1ldGhvZD4gYmVjYXVzZSB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODUxLmVqYjExPUNIS0oyODUxVzogQ2Fubm90IHZhbGlkYXRlIHswfSBiZWNhdXNlIHsxfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4NTIuZWpiMTE9Q0hLSjI4NTJXOiBUaHJvd2FibGUgY2F1Z2h0IHdoaWxlIHZhbGlkYXRpbmcgdGhlIGVqYi1qYXIueG1sLiBUaGUgYmVhbiBiZWluZyB2YWxpZGF0ZWQgd2FzIHswfS4KLUNIS0oyODUzLmVqYjExPUNIS0oyODUzVzogVGhyb3dhYmxlIGNhdWdodCB3aGlsZSB2YWxpZGF0aW5nIHRoZSBpYm0tZWpiLWphci1leHQueG1pLiBUaGUgYmVhbiBiZWluZyB2YWxpZGF0ZWQgd2FzIHswfS4KLQotQ0hLSjI5MDguZWpiMTE9Q0hLSjI5MDhXOiBBbiBlbnRlcnByaXNlIGJlYW4gY2Fubm90IGJlIHJlZmxlY3RlZCBwcm9wZXJseS4gUnVuIHRoZSBYTUwgdmFsaWRhdG9yIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1DSEtKMjg5NS5lamIxMT1DSEtKMjg5NVc6IDxlamItbmFtZT4gezB9IG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphci54bWwgZmlsZSAoRUpCIDEuMTogMTYuNSkuCi1DSEtKMjg3NS5lamIxMT1DSEtKMjg3NUU6IDxlamItY2xpZW50LWphcj4gezB9IG11c3QgZXhpc3QgaW4gZXZlcnkgRUFSIGZpbGUgdGhhdCBjb250YWlucyB0aGlzIEVKQiBtb2R1bGUgKEVKQiAxLjE6IDE2LjUsIDE3LjQpLgotCi0KLSMgRUpCX01FVEhPRF9CRUFOX05VTEw9Q0hLSjI0MzRXOiBWYWxpZGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGJlYW4gY2xhc3MgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIGJlYW4gY2xhc3MnJyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfTUVUSE9EX0hPTUVfTlVMTD1DSEtKMjQzNVc6IFZhbGlkYXRpb24gb2YgdGhpcyBtZXRob2Qgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgaG9tZSBpbnRlcmZhY2UgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIGhvbWUgaW50ZXJmYWNlJydzIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9NRVRIT0RfUkVNT1RFX05VTEw9Q0hLSjI0MzZXOiBWYWxpZGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIHJlbW90ZSBpbnRlcmZhY2UgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIHJlbW90ZSBpbnRlcmZhY2UnJ3MgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX01FVEhPRF9OVUxMPUNIS0oyNDM3VzogVmFsaWRhdGlvbiBvZiB0aGlzIG1ldGhvZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBlbnRlcnByaXNlIGJlYW4gY2Fubm90IGJlIGZvdW5kLgotIyBFSkJfTUVUSE9EX0tFWV9OVUxMPUNIS0oyNDM4VzogVmFsaWRhdGlvbiBvZiB0aGlzIG1ldGhvZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBwcmltYXJ5IGtleSBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUga2V5IGNsYXNzJycgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX1JFTU9URV9OVUxMPUNIS0oyOTA0RTogVmFsaWRhdGlvbiBvZiB7MH0gd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgcmVtb3RlIGludGVyZmFjZSBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiBpdHMgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX05VTEw9Q0hLSjI5MDNFOiBWYWxpZGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGVudGVycHJpc2UgYmVhbiBjYW5ub3QgYmUgZm91bmQuCi0jIEVKQl9OT1RSRUZMRUNURURfSkFWQUNMQVNTPUNIS0oyOTA3RTogQ2Fubm90IHZhbGlkYXRlIGJlY2F1c2UgdGhlIHswfSB0eXBlIGNhbm5vdCBiZSByZWZsZWN0ZWQuIEVuc3VyZSB0aGF0IGl0LCBhbmQgYWxsIG9mIGl0cyBkZXBlbmRlbmNpZXMsIGFyZSBpbmNsdWRlZCBpbiB0aGUgY2xhc3NwYXRoLgotIyBFSkJfRklFTERfQ0FOTk9UX1JFRkxFQ1Q9Q0hLSjIyMDhXOiBUeXBlIHswfSBvZiBmaWVsZCB7MX0gY2Fubm90IGJlIHJlZmxlY3RlZC4gRW5zdXJlIHRoYXQgezB9LCBhbmQgYWxsIG9mIGl0cyBkZXBlbmRlbmNpZXMsIGFyZSBpbmNsdWRlZCBpbiB0aGUgY2xhc3NwYXRoLgotIyBFSkJfRklFTERfQkVBTl9OVUxMPUNIS0oyMjA5VzogVmFsaWRhdGlvbiBvZiB0aGlzIGZpZWxkIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGJlYW4gY2xhc3MgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIGJlYW4gY2xhc3MnJyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfRklFTERfSE9NRV9OVUxMPUNIS0oyMjEwVzogVmFsaWRhdGlvbiBvZiB0aGlzIGZpZWxkIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGhvbWUgaW50ZXJmYWNlIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSBob21lIGludGVyZmFjZScncyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfRklFTERfUkVNT1RFX05VTEw9Q0hLSjIyMTFXOiBWYWxpZGF0aW9uIG9mIHRoaXMgZmllbGQgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgcmVtb3RlIGludGVyZmFjZSBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUgcmVtb3RlIGludGVyZmFjZScncyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfRklFTERfTlVMTD1DSEtKMjIxMlc6IFZhbGlkYXRpb24gb2YgdGhpcyBmaWVsZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBlbnRlcnByaXNlIGJlYW4gY2Fubm90IGJlIGZvdW5kLgotIyBFSkJfRklFTERfS0VZX05VTEw9Q0hLSjIyMTNXOiBWYWxpZGF0aW9uIG9mIHRoaXMgZmllbGQgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgcHJpbWFyeSBrZXkgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIGtleSBjbGFzcycnIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9IQVNfTVVMVElQTEVfUEtfTUVUSE9EUz1DSEtKMjAwMFc6IFRoZSB7MH0gaG9tZSBpbnRlcmZhY2UgbXVzdCBjb250YWluIG9ubHkgb25lIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLiAoRUpCIDEuMTogOS4yLjgpCi0jIEVKQl9IT01FX05VTEw9Q0hLSjI5MDFFOiBWYWxpZGF0aW9uIG9mIHswfSB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBob21lIGludGVyZmFjZSBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiBpdHMgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX0tFWV9OVUxMPUNIS0oyOTAyRTogVmFsaWRhdGlvbiBvZiB7MH0gd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUga2V5IGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIGl0cyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfQkVBTl9OVUxMPUNIS0oyOTAwRTogVmFsaWRhdGlvbiBvZiB7MH0gd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgYmVhbiBjbGFzcyBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiBpdHMgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX0JNUF9OT0ZJRUxEUz1DSEtKMjA0Mlc6IFRvIGhhdmUgYSBwcmltYXJ5IGtleSwgdGhlIHswfSBiZWFuIGNsYXNzIG11c3QgZGVjbGFyZSBhdCBsZWFzdCBvbmUgZmllbGQuIChFSkIgMS4xOiA5LjEuNS4xKQotIyBFSkJfRERfQ0FOTk9UX09QRU5fREQ9Q0hLSjI4MjFFOiBDYW5ub3Qgb3BlbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBWYWxpZGF0aW9uIGNhbm5vdCBjb21wbGV0ZS4KLSMgRUpCX0REX01FVEhUUkFOU0FDVElPTl9OT19UUkFOU0FDVElPTj1DSEtKMjg0OFc6IEF0IGxlYXN0IG9uZSA8dHJhbnMtYXR0cmlidXRlPiBtdXN0IGJlIHNldCBpbiBhIDxjb250YWluZXItdHJhbnNhY3Rpb24+LiAoRUpCIDEuMTogMTEuNC4xKQotCi0jCi0jIGVuZCBvZiBtZXNzYWdlcyBmb3IgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotIwotCi0jCi0jIE1lc3NhZ2VzIGZvciBFSkIgMi4wIHNwZWNpZmljYXRpb24KLSMKLUNIS0oyODI4LmVqYjIwPUNIS0oyODI4RTogQ2Fubm90IHVzZSBhIDxwcmlta2V5LWZpZWxkPiB3aXRob3V0IGEgcHJpbWl0aXZlIHByaW1hcnkga2V5IChFSkIgMi4wOiAxMC44LjEsIDIyLjUpLgotQ0hLSjI4MjkuZWpiMjA9Q0hLSjI4MjlFOiBLZXkgY2xhc3MgezB9IGRvZXMgbm90IG1hcCB0byBhbnkgZmllbGRzIGluIGVudGVycHJpc2UgYmVhbiB7MX0uIChFSkIgMi4wOiAxMC44LCAyMi41KS4KLUNIS0oyODM5LmVqYjIwPUNIS0oyODM5VzogVGhlIDxlbnYtZW50cnktbmFtZT4gZWxlbWVudCwgb2YgdGhlIDxlbnYtZW50cnk+IGVsZW1lbnQsIGlzIGludmFsaWQuIChFSkIgMi4wOiAyMC4yLjEuMikuCi1DSEtKMjg0MC5lamIyMD1DSEtKMjg0MFc6IFRoZSA8ZW52LWVudHJ5LXR5cGU+IGVsZW1lbnQsIG9mIHRoZSA8ZW52LWVudHJ5PiBlbGVtZW50LCBpcyBpbnZhbGlkLiAoRUpCIDIuMDogMjAuMi4xLjIpLgotQ0hLSjI4NDEuZWpiMjA9Q0hLSjI4NDFXOiBUaGUgezB9IG5hbWUsIGluIHRoZSA8ZW52LWVudHJ5LW5hbWU+IGVsZW1lbnQsIGNhbiBiZSB1c2VkIG9ubHkgb25jZSBpbiB0aGUgYmVhbi4gKEVKQiAyLjA6IDIwLjIuMS4yKS4KLUNIS0oyODMwLmVqYjIwPUNIS0oyODMwVzogVGhlIHR5cGUgb2YgdGhlIHswfSBmaWVsZCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MzEuZWpiMjA9Q0hLSjI4MzFXOiB7MH0gbXVzdCBiZSBkZWNsYXJlZCBpbiBhIDxjbXAtZmllbGQ+IGVsZW1lbnQuIChFSkIgMi4wOiAxMC44LjIpLgotQ0hLSjI4MDEuZWpiMjA9Q0hLSjI4MDFFOiBUaGUgdmFsdWUgb2YgdGhlIDxlamItbmFtZT4gZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC4gKEVKQiAyLjAgMjIuMiwgMjIuNSkuCi1DSEtKMjgwOS5lamIyMD1DSEtKMjgwOUU6IFRoZSB2YWx1ZSBvZiB0aGUgPHBlcnNpc3RlbmNlLXR5cGU+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIkNvbnRhaW5lciIgb3IgIkJlYW4iLiAgKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MDYuZWpiMjA9Q0hLSjI4MDZFOiBUaGUgdmFsdWUgb2YgdGhlIDxyZWVudHJhbnQ+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIlRydWUiIG9yICJGYWxzZSIuIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODA3LmVqYjIwPUNIS0oyODA3RTogVGhlIHZhbHVlIG9mIHRoZSA8c2Vzc2lvbi10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJTdGF0ZWZ1bCIgb3IgIlN0YXRlbGVzcyIuIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODA4LmVqYjIwPUNIS0oyODA4RTogVGhlIHZhbHVlIG9mIHRoZSA8dHJhbnNhY3Rpb24tdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiQ29udGFpbmVyIiBvciAiQmVhbiIuIChFSkIgMi4wOiAxNy4zLjYsIDIyLjIsIDIyLjUpLgotQ0hLSjI4MTQuZWpiMjA9Q0hLSjI4MTRXOiA8ZWpiLW5hbWU+LCBpbiA8bWV0aG9kPiwgc2hvdWxkIHNwZWNpZnkgYSBrbm93biBlbnRlcnByaXNlIGJlYW4uIChFSkIgMi4wOiAxNy40LjEsIDIxLjMuMiwgMjIuNSkuCi1DSEtKMjg0Mi5lamIyMD1DSEtKMjg0Mlc6IDxtZXRob2QtcGFyYW1zPiBpcyBpZ25vcmVkIHdoZW4gPG1ldGhvZC1uYW1lPiBpcyAiKiIuIChFSkIgMi4wOiAxNy40LjEsIDIxLjMuMikuCi1DSEtKMjg0My5lamIyMD1DSEtKMjg0M1c6IE5vIG1ldGhvZHMsIG9uIHswfSwgbWF0Y2ggdGhpcyA8bWV0aG9kPi4gKEVKQiAyLjA6IDE3LjQuMSwgMjEuMy4yKS4KLUNIS0oyODQ0LmVqYjIwPUNIS0oyODQ0VzogQXQgbGVhc3Qgb25lIDxtZXRob2Q+IHNob3VsZCBiZSBzZXQgaW4gYSA8bWV0aG9kLXBlcm1pc3Npb24+LiAoRUpCIDIuMDogMTcuNC4xLCAyMS4zLjIpLgotQ0hLSjI4NDUuZWpiMjA9Q0hLSjI4NDVXOiBBIDxyb2xlLW5hbWU+IG9yIGFuIDx1bmNoZWNrZWQ+IGVsZW1lbnQgc2hvdWxkIGJlIHNldCBpbiBhIDxtZXRob2QtcGVybWlzc2lvbj4uIChFSkIgMi4wOiAxNy40LjEsIDIxLjMuMikuCi1DSEtKMjg0Ni5lamIyMD1DSEtKMjg0Nlc6IE5vIG1ldGhvZHMgY2FuIGJlIGZvdW5kIGZvciB0aGlzIDxtZXRob2QtcGVybWlzc2lvbj4uIChFSkIgMi4wOiAyMS4zLjIpLgotQ0hLSjI4NDcuZWpiMjA9Q0hLSjI4NDdXOiBObyBtZXRob2RzIGNhbiBiZSBmb3VuZCBmb3IgdGhpcyA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPi4gKEVKQiAyLjA6IDE3LjQuMSkuCi1DSEtKMjgxMi5lamIyMD1DSEtKMjgxMkU6IEJlYW4gY2xhc3MgezB9IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgb2YgaXRzIGZpZWxkcyBhcyBhIDxjbXAtZmllbGQ+LiAoRUpCIDIuMDogMjIuNSkuCi1DSEtKMjgzMi5lamIyMD1DSEtKMjgzMkk6IEhvbWUgezB9LCBzcGVjaWZpZWQgaW4gdGhlIDxlamItcmVmPiBlbGVtZW50LCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIEVKQiBtb2R1bGUuIChFSkIgMi4wOiAyMC4zLjEuMikuCi1DSEtKMjgzMy5lamIyMD1DSEtKMjgzM0k6IFJlbW90ZSB7MH0sIHNwZWNpZmllZCBpbiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQsIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gKEVKQiAyLjA6IDIwLjMuMS4yKS4KLUNIS0oyODM0LmVqYjIwPUNIS0oyODM0STogQmVhbiB7MH0sIHNwZWNpZmllZCBpbiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQsIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gKEVKQiAyLjA6IDIwLjMuMikuCi1DSEtKMjgzNS5lamIyMD1DSEtKMjgzNUk6IEJlYW4gezB9IGlzIGEgezF9IHR5cGUuIFVwZGF0ZSB0aGUgPGVqYi1yZWYtdHlwZT4gZWxlbWVudCBvZiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQuIChFSkIgMi4wOiAyMC4zLjIpLgotQ0hLSjI4MzYuZWpiMjA9Q0hLSjI4MzZJOiBCZWFuIHswfSB1c2VzIGhvbWUgezF9LiBVcGRhdGUgdGhlIDxlamItcmVmPiBlbGVtZW50IG9mIHRoZSA8ZWpiLXJlZj4gZWxlbWVudC4gKEVKQiAyLjA6IDIwLjMuMikuCi1DSEtKMjgzNy5lamIyMD1DSEtKMjgzN0k6IEJlYW4gezB9IHVzZXMgcmVtb3RlIHsxfS4gVXBkYXRlIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCBvZiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQuIChFSkIgMi4wOiAyMC4zLjIpLgotQ0hLSjI4MzguZWpiMjA9Q0hLSjI4MzhJOiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCByZWZlcmVuY2VzIHRvIGVudGVycHJpc2UgYmVhbnMgYmUgb3JnYW5pemVkIGluIHRoZSAiZWpiIiBzdWJjb250ZXh0LiAoRUpCIDIuMDogMjAuMy4xLjEpLgotQ0hLSjI4MjAuZWpiMjA9Q0hLSjI4MjBXOiBUaGUgc2VjdXJpdHkgcm9sZSByZWYgaXMgZGVmaW5lZCBtb3JlIHRoYW4gb25jZS4KLUNIS0oyODIyLmVqYjIwPUNIS0oyODIyVzogPHNlY3VyaXR5LXJvbGUtcmVmPiBlbGVtZW50IGZvciBiZWFuIHswfSBzaG91bGQgZGVmaW5lIHRoZSA8cm9sZS1uYW1lPiBlbGVtZW50LiAoRUpCIDIuMDogMjEuMi41LjMpLgotQ0hLSjI4MjMuZWpiMjA9Q0hLSjI4MjNXOiA8c2VjdXJpdHktcm9sZS1yZWY+IGVsZW1lbnQgc2hvdWxkIGRlZmluZSB0aGUgPHJvbGUtbGluaz4gZWxlbWVudC4gKEVKQiAyLjA6IDIxLjMuMykuCi1DSEtKMjgyNC5lamIyMD1DSEtKMjgyNFc6IDxzZWN1cml0eS1yb2xlLXJlZj4gZWxlbWVudCByZWZlcnMgdG8gdW5rbm93biByb2xlIHswfS4gKEVKQiAyLjA6IDIxLjMuMykuCi1DSEtKMjgyNS5lamIyMD1DSEtKMjgyNVc6IDxzZWN1cml0eS1yb2xlPiBlbGVtZW50IGluIGVqYi1qYXIueG1sIHNob3VsZCBkZWZpbmUgdGhlIDxyb2xlLW5hbWU+IGVsZW1lbnQuIChFSkIgMi4wOiAyMS4zLjEpLgotQ0hLSjI4MjYuZWpiMjA9Q0hLSjI4MjZXOiBUaGUgc2VjdXJpdHktcm9sZSBuYW1lIG11c3QgYmUgdW5pcXVlLiAoRUpCIDIuMDogMjEuMy4xKS4KLUNIS0oyODI3LmVqYjIwPUNIS0oyODI3VzogQ2Fubm90IHVzZSBhIDxyb2xlLWxpbms+IGVsZW1lbnQgd2l0aG91dCA8c2VjdXJpdHktcm9sZT4gZWxlbWVudHMuIChFSkIgMi4wOiAyMS4yLjUuMywgMjEuMy4xLCAyMS4zLjMpLgotQ0hLSjI4NTAuZWpiMjA9Q0hLSjI4NTBXOiBDYW5ub3QgdmFsaWRhdGUgPG1ldGhvZD4gYmVjYXVzZSB0aGUgezB9IHR5cGUgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODUxLmVqYjIwPUNIS0oyODUxVzogQ2Fubm90IHZhbGlkYXRlIHswfSBiZWNhdXNlIHR5cGUgezF9IGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjg3NS5lamIyMD1DSEtKMjg3NUU6IDxlamItY2xpZW50LWphcj4gezB9IG11c3QgZXhpc3QgaW4gZXZlcnkgRUFSIGZpbGUgdGhhdCBjb250YWlucyB0aGlzIEVKQiBtb2R1bGUgKEVKQiAyLjA6IDIyLjUsIDIzLjQsIDIzLjYpLgotCi1DSEtKMjAwM0UuZWpiMjA9Q0hLSjIwMDNFOiBUaGlzIGNsYXNzIG11c3Qgbm90IGltcGxlbWVudCBqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbiAoRUpCIDIuMDogNy41LjMsIDcuMTAuMiwgMTcuMy40LjEpLgotQ0hLSjIwMDNJLmVqYjIwPUNIS0oyMDAzSTogQmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHN0YXRlZnVsIHNlc3Npb24gYmVhbnMgbmVlZCBub3QgaW1wbGVtZW50IGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uIChFSkIgMi4wOiA3LjUuMywgNy4xMC4yLCAxNy4zLjQuMSkuCi1DSEtKMjgwMi5uYW1lZC5lamIyMD1DSEtKMjgwMkU6IDxlamItY2xhc3M+IGNsYXNzIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDIudW5uYW1lZC5lamIyMD1DSEtKMjgwMkU6IFRoZSBiZWFuIGNsYXNzLCBpZGVudGlmaWVkIGJ5IHRoZSA8ZWpiLWNsYXNzPiBlbGVtZW50LCBjYW5ub3QgYmUgZm91bmQuIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODAzLm5hbWVkLmVqYjIwPUNIS0oyODAzRTogPGhvbWU+IGludGVyZmFjZSB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODAzLnVubmFtZWQuZWpiMjA9Q0hLSjI4MDNFOiBVbmtub3duIGludGVyZmFjZSBzcGVjaWZpZWQgaW4gdGhlIDxob21lPiBlbGVtZW50LiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi1DSEtKMjgwNC5uYW1lZC5lamIyMD1DSEtKMjgwNEU6IDxyZW1vdGU+IGludGVyZmFjZSB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODA0LnVubmFtZWQuZWpiMjA9Q0hLSjI4MDRFOiBVbmtub3duIGludGVyZmFjZSBzcGVjaWZpZWQgaW4gdGhlIDxyZW1vdGU+IGVsZW1lbnQuIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODA1Lm5hbWVkLmVqYjIwPUNIS0oyODA1RTogPGxvY2FsLWhvbWU+IGludGVyZmFjZSB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODA1LnVubmFtZWQuZWpiMjA9Q0hLSjI4MDVFOiBVbmtub3duIGludGVyZmFjZSBzcGVjaWZpZWQgaW4gdGhlIDxsb2NhbC1ob21lPiBlbGVtZW50LiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi1DSEtKMjgwMC5uYW1lZC5lamIyMD1DSEtKMjgwMEU6IDxsb2NhbD4gaW50ZXJmYWNlIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MDAudW5uYW1lZC5lamIyMD1DSEtKMjgwMEU6IFVua25vd24gaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGUgPGxvY2FsPiBlbGVtZW50LiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi1DSEtKMjgxMC5uYW1lZC5lamIyMD1DSEtKMjgxMEU6IDxwcmltLWtleS1jbGFzcz4gY2xhc3MgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgxMC51bm5hbWVkLmVqYjIwPUNIS0oyODEwRTogVW5rbm93biBjbGFzcyBzcGVjaWZpZWQgaW4gdGhlIDxwcmltLWtleS1jbGFzcz4gZWxlbWVudC4gIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODExLmVqYjIwPUNIS0oyODExRTogPGZpZWxkLW5hbWU+IHswfSBjYW5ub3QgYmUgbG9jYXRlZCBvbiBiZWFuIGNsYXNzIHsxfS4gKEVKQiAyLjA6IDIyLjUpLgotCi1DSEtKMjEwMy5lamIyMD1DSEtKMjEwM0U6IEluIGNvbXBvbmVudCBpbmhlcml0YW5jZSwgdGhlIHswfSBiZWFuIGNsYXNzIG11c3QgaW5oZXJpdCB7MX0gKEVKQiAyLjA6IEQuMikKLUNIS0oyMTA0LmVqYjIwPUNIS0oyMTA0RTogSW4gY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgezB9IGhvbWUgaW50ZXJmYWNlIG11c3Qgbm90IGluaGVyaXQgezF9LiAoRUpCIDIuMDogRC4yKS4KLUNIS0oyMTA1LmVqYjIwPUNIS0oyMTA1RTogSW4gY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgezB9IGNvbXBvbmVudCBpbnRlcmZhY2UgbXVzdCBpbmhlcml0IHsxfS4gKEVKQiAyLjA6IEQuMikuCi1DSEtKMjEwNi5lamIyMD1DSEtKMjEwNkU6ICBCZWFuIHswfSBtdXN0IHVzZSB7MX0gYXMgaXRzIDxwcmltLWtleS1jbGFzcz4gKEVKQiAyLjA6IEQuMikuCi1DSEtKMjg0OS5lamIyMD1DSEtKMjg0OVc6IENhbm5vdCB2YWxpZGF0ZSBjb21wb25lbnQgaW5oZXJpdGFuY2Ugb2YgezB9IGJlY2F1c2UgdGhlIHsxfSB0eXBlLCBvciBvbmUgb2YgaXRzIGRlcGVuZGVuY2llcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLQotQ0hLSjI4OTUuZWpiMjA9Q0hLSjI4OTVXOiA8ZWpiLW5hbWU+IHswfSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUgKEVKQiAyLjA6IDIyLjUpLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBjbGFzcy9pbnRlcmZhY2UgY2hlY2tzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBpbXBsZW1lbnQgU2Vzc2lvbkJlYW4vRW50aXR5QmVhbi9NZXNzYWdlRHJpdmVuQmVhbi9NZXNzYWdlTGlzdGVuZXIKLUNIS0oyMDE3LnNiLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB7MH0gKEVKQiAyLjA6IDcuNS4xLCA3LjEwLjIpLgotQ0hLSjIwMTcubWIuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHswfSAoRUpCIDIuMDogMTUuNC4xLCAxNS43LjIpLgotQ0hLSjIwMTcuY2IuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHswfSAoRUpCIDIuMDogMTAuNi4yKS4KLUNIS0oyMDE3LmJiLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB7MH0gKEVKQiAyLjA6IDEyLjIuMikuCi0KLSMgaW1wbGVtZW50IEVKQkhvbWUKLUNIS0oyMDE3LnNyaC5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJIb21lIChFSkIgMi4wOiA2LjMsIDcuMTAuNikuCi1DSEtKMjAxNy5jcmguZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCSG9tZSAoRUpCIDIuMDogOS41LCAxMC42LjEwKS4KLUNIS0oyMDE3LmJyaC5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJIb21lIChFSkIgMi4wOiA5LjUsIDEyLjIuOSkuCi0KLSMgaW1wbGVtZW50IEVKQkxvY2FsSG9tZQotQ0hLSjIwMTcuc2xoLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkxvY2FsSG9tZSAoRUpCIDIuMDogNi40LCA3LjEwLjgpLgotQ0hLSjIwMTcuY2xoLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkxvY2FsSG9tZSAoRUpCIDIuMDogOS42LCAxMC42LjEyKS4KLUNIS0oyMDE3LmJsaC5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJMb2NhbEhvbWUgKEVKQiAyLjA6IDkuNiwgMTIuMi4xMSkuCi0KLSMgaW1wbGVtZW50IEVKQk9iamVjdAotQ0hLSjIwMTcuc3JjLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQk9iamVjdCAoRUpCIDIuMDogNi41LCA3LjEwLjUpLgotQ0hLSjIwMTcuY3JjLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQk9iamVjdCAoRUpCIDIuMDogOS45LCAxMC42LjkpLgotQ0hLSjIwMTcuYnJjLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQk9iamVjdCAoRUpCIDIuMDogOS45LCAxMi4yLjgpLgotCi0jIGltcGxlbWVudCBFSkJMb2NhbE9iamVjdAotQ0hLSjIwMTcuc2xjLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkxvY2FsT2JqZWN0IChFSkIgMi4wOiA3LjEwLjcpLgotQ0hLSjIwMTcuY2xjLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkxvY2FsT2JqZWN0IChFSkIgMi4wOiA5LjEwLCAxMC42LjEwKS4KLUNIS0oyMDE3LmJsYy5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJMb2NhbE9iamVjdCAoRUpCIDIuMDogOS4xMCwgMTIuMi4xMCkuCi0KLSMgaW1wbCBjb21wb25lbnQgaW50ZXJmYWNlCi1DSEtKMjA0MC5jYi5lamIyMD1DSEtKMjA0MEk6ICJ0aGlzIiBtdXN0IG5vdCBiZSBwYXNzZWQgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0IChFSkIgMi4wOiAxMC42LjIpLgotQ0hLSjIwNDAuYmIuZWpiMjA9Q0hLSjIwNDBJOiAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdCAoRUpCIDIuMDogMTIuMi4yKS4KLUNIS0oyMDQwLnNiLmVqYjIwPUNIS0oyMDQwSTogInRoaXMiIG11c3Qgbm90IGJlIHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudCBvciByZXN1bHQgKEVKQiAyLjA6IDcuMTAuMikuCi0KLSMgYmVhbiBjbGFzcwotQ0hLSjIwMTQuY2IuZWpiMjA9Q0hLSjIwMTRXOiBUaGlzIGNsYXNzIG11c3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDEwLjMuMSwgMTAuNC4xLCAxMC42LjIpLgotQ0hLSjIwMTQubWIuZWpiMjA9Q0hLSjIwMTRXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGFic3RyYWN0IChFSkIgMi4wOiAxNS43LjIpLgotQ0hLSjIwMTQuYmIuZWpiMjA9Q0hLSjIwMTRXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGFic3RyYWN0IChFSkIgMi4wOiAxMi4yLjIpLgotQ0hLSjIwMTQuc2IuZWpiMjA9Q0hLSjIwMTRXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGFic3RyYWN0IChFSkIgMi4wOiA3LjEwLjEpLgotCi1DSEtKMjAyMi5jYi5lamIyMD1DSEtKMjAyMlc6IFRoaXMgY2xhc3MgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuMikuCi1DSEtKMjAyMi5tYi5lamIyMD1DSEtKMjAyMlc6IFRoaXMgY2xhc3MgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDE1LjcuMikuCi1DSEtKMjAyMi5iYi5lamIyMD1DSEtKMjAyMlc6IFRoaXMgY2xhc3MgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuMikuCi1DSEtKMjAyMi5zYi5lamIyMD1DSEtKMjAyMlc6IFRoaXMgY2xhc3MgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDcuMTAuMSkuCi1DSEtKMjAyMi5rYy5lamIyMD1DSEtKMjAyMlc6IFRoaXMgY2xhc3MgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjguMikuCi0KLUNIS0oyMDE1LmNiLmVqYjIwPUNIS0oyMDE1VzogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTAuNi4yKS4KLUNIS0oyMDE1Lm1iLmVqYjIwPUNIS0oyMDE1VzogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTUuNy4yKS4KLUNIS0oyMDE1LmJiLmVqYjIwPUNIS0oyMDE1VzogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMi4yKS4KLUNIS0oyMDE1LnNiLmVqYjIwPUNIS0oyMDE1VzogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogNy4xMC4xKS4KLQotIyBkZXBlbmRlbnQgdmFsdWUgY2xhc3MKLUNIS0oyMDE4LmVqYjIwPUNIS0oyMDE4VzogVGhpcyBjbGFzcyBtdXN0IGJlIHNlcmlhbGl6YWJsZSAoRUpCIDIuMDogMTAuMy4zLCAxMC42LjMpLgotQ0hLSjIwNDMuZWpiMjA9Q0hLSjIwNDNXOiBUaGlzIGNsYXNzIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjMpLgotQ0hLSjIwNDQuZWpiMjA9Q0hLSjIwNDRXOiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGFic3RyYWN0IChFSkIgMi4wOiAxMC42LjMpLgotCi0jIGtleSBjbGFzcwotQ0hLSjIwMTkua2MuZWpiMjA9Q0hLSjIwMTlXOiBUaGlzIGNsYXNzIG11c3QgYmUgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QIChFSkIgMi4wOiA5LjgsIDEwLjYuMTMpLgotQ0hLSjIwMTkua2IuZWpiMjA9Q0hLSjIwMTlXOiBUaGlzIGNsYXNzIG11c3QgYmUgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QIChFSkIgMi4wOiA5LjgsIDEyLjIuMTIpLgotCi0KLSMjIwotIyBtZXRob2RzIHdoaWNoIG11c3QgZXhpc3QKLSMjIwotIyBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcnMKLUNIS0oyMDUwLmNvbnN0ci5zYi5lamIyMD1DSEtKMjA1MFc6IHB1YmxpYyB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogNy4xMC4yKS4KLUNIS0oyMDUwLmNvbnN0ci5jYi5lamIyMD1DSEtKMjA1MFc6IHB1YmxpYyB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjIpLgotQ0hLSjIwNTAuY29uc3RyLmJiLmVqYjIwPUNIS0oyMDUwVzogcHVibGljIHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSwgMTIuMi4yKS4KLUNIS0oyMDUwLmNvbnN0ci5tYi5lamIyMD1DSEtKMjA1MFc6IHB1YmxpYyB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMTUuNy4yKS4KLUNIS0oyMDUwLmNvbnN0ci5rYy5lamIyMD1DSEtKMjA1MFc6IHB1YmxpYyB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuOC4yKS4KLQotCi0jIGFjY2Vzc29yIG1ldGhvZAotQ0hLSjIwNTAuYWNjLmNiLmVqYjIwPUNIS0oyMDUwRTogVGhpcyBjbGFzcyBtdXN0IGRlZmluZSB7MH0gKEVKQiAyLjA6IDEwLjMuMSkuCi0KLUNIS0oyMDUwLm9uTWVzc2FnZS5tYi5lamIyMD1DSEtKMjA1MFc6IG9uTWVzc2FnZShqYXZheC5qbXMuTWVzc2FnZSkgbXVzdCBleGlzdCAoRUpCIDIuMDogMTUuNC4yLCAxNS43LjQpLgotCi1DSEtKMjA1MC5lamJDcmVhdGUuc2ZiLmVqYjIwPUNIS0oyMDUwVzogQXQgbGVhc3Qgb25lIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogNy41LjUpLgotQ0hLSjIwNTAuZWpiQ3JlYXRlLnNzYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJDcmVhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogNy44KS4KLUNIS0oyMDUwLmVqYkNyZWF0ZS5tYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJDcmVhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTUuNC40LCAxNS43LjIpLgotCi1DSEtKMjA1MC5lamJGaW5kQnlQcmltYXJ5S2V5LmJiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjIuNSkuCi0KLUNIS0oyMDUwLnNldEVudGl0eUNvbnRleHQuY2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgc2V0RW50aXR5Q29udGV4dChFbnRpdHlDb250ZXh0KSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyMDUwLnNldEVudGl0eUNvbnRleHQuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgc2V0RW50aXR5Q29udGV4dChFbnRpdHlDb250ZXh0KSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjA1MC51bnNldEVudGl0eUNvbnRleHQuY2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgdW5zZXRFbnRpdHlDb250ZXh0KCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjA1MC51bnNldEVudGl0eUNvbnRleHQuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgdW5zZXRFbnRpdHlDb250ZXh0KCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLQotQ0hLSjIwNTAuZWpiQWN0aXZhdGUuY2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiQWN0aXZhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyMDUwLmVqYkFjdGl2YXRlLmJiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYkFjdGl2YXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLQotQ0hLSjIwNTAuZWpiUGFzc2l2YXRlLmNiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYlBhc3NpdmF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjIwNTAuZWpiUGFzc2l2YXRlLmJiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYlBhc3NpdmF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjA1MC5lamJQYXNzaXZhdGUuc2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiUGFzc2l2YXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDcuNS4xKS4KLQotQ0hLSjIwNTAuZWpiUmVtb3ZlLmNiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYlJlbW92ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjIwNTAuZWpiUmVtb3ZlLmJiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYlJlbW92ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjA1MC5lamJSZW1vdmUubWIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiUmVtb3ZlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjA1MC5lamJSZW1vdmUuc2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiUmVtb3ZlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDQuMi4yLCA3LjUuMSkuCi0KLUNIS0oyMDUwLmVqYkxvYWQuY2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiTG9hZCgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjIwNTAuZWpiTG9hZC5iYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJMb2FkKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLQotQ0hLSjIwNTAuZWpiU3RvcmUuY2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiU3RvcmUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyMDUwLmVqYlN0b3JlLmJiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYlN0b3JlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLQotQ0hLSjIwNTAuY3JlYXRlLnNzcmguZWpiMjA9Q0hLSjIwNTBXOiBUaGUgY3JlYXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDcuOCwgNy4xMC42KS4KLUNIS0oyMDUwLmNyZWF0ZS5zc2xoLmVqYjIwPUNIS0oyMDUwVzogVGhlIGNyZWF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA3LjgsIDcuMTAuOCkuCi0KLUNIS0oyMDUwLmNyZWF0ZS5zcmguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGludGVyZmFjZSBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgY3JlYXRlIG1ldGhvZCAoRUpCIDIuMDogNi4zLjEsIDcuMTAuNikuCi1DSEtKMjA1MC5jcmVhdGUuc2xoLmVqYjIwPUNIS0oyMDUwVzogVGhpcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGNyZWF0ZSBtZXRob2QgKEVKQiAyLjA6IDYuNC4xLCA3LjEwLjgpLgotCi1DSEtKMjA1MC5maW5kLmNyaC5lamIyMD1DSEtKMjA1MFc6IEF0IGxlYXN0IG9uZSBmaW5kZXIgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDkuNS4yKS4KLUNIS0oyMDUwLmZpbmQuYnJoLmVqYjIwPUNIS0oyMDUwVzogQXQgbGVhc3Qgb25lIGZpbmRlciBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogOS41LjIpLgotQ0hLSjIwNTAuZmluZC5jbGguZWpiMjA9Q0hLSjIwNTBXOiBBdCBsZWFzdCBvbmUgZmluZGVyIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA5LjYuMikuCi1DSEtKMjA1MC5maW5kLmJsaC5lamIyMD1DSEtKMjA1MFc6IEF0IGxlYXN0IG9uZSBmaW5kZXIgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDkuNi4yKS4KLQotQ0hLSjIwNTAuaG9tZS5jcmguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGludGVyZmFjZSBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgaG9tZSBtZXRob2QgKEVKQiAyLjA6IDkuNS40KS4KLUNIS0oyMDUwLmhvbWUuYnJoLmVqYjIwPUNIS0oyMDUwVzogVGhpcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjUuNCkuCi1DSEtKMjA1MC5ob21lLmNsaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBob21lIG1ldGhvZCAoRUpCIDIuMDogOS42LjQpLgotQ0hLSjIwNTAuaG9tZS5ibGguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGludGVyZmFjZSBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgaG9tZSBtZXRob2QgKEVKQiAyLjA6IDkuNi40KS4KLQotQ0hLSjIwNTAuZWpiSG9tZS5jcmguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGNsYXNzIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBlamJIb21lIG1ldGhvZCAoRUpCIDIuMDogOS41LjQpLgotQ0hLSjIwNTAuZWpiSG9tZS5icmguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGNsYXNzIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBlamJIb21lIG1ldGhvZCAoRUpCIDIuMDogOS41LjQpLgotQ0hLSjIwNTAuZWpiSG9tZS5jbGguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGNsYXNzIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBlamJIb21lIG1ldGhvZCAoRUpCIDIuMDogOS42LjQpLgotQ0hLSjIwNTAuZWpiSG9tZS5ibGguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGNsYXNzIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBlamJIb21lIG1ldGhvZCAoRUpCIDIuMDogOS42LjQpLgotCi1DSEtKMjA1MC5oYXNoQ29kZS5rYi5lamIyMD1DSEtKMjA1MFc6IGhhc2hDb2RlKCkgbXVzdCBleGlzdCBvbiB0aGlzIGNsYXNzIChFSkIgMi4wOiAxMi4yLjEyKS4KLUNIS0oyMDUwLmhhc2hDb2RlLmtjLmVqYjIwPUNIS0oyMDUwVzogaGFzaENvZGUoKSBtdXN0IGV4aXN0IG9uIHRoaXMgY2xhc3MgKEVKQiAyLjA6IDEwLjYuMTMpLgotCi1DSEtKMjA1MC5lcXVhbHMua2IuZWpiMjA9Q0hLSjIwNTBXOiBlcXVhbHMoT2JqZWN0KSBtdXN0IGV4aXN0IG9uIHRoaXMgY2xhc3MgKEVKQiAyLjA6IDEyLjIuMTIpLgotQ0hLSjIwNTAuZXF1YWxzLmtjLmVqYjIwPUNIS0oyMDUwVzogZXF1YWxzKE9iamVjdCkgbXVzdCBleGlzdCBvbiB0aGlzIGNsYXNzIChFSkIgMi4wOiAxMC42LjEzKS4KLQotIyBlamJTZWxlY3QgLSBuZWVkZWQ/IHBsMTc0IHNheXMgemVybyBvciBtb3JlLCBwLjE5MyBzYXlzIG9uZSBvciBtb3JlCi1DSEtKMjA1MC5lamJTZWxlY3QuY2IuZWpiMjA9Q0hLSjIwNTBXOiBBbiBlamJTZWxlY3QgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi43KS4KLQotQ0hLSjIwNTAuZmluZEJ5UHJpbWFyeUtleS5jcmguZWpiMjA9Q0hLSjIwNTBXOiBmaW5kQnlQcmltYXJ5S2V5IG11c3QgZXhpc3QgKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyMDUwLmZpbmRCeVByaW1hcnlLZXkuY2xoLmVqYjIwPUNIS0oyMDUwVzogZmluZEJ5UHJpbWFyeUtleSBtdXN0IGV4aXN0IChFSkIgMi4wOiA5LjYuMiwgMTAuNi4xMikuCi1DSEtKMjA1MC5maW5kQnlQcmltYXJ5S2V5LmJsaC5lamIyMD1DSEtKMjA1MFc6IGZpbmRCeVByaW1hcnlLZXkgbXVzdCBleGlzdCAoRUpCIDIuMDogOS42LjIsIDEyLjIuMTEpLgotQ0hLSjIwNTAuZmluZEJ5UHJpbWFyeUtleS5icmguZWpiMjA9Q0hLSjIwNTBXOiBmaW5kQnlQcmltYXJ5S2V5IG11c3QgZXhpc3QgKEVKQiAyLjA6IDkuNS4yLCAxMi4yLjkpLgotCi0jIGVqYkZpbmQKLUNIS0oyMDUwLmVqYkZpbmQuYmIuZWpiMjA9Q0hLSjIwNTBXOiB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotCi1DSEtKMjA1MC5lamJQb3N0Q3JlYXRlLmNiLmVqYjIwPUNIS0oyMDUwRTogezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjA1MC5lamJQb3N0Q3JlYXRlLmJiLmVqYjIwPUNIS0oyMDUwRTogezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xLCAxMi4yLjQpLgotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIG1ldGhvZCBjaGVja3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbgotQ0hLSjI0MDQuaS5lamIyMD1DSEtKMjQwNFc6IEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB7MX0gb24gezB9IG11c3QgZXh0ZW5kIGphdmEubGFuZy5FeGNlcHRpb24gKEVKQiAyLjA6IDE4LjEuMSwgMTguMi4xKS4KLUNIS0oyNDA0Lm0uZWpiMjA9Q0hLSjI0MDRXOiBBcHBsaWNhdGlvbiBleGNlcHRpb24gezB9IG11c3QgZXh0ZW5kIGphdmEubGFuZy5FeGNlcHRpb24gKEVKQiAyLjA6IDE4LjEuMSwgMTguMi4xKS4KLUNIS0oyNDE2LmkuZWpiMjA9Q0hLSjI0MTZXOiBBcHBsaWNhdGlvbiBleGNlcHRpb24gezF9IG9uIHswfSBtdXN0IG5vdCBleHRlbmQgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gKEVKQiAyLjA6IDE4LjEuMSwgMTguMi4xKS4KLUNIS0oyNDE2Lm0uZWpiMjA9Q0hLSjI0MTZXOiBBcHBsaWNhdGlvbiBleGNlcHRpb24gezB9IG11c3Qgbm90IGV4dGVuZCBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTguMS4xLCAxOC4yLjEpLgotCi0jIGVqYlJlbW92ZQotQ0hLSjI0OTIubWIuaS5lamIyMD1DSEtKMjQ5Mlc6IHswfSBvbiB7MX0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjQ5Mi5tYi5tLmVqYjIwPUNIS0oyNDkyVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjQ5Mi5jYi5pLmVqYjIwPUNIS0oyNDkyVzogezB9IG9uIHsxfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyNDkyLmNiLm0uZWpiMjA9Q0hLSjI0OTJXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyNDkyLmJiLmkuZWpiMjA9Q0hLSjI0OTJXOiB7MH0gb24gezF9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjQ5Mi5iYi5tLmVqYjIwPUNIS0oyNDkyVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNDkyLnNiLmkuZWpiMjA9Q0hLSjI0OTJXOiB7MH0gb24gezF9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiA3LjYpLgotQ0hLSjI0OTIuc2IubS5lamIyMD1DSEtKMjQ5Mlc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiA3LjYpLgotCi1DSEtKMjQ5My5tYi5pLmVqYjIwPUNIS0oyNDkzVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxNS43LjUpLgotQ0hLSjI0OTMubWIubS5lamIyMD1DSEtKMjQ5M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxNS43LjUpLgotQ0hLSjI0OTMuY2IuaS5lamIyMD1DSEtKMjQ5M1c6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyNDkzLmNiLm0uZWpiMjA9Q0hLSjI0OTNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyNDkzLmJiLmkuZWpiMjA9Q0hLSjI0OTNXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNDkzLmJiLm0uZWpiMjA9Q0hLSjI0OTNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI0OTMuc2IuaS5lamIyMD1DSEtKMjQ5M1c6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogNy42KS4KLUNIS0oyNDkzLnNiLm0uZWpiMjA9Q0hLSjI0OTNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogNy42KS4KLQotQ0hLSjI0OTQubWIuaS5lamIyMD1DSEtKMjQ5NFc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjQ5NC5tYi5tLmVqYjIwPUNIS0oyNDk0VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxNS43LjUpLgotQ0hLSjI0OTQuY2IuaS5lamIyMD1DSEtKMjQ5NFc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjQ5NC5jYi5tLmVqYjIwPUNIS0oyNDk0VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI0OTQuYmIuaS5lamIyMD1DSEtKMjQ5NFc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNDk0LmJiLm0uZWpiMjA9Q0hLSjI0OTRXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNDk0LnNiLmkuZWpiMjA9Q0hLSjI0OTRXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiA3LjYpLgotQ0hLSjI0OTQuc2IubS5lamIyMD1DSEtKMjQ5NFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogNy42KS4KLQotQ0hLSjI1MDUuZWpiUmVtb3ZlLm1iLmkuZWpiMjA9Q0hLSjI1MDVXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyNTA1LmVqYlJlbW92ZS5tYi5tLmVqYjIwPUNIS0oyNTA1VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyNTA1LmVqYlJlbW92ZS5jYi5pLmVqYjIwPUNIS0oyNTA1VzogezB9IG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjUwNS5lamJSZW1vdmUuY2IubS5lamIyMD1DSEtKMjUwNVc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjUwNS5lamJSZW1vdmUuYmIuaS5lamIyMD1DSEtKMjUwNVc6IHswfSBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjUwNS5lamJSZW1vdmUuYmIubS5lamIyMD1DSEtKMjUwNVc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNTA1LmVqYlJlbW92ZS5zYi5pLmVqYjIwPUNIS0oyNTA1VzogezB9IG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDcuNikuCi1DSEtKMjUwNS5lamJSZW1vdmUuc2IubS5lamIyMD1DSEtKMjUwNVc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDcuNikuCi0KLSMgZWpiQ3JlYXRlCi1DSEtKMjQyMS5tYi5pLmVqYjIwPUNIS0oyNDIxVzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxNS43LjMpLgotQ0hLSjI0MjEuY2IuaS5lamIyMD1DSEtKMjQyMVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNDIxLmJiLmkuZWpiMjA9Q0hLSjI0MjFXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjQyMS5zYi5pLmVqYjIwPUNIS0oyNDIxVzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiA3LjEwLjMpLgotQ0hLSjI0MjEubWIubS5lamIyMD1DSEtKMjQyMVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxNS43LjMpLgotQ0hLSjI0MjEuY2IubS5lamIyMD1DSEtKMjQyMVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0MjEuYmIubS5lamIyMD1DSEtKMjQyMVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4yLjMpLgotQ0hLSjI0MjEuc2IubS5lamIyMD1DSEtKMjQyMVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiA3LjEwLjMpLgotCi1DSEtKMjQyMi5zYi5pLmVqYjIwPUNIS0oyNDIyVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiA3LjEwLjMpLgotQ0hLSjI0MjIuY2IuaS5lamIyMD1DSEtKMjQyMlc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNDIyLmJiLmkuZWpiMjA9Q0hLSjI0MjJXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjQyMi5tYi5pLmVqYjIwPUNIS0oyNDIyVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxNS43LjMpLgotQ0hLSjI0MjIuc2IubS5lamIyMD1DSEtKMjQyMlc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiA3LjEwLjMpLgotQ0hLSjI0MjIuY2IubS5lamIyMD1DSEtKMjQyMlc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0MjIuYmIubS5lamIyMD1DSEtKMjQyMlc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4yLjMpLgotQ0hLSjI0MjIubWIubS5lamIyMD1DSEtKMjQyMlc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxNS43LjMpLgotCi1DSEtKMjQyMy5zYi5pLmVqYjIwPUNIS0oyNDIzVzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogNy4xMC4zKS4KLUNIS0oyNDIzLmNiLmkuZWpiMjA9Q0hLSjI0MjNXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0MjMuYmIuaS5lamIyMD1DSEtKMjQyM1c6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjQyMy5tYi5pLmVqYjIwPUNIS0oyNDIzVzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTUuNy4zKS4KLUNIS0oyNDIzLnNiLm0uZWpiMjA9Q0hLSjI0MjNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjQyMy5jYi5tLmVqYjIwPUNIS0oyNDIzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0MjMuYmIubS5lamIyMD1DSEtKMjQyM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDIzLm1iLm0uZWpiMjA9Q0hLSjI0MjNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDE1LjcuMykuCi0KLUNIS0oyNDI0LmNiLmkuZWpiMjA9Q0hLSjI0MjRXOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0MjQuYmIuaS5lamIyMD1DSEtKMjQyNFc6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjQyNC5zYi5pLmVqYjIwPUNIS0oyNDI0VzogezB9IG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjQyNC5tYi5pLmVqYjIwPUNIS0oyNDI0VzogezB9IG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDE1LjcuMykuCi1DSEtKMjQyNC5jYi5tLmVqYjIwPUNIS0oyNDI0VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI0MjQuYmIubS5lamIyMD1DSEtKMjQyNFc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDI0LnNiLm0uZWpiMjA9Q0hLSjI0MjRXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiA3LjEwLjMpLgotQ0hLSjI0MjQubWIubS5lamIyMD1DSEtKMjQyNFc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDE1LjcuMykuCi0KLQotCi0jIGVqYkNyZWF0ZSdzIG1ldGhvZCBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdHlwZQotQ0hLSjI1MDAuZWpiQ3JlYXRlLnNiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjMpLgotQ0hLSjI1MDAuZWpiQ3JlYXRlLmNiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI1MDAuZWpiQ3JlYXRlLmJiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjMpLgotQ0hLSjI1MDAuZWpiQ3JlYXRlLnNiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC4zKS4KLUNIS0oyNTAwLmVqYkNyZWF0ZS5jYi5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjUwMC5lamJDcmVhdGUuYmIubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjMpLgotCi1DSEtKMjQ5Ny5jYi5pLmVqYjIwPUNIS0oyNDk3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNDk3LmNiLm0uZWpiMjA9Q0hLSjI0OTdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNCkuCi0KLUNIS0oyNTAxLmVqYkNyZWF0ZS5tYi5pLmVqYjIwPUNIS0oyNTAxSTogezB9IG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgKEVKQiAyLjA6IDE1LjcuMywgMTguMS4xLCAxOC4yLjEsIDE4LjMuMikuCi1DSEtKMjUwMS5lamJDcmVhdGUubWIubS5lamIyMD1DSEtKMjUwMUk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgKEVKQiAyLjA6IDE1LjcuMywgMTguMS4xLCAxOC4yLjEsIDE4LjMuMikuCi1DSEtKMjUwMS5lamJSZW1vdmUubWIuaS5lamIyMD1DSEtKMjUwMUk6IHswfSBtdXN0IG5vdCB0aHJvdyBhcHBsaWNhdGlvbiBleGNlcHRpb25zIChFSkIgMi4wOiAxNS43LjUsIDE4LjEuMSwgMTguMi4xLCAxOC4zLjIpLgotQ0hLSjI1MDEuZWpiUmVtb3ZlLm1iLm0uZWpiMjA9Q0hLSjI1MDFJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBhcHBsaWNhdGlvbiBleGNlcHRpb25zIChFSkIgMi4wOiAxNS43LjUsIDE4LjEuMSwgMTguMi4xLCAxOC4zLjIpLgotQ0hLSjI1MDEub25NZXNzYWdlLm1iLmkuZWpiMjA9Q0hLSjI1MDFJOiB7MH0gbXVzdCBub3QgdGhyb3cgYXBwbGljYXRpb24gZXhjZXB0aW9ucyAoRUpCIDIuMDogMTUuNC4xMCwgMTUuNy40LCAxOC4xLjEsIDE4LjIuMSwgMTguMy4yKS4KLUNIS0oyNTAxLm9uTWVzc2FnZS5tYi5tLmVqYjIwPUNIS0oyNTAxSTogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgYXBwbGljYXRpb24gZXhjZXB0aW9ucyAoRUpCIDIuMDogMTUuNC4xMCwgMTUuNy40LCAxOC4xLjEsIDE4LjIuMSwgMTguMy4yKS4KLQotCi1DSEtKMjUwMy5lamJDcmVhdGUuc2IuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuMywgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkNyZWF0ZS5jYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi40LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiQ3JlYXRlLmJiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjMsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJDcmVhdGUuc2IubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC4zLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiQ3JlYXRlLmNiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkNyZWF0ZS5iYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjMsIDE4LjMuOCwgMTguNikuCi0KLSMgZWpiUG9zdENyZWF0ZQotQ0hLSjI0MjYuY2IuaS5lamIyMD1DSEtKMjQyNlc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi41KS4KLUNIS0oyNDI2LmJiLmkuZWpiMjA9Q0hLSjI0MjZXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuNCkuCi1DSEtKMjQyNi5jYi5tLmVqYjIwPUNIS0oyNDI2VzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuNSkuCi1DSEtKMjQyNi5iYi5tLmVqYjIwPUNIS0oyNDI2VzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuNCkuCi0KLUNIS0oyNDI3LmNiLmkuZWpiMjA9Q0hLSjI0MjdXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjYuNSkuCi1DSEtKMjQyNy5iYi5pLmVqYjIwPUNIS0oyNDI3VzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4yLjQpLgotQ0hLSjI0MjcuY2IubS5lamIyMD1DSEtKMjQyN1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC42LjUpLgotQ0hLSjI0MjcuYmIubS5lamIyMD1DSEtKMjQyN1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4yLjQpLgotCi1DSEtKMjQyOC5jYi5pLmVqYjIwPUNIS0oyNDI4VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTAuNi41KS4KLUNIS0oyNDI4LmJiLmkuZWpiMjA9Q0hLSjI0MjhXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjQpLgotQ0hLSjI0MjguY2IubS5lamIyMD1DSEtKMjQyOFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTAuNi41KS4KLUNIS0oyNDI4LmJiLm0uZWpiMjA9Q0hLSjI0MjhXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuNCkuCi0KLUNIS0oyNTA1LmVqYlBvc3RDcmVhdGUuY2IuaS5lamIyMD1DSEtKMjUwNVc6IHswfSBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxMC42LjUpLgotQ0hLSjI1MDUuZWpiUG9zdENyZWF0ZS5iYi5pLmVqYjIwPUNIS0oyNTA1VzogezB9IG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDEyLjIuNCkuCi1DSEtKMjUwNS5lamJQb3N0Q3JlYXRlLmNiLm0uZWpiMjA9Q0hLSjI1MDVXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxMC42LjUpLgotQ0hLSjI1MDUuZWpiUG9zdENyZWF0ZS5iYi5tLmVqYjIwPUNIS0oyNTA1VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTIuMi40KS4KLQotQ0hLSjI1MDMuZWpiUG9zdENyZWF0ZS5jYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi41LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiUG9zdENyZWF0ZS5iYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi40LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiUG9zdENyZWF0ZS5jYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjUsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJQb3N0Q3JlYXRlLmJiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuNCwgMTguMy44LCAxOC42KS4KLQotCi0jIGVqYkhvbWUKLUNIS0oyNDMwLmNiLmkuZWpiMjA9Q0hLSjI0MzBJOiB7MX0gbXVzdCBleGlzdCBmb3IgezB9IHRvIGJlIGNhbGxlZCAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjYpLgotQ0hLSjI0MzAuYmIuaS5lamIyMD1DSEtKMjQzMEk6IHsxfSBtdXN0IGV4aXN0IGZvciB7MH0gdG8gYmUgY2FsbGVkIChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjQzMC5jYi5tLmVqYjIwPUNIS0oyNDMwSTogezB9IG11c3QgZXhpc3QgZm9yIHRoaXMgbWV0aG9kIHRvIGJlIGNhbGxlZCAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjYpLgotQ0hLSjI0MzAuYmIubS5lamIyMD1DSEtKMjQzMEk6IHswfSBtdXN0IGV4aXN0IGZvciB0aGlzIG1ldGhvZCB0byBiZSBjYWxsZWQgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLQotQ0hLSjI0MzEuY2IuaS5lamIyMD1DSEtKMjQzMVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi42KS4KLUNIS0oyNDMxLmJiLmkuZWpiMjA9Q0hLSjI0MzFXOiB7MH0gbXVzdCBiZSBwdWJsaWMuICAoRUpCIDIuMDogMTIuMi42KS4KLUNIS0oyNDMxLmNiLm0uZWpiMjA9Q0hLSjI0MzFXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi42KS4KLUNIS0oyNDMxLmJiLm0uZWpiMjA9Q0hLSjI0MzFXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gIChFSkIgMi4wOiAxMi4yLjYpLgotCi1DSEtKMjQzOS5jYi5pLmVqYjIwPUNIS0oyNDM5VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTAuNi42KS4KLUNIS0oyNDM5LmJiLmkuZWpiMjA9Q0hLSjI0MzlXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjYpLgotQ0hLSjI0MzkuY2IubS5lamIyMD1DSEtKMjQzOVc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTAuNi42KS4KLUNIS0oyNDM5LmJiLm0uZWpiMjA9Q0hLSjI0MzlXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuNikuCi0KLUNIS0oyNTAwLmVqYkhvbWUuY2IuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEwLjYuNikuCi1DSEtKMjUwMC5lamJIb21lLmJiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjYpLgotQ0hLSjI1MDAuZWpiSG9tZS5jYi5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEwLjYuNikuCi1DSEtKMjUwMC5lamJIb21lLmJiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTIuMi42KS4KLQotQ0hLSjI1MDMuZWpiSG9tZS5jYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi42LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiSG9tZS5iYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi42LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiSG9tZS5jYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjYsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJIb21lLmJiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuNiwgMTguMy44LCAxOC42KS4KLQotIyBlamJGaW5kCi1DSEtKMjQ1Ny5iYi5pLmVqYjIwPUNIS0oyNDU3VzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4yLjUpLgotQ0hLSjI0NTcuYmIubS5lamIyMD1DSEtKMjQ1N1c6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4yLjUpLgotCi1DSEtKMjQ1OC5iYi5pLmVqYjIwPUNIS0oyNDU4VzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4yLjUpLgotQ0hLSjI0NTguYmIubS5lamIyMD1DSEtKMjQ1OFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4yLjUpLgotCi1DSEtKMjQ1OS5iYi5pLmVqYjIwPUNIS0oyNDU5VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi41KS4KLUNIS0oyNDU5LmJiLm0uZWpiMjA9Q0hLSjI0NTlXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuNSkuCi0KLUNIS0oyNTAwLmVqYkZpbmQuYmIuaS5lamIyMD1DSEtKMjUwMEk6IHswfSBvbiBtZXRob2QgezF9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuNSkuCi1DSEtKMjUwMC5lamJGaW5kLmJiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTIuMi41KS4KLQotQ0hLSjI0MDcuYmIuaS5lamIyMD1DSEtKMjQwN1c6IHswfSBtdXN0IHJldHVybiB7MX0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDEyLjIuNSkuCi1DSEtKMjQwNy5iYi5tLmVqYjIwPUNIS0oyNDA3VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiAxMi4yLjUpLgotCi1DSEtKMjUwMy5lamJGaW5kLmJiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjUsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJGaW5kLmJiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuNSwgMTguMy44LCAxOC42KS4KLQotQ0hLSjI0OTguYmIuaS5lamIyMD1DSEtKMjQ5OFc6IHswfSBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMS44LjQpLgotQ0hLSjI0OTguYmIubS5lamIyMD1DSEtKMjQ5OFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4xLjguNCkuCi0KLQotIwotIyBtZXRob2RzIHdoaWNoIG11c3Qgbm90IGV4aXN0Ci0jCi1DSEtKMjUwMi5lamJGaW5kLmNiLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QuIFRoZSBjb250YWluZXIgcHJvdmlkZXMgdGhpcyBtZXRob2QgaW1wbGVtZW50YXRpb24gKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi4yKS4KLUNIS0oyNTAyLmVqYkZpbmQuY2IubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0LiBUaGUgY29udGFpbmVyIHByb3ZpZGVzIHRoaXMgbWV0aG9kIGltcGxlbWVudGF0aW9uIChFSkIgMi4wOiAxMC41LjIsIDEwLjYuMikuCi0KLUNIS0oyNTAyLmVqYlNlbGVjdC5iYi5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0LiBPbmx5IENNUCBiZWFucyBtYXkgaGF2ZSBlamJTZWxlY3QgbWV0aG9kcyAoRUpCIDIuMDogMTIuMS41KS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5iYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QuIE9ubHkgQ01QIGJlYW5zIG1heSBoYXZlIGVqYlNlbGVjdCBtZXRob2RzICAoRUpCIDIuMDogMTIuMS41KS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5zZmIuaS5lamIyMD1DSEtKMjUwMkk6IHswfSBtdXN0IG5vdCBleGlzdC4gT25seSBDTVAgYmVhbnMgbWF5IGhhdmUgZWpiU2VsZWN0IG1ldGhvZHMgKEVKQiAyLjA6IDcuNi4xKS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5zZmIubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0LiBPbmx5IENNUCBiZWFucyBtYXkgaGF2ZSBlamJTZWxlY3QgbWV0aG9kcyAgKEVKQiAyLjA6IDcuNi4xKS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5zc2IuaS5lamIyMD1DSEtKMjUwMkk6IHswfSBtdXN0IG5vdCBleGlzdC4gT25seSBDTVAgYmVhbnMgbWF5IGhhdmUgZWpiU2VsZWN0IG1ldGhvZHMgKEVKQiAyLjA6IDcuOC4yKS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5zc2IubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0LiBPbmx5IENNUCBiZWFucyBtYXkgaGF2ZSBlamJTZWxlY3QgbWV0aG9kcyAgKEVKQiAyLjA6IDcuOC4yKS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5jcmguaS5lamIyMD1DSEtKMjUwMkk6IHswfSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNyaC5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNS43KS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5jbGguaS5lamIyMD1DSEtKMjUwMkk6IHswfSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNsaC5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNS43KS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5jcmMuaS5lamIyMD1DSEtKMjUwMkk6IHswfSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNyYy5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNS43KS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5jbGMuaS5lamIyMD1DSEtKMjUwMkk6IHswfSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yLCAxMC41LjcpLgotQ0hLSjI1MDIuZWpiU2VsZWN0LmNsYy5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNS43KS4KLQotIyBmaW5hbGl6ZQotQ0hLSjI1MDIuZmluYWxpemUuY2IuaS5lamIyMD1DSEtKMjUwMkk6IGZpbmFsaXplKCkgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEwLjYuMikuCi1DSEtKMjUwMi5maW5hbGl6ZS5jYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEwLjYuMikuCi1DSEtKMjUwMi5maW5hbGl6ZS5tYi5pLmVqYjIwPUNIS0oyNTAySTogZmluYWxpemUoKSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTUuNy4yKS4KLUNIS0oyNTAyLmZpbmFsaXplLm1iLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTUuNy4yKS4KLUNIS0oyNTAyLmZpbmFsaXplLmJiLmkuZWpiMjA9Q0hLSjI1MDJJOiBmaW5hbGl6ZSgpIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMi4yLjIpLgotQ0hLSjI1MDIuZmluYWxpemUuYmIubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMi4yLjIpLgotQ0hLSjI1MDIuZmluYWxpemUuc2IuaS5lamIyMD1DSEtKMjUwMkk6IGZpbmFsaXplKCkgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDcuMTAuMikuCi1DSEtKMjUwMi5maW5hbGl6ZS5zYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDcuMTAuMikuCi0KLUNIS0oyNTAyLnNsaC5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiA3LjEwLjgpLgotQ0hLSjI1MDIuc2xoLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogNy4xMC44KS4KLUNIS0oyNTAyLnNyaC5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDIuc3JoLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogNy4xMC42KS4KLQotCi0jIGJ1c2luZXNzCi1DSEtKMjQxMS5zYi5pLmVqYjIwPUNIS0oyNDExVzogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI0MTEuY2IuaS5lamIyMD1DSEtKMjQxMVc6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIiAoRUpCIDIuMDogMTAuNi44KS4KLUNIS0oyNDExLmJiLmkuZWpiMjA9Q0hLSjI0MTFXOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgKEVKQiAyLjA6IDEyLjIuNykuCi1DSEtKMjQxMS5zYi5tLmVqYjIwPUNIS0oyNDExVzogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI0MTEuY2IubS5lamIyMD1DSEtKMjQxMVc6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIiAoRUpCIDIuMDogMTAuNi44KS4KLUNIS0oyNDExLmJiLm0uZWpiMjA9Q0hLSjI0MTFXOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgKEVKQiAyLjA6IDEyLjIuNykuCi0KLUNIS0oyNDQxLnNiLmkuZWpiMjA9Q0hLSjI0NDFXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQ0MS5jYi5pLmVqYjIwPUNIS0oyNDQxVzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0NDEuYmIuaS5lamIyMD1DSEtKMjQ0MVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi43KS4KLUNIS0oyNDQxLnNiLm0uZWpiMjA9Q0hLSjI0NDFXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNDQxLmNiLm0uZWpiMjA9Q0hLSjI0NDFXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi44KS4KLUNIS0oyNDQxLmJiLm0uZWpiMjA9Q0hLSjI0NDFXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi43KS4KLQotQ0hLSjI0NDIuc2IuaS5lamIyMD1DSEtKMjQ0Mlc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNDQyLmNiLmkuZWpiMjA9Q0hLSjI0NDJXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjQ0Mi5iYi5pLmVqYjIwPUNIS0oyNDQyVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4yLjcpLgotQ0hLSjI0NDIuc2IubS5lamIyMD1DSEtKMjQ0Mlc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI0NDIuY2IubS5lamIyMD1DSEtKMjQ0Mlc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0NDIuYmIubS5lamIyMD1DSEtKMjQ0Mlc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4yLjcpLgotCi1DSEtKMjQ0My5zYi5pLmVqYjIwPUNIS0oyNDQzVzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNDQzLmNiLmkuZWpiMjA9Q0hLSjI0NDNXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0NDMuYmIuaS5lamIyMD1DSEtKMjQ0M1c6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuNykuCi1DSEtKMjQ0My5zYi5tLmVqYjIwPUNIS0oyNDQzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI0NDMuY2IubS5lamIyMD1DSEtKMjQ0M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTAuNi44KS4KLUNIS0oyNDQzLmJiLm0uZWpiMjA9Q0hLSjI0NDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuNykuCi0KLUNIS0oyNTAwLmJ1cy5zYi5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNTAwLmJ1cy5jYi5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi44KS4KLUNIS0oyNTAwLmJ1cy5iYi5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTIuMi43KS4KLUNIS0oyNTAwLmJ1cy5zYi5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjUwMC5idXMuY2IubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI1MDAuYnVzLmJiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTIuMi43KS4KLQotQ0hLSjI1MDMuYnVzLnNiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjQsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuY2IuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuOCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5iYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi43LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLnNiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5jYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjgsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuYmIubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi43LCAxOC4zLjgsIDE4LjYpLgotCi0jIG9uTWVzc2FnZQotQ0hLSjI1MDMub25NZXNzYWdlLm1iLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxNS40LjEwLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMub25NZXNzYWdlLm1iLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDE1LjQuMTAsIDE4LjMuOCwgMTguNikuCi0KLUNIS0oyNDQ1Lm1iLmkuZWpiMjA9Q0hLSjI0NDVXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDE1LjcuNCkuCi1DSEtKMjQ0NS5tYi5tLmVqYjIwPUNIS0oyNDQ1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDE1LjcuNCkuCi0KLUNIS0oyNDQ2Lm1iLmkuZWpiMjA9Q0hLSjI0NDZXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDE1LjcuNCkuCi1DSEtKMjQ0Ni5tYi5tLmVqYjIwPUNIS0oyNDQ2VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDE1LjcuNCkuCi0KLUNIS0oyNDQ3Lm1iLmkuZWpiMjA9Q0hLSjI0NDdXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxNS43LjQpLgotQ0hLSjI0NDcubWIubS5lamIyMD1DSEtKMjQ0N1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTUuNy40KS4KLQotQ0hLSjI1MDUub25NZXNzYWdlLm1iLmkuZWpiMjA9Q0hLSjI1MDVXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTUuNy40KS4KLUNIS0oyNTA1Lm9uTWVzc2FnZS5tYi5tLmVqYjIwPUNIS0oyNTA1VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTUuNy40KS4KLQotIyBhY2Nlc3NvciBtZXRob2QKLUNIS0oyNDQ5LmNiLmkuZWpiMjA9Q0hLSjI0NDlXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjMuMSkuCi1DSEtKMjQ0OS5jYi5tLmVqYjIwPUNIS0oyNDQ5VzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjMuMSkuCi0KLUNIS0oyNDUwLmNiLmkuZWpiMjA9Q0hLSjI0NTBXOiB7MH0gbXVzdCBiZSBhYnN0cmFjdCAoRUpCIDIuMDogMTAuMy4xLCAxMC42LjIpLgotQ0hLSjI0NTAuY2IubS5lamIyMD1DSEtKMjQ1MFc6IFRoaXMgbWV0aG9kIG11c3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDEwLjMuMSwgMTAuNi4yKS4KLQotIyBnZXQgJiBzZXQgbWV0aG9kcyBvZiBjbXIgZmllbGRzCi1DSEtKMjQ3My5jcmMuaS5lamIyMD1DSEtKMjQ3M1c6IHswfSBtdXN0IG5vdCBiZSBleHBvc2VkIChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTAuMSkuCi1DSEtKMjQ3My5jcmMubS5lamIyMD1DSEtKMjQ3M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGV4cG9zZWQgKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMC4xKS4KLUNIS0oyNDczLmNyaC5pLmVqYjIwPUNIS0oyNDczVzogezB9IG11c3Qgbm90IGJlIGV4cG9zZWQgKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMC4xKS4KLUNIS0oyNDczLmNyaC5tLmVqYjIwPUNIS0oyNDczVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZXhwb3NlZCAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEwLjEpLgotCi0jIGhvbWUKLUNIS0oyNDYxLmhvbWUuYnJoLmVqYjIwPUNIS0oyNDYxVzogVGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzIChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI0NjEuaG9tZS5jcmguZWpiMjA9Q0hLSjI0NjFXOiBUaGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMgKEVKQiAyLjA6IDEwLjYuMTApLgotQ0hLSjI0NjEuaG9tZS5zcmguZWpiMjA9Q0hLSjI0NjFXOiBUaGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMgKEVKQiAyLjA6IDcuMTAuNikuCi0KLUNIS0oyNDYyLmNsaC5pLmVqYjIwPUNIS0oyNDYySTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjQ2Mi5icmguaS5lamIyMD1DSEtKMjQ2Mkk6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiY3JlYXRlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjQ2Mi5jcmguaS5lamIyMD1DSEtKMjQ2Mkk6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiY3JlYXRlIiAoRUpCIDIuMDogOS42LjQsIDEwLjYuMTIpLgotQ0hLSjI0NjIuYmxoLmkuZWpiMjA9Q0hLSjI0NjJJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImNyZWF0ZSIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjExKS4KLUNIS0oyNDYyLmNsaC5tLmVqYjIwPUNIS0oyNDYySTogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjQ2Mi5icmgubS5lamIyMD1DSEtKMjQ2Mkk6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiY3JlYXRlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjQ2Mi5jcmgubS5lamIyMD1DSEtKMjQ2Mkk6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiY3JlYXRlIiAoRUpCIDIuMDogOS42LjQsIDEwLjYuMTIpLgotQ0hLSjI0NjIuYmxoLm0uZWpiMjA9Q0hLSjI0NjJJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImNyZWF0ZSIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjExKS4KLQotQ0hLSjI0NjMuY2xoLmkuZWpiMjA9Q0hLSjI0NjNJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImZpbmQiIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjQ2My5icmguaS5lamIyMD1DSEtKMjQ2M0k6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI0NjMuY3JoLmkuZWpiMjA9Q0hLSjI0NjNJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImZpbmQiIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMikuCi1DSEtKMjQ2My5ibGguaS5lamIyMD1DSEtKMjQ2M0k6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjExKS4KLUNIS0oyNDYzLmNsaC5tLmVqYjIwPUNIS0oyNDYzSTogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIiAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI0NjMuYnJoLm0uZWpiMjA9Q0hLSjI0NjNJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImZpbmQiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNDYzLmNyaC5tLmVqYjIwPUNIS0oyNDYzSTogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIiAoRUpCIDIuMDogOS42LjQsIDEwLjYuMTIpLgotQ0hLSjI0NjMuYmxoLm0uZWpiMjA9Q0hLSjI0NjNJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImZpbmQiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi4xMSkuCi0KLUNIS0oyNDY0LmNsaC5pLmVqYjIwPUNIS0oyNDY0STogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjQ2NC5icmguaS5lamIyMD1DSEtKMjQ2NEk6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjQ2NC5jcmguaS5lamIyMD1DSEtKMjQ2NEk6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAoRUpCIDIuMDogOS42LjQsIDEwLjYuMTIpLgotQ0hLSjI0NjQuYmxoLmkuZWpiMjA9Q0hLSjI0NjRJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggInJlbW92ZSIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjExKS4KLUNIS0oyNDY0LmNsaC5tLmVqYjIwPUNIS0oyNDY0STogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjQ2NC5icmgubS5lamIyMD1DSEtKMjQ2NEk6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjQ2NC5jcmgubS5lamIyMD1DSEtKMjQ2NEk6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAoRUpCIDIuMDogOS42LjQsIDEwLjYuMTIpLgotQ0hLSjI0NjQuYmxoLm0uZWpiMjA9Q0hLSjI0NjRJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggInJlbW92ZSIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjExKS4KLQotQ0hLSjI1MDMuaG9tZS5icmguaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjUwMy5ob21lLmNyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjUwMy5ob21lLnNyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDMuaG9tZS5ibGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi40LCAxMi4yLjExLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuaG9tZS5jbGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi40LCAxMC42LjEyLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuaG9tZS5zbGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuOCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmhvbWUuYnJoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjUwMy5ob21lLmNyaC5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNTAzLmhvbWUuc3JoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAzLmhvbWUuYmxoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi40LCAxMi4yLjExLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuaG9tZS5jbGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjQsIDEwLjYuMTIsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5ob21lLnNsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjgsIDE4LjMuOCwgMTguNikuCi0KLQotIyBjcmVhdGUKLUNIS0oyNTAzLmNyZWF0ZS5icmguaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjEsIDEyLjIuOSkuCi1DSEtKMjUwMy5jcmVhdGUuY3JoLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4xLCAxMC42LjEwKS4KLUNIS0oyNTAzLmNyZWF0ZS5zcmguaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAzLmNyZWF0ZS5ibGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4xLCAxMi4yLjExLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuY3JlYXRlLmNsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjEsIDEwLjYuMTIsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5jcmVhdGUuc2xoLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjgsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5jcmVhdGUuYnJoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjEsIDEyLjIuOSkuCi1DSEtKMjUwMy5jcmVhdGUuY3JoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjEsIDEwLjYuMTApLgotQ0hLSjI1MDMuY3JlYXRlLnNyaC5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMy5jcmVhdGUuYmxoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4xLCAxMi4yLjExLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuY3JlYXRlLmNsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTAuNi4xMiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmNyZWF0ZS5zbGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC44LCAxOC4zLjgsIDE4LjYpLgotCi1DSEtKMjQ2Ny5zcmguaS5lamIyMD1DSEtKMjQ2N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjQ2Ny5zbGguaS5lamIyMD1DSEtKMjQ2N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuOCkuCi1DSEtKMjQ2Ny5jcmguaS5lamIyMD1DSEtKMjQ2N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4xLCAxMC42LjEwKS4KLUNIS0oyNDY3LmNsaC5pLmVqYjIwPUNIS0oyNDY3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjEsIDEwLjYuMTIpLgotQ0hLSjI0NjcuYnJoLmkuZWpiMjA9Q0hLSjI0NjdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMSwgMTIuMi45KS4KLUNIS0oyNDY3LmJsaC5pLmVqYjIwPUNIS0oyNDY3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjEsIDEyLjIuMTEpLgotQ0hLSjI0Njcuc3JoLm0uZWpiMjA9Q0hLSjI0NjdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjQ2Ny5zbGgubS5lamIyMD1DSEtKMjQ2N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC44KS4KLUNIS0oyNDY3LmNyaC5tLmVqYjIwPUNIS0oyNDY3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMSwgMTAuNi4xMCkuCi1DSEtKMjQ2Ny5jbGgubS5lamIyMD1DSEtKMjQ2N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjEsIDEwLjYuMTIpLgotQ0hLSjI0NjcuYnJoLm0uZWpiMjA9Q0hLSjI0NjdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4xLCAxMi4yLjkpLgotQ0hLSjI0NjcuYmxoLm0uZWpiMjA9Q0hLSjI0NjdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4xLCAxMi4yLjExKS4KLQotQ0hLSjI0MDIuc2ZyaC5pLmVqYjIwPUNIS0oyNDAyRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogNi4zLjEsIDcuMTAuNikuCi1DSEtKMjQwMi5zZmxoLmkuZWpiMjA9Q0hLSjI0MDJFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA2LjQuMSwgNy4xMC44KS4KLUNIS0oyNDAyLnNzcmguaS5lamIyMD1DSEtKMjQwMkU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDYuMy4xLCA3LjgsIDcuMTAuNikuCi1DSEtKMjQwMi5zc2xoLmkuZWpiMjA9Q0hLSjI0MDJFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA2LjQuMSwgNy44LCA3LjEwLjgpLgotQ0hLSjI0MDIuY3JoLmkuZWpiMjA9Q0hLSjI0MDJFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA5LjUuMSwgMTAuNi4xMCkuCi1DSEtKMjQwMi5jbGguaS5lamIyMD1DSEtKMjQwMkU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDkuNi4xLCAxMC42LjEyKS4KLUNIS0oyNDAyLmJyaC5pLmVqYjIwPUNIS0oyNDAyRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogOS41LjEsIDEyLjIuOSkuCi1DSEtKMjQwMi5ibGguaS5lamIyMD1DSEtKMjQwMkU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDkuNi4xLCAxMi4yLjExKS4KLUNIS0oyNDAyLnNmcmgubS5lamIyMD1DSEtKMjQwMkU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogNi4zLjEsIDcuMTAuNikuCi1DSEtKMjQwMi5zZmxoLm0uZWpiMjA9Q0hLSjI0MDJFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDYuNC4xLCA3LjEwLjgpLgotQ0hLSjI0MDIuc3NyaC5tLmVqYjIwPUNIS0oyNDAyRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA2LjMuMSwgNy44LCA3LjEwLjYpLgotQ0hLSjI0MDIuc3NsaC5tLmVqYjIwPUNIS0oyNDAyRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA2LjQuMSwgNy44LCA3LjEwLjgpLgotQ0hLSjI0MDIuY3JoLm0uZWpiMjA9Q0hLSjI0MDJFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDkuNS4xLCAxMC42LjEwKS4KLUNIS0oyNDAyLmNsaC5tLmVqYjIwPUNIS0oyNDAyRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA5LjYuMSwgMTAuNi4xMikuCi1DSEtKMjQwMi5icmgubS5lamIyMD1DSEtKMjQwMkU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogOS41LjEsIDEyLjIuOSkuCi1DSEtKMjQwMi5ibGgubS5lamIyMD1DSEtKMjQwMkU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogOS42LjEsIDEyLjIuMTEpLgotCi1DSEtKMjQ3Ni5zcmguaS5lamIyMD1DSEtKMjQ3NkU6IHswfSBtdXN0IGJlIHRoZSBjcmVhdGUoKSBtZXRob2QgKEVKQiAyLjA6IDcuOCwgNy4xMC42KS4KLUNIS0oyNDc2LnNsaC5pLmVqYjIwPUNIS0oyNDc2RTogezB9IG11c3QgYmUgdGhlIGNyZWF0ZSgpIG1ldGhvZCAoRUpCIDIuMDogNy44LCA3LjEwLjgpLgotQ0hLSjI0NzYuc3JoLm0uZWpiMjA9Q0hLSjI0NzZFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHRoZSBjcmVhdGUoKSBtZXRob2QgKEVKQiAyLjA6IDcuOCwgNy4xMC42KS4KLUNIS0oyNDc2LnNsaC5tLmVqYjIwPUNIS0oyNDc2RTogVGhpcyBtZXRob2QgbXVzdCBiZSB0aGUgY3JlYXRlKCkgbWV0aG9kIChFSkIgMi4wOiA3LjgsIDcuMTAuOCkuCi1DSEtKMjQ3Ni5zc2IuaS5lamIyMD1DSEtKMjQ3NkU6IHswfSBtdXN0IGJlIHRoZSBlamJDcmVhdGUoKSBtZXRob2QgKEVKQiAyLjA6IDcuOCkuCi1DSEtKMjQ3Ni5zc2IubS5lamIyMD1DSEtKMjQ3NkU6IFRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIGVqYkNyZWF0ZSgpIG1ldGhvZCAoRUpCIDIuMDogNy44KS4KLQotCi0jIHJlbW90ZSBjcmVhdGUKLUNIS0oyNTA0LmNyZWF0ZS5zcmguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwNC5jcmVhdGUuc2xoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiA3LjEwLjgpLgotQ0hLSjI1MDQuY3JlYXRlLmNyaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTAuNi4xMCkuCi1DSEtKMjUwNC5jcmVhdGUuY2xoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMC42LjEyKS4KLUNIS0oyNTA0LmNyZWF0ZS5icmguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjUwNC5jcmVhdGUuYmxoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMi4yLjExKS4KLUNIS0oyNTA0LmNyZWF0ZS5zcmgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDQuY3JlYXRlLnNsaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDcuMTAuOCkuCi1DSEtKMjUwNC5jcmVhdGUuY3JoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1hdGNoaW5nIG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTAuNi4xMCkuCi1DSEtKMjUwNC5jcmVhdGUuY2xoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1hdGNoaW5nIG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTAuNi4xMikuCi1DSEtKMjUwNC5jcmVhdGUuYnJoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1hdGNoaW5nIG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNTA0LmNyZWF0ZS5ibGgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMi4yLjExKS4KLQotQ0hLSjI1MDAuY3JlYXRlLnNyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAwLmNyZWF0ZS5jcmguaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNTAwLmNyZWF0ZS5icmguaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI1MDAuY3JlYXRlLnNyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMC5jcmVhdGUuY3JoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI1MDAuY3JlYXRlLmJyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotCi0jIGhvbWUgbWV0aG9kCi1DSEtKMjUwNC5ob21lLmNyaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjEwKS4KLUNIS0oyNTA0LmhvbWUuY2xoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMC41LjIsIDEwLjYuMTIpLgotQ0hLSjI1MDQuaG9tZS5icmguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjUwNC5ob21lLmJsaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTIuMi4xMSkuCi1DSEtKMjUwNC5ob21lLmNyaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi4xMCkuCi1DSEtKMjUwNC5ob21lLmNsaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi4xMikuCi1DSEtKMjUwNC5ob21lLmJyaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjUwNC5ob21lLmJsaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEyLjIuMTEpLgotCi0KLSMgZmluZCBtZXRob2QKLUNIS0oyNTAzLmZpbmQuYnJoLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4yLCAxMi4yLjkpLgotQ0hLSjI1MDMuZmluZC5jcmguaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEwLjYuMTApLgotQ0hLSjI1MDMuZmluZC5zcmguaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAzLmZpbmQuYmxoLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMiwgMTIuMi4xMSwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmZpbmQuY2xoLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMiwgMTAuNi4xMiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmZpbmQuc2xoLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjgsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5maW5kLmJyaC5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4yLCAxMi4yLjkpLgotQ0hLSjI1MDMuZmluZC5jcmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjUwMy5maW5kLnNyaC5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMy5maW5kLmJsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMiwgMTIuMi4xMSwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmZpbmQuY2xoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZmluZC5zbGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC44LCAxOC4zLjgsIDE4LjYpLgotCi1DSEtKMjQ3Ny5jcmguaS5lamIyMD1DSEtKMjQ3N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4yLCAxMi4yLjkpLgotQ0hLSjI0NzcuYnJoLmkuZWpiMjA9Q0hLSjI0NzdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMiwgMTIuMi4xMSkuCi1DSEtKMjQ3Ny5jbGguaS5lamIyMD1DSEtKMjQ3N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyNDc3LmJsaC5pLmVqYjIwPUNIS0oyNDc3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIpLgotQ0hLSjI0NzcuY3JoLm0uZWpiMjA9Q0hLSjI0NzdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4yLCAxMi4yLjkpLgotQ0hLSjI0NzcuYnJoLm0uZWpiMjA9Q0hLSjI0NzdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLUNIS0oyNDc3LmNsaC5tLmVqYjIwPUNIS0oyNDc3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjQ3Ny5ibGgubS5lamIyMD1DSEtKMjQ3N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIpLgotCi1DSEtKMjQ3OC5jcmguaS5lamIyMD1DSEtKMjQ3OEk6IHswfSBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNS44LjQpLgotQ0hLSjI0NzguY3JoLm0uZWpiMjA9Q0hLSjI0NzhJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNS44LjQpLgotQ0hLSjI0NzguY2xoLmkuZWpiMjA9Q0hLSjI0NzhJOiB7MH0gbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjUuOC40KS4KLUNIS0oyNDc4LmNsaC5tLmVqYjIwPUNIS0oyNDc4STogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjUuOC40KS4KLUNIS0oyNDc4LmJyaC5pLmVqYjIwPUNIS0oyNDc4STogezB9IG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4xLjguNCkuCi1DSEtKMjQ3OC5icmgubS5lamIyMD1DSEtKMjQ3OEk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4xLjguNCkuCi1DSEtKMjQ3OC5ibGguaS5lamIyMD1DSEtKMjQ3OEk6IHswfSBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMS44LjQpLgotQ0hLSjI0NzguYmxoLm0uZWpiMjA9Q0hLSjI0NzhJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMS44LjQpLgotQ0hLSjI0NzguY2IuaS5lamIyMD1DSEtKMjQ3OEk6IHswfSBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNS44LjQpLgotQ0hLSjI0NzguY2IubS5lamIyMD1DSEtKMjQ3OEk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMC41LjguNCkuCi1DSEtKMjQ3OC5iYi5pLmVqYjIwPUNIS0oyNDc4STogezB9IG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4xLjguNCkuCi1DSEtKMjQ3OC5iYi5tLmVqYjIwPUNIS0oyNDc4STogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLQotQ0hLSjI0MDMuYnJoLmkuZWpiMjA9Q0hLSjI0MDNXOiB7MH0gbXVzdCByZXR1cm4gezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiA5LjUuMiwgMTIuMS43LCAxMi4yLjkpLgotQ0hLSjI0MDMuYmxoLmkuZWpiMjA9Q0hLSjI0MDNXOiB7MH0gbXVzdCByZXR1cm4gezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiA5LjYuMiwgMTIuMS43LCAxMi4yLjExKS4KLUNIS0oyNDAzLmNyaC5pLmVqYjIwPUNIS0oyNDAzVzogezB9IG11c3QgcmV0dXJuIHsxfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogOS41LjIsIDEwLjUuNiwgMTAuNi4xMCwgMTEuMi4yKS4KLUNIS0oyNDAzLmNsaC5pLmVqYjIwPUNIS0oyNDAzVzogezB9IG11c3QgcmV0dXJuIHsxfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogOS42LjIsIDEwLjUuNiwgMTAuNi4xMiwgMTEuMi4yKS4KLUNIS0oyNDAzLmJyaC5tLmVqYjIwPUNIS0oyNDAzVzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiA5LjUuMiwgMTIuMS43LCAxMi4yLjkpLgotQ0hLSjI0MDMuYmxoLm0uZWpiMjA9Q0hLSjI0MDNXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDkuNi4yLCAxMi4xLjcsIDEyLjIuMTEpLgotQ0hLSjI0MDMuY3JoLm0uZWpiMjA9Q0hLSjI0MDNXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDkuNS4yLCAxMC41LjYsIDEwLjYuMTAsIDExLjIuMikuCi1DSEtKMjQwMy5jbGgubS5lamIyMD1DSEtKMjQwM1c6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogOS42LjIsIDEwLjUuNiwgMTAuNi4xMiwgMTEuMi4yKS4KLQotIyByZW1vdGUgZmluZAotQ0hLSjI1MDQuZmluZC5icmguaS5lamIyMD1DSEtKMjUwNFc6IHsxfSBtdXN0IGV4aXN0IG9uIHsyfSBmb3IgezB9IChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI1MDQuZmluZC5jcmguaS5lamIyMD1DSEtKMjUwNFc6IHsxfSBtdXN0IGV4aXN0IG9uIHsyfSBmb3IgezB9IChFSkIgMi4wOiAxMC42LjEwKS4KLUNIS0oyNTA0LmZpbmQuYnJoLm0uZWpiMjA9Q0hLSjI1MDRXOiB7MH0gbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjUwNC5maW5kLmNyaC5tLmVqYjIwPUNIS0oyNTA0VzogezB9IG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMC42LjEwKS4KLQotIyBsb2NhbCBmaW5kCi1DSEtKMjUwNC5maW5kLmJsaC5pLmVqYjIwPUNIS0oyNTA0VzogezF9IG11c3QgZXhpc3Qgb24gezJ9IGZvciB7MH0gKEVKQiAyLjA6IDEyLjIuMTEpLgotQ0hLSjI1MDQuZmluZC5jbGguaS5lamIyMD1DSEtKMjUwNFc6IHsxfSBtdXN0IGV4aXN0IG9uIHsyfSBmb3IgezB9IChFSkIgMi4wOiAxMC42LjIpLgotQ0hLSjI1MDQuZmluZC5ibGgubS5lamIyMD1DSEtKMjUwNFc6IHswfSBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi4xMSkuCi1DSEtKMjUwNC5maW5kLmNsaC5tLmVqYjIwPUNIS0oyNTA0VzogezB9IG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMC42LjIpLgotCi0KLUNIS0oyNTAwLmZpbmQuc3JoLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDAuZmluZC5jcmguaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNTAwLmZpbmQuYnJoLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNTAwLmZpbmQuc3JoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAwLmZpbmQuY3JoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI1MDAuZmluZC5icmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLQotQ0hLSjI0OTUuY2xoLmkuZWpiMjA9Q0hLSjI0OTVJOiB7MH0gbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sIChFSkIgMi4wOiAxMC41LjYsIDEwLjYuMTQpLgotQ0hLSjI0OTUuY2xoLm0uZWpiMjA9Q0hLSjI0OTVJOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwgKEVKQiAyLjA6IDEwLjUuNiwgMTAuNi4xNCkuCi1DSEtKMjQ5NS5jcmguaS5lamIyMD1DSEtKMjQ5NUk6IHswfSBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwgKEVKQiAyLjA6IDEwLjUuNiwgMTAuNi4xNCkuCi1DSEtKMjQ5NS5jcmgubS5lamIyMD1DSEtKMjQ5NUk6IFRoaXMgbWV0aG9kIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbCAoRUpCIDIuMDogMTAuNS42LCAxMC42LjE0KS4KLQotCi0jIG1ldGhvZCBvbiBhIGNvbXBvbmVudCBpbnRlcmZhY2UKLUNIS0oyNTAzLmJ1cy5zcmMuaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNTAzLmJ1cy5zbGMuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNywgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5icmMuaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi44KS4KLUNIS0oyNTAzLmJ1cy5ibGMuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuMTAsIDEyLjIuMTAsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuY3JjLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjUwMy5idXMuY2xjLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjEwLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLnNyYy5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjUwMy5idXMuc2xjLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNywgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5icmMubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjI1MDMuYnVzLmJsYy5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjEwLCAxMi4yLjEwLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmNyYy5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjUwMy5idXMuY2xjLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuMTAsIDE4LjMuOCwgMTguNikuCi0KLSMgbWV0aG9kIG9uIGEgaG9tZSBpbnRlcmZhY2UKLUNIS0oyNDY1LmJyaC5pLmVqYjIwPUNIS0oyNDY1VzogezB9IG11c3QgdGhyb3cgezF9IGZvciB7Mn0gKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjQ2NS5ibGguaS5lamIyMD1DSEtKMjQ2NVc6IHswfSBtdXN0IHRocm93IHsxfSBmb3IgezJ9IChFSkIgMi4wOiAxMi4yLjExKS4KLUNIS0oyNDY1LmNyaC5pLmVqYjIwPUNIS0oyNDY1VzogezB9IG11c3QgdGhyb3cgezF9IGZvciB7Mn0gKEVKQiAyLjA6IDEwLjYuMTApLgotQ0hLSjI0NjUuY2xoLmkuZWpiMjA9Q0hLSjI0NjVXOiB7MH0gbXVzdCB0aHJvdyB7MX0gZm9yIHsyfSAoRUpCIDIuMDogMTAuNi4xMikuCi1DSEtKMjQ2NS5zcmguaS5lamIyMD1DSEtKMjQ2NVc6IHswfSBtdXN0IHRocm93IHsxfSBmb3IgezJ9IChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI0NjUuc2xoLmkuZWpiMjA9Q0hLSjI0NjVXOiB7MH0gbXVzdCB0aHJvdyB7MX0gZm9yIHsyfSAoRUpCIDIuMDogNy4xMC44KS4KLUNIS0oyNDY1LmJyaC5tLmVqYjIwPUNIS0oyNDY1VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gZm9yIHsxfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNDY1LmJsaC5tLmVqYjIwPUNIS0oyNDY1VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gZm9yIHsxfSAoRUpCIDIuMDogMTIuMi4xMSkuCi1DSEtKMjQ2NS5jcmgubS5lamIyMD1DSEtKMjQ2NVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IGZvciB7MX0gKEVKQiAyLjA6IDEwLjYuMTApLgotQ0hLSjI0NjUuY2xoLm0uZWpiMjA9Q0hLSjI0NjVXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSBmb3IgezF9IChFSkIgMi4wOiAxMC42LjEyKS4KLUNIS0oyNDY1LnNyaC5tLmVqYjIwPUNIS0oyNDY1VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gZm9yIHsxfSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNDY1LnNsaC5tLmVqYjIwPUNIS0oyNDY1VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gZm9yIHsxfSAoRUpCIDIuMDogNy4xMC44KS4KLQotIyBtZXRob2Qgb24gYSByZW1vdGUgaG9tZQotQ0hLSjI1MDAuaG9tZS5zcmguaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMC5ob21lLmNyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI1MDAuaG9tZS5icmguaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI1MDAuaG9tZS5zcmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDAuaG9tZS5jcmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjUwMC5ob21lLmJyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotCi1DSEtKMjQ2Ni5zcmMuaS5lamIyMD1DSEtKMjQ2Nkk6IHswfSBtdXN0IG5vdCBleHBvc2UgdGhlIHsxfSB0eXBlIChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI0NjYuY3JoLmkuZWpiMjA9Q0hLSjI0NjZJOiB7MH0gbXVzdCBub3QgZXhwb3NlIHRoZSB7MX0gdHlwZSAoRUpCIDIuMDogMTAuNi4xMCkuCi1DSEtKMjQ2Ni5icmguaS5lamIyMD1DSEtKMjQ2Nkk6IHswfSBtdXN0IG5vdCBleHBvc2UgdGhlIHsxfSB0eXBlIChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI0NjYuY3JoLm0uZWpiMjA9Q0hLSjI0NjZJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlIChFSkIgMi4wOiAxMC42LjEwKS4KLUNIS0oyNDY2LmJyaC5tLmVqYjIwPUNIS0oyNDY2STogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIHRoZSB7MH0gdHlwZSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNDY2LnNyYy5tLmVqYjIwPUNIS0oyNDY2STogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIHRoZSB7MH0gdHlwZSAoRUpCIDIuMDogNy4xMC41KS4KLQotIyBtZXRob2Qgb24gYSByZW1vdGUgY29tcG9uZW50Ci1DSEtKMjQ2OC5zcmMuZWpiMjA9Q0hLSjI0NjhXOiBUaGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMgKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjQ2OC5jcmMuZWpiMjA9Q0hLSjI0NjhXOiBUaGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMgKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjQ2OC5icmMuZWpiMjA9Q0hLSjI0NjhXOiBUaGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMgKEVKQiAyLjA6IDEyLjIuOCkuCi0KLUNIS0oyNTAwLmJ1cy5zcmMuaS5lamIyMD1DSEtKMjUwMEk6IHswfSBpbiBtZXRob2QgezF9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjUwMC5idXMuY3JjLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MH0gaW4gbWV0aG9kIHsxfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjI1MDAuYnVzLmJyYy5pLmVqYjIwPUNIS0oyNTAwSTogezB9IGluIG1ldGhvZCB7MX0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTIuMi44KS4KLUNIS0oyNTAwLmJ1cy5zcmMubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI1MDAuYnVzLmNyYy5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjUwMC5idXMuYnJjLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTIuMi44KS4KLQotQ0hLSjI0NzIuc3JoLmkuZWpiMjA9Q0hLSjI0NzJXOiB7MX0gaW4gbWV0aG9kIHswfSBjYW5ub3QgYmUgYW4gYXJndW1lbnQgb3IgcmVzdWx0IHR5cGUgKEVKQiAyLjA6IDYuNy4yKS4KLUNIS0oyNDcyLmJyYy5pLmVqYjIwPUNIS0oyNDcyVzogezB9IG11c3Qgbm90IHBhc3MgezF9IGFzIGFuIGFyZ3VtZW50IG9yIHJlc3VsdCAoRUpCIDIuMDogOS43LjIsIDEyLjIuOCkuCi1DSEtKMjQ3Mi5jcmMuaS5lamIyMD1DSEtKMjQ3Mlc6IHswfSBtdXN0IG5vdCBwYXNzIHsxfSBhcyBhbiBhcmd1bWVudCBvciByZXN1bHQgKEVKQiAyLjA6IDkuNy4yLCAxMC4zLjEsIDEwLjMuMTAuMSkuCi1DSEtKMjQ3Mi5icmMubS5lamIyMD1DSEtKMjQ3Mlc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHBhc3MgezB9IGFzIGFuIGFyZ3VtZW50IG9yIHJlc3VsdCAoRUpCIDIuMDogOS43LjIsIDEyLjIuOCkuCi1DSEtKMjQ3Mi5jcmMubS5lamIyMD1DSEtKMjQ3Mlc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHBhc3MgezB9IGFzIGFuIGFyZ3VtZW50IG9yIHJlc3VsdCAoRUpCIDIuMDogOS43LjIsIDEwLjMuMSwgMTAuMy4xMC4xKS4KLUNIS0oyNDcyLnNyaC5tLmVqYjIwPUNIS0oyNDcyVzogezB9IGNhbm5vdCBiZSBhbiBhcmd1bWVudCBvciByZXN1bHQgdHlwZSAoRUpCIDIuMDogNi43LjIpLgotCi0jIG1ldGhvZCBvbiBhIHJlbW90ZSBjb21wb25lbnQgQ01QCi1DSEtKMjQ3NC5jcmMuaS5lamIyMD1DSEtKMjQ3NFc6IHswfSBtdXN0IG5vdCBleHBvc2UgezF9IChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTAuMSkuCi1DSEtKMjQ3NC5jcmMubS5lamIyMD1DSEtKMjQ3NFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB7MH0gKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMC4xKS4KLQotQ0hLSjI0OTAuY3JjLmkuZWpiMjA9Q0hLSjI0OTBXOiB7MH0gbXVzdCBub3QgYmUgZXhwb3NlZCAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEwLjEpLgotQ0pLSjI0OTAuY3JjLm0uZWpiMjA9Q0hLSjI0OTBXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBleHBvc2VkIChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTAuMSkuCi0KLSMgZWpiU2VsZWN0IG1ldGhvZAotQ0hLSjI0ODUuY2IuaS5lamIyMD1DSEtKMjQ4NVc6IHswfSBtdXN0IGJlIGFic3RyYWN0IChFSkIgMi4wOiAxMC41LjcsIDEwLjYuNykuCi1DSEtKMjQ4NS5jYi5tLmVqYjIwPUNIS0oyNDg1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBhYnN0cmFjdCAoRUpCIDIuMDogMTAuNS43LCAxMC42LjcpLgotCi1DSEtKMjQ4Ny5jYi5pLmVqYjIwPUNIS0oyNDg3VzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjcpLgotQ0hLSjI0ODcuY2IubS5lamIyMD1DSEtKMjQ4N1c6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjcpLgotCi1DSEtKMjQ4OC5jYi5pLmVqYjIwPUNIS0oyNDg4VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi43KS4KLUNIS0oyNDg4LmNiLm0uZWpiMjA9Q0hLSjI0ODhXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNykuCi0KLUNIS0oyNDg2LmNiLmkuZWpiMjA9Q0hLSjI0ODZXOiB7MH0gbXVzdCByZXR1cm4gezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiAxMC41LjcsIDExLjIuMikuCi1DSEtKMjQ4Ni5jYi5tLmVqYjIwPUNIS0oyNDg2VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiAxMC41LjcsIDExLjIuMikuCi0KLUNIS0oyNDk2LmNiLmkuZWpiMjA9Q0hLSjI0OTZXOiB7MH0gbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sIChFSkIgMi4wOiAxMC41LjcsIDEwLjYuMTQpLgotQ0hLSjI0OTYuY2IubS5lamIyMD1DSEtKMjQ5Nlc6IFRoaXMgbWV0aG9kIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbCAoRUpCIDIuMDogMTAuNS43LCAxMC42LjE0KS4KLQotIyBjb21wb25lbnQgbWF0Y2hpbmcgbWV0aG9kCi1DSEtKMjAyMy5zcmMuaS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG5lZWRzIHsxfSB0byBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjAyMy5zbGMuaS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG5lZWRzIHsxfSB0byBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDcuMTAuNykuCi1DSEtKMjAyMy5icmMuaS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG5lZWRzIHsxfSB0byBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjAyMy5ibGMuaS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG5lZWRzIHsxfSB0byBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEyLjIuMTApLgotQ0hLSjIwMjMuY3JjLmkuZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBuZWVkcyB7MX0gdG8gZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjIwMjMuY2xjLmkuZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBuZWVkcyB7MX0gdG8gZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMC42LjExKS4KLUNIS0oyMDIzLnNyYy5tLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjAyMy5zbGMubS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiA3LjEwLjcpLgotQ0hLSjIwMjMuYnJjLm0uZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi44KS4KLUNIS0oyMDIzLmJsYy5tLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEyLjIuMTApLgotQ0hLSjIwMjMuY3JjLm0uZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyMDIzLmNsYy5tLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEwLjYuMTEpLgotCi1DSEtKMjQ3MC5zcmMuaS5lamIyMD1DSEtKMjQ3MEU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjQ3MC5zbGMuaS5lamIyMD1DSEtKMjQ3MEU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDcuMTAuNykuCi1DSEtKMjQ3MC5jcmMuaS5lamIyMD1DSEtKMjQ3MEU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjQ3MC5jbGMuaS5lamIyMD1DSEtKMjQ3MEU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDEwLjYuMTEpLgotQ0hLSjI0NzAuYnJjLmkuZWpiMjA9Q0hLSjI0NzBFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjI0NzAuYmxjLmkuZWpiMjA9Q0hLSjI0NzBFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiAxMi4yLjEwKS4KLUNIS0oyNDcwLnNyYy5tLmVqYjIwPUNIS0oyNDcwRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI0NzAuc2xjLm0uZWpiMjA9Q0hLSjI0NzBFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDcuMTAuNykuCi1DSEtKMjQ3MC5jcmMubS5lamIyMD1DSEtKMjQ3MEU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNDcwLmNsYy5tLmVqYjIwPUNIS0oyNDcwRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiAxMC42LjExKS4KLUNIS0oyNDcwLmJyYy5tLmVqYjIwPUNIS0oyNDcwRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjI0NzAuYmxjLm0uZWpiMjA9Q0hLSjI0NzBFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDEyLjIuMTApLgotCi1DSEtKMjQ3MS5zcmMuaS5lamIyMD1DSEtKMjQ3MVc6IHswfSBtdXN0IHRocm93IHsxfSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNDcxLnNsYy5pLmVqYjIwPUNIS0oyNDcxVzogezB9IG11c3QgdGhyb3cgezF9IChFSkIgMi4wOiA3LjEwLjcpLgotQ0hLSjI0NzEuY3JjLmkuZWpiMjA9Q0hLSjI0NzFXOiB7MH0gbXVzdCB0aHJvdyB7MX0gKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjQ3MS5jbGMuaS5lamIyMD1DSEtKMjQ3MVc6IHswfSBtdXN0IHRocm93IHsxfSAoRUpCIDIuMDogMTAuNi4xMSkuCi1DSEtKMjQ3MS5icmMuaS5lamIyMD1DSEtKMjQ3MVc6IHswfSBtdXN0IHRocm93IHsxfSAoRUpCIDIuMDogMTIuMi44KS4KLUNIS0oyNDcxLmJsYy5pLmVqYjIwPUNIS0oyNDcxVzogezB9IG11c3QgdGhyb3cgezF9IChFSkIgMi4wOiAxMi4yLjEwKS4KLUNIS0oyNDcxLnNyYy5tLmVqYjIwPUNIS0oyNDcxVzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjQ3MS5zbGMubS5lamIyMD1DSEtKMjQ3MVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IChFSkIgMi4wOiA3LjEwLjcpLgotQ0hLSjI0NzEuY3JjLm0uZWpiMjA9Q0hLSjI0NzFXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNDcxLmNsYy5tLmVqYjIwPUNIS0oyNDcxVzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gKEVKQiAyLjA6IDEwLjYuMTEpLgotQ0hLSjI0NzEuYnJjLm0uZWpiMjA9Q0hLSjI0NzFXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSAoRUpCIDIuMDogMTIuMi44KS4KLUNIS0oyNDcxLmJsYy5tLmVqYjIwPUNIS0oyNDcxVzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gKEVKQiAyLjA6IDEyLjIuMTApLgotCi0jIEVKQk9iamVjdCwgRUpCTG9jYWxPYmplY3QgbWV0aG9kcwotQ0hLSjI0Njkuc3JjLmkuZWpiMjA9Q0hLSjI0NjlXOiB7MH0gaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogNi41KS4KLUNIS0oyNDY5LnNsYy5pLmVqYjIwPUNIS0oyNDY5VzogezB9IGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDYuNSkuCi1DSEtKMjQ2OS5jcmMuaS5lamIyMD1DSEtKMjQ2OVc6IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA5LjkpLgotQ0hLSjI0NjkuY2xjLmkuZWpiMjA9Q0hLSjI0NjlXOiB7MH0gaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogOS4xMCkuCi1DSEtKMjQ2OS5icmMuaS5lamIyMD1DSEtKMjQ2OVc6IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA5LjkpLgotQ0hLSjI0NjkuYmxjLmkuZWpiMjA9Q0hLSjI0NjlXOiB7MH0gaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogOS4xMCkuCi1DSEtKMjQ2OS5zcmMubS5lamIyMD1DSEtKMjQ2OVc6IFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDYuNSkuCi1DSEtKMjQ2OS5zbGMubS5lamIyMD1DSEtKMjQ2OVc6IFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDYuNSkuCi1DSEtKMjQ2OS5jcmMubS5lamIyMD1DSEtKMjQ2OVc6IFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuOSkuCi1DSEtKMjQ2OS5jbGMubS5lamIyMD1DSEtKMjQ2OVc6IFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuMTApLgotQ0hLSjI0NjkuYnJjLm0uZWpiMjA9Q0hLSjI0NjlXOiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA5LjkpLgotQ0hLSjI0NjkuYmxjLm0uZWpiMjA9Q0hLSjI0NjlXOiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA5LjEwKS4KLQotIyBmaW5kQnlQcmltYXJ5S2V5Ci1DSEtKMjQ3NS5jcmguaS5lamIyMD1DSEtKMjQ3NVc6IHswfSBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoezF9KSAoRUpCIDIuMDogOS41LjIsIDEwLjYuMTApLgotQ0hLSjI0NzUuY2xoLmkuZWpiMjA9Q0hLSjI0NzVXOiB7MH0gbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHsxfSkgKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyKS4KLUNIS0oyNDc1LmNyaGQuaS5lamIyMD1DSEtKMjQ3NVc6IHswfSBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoT2JqZWN0KSAoRUpCIDIuMDogMTAuOC4zKS4KLUNIS0oyNDc1LmNsaGQuaS5lamIyMD1DSEtKMjQ3NVc6IHswfSBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoT2JqZWN0KSAoRUpCIDIuMDogMTAuOC4zKS4KLUNIS0oyNDc1LmJyaC5pLmVqYjIwPUNIS0oyNDc1VzogezB9IG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleSh7MX0pIChFSkIgMi4wOiA5LjUuMiwgMTIuMi45KS4KLUNIS0oyNDc1LmJsaC5pLmVqYjIwPUNIS0oyNDc1VzogezB9IG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleSh7MX0pIChFSkIgMi4wOiA5LjYuMiwgMTIuMi4xMSkuCi1DSEtKMjQ3NS5jcmgubS5lamIyMD1DSEtKMjQ3NVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleSh7MH0pIChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjQ3NS5jbGgubS5lamIyMD1DSEtKMjQ3NVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleSh7MH0pIChFSkIgMi4wOiA5LjYuMiwgMTAuNi4xMikuCi1DSEtKMjQ3NS5jcmhkLm0uZWpiMjA9Q0hLSjI0NzVXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoT2JqZWN0KSAoRUpCIDIuMDogMTAuOC4zKS4KLUNIS0oyNDc1LmNsaGQubS5lamIyMD1DSEtKMjQ3NVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleShPYmplY3QpIChFSkIgMi4wOiAxMC44LjMpLgotQ0hLSjI0NzUuYnJoLm0uZWpiMjA9Q0hLSjI0NzVXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoezB9KSAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjQ3NS5ibGgubS5lamIyMD1DSEtKMjQ3NVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleSh7MH0pIChFSkIgMi4wOiA5LjYuMiwgMTIuMi4xMSkuCi0KLUNIS0oyNDc5LmNyaC5pLmVqYjIwPUNIS0oyNDc5RTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogOS41LjIsIDEwLjYuMTApLgotQ0hLSjI0NzkuY2xoLmkuZWpiMjA9Q0hLSjI0NzlFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA5LjYuMiwgMTAuNi4xMikuCi1DSEtKMjQ3OS5icmguaS5lamIyMD1DSEtKMjQ3OUU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDkuNS4yLCAxMi4yLjkpLgotQ0hLSjI0NzkuYmxoLmkuZWpiMjA9Q0hLSjI0NzlFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA5LjYuMiwgMTIuMi4xMSkuCi1DSEtKMjQ3OS5jcmgubS5lamIyMD1DSEtKMjQ3OUU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogOS41LjIsIDEwLjYuMTApLgotQ0hLSjI0NzkuY2xoLm0uZWpiMjA9Q0hLSjI0NzlFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyKS4KLUNIS0oyNDc5LmJyaC5tLmVqYjIwPUNIS0oyNDc5RTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA5LjUuMiwgMTIuMi45KS4KLUNIS0oyNDc5LmJsaC5tLmVqYjIwPUNIS0oyNDc5RTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA5LjYuMiwgMTIuMi4xMSkuCi0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmaWVsZCBjaGVja3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DSEtKMjQ1Mi5zYi5pLmVqYjIwPUNIS0oyNDUyVzogVHJhbnNpZW50IGZpZWxkIHswfSBzaG91bGQgbm90IGJlIHRoZSB7MX0gdHlwZSAoRUpCIDIuMDogNy40LjEpLgotQ0hLSjI0NTIuc2IubS5lamIyMD1DSEtKMjQ1Mlc6IEEgdHJhbnNpZW50IGZpZWxkIHNob3VsZCBub3QgYmUgdGhlIHswfSB0eXBlIChFSkIgMi4wOiA3LjQuMSkuCi0KLUNIS0oyNDUzLnNiLmkuZWpiMjA9Q0hLSjI0NTNXOiBUcmFuc2llbnQgZmllbGRzICh7MH0pIGFyZSBkaXNjb3VyYWdlZCAoRUpCIDIuMDogNy40LjEpLgotQ0hLSjI0NTMuc2IubS5lamIyMD1DSEtKMjQ1M1c6IFRyYW5zaWVudCBmaWVsZHMgYXJlIGRpc2NvdXJhZ2VkIChFSkIgMi4wOiA3LjQuMSkuCi0KLSMgQ01SIGFuZCBDTVAgZmllbGRzIG11c3QgTk9UIGJlIGRlZmluZWQgb24gdGhlIGJlYW4gY2xhc3MuCi1DSEtKMjQ1NC5jYi5pLmVqYjIwPUNIS0oyNDU0VzogezB9IG11c3Qgbm90IGJlIGRlZmluZWQgKEVKQiAyLjA6IDEwLjMuMSkuCi1DSEtKMjQ1NC5jYi5tLmVqYjIwPUNIS0oyNDU0VzogezB9IG11c3Qgbm90IGJlIGRlZmluZWQgKEVKQiAyLjA6IDEwLjMuMSkuCi0KLUNIS0oyNDgwLmNiLmkuZWpiMjA9Q0hLSjI0ODBJOiB7MH0gbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciAoRUpCIDIuMDogMTAuMy4xKS4KLUNIS0oyNDgwLmNiLm0uZWpiMjA9Q0hLSjI0ODBJOiB7MH0gbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciAoRUpCIDIuMDogMTAuMy4xKS4KLQotQ0hLSjI0ODEuY2IuaS5lamIyMD1DSEtKMjQ4MVc6IHswfSBtdXN0IGJlIGRlY2xhcmVkIGFzIGEgPGNtcC1maWVsZD4gKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMykuCi1DSEtKMjQ4MS5jYi5tLmVqYjIwPUNIS0oyNDgxVzogezB9IG11c3QgYmUgZGVjbGFyZWQgYXMgYSA8Y21wLWZpZWxkPiAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEzKS4KLQotQ0hLSjI0ODIuY2IuaS5lamIyMD1DSEtKMjQ4Mlc6IHswfSBtdXN0IGJlIGRlY2xhcmVkIGFzIGEgPGNtci1maWVsZD4gKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMykuCi1DSEtKMjQ4Mi5jYi5tLmVqYjIwPUNIS0oyNDgyVzogezB9IG11c3QgYmUgZGVjbGFyZWQgYXMgYSA8Y21yLWZpZWxkPiAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEzKS4KLQotQ0hLSjI0ODMuY2IuaS5lamIyMD1DSEtKMjQ4M1c6IHswfSBzaG91bGQgbm90IGJlIGV4cG9zZWQgKEVKQiAyLjA6IDEwLjMuMSkuCi1DSEtKMjQ4My5jYi5tLmVqYjIwPUNIS0oyNDgzVzogezB9IHNob3VsZCBub3QgYmUgZXhwb3NlZCAoRUpCIDIuMDogMTAuMy4xKS4KLQotQ0hLSjI0ODQuY2IuaS5lamIyMD1DSEtKMjQ4NFc6IHswfSBtdXN0IGJlIGVpdGhlciBhIHByaW1pdGl2ZSBvciBhIHNlcmlhbGl6YWJsZSB0eXBlIChFSkIgMi4wOiAxMC4zLjEpLgotQ0hLSjI0ODQuY2IubS5lamIyMD1DSEtKMjQ4NFc6IHswfSBtdXN0IGJlIGVpdGhlciBhIHByaW1pdGl2ZSBvciBhIHNlcmlhbGl6YWJsZSB0eXBlIChFSkIgMi4wOiAxMC4zLjEpLgotCi1DSEtKMjQ4OS5jYi5pLmVqYjIwPUNIS0oyNDg5VzogRmllbGQgezB9IG11c3QgYmUgdGhlIHsxfSB0eXBlIChFSkIgMi4wOiAxMC44LjEpLgotQ0hLSjI0ODkuY2IubS5lamIyMD1DSEtKMjQ4OVc6IFRoaXMgZmllbGQgbXVzdCBiZSB0aGUgezB9IHR5cGUgKEVKQiAyLjA6IDEwLjguMSkuCi0KLUNIS0oyMjA1LmtjLmkuZWpiMjA9Q0hLSjIyMDVXOiBGaWVsZCB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjguMikuCi1DSEtKMjIwNS5rYy5tLmVqYjIwPUNIS0oyMjA1VzogVGhpcyBmaWVsZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuOC4yKS4KLQotQ0hLSjIyMDYua2MuaS5lamIyMD1DSEtKMjIwNlc6IEZpZWxkIHswfSBtdXN0IGJlIGEgPGNtcC1maWVsZD4gKEVKQiAyLjA6IDEwLjguMikuCi1DSEtKMjIwNi5rYy5tLmVqYjIwPUNIS0oyMjA2VzogVGhpcyBmaWVsZCBtdXN0IGJlIGEgPGNtcC1maWVsZD4gKEVKQiAyLjA6IDEwLjguMikuCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBERAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DSEtKMjg4MC5zLmVqYjIwPUNIS0oyODgwVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxsb2NhbC1ob21lPiAoRUpCIDIuMDogNy4xMC4xKS4KLUNIS0oyODgxLnMuZWpiMjA9Q0hLSjI4ODFXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGhvbWU+IChFSkIgMi4wOiA3LjEwLjEpLgotQ0hLSjI4ODIucy5lamIyMD1DSEtKMjg4Mlc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8bG9jYWw+IChFSkIgMi4wOiA3LjEwLjEpLgotQ0hLSjI4ODMucy5lamIyMD1DSEtKMjg4M1c6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8cmVtb3RlPiAoRUpCIDIuMDogNy4xMC4xKS4KLUNIS0oyODg0LnMuZWpiMjA9Q0hLSjI4ODRXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGVpdGhlciBhIDxsb2NhbC1ob21lPiBvciBhIDxob21lPiAoRUpCIDIuMDogNy4xMC4xKS4KLUNIS0oyODg1LnMuZWpiMjA9Q0hLSjI4ODVXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGVpdGhlciBhIDxsb2NhbD4gb3IgYSA8cmVtb3RlPiAoRUpCIDIuMDogNy4xMC4xKS4KLUNIS0oyODgwLmMuZWpiMjA9Q0hLSjI4ODBXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGxvY2FsLWhvbWU+IChFSkIgMi4wOiAxMC42LjEpLgotQ0hLSjI4ODEuYy5lamIyMD1DSEtKMjg4MVc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8aG9tZT4gKEVKQiAyLjA6IDEwLjYuMSkuCi1DSEtKMjg4Mi5jLmVqYjIwPUNIS0oyODgyVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxsb2NhbD4gKEVKQiAyLjA6IDEwLjYuMSkuCi1DSEtKMjg4My5jLmVqYjIwPUNIS0oyODgzVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxyZW1vdGU+IChFSkIgMi4wOiAxMC42LjEpLgotQ0hLSjI4ODQuYy5lamIyMD1DSEtKMjg4NFc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgZWl0aGVyIGEgPGxvY2FsLWhvbWU+IG9yIGEgPGhvbWU+IChFSkIgMi4wOiAxMC42LjEpLgotQ0hLSjI4ODUuYy5lamIyMD1DSEtKMjg4NVc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgZWl0aGVyIGEgPGxvY2FsPiBvciBhIDxyZW1vdGU+IChFSkIgMi4wOiAxMC42LjEpLgotQ0hLSjI4ODAuYi5lamIyMD1DSEtKMjg4MFc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8bG9jYWwtaG9tZT4gKEVKQiAyLjA6IDEyLjIuMSkuCi1DSEtKMjg4MS5iLmVqYjIwPUNIS0oyODgxVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxob21lPiAoRUpCIDIuMDogMTIuMi4xKS4KLUNIS0oyODgyLmIuZWpiMjA9Q0hLSjI4ODJXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGxvY2FsPiAoRUpCIDIuMDogMTIuMi4xKS4KLUNIS0oyODgzLmIuZWpiMjA9Q0hLSjI4ODNXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPHJlbW90ZT4gKEVKQiAyLjA6IDEyLjIuMSkuCi1DSEtKMjg4NC5iLmVqYjIwPUNIS0oyODg0VzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSA8bG9jYWwtaG9tZT4gb3IgYSA8aG9tZT4gKEVKQiAyLjA6IDEyLjIuMSkuCi1DSEtKMjg4NS5iLmVqYjIwPUNIS0oyODg1VzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSA8bG9jYWw+IG9yIGEgPHJlbW90ZT4gKEVKQiAyLjA6IDEyLjIuMSkuCi0KLUNIS0oyODEzLmVqYjIwPUNIS0oyODEzSTogPGVqYi1uYW1lPiB7MH0gbXVzdCBiZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllciAoRUpCIDIuMDogMTAuMy4xMywgMTEuMi42LjEpLgotQ0hLSjI4MTkuZWpiMjA9Q0hLSjI4MTlJOiA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+IHswfSBtdXN0IGJlIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIChFSkIgMi4wOiAxMC4zLjEzLCAxMC42LjE0LCAxMS4yLjYuMSkuCi1DSEtKMjg1NC5lamIyMD1DSEtKMjg1NEU6IDxhYnN0cmFjdC1zY2hlbWEtbmFtZT4gezB9IG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphci54bWwgZmlsZSAoRUpCIDIuMDogMTAuMy4xMywgMTAuNi4xNCwgMTEuMi4yKS4KLUNIS0oyODU4LmVqYjIwPUNIS0oyODU4VzogPGFic3RyYWN0LXNjaGVtYS1uYW1lPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODU5LmVqYjIwPUNIS0oyODU5VzogUmVzZXJ2ZWQgaWRlbnRpZmllciB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYW4gPGVqYi1uYW1lPiAoRUpCIDIuMDogMTAuNi4xNCwgMTEuMi42LjEpLgotQ0hLSjI4NjAuZWpiMjA9Q0hLSjI4NjBXOiBSZXNlcnZlZCBpZGVudGlmaWVyIHswfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+IChFSkIgMi4wOiAxMC42LjE0LCAxMS4yLjYuMSkuCi0KLUNIS0oyODYxLmVqYjIwPUNIS0oyODYxSTogPGNtcC1maWVsZD4gezB9IG11c3QgYmUgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIgYW5kIGJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIChFSkIgMi4wOiAxMC4zLjEsIDExLjIuNi4xKS4KLUNIS0oyODU3LmVqYjIwPUNIS0oyODU3STogPGNtci1maWVsZD4gezB9IG11c3QgYmUgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIgYW5kIGJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIChFSkIgMi4wOiAxMC4zLjEsIDExLjIuNi4xKS4KLQotQ0hLSjI4NjIuZWpiMjA9Q0hLSjI4NjJJOiA8Y21wLWZpZWxkPiB7MH0gbXVzdCBoYXZlIGEgc2V0IG1ldGhvZCAoRUpCIDIuMDogMTAuMy4xLCAxMC42LjIpLgotQ0hLSjI4NjMuZWpiMjA9Q0hLSjI4NjNJOiA8Y21wLWZpZWxkPiB7MH0gbXVzdCBoYXZlIGEgZ2V0IG1ldGhvZCAoRUpCIDIuMDogMTAuMy4xLCAxMC42LjIpLgotQ0hLSjI4NjQuZWpiMjA9Q0hLSjI4NjRJOiA8Y21yLWZpZWxkPiB7MH0gbXVzdCBoYXZlIGEgc2V0IG1ldGhvZCAoRUpCIDIuMDogMTAuMy4xLCAxMC42LjIpLgotQ0hLSjI4NjUuZWpiMjA9Q0hLSjI4NjVJOiA8Y21yLWZpZWxkPiB7MH0gbXVzdCBoYXZlIGEgZ2V0IG1ldGhvZCAoRUpCIDIuMDogMTAuMy4xLCAxMC42LjIpLgotQ0hLSjI4NTUuZWpiMjA9Q0hLSjI4NTVJOiA8Y21wLWZpZWxkPiB7MH0gbXVzdCBiZSBhIEphdmEgcHJpbWl0aXZlIG9yIGEgSmF2YSBzZXJpYWxpemFibGUgdHlwZSAoRUpCIDIuMDogMTAuMy4xKS4KLUNIS0oyODU2LmVqYjIwPUNIS0oyODU2STogPGNtci1maWVsZD4gezB9IG11c3QgYmUgdGhlIHsxfSB0eXBlIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiAxMC4zLjEpLgotCi1DSEtKMjgxNS5lamIyMD1DSEtKMjgxNVc6IERlcGVuZGVudCB2YWx1ZSBjbGFzcyB7MH0gY2Fubm90IGJlIGEgPGNtci1maWVsZD4gKEVKQiAyLjA6IDEwLjMuMykuCi0KLUNIS0oyODE2LmVqYjIwPUNIS0oyODE2STogPGVqYi1yZWxhdGlvbi1uYW1lPiBtdXN0IGJlIHVuaXF1ZSBpbiBlamItamFyLnhtbCAoRUpCIDIuMDogMTAuMy4yLCAxMC4zLjEzLCAyMi41KS4KLUNIS0oyODE3LmVqYjIwPUNIS0oyODE3STogPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gPGVqYi1yZWxhdGlvbj4gKEVKQiAyLjA6IDEwLjMuMiwgMTAuMy4xMywgMjIuNSkuCi1DSEtKMjgxOC5lamIyMD1DSEtKMjgxOEk6IFRoZSB2YWx1ZSBvZiB0aGUgPG11bHRpcGxpY2l0eT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiT25lIiBvciAiTWFueSIgKEVKQiAyLjA6IDEwLjMuMiwgMTAuMy4xMywgMjIuNSkuCi1DSEtKMjgyMS5lamIyMD1DSEtKMjgyMUk6IDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+IGluIHJvbGUgezB9IG11c3QgcmVmZXIgdG8gYW4gZXhpc3RpbmcgQ01QIGJlYW4gKEVKQiAyLjA6IDEwLjMuMiwgMjIuNSkuCi1DSEtKMjg0OC5lamIyMD1DSEtKMjg0OEk6IDxjYXNjYWRlLWRlbGV0ZT4gbXVzdCBiZSB1c2VkIHdpdGggYSA8bXVsdGlwbGljaXR5PiBvZiAiT25lIiAoRUpCIDIuMDogMTAuMy40LjIsIDIyLjUpLgotQ0hLSjI4NjYuZWpiMjA9Q0hLSjI4NjZJOiA8Y21yLWZpZWxkPiB7MH0gbXVzdCBiZSBkZWZpbmVkIG9uIHsxfSAoRUpCIDIuMDogMTAuMy4yLCAyMi41KS4KLUNIS0oyODY3LmVqYjIwPUNIS0oyODY3STogVGhpcyBiZWFuIGNhbiBoYXZlIG9ubHkgdW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0byBvdGhlciBiZWFucyAoRUpCIDIuMDogMTAuMy4yKS4KLUNIS0oyODY4LmVqYjIwPUNIS0oyODY4STogVGhlIHZhbHVlIG9mIHRoZSA8Y21yLWZpZWxkLXR5cGU+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgImphdmEudXRpbC5Db2xsZWN0aW9uIiBvciAiamF2YS51dGlsLlNldCIgKEVKQiAyLjA6IDEwLjMuMTMsIDIyLjUpLgotQ0hLSjI4NjkuZWpiMjA9Q0hLSjI4NjlJOiBBdCBsZWFzdCBvbmUgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4gbXVzdCBkZWZpbmUgYSA8Y21yLWZpZWxkPiAoRUpCIDIuMDogMTAuMy4yLCAxMC4zLjEzLCAyMi41KS4KLUNIS0oyODcwLmVqYjIwPUNIS0oyODcwSTogPGVqYi1uYW1lPiB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuMy4xMykuCi1DSEtKMjg3MS5lamIyMD1DSEtKMjg3MUk6IDxlamItbmFtZT4gezB9IG11c3QgcmVmZXIgdG8gYSBDTVAgYmVhbiAoRUpCIDIuMDogMTAuMy4yLCAxMC4zLjEzKS4KLQotQ0hLSjI4NzIuZWpiMjA9Q0hLSjI4NzJFOiBUaGUgdmFsdWUgb2YgdGhlIDxjbXAtdmVyc2lvbj4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiMS54IiBvciAiMi54IiAoRUpCIDIuMDogMjIuNSkuCi1DSEtKMjg3My5lamIyMD1DSEtKMjg3M1c6IE1pZ3JhdGUgdGhpcyBiZWFuJ3MgZGF0YXNvdXJjZSBiaW5kaW5nIHRvIGEgQ01QIENvbm5lY3Rpb24gRmFjdG9yeSBiaW5kaW5nLgotQ0hLSjI4NzQuZWpiMjA9Q0hLSjI4NzRXOiBNaWdyYXRlIHRoaXMgRUpCIG1vZHVsZSdzIGRlZmF1bHQgZGF0YXNvdXJjZSBiaW5kaW5nIHRvIGEgZGVmYXVsdCBDTVAgQ29ubmVjdGlvbiBGYWN0b3J5IGJpbmRpbmcuCi0KLUNIS0oyODg2LmVqYjIxPUNIS0oyODg1RTogRHVwbGljYXRlIGFjdGl2YXRpb24gY29uZmlnOiAiezB9IiBleGlzdCBpbiBtZXNzYWdlIGRyaXZlbiBiZWFuOiAiezF9Ii4KLUNIS0oyODg3LmVqYjIxPVRoZSBhY3RpdmF0aW9uIGNvbmZpZyB3aXRoIG5hbWU6ICJ7MH0iIGhhcyBpbnZhbGlkIHZhbHVlOiAiezF9IiBmb3IgbWVzc2FnZSBkcml2ZW4gYmVhbjogInsyfSIuCi1DSEtKMjg5MC5lamIyMT1UaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlOiAiezB9IiBhbmQgZGVzdGluYXRpb24gdHlwZSBhY3RpdmF0aW9uIGNvbmZpZyBwcm9wZXJ0eSB2YWx1ZTogInsxfSIgZG8gbm90IG1hdGNoICBmb3IgYmVhbjogInsyfSIuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAyVEM6IERvIG5vdCB0cmFuc2xhdGUgYW55dGhpbmcgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9uLiBUaGVzZSBzdHJpbmdzCi0jICAgICAgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIElnbm9yZSB0aGVzZSBtZXNzYWdlcyBmb3Igbm93OyB0aGUgRUpCIFFMIHZhbGlkYXRvciBtYXkgdGFrZSBjYXJlIG9mIHRoaXMuCi0jIElmIG5vdCwgYWRkIHRoaXMgdmFsaWRhdGlvbiBpbnRvIHRoZSBFSkJKYXJWUnVsZSBjbGFzcy4KLSMKLSMKLSMgSWRlbnRpZmljYXRpb24gdmFyaWFibGVzCi0jCi0jIElXQUQ0OTI3LmVqYjIwPUlXQUQ0OTI3VzogSWRlbnRpZmljYXRpb24gdmFyaWFibGUgezB9IG11c3QgYmUgZGVjbGFyZWQgaW4gdGhlIEZST00gY2xhdXNlIChFSkIgMi4wOiAxMS4yLjYuMikuCi0jIElXQUQ0OTI4LmVqYjIwPUlXQUQ0OTI4VzogUmVzZXJ2ZWQgaWRlbnRpZmllciB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmljYXRpb24gdmFyaWFibGUgKEVKQiAyLjA6IDExLjIuNi4yKS4KLSMgSVdBRDQ5MjkuZWpiMjA9SVdBRDQ5MjlXOiA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+IHswfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSAoRUpCIDIuMDogMTEuMi42LjIpLgotIyBJV0FENDkzMC5lamIyMD1JV0FENDkzMFc6IDxlamItbmFtZT4gezB9IGNhbm5vdCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIChFSkIgMi4wOiAxMS4yLjYuMikuCi0KLSMKLSMgcXVlcnkgc3RhdGVtZW50Ci0jCi0jIElXQUQ0OTE4LmVqYjIwPUlXQUQ0OTE4VzogVGhpcyBxdWVyeSBtdXN0IGNvbnRhaW4gYSBTRUxFQ1QgY2xhdXNlIChFSkIgMi4wOiAxMS4xKS4KLSMgSVdBRDQ5MTkuZWpiMjA9SVdBRDQ5MTlXOiBUaGlzIHF1ZXJ5IG11c3QgY29udGFpbiBhIEZST00gY2xhdXNlIChFSkIgMi4wOiAxMS4xKS4KLSMgSVdBRDQ5MjAuZWpiMjA9SVdBRDQ5MjBXOiBUaGlzIHF1ZXJ5IGhhcyBhIHN5bnRheCBlcnJvciAoRUpCIDIuMDogMTEuMikuCi0jCi0KLQotIyBJV0FENDgwOC5lamIyMD1JV0FENDgwOFc6IFRoaXMgYmVhbiBtdXN0IHVzZSBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiAoRUpCIDIuMDogMTcuMy4xLCAxNy4zLjMpLgotIyBJV0FENDgwOS5lamIyMD1JV0FENDgwOVc6IFNwZWNpZnkgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgZm9yIHRoaXMgbWV0aG9kIChFSkIgMi4wOiAxNy40LjEpLgotIyBJV0FENDgxMC5lamIyMD1JV0FENDgxMFc6IEEgdHJhbnNhY3Rpb24gYXR0cmlidXRlIG11c3Qgbm90IGV4aXN0IGZvciB0aGlzIG1ldGhvZCAoRUpCIDIuMDogMTcuNC4xKS4KLQotIyBJV0FENDgxMS5lamIyMD1JV0FENDgxMVc6IEF0IGxlYXN0IG9uZSA8bWV0aG9kPiBtdXN0IGV4aXN0IGluIGEgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4gKEVKQiAyLjA6IDE3LjQuMSkuCi0jIElXQUQ0OTAwLmVqYjIwPUlXQUQ0OTAwVzogVGhpcyA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPiBtdXN0IHJlZmVyZW5jZSBvbmx5IG9uZSBiZWFuIChFSkIgMi4wOiAxNy40LjEpLgotIyBJV0FENDkwMS5lamIyMD1JV0FENDkwMVc6IHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxNy40LjEpCi0jIElXQUQ0ODE1LmVqYjIwPUlXQUQ0ODE1VzogTm8gbWV0aG9kcyBvbiB7MH0gbWF0Y2ggdGhpcyA8bWV0aG9kPiAoRUpCIDIuMDogMTcuNC4xKS4KLSMgSVdBRDQ4MTcuZWpiMjA9SVdBRDQ4MTdXOiA8dHJhbnMtYXR0cmlidXRlPiBpcyB1bmtub3duIChFSkIgMi4wOiAxNy40LjEpLgotIyBJV0FENDgxOC5lamIyMD1JV0FENDgxOFc6IE9ubHkgb25lIFN0eWxlIDEgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4gbWF5IGV4aXN0IGZvciB7MH0gKEVKQiAyLjA6IDE3LjQuMSkuCi0jIElXQUQ0ODE5LmVqYjIwPUlXQUQ0ODE5VzogT25seSBvbmUgU3R5bGUgMiA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPiBtYXkgZXhpc3QgZm9yIHswfSAoRUpCIDIuMDogMTcuNC4xKS4KLSMgSVdBRDQ4MjAuZWpiMjA9SVdBRDQ4MjBXOiBBdCBsZWFzdCBvbmUgPG1ldGhvZC1wYXJhbT4gbXVzdCBleGlzdCBpbiBhIDxtZXRob2QtcGFyYW1zPi4KLQotIyBJV0FENDgyMS5lamIyMD1JV0FENDgyMVc6IDxlbnYtZW50cnktdmFsdWU+IG11c3QgYmUgYSB7MH0gKEVKQiAyLjA6IDIwLjIuMS4yLCAyMi41KS4KLSMgSVdBRDQ4MjIuZWpiMjA9SVdBRDQ4MjJXOiA8ZW52LWVudHJ5LW5hbWU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIwLjIuMS4yLCAyMi41KS4KLSMgSVdBRDQ4MjMuZWpiMjA9SVdBRDQ4MjNXOiA8ZW52LWVudHJ5LXR5cGU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIwLjIuMS4yLCAyMi41KS4KLSMgSVdBRDQ4MjQuZWpiMjA9SVdBRDQ4MjRXOiA8ZW52LWVudHJ5LW5hbWU+IG11c3QgYmUgdW5pcXVlIHdpdGhpbiB7MH0gKEVKQiAyLjA6IDIwLjIuMS4yKS4KLSMgSVdBRDQ4MjUuZWpiMjA9SVdBRDQ4MjVXOiA8ZW52LWVudHJ5LXR5cGU+IG11c3QgYmUgYSBsZWdhbCB0eXBlIChFSkIgMi4wOiAyMC4yLjEuMiwgMjIuNSkuCi0jIElXQUQ0ODI2LmVqYjIwPUlXQUQ0ODI2VzogPGVudi1lbnRyeS12YWx1ZT4gbXVzdCBiZSBhIFN0cmluZyBvciBhIGNoYXJhY3RlciAoRUpCIDIuMDogMjAuMi4xLjIpLgotCi0jIElXQUQ0ODI4LmVqYjIwPUlXQUQ0ODI4VzogQ29udmVudGlvbmFsbHkgdGhpcyByZWZlcmVuY2UgaXMgbG9jYXRlZCBpbiB0aGUgImVqYiIgc3ViY29udGV4dCAoRUpCIDIuMDogMjAuMy4xLjEsIDIyLjUpLgotIyBJV0FENDgyOS5lamIyMD1JV0FENDgyOVc6IFRoaXMgPGVudi1lbnRyeT4gc2hvdWxkIGJlIGluIGFuIDxlamItcmVmPiAoRUpCIDIuMDogMjAuMy4xLjIpLgotIyBJV0FENDgzMC5lamIyMD1JV0FENDgzMFc6IFRoaXMgPGVudi1lbnRyeT4gc2hvdWxkIGJlIGluIGFuIDxlamItbG9jYWwtcmVmPiAoRUpCIDIuMDogMjAuMy4xLjIpLgotIyBJV0FENDgzMS5lamIyMD1JV0FENDgzMVc6IDxlamItcmVmLXR5cGU+IG11c3QgYmUgezB9IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4MzIuZWpiMjA9SVdBRDQ4MzJXOiA8ZWpiLXJlZj4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMy4xLjIsIDIwLjMuMikuCi0jIElXQUQ0ODMzLmVqYjIwPUlXQUQ0ODMzVzogPGVqYi1sb2NhbC1yZWY+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIwLjMuMS4yLCAyMC4zLjIpLgotIyBJV0FENDgzNC5lamIyMD1JV0FENDgzNFc6IDxob21lPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4MzUuZWpiMjA9SVdBRDQ4MzVXOiA8bG9jYWwtaG9tZT4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMy4xLjIsIDIwLjMuMikuCi0jIElXQUQ0ODM2LmVqYjIwPUlXQUQ0ODM2VzogPHJlbW90ZT4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMy4xLjIsIDIwLjMuMikuCi0jIElXQUQ0ODM3LmVqYjIwPUlXQUQ0ODM3VzogPGxvY2FsLXJlbW90ZT4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMy4xLjIsIDIwLjMuMikuCi0jIElXQUQ0ODM4LmVqYjIwPUlXQUQ0ODM4VzogPGVqYi1yZWY+IG11c3QgYmUgdW5pcXVlIHdpdGhpbiB7MH0gKEVKQiAyLjA6IDIwLjMuMS4yKS4KLSMgSVdBRDQ4MzkuZWpiMjA9SVdBRDQ4MzlXOiA8ZWpiLWxvY2FsLXJlZj4gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHswfSAoRUpCIDIuMDogMjAuMy4xLjIpLgotIyBJV0FENDg0MC5lamIyMD1JV0FENDg0MFc6IDxob21lPiB7MH0gaXMgbm90IHVzZWQgYnkgYmVhbiB7MX0gKEVKQiAyLjA6IDIwLjMuMS4yLCAyMC4zLjIpLgotIyBJV0FENDg0MS5lamIyMD1JV0FENDg0MVc6IDxyZW1vdGU+IHswfSBpcyBub3QgdXNlZCBieSBiZWFuIHsxfSAoRUpCIDIuMDogMjAuMy4xLjIsIDIwLjMuMikuCi0jIElXQUQ0ODQyLmVqYjIwPUlXQUQ0ODQyVzogPGVqYi1saW5rPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4zLjEuMikuCi0KLSMgSVdBRDQ4NDMuZWpiMjA9SVdBRDQ4NDNXOiBUaGlzIDxlbnYtZW50cnk+IG11c3QgYmUgYSA8cmVzb3VyY2UtcmVmPiAoRUpCIDIuMDogMjAuNC4xLjIpLgotIyBJV0FENDg0NC5lamIyMD1JV0FENDg0NFc6IDxyZXMtcmVmLW5hbWU+IHNob3VsZCBub3QgaW5jbHVkZSB0aGUgImphdmE6Y29tL2Vudi8iIHN0cmluZyAoRUpCIDIuMDogMjAuNC4xLjIpLgotIyBJV0FENDg0NS5lamIyMD1JV0FENDg0NVc6IDxyZXMtYXV0aD4gbXVzdCBiZSAiQXBwbGljYXRpb24iIG9yICJDb250YWluZXIiIChFSkIgMi4wOiAyMC40LjEuMikuCi0jIElXQUQ0ODQ2LmVqYjIwPUlXQUQ0ODQ2VzogPHJlcy1zaGFyaW5nLXNjb3BlPiBtdXN0IGJlICJTaGFyZWFibGUiIG9yICJVbnNoYXJlYWJsZSIgKEVKQiAyLjA6IDIwLjQuMS4yKS4KLSMgSVdBRDQ4NDcuZWpiMjA9SVdBRDQ4NDdXOiA8cmVzb3VyY2UtcmVmPiBtdXN0IGJlIHVuaXF1ZSBpbiBiZWFuIHswfSAoRUpCIDIuMDogMjAuNC4xLjIpLgotCi0jIElXQUQ0ODQ4LmVqYjIwPUlXQUQ0ODQ4VzogQ29udmVudGlvbmFsbHkgdGhpcyBpcyBsb2NhdGVkIGluIHRoZSAiamF2YTpjb21wL2Vudi9qZGJjIiBzdWJjb250ZXh0IChFSkIgMi4wOiAyMC40LjEuMywgMjAuNS4xLjEpLgotIyBJV0FENDg0OS5lamIyMD1JV0FENDg0OVc6IENvbnZlbnRpb25hbGx5IHRoaXMgaXMgbG9jYXRlZCBpbiB0aGUgImphdmE6Y29tcC9lbnYvam1zIiBzdWJjb250ZXh0IChFSkIgMi4wOiAyMC40LjEuMywgMjAuNS4xLjEpLgotIyBJV0FENDg1MC5lamIyMD1JV0FENDg1MFc6IENvbnZlbnRpb25hbGx5IHRoaXMgaXMgbG9jYXRlZCBpbiB0aGUgImphdmE6Y29tcC9lbnYvbWFpbCIgc3ViY29udGV4dCAoRUpCIDIuMDogMjAuNC4xLjMsIDIwLjUuMS4xKS4KLSMgSVdBRDQ4NTEuZWpiMjA9SVdBRDQ4NTFXOiBDb252ZW50aW9uYWxseSB0aGlzIGlzIGxvY2F0ZWQgaW4gdGhlICJqYXZhOmNvbXAvZW52L3VybCIgc3ViY29udGV4dCAoRUpCIDIuMDogMjAuNC4xLjMsIDIwLjUuMS4xKS4KLQotIyBJV0FENDg1Mi5lamIyMD1JV0FENDg1Mlc6IFRoaXMgPGVudi1lbnRyeT4gbXVzdCBiZSBhIDxyZXNvdXJjZS1lbnYtcmVmPiAoRUpCIDIuMDogMjAuNS4xLjIpLgotIyBJV0FENDg1My5lamIyMD1JV0FENDg1M1c6IDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+IHNob3VsZCBub3QgaW5jbHVkZSB0aGUgImphdmE6Y29tcC9lbnYiIHN0cmluZyAoRUpCIDIuMDogMjAuNS4xLjIpLgotIyBJV0FENDg1NC5lamIyMD1JV0FENDg1NFc6IEEgSk1TIERlc3RpbmF0aW9uIHZhbHVlIG11c3QgYmUgZWl0aGVyIGphdmF4Lmptcy5RdWV1ZSBvciBqYXZheC5qbXMuVG9waWMgKEVKQiAyLjA6IDIwLjUuMS4yKS4KLSMgSVdBRDQ4NTUuZWpiMjA9SVdBRDQ4NTVXOiA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPiBtdXN0IGJlIHVuaXF1ZSBpbiBiZWFuIHswfSAoRUpCIDIuMDogMjAuNS4xLjIpLgotCi0jIElXQUQ0ODU2LmVqYjIwPUlXQUQ0ODU2VzogQSA8cm9sZS1uYW1lPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMS4yLjUuMykuCi0jIElXQUQ0ODU3LmVqYjIwPUlXQUQ0ODU3VzogPHJvbGUtbmFtZT4gezB9IG11c3QgYmUgdW5pcXVlIHdpdGhpbiBiZWFuIHsxfSAoRUpCIDIuMDogMjEuMi41LjMpLgotIyBJV0FENDg1OC5lamIyMD1JV0FENDg1OFc6IEEgPHJvbGUtbmFtZT4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjEuMy4xKS4KLSMgSVdBRDQ4NTkuZWpiMjA9SVdBRDQ4NTlXOiA8cm9sZS1uYW1lPiB7MH0gbXVzdCBiZSB1bmlxdWUgd2l0aGluIGJlYW4gezF9IChFSkIgMi4wOiAyMS4zLjEpLgotIyBJV0FENDg2MC5lamIyMD1JV0FENDg2MFc6IFNlY3VyaXR5IHJvbGVzIG11c3QgZXhpc3QgKEVKQiAyLjA6IDIxLjMuMSkuCi0KLSMgSVdBRDQ5MzEuZWpiMjA9SVdBRDQ5MzFXOiBBdCBsZWFzdCBvbmUgPG1ldGhvZD4gbXVzdCBleGlzdCBpbiBhIDxtZXRob2QtcGVybWlzc2lvbj4gKEVKQiAyLjA6IDIxLjMuMikuCi0jIElXQUQ0OTMyLmVqYjIwPUlXQUQ0OTMyVzogezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIxLjMuMikgKEVKQiAyLjA6IDE3LjQuMSkuCi0jIElXQUQ0OTMzLmVqYjIwPUlXQUQ0OTMzVzogTm8gbWV0aG9kcyBvbiB7MH0gbWF0Y2ggdGhpcyA8bWV0aG9kPiAoRUpCIDIuMDogMjEuMy4yKS4KLSMgSVdBRDQ5MzQuZWpiMjA9SVdBRDQ5MzRXOiBBdCBsZWFzdCBvbmUgPG1ldGhvZC1wYXJhbT4gbXVzdCBleGlzdCBpbiBhIDxtZXRob2QtcGFyYW1zPi4KLQotIyBJV0FENDg2Ni5lamIyMD1JV0FENDg2Nlc6IEEgPHJvbGUtbGluaz4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjEuMy4zKS4KLSMgSVdBRDQ4NjcuZWpiMjA9SVdBRDQ4NjdXOiBUaGlzIDxyb2xlLWxpbms+IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAyMS4zLjMpLgotIyBJV0FENDg2OC5lamIyMD1JV0FENDg2OFc6IHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMS4zLjMpLgotCi0jIElXQUQ0ODY5LmVqYjIwPUlXQUQ0ODY5VzogPHNlY3VyaXR5LWlkZW50aXR5PiBtdXN0IGJlIGVpdGhlciAidXNlLWNhbGxlci1pZGVudGl0eSIgb3IgInJ1bi1hcyIgKEVKQiAyLjA6IDIxLjMuNCkuCi0jIElXQUQ0ODcwLmVqYjIwPUlXQUQ0ODcwVzogPHNlY3VyaXR5LWlkZW50aXR5PiBtdXN0IGJlICJydW4tYXMiIChFSkIgMi4wOiAyMS4zLjQpLgotIyBJV0FENDg3MS5lamIyMD1JV0FENDg3MVc6IFNlY3VyaXR5IHJvbGUgezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIxLjMuNC4xKS4KLQotIyBJV0FENDg3NS5lamIyMD1JV0FENDg3NVc6IDxzZXNzaW9uLXR5cGU+IG11c3QgYmUgZWl0aGVyICJTdGF0ZWZ1bCIgb3IgIlN0YXRlbGVzcyIgKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotIyBJV0FENDg3Ni5lamIyMD1JV0FENDg3Nlc6IDx0cmFuc2FjdGlvbi10eXBlPiBtdXN0IGJlIGVpdGhlciAiQmVhbiIgb3IgIkNvbnRhaW5lciIgKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotIyBJV0FENDg3Ny5lamIyMD1JV0FENDg3N1c6IDxwZXJzaXN0ZW5jZS10eXBlPiBtdXN0IGJlIGVpdGhlciAiQmVhbiIgb3IgIkNvbnRhaW5lciIgKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotIyBJV0FENDg3OS5lamIyMD1JV0FENDg3OVc6IEF0IGxlYXN0IG9uZSA8Y21wLWZpZWxkPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLQotIyBJV0FENDg4MC5lamIyMD1JV0FENDg4MFc6IDxhY2tub3dsZWRnZS1tb2RlPiBtdXN0IGJlIGVpdGhlciAiQXV0by1hY2tub3dsZWRnZSIgb3IgIkR1cHMtb2stYWNrbm93bGVkZ2UiIChFSkIgMi4wOiAyMi41KS4KLSMgSVdBRDQ4ODEuZWpiMjA9SVdBRDQ4ODFXOiA8Y2FzY2FkZS1kZWxldGU+IG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAyMi41KS4KLSMgSVdBRDQ4ODIuZWpiMjA9SVdBRDQ4ODJXOiA8Y21wLXZlcnNpb24+IG11c3QgYmUgZWl0aGVyICIxLngiIG9yICIyLngiIChFSkIgMi4wOiAyMi41KS4KLSMgSVdBRDQ4ODMuZWpiMjA9SVdBRDQ4ODNXOiA8Y21yLWZpZWxkLW5hbWU+IG11c3QgZXhpc3Qgb24gezB9IChFSkIgMi4wOiAyMi41KS4KLSMgSVdBRDQ4ODQuZWpiMjA9SVdBRDQ4ODRXOiA8Y21yLWZpZWxkLXR5cGU+IG11c3QgYmUgdGhlIHNhbWUgdHlwZSBhcyB7MH0gKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4NS5lamIyMD1JV0FENDg4NVc6IDxjbXItZmllbGQtdHlwZT4gbXVzdCBiZSBlaXRoZXIgamF2YS51dGlsLkNvbGxlY3Rpb24gb3IgamF2YS51dGlsLlNldCAoRUpCIDIuMDogMjIuNSkuCi0KLSMgSVdBRDQ4ODYuZWpiMjA9SVdBRDQ4ODZXOiA8Y21yLWZpZWxkLW5hbWU+IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg4Ny5lamIyMD1JV0FENDg4N1c6IDxkZXN0aW5hdGlvbi10eXBlPiBtdXN0IGJlIGVpdGhlciBqYXZheC5qbXMuUXVldWUgb3IgamF2YXguam1zLlRvcGljIChFSkIgMi4wOiAyMi41KS4KLSMgSVdBRDQ4ODkuZWpiMjA9SVdBRDQ4ODlXOiB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODkwLmVqYjIwPUlXQUQ0ODkwVzogPGVqYi1yZWYtbmFtZT4gbXVzdCBiZSB1bmlxdWUgaW4gYmVhbiB7MH0gKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg5MS5lamIyMD1JV0FENDg5MVc6IDxlamItcmVmLXR5cGU+IG11c3QgYmUgIkVudGl0eSIgb3IgIlNlc3Npb24iIChFSkIgMi4wOiAyMi41KS4KLQotIyBJV0FENDg2Mi5lamIyMD1JV0FENDg2Mlc6IDxyZXN1bHQtdHlwZS1tYXBwaW5nPiBtdXN0IGJlICJSZW1vdGUiIChFSkIgMi4wOiAxMC41LjcpLgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAyVEM6IGVuZCBvZiBtZXNzYWdlcyB3aGljaCBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBlbmQgb2YgbWVzc2FnZXMgZm9yIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24KLSMKLQotIwotIyBlbmQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcwotIwotCi0jCi0jIEVuZCBFSkIgVmFsaWRhdGlvbiBzdHJpbmdzCi0jCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbGVycm9yY3VzdG9taXphdGlvbi9KMkVFRXJyb3JNZXNzYWdlQ3VzdG9taXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sZXJyb3JjdXN0b21pemF0aW9uL0oyRUVFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYWVhZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sZXJyb3JjdXN0b21pemF0aW9uL0oyRUVFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi54bWxlcnJvcmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRWxlbWVudEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5JRXJyb3JNZXNzYWdlQ3VzdG9taXplcjsKLQotLyoqCi0gKiBBIEoyRUUgbWVzc2FnZSBjdXN0b21pemVyIGZvciB0aGUgWE1MIHZhbGlkYXRvci4gVGhpcyBlcnJvciBjdXN0b21pemVyIHdpbGwKLSAqIGN1c3RvbWl6ZSBlcnJvcnMgb24gYXBwbGljYXRpb24ueG1sLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIgaW1wbGVtZW50cyBJRXJyb3JNZXNzYWdlQ3VzdG9taXplciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIjY3VzdG9taXplTWVzc2FnZShvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRWxlbWVudEluZm9ybWF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pCi0JICovCi0JcHVibGljIFN0cmluZyBjdXN0b21pemVNZXNzYWdlKEVsZW1lbnRJbmZvcm1hdGlvbiBlbGVtZW50SW5mbywgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJaWYgKCJjdmMtY29tcGxleC10eXBlLjIuNC5hIi5lcXVhbHMoZXJyb3JLZXkpIHx8ICJjdmMtY29tcGxleC10eXBlLjIuNC5iIi5lcXVhbHMoZXJyb3JLZXkpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKCJhcHBsaWNhdGlvbiIuZXF1YWxzKGVsZW1lbnRJbmZvLmdldExvY2FsbmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJYm9vbGVhbiBhcHBsaWNhdGlvbkhhc01vZHVsZSA9IGZhbHNlOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRJbmZvLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVsZW1lbnRJbmZvcm1hdGlvbiBjaGlsZCA9IChFbGVtZW50SW5mb3JtYXRpb24pIGkubmV4dCgpOwotCQkJCQlpZiAoIm1vZHVsZSIuZXF1YWxzKGNoaWxkLmdldExvY2FsbmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlhcHBsaWNhdGlvbkhhc01vZHVsZSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWFwcGxpY2F0aW9uSGFzTW9kdWxlKSB7Ci0JCQkJCXJldHVybiBKMkVFWE1MQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzLkoyRUVfQVBQTElDQVRJT05fT05FX09SX01PUkVfTU9EVUxFUzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoImVqYi1qYXIiLmVxdWFscyhlbGVtZW50SW5mby5nZXRMb2NhbG5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWJvb2xlYW4gZWpiSGFzQmVhbnMgPSBmYWxzZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50SW5mby5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQlFbGVtZW50SW5mb3JtYXRpb24gY2hpbGQgPSAoRWxlbWVudEluZm9ybWF0aW9uKSBpLm5leHQoKTsKLQkJCQkJaWYgKCJlbnRlcnByaXNlLWJlYW5zIi5lcXVhbHMoY2hpbGQuZ2V0TG9jYWxuYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVqYkhhc0JlYW5zID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghZWpiSGFzQmVhbnMpIHsKLQkJCQkJcmV0dXJuIEoyRUVYTUxDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMuRUpCX09ORV9PUl9NT1JFX0JFQU5TOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWxlcnJvcmN1c3RvbWl6YXRpb24vSjJFRVhNTEN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sZXJyb3JjdXN0b21pemF0aW9uL0oyRUVYTUxDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4MzM1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWxlcnJvcmN1c3RvbWl6YXRpb24vSjJFRVhNTEN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICogLwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi54bWxlcnJvcmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgVmFsaWRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgSjJFRVhNTEN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi54bWxlcnJvcmN1c3RvbWl6YXRpb24uajJlZXhtbGN1c3RvbXZhbGlkYXRpb24iOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVfQVBQTElDQVRJT05fT05FX09SX01PUkVfTU9EVUxFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFSkJfT05FX09SX01PUkVfQkVBTlM7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSjJFRVhNTEN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBKMkVFWE1MQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbGVycm9yY3VzdG9taXphdGlvbi9qMmVleG1sY3VzdG9tdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sZXJyb3JjdXN0b21pemF0aW9uL2oyZWV4bWxjdXN0b212YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OWZmYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sZXJyb3JjdXN0b21pemF0aW9uL2oyZWV4bWxjdXN0b212YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hLS0gQ29uc3RhbnRzIGZvciBzdHJpbmdzICAKLQotSjJFRV9BUFBMSUNBVElPTl9PTkVfT1JfTU9SRV9NT0RVTEVTID0gQSBKYXZhIEVFIEVudGVycHJpc2UgQXBwbGljYXRpb24gbXVzdCBjb250YWluIG9uZSBvciBtb3JlIG1vZHVsZXMuCi1FSkJfT05FX09SX01PUkVfQkVBTlM9QW4gRUpCIG1vZHVsZSBtdXN0IGNvbnRhaW4gb25lIG9yIG1vcmUgZW50ZXJwcmlzZSBiZWFucy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQk1QSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUJNUEhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODYyYmFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQk1QSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBQk1QSG9tZVZSdWxlIGV4dGVuZHMgQUVudGl0eUhvbWVWUnVsZSB7Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nUmV0dXJuVHlwZU1hdGNoZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBob21lTWV0aG9kLCBNZXRob2QgYmVhbk1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgaG9tZU1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQlpZigobWV0aG9kVHlwZSAmIEZJTkQpICE9IEZJTkQpIHsKLQkJCXN1cGVyLnZhbGlkYXRlTWF0Y2hpbmdSZXR1cm5UeXBlTWF0Y2hlcyh2YywgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIGJlYW5NZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIHsKLQkJCUphdmFIZWxwZXJzIGhvbWVSZXRUeXBlID0gaG9tZU1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQlKYXZhSGVscGVycyBiZWFuUmV0VHlwZSA9IGJlYW5NZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShob21lUmV0VHlwZSwgYmVhblJldFR5cGUpKSB7Ci0JCQkJLy8gZW1pdCB0aGUgZXJyb3Igb25seSBpZiBpdCdzIGEgbXVsdGktZmluZGVyLiBTaW5nbGUtZmluZGVycyBhcmUgc3VwcG9zZWQgdG8gaGF2ZSBkaWZmZXJlbnQgcmV0dXJuIHR5cGVzIG9uIHRoZSBob21lICYgYmVhbiBjbGFzcy4KLQkJCQlib29sZWFuIGhvbWVSZXRUeXBlSXNSZW1vdGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShob21lUmV0VHlwZSwgYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSk7Ci0JCQkJYm9vbGVhbiBob21lUmV0VHlwZUlzTG9jYWwgPSAgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oaG9tZVJldFR5cGUsIGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSk7Ci0JCQkJYm9vbGVhbiBiZWFuUmV0VHlwZUlzS2V5ID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oYmVhblJldFR5cGUsICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKSk7Ci0JCQkJaWYoISgoaG9tZVJldFR5cGVJc1JlbW90ZSB8fCBob21lUmV0VHlwZUlzTG9jYWwpICYmIGJlYW5SZXRUeXBlSXNLZXkpKSB7Ci0JCQkJCVN0cmluZyByZXRUeXBlTmFtZSA9IG51bGw7Ci0JCQkJCWlmKGJlYW5SZXRUeXBlSXNLZXkpIHsKLQkJCQkJCWlmKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCQkJCQlyZXRUeXBlTmFtZSA9IChiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1JFTU9URSA6IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkuZ2V0SmF2YU5hbWUoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJldFR5cGVOYW1lID0gKGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSA9PSBudWxsKSA/IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9MT0NBTCA6IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKS5nZXRKYXZhTmFtZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmV0VHlwZU5hbWUgPSAoYmVhblJldFR5cGUgPT0gbnVsbCkgPyAiPyIgOiBiZWFuUmV0VHlwZS5nZXRKYXZhTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBuZXcgU3RyaW5nW10geyByZXRUeXBlTmFtZX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDlkYmFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFCZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFUeXBlVlJ1bGUgaW1wbGVtZW50cyBJRUpCVHlwZSB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBsb25nW10gQkFTRV9UWVBFUyA9IG5ldyBsb25nW117SVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVH07Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZID0gSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkc7IC8vIERlcHJlY2F0ZWQgdXNlIG9mIFJlbW90ZUV4Y2VwdGlvbi4KLQkKLQlwdWJsaWMgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIEJBU0VfVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0RWpiQ2xhc3MoKTsKLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKSB7Ci0JCXJldHVybiBIRUxQRVI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIWZvbGxvd0Fic3RyYWN0UnVsZXMoY2xhenopKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoIWZvbGxvd1B1YmxpY1J1bGVzKGNsYXp6KSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAyMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZighZm9sbG93RmluYWxSdWxlcyhjbGF6eikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZUFwcGVuZGl4Qih2YywgYmVhbiwgY2xhenopOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0UmVtb3RlSG9tZU1ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFswXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldExvY2FsSG9tZU1ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFsxXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldFJlbW90ZUNvbXBvbmVudE1ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFsyXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldExvY2FsQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzNdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0QmVhbkNsYXNzTWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzRdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBBIGJlYW4gY2xhc3MgbmVlZHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzJyBleHRlbmRlZCBtZXRob2RzOgotCQkvLyAgICAxLiByZW1vdGUgaG9tZQotCQkvLyAgICAyLiBsb2NhbCBob21lCi0JCS8vICAgIDMuIHJlbW90ZSBjb21wb25lbnQKLQkJLy8gICAgNC4gbG9jYWwgY29tcG9uZW50Ci0JCS8vICAgIDUuIGJlYW4gY2xhc3MgKHdoZW4gc2VhcmNoaW5nIGZvciBhIG1hdGNoaW5nIGVqYlBvc3RDcmVhdGUgbWV0aG9kKS4KLQkJLy8gSWYgYSBwYXJ0aWN1bGFyIGJlYW4gZG9lc24ndCB1c2UgYSByZW1vdGUgdmlldyBvciBsb2NhbCB2aWV3LAotCQkvLyB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBhcnJheSB3aWxsIGJlIG51bGwuIAotCQlMaXN0W10gcmVzdWx0ID0gbmV3IExpc3RbNV07Ci0JCUphdmFDbGFzcyByZW1vdGVIb21lID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCWlmKHJlbW90ZUhvbWUgIT0gbnVsbCkgewotCQkJcmVzdWx0WzBdID0gcmVtb3RlSG9tZS5nZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdFswXSA9IG51bGw7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBsb2NhbEhvbWUgPSBiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCQlpZihsb2NhbEhvbWUgIT0gbnVsbCkgewotCQkJcmVzdWx0WzFdID0gbG9jYWxIb21lLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzFdID0gbnVsbDsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIHJlbW90ZUNvbXBvbmVudCA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCWlmKHJlbW90ZUNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbMl0gPSByZW1vdGVDb21wb25lbnQuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMl0gPSBudWxsOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgbG9jYWxDb21wb25lbnQgPSBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCk7Ci0JCWlmKGxvY2FsQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdFszXSA9IGxvY2FsQ29tcG9uZW50LmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzNdID0gbnVsbDsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJaWYoYmVhbkNsYXNzICE9IG51bGwpIHsKLQkJCXJlc3VsdFs0XSA9IGJlYW5DbGFzcy5nZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdFs0XSA9IG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0RmllbGRzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGJlYW4gY2xhc3MnIGZpZWxkIGlzIGRlZmluZWQgb24gYW5vdGhlciBjbGFzcwotCQkvLyBvZiB0aGUgYmVhbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHNob3VsZEJlRmluYWwoSmF2YUNsYXNzIGNsYXp6KTsKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopOwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHNob3VsZEJlQWJzdHJhY3QoSmF2YUNsYXNzIGNsYXp6KTsKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb247Ci0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0VqYkhvbWVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWV0aG9kIG1ldGhvZCkgewotCQkvLyBTZWN0aW9uIG51bWJlciBzdGF0aW5nIHRoaXMgbmFtZSBjb252ZW50aW9uPwotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JCS8vIFN0cmlwIHRoZSAiZWpiSG9tZSIgb2ZmLCBzdHJpcCBvZmYgdGhlIG5leHQgY2hhcmFjdGVyLCBhbmQgcmVwbGFjZSB0aGF0IGNoYXJhY3RlciB3aXRoIGEgbG93ZXJjYXNlIHZlcnNpb24gb2YgdGhhdCBjaGFyYWN0ZXIKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1ldGhvZE5hbWUuY2hhckF0KDApKSk7Ci0JCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoOCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdFamJDcmVhdGVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWV0aG9kIG1ldGhvZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0MpOwotCQkvLyBTdHJpcCB0aGUgImVqYkMiIG9mZiBvZiAiY3JlYXRlIiBhbmQgcmVwbGFjZSB3aXRoICJjIgotCQlidWZmZXIuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDQpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdFamJQb3N0Q3JlYXRlTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1ldGhvZCBtZXRob2QpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9DKTsKLQkJLy8gU3RyaXAgdGhlICJlamJQb3N0QyIgb2ZmIG9mICJjcmVhdGUiIGFuZCByZXBsYWNlIHdpdGggImMiCi0JCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoOCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdFamJGaW5kTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1ldGhvZCBtZXRob2QpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GKTsKLQkJLy8gU3RyaXAgdGhlICJlamJGIiBvZmYgb2YgImVqYkZpbmQiIGFuZCByZXBsYWNlIHdpdGggImYiCi0JCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoNCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdCdXNpbmVzc01ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCX0KLQkKLQkvKgotCSAqIFRoZSBnaXZlbiBtZXRob2QgaXMgbm90IHN1cHBvc2VkIHRvIGhhdmUgYSBtYXRjaGluZyBtZXRob2QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb01hdGNoaW5nTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBzdXBwb3NlZCB0byBoYXZlIGEgbWF0Y2hpbmcgbWV0aG9kCi0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93RmluYWxSdWxlcyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJaWYoc2hvdWxkQmVGaW5hbChjbGF6eikpIHsKLQkJCXJldHVybiBjbGF6ei5pc0ZpbmFsKCk7Ci0JCX0KLQkJcmV0dXJuICFjbGF6ei5pc0ZpbmFsKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGZvbGxvd1B1YmxpY1J1bGVzKEphdmFDbGFzcyBjbGF6eikgewotCQlpZihzaG91bGRCZVB1YmxpYyhjbGF6eikpIHsKLQkJCXJldHVybiBjbGF6ei5pc1B1YmxpYygpOwotCQl9Ci0JCXJldHVybiAhY2xhenouaXNQdWJsaWMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93QWJzdHJhY3RSdWxlcyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJaWYoc2hvdWxkQmVBYnN0cmFjdChjbGF6eikpIHsKLQkJCXJldHVybiBjbGF6ei5pc0Fic3RyYWN0KCk7Ci0JCX0KLQkJcmV0dXJuICFjbGF6ei5pc0Fic3RyYWN0KCk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQyMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQyMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MjMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlKYXZhSGVscGVycyByZXRUeXBlID0gZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShiZWFuLCBtZXRob2QpOwotCQlpZigocmV0VHlwZSA9PSBudWxsKSB8fCAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIHJldFR5cGUpKSkgewotCQkJU3RyaW5nIHJldFR5cGVOYW1lID0gKHJldFR5cGUgPT0gbnVsbCkgPyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShiZWFuLCBtZXRob2QpIDogcmV0VHlwZS5nZXRKYXZhTmFtZSgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDI0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde3JldFR5cGVOYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJdmFsaWRhdGVSTUlfSUlPUFR5cGVSdWxlcyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRydWUpOwotCi0JCWlmKHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kRXhjZXB0aW9ucygpKSB7Ci0JCQlpZighZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kRXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDI2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDI3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQyOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKCFtZXRob2QuaXNWb2lkKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNV9lamJQb3N0Q3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYoIWZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJQb3N0Q3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlRWpiSG9tZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MzEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZihtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDM5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJdmFsaWRhdGVSTUlfSUlPUFR5cGVSdWxlcyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRydWUpOwotCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiSG9tZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gImVqYkhvbWUiIGlzIDcgY2hhcmFjdGVycwotCQkvLyBtZXRob2Qgd2lsbCBmb2xsb3cgdGhlIGNvbnZlbnRpb24sICJlamJIb21lIiArIENoYXIudG9VcHBlcigwKSArIHN1YnN0cmluZygxKSwgc28gcmV2ZXJzZSB0aGF0IGNvbnZlbnRpb24gaGVyZQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtZXRob2QuZ2V0TmFtZSgpLmNoYXJBdCg3KSkpOyAvLyBwdXQgdGhlIGNoYXJhY3RlciBiYWNrIGludG8gbG93ZXItY2FzZQotCQlidWZmZXIuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDgpKTsgLy8gc3Vic3RyaW5nIHN0YXJ0cyBhdCB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZyAiZWpiSG9tZSIgYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgLS0gc3Vic3RyaW5nIGlzIDAgaW5kZXhlZAotCQlTdHJpbmcgbWV0aG9kVG9NYXRjaE5hbWUgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCi0JCU1ldGhvZCBtYXRjaGluZ1JlbW90ZUhvbWVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kVG9NYXRjaE5hbWUsIGdldFJlbW90ZUhvbWVNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYobWF0Y2hpbmdSZW1vdGVIb21lTWV0aG9kICE9IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTWV0aG9kIG1hdGNoaW5nTG9jYWxIb21lTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIG1ldGhvZFRvTWF0Y2hOYW1lLCBnZXRMb2NhbEhvbWVNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYobWF0Y2hpbmdMb2NhbEhvbWVNZXRob2QgIT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MzAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117bWV0aG9kVG9NYXRjaE5hbWV9LCB0aGlzKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVCdXNpbmVzc01ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gSVdBRDQwNDggPSBCdXNpbmVzcyBtZXRob2RzIG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIuIFJlYWQgc2VjdGlvbiA3LjEwLjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQyMDEgPSBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIuIFJlYWQgc2VjdGlvbiAxMC42Ljggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQzMTcgPSBUaGUgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIi4gUmVhZCBzZWN0aW9uIDEyLjIuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9FSkIpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDExLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0MDQ5ID0gVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIFJlYWQgc2VjdGlvbiA3LjEwLjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQyMDIgPSBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gUmVhZCBzZWN0aW9uIDEwLjYuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMxOCA9IFRoZSBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIFJlYWQgc2VjdGlvbiAxMi4yLjcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsJCQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQwNTAgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gUmVhZCBzZWN0aW9uIDcuMTAuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDIwMyA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiBSZWFkIHNlY3Rpb24gMTAuNi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MzE5ID0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gUmVhZCBzZWN0aW9uIDEyLjIuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZihtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsJCQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQwNTEgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIFJlYWQgc2VjdGlvbiA3LjEwLjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQyMDQgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIFJlYWQgc2VjdGlvbiAxMC42Ljggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQzMjAgPSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gUmVhZCBzZWN0aW9uIDEyLjIuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZihtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0MDUyID0gezB9IG11c3QgYmUgYSBsZWdhbCBSTUktSUlPUCB0eXBlLiBSZWFkIHNlY3Rpb24gNy4xMC40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjA1ID0gezB9IG11c3QgYmUgYSBsZWdhbCBSTUktSUlPUCB0eXBlLiBSZWFkIHNlY3Rpb24gMTAuNi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MzIxID0gezB9IG11c3QgYmUgYSBsZWdhbCB0eXBlIGZvciBSTUktSUlPUC4gUmVhZCBzZWN0aW9uIDEyLjIuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQl2YWxpZGF0ZVJNSV9JSU9QVHlwZVJ1bGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdHJ1ZSk7Ci0JCQotCQkvLyBJV0FENDA1MyA9IFRoaXMgbWV0aG9kIGNhbm5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiA3LjEwLjQsIDE4LjMuOCwgMTguNiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDIwNiA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEwLjYuOCwgMTguMy44LCAxOC42IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MzIyID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTIuMi43LCAxOC4zLjgsIDE4LjYgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIWZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19idXMsIGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsJCQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJdmFsaWRhdGVNYXRjaGluZ0NvbXBvbmVudE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiUmVtb3ZlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gSVdBRDQ0MDIgPSBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gUmVhZCBzZWN0aW9uIDE1LjcuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ5MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDQwMyA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiBSZWFkIHNlY3Rpb24gMTUuNy41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ5MywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDQwNCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gUmVhZCBzZWN0aW9uIDE1LjcuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZihtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDk0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCi0JCS8vIElXQUQ0NDA1ID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gUmVhZCBzZWN0aW9uIDE1LjcuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighbWV0aG9kLmlzVm9pZCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDVfZWpiUmVtb3ZlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJQ2xhc3NWUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEphdmFDbGFzcywgRmllbGQpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gSVdBRDQwMjQgPSBBIHRyYW5zaWVudCBmaWVsZCBzaG91bGQgbm90IGJlIHRoZSB7MH0gdHlwZS4gUmVhZCBzZWN0aW9uIDcuNC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MDI1ID0gVHJhbnNpZW50IGZpZWxkcyBhcmUgZGlzY291cmFnZWQuIFJlYWQgc2VjdGlvbiA3LjQuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDExNSA9IHswfSBtdXN0IG5vdCBiZSBkZWZpbmVkIGluIHRoaXMgY2xhc3MuIFJlYWQgc2VjdGlvbiAxMC4zLjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQyNTkgPSA8Y21wLWZpZWxkPiBmaWVsZCBtdXN0IGJlIHRoZSB7MH0gdHlwZS4gUmVhZCBzZWN0aW9uIDExLjIuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDI2MCA9IDxjbXItZmllbGQ+IGZpZWxkIG11c3QgYmUgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gMTEuMi4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKHNob3VsZFZhbGlkYXRlVHJhbnNpZW50RmllbGQoKSkgewotCQkJdmFsaWRhdGVUcmFuc2llbnRGaWVsZCh2YywgYmVhbiwgY2xhenosIGZpZWxkKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVRyYW5zaWVudEZpZWxkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIEJ5IGRlZmF1bHQgZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXRGaWVsZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgewotCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRVhDTFVERURfRklFTEQ7Ci0JCX0KLQkJZWxzZSBpZihmaWVsZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSUVMRE5BTUVfU0VSSUFMVkVSU0lPTlVJRCkpIHsKLQkJCXJldHVybiBTRVJJQUxWRVJTSU9OVUlEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE9USEVSX0ZJRUxEOwotCQl9CQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdNZXRob2RFeGNlcHRpb25zKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBKYXZhQ2xhc3MgbWF0Y2hpbmdDbGF6eiwgTWV0aG9kIG1hdGNoaW5nTWV0aG9kKSB7Ci0JCS8vIEV2ZXJ5IGV4Y2VwdGlvbiB0aHJvd24gb24gdGhlIGJlYW4gY2xhc3MnIG1ldGhvZCBtdXN0IGJlIHRocm93biBvbiB0aGUgY29tcG9uZW50L2hvbWUgbWV0aG9kCi0JCS8qIERvbid0IGNoZWNrIGZvciB0aGlzIGhlcmUgLSBsZXQgdGhlIGhvbWUgJiBjb21wb25lbnQgZG8gaXQuCi0JCVNldCBleGNlcHRpb25zID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE5vdFN1YnNldEV4Y2VwdGlvbnMoYmVhbiwgbWV0aG9kLCBtYXRjaGluZ01ldGhvZCk7Ci0JCUl0ZXJhdG9yIGVpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoZWl0ZXJhdG9yLmhhc05leHQoKSkgewotCQl9Ci0JCSovCi0JCQotCQkvLyBFdmVyeSBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSBjb21wb25lbnQvaG9tZSBtZXRob2Qgc2hvdWxkIGJlIHRocm93biBvciB0aGVyZSBtYXkgYmUgY29tcGlsZSBlcnJvcnMKLQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0U3VidHlwZUV4Y2VwdGlvbnMoYmVhbiwgbWF0Y2hpbmdNZXRob2QsIG1ldGhvZCk7Ci0JCUl0ZXJhdG9yIGVpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoZWl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpZWl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0NTYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117ZXhjZXB0aW9uLmdldEphdmFOYW1lKCksIG1hdGNoaW5nQ2xhenouZ2V0SmF2YU5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nSG9tZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCU1ldGhvZCByZW1vdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgZ2V0TWF0Y2hpbmdIb21lTWV0aG9kTmFtZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpLCBnZXRSZW1vdGVIb21lTWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKHJlbW90ZU1ldGhvZCAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0ZU1hdGNoaW5nTWV0aG9kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgYmVhbi5nZXRIb21lSW50ZXJmYWNlKCksIHJlbW90ZU1ldGhvZCk7Ci0JCX0KLQkJCi0JCU1ldGhvZCBsb2NhbE1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyksIGdldExvY2FsSG9tZU1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpOwotCQlpZihsb2NhbE1ldGhvZCAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0ZU1hdGNoaW5nTWV0aG9kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSwgbG9jYWxNZXRob2QpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdDb21wb25lbnRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQlNZXRob2QgcmVtb3RlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIG1ldGhvZC5nZXROYW1lKCksIGdldFJlbW90ZUNvbXBvbmVudE1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpOwotCQlpZihyZW1vdGVNZXRob2QgIT0gbnVsbCkgewotCQkJdmFsaWRhdGVNYXRjaGluZ01ldGhvZEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCksIHJlbW90ZU1ldGhvZCk7Ci0JCX0KLQkJCi0JCU1ldGhvZCBsb2NhbE1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBtZXRob2QuZ2V0TmFtZSgpLCBnZXRMb2NhbENvbXBvbmVudE1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpOwotCQlpZihsb2NhbE1ldGhvZCAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0ZU1hdGNoaW5nTWV0aG9kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpLCBsb2NhbE1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFwcGVuZGl4QihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyB0aGlzRWpiT2JqZWN0KSB7Ci0JCS8vIFRoZSBKYXZhIGluaGVyaXRhbmNlIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSBFSkIgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgotCQkvLyBlLmcuIGlmIEVKQiBCIGlzIGEgY2hpbGQgb2YgRUpCIEEsIHRoZW4gY2xhc3MgQiBtdXN0IGJlIGEgY2hpbGQgb2YgY2xhc3MgQS4KLQkJLy8gQiBjb3VsZCBiZSBhIGdyYW5kY2hpbGQgKG9yIGdyZWF0LWdyYW5kY2hpbGQgb3IgLi4uKSBvZiBBLgotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRFamJPYmplY3QgPSBudWxsOwotCQlpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKLQkJCXBhcmVudEVqYk9iamVjdCA9IHN1cGVydHlwZS5nZXRFamJDbGFzcygpOwotCi0JCQkvLyBFSkJPYmplY3QgYSBYY2hpbGQgb2YgcGFyZW50IEVKQk9iamVjdCAoWCA9IGNoaWxkLCBncmFuZGNoaWxkLCBncmVhdC1ncmFuZGNoaWxkLCBldGMuKQotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodGhpc0VqYk9iamVjdCk7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHBhcmVudEVqYk9iamVjdCk7Ci0JCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0aGlzRWpiT2JqZWN0LCBwYXJlbnRFamJPYmplY3QpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyB0aGlzRWpiT2JqZWN0LmdldFF1YWxpZmllZE5hbWUoKSwgcGFyZW50RWpiT2JqZWN0LmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIxMDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpc0VqYk9iamVjdCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCksIGJlYW4uZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gewotCQkvLyBtdXN0IG5vdCB0aHJvdyBSZW1vdGVFeGNlcHRpb24KLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5kb2VzTm90VGhyb3dSZW1vdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNNUEhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FDTVBIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczNDM4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNNUEhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUNNUEhvbWVWUnVsZSBleHRlbmRzIEFFbnRpdHlIb21lVlJ1bGUgewotCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQotCQkvLyBDaGVjayB0aGF0IHRoaXMgbWV0aG9kIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwKLQkJLy8gZmluZEJ5UHJpbWFyeUtleSBkb2VzIG5vdCBuZWVkIGEgcXVlcnkgZWxlbWVudCAoMTAuNS42KQotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCwgdGhpcyk7Ci0JCWlmKChtZXRob2RUeXBlICYgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkRCWVBSSU1BUllLRVkpID09IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSU5EQllQUklNQVJZS0VZKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc29jaWF0ZWRXaXRoUXVlcnkoY21wLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0OTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBmaW5kTWF0Y2hpbmdNZXRob2QobG9uZyBtZXRob2RUeXBlKSB7Ci0JCWlmKChtZXRob2RUeXBlICYgRklORCkgPT0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZmluZE1hdGNoaW5nTWV0aG9kKG1ldGhvZFR5cGUpOwotCX0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLmVqYi5lamIyMC5ydWxlcy5pbXBsLkFIb21lVlJ1bGUjcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZU9yQ29sbGVjdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEVudGVycHJpc2VCZWFuLCBKYXZhQ2xhc3MsIE1ldGhvZCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlT3JDb2xsZWN0aW9uKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYocmV0dXJuc0NvbXBvbmVudEludGVyZmFjZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlKYXZhSGVscGVycyByZXR1cm5QYXJtID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxDb2xsZWN0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OLCBiZWFuKTsKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0dXJuUGFybSwgamF2YVV0aWxDb2xsZWN0aW9uKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nUmV0dXJuVHlwZU1hdGNoZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBob21lTWV0aG9kLCBNZXRob2QgYmVhbk1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0LCB0aGlzKTsKLQkJaWYoKG1ldGhvZFR5cGUgJiBGSU5EKSAhPSBGSU5EKSB7Ci0JCQlzdXBlci52YWxpZGF0ZU1hdGNoaW5nUmV0dXJuVHlwZU1hdGNoZXModmMsIGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBiZWFuTWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkJfQotCQkvLyBkbyBub3QgdmFsaWRhdGUgdGhlIHJldHVybiB0eXBlIG9mIGZpbmQgbWV0aG9kcyBiZWNhdXNlIHRoZXJlIHNob3VsZCBub3QgYmUgYW4gaW1wbGVtZW50YXRpb24gb24gdGhlIGJlYW4gY2xhc3MKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNvbXBvbmVudFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNGRkN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLlR5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFDb21wb25lbnRWUnVsZSBleHRlbmRzIEFJbnRlcmZhY2VUeXBlVlJ1bGUgewotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZigoaXNSZW1vdGUoKSAmIFJFTU9URSkgPT0gUkVNT1RFKSB7Ci0JCQlyZXR1cm4gKChFbnRlcnByaXNlQmVhbilwYXJlbnQpLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQl9Ci0JCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKSB7Ci0JCXJldHVybiBCVVNJTkVTUzsKLQl9Ci0JCi0JcHVibGljIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIWZvbGxvd1JNSV9JSU9QSW5oZXJpdGFuY2VSdWxlcyhiZWFuLCBjbGF6eikpIHsKLQkJCS8vIElXQUQ0MDU3ID0gezB9IG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcy4gUmVhZCBzZWN0aW9uIDcuMTAuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQyMTAgPSB7MH0gbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzLiBSZWFkIHNlY3Rpb24gMTAuNi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDMyNiA9IHswfSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMuIFJlYWQgc2VjdGlvbiAxMi4yLjggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ2OCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOyAvLyBjaGVjayBhcHBsaWNhdGlvbiBleGNlcHRpb25zCi0JCQotCQlpZihpc0VKQkludGVyZmFjZU1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkvLyBJV0FENDAyMSA9IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyLiBSZWFkIHNlY3Rpb24gNi41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDExMCA9IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyLiBSZWFkIHNlY3Rpb24gOS45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDExMiA9IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyLiBSZWFkIHNlY3Rpb24gOS4xMCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDY5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlNZXRob2QgbWF0Y2ggPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSwgZ2V0QmVhbkNsYXNzTWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKG1hdGNoID09IG51bGwpIHsKLQkJCS8vIElXQUQ0MDU4ID0gezB9IG11c3QgZXhpc3Qgb24gezF9LiBSZWFkIHNlY3Rpb24gNy4xMC41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljaWF0aW9uLgotCQkJLy8gSVdBRDQwNzAgPSB7MH0gbXVzdCBleGlzdCBvbiB7MX0uIFJlYWQgc2VjdGlvbiA3LjEwLjcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MzI3ID0gezB9IG11c3QgZXhpc3Qgb24gezF9LiBSZWFkIHNlY3Rpb24gMTIuMi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDM1NCA9IHswfSBtdXN0IGV4aXN0IG9uIHsxfS4gUmVhZCBzZWN0aW9uIDEyLjIuMTAgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MjExID0gezB9IG11c3QgZXhpc3Qgb24gezF9LiBSZWFkIHNlY3Rpb24gMTAuNi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDIyNyA9IHswfSBtdXN0IGV4aXN0IG9uIHsxfS4gUmVhZCBzZWN0aW9uIDEwLjYuMTEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMjMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCksIGJlYW4uZ2V0RWpiQ2xhc3MoKS5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIG1hdGNoLmdldFJldHVyblR5cGUoKSkpIHsKLQkJCQkvLyBJV0FENDIxMiA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSBzYW1lIHR5cGUgYXMgezB9LiBSZWFkIHNlY3Rpb24gMTAuNi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJLy8gSVdBRDQyMjggPSBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aGUgc2FtZSB0eXBlIGFzIHswfS4gUmVhZCBzZWN0aW9uIDEwLjYuMTEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkvLyBJV0FENDMyOCA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSBzYW1lIHR5cGUgYXMgezB9IG9uIHsxfS4gUmVhZCBzZWN0aW9uIDEyLjIuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCS8vIElXQUQ0MzU1ID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9LiBSZWFkIHNlY3Rpb24gMTIuMi4xMCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQotCQkJCWJvb2xlYW4gYWRkTWVzc2FnZSA9IHRydWU7Ci0JCQkJCi0JCQkJLy9pZiB0aGUgcmV0dXJuIHR5cGUgb24gdGhlIGludGVyZmFjZSBpcyByZXNvbHZhYmxlIGFuZCB0aGUgbWF0Y2ggb24gdGhlIGJlYW4gaXMgbm90LiBmbHVzaCB0aGUgYmVhbiBhbmQgcmVjaGVjayBpZiBpdCByZXNvbHZlcwotCQkJCUphdmFDbGFzcyByZXR1cm5UeXBlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldEphdmFDbGFzcyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKLQkJCQlKYXZhQ2xhc3MgYmVhblJldHVyblR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0SmF2YUNsYXNzKG1hdGNoLmdldFJldHVyblR5cGUoKSk7Ci0JCQkJaWYgKHJldHVyblR5cGUgIT0gbnVsbCAgJiYgYmVhblJldHVyblR5cGUgIT0gbnVsbCAmJiByZXR1cm5UeXBlLmdldEtpbmQoKSAhPSBUeXBlS2luZC5VTkRFRklORURfTElURVJBTCAmJiBiZWFuUmV0dXJuVHlwZS5nZXRLaW5kKCkgPT0gVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwpIHsgCi0JCQkJCS8vIGJ1Z3ppbGxhIDI3NDM0MCAtIEVKQiB2YWxpZGF0aW9uIGlzIHVzaW5nIGEgc3RhbGUgSkVNIGNhY2hlIGZvciBiZWFuIGNsYXNzCi0JCQkJCUphdmFSZWZsZWN0aW9uQWRhcHRvciBhZGFwdGVyID0gKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgSmF2YVJlZmxlY3Rpb25BZGFwdG9yLnJldHJpZXZlQWRhcHRvckZyb20oYmVhbi5nZXRFamJDbGFzcygpKTsKLQkJCQkJYWRhcHRlci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KHRydWUpOwotCQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW4uZ2V0RWpiQ2xhc3MoKSwgbWV0aG9kLmdldE5hbWUoKSwgbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRNZXNzYWdlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9CQotCQkJCWlmIChhZGRNZXNzYWdlKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117bWF0Y2guZ2V0UmV0dXJuVHlwZSgpLmdldEphdmFOYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVNldCBleGNlcHRpb25zID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE5vdFN1YnNldEV4Y2VwdGlvbnMoYmVhbiwgbWF0Y2gsIG1ldGhvZCk7Ci0JCQlJdGVyYXRvciBlaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpZWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117ZXhjZXB0aW9uLmdldEphdmFOYW1lKCksIG1hdGNoLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQkvLyBJV0FENDA1NiA9IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gNy4xMC41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDA2OSA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDcuMTAuNywgMTguMy44LCAxOC42IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDMyNSA9IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTIuMi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDM1MyA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEyLjIuMTAsIDE4LjMuOCwgMTguNiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQyMDkgPSBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEwLjYuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2J1cywgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCksIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQwNTUgPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIHR5cGUgZm9yIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gNy4xMC41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjA4ID0gezB9IG11c3QgYmUgYSBsZWdhbCB0eXBlIGZvciBSTUktSUlPUC4gUmVhZCBzZWN0aW9uIDEwLjYuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMyNCA9IHswfSBtdXN0IGJlIGEgbGVnYWwgdHlwZSBmb3IgUk1JLUlJT1AuIFJlYWQgc2VjdGlvbiAxMi4yLjggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJdmFsaWRhdGVSTUlfSUlPUFR5cGVSdWxlcyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRydWUpOwotCQkKLQkJSmF2YUhlbHBlcnMgb2UgPSBnZXRPdmVyRXhwb3NlZExvY2FsVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJaWYob2UgIT0gbnVsbCkgewotCQkJLy8gSVdBRDQwNTkgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gNy4xMC41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDEwNyA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiA5LjcuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQzMzAgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gMTIuMi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDEyOCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiAxMC4zLjEsIDEwLjMuMTAuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDcyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde29lLmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFwcGVuZGl4QihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyB0aGlzQ29tcG9uZW50KSB7Ci0JCS8vIFRoZSBKYXZhIGluaGVyaXRhbmNlIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSBFSkIgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgotCQkvLyBlLmcuIGlmIEVKQiBCIGlzIGEgY2hpbGQgb2YgRUpCIEEsIHRoZW4gY2xhc3MgQiBtdXN0IGJlIGEgY2hpbGQgb2YgY2xhc3MgQS4KLQkJLy8gQiBjb3VsZCBiZSBhIGdyYW5kY2hpbGQgKG9yIGdyZWF0LWdyYW5kY2hpbGQgb3IgLi4uKSBvZiBBLgotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRDb21wb25lbnQgPSBudWxsOwotCQlpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKLQkJCXBhcmVudENvbXBvbmVudCA9IGdldENvbXBvbmVudEludGVyZmFjZShzdXBlcnR5cGUpOwotCi0JCQlpZihwYXJlbnRDb21wb25lbnQgPT0gbnVsbCkgewotCQkJCS8vIGNoaWxkIHVzZXMgZWl0aGVyIGxvY2FsLCBvciByZW1vdGUsIGJ1dCBub3QgYm90aCBpbnRlcmZhY2VzCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBDb21wb25lbnQgYSBYY2hpbGQgb2YgcGFyZW50IENvbXBvbmVudAotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodGhpc0NvbXBvbmVudCk7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHBhcmVudENvbXBvbmVudCk7Ci0JCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0aGlzQ29tcG9uZW50LCBwYXJlbnRDb21wb25lbnQpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyB0aGlzQ29tcG9uZW50LmdldFF1YWxpZmllZE5hbWUoKSwgcGFyZW50Q29tcG9uZW50LmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIxMDUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpc0NvbXBvbmVudCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCksIGJlYW4uZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQkKLS8vCQl2YWxpZGF0ZUFwcGVuZGl4Qih2Yywgc3VwZXJ0eXBlLCBwYXJlbnRDb21wb25lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BRW50aXR5QmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BRW50aXR5QmVhbkNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxMjE5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUVudGl0eUJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFFbnRpdHlCZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFCZWFuQ2xhc3NWUnVsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1pc3NpbmdNZXRob2RUZW1wbGF0ZSA9ICJ7MH0oezF9KSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JCQotCQl2YWxpZGF0ZU1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdFamJQb3N0Q3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgbWF0Y2hpbmdNZXRob2ROYW1lID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUE9TVENSRUFURSArIG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDkpOyAvLyAiZWpiQ3JlYXRlIiBpcyA5IGNoYXJhY3RlcnMgbG9uZywgc28gc3RyaXAgb2ZmIGNoYXJhY3RlcnMgMC4uOCBpbmNsdXNpdmUKLQkJTWV0aG9kIGVqYlBvc3RDcmVhdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWF0Y2hpbmdNZXRob2ROYW1lLCBnZXRCZWFuQ2xhc3NNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYoZWpiUG9zdENyZWF0ZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbWlzc2luZ01ldGhvZCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1pc3NpbmdNZXRob2RUZW1wbGF0ZSwgbmV3IFN0cmluZ1tde21hdGNoaW5nTWV0aG9kTmFtZSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFBhcm1zQXNTdHJpbmcobWV0aG9kKX0pOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYlBvc3RDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21pc3NpbmdNZXRob2R9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUVudGl0eUhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FFbnRpdHlIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0Y2EyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUVudGl0eUhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBRW50aXR5SG9tZVZSdWxlIGV4dGVuZHMgQUhvbWVWUnVsZSB7Ci0JLyoqCi0JICogSWYgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBpc24ndCBsaXN0ZWQgaW4gdGhlIEtOT1dOX01FVEhPRFMsIHdoYXQgdHlwZSBvZiBtZXRob2QgaXMgaXQKLQkgKiBjb25zaWRlcmVkIHRvIGJlPwotCSAqLwotCXB1YmxpYyBsb25nIGdldERlZmF1bHRNZXRob2RUeXBlKCkgewotCQlyZXR1cm4gSE9NRTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUZpbmRCeVByaW1hcnlLZXlNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJSmF2YUNsYXNzIGtleSA9ICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQlpZigocGFybXMubGVuZ3RoICE9IDEpIHx8ICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oa2V5LCBwYXJtc1swXS5nZXRKYXZhVHlwZSgpKSkpIHsKLQkJCVN0cmluZyBrZXlOYW1lID0gKGtleSA9PSBudWxsKSA/IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9QUklNQVJZX0tFWSA6IGtleS5nZXRKYXZhTmFtZSgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2tleU5hbWV9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmZvbGxvd3NGaW5kZXJFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZm9sbG93c09iamVjdE5vdEZvdW5kRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9GSU5EQllQUklNQVJZS0VZKSkgewotCQkJdmFsaWRhdGVGaW5kQnlQcmltYXJ5S2V5TWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJCWlmKCFyZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJCUphdmFDbGFzcyBjb21wb25lbnRJbnRlcmZhY2UgPSBnZXRDb21wb25lbnRJbnRlcmZhY2UoYmVhbik7Ci0JCQkJU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0JCQkJaWYoY29tcG9uZW50SW50ZXJmYWNlICE9IG51bGwpIHsKLQkJCQkJY2xhc3NOYW1lID0gY29tcG9uZW50SW50ZXJmYWNlLmdldEphdmFOYW1lKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZigoaXNSZW1vdGUoKSAmIElFSkJUeXBlLlJFTU9URSkgPT0gSUVKQlR5cGUuUkVNT1RFKSB7Ci0JCQkJCQljbGFzc05hbWUgPSBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUkVNT1RFOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY2xhc3NOYW1lID0gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX0xPQ0FMOwotCQkJCQl9Ci0JCQkJfQotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117Y2xhc3NOYW1lfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmKCFyZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlT3JDb2xsZWN0aW9uKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117Z2V0Q29tcG9uZW50SW50ZXJmYWNlKGJlYW4pLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVIb21lTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIElXQUQ0MzUwID0gVGhlIHJldHVybiB0eXBlIG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIHswfS4gUmVhZCBzZWN0aW9uIDEyLjIuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBUaGUgYWJvdmUgY2hlY2sgaXMgZG9uZSBpbiB0aGUgInZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSBtZXRob2QuCi0JCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSBpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GSU5EKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDYzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1JFTU9WRSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ2NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZGZjNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBSG9tZVZSdWxlIGV4dGVuZHMgQUludGVyZmFjZVR5cGVWUnVsZSB7Ci0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmKChpc1JlbW90ZSgpICYgUkVNT1RFKSA9PSBSRU1PVEUpIHsKLQkJCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0SG9tZUludGVyZmFjZSgpOwotCQl9Ci0JCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIEJ5IGRlZmF1bHQsIGRvIG5vdGhpbmcuCi0JCS8vIExldCB0aGUgZW50aXR5IHJ1bGVzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBhbmQgdGhlIHNlc3Npb24gZG9uJ3QgZG8gYW55dGhpbmcKLQkJLy8gYmVjYXVzZSB2YWxpZGF0ZU1ldGhvZE11c3ROb3RFeGlzdCBkb2VzIHdoYXQgdGhlIHNlc3Npb25zIG5lZWQuCQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZm9sbG93c0NyZWF0ZUV4Y2VwdGlvblJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gewotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0NyZWF0ZUV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMZWdhbFJNSV9JSU9QSW5oZXJpdGFuY2UoY2xhenopKSB7Ci0JCQkvLyBJV0FENDMzNCA9IHswfSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMuIFJlYWQgc2VjdGlvbiAxMi4yLjkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MjE3ID0gezB9IG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcy4gUmVhZCBzZWN0aW9uIDEwLjYuMTAgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MDYyID0gezB9IG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcy4gUmVhZCBzZWN0aW9uIDcuMTAuNiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDYxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7IC8vIGNoZWNrIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMKLQkJCi0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCVN0cmluZyBuYW1lT2ZNZXRob2RUb0ZpbmQgPSBtZXRob2QuZ2V0TmFtZSgpOwotCQlib29sZWFuIHZhbGlkYXRlUmV0dXJuVHlwZU1hdGNoZXMgPSBmYWxzZTsKLQkJaWYoKG1ldGhvZFR5cGUgJiBDUkVBVEUpID09IENSRUFURSkgewotCQkJdmFsaWRhdGVDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQkJCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkMpOwotCQkJLy8gU3RyaXAgdGhlICJjIiBvZmYgb2YgImNyZWF0ZSIgYW5kIHJlcGxhY2Ugd2l0aCAiZWpiQyIKLQkJCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoMSkpOwotCQkJbmFtZU9mTWV0aG9kVG9GaW5kID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEZJTkQpID09IEZJTkQpIHsKLQkJCXZhbGlkYXRlRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkYpOwotCQkJLy8gU3RyaXAgdGhlICJmIiBvZmYgb2YgImZpbmQiIGFuZCByZXBsYWNlIHdpdGggImVqYkYiCi0JCQlidWZmZXIuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDEpKTsKLQkJCW5hbWVPZk1ldGhvZFRvRmluZCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCi0JCQl2YWxpZGF0ZVJldHVyblR5cGVNYXRjaGVzID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgSE9NRSkgPT0gSE9NRSkgewotCQkJLy8gcmVtb3ZlIGlzIGEgc3BlY2lhbCBtZXRob2QuIFNlZSA5LjUuMyBmb3IgYW4gZXhhbXBsZQotCQotCQkJdmFsaWRhdGVIb21lTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJCQotCQkJLy8gU2VjdGlvbiBudW1iZXIgc3RhdGluZyB0aGlzIG5hbWUgY29udmVudGlvbj8KLQkJCVN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCSE9NRSk7Ci0JCQlidWZmZXIuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShtZXRob2ROYW1lLmNoYXJBdCgwKSkpOwotCQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZygxKSk7Ci0JCQluYW1lT2ZNZXRob2RUb0ZpbmQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQotCQkJdmFsaWRhdGVSZXR1cm5UeXBlTWF0Y2hlcyA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2Qgc2hvdWxkbid0IGJlIGhlcmUuIEFUeXBlVlJ1bGUgd2lsbCBjYXRjaC4KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoIWZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXRob2RUeXBlIG1UeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQlpZihtVHlwZSA9PSBudWxsKSB7Ci0JCQkJLy8gc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJBSG9tZVZSdWxlIC0gdmFsaWRhdGUgbWV0aG9kIHdoaWNoIG11c3Qgbm90IGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgiTWV0aG9kIHR5cGUgaXMgbnVsbDogIiArIGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKSArICI6OiIgKyBtZXRob2QuZ2V0TmFtZSgpICk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgbVR5cGUuZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSwgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCksIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQl2YWxpZGF0ZVJNSV9JSU9QVHlwZVJ1bGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgKChtZXRob2RUeXBlICYgRklORCkgIT0gRklORCkpOyAvLyBkbyBub3QgY2hlY2sgdGhhdCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBmaW5kIG1ldGhvZCBpcyBzZXJpYWxpemFibGUuIElmIGl0J3MgQ29sbGVjdGlvbiBvciBTZXQgaXQgd29uJ3QgYmUgc2VyaWFsaXphYmxlLCBhbmQgaWYgaXQgZG9lc24ndCByZXR1cm4gQ29sbGVjdGlvbiwgU2V0LCBvciB0aGUgY29tcG9uZW50IGludGVyZmFjZSB0aGVuIHRoZSByZXR1cm4gdHlwZSB3aWxsIGJlIGZsYWdnZWQuCi0JCQotCQlKYXZhSGVscGVycyBsb2NhbCA9IGdldE92ZXJFeHBvc2VkTG9jYWxUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQlpZihsb2NhbCAhPSBudWxsKSB7Ci0JCQkvLyBJV0FENDAyMyA9IHswfSBjYW5ub3QgYmUgYW4gYXJndW1lbnQgb3IgcmVzdWx0IHR5cGUuIFJlYWQgc2VjdGlvbiA2LjcuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQyMjUgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gMTAuNi4xMCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQzNTEgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgdGhlIHswfSB0eXBlLiBSZWFkIHNlY3Rpb24gMTIuMi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117bG9jYWwuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZihmaW5kTWF0Y2hpbmdNZXRob2QobWV0aG9kVHlwZSkpIHsKLQkJCXZhbGlkYXRlTWF0Y2hpbmdCZWFuTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuYW1lT2ZNZXRob2RUb0ZpbmQsIHZhbGlkYXRlUmV0dXJuVHlwZU1hdGNoZXMsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBmaW5kTWF0Y2hpbmdNZXRob2QobG9uZyBtZXRob2RUeXBlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nQmVhbk1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgU3RyaW5nIG5hbWVPZk1ldGhvZFRvRmluZCwgYm9vbGVhbiB2YWxpZGF0ZVJldHVyblR5cGVNYXRjaGVzLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlNZXRob2QgbWF0Y2ggPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbmFtZU9mTWV0aG9kVG9GaW5kLCBnZXRCZWFuQ2xhc3NNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYobWF0Y2ggPT0gbnVsbCkgewotCQkJSU1ldGhvZFR5cGUgbVR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCWlmKG1UeXBlID09IG51bGwpIHsKLQkJCQkvLyBvb3BzCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkFIb21lVlJ1bGUgLSB2YWxpZGF0ZSBtZXRob2QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJNZXRob2QgdHlwZSBpcyBudWxsOiAiICsgYmVhbi5nZXROYW1lKCkgKyAiOjoiICsgY2xhenouZ2V0SmF2YU5hbWUoKSArICI6OiIgKyBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCQkJU3RyaW5nIGJlYW5DbGFzc05hbWUgPSAoYmVhbkNsYXNzID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX0JFQU5fQ0xBU1MgOiBiZWFuQ2xhc3MuZ2V0SmF2YU5hbWUoKTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIG1UeXBlLmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117bmFtZU9mTWV0aG9kVG9GaW5kLCBiZWFuQ2xhc3NOYW1lfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmKHZhbGlkYXRlUmV0dXJuVHlwZU1hdGNoZXMpIHsKLQkJCQl2YWxpZGF0ZU1hdGNoaW5nUmV0dXJuVHlwZU1hdGNoZXModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1hdGNoLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCQl9Ci0KLQkJCVNldCBleGNlcHRpb25zID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE5vdFN1YnNldEV4Y2VwdGlvbnMoYmVhbiwgbWF0Y2gsIG1ldGhvZCk7Ci0JCQlJdGVyYXRvciBlaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpZWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117ZXhjZXB0aW9uLmdldEphdmFOYW1lKCksIG1hdGNoLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ1JldHVyblR5cGVNYXRjaGVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgaG9tZU1ldGhvZCwgTWV0aG9kIGJlYW5NZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRNZXRob2QpIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGhvbWVNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG5ldyBTdHJpbmdbXXtiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIWZvbGxvd3NDcmVhdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFyZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJSmF2YUNsYXNzIGNvbXBvbmVudEludGVyZmFjZSA9IGdldENvbXBvbmVudEludGVyZmFjZShiZWFuKTsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotCQkJaWYoY29tcG9uZW50SW50ZXJmYWNlICE9IG51bGwpIHsKLQkJCQljbGFzc05hbWUgPSBjb21wb25lbnRJbnRlcmZhY2UuZ2V0SmF2YU5hbWUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCQkJY2xhc3NOYW1lID0gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1JFTU9URTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNsYXNzTmFtZSA9IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9MT0NBTDsKLQkJCQl9Ci0JCQl9Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDAyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtjbGFzc05hbWV9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVIb21lTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIElXQUQ0MzUwID0gVGhlIHJldHVybiB0eXBlIG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIHswfS4gUmVhZCBzZWN0aW9uIDEyLjIuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBUaGUgYWJvdmUgY2hlY2sgaXMgZG9uZSBpbiB0aGUgInZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSBtZXRob2QuCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gewotCQlKYXZhQ2xhc3MgY29tcG9uZW50SW50ZXJmYWNlID0gZ2V0Q29tcG9uZW50SW50ZXJmYWNlKGJlYW4pOwotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20obWV0aG9kLmdldFJldHVyblR5cGUoKSwgY29tcG9uZW50SW50ZXJmYWNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZU9yQ29sbGVjdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKHJldHVybnNDb21wb25lbnRJbnRlcmZhY2UodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJSmF2YUhlbHBlcnMgcmV0dXJuUGFybSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCUphdmFIZWxwZXJzIGphdmFVdGlsRW51bWVyYXRpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0VOVU1FUkFUSU9OLCBiZWFuKTsKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0dXJuUGFybSwgamF2YVV0aWxFbnVtZXJhdGlvbikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlKYXZhSGVscGVycyBqYXZhVXRpbENvbGxlY3Rpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04sIGJlYW4pOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXR1cm5QYXJtLCBqYXZhVXRpbENvbGxlY3Rpb24pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHRoaXNIb21lKSB7Ci0JCS8vIFRoZSBKYXZhIGluaGVyaXRhbmNlIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSBFSkIgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgotCQkvLyBlLmcuIGlmIEVKQiBCIGlzIGEgY2hpbGQgb2YgRUpCIEEsIHRoZW4gY2xhc3MgQiBtdXN0IGJlIGEgY2hpbGQgb2YgY2xhc3MgQS4KLQkJLy8gQiBjb3VsZCBiZSBhIGdyYW5kY2hpbGQgKG9yIGdyZWF0LWdyYW5kY2hpbGQgb3IgLi4uKSBvZiBBLgotCQkKLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQkvLyBiZWFuIGhhcyBubyBzdXBlcnR5cGUKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRIb21lID0gbnVsbDsKLQkJaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayB0aGlzIENNUCdzIHN1cGVydHlwZQotCQkJcGFyZW50SG9tZSA9IGdldEhvbWVJbnRlcmZhY2Uoc3VwZXJ0eXBlKTsKLQotCQkJaWYocGFyZW50SG9tZSA9PSBudWxsKSB7Ci0JCQkJLy8gY2hpbGQgdXNlcyBlaXRoZXIgbG9jYWwsIG9yIHJlbW90ZSwgYnV0IG5vdCBib3RoIGludGVyZmFjZXMKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCS8vIEhvbWUgYSBYY2hpbGQgb2YgcGFyZW50IEhvbWUKLQkJCS8vIEluIG91ciBFSkIgY29tcG9uZW50IGluaGVyaXRhbmNlIHN0cnVjdHVyZSwgd2hpbGUgaXQgaXMgbGVnYWwgZm9yCi0JCQkvLyBhIGhvbWUgdG8gaW5oZXJpdCBmcm9tIGFub3RoZXIgaG9tZSwgKHNlY3Rpb24gQi4yKSwgaXQgaXMgbm90IGxlZ2FsCi0JCQkvLyBmb3IgV1NBIGNvbXBvbmVudCBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuIAotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodGhpc0hvbWUpOwotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShwYXJlbnRIb21lKTsKLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odGhpc0hvbWUsIHBhcmVudEhvbWUpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyB0aGlzSG9tZS5nZXRRdWFsaWZpZWROYW1lKCksIHBhcmVudEhvbWUuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzSG9tZSwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCksIGJlYW4uZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQkKLS8vCQl2YWxpZGF0ZUFwcGVuZGl4Qih2Yywgc3VwZXJ0eXBlLCBwYXJlbnRIb21lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUludGVyZmFjZVR5cGVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FJbnRlcmZhY2VUeXBlVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkNzkwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUludGVyZmFjZVR5cGVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qCi0gKiBUaGlzIGNsYXNzIGlzIGEgaGFjayBhcm91bmQgdGhlIEphdmEgbGFjayBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLSAqIEFsbCBpZiBzdGF0ZW1lbnRzIHdoaWNoIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZyB3b3VsZCBub3JtYWxseSByZXBsYWNlCi0gKiBhcmUgY29udGFpbmVkIGluIHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBSW50ZXJmYWNlVHlwZVZSdWxlIGV4dGVuZHMgQVR5cGVWUnVsZSBpbXBsZW1lbnRzIElFSkJJbnRlcmZhY2VUeXBlIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0QmVhbkNsYXNzTWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzBdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEEgaG9tZSBvciBjb21wb25lbnQgY2xhc3MgbmVlZHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzJyBleHRlbmRlZCBtZXRob2RzOgotCQkvLyAgICAxLiBiZWFuIGNsYXNzCi0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCWlmKGJlYW5DbGFzcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQkJTGlzdFtdIHJlc3VsdCA9IG5ldyBMaXN0WzFdOwotCQlyZXN1bHRbMF0gPSBiZWFuQ2xhc3MuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0RmllbGRzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGhvbWUgb3IgY29tcG9uZW50J3MgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVBcHBsaWNhdGlvbkV4Y2VwdGlvblJ1bGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFSkJJbnRlcmZhY2VNZXRob2QoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWxvbmdbXSBzdXBlclR5cGVzID0gZ2V0U3VwZXJ0eXBlcygpOwotCQlmb3IoaW50IGk9MDsgaTxzdXBlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihDbGFzc1V0aWxpdHkuZ2V0VXRpbGl0eSgpLmlzQ2xhc3NUeXBlKGJlYW4sIG1ldGhvZC5nZXRKYXZhQ2xhc3MoKSwgc3VwZXJUeXBlc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBKYXZhSGVscGVycyBnZXRPdmVyRXhwb3NlZExvY2FsVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJLy8gbmVlZCB0byBjaGVjayB0aGF0IHRoZSBtZXRob2QgZG9lc24ndCBleHBvc2UgYW55IG9mIHRoZSBsb2NhbCB0eXBlcyBvZiB0aGUgYmVhbgotCQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJaWYocGFybXMgIT0gbnVsbCkgewotCQkJCWZvcihpbnQgaT0wOyBpPHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUphdmFQYXJhbWV0ZXIgcGFybSA9IHBhcm1zW2ldOwotCQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMb2NhbFR5cGUoYmVhbiwgcGFybS5nZXRKYXZhVHlwZSgpKSkgewotCQkJCQkJcmV0dXJuIHBhcm0uZ2V0SmF2YVR5cGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gTm93IGNoZWNrIHRoZSByZXR1cm4gdHlwZQotCQkJSmF2YUhlbHBlcnMgcGFybSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMb2NhbFR5cGUoYmVhbiwgcGFybSkpIHsKLQkJCQlyZXR1cm4gcGFybTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBsb25nIGdldEZpZWxkVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB7Ci0JCWlmKGZpZWxkID09IG51bGwpIHsKLQkJCXJldHVybiBFWENMVURFRF9GSUVMRDsKLQkJfQotCQllbHNlIGlmKGZpZWxkLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJRUxETkFNRV9TRVJJQUxWRVJTSU9OVUlEKSkgewotCQkJcmV0dXJuIFNFUklBTFZFUlNJT05VSUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gT1RIRVJfRklFTEQ7Ci0JCX0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQXBwbGljYXRpb25FeGNlcHRpb25SdWxlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gIHsKLQkJTGlzdCBleGNlcHRpb25zID0gbWV0aG9kLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCWlmKGV4Y2VwdGlvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gSVdBRDQ0MTkgPSB7MH0gbXVzdCBiZSBhIHN1YmNsYXNzIG9mIGphdmEubGFuZy5FeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxOC4xLjEsIDE4LjIuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIGphdmFMYW5nRXhjZXB0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19FWENFUFRJT04sIGJlYW4pOwotCQkJSmF2YUhlbHBlcnMgamF2YUxhbmdSdW50aW1lRXhjZXB0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19SVU5USU1FRVhDRVBUSU9OLCBiZWFuKTsKLQkJCQotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJCQotCQkJCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBcHBsaWNhdGlvbkV4Y2VwdGlvbihleGNlcHRpb24sIGJlYW4pKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oZXhjZXB0aW9uLCBqYXZhTGFuZ0V4Y2VwdGlvbikpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDA0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2V4Y2VwdGlvbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCi0JCQkJCS8vIG5vIHBvaW50IGNoZWNraW5nIHRoZSByZXN0Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBJV0FENDQyMCA9IHswfSBtdXN0IG5vdCBiZSBhIHN1YmNsYXNzIG9mIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTguMS4xLCAxOC4yLjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShleGNlcHRpb24sIGphdmFMYW5nUnVudGltZUV4Y2VwdGlvbikpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDE2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2V4Y2VwdGlvbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJLy8gdmMuYWRkTWVzc2FnZSgiQ2Fubm90IHZhbGlkYXRlIGV4Y2VwdGlvbnMgYmVjYXVzZSB0aGUgezB9IHR5cGUgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4iKTsKLQkJCS8vIERvbid0IGFkZCBhbnkgbWVzc2FnZSBvdGhlciB0aGFuIHRoZSAiY2Fubm90IHZhbGlkYXRlIiBtZXNzYWdlLgotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FLZXlDbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUtleUNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4NDA3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUtleUNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUtleUNsYXNzVlJ1bGUgZXh0ZW5kcyBBVHlwZVZSdWxlIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGxvbmdbXSBCQVNFX1RZUEVTID0gbmV3IGxvbmdbXXtJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNUfTsKLQkKLQlwdWJsaWMgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIEJBU0VfVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBrZXkgY2xhc3MnIG1ldGhvZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MgCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEga2V5IGNsYXNzJyBmaWVsZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MKLQkJLy8gb2YgdGhlIGJlYW4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSUNsYXNzVlJ1bGUjdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBFbnRlcnByaXNlQmVhbiwgSmF2YUNsYXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gQ0hLSjIxMDggPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIFZhbHVlIFR5cGUgaW4gUk1JLUlJT1AuIFJlYWQgc2VjdGlvbiA5Ljggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gQ0hLSjIyNDEgPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIFZhbHVlIFR5cGUgaW4gUk1JLUlJT1AuIFJlYWQgc2VjdGlvbiAxMC42LjEzIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIENIS0oyMzc2ID0gezB9IG11c3QgYmUgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gMTIuMi4xMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTGVnYWxSTUlfSUlPUFR5cGUoYmVhbiwgY2xhenopKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXRGaWVsZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgewotCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRVhDTFVERURfRklFTEQ7Ci0JCX0KLQkJZWxzZSBpZihmaWVsZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSUVMRE5BTUVfU0VSSUFMVkVSU0lPTlVJRCkpIHsKLQkJCXJldHVybiBTRVJJQUxWRVJTSU9OVUlEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE9USEVSX0ZJRUxEOwotCQl9CQotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIE5PX01FVEhPRFM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiB7Ci0JCS8vIERvZXNuJ3QgbWF0dGVyIGlmIHRoZSBrZXkgY2xhc3MgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiBvciBub3QKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDA1ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVNlc3Npb25CZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFCZWFuQ2xhc3NWUnVsZSB7Ci0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVUcmFuc2llbnRGaWVsZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZihmaWVsZC5pc1RyYW5zaWVudCgpKSB7Ci0JCQkvLyBJV0FENDAyNSA9IFRyYW5zaWVudCBmaWVsZHMgYXJlIGRpc2NvdXJhZ2VkLiBSZWFkIHNlY3Rpb24gNy40LjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1MywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBmaWVsZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkKLQkJCUphdmFIZWxwZXJzIGphdmF4RWpiU2Vzc2lvbkNvbnRleHQgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05DT05URVhULCBiZWFuKTsKLQkJCUphdmFIZWxwZXJzIGphdmF4VHJhbnNhY3Rpb25Vc2VydHJhbnNhY3Rpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfVFJBTlNBQ1RJT05fVVNFUlRSQU5TQUNUSU9OLCBiZWFuKTsKLQkJCUphdmFIZWxwZXJzIGphdmF4TmFtaW5nQ29udGV4dCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9OQU1JTkdfQ09OVEVYVCwgYmVhbik7Ci0JCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShmaWVsZCksIGphdmF4RWpiU2Vzc2lvbkNvbnRleHQpIHx8Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpLCBqYXZheFRyYW5zYWN0aW9uVXNlcnRyYW5zYWN0aW9uKSB8fAotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xvY2FsVHlwZShiZWFuLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShmaWVsZCkpIHx8Ci0JCQkJLy9WYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNKTkRJTmFtaW5nQ29udGV4dChmaWVsZCkpCi0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpLCBqYXZheE5hbWluZ0NvbnRleHQpKQotCQkJewotCQkJCS8vIElXQUQ0MDI0ID0gQSB0cmFuc2llbnQgZmllbGQgc2hvdWxkIG5vdCBiZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiA3LjQuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBmaWVsZCwgdGhpcyk7CQkKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTZXNzaW9uSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVNlc3Npb25Ib21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1OWVmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVNlc3Npb25Ib21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFTZXNzaW9uSG9tZVZSdWxlIGV4dGVuZHMgQUhvbWVWUnVsZSB7Ci0JLyoqCi0JICogSWYgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBpc24ndCBsaXN0ZWQgaW4gdGhlIEtOT1dOX01FVEhPRFMsIHdoYXQgdHlwZSBvZiBtZXRob2QgaXMgaXQKLQkgKiBjb25zaWRlcmVkIHRvIGJlPwotCSAqLwotCXB1YmxpYyBsb25nIGdldERlZmF1bHRNZXRob2RUeXBlKCkgewotCQkvLyBJZiBpdCdzIG5vdCBhIGNyZWF0ZSBtZXRob2QsIHRoZW4gaXQgc2hvdWxkbid0IGJlIHRoZXJlLgotCQlyZXR1cm4gRVhDTFVERURfTUVUSE9EOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU3RhdGVsZXNzSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVN0YXRlbGVzc0hvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmY4Yjg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU3RhdGVsZXNzSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBU3RhdGVsZXNzSG9tZVZSdWxlIGV4dGVuZHMgQVNlc3Npb25Ib21lVlJ1bGUgewotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIGNyZWF0ZSgpIG1ldGhvZC4KLQkJaWYoKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggIT0gMCkgfHwgKCFJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLnZhbGlkYXRlQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVHlwZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVR5cGVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDEzM2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVHlwZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFUeXBlVlJ1bGUgZXh0ZW5kcyBBVmFsaWRhdGlvblJ1bGUgaW1wbGVtZW50cyBJQ2xhc3NWUnVsZSwgSUVKQlR5cGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19GSUVMRFMgPSAwOwotCi0JcHJpdmF0ZSBsb25nIF9tZXRob2RMaXN0ID0gTk9fTUVUSE9EUzsKLQlwcml2YXRlIGxvbmcgX2ZpZWxkTGlzdCA9IE5PX0ZJRUxEUzsKLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl2Yy5zdWJ0YXNrKElFSkJWYWxpZGF0b3JDb25zdGFudHMuU1RBVFVTX1ZBTElEQVRJTkcsIG5ldyBTdHJpbmdbXXsoKEphdmFDbGFzcykgdGFyZ2V0KS5nZXRKYXZhTmFtZSgpfSk7Ci0KLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5LnNldFRleHQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOjp2YWxpZGF0ZSgiICsgdGFyZ2V0UGFyZW50ICsgIiwgIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIHRhcmdldFBhcmVudDsKLQkJCUphdmFDbGFzcyBjbGF6eiA9IChKYXZhQ2xhc3MpIHRhcmdldDsKLQotCQkJdHJ5IHsKLQkJCQkvL2NsZWFuIHVwIG9sZCByZWZsZWN0aW9uIGVycm9yIG9uIHRoZSBjbGF6eiB0aGF0IGlzIGdldHRpbmcgdmFsaWRhdGVkCi0JCQkJdmMucmVtb3ZlTWVzc2FnZXMoY2xhenopOwotCQkJCS8vIENoZWNrIHRoYXQgYWxsIG9mIHRoZSB0eXBlcyBpbiB0aGUgYmVhbiByZWZsZWN0ZWQgY29ycmVjdGx5LAotCQkJCS8vIGFuZCB0aGF0IHRoZSB0eXBlcycgcGFyZW50cyByZWZsZWN0ZWQgY29ycmVjdGx5IHRvby4KLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgY2xhenopOwotCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJCXJlZmxlY3Rpb25FcnJvcih2YywgYmVhbiwgY2xhenopOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1VubmFtZWRQYWNrYWdlKGNsYXp6LmdldEphdmFQYWNrYWdlKCkpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjA0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQl0cnkgewotCQkJCXZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJCUxpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0ID0gZ2V0TWV0aG9kc0V4dGVuZGVkKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBjbGF6ei5saXN0TWV0aG9kRXh0ZW5kZWQoKSwgbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJCUxpc3RbXSBmaWVsZHNFeHRlbmRlZExpc3QgPSBnZXRGaWVsZHNFeHRlbmRlZCh2YywgYmVhbiwgY2xhenopOwotCQkJCXZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgY2xhenoubGlzdEZpZWxkRXh0ZW5kZWQoKSwgZmllbGRzRXh0ZW5kZWRMaXN0KTsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQkJdmFsaWRhdGVTdXBlcnR5cGVzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJCXZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdEV4aXN0KHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlyZWZsZWN0aW9uRXJyb3IodmMsIGJlYW4sIGNsYXp6KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gY2F0Y2ggKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyByZW1vdmUgYW55IGV4aXN0aW5nIG1lc3NhZ2VzIHNpbmNlIHRoZXkgbWF5IGJlIGZhdWx0eQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkW10gZmllbGRzLCBMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJRmllbGQgZmllbGQgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJCWZpZWxkID0gZmllbGRzW2ldOwotCQkJCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQjIwVmFsaWRhdG9yIC0gdmFsaWRhdGUgZmllbGRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVudHJ5LnNldFRleHQoIkEgZmllbGQgaXMgbnVsbCBvbiAiICsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIGZpZWxkcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllbnRyeS5zZXRUZXh0KCJWYWxpZGF0aW5nIGZpZWxkICIgKyBmaWVsZC5nZXROYW1lKCkgKyAib24gY2xhenogIiArIGNsYXp6ICsgIiBhbmQgaXNWYWxpZCByZXR1cm5zICIgKyBpc1ZhbGlkKGJlYW4sIGNsYXp6LCBmaWVsZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGlzVmFsaWQoYmVhbiwgY2xhenosIGZpZWxkKSkgewotCQkJCQkJcmVnaXN0ZXIodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCwgZmllbGRzRXh0ZW5kZWRMaXN0cyk7Ci0JCQkJCQl2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIGZpZWxkLCBmaWVsZHNFeHRlbmRlZExpc3RzKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlZmxlY3Rpb25XYXJuaW5nKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQsIGUpOwotCQkJCX0KLQkJCX0KLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCX0gY2F0Y2ggKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyByZW1vdmUgYW55IGV4aXN0aW5nIG1lc3NhZ2VzIHNpbmNlIHRoZXkgbWF5IGJlIGZhdWx0eQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1ZhbGlkKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGlzT3duZWRCeUJhc2UoYmVhbiwgbWV0aG9kKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuICgoZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cykgJiBFWENMVURFRF9NRVRIT0QpICE9IEVYQ0xVREVEX01FVEhPRCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNPd25lZEJ5QmFzZShFbnRlcnByaXNlQmVhbiBiZWFuLCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlsb25nW10gYmFzZVR5cGVzID0gZ2V0QmFzZVR5cGVzKCk7Ci0JCWlmIChiYXNlVHlwZXMgPT0gbnVsbCkgewotCQkJLy8gbm8gcGFyZW50cwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChDbGFzc1V0aWxpdHkuZ2V0VXRpbGl0eSgpLmlzQ2xhc3NUeXBlKGJlYW4sIGZpZWxkLmdldEphdmFDbGFzcygpLCBiYXNlVHlwZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzT3duZWRCeUJhc2UoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJbG9uZ1tdIGJhc2VUeXBlcyA9IGdldEJhc2VUeXBlcygpOwotCQlpZiAoYmFzZVR5cGVzID09IG51bGwpIHsKLQkJCS8vIG5vIHBhcmVudHMKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmFzZVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoQ2xhc3NVdGlsaXR5LmdldFV0aWxpdHkoKS5pc0NsYXNzVHlwZShiZWFuLCBtZXRob2QuZ2V0SmF2YUNsYXNzKCksIGJhc2VUeXBlc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNWYWxpZChFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGlzT3duZWRCeUJhc2UoYmVhbiwgZmllbGQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gKChnZXRGaWVsZFR5cGUoYmVhbiwgY2xhenosIGZpZWxkKSAmIEVYQ0xVREVEX0ZJRUxEKSAhPSBFWENMVURFRF9GSUVMRCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZFtdIG1ldGhvZHMsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJCW1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCS8vIE5vIHBvaW50IGFkZGluZyBhIHZhbGlkYXRpb24gbWVzc2FnZSwgYmVjYXVzZSB0aGUgdXNlciBjYW4ndCBkbyBhbnl0aGluZy4KLQkJCQkJLy8gTG9nIHRoaXMgY29uZGl0aW9uLgotCQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIG1ldGhvZHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZW50cnkuc2V0VGV4dCgiT24gIiArIGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKSArICIsIHRoZXJlIGlzIGEgbnVsbCBtZXRob2QuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIG1ldGhvZHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZW50cnkuc2V0VGV4dCgiVmFsaWRhdGluZyBtZXRob2QgIiArIG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkgKyAiIG9uIGNsYXp6ICIgKyBjbGF6eiArICIgYW5kIGlzVmFsaWQgcmV0dXJucyAiICsgaXNWYWxpZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGlzVmFsaWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpKSB7Ci0JCQkJCQlyZWdpc3Rlcih2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQkJCQkJaWYgKGlzTWV0aG9kQWxsb3dlZFRvRXhpc3QoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpKSB7Ci0JCQkJCQkJdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdmFsaWRhdGVNZXRob2RXaGljaE11c3ROb3RFeGlzdCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCFpc093bmVkQnlCYXNlKGJlYW4sIG1ldGhvZCkpIHsKLQkJCQkJCQlpZiAoKE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcykgJiBFWENMVURFRF9NRVRIT0QpID09IEVYQ0xVREVEX01FVEhPRCkgewotCQkJCQkJCQkvLyB1bmlkZW50aWZpZWQgbWV0aG9kIGV4Y2x1ZGVkCi0JCQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXttZXRob2QuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkJcmVmbGVjdGlvbldhcm5pbmcodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIGUpOwotCQkJCX0KLQotCQkJfQotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIHJlbW92ZSBhbnkgZXhpc3RpbmcgbWVzc2FnZXMgc2luY2UgdGhleSBtYXkgYmUgZmF1bHR5Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlZ2lzdGVyKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCV9maWVsZExpc3QgPSAoX2ZpZWxkTGlzdCB8IGdldEZpZWxkVHlwZShiZWFuLCBjbGF6eiwgZmllbGQpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0Q29uc3RydWN0b3IobG9uZyBtZXRob2RUeXBlKSB7Ci0JCXJldHVybiAoKG1ldGhvZFR5cGUgJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1JfTk9QQVJNKSA9PSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1JfTk9QQVJNKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZG9lc1B1YmxpY0RlZmF1bHRDb25zdHJ1Y3RvckV4aXN0KCkgewotCQlpZiAoKF9tZXRob2RMaXN0ICYgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SX05PUEFSTSkgPT0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SX05PUEFSTSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdENvbnN0cnVjdG9ySW5zZXJ0ZWRCeUNvbXBpbGVyKCkgewotCQkvLyBJZiB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBub3QgaW4gdGhlIGxpc3QsIGFuZCBpZiB0aGVyZSBhcmUgbm8gY29uc3RydWN0b3JzLAotCQkvLyB0aGUgSmF2YSBjb21waWxlciB3aWxsIGluc2VydCBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0JCWlmICgoX21ldGhvZExpc3QgJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1IpID09IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DT05TVFJVQ1RPUikgewotCQkJLy8gVGhlcmUgaXMgYSBjb25zdHJ1Y3Rvciwgc28gcmV0dXJuIGZhbHNlLgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNNZXRob2RBbGxvd2VkVG9FeGlzdChFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQlsb25nW10gbWV0aG9kcyA9IGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpOwotCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlsb25nIG1ldGhvZFR5cGUgPSBtZXRob2RzW2ldOwotCQkJCWxvbmcgZXhpc3RpbmdNZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCQlpZiAoKGV4aXN0aW5nTWV0aG9kVHlwZSAmIG1ldGhvZFR5cGUpID09IG1ldGhvZFR5cGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZHNXaGljaE11c3RFeGlzdChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmdbXSBtZXRob2RzID0gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCk7Ci0JCWlmIChtZXRob2RzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCWxvbmcgbWV0aG9kVHlwZSA9IG1ldGhvZHNbaV07Ci0JCQkJYm9vbGVhbiBlbWl0V2FybmluZyA9IGZhbHNlOwotCQkJCWlmIChpc0RlZmF1bHRDb25zdHJ1Y3RvcihtZXRob2RUeXBlKSkgewotCQkJCQlpZiAoIWRvZXNQdWJsaWNEZWZhdWx0Q29uc3RydWN0b3JFeGlzdCgpICYmICFpc0RlZmF1bHRDb25zdHJ1Y3Rvckluc2VydGVkQnlDb21waWxlcigpKSB7Ci0JCQkJCQllbWl0V2FybmluZyA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQllbWl0V2FybmluZyA9ICFleGlzdHMobWV0aG9kVHlwZSk7Ci0JCQkJfQotCi0JCQkJaWYgKGVtaXRXYXJuaW5nKSB7Ci0JCQkJCS8vIElXQUQ0MDQxID0gVGhpcyBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aGljaCB0YWtlcyBubwotCQkJCQkvLyBwYXJhbWV0ZXJzLiBSZWFkIHNlY3Rpb24gNy4xMC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0MTQyID0gezB9IG11c3QgZXhpc3QuIFJlYWQgc2VjdGlvbiAxMC41LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQxNzMgPSB7MH0gbXVzdCBleGlzdC4gUmVhZCBzZWN0aW9uIDEwLjYuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDI3MSA9IHswfSBtdXN0IGV4aXN0LiBSZWFkIHNlY3Rpb24gMTIuMS40LjEgb2YgdGhlIEVKQiAyLjAKLQkJCQkJLy8gc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQyOTAgPSB7MH0gbXVzdCBleGlzdC4gUmVhZCBzZWN0aW9uIDEyLjIuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDM4OCA9IHswfSBtdXN0IGV4aXN0LiBSZWFkIHNlY3Rpb24gMTUuNy4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCUlNZXRob2RUeXBlIG1UeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShtZXRob2RUeXBlKTsKLQkJCQkJaWYgKG1UeXBlID09IG51bGwpIHsKLQkJCQkJCS8vIHVtbW1tLi4uLm9vcHMuIFRoaXMgY2FzZSBzaG91bGQgbmV2ZXIgaGFwcGVuLgotCQkJCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIG1ldGhvZHMgd2hpY2ggbXVzdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZW50cnkuc2V0VGV4dCgiTWV0aG9kIHR5cGUgaXMgbnVsbDogIiArIG1ldGhvZFR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIG1UeXBlLmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXXttVHlwZS5nZXRNZXRob2ROYW1lKGJlYW4sIGNsYXp6LCBudWxsKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWV0aG9kV2hpY2hNdXN0Tm90RXhpc3QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlNZXRob2RUeXBlIG1UeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCWlmIChtVHlwZSA9PSBudWxsKSB7Ci0JCQkvLyB3aGF0IGhhcHBlbmVkPwotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFSkIyMFZhbGlkYXRvciAtIHZhbGlkYXRlIG1ldGhvZCB3aGljaCBtdXN0IG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgiTWV0aG9kIHR5cGUgaXMgbnVsbDogIiArIE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0KLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBtVHlwZS5nZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21UeXBlLmdldE1ldGhvZE5hbWUoYmVhbiwgY2xhenosIG1ldGhvZCl9LCB0aGlzKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRGaWVsZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgbG9uZ1tdIGdldEJhc2VUeXBlcygpOwotCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKTsgLy8gaXMgYSBtaXNzaW5nIChvciBwcmVzZW50KQotCQkJCQkJCQkJCQkJCQkJIC8vIFJlbW90ZUV4Y2VwdGlvbiBhIHdhcm5pbmcgb3IgYW4KLQkJCQkJCQkJCQkJCQkJCSAvLyBlcnJvcj8gU2VlIElMb2NhbFR5cGUgYW5kCi0JCQkJCQkJCQkJCQkJCQkgLy8gSVJlbW90ZVR5cGUuCi0KLQlwdWJsaWMgZmluYWwgbG9uZyBnZXRNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRVhDTFVERURfTUVUSE9EOwotCQl9Ci0JCWxvbmcgaWQgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCwgdGhpcyk7Ci0JCWlmICgoaWQgJiBDTElOSVQpID09IENMSU5JVCkgewotCQkJcmV0dXJuIEVYQ0xVREVEX01FVEhPRDsKLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgcmVnaXN0ZXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJX21ldGhvZExpc3QgPSAoX21ldGhvZExpc3QgfCBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCwgdGhpcykpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlU3VwZXJ0eXBlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlU2hvdWxkQmVTdXBlclR5cGVzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCXZhbGlkYXRlU2hvdWxkTm90QmVTdXBlclR5cGVzKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZjCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcGFyYW0gY2xhenoKLQkgKiBAdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2hvdWxkTm90QmVTdXBlclR5cGVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJbG9uZ1tdIHR5cGVzOwotCQkvLyBUZXN0IGZvciB0eXBlcyB3aGljaCBjYW4gYmUgc3VwZXJ0eXBlcywgdGhvdWdoIGl0J3MgZWl0aGVyIG5vdCByZWNvbW1lbmRlZCBvciBzaG91bGQgYmUKLQkJLy8gY29kZWQgd2l0aCBjYXV0aW9uCi0JCXR5cGVzID0gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCk7Ci0JCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSmF2YUhlbHBlcnMgc3VwZXJUeXBlID0gQ2xhc3NVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRTdXBlcnR5cGUoYmVhbiwgdHlwZXNbaV0pOwotCQkJCWlmIChzdXBlclR5cGUgPT0gbnVsbCkgewotCQkJCQkvLyBubyBzdXBlcnR5cGUKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBzdXBlclR5cGUpKSB7Ci0JCQkJCS8vIElXQUQ0MTc5ID0gQmVjYXVzZSB0aGlzIGNsYXNzIGltcGxlbWVudHMgezB9LCAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEKLQkJCQkJLy8gbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdC4gUmVhZCBzZWN0aW9uIDEwLjYuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDI5MiA9IEJlY2F1c2UgezB9IGltcGxlbWVudHMgezF9LCAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEgbWV0aG9kCi0JCQkJCS8vIGFyZ3VtZW50IG9yIHJlc3VsdC4gUmVhZCBzZWN0aW9uIDEyLjIuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDA0MyA9IEJlY2F1c2UgezB9IGltcGxlbWVudHMgezF9LCAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEgbWV0aG9kCi0JCQkJCS8vIGFyZ3VtZW50IG9yIHJlc3VsdC4gUmVhZCBzZWN0aW9uIDcuMTAuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDQwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YwotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNob3VsZEJlU3VwZXJUeXBlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWxvbmdbXSB0eXBlcyA9IGdldFN1cGVydHlwZXMoKTsKLQkJaWYgKHR5cGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKYXZhSGVscGVycyBzdXBlclR5cGUgPSBDbGFzc1V0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldFN1cGVydHlwZShiZWFuLCB0eXBlc1tpXSk7Ci0JCQkJaWYgKHN1cGVyVHlwZSA9PSBudWxsKSB7Ci0JCQkJCS8vIG5vIHN1cGVydHlwZQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBzdXBlclR5cGUpKSB7Ci0JCQkJCS8vIElXQUQ0MDI2ID0gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBqYXZheC5lamIuU2Vzc2lvbkJlYW4uIFJlYWQgc2VjdGlvbgotCQkJCQkvLyA3LjUuMSwgNy4xMC4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0Mzc5ID0gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBqYXZheC5lamIuTWVzc2FnZURyaXZlbkJlYW4uIFJlYWQKLQkJCQkJLy8gc2VjdGlvbiAxNS40LjEsIDE1LjcuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDM4MCA9IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgamF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lci4gUmVhZCBzZWN0aW9uCi0JCQkJCS8vIDE1LjQuMSwgMTUuNy4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0MTcwID0gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBqYXZhLmVqYi5FbnRpdHlCZWFuLiBSZWFkIHNlY3Rpb24gMTAuNi4yCi0JCQkJCS8vIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0Mjg2ID0gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBqYXZhLmVqYi5FbnRpdHlCZWFuLiBSZWFkIHNlY3Rpb24gMTIuMi4yCi0JCQkJCS8vIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXXtzdXBlclR5cGUuZ2V0SmF2YU5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQlfbWV0aG9kTGlzdCA9IE5PX01FVEhPRFM7Ci0JCV9maWVsZExpc3QgPSBOT19GSUVMRFM7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmbGVjdGlvbkVycm9yKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSAgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW117Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmbGVjdGlvbldhcm5pbmcoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSAgewotCQl2Yy5yZW1vdmVNZXNzYWdlcyhmaWVsZCk7Ci0JCXZjLnJlbW92ZU1lc3NhZ2VzKGNsYXp6LCBmaWVsZC5nZXROYW1lKCkpOwotCQlJTWVzc2FnZSBtZXNzYWdlID0gZ2V0UmVmbGVjdGlvbldhcm5pbmcodmMsIGV4YywgYmVhbiwgY2xhenosIGZpZWxkKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWZsZWN0aW9uV2FybmluZyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgIHsKLQkJdmMucmVtb3ZlTWVzc2FnZXMobWV0aG9kKTsKLQkJdmMucmVtb3ZlTWVzc2FnZXMoY2xhenosIG1ldGhvZC5nZXRTaWduYXR1cmUoKSk7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBnZXRSZWZsZWN0aW9uV2FybmluZyh2YywgZXhjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSU1lc3NhZ2UgZ2V0UmVmbGVjdGlvbldhcm5pbmcoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEVPYmplY3QgZmllbGRPck1ldGhvZCkgewotCQlpZiAoZXhjID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGJhZENsYXp6ID0gZXhjLmdldEphdmFDbGFzcygpOwotCQlTdHJpbmcgdHlwZU5hbWUgPSAoYmFkQ2xhenogPT0gbnVsbCkgPyAiPyIgOiBiYWRDbGF6ei5nZXRRdWFsaWZpZWROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0KLQkJaWYgKGZpZWxkT3JNZXRob2QgaW5zdGFuY2VvZiBGaWVsZCkgewotCQkJU3RyaW5nIG5hbWUgPSAoKEZpZWxkKSBmaWVsZE9yTWV0aG9kKS5nZXROYW1lKCk7Ci0JCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDMzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIChGaWVsZCkgZmllbGRPck1ldGhvZCwgbmV3IFN0cmluZ1tde25hbWUsIHR5cGVOYW1lfSwgdGhpcyk7Ci0JCX0gZWxzZSBpZiAoZmllbGRPck1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZCkgewotCQkJU3RyaW5nIG5hbWUgPSAoKE1ldGhvZCkgZmllbGRPck1ldGhvZCkuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpOwotCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQzMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCAoTWV0aG9kKSBmaWVsZE9yTWV0aG9kLCBuZXcgU3RyaW5nW117bmFtZSwgdHlwZU5hbWV9LCB0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBuYW1lID0gKChYTUlSZXNvdXJjZSkgZmllbGRPck1ldGhvZC5lUmVzb3VyY2UoKSkuZ2V0SUQoZmllbGRPck1ldGhvZCk7Ci0JCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDMzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXXtuYW1lLCB0eXBlTmFtZX0sIHRoaXMpOwotCQl9Ci0JCWlmIChiYWRDbGF6eiA9PSBudWxsKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoImdldE1lc3NhZ2VJZChJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgYm9vbGVhbikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoIkludmFsaWRJbnB1dEV4Y2VwdGlvbiB0aHJvd24gb24gdW5rbm93biBjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCi0KLQlwdWJsaWMgZmluYWwgSmF2YUNsYXNzIGdldENvbXBvbmVudEludGVyZmFjZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmICgoaXNSZW1vdGUoKSAmIElFSkJUeXBlLlJFTU9URSkgPT0gSUVKQlR5cGUuUkVNT1RFKSB7Ci0JCQlyZXR1cm4gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJfQotCQlyZXR1cm4gYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGV4aXN0cyhsb25nIG1ldGhvZFR5cGUpIHsKLQkJcmV0dXJuICgoX21ldGhvZExpc3QgJiBtZXRob2RUeXBlKSA9PSBtZXRob2RUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSmF2YUNsYXNzIGdldEhvbWVJbnRlcmZhY2UoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJcmV0dXJuIGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQl9Ci0JCXJldHVybiBiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gewotCQlpZiAoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJLy8gbXVzdCB0aHJvdyBSZW1vdGVFeGNlcHRpb24gb3Igb25lIG9mIGl0cyBwYXJlbnRzIChJT0V4Y2VwdGlvbiBvciBFeGNlcHRpb24pCi0JCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c1JlbW90ZUV4Y2VwdGlvbk9yUGFyZW50KGJlYW4sIG1ldGhvZCk7Ci0JCX0gZWxzZSBpZiAoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5MT0NBTCkgPT0gSUVKQlR5cGUuTE9DQUwpIHsKLQkJCS8vIG11c3Qgbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbgotCQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5kb2VzTm90VGhyb3dSZW1vdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlUk1JX0lJT1BUeXBlUnVsZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0LCBib29sZWFuIGNoZWNrUmV0dXJuVHlwZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmICgoaXNSZW1vdGUoKSAmIElFSkJUeXBlLlJFTU9URSkgPT0gSUVKQlR5cGUuUkVNT1RFKSB7Ci0JCQlKYXZhUGFyYW1ldGVyW10gcGFybXMgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKYXZhUGFyYW1ldGVyIHBhcm0gPSBwYXJtc1tpXTsKLQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BUeXBlKGJlYW4sIHBhcm0uZ2V0SmF2YVR5cGUoKSkpIHsKLQkJCQkJSU1ldGhvZFR5cGUgbXQgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QsIHRoaXMpOwotCQkJCQlpZiAobXQgPT0gbnVsbCkgewotCQkJCQkJLy8gbG9nCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIG10LmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117cGFybS5nZXRKYXZhVHlwZSgpLmdldEphdmFOYW1lKCl9LCB0aGlzKTsgLy8gQ2FuJ3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB1c2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBuYW1lCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBmaWVsZCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBiZWNhdXNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gd2hlbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGl0J3MKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyByZXR1cm4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0eXBlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBtZXRob2QsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gaXQncwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGNvbmZ1c2luZwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gc2VlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gInJlc3VsdCIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBhcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG5hbWUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGZpZWxkLgotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNoZWNrUmV0dXJuVHlwZSkgewotCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTGVnYWxSTUlfSUlPUFR5cGUoYmVhbiwgbWV0aG9kLmdldFJldHVyblR5cGUoKSkpIHsKLQkJCQkJSU1ldGhvZFR5cGUgbXQgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QsIHRoaXMpOwotCQkJCQlpZiAobXQgPT0gbnVsbCkgewotCQkJCQkJLy8gbG9nCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIG10LmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117bWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7IC8vIENhbid0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHVzZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gbmFtZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gZmllbGQsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGJlY2F1c2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gd2hlbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBpdCdzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyByZXR1cm4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdHlwZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gbWV0aG9kLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBpdCdzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGNvbmZ1c2luZwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0bwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBzZWUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gInJlc3VsdCIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gYXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG5hbWUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGZpZWxkLgotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIGRvbid0IG5lZWQgdG8gY2hlY2sKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGZvbGxvd1JNSV9JSU9QSW5oZXJpdGFuY2VSdWxlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJaWYgKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMZWdhbFJNSV9JSU9QSW5oZXJpdGFuY2UoY2xhenopOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlU2VyaWFsVmVyc2lvblVJRChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHsKLQkJLyoKLQkJICogRm9yIG5vdywgZG8gbm90aGluZy4gSW4gZnV0dXJlLCBjaGVjayBpZiB0aGUgZmllbGQgaXMgcHVibGljICYgc3RhdGljPwotCQkgKi8KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVCZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTNhM2FkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogUGVyZm9ybXMgdmFsaWRhdGlvbiBjb21tb24gdG8gc2Vzc2lvbiBhbmQgZW50aXR5IGJlYW5zLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVZhbGlkYXRlQmVhbiBleHRlbmRzIEFWYWxpZGF0ZUVKQiB7Ci0JcHJvdGVjdGVkIEhhc2hTZXQgY29tcG9uZW50UGFyZW50cyA9IG51bGw7IC8vIFRoZSBKYXZhQ2xhc3MgaW5zdGFuY2VzIHdoaWNoIGFyZSBwYXJlbnRzIG9mIHRoaXMgSmF2YUNsYXNzIGluc3RhbmNlLCBpZiB0aGlzIEphdmFDbGFzcyBpbnN0YW5jZSBpcyBwYXJ0IG9mIGEgY29tcG9uZW50IGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLQkKLQlwdWJsaWMgQVZhbGlkYXRlQmVhbigpIHsKLQkJY29tcG9uZW50UGFyZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQljb21wb25lbnRQYXJlbnRzLmNsZWFyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29tcG9uZW50UGFyZW50cyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCWlmIChzdXBlcnR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgdGhpcyBDTVAncyBzdXBlcnR5cGUKLQkJSmF2YUNsYXNzIHRoaXNFamJPYmplY3QgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCUphdmFDbGFzcyBwYXJlbnRFamJPYmplY3QgPSBzdXBlcnR5cGUuZ2V0RWpiQ2xhc3MoKTsKLQotCQkvLyBFSkJPYmplY3QgYSBYY2hpbGQgb2YgcGFyZW50IEVKQk9iamVjdCAoWCA9IGNoaWxkLCBncmFuZGNoaWxkLCBncmVhdC1ncmFuZGNoaWxkLCBldGMuKQotCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odGhpc0VqYk9iamVjdCwgcGFyZW50RWpiT2JqZWN0KSkgewotCQkJY29tcG9uZW50UGFyZW50cy5hZGQocGFyZW50RWpiT2JqZWN0KTsKLQkJfQotCQlidWlsZENvbXBvbmVudFBhcmVudHMoc3VwZXJ0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuICgoRW50ZXJwcmlzZUJlYW4pcGFyZW50KS5nZXRFamJDbGFzcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0UmVtb3RlSG9tZU1ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFswXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldFJlbW90ZUNvbXBvbmVudE1ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFsxXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldEJlYW5DbGFzc01ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFsyXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRNZXRob2RzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gQSBiZWFuIGNsYXNzIG5lZWRzIHRoZSBmb2xsb3dpbmcgY2xhc3NlcycgZXh0ZW5kZWQgbWV0aG9kczoKLQkJLy8gICAgMS4gaG9tZQotCQkvLyAgICAyLiByZW1vdGUKLQkJLy8gICAgMy4gYmVhbiBjbGFzcyAod2hlbiBzZWFyY2hpbmcgZm9yIGEgbWF0Y2hpbmcgZWpiUG9zdENyZWF0ZSBtZXRob2QpLgotCQkvLyBJZiBhIHBhcnRpY3VsYXIgYmVhbiBkb2Vzbid0IHVzZSBhIHJlbW90ZSB2aWV3IG9yIGxvY2FsIHZpZXcsCi0JCS8vIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIGFycmF5IHdpbGwgYmUgbnVsbC4gCi0JCUxpc3RbXSByZXN1bHQgPSBuZXcgTGlzdFszXTsKLQkJSmF2YUNsYXNzIHJlbW90ZUhvbWUgPSBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJaWYocmVtb3RlSG9tZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbMF0gPSByZW1vdGVIb21lLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzBdID0gbnVsbDsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIHJlbW90ZUNvbXBvbmVudCA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCWlmKHJlbW90ZUNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbMV0gPSByZW1vdGVDb21wb25lbnQuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMV0gPSBudWxsOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlpZihiZWFuQ2xhc3MgIT0gbnVsbCkgewotCQkJcmVzdWx0WzJdID0gYmVhbkNsYXNzLmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzJdID0gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEgYmVhbiBjbGFzcycgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQkKLQkvKioKLQkgKiBGb3IgdGhlIGNoZWNrIHRoYXQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgaGFzIGEgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvbiB0aGUgaG9tZSwKLQkgKiB0aGlzIG1ldGhvZCwgZ2l2ZW4gdGhlIGJlYW4gbWV0aG9kLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGhvbWUgbWV0aG9kLgotCSAqCi0JICogNi4xMC42IFNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotCSAqICAgICB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiQ3JlYXRlIG1ldGhvZCAKLQkgKiAgICAgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIAotCSAqICAgICBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkgKi4uLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JICovCi0JcHVibGljIGZpbmFsIE1ldGhvZCBnZXRNYXRjaGluZ0hvbWVDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKYXZhQ2xhc3MgaG9tZUludGYgPSBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGhvbWVJbnRmKTsKLQotCQkvLyBjaGVjayBvbmx5IHRoZSBjdXJyZW50IGNsYXNzLCBub3QgdGhlIHBhcmVudHMgaW4gdGhpcyBjYXNlLgotCQkvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UgaGllcmFyY2h5IHRlc3RzLgotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSwgaG9tZUludGYuZ2V0TWV0aG9kcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogRm9yIHRoZSBjaGVjayB0aGF0IHRoZSBlamJDcmVhdGUgbWV0aG9kIGhhcyBhIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGhvbWUsCi0JICogdGhpcyBtZXRob2QsIGdpdmVuIHRoZSBiZWFuIG1ldGhvZCwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBob21lIG1ldGhvZC4KLQkgKgotCSAqIDYuMTAuNiBTZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiAKLQkgKiAgICAgdGhlIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0JICogICAgIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkgKiAgICAgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JICouLi4KLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCSAqICAgICBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkgKiAgICAgdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCSAqICAgICAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkgKiAgICAgb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0TWF0Y2hpbmdIb21lQ3JlYXRlTWV0aG9kRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy4gdGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGhvbWVJbnRmID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBob21lSW50Zik7Ci0KLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChob21lSW50ZiwgbWV0aG9kLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhcmVudCB3aGljaCB0aGUgYmVhbiBtdXN0IGltcGxlbWVudC4KLQkgKiBGb3IgZW50aXR5IGJlYW5zLCBpdCdzIGphdmF4LmVqYi5FbnRpdHlCZWFuLgotCSAqIEZvciBzZXNzaW9uIGJlYW5zLCBpdCdzIGphdmF4LmVqYi5TZXNzaW9uQmVhbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhcmVudE5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBwYXNzZWQgaW4gaXMgYSBidXNpbmVzcyBtZXRob2QuCi0JICoKLQkgKiBBbHRob3VnaCB0aGUgRUpCIDEuMSBzcGVjIGltcGxpZXMgdGhhdCBhbGwgbm9uLWZyYW1ld29yayBtZXRob2RzIGFyZSBidXNpbmVzcyBtZXRob2RzLAotCSAqIGRldmVsb3BlcnMgbWF5IGNyZWF0ZSBtZXRob2RzIG9uIHRoZSBiZWFuIHdoaWNoIGFyZSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIFRoaXMKLQkgKiBtZXRob2QgKGlzQnVzaW5lc3NNZXRob2QpIHNlcGFyYXRlcyB0aGUgImludGVybmFsIGhlbHBlciIgbWV0aG9kcyBmcm9tIHRoZSBidXNpbmVzcwotCSAqIG1ldGhvZHMgYnkgY2hlY2tpbmcgaWYgYSBjb3JyZXNwb25kaW5nIG1ldGhvZCBleGlzdHMgb24gdGhlIHJlbW90ZSBpbnRlcmZhY2UuIElmIGl0Ci0JICogZG9lcywgY29uc2lkZXIgdGhpcyBhIGJ1c2luZXNzIG1ldGhvZC4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCdXNpbmVzc01ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCi0JCWlmIChpc0ZyYW1ld29ya01ldGhvZChuYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIENoZWNrIGlmIHRoZXJlJ3MgYSBtYXRjaGluZyBtZXRob2Qgb24gdGhlIHJlbW90ZSBpbnRlcmZhY2UuCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUphdmFDbGFzcyByZW1vdGVJbnRlcmZhY2UgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVtb3RlSW50ZXJmYWNlKTsKLQkJTWV0aG9kIHJlbW90ZUludGVyZmFjZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChyZW1vdGVJbnRlcmZhY2UsIG5hbWUsIG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKSk7Ci0JCWlmICgocmVtb3RlSW50ZXJmYWNlTWV0aG9kID09IG51bGwpIHx8IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNFSkJPYmplY3RNZXRob2QoYmVhbiwgcmVtb3RlSW50ZXJmYWNlTWV0aG9kKSkpIHsKLQkJCS8vIG5vIG1hdGNoaW5nIG1ldGhvZAotCQkJLy8gZmlsdGVyIG91dCBtZXRob2RzIGZyb20gamF2YXguZWpiLkVKQk9iamVjdAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgcGFzc2VkIGluIGlzIGluaGVyaXRlZCBmcm9tIGEgcGFyZW50IGluIGEKLQkgKiBjb21wb25lbnQgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tcG9uZW50SW5oZXJpdGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChjb21wb25lbnRQYXJlbnRzID09IG51bGwpIHsKLQkJCS8vIE5vdCBwYXJ0IG9mIGEgY29tcG9uZW50IGluaGVyaXRhbmNlIGhpZXJhcmNoeQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIChjb21wb25lbnRQYXJlbnRzLmNvbnRhaW5zKG1ldGguZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRnJhbWV3b3JrTWV0aG9kKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJBQ1RJVkFURSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBBU1NJVkFURSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlJFTU9WRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkZJTkQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJQT1NUQ1JFQVRFKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOQUxJWkUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGNhbiwgYW5kIHNob3VsZCwgYmUgdmFsaWRhdGVkLgotCSAqIEZpbHRlciBvdXQgZmF1bHR5IGZpZWxkcyAoaS5lLiwgbnVsbCksIGFuZCBmaWVsZHMgd2hpY2gKLQkgKiBiZWxvbmcgdG8gdGhlIGJhc2UgdHlwZSwgd2hhdGV2ZXIgdGhhdCBpcy4gKGUuZy4gamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChzdXBlci5pc1ZhbGlkKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQsIGZpZWxkc0V4dGVuZGVkTGlzdCkpIHsKLQkJCS8vIGV4Y2x1ZGUgcm9vdCBvYmplY3QgbWV0aG9kcwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0phdmFMYW5nT2JqZWN0RmllbGQoYmVhbiwgZmllbGQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGNhbiwgYW5kIHNob3VsZCwgYmUgdmFsaWRhdGVkLgotCSAqIEZpbHRlciBvdXQgZmF1bHR5IG1ldGhvZHMgKGkuZS4sIG51bGwpLCBhbmQgbWV0aG9kcyB3aGljaAotCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKHN1cGVyLmlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpKSB7Ci0JCQkvLyBleGNsdWRlIHJvb3Qgb2JqZWN0IG1ldGhvZHMKLQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNKYXZhTGFuZ09iamVjdE1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKSkgewotCQkJCXJldHVybiBpc1ZhbGlkRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUpKSB7Ci0JCQkJcmV0dXJuIGlzVmFsaWRFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBwYXNzZWQgaW4gaXMgbm90IGluaGVyaXRlZCAKLQkgKiBmcm9tIGEgcGFyZW50IGluIGEgY29tcG9uZW50IGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgb3IgaXMgaW5oZXJpdGVkLAotCSAqIGJ1dCBpcyBhbHNvIGRlZmluZWQgb24gdGhpcyBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGV4Y2x1ZGUgZWpiQ3JlYXRlIG1ldGhvZHMgd2hpY2ggYXJlIGluaGVyaXRlZAotCSAqIGZyb20gYSBwYXJlbnQgaW4gYSBjb21wb25lbnQgaW5oZXJpdGFuY2UgaGllcmFyY2h5LCBhbmQgYXJlIG5vdAotCSAqIGV4cG9zZWQgYW55d2hlcmUgb24gdGhpcyBiZWFuIGNsYXNzIGluc3RhbmNlIGl0c2VsZi4gKGkuZS4sIGluaGVyaXRlZCwKLQkgKiBidXQgbmV2ZXIgdXNlZC4pIFNpbmNlIHdlIGdlbmVyYXRlIHRoZSBjb2RlIGZvciB0aGVzZSBtZXRob2RzLCB3ZQotCSAqIHNob3VsZCBub3QgZmxhZyB0aGVtIGFzIHdhcm5pbmdzLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzVmFsaWRFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRoLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCQlib29sZWFuIGlzQ29tcCA9IGlzQ29tcG9uZW50SW5oZXJpdGVkKHZjLCBiZWFuLCBjbGF6eiwgbWV0aCk7Ci0JCWlmIChpc0NvbXApIHsKLQkJCU1ldGhvZCBob21lTWV0aCA9IGdldE1hdGNoaW5nSG9tZUNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGgsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJCWlmIChob21lTWV0aCA9PSBudWxsKSB7Ci0JCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCQotCS8qKgotCSAqIDE4LjEuMiBQcm9ncmFtbWluZyByZXN0cmljdGlvbnMKLQkgKi4uLgotCSAqICAgIC0gQW4gZW50ZXJwcmlzZSBCZWFuIG11c3Qgbm90IHVzZSByZWFkL3dyaXRlIHN0YXRpYyBmaWVsZHMuIFVzaW5nIHJlYWQtb25seSBzdGF0aWMgZmllbGRzIGlzCi0JICogICBhbGxvd2VkLiBUaGVyZWZvcmUsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHN0YXRpYyBmaWVsZHMgaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcyBiZQotCSAqICAgZGVjbGFyZWQgYXMgZmluYWwuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy9zdXBlci5wcmltVmFsaWRhdGUoZWpiTWV0aG9kKTsKLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCXZhbGlkYXRlU3RhdGljRmllbGQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JfQotCQotCS8qKgotCSAqIDYuMTAuNCBCdXNpbmVzcyBtZXRob2RzCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBidXNpbmVzcyBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgbXVzdCBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0JICogCQktIFRoZSBtZXRob2QgbmFtZXMgY2FuIGJlIGFyYml0cmFyeSwgYnV0IHRoZXkgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIiB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgY2FsbGJhY2sgbWV0aG9kcyB1c2VkIGJ5IHRoZSBFSkIgYXJjaGl0ZWN0dXJlLgotCSAqCi0JICogOS4yLjYgQnVzaW5lc3MgbWV0aG9kcwotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGRlZmluZSB6ZXJvIG9yIG1vcmUgYnVzaW5lc3MgbWV0aG9kcyB3aG9zZSBzaWduYXR1cmVzIAotCSAqICAgICBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAgICAgICAgLSBUaGUgbWV0aG9kIG5hbWVzIGNhbiBiZSBhcmJpdHJhcnksIGJ1dCB0aGV5IG11c3Qgbm90IHN0YXJ0IHdpdGggJ2VqYicgdG8gCi0JICogICAgICAgICAgYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIGNhbGxiYWNrIG1ldGhvZHMgdXNlZCBieSB0aGUgRUpCIGFyY2hpdGVjdHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBjYWxsYmFjayBtZXRob2RzIHVzZWQgYnkgdGhlIEVKQiBhcmNoaXRlY3R1cmUuCi0JCWlmIChtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9FSkIpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDExLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFNlY3Rpb24gNi4xMC41IChzZXNzaW9uKSwgOS4yLjcgKGVudGl0eSksIGRlY2xhcmUgdGhhdCBhbGwgZXhjZXB0aW9ucyBkZWNsYXJlZAotCQkvLyBvbiB0aGUgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mCi0JCS8vIHRoZSBtYXRjaGluZyBjcmVhdGUgb2YgdGhlIHJlbW90ZSBpbnRlcmZhY2UuCi0KLQkJSmF2YUNsYXNzIHJlbW90ZSA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCByZW1vdGUpOwotCi0JCU1ldGhvZCByZW1vdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQocmVtb3RlLCBtZXRob2QsIG1ldGhvZC5nZXROYW1lKCkpOwotCQlpZiAocmVtb3RlTWV0aG9kID09IG51bGwpIHsKLQkJCS8vIFRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkbid0IGhhdmUgYmVlbiBjYWxsZWQ7IHVubGVzcyB0aGUgbWV0aG9kIGV4aXN0cyBvbiB0aGUgcmVtb3RlLCB0aGlzIGJlYW4gbWV0aG9kIGlzbid0IGEgYnVzaW5lc3MgbWV0aG9kLgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1ldGhvZCwgcmVtb3RlTWV0aG9kKTsKLQkJaWYgKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MzIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgcmVtb3RlLmdldFF1YWxpZmllZE5hbWUoKSwgZXhjLmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXZhbGlkYXRlTWF0Y2hpbmdNZXRob2RFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpLCByZW1vdGVNZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiA2LjEwLjIgU2Vzc2lvbiBiZWFuIGNsYXNzCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3Igc2Vzc2lvbiBiZWFuIGNsYXNzOgotCSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBqYXZheC5lamIuU2Vzc2lvbkJlYW4gCi0JICogICAgICAgIGludGVyZmFjZS4KLQkgKiAJCS0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMsIG11c3Qgbm90IGJlIGZpbmFsLCBhbmQgbXVzdCBub3QgCi0JICogICAgICAgIGJlIGFic3RyYWN0LgotCSAqIAkJLSBUaGUgY2xhc3MgbWF5LCBidXQgaXMgbm90IHJlcXVpcmVkIHRvLCBpbXBsZW1lbnQgdGhlIHNlc3Npb24gYmVhbidzIAotCSAqICAgICAgICByZW1vdGUgaW50ZXJmYWNlIFs0XSAuCi0JICogCQktIElmIHRoZSBjbGFzcyBpcyBhIHN0YXRlZnVsIHNlc3Npb24gYmVhbiwgaXQgbWF5IG9wdGlvbmFsbHkgaW1wbGVtZW50IAotCSAqICAgICAgICB0aGUgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCSAqIAkJLSBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG1heSBoYXZlIHN1cGVyY2xhc3NlcyBhbmQvb3Igc3VwZXJpbnRlcmZhY2VzLiBJZiB0aGUgCi0JICogICAgICAgIHNlc3Npb24gYmVhbiBoYXMgc3VwZXJjbGFzc2VzLCB0aGVuIHRoZSBidXNpbmVzcyBtZXRob2RzLCB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMsIAotCSAqICAgICAgICB0aGUgbWV0aG9kcyBvZiB0aGUgU2Vzc2lvbkJlYW4gaW50ZXJmYWNlLCBhbmQgdGhlIG1ldGhvZHMgb2YgdGhlIG9wdGlvbmFsIAotCSAqICAgICAgICBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZSBtYXkgYmUgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLCAKLQkgKiAgICAgICAgb3IgaW4gYW55IG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0JICoKLQkgKi4uLgotCSAqIDkuMi4yIEVudGVycHJpc2UgYmVhbiBjbGFzcwotCSAqICAgLSBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciBhbiBlbnRpdHkgYmVhbiBjbGFzczoKLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50LCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCB0aGUgamF2YXguZWpiLkVudGl0eUJlYW4gaW50ZXJmYWNlLgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGFzIHB1YmxpYyBhbmQgbXVzdCBub3QgYmUgYWJzdHJhY3QuCi0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IG5vdCBiZSBkZWZpbmVkIGFzIGZpbmFsLgotCSAqLi4uCi0JICogICAtIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIFs5XS4gCi0JICogICAgIElmIHRoZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UsIHRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgbm8tb3AgCi0JICogICAgIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBqYXZheC5lamIuRUpCT2JqZWN0IGludGVyZmFjZS4gVGhlIGNvbnRhaW5lciAKLQkgKiAgICAgd2lsbCBuZXZlciBpbnZva2UgdGhlc2UgbWV0aG9kcyBvbiB0aGUgYmVhbiBpbnN0YW5jZXMgYXQgcnVudGltZS4KLQkgKiAgIC0gQSBuby1vcCBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBtZXRob2RzIGlzIHJlcXVpcmVkIHRvIGF2b2lkIAotCSAqICAgICBkZWZpbmluZyB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgYWJzdHJhY3QuCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgYW5kIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlLCBhbmQgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgYXMgZGVzY3JpYmVkIAotCSAqICAgICBsYXRlciBpbiB0aGlzIHNlY3Rpb24uCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgaGF2ZSBzdXBlcmNsYXNzZXMgYW5kL29yIHN1cGVyaW50ZXJmYWNlcy4gCi0JICogICAgIElmIHRoZSBlbnRpdHkgYmVhbiBoYXMgc3VwZXJjbGFzc2VzLCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgdGhlIAotCSAqICAgICBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcywgdGhlIGZpbmRlciBtZXRob2RzLCBhbmQgdGhlCi0JICogICAgIG1ldGhvZHMgb2YgdGhlIEVudGl0eUJlYW4gaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgCi0JICogICAgIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBpbiBhbnkgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIGlzIGFsbG93ZWQgdG8gaW1wbGVtZW50IG90aGVyIG1ldGhvZHMgKGZvciAKLQkgKiAgICAgZXhhbXBsZSBoZWxwZXIgbWV0aG9kcyBpbnZva2VkIGludGVybmFsbHkgYnkgdGhlIGJ1c2luZXNzIG1ldGhvZHMpIAotCSAqICAgICBpbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kcyByZXF1aXJlZCBieSB0aGUgRUpCIHNwZWNpZmljYXRpb24uCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlidWlsZENvbXBvbmVudFBhcmVudHMoYmVhbik7Ci0KLQkJLy8gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50LCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCB0aGUgamF2YXguZWpiLkVudGl0eUJlYW4gKGZvciBlbnRpdHkgYmVhbnMpLCAKLQkJLy8gb3IgdGhlIGphdmF4LmVqYi5TZXNzaW9uQmVhbiAoZm9yIHNlc3Npb24gYmVhbnMpLCBpbnRlcmZhY2UuCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oY2xhenosIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGdldFBhcmVudE5hbWUoKSwgYmVhbikpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMTMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpLCBnZXRQYXJlbnROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBGb3IgYm90aCBlbnRpdHkgYW5kIHNlc3Npb24gYmVhbnMsIHRoZSBjbGFzcyBtdXN0IGJlIHB1YmxpYy4KLQkJaWYgKCFjbGF6ei5pc1B1YmxpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDIyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBGb3IgYm90aCBlbnRpdHkgYW5kIHNlc3Npb24gYmVhbnMsIHRoZSBjbGFzcyBtdXN0IG5vdCBiZSBhYnN0cmFjdC4KLQkJaWYgKGNsYXp6LmlzQWJzdHJhY3QoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gRm9yIGJvdGggZW50aXR5IGFuZCBzZXNzaW9uIGJlYW5zLCB0aGUgY2xhc3MgbXVzdCBub3QgYmUgZmluYWwuCi0JCWlmIChjbGF6ei5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNVbm5hbWVkUGFja2FnZShjbGF6ei5nZXRKYXZhUGFja2FnZSgpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjA0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIDkuMi4zIGVqYkNyZWF0ZSBtZXRob2RzCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0JICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiQ3JlYXRlLgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkgKiAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgICAgIC0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZS4KLQkgKiAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLQkgKiAgICAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIAotCSAqICAgICAgICAgaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCSAqICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgdG8gdGhyb3cgdGhlIAotCSAqICAgICAgICAgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyAKLQkgKiAgICAgICAgIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JICogICAgICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICAgICAgdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKiAgIC0gVGhlIGVudGl0eSBvYmplY3QgY3JlYXRlZCBieSB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgYSB1bmlxdWUgcHJpbWFyeSBrZXkuIAotCSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIHByaW1hcnkga2V5IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIHByaW1hcnkga2V5cyBvZiBhbGwgCi0JICogICAgIHRoZSBleGlzdGluZyBlbnRpdHkgb2JqZWN0cyB3aXRoaW4gdGhlIHNhbWUgaG9tZS4gVGhlIGVqYkNyZWF0ZSBtZXRob2Qgc2hvdWxkIAotCSAqICAgICB0aHJvdyB0aGUgRHVwbGljYXRlS2V5RXhjZXB0aW9uIG9uIGFuIGF0dGVtcHQgdG8gY3JlYXRlIGFuIGVudGl0eSBvYmplY3Qgd2l0aCAKLQkgKiAgICAgYSBkdXBsaWNhdGUgcHJpbWFyeSBrZXkuIEhvd2V2ZXIsIGl0IGlzIGxlZ2FsIHRvIHJldXNlIHRoZSBwcmltYXJ5IGtleSBvZiBhCi0JICogICAgIHByZXZpb3VzbHkgcmVtb3ZlZCBlbnRpdHkgb2JqZWN0LgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JICouLi4KLQkgKgotCSAqIDkuNC4yIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZQotCSAqLi4uCi0JICogICAtIFRoZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCB0byByZXR1cm4gdGhlIHByaW1hcnkga2V5IGNsYXNzIHR5cGUuIAotCSAqICAgICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgc2hvdWxkIGJlIGNvZGVkIHRvIHJldHVybiBhIG51bGwuIAotCSAqICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgaWdub3JlZCBieSB0aGUgQ29udGFpbmVyLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2RfaG9tZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIG1ldGhvZCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZCBtdXN0IGhhdmUgYWxyZWFkeSB0ZXN0ZWQgdGhhdCB0aGUgbWV0aG9kIG5hbWUgaXMgZWpiQ3JlYXRlLgotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCU1ldGhvZCBjcmVhdGVNZXRob2QgPSBnZXRNYXRjaGluZ0hvbWVDcmVhdGVNZXRob2RFeHRlbmRlZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCWlmIChjcmVhdGVNZXRob2QgPT0gbnVsbCkgewotCQkJLy8gQ2FuJ3QgY2hlY2sgdGhlIGV4Y2VwdGlvbnMgb2YgYSBtZXRob2Qgd2hpY2ggZG9lc24ndCBleGlzdC4KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFdoZXRoZXIgdGhpcyBpcyBmcm9tIGEgY29tcG9uZW50IGluaGVyaXRhbmNlIG9yIG5vdCwgaWYgdGhlIG1ldGhvZCBleGlzdHMgb24gdGhlCi0JCS8vIGhvbWUsIGNoZWNrIHRoYXQgdGhlIG1ldGhvZCBmb2xsb3dzIHRoZSBzcGVjLgotCi0JCS8vIFNlY3Rpb24gNi4xMC42IChzZXNzaW9uKSwgOS4yLjggKGVudGl0eSksIGRlY2xhcmUgdGhhdCBhbGwgZXhjZXB0aW9ucyBkZWNsYXJlZAotCQkvLyBvbiB0aGUgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mCi0JCS8vIHRoZSBtYXRjaGluZyBjcmVhdGUgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1ldGhvZCwgY3JlYXRlTWV0aG9kKTsKLQkJaWYgKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MjAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgZXhjLmdldFF1YWxpZmllZE5hbWUoKSwgYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlSGVscGVyTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU5vUmVtb3RlRXhjZXB0aW9uKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBTdHJpbmcgbWVzc2FnZVByZWZpeCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEVKQiAyLjAgYWRkZWQgInRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24iIGFib3ZlCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5kb2VzTm90VGhyb3dSZW1vdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBtZXNzYWdlUHJlZml4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogMTguMS4yIFByb2dyYW1taW5nIHJlc3RyaWN0aW9ucwotCSAqLi4uCi0JICogICAgLSBBbiBlbnRlcnByaXNlIEJlYW4gbXVzdCBub3QgdXNlIHJlYWQvd3JpdGUgc3RhdGljIGZpZWxkcy4gVXNpbmcgcmVhZC1vbmx5IHN0YXRpYyBmaWVsZHMgaXMKLQkgKiAgIGFsbG93ZWQuIFRoZXJlZm9yZSwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc3RhdGljIGZpZWxkcyBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIGJlCi0JICogICBkZWNsYXJlZCBhcyBmaW5hbC4KLQkgKi4uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU3RhdGljRmllbGQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGZpZWxkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEFuIGVudGVycHJpc2UgQmVhbiBtdXN0IG5vdCB1c2UgcmVhZC93cml0ZSBzdGF0aWMgZmllbGRzLiBVc2luZyByZWFkLW9ubHkgc3RhdGljIGZpZWxkcyBpcwotCQkvLyBhbGxvd2VkLiBUaGVyZWZvcmUsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHN0YXRpYyBmaWVsZHMgaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcyBiZQotCQkvLyBkZWNsYXJlZCBhcyBmaW5hbC4KLQkJaWYgKGZpZWxkLmlzU3RhdGljKCkgJiYgIWZpZWxkLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMjAwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ01ldGhvZEV4Y2VwdGlvbnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIEphdmFDbGFzcyBtYXRjaGluZ0NsYXp6LCBNZXRob2QgbWF0Y2hpbmdNZXRob2QpIHsKLQkJLy8gRXZlcnkgZXhjZXB0aW9uIHRocm93biBvbiB0aGUgYmVhbiBjbGFzcycgbWV0aG9kIG11c3QgYmUgdGhyb3duIG9uIHRoZSBjb21wb25lbnQvaG9tZSBtZXRob2QKLQkJLyogRG9uJ3QgY2hlY2sgZm9yIHRoaXMgaGVyZSAtIGxldCB0aGUgaG9tZSAmIGNvbXBvbmVudCBkbyBpdC4KLQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhiZWFuLCBtZXRob2QsIG1hdGNoaW5nTWV0aG9kKTsKLQkJSXRlcmF0b3IgZWl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCX0KLQkJKi8KLQkJCi0JCS8vIEV2ZXJ5IGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIGNvbXBvbmVudC9ob21lIG1ldGhvZCBzaG91bGQgYmUgdGhyb3duIG9yIHRoZXJlIG1heSBiZSBjb21waWxlIGVycm9ycwotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRTdWJ0eXBlRXhjZXB0aW9ucyhiZWFuLCBtYXRjaGluZ01ldGhvZCwgbWV0aG9kKTsKLQkJSXRlcmF0b3IgZWl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShlaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhQ2xhc3MgZXhjZXB0aW9uID0gKEphdmFDbGFzcyllaXRlcmF0b3IubmV4dCgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQ1NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtleGNlcHRpb24uZ2V0SmF2YU5hbWUoKSwgbWF0Y2hpbmdDbGF6ei5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHRoaXNFamJPYmplY3QpIHsKLQkJLy8gVGhlIEphdmEgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIG11c3QgbWF0Y2ggdGhlIEVKQiBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCi0JCS8vIGUuZy4gaWYgRUpCIEIgaXMgYSBjaGlsZCBvZiBFSkIgQSwgdGhlbiBjbGFzcyBCIG11c3QgYmUgYSBjaGlsZCBvZiBjbGFzcyBBLgotCQkvLyBCIGNvdWxkIGJlIGEgZ3JhbmRjaGlsZCAob3IgZ3JlYXQtZ3JhbmRjaGlsZCBvciAuLi4pIG9mIEEuCi0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUVudGVycHJpc2VCZWFuIHN1cGVydHlwZSA9IGdldFN1cGVyVHlwZShiZWFuKTsKLQkJSmF2YUNsYXNzIHBhcmVudEVqYk9iamVjdCA9IG51bGw7Ci0JCWlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewotCQkJcGFyZW50RWpiT2JqZWN0ID0gc3VwZXJ0eXBlLmdldEVqYkNsYXNzKCk7Ci0KLQkJCS8vIEVKQk9iamVjdCBhIFhjaGlsZCBvZiBwYXJlbnQgRUpCT2JqZWN0IChYID0gY2hpbGQsIGdyYW5kY2hpbGQsIGdyZWF0LWdyYW5kY2hpbGQsIGV0Yy4pCi0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0aGlzRWpiT2JqZWN0KTsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUocGFyZW50RWpiT2JqZWN0KTsKLQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHRoaXNFamJPYmplY3QsIHBhcmVudEVqYk9iamVjdCkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7IHRoaXNFamJPYmplY3QuZ2V0UXVhbGlmaWVkTmFtZSgpLCBwYXJlbnRFamJPYmplY3QuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzRWpiT2JqZWN0LCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSwgYmVhbi5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCQotLy8JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBzdXBlcnR5cGUsIHBhcmVudEVqYk9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVKQi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVKQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTZjMTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFSkIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEvNS8wMSAxMTo1MTowOSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0ZUVKQiBleHRlbmRzIEFWYWxpZGF0aW9uUnVsZSB7Ci0JcHJpdmF0ZSBMaXN0IHJvbGVNZXRob2ROYW1lczsKLQkKLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJaWYocm9sZU1ldGhvZE5hbWVzICE9IG51bGwpIHsKLQkJCXJvbGVNZXRob2ROYW1lcy5jbGVhcigpOwotCQkJcm9sZU1ldGhvZE5hbWVzID0gbnVsbDsgLy8gaW4gdGhpcyBjYXNlLCBjbGVhcmluZyB0aGUgbGlzdCBpc24ndCBlbm91Z2gsIGJlY2F1c2UgaXQgaXMgbGVnYWwgdG8gaGF2ZSB6ZXJvIHJvbGUgbmFtZXMuIE11c3QgYmUgbnVsbCBvciB3ZSdsbCBrZWVwIHRyeWluZyB0byByZWxvYWQgdGhlIHJvbGUgbmFtZXMganVzdCBiZWNhdXNlIHRoZXJlIGFyZSB6ZXJvIHJvbGUgbmFtZXMuCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICg5LzUvMjAwMSAxMjozNjozOSBQTSkKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0Um9sZU1ldGhvZE5hbWVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQl0cnkgewotCQkJaWYgKHJvbGVNZXRob2ROYW1lcyA9PSBudWxsICYmIGJlYW4gIT0gbnVsbCkgewotCQkJCXJvbGVNZXRob2ROYW1lcyA9IGdldFJvbGVNZXRob2ROYW1lc0V4dGVuZGVkKGJlYW4pOwotCQkJfQotCQkJcmV0dXJuIHJvbGVNZXRob2ROYW1lczsKLQkJfQotCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGV4Yyk7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VqYlJlbGF0aW9uc2hpcFJvbGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlMaXN0IGFSb2xlTWV0aG9kTmFtZXMgPSBnZXRSb2xlTWV0aG9kTmFtZXModmMsIGJlYW4pOwotCQlpZihhUm9sZU1ldGhvZE5hbWVzICE9IG51bGwgJiYgIWFSb2xlTWV0aG9kTmFtZXMuaXNFbXB0eSgpKQotCQkgIHJldHVybiBhUm9sZU1ldGhvZE5hbWVzLmNvbnRhaW5zKG1ldGhvZC5nZXROYW1lKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBjYW4sIGFuZCBzaG91bGQsIGJlIHZhbGlkYXRlZC4KLQkgKiBGaWx0ZXIgb3V0IGZhdWx0eSBmaWVsZHMgKGkuZS4sIG51bGwpLCBhbmQgZmllbGRzIHdoaWNoCi0JICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIExpc3RbXSBmaWVsZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIGZvbGxvd2luZyBjYWxsIGNoZWNrcyBpZiB0aGUgdHlwZSByZWZsZWN0ZWQgcHJvcGVybHkKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGZpZWxkKSk7Ci0KLQkJaWYgKGZpZWxkLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJRUxETkFNRV9TRVJJQUxWRVJTSU9OVUlEKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgY2FuLCBhbmQgc2hvdWxkLCBiZSB2YWxpZGF0ZWQuCi0JICogRmlsdGVyIG91dCBmYXVsdHkgbWV0aG9kcyAoaS5lLiwgbnVsbCksIGFuZCBtZXRob2RzIHdoaWNoCi0JICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhY3R1YWxseSBkb2VzIHRoZSB2YWxpZGF0aW9uLiBTaW5jZSBtYW55IG9mIHRoZSBjbGFzc2VzIGRvCi0JICogbm90IHZhbGlkYXRlIGZpZWxkcyBub3csIGltcGxlbWVudCB0aGlzIG1ldGhvZCBhcyBhIG5vLW9wIHNvIHRoYXQgdGhlCi0JICogY2xhc3NlcyBjb21waWxlLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy9EZWZhdWx0Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFjdHVhbGx5IGRvZXMgdGhlIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgdGhlIGFjdHVhbCBjaGVja2luZyAoaWYgZWpiTWV0aG9kIGV4aXN0cykuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KTsKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdFtdIGdldEZpZWxkc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWZsZWN0aW9uRXJyb3IoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopICB7Ci0JCXZjLnJlbW92ZU1lc3NhZ2VzKGNsYXp6KTsKLQkKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjkwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tde2NsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWZsZWN0aW9uV2FybmluZyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIE9uZSBvZiB0d28gY2FzZXMgd2hlcmUgd2UgY2FyZSBpZiB0aGUgdHlwZSBpcyBvbiB0aGlzIGNsYXNzIG9yIG5vdCAoaS5lLiwgbm90IGxlYXZpbmcgaXQgdXAgdG8gTWVzc2FnZVV0aWxpdHkpCi0JCVN0cmluZ1tdIG1zZ1Bhcm0gPSBudWxsOwotCQlTdHJpbmcgamF2YUNsYXNzTmFtZSA9IChlLmdldEphdmFDbGFzcygpID09IG51bGwpID8gIj8iIDogZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm9uQ2xhc3MoY2xhenosIGZpZWxkKSkgewotCQkJbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7U3RyaW5nLnZhbHVlT2YoZmllbGQuZ2V0TmFtZSgpKSwgU3RyaW5nLnZhbHVlT2YoamF2YUNsYXNzTmFtZSl9OwotCQl9Ci0JCWVsc2UgewotCQkJbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7amF2YUNsYXNzTmFtZX07IC8vIE1lc3NhZ2VVdGlsaXR5IHdpbGwgc3Vic3RpdHV0ZSBpbiB0aGUgbmFtZSBvZiB0aGUgZmllbGQKLQkJfQotCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDMzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIGZpZWxkLCBtc2dQYXJtLCB0aGlzKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmbGVjdGlvbldhcm5pbmcoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIE9uZSBvZiB0d28gY2FzZXMgd2hlcmUgd2UgY2FyZSBpZiB0aGUgdHlwZSBpcyBvbiB0aGlzIGNsYXNzIG9yIG5vdCAoaS5lLiwgbm90IGxlYXZpbmcgaXQgdXAgdG8gTWVzc2FnZVV0aWxpdHkpCi0JCVN0cmluZ1tdIG1zZ1Bhcm0gPSBudWxsOwotCQlTdHJpbmcgamF2YUNsYXNzTmFtZSA9IChlLmdldEphdmFDbGFzcygpID09IG51bGwpID8gIj8iIDogZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm9uQ2xhc3MoY2xhenosIG1ldGhvZCkpIHsKLQkJCW1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10ge21ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCksIGphdmFDbGFzc05hbWV9OwotCQl9Ci0JCWVsc2UgewotCQkJbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7amF2YUNsYXNzTmFtZX07IC8vIE1lc3NhZ2VVdGlsaXR5IHdpbGwgc3Vic3RpdHV0ZSBpbiB0aGUgbmFtZSBvZiB0aGUgZmllbGQKLQkJfQotCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDMzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbil0YXJnZXRQYXJlbnQ7Ci0JCUphdmFDbGFzcyBjbGF6eiA9IChKYXZhQ2xhc3MpdGFyZ2V0OwotCQkKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIGlmIGFsbCBvZiB0aGUgdHlwZXMgaW4gdGhlIGJlYW4gcmVmbGVjdGVkIHByb3Blcmx5Ci0JCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgY2xhenopOwotCQkJCi0JCQl2Yy5zdWJ0YXNrKElFSkJWYWxpZGF0b3JDb25zdGFudHMuU1RBVFVTX1ZBTElEQVRJTkcsIG5ldyBTdHJpbmdbXXtjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9KTsKLQkJCXZhbGlkYXRlQ2xhc3ModmMsIGJlYW4sIGNsYXp6KTsKLQkJCXZhbGlkYXRlTWV0aG9kcyh2YywgYmVhbiwgY2xhenopOwotCQkJdmFsaWRhdGVGaWVsZHModmMsIGJlYW4sIGNsYXp6KTsKLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJcmVmbGVjdGlvbkVycm9yKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB0byBhdm9pZCB2YWxpZGF0aW5nIGEgRmllbGQgbW9yZQotCSAqIHRoYW4gb25jZS4gIFRoaXMgaXMgbm90IHVzZWQgZm9yIGNoZWNraW5nIHRoZSBleGlzdGVuY2Ugb2YgYSBmaWVsZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIExpc3RbXSBmaWVsZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIGZpZWxkLCBmaWVsZHNFeHRlbmRlZExpc3QpKSB7Ci0JCQlwcmltVmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB0byBhdm9pZCB2YWxpZGF0aW5nIGEgTWV0aG9kIG1vcmUKLQkgKiB0aGFuIG9uY2UuICBUaGlzIGlzIG5vdCB1c2VkIGZvciBjaGVja2luZyB0aGUgZXhpc3RlbmNlIG9mIGEgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChpc1ZhbGlkKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KSkgewotCQkJcHJpbVZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJfQotCX0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChpc1ZhbGlkKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KSkgewotCQkJcHJpbVZhbGlkYXRlRXhpc3RlbmNlKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy9EZWZhdWx0Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlRmllbGRzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSAgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gV2hlbmV2ZXIgbG9vcGluZyBvdmVyIGFuIGVudGlyZSBsaXN0LCBhbHdheXMgdXNlIGFuIAotCQkvLyBpdGVyYXRvciBpbnN0ZWFkIG9mIGEgZm9yIGxvb3AsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiAKLQkJLy8gSWYgdGhlIGxpc3QgaXMgYW4gaW5zdGFuY2Ugb2YgYSBsaW5rZWQgbGlzdCwgZm9yIGV4YW1wbGUsCi0JCS8vIHRoZSBnZXQoaSkgY2FsbCBjYW4gdGFrZSAgYSBsb25nIHRpbWUuIAotCQlMaXN0IGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkc0V4dGVuZGVkKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmllbGRzLml0ZXJhdG9yKCk7Ci0JCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJTGlzdFtdIGZpZWxkc0V4dGVuZGVkTGlzdCA9IGdldEZpZWxkc0V4dGVuZGVkKHZjLCBiZWFuLCBjbGF6eik7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQlmaWVsZCA9IChGaWVsZCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGZpZWxkID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkFWYWxpZGF0ZUVKQi52YWxpZGF0ZUZpZWxkcygpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgiQSBmaWVsZCBpcyBudWxsIG9uICIgKyBjbGF6eik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCwgZmllbGRzRXh0ZW5kZWRMaXN0KTsKLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCXJlZmxlY3Rpb25XYXJuaW5nKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQsIGUpOwotCQkJfQotCQl9Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBtZXRob2QgaXMgUk1JIGxlZ2FsLgotCSAqIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotCSAqIGZvciBSTUkvSUlPUCwgYW5kIHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVMZWdhbFJNSU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RXaXRob3V0RXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCBhIGdpdmVuIG1ldGhvZCBpcyBSTUkgbGVnYWwuCi0JICogVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JICogZm9yIFJNSS9JSU9QLCBhbmQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kQXJndW1lbnRzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUphdmFQYXJhbWV0ZXJbXSBhcmdzID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTGVnYWxSTUlfSUlPUFR5cGUoYmVhbiwgYXJnc1tpXS5nZXRKYXZhVHlwZSgpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXthcmdzW2ldLmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCBhIGdpdmVuIG1ldGhvZCBpcyBSTUkgbGVnYWwuCi0JICogVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JICogZm9yIFJNSS9JSU9QLCBhbmQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kRXhjZXB0aW9ucyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NSZW1vdGVFeGNlcHRpb25PclBhcmVudChiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde0lUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1JNSV9SRU1PVEVFWENFUFRJT059LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCBhIGdpdmVuIG1ldGhvZCBpcyBSTUkgbGVnYWwsIGJ1dCBkb2Vzbid0IGNoZWNrIHRoZSBleGNlcHRpb25zLgotCSAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWV0aG9kJ3MgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkgKiBmb3IgUk1JL0lJT1AuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVMZWdhbFJNSU1ldGhvZFJldHVyblR5cGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTGVnYWxSTUlfSUlPUFR5cGUoYmVhbiwgbWV0aG9kLmdldFJldHVyblR5cGUoKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgZ2l2ZW4gbWV0aG9kIGlzIFJNSSBsZWdhbCwgYnV0IGRvZXNuJ3QgY2hlY2sgdGhlIGV4Y2VwdGlvbnMuCi0JICogVGhpcyBtZWFucyB0aGF0IHRoZSBtZXRob2QncyBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotCSAqIGZvciBSTUkvSUlPUC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kV2l0aG91dEV4Y2VwdGlvbnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kQXJndW1lbnRzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZFJldHVyblR5cGUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5hbCBjaGVjayB0byBzZWUgaWYgcmVxdWlyZWQgbWV0aG9kcyB3ZXJlIGRldGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWV0aG9kcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFdoZW5ldmVyIGxvb3Bpbmcgb3ZlciBhbiBlbnRpcmUgbGlzdCwgYWx3YXlzIHVzZSBhbiAKLQkJLy8gaXRlcmF0b3IgaW5zdGVhZCBvZiBhIGZvciBsb29wLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gCi0JCS8vIElmIHRoZSBsaXN0IGlzIGFuIGluc3RhbmNlIG9mIGEgbGlua2VkIGxpc3QsIGZvciBleGFtcGxlLAotCQkvLyB0aGUgZ2V0KGkpIGNhbGwgY2FuIHRha2UgIGEgbG9uZyB0aW1lLiAKLQkJTWV0aG9kW10gZWpiTWV0aG9kcyA9IGNsYXp6Lmxpc3RNZXRob2RFeHRlbmRlZCgpOwotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QgPSBnZXRNZXRob2RzRXh0ZW5kZWQodmMsIGJlYW4sIGNsYXp6KTsKLQkJZm9yKGludCBpPTA7IGk8ZWpiTWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCW1ldGhvZCA9IGVqYk1ldGhvZHNbaV07Ci0JCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCQkvLyBObyBwb2ludCBhZGRpbmcgYSB2YWxpZGF0aW9uIG1lc3NhZ2UsIGJlY2F1c2UgdGhlIHVzZXIgY2FuJ3QgZG8gYW55dGhpbmcuCi0JCQkJLy8gTG9nIHRoaXMgY29uZGl0aW9uLgotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiQVZhbGlkYXRlRUpCLnZhbGlkYXRlTWV0aG9kcygpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgiT24gIiArIGNsYXp6ICsgIiwgdGhlcmUgaXMgYSBudWxsIG1ldGhvZC4iKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0ZUV4aXN0ZW5jZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JCQkJdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVmbGVjdGlvbldhcm5pbmcodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIGUpOwotCQkJfQotCQl9Ci0JCXZhbGlkYXRlTWV0aG9kRXhpc3RzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVudGl0eUJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFbnRpdHlCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZTQzMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVudGl0eUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVudGl0eSBiZWFuIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotICoKLSAqIEFsbCA5LjIuWCBzZWN0aW9ucyBkZXNjcmliZSBCTVAgcmVxdWlyZW1lbnRzLgotICogSWYgYSBDTVAgcmVxdWlyZW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gdGhlc2UsIHRoZW4gdGhlIGRpZmZlcmVuY2VzIGFyZQotICogZG9jdW1lbnRlZCBpbiA5LjQuWCBzZWN0aW9ucy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0ZUVudGl0eUJlYW4gZXh0ZW5kcyBBVmFsaWRhdGVCZWFuIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBWF9FSkJfRU5USVRZQkVBTiA9ICJqYXZheC5lamIuRW50aXR5QmVhbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBTRVRFTlRJVFlDT05URVhUID0gInNldEVudGl0eUNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5TRVRFTlRJVFlDT05URVhUID0gInVuc2V0RW50aXR5Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBFSkJMT0FEID0gImVqYkxvYWQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCU1RPUkUgPSAiZWpiU3RvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQVhfRUpCX0VOVElUWUNPTlRFWFQgPSAiamF2YXguZWpiLkVudGl0eUNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIGhhc1ZhbGlkQ29uc3RydWN0b3IgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzQUNvbnN0cnVjdG9yID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc1NldEVudGl0eUNvbnRleHQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzVW5zZXRFbnRpdHlDb250ZXh0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0VqYkFjdGl2YXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0VqYlBhc3NpdmF0ZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNFamJSZW1vdmUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRWpiTG9hZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNFamJTdG9yZSA9IGZhbHNlOwotCi0JLyoqCi0JICogR2l2ZW4gYSBiZWFuJ3MgZWpiRmluZCBtZXRob2QsIHJldHVybiB0aGUgbWF0Y2hpbmcgZmluZCBtZXRob2QgZnJvbQotCSAqIHRoZSBob21lLCBpZiBpdCBleGlzdHMuIElmIG5vdCwgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRNYXRjaGluZ0hvbWVGaW5kTWV0aG9kRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpLCBtZXRob2QsIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRklORCk7Ci0JfQotCS8qKgotCSAqIGdldFBhcmVudE5hbWUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewotCQlyZXR1cm4gSkFWQVhfRUpCX0VOVElUWUJFQU47Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRnJhbWV3b3JrTWV0aG9kKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChzdXBlci5pc0ZyYW1ld29ya01ldGhvZChuYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gY2hlY2sgZm9yIGVudGl0eS1zcGVjaWZpYyBtZXRob2RzCi0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkxPQUQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJTVE9SRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1NFVEVOVElUWUNPTlRFWFQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9VTlNFVEVOVElUWUNPTlRFWFQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIG1ldGhvZHMgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIGZvbGxvdyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbiwKLQkgKiBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gbWlzc2luZyByZXF1aXJlZCBtZXRob2RzLgotCSAqIFNlY3Rpb246IDkuMi4yCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvL3N1cGVyLnByaW1WYWxpZGF0ZShlamJNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBlamJNZXRob2QuZ2V0TmFtZSgpOwotCQlpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKSkKLQkJCXZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUE9TVENSRUFURSkpCi0JCQl2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9GSU5BTElaRSkpCi0JCQl2YWxpZGF0ZUZpbmFsaXplKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCRklORCkpCi0JCQl2YWxpZGF0ZUVqYkZpbmRNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQllbHNlIGlmIChpc0J1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKSkKLQkJCXZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQllbHNlCi0JCQl2YWxpZGF0ZUhlbHBlck1ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vc3VwZXIudmFsaWRhdGVFeGlzdGVuY2UoZWpiTWV0aG9kKTsKLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCVN0cmluZyBuYW1lID0gZWpiTWV0aG9kLmdldE5hbWUoKTsKLQkJaWYgKCFoYXNTZXRFbnRpdHlDb250ZXh0ICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1NFVEVOVElUWUNPTlRFWFQpKSB7Ci0JCQlKYXZhUGFyYW1ldGVyW10gcGFyYW1zID0gZWpiTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJaWYgKHBhcmFtcy5sZW5ndGggPT0gMSkgewotCQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShwYXJhbXNbMF0uZ2V0SmF2YVR5cGUoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FTlRJVFlDT05URVhULCBiZWFuKSkpIHsKLQkJCQkJaGFzU2V0RW50aXR5Q29udGV4dCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCFoYXNVbnNldEVudGl0eUNvbnRleHQgJiYgbmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfVU5TRVRFTlRJVFlDT05URVhUKSkgewotCQkJaWYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCWhhc1Vuc2V0RW50aXR5Q29udGV4dCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIWhhc0VqYkFjdGl2YXRlICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkFDVElWQVRFKSkgewotCQkJaWYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCWhhc0VqYkFjdGl2YXRlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICghaGFzRWpiUGFzc2l2YXRlICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBBU1NJVkFURSkpIHsKLQkJCWlmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQloYXNFamJQYXNzaXZhdGUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCFoYXNFamJSZW1vdmUgJiYgbmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUkVNT1ZFKSkgewotCQkJaWYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCWhhc0VqYlJlbW92ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIWhhc0VqYkxvYWQgJiYgbmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCTE9BRCkpIHsKLQkJCWlmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQloYXNFamJMb2FkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICghaGFzRWpiU3RvcmUgJiYgbmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCU1RPUkUpKSB7Ci0JCQlpZiAoZWpiTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJaGFzRWpiU3RvcmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCFoYXNWYWxpZENvbnN0cnVjdG9yICYmIGVqYk1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCWhhc0FDb25zdHJ1Y3RvciA9IHRydWU7Ci0JCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKGVqYk1ldGhvZCkgJiYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkpIHsKLQkJCQloYXNWYWxpZENvbnN0cnVjdG9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjYKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlzdXBlci52YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsgLy8gbWFrZSBzdXJlIHRoYXQgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoICdlamInCi0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA4X2J1cywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkJaWYgKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTBfYnVzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDlfYnVzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZFdpdGhvdXRFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLgotCQkvLyBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgYnVzaW5lc3MgbWV0aG9kcyB0byB0aHJvdyB0aGUgCi0JCS8vIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgCi0JCS8vIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JCS8vIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JCS8vIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlQnVzaW5lc3NNZXRob2ROb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2ROb1JlbW90ZUV4Y2VwdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEVKQiAyLjAgYWRkZWQgInRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24iIGFib3ZlCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfYnVzKTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQWxsIG9mIHRoZSBhYm92ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBWYWxpZGF0ZUJlYW4uCi0JCXN1cGVyLnZhbGlkYXRlQ2xhc3ModmMsIGJlYW4sIGNsYXp6KTsKLQotCQkvLyBQbHVzLCBjaGVjayB0aGF0IGF0IGxlYXN0IG9uZSBmaWVsZCBleGlzdHMgb24gdGhlIGJlYW4uCi0JCXZlcmlmeUZpZWxkRXhpc3RzKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi4zLCA5LjIuOCBhbmQgOS40LjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCS8vIFRoZSBtZXRob2Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgaGFzIGFscmVhZHkgdGVzdGVkIHRoYXQgdGhlIG1ldGhvZCBuYW1lIGlzIGVqYkNyZWF0ZS4KLQkJaWYgKG1ldGhvZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOF9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JCWlmIChtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDEwX2VqYkNyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA5X2VqYkNyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JCS8vIEJ1dCBpZiB0aGUgYmVhbiB1c2VzIGphdmEubGFuZy5PYmplY3QgZm9yIGEga2V5LCBkb24ndCBjaGVjayBpZiBpdCdzIHNlcmlhbGl6YWJsZS4KLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShiZWFuKSkgewotCQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEFyZ3VtZW50cyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kV2l0aG91dEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9CQotCQkKLQkJLy8gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZTsgdW5sZXNzIHRoaXMgaXMKLQkJLy8gYSBDTVAsIGFuZCBhbiB1bmtvbnduIHByaW1hcnkga2V5IGNsYXNzIGlzIHVzZWQuIFJlYWQgc2VjdGlvbiA5LjQuNy4zLgotCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZF9rZXlEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIAotCQkvLyBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCB0byB0aHJvdyAKLQkJLy8gdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCQkvLyBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIAotCQkvLyBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIAotCQkvLyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgCi0JCS8vIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkJdmFsaWRhdGVOb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwMF9lamJDcmVhdGUpOwotCi0JCS8vIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9yIHRoaXMgZWpiQ3JlYXRlIG1ldGhvZC4KLQkJTWV0aG9kIGVqYlBvc3RDcmVhdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUsIG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKSk7Ci0JCWlmIChlamJQb3N0Q3JlYXRlTWV0aG9kID09IG51bGwpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIENoZWNrIGZvciBhIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGhvbWUsIGFuZCB0aGF0IHRoZSBleGNlcHRpb25zIG9uCi0JCS8vIHRoaXMgbWV0aG9kIGFyZSBhIHN1YnNldCBvZiB0aGUgZXhjZXB0aW9ucyBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIG9uIHRoZSBob21lLgotCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZF9ob21lRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjMsIDkuMi44IGFuZCA5LjQuMgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kX2tleURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIG1ldGhvZCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZCBoYXMgYWxyZWFkeSB0ZXN0ZWQgdGhhdCB0aGUgbWV0aG9kIG5hbWUgaXMgZWpiQ3JlYXRlLgotCQlpZiAobWV0aG9kID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gVW5rbm93biBwcmltYXJ5IGtleSBjbGFzcyAoc2VjdGlvbiA5LjQuNy4zKSBpcyBhbHNvIHZhbGlkYXRlZCBieSB0aGlzCi0JCS8vIGNoZWNrLCBiZWNhdXNlIHRoZSBwcmltYXJ5IGtleSBtdXN0IGJlIG9mIHR5cGUgamF2YS5sYW5nLk9iamVjdCwgYW5kCi0JCS8vIHRoZSBlamJDcmVhdGUgbXVzdCByZXR1cm4gamF2YS5sYW5nLk9iamVjdC4KLQkJSmF2YUhlbHBlcnMgcHJpbWFyeUtleSA9IG51bGw7Ci0JCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoYmVhbikpIHsKLQkJCXByaW1hcnlLZXkgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCwgYmVhbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmltYXJ5S2V5ID0gKChFbnRpdHkpIGJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJfQotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IHR5cGUuCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCUphdmFIZWxwZXJzIHBhcm1UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHBhcm1UeXBlLCBwcmltYXJ5S2V5KSkgewotCQkJLy8gaWYgdGhlIHBhcmFtZXRlciB0eXBlIGlzIGphdmEubGFuZy5PYmplY3QsIGNvdWxkIGJlIHNlY3Rpb24gOS40LjcuMwotCQkJU3RyaW5nIGtleU5hbWUgPSAocHJpbWFyeUtleSA9PSBudWxsKSA/IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9QUklNQVJZX0tFWSA6IHByaW1hcnlLZXkuZ2V0SmF2YU5hbWUoKTsKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7a2V5TmFtZX07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjUsIDkuNC42IGFuZCA5LjQuNy4zCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gVGhpcyBtZXRob2QgaXMgYSBuby1vcCBzbyB0aGF0IHRoZSBkZXBlbmRlbmN5IGNsYXNzZXMgZG9uJ3QgaGF2ZSB0byBpbXBsZW1lbnQgaXQuCi0JCS8vIChUaGlzIG1ldGhvZCB3aWxsIG5ldmVyIGJlIGNhbGxlZCBpbiBhIGRlcGVuZGVuY3kgY2xhc3MuKQotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuNSwgOS40LjYgYW5kIDkuNC43LjMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkZpbmRNZXRob2RfaG9tZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JCS8vIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCQkvLyB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JCS8vIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCQkvLyBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JCUphdmFDbGFzcyBob21lID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBob21lKTsKLQotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRiArIG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDQpOyAvLyBlLmcuIGlmIHRoZSBob21lIG1ldGhvZCBpcyBuYW1lZCBmaW5kWCwgdGhlbiB0aGUgYmVhbiBtZXRob2Qgd2lsbCBiZSBuYW1lZCBlamJGaW5kWAotCQlNZXRob2QgaG9tZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChob21lLCBtZXRob2QsIG1ldGhvZE5hbWUpOwotCQlpZiAoaG9tZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQkvLyBUaGVuIHRoaXMgbWV0aG9kIHNob3VsZG4ndCBoYXZlIGJlZW4gY2FsbGVkOyB1bmxlc3MgdGhlIG1ldGhvZCBleGlzdHMgb24gdGhlIHJlbW90ZSwgdGhpcyBiZWFuIG1ldGhvZCBpc24ndCBhIGJ1c2luZXNzIG1ldGhvZC4KLQkJCXJldHVybjsKLQkJfQotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1ldGhvZCwgaG9tZU1ldGhvZCk7Ci0JCWlmIChleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZXhjLmdldFF1YWxpZmllZE5hbWUoKSwgaG9tZS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQyMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCBmb2xsb3dzIHRoZSBFSkIgMS4xLiBzcGVjaWZpY2F0aW9uLgotCSAqIFNlY3Rpb246IDkuMi40Ci0JKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIGhhcyBhbHJlYWR5IHRlc3RlZCB0aGF0IHRoZSBtZXRob2QgbmFtZSBpcyBlamJQb3N0Q3JlYXRlLgotCQlpZiAobWV0aG9kID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA4X2VqYlBvc3RDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JCWlmIChtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDEwX2VqYlBvc3RDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9lamJQb3N0Q3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdm9pZC4KLQkJSmF2YUhlbHBlcnMgcGFybVR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSAoKHBhcm1UeXBlID09IG51bGwpID8gIiIgOiBwYXJtVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmICghcmV0dXJuVHlwZU5hbWUuZXF1YWxzKElUeXBlQ29uc3RhbnRzLlZPSUQpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgCi0JCS8vIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLQkJLy8gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGVqYlBvc3RDcmVhdGUgbWV0aG9kIHRvIHRocm93IAotCQkvLyB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gCi0JCS8vIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgCi0JCS8vIGJlYW4gc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgCi0JCS8vIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSAKLQkJLy8gQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCQl2YWxpZGF0ZU5vUmVtb3RlRXhjZXB0aW9uKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDAwX2VqYlBvc3RDcmVhdGUpOwotCi0JCS8vIFZlcmlmeSB0aGF0IHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCBoYXMgYSBtYXRjaGluZyBlamJDcmVhdGUgbWV0aG9kLgotCQlNZXRob2QgZWpiQ3JlYXRlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGNsYXp6LCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUsIG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKSk7Ci0JCWlmIChlamJDcmVhdGVNZXRob2QgPT0gbnVsbCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDI4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kX2hvbWVEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbi4KLQkgKiBTZWN0aW9uOiA5LjIuNAotCSovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kX2hvbWVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFRoZSBtZXRob2Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgaGFzIGFscmVhZHkgdGVzdGVkIHRoYXQgdGhlIG1ldGhvZCBuYW1lIGlzIGVqYlBvc3RDcmVhdGUuCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGhvbWVJbnRmID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBob21lSW50Zik7Ci0KLQkJTWV0aG9kIGNyZWF0ZU1ldGhvZCA9IGdldE1hdGNoaW5nSG9tZUNyZWF0ZU1ldGhvZEV4dGVuZGVkKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJaWYgKGNyZWF0ZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQkvLyBJZiB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGNvbXBvbmVudCBwYXJlbnQsIGl0IGlzIGxpa2VseQotCQkJLy8gdGhhdCB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGUgbWV0aG9kIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBob21lLgotCQkJLy8gU2luY2Ugb3VyIHRvb2xzIGdlbmVyYXRlIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UgY29kZSwgc3VwcHJlc3MgdGhpcyB3YXJuaW5nLgotCi0JCQkvLyBlamJDcmVhdGUgbWV0aG9kcyB3aGljaCBhcmUgaW5oZXJpdGVkIHZpYSBjb21wb25lbnQgaW5oZXJpdGFuY2UsIGJ1dCBkbyBub3QKLQkJCS8vIGhhdmUgYSBtZXRob2Qgb24gdGhlaXIgaW1tZWRpYXRlIGhvbWUsIGFyZSBmaWx0ZXJlZCBvdXQgdmlhIHRoZSBpc1ZhbGlkKE1ldGhvZCkgbWV0aG9kLgotCi0JCQkvLyBUaGUgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QgY2hlY2tzIGZvciBhIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2QsIGJ1dCBqdXN0IGluCi0JCQkvLyBjYXNlIHRoZSBlamJDcmVhdGUgbWV0aG9kIGlzIG1pc3NpbmcsIGNoZWNrIGZvciBpdCBoZXJlIHRvby4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAyOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7IGhvbWVJbnRmLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQotCQkJLy8gQ2FuJ3QgY2hlY2sgdGhlIGV4Y2VwdGlvbnMgb2YgYSBtZXRob2Qgd2hpY2ggZG9lc24ndCBleGlzdC4KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFdoZXRoZXIgdGhpcyBpcyBmcm9tIGEgY29tcG9uZW50IGluaGVyaXRhbmNlIG9yIG5vdCwgaWYgdGhlIG1ldGhvZCBleGlzdHMgb24gdGhlCi0JCS8vIGhvbWUsIGNoZWNrIHRoYXQgdGhlIG1ldGhvZCBmb2xsb3dzIHRoZSBzcGVjLgotCi0JCS8vIFNlY3Rpb24gNi4xMC42IChzZXNzaW9uKSwgOS4yLjggKGVudGl0eSksIGRlY2xhcmUgdGhhdCBhbGwgZXhjZXB0aW9ucyBkZWNsYXJlZAotCQkvLyBvbiB0aGUgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mCi0JCS8vIHRoZSBtYXRjaGluZyBjcmVhdGUgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1ldGhvZCwgY3JlYXRlTWV0aG9kKTsKLQkJaWYgKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBleGMuZ2V0UXVhbGlmaWVkTmFtZSgpLCBob21lSW50Zi5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQyMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi4yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaW5hbGl6ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIElmIGl0J3MgImZpbmFsaXplKCkiLCB0aGUgZWpiIGJlYW4gc2hvdWxkbid0IGhhdmUgdGhlIG1ldGhvZC4KLQkJaWYgKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJLy8gVGhpcyBpcyBhIHdhcm5pbmcsIG5vdCBhbiBlcnJvciwgYmVjYXVzZSBFSkIgMS4wIGFsbG93ZWQgdGhlIGZpbmFsaXplKCkgbWV0aG9kIHRvIGJlIGNhbGxlZC4gRUpCIDEuMSAoc2VjdGlvbiA2LjEwLjIpIHNwZWNpZmljYWxseSBwcm9oaWJpdHMgaXQuCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZ1tdIG1vZGVsT2JqZWN0TmFtZSA9IG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCWlmICghaGFzVmFsaWRDb25zdHJ1Y3RvciAmJiBoYXNBQ29uc3RydWN0b3IpIHsKLQkJCS8vIElmIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gYXJndW1lbnRzIGRvZXMgbm90IGV4aXN0IGV4cGxpY2l0bHksCi0JCQkvLyBKYXZhIHdpbGwgaW5zZXJ0IG9uZSBhcyBsb25nIGFzIHRoZXJlIGFyZSBubyBjb25zdHJ1Y3RvcnMgZGVmaW5lZCBpbiB0aGUKLQkJCS8vIGNsYXNzLiBJZiB0aGVyZSBpcyBhIGNvbnN0cnVjdG9yLCBKYXZhIGRvZXMgbm90IGluc2VydCBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNTZXRFbnRpdHlDb250ZXh0KSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNVbnNldEVudGl0eUNvbnRleHQpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoIWhhc0VqYkFjdGl2YXRlKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNFamJQYXNzaXZhdGUpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoIWhhc0VqYlJlbW92ZSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDM3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmICghaGFzRWpiTG9hZCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDM4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmICghaGFzRWpiU3RvcmUpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCBhdCBsZWFzdCBvbmUgZmllbGQgZXhpc3RzIG9uIHRoZSBiZWFuIGNsYXNzLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHZlcmlmeUZpZWxkRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwotCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQloYXNWYWxpZENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JCWhhc0FDb25zdHJ1Y3RvciA9IGZhbHNlOwotCQloYXNTZXRFbnRpdHlDb250ZXh0ID0gZmFsc2U7Ci0JCWhhc1Vuc2V0RW50aXR5Q29udGV4dCA9IGZhbHNlOwotCQloYXNFamJBY3RpdmF0ZSA9IGZhbHNlOwotCQloYXNFamJQYXNzaXZhdGUgPSBmYWxzZTsKLQkJaGFzRWpiUmVtb3ZlID0gZmFsc2U7Ci0JCWhhc0VqYkxvYWQgPSBmYWxzZTsKLQkJaGFzRWpiU3RvcmUgPSBmYWxzZTsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRW50aXR5SG9tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVudGl0eUhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxNzNiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRW50aXR5SG9tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlbnRpdHkgaG9tZSBjbGFzc2VzIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogVVJMOiBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2VqYi9kb2NzLmh0bWwKLSAqIFNlY3Rpb246IDkuMi44Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVmFsaWRhdGVFbnRpdHlIb21lIGV4dGVuZHMgQVZhbGlkYXRlSG9tZSB7Ci0JcHJpdmF0ZSBIYXNoU2V0IGZpbmRCeVBLTWV0aG9kcyA9IG51bGw7Ci0KLQlwdWJsaWMgQVZhbGlkYXRlRW50aXR5SG9tZSgpIHsKLQkJZmluZEJ5UEtNZXRob2RzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJZmluZEJ5UEtNZXRob2RzLmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gTmVlZCB0byB0cmFjayBudW1iZXIgb2YgZmluZEJ5UHJpbWFyeUtleSBtZXRob2RzIGZvciB0aGUKLQkJLy8gdmFsaWRhdGVNZXRob2RFeGlzdHMoKSBjaGVja3MuIERvIG5vdCBjaGVjayBvbmx5IHRoZSBjdXJyZW50Ci0JCS8vIGNsYXNzLCBvciBhIGZpbmRCeVByaW1hcnlLZXkgd2hpY2ggaXMgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgaW50ZXJmYWNlCi0JCS8vIHdpbGwgbm90IGJlIGRldGVjdGVkLgotCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSkpIHsKLQkJCWZpbmRCeVBLTWV0aG9kcy5hZGQobWV0aG9kKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1ldGhvZCByZXR1cm5zIHRoZSByZW1vdGUgaW50ZXJmYWNlLAotCSAqIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaW5nbGVPYmplY3RGaW5kZXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIFRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCBpcyBhbHdheXMgYSBzaW5nbGUtb2JqZWN0IGZpbmRlci4KLQkJSmF2YUNsYXNzIHJlbW90ZUludGYgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVtb3RlSW50Zik7Ci0KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCByZW1vdGVJbnRmKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBpcyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hlY2tzIHRoYXQgdGhlIGVudGl0eSBob21lJ3MgbWV0aG9kcyBjb21wbHkgd2l0aCB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uLgotCSAqIFNlY3Rpb246IDkuMi44Ci0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgaGlNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vIHN1cGVyLnByaW1WYWxpZGF0ZShoaU1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlTdHJpbmcgbmFtZSA9IGhpTWV0aG9kLmdldE5hbWUoKTsKLQotCQkvLyBFYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lIGludGVyZmFjZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCQkvLyAgIC0gQSBjcmVhdGUgbWV0aG9kLgotCQkvLyAgIC0gQSBmaW5kZXIgbWV0aG9kLgotCQlpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfQ1JFQVRFKSkKLQkJCXZhbGlkYXRlQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgaGlNZXRob2QpOwotCQllbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GSU5EKSkKLQkJCXZhbGlkYXRlRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIGhpTWV0aG9kKTsKLQkJZWxzZSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGhpTWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vc3VwZXIudmFsaWRhdGVFeGlzdGVuY2UoZWpiTWV0aG9kKTsKLQotCQlpZiAoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWS5lcXVhbHMoZWpiTWV0aG9kLmdldE5hbWUoKSkpCi0JCQlpbmNyZW1lbnRGaW5kQnlQcmltYXJ5S2V5Q291bnQodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuOAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCS8vIFRoZSBzdXBlcmNsYXNzIGNoZWNrcyB0aGF0IHRoZSBob21lIGV4dGVuZHMgamF2YXguZWpiLkVKQkhvbWUsCi0JCS8vIGFuZCB0aGF0IHRoZSBpbnRlcmZhY2UgaW5oZXJpdGFuY2UgY29tcGxpZXMgd2l0aCBSTUktSUlPUCBydWxlcy4KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGVudGl0eSBob21lIGZvbGxvd3MgdGhlIEVKQiAxLjEuIHNwZWNpZmljYXRpb24uCi0JICogU2VjdGlvbjogOS4yLjgKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCQkvLyAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCQkvLwotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCQkvLyBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkJLy8gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCQkvLyAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkJLy8gb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCQl2YWxpZGF0ZUNyZWF0ZU1ldGhvZF9iZWFuRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSB0eXBlLgotCQl2YWxpZGF0ZUNyZWF0ZU1ldGhvZF9yZW1vdGVEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGluY2x1ZGUgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0NyZWF0ZUV4Y2VwdGlvbihiZWFuLCBtZXRob2QpKSB7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0NSRUFURUVYQ0VQVElPTiB9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDE0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUktSUlPUC4gCi0JCS8vIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgZm9yIAotCQkvLyBSTUktSUlPUCwgYW5kIHRoYXQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGVudGl0eSBob21lIGZvbGxvd3MgdGhlIEVKQiAxLjEuIHNwZWNpZmljYXRpb24uCi0JICogU2VjdGlvbjogOS4yLjgKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNyZWF0ZU1ldGhvZF9iZWFuRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JCS8vIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JCXN1cGVyLnZhbGlkYXRlQ3JlYXRlTWV0aG9kX2JlYW5EZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JCS8vIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCQkvLyB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JCS8vIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCQkvLyBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JCXZhbGlkYXRlTWF0Y2hpbmdCZWFuUG9zdENyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIEluIGFkZGl0aW9uIHRvIHJlZ3VsYXIgZmluZCBydWxlcywgZmluZEJ5UHJpbWFyeUtleSBuZWVkcyB0byBmb2xsb3cgc29tZSBvdGhlciBydWxlcy4KLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuOAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZEJ5UHJpbWFyeUtleU1ldGhvZF9rZXlEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gaGFzVmFsaWRGQlBLTWV0aG9kID0gZmFsc2U7Ci0JCUVudGl0eSBlbnRpdHlCZWFuID0gKEVudGl0eSkgYmVhbjsgLy8gYmVhbiBpcyBjaGVja2VkIGZvciBudWxsIGluIEFWYWxpZGF0ZUVKQi52YWxpZGF0ZSgpIG1ldGhvZCwgc28gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgaXQgaGVyZS4KLQkJSmF2YUNsYXNzIGtleUNsYXNzID0gZW50aXR5QmVhbi5nZXRQcmltYXJ5S2V5KCk7Ci0JCQotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwga2V5Q2xhc3MpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IGRlY2xhcmUgdGhlIHByaW1hcnkga2V5IGNsYXNzIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCS8vIFRoaXMgY2hlY2sgYWxzbyB2YWxpZGF0ZXMgY2FzZSA5LjQuNy4zIChDTVAgdW5rbm93biBwcmltYXJ5IGtleSBjbGFzcywKLQkJLy8gd2hpY2ggbXVzdCBiZSBkZWNsYXJlZCBhcyBqYXZhLmxhbmcuT2JqZWN0LikKLQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQlpZiAocGFybXMubGVuZ3RoID09IDEpIHsKLQkJCUphdmFIZWxwZXJzIHR5cGUgPSBwYXJtc1swXS5nZXRKYXZhVHlwZSgpOwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUsIGtleUNsYXNzKSkgewotCQkJCS8vIGNoZWNrIHRoYXQgaXQncyBhIHNpbmdsZS1vYmplY3QgZmluZGVyCi0JCQkJaWYgKGlzU2luZ2xlT2JqZWN0RmluZGVyKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJCQloYXNWYWxpZEZCUEtNZXRob2QgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGNoZWNrIGlmIGl0J3MgamF2YS5sYW5nLk9iamVjdC4gSWYgaXQgaXMsIHRoaXMgY291bGQgYmUgYSBjYXNlIG9mIDkuNC43LjMuCi0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1NhbWVUeXBlKHR5cGUsIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBlbnRpdHlCZWFuKSkpIHsKLQkJCQkJaGFzVmFsaWRGQlBLTWV0aG9kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWhhc1ZhbGlkRkJQS01ldGhvZCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tdIHsga2V5Q2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEluIGFkZGl0aW9uIHRvIHJlZ3VsYXIgZmluZCBydWxlcywgZmluZEJ5UHJpbWFyeUtleSBuZWVkcyB0byBmb2xsb3cgc29tZSBvdGhlciBydWxlcy4KLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuOAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZEJ5UHJpbWFyeUtleU1ldGhvZF9yZW1vdGVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAoIWlzU2luZ2xlT2JqZWN0RmluZGVyKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJU3RyaW5nIHJlbW90ZUludGZOYW1lID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKS5nZXROYW1lKCk7IC8vIENhbiBhc3N1bWUgdGhhdCByZW1vdGUgaW50ZXJmYWNlIGlzbid0IG51bGwsIG9yIGlzU2luZ2xlT2JqZWN0RmluZGVyIHdvdWxkIGhhdmUgdGhyb3duIGFuIEludmFsaWRJbnB1dEV4Y2VwdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyByZW1vdGVJbnRmTmFtZSB9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGZpbmRlciBtZXRob2Qgb24gdGhlIGVudGl0eSBob21lIGNsYXNzIGZvbGxvd3MgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKiBTZWN0aW9uOiA5LjIuOAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gVGhlIHJldHVybiB0eXBlIGZvciBhIGZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgCi0JCS8vIGludGVyZmFjZSB0eXBlIChmb3IgYSBzaW5nbGUtb2JqZWN0IGZpbmRlciksIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChmb3IgYSAKLQkJLy8gbXVsdGktb2JqZWN0IGZpbmRlcikuCi0JCS8vCi0JCS8vIFdoZXRoZXIgb3Igbm90IHRoZSBwYXJhbWV0ZXIgaXMgYSB0eXBlIG9yIGFuIGFycmF5IG9mIHR5cGVzLCB0aGUgZm9sbG93aW5nCi0JCS8vIGNhbGwgd2lsbCByZXR1cm4gdGhlIGJhc2UgdHlwZS4gaS5lLiwgaWYgaXQncyBhbiBhcnJheSBvZiAiTXlDbGFzcyIsCi0JCS8vIHRoZSByZXR1cm5UeXBlTmFtZSB3aWxsIGJlIHNldCB0byAiTXlDbGFzcyIsIG5vdCBhbiBhcnJheSB0eXBlLgotCQl2YWxpZGF0ZUZpbmRNZXRob2RfcmVtb3RlRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBpbmNsdWRlIHRoZSBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLiAKLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzRmluZGVyRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCkpIHsKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRklOREVSRVhDRVBUSU9OIH07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYWx3YXlzIGluY2x1ZGUgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLCB3aGljaCBpcyAKLQkJLy8gYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyAKLQkJLy8gYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLQkJYm9vbGVhbiB2YWxpZGF0ZVJNSVBhcmFtZXRlcnMgPSB0cnVlOyAvLyBzaG91bGQgdGhlIHBhcmFtZXRlcnMgYmUgdmFsaWRhdGVkIHRvIHNlZSBpZiB0aGV5IGZvbGxvdyBSTUktSUlPUCBydWxlcz8KLQkJYm9vbGVhbiB2YWxpZGF0ZVJNSVJldFR5cGUgPSB0cnVlOyAvLyBzaG91bGQgdGhlIHJldHVybiB0eXBlIGJlIHZhbGlkYXRlZCB0byBzZWUgaWYgaXQgZm9sbG93cyBSTUktSUlPUCBydWxlcz8KLQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkRCWVBSSU1BUllLRVkpKSB7Ci0JCQkvLyAtIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0JCQkvLyBhbHdheXMgYSBzaW5nbGUtb2JqZWN0IGZpbmRlci4gVGhlIG1ldGhvZCBtdXN0IGRlY2xhcmUgdGhlIHByaW1hcnkga2V5IGNsYXNzIAotCQkJLy8gYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLQkJCS8vCi0JCQkvLyBUaGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QgaXMgYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuCi0JCQkvLyBUaGUgY2FsbCB0byB2YWxpZGF0ZUZpbmRCeVByaW1hcnlLZXlNZXRob2RfcmVtb3RlRGVwIGlzIGRvbmUgaW4KLQkJCS8vIHZhbGlkYXRlRmluZE1ldGhvZF9yZW1vdGVEZXAobWV0aG9kKTsKLQkJCS8vdmFsaWRhdGVGaW5kQnlQcmltYXJ5S2V5TWV0aG9kX3JlbW90ZURlcChtZXRob2QpOwotCi0JCQkvLyBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLQkJCXZhbGlkYXRlRmluZEJ5UHJpbWFyeUtleU1ldGhvZF9rZXlEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkudXNlc1Vua25vd25QcmltYXJ5S2V5KGJlYW4pKSB7Ci0JCQkJdmFsaWRhdGVSTUlQYXJhbWV0ZXJzID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCQkJCi0JCS8vIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUktSUlPUC4gCi0JCS8vIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgZm9yIAotCQkvLyBSTUktSUlPUCwgYW5kIHRoYXQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkJLy8gSG93ZXZlciwgdGhlIHJldHVybiB0eXBlIG9mICJFbnVtZXJhdGlvbiIgb3IgIkNvbGxlY3Rpb24iIGlzIGV4ZW1wdGVkIGZyb20gdGhpcwotCQkvLyBjaGVjaywgYmVjYXVzZSB0aGUgc3BlYyBzdGF0ZXMsIGluIDkuMS44LjIsIHRoYXQgRW51bWVyYXRpb24gb3IgQ29sbGVjdGlvbiBtdXN0IGJlIHJldHVybmVkCi0JCS8vIGZvciBtdWx0aS1vYmplY3QgZmluZGVycy4KLQkJSmF2YUhlbHBlcnMgcmV0VHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCXZhbGlkYXRlUk1JUmV0VHlwZSA9ICEoKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldFR5cGUsIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfRU5VTUVSQVRJT04sIGJlYW4pKSkgfHwgCi0JCQkJCQkJCShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXRUeXBlLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04sIGJlYW4pKSkpOwotCQkKLQkJaWYodmFsaWRhdGVSTUlQYXJhbWV0ZXJzKSB7Ci0JCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kQXJndW1lbnRzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQkKLQkJaWYodmFsaWRhdGVSTUlSZXRUeXBlKSB7Ci0JCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kUmV0dXJuVHlwZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGZpbmRlciBtZXRob2Qgb24gdGhlIGVudGl0eSBob21lIGNsYXNzIGZvbGxvd3MgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKiBTZWN0aW9uOiA5LjIuOAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZE1ldGhvZF9yZW1vdGVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBmaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIAotCQkvLyBpbnRlcmZhY2UgdHlwZSAoZm9yIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLCBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoZm9yIGEgCi0JCS8vIG11bHRpLW9iamVjdCBmaW5kZXIpLgotCQkvLwotCQkvLyBXaGV0aGVyIG9yIG5vdCB0aGUgcGFyYW1ldGVyIGlzIGEgdHlwZSBvciBhbiBhcnJheSBvZiB0eXBlcywgdGhlIGZvbGxvd2luZwotCQkvLyBjYWxsIHdpbGwgcmV0dXJuIHRoZSBiYXNlIHR5cGUuIGkuZS4sIGlmIGl0J3MgYW4gYXJyYXkgb2YgIk15Q2xhc3MiLAotCQkvLyB0aGUgcmV0dXJuVHlwZU5hbWUgd2lsbCBiZSBzZXQgdG8gIk15Q2xhc3MiLCBub3QgYW4gYXJyYXkgdHlwZS4KLQkJSmF2YUNsYXNzIHJlbW90ZUludGYgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVtb3RlSW50Zik7Ci0KLQkJLy8gUGVyZm9ybSB0aGlzIGNoZWNrIGZvciBhbGwgZmluZGVycyBidXQgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLgotCQkvLyBUaGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHJlbW90ZSBpbnRlcmZhY2UsIGJlY2F1c2UgdGhlIG1ldGhvZCBpcwotCQkvLyBhIHNpbmdsZS1vYmplY3QgZmluZGVyIG1ldGhvZDsgYnV0IG90aGVyIGZpbmRlcnMgbWF5IHJldHVybiBhIENvbGxlY3Rpb24gb3IgRW51bWVyYXRpb24uCi0JCWlmICghbWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSkpIHsKLQkJCUphdmFIZWxwZXJzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJCi0JCQlpZiAoISAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb21Db2xsZWN0aW9uKHJldHVyblR5cGUsIGJlYW4pIHx8IAotCQkJICAgICAgIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tRW51bWVyYXRpb24ocmV0dXJuVHlwZSwgYmVhbikgfHwgCi0JCQkgICAgICAgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0dXJuVHlwZSwgcmVtb3RlSW50ZikpKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgcmVtb3RlSW50Zi5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gVGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYWx3YXlzIGluY2x1ZGUgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLCB3aGljaCBpcyAKLQkJLy8gYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyAKLQkJLy8gYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkRCWVBSSU1BUllLRVkpKSB7Ci0JCQl2YWxpZGF0ZUZpbmRCeVByaW1hcnlLZXlNZXRob2RfcmVtb3RlRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdCZWFuQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlzdXBlci52YWxpZGF0ZU1hdGNoaW5nQmVhbkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCU1ldGhvZCBlamJDcmVhdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoYmVhbkNsYXNzLCBtZXRob2QsIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURSk7Ci0JCWlmIChlamJDcmVhdGVNZXRob2QgPT0gbnVsbCkgewotCQkJLy8gYWxyZWFkeSByZXBvcnRlZCBpbiBzdXBlcgotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBmaW5kZXIgbWV0aG9kIG9uIHRoZSBlbnRpdHkgaG9tZSBjbGFzcyBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24uCi0JICogU2VjdGlvbjogOS4yLjgKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nQmVhbkZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBob21lTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlpZiAoaG9tZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBFYWNoIGZpbmRlciBtZXRob2QgbXVzdCBiZSBuYW1lZCAiZmluZDxNRVRIT0Q+IiAoZS5nLiBmaW5kTGFyZ2VBY2NvdW50cyksIGFuZCBpdAotCQkvLyBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgCi0JCS8vIChlLmcuIGVqYkZpbmRMYXJnZUFjY291bnRzKS4gVGhlIG1hdGNoaW5nIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBoYXZlIHRoZSAKLQkJLy8gc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgbWF5IGJlIGRpZmZlcmVudC4pCi0JCVN0cmluZyBmaW5kTWV0aG9kTmFtZSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCRiArIChob21lTWV0aG9kLmdldE5hbWUoKSkuc3Vic3RyaW5nKDEpOyAvLyBlLmcuIGlmIHRoZSBob21lIG1ldGhvZCBpcyBuYW1lZCBmaW5kWCwgdGhlbiB0aGUgYmVhbiBtZXRob2Qgd2lsbCBiZSBuYW1lZCBlamJGaW5kWAotCi0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuQ2xhc3MpOwotCi0JCU1ldGhvZCBiZWFuTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW5DbGFzcywgaG9tZU1ldGhvZCwgZmluZE1ldGhvZE5hbWUpOwotCQlpZiAoYmVhbk1ldGhvZCA9PSBudWxsKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG5ldyBTdHJpbmdbXSB7IGJlYW5DbGFzcy5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDaGVjayBpZiByZXR1cm4gdHlwZXMgbWF0Y2gKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJSmF2YUhlbHBlcnMgaG9tZVJldFR5cGUgPSBob21lTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJSmF2YUhlbHBlcnMgYmVhblJldFR5cGUgPSBiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShob21lUmV0VHlwZSwgYmVhblJldFR5cGUpKSB7Ci0JCQkvLyBlbWl0IHRoZSBlcnJvciBvbmx5IGlmIGl0J3MgYSBtdWx0aS1maW5kZXIuIFNpbmdsZS1maW5kZXJzIGFyZSBzdXBwb3NlZCB0byBoYXZlIGRpZmZlcmVudCByZXR1cm4gdHlwZXMgb24gdGhlIGhvbWUgJiBiZWFuIGNsYXNzLgotCQkJYm9vbGVhbiBob21lUmV0VHlwZUlzUmVtb3RlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oaG9tZVJldFR5cGUsIGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotCQkJYm9vbGVhbiBiZWFuUmV0VHlwZUlzS2V5ID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oYmVhblJldFR5cGUsICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKSk7Ci0JCQlpZighKGhvbWVSZXRUeXBlSXNSZW1vdGUgJiYgYmVhblJldFR5cGVJc0tleSkpIHsKLQkJCQlKYXZhSGVscGVycyByZXRUeXBlID0gKGJlYW5SZXRUeXBlSXNLZXkpID8gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSA6IGJlYW5SZXRUeXBlOyAvLyBpZiB0aGUgYmVhbiBjbGFzcyByZXR1cm5zIGEga2V5LCB0aGUgaG9tZSBtdXN0IHJldHVybiB0aGUgcmVtb3RlOyBpZiB0aGUgYmVhbiBjbGFzcyByZXR1cm5zIGEgQ29sbC9FbnVtLCB0aGUgaG9tZSBtdXN0IHJldHVybiB0aGUgc2FtZQotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgaG9tZU1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgcmV0VHlwZS5nZXRKYXZhTmFtZSgpLCBiZWFuQ2xhc3MuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkZpbmQgbWV0aG9kIG9mIHRoZSAKLQkJLy8gZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZAotCQkvLyBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQkvKgotCQkvLyBEb24ndCBjaGVjayBmb3IgdGhlIGV4Y2VwdGlvbnMgaGVyZSAtIGxldCB0aGUgYmVhbiBjbGFzcyBkbyBpdC4gV2hlbiB0aGUgaG9tZQotCQkvLyBjaGFuZ2VzLCBhICJkZXBlbmRlbnQiIHZhbGlkYXRpb24gb2YgdGhlIGJlYW4ncyBjaGVja3Mgc2hvdWxkIGJlIGRvbmUgYXV0b21hdGljYWxseS4KLQkJLy8gSWYgaXQgaXMgY2hlY2tlZCBpbiB0aGlzIG1ldGhvZCBhcyB3ZWxsLCB0aGVyZSBhcmUgZHVwbGljYXRlIG1lc3NhZ2VzIG9uIHRoZSB0YXNrIGxpc3QuCi0JCUhhc2hTZXQgZXhjZXB0aW9ucyA9IGdldE5vdFN1YnNldEV4Y2VwdGlvbnMoaG9tZU1ldGhvZCwgYmVhbk1ldGhvZCk7Ci0JCWlmKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuRUpCX01FVEhPRF9USFJPV19OT1RISV9FWENFUCwgbXNnUGFybSwgYmVhbk1ldGhvZCwgRUpCX0JFQU5fR1JPVVApOwotCQkJfQotCQl9CQotCQkqLwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgY3JlYXRlIG1ldGhvZCBvbiB0aGUgZW50aXR5IGhvbWUgaGFzIGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG9uIHRoZSBiZWFuLgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi44Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0JlYW5Qb3N0Q3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgaG9tZU1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJaWYgKGhvbWVNZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCQkvLyAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbkNsYXNzKTsKLQotCQlNZXRob2QgYmVhbk1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChiZWFuQ2xhc3MsIGhvbWVNZXRob2QsIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUpOwotCQlpZiAoYmVhbk1ldGhvZCA9PSBudWxsKSB7Ci0JCQkvLyBMZXQgdGhlIGJlYW4gY2xhc3MgcmVwb3J0IHRoaXMgbWVzc2FnZS4gT3RoZXJ3aXNlLCB3aGVuIHRoZSBiZWFuIGNsYXNzIHJlcG9ydHMgaXQsIHRoaXMgbWVzc2FnZSBsb29rcyBsaWtlIGEgZHVwbGljYXRlLgotCQkJLyoKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBuZXcgU3RyaW5nW10geyBiZWFuQ2xhc3MuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJKi8KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JCS8vIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCQkvLyB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JCS8vIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCQkvLyBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JCS8qCi0JCS8vIERvbid0IGNoZWNrIGZvciB0aGUgZXhjZXB0aW9ucyBoZXJlIC0gbGV0IHRoZSBiZWFuIGNsYXNzIGRvIGl0LiBXaGVuIHRoZSBob21lCi0JCS8vIGNoYW5nZXMsIGEgImRlcGVuZGVudCIgdmFsaWRhdGlvbiBvZiB0aGUgYmVhbidzIGNoZWNrcyBzaG91bGQgYmUgZG9uZSBhdXRvbWF0aWNhbGx5LgotCQkvLyBJZiBpdCBpcyBjaGVja2VkIGluIHRoaXMgbWV0aG9kIGFzIHdlbGwsIHRoZXJlIGFyZSBkdXBsaWNhdGUgbWVzc2FnZXMgb24gdGhlIHRhc2sgbGlzdC4KLQkJSGFzaFNldCBleGNlcHRpb25zID0gZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhob21lTWV0aG9kLCBiZWFuTWV0aG9kKTsKLQkJaWYoZXhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0ge2V4Yy5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCWFkZFZhbGlkYXRpb25NZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5FSkJfTUVUSE9EX1RIUk9XX05PVEhJX0VYQ0VQLCBtc2dQYXJtLCBiZWFuTWV0aG9kLCBFSkJfQkVBTl9HUk9VUCk7Ci0JCQl9Ci0JCX0KLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIC0gVGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYWx3YXlzIGluY2x1ZGUgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLCB3aGljaCBpcyAKLQkJLy8gYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyAKLQkJLy8gYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLQkJaWYgKGZpbmRCeVBLTWV0aG9kcy5zaXplKCkgPT0gMCkgewotCQkJLy8gbXVzdCBoYXZlIG9uZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZAotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDExLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJLyoKLQkJLy8gTm90IHN1cmUgaWYgdGhpcyBjaGVjayBpcyB1c2VmdWwgb3Igbm90LCBiZWNhdXNlIGl0IGlzIGxlZ2FsIGZvciBhIGNoaWxkIGhvbWUgdG8gZGVjbGFyZSBhIGZpbmRCeVByaW1hcnlLZXksCi0JCS8vIGFuZCBhbHNvIGZvciBhIHBhcmVudCBob21lIHRvIGRlY2xhcmUgYSBmaW5kQnlQcmltYXJ5S2V5LgotCQllbHNlIGlmICggZmluZEJ5UEtNZXRob2RzLnNpemUoKSA+IDEgKSB7Ci0JCQkvLyBpZiB0aGUgaG9tZSBpbnRlcmZhY2UgaGFzIG11bHRpcGxlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kcyAoaW1wbGllZCBieSA5LjIuOCkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmluZEJ5UEtNZXRob2RzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5FSkJfSEFTX01VTFRJUExFX1BLX01FVEhPRFMsIChNZXRob2QpaXRlcmF0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCQkqLwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVIb21lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlSG9tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjMwM2JkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVIb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgaG9tZSBjbGFzc2VzIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogVVJMOiBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2VqYi9kb2NzLmh0bWwKLSAqIFNlY3Rpb246IDYuOCwgNi4xMC42IGFuZCA5LjIuOAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVZhbGlkYXRlSG9tZSBleHRlbmRzIEFWYWxpZGF0ZUVKQiB7Ci0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0SG9tZUludGVyZmFjZSgpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIEEgaG9tZSBvciBjb21wb25lbnQgY2xhc3MgbmVlZHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzJyBleHRlbmRlZCBtZXRob2RzOgotCQkvLyAgICAxLiBiZWFuIGNsYXNzCi0JCUxpc3RbXSByZXN1bHQgPSBuZXcgTGlzdFsxXTsKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJaWYoYmVhbkNsYXNzID09IG51bGwpIHsKLQkJCXJlc3VsdFswXSA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMF0gPSBiZWFuQ2xhc3MuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEgaG9tZSBvciBjb21wb25lbnQncyBmaWVsZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MKLQkJLy8gb2YgdGhlIGJlYW4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgdGhlIGNoZWNrIHRoYXQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgaGFzIGEgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvbiB0aGUgaG9tZSwKLQkgKiB0aGlzIG1ldGhvZCwgZ2l2ZW4gdGhlIGJlYW4gbWV0aG9kLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGhvbWUgbWV0aG9kLgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDYuMTAuNiBhbmQgOS4yLjgKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldE1hdGNoaW5nQmVhbkVqYkNyZWF0ZU1ldGhvZEV4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChiZWFuLmdldEVqYkNsYXNzKCksIG1ldGhvZCwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBjYW4sIGFuZCBzaG91bGQsIGJlIHZhbGlkYXRlZC4KLQkgKiBGaWx0ZXIgb3V0IGZhdWx0eSBtZXRob2RzIChpLmUuLCBudWxsKSwgYW5kIG1ldGhvZHMgd2hpY2gKLQkgKiBiZWxvbmcgdG8gdGhlIGJhc2UgdHlwZSwgd2hhdGV2ZXIgdGhhdCBpcy4gKGUuZy4gamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChzdXBlci5pc1ZhbGlkKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KSkgewotCQkJLy8gRXhjbHVkZSByb290IHJlbW90ZSBpbnRlcmZhY2UgbWV0aG9kcwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0VKQkhvbWVNZXRob2QoYmVhbiwgbWV0aG9kKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0NsaW5pdE1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA2LjEwLjYgYW5kIDkuMi44Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gaG9tZSBpbnRlcmZhY2UgbXVzdCBiZSBhbiBpbnRlcmZhY2UKLQkJaWYgKCFjbGF6ei5pc0ludGVyZmFjZSgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIGhvbWUgaW50ZXJmYWNlIG11c3QgaW5oZXJpdCBqYXZheC5lamIuRUpCSG9tZS5jbGFzcwotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkhPTUUsIGJlYW4pKSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJIT01FIH07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVW5uYW1lZFBhY2thZ2UoY2xhenouZ2V0SmF2YVBhY2thZ2UoKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwNDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZUFwcGVuZGl4Qih2YywgYmVhbiwgY2xhenopOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA2LjggYW5kIDYuMTAuNgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kX2JlYW5EZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgCi0JCS8vIHRoZSBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIAotCQkvLyAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJDcmVhdGUgbWV0aG9kIAotCQkvLyBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgCi0JCS8vIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLQkJdmFsaWRhdGVNYXRjaGluZ0JlYW5DcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA2LjgsIDYuMTAuNiBhbmQgOS4yLjgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNyZWF0ZU1ldGhvZF9yZW1vdGVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUphdmFDbGFzcyByZW1vdGVJbnRmID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlbW90ZUludGYpOwotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCByZW1vdGVJbnRmKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQwMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7IHJlbW90ZUludGYuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDYuMTAuNiBhbmQgOS4yLjgKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nQmVhbkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JCS8vIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuQ2xhc3MpOwotCi0JCU1ldGhvZCBlamJDcmVhdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoYmVhbkNsYXNzLCBtZXRob2QsIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURSk7Ci0JCWlmIChlamJDcmVhdGVNZXRob2QgPT0gbnVsbCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDI2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7IGJlYW5DbGFzcy5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBTZWN0aW9uIDYuMTAuNiAoc2Vzc2lvbiksIDkuMi44IChlbnRpdHkpLCBkZWNsYXJlIHRoYXQgYWxsIGV4Y2VwdGlvbnMgZGVjbGFyZWQKLQkJLy8gb24gdGhlIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZgotCQkvLyB0aGUgbWF0Y2hpbmcgY3JlYXRlIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJLyoKLQkJLy8gRG9uJ3QgY2hlY2sgZm9yIHRoZSBleGNlcHRpb25zIGhlcmUgLSBsZXQgdGhlIGJlYW4gY2xhc3MgZG8gaXQuIFdoZW4gdGhlIGhvbWUKLQkJLy8gY2hhbmdlcywgYSAiZGVwZW5kZW50IiB2YWxpZGF0aW9uIG9mIHRoZSBiZWFuJ3MgY2hlY2tzIHNob3VsZCBiZSBkb25lIGF1dG9tYXRpY2FsbHkuCi0JCS8vIElmIGl0IGlzIGNoZWNrZWQgaW4gdGhpcyBtZXRob2QgYXMgd2VsbCwgdGhlcmUgYXJlIGR1cGxpY2F0ZSBtZXNzYWdlcyBvbiB0aGUgdGFzayBsaXN0LgotCQlIYXNoU2V0IGV4Y2VwdGlvbnMgPSBnZXROb3RTdWJzZXRFeGNlcHRpb25zKG1ldGhvZCwgZWpiQ3JlYXRlTWV0aG9kKTsKLQkJaWYoZXhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0ge2V4Yy5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCWFkZFZhbGlkYXRpb25NZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5FSkJfTUVUSE9EX1RIUk9XX05PVEhJX0VYQ0VQLCBtc2dQYXJtLCBlamJDcmVhdGVNZXRob2QsIEVKQl9IT01FX0dST1VQKTsgLy8gc2luY2Ugd2UncmUgYWRkaW5nIHRoZSBtZXNzYWdlIHRvIHRoZSBiZWFuIGNsYXNzLCB3ZSBuZWVkIHRvIG1hcmsgaXQgbGlrZSB0aGUgYmVhbiBjbGFzcyB3b3VsZDsgaS5lLiwgYSBob21lLWRlcGVuZGVudCBtZXNzYWdlCi0JCQl9Ci0JCX0KLQkJKi8KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBcHBlbmRpeEIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgdGhpc0hvbWUpIHsKLQkJLy8gVGhlIEphdmEgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIG11c3QgbWF0Y2ggdGhlIEVKQiBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCi0JCS8vIGUuZy4gaWYgRUpCIEIgaXMgYSBjaGlsZCBvZiBFSkIgQSwgdGhlbiBjbGFzcyBCIG11c3QgYmUgYSBjaGlsZCBvZiBjbGFzcyBBLgotCQkvLyBCIGNvdWxkIGJlIGEgZ3JhbmRjaGlsZCAob3IgZ3JlYXQtZ3JhbmRjaGlsZCBvciAuLi4pIG9mIEEuCi0JCQotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCS8vIGJlYW4gaGFzIG5vIHN1cGVydHlwZQotCQkJcmV0dXJuOwotCQl9Ci0JCUVudGVycHJpc2VCZWFuCXN1cGVydHlwZSA9IGdldFN1cGVyVHlwZShiZWFuKTsKLQkJSmF2YUNsYXNzIHBhcmVudEhvbWUgPSBudWxsOwotCQlpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKLQkJCS8vIGNoZWNrIHRoaXMgQ01QJ3Mgc3VwZXJ0eXBlCi0JCQlwYXJlbnRIb21lID0gc3VwZXJ0eXBlLmdldEhvbWVJbnRlcmZhY2UoKTsKLQotCQkJLy8gSG9tZSBhIFhjaGlsZCBvZiBwYXJlbnQgSG9tZQotCQkJLy8gSW4gb3VyIEVKQiBjb21wb25lbnQgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLCB3aGlsZSBpdCBpcyBsZWdhbCBmb3IKLQkJCS8vIGEgaG9tZSB0byBpbmhlcml0IGZyb20gYW5vdGhlciBob21lLCAoc2VjdGlvbiBCLjIpLCBpdCBpcyBub3QgbGVnYWwKLQkJCS8vIGZvciBXU0EgY29tcG9uZW50IGluaGVyaXRhbmNlIHN0cnVjdHVyZS4gCi0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0aGlzSG9tZSk7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHBhcmVudEhvbWUpOwotCQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0aGlzSG9tZSwgcGFyZW50SG9tZSkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7IHRoaXNIb21lLmdldFF1YWxpZmllZE5hbWUoKSwgcGFyZW50SG9tZS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMTA0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXNIb21lLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSwgYmVhbi5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUtleUNsYXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlS2V5Q2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiYmI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlS2V5Q2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVudGl0eSBrZXkgY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCi0gKiBTZWN0aW9uIDkuMi45Ci0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0ZUtleUNsYXNzIGV4dGVuZHMgQVZhbGlkYXRlRUpCIHsKLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiAoKEVudGl0eSkgcGFyZW50KS5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRNZXRob2RzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGtleSBjbGFzcycgbWV0aG9kIGlzIGRlZmluZWQgb24gYW5vdGhlciBjbGFzcyAKLQkJLy8gb2YgdGhlIGJlYW4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldEZpZWxkc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBrZXkgY2xhc3MnIGZpZWxkIGlzIGRlZmluZWQgb24gYW5vdGhlciBjbGFzcwotCQkvLyBvZiB0aGUgYmVhbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgY2FuLCBhbmQgc2hvdWxkLCBiZSB2YWxpZGF0ZWQuCi0JICogRmlsdGVyIG91dCBmYXVsdHkgbWV0aG9kcyAoaS5lLiwgbnVsbCksIGFuZCBtZXRob2RzIHdoaWNoCi0JICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoc3VwZXIuaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKLQkJCS8vIGV4Y2x1ZGUgcm9vdCBvYmplY3QgbWV0aG9kcwotCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNKYXZhTGFuZ09iamVjdE1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuOQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCXZhbGlkYXRlTGVnYWxSTUlUeXBlKHZjLCBiZWFuLCBjbGF6eik7Ci0KLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1VubmFtZWRQYWNrYWdlKGNsYXp6LmdldEphdmFQYWNrYWdlKCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDQxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgZ2l2ZW4gY2xhc3MgaXMgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QLgotCSAqCi0JICogSmF2YSBSZW1vdGUgTWV0aG9kSW52b2NhdGlvbgotCSAqIFNwZWNpZmljYXRpb24KLQkgKgotCSAqIFJldmlzaW9uIDEuNywgSmF2YSAyIFNESywgU3RhbmRhcmQgRWRpdGlvbiwgdjEuMy4wLCBEZWNlbWJlciAxOTk5Ci0JICoKLQkgKiBTZWN0aW9uOiAyLjYKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUxlZ2FsUk1JVHlwZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGNsYXp6KTsKLQotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BUeXBlKGJlYW4sIGNsYXp6KSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgc3VpdGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGhhc2hDb2RlKCkgYW5kIAotCQkvLyBlcXVhbHMoT2JqZWN0IG90aGVyKSBtZXRob2RzIHRvIHNpbXBsaWZ5IHRoZSBtYW5hZ2VtZW50IG9mIHRoZSBwcmltYXJ5IGtleXMgCi0JCS8vIGJ5IGNsaWVudCBjb2RlLgotCQlNZXRob2QgaGFzaENvZGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0hBU0hDT0RFLCBuZXcgSmF2YUhlbHBlcnNbMF0pOwotCQlpZiAoKGhhc2hDb2RlTWV0aG9kID09IG51bGwpIHx8IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0phdmFMYW5nT2JqZWN0TWV0aG9kKGJlYW4sIGhhc2hDb2RlTWV0aG9kKSkgewotCQkJLy8gRUpCIDEuMCBkaWQgbm90IHJlcXVpcmUgdGhpcyBtZXRob2QsIHNvIHRoaXMgaXMgYSB3YXJuaW5nIGluc3RlYWQgb2YgYW4gZXJyb3IuCi0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCksIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0RTSUdOQVRVUkVfSEFTSENPREV9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDAxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCU1ldGhvZCBlcXVhbHNNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VRVUFMUywgbmV3IEphdmFIZWxwZXJzW117VmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19PQkpFQ1QsIGJlYW4pfSk7Ci0JCWlmICgoZXF1YWxzTWV0aG9kID09IG51bGwpIHx8IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNKYXZhTGFuZ09iamVjdE1ldGhvZChiZWFuLCBlcXVhbHNNZXRob2QpKSkgewotCQkJLy8gRUpCIDEuMCBkaWQgbm90IHJlcXVpcmUgdGhpcyBtZXRob2QsIHNvIHRoaXMgaXMgYSB3YXJuaW5nIGluc3RlYWQgb2YgYW4gZXJyb3IuCi0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCksIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0RTSUdOQVRVUkVfRVFVQUxTIH07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlUmVtb3RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlUmVtb3RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjNiZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZVJlbW90ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIHJlbW90ZSBpbnRlcmZhY2UgY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqIFRoZSBjaGVja3MgZm9yIGEgc2Vzc2lvbiByZW1vdGUgaW50ZXJmYWNlIGFuZCBhbiBlbnRpdHkgcmVtb3RlIGludGVyZmFjZSBhcmUgdGhlIHNhbWUKLSAqIGluIEVKQiAxLjEuCi0gKgotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotICogU2VjdGlvbjogNi4xMC41IGFuZCA5LjIuNwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVZhbGlkYXRlUmVtb3RlIGV4dGVuZHMgQVZhbGlkYXRlRUpCIHsKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuICgoRW50ZXJwcmlzZUJlYW4pcGFyZW50KS5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgIHsKLQkJLy8gQSBob21lIG9yIGNvbXBvbmVudCBjbGFzcyBuZWVkcyB0aGUgZm9sbG93aW5nIGNsYXNzZXMnIGV4dGVuZGVkIG1ldGhvZHM6Ci0JCS8vICAgIDEuIGJlYW4gY2xhc3MKLQkJTGlzdFtdIHJlc3VsdCA9IG5ldyBMaXN0WzFdOwotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlpZihiZWFuQ2xhc3MgPT0gbnVsbCkgewotCQkJcmVzdWx0WzBdID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdFswXSA9IGJlYW5DbGFzcy5nZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldEZpZWxkc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBob21lIG9yIGNvbXBvbmVudCdzIGZpZWxkIGlzIGRlZmluZWQgb24gYW5vdGhlciBjbGFzcwotCQkvLyBvZiB0aGUgYmVhbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgY2FuLCBhbmQgc2hvdWxkLCBiZSB2YWxpZGF0ZWQuCi0JICogRmlsdGVyIG91dCBmYXVsdHkgbWV0aG9kcyAoaS5lLiwgbnVsbCksIGFuZCBtZXRob2RzIHdoaWNoCi0JICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoc3VwZXIuaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKLQkJCS8vIEV4Y2x1ZGUgcm9vdCByZW1vdGUgaW50ZXJmYWNlIG1ldGhvZHMgCi0JCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzRUpCT2JqZWN0TWV0aG9kKGJlYW4sIG1ldGhvZCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChpc0VqYlJlbGF0aW9uc2hpcFJvbGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQ2xpbml0TWV0aG9kKGJlYW4sIG1ldGhvZCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoZSByZW1vdGUgaW50ZXJmYWNlJ3MgbWV0aG9kcyBhZ2FpbnN0IHRoZSBFSkIgMS4xIHNwZWMuCi0JICogU2VjdGlvbjogNi4xMC41IGFuZCA5LjIuNwotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIHJpTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvLyBzdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShyaU1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JL0lJT1AuCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2QodmMsIGJlYW4sIGNsYXp6LCByaU1ldGhvZCk7Ci0KLQkJLy8gRm9yIGVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UsIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZwotCQkvLyBtZXRob2QgaW4gdGhlIHNlc3Npb24gYmVhbidzIGNsYXNzLiAKLQkJdmFsaWRhdGVNZXRob2RfYmVhbkRlcCh2YywgYmVhbiwgY2xhenosIHJpTWV0aG9kKTsKLQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCS8vVGhlcmUgYXJlIG5vIHJlcXVpcmVkIG1ldGhvZHMuCi0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoYXQgdGhlIHJlbW90ZSBpbnRlcmZhY2UgY2xhc3MgZGVmaW5pdGlvbiBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWMuCi0JICoKLQkgKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0JICogVmVyc2lvbjogMS4xCi0JICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0JICogUmVsZWFzZTogMTIvMTcvOTkKLQkgKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotCSAqIFNlY3Rpb246IDYuMTAuNSBhbmQgOS4yLjcKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBJdCBtdXN0IGJlIGFuIGludGVyZmFjZSwgbm90IGEgY2xhc3MuCi0JCWlmICghY2xhenouaXNJbnRlcmZhY2UoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDEyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIHRoZSBqYXZheC5lamIuRUpCT2JqZWN0IGludGVyZmFjZS4KLQkJSmF2YUhlbHBlcnMgamF2YXhFamJPYmplY3QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQk9CSkVDVCwgYmVhbik7Ci0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oY2xhenosIGphdmF4RWpiT2JqZWN0KSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJPQkpFQ1QgfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNVbm5hbWVkUGFja2FnZShjbGF6ei5nZXRKYXZhUGFja2FnZSgpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjA0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQl2YWxpZGF0ZUFwcGVuZGl4Qih2YywgYmVhbiwgY2xhenopOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA2LjEwLjUgYW5kIDkuMi43Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0JlYW5NZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCByZW1vdGVNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAocmVtb3RlTWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuQ2xhc3MpOwotCi0JCU1ldGhvZCBiZWFuTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW5DbGFzcywgcmVtb3RlTWV0aG9kLCByZW1vdGVNZXRob2QuZ2V0TmFtZSgpKTsKLQkJaWYgKGJlYW5NZXRob2QgPT0gbnVsbCkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgYmVhbkNsYXNzLmdldE5hbWUoKX07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDIzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCByZW1vdGVNZXRob2QsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShyZW1vdGVNZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSk7Ci0KLQkJdHJ5IHsKLQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKSkpOwotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJLy8gTGV0IHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBiZWFuIGNsYXNzIHJlcG9ydCB0aGUgcmVmbGVjdGlvbiB3YXJuaW5nLgotCQkJLy8gRG9uJ3QgZG8gYW55IHZhbGlkYXRpb24gYmFzZWQgb24gdGhhdCBtZXRob2QuCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDaGVjayBpZiByZXR1cm4gdHlwZXMgbWF0Y2gKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZW1vdGVNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgcmVtb3RlTWV0aG9kLCBuZXcgU3RyaW5nW10geyBiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRKYXZhTmFtZSgpLCBiZWFuQ2xhc3MuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQotCQkvLyBTZWN0aW9uIDYuMTAuNSAoc2Vzc2lvbiksIDkuMi43IChlbnRpdHkpLCBkZWNsYXJlIHRoYXQgYWxsIGV4Y2VwdGlvbnMgZGVjbGFyZWQKLQkJLy8gb24gdGhlIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZgotCQkvLyB0aGUgbWF0Y2hpbmcgY3JlYXRlIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlLgotCQkvKgotCQkvLyBEb24ndCBjaGVjayBmb3IgdGhlIGV4Y2VwdGlvbnMgaGVyZSAtIGxldCB0aGUgYmVhbiBjbGFzcyBkbyBpdC4gV2hlbiB0aGUgcmVtb3RlCi0JCS8vIGNoYW5nZXMsIGEgImRlcGVuZGVudCIgdmFsaWRhdGlvbiBvZiB0aGUgYmVhbidzIGNoZWNrcyBzaG91bGQgYmUgZG9uZSBhdXRvbWF0aWNhbGx5LgotCQkvLyBJZiBpdCBpcyBjaGVja2VkIGluIHRoaXMgbWV0aG9kIGFzIHdlbGwsIHRoZXJlIGFyZSBkdXBsaWNhdGUgbWVzc2FnZXMgb24gdGhlIHRhc2sgbGlzdC4KLQkJSGFzaFNldCBleGNlcHRpb25zID0gZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhyZW1vdGVNZXRob2QsIGJlYW5NZXRob2QpOwotCQlpZihleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkVKQl9NRVRIT0RfVEhST1dfTk9UUklfRVhDRVAsIG1zZ1Bhcm0sIGJlYW5NZXRob2QsIEVKQl9CRUFOX0dST1VQKTsKLQkJCX0KLQkJfQkKLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhlIHJlbW90ZSBpbnRlcmZhY2UncyBtZXRob2RzIGFnYWluc3QgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKiBTZWN0aW9uOiA2LjEwLjUgYW5kIDkuMi43Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNZXRob2RfYmVhbkRlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIHJpTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJLy8gRm9yIGVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UsIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZwotCQkvLyBtZXRob2QgaW4gdGhlIHNlc3Npb24gYmVhbidzIGNsYXNzLiAKLQkJdmFsaWRhdGVNYXRjaGluZ0JlYW5NZXRob2QodmMsIGJlYW4sIGNsYXp6LCByaU1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIEZpbmFsIGNoZWNrIHRvIHNlZSBpZiByZXF1aXJlZCBtZXRob2RzIHdlcmUgZGV0ZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvL1RoZXJlIGFyZSBubyByZXF1aXJlZCBtZXRob2RzLgotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHRoaXNSZW1vdGUpIHsKLQkJLy8gVGhlIEphdmEgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIG11c3QgbWF0Y2ggdGhlIEVKQiBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCi0JCS8vIGUuZy4gaWYgRUpCIEIgaXMgYSBjaGlsZCBvZiBFSkIgQSwgdGhlbiBjbGFzcyBCIG11c3QgYmUgYSBjaGlsZCBvZiBjbGFzcyBBLgotCQkvLyBCIGNvdWxkIGJlIGEgZ3JhbmRjaGlsZCAob3IgZ3JlYXQtZ3JhbmRjaGlsZCBvciAuLi4pIG9mIEEuCi0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUVudGVycHJpc2VCZWFuIHN1cGVydHlwZSA9IGdldFN1cGVyVHlwZShiZWFuKTsKLQkJSmF2YUNsYXNzIHBhcmVudFJlbW90ZSA9IG51bGw7Ci0JCWlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewotCQkJcGFyZW50UmVtb3RlID0gc3VwZXJ0eXBlLmdldFJlbW90ZUludGVyZmFjZSgpOwotCi0JCQkvLyBSZW1vdGUgYSBYY2hpbGQgb2YgcGFyZW50IFJlbW90ZQotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodGhpc1JlbW90ZSk7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHBhcmVudFJlbW90ZSk7Ci0JCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0aGlzUmVtb3RlLCBwYXJlbnRSZW1vdGUpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyB0aGlzUmVtb3RlLmdldFF1YWxpZmllZE5hbWUoKSwgcGFyZW50UmVtb3RlLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIxMDUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpc1JlbW90ZSwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCksIGJlYW4uZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGlvblJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGlvblJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkNWQ3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRpb25SdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5FamJNb2R1bGVFeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVZhbGlkYXRpb25SdWxlIGltcGxlbWVudHMgSVZhbGlkYXRpb25SdWxlIHsKLQotICAgIHByaXZhdGUgU2V0IF9kZXBlbmRlbnRzID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgbW9kSGVscGVyID0gbnVsbDsKLQotICAgIC8qCi0gICAgICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjYWRkRGVwZW5kZW50KElWYWxpZGF0aW9uUnVsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGREZXBlbmRlbnQoSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLSAgICAgICAgaWYgKHJ1bGUgPT0gbnVsbCkgeyByZXR1cm47IH0KLQotICAgICAgICBpZiAoX2RlcGVuZGVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgX2RlcGVuZGVudHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgX2RlcGVuZGVudHMuYWRkKHJ1bGUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjZ2V0RGVwZW5kZW50cygpCi0gICAgICovCi0gICAgcHVibGljIFNldCBnZXREZXBlbmRlbnRzKCkgewotICAgICAgICByZXR1cm4gX2RlcGVuZGVudHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBnZXRFamJFeHRlbnNpb25IZWxwZXIoT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIElFSkJNb2RlbEV4dGVuZGVyTWFuYWdlci5JTlNUQU5DRS5nZXRFSkJNb2R1bGVFeHRlbnNpb24oY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIEVudGVycHJpc2VCZWFuCi0gICAgICogQHJldHVybiBFbnRlcnByaXNlQmVhbiByZXR1cm4gdGhlIHN1cGVyIHR5cGUgb2YgYW4gRW50ZXJwcmlzZUJlYW4gYnkKLSAgICAgKiAgICAgICAgIGxvYWRpbmcgdGhlIGV4dG5lbnNpb24gcGx1Z2luIGlmIGV4dGVuc2lvbiBwbHVnaW4gZmFpbHMgdG8gbG9hZAotICAgICAqICAgICAgICAgcmV0dXJuIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgRW50ZXJwcmlzZUJlYW4gZ2V0U3VwZXJUeXBlKEVudGVycHJpc2VCZWFuIGVudGVycHJpc2VCZWFuKSB7Ci0gICAgICAgIEVudGVycHJpc2VCZWFuIHN1cGVyVHlwZSA9IG51bGw7Ci0gICAgICAgIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBhTW9kSGVscGVyID0gZ2V0RWpiRXh0ZW5zaW9uSGVscGVyKGVudGVycHJpc2VCZWFuKTsKLSAgICAgICAgaWYgKGFNb2RIZWxwZXIgIT0gbnVsbCkgc3VwZXJUeXBlID0gYU1vZEhlbHBlci5nZXRTdXBlclR5cGUoZW50ZXJwcmlzZUJlYW4pOwotICAgICAgICByZXR1cm4gc3VwZXJUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBFbnRlcnByaXNlQmVhbgotICAgICAqIEByZXR1cm4gU3RyaW5nIC0gc3VwZXIgdHlwZSBmaWxlIG5hbWUgcmV0dXJuIHRoZSBzdXBlciB0eXBlIGZpbGUgb2YgYW4KLSAgICAgKiAgICAgICAgIEVudGVycHJpc2VCZWFuIGJ5IGxvYWRpbmcgdGhlIGV4dG5lbnNpb24gcGx1Z2luIGlmIGV4dGVuc2lvbgotICAgICAqICAgICAgICAgcGx1Z2luIGZhaWxzIHRvIGxvYWQgcmV0dXJuIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVKQkluaGVyaXRhbmNlRmlsZU5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBzdXBlclR5cGVGaWxlTmFtZSA9IG51bGw7Ci0gICAgICAgIC8vIFRPRE8gTURFIFJldmlzaXQgdGhpcyBhZnRlciB0aGUgZHJvcAotICAgICAgICBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgYU1vZEhlbHBlciA9IGdldEVqYkV4dGVuc2lvbkhlbHBlcihudWxsKTsKLSAgICAgICAgaWYgKGFNb2RIZWxwZXIgIT0gbnVsbCkgc3VwZXJUeXBlRmlsZU5hbWUgPSBhTW9kSGVscGVyLmdldEVKQkluaGVyaXRhbmNlRmlsZU5hbWUoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyVHlwZUZpbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBFbnRlcnByaXNlQmVhbgotICAgICAqIEByZXR1cm4gTGlzdCAtIGV4dGVuZGVkIHJvbGUgbmFtZXMgcmV0dXJuIHRoZSBleHRlbmRlZCByb2xlIG1ldGhvZCBuYW1lCi0gICAgICogICAgICAgICBvZiBhbiBFbnRlcnByaXNlQmVhbiBieSBsb2FkaW5nIHRoZSBleHRuZW5zaW9uIHBsdWdpbiBpZgotICAgICAqICAgICAgICAgZXh0ZW5zaW9uIHBsdWdpbiBmYWlscyB0byBsb2FkIHJldHVybiBudWxsCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIExpc3QgZ2V0Um9sZU1ldGhvZE5hbWVzRXh0ZW5kZWQoRW50ZXJwcmlzZUJlYW4gZW50ZXJwcmlzZUJlYW4pIHsKLSAgICAgICAgTGlzdCByb2xlTmFtZUV4dGVuZGVkID0gbnVsbDsKLSAgICAgICAgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGFNb2RIZWxwZXIgPSBnZXRFamJFeHRlbnNpb25IZWxwZXIoZW50ZXJwcmlzZUJlYW4pOwotICAgICAgICBpZiAoYU1vZEhlbHBlciAhPSBudWxsICYmIGVudGVycHJpc2VCZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKQotICAgICAgICAgICAgICAgIHJvbGVOYW1lRXh0ZW5kZWQgPSBhTW9kSGVscGVyLmdldFJvbGVNZXRob2ROYW1lc0V4dGVuZGVkKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBlbnRlcnByaXNlQmVhbik7Ci0gICAgICAgIHJldHVybiByb2xlTmFtZUV4dGVuZGVkOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGFsbG9jYXRlIG5vdGhpbmcuCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwb3N0VmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3N0VmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBCeSBkZWZhdWx0LCBhc3N1bWUgdGhhdCBub3RoaW5nIHdhcyBhbGxvY2F0ZWQgaW4gcHJlVmFsaWRhdGUuCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNyZXNldCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGFzc3VtZSB0aGF0IG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVzZXQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Fic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjkyYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Fic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgRUpCIFZhbGlkYXRpb24gcnVsZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci0KLS8qKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSgpIHsKLQkJLy9EZWZhdWx0Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEhhc2hNYXAgX3J1bGVMaXN0ID0gbnVsbDsKLQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLSAgICAJaWYocnVsZSA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJCi0gICAgCS8vIFNpbmNlIHdlIGRvbid0IHB1dCBhIGxvY2sgb24gdGhlIHJ1bGUgd2hlbiBpdCdzIGNoZWNrZWQgb3V0IHZpYSBnZXRSdWxlKE9iamVjdCksCi0gICAgCS8vIHRoZXJlJ3Mgbm90aGluZyB0byBkbyBvdGhlciB0aGFuIHJlc2V0IHRoZSBydWxlIHRvIHByZXBhcmUgaXQgZm9yIHJldXNlLgotICAgIAlydWxlLnJlc2V0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEl0ZXJhdG9yIGFkZERlcGVuZGVudFJ1bGVUb1J1bGVMaXN0KCkgewotICAgIAlJdGVyYXRvciBpdGVyYXRvciA9IF9ydWxlTGlzdC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIAl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAJCUlWYWxpZGF0aW9uUnVsZSBydWxlID0gKElWYWxpZGF0aW9uUnVsZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgCQlPYmplY3RbXSBpZHMgPSBydWxlLmdldERlcGVuZHNPbigpOwotICAgIAkJaWYoaWRzID09IG51bGwpIHsKLSAgICAJCQljb250aW51ZTsKLSAgICAJCX0KLSAgICAJCQotICAgIAkJZm9yKGludCBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgCQkJSVZhbGlkYXRpb25SdWxlIGRSdWxlID0gKElWYWxpZGF0aW9uUnVsZSlfcnVsZUxpc3QuZ2V0KGlkc1tpXSk7Ci0gICAgCQkJaWYoZFJ1bGUgIT0gbnVsbCkgewotICAgIAkJCQlkUnVsZS5hZGREZXBlbmRlbnQocnVsZSk7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dBbGxEZXBlbmRlbnRSdWxlcygpIHsKLSAgICAJSXRlcmF0b3IgaXRlcmF0b3I7Ci0gICAgCUxvZ2dlciBsb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLSAgICAJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0gICAgCQlpdGVyYXRvciA9IF9ydWxlTGlzdC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIAkJSXRlcmF0b3IgZGVwSXRlcmF0b3IgPSBudWxsOwotICAgIAkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCQkJSVZhbGlkYXRpb25SdWxlIHJ1bGUgPSAoSVZhbGlkYXRpb25SdWxlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAJCQlTZXQgZGVwZW5kZW50cyA9IHJ1bGUuZ2V0RGVwZW5kZW50cygpOwotICAgIAkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgCQkJYnVmZmVyLmFwcGVuZCgibGlzdCBvZiBkZXBlbmRlbnRzIGZvciBydWxlOiIpOyAvLyROT04tTkxTLTEkCi0gICAgCQkJYnVmZmVyLmFwcGVuZChydWxlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgCQkJaWYoZGVwZW5kZW50cyAhPSBudWxsKSB7Ci0gICAgCQkJCWRlcEl0ZXJhdG9yID0gZGVwZW5kZW50cy5pdGVyYXRvcigpOwotICAgIAkJCQl3aGlsZShkZXBJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAJCQkJCUlWYWxpZGF0aW9uUnVsZSBkUnVsZSA9IChJVmFsaWRhdGlvblJ1bGUpZGVwSXRlcmF0b3IubmV4dCgpOwotICAgIAkJCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCQkJYnVmZmVyLmFwcGVuZChkUnVsZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpOwotCi0gICAgcHJvdGVjdGVkIEVKQkphciBnZXRFSkJKYXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjKSB7Ci0gICAgCXJldHVybiAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgaWRlbnRpZmllZCBJVmFsaWRhdGlvblJ1bGUuCi0gICAgICogSWYgdGhlIHJ1bGVpZCBpcyBub3QgcmVnaXN0ZXJlZCwgb3IgaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0gICAgICogaW5zdGFudGlhdGluZyB0aGUgSVZhbGlkYXRpb25SdWxlLCB0aGVuIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVZhbGlkYXRpb25SdWxlIGdldFJ1bGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgcnVsZUlkKSB7Ci0gICAgCS8vIFRvIGF2b2lkIGxvYWRpbmcgYSBydWxlIHVudGlsIGl0IGlzIG5lZWRlZCwgaW50aWFsaXplCi0gICAgCS8vIHRoZSBsaXN0IHdpdGggYSBydWxlIGlkIGFzIHRoZSBrZXksIGFuZCBhIFN0cmluZyBjbGFzcyBuYW1lCi0gICAgCS8vIGFzIGEgdmFsdWUuIFdoZW4gYSBydWxlIGlzIGxvYWRlZCwgaWYgdGhlIHZhbHVlIGlzIGEgU3RyaW5nLAotICAgIAkvLyB0aGVuIHRoZSBJVmFsaWRhdGlvblJ1bGUgaGFzIG5vdCBiZWVuIGluc3RhbnRpYXRlZC4gQ3JlYXRlIGFuCi0gICAgCS8vIGluc3RhbmNlIGFuZCBzdG9yZSB0aGF0IGluIHBsYWNlIG9mIHRoZSBTdHJpbmcuIElmIHRoZSB2YWx1ZQotICAgIAkvLyBpcyBhbHJlYWR5IGFuIElWYWxpZGF0aW9uUnVsZSBpbnN0YW5jZSwgcmV0dXJuIGl0LgotICAgIAkKLSAgICAJT2JqZWN0IHJ1bGUgPSBfcnVsZUxpc3QuZ2V0KHJ1bGVJZCk7Ci0gICAgCWlmKHJ1bGUgPT0gbnVsbCkgewotICAgIAkJLy8gTm8gc3VjaCBydWxlSWQgcmVnaXN0ZXJlZC4KLSAgICAJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLSAgICAJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLSAgICAJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGUgZnJvbSBydWxlSWQ6ICIgKyBydWxlSWQpOyAvLyROT04tTkxTLTEkCi0gICAgCQl9Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIAkKLSAgICAJcmV0dXJuIChJVmFsaWRhdGlvblJ1bGUpcnVsZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BYnN0cmFjdEVKQlZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTAzZTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BYnN0cmFjdEVKQlZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjQsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JFeHRlbmRlcjsKLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUpCVmFsaWRhdG9yIGV4dGVuZHMgSjJFRVZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3JFeHRlbmRlciB7Ci0JcHJvdGVjdGVkIE1hcCBfdmFsaWRhdGVkID0gbnVsbDsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFic3RyYWN0RUpCVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCQlfdmFsaWRhdGVkID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgZ2V0VmFsaWRhdGVkTWFwKCl7Ci0JCWlmKCBfdmFsaWRhdGVkID09IG51bGwgKXsKLQkJCV92YWxpZGF0ZWQgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBfdmFsaWRhdGVkOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2dNaXNzaW5nUnVsZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBydWxlSWQpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIHJ1bGVJZCArICIgPSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZSh2Yyk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGFkZEludGVybmFsRXJyb3JNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YykgewotCQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UodmMsIG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbnRlcm5hbEVycm9yTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIFRocm93YWJsZSBleGMpIHsKLQkJSU1lc3NhZ2UgbXNzZyA9IHZjLmdldE1lc3NhZ2UoKTsKLQkJbXNzZy5zZXRJZChpbnRlcm5hbEVycm9yTWVzc2FnZSgpKTsKLQkJdmMuYWRkTWVzc2FnZShtc3NnKTsKLQkJaWYoZXhjICE9IG51bGwpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcCByZW1vdmVPbGRNZXNzYWdlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsTWFwIHRhcmdldHMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCWlmKHZjLmdldFVSSXMoKSA9PSBudWxsKSB7Ci0JCQkJLy8gRnVsbCB2YWxpZGF0aW9uCi0JCQkJdmMucmVtb3ZlQWxsTWVzc2FnZXMoKTsgLy8gUmVtb3ZlIG1lc3NhZ2VzIGZyb20gdGhlIEVKQkphci4KLQkJCQl2Yy5sb2FkTW9kZWwocmVtb3ZlT2xkTWVzc2FnZXNTdHJpbmcoKSwgbmV3IE9iamVjdFtde3ZjLmdldFJlcG9ydGVyKCksIG51bGx9KTsgLy8gUmVtb3ZlIG1lc3NhZ2VzIGZyb20gYW55IEVKQiBjbGllbnQgSkFSIGZpbGVzIG9yIEphdmEgVXRpbGl0eSBKQVIgZmlsZXMuCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlwcmVSZW1vdmVPbGRNZXNzYWdlcyh2Yyx0YXJnZXRzKTsgLy8gR2V0IHRoZSBsaXN0IG9mIHRhcmdldHMgdG8gYmUgdmFsaWRhdGVkLCBhbmQgcmVtb3ZlIG1lc3NhZ2VzIGZyb20gYWxsIG9mIHRoZW0uCi0KLQkJCS8vIFJlbW92ZSB0aGUgbWVzc2FnZXMgZnJvbSBhbGwgb2YgdGhlIGNoYW5nZWQgZmlsZXMgYW5kIHRoZWlyIGRlcGVuZGVudHMuCi0JCQl2Yy5sb2FkTW9kZWwocmVtb3ZlT2xkTWVzc2FnZXNTdHJpbmcoKSwgbmV3IE9iamVjdFtde3ZjLmdldFJlcG9ydGVyKCksIHRhcmdldHN9KTsKLQkJCXJldHVybiB0YXJnZXRzOwotCQl9Ci0JLyoqCi0JICogQHBhcmFtIHZjCi0JICogQHBhcmFtIGRlbHRhCi0JICogQHBhcmFtIHRhcmdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmVSZW1vdmVPbGRNZXNzYWdlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsTWFwIHRhcmdldHMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy9EZWZhdWx0Ci0JfQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlbW92ZU9sZE1lc3NhZ2VzU3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JKiBAcmV0dXJuCi0JKi8KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbEVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuSVZhbGlkYXRvciN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuSUhlbHBlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuSUZpbGVEZWx0YVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvL0RlZmF1bHQKLQkJc3VwZXIudmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHJ1bihJVmFsaWRhdGlvblJ1bGUgcnVsZSwgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotICAgIAlpZihpc1ZhbGlkYXRlZChydWxlLmdldElkKCksIHRhcmdldFBhcmVudCwgdGFyZ2V0KSkgewotICAgIAkJLy8gV2hldGhlciBvciBub3QgdGhpcyBpcyBhIGZ1bGwgb3IgaW5jcmVtZW50YWwgcnVuLCBkb24ndCByZXZhbGlkYXRlIHRoaXMgdGFyZ2V0Ci0gICAgCQkvLyBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZC4gKGUuZy4gaWYgYSBjbGFzcyBpcyB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgYmVhbiwKLSAgICAJCS8vIGFuZCBzYXkgb25lIGJlYW4gaXMgc3RhdGVsZXNzIGFuZCBvbmUgaXMgc3RhdGVmdWwsIGFuZCBldmVyeXRoaW5nIGVsc2UgYWJvdXQgdGhlCi0gICAgCQkvLyBiZWFucyBhcmUgaWRlbnRpY2FsLCBkb24ndCB2YWxpZGF0ZSB0aGF0IGNsYXNzIGFnYWluLikKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAkKLSAgICAJdHJ5IHsKLSAgICAJCXJ1bGUucHJlVmFsaWRhdGUoZ2V0VmFsaWRhdGlvbkNvbnRleHQoKSwgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotICAgIAkJcnVsZS52YWxpZGF0ZShnZXRWYWxpZGF0aW9uQ29udGV4dCgpLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0gICAgCQlydWxlLnBvc3RWYWxpZGF0ZShnZXRWYWxpZGF0aW9uQ29udGV4dCgpLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0gICAgCX0KLSAgICAJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBleGMpIHsKLSAgICAJCS8vIENsZWFuIHVwIHRoZSBtZXNzYWdlcyB3aGljaCBhcmUgb24gdGhlIHRhc2sgbGlzdD8gT3IgaXMgaXQgbmljZXIgdG8gbGVhdmUgdGhlbSBiZWhpbmQ/Ci0gICAgCX0KLSAgICAJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgCQl0aHJvdyBlOwotICAgIAl9Ci0gICAgCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLSAgICAJCWFkZEludGVybmFsRXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25Db250ZXh0KCksIGV4Yyk7Ci0gICAgCX0KLSAgICAJZmluYWxseSB7Ci0gICAgCQlzZXRWYWxpZGF0ZWQocnVsZS5nZXRJZCgpLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0gICAgCQlyZWxlYXNlUnVsZXMocnVsZSk7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcnVsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlbGVhc2VSdWxlcyhJVmFsaWRhdGlvblJ1bGUgcnVsZSk7IAotCi0gICAgcHJpdmF0ZSBJRUpCVmFsaWRhdGlvbkNvbnRleHQgX3ZjID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBJRUpCVmFsaWRhdGlvbkNvbnRleHQgZ2V0VmFsaWRhdGlvbkNvbnRleHQoKSB7Ci0gICAgCXJldHVybiBfdmM7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbGlkYXRpb25Db250ZXh0KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YykgewotICAgIAlfdmMgPSB2YzsKLSAgICB9Ci0JCi0JLyoqCi0JICogIFRoaXMgY2xhc3MgaXMgcHVibGljIG9ubHkgZm9yIHRoZSBFSkJIZWxwZXIuCi0JICovCi0JcHVibGljIGNsYXNzIFRhcmdldE9iamVjdCB7Ci0JCXByaXZhdGUgT2JqZWN0IF9wYXJlbnQgPSBudWxsOwotCQlwcml2YXRlIE9iamVjdCBfdGFyZ2V0ID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBUYXJnZXRPYmplY3QoKSB7Ci0JCQkvL0RlZmF1bHQKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXRUYXJnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gX3BhcmVudDsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXRUYXJnZXQoKSB7Ci0JCQlyZXR1cm4gX3RhcmdldDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0VGFyZ2V0UGFyZW50KE9iamVjdCB0cCkgewotCQkJX3BhcmVudCA9IHRwOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoT2JqZWN0IHQpIHsKLQkJCV90YXJnZXQgPSB0OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaW50IHBhcmVudCA9IChnZXRUYXJnZXRQYXJlbnQoKSA9PSBudWxsKSA/IDAgOiBnZXRUYXJnZXRQYXJlbnQoKS5oYXNoQ29kZSgpOwotCQkJaW50IHRhcmdldCA9IChnZXRUYXJnZXQoKSA9PSBudWxsKSA/IDAgOiBnZXRUYXJnZXQoKS5oYXNoQ29kZSgpOwotCQkJcmV0dXJuIHBhcmVudCArIHRhcmdldDsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZihvID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCWlmKHRoaXMgPT0gbykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQlpZighKG8gaW5zdGFuY2VvZiBUYXJnZXRPYmplY3QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlPYmplY3QgdGhpc1BhcmVudCA9IHRoaXMuZ2V0VGFyZ2V0UGFyZW50KCk7Ci0JCQlPYmplY3Qgb1BhcmVudCA9ICgoVGFyZ2V0T2JqZWN0KW8pLmdldFRhcmdldFBhcmVudCgpOwotCQkJT2JqZWN0IHRoaXNUYXJnZXQgPSB0aGlzLmdldFRhcmdldCgpOwotCQkJT2JqZWN0IG9UYXJnZXQgPSAoKFRhcmdldE9iamVjdClvKS5nZXRUYXJnZXQoKTsKLQkJCQotCQkJaWYoKHRoaXNQYXJlbnQgPT0gbnVsbCkgJiYgKG9QYXJlbnQgPT0gbnVsbCkpIHsKLQkJCQkvLyBjaGVjayB0YXJnZXQKLQkJCX0KLQkJCWVsc2UgaWYoKHRoaXNQYXJlbnQgIT0gbnVsbCkgJiYgKG9QYXJlbnQgIT0gbnVsbCkpIHsKLQkJCQlpZih0aGlzUGFyZW50LmVxdWFscyhvUGFyZW50KSkgewotCQkJCQkvLyBjaGVjayB0YXJnZXQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCWlmKCh0aGlzVGFyZ2V0ID09IG51bGwpICYmIChvVGFyZ2V0ID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmKCh0aGlzVGFyZ2V0ICE9IG51bGwpICYmIChvVGFyZ2V0ICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuICh0aGlzVGFyZ2V0LmVxdWFscyhvVGFyZ2V0KSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlZChPYmplY3Qga2V5LCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB7Ci0gICAgCVNldCBkb25lID0gbnVsbDsKLSAgICAJaWYoZ2V0VmFsaWRhdGVkTWFwKCkuY29udGFpbnNLZXkoa2V5KSkgewotICAgIAkJZG9uZSA9IChTZXQpZ2V0VmFsaWRhdGVkTWFwKCkuZ2V0KGtleSk7Ci0gICAgCX0KLSAgICAJZWxzZSB7Ci0gICAgCQlkb25lID0gbmV3IEhhc2hTZXQoKTsKLSAgICAJfQotICAgIAkKLSAgICAJZG9uZS5hZGQoZ2V0VGFyZ2V0T2JqZWN0UG9vbCgpLmdldFRhcmdldE9iamVjdCh0YXJnZXRQYXJlbnQsIHRhcmdldCkpOwotICAgIAlnZXRWYWxpZGF0ZWRNYXAoKS5wdXQoa2V5LCBkb25lKTsKLSAgICB9Ci0KLQotCXByb3RlY3RlZCBjbGFzcyBUYXJnZXRPYmplY3RQb29sIHsKLQkJcHJpdmF0ZSBpbnQgX2dyb3dTaXplID0gMDsKLQkJcHJpdmF0ZSBWZWN0b3IgX3Bvb2wgPSBudWxsOwotCQkKLQkJcHVibGljIFRhcmdldE9iamVjdFBvb2woaW50IGluaXRpYWxTaXplKSB7Ci0JCQlfZ3Jvd1NpemUgPSBpbml0aWFsU2l6ZTsKLQkJCV9wb29sID0gbmV3IFZlY3Rvcihpbml0aWFsU2l6ZSwgX2dyb3dTaXplKTsKLQkJCWdyb3coKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGdyb3coKSB7Ci0JCQlmb3IoaW50IGk9MDsgaTxfZ3Jvd1NpemU7IGkrKykgewotCQkJCV9wb29sLmFkZChuZXcgVGFyZ2V0T2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgVGFyZ2V0T2JqZWN0IGdldFRhcmdldE9iamVjdChPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB7Ci0JCQlpZihfcG9vbC5zaXplKCkgPD0gMCkgewotCQkJCWdyb3coKTsKLQkJCX0KLQkJCVRhcmdldE9iamVjdCBvYmogPSAoVGFyZ2V0T2JqZWN0KV9wb29sLnJlbW92ZSgwKTsKLQkJCW9iai5zZXRUYXJnZXRQYXJlbnQodGFyZ2V0UGFyZW50KTsKLQkJCW9iai5zZXRUYXJnZXQodGFyZ2V0KTsKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbGVhc2UoVGFyZ2V0T2JqZWN0IG9iaikgewotCQkJb2JqLnNldFRhcmdldFBhcmVudChudWxsKTsKLQkJCW9iai5zZXRUYXJnZXQobnVsbCk7Ci0JCQlfcG9vbC5hZGQob2JqKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGFyZ2V0T2JqZWN0UG9vbCBnZXRUYXJnZXRPYmplY3RQb29sKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRlZChPYmplY3Qga2V5LCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB7Ci0gICAgCWlmKCFnZXRWYWxpZGF0ZWRNYXAoKS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgCX0KLSAgICAKLSAgICAKLSAgICAJU2V0IGRvbmUgPSAoU2V0KWdldFZhbGlkYXRlZE1hcCgpLmdldChrZXkpOwotICAgIAlUYXJnZXRPYmplY3QgdGVtcCA9IGdldFRhcmdldE9iamVjdFBvb2woKS5nZXRUYXJnZXRPYmplY3QodGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotICAgIAl0cnkgewotICAgIAkJaWYoZG9uZS5jb250YWlucyh0ZW1wKSkgewotICAgIAkJCXJldHVybiB0cnVlOwotICAgIAkJfQotICAgIAkJCi0gICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgCX0KLSAgICAJZmluYWxseSB7Ci0gICAgCQlnZXRUYXJnZXRPYmplY3RQb29sKCkucmVsZWFzZSh0ZW1wKTsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotICAgIAkvL2NsZWFudXAgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIHZhbGlkYXRpb25GaW5pc2hpbmcgbWV0aG9kIGJlbG93LiAgU2VlIGJ1Z3ppbGxhIDI5MDU4MSBmb3IgZGV0YWlscy4KLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmKCBfdmFsaWRhdGVkICE9IG51bGwgKXsKLQkgICAgCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3ZhbGlkYXRlZC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCSAgICAJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JICAgIAkJU2V0IGRvbmUgPSAoU2V0KV92YWxpZGF0ZWQuZ2V0KGl0ZXJhdG9yLm5leHQoKSk7Ci0JICAgIAkJSXRlcmF0b3IgdG9JdGVyYXRvciA9IGRvbmUuaXRlcmF0b3IoKTsKLQkgICAgCQl3aGlsZSh0b0l0ZXJhdG9yLmhhc05leHQoKSkgewotCSAgICAJCQlUYXJnZXRPYmplY3QgdG8gPSAoVGFyZ2V0T2JqZWN0KXRvSXRlcmF0b3IubmV4dCgpOwotCSAgICAJCQlnZXRUYXJnZXRPYmplY3RQb29sKCkucmVsZWFzZSh0byk7Ci0JICAgIAkJfQotCSAgICAJCWRvbmUuY2xlYXIoKTsKLQkgICAgCX0KLQkgICAgCV92YWxpZGF0ZWQuY2xlYXIoKTsKLQkgICAgCV92YWxpZGF0ZWQgPSBudWxsOwotCQl9Ci0JCXNldFZhbGlkYXRpb25Db250ZXh0KG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FwcGxpY2F0aW9uQ2xpZW50TWVzc2FnZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FwcGxpY2F0aW9uQ2xpZW50TWVzc2FnZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTczYjc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BcHBsaWNhdGlvbkNsaWVudE1lc3NhZ2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLQotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzkvMjAwMSAxMTo0OTo0NyBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbkNsaWVudE1lc3NhZ2VDb25zdGFudHMgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkoyRUVNZXNzYWdlQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfTU9ERUxfTkFNRSA9ICJBUFBMSUNBVElPTkNMSUVOVF9WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfREQgPSAiSU5WQUxJRF9ERCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FSkJfUkVGUyA9ICJFUlJPUl9FSkJfUkVGUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTkNMSUVOVF9WQUxJREFUT1JfSUQgPSAiQVBQTElDQVRJT05DTElFTlRfVkFMSURBVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0FQUENMSUVOVF9JTlZBTElEX0FQUENMSUVOVF9GSUxFID0gIkVSUk9SX0FQUExJQ0FUSU9OQ0xJRU5UX0lOVkFMSURfQVBQQ0xJRU5UX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9BUFBDTElFTlRfTUlTU0lOR19VUkkgPSAiTUVTU0FHRV9BUFBDTElFTlRfTUlTU0lOR19VUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfQVBQQ0xJRU5UX1ZBTElEQVRJT05fRkFJTEVEID0gIkVSUk9SX0FQUENMSUVOVF9WQUxJREFUSU9OX0ZBSUxFRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfRERfUEFSU0VfTElORUNPTCA9ICJBUFBDTElFTlRfRERfUEFSU0VfTElORUNPTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfRERfUEFSU0VfTElORSA9ICJBUFBDTElFTlRfRERfUEFSU0VfTElORSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfRERfQ0FOTk9UX09QRU5fREQgPSAiQVBQQ0xJRU5UX0REX0NBTk5PVF9PUEVOX0REIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9ERF9QQVJTRV9OT0lORk8gPSAiQVBQQ0xJRU5UX0REX1BBUlNFX05PSU5GTyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfRFVQX1JFU19FTlZfUkVGX0VSUk9SXyA9ICJBUFBDTElFTlRfRFVQX1JFU19FTlZfUkVGX0VSUk9SXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfRFVQX0VKQl9SRUZfRVJST1JfID0gIkFQUENMSUVOVF9EVVBfRUpCX1JFRl9FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX01BSU5fQ0xBU1NfRVJST1JfID0gIkFQUENMSUVOVF9NQUlOX0NMQVNTX0VSUk9SXyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjg0NDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5WYWxpZGF0ZVhtbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotCi0KLQotLyoqCi0gKiBWYWxpZGF0ZXMgdGhlIGFwcGxpY2F0aW4tY2xpZW50LnhtbAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IgZXh0ZW5kcyBKMkVFVmFsaWRhdG9yIGltcGxlbWVudHMgQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzIHsKLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25DbGllbnRGaWxlIGFwcENsaWVudEZpbGU7Ci0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50IGFwcENsaWVudEREOwotCQotCS8qKgotIAkgKiBBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotIAkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfS8vIEFwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yCi0JCi0JLyoqCi0gCSAqIDxwPkFuc3dlciB0aGUgaWQgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB3aGljaCBpcwotIAkgKiB1c2VkIGJ5IHRoZSByZWNlaXZlci48L3A+Ci0gCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0JCXJldHVybiBBUExJQ0FUSU9OQ0xJRU5UX0NBVEVHT1JZOwotCX0vLyBnZXRCYXNlTmFtZQotCQotCS8qKgotCSAqICBYTUwgVmFsaWRhdG9yIG5vdyBoYW5kbGVzIHZhbGlkYXRpb24gb2YgRGVwbG95bWVudCBEZXNjcmlwdG9yCi0JICogCi0JICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JICB2YWxpZGF0ZU1haW5DbGFzc0luTWFuaWZlc3QoKTsKLQl9Ly8gdmFsaWRhdGUKLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFpbkNsYXNzSW5NYW5pZmVzdCgpIHsKLQotCQlpZiAoYXBwQ2xpZW50RmlsZSAhPSBudWxsICYmIGFwcENsaWVudEZpbGUuZ2V0TWFuaWZlc3QoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWFpbkNsYXNzID0gYXBwQ2xpZW50RmlsZS5nZXRNYW5pZmVzdCgpLmdldE1haW5DbGFzcygpOwotCQkJaWYgKG1haW5DbGFzcyA9PSBudWxsIHx8IG1haW5DbGFzcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJT2JqZWN0IHRhcmdldCA9IGdldE1hbmlmZXN0VGFyZ2V0KCk7Ci0JCQkJYWRkRXJyb3IoZ2V0QmFzZU5hbWUoKSwgQVBQQ0xJRU5UX01BSU5fQ0xBU1NfRVJST1JfLCBuZXcgU3RyaW5nWzBdLCB0YXJnZXQpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE1hbmlmZXN0VGFyZ2V0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogRG9lcyB0aGUgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKQotCSAgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkKLQkJdmFsaWRhdGVJbkpvYihpbkhlbHBlciwgaW5SZXBvcnRlcik7Ci0JfS8vIHZhbGlkYXRlCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmFsaWRhdGUgeG1sIGNvbW1hbmQuCi0JICogCi0JICogQHJldHVybiBDb21tYW5kCi0JICovCQotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZVZhbGlkYXRlWE1MQ29tbWFuZCgpIHsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgVmFsaWRhdGVYbWxDb21tYW5kKGFwcENsaWVudEZpbGUpOwotCQlyZXR1cm4gY21kOwotCX0vLyBjcmVhdGVWYWxpZGF0ZVhNTENvbW1hbmQKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBhcHBDbGllbnRGaWxlLgotCSAqIAotCSAqIEByZXR1cm4gQXBwbGljYXRpb25DbGllbnRGaWxlCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBnZXRBcHBDbGllbnRGaWxlKCkgewotCQlyZXR1cm4gYXBwQ2xpZW50RmlsZTsKLQl9Ly8gZ2V0QXBwQ2xpZW50RmlsZQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXBwQ2xpZW50RmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gQXBwbGljYXRvbkNsaWVudEZpbGUgYXBwQ2xpZW50RmlsZSAtIFRoZSBhcHBDbGllbnRGaWxlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcENsaWVudEZpbGUoQXBwbGljYXRpb25DbGllbnRGaWxlIGFwcENsaWVudEZpbGUpIHsKLQkJdGhpcy5hcHBDbGllbnRGaWxlID0gYXBwQ2xpZW50RmlsZTsKLQl9Ly8gc2V0QXBwQ2xpZW50RmlsZQotCi0JLyoqCi0JICogR2V0cyB0aGUgYXBwQ2xpZW50REQuCi0JICogCi0JICogQHJldHVybiBBcHBsaWNhdGlvbkNsaWVudAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBnZXRBcHBDbGllbnRERCgpIHsKLQkJcmV0dXJuIGFwcENsaWVudEREOwotCX0vLyBnZXRBcHBDbGllbnRERAotCi0JLyoqCi0JICogU2V0cyB0aGUgYXBwQ2xpZW50REQuCi0JICogCi0JICogQHBhcmFtIEFwcGxpY2F0aW9uQ2xpZW50IGFwcENsaWVudEREIC0gVGhlIGFwcENsaWVudEREIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcENsaWVudEREKEFwcGxpY2F0aW9uQ2xpZW50IGFwcENsaWVudEREKSB7Ci0JCXRoaXMuYXBwQ2xpZW50REQgPSBhcHBDbGllbnRERDsKLQl9Ly8gc2V0QXBwQ2xpZW50REQKLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSAKLQkgCQl0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQkJCXN1cGVyLnZhbGlkYXRlSW5Kb2IoaW5IZWxwZXIsIGluUmVwb3J0ZXIpOwotCQkJX3JlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMsIG51bGwpOyAKLQkJCQotCQkJc2V0QXBwQ2xpZW50RmlsZSggKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSkgaW5IZWxwZXIubG9hZE1vZGVsKEFQUENMSUVOVF9NT0RFTF9OQU1FKSApOwotCQkJaWYgKCBhcHBDbGllbnRGaWxlICE9IG51bGwgKSB7Ci0JCQkJc2V0QXBwQ2xpZW50REQoIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSApOwotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9IGVsc2UgewotCQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfQVBQQ0xJRU5UX0lOVkFMSURfQVBQQ0xJRU5UX0ZJTEUpOwotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnKTsKLQkJCX0vLyBpZgotCQl9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBleDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfQVBQQ0xJRU5UX1ZBTElEQVRJT05fRkFJTEVEKTsKLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnLCBlKTsKLQkJfS8vIHRyeSAKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJYXBwQ2xpZW50REQgPSBudWxsOwotCQlhcHBDbGllbnRGaWxlID0gbnVsbDsKLQkJc3VwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JfQkKLX0vLyBBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUEJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QQmVhbkNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2MDdjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCTVBCZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFFbnRpdHlCZWFuQ2xhc3NWUnVsZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5iYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FTlRJVFlCRUFOfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0xPQ0FMX0NPTVBPTkVOVF9JTlRFUkZBQ0UsIFJFTU9URV9DT01QT05FTlRfSU5URVJGQUNFfTsKLQkKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0FCU1RSQUNUID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9GSU5BTCA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfUFVCTElDID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRCA9IGZhbHNlOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117Q09OU1RSVUNUT1JfTk9QQVJNLCBFSkJGSU5EQllQUklNQVJZS0VZLCBTRVRFTlRJVFlDT05URVhULCBVTlNFVEVOVElUWUNPTlRFWFRfTk9QQVJNLCBFSkJBQ1RJVkFURV9OT1BBUk0sIEVKQlBBU1NJVkFURV9OT1BBUk0sIEVKQlJFTU9WRV9OT1BBUk0sIEVKQkxPQURfTk9QQVJNLCBFSkJTVE9SRV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0ZJTkFMSVpFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIENPTlNUUlVDVE9SX05PUEFSTSwgQ09OU1RSVUNUT1IsIEVKQkNSRUFURSwgRUpCUE9TVENSRUFURSwgRUpCSE9NRSwgRklOQUxJWkVfTk9QQVJNLCBFSkJGSU5EQllQUklNQVJZS0VZLCBFSkJGSU5ELCBTRVRFTlRJVFlDT05URVhULCBVTlNFVEVOVElUWUNPTlRFWFRfTk9QQVJNLCBFSkJBQ1RJVkFURV9OT1BBUk0sIEVKQlBBU1NJVkFURV9OT1BBUk0sIEVKQlJFTU9WRV9OT1BBUk0sIEVKQkxPQURfTk9QQVJNLCBFSkJTVE9SRV9OT1BBUk0sIEZJTkFMSVpFX05PUEFSTSwgQlVTSU5FU1N9OwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIyLCBuZXcgU3RyaW5nW117Q0hLSjIwMjIrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkNyZWF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXksIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJGaW5kQnlQcmltYXJ5S2V5K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfc2V0RW50aXR5Q29udGV4dCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX3NldEVudGl0eUNvbnRleHQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF91bnNldEVudGl0eUNvbnRleHQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF91bnNldEVudGl0eUNvbnRleHQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJBY3RpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkFjdGl2YXRlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUGFzc2l2YXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUGFzc2l2YXRlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUmVtb3ZlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiTG9hZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkxvYWQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJTdG9yZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlN0b3JlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiU2VsZWN0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiU2VsZWN0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkZpbmQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUG9zdENyZWF0ZStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjEwMytTUEVDfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNywgbmV3IFN0cmluZ1tde0NIS0oyNDA3K0JFWFQsIENIS0oyNDA3K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMStCRVhULCBDSEtKMjQyMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMiwgbmV3IFN0cmluZ1tde0NIS0oyNDIyK0JFWFQsIENIS0oyNDIyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIzLCBuZXcgU3RyaW5nW117Q0hLSjI0MjMrQkVYVCwgQ0hLSjI0MjMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjQsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNCtCRVhULCBDSEtKMjQyNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNiwgbmV3IFN0cmluZ1tde0NIS0oyNDI2K0JFWFQsIENIS0oyNDI2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI3LCBuZXcgU3RyaW5nW117Q0hLSjI0MjcrQkVYVCwgQ0hLSjI0MjcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQyOCtCRVhULCBDSEtKMjQyOCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMwLCBuZXcgU3RyaW5nW117Q0hLSjI0MzArQkVYVCwgQ0hLSjI0MzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMStCRVhULCBDSEtKMjQzMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzOSwgbmV3IFN0cmluZ1tde0NIS0oyNDM5K0JFWFQsIENIS0oyNDM5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MStCRVhULCBDSEtKMjQ0MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MiwgbmV3IFN0cmluZ1tde0NIS0oyNDQyK0JFWFQsIENIS0oyNDQyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQzLCBuZXcgU3RyaW5nW117Q0hLSjI0NDMrQkVYVCwgQ0hLSjI0NDMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NiwgbmV3IFN0cmluZ1tde0NIS0oyNDU2K09OX0JBU0UsIENIS0oyNDU2K09OX1RISVN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NytCRVhULCBDSEtKMjQ1NytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1OCwgbmV3IFN0cmluZ1tde0NIS0oyNDU4K0JFWFQsIENIS0oyNDU4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU5LCBuZXcgU3RyaW5nW117Q0hLSjI0NTkrQkVYVCwgQ0hLSjI0NTkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OCwgbmV3IFN0cmluZ1tde0NIS0oyNDc4K0JFWFQsIENIS0oyNDc4K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5MitCRVhULCBDSEtKMjQ5MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MywgbmV3IFN0cmluZ1tde0NIS0oyNDkzK0JFWFQsIENIS0oyNDkzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDk0LCBuZXcgU3RyaW5nW117Q0hLSjI0OTQrQkVYVCwgQ0hLSjI0OTQrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2J1c2luZXNzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMl9maW5hbGl6ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2ZpbmFsaXplK0JFWFQsIENIS0oyNTAyX2ZpbmFsaXplK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDNfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNTAzX2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiSG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYkhvbWUrQkVYVCwgQ0hLSjI1MDNfZWpiSG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiRmluZCtCRVhULCBDSEtKMjUwM19lamJGaW5kK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDVfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDVfZWpiUmVtb3ZlK0JFWFQsIENIS0oyNTA1X2VqYlJlbW92ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDVfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjUwNV9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZFZhbGlkYXRlVHJhbnNpZW50RmllbGQoKSB7Ci0JCXJldHVybiBTSE9VTERfVkFMSURBVEVfVFJBTlNJRU5UX0ZJRUxEOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVBYnN0cmFjdChKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9BQlNUUkFDVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVGaW5hbChKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9GSU5BTDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVQdWJsaWMoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfUFVCTElDOwotCX0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gTkVJVEhFUjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgQUJlYW5DbGFzc1ZSdWxlI2ZvbGxvd0VqYkNyZWF0ZVJldHVyblR5cGVSdWxlcyhNZXRob2QpCi0JICovCi0JcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJSmF2YUhlbHBlcnMgcmV0VHlwZSA9IGdldEVqYkNyZWF0ZVJldHVyblR5cGUoYmVhbiwgbWV0aG9kKTsKLQkJaWYocmV0VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1BSSU1BUllfS0VZOwotCQl9Ci0JCXJldHVybiByZXRUeXBlLmdldEphdmFOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCRklORCkgPT0gRUpCRklORCkgewotCQkJdmFsaWRhdGVFamJGaW5kTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQkhPTUUpID09IEVKQkhPTUUpIHsKLQkJCXZhbGlkYXRlRWpiSG9tZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJSRU1PVkVfTk9QQVJNKSA9PSBFSkJSRU1PVkVfTk9QQVJNKSB7Ci0JCQl2YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEJVU0lORVNTKSA9PSBCVVNJTkVTUykgewotCQkJdmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTWV0aG9kIGlzbid0IHN1cHBvc2VkIHRvIGJlIGhlcmUuIExldCB0aGUgdmFsaWRhdGVNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QKLQkJCS8vIHRha2UgY2FyZSBvZiBpdC4KLQkJfQotCX0KLQkKLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiQ3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQkZJTkQpID09IEVKQkZJTkQpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0VqYkZpbmRNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJIT01FKSA9PSBFSkJIT01FKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJIb21lTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0J1c2luZXNzTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLgotCQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlRWpiRmluZE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gIyBlamJGaW5kIG1ldGhvZHMKLQkJLy8gSVdBRDQ1MDIgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCBvbiB0aGlzIGNsYXNzLiBSZWFkIHNlY3Rpb24gMTAuNS41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0NTA3ID0gVGhlIGNvbnRhaW5lciBwcm92aWRlcyB0aGUgZWpiRmluZCBtZXRob2QgaW1wbGVtZW50YXRpb24uIFJlYWQgc2VjdGlvbiAxMC42LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gY292ZXJlZCBieSB0aGUgIm11c3Qgbm90IGV4aXN0IiBjb2RlPwotCQkKLQkJLy8gSVdBRDQzMDUgPSBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gUmVhZCBzZWN0aW9uIDEyLjIuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJCi0JCS8vIElXQUQ0MzA2ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIFJlYWQgc2VjdGlvbiAxMi4yLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDU4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDMwNyA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gUmVhZCBzZWN0aW9uIDEyLjIuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZihtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDU5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDMwOCA9IHswfSBtdXN0IGJlIGEgbGVnYWwgdHlwZSBmb3IgUk1JLUlJT1AuIFJlYWQgc2VjdGlvbiAxMi4yLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJdmFsaWRhdGVSTUlfSUlPUFR5cGVSdWxlcyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIGZhbHNlKTsgLy8gZG8gbm90IGNoZWNrIGlmIHRoZSByZXR1cm4gdHlwZSBpcyBzZXJpYWxpemFibGUKLQkJCi0JCS8vIElXQUQ0MzA5ID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiBSZWFkIHNlY3Rpb24gMTIuMi41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MzEyID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9LiBSZWFkIHNlY3Rpb24gMTIuMi41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCUphdmFIZWxwZXJzIHJldFR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKLQkJSmF2YUhlbHBlcnMga2V5ID0gKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCQlpZighKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tRW51bWVyYXRpb24ocmV0VHlwZSwgYmVhbikgfHwKLQkJCSAgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb21Db2xsZWN0aW9uKHJldFR5cGUsIGJlYW4pIHx8Ci0JCQkgIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldFR5cGUsIGtleSkKLQkJICAgKSkgewotCQkgICAJU3RyaW5nIGtleU5hbWUgPSAoa2V5ID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1BSSU1BUllfS0VZIDoga2V5LmdldEphdmFOYW1lKCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2tleU5hbWV9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZm9sbG93c09iamVjdE5vdEZvdW5kRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJLy8gSVdBRDQyODUgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZheC5lamIuT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMi4xLjguNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQxNjggPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEwLjUuOC40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0MzEwID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTIuMi41LCAxOC4zLjgsIDE4LjYgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIWZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJGaW5kLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUEtleUNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBLZXlDbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTFhOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUEtleUNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQk1QS2V5Q2xhc3NWUnVsZSBleHRlbmRzIEFLZXlDbGFzc1ZSdWxlIGltcGxlbWVudHMgSUVKQlR5cGUsIElSZW1vdGVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIua2IiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117SEFTSENPREVfTk9QQVJNLCBFUVVBTFN9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIEhBU0hDT0RFX05PUEFSTSwgRVFVQUxTLCBDT05TVFJVQ1RPUiwgQ09OU1RSVUNUT1JfTk9QQVJNfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jb25zdHIsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jb25zdHIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9oYXNoQ29kZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2hhc2hDb2RlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZXF1YWxzLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZXF1YWxzK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxOSwgbmV3IFN0cmluZ1tde0NIS0oyMDE5K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJLy8gS2V5IG1ldGhvZHMgYXJlIG5vdCBjaGVja2VkIGZvciBSZW1vdGVFeGNlcHRpb24sIGJ1dCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIFZSdWxlcy4uLgotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gKChFbnRpdHkpcGFyZW50KS5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJQ2xhc3NWUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEVudGVycHJpc2VCZWFuLCBKYXZhQ2xhc3MsIE1ldGhvZCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBwYXJlbnQsIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gRG8gbm90IHBlcmZvcm0gYW55IHZhbGlkYXRpb24gb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyAob3RoZXIgdGhhbiB0aGUKLQkJLy8gdmFsaWRhdGlvbiBwZXJmb3JtZWQgaW4gQUtleUNsYXNzVlJ1bGUncyBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBoYXNoQ29kZSgpCi0JCS8vIGFuZCBlcXVhbHMoT2JqZWN0KQotCX0KLQotCS8qCi0JICogQHNlZSBJQ2xhc3NWUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIEVudGVycHJpc2VCZWFuLCBKYXZhQ2xhc3MsIEZpZWxkKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIERvIG5vdCBwZXJmb3JtIGFueSB2YWxpZGF0aW9uIG9uIHRoZSBmaWVsZHMgb2YgdGhlIEJNUCBrZXkgY2xhc3MKLQkJbG9uZyBmaWVsZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRGaWVsZFR5cGVJZChiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQlpZigoZmllbGRUeXBlICYgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlNFUklBTFZFUlNJT05VSUQpID09IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlEKSB7Ci0JCQl2YWxpZGF0ZVNlcmlhbFZlcnNpb25VSUQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUExvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhZjA1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQk1QTG9jYWxDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlLCBJTG9jYWxUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmJsYyI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1R9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklUfTsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JIAotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjZ2V0RGVwZW5kc09uKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNnZXRNZXNzYWdlSWRzKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUExvY2FsSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyNDE5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJNUExvY2FsSG9tZVZSdWxlIGV4dGVuZHMgQUJNUEhvbWVWUnVsZSBpbXBsZW1lbnRzIElMb2NhbFR5cGUsIElFSkJUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTEhPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXSB7IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1MgfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5ibGgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXSB7IEpBVkFYX0VKQl9FSkJMT0NBTEhPTUUgfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXSB7IEZJTkRCWVBSSU1BUllLRVksIEZJTkQgfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW10ge0NMSU5JVCwgQ1JFQVRFLCBGSU5EQllQUklNQVJZS0VZLCBGSU5ELCBIT01FIH07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW10ge0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5LCBuZXcgU3RyaW5nW10ge0NIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXkrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZmluZCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0MDIrQkVYVCwgQ0hLSjI0MDIrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAzLCBuZXcgU3RyaW5nW10geyBDSEtKMjQwMytCRVhULCBDSEtKMjQwMytNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjIsIG5ldyBTdHJpbmdbXSB7IENIS0oyNDYyK0JFWFQsIENIS0oyNDYyK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MywgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0NjMrQkVYVCwgQ0hLSjI0NjMrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY0LCBuZXcgU3RyaW5nW10geyBDSEtKMjQ2NCtCRVhULCBDSEtKMjQ2NCtNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXSB7IENIS0oyNDY1K0JFWFQsIENIS0oyNDY1K01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW10geyBDSEtKMjQ2NytCRVhULCBDSEtKMjQ2NytNRVhUIH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NSwgbmV3IFN0cmluZ1tde0NIS0oyNDc1K0JFWFQsIENIS0oyNDc1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc3LCBuZXcgU3RyaW5nW10geyBDSEtKMjQ3NytCRVhULCBDSEtKMjQ3NytNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OCtCRVhULCBDSEtKMjQ3OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OSwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0NzkrQkVYVCwgQ0hLSjI0NzkrTUVYVCB9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZmluZCtCRVhULCBDSEtKMjUwMF9maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW10geyBDSEtKMjUwM19jcmVhdGUrQkVYVCwgQ0hLSjI1MDNfY3JlYXRlK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19maW5kLCBuZXcgU3RyaW5nW10geyBDSEtKMjUwM19maW5kK0JFWFQsIENIS0oyNTAzX2ZpbmQrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2hvbWUsIG5ldyBTdHJpbmdbXSB7IENIS0oyNTAzX2hvbWUrQkVYVCwgQ0hLSjI1MDNfaG9tZStNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfY3JlYXRlLCBuZXcgU3RyaW5nW10geyBDSEtKMjUwNF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDRfY3JlYXRlK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9maW5kLCBuZXcgU3RyaW5nW10geyBDSEtKMjUwNF9maW5kK0JFWFQsIENIS0oyNTA0X2ZpbmQrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2hvbWUsIG5ldyBTdHJpbmdbXSB7IENIS0oyNTA0X2hvbWUrQkVYVCwgQ0hLSjI1MDRfaG9tZStNRVhUIH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY3MTY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQk1QUmVtb3RlQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBQ29tcG9uZW50VlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUNvbXBvbmVudFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX1JFTU9URTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuYnJjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQk9CSkVDVH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde307Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVH07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfYnVzaW5lc3MsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9idXNpbmVzcytCRVhULCBDSEtKMjUwMF9idXNpbmVzcytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUFJlbW90ZUhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUFJlbW90ZUhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTMzOTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJNUFJlbW90ZUhvbWVWUnVsZSBleHRlbmRzIEFCTVBIb21lVlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUhvbWVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmJyaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJIT01FfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117RklOREJZUFJJTUFSWUtFWSwgRklORH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ1JFQVRFLCBGSU5EQllQUklNQVJZS0VZLCBGSU5ELCBIT01FfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZmluZEJ5UHJpbWFyeUtleStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9maW5kK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAyLCBuZXcgU3RyaW5nW117Q0hLSjI0MDIrQkVYVCwgQ0hLSjI0MDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMytCRVhULCBDSEtKMjQwMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MStCRVhULCBDSEtKMjQ2MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MiwgbmV3IFN0cmluZ1tde0NIS0oyNDYyK0JFWFQsIENIS0oyNDYyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYzLCBuZXcgU3RyaW5nW117Q0hLSjI0NjMrQkVYVCwgQ0hLSjI0NjMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NCtCRVhULCBDSEtKMjQ2NCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NSwgbmV3IFN0cmluZ1tde0NIS0oyNDY1K0JFWFQsIENIS0oyNDY1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY2LCBuZXcgU3RyaW5nW117Q0hLSjI0NjYrQkVYVCwgQ0hLSjI0NjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NytCRVhULCBDSEtKMjQ2NytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc1LCBuZXcgU3RyaW5nW117Q0hLSjI0NzUrQkVYVCwgQ0hLSjI0NzUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NytCRVhULCBDSEtKMjQ3NytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OCwgbmV3IFN0cmluZ1tde0NIS0oyNDc4K0JFWFQsIENIS0oyNDc4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc5LCBuZXcgU3RyaW5nW117Q0hLSjI0NzkrQkVYVCwgQ0hLSjI0NzkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9maW5kK0JFWFQsIENIS0oyNTAwX2ZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2hvbWUrQkVYVCwgQ0hLSjI1MDBfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19jcmVhdGUrQkVYVCwgQ0hLSjI1MDNfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19maW5kK0JFWFQsIENIS0oyNTAzX2ZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2hvbWUrQkVYVCwgQ0hLSjI1MDNfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDRfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9maW5kK0JFWFQsIENIS0oyNTA0X2ZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2hvbWUrQkVYVCwgQ0hLSjI1MDRfaG9tZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBCZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEJlYW5DbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5N2FlMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5Mb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENNUEJlYW5DbGFzc1ZSdWxlIGV4dGVuZHMgQUVudGl0eUJlYW5DbGFzc1ZSdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9LRVlDTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmNiIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VOVElUWUJFQU59OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG5ldyBsb25nW117TE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRSwgUkVNT1RFX0NPTVBPTkVOVF9JTlRFUkZBQ0V9OwotCQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfQUJTVFJBQ1QgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfRklOQUwgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX1BVQkxJQyA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0NPTlNUUlVDVE9SX05PUEFSTSwgU0VURU5USVRZQ09OVEVYVCwgVU5TRVRFTlRJVFlDT05URVhUX05PUEFSTSwgRUpCQUNUSVZBVEVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJMT0FEX05PUEFSTSwgRUpCU1RPUkVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXtFSkJGSU5ELCBGSU5BTElaRV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJDUkVBVEUsIEVKQlBPU1RDUkVBVEUsIEVKQkhPTUUsIEZJTkFMSVpFX05PUEFSTSwgRUpCRklORCwgQUNDRVNTT1IsIEVKQkZJTkRCWVBSSU1BUllLRVksIFNFVEVOVElUWUNPTlRFWFQsIFVOU0VURU5USVRZQ09OVEVYVF9OT1BBUk0sIEVKQkFDVElWQVRFX05PUEFSTSwgRUpCUEFTU0lWQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTSwgRUpCTE9BRF9OT1BBUk0sIEVKQlNUT1JFX05PUEFSTSwgRUpCU0VMRUNULCBGSU5BTElaRV9OT1BBUk0sIEJVU0lORVNTfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCS8vIEFkZCB0aGVzZSBjaGVja3MgaW4gdGhlIGNvZGUgbGF0ZXIKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDgxLCBuZXcgU3RyaW5nW117Q0hLSjI0ODErQkVYVCwgQ0hLSjI0ODErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ4MitCRVhULCBDSEtKMjQ4MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4MywgbmV3IFN0cmluZ1tde0NIS0oyNDgzK0JFWFQsIENIS0oyNDgzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDg0LCBuZXcgU3RyaW5nW117Q0hLSjI0ODQrQkVYVCwgQ0hLSjI0ODQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODksIG5ldyBTdHJpbmdbXXtDSEtKMjQ4OStCRVhULCBDSEtKMjQ4OStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNSwgbmV3IFN0cmluZ1tde0NIS0oyMjA1K0JFWFQsIENIS0oyMjA1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjA2LCBuZXcgU3RyaW5nW117Q0hLSjIyMDYrQkVYVCwgQ0hLSjIyMDYrTUVYVH0pOwotCQkvLyBlbmQgYWRkIGxhdGVyCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE0LCBuZXcgU3RyaW5nW117Q0hLSjIwMTQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNSwgbmV3IFN0cmluZ1tde0NIS0oyMDE1K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfYWNjLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfYWNjK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY29uc3RyLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY29uc3RyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiQ3JlYXRlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiRmluZEJ5UHJpbWFyeUtleSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXkrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfc2V0RW50aXR5Q29udGV4dCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkFjdGl2YXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiQWN0aXZhdGUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJQYXNzaXZhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJQYXNzaXZhdGUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJSZW1vdmUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJMb2FkLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiTG9hZCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlN0b3JlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiU3RvcmUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJTZWxlY3QsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJTZWxlY3QrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiRmluZCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJQb3N0Q3JlYXRlK0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTAzLCBuZXcgU3RyaW5nW117Q0hLSjIxMDMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDExLCBuZXcgU3RyaW5nW117Q0hLSjI0MTErQkVYVCwgQ0hLSjI0MTErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIxLCBuZXcgU3RyaW5nW117Q0hLSjI0MjErQkVYVCwgQ0hLSjI0MjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjIsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMitCRVhULCBDSEtKMjQyMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMywgbmV3IFN0cmluZ1tde0NIS0oyNDIzK0JFWFQsIENIS0oyNDIzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI0LCBuZXcgU3RyaW5nW117Q0hLSjI0MjQrQkVYVCwgQ0hLSjI0MjQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNitCRVhULCBDSEtKMjQyNitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNywgbmV3IFN0cmluZ1tde0NIS0oyNDI3K0JFWFQsIENIS0oyNDI3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI4LCBuZXcgU3RyaW5nW117Q0hLSjI0MjgrQkVYVCwgQ0hLSjI0MjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzAsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMCtCRVhULCBDSEtKMjQzMCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMSwgbmV3IFN0cmluZ1tde0NIS0oyNDMxK0JFWFQsIENIS0oyNDMxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDM5LCBuZXcgU3RyaW5nW117Q0hLSjI0MzkrQkVYVCwgQ0hLSjI0MzkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MSwgbmV3IFN0cmluZ1tde0NIS0oyNDQxK0JFWFQsIENIS0oyNDQxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQyLCBuZXcgU3RyaW5nW117Q0hLSjI0NDIrQkVYVCwgQ0hLSjI0NDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MytCRVhULCBDSEtKMjQ0MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0OSwgbmV3IFN0cmluZ1tde0NIS0oyNDQ5K0JFWFQsIENIS0oyNDQ5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTAsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1MCtCRVhULCBDSEtKMjQ1MCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NCwgbmV3IFN0cmluZ1tde0NIS0oyNDU0K0JFWFQsIENIS0oyNDU0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU2LCBuZXcgU3RyaW5nW117Q0hLSjI0NTYrT05fQkFTRSwgQ0hLSjI0NTYrT05fVEhJU30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc4LCBuZXcgU3RyaW5nW117Q0hLSjI0NzgrQkVYVCwgQ0hLSjI0NzgrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4MCwgbmV3IFN0cmluZ1tde0NIS0oyNDgwK0JFWFQsIENIS0oyNDgwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDg1LCBuZXcgU3RyaW5nW117Q0hLSjI0ODUrQkVYVCwgQ0hLSjI0ODUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ4NitCRVhULCBDSEtKMjQ4NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4NywgbmV3IFN0cmluZ1tde0NIS0oyNDg3K0JFWFQsIENIS0oyNDg3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDg4LCBuZXcgU3RyaW5nW117Q0hLSjI0ODgrQkVYVCwgQ0hLSjI0ODgrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MiwgbmV3IFN0cmluZ1tde0NIS0oyNDkyK0JFWFQsIENIS0oyNDkyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkzLCBuZXcgU3RyaW5nW117Q0hLSjI0OTMrQkVYVCwgQ0hLSjI0OTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NCtCRVhULCBDSEtKMjQ5NCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5NiwgbmV3IFN0cmluZ1tde0NIS0oyNDk2K0JFWFQsIENIS0oyNDk2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDk3LCBuZXcgU3RyaW5nW117Q0hLSjI0OTcrQkVYVCwgQ0hLSjI0OTcrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2J1c2luZXNzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9lamJIb21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiSG9tZStCRVhULCBDSEtKMjUwMF9lamJIb21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2ZpbmFsaXplLCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZmluYWxpemUrQkVYVCwgQ0hLSjI1MDJfZmluYWxpemUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDJfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2VqYkZpbmQrQkVYVCwgQ0hLSjI1MDJfZWpiRmluZCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAzX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjUwM19lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkhvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19lamJIb21lK0JFWFQsIENIS0oyNTAzX2VqYkhvbWUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDVfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjUwNV9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA1X2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA1X2VqYlJlbW92ZStCRVhULCBDSEtKMjUwNV9lamJSZW1vdmUrTUVYVH0pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewotCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVBYnN0cmFjdChKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9BQlNUUkFDVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVGaW5hbChKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9GSU5BTDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVQdWJsaWMoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfUFVCTElDOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBORUlUSEVSOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBKYXZhSGVscGVycyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkudXNlc1Vua25vd25QcmltYXJ5S2V5KGNtcCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBjbXApOwotCQkJfQotCQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBwcm9ibGVtcy4uLi4KLQkJCQkvLyBsZXQgdGhpcyBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgKGdldFByaW1hcnlLZXkoKSkKLQkJCX0KLQkJfQotCQlyZXR1cm4gKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJSmF2YUhlbHBlcnMgcmV0VHlwZSA9IGdldEVqYkNyZWF0ZVJldHVyblR5cGUoYmVhbiwgbWV0aG9kKTsKLQkJaWYocmV0VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1BSSU1BUllfS0VZOwotCQl9Ci0JCXJldHVybiByZXRUeXBlLmdldEphdmFOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6KTsKLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJCi0JCS8vIDEwLjMuMSwgY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVudCBmaWVsZHMgYW5kIGNvbnRhaW5lci1tYW5hZ2VkIHJlbGF0aW9uc2hpcCAKLQkJLy8gZmllbGRzIG11c3QgKm5vdCogYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuIAotCQlMaXN0IGNtckZpZWxkcyA9IGNtcC5nZXRDTVJGaWVsZHMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjbXJGaWVsZHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDTVJGaWVsZCBjbXJGaWVsZCA9IChDTVJGaWVsZClpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZigoY21yRmllbGQgIT0gbnVsbCkgJiYgKCFjbXJGaWVsZC5pc0Rlcml2ZWQoKSkpIHsKLQkJCQl2YWxpZGF0ZUNtckZpZWxkKHZjLCBjbXAsIGNsYXp6LCBjbXJGaWVsZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUxvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyIGZpbHRlciA9IExvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLnNpbmdsZXRvbigpOwotCQlmaWx0ZXIuZW5hYmxlQ2FjaGUodHJ1ZSk7Ci0JCUxpc3QgY21wRmllbGRzID0gY21wLmdldEZpbHRlcmVkRmVhdHVyZXMoZmlsdGVyKTsKLQkJaWYoY21wRmllbGRzICE9IG51bGwgJiYgIWNtcEZpZWxkcy5pc0VtcHR5KCkpIHsKLQkJaXRlcmF0b3IgPSBjbXBGaWVsZHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDTVBBdHRyaWJ1dGUgY21wRmllbGQgPSAoQ01QQXR0cmlidXRlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKChjbXBGaWVsZCAhPSBudWxsKSAmJiAoIWNtcEZpZWxkLmlzRGVyaXZlZCgpKSkgewotCQkJCXZhbGlkYXRlQ21wRmllbGQodmMsIGNtcCwgY2xhenosIGNtcEZpZWxkKTsKLQkJCX0KLQkJICB9Ci0JCX0KLQkJZmlsdGVyLmNsZWFyQ2FjaGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQkKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NDcmVhdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDk3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlRWpiU2VsZWN0TWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHBhcmVudCwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vICMgZWpiU2VsZWN0PE1FVEhPRD4gY2hlY2tzCi0JCS8vIElXQUQ0MTU0ID0gezB9IG11c3QgZXhpc3QuIFJlYWQgc2VjdGlvbiAxMC41LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQ1MDIgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCBvbiB0aGlzIGNsYXNzLiBSZWFkIHNlY3Rpb24gMTAuNS41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MTk3ID0gQW4gZWpiU2VsZWN0IG1ldGhvZCBtdXN0IGV4aXN0LiBSZWFkIHNlY3Rpb24gMTAuNi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQotCQlKYXZhSGVscGVycyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxDb2xsZWN0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OLCBiZWFuKTsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldHVyblR5cGUsIGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSkgJiYKLQkJCSFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXR1cm5UeXBlLCBqYXZhVXRpbENvbGxlY3Rpb24pICkgewotCQkJLy8gSVdBRDQxNjAgPSBUeXBlIHswfSBjYW5ub3QgYmUgcmV0dXJuZWQgYnkgYSBzZWxlY3QgbWV0aG9kLiBSZWFkIHNlY3Rpb24gMTAuNS43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0ODYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJlbnQsIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCS8vIElXQUQ0MTk4ID0gVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIFJlYWQgc2VjdGlvbiAxMC42Ljcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ4NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcmVudCwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFtZXRob2QuaXNBYnN0cmFjdCgpKSB7Ci0JCQkvLyBJV0FENDE5OSA9IFRoaXMgbWV0aG9kIG11c3QgYmUgYWJzdHJhY3QuIFJlYWQgc2VjdGlvbiAxMC42Ljcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MTU4ID0gezB9IG11c3QgYmUgYWJzdHJhY3QuIFJlYWQgc2VjdGlvbiAxMC41Ljcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ4NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcmVudCwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzRmluZGVyRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCkpIHsKLQkJCS8vIElXQUQ0MjAwID0gVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTAuNi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0ODgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJlbnQsIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmZvbGxvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCS8vIElXQUQ0Mjg1ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YXguZWpiLk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTIuMS44LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MTY4ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMC41LjguNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFyZW50LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gQ2hlY2sgbWV0aG9kIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwuCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc29jaWF0ZWRXaXRoUXVlcnkoY21wLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0OTYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJlbnQsIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbXBGaWVsZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBKYXZhQ2xhc3MgY2xhenosIENNUEF0dHJpYnV0ZSBhdHRyaWIpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgZmllbGROYW1lID0gYXR0cmliLmdldE5hbWUoKTsKLQkJaWYoKGZpZWxkTmFtZSA9PSBudWxsKSB8fCAoZmllbGROYW1lLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGxldCB0aGUgRUpCSmFyVlJ1bGUgcmVwb3J0IHRoaXMKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoIUNoYXJhY3Rlci5pc0xvd2VyQ2FzZShmaWVsZE5hbWUuY2hhckF0KDApKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDgwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgY21wLCBjbGF6eiwgYXR0cmliLmdldEZpZWxkKCksIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gU2VjdGlvbiAxMC44LjMKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1Vua25vd25QcmltYXJ5S2V5KGF0dHJpYikpIHsKLQkJCUphdmFDbGFzcyBlamJDbGFzcyA9IGNtcC5nZXRFamJDbGFzcygpOwotCQkJTWV0aG9kIGdldE1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChlamJDbGFzcywgYXR0cmliLmdldEdldHRlck5hbWUoKSwgbmV3IEphdmFIZWxwZXJzWzBdLCBhdHRyaWIuZ2V0VHlwZSgpKTsKLQkJCWlmKGdldE1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2FjYywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBjbXAsIGNsYXp6LCBuZXcgU3RyaW5nW117YXR0cmliLmdldEdldHRlck5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2YWxpZGF0ZUNNUEFjY2Vzc29yTWV0aG9kKHZjLCBjbXAsIGNsYXp6LCBnZXRNZXRob2QsIGF0dHJpYik7Ci0JCQl9Ci0JCQkKLQkJCUphdmFIZWxwZXJzW10gc2V0TWV0aG9kUGFybXMgPSBuZXcgSmF2YUhlbHBlcnNbXXthdHRyaWIuZ2V0VHlwZSgpfTsKLQkJCU1ldGhvZCBzZXRNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoZWpiQ2xhc3MsIGF0dHJpYi5nZXRTZXR0ZXJOYW1lKCksIHNldE1ldGhvZFBhcm1zKTsKLQkJCWlmKHNldE1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIHNldHRlck5hbWUgPSBhdHRyaWIuZ2V0U2V0dGVyTmFtZSgpICsgIigiICsgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFBhcm1zQXNTdHJpbmcoc2V0TWV0aG9kUGFybXMpICsgIikiOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2FjYywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBjbXAsIGNsYXp6LCBuZXcgU3RyaW5nW117c2V0dGVyTmFtZX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2YWxpZGF0ZUNNUEFjY2Vzc29yTWV0aG9kKHZjLCBjbXAsIGNsYXp6LCBzZXRNZXRob2QsIGF0dHJpYik7Ci0JCQl9Ci0JCX0KLQotCQlGaWVsZCBmaWVsZCA9IGF0dHJpYi5nZXRGaWVsZCgpOwotCQlpZiAoKGZpZWxkICE9IG51bGwpICYmIChjbGF6ei5nZXRGaWVsZEV4dGVuZGVkKGF0dHJpYi5nZXROYW1lKCkpICE9IG51bGwpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBjbXAsIGNsYXp6LCBmaWVsZCwgbmV3IFN0cmluZ1tde2F0dHJpYi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNtckZpZWxkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAsIEphdmFDbGFzcyBjbGF6eiwgQ01SRmllbGQgY21yRmllbGQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgZmllbGROYW1lID0gY21yRmllbGQuZ2V0TmFtZSgpOwotCQlpZigoZmllbGROYW1lID09IG51bGwpIHx8IChmaWVsZE5hbWUuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gbGV0IHRoZSBFSkJKYXJWUnVsZSByZXBvcnQgdGhpcwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZighQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGZpZWxkTmFtZS5jaGFyQXQoMCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0ODAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBjbXAsIGNsYXp6LCBjbXJGaWVsZC5nZXRGaWVsZCgpLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBlamJDbGFzcyA9IGNtcC5nZXRFamJDbGFzcygpOwotCQlKYXZhSGVscGVycyBsb2NhbFR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Q01SRmllbGRUeXBlKHZjLCBjbXAsIGNsYXp6LCBjbXJGaWVsZCk7Ci0JCWlmKGxvY2FsVHlwZSA9PSBudWxsKSB7Ci0JCQkvLyB1c2VyIG1hZGUgYSBtaXN0YWtlIGluIGVqYi1qYXIueG1sIGJ5IHRyeWluZyB0byBjcmVhdGUgYSByZWxhdGlvbgotCQkJLy8gdG8gYSBDTVAgd2hpY2ggZG9lc24ndCBoYXZlIGEgbG9jYWwgaW50ZXJmYWNlLgotCQkJLy8gRG9uJ3QgcmVwb3J0IGFuIGVycm9yIGhlcmU7IGxldCB0aGUgREQgdmFsaWRhdGlvbiByZXBvcnQgdGhlIGVycm9yLgotCQkJcmV0dXJuOwotCQl9Ci0JCU1ldGhvZCBnZXRNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoZWpiQ2xhc3MsIGNtckZpZWxkLmdldEdldHRlck5hbWUoKSwgbmV3IEphdmFIZWxwZXJzWzBdLCBsb2NhbFR5cGUpOwotCQlpZihnZXRNZXRob2QgPT0gbnVsbCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2FjYywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBjbXAsIGNsYXp6LCBuZXcgU3RyaW5nW117Y21yRmllbGQuZ2V0R2V0dGVyTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsaWRhdGVDTVJBY2Nlc3Nvck1ldGhvZCh2YywgY21wLCBjbGF6eiwgZ2V0TWV0aG9kLCBjbXJGaWVsZCk7Ci0JCX0KLQkJCi0JCUphdmFIZWxwZXJzW10gc2V0TWV0aG9kUGFybXMgPSBuZXcgSmF2YUhlbHBlcnNbXXtsb2NhbFR5cGV9OwotCQlNZXRob2Qgc2V0TWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGVqYkNsYXNzLCBjbXJGaWVsZC5nZXRTZXR0ZXJOYW1lKCksIHNldE1ldGhvZFBhcm1zKTsKLQkJaWYoc2V0TWV0aG9kID09IG51bGwpIHsKLQkJCVN0cmluZyBzZXR0ZXJOYW1lID0gY21yRmllbGQuZ2V0U2V0dGVyTmFtZSgpICsgIigiICsgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFBhcm1zQXNTdHJpbmcoc2V0TWV0aG9kUGFybXMpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9hY2MsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgY21wLCBjbGF6eiwgbmV3IFN0cmluZ1tde3NldHRlck5hbWV9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZGF0ZUNNUkFjY2Vzc29yTWV0aG9kKHZjLCBjbXAsIGNsYXp6LCBzZXRNZXRob2QsIGNtckZpZWxkKTsKLQkJfQotCQkKLQkJRmllbGQgZmllbGQgPSBjbXJGaWVsZC5nZXRGaWVsZCgpOwotCQlpZiAoKGZpZWxkICE9IG51bGwpICYmIChjbGF6ei5nZXRGaWVsZEV4dGVuZGVkKGNtckZpZWxkLmdldE5hbWUoKSkgIT0gbnVsbCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGNtcCwgY2xhenosIGZpZWxkLCBuZXcgU3RyaW5nW117Y21yRmllbGQuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ01SQWNjZXNzb3JNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIENNUkZpZWxkIGZpZWxkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCQkgCi0JCWlmKCFtZXRob2QuaXNBYnN0cmFjdCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDTVBBY2Nlc3Nvck1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgQ01QQXR0cmlidXRlIGZpZWxkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCQkgCi0JCWlmKCFtZXRob2QuaXNBYnN0cmFjdCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJIT01FKSA9PSBFSkJIT01FKSB7Ci0JCQl2YWxpZGF0ZUVqYkhvbWVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJdmFsaWRhdGVFamJSZW1vdmVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBBQ0NFU1NPUikgPT0gQUNDRVNTT1IpIHsKLQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgaW4gdGhlIHZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eikgbWV0aG9kCi0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEJVU0lORVNTKSA9PSBCVVNJTkVTUykgewotCQkJdmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTWV0aG9kIGlzbid0IHN1cHBvc2VkIHRvIGJlIGhlcmUuIExldCB0aGUgdmFsaWRhdGVNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QKLQkJCS8vIHRha2UgY2FyZSBvZiBpdC4KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdIb21lTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiQ3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQkhPTUUpID09IEVKQkhPTUUpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0VqYkhvbWVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJSRU1PVkVfTk9QQVJNKSA9PSBFSkJSRU1PVkVfTk9QQVJNKSB7Ci0JCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEFDQ0VTU09SKSA9PSBBQ0NFU1NPUikgewotCQkJLy8gVGhpcyBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBpbiB0aGUgdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6KSBtZXRob2QKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQlVTSU5FU1MpID09IEJVU0lORVNTKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdCdXNpbmVzc01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2QgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgaGVyZS4gCi0JCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QS2V5Q2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEtleUNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlYWI4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QS2V5Q2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENNUEtleUNsYXNzVlJ1bGUgZXh0ZW5kcyBBS2V5Q2xhc3NWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlLCBJUmVtb3RlVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5rYyI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117SEFTSENPREVfTk9QQVJNLCBFUVVBTFMsIENPTlNUUlVDVE9SX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgSEFTSENPREVfTk9QQVJNLCBFUVVBTFMsIENPTlNUUlVDVE9SX05PUEFSTSwgQ09OU1RSVUNUT1J9OwotCi0JcHJpdmF0ZSBTZXQgX2tleUZpZWxkcyA9IG51bGw7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2hhc2hDb2RlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfaGFzaENvZGUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lcXVhbHMsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lcXVhbHMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxOSwgbmV3IFN0cmluZ1tde0NIS0oyMDE5K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNSwgbmV3IFN0cmluZ1tde0NIS0oyMjA1K0JFWFQsIENIS0oyMjA1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjA2LCBuZXcgU3RyaW5nW117Q0hLSjIyMDYrQkVYVCwgQ0hLSjIyMDYrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyOSwgbmV3IFN0cmluZ1tde0NIS0oyODI5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQkvLyBLZXkgbWV0aG9kcyBhcmUgbm90IGNoZWNrZWQgZm9yIFJlbW90ZUV4Y2VwdGlvbiwgYnV0IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgVlJ1bGVzLi4uCi0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpcGFyZW50OwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCkpIHsKLQkJCXJldHVybiBudWxsOyAvLyBkbyBub3QgdmFsaWRhdGUgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkKLQkJfQotCQkKLQkJcmV0dXJuIGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCQotCi0JLyoKLQkgKiBAc2VlIElDbGFzc1ZSdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgRW50ZXJwcmlzZUJlYW4sIEphdmFDbGFzcywgTWV0aG9kKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBOb3RoaW5nIHRvIGRvLgotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7Ci0KLQkJLy8gSVdBRDQyNTEgPSBUaGlzIGNsYXNzIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTAuOC4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFjbGF6ei5pc1B1YmxpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDIyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuOwotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShjbXApKSB7Ci0JCQkvLyBwcmltYXJ5IGtleSBtdXN0IG1hcCB0byBhdCBsZWFzdCBvbmUgZmllbGQgb24gdGhlIGJlYW4gCi0JCQkvLyBCdXQgaWYgaXQncyBhbiB1bmtub3duIGtleSwgdGhlcmUncyBubyBwb2ludCBjaGVja2luZyBqYXZhLmxhbmcuT2JqZWN0Ci0JCQlMaXN0IHByaW1LZXlGaWVsZHMgPSBjbXAuZ2V0S2V5QXR0cmlidXRlcygpOwotCQkJaWYgKChwcmltS2V5RmllbGRzID09IG51bGwpIHx8IChwcmltS2V5RmllbGRzLnNpemUoKSA9PSAwKSkgewotCQkJCUphdmFDbGFzcyBwcmltYXJ5S2V5ID0gY21wLmdldFByaW1hcnlLZXkoKTsgLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUocHJpbWFyeUtleSksIGJlY2F1c2UgaXQncyBhbHJlYWR5IGJlZW4gY2FsbGVkIGluIHRoZSB2YWxpZGF0ZURlcGxveW1lbnREZXNjcmlwdG9yIG1ldGhvZAotCQkJCVN0cmluZyBiZWFuTmFtZSA9IChjbXAuZ2V0TmFtZSgpID09IG51bGwpID8gIm51bGwiIDogY21wLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgY21wLCBwcmltYXJ5S2V5LCBuZXcgU3RyaW5nW10geyBwcmltYXJ5S2V5LmdldE5hbWUoKSwgYmVhbk5hbWUgfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU2V0IGdldEtleUZpZWxkcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlpZihfa2V5RmllbGRzID09IG51bGwpIHsKLQkJCS8vIEtub3cgdGhhdCB0aGUgdHJhdmVyc2FsIG9mIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgaXMgZG9uZSBzZXF1ZW50aWFsbHkuCi0JCQkvLyBpLmUuLCB0aGF0IGEgY2xhc3MgaXMgdmFsaWRhdGVkIGFjY29yZGluZyB0byBvbmUgYmVhbiBhdCBhdCB0aW1lLgotCQkJLy8gVGh1cywgd2UgY2FuIGNhY2hlIHRoZSBrZXkgZmllbGQgaW5mb3JtYXRpb24gdG8gc3BlZWQgdXAgc3Vic2VxdWVudCBjYWxscy4KLQkJCUxpc3QgZmllbGRzID0gY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmllbGRzLml0ZXJhdG9yKCk7Ci0JCQlfa2V5RmllbGRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUNNUEF0dHJpYnV0ZSBhdHRyaWIgPSAoQ01QQXR0cmlidXRlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlfa2V5RmllbGRzLmFkZChhdHRyaWIuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gX2tleUZpZWxkczsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElDbGFzc1ZSdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgRW50ZXJwcmlzZUJlYW4sIEphdmFDbGFzcywgRmllbGQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJbG9uZyBmaWVsZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRGaWVsZFR5cGVJZChiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQlpZigoZmllbGRUeXBlICYgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlNFUklBTFZFUlNJT05VSUQpID09IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlEKSB7Ci0JCQl2YWxpZGF0ZVNlcmlhbFZlcnNpb25VSUQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJV0FENDI1MyA9IFRoaXMgZmllbGQgbXVzdCBiZSBwdWJsaWMuIFJlYWQgc2VjdGlvbiAxMC44LjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMoZmllbGQpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjIwNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBmaWVsZCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJCQotCQkJU2V0IGtleUZpZWxkcyA9IGdldEtleUZpZWxkcygoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuKTsKLQkJCWlmKCFrZXlGaWVsZHMuY29udGFpbnMoZmllbGQuZ2V0TmFtZSgpKSkgewotCQkJCS8vIElXQUQ0MjU0ID0gVGhpcyBmaWVsZCBpcyBub3QgYSA8Y21wLWZpZWxkPi4gUmVhZCBzZWN0aW9uIDEwLjguMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIyMDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJaWYoX2tleUZpZWxkcyAhPSBudWxsKSB7Ci0JCQlfa2V5RmllbGRzLmNsZWFyKCk7Ci0JCQlfa2V5RmllbGRzID0gbnVsbDsgLy8gaW4gdGhpcyBjYXNlLCBjbGVhcmluZyB0aGUgU2V0IGlzbid0IGVub3VnaC4KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBMb2NhbENvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGNhY2UxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBMb2NhbENvbXBvbmVudFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBMb2NhbENvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUNvbXBvbmVudFZSdWxlIGltcGxlbWVudHMgSUNvbXBvbmVudFR5cGUsIElMb2NhbFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5jbGMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RUpCU0VMRUNUfTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBFSkJTRUxFQ1R9OyAvLyBNdXN0IGtub3cgRUpCU0VMRUNUIHRvIGNoZWNrIHRoYXQgaXQncyBub3QgZXhwb3NlZCBvbiB0aGlzIGludGVyZmFjZQotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc0LCBuZXcgU3RyaW5nW117Q0hLSjI0NzQrQkVYVCwgQ0hLSjI0NzQrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDJfZWpiU2VsZWN0LCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZWpiU2VsZWN0K0JFWFQsIENIS0oyNTAyX2VqYlNlbGVjdCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUExvY2FsSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlhZWUyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENNUExvY2FsSG9tZVZSdWxlIGV4dGVuZHMgQUNNUEhvbWVWUnVsZSBpbXBsZW1lbnRzIElMb2NhbFR5cGUsIElIb21lVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUxIT01FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FSkJFWFR9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5jbGgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxIT01FfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117RklOREJZUFJJTUFSWUtFWSwgRklORH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RUpCU0VMRUNUfTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEUsIEZJTkRCWVBSSU1BUllLRVksIEZJTkQsIEhPTUUsIEVKQlNFTEVDVH07IC8vIE11c3Qga25vdyBFSkJTRUxFQ1QgdG8gY2hlY2sgdGhhdCBpdCdzIG5vdCBleHBvc2VkIG9uIHRoaXMgaW50ZXJmYWNlCi0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZmluZEJ5UHJpbWFyeUtleSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXkrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZmluZCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK0JFWFQsIENIS0oyNDAyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDMrQkVYVCwgQ0hLSjI0MDMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MitCRVhULCBDSEtKMjQ2MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MywgbmV3IFN0cmluZ1tde0NIS0oyNDYzK0JFWFQsIENIS0oyNDYzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY0LCBuZXcgU3RyaW5nW117Q0hLSjI0NjQrQkVYVCwgQ0hLSjI0NjQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NStCRVhULCBDSEtKMjQ2NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW117Q0hLSjI0NjcrQkVYVCwgQ0hLSjI0NjcrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NSwgbmV3IFN0cmluZ1tde0NIS0oyNDc1K0JFWFQsIENIS0oyNDc1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc3LCBuZXcgU3RyaW5nW117Q0hLSjI0NzcrQkVYVCwgQ0hLSjI0NzcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OCtCRVhULCBDSEtKMjQ3OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OSwgbmV3IFN0cmluZ1tde0NIS0oyNDc5K0JFWFQsIENIS0oyNDc5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NStCRVhULCBDSEtKMjQ5NStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZmluZCtCRVhULCBDSEtKMjUwMF9maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2VqYlNlbGVjdCwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2VqYlNlbGVjdCtCRVhULCBDSEtKMjUwMl9lamJTZWxlY3QrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfY3JlYXRlK0JFWFQsIENIS0oyNTAzX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZmluZCtCRVhULCBDSEtKMjUwM19maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19ob21lK0JFWFQsIENIS0oyNTAzX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfY3JlYXRlK0JFWFQsIENIS0oyNTA0X2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfZmluZCtCRVhULCBDSEtKMjUwNF9maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9ob21lK0JFWFQsIENIS0oyNTA0X2hvbWUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzE1NWI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENNUFJlbW90ZUNvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUNvbXBvbmVudFZSdWxlIGltcGxlbWVudHMgSVJlbW90ZVR5cGUsIElDb21wb25lbnRUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmNyYyI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXtFSkJTRUxFQ1R9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIEVKQlNFTEVDVH07IC8vIE11c3Qga25vdyBFSkJTRUxFQ1QgdG8gY2hlY2sgdGhhdCBpdCdzIG5vdCBleHBvc2VkIG9uIHRoaXMgaW50ZXJmYWNlCi0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDczLCBuZXcgU3RyaW5nW117Q0hLSjI0NzMrQkVYVCwgQ0hLSjI0NzMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NCtCRVhULCBDSEtKMjQ3NCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2J1c2luZXNzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfYnVzaW5lc3MrQkVYVCwgQ0hLSjI1MDBfYnVzaW5lc3MrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2VqYlNlbGVjdCwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2VqYlNlbGVjdCtCRVhULCBDSEtKMjUwMl9lamJTZWxlY3QrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZSh2YywgYmVhbiwgY2xhenopOwotCQkKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuOwotCQkKLQkJLy8gMTAuMy4xLCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW50IGZpZWxkcyBhbmQgY29udGFpbmVyLW1hbmFnZWQgcmVsYXRpb25zaGlwIAotCQkvLyBmaWVsZHMgbXVzdCAqbm90KiBiZSBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcy4gCi0JCUxpc3QgY21yRmllbGRzID0gY21wLmdldENNUkZpZWxkcygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNtckZpZWxkcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUNNUkZpZWxkIGNtckZpZWxkID0gKENNUkZpZWxkKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKChjbXJGaWVsZCAhPSBudWxsKSAmJiAoIWNtckZpZWxkLmlzRGVyaXZlZCgpKSkgewotCi0JCQkJSmF2YUhlbHBlcnMgbG9jYWxUeXBlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldENNUkZpZWxkVHlwZSh2YywgY21wLCBjbGF6eiwgY21yRmllbGQpOwotCQkJCWlmKGxvY2FsVHlwZSA9PSBudWxsKSB7Ci0JCQkJCS8vIHVzZXIgbWFkZSBhIG1pc3Rha2UgaW4gZWpiLWphci54bWwgYnkgdHJ5aW5nIHRvIGNyZWF0ZSBhIHJlbGF0aW9uCi0JCQkJCS8vIHRvIGEgQ01QIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIGxvY2FsIGludGVyZmFjZS4KLQkJCQkJLy8gRG9uJ3QgcmVwb3J0IGFuIGVycm9yIGhlcmU7IGxldCB0aGUgREQgdmFsaWRhdGlvbiByZXBvcnQgdGhlIGVycm9yLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBDYW5ub3QgZXhwb3NlIGdldC9zZXQgbWV0aG9kcyBvZiBDTVIgZmllbGRzIG9uIHRoZSByZW1vdGUgaG9tZSBvciBpbnRlcmZhY2UKLQkJCQlNZXRob2QgcmVtb3RlR2V0TWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGNsYXp6LCBjbXJGaWVsZC5nZXRHZXR0ZXJOYW1lKCksIG5ldyBKYXZhSGVscGVyc1swXSwgbG9jYWxUeXBlKTsKLQkJCQlpZihyZW1vdGVHZXRNZXRob2QgIT0gbnVsbCkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBjbXAsIGNsYXp6LCByZW1vdGVHZXRNZXRob2QsIG5ldyBTdHJpbmdbXXtjbXJGaWVsZC5nZXRHZXR0ZXJOYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0KLQkJCQlKYXZhSGVscGVyc1tdIHNldE1ldGhvZFBhcm1zID0gbmV3IEphdmFIZWxwZXJzW117bG9jYWxUeXBlfTsKLQkJCQlNZXRob2QgcmVtb3RlU2V0TWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGNsYXp6LCBjbXJGaWVsZC5nZXRTZXR0ZXJOYW1lKCksIHNldE1ldGhvZFBhcm1zKTsKLQkJCQlpZihyZW1vdGVTZXRNZXRob2QgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc2V0dGVyTmFtZSA9IGNtckZpZWxkLmdldFNldHRlck5hbWUoKSArICIoIiArIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRQYXJtc0FzU3RyaW5nKHNldE1ldGhvZFBhcm1zKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3MywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGNtcCwgY2xhenosIHJlbW90ZVNldE1ldGhvZCwgbmV3IFN0cmluZ1tde3NldHRlck5hbWV9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUFJlbW90ZUhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUFJlbW90ZUhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDBlYzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENNUFJlbW90ZUhvbWVWUnVsZSBleHRlbmRzIEFDTVBIb21lVlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUhvbWVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9IT01FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FSkJFWFR9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5jcmgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJIT01FfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117RklOREJZUFJJTUFSWUtFWSwgRklORH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RUpCU0VMRUNUfTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEUsIEZJTkRCWVBSSU1BUllLRVksIEZJTkQsIEhPTUUsIEVKQlNFTEVDVH07IC8vIE11c3Qga25vdyBFSkJTRUxFQ1QgdG8gY2hlY2sgdGhhdCBpdCdzIG5vdCBleHBvc2VkIG9uIHRoaXMgaW50ZXJmYWNlCi0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZmluZEJ5UHJpbWFyeUtleSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXkrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZmluZCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK0JFWFQsIENIS0oyNDAyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDMrQkVYVCwgQ0hLSjI0MDMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MitCRVhULCBDSEtKMjQ2MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MywgbmV3IFN0cmluZ1tde0NIS0oyNDYzK0JFWFQsIENIS0oyNDYzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY0LCBuZXcgU3RyaW5nW117Q0hLSjI0NjQrQkVYVCwgQ0hLSjI0NjQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NStCRVhULCBDSEtKMjQ2NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW117Q0hLSjI0NjcrQkVYVCwgQ0hLSjI0NjcrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NSwgbmV3IFN0cmluZ1tde0NIS0oyNDc1K0JFWFQsIENIS0oyNDc1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc3LCBuZXcgU3RyaW5nW117Q0hLSjI0NzcrQkVYVCwgQ0hLSjI0NzcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OCtCRVhULCBDSEtKMjQ3OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OSwgbmV3IFN0cmluZ1tde0NIS0oyNDc5K0JFWFQsIENIS0oyNDc5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NStCRVhULCBDSEtKMjQ5NStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZmluZCtCRVhULCBDSEtKMjUwMF9maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2VqYlNlbGVjdCwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2VqYlNlbGVjdCtCRVhULCBDSEtKMjUwMl9lamJTZWxlY3QrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfY3JlYXRlK0JFWFQsIENIS0oyNTAzX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZmluZCtCRVhULCBDSEtKMjUwM19maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19ob21lK0JFWFQsIENIS0oyNTAzX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfY3JlYXRlK0JFWFQsIENIS0oyNTA0X2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfZmluZCtCRVhULCBDSEtKMjUwNF9maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9ob21lK0JFWFQsIENIS0oyNTA0X2hvbWUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NsYXNzVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NsYXNzVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZkNTFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DbGFzc1V0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NVdGlsaXR5IHsKLQlwdWJsaWMgc3RhdGljIGxvbmcgc3VwZXJ0eXBlX2NvdW50ZXIgPSAweDE7IC8vIHVzZWQgYnkgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLmphdmEKLQlwcml2YXRlIGxvbmdbXSBfY2xhc3NUeXBlSW5kZXg7Ci0JcHJpdmF0ZSBBQ2xhc3NUeXBlW10gX2NsYXNzTmFtZXM7Ci0JCi0JcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBBQ2xhc3NUeXBlIHsKLQkJcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb247Ci0JCXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldElkKCk7Ci0KLQkJcHVibGljIEphdmFIZWxwZXJzIGdldENsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGdldE5hbWUoYmVhbiksIGJlYW4pOwotCQl9Ci0JCQotCQkvKioKLQkJICogSXMgdGhpcyBjbGFzcyB0eXBlIGVxdWFsIHRvIHRoZSBjbGF6eiBwYXJhbWV0ZXIuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJCWlmKGNsYXp6ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCUphdmFIZWxwZXJzIHRoaXNDbGFzcyA9IGdldENsYXNzKGJlYW4pOwotCQkJaWYodGhpc0NsYXNzID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBjbGF6ei5lcXVhbHModGhpc0NsYXNzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDbGFzc1V0aWxpdHkgX2luc3QgPSBudWxsOwotCQotCXByaXZhdGUgQ2xhc3NVdGlsaXR5KCkgewotCQlidWlsZFR5cGVMaXN0KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ2xhc3NVdGlsaXR5IGdldFV0aWxpdHkoKSB7Ci0JCWlmKF9pbnN0ID09IG51bGwpIHsKLQkJCV9pbnN0ID0gbmV3IENsYXNzVXRpbGl0eSgpOwotCQl9Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2xhenogaXMgdGhlIHNhbWUgYXMgdGhlIGNsYXNzLCBpZGVudGlmaWVkIGJ5IHRoZSAidHlwZSIKLQkgKiBwYXJhbWV0ZXIsIGluIHRoZSBiZWFuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xhc3NUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgbG9uZyB0eXBlKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJQUNsYXNzVHlwZSBjdCA9IGdldENsYXNzVHlwZSh0eXBlKTsKLQkJaWYoY3QgPT0gbnVsbCkgewotCQkJLy8gVW5rbm93biB0eXBlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBjdC5lcXVhbHMoYmVhbiwgY2xhenopOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIGxvbmcgdHlwZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCUFDbGFzc1R5cGUgY3QgPSBnZXRDbGFzc1R5cGUodHlwZSk7Ci0JCWlmKGN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gY3QuZ2V0TmFtZShiZWFuKTsKLQl9Ci0KLQlwdWJsaWMgQUNsYXNzVHlwZSBnZXRDbGFzc1R5cGUobG9uZyB0eXBlKSB7Ci0JCWludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goX2NsYXNzVHlwZUluZGV4LCB0eXBlKTsKLQkJaWYoaW5kZXggPiBfY2xhc3NOYW1lcy5sZW5ndGgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihfY2xhc3NOYW1lc1tpbmRleF0uZ2V0SWQoKSAhPSB0eXBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIF9jbGFzc05hbWVzW2luZGV4XTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0U3VwZXJ0eXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIGxvbmcgdHlwZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCUFDbGFzc1R5cGUgY3QgPSBnZXRDbGFzc1R5cGUodHlwZSk7Ci0JCWlmKGN0ID09IG51bGwpIHsKLQkJCS8vIE5vIHN1cGVydHlwZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBjdC5nZXRDbGFzcyhiZWFuKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHlwZUxpc3QoKSB7Ci0JCWludCB0eXBlQ291bnQgPSAxMjsgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGlkZW50aWZpYWJsZSBjbGFzc2VzIGluIElUeXBlQ29uc3RhbnRzCi0JCV9jbGFzc1R5cGVJbmRleCA9IG5ldyBsb25nW3R5cGVDb3VudF07Ci0JCV9jbGFzc05hbWVzID0gbmV3IEFDbGFzc1R5cGVbdHlwZUNvdW50XTsKLQkJaW50IGNvdW50ID0gMDsKLQkJCi0JCS8vIFRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgbG9uZ1tdIGlzIGVxdWFsIHRvIHRoZQotCQkvLyBpbmRleCBvZiB0aGUgSU1ldGhvZFR5cGUgaW4gdGhlIElNZXRob2RUeXBlW10uIEJ5IHVzaW5nCi0JCS8vIHRoaXMgdGVjaG5pcXVlIGluc3RlYWQgb2YgYSBIYXNoTWFwLCB3ZSBkb24ndCBuZWVkIHRvCi0JCS8vIGNyZWF0ZSBhbiBJbnRlZ2VyIGV2ZXJ5IHRpbWUgd2UgbmVlZCB0byBsb2NhdGUgdGhlIAotCQkvLyBJTWV0aG9kVHlwZS4KLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkxPQ0FMX0NPTVBPTkVOVF9JTlRFUkZBQ0U7Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCUphdmFIZWxwZXJzIGNsYXp6ID0gZ2V0Q2xhc3MoYmVhbik7Ci0JCQkJaWYoY2xhenogPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkxPQ0FMX0NPTVBPTkVOVF9JTlRFUkZBQ0U7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBKYXZhSGVscGVycyBnZXRDbGFzcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkKLQkJCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpKSkgewotCQkJCQlKYXZhQ2xhc3MgcmVzdWx0ID0gYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpOwotCQkJCQl0cnkgewotCQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQkKLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLlJFTU9URV9DT01QT05FTlRfSU5URVJGQUNFOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlKYXZhSGVscGVycyBjbGF6eiA9IGdldENsYXNzKGJlYW4pOwotCQkJCWlmKGNsYXp6ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5SRU1PVEVfQ09NUE9ORU5UX0lOVEVSRkFDRTsKLQkJCX0KLQkJCQotCQkJcHVibGljIEphdmFIZWxwZXJzIGdldENsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlpZihiZWFuID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCQotCQkJCWlmKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1JlbW90ZUludGVyZmFjZSgpKSkgewotCQkJCQlKYXZhQ2xhc3MgcmVzdWx0ID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCByZXN1bHQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRU5USVRZQkVBTjsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRU5USVRZQkVBTjsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FTlRJVFlCRUFOOwotCQkJfQotCQl9OwotCQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQkxPQ0FMSE9NRTsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCTE9DQUxIT01FOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQkxPQ0FMSE9NRTsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVDsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVDsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQkhPTUU7Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkhPTUU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRUpCSE9NRTsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQk9CSkVDVDsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCT0JKRUNUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQk9CSkVDVDsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVDsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVDsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9NRVNTQUdFRFJJVkVOQkVBTjsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9NRVNTQUdFRFJJVkVOQkVBTjsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUjsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUjsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX1NFU1NJT05CRUFOOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQkVBTjsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9TRVNTSU9OQkVBTjsKLQkJCX0KLQkJfTsKLQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT047Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT047Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTjsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ29ubmVjdG9yTWVzc2FnZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Nvbm5lY3Rvck1lc3NhZ2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwZDQ4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ29ubmVjdG9yTWVzc2FnZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotLyoqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdG9yTWVzc2FnZUNvbnN0YW50cyBleHRlbmRzIEoyRUVNZXNzYWdlQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NUWVBFXzFfMyA9ICIxLjAiOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfMV80ID0gIjEuNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfTU9ERUxfTkFNRSA9ICJDT05ORUNUT1JfVkFMSURBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8gPSAiQ09OTkVDVE9SX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0lOVkFMSURfQ09OTkVDVE9SX0ZJTEUgPSAiRVJST1JfSU5WQUxJRF9DT05ORUNUT1JfRklMRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9DT05ORUNUT1JfVkFMSURBVElPTl9GQUlMRUQgPSAiRVJST1JfQ09OTkVDVE9SX1ZBTElEQVRJT05fRkFJTEVEIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Nvbm5lY3RvclZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Nvbm5lY3RvclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzI0OTAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Db25uZWN0b3JWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDIyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JWYWxpZGF0b3IgZXh0ZW5kcyBKMkVFVmFsaWRhdG9yIGltcGxlbWVudHMgQ29ubmVjdG9yTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHJvdGVjdGVkIFJBUkZpbGUgcmFyRmlsZTsKLQlwcm90ZWN0ZWQgQ29ubmVjdG9yIGNvbm5lY3RvckREOwotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uSjJFRVZhbGlkYXRvciNnZXRCYXNlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlTmFtZSgpIHsKLQkJcmV0dXJuICJyYXJ2YWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbm5lY3RvckRELgotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yREQoKSB7Ci0JCXJldHVybiBjb25uZWN0b3JERDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29ubmVjdG9yREQgVGhlIGNvbm5lY3RvckREIHRvIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb25uZWN0b3JERChDb25uZWN0b3IgY29ubmVjdG9yREQpIHsKLQkJdGhpcy5jb25uZWN0b3JERCA9IGNvbm5lY3RvckREOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmFyRmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgUkFSRmlsZSBnZXRSYXJGaWxlKCkgewotCQlyZXR1cm4gcmFyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmFyRmlsZSBUaGUgcmFyRmlsZSB0byBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmFyRmlsZShSQVJGaWxlIHJhckZpbGUpIHsKLQkJdGhpcy5yYXJGaWxlID0gcmFyRmlsZTsKLQl9Ci0JCQotCS8qKgotCSAqIERvZXMgdGhlIHZhbGlkYXRpb24uCi0JICogCi0JICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl2YWxpZGF0ZUluSm9iKGluSGVscGVyLCBpblJlcG9ydGVyKTsJCQotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUoyRUUxNERvY1R5cGUoKSB7Ci0JCi0JCWlmICggZ2V0Q29ubmVjdG9yREQoKS5nZXRWZXJzaW9uSUQoKSA8IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQpIHsKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQlwYXJhbXNbMF0gPSBET0NUWVBFXzFfNDsKLQkJCS8vcGFyYW1zWzFdID0gaGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCQlwYXJhbXNbMl0gPSBET0NUWVBFXzFfMzsKLQkJCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIENPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXywgcGFyYW1zKTsKLQkJfSBlbHNlIGlmIChnZXRDb25uZWN0b3JERCgpLmdldFZlcnNpb25JRCgpICE9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQpIHsKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQlwYXJhbXNbMF0gPSBET0NUWVBFXzFfMzsKLQkJCS8vcGFyYW1zWzFdID0gaGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCQlwYXJhbXNbMl0gPSBET0NUWVBFXzFfNDsKLQkJCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIENPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXywgcGFyYW1zKTsKLQkJfS8vIGlmCi0JfS8vIHZhbGlkYXRlRG9jVHlwZVZzTmF0dXJlCi0JCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb257Ci0JCi0JCXN1cGVyLnZhbGlkYXRlSW5Kb2IoaGVscGVyLCByZXBvcnRlcik7Ci0JCQotCQkvLyBGaXJzdCByZW1vdmUgYWxsIHByZXZpb3VzIG1zZy4gZm9yIHRoaXMgcHJvamVjdAotCQlfcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcywgbnVsbCk7IC8vIE5vdGUgdGhlIFdhckhlbHBlciB3aWxsIHJldHVybiB3ZWIueG1sIHdpdGggYSBudWxsIG9iamVjdCBhcyB3ZWxsCi0JCi0JCXRyeSB7Ci0JCQlzZXRSYXJGaWxlKChSQVJGaWxlKSBoZWxwZXIubG9hZE1vZGVsKENPTk5FQ1RPUl9NT0RFTF9OQU1FKSk7Ci0JCQlpZiAocmFyRmlsZSAhPSBudWxsKSB7Ci0JCQkJc2V0Q29ubmVjdG9yREQoIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSApOwotCQkJCS8vdmFsaWRhdGVKMkVFMTREb2NUeXBlKCk7Ci0JCQl9IGVsc2UgewotCQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfSU5WQUxJRF9DT05ORUNUT1JfRklMRSk7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2cpOwotCQkJfQotCQotCQl9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBleDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfQ09OTkVDVE9SX1ZBTElEQVRJT05fRkFJTEVEKTsKLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnLCBlKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwkJCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJcmFyRmlsZSA9IG51bGw7Ci0JCWNvbm5lY3RvckREID0gbnVsbDsKLQkJc3VwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9EdXBsaWNhdGVzVGFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9EdXBsaWNhdGVzVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxYzYzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRHVwbGljYXRlc1RhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBJbiBzb21lIHBsYWNlcyBpbiB0aGUgY29kZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGZpbmQgb3V0IGlmIHRoZXJlCi0gKiBhcmUgZHVwbGljYXRlcyBpbiBhIGxpc3QsIGFuZCBpZiB0aGVyZSBhcmUsIHRvIHJlZ2lzdGVyIGEgdmFsaWRhdGlvbgotICogbWVzc2FnZSBhZ2FpbnN0IHRoZSBkdXBsaWNhdGVzLiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gbWFrZSBmaW5kaW5nCi0gKiB0aGUgZHVwbGljYXRlcyBlYXNpZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBEdXBsaWNhdGVzVGFibGUgZXh0ZW5kcyBqYXZhLnV0aWwuSGFzaE1hcCB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMxODk5MDE4NDk1NTUyMjk3MThMOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBVTklRVUUgPSBCb29sZWFuLkZBTFNFOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBEVVBMSUNBVEUgPSBCb29sZWFuLlRSVUU7Ci0JcHJvdGVjdGVkIE1hcCBfZHVwbGljYXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBBZGQgYW4gb2JqZWN0IHRvIHRoaXMgdGFibGU7IGlmIHRoZSBvYmplY3QgaXMgYSBkdXBsaWNhdGUsIGl0IHdpbGwgYmUKLQkgKiBtYXJrZWQgdG8gYSBkdXBsaWNhdGUgaW5zdGVhZCBvZiBiZWluZyBhZGRlZCB0d2ljZSB0byB0aGUgdGFibGUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSB7Ci0JCS8vIEJ1aWxkIHVwIGhhc2h0YWJsZSB0byBjaGVjayBmb3IgZHVwbGljYXRlIGVsZW1lbnRzLgotCQlPYmplY3Qga2V5ID0gZ2V0KG8pOwotCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCXB1dChvLCBVTklRVUUpOwotCQl9Ci0JCWVsc2UgewotCQkJc2F2ZUR1cGxpY2F0ZShvKTsKLQkJCXB1dChvLCBEVVBMSUNBVEUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUR1cGxpY2F0ZShPYmplY3QgbykgewotCQkvLyBUaGUgZ2l2ZW4gb2JqZWN0IGhhcyBiZWVuIG1hcmtlZCBhIGR1cGxpY2F0ZS4KLQkJLy8gR2l2ZW4gdGhhdCB0aGUgSGFzaE1hcCBjYW4gc3RvcmUgb25seSBvbmUgb2JqZWN0IHdpdGggdGhlIGtleSwgCi0JCS8vIGR1cGxpY2F0ZXMgYXJlIG92ZXJ3cml0dGVuLiBUaGlzIG1ldGhvZCBzdG9yZXMgdGhlIGR1cGxpY2F0ZXMKLQkJLy8gZWxzZXdoZXJlIGluIGEgTGlzdC4KLQkJaWYgKF9kdXBsaWNhdGVzID09IG51bGwpIHsKLQkJCV9kdXBsaWNhdGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCi0JCUxpc3QgZHVwTGlzdCA9IChMaXN0KSBfZHVwbGljYXRlcy5nZXQobyk7Ci0JCWlmIChkdXBMaXN0ID09IG51bGwpIHsKLQkJCWR1cExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlkdXBMaXN0LmFkZChvKTsKLQkJX2R1cGxpY2F0ZXMucHV0KG8sIGR1cExpc3QpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIGluIHRoaXMgdGFibGUsIHJldHVybiB0cnVlOyBlbHNlLCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNEdXBsaWNhdGVzKCkgewotCQlyZXR1cm4gY29udGFpbnNWYWx1ZShEVVBMSUNBVEUpOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgdW5pcXVlIGVsZW1lbnRzIGluIHRoaXMgdGFibGUsIHJldHVybiB0cnVlOyBlbHNlLCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNVbmlxdWVzKCkgewotCQlyZXR1cm4gY29udGFpbnNWYWx1ZShVTklRVUUpOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgZHVwbGljYXRlcyBpbiB0aGlzIHRhYmxlLCByZXR1cm4gYSBzZXQgb2YgdGhlIGR1cGxpY2F0ZXMuCi0JICogT3RoZXJ3aXNlLCByZXR1cm4gYW4gZW1wdHkgc2V0LgotCSAqLwotCXB1YmxpYyBMaXN0IGdldER1cGxpY2F0ZXMoKSB7Ci0JCWlmICghY29udGFpbnNEdXBsaWNhdGVzKCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJLy8gRWxzZSwgZ2V0IHRoZSBkdXBsaWNhdGUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdAotCQlyZXR1cm4gZ2V0RWxlbWVudHMoRFVQTElDQVRFKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgaW4gdGhpcyB0YWJsZSwgcmV0dXJuIGEgbGlzdCBvZiB0aGUgZHVwbGljYXRlcy4KLQkgKiBPdGhlcndpc2UsIHJldHVybiBhbiBlbXB0eSBsaXN0LgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRFbGVtZW50cyhCb29sZWFuIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQkvLyBFbHNlLCBnZXQgdGhlIGR1cGxpY2F0ZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0Ci0JCVNldCBrZXlzID0ga2V5U2V0KCk7Ci0JCWlmIChrZXlzID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXkgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBnZXQoa2V5KTsKLQkJCWlmICh2YWx1ZSA9PSB0eXBlKSB7Ci0JCQkJZWxlbWVudHMuYWRkKGtleSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodHlwZSA9PSBEVVBMSUNBVEUpIHsKLQkJCS8vIEFsc28gYWRkIHRoZSBlbGVtZW50cyBmcm9tIHRoZSAiZHVwbGljYXRlcyIgbGlzdC4KLQkJCWlmIChfZHVwbGljYXRlcyAhPSBudWxsKSB7Ci0JCQkJaXRlcmF0b3IgPSBfZHVwbGljYXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJTGlzdCBkdXBMaXN0ID0gKExpc3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKGR1cExpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlcmUgYXJlIHVuaXF1ZSBlbGVtZW50cyBpbiB0aGlzIHRhYmxlLCByZXR1cm4gYSBzZXQgb2YgdGhlIHVuaXF1ZSBlbGVtZW50cy4KLQkgKiBPdGhlcndpc2UsIHJldHVybiBhbiBlbXB0eSBzZXQuCi0JICovCi0JcHVibGljIExpc3QgZ2V0VW5pcXVlcygpIHsKLQkJaWYgKCFjb250YWluc1VuaXF1ZXMoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQkvLyBFbHNlLCBnZXQgdGhlIHVuaXF1ZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0Ci0JCXJldHVybiBnZXRFbGVtZW50cyhVTklRVUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlzdXBlci5jbGVhcigpOwotCQlpZihfZHVwbGljYXRlcyAhPSBudWxsKSB7Ci0JCQlfZHVwbGljYXRlcy5jbGVhcigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0YzY2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImVhcnZhbGlkYXRpb24iOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRUFSX1ZBTElEQVRJT05fRkFJTEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9JTlZBTElEX0VBUl9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9FQVJfTk9fTU9EVUxFX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX0VBUl9NSVNTSU5HX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJfRERfUEFSU0VfTElORUNPTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJfRERfUEFSU0VfTElORTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJfRERfUEFSU0VfTk9JTkZPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVBUl9ERF9DQU5OT1RfT1BFTl9ERDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklfQ09OVEFJTlNfU1BBQ0VTX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX0VBUl9EVVBMSUNBVEVfVVJJX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX0VBUl9EVVBJQ0FURV9ST09UQ09OVEVYVF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9FTVBUWV9BTFRfRERfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERVUExJQ0FURV9VVElMSkFSX0ZPUl9QUk9KRUNUX05BTUVfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERVUExJQ0FURV9NT0RVTEVfRk9SX1BST0pFQ1RfTkFNRV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9VVElMX1VSSV9OQU1FX0NPTExJU0lPTl9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9VVElMX1BST0pFQ1RfTkFNRV9DT0xMSVNJT05fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BTklGRVNUX0xJTkVfRU5EX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQU5JRkVTVF9MSU5FX0VYQ0VFRFNfTEVOR1RIX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1VSSV9GT1JfTU9EVUxFX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTU9EVUxFX0REX1BBUlNFX0xJTkVDT0xfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PRFVMRV9ERF9QQVJTRV9MSU5FX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RVTEVfRERfUEFSU0VfTk9JTkZPX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFSkJfQkVBTl9FSkJfTElOS19JTlRFRkFDRV9NSVNNQVRDSF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0FSTklOR19NRVRBRk9MREVSX01JU1NJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0FSTklOR19GSUxFX01JU1NJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9JTlZBTElEX0FMVF9ERF9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX01BTklGRVNUX0NMQVNTUEFUSF9PTkVfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9NQU5JRkVTVF9DTEFTU1BBVEhfVFdPX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfTUFOSUZFU1RfQ0xBU1NQQVRIX0RFUEVOREVOQ1lfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9JU19DTE9TRURfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9ET0VTX05PVF9FWElTVF9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNSVNTSU5HX1dFQk5BVFVSRV9GT1JNT0RVTEVfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVQUkVDQVRFRF9BQlNQQVRIU19XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX0NPTlRFWFRST09UX1dFQk1PRFVMRV9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNSVNTSU5HX0NMSUVOVE5BVFVSRV9GT1JNT0RVTEVfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUlTU0lOR19FSkJOQVRVUkVfRk9STU9EVUxFX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfUFJPSkVDVF9GT1JNT0RVTEVfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9DQVNFX0ZPUl9NQU5JRkVTVF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJX0FMUkVBRFlfRVhJU1RTX0lOX0VBUl9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNSVNTSU5HX01PRFVMRV9FWFRFTlNJT05fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfU0VSVkVSX1RBUkdFVF9ET0VTX05PVF9NQVRDSF9FQVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTk9fU0VSVkVSX1RBUkdFVF9NT0RVTEVfSU5fRUFSX1dJVEhfU0VSVkVSX1RBUkdFVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT19TRVJWRVJfVEFSR0VUX09OX0VBUl9XSVRIX01PRFVMRV9TRVJWRVJfVEFSR0VUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX0VBUl9TRVJWRVJfVEFSR0VUX0ZPUl8xNF9TUEVDX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfTU9EVUxFX1NFUlZFUl9UQVJHRVRfRk9SXzE0X1NQRUNfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9JTkNPTVBBVElCTEVfU1BFQ19XQVJOSU5HXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX0lOQ09NUEFUSUJMRV8xM19TUEVDX1dBUk5JTkdfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfSU5DT01QQVRJQkxFXzE0X1NQRUNfV0FSTklOR187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1JfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENMQVNTUEFUSF9DT01QT05FTlRfVVJJX01BVENIRVNfQVJDSElWRV9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFVQTElDQVRFX0NMQVNTUEFUSF9DT01QT05FTlRfVVJJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpFRTVfUFJPSkVDVF9SRUZFUkVOQ0VEX0JZX1BSRV9KRUU1X0VBUjsKLQotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0JCi0JCi0JLyoqCi0JICogICBTdHJpbmcgbWVzc2FnZTsKLSAgICAgIC4uLgotICAgICAgLy8gbm8gYXJncwotICAgICAgbWVzc2FnZSA9IEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLmtleV9vbmU7Ci0gICAgICAuLi4KLSAgICAgIC8vIGJpbmQgb25lIGFyZwotICAgICAgbWVzc2FnZSA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLmtleV90d28sICJleGFtcGxlIHVzYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkV4dDIwVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJFeHQyMFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MWMzMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkV4dDIwVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBWYWxpZGF0ZSB0aGUgV2ViU3BoZXJlLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIG5vbi1zcGVjIGZlYXR1cmVzLCBzdWNoCi0gKiBhcyBjb21wb25lbnQgaW5oZXJpdGFuY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJFeHQyMFZSdWxlIGV4dGVuZHMgQVZhbGlkYXRpb25SdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9NRVNTQUdFX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FSkJKQVJ9OwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNiwgbmV3IFN0cmluZ1tde0NIS0oyMTA2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ5LCBuZXcgU3RyaW5nW117Q0hLSjI4NDkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjg1Mn0pOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCRVhUOwotCX0KLQkKLQlwdWJsaWMgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGJlYW4gY29tcG9uZW50cyAoaG9tZSBpbnRlcmZhY2UsIHJlbW90ZSBpbnRlcmZhY2UsIGJlYW4gY2xhc3MsIGFuZCBwcmltYXJ5Ci0JICoga2V5KSBjYW4gYWxsIGJlIGZvdW5kIGFuZCByZWZsZWN0ZWQsIHJldHVybiB0cnVlLiBMZXQgdGhlIEREVmFsaWRhdG9yCi0JICogcmVwb3J0IHRoZSBlcnJvciBtZXNzYWdlIGFnYWluc3QgdGhlIGJlYW4gaWYgb25lIG9mIHRoZXNlIHR5cGVzIGRvZXNuJ3QgcmVmbGVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhcmVCZWFuQ29tcG9uZW50c1JlZmxlY3RlZChFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhlIGJlYW4gaXMgbnVsbCwgYmVjYXVzZSB0aGlzIG1ldGhvZCB3aWxsCi0JCS8vIG5vdCBiZSBjYWxsZWQgaWYgaXQgaXMuCi0JCXRyeSB7Ci0JCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRFamJDbGFzcygpKTsKLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihiZWFuIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbikgewotCQkJLy8gZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgcmVzdAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpKSkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSkpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEhvbWVJbnRlcmZhY2UoKSkpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpKSkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9ICgoRW50aXR5KSBiZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCQl0cnkgewotCQkJCWlmKCgoRW50aXR5KWJlYW4pLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRpdHlfUHJpbWFyeUtleSgpKSkgewotCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcHJpbWFyeUtleSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZihsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQjIwVmFsaWRhdG9yIC0gdmFsaWRhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkuc2V0VGV4dChnZXRDbGFzcygpLmdldE5hbWUoKSArICI6OnZhbGlkYXRlKCIgKyB0YXJnZXRQYXJlbnQgKyAiLCAiICsgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCX0KLQkJCi0JCUVKQkphciBlamJKYXIgPSBudWxsOwotCQlpZih0YXJnZXRQYXJlbnQgPT0gbnVsbCkgewotCQkJZWpiSmFyID0gKEVKQkphcil0YXJnZXQ7Ci0JCQl2YWxpZGF0ZSh2YywgZWpiSmFyKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHJ1bm5pbmcgYXMgYSBkZXBlbmRlbnQKLQkJCWVqYkphciA9IChFSkJKYXIpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfTU9ERUwpOwotCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbil0YXJnZXRQYXJlbnQ7Ci0JCQl2YWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVudGVycHJpc2VCZWFucy5pdGVyYXRvcigpOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gbnVsbDsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQliZWFuID0gKEVudGVycHJpc2VCZWFuKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJCS8vIElmIGJlYW4gaXNuJ3QgdmFsaWQsIGRvbid0IHBlcmZvcm0gYW55IG9mIHRoZSBvdGhlcgotCQkJCS8vIHZhbGlkYXRpb24gY2hlY2tzIG9uIGl0LiBMZXQgRERWYWxpZGF0b3Igb3V0cHV0IHRoZSBlcnJvciBtZXNzYWdlLgotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJdmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBDaGVjayBpZiB0aGUgY2xhc3MgZXhpc3RzLCBldGMuCi0JCQlpZighYXJlQmVhbkNvbXBvbmVudHNSZWZsZWN0ZWQoYmVhbikpIHsKLQkJCQkvLyBTb21ldGhpbmcgZGlkbid0IHJlZmxlY3QgcHJvcGVybHksIHNvIGRvbid0IGNvbnRpbnVlIHdpdGggdGhlCi0JCQkJLy8gcmVzdCBvZiB0aGUgY2hlY2tzLiBTb21lIG1ldGFkYXRhIHdpbGwgYmUgbm9uc2Vuc2UuCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBDb21wb25lbnQgaW5oZXJpdGFuY2UgaXMgbm93IGNoZWNrZWQgaW4gZWFjaCBWUnVsZSBpbnN0ZWFkIG9mIGhlcmUuCi0JCQkvLyBUaGlzIHdhcyBuZWNlc3NhcnkgZm9yIGluY3JlbWVudGFsIHZhbGlkYXRpb247IGlmIG9uZSBjbGFzcyBjaGFuZ2VkCi0JCQkvLyBpbiB0aGUgYmVhbiwgYW5kIHRoZSBiZWFuIHdhcyBhIG1lbWJlciBvZiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZW4KLQkJCS8vIG1lc3NhZ2VzIHdlcmUgYWRkZWQgbXVsdGlwbGUgdGltZXMgb250byB0aGUgY2xhc3NlcyB3aGljaCBoYWQgbm90IGNoYW5nZWQuCi0JCQkvLyBJbiBvcmRlciB0byBhdm9pZCBtdWx0aXBsZSBtZXNzYWdlcywgb25seSB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlIG9mCi0JCQkvLyB0aGUgY2xhc3Mgd2hpY2ggY2hhbmdlZCBzaG91bGQgYmUgcmV2YWxpZGF0ZWQgd2hlbiB0aGUgY2xhc3MgY2hhbmdlcy4KLQkJCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBlamJKYXIsIGJlYW4pOyAvLyB2YWxpZGF0ZSB0aGUga2V5IGNsYXNzIHNpbmNlIHRoYXQgbWVzc2FnZSBpcyByZWdpc3RlcmVkIGFnYWluc3QgZWpiLWphci54bWwKLQkJfQotCQljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQkJLyogdW5yZWFjaGFibGUgY2F0Y2ggYmxvY2sKLQkJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIElmIHRoZXJlJ3MgYSBwcm9ibGVtLCBwcm9jZWVkIHdpdGggdGhlIG5leHQgYmVhbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvckNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXXtBcmNoaXZlQ29uc3RhbnRzLkVKQkpBUl9FWFRFTlNJT05TX1NIT1JUX05BTUUsIGJlYW5OYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FUiwgZXhjKTsKLQkJCX0KLQkJfQotCQkqLwotCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQkvLyBJZiB0aGVyZSdzIGEgcHJvYmxlbSwgcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGJlYW4uCi0JCQlTdHJpbmcgc3VwZXJUeXBlTmFtZSA9IGdldEVKQkluaGVyaXRhbmNlRmlsZU5hbWUoKTsKLQkJCWlmKHN1cGVyVHlwZU5hbWUgPT0gbnVsbCkKLQkJCSAgc3VwZXJUeXBlTmFtZSA9ICJ1bmtub3duIHN1cGVyIHR5cGUiOyAvLyROT04tTkxTLTEkCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tde3N1cGVyVHlwZU5hbWUsIGJlYW4uZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkvLyBUaGUgSmF2YSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUgbXVzdCBtYXRjaCB0aGUgRUpCIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KLQkJLy8gZS5nLiBpZiBFSkIgQiBpcyBhIGNoaWxkIG9mIEVKQiBBLCB0aGVuIGNsYXNzIEIgbXVzdCBiZSBhIGNoaWxkIG9mIGNsYXNzIEEuCi0JCS8vIEIgY291bGQgYmUgYSBncmFuZGNoaWxkIChvciBncmVhdC1ncmFuZGNoaWxkIG9yIC4uLikgb2YgQS4KLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYoIWJlYW4uaXNFbnRpdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUphdmFDbGFzcyB0aGlzS2V5ID0gKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRLZXkgPSBudWxsOwotCQlpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKLQkJCS8vIGNoZWNrIHRoaXMgQ01QJ3Mgc3VwZXJ0eXBlCi0JCQkvLyBLZXkgYSBYY2hpbGQgb2YgcGFyZW50IEtleQotCQkJLy8gSW4gV1NBIEVKQiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSByb290IEVKQiBtdXN0IGRlZmluZSB0aGUga2V5LgotCQkJLy8gVGhlIGtleSBpcyB0aGUgc2FtZSBmb3IgYWxsIGNoaWxkIEVKQnMuCi0JCQlpZiAoc3VwZXJ0eXBlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJcGFyZW50S2V5ID0gKChFbnRpdHkpIHN1cGVydHlwZSkuZ2V0UHJpbWFyeUtleSgpOwotCi0JCQkJaWYgKCh0aGlzS2V5ID09IG51bGwpIHx8IChwYXJlbnRLZXkgPT0gbnVsbCkgfHwgIXRoaXNLZXkuZXF1YWxzKHBhcmVudEtleSkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7IGJlYW4uZ2V0TmFtZSgpLCBwYXJlbnRLZXkuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0vLwkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIHN1cGVydHlwZSwgcGFyZW50S2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMTFWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkphcjExVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjN2NmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMTFWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlamItamFyLnhtbCBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiAxNS4yLjUuMyBEZWNsYXJhdGlvbiBvZiBzZWN1cml0eSByb2xlcyByZWZlcmVuY2VkIGZyb20gdGhlIGJlYW4ncyBjb2RlCi0gKiBUaGUgQmVhbiBQcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgZGVjbGFyaW5nIGluIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50cyBvZiB0aGUgZGVwbG95LW1lbnQKLSAqIGRlc2NyaXB0b3IgYWxsIHRoZSBzZWN1cml0eSByb2xlIG5hbWVzIHVzZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLiBEZWNsYXJpbmcgdGhlIHNlY3VyaXR5IHJvbGVzCi0gKiByZWZlcmVuY2VzIGluIHRoZSBjb2RlIGFsbG93cyB0aGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIG9yIERlcGxveWVyIHRvIGxpbmsgdGhlIG5hbWVzIG9mIHRoZSBzZWN1cml0eQotICogcm9sZXMgdXNlZCBpbiB0aGUgY29kZSB0byB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBmb3IgYW4gYXNzZW1ibGVkIGFwcGxpY2F0aW9uIHRocm91Z2ggdGhlIHNlY3Utcml0eS0KLSAqIHJvbGUgZWxlbWVudHMuCi0gKiBUaGUgQmVhbiBQcm92aWRlciBtdXN0IGRlY2xhcmUgZWFjaCBzZWN1cml0eSByb2xlIHJlZmVyZW5jZWQgaW4gdGhlIGNvZGUgdXNpbmcgdGhlIHNlY3Utcml0eS0KLSAqIHJvbGUtcmVmIGVsZW1lbnQgYXMgZm9sbG93czoKLSAqICAgICAgRGVjbGFyZSB0aGUgbmFtZSBvZiB0aGUgc2VjdXJpdHkgcm9sZSB1c2luZyB0aGUgcm9sZS1uYW1lIGVsZW1lbnQuIFRoZSBuYW1lIG11c3QgYmUgdGhlCi0gKiBzZWN1cml0eSByb2xlIG5hbWUgdGhhdCBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBpc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZS1OYW1lKQotICogbWV0aG9kLgotICogICAgICBPcHRpb25hbDogUHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIGluIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50LgotICogQSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSwgaW5jbHVkaW5nIHRoZSBuYW1lIGRlZmluZWQgYnkgdGhlIHJvbGUtbmFtZSBlbGVtZW50LCBpcyBzY29wZWQgdG8gdGhlIHNlcy1zaW9uCi0gKiBvciBlbnRpdHkgYmVhbiBlbGVtZW50IHdob3NlIGRlY2xhcmF0aW9uIGNvbnRhaW5zIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50LgotICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGhvdyBhbiBlbnRlcnByaXNlIGJlYW4ncyByZWZlcmVuY2VzIHRvIHNlY3VyaXR5IHJvbGVzIGFyZSBkZWNsYXJlZCBpbgotICogdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqICAgIC4uLgotICogICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gKiAgICAgICAuLi4KLSAqICAgICAgIDxlbnRpdHk+Ci0gKiAgICAgICAgICA8ZWpiLW5hbWU+QWFyZHZhcmtQYXlyb2xsPC9lamItbmFtZT4KLSAqICAgICAgICAgIDxlamItY2xhc3M+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEJlYW48L2VqYi1jbGFzcz4KLSAqICAgICAgICAgIC4uLgotICogICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICogICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgotICogICAgICAgICAgICAgICAgIFRoaXMgc2VjdXJpdHkgcm9sZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgZW1wbG95ZWVzIG9mIHRoZSBwYXlyb2xsIGRlcGFydG1lbnQgd2hvIGFyZQotICogICAgICAgICAgICAgICAgIGFsbG93ZWQgdG8gdXBkYXRlIGVtcGxveWVlcycgc2FsYXJpZXMuCi0gKiAgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICogICAgICAgICAgICAgPHJvbGUtbmFtZT5wYXlyb2xsPC9yb2xlLW5hbWU+Ci0gKiAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICogICAgICAgICAgLi4uCi0gKiAgICAgICA8L2VudGl0eT4KLSAqICAgICAgIC4uLgotICogICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICogICAgLi4uCi0gKgotICogVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhYm92ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50ZXJwcmlzZSBiZWFuIEFhcmR2YXJrUGF5cm9sbCBtYWtlcyB0aGUKLSAqIHNlY3VyaXR5IGNoZWNrIHVzaW5nIGlzQ2FsbGVySW5Sb2xlKCJwYXlyb2xsIikgaW4gaXRzIGJ1c2luZXNzIG1ldGhvZC4KLSAqCi0gKgotICogMTUuMy4zIExpbmtpbmcgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzIHRvIHNlY3VyaXR5IHJvbGVzCi0gKiBJZiB0aGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIGRlZmluZXMgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgaGUKLSAqIG9yIHNoZSBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBsaW5raW5nIGFsbCB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzIGRlY2xhcmVkIGluIHRoZSBzZWN1LXJpdHktCi0gKiByb2xlLXJlZiBlbGVtZW50cyB0byB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLSAqIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgbGlua3MgZWFjaCBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSB0byBhIHNlY3VyaXR5IHJvbGUgdXNpbmcgdGhlIHJvbGUtbGluawotICogZWxlbWVudC4gVGhlIHZhbHVlIG9mIHRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbgotICogYSBzZWN1cml0eS1yb2xlIGVsZW1lbnQuCi0gKiBBIHJvbGUtbGluayBlbGVtZW50IG11c3QgYmUgdXNlZCBldmVuIGlmIHRoZSB2YWx1ZSBvZiByb2xlLW5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZQotICogcm9sZS1saW5rIHJlZmVyZW5jZS4KLSAqIFRoZSBmb2xsb3dpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIGV4YW1wbGUgc2hvd3MgaG93IHRvIGxpbmsgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIG5hbWVkCi0gKiBwYXlyb2xsIHRvIHRoZSBzZWN1cml0eSByb2xlIG5hbWVkIHBheXJvbGwtZGVwYXJ0bWVudC4KLSAqICAgIC4uLgotICogICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gKiAgICAgICAuLi4KLSAqICAgICAgIDxlbnRpdHk+Ci0gKiAgICAgICAgICA8ZWpiLW5hbWU+QWFyZHZhcmtQYXlyb2xsPC9lamItbmFtZT4KLSAqICAgICAgICAgIDxlamItY2xhc3M+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEJlYW48L2VqYi1jbGFzcz4KLSAqICAgICAgICAgIC4uLgotICogICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICogICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgotICogICAgICAgICAgICAgICAgVGhpcyByb2xlIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgIGVtcGxveWVlcyBvZiB0aGUgcGF5cm9sbCBkZXBhcnRtZW50LgotICogICAgICAgICAgICAgICAgTWVtYmVycyBvZiB0aGlzIHJvbGUgaGF2ZSBhY2Nlc3MgdG8KLSAqICAgICAgICAgICAgICAgIGFueW9uZSdzIHBheXJvbGwgcmVjb3JkLgotICoKLSAqICAgICAgICAgICAgICAgIFRoZSByb2xlIGhhcyBiZWVuIGxpbmtlZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgIHBheXJvbGwtZGVwYXJ0bWVudCByb2xlLgotICogICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgIDxyb2xlLW5hbWU+cGF5cm9sbDwvcm9sZS1uYW1lPgotICogICAgICAgICAgICAgPHJvbGUtbGluaz5wYXlyb2xsLWRlcGFydG1lbnQ8L3JvbGUtbGluaz4KLSAqICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gKiAgICAgICAgICAuLi4KLSAqICAgICAgIDwvZW50aXR5PgotICogICAgICAgLi4uCi0gKiAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0gKiAgICAuLi4KLSAqLwotcHVibGljIGNsYXNzIEVKQkphcjExVlJ1bGUgZXh0ZW5kcyBBVmFsaWRhdGlvblJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIER1cGxpY2F0ZXNUYWJsZSBfZWpiTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9FSkJKQVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfRUpCRVhUfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODE0LCBuZXcgU3RyaW5nW117Q0hLSjI4MTQgKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI1LCBuZXcgU3RyaW5nW117Q0hLSjI4MjUgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNiwgbmV3IFN0cmluZ1tde0NIS0oyODI2ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0MiwgbmV3IFN0cmluZ1tde0NIS0oyODQyICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDMsIG5ldyBTdHJpbmdbXXtDSEtKMjg0MyArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ0LCBuZXcgU3RyaW5nW117Q0hLSjI4NDQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NSwgbmV3IFN0cmluZ1tde0NIS0oyODQ1ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDYsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NiArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ3LCBuZXcgU3RyaW5nW117Q0hLSjI4NDcgKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODUwLCBuZXcgU3RyaW5nW117Q0hLSjI4NTAgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1MiwgbmV3IFN0cmluZ1tde0NIS0oyODUyfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODc1LCBuZXcgU3RyaW5nW117Q0hLSjI4NzUgKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODk1LCBuZXcgU3RyaW5nW117Q0hLSjI4OTUgKyBTUEVDfSk7Ci0JfQotCQotCXB1YmxpYyBFSkJKYXIxMVZSdWxlKCkgewotCQlfZWpiTmFtZSA9IG5ldyBEdXBsaWNhdGVzVGFibGUoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAxNS4zLjEgU2VjdXJpdHkgcm9sZXMKLQkgKiBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIGNhbiBkZWZpbmUgb25lIG9yIG1vcmUgc2VjdXJpdHkgcm9sZXMgaW4gCi0JICogdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciB0aGVuIGFzc2lnbnMgCi0JICogZ3JvdXBzIG9mIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMnIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzCi0JICogdG8gdGhlIHNlY3VyaXR5IHJvbGVzIHRvIGRlZmluZSB0aGUgc2VjdXJpdHkgdmlldyBvZiB0aGUgYXBwbGljYXRpb24uCi0JICogQmVjYXVzZSB0aGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIGRvZXMgbm90LCBpbiBnZW5lcmFsLCBrbm93IHRoZSAKLQkgKiBzZWN1cml0eSBlbnZpcm9ubWVudCBvZiB0aGUgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQsIHRoZSBzZWN1cml0eSAKLQkgKiByb2xlcyBhcmUgbWVhbnQgdG8gYmUgbG9naWNhbCByb2xlcyAob3IgYWN0b3JzKSwgZWFjaCByZXByZXNlbnRpbmcgCi0JICogYSB0eXBlIG9mIHVzZXIgdGhhdCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBhY2Nlc3MgcmlnaHRzIHRvIHRoZSAKLQkgKiBhcHBsaWNhdGlvbi4gVGhlIERlcGxveWVyIHRoZW4gYXNzaWducyB1c2VyIGdyb3VwcyBhbmQvb3IgdXNlciAKLQkgKiBhY2NvdW50cyBkZWZpbmVkIGluIHRoZSBvcGVyYXRpb25hbCBlbnZpcm9ubWVudCB0byB0aGUgc2VjdXJpdHkgcm9sZXMgCi0JICogZGVmaW5lZCBieSB0aGUgQXBwbGljYXRpb24gQXNzZW1ibGVyLgotCSAqICAgIERlZmluaW5nIHRoZSBzZWN1cml0eSByb2xlcyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIG9wdGlvbmFsIFsxN10KLQkgKiBmb3IgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlci4gIFRoZWlyIG9taXNzaW9uIGluIHRoZSBkZXBsb3ltZW50IAotCSAqIGRlc2NyaXB0b3IgbWVhbnMgdGhhdCB0aGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIGNob3NlIG5vdCB0byBwYXNzIGFueSAKLQkgKiBzZWN1cml0eSBkZXBsb3ltZW50IHJlbGF0ZWQgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBEZXBsb3llciBpbiB0aGUgCi0JICogZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIGlzIHJlc3BvbnNpYmxlIGZvciAKLQkgKiB0aGUgZm9sbG93aW5nOgotCSAqICAgIC0gRGVmaW5lIGVhY2ggc2VjdXJpdHkgcm9sZSB1c2luZyBhIHNlY3VyaXR5LXJvbGUgZWxlbWVudC4KLQkgKiAgICAtIFVzZSB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgdG8gZGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZWN1cml0eSByb2xlLgotCSAqICAgIC0gT3B0aW9uYWxseSwgdXNlIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHRvIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiBvZiAKLQkgKiAgICAgIGEgc2VjdXJpdHkgcm9sZS4KLQkgKiBUaGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBieSB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBhcmUgc2NvcGVkIHRvIAotCSAqIHRoZSBlamItamFyIGZpbGUgbGV2ZWwsIGFuZCBhcHBseSB0byBhbGwgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIAotCSAqIGVqYi1qYXIgZmlsZS4KLQkgKiBbMTddIElmIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgZG9lcyBub3QgZGVmaW5lIHNlY3VyaXR5IHJvbGVzIGluIHRoZSAKLQkgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHRoZSBEZXBsb3llciB3aWxsIGhhdmUgdG8gZGVmaW5lIHNlY3VyaXR5Ci0JICogcm9sZXMgYXQgZGVwbG95bWVudCB0aW1lLgotCSAqLi4uCi0JKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFzc2VtYmx5RGVzY3JpcHRvckVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVmFsaWRhdGUgdGhlIHNlY3VyaXR5IHJvbGVzLCBpZiB0aGV5J3JlIGRlZmluZWQgaW4gdGhlIGFzc2VtYmx5LWRlc2NyaXB0b3IuCi0JCWlmIChlamJKYXIgPT0gbnVsbCkgewotCQkJLy8gbm90aGluZyB0byB2YWxpZGF0ZQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyoqCi0JCSAqIE5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIGR1cGxpY2F0ZSByb2xlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZQotCQkgKiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGR1cGxpY2F0ZSBTZWN1cml0eVJvbGUgaW5zdGFuY2UuCi0JCSAqIChXaXRob3V0IHRoZSBpbnN0YW5jZSwgd2UgY2Fubm90IGdldCBsaW5lIG51bWJlcnMuKQotCQkgKgotCQkgKiBUaGlzIGNsYXNzIHdyYXBwZXJzIHRoZSBTZWN1cml0eVJvbCBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkJICogaW1wbGVtZW50aW9uIG9mIGVxdWFscyBjb21wYXJlcyB0aGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdpbGwKLQkJICogc3RpbGwgYmUgYWJsZSB0byBnZXQgdGhlIHJlZiBmcm9tIHRoZSBkdXBsaWNhdGUgbmFtZS4KLQkJICovCi0JCWNsYXNzIFJvbGVXcmFwcGVyIHsKLQkJCXByaXZhdGUgU2VjdXJpdHlSb2xlIF9yb2xlID0gbnVsbDsKLQotCQkJcHVibGljIFJvbGVXcmFwcGVyKFNlY3VyaXR5Um9sZSByb2xlKSB7Ci0JCQkJX3JvbGUgPSByb2xlOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFJvbGVXcmFwcGVyKSB7Ci0JCQkJCVJvbGVXcmFwcGVyIG90aGVyID0gKFJvbGVXcmFwcGVyKSBvOwotCQkJCQlyZXR1cm4gX3JvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0Um9sZSgpLmdldFJvbGVOYW1lKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTZWN1cml0eVJvbGUgZ2V0Um9sZSgpIHsKLQkJCQlyZXR1cm4gX3JvbGU7Ci0JCQl9Ci0JCX0KLQotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gZWpiSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlpZiAoYXNzZW1ibHlEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gdmFsaWRhdGUKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3Qgcm9sZXMgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0U2VjdXJpdHlSb2xlcygpOwotCQlpZiAocm9sZXMgIT0gbnVsbCkgewotCQkJRHVwbGljYXRlc1RhYmxlIHJvbGVOYW1lcyA9IG5ldyBEdXBsaWNhdGVzVGFibGUoKTsKLQkJCVNlY3VyaXR5Um9sZSByb2xlID0gbnVsbDsKLQkJCUl0ZXJhdG9yIHJvbGVJdCA9IHJvbGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAocm9sZUl0Lmhhc05leHQoKSkgewotCQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQkJLy8gQ2hlY2sgdGhhdCB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgaGFzIGJlZW4gc2V0Ci0JCQkJcm9sZSA9IChTZWN1cml0eVJvbGUpIHJvbGVJdC5uZXh0KCk7Ci0JCQkJaWYgKHJvbGUgPT0gbnVsbCkgewotCQkJCQkvLyByb2xlLW5hbWUgbm90IHNldAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWpiSmFyLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKCFyb2xlLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKSkpIHx8IChyb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyByb2xlLW5hbWUgbm90IHNldAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgcm9sZSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBCdWlsZCB1cCBoYXNodGFibGUgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZSByb2xlLW5hbWVzLgotCQkJCQlyb2xlTmFtZXMuYWRkKG5ldyBSb2xlV3JhcHBlcihyb2xlKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDaGVjayB0aGF0IHRoZXJlIGFyZSBubyBkdXBsaWNhdGUgcm9sZS1uYW1lcy4gKDE1LjMuMSkKLQkJCWlmIChyb2xlTmFtZXMuY29udGFpbnNEdXBsaWNhdGVzKCkpIHsKLQkJCQlMaXN0IGR1cGxpY2F0ZXMgPSByb2xlTmFtZXMuZ2V0RHVwbGljYXRlcygpOwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZHVwbGljYXRlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsICgoUm9sZVdyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0Um9sZSgpLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyb2xlTmFtZXMuY2xlYXIoKTsKLQkJfQotCi0JCUxpc3QgbWV0aFRyYW5zID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFRyYW5zYWN0aW9ucygpOwotCQlNZXRob2RUcmFuc2FjdGlvbiBtdCA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWV0aFRyYW5zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJCXRyeSB7Ci0JCQkJbXQgPSAoTWV0aG9kVHJhbnNhY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCX0KLQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVIpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FUiwgZXhjKTsKLQkJCQl9Ci0JCQkJbXQgPSBudWxsOwotCQkJfQotCi0JCQlpZiAobXQgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRERWYWxpZGF0b3IudmFsaWRhdGVBc3NlbWJseURlc2NyaXB0b3JFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgibXQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gaGFzVmFsaWRNZXRob2QgPSB2YWxpZGF0ZU1ldGhvZEVsZW1lbnRzKHZjLCBlamJKYXIsIG10LmdldE1ldGhvZEVsZW1lbnRzKCkpOwotCQkJaWYgKCFoYXNWYWxpZE1ldGhvZCkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBtdCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCUxpc3QgbWV0aG9kUGVybWlzc2lvbnMgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kUGVybWlzc2lvbnMoKTsKLQkJaXRlcmF0b3IgPSBtZXRob2RQZXJtaXNzaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2RQZXJtaXNzaW9uIG1wID0gKE1ldGhvZFBlcm1pc3Npb24pIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJYm9vbGVhbiBoYXNWYWxpZE1ldGhvZCA9IHZhbGlkYXRlTWV0aG9kRWxlbWVudHModmMsIGVqYkphciwgbXAuZ2V0TWV0aG9kRWxlbWVudHMoKSk7Ci0JCQlpZiAoIWhhc1ZhbGlkTWV0aG9kKSB7Ci0JCQkJLy8gMTUuMy4yLCBwLiAyMjksIGEgPG1ldGhvZC1wZXJtaXNzaW9uPiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1ldGhvZCBsaXN0ZWQgKGFuZCB0aGF0IG1ldGhvZCBtdXN0IGJlIGZvdW5kKQotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBtcCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQotCQkJLy8gYXQgbGVhc3Qgb25lIHNlY3VyaXR5LXJvbGUgbXVzdCBiZSBkZWZpbmVkCi0JCQlMaXN0IG1wcm9sZXMgPSBtcC5nZXRSb2xlcygpOwotCQkJaWYgKChtcHJvbGVzID09IG51bGwpIHx8IChtcHJvbGVzLnNpemUoKSA9PSAwKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBtcCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHZhbGlkYXRlRGVwbG95bWVudERlc2NyaXB0b3IgaXMgY2FsbGVkIGlmIHRoZSBFSkJKYXIgY291bGQgbG9hZCwgd2hpY2ggbWVhbnMKLQkgKiB0aGF0IHRoZSBzeW50YXggb2YgdGhlIEpBUiBpcyAobW9zdGx5KSBjb3JyZWN0LgotCSAqCi0JICogRUpCIHNwZWMgMS4xLCBzZWN0aW9uIEMuNCwgIkFkZGVkIHRoZSByZXF1aXJlbWVudCBmb3IgdGhlIEJlYW4gUHJvdmlkZXIgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZQotCSAqIGVudGVycHJpc2UgYmVhbiB1c2VzIGEgYmVhbi1tYW5hZ2VkIG9yIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uLiIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpIHRhcmdldDsKLQkJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBlamJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZW50ZXJwcmlzZUJlYW5zLml0ZXJhdG9yKCk7Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSBudWxsOwotCQlTdHJpbmcgYmVhbk5hbWUgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl0cnkgewotCQkJCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlyZWdpc3Rlcih2YywgZWpiSmFyLCBiZWFuKTsKLQotCQkJCU9iamVjdCBpZCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfRU5URVJQUklTRUJFQU47Ci0JCQkJSVZhbGlkYXRpb25SdWxlIHZSdWxlID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlKHZjLCBpZCk7Ci0JCQkJaWYgKHZSdWxlID09IG51bGwpIHsKLQkJCQkJLy8gVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGxvZ2dlZCBieSB0aGUgQWJzdHJhY3RFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnksIHNvIGp1c3QKLQkJCQkJLy8gbmVlZCB0byBhZGQgIkNhbm5vdCB2YWxpZGF0ZSIgdG8gdGhlIHRhc2sgbGlzdC4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCXZSdWxlLnByZVZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCQkJCQl2UnVsZS52YWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCQkJdlJ1bGUucG9zdFZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCQkJCX0KLQkJCQljYXRjaCAoVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJLy8gQ2xlYW4gdXAgdGhlIG1lc3NhZ2VzIHdoaWNoIGFyZSBvbiB0aGUgdGFzayBsaXN0PyBPciBpcyBpdCBuaWNlciB0byBsZWF2ZSB0aGVtIGJlaGluZD8KLQkJCQl9Ci0JCQkJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJCWFkZEludGVybmFsRXJyb3JNZXNzYWdlKHZjLCBleGMpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5yZWxlYXNlKHZSdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCS8vIElmIHRoZXJlJ3MgYSBwcm9ibGVtLCBwcm9jZWVkIHdpdGggdGhlIG5leHQgYmVhbi4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tdIHsgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgYmVhbk5hbWUgfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gU2luY2UgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IgaXMgbm90IHNwZWNpZmljIHRvIGEgYmVhbiwgdmFsaWRhdGUgaXQgb25jZSwgYWZ0ZXIgYWxsIGJlYW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4KLQkJdmFsaWRhdGVBc3NlbWJseURlc2NyaXB0b3JFbGVtZW50KHZjLCBlamJKYXIpOwotCQl2YWxpZGF0ZVVuaXF1ZUVqYk5hbWVzKHZjLCBlamJKYXIpOwotCQl2YWxpZGF0ZUNsaWVudEpBUih2YywgZWpiSmFyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9lamJOYW1lLmNsZWFyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkvLyBUbyBjaGVjayBpZiBldmVyeSBiZWFuIG5hbWUgaXMgdW5pcXVlLCBuZWVkIHRvIGJ1aWxkIGEgbGlzdAotCQlfZWpiTmFtZS5hZGQobmV3IEVqYk5hbWVXcmFwcGVyKGJlYW4pKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBUaHJvd2FibGUgZXhjKSB7Ci0JCUlNZXNzYWdlIG1zc2cgPSB2Yy5nZXRNZXNzYWdlKCk7Ci0JCW1zc2cuc2V0SWQoSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDApOwotCQl2Yy5hZGRNZXNzYWdlKG1zc2cpOwotCi0JCWlmKGV4YyAhPSBudWxsKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlVW5pcXVlRWpiTmFtZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCUxpc3QgbmFtZXMgPSBfZWpiTmFtZS5nZXREdXBsaWNhdGVzKCk7Ci0JCWlmKG5hbWVzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFamJOYW1lV3JhcHBlciB3cmFwcGVyID0gKEVqYk5hbWVXcmFwcGVyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4OTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCB3cmFwcGVyLmdldEJlYW4oKSwgbmV3IFN0cmluZ1tde3dyYXBwZXIuZ2V0QmVhbigpLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ2xpZW50SkFSKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQlTdHJpbmcgY2xpZW50SkFSTmFtZSA9IGVqYkphci5nZXRFamJDbGllbnRKYXIoKTsKLQkJaWYoY2xpZW50SkFSTmFtZSA9PSBudWxsKSB7Ci0JCQkvLyBObyBjbGllbnQgSkFSIHNwZWNpZmllZDsgZXZlcnl0aGluZydzIG9rYXkuCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUJvb2xlYW4gZXhpc3RzID0gKEJvb2xlYW4pdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfQ0xJRU5USkFSLCBuZXcgT2JqZWN0W117Y2xpZW50SkFSTmFtZX0pOwotCQlpZihleGlzdHMgPT0gbnVsbCkgewotCQkJLy8gSGVscGVyIGRvZXNuJ3Qgc3VwcG9ydCBsb2FkIG1vZGVsLiBXQVM/Ci0JCQkvLyBDYW4ndCBwZXJmb3JtIHRoaXMgY2hlY2ssIHNvIGp1c3QgcmV0dXJuLgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZighZXhpc3RzLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODc1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGVqYkphciwgbmV3IFN0cmluZ1tde2NsaWVudEpBUk5hbWV9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCb3RoIHNlY3Rpb24gMTEuNC4xIGFuZCAxNS4zLjIgbmVlZCB0aGUgPG1ldGhvZD4gZWxlbWVudC4gQWxzbyByZWZlcgotCSAqIHRvIDE2LjUgZm9yIHN5bnRheC4KLQkgKgotCSAqIFJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgbWV0aG9kcyByZWZlcmVuY2VkIGJ5IHRoaXMgbGlzdCBvZiAKLQkgKiBNZXRob2RFbGVtZW50IGNhbiBiZSBmb3VuZC4KLQkqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlTWV0aG9kRWxlbWVudHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBMaXN0IGVsZW1lbnRzKSB7Ci0JCWlmICgoZWxlbWVudHMgPT0gbnVsbCkgfHwgKGVsZW1lbnRzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJYm9vbGVhbiBoYXNWYWxpZE1ldGhvZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gZWxlbWVudC5nZXRFbnRlcnByaXNlQmVhbigpOwotCQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCS8vIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyB0aGUgbWV0aG9kcyBvbiB0aGUgaG9tZSBvciByZW1vdGUgaW50ZXJmYWNlIGlmIHRoZXJlJwotCQkJCS8vIGJlZW4gYSBwcm9ibGVtIGxvY2F0aW5nIG9yIHJlZmxlY3RpbmcgdGhvc2UgdHlwZXMKLQkJCQlib29sZWFuIHJlZmxlY3RlZCA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlZmxlY3RlZCA9IGZhbHNlOwotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gKGUuZ2V0SmF2YUNsYXNzKCkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfSE9NRSA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBjbGFzc05hbWUgfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQlyZWZsZWN0ZWQgPSBmYWxzZTsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IChlLmdldEphdmFDbGFzcygpID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1JFTU9URSA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBjbGFzc05hbWUgfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQkKLQkJCQlpZihyZWZsZWN0ZWQpIHsKLQkJCQkJLy8gVGhlICJlbGVtZW50LmdldE1ldGhvZHMoKSIgaGFzIGEgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiB3aGVuIGl0IGF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZSBtZXRob2RzIGZyb20gdGhlIGhvbWUvcmVtb3RlIGludGVyZmFjZSwKLQkJCQkJLy8gaWYgZWl0aGVyIG9mIHRoZSBpbnRlcmZhY2VzIGRvbid0IGV4aXN0LgotCQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCi0JCQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBlbGVtZW50LmdldE1ldGhvZHMoKTsgLy8gZ2V0IGFsbCBtZXRob2RzIHdoaWNoIHdpbGwgYmUgcmV0cmlldmVkIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLXBlcm1pc3Npb24KLQkJCQkJYm9vbGVhbiBoYXNNZXRob2RzID0gKChtZXRob2RzICE9IG51bGwpICYmIChtZXRob2RzLmxlbmd0aCA+IDApKTsKLQotCQkJCQlpZiAoIWhhc01ldGhvZHMpIHsKLQkJCQkJCS8vIHdhcm5pbmcKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCBuZXcgU3RyaW5nW10geyBiZWFuLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWhhc1ZhbGlkTWV0aG9kID0gdHJ1ZTsgLy8gYSA8bWV0aG9kLXBlcm1pc3Npb24+IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbWV0aG9kICgxNS4zLjIsIHAuMjI5KQotCQkJCQkJaWYgKG5hbWUuZXF1YWxzKCIqIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUxpc3QgcGFyYW1zID0gZWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLQkJCQkJCQlpZiAoKHBhcmFtcyAhPSBudWxsKSAmJiAocGFyYW1zLnNpemUoKSA+IDApKSB7Ci0JCQkJCQkJCS8vIHdhcm5pbmcKLQkJCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGVsZW1lbnQsIHRoaXMpOwotCQkJCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVycm9yCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGVsZW1lbnQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaGFzVmFsaWRNZXRob2Q7Ci0JfQotCQotCS8qKgotCSAqIE5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIGR1cGxpY2F0ZSBFSkIgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2UuCi0JICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JICoKLQkgKiBUaGlzIGNsYXNzIHdyYXBwZXJzIHRoZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JICovCi0JY2xhc3MgRWpiTmFtZVdyYXBwZXIgewotCQlwcml2YXRlIEVudGVycHJpc2VCZWFuIF9iZWFuID0gbnVsbDsKLQotCQlwdWJsaWMgRWpiTmFtZVdyYXBwZXIoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJX2JlYW4gPSBiZWFuOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVqYk5hbWVXcmFwcGVyKSB7Ci0JCQkJRWpiTmFtZVdyYXBwZXIgb3RoZXIgPSAoRWpiTmFtZVdyYXBwZXIpbzsKLQkJCQlpZigoX2JlYW4uZ2V0TmFtZSgpID09IG51bGwpICYmIChvdGhlci5nZXRCZWFuKCkuZ2V0TmFtZSgpID09IG51bGwpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmKF9iZWFuLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihvdGhlci5nZXRCZWFuKCkuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gX2JlYW4uZ2V0TmFtZSgpLmVxdWFscyhvdGhlci5nZXRCZWFuKCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWlmKChnZXRCZWFuKCkgIT0gbnVsbCkgJiYgKGdldEJlYW4oKS5nZXROYW1lKCkgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gZ2V0QmVhbigpLmdldE5hbWUoKS5oYXNoQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0QmVhbigpIHsKLQkJCXJldHVybiBfYmVhbjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJKYXIyMFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMjBWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWM3MmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJKYXIyMFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NdWx0aXBsaWNpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgRUpCSmFyMjBWUnVsZSBleHRlbmRzIEFWYWxpZGF0aW9uUnVsZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQlwcml2YXRlIER1cGxpY2F0ZXNUYWJsZSBfZWpiTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBEdXBsaWNhdGVzVGFibGUgX2FzTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBEdXBsaWNhdGVzVGFibGUgX3JlbGF0aW9uc2hpcE5hbWUgPSBudWxsOwotCXByaXZhdGUgRHVwbGljYXRlc1RhYmxlIF9yZWxhdGlvbnNoaXBSb2xlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX01FU1NBR0VfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VKQkVYVH07Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAwX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDBfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDBfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAwX1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDJfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMl9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMl9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDJfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwM19OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAzX05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAzX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwM19VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA0X05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDRfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDRfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODA0X1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDVfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNV9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNV9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDVfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNiwgbmV3IFN0cmluZ1tde0NIS0oyODA2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA3LCBuZXcgU3RyaW5nW117Q0hLSjI4MDcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDgsIG5ldyBTdHJpbmdbXXtDSEtKMjgwOCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwOSwgbmV3IFN0cmluZ1tde0NIS0oyODA5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODEwX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MTBfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTBfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODEwX1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTFfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMV9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxNCwgbmV3IFN0cmluZ1tde0NIS0oyODE0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODE2LCBuZXcgU3RyaW5nW117Q0hLSjI4MTYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTcsIG5ldyBTdHJpbmdbXXtDSEtKMjgxNytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxOCwgbmV3IFN0cmluZ1tde0NIS0oyODE4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODIwLCBuZXcgU3RyaW5nW117Q0hLSjI4MjArU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjEsIG5ldyBTdHJpbmdbXXtDSEtKMjgyMStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMiwgbmV3IFN0cmluZ1tde0NIS0oyODIyK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODIzLCBuZXcgU3RyaW5nW117Q0hLSjI4MjMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjQsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNSwgbmV3IFN0cmluZ1tde0NIS0oyODI1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI2LCBuZXcgU3RyaW5nW117Q0hLSjI4MjYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjcsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyOCwgbmV3IFN0cmluZ1tde0NIS0oyODI4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI5LCBuZXcgU3RyaW5nW117Q0hLSjI4MjkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzAsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMSwgbmV3IFN0cmluZ1tde0NIS0oyODMxK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMyLCBuZXcgU3RyaW5nW117Q0hLSjI4MzIrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNCwgbmV3IFN0cmluZ1tde0NIS0oyODM0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM1LCBuZXcgU3RyaW5nW117Q0hLSjI4MzUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzYsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNywgbmV3IFN0cmluZ1tde0NIS0oyODM3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM4LCBuZXcgU3RyaW5nW117Q0hLSjI4MzgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzksIG5ldyBTdHJpbmdbXXtDSEtKMjgzOStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0MSwgbmV3IFN0cmluZ1tde0NIS0oyODQxK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQyLCBuZXcgU3RyaW5nW117Q0hLSjI4NDIrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDMsIG5ldyBTdHJpbmdbXXtDSEtKMjg0MytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NCwgbmV3IFN0cmluZ1tde0NIS0oyODQ0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ1LCBuZXcgU3RyaW5nW117Q0hLSjI4NDUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDYsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NywgbmV3IFN0cmluZ1tde0NIS0oyODQ3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ4LCBuZXcgU3RyaW5nW117Q0hLSjI4NDgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTAsIG5ldyBTdHJpbmdbXXtDSEtKMjg1MCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1NCwgbmV3IFN0cmluZ1tde0NIS0oyODU0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU1LCBuZXcgU3RyaW5nW117Q0hLSjI4NTUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjg1NitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1NywgbmV3IFN0cmluZ1tde0NIS0oyODU3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU4LCBuZXcgU3RyaW5nW117Q0hLSjI4NTgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTksIG5ldyBTdHJpbmdbXXtDSEtKMjg1OStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg2MCwgbmV3IFN0cmluZ1tde0NIS0oyODYwK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODY2LCBuZXcgU3RyaW5nW117Q0hLSjI4NjYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NjcsIG5ldyBTdHJpbmdbXXtDSEtKMjg2NytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg2OCwgbmV3IFN0cmluZ1tde0NIS0oyODY4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODY5LCBuZXcgU3RyaW5nW117Q0hLSjI4NjkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjg3MStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg3MiwgbmV3IFN0cmluZ1tde0NIS0oyODcyK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODczLCBuZXcgU3RyaW5nW117Q0hLSjI4NzMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NzQsIG5ldyBTdHJpbmdbXXtDSEtKMjg3NCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg3NSwgbmV3IFN0cmluZ1tde0NIS0oyODc1ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4OTUsIG5ldyBTdHJpbmdbXXtDSEtKMjg5NStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1MiwgbmV3IFN0cmluZ1tde0NIS0oyODUyfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBFSkJKYXIyMFZSdWxlKCkgewotCQlfZWpiTmFtZSA9IG5ldyBEdXBsaWNhdGVzVGFibGUoKTsKLQkJX2FzTmFtZSA9IG5ldyBEdXBsaWNhdGVzVGFibGUoKTsKLQkJX3JlbGF0aW9uc2hpcE5hbWUgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCV9yZWxhdGlvbnNoaXBSb2xlTmFtZSA9IG5ldyBEdXBsaWNhdGVzVGFibGUoKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJLy8gRUpCSmFyIGRvZXNuJ3QgZGVwZW5kIG9uIGFueXRoaW5nIGVsc2UKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCSkFSOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQkvLyBTaW5jZSB0aGlzIHJ1bGUgZG9lc24ndCBkZXBlbmQgb24gYW5vdGhlciBydWxlLCB0aGlzCi0JCS8vIG1ldGhvZCAod2hpY2ggaXMgY2FsbGVkIG9uIGEgZGVwZW5kZW50IHJ1bGUpIHdpbGwgbmV2ZXIKLQkJLy8gYmUgY2FsbGVkLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJX2VqYk5hbWUuY2xlYXIoKTsKLQkJX2FzTmFtZS5jbGVhcigpOwotCQlfcmVsYXRpb25zaGlwTmFtZS5jbGVhcigpOwotCQlfcmVsYXRpb25zaGlwUm9sZU5hbWUuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbnRlcm5hbEVycm9yTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIFRocm93YWJsZSBleGMpIHsKLQkJSU1lc3NhZ2UgbXNzZyA9IHZjLmdldE1lc3NhZ2UoKTsKLQkJbXNzZy5zZXRJZChJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjkwMCk7Ci0JCXZjLmFkZE1lc3NhZ2UobXNzZyk7Ci0KLQkJaWYoZXhjICE9IG51bGwpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ1J1bGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgcnVsZUlkKSB7Ci0JCWxvZyh2YywgcnVsZUlkICsgIiA9IG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZSh2YywgbnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvZyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCWlmKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCSmFyMjBWUnVsZSAtIHZhbGlkYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5LnNldFRleHQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOjp2YWxpZGF0ZSgiICsgdGFyZ2V0UGFyZW50ICsgIiwgIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQl9Ci0JCQotCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcikgdGFyZ2V0OwotCQlMaXN0IGJlYW5zID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGJlYW5zLml0ZXJhdG9yKCk7Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl0cnkgewotCQkJCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCXJlZ2lzdGVyKHZjLCBlamJKYXIsIGJlYW4pOwotCQotCQkJCU9iamVjdCBpZCA9IG51bGw7CQkJCi0JCQkJc3dpdGNoKGJlYW4uZ2V0VmVyc2lvbklEKCkpIHsKLQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8wX0lEOgotCQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ6Ci0JCQkJCQlpZCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfRU5URVJQUklTRUJFQU47Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOgotCQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ6IAotCQkJCQkJaWQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VOVEVSUFJJU0VCRUFOOwotCQkJCQkJYnJlYWs7IAotCQkJCQlkZWZhdWx0OgotCQkJCQkJLy8gV2hhdCB2ZXJzaW9uIGlzIGl0IHRoZW4/Ci0JCQkJCQlpZihiZWFuIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgewotCQkJCQkJCXZhbGlkYXRlQ01QVmVyc2lvbkVsZW1lbnQodmMsIGVqYkphciwgKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBsb2cKLQkJCQkJCQlsb2codmMsICIhYmVhbi5pc1ZlcnNpb24xX1goKSAmJiAhYmVhbi5pc1ZlcnNpb24yX1goKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsKLQkJCQl9CQkJCSAKLQkJCQkKLQkJCQlJVmFsaWRhdGlvblJ1bGUgdlJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQlpZih2UnVsZSA9PSBudWxsKSB7Ci0JCQkJCWxvZ01pc3NpbmdSdWxlKHZjLCBpZCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQl2UnVsZS5wcmVWYWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCQkJdlJ1bGUudmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCQkJCXZSdWxlLnBvc3RWYWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCQl9Ci0JCQkJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJLy8gQ2xlYW4gdXAgdGhlIG1lc3NhZ2VzIHdoaWNoIGFyZSBvbiB0aGUgdGFzayBsaXN0PyBPciBpcyBpdCBuaWNlciB0byBsZWF2ZSB0aGVtIGJlaGluZD8KLQkJCQkJdGhyb3cgZXhjOwotCQkJCX0KLQkJCQljYXRjaChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZSh2YywgZXhjKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCUVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkucmVsZWFzZSh2UnVsZSk7Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCWNhdGNoKFZhbGlkYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gc29tZXRoaW5nIGdvZXMgd3JvbmcsIGp1c3QgcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGJlYW4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUsIGJlYW4uZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgYmVhbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFNpbmNlIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yIGlzIG5vdCBzcGVjaWZpYyB0byBhIGJlYW4sIHZhbGlkYXRlIGl0IG9uY2UsIGFmdGVyIGFsbCBiZWFuIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuCi0JCXZhbGlkYXRlQXNzZW1ibHlEZXNjcmlwdG9yRWxlbWVudCh2YywgZWpiSmFyKTsKLQkJLy9UT0RPIFRoZSBEYXRhc291cmNlIHZhbGlkYXRpb24gd2lsbCBiZSBkb25lIGJ5IHRoZSBleHRlbnNpb25zCi0JCXZhbGlkYXRlVW5pcXVlRWpiTmFtZXModmMsIGVqYkphcik7Ci0JCXZhbGlkYXRlVW5pcXVlQWJzdHJhY3RTY2hlbWFOYW1lcyh2YywgZWpiSmFyKTsKLQkJdmFsaWRhdGVSZWxhdGlvbnNoaXBzKHZjLCBlamJKYXIpOwotCQl2YWxpZGF0ZUNsaWVudEpBUih2YywgZWpiSmFyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCS8vIFRvIGNoZWNrIGlmIGV2ZXJ5IGJlYW4gbmFtZSBpcyB1bmlxdWUsIG5lZWQgdG8gYnVpbGQgYSBsaXN0Ci0JCV9lamJOYW1lLmFkZChuZXcgRWpiTmFtZVdyYXBwZXIoYmVhbikpOwotCQkKLQkJaWYoKGJlYW4gaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KSAmJiBiZWFuLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHsKLQkJCS8vIFRvIGNoZWNrIGlmIGV2ZXJ5IGJlYW4gbmFtZSBpcyB1bmlxdWUsIG5lZWQgdG8gYnVpbGQgYSBsaXN0Ci0JCQlfYXNOYW1lLmFkZChuZXcgQVNOYW1lV3JhcHBlcigoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNNUFZlcnNpb25FbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYoY21wLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ZlcnNpb24oKSkpIHsKLQkJCVN0cmluZyB2ZXJzaW9uID0gY21wLmdldFZlcnNpb24oKTsKLQkJCWlmKCEgKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1guZXF1YWxzKHZlcnNpb24pIHx8IENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1guZXF1YWxzKHZlcnNpb24pKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg3MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBjbXAsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JCQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBc3NlbWJseURlc2NyaXB0b3JFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFZhbGlkYXRlIHRoZSBzZWN1cml0eSByb2xlcywgaWYgdGhleSdyZSBkZWZpbmVkIGluIHRoZSBhc3NlbWJseS1kZXNjcmlwdG9yLgotCQlpZiAoZWpiSmFyID09IG51bGwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gdmFsaWRhdGUKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qKgotCQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgcm9sZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkJICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgU2VjdXJpdHlSb2xlIGluc3RhbmNlLgotCQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkJICoKLQkJICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgU2VjdXJpdHlSb2wgaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JCSAqIGltcGxlbWVudGlvbiBvZiBlcXVhbHMgY29tcGFyZXMgdGhlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aWxsCi0JCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JCSAqLwotCQljbGFzcyBSb2xlV3JhcHBlciB7Ci0JCQlwcml2YXRlIFNlY3VyaXR5Um9sZSBfcm9sZSA9IG51bGw7Ci0KLQkJCXB1YmxpYyBSb2xlV3JhcHBlcihTZWN1cml0eVJvbGUgcm9sZSkgewotCQkJCV9yb2xlID0gcm9sZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBSb2xlV3JhcHBlcikgewotCQkJCQlSb2xlV3JhcHBlciBvdGhlciA9IChSb2xlV3JhcHBlcikgbzsKLQkJCQkJcmV0dXJuIF9yb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKG90aGVyLmdldFJvbGUoKS5nZXRSb2xlTmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU2VjdXJpdHlSb2xlIGdldFJvbGUoKSB7Ci0JCQkJcmV0dXJuIF9yb2xlOwotCQkJfQotCQl9Ci0KLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJaWYgKGFzc2VtYmx5RGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkvLyBub3RoaW5nIHRvIHZhbGlkYXRlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IHJvbGVzID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZXMoKTsKLQkJaWYgKHJvbGVzICE9IG51bGwpIHsKLQkJCUR1cGxpY2F0ZXNUYWJsZSByb2xlTmFtZXMgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCQlTZWN1cml0eVJvbGUgcm9sZSA9IG51bGw7Ci0JCQlJdGVyYXRvciByb2xlSXQgPSByb2xlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHJvbGVJdC5oYXNOZXh0KCkpIHsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJCS8vIENoZWNrIHRoYXQgdGhlIHJvbGUtbmFtZSBlbGVtZW50IGhhcyBiZWVuIHNldAotCQkJCXJvbGUgPSAoU2VjdXJpdHlSb2xlKSByb2xlSXQubmV4dCgpOwotCQkJCWlmICgocm9sZSA9PSBudWxsKSB8fCAoIXJvbGUuZUlzU2V0KENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpKSkgfHwgKHJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJvbGUtbmFtZSBub3Qgc2V0Ci0JCQkJCWlmKHJvbGUgPT0gbnVsbCkgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJvbGUsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBhc3NlbWJseURlc2NyaXB0b3IsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQnVpbGQgdXAgaGFzaHRhYmxlIHRvIGNoZWNrIGZvciBkdXBsaWNhdGUgcm9sZS1uYW1lcy4KLQkJCQkJcm9sZU5hbWVzLmFkZChuZXcgUm9sZVdyYXBwZXIocm9sZSkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlIHJvbGUtbmFtZXMuICgxNS4zLjEpCi0JCQlpZiAocm9sZU5hbWVzLmNvbnRhaW5zRHVwbGljYXRlcygpKSB7Ci0JCQkJTGlzdCBkdXBsaWNhdGVzID0gcm9sZU5hbWVzLmdldER1cGxpY2F0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGR1cGxpY2F0ZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCAoKFJvbGVXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCkpLmdldFJvbGUoKSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJcm9sZU5hbWVzLmNsZWFyKCk7Ci0JCX0KLQotCQlMaXN0IG1ldGhUcmFucyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLQkJTWV0aG9kVHJhbnNhY3Rpb24gbXQgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1ldGhUcmFucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQl0cnkgewotCQkJCW10ID0gKE1ldGhvZFRyYW5zYWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGV4Yyk7Ci0JCQkJfQotCQkJCW10ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKG10ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQkphcjIwVlJ1bGUudmFsaWRhdGVBc3NlbWJseURlc2NyaXB0b3JFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgibXQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gaGFzVmFsaWRNZXRob2QgPSB2YWxpZGF0ZU1ldGhvZEVsZW1lbnRzKHZjLCBlamJKYXIsIG10LmdldE1ldGhvZEVsZW1lbnRzKCkpOwotCQkJaWYgKCFoYXNWYWxpZE1ldGhvZCkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBtdCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCUxpc3QgbWV0aG9kUGVybWlzc2lvbnMgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kUGVybWlzc2lvbnMoKTsKLQkJaXRlcmF0b3IgPSBtZXRob2RQZXJtaXNzaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2RQZXJtaXNzaW9uIG1wID0gKE1ldGhvZFBlcm1pc3Npb24pIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJYm9vbGVhbiBoYXNWYWxpZE1ldGhvZCA9IHZhbGlkYXRlTWV0aG9kRWxlbWVudHModmMsIGVqYkphciwgbXAuZ2V0TWV0aG9kRWxlbWVudHMoKSk7Ci0JCQlpZiAoIWhhc1ZhbGlkTWV0aG9kKSB7Ci0JCQkJLy8gMTUuMy4yLCBwLiAyMjksIGEgPG1ldGhvZC1wZXJtaXNzaW9uPiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1ldGhvZCBsaXN0ZWQgKGFuZCB0aGF0IG1ldGhvZCBtdXN0IGJlIGZvdW5kKQotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBtcCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQotCQkJLy8gYXQgbGVhc3Qgb25lIHNlY3VyaXR5LXJvbGUgbXVzdCBiZSBkZWZpbmVkCi0JCQlMaXN0IG1wcm9sZXMgPSBtcC5nZXRSb2xlcygpOwotCQkJaWYgKCgobXByb2xlcyA9PSBudWxsKSB8fCAobXByb2xlcy5zaXplKCkgPT0gMCkpICYmICghbXAuaXNTZXRVbmNoZWNrZWQoKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgbXAsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVVuaXF1ZUFic3RyYWN0U2NoZW1hTmFtZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCUxpc3QgbmFtZXMgPSBfYXNOYW1lLmdldER1cGxpY2F0ZXMoKTsKLQkJaWYobmFtZXMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuYW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUFTTmFtZVdyYXBwZXIgd3JhcHBlciA9IChBU05hbWVXcmFwcGVyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg1NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCB3cmFwcGVyLmdldEJlYW4oKSwgbmV3IFN0cmluZ1tde3dyYXBwZXIuZ2V0QmVhbigpLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVW5pcXVlRWpiTmFtZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCUxpc3QgbmFtZXMgPSBfZWpiTmFtZS5nZXREdXBsaWNhdGVzKCk7Ci0JCWlmKG5hbWVzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFamJOYW1lV3JhcHBlciB3cmFwcGVyID0gKEVqYk5hbWVXcmFwcGVyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4OTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCB3cmFwcGVyLmdldEJlYW4oKSwgbmV3IFN0cmluZ1tde3dyYXBwZXIuZ2V0QmVhbigpLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVsYXRpb25zaGlwcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJUmVsYXRpb25zaGlwcyByZWxhdGlvbnNoaXBzID0gZWpiSmFyLmdldFJlbGF0aW9uc2hpcExpc3QoKTsKLQkJaWYocmVsYXRpb25zaGlwcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3QgZWpiUmVsYXRpb25MaXN0ID0gcmVsYXRpb25zaGlwcy5nZXRFamJSZWxhdGlvbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlamJSZWxhdGlvbkxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFSkJSZWxhdGlvbiByZWxhdGlvbiA9IChFSkJSZWxhdGlvbilpdGVyYXRvci5uZXh0KCk7Ci0JCQkKLQkJCV9yZWxhdGlvbnNoaXBOYW1lLmFkZChuZXcgRUpCUmVsYXRpb25OYW1lV3JhcHBlcihyZWxhdGlvbikpOwotCQkJCi0JCQlib29sZWFuIGF0TGVhc3RPbmVDbXJGaWVsZEV4aXN0cyA9IGZhbHNlOwotCQkJTGlzdCByb2xlcyA9IHJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JCQlJdGVyYXRvciByb2xlSXRlcmF0b3IgPSByb2xlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUocm9sZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IChFSkJSZWxhdGlvbnNoaXBSb2xlKXJvbGVJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJX3JlbGF0aW9uc2hpcFJvbGVOYW1lLmFkZChuZXcgRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyKHJvbGUpKTsKLQotCQkJCWJvb2xlYW4gdmFsaWRNdWx0aXBsaWNpdHkgPSByb2xlLmlzU2V0TXVsdGlwbGljaXR5KCk7Ci0JCQkJaWYoIXZhbGlkTXVsdGlwbGljaXR5KSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjgxOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHJvbGUsIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkKLQkJCQkvLyAxMC4zLjQuMiAKLQkJCQkvLyBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotCQkJCS8vIGVsZW1lbnQgY29udGFpbmVkIGluIGFuIGVqYi1yZWxhdGlvbiBlbGVtZW50IGlmIHRoZSAqb3RoZXIqIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotCQkJCS8vIGVsZW1lbnQgaW4gdGhlIHNhbWUgZWpiLXJlbGF0aW9uIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4KLQkJCQlFSkJSZWxhdGlvbnNoaXBSb2xlIG9wcG9zaXRlUm9sZSA9IHJvbGUuZ2V0T3Bwb3NpdGUoKTsKLQkJCQlpZihyb2xlLmlzU2V0Q2FzY2FkZURlbGV0ZSgpKSB7Ci0JCQkJCWJvb2xlYW4gaXNPdGhlck11bHRpcGxpY2l0eU9uZSA9ICgob3Bwb3NpdGVSb2xlLmlzU2V0TXVsdGlwbGljaXR5KCkpICYmIChvcHBvc2l0ZVJvbGUuZ2V0TXVsdGlwbGljaXR5KCkuZ2V0VmFsdWUoKSA9PSBNdWx0aXBsaWNpdHlLaW5kLk9ORSkpOwotCQkJCQlpZighaXNPdGhlck11bHRpcGxpY2l0eU9uZSkgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODQ4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcm9sZSwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCUNNUkZpZWxkIGNtckZpZWxkID0gcm9sZS5nZXRDbXJGaWVsZCgpOwotCQkJCWlmKGNtckZpZWxkICE9IG51bGwpIHsKLQkJCQkJYXRMZWFzdE9uZUNtckZpZWxkRXhpc3RzID0gdHJ1ZTsKLQkJCQkJaWYoY21yRmllbGQuZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldENNUkZpZWxkX0NvbGxlY3Rpb25UeXBlKCkpKSB7Ci0JCQkJCQlTdHJpbmcgY21yRmllbGRUeXBlID0gY21yRmllbGQuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCk7Ci0JCQkJCQlpZigoIUlUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfQ09MTEVDVElPTi5lcXVhbHMoY21yRmllbGRUeXBlKSkgJiYKLQkJCQkJCQkoIUlUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfU0VULmVxdWFscyhjbXJGaWVsZFR5cGUpKSkgewotCQkJCQkJCS8vIENIS0oyODY4OiBUaGUgdmFsdWUgb2YgdGhlIDxjbXItZmllbGQtdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiamF2YS51dGlsLkNvbGxlY3Rpb24iIG9yICJqYXZhLnV0aWwuU2V0IiAoRUpCIDIuMDogMTAuMy4xMywgMjIuNSkuCi0JCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODY4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcm9sZSwgdGhpcyk7Ci0JCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlSb2xlU291cmNlIHNvdXJjZVJvbGVTb3VyY2UgPSByb2xlLmdldFNvdXJjZSgpOwotCQkJCWlmKHNvdXJjZVJvbGVTb3VyY2UgPT0gbnVsbCkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MjEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCByb2xlLCBuZXcgU3RyaW5nW117cm9sZS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJRW50aXR5IHNvdXJjZUVudGl0eSA9IHNvdXJjZVJvbGVTb3VyY2UuZ2V0RW50aXR5QmVhbigpOwotCQkJCWlmKHNvdXJjZUVudGl0eSA9PSBudWxsKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjgyMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHJvbGUsIG5ldyBTdHJpbmdbXXtyb2xlLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIGlmKHNvdXJjZUVudGl0eS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQkvLyBDSEtKMjg2NjogPGNtci1maWVsZD4gezB9IG11c3QgYmUgZGVmaW5lZCBvbiB7MX0gKEVKQiAyLjA6IDIyLjUpLgotCQkJCQlpZihjbXJGaWVsZCAhPSBudWxsKSB7Ci0JCQkJCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KXNvdXJjZUVudGl0eTsKLQkJCQkJCUxpc3QgY21yRmllbGRzID0gY21wLmdldENNUkZpZWxkcygpOwotCQkJCQkJYm9vbGVhbiBmb3VuZF9jbXJGaWVsZCA9IGZhbHNlOwotCQkJCQkJaWYoKGNtckZpZWxkcyAhPSBudWxsKSAmJiAoY21yRmllbGRzLnNpemUoKSA+IDApKSB7Ci0JCQkJCQkJZm91bmRfY21yRmllbGQgPSBjbXJGaWVsZHMuY29udGFpbnMoY21yRmllbGQpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZighZm91bmRfY21yRmllbGQpIHsKLQkJCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NjYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCByb2xlLCBuZXcgU3RyaW5nW117Y21yRmllbGQuZ2V0TmFtZSgpLCBzb3VyY2VFbnRpdHkuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQ0hLSjI4NzE6IDxlamItbmFtZT4gezB9IG11c3QgcmVmZXIgdG8gYSBDTVAgYmVhbiAoRUpCIDIuMDogMTAuMy4yLCAxMC4zLjEzKS4KLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODcxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcm9sZSwgbmV3IFN0cmluZ1tde3NvdXJjZUVudGl0eS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoIG9wcG9zaXRlUm9sZSA9PSBudWxsICkKLQkJCQkJY29udGludWU7Ci0JCQkJUm9sZVNvdXJjZSBvcHBvc2l0ZVJvbGVTb3VyY2UgPSBvcHBvc2l0ZVJvbGUuZ2V0U291cmNlKCk7Ci0JCQkJaWYob3Bwb3NpdGVSb2xlU291cmNlID09IG51bGwpIHsKLQkJCQkJLy8gRG8gbm90IGVtaXQgYW4gZXJyb3IgbWVzc2FnZSAtIHdoZW4gd2UgaXRlcmF0ZSB0byB0aGUgcm9sZSB3aGVyZQotCQkJCQkvLyB0aGlzIGlzIHRoZSBzb3VyY2UsIHRoaXMgZXJyb3Igd2lsbCBiZSBkZXRlY3RlZC4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJRW50aXR5IHRhcmdldEVudGl0eSA9IG9wcG9zaXRlUm9sZVNvdXJjZS5nZXRFbnRpdHlCZWFuKCk7Ci0JCQkJaWYodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKLQkJCQkJLy8gRG8gbm90IGVtaXQgYW4gZXJyb3IgbWVzc2FnZSAtIHdoZW4gd2UgaXRlcmF0ZSB0byB0aGUgcm9sZSB3aGVyZQotCQkJCQkvLyB0aGlzIGlzIHRoZSBzb3VyY2UsIHRoaXMgZXJyb3Igd2lsbCBiZSBkZXRlY3RlZC4KLQkJCQl9Ci0JCQkJZWxzZSBpZih0YXJnZXRFbnRpdHkuZ2V0TG9jYWxJbnRlcmZhY2UoKSA9PSBudWxsKSB7Ci0JCQkJCS8vIERvZXMgdGhlIHRhcmdldCBvZiB0aGlzIHJvbGUgaGF2ZSBhIGxvY2FsIGludGVyZmFjZT8KLQkJCQkJLy8gQ0hLSjI4Njc6IFRoaXMgYmVhbiBjYW4gaGF2ZSBvbmx5IHVuaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdG8gb3RoZXIgYmVhbnMgKEVKQiAyLjA6IDEwLjMuMikuCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg2NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIG9wcG9zaXRlUm9sZSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBWZXJpZnkgdW5pcXVlIHJvbGUgbmFtZXMgd2l0aGluIHRoZSA8ZWpiLXJlbGF0aW9uPgotCQkJdmFsaWRhdGVVbmlxdWVSZWxhdGlvbnNoaXBSb2xlTmFtZXModmMsIGVqYkphcik7Ci0JCQlfcmVsYXRpb25zaGlwUm9sZU5hbWUuY2xlYXIoKTsKLQkJCQotCQkJaWYoIWF0TGVhc3RPbmVDbXJGaWVsZEV4aXN0cykgewotCQkJCS8vIENIS0oyODY5STogQXQgbGVhc3Qgb25lIDxlamItcmVsYXRpb25zaGlwLXJvbGU+IG11c3QgZGVmaW5lIGEgPGNtci1maWVsZD4gKEVKQiAyLjA6IDEwLjMuMiwgMTAuMy4xMywgMjIuNSkuCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODY5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcmVsYXRpb24sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXZhbGlkYXRlVW5pcXVlUmVsYXRpb25OYW1lcyh2YywgZWpiSmFyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVVbmlxdWVSZWxhdGlvbk5hbWVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQlMaXN0IG5hbWVzID0gX3JlbGF0aW9uc2hpcE5hbWUuZ2V0RHVwbGljYXRlcygpOwotCQlpZihuYW1lcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRUpCUmVsYXRpb25OYW1lV3JhcHBlciB3cmFwcGVyID0gKEVKQlJlbGF0aW9uTmFtZVdyYXBwZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODE2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgd3JhcHBlci5nZXRSZWxhdGlvbigpLCBuZXcgU3RyaW5nW117d3JhcHBlci5nZXRSZWxhdGlvbigpLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVVuaXF1ZVJlbGF0aW9uc2hpcFJvbGVOYW1lcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJTGlzdCBuYW1lcyA9IF9yZWxhdGlvbnNoaXBSb2xlTmFtZS5nZXREdXBsaWNhdGVzKCk7Ci0JCWlmKG5hbWVzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIgd3JhcHBlciA9IChFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODE3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgd3JhcHBlci5nZXRSZWxhdGlvbnNoaXBSb2xlKCksIG5ldyBTdHJpbmdbXXt3cmFwcGVyLmdldFJlbGF0aW9uc2hpcFJvbGUoKS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQm90aCBzZWN0aW9uIDExLjQuMSBhbmQgMTUuMy4yIG5lZWQgdGhlIDxtZXRob2Q+IGVsZW1lbnQuIEFsc28gcmVmZXIKLQkgKiB0byAxNi41IGZvciBzeW50YXguCi0JICoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIG1ldGhvZHMgcmVmZXJlbmNlZCBieSB0aGlzIGxpc3Qgb2YgCi0JICogTWV0aG9kRWxlbWVudCBjYW4gYmUgZm91bmQuCi0JKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZU1ldGhvZEVsZW1lbnRzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgTGlzdCBlbGVtZW50cykgewotCQlpZiAoKGVsZW1lbnRzID09IG51bGwpIHx8IChlbGVtZW50cy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWJvb2xlYW4gaGFzVmFsaWRNZXRob2QgPSBmYWxzZTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IGVsZW1lbnQuZ2V0RW50ZXJwcmlzZUJlYW4oKTsKLQkJCWlmIChiZWFuID09IG51bGwpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODE0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWxlbWVudCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCi0JCQkJTWV0aG9kW10gbWV0aG9kcyA9IGVsZW1lbnQuZ2V0TWV0aG9kcygpOyAvLyBnZXQgYWxsIG1ldGhvZHMgd2hpY2ggd2lsbCBiZSByZXRyaWV2ZWQgZm9yIHRoZSBnaXZlbiBtZXRob2QtcGVybWlzc2lvbgotCQkJCWJvb2xlYW4gaGFzTWV0aG9kcyA9ICgobWV0aG9kcyAhPSBudWxsKSAmJiAobWV0aG9kcy5sZW5ndGggPiAwKSk7Ci0KLQkJCQlpZiAoIWhhc01ldGhvZHMpIHsKLQkJCQkJLy8gd2FybmluZwotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWxlbWVudCwgbmV3IFN0cmluZ1tdIHsgYmVhbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWhhc1ZhbGlkTWV0aG9kID0gdHJ1ZTsgLy8gYSA8bWV0aG9kLXBlcm1pc3Npb24+IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbWV0aG9kICgxNS4zLjIsIHAuMjI5KQotCQkJCQlpZiAobmFtZS5lcXVhbHMoIioiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlMaXN0IHBhcmFtcyA9IGVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0JCQkJCQlpZiAoKHBhcmFtcyAhPSBudWxsKSAmJiAocGFyYW1zLnNpemUoKSA+IDApKSB7Ci0JCQkJCQkJLy8gd2FybmluZwotCQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCB0aGlzKTsKLQkJCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZXJyb3IKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgZWxlbWVudCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBoYXNWYWxpZE1ldGhvZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNsaWVudEpBUihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJU3RyaW5nIGNsaWVudEpBUk5hbWUgPSBlamJKYXIuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCWlmKGNsaWVudEpBUk5hbWUgPT0gbnVsbCkgewotCQkJLy8gTm8gY2xpZW50IEpBUiBzcGVjaWZpZWQ7IGV2ZXJ5dGhpbmcncyBva2F5LgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlCb29sZWFuIGV4aXN0cyA9IChCb29sZWFuKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX0NMSUVOVEpBUiwgbmV3IE9iamVjdFtde2NsaWVudEpBUk5hbWV9KTsKLQkJaWYoZXhpc3RzID09IG51bGwpIHsKLQkJCS8vIEhlbHBlciBkb2Vzbid0IHN1cHBvcnQgbG9hZCBtb2RlbC4gV0FTPwotCQkJLy8gQ2FuJ3QgcGVyZm9ybSB0aGlzIGNoZWNrLCBzbyBqdXN0IHJldHVybi4KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoIWV4aXN0cy5ib29sZWFuVmFsdWUoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg3NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBlamJKYXIsIG5ldyBTdHJpbmdbXXtjbGllbnRKQVJOYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCWNsYXNzIEFTTmFtZVdyYXBwZXIgewotCQlwcml2YXRlIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgX2JlYW4gPSBudWxsOwotCi0JCXB1YmxpYyBBU05hbWVXcmFwcGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYmVhbikgewotCQkJX2JlYW4gPSBiZWFuOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEFTTmFtZVdyYXBwZXIpIHsKLQkJCQlBU05hbWVXcmFwcGVyIG90aGVyID0gKEFTTmFtZVdyYXBwZXIpbzsKLQkJCQlpZigoX2JlYW4uZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgPT0gbnVsbCkgJiYgKG90aGVyLmdldEJlYW4oKS5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSA9PSBudWxsKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihfYmVhbi5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihvdGhlci5nZXRCZWFuKCkuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiBfYmVhbi5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0QmVhbigpLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpZigoZ2V0QmVhbigpICE9IG51bGwpICYmIChnZXRCZWFuKCkuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gZ2V0QmVhbigpLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQkJfQotCi0JCXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldEJlYW4oKSB7Ci0JCQlyZXR1cm4gX2JlYW47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgRUpCIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZQotCSAqIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZHVwbGljYXRlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlLgotCSAqIChXaXRob3V0IHRoZSBpbnN0YW5jZSwgd2UgY2Fubm90IGdldCBsaW5lIG51bWJlcnMuKQotCSAqCi0JICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JICogaW1wbGVtZW50aW9uIG9mIGVxdWFscyBjb21wYXJlcyB0aGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdpbGwKLQkgKiBzdGlsbCBiZSBhYmxlIHRvIGdldCB0aGUgcmVmIGZyb20gdGhlIGR1cGxpY2F0ZSBuYW1lLgotCSAqLwotCWNsYXNzIEVqYk5hbWVXcmFwcGVyIHsKLQkJcHJpdmF0ZSBFbnRlcnByaXNlQmVhbiBfYmVhbiA9IG51bGw7Ci0KLQkJcHVibGljIEVqYk5hbWVXcmFwcGVyKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCV9iZWFuID0gYmVhbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBFamJOYW1lV3JhcHBlcikgewotCQkJCUVqYk5hbWVXcmFwcGVyIG90aGVyID0gKEVqYk5hbWVXcmFwcGVyKW87Ci0JCQkJaWYoKF9iZWFuLmdldE5hbWUoKSA9PSBudWxsKSAmJiAob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSA9PSBudWxsKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihfYmVhbi5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIF9iZWFuLmdldE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0QmVhbigpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpZigoZ2V0QmVhbigpICE9IG51bGwpICYmIChnZXRCZWFuKCkuZ2V0TmFtZSgpICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGdldEJlYW4oKS5nZXROYW1lKCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGVycHJpc2VCZWFuIGdldEJlYW4oKSB7Ci0JCQlyZXR1cm4gX2JlYW47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgcmVsYXRpb24gbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2UuCi0JICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JICoKLQkgKiBUaGlzIGNsYXNzIHdyYXBwZXJzIHRoZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JICovCi0JY2xhc3MgRUpCUmVsYXRpb25OYW1lV3JhcHBlciB7Ci0JCXByaXZhdGUgRUpCUmVsYXRpb24gX3JlbGF0aW9uID0gbnVsbDsKLQotCQlwdWJsaWMgRUpCUmVsYXRpb25OYW1lV3JhcHBlcihFSkJSZWxhdGlvbiByZWwpIHsKLQkJCV9yZWxhdGlvbiA9IHJlbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBFSkJSZWxhdGlvbk5hbWVXcmFwcGVyKSB7Ci0JCQkJRUpCUmVsYXRpb25OYW1lV3JhcHBlciBvdGhlciA9IChFSkJSZWxhdGlvbk5hbWVXcmFwcGVyKW87Ci0JCQkJaWYoKF9yZWxhdGlvbi5nZXROYW1lKCkgPT0gbnVsbCkgJiYgKG90aGVyLmdldFJlbGF0aW9uKCkuZ2V0TmFtZSgpID09IG51bGwpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmKF9yZWxhdGlvbi5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYob3RoZXIuZ2V0UmVsYXRpb24oKS5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiBfcmVsYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhvdGhlci5nZXRSZWxhdGlvbigpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpZigoZ2V0UmVsYXRpb24oKSAhPSBudWxsKSAmJiAoZ2V0UmVsYXRpb24oKS5nZXROYW1lKCkgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gZ2V0UmVsYXRpb24oKS5nZXROYW1lKCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJcHVibGljIEVKQlJlbGF0aW9uIGdldFJlbGF0aW9uKCkgewotCQkJcmV0dXJuIF9yZWxhdGlvbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIGR1cGxpY2F0ZSByZWxhdGlvbiBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkgKiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGR1cGxpY2F0ZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZS4KLQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkgKgotCSAqIFRoaXMgY2xhc3Mgd3JhcHBlcnMgdGhlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlIHNvIHRoYXQgdGhlIHdyYXBwZXIncwotCSAqIGltcGxlbWVudGlvbiBvZiBlcXVhbHMgY29tcGFyZXMgdGhlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aWxsCi0JICogc3RpbGwgYmUgYWJsZSB0byBnZXQgdGhlIHJlZiBmcm9tIHRoZSBkdXBsaWNhdGUgbmFtZS4KLQkgKi8KLQljbGFzcyBFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIgewotCQlwcml2YXRlIEVKQlJlbGF0aW9uc2hpcFJvbGUgX3JlbGF0aW9uc2hpcFJvbGUgPSBudWxsOwotCi0JCXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIoRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlKSB7Ci0JCQlfcmVsYXRpb25zaGlwUm9sZSA9IHJvbGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyKSB7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyIG90aGVyID0gKEVKQlJlbGF0aW9uc2hpcFJvbGVOYW1lV3JhcHBlcilvOwotCQkJCWlmKChfcmVsYXRpb25zaGlwUm9sZS5nZXRSb2xlTmFtZSgpID09IG51bGwpICYmIChvdGhlci5nZXRSZWxhdGlvbnNoaXBSb2xlKCkuZ2V0Um9sZU5hbWUoKSA9PSBudWxsKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihfcmVsYXRpb25zaGlwUm9sZS5nZXRSb2xlTmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIGlmKG90aGVyLmdldFJlbGF0aW9uc2hpcFJvbGUoKS5nZXRSb2xlTmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gX3JlbGF0aW9uc2hpcFJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0UmVsYXRpb25zaGlwUm9sZSgpLmdldFJvbGVOYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaWYoKGdldFJlbGF0aW9uc2hpcFJvbGUoKSAhPSBudWxsKSAmJiAoZ2V0UmVsYXRpb25zaGlwUm9sZSgpLmdldFJvbGVOYW1lKCkgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwUm9sZSgpLmdldFJvbGVOYW1lKCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0UmVsYXRpb25zaGlwUm9sZSgpIHsKLQkJCXJldHVybiBfcmVsYXRpb25zaGlwUm9sZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOTZiNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJWYWxpZGF0aW9uQ29udGV4dCBpbXBsZW1lbnRzIElFSkJWYWxpZGF0aW9uQ29udGV4dCB7Ci0JcHJpdmF0ZSBJVmFsaWRhdG9yIF92YWxpZGF0b3IgPSBudWxsOwotCXByaXZhdGUgSVZhbGlkYXRpb25Db250ZXh0IF9oZWxwZXIgPSBudWxsOwotCXByaXZhdGUgSVJlcG9ydGVyIF9yZXBvcnRlciA9IG51bGw7Ci0JcHJpdmF0ZSBMb2dFbnRyeSBsb2dFbnRyeSA9IG51bGw7Ci0vLwlwcml2YXRlIElNZXNzYWdlIF9tZXNzYWdlID0gbnVsbDsKLQkKLQlwdWJsaWMgRUpCVmFsaWRhdGlvbkNvbnRleHQoSVZhbGlkYXRvciB2LCBJVmFsaWRhdGlvbkNvbnRleHQgaCwgSVJlcG9ydGVyIHIpIHsKLQkJc2V0VmFsaWRhdG9yKHYpOwotCQlzZXRIZWxwZXIoaCk7Ci0JCXNldFJlcG9ydGVyKHIpOwotCX0KLQkKLQlwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSVZhbGlkYXRvciB2KSB7Ci0JCV92YWxpZGF0b3IgPSB2OwotCX0KLQkKLQlwdWJsaWMgSVZhbGlkYXRpb25Db250ZXh0IGdldEhlbHBlcigpIHsKLQkJcmV0dXJuIF9oZWxwZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihJVmFsaWRhdGlvbkNvbnRleHQgaCkgewotCQlfaGVscGVyID0gaDsKLQl9Ci0JCi0JcHVibGljIElSZXBvcnRlciBnZXRSZXBvcnRlcigpIHsKLQkJcmV0dXJuIF9yZXBvcnRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0ZXIoSVJlcG9ydGVyIHIpIHsKLQkJX3JlcG9ydGVyID0gcjsKLQl9Ci0JCi0gCS8qCi0gCSAqIFJldHVybnMgYW4gZW1wdHkgTWVzc2FnZSB3aGljaCBjYW4gYmUgcmV1c2VkLgotIAkgKi8KLSAJcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoKSB7Ci0gCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKLSAJCW1lc3NhZ2Uuc2V0QnVuZGxlTmFtZShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FKTsKLSAJCXJldHVybiBtZXNzYWdlOwotIAkJLyoKLSAJCWlmKF9tZXNzYWdlID09IG51bGwpIHsKLSAJCQlfbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7Ci0gCQl9Ci0gCQkKLSAJCXJlc2V0KF9tZXNzYWdlKTsKLSAJCV9tZXNzYWdlLnNldEJ1bmRsZU5hbWUoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSk7Ci0gCQkKLQkJcmV0dXJuIF9tZXNzYWdlOwotCQkqLwotCX0KLQkKLQkJLyoqCi0JICogSWYsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhbiBJTWVzc2FnZSBpcyByZXVzZWQgaW5zdGVhZCBvZiBjcmVhdGluZwotCSAqIGEgbmV3IG9uZSBlYWNoIHRpbWUsIHRoaXMgbWV0aG9kIHJlc2V0cyB0aGUgaW50ZXJuYWwgZmllbGRzIHRvIHRoZSBkZWZhdWx0LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZWFsbHkgYmUgb24gdGhlIElNZXNzYWdlIGltcGxlbWVudGF0aW9uIGl0c2VsZiwgYnV0Ci0JICogdGhpcydsbCBkbyBmb3Igbm93LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0KElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJbWVzc2FnZS5zZXRJZChudWxsKTsKLQkJbWVzc2FnZS5zZXRQYXJhbXMobnVsbCk7Ci0JCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoTWVzc2FnZUZpbHRlci5BTllfU0VWRVJJVFkpOwotCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChudWxsKTsKLQkJbWVzc2FnZS5zZXRCdW5kbGVOYW1lKG51bGwpOwotCQltZXNzYWdlLnNldEdyb3VwTmFtZShudWxsKTsKLQkJbWVzc2FnZS5zZXRMaW5lTm8oSU1lc3NhZ2UuTElORU5PX1VOU0VUKTsKLQkJbWVzc2FnZS5zZXRPZmZzZXQoSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKTsKLQkJbWVzc2FnZS5zZXRMZW5ndGgoSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKTsKLQl9Ci0JCi0JCi0JCi0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCXJldHVybiBMb2dnZXIuZ2V0TG9nZ2VyKElFSkJWYWxpZGF0b3JDb25zdGFudHMuSjJFRV9DT1JFX1BMVUdJTik7Ci0JfQotCQotCXB1YmxpYyBMb2dFbnRyeSBnZXRMb2dFbnRyeSgpIHsKLQkgICAgaWYobG9nRW50cnkgPT0gbnVsbCkKLQkgICAgICAgIGxvZ0VudHJ5ID0gbmV3IExvZ0VudHJ5KElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUpOwotCQlyZXR1cm4gbG9nRW50cnk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gZ2V0SGVscGVyKCkubG9hZE1vZGVsKHN5bWJvbGljTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm1zKSB7Ci0JCXJldHVybiBnZXRIZWxwZXIoKS5sb2FkTW9kZWwoc3ltYm9saWNOYW1lLCBwYXJtcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKCkgewotCQlnZXRSZXBvcnRlcigpLnJlbW92ZUFsbE1lc3NhZ2VzKGdldFZhbGlkYXRvcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZXMoT2JqZWN0IHRhcmdldCkgewotCQlnZXRSZXBvcnRlcigpLnJlbW92ZUFsbE1lc3NhZ2VzKGdldFZhbGlkYXRvcigpLCB0YXJnZXQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlcyhPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBJZGVudGlmaWVyKSB7Ci0JCWdldFJlcG9ydGVyKCkucmVtb3ZlTWVzc2FnZVN1YnNldChnZXRWYWxpZGF0b3IoKSwgdGFyZ2V0LCBncm91cElkZW50aWZpZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZ2V0UmVwb3J0ZXIoKS5hZGRNZXNzYWdlKGdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQpIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUsc2V2ZXJpdHksbWVzc2FnZUlkKTsKLQkJZ2V0UmVwb3J0ZXIoKS5hZGRNZXNzYWdlKGdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FLHNldmVyaXR5LG1lc3NhZ2VJZCxwYXJtcyk7Ci0JCWdldFJlcG9ydGVyKCkuYWRkTWVzc2FnZShnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0KSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSAgbmV3IE1lc3NhZ2UoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSxzZXZlcml0eSxtZXNzYWdlSWQsbnVsbCx0YXJnZXQpOwotCQlnZXRSZXBvcnRlcigpLmFkZE1lc3NhZ2UoZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXQpIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9ICBuZXcgTWVzc2FnZShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FLHNldmVyaXR5LG1lc3NhZ2VJZCxwYXJtcyx0YXJnZXQpOwotCQlnZXRSZXBvcnRlcigpLmFkZE1lc3NhZ2UoZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkvKioKLQkJICogMTEvMjgvMDUgQ29tbWVudGluZyB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZ2V0IHJpZCBvZiBXYXJuaW5nIG1lc3NhZ2UKLQkJICogUXVpdGUgcG9zc2libHkgdGhlIGdldFJvcG9ydGVyKCkuYWRkTWVzc2FnZSBuZWVkcyB0byBiZSB1c2VkLgotCQkgKiAKLQkJICovCi0JCQotCQkvL0lNZXNzYWdlIG1lc3NhZ2UgPSAgbmV3IE1lc3NhZ2UoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSxzZXZlcml0eSxtZXNzYWdlSWQsbnVsbCx0YXJnZXQsZ3JvdXBOYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FLHNldmVyaXR5LG1lc3NhZ2VJZCxwYXJtcyx0YXJnZXQsZ3JvdXBOYW1lKTsKLQkJZ2V0UmVwb3J0ZXIoKS5hZGRNZXNzYWdlKGdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVJZkNhbmNlbGxlZCgpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIHsKLQkJaWYoZ2V0UmVwb3J0ZXIoKS5pc0NhbmNlbGxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3VidGFzayhTdHJpbmcgbWVzc2FnZUlkKSB7Ci0JCXN1YnRhc2sobWVzc2FnZUlkLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3VidGFzayhTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcykgewotCQlpZigobWVzc2FnZUlkID09IG51bGwpIHx8IChtZXNzYWdlSWQuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKCk7Ci0JCW1lc3NhZ2Uuc2V0SWQobWVzc2FnZUlkKTsKLQkJbWVzc2FnZS5zZXRQYXJhbXMocGFybXMpOwotCQlnZXRSZXBvcnRlcigpLmRpc3BsYXlTdWJ0YXNrKGdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VVJJcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2MzNzNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogQ29yZSBFSkIgVmFsaWRhdGlvbiBydWxlcwotICovCi1wdWJsaWMgY2xhc3MgRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSBfaW5zdCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIGNvbnRleHRNYXAgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0KLQlwcml2YXRlIExvZ2dlciBsb2dnZXIgPSBudWxsOwotCQotCXB1YmxpYyBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkoKSB7Ci0JCWNyZWF0ZVJ1bGVMaXN0KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCWlmKF9pbnN0ID09IG51bGwpIHsKLQkJCV9pbnN0ID0gbmV3IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0JcHJvdGVjdGVkIExvZ2dlciBnZXRNc2dMb2dnZXIoKXsKLQkgICAgaWYobG9nZ2VyID09IG51bGwpCi0JICAgICAgICBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKElFSkJWYWxpZGF0b3JDb25zdGFudHMuSjJFRV9DT1JFX1BMVUdJTik7Ci0JICAgIHJldHVybiBsb2dnZXI7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVSdWxlTGlzdCgpIHsKLQkJX3J1bGVMaXN0ID0gbmV3IEhhc2hNYXAoKTsKLQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfRUpCSkFSLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5FSkJKYXIxMVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCSkFSLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5FSkJKYXIyMFZSdWxlKCkpOwotCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfRU5URVJQUklTRUJFQU4sIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkVudGVycHJpc2VCZWFuMTFWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VOVEVSUFJJU0VCRUFOLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5FbnRlcnByaXNlQmVhbjIwVlJ1bGUoKSk7Ci0JCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlU2Vzc2lvbkJlYW4oKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX1JFTU9URSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVTZXNzaW9uUmVtb3RlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9IT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZVNlc3Npb25Ib21lKCkpOwotCQkKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uU3RhdGVsZXNzU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9IT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlSG9tZVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUwsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlbGVzc1Nlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWxlc3NTZXNzaW9uTG9jYWxIb21lVlJ1bGUoKSk7Ci0JCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlZnVsU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlZnVsU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWZ1bFNlc3Npb25SZW1vdGVIb21lVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWZ1bFNlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTEhPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlZnVsU2Vzc2lvbkxvY2FsSG9tZVZSdWxlKCkpOwotCQkKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQ01QQmVhbigpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9SRU1PVEUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQ01QUmVtb3RlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0tFWUNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZUNNUEtleSgpKTsKLQkJCi0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5DTVBCZWFuQ2xhc3NWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9SRU1PVEUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNNUFJlbW90ZUNvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNNUFJlbW90ZUhvbWVWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTCwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQ01QTG9jYWxDb21wb25lbnRWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTEhPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNNUExvY2FsSG9tZVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0tFWUNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5DTVBLZXlDbGFzc1ZSdWxlKCkpOwotCQkKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQk1QQmVhbigpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9SRU1PVEUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQk1QUmVtb3RlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQk1QSG9tZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9LRVlDTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVCTVBLZXkoKSk7Ci0KLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkJNUEJlYW5DbGFzc1ZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX1JFTU9URSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQk1QUmVtb3RlQ29tcG9uZW50VlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQk1QUmVtb3RlSG9tZVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5CTVBMb2NhbENvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQk1QTG9jYWxIb21lVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkJNUEtleUNsYXNzVlJ1bGUoKSk7Ci0JCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfTUVTU0FHRV9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLk1lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZSgpKTsKLQkJCi0JCWFkZERlcGVuZGVudFJ1bGVUb1J1bGVMaXN0KCk7Ci0JCWxvZ0FsbERlcGVuZGVudFJ1bGVzKCk7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBJRmlsZURlbHRhIHJlcHJlc2VudHMgYSBzdGF0aWMgbG9hZCBtb2RlbCAoaS5lLiwgdGhlIGZpbGUgbmFtZSBpcyBhbHdheXMgdGhlIHNhbWUpLAotCSAqIHRoZW4gcmV0dXJuIHRoZSBJbnRlZ2VyIHdoaWNoIGxvYWRzIHRoYXQgbW9kZWwuIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgIE9iamVjdCBnZXRSdWxlSWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYoZmlsZU5hbWUgPT0gbnVsbCkgewotCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChhTG9nZ2VyICE9IG51bGwgJiYgYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGUgZnJvbSBmaWxlTmFtZTogIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlFSkJKYXIgZWpiSmFyID0gZ2V0RUpCSmFyKHZjKTsKLQotCQlpZihmaWxlTmFtZS5lbmRzV2l0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FKSkgewotCQkJaWYoZWpiSmFyLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQpIHsKLQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9FSkJKQVI7Ci0JCQl9Ci0JCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FSkJKQVI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7IC8vIG11c3QgYmUgYSBKYXZhQ2xhc3MKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIElGaWxlRGVsdGEgcmVwcmVzZW50cyBhIGR5bmFtaWMgbG9hZCBtb2RlbCAoaS5lLiwgdGhlIGZpbGUgbmFtZSBjYW4gYmUgY2hhbmdlZCBieSB0aGUKLQkgKiB1c2VyKSwgdGhlbiByZXR1cm4gdGhlIEludGVnZXIgd2hpY2ggbG9hZHMgdGhhdCBtb2RlbC4gUmV0dXJuIG51bGwgaWYgbm8gc3VjaCBtb2RlbCBleGlzdHMuCi0JICovCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRSdWxlSWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBKYXZhQ2xhc3MgY2xhenosIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJLy8gUmV0dXJuIHRoZSBydWxlIGlkIHdoaWNoIHdpbGwgdmFsaWRhdGUgdGhlIEphdmFDbGFzcyBhcyB0aGUgCi0JCS8vIHR5cGUgd2hpY2ggaXQgaXMgdXNlZCBhcyBieSB0aGUgRW50ZXJwcmlzZUJlYW4uCi0JCWlmKChjbGF6eiA9PSBudWxsKSB8fCAoYmVhbiA9PSBudWxsKSkgewotCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChhTG9nZ2VyICE9IG51bGwgJiYgYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGUgYmVjYXVzZSBlaXRoZXIgYmVhbiAoIiArIGJlYW4gKyAiKSBvciBjbGFzcyAoIiArIGNsYXp6ICsgIikgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkICAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJYm9vbGVhbiBpc1N0YXRlbGVzc1Nlc3Npb24gPSAoYmVhbi5pc1Nlc3Npb24oKSAmJiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTdGF0ZWxlc3MoYmVhbikpOwotCQlib29sZWFuIGlzU3RhdGVmdWxTZXNzaW9uID0gKGJlYW4uaXNTZXNzaW9uKCkgJiYgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU3RhdGVmdWwoYmVhbikpOwotCQkKLQkJaWYoYmVhbi5nZXRWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB7Ci0JCQlpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRFamJDbGFzcygpKSkgewotCQkJCWlmKGlzU3RhdGVsZXNzU2Vzc2lvbikgewotCQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIGlmKGlzU3RhdGVmdWxTZXNzaW9uKSB7Ci0JCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTUzsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1M7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUzsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzTWVzc2FnZURyaXZlbigpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX01FU1NBR0VfQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIgIT0gbnVsbCAmJiBhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjJfWCgpICYmIGNsYXp6LmVxdWFscyhiZWFuLmdldEVqYkNsYXNzKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGNsYXp6LmVxdWFscyhiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpKSkgewotCQkJCWlmKGlzU3RhdGVsZXNzU2Vzc2lvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9SRU1PVEU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoaXNTdGF0ZWZ1bFNlc3Npb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfUkVNT1RFOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9SRU1PVEU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24yX1goKSAmJiBjbGF6ei5lcXVhbHMoYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJaWYoaXNTdGF0ZWxlc3NTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoaXNTdGF0ZWZ1bFNlc3Npb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24yX1goKSAmJiBjbGF6ei5lcXVhbHMoYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoY2xhenouZXF1YWxzKGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJaWYoaXNTdGF0ZWxlc3NTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihpc1N0YXRlZnVsU2Vzc2lvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTEhPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjJfWCgpICYmIGNsYXp6LmVxdWFscyhiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGNsYXp6LmVxdWFscyhiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkpKSB7Ci0JCQkJaWYoaXNTdGF0ZWxlc3NTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMOwotCQkJCX0KLQkJCQllbHNlIGlmKGlzU3RhdGVmdWxTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUw7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUw7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMl9YKCkgJiYgY2xhenouZXF1YWxzKGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihiZWFuIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJaWYoY2xhenouZXF1YWxzKCgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKSkpIHsKLQkJCQkJaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuOwotCQkJCQkJLy8gSWYgaXQncyBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleSwgaXQncyBleGVtcHQgZnJvbSB0aGVzZSBjaGVja3MuCi0JCQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCkpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShjbXApKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1M7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0tFWUNMQVNTOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24yX1goKSAmJiBjbGF6ei5lcXVhbHMoKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjJfWCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVsc2UgaWYoYmVhbi5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEKSB7Ci0JCQlpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRFamJDbGFzcygpKSkgewotCQkJCWlmKGJlYW4uaXNTZXNzaW9uKCkpIHsKLQkJCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTUzsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMV9YKCkgJiYgY2xhenouZXF1YWxzKGJlYW4uZ2V0RWpiQ2xhc3MoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSkpIHsKLQkJCQlpZihiZWFuLmlzU2Vzc2lvbigpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fUkVNT1RFOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX1JFTU9URTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfUkVNT1RFOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMV9YKCkgJiYgY2xhenouZXF1YWxzKGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoY2xhenouZXF1YWxzKGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpKSkgewotCQkJCWlmKGJlYW4uaXNTZXNzaW9uKCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9IT01FOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24xX1goKSAmJiBjbGF6ei5lcXVhbHMoYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoYmVhbiBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCWlmKGNsYXp6LmVxdWFscygoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCkpKSB7Ci0JCQkJCWlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJCQkJCS8vIElmIGl0J3MgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXksIGl0J3MgZXhlbXB0IGZyb20gdGhlc2UgY2hlY2tzLgotCQkJCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHJpbWl0aXZlUHJpbWFyeUtleShjbXApKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0tFWUNMQVNTOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9LRVlDTEFTUzsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMV9YKCkgJiYgY2xhenouZXF1YWxzKCgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6ICFiZWFuLmlzVmVyc2lvbjFfWCgpICYmICFiZWFuLmlzVmVyc2lvbjJfWCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElWYWxpZGF0aW9uUnVsZSBnZXRSdWxlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHJ1bGVJZCkgewotCQlNYXAgcnVsZU1hcCA9IChNYXApIGNvbnRleHRNYXAuZ2V0KHZjLmdldFJlcG9ydGVyKCkpOwotCQlpZihydWxlTWFwID09IG51bGwpewotCQkJLy8gaW5zdGFudGlhdGUgYSBuZXcgc2V0IG9mIHJ1bGVzIGZvciBlYWNoIGluc3RhbmNlIG9mIEVKQiB2YWxpZGF0b3IgYXMgdGhlIHJ1bGUgY2xhc3NlcwotCQkJLy8gYXJlIG5vdCB0aHJlYWQgc2FmZSwgaW4gY2FzZSB3aGVuIG11bHRpcGxlIGVqYiB2YWxpZGF0b3JzIHJ1biBvbiBtdWx0aXBsZSBwcm9qZWN0cyBhdAotCQkJLy8gdGhlIHNhbWUgdGltZSwgcnVsZSBvYmplY3RzIGNhbiByZXBvcnQgaW5jb3JyZWN0IGVycm9ycyBzZWUgYnVnIDE4NzI4NgotCQkJRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5KCk7Ci0JCQlydWxlTWFwID0gZmFjdG9yeS5fcnVsZUxpc3Q7Ci0JCQljb250ZXh0TWFwLnB1dCh2Yy5nZXRSZXBvcnRlcigpLCBydWxlTWFwKTsKLQkJfQotCQlPYmplY3QgcnVsZSA9IHJ1bGVNYXAuZ2V0KHJ1bGVJZCk7Ci0gICAgCWlmKHJ1bGUgPT0gbnVsbCkgewotICAgIAkJLy8gTm8gc3VjaCBydWxlSWQgcmVnaXN0ZXJlZC4KLSAgICAJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLSAgICAJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLSAgICAJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGUgZnJvbSBydWxlSWQ6ICIgKyBydWxlSWQpOyAvLyROT04tTkxTLTEkCi0gICAgCQl9Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIAlyZXR1cm4gKElWYWxpZGF0aW9uUnVsZSlydWxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhclJ1bGVNYXAoSVJlcG9ydGVyIHJlcG9ydGVyKXsKLQkJY29udGV4dE1hcC5yZW1vdmUocmVwb3J0ZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MjVlNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgRUpCVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RFSkJWYWxpZGF0b3IgewotCXByaXZhdGUgc3RhdGljIEVKQlZhbGlkYXRvciBfaW5zdCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgVGFyZ2V0T2JqZWN0UG9vbCBfdGFyZ2V0T2JqZWN0UG9vbFNpbmdsZXRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBMb2dFbnRyeSBsb2dFbnRyeSA9IG51bGw7Ci0JCi0JCi0JcHVibGljIEVKQlZhbGlkYXRvcigpIHsKLQkJX2luc3QgPSB0aGlzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVKQlZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0JCi0JcHJpdmF0ZSBMb2dFbnRyeSBnZXRMb2dFbnRyeSgpewotCSAgICBpZihsb2dFbnRyeSA9PSBudWxsKQotCSAgICAgICAgbG9nRW50cnkgPSBuZXcgTG9nRW50cnkoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSk7Ci0JICAgIHJldHVybiBsb2dFbnRyeTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRCYXNlTmFtZSgpIHsKLQkJcmV0dXJuICJlamJ2YWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgY29tbW9uVmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5KMkVFX0NPUkVfUExVR0lOKTsKLQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlMb2dFbnRyeSBlbnRyeSA9IGdldExvZ0VudHJ5KCk7Ci0JCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCVmFsaWRhdG9yOjp2YWxpZGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQllbnRyeS5zZXRUZXh0KCJ2YWxpZGF0ZSB0b29rICIgKyAoZW5kIC0gc3RhcnQpICsgIiBtaWxsaXNlY29uZHMuIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FUiwgZW50cnkpOwotCQl9Ci0JCXRyeSB7Ci0JCQlFSkJWYWxpZGF0aW9uQ29udGV4dCB2YyA9IG5ldyBFSkJWYWxpZGF0aW9uQ29udGV4dCh0aGlzLCBoZWxwZXIsIHJlcG9ydGVyKTsKLQkJCXNldFZhbGlkYXRpb25Db250ZXh0KHZjKTsKLQkJCWlmIChpc0Z1bGxWYWxpZGF0ZSh2YykpIHsKLQkJCQlmdWxsVmFsaWRhdGUodmMpOwotCQkJfSBlbHNlIHsKLQkJCQlpbmNyZW1lbnRhbFZhbGlkYXRlKHZjKTsKLQkJCX0KLQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVIpKSB7Ci0JCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IGdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQlZhbGlkYXRvcjo6dmFsaWRhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoInZhbGlkYXRlIHRvb2sgIiArIChlbmQgLSBzdGFydCkgKyAiIG1pbGxpc2Vjb25kcy4iKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FUiwgZW50cnkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCi0JCX0KLQl9CQotCQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQljb21tb25WYWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQl9Ci0JLyoKLQkgKiBAc2VlIElWYWxpZGF0b3IjdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0LCBJUmVwb3J0ZXIsIElGaWxlRGVsdGFbXSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQljb21tb25WYWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGdWxsVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjKSB7Ci0JCVN0cmluZ1tdIGZpbGVVUklzID0gdmMuZ2V0VVJJcygpOwotCQlpZihmaWxlVVJJcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZihmaWxlVVJJcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWZvcihpbnQgaT0wOyBpPGZpbGVVUklzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgdXJpID0gZmlsZVVSSXNbaV07Ci0JCQlpZih1cmkuZW5kc1dpdGgoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW5EZXBlbmRlbnRzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgSVZhbGlkYXRpb25SdWxlIHJ1bGUsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gSWYgYSBjbGFzcyBpcyBiZWluZyBydW4gb25seSBiZWNhdXNlIGl0IGRlcGVuZHMgb24gYSBydWxlIHdoaWNoIGhhcyBjaGFuZ2VkLAotCQkvLyBpLmUuLCBpdCdzIGEgZGVwZW5kZW50LCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gcnVuIGl0cyBkZXBlbmRlbnRzIGJlY2F1c2UgdGhlCi0JCS8vIGNsYXNzIGl0c2VsZiBoYXNuJ3QgY2hhbmdlZC4KLQkJU2V0IGRlcGVuZGVudHMgPSBydWxlLmdldERlcGVuZGVudHMoKTsKLQkJaWYoZGVwZW5kZW50cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVwZW5kZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVZhbGlkYXRpb25SdWxlIGRSdWxlID0gKElWYWxpZGF0aW9uUnVsZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGRSdWxlVGFyZ2V0ID0gZFJ1bGUuZ2V0VGFyZ2V0KHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLQkJCQlpZihkUnVsZVRhcmdldCAhPSBudWxsKSB7Ci0JCQkJCXJ1bihkUnVsZSwgdGFyZ2V0UGFyZW50LCBkUnVsZVRhcmdldCk7IC8vIGZhbHNlPW5vdCBmdWxsIHZhbGlkYXRpb24KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uQ29udGV4dCgpLCBleGMpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5yZWxlYXNlKHJ1bGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgaW50ZXJuYWxFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjkwMDsKLQl9Ci0JCi0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ1J1bGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgcnVsZUlkKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBydWxlSWQgKyAiID0gbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UodmMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcmVSZW1vdmVPbGRNZXNzYWdlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1hcCB0YXJnZXRzKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUxpc3QgdmFsaWRhdGVkQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXRyeSB7CQotCQkJU3RyaW5nW10gdXJpcyA9IHZjLmdldFVSSXMoKTsKLQkJCWZvcihpbnQgaT0wOyBpPHVyaXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdXJpSW5zdCA9IHVyaXNbaV07Ci0JCQkJaWYoKHVyaUluc3QgPT0gbnVsbCkgfHwgKHVyaUluc3QubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCU9iamVjdCBpZCA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZUlkKHZjLCB1cmlJbnN0KTsKLQkJCQlpZihpZCA9PSBudWxsKSB7Ci0JCQkJCU9iamVjdFtdIGNsYXp6QW5kQmVhbiA9IChPYmplY3RbXSl2Yy5sb2FkTW9kZWwodXJpSW5zdCwgbnVsbCk7IC8vIERvbid0IG5lZWQgYSBzZWNvbmQgcGFyYW1ldGVyLCBidXQgY2FuJ3QgY2FzdCBhIFJlZk9iamVjdCB0byBhbiBPYmplY3RbXSwgc28gdXNlIHRoZSBzZWNvbmQgbG9hZCBtZXRob2QuCi0JCQkJCWlmKGNsYXp6QW5kQmVhbiA9PSBudWxsKSB7Ci0JCQkJCQkvLyBMb2csIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0YXNrIGxpc3QsIGFuZCByZXR1cm4uCi0JCQkJCQlsb2dNaXNzaW5nUnVsZSh2YywgaWQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gSW4gdGhlIGNsYXp6QW5kQmVhbiBvYmplY3QgYXJyYXksIHRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgSmF2YUNsYXNzLAotCQkJCQkvLyBhbmQgdGhlIHJlc3Qgb2YgdGhlIGVudHJpZXMgYXJlIHRoZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZXMgd2hpY2ggCi0JCQkJCS8vIHVzZSB0aGUgSmF2YUNsYXNzLgotCQkJCQlKYXZhQ2xhc3MgY2xhenogPSAoSmF2YUNsYXNzKWNsYXp6QW5kQmVhblswXTsKLQkJCQkJTGlzdCBiZWFucyA9IChMaXN0KWNsYXp6QW5kQmVhblsxXTsKLQotCQkJCQkvLyBUaGUgdmFsaWRhdGVkQ2xhc3Mgc2V0IGtlZXBzIHRyYWNrIG9mIEphdmFDbGFzc2VzIAotCQkJCQkvLyB0aGF0IGhhdmUgY2hhbmdlZCwgYW5kIHRoaXMgc2V0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIAotCQkJCQkvLyB3aG9zZSBjaGlsZHJlbiBuZWVkIHRvIGJlIGZvdW5kIGFuZCB2YWxpZGF0ZWQuIAotCQkJCQkvLyBWYWxpZGF0aW9uIGlzIHBlcmZvcm1lZCBhZnRlciBhbGwgb2YgdGhlIGNoYW5nZWQgZmlsZXMgCi0JCQkJCS8vIGFyZSB2YWxpZGF0ZWQgc28gdGhhdCBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIGFsbCBvZgotCQkJCQkvLyB0aGUgY2hhbmdlZCBmaWxlcyBjYW4gYmUgc2VhcmNoZWQgZm9yIGF0IG9uY2UuIFNlYXJjaGluZwotCQkJCQkvLyBvbmNlIG9uIGEgZ3JvdXAgcHJvZHVjZXMgcGVyZm9ybWFuY2Ugc2F2aW5ncyBiZWNhdXNlCi0JCQkJCS8vIHRoZSB0eXBlIGhpZXJhcmNoeSBtZXRob2QgdGFrZXMgYSBub24tdHJpdmlhbCBhbW91bnQKLQkJCQkJLy8gb2YgdGltZSB3aGVuIHRoZXJlJ3MgYSBsYXJnZSBncm91cCBvZiBkZWx0YXMuCi0JCQkJCXZhbGlkYXRlZENsYXNzZXMuYWRkKGNsYXp6KTsKLQotCQkJCQlpZigoYmVhbnMgPT0gbnVsbCkgfHwgKGJlYW5zLnNpemUoKSA9PSAwKSkgewotCQkJCQkJLy8gVGhlIEphdmFDbGFzcyBpdHNlbGYgaXMgbm90IHBhcnQgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLCBidXQgb25lIG9mIGl0cyBjaGlsZHJlbiBtYXkgYmUuCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGJlYW5zLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZCA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZUlkKHZjLCBjbGF6eiwgYmVhbik7Ci0JCQotCQkJCQkJCUlWYWxpZGF0aW9uUnVsZSBjbGF6elJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQkJCQlpZihjbGF6elJ1bGUgPT0gbnVsbCkgewotCQkJCQkJCQkvLyBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIGJ5IHRoZSBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSAoaWYgaXQncwotCQkJCQkJCQkvLyBhbiBlcnJvciAtIHRoaXMgaXMgZXhwZWN0ZWQgaWYgdGhlIGtleSBpcyBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleSkuCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCi0JCQkJCQkJc2V0VmFsaWRhdGVkKGNsYXp6UnVsZS5nZXRJZCgpLCBiZWFuLCBjbGF6eik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9NT0RFTCk7Ci0JCQkJCWlmKGVqYkphciA9PSBudWxsKSB7Ci0JCQkJCQkvLyBMb2csIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0YXNrIGxpc3QsIGFuZCByZXR1cm4uCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJSVZhbGlkYXRpb25SdWxlIGVqYkV4dFJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQkJaWYoZWpiRXh0UnVsZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIGJ5IHRoZSBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSwgc28ganVzdAotCQkJCQkJLy8gbmVlZCB0byBhZGQgIkNhbm5vdCB2YWxpZGF0ZSIgdG8gdGhlIHRhc2sgbGlzdC4KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlzZXRWYWxpZGF0ZWQoZWpiRXh0UnVsZS5nZXRJZCgpLCBudWxsLCBlamJKYXIpOwotCQkJCX0KLQkJCX0gLy8gZW5kIGZvcgotCQkJCi0JCQkvLyBBbHdheXMgdmFsaWRhdGUgZWpiLWphci54bWwsIGJlY2F1c2UgYSBjaGFuZ2UgdG8gb25lIG9mIHRoZSBmaWxlcyBpdCByZWZlcmVuY2VzCi0JCQkvLyBtYXkgbWVhbiB0aGF0IGl0IG5lZWRzIHRvIGJlIHJldmFsaWRhdGVkLgkKLQkJCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLQkJCWlmKGVqYkphciAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUpOwotCQkJCWlmKGlkID09IG51bGwpIHsKLQkJCQkJLy8gTG9nLCBhZGQgIkNhbm5vdCB2YWxpZGF0ZSIgdG8gdGFzayBsaXN0LCBhbmQgcmV0dXJuLgotCQkJCQlsb2dNaXNzaW5nUnVsZSh2YywgaWQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSVZhbGlkYXRpb25SdWxlIGVqYkphclJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQkJaWYoZWpiSmFyUnVsZSA9PSBudWxsKSB7Ci0JCQkJCQlsb2dNaXNzaW5nUnVsZSh2YywgaWQpOwotCQkJCQl9Ci0JCQkJCXNldFZhbGlkYXRlZChlamJKYXJSdWxlLmdldElkKCksIG51bGwsIGVqYkphcik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZih2YWxpZGF0ZWRDbGFzc2VzLnNpemUoKSA+IDApIHsKLQkJCQkvLyBDaGVjayB0aGUgY2hpbGRyZW4gb2YgdGhlIGNoYW5nZWQgY2xhc3Nlcy4KLQkJCQkvLyBUaGlzIGNoZWNrIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGRlcGVuZGVudHMsIGJlY2F1c2UKLQkJCQkvLyB0aGUgZGVwZW5kZW50cyBvZiB0aGUgY2hpbGRyZW4gY2xhc3NlcyBtdXN0IGJlIGNoZWNrZWQKLQkJCQkvLyBhcyB3ZWxsLgotCi0JCQkJLy8gQ2xhc3MgbmV2ZXIgdmFsaWRhdGVkIGJlZm9yZSwgc28gY2hlY2sgaXRzIGNoaWxkcmVuCi0JCQkJZm9yIChpbnQgdkMgPSAwOyB2Qzx2YWxpZGF0ZWRDbGFzc2VzLnNpemUoKTsgdkMrKykgewotCQkJCQlMaXN0IGJlYW5zID0gKExpc3QpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkIsIG5ldyBPYmplY3RbXXt2YWxpZGF0ZWRDbGFzc2VzLmdldCh2Qyl9KTsKLQkJCQkJaWYoKGJlYW5zID09IG51bGwpIHx8IChiZWFucy5zaXplKCkgPT0gMCkpIHsKLQkJCQkJCS8vIFRoZSBjbGFzcyBpcyBub3QgYSBtZW1iZXIgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLgotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJU2V0IHJvb3RWYWxpZGF0ZWRDbGFzcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCXJvb3RWYWxpZGF0ZWRDbGFzcy5hZGQodmFsaWRhdGVkQ2xhc3Nlcy5nZXQodkMpKTsKLQkJCQkJSmF2YUNsYXNzW10gY2hpbGRyZW4gPSAoSmF2YUNsYXNzW10pdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5DSElMRFJFTiwgbmV3IE9iamVjdFtde3ZjLmdldFJlcG9ydGVyKCksIHJvb3RWYWxpZGF0ZWRDbGFzc30pOwotCQkJCQlpZigoY2hpbGRyZW4gIT0gbnVsbCkgJiYgKGNoaWxkcmVuLmxlbmd0aCA+IDApKSB7Ci0JCQkJCQlJdGVyYXRvciBiY2l0ZXJhdG9yID0gbnVsbDsKLQkJCQkJCU9iamVjdCBpZCA9IG51bGw7Ci0JCQkJCQlmb3IoaW50IGM9MDsgYzxjaGlsZHJlbi5sZW5ndGg7IGMrKykgewotCQkJCQkJCUphdmFDbGFzcyBjaGlsZCA9IGNoaWxkcmVuW2NdOwotCQkJCQkJCWJlYW5zID0gKExpc3QpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkIsIG5ldyBPYmplY3RbXXtjaGlsZH0pOwotCQkJCQkJCS8vIFRoZSBjaGlsZCBpcyBub3QgYSBtZW1iZXIgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLgotCQkJCQkJCWlmKChiZWFucyA9PSBudWxsKSB8fCAoYmVhbnMuc2l6ZSgpID09IDApKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQliY2l0ZXJhdG9yID0gYmVhbnMuaXRlcmF0b3IoKTsKLQkJCQkJCQl3aGlsZShiY2l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKWJjaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZCA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZUlkKHZjLCBjaGlsZCwgYmVhbik7Ci0JCQkJCQkJCUlWYWxpZGF0aW9uUnVsZSBjbGF6elJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQkJCQkJLy8gVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGxvZ2dlZCBieSB0aGUgQWJzdHJhY3RFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnksIHNvIGp1c3QgbmVlZCB0byBhZGQgIkNhbm5vdCB2YWxpZGF0ZSIgdG8gdGhlIHRhc2sgbGlzdC4KLQkJCQkJCQkJaWYoY2xhenpSdWxlID09IG51bGwpCi0JCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQkJc2V0VmFsaWRhdGVkKGNsYXp6UnVsZS5nZXRJZCgpLCBiZWFuLCBjaGlsZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXZhbGlkYXRlZENsYXNzZXMuY2xlYXIoKTsgLy8gRG9uJ3QgbmVlZCB0aGlzIGNhY2hlIGFueSBtb3JlOyBmcmVlIHRoZSBtZW1vcnkuCi0JCQl9Ci0JCQkKLQkJCS8vIE5vdywgdmFsaWRhdGUgdGhlIGRlcGVuZGVudHMuCi0JCQl0YXJnZXRzLnB1dEFsbChfdmFsaWRhdGVkKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFyZ2V0cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGlkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCUlWYWxpZGF0aW9uUnVsZSBydWxlID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlKHZjLCBpZCk7Ci0JCQkJaWYocnVsZSA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlTZXQgY29udGV4dHMgPSAoU2V0KXRhcmdldHMuZ2V0KGlkKTsKLQkJCQlpZihjb250ZXh0cyA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlJdGVyYXRvciBjSXRlcmF0b3IgPSBjb250ZXh0cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJVGFyZ2V0T2JqZWN0IHRvID0gKFRhcmdldE9iamVjdCljSXRlcmF0b3IubmV4dCgpOwotCQkJCQlPYmplY3QgdGFyZ2V0UGFyZW50ID0gdG8uZ2V0VGFyZ2V0UGFyZW50KCk7Ci0JCQkJCU9iamVjdCB0YXJnZXQgPSB0by5nZXRUYXJnZXQoKTsKLQkJCQkJU2V0IGRlcGVuZGVudHMgPSBydWxlLmdldERlcGVuZGVudHMoKTsKLQkJCQkJaWYoZGVwZW5kZW50cyA9PSBudWxsKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJSXRlcmF0b3IgZEl0ZXJhdG9yID0gZGVwZW5kZW50cy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZShkSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlWYWxpZGF0aW9uUnVsZSBkUnVsZSA9IChJVmFsaWRhdGlvblJ1bGUpZEl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgZFJ1bGVUYXJnZXQgPSBkUnVsZS5nZXRUYXJnZXQodGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQkJCQkJCWlmKGRSdWxlVGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJCQkJc2V0VmFsaWRhdGVkKGRSdWxlLmdldElkKCksIHRhcmdldFBhcmVudCwgZFJ1bGVUYXJnZXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IGU7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJCQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkNvbnRleHQoKSwgZXhjKTsKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCUVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkucmVsZWFzZShydWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIE5vIG1hdHRlciB3aGF0LCBjbGVhciB0aGUgdGVtcG9yYXJ5IGNhY2hlcy4KLQkJCXRhcmdldHMuY2xlYXIoKTsKLQkJCXZhbGlkYXRlZENsYXNzZXMuY2xlYXIoKTsKLQkJCQotCQkJLy8gTm93IHB1dCB0aGUgInZhbGlkYXRlZCIgcmVzdWx0cyBpbiAiZG9uZSIsIGJlY2F1c2UgdGhleSB3ZXJlbid0Ci0JCQkvLyByZWFsbHkgdmFsaWRhdGVkOyBpdCB3YXMganVzdCBhIHRyYWNraW5nIG1lY2hhbmlzbS4KLQkJCXRhcmdldHMucHV0QWxsKF92YWxpZGF0ZWQpOwotCQkJX3ZhbGlkYXRlZC5jbGVhcigpOyAvLyBDbGVhciB0aGUgInZhbGlkYXRlZCIgY2FjaGUgYmVjYXVzZSB0aGUgdGFyZ2V0cyB3ZXJlbid0IHJlYWxseSB2YWxpZGF0ZWQ7IHRoZXkgd2VyZSBqdXN0IHRyYWNrZWQuCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyByZW1vdmVPbGRNZXNzYWdlc1N0cmluZygpIHsKLQkJcmV0dXJuIEVKQlZhbGlkYXRvck1vZGVsRW51bS5SRU1PVkVfT0xEX01FU1NBR0VTOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmdWxsVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJlbW92ZU9sZE1lc3NhZ2VzKHZjLG51bGwpOyAvLyBudWxsID09IG5vIElGaWxlRGVsdGEsIG51bGwgPSBkb24ndCB0cmFjayB0YXJnZXRzCi0JCQotCi0JCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLQkJaWYoZWpiSmFyID09IG51bGwpIHsKLQkJCS8vIExvZywgYWRkICJDYW5ub3QgdmFsaWRhdGUiIHRvIHRhc2sgbGlzdCwgYW5kIHJldHVybi4KLQkJCS8vIEVKQlByb2plY3RSZXNvdXJjZXMgd2lsbCBhbHJlYWR5IGhhdmUgbG9nZ2VkIHRoZSBwcm9ibGVtLgotCQkJCi0JCQlJTWVzc2FnZSBtc3NnID0gdmMuZ2V0TWVzc2FnZSgpOwotCQkJbXNzZy5zZXRJZChJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjkwNSk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1zc2cpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlPYmplY3QgaWQgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGVJZCh2YywgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSk7Ci0JCWlmKGlkID09IG51bGwpIHsKLQkJCS8vIExvZywgYWRkICJDYW5ub3QgdmFsaWRhdGUiIHRvIHRhc2sgbGlzdCwgYW5kIHJldHVybi4KLQkJCWxvZ01pc3NpbmdSdWxlKHZjLCBKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FKTsKLQkJCXJldHVybjsKLQkJfQotCQlJVmFsaWRhdGlvblJ1bGUgZWpiSmFyUnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQlpZihlamJKYXJSdWxlID09IG51bGwpIHsKLQkJCWxvZ01pc3NpbmdSdWxlKHZjLCBpZCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcnVuKGVqYkphclJ1bGUsIG51bGwsIGVqYkphcik7IC8vIHRydWU9IGZ1bGwgdmFsaWRhdGlvbgotCi0JCUxpc3QgYmVhbnMgPSBlamJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYmVhbnMuaXRlcmF0b3IoKTsKLQkJaWQgPSBudWxsOwotCi0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbilpdGVyYXRvci5uZXh0KCk7Ci0JCQlKYXZhQ2xhc3NbXSBjbGFzc2VzID0gZ2V0SmF2YUNsYXNzKGJlYW4pOwotCQkJZm9yKGludCBpPTA7IGk8Y2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCUphdmFDbGFzcyBjbGF6eiA9IGNsYXNzZXNbaV07Ci0JCQkJaWQgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGVJZCh2YywgY2xhenosIGJlYW4pOwotCQkKLQkJCQlJVmFsaWRhdGlvblJ1bGUgY2xhenpSdWxlID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlKHZjLCBpZCk7Ci0JCQkJaWYoY2xhenpSdWxlID09IG51bGwpIHsKLQkJCQkJLy8gVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGxvZ2dlZCBieSB0aGUgQWJzdHJhY3RFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkgKGlmIGl0J3MKLQkJCQkJLy8gYW4gZXJyb3IgLSB0aGlzIGlzIGV4cGVjdGVkIGlmIHRoZSBrZXkgaXMgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkpLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQotCQkJCXJ1bihjbGF6elJ1bGUsIGJlYW4sIGNsYXp6KTsgLy8gdHJ1ZSA9IGZ1bGwgdmFsaWRhdGlvbgotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQ2xhc3NbXSBnZXRKYXZhQ2xhc3MoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpbnQgY291bnQgPSAwOwotCQlKYXZhQ2xhc3NbXSBjbGFzc2VzID0gbmV3IEphdmFDbGFzc1s2XTsKLQkJCi0JCUphdmFDbGFzcyBlamJDbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJaWYoKGVqYkNsYXNzICE9IG51bGwpICYmIChlamJDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSkgewotCQkJY2xhc3Nlc1tjb3VudCsrXSA9IGVqYkNsYXNzOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgcmVtb3RlQ2xhc3MgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlpZigocmVtb3RlQ2xhc3MgIT0gbnVsbCkgJiYgKHJlbW90ZUNsYXNzLmlzRXhpc3RpbmdUeXBlKCkpKSB7Ci0JCQljbGFzc2VzW2NvdW50KytdID0gcmVtb3RlQ2xhc3M7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBsb2NhbENsYXNzID0gYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpOwotCQlpZigobG9jYWxDbGFzcyAhPSBudWxsKSAmJiAobG9jYWxDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSkgewotCQkJY2xhc3Nlc1tjb3VudCsrXSA9IGxvY2FsQ2xhc3M7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBob21lQ2xhc3MgPSBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJaWYoKGhvbWVDbGFzcyAhPSBudWxsKSAmJiAoaG9tZUNsYXNzLmlzRXhpc3RpbmdUeXBlKCkpKSB7Ci0JCQljbGFzc2VzW2NvdW50KytdID0gaG9tZUNsYXNzOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgbG9jYWxIb21lQ2xhc3MgPSBiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCQlpZigobG9jYWxIb21lQ2xhc3MgIT0gbnVsbCkgJiYgKGxvY2FsSG9tZUNsYXNzLmlzRXhpc3RpbmdUeXBlKCkpKSB7Ci0JCQljbGFzc2VzW2NvdW50KytdID0gbG9jYWxIb21lQ2xhc3M7Ci0JCX0KLQkJCi0JCWlmKGJlYW4gaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCUphdmFDbGFzcyBrZXkgPSAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCQlpZigoa2V5ICE9IG51bGwpICYmIChrZXkuaXNFeGlzdGluZ1R5cGUoKSkpIHsKLQkJCQljbGFzc2VzW2NvdW50KytdID0ga2V5OwotCQkJfQotCQl9Ci0KLQkJaWYoY291bnQgPT0gNikgewotCQkJcmV0dXJuIGNsYXNzZXM7Ci0JCX0KLQkJCi0JCUphdmFDbGFzc1tdIHJlc3VsdCA9IG5ldyBKYXZhQ2xhc3NbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzZXMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGluY3JlbWVudGFsVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCU1hcCB0YXJnZXRzID0gbmV3IEhhc2hNYXAoKTsKLQkJdHJ5IHsKLQkJCXJlbW92ZU9sZE1lc3NhZ2VzKHZjLHRhcmdldHMpOwotCQkJCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHRhcmdldHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBpZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJVmFsaWRhdGlvblJ1bGUgcnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCWlmKHJ1bGUgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJU2V0IGNvbnRleHRzID0gKFNldCl0YXJnZXRzLmdldChpZCk7Ci0JCQkJaWYoY29udGV4dHMgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJSXRlcmF0b3IgY0l0ZXJhdG9yID0gY29udGV4dHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZShjSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCVRhcmdldE9iamVjdCB0byA9IChUYXJnZXRPYmplY3QpY0l0ZXJhdG9yLm5leHQoKTsKLQkJCQkJcnVuKHJ1bGUsIHRvLmdldFRhcmdldFBhcmVudCgpLCB0by5nZXRUYXJnZXQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGFyZ2V0cy5jbGVhcigpOwotCQkJdGFyZ2V0cyA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFRhcmdldE9iamVjdFBvb2wgZ2V0VGFyZ2V0T2JqZWN0UG9vbCgpIHsKLQkJaWYoX3RhcmdldE9iamVjdFBvb2xTaW5nbGV0b24gPT0gbnVsbCkgewotCQkJX3RhcmdldE9iamVjdFBvb2xTaW5nbGV0b24gPSBuZXcgVGFyZ2V0T2JqZWN0UG9vbCgxMDApOwotCQl9Ci0JCXJldHVybiBfdGFyZ2V0T2JqZWN0UG9vbFNpbmdsZXRvbjsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC52YWxpZGF0aW9uLkFic3RyYWN0RUpCVmFsaWRhdG9yI3JlbGVhc2VSdWxlcyhvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC52YWxpZGF0aW9uLmVqYi5JVmFsaWRhdGlvblJ1bGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVsZWFzZVJ1bGVzKElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0gICAgICAgIEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkucmVsZWFzZShydWxlKTsKLSAgICAgICAgCi0gICAgfQotCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKXsKLQkJLy8gY2xlYXIgdGhlIG1hcCB3aGVuIHRoZSBlamIgdmFsaWRhdG9yIGlzIGRvbmUgc2VlIGJ1ZyAxODcyODYKLQkJRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5jbGVhclJ1bGVNYXAocmVwb3J0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSGFzaE1hcCBoZWxwZXJNYXAgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0SGVscGVyTWFwKHByb2plY3QpOwotCQloZWxwZXJNYXAuY2xlYXIoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnByb2plY3RIZWxwZXJNYXAucmVtb3ZlKCBoZWxwZXJNYXAgKTsKLQkJaGVscGVyTWFwID0gbnVsbDsKLQkJc3VwZXIudmFsaWRhdGlvbkZpbmlzaGluZyhwcm9qZWN0LCBzdGF0ZSwgbW9uaXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yTW9kZWxFbnVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yTW9kZWxFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ODI0NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRvck1vZGVsRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lcyBvZiB0aGUgbW9kZWxzIHdoaWNoIHRoZQotICogRUpCVmFsaWRhdG9yIG5lZWRzLCBhbmQgdGhlIElWYWxpZGF0aW9uQ29udGV4dCB0aGF0IGlzIHVzZWQgaW4gdGhlIEVKQlZhbGlkYXRvcidzCi0gKiB2YWxpZGF0ZSBtZXRob2QgbXVzdCBzdXBwb3J0IHRoZXNlIHN5bWJvbGljIG5hbWVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQlZhbGlkYXRvck1vZGVsRW51bSB7Ci0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCX01PREVMID0gIkVKQl9NT0RFTCI7IC8vIHJldHVybiBhbiBFSkJKYXIgb2JqZWN0IC8vJE5PTi1OTFMtMSQKLQkgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFSkJfRklMRSA9ICJFSkJfRklMRSI7IC8vIHJldHVybiBhIE1vZHVsZUZpbGUgb2JqZWN0IChlaXRoZXIgRUpCSmFyRmlsZSBvciBFQVJGaWxlKSAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCID0gIkVKQiI7IC8vIEdpdmVuIGEgSmF2YUNsYXNzIGluc3RhbmNlLCByZXR1cm4gYSBqYXZhLnV0aWwuTGlzdCBvZiBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZXMgdGhhdCB1c2UgdGhhdCBKYXZhQ2xhc3MgYXMgcGFydCBvZiB0aGUgYmVhbi4gLy8kTk9OLU5MUy0xJAotCSAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENISUxEUkVOID0gImNoaWxkcmVuIjsgLy8gR2l2ZW4gYSBKYXZhQ2xhc3MgaW5zdGFuY2UsIHJldHVybiBhIEphdmFDbGFzc1tdIG9mIHRoZSBKYXZhQ2xhc3NlcyB0aGF0IGluaGVyaXQgb3IgZXh0ZW5kIHRoZSBpbnN0YW5jZS4gLy8kTk9OLU5MUy0xJAotCSAgIC8vVGhlIEVKQl9CSU5ESU5HIHN5bWJvbHMgaXMgV0FTIHNwZWNpZmljIGFuZCBuZWVkIHRvIGJlIG1vdmVkIHRvIFdBUyBFeHQgbGF5ZXIKLQkgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFSkJfQklORElORyA9ICJFSkJfQklORElORyI7IC8vIHJldHVybiB0aGUgRUpCSmFyQmluZGluZyBmb3IgdGhlIEVKQkphciAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCX0NMSUVOVEpBUiA9ICJFSkJfQ0xJRU5USkFSIjsgLy8gSWYgdGhlIEVKQiB1c2VzIGEgY2xpZW50IEpBUiwgZ2l2ZW4gdGhlIG5hbWUgb2YgdGhlIEpBUiwgdGhpcyBtZXRob2QgcmV0dXJucyBhIEJvb2xlYW4uVFJVRSBpZiB0aGUgY2xpZW50IEpBUiBjYW4gYmUgZm91bmQgYW5kIGxvYWRlZCBzdWNjZXNzZnVsbHkuIElmIGl0IGNhbid0IGJlIGZvdW5kIGFuZCBsb2FkZWQsIHJldHVybiBCb29sZWFuLkZBTFNFLiAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX09MRF9NRVNTQUdFUyA9ICJSRU1PVkVfT0xEX01FU1NBR0VTIjsgLy8gUmVtb3ZlIGFsbCBNZXNzYWdlcyByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGdpdmVuIE9iamVjdHMgaW4gdGhlIGFycmF5LiAvLyROT04tTkxTLTEkCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FUmVmVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FUmVmVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZmZjczYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRVJlZlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEVSZWZWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uZXJlZnZhbGlkYXRpb24iOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRVJlZlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfSU5WQUxJRF9FUkVGVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGSE9NRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGUkVNT1RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX0VKQl9ST0xFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVOUkVTT0xWRURfRUpCX1JFRl9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9FQVJfRFVQTElDQVRFX1NFUlZJQ0VSRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9TRUNVUklUWVJPTEVSRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9FSkJSRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9SRVNFTlZSRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9NRVNTU0FHRURFU1RJTkFUSU9OUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX01FU1NTQUdFREVTVElOQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfVU5SRVNPTFZFRF9NREJfTUlTU0lOR19NRVNTQUdFX0RFU1RJTkFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX0VNUFRZX01FU1NTQUdFREVTVElOQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfTU9EVUxFX0REX0ZJTEVfTk9UX0ZPVU5EOwotCi0JCi0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFUmVmVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4OGE5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRWFyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRWpiUmVmSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlZhbGlkYXRlWG1sQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk5vTW9kdWxlRmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzYvMjAwMCAxMTowODo1NSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEVhclZhbGlkYXRvciBleHRlbmRzIEoyRUVWYWxpZGF0b3IgIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNfUkVGX0dST1VQX05BTUUgPSAiUkVTX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19FTlZfUkVGX0dST1VQX05BTUUgPSAiUkVTX0VOVl9SRUZfR1JPVVBfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1JFRl9HUk9VUF9OQU1FID0gIlNFUlZJQ0VfUkVGX0dST1VQX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1JFRl9HUk9VUF9OQU1FID0gIkVKQl9SRUZfR1JPVVBfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNfUk9MRV9SRUZfR1JPVVBfTkFNRSA9ICJTRUNfUk9MRV9SRUZfR1JPVVBfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1JFRl9HUk9VUF9OQU1FID0gIk1FU1NBR0VfUkVGX0dST1VQX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfR1JPVVBfTkFNRSA9ICJNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0RFU1RJTkFUSU9OX01EQl9SRUZfR1JPVVBfTkFNRSA9ICJNRVNTQUdFX0RFU1RJTkFUSU9OX01EQl9SRUZfR1JPVVBfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgRUFSRmlsZSBlYXJGaWxlOwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbiBhcHBERDsKLQkKLQkvKioKLQkgKiBSZWxhdGlvbnNoaXBNYXBWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRWFyVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0vLyBFYXJWYWxpZGF0b3IKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZhbGlkYXRlWE1MIGNvbW1hbmQuCi0JICogCi0JICogQHJldHVybiBDb21tYW5kCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlVmFsaWRhdGVYTUxDb21tYW5kKCkgewotCQlDb21tYW5kIGNtZCA9IG5ldyBWYWxpZGF0ZVhtbENvbW1hbmQoZWFyRmlsZSk7Ci0JCXJldHVybiBjbWQ7Ci0JfS8vIGNyZWF0ZVZhbGlkYXRlWE1MQ29tbWFuZAotCQotCS8qKgotCSAqIDxwPkFuc3dlciB0aGUgaWQgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB3aGljaCBpcwotCSAqIHVzZWQgYnkgdGhlIHJlY2VpdmVyLjwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0JCXJldHVybiBFQVJfQ0FURUdPUlk7Ci0JfS8vIGdldEJhc2VOYW1lCi0JCi0JLyoqCi0JICogWE1MIFZhbGlkYXRpb24gbm93IGhhbmRsZXMgdmFsaWRhdGlvbiBvZiBEZXBsb3ltZW50IERlc2NyaXB0b3IKLQkgKiAKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkgIHZhbGlkYXRlTW9kdWxlcyhhcHBERC5nZXRNb2R1bGVzKCkpOwotCSAgdmFsaWRhdGVTZWN1cml0eSgpOwotCSAgdmFsaWRhdGVSZWZzKCk7Ci0JICB2YWxpZGF0ZVdlYkNvbnRleHRzKCk7Ci0JICB2YWxpZGF0ZVNwZWNMZXZlbCgpOwotCSAgdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0JfS8vIHZhbGlkYXRlCi0JCi0JLyoqCi0JICogRG9lcyB0aGUgdmFsaWRhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBpbkhlbHBlciwgSVJlcG9ydGVyIGluUmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVJbkpvYiggaW5IZWxwZXIsIGluUmVwb3J0ZXIgKTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgIHZhbGlkYXRlSW5Kb2IoIElWYWxpZGF0aW9uQ29udGV4dCBpbkhlbHBlciwgSVJlcG9ydGVyIGluUmVwb3J0ZXIgKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCi0JCWluUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0JCXN1cGVyLnZhbGlkYXRlSW5Kb2IoaW5IZWxwZXIsIGluUmVwb3J0ZXIgKTsKLQkJdHJ5IHsKLQkJCWVhckZpbGUgPSAoRUFSRmlsZSkgX2hlbHBlci5sb2FkTW9kZWwoSjJFRUNvbnN0YW50cy5FQVJfTU9ERUxfTkFNRSk7Ci0JCQlpZiAoZWFyRmlsZSAhPSBudWxsKSB7Ci0JCQkJYXBwREQgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJaWYgKGFwcEREICE9IG51bGwgJiYgYXBwREQuZVJlc291cmNlKCkgIT0gbnVsbCAmJiBhcHBERC5lUmVzb3VyY2UoKS5pc0xvYWRlZCgpKQotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuRUFSX0REX0NBTk5PVF9PUEVOX0RELCBuZXcgU3RyaW5nW10geyBnZXRSZXNvdXJjZU5hbWUoKX0pOwotCQkJCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1zZyk7Ci0JCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1zZy5nZXRUZXh0KCkpOwotCQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuRVJST1JfRUFSX0lOVkFMSURfRUFSX0ZJTEUsIG5ldyBTdHJpbmdbXSB7IGdldFJlc291cmNlTmFtZSgpfSk7Ci0JCQkJSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtc2cpOwotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnKTsKLQkJCX0gLy8gaWYKLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmdbXSBwYXJhbSA9IG5ldyBTdHJpbmdbMV07Ci0JCQlpZiAoZWFyRmlsZSAhPSBudWxsKQotCQkJCXBhcmFtWzBdID0gZWFyRmlsZS5nZXROYW1lKCk7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuRUFSX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1JfVUlfLCBwYXJhbSApOwkJCQotCQkJSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtc2cgKTsKLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnLCBlKTsKLQkJfSAvLyB0cnkgCi0JCXJldHVybiBzdGF0dXM7Ci0JfSAvLyB2YWxpZGF0ZQotCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzb3VyY2UgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7Ci0JCXJldHVybiBlYXJGaWxlLmdldFVSSSgpOwotCX0vLyBnZXRSZXNvdXJjZU5hbWUKLQkKLQkvKioKLQkgKiB2YWxpZGF0ZSBmb3IgZHVwbGljYXRlcyBpbiBFQVIgUm9sZXMKLQkgKiAKLQkgKiBAcGFyYW0gRUxpc3QgZWFyUm9sZUxpc3QgLSBMaXN0IG9mIGVhciByb2xlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVhclJvbGVzKEVMaXN0IGVhclJvbGVMaXN0KSB7Ci0JCVNldCBzID0gbmV3IEhhc2hTZXQoZWFyUm9sZUxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJSb2xlTGlzdC5zaXplKCk7IGkrKykgewotCQkJU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZSA9IChTZWN1cml0eVJvbGUpIGVhclJvbGVMaXN0LmdldChpKTsKLQkJCWlmICghKHMuYWRkKHNlY3VyaXR5Um9sZS5nZXRSb2xlTmFtZSgpKSkpIHsKLQkJCQlTdHJpbmcgcm9sZU5hbWUgPSBzZWN1cml0eVJvbGUuZ2V0Um9sZU5hbWUoKTsKLQkJCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcmFtc1swXSA9IHJvbGVOYW1lOwotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5FUlJPUl9FQVJfRFVQTElDQVRFX1JPTEVTLCBwYXJhbXMpOyAKLQkJCQlhZGRMb2NhbGl6ZWRXYXJuaW5nKCBtc2csIGFwcEREICk7Ci0JCQl9Ly8gaWYKLQkJfS8vIGZvcgotCX0vLyB2YWxpZGF0ZUVhclJvbGVzCi0JCi0JLyoqCi0JICogdmFsaWRhdGVSZWZzKFdlYkFwcCkgLSB2YWxpZGF0ZSBFSkIgIHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gRWpiUmVmIGVyZWYgLSBBbiBlamIgcmVmLgotCSAqIEBwYXJhbSBTdGluZyB1cmkgLSBUaGUgdXJpIG9mIHRoZSBtb2R1bGUuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFSkJSZWZNYW5kYXRvcnlFbGVtZW50cyhMaXN0IGVqYlJlZnMsIFN0cmluZyB1cmkpIHsKLQkgZm9yKGludCBpID0gMDsgaSA8IGVqYlJlZnMuc2l6ZSgpOyBpKyspIHsKLQkgIEVqYlJlZiBlcmVmID0gKEVqYlJlZikgZWpiUmVmcy5nZXQoaSk7Ci0JICBTdHJpbmcgcmVmTmFtZSA9IGVyZWYuZ2V0TmFtZSgpOwotCSAgU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1syXTsKLQkgIHBhcmFtc1swXSA9IHJlZk5hbWU7Ci0JICBwYXJhbXNbMV0gPSB1cmk7Ci0JICAKLQkgIGlmICgoZXJlZi5nZXROYW1lKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0TmFtZSgpLnRyaW0oKSA9PSBudWxsKSB8fCAoZXJlZi5nZXROYW1lKCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCWFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZOQU1FLCBwYXJhbXMpOwotCSAgfS8vIGlmCi0JICBpZiAoZXJlZi5pc1NldFR5cGUoKSkKLQkgICAge2lmKGVyZWYuZ2V0VHlwZSgpID09IG51bGwgKSAKLQkgICAgCWFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9JTlZBTElEX0VSRUZUWVBFLCBwYXJhbXMpO30KLQkgIGVsc2UgCi0JCSAgYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRlRZUEUsIHBhcmFtcyk7Ci0JICAvLyBpZgotCSAgaWYgKChlcmVmLmdldEhvbWUoKSA9PSBudWxsKSB8fCAoZXJlZi5nZXRIb21lKCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCSAgYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUUsIHBhcmFtcyk7Ci0JICB9Ly8gaWYKLQkgIGlmICgoZXJlZi5nZXRSZW1vdGUoKSA9PSBudWxsKSB8fCAoZXJlZi5nZXRSZW1vdGUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJICBhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FUkVGUkVNT1RFLCBwYXJhbXMpOwotCSAgfQotCSB9Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmUgdGhlIGVqYiBpbnRlcmZhY2VzIHRvIGNoZWNrIGlmIHRoZXkgYXJlIHNpbWlsYXIuCi0JICogCi0JICogQHBhcmFtIEVqYlJlZiBlcmVmIC0gVGhlIGVqYiByZWZlcmVuY2UuCi0JICogQHBhcmFtIEVudGVycHJpc2VCZWFuIGVqYiAtIFRoZSBlbnRlcnByaXNlIGJlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NpbWlsYXJFSkJJbnRlcmZhY2UoRWpiUmVmIGVyZWYsIEVudGVycHJpc2VCZWFuIGVqYikgewotCQkKLQkJaWYoIGVyZWYuaXNMb2NhbCgpICkgewotCQkJaWYoIGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkgPT0gbnVsbCB8fAotCQkJCWVqYi5nZXRMb2NhbEludGVyZmFjZU5hbWUoKSA9PSBudWxsIHx8IAotCQkJCSgoRUpCTG9jYWxSZWYpZXJlZikuZ2V0TG9jYWxIb21lKCkgPT0gbnVsbCAgfHwgCi0JCQkJKChFSkJMb2NhbFJlZillcmVmKS5nZXRMb2NhbCgpID09IG51bGwgKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfS8vIGlmCi0JCQkKLQkJCWJvb2xlYW4gaXNIb21lTG9jYWxPayA9IGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkuZXF1YWxzKCgoRUpCTG9jYWxSZWYpZXJlZikuZ2V0TG9jYWxIb21lKCkpOwotCQkJYm9vbGVhbiBpc1JlbW90ZUxvY2FsT2sgPSAgZWpiLmdldExvY2FsSW50ZXJmYWNlTmFtZSgpLmVxdWFscygoKEVKQkxvY2FsUmVmKWVyZWYpLmdldExvY2FsKCkpOwotCQkgCXJldHVybiBpc0hvbWVMb2NhbE9rICYmIGlzUmVtb3RlTG9jYWxPazsKLQkJfS8vIGlmCi0JCQotCQlpZiggZWpiLmdldEhvbWVJbnRlcmZhY2VOYW1lKCkgPT0gbnVsbCB8fAotCQkJZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKSA9PSBudWxsIHx8IAotCQkJZXJlZi5nZXRIb21lKCkgPT0gbnVsbCAgfHwgCi0JCQllcmVmLmdldFJlbW90ZSgpID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0vLyBpZgotCQkKLQkJYm9vbGVhbiBpc0hvbWVPayA9IGVqYi5nZXRIb21lSW50ZXJmYWNlTmFtZSgpLmVxdWFscyggZXJlZi5nZXRIb21lKCkgKTsKLQkJYm9vbGVhbiBpc1JlbW90ZU9rID0gZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKS5lcXVhbHMoIGVyZWYuZ2V0UmVtb3RlKCkgKTsKLQkJCi0JCXJldHVybiBpc0hvbWVPayAmJiBpc1JlbW90ZU9rOwotCX0vLyBpc1NpbWlsYXJFSkJJbnRlcmZhY2UKLQkJCi0JLyoqCi0JICogdmFsaWRhdGUgZm9yIGR1cGxpY2F0ZXMgaW4gRUFSIFJvbGVzCi0JICogCi0JICogQHBhcmFtIExpc3QgZWpiUmVmcyAtIExpc3Qgb2YgZWpiIHJlZnMuCi0JICogQHBhcmFtIFN0cmluZyB1cmkgLSBUaGUgdXJpIG9mIHRoZSBtb2R1bGUuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFSkJSZWZzKExpc3QgZWpiUmVmcywgU3RyaW5nIHVyaSkgewotCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBlamJSZWZzLnNpemUoKTsgaSsrKSB7Ci0JICAJICBFamJSZWYgZXJlZiA9IChFamJSZWYpIGVqYlJlZnMuZ2V0KGkpOwotCQkgIGlmKCBlcmVmICE9IG51bGwgJiYgZXJlZi5nZXRMaW5rKCkgIT0gbnVsbCAmJiBlcmVmLmdldExpbmsoKS5sZW5ndGgoKSA+IDApIHsKLQkJICAJRW50ZXJwcmlzZUJlYW4gZWpiID0gZWFyRmlsZS5nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZiggZXJlZiwgdXJpICk7Ci0JCSAgCWlmKCBlamIgPT0gbnVsbCApIHsKLQkJICAJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQkJcGFyYW1zWzBdID0gZXJlZi5nZXROYW1lKCk7Ci0JCQkJcGFyYW1zWzFdID0gdXJpOwotCQkJCXBhcmFtc1syXSA9IGVhckZpbGUuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFUmVmVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuVU5SRVNPTFZFRF9FSkJfUkVGX1dBUk5fLCBwYXJhbXMpOwotCQkgIAkJYWRkTG9jYWxpemVkV2FybmluZyhtc2csIG51bGwpOwotCQkgIAl9IGVsc2UgewotCQkgIAkJaWYoICFpc1NpbWlsYXJFSkJJbnRlcmZhY2UoIGVyZWYsIGVqYiApICkgewotCQkgIAkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQkJCXBhcmFtc1swXSA9IGVqYi5nZXROYW1lKCk7Ci0JCQkJCXBhcmFtc1sxXSA9IGVyZWYuZ2V0TmFtZSgpOwotCQkJCQlwYXJhbXNbMl0gPSB1cmk7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5FSkJfQkVBTl9FSkJfTElOS19JTlRFRkFDRV9NSVNNQVRDSF9FUlJPUl8sIHBhcmFtcyk7CQkJCQkKLQkJICAJCQlhZGRMb2NhbGl6ZWRFcnJvciggbXNnLCBhcHBERCk7Ci0JCSAgCQl9Ci0JCSAgCX0KLQkJICB9Ci0JICB9Ci0JfQotCQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBleGlzdGFuY2Ugb2YgdGhlIEVKQiBSb2xlcyBpbiB0aGUgRUFSIFJvbGVzIGFuZCBkdXBsaWNhdGVzIGliIEVKQiBSb2xlcwotCSAqIAotCSAqIEBwYXJhbSBFTGlzdCBlYXJSb2xlTGlzdCAtIExpc3Qgb2YgZWFyIHJvbGVzLgotCSAqIEBwYXJhbSBFTGlzdCBlamJSb2xlcyAtIExpc3Qgb2YgZWpiIHJvbGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCUm9sZXNXaXRoRUFSUm9sZXMoRUxpc3QgZWFyUm9sZUxpc3QsIEVMaXN0IGVqYlJvbGVzKSB7Ci0JICBmb3IgKGludCBpID0gMDsgaSA8IGVqYlJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCWlmICghKGVhclJvbGVMaXN0LmNvbnRhaW5zKGVqYlJvbGVzLmdldChpKSkpKSB7Ci0JCSAgU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1sxXTsKLQkJICBwYXJhbXNbMF0gPSAoKFNlY3VyaXR5Um9sZSkgKGVqYlJvbGVzLmdldChpKSkpLmdldFJvbGVOYW1lKCk7CQkgICAgICAgICAgCi0JCSAgYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRSwgcGFyYW1zKTsKLQkJfS8vIGlmCi0JICB9Ly8gZm9yCi0JfS8vIHZhbGlkYXRlRUpCUm9sZXNXaXRoRUFSUm9sZXMKLQkKLQkvKioKLQkgKiBGb3IgZWFjaCBtb2R1bGUsIG1ha2Ugc3VyZSBpdHMgYXJjaGl2ZSBleGlzdHMKLQkgKihhIHZlcnkgZXhwZW5zaXZlLCBidXQgbW9yZSBtZWFuaW5nZnVsIHRlc3Qgd291bGQgYmUgdG8gYWxzbyBtYWtlIHN1cmUgdGhleSBjYW4gYmUgbG9hZGVkKQotCSAqIAotCSAqIEBwYXJhbSBFTGlzdCBtb2R1bGVzTGlzdCAtIExpc3Qgb2YgbW9kdWxlcwotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTW9kdWxlcyhFTGlzdCBtb2R1bGVzTGlzdCkgewotLy8JCVN0cmluZyBlcnJvclN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUlNZXNzYWdlIG1zZyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgIlZhbGlkYXRpbmcgTW9kdWxlcyIpOwotCQlfcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soIHRoaXMsIG1zZyApOwotCQkKLQkJCi0JCUhhc2hTZXQgZHVwbGljYXRlVVJJID0gbmV3IEhhc2hTZXQoKTsKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzTGlzdC5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlIG0gPSAoTW9kdWxlKSBtb2R1bGVzTGlzdC5nZXQoaSk7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBtLmdldFVyaSgpOwotCQkJaWYgKChmaWxlbmFtZSA9PSBudWxsKSB8fCAoZmlsZW5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlhZGRMb2NhbGl6ZWRFcnJvcihFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5NRVNTQUdFX0VBUl9OT19NT0RVTEVfVVJJLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy9jaGVjayBpZiB0aGUgVVJJIGhhcyBhbnkgc3BhY2VzCi0JCQkJaWYoICBmaWxlbmFtZS5pbmRleE9mKCAiICIgKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcmFtc1swXSA9IGZpbGVuYW1lOwotCQkJCQlTdHJpbmcgbXNnMSA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLlVSSV9DT05UQUlOU19TUEFDRVNfRVJST1JfLCBwYXJhbXMpOwotCQkJCQlhZGRMb2NhbGl6ZWRFcnJvcihtc2cxLCBhcHBERCk7Ci0JCQkJfS8vIGlmCi0JCQl9Ly8gaWYKLQkJCVN0cmluZyBhbHRERCA9IG0uZ2V0QWx0REQoKTsKLQkJCWlmIChhbHRERCAhPSBudWxsKQotCQkJCWFsdEREID0gYWx0REQudHJpbSgpOwotCQkJdmFsaWRhdGVBbHRERChtLCBhbHRERCk7Ci0JCQlTdHJpbmcga2V5ID0gYWx0REQgPT0gbnVsbCA/IGZpbGVuYW1lICsgYWx0REQgOiBmaWxlbmFtZTsKLQkJCWlmICghZHVwbGljYXRlVVJJLmFkZChrZXkpKSB7Ci0JCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1syXTsKLQkJCQlwYXJhbXNbMF0gPSBtLmdldFVyaSgpOwotCQkJCXBhcmFtc1sxXSA9IGVhckZpbGUuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyB0bXAgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5NRVNTQUdFX0VBUl9EVVBMSUNBVEVfVVJJX0VSUk9SXywgcGFyYW1zKTsKLQkJCQlhZGRMb2NhbGl6ZWRFcnJvcih0bXAsIGFwcEREKTsKLQkJCX0vLyBpZgotCQotCQl9Ly8gZm9yCi0JCi0JfS8vIHZhbGlkYXRlTW9kdWxlcwotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBhbHQgZGQKLQkgKiAKLQkgKiBAcGFyYW0gTW9kdWxlIG0gLSBBIG1vZHVsZS4KLQkgKiBAcGFyYW0gU3RyaW5nIGFsdEREIC0gQW4gYWx0REQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFsdEREKE1vZHVsZSBtLCBTdHJpbmcgYWx0REQpIHsKLQkJLy9pc0R1cGxpY2F0ZSB3aWxsIHRlc3QgaWYgaXQgaXMgYSBmaWxlIG9yIGEgbG9hZGVkIHJlc291cmNlCi0JCWlmICgiIi5lcXVhbHMoYWx0REQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMl07Ci0JCQlwYXJhbXNbMF0gPSBtLmdldFVyaSgpOwotCQkJcGFyYW1zWzFdID0gZWFyRmlsZS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgdG1wID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuTUVTU0FHRV9FTVBUWV9BTFRfRERfRVJST1JfLCBwYXJhbXMpOwotCQkJYWRkTG9jYWxpemVkRXJyb3IodG1wLCBhcHBERCk7Ci0JCX0gZWxzZSBpZiAoYWx0REQgIT0gbnVsbCAmJiAhZWFyRmlsZS5pc0R1cGxpY2F0ZShhbHRERCkpIHsKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQlwYXJhbXNbMF0gPSBtLmdldFVyaSgpOwotCQkJcGFyYW1zWzFdID0gYWx0REQ7Ci0JCQlwYXJhbXNbMl0gPSBlYXJGaWxlLmdldE5hbWUoKTsKLQkJCVN0cmluZyB0bXAgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5NRVNTQUdFX0lOVkFMSURfQUxUX0REX1dBUk5fLCBwYXJhbXMpOwkJCQotCQkJYWRkTG9jYWxpemVkV2FybmluZyh0bXAsIGFwcEREKTsKLQkJfS8vIGlmCi0JfS8vIHZhbGlkYXRlQWx0REQKLQkKLQkvKioKLQkgKiB2YWxpZGF0ZSBFSkIgYW5kIHJlc291cmNlIHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVJlZnMoKSB7Ci0JCQotCQlJTWVzc2FnZSBtc2cgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksICJWYWxpZGF0aW5nIFJlZnMiKTsKLQkJX3JlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKCB0aGlzLCBtc2cgKTsKLQkJCi0JCQotCQlMaXN0IG1vZHVsZUxpc3QgPSBlYXJGaWxlLmdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJaWYocmVmLmlzV2ViKCkpIHsKLQkJCQkJdmFsaWRhdGVXZWJBcHBSZWZzKHJlZik7CQkJCX0gIAotCQkJCWVsc2UgaWYoIHJlZi5pc0VKQigpICkgewotCQkJCSAgICB2YWxpZGF0ZUVKQk1vZHVsZVJlZnMocmVmKTsKLQkJCQl9IGVsc2UgaWYocmVmLmlzQ2xpZW50KCkpCi0JCQkJCXZhbGlkYXRlQXBwQ2xpZW50UmVmcyhyZWYpOwotCQkJfSBjYXRjaCAoQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleC5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcmFtc1swXSA9IHJlZi5nZXRVcmkoKTsKLQkJCQlhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9NT0RVTEVfRERfRklMRV9OT1RfRk9VTkQsIHBhcmFtcyk7CQkJCQkKLQkJCX0gCi0JCQkKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogQHBhcmFtIHJlZgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUFwcENsaWVudFJlZnMoTW9kdWxlUmVmIHJlZikgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJQXBwbGljYXRpb25DbGllbnQgYXBwQ2xpZW50ID0gKEFwcGxpY2F0aW9uQ2xpZW50SW1wbClyZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJTGlzdCBlamJSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICBlamJSZWZzLmFkZEFsbChhcHBDbGllbnQuZ2V0RWpiUmVmZXJlbmNlcygpKTsKLQkJdmFsaWRhdGVFSkJSZWZNYW5kYXRvcnlFbGVtZW50cyhlamJSZWZzLCByZWYuZ2V0VXJpKCkpOwotCQl2YWxpZGF0ZUVKQlJlZnMoZWpiUmVmcywgcmVmLmdldFVyaSgpKTsKLQkJaWYgKGFwcENsaWVudCAhPSBudWxsICYmIGFwcENsaWVudC5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkgewotCQkJU2V0IGFsbFJlZnMgPSBuZXcgSGFzaFNldCgpOwotCQkJTGlzdCByZXNvdXJjZVJlZnMgPSBhcHBDbGllbnQuZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQlMaXN0IHJlc291cmNlRW52UmVmcyA9IGFwcENsaWVudC5nZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCUxpc3Qgc2VydmljZVJlZnMgPSBhcHBDbGllbnQuZ2V0U2VydmljZVJlZnMoKTsKLQkJCSAgICAKLQkJCXZhbGlkYXRlRHVwbGljYXRlRUpCUmVmcyhhbGxSZWZzLGVqYlJlZnMpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVSZXNvdXJjZVJlZnMoYWxsUmVmcyxyZXNvdXJjZVJlZnMpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVSZXNvdXJjZUVudlJlZnMoYWxsUmVmcyxyZXNvdXJjZUVudlJlZnMpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVTZXJ2aWNlUmVmcyhhbGxSZWZzLHNlcnZpY2VSZWZzKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVmCi0JICogQHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVdlYkFwcFJlZnMoTW9kdWxlUmVmIHJlZikgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApcmVmLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCUxpc3QgZWpiUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgZWpiUmVmcy5hZGRBbGwod2ViQXBwLmdldEVqYlJlZnMoKSk7Ci0JICAgIGVqYlJlZnMuYWRkQWxsKHdlYkFwcC5nZXRFamJMb2NhbFJlZnMoKSk7Ci0JCXZhbGlkYXRlRUpCUmVmTWFuZGF0b3J5RWxlbWVudHMoZWpiUmVmcywgcmVmLmdldFVyaSgpKTsKLQkJdmFsaWRhdGVFSkJSZWZzKGVqYlJlZnMsIHJlZi5nZXRVcmkoKSk7Ci0JCWlmICh3ZWJBcHAgIT0gbnVsbCAmJiB3ZWJBcHAuZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRCkgewotCQkJU2V0IGFsbFJlZnMgPSBuZXcgSGFzaFNldCgpOwotCQkJTGlzdCByZXNvdXJjZVJlZnMgPSB3ZWJBcHAuZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQlMaXN0IHJlc291cmNlRW52UmVmcyA9IHdlYkFwcC5nZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCUxpc3Qgc2VydmljZVJlZnMgPSB3ZWJBcHAuZ2V0U2VydmljZVJlZnMoKTsKLQkJCQotCQkJdmFsaWRhdGVEdXBsaWNhdGVFSkJSZWZzKGFsbFJlZnMsZWpiUmVmcyk7Ci0JCQl2YWxpZGF0ZUR1cGxpY2F0ZVJlc291cmNlUmVmcyhhbGxSZWZzLHJlc291cmNlUmVmcyk7Ci0JCQl2YWxpZGF0ZUR1cGxpY2F0ZVJlc291cmNlRW52UmVmcyhhbGxSZWZzLHJlc291cmNlRW52UmVmcyk7Ci0JCQl2YWxpZGF0ZUR1cGxpY2F0ZVNlcnZpY2VSZWZzKGFsbFJlZnMsc2VydmljZVJlZnMpOwotCQl9Ci0JfQotCS8qKgotCSAqIEBwYXJhbSByZWYKLQkgKiBAdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUpCTW9kdWxlUmVmcyhNb2R1bGVSZWYgcmVmKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcilyZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJaWYoIGVqYkphciAhPSBudWxsICkgewotCQkJTGlzdCBlamJDb2xsZWN0aW9uID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwkJCQotCQkJaWYoIGVqYkNvbGxlY3Rpb24gIT0gbnVsbCB8fCAhZWpiQ29sbGVjdGlvbi5pc0VtcHR5KCkgKSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gZWpiSmFyLmVSZXNvdXJjZSgpOwotCQkJCWNsZWFuVXBBbGxSZWZTdWJUYXNrTWVzc2FnZXMocmVzKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGVqYkNvbGxlY3Rpb24uaXRlcmF0b3IoKTsJCi0JCQkJd2hpbGUoIGl0ZXJhdG9yLmhhc05leHQoKSApIHsKLQkJCQkJRW50ZXJwcmlzZUJlYW4gZWpiQmVhbiA9IChFbnRlcnByaXNlQmVhbilpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmKCBlamJCZWFuICE9IG51bGwgKSB7Ci0JCQkJCSAgICBMaXN0IGVqYlJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCSAgICBlamJSZWZzLmFkZEFsbChlamJCZWFuLmdldEVqYlJlZnMoKSk7Ci0JCQkJCSAgICBlamJSZWZzLmFkZEFsbChlamJCZWFuLmdldEVqYkxvY2FsUmVmcygpKTsKLQkJCQkJCXZhbGlkYXRlRUpCUmVmTWFuZGF0b3J5RWxlbWVudHMoZWpiUmVmcywgcmVmLmdldFVyaSgpKTsKLQkJCQkJCXZhbGlkYXRlRUpCUmVmcyhlamJSZWZzLCByZWYuZ2V0VXJpKCkpOwotCQkJCQkJaWYoZWpiSmFyLmdldFZlcnNpb25JRCgpIDw9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHsKLQkJCQkJCQlTZXQgYWxsUmVmcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCQkJTGlzdCByZXNvdXJjZVJlZnMgPSBlamJCZWFuLmdldFJlc291cmNlUmVmcygpOwotCQkJCQkJCUxpc3QgcmVzb3VyY2VFbnZSZWZzID0gZWpiQmVhbi5nZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCQkJCQlMaXN0IHNlY1JvbGVSZWZzID0gZWpiQmVhbi5nZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCQkJCQkJTGlzdCBzZXJ2aWNlUmVmcyA9IGVqYkJlYW4uZ2V0U2VydmljZVJlZnMoKTsKLQkJCQkJCQlMaXN0IG1lc3NhZ2VEZXN0UmVmcyA9IGVqYkJlYW4uZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkJCQkJCSAgICAKLQkJCQkJCQl2YWxpZGF0ZUR1cGxpY2F0ZUVKQlJlZnMoYWxsUmVmcyxlamJSZWZzKTsKLQkJCQkJCQl2YWxpZGF0ZUR1cGxpY2F0ZVJlc291cmNlUmVmcyhhbGxSZWZzLHJlc291cmNlUmVmcyk7Ci0JCQkJCQkJdmFsaWRhdGVEdXBsaWNhdGVSZXNvdXJjZUVudlJlZnMoYWxsUmVmcyxyZXNvdXJjZUVudlJlZnMpOwotCQkJCQkJCXZhbGlkYXRlRHVwbGljYXRlU2VjdXJpdHlSb2xlUmVmcyhhbGxSZWZzLHNlY1JvbGVSZWZzKTsKLQkJCQkJCQl2YWxpZGF0ZUR1cGxpY2F0ZVNlcnZpY2VSZWZzKGFsbFJlZnMsc2VydmljZVJlZnMpOwotCQkJCQkJCXZhbGlkYXRlRHVwbGljYXRlTWVzc2FnZURlc3RSZWZzKGFsbFJlZnMsbWVzc2FnZURlc3RSZWZzKTsKLQkJCQkJICAgfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JIAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbGxSZWZzCi0JICogQHBhcmFtIHNlcnZpY2VSZWZzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRHVwbGljYXRlU2VydmljZVJlZnMoU2V0IGFsbFJlZnMsIExpc3Qgc2VydmljZVJlZnMpIHsKLQkJaWYgKCFzZXJ2aWNlUmVmcy5pc0VtcHR5KCkpIHsKLQkJCVNlcnZpY2VSZWYgZmlyc3RSZWYgPSAoU2VydmljZVJlZikoc2VydmljZVJlZnMuZ2V0KDApKTsKLQkJaWYoIShmaXJzdFJlZi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikpCi0JCQljbGVhblVwU3ViVGFza01lc3NhZ2VzKGZpcnN0UmVmKTsKLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IHNlcnZpY2VSZWZzLnNpemUoKTsgcmVmTm8rKykgewotCQkJU2VydmljZVJlZiByZWYgPSAoU2VydmljZVJlZikgKHNlcnZpY2VSZWZzLmdldChyZWZObykpOwotCQkJU3RyaW5nIHJlZk5hbWUgPSByZWYuZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCXBhcm1zWzBdID0gcmVmTmFtZTsKLQkJCWlmICghKGFsbFJlZnMuYWRkKHJlZk5hbWUpKSkKLQkJCSAgYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX0RVUExJQ0FURV9TRVJWSUNFUkVGLCBwYXJtcyxyZWYsU0VSVklDRV9SRUZfR1JPVVBfTkFNRSk7Ci0JCX0KLQkgIH0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWxsUmVmcwotCSAqIEBwYXJhbSBzZWNSb2xlUmVmcwotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUR1cGxpY2F0ZVNlY3VyaXR5Um9sZVJlZnMoU2V0IGFsbFJlZnMsIExpc3Qgc2VjUm9sZVJlZnMpIHsKLQkJaWYgKCFzZWNSb2xlUmVmcy5pc0VtcHR5KCkpIHsKLQkJCVNlY3VyaXR5Um9sZVJlZiBmaXJzdFJlZiA9IChTZWN1cml0eVJvbGVSZWYpKHNlY1JvbGVSZWZzLmdldCgwKSk7Ci0JCWlmKCEoZmlyc3RSZWYuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pKQotCQkJY2xlYW5VcFN1YlRhc2tNZXNzYWdlcyhmaXJzdFJlZik7Ci0JCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCBzZWNSb2xlUmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCVNlY3VyaXR5Um9sZVJlZiByZWYgPSAoU2VjdXJpdHlSb2xlUmVmKSAoc2VjUm9sZVJlZnMuZ2V0KHJlZk5vKSk7Ci0JCQlTdHJpbmcgcmVmTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IHJlZk5hbWU7Ci0JCQlpZiAoIShhbGxSZWZzLmFkZChyZWZOYW1lKSkpCi0JCQkgIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfU0VDVVJJVFlST0xFUkVGLCBwYXJtcyxyZWYsU0VDX1JPTEVfUkVGX0dST1VQX05BTUUpOwotCQl9Ci0JICB9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFsbFJlZnMKLQkgKiBAcGFyYW0gcmVzb3VyY2VFbnZSZWZzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRHVwbGljYXRlUmVzb3VyY2VFbnZSZWZzKFNldCBhbGxSZWZzLCBMaXN0IHJlc291cmNlRW52UmVmcykgewotCQlpZiAoIXJlc291cmNlRW52UmVmcy5pc0VtcHR5KCkpIHsKLQkJCVJlc291cmNlRW52UmVmIGZpcnN0UmVmID0gKFJlc291cmNlRW52UmVmKShyZXNvdXJjZUVudlJlZnMuZ2V0KDApKTsKLQkJaWYoIShmaXJzdFJlZi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikpCi0JCQljbGVhblVwU3ViVGFza01lc3NhZ2VzKGZpcnN0UmVmKTsKLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IHJlc291cmNlRW52UmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCVJlc291cmNlRW52UmVmIHJlZiA9IChSZXNvdXJjZUVudlJlZikgKHJlc291cmNlRW52UmVmcy5nZXQocmVmTm8pKTsKLQkJCVN0cmluZyByZWZOYW1lID0gcmVmLmdldE5hbWUoKTsKLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCXBhcm1zWzBdID0gcmVmTmFtZTsKLQkJCWlmICghKGFsbFJlZnMuYWRkKHJlZk5hbWUpKSkKLQkJCSAgYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX0RVUExJQ0FURV9SRVNFTlZSRUYsIHBhcm1zLHJlZixSRVNfRU5WX1JFRl9HUk9VUF9OQU1FKTsKLQkJfQotCSAgfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbGxSZWZzCi0JICogQHBhcmFtIHJlc291cmNlUmVmcwotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUR1cGxpY2F0ZVJlc291cmNlUmVmcyhTZXQgYWxsUmVmcywgTGlzdCByZXNvdXJjZVJlZnMpIHsKLQkJaWYgKCFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpKSB7Ci0JCQlSZXNvdXJjZVJlZiBmaXJzdFJlZiA9IChSZXNvdXJjZVJlZikocmVzb3VyY2VSZWZzLmdldCgwKSk7Ci0JCWlmKCEoZmlyc3RSZWYuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pKQotCQkJY2xlYW5VcFN1YlRhc2tNZXNzYWdlcyhmaXJzdFJlZik7Ci0JCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCByZXNvdXJjZVJlZnMuc2l6ZSgpOyByZWZObysrKSB7Ci0JCQlSZXNvdXJjZVJlZiByZWYgPSAoUmVzb3VyY2VSZWYpIChyZXNvdXJjZVJlZnMuZ2V0KHJlZk5vKSk7Ci0JCQlTdHJpbmcgcmVmTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IHJlZk5hbWU7Ci0JCQlpZiAoIShhbGxSZWZzLmFkZChyZWZOYW1lKSkpCi0JCQkgIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTUkVGLCBwYXJtcyxyZWYsUkVTX1JFRl9HUk9VUF9OQU1FKTsKLQkJfQotCSAgfQotCX0KLQkvKioKLQkgKiBAcGFyYW0gYWxsUmVmcwotCSAqIEBwYXJhbSBlamJSZWZzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEdXBsaWNhdGVFSkJSZWZzKFNldCBhbGxSZWZzLCBMaXN0IGVqYlJlZnMpIHsKLQkJaWYgKCFlamJSZWZzLmlzRW1wdHkoKSkgewotCQkJRWpiUmVmIGZpcnN0UmVmID0gKEVqYlJlZikoZWpiUmVmcy5nZXQoMCkpOwotCQlpZighKGZpcnN0UmVmLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKSkKLQkJCWNsZWFuVXBTdWJUYXNrTWVzc2FnZXMoZmlyc3RSZWYpOwotCQlmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgZWpiUmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCUVqYlJlZiByZWYgPSAoRWpiUmVmSW1wbCkgKGVqYlJlZnMuZ2V0KHJlZk5vKSk7Ci0JCQlTdHJpbmcgcmVmTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IHJlZk5hbWU7Ci0JCQlpZiAoIShhbGxSZWZzLmFkZChyZWZOYW1lKSkpCi0JCQkgIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfRUpCUkVGLCBwYXJtcywgcmVmLCBFSkJfUkVGX0dST1VQX05BTUUpOwotCQkgfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhbGxSZWZzCi0JICogQHBhcmFtIGVqYlJlZnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUR1cGxpY2F0ZU1lc3NhZ2VEZXN0UmVmcyhTZXQgYWxsUmVmcywgTGlzdCBtZXNzYWdlRGVzdFJlZnMpIHsKLQkJaWYgKCFtZXNzYWdlRGVzdFJlZnMuaXNFbXB0eSgpKSB7Ci0JCQlNZXNzYWdlRGVzdGluYXRpb25SZWYgZmlyc3RSZWYgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKShtZXNzYWdlRGVzdFJlZnMuZ2V0KDApKTsKLQkJaWYoIShmaXJzdFJlZi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikpCi0JCQljbGVhblVwU3ViVGFza01lc3NhZ2VzKGZpcnN0UmVmKTsKLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IG1lc3NhZ2VEZXN0UmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCU1lc3NhZ2VEZXN0aW5hdGlvblJlZiByZWYgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKSAobWVzc2FnZURlc3RSZWZzLmdldChyZWZObykpOwotCQkJU3RyaW5nIHJlZk5hbWUgPSByZWYuZ2V0TmFtZSgpOwotCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJcGFybXNbMF0gPSByZWZOYW1lOwotCQkJaWYgKCEoYWxsUmVmcy5hZGQocmVmTmFtZSkpKQotCQkJICBhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfRFVQTElDQVRFX01FU1NTQUdFREVTVElOQVRJT05SRUYsIHBhcm1zLHJlZiwgTUVTU0FHRV9SRUZfR1JPVVBfTkFNRSk7Ci0JCSB9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlyc3RSZWYKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwU3ViVGFza01lc3NhZ2VzKEVPYmplY3QgcmVmKSB7Ci0JCS8vTm8gT3AgLSBzdWJjbGFzcyBvdmVycmlkZXMgCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBBbGxSZWZTdWJUYXNrTWVzc2FnZXMoUmVzb3VyY2UgcmVzKSB7Ci0JCS8vTm8gT3AgLSBzdWJjbGFzcyBvdmVycmlkZXMgCi0JfQotCi0JLyoqCi0JICogRWpiIHJlZnMgdG8gdGhlIHJ1bm5pbmcgbGlzdCBvZiBlamIgcmVmcy4KLQkgKiAKLQkgKiBAcGFyYW0gTGlzdCBjdXJyZW50UmVmcyAtIExpc3Qgb2YgY3VycmVudCBlamIgcmVmcyB0byBiZSBhZGRlZC4KLQkgKiBAcGFyYW0gTGlzdCBlamJSZWZzIC0gY29sbGVjdGlvbiBvZiBydW5uaW5nIGVqYnJlZnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFSkJSZWZzKCBMaXN0IGN1cnJlbnRSZWZzLCBMaXN0IGVqYlJlZnMgKSB7CQkKLQkJaWYoIGN1cnJlbnRSZWZzID09IG51bGwgfHwgZWpiUmVmcyA9PSBudWxsICkKLQkJCXJldHVybjsKLQkJCi0JCWVqYlJlZnMuYWRkQWxsKCBjdXJyZW50UmVmcyApOwkJCQkJCQkJCQotCX0vLyBhZGRFSkJSZWZzCi0KLQkvKioKLQkgKiB2YWxpZGF0ZSBzZWN1cml0eSBjb25zdHJhaW50cywgcm9sZXMsIGFuZCBzZWN1cml0eSByb2xlIHJlZnMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZWN1cml0eSgpIHsKLQkJRUxpc3QgZWFyUm9sZUxpc3QgPSBhcHBERC5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCWlmICghZWFyUm9sZUxpc3QuaXNFbXB0eSgpKQotCQkJdmFsaWRhdGVFYXJSb2xlcyhlYXJSb2xlTGlzdCk7Ci0JCUVMaXN0IG1vZHVsZUxpc3QgPSBhcHBERC5nZXRNb2R1bGVzKCk7Ci0JCWlmICghbW9kdWxlTGlzdC5pc0VtcHR5KCkpIHsKLQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJCU1vZHVsZSBtID0gKE1vZHVsZSkgbW9kdWxlTGlzdC5nZXQoaSk7Ci0JCQkJaWYgKG0uaXNFamJNb2R1bGUoKSkgewotCQkJCQlFTGlzdCBlamJSb2xlcyA9IG0uZ2V0QXBwbGljYXRpb24oKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQkJCWlmICghZWpiUm9sZXMuaXNFbXB0eSgpKQotCQkJCQkJdmFsaWRhdGVFSkJSb2xlc1dpdGhFQVJSb2xlcyhlYXJSb2xlTGlzdCwgZWpiUm9sZXMpOwotCQkJCX0vLyBpZgotCQkJCWlmIChtLmlzV2ViTW9kdWxlKCkpIHsKLQkJCQkJRUxpc3Qgd2ViUm9sZXMgPSBtLmdldEFwcGxpY2F0aW9uKCkuZ2V0U2VjdXJpdHlSb2xlcygpOwotCQkJCQlpZiAoIXdlYlJvbGVzLmlzRW1wdHkoKSkKLQkJCQkJCXZhbGlkYXRlV0VCUm9sZXNXaXRoRUFSUm9sZXMoZWFyUm9sZUxpc3QsIHdlYlJvbGVzKTsKLQkJCQl9Ly8gaWYKLQkJCX0vLyBmb3IKLQkJfS8vIGlmCi0JfS8vIHZhbGlkYXRlU2VjdXJpdHkKLQkKLQkvKioKLQkgKiBWYWxpZGF0ZXMgYW4gZWFyIGZvciBkdXBsaWNhdGUgd2ViIGNvbnRleHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlV2ViQ29udGV4dHMoKSB7Ci0JCQotCQlFTGlzdCBtb2R1bGVMaXN0ID0gYXBwREQuZ2V0TW9kdWxlcygpOwotCSAgCU1hcCB2aXNpdGVkV2ViQ29udGV4dCA9IG5ldyBIYXNoTWFwKCk7Ci0JICAJCi0JICAJaWYoICFtb2R1bGVMaXN0LmlzRW1wdHkoKSApIHsJCQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVMaXN0Lml0ZXJhdG9yKCk7CQkKLQkJCXdoaWxlKCBpdGVyYXRvci5oYXNOZXh0KCkgKSB7Ci0JCSAgCQlNb2R1bGUgbW9kdWxlID0gKE1vZHVsZSlpdGVyYXRvci5uZXh0KCk7Ci0JCSAgCQlpZiggbW9kdWxlLmlzV2ViTW9kdWxlKCkgKSB7Ci0JCSAgCQkJCi0JCSAgCQkJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChXZWJNb2R1bGUpbW9kdWxlOwotCQkJICAJCQkKLQkJCSAgCQlpZiggd2ViTW9kdWxlICE9IG51bGwgKSB7Ci0JCQkgIAkJCWlmKCB2aXNpdGVkV2ViQ29udGV4dC5jb250YWluc0tleSggd2ViTW9kdWxlLmdldENvbnRleHRSb290KCkgKSApIHsKLQkJCSAgCQkJCVdlYk1vZHVsZSB0ZW1wV2ViTW9kdWxlID0gKFdlYk1vZHVsZSl2aXNpdGVkV2ViQ29udGV4dC5nZXQoIHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpICk7Ci0JCQkJCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1szXTsKLQkJCQkJCQlwYXJhbXNbMF0gPSB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKTsKLQkJCQkJCQlwYXJhbXNbMV0gPSB3ZWJNb2R1bGUuZ2V0VXJpKCk7Ci0JCQkJCQkJcGFyYW1zWzJdID0gdGVtcFdlYk1vZHVsZS5nZXRVcmkoKTsKLQkJCQkJCQlTdHJpbmcgdG1wID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuTUVTU0FHRV9FQVJfRFVQSUNBVEVfUk9PVENPTlRFWFRfRVJST1JfLCBwYXJhbXMpOwotCQkJCQkJCQotCQkJICAJCQkJYWRkTG9jYWxpemVkRXJyb3IodG1wLCBhcHBERCk7Ci0JCQkgIAkJCX0gZWxzZSB7Ci0JCQkgIAkJCQl2aXNpdGVkV2ViQ29udGV4dC5wdXQoIHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpLCB3ZWJNb2R1bGUgKTsKLQkJCSAgCQkJfS8vIGlmCi0JCQkgIAkJCQkKLQkJCSAgCQl9Ly8gaWYKLQkJICAJCQkKLQkJICAJCX0vLyBpZgotCQkJfS8vIHdoaWxlCi0JICAJfS8vIGlmCi0JfS8vIHZhbGlkYXRlV2ViQ29udGV4dHMKLQkKLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIG1vZHVsZXMgYXJlIGEgc3BlYyBsZXZlbCB0b28gaGlnaCBmb3IgdGhlIEVBUiBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVNwZWNMZXZlbCgpIHsKLQkJaW50IGVhclZlcnNpb24gPSBnZXRWZXJzaW9uSUQoZWFyRmlsZSk7Ci0JCUxpc3QgbW9kdWxlcyA9IGVhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKTsKLQkJCi0JCWlmKCAhbW9kdWxlcy5pc0VtcHR5KCkgKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZXMuaXRlcmF0b3IoKTsKLQkJCU1vZHVsZUZpbGUgbW9kdWxlRmlsZSA9IG51bGw7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCSAgCQltb2R1bGVGaWxlID0gKE1vZHVsZUZpbGUpaXRlcmF0b3IubmV4dCgpOwotCQkgIAkJaWYgKG1vZHVsZUZpbGUgIT0gbnVsbCAmJiBnZXRWZXJzaW9uSUQobW9kdWxlRmlsZSkgPiBlYXJWZXJzaW9uKSB7Ci0JCQkgIAkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1tdIHttb2R1bGVGaWxlLmdldFVSSSgpLCBlYXJGaWxlLmdldE5hbWUoKX07Ci0JCQkgIAkJU3RyaW5nIHRtcCA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLk1FU1NBR0VfSU5DT01QQVRJQkxFX1NQRUNfV0FSTklOR18sIHBhcmFtcyk7Ci0JCQkJCWFkZExvY2FsaXplZFdhcm5pbmcodG1wLCBhcHBERCk7Ci0JCSAgCQl9Ci0JCQl9CQkgIAkJCQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtb2R1bGVGaWxlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldFZlcnNpb25JRChNb2R1bGVGaWxlIG1vZHVsZUZpbGUpIHsKLQkJWE1MUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlcyA9IChYTUxSZXNvdXJjZSkgbW9kdWxlRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCX0gY2F0Y2ggKFJlc291cmNlTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewkKLQkJCS8vSWdub3JlCi0JCX0KLQkJaWYgKHJlcyAhPSBudWxsKQotCQkJcmV0dXJuIHJlcy5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkgdmFsaWRhdGVNREJNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0JfQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU1EQk1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCUxpc3QgbW9kdWxlTGlzdCA9IGVhckZpbGUuZ2V0TW9kdWxlUmVmcygpOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJIGlmKCByZWYuaXNFSkIoKSApIHsKLQkJCQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpcmVmLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJCWlmKCBlamJKYXIgIT0gbnVsbCApIHsKLQkJCQkJCXJlbW92ZUFsbE1lc3NhZ2VzKGVqYkphcixNRVNTQUdFX0RFU1RJTkFUSU9OX01EQl9SRUZfR1JPVVBfTkFNRSk7Ci0JCQkJCQlMaXN0IGVqYkNvbGxlY3Rpb24gPSBlamJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7CQkJCi0JCQkJCQlpZiggZWpiQ29sbGVjdGlvbiAhPSBudWxsIHx8ICFlamJDb2xsZWN0aW9uLmlzRW1wdHkoKSApIHsKLQkJCQkJCSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVqYkNvbGxlY3Rpb24uaXRlcmF0b3IoKTsJCi0JCQkJCQkJd2hpbGUoIGl0ZXJhdG9yLmhhc05leHQoKSApIHsKLQkJCQkJCQkJRW50ZXJwcmlzZUJlYW4gZWpiQmVhbiA9IChFbnRlcnByaXNlQmVhbilpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmKCBlamJCZWFuICE9IG51bGwgKSB7Ci0JCQkJCQkJCQlpZiAoZWpiQmVhbi5pc01lc3NhZ2VEcml2ZW4oKSkgewotCQkJCQkJCQkJCU1lc3NhZ2VEcml2ZW4gbWVzc2FnZURyaXZlbkJlYW4gPSAoTWVzc2FnZURyaXZlbillamJCZWFuOwotCQkJCQkJCQkJCWlmIChtZXNzYWdlRHJpdmVuQmVhbi5nZXRWZXJzaW9uSUQoKSA8IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQpIGNvbnRpbnVlOwotCQkJCQkJCQkJCVN0cmluZyBsaW5rID0gbWVzc2FnZURyaXZlbkJlYW4uZ2V0TGluaygpOwotCQkJCQkJCQkJCWlmIChsaW5rICE9IG51bGwgJiYgIWlzRXhpc3RNZXNzYWdlRGVzdGluYXRpb25MaW5rKGxpbmssIHJlZikpIHsKLQkJCQkJCQkJCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1s0XTsKLQkJCQkJCQkJCQkJcGFyYW1zWzBdID0gbGluazsKLQkJCQkJCQkJCQkJcGFyYW1zWzFdID0gbWVzc2FnZURyaXZlbkJlYW4uZ2V0TmFtZSgpOwotCQkJCQkJCQkJCQlwYXJhbXNbMl0gPSByZWYuZ2V0VXJpKCk7Ci0JCQkJCQkJCQkJCXBhcmFtc1szXSA9IGVhckZpbGUuZ2V0TmFtZSgpOwotCQkJCQkJCQkJCQlhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9VTlJFU09MVkVEX01EQl9NSVNTSU5HX01FU1NBR0VfREVTVElOQVRJT04sIHBhcmFtcyxtZXNzYWdlRHJpdmVuQmVhbiwgTUVTU0FHRV9ERVNUSU5BVElPTl9NREJfUkVGX0dST1VQX05BTUUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCSB9Ci0JCQl9IGNhdGNoIChBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleC5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCQlpZiAoIShuZXN0ZWQgaW5zdGFuY2VvZiBOb01vZHVsZUZpbGVFeGNlcHRpb24pKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcmFtc1swXSA9IHJlZi5nZXRVcmkoKTsKLQkJCQkJYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfTU9EVUxFX0REX0ZJTEVfTk9UX0ZPVU5ELCBwYXJhbXMpOwotCQkJCX0KLQkJCX0gCi0JCQkKLQkJfQotCX0KLQkKLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCUxpc3QgbW9kdWxlTGlzdCA9IGVhckZpbGUuZ2V0TW9kdWxlUmVmcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCXZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmcyhyZWYpOwotCQl9Ci0JfQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoTW9kdWxlUmVmIG1vZHVsZVJlZikgewotCQlMaXN0IGRlc3RpbmF0aW9uc1JlZnMgPSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKG1vZHVsZVJlZik7Ci0JCWNsZWFyVXBTdWJUYXNrTWVzc2FnZURlc3RpbmF0aW9uTWVzc2FnZXMobW9kdWxlUmVmLGRlc3RpbmF0aW9uc1JlZnMpOwotCQlmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgZGVzdGluYXRpb25zUmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCU1lc3NhZ2VEZXN0aW5hdGlvblJlZiByZWYgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKSAoZGVzdGluYXRpb25zUmVmcy5nZXQocmVmTm8pKTsKLQkJCVN0cmluZyBsaW5rID0gIHJlZi5nZXRMaW5rKCkgOwotCQkJaWYgKGxpbmsgPT0gbnVsbCkgY29udGludWU7IC8vIGRvbnQgdmFsaWRhdGUgaWYgdGhlIGxpbmsgaXMgbnVsbAotCQkJaWYgKCBsaW5rLmxlbmd0aCgpPT0gMCkgeyAvLyBlbXB0eSBsaW5rIGlzIGFuIGVycm9yCi0JCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1szXTsKLQkJCQlwYXJhbXNbMF0gPSByZWYuZ2V0TmFtZSgpOwotCQkJCXBhcmFtc1sxXSA9IG1vZHVsZVJlZi5nZXRVcmkoKTsKLQkJCQlwYXJhbXNbMl0gPSBlYXJGaWxlLmdldE5hbWUoKTsKLQkJCQkKLQkJCQlhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FTVBUWV9NRVNTU0FHRURFU1RJTkFUSU9OLCBwYXJhbXMscmVmLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9HUk9VUF9OQU1FKTsKLQkJCX0gZWxzZSBpZiAoIWlzRXhpc3RNZXNzYWdlRGVzdGluYXRpb25MaW5rKGxpbmssIG1vZHVsZVJlZikpIHsKLQkJCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzRdOwotCQkJCXBhcmFtc1swXSA9IGxpbms7Ci0JCQkJcGFyYW1zWzFdID0gcmVmLmdldE5hbWUoKTsKLQkJCQlwYXJhbXNbMl0gPSBtb2R1bGVSZWYuZ2V0VXJpKCk7Ci0JCQkJcGFyYW1zWzNdID0gZWFyRmlsZS5nZXROYW1lKCk7Ci0JCQkJCi0JCQkJYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfTUVTU1NBR0VERVNUSU5BVElPTiwgcGFyYW1zLHJlZiwgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfR1JPVVBfTkFNRSk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjbGVhclVwU3ViVGFza01lc3NhZ2VEZXN0aW5hdGlvbk1lc3NhZ2VzKE1vZHVsZVJlZiBtb2R1bGVSZWYsIExpc3QgZGVzdGluYXRpb25zUmVmcykgewotCQl0cnkgewotCQkJaWYoIG1vZHVsZVJlZiAhPSBudWxsICYmIG1vZHVsZVJlZi5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwgKXsKLQkJCQlyZW1vdmVBbGxNZXNzYWdlcyhtb2R1bGVSZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSxNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9HUk9VUF9OQU1FKTsKLQkJCX0KLQkJfSBjYXRjaCAoQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbiA9IGUuZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCQlpZihuZXN0ZWRFeGNlcHRpb24gaW5zdGFuY2VvZiBOb01vZHVsZUZpbGVFeGNlcHRpb24pewotCQkJCS8vRUFUIElUIGJlY2F1c2UgYSBtb2R1bGUgcHJvamVjdCBoYXMgYmVlbiBjbG9zZWQgb3IgZGVsZXRlZAkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCBkZXN0aW5hdGlvbnNSZWZzLnNpemUoKTsgcmVmTm8rKykgewotCQkJTWVzc2FnZURlc3RpbmF0aW9uUmVmIHJlZiA9IChNZXNzYWdlRGVzdGluYXRpb25SZWYpIChkZXN0aW5hdGlvbnNSZWZzLmdldChyZWZObykpOwotCQkJcmVtb3ZlQWxsTWVzc2FnZXMocmVmLE1FU1NBR0VfREVTVElOQVRJT05fUkVGX0dST1VQX05BTUUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKEVPYmplY3QgZU9iamVjdCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlZgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGlzdE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoU3RyaW5nIGxpbmssIE1vZHVsZVJlZiBtb2R1bGVSZWYpIHsKLQkJaWYgKGxpbmsgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlpbnQgaW5kZXggPSBsaW5rLmluZGV4T2YoJyMnKTsKLQkJU3RyaW5nIGRlc3RpbmF0aW9uTmFtZTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlkZXN0aW5hdGlvbk5hbWUgPSBsaW5rOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBsaW5rLnN1YnN0cmluZygwLGluZGV4KTsKLQkJCWRlc3RpbmF0aW9uTmFtZSA9IGxpbmsuc3Vic3RyaW5nKGluZGV4KzEpOwotCQkJbW9kdWxlUmVmID0gZ2V0TW9kdWxlUmVmQnlOYW1lKG1vZHVsZU5hbWUpOwotCQkJaWYgKG1vZHVsZVJlZiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQkKLQkJfQotCQlMaXN0IGRlc3RpbmF0aW9ucyA9IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMobW9kdWxlUmVmKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXN0aW5hdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1lc3NhZ2VEZXN0aW5hdGlvbiBtZXNzYWdlRGVzdGluYXRpb24gPSAoTWVzc2FnZURlc3RpbmF0aW9uKSAoZGVzdGluYXRpb25zLmdldChpKSk7Ci0JCQlpZiAoZGVzdGluYXRpb25OYW1lLmVxdWFscyhtZXNzYWdlRGVzdGluYXRpb24uZ2V0TmFtZSgpKSkgcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIE1vZHVsZVJlZiBnZXRNb2R1bGVSZWZCeU5hbWUoU3RyaW5nIG1vZHVsZU5hbWUpIHsKLQkJTGlzdCBtb2R1bGVMaXN0ID0gZWFyRmlsZS5nZXRNb2R1bGVSZWZzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlUmVmIHJlZiA9IChNb2R1bGVSZWYpIG1vZHVsZUxpc3QuZ2V0KGkpOwotCQkJTW9kdWxlIG1vZHVsZSA9IHJlZi5nZXRNb2R1bGUoKTsKLQkJCWlmIChtb2R1bGVOYW1lLmVxdWFscyhtb2R1bGUuZ2V0VXJpKCkpKSB7Ci0JCQkJcmV0dXJuIHJlZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCXByaXZhdGUgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKE1vZHVsZVJlZiByZWYpIHsKLQkJTGlzdCBkZXN0aW5hdGlvblJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQl0cnkgewotCQkJaWYocmVmLmlzV2ViKCkpIHsKLQkJCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcClyZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlkZXN0aW5hdGlvblJlZnMuYWRkQWxsKHdlYkFwcC5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpOwotCQkJfSBlbHNlIGlmKCByZWYuaXNFSkIoKSApIHsKLQkJCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcilyZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlkZXN0aW5hdGlvblJlZnMuYWRkQWxsKGdldEVKQk1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoZWpiSmFyKSk7Ci0JCQl9IGVsc2UgaWYocmVmLmlzQ2xpZW50KCkpIHsKLQkJCQlBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnQgPSAoQXBwbGljYXRpb25DbGllbnRJbXBsKXJlZi5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCWRlc3RpbmF0aW9uUmVmcy5hZGRBbGwoYXBwQ2xpZW50LmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlFeGNlcHRpb24gbmVzdGVkID0gZXguZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCQlpZiAoIShuZXN0ZWQgaW5zdGFuY2VvZiBOb01vZHVsZUZpbGVFeGNlcHRpb24pKSB7Ci0JCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJhbXNbMF0gPSByZWYuZ2V0VXJpKCk7Ci0JCQkJYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfTU9EVUxFX0REX0ZJTEVfTk9UX0ZPVU5ELCBwYXJhbXMpOwotCQkJfQotCQl9IAotCQkJCi0JCQotCQlyZXR1cm4gZGVzdGluYXRpb25SZWZzOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0RUpCTWVzc2FnZURlc3RpbmF0aW9uUmVmcyhFSkJKYXIgZWpiSmFyKSB7Ci0JCUxpc3QgZWpiTWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYoIGVqYkphciAhPSBudWxsICkgewotCQkJTGlzdCBlamJDb2xsZWN0aW9uID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwkJCQotCQkJaWYoIGVqYkNvbGxlY3Rpb24gIT0gbnVsbCB8fCAhZWpiQ29sbGVjdGlvbi5pc0VtcHR5KCkgKSB7Ci0JCQkgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBlamJDb2xsZWN0aW9uLml0ZXJhdG9yKCk7CQotCQkJCXdoaWxlKCBpdGVyYXRvci5oYXNOZXh0KCkgKSB7Ci0JCQkJCUVudGVycHJpc2VCZWFuIGVqYkJlYW4gPSAoRW50ZXJwcmlzZUJlYW4paXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiggZWpiQmVhbiAhPSBudWxsICkgewotCQkJCQkJZWpiTWVzc2FnZURlc3RpbmF0aW9uUmVmcy5hZGRBbGwoZWpiQmVhbi5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlamJNZXNzYWdlRGVzdGluYXRpb25SZWZzOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucyhNb2R1bGVSZWYgcmVmKSB7Ci0JCUxpc3QgZGVzdGluYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJaWYocmVmLmlzV2ViKCkpIHsKLQkJCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcClyZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlkZXN0aW5hdGlvbnMuYWRkQWxsKHdlYkFwcC5nZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpOwotCQkJfSBlbHNlIGlmKCByZWYuaXNFSkIoKSApIHsKLQkJCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcilyZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlpZiAoZWpiSmFyICE9IG51bGwgJiYgZWpiSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpICE9IG51bGwpCi0JCQkJCWRlc3RpbmF0aW9ucy5hZGRBbGwoZWpiSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLmdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSk7Ci0JCQl9IGVsc2UgaWYocmVmLmlzQ2xpZW50KCkpIHsKLQkJCQlBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnQgPSAoQXBwbGljYXRpb25DbGllbnRJbXBsKXJlZi5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCWRlc3RpbmF0aW9ucy5hZGRBbGwoYXBwQ2xpZW50LmdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlFeGNlcHRpb24gbmVzdGVkID0gZXguZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCQlpZiAoIShuZXN0ZWQgaW5zdGFuY2VvZiBOb01vZHVsZUZpbGVFeGNlcHRpb24pKSAKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JCXJldHVybiBkZXN0aW5hdGlvbnM7Ci0JfQotCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCV9oZWxwZXIgPSBoZWxwZXI7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQllYXJGaWxlID0gbnVsbDsKLQkJYXBwREQgPSBudWxsOwotCQlzdXBlci5jbGVhbnVwKHJlcG9ydGVyKTsKLQl9CQotCi19Ly8gRWFyVmFsaWRhdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRW50ZXJwcmlzZUJlYW4xMVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRW50ZXJwcmlzZUJlYW4xMVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjEzYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VudGVycHJpc2VCZWFuMTFWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlamItamFyLnhtbCBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiAxNS4yLjUuMyBEZWNsYXJhdGlvbiBvZiBzZWN1cml0eSByb2xlcyByZWZlcmVuY2VkIGZyb20gdGhlIGJlYW4ncyBjb2RlCi0gKiBUaGUgQmVhbiBQcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgZGVjbGFyaW5nIGluIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50cyBvZiB0aGUgZGVwbG95LW1lbnQKLSAqIGRlc2NyaXB0b3IgYWxsIHRoZSBzZWN1cml0eSByb2xlIG5hbWVzIHVzZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLiBEZWNsYXJpbmcgdGhlIHNlY3VyaXR5IHJvbGVzCi0gKiByZWZlcmVuY2VzIGluIHRoZSBjb2RlIGFsbG93cyB0aGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIG9yIERlcGxveWVyIHRvIGxpbmsgdGhlIG5hbWVzIG9mIHRoZSBzZWN1cml0eQotICogcm9sZXMgdXNlZCBpbiB0aGUgY29kZSB0byB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBmb3IgYW4gYXNzZW1ibGVkIGFwcGxpY2F0aW9uIHRocm91Z2ggdGhlIHNlY3Utcml0eS0KLSAqIHJvbGUgZWxlbWVudHMuCi0gKiBUaGUgQmVhbiBQcm92aWRlciBtdXN0IGRlY2xhcmUgZWFjaCBzZWN1cml0eSByb2xlIHJlZmVyZW5jZWQgaW4gdGhlIGNvZGUgdXNpbmcgdGhlIHNlY3Utcml0eS0KLSAqIHJvbGUtcmVmIGVsZW1lbnQgYXMgZm9sbG93czoKLSAqICAgICAgRGVjbGFyZSB0aGUgbmFtZSBvZiB0aGUgc2VjdXJpdHkgcm9sZSB1c2luZyB0aGUgcm9sZS1uYW1lIGVsZW1lbnQuIFRoZSBuYW1lIG11c3QgYmUgdGhlCi0gKiBzZWN1cml0eSByb2xlIG5hbWUgdGhhdCBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBpc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZS1OYW1lKQotICogbWV0aG9kLgotICogICAgICBPcHRpb25hbDogUHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIGluIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50LgotICogQSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSwgaW5jbHVkaW5nIHRoZSBuYW1lIGRlZmluZWQgYnkgdGhlIHJvbGUtbmFtZSBlbGVtZW50LCBpcyBzY29wZWQgdG8gdGhlIHNlcy1zaW9uCi0gKiBvciBlbnRpdHkgYmVhbiBlbGVtZW50IHdob3NlIGRlY2xhcmF0aW9uIGNvbnRhaW5zIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50LgotICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGhvdyBhbiBlbnRlcnByaXNlIGJlYW4ncyByZWZlcmVuY2VzIHRvIHNlY3VyaXR5IHJvbGVzIGFyZSBkZWNsYXJlZCBpbgotICogdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqICAgIC4uLgotICogICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gKiAgICAgICAuLi4KLSAqICAgICAgIDxlbnRpdHk+Ci0gKiAgICAgICAgICA8ZWpiLW5hbWU+QWFyZHZhcmtQYXlyb2xsPC9lamItbmFtZT4KLSAqICAgICAgICAgIDxlamItY2xhc3M+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEJlYW48L2VqYi1jbGFzcz4KLSAqICAgICAgICAgIC4uLgotICogICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICogICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgotICogICAgICAgICAgICAgICAgIFRoaXMgc2VjdXJpdHkgcm9sZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgZW1wbG95ZWVzIG9mIHRoZSBwYXlyb2xsIGRlcGFydG1lbnQgd2hvIGFyZQotICogICAgICAgICAgICAgICAgIGFsbG93ZWQgdG8gdXBkYXRlIGVtcGxveWVlcycgc2FsYXJpZXMuCi0gKiAgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICogICAgICAgICAgICAgPHJvbGUtbmFtZT5wYXlyb2xsPC9yb2xlLW5hbWU+Ci0gKiAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICogICAgICAgICAgLi4uCi0gKiAgICAgICA8L2VudGl0eT4KLSAqICAgICAgIC4uLgotICogICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICogICAgLi4uCi0gKgotICogVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhYm92ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50ZXJwcmlzZSBiZWFuIEFhcmR2YXJrUGF5cm9sbCBtYWtlcyB0aGUKLSAqIHNlY3VyaXR5IGNoZWNrIHVzaW5nIGlzQ2FsbGVySW5Sb2xlKCJwYXlyb2xsIikgaW4gaXRzIGJ1c2luZXNzIG1ldGhvZC4KLSAqCi0gKgotICogMTUuMy4zIExpbmtpbmcgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzIHRvIHNlY3VyaXR5IHJvbGVzCi0gKiBJZiB0aGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIGRlZmluZXMgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgaGUKLSAqIG9yIHNoZSBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBsaW5raW5nIGFsbCB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzIGRlY2xhcmVkIGluIHRoZSBzZWN1LXJpdHktCi0gKiByb2xlLXJlZiBlbGVtZW50cyB0byB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLSAqIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgbGlua3MgZWFjaCBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSB0byBhIHNlY3VyaXR5IHJvbGUgdXNpbmcgdGhlIHJvbGUtbGluawotICogZWxlbWVudC4gVGhlIHZhbHVlIG9mIHRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbgotICogYSBzZWN1cml0eS1yb2xlIGVsZW1lbnQuCi0gKiBBIHJvbGUtbGluayBlbGVtZW50IG11c3QgYmUgdXNlZCBldmVuIGlmIHRoZSB2YWx1ZSBvZiByb2xlLW5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZQotICogcm9sZS1saW5rIHJlZmVyZW5jZS4KLSAqIFRoZSBmb2xsb3dpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIGV4YW1wbGUgc2hvd3MgaG93IHRvIGxpbmsgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIG5hbWVkCi0gKiBwYXlyb2xsIHRvIHRoZSBzZWN1cml0eSByb2xlIG5hbWVkIHBheXJvbGwtZGVwYXJ0bWVudC4KLSAqICAgIC4uLgotICogICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gKiAgICAgICAuLi4KLSAqICAgICAgIDxlbnRpdHk+Ci0gKiAgICAgICAgICA8ZWpiLW5hbWU+QWFyZHZhcmtQYXlyb2xsPC9lamItbmFtZT4KLSAqICAgICAgICAgIDxlamItY2xhc3M+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEJlYW48L2VqYi1jbGFzcz4KLSAqICAgICAgICAgIC4uLgotICogICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICogICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgotICogICAgICAgICAgICAgICAgVGhpcyByb2xlIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgIGVtcGxveWVlcyBvZiB0aGUgcGF5cm9sbCBkZXBhcnRtZW50LgotICogICAgICAgICAgICAgICAgTWVtYmVycyBvZiB0aGlzIHJvbGUgaGF2ZSBhY2Nlc3MgdG8KLSAqICAgICAgICAgICAgICAgIGFueW9uZSdzIHBheXJvbGwgcmVjb3JkLgotICoKLSAqICAgICAgICAgICAgICAgIFRoZSByb2xlIGhhcyBiZWVuIGxpbmtlZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgIHBheXJvbGwtZGVwYXJ0bWVudCByb2xlLgotICogICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgIDxyb2xlLW5hbWU+cGF5cm9sbDwvcm9sZS1uYW1lPgotICogICAgICAgICAgICAgPHJvbGUtbGluaz5wYXlyb2xsLWRlcGFydG1lbnQ8L3JvbGUtbGluaz4KLSAqICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gKiAgICAgICAgICAuLi4KLSAqICAgICAgIDwvZW50aXR5PgotICogICAgICAgLi4uCi0gKiAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0gKiAgICAuLi4KLSAqLwotcHVibGljIGNsYXNzIEVudGVycHJpc2VCZWFuMTFWUnVsZSBleHRlbmRzIEFWYWxpZGF0aW9uUnVsZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfRU5URVJQUklTRUJFQU47Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9SRU1PVEV9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXByaXZhdGUgTGlzdCBfc2VjdXJpdHlSb2xlcyA9IG51bGw7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAxLCBuZXcgU3RyaW5nW117Q0hLSjI4MDEgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMl9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAyX05BTUVEICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDJfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAyX1VOTkFNRUQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwM19OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAzX05BTUVEICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDNfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAzX1VOTkFNRUQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNF9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODA0X05BTUVEICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDRfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODA0X1VOTkFNRUQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNiwgbmV3IFN0cmluZ1tde0NIS0oyODA2ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNyArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA4LCBuZXcgU3RyaW5nW117Q0hLSjI4MDggKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwOSwgbmV3IFN0cmluZ1tde0NIS0oyODA5ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMF9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODEwX05BTUVEICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTBfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODEwX1VOTkFNRUQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMV9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODExX05BTUVEICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTFfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODExX1VOTkFNRUQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMiwgbmV3IFN0cmluZ1tde0NIS0oyODEyICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMCwgbmV3IFN0cmluZ1tde0NIS0oyODIwICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjIsIG5ldyBTdHJpbmdbXXtDSEtKMjgyMiArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODIzLCBuZXcgU3RyaW5nW117Q0hLSjI4MjMgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNCwgbmV3IFN0cmluZ1tde0NIS0oyODI0ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjcsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNyArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI4LCBuZXcgU3RyaW5nW117Q0hLSjI4MjggKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMwLCBuZXcgU3RyaW5nW117Q0hLSjI4MzAgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMSwgbmV3IFN0cmluZ1tde0NIS0oyODMxICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzIsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMiArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMzLCBuZXcgU3RyaW5nW117Q0hLSjI4MzMgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNCwgbmV3IFN0cmluZ1tde0NIS0oyODM0ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzUsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM2LCBuZXcgU3RyaW5nW117Q0hLSjI4MzYgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNywgbmV3IFN0cmluZ1tde0NIS0oyODM3ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzgsIG5ldyBTdHJpbmdbXXtDSEtKMjgzOCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM5LCBuZXcgU3RyaW5nW117Q0hLSjI4MzkgKyBTUEVDfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDAsIG5ldyBTdHJpbmdbXXtDSEtKMjg0MCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQxLCBuZXcgU3RyaW5nW117Q0hLSjI4NDEgKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODUyLCBuZXcgU3RyaW5nW117Q0hLSjI4NTJ9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwOCwgbmV3IFN0cmluZ1tde0NIS0oyOTA4ICsgU1BFQ30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJLy8gSWYgY2FsbGVkIGFzIGEgZGVwZW5kZW50LCBwYXJlbnQgd2lsbCBiZSB0aGlzIEVudGVycHJpc2VCZWFuLgotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIDYuNS4zIFRoZSBvcHRpb25hbCBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZQotCSAqLi4uCi0JICogT25seSBhIHN0YXRlZnVsIFNlc3Npb24gYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uIG1heSAKLQkgKiBpbXBsZW1lbnQgdGhlIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCSAqLi4uCi0JICogVGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBTZXNzaW9uIGJlYW4gd2l0aCBiZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gdG8gcmVseSBvbiB0aGUgCi0JICogc3luY2hyb25pemF0aW9uIGNhbGwgYmFja3MgYmVjYXVzZSB0aGUgYmVhbiBpcyBpbiBjb250cm9sIG9mIHRoZSBjb21taXQgdGhlIGJlYW4gCi0JICoga25vd3Mgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYWJvdXQgdG8gYmUgY29tbWl0dGVkIGFuZCBpdCBrbm93cyB0aGUgb3V0Y29tZSBvZiB0aGUgCi0JICogdHJhbnNhY3Rpb24gY29tbWl0LgotCSAqLi4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZFNlc3Npb25UeXBlRWxlbWVudChTZXNzaW9uIHNlc3Npb24pIHsKLQkJLy8gY2hlY2sgc3ludGF4Ci0JCWlmICghc2Vzc2lvbi5pc1NldFNlc3Npb25UeXBlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChzZXNzaW9uLmdldFNlc3Npb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBTZXNzaW9uVHlwZS5TVEFURUZVTCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoc2Vzc2lvbi5nZXRTZXNzaW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gU2Vzc2lvblR5cGUuU1RBVEVMRVNTKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZFRyYW5zYWN0aW9uVHlwZUVsZW1lbnQoU2Vzc2lvbiBzZXNzaW9uQmVhbikgewotCQlpZiAoIXNlc3Npb25CZWFuLmlzU2V0VHJhbnNhY3Rpb25UeXBlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChzZXNzaW9uQmVhbi5nZXRUcmFuc2FjdGlvblR5cGUoKS5nZXRWYWx1ZSgpID09IFRyYW5zYWN0aW9uVHlwZS5CRUFOKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChzZXNzaW9uQmVhbi5nZXRUcmFuc2FjdGlvblR5cGUoKS5nZXRWYWx1ZSgpID09IFRyYW5zYWN0aW9uVHlwZS5DT05UQUlORVIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQkvKioKLQkgKiBJZiB0aGUgYmVhbiBjb21wb25lbnRzIChob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZSwgYmVhbiBjbGFzcywgYW5kIHByaW1hcnkKLQkgKiBrZXkpIGNhbiBhbGwgYmUgZm91bmQgYW5kIHJlZmxlY3RlZCwgcmV0dXJuIHRydWUuIEVsc2UsIGFkZCBhIHZhbGlkYXRpb24gZXJyb3IKLQkgKiBhZ2FpbnN0IHRoZSBiZWFuLCBhbmQgcmV0dXJuIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmVhbkNvbXBvbmVudHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0JCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhlIGJlYW4gaXMgbnVsbCwgYmVjYXVzZSB0aGlzIG1ldGhvZCB3aWxsCi0JCS8vIG5vdCBiZSBjYWxsZWQgaWYgaXQgaXMuCi0JCXRyeSB7Ci0JCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRFamJDbGFzcygpKTsKLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJaWYgKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCkpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwMl9OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBuZXcgU3RyaW5nW10geyBiZWFuLmdldEVqYkNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDJfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCWlmIChiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Ib21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwM19OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBuZXcgU3RyaW5nW10geyBiZWFuLmdldEhvbWVJbnRlcmZhY2VOYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwM19VTk5BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlpZiAoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCkpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwNF9OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBuZXcgU3RyaW5nW10geyBiZWFuLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODA0X1VOTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChiZWFuLmlzRW50aXR5KCkpIHsKLQkJCUphdmFDbGFzcyBwcmltYXJ5S2V5ID0gKChFbnRpdHkpIGJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJCXRyeSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHByaW1hcnlLZXkpOwotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlpZiAoKChFbnRpdHkpIGJlYW4pLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRpdHlfUHJpbWFyeUtleSgpKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODEwX05BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIG5ldyBTdHJpbmdbXSB7ICgoRW50aXR5KSBiZWFuKS5nZXRQcmltYXJ5S2V5TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODEwX1VOTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNWYWxpZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDTVBGaWVsZEVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgewotCQkJLy8gY2hlY2sgc3ludGF4IG9mIHRhZyBpcyBva2F5Ci0JCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOwotCQkJTGlzdCBmaWVsZHMgPSBjbXAuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQkJCWlmICgoZmllbGRzID09IG51bGwpIHx8IChmaWVsZHMuc2l6ZSgpID09IDApKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgxMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBuZXcgU3RyaW5nW10geyBiZWFuLmdldEVqYkNsYXNzTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gbWFwc1RvTXVsdGlwbGVGaWVsZHMgPSAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHJpbWl0aXZlUHJpbWFyeUtleSgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbik7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOwotCQkJRmllbGQgZmllbGQgPSBudWxsOwotCQkJTGlzdCBmaWVsZE5hbWVzID0gbmV3IEFycmF5TGlzdChmaWVsZHMuc2l6ZSgpKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlDTVBBdHRyaWJ1dGUgYXR0cmliID0gKENNUEF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChhdHRyaWIgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkREVmFsaWRhdG9yLnZhbGlkYXRlQ01QRmllbGRFbGVtZW50KEVudGVycHJpc2VCZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllbnRyeS5zZXRUZXh0KCJDTVBBdHRyaWJ1dGUgaXMgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWZpZWxkID0gYXR0cmliLmdldEZpZWxkKCk7Ci0JCQkJaWYgKGZpZWxkID09IG51bGwpIHsKLQkJCQkJaWYgKGF0dHJpYi5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgxMV9OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBuZXcgU3RyaW5nW10geyBhdHRyaWIuZ2V0TmFtZSgpLCBiZWFuLmdldEVqYkNsYXNzTmFtZSgpfSwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgxMV9VTk5BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklFTEROQU1FX1NFUklBTFZFUlNJT05VSUQpKSB7Ci0JCQkJCS8vIG5vdCBhIGN1c3RvbWVyLWVudGVyZWQgZmllbGQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJZmllbGROYW1lcy5hZGQoZmllbGQuZ2V0TmFtZSgpKTsKLQotCQkJCXRyeSB7Ci0JCQkJCS8vIElmIHRoZSBmaWVsZCBpcyBub3QgYSB2YWxpZCB0eXBlCi0JCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShmaWVsZCkpOwotCQkJCX0KLQkJCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJCQkvLyBmaWVsZCBub3QgaWRlbnRpZmllZAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODMwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tdIHsgZmllbGQuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyA5LjQuNy4yCi0JCQlpZiAobWFwc1RvTXVsdGlwbGVGaWVsZHMgJiYgIVZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJCUxpc3QgcHJpbUtleUZpZWxkcyA9IGNtcC5nZXRQcmltYXJ5S2V5KCkuZ2V0RmllbGRzRXh0ZW5kZWQoKTsKLQotCQkJCS8vICg5LjQuNy4xIGlzIHZhbGlkYXRlZCBpbiB2YWxpZGF0ZVByaW1LZXlDbGFzc0VsZW1lbnQoYmVhbikKLQkJCQkvLyBjaGVjayBpZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MnIGZpZWxkcyBleGlzdCBpbiB0aGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JCQkJaXRlcmF0b3IgPSBwcmltS2V5RmllbGRzLml0ZXJhdG9yKCk7Ci0KLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUZpZWxkIGtleUZpZWxkID0gKEZpZWxkKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmICgoa2V5RmllbGQuZ2V0TmFtZSgpICE9IG51bGwpICYmIChrZXlGaWVsZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSUVMRE5BTUVfU0VSSUFMVkVSU0lPTlVJRCkpKSB7Ci0JCQkJCQkvLyBub3QgYSBjdXN0b21lci1lbnRlcmVkIGZpZWxkCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmICghZmllbGROYW1lcy5jb250YWlucyhrZXlGaWVsZC5nZXROYW1lKCkpKSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODMxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tdIHsga2V5RmllbGQuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyB2YWxpZGF0ZURlcGxveW1lbnREZXNjcmlwdG9yIGlzIGNhbGxlZCBpZiB0aGUgRUpCSmFyIGNvdWxkIGxvYWQsIHdoaWNoIG1lYW5zCi0JICogdGhhdCB0aGUgc3ludGF4IG9mIHRoZSBKQVIgaXMgKG1vc3RseSkgY29ycmVjdC4KLQkgKgotCSAqIEVKQiBzcGVjIDEuMSwgc2VjdGlvbiBDLjQsICJBZGRlZCB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBCZWFuIFByb3ZpZGVyIHRvIHNwZWNpZnkgd2hldGhlciB0aGUKLQkgKiBlbnRlcnByaXNlIGJlYW4gdXNlcyBhIGJlYW4tbWFuYWdlZCBvciBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbi4iCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB7Ci0JCUVKQkphciBlamJKYXIgPSBudWxsOwotCQlpZih0YXJnZXRQYXJlbnQgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikgewotCQkJLy8gcnVubmluZyBhcyBhIGRlcGVuZGVudAotCQkJZWpiSmFyID0gKEVKQkphcil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9NT0RFTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllamJKYXIgPSAoRUpCSmFyKXRhcmdldFBhcmVudDsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKXRhcmdldDsKLQkJCi0JCXZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjkwOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQotCQkJLy8gSWYgYmVhbiBpc24ndCB2YWxpZCwgZG9uJ3QgcGVyZm9ybSBhbnkgb2YgdGhlIG90aGVyCi0JCQkvLyB2YWxpZGF0aW9uIGNoZWNrcyBvbiBpdC4KLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyBDaGVjayBpZiB0aGUgY2xhc3MgZXhpc3RzLCBldGMuCi0JCQlib29sZWFuIHJlZmxlY3RlZCA9IHZhbGlkYXRlQmVhbkNvbXBvbmVudHModmMsIGVqYkphciwgYmVhbik7IC8vIGFzc3VtZSBldmVyeXRoaW5nIHdpbGwgcmVmbGVjdCBwcm9wZXJseQotCi0JCQl2YWxpZGF0ZUVudGVycHJpc2VUeXBlRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlRUpCTmFtZUVsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZVJlZW50cmFudEVsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZVNlc3Npb25UeXBlRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlVHJhbnNhY3Rpb25UeXBlRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlUGVyc2lzdGVuY2VUeXBlRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlRW52aXJvbm1lbnRFbnRyaWVzKHZjLCBlamJKYXIsIGJlYW4pOwotCi0JCQlpZiAoIXJlZmxlY3RlZCkgewotCQkJCS8vIFNvbWV0aGluZyBkaWRuJ3QgcmVmbGVjdCBwcm9wZXJseSwgc28gZG9uJ3QgY29udGludWUgd2l0aCB0aGUKLQkJCQkvLyByZXN0IG9mIHRoZSBjaGVja3MuIFNvbWUgbWV0YWRhdGEgd2lsbCBiZSBub25zZW5zZS4KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbjsKLQkJCQlpZiAoY21wLmdldFByaW1LZXlGaWVsZCgpICE9IG51bGwgJiYgIWNtcC5nZXRQcmltS2V5RmllbGQoKS5lSXNQcm94eSgpKSB7Ci0JCQkJCS8vIERvbid0IHZhbGlkYXRlIHRoZSBmaWVsZHMgaWYgaXQncyBuZWl0aGVyIGEgcHJpbWl0aXZlIHByaW1hcnkga2V5IG5vciBhIGNvbXBvdW5kIHByaW1hcnkga2V5LgotCQkJCQkvLyBJZiB0aGUgdXNlciB3YXMgYXR0ZW1wdGluZyBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleSwgYnV0IGRpZCBhIHR5cG8gaW4gZWpiLWphci54bWwsCi0JCQkJCS8vIHRoZSB1c2VyIHdpbGwgc2VlIGEgbG90IG9mIHN0cmFuZ2UgbWVzc2FnZXMgbG9nZ2VkIGFnYWluc3QgdGhlIGZpZWxkcyBpbiB0aGUgcHJpbWl0aXZlIHByaW1hcnkga2V5LgotCQkJCQl2YWxpZGF0ZUNNUEZpZWxkRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXZhbGlkYXRlUHJpbUtleUNsYXNzRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlRUpCUmVmKHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVTZWN1cml0eVJvbGVSZWZFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQl9Ci0JCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCQkvKiB1bnJlYWNoYWJsZSBjYXRjaCBibG9jawotCQljYXRjaChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJLy8gSWYgdGhlcmUncyBhIHByb2JsZW0sIHByb2NlZWQgd2l0aCB0aGUgbmV4dCBiZWFuLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tdIHsgYmVhbi5nZXROYW1lKCkgfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJTXNnTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJKi8KLQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCS8vIElmIHRoZXJlJ3MgYSBwcm9ibGVtLCBwcm9jZWVkIHdpdGggdGhlIG5leHQgYmVhbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW10geyBiZWFuLmdldE5hbWUoKSB9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCTmFtZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gYmVhbi5nZXROYW1lKCk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSBzZWN0aW9uIDE0LjMgb2YgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDE0LjMgRUpCIFJlZmVyZW5jZXMKLQkgKiAgIDE0LjMuMSBCZWFuIFByb3ZpZGVyJ3MgcmVzcG9uc2liaWxpdGllcwotCSAqICAgICAxNC4zLjEuMSBFSkIgcmVmZXJlbmNlIHByb2dyYW1taW5nIGludGVyZmFjZXMKLQkgKiAgICAgMTQuMy4xLjIgRGVjbGFyYXRpb24gb2YgRUpCIHJlZmVyZW5jZXMgaW4gZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICogICAxNC4zLjIgQXBwbGljYXRpb24gQXNzZW1ibGVyJ3MgcmVzcG9uc2liaWxpdGllcwotCSAqICAgMTQuMy4zIERlcGxveWVyJ3MgcmVzcG9uc2liaWxpdHkKLQkgKiAgIDE0LjMuNCBDb250YWluZXIgUHJvdmlkZXIncyByZXNwb25zaWJpbGl0eQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCUmVmKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGVqYlJlZnMgPSBiZWFuLmdldEVqYlJlZnMoKTsKLQkJaWYgKChlamJSZWZzID09IG51bGwpIHx8IChlamJSZWZzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlamJSZWZzLml0ZXJhdG9yKCk7Ci0JCUVqYlJlZiByZWYgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZWYgPSAoRWpiUmVmKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocmVmID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkREVmFsaWRhdG9yLnZhbGlkYXRlRUpCUmVmKEVudGVycHJpc2VCZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIkVqYlJlZiBpcyBudWxsIGluICIgKyBiZWFuLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIDE0LjMuMS4xCi0JCQkvLyBJbmZvIG1zc2cuICJFSkIgc3BlYyByZWNvbW1lbmRzIHRoYXQgYWxsIHJlZmVyZW5jZXMgdG8gb3RoZXIgZW50ZXJwcmlzZSBiZWFucyBiZSBvcmdhbml6ZWQgaW4gdGhlIGVqYiBzdWJjb250ZXh0IG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQiCi0JCQlFbnRlcnByaXNlQmVhbiBuYW1lZEVqYiA9IG51bGw7Ci0JCQlpZiAocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfTGluaygpKSkgewotCQkJCS8vIExvYWQgdGhlIEVKQiBpZGVudGlmaWVkIGJ5IHRoZSByZWZlcmVuY2UsIGlmIGl0IGV4aXN0cy4KLQkJCQluYW1lZEVqYiA9IGVqYkphci5nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihyZWYpOwotCQkJCWlmIChuYW1lZEVqYiAhPSBudWxsKSB7Ci0JCQkJCS8vIGlmIGl0J3MgbnVsbCwgbGV0IHRoZSBFQVIgdmFsaWRhdG9yIHJlcG9ydCBpdAotCQkJCQlJbnRlZ2VyIGVqYlR5cGUgPSBuZXcgSW50ZWdlcihyZWYuZ2V0VHlwZSgpLmdldFZhbHVlKCkpOwotCQkJCQlib29sZWFuIHdyb25nVHlwZSA9IGZhbHNlOyAvLyBpcyB0aGUgRUpCLCBpZGVudGlmaWVkIGJ5IGVqYi1saW5rLCBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50PwotCQkJCQlTdHJpbmcgdHlwZSA9IChuYW1lZEVqYiBpbnN0YW5jZW9mIFNlc3Npb24pID8gIlNlc3Npb24iIDogIkVudGl0eSI7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJaWYgKGVqYlR5cGUgPT0gbnVsbCkgewotCQkJCQkJLy8gTmVpdGhlciBzZXNzaW9uIG5vciBlbnRpdHk/Ci0JCQkJCQl3cm9uZ1R5cGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGVqYlR5cGUuaW50VmFsdWUoKSA9PSBFamJSZWZUeXBlLlNFU1NJT04pIHsKLQkJCQkJCWlmICghKG5hbWVkRWpiIGluc3RhbmNlb2YgU2Vzc2lvbikpIHsKLQkJCQkJCQl3cm9uZ1R5cGUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGVqYlR5cGUuaW50VmFsdWUoKSA9PSBFamJSZWZUeXBlLkVOVElUWSkgewotCQkJCQkJaWYgKCEobmFtZWRFamIgaW5zdGFuY2VvZiBFbnRpdHkpKSB7Ci0JCQkJCQkJd3JvbmdUeXBlID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXdyb25nVHlwZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKHdyb25nVHlwZSkgewotCQkJCQkJU3RyaW5nW10gcGFybXMgPSB7IG5hbWVkRWpiLmdldE5hbWUoKSwgdHlwZSB9OwotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcm1zLCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIDE0LjMuMS4yLCAxNC4zLjIsIDE0LjMuNAotCQkJLy8gQ2hlY2sgdGhhdCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwgaG9tZSwgYW5kIHJlbW90ZSBoYXZlIGJlZW4gZGVmaW5lZCwgYW5kIGV4aXN0Ci0JCQl2YWxpZGF0ZUhvbWVSZWYodmMsIGVqYkphciwgcmVmLCBuYW1lZEVqYik7Ci0JCQl2YWxpZGF0ZVJlbW90ZVJlZih2YywgZWpiSmFyLCByZWYsIG5hbWVkRWpiKTsKLQotCQkJLy8gMTQuMy4xLjEKLQkJCS8vIEluZm8gbXNzZy4gIkVKQiBzcGVjIHJlY29tbWVuZHMgdGhhdCBhbGwgcmVmZXJlbmNlcyB0byBvdGhlciBlbnRlcnByaXNlIGJlYW5zIGJlIG9yZ2FuaXplZCBpbiB0aGUgZWpiIHN1YmNvbnRleHQgb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudCIKLQkJCWlmIChyZWYuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkvLyBJZiBlamIgbmFtZSBpc24ndCBzZXQsIHRoYXQgZXJyb3Igd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBvbmUgb2YgdGhlIHZhbGlkYXRlUmVmIG1ldGhvZHMKLQkJCQkvLyBEb24ndCBkdXBsaWNhdGUgdGhhdCBlZmZvcnQgaGVyZS4KLQkJCQlTdHJpbmcgZWpiTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQkJaWYgKCFlamJOYW1lLnN0YXJ0c1dpdGgoImVqYi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFbnRlcnByaXNlVHlwZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCS8vIEF0dGVtcHQgaW4gdmFpbiB0byB2YWxpZGF0ZSB0aGUgZW50ZXJwcmlzZSB0eXBlIGVsZW1lbnQgaGVyZSwgYmVjYXVzZSAKLQkJLy8gaWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGVyZSdzIGEgc3ludGF4IGVycm9yLCBhbmQgdGhlIAotCQkvLyB2YWxpZGF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElSZXBvcnRlciwgSVZhbGlkYXRpb25Db250ZXh0KSB3b3VsZCBoYXZlIGJlZW4gCi0JCS8vIGNhbGxlZCBpbnN0ZWFkLgotCQkvKgotCQlpZighIChiZWFuLmlzU2Vzc2lvbigpIHx8IGJlYW4uaXNFbnRpdHkoKSApKSB7Ci0JCQkvLyBubyB0YWcgc3BlY2lmaWVkCi0JCQlTdHJpbmcgYmVhbk5hbWUgPSAoYmVhbi5nZXROYW1lKCkgPT0gbnVsbCkgPyAiIiA6IGJlYW4uZ2V0TmFtZSgpOwotCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkVKQl9ERF9JTlZBTElEX0VOVEVSUFJJU0VUWVBFLCBuZXcgU3RyaW5nW117YmVhbk5hbWV9LCBiZWFuKTsKLQkJfQotCQkqLwotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSBzZWN0aW9uIDE0LjMgb2YgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDE0LjIuMS4yIERlY2xhcmF0aW9uIG9mIGVudmlyb25tZW50IGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVudmlyb25tZW50RW50cmllcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBlbnZFbnRyaWVzID0gYmVhbi5nZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKTsKLQkJaWYgKChlbnZFbnRyaWVzID09IG51bGwpIHx8IChlbnZFbnRyaWVzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRW52RW50cnkgZW52RW50cnkgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVudkVudHJpZXMuaXRlcmF0b3IoKTsKLQkJRHVwbGljYXRlc1RhYmxlIGVudk5hbWVzID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQllbnZFbnRyeSA9IChFbnZFbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVudkVudHJ5ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkREVmFsaWRhdG9yLnZhbGlkYXRlRW52aXJvbm1lbnRFbnRyaWVzKEVudGVycHJpc2VCZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIkVqYkVudHJ5IGlzIG51bGwgaW4gIiArIGJlYW4uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoZW52RW50cnkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQllbnZOYW1lcy5hZGQoZW52RW50cnkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQlpZiAoZW52RW50cnkuaXNTZXRUeXBlKCkpIHsKLQkJCQkvLyAxNC4yLjEuMjsgdHlwZSBtdXN0IGJlIG9uZSBvZiB0aGVzZSB0eXBlczogU3RyaW5nLCBJbnRlZ2VyLCBCb29sZWFuLCBEb3VibGUsIEJ5dGUsIFNob3J0LCBMb25nLCBhbmQgRmxvYXQuCi0JCQkJaW50IHR5cGUgPSBlbnZFbnRyeS5nZXRUeXBlKCkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoISgodHlwZSA9PSBFbnZFbnRyeVR5cGUuQk9PTEVBTikgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLkJZVEUpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5ET1VCTEUpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5GTE9BVCkgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLklOVEVHRVIpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5MT05HKSB8fCAodHlwZSA9PSBFbnZFbnRyeVR5cGUuU0hPUlQpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5TVFJJTkcpKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZW52TmFtZXMuY29udGFpbnNEdXBsaWNhdGVzKCkpIHsKLQkJCUl0ZXJhdG9yIGR1cHMgPSBlbnZOYW1lcy5nZXREdXBsaWNhdGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChkdXBzLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZHVwcy5uZXh0KCk7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IG5hbWUgfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgRWpiUmVmIGlzIG5vdCB2YWxpZCwgYWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlLgotCSAqCi0JICogQHBhcm0gRWpiUmVmIFRoZSA8ZWpiLXJlZj4gZWxlbWVudCB0aGlzIG1ldGhvZCB2YWxpZGF0ZXMuCi0JICogQHBhcm0gRW50ZXJwcmlzZUJlYW4gSWYgdGhlIDxlamItcmVmPiB1c2VzIGFuIDxlamItbGluaz4sIHRoaXMgaXMgdGhlIGVudGVycHJpc2UgYmVhbiBpZGVudGlmaWVkIGJ5IHRoYXQgbGluay4gSWYgdGhlIGxpbmsgZG9lc24ndCBleGlzdCwgb3IgaWYgdGhlIHVzZXIgaGFzIGlkZW50aWZpZWQgYSBiZWFuIHdoaWNoIGRvZXNuJ3QgZXhpc3QsIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhvbWVSZWYoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFamJSZWYgcmVmLCBFbnRlcnByaXNlQmVhbiBuYW1lZEVqYikgewotCQlib29sZWFuIHZhbGlkVHlwZSA9IHRydWU7Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pcmVmLmVDb250YWluZXIoKTsKLQkJaWYgKHJlZi5lSXNTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX0hvbWUoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGhvbWVOYW1lID0gcmVmLmdldEhvbWUoKTsKLQkJCQlKYXZhSGVscGVycyB0eXBlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoaG9tZU5hbWUsIGJlYW4pOwotCQkJCS8vIENoZWNrIHRoYXQgdGhlIGhvbWUgc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudCBvZiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQKLQkJCQkvLyBleGlzdHMuCi0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHR5cGUpOwotCi0JCQkJaWYgKG5hbWVkRWpiICE9IG51bGwpIHsKLQkJCQkJLy8gQ2hlY2sgdGhhdCB0aGUgaG9tZSBzcGVjaWZpZWQgaW4gdGhlIDxob21lPiBlbGVtZW50Ci0JCQkJCS8vIGlzIGFzc2lnbmFibGUgdG8gdGhlIGhvbWUgdXNlZCBieSB0aGUgbmFtZWQgRUpCIGluIHRoZQotCQkJCQkvLyA8ZWpiLWxpbms+IGVsZW1lbnQuCi0JCQkJCUphdmFDbGFzcyBpbnRmVHlwZSA9IG5hbWVkRWpiLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGludGZUeXBlKTsKLQotCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaWRlbnRpZmllZCBob21lL3JlbW90ZSBpbnRlcmZhY2UgaW4gdGhlIGVqYi1yZWYKLQkJCQkJLy8gaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb25lIHVzZWQgYnkgdGhlIGJlYW4uCi0JCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odHlwZS5nZXRXcmFwcGVyKCksIGludGZUeXBlKSkgewotCQkJCQkJU3RyaW5nW10gcGFybXMgPSB7IG5hbWVkRWpiLmdldE5hbWUoKSwgaW50ZlR5cGUuZ2V0TmFtZSgpfTsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQl2YWxpZFR5cGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXZhbGlkVHlwZSA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKCF2YWxpZFR5cGUpIHsKLQkJCVN0cmluZ1tdIHBhcm1zID0geyByZWYuZ2V0SG9tZSgpfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUGVyc2lzdGVuY2VUeXBlRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJLy8gQXR0ZW1wdCBpbiB2YWluIHRvIHZhbGlkYXRlIHRoZSBwZXJzaXN0ZW5jZSB0eXBlIGVsZW1lbnQgaGVyZSwgYmVjYXVzZSAKLQkJLy8gaWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGVyZSdzIGEgc3ludGF4IGVycm9yLCBhbmQgdGhlIAotCQkvLyB2YWxpZGF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElSZXBvcnRlciwgSVZhbGlkYXRpb25Db250ZXh0KSB3b3VsZCBoYXZlIGJlZW4gCi0JCS8vIGNhbGxlZCBpbnN0ZWFkLgotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQkvLyBjaGVjayBzeW50YXgKLQkJCUVudGl0eSBlbnRpdHlCZWFuID0gKEVudGl0eSkgYmVhbjsKLQkJCWlmICghKGVudGl0eUJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgfHwgZW50aXR5QmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIElmIHRoZSBwcmltYXJ5IGtleSBjbGFzcyByZWZsZWN0ZWQgcHJvcGVybHksIHJldHVybiB0cnVlLiBFbHNlLCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVQcmltS2V5Q2xhc3NFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQkvLyBjaGVjayBzeW50YXgKLQkJCWlmIChiZWFuIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgewotCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCQkJSmF2YUNsYXNzIGNsYXMgPSBjbXAuZ2V0UHJpbWFyeUtleSgpOwotCQkJCWlmIChjbGFzICE9IG51bGwgJiYgIWNsYXMuZUlzUHJveHkoKSAmJiAhaXNWYWxpZFByaW1LZXlGaWVsZChjbXAsY2xhcykpIHsKLQkJCQkJLy8gOS40LjcuMQotCQkJCQkvLyB1c2VyIGhhcyBzcGVjaWZpZWQgYm90aCBhIHByaW0ta2V5LWNsYXNzIGFuZCBhIHByaW1rZXktZmllbGQKLQkJCQkJLy8gY2FuJ3QgdXNlIHRoZSBDTVBBdHRyaWJ1dGUncyBmaWVsZCdzIG5hbWUsIGJlY2F1c2UgdGhlIHByaW1pdGl2ZSBwcmltYXJ5IGtleSByZXR1cm5lZCBpcyBudWxsCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBwcmltYXJ5IGtleSBpcyBzcGVjaWZpZWQgaW4gdGhlIHhtbCwgYW5zd2VyIHdoZXRoZXIgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGRlcml2ZWQgcHJpbWFyeUtleUF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUHJpbUtleUZpZWxkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBKYXZhQ2xhc3MgY2xhcykgewotCQlyZXR1cm4gY21wLmdldFByaW1hcnlLZXlOYW1lKCkuZXF1YWxzKGNsYXMuZ2V0SmF2YU5hbWUoKSk7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVJlZW50cmFudEVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuLmlzRW50aXR5KCkpIHsKLQkJCS8vIGNoZWNrIHN5bnRheAotCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGJlYW47Ci0JCQlpZiAoIWVudGl0eS5pc1NldFJlZW50cmFudCgpKSB7Ci0JCQkJLy8gQ2FuIG9ubHkgdGVzdCBpZiB0aGUgcmVlbnRyYW50IGF0dHJpYnV0ZSBpcyBzZXQsIGJlY2F1c2UgdGhlIG1vZGVsIGRlZmF1bHRzIGl0Ci0JCQkJLy8gdG8gc29tZSBib29sZWFuIHZhbHVlIGlmIGl0IGlzbid0IHNldC4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODA2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIG1ldGFkYXRhIGZyb20gdGhlIEVqYlJlZiBpcyBub3QgdmFsaWQsIGFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZS4KLQkgKgotCSAqIEBwYXJtIEVqYlJlZiBUaGUgcmVmIHdob3NlIGhvbWUgdGhpcyBtZXRob2QgY2hlY2tzLgotCSAqIEBwYXJtIEVudGVycHJpc2VCZWFuIElmIHRoZSBFamJSZWYgdXNlcyBhbiA8ZWpiLWxpbms+IGVsZW1lbnQsIHRoaXMgaXMgdGhlIGVudGVycHJpc2UgYmVhbiBpZGVudGlmaWVkIGJ5IHRoYXQgZWxlbWVudC4gSXQgbWF5IGJlIG51bGwsIGlmIHRoZSB1c2VyIGhhcyBtYWRlIGEgbWlzdGFrZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlbW90ZVJlZihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVqYlJlZiByZWYsIEVudGVycHJpc2VCZWFuIG5hbWVkRWpiKSB7Ci0JCWJvb2xlYW4gdmFsaWRUeXBlID0gdHJ1ZTsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbilyZWYuZUNvbnRhaW5lcigpOwotCQlpZiAocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfUmVtb3RlKCkpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyByZW1vdGVOYW1lID0gcmVmLmdldFJlbW90ZSgpOwotCQkJCUphdmFIZWxwZXJzIHR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShyZW1vdGVOYW1lLCBiZWFuKTsKLQkJCQkvLyBDaGVjayB0aGF0IHRoZSBob21lIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50Ci0JCQkJLy8gZXhpc3RzLgotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0eXBlKTsKLQotCQkJCWlmIChuYW1lZEVqYiAhPSBudWxsKSB7Ci0JCQkJCS8vIENoZWNrIHRoYXQgdGhlIGhvbWUgc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudAotCQkJCQkvLyBpcyBhc3NpZ25hYmxlIHRvIHRoZSBob21lIHVzZWQgYnkgdGhlIG5hbWVkIEVKQiBpbiB0aGUKLQkJCQkJLy8gPGVqYi1saW5rPiBlbGVtZW50LgotCQkJCQlKYXZhQ2xhc3MgaW50ZlR5cGUgPSBuYW1lZEVqYi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGludGZUeXBlKTsKLQotCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaWRlbnRpZmllZCBob21lL3JlbW90ZSBpbnRlcmZhY2UgaW4gdGhlIGVqYi1yZWYKLQkJCQkJLy8gaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb25lIHVzZWQgYnkgdGhlIGJlYW4uCi0JCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odHlwZS5nZXRXcmFwcGVyKCksIGludGZUeXBlKSkgewotCQkJCQkJU3RyaW5nW10gcGFybXMgPSB7IG5hbWVkRWpiLmdldE5hbWUoKSwgaW50ZlR5cGUuZ2V0TmFtZSgpfTsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQl2YWxpZFR5cGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXZhbGlkVHlwZSA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKCF2YWxpZFR5cGUpIHsKLQkJCVN0cmluZ1tdIHBhcm1zID0geyByZWYuZ2V0UmVtb3RlKCl9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcm1zLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogMTUuMi41LjMgRGVjbGFyYXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMgcmVmZXJlbmNlZCBmcm9tIHRoZSBiZWFuJ3MgY29kZQotCSAqIFRoZSBCZWFuIFByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWNsYXJpbmcgaW4gdGhlIHNlY3VyaXR5LXJvbGUtcmVmIAotCSAqIGVsZW1lbnRzIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWxsIHRoZSBzZWN1cml0eSByb2xlIG5hbWVzIHVzZWQgCi0JICogaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLiBEZWNsYXJpbmcgdGhlIHNlY3VyaXR5IHJvbGVzIHJlZmVyZW5jZXMgaW4KLQkgKiB0aGUgY29kZSBhbGxvd3MgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBvciBEZXBsb3llciB0byBsaW5rIHRoZSBuYW1lcyAKLQkgKiBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgdXNlZCBpbiB0aGUgY29kZSB0byB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBmb3IgCi0JICogYW4gYXNzZW1ibGVkIGFwcGxpY2F0aW9uIHRocm91Z2ggdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0JICogVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBkZWNsYXJlIGVhY2ggc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VkIGluIHRoZSBjb2RlCi0JICogdXNpbmcgdGhlIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQgYXMgZm9sbG93czoKLQkgKiAgICAgIERlY2xhcmUgdGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IHJvbGUgdXNpbmcgdGhlIHJvbGUtbmFtZSBlbGVtZW50LiAKLQkgKiBUaGUgbmFtZSBtdXN0IGJlIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdGhhdCBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIAotCSAqIHRoZSBpc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZS1OYW1lKSBtZXRob2QuCi0JICogICAgICBPcHRpb25hbDogUHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIGluIHRoZSAKLQkgKiBkZXNjcmlwdGlvbiBlbGVtZW50LiBBIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlLCBpbmNsdWRpbmcgdGhlIG5hbWUgZGVmaW5lZCAKLQkgKiBieSB0aGUgcm9sZS1uYW1lIGVsZW1lbnQsIGlzIHNjb3BlZCB0byB0aGUgc2Vzc2lvbiBvciBlbnRpdHkgYmVhbiBlbGVtZW50IAotCSAqIHdob3NlIGRlY2xhcmF0aW9uIGNvbnRhaW5zIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50LiBUaGUgZm9sbG93aW5nIAotCSAqIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IGFuIGVudGVycHJpc2UgYmVhbidzIHJlZmVyZW5jZXMgdG8gc2VjdXJpdHkgcm9sZXMgCi0JICogYXJlIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JICogICAgLi4uCi0JICogICAgPGVudGVycHJpc2UtYmVhbnM+Ci0JICogICAgICAgLi4uCi0JICogICAgICAgPGVudGl0eT4KLQkgKiAgICAgICAgICA8ZWpiLW5hbWU+QWFyZHZhcmtQYXlyb2xsPC9lamItbmFtZT4KLQkgKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotCSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLQkgKiAgICAgICAgICAgICAgICAgVGhpcyBzZWN1cml0eSByb2xlIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUKLQkgKiAgICAgICAgICAgICAgICAgZW1wbG95ZWVzIG9mIHRoZSBwYXlyb2xsIGRlcGFydG1lbnQgd2hvIGFyZQotCSAqICAgICAgICAgICAgICAgICBhbGxvd2VkIHRvIHVwZGF0ZSBlbXBsb3llZXMnIHNhbGFyaWVzLgotCSAqICAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JICogICAgICAgICAgICAgPHJvbGUtbmFtZT5wYXlyb2xsPC9yb2xlLW5hbWU+Ci0JICogICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLQkgKiAgICAgICAgICAuLi4KLQkgKiAgICAgICA8L2VudGl0eT4KLQkgKiAgICAgICAuLi4KLQkgKiAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0JICogICAgLi4uCi0JICoKLQkgKiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFib3ZlIGluZGljYXRlcyB0aGF0IHRoZSBlbnRlcnByaXNlIGJlYW4gCi0JICogQWFyZHZhcmtQYXlyb2xsIG1ha2VzIHRoZSBzZWN1cml0eSBjaGVjayB1c2luZyBpc0NhbGxlckluUm9sZSgicGF5cm9sbCIpCi0JICogaW4gaXRzIGJ1c2luZXNzIG1ldGhvZC4KLQkgKgotCSAqCi0JICogMTUuMy4zIExpbmtpbmcgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzIHRvIHNlY3VyaXR5IHJvbGVzCi0JICogSWYgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBkZWZpbmVzIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIGluIHRoZSAKLQkgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGhlIG9yIHNoZSBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBsaW5raW5nIGFsbCB0aGUgCi0JICogc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzIGRlY2xhcmVkIGluIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50cyB0byB0aGUgCi0JICogc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4gVGhlIEFwcGxpY2F0aW9uIAotCSAqIEFzc2VtYmxlciBsaW5rcyBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIHRvIGEgc2VjdXJpdHkgcm9sZSB1c2luZyB0aGUgCi0JICogcm9sZS1saW5rIGVsZW1lbnQuIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiAKLQkgKiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gYSBzZWN1cml0eS1yb2xlIGVsZW1lbnQuCi0JICogQSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGJlIHVzZWQgZXZlbiBpZiB0aGUgdmFsdWUgb2Ygcm9sZS1uYW1lIGlzIHRoZSAKLQkgKiBzYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1saW5rIHJlZmVyZW5jZS4KLQkgKiBUaGUgZm9sbG93aW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBleGFtcGxlIHNob3dzIGhvdyB0byBsaW5rIHRoZSBzZWN1cml0eSAKLQkgKiByb2xlIHJlZmVyZW5jZSBuYW1lZCBwYXlyb2xsIHRvIHRoZSBzZWN1cml0eSByb2xlIG5hbWVkIHBheXJvbGwtZGVwYXJ0bWVudC4KLQkgKiAgICAuLi4KLQkgKiAgICA8ZW50ZXJwcmlzZS1iZWFucz4KLQkgKiAgICAgICAuLi4KLQkgKiAgICAgICA8ZW50aXR5PgotCSAqICAgICAgICAgIDxlamItbmFtZT5BYXJkdmFya1BheXJvbGw8L2VqYi1uYW1lPgotCSAqICAgICAgICAgIDxlamItY2xhc3M+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEJlYW48L2VqYi1jbGFzcz4KLQkgKiAgICAgICAgICAuLi4KLQkgKiAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0JICogICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgotCSAqICAgICAgICAgICAgICAgIFRoaXMgcm9sZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlCi0JICogICAgICAgICAgICAgICAgZW1wbG95ZWVzIG9mIHRoZSBwYXlyb2xsIGRlcGFydG1lbnQuCi0JICogICAgICAgICAgICAgICAgTWVtYmVycyBvZiB0aGlzIHJvbGUgaGF2ZSBhY2Nlc3MgdG8KLQkgKiAgICAgICAgICAgICAgICBhbnlvbmUncyBwYXlyb2xsIHJlY29yZC4KLQkgKgotCSAqICAgICAgICAgICAgICAgIFRoZSByb2xlIGhhcyBiZWVuIGxpbmtlZCB0byB0aGUKLQkgKiAgICAgICAgICAgICAgICBwYXlyb2xsLWRlcGFydG1lbnQgcm9sZS4KLQkgKiAgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCSAqICAgICAgICAgICAgIDxyb2xlLW5hbWU+cGF5cm9sbDwvcm9sZS1uYW1lPgotCSAqICAgICAgICAgICAgIDxyb2xlLWxpbms+cGF5cm9sbC1kZXBhcnRtZW50PC9yb2xlLWxpbms+Ci0JICogICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLQkgKiAgICAgICAgICAuLi4KLQkgKiAgICAgICA8L2VudGl0eT4KLQkgKiAgICAgICAuLi4KLQkgKiAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0JICogICAgLi4uCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlY3VyaXR5Um9sZVJlZkVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qKgotCQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgcm9sZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkJICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgU2VjdXJpdHlSb2xlUmVmIGluc3RhbmNlLgotCQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkJICoKLQkJICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgU2VjdXJpdHlSb2xSZWYgaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JCSAqIGltcGxlbWVudGlvbiBvZiBlcXVhbHMgY29tcGFyZXMgdGhlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aWxsCi0JCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JCSAqLwotCQljbGFzcyBSb2xlUmVmV3JhcHBlciB7Ci0JCQlwcml2YXRlIFNlY3VyaXR5Um9sZVJlZiBfcmVmID0gbnVsbDsKLQotCQkJcHVibGljIFJvbGVSZWZXcmFwcGVyKFNlY3VyaXR5Um9sZVJlZiByZWYpIHsKLQkJCQlfcmVmID0gcmVmOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFJvbGVSZWZXcmFwcGVyKSB7Ci0JCQkJCVJvbGVSZWZXcmFwcGVyIG90aGVyID0gKFJvbGVSZWZXcmFwcGVyKSBvOwotCQkJCQlyZXR1cm4gX3JlZi5nZXROYW1lKCkuZXF1YWxzKG90aGVyLmdldFJvbGVSZWYoKS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTZWN1cml0eVJvbGVSZWYgZ2V0Um9sZVJlZigpIHsKLQkJCQlyZXR1cm4gX3JlZjsKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gYXJlU1JvbGVzRGVmaW5lZCA9ICgoX3NlY3VyaXR5Um9sZXMgIT0gbnVsbCkgJiYgKF9zZWN1cml0eVJvbGVzLnNpemUoKSA+IDApKTsKLQotCQlMaXN0IHNlY3VyaXR5Um9sZVJlZnMgPSBiZWFuLmdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQkJaWYgKChzZWN1cml0eVJvbGVSZWZzICE9IG51bGwpICYmIChzZWN1cml0eVJvbGVSZWZzLnNpemUoKSAhPSAwKSkgewotCQkJLy8gQ2hlY2sgdGhhdCBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmIHJlZmVycyB0byBhIHNlY3VyaXR5IHJvbGUsCi0JCQkvLyBpZiBzZWN1cml0eSByb2xlcyBhcmUgZGVmaW5lZCBpbiB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvciwKLQkJCS8vIGFuZCB0aGF0IGVhY2ggcmVmZXJlbmNlZCBzZWN1cml0eSByb2xlIGV4aXN0cy4KLQkJCUR1cGxpY2F0ZXNUYWJsZSByb2xlUmVmTmFtZXMgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY3VyaXR5Um9sZVJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTZWN1cml0eVJvbGVSZWYgcmVmID0gKFNlY3VyaXR5Um9sZVJlZikgc2VjdXJpdHlSb2xlUmVmcy5nZXQoaSk7Ci0KLQkJCQkvLyBDaGVjayB0aGF0IHRoZSByb2xlIG5hbWUgaXMgc2V0ICgxNS4yLjUuMykKLQkJCQlTdHJpbmcgcm9sZU5hbWUgPSByZWYuZ2V0TmFtZSgpOwotCQkJCWlmICgocm9sZU5hbWUgPT0gbnVsbCkgfHwgKHJvbGVOYW1lLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcm9sZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgYmVhbk5hbWUgPSAoYmVhbi5nZXROYW1lKCkgPT0gbnVsbCkgPyAiIiA6IGJlYW4uZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCByZWYsIG5ldyBTdHJpbmdbXSB7IGJlYW5OYW1lIH0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQnVpbGQgdXAgdGhlIGxpc3Qgb2YgbmFtZXMsIHRvIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkJCXJvbGVSZWZOYW1lcy5hZGQobmV3IFJvbGVSZWZXcmFwcGVyKHJlZikpOwotCQkJCX0KLQotCQkJCS8vIENoZWNrIHRoYXQgdGhlIHJvbGUgbGluayBpcyBzZXQgKDE1LjMuMykKLQkJCQlTdHJpbmcgcm9sZUxpbmsgPSByZWYuZ2V0TGluaygpOwotCQkJCWJvb2xlYW4gaXNMaW5rRGVmaW5lZCA9ICgocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVSZWZfTGluaygpKSkgJiYgKHJvbGVMaW5rICE9IG51bGwpICYmICghcm9sZUxpbmsuZXF1YWxzKCIiKSkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlpZiAoKGFyZVNSb2xlc0RlZmluZWQpICYmICghaXNMaW5rRGVmaW5lZCkpIHsKLQkJCQkJLy8gbXVzdCBoYXZlIHJvbGUgbGluayBkZWZpbmVkICgxNS4zLjMpCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCByZWYsIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIGlmICgoIWFyZVNSb2xlc0RlZmluZWQpICYmIChpc0xpbmtEZWZpbmVkKSkgewotCQkJCQkvLyBtdXN0IG5vdCBoYXZlIHJvbGUgbGluayBkZWZpbmVkICgxNS4yLjUuMykKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJlZiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGFyZVNSb2xlc0RlZmluZWQgJiYgaXNMaW5rRGVmaW5lZCkgewotCQkJCQkvLyBjaGVjayB0aGF0IHRoZSByb2xlIGxpc3RlZCBpbiB0aGUgbGluayBleGlzdHMuICgxNS4zLjMpCi0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3NlY3VyaXR5Um9sZXMuaXRlcmF0b3IoKTsKLQkJCQkJYm9vbGVhbiByb2xlRXhpc3RzID0gZmFsc2U7Ci0JCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJU2VjdXJpdHlSb2xlIHJvbGUgPSAoU2VjdXJpdHlSb2xlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKHJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMocm9sZUxpbmspKSB7Ci0JCQkJCQkJcm9sZUV4aXN0cyA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFyb2xlRXhpc3RzKSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgcmVmLCBuZXcgU3RyaW5nW10geyByb2xlTmFtZSB9LCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkvLyBDaGVjayB0aGF0IHRoZXJlIGFyZSBubyBkdXBsaWNhdGUgcm9sZS1uYW1lcy4gKDE1LjMuMSkKLQkJCWlmIChyb2xlUmVmTmFtZXMuY29udGFpbnNEdXBsaWNhdGVzKCkpIHsKLQkJCQlMaXN0IGR1cGxpY2F0ZXMgPSByb2xlUmVmTmFtZXMuZ2V0RHVwbGljYXRlcygpOwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZHVwbGljYXRlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsICgoUm9sZVJlZldyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0Um9sZVJlZigpLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyb2xlUmVmTmFtZXMuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA2LjUuMyBUaGUgb3B0aW9uYWwgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UKLQkgKi4uLgotCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JICogaW1wbGVtZW50IHRoZSBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQkgKi4uLgotCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCSAqIHN5bmNocm9uaXphdGlvbiBjYWxsIGJhY2tzIGJlY2F1c2UgdGhlIGJlYW4gaXMgaW4gY29udHJvbCBvZiB0aGUgY29tbWl0IHRoZSBiZWFuIAotCSAqIGtub3dzIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFib3V0IHRvIGJlIGNvbW1pdHRlZCBhbmQgaXQga25vd3MgdGhlIG91dGNvbWUgb2YgdGhlIAotCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlU2Vzc2lvblR5cGVFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pIGJlYW47Ci0KLQkJCS8vIGNoZWNrIHN5bnRheAotCQkJYm9vbGVhbiBpc1ZhbGlkU2VzcyA9IGlzVmFsaWRTZXNzaW9uVHlwZUVsZW1lbnQoc2Vzc2lvbik7Ci0JCQlpZiAoIWlzVmFsaWRTZXNzKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBzZXNzaW9uLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlVHJhbnNhY3Rpb25UeXBlRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4uaXNTZXNzaW9uKCkpIHsKLQkJCS8vIGNoZWNrIHN5bnRheAotCQkJU2Vzc2lvbiBzZXNzaW9uQmVhbiA9IChTZXNzaW9uKSBiZWFuOwotCQkJaWYgKCFpc1ZhbGlkVHJhbnNhY3Rpb25UeXBlRWxlbWVudChzZXNzaW9uQmVhbikpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODA4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9zZWN1cml0eVJvbGVzID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByZVZhbGlkYXRlKHZjLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0KLQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfTU9ERUwpOwotCQlpZihlamJKYXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZihlamJKYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCV9zZWN1cml0eVJvbGVzID0gZWpiSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRW50ZXJwcmlzZUJlYW4yMFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRW50ZXJwcmlzZUJlYW4yMFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMTgyZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VudGVycHJpc2VCZWFuMjBWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbC5NREJBY3RpdmF0aW9uQ29uZmlnTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRlcnByaXNlQmVhbjIwVlJ1bGUgZXh0ZW5kcyBBVmFsaWRhdGlvblJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIExpc3QgX3NlY3VyaXR5Um9sZXMgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9SRU1PVEV9OwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBKTVNfTUVTU0FHSU5HX1RZUEUgPSAiamF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lciI7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAwX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDBfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDBfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAwX1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDEsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMl9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAyX05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAyX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMl9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAzX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDNfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDNfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAzX1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDRfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNF9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNF9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDRfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNV9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODA1X05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA1X1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNV9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA2LCBuZXcgU3RyaW5nW117Q0hLSjI4MDYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwOCwgbmV3IFN0cmluZ1tde0NIS0oyODA4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA5LCBuZXcgU3RyaW5nW117Q0hLSjI4MDkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTBfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMF9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMF9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MTBfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMywgbmV3IFN0cmluZ1tde0NIS0oyODEzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODIwLCBuZXcgU3RyaW5nW117Q0hLSjI4MjArU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjIsIG5ldyBTdHJpbmdbXXtDSEtKMjgyMitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMywgbmV3IFN0cmluZ1tde0NIS0oyODIzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI0LCBuZXcgU3RyaW5nW117Q0hLSjI4MjQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjUsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNiwgbmV3IFN0cmluZ1tde0NIS0oyODI2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI3LCBuZXcgU3RyaW5nW117Q0hLSjI4MjcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjgsIG5ldyBTdHJpbmdbXXtDSEtKMjgyOCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMCwgbmV3IFN0cmluZ1tde0NIS0oyODMwK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMxLCBuZXcgU3RyaW5nW117Q0hLSjI4MzErU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzIsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMywgbmV3IFN0cmluZ1tde0NIS0oyODMzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM0LCBuZXcgU3RyaW5nW117Q0hLSjI4MzQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzUsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNiwgbmV3IFN0cmluZ1tde0NIS0oyODM2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM3LCBuZXcgU3RyaW5nW117Q0hLSjI4MzcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzgsIG5ldyBTdHJpbmdbXXtDSEtKMjgzOCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzOSwgbmV3IFN0cmluZ1tde0NIS0oyODM5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQwLCBuZXcgU3RyaW5nW117Q0hLSjI4NDArU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjg0MStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NSwgbmV3IFN0cmluZ1tde0NIS0oyODQ1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ2LCBuZXcgU3RyaW5nW117Q0hLSjI4NDYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDcsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1MiwgbmV3IFN0cmluZ1tde0NIS0oyODUyfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1NCwgbmV3IFN0cmluZ1tde0NIS0oyODU0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU1LCBuZXcgU3RyaW5nW117Q0hLSjI4NTUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjg1NitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1NywgbmV3IFN0cmluZ1tde0NIS0oyODU3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU4LCBuZXcgU3RyaW5nW117Q0hLSjI4NTgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTksIG5ldyBTdHJpbmdbXXtDSEtKMjg1OStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg2MCwgbmV3IFN0cmluZ1tde0NIS0oyODYwK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODgwLCBuZXcgU3RyaW5nW117IkNIS0oyODgwLnMiK1NQRUMsICJDSEtKMjg4MC5iIitTUEVDLCAiQ0hLSjI4ODAuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODgxLCBuZXcgU3RyaW5nW117IkNIS0oyODgxLnMiK1NQRUMsICJDSEtKMjg4MS5iIitTUEVDLCAiQ0hLSjI4ODEuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODgyLCBuZXcgU3RyaW5nW117IkNIS0oyODgyLnMiK1NQRUMsICJDSEtKMjg4Mi5iIitTUEVDLCAiQ0hLSjI4ODIuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODgzLCBuZXcgU3RyaW5nW117IkNIS0oyODgzLnMiK1NQRUMsICJDSEtKMjg4My5iIitTUEVDLCAiQ0hLSjI4ODMuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODg0LCBuZXcgU3RyaW5nW117IkNIS0oyODg0LnMiK1NQRUMsICJDSEtKMjg4NC5iIitTUEVDLCAiQ0hLSjI4ODQuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODg1LCBuZXcgU3RyaW5nW117IkNIS0oyODg1LnMiK1NQRUMsICJDSEtKMjg4NS5iIitTUEVDLCAiQ0hLSjI4ODUuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJLy8gRUpCSmFyIGRvZXNuJ3QgZGVwZW5kIG9uIGFueXRoaW5nIGVsc2UKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRU5URVJQUklTRUJFQU47Ci0JfQotCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCXJldHVybiBwYXJlbnQ7IC8vIFRoZSBwYXJlbnQgd2lsbCBiZSBhbiBFbnRlcnByaXNlQmVhbi4KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCWlmKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQllbnRyeS5zZXRTb3VyY2VJRCgiRW50ZXJwcmlzZUJlYW4yMFZSdWxlIC0gdmFsaWRhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkuc2V0VGV4dChnZXRDbGFzcygpLmdldE5hbWUoKSArICI6OnZhbGlkYXRlKCIgKyB0YXJnZXRQYXJlbnQgKyAiLCAiICsgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCX0KLQkJCi0JCUVKQkphciBlamJKYXIgPSBudWxsOwotCQlpZih0YXJnZXRQYXJlbnQgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikgewotCQkJLy8gcnVubmluZyBhcyBhIGRlcGVuZGVudAotCQkJZWpiSmFyID0gKEVKQkphcil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9NT0RFTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllamJKYXIgPSAoRUpCSmFyKXRhcmdldFBhcmVudDsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKXRhcmdldDsKLQkJCi0JCXZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCX0KLQkJCQotCQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQl0cnkgewotCQkJLy8gQ2hlY2sgaWYgdGhlIGJlYW4gcGFydHMgYXJlIHJlZmxlY3RlZC4gU29tZSBydWxlcyBjYW4gYmUgdmFsaWRhdGVkCi0JCQkvLyB3aGV0aGVyIG9yIG5vdCB0aGUgYmVhbiBpcyByZWZsZWN0ZWQuCi0JCQlib29sZWFuIHJlZmxlY3RlZCA9IHZhbGlkYXRlQmVhbkNvbXBvbmVudHNSZWZsZWN0ZWQodmMsIGVqYkphciwgYmVhbik7Ci0KLQkJCS8vIFRoZXNlIHJ1bGVzIGNhbiBiZSB2YWxpZGF0ZWQgd2hldGhlciBvciBub3QgdGhlIGJlYW4gaXMgcmVmbGVjdGVkLgotCQkJdmFsaWRhdGVFSkJOYW1lRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlUmVlbnRyYW50RWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlU2Vzc2lvblR5cGVFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVUcmFuc2FjdGlvblR5cGVFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVQZXJzaXN0ZW5jZVR5cGVFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVFbnZpcm9ubWVudEVudHJpZXModmMsIGVqYkphciwgYmVhbik7Ci0KLQkJCS8vIFRoZSByZXN0IG9mIHRoZSBydWxlcyBjYW5ub3QgYmUgdmFsaWRhdGVkIGJlY2F1c2UgdGhlIGJlYW4gaXNuJ3QgcmVmbGVjdGVkLgotCQkJaWYgKCFyZWZsZWN0ZWQpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCXZhbGlkYXRlTG9jYWxQYWlycyh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlUmVtb3RlUGFpcnModmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZUxvY2FsT3JSZW1vdGUodmMsIGVqYkphciwgYmVhbik7Ci0KLQkJCWlmIChiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbjsKLQkJCQlpZigoY21wLmdldFByaW1LZXlGaWVsZCgpICE9IG51bGwpICYmICFjbXAuZ2V0UHJpbUtleUZpZWxkKCkuZUlzUHJveHkoKSkgewotCQkJCQkvLyBEb24ndCB2YWxpZGF0ZSB0aGUgZmllbGRzIGlmIGl0J3MgbmVpdGhlciBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleSBub3IgYSBjb21wb3VuZCBwcmltYXJ5IGtleS4KLQkJCQkJLy8gSWYgdGhlIHVzZXIgd2FzIGF0dGVtcHRpbmcgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXksIGJ1dCBkaWQgYSB0eXBvIGluIGVqYi1qYXIueG1sLAotCQkJCQkvLyB0aGUgdXNlciB3aWxsIHNlZSBhIGxvdCBvZiBzdHJhbmdlIG1lc3NhZ2VzIGxvZ2dlZCBhZ2FpbnN0IHRoZSBmaWVsZHMgaW4gdGhlIHByaW1pdGl2ZSBwcmltYXJ5IGtleS4KLQkJCQkJdmFsaWRhdGVDTVBGaWVsZEVsZW1lbnQodmMsIGVqYkphciwgY21wKTsKLQkJCQl9Ci0JCQkJdmFsaWRhdGVBYnN0cmFjdFNjaGVtYU5hbWVFbGVtZW50KHZjLCBlamJKYXIsIGNtcCk7Ci0JCQkJdmFsaWRhdGVKYXZhSWRlbnRpZmllcih2YywgZWpiSmFyLCBjbXApOwotCQkJfQotCQkJaWYoYmVhbi5pc01lc3NhZ2VEcml2ZW4oKSAmJiBiZWFuLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQpIHsKLQkJCQl2YWxpZGF0ZUFjdGl2YXRpb25Db25maWd1cmF0aW9uKHZjLCAoTWVzc2FnZURyaXZlbiliZWFuKTsKLQkJCX0KLQkJCXZhbGlkYXRlUHJpbUtleUNsYXNzRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlRUpCUmVmKHZjLCBlamJKYXIsIGJlYW4pOwotCQl9Ci0JCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FLCBiZWFuLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgYmVhbiBjb21wb25lbnRzIChob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZSwgYmVhbiBjbGFzcywgYW5kIHByaW1hcnkKLQkgKiBrZXkpIGNhbiBhbGwgYmUgZm91bmQgYW5kIHJlZmxlY3RlZCwgcmV0dXJuIHRydWUuIExldCB0aGUgRERWYWxpZGF0b3IKLQkgKiByZXBvcnQgdGhlIGVycm9yIG1lc3NhZ2UgYWdhaW5zdCB0aGUgYmVhbiBpZiBvbmUgb2YgdGhlc2UgdHlwZXMgZG9lc24ndCByZWZsZWN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmVhbkNvbXBvbmVudHNSZWZsZWN0ZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhlIGJlYW4gaXMgbnVsbCwgYmVjYXVzZSB0aGlzIG1ldGhvZCB3aWxsCi0JCS8vIG5vdCBiZSBjYWxsZWQgaWYgaXQgaXMuCi0JCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRFamJDbGFzcygpKTsKLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9FamJDbGFzcygpKSkgewotCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDJfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tde2JlYW4uZ2V0RWpiQ2xhc3NOYW1lKCl9LCB0aGlzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDJfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCX0KLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKGJlYW4gaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuKSB7Ci0JCQkvLyBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSByZXN0Ci0JCQlyZXR1cm4gaXNWYWxpZDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Ib21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Ib21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwM19OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBuZXcgU3RyaW5nW117YmVhbi5nZXRIb21lSW50ZXJmYWNlTmFtZSgpfSwgdGhpcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAzX1VOTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQl9Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWlmKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1JlbW90ZUludGVyZmFjZSgpKSkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSkpIHsKLQkJCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODA0X05BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIG5ldyBTdHJpbmdbXXtiZWFuLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKX0sIHRoaXMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwNF9VTk5BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJfQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEhvbWVJbnRlcmZhY2UoKSkpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCWlmKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSG9tZUludGVyZmFjZSgpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjgwNV9OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBuZXcgU3RyaW5nW117YmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjgwNV9VTk5BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJdHJ5IHsKLQkJCWlmKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSW50ZXJmYWNlKCkpKSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxJbnRlcmZhY2UoKSkpIHsKLQkJCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MDBfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tde2JlYW4uZ2V0TG9jYWxJbnRlcmZhY2VOYW1lKCl9LCB0aGlzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjgwMF9VTk5BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJfQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChiZWFuLmlzRW50aXR5KCkpIHsKLQkJCUphdmFDbGFzcyBwcmltYXJ5S2V5ID0gKChFbnRpdHkpIGJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJCXRyeSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHByaW1hcnlLZXkpOwotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLQkJCQlpZigoKEVudGl0eSliZWFuKS5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5X1ByaW1hcnlLZXkoKSkpIHsKLQkJCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgxMF9OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBuZXcgU3RyaW5nW117KChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleU5hbWUoKX0sIHRoaXMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgxMF9VTk5BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCX0KLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpc1ZhbGlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ01QRmllbGRFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJLy8gY2hlY2sgc3ludGF4IG9mIHRhZyBpcyBva2F5Ci0JCUxpc3QgZmllbGRzID0gY21wLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JCWlmICgoZmllbGRzID09IG51bGwpIHx8IChmaWVsZHMuc2l6ZSgpID09IDApKSB7Ci0JCQkvLyB1bmxpa2UgRUpCIDEuMSBDTVBzLCB0aGlzIGlzIGxlZ2FsLgotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBtYXBzVG9NdWx0aXBsZUZpZWxkcyA9ICFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmllbGRzLml0ZXJhdG9yKCk7Ci0vLwkJRmllbGQgZmllbGQgPSBudWxsOwotCQlMaXN0IGZpZWxkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KGZpZWxkcy5zaXplKCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDTVBBdHRyaWJ1dGUgYXR0cmliID0gKENNUEF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGF0dHJpYiA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJERFZhbGlkYXRvci52YWxpZGF0ZUNNUEZpZWxkRWxlbWVudChFbnRlcnByaXNlQmVhbikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJDTVBBdHRyaWJ1dGUgaXMgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmaWVsZE5hbWVzLmFkZChhdHRyaWIuZ2V0TmFtZSgpKTsKLQotCQkJSmF2YUhlbHBlcnMgZmllbGRUeXBlID0gYXR0cmliLmdldFR5cGUoKTsKLQkJCXRyeSB7Ci0JCQkJLy8gSWYgdGhlIGZpZWxkIGlzIG5vdCBhIHZhbGlkIHR5cGUKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoZmllbGRUeXBlKTsKLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gZmllbGQgbm90IGlkZW50aWZpZWQKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODMwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCBuZXcgU3RyaW5nW10geyBhdHRyaWIuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQljb250aW51ZTsgLy8gaWYgeW91IGNhbid0IHJlZmxlY3QgaXQsIHRoZW4geW91IGNhbid0IHZhbGlkYXRlIGl0Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJaWYoIWZpZWxkVHlwZS5pc1ByaW1pdGl2ZSgpICYmIAotCQkJCSAgICFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTZXJpYWxpemFibGUoZmllbGRUeXBlLCBjbXApKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg1NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGNtcCwgbmV3IFN0cmluZ1tdIHsgYXR0cmliLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IChlLmdldEphdmFDbGFzcygpID09IG51bGwpID8gbmV3IFN0cmluZ1tde30gOiBuZXcgU3RyaW5nW117ZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBjbXAsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyA5LjQuNy4yCi0JCWlmIChtYXBzVG9NdWx0aXBsZUZpZWxkcyAmJiAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShjbXApKSB7Ci0JCQlMaXN0IHByaW1LZXlGaWVsZHMgPSBjbXAuZ2V0UHJpbWFyeUtleSgpLmdldEZpZWxkc0V4dGVuZGVkKCk7Ci0KLQkJCS8vICg5LjQuNy4xIGlzIHZhbGlkYXRlZCBpbiB2YWxpZGF0ZVByaW1LZXlDbGFzc0VsZW1lbnQoYmVhbikKLQkJCS8vIGNoZWNrIGlmIHRoZSBwcmltYXJ5IGtleSBjbGFzcycgZmllbGRzIGV4aXN0IGluIHRoZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMKLQkJCWl0ZXJhdG9yID0gcHJpbUtleUZpZWxkcy5pdGVyYXRvcigpOwotCi0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJRmllbGQga2V5RmllbGQgPSAoRmllbGQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoKGtleUZpZWxkLmdldE5hbWUoKSAhPSBudWxsKSAmJiAoa2V5RmllbGQuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklFTEROQU1FX1NFUklBTFZFUlNJT05VSUQpKSkgewotCQkJCQkvLyBub3QgYSBjdXN0b21lci1lbnRlcmVkIGZpZWxkCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICghZmllbGROYW1lcy5jb250YWlucyhrZXlGaWVsZC5nZXROYW1lKCkpKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBjbXAsIG5ldyBTdHJpbmdbXSB7IGtleUZpZWxkLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ01SRmllbGRFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYgKGNtcCA9PSBudWxsKQotCQkJcmV0dXJuOyAKLQkJc3dpdGNoKGNtcC5nZXRWZXJzaW9uSUQoKSkgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8wX0lEOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOgotCQkJCWJyZWFrOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOiBkZWZhdWx0OgotCQkJCUxpc3QgZmllbGRzID0gY21wLmdldENNUkZpZWxkcygpOwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmllbGRzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUNNUkZpZWxkIGZpZWxkID0gKENNUkZpZWxkKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKLQkJCQkJaWYoKGZpZWxkTmFtZSA9PSBudWxsKSB8fCAoZmllbGROYW1lLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg1NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGNtcCwgbmV3IFN0cmluZ1tdIHsgZmllbGQuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQkJY29udGludWU7IC8vIGRvbid0IGxvb2sgZm9yIHRoZSBnZXQgbWV0aG9kcwotCQkJCQl9Ci0JCQkJCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZEphdmFJZGVudGlmaWVyKGZpZWxkTmFtZSkpIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg1NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGNtcCwgbmV3IFN0cmluZ1tdIHsgZmllbGQuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQl0cnkgewotCQkJCQkJSmF2YUhlbHBlcnMgZmllbGRUeXBlID0gZmllbGQuZ2V0VHlwZSgpOwotCQkJCQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGZpZWxkVHlwZSwgY21wLmdldExvY2FsSW50ZXJmYWNlKCkpICYmCi0JCQkJCQkgICAgIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihmaWVsZFR5cGUsIGNtcCkgJiYKLQkJCQkJCSAgICAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb21TZXQoZmllbGRUeXBlLCBjbXApKSB7Ci0JCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODU2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgY21wLCBuZXcgU3RyaW5nW10geyBmaWVsZC5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0gKGUuZ2V0SmF2YUNsYXNzKCkgPT0gbnVsbCkgPyBuZXcgU3RyaW5nW117fSA6IG5ldyBTdHJpbmdbXXtlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFSkJOYW1lRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSBiZWFuLmdldE5hbWUoKTsKLQkJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpICYmIGJlYW4uZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewkJCi0JCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRKYXZhSWRlbnRpZmllcihuYW1lKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjgxMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCi0JCQkvLyBwLiA0NjYKLQkJCS8vICJUaGUgbmFtZSBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnggbXVzdCBjb25mb3JtCi0JCQkvLyB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4gVGhlIG5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkJCS8vIGNtcC12ZXJzaW9uIDIueCBtdXN0IG5vdCBiZSBhIHJlc2VydmVkIGxpdGVyYWwgaW4gRUpCIFFMLgotCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUmVzZXJ2ZWRXb3JkKG5hbWUpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODU5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUFic3RyYWN0U2NoZW1hTmFtZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlpZiAoY21wID09IG51bGwpCi0JCQlyZXR1cm47IAotCQlzd2l0Y2goY21wLmdldFZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ6IGRlZmF1bHQ6Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IGNtcC5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKTsKLQkJCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRKYXZhSWRlbnRpZmllcihuYW1lKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NTgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBjbXAsIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBDaGVjayB0aGF0IHRoZSBuYW1lIGlzIG5vdCBhIHJlc2VydmVkIHdvcmQKLQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNSZXNlcnZlZFdvcmQobmFtZSkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODYwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgY21wLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7CQkJCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVKYXZhSWRlbnRpZmllcihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCS8qCi0JCSAqIERvbid0IGR1cGxpY2F0ZSB0aGUgRUpCIFFMIHZhbGlkYXRvcidzIGZ1bmN0aW9uLgotCQlMaXN0IHF1ZXJpZXMgPSBjbXAuZ2V0UXVlcmllcygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHF1ZXJpZXMuaXRlcmF0b3IoKTsKLQkJUXVlcnkgcXVlcnkgPSAoUXVlcnkpaXRlcmF0b3IubmV4dCgpOwotCQkqLwotCX0KLQkKLQotCS8qKgotCSAqIFZhbGlkYXRlIHNlY3Rpb24gMTQuMyBvZiB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uLgotCSAqCi0JICogMTQuMyBFSkIgUmVmZXJlbmNlcwotCSAqICAgMTQuMy4xIEJlYW4gUHJvdmlkZXIncyByZXNwb25zaWJpbGl0aWVzCi0JICogICAgIDE0LjMuMS4xIEVKQiByZWZlcmVuY2UgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcwotCSAqICAgICAxNC4zLjEuMiBEZWNsYXJhdGlvbiBvZiBFSkIgcmVmZXJlbmNlcyBpbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgKiAgIDE0LjMuMiBBcHBsaWNhdGlvbiBBc3NlbWJsZXIncyByZXNwb25zaWJpbGl0aWVzCi0JICogICAxNC4zLjMgRGVwbG95ZXIncyByZXNwb25zaWJpbGl0eQotCSAqICAgMTQuMy40IENvbnRhaW5lciBQcm92aWRlcidzIHJlc3BvbnNpYmlsaXR5Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFSkJSZWYoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgZWpiUmVmcyA9IGJlYW4uZ2V0RWpiUmVmcygpOwotCQlpZiAoKGVqYlJlZnMgPT0gbnVsbCkgfHwgKGVqYlJlZnMuc2l6ZSgpID09IDApKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVqYlJlZnMuaXRlcmF0b3IoKTsKLQkJRWpiUmVmIHJlZiA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJlZiA9IChFamJSZWYpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChyZWYgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRERWYWxpZGF0b3IudmFsaWRhdGVFSkJSZWYoRW50ZXJwcmlzZUJlYW4pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgiRWpiUmVmIGlzIG51bGwgaW4gIiArIGJlYW4uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gMTQuMy4xLjEKLQkJCS8vIEluZm8gbXNzZy4gIkVKQiBzcGVjIHJlY29tbWVuZHMgdGhhdCBhbGwgcmVmZXJlbmNlcyB0byBvdGhlciBlbnRlcnByaXNlIGJlYW5zIGJlIG9yZ2FuaXplZCBpbiB0aGUgZWpiIHN1YmNvbnRleHQgb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudCIKLQkJCUVudGVycHJpc2VCZWFuIG5hbWVkRWpiID0gbnVsbDsKLQkJCWlmIChyZWYuZUlzU2V0KENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9MaW5rKCkpKSB7Ci0JCQkJLy8gTG9hZCB0aGUgRUpCIGlkZW50aWZpZWQgYnkgdGhlIHJlZmVyZW5jZSwgaWYgaXQgZXhpc3RzLgotCQkJCW5hbWVkRWpiID0gZWpiSmFyLmdldEVudGVycGlzZUJlYW5Gcm9tUmVmKHJlZik7Ci0JCQkJaWYgKG5hbWVkRWpiICE9IG51bGwpIHsKLQkJCQkJLy8gaWYgdGhlIG5hbWVkIEVKQiBpcyBudWxsIGl0IGNvdWxkIGJlIGluIGFub3RoZXIgRUpCSmFyCi0JCQkJCUludGVnZXIgZWpiVHlwZSA9IG5ldyBJbnRlZ2VyKHJlZi5nZXRUeXBlKCkuZ2V0VmFsdWUoKSk7Ci0JCQkJCWJvb2xlYW4gd3JvbmdUeXBlID0gZmFsc2U7IC8vIGlzIHRoZSBFSkIsIGlkZW50aWZpZWQgYnkgZWpiLWxpbmssIG9mIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgZWpiLXJlZi10eXBlIGVsZW1lbnQ/Ci0JCQkJCVN0cmluZyB0eXBlID0gKG5hbWVkRWpiIGluc3RhbmNlb2YgU2Vzc2lvbikgPyAiU2Vzc2lvbiIgOiAiRW50aXR5IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWlmIChlamJUeXBlID09IG51bGwpIHsKLQkJCQkJCS8vIE5laXRoZXIgc2Vzc2lvbiBub3IgZW50aXR5PwotCQkJCQkJd3JvbmdUeXBlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChlamJUeXBlLmludFZhbHVlKCkgPT0gRWpiUmVmVHlwZS5TRVNTSU9OKSB7Ci0JCQkJCQlpZiAoIShuYW1lZEVqYiBpbnN0YW5jZW9mIFNlc3Npb24pKSB7Ci0JCQkJCQkJd3JvbmdUeXBlID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChlamJUeXBlLmludFZhbHVlKCkgPT0gRWpiUmVmVHlwZS5FTlRJVFkpIHsKLQkJCQkJCWlmICghKG5hbWVkRWpiIGluc3RhbmNlb2YgRW50aXR5KSkgewotCQkJCQkJCXdyb25nVHlwZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl3cm9uZ1R5cGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICh3cm9uZ1R5cGUpIHsKLQkJCQkJCVN0cmluZ1tdIHBhcm1zID0geyBuYW1lZEVqYi5nZXROYW1lKCksIHR5cGUgfTsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyAxNC4zLjEuMiwgMTQuMy4yLCAxNC4zLjQKLQkJCS8vIENoZWNrIHRoYXQgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsIGhvbWUsIGFuZCByZW1vdGUgaGF2ZSBiZWVuIGRlZmluZWQsIGFuZCBleGlzdAotCQkJdmFsaWRhdGVIb21lUmVmKHZjLCBlamJKYXIsIHJlZiwgbmFtZWRFamIpOwotCQkJdmFsaWRhdGVSZW1vdGVSZWYodmMsIGVqYkphciwgcmVmLCBuYW1lZEVqYik7Ci0KLQkJCS8vIDE0LjMuMS4xCi0JCQkvLyBJbmZvIG1zc2cuICJFSkIgc3BlYyByZWNvbW1lbmRzIHRoYXQgYWxsIHJlZmVyZW5jZXMgdG8gb3RoZXIgZW50ZXJwcmlzZSBiZWFucyBiZSBvcmdhbml6ZWQgaW4gdGhlIGVqYiBzdWJjb250ZXh0IG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQiCi0JCQlpZiAocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfTmFtZSgpKSkgewotCQkJCS8vIElmIGVqYiBuYW1lIGlzbid0IHNldCwgdGhhdCBlcnJvciB3b3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGJ5IG9uZSBvZiB0aGUgdmFsaWRhdGVSZWYgbWV0aG9kcwotCQkJCS8vIERvbid0IGR1cGxpY2F0ZSB0aGF0IGVmZm9ydCBoZXJlLgotCQkJCVN0cmluZyBlamJOYW1lID0gcmVmLmdldE5hbWUoKTsKLQkJCQlpZiAoIWVqYk5hbWUuc3RhcnRzV2l0aCgiZWpiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHNlY3Rpb24gMTQuMyBvZiB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uLgotCSAqCi0JICogMTQuMi4xLjIgRGVjbGFyYXRpb24gb2YgZW52aXJvbm1lbnQgZW50cmllcwotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRW52aXJvbm1lbnRFbnRyaWVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGVudkVudHJpZXMgPSBiZWFuLmdldEVudmlyb25tZW50UHJvcGVydGllcygpOwotCQlpZiAoKGVudkVudHJpZXMgPT0gbnVsbCkgfHwgKGVudkVudHJpZXMuc2l6ZSgpID09IDApKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbnZFbnRyeSBlbnZFbnRyeSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZW52RW50cmllcy5pdGVyYXRvcigpOwotCQlEdXBsaWNhdGVzVGFibGUgZW52TmFtZXMgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWVudkVudHJ5ID0gKEVudkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZW52RW50cnkgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRERWYWxpZGF0b3IudmFsaWRhdGVFbnZpcm9ubWVudEVudHJpZXMoRW50ZXJwcmlzZUJlYW4pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgiRWpiRW50cnkgaXMgbnVsbCBpbiAiICsgYmVhbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChlbnZFbnRyeS5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCWVudk5hbWVzLmFkZChlbnZFbnRyeS5nZXROYW1lKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0KLQkJCWlmIChlbnZFbnRyeS5pc1NldFR5cGUoKSkgewotCQkJCS8vIDE0LjIuMS4yOyB0eXBlIG11c3QgYmUgb25lIG9mIHRoZXNlIHR5cGVzOiBTdHJpbmcsIEludGVnZXIsIEJvb2xlYW4sIERvdWJsZSwgQnl0ZSwgU2hvcnQsIExvbmcsIGFuZCBGbG9hdC4KLQkJCQlpbnQgdHlwZSA9IGVudkVudHJ5LmdldFR5cGUoKS5nZXRWYWx1ZSgpOwotCQkJCWlmICghKCh0eXBlID09IEVudkVudHJ5VHlwZS5CT09MRUFOKSB8fCAodHlwZSA9PSBFbnZFbnRyeVR5cGUuQllURSkgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLkRPVUJMRSkgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLkZMT0FUKSB8fCAodHlwZSA9PSBFbnZFbnRyeVR5cGUuSU5URUdFUikgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLkxPTkcpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5TSE9SVCkgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLlNUUklORykgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLkNIQVJBQ1RFUikpKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChlbnZOYW1lcy5jb250YWluc0R1cGxpY2F0ZXMoKSkgewotCQkJSXRlcmF0b3IgZHVwcyA9IGVudk5hbWVzLmdldER1cGxpY2F0ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGR1cHMuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBkdXBzLm5leHQoKTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tdIHsgbmFtZSB9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIG1ldGFkYXRhIGZyb20gdGhlIEVqYlJlZiBpcyBub3QgdmFsaWQsIGFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZS4KLQkgKgotCSAqIEBwYXJtIEVqYlJlZiBUaGUgPGVqYi1yZWY+IGVsZW1lbnQgdGhpcyBtZXRob2QgdmFsaWRhdGVzLgotCSAqIEBwYXJtIEVudGVycHJpc2VCZWFuIElmIHRoZSA8ZWpiLXJlZj4gdXNlcyBhbiA8ZWpiLWxpbms+LCB0aGlzIGlzIHRoZSBlbnRlcnByaXNlIGJlYW4gaWRlbnRpZmllZCBieSB0aGF0IGxpbmsuIElmIHRoZSBsaW5rIGRvZXNuJ3QgZXhpc3QsIG9yIGlmIHRoZSB1c2VyIGhhcyBpZGVudGlmaWVkIGEgYmVhbiB3aGljaCBkb2Vzbid0IGV4aXN0LCB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIb21lUmVmKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRWpiUmVmIHJlZiwgRW50ZXJwcmlzZUJlYW4gbmFtZWRFamIpIHsKLQkJYm9vbGVhbiB2YWxpZFR5cGUgPSB0cnVlOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKXJlZi5lQ29udGFpbmVyKCk7Ci0JCWlmIChyZWYuZUlzU2V0KENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9Ib21lKCkpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBob21lTmFtZSA9IHJlZi5nZXRIb21lKCk7Ci0JCQkJSmF2YUhlbHBlcnMgdHlwZSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGhvbWVOYW1lLCBiZWFuKTsKLQkJCQkvLyBDaGVjayB0aGF0IHRoZSBob21lIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50Ci0JCQkJLy8gZXhpc3RzLgotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0eXBlKTsKLQotCQkJCWlmIChuYW1lZEVqYiAhPSBudWxsKSB7Ci0JCQkJCS8vIENoZWNrIHRoYXQgdGhlIGhvbWUgc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudAotCQkJCQkvLyBpcyBhc3NpZ25hYmxlIHRvIHRoZSBob21lIHVzZWQgYnkgdGhlIG5hbWVkIEVKQiBpbiB0aGUKLQkJCQkJLy8gPGVqYi1saW5rPiBlbGVtZW50LgotCQkJCQlKYXZhQ2xhc3MgaW50ZlR5cGUgPSBuYW1lZEVqYi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShpbnRmVHlwZSk7Ci0KLQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGlkZW50aWZpZWQgaG9tZS9yZW1vdGUgaW50ZXJmYWNlIGluIHRoZSBlamItcmVmCi0JCQkJCS8vIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG9uZSB1c2VkIGJ5IHRoZSBiZWFuLgotCQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUsIGludGZUeXBlKSkgewotCQkJCQkJU3RyaW5nW10gcGFybXMgPSB7IG5hbWVkRWpiLmdldE5hbWUoKSwgaW50ZlR5cGUuZ2V0TmFtZSgpfTsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQl2YWxpZFR5cGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXZhbGlkVHlwZSA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKCF2YWxpZFR5cGUpIHsKLQkJCVN0cmluZ1tdIHBhcm1zID0geyByZWYuZ2V0SG9tZSgpfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBiZWFuIHByb3ZpZGVzIGEgbG9jYWwgdmlldywgYm90aCBwYXJ0cyBvZiB0aGUgdmlldyBtdXN0IGV4aXN0LgotCSAqIElmIHRoaXMgbWV0aG9kIGlzIGJlaW5nIGNhbGxlZCwgdGhlbiBhbGwgcGFydHMgb2YgdGhlIGJlYW4gYXJlIHJlZmxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUxvY2FsUGFpcnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGJlYW4gaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuKSB7Ci0JCQkvLyBNZXNzYWdlIGRyaXZlbiBiZWFucyBkb24ndCB1c2UgbG9jYWwgb3IgcmVtb3RlIHZpZXdzCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBsb2NhbCA9IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJSmF2YUNsYXNzIGxvY2FsSG9tZSA9IGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCWlmKChsb2NhbCAhPSBudWxsICkgJiYgKGxvY2FsSG9tZSA9PSBudWxsKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODgwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgaWYoKGxvY2FsID09IG51bGwpICYmIChsb2NhbEhvbWUgIT0gbnVsbCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg4MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkvLyBvdGhlcndpc2UgZWl0aGVyIGJvdGggYXJlIHNldCBvciBib3RoIGFyZSB1bnNldCwgYW5kIHRoYXQncyBmaW5lLgotCX0KLQotCS8qKgotCSAqIElmIHRoZSBiZWFuIHByb3ZpZGVzIGEgcmVtb3RlIHZpZXcsIGJvdGggcGFydHMgb2YgdGhlIHZpZXcgbXVzdCBleGlzdC4KLQkgKiBJZiB0aGlzIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQsIHRoZW4gYWxsIHBhcnRzIG9mIHRoZSBiZWFuIGFyZSByZWZsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZW1vdGVQYWlycyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoYmVhbiBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW4pIHsKLQkJCS8vIE1lc3NhZ2UgZHJpdmVuIGJlYW5zIGRvbid0IHVzZSBsb2NhbCBvciByZW1vdGUgdmlld3MKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIHJlbW90ZSA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCUphdmFDbGFzcyBob21lID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCWlmKChyZW1vdGUgIT0gbnVsbCkgJiYgKGhvbWUgPT0gbnVsbCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg4MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIGlmKChyZW1vdGUgPT0gbnVsbCkgJiYgKGhvbWUgIT0gbnVsbCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg4MywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkvLyBvdGhlcndpc2UgZWl0aGVyIGJvdGggYXJlIHNldCBvciBib3RoIGFyZSB1bnNldCwgYW5kIHRoYXQncyBmaW5lLgotCX0KLQotCS8qKgotCSAqIFRoZSBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSBsb2NhbCB2aWV3LCBvciBhIHJlbW90ZSB2aWV3LCBvciBib3RoLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTG9jYWxPclJlbW90ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoYmVhbiBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW4pIHsKLQkJCS8vIE1lc3NhZ2UgZHJpdmVuIGJlYW5zIGRvbid0IHVzZSBsb2NhbCBvciByZW1vdGUgdmlld3MKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGxvY2FsID0gYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpOwotCQlKYXZhQ2xhc3MgbG9jYWxIb21lID0gYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQkJSmF2YUNsYXNzIHJlbW90ZSA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCUphdmFDbGFzcyByZW1vdGVIb21lID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0KLQkJaWYoKGxvY2FsSG9tZSA9PSBudWxsKSAmJiAocmVtb3RlSG9tZSA9PSBudWxsKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODg0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYoKGxvY2FsID09IG51bGwpICYmIChyZW1vdGUgPT0gbnVsbCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg4NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUGVyc2lzdGVuY2VUeXBlRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJLy8gQXR0ZW1wdCBpbiB2YWluIHRvIHZhbGlkYXRlIHRoZSBwZXJzaXN0ZW5jZSB0eXBlIGVsZW1lbnQgaGVyZSwgYmVjYXVzZSAKLQkJLy8gaWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGVyZSdzIGEgc3ludGF4IGVycm9yLCBhbmQgdGhlIAotCQkvLyB2YWxpZGF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElSZXBvcnRlciwgSVZhbGlkYXRpb25Db250ZXh0KSB3b3VsZCBoYXZlIGJlZW4gCi0JCS8vIGNhbGxlZCBpbnN0ZWFkLgotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQkvLyBjaGVjayBzeW50YXgKLQkJCUVudGl0eSBlbnRpdHlCZWFuID0gKEVudGl0eSkgYmVhbjsKLQkJCWlmICghKGVudGl0eUJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgfHwgZW50aXR5QmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHByaW1hcnkga2V5IGNsYXNzIHJlZmxlY3RlZCBwcm9wZXJseSwgcmV0dXJuIHRydWUuIEVsc2UsIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVByaW1LZXlDbGFzc0VsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuLmlzRW50aXR5KCkpIHsKLQkJCS8vIGNoZWNrIHN5bnRheAotCQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KSB7Ci0JCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbjsKLQkJCQlDTVBBdHRyaWJ1dGUgYXR0ciA9IGNtcC5nZXRQcmltS2V5RmllbGQoKTsKLQkJCQlpZigoYXR0ciAhPSBudWxsKSAmJiAhYXR0ci5lSXNQcm94eSgpICYmICFpc1ZhbGlkUHJpbUtleUZpZWxkKGNtcCxhdHRyKSkgIHsKLQkJCQkJLy8gOS40LjcuMQotCQkJCQkvLyB1c2VyIGhhcyBzcGVjaWZpZWQgYm90aCBhIHByaW0ta2V5LWNsYXNzIGFuZCBhIHByaW1rZXktZmllbGQKLQkJCQkJLy8gY2FuJ3QgdXNlIHRoZSBDTVBBdHRyaWJ1dGUncyBmaWVsZCdzIG5hbWUsIGJlY2F1c2UgdGhlIHByaW1pdGl2ZSBwcmltYXJ5IGtleSByZXR1cm5lZCBpcyBudWxsCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBwcmltIGtleSBpcyBzcGVjaWZpZWQgaW4gdGhlIHhtbCwgYW5zd2VyIHdoZXRoZXIgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGRlcml2ZWQgcHJpbWFyeUtleUF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRQcmltS2V5RmllbGQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAsIENNUEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCXJldHVybiBjbXAuZ2V0UHJpbWFyeUtleU5hbWUoKS5lcXVhbHMoYXR0ci5nZXRUeXBlKCkuZ2V0SmF2YU5hbWUoKSk7IAotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUmVlbnRyYW50RWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJLy8gY2hlY2sgc3ludGF4Ci0JCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgYmVhbjsKLQkJCWlmICghZW50aXR5LmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRpdHlfUmVlbnRyYW50KCkpKSB7Ci0JCQkJLy8gQ2FuIG9ubHkgdGVzdCBpZiB0aGUgcmVlbnRyYW50IGF0dHJpYnV0ZSBpcyBzZXQsIGJlY2F1c2UgdGhlIG1vZGVsIGRlZmF1bHRzIGl0Ci0JCQkJLy8gdG8gc29tZSBib29sZWFuIHZhbHVlIGlmIGl0IGlzbid0IHNldC4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODA2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgRWpiUmVmIGlzIG5vdCB2YWxpZCwgYWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlLgotCSAqCi0JICogQHBhcm0gRWpiUmVmIFRoZSByZWYgd2hvc2UgaG9tZSB0aGlzIG1ldGhvZCBjaGVja3MuCi0JICogQHBhcm0gRW50ZXJwcmlzZUJlYW4gSWYgdGhlIEVqYlJlZiB1c2VzIGFuIDxlamItbGluaz4gZWxlbWVudCwgdGhpcyBpcyB0aGUgZW50ZXJwcmlzZSBiZWFuIGlkZW50aWZpZWQgYnkgdGhhdCBlbGVtZW50LiBJdCBtYXkgYmUgbnVsbCwgaWYgdGhlIHVzZXIgaGFzIG1hZGUgYSBtaXN0YWtlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVtb3RlUmVmKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRWpiUmVmIHJlZiwgRW50ZXJwcmlzZUJlYW4gbmFtZWRFamIpIHsKLQkJYm9vbGVhbiB2YWxpZFR5cGUgPSB0cnVlOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKXJlZi5lQ29udGFpbmVyKCk7Ci0JCWlmIChyZWYuZUlzU2V0KENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9SZW1vdGUoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHJlbW90ZU5hbWUgPSByZWYuZ2V0UmVtb3RlKCk7Ci0JCQkJSmF2YUhlbHBlcnMgdHlwZSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKHJlbW90ZU5hbWUsIGJlYW4pOwotCQkJCS8vIENoZWNrIHRoYXQgdGhlIGhvbWUgc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudCBvZiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQKLQkJCQkvLyBleGlzdHMuCi0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHR5cGUpOwotCi0JCQkJaWYgKG5hbWVkRWpiICE9IG51bGwpIHsKLQkJCQkJLy8gQ2hlY2sgdGhhdCB0aGUgaG9tZSBzcGVjaWZpZWQgaW4gdGhlIDxob21lPiBlbGVtZW50Ci0JCQkJCS8vIGlzIGFzc2lnbmFibGUgdG8gdGhlIGhvbWUgdXNlZCBieSB0aGUgbmFtZWQgRUpCIGluIHRoZQotCQkJCQkvLyA8ZWpiLWxpbms+IGVsZW1lbnQuCi0JCQkJCUphdmFDbGFzcyBpbnRmVHlwZSA9IG5hbWVkRWpiLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoaW50ZlR5cGUpOwotCi0JCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBpZGVudGlmaWVkIGhvbWUvcmVtb3RlIGludGVyZmFjZSBpbiB0aGUgZWpiLXJlZgotCQkJCQkvLyBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvbmUgdXNlZCBieSB0aGUgYmVhbi4KLQkJCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0eXBlLCBpbnRmVHlwZSkpIHsKLQkJCQkJCVN0cmluZ1tdIHBhcm1zID0geyBuYW1lZEVqYi5nZXROYW1lKCksIGludGZUeXBlLmdldE5hbWUoKX07Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODM3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJdmFsaWRUeXBlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZFR5cGUgPSBmYWxzZTsKLQkJfQotCi0JCWlmICghdmFsaWRUeXBlKSB7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IHsgcmVmLmdldFJlbW90ZSgpfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogMTUuMi41LjMgRGVjbGFyYXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMgcmVmZXJlbmNlZCBmcm9tIHRoZSBiZWFuJ3MgY29kZQotCSAqIFRoZSBCZWFuIFByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWNsYXJpbmcgaW4gdGhlIHNlY3VyaXR5LXJvbGUtcmVmIAotCSAqIGVsZW1lbnRzIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWxsIHRoZSBzZWN1cml0eSByb2xlIG5hbWVzIHVzZWQgCi0JICogaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLiBEZWNsYXJpbmcgdGhlIHNlY3VyaXR5IHJvbGVzIHJlZmVyZW5jZXMgaW4KLQkgKiB0aGUgY29kZSBhbGxvd3MgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBvciBEZXBsb3llciB0byBsaW5rIHRoZSBuYW1lcyAKLQkgKiBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgdXNlZCBpbiB0aGUgY29kZSB0byB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBmb3IgCi0JICogYW4gYXNzZW1ibGVkIGFwcGxpY2F0aW9uIHRocm91Z2ggdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0JICogVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBkZWNsYXJlIGVhY2ggc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VkIGluIHRoZSBjb2RlCi0JICogdXNpbmcgdGhlIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQgYXMgZm9sbG93czoKLQkgKiAgICAgIERlY2xhcmUgdGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IHJvbGUgdXNpbmcgdGhlIHJvbGUtbmFtZSBlbGVtZW50LiAKLQkgKiBUaGUgbmFtZSBtdXN0IGJlIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdGhhdCBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIAotCSAqIHRoZSBpc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZS1OYW1lKSBtZXRob2QuCi0JICogICAgICBPcHRpb25hbDogUHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIGluIHRoZSAKLQkgKiBkZXNjcmlwdGlvbiBlbGVtZW50LiBBIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlLCBpbmNsdWRpbmcgdGhlIG5hbWUgZGVmaW5lZCAKLQkgKiBieSB0aGUgcm9sZS1uYW1lIGVsZW1lbnQsIGlzIHNjb3BlZCB0byB0aGUgc2Vzc2lvbiBvciBlbnRpdHkgYmVhbiBlbGVtZW50IAotCSAqIHdob3NlIGRlY2xhcmF0aW9uIGNvbnRhaW5zIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50LiBUaGUgZm9sbG93aW5nIAotCSAqIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IGFuIGVudGVycHJpc2UgYmVhbidzIHJlZmVyZW5jZXMgdG8gc2VjdXJpdHkgcm9sZXMgCi0JICogYXJlIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JICogICAgLi4uCi0JICogICAgPGVudGVycHJpc2UtYmVhbnM+Ci0JICogICAgICAgLi4uCi0JICogICAgICAgPGVudGl0eT4KLQkgKiAgICAgICAgICA8ZWpiLW5hbWU+QWFyZHZhcmtQYXlyb2xsPC9lamItbmFtZT4KLQkgKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotCSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLQkgKiAgICAgICAgICAgICAgICAgVGhpcyBzZWN1cml0eSByb2xlIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUKLQkgKiAgICAgICAgICAgICAgICAgZW1wbG95ZWVzIG9mIHRoZSBwYXlyb2xsIGRlcGFydG1lbnQgd2hvIGFyZQotCSAqICAgICAgICAgICAgICAgICBhbGxvd2VkIHRvIHVwZGF0ZSBlbXBsb3llZXMnIHNhbGFyaWVzLgotCSAqICAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JICogICAgICAgICAgICAgPHJvbGUtbmFtZT5wYXlyb2xsPC9yb2xlLW5hbWU+Ci0JICogICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLQkgKiAgICAgICAgICAuLi4KLQkgKiAgICAgICA8L2VudGl0eT4KLQkgKiAgICAgICAuLi4KLQkgKiAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0JICogICAgLi4uCi0JICoKLQkgKiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFib3ZlIGluZGljYXRlcyB0aGF0IHRoZSBlbnRlcnByaXNlIGJlYW4gCi0JICogQWFyZHZhcmtQYXlyb2xsIG1ha2VzIHRoZSBzZWN1cml0eSBjaGVjayB1c2luZyBpc0NhbGxlckluUm9sZSgicGF5cm9sbCIpCi0JICogaW4gaXRzIGJ1c2luZXNzIG1ldGhvZC4KLQkgKgotCSAqCi0JICogMTUuMy4zIExpbmtpbmcgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzIHRvIHNlY3VyaXR5IHJvbGVzCi0JICogSWYgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBkZWZpbmVzIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIGluIHRoZSAKLQkgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGhlIG9yIHNoZSBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBsaW5raW5nIGFsbCB0aGUgCi0JICogc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzIGRlY2xhcmVkIGluIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50cyB0byB0aGUgCi0JICogc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4gVGhlIEFwcGxpY2F0aW9uIAotCSAqIEFzc2VtYmxlciBsaW5rcyBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIHRvIGEgc2VjdXJpdHkgcm9sZSB1c2luZyB0aGUgCi0JICogcm9sZS1saW5rIGVsZW1lbnQuIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiAKLQkgKiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gYSBzZWN1cml0eS1yb2xlIGVsZW1lbnQuCi0JICogQSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGJlIHVzZWQgZXZlbiBpZiB0aGUgdmFsdWUgb2Ygcm9sZS1uYW1lIGlzIHRoZSAKLQkgKiBzYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1saW5rIHJlZmVyZW5jZS4KLQkgKiBUaGUgZm9sbG93aW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBleGFtcGxlIHNob3dzIGhvdyB0byBsaW5rIHRoZSBzZWN1cml0eSAKLQkgKiByb2xlIHJlZmVyZW5jZSBuYW1lZCBwYXlyb2xsIHRvIHRoZSBzZWN1cml0eSByb2xlIG5hbWVkIHBheXJvbGwtZGVwYXJ0bWVudC4KLQkgKiAgICAuLi4KLQkgKiAgICA8ZW50ZXJwcmlzZS1iZWFucz4KLQkgKiAgICAgICAuLi4KLQkgKiAgICAgICA8ZW50aXR5PgotCSAqICAgICAgICAgIDxlamItbmFtZT5BYXJkdmFya1BheXJvbGw8L2VqYi1uYW1lPgotCSAqICAgICAgICAgIDxlamItY2xhc3M+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEJlYW48L2VqYi1jbGFzcz4KLQkgKiAgICAgICAgICAuLi4KLQkgKiAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0JICogICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgotCSAqICAgICAgICAgICAgICAgIFRoaXMgcm9sZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlCi0JICogICAgICAgICAgICAgICAgZW1wbG95ZWVzIG9mIHRoZSBwYXlyb2xsIGRlcGFydG1lbnQuCi0JICogICAgICAgICAgICAgICAgTWVtYmVycyBvZiB0aGlzIHJvbGUgaGF2ZSBhY2Nlc3MgdG8KLQkgKiAgICAgICAgICAgICAgICBhbnlvbmUncyBwYXlyb2xsIHJlY29yZC4KLQkgKgotCSAqICAgICAgICAgICAgICAgIFRoZSByb2xlIGhhcyBiZWVuIGxpbmtlZCB0byB0aGUKLQkgKiAgICAgICAgICAgICAgICBwYXlyb2xsLWRlcGFydG1lbnQgcm9sZS4KLQkgKiAgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCSAqICAgICAgICAgICAgIDxyb2xlLW5hbWU+cGF5cm9sbDwvcm9sZS1uYW1lPgotCSAqICAgICAgICAgICAgIDxyb2xlLWxpbms+cGF5cm9sbC1kZXBhcnRtZW50PC9yb2xlLWxpbms+Ci0JICogICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLQkgKiAgICAgICAgICAuLi4KLQkgKiAgICAgICA8L2VudGl0eT4KLQkgKiAgICAgICAuLi4KLQkgKiAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0JICogICAgLi4uCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlY3VyaXR5Um9sZVJlZkVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qKgotCQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgcm9sZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkJICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgU2VjdXJpdHlSb2xlUmVmIGluc3RhbmNlLgotCQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkJICoKLQkJICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgU2VjdXJpdHlSb2xlUmVmIGluc3RhbmNlIHNvIHRoYXQgdGhlIHdyYXBwZXIncwotCQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCQkgKiBzdGlsbCBiZSBhYmxlIHRvIGdldCB0aGUgcmVmIGZyb20gdGhlIGR1cGxpY2F0ZSBuYW1lLgotCQkgKi8KLQkJY2xhc3MgUm9sZVJlZldyYXBwZXIgewotCQkJcHJpdmF0ZSBTZWN1cml0eVJvbGVSZWYgX3JlZiA9IG51bGw7Ci0KLQkJCXB1YmxpYyBSb2xlUmVmV3JhcHBlcihTZWN1cml0eVJvbGVSZWYgcmVmKSB7Ci0JCQkJX3JlZiA9IHJlZjsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBSb2xlUmVmV3JhcHBlcikgewotCQkJCQlSb2xlUmVmV3JhcHBlciBvdGhlciA9IChSb2xlUmVmV3JhcHBlcikgbzsKLQkJCQkJcmV0dXJuIF9yZWYuZ2V0TmFtZSgpLmVxdWFscyhvdGhlci5nZXRSb2xlUmVmKCkuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU2VjdXJpdHlSb2xlUmVmIGdldFJvbGVSZWYoKSB7Ci0JCQkJcmV0dXJuIF9yZWY7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIGFyZVNSb2xlc0RlZmluZWQgPSAoKF9zZWN1cml0eVJvbGVzICE9IG51bGwpICYmIChfc2VjdXJpdHlSb2xlcy5zaXplKCkgPiAwKSk7Ci0KLQkJTGlzdCBzZWN1cml0eVJvbGVSZWZzID0gYmVhbi5nZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCWlmICgoc2VjdXJpdHlSb2xlUmVmcyAhPSBudWxsKSAmJiAoc2VjdXJpdHlSb2xlUmVmcy5zaXplKCkgIT0gMCkpIHsKLQkJCS8vIENoZWNrIHRoYXQgZWFjaCBzZWN1cml0eSByb2xlIHJlZiByZWZlcnMgdG8gYSBzZWN1cml0eSByb2xlLAotCQkJLy8gaWYgc2VjdXJpdHkgcm9sZXMgYXJlIGRlZmluZWQgaW4gdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IsCi0JCQkvLyBhbmQgdGhhdCBlYWNoIHJlZmVyZW5jZWQgc2VjdXJpdHkgcm9sZSBleGlzdHMuCi0JCQlEdXBsaWNhdGVzVGFibGUgcm9sZVJlZk5hbWVzID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWN1cml0eVJvbGVSZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU2VjdXJpdHlSb2xlUmVmIHJlZiA9IChTZWN1cml0eVJvbGVSZWYpIHNlY3VyaXR5Um9sZVJlZnMuZ2V0KGkpOwotCi0JCQkJLy8gQ2hlY2sgdGhhdCB0aGUgcm9sZSBuYW1lIGlzIHNldCAoMTUuMi41LjMpCi0JCQkJU3RyaW5nIHJvbGVOYW1lID0gcmVmLmdldE5hbWUoKTsKLQkJCQlpZiAoKHJvbGVOYW1lID09IG51bGwpIHx8IChyb2xlTmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXJvbGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGJlYW5OYW1lID0gKGJlYW4uZ2V0TmFtZSgpID09IG51bGwpID8gIiIgOiBiZWFuLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODIyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgcmVmLCBuZXcgU3RyaW5nW10geyBiZWFuTmFtZSB9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIEJ1aWxkIHVwIHRoZSBsaXN0IG9mIG5hbWVzLCB0byBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCQlyb2xlUmVmTmFtZXMuYWRkKG5ldyBSb2xlUmVmV3JhcHBlcihyZWYpKTsKLQkJCQl9Ci0KLQkJCQkvLyBDaGVjayB0aGF0IHRoZSByb2xlIGxpbmsgaXMgc2V0ICgxNS4zLjMpCi0JCQkJU3RyaW5nIHJvbGVMaW5rID0gcmVmLmdldExpbmsoKTsKLQkJCQlib29sZWFuIGlzTGlua0RlZmluZWQgPSAoKHJlZi5lSXNTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX0xpbmsoKSkpICYmIChyb2xlTGluayAhPSBudWxsKSAmJiAoIXJvbGVMaW5rLmVxdWFscygiIikpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJaWYgKChhcmVTUm9sZXNEZWZpbmVkKSAmJiAoIWlzTGlua0RlZmluZWQpKSB7Ci0JCQkJCS8vIG11c3QgaGF2ZSByb2xlIGxpbmsgZGVmaW5lZCAoMTUuMy4zKQotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODIzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgcmVmLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKCFhcmVTUm9sZXNEZWZpbmVkKSAmJiAoaXNMaW5rRGVmaW5lZCkpIHsKLQkJCQkJLy8gbXVzdCBub3QgaGF2ZSByb2xlIGxpbmsgZGVmaW5lZCAoMTUuMi41LjMpCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCByZWYsIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChhcmVTUm9sZXNEZWZpbmVkICYmIGlzTGlua0RlZmluZWQpIHsKLQkJCQkJLy8gY2hlY2sgdGhhdCB0aGUgcm9sZSBsaXN0ZWQgaW4gdGhlIGxpbmsgZXhpc3RzLiAoMTUuMy4zKQotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IF9zZWN1cml0eVJvbGVzLml0ZXJhdG9yKCk7Ci0JCQkJCWJvb2xlYW4gcm9sZUV4aXN0cyA9IGZhbHNlOwotCQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCVNlY3VyaXR5Um9sZSByb2xlID0gKFNlY3VyaXR5Um9sZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZihyb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKHJvbGVMaW5rKSkgewotCQkJCQkJCXJvbGVFeGlzdHMgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghcm9sZUV4aXN0cykgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJlZiwgbmV3IFN0cmluZ1tdIHsgcm9sZU5hbWUgfSwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDaGVjayBmb3IgZHVwbGljYXRlcwotCQkJLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlIHJvbGUtbmFtZXMuICgxNS4zLjEpCi0JCQlpZiAocm9sZVJlZk5hbWVzLmNvbnRhaW5zRHVwbGljYXRlcygpKSB7Ci0JCQkJTGlzdCBkdXBsaWNhdGVzID0gcm9sZVJlZk5hbWVzLmdldER1cGxpY2F0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGR1cGxpY2F0ZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCAoKFJvbGVSZWZXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCkpLmdldFJvbGVSZWYoKSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJcm9sZVJlZk5hbWVzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA2LjUuMyBUaGUgb3B0aW9uYWwgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UKLQkgKi4uLgotCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JICogaW1wbGVtZW50IHRoZSBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQkgKi4uLgotCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCSAqIHN5bmNocm9uaXphdGlvbiBjYWxsIGJhY2tzIGJlY2F1c2UgdGhlIGJlYW4gaXMgaW4gY29udHJvbCBvZiB0aGUgY29tbWl0IHRoZSBiZWFuIAotCSAqIGtub3dzIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFib3V0IHRvIGJlIGNvbW1pdHRlZCBhbmQgaXQga25vd3MgdGhlIG91dGNvbWUgb2YgdGhlIAotCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlU2Vzc2lvblR5cGVFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pIGJlYW47Ci0KLQkJCS8vIGNoZWNrIHN5bnRheAotCQkJYm9vbGVhbiBpc1ZhbGlkU2VzcyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkU2Vzc2lvblR5cGVFbGVtZW50KHNlc3Npb24pOwotCQkJaWYgKCFpc1ZhbGlkU2VzcykgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgc2Vzc2lvbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlVHJhbnNhY3Rpb25UeXBlRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4uaXNTZXNzaW9uKCkpIHsKLQkJCS8vIGNoZWNrIHN5bnRheAotCQkJU2Vzc2lvbiBzZXNzaW9uQmVhbiA9IChTZXNzaW9uKSBiZWFuOwotCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFRyYW5zYWN0aW9uVHlwZUVsZW1lbnQoc2Vzc2lvbkJlYW4pKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQlfc2VjdXJpdHlSb2xlcyA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCi0JCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLQkJaWYoZWpiSmFyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoZWpiSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlfc2VjdXJpdHlSb2xlcyA9IGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JfQotCi0JLyoqCi0JICogTmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgZHVwbGljYXRlIEVKQiBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkgKiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGR1cGxpY2F0ZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZS4KLQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkgKgotCSAqIFRoaXMgY2xhc3Mgd3JhcHBlcnMgdGhlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlIHNvIHRoYXQgdGhlIHdyYXBwZXIncwotCSAqIGltcGxlbWVudGlvbiBvZiBlcXVhbHMgY29tcGFyZXMgdGhlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aWxsCi0JICogc3RpbGwgYmUgYWJsZSB0byBnZXQgdGhlIHJlZiBmcm9tIHRoZSBkdXBsaWNhdGUgbmFtZS4KLQkgKi8KLQljbGFzcyBFamJOYW1lV3JhcHBlciB7Ci0JCXByaXZhdGUgRW50ZXJwcmlzZUJlYW4gX2JlYW4gPSBudWxsOwotCi0JCXB1YmxpYyBFamJOYW1lV3JhcHBlcihFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQlfYmVhbiA9IGJlYW47Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pIHsKLQkJCQlFbnRlcnByaXNlQmVhbiBvdGhlciA9IChFbnRlcnByaXNlQmVhbikgbzsKLQkJCQlyZXR1cm4gX2JlYW4uZ2V0TmFtZSgpLmVxdWFscyhvdGhlci5nZXROYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIEVudGVycHJpc2VCZWFuIGdldEJlYW4oKSB7Ci0JCQlyZXR1cm4gX2JlYW47Ci0JCX0KLQl9Ci0KLQljbGFzcyBBU05hbWVXcmFwcGVyIHsKLQkJcHJpdmF0ZSBDb250YWluZXJNYW5hZ2VkRW50aXR5IF9iZWFuID0gbnVsbDsKLQotCQlwdWJsaWMgQVNOYW1lV3JhcHBlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGJlYW4pIHsKLQkJCV9iZWFuID0gYmVhbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KSB7Ci0JCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvdGhlciA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBvOwotCQkJCXJldHVybiBfYmVhbi5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIEVudGVycHJpc2VCZWFuIGdldEJlYW4oKSB7Ci0JCQlyZXR1cm4gX2JlYW47Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHBhcmFtIGRyaXZlbgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUFjdGl2YXRpb25Db25maWd1cmF0aW9uKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWVzc2FnZURyaXZlbiBiZWFuKSB7Ci0JCUFjdGl2YXRpb25Db25maWcgY29uZmlnICA9IGJlYW4uZ2V0QWN0aXZhdGlvbkNvbmZpZygpOwotCQlpZihjb25maWcgIT0gbnVsbCkgewotCQkJTGlzdCBjb25maWdQcm9wZXJ0aWVzID0gY29uZmlnLmdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLQkJCWlmKGNvbmZpZ1Byb3BlcnRpZXMgIT0gbnVsbCAmJiAhY29uZmlnUHJvcGVydGllcy5pc0VtcHR5KCkpIHsKLQkJCQlIYXNoU2V0IG5hbWVQcm9wZXJ0eVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IGNvbmZpZ1Byb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IHByb3BlcnR5ID0gKEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSljb25maWdQcm9wZXJ0aWVzLmdldChpKTsKLQkJCQkJYm9vbGVhbiBkb2VzTm90RXhpc3RzID0gbmFtZVByb3BlcnR5U2V0LmFkZChwcm9wZXJ0eS5nZXROYW1lKCkpOwotCQkJCQlpZighZG9lc05vdEV4aXN0cykgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODg2LCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBiZWFuLCBiZWFuLmdldEVqYkphcigpLG5ldyBTdHJpbmdbXSB7cHJvcGVydHkuZ2V0TmFtZSgpLGJlYW4uZ2V0TmFtZSgpfSx0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQlpZihpc0pNU01EQihiZWFuKSkgewotCQkJCQl2YWxpZGF0aW9uQWNrTW9kZUFjdGl2YXRpb25Db25maWcodmMsIGJlYW4sIHByb3BlcnR5KTsKLQkJCQkJdmFsaWRhdGVEZXN0aW5hdGlvblR5cGVBY3RpdmF0aW9uQ29uZmlnKHZjLCBiZWFuLCBwcm9wZXJ0eSk7Ci0JCQkJCXZhbGlkYXRlRHVyYWJpbGl0eUFjdGl2YXRpb25Db25maWcodmMsIGJlYW4sIGNvbmZpZ1Byb3BlcnRpZXMsIHByb3BlcnR5KTsKLQkJCQkgICB9Ci0JCQkJfQotCQkJfQotCSAgfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNKTVNNREIoTWVzc2FnZURyaXZlbiBiZWFuKSB7Ci0JCXJldHVybiBiZWFuLmdldE1lc3NhZ2luZ1R5cGUoKSA9PSBudWxsIHx8IGJlYW4uZ2V0TWVzc2FnaW5nVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoSk1TX01FU1NBR0lOR19UWVBFKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRpb25BY2tNb2RlQWN0aXZhdGlvbkNvbmZpZyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1lc3NhZ2VEcml2ZW4gYmVhbiwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IHByb3BlcnR5KSB7Ci0JCWlmKHByb3BlcnR5LmdldE5hbWUoKS5lcXVhbHMoTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbC5hY2tNb2RlS2V5KSAmJiAhQXJyYXlzLmFzTGlzdChNREJBY3RpdmF0aW9uQ29uZmlnTW9kZWxVdGlsLmFja01vZGVWYWx1ZXMpLmNvbnRhaW5zKHByb3BlcnR5LmdldFZhbHVlKCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4ODcsIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIGJlYW4sIGJlYW4uZ2V0RWpiSmFyKCksbmV3IFN0cmluZ1tdIHtwcm9wZXJ0eS5nZXROYW1lKCkscHJvcGVydHkuZ2V0VmFsdWUoKSxiZWFuLmdldE5hbWUoKX0sdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZjCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVEZXN0aW5hdGlvblR5cGVBY3RpdmF0aW9uQ29uZmlnKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWVzc2FnZURyaXZlbiBiZWFuLCBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJaWYocHJvcGVydHkuZ2V0TmFtZSgpLmVxdWFscyhNREJBY3RpdmF0aW9uQ29uZmlnTW9kZWxVdGlsLmRlc3RpbmF0aW9uVHlwZUtleSkgJiYgIUFycmF5cy5hc0xpc3QoTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbC5kZXN0aW5hdGlvblR5cGVWYWx1ZXMpLmNvbnRhaW5zKHByb3BlcnR5LmdldFZhbHVlKCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4ODcsIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIGJlYW4sIGJlYW4uZ2V0RWpiSmFyKCksbmV3IFN0cmluZ1tdIHtwcm9wZXJ0eS5nZXROYW1lKCkscHJvcGVydHkuZ2V0VmFsdWUoKSxiZWFuLmdldE5hbWUoKX0sdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCUphdmFDbGFzcyBtZXNzYWdlRGVzdGluYXRpb24gPSBiZWFuLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpOwotCQlpZihtZXNzYWdlRGVzdGluYXRpb24gIT0gbnVsbCAmJiBtZXNzYWdlRGVzdGluYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpICE9IG51bGwgJiYgKHByb3BlcnR5LmdldE5hbWUoKS5lcXVhbHMoTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbC5kZXN0aW5hdGlvblR5cGVLZXkpICYmICEobWVzc2FnZURlc3RpbmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMocHJvcGVydHkuZ2V0VmFsdWUoKSkpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODkwLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBiZWFuLCBiZWFuLmdldEVqYkphcigpLG5ldyBTdHJpbmdbXSB7bWVzc2FnZURlc3RpbmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSxwcm9wZXJ0eS5nZXRWYWx1ZSgpLGJlYW4uZ2V0TmFtZSgpfSx0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHBhcmFtIHZjCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcGFyYW0gY29uZmlnUHJvcGVydGllcwotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUR1cmFiaWxpdHlBY3RpdmF0aW9uQ29uZmlnKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWVzc2FnZURyaXZlbiBiZWFuLCBMaXN0IGNvbmZpZ1Byb3BlcnRpZXMsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQlpZihwcm9wZXJ0eS5nZXROYW1lKCkuZXF1YWxzKE1EQkFjdGl2YXRpb25Db25maWdNb2RlbFV0aWwuZHVyYWJpbGl0eUtleSkgJiYgIUFycmF5cy5hc0xpc3QoTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbC5kdXJhYmlsaXR5VmFsdWUpLmNvbnRhaW5zKHByb3BlcnR5LmdldFZhbHVlKCkpKSB7Ci0JCSAgICAgICAgSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODg3LCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBiZWFuLCBiZWFuLmdldEVqYkphcigpLG5ldyBTdHJpbmdbXSB7cHJvcGVydHkuZ2V0TmFtZSgpLHByb3BlcnR5LmdldFZhbHVlKCksYmVhbi5nZXROYW1lKCl9LHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLSAgICAgIH0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTgxNDIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JQ2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDbGFzc1ZSdWxlIGV4dGVuZHMgSVZhbGlkYXRpb25SdWxlIHsKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotCS8vIEJlY2F1c2UgY2FsbGluZyBKYXZhQ2xhc3M6OmdldE1ldGhvZHNFeHRlbmRlZCgpIGlzIGFuIGV4cGVuc2l2ZSBjYWxsLCBuZWVkIHRvIGNhbGwgaXQgb25jZQotCS8vIHBlciBjbGFzcyBpbnN0ZWFkIG9mIG11bHRpcGxlIHRpbWVzIHBlciBjbGFzcy4gSG93ZXZlciwgZWFjaCBjbGFzcyBpbiB0aGUgYmVhbiBuZWVkcyBkaWZmZXJlbnQKLQkvLyBsaXN0czoKLQkvLyAgIDEuIEtleSBjbGFzcyBuZWVkcyBubyBsaXN0cy4KLQkvLyAgIDIuIEhvbWUgaW50ZXJmYWNlIChyZW1vdGUgJiBsb2NhbCkgbmVlZHMgdGhlIGJlYW4gY2xhc3MnIGdldE1ldGhvZHNFeHRlbmRlZCBsaXN0LgotCS8vICAgMy4gQ29tcG9uZW50IGludGVyZmFjZSAocmVtb3RlICYgbG9jYWwpIG5lZWRzIHRoZSBiZWFuIGNsYXNzJyBnZXRNZXRob2RzRXh0ZW5kZWQgbGlzdC4KLQkvLyAgIDQuIEJlYW4gY2xhc3MgbmVlZHMgdGhlIHJlbW90ZSBob21lLCBsb2NhbCBob21lLCByZW1vdGUgY29tcG9uZW50LCBhbmQgbG9jYWwgY29tcG9uZW50J3MgZ2V0TWV0aG9kc0V4dGVuZGVkIGxpc3QuCi0JLy8gR2l2ZW4gdGhhdCB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIGNsYXNzIGltcGxlbWVudGF0aW9uLCBhZGQgYSBMaXN0W10gYXMgYSBmaW5hbCBwYXJhbWV0ZXIsIGFuZCBlYWNoCi0JLy8gaW1wbGVtZW50YXRpb24gY2FuIGZpZ3VyZSBvdXQgd2hhdCB0aGUgTGlzdFtdIG5lZWRzIHRvIGJlIHBvcHVsYXRlZCB3aXRoLCBpZiBhbnl0aGluZy4gKGkuZS4sIHRoZQotCS8vIGtleSBjbGFzcyB3aWxsIHByb2JhYmx5IHBhc3MgaW4gYSBudWxsIGluc3RlYWQgb2YgYW4gZW1wdHkgTGlzdC4pCi0JLy8gCi0JLy8gU2ltaWxhciByZWFzb25pbmcgZm9yIHRoZSBMaXN0W10gb2YgZ2V0RmllbGRzRXh0ZW5kZWQoKS4KLQlwdWJsaWMgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQlwdWJsaWMgTGlzdFtdIGdldEZpZWxkc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uOwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uOwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkc0V4dGVuZGVkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uOwotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uOwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkc0V4dGVuZGVkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lDb21wb25lbnRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUNvbXBvbmVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMGZiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUNvbXBvbmVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50VHlwZSBleHRlbmRzIElFSkJJbnRlcmZhY2VUeXBlIHsKLQlwdWJsaWMgSmF2YUNsYXNzIGdldEhvbWVJbnRlcmZhY2UoRW50ZXJwcmlzZUJlYW4gYmVhbik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQkludGVyZmFjZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRUpCSW50ZXJmYWNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWMyYmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRUpCSW50ZXJmYWNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLSAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFSkJJbnRlcmZhY2VUeXBlIGV4dGVuZHMgSUVKQlR5cGUgewotCXB1YmxpYyBib29sZWFuIGlzRUpCSW50ZXJmYWNlTWV0aG9kKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247Ci0JcHVibGljIEphdmFIZWxwZXJzIGdldE92ZXJFeHBvc2VkTG9jYWxUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUFwcGxpY2F0aW9uRXhjZXB0aW9uUnVsZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247Ci0JcHVibGljIHZvaWQgdmFsaWRhdGVSTUlfSUlPUFR5cGVSdWxlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzLCBib29sZWFuIGNoZWNrUmV0dXJuVHlwZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLQlwdWJsaWMgYm9vbGVhbiBmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOwotCXB1YmxpYyBib29sZWFuIGZvbGxvd1JNSV9JSU9QSW5oZXJpdGFuY2VSdWxlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRUpCVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2RkNDkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRUpCVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJRUpCVHlwZSBleHRlbmRzIElUeXBlQ29uc3RhbnRzLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgaW50IFJFTU9URSA9IDB4MTsKLQlwdWJsaWMgc3RhdGljIGludCBMT0NBTCA9IDB4MjsKLQlwdWJsaWMgc3RhdGljIGludCBORUlUSEVSID0gMHg0OwotCQotCXB1YmxpYyBsb25nW10gZ2V0U3VwZXJ0eXBlcygpOwotCXB1YmxpYyBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCk7Ci0JCi0JLyoqCi0JICogSWYgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2VzIG5vdCBtYXRjaCBvbmUgb2YgdGhlIG1ldGhvZCBuYW1lcyB3aGljaCB0aGlzCi0JICogcnVsZSB2YWxpZGF0ZXMsIHdoYXQgdHlwZSBzaG91bGQgdGhlIG1ldGhvZCBiZSBjb25zaWRlcmVkPyAoZS5nLiBob21lIG9yIGJ1c2luZXNzKS4KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TWV0aG9kVHlwZSgpOwotCXB1YmxpYyBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpOwotCi0JcHVibGljIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKTsKLQlwdWJsaWMgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpOwotCQotCXB1YmxpYyBpbnQgaXNSZW1vdGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRUpCVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRUpCVmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjZDdkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVKQlZhbGlkYXRpb25Db250ZXh0IGV4dGVuZHMgSVZhbGlkYXRpb25Db250ZXh0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQotCQotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpOwotCXB1YmxpYyBJVmFsaWRhdGlvbkNvbnRleHQgZ2V0SGVscGVyKCk7Ci0JcHVibGljIElSZXBvcnRlciBnZXRSZXBvcnRlcigpOwotCQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKCk7IC8vIHJldHVybnMgYW4gZW1wdHkgSU1lc3NhZ2Ugd2hpY2ggY2FuIGJlIHJldXNlZAotCXB1YmxpYyBMb2dnZXIgZ2V0TXNnTG9nZ2VyKCk7Ci0JCi0JcHVibGljIHZvaWQgdGVybWluYXRlSWZDYW5jZWxsZWQoKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgTG9nRW50cnkgZ2V0TG9nRW50cnkoKTsKLQkKLQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lKTsKLQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lLCBPYmplY3RbXSBwYXJtcyk7Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoKTsKLQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlcyhPYmplY3QgdGFyZ2V0KTsKLQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlcyhPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBJZGVudGlmaWVyKTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElNZXNzYWdlIG1lc3NhZ2UpOwotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkKTsKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMpOwotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0KTsKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXQpOwotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lKTsKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cE5hbWUpOwotCQotCXB1YmxpYyB2b2lkIHN1YnRhc2soU3RyaW5nIG1lc3NhZ2VJZCk7Ci0JcHVibGljIHZvaWQgc3VidGFzayhTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcyk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlZhbGlkYXRvckNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0b3JDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmODhmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlZhbGlkYXRvckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotcHVibGljIGludGVyZmFjZSBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzIHsKLQkvLyBOYW1lIG9mIC5wcm9wZXJ0aWVzIGZpbGUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJlamJ2YWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gTmFtZSBvZiBsb2dnZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dOQU1FID0gIkVKQlZhbGlkYXRvckxvZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBTdGF0dXMgY29uc3RhbnRzIHdoaWNoIGRvIG5vdCByZXF1aXJlIGEgbWVzc2FnZSBwcmVmaXggKGUuZy4gQUJDRDAwMDBFKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19WQUxJREFUSU5HID0gIlNUQVRVU19WQUxJREFUSU5HIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfUFJJTUFSWV9LRVkgPSAiPHByaW1hcnkta2V5PiI7IC8vIHdoZW4gYSBrZXkgY2xhc3MgbmFtZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGF0IGNsYXNzIGlzIG51bGwsIGRpc3BsYXkgdGhpcyBpbnN0ZWFkIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX0JFQU5fQ0xBU1MgPSAiPGVqYi1jbGFzcz4iOyAvLyB3aGVuIGEgYmVhbiBjbGFzcyBuYW1lIG5lZWRzIHRvIGJlIGRpc3BsYXllZCwgYnV0IHRoYXQgY2xhc3MgaXMgbnVsbCwgZGlzcGxheSB0aGlzIGluc3RlYWQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfTE9DQUxfSE9NRSA9ICI8bG9jYWwtaG9tZT4iOyAvLyB3aGVuIGEgbG9jYWwtaG9tZSBjbGFzcyBuYW1lIG5lZWRzIHRvIGJlIGRpc3BsYXllZCwgYnV0IHRoYXQgY2xhc3MgaXMgbnVsbCwgZGlzcGxheSB0aGlzIGluc3RlYWQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfTE9DQUwgPSAiPGxvY2FsPiI7IC8vIHdoZW4gYSBsb2NhbCBjbGFzcyBuYW1lIG5lZWRzIHRvIGJlIGRpc3BsYXllZCwgYnV0IHRoYXQgY2xhc3MgaXMgbnVsbCwgZGlzcGxheSB0aGlzIGluc3RlYWQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfSE9NRSA9ICI8aG9tZT4iOyAvLyB3aGVuIGEgaG9tZSBjbGFzcyBuYW1lIG5lZWRzIHRvIGJlIGRpc3BsYXllZCwgYnV0IHRoYXQgY2xhc3MgaXMgbnVsbCwgZGlzcGxheSB0aGlzIGluc3RlYWQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfUkVNT1RFID0gIjxyZW1vdGU+IjsgLy8gd2hlbiBhIHJlbW90ZSBjbGFzcyBuYW1lIG5lZWRzIHRvIGJlIGRpc3BsYXllZCwgYnV0IHRoYXQgY2xhc3MgaXMgbnVsbCwgZGlzcGxheSB0aGlzIGluc3RlYWQgLy8kTk9OLU5MUy0xJAotCQotCS8vIFdlIHVzZSBhIHN0cmluZyBoZXJlIGJlY2F1c2UgdGhpcyBpbnRlcmZhY2UgaXMgc2hpcHBlZCB3aXRoIFdBUywgYnV0Ci0JLy8gSjJFRUNvcmVQbHVnaW4gaXMgbm90LiBUaGVyZWZvcmUgaGF2aW5nIHRoZSBKMkVFQ29yZVBsdWdpbi5QTFVHSU5fSUQgCi0JLy8gZGVwZW5kZW5jeSB3b3JrcyBmaW5lIGluIHRoZSB0b29saW5nIGVudiwgYnV0IHdpbGwgcmVzdWx0IGluIE5vQ2xhc3NEZWZGb3VuZCBpbiBXQVMJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9DT1JFX1BMVUdJTiA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb3JlIjsgLy8gJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkZWRiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBob2xkcyB0aGUgbWVzc2FnZSBjb25zdGFudHMgdGhhdCBhcmUgY29tbW9uIGFjcm9zcwotICogc3BlY2lmaWNhdGlvbnMuIChlLmcuIGludGVybmFsIGVycm9yIG1lc3NhZ2VzLCBjaGVja3MgdGhhdCBhcmUgdGhlIHNhbWUuKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzIHsKLQkvLyBDb25zdGFudHMgdXNlZCBpbiBtZXNzYWdlIGlkcwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT05fQkFTRSA9ICIuaSI7IC8vIFN0cmluZyB0byBiZSByZWdpc3RlcmVkIGFnYWluc3QgYSBiYXNlIHR5cGUsIG5vdCB0aGUgSmF2YUNsYXNzIGJlaW5nIHZhbGlkYXRlZC4gKEluaGVyaXRlZCBtZXRob2QuKSAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBPTl9USElTID0gIi5tIjsgLy8gU3RyaW5nIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgSmF2YUNsYXNzIGJlaW5nIHZhbGlkYXRlZC4gKE1ldGhvZCBpbXBsIG9uIEphdmFDbGFzcyBpdHNlbGYuKSAvLyROT04tTkxTLTEkCi0KLQkvLyBJbnRlcm5hbCBlcnJvcnMgYW5kIHN1Y2gKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDQxID0gIkNIS0oyMDQxIjsgLy8gdW5uYW1lZCBwYWNrYWdlIChKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24pIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDMzID0gIkNIS0oyNDMzIjsgLy8gY2Fubm90IHJlZmxlY3QgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NTYgPSAiQ0hLSjI0NTYiOyAvLyBTaG91bGQgdGhyb3cgWCBvciB0aGVyZSBtYXkgYmUgY29tcGlsZSBlcnJvcnMgaW4gdGhlIGRlcGxveSBjb2RlLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg1MiA9ICJDSEtKMjg1MiI7IC8vIFRocm93YWJsZSBjYXVnaHQgd2hpbGUgdmFsaWRhdGluZyBlamItamFyLnhtbCAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjkwMCA9ICJDSEtKMjkwMCI7IC8vIEludGVybmFsIGVycm9yIHdoaWxlIHJ1bm5pbmcgRUpCIHZhbGlkYXRvciAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjkwNSA9ICJDSEtKMjkwNSI7IC8vIEVKQiBWYWxpZGF0b3IgY291bGQgbm90IHJ1biBiZWNhdXNlIGVqYi1qYXIueG1sIGNvdWxkIG5vdCBiZSBsb2FkZWQuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyOTA3ID0gIkNIS0oyOTA3IjsgLy8gVHlwZSBYLCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguIC8vJE5PTi1OTFMtMSQKLQotCS8vIFNwZWNpZmljYXRpb24gcnVsZXMKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDAzRSA9ICJDSEtKMjAwM0UiOyAvLyBpbXBsZW1lbnQgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24gKGNhbiBiZSBlcnJvciBvciBpbmZvIGRlcGVuZGluZyBvbiBjb250ZXh0KSAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAwM0kgPSAiQ0hLSjIwMDNJIjsgLy8gaW1wbGVtZW50IGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uIChjYW4gYmUgZXJyb3Igb3IgaW5mbyBkZXBlbmRpbmcgb24gY29udGV4dCkgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAxNCA9ICJDSEtKMjAxNCI7IC8vIGNsYXNzIG11c3QgYmUsIG9yIG11c3Qgbm90IGJlLCBhYnN0cmFjdCAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAxNSA9ICJDSEtKMjAxNSI7IC8vIGNsYXNzIG11c3QgYmUsIG9yIG11c3Qgbm90IGJlLCBmaW5hbCAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAxNyA9ICJDSEtKMjAxNyI7IC8vIGNsYXNzL2ludGVyZmFjZSBtdXN0IGV4dGVuZC9pbXBsZW1lbnQgWCAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAxOSA9ICJDSEtKMjAxOSI7IC8vIGtleSBjbGFzcyBtdXN0IGJlIHNlcmlhbGl6YWJsZS9hIGxlZ2FsIHZhbHVlIHR5cGUgaW4gUk1JLUlJT1AgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAyMiA9ICJDSEtKMjAyMiI7IC8vIGNsYXNzIG11c3QgYmUgcHVibGljIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDIzID0gIkNIS0oyMDIzIjsgLy8gYSBtYXRjaGluZyBtZXRob2QgKGZvciB0aGlzIGNvbXBvbmVudCBtZXRob2QpIG11c3QgZXhpc3Qgb24gdGhlIGJlYW4gY2xhc3MgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA0MCA9ICJDSEtKMjA0MCI7IC8vICJ0aGlzIiBtdXN0IG5vdCBiZSBwYXNzZWQgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIxMDMgPSAiQ0hLSjIxMDMiOyAvLyBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSBiZWFuIGNsYXNzIG11c3QgaW5oZXJpdCBYLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjEwNCA9ICJDSEtKMjEwNCI7IC8vIEluIGNvbXBvbmVudCBpbmhlcml0YW5jZSwgdGhlIGhvbWUgY2xhc3MgbXVzdCBub3QgaW5oZXJpdCBYLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjEwNSA9ICJDSEtKMjEwNSI7IC8vIEluIGNvbXBvbmVudCBpbmhlcml0YW5jZSwgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UgbXVzdCBleHRlbmQgWC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIxMDYgPSAiQ0hLSjIxMDYiOyAvLyBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSBiZWFuIG11c3QgdXNlIFggYXMgaXRzIHByaW1hcnkga2V5LiAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMjA1ID0gIkNIS0oyMjA1IjsgLy8gcHJpbWFyeSBrZXkgZmllbGQgWCBtdXN0IGJlIHB1YmxpYyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjIwNiA9ICJDSEtKMjIwNiI7IC8vIHByaW1hcnkga2V5IGZpZWxkIFggbXVzdCBiZSBhIDxjbXAtZmllbGQ+IChhbmQgaW4gRUpCIDEuMSwgYWxzbyBhIGZpZWxkIG9mIHRoZSBiZWFuIGNsYXNzKSAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDAyID0gIkNIS0oyNDAyIjsgLy8gVGhlIGNyZWF0ZSBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgdHlwZSAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwMyA9ICJDSEtKMjQwMyI7IC8vIFRoZSBmaW5kZXIgbWV0aG9kIG11c3QgcmV0dXJuIFggb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA3ID0gIkNIS0oyNDA3IjsgLy8gVGhlIGVqYkZpbmQgbWV0aG9kIG11c3QgcmV0dXJuIFggb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YuIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MTEgPSAiQ0hLSjI0MTEiOyAvLyBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIuIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDEgPSAiQ0hLSjI4MDEiOyAvLyBtaXNzaW5nIDxlamItbmFtZT4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDJfTkFNRUQgPSAiQ0hLSjI4MDIubmFtZWQiOy8vIDxlamItY2xhc3M+IGNhbm5vdCBiZSByZWZsZWN0ZWQgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDJfVU5OQU1FRCA9ICJDSEtKMjgwMi51bm5hbWVkIjsvLyB1bmtub3duIDxlamItY2xhc3M+IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODAzX05BTUVEID0gIkNIS0oyODAzLm5hbWVkIjsvLyA8aG9tZT4gY2Fubm90IGJlIHJlZmxlY3RlZCAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwM19VTk5BTUVEID0gIkNIS0oyODAzLnVubmFtZWQiOy8vIHVua25vd24gPGhvbWU+IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODA0X05BTUVEID0gIkNIS0oyODA0Lm5hbWVkIjsvLyA8cmVtb3RlPiBjYW5ub3QgYmUgcmVmbGVjdGVkIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODA0X1VOTkFNRUQgPSAiQ0hLSjI4MDQudW5uYW1lZCI7Ly8gdW5rbm93biA8cmVtb3RlPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwNiA9ICJDSEtKMjgwNiI7Ly8gPHJlZW50cmFudD4gbXVzdCBiZSBlaXRoZXIgIlRydWUiIG9yICJGYWxzZSIgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDcgPSAiQ0hLSjI4MDciOyAvLyA8c2Vzc2lvbi10eXBlPiBtdXN0IGJlIGVpdGhlciAiU3RhdGVmdWwiIG9yICJTdGF0ZWxlc3MiIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODA4ID0gIkNIS0oyODA4IjsgLy8gPHRyYW5zYWN0aW9uLXR5cGU+IG11c3QgYmUgZWl0aGVyICJCZWFuIiBvciAiQ29udGFpbmVyIiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwOSA9ICJDSEtKMjgwOSI7IC8vIDxwZXJzaXN0ZW5jZS10eXBlPiBtdXN0IGJlIGVpdGhlciAiQmVhbiIgb3IgIkNvbnRhaW5lciIgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxMF9OQU1FRCA9ICJDSEtKMjgxMC5uYW1lZCI7Ly8gPHByaW0ta2V5LWNsYXNzPiBjYW5ub3QgYmUgcmVmbGVjdGVkIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODEwX1VOTkFNRUQgPSAiQ0hLSjI4MTAudW5uYW1lZCI7Ly8gdW5rbm93biA8cHJpbS1rZXktY2xhc3M+IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODExX05BTUVEID0gIkNIS0oyODExLm5hbWVkIjsvLyA8ZmllbGQtbmFtZT4gbXVzdCBleGlzdCBvbiB0aGUgYmVhbiBjbGFzcyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxMV9VTk5BTUVEID0gIkNIS0oyODExLnVubmFtZWQiOy8vIDxmaWVsZC1uYW1lPiBtdXN0IGV4aXN0IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODEyID0gIkNIS0oyODEyIjsgLy8gQmVhbiBjbGFzcyBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIG9mIGl0cyBmaWVsZHMgYXMgYSA8Y21wLWZpZWxkPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxNCA9ICJDSEtKMjgxNCI7IC8vIDxtZXRob2Q+J3MgPGVqYi1uYW1lPiBzaG91bGQgc3BlY2lmeSBhIGtub3duIGVudGVycHJpc2UgYmVhbiAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODIwID0gIkNIS0oyODIwIjsgLy8gPHNlY3VyaXR5LXJvbGUtcmVmPiBtdXN0IGJlIHVuaXF1ZS4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjIgPSAiQ0hLSjI4MjIiOyAvLyA8c2VjdXJpdHktcm9sZS1yZWY+IG11c3QgZGVmaW5lIGEgPHJvbGUtbmFtZT4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjMgPSAiQ0hLSjI4MjMiOyAvLyA8c2VjdXJpdHktcm9sZS1yZWY+IHNob3VsZCBkZWZpbmUgYSA8cm9sZS1saW5rPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgyNCA9ICJDSEtKMjgyNCI7IC8vIDxzZWN1cml0eS1yb2xlLXJlZj4gbXVzdCBpZGVudGlmeSBhIGtub3duIDxzZWN1cml0eS1yb2xlPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgyNSA9ICJDSEtKMjgyNSI7IC8vIDxzZWN1cml0eS1yb2xlPiBzaG91bGQgZGVmaW5lIHRoZSA8cm9sZS1uYW1lPiBlbGVtZW50LiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgyNiA9ICJDSEtKMjgyNiI7IC8vIDxzZWN1cml0eS1yb2xlPiBuYW1lIHNob3VsZCBiZSB1bmlxdWUuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODI3ID0gIkNIS0oyODI3IjsgLy8gQ2Fubm90IHVzZSBhIDxyb2xlLWxpbms+IHdpdGhvdXQgPHNlY3VyaXR5LXJvbGU+IGVsZW1lbnRzLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgyOCA9ICJDSEtKMjgyOCI7IC8vIENhbm5vdCB1c2UgYSA8cHJpbWtleS1maWVsZD4gZWxlbWVudCB3aXRob3V0IGEgcHJpbWl0aXZlIHByaW1hcnkga2V5LiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgyOSA9ICJDSEtKMjgyOSI7IC8vIEV2ZXJ5IGZpZWxkIGluIHRoZSBwcmltYXJ5IGtleSBtdXN0IGV4aXN0IG9uIHRoZSBiZWFuIGNsYXNzLiAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODMwID0gIkNIS0oyODMwIjsgLy8gVGhlIHR5cGUgb2YgdGhlIGZpZWxkIGNhbm5vdCBiZSByZWZsZWN0ZWQuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODMxID0gIkNIS0oyODMxIjsgLy8gWCBtdXN0IGJlIGRlY2xhcmVkIGFzIGEgPGNtcC1maWVsZD4gZWxlbWVudC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzIgPSAiQ0hLSjI4MzIiOyAvLyA8ZWpiLXJlZj4ncyBob21lIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzMgPSAiQ0hLSjI4MzMiOyAvLyA8ZWpiLXJlZj4ncyByZW1vdGUgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBFSkIgbW9kdWxlLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgzNCA9ICJDSEtKMjgzNCI7IC8vIDxlamItcmVmPidzIGJlYW4gY2Fubm90IGJlIGZvdW5kIGluIHRoZSBFSkIgbW9kdWxlLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgzNSA9ICJDSEtKMjgzNSI7IC8vIEJlYW4gWCBpcyBhIFkgdHlwZS4gVXBkYXRlIHRoZSA8ZWpiLXJlZi10eXBlPiBlbGVtZW50LiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgzNiA9ICJDSEtKMjgzNiI7IC8vIEJlYW4gWCB1c2VzIGhvbWUgWS4gVXBkYXRlIHRoZSA8ZWpiLXJlZj4gZWxlbWVudC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzcgPSAiQ0hLSjI4MzciOyAvLyBCZWFuIFggdXNlcyByZW1vdGUgWS4gVXBkYXRlIHRoZSA8ZWpiLXJlZj4gZWxlbWVudC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzggPSAiQ0hLSjI4MzgiOyAvLyBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCByZWZlcmVuY2VzIHRvIGVudGVycHJpc2UgYmVhbnMgYmUgb3JnYW5pemVkIGluIHRoZSAiZWpiIiBzdWJjb250ZXh0LiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgzOSA9ICJDSEtKMjgzOSI7IC8vIDxlbnYtZW50cnktbmFtZT4gb2YgdGhlIDxlbnYtZW50cnk+IGVsZW1lbnQgbXVzdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0MCA9ICJDSEtKMjg0MCI7IC8vIDxlbnYtZW50cnktdHlwZT4gb2YgdGhlIDxlbnYtZW50cnk+IGVsZW1lbnQgbXVzdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NDEgPSAiQ0hLSjI4NDEiOyAvLyBUaGUgWCBuYW1lLCBpbiB0aGUgPGVudi1lbnRyeT4gZWxlbWVudCwgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGJlYW4uIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODQyID0gIkNIS0oyODQyIjsgLy8gPG1ldGhvZC1wYXJhbXM+IGlzIGlnbm9yZWQgd2hlbiA8bWV0aG9kLW5hbWU+IGlzICIqIiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0MyA9ICJDSEtKMjg0MyI7IC8vIDxtZXRob2Q+IFggbXVzdCBleGlzdCBvbiBiZWFuIFkuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODQ0ID0gIkNIS0oyODQ0IjsgLy8gQXQgbGVhc3Qgb25lIDxtZXRob2Q+IHNob3VsZCBleGlzdCBpbiBhIDxtZXRob2QtcGVybWlzc2lvbj4uIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODQ1ID0gIkNIS0oyODQ1IjsgLy8gQXQgbGVhc3Qgb25lIDxyb2xlLW5hbWU+IHNob3VsZCBleGlzdCBpbiBhIDxtZXRob2QtcGVybWlzc2lvbj4uIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODQ2ID0gIkNIS0oyODQ2IjsgLy8gTm8gbWV0aG9kcyBjYW4gYmUgZm91bmQgZm9yIHRoaXMgPG1ldGhvZC1wZXJtaXNzaW9uPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0NyA9ICJDSEtKMjg0NyI7IC8vIE5vIG1ldGhvZHMgY2FuIGJlIGZvdW5kIGZvciB0aGlzIDxjb250YWluZXItdHJhbnNhY3Rpb24+IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODQ5ID0gIkNIS0oyODQ5IjsgLy8gQ2Fubm90IHZhbGlkYXRlIGNvbXBvbmVudCBpbmhlcml0YW5jZSBvZiBYIGJlY2F1c2UgWSBjYW5ub3QgYmUgcmVmbGVjdGVkLiAvLyROT04tTkxTLTEkCi0JCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg3NSA9ICJDSEtKMjg3NSI7IC8vIEVKQiBDbGllbnQgSkFSIG11c3QgZXhpc3QgYW5kIGJlIGluIHRoZSBzYW1lIEVBUiBhcyB0aGlzIEVKQiBKQVIuIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NTAgPSAiQ0hLSjI4NTAiOyAvLyBDYW5ub3QgdmFsaWRhdGUgPG1ldGhvZD4gYmVjYXVzZSBYLCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4OTUgPSAiQ0hLSjI4OTUiOyAvLyBkdXBsaWNhdGUgPGVqYi1uYW1lPiAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUZpZWxkVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lGaWVsZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2ZjcwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUZpZWxkVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgSUZpZWxkVHlwZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fTUVTU0FHRV9QUkVGSVggPSAiIjsgLy8gRm9yIHRoZSB0d28gZ2V0TWVzc2FnZUlkX1ggbWV0aG9kcywgaWYgdGhlIG1ldGhvZCBuZXZlciByZXF1aXJlcyB0aGF0IHBhcnRpY3VsYXIgbWVzc2FnZSwgcmV0dXJuIHRoaXMgbWVzc2FnZSBwcmVmaXggaW5zdGVhZCAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIGxvbmcgZ2V0SWQoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JSG9tZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JSG9tZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2NTk0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUhvbWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhvbWVUeXBlIGV4dGVuZHMgSUVKQkludGVyZmFjZVR5cGUgewotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0Q29tcG9uZW50SW50ZXJmYWNlKEVudGVycHJpc2VCZWFuIGJlYW4pOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lMb2NhbFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTG9jYWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTBhMDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lMb2NhbFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxvY2FsVHlwZSB7Ci0JcHVibGljIGludCBJU19SRU1PVEUgPSBJRUpCVHlwZS5MT0NBTDsKLQlwdWJsaWMgaW50IE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWSA9IElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HOyAvLyBJZiBhIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24gd2hlbiBpdCBzaG91bGRuJ3QsIHRoYXQncyBhIGRlcHJlY2F0ZWQgdXNlLCBoZW5jZSBhIHdhcm5pbmcuCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4MjNmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGhvbGRzIHRoZSBtZXNzYWdlIGNvbnN0YW50cyB0aGF0IGFyZSBzcGVjaWZpYwotICogdG8gdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIGV4dGVuZHMgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMgewotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQyA9ICIuZWpiMTEiOyAvLyBFSkIgc3BlY2lmaWNhdGlvbiBiZWluZyB2YWxpZGF0ZWQgLy8kTk9OLU5MUy0xJAotCQotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMDEgPSAiQ0hLSjIwMDEiOyAvLyBUaGUga2V5IGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBYIG1ldGhvZC4gIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDAyID0gIkNIS0oyMDAyIjsgLy8gVGhpcyBjbGFzcyBzaG91bGQgaW1wbGVtZW50IGEgbWF0Y2hpbmcgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9yIHRoaXMgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAwNCA9ICJDSEtKMjAwNCI7IC8vIFRoZSBiZWFuIGNsYXNzIHNob3VsZCBub3QgaW1wbGVtZW50IHRoZSBlamJGaW5kIG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMDUgPSAiQ0hLSjIwMDUiOyAvLyBUaGUgbWV0aG9kIG11c3QgYmUgZWl0aGVyIGEgY3JlYXRlIG1ldGhvZCBvciBhIGZpbmQgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAwNiA9ICJDSEtKMjAwNiI7IC8vIFRoZSBiZWFuIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMDcgPSAiQ0hLSjIwMDciOyAvLyBUaGUgYmVhbiBjbGFzcyBzaG91bGQgbm90IGRlY2xhcmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAwOCA9ICJDSEtKMjAwOCI7IC8vIFRoZSBiZWFuIGNsYXNzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWpiQ3JlYXRlIG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMDkgPSAiQ0hLSjIwMDkiOyAvLyBUaGUgYmVhbiBjbGFzcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAxMCA9ICJDSEtKMjAxMCI7IC8vIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNyZWF0ZSBtZXRob2QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDExID0gIkNIS0oyMDExIjsgLy8gVGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDEyID0gIkNIS0oyMDEyIjsgLy8gVGhpcyB0eXBlIG11c3QgYmUgYW4gaW50ZXJmYWNlLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAxMyA9ICJDSEtKMjAxMyI7IC8vIFRoZSBiZWFuIGNsYXNzIG11c3QgaW1wbGVtZW50IFguIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDIwID0gIkNIS0oyMDIwIjsgLy8gVGhlIGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMjEgPSAiQ0hLSjIwMjEiOyAvLyBUaGUga2V5IGNsYXNzIG11c3QgZGVmaW5lIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDI0ID0gIkNIS0oyMDI0IjsgLy8gWCBtdXN0IG5vdCBleGlzdC4gT25seSBjcmVhdGUoKSBtYXkgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDI1ID0gIkNIS0oyMDI1IjsgLy8gWCBtdXN0IG5vdCBleGlzdC4gT25seSBlamJDcmVhdGUoKSBtYXkgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDI2ID0gIkNIS0oyMDI2IjsgLy8gVGhlIGJlYW4gY2xhc3MgbXVzdCBpbXBsZW1lbnQgYSBtYXRjaGluZyBlamJDcmVhdGUgbWV0aG9kIGZvciB0aGlzIG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMjggPSAiQ0hLSjIwMjgiOyAvLyBUaGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzIGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIG1ldGhvZCBpcyBkZWZpbmVkLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAyOSA9ICJDSEtKMjAyOSI7IC8vIFRoaXMgbWV0aG9kIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgYSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIGlzIGRlZmluZWQgb24gdGhlIGhvbWUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDMwID0gIkNIS0oyMDMwIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgZWpiRmluZCBtZXRob2QgaW4gdGhlIGJlYW4gY2xhc3MuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDMyID0gIkNIS0oyMDMyIjsgLy8gQmVhbiBjbGFzcyBYIG11c3QgZGVjbGFyZSBhdCBsZWFzdCBvbmUgY29udGFpbmVyIG1hbmFnZWQgZmllbGQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDMzID0gIkNIS0oyMDMzIjsgLy8gVGhlIHNldEVudGl0eUNvbnRleHQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDM0ID0gIkNIS0oyMDM0IjsgLy8gVGhlIHVuc2V0RW50aXR5Q29udGV4dCBtZXRob2QgbXVzdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMzUgPSAiQ0hLSjIwMzUiOyAvLyBUaGUgZWpiQWN0aXZhdGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDM2ID0gIkNIS0oyMDM2IjsgLy8gVGhlIGVqYlBhc3NpdmF0ZSBtZXRob2QgbXVzdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMzcgPSAiQ0hLSjIwMzciOyAvLyBUaGUgZWpiUmVtb3ZlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAzOCA9ICJDSEtKMjAzOCI7IC8vIFRoZSBlamJMb2FkIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAzOSA9ICJDSEtKMjAzOSI7IC8vIFRoZSBlamJTdG9yZSBtZXRob2QgbXVzdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjEwMCA9ICJDSEtKMjEwMCI7IC8vIEJvdGggZW5kcyBvZiB0aGUgcm9sZSBtdXN0IHVzZSB0aGUgc2FtZSBudW1iZXIgb2YgYXR0cmlidXRlcy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIxMDEgPSAiQ0hLSjIxMDEiOyAvLyBCb3RoIGVuZHMgb2YgdGhlIHJvbGUgbXVzdCB1c2UgdGhlIHNhbWUgdHlwZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIxMDIgPSAiQ0hLSjIxMDIiOyAvLyBFaXRoZXIgYSBmaW5kZXIgZGVzY3JpcHRvciwgb3IgYSBtYXRjaGluZyBjdXN0b20gZmluZGVyIG1ldGhvZCwgbXVzdCBiZSBkZWZpbmVkLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMjAwID0gIkNIS0oyMjAwIjsgLy8gVGhlIHN0YXRpYyBmaWVsZCBtdXN0IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjIwMSA9ICJDSEtKMjIwMSI7IC8vIFRoZSBmaWVsZCBtdXN0IG5vdCBiZSB0cmFuc2llbnQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMjAyID0gIkNIS0oyMjAyIjsgLy8gVGhlIGZpZWxkIHR5cGUgaXMgaW52YWxpZCBmb3IgYSA8Y21wLWZpZWxkPi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIyMDMgPSAiQ0hLSjIyMDMiOyAvLyBUaGUgZmllbGQgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMjA3ID0gIkNIS0oyMjA3IjsgLy8gRmllbGQgWCBvbiBiZWFuIFkgbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIHRoZSA8cHJpbWtleS1maWVsZD4uIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDBfYnVzID0gIkNIS0oyNDAwLmJ1cyI7IC8vIERlcHJlY2F0ZWQgdXNlIG9mIFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDBfZWpiQ3JlYXRlID0gIkNIS0oyNDAwLmVqYkNyZWF0ZSI7IC8vIERlcHJlY2F0ZWQgdXNlIG9mIFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDBfZWpiRmluZCA9ICJDSEtKMjQwMC5lamJGaW5kIjsgLy8gRGVwcmVjYXRlZCB1c2Ugb2YgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwMF9lamJQb3N0Q3JlYXRlID0gIkNIS0oyNDAwLmVqYlBvc3RDcmVhdGUiOyAvLyBEZXByZWNhdGVkIHVzZSBvZiBSZW1vdGVFeGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDAxID0gIkNIS0oyNDAxIjsgLy8gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDUgPSAiQ0hLSjI0MDUiOyAvLyBmaW5kQnlQcmltYXJ5S2V5IG11c3QgaGF2ZSB0aGUgPHByaW0ta2V5LWNsYXNzPiBhcyBpdHMgYXJndW1lbnQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA2ID0gIkNIS0oyNDA2IjsgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgcHJpbWFyeSBrZXkgdHlwZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDhfYnVzID0gIkNIS0oyNDA4LmJ1cyI7IC8vIFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwOF9lamJDcmVhdGUgPSAiQ0hLSjI0MDguZWpiQ3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA4X2VqYkZpbmQgPSAiQ0hLSjI0MDguZWpiRmluZCI7IC8vIFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwOF9lamJQb3N0Q3JlYXRlID0gIkNIS0oyNDA4LmVqYlBvc3RDcmVhdGUiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDlfYnVzID0gIkNIS0oyNDA5LmJ1cyI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwOV9lamJDcmVhdGUgPSAiQ0hLSjI0MDkuZWpiQ3JlYXRlIjsgLy9UaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDlfZWpiRmluZCA9ICJDSEtKMjQwOS5lamJGaW5kIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA5X2VqYlBvc3RDcmVhdGUgPSAiQ0hLSjI0MDkuZWpiUG9zdENyZWF0ZSI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQxMF9idXMgPSAiQ0hLSjI0MTAuYnVzIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQxMF9lamJDcmVhdGUgPSAiQ0hLSjI0MTAuZWpiQ3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQxMF9lamJGaW5kID0gIkNIS0oyNDEwLmVqYkZpbmQiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDEwX2VqYlBvc3RDcmVhdGUgPSAiQ0hLSjI0MTAuZWpiUG9zdENyZWF0ZSI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MTIgPSAiQ0hLSjI0MTIiOyAvLyBUaGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBtZXRob2QgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MTMgPSAiQ0hLSjI0MTMiOyAvLyBUaGUgYXJndW1lbnQgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MTQgPSAiQ0hLSjI0MTQiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGV4Y2VwdGlvbiBYLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQxNSA9ICJDSEtKMjQxNSI7IC8vIFRoZSByZXR1cm4gdHlwZSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQxOCA9ICJDSEtKMjQxOCI7IC8vIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDE5ID0gIkNIS0oyNDE5IjsgLy8gVGhpcyBtZXRob2QgbXVzdCBiZSBhIGNyZWF0ZSBtZXRob2QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDIwID0gIkNIS0oyNDIwIjsgLy8gWCBtdXN0IGJlIHRocm93biBieSB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIGhvbWUgaW50ZXJmYWNlLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQzMiA9ICJDSEtKMjQzMiI7IC8vIFggbXVzdCBiZSB0aHJvd24gYnkgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSByZW1vdGUgaW50ZXJmYWNlLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyOTA4ID0gIkNIS0oyOTA4IjsgLy8gQW4gZW50ZXJwcmlzZSBiZWFuIGNhbm5vdCBiZSByZWZsZWN0ZWQuIFJ1biB0aGUgWE1MIHZhbGlkYXRvci4gLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjBkYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBob2xkcyB0aGUgbWVzc2FnZSBjb25zdGFudHMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlCi0gKiBFSkIgMi4wIHNwZWNpZmljYXRpb24gKGUuZy4gTURCLW9ubHkgbWVzc2FnZXMpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgZXh0ZW5kcyBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cyB7Ci0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDID0gIi5lamIyMCI7IC8vIEVKQiBzcGVjaWZpY2F0aW9uIGJlaW5nIHZhbGlkYXRlZCAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBPTl9CQVNFX1NQRUMgPSBPTl9CQVNFICsgU1BFQzsgCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBPTl9USElTX1NQRUMgPSBPTl9USElTICsgU1BFQzsKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0ogPSBudWxsOyAvLyBQbGFjZWhvbGRlciBmb3IgYSBtZXNzYWdlIGlkIHdoZW4gdGhlIGlkIGhhc24ndCBiZWVuIGNyZWF0ZWQgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDE4ID0gIkNIS0oyMDE4IjsgLy8gVGhpcyBkZXBlbmRlbnQgdmFsdWUgY2xhc3MgbXVzdCBiZSBzZXJpYWxpemFibGUuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwNDMgPSAiQ0hLSjIwNDMiOyAvLyBUaGlzIGRlcGVuZGVudCB2YWx1ZSBjbGFzcyBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwNDQgPSAiQ0hLSjIwNDQiOyAvLyBUaGlzIGRlcGVuZGVudCB2YWx1ZSBjbGFzcyBtdXN0IG5vdCBiZSBhYnN0cmFjdC4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9hY2MgPSAiQ0hLSjIwNTAuYWNjIjsgLy8gQW4gYWNjZXNzb3IgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2NvbnN0ciA9ICJDSEtKMjA1MC5jb25zdHIiOyAvLyBBIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2NyZWF0ZSA9ICJDSEtKMjA1MC5jcmVhdGUiOyAvLyBBIGNyZWF0ZSBtZXRob2QgbXVzdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwNTBfZWpiQWN0aXZhdGUgPSAiQ0hLSjIwNTAuZWpiQWN0aXZhdGUiOyAvLyBUaGUgZWpiQWN0aXZhdGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYkNyZWF0ZSA9ICJDSEtKMjA1MC5lamJDcmVhdGUiOyAvLyBBbiBlamJDcmVhdGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYkZpbmQgPSAiQ0hLSjIwNTAuZWpiRmluZCI7IC8vIEFuIGVqYkZpbmQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXkgPSAiQ0hLSjIwNTAuZWpiRmluZEJ5UHJpbWFyeUtleSI7IC8vIEFuIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYkhvbWUgPSAiQ0hLSjIwNTAuZWpiSG9tZSI7IC8vIEFuIGVqYkhvbWUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYkxvYWQgPSAiQ0hLSjIwNTAuZWpiTG9hZCI7IC8vIEFuIGVqYkxvYWQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYlBhc3NpdmF0ZSA9ICJDSEtKMjA1MC5lamJQYXNzaXZhdGUiOyAvLyBBbiBlamJQYXNzaXZhdGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYlBvc3RDcmVhdGUgPSAiQ0hLSjIwNTAuZWpiUG9zdENyZWF0ZSI7IC8vIEFuIGVqYlBvc3RDcmVhdGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYlJlbW92ZSA9ICJDSEtKMjA1MC5lamJSZW1vdmUiOyAvLyBBbiBlamJSZW1vdmUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYlNlbGVjdCA9ICJDSEtKMjA1MC5lamJTZWxlY3QiOyAvLyBBbiBlamJTZWxlY3QgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYlN0b3JlID0gIkNIS0oyMDUwLmVqYlN0b3JlIjsgLy8gQW4gZWpiU3RvcmUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VxdWFscyA9ICJDSEtKMjA1MC5lcXVhbHMiOyAvLyBBbiBlcXVhbHMgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2ZpbmQgPSAiQ0hLSjIwNTAuZmluZCI7IC8vIEFuIGZpbmQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXkgPSAiQ0hLSjIwNTAuZmluZEJ5UHJpbWFyeUtleSI7IC8vIEFuIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2hhc2hDb2RlID0gIkNIS0oyMDUwLmhhc2hDb2RlIjsgLy8gQW4gaGFzaENvZGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2hvbWUgPSAiQ0hLSjIwNTAuaG9tZSI7IC8vIEFuIGhvbWUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX29uTWVzc2FnZSA9ICJDSEtKMjA1MC5vbk1lc3NhZ2UiOyAvLyBBbiBvbk1lc3NhZ2UgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX3NldEVudGl0eUNvbnRleHQgPSAiQ0hLSjIwNTAuc2V0RW50aXR5Q29udGV4dCI7IC8vIEFuIHNldEVudGl0eUNvbnRleHQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dCA9ICJDSEtKMjA1MC51bnNldEVudGl0eUNvbnRleHQiOyAvLyBBbiB1bnNldEVudGl0eUNvbnRleHQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDQgPSAiQ0hLSjI0MDQiOyAvLyBBcHBsaWNhdGlvbiBleGNlcHRpb24gWCBtdXN0IGV4dGVuZCBqYXZhLmxhbmcuRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDE2ID0gIkNIS0oyNDE2IjsgLy8gQXBwbGljYXRpb24gZXhjZXB0aW9uIFggbXVzdCBub3QgZXh0ZW5kIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQyMSA9ICJDSEtKMjQyMSI7IC8vIGVqYkNyZWF0ZSBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MjIgPSAiQ0hLSjI0MjIiOyAvLyBlamJDcmVhdGUgbXVzdCBub3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDIzID0gIkNIS0oyNDIzIjsgLy8gZWpiQ3JlYXRlIG11c3Qgbm90IGJlIHN0YXRpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MjQgPSAiQ0hLSjI0MjQiOyAvLyBlamJDcmVhdGUgbXVzdCByZXR1cm4gdm9pZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MjYgPSAiQ0hLSjI0MjYiOyAvLyBlamJQb3N0Q3JlYXRlIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQyNyA9ICJDSEtKMjQyNyI7IC8vIGVqYlBvc3RDcmVhdGUgbXVzdCBub3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDI4ID0gIkNIS0oyNDI4IjsgLy8gZWpiUG9zdENyZWF0ZSBtdXN0IG5vdCBiZSBzdGF0aWMuIC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDMwID0gIkNIS0oyNDMwIjsgLy8gWCBtdXN0IGV4aXN0IGZvciB0aGlzIGVqYkhvbWUgbWV0aG9kIHRvIGJlIGNhbGxlZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MzEgPSAiQ0hLSjI0MzEiOyAvLyBlamJIb21lIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQzOSA9ICJDSEtKMjQzOSI7IC8vIGVqYkhvbWUgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ0MSA9ICJDSEtKMjQ0MSI7IC8vIGJ1c2luZXNzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NDIgPSAiQ0hLSjI0NDIiOyAvLyBidXNpbmVzcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDQzID0gIkNIS0oyNDQzIjsgLy8gYnVzaW5lc3MgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NDUgPSAiQ0hLSjI0NDUiOyAvLyBvbk1lc3NhZ2UgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDQ2ID0gIkNIS0oyNDQ2IjsgLy8gb25NZXNzYWdlIG11c3Qgbm90IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ0NyA9ICJDSEtKMjQ0NyI7IC8vIG9uTWVzc2FnZSBtdXN0IG5vdCBiZSBzdGF0aWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDQ5ID0gIkNIS0oyNDQ5IjsgLy8gYWNjZXNzb3IgbWV0aG9kIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ1MCA9ICJDSEtKMjQ1MCI7IC8vIGFjY2Vzc29yIG1ldGhvZCBtdXN0IGJlIGFic3RyYWN0IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDUyID0gIkNIS0oyNDUyIjsgLy8gQSB0cmFuc2llbnQgZmllbGQgc2hvdWxkIG5vdCBiZSB0aGUgezB9IHR5cGUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDUzID0gIkNIS0oyNDUzIjsgLy8gVHJhbnNpZW50IGZpZWxkcyBhcmUgZGlzY291cmFnZWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDU0ID0gIkNIS0oyNDU0IjsgLy8gQ01SIGFuZCBDTVAgZmllbGRzIG11c3Qgbm90IGJlIGRlZmluZWQgb24gdGhlIGJlYW4gY2xhc3MuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDU3ID0gIkNIS0oyNDU3IjsgLy8gZWpiRmluZCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NTggPSAiQ0hLSjI0NTgiOyAvLyBlamJGaW5kIG11c3Qgbm90IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ1OSA9ICJDSEtKMjQ1OSI7IC8vIGVqYkZpbmQgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2MSA9ICJDSEtKMjQ2MSI7IC8vIFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciBpbnRlcmZhY2VzLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2MiA9ICJDSEtKMjQ2MiI7IC8vIFRoZSBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2MyA9ICJDSEtKMjQ2MyI7IC8vIFRoZSBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NjQgPSAiQ0hLSjI0NjQiOyAvLyBUaGUgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2NSA9ICJDSEtKMjQ2NSI7IC8vIGhvbWUgbWV0aG9kIFggbXVzdCB0aHJvdyBZIGZvciBaLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2NiA9ICJDSEtKMjQ2NiI7IC8vIHJlbW90ZSBob21lIG1ldGhvZCBYIG11c3Qgbm90IGV4cG9zZSB0aGUgWSB0eXBlLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2NyA9ICJDSEtKMjQ2NyI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgQ3JlYXRlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2OCA9ICJDSEtKMjQ2OCI7IC8vIFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NjkgPSAiQ0hLSjI0NjkiOyAvLyBUaGlzIG1ldGhvZCAoRUpCT2JqZWN0IG9yIEVKQkxvY2FsT2JqZWN0KSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyLiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3MCA9ICJDSEtKMjQ3MCI7IC8vIFRoaXMgY29tcG9uZW50IG1hdGNoaW5nIG1ldGhvZCBtdXN0IHJldHVybiBYLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3MSA9ICJDSEtKMjQ3MSI7IC8vIFRoaXMgY29tcG9uZW50IG1hdGNoaW5nIG1ldGhvZCBtdXN0IHRocm93IFguIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDcyID0gIkNIS0oyNDcyIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgcGFzcyBYIGFzIGFuIGFyZ3VtZW50IG9yIHJlc3VsdCB0eXBlLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3MyA9ICJDSEtKMjQ3MyI7IC8vIFRoaXMgKENNUikgbWV0aG9kIG11c3Qgbm90IGJlIGV4cG9zZWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDc0ID0gIkNIS0oyNDc0IjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIFguIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDc1ID0gIkNIS0oyNDc1IjsgLy8gZmluZEJ5UHJpbWFyeUtleSdzIGFyZ3VtZW50IG11c3QgYmUgdGhlIHByaW1hcnkga2V5LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3NiA9ICJDSEtKMjQ3NiI7IC8vIFRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIGNyZWF0ZS9lamJDcmVhdGUgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3NyA9ICJDSEtKMjQ3NyI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgRmluZGVyRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3OCA9ICJDSEtKMjQ3OCI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3OSA9ICJDSEtKMjQ3OSI7IC8vIGZpbmRCeVByaW1hcnlLZXkgbXVzdCByZXR1cm4gWC4gLy8kTk9OLU5MUy0xJAotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODAgPSAiQ0hLSjI0ODAiOyAvLyBDTVAvQ01SIGZpZWxkIG5hbWUgbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlci4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODEgPSAiQ0hLSjI0ODEiOyAvLyBmaWVsZCBYIG11c3QgYmUgYSA8Y21wLWZpZWxkPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ4MiA9ICJDSEtKMjQ4MiI7IC8vIGZpZWxkIFggbXVzdCBiZSBhIDxjbXItZmllbGQ+IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDgzID0gIkNIS0oyNDgzIjsgLy8gQ01QL0NNUiBmaWVsZCBzaG91bGQgbm90IGJlIGV4cG9zZWQgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODQgPSAiQ0hLSjI0ODQiOyAvLyBDTVAvQ01SIGZpZWxkIG11c3QgYmUgZWl0aGVyIGEgcHJpbWl0aXZlIG9yIGEgc2VyaWFsaXphYmxlIHR5cGUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDg1ID0gIkNIS0oyNDg1IjsgLy8gZWpiU2VsZWN0IG1ldGhvZCBtdXN0IGJlIGFic3RyYWN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ4NiA9ICJDSEtKMjQ4NiI7IC8vIGVqYlNlbGVjdCBtdXN0IHJldHVybiBYIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ4NyA9ICJDSEtKMjQ4NyI7IC8vIGVqYlNlbGVjdCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODggPSAiQ0hLSjI0ODgiOyAvLyBlamJTZWxlY3QgbXVzdCB0aHJvdyBGaW5kZXJFeGNlcHRpb24gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODkgPSAiQ0hLSjI0ODkiOyAvLyBGaWVsZCBtdXN0IGJlIHRoZSBwcmltYXJ5IGtleSB0eXBlLiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ5MCA9ICJDSEtKMjQ5MCI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGV4cG9zZWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDkyID0gIkNIS0oyNDkyIjsgLy8gZWpiUmVtb3ZlIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ5MyA9ICJDSEtKMjQ5MyI7IC8vIGVqYlJlbW92ZSBtdXN0IG5vdCBiZSBmaW5hbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0OTQgPSAiQ0hLSjI0OTQiOyAvLyBlamJSZW1vdmUgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ5NSA9ICJDSEtKMjQ5NSI7IC8vIFRoaXMgZmluZCBtZXRob2QgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ5NiA9ICJDSEtKMjQ5NiI7IC8vIFRoaXMgZWpiU2VsZWN0IG1ldGhvZCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDk3ID0gIkNIS0oyNDk3IjsgLy8gZWpiQ3JlYXRlIG11c3QgdGhyb3cgQ3JlYXRlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAwX2VqYkNyZWF0ZSA9ICJDSEtKMjUwMC5lamJDcmVhdGUiOyAvLyBYIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAwX2VqYkhvbWUgPSAiQ0hLSjI1MDAuZWpiSG9tZSI7IC8vIFggbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDBfZWpiRmluZCA9ICJDSEtKMjUwMC5lamJGaW5kIjsgLy8gWCBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwMF9idXNpbmVzcyA9ICJDSEtKMjUwMC5idXMiOyAvLyBYIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAwX2hvbWUgPSAiQ0hLSjI1MDAuaG9tZSI7IC8vIFggbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDBfY3JlYXRlID0gIkNIS0oyNTAwLmNyZWF0ZSI7IC8vIFggbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDBfZmluZCA9ICJDSEtKMjUwMC5maW5kIjsgLy8gWCBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAxX2VqYkNyZWF0ZSA9ICJDSEtKMjUwMS5lamJDcmVhdGUiOyAvLyBlamJDcmVhdGUgbXVzdCBub3QgdGhyb3cgYXBwbGljYXRpb24gZXhjZXB0aW9ucy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDFfZWpiUmVtb3ZlID0gIkNIS0oyNTAxLmVqYlJlbW92ZSI7IC8vIGVqYlJlbW92ZSBtdXN0IG5vdCB0aHJvdyBhcHBsaWNhdGlvbiBleGNlcHRpb25zLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwMV9vbk1lc3NhZ2UgPSAiQ0hLSjI1MDEub25NZXNzYWdlIjsgLy8gZWpiUmVtb3ZlIG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDJfZWpiRmluZCA9ICJDSEtKMjUwMi5lamJGaW5kIjsgLy8gZWpiRmluZCBtdXN0IG5vdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDJfZWpiU2VsZWN0ID0gIkNIS0oyNTAyLmVqYlNlbGVjdCI7IC8vIGVqYlNlbGVjdCBtdXN0IG5vdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDJfZmluYWxpemUgPSAiQ0hLSjI1MDIuZmluYWxpemUiOyAvLyBmaW5hbGl6ZSBtdXN0IG5vdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDIgPSAiQ0hLSjI1MDIiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdC4gIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDNfYnVzID0gIkNIS0oyNTAzLmJ1cyI7IC8vIFRoZSBidXNpbmVzcyBtZXRob2QgbXVzdCB0aHJvdy9ub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwM19jcmVhdGUgPSAiQ0hLSjI1MDMuY3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCB0aHJvdy9ub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwM19lamJDcmVhdGUgPSAiQ0hLSjI1MDMuZWpiQ3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCB0aHJvdy9ub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwM19lamJGaW5kID0gIkNIS0oyNTAzLmVqYkZpbmQiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHRocm93L25vdCB0aHJvdyBSZW1vdGVFeGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAzX2VqYkhvbWUgPSAiQ0hLSjI1MDMuZWpiSG9tZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cvbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDNfZWpiUG9zdENyZWF0ZSA9ICJDSEtKMjUwMy5lamJQb3N0Q3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCB0aHJvdy9ub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwM19maW5kID0gIkNIS0oyNTAzLmZpbmQiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHRocm93L25vdCB0aHJvdyBSZW1vdGVFeGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAzX2hvbWUgPSAiQ0hLSjI1MDMuaG9tZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cvbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDNfb25NZXNzYWdlID0gIkNIS0oyNTAzLm9uTWVzc2FnZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cvbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwNF9idXNpbmVzcyA9ICJDSEtKMjUwNC5idXNpbmVzcyI7IC8vIFRoZSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB0aGUgYmVhbiBjbGFzcy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDRfY3JlYXRlID0gIkNIS0oyNTA0LmNyZWF0ZSI7IC8vIFRoZSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB0aGUgYmVhbiBjbGFzcy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDRfZmluZCA9ICJDSEtKMjUwNC5maW5kIjsgLy8gVGhlIG1hdGNoaW5nIG1ldGhvZCBtdXN0IGV4aXN0IG9uIHRoZSBiZWFuIGNsYXNzLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwNF9ob21lID0gIkNIS0oyNTA0LmhvbWUiOyAvLyBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gdGhlIGJlYW4gY2xhc3MuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDVfZWpiUG9zdENyZWF0ZSA9ICJDSEtKMjUwNS5lamJQb3N0Q3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDVfb25NZXNzYWdlID0gIkNIS0oyNTA1Lm9uTWVzc2FnZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTA1X2VqYlJlbW92ZSA9ICJDSEtKMjUwNS5lamJSZW1vdmUiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODAwX05BTUVEID0gIkNIS0oyODAwLm5hbWVkIjsgLy8gPGxvY2FsPiBjYW5ub3QgYmUgcmVmbGVjdGVkLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwMF9VTk5BTUVEID0gIkNIS0oyODAwLnVubmFtZWQiOyAvLyA8bG9jYWw+IG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODA1X05BTUVEID0gIkNIS0oyODA1Lm5hbWVkIjsgLy8gPGxvY2FsLWhvbWU+IGNhbm5vdCBiZSByZWZsZWN0ZWQgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDVfVU5OQU1FRCA9ICJDSEtKMjgwNS51bm5hbWVkIjsgLy8gPGxvY2FsLWhvbWU+IG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODEzID0gIkNIS0oyODEzIjsgLy8gPGVqYi1uYW1lPiBYIG11c3QgYmUgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODE2ID0gIkNIS0oyODE2IjsgLy8gPGVqYi1yZWxhdGlvbi1uYW1lPiBtdXN0IGJlIHVuaXF1ZSBpbiBlamItamFyLnhtbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MTcgPSAiQ0hLSjI4MTciOyAvLyA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+IG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiA8ZWpiLXJlbGF0aW9uPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxOCA9ICJDSEtKMjgxOCI7IC8vIFRoZSB2YWx1ZSBvZiB0aGUgPG11bHRpcGxpY2l0eT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiT25lIiBvciAiTWFueSIgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MTkgPSAiQ0hLSjI4MTkiOyAvLyA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+IHswfSBtdXN0IGJlIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODIxID0gIkNIS0oyODIxIjsgLy8gPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4gezB9IG11c3QgZXhpc3QgaW4gdGhlIG1vZHVsZSAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODQ4ID0gIkNIS0oyODQ4IjsgLy8gPGNhc2NhZGUtZGVsZXRlPiBtdXN0IGJlIHVzZWQgd2l0aCBhIDxtdWx0aXBsaWNpdHk+IG9mICJPbmUiIC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODU0ID0gIkNIS0oyODU0IjsgLy8gPGFic3RyYWN0LXNjaGVtYS1uYW1lPiB7MH0gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyLnhtbCBmaWxlIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODU1ID0gIkNIS0oyODU1IjsgLy8gPGNtcC1maWVsZD4gezB9IG11c3QgYmUgYSBKYXZhIHByaW1pdGl2ZSBvciBhIEphdmEgc2VyaWFsaXphYmxlIHR5cGUgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NTYgPSAiQ0hLSjI4NTYiOyAvLyA8Y21yLWZpZWxkPiB7MH0gbXVzdCBiZSB0aGUgezF9IHR5cGUgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NTcgPSAiQ0hLSjI4NTciOyAvLyA8Y21yLWZpZWxkPiB7MH0gbXVzdCBiZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBhbmQgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NTggPSAiQ0hLSjI4NTgiOyAvLyA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+IG11c3QgZXhpc3QgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NTkgPSAiQ0hLSjI4NTkiOyAvLyBSZXNlcnZlZCBpZGVudGlmaWVyIHswfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiA8ZWpiLW5hbWU+IC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODYwID0gIkNIS0oyODYwIjsgLy8gUmVzZXJ2ZWQgaWRlbnRpZmllciB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYW4gPGFic3RyYWN0LXNjaGVtYS1uYW1lPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg2NiA9ICJDSEtKMjg2NiI7IC8vIDxjbXItZmllbGQ+IHswfSBtdXN0IGJlIGRlZmluZWQgb24gezF9IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODY3ID0gIkNIS0oyODY3IjsgLy8gVGhpcyBiZWFuIGNhbiBoYXZlIG9ubHkgdW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0byBvdGhlciBiZWFucyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg2OCA9ICJDSEtKMjg2OCI7IC8vIFRoZSB2YWx1ZSBvZiB0aGUgPGNtci1maWVsZC10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIgb3IgImphdmEudXRpbC5TZXQiIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODY5ID0gIkNIS0oyODY5IjsgLy8gQXQgbGVhc3Qgb25lIDxlamItcmVsYXRpb25zaGlwLXJvbGU+IG11c3QgZGVmaW5lIGEgPGNtci1maWVsZD4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg3MCA9ICJDSEtKMjg3MCI7IC8vIDxlamItbmFtZT4gezB9IG11c3QgZXhpc3QgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NzEgPSAiQ0hLSjI4NzEiOyAvLyA8ZWpiLW5hbWU+IHswfSBtdXN0IHJlZmVyIHRvIGEgQ01QIGJlYW4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NzIgPSAiQ0hLSjI4NzIiOyAvLyBUaGUgdmFsdWUgb2YgdGhlIDxjbXAtdmVyc2lvbj4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiMS54IiBvciAiMi54IiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg3MyA9ICJDSEtKMjg3MyI7IC8vIE1pZ3JhdGUgdGhpcyBiZWFuJ3MgZGF0YXNvdXJjZSBiaW5kaW5nIHRvIGEgQ01QIENvbm5lY3Rpb24gRmFjdG9yeSBiaW5kaW5nLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg3NCA9ICJDSEtKMjg3NCI7IC8vIE1pZ3JhdGUgdGhpcyBFSkIgbW9kdWxlJ3MgZGVmYXVsdCBkYXRhc291cmNlIGJpbmRpbmcgdG8gYSBkZWZhdWx0IENNUCBDb25uZWN0aW9uIEZhY3RvcnkgYmluZGluZy4gLy8kTk9OLU5MUy0xJAotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4ODAgPSAiQ0hLSjI4ODAiOyAvLyBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGxvY2FsLWhvbWU+IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODgxID0gIkNIS0oyODgxIjsgLy8gVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxob21lPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg4MiA9ICJDSEtKMjg4MiI7IC8vIFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8bG9jYWw+IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODgzID0gIkNIS0oyODgzIjsgLy8gVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxyZW1vdGU+IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODg0ID0gIkNIS0oyODg0IjsgLy8gVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSA8bG9jYWwtaG9tZT4gb3IgYSA8aG9tZT4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4ODUgPSAiQ0hLSjI4ODUiOyAvLyBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGVpdGhlciBhIDxsb2NhbD4gb3IgYSA8cmVtb3RlPiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg4NiA9ICJDSEtKMjg4Ni5lamIyMSI7IC8vIER1cGxpY2F0ZSBhY3RpdmF0aW9uIGNvbmZpZzogInswfSIgZXhpc3QgaW4gbWVzc2FnZSBkcnZpZW4gYmVhbjogInsxfSIgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4ODcgPSAiQ0hLSjI4ODcuZWpiMjEiOyAvLyBUaGUgYWN0aXZhdGlvbiBjb25maWcgd2l0aCBuYW1lIDogInswfSIgaGFzIGludmFsaWQgdmFsdWUgOiAiMSIgZm9yIG1lc3NhZ2UgZHJ2aWVuIGJlYW46ICJ7Mn0iIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODg4ID0gIkNIS0oyODg4LmVqYjIxIjsgLy8gVGhlIGFjdGl2YXRpb24gY29uZmlnOiAiezB9IiBjYW4gb25seSBleGlzdCBmb3IgYSBkZXN0aW5hdGlvbiB0eXBlOiAiezF9IiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg4OSA9ICJDSEtKMjg4OS5lamIyMSI7IC8vIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGlzIG5vdCBzZXQgZm9yIGJlYW46ICJ7MH0iIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODkwID0gIkNIS0oyODkwLmVqYjIxIjsgLy8gVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZSAiezB9IiBhbmQgZGVzdGluYXRpb24gdHlwZSBhY3RpdmF0aW9uIGNvbmZpZyBwcm9wZXJ0eSB2YWx1ZSAiezF9IiBkbyBub3QgbWF0Y2ggIGZvciBiZWFuOiAiezJ9IiAvLyROT04tTkxTLTEkCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXRob2RBbmRGaWVsZENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXRob2RBbmRGaWVsZENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDc2ZjFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWV0aG9kQW5kRmllbGRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RBbmRGaWVsZENvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE5PX01FVEhPRFMgPSAweDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVYQ0xVREVEX01FVEhPRCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXI7IC8vIDB4MSAoMSkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRVhDTFVERURfRklFTEQgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vIDB4MiAoMikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgT1RIRVJfRklFTEQgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vIDB4NCAoNCkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNDRVNTT1IgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg4ICg4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBCVVNJTkVTUyA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDEwICgxNikKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBDTElOSVQgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgyMCAoMzIpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIENPTlNUUlVDVE9SID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4NDAgKDY0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBDT05TVFJVQ1RPUl9OT1BBUk0gPSAgQ09OU1RSVUNUT1IgfCAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vIDB4NDB8MHg4MCAoMTkyKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBDUkVBVEUgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgxMDAgKDI1NikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQ1JFQVRFX05PUEFSTSA9IENSRUFURSB8IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgIC8vMHgxMDB8MHgyMDAgKDc2OCkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCQUNUSVZBVEVfTk9QQVJNID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4NDAwICgxMDI0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJDUkVBVEUgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg4MDAgKDIwNDgpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQkNSRUFURV9OT1BBUk0gPSBFSkJDUkVBVEUgfCAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7Ly8weDgwMHwweDEwMDAgKDYxNDQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQkZJTkQgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7ICAvLzB4MjAwMCAoODE5MikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCRklOREJZUFJJTUFSWUtFWSA9IEVKQkZJTkQgfCAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgyMDAwfDB4NDAwMCAoMjQ1NzYpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQkhPTUUgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg4MDAwICgzMjc2OCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCTE9BRF9OT1BBUk0gPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgxMDAwMCAoNjU1MzYpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQlBBU1NJVkFURV9OT1BBUk0gPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgyMDAwMCAoMTMxLDA3MikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCUE9TVENSRUFURSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDQwMDAwICgyNjIsMTQ0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJSRU1PVkVfTk9QQVJNID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4ODAwMDAgKDUyNCwyODgpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQlNFTEVDVCA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDEwMDAwMCAoMSwwNDgsNTc2KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJTVE9SRV9OT1BBUk0gPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7Ly8weDIwMDAwMCAoMiwwOTcsMTUyKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFUVVBTFMgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7ICAvLzB4NDAwMDAwICg0LDE5NCwzMDQpCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZJTkQgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg4MDAwMDAgKDgsMzg4LDYwOCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRklOREJZUFJJTUFSWUtFWSA9IEZJTkQgfCAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgxMDAwMDAwICgyNSwxNjUsODI0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBGSU5BTElaRV9OT1BBUk0gPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgyMDAwMDAwICgzMyw1NTQsNDMyKQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBIQVNIQ09ERV9OT1BBUk0gPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg0MDAwMDAwICg2NywxMDgsODY0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBIRUxQRVIgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg4MDAwMDAwICgxMzQsMjE3LDcyOCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSE9NRSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDEwMDAwMDAwICgyNjgsNDM1LDQ1NikKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgT05NRVNTQUdFID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MjAwMDAwMDAgKDUzNiw4NzAsOTEyKQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTRVJJQUxWRVJTSU9OVUlEID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4NDAwMDAwMDAgKDEsMDczLDc0MSw4MjQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFNFVFNFU1NJT05DT05URVhUID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4ODAwMDAwMDAgKDIsMTQ3LDQ4Myw2NDgpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFNFVEVOVElUWUNPTlRFWFQgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgxMDAwMDAwMDAgKDQsMjk0LDk2NywyOTYpCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFVOU0VURU5USVRZQ09OVEVYVF9OT1BBUk0gPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgyMDAwMDAwMDAgKDgsNTg5LDkzNCw1OTIpCi0JCi0KLQkvLyBwcmVmaXhlcyBvZiBzb21lIG1ldGhvZCBuYW1lcwotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0MgPSAiYyI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FSkIgPSAiZWpiIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VKQkMgPSAiZWpiQyI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FSkJGID0gImVqYkYiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRUpCRklORCA9ICJlamJGaW5kIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VKQkhPTUUgPSAiZWpiSG9tZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FSkJTRUxFQ1QgPSAiZWpiU2VsZWN0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0YgPSAiZiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9GSU5EID0gImZpbmQiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfR0VUID0gImdldCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9TRUxFQ1QgPSAic2VsZWN0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1NFVCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBtZXRob2QgbmFtZXMJCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0NSRUFURSA9ICJjcmVhdGUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0VKQkFDVElWQVRFID0gImVqYkFjdGl2YXRlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9FSkJDUkVBVEUgPSAiZWpiQ3JlYXRlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9FSkJGSU5EQllQUklNQVJZS0VZID0gImVqYkZpbmRCeVByaW1hcnlLZXkiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0VKQkxPQUQgPSAiZWpiTG9hZCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfRUpCUEFTU0lWQVRFID0gImVqYlBhc3NpdmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfRUpCUE9TVENSRUFURSA9ICJlamJQb3N0Q3JlYXRlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9FSkJSRU1PVkUgPSAiZWpiUmVtb3ZlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9FSkJTVE9SRSA9ICJlamJTdG9yZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfRVFVQUxTID0gImVxdWFscyI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfRklOQUxJWkUgPSAiZmluYWxpemUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0ZJTkRCWVBSSU1BUllLRVkgPSAiZmluZEJ5UHJpbWFyeUtleSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfSEFTSENPREUgPSAiaGFzaENvZGUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX09OTUVTU0FHRSA9ICJvbk1lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX1JFTU9WRSA9ICJyZW1vdmUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX1NFVFNFU1NJT05DT05URVhUID0gInNldFNlc3Npb25Db250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9TRVRFTlRJVFlDT05URVhUID0gInNldEVudGl0eUNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX1VOU0VURU5USVRZQ09OVEVYVCA9ICJ1bnNldEVudGl0eUNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gZmllbGQgbmFtZXMKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxETkFNRV9TRVJJQUxWRVJTSU9OVUlEID0gInNlcmlhbFZlcnNpb25VSUQiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gRm9yIHN1YnN0aXR1dGlvbiBpbnRvIHN0cmluZ3MKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRFNJR05BVFVSRV9FUVVBTFMgPSAiZXF1YWxzKGphdmEubGFuZy5PYmplY3QpIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EU0lHTkFUVVJFX0hBU0hDT0RFID0gImhhc2hDb2RlKCkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1ldGhvZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWV0aG9kVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDAzMWFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWV0aG9kVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0gCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIElNZXRob2RUeXBlIHsKLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKTsKLQotCXB1YmxpYyBsb25nIGdldElkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBtZXRob2QgdHlwZSBpcyBhIGRlZmF1bHQgdHlwZSBmb3IgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgY2xhc3MuCi0JICogRm9yIGV4YW1wbGUsIGlmIHRoZSBtZXRob2Qgb24gdGhlIGhvbWUgaXMgbmVpdGhlciBhIGNyZWF0ZSBub3IgYSBmaW5kIG1ldGhvZCwgdGhlbgotCSAqIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIGRlZmF1bHQgdHlwZSwgYSBob21lIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCk7IC8vIHJlcXVpcmVkIG1ldGhvZCBpcyBtaXNzaW5nCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpOyAvLyBtZXRob2Qgc2hvdWxkIG5vdCBleGlzdAotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKTsgLy8gbWV0aG9kIHRocm93cyAob3IgZG9lc24ndCB0aHJvdykgUmVtb3RlRXhjZXB0aW9uCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpOyAvLyBtZXRob2QgaXMgbWlzc2luZyBpdHMgbWF0Y2hpbmcgbWV0aG9kIG9uIHRoZSBiZWFuIGNsYXNzCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpOyAvLyBwYXJhbWV0ZXIgb3IgcmV0dXJuIHR5cGUgaXMgbm90IGEgbGVnYWwgUk1JLUlJT1AgdHlwZQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lSZW1vdGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVJlbW90ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiNTM4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVJlbW90ZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbW90ZVR5cGUgewotCXB1YmxpYyBpbnQgSVNfUkVNT1RFID0gSUVKQlR5cGUuUkVNT1RFOwotCXB1YmxpYyBpbnQgTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZID0gSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SOyAvLyBJZiBhIG1ldGhvZCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBpdCBzaG91bGQsIFJNSUMgYmxvd3MgdXAsIGhlbmNlIHRoaXMgc2l0dWF0aW9uIGlzIGFuIGVycm9yLgotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lUeXBlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVR5cGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2Njg4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVR5cGVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElUeXBlQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGxvbmcgTk9fU1VQRVJUWVBFID0gMHgwOwotCQotCXB1YmxpYyBzdGF0aWMgbG9uZyBMT0NBTF9DT01QT05FTlRfSU5URVJGQUNFID0gQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyOyAvLyAweDEgKDEpCi0JcHVibGljIHN0YXRpYyBsb25nIFJFTU9URV9DT01QT05FTlRfSU5URVJGQUNFID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7IC8vIDB4MiAoMikKLQkKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfRUpCX0VOVElUWUJFQU4gPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsgLy8gMHg0ICg0KQotCXB1YmxpYyBzdGF0aWMgbG9uZyBKQVZBWF9FSkJfRUpCTE9DQUxIT01FID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7IC8vMHg4ICg4KQotCXB1YmxpYyBzdGF0aWMgbG9uZyBKQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1QgPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsvLzB4MTAgKDE2KQotCXB1YmxpYyBzdGF0aWMgbG9uZyBKQVZBWF9FSkJfRUpCSE9NRSA9IChDbGFzc1V0aWxpdHkuc3VwZXJ0eXBlX2NvdW50ZXIgPDw9IDEpOyAvLzB4MjAgKDMyKQotCXB1YmxpYyBzdGF0aWMgbG9uZyBKQVZBWF9FSkJfRUpCT0JKRUNUID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7IC8vMHg0MCAoNjQpCi0JCi0JcHVibGljIHN0YXRpYyBsb25nIEpBVkFfTEFOR19PQkpFQ1QgPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsvLzB4ODAgKDEyOCkKLQkKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7IC8vMHgxMDAgKDI1NikKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUiA9IChDbGFzc1V0aWxpdHkuc3VwZXJ0eXBlX2NvdW50ZXIgPDw9IDEpOyAgLy8weDIwMCAoNTEyKQotCQotCXB1YmxpYyBzdGF0aWMgbG9uZyBKQVZBWF9FSkJfU0VTU0lPTkJFQU4gPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsgLy8weDQwMCAoMTAyNCkKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT04gPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsgLy8gMHg4MDAgKDIwNDgpCi0JCi0JLy8gcHJpbWl0aXZlIHR5cGVzCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEID0gInZvaWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gY2xhc3MgYW5kIGludGVyZmFjZSB0eXBlcwotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFfSU9fSU9FWENFUFRJT04gPSAiamF2YS5pby5JT0V4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX0lPX1NFUklBTElaQUJMRSA9ICJqYXZhLmlvLlNlcmlhbGl6YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNUID0gImphdmEubGFuZy5PYmplY3QiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQV9MQU5HX0VYQ0VQVElPTiA9ICJqYXZhLmxhbmcuRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFfTEFOR19SVU5USU1FRVhDRVBUSU9OID0gImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URSA9ICJqYXZhLnJtaS5SZW1vdGUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFRVhDRVBUSU9OID0gImphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX1VUSUxfQ09MTEVDVElPTiA9ICJqYXZhLnV0aWwuQ29sbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX1VUSUxfRU5VTUVSQVRJT04gPSAiamF2YS51dGlsLkVudW1lcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFfVVRJTF9TRVQgPSAiamF2YS51dGlsLlNldCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfQ1JFQVRFRVhDRVBUSU9OID0gImphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX0VOVElUWUJFQU4gPSAiamF2YXguZWpiLkVudGl0eUJlYW4iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX0VKQkVYQ0VQVElPTiA9ICJqYXZheC5lamIuRUpCRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJIT01FID0gImphdmF4LmVqYi5FSkJIb21lIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTEhPTUUgPSAiamF2YXguZWpiLkVKQkxvY2FsSG9tZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfRUpCT0JKRUNUID0gImphdmF4LmVqYi5FSkJPYmplY3QiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUID0gImphdmF4LmVqYi5FSkJMb2NhbE9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfRU5USVRZQ09OVEVYVCA9ICJqYXZheC5lamIuRW50aXR5Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfRklOREVSRVhDRVBUSU9OID0gImphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOID0gImphdmF4LmVqYi5NZXNzYWdlRHJpdmVuQmVhbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfT0JKRUNUTk9URk9VTkRFWENFUFRJT04gPSAiamF2YXguZWpiLk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQkVBTiA9ICJqYXZheC5lamIuU2Vzc2lvbkJlYW4iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05DT05URVhUID0gImphdmF4LmVqYi5TZXNzaW9uQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTiA9ICJqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9KTVNfTUVTU0FHRSA9ICJqYXZheC5qbXMuTWVzc2FnZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSID0gImphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfVFJBTlNBQ1RJT05fVVNFUlRSQU5TQUNUSU9OID0gImphdmF4LnRyYW5zYWN0aW9uLlVzZXJUcmFuc2FjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX05BTUlOR19DT05URVhUID0gImphdmF4Lm5hbWluZy5Db250ZXh0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lWYWxpZGF0aW9uUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lWYWxpZGF0aW9uUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTRhMTg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JVmFsaWRhdGlvblJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci0KLQotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdGlvblJ1bGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgcnVsZS4gR2l2ZW4gdGhpcyBpZCwgdGhpcyBydWxlIGNhbiBiZSBsb2FkZWQgZnJvbQotCSAqIHRoZSBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldElkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWRzIG9mIHRoZSBydWxlcyB3aGljaCB0aGlzIHJ1bGUgZGVwZW5kcyBvbi4gKFRoYXQgaXMsCi0JICogaWYgb25lIG9mIHRoZXNlIHJ1bGVzIHJ1bnMsIHRoZW4gdGhpcyBydWxlIG5lZWRzIHRvIGJlIHJ1bi4pCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldERlcGVuZHNPbigpOwotCQotCS8qKgotCSAqIEFkZCBhIHZhbGlkYXRpb24gcnVsZSB3aGljaCBuZWVkcyB0byBiZSBub3RpZmllZCB3aGVuIHRoaXMgcnVsZSBpcyBydW4uCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGVwZW5kZW50KElWYWxpZGF0aW9uUnVsZSBydWxlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoZSBJVmFsaWRhdGlvblJ1bGVzIHdoaWNoIGRlcGVuZCBvbiB0aGlzIHJ1bGUuCi0JICovCi0JcHVibGljIFNldCBnZXREZXBlbmRlbnRzKCk7Ci0JCi0JLyoqCi0JICogR2l2ZW4gdGhlIHRhcmdldCdzIHBhcmVudCBhbmQgdGhlIGNoYW5nZWQgdGFyZ2V0LCByZXR1cm4gdGhlIHRhcmdldCB3aGljaCAKLQkgKiB0aGlzIHJ1bGUgc2hvdWxkIHZhbGlkYXRlLiBGb3IgZXhhbXBsZSwgaWYgYSBiZWFuIGNsYXNzIGNoYW5nZXMsIHRoZW4gdGhlIAotCSAqIHRhcmdldCBwYXJlbnQgd291bGQgYmUgdGhlIEVudGVycHJpc2VCZWFuLCBhbmQgdGhpcyBydWxlIGNvdWxkIHJldHVybgotCSAqIHRoZSBob21lIGludGVyZmFjZSwgb3IgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UsIG9yIHRoZSBrZXkgY2xhc3MsIGV0Yy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KTsKLQotCS8qKgotCSAqIElmIGFueSBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBjYWxjdWxhdGVkIGJlZm9yZSB0aGUgdmFsaWRhdGUgbWV0aG9kIGlzIGNhbGxlZCwKLQkgKiB0aGVuIHRoYXQgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNhbGN1bGF0ZWQgaGVyZS4gVGhpcyBjYWNoZWQgaW5mb3JtYXRpb24gc2hvdWxkCi0JICogYmUgY2xlYW5lZCB1cCBpbiB0aGUgcG9zdFZhbGlkYXRlIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSB0YXJnZXQgb2JqZWN0LiBSZXBvcnQgYWxsIG1lc3NhZ2VzLCBsb2FkIG1vZGVscywgZXRjLgotCSAqIHRocm91Z2ggdGhlIElWYWxpZHRpb25Db250ZXh0IHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNsZWFucyB1cCBhbnkgcmVzb3VyY2VzIGNhbGN1bGF0ZWQgb3IgY2FjaGVkIGluIHRoZSBwcmVWYWxpZGF0ZSBtZXRob2QuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSB2YWxpZGF0ZSBtZXRob2QgaGFzIGNvbXBsZXRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0VmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBUbyBlbmFibGUgdGhpcyBydWxlIGZvciByZXVzZSwgcmVzZXQgYW55IHN0b3JlZCB2YWx1ZXMgKHdoaWNoIHdlcmUgY2FsY3VsYXRlZCAKLQkgKiBkdXJpbmcgdmFsaWRhdGlvbikgdG8gdGhlIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBtYXBwaW5nIG9mIENIS0ogbWVzc2FnZSBpZCB0byB0aGUgbWVzc2FnZSBpZCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0TWVzc2FnZUlkcygpOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lWYWxpZGF0aW9uUnVsZUxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JVmFsaWRhdGlvblJ1bGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YzM5MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lWYWxpZGF0aW9uUnVsZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uUnVsZUxpc3QgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX0VKQkpBUiA9IG5ldyBJbnRlZ2VyKDEpOyAvLyBFSkIgMS4xIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfRUpCRVhUID0gbmV3IEludGVnZXIoMik7IC8vIEVKQiAxLjEgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9FSkJKQVIgPSBuZXcgSW50ZWdlcigzKTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0VKQkVYVCA9IG5ldyBJbnRlZ2VyKDQpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfRU5URVJQUklTRUJFQU4gPSBuZXcgSW50ZWdlcig1KTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfRU5URVJQUklTRUJFQU4gPSBuZXcgSW50ZWdlcig2KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX1NFU1NJT05fQkVBTkNMQVNTID0gbmV3IEludGVnZXIoNyk7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX1NFU1NJT05fUkVNT1RFID0gbmV3IEludGVnZXIoOCk7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX1NFU1NJT05fSE9NRSA9IG5ldyBJbnRlZ2VyKDkpOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9DTVBfQkVBTkNMQVNTID0gbmV3IEludGVnZXIoMTApOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9DTVBfUkVNT1RFID0gbmV3IEludGVnZXIoMTEpOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9DTVBfSE9NRSA9IG5ldyBJbnRlZ2VyKDEyKTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfQ01QX0tFWUNMQVNTID0gbmV3IEludGVnZXIoMTMpOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX0JNUF9CRUFOQ0xBU1MgPSBuZXcgSW50ZWdlcigxNCk7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX0JNUF9SRU1PVEUgPSBuZXcgSW50ZWdlcigxNSk7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX0JNUF9IT01FID0gbmV3IEludGVnZXIoMTYpOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9CTVBfS0VZQ0xBU1MgPSBuZXcgSW50ZWdlcigxNyk7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTID0gbmV3IEludGVnZXIoMTgpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFID0gbmV3IEludGVnZXIoMTkpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fSE9NRSA9IG5ldyBJbnRlZ2VyKDIwKTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMID0gbmV3IEludGVnZXIoMjEpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FID0gbmV3IEludGVnZXIoMjIpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9CRUFOQ0xBU1MgPSBuZXcgSW50ZWdlcigyMyk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9TVEFURUZVTF9TRVNTSU9OX1JFTU9URSA9IG5ldyBJbnRlZ2VyKDI0KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX1NUQVRFRlVMX1NFU1NJT05fSE9NRSA9IG5ldyBJbnRlZ2VyKDI1KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUwgPSBuZXcgSW50ZWdlcigyNik7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMSE9NRSA9IG5ldyBJbnRlZ2VyKDI3KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0NNUF9CRUFOQ0xBU1MgPSBuZXcgSW50ZWdlcigyOCk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9DTVBfUkVNT1RFID0gbmV3IEludGVnZXIoMjkpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQ01QX0hPTUUgPSBuZXcgSW50ZWdlcigzMCk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9DTVBfTE9DQUwgPSBuZXcgSW50ZWdlcigzMSk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9DTVBfTE9DQUxIT01FID0gbmV3IEludGVnZXIoMzIpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQ01QX0tFWUNMQVNTID0gbmV3IEludGVnZXIoMzMpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9CTVBfQkVBTkNMQVNTID0gbmV3IEludGVnZXIoMzQpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQk1QX1JFTU9URSA9IG5ldyBJbnRlZ2VyKDM1KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0JNUF9IT01FID0gbmV3IEludGVnZXIoMzYpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQk1QX0xPQ0FMID0gbmV3IEludGVnZXIoMzcpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQk1QX0xPQ0FMSE9NRSA9IG5ldyBJbnRlZ2VyKDM4KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0JNUF9LRVlDTEFTUyA9IG5ldyBJbnRlZ2VyKDM5KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfTUVTU0FHRV9CRUFOQ0xBU1MgPSBuZXcgSW50ZWdlcig0MCk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JbnZhbGlkSW5wdXRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JbnZhbGlkSW5wdXRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjNjczYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSW52YWxpZElucHV0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0KLS8qKgotICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gZWl0aGVyIGEgdHlwZSBjYW5ub3QgYmUgcmVmbGVjdGVkCi0gKiBvciB3aGVuIGV4cGVjdGVkIGlucHV0IChlLmcuIHRoZSByZW1vdGUgaW50ZXJmYWNlKSBpcyBudWxsLgotICovCi1wdWJsaWMgY2xhc3MgSW52YWxpZElucHV0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3ODExMDQ2NDQ4Njg0ODY5ODQ1TDsKLQlwcml2YXRlIEphdmFDbGFzcyBfY2xhc3MgPSBudWxsOwotCQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uCi0JICogYXZhaWxhYmxlIHRvIGlkZW50aWZ5IHdoYXQgaXMgaW52YWxpZC4KLQkgKi8KLQlwdWJsaWMgSW52YWxpZElucHV0RXhjZXB0aW9uKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgd2hlbiB0aGUgZ2l2ZW4gdHlwZSBjYW5ub3QgYmUgcmVmbGVjdGVkLgotCSAqLwotCXB1YmxpYyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCV9jbGFzcyA9IGNsYXp6OwotCX0KLQkKLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuIF9jbGFzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRU1lc3NhZ2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFTWVzc2FnZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWFjNjkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFTWVzc2FnZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBNZXNzYWdlIGtleSBjb25zdGFudHMgZm9yIEoyRUUgdmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKMkVFTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJFRl9DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5lcmVmdmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfQ0FURUdPUlkgPSAid2FydmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ0FURUdPUlkgPSAiZWFydmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJKQVJfQ0FURUdPUlkgPSAiZWpiamFydmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUExJQ0FUSU9OQ0xJRU5UX0NBVEVHT1JZID0gImFwcGxpY2F0aW9uY2xpZW50dmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfTkFNRSA9ICJ2YWxpZGF0b3IubmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGTkFNRSA9ICJFUlJPUl9FQVJfTUlTU0lOR19FUkVGTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGVFlQRSA9ICJFUlJPUl9FQVJfTUlTU0lOR19FUkVGVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfSU5WQUxJRF9FUkVGVFlQRSA9ICJFUlJPUl9FQVJfSU5WQUxJRF9FUkVGVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGSE9NRSA9ICJFUlJPUl9FQVJfTUlTU0lOR19FUkVGSE9NRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfTUlTU0lOR19FUkVGUkVNT1RFID0gIkVSUk9SX0VBUl9NSVNTSU5HX0VSRUZSRU1PVEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX01JU1NJTkdfRUpCX1JPTEUgPSAiRVJST1JfRUFSX01JU1NJTkdfRUpCX1JPTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9SRVNSRUYgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9SRVNSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9TRVJWSUNFUkVGID0gIkVSUk9SX0VBUl9EVVBMSUNBVEVfU0VSVklDRVJFRiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfRFVQTElDQVRFX1NFQ1VSSVRZUk9MRVJFRiA9ICJFUlJPUl9FQVJfRFVQTElDQVRFX1NFQ1VSSVRZUk9MRVJFRiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfRFVQTElDQVRFX0VKQlJFRiA9ICJFUlJPUl9FQVJfRFVQTElDQVRFX0VKQlJFRiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfRFVQTElDQVRFX1JFU0VOVlJFRiA9ICJFUlJPUl9FQVJfRFVQTElDQVRFX1JFU0VOVlJFRiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfRFVQTElDQVRFX01FU1NTQUdFREVTVElOQVRJT05SRUYgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9NRVNTU0FHRURFU1RJTkFUSU9OUkVGIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX01FU1NTQUdFREVTVElOQVRJT04gPSAiRVJST1JfRUFSX01JU1NJTkdfTUVTU1NBR0VERVNUSU5BVElPTiI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX01JU1NJTkdfRU1QVFlfTUVTU1NBR0VERVNUSU5BVElPTiA9ICJFUlJPUl9FQVJfTUlTU0lOR19FTVBUWV9NRVNTU0FHRURFU1RJTkFUSU9OIjsgLy8kTk9OLU5MUy0xJAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9VTlJFU09MVkVEX01EQl9NSVNTSU5HX01FU1NBR0VfREVTVElOQVRJT04gPSAiRVJST1JfVU5SRVNPTFZFRF9NREJfTUlTU0lOR19NRVNTQUdFX0RFU1RJTkFUSU9OIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTU9EVUxFX0REX0ZJTEVfTk9UX0ZPVU5EID0gIkVSUk9SX01PRFVMRV9ERF9GSUxFX05PVF9GT1VORCI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1Yjg0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEoyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGhhbmRsZXJzID0gbmV3IGphdmEudXRpbC5IYXNodGFibGUoKTsKLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgcmVzb3VyY2VDbGFzc0xvYWRlcjsKLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxvY2FsZSBsb2NhbGUgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgYnVuZGxlTmFtZSA9IG51bGw7Ci0JcHJvdGVjdGVkIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotLyoqCi0gKiBSZXNvdXJjZUhhbmRsZXIgY29uc3RydWN0b3IuICBUaGlzIGNvbnN0cnVjdG9yIHVzZXMgdGhlIGRlZmF1bHQgbG9jYWxlLgotICoKLSAqLwotcHVibGljIEoyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIFJlc291cmNlSGFuZGxlciBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBAcGFyYW0gVGhlIExvY2FsZSBvYmplY3QgY29udGFpbmluZyB0aGUgbG9jYWxlIHRvIGJlIHVzZWQgdG8gbG9jYXRlIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gKi8KLXB1YmxpYyBKMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlcihMb2NhbGUgbG9jYWxlKSB7Ci0Jc3VwZXIoKTsKLQlzZXRMb2NhbGUobG9jYWxlKTsKLX0KLS8qKgotICogR2V0dGVyIGZvciB0aGUgcmVzb3VyY2UgYnVuZGxlIHByb3BlcnR5LiAgVGhpcyBwcm9wZXJ0eSBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlCi0gKiBsb2NhbGUgcHJvcGVydHk7IHNvIHRoYXQgcHJvcGVydHkgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCi0gKgotICogQHJldHVybiBUaGUgUmVzb3VyY2VCdW5kbGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2VzIHRvIGJlIGhhbmRsZWQgYnkgdGhpcyBpbnN0YW5jZS4KLSAqLwotcHVibGljIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoKSB7Ci0JaWYgKHRoaXMuYnVuZGxlID09IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRSZXNvdXJjZUNsYXNzTG9hZGVyKCkgPT0gbnVsbCkKLQkJCQl0aGlzLmJ1bmRsZSA9IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0QnVuZGxlTmFtZSgpLGdldExvY2FsZSgpKTsKLQkJCWVsc2UKLQkJCQl0aGlzLmJ1bmRsZSA9IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0QnVuZGxlTmFtZSgpLGdldExvY2FsZSgpLCBnZXRSZXNvdXJjZUNsYXNzTG9hZGVyKCkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gcmV0cmlldmluZyBidW5kbGU6ICIgKyBnZXRCdW5kbGVOYW1lKCkgKy8vJE5PTi1OTFMtMSQKLQkJCQkiIHVzaW5nIGxvY2FsZTogIiArIGdldExvY2FsZSgpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gLy8gZW5kdHJ5Ci0JfSAvLyBlbmRpZgotCXJldHVybiB0aGlzLmJ1bmRsZTsKLX0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMS81LzAxIDI6MjY6MjQgUE0pCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QnVuZGxlTmFtZSgpIHsKLQlyZXR1cm4gYnVuZGxlTmFtZTsKLX0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gKgotICogQHBhcmFtIGZpbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZC4KLSAqLwotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGtleSwgQ2xhc3MgYUNsYXNzKSB7Ci0JCi0JcmV0dXJuIGdldEhhbmRsZXIoZmlsZU5hbWUsIGFDbGFzcykuZ2V0TWVzc2FnZShrZXkpOwotCQotfQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBPYmplY3QgYXJyYXkuCi0gKgotICogQHBhcmFtIGZpbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZC4KLSAqIEBwYXJhbSBhcmcgVGhlIE9iamVjdCBhcnJheSBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZS4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGtleSwgQ2xhc3MgYUNsYXNzLCBPYmplY3QgYXJnW10pIHsKLQkKLQlyZXR1cm4gZ2V0SGFuZGxlcihmaWxlTmFtZSwgYUNsYXNzKS5nZXRNZXNzYWdlKGtleSwgYXJnKTsKLX0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGFycmF5LgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnIFRoZSBPYmplY3QgYXJyYXkgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBrZXksIENsYXNzIGFDbGFzcywgT2JqZWN0IGFyZ1tdLCBMb2NhbGUgbG9jYWxlKSB7Ci0JCi0JcmV0dXJuIGdldEhhbmRsZXIoZmlsZU5hbWUsIGFDbGFzcywgbG9jYWxlKS5nZXRNZXNzYWdlKGtleSwgYXJnKTsKLX0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFyZ3VtZW50LgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMS4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGtleSwgQ2xhc3MgYUNsYXNzLCBTdHJpbmcgYXJnMSkgewotCQotCXJldHVybiBnZXRIYW5kbGVyKGZpbGVOYW1lLCBhQ2xhc3MpLmdldE1lc3NhZ2Uoa2V5LCBhcmcxKTsKLQotfQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMS4KLSAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAyLgotICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0gKi8KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBrZXksIENsYXNzIGFDbGFzcywgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSB7Ci0JCi0JcmV0dXJuIGdldEhhbmRsZXIoZmlsZU5hbWUsIGFDbGFzcykuZ2V0TWVzc2FnZShrZXksIGFyZzEsIGFyZzIpOwotCi19Ci0vKioKLSAqIEdldCB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBhbmQgZm9ybWF0IHRoZSBtZXNzYWdlIHVzaW5nCi0gKiB0aGUgc3BlY2lmaWVkIFN0cmluZyBhcmd1bWVudHMuCi0gKgotICogQHBhcmFtIGZpbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZC4KLSAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAxLgotICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDIuCi0gKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMy4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcga2V5LCBDbGFzcyBhQ2xhc3MsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpIHsKLQkKLQlyZXR1cm4gZ2V0SGFuZGxlcihmaWxlTmFtZSwgYUNsYXNzKS5nZXRNZXNzYWdlKGtleSwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JCi19Ci0vKioKLSAqIEdldCB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBhbmQgZm9ybWF0IHRoZSBtZXNzYWdlIHVzaW5nCi0gKiB0aGUgc3BlY2lmaWVkIFN0cmluZyBhcmd1bWVudHMuCi0gKgotICogQHBhcmFtIGZpbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZC4KLSAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAxLgotICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDIuCi0gKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMy4KLSAqIEBwYXJhbSBhcmc0IFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSA0LgotICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0gKi8KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBrZXksIENsYXNzIGFDbGFzcywgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMywgU3RyaW5nIGFyZzQpIHsKLQotCXJldHVybiBnZXRIYW5kbGVyKGZpbGVOYW1lLCBhQ2xhc3MpLmdldE1lc3NhZ2Uoa2V5LCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLQotfQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMS4KLSAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAyLgotICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDMuCi0gKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgNC4KLSAqIEBwYXJhbSBhcmc0IFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSA0LgotICogQHBhcmFtIGFyZzUgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDUuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGtleSwgQ2xhc3MgYUNsYXNzLAotCQkJCQkJIFN0cmluZyBhcmcxLCAKLQkJCQkJCSBTdHJpbmcgYXJnMiwgCi0JCQkJCQkgU3RyaW5nIGFyZzMsIAotCQkJCQkJIFN0cmluZyBhcmc0LCAKLQkJCQkJCSBTdHJpbmcgYXJnNSkgewotCQotCXJldHVybiBnZXRIYW5kbGVyKGZpbGVOYW1lLCBhQ2xhc3MpLmdldE1lc3NhZ2Uoa2V5LAotCQkJCQkJIGFyZzEsIAotCQkJCQkJIGFyZzIsIAotCQkJCQkJIGFyZzMsIAotCQkJCQkJIGFyZzQsIAotCQkJCQkJIGFyZzUpOwotCQotfQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAqCi0gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICovCi0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcga2V5LCBDbGFzcyBhQ2xhc3MsIExvY2FsZSBsb2NhbGUpIHsKLQkKLQlyZXR1cm4gZ2V0SGFuZGxlcihmaWxlTmFtZSwgYUNsYXNzLCBsb2NhbGUpLmdldE1lc3NhZ2Uoa2V5KTsKLQkKLX0KLS8qKgotICogR2V0IHRoZSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwYXNzZWQgcHJvcGVydHkgZmlsZS4KLSAqCi0gKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBoYW5kbGVyIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gbWVzc2FnZXMuCi0gKi8KLXB1YmxpYyBzdGF0aWMgSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIgZ2V0SGFuZGxlcihTdHJpbmcgZmlsZU5hbWUsIENsYXNzIGFDbGFzcykgewotCXJldHVybiBnZXRIYW5kbGVyKGZpbGVOYW1lLGFDbGFzcyxMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLX0KLS8qKgotICogR2V0IHRoZSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwYXNzZWQgcHJvcGVydHkgZmlsZS4KLSAqCi0gKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBoYW5kbGVyIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gbWVzc2FnZXMuCi0gKi8KLXB1YmxpYyBzdGF0aWMgSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIgZ2V0SGFuZGxlcihTdHJpbmcgZmlsZU5hbWUsIENsYXNzIGFDbGFzcywgTG9jYWxlIGxvY2FsZSkgewotCVN0cmluZyBoYW5kbGVyS2V5ID0gZ2V0SGFuZGxlcktleShmaWxlTmFtZSwgbG9jYWxlKTsKLQlpZiAoaGFuZGxlcnMuZ2V0KGhhbmRsZXJLZXkpID09IG51bGwpIHsKLQkJSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIgdGVtcCA9IG5ldyBKMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlcihsb2NhbGUpOwotCQl0ZW1wLnNldFJlc291cmNlQ2xhc3NMb2FkZXIoYUNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCQl0ZW1wLnNldEJ1bmRsZU5hbWUoZmlsZU5hbWUpOwotCQloYW5kbGVycy5wdXQoaGFuZGxlcktleSx0ZW1wKTsKLQl9Ci0JCi0JcmV0dXJuIChKMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlcikoaGFuZGxlcnMuZ2V0KGhhbmRsZXJLZXkpKTsKLX0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEhhbmRsZXJLZXkoU3RyaW5nIF9iYXNlTmFtZSwgTG9jYWxlIGxvY2FsZSkgewotCVN0cmluZ0J1ZmZlciBsb2NhbGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigiXyIpLmFwcGVuZChsb2NhbGUudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJAotCWlmIChsb2NhbGUudG9TdHJpbmcoKS5lcXVhbHMoIiIpKS8vJE5PTi1OTFMtMSQKLQkgIGxvY2FsZU5hbWUuc2V0TGVuZ3RoKDApOwotCXJldHVybiBfYmFzZU5hbWUgKyBsb2NhbGVOYW1lLnRvU3RyaW5nKCk7Ci0gIH0gICAgICAKLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEvMjYvMjAwMSAxOjA0OjUwIFBNKQotICogQHJldHVybiBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLSAqLwotcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRSZXNvdXJjZUNsYXNzTG9hZGVyKCkgewotCXJldHVybiByZXNvdXJjZUNsYXNzTG9hZGVyOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMS8yNi8yMDAxIDE6MDQ6NTAgUE0pCi0gKiBAcGFyYW0gbmV3UmVzb3VyY2VDbGFzc0xvYWRlciBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLSAqLwotcHVibGljIHZvaWQgc2V0UmVzb3VyY2VDbGFzc0xvYWRlcihqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgbmV3UmVzb3VyY2VDbGFzc0xvYWRlcikgewotCXJlc291cmNlQ2xhc3NMb2FkZXIgPSBuZXdSZXNvdXJjZUNsYXNzTG9hZGVyOwotfQotCi0vKioKLSAqIFNldHRlciBmb3IgdGhlIGxvY2FsZSBwcm9wZXJ0eS4KLSAqCi0gKiBAcGFyYW0gVGhlIGxvY2FsZS4KLSAqLwotcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKLQl0aGlzLmxvY2FsZSA9IGxvY2FsZTsKLX0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMS81LzAxIDI6MjY6MjQgUE0pCi0gKiBAcGFyYW0gbmV3QnVuZGxlTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyB2b2lkIHNldEJ1bmRsZU5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdCdW5kbGVOYW1lKSB7Ci0JYnVuZGxlTmFtZSA9IG5ld0J1bmRsZU5hbWU7Ci19Ci0KLQotLyoqCi0gKiBHZXR0ZXIgZm9yIHRoZSBsb2NhbGUgcHJvcGVydHkuCi0gKgotICogQHJldHVybiBUaGUgbG9jYWxlLgotICovCi1wdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKLQlpZiAobG9jYWxlID09IG51bGwpCi0JCWxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JcmV0dXJuIGxvY2FsZTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAqCi0gKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZC4KLSAqLwotCi1wdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgewotCVN0cmluZyB0ZW1wID0gbnVsbDsKLQl0cnkgewotCQl0ZW1wID0gZ2V0QnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBFeGNlcHRpb246ICIgKyBleCk7Ly8kTk9OLU5MUy0xJAotCQl0ZW1wID0gIjw8S2V5OiAiICsga2V5ICsgIiBub3QgZm91bmQgaW4gcmVzb3VyY2U6ICIgKyBnZXRCdW5kbGVOYW1lKCkgKyAiPj4iOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQlyZXR1cm4gdGVtcDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBPYmplY3QgYXJyYXkuCi0gKgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnIFRoZSBPYmplY3QgYXJyYXkgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdCBhcmdbXSkgewotCVN0cmluZyB0ZW1wID0gbnVsbDsKLQl0cnkgewotCQl0ZW1wID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0QnVuZGxlKCkuZ2V0U3RyaW5nKGtleSksIGFyZyk7Ci0JfQotCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBFeGNlcHRpb246ICIgKyBleCk7Ly8kTk9OLU5MUy0xJAotCQl0ZW1wID0gIjw8S2V5OiAiICsga2V5ICsgIiBub3QgZm91bmQgaW4gcmVzb3VyY2U6ICIgKyBnZXRCdW5kbGVOYW1lKCkgKyAiPj4iOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQlyZXR1cm4gdGVtcDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnQuCi0gKgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMS4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi1wdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzEpIHsKLQotCVN0cmluZyB0ZW1wID0gbnVsbDsKLQl0cnkgewotCQlpZiAoYXJnMSAhPSBudWxsKSB7Ci0JCQlPYmplY3QgbXNnb2JqW10gPSBuZXcgT2JqZWN0WzFdOwotCQkJbXNnb2JqWzBdID0gYXJnMTsKLQkJCXRlbXAgPSBnZXRNZXNzYWdlKGtleSwgbXNnb2JqKTsKLQkJfSAKLQkJZWxzZSB7Ci0JCQl0ZW1wID0gZ2V0TWVzc2FnZShrZXkpOwotCQl9Ci0JfQotCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBFeGNlcHRpb246ICIgKyBleCk7Ly8kTk9OLU5MUy0xJAotCQl0ZW1wID0gIjw8S2V5OiAiICsga2V5ICsgIiBub3QgZm91bmQgaW4gcmVzb3VyY2U6ICIgKyBnZXRCdW5kbGVOYW1lKCkgKyAiPj4iOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQlyZXR1cm4gdGVtcDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMi4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi0KLXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpIHsKLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJaWYgKChhcmcxICE9IG51bGwpICYmIChhcmcyICE9IG51bGwpKSB7Ci0JCQlPYmplY3QgbXNnb2JqW10gPSBuZXcgT2JqZWN0WzJdOwotCQkJbXNnb2JqWzBdID0gYXJnMTsKLQkJCW1zZ29ialsxXSA9IGFyZzI7Ci0JCQl0ZW1wID0gZ2V0TWVzc2FnZShrZXksIG1zZ29iaik7Ci0JCX0gCi0JCWVsc2UgewotCQkJdGVtcCA9IGdldE1lc3NhZ2Uoa2V5KTsKLQkJfQotCX0KLQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgRXhjZXB0aW9uOiAiICsgZXgpOy8vJE5PTi1OTFMtMSQKLQkJdGVtcCA9ICI8PEtleTogIiArIGtleSArICIgbm90IGZvdW5kIGluIHJlc291cmNlOiAiICsgZ2V0QnVuZGxlTmFtZSgpICsgIj4+IjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0JcmV0dXJuIHRlbXA7Ci0KLX0KLQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMi4KLSAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAzLgotICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0gKi8KLQotcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpIHsKLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJaWYgKChhcmcxICE9IG51bGwpICYmIChhcmcyICE9IG51bGwpICYmIChhcmczICE9IG51bGwpKSB7Ci0JCQlPYmplY3QgbXNnb2JqW10gPSBuZXcgT2JqZWN0WzNdOwotCQkJbXNnb2JqWzBdID0gYXJnMTsKLQkJCW1zZ29ialsxXSA9IGFyZzI7Ci0JCQltc2dvYmpbMl0gPSBhcmczOwotCQkJdGVtcCA9IGdldE1lc3NhZ2Uoa2V5LCBtc2dvYmopOwotCQl9IAotCQllbHNlIHsKLQkJCXRlbXAgPSBnZXRNZXNzYWdlKGtleSk7Ci0JCX0KLQl9Ci0JY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIEV4Y2VwdGlvbjogIiArIGV4KTsvLyROT04tTkxTLTEkCi0JCXRlbXAgPSAiPDxLZXk6ICIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiByZXNvdXJjZTogIiArIGdldEJ1bmRsZU5hbWUoKSArICI+PiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCXJldHVybiB0ZW1wOwotCQotfQotCi0vKioKLSAqIEdldCB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBhbmQgZm9ybWF0IHRoZSBtZXNzYWdlIHVzaW5nCi0gKiB0aGUgc3BlY2lmaWVkIFN0cmluZyBhcmd1bWVudHMuCi0gKgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMS4KLSAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAyLgotICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDMuCi0gKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgNC4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi0KLXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczLCBTdHJpbmcgYXJnNCkgewotCVN0cmluZyB0ZW1wID0gbnVsbDsKLQl0cnkgewotCQlpZiAoKGFyZzEgIT0gbnVsbCkgJiYgKGFyZzIgIT0gbnVsbCkgJiYgKGFyZzMgIT0gbnVsbCkgJiYgKGFyZzQgIT0gbnVsbCkpIHsKLQkJCU9iamVjdCBtc2dvYmpbXSA9IG5ldyBPYmplY3RbNF07Ci0JCQltc2dvYmpbMF0gPSBhcmcxOwotCQkJbXNnb2JqWzFdID0gYXJnMjsKLQkJCW1zZ29ialsyXSA9IGFyZzM7Ci0JCQltc2dvYmpbM10gPSBhcmc0OwotCQkJdGVtcCA9IGdldE1lc3NhZ2Uoa2V5LCBtc2dvYmopOwotCQl9IAotCQllbHNlIHsKLQkJCXRlbXAgPSBnZXRNZXNzYWdlKGtleSk7Ci0JCX0KLQl9Ci0JY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIEV4Y2VwdGlvbjogIiArIGV4KTsvLyROT04tTkxTLTEkCi0JCXRlbXAgPSAiPDxLZXk6ICIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiByZXNvdXJjZTogIiArIGdldEJ1bmRsZU5hbWUoKSArICI+PiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCXJldHVybiB0ZW1wOwotfQotCi0vKioKLSAqIEdldCB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBhbmQgZm9ybWF0IHRoZSBtZXNzYWdlIHVzaW5nCi0gKiB0aGUgc3BlY2lmaWVkIFN0cmluZyBhcmd1bWVudHMuCi0gKgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMS4KLSAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAyLgotICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDMuCi0gKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgNC4KLSAqIEBwYXJhbSBhcmc0IFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSA0LgotICogQHBhcmFtIGFyZzUgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDUuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotCi1wdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwKLQkJCQkJCSBTdHJpbmcgYXJnMSwgCi0JCQkJCQkgU3RyaW5nIGFyZzIsIAotCQkJCQkJIFN0cmluZyBhcmczLCAKLQkJCQkJCSBTdHJpbmcgYXJnNCwgCi0JCQkJCQkgU3RyaW5nIGFyZzUpIHsKLQotCVN0cmluZyB0ZW1wID0gbnVsbDsKLQl0cnkgewotCQlpZiAoKGFyZzEgIT0gbnVsbCkgJiYgKGFyZzIgIT0gbnVsbCkgJiYgKGFyZzMgIT0gbnVsbCkgJiYgCi0JCQkJKGFyZzQgIT0gbnVsbCkgJiYgKGFyZzUgIT0gbnVsbCkgKSB7Ci0JCQlPYmplY3QgbXNnb2JqW10gPSBuZXcgT2JqZWN0WzVdOwotCQkJbXNnb2JqWzBdID0gYXJnMTsKLQkJCW1zZ29ialsxXSA9IGFyZzI7Ci0JCQltc2dvYmpbMl0gPSBhcmczOwotCQkJbXNnb2JqWzNdID0gYXJnNDsKLQkJCW1zZ29ials0XSA9IGFyZzU7Ci0JCQl0ZW1wID0gZ2V0TWVzc2FnZShrZXksIG1zZ29iaik7Ci0JCX0gCi0JCWVsc2UgewotCQkJdGVtcCA9IGdldE1lc3NhZ2Uoa2V5KTsKLQkJfQotCX0KLQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgRXhjZXB0aW9uOiAiICsgZXgpOy8vJE5PTi1OTFMtMSQKLQkJdGVtcCA9ICI8PEtleTogIiArIGtleSArICIgbm90IGZvdW5kIGluIHJlc291cmNlOiAiICsgZ2V0QnVuZGxlTmFtZSgpICsgIj4+IjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0JcmV0dXJuIHRlbXA7Ci0JCi19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmOTQ5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDMvOS8yMDAxIDM6MzQ6MzkgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iLCBKMkVFTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHJvdGVjdGVkIElSZXBvcnRlciBfcmVwb3J0ZXI7Ci0JcHJvdGVjdGVkIElWYWxpZGF0aW9uQ29udGV4dCBfaGVscGVyOwotCXByb3RlY3RlZCBJU3RhdHVzIHN0YXR1cyA9IE9LX1NUQVRVUzsKLQotCi0JcHVibGljIEoyRUVWYWxpZGF0b3IoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYW0gPGVtPmVycm9yPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlIGNhY2hlZCByZXBvcnRlci4gVGhpcyBmb3JtIG9mCi0JICogPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG5vIGFyZ3VtZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtc2dJZCkgewotCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBtc2dJZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGFtIDxlbT5lcnJvcjwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBubyBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbXNnSWQsIFN0cmluZ1tdIG1zZ0FyZ3MpIHsKLQkJYWRkRXJyb3IoZ2V0QmFzZU5hbWUoKSwgbXNnSWQsIG1zZ0FyZ3MpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZSBhbSA8ZW0+ZXJyb3I8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdCB0byB0aGUgY2FjaGVkIHJlcG9ydGVyLiBUaGlzIGZvcm0gb2YKLQkgKiA8Y29kZT5hZGRFcnJvcjwvY29kZT4gaXMgZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgbm8gYXJndW1lbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnQ2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIFRoZSBiYXNlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgYnVuZGxlIHRvIHVzZS4KLQkgKiBAcGFyYW0gbXNnSWQKLQkgKiAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBjcmVhdGVkLgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1zZ0NhdGVnb3J5LCBTdHJpbmcgbXNnSWQpIHsKLQkJYWRkRXJyb3IobXNnQ2F0ZWdvcnksIG1zZ0lkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYW4gPGVtPmVycm9yPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlIGNhY2hlZCByZXBvcnRlci4gVGhpcyBmb3JtIG9mCi0JICogPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG9uZSBvciBtb3JlIGFyZ3VtZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1zZ0NhdGVnb3J5Ci0JICogICAgICAgICAgICBUaGUgYmFzZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGJ1bmRsZSB0byB1c2UuCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLQkgKiBAcGFyYW0gbXNnQXJncwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlLgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncykgewotCQl0aGlzLmFkZEVycm9yKGJ1bmRsZU5hbWUsIG1zZ0lkLCBtc2dBcmdzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYW4gPGVtPmVycm9yPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlIGNhY2hlZCByZXBvcnRlci4gVGhpcyBmb3JtIG9mCi0JICogPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG9uZSBvciBtb3JlIGFyZ3VtZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1zZ0NhdGVnb3J5Ci0JICogICAgICAgICAgICBUaGUgYmFzZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGJ1bmRsZSB0byB1c2UuCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLQkgKiBAcGFyYW0gbXNnQXJncwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlLgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncywgT2JqZWN0IHRhcmdldCkgewotCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBuZXcgTWVzc2FnZShidW5kbGVOYW1lLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtc2dJZCwgbXNnQXJncywgdGFyZ2V0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncywgT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoYnVuZGxlTmFtZSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbXNnSWQsIG1zZ0FyZ3MsIHRhcmdldCk7Ci0JCW1lc3NhZ2Uuc2V0R3JvdXBOYW1lKGdyb3VwTmFtZSk7Ci0JCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgbXNnSWQsIFN0cmluZ1tdIG1zZ0FyZ3MsIE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cE5hbWUsIGludCBsaW5lTnVtYmVyKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShidW5kbGVOYW1lLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtc2dJZCwgbXNnQXJncywgdGFyZ2V0KTsKLQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU51bWJlcik7Ci0JCW1lc3NhZ2Uuc2V0R3JvdXBOYW1lKGdyb3VwTmFtZSk7Ci0KLQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMb2NhbGl6ZWRFcnJvcihTdHJpbmcgbXNnLCBPYmplY3QgdGFyZ2V0KSB7Ci0JCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1zZywgdGFyZ2V0KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZExvY2FsaXplZEVycm9yKFN0cmluZyBtc2csIE9iamVjdCB0YXJnZXQsIGludCBsaW5lTnVtYmVyKSB7Ci0JCWFkZExvY2FsaXplZEVycm9yKCBtc2csIHRhcmdldCwgbnVsbCwgbGluZU51bWJlciApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRMb2NhbGl6ZWRFcnJvcihTdHJpbmcgbXNnLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgbGluZU51bWJlcikgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbXNnLCB0YXJnZXQpOwotCQltZXNzYWdlLnNldEdyb3VwTmFtZSggZ3JvdXBOYW1lICk7Ci0JCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVOdW1iZXIpOwotCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIGFkZExvY2FsaXplZEVycm9yKFN0cmluZyBtc2csIE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cE5hbWUpIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1zZywgdGFyZ2V0KTsKLQkJbWVzc2FnZS5zZXRHcm91cE5hbWUoIGdyb3VwTmFtZSApOwotCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGFuIDxlbT5pbmZvcm1hdGlvbmFsPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlIGNhY2hlZCByZXBvcnRlci4gVGhpcyBmb3JtIG9mCi0JICogPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG5vIGFyZ3VtZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZEluZm8oU3RyaW5nIG1zZ0lkKSB7Ci0JCWFkZEluZm8oZ2V0QmFzZU5hbWUoKSwgbXNnSWQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZSBhbiA8ZW0+aW5mb3JtYXRpb25hbDwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBubyBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIG1zZ0FyZ3MKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbWVzc2FnZS4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZEluZm8oU3RyaW5nIG1zZ0lkLCBTdHJpbmdbXSBtc2dBcmdzKSB7Ci0JCWFkZEluZm8oZ2V0QmFzZU5hbWUoKSwgbXNnSWQsIG1zZ0FyZ3MpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZSBhbiA8ZW0+aW5mb3JtYXRpb25hbDwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBubyBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dDYXRlZ29yeQotCSAqICAgICAgICAgICAgVGhlIGJhc2UgbmFtZSBvZiB0aGUgbWVzc2FnZSBidW5kbGUgdG8gdXNlLgotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBhZGRJbmZvKFN0cmluZyBtc2dDYXRlZ29yeSwgU3RyaW5nIG1zZ0lkKSB7Ci0JCWFkZEluZm8obXNnQ2F0ZWdvcnksIG1zZ0lkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYW4gPGVtPmluZm9ybWF0aW9uYWw8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdCB0byB0aGUgY2FjaGVkIHJlcG9ydGVyLiBUaGlzIGZvcm0gb2YKLQkgKiA8Y29kZT5hZGRFcnJvcjwvY29kZT4gaXMgZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgb25lIG9yIG1vcmUgYXJndW1lbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnQ2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIFRoZSBiYXNlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgYnVuZGxlIHRvIHVzZS4KLQkgKiBAcGFyYW0gbXNnSWQKLQkgKiAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBtc2dBcmdzCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIG1lc3NhZ2UuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBhZGRJbmZvKFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgbXNnSWQsIFN0cmluZ1tdIG1zZ0FyZ3MpIHsKLQkJYWRkSW5mbyhidW5kbGVOYW1lLCBtc2dJZCwgbXNnQXJncywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGFuIDxlbT5pbmZvcm1hdGlvbmFsPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlIGNhY2hlZCByZXBvcnRlci4gVGhpcyBmb3JtIG9mCi0JICogPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG9uZSBvciBtb3JlIGFyZ3VtZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1zZ0NhdGVnb3J5Ci0JICogICAgICAgICAgICBUaGUgYmFzZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGJ1bmRsZSB0byB1c2UuCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLQkgKiBAcGFyYW0gbXNnQXJncwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlLgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkSW5mbyhTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIG1zZ0lkLCBTdHJpbmdbXSBtc2dBcmdzLCBPYmplY3QgdGFyZ2V0KSB7Ci0JCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG5ldyBNZXNzYWdlKGJ1bmRsZU5hbWUsIElNZXNzYWdlLkxPV19TRVZFUklUWSwgbXNnSWQsIG1zZ0FyZ3MsIHRhcmdldCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExvY2FsaXplZEluZm8oU3RyaW5nIG1zZywgT2JqZWN0IHRhcmdldCkgewotCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIG1zZywgdGFyZ2V0KSk7Ci0JfQkKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYSA8ZW0+d2FybmluZzwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBubyBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtc2dJZCkgewotCQlhZGRXYXJuaW5nKGdldEJhc2VOYW1lKCksIG1zZ0lkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYSA8ZW0+d2FybmluZzwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuIFRoaXMgZm9ybSBvZgotCSAqIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBubyBhcmd1bWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIG1zZ0FyZ3MKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbWVzc2FnZS4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1zZ0lkLCBTdHJpbmdbXSBtc2dBcmdzKSB7Ci0JCWFkZFdhcm5pbmcoZ2V0QmFzZU5hbWUoKSwgbXNnSWQsIG1zZ0FyZ3MpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZSBhIDxlbT53YXJuaW5nPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlIGNhY2hlZCByZXBvcnRlci4gVGhpcyBmb3JtIG9mCi0JICogPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG5vIGFyZ3VtZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1zZ0NhdGVnb3J5Ci0JICogICAgICAgICAgICBUaGUgYmFzZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGJ1bmRsZSB0byB1c2UuCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1zZ0NhdGVnb3J5LCBTdHJpbmcgbXNnSWQpIHsKLQkJYWRkV2FybmluZyhtc2dDYXRlZ29yeSwgbXNnSWQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZSBhIDxlbT53YXJuaW5nPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlIGNhY2hlZCByZXBvcnRlci4gVGhpcyBmb3JtIG9mCi0JICogPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG9uZSBvciBtb3JlIGFyZ3VtZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1zZ0NhdGVnb3J5Ci0JICogICAgICAgICAgICBUaGUgYmFzZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGJ1bmRsZSB0byB1c2UuCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLQkgKiBAcGFyYW0gbXNnQXJncwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlLgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIG1zZ0lkLCBTdHJpbmdbXSBtc2dBcmdzKSB7Ci0JCWFkZFdhcm5pbmcoYnVuZGxlTmFtZSwgbXNnSWQsIG1zZ0FyZ3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZSBhIDxlbT53YXJuaW5nPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlIGNhY2hlZCByZXBvcnRlci4gVGhpcyBmb3JtIG9mCi0JICogPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG9uZSBvciBtb3JlIGFyZ3VtZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1zZ0NhdGVnb3J5Ci0JICogICAgICAgICAgICBUaGUgYmFzZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGJ1bmRsZSB0byB1c2UuCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLQkgKiBAcGFyYW0gbXNnQXJncwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlLgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIG1zZ0lkLCBTdHJpbmdbXSBtc2dBcmdzLCBPYmplY3QgdGFyZ2V0KSB7Ci0JCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG5ldyBNZXNzYWdlKGJ1bmRsZU5hbWUsIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgbXNnSWQsIG1zZ0FyZ3MsIHRhcmdldCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncywgT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoYnVuZGxlTmFtZSwgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBtc2dJZCwgbXNnQXJncywgdGFyZ2V0KTsKLQkJbWVzc2FnZS5zZXRHcm91cE5hbWUoZ3JvdXBOYW1lKTsKLQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTG9jYWxpemVkV2FybmluZyhTdHJpbmcgbXNnLCBPYmplY3QgdGFyZ2V0KSB7Ci0JCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgbXNnLCB0YXJnZXQpKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkTG9jYWxpemVkV2FybmluZyhTdHJpbmcgbXNnLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIG1zZywgdGFyZ2V0KTsKLQkJbWVzc2FnZS5zZXRHcm91cE5hbWUoZ3JvdXBOYW1lKTsKLQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JfQkKLQlwdWJsaWMgdm9pZCBhZGRMb2NhbGl6ZWRXYXJuaW5nKFN0cmluZyBtc2csIE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cE5hbWUsIGludCBsaW5lTm8pIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgbXNnLCB0YXJnZXQpOwotCQltZXNzYWdlLnNldEdyb3VwTmFtZShncm91cE5hbWUpOwotCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybSBhbnkgcmVzb3VyY2UgY2xlYW51cCBvbmNlIHZhbGlkYXRpb24gaXMgY29tcGxldGUuCi0JICogQGRlcHJlY2F0ZWQgVXNlIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0JCV9yZXBvcnRlciA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBhbnkgcmVzb3VyY2UgY2xlYW51cCBvbmNlIHZhbGlkYXRpb24gaXMgY29tcGxldGUuIElmIGNsZWFudXAgd2lsbCB0YWtlIHNvbWUgdGltZSwgdGhlCi0JICogSVZhbGlkYXRvciBzaG91bGQgcmVwb3J0IHN1YnRhc2sgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgdGhyb3VnaCB0aGUgSVJlcG9ydGVyIHBhcmFtZXRlci4gVGhlCi0JICogQVJlcG9ydGVyIHBhcmFtZXRlciB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCV9yZXBvcnRlciA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgVmFsaWRhdG9yLCBhcyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBVSS4gVGhlIFZhbGlkYXRpb25CdWlsZGVyCi0JICogdXNlcyB0aGlzIHN0cmluZyBhcyBpbnB1dCB0byB0aGUgSVByb2dyZXNzTW9uaXRvci4gaS5lLiwgQXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIHZhbGlkYXRpb24KLQkgKiBwcm9jZXNzLCB0aGUgVmFsaWRhdGlvbiBCdWlsZGVyIHdpbGwgb3V0cHV0IHRoaXMgc3RyaW5nOiAiezB9IGlzIHZhbGlkYXRpbmcgezF9LiIsIHdoZXJlIHswfQotCSAqIGlzIHRoZSBzdHJpbmcgdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zLCBhbmQgezF9IGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXQxUGFyYW0oU3RyaW5nIHN0cmluZzEpIHsKLQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQlwYXJtc1swXSA9IHN0cmluZzE7Ci0JCXJldHVybiBwYXJtczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJLiBUaGUgVmFsaWRhdGlvbkJ1aWxkZXIKLQkgKiB1c2VzIHRoaXMgc3RyaW5nIGFzIGlucHV0IHRvIHRoZSBJUHJvZ3Jlc3NNb25pdG9yLiBpLmUuLCBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgdmFsaWRhdGlvbgotCSAqIHByb2Nlc3MsIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIgd2lsbCBvdXRwdXQgdGhpcyBzdHJpbmc6ICJ7MH0gaXMgdmFsaWRhdGluZyB7MX0uIiwgd2hlcmUgezB9Ci0JICogaXMgdGhlIHN0cmluZyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMsIGFuZCB7MX0gaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldDJQYXJhbShTdHJpbmcgc3RyaW5nMSwgU3RyaW5nIHN0cmluZzIpIHsKLQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzJdOwotCQlwYXJtc1swXSA9IHN0cmluZzE7Ci0JCXBhcm1zWzFdID0gc3RyaW5nMjsKLQkJcmV0dXJuIHBhcm1zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFZhbGlkYXRvciwgYXMgaXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgVUkuIFRoZSBWYWxpZGF0aW9uQnVpbGRlcgotCSAqIHVzZXMgdGhpcyBzdHJpbmcgYXMgaW5wdXQgdG8gdGhlIElQcm9ncmVzc01vbml0b3IuIGkuZS4sIEF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uCi0JICogcHJvY2VzcywgdGhlIFZhbGlkYXRpb24gQnVpbGRlciB3aWxsIG91dHB1dCB0aGlzIHN0cmluZzogInswfSBpcyB2YWxpZGF0aW5nIHsxfS4iLCB3aGVyZSB7MH0KLQkgKiBpcyB0aGUgc3RyaW5nIHRoYXQgdGhpcyBtZXRob2QgcmV0dXJucywgYW5kIHsxfSBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0M1BhcmFtKFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpIHsKLQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzJdOwotCQlwYXJtc1swXSA9IHN0cmluZzE7Ci0JCXBhcm1zWzFdID0gc3RyaW5nMjsKLQkJcGFybXNbMl0gPSBzdHJpbmczOwotCQlyZXR1cm4gcGFybXM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQW5zd2VyIHRoZSBpZCBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGlzIHVzZWQgYnkgdGhlIHJlY2VpdmVyLgotCSAqIDwvcD4KLQkgKi8KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBsb2NhbGl6ZWQgbWVzc2FnZSBmcm9tIGEgcmVzb3VyY2UgYnVuZGxlLgotCSAqIAotCSAqIEBwYXJhbSBtc2dDYXRlZ29yeQotCSAqICAgICAgICAgICAgVGhlIGJhc2VOYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgKGZpbGVuYW1lIG1pbnVzIGFueSBsb2NhbGUgc3VmZml4KQotCSAqIEBwYXJhbSBtc2dJZAotCSAqICAgICAgICAgICAgVGhlIGtleSBvZiB0aGUgbWVzc2FnZSB0byBsb29rdXAgZnJvbSB0aGUgYnVuZGxlLgotCSAqIEBwYXJhbSBtc2dBcmdzCi0JICogICAgICAgICAgICBBbiBhcnJheSBvZiBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHN1YnN0aXR1dGVkIGludG8gYW55IG1lc3NhZ2UgYXJndW1lbnRzIGluIHRoZQotCSAqICAgICAgICAgICAgbWVzc2FnZSdzIHZhbHVlLgotCSAqIEBwYXJhbSBsb2NhbGUKLQkgKiAgICAgICAgICAgIFRoZSBsb2NhbGUgdG8gcmV0cmlldmUgdGhlIG1lc3NhZ2UgdGV4dCBmcm9tLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbXNnQ2F0ZWdvcnksIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncywgTG9jYWxlIGxvY2FsZSkgewotCQlyZXR1cm4gSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShtc2dDYXRlZ29yeSwgbXNnSWQsIGdldENsYXNzKCksIG1zZ0FyZ3MsIGxvY2FsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxvY2FsaXplZCBtZXNzYWdlIGZyb20gYSByZXNvdXJjZSBidW5kbGUuCi0JICogCi0JICogQHBhcmFtIG1zZ0NhdGVnb3J5Ci0JICogICAgICAgICAgICBUaGUgYmFzZU5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSAoZmlsZW5hbWUgbWludXMgYW55IGxvY2FsZSBzdWZmaXgpCi0JICogQHBhcmFtIG1zZ0lkCi0JICogICAgICAgICAgICBUaGUga2V5IG9mIHRoZSBtZXNzYWdlIHRvIGxvb2t1cCBmcm9tIHRoZSBidW5kbGUuCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgVGhlIGxvY2FsZSB0byByZXRyaWV2ZSB0aGUgbWVzc2FnZSB0ZXh0IGZyb20uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtc2dDYXRlZ29yeSwgU3RyaW5nIG1zZ0lkLCBMb2NhbGUgbG9jYWxlKSB7Ci0JCXJldHVybiBKMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKG1zZ0NhdGVnb3J5LCBtc2dJZCwgZ2V0Q2xhc3MoKSwgbG9jYWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJLiBUaGUgVmFsaWRhdGlvbkJ1aWxkZXIKLQkgKiB1c2VzIHRoaXMgc3RyaW5nIGFzIGlucHV0IHRvIHRoZSBJUHJvZ3Jlc3NNb25pdG9yLiBpLmUuLCBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgdmFsaWRhdGlvbgotCSAqIHByb2Nlc3MsIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIgd2lsbCBvdXRwdXQgdGhpcyBzdHJpbmc6ICJ7MH0gaXMgdmFsaWRhdGluZyB7MX0uIiwgd2hlcmUgezB9Ci0JICogaXMgdGhlIHN0cmluZyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMsIGFuZCB7MX0gaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJLiBUaGUgVmFsaWRhdGlvbkJ1aWxkZXIKLQkgKiB1c2VzIHRoaXMgc3RyaW5nIGFzIGlucHV0IHRvIHRoZSBJUHJvZ3Jlc3NNb25pdG9yLiBpLmUuLCBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgdmFsaWRhdGlvbgotCSAqIHByb2Nlc3MsIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIgd2lsbCBvdXRwdXQgdGhpcyBzdHJpbmc6Ci0JICogPC9wPgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgICAmcXVvdDt7MH0gaXMgdmFsaWRhdGluZyB7MX0uJnF1b3Q7LAotCSAqIDwvcHJlPgotCSAqIAotCSAqIDxwPgotCSAqIHdoZXJlCi0JICogPC9wPgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgICB7MH0gaXMgdGhlIHN0cmluZyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMsCi0JICogPC9wcmU+Ci0JICogCi0JICogPHA+Ci0JICogYW5kCi0JICogPC9wPgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgICB7MX0gaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UuCi0JICogPC9wcmU+Ci0JICogCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgVGhlIGxvY2FsZSBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBuYW1lIHRleHQuCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoTG9jYWxlIGxvY2FsZSkgewotCQlyZXR1cm4gZ2V0TWVzc2FnZShnZXRCYXNlTmFtZSgpLCBWQUxJREFUT1JfTkFNRSwgbG9jYWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJLiBUaGUgVmFsaWRhdGlvbkJ1aWxkZXIKLQkgKiB1c2VzIHRoaXMgc3RyaW5nIGFzIGlucHV0IHRvIHRoZSBJUHJvZ3Jlc3NNb25pdG9yLiBpLmUuLCBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgdmFsaWRhdGlvbgotCSAqIHByb2Nlc3MsIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIgd2lsbCBvdXRwdXQgdGhpcyBzdHJpbmc6ICJ7MH0gaXMgdmFsaWRhdGluZyB7MX0uIiwgd2hlcmUgezB9Ci0JICogaXMgdGhlIHN0cmluZyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMsIGFuZCB7MX0gaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBhcmFtMShTdHJpbmcgc3RyaW5nMSkgewotCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCXBhcm1zWzBdID0gc3RyaW5nMTsKLQkJcmV0dXJuIHBhcm1zOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIERlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBtZXRob2Qgd2hpY2ggcGVyZm9ybXMgdGhlIHZhbGlkYXRpb24gb24gdGhlIE1PRiBtb2RlbC4gPGJyPgotCSAqIDxicj4KLQkgKiA8Y29kZT5oZWxwZXI8L2NvZGU+IGFuZCA8Y29kZT5yZXBvcnRlcjwvY29kZT4gbWF5IG5vdCBiZSBudWxsLiA8Y29kZT5jaGFuZ2VkRmlsZXM8L2NvZGU+Ci0JICogbWF5IGJlIG51bGwsIGlmIGEgZnVsbCBidWlsZCBpcyBkZXNpcmVkLiA8YnI+Ci0JICogPGJyPgotCSAqIDxjb2RlPmhlbHBlcjwvY29kZT4gbG9hZHMgYSBFT2JqZWN0LiBUaGUgRU9iamVjdCBpcyB0aGUgcm9vdCBvZiB0aGUgTU9GIG1vZGVsIGFib3V0IHRvIGJlCi0JICogdmFsaWRhdGVkLiBXaGVuIHRoaXMgb2JqZWN0IGlzIHRyYXZlcnNlZCwgeW91IGNhbiByZWFjaCBldmVyeSBlbGVtZW50IGluIHRoZSBNT0YgbW9kZWwgd2hpY2gKLQkgKiBuZWVkcyB0byBiZSB2YWxpZGF0ZWQuIDxicj4KLQkgKiA8YnI+Ci0JICogPGNvZGU+cmVwb3J0ZXI8L2NvZGU+IGlzIGFuIGluc3RhbmNlIG9mIGFuIElSZXBvcnRlciBpbnRlcmZhY2UsIHdoaWNoIGlzIHVzZWQgZm9yCi0JICogaW50ZXJhY3Rpb24gd2l0aCB0aGUgdXNlci4gPGJyPgotCSAqIDxicj4KLQkgKiA8Y29kZT5jaGFuZ2VkRmlsZXM8L2NvZGU+IGlzIGFuIGFycmF5IG9mIGZpbGUgbmFtZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0Ci0JICogdmFsaWRhdGlvbi4gSWYgPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPiBpcyBudWxsLCBvciBpZiBpdCBpcyBhbiBlbXB0eSBhcnJheSwgdGhlbiBhIGZ1bGwKLQkgKiBidWlsZCBpcyBwZXJmb3JtZWQuIE90aGVyd2lzZSwgdmFsaWRhdGlvbiBvbiBqdXN0IHRoZSBmaWxlcyBsaXN0ZWQgaW4gdGhlIFZlY3RvciBpcwotCSAqIHBlcmZvcm1lZC4KLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCSAgX2hlbHBlciA9IGluSGVscGVyOwotCQkgIF9yZXBvcnRlciA9IGluUmVwb3J0ZXI7Ci0JCSAgaWYgKChpbkhlbHBlciA9PSBudWxsKSB8fCAoaW5SZXBvcnRlciA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQkgIH0JCQotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBpbkhlbHBlciwgSVJlcG9ydGVyIGluUmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQotCQlfaGVscGVyID0gaW5IZWxwZXI7Ci0JCV9yZXBvcnRlciA9IGluUmVwb3J0ZXI7Ci0JCXN0YXR1cyA9IE9LX1NUQVRVUzsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBFSkIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUVKQlJlZk1hbmFkYXRvcnlFbGVtZW50cyhFamJSZWYgZXJlZiwgU3RyaW5nIG93bmVyTmFtZSkgewotCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMl07Ci0JCXBhcm1zWzBdID0gZXJlZi5nZXROYW1lKCk7Ci0JCXBhcm1zWzFdID0gb3duZXJOYW1lOwotCi0JCWlmICgoZXJlZi5nZXROYW1lKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0TmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLQkJCWFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRk5BTUUsIHBhcm1zLCBlcmVmKTsKLQkJaWYgKGVyZWYuaXNTZXRUeXBlKCkpIHsKLQkJCWlmIChlcmVmLmdldFR5cGUoKSA9PSBudWxsKQotCQkJCWFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX0lOVkFMSURfRVJFRlRZUEUsIHBhcm1zKTsKLQkJfSBlbHNlCi0JCQlhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZUWVBFLCBwYXJtcyk7Ci0KLQkJU3RyaW5nIHJlZkhvbWUgPSBlcmVmLmdldEhvbWUoKTsKLQkJaWYgKChyZWZIb21lID09IG51bGwpIHx8IChyZWZIb21lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLQkJCWFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUUsIHBhcm1zLCBlcmVmKTsKLQotCQlpZiAoKGVyZWYuZ2V0UmVtb3RlKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0UmVtb3RlKCkudHJpbSgpLmxlbmd0aCgpID09IDApKQotCQkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FUkVGUkVNT1RFLCBwYXJtcywgZXJlZik7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgZm9yIGR1cGxpY2F0ZXMgaW4gRUFSIFJvbGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVzb3VyY2VSZWZzKExpc3QgcmVzb3VyY2VSZWZzKSB7Ci0KLQkJaW50IG51bVJlZnMgPSByZXNvdXJjZVJlZnMuc2l6ZSgpOwotCQlTZXQgcmVmU2V0ID0gbmV3IEhhc2hTZXQobnVtUmVmcyk7Ci0KLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IG51bVJlZnM7IHJlZk5vKyspIHsKLQkJCVN0cmluZyByZWZOYW1lID0gKChSZXNvdXJjZVJlZkltcGwpIChyZXNvdXJjZVJlZnMuZ2V0KHJlZk5vKSkpLmdldE5hbWUoKTsKLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCXBhcm1zWzBdID0gcmVmTmFtZTsKLQkJCWlmICghKHJlZlNldC5hZGQocmVmTmFtZSkpKQotCQkJCWFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTUkVGLCBwYXJtcywgcmVzb3VyY2VSZWZzLmdldChyZWZObykpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGV4aXN0YW5jZSBvZiBXZWIgUm9sZXMgd2l0aGluIHRoZSBFQVIgUm9sZXMgYW5kIGR1cGxpY2F0ZXMgaW4gV2ViIFJvbGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlV0VCUm9sZXNXaXRoRUFSUm9sZXMoRUxpc3QgZWFyUm9sZUxpc3QsIEVMaXN0IHdhclJvbGVzKSB7Ci0JCWludCBudW1Sb2xlcyA9IHdhclJvbGVzLnNpemUoKTsKLQotCQkvLyBURkIgVGhpcyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyBhICdzbWFsbCcgbGlzdCBvZiB3YXJSb2xlcy4KLQkJLy8gSWYgJ3dhclJvbGVzJyBnZXRzIHRvbyBiaWcgdGhlbiBhbm90aGVyIGltcGxlbWVudGF0aW9uCi0JCS8vIHdpbGwgYmUgbmVjZXNzYXJ5LgotCi0JCWZvciAoaW50IHJvbGVObyA9IDA7IHJvbGVObyA8IG51bVJvbGVzOyByb2xlTm8rKykgewotCQkJaWYoIF9yZXBvcnRlci5pc0NhbmNlbGxlZCgpICl7Ci0JCQkJU3RyaW5nIG1zZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQpOwkJCQotCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQkJCi0JCQlTZWN1cml0eVJvbGVJbXBsIG5leHRSb2xlID0gKFNlY3VyaXR5Um9sZUltcGwpICh3YXJSb2xlcy5nZXQocm9sZU5vKSk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IG5leHRSb2xlLmdldFJvbGVOYW1lKCk7Ci0JCQlpZiAoIShlYXJSb2xlTGlzdC5jb250YWlucyhuZXh0Um9sZSkpKQotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRSwgcGFybXMsIG5leHRSb2xlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXNzYWdlRHJpdmVuQmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXNzYWdlRHJpdmVuQmVhbkNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4OTFkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWVzc2FnZURyaXZlbkJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFCZWFuQ2xhc3NWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX01FU1NBR0VfQkVBTkNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5tYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOLCBKQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0FCU1RSQUNUID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgSVNfUkVNT1RFID0gTkVJVEhFUjsKLQkKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0ZJTkFMID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9QVUJMSUMgPSB0cnVlOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtPTk1FU1NBR0UsIENPTlNUUlVDVE9SX05PUEFSTSwgRUpCQ1JFQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RklOQUxJWkVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgT05NRVNTQUdFLCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJDUkVBVEVfTk9QQVJNLCBFSkJDUkVBVEUsIEVKQlJFTU9WRV9OT1BBUk0sIEZJTkFMSVpFX05PUEFSTX07Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX29uTWVzc2FnZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX29uTWVzc2FnZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkNyZWF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX3NldEVudGl0eUNvbnRleHQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQWN0aXZhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJBY3RpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBhc3NpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBhc3NpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlJlbW92ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkxvYWQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJMb2FkK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiU3RvcmUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJTdG9yZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE0LCBuZXcgU3RyaW5nW117Q0hLSjIwMTQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjEwMytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMSwgbmV3IFN0cmluZ1tde0NIS0oyNDIxK0JFWFQsIENIS0oyNDIxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIyLCBuZXcgU3RyaW5nW117Q0hLSjI0MjIrQkVYVCwgQ0hLSjI0MjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMytCRVhULCBDSEtKMjQyMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNCwgbmV3IFN0cmluZ1tde0NIS0oyNDI0K0JFWFQsIENIS0oyNDI0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI2LCBuZXcgU3RyaW5nW117Q0hLSjI0MjYrQkVYVCwgQ0hLSjI0MjYrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNywgbmV3IFN0cmluZ1tde0NIS0oyNDI3K0JFWFQsIENIS0oyNDI3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI4LCBuZXcgU3RyaW5nW117Q0hLSjI0MjgrQkVYVCwgQ0hLSjI0MjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMStCRVhULCBDSEtKMjQzMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzOSwgbmV3IFN0cmluZ1tde0NIS0oyNDM5K0JFWFQsIENIS0oyNDM5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0NStCRVhULCBDSEtKMjQ0NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0NiwgbmV3IFN0cmluZ1tde0NIS0oyNDQ2K0JFWFQsIENIS0oyNDQ2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQ3LCBuZXcgU3RyaW5nW117Q0hLSjI0NDcrQkVYVCwgQ0hLSjI0NDcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDFfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDFfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAxX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMV9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMV9lamJSZW1vdmUrQkVYVCwgQ0hLSjI1MDFfZWpiUmVtb3ZlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAxX29uTWVzc2FnZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAxX29uTWVzc2FnZStCRVhULCBDSEtKMjUwMV9vbk1lc3NhZ2UrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MiwgbmV3IFN0cmluZ1tde0NIS0oyNDkyK0JFWFQsIENIS0oyNDkyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkzLCBuZXcgU3RyaW5nW117Q0hLSjI0OTMrQkVYVCwgQ0hLSjI0OTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NCtCRVhULCBDSEtKMjQ5NCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2ZpbmFsaXplLCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZmluYWxpemUrQkVYVCwgQ0hLSjI1MDJfZmluYWxpemUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19vbk1lc3NhZ2UsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19vbk1lc3NhZ2UrQkVYVCwgQ0hLSjI1MDNfb25NZXNzYWdlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDVfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDVfZWpiUmVtb3ZlK0JFWFQsIENIS0oyNTA1X2VqYlJlbW92ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9vbk1lc3NhZ2UsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9vbk1lc3NhZ2UrQkVYVCwgQ0hLSjI1MDVfb25NZXNzYWdlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewotCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93RWpiQ3JlYXRlUmV0dXJuVHlwZVJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIG1ldGhvZC5pc1ZvaWQoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5WT0lELCBiZWFuKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLlZPSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCi0JCWlmKChtZXRob2RUeXBlICYgT05NRVNTQUdFKSA9PSBPTk1FU1NBR0UpIHsKLQkJCXZhbGlkYXRlT25NZXNzYWdlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCQ1JFQVRFKSA9PSBFSkJDUkVBVEUpIHsKLQkJCXZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXZhbGlkYXRlRWpiUmVtb3ZlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiBMZXQgdGhlIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0Ci0JCQkvLyB0YWtlIGNhcmUgb2YgaXQuCi0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQkKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0FwcGxpY2F0aW9uRXhjZXB0aW9uKG1ldGhvZCwgYmVhbikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMV9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJSZW1vdmVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzQXBwbGljYXRpb25FeGNlcHRpb24obWV0aG9kLCBiZWFuKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAxX2VqYlJlbW92ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kRXhjZXB0aW9ucygpIHsKLQkJLy8gRG9uJ3QgY2hlY2sgZm9yIENyZWF0ZUV4Y2VwdGlvbgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB2YwotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNob3VsZEJlU3VwZXJUeXBlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKChiZWFuLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHx8IChiZWFuLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQpKXsJCQotCQkJSmF2YUNsYXNzIGpjbGFzcyA9ICgoTWVzc2FnZURyaXZlbiliZWFuKS5nZXRNZXNzYWdpbmdUeXBlKCk7Ci0JCQlpZiggamNsYXNzICE9IG51bGwgKXsKLQkJCQlpZiAoamNsYXNzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFTElTVEVORVIpKXsKLQkJCQkJc3VwZXIudmFsaWRhdGVTaG91bGRCZVN1cGVyVHlwZXModmMsYmVhbixjbGF6eik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uZWpiLmVqYjIwcnVsZXMuaW1wbC5BVHlwZVZSdWxlI3ZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdEV4aXN0KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4sIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZHNXaGljaE11c3RFeGlzdChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotICAgIAlpZigoYmVhbi5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB8fCAoYmVhbi5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEKSl7CQkKLQkJCUphdmFDbGFzcyBqY2xhc3MgPSAoKE1lc3NhZ2VEcml2ZW4pYmVhbikuZ2V0TWVzc2FnaW5nVHlwZSgpOwotLy8JCQlpZiggamNsYXNzICE9IG51bGwgKXsKLS8vCQkJCWlmIChqY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUikpewotLy8JCQkJICAgIHN1cGVyLnZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdEV4aXN0KHZjLCBiZWFuLCBjbGF6eik7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCWlmKCBqY2xhc3MgPT0gbnVsbCB8fCBqY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUikpewotCQkJCSAgICBzdXBlci52YWxpZGF0ZU1ldGhvZHNXaGljaE11c3RFeGlzdCh2YywgYmVhbiwgY2xhenopOwotCQkJfQotCQl9Ci0gICAgICAKLSAgICB9Ci0JcHVibGljIHZvaWQgdmFsaWRhdGVPbk1lc3NhZ2VNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDM5NiA9IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTUuNy40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQ1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk3ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIFJlYWQgc2VjdGlvbiAxNS43LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQ2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk4ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiBSZWFkIHNlY3Rpb24gMTUuNy40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk5ID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gUmVhZCBzZWN0aW9uIDE1LjcuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDQwMCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuIFJlYWQgc2VjdGlvbiAxNS43LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIW1ldGhvZC5pc1ZvaWQoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA1X29uTWVzc2FnZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0FwcGxpY2F0aW9uRXhjZXB0aW9uKG1ldGhvZCwgYmVhbikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMV9vbk1lc3NhZ2UsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfb25NZXNzYWdlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWVzc2FnZVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxNjRhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWVzc2FnZVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VVdGlsaXR5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19NRVNTQUdFX0lEID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlVXRpbGl0eSBpbnN0ID0gbnVsbDsKLQotCXByaXZhdGUgTWVzc2FnZVV0aWxpdHkoKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1lc3NhZ2VVdGlsaXR5IGdldFV0aWxpdHkoKSB7Ci0JCWlmKGluc3QgPT0gbnVsbCkgewotCQkJaW5zdCA9IG5ldyBNZXNzYWdlVXRpbGl0eSgpOwotCQl9Ci0JCXJldHVybiBpbnN0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHcm91cE5hbWUoT2JqZWN0IHRhcmdldFBhcmVudCkgewotCQlpZih0YXJnZXRQYXJlbnQgPT0gbnVsbCkgewotCQkJLy8gTm8gY29udGV4dCB0byBhc3NvY2lhdGUgdGhlIG1lc3NhZ2Ugd2l0aAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vIFNvIGZhciwgdGhlIG9ubHkgdGFyZ2V0IHBhcmVudCB3aGljaCBpcyB1c2VkIGFzIGEgZ3JvdXAgbmFtZSBpcyB0aGUgRW50ZXJwcmlzZUJlYW4KLQkJaWYodGFyZ2V0UGFyZW50IGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pIHsKLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pdGFyZ2V0UGFyZW50OwotCQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCWlmKGJlYW4uZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gYmVhbi5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gKChYTUlSZXNvdXJjZSliZWFuLmVSZXNvdXJjZSgpKS5nZXRJRChiZWFuKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWVzc2FnZUlkKE9iamVjdCBtZXNzYWdlTnVtYmVyLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihtZXNzYWdlTnVtYmVyID09IG51bGwpIHsKLQkJCXJldHVybiBOT19NRVNTQUdFX0lEOwotCQl9Ci0JCQotCQlNYXAgaWRzID0gcnVsZS5nZXRNZXNzYWdlSWRzKCk7Ci0JCWlmKChpZHMgPT0gbnVsbCkgfHwgKGlkcy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCWludCBpbmRleCA9IC0xOwotCi0JCVN0cmluZ1tdIHJlc3VsdCA9IChTdHJpbmdbXSlpZHMuZ2V0KG1lc3NhZ2VOdW1iZXIpOwotCQlpZihyZXN1bHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJfQotCQllbHNlIGlmKHJlc3VsdC5sZW5ndGggPT0gMSkgewotCQkJaWYocmVzdWx0WzBdLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0WzBdOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gQnkgY29udmVudGlvbiwgdGhpcyBpcyB0aGUgb3JkZXIgb2YgdGhlIGVudHJpZXMgaW4gdGhlIFN0cmluZ1tdCi0JCQlpZihiZWFuLmlzU2Vzc2lvbigpKSB7Ci0JCQkJaW5kZXggPSAwOwotCQkJfQotCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJaW5kZXggPSAxOwotCQkJfQotCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCWluZGV4ID0gMjsKLQkJCX0KLQkJCWVsc2UgaWYoYmVhbi5pc01lc3NhZ2VEcml2ZW4oKSkgewotCQkJCWluZGV4ID0gMzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdoYXQgdGhlIGhlY2sgaXMgaXQ/Ci0JCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkKLQkJCWlmKChyZXN1bHQubGVuZ3RoIDw9IGluZGV4KSB8fCAocmVzdWx0W2luZGV4XS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJlc3VsdFtpbmRleF07Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBVc2UgdGhpcyBtZXRob2Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBub3QgcmVnaXN0ZXJlZCBvbiBhIG1ldGhvZC4KLQkgKi8JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlSWQoT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCWlmKG1lc3NhZ2VOdW1iZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5PX01FU1NBR0VfSUQ7Ci0JCX0KLQkJCi0JCU1hcCBpZHMgPSBydWxlLmdldE1lc3NhZ2VJZHMoKTsKLQkJaWYoKGlkcyA9PSBudWxsKSB8fCAoaWRzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJfQotCQkKLQkJU3RyaW5nW10gcmVzdWx0ID0gKFN0cmluZ1tdKWlkcy5nZXQobWVzc2FnZU51bWJlcik7Ci0JCWlmKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5sZW5ndGggPT0gMCkgfHwgKHJlc3VsdFswXS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbWVzc2FnZU51bWJlci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCQotCS8qCi0JICogVXNlIHRoaXMgbWV0aG9kIHdoZW4gdGhlIG1lc3NhZ2UgaXMgcmVnaXN0ZXJlZCBvbiBhIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1lc3NhZ2VJZChPYmplY3QgbWVzc2FnZU51bWJlciwgSVZhbGlkYXRpb25SdWxlIHJ1bGUsIGJvb2xlYW4gaXNNZXRob2RPbkNsYXNzKSB7Ci0JCWlmKG1lc3NhZ2VOdW1iZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5PX01FU1NBR0VfSUQ7Ci0JCX0KLQkJCi0JCU1hcCBpZHMgPSBydWxlLmdldE1lc3NhZ2VJZHMoKTsKLQkJaWYoKGlkcyA9PSBudWxsKSB8fCAoaWRzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJfQotCQkKLQkJU3RyaW5nW10gbWVzc2FnZXMgPSAoU3RyaW5nW10paWRzLmdldChtZXNzYWdlTnVtYmVyKTsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmKG1lc3NhZ2VzICE9IG51bGwpIHsKLQkJCWlmKGlzTWV0aG9kT25DbGFzcyAmJiBtZXNzYWdlcy5sZW5ndGggPT0gMikgewotCQkJCXJlc3VsdCA9IG1lc3NhZ2VzWzFdOwotCQkJfQotCQkJZWxzZSBpZiAobWVzc2FnZXMubGVuZ3RoID49IDEpIHsKLQkJCQlyZXN1bHQgPSBtZXNzYWdlc1swXTsKLQkJCX0KLQkJfQotCQkKLQkJaWYoKHJlc3VsdCA9PSBudWxsKSB8fCAocmVzdWx0LmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgaW50IHNldmVyaXR5LCBTdHJpbmcgaWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSB2Yy5nZXRNZXNzYWdlKCk7Ci0JCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCQltZXNzYWdlLnNldElkKGlkKTsKLQkJbWVzc2FnZS5zZXRQYXJhbXMocGFybXMpOwotCQltZXNzYWdlLnNldFRhcmdldE9iamVjdCh0YXJnZXQpOwotCQltZXNzYWdlLnNldEdyb3VwTmFtZShncm91cE5hbWUpOwotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi0JLyoqIAotCSAqIEZvciB1c2Ugb25seSBieSB0aGUgREQgVlJ1bGVzLgotCSAqLwotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRUpCSmFyIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgU2VjdXJpdHlSb2xlIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgU2VjdXJpdHlSb2xlUmVmIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgTWV0aG9kRWxlbWVudCB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIE1ldGhvZFRyYW5zYWN0aW9uIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgTWV0aG9kUGVybWlzc2lvbiB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVKQlJlbGF0aW9uc2hpcFJvbGUgdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRUpCUmVsYXRpb24gdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBBc3NlbWJseURlc2NyaXB0b3IgdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JLyoqIAotCSAqIEZvciB1c2Ugb25seSBieSB0aGUgREQgVlJ1bGVzLgotCSAqLwotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRUpCSmFyIHRhcmdldCwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBNZXRob2RFbGVtZW50IHRhcmdldCwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFSkJSZWxhdGlvbnNoaXBSb2xlIHRhcmdldCwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBTZWN1cml0eVJvbGVSZWYgdGFyZ2V0LCBTdHJpbmdbXSBwYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBwYXJtcywgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVKQlJlbGF0aW9uIHRhcmdldCwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBPYmplY3QgdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgZ2V0R3JvdXBOYW1lKGJlYW4pKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIE9iamVjdCB0YXJnZXQsIFN0cmluZ1tdIHBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIHBhcm1zLCB0YXJnZXQsIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgYmVhbiwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIGJlYW4sIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBTdHJpbmdbXSBwYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIGJlYW4sIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBwYXJtcywgYmVhbiwgZ2V0R3JvdXBOYW1lKGJlYW4pKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCBjbGF6eiwgZ2V0R3JvdXBOYW1lKGJlYW4pKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgU3RyaW5nW10gYWRkaXRpb25hbFBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIGFkZGl0aW9uYWxQYXJtcywgY2xhenosIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBiZWFuLCBjbGF6eiwgcnVsZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgbnVsbCwgY2xhenosIG1ldGhvZCwgbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm9uQ2xhc3MoY2xhenosIG1ldGhvZCksIGdldEdyb3VwTmFtZShiZWFuKSwgcnVsZSk7Ci0JfQotCQkKLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgU3RyaW5nW10gYWRkaXRpb25hbFBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBiZWFuLCBjbGF6eiwgYWRkaXRpb25hbFBhcm1zLCBydWxlKTsKLQkJfQotCQkKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBhZGRpdGlvbmFsUGFybXMsIGNsYXp6LCBtZXRob2QsIG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBtZXRob2QpLCBnZXRHcm91cE5hbWUoYmVhbiksIHJ1bGUpOwotCX0KLQkJCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0TWVzc2FnZSh2YywgbWVzc2FnZU51bWJlciwgc2V2ZXJpdHksIGJlYW4sIGNsYXp6LCBydWxlKTsKLQkJfQotCQkKLQkJLy9yZXR1cm4gZ2V0TWVzc2FnZSh2YywgbWVzc2FnZU51bWJlciwgc2V2ZXJpdHksIG51bGwsIGNsYXp6LCBmaWVsZCwgZmllbGQuZ2V0TmFtZSgpLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkub25DbGFzcyhjbGF6eiwgZmllbGQpLCBnZXRHcm91cE5hbWUoYmVhbiksIHJ1bGUpOwotCQlTdHJpbmcgW10gYWRkaXRpb25hbFBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJYWRkaXRpb25hbFBhcm1zWzBdID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpLmdldEphdmFOYW1lKCk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgYWRkaXRpb25hbFBhcm1zLCBjbGF6eiwgZmllbGQsIGZpZWxkLmdldE5hbWUoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm9uQ2xhc3MoY2xhenosIGZpZWxkKSwgZ2V0R3JvdXBOYW1lKGJlYW4pLCBydWxlKTsKLQl9Ci0JCQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgU3RyaW5nW10gYWRkaXRpb25hbFBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0TWVzc2FnZSh2YywgbWVzc2FnZU51bWJlciwgc2V2ZXJpdHksIGJlYW4sIGNsYXp6LCBhZGRpdGlvbmFsUGFybXMsIHJ1bGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2YywgbWVzc2FnZU51bWJlciwgc2V2ZXJpdHksIGFkZGl0aW9uYWxQYXJtcywgY2xhenosIGZpZWxkLCBmaWVsZC5nZXROYW1lKCksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBmaWVsZCksIGdldEdyb3VwTmFtZShiZWFuKSwgcnVsZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgU3RyaW5nW10gYWRkaXRpb25hbFBhcm1zLCBKYXZhQ2xhc3MgY2xhenosIEVPYmplY3QgZmllbGRPck1ldGhvZCwgU3RyaW5nIGZpZWxkT3JNZXRob2ROYW1lLCBib29sZWFuIGlzTWV0aG9kT25DbGFzcywgU3RyaW5nIGdyb3VwTmFtZSwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYoZmllbGRPck1ldGhvZCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBhZGRpdGlvbmFsUGFybXMsIGNsYXp6LCBncm91cE5hbWUpOwotCQl9Ci0JCQotCQlTdHJpbmdbXSBwYXJtcyA9IG51bGw7Ci0JCUVPYmplY3QgdGFyZ2V0ID0gbnVsbDsKLQkJaWYoaXNNZXRob2RPbkNsYXNzKSB7Ci0JCQkvLyBsZWF2ZSBwYXJtcyBudWxsIHNpbmNlIG5vIHBhcm1zIGFyZSBuZWVkZWQKLQkJCXRhcmdldCA9IGZpZWxkT3JNZXRob2Q7Ci0JCQlwYXJtcyA9IGFkZGl0aW9uYWxQYXJtczsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGFkZGl0aW9uYWxQYXJtcyA9PSBudWxsKSB7Ci0JCQkJcGFybXMgPSBuZXcgU3RyaW5nW117ZmllbGRPck1ldGhvZE5hbWV9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFybXMgPSBuZXcgU3RyaW5nW2FkZGl0aW9uYWxQYXJtcy5sZW5ndGggKyAxXTsKLQkJCQlwYXJtc1swXSA9IGZpZWxkT3JNZXRob2ROYW1lOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYWRkaXRpb25hbFBhcm1zLCAwLCBwYXJtcywgMSwgYWRkaXRpb25hbFBhcm1zLmxlbmd0aCk7Ci0JCQl9Ci0JCQl0YXJnZXQgPSBjbGF6ejsKLQkJfQotCi0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlLCBpc01ldGhvZE9uQ2xhc3MpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBwYXJtcywgdGFyZ2V0LCBncm91cE5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXRob2RVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWV0aG9kVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTlkNmE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXRob2RVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgTWV0aG9kVXRpbGl0eSB7Ci0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kVXRpbGl0eSBfaW5zdCA9IG51bGw7Ci0JcHJpdmF0ZSBsb25nW10gX21ldGhvZFR5cGVJbmRleDsKLQlwcml2YXRlIElNZXRob2RUeXBlW10gX21ldGhvZFR5cGVzOwotCXByaXZhdGUgbG9uZ1tdIF9maWVsZFR5cGVJbmRleDsKLQlwcml2YXRlIElGaWVsZFR5cGVbXSBfZmllbGRUeXBlczsKLQkKLQlwcml2YXRlIE1ldGhvZFV0aWxpdHkoKSB7Ci0JCWJ1aWxkVHlwZUxpc3QoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RVdGlsaXR5IGdldFV0aWxpdHkoKSB7Ci0JCWlmKF9pbnN0ID09IG51bGwpIHsKLQkJCV9pbnN0ID0gbmV3IE1ldGhvZFV0aWxpdHkoKTsKLQkJfQotCQlyZXR1cm4gX2luc3Q7Ci0JfQotCQotCXByb3RlY3RlZCBJTWV0aG9kVHlwZVtdIGdldE1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gX21ldGhvZFR5cGVzOwotCX0KLQotCXB1YmxpYyBJRmllbGRUeXBlIGdldEZpZWxkVHlwZShsb25nIHR5cGUpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChfZmllbGRUeXBlSW5kZXgsIHR5cGUpOwotCQlpZihpbmRleCA+IF9maWVsZFR5cGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmKGluZGV4IDwgMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmKF9maWVsZFR5cGVzW2luZGV4XS5nZXRJZCgpICE9IHR5cGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gX2ZpZWxkVHlwZXNbaW5kZXhdOwotCX0KLQotCXB1YmxpYyBJTWV0aG9kVHlwZSBnZXRNZXRob2RUeXBlKGxvbmcgdHlwZSkgewotCQlpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKF9tZXRob2RUeXBlSW5kZXgsIHR5cGUpOwotCQlpZihpbmRleCA+IF9tZXRob2RUeXBlcy5sZW5ndGgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihfbWV0aG9kVHlwZXNbaW5kZXhdLmdldElkKCkgIT0gdHlwZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBfbWV0aG9kVHlwZXNbaW5kZXhdOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXRNZXRob2RUeXBlSWQoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMsIElFSkJUeXBlIHJ1bGUpIHsKLQkJSU1ldGhvZFR5cGUgbVR5cGUgPSBnZXRNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCBydWxlKTsKLQkJaWYobVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHJ1bGUuZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG1UeXBlLmdldElkKCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0RmllbGRUeXBlSWQoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgSUVKQlR5cGUgcnVsZSkgewotCQlJRmllbGRUeXBlIG1UeXBlID0gZ2V0RmllbGRUeXBlKGJlYW4sIGNsYXp6LCBmaWVsZCwgcnVsZSk7Ci0JCWlmKG1UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRVhDTFVERURfRklFTEQ7Ci0JCX0KLQkJCi0JCXJldHVybiBtVHlwZS5nZXRJZCgpOwotCX0KLQkKLQlwdWJsaWMgSUZpZWxkVHlwZSBnZXRGaWVsZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgSUVKQlR5cGUgcnVsZSkgewotCQlJRmllbGRUeXBlW10ga25vd25GaWVsZFR5cGVzID0gX2ZpZWxkVHlwZXM7Ci0JCWlmKGtub3duRmllbGRUeXBlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJZm9yKGludCBpPTA7IGk8a25vd25GaWVsZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmllbGRUeXBlIG10ID0ga25vd25GaWVsZFR5cGVzW2ldOwotCQkJaWYobXQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZihtdC5pc0ZpZWxkVHlwZShiZWFuLCBjbGF6eiwgZmllbGQpKSB7Ci0JCQkJcmV0dXJuIG10OwotCQkJfQotCQl9Ci0JCQotCQkvLyBJZiBpdCdzIG5vdCBvbmUgb2YgdGhlIHJlY29nbml6ZWQgbWV0aG9kcywgd2hpY2ggZHluYW1pY2FsbHktbmFtZWQKLQkJLy8gbWV0aG9kIHR5cGUgaXMgaXQ/Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSU1ldGhvZFR5cGUgZ2V0TWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cywgSUVKQlR5cGUgcnVsZSkgewotCQlsb25nW10ga25vd25NZXRob2RUeXBlcyA9IHJ1bGUuZ2V0S25vd25NZXRob2RUeXBlcygpOwotCQlpZihrbm93bk1ldGhvZFR5cGVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlmb3IoaW50IGk9MDsgaTxrbm93bk1ldGhvZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWV0aG9kVHlwZSBtdCA9IGdldE1ldGhvZFR5cGUoa25vd25NZXRob2RUeXBlc1tpXSk7Ci0JCQlpZihtdCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmKG10LmlzRGVmYXVsdFR5cGUoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZihtdC5pc01ldGhvZFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpKSB7Ci0JCQkJcmV0dXJuIG10OwotCQkJfQotCQl9Ci0JCQotCQkvLyBJZiBpdCdzIG5vdCBvbmUgb2YgdGhlIHJlY29nbml6ZWQgbWV0aG9kcywgd2hpY2ggZHluYW1pY2FsbHktbmFtZWQKLQkJLy8gbWV0aG9kIHR5cGUgaXMgaXQ/Ci0JCXJldHVybiBnZXRNZXRob2RUeXBlKHJ1bGUuZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFR5cGVMaXN0KCkgewotCQlpbnQgdHlwZUNvdW50ID0gMjk7IC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBpZGVudGlmaWFibGUgbWV0aG9kcyBpbiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMKLQkJX21ldGhvZFR5cGVJbmRleCA9IG5ldyBsb25nW3R5cGVDb3VudF07Ci0JCV9tZXRob2RUeXBlcyA9IG5ldyBJTWV0aG9kVHlwZVt0eXBlQ291bnRdOwotCQlpbnQgY291bnQgPSAwOwotCQkKLQkJaW50IGZpZWxkVHlwZUNvdW50ID0gMTsgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGlkZW50aWZpYWJsZSBmaWVsZHMgaW4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzCi0JCV9maWVsZFR5cGVJbmRleCA9IG5ldyBsb25nW2ZpZWxkVHlwZUNvdW50XTsKLQkJX2ZpZWxkVHlwZXMgPSBuZXcgSUZpZWxkVHlwZVtmaWVsZFR5cGVDb3VudF07Ci0JCWludCBmaWVsZENvdW50ID0gMDsKLQkJCi0JCS8vIFRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgbG9uZ1tdIGlzIGVxdWFsIHRvIHRoZQotCQkvLyBpbmRleCBvZiB0aGUgSU1ldGhvZFR5cGUgaW4gdGhlIElNZXRob2RUeXBlW10uIEJ5IHVzaW5nCi0JCS8vIHRoaXMgdGVjaG5pcXVlIGluc3RlYWQgb2YgYSBIYXNoTWFwLCB3ZSBkb24ndCBuZWVkIHRvCi0JCS8vIGNyZWF0ZSBhbiBJbnRlZ2VyIGV2ZXJ5IHRpbWUgd2UgbmVlZCB0byBsb2NhdGUgdGhlIAotCQkvLyBJTWV0aG9kVHlwZS4KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQUNDRVNTT1I7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQUNDRVNTT1I7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gIiI7IC8vIHRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfYWNjOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGV4aXN0cwotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJBQ0NFU1NPUjo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQUNDRVNTT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQUNDRVNTT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQUNDRVNTT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5CVVNJTkVTUzsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5CVVNJTkVTUzsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbWV0aG9kLmdldE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJLy8gTmV2ZXIgY2hlY2sgdG8gc2VlIGlmIGEgYnVzaW5lc3MgbWV0aG9kIGlzIG1pc3NpbmcKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQlVTSU5FU1M6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgYSBidXNpbmVzcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJCVVNJTkVTUzo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19idXM7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2J1c2luZXNzOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMF9idXNpbmVzczsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQkvLyBJdCdzIGEgYnVzaW5lc3MgbWV0aG9kIGlmIGl0J3MgZXhwb3NlZCBvbiB0aGUgY29tcG9uZW50IGludGVyZmFjZS4KLQkJCQkvLyBIQUNLIC4uLiBkZXBlbmRzIG9uIHRoZSBmYWN0IHRoYXQgQUJlYW5DbGFzc1ZSdWxlLCBhbmQgaXRzIHN1YnR5cGVzLCBhcmUgdGhlIG9ubHkgY2xhc3NlcyB0aGF0IHdpbGwgZXZlciBoYXZlIGEgQlVTSU5FU1MgbWV0aG9kLgotCQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBtZXRob2QuZ2V0TmFtZSgpLCBBQmVhbkNsYXNzVlJ1bGUuZ2V0UmVtb3RlQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0vLwkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSwgQUJlYW5DbGFzc1ZSdWxlLmdldFJlbW90ZUNvbXBvbmVudE1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpICE9IG51bGwpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSwgQUJlYW5DbGFzc1ZSdWxlLmdldExvY2FsQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gaW50ZXJuYWwgaGVscGVyIG1ldGhvZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DTElOSVQ7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ0xJTklUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjbGluaXQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCS8vIE5ldmVyIGNoZWNrIHRvIHNlZSBpZiA8Y2xpbml0PiBpcyBtaXNzaW5nCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ0xJTklUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDTElOSVQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoIjxjbGluaXQ+IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQkJCi0JCS8vIEJlIGNhcmVmdWwgdG8ga2VlcCB0aGUgb3JkZXIgb2YgdGhlc2UgZGVjbGFyYXRpb25zIHRoZSBzYW1lIGFzIHRoZXkgYXJlIGluIAotCQkvLyBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuIEVhY2ggbWV0aG9kIHR5cGUgaXMgYW4gYXNjZW5kaW5nIG51bWJlciwgYW5kIGlmIHRoZXkKLQkJLy8gZ28gb3V0IG9mIG9yZGVyLCB0aGUgYmluYXJ5IHNlYXJjaCBjYW4ndCBmaW5kIHRoZSBtZXRob2QgdHlwZS4KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1I7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1I7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gY2xhenouZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9jb25zdHI7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ09OU1RSVUNUT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1JfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiBjbGF6ei5nZXROYW1lKCkgKyAiKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2NvbnN0cjsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDT05TVFJVQ1RPUl9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDT05TVFJVQ1RPUl9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ09OU1RSVUNUT1JfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQkJLy8gVGhpcyBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aGljaCB0YWtlcyBubyBwYXJhbWV0ZXJzLiBSZWFkIHNlY3Rpb24gNy4xMC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQkJCQlpZihtZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DUkVBVEU7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ1JFQVRFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjcmVhdGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2NyZWF0ZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNF9jcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2NyZWF0ZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCQkKLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ1JFQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DUkVBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjcmVhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfY3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNSRUFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2NyZWF0ZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDBfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCQkKLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCQUNUSVZBVEVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkFDVElWQVRFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiQWN0aXZhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQWN0aXZhdGU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQUNUSVZBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJBQ1RJVkFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQUNUSVZBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkFDVElWQVRFX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJBQ1RJVkFURSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkNSRUFURTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJDUkVBVEU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImVqYkNyZWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQ3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkNSRUFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMF9lamJDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCQ1JFQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJDUkVBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJDcmVhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQ3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkNSRUFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiQ3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQ1JFQVRFX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJDUkVBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpKSB7Ci0JCQkJCWlmKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJGSU5EOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkZJTkQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYkZpbmQiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9lamJGaW5kOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZWpiRmluZDsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYkZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJGSU5EOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDBfZWpiRmluZDsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkZJTkQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkZJTkRCWVBSSU1BUllLRVk7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCRklOREJZUFJJTUFSWUtFWTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJlamJGaW5kQnlQcmltYXJ5S2V5KCIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHBrTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYoYmVhbiBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCQlKYXZhQ2xhc3MgcGsgPSAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCQkJCXBrTmFtZSA9ICgocGsgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUFJJTUFSWV9LRVkgOiBway5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKHBrTmFtZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXk7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCRklOREJZUFJJTUFSWUtFWTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJGaW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCRklOREJZUFJJTUFSWUtFWTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJGSU5EQllQUklNQVJZS0VZOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9FSkJGSU5EKSkgewotCQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJGSU5EQllQUklNQVJZS0VZKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJIT01FOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkhPTUU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYkhvbWUiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9lamJIb21lOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkhPTUU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiSG9tZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkhPTUU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMF9lamJIb21lOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCSE9NRSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCTE9BRF9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCTE9BRF9OT1BBUk07Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImVqYkxvYWQoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiTG9hZDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJMT0FEOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJMT0FEOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkxPQUQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCTE9BRDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJMT0FEKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUEFTU0lWQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJQQVNTSVZBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJQYXNzaXZhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiUGFzc2l2YXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBBU1NJVkFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUEFTU0lWQVRFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBBU1NJVkFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJQQVNTSVZBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUEFTU0lWQVRFKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUE9TVENSRUFURTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJQT1NUQ1JFQVRFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJQb3N0Q3JlYXRlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQkvLyBDYW4gb25seSBkeW5hbWljYWxseSBjaGVjayBpZiBlamJQb3N0Q3JlYXRlIGlzIG1pc3NpbmcsIAotCQkJCS8vIGJhc2VkIG9uIHdoYXQgdHlwZSBvZiBlamJDcmVhdGUgbWV0aG9kcyBleGlzdC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUE9TVENSRUFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBPU1RDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYlBvc3RDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJQT1NUQ1JFQVRFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBPU1RDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlJFTU9WRV9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUkVNT1ZFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiUmVtb3ZlKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYlJlbW92ZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJSRU1PVkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlJFTU9WRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJSRU1PVkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUkVNT1ZFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlJFTU9WRSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlNFTEVDVDsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJTRUxFQ1Q7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYlNlbGVjdCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYlNlbGVjdDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZWpiU2VsZWN0OwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNFTEVDVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJTRUxFQ1Q6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCU0VMRUNUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQlNFTEVDVCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCU1RPUkVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlNUT1JFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiU3RvcmUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiU3RvcmU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCU1RPUkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlNUT1JFKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRVFVQUxTOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVRVUFMUzsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZXF1YWxzKE9iamVjdCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VxdWFsczsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFUVVBTFM6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVRVUFMUzo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFUVVBTFM6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRVFVQUxTOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FUVVBTFMpKSB7Ci0JCQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJtID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUphdmFIZWxwZXJzIG9iamVjdCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBiZWFuKTsKLQkJCQkJCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IHBhcm1bMF0uZ2V0SmF2YVR5cGUoKTsKLQkJCQkJCQkKLQkJCQkJCQlpZihvYmplY3QuZXF1YWxzKHBhcm1UeXBlKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkQ7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklORDsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAiZmluZCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2ZpbmQ7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklORDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19maW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GSU5EKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSU5EQllQUklNQVJZS0VZOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkRCWVBSSU1BUllLRVk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImZpbmRCeVByaW1hcnlLZXkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXk7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19maW5kOwotCQkJfSAKLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNF9maW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GSU5EKSkgewotCQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklOQUxJWkVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkFMSVpFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZmluYWxpemUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJLy8gTmV2ZXIgY2hlY2sgdG8gc2VlIGlmIGZpbmFsaXplIGlzIG1pc3NpbmcKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZmluYWxpemU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOQUxJWkUpKSB7Ci0JCQkJCWlmKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0wKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkhBU0hDT0RFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5IQVNIQ09ERV9OT1BBUk07Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImhhc2hDb2RlKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2hhc2hDb2RlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkhBU0hDT0RFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9IQVNIQ09ERSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5IT01FOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkhPTUU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImhvbWUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2hvbWU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiSE9NRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19ob21lOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2hvbWU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2hvbWU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5PTk1FU1NBR0U7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuT05NRVNTQUdFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJvbk1lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX29uTWVzc2FnZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJPTk1FU1NBR0U6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIk9OTUVTU0FHRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJPTk1FU1NBR0U6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiT05NRVNTQUdFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX09OTUVTU0FHRSkpIHsKLQkJCQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtcy5sZW5ndGggPT0gMSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlKYXZhSGVscGVycyBqbXNNZXNzYWdlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFLCBiZWFuKTsKLQkJCQkJCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IHBhcm1zWzBdLmdldEphdmFUeXBlKCk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYoam1zTWVzc2FnZS5lcXVhbHMocGFybVR5cGUpKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuU0VURU5USVRZQ09OVEVYVDsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVRFTlRJVFlDT05URVhUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJzZXRFbnRpdHlDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0OwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiU0VURU5USVRZQ09OVEVYVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJTRVRFTlRJVFlDT05URVhUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1NFVEVOVElUWUNPTlRFWFQpKSB7Ci0JCQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJtID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUphdmFIZWxwZXJzIGVudGl0eUNvbnRleHQgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VOVElUWUNPTlRFWFQsIGJlYW4pOwotCQkJCQkJCUphdmFIZWxwZXJzIHBhcm1UeXBlID0gcGFybVswXS5nZXRKYXZhVHlwZSgpOwotCQkJCQkJCQotCQkJCQkJCWlmKGVudGl0eUNvbnRleHQuZXF1YWxzKHBhcm1UeXBlKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlVOU0VURU5USVRZQ09OVEVYVF9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuVU5TRVRFTlRJVFlDT05URVhUX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAidW5zZXRFbnRpdHlDb250ZXh0KCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJVTlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlVOU0VURU5USVRZQ09OVEVYVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJVTlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiVU5TRVRFTlRJVFlDT05URVhUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1VOU0VURU5USVRZQ09OVEVYVCkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9maWVsZFR5cGVJbmRleFtmaWVsZENvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlEOwotCQlfZmllbGRUeXBlc1tmaWVsZENvdW50KytdID0gbmV3IElGaWVsZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlNFUklBTFZFUlNJT05VSUQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRmllbGRUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHsKLQkJCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklFTEROQU1FX1NFUklBTFZFUlNJT05VSUQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vUm9sZUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1JvbGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0NDZhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vUm9sZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBjb3B5IG9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5jb2RlZ2VuLmhlbHBlcnMuUm9sZUhlbHBlci4KLSAqIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5jb2RlZ2VuLmhlbHBlcnMuUm9sZUhlbHBlciBjYW5ub3QgYmUgdXNlZAotICogZGlyZWN0bHkgYnkgdGhlIEVKQiBWYWxpZGF0b3IgKHRvIGNhbGN1bGF0ZSByb2xlIG1ldGhvZCBuYW1lcykgYmVjYXVzZQotICogaXQgdXNlcyBjbGFzc2VzIHdoaWNoIGFyZSBub3QgdXNlZCBieSBXZWJTcGhlcmUuIFVudGlsIHRoZSBsb25nLXRlcm0KLSAqIGZpeCBjYW4gYmUgcHV0IGluLCB0aGlzIGNsYXNzIHdpbGwgYmUgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIFJvbGVIZWxwZXIgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0dFVFRFUl9OQU1FX1BBVFRFUk4gPSAiZ2V0ezB9S2V5IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VUVEVSX05BTUVfUEFUVEVSTiA9ICJwcml2YXRlU2V0ezB9S2V5IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0dFVFRFUl9OQU1FX1BBVFRFUk4gPSAiZ2V0ezB9TGluayI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX05BTUVfUFJFRklYID0gImFkZCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUVEVSX05BTUVfUFJFRklYID0gImdldCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9OQU1FX1BSRUZJWCA9ICJyZW1vdmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09OREFSWV9BRERfTkFNRV9QUkVGSVggPSAic2Vjb25kYXJ5QWRkIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRBUllfUkVNT1ZFX05BTUVfUFJFRklYID0gInNlY29uZGFyeVJlbW92ZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX1NFVFRFUl9OQU1FX1BSRUZJWCA9ICJzZWNvbmRhcnlTZXQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRFUl9OQU1FX1BSRUZJWCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBtb2RIZWxwZXI7Ci0vKioKLSAqIFJvbGVIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFJvbGVIZWxwZXIoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogQ29sbGVjdCB0aGUgbmFtZXMgb2YgdGhlIG1ldGhvZHMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZSBiZWFuIGNsYXNzCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHJvbGUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0Um9sZU1ldGhvZE5hbWVzKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUsIExpc3QgYUxpc3QpIHsKLQlpZiAoYVJvbGUgPT0gbnVsbCB8fCBhTGlzdCA9PSBudWxsKSByZXR1cm47Ci0JYUxpc3QuYWRkKGdldExpbmtHZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JaWYgKGFSb2xlLmlzRm9yd2FyZCgpKSB7Ci0JCWFMaXN0LmFkZChnZXRLZXlHZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCWFMaXN0LmFkZChnZXRLZXlTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JfQotCWlmIChhUm9sZS5pc05hdmlnYWJsZSgpKQotCQlhTGlzdC5hZGQoZ2V0R2V0dGVyTmFtZShhUm9sZSkpOwotCWlmICghaXNNYW55KGFSb2xlKSkgewotCQl0cnkgewotCQkJaWYoYVJvbGUuZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpLmlzS2V5KCkpCi0JCQkJCWFMaXN0LmFkZChnZXRTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCQkJaWYgKCFhUm9sZS5pc0tleSgpKSB7Ci0JCQkJCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJLy8gSWYgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBjYXVnaHQsIGFzc3VtZSB0aGF0IHRoZSByb2xlIGlzbid0IGEga2V5LgotCQkJLy8gSnVzdCBjb250aW51ZS4KLQkJfQotCX0gZWxzZSB7Ci0JCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlBZGROYW1lKGFSb2xlKSk7Ci0JCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlSZW1vdmVOYW1lKGFSb2xlKSk7Ci0JCWlmIChhUm9sZS5pc05hdmlnYWJsZSgpKSB7Ci0JCQl0cnkgewotCQkJCWlmKGFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkgIT0gbnVsbCkgewotCQkJCQlpZiAoIWFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuaXNLZXkoKSkgewotCQkJCQkJYUxpc3QuYWRkKGdldEFkZE5hbWUoYVJvbGUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIElmIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duLCBqdXN0IGFzc3VtZSB0aGF0IHRoZSBvcHBvc2l0ZSBpc24ndCBhIGtleS4KLQkJCX0KLQkJCWlmIChhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpICE9IG51bGwgJiYgIWFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuaXNSZXF1aXJlZCgpKQotCQkJCWFMaXN0LmFkZChnZXRSZW1vdmVOYW1lKGFSb2xlKSk7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFJldHVybiBhU3RyaW5nIHdoZXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgdXBwZXJjYXNlZC4KLSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmlyc3RBc1VwcGVyY2FzZShTdHJpbmcgYVN0cmluZykgewotCWlmIChhU3RyaW5nICE9IG51bGwgJiYgYVN0cmluZy5sZW5ndGgoKSA+MCAmJiAhQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGFTdHJpbmcuY2hhckF0KDApKSkgewotCQljaGFyW10gY2hhcnMgPSBhU3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWNoYXJzWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoYXJzWzBdKTsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoYXJzKTsKLQl9Ci0JcmV0dXJuIGFTdHJpbmc7Ci19Ci1wcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZ1tdIHJlcGxhY2VtZW50cykgewotCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgcmVwbGFjZW1lbnRzKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBhZGQgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAiYWRke2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogYWRkRGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWRkTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIEFERF9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBnZXR0ZXIgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAiZ2V0e2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogZ2V0RGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIEdFVFRFUl9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBrZXkgZ2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgImdldHthUm9sZSBuYW1lfUtleSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIGdldERlcGFydG1lbnRLZXkuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleUdldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBmb3JtYXQoS0VZX0dFVFRFUl9OQU1FX1BBVFRFUk4sIG5ldyBTdHJpbmdbXXthcmd9KTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBrZXkgc2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInByaXZhdGVTZXR7YVJvbGUgbmFtZX1LZXkiLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBwcml2YXRlU2V0RGVwYXJ0bWVudEtleS4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0S2V5U2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIGZvcm1hdChLRVlfU0VUVEVSX05BTUVfUEFUVEVSTiwgbmV3IFN0cmluZ1tde2FyZ30pOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGxpbmsgZ2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgImdldHthUm9sZSBuYW1lfUxpbmsiLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBnZXREZXBhcnRtZW50TGluay4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGlua0dldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBmb3JtYXQoTElOS19HRVRURVJfTkFNRV9QQVRURVJOLCBuZXcgU3RyaW5nW117YXJnfSk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgcmVtb3ZlIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInJlbW92ZXthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHJlbW92ZURlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbW92ZU5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBSRU1PVkVfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgc2Vjb25kYXJ5IGFkZCBtZXRob2QgbmFtZSBmb3IgQGFSb2xlLgotICogSXQgd2lsbCBiZSBpbiB0aGUgZm9ybWF0ICJzZWNvbmRhcnlBZGR7YVJvbGUgbmFtZX0iLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBzZWNvbmRhcnlBZGREZXBhcnRtZW50LgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZWNvbmRhcnlBZGROYW1lKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIHsKLQlpZiAoYVJvbGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JU3RyaW5nIGFyZyA9IGZpcnN0QXNVcHBlcmNhc2UoYVJvbGUuZ2V0TmFtZSgpKTsKLQlyZXR1cm4gU0VDT05EQVJZX0FERF9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBzZWNvbmRhcnkgcmVtb3ZlIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInNlY29uZGFyeVJlbW92ZXthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHNlY29uZGFyeVJlbW92ZURlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlY29uZGFyeVJlbW92ZU5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBTRUNPTkRBUllfUkVNT1ZFX05BTUVfUFJFRklYICsgYXJnOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHNlY29uZGFyeSBzZXR0ZXIgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAic2Vjb25kYXJ5U2V0e2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogc2Vjb25kYXJ5U2V0RGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2Vjb25kYXJ5U2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIFNFQ09OREFSWV9TRVRURVJfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgc2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInNldHthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHNldERlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBTRVRURVJfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBtdWx0aXBsaWNpdHkgaXMgbWFueS4KLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFueShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JcmV0dXJuIGFSb2xlICE9IG51bGwgJiYgYVJvbGUuaXNNYW55KCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjhmMDBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWZ1bFNlc3Npb25CZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFTZXNzaW9uQmVhbkNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX1JFTU9URX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNiIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNU1NHSUQgPSAiLnNmYiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9TRVNTSU9OQkVBTn07Ci0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtMT0NBTF9DT01QT05FTlRfSU5URVJGQUNFLCBSRU1PVEVfQ09NUE9ORU5UX0lOVEVSRkFDRX07Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9BQlNUUkFDVCA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfRklOQUwgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX1BVQkxJQyA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSB0cnVlOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117RUpCQ1JFQVRFLCBDT05TVFJVQ1RPUl9OT1BBUk0sIEVKQlJFTU9WRV9OT1BBUk0sIEVKQlBBU1NJVkFURV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0ZJTkFMSVpFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIENPTlNUUlVDVE9SX05PUEFSTSwgQ09OU1RSVUNUT1IsIEVKQkNSRUFURSwgRUpCQ1JFQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTSwgRUpCQUNUSVZBVEVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNLCBGSU5BTElaRV9OT1BBUk0sIEJVU0lORVNTfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwM0ksIG5ldyBTdHJpbmdbXXtDSEtKMjAwM0krU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTQsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE1LCBuZXcgU3RyaW5nW117Q0hLSjIwMTUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jb25zdHIsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jb25zdHIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJDcmVhdGUgKyBTTVNTR0lEICsgU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHN0YXRlZnVsIG1lc3NhZ2UgZGlmZmVycyBmcm9tIHN0YXRlbGVzcyBtZXNzYWdlKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUmVtb3ZlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUGFzc2l2YXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUGFzc2l2YXRlK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMSwgbmV3IFN0cmluZ1tde0NIS0oyNDExK0JFWFQsIENIS0oyNDExK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMSwgbmV3IFN0cmluZ1tde0NIS0oyNDIxK0JFWFQsIENIS0oyNDIxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIyLCBuZXcgU3RyaW5nW117Q0hLSjI0MjIrQkVYVCwgQ0hLSjI0MjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMytCRVhULCBDSEtKMjQyMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNCwgbmV3IFN0cmluZ1tde0NIS0oyNDI0K0JFWFQsIENIS0oyNDI0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI2LCBuZXcgU3RyaW5nW117Q0hLSjI0MjYrQkVYVCwgQ0hLSjI0MjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNytCRVhULCBDSEtKMjQyNytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyOCwgbmV3IFN0cmluZ1tde0NIS0oyNDI4K0JFWFQsIENIS0oyNDI4K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMStCRVhULCBDSEtKMjQzMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzOSwgbmV3IFN0cmluZ1tde0NIS0oyNDM5K0JFWFQsIENIS0oyNDM5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MStCRVhULCBDSEtKMjQ0MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MiwgbmV3IFN0cmluZ1tde0NIS0oyNDQyK0JFWFQsIENIS0oyNDQyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQzLCBuZXcgU3RyaW5nW117Q0hLSjI0NDMrQkVYVCwgQ0hLSjI0NDMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1MiwgbmV3IFN0cmluZ1tde0NIS0oyNDUyK0JFWFQsIENIS0oyNDUyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDUzLCBuZXcgU3RyaW5nW117Q0hLSjI0NTMrQkVYVCwgQ0hLSjI0NTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NitPTl9CQVNFLCBDSEtKMjQ1NitPTl9USElTfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5MytCRVhULCBDSEtKMjQ5MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5NCwgbmV3IFN0cmluZ1tde0NIS0oyNDk0K0JFWFQsIENIS0oyNDk0K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9idXNpbmVzcywgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2J1c2luZXNzK0JFWFQsIENIS0oyNTAwX2J1c2luZXNzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2ZpbmFsaXplLCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZmluYWxpemUrQkVYVCwgQ0hLSjI1MDJfZmluYWxpemUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwM19lamJDcmVhdGUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9lamJSZW1vdmUrQkVYVCwgQ0hLSjI1MDVfZWpiUmVtb3ZlK01FWFR9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVUcmFuc2llbnRGaWVsZCgpIHsKLQkJcmV0dXJuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQ7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlQWJzdHJhY3QoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfQUJTVFJBQ1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlRmluYWwoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfRklOQUw7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlUHVibGljKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX1BVQkxJQzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gTkVJVEhFUjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLlZPSUQsIGJlYW4pOwotCX0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZU5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBJVHlwZUNvbnN0YW50cy5WT0lEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJSRU1PVkVfTk9QQVJNKSA9PSBFSkJSRU1PVkVfTk9QQVJNKSB7Ci0JCQl2YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEJVU0lORVNTKSA9PSBCVVNJTkVTUykgewotCQkJdmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTWV0aG9kIGlzbid0IHN1cHBvc2VkIHRvIGJlIGhlcmUuIExldCB0aGUgdmFsaWRhdGVNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QKLQkJCS8vIHRha2UgY2FyZSBvZiBpdC4KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdIb21lTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJDcmVhdGVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJQb3N0Q3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0J1c2luZXNzTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiAKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5lamIuZWpiMjAucnVsZXMuSUNsYXNzVlJ1bGUjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLmVqYi5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5FbnRlcnByaXNlQmVhbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6KTsKLQkJU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pYmVhbjsKLQkJYm9vbGVhbiBpc0JlYW5NYW5hZ2VkU3RhdGVmdWwgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUcmFuc2FjdGlvblR5cGVFbGVtZW50KHNlc3Npb24pICYmIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0JlYW5NYW5hZ2VkU2Vzc2lvbihzZXNzaW9uKSAmJiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTdGF0ZWZ1bChzZXNzaW9uKSk7Ci0KLQkJaWYgKGlzQmVhbk1hbmFnZWRTdGF0ZWZ1bCkgewotCQkJLyoKLQkJCSAqIDYuNS4zIFRoZSBvcHRpb25hbCBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZQotCQkJICouLi4KLQkJCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JCQkgKiBpbXBsZW1lbnQgdGhlIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCQkJICouLi4KLQkJCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCQkJICogc3luY2hyb25pemF0aW9uIGNhbGwgYmFja3MgYmVjYXVzZSB0aGUgYmVhbiBpcyBpbiBjb250cm9sIG9mIHRoZSBjb21taXQgdGhlIGJlYW4gCi0JCQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkJCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkJCSAqLi4uCi0JCQkgKi8KLQkJCXRyeSB7Ci0JCQkJSmF2YUhlbHBlcnMgc3MgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT04sIGJlYW4pOwotCQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShiZWFuLmdldEVqYkNsYXNzKCksIHNzKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDAzSSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGJlYW4uZ2V0RWpiQ2xhc3MoKSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFF1YWxpZmllZE5hbWUoYmVhbi5nZXRFamJDbGFzcygpKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFF1YWxpZmllZE5hbWUoZS5nZXRKYXZhQ2xhc3MoKSl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4YTMyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVmdWxTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElMb2NhbFR5cGUsIElDb21wb25lbnRUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zbGMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde307Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVH07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2ZDBiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlZnVsU2Vzc2lvbkxvY2FsSG9tZVZSdWxlIGV4dGVuZHMgQVNlc3Npb25Ib21lVlJ1bGUgaW1wbGVtZW50cyBJTG9jYWxUeXBlLCBJSG9tZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTEhPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2xoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNGTVNTR0lEID0gIi5zZmxoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkxPQ0FMSE9NRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117Q1JFQVRFfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIENSRUFURX07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY3JlYXRlK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAyLCBuZXcgU3RyaW5nW117Q0hLSjI0MDIrU0ZNU1NHSUQrT05fQkFTRStTUEVDLCBDSEtKMjQwMitTRk1TU0dJRCtPTl9USElTK1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChkaWZmIHN0cmluZyB0aGFuIHN0YXRlbGVzcyBiZWFuKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NStCRVhULCBDSEtKMjQ2NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW117Q0hLSjI0NjcrQkVYVCwgQ0hLSjI0NjcrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyLCBuZXcgU3RyaW5nW117Q0hLSjI1MDIrQkVYVCwgQ0hLSjI1MDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfY3JlYXRlK0JFWFQsIENIS0oyNTAzX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDRfY3JlYXRlK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25SZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTdkMzgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25SZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBQ29tcG9uZW50VlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUNvbXBvbmVudFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zcmMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVR9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OCtCRVhULCBDSEtKMjQ2OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OSwgbmV3IFN0cmluZ1tde0NIS0oyNDY5K0JFWFQsIENIS0oyNDY5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzAsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MCtCRVhULCBDSEtKMjQ3MCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MSwgbmV3IFN0cmluZ1tde0NIS0oyNDcxK0JFWFQsIENIS0oyNDcxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcyLCBuZXcgU3RyaW5nW117Q0hLSjI0NzIrQkVYVCwgQ0hLSjI0NzIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfYnVzaW5lc3MsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9idXNpbmVzcytCRVhULCBDSEtKMjUwMF9idXNpbmVzcytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25SZW1vdGVIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25SZW1vdGVIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwMzQwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWZ1bFNlc3Npb25SZW1vdGVIb21lVlJ1bGUgZXh0ZW5kcyBBU2Vzc2lvbkhvbWVWUnVsZSBpbXBsZW1lbnRzIElSZW1vdGVUeXBlLCBJSG9tZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNyaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0ZNU1NHSUQgPSAiLnNmcmgiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCSE9NRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0NSRUFURX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEV9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NyZWF0ZStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK1NGTVNTR0lEK09OX0JBU0UrU1BFQywgQ0hLSjI0MDIrU0ZNU1NHSUQrT05fVEhJUytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MStCRVhULCBDSEtKMjQ2MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NSwgbmV3IFN0cmluZ1tde0NIS0oyNDY1K0JFWFQsIENIS0oyNDY1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY2LCBuZXcgU3RyaW5nW117Q0hLSjI0NjYrQkVYVCwgQ0hLSjI0NjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NytCRVhULCBDSEtKMjQ2NytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMitCRVhULCBDSEtKMjUwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19jcmVhdGUrQkVYVCwgQ0hLSjI1MDNfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMWExMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWxlc3NTZXNzaW9uQmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTH07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNiIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTVNTR0lEID0gIi5zc2IiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfU0VTU0lPTkJFQU59OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG5ldyBsb25nW117TE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRSwgUkVNT1RFX0NPTVBPTkVOVF9JTlRFUkZBQ0V9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117RUpCQ1JFQVRFX05PUEFSTSwgQ09OU1RSVUNUT1JfTk9QQVJNLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXtGSU5BTElaRV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDT05TVFJVQ1RPUl9OT1BBUk0sIEVKQkNSRUFURV9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJBQ1RJVkFURV9OT1BBUk0sIEVKQlBBU1NJVkFURV9OT1BBUk0sIEZJTkFMSVpFX05PUEFSTSwgQlVTSU5FU1N9OwotCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9BQlNUUkFDVCA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfRklOQUwgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX1BVQkxJQyA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSB0cnVlOwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAzRSwgbmV3IFN0cmluZ1tde0NIS0oyMDAzRStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIyLCBuZXcgU3RyaW5nW117Q0hLSjIwMjIrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkNyZWF0ZStTTVNTR0lEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlJlbW92ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBhc3NpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBhc3NpdmF0ZStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjEwMytTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMStCRVhULCBDSEtKMjQyMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMiwgbmV3IFN0cmluZ1tde0NIS0oyNDIyK0JFWFQsIENIS0oyNDIyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIzLCBuZXcgU3RyaW5nW117Q0hLSjI0MjMrQkVYVCwgQ0hLSjI0MjMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjQsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNCtCRVhULCBDSEtKMjQyNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNiwgbmV3IFN0cmluZ1tde0NIS0oyNDI2K0JFWFQsIENIS0oyNDI2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI3LCBuZXcgU3RyaW5nW117Q0hLSjI0MjcrQkVYVCwgQ0hLSjI0MjcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQyOCtCRVhULCBDSEtKMjQyOCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMxLCBuZXcgU3RyaW5nW117Q0hLSjI0MzErQkVYVCwgQ0hLSjI0MzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzksIG5ldyBTdHJpbmdbXXtDSEtKMjQzOStCRVhULCBDSEtKMjQzOStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQxLCBuZXcgU3RyaW5nW117Q0hLSjI0NDErQkVYVCwgQ0hLSjI0NDErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MitCRVhULCBDSEtKMjQ0MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MywgbmV3IFN0cmluZ1tde0NIS0oyNDQzK0JFWFQsIENIS0oyNDQzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1MitCRVhULCBDSEtKMjQ1MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1MywgbmV3IFN0cmluZ1tde0NIS0oyNDUzK0JFWFQsIENIS0oyNDUzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU2LCBuZXcgU3RyaW5nW117Q0hLSjI0NTYrT05fQkFTRSwgQ0hLSjI0NTYrT05fVEhJU30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc2LCBuZXcgU3RyaW5nW117Q0hLSjI0NzYrU01TU0dJRCArIE9OX0JBU0UrU1BFQywgQ0hLSjI0NzYrU01TU0dJRCtPTl9USElTK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkyLCBuZXcgU3RyaW5nW117Q0hLSjI0OTIrQkVYVCwgQ0hLSjI0OTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5MytCRVhULCBDSEtKMjQ5MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5NCwgbmV3IFN0cmluZ1tde0NIS0oyNDk0K0JFWFQsIENIS0oyNDk0K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9idXNpbmVzcywgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2J1c2luZXNzK0JFWFQsIENIS0oyNTAwX2J1c2luZXNzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2ZpbmFsaXplLCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZmluYWxpemUrQkVYVCwgQ0hLSjI1MDJfZmluYWxpemUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwM19lamJDcmVhdGUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9lamJSZW1vdmUrQkVYVCwgQ0hLSjI1MDVfZWpiUmVtb3ZlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewotCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVBYnN0cmFjdChKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9BQlNUUkFDVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVGaW5hbChKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9GSU5BTDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVQdWJsaWMoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfUFVCTElDOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBORUlUSEVSOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5WT0lELCBiZWFuKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuVk9JRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJdmFsaWRhdGVFamJSZW1vdmVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiBMZXQgdGhlIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0Ci0JCQkvLyB0YWtlIGNhcmUgb2YgaXQuCi0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiQ3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQlVTSU5FU1MpID09IEJVU0lORVNTKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdCdXNpbmVzc01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2QgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgaGVyZS4gCi0JCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoICE9IDApIHx8ICghSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdXBlci52YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5lamIuZWpiMjAucnVsZXMuSUNsYXNzVlJ1bGUjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLmVqYi5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5FbnRlcnByaXNlQmVhbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci52YWxpZGF0ZSh2YywgYmVhbiwgY2xhenopOwotCQkvKgotCQkgKiA2LjUuMyBUaGUgb3B0aW9uYWwgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UKLQkJICouLi4KLQkJICogT25seSBhIHN0YXRlZnVsIFNlc3Npb24gYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uIG1heSAKLQkJICogaW1wbGVtZW50IHRoZSBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQkJICouLi4KLQkJICogVGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBTZXNzaW9uIGJlYW4gd2l0aCBiZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gdG8gcmVseSBvbiB0aGUgCi0JCSAqIHN5bmNocm9uaXphdGlvbiBjYWxsIGJhY2tzIGJlY2F1c2UgdGhlIGJlYW4gaXMgaW4gY29udHJvbCBvZiB0aGUgY29tbWl0IHRoZSBiZWFuIAotCQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkJICogdHJhbnNhY3Rpb24gY29tbWl0LgotCQkgKi4uLgotCQkgKi8KLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIHNzID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OLCBiZWFuKTsKLQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShiZWFuLmdldEVqYkNsYXNzKCksIHNzKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMDNFLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGJlYW4uZ2V0RWpiQ2xhc3MoKSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRRdWFsaWZpZWROYW1lKGJlYW4uZ2V0RWpiQ2xhc3MoKSksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRRdWFsaWZpZWROYW1lKGUuZ2V0SmF2YUNsYXNzKCkpfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Y2MzZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWxlc3NTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElMb2NhbFR5cGUsIElDb21wb25lbnRUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNsYyI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklUfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OCtCRVhULCBDSEtKMjQ2OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OSwgbmV3IFN0cmluZ1tde0NIS0oyNDY5K0JFWFQsIENIS0oyNDY5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzAsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MCtCRVhULCBDSEtKMjQ3MCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MSwgbmV3IFN0cmluZ1tde0NIS0oyNDcxK0JFWFQsIENIS0oyNDcxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcyLCBuZXcgU3RyaW5nW117Q0hLSjI0NzIrQkVYVCwgQ0hLSjI0NzIrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYjgzYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25Mb2NhbEhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVsZXNzU2Vzc2lvbkxvY2FsSG9tZVZSdWxlIGV4dGVuZHMgQVN0YXRlbGVzc0hvbWVWUnVsZSBpbXBsZW1lbnRzIElMb2NhbFR5cGUsIElIb21lVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTEhPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNsaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTVNTR0lEID0gIi5zc2xoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxIT01FfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117Q1JFQVRFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEVfTk9QQVJNLCBDUkVBVEUsIEZJTkFMSVpFX05PUEFSTX07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY3JlYXRlK1NNU1NHSUQrU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAyLCBuZXcgU3RyaW5nW117Q0hLSjI0MDIrU01TU0dJRCtPTl9CQVNFK1NQRUMsIENIS0oyNDAyK1NNU1NHSUQrT05fVEhJUytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MStCRVhULCBDSEtKMjQ2MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NSwgbmV3IFN0cmluZ1tde0NIS0oyNDY1K0JFWFQsIENIS0oyNDY1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY2LCBuZXcgU3RyaW5nW117Q0hLSjI0NjYrQkVYVCwgQ0hLSjI0NjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NytCRVhULCBDSEtKMjQ2NytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NitCRVhULCBDSEtKMjQ3NitNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyLCBuZXcgU3RyaW5nW117Q0hLSjI1MDIrQkVYVCwgQ0hLSjI1MDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfY3JlYXRlK0JFWFQsIENIS0oyNTAzX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDRfY3JlYXRlK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZmQ2ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25SZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUNvbXBvbmVudFZSdWxlIGltcGxlbWVudHMgSVJlbW90ZVR5cGUsIElDb21wb25lbnRUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zcmMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVR9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2J1c2luZXNzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfYnVzaW5lc3MrQkVYVCwgQ0hLSjI1MDBfYnVzaW5lc3MrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25SZW1vdGVIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1YjE3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUhvbWVWUnVsZSBleHRlbmRzIEFTdGF0ZWxlc3NIb21lVlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUhvbWVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNyaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTVNTR0lEID0gIi5zc3JoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCSE9NRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0NSRUFURV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde307Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ1JFQVRFX05PUEFSTSwgQ1JFQVRFLCBGSU5BTElaRV9OT1BBUk19OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jcmVhdGUrU01TU0dJRCtTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitTTVNTR0lEK09OX0JBU0UrU1BFQywgQ0hLSjI0MDIrU01TU0dJRCtPTl9USElTK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW117Q0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tde0NIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NiwgbmV3IFN0cmluZ1tde0NIS0oyNDc2K0JFWFQsIENIS0oyNDc2K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMitCRVhULCBDSEtKMjUwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19jcmVhdGUrQkVYVCwgQ0hLSjI1MDNfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBCZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Y2JhMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgZW50aXR5IGJlYW4gY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCi0gKgotICogQWxsIDkuMi5YIHNlY3Rpb25zIGRlc2NyaWJlIEJNUCByZXF1aXJlbWVudHMuCi0gKiBJZiBhIENNUCByZXF1aXJlbWVudCBpcyBkaWZmZXJlbnQgdGhhbiB0aGVzZSwgdGhlbiB0aGUgZGlmZmVyZW5jZXMgYXJlCi0gKiBkb2N1bWVudGVkIGluIDkuNC5YIHNlY3Rpb25zLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBCZWFuIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5QmVhbiBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmViIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfS0VZQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlib29sZWFuIGhhc1BLTWV0aG9kID0gZmFsc2U7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAyLCBuZXcgU3RyaW5nW117Q0hLSjIwMDIrQkVYVCwgQ0hLSjIwMDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDYsIG5ldyBTdHJpbmdbXXtDSEtKMjAwNitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA3LCBuZXcgU3RyaW5nW117Q0hLSjIwMDcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwOSwgbmV3IFN0cmluZ1tde0NIS0oyMDA5K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEzLCBuZXcgU3RyaW5nW117Q0hLSjIwMTMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjgsIG5ldyBTdHJpbmdbXXtDSEtKMjAyOCtCRVhULCBDSEtKMjAyOCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyOSwgbmV3IFN0cmluZ1tde0NIS0oyMDI5K0JFWFQsIENIS0oyMDI5K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzMywgbmV3IFN0cmluZ1tde0NIS0oyMDMzK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzQsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM1LCBuZXcgU3RyaW5nW117Q0hLSjIwMzUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzNiwgbmV3IFN0cmluZ1tde0NIS0oyMDM2K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzcsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM4LCBuZXcgU3RyaW5nW117Q0hLSjIwMzgrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzOSwgbmV3IFN0cmluZ1tde0NIS0oyMDM5K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTAzLCBuZXcgU3RyaW5nW117Q0hLSjIxMDMgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwMCwgbmV3IFN0cmluZ1tde0NIS0oyMjAwK09OX0JBU0UrU1BFQywgQ0hLSjIyMDArT05fVEhJUytTUEVDfSk7IC8vIENIS0oyMjAwIGlzIGEgc3BlY2lhbCBjYXNlLiBJdCdzIHNoYXJlZCBieSBhbGwgYmVhbiB0eXBlcy4KLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9idXMrQkVYVCwgQ0hLSjI0MDBfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjQwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYkZpbmQrQkVYVCwgQ0hLSjI0MDBfZWpiRmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwMF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA2LCBuZXcgU3RyaW5nW117Q0hLSjI0MDYrQkVYVCwgQ0hLSjI0MDYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNytCRVhULCBDSEtKMjQwNytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOF9idXMrQkVYVCwgQ0hLSjI0MDhfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA4X2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2VqYkNyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2VqYkZpbmQrQkVYVCwgQ0hLSjI0MDhfZWpiRmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2J1cytCRVhULCBDSEtKMjQwOV9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDlfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOV9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiRmluZCtCRVhULCBDSEtKMjQwOV9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOV9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2J1cytCRVhULCBDSEtKMjQxMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiRmluZCtCRVhULCBDSEtKMjQxMF9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMF9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxOCwgbmV3IFN0cmluZ1tde0NIS0oyNDE4K0JFWFQsIENIS0oyNDE4K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMCwgbmV3IFN0cmluZ1tde0NIS0oyNDIwK0JFWFQsIENIS0oyNDIwK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMiwgbmV3IFN0cmluZ1tde0NIS0oyNDMyK0JFWFQsIENIS0oyNDMyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NiwgbmV3IFN0cmluZ1tde0NIS0oyNDU2K09OX0JBU0UsIENIS0oyNDU2K09OX1RISVN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWhhc1BLTWV0aG9kID0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci5wcmltVmFsaWRhdGVFeGlzdGVuY2UodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCi0JCS8vIEJNUHMgbXVzdCBpbXBsZW1lbnQgZWpiRmluZEJ5UHJpbWFyeUtleS4gSWYgaXQgaXNuJ3QgaW1wbGVtZW50ZWQsIHZhbGlkYXRlTWV0aG9kRXhpc3RzKCkgd2lsbAotCQkvLyBvdXRwdXQgYW4gZXJyb3IuIChoYXNQS01ldGhvZCA9IHRydWUgaW1wbGllcyBpbXBsZW1lbnRlZCwgb3RoZXJ3aXNlIG5vdCBpbXBsZW1lbnRlZCkKLQkJaWYgKCFoYXNQS01ldGhvZCAmJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJGSU5EQllQUklNQVJZS0VZLmVxdWFscyhlamJNZXRob2QuZ2V0TmFtZSgpKSkgewotCQkJaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJfQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuNgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBQZXJmb3JtIGNvbW1vbiBCTVAvQ01QIGJ1c2luZXNzIG1ldGhvZCBjaGVja3MKLQkJc3VwZXIudmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gTm8gc3BlY2lmaWMgQk1QIGJ1c2luZXNzIG1ldGhvZCBjaGVja3MuCi0JCS8vIEFsbCBvZiB0aGUgcG9pbnRzIGluIDkuMi42IGFyZSBjb21tb24gdG8gYm90aCBCTVBzICYgQ01Qcy4KLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQWxsIG9mIHRoZSBhYm92ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSB0aGUgcGFyZW50LgotCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi41Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQSBmaW5kZXIgbWV0aG9kIG5hbWUgbXVzdCBzdGFydCB3aXRoIHRoZSBwcmVmaXggImVqYkZpbmQiIAotCQkvLyAoZS5nLiBlamJGaW5kQnlQcmltYXJ5S2V5LCBlamJGaW5kTGFyZ2VBY2NvdW50cywgZWpiRmluZExhdGVTaGlwbWVudHMpLgotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBhYm92ZSBjaGVjay4KLQotCQkvLyBFdmVyeSBlbnRpdHkgYmVhbiBtdXN0IGRlZmluZSB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIFRoZSByZXN1bHQgdHlwZSBmb3IgCi0JCS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUgKGkuZS4gdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgCi0JCS8vIGJlIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLgotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCS8vIEEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA4X2VqYkZpbmQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JCWlmIChtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDEwX2VqYkZpbmQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9lamJGaW5kLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgYXJndW1lbnQgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RBcmd1bWVudHModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLCAKLQkJLy8gb3IgYSBjb2xsZWN0aW9uIG9mIHByaW1hcnkga2V5cyAoc2VlIFNlY3Rpb24gU3Vic2VjdGlvbiA5LjEuOCkuCi0JCXZhbGlkYXRlRWpiRmluZE1ldGhvZF9rZXkodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBmaW5kZXIgbWV0aG9kcyB0byB0aHJvdyB0aGUgCi0JCS8vIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCQkvLyBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JCS8vIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JCS8vIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfZWpiRmluZCk7Ci0KLQkJdmFsaWRhdGVFamJGaW5kTWV0aG9kX2hvbWVEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuNQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiRmluZE1ldGhvZF9rZXkoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZSwgCi0JCS8vIG9yIGEgY29sbGVjdGlvbiBvZiBwcmltYXJ5IGtleXMgKHNlZSBTZWN0aW9uIFN1YnNlY3Rpb24gOS4xLjgpLgotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCUphdmFIZWxwZXJzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCi0JCUphdmFDbGFzcyBwcmltYXJ5S2V5ID0gKChFbnRpdHkpIGJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHByaW1hcnlLZXkpOwotCi0JCWlmKCAhKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldHVyblR5cGUsIHByaW1hcnlLZXkpIHx8Ci0JCQkgIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihyZXR1cm5UeXBlLCBiZWFuKSB8fAotCQkJICBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbUVudW1lcmF0aW9uKHJldHVyblR5cGUsIGJlYW4pCi0JCSAgICkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBwcmltYXJ5S2V5LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbi4KLQkgKiBTZWN0aW9uOiA5LjIuNAotCSovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gUGVyZm9ybSBjb21tb24gQk1QL0NNUCBlamJQb3N0Q3JlYXRlIG1ldGhvZCBjaGVja3MKLQkJc3VwZXIudmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBObyBzcGVjaWZpYyBCTVAgZWpiUG9zdENyZWF0ZSBtZXRob2QgY2hlY2tzLgotCQkvLyBBbGwgb2YgdGhlIHBvaW50cyBpbiA5LjIuNCBhcmUgY29tbW9uIHRvIGJvdGggQk1QcyAmIENNUHMuCi0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi41Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZU1ldGhvZEV4aXN0cyh2YywgYmVhbiwgY2xhenopOwotCi0JCWlmICghaGFzUEtNZXRob2QpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZlcmlmeUZpZWxkRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLyoKLQkJLy8gUGx1cywgY2hlY2sgdGhhdCBhdCBsZWFzdCBvbmUgZmllbGQgZXhpc3RzIG9uIHRoZSBiZWFuLgotCQlMaXN0IGZpZWxkcyA9IGdldEZpZWxkcygpOwotCQlpZigoZmllbGRzID09IG51bGwpIHx8IChmaWVsZHMuc2l6ZSgpID09IDApKSB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5FSkJfQk1QX05PRklFTERTLCBuZXcgU3RyaW5nW10ge2dldE1vZGVsT2JqZWN0TmFtZSgpfSwgZ2V0TW9kZWxPYmplY3QoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJKi8KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQloYXNQS01ldGhvZCA9IGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QSG9tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QSG9tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjJkNjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEhvbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBiZWFuIG1hbmFnZWQgZW50aXR5IGhvbWUgY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCi0gKiBTZWN0aW9uOiA5LjIuOAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBIb21lIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5SG9tZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmVoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNSwgbmV3IFN0cmluZ1tde0NIS0oyMDA1K0JFWFQsIENIS0oyMDA1K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMSwgbmV3IFN0cmluZ1tde0NIS0oyMDExK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTIsIG5ldyBTdHJpbmdbXXtDSEtKMjAxMitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDI2LCBuZXcgU3RyaW5nW117Q0hLSjIwMjYrQkVYVCwgQ0hLSjIwMjYrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDMwLCBuZXcgU3RyaW5nW117Q0hLSjIwMzArQkVYVCwgQ0hLSjIwMzArTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tde0NIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA1LCBuZXcgU3RyaW5nW117Q0hLSjI0MDUrQkVYVCwgQ0hLSjI0MDUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNSwgbmV3IFN0cmluZ1tde0NIS0oyNDE1K0JFWFQsIENIS0oyNDE1K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi44Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVGaW5kTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRoZSB2ZXJpZnlNYXRjaGluZ0JlYW5GaW5kTWV0aG9kIGNoZWNrcyBmb3IgdGhlIHR3byBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOgotCQkvLyAKLQkJLy8gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLQkJLy8gbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIAotCQkvLyAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0JCS8vIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotCQkvLyAKLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiRmluZCBtZXRob2Qgb2YgdGhlIAotCQkvLyBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kCi0JCS8vIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCXZhbGlkYXRlRmluZE1ldGhvZF9iZWFuRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjIuOAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZE1ldGhvZF9iZWFuRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGUgdmVyaWZ5TWF0Y2hpbmdCZWFuRmluZE1ldGhvZCBjaGVja3MgZm9yIHRoZSB0d28gZm9sbG93aW5nIHJlcXVpcmVtZW50czoKLQkJLy8gCi0JCS8vIEVhY2ggZmluZGVyIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJmaW5kPE1FVEhPRD4iIChlLmcuIGZpbmRMYXJnZUFjY291bnRzKSwgYW5kIGl0Ci0JCS8vIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyAKLQkJLy8gKGUuZy4gZWpiRmluZExhcmdlQWNjb3VudHMpLiBUaGUgbWF0Y2hpbmcgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGhhdmUgdGhlIAotCQkvLyBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBtYXkgYmUgZGlmZmVyZW50LikKLQkJLy8gCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkZpbmQgbWV0aG9kIG9mIHRoZSAKLQkJLy8gZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZAotCQkvLyBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQl2YWxpZGF0ZU1hdGNoaW5nQmVhbkZpbmRNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QS2V5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjNGFkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIFZhbGlkYXRlIGEgQk1QIGtleS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlQk1QS2V5IGV4dGVuZHMgQVZhbGlkYXRlS2V5Q2xhc3MgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDEsIG5ldyBTdHJpbmdbXXtDSEtKMjAwMStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTksIG5ldyBTdHJpbmdbXXtDSEtKMjAxOStFWFR9KTsKLQotLy9Eb24ndCB1c2UgdGhhdCBBVmFsaWRhdGVFSkIgbWV0aG9kCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMitFWFR9KTsKLS8vRG9uJ3QgdXNlIHRoYXQgQVZhbGlkYXRlRUpCIG1ldGhvZAkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrRVhUfSk7Ci0vL0Rvbid0IHVzZSB0aGF0IEFWYWxpZGF0ZUVKQiBtZXRob2QJCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWN0dWFsbHkgZG9lcyB0aGUgdmFsaWRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7Ci0KLQkJLy9Ob3RoaW5nIHRvIGRvLgotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBSZW1vdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUFJlbW90ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQ2NDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUFJlbW90ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIFZhbGlkYXRlcyB0aGUgcmVtb3RlIGludGVyZmFjZSBvZiBhIEJNUCBiZWFuLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBSZW1vdGUgZXh0ZW5kcyBBVmFsaWRhdGVSZW1vdGUgIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuZXIiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEyLCBuZXcgU3RyaW5nW117Q0hLSjIwMTIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNSArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMitCRVhULCBDSEtKMjQxMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMywgbmV3IFN0cmluZ1tde0NIS0oyNDEzK0JFWFQsIENIS0oyNDEzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE0LCBuZXcgU3RyaW5nW117Q0hLSjI0MTQrQkVYVCwgQ0hLSjI0MTQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNStCRVhULCBDSEtKMjQxNStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUEJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViZmE4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlbnRpdHkgYmVhbiBjbGFzc2VzIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogVVJMOiBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2VqYi9kb2NzLmh0bWwKLSAqCi0gKgotICogQWxsIDkuMi5YIHNlY3Rpb25zIGRlc2NyaWJlIEJNUCByZXF1aXJlbWVudHMuCi0gKiBJZiBhIENNUCByZXF1aXJlbWVudCBpcyBkaWZmZXJlbnQgdGhhbiB0aGVzZSwgdGhlbiB0aGUgZGlmZmVyZW5jZXMgYXJlCi0gKiBkb2N1bWVudGVkIGluIDkuNC5YIHNlY3Rpb25zLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVDTVBCZWFuIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5QmVhbiBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgTGlzdCBfY29udGFpbmVyTWFuYWdlZEZpZWxkcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX1JFTU9URX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDIsIG5ldyBTdHJpbmdbXXtDSEtKMjAwMitCRVhULCBDSEtKMjAwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNCwgbmV3IFN0cmluZ1tde0NIS0oyMDA0K0JFWFQsIENIS0oyMDA0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA2LCBuZXcgU3RyaW5nW117Q0hLSjIwMDYrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNywgbmV3IFN0cmluZ1tde0NIS0oyMDA3K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEzLCBuZXcgU3RyaW5nW117Q0hLSjIwMTMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjgsIG5ldyBTdHJpbmdbXXtDSEtKMjAyOCtCRVhULCBDSEtKMjAyOCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyOSwgbmV3IFN0cmluZ1tde0NIS0oyMDI5K0JFWFQsIENIS0oyMDI5K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzMiwgbmV3IFN0cmluZ1tde0NIS0oyMDMyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzMsIG5ldyBTdHJpbmdbXXtDSEtKMjAzMytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM0LCBuZXcgU3RyaW5nW117Q0hLSjIwMzQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzNSwgbmV3IFN0cmluZ1tde0NIS0oyMDM1K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzYsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM3LCBuZXcgU3RyaW5nW117Q0hLSjIwMzcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzOCwgbmV3IFN0cmluZ1tde0NIS0oyMDM4K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzksIG5ldyBTdHJpbmdbXXtDSEtKMjAzOStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDAsIG5ldyBTdHJpbmdbXXtDSEtKMjIwMCtPTl9CQVNFK1NQRUMsIENIS0oyMjAwK09OX1RISVMrU1BFQ30pOyAvLyBDSEtKMjIwMCBpcyBhIHNwZWNpYWwgY2FzZS4gSXQncyBzaGFyZWQgYnkgYWxsIGJlYW4gdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwMSwgbmV3IFN0cmluZ1tde0NIS0oyMjAxK0JFWFQsIENIS0oyMjAxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjAyLCBuZXcgU3RyaW5nW117Q0hLSjIyMDIrQkVYVCwgQ0hLSjIyMDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjIwMytCRVhULCBDSEtKMjIwMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNywgbmV3IFN0cmluZ1tde0NIS0oyMjA3K0VYVCwgQ0hLSjIyMDcrRVhUfSk7IC8vIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgbWVzc2FnZSBpZCBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBtZXRob2QgaXMgaW5oZXJpdGVkCi0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfYnVzK0JFWFQsIENIS0oyNDAwX2J1cytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI0MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAwX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9lamJGaW5kK0JFWFQsIENIS0oyNDAwX2VqYkZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYlBvc3RDcmVhdGUrQkVYVCwgQ0hLSjI0MDBfZWpiUG9zdENyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNiwgbmV3IFN0cmluZ1tde0NIS0oyNDA2K0JFWFQsIENIS0oyNDA2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA4X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2J1cytCRVhULCBDSEtKMjQwOF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA4X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2J1cytCRVhULCBDSEtKMjQwOV9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDlfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOV9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiRmluZCtCRVhULCBDSEtKMjQwOV9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOV9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2J1cytCRVhULCBDSEtKMjQxMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiRmluZCtCRVhULCBDSEtKMjQxMF9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMF9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxOCwgbmV3IFN0cmluZ1tde0NIS0oyNDE4K0JFWFQsIENIS0oyNDE4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIwLCBuZXcgU3RyaW5nW117Q0hLSjI0MjArQkVYVCwgQ0hLSjI0MjArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMitCRVhULCBDSEtKMjQzMitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NitPTl9CQVNFLCBDSEtKMjQ1NitPTl9USElTfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9jb250YWluZXJNYW5hZ2VkRmllbGRzID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgewotCQlyZXR1cm4gX2NvbnRhaW5lck1hbmFnZWRGaWVsZHM7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGhhc0NvbnRhaW5lck1hbmFnZWRGaWVsZCgpIHsKLQkJcmV0dXJuIChnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgIT0gbnVsbCAmJiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkuc2l6ZSgpID4gMCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZEZpZWxkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgIT0gbnVsbCAmJiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkuY29udGFpbnMoZmllbGQuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS40LjEKLQkgKiAKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZEhvbWVfaG9tZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGhvbWVJbnRmID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBob21lSW50Zik7Ci0KLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGZpZWxkKSwgaG9tZUludGYpOwotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjQuMQotCSAqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGlzIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZFJlbW90ZV9yZW1vdGVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGZpZWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUphdmFDbGFzcyByZW1vdGVJbnRmID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlbW90ZUludGYpOwotCi0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShmaWVsZCksIHJlbW90ZUludGYpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgbG9hZENvbnRhaW5lck1hbmFnZWRGaWVsZHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gVGhlIHZhbGlkYXRpb24gaW4gdGhpcyBjbGFzcywgb2YgdGhlIGZpZWxkcywgaXMgcGVyZm9ybWVkIGFnYWluc3QgdGhlCi0JCS8vIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcywgbm90IHRoZSBmaWVsZHMgb2YgdGhpcyBjbGFzcyBkaXJlY3RseS4KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlMaXN0IGZpZWxkcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlMaXN0IGNtcEF0dHJpYnV0ZXMgPSAoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW4pLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAoY21wQXR0cmlidXRlcyAhPSBudWxsICYmICFjbXBBdHRyaWJ1dGVzLmlzRW1wdHkoKSkgewotCQkJCWZpZWxkcyA9IG5ldyBBcnJheUxpc3QoY21wQXR0cmlidXRlcy5zaXplKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY21wQXR0cmlidXRlcy5zaXplKCk7IGkrKykKLQkJCQkJZmllbGRzLmFkZCgoKENNUEF0dHJpYnV0ZSkgY21wQXR0cmlidXRlcy5nZXQoaSkpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVIpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVSLCBleGMpOwotCQkJfQotCQkJZmllbGRzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gZmllbGRzOwotCX0KLQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDE4LjEuMgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci5wcmltVmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQl2YWxpZGF0ZUNvbnRhaW5lck1hbmFnZWRGaWVsZCh2YywgYmVhbiwgY2xhenosIGZpZWxkKTsKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS4yLjYKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gUGVyZm9ybSBjb21tb24gQk1QL0NNUCBidXNpbmVzcyBtZXRob2QgY2hlY2tzCi0JCWlmICghaXNFamJSZWxhdGlvbnNoaXBSb2xlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkKLQkJCXN1cGVyLnZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIE5vIHNwZWNpZmljIENNUCBidXNpbmVzcyBtZXRob2QgY2hlY2tzLgotCQkvLyBBbGwgb2YgdGhlIHBvaW50cyBpbiA5LjIuNiBhcmUgY29tbW9uIHRvIGJvdGggQk1QcyAmIENNUHMuCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2ROb1JlbW90ZUV4Y2VwdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNFamJSZWxhdGlvbnNoaXBSb2xlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkKLQkJCXN1cGVyLnZhbGlkYXRlQnVzaW5lc3NNZXRob2ROb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7IC8vIEVKQiAyLjAgYWRkZWQgInRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gYWJvdmUiCi0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuMi4yCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEFsbCBvZiB0aGUgYWJvdmUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgdGhlIHBhcmVudC4KLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCi0JCXZhbGlkYXRlUHJpbWl0aXZlUHJpbWFyeUtleSh2YywgYmVhbiwgY2xhenopOyAvLyBpZiB0aGlzIGNsYXNzIHVzZXMgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXksIHRoZSB0eXBlIG9mIHRoZSBrZXkgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQKLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS40LjEKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnRhaW5lck1hbmFnZWRGaWVsZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoaXNDb250YWluZXJNYW5hZ2VkRmllbGQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCkpIHsKLQkJCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhmaWVsZCkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIyMDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQlpZiAoZmllbGQuaXNUcmFuc2llbnQoKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjIwMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIGlmIGl0J3MgYSByZWZlcmVuY2UgdG8gdGhlIGhvbWUgb3IgcmVtb3RlIGludGVyZmFjZS4KLQkJCXZhbGlkYXRlQ29udGFpbmVyTWFuYWdlZEZpZWxkX2RlcGVuZGVudCh2YywgYmVhbiwgY2xhenosIGZpZWxkKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjQuMQotCSAqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGlzIGVpdGhlciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSwgCi0JICogb3IgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29udGFpbmVyTWFuYWdlZEZpZWxkX2RlcGVuZGVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSmF2YUhlbHBlcnMgZmllbGRUeXBlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpOwotCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU2VyaWFsaXphYmxlKGZpZWxkVHlwZSwgYmVhbikpIHsKLQkJCS8vIElmIGl0IHdlcmUgcHJpbWl0aXZlLCBpdCB3b3VsZCBiZSBzZXJpYWxpemFibGUsIHNvIHR3byBjaGVja3Mgd2VyZSBkb25lIGluIHRoYXQgb25lIGxpbmUgb2YgY29kZS4KLQkJCS8vIAotCQkJLy8gQ2hlY2sgaWYgaXQncyB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIG9yIGhvbWUgaW50ZXJmYWNlCi0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJaWYgKCEoaXNDb250YWluZXJNYW5hZ2VkSG9tZV9ob21lRGVwKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpKSB8fCAoaXNDb250YWluZXJNYW5hZ2VkUmVtb3RlX3JlbW90ZURlcCh2YywgYmVhbiwgY2xhenosIGZpZWxkKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIyMDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0JICogU2VjdGlvbjogOS40LjYKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCi0JCS8vIE9ubHkgQk1QcyBpbXBsZW1lbnQgZmluZGVyIG1ldGhvZHMuCi0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbi4KLQkgKiBTZWN0aW9uOiA5LjIuNCBhbmQgOS40LjIKLQkqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIFBlcmZvcm0gY29tbW9uIEJNUC9DTVAgZWpiUG9zdENyZWF0ZSBtZXRob2QgY2hlY2tzCi0JCXN1cGVyLnZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gTm8gc3BlY2lmaWMgQ01QIGVqYlBvc3RDcmVhdGVNZXRob2QgY2hlY2tzLgotCQkvLyBBbGwgb2YgdGhlIHBvaW50cyBpbiA5LjIuNCBhcmUgY29tbW9uIHRvIGJvdGggQk1QcyAmIENNUHMuCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUHJpbWl0aXZlUHJpbWFyeUtleShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47IC8vIGJlYW4gaXMgY2hlY2tlZCBmb3IgbnVsbCBpbiBBVmFsaWRhdGVFSkIudmFsaWRhdGUoKSBtZXRob2QsIHNvIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGl0IGhlcmUuCi0KLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ByaW1pdGl2ZVByaW1hcnlLZXkoY21wKSkgewotCQkJLy8gcHJpbWl0aXZlIHByaW1hcnkga2V5Ci0KLQkJCS8vIHByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBhIHNpbmdsZSBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MKLQkJCS8vIFRoZSBmaWVsZCdzIHR5cGUgbXVzdCBiZSB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLQkJCUNNUEF0dHJpYnV0ZSBrZXlBdHRyaWJ1dGUgPSBjbXAuZ2V0UHJpbUtleUZpZWxkKCk7Ci0JCQlGaWVsZCBrZXlGaWVsZCA9IChrZXlBdHRyaWJ1dGUgPT0gbnVsbCkgPyBudWxsIDoga2V5QXR0cmlidXRlLmdldEZpZWxkKCk7Ci0JCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JCQlpZiAoKGtleUZpZWxkID09IG51bGwpIHx8ICFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSgoSmF2YUhlbHBlcnMpa2V5RmllbGQuZ2V0RVR5cGUoKSwgcHJpbWFyeUtleSkpIHsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBrZXlBdHRyaWJ1dGUuZ2V0TmFtZSgpLCBwcmltYXJ5S2V5LmdldE5hbWUoKX07Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMjA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBrZXlGaWVsZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGF0IGF0IGxlYXN0IG9uZSBmaWVsZCBleGlzdHMgb24gdGhlIGJlYW4uCi0JICovCi0JcHVibGljIHZvaWQgdmVyaWZ5RmllbGRFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoIWhhc0NvbnRhaW5lck1hbmFnZWRGaWVsZCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIucHJlVmFsaWRhdGUodmMsIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLQkJX2NvbnRhaW5lck1hbmFnZWRGaWVsZHMgPSBsb2FkQ29udGFpbmVyTWFuYWdlZEZpZWxkcyh2YywgKEVudGVycHJpc2VCZWFuKXRhcmdldFBhcmVudCwgKEphdmFDbGFzcyl0YXJnZXQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQ01QS2V5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1YjhhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVudGl0eSBiZWFuIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotICoKLSAqCi0gKiBBbGwgOS4yLlggc2VjdGlvbnMgZGVzY3JpYmUgQk1QIHJlcXVpcmVtZW50cy4gKEFuZCB0aGUgYnVsayBvZiB0aG9zZQotICogYXJlIGltcGxlbWVudGVkIGluIFZhbGlkYXRlS2V5Q2xhc3MuKQotICogSWYgYSBDTVAgcmVxdWlyZW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gdGhlc2UsIHRoZW4gdGhlIGRpZmZlcmVuY2VzIGFyZQotICogZG9jdW1lbnRlZCBpbiA5LjQuWCBzZWN0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlQ01QS2V5IGV4dGVuZHMgQVZhbGlkYXRlS2V5Q2xhc3MgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIGJvb2xlYW4gaGFzQUNvbnN0cnVjdG9yID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOwotCXByaXZhdGUgU2V0IF9iZWFuRmllbGROYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0tFWUNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAxLCBuZXcgU3RyaW5nW117Q0hLSjIwMDErRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE5LCBuZXcgU3RyaW5nW117Q0hLSjIwMTkrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIwLCBuZXcgU3RyaW5nW117Q0hLSjIwMjArRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMSwgbmV3IFN0cmluZ1tde0NIS0oyMDIxK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNSwgbmV3IFN0cmluZ1tde0NIS0oyMjA1K0JFWFQsIENIS0oyMjA1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjA2LCBuZXcgU3RyaW5nW117Q0hLSjIyMDYrQkVYVCwgQ0hLSjIyMDYrTUVYVH0pOyAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIGlkIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgbWV0aG9kIGlzIGluaGVyaXRlZCBvciBub3QKLQkJCi0vL0FWYWxpZGF0ZUVKQiBtZXRob2Qgbm90IHVzZWQJCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLS8vQVZhbGlkYXRlRUpCIG1ldGhvZCBub3QgdXNlZAkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotLy9BVmFsaWRhdGVFSkIgbWV0aG9kIG5vdCB1c2VkCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjksIG5ldyBTdHJpbmdbXXtDSEtKMjgyOSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9iZWFuRmllbGROYW1lcy5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpcGFyZW50OwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCkpIHsKLQkJCXJldHVybiBudWxsOyAvLyBkbyBub3QgdmFsaWRhdGUgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkKLQkJfQotCQkKLQkJcmV0dXJuIGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQkvKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuNC43LjEgYW5kIDkuNC43LjIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEZpZWxkTmFtZUxpc3QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gQnVpbGQgdXAgdGhlIGxpc3Qgb2YgZmllbGQgbmFtZXMgdG8gYmUgdXNlZCBpbiB0aGUgZmllbGQgdmFsaWRhdGlvbi4KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOwotCQlpZiAoY21wID09IG51bGwpIHsKLQkJCS8vIExldCB0aGUgY2xhc3MgdmFsaWRhdGlvbiB0aHJvdyB0aGUgZXhjZXB0aW9uCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ByaW1pdGl2ZVByaW1hcnlLZXkoY21wKSkgewotCQkJTGlzdCBhdHRyaWJ1dGVzID0gY21wLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlID0gbnVsbDsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWF0dHJpYnV0ZSA9IChDTVBBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQkvLyBUaGVzZSBhcmUgZGlmZmVyZW50IGZpZWxkcyB0aGFuIHRoZSBvbmVzIHZhbGlkYXRlZCBieSB0aGlzCi0JCQkJCS8vIHZhbEltcGwgY2xhc3MsIHNvIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgZHVwbGljYXRlIHJlZmxlY3Rpb24KLQkJCQkJLy8gd2FybmluZ3MgbG9nZ2VkIGFnYWluc3QgdGhlIHNhbWUgb2JqZWN0LgotCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoYXR0cmlidXRlLmdldFR5cGUoKSk7Ci0JCQkJCV9iZWFuRmllbGROYW1lcy5hZGQoYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkvL1RPRE8gKERhbikgQ2hhbmdlIHRvIHVzZSB0aGUgYXR0cmlidXRlIGRpcmVjdGx5IGFuZCBub3QgdGhlIGZpZWxkLgotCQkJCQlyZWZsZWN0aW9uV2FybmluZyh2YywgYmVhbiwgY2xhenogLCBhdHRyaWJ1dGUuZ2V0RmllbGQoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFjdHVhbGx5IGRvZXMgdGhlIHZhbGlkYXRpb24uCi0JICoKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA5LjQuNy4yCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEFsbCBmaWVsZHMgaW4gdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhmaWVsZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIyMDUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGluIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiB0aGUgY29udGFpbmVyLW1hbmFnZWQKLQkJLy8gZmllbGRzLiAoVGhpcyBhbGxvd3MgdGhlIGNvbnRhaW5lciB0byBleHRyYWN0IHRoZSBwcmltYXJ5IGtleSBmaWVsZHMgZnJvbSBhbiBpbnN0YW5jZSdzIGNvbnRhaW5lci1tYW5hZ2VkCi0JCS8vIGZpZWxkcywgYW5kIHZpY2UgdmVyc2EuKQotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOwotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIGNtcCBpcyBudWxsLCBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IGJ5IHZhbGlkYXRlRmllbGRzKCksCi0JCS8vIGFuZCB2YWxpZGF0ZUZpZWxkcygpIHdvbid0IGNhbGwgdGhpcyBtZXRob2QgaWYgdGhlIGJlYW4gaXMgbnVsbC4KLQotCQlpZiAoIV9iZWFuRmllbGROYW1lcy5jb250YWlucyhmaWVsZC5nZXROYW1lKCkpKSB7Ci0JCQlKYXZhQ2xhc3MgZWpiQ2xhc3MgPSBjbXAuZ2V0RWpiQ2xhc3MoKTsKLQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShlamJDbGFzcyk7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBjbXAuZ2V0TmFtZSgpLCBjbXAuZ2V0RWpiQ2xhc3MoKS5nZXROYW1lKCl9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjIwNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBmaWVsZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFjdHVhbGx5IGRvZXMgdGhlIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvLyBzdXBlci5wcmltVmFsaWRhdGUoZWpiTWV0aG9kKTsKLQotCQkvL05vdGhpbmcgdG8gZG8uCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvL3N1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKGVqYk1ldGhvZCk7Ci0KLQkJaWYgKGVqYk1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCS8vIFRoZXNlIGJvb2xlYW5zIGFyZSB1c2VkIGluIHRoZSB2YWxpZGF0ZU1ldGhvZEV4aXN0cygpIGNoZWNrcy4KLQkJCWhhc0FDb25zdHJ1Y3RvciA9IHRydWU7Ci0JCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKGVqYk1ldGhvZCkgJiYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkpIHsKLQkJCQloYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuNC43LjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljCi0JCWlmICghY2xhenouaXNQdWJsaWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDIwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlidWlsZEZpZWxkTmFtZUxpc3QodmMsIGJlYW4sIGNsYXp6KTsKLQotCQkvLyBEb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY2hlY2sgZm9yIGNtcCBrZXkgYXR0cmlidXRlcyBpZiBpdCdzIG5vdCBhIHZhbGlkIHByaW0ga2V5IGZpZWxkLgotCQkvLyBwcmltYXJ5IGtleSBtdXN0IG1hcCB0byBhdCBsZWFzdCBvbmUgZmllbGQgb24gdGhlIGJlYW4gCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJLy8gcHJpbWFyeSBrZXkgbXVzdCBtYXAgdG8gYXQgbGVhc3Qgb25lIGZpZWxkIG9uIHRoZSBiZWFuIAotCQkJLy8gQnV0IGlmIGl0J3MgYW4gdW5rbm93biBrZXksIHRoZXJlJ3Mgbm8gcG9pbnQgY2hlY2tpbmcgamF2YS5sYW5nLk9iamVjdAotCQkJTGlzdCBwcmltS2V5RmllbGRzID0gY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCWlmICgocHJpbUtleUZpZWxkcyA9PSBudWxsKSB8fCAocHJpbUtleUZpZWxkcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7IC8vIGRvbid0IG5lZWQgdG8gY2hlY2sgTU9GSGVscGVyLmlzVmFsaWRUeXBlKHByaW1hcnlLZXkpLCBiZWNhdXNlIGl0J3MgYWxyZWFkeSBiZWVuIGNhbGxlZCBpbiB0aGUgdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvciBtZXRob2QKLQkJCQlTdHJpbmcgYmVhbk5hbWUgPSAoY21wLmdldE5hbWUoKSA9PSBudWxsKSA/ICJudWxsIiA6IGNtcC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHByaW1hcnlLZXksIG5ldyBTdHJpbmdbXSB7IHByaW1hcnlLZXkuZ2V0TmFtZSgpLCBiZWFuTmFtZSB9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDkuNC43LjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlTWV0aG9kRXhpc3RzKHZjLCBiZWFuLCBjbGF6eik7Ci0KLQkJLy8gSWYgdGhlIGNsYXNzIGhhcyBubyBjb25zdHJ1Y3RvcnMgZGVmaW5lZCwgSmF2YSBpbnNlcnRzIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gYXJndW1lbnRzLgotCQkvLyBCdXQgaWYgdGhlIGNsYXNzIGhhcyBhdCBsZWFzdCBvbmUgY29uc3RydWN0b3IgZGVmaW5lZCwgSmF2YSB3aWxsIG5vdCBpbnNlcnQgYSBjb25zdHJ1Y3Rvci4KLQkJaWYgKCFoYXNEZWZhdWx0Q29uc3RydWN0b3IgJiYgaGFzQUNvbnN0cnVjdG9yKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMjEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByZVZhbGlkYXRlKHZjLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0JCWhhc0FDb25zdHJ1Y3RvciA9IGZhbHNlOwotCQloYXNEZWZhdWx0Q29uc3RydWN0b3IgPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBSZW1vdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUFJlbW90ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTVlZDljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUFJlbW90ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIFZhbGlkYXRlcyB0aGUgcmVtb3RlIGludGVyZmFjZSBvZiBhIENNUCBiZWFuLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVDTVBSZW1vdGUgZXh0ZW5kcyBBVmFsaWRhdGVSZW1vdGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lciI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX1JFTU9URTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMiwgbmV3IFN0cmluZ1tde0NIS0oyMDEyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUgKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEyLCBuZXcgU3RyaW5nW117Q0hLSjI0MTIrQkVYVCwgQ0hLSjI0MTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMytCRVhULCBDSEtKMjQxMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0JFWFQsIENIS0oyNDE0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE1LCBuZXcgU3RyaW5nW117Q0hLSjI0MTUrQkVYVCwgQ0hLSjI0MTUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlU2Vzc2lvbkJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNzg3YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlU2Vzc2lvbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBTZXNzaW9uIGhvbWUgaW50ZXJmYWNlIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotICogU2VjdGlvbjogNi44LCA2LjEwLjIsIDYuMTAuMyBhbmQgNi4xMC40Ci0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVNlc3Npb25CZWFuIGV4dGVuZHMgQVZhbGlkYXRlQmVhbiBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgYm9vbGVhbiBoYXNWYWxpZENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0FDb25zdHJ1Y3RvciA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNEZWZhdWx0Q3JlYXRlTWV0aG9kID0gZmFsc2U7Ci0JcHJpdmF0ZSBTZXQgY3JlYXRlTWV0aG9kcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9CRUFOQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX1JFTU9URX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDNJLCBuZXcgU3RyaW5nW117Q0hLSjIwMDNJICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDNFLCBuZXcgU3RyaW5nW117Q0hLSjIwMDNFICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNiwgbmV3IFN0cmluZ1tde0NIS0oyMDA2K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDcsIG5ldyBTdHJpbmdbXXtDSEtKMjAwNytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA4LCBuZXcgU3RyaW5nW117Q0hLSjIwMDgrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEzLCBuZXcgU3RyaW5nW117Q0hLSjIwMTMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjIsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDI1LCBuZXcgU3RyaW5nW117Q0hLSjIwMjUrQkVYVCwgQ0hLSjIwMjUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTAzLCBuZXcgU3RyaW5nW117Q0hLSjIxMDMgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwMCwgbmV3IFN0cmluZ1tde0NIS0oyMjAwK09OX0JBU0UrU1BFQywgQ0hLSjIyMDArT05fVEhJUytTUEVDfSk7IC8vIENIS0oyMjAwIGlzIGEgc3BlY2lhbCBjYXNlLiBJdCdzIHNoYXJlZCBieSBhbGwgYmVhbiB0eXBlcy4KLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfYnVzK0JFWFQsIENIS0oyNDAwX2J1cytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI0MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAxLCBuZXcgU3RyaW5nW117Q0hLSjI0MDErQkVYVCwgQ0hLSjI0MDErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfYnVzK0JFWFQsIENIS0oyNDA4X2J1cytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI0MDhfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2J1cytCRVhULCBDSEtKMjQwOV9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDlfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYkNyZWF0ZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2J1cytCRVhULCBDSEtKMjQxMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMSwgbmV3IFN0cmluZ1tde0NIS0oyNDExK0JFWFQsIENIS0oyNDExK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEyLCBuZXcgU3RyaW5nW117Q0hLSjI0MTIrQkVYVCwgQ0hLSjI0MTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMytCRVhULCBDSEtKMjQxMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0JFWFQsIENIS0oyNDE0K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjAsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMCtCRVhULCBDSEtKMjQyMCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMyLCBuZXcgU3RyaW5nW117Q0hLSjI0MzIrQkVYVCwgQ0hLSjI0MzIrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU2LCBuZXcgU3RyaW5nW117Q0hLSjI0NTYrT05fQkFTRSwgQ0hLSjI0NTYrT05fVEhJU30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQljcmVhdGVNZXRob2RzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRlU2Vzc2lvbkJlYW4oKSB7Ci0JCWNyZWF0ZU1ldGhvZHMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFBhcmVudE5hbWUoKSB7Ci0JCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05CRUFOOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNDcmVhdGVNZXRob2QoKSB7Ci0JCWlmIChoYXNEZWZhdWx0Q3JlYXRlTWV0aG9kID09IHRydWUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGNyZWF0ZU1ldGhvZHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50Q3JlYXRlTWV0aG9kQ291bnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgJiYgKCFoYXNEZWZhdWx0Q3JlYXRlTWV0aG9kKSkgewotCQkJaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBhZGQgaXQgdG8gdGhlIGxpc3QsIGZvciByZXBvcnRpbmcgZXh0cmFuZW91cyBjcmVhdGUgbWV0aG9kcywgZm9yIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zIChzZWN0aW9uIDYuOCkKLQkJCWNyZWF0ZU1ldGhvZHMuYWRkKG1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZyYW1ld29ya01ldGhvZChTdHJpbmcgbmFtZSkgewotCQlpZiAoc3VwZXIuaXNGcmFtZXdvcmtNZXRob2QobmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gY2hlY2sgZm9yIHNlc3Npb24tc3BlY2lmaWMgbWV0aG9kcwotCQlpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfU0VUU0VTU0lPTkNPTlRFWFQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0aGF0IHRoZSBlamJDcmVhdGUgbWV0aG9kcyBhbmQgYnVzaW5lc3MgbWV0aG9kcyBmb2xsb3cgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKiBTZWN0aW9uOiA2LjgsIDYuMTAuMiwgNi4xMC4zIGFuZCA2LjEwLjQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vIHN1cGVyLnByaW1WYWxpZGF0ZShlamJNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBlamJNZXRob2QuZ2V0TmFtZSgpOwotCQlpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKSkgewotCQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkFMSVpFKSkgewotCQkJdmFsaWRhdGVGaW5hbGl6ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWpiTWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJdmFsaWRhdGVDb25zdHJ1Y3Rvcih2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCkpIHsKLQkJCXZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYgKCFpc0ZyYW1ld29ya01ldGhvZChuYW1lKSkgewotCQkJdmFsaWRhdGVIZWxwZXJNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQl9Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCWlmIChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUuZXF1YWxzKGVqYk1ldGhvZC5nZXROYW1lKCkpKQotCQkJaW5jcmVtZW50Q3JlYXRlTWV0aG9kQ291bnQodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQllbHNlIGlmIChlamJNZXRob2QuaXNDb25zdHJ1Y3RvcigpKQotCQkJdmFsaWRhdGVDb25zdHJ1Y3Rvcih2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdGhhdCB0aGUgc3VwcGxpZWQgYnVzaW5lc3MgbWV0aG9kIGZvbGxvd3MgdGhlIEVKQiAxLjEgc3BlYyBydWxlcy4KLQkgKiBTZWN0aW9uOiA2LjEwLjQKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlzdXBlci52YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsgLy8gY2hlY2sgbWV0aG9kIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCAnZWpiJwkKLQotCQkvLyBUaGUgbWV0aG9kIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS9JSU9QLgotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kV2l0aG91dEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSByZXN0IG9mIHRoZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbiB0aGUgdmFsaWRhdGVNZXRob2QgbWV0aG9kLgotCQl2YWxpZGF0ZUJ1c2luZXNzTW9kaWZpZXJzQW5kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoYXQgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBkZWZpbml0aW9uIGZvbGxvd3MgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKgotCSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLQkgKiBWZXJzaW9uOiAxLjEKLQkgKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLQkgKiBSZWxlYXNlOiAxMi8xNy85OQotCSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCi0JICogU2VjdGlvbjogNi4xMC4yCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCXN1cGVyLnZhbGlkYXRlQ2xhc3ModmMsIGJlYW4sIGNsYXp6KTsKLQkJLy8gc3VwZXIudmFsaWRhdGVDbGFzcygpIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgY2hlY2tzOgotCQkvLyAJCS0gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50LCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCB0aGUgamF2YXguZWpiLlNlc3Npb25CZWFuIAotCQkvLyAgICAgICAgaW50ZXJmYWNlLgotCQkvLyAgIAktIFRoZSBjbGFzcyBtdXN0IGJlIGRlZmluZWQgYXMgcHVibGljLCBtdXN0IG5vdCBiZSBmaW5hbCwgYW5kIG11c3Qgbm90IAotCQkvLyAgICAgICAgYmUgYWJzdHJhY3QuCi0KLQkJLy8gSWYgdGhlIGNsYXNzIGlzIGEgc3RhdGVmdWwgc2Vzc2lvbiBiZWFuLCBpdCBtYXkgb3B0aW9uYWxseSBpbXBsZW1lbnQgCi0JCS8vIHRoZSBqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UuCi0KLQkJU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pYmVhbjsKLQkJYm9vbGVhbiBpc1N0YXRlbGVzcyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1N0YXRlbGVzcyhiZWFuKTsKLQkJYm9vbGVhbiBpc0JlYW5NYW5hZ2VkU3RhdGVmdWwgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQmVhbk1hbmFnZWRTZXNzaW9uKHNlc3Npb24pICYmIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1N0YXRlZnVsKHNlc3Npb24pKTsKLQotCQlpZiAoaXNTdGF0ZWxlc3MpIHsKLQkJCS8qCi0JCQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkJCSAqIFNlY3Rpb246IDYuNS4zCi0JCQkgKi8KLQkJCXRyeSB7Ci0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGJlYW4uZ2V0RWpiQ2xhc3MoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OLCBiZWFuKSkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAwM0UsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgYmVhbi5nZXRFamJDbGFzcygpLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgYmVhbkNsYXNzTmFtZSA9IChiZWFuLmdldEVqYkNsYXNzKCkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfQkVBTl9DTEFTUyA6IGJlYW4uZ2V0RWpiQ2xhc3MoKS5nZXRKYXZhTmFtZSgpOwotCQkJCVN0cmluZyBlQ2xhc3MgPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/IElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTiA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0SmF2YU5hbWUoKTsgLy8gU2luY2Ugb25seSBnZXRUeXBlIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIHRoaXMgY2Fubm90IGhhdmUgYmVlbiB0aHJvd24gYmVjYXVzZSBvZiB0aGUgYmVhbiBjbGFzcwotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGJlYW5DbGFzc05hbWUsIGVDbGFzcyB9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlzQmVhbk1hbmFnZWRTdGF0ZWZ1bCkgewotCQkJLyoKLQkJCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCQkJICogU2VjdGlvbjogNi41LjMKLQkJCSAqLwotCQkJdHJ5IHsKLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oYmVhbi5nZXRFamJDbGFzcygpLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT04sIGJlYW4pKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDAzSSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGJlYW4uZ2V0RWpiQ2xhc3MoKSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgYmVhbi5nZXRFamJDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSwgZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtYXkgaGF2ZSBzdXBlcmNsYXNzZXMgYW5kL29yIHN1cGVyaW50ZXJmYWNlcy4gSWYgdGhlIAotCQkvLyBzZXNzaW9uIGJlYW4gaGFzIHN1cGVyY2xhc3NlcywgdGhlbiB0aGUgYnVzaW5lc3MgbWV0aG9kcywgdGhlIGVqYkNyZWF0ZSBtZXRob2RzLCAKLQkJLy8gdGhlIG1ldGhvZHMgb2YgdGhlIFNlc3Npb25CZWFuIGludGVyZmFjZSwgYW5kIHRoZSBtZXRob2RzIG9mIHRoZSBvcHRpb25hbCAKLQkJLy8gU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UgbWF5IGJlIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcywgCi0JCS8vIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotCQkvLyAgLSB0aGlzIGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlIEVKQiBNT0YgbW9kZWwuIFdoZW4gYXNrZWQgaWYgYSBKYXZhQ2xhc3MgaGFzIGEgbWV0aG9kLAotCQkvLyAgICB0aGUgbW9kZWwgY2hlY2tzIHRoZSBjbGFzcycgcGFyZW50cyB0b28uCi0KLQkJLy8gVGhlIGNsYXNzIG1heSwgYnV0IGlzIG5vdCByZXF1aXJlZCB0bywgaW1wbGVtZW50IHRoZSBzZXNzaW9uIGJlYW4ncyAKLQkJLy8gcmVtb3RlIGludGVyZmFjZSBbNF0gLgotCQkvLyBbNF0gSWYgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBkb2VzIGltcGxlbWVudCB0aGUgcmVtb3RlIGludGVyZmFjZSwgY2FyZSBtdXN0IAotCQkvLyBiZSB0YWtlbiB0byBhdm9pZCBwYXNzaW5nIG9mIHRoaXMgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0LiBUaGlzIAotCQkvLyBwb3RlbnRpYWwgZXJyb3IgY2FuIGJlIGF2b2lkZWQgYnkgY2hvb3Npbmcgbm90IHRvIGltcGxlbWVudCB0aGUgcmVtb3RlIAotCQkvLyBpbnRlcmZhY2UgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4KLQkJdmFsaWRhdGVDbGFzc19yZW1vdGVEZXAodmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGRlZmluaXRpb24gZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjLgotCSAqCi0JICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotCSAqIFZlcnNpb246IDEuMQotCSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotCSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0JICogVVJMOiBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2VqYi9kb2NzLmh0bWwKLQkgKiBTZWN0aW9uOiA2LjEwLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzX3JlbW90ZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCS8vIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgc2Vzc2lvbiBiZWFuJ3MgCi0JCS8vIHJlbW90ZSBpbnRlcmZhY2UgWzRdIC4KLQkJLy8gWzRdIElmIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgZG9lcyBpbXBsZW1lbnQgdGhlIHJlbW90ZSBpbnRlcmZhY2UsIGNhcmUgbXVzdCAKLQkJLy8gYmUgdGFrZW4gdG8gYXZvaWQgcGFzc2luZyBvZiB0aGlzIGFzIGEgbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdC4gVGhpcyAKLQkJLy8gcG90ZW50aWFsIGVycm9yIGNhbiBiZSBhdm9pZGVkIGJ5IGNob29zaW5nIG5vdCB0byBpbXBsZW1lbnQgdGhlIHJlbW90ZSAKLQkJLy8gaW50ZXJmYWNlIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuCi0JCUphdmFDbGFzcyByZW1vdGUgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVtb3RlKTsKLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCByZW1vdGUpKSB7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0ge2NsYXp6LmdldFF1YWxpZmllZE5hbWUoKSwgcmVtb3RlLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDQwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29uc3RydWN0b3IoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQloYXNBQ29uc3RydWN0b3IgPSB0cnVlOwotCQlpZiAoIWhhc1ZhbGlkQ29uc3RydWN0b3IgJiYgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkgJiYgKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkpIHsKLQkJCWhhc1ZhbGlkQ29uc3RydWN0b3IgPSB0cnVlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdGhhdCB0aGUgc3VwcGxpZWQgZWpiQ3JlYXRlIG1ldGhvZCBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWMgcnVsZXMuCi0JICogU2VjdGlvbjogNi4xMC4zCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFRoZSBtZXRob2Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgaGFzIGFscmVhZHkgdGVzdGVkIHRoYXQgdGhlIG1ldGhvZCBuYW1lIGlzIGVqYkNyZWF0ZS4KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSB2b2lkLgotCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCVN0cmluZyByZXR1cm5UeXBlTmFtZSA9ICgocGFybVR5cGUgPT0gbnVsbCkgPyAiIiA6IHBhcm1UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoIXJldHVyblR5cGVOYW1lLmVxdWFscyhJVHlwZUNvbnN0YW50cy5WT0lEKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDAxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBhcmd1bWVudHMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RBcmd1bWVudHModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCXZhbGlkYXRlRWpiQ3JlYXRlTW9kaWZpZXJzQW5kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2RfaG9tZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDYuMTAuMgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmluYWxpemVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBUaGlzIGlzIGEgd2FybmluZywgbm90IGFuIGVycm9yLCBiZWNhdXNlIEVKQiAxLjAgYWxsb3dlZCB0aGUgZmluYWxpemUoKSBtZXRob2QgdG8gYmUgY2FsbGVkLiBFSkIgMS4xIChzZWN0aW9uIDYuMTAuMikgc3BlY2lmaWNhbGx5IHByb2hpYml0cyBpdC4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgotCSAqIFNlY3Rpb246IDYuOCwgNi4xMC4yIGFuZCA2LjEwLjMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZ1tdIG1vZGVsT2JqZWN0TmFtZSA9IG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCWlmICghaGFzVmFsaWRDb25zdHJ1Y3RvciAmJiBoYXNBQ29uc3RydWN0b3IpIHsKLQkJCS8vIElmIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gYXJndW1lbnRzIGRvZXMgbm90IGV4aXN0IGV4cGxpY2l0bHksCi0JCQkvLyBKYXZhIHdpbGwgaW5zZXJ0IG9uZSBhcyBsb25nIGFzIHRoZXJlIGFyZSBubyBjb25zdHJ1Y3RvcnMgZGVmaW5lZCBpbiB0aGUKLQkJCS8vIGNsYXNzLiBJZiB0aGVyZSBpcyBhIGNvbnN0cnVjdG9yLCBKYXZhIGRvZXMgbm90IGluc2VydCBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNDcmVhdGVNZXRob2QoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDA4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtb2RlbE9iamVjdE5hbWUsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBkZWZpbmUgYSBzaW5nbGUgZWpiQ3JlYXRlIG1ldGhvZCB0aGF0IHRha2VzIAotCQkvLyBubyBhcmd1bWVudHMuCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTdGF0ZWxlc3MoYmVhbikgJiYgKGNyZWF0ZU1ldGhvZHMuc2l6ZSgpID4gMCkpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY3JlYXRlTWV0aG9kcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAyNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgKE1ldGhvZCkgaXRlcmF0b3IubmV4dCgpLCBtb2RlbE9iamVjdE5hbWUsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0aGF0IHRoZSBzdXBwbGllZCBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjIHJ1bGVzLgotCSAqCi0JICogZWpiQ3JlYXRlIGFuZCBidXNpbmVzcyBtZXRob2RzIGZvbGxvdyBzb21lIG9mIHRoZSBzYW1lIHJ1bGVzLiBUaGlzIG1ldGhvZCBjaGVja3MgdGhvc2UgcnVsZXMuCi0JICogKFBhcnQgb2Ygc2VjdGlvbnMgNi4xMC4zIGFuZCA2LjEwLjQpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCdXNpbmVzc01vZGlmaWVyc0FuZEV4Y2VwdGlvbnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBFSkIgMi4wIGFkZGVkICJ0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIiBhYm92ZQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA4X2J1cywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkJaWYgKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTBfYnVzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDlfYnVzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMsIHBvc3NpYmx5IAotCQkvLyBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uIAotCQkvLyBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgYnVzaW5lc3MgbWV0aG9kcyB0byB0aHJvdyB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIAotCQkvLyB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50Ci0JCS8vIGVudGVycHJpc2UgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBSdW50aW1lRXhjZXB0aW9uIHRvCi0JCS8vIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfYnVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1vZGlmaWVyc0FuZEV4Y2VwdGlvbnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBFSkIgMi4wIGFkZGVkICJ0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIiBhYm92ZQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA4X2VqYkNyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkJaWYgKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTBfZWpiQ3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDlfZWpiQ3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMsIHBvc3NpYmx5IAotCQkvLyBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uIAotCQkvLyBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgYnVzaW5lc3MgbWV0aG9kcyB0byB0aHJvdyB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIAotCQkvLyB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50Ci0JCS8vIGVudGVycHJpc2UgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBSdW50aW1lRXhjZXB0aW9uIHRvCi0JCS8vIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfZWpiQ3JlYXRlKTsKLQl9Ci0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQloYXNWYWxpZENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JCWhhc0FDb25zdHJ1Y3RvciA9IGZhbHNlOwotCQloYXNEZWZhdWx0Q3JlYXRlTWV0aG9kID0gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uSG9tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlU2Vzc2lvbkhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4YTQzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uSG9tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIFNlc3Npb24gaG9tZSBpbnRlcmZhY2UgY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCi0gKiBTZWN0aW9uOiA2LjggYW5kIDYuMTAuNgotICoKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlU2Vzc2lvbkhvbWUgZXh0ZW5kcyBBVmFsaWRhdGVIb21lIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPSBmYWxzZTsKLQlwcml2YXRlIFNldCBjcmVhdGVNZXRob2RzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0hPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fUkVNT1RFfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA1LCBuZXcgU3RyaW5nW117Q0hLSjIwMDUrQkVYVCwgQ0hLSjIwMDUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTAsIG5ldyBTdHJpbmdbXXtDSEtKMjAxMCtFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMSwgbmV3IFN0cmluZ1tde0NIS0oyMDExK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTIsIG5ldyBTdHJpbmdbXXtDSEtKMjAxMitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDI0LCBuZXcgU3RyaW5nW117Q0hLSjIwMjQrQkVYVCwgQ0hLSjIwMjQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjYsIG5ldyBTdHJpbmdbXXtDSEtKMjAyNitCRVhULCBDSEtKMjAyNitNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tde0NIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA1LCBuZXcgU3RyaW5nW117Q0hLSjI0MDUrQkVYVCwgQ0hLSjI0MDUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNSwgbmV3IFN0cmluZ1tde0NIS0oyNDE1K0JFWFQsIENIS0oyNDE1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE5LCBuZXcgU3RyaW5nW117Q0hLSjI0MTkrQkVYVCwgQ0hLSjI0MTkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCWNyZWF0ZU1ldGhvZHMuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRlU2Vzc2lvbkhvbWUoKSB7Ci0JCWNyZWF0ZU1ldGhvZHMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc0NyZWF0ZU1ldGhvZCgpIHsKLQkJaWYgKGhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPT0gdHJ1ZSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoY3JlYXRlTWV0aG9kcy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbmNyZW1lbnRDcmVhdGVNZXRob2RDb3VudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSAmJiAoIWhhc0RlZmF1bHRDcmVhdGVNZXRob2QpKSB7Ci0JCQloYXNEZWZhdWx0Q3JlYXRlTWV0aG9kID0gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGFkZCBpdCB0byB0aGUgbGlzdCwgZm9yIHJlcG9ydGluZyBleHRyYW5lb3VzIGNyZWF0ZSBtZXRob2RzLCBmb3Igc3RhdGVsZXNzIHNlc3Npb24gYmVhbnMgKHNlY3Rpb24gNi44KQotCQkJY3JlYXRlTWV0aG9kcy5hZGQobWV0aG9kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHRoZSBzZXNzaW9uIGhvbWUgaW50ZXJmYWNlJ3MgbWV0aG9kcyBmb2xsb3cgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKiAKLQkgKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0JICogVmVyc2lvbjogMS4xCi0JICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0JICogUmVsZWFzZTogMTIvMTcvOTkKLQkgKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotCSAqIFNlY3Rpb246IDYuOCBhbmQgNi4xMC42Ci0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgaGlNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vIHN1cGVyLnByaW1WYWxpZGF0ZShoaU1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlTdHJpbmcgbmFtZSA9IGhpTWV0aG9kLmdldE5hbWUoKTsKLQkJLy8gSG9tZSBpbnRlcmZhY2Ugc2hvdWxkIG9ubHkgZGVjbGFyZSBjcmVhdGUgbWV0aG9kcwotCQlpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfQ1JFQVRFKSkgewotCQkJdmFsaWRhdGVDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBoaU1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBIb21lIGludGVyZmFjZSBzaG91bGQgb25seSBkZWNsYXJlIGNyZWF0ZSBtZXRob2RzCi0JCQkvLyAoTm8gbWV0aG9kcyBvdGhlciB0aGFuIGNyZWF0ZSBtZXRob2RzIGFyZSBsaXN0ZWQgaW4gc2VjdGlvbiA2LjEwLjYsCi0JCQkvLyBidXQgb3RoZXIgc2VjdGlvbnMgb2YgdGhlIHNwZWMsIGUuZy4gOS4yLjIsIGV4cGxpY2l0bHkgbGlzdCBlYWNoIHR5cGUKLQkJCS8vIG9mIG1ldGhvZCB3aGljaCBjYW4gYmUgb24gYSBjbGFzcy9pbnRlcmZhY2UuKQotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDE5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBoaU1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCWlmIChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUuZXF1YWxzKGVqYk1ldGhvZC5nZXROYW1lKCkpKQotCQkJaW5jcmVtZW50Q3JlYXRlTWV0aG9kQ291bnQodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGF0IHRoZSBzZXNzaW9uIGhvbWUgY2xhc3MgZGVmaW5pdGlvbiBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWMuCi0JICoKLQkgKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0JICogVmVyc2lvbjogMS4xCi0JICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0JICogUmVsZWFzZTogMTIvMTcvOTkKLQkgKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAotCSAqIFNlY3Rpb246IDYuMTAuNgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkvLyBCb3RoIG9mIHRoZSBhYm92ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSB0aGUgVmFsaWRhdGVIb21lIGNsYXNzJ3MgdmFsaWRhdGVDbGFzcyBtZXRob2QuCi0JCXN1cGVyLnZhbGlkYXRlQ2xhc3ModmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0KLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA2LjggYW5kIDYuMTAuNgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JL0lJT1AuIAotCQkvLyBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkJLy8gZm9yIFJNSS9JSU9QLCBhbmQgdGhhdCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotCQkvLyB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAKLQkJLy8gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiQ3JlYXRlIG1ldGhvZCAKLQkJLy8gb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIAotCQkvLyBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJLy8gVGhlIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JCXZhbGlkYXRlQ3JlYXRlTWV0aG9kX2JlYW5EZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NDcmVhdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9DUkVBVEVFWENFUFRJT04gfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBQZXJmb3JtIHRoZSBjaGVja3Mgd2hpY2ggZGVwZW5kIG9uIGFub3RoZXIgY2xhc3MgaW4gdGhlIGVudGVycHJpc2UgYmVhbi4KLQkJdmFsaWRhdGVDcmVhdGVNZXRob2RfcmVtb3RlRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KLQkgKiBTZWN0aW9uOiA2LjggYW5kIDYuMTAuNgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nW10gbW9kZWxPYmplY3ROYW1lID0gbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQotCQkvLyBBIHNlc3Npb24gYmVhbidzIGhvbWUgbXVzdCBkZWZpbmUgb25lIG9yIG1vcmUgY3JlYXRlIG1ldGhvZHMuCi0JCWlmICghaGFzQ3JlYXRlTWV0aG9kKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAxMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbW9kZWxPYmplY3ROYW1lLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgaG9tZSBpbnRlcmZhY2Ugb2YgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuIG11c3QgaGF2ZSBvbmUgY3JlYXRlIAotCQkvLyBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLQkJLy8gaW50ZXJmYWNlLiBUaGVyZSBjYW4gYmUgbm8gb3RoZXIgY3JlYXRlIG1ldGhvZHMgaW4gdGhlIGhvbWUgaW50ZXJmYWNlLiAKLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1N0YXRlbGVzcyhiZWFuKSAmJiAoY3JlYXRlTWV0aG9kcy5zaXplKCkgPiAwKSkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjcmVhdGVNZXRob2RzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDI0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCAoTWV0aG9kKSBpdGVyYXRvci5uZXh0KCksIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByZVZhbGlkYXRlKHZjLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0JCWhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25SZW1vdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25SZW1vdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyMjA2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uUmVtb3RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLQotLyoqCi0gKiBWYWxpZGF0ZXMgdGhlIHJlbW90ZSBpbnRlcmZhY2Ugb2YgYSBTZXNzaW9uIGJlYW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVNlc3Npb25SZW1vdGUgZXh0ZW5kcyBBVmFsaWRhdGVSZW1vdGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zciI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEyLCBuZXcgU3RyaW5nW117Q0hLSjIwMTIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNSArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMitCRVhULCBDSEtKMjQxMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMywgbmV3IFN0cmluZ1tde0NIS0oyNDEzK0JFWFQsIENIS0oyNDEzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE0LCBuZXcgU3RyaW5nW117Q0hLSjI0MTQrQkVYVCwgQ0hLSjI0MTQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNStCRVhULCBDSEtKMjQxNStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5ZDYxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gaWYgdGhlIHVzZXIgY2FuY2VscyB2YWxpZGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcwNjU2NTUzNDcwMzAxMDMyODlMOwotCi0JcHVibGljIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SdWxlVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SdWxlVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWMwN2QxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUnVsZVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5Mb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0aW9uUnVsZVV0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgbG9uZyBtZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPSAweDE7IC8vIHVzZWQgYnkgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLmphdmEKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBfcmVzZXJ2ZWRXb3JkcyA9IG5ldyBTdHJpbmdbXXsiU0VMRUNUIiwgIkZST00iLCAiV0hFUkUiLCAiRElTVElOQ1QiLCAiT0JKRUNUIiwgIk5VTEwiLCAiVFJVRSIsICJGQUxTRSIsICJOT1QiLCAiQU5EIiwgIk9SIiwgIkJFVFdFRU4iLCAiTElLRSIsICJJTiIsICJBUyIsICJVTktOT1dOIiwgIkVNUFRZIiwgIk1FTUJFUiIsICJPRiIsICJJUyJ9OyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy0xMCQgLy8kTk9OLU5MUy0xMSQgLy8kTk9OLU5MUy0xMiQgLy8kTk9OLU5MUy0xMyQgLy8kTk9OLU5MUy0xNCQgLy8kTk9OLU5MUy0xNSQgLy8kTk9OLU5MUy0xNiQgLy8kTk9OLU5MUy0xNyQgLy8kTk9OLU5MUy0xOCQgLy8kTk9OLU5MUy0xOSQgLy8kTk9OLU5MUy0yMCQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUEgPSAiLCAiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBMb2dFbnRyeSBsb2dFbnRyeSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGhlbHBlck1hcCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBNYXAgcHJvamVjdEhlbHBlck1hcCA9ICAgQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKCBuZXcgSGFzaE1hcCgpICk7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaFNldCBjb21tb25DbGFzc05hbWVzID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIEphdmFDbGFzcyBnZXRDTVJGaWVsZFR5cGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIENNUkZpZWxkIGZpZWxkKSB7Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IGZpZWxkLmdldFJvbGUoKTsKLQkJaWYoIXJvbGUuaXNNYW55KCkpIHsKLQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gcm9sZS5nZXRUeXBlRW50aXR5KCk7Ci0JCQlpZihjbXAgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlKYXZhQ2xhc3MgbG9jYWwgPSBjbXAuZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJCS8vIElmIHRoZSB1c2VyIGhhcyBtYWRlIGEgbWlzdGFrZSBpbiBlamItamFyLnhtbCwgYW5kIHRoZXkgYXJlIHRyeWluZyB0byBtYWtlCi0JCQkvLyBhIHJlbGF0aW9uc2hpcCB0byBhIGNtcCB3aGljaCBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgaW50ZXJmYWNlLCBhbiBJbnZhbGlkSW5wdXRFeGNlcHRpb24KLQkJCS8vIHdpbGwgYmUgdGhyb3duLiBMZXQgdGhlIEREIHZhbGlkYXRpb24gY2F0Y2ggdGhhdCBlcnJvcjsganVzdCByZXR1cm4KLQkJCS8vIHdoZW4gdGhpcyBoYXBwZW5zLgotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoY21wLCBsb2NhbCk7Ci0JCQl9Ci0JCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGxvY2FsOwotCQl9Ci0JCQkvLyA8Y21yLWZpZWxkLXR5cGU+IGlzIGVpdGhlciBhIGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGEgamF2YS51dGlsLlNldCAocC4gNDY0KQotCQkJcmV0dXJuIGZpZWxkLmdldENvbGxlY3Rpb25UeXBlKCk7Ci0JfQotCi0JCi0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZm9sbG93c0ZpbmRlckV4Y2VwdGlvblJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0ZpbmRlckV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBmb2xsb3dzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25SdWxlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxFbnVtZXJhdGlvbiA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfRU5VTUVSQVRJT04sIGJlYW4pOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBqYXZhVXRpbEVudW1lcmF0aW9uKSkgewotCQkJLy8gT25seSBzaW5nbGUgb2JqZWN0IGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgbWF5IHRocm93IHRoaXMgZXhjZXB0aW9uCi0JCQlyZXR1cm4gIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwotCQl9Ci0JCQotCQlKYXZhSGVscGVycyBqYXZhVXRpbENvbGxlY3Rpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04sIGJlYW4pOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBqYXZhVXRpbENvbGxlY3Rpb24pKSB7Ci0JCQkvLyBPbmx5IHNpbmdsZSBvYmplY3QgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBtYXkgdGhyb3cgdGhpcyBleGNlcHRpb24KLQkJCXJldHVybiAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCk7Ci0JCX0KLQkJCi0JCS8vIEl0J3MgYSBzaW5nbGUgZmluZGVyL3NlbGVjdCBtZXRob2QsIHNvIGl0IGNhbiB0aHJvdyB0aGUgZXhjZXB0aW9uLCB0aG91Z2ggaXQgaXMgbm90IHJlcXVpcmVkIHRvLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBpdCBleGlzdHMsIHJldHVybiB0aGUgTWV0aG9kIGZyb20gdGhlIG1ldGhvZCBsaXN0IHdoaWNoIGhhcyB0aGUgZ2l2ZW4KLQkgKiBuYW1lIGFuZCBwYXJhbWV0ZXIgdHlwZXMgKGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcnJheSBlbGVtZW50cykuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGR1cGxpY2F0ZSBvZiBnZXRNZXRob2RFeHRlbmRlZChTdHJpbmcsIFN0cmluZ1tdKS4KLQkgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIGNvZGUgd2FzIGR1cGxpY2F0ZWQgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRoZQotCSAqIEphdmFQYXJhbWV0ZXJbXSBpbnRvIGEgU3RyaW5nW10uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbmFtZSwgSmF2YVBhcmFtZXRlcltdIHBhcmFtZXRlclR5cGVzLCBMaXN0IG1ldGhvZExpc3QpIHsKLQkJaWYobWV0aG9kTGlzdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUphdmFQYXJhbWV0ZXJbXSBwYXJhbXMgPSBudWxsOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWV0aG9kTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlwYXJhbXMgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JCQkJCi0JCQkJaWYgKHBhcmFtcy5sZW5ndGggPT0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsgLy9NYXliZTsgd2UgbmVlZCBtb3JlIGluZm8KLQkJCQkJCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkvL2lmIGFueSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgZG9lc24ndCBtYXRjaCB0aGVuIGZsaXAgYmFjayB0byBmYWxzZQotCQkJCQkJSmF2YUhlbHBlcnMgcGFybSA9ICgoSmF2YUhlbHBlcnMpcGFyYW1zW2pdLmdldEVUeXBlKCkpOwotCQkJCQkJSmF2YUhlbHBlcnMgdHlwZSA9ICgoSmF2YUhlbHBlcnMpcGFyYW1ldGVyVHlwZXNbal0uZ2V0RVR5cGUoKSk7Ci0JCQkJCQlpZighaXNTYW1lVHlwZShwYXJtLCB0eXBlKSkgewotCQkJCQkJCWZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChmb3VuZCkgewotCQkJCQkJcmV0dXJuIG1ldGhvZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbmFtZSwgSmF2YUhlbHBlcnNbXSBwYXJhbWV0ZXJUeXBlcywgTGlzdCBtZXRob2RMaXN0KSB7Ci0JCWlmKG1ldGhvZExpc3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlKYXZhUGFyYW1ldGVyW10gcGFyYW1zID0gbnVsbDsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1ldGhvZExpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcGFyYW1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQotCQkJCWlmIChwYXJhbXMubGVuZ3RoID09IHBhcmFtZXRlclR5cGVzLmxlbmd0aCkgewotCQkJCQlmb3VuZCA9IHRydWU7IC8vTWF5YmU7IHdlIG5lZWQgbW9yZSBpbmZvCi0JCQkJCQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykgewotCQkJCQkJLy9pZiBhbnkgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGRvZXNuJ3QgbWF0Y2ggdGhlbiBmbGlwIGJhY2sgdG8gZmFsc2UKLQkJCQkJCUphdmFIZWxwZXJzIHBhcm0gPSAoKEphdmFIZWxwZXJzKXBhcmFtc1tqXS5nZXRFVHlwZSgpKTsKLQkJCQkJCUphdmFIZWxwZXJzIHR5cGUgPSBwYXJhbWV0ZXJUeXBlc1tqXTsKLQkJCQkJCWlmKCFpc1NhbWVUeXBlKHBhcm0sIHR5cGUpKSB7Ci0JCQkJCQkJZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBGcm9tIEphdmFDbGFzcyBjbGF6eiwgcmV0dXJuIGEgbWV0aG9kLCBuYW1lZCBtZXRob2ROYW1lVG9GaW5kLAotCSAqIHdoaWNoIGhhcyBleGFjdGx5IHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBtZXRob2RUb01hdGNoLgotCSAqCi0JICogSWYgbm8gbWV0aG9kIGV4aXN0cyB3aXRoIHRoYXQgbmFtZSBhbmQgYXJndW1lbnQgbGlzdCwgcmV0dXJuIG51bGwuCi0JICogCi0JICogVGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgdGhlIGV4Y2VwdGlvbnMgb3IgcmV0dXJuIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKE1ldGhvZCBtZXRob2RUb01hdGNoLCBTdHJpbmcgbWV0aG9kTmFtZVRvRmluZCwgTGlzdCBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCWlmKG1ldGhvZHNFeHRlbmRlZExpc3QgPT0gbnVsbCkgewotCQkJLy8gSXQgaXMgbm90IGludmFsaWQgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aXRoIGEgbnVsbCBMaXN0LiBBIG51bGwgTGlzdAotCQkJLy8gbWVhbnMgdGhhdCBhIHR5cGUgd2hvc2UgbWV0aG9kcyBuZWVkIHRvIGJlIHNlYXJjaGVkIGRvZXNuJ3QgZXhpc3QsCi0JCQkvLyBzdWNoIGFzIHNlYXJjaGluZyBhIGxvY2FsIHZpZXcsIGJ1dCB0aGUgYmVhbiBoYXMgb25seSBhIHJlbW90ZSB2aWV3LgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldE1ldGhvZChtZXRob2ROYW1lVG9GaW5kLCBtZXRob2RUb01hdGNoLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogRnJvbSBKYXZhQ2xhc3MgY2xhenosIHJldHVybiBhIG1ldGhvZCwgbmFtZWQgbWV0aG9kTmFtZVRvRmluZCwKLQkgKiB3aGljaCBoYXMgZXhhY3RseSB0aGUgc2FtZSBhcmd1bWVudHMgYXMgbWV0aG9kVG9NYXRjaC4KLQkgKgotCSAqIElmIG5vIG1ldGhvZCBleGlzdHMgd2l0aCB0aGF0IG5hbWUgYW5kIGFyZ3VtZW50IGxpc3QsIHJldHVybiBudWxsLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNoZWNrIHRoZSBleGNlcHRpb25zIG9yIHJldHVybiB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZFRvTWF0Y2gsIFN0cmluZyBtZXRob2ROYW1lVG9GaW5kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKChjbGF6eiA9PSBudWxsKSB8fCAobWV0aG9kVG9NYXRjaCA9PSBudWxsKSB8fCAobWV0aG9kTmFtZVRvRmluZCA9PSBudWxsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWVUb0ZpbmQsIG1ldGhvZFRvTWF0Y2gubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgZHVwbGljYXRlIG9mIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZywgU3RyaW5nW10pLgotCSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgY29kZSB3YXMgZHVwbGljYXRlZCBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgdGhlCi0JICogSmF2YVBhcmFtZXRlcltdIGludG8gYSBTdHJpbmdbXS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RFeHRlbmRlZChKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBKYXZhUGFyYW1ldGVyW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJaWYgKGNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKLQkJCS8vIENoZWNrIHRoZSBjdXJyZW50IGNsYXNzIGZpcnN0LiBJZiB0aGUgbWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiwKLQkJCS8vIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBwYXJlbnQncyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgY2hpbGQncy4KLQkJCXJldHVybiBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChjbGF6eiwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCS8vIENoZWNrIHRoZSBjdXJyZW50IGNsYXNzIGZpcnN0LiBJZiB0aGUgbWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiwKLQkJLy8gZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIHBhcmVudCdzIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBjaGlsZCdzLgotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gbnVsbDsKLQkJZG8gewotCQkJbWV0aG9kcyA9IGNsYXp6LmdldE1ldGhvZHMoKTsKLQkJCW1ldGhvZCA9IGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgbWV0aG9kcyk7Ci0JCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCi0JCQkvLyBlbHNlLCBzZWFyY2ggdGhlIHBhcmVudAkKLQkJCWNsYXp6ID0gY2xhenouZ2V0U3VwZXJ0eXBlKCk7Ci0JCX0KLQkJd2hpbGUgKChtZXRob2QgPT0gbnVsbCkgJiYgKGNsYXp6ICE9IG51bGwpKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGR1cGxpY2F0ZSBvZiBnZXRNZXRob2RFeHRlbmRlZChTdHJpbmcsIEphdmFQYXJhbWV0ZXJbXSkuCi0JICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSBjb2RlIHdhcyBkdXBsaWNhdGVkIGluc3RlYWQgb2YgY29udmVydGluZyB0aGUKLQkgKiBKYXZhSGVscGVyc1tdIGludG8gYSBKYXZhUGFyYW1ldGVyW10uCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kRXh0ZW5kZWQoSmF2YUNsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgSmF2YUhlbHBlcnNbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGR1cGxpY2F0ZSBvZiBnZXRNZXRob2RFeHRlbmRlZChTdHJpbmcsIEphdmFQYXJhbWV0ZXJbXSkuCi0JICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSBjb2RlIHdhcyBkdXBsaWNhdGVkIGluc3RlYWQgb2YgY29udmVydGluZyB0aGUKLQkgKiBKYXZhSGVscGVyc1tdIGludG8gYSBKYXZhUGFyYW1ldGVyW10uCi0JICogCi0JICogSWYgcmV0VHlwZSBpcyBudWxsIGl0IG1lYW5zIHRoYXQgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgZG9lc24ndCBuZWVkIHRvIGJlIGNoZWNrZWQuCi0JICogT3RoZXJ3aXNlLCBjaGVjayB0aGF0IHRoZSByZXR1cm4gdHlwZSBtYXRjaGVzIHRvby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RFeHRlbmRlZChKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBKYXZhSGVscGVyc1tdIHBhcmFtZXRlclR5cGVzLCBKYXZhSGVscGVycyByZXRUeXBlKSB7Ci0JCWlmIChjbGF6ei5pc0ludGVyZmFjZSgpKSB7Ci0JCQkvLyBDaGVjayB0aGUgY3VycmVudCBjbGFzcyBmaXJzdC4gSWYgdGhlIG1ldGhvZCBoYXMgYmVlbiBvdmVycmlkZW4sCi0JCQkvLyBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgcGFyZW50J3MgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGNoaWxkJ3MuCi0JCQlyZXR1cm4gZ2V0TWV0aG9kSW50ZXJmYWNlRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQkvLyBDaGVjayB0aGUgY3VycmVudCBjbGFzcyBmaXJzdC4gSWYgdGhlIG1ldGhvZCBoYXMgYmVlbiBvdmVycmlkZW4sCi0JCS8vIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBwYXJlbnQncyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgY2hpbGQncy4KLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3QgbWV0aG9kcyA9IG51bGw7Ci0JCWRvIHsKLQkJCW1ldGhvZHMgPSBjbGF6ei5nZXRNZXRob2RzKCk7Ci0JCQltZXRob2QgPSBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIG1ldGhvZHMpOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJaWYocmV0VHlwZSAhPSBudWxsKSB7Ci0JCQkJCUphdmFIZWxwZXJzIG1ldGhSZXRUeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCQkJaWYoaXNBc3NpZ25hYmxlRnJvbShtZXRoUmV0VHlwZSwgcmV0VHlwZSkpIHsKLQkJCQkJCXJldHVybiBtZXRob2Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBtZXRob2Q7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBlbHNlLCBzZWFyY2ggdGhlIHBhcmVudAkKLQkJCWNsYXp6ID0gY2xhenouZ2V0U3VwZXJ0eXBlKCk7Ci0JCX0KLQkJd2hpbGUgKChtZXRob2QgPT0gbnVsbCkgJiYgKGNsYXp6ICE9IG51bGwpKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0gICAgICoKLQkgKiAKLQkgKiBJZiByZXRUeXBlIGlzIG51bGwgaXQgbWVhbnMgdGhhdCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCBkb2Vzbid0IG5lZWQgdG8gYmUgY2hlY2tlZC4KLQkgKiBPdGhlcndpc2UsIGNoZWNrIHRoYXQgdGhlIHJldHVybiB0eXBlIG1hdGNoZXMgdG9vLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKEphdmFDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsIEphdmFQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJUeXBlcywgSmF2YUhlbHBlcnMgcmV0VHlwZSkgewotCQlpZiAoY2xhenouaXNJbnRlcmZhY2UoKSkgewotCQkJLy8gQ2hlY2sgdGhlIGN1cnJlbnQgY2xhc3MgZmlyc3QuIElmIHRoZSBtZXRob2QgaGFzIGJlZW4gb3ZlcnJpZGVuLAotCQkJLy8gZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIHBhcmVudCdzIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBjaGlsZCdzLgotCQkJcmV0dXJuIGdldE1ldGhvZEludGVyZmFjZUV4dGVuZGVkKGNsYXp6LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0KLQkJLy8gQ2hlY2sgdGhlIGN1cnJlbnQgY2xhc3MgZmlyc3QuIElmIHRoZSBtZXRob2QgaGFzIGJlZW4gb3ZlcnJpZGVuLAotCQkvLyBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgcGFyZW50J3MgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGNoaWxkJ3MuCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlMaXN0IG1ldGhvZHMgPSBudWxsOwotCQlkbyB7Ci0JCQltZXRob2RzID0gY2xhenouZ2V0TWV0aG9kcygpOwotCQkJbWV0aG9kID0gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBtZXRob2RzKTsKLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCWlmKHJldFR5cGUgIT0gbnVsbCkgewotCQkJCQlKYXZhSGVscGVycyBtZXRoUmV0VHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQkJCWlmKGlzQXNzaWduYWJsZUZyb20obWV0aFJldFR5cGUsIHJldFR5cGUpKSB7Ci0JCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZWxzZSwgc2VhcmNoIHRoZSBwYXJlbnQJCi0JCQljbGF6eiA9IGNsYXp6LmdldFN1cGVydHlwZSgpOwotCQl9Ci0JCXdoaWxlICgobWV0aG9kID09IG51bGwpICYmIChjbGF6eiAhPSBudWxsKSk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqCi0JICogVGhpcyBtZXRob2QgaXMgYSBkdXBsaWNhdGUgb2YgZ2V0TWV0aG9kSW50ZXJmYWNlRXh0ZW5kZWQoU3RyaW5nLCBTdHJpbmdbXSwgSmF2YUNsYXNzKS4KLQkgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIGNvZGUgd2FzIGR1cGxpY2F0ZWQgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRoZQotCSAqIEphdmFQYXJhbWV0ZXJbXSBpbnRvIGEgU3RyaW5nW10uCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kSW50ZXJmYWNlRXh0ZW5kZWQoSmF2YUNsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgSmF2YVBhcmFtZXRlcltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCWlmIChjbGF6eiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIENoZWNrIHRoZSBjdXJyZW50IGNsYXNzIGZpcnN0LiBJZiB0aGUgbWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiwKLQkJLy8gZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIHBhcmVudCdzIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBjaGlsZCdzLgotCQlNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBjbGF6ei5nZXRNZXRob2RzKCkpOwotCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCXJldHVybiBtZXRob2Q7Ci0JCX0KLQkJLy8gY2hlY2sgcGFyZW50cwotCQlMaXN0IGNsYXNzZXNUb0NoZWNrID0gY2xhenouZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQkJSXRlcmF0b3IgY2xhenpJdGVyYXRvciA9IGNsYXNzZXNUb0NoZWNrLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjbGF6ekl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJY2xhenogPSAoSmF2YUNsYXNzKSBjbGF6ekl0ZXJhdG9yLm5leHQoKTsKLQkJCW1ldGhvZCA9IGdldE1ldGhvZEludGVyZmFjZUV4dGVuZGVkKGNsYXp6LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZEludGVyZmFjZUV4dGVuZGVkKEphdmFDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsIEphdmFIZWxwZXJzW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJaWYgKGNsYXp6ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQ2hlY2sgdGhlIGN1cnJlbnQgY2xhc3MgZmlyc3QuIElmIHRoZSBtZXRob2QgaGFzIGJlZW4gb3ZlcnJpZGVuLAotCQkvLyBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgcGFyZW50J3MgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGNoaWxkJ3MuCi0JCU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGNsYXp6LmdldE1ldGhvZHMoKSk7Ci0JCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQkvLyBjaGVjayBwYXJlbnRzCi0JCUxpc3QgY2xhc3Nlc1RvQ2hlY2sgPSBjbGF6ei5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCQlJdGVyYXRvciBjbGF6ekl0ZXJhdG9yID0gY2xhc3Nlc1RvQ2hlY2suaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNsYXp6SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQljbGF6eiA9IChKYXZhQ2xhc3MpIGNsYXp6SXRlcmF0b3IubmV4dCgpOwotCQkJbWV0aG9kID0gZ2V0TWV0aG9kSW50ZXJmYWNlRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IG1ldGhvZCBidXQgbm90IG1ldGhvZFRvTWF0Y2guCi0JICogSWYgdGhlcmUgYXJlIG5vIHN1Y2ggZXhjZXB0aW9ucywgcmV0dXJuIG51bGwuIChDaGVjayB0aGUgbGlzdCBvZiBleGNlcHRpb25zCi0JICogaW4gdGhlIG1ldGhvZCBmb3IgZWFjaCBleGNlcHRpb24sIG9yIGEgcGFyZW50IG9mIHRoZSBleGNlcHRpb24uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IGdldE5vdFN1YnNldEV4Y2VwdGlvbnMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCwgTWV0aG9kIG1ldGhvZFRvTWF0Y2gpIHsKLQkJaWYoKG1ldGhvZFRvTWF0Y2ggPT0gbnVsbCkgfHwgKG1ldGhvZCA9PSBudWxsKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJfQotCQkKLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYSBtZXRob2Qgb2YgdGhlIAotCQkvLyBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyAKLQkJLy8gbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJLy8KLQkJLy8gU2VjdGlvbiAxMi4yLjIKLQkJLy8gWzE1XSBBIGNoZWNrZWQgZXhjZXB0aW9uIGlzIG9uZSB0aGF0IGlzIG5vdCBhIHN1YmNsYXNzIG9mIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JCS8vICJOb3RlIHRoYXQgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gaXMgYSBzdWJjbGFzcyBvZiB0aGUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24sCi0JCS8vIGFuZCB0aGVyZWZvcmUgaXQgZG9lcyBub3QgaGF2ZSB0byBiZSBsaXN0ZWQgaW4gdGhlIHRocm93cyBjbGF1c2VzIG9mIHRoZSBidXNpbmVzcwotCQkvLyBtZXRob2RzLiIKLQkJSGFzaFNldCBleGNlcHRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCBtZXRoVG9NYXRjaEV4Y2VwdGlvbnMgPSBtZXRob2RUb01hdGNoLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCUxpc3QgZm91bmRNZXRoRXhjZXB0aW9ucyA9IG1ldGhvZC5nZXRKYXZhRXhjZXB0aW9ucygpOwotCQlmb3IoIGludCBpID0gMDsgaSA8IGZvdW5kTWV0aEV4Y2VwdGlvbnMuc2l6ZSgpOyBpKysgKSB7Ci0JCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylmb3VuZE1ldGhFeGNlcHRpb25zLmdldChpKTsKLQkJCWlmICggIWlzUnVudGltZUV4Y2VwdGlvbihleGMsIGJlYW4pICYmICFpc1JlbW90ZUV4Y2VwdGlvbihleGMsIGJlYW4pICYmICFpc0V4Y2VwdGlvbkluTGlzdChleGMsIG1ldGhUb01hdGNoRXhjZXB0aW9ucykgKSB7Ci0JCQkJZXhjZXB0aW9ucy5hZGQoZXhjKTsKLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gZXhjZXB0aW9uczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBleGNlcHRpb25zIHRocm93biBieSBtZXRob2QgYnV0IG5vdCBtZXRob2RUb01hdGNoLgotCSAqIElmIHRoZXJlIGFyZSBubyBzdWNoIGV4Y2VwdGlvbnMsIHJldHVybiBudWxsLiAoQ2hlY2sgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucwotCSAqIGluIHRoZSBtZXRob2QgZm9yIGVhY2ggZXhjZXB0aW9uLCBvciBhIGNoaWxkIG9mIHRoZSBleGNlcHRpb24uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IGdldE5vdFN1YnNldFN1YnR5cGVFeGNlcHRpb25zKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QsIE1ldGhvZCBtZXRob2RUb01hdGNoKSB7Ci0JCWlmKChtZXRob2RUb01hdGNoID09IG51bGwpIHx8IChtZXRob2QgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQkJCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgbWV0aG9kIG9mIHRoZSAKLQkJLy8gZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgCi0JCS8vIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCS8vCi0JCS8vIFNlY3Rpb24gMTIuMi4yCi0JCS8vIFsxNV0gQSBjaGVja2VkIGV4Y2VwdGlvbiBpcyBvbmUgdGhhdCBpcyBub3QgYSBzdWJjbGFzcyBvZiBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCQkvLyAiTm90ZSB0aGF0IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uLAotCQkvLyBhbmQgdGhlcmVmb3JlIGl0IGRvZXMgbm90IGhhdmUgdG8gYmUgbGlzdGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlcyBvZiB0aGUgYnVzaW5lc3MKLQkJLy8gbWV0aG9kcy4iCi0JCUhhc2hTZXQgZXhjZXB0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgbWV0aFRvTWF0Y2hFeGNlcHRpb25zID0gbWV0aG9kVG9NYXRjaC5nZXRKYXZhRXhjZXB0aW9ucygpOwotCQlMaXN0IGZvdW5kTWV0aEV4Y2VwdGlvbnMgPSBtZXRob2QuZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBmb3VuZE1ldGhFeGNlcHRpb25zLnNpemUoKTsgaSsrICkgewotCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpZm91bmRNZXRoRXhjZXB0aW9ucy5nZXQoaSk7Ci0JCQlpZiAoICFpc1J1bnRpbWVFeGNlcHRpb24oZXhjLCBiZWFuKSAmJiAhaXNSZW1vdGVFeGNlcHRpb24oZXhjLCBiZWFuKSAmJiAhaXNTdWJ0eXBlRXhjZXB0aW9uSW5MaXN0KGV4YywgbWV0aFRvTWF0Y2hFeGNlcHRpb25zKSApIHsKLQkJCQlleGNlcHRpb25zLmFkZChleGMpOwotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBleGNlcHRpb25zOwotCX0KLQkKLQkvKioKLQkgKiAJRXhjbHVkZSByb290IGhvbWUgaW50ZXJmYWNlIG1ldGhvZHMgCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCSG9tZU1ldGhvZChFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBpc1NhbWVUeXBlKGJlYW4sIG1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCksIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCSE9NRSk7Ci0JfQotCQotCS8qKgotCSAqIAlFeGNsdWRlIHJvb3QgcmVtb3RlIGludGVyZmFjZSBtZXRob2RzIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VKQk9iamVjdE1ldGhvZChFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBpc1NhbWVUeXBlKGJlYW4sIG1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCksIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCT0JKRUNUKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGV4Y2VwdGlvbiwgb3IgYSBwYXJlbnQgb2YgdGhlIGV4Y2VwdGlvbiwgaXMgaW4gdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucy4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRXhjZXB0aW9uSW5MaXN0KEphdmFDbGFzcyBleGMsIExpc3QgZXhjZXB0aW9uTGlzdCkgewotCSAgICAgICBpZigoZXhjID09IG51bGwpIHx8IChleGNlcHRpb25MaXN0ID09IG51bGwpKSB7Ci0JICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgIH0KLQkgICAgICAgCi0JICAgICAgIGlmKCFleGMuaXNFeGlzdGluZ1R5cGUoKSkgewotCSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgICB9Ci0JICAgICAgIAotCSAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbkxpc3QuaXRlcmF0b3IoKTsKLQkgICAgICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JICAgICAgICAgICAgICBKYXZhQ2xhc3MgZXhjZXB0aW9uID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JICAgICAgICAgICAgICBpZihpc0Fzc2lnbmFibGVGcm9tKGV4YywgZXhjZXB0aW9uKSkgewotCSAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmbGVjdGlvbiBwcm9ibGVtLCBkbyBub3Qgc3dhbGxvdyB0aGUgZXhjZXB0aW9uIG9yIGEKLQkgICAgICAgICAgICAgICAgICAgICAvLyBmYXVsdHkgbWVzc2FnZSBtYXkgYXBwZWFyLiAoaS5lLiwgImV4YyIgaXMgbm90IHRocm93biBieSAiZm9vIiB3aGVuIGl0Ci0JICAgICAgICAgICAgICAgICAgICAgLy8gcmVhbGx5IGlzIGJ1dCBvbmUgb2YgZm9vJ3MgZXhjZXB0aW9ucyB3YXNuJ3QgcmVmbGVjdGVkLgotCSAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCSAgICAgICAgICAgICAgfQotCSAgICAgICB9Ci0JICAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGV4Y2VwdGlvbiwgb3IgYSBjaGlsZCBvZiB0aGUgZXhjZXB0aW9uLCBpcyBpbiB0aGUgbGlzdCBvZiBleGNlcHRpb25zLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNTdWJ0eXBlRXhjZXB0aW9uSW5MaXN0KEphdmFDbGFzcyBleGMsIExpc3QgZXhjZXB0aW9uTGlzdCkgewotCSAgICAgICBpZigoZXhjID09IG51bGwpIHx8IChleGNlcHRpb25MaXN0ID09IG51bGwpKSB7Ci0JICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgIH0KLQkgICAgICAgCi0JICAgICAgIGlmKCFleGMuaXNFeGlzdGluZ1R5cGUoKSkgewotCSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgICB9Ci0JICAgICAgIAotCSAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbkxpc3QuaXRlcmF0b3IoKTsKLQkgICAgICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JICAgICAgICAgICAgICBKYXZhQ2xhc3MgZXhjZXB0aW9uID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JICAgICAgICAgICAgICBpZihpc0Fzc2lnbmFibGVGcm9tKGV4Y2VwdGlvbiwgZXhjKSkgewotCSAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmbGVjdGlvbiBwcm9ibGVtLCBkbyBub3Qgc3dhbGxvdyB0aGUgZXhjZXB0aW9uIG9yIGEKLQkgICAgICAgICAgICAgICAgICAgICAvLyBmYXVsdHkgbWVzc2FnZSBtYXkgYXBwZWFyLiAoaS5lLiwgImV4YyIgaXMgbm90IHRocm93biBieSAiZm9vIiB3aGVuIGl0Ci0JICAgICAgICAgICAgICAgICAgICAgLy8gcmVhbGx5IGlzIGJ1dCBvbmUgb2YgZm9vJ3MgZXhjZXB0aW9ucyB3YXNuJ3QgcmVmbGVjdGVkLgotCSAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCSAgICAgICAgICAgICAgfQotCSAgICAgICB9Ci0JICAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBPZnRlbiwgZm9yIHZhbGlkYXRpb24gbWVzc2FnZXMsIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgY29udGFpbnMKLQkgKiB0aGUgbmFtZSBvZiBhIGNsYXNzLiBCdXQsIHNvbWV0aW1lcywgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBpcwotCSAqIGJlaW5nIGdlbmVyYXRlZCBiZWNhdXNlIGEgY2xhc3MgaXMgbnVsbCB3aGVuIGl0IHNob3VsZG4ndCBiZS4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGhlbHBlciBtZXRob2Qgd2hpY2ggbWFrZXMgdGhlIGNvbnN0cnVjdGlvbiBvZgotCSAqIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgYSBsaXR0bGUgbGVzcyBjbHV0dGVyZWQgKGkuZS4sIGluc3RlYWQKLQkgKiBvZiBjaGVja2luZyBpZiB0aGUgY2xhc3MgaXMgbnVsbCBiZWZvcmUgY29uc3RydWN0aW5nIHRoZQotCSAqIG1lc3NhZ2UsIGp1c3QgY2FsbCB0aGlzIG1ldGhvZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZShKYXZhSGVscGVycyBoZWxwZXIpIHsKLQkJaWYoaGVscGVyID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBoZWxwZXIuZ2V0SmF2YU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCdzIHBhcmFtZXRlcnMgaW4gYSBkaXNwbGF5YWJsZSBmb3JtYXQuIGUuZy4sIGlmCi0JICogdGhlIG1ldGhvZCBzaWduYXR1cmUgaXMgInB1YmxpYyBJbnRlZ2VyIGZvbyhTdHJpbmcgYSwgU3RyaW5nIGIsIFN0cmluZyBjKSIKLQkgKiB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgIlN0cmluZywgU3RyaW5nLCBTdHJpbmciLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRQYXJtc0FzU3RyaW5nKE1ldGhvZCBtZXRob2QpIHsKLQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0UGFybXNBc1N0cmluZyhtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhcmFtZXRlcnMgaW4gYSBkaXNwbGF5YWJsZSBmb3JtYXQuIAotCSAqIEBzZWUgZ2V0UGFybXNBc1N0cmluZyhNZXRob2QpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0UGFybXNBc1N0cmluZyhKYXZhUGFyYW1ldGVyW10gcGFybSkgewotCQlpZihwYXJtLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yKGludCBpPTA7IGk8cGFybS5sZW5ndGg7IGkrKykgewotCQkJSmF2YUhlbHBlcnMgdHlwZSA9IHBhcm1baV0uZ2V0SmF2YVR5cGUoKTsKLQkJCWJ1ZmZlci5hcHBlbmQoKCh0eXBlID09IG51bGwpID8gIm51bGwiIDogdHlwZS5nZXRKYXZhTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoQ09NTUEpOwotCQl9Ci0JCXJldHVybiBidWZmZXIuc3Vic3RyaW5nKDAsIGJ1ZmZlci5sZW5ndGgoKSAtIDIpOyAvLyBzaW5jZSAiQ09NTUEiIGlzIDIgY2hhciBsb25nLCBhbmQgdGhlIGxhc3QgQ09NTUEgaXNuJ3QgbmVlZGVkIGF0IHRoZSBlbmQsIHJldHVybiBldmVyeXRoaW5nIHVwIHRvIGJ1dCBleGNsdWRpbmcgdGhlIGxhc3QgQ09NTUEKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhcmFtZXRlcnMgaW4gYSBkaXNwbGF5YWJsZSBmb3JtYXQuIAotCSAqIEBzZWUgZ2V0UGFybXNBc1N0cmluZyhNZXRob2QpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0UGFybXNBc1N0cmluZyhKYXZhSGVscGVyc1tdIHBhcm0pIHsKLQkJaWYocGFybS5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcihpbnQgaT0wOyBpPHBhcm0ubGVuZ3RoOyBpKyspIHsKLQkJCUphdmFIZWxwZXJzIHR5cGUgPSBwYXJtW2ldOwotCQkJYnVmZmVyLmFwcGVuZCgoKHR5cGUgPT0gbnVsbCkgPyAibnVsbCIgOiB0eXBlLmdldEphdmFOYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChDT01NQSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci5zdWJzdHJpbmcoMCwgYnVmZmVyLmxlbmd0aCgpIC0gMik7IC8vIHNpbmNlICJDT01NQSIgaXMgMiBjaGFyIGxvbmcsIGFuZCB0aGUgbGFzdCBDT01NQSBpc24ndCBuZWVkZWQgYXQgdGhlIGVuZCwgcmV0dXJuIGV2ZXJ5dGhpbmcgdXAgdG8gYnV0IGV4Y2x1ZGluZyB0aGUgbGFzdCBDT01NQQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0eXBlLCBlLmcuICJjb20uaWJtLmZvby5NeUZvbyIKLQkgKiBJZiB0aGUgdHlwZSBpcyBhbiBhcnJheSwgdGhlIGFycmF5IHR5cGUgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiBlLmcuIGlmIHRoZSB0eXBlIGlzIGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLlN0cmluZ1tdIHdpbGwKLQkgKiBiZSByZXR1cm5lZCwgbm90IHRoZSBqYXZhLmxhbmcuU3RyaW5nIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhSGVscGVycyBnZXRUeXBlKEVDbGFzc2lmaWVyIGNsYXNzaWZpZXIpIHsKLQkJaWYoY2xhc3NpZmllciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQotCQlKYXZhSGVscGVycyB0eXBlID0gKChKYXZhSGVscGVycyljbGFzc2lmaWVyKTsKLQkKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JIC8qKgotICAgICAqIGphdmFDbGFzc05hbWUgbXVzdCBiZSBmdWxseSBxdWFsaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEphdmFIZWxwZXJzIGdldFR5cGUoU3RyaW5nIGphdmFDbGFzc05hbWUsIEVudGVycHJpc2VCZWFuIGVqYikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmICgoamF2YUNsYXNzTmFtZSA9PSBudWxsKSB8fCAoamF2YUNsYXNzTmFtZS5lcXVhbHMoIiIpIHx8IChlamIgPT0gbnVsbCkpKSAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlamIuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlKYXZhSGVscGVycyBoZWxwZXIgPSBudWxsOwotCQlpZihjb21tb25DbGFzc05hbWVzID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVDb21tb25DbGFzc05hbWVzKCk7Ci0JCX0KLQkJaWYgKGNvbW1vbkNsYXNzTmFtZXMuY29udGFpbnMoamF2YUNsYXNzTmFtZSkpIHsKLQkJCVJlc291cmNlU2V0IHJTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJUmVzb3VyY2VTZXQgc2V0ID0gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlpZiAoc2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KXsKLQkJCQlwcm9qZWN0ID0gKChQcm9qZWN0UmVzb3VyY2VTZXQpIHNldCkuZ2V0UHJvamVjdCgpOwotCQkJfQotCQkJCi0JCQkvL2hlbHBlck1hcCA9IGdldEhlbHBlck1hcChyU2V0KTsKLQkJCS8vT2JqZWN0IG9iaiA9IGdldEhlbHBlck1hcChyU2V0KS5nZXQoamF2YUNsYXNzTmFtZSk7Ci0JCQlPYmplY3Qgb2JqID0gZ2V0SGVscGVyTWFwKHByb2plY3QpLmdldChqYXZhQ2xhc3NOYW1lKTsKLQkJCWlmIChvYmogIT0gbnVsbCkgCi0JCQkJcmV0dXJuIChKYXZhSGVscGVycykgb2JqOwotCQkJIGVsc2UgewotCQkJCWhlbHBlciA9IGdldFR5cGUoamF2YUNsYXNzTmFtZSxyU2V0KTsKLQkJCQkvL2dldEhlbHBlck1hcChyU2V0KS5wdXQoamF2YUNsYXNzTmFtZSwgaGVscGVyKTsKLQkJCQlnZXRIZWxwZXJNYXAocHJvamVjdCkucHV0KGphdmFDbGFzc05hbWUsIGhlbHBlcik7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJaGVscGVyID0gZ2V0VHlwZShqYXZhQ2xhc3NOYW1lLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJcmV0dXJuIGhlbHBlcjsKLQl9Ci0gICAKLQkgIHByb3RlY3RlZCBzdGF0aWMgSGFzaE1hcCBnZXRIZWxwZXJNYXAoSVByb2plY3QgIHByb2plY3QpewotCQlIYXNoTWFwIG1hcEhlbHBlciA9IChIYXNoTWFwKXByb2plY3RIZWxwZXJNYXAuZ2V0KCBwcm9qZWN0ICk7IAotCQlpZiggbWFwSGVscGVyID09IG51bGwgKXsKLQkJCW1hcEhlbHBlciA9ICBuZXcgSGFzaE1hcCgpOwotCQkJcHJvamVjdEhlbHBlck1hcC5wdXQocHJvamVjdCwgbWFwSGVscGVyKTsKLQkJfQotCQloZWxwZXJNYXAgPSBtYXBIZWxwZXI7Ci0JCXJldHVybiBtYXBIZWxwZXI7Ci0JfSAgICAKLSAgICAKLQlwcml2YXRlIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplQ29tbW9uQ2xhc3NOYW1lcygpIHsKLQkJaWYgKGNvbW1vbkNsYXNzTmFtZXMgIT0gbnVsbCkgcmV0dXJuOwotCQlIYXNoU2V0IG5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0lPX0lPRVhDRVBUSU9OKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0lPX1NFUklBTElaQUJMRSk7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCk7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX0VYQ0VQVElPTik7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04pOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URSk7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFRVhDRVBUSU9OKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfQ09MTEVDVElPTik7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0VOVU1FUkFUSU9OKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfU0VUKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfQ1JFQVRFRVhDRVBUSU9OKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRU5USVRZQkVBTik7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkVYQ0VQVElPTik7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkhPTUUpOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTEhPTUUpOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJPQkpFQ1QpOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVCk7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VOVElUWUNPTlRFWFQpOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9GSU5ERVJFWENFUFRJT04pOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9NRVNTQUdFRFJJVkVOQkVBTik7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX09CSkVDVE5PVEZPVU5ERVhDRVBUSU9OKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTkJFQU4pOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQ09OVEVYVCk7Ci0JCW5hbWVzLmFkZChJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT04pOwotCQluYW1lcy5hZGQoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSKTsKLQkJbmFtZXMuYWRkKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9UUkFOU0FDVElPTl9VU0VSVFJBTlNBQ1RJT04pOwotCQljb21tb25DbGFzc05hbWVzID0gbmFtZXM7Ci0JfQotCQotCS8qKgotCSAqIGphdmFDbGFzc05hbWUgbXVzdCBiZSBmdWxseSBxdWFsaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFIZWxwZXJzIGdldFR5cGUoU3RyaW5nIGphdmFDbGFzc05hbWUsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFR5cGUoamF2YUNsYXNzTmFtZSwgcmVzb3VyY2VTZXQsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBqYXZhQ2xhc3NOYW1lIG11c3QgYmUgZnVsbHkgcXVhbGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyBnZXRUeXBlKFN0cmluZyBqYXZhQ2xhc3NOYW1lLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCwgYm9vbGVhbiB0aHJvd0V4Y0lmTm90VmFsaWQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZigoamF2YUNsYXNzTmFtZSA9PSBudWxsKSAgfHwgKGphdmFDbGFzc05hbWUuZXF1YWxzKCIiKSB8fCAocmVzb3VyY2VTZXQgPT0gbnVsbCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlciBhTG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IGdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKFN0cmluZywgUmVzb3VyY2VTZXQsIGJvb2xlYW4pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdGV4dCA9ICJpbnZhbGlkIHBhcmFtZXRlcjsgamF2YUNsYXNzTmFtZSA9IHswfSBhbmQgcmVzb3VyY2VTZXQgPSB7MX0iOwotCQkJCS8vZW50cnkuc2V0VGV4dCgiaW52YWxpZCBwYXJhbWV0ZXI7IGphdmFDbGFzc05hbWUgPSB7MH0gYW5kIHJlc291cmNlU2V0ID0gezF9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvL2VudHJ5LnNldFRva2VucyhuZXcgU3RyaW5nW117amF2YUNsYXNzTmFtZSwgU3RyaW5nLnZhbHVlT2YocmVzb3VyY2VTZXQpfSk7Ci0JCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRleHQsCi0JCQkJCQkgbmV3IFN0cmluZ1tde2phdmFDbGFzc05hbWUsIFN0cmluZy52YWx1ZU9mKHJlc291cmNlU2V0KX0pOwotCQkJCWVudHJ5LnNldFRleHQocmVzdWx0KTsKLQkJCQkKLQkJCQllbnRyeS5hcHBlbmRTdGFja1RyYWNlKCk7Ci0JCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCQotCQkvLyBJZiB0aGUgY2xhc3MgZG9lc24ndCBleGlzdCwgaXQgd2lsbCBiZSByZWZsZWN0ZWQKLQkJSmF2YUhlbHBlcnMgaGVscGVyID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGphdmFDbGFzc05hbWUsIHJlc291cmNlU2V0KTsKLQkJaWYodGhyb3dFeGNJZk5vdFZhbGlkKSB7Ci0JCQlpc1ZhbGlkVHlwZShoZWxwZXIpOyAvLyBjaGVjayB0aGF0IHRoZSB0eXBlIGhhcyBiZWVuIHJlZmxlY3RlZCBwcm9wZXJseQotCQl9Ci0JCQotCQlyZXR1cm4gaGVscGVyOwotCX0KLQkKLQkvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nRW50cnkgZ2V0TG9nRW50cnkoKSB7Ci0JCWlmKGxvZ0VudHJ5ID09IG51bGwpIHsKLQkJICAgIGxvZ0VudHJ5ID0gbmV3IExvZ0VudHJ5KElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUpOwotCQl9Ci0JCWxvZ0VudHJ5LnJlc2V0KCk7IC8vIHJlc2V0IHRoZSB2YWx1ZXMgc28gdGhhdCB3ZSdyZSBub3QgbG9nZ2luZyBzdGFsZSBkYXRhCi0JCXJldHVybiBsb2dFbnRyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpIHsKLSAgICAgICAgaWYobG9nZ2VyID09IG51bGwpCi0gICAgICAgICAgICBsb2dnZXIgPSBKMkVFQ29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLSAgICAgICAgcmV0dXJuIGxvZ2dlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFIZWxwZXJzIGdldFR5cGUoRmllbGQgZmllbGQpIHsKLQkJaWYoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiAoSmF2YUhlbHBlcnMpZmllbGQuZ2V0RVR5cGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIEphdmFDbGFzcyBwYXNzZWQgaW4gaGFzIHRoZSBNZXRob2QgZGVmaW5lZAotCSAqIG9uIGl0LiBSZXR1cm4gZmFsc2UgaWYgdGhlIE1ldGhvZCBpcyBkZWZpbmVkIG9uIGEgc3VwZXJ0eXBlIG9yIAotCSAqIGlzIG5vdCBkZWZpbmVkIG9uIHRoZSBjbGFzcyBhdCBhbGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIG9uQ2xhc3MoSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmKChjbGF6eiA9PSBudWxsKSB8fCAobWV0aG9kID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBjbGF6ei5lcXVhbHMobWV0aG9kLmdldEphdmFDbGFzcygpKTsgCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBKYXZhQ2xhc3MgcGFzc2VkIGluIGhhcyB0aGUgRmllbGQgZGVmaW5lZAotCSAqIG9uIGl0LiBSZXR1cm4gZmFsc2UgaWYgdGhlIEZpZWxkIGlzIGRlZmluZWQgb24gYSBzdXBlcnR5cGUgb3IgCi0JICogaXMgbm90IGRlZmluZWQgb24gdGhlIGNsYXNzIGF0IGFsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gb25DbGFzcyhKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB7Ci0JCWlmKChjbGF6eiA9PSBudWxsKSB8fCAoZmllbGQgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIGNsYXp6LmVxdWFscyhmaWVsZC5nZXRKYXZhQ2xhc3MoKSk7IAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkV4Y2VwdGlvbihKYXZhQ2xhc3MgZXhjZXB0aW9uLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGV4Y2VwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIEV4ZW1wdCBFSkJFeGNlcHRpb24gZnJvbSB0aGUgYXBwbGljYXRpb24gZXhjZXB0aW9uIGNoZWNrIGJlY2F1c2UgaXQnbGwgZHJpdmUgdXNlcnMgY3JhenkgdG8gc2VlIAotCQkvLyBpdCBmbGFnZ2VkIGFzIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4KLQkJdHJ5IHsKLQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1NhbWVUeXBlKGV4Y2VwdGlvbiwgZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkVYQ0VQVElPTiwgYmVhbikpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2dnZWQgaW4gZ2V0VHlwZSgpCi0JCQkvLyBpZiBFSkJFeGNlcHRpb24gY2FuJ3QgYmUgZm91bmQsIHRoZW4gdGhlcmUncyBwcm9iYWJseSBhIHN5c3RlbSBKQVIgbWlzc2luZwotCQl9Ci0JCQotCQkvLyAxOC4xLjEgQXBwbGljYXRpb24gZXhjZXB0aW9ucwotCQkvLyBBbiBhcHBsaWNhdGlvbiBleGNlcHRpb24gaXMgYW4gZXhjZXB0aW9uIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYSBtZXRob2Qgb2YgdGhlIGVudGVycHJpc2UKLQkJLy8gQmVhbidzIGhvbWUgYW5kIGNvbXBvbmVudCBpbnRlcmZhY2VzLCBvdGhlciB0aGFuIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JCXJldHVybiAhaXNSZW1vdGVFeGNlcHRpb24oZXhjZXB0aW9uLCBiZWFuKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUmVtb3RlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhSGVscGVycyBqYXZhUm1pUmVtb3RlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URSwgYmVhbik7Ci0JCQlpZihpc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBqYXZhUm1pUmVtb3RlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUmVzZXJ2ZWRXb3JkKFN0cmluZyBuYW1lKSB7Ci0JCWlmKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlTdHJpbmcgdXBwZXJOYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOwotCQlmb3IoaW50IGk9MDsgaTxfcmVzZXJ2ZWRXb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJaWYodXBwZXJOYW1lLmVxdWFscyhfcmVzZXJ2ZWRXb3Jkc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1J1bnRpbWVFeGNlcHRpb24oSmF2YUNsYXNzIGNsYXp6LCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGNsYXp6ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIHJ1bnRpbWVFeGMgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfUlVOVElNRUVYQ0VQVElPTiwgYmVhbik7Ci0JCQlyZXR1cm4gaXNFeGNlcHRpb24oY2xhenosIHJ1bnRpbWVFeGMuZ2V0V3JhcHBlcigpKTsKLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1JlbW90ZUV4Y2VwdGlvbihKYXZhQ2xhc3MgY2xhenosIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQl0cnkgewotCQkJSmF2YUhlbHBlcnMgcmVtb3RlRXhjID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFRVhDRVBUSU9OLCBiZWFuKTsKLQkJCXJldHVybiBpc0V4Y2VwdGlvbihjbGF6eiwgcmVtb3RlRXhjLmdldFdyYXBwZXIoKSk7Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjbGF6eiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNFeGNlcHRpb24oSmF2YUNsYXNzIGNsYXp6LCBKYXZhQ2xhc3MgZXhjZXB0aW9uKSB7Ci0JCWlmKChjbGF6eiA9PSBudWxsKSB8fCAoZXhjZXB0aW9uID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBleGNlcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBlaXRoZXIgamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yIGEgdHlwZSB3aGljaCBpbmhlcml0cy9leHRlbmRzIGphdmEudXRpbC5Db2xsZWN0aW9uLgotCSAqIFRoZSBiZWFuIGlzIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgamF2YS51dGlsLkNvbGxlY3Rpb24gdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbUNvbGxlY3Rpb24oSmF2YUhlbHBlcnMgdHlwZSwgRW50ZXJwcmlzZUJlYW4gYmVhbikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCUphdmFIZWxwZXJzIGphdmFVdGlsQ29sbGVjdGlvbiA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OLCBiZWFuKTsKLQkJcmV0dXJuIGlzQXNzaWduYWJsZUZyb20odHlwZSwgamF2YVV0aWxDb2xsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgaXMgZWl0aGVyIGphdmEudXRpbC5FbnVtZXJhdGlvbiwgb3IgYSB0eXBlIHdoaWNoIGluaGVyaXRzL2V4dGVuZHMgamF2YS51dGlsLkVudW1lcmF0aW9uLgotCSAqIFRoZSBiZWFuIGlzIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgamF2YS51dGlsLkVudW1lcmF0aW9uIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXNzaWduYWJsZUZyb21FbnVtZXJhdGlvbihKYXZhSGVscGVycyB0eXBlLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxFbnVtZXJhdGlvbiA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9FTlVNRVJBVElPTiwgYmVhbik7Ci0JCXJldHVybiBpc0Fzc2lnbmFibGVGcm9tKHR5cGUsIGphdmFVdGlsRW51bWVyYXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBlaXRoZXIgamF2YS51dGlsLlNldCwgb3IgYSB0eXBlIHdoaWNoIGluaGVyaXRzL2V4dGVuZHMgamF2YS51dGlsLlNldC4KLQkgKiBUaGUgYmVhbiBpcyBuZWVkZWQgdG8gcmV0cmlldmUgdGhlIGphdmEudXRpbC5TZXQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbVNldChKYXZhSGVscGVycyB0eXBlLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxTZXQgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfU0VULCBiZWFuKTsKLQkJcmV0dXJuIGlzQXNzaWduYWJsZUZyb20odHlwZSwgamF2YVV0aWxTZXQpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgaXMgZWl0aGVyIHRoZSBjb21wYXJlIHR5cGUsIG9yIGluaGVyaXRzL2V4dGVuZHMgdGhlIGNvbXBhcmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShKYXZhSGVscGVycyB0eXBlLCBKYXZhSGVscGVycyBjb21wYXJlVHlwZSkgewotCQlpZigodHlwZSA9PSBudWxsKSB8fCAoY29tcGFyZVR5cGUgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlpZih0eXBlLmlzUHJpbWl0aXZlKCkgfHwgY29tcGFyZVR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJaWYodHlwZS5pc1ByaW1pdGl2ZSgpICYmIGNvbXBhcmVUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQlyZXR1cm4gdHlwZS5nZXRQcmltaXRpdmUoKS5lcXVhbHMoY29tcGFyZVR5cGUuZ2V0UHJpbWl0aXZlKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgaWYodHlwZS5pc0FycmF5KCkgJiYgY29tcGFyZVR5cGUuaXNBcnJheSgpKSB7Ci0JCQlKYXZhQ2xhc3MgY2xhc3NUeXBlID0gdHlwZS5nZXRXcmFwcGVyKCk7Ci0JCQlKYXZhQ2xhc3MgY2xhc3NDb21wYXJlVHlwZSA9IGNvbXBhcmVUeXBlLmdldFdyYXBwZXIoKTsKLQkJCWlmKChjbGFzc1R5cGUgPT0gbnVsbCkgfHwgKGNvbXBhcmVUeXBlID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJSmF2YUhlbHBlcnMgZmluYWxUeXBlID0gKChBcnJheVR5cGUpY2xhc3NUeXBlKS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJCUphdmFIZWxwZXJzIGZpbmFsQ29tcGFyZVR5cGUgPSAoKEFycmF5VHlwZSljbGFzc0NvbXBhcmVUeXBlKS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJCXJldHVybiBpc0Fzc2lnbmFibGVGcm9tKGZpbmFsVHlwZSwgZmluYWxDb21wYXJlVHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gY29tcGFyZVR5cGUuZ2V0V3JhcHBlcigpLmlzQXNzaWduYWJsZUZyb20odHlwZS5nZXRXcmFwcGVyKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmFDbGFzcyBmb3IgdGhlIEphdmFIZWxwZXIgdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcyhKYXZhSGVscGVycyB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCi0JCWlmICghdHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlpZih0eXBlLmlzQXJyYXkoKSkgewotCQkJCUphdmFDbGFzcyBjbGFzc1R5cGUgPSB0eXBlLmdldFdyYXBwZXIoKTsKLQkJCQlpZiAoY2xhc3NUeXBlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCUphdmFIZWxwZXJzIGZpbmFsVHlwZSA9ICgoQXJyYXlUeXBlKWNsYXNzVHlwZSkuZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0JCQkJcmV0dXJuIGdldEphdmFDbGFzcyhmaW5hbFR5cGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHR5cGUuZ2V0V3JhcHBlcigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBtZXRob2QgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNBc3NvY2lhdGVkV2l0aFF1ZXJ5KENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBNZXRob2QgbWV0aG9kKSB7Ci0JCS8vIENoZWNrIG1ldGhvZCBpcyBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sLgotCQlMaXN0IHF1ZXJpZXMgPSBjbXAuZ2V0UXVlcmllcygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHF1ZXJpZXMuaXRlcmF0b3IoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVF1ZXJ5IHF1ZXJ5ID0gKFF1ZXJ5KWl0ZXJhdG9yLm5leHQoKTsKLQkJCVF1ZXJ5TWV0aG9kIHF1ZXJ5TWV0aG9kID0gcXVlcnkuZ2V0UXVlcnlNZXRob2QoKTsKLQkJCWlmKHF1ZXJ5TWV0aG9kID09IG51bGwpIHsKLQkJCQkvLyBMZXQgdGhlIEVKQkphclZSdWxlIHJlcG9ydCB0aGlzCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmKChxdWVyeU1ldGhvZC5nZXROYW1lKCkgPT0gbnVsbCkgfHwgcXVlcnlNZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIExldCB0aGUgRUpCSmFyVlJ1bGUgcmVwb3J0IHRoaXMKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYocXVlcnlNZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZvdW5kOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNCZWFuTWFuYWdlZFNlc3Npb24oRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkKLQkJcmV0dXJuICgoKFNlc3Npb24pYmVhbikuZ2V0VHJhbnNhY3Rpb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBUcmFuc2FjdGlvblR5cGUuQkVBTik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIGlzIHRoZSBzdGF0aWMgaW5pdGlhbGl6ZXIgdXNlZCBmb3IgaW50ZXJmYWNlcyAoIjxjbGluaXQ+IikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGluaXRNZXRob2QoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiPGNsaW5pdD4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0pORElOYW1pbmdDb250ZXh0KEZpZWxkIGZpZWxkKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgZGVmaW5lZCBvbiBqYXZhLmxhbmcuT2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFMYW5nT2JqZWN0RmllbGQoRW50ZXJwcmlzZUJlYW4gYmVhbiwgRmllbGQgZmllbGQpIHsKLQkJcmV0dXJuIGlzU2FtZVR5cGUoYmVhbiwgZmllbGQuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpLCBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgaXMgZGVmaW5lZCBvbiBuYW1lZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPd25lZEJ5KEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGlzU2FtZVR5cGUoYmVhbiwgbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSwgY2xhc3NOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgZ2l2ZW4gY2xhc3MgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NhbWVUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBvd25lciwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0cnkgewotCQkJSmF2YUhlbHBlcnMgaGVscGVyID0gZ2V0VHlwZShjbGFzc05hbWUsIGJlYW4pOwotCQkJaWYoaGVscGVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCUphdmFDbGFzcyBvYmplY3QgPSBoZWxwZXIuZ2V0V3JhcHBlcigpOwotCQkJCi0JCQlyZXR1cm4gaXNTYW1lVHlwZShvd25lciwgb2JqZWN0KTsKLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGdpdmVuIGNsYXNzIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTYW1lVHlwZShKYXZhSGVscGVycyBvd25lciwgSmF2YUhlbHBlcnMgb2JqZWN0KSB7Ci0JCWlmKG93bmVyID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYob2JqZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYob3duZXIuaXNQcmltaXRpdmUoKSAmJiBvYmplY3QuaXNQcmltaXRpdmUoKSkgewotCQkJLy8gQm90aCBhcmUgSmF2YURhdGFUeXBlCi0JCQlyZXR1cm4gb3duZXIuZ2V0UHJpbWl0aXZlKCkuZXF1YWxzKG9iamVjdC5nZXRQcmltaXRpdmUoKSk7Ci0JCX0KLQkJZWxzZSBpZihvd25lci5pc0FycmF5KCkgJiYgb2JqZWN0LmlzQXJyYXkoKSkgewotCQkJLy8gQm90aCBhcmUgQXJyYXlUeXBlCi0JCQlBcnJheVR5cGUgb3duZXJBcnJheSA9IChBcnJheVR5cGUpb3duZXI7Ci0JCQlBcnJheVR5cGUgb2JqZWN0QXJyYXkgPSAoQXJyYXlUeXBlKW9iamVjdDsKLQkJCXJldHVybiBpc1NhbWVUeXBlKG93bmVyQXJyYXkuZ2V0RmluYWxDb21wb25lbnRUeXBlKCksIG9iamVjdEFycmF5LmdldEZpbmFsQ29tcG9uZW50VHlwZSgpKTsKLQkJfQotCQllbHNlIGlmKChvd25lci5nZXRXcmFwcGVyKCkgIT0gbnVsbCkgJiYgKG9iamVjdC5nZXRXcmFwcGVyKCkgIT0gbnVsbCkpIHsKLQkJCS8vIEJvdGggYXJlIEphdmFDbGFzcwotCQkJcmV0dXJuIG93bmVyLmdldFdyYXBwZXIoKS5lcXVhbHMob2JqZWN0LmdldFdyYXBwZXIoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBtaXNtYXRjaGluZyBKYXZhSGVscGVycyB0eXBlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBkZWZpbmVkIG9uIGphdmEubGFuZy5PYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUxhbmdPYmplY3RNZXRob2QoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gaXNTYW1lVHlwZShiZWFuLCBtZXRob2QuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpLCBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0xlZ2FsUk1JX0lJT1BJbmhlcml0YW5jZShKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0xlZ2FsUk1JX0lJT1BUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFIZWxwZXJzIGhlbHBlcikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKGhlbHBlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkKLQkJcmV0dXJuIGlzU2VyaWFsaXphYmxlKGhlbHBlciwgYmVhbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0xvY2FsVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhSGVscGVycyB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlpZihpc1NhbWVUeXBlKHR5cGUsIGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19PQkpFQ1QsIGJlYW4pKSkgewotCQkJCS8vIElmIHRoZXJlJ3MgYW4gdW5kZWZpbmVkIHByaW1hcnkga2V5IChqYXZhLmxhbmcuT2JqZWN0KSwgZG9uJ3QgZmxhZyBpdCBhcyBhIGxvY2FsIHR5cGUuCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBMZXQgdGhlIEREIHZhbGlkYXRpb24gcmVwb3J0IHRoaXMuCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKGlzQXNzaWduYWJsZUZyb20oYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpLCB0eXBlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmKGlzQXNzaWduYWJsZUZyb20oYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSwgdHlwZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkvLyBCaXQgb2YgYSBwZXJmb3JtYW5jZSBoYWNrIGhlcmUuCi0JCS8vIERvbid0IHdhbnQgdG8gbG9hZCBhbmQgcGFyc2UgdGhlIGVudGlyZSBFSkJKYXIganVzdCB0byBjaGVjayBpZgotCQkvLyB0aGlzIHR5cGUgaXMgbG9jYWwsIHNvIGFzc3VtZSB0aGF0IGlmIHRoZSBleHRlbmRzIAotCQkvLyBqYXZheC5lamIuRUpCTG9jYWxIb21lIG9yIGphdmF4LmVqYi5FSkJMb2NhbE9iamVjdCwgdGhlbiBpdCdzIGxvY2FsLgotCQl0cnkgewotCQkJSmF2YUhlbHBlcnMgZWpiTG9jYWxIb21lID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkxPQ0FMSE9NRSwgYmVhbik7Ci0JCQlpZihpc0Fzc2lnbmFibGVGcm9tKGVqYkxvY2FsSG9tZSwgdHlwZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBpZ25vcmUgYW5kIHRyeSBvdGhlciB0eXBlCi0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlKYXZhSGVscGVycyBlamJMb2NhbE9iamVjdCA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVCwgYmVhbik7Ci0JCQlpZihpc0Fzc2lnbmFibGVGcm9tKGVqYkxvY2FsT2JqZWN0LCB0eXBlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZXNVbmtub3duUHJpbWFyeUtleShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCXJldHVybiB1c2VzVW5rbm93blByaW1hcnlLZXkoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlc1Vua25vd25QcmltYXJ5S2V5KENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCWlmKGNtcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlpZihpc1NhbWVUeXBlKGNtcC5nZXRQcmltYXJ5S2V5KCksIGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19PQkpFQ1QsIGNtcCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIElmIGphdmEubGFuZy5PYmplY3QgY2FuJ3QgYmUgZm91bmQsIHRoZXJlJ3MgYmlnZ2VyIHByb2JsZW1zIHRoYW4gdmFsaWRhdGluZwotCQkJLy8gaXQgbWlzdGFrZW5seQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYoY21wLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHsKLQkJCUxpc3QgY21wRmllbGRzID0gY21wLmdldEZpbHRlcmVkRmVhdHVyZXMoTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuc2luZ2xldG9uKCkpOwotCQkJaWYoY21wRmllbGRzICE9IG51bGwgJiYgIWNtcEZpZWxkcy5pc0VtcHR5KCkpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY21wRmllbGRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlDTVBBdHRyaWJ1dGUgYXR0cmliID0gKENNUEF0dHJpYnV0ZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYoaXNVbmtub3duUHJpbWFyeUtleShhdHRyaWIpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJICB9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNVbmlkaXJlY3Rpb25hbFJlbGF0aW9uc2hpcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSkgewotCQkvLyBQYWdlIDEzMSBvZiBFSkIgMi4wOgotCQkvLyBBIHVuaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgY21yLWZpZWxkIG9uIHRoZSBlbnRpdHkgYmVhbiBpbnN0YW5jZSBmcm9tIHdoaWNoCi0JCS8vIG5hdmlnYXRpb24gY2FuIHRha2UgcGxhY2UsIGFuZCBubyByZWxhdGVkIGNtci1maWVsZCBvbiB0aGUgZW50aXR5IGJlYW4gaW5zdGFuY2UgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZQotCQkvLyByZWxhdGlvbnNoaXAuIFVuaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgYXJlIHR5cGljYWxseSB1c2VkIHdoZW4gdGhlIEJlYW4gUHJvdmlkZXIgd2lzaGVzIHRvIHJlc3RyaWN0Ci0JCS8vIHRoZSB2aXNpYmlsaXR5IG9mIGEgcmVsYXRpb25zaGlwLgotCQlFbnRpdHkgc291cmNlRW50aXR5ID0gcm9sZS5nZXRTb3VyY2UoKS5nZXRFbnRpdHlCZWFuKCk7Ci0JCWlmKHNvdXJjZUVudGl0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKCFzb3VyY2VFbnRpdHkuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJQ01SRmllbGQgc291cmNlQ01SRmllbGQgPSByb2xlLmdldENtckZpZWxkKCk7Ci0JCWlmKHNvdXJjZUNNUkZpZWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJRUpCUmVsYXRpb25zaGlwUm9sZSBvcHBvc2l0ZSA9IHJvbGUuZ2V0T3Bwb3NpdGUoKTsKLQkJaWYob3Bwb3NpdGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlDTVJGaWVsZCBvcHBvc2l0ZUNNUkZpZWxkID0gb3Bwb3NpdGUuZ2V0Q21yRmllbGQoKTsKLQkJaWYob3Bwb3NpdGVDTVJGaWVsZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCQkKLQl9Ci0JCi0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzVW5rbm93blByaW1hcnlLZXkoQ01QQXR0cmlidXRlIGF0dHJpYikgewotCQlpZihhdHRyaWIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvLyBTZWN0aW9uIDEwLjguMwotCQkvLyBCeSBkZWZpbml0aW9uLCB0aGUgZGVwbG95ZXIncyBnZW5lcmF0ZWQgQ01QIGZpZWxkJ3MgbmFtZSBpcyBkZWZpbmVkIGluIHRoZSAKLQkJLy8gQ29udGFpbmVyTWFuYWdlZEVudGl0eS5XQVNfR0VORVJBVEVEX1NUUklOR19GSUVMRCBjb25zdGFudC4KLQkJcmV0dXJuIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuV0FTX0dFTkVSQVRFRF9TVFJJTkdfRklFTEQuZXF1YWxzKGF0dHJpYi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNQcmltaXRpdmVQcmltYXJ5S2V5KENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCWlmKGNtcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkKLQkJaWYoKGNtcC5nZXRQcmltS2V5RmllbGQoKSAhPSBudWxsKSAmJiAhY21wLmdldFByaW1LZXlGaWVsZCgpLmVJc1Byb3h5KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUHVibGljKEZpZWxkIGZpZWxkKSB7Ci0JCWlmICggZmllbGQgPT0gbnVsbCApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIChKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwgPT0gZmllbGQuZ2V0SmF2YVZpc2liaWxpdHkoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUHVibGljKCBNZXRob2QgbWV0aG9kICkgewotCQlpZiAoIG1ldGhvZCA9PSBudWxsICkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCA9PSBtZXRob2QuZ2V0SmF2YVZpc2liaWxpdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCBhIGdpdmVuIENsYXNzIHR5cGUgaXMgc2VyaWFsaXphYmxlLgotCSAqCi0JICogUk1JIDEuMyBzcGVjaWZpY2F0aW9uCi0JICogMi42IFBhcmFtZXRlciBQYXNzaW5nIGluIFJlbW90ZSBNZXRob2QgSW52b2NhdGlvbgotCSAqIEFuIGFyZ3VtZW50IHRvLCBvciBhIHJldHVybiB2YWx1ZSBmcm9tLCBhIHJlbW90ZSBvYmplY3QgY2FuIGJlIGFueSBvYmplY3QgdGhhdAotCSAqIGlzIHNlcmlhbGl6YWJsZS4gVGhpcyBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMsIHJlbW90ZSBvYmplY3RzLCBhbmQgbm9uLXJlbW90ZQotCSAqIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIGphdmEuaW8uU2VyaWFsaXphYmxlIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNTZXJpYWxpemFibGUoSmF2YUhlbHBlcnMgY2wsIEVudGVycHJpc2VCZWFuIGJlYW4pIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZihjbCA9PSBudWxsKSB7Ci0JCQkvLyBhc3N1bWUgaXQncyB2b2lkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQotCQkvLyBDaGVjayBpZiB0aGUgdHlwZSByZWZsZWN0ZWQgcHJvcGVybHkKLQkJaXNWYWxpZFR5cGUoY2wpOwotCQkKLQkJaWYgKCBjbC5pc1ByaW1pdGl2ZSgpICkgewotCQkJLy8gSmF2YUhlbHBlcnMgaXMgYSBKYXZhRGF0YVR5cGUKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYoY2wuaXNBcnJheSgpKSB7Ci0JCQlBcnJheVR5cGUgYXJyYXkgPSAoQXJyYXlUeXBlKWNsOwotCQkJaWYoYXJyYXkuaXNQcmltaXRpdmVBcnJheSgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkvLyBlbHNlLCBub3QgcHJpbWl0aXZlLCBzbyBjaGVjayBpdHMgY29udGVudHMKLQkJCWNsID0gYXJyYXkuZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkKLQkJSmF2YUhlbHBlcnMgcmVtb3RlID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFLCBiZWFuKTsKLQkJaWYoaXNBc3NpZ25hYmxlRnJvbShjbCwgcmVtb3RlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUphdmFIZWxwZXJzIHNlcmlhbCA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfSU9fU0VSSUFMSVpBQkxFLCBiZWFuKTsKLQkJcmV0dXJuIGlzQXNzaWduYWJsZUZyb20oY2wsIHNlcmlhbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1N0YXRlZnVsKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCi0JCXJldHVybiAoKChTZXNzaW9uKWJlYW4pLmdldFNlc3Npb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBTZXNzaW9uVHlwZS5TVEFURUZVTCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1N0YXRlbGVzcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihiZWFuLmlzRW50aXR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlyZXR1cm4gKCgoU2Vzc2lvbiliZWFuKS5nZXRTZXNzaW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gU2Vzc2lvblR5cGUuU1RBVEVMRVNTKTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VubmFtZWRQYWNrYWdlKEphdmFQYWNrYWdlIHBrZykgewotCQlpZihwa2cgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCVN0cmluZyBwa2dOYW1lID0gcGtnLmdldE5hbWUoKTsKLQkJcmV0dXJuICgocGtnTmFtZSA9PSBudWxsKSB8fCAocGtnTmFtZS5lcXVhbHMoIiIpKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzVmFsaWRKYXZhSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewotCQlpZihuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJY2hhcltdIG5hbWVDaGFyID0gbmFtZS50b0NoYXJBcnJheSgpOwotCQlpZihuYW1lQ2hhci5sZW5ndGggPCAxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KG5hbWVDaGFyWzBdKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWJvb2xlYW4gaXNWYWxpZEphdmFJZGVudGlmaWVyID0gdHJ1ZTsKLQkJZm9yKGludCBpPTE7IGk8bmFtZUNoYXIubGVuZ3RoOyBpKyspIHsKLQkJCWlmKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQobmFtZUNoYXJbaV0pKSB7Ci0JCQkJaXNWYWxpZEphdmFJZGVudGlmaWVyID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzVmFsaWRKYXZhSWRlbnRpZmllcjsKLQl9Ci0JCi0JLyoqCi0JICogNi41LjMgVGhlIG9wdGlvbmFsIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlCi0JICouLi4KLQkgKiBPbmx5IGEgc3RhdGVmdWwgU2Vzc2lvbiBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gbWF5IAotCSAqIGltcGxlbWVudCB0aGUgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UuCi0JICouLi4KLQkgKiBUaGVyZSBpcyBubyBuZWVkIGZvciBhIFNlc3Npb24gYmVhbiB3aXRoIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiB0byByZWx5IG9uIHRoZSAKLQkgKiBzeW5jaHJvbml6YXRpb24gY2FsbCBiYWNrcyBiZWNhdXNlIHRoZSBiZWFuIGlzIGluIGNvbnRyb2wgb2YgdGhlIGNvbW1pdCB0aGUgYmVhbiAKLQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkgKiB0cmFuc2FjdGlvbiBjb21taXQuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZFNlc3Npb25UeXBlRWxlbWVudChTZXNzaW9uIHNlc3Npb24pIHsKLQkJaWYoc2Vzc2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIGNoZWNrIHN5bnRheAotCQlpZighc2Vzc2lvbi5pc1NldFNlc3Npb25UeXBlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoc2Vzc2lvbi5nZXRTZXNzaW9uVHlwZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoc2Vzc2lvbi5nZXRTZXNzaW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gU2Vzc2lvblR5cGUuU1RBVEVGVUwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZihzZXNzaW9uLmdldFNlc3Npb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBTZXNzaW9uVHlwZS5TVEFURUxFU1MpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzVmFsaWRUcmFuc2FjdGlvblR5cGVFbGVtZW50KFNlc3Npb24gc2Vzc2lvbkJlYW4pIHsKLQkJaWYoc2Vzc2lvbkJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighc2Vzc2lvbkJlYW4uaXNTZXRUcmFuc2FjdGlvblR5cGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihzZXNzaW9uQmVhbi5nZXRUcmFuc2FjdGlvblR5cGUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKHNlc3Npb25CZWFuLmdldFRyYW5zYWN0aW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gVHJhbnNhY3Rpb25UeXBlLkJFQU4pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZihzZXNzaW9uQmVhbi5nZXRUcmFuc2FjdGlvblR5cGUoKS5nZXRWYWx1ZSgpID09IFRyYW5zYWN0aW9uVHlwZS5DT05UQUlORVIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCi0JCXJldHVybiBmYWxzZTsJCi0JfQotCQotCS8qKgotCSAqIElmIHRoZSB0eXBlIGlzIG5vdCByZWZsZWN0ZWQgcHJvcGVybHksIHRocm93IGFuIEludmFsaWRJbnB1dEV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgaXNWYWxpZFR5cGUoSmF2YUhlbHBlcnMgdHlwZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKHR5cGUgPT0gbnVsbCkgewotCQkJLy8gQ2hlYXRpbmcgaGVyZS4gU2hvdWxkIHRlY2huaWNhbGx5IGFjY2VzcyB0aGUgTXNnTG9nZ2VyIGZyb20gdGhlIElFSkJWYWxpZGF0aW9uQ29udGV4dAotCQkJLy8gdHlwZSwgYnV0IHdoZW4gSSBzdGFydGVkIGNoYW5naW5nIHRoaXMgbWV0aG9kIGFuZCB0aGUgaXNWYWxpZFR5cGVIaWVyYXJjaHkgbWV0aG9kLAotCQkJLy8gSSBlbmRlZCB1cCBjaGFuZ2luZyA0MiBmaWxlcyBiZWNhdXNlIHRoZXNlIHR3byBtZXRob2RzIGFyZSBjYWxsZWQgZGlyZWN0bHkgb3IKLQkJCS8vIGluZGlyZWN0bHkgZnJvbSBhbG1vc3QgZXZlcnl3aGVyZS4gVGhhdCB3YXMgdG9vIG11Y2ggY2hhbmdlLCBzbyBJIGNoZWF0ZWQuCi0JCQlMb2dnZXIgYUxvZ2dlciA9IGdldE1zZ0xvZ2dlcigpOwotCQkJaWYoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBnZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoInR5cGUgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuYXBwZW5kU3RhY2tUcmFjZSgpOwotCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQkKLQkJaWYodHlwZS5nZXRXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJLy8gY2hlY2sgaWYgdGhlIHR5cGUgcmVmbGVjdGVkIHByb3Blcmx5LiBJZiB0aGVyZSdzIGFueSBjb21waWxlIGVycm9ycywgb3IgcmVmZXJlbmNlcyB0byB1bnJlc29sdmVkCi0JCQkvLyBjbGFzc2VzLCBjYW4gb3V0cHV0IHNvbWUgbWlzdGFrZW4gZXJyb3IgbWVzc2FnZXMuCi0JCQkvLyBlLmcuIGNsYXNzIGlzIG5vdCBzZXJpYWxpemFibGUKLQkJCUphdmFDbGFzcyB3cmFwcGVyID0gdHlwZS5nZXRXcmFwcGVyKCk7Ci0JCQlpZih0eXBlLmlzQXJyYXkoKSkgewotCQkJCUFycmF5VHlwZSBhcnJheSA9IChBcnJheVR5cGUpdHlwZTsKLQkJCQlpc1ZhbGlkVHlwZShhcnJheS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZighd3JhcHBlci5pc0V4aXN0aW5nVHlwZSgpKSB7Ci0JCQkJCUxvZ2dlciBhTG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQkJTG9nRW50cnkgZW50cnkgPSBnZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllbnRyeS5zZXRUZXh0KCIhd3JhcHBlci5pc0V4aXN0aW5nVHlwZSgpOyB0eXBlIGlzICIgKyB3cmFwcGVyLmdldEphdmFOYW1lKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQkJfQotCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKHdyYXBwZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgdHlwZSBpcyBub3QgcmVmbGVjdGVkIHByb3Blcmx5LCB0aHJvdyBhbiBJbnZhbGlkSW5wdXRFeGNlcHRpb24uCi0JICogVGhpcyBtZXRob2QsIHVubGlrZSBpc1ZhbGlkVHlwZSwgYWxzbyBjaGVja3MgZXZlcnkgaW50ZXJmYWNlIGFuZCBjbGFzcwotCSAqIHBhcmVudCBvZiB0aGUgcGFzc2VkLWluIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGlzVmFsaWRUeXBlSGllcmFyY2h5KEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFIZWxwZXJzIHR5cGUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZih0eXBlID09IG51bGwpIHsKLQkJCS8vIENoZWF0aW5nIGhlcmUuIFNob3VsZCB0ZWNobmljYWxseSBhY2Nlc3MgdGhlIE1zZ0xvZ2dlciBmcm9tIHRoZSBJRUpCVmFsaWRhdGlvbkNvbnRleHQKLQkJCS8vIHR5cGUsIGJ1dCB3aGVuIEkgc3RhcnRlZCBjaGFuZ2luZyB0aGlzIG1ldGhvZCBhbmQgdGhlIGlzVmFsaWRUeXBlIG1ldGhvZCwKLQkJCS8vIEkgZW5kZWQgdXAgY2hhbmdpbmcgNDIgZmlsZXMgYmVjYXVzZSB0aGVzZSB0d28gbWV0aG9kcyBhcmUgY2FsbGVkIGRpcmVjdGx5IG9yCi0JCQkvLyBpbmRpcmVjdGx5IGZyb20gYWxtb3N0IGV2ZXJ5d2hlcmUuIFRoYXQgd2FzIHRvbyBtdWNoIGNoYW5nZSwgc28gSSBjaGVhdGVkLgotCQkJTG9nZ2VyIGFMb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUZXh0KCJ0eXBlIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LmFwcGVuZFN0YWNrVHJhY2UoKTsKLQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJfQotCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigpOwotCQl9Ci0JCi0JCS8vIEZpcnN0LCBjaGVjayB0aGlzIGhlbHBlciBpdHNlbGYuCi0JCWlzVmFsaWRUeXBlKHR5cGUpOwotCQlKYXZhSGVscGVycyBqYXZhTGFuZ09iamVjdCA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19PQkpFQ1QsIGJlYW4pOwotCQlpZihpc1NhbWVUeXBlKHR5cGUsIGphdmFMYW5nT2JqZWN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBJZiB0aGlzIGhlbHBlciBleGlzdHMsIGFuZCBpcyBub3QgamF2YS5sYW5nLk9iamVjdCwgdGhlbiBjaGVjayBldmVyeSBzdXBlcnR5cGUuCi0JCUphdmFDbGFzcyBjbGFzc1R5cGUgPSB0eXBlLmdldFdyYXBwZXIoKTsKLQkJaWYoY2xhc3NUeXBlID09IG51bGwpIHsKLQkJCUxvZ2dlciBhTG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IGdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgidHlwZS5nZXRXcmFwcGVyKCkgcmV0dXJucyBudWxsOyB0eXBlIGlzICIgKyB0eXBlLmdldEphdmFOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCQotCQkvLyBDaGVjayB0aGUgc3VwZXJjbGFzcy4gU2luY2UgdHlwZSBpcyBub3QgamF2YS5sYW5nLk9iamVjdCwgdGhlcmUgaXMgYXQgbGVhc3QKLQkJLy8gdGhlIGphdmEubGFuZy5PYmplY3Qgc3VwZXJjbGFzcy4KLQkJaWYoIWNsYXNzVHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgc3VwZXJUeXBlID0gY2xhc3NUeXBlLmdldFN1cGVydHlwZSgpOwotCQkJaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgc3VwZXJUeXBlKTsKLQkJfQotCQotCQkvLyBDaGVjayB0aGUgc3VwZXJpbnRlcmZhY2VzLCBpZiB0aGV5IGV4aXN0LgotCQlMaXN0IHN1cGVySW50ZXJmYWNlcyA9IGNsYXNzVHlwZS5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCQlpZihzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzdXBlckludGVyZmFjZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUphdmFDbGFzcyBzdXBlckludGYgPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBzdXBlckludGYpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJNSSAxLjMgcGFnZSA2IHNlY3Rpb24gMi40LjEsIAotCSAqICAgIEEgcmVtb3RlIG1ldGhvZCBkZWNsYXJhdGlvbiBtdXN0IGluY2x1ZGUgdGhlIGV4Y2VwdGlvbiBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKG9yIG9uZQotCSAqICAgIG9mIGl0cyB1cHNlcmNsYXNzZXMgc3VjaCBhcyBqYXZhLmlvLklPRXhjZXB0aW9uIG9yIGphdmEubGFuZy5FeGNlcHRpb24pIGluIGl0cyB0aHJvd3MKLQkgKiAgICBjbGF1c2UsIGluIGFkZGl0aW9uIHRvIGFueSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBleGNlcHRpb25zIChub3RlIHRoYXQgYXBwbGljYXRpb24gCi0JICogICAgc3BlY2lmaWMgZXhjZXB0aW9ucyBkbyBub3QgaGF2ZSB0byBleHRlbmQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGhyb3dzUmVtb3RlRXhjZXB0aW9uT3JQYXJlbnQoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aHJvd3NFeGNlcHRpb25PclBhcmVudChiZWFuLCBtZXRob2QsIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1JNSV9SRU1PVEVFWENFUFRJT04pOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB3aGljaCBjaGVja3MgaWYgUmVtb3RlRXhjZXB0aW9uIChleGFjdGx5LCBub3QgRXhjZXB0aW9uIG9yIElPRXhjZXB0aW9uKQotCSAqIGlzIGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZG9lc05vdFRocm93UmVtb3RlRXhjZXB0aW9uKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gIXRocm93c0V4Y2VwdGlvbihiZWFuLCBtZXRob2QsIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1JNSV9SRU1PVEVFWENFUFRJT04pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGhyb3dzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aHJvd3NFeGNlcHRpb24oYmVhbiwgbWV0aG9kLCBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX09CSkVDVE5PVEZPVU5ERVhDRVBUSU9OKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRocm93c0ZpbmRlckV4Y2VwdGlvbihFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRocm93c0V4Y2VwdGlvbihiZWFuLCBtZXRob2QsIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRklOREVSRVhDRVBUSU9OKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRocm93c0NyZWF0ZUV4Y2VwdGlvbihFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRocm93c0V4Y2VwdGlvbihiZWFuLCBtZXRob2QsIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfQ1JFQVRFRVhDRVBUSU9OKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRocm93c0FwcGxpY2F0aW9uRXhjZXB0aW9uKE1ldGhvZCBtZXRob2QsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJTGlzdCBleGNlcHRpb25zID0gbWV0aG9kLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCWlmKGV4Y2VwdGlvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gQ0hLSjI0MTkgPSB7MH0gbXVzdCBiZSBhIHN1YmNsYXNzIG9mIGphdmEubGFuZy5FeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxOC4xLjEsIDE4LjIuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhQ2xhc3MgZXhjZXB0aW9uID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQkKLQkJCWlmKGlzQXBwbGljYXRpb25FeGNlcHRpb24oZXhjZXB0aW9uLCBiZWFuKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWV0aG9kIHRocm93cyB0aGUgbmFtZWQgZXhjZXB0aW9uIG9yIGEgY2xhc3Mgd2hpY2ggZXh0ZW5kcyB0aGUgbmFtZWQgZXhjZXB0aW9uLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGhyb3dzRXhjZXB0aW9uKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QsIFN0cmluZyBleGNlcHRpb25OYW1lKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJTGlzdCBleGNlcHRpb25zID0gbWV0aG9kLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQlKYXZhQ2xhc3MgZXhjZXB0aW9uID0gZ2V0VHlwZShleGNlcHRpb25OYW1lLCBiZWFuKS5nZXRXcmFwcGVyKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoaXNBc3NpZ25hYmxlRnJvbShleGMsIGV4Y2VwdGlvbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgbmFtZWQgZXhjZXB0aW9uLCBhbiBleGNlcHRpb24gd2hpY2ggZXh0ZW5kcyB0aGUgbmFtZWQgZXhjZXB0aW9uLCBvciBvbmUgb2YgdGhlIHBhcmVudHMgb2YgdGhlIG5hbWVkIGV4Y2VwdGlvbiAoZS5nLiBqYXZhLmxhbmcuRXhjZXB0aW9uKS4KLQkgKiBVc2UgdGhpcyBtZXRob2QgaWYgaXQgbmVlZHMgdG8gYmUgZGV0ZWN0ZWQgdGhhdCBhbiBleGNlcHRpb24gY2FuIGJlIHRocm93biBlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaCBzb21ldGhpbmcgZ2VuZXJpYyBsaWtlIGphdmEubGFuZy5FeGNlcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRocm93c0V4Y2VwdGlvbk9yUGFyZW50KEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QsIFN0cmluZyBleGNlcHRpb25OYW1lKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGV4Y2VwdGlvbiA9IGdldFR5cGUoZXhjZXB0aW9uTmFtZSwgYmVhbikuZ2V0V3JhcHBlcigpOwotCi0JCUxpc3QgZXhjZXB0aW9ucyA9IG1ldGhvZC5nZXRKYXZhRXhjZXB0aW9ucygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihpc0Fzc2lnbmFibGVGcm9tKGV4YywgZXhjZXB0aW9uKSkgewotCQkJCS8vIEFzc2lnbmFibGUgZnJvbSB0aGUgbmFtZWQgZXhjZXB0aW9uLCBlLmcuIFJlbW90ZUV4Y2VwdGlvbiBvciBhIGNoaWxkIG9mIFJlbW90ZUV4Y2VwdGlvbgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQlpZihpc0Fzc2lnbmFibGVGcm9tKGV4Y2VwdGlvbiwgZXhjKSkgewotCQkJCS8vIFRoZSBuYW1lZCBleGNlcHRpb24gaXMgYXNzaWduYWJsZSBmcm9tIHRoZSBtZXRob2QgZXhjZXB0aW9uLCBlLmcuIGphdmEubGFuZy5FeGNlcHRpb24KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlc0NvbGxlY3Rpb25DbGFzcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmKChiZWFuID09IG51bGwpIHx8IChtZXRob2QgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQlpZihwYXJtcyAhPSBudWxsKSB7Ci0JCQlmb3IoaW50IGk9MDsgaTxwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCUphdmFQYXJhbWV0ZXIgcGFybSA9IHBhcm1zW2ldOwotCQkJCXRyeSB7Ci0JCQkJCWlmKGlzQXNzaWduYWJsZUZyb21Db2xsZWN0aW9uKHBhcm0uZ2V0SmF2YVR5cGUoKSwgYmVhbikpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZSBhbmQgdGVzdCBuZXh0IHBhcm0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBOb3cgY2hlY2sgdGhlIHJldHVybiB0eXBlCi0JCXRyeSB7Ci0JCQlpZihpc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBiZWFuKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlc0xvY2FsVHlwZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgewotCQlpZigoYmVhbiA9PSBudWxsKSB8fCAobWV0aG9kID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUphdmFQYXJhbWV0ZXJbXSBwYXJtcyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJaWYocGFybXMgIT0gbnVsbCkgewotCQkJZm9yKGludCBpPTA7IGk8cGFybXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKYXZhUGFyYW1ldGVyIHBhcm0gPSBwYXJtc1tpXTsKLQkJCQlpZihpc0xvY2FsVHlwZShiZWFuLCBwYXJtLmdldEphdmFUeXBlKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIE5vdyBjaGVjayB0aGUgcmV0dXJuIHR5cGUKLQkJaWYoaXNMb2NhbFR5cGUoYmVhbiwgbWV0aG9kLmdldFJldHVyblR5cGUoKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1dBUk1lc3NhZ2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XQVJNZXNzYWdlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmODFiMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1dBUk1lc3NhZ2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi0KLS8qKgotICogTWVzc2FnZSBrZXkgY29uc3RhbnRzIGZvciBXQVIgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBXQVJNZXNzYWdlQ29uc3RhbnRzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5KMkVFTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX1ZBTElEQVRPUl9JRCA9ICJXQVJfVkFMSURBVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9NT0RFTF9OQU1FID0gIldBUl9WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1dBUl9WQUxJREFUSU9OX0ZBSUxFRCA9ICJFUlJPUl9XQVJfVkFMSURBVElPTl9GQUlMRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TTUFMTF9JQ09OID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU01BTExfSUNPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0xBUkdFX0lDT04gPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9MQVJHRV9JQ09OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX1NFUlZMRVRfTUFQUElORyA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9TRVJWTEVUX01BUFBJTkciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX0pTUCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfSlNQIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19UTEQgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1RMRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0VMQ09NRV9GSUxFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19XRUxDT01FX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9OT19XRUxDT01FX0ZJTEUgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9OT19XRUxDT01FX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVVJMIiA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9NQVBQSU5HID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX01BUFBJTkciIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX1NFUlZMRVQgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfU0VSVkxFVCIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRUpCX1JFRiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FSkJfUkVGIiA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NFU1NJT05fVElNRU9VVCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NFU1NJT05fVElNRU9VVCIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlkgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlkiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlkgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRSIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUUgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUUiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9IVFRQX0NNRCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfSFRUUF9DTUQiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9UUkFOU1BPUlQgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1RSQU5TUE9SVCIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0pTUEZJTEVfUkVGID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9KU1BGSUxFX1JFRiIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1dFTENPTUVfRklMRSA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfV0VMQ09NRV9GSUxFIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX1BBR0UgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX1BBR0UiIDsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfQVVUSF9NRVRIT0QgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0FVVEhfTUVUSE9EIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JR05PUkVfRk9STV9MT0dJTiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lHTk9SRV9GT1JNX0xPR0lOIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIyIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMyA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIzIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIyID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMiIgOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMyA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjMiIDsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9GSUxURVIgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRklMVEVSIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fRklMVEVSX01BUFBJTkcgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fRklMVEVSX01BUFBJTkciIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVMgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfVU5DT05UQUlORURfTU9EVUxFX0ZJTEVfRVhDRVBUSU9OID0gIkVSUk9SX0VBUl9VTkNPTlRBSU5FRF9NT0RVTEVfRklMRV9FWENFUFRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfSU5WQUxJRF9XQVJfRklMRSA9ICJFUlJPUl9JTlZBTElEX1dBUl9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0RVUExJQ0FURV9XRUJfSU5GX0xJQj0gIkVSUk9SX0RVUExJQ0FURV9XRUJfSU5GX0xJQiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9EVVBMSUNBVEVfV0VCX0lORl9MSUJfT1RIRVJfUFJPSkVDVCA9ICJFUlJPUl9EVVBMSUNBVEVfV0VCX0lORl9MSUJfT1RIRVJfUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9EVVBMSUNBVEVfQ0xBU1NQQVRIX0NPTVBPTkVOVF9VUkkgPSAiRVJST1JfRFVQTElDQVRFX0NMQVNTUEFUSF9DT01QT05FTlRfVVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9ERF9QQVJTRV9MSU5FQ09MID0gIldBUl9ERF9QQVJTRV9MSU5FQ09MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9ERF9QQVJTRV9MSU5FID0gIldBUl9ERF9QQVJTRV9MSU5FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9ERF9DQU5OT1RfT1BFTl9ERCA9ICJXQVJfRERfQ0FOTk9UX09QRU5fREQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX0REX1BBUlNFX05PSU5GTyA9ICJXQVJfRERfUEFSU0VfTk9JTkZPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9JTlZBTElEX0NPTlRFWFRfUk9PVCA9ICJFUlJPUl9FQVJfSU5WQUxJRF9DT05URVhUX1JPT1QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1JFU19TSEFSSU5HX1NDT1BFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9SRVNfU0hBUklOR19TQ09QRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRU5WX0VOVFJZID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FTlZfRU5UUlkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX0NPREUJID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9DT0RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19XTFBfUFJPSkVDVCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0xQX1BST0pFQ1QiOyAvLyROT04tTkxTLTEkCQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVhDRVBUSU9OX1RZUEUgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VYQ0VQVElPTl9UWVBFIjsgLy8kTk9OLU5MUy0xJAkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9DT05GTElDVElOR19XTFBfUFJPSkVDVCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0NPTkZMSUNUSU5HX1dMUF9QUk9KRUNUIjsgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRUpCX1JFRl9UWVBFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FSkJfUkVGX1RZUEUiOyAgLy8kTk9OLU5MUy0xJAotCS8vSjJFRSAxNCBNZXNzYWdlcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfVVJMX1BBVFRFUk5fRU5EX1dJVEhfQ0FSUkFJR0VfUkVUVVJOID0gIk1FU1NBR0VfVVJMX1BBVFRFUk5fRU5EX1dJVEhfQ0FSUkFJR0VfUkVUVVJOIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCQotCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTQ5MzgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAid2FydmFsaWRhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9XQVJfVkFMSURBVElPTl9GQUlMRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfSlNQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU01BTExfSUNPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0xBUkdFX0lDT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fU0VSVkxFVF9NQVBQSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTk9fV0VMQ09NRV9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19XRUxDT01FX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1RMRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTlZBTElEX1dBUl9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX0ZJTFRFUl9NQVBQSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9XRUxDT01FX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0FSX0REX1BBUlNFX0xJTkVDT0w7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0FSX0REX1BBUlNFX0xJTkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0FSX0REX1BBUlNFX05PSU5GTzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXQVJfRERfQ0FOTk9UX09QRU5fREQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0hUVFBfQ01EOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9UUkFOU1BPUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0pTUEZJTEVfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9JTlZBTElEX0NPTlRFWFRfUk9PVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVJST1JfUEFHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEVfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfQVVUSF9NRVRIT0Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JR05PUkVfRk9STV9MT0dJTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfUkVRVUlSRURfMjM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVhDRVBUSU9OX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfTUFQUElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9TRVJWTEVUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU0VTU0lPTl9USU1FT1VUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRklMVEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VKQl9SRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfRUFSX1VOQ09OVEFJTkVEX01PRFVMRV9GSUxFX0VYQ0VQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVJST1JfQ09ERTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfUkVTX1NIQVJJTkdfU0NPUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VOVl9FTlRSWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0xQX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9DT05GTElDVElOR19XTFBfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfU0VSVkVSX1RBUkdFVF9NSVNNQVRDSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1VSTF9QQVRURVJOX0VORF9XSVRIX0NBUlJBSUdFX1JFVFVSTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRUpCX1JFRl9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX0VKQl9ST0xFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfU2VjdXJpdHlfUm9sZV9OYW1lXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViX0FyY2hpdmVfVmFsaWRhdG9yXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9Sb2xlX05hbWVfMTk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8yNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX1BhcmFtZXRlcl9WYWx1ZV8yNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfUGFyYW1ldGVyX1ZhbHVlXzMzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfNDA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9lamJfcmVmX25hbWVfNDQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9FcnJvcl9Mb2NhdGlvbl80NzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX0Vycm9yX0xvY2F0aW9uXzQ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfTWltZV9FeHRlbnNpb25fNTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9NaW1lX1R5cGVfNTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9NaW1lX0V4dGVuc2lvbl9fXzU2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfV2ViX1Jlc291cmNlX0NvbGxlY3Rpb25fNjQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9GaWx0ZXJfTmFtZV82NjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX1VSTF83MDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX1VSTF83NTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX1NlcnZsZXRfTmFtZV83NzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX1RhZ2xpYl84MDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvZl9UeXBlX1RhZ0xpYl9fXzgxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9mX1R5cGVfV2ViX1Jlc291cmNlX05hbWVfODQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9XZWxjb21lX0ZpbGVfTmFtZV9fODc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2ZfVHlwZV9FbnZfRW50cnlfTmFtZV9fXzg4OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XYXJWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XYXJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViOGI1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV2FyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5FSkJMb2NhbFJlZkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRWpiUmVmSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSlNQVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5NaW1lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVzZXJEYXRhQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotCi0vLyBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBXYXJWYWxpZGF0b3IgZXh0ZW5kcyBKMkVFVmFsaWRhdG9yIGltcGxlbWVudHMgV0FSTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHJvdGVjdGVkIFdBUkZpbGUgd2FyRmlsZTsKLQlwcm90ZWN0ZWQgV2ViQXBwIHdlYkREOwotCXByaXZhdGUgSGFzaHRhYmxlIGh0dHBNZXRob2RzID0gbnVsbDsKLQotCS8vIE9wdGlvbmFsIGNoaWxkIHZhbGlkYXRvcnMKLQkvLyBwcm90ZWN0ZWQgV2ViRXh0VmFsaWRhdG9yIHdlYkV4dFZhbGlkYXRvcjsKLQkvLyBwcm90ZWN0ZWQgV2ViQm5kVmFsaWRhdG9yIHdlYkJuZFZhbGlkYXRvcjsKLQotCi0JLyoqCi0JICogUmVsYXRpb25zaGlwTWFwVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdhclZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaWxsIGNvbnN0cnVjdCBhIEhhc2hUYWJsZSBvZiByb2xlcywgYW5kIGNoZWNrIGZvciBkdXBsaWNhdGVzIGFuZCBudWxsIGVudHJpZXMKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5IYXNodGFibGUKLQkgKiBAcGFyYW0gcm9sZXMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdAotCSAqLwotCXB1YmxpYyBIYXNodGFibGUgZ2V0QW5kVmFsaWRhdGVTZWN1cml0eVJvbGVzKEVMaXN0IHJvbGVzKSB7Ci0KLQkJSGFzaHRhYmxlIHNlY1JvbGVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpZiAocm9sZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIChzZWNSb2xlcyk7Ci0KLQkJSXRlcmF0b3Igc1JvbGVzID0gcm9sZXMuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc1JvbGVzLmhhc05leHQoKSkgewotCQkJCi0JCQlpZiggX3JlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgKXsKLQkJCQlTdHJpbmcgbXNnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCk7CQkJCi0JCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUNhbmNlbFN0YXR1cyhtc2cpOwotCQkJfQotCQkJCi0JCQlTZWN1cml0eVJvbGUgcm9sZSA9IChTZWN1cml0eVJvbGUpIHNSb2xlcy5uZXh0KCk7Ci0KLQotCQkJU3RyaW5nIG5hbWUgPSByb2xlLmdldFJvbGVOYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCW5hbWUgPSBuYW1lLnRyaW0oKTsKLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfU2VjdXJpdHlfUm9sZV9OYW1lXzY7Ci0JCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcywgcm9sZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoc2VjUm9sZXMuZ2V0KG5hbWUpICE9IG51bGwpIHsgLy8gQ2hlY2sgZm9yIGR1cHMKLQotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IG5hbWU7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcywgcm9sZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzZWNSb2xlcy5wdXQobmFtZSwgIlllYSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCi0JCXJldHVybiBzZWNSb2xlczsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBbnN3ZXIgdGhlIGlkIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgd2hpY2ggaXMgdXNlZCBieSB0aGUgcmVjZWl2ZXIuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0JCXJldHVybiBXQVJfQ0FURUdPUlk7Ci0JfQotCi0JLy8gTWVzc2FnaW5nIGhlbHBlcnMgLi4uCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJLgotCSAqIAotCSAqIEBzZWUgSjJFRVZhbGlkYXRvciNnZXROYW1lCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLldlYl9BcmNoaXZlX1ZhbGlkYXRvcl84OwotCX0KLQotCS8vIE1lc3NhZ2luZyBoZWxwZXJzIC4uLgotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgVmFsaWRhdG9yLCBhcyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBVSS4KLQkgKiAKLQkgKiBAc2VlIEoyRUVWYWxpZGF0b3IjZ2V0TmFtZQotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKExvY2FsZSBsb2NhbGUpIHsKLQkJcmV0dXJuIGdldE1lc3NhZ2UobnVsbCwgIndlYkFyY2hpdmVWYWxpZGF0b3IubmFtZSIsIGxvY2FsZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IHRoZSB2YWxpZGF0ZVNlY3VyaXR5Q29uc3RyYWludHMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNIdHRwTWV0aG9kKFN0cmluZyBtZXRob2QpIHsKLQotCi0JCWlmIChodHRwTWV0aG9kcyA9PSBudWxsKSB7IC8vIE5lZWQgdG8gY29uc3RydWN0IHRoZSBIYXNodGFibGUsIG9uY2UKLQkJCVN0cmluZ1tdIG1MaXN0ID0gewotCQkJCSJHRVQiLCAvLyROT04tTkxTLTEkCi0JCQkJIlBVVCIsICAvLyROT04tTkxTLTEkCi0JCQkJIkhFQUQiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJUUkFDRSIsICAvLyROT04tTkxTLTEkCi0JCQkJIlBPU1QiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJERUxFVEUiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJPUFRJT05TIiwgLy8kTk9OLU5MUy0xJAotCQkJCS8vV0VCREFWCi0JCQkJIkFDSyIsICAvLyROT04tTkxTLTEkCi0JCQkJIkFDTCIsICAvLyROT04tTkxTLTEkCi0JCQkJIkJBU0VMSU5FLUNPTlRST0wiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJCSU5EIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiQllFIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiQ0FOQ0VMIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiQ0hFQ0tJTiIsICAvLyROT04tTkxTLTEkCi0JCQkJIkNIRUNLT1VUIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiQ09QWSIsICAvLyROT04tTkxTLTEkCi0JCQkJIkVSUk9SUkVTUE9OU0UiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJJTkZPIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiSU5WSVRFIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiTEFCRUwiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJMT0NLIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiTUVSR0UiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJNRVNTQUdFIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiTUtBQ1RJVklUWSIsICAvLyROT04tTkxTLTEkCi0JCQkJIk1LQ09MIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiTUtXT1JLU1BBQ0UiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJNT1ZFIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiTk9USUZZIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiUFJBQ0siLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJQUk9QRklORCIsICAvLyROT04tTkxTLTEkCi0JCQkJIlBST1BQQVRDSCIsICAvLyROT04tTkxTLTEkCi0JCQkJIlBST1ZJU0lPTkFMUkVTUE9OU0UiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJQVUJMSVNIIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiUkVCSU5EIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiUkVESVJFQ1RSRVNQT05TRSIsICAvLyROT04tTkxTLTEkCi0JCQkJIlJFR0lTVEVSIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiUkVQT1JUIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiUkVRVUVTVCIsICAvLyROT04tTkxTLTEkCi0JCQkJIlJFU1BPTlNFIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiU0VBUkNIIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiU1VDQ0VTU1JFU1BPTlNFIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiVU5CSU5EIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkiVU5DSEVDS09VVCIsICAvLyROT04tTkxTLTEkCi0JCQkJIlVOTE9DSyIsICAvLyROT04tTkxTLTEkCi0JCQkJIlVQREFURSIsICAvLyROT04tTkxTLTEkCi0JCQkJIlZFUlNJT04tQ09OVFJPTCIvLyROT04tTkxTLTEkCi0JCQl9OyAKLQotCQkJaHR0cE1ldGhvZHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1MaXN0Lmxlbmd0aDsgaSsrKQotCQkJCWh0dHBNZXRob2RzLnB1dChtTGlzdFtpXSwgImJsYSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIGNvbXBhcmUgPSBtZXRob2QudHJpbSgpOwotCQlyZXR1cm4gKGh0dHBNZXRob2RzLmdldChjb21wYXJlKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBXQVIgdmFsaWRhdGlvbiBpcyBkcml2ZW4gYnkgMyBwcm9uZyBhcHByb2FjaDogbyBYTUwvRFREIHZhbGlkYXRpb24gKHRoaXMgaXMgbm93IGhhbmRsZWQgYnkKLQkgKiB0aGUgWE1MIFZhbGlkYXRvcikgbyBDb25zaXN0ZW50IHdlYi54bWwgZGF0YSBlbnRyeSB2YWxpZGF0aW9uIGJleW9uZCBEVEQgZS5nLiwgZHVwbGljYXRlCi0JICogZW50cmllcywgbnVsbCBlbnRyaWVzIGV0Yy4gVGhpcyBpcyBhbHNvIGRyaXZlbiBieSB0aGlzIHZhbGlkYXRvci4gbyB3ZWIueG1sIHJlZmVyZW5jZSB0bwotCSAqIHJlc291cmNlcyBpbiB0aGUgImZpbGUgc3lzdGVtIi4gVGhpcyB3aWxsIG5vdCBiZSBwcm92aWRlZCBieSB0aGlzIHZhbGlkYXRvci4gSW4gdGhlIHdvcmtiZW5jaAotCSAqIHRoaXMgZnVuY3Rpb24gaXMgYWxyZWFkeSBwcm92aWRlZCBieSB0aGUgbGluayBidWlsZGVyLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl2YWxpZGF0ZU1pbWVNYXBwaW5nKCk7Ci0JCXZhbGlkYXRlQ29udGV4dFBhcmFtZXRlcnMoKTsKLQkJdmFsaWRhdGVUYWdMaWJzKCk7Ci0JCXZhbGlkYXRlU2VydmxldE1hcHBpbmdzKHdlYkRELmdldFNlcnZsZXRNYXBwaW5ncygpKTsKLQkJdmFsaWRhdGVXZWxjb21lRmlsZUxpc3Qod2ViREQuZ2V0RmlsZUxpc3QoKSk7Ci0JCXZhbGlkYXRlRXJyb3JQYWdlcyh3ZWJERC5nZXRFcnJvclBhZ2VzKCkpOwotCQl2YWxpZGF0ZVNlY3VyaXR5QW5kU2VydmxldHMoKTsKLQkJdmFsaWRhdGVGaWx0ZXJzKHdlYkRELmdldEZpbHRlcnMoKSk7Ci0JCXZhbGlkYXRlRmlsdGVyTWFwcGluZ3Mod2ViREQuZ2V0RmlsdGVyTWFwcGluZ3MoKSk7Ci0JCXZhbGlkYXRlUmVmcygpOwotCQl2YWxpZGF0ZUxvZ2luQ29uZmlnKHdlYkRELmdldExvZ2luQ29uZmlnKCkpOwotCQl2YWxpZGF0ZUVudmlyb25tZW50RW50cmllcyh3ZWJERC5nZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKSk7Ci0JCXZhbGlkYXRlT3RoZXIoKTsKLQkJdmFsaWRhdGUxNCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZTE0KCkgewotCQlpbnQgdmVyc2lvbklkID0gd2ViREQuZ2V0VmVyc2lvbklEKCk7Ci0JCWlmICh2ZXJzaW9uSWQgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRCkgewotCQkJdmFsaWRhdGVVcmxQYXR0ZXJuKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVVcmxQYXR0ZXJuKCkgewotCQlMaXN0IHNlcnZsZXRNYXBwaW5ncyA9IHdlYkRELmdldFNlcnZsZXRNYXBwaW5ncygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZsZXRNYXBwaW5ncy5zaXplKCk7IGkrKykgewotCQkJU2VydmxldE1hcHBpbmcgbWFwcGluZyA9IChTZXJ2bGV0TWFwcGluZykgc2VydmxldE1hcHBpbmdzLmdldChpKTsKLQkJCVN0cmluZyB1cmxQYXR0ZXJuID0gbWFwcGluZy5nZXRVcmxQYXR0ZXJuKCk7Ci0JCQlpbnQgbmV3TGluZUNoYXIgPSB1cmxQYXR0ZXJuLmluZGV4T2YoQ2hhcmFjdGVyLkxJTkVfU0VQQVJBVE9SKTsKLQkJCWlmIChuZXdMaW5lQ2hhciAhPSAtMSkgewotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1syXTsKLQkJCQlwYXJtc1swXSA9IHVybFBhdHRlcm47Ci0JCQkJcGFybXNbMV0gPSBtYXBwaW5nLmdldFNlcnZsZXQoKS5nZXREaXNwbGF5TmFtZSgpOwotCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9VUkxfUEFUVEVSTl9FTkRfV0lUSF9DQVJSQUlHRV9SRVRVUk4sIHBhcm1zLCBtYXBwaW5nKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWV0aG9kIHdoaWNoIHBlcmZvcm1zIHRoZSB2YWxpZGF0aW9uIG9uIHRoZSBNT0YgbW9kZWwuIDxicj4KLQkgKiA8YnI+Ci0JICogPGNvZGU+aGVscGVyPC9jb2RlPiBhbmQgPGNvZGU+cmVwb3J0ZXI8L2NvZGU+IG1heSBub3QgYmUgbnVsbC4gPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPgotCSAqIG1heSBiZSBudWxsLCBpZiBhIGZ1bGwgYnVpbGQgaXMgZGVzaXJlZC4gPGJyPgotCSAqIDxicj4KLQkgKiA8Y29kZT5oZWxwZXI8L2NvZGU+IGxvYWRzIGEgRU9iamVjdC4gVGhlIEVPYmplY3QgaXMgdGhlIHJvb3Qgb2YgdGhlIE1PRiBtb2RlbCBhYm91dCB0byBiZQotCSAqIHZhbGlkYXRlZC4gV2hlbiB0aGlzIG9iamVjdCBpcyB0cmF2ZXJzZWQsIHlvdSBjYW4gcmVhY2ggZXZlcnkgZWxlbWVudCBpbiB0aGUgTU9GIG1vZGVsIHdoaWNoCi0JICogbmVlZHMgdG8gYmUgdmFsaWRhdGVkLiA8YnI+Ci0JICogPGJyPgotCSAqIDxjb2RlPnJlcG9ydGVyPC9jb2RlPiBpcyBhbiBpbnN0YW5jZSBvZiBhbiBJUmVwb3J0ZXIgaW50ZXJmYWNlLCB3aGljaCBpcyB1c2VkIGZvcgotCSAqIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIuIDxicj4KLQkgKiA8YnI+Ci0JICogPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPiBpcyBhbiBhcnJheSBvZiBmaWxlIG5hbWVzIHdoaWNoIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdAotCSAqIHZhbGlkYXRpb24uIElmIDxjb2RlPmNoYW5nZWRGaWxlczwvY29kZT4gaXMgbnVsbCwgb3IgaWYgaXQgaXMgYW4gZW1wdHkgYXJyYXksIHRoZW4gYSBmdWxsCi0JICogYnVpbGQgaXMgcGVyZm9ybWVkLiBPdGhlcndpc2UsIHZhbGlkYXRpb24gb24ganVzdCB0aGUgZmlsZXMgbGlzdGVkIGluIHRoZSBWZWN0b3IgaXMKLQkgKiBwZXJmb3JtZWQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl2YWxpZGF0ZUluSm9iKGluSGVscGVyLCBpblJlcG9ydGVyKTsKLQl9Ci0JCi0JCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlSW5Kb2IoaW5IZWxwZXIsIGluUmVwb3J0ZXIpOwotCQkKLQotCQkvLyBGaXJzdCByZW1vdmUgYWxsIHByZXZpb3VzIG1zZy4gZm9yIHRoaXMgcHJvamVjdAotCQlfcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcywgbnVsbCk7IC8vIE5vdGUgdGhlIFdhckhlbHBlciB3aWxsIHJldHVybiB3ZWIueG1sIHdpdGggYQotCQkJCQkJCQkJCQkJCS8vIG51bGwgb2JqZWN0IGFzIHdlbGwKLQotCQlpZiggIV9yZXBvcnRlci5pc0NhbmNlbGxlZCgpKXsKLQkJCQotCQkJd2FyRmlsZSA9IChXQVJGaWxlKSBfaGVscGVyLmxvYWRNb2RlbChXQVJfTU9ERUxfTkFNRSk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJaWYgKHdhckZpbGUgIT0gbnVsbCkgewotCQkJCQl3ZWJERCA9IHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX0lOVkFMSURfV0FSX0ZJTEUpOwotCQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIGVycm9yTXNnLmdldFRleHQoIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSApKTsKLQkJCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2cpOwotCQkJCX0KLQkKLQkJCX0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gZS50b1N0cmluZygpOwotCQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfV0FSX1ZBTElEQVRJT05fRkFJTEVELCBwYXJtcyk7Ci0JCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKGVycm9yTXNnLmdldFRleHQoIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSApKTsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZywgZSk7Ci0JCQl9Ci0JCX1lbHNlewotCQkJU3RyaW5nIG1zZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQpOwkJCQotCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUNhbmNlbFN0YXR1cyhtc2cpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB2YWxpZGF0b3IgY2FuIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24gd2hlbiB0aGUgcmVwb3J0ZXIgYW5kIGhlbHBlciBoYXZlIGJlZW4gc3VwcGxpZWQgdmlhCi0JICogdGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBhV2FyRmlsZSkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQl3YXJGaWxlID0gKFdBUkZpbGUpIGFXYXJGaWxlOwotCQkJd2ViREQgPSB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJCXZhbGlkYXRlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IGUudG9TdHJpbmcoKTsKLQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfV0FSX1ZBTElEQVRJT05fRkFJTEVELCBwYXJtcyk7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgYXV0aC1jb25zdHJhaW50IGVsZW1lbnQgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQgc2hvdWxkIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcwotCSAqIHJlc291cmNlIGNvbGxlY3Rpb24uIFRoZSByb2xlIHVzZWQgaGVyZSBtdXN0IGFwcGVhciBpbiBhIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQuIDwhRUxFTUVOVAotCSAqIGF1dGgtY29uc3RyYWludCAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUqKT4gVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgKiBzZWN1cml0eSByb2xlLiA8IUVMRU1FTlQgcm9sZS1uYW1lICgjUENEQVRBKT4gQ3JlYXRpb24gZGF0ZTogKDcvNi8yMDAxIDM6Mzk6MzQgUE0pCi0JICogCi0JICogQHBhcmFtIGF1dGhDb25zdHJhaW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQgYXV0aENvbnN0cmFpbnQsIEhhc2h0YWJsZSBzZWNSb2xlcykgewotCi0JCUVMaXN0IHJvbGVMaXN0ID0gYXV0aENvbnN0cmFpbnQuZ2V0Um9sZXMoKTsKLQotCQlpZiAocm9sZUxpc3QgIT0gbnVsbCAmJiAhcm9sZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBhdXRoUm9sZXMgPSByb2xlTGlzdC5pdGVyYXRvcigpOwotCQkJSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJd2hpbGUgKGF1dGhSb2xlcy5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgcm9sZSA9IChTdHJpbmcpIGF1dGhSb2xlcy5uZXh0KCk7Ci0JCQkJaWYgKHJvbGUgPT0gbnVsbCB8fCByb2xlLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9Sb2xlX05hbWVfMTk7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcywgYXV0aENvbnN0cmFpbnQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHJlbWVtYmVyLmdldChyb2xlLnRyaW0oKSkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gcm9sZTsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcywgYXV0aENvbnN0cmFpbnQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmVtZW1iZXIucHV0KHJvbGUudHJpbSgpLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWxpZGF0ZUF1dGhTZWNSb2xlKCIiLCByb2xlLCBzZWNSb2xlcywgYXV0aENvbnN0cmFpbnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzUvMjAwMSAyOjIwOjAyIFBNKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ29udGV4dFBhcmFtZXRlcnMoKSB7Ci0KLQkJLy8gd2UgbXVzdCB2ZXJpZnkgdGhhdCBldmVyeSBwYXJhbS1uYW1lIGlzIHVuaXF1ZTsKLQkJLy8gcGFyYW0tbmFtZSBhcHBlYXJzIGluIGNvbnRleHQgcGFyYW1ldGVycywgZmlsdGVyCi0JCS8vIGFuZCBzZXJ2bGV0cy4gV2UgbXVzdCBjaGVjayBlYWNoLgotCQlIYXNodGFibGUgcmVtZW1iZXIgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJLy8gY2hlY2sgY29udGV4dCBwYXJhbWV0ZXJzIC0gZWFjaCBwYXJhbS1uYW1lIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24KLQkJSXRlcmF0b3IgY3BhcmFtcyA9IHdlYkRELmdldENvbnRleHRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNwYXJhbXMuaGFzTmV4dCgpKSB7Ci0JCQkKLQkJCWlmKCBfcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSApewotCQkJCVN0cmluZyBtc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVEKTsJCQkKLQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlQ2FuY2VsU3RhdHVzKG1zZyk7Ci0JCQl9Ci0JCQkKLQkJCUNvbnRleHRQYXJhbSBjb250ZXh0ID0gKENvbnRleHRQYXJhbSkgY3BhcmFtcy5uZXh0KCk7Ci0KLQkJCVN0cmluZyBuYW1lID0gY29udGV4dC5nZXRQYXJhbU5hbWUoKTsKLQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCi0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzI1OwotCi0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLCBjb250ZXh0KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIGlmIChyZW1lbWJlci5nZXQobmFtZSArIHZhbHVlKSAhPSBudWxsKSB7IC8vIENoZWNrIGZvciBkdXBzCi0JCQlpZiAocmVtZW1iZXIuZ2V0KG5hbWUpICE9IG51bGwpIHsgLy8gQ2hlY2sgZm9yIGR1cHMKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMjUgKyAiOiAiICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWSwgcGFybXMsIGNvbnRleHQpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gcmVtZW1iZXIucHV0KG5hbWUgKyB2YWx1ZSwgIlllYSIpOwotCQkJcmVtZW1iZXIucHV0KG5hbWUsICJZZWEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQkvLyBjaGVjayBzZXJ2bGV0IGluaXQtcGFyYW0gLSBlYWNoIHBhcmFtLW5hbWUgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4gYSBzZXJ2bGV0Ci0JCUl0ZXJhdG9yIHNlcnZsZXRzID0gd2ViREQuZ2V0U2VydmxldHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoc2VydmxldHMuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2bGV0IG5leHRTZXJ2bGV0ID0gKFNlcnZsZXQpIHNlcnZsZXRzLm5leHQoKTsKLQkJCUl0ZXJhdG9yIHBhcmFtcyA9IG5leHRTZXJ2bGV0LmdldFBhcmFtcygpLml0ZXJhdG9yKCk7Ci0JCQlyZW1lbWJlci5jbGVhcigpOwotCQkJd2hpbGUgKHBhcmFtcy5oYXNOZXh0KCkpIHsKLQkJCQlJbml0UGFyYW0gaW5pdFBhcmFtID0gKEluaXRQYXJhbSkgcGFyYW1zLm5leHQoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IGluaXRQYXJhbS5nZXRQYXJhbU5hbWUoKTsKLQotCQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJCW5hbWUgPSBuYW1lLnRyaW0oKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMzI7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcywgaW5pdFBhcmFtKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChyZW1lbWJlci5nZXQobmFtZSkgIT0gbnVsbCkgeyAvLyBDaGVjayBmb3IgZHVwcwotCi0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMjUgKyAiOiAiICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlksIHBhcm1zLCBpbml0UGFyYW0pOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmVtZW1iZXIucHV0KG5hbWUsICJZZWEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgZmlsdGVyIGluaXQtcGFyYW0gLSBlYWNoIHBhcmFtLW5hbWUgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4gYSBmaWx0ZXIKLQkJSXRlcmF0b3IgZmlsdGVycyA9IHdlYkRELmdldEZpbHRlcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZmlsdGVycy5oYXNOZXh0KCkpIHsKLQkJCUZpbHRlciBuZXh0RmlsdGVyID0gKEZpbHRlcikgZmlsdGVycy5uZXh0KCk7Ci0JCQlJdGVyYXRvciBwYXJhbXMgPSBuZXh0RmlsdGVyLmdldEluaXRQYXJhbXMoKS5pdGVyYXRvcigpOwotCQkJcmVtZW1iZXIuY2xlYXIoKTsKLQkJCXdoaWxlIChwYXJhbXMuaGFzTmV4dCgpKSB7Ci0JCQkJSW5pdFBhcmFtIGluaXRQYXJhbSA9IChJbml0UGFyYW0pIHBhcmFtcy5uZXh0KCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpbml0UGFyYW0uZ2V0UGFyYW1OYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCQluYW1lID0gbmFtZS50cmltKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzM5OwotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIGluaXRQYXJhbSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAocmVtZW1iZXIuZ2V0KG5hbWUpICE9IG51bGwpIHsgLy8gQ2hlY2sgZm9yIGR1cHMKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8yNSArICI6ICIgKyBuYW1lOwotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlksIHBhcm1zLCBpbml0UGFyYW0pOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmVtZW1iZXIucHV0KG5hbWUsICJZZWEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBFSkIgcmVmZXJlbmNlcy4KLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCUmVmcyhFamJSZWZJbXBsIGVyZWYpIHsKLQkJLy8gdHJ5IHsKLQotCQlFQVJGaWxlIGVhckZpbGUgPSB3YXJGaWxlLmdldEVBUkZpbGUoKTsKLQkJRW50ZXJwcmlzZUJlYW4gZWIgPSBudWxsOwotCi0JCWlmIChlYXJGaWxlICE9IG51bGwpCi0JCQllYiA9IGVhckZpbGUuZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoZXJlZiwgd2FyRmlsZS5nZXRVUkkoKSk7Ci0KLQkJaWYgKCEoZWIgPT0gbnVsbCkpIHsKLQkJCUxpc3QgZWpiUmVmcyA9IGViLmdldEVqYlJlZnMoKTsKLQotCQkJaW50IG51bVJlZnMgPSBlamJSZWZzLnNpemUoKTsKLQotCQkJU2V0IHJlZlNldCA9IG5ldyBIYXNoU2V0KG51bVJlZnMpOwotCi0JCQlmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgbnVtUmVmczsgcmVmTm8rKykgewotCQkJCVN0cmluZyBuZXh0TmFtZSA9ICgoRWpiUmVmSW1wbCkgKGVqYlJlZnMuZ2V0KHJlZk5vKSkpLmdldE5hbWUoKTsKLQotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IGViLmdldE5hbWUoKTsKLQkJCQlpZiAoIShyZWZTZXQuYWRkKG5leHROYW1lKSkpIHsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVMsIHBhcm1zLCBlamJSZWZzLmdldChyZWZObykpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIH0gY2F0Y2ggKFVuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbiB1ZSkgewotCQkvLyBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCS8vIHBhcm1zWzBdID0gd2FyRmlsZS5nZXROYW1lKCk7Ci0JCS8vIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9VTkNPTlRBSU5FRF9NT0RVTEVfRklMRV9FWENFUFRJT04sIHBhcm1zKTsKLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIGZvciBkdXBsaWNhdGVzIGluIEVBUiBSb2xlcwotCSAqLwotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFSkJSZWZzKExpc3QgZWpiUmVmcykgewotCQlpbnQgbnVtUmVmcyA9IGVqYlJlZnMuc2l6ZSgpOwotCQlIYXNodGFibGUgcmVtZW1iZXIgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCBudW1SZWZzOyByZWZObysrKSB7Ci0JCQlFamJSZWZJbXBsIGVyZWYgPSAoRWpiUmVmSW1wbCkgZWpiUmVmcy5nZXQocmVmTm8pOwotCQkJaWYgKGVyZWYuaXNTZXRUeXBlKCkpIHsKLQkJCQlTdHJpbmcgdHlwZSA9IGVyZWYuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRUpCX1JFRl9UWVBFLCBudWxsLCBlcmVmKTsgLy8gVHlwZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIEVOVElUWQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvcgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBGT08KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZXJlZi5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuYW1lID0gZXJlZi5nZXROYW1lKCk7Ci0JCQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCi0JCQkJaWYgKG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfZWpiX3JlZl9uYW1lXzQ0OwotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIGVyZWYpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7IC8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBuYW1lOwotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRUpCX1JFRiwgcGFybXMsIGVyZWYpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmVtZW1iZXIucHV0KG5hbWUsICJZZWEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfZWpiX3JlZl9uYW1lXzQ0OwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcywgZXJlZik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQotCQkJdmFsaWRhdGVFSkJSZWZzKGVyZWYpOwotCQkJdmFsaWRhdGVFSkJSZWZNYW5hZGF0b3J5RWxlbWVudHMoZXJlZiwgd2ViREQuZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIHZhbGlkYXRlIGZvciBkdXBsaWNhdGVzIGluIEVBUiBSb2xlcwotCSAqLwotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFSkJMb2NhbFJlZnMoTGlzdCBlamJSZWZzKSB7Ci0JCWludCBudW1SZWZzID0gZWpiUmVmcy5zaXplKCk7Ci0JCUhhc2h0YWJsZSByZW1lbWJlciA9IG5ldyBIYXNodGFibGUoKTsKLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IG51bVJlZnM7IHJlZk5vKyspIHsKLQkJCUVKQkxvY2FsUmVmSW1wbCBlcmVmID0gKEVKQkxvY2FsUmVmSW1wbCkgZWpiUmVmcy5nZXQocmVmTm8pOwotCQkJaWYgKGVyZWYuaXNTZXRUeXBlKCkpIHsKLQkJCQlTdHJpbmcgdHlwZSA9IGVyZWYuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRUpCX1JFRl9UWVBFLCBudWxsLCBlcmVmKTsgLy8gVHlwZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIEVOVElUWQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvcgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBGT08KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZXJlZi5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuYW1lID0gZXJlZi5nZXROYW1lKCk7Ci0JCQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCi0JCQkJaWYgKG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfZWpiX3JlZl9uYW1lXzQ0OwotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIGVyZWYpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7IC8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBuYW1lOwotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRUpCX1JFRiwgcGFybXMsIGVyZWYpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmVtZW1iZXIucHV0KG5hbWUsICJZZWEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfZWpiX3JlZl9uYW1lXzQ0OwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcywgZXJlZik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQotCQkJLy8gdmFsaWRhdGVFSkJSZWZzKGVyZWYpOwotCQkJLy8gdmFsaWRhdGVFSkJSZWZNYW5hZGF0b3J5RWxlbWVudHMoZXJlZiwgd2ViREQuZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMaW5rIGJ1aWxkIHNob3VsZCB2ZXJpZnkgbG9jYXRpb24gb2YgZXhjZXB0aW9uIGNsYXNzCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVycm9yUGFnZXMoRUxpc3QgZXJyb3JQYWdlTGlzdCkgewotCQlJdGVyYXRvciBlcnJvclBhZ2VzID0gZXJyb3JQYWdlTGlzdC5pdGVyYXRvcigpOwotCi0JCWlmIChlcnJvclBhZ2VMaXN0ID09IG51bGwgfHwgZXJyb3JQYWdlTGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJd2hpbGUgKGVycm9yUGFnZXMuaGFzTmV4dCgpKSB7Ci0JCQkKLQkJCWlmKCBfcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSApewotCQkJCVN0cmluZyBtc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVEKTsJCQkKLQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlQ2FuY2VsU3RhdHVzKG1zZyk7Ci0JCQl9Ci0JCQkKLQkJCUVycm9yUGFnZSBuZXh0UGFnZSA9IChFcnJvclBhZ2UpIGVycm9yUGFnZXMubmV4dCgpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gbmV4dFBhZ2UuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChsb2NhdGlvbiA9PSBudWxsIHx8IGxvY2F0aW9uLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9FcnJvcl9Mb2NhdGlvbl80NzsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIG5leHRQYWdlKTsKLQkJCX0KLQkJCWlmICghbG9jYXRpb24uc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDk7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9QQUdFLCBwYXJtcywgbmV4dFBhZ2UpOwotCQkJfQotCi0KLQkJCS8vIGNoZWNrIGZvciB2YWxpZCBIVFRQIGVycm9yIGNvZGUgLSBtdXN0IGJlIGFuIEludGVnZXIsIDMgZGlnaXRzLCBhbmQgdGhlIHN0YXJ0aW5nCi0JCQkvLyBkaWdpdCBtdXN0IGJlIGEgMSwyLDMsNCwgb3IgNS4KLQkJCWlmIChuZXh0UGFnZS5pc0Vycm9yQ29kZSgpKSB7Ci0JCQkJRXJyb3JDb2RlRXJyb3JQYWdlIGVjZXAgPSAoRXJyb3JDb2RlRXJyb3JQYWdlKSBuZXh0UGFnZTsKLQkJCQlTdHJpbmcgZXJyb3JDb2RlID0gZWNlcC5nZXRFcnJvckNvZGUoKTsKLQotCQkJCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQkJCQlpZiAoZXJyb3JDb2RlLmxlbmd0aCgpID09IDMpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUludGVnZXIgdGVtcEludCA9IG5ldyBJbnRlZ2VyKGVycm9yQ29kZSk7Ci0JCQkJCQkvLyBvaywgaXQncyBhIHZhbGlkIDMtZGlnaXQgaW50ZWdlcgotCQkJCQkJaW50IGNvZGUgPSB0ZW1wSW50LmludFZhbHVlKCk7Ci0JCQkJCQlpZiAoY29kZSA+PSAxMDAgJiYgY29kZSA8IDYwMCkgewotCQkJCQkJCS8vIHZhbGlkIEhUVFAgc3RhdHVzIGNvZGUgLSBzdGFydGluZyBkaWdpdCBtdXN0IGJlIGJldHdlZW4gMS01Ci0JCQkJCQkJdmFsaWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkvLyBJZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXZhbGlkKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBlcnJvckNvZGU7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVJST1JfQ09ERSwgcGFybXMsIGVjZXApOwotCQkJCX0KLQotCQkJfQotCi0JCQkvLyBJZiBleGNlcHRpb24tdHlwZS4uLiB0aGUgc3BlY2lmaWVkIGNsYXNzIG11c3QgYmUgb3IgaW5oZXJpdCBmcm9tIGphdmEubGFuZy5UaHJvd2FibGUKLQkJCWVsc2UgaWYgKG5leHRQYWdlLmlzRXhjZXB0aW9uVHlwZSgpKSB7Ci0JCQkJRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBldGVwID0gKEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpIG5leHRQYWdlOwotCQkJCUphdmFDbGFzcyBqYXZhVHlwZSA9IGV0ZXAuZ2V0RXhjZXB0aW9uVHlwZSgpOwotCQkJCVN0cmluZyBleGNlcHRpb25UeXBlID0gImphdmEubGFuZy5UaHJvd2FibGUiOy8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgc3BlY2lmaWVkQ2xhc3NOYW1lID0gZXRlcC5nZXRFeGNlcHRpb25UeXBlTmFtZSgpOwotCQkJCWlmIChqYXZhVHlwZSAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlU2V0IGxvb2t1cFNldCA9IGphdmFUeXBlLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCWlmIChsb29rdXBTZXQgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFqYXZhVHlwZS5pbmhlcml0c0Zyb20oSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGV4Y2VwdGlvblR5cGUsIGxvb2t1cFNldCkuZ2V0V3JhcHBlcigpKSkgewotCQkJCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJCQlwYXJtc1swXSA9IHNwZWNpZmllZENsYXNzTmFtZTsKLQkJCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VYQ0VQVElPTl9UWVBFLCBwYXJtcywgZXRlcCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VYQ0VQVElPTl9UWVBFLCBwYXJtcywgZXRlcCk7Ci0JCQkJfQotCQkJCS8vIFRCRAotCQkJfSBlbHNlIHsgLy8gRXJyb3IgQ29kZQotCQkJCS8vIFRCRAotCQkJfQotCi0JCQkvLyBUQkQgcmVtZW1iZXIgbG9jYXRpb24vY29kZS9leGNlcHRpb24gZHVwcwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgbG9naW5Db25maWcgc2VjdGlvbiBpcyBjb3JyZWN0Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBsb2dpbkNvbmZpZykgewotCQkvLyBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5WYWxpZGF0b3JNYW5hZ2VyLnNldFJlc291cmNlVXRpbENsYXNzKGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLnVpLlVJUmVzb3VyY2VVdGlsLmNsYXNzKTsKLQotCQlpZiAobG9naW5Db25maWcgIT0gbnVsbCkgewotCQkJU3RyaW5nIGF1dGggPSBsb2dpbkNvbmZpZy5nZXRBdXRoTWV0aG9kKCkuZ2V0TmFtZSgpOwotCi0JCQlpZiAoYXV0aCA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzBdOwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfQVVUSF9NRVRIT0QsIHBhcm1zLCBsb2dpbkNvbmZpZyk7Ci0JCQl9Ci0JCQkvLyBHaXZlIGEgd2FybmluZyBpZiBmb3JtIGVsZW1lbnRzIGFyZSBzdXBwbGllZCBidXQgRk9STSBhdXRoIG1ldGhvZCBpcyBub3QgdXNlZAotCQkJZWxzZSBpZiAoIWF1dGguZXF1YWxzKCJGT1JNIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCUZvcm1Mb2dpbkNvbmZpZyBjZmcgPSBsb2dpbkNvbmZpZy5nZXRGb3JtTG9naW5Db25maWcoKTsKLQkJCQlpZiAoY2ZnICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IGF1dGg7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lHTk9SRV9GT1JNX0xPR0lOLCBwYXJtcywgbG9naW5Db25maWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBsb2dpbkNvbmZpZyBzZWN0aW9uIGlzIGNvcnJlY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVudmlyb25tZW50RW50cmllcyhFTGlzdCBlbnZFbnRyaWVzKSB7Ci0JCWlmIChlbnZFbnRyaWVzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQkvLyBib29sZWFuIGlzVmVyc2lvbjIyID0gd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmlzVmVyc2lvbjJfMkRlc2NyaXB0b3IoKTsKLQkJSXRlcmF0b3IgZW50cmllcyA9IGVudkVudHJpZXMuaXRlcmF0b3IoKTsKLQkJSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCXdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkgewotCQkJRW52RW50cnkgZW50cnkgPSAoRW52RW50cnkpIGVudHJpZXMubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldFR5cGUoKS5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRU5WX0VOVFJZLCBudWxsLCBlbnRyeSk7Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGZvciBkdXBsaWNhdGUgZW52LWVudHJ5LW5hbWUncwotCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7IC8vIENoZWNrIGZvciBkdXBzCi0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfRW52X0VudHJ5X05hbWVfX184OCArICI6ICIgKyBuYW1lOwotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlksIHBhcm1zLCBlbnRyeSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVtZW1iZXIucHV0KG5hbWUsICJZZWEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzUvMjAwMSAxMjoxMToyMyBQTSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1pbWVNYXBwaW5nKCkgewotCi0JCWlmICh3ZWJERC5nZXRNaW1lTWFwcGluZ3MoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJSXRlcmF0b3IgbWltZXMgPSB3ZWJERC5nZXRNaW1lTWFwcGluZ3MoKS5pdGVyYXRvcigpOwotCQlIYXNodGFibGUgcmVtZW1iZXIgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJd2hpbGUgKG1pbWVzLmhhc05leHQoKSkgewotCQkJCi0JCQlpZiggX3JlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpewotCQkJCVN0cmluZyBtc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVEKTsJCQkKLQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlQ2FuY2VsU3RhdHVzKG1zZyk7CQkJCQotCQkJfQotCQkJTWltZU1hcHBpbmcgbWltZU1hcCA9IChNaW1lTWFwcGluZykgbWltZXMubmV4dCgpOwotCi0JCQlTdHJpbmcgZXh0ID0gbWltZU1hcC5nZXRFeHRlbnNpb24oKTsKLQkJCVN0cmluZyBtdHlwZSA9IG1pbWVNYXAuZ2V0TWltZVR5cGUoKTsKLQkJCWlmIChleHQgIT0gbnVsbCkKLQkJCQlleHQgPSBleHQudHJpbSgpOwotCQkJaWYgKG10eXBlICE9IG51bGwpCi0JCQkJbXR5cGUgPSBtdHlwZS50cmltKCk7Ci0KLQkJCWlmIChleHQgPT0gbnVsbCB8fCBleHQuZXF1YWxzKCIiKSB8fCBtdHlwZSA9PSBudWxsIHx8IG10eXBlLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCWlmIChleHQgPT0gbnVsbCB8fCBleHQudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfTWltZV9FeHRlbnNpb25fNTQ7Ci0JCQkJZWxzZQotCQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9NaW1lX1R5cGVfNTU7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLCBtaW1lTWFwKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChyZW1lbWJlci5nZXQoZXh0KSAhPSBudWxsKSB7IC8vIENoZWNrIGZvciBkdXBzCi0KLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfTWltZV9FeHRlbnNpb25fX181NiArICI6ICIgKyBleHQ7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcywgbWltZU1hcCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZW1lbWJlci5wdXQoZXh0LCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvNS8yMDAxIDExOjQ2OjU4IEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlT3RoZXIoKSB7Ci0KLQkJU2Vzc2lvbkNvbmZpZyBzZXNzaW9uQ2ZnID0gd2ViREQuZ2V0U2Vzc2lvbkNvbmZpZygpOwotCQlpZiAoc2Vzc2lvbkNmZyAhPSBudWxsKSB7Ci0JCQlpbnQgdGltZW91dCA9IHNlc3Npb25DZmcuZ2V0U2Vzc2lvblRpbWVvdXQoKTsKLQkJCWlmICh0aW1lb3V0ID09IDApIHsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TRVNTSU9OX1RJTUVPVVQsIG51bGwsIHNlc3Npb25DZmcpOwotCQkJfQotCQl9Ci0KLQotCi0JfQotCi0JLyoqCi0JICogdmFsaWRhdGVSZWZzKFdlYkFwcCkgLSB2YWxpZGF0ZSBFSkIgYW5kIHJlc291cmNlIHJlZmVyZW5jZXMgLSBkZXRhaWxzIHRiZAotCSAqLwotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVSZWZzKCkgewotCQlFTGlzdCBlamJSZWZzID0gd2ViREQuZ2V0RWpiUmVmcygpOwotCi0JCWlmICghZWpiUmVmcy5pc0VtcHR5KCkpCi0JCQl2YWxpZGF0ZUVKQlJlZnMoZWpiUmVmcyk7Ci0KLQotCQlFTGlzdCBlamJsb2NhbFJlZnMgPSB3ZWJERC5nZXRFamJMb2NhbFJlZnMoKTsKLQotCQlpZiAoIWVqYmxvY2FsUmVmcy5pc0VtcHR5KCkpCi0JCQl2YWxpZGF0ZUVKQkxvY2FsUmVmcyhlamJsb2NhbFJlZnMpOwotCi0KLQkJRUxpc3QgcmVzb3VyY2VSZWZzID0gd2ViREQuZ2V0UmVzb3VyY2VSZWZzKCk7Ci0KLQkJaWYgKCFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpKSB7Ci0JCQkvLyB2YWxpZGF0ZVJlc291cmNlUmVmcyhyZXNvdXJjZVJlZnMpOyAvLyB3ZSB3YW50IHRvIGRvIGFkZGl0aW9uYWwgY2hlY2tzIGhlcmUKLQotCQkJaW50IG51bVJlZnMgPSByZXNvdXJjZVJlZnMuc2l6ZSgpOwotCQkJU2V0IHJlZlNldCA9IG5ldyBIYXNoU2V0KG51bVJlZnMpOwotCQkJYm9vbGVhbiBpc1ZlcnNpb24yMiA9IHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEOwotCi0JCQlmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgbnVtUmVmczsgcmVmTm8rKykgewotCQkJCQotCQkJCWlmKCBfcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSApewotCQkJCQlTdHJpbmcgbXNnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCk7CQkJCi0JCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVDYW5jZWxTdGF0dXMobXNnKTsKLQkJCQl9Ci0JCQkJCi0JCQkJUmVzb3VyY2VSZWZJbXBsIHJlZiA9IChSZXNvdXJjZVJlZkltcGwpIChyZXNvdXJjZVJlZnMuZ2V0KHJlZk5vKSk7Ci0JCQkJU3RyaW5nIGF1dGggPSByZWYuZ2V0QXV0aCgpLmdldE5hbWUoKTsKLQotCQkJCS8vIENoZWNrOiBhIHJlcy1hdXRoIGVsZW1lbnQgY29udGFpbmluZyBDb250YWluZXIgb3IgQXBwbGljYXRpb24gbXVzdCBiZSBzdXBwbGllZAotCQkJCWlmIChhdXRoID09IG51bGwgfHwgIXJlZi5pc1NldEF1dGgoKSkgewotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gcmVmLmdldE5hbWUoKTsKLQkJCQkJU3RyaW5nIG1zZ0lkID0gaXNWZXJzaW9uMjIgPyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIyIDogTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMzsKLQkJCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBtc2dJZCwgcGFybXMsIHJlZik7Ci0JCQkJCQotCQkJCX0gZWxzZSBpZiAoaXNWZXJzaW9uMjIgJiYgYXV0aC5lcXVhbHMoIkFwcGxpY2F0aW9uIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gcmVmLmdldE5hbWUoKTsKLQkJCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjIsIHBhcm1zLCByZWYpOwotCQkJCX0gZWxzZSBpZiAoIWlzVmVyc2lvbjIyICYmIGF1dGguZXF1YWxzKCJTRVJWTEVUIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gcmVmLmdldE5hbWUoKTsKLQkJCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjMsIHBhcm1zLCByZWYpOwotCQkJCX0KLQotCQkJCS8vIHZhbGlkYXRlIHJlcy1zaGFyaW5nLXNjb3BlIGlzIGFsbG93YWJsZSB2YWx1ZQotCQkJCVN0cmluZyBzaGFyaW5nU2NvcGUgPSByZWYuZ2V0UmVzU2hhcmluZ1Njb3BlKCkuZ2V0TmFtZSgpOwotCQkJCWlmICghaXNWZXJzaW9uMjIpIHsKLQkJCQkJaWYgKHNoYXJpbmdTY29wZSA9PSBudWxsIHx8ICFyZWYuaXNTZXRSZXNTaGFyaW5nU2NvcGUoKSkgewotCQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzBdOwotCQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9SRVNfU0hBUklOR19TQ09QRSwgcGFybXMsIHJlZik7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlTdHJpbmcgcmVmTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gcmVmTmFtZTsKLQkJCQlpZiAoIShyZWZTZXQuYWRkKHJlZk5hbWUpKSl7Ci0JCQkJCWFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTUkVGLCBwYXJtcywgcmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy82LzIwMDEgNDoxMTowOSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gcm9sZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZWZpbmVSb2xlcwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkhhc2h0YWJsZQotCSAqIAotCSAqIFRoZSBhdXRoLWNvbnN0cmFpbnQgb25seSBuZWVkcyB0byBoYXZlIHJvbGUtbmFtZSBzcGVjaWZpZWQuIDxhdXRoLWNvbnN0cmFpbnQ+IDxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotCSAqIDxyb2xlLW5hbWU+Z3Vlc3Q8L3JvbGUtbmFtZT4gPC9hdXRoLWNvbnN0cmFpbnQ+Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdXRoU2VjUm9sZShTdHJpbmcgbGluaywgU3RyaW5nIHJvbGUsIEhhc2h0YWJsZSBkZWZpbmVkUm9sZXMsIEVPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCVN0cmluZyByTmFtZSA9IHJvbGU7Ci0JCVN0cmluZyBsTmFtZSA9IGxpbms7Ci0JCS8vIGJvb2xlYW4gdmFsaWRSb2xlID0gdHJ1ZTsKLQkJLy8gYm9vbGVhbiB2YWxpZExpbmsgPSB0cnVlOwotCi0JCWlmIChyTmFtZSAhPSBudWxsKQotCQkJck5hbWUgPSByTmFtZS50cmltKCk7Ci0JCWlmIChsTmFtZSAhPSBudWxsKQotCQkJbE5hbWUgPSBsTmFtZS50cmltKCk7Ci0KLQkJaWYgKHJOYW1lICE9IG51bGwpIHsKLQkJCWlmICghck5hbWUuZXF1YWxzKCIqIikgJiYgIXJOYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJCWlmIChkZWZpbmVkUm9sZXMuZ2V0KHJOYW1lKSA9PSBudWxsICYmIGRlZmluZWRSb2xlcy5nZXQobE5hbWUpID09IG51bGwpIHsKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IHJOYW1lOwotCQkJCQlhZGRFcnJvcihXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRV9OQU1FLCBwYXJtcywgdGFyZ2V0T2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy82LzIwMDEgNDoxMTowOSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gcm9sZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZWZpbmVSb2xlcwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkhhc2h0YWJsZQotCSAqIAotCSAqIAotCSAqIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBtdXN0IGhhdmUgYSBub24tbnVsbCByb2xlLW5hbWUgYW5kIHRoZSByb2xlLWxpbmsgbXVzdCBjb250YWluIHRoZSBuYW1lCi0JICogb2YgYSByb2xlIHNwZWNpZmllZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBzZWN0aW9uIDxzZWN1cml0eS1yb2xlLXJlZj4gPHJvbGUtbmFtZT5NeU5hbWU8L3JvbGUtbmFtZT4KLQkgKiA8cm9sZS1saW5rPkV4aXN0aW5nUm9sZTwvcm9sZS1saW5rPiA8L3NlY3VyaXR5LXJvbGUtcmVmPgotCSAqIAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2VjUm9sZShTdHJpbmcgbGluaywgU3RyaW5nIHJvbGUsIEhhc2h0YWJsZSBkZWZpbmVkUm9sZXMsIEVPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCVN0cmluZyByTmFtZSA9IHJvbGU7Ci0JCVN0cmluZyBsTmFtZSA9IGxpbms7Ci0JCS8vIGJvb2xlYW4gdmFsaWRSb2xlID0gdHJ1ZTsKLQkJLy8gYm9vbGVhbiB2YWxpZExpbmsgPSB0cnVlOwotCi0JCWlmIChyTmFtZSAhPSBudWxsKQotCQkJck5hbWUgPSByTmFtZS50cmltKCk7Ci0JCWlmIChsTmFtZSAhPSBudWxsKQotCQkJbE5hbWUgPSBsTmFtZS50cmltKCk7Ci0KLQotCQkvLyB0aGUgc2VjdXJpdHkgcm9sZS1uYW1lIGNhbm5vdCBiZSBudWxsCi0JCWlmICgock5hbWUgPT0gbnVsbCB8fCByTmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IHJOYW1lOwotCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEVfTkFNRSwgcGFybXMsIHRhcmdldE9iamVjdCk7Ci0JCX0KLQotCQlpZiAock5hbWUgPT0gbnVsbCB8fCAhck5hbWUuZXF1YWxzKCIqIikpIHsgLy8kTk9OLU5MUy0xJAkJCi0JCQkvLyBjaGVjayB0aGF0IHNlY3VyaXR5IHJvbGUtbGluayBtYXRjaGVzIGEgZGVmaW5lcyBzZWN1cml0eSByb2xlCi0JCQlpZiAobE5hbWUgIT0gbnVsbCAmJiBkZWZpbmVkUm9sZXMuZ2V0KGxOYW1lKSA9PSBudWxsKSB7Ci0KLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBsTmFtZTsKLQkJCQlhZGRFcnJvcihXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRSwgcGFybXMsIHRhcmdldE9iamVjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZVNlY3VyaXR5KFdlYkFwcCkgLSB2YWxpZGF0ZSBzZWN1cml0eSBjb25zdHJhaW50cywgcm9sZXMsIGFuZCBzZWN1cml0eSByb2xlIHJlZnMgLQotCSAqIGRldGFpbHMgdGJkCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlY3VyaXR5QW5kU2VydmxldHMoKSB7Ci0KLQotCQlFTGlzdCB3ZWJSb2xlcyA9IHdlYkRELmdldFNlY3VyaXR5Um9sZXMoKTsKLQotCQkvLyBWYWxpZGF0ZSBzZWN1cml0eSByb2xlcwotCQlIYXNodGFibGUgc2VjUm9sZXMgPSBnZXRBbmRWYWxpZGF0ZVNlY3VyaXR5Um9sZXMod2ViUm9sZXMpOwotCi0JCS8vIFZhbGlkYXRlIFNlcnZsZXRzL0pTUHMgYW5kIHRoZWlyIHJvbGUgcmVmLgotCQl2YWxpZGF0ZVNlcnZsZXRzKHdlYkRELmdldFNlcnZsZXRzKCksIHNlY1JvbGVzKTsKLQotCQl2YWxpZGF0ZVNlY3VyaXR5Q29uc3RyYWludHMod2ViREQuZ2V0Q29uc3RyYWludHMoKSwgc2VjUm9sZXMpOwotCi0JCS8vIHRyeSB7Ci0JCWlmICghKHdlYlJvbGVzLmlzRW1wdHkoKSkpIHsKLQkJCUVBUkZpbGUgbW9kdWxlID0gd2FyRmlsZS5nZXRFQVJGaWxlKCk7Ci0JCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCQlFTGlzdCBlYXJSb2xlTGlzdCA9IG1vZHVsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZXMoKTsKLQkJCQl2YWxpZGF0ZVdFQlJvbGVzV2l0aEVBUlJvbGVzKGVhclJvbGVMaXN0LCB3ZWJSb2xlcyk7Ci0JCQl9Ci0JCX0KLQkJLy8gfSBjYXRjaCAoVW5jb250YWluZWRNb2R1bGVGaWxlRXhjZXB0aW9uIHVlKSB7Ci0JCS8vIFN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJLy8gcGFybXNbMF0gPSB3YXJGaWxlLmdldE5hbWUoKTsKLQkJLy8gYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX1VOQ09OVEFJTkVEX01PRFVMRV9GSUxFX0VYQ0VQVElPTiwgcGFybXMpOwotCQkvLyB9Ci0JfQotCi0JLyoqCi0JICogVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlCi0JICogd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zIDwhRUxFTUVOVCBzZWN1cml0eS1jb25zdHJhaW50ICh3ZWItcmVzb3VyY2UtY29sbGVjdGlvbissCi0JICogYXV0aC1jb25zdHJhaW50PywgdXNlci1kYXRhLWNvbnN0cmFpbnQ/KT4KLQkgKiAKLQkgKiBAcGFyYW0gY29uc3RyYWludHMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlU2VjdXJpdHlDb25zdHJhaW50cyhFTGlzdCBjb25zdHJhaW50cywgSGFzaHRhYmxlIHNlY1JvbGVzKSB7Ci0KLQkJaWYgKGNvbnN0cmFpbnRzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciBjb25zdExpc3QgPSBjb25zdHJhaW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoY29uc3RMaXN0Lmhhc05leHQoKSkgewotCQkJCi0JCQlpZiggX3JlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgKXsKLQkJCQlTdHJpbmcgbXNnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCk7CQkJCi0JCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUNhbmNlbFN0YXR1cyhtc2cpOwotCQkJfQotCQkJCi0JCQlTZWN1cml0eUNvbnN0cmFpbnQgY29uc3RyYWludCA9IChTZWN1cml0eUNvbnN0cmFpbnQpIGNvbnN0TGlzdC5uZXh0KCk7Ci0KLQkJCUVMaXN0IHdlYlJlc291cmNlTGlzdCA9IGNvbnN0cmFpbnQuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpOwotCQkJaWYgKHdlYlJlc291cmNlTGlzdCA9PSBudWxsIHx8IHdlYlJlc291cmNlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfV2ViX1Jlc291cmNlX0NvbGxlY3Rpb25fNjQ7Ci0JCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcywgY29uc3RyYWludCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl2YWxpZGF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbnMod2ViUmVzb3VyY2VMaXN0KTsKLQotCQkJQXV0aENvbnN0cmFpbnQgYXV0aENvbnN0cmFpbnQgPSBjb25zdHJhaW50LmdldEF1dGhDb25zdHJhaW50KCk7Ci0JCQlpZiAoYXV0aENvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQl2YWxpZGF0ZUF1dGhDb25zdHJhaW50KGF1dGhDb25zdHJhaW50LCBzZWNSb2xlcyk7Ci0KLQkJCVVzZXJEYXRhQ29uc3RyYWludCBkYXRhQ29uc3RyYWludCA9IGNvbnN0cmFpbnQuZ2V0VXNlckRhdGFDb25zdHJhaW50KCk7Ci0JCQlpZiAoZGF0YUNvbnN0cmFpbnQgIT0gbnVsbCAmJiBkYXRhQ29uc3RyYWludC5nZXRUcmFuc3BvcnRHdWFyYW50ZWUoKSAhPSBudWxsKSB7Ci0JCQkJLy8gPCFFTEVNRU5UIHVzZXItZGF0YS1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHRyYW5zcG9ydC1ndWFyYW50ZWUpPgotCQkJCS8vIFRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24KLQkJCQkvLyBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IKLQkJCQkvLyBDT05GSURFTlRJQUwuCi0KLQkJCQkvLyBFRW51bUxpdGVyYWwgdHJhbnNwb3J0ID0gZGF0YUNvbnN0cmFpbnQuZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0JCQkJVHJhbnNwb3J0R3VhcmFudGVlVHlwZSB0cmFuc3BvcnQgPSBkYXRhQ29uc3RyYWludC5nZXRUcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQkJCQlpZiAodHJhbnNwb3J0ID09IG51bGwgfHwgIWRhdGFDb25zdHJhaW50LmlzU2V0VHJhbnNwb3J0R3VhcmFudGVlKCkpIHsKLQkJCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVFJBTlNQT1JULCBuZXcgU3RyaW5nWzBdLCBkYXRhQ29uc3RyYWludCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaWx0ZXJzKEVMaXN0IGZpbHRlckxpc3QpIHsKLQkJaWYgKGZpbHRlckxpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCUl0ZXJhdG9yIGZpbHRlcnMgPSBmaWx0ZXJMaXN0Lml0ZXJhdG9yKCk7Ci0KLQkJSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCXdoaWxlIChmaWx0ZXJzLmhhc05leHQoKSkgewotCQkJCi0JCQlpZiggX3JlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgKXsKLQkJCQlTdHJpbmcgbXNnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCk7CQkJCi0JCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUNhbmNlbFN0YXR1cyhtc2cpOwotCQkJfQotCQkJCi0JCQlGaWx0ZXIgbmV4dEZpbHRlciA9IChGaWx0ZXIpIGZpbHRlcnMubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBuZXh0RmlsdGVyLmdldE5hbWUoKTsKLQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCi0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX0ZpbHRlcl9OYW1lXzY2OwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcywgbmV4dEZpbHRlcik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAocmVtZW1iZXIuZ2V0KG5hbWUpICE9IG51bGwpIHsgLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBuYW1lOwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9GSUxURVIsIHBhcm1zLCBuZXh0RmlsdGVyKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlbWVtYmVyLnB1dChuYW1lLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlRmlsdGVyTWFwcGluZ3MoRWxpc3QoRmlsdGVycydzKSkgLSBmb3IgZWFjaCBmaWx0ZXIgbWFwcGluZywgbWFrZSBzdXJlIHRoZSBuYW1lZAotCSAqIGZpbHRlciBleGlzdHMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbHRlck1hcHBpbmdzKEVMaXN0IGZpbHRlck1hcHBpbmdzTGlzdCkgewotCi0JCWlmIChmaWx0ZXJNYXBwaW5nc0xpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCUl0ZXJhdG9yIGZpbHRlck1hcHBpbmdzID0gZmlsdGVyTWFwcGluZ3NMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChmaWx0ZXJNYXBwaW5ncy5oYXNOZXh0KCkpIHsKLQkJCUZpbHRlck1hcHBpbmcgbmV4dE1hcHBpbmcgPSAoRmlsdGVyTWFwcGluZykgZmlsdGVyTWFwcGluZ3MubmV4dCgpOwotCi0JCQkvLyBNYXBwaW5nIGNhbiBiZSBlaXRoZXIgc2VydmxldCBvciB1cmwKLQkJCWlmIChuZXh0TWFwcGluZy5nZXRVcmxQYXR0ZXJuKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlTdHJpbmcgdXJsID0gbmV4dE1hcHBpbmcuZ2V0VXJsUGF0dGVybigpOwotCQkJCXBhcm1zWzBdID0gdXJsOwotCQkJCWlmICh1cmwgPT0gbnVsbCkgewotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTCwgcGFybXMsIG5leHRNYXBwaW5nKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChuZXh0TWFwcGluZy5nZXRGaWx0ZXIoKSA9PSBudWxsIHx8IG5leHRNYXBwaW5nLmdldEZpbHRlcigpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fRklMVEVSX01BUFBJTkcsIHBhcm1zLCBuZXh0TWFwcGluZyk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCS8vIElzIGlzIGEgdmFsaWQgVVJJIG5vdGF0aW9uID8KLQkJCQl0cnkgewotCQkJCQlpZiAodXJsLmVxdWFscygiIikpCi0JCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuSW52YWxpZF9VUkxfNzApOwotCQkJCQkvLyBZb3UgY2FuJ3QgdXNlIGNvbS5pYm0ud2VidG9vbHMuVVJJIGhlcmUuLi4KLQkJCQkJLy8gY29tLmlibS5pd3Qud2VidG9vbHMuVVJJIHVyaSA9IG5ldyBjb20uaWJtLml3dC53ZWJ0b29scy5VUkkodXJsKSA7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IG5leHRNYXBwaW5nLmdldFVybFBhdHRlcm4oKTsKLQkJCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVVJMLCBwYXJtcywgbmV4dE1hcHBpbmcpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG5leHRNYXBwaW5nLmdldFNlcnZsZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlTdHJpbmcgc2VydmxldE5hbWUgPSBuZXh0TWFwcGluZy5nZXRTZXJ2bGV0TmFtZSgpOwotCQkJCXBhcm1zWzBdID0gc2VydmxldE5hbWU7Ci0JCQkJaWYgKG5leHRNYXBwaW5nLmdldFNlcnZsZXQoKSA9PSBudWxsKSB7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9TRVJWTEVUX01BUFBJTkcsIHBhcm1zLCBuZXh0TWFwcGluZyk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAobmV4dE1hcHBpbmcuZ2V0RmlsdGVyKCkgPT0gbnVsbCB8fCBuZXh0TWFwcGluZy5nZXRGaWx0ZXIoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX0ZJTFRFUl9NQVBQSU5HLCBwYXJtcywgbmV4dE1hcHBpbmcpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBlbHNlIHsKLQkJCS8vIC8vIG90aGVyd2lzZSBuZWl0aGVyIHNlcnZsZXQtbmFtZSBvciB1cmwtbWFwcGluZyBpcyBkZWZpbmVkIC0gdGhpcyBnZXRzIGZsYWdnZWQgYnkKLQkJCS8vIHRoZSB4bWwgdmFsaWRhdG9yCi0JCQkvLyAvLyBhcyB0aGlzIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIERURAotCQkJLy8JCQotCQkJLy8gfQotCi0KLQkJfQotCi0JfQotCi0KLQotCS8qKgotCSAqIHZhbGlkYXRlU2VydmxldHMoRWxpc3QoU2VydmxldCdzKSkgLSBmb3IgZWFjaCBzZXJ2bGV0IG1hcHBpbmcsIG1ha2Ugc3VyZSB0aGUgbmFtZWQgc2VydmxldAotCSAqIGV4aXN0cwotCSAqLwotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZXJ2bGV0TWFwcGluZ3MoRUxpc3Qgc2VydmxldE1hcHBpbmdzTGlzdCkgewotCi0JCWlmIChzZXJ2bGV0TWFwcGluZ3NMaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciBzZXJ2bGV0TWFwcGluZ3MgPSBzZXJ2bGV0TWFwcGluZ3NMaXN0Lml0ZXJhdG9yKCk7Ci0KLQkJSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCQl3aGlsZSAoc2VydmxldE1hcHBpbmdzLmhhc05leHQoKSkgewotCQkJaWYoIF9yZXBvcnRlci5pc0NhbmNlbGxlZCgpICl7Ci0JCQkJU3RyaW5nIG1zZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQpOwkJCQotCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVDYW5jZWxTdGF0dXMobXNnKTsKLQkJCX0KLQkJCQotCQkJU2VydmxldE1hcHBpbmcgbmV4dE1hcHBpbmcgPSAoU2VydmxldE1hcHBpbmcpIHNlcnZsZXRNYXBwaW5ncy5uZXh0KCk7Ci0JCQlTdHJpbmcgdXJsID0gbmV4dE1hcHBpbmcuZ2V0VXJsUGF0dGVybigpOwotCi0JCQkvLyBDaGVjayBmb3IgbnVsbCBzZXJ2bGV0LCBpZiB0aGUgbmFtZSBpcyByaWdodCB0aGUgcmVmbGVjdGlvbgotCQkJLy8gaGFzIGFscmVhZHkgcmVzb2x2ZWQgaXQuCi0KLQkJCWlmICh1cmwgIT0gbnVsbCkgeyAvLyBjaGVjayBmb3IgZHVwbGljYXRlIGZpcnN0LCBubyBuZWVkIHRvIHJlcGVhdCBlYXJsaWVyIGVycm9yLAotCQkJCXVybCA9IHVybC50cmltKCk7Ci0JCQkJaWYgKHJlbWVtYmVyLmdldCh1cmwpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IG5leHRNYXBwaW5nLmdldFVybFBhdHRlcm4oKTsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX01BUFBJTkcsIHBhcm1zLCBuZXh0TWFwcGluZyk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlyZW1lbWJlci5wdXQobmV4dE1hcHBpbmcuZ2V0VXJsUGF0dGVybigpLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCi0JCQlpZiAodXJsID09IG51bGwgfHwgbmV4dE1hcHBpbmcuZ2V0U2VydmxldCgpID09IG51bGwgfHwgbmV4dE1hcHBpbmcuZ2V0U2VydmxldCgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IHVybDsKLQkJCQlpZiAodXJsID09IG51bGwpCi0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVVJMLCBwYXJtcywgbmV4dE1hcHBpbmcpOwotCQkJCWVsc2UKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX1NFUlZMRVRfTUFQUElORywgcGFybXMsIG5leHRNYXBwaW5nKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gSXMgaXMgYSB2YWxpZCBVUkkgbm90YXRpb24gPwotCQkJdHJ5IHsKLQkJCQlpZiAodXJsLmVxdWFscygiIikpCi0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5JbnZhbGlkX1VSTF83NSk7Ci0KLQkJCQkvLwotCQkJCS8vIFRoZSBzcGVjIGRvZXMgbm90IHByb2hpYml0IHdoaXRlc3BhY2UgaW4gdGhlIHVybC1wYXR0ZXJucwotCQkJCS8vCSAgIAotCQkJCS8vIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgVVJMLSBoYXMgbm8gd2hpdGUgc3BhY2UKLQkJCQkvLyBjaGFyW10gY2hhcnMgPSB1cmwudG9DaGFyQXJyYXkoKTsKLQkJCQkvLyBpbnQgbGVuID0gY2hhcnMubGVuZ3RoOwotCQkJCS8vIGZvciAoaW50IGNudCA9IDA7IGNudCA8IGNoYXJzLmxlbmd0aDsgY250KyspCi0JCQkJLy8gewotCQkJCS8vIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYXJzW2NudF0pKQotCQkJCS8vIHRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgVVJMIikgOwotCQkJCS8vIH0KLQkJCQkvLyBZb3UgY2FuJ3QgdXNlIGNvbS5pYm0ud2VidG9vbHMuVVJJIGhlcmUuLi4KLQkJCQkvLyBjb20uaWJtLml3dC53ZWJ0b29scy5VUkkgdXJpID0gbmV3IGNvbS5pYm0uaXd0LndlYnRvb2xzLlVSSSh1cmwpIDsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gbmV4dE1hcHBpbmcuZ2V0VXJsUGF0dGVybigpOwotCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTCwgcGFybXMsIG5leHRNYXBwaW5nKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogdmFsaWRhdGVTZXJ2bGV0cyhFbGlzdChTZXJ2bGV0J3MpKSAtIGlmIGl0J3MgYSBKU1AsIHZlcmlmeSB0aGUgZmlsZSBleGlzdHMgLSB2YWxpZGF0ZQotCSAqIG9wdGlvbmFsIHNlY3VyaXR5IHJvbGUgcmVmcyBmb3IgZXhpc3RlbmNlIG9mIHRoZSBzZWN1cml0eSByb2xlCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlcnZsZXRzKEVMaXN0IHNlcnZsZXRMaXN0LCBIYXNodGFibGUgc2VjUm9sZXMpIHsKLQkJaWYgKHNlcnZsZXRMaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciBzZXJ2bGV0cyA9IHNlcnZsZXRMaXN0Lml0ZXJhdG9yKCk7Ci0KLQkJSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCXdoaWxlIChzZXJ2bGV0cy5oYXNOZXh0KCkpIHsKLQkJCWlmKCBfcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSApewotCQkJCVN0cmluZyBtc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVEKTsJCQkKLQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlQ2FuY2VsU3RhdHVzKG1zZyk7Ci0JCQl9Ci0JCQkKLQkJCVNlcnZsZXQgbmV4dFNlcnZsZXQgPSAoU2VydmxldCkgc2VydmxldHMubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBuZXh0U2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQluYW1lID0gbmFtZS50cmltKCk7Ci0KLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfU2VydmxldF9OYW1lXzc3OwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcywgbmV4dFNlcnZsZXQpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7IC8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gbmFtZTsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfU0VSVkxFVCwgcGFybXMsIG5leHRTZXJ2bGV0KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlbWVtYmVyLnB1dChuYW1lLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gVmFsaWRhdGUgc2VydmxldCByb2xlcwotCQkJRUxpc3Qgcm9sZXNMaXN0ID0gbmV4dFNlcnZsZXQuZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQkJaWYgKCFyb2xlc0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJSXRlcmF0b3Igcm9sZXMgPSByb2xlc0xpc3QuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAocm9sZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCVNlY3VyaXR5Um9sZVJlZiByb2xlID0gKFNlY3VyaXR5Um9sZVJlZikgcm9sZXMubmV4dCgpOwotCQkJCQl2YWxpZGF0ZVNlY1JvbGUocm9sZS5nZXRMaW5rKCksIHJvbGUuZ2V0TmFtZSgpLCBzZWNSb2xlcywgcm9sZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBpZiBpdCdzIGEgSlNQLCB0aGUganNwLWZpbGUgYXR0cmlidXRlIE1VU1QgYmUgYSBmdWxsLXBhdGgsIGFjY29yZGluZyB0byB0aGUgc2VydmxldAotCQkJLy8gMi4yIHNwZWMKLQkJCWlmIChuZXh0U2VydmxldC5nZXRXZWJUeXBlKCkgIT0gbnVsbCAmJiBuZXh0U2VydmxldC5nZXRXZWJUeXBlKCkuaXNKc3BUeXBlKCkpIHsKLQkJCQlKU1BUeXBlIGpzcFR5cGUgPSAoSlNQVHlwZSkgKG5leHRTZXJ2bGV0LmdldFdlYlR5cGUoKSk7Ci0KLQkJCQlTdHJpbmcganNwRmlsZU5hbWUgPSBqc3BUeXBlLmdldEpzcEZpbGUoKTsKLQkJCQlpZiAoanNwRmlsZU5hbWUgPT0gbnVsbCB8fCAhKGpzcEZpbGVOYW1lLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzJdOwotCQkJCQlwYXJtc1swXSA9IGpzcEZpbGVOYW1lOwotCQkJCQlwYXJtc1sxXSA9IG5hbWU7Ci0JCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0pTUEZJTEVfUkVGLCBwYXJtcywgbmV4dFNlcnZsZXQpOwotCQkJCX0KLQkJCX0KLQotCQkJLyogTm8gbmVlZCB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBKU1BzIG9yIFNlcnZsZXRzLiB0aGUgTGlua0J1aWxkZXIgd2lsbCBkbyB0aGlzICovCi0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlVGFnTGlicygpIHsKLQotCQlpZiAod2ViREQuZ2V0VGFnTGlicygpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciB0YWdzID0gd2ViREQuZ2V0VGFnTGlicygpLml0ZXJhdG9yKCk7Ci0JCUhhc2h0YWJsZSByZW1lbWJlciA9IG5ldyBIYXNodGFibGUoKTsKLQotCQl3aGlsZSAodGFncy5oYXNOZXh0KCkpIHsKLQotCQkJaWYoIF9yZXBvcnRlci5pc0NhbmNlbGxlZCgpICl7Ci0JCQkJU3RyaW5nIG1zZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQpOwkJCQotCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVDYW5jZWxTdGF0dXMobXNnKTsKLQkJCX0KLQkJCQotCQkJVGFnTGliUmVmIHRhZ2xpYiA9IChUYWdMaWJSZWYpIHRhZ3MubmV4dCgpOyAvLyBDbGFzc0Nhc3RFeGNlcHRpb24gYXQgcnVudGltZQotCQkJU3RyaW5nIHVyaSA9IHRhZ2xpYi5nZXRUYWdsaWJVUkkoKTsKLQotCQkJaWYgKHVyaSAhPSBudWxsKQotCQkJCXVyaSA9IHVyaS50cmltKCk7Ci0KLQkJCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1RhZ2xpYl84MDsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIHRhZ2xpYik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAocmVtZW1iZXIuZ2V0KHVyaSkgIT0gbnVsbCkgeyAvLyBDaGVjayBmb3IgZHVwcwotCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1RhZ0xpYl9fXzgxICsgIjogIiArIHVyaTsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlksIHBhcm1zLCB0YWdsaWIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmVtZW1iZXIucHV0KHVyaSwgIlllYSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbnMoRUxpc3Qgd2ViUmVzb3VyY2VMaXN0KSB7Ci0KLQotCQlJdGVyYXRvciByZXNvdXJjZUxpc3QgPSB3ZWJSZXNvdXJjZUxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHJlc291cmNlTGlzdC5oYXNOZXh0KCkpIHsgLy8gQ2hlY2sgdGhlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucwotCQkJV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHJlc291cmNlID0gKFdlYlJlc291cmNlQ29sbGVjdGlvbikgcmVzb3VyY2VMaXN0Lm5leHQoKTsKLQotCQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXRXZWJSZXNvdXJjZU5hbWUoKTsKLQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscygiIikpIHsgLy8gc2hvdWxkIGhhdmUgYSBuYW1lIC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfV2ViX1Jlc291cmNlX05hbWVfODQ7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLCByZXNvdXJjZSk7Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIHRoYXQgdGhlIGh0dHAgbWV0aG9kcywgaWYgYW55IGlzIGNvcnJlY3QKLQkJCUVMaXN0IGh0dHBMaXN0ID0gcmVzb3VyY2UuZ2V0SFRUUHMoKTsKLQkJCWlmICghaHR0cExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJSXRlcmF0b3IgaHR0cHMgPSBodHRwTGlzdC5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChodHRwcy5oYXNOZXh0KCkpIHsKLQkJCQkJSFRUUE1ldGhvZFR5cGUgaHR0cE1ldGhvZCA9IChIVFRQTWV0aG9kVHlwZSkgaHR0cHMubmV4dCgpOwotCQkJCQlTdHJpbmcgbWV0aG9kID0gaHR0cE1ldGhvZC5nZXRIdHRwTWV0aG9kKCk7Ci0KLQkJCQkJaWYgKG1ldGhvZCA9PSBudWxsIHx8ICFpc0h0dHBNZXRob2QobWV0aG9kKSkgewotCQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQkJcGFybXNbMF0gPSBtZXRob2Q7Ci0JCQkJCQlhZGRFcnJvcihXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9IVFRQX0NNRCwgcGFybXMsIGh0dHBNZXRob2QpOwotCQkJCQl9Ci0KLQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCkgLSB3YWxrIHRocm91Z2ggdGhlIGZpbGVzIGFuZCB2ZXJpZnkgdGhleSBleGlzdAotCSAqLwotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVXZWxjb21lRmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IGZpbGVMaXN0KSB7Ci0JCWlmIChmaWxlTGlzdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUl0ZXJhdG9yIGZpbGVzID0gZmlsZUxpc3QuZ2V0RmlsZSgpLml0ZXJhdG9yKCk7Ci0KLQkJSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCQl3aGlsZSAoZmlsZXMuaGFzTmV4dCgpKSB7Ci0JCQkKLQkJCWlmKCBfcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSApewotCQkJCVN0cmluZyBtc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVEKTsJCQkKLQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlQ2FuY2VsU3RhdHVzKG1zZyk7Ci0JCQl9Ci0JCQkKLQkJCVdlbGNvbWVGaWxlIG5leHRGaWxlID0gKFdlbGNvbWVGaWxlKSBmaWxlcy5uZXh0KCk7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBuZXh0RmlsZS5nZXRXZWxjb21lRmlsZSgpOwotCi0JCQlpZiAoKGZpbGVOYW1lID09IG51bGwpIHx8IChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1swXTsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9OT19XRUxDT01FX0ZJTEUsIHBhcm1zLCBuZXh0RmlsZSk7Ci0JCQl9IGVsc2UgaWYgKChmaWxlTmFtZS5zdGFydHNXaXRoKCIvIikpIHx8IChmaWxlTmFtZS5lbmRzV2l0aCgiLyIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMF07Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9XRUxDT01FX0ZJTEUsIHBhcm1zLCBuZXh0RmlsZSk7Ci0JCQl9Ci0JCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnRyaW0oKTsKLQkJCWlmIChyZW1lbWJlci5nZXQoZmlsZU5hbWUpICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfV2VsY29tZV9GaWxlX05hbWVfXzg3ICsgIjogIiArIGZpbGVOYW1lOwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWSwgcGFybXMsIG5leHRGaWxlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlbWVtYmVyLnB1dChmaWxlTmFtZSwgIlllYSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpIHsKLQkJX2hlbHBlciA9IGhlbHBlcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXdhckZpbGUgPSBudWxsOwotCQl3ZWJERCA9IG51bGw7Ci0JCWh0dHBNZXRob2RzID0gbnVsbDsKLQkJc3VwZXIuY2xlYW51cCggcmVwb3J0ZXIgKTsKLQl9CQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vcmFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9yYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOGNjYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9yYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXz1JV0FFMDA1NEUgRG9jdW1lbnQgdHlwZSB2ZXJzaW9uICJ7MH0iIGZvciByYXIueG1sIGluIHByb2plY3QgInsxfSIgbmVlZHMgdG8gYmUgdmVyc2lvbiAiezJ9Ii4KLUVSUk9SX0lOVkFMSURfQ09OTkVDVE9SX0ZJTEU9IkludmFsaWQgUkFSIEZpbGUiLgotRVJST1JfQ09OTkVDVE9SX1ZBTElEQVRJT05fRkFJTEVEPSJSQVIgVmFsaWRhdGlvbiBmYWlsZWQiLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi93YXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5NWFiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNUaGlzIHByb3BlcnRpZXMgZmlsZSBob2xkIGFsbCB0aGUgZXh0ZXJuYWxpc2VkIHN0cmluZ3MgZm9yIGVUb29scyBXQVIgVmFsaWRhdGlvbiBwcm9qZWN0Ci0jIFZhbGlkYXRpb24gcHJvamVjdAotIwotIyBNZXNzYWdlcyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgYXQ6Ci0jICAgICBodHRwOi8vaGFueS5hdXN0aW4uaWJtLmNvbS9tZXNzYWdlcy9pbmRleC5odG1sCi0jCi0jIEJyaWVmbHk6Ci0jICAgICBNRVNTQUdFX0lEPTxDb21wb25lbnRQcmVmaXg+PE1lc3NhZ2VOdW1iZXI+PFR5cGVDb2RlPjogPE1lc3NhZ2VUZXh0PgotIwotIyBUaGUgcHJlZml4IGZvciB0aGlzIGNvbXBvbmVudCBpczoKLSMgICAgIENIS0ogKElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbikKLSMKLSMgTm90ZSB0aGUgIjogIiB0aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgdHlwZSBjb2RlIGFuZCB0aGUgbWVzc2FnZSB0ZXh0LgotIwotIyA6QmVnaW46IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkJlZ2luOgotI0NPTVBPTkVOVFBSRUZJWCBDSEtKCi0jQ09NUE9ORU5UTkFNRUZPUiBDSEtKIElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbgotI0NNVkNQQVRITkFNRSBuY2Yvc3JjL2phdmEvY29tL2libS93ZWJzcGhlcmUvdmFsaWRhdGlvbi93YXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKLSMgOkVuZDogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6RW5kOgotIwotCi0jIDItSnVseS0yMDAxOgotIyAgVGhpcyBmaWxlIGhhcyBiZWVuIHRlc3RlZCB1c2luZyB0aGUgUHJvY2Vzc01zZ0ZpbGUgdG9vbCwgd3JpdHRlbiBieQotIyAgSGFueSBTYWxlbSBhbmQgb3duZWQgYnkgRGVubmlzIEhlYmVydC4gIEFueSBmdXR1cmUgY2hhbmdlcyBzaG91bGQKLSMgIGFsc28gYmUgdmVyaWZpZWQgdXNpbmcgdGhpcyB0b29sLiAgUGxlYXNlIGNvbnRhY3QgRGVubmlzCi0jICAoaGViZXJ0QHVzLmlibS5jb20gb3IgVC9MIDU0My0yNTIwKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfV0FSX1ZBTElEQVRJT05fRkFJTEVEPUNIS0ozMDAwRTogV0FSIFZhbGlkYXRpb24gRmFpbGVkOiB7MH0KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUz1DSEtKMTAwMkU6IER1cGxpY2F0ZSBzZWN1cml0eSByb2xlIG5hbWVkIHswfS4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19KU1A9Q0hLSjMwMDFFOiBUaGUgSlNQIGZpbGUsIHswfSwgZm9yIHRoZSBzZXJ2bGV0IFwiezF9XCIgaXMgbWlzc2luZy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TTUFMTF9JQ09OPUNIS0ozMDAyRTogVGhlIDxzbWFsbC1pY29uPiBmaWxlLCB7MH0sIGlzIG1pc3NpbmcuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTEFSR0VfSUNPTj1DSEtKMzAwM0U6IFRoZSA8bGFyZ2UtaWNvbj4gZmlsZSwgezB9LCBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9TRVJWTEVUX01BUFBJTkc9Q0hLSjMwMDRXOiBUaGUgc2VydmxldCBtYXBwaW5nIFwiezB9XCIgcmVmZXJzIHRvIGEgc2VydmxldCB0aGF0IGlzIG5vdCBkZWZpbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX05PX1dFTENPTUVfRklMRT1DSEtKMzAwNUU6IEVtcHR5IHdlbGNvbWUgZmlsZSBsaXN0IGVudHJ5LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0VMQ09NRV9GSUxFPUNIS0ozMDA2RTogV2VsY29tZSBmaWxlIHswfSBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfVExEPUNIS0ozMDA3RTogVGhlIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IgRmlsZSwgezB9LCBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9JTlZBTElEX1dBUl9GSUxFPUNIS0ozMDA4RTogTWlzc2luZyBvciBpbnZhbGlkIFdBUiBmaWxlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9GSUxURVJfTUFQUElORz1DSEtKMzAwOUU6IFRoZSBmaWx0ZXIgbWFwcGluZyBcInswfVwiIHJlZmVycyB0byBhIGZpbHRlciB0aGF0IGlzIG5vdCBkZWZpbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfV0VMQ09NRV9GSUxFPUNIS0ozMDEwVzogV2VsY29tZSBGaWxlcyBjYW5ub3QgYmVnaW4gb3IgZW5kIHdpdGggYSAvLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfUEFSU0VfTElORUNPTD1DSEtKMTAwOUU6IFBhcnNpbmcgRXJyb3I6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSX0REX1BBUlNFX0xJTkU9Q0hLSjEwMTBFOiBEZXBsb3ltZW50IERlc2NyaXB0b3IgUGFyc2luZyBlcnJvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSX0REX1BBUlNFX05PSU5GTz1DSEtKMTAxMUU6IERlcGxveW1lbnQgRGVzY3JpcHRvciBQYXJzaW5nIGVycm9yLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfQ0FOTk9UX09QRU5fREQ9Q0hLSjEwMTJFOiBDYW5ub3Qgb3BlbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBWYWxpZGF0aW9uIGNhbm5vdCBjb21wbGV0ZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTD1DSEtKMzAxM0U6IFRoZSBVUkwgTWFwcGluZyBcInswfVwiIGlzIGludmFsaWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRT1DSEtKMzAxNEU6IEludmFsaWQgU2VjdXJpdHkgcm9sZS1saW5rOiB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9IVFRQX0NNRD1DSEtKMzAxNUU6IEludmFsaWQgSFRUUCBtZXRob2Q6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1RSQU5TUE9SVD1DSEtKMzAxNkU6IEludmFsaWQgVHJhbnNwb3J0IEd1cmFyYW50ZWUuICBWYWxpZCB2YWx1ZXMgYXJlIFwiTk9ORVwiLCBcIklOVEVHUkFMXCIsIG9yIFwiQ09ORklERU5USUFMXCIuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9KU1BGSUxFX1JFRj1DSEtKMzAxOEU6IFRoZSBqc3AtZmlsZSBcInswfVwiIHJlZmVyZW5jZWQgYnkgc2VydmxldCB7MX0gbXVzdCBiZSBhIGZ1bGwgYWJzb2x1dGUgcGF0aC4KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfSU5WQUxJRF9DT05URVhUX1JPT1Q9Q0hLSjMwMTdFOiBXZWIgUHJvamVjdDogezB9IGlzIG1hcHBlZCB0byBhbiBpbnZhbGlkIENvbnRleHQgcm9vdDogezF9IGluIEVBUiBQcm9qZWN0OiB7Mn0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9QQUdFPUlXQUUwMDAxRSBDSEtKMzAxOUU6IFRoZSBMb2NhdGlvbiBvZiB0aGUgRXJyb3IgUGFnZSBNdXN0IEJlZ2luIHdpdGggYSAvLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEVfTkFNRT1DSEtKMzAyMEU6IEludmFsaWQgU2VjdXJpdHkgcm9sZS1uYW1lOiB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9BVVRIX01FVEhPRD1DSEtKMzAyMUU6IEludmFsaWQgYXV0aCBtZXRob2QuICBWYWxpZCB2YWx1ZXMgYXJlOiBcIkJBU0lDXCIsIFwiRElHRVNUXCIsIFwiRk9STVwiLCBvciBcIkNMSUVOVC1DRVJUXCIuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSUdOT1JFX0ZPUk1fTE9HSU49Q0hLSjMwMjJFOiAgQXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHswfS4gIFRoZSBmb3JtLWxvZ2luLWNvbmZpZyB2YWx1ZXMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB1c2luZyBGT1JNIGF1dGhlbnRpY2F0aW9uIG1ldGhvZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMj1DSEtKMzAyM0U6ICBSZXNvdXJjZSByZWYgezB9IG11c3QgY29udGFpbiByZXMtYXV0aCBvZiAiU0VSVkxFVCIgb3IgIkNPTlRBSU5FUiIuCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIzPUNIS0ozMDI0RTogIFJlc291cmNlIHJlZiB7MH0gbXVzdCBjb250YWluIHJlcy1hdXRoIG9mICJBcHBsaWNhdGlvbiIgb3IgIkNvbnRhaW5lciIuCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjI9Q0hLSjMwMjVFOiAgXCJBcHBsaWNhdGlvblwiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvci5yZXMtYXV0aCBpbiBhIDIuMiBsZXZlbCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBVc2UgXCJTRVJWTEVUXCIgaW5zdGVhZC4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMz1DSEtKMzAyNkU6ICBcIlNFUlZMRVRcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IucmVzLWF1dGggaW4gYSAyLjIgbGV2ZWwgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVXNlIFwiQXBwbGljYXRpb25cIiBpbnN0ZWFkLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVhDRVBUSU9OX1RZUEU9Q0hLSjMwMjdFOiAgSW52YWxpZCBFeGNlcHRpb24gVHlwZSB7MH0uICBUaGUgZXhjZXB0aW9uIHR5cGUgbXVzdCBjb250YWluIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfTUFQUElORz1DSEtKNDAxMFc6IER1cGxpY2F0ZSBVUkwgbWFwcGluZyB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX1NFUlZMRVQ9Q0hLSjQwMTFXOiBEdXBsaWNhdGUgU2VydmxldCBFbnRyeSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU0VTU0lPTl9USU1FT1VUPUNIS0o0MDEyVzogU2Vzc2lvbiBUaW1lb3V0IGlzIG5vdCB2YWxpZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlk9Q0hLSjQwMTNXOiBEdXBsaWNhdGUgRW50cnkgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZPUNIS0o0MDE0VzogRW1wdHkgRW50cnkgezB9LgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9GSUxURVI9Q0hLSjQwMTVXOiBEdXBsaWNhdGUgRmlsdGVyIEVudHJ5IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRUpCX1JFRj1DSEtKNDAxNlc6IER1cGxpY2F0ZSBlamItcmVmIGVsZW1lbnQgbmFtZWQgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIFRoaXMgd2FzIG1pc3NpbmcuICBJdCdzIGRlZmluZWQgaW4gY29uc3RhbnRzLi4uCi1FUlJPUl9FQVJfVU5DT05UQUlORURfTU9EVUxFX0ZJTEVfRVhDRVBUSU9OPUNIS0o0MDE3VzogRVJST1IgRUFSIFVOQ09OVEFJTkVEIE1PRFVMRSBGSUxFIEVYQ0VQVElPTgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVJST1JfQ09ERT1JV0FFMDAzNkUgQ0hLSjQwMThXOiBVbmtub3duIEVycm9yIENvZGU6IHswfS4gIGVycm9yLWNvZGUgbXVzdCBjb250YWluIGEgdmFsaWQgSFRUUCBzdGF0dXMgY29kZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1JFU19TSEFSSU5HX1NDT1BFPUNIS0o0MDE5VzogSW52YWxpZCByZXMtc2hhcmluZy1zY29wZTsgdmFsaWQgdmFsdWVzIGFyZSBcIlNoYXJlYWJsZVwiIG9yIFwiVW5zaGFyZWFibGVcIi4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FTlZfRU5UUlk9Q0hLSjQwMjBXOiBJbnZhbGlkIEVudmlyb25tZW50IEVudHJ5IFR5cGUuIFZhbGlkIHZhbHVlcyBhcmUgXCJqYXZhLmxhbmcuVFlQRVwiLCB3aGVyZSBUWVBFIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBCb29sZWFuLCBCeXRlLCBDaGFyYWN0ZXIsIFN0cmluZywgU2hvcnQsIEludGVnZXIsIExvbmcsIEZsb2F0LCBvciBEb3VibGUuIgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1dMUF9QUk9KRUNUPUNIS0o0MDIxVzogTWlzc2luZyBXZWIgTGlicmFyeSBQcm9qZWN0ICh7MH0pLiAgQ2hlY2sgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBwcm9qZWN0IHRvIGZpeCB0aGlzIHByb2JsZW0uCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0NPTkZMSUNUSU5HX1dMUF9QUk9KRUNUPUNIS0o0MDIyVzogVGhlIFdlYiBMaWJyYXJ5IFByb2plY3QgSkFSICh7MH0pIGNvbmZsaWN0cyB3aXRoIGFuIGFjdHVhbCBKQVIgaW4gdGhlIFdFQi1JTkYvbGliIGRpcmVjdG9yeS4KLU1TR19TRVJWRVJfVEFSR0VUX01JU01BVENIPUNIS0o0MDIzVzogVGhlIHRhcmdldCBzZXJ2ZXIgb2YgdGhlIFdlYiBMaWJyYXJ5IFByb2plY3QgKHsxfSkgZG9lcyBub3QgbWF0Y2ggdGhhdCBvZiB0aGlzIFdlYiBQcm9qZWN0ICh7MH0pLiAgUnVuIHZhbGlkYXRpb24gb24gdGhlIFdlYiBQcm9qZWN0IGlmIHlvdSB0aGluayB0aGF0IGlzIG5vdCB0aGUgY2FzZS4KLU1FU1NBR0VfVVJMX1BBVFRFUk5fRU5EX1dJVEhfQ0FSUkFJR0VfUkVUVVJOPVRoZSBVUkwgcGF0dGVybiBzdHJpbmcgInswfSIgZW5kcyB3aXRoIGEgaW52YWxpZCBjYXJyYWlnZSByZXR1cm4gZm9yIHNlcnZsZXQgezF9Ci0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FSkJfUkVGX1RZUEU9Q0hLSjQwMjNXOiBlamItcmVmLXR5cGUgbXVzdCBiZSAnRW50aXR5JyBvciAnU2Vzc2lvbicuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9NSVNTSU5HX0VKQl9ST0xFPUNIS0oyODI3VzogJydzZWN1cml0eS1yb2xlLXJlZicnIGVsZW1lbnQgezB9IGRlZmluZXMgdGhlICcncm9sZS1saW5rJycgZWxlbWVudCBidXQgbm8gJydzZWN1cml0eS1yb2xlJycgZWxlbWVudHMgaW4gdGhlIGFwcGxpY2F0aW9uIGRlc2NyaXB0b3IuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLW9mX1R5cGVfU2VjdXJpdHlfUm9sZV9OYW1lXzY9b2YgVHlwZSBTZWN1cml0eSBSb2xlIE5hbWUKLVdlYl9BcmNoaXZlX1ZhbGlkYXRvcl84PVdlYiBBcmNoaXZlIFZhbGlkYXRvcgotb2ZfVHlwZV9Sb2xlX05hbWVfMTk9b2YgVHlwZSBSb2xlIE5hbWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMjU9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfMjY9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMzI9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfMzM9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMzk9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfNDA9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfZWpiX3JlZl9uYW1lXzQ0PW9mIFR5cGUgZWpiLXJlZi1uYW1lCi1vZl9UeXBlX0Vycm9yX0xvY2F0aW9uXzQ3PW9mIFR5cGUgRXJyb3IgTG9jYXRpb24KLW9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDk9b2YgVHlwZSBFcnJvciBMb2NhdGlvbgotb2ZfVHlwZV9NaW1lX0V4dGVuc2lvbl81ND1vZiBUeXBlIE1pbWUgRXh0ZW5zaW9uCi1vZl9UeXBlX01pbWVfVHlwZV81NT1vZiBUeXBlIE1pbWUgVHlwZQotb2ZfVHlwZV9NaW1lX0V4dGVuc2lvbl9fXzU2PW9mIFR5cGUgTWltZSBFeHRlbnNpb246Ci1vZl9UeXBlX1dlYl9SZXNvdXJjZV9Db2xsZWN0aW9uXzY0PW9mIFR5cGUgV2ViIFJlc291cmNlIENvbGxlY3Rpb24KLW9mX1R5cGVfRmlsdGVyX05hbWVfNjY9b2YgVHlwZSBGaWx0ZXIgTmFtZQotSW52YWxpZF9VUkxfNzA9SW52YWxpZCBVUkwKLUludmFsaWRfVVJMXzc1PUludmFsaWQgVVJMCi1vZl9UeXBlX1NlcnZsZXRfTmFtZV83Nz1vZiBUeXBlIFNlcnZsZXQgTmFtZQotb2ZfVHlwZV9UYWdsaWJfODA9b2YgVHlwZSBUYWdsaWIKLW9mX1R5cGVfVGFnTGliX19fODE9b2YgVHlwZSBUYWdMaWI6Ci1vZl9UeXBlX1dlYl9SZXNvdXJjZV9OYW1lXzg0PW9mIFR5cGUgV2ViIFJlc291cmNlIE5hbWUKLW9mX1R5cGVfV2VsY29tZV9GaWxlX05hbWVfXzg3PW9mIFR5cGUgV2VsY29tZSBGaWxlIE5hbWUKLW9mX1R5cGVfRW52X0VudHJ5X05hbWVfX184OD1vZiBUeXBlIEVudmlyb25tZW50IEVudHJ5IE5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL2JpbmRpbmdzL0Fic3RyYWN0Sk5ESUJpbmRpbmdzSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9iaW5kaW5ncy9BYnN0cmFjdEpORElCaW5kaW5nc0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDNkZTUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL2JpbmRpbmdzL0Fic3RyYWN0Sk5ESUJpbmRpbmdzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDYgSUJNIENvcnBvcmF0aW9uCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlICB2MS4wCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwuYmluZGluZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUpORElCaW5kaW5nc0hlbHBlcn0uIENsaWVudHMgc2hvdWxkIGV4dGVuZCB0aGlzIGNsYXNzIGZvciB0aGVpcgotICogaW1wbGVtZW50YXRpb25zLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEpORElCaW5kaW5nc0hlbHBlciBpbXBsZW1lbnRzIElKTkRJQmluZGluZ3NIZWxwZXIgewotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhcHBsaWVzRm9yKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gYXBwbGllc0ZvcihBcmNoaXZlIGFyY2hpdmUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT5vYmplY3QudG9TdHJpbmcoKTwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+YmVhbi5nZXROYW1lKCk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlyZXR1cm4gYmVhbi5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnJlc291cmNlUmVmLmdldE5hbWUoKTwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZUZvclJlZihFbnRlcnByaXNlQmVhbiBiZWFuLCBSZXNvdXJjZVJlZiByZXNvdXJjZVJlZikgewotCQlyZXR1cm4gcmVzb3VyY2VSZWYuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT5yZXNvdXJjZUVudlJlZi5nZXROYW1lKCk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWVGb3JSZWYoRW50ZXJwcmlzZUJlYW4gYmVhbiwgUmVzb3VyY2VFbnZSZWYgcmVzb3VyY2VFbnZSZWYpIHsKLQkJcmV0dXJuIHJlc291cmNlRW52UmVmLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+c2VjdXJpdHlSb2xlUmVmLmdldE5hbWUoKTwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZUZvclJlZihFbnRlcnByaXNlQmVhbiBiZWFuLCBTZWN1cml0eVJvbGVSZWYgc2VjdXJpdHlSb2xlUmVmKSB7Ci0JCXJldHVybiBzZWN1cml0eVJvbGVSZWYuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT5yZXNvdXJjZVJlZi5nZXROYW1lKCk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWVGb3JSZWYoV2ViQXBwIHdlYkFwcCwgUmVzb3VyY2VSZWYgcmVzb3VyY2VSZWYpIHsKLQkJcmV0dXJuIHJlc291cmNlUmVmLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+cmVzb3VyY2VFbnZSZWYuZ2V0TmFtZSgpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lRm9yUmVmKFdlYkFwcCB3ZWJBcHAsIFJlc291cmNlRW52UmVmIHJlc291cmNlRW52UmVmKSB7Ci0JCXJldHVybiByZXNvdXJjZUVudlJlZi5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPigoRUpCSmFyKSBiZWFuLmVDb250YWluZXIoKSkuZ2V0RGlzcGxheU5hbWUoKTwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZUZvckRlZmF1bHREYXRhU291cmNlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYmVhbikgewotCQlyZXR1cm4gKChFSkJKYXIpIGJlYW4uZUNvbnRhaW5lcigpKS5nZXREaXNwbGF5TmFtZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL2JpbmRpbmdzL0lKTkRJQmluZGluZ3NIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL2JpbmRpbmdzL0lKTkRJQmluZGluZ3NIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2YTUxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9iaW5kaW5ncy9JSk5ESUJpbmRpbmdzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwyMDA2IElCTSBDb3Jwb3JhdGlvbgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAgdjEuMAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLmJpbmRpbmdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotLyoqCi0gKiBUaGlzIGlzIHVzZWQgdG8gbG9hZCBqbmRpIGJpbmRpbmdzIGZyb20gdmFyaW91cyBKMkVFIGFydGlmYWN0cy4gQ2xpZW50cyBzaG91bGQgYWNxdWlyZQotICogSUJpbmRpbmdzSGVscGVyIGZyb20gdGhlIHtAbGluayBKTkRJQmluZGluZ3NIZWxwZXJNYW5hZ2VyfS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSk5ESUJpbmRpbmdzSGVscGVyIHsKLQotCS8qKgotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZQotCSAqIHtAbGluayBKTkRJQmluZGluZ3NIZWxwZXJNYW5hZ2VyfS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHtAbGluayBJSk5ESUJpbmRpbmdzSGVscGVyfSBjYW4gYmUgdXNlZCB0byBsb2FkIGJpbmRpbmdzIGZvciBzcGVjaWZpZWQKLQkgKiAgICAgICAgIHByb2plY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYXBwbGllc0ZvcihJUHJvamVjdCBwcm9qZWN0KTsKLQotCS8qKgotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZQotCSAqIHtAbGluayBKTkRJQmluZGluZ3NIZWxwZXJNYW5hZ2VyfS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHtAbGluayBJSk5ESUJpbmRpbmdzSGVscGVyfSBjYW4gYmUgdXNlZCB0byBsb2FkIGJpbmRpbmdzIGZvciBzcGVjaWZpZWQKLQkgKiAgICAgICAgIGFyY2hpdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYXBwbGllc0ZvcihBcmNoaXZlIGFyY2hpdmUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIGJlYW4ncyBKTkRJIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuIHRoZSBzcGVjaWZpZWQgYmVhbidzIEpOREkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSk5ESSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIENNUCdzIGRlZmF1bHQgZGF0YXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEByZXR1cm4gdGhlIEpOREkgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBDTVAncyBkZWZhdWx0IGRhdGFzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZUZvckRlZmF1bHREYXRhU291cmNlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYmVhbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgYmVhbidzIHJlc291cmNlIHJlZmVyZW5jZSdzIEpOREkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEBwYXJhbSByZXNvdXJjZVJlZgotCSAqIEByZXR1cm4gdGhlIHNwZWNpZmllZCBiZWFuJ3MgcmVzb3VyY2UgcmVmZXJlbmNlJ3MgSk5ESSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWVGb3JSZWYoRW50ZXJwcmlzZUJlYW4gYmVhbiwgUmVzb3VyY2VSZWYgcmVzb3VyY2VSZWYpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIGJlYW4ncyByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UncyBKTkRJIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcGFyYW0gcmVzb3VyY2VFbnZSZWYKLQkgKiBAcmV0dXJuIHRoZSBzcGVjaWZpZWQgYmVhbidzIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSdzIEpOREkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lRm9yUmVmKEVudGVycHJpc2VCZWFuIGJlYW4sIFJlc291cmNlRW52UmVmIHJlc291cmNlRW52UmVmKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBiZWFuJ3Mgc2VjdXJpdHkgcm9sZSByZWZlcmVuYydzIEpOREkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEBwYXJhbSBzZWN1cml0eVJvbGVSZWYKLQkgKiBAcmV0dXJuIHRoZSBzcGVjaWZpZWQgYmVhbidzIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmMncyBKTkRJIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZUZvclJlZihFbnRlcnByaXNlQmVhbiBiZWFuLCBTZWN1cml0eVJvbGVSZWYgc2VjdXJpdHlSb2xlUmVmKTsKLQotCS8qKgotCSAqIFJldXR1cm5zIHRoZSBzcGVjaWZpZWQgd2ViIGFwcGxpY2F0aW9uJ3MgcmVzb3VyY2UgcmVmZXJlbmNlJ3MgSk5ESSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSB3ZWJBcHAKLQkgKiBAcGFyYW0gcmVzb3VyY2VSZWYKLQkgKiBAcmV0dXJuIHRoZSBzcGVjaWZpZWQgd2ViIGFwcGxpY2F0aW9uJ3MgcmVzb3VyY2UgcmVmZXJlbmNlJ3MgSk5ESSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWVGb3JSZWYoV2ViQXBwIHdlYkFwcCwgUmVzb3VyY2VSZWYgcmVzb3VyY2VSZWYpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIHdlYiBhcHBsaWNhdGlvbidzIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSdzIEpOREkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gd2ViQXBwCi0JICogQHBhcmFtIHJlc291cmNlRW52UmVmCi0JICogQHJldHVybiB0aGUgc3BlY2lmaWVkIHdlYiBhcHBsaWNhdGlvbidzIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSdzIEpOREkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lRm9yUmVmKFdlYkFwcCB3ZWJBcHAsIFJlc291cmNlRW52UmVmIHJlc291cmNlRW52UmVmKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBPYmplY3QncyBKTkRJIG5hbWUuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgbm9uZSBvZiB0aGUKLQkgKiBvdGhlcnMgYXBwbHksIGFzIGl0IHdpbGwgbGlrZWx5IGJlIGluZWZmaWNpZW50IGR1ZSB0byBpbnN0YW5jZW9mIGNoZWNrcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybiB0aGUgc3BlY2lmaWVkIE9iamVjdCdzIEpOREkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lKE9iamVjdCBvYmopOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9iaW5kaW5ncy9KTkRJQmluZGluZ3NIZWxwZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9iaW5kaW5ncy9KTkRJQmluZGluZ3NIZWxwZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhODUzODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvYmluZGluZ3MvSk5ESUJpbmRpbmdzSGVscGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsMjAwNiBJQk0gQ29ycG9yYXRpb24KLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgIHYxLjAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5iaW5kaW5nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlcwotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKTkRJQmluZGluZ3NIZWxwZXJNYW5hZ2VyIHsKLQotCXByaXZhdGUgTGlzdCBhbGxIZWxwZXJzOwotCXByaXZhdGUgSUpORElCaW5kaW5nc0hlbHBlciBkZWZhdWx0SGVscGVyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX1BST0pFQ1QgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0FSQ0hJVkUgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgSk5ESUJpbmRpbmdzSGVscGVyTWFuYWdlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSk5ESUJpbmRpbmdzSGVscGVyTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEpORElCaW5kaW5nc0hlbHBlck1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBiaW5kaW5ncyBoZWxwZXJzIGFwcGxpY2FibGUgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4gSWYgbm8gcmVnaXN0ZXJlZAotCSAqIGJpbmRpbmdzIGhlbHBlcnMgYXBwbHksIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gYSBkZWZhdWx0IGJpbmRpbmdzIGhlbHBlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUpORElCaW5kaW5nc0hlbHBlcltdIGdldEJpbmRpbmdzSGVscGVycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRCaW5kaW5nc0hlbHBlcnMoVFlQRV9QUk9KRUNULCBwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGJpbmRpbmdzIGhlbHBlcnMgYXBwbGljYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBhcmNoaXZlLiBJZiBubyByZWdpc3RlcmVkCi0JICogYmluZGluZ3MgaGVscGVycyBhcHBseSwgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgY29udGFpbiBhIGRlZmF1bHQgYmluZGluZ3MgaGVscGVyLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJSk5ESUJpbmRpbmdzSGVscGVyW10gZ2V0QmluZGluZ3NIZWxwZXJzKEFyY2hpdmUgYXJjaGl2ZSkgewotCQlyZXR1cm4gZ2V0QmluZGluZ3NIZWxwZXJzKFRZUEVfQVJDSElWRSwgYXJjaGl2ZSk7Ci0JfQotCi0JcHJpdmF0ZSBJSk5ESUJpbmRpbmdzSGVscGVyW10gZ2V0QmluZGluZ3NIZWxwZXJzKGludCB0eXBlLCBPYmplY3Qgb2JqKSB7Ci0JCUxpc3QgaGVscGVycyA9IGdldEhlbHBlcnMoKTsKLQkJTGlzdCBhcHBsaWVzSGVscGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUpORElCaW5kaW5nc0hlbHBlciBoZWxwZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGhlbHBlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWhlbHBlciA9IChJSk5ESUJpbmRpbmdzSGVscGVyKSBoZWxwZXJzLmdldChpKTsKLQkJCWlmICgoVFlQRV9QUk9KRUNUID09IHR5cGUgJiYgaGVscGVyLmFwcGxpZXNGb3IoKElQcm9qZWN0KSBvYmopKSB8fCAoVFlQRV9BUkNISVZFID09IHR5cGUgJiYgaGVscGVyLmFwcGxpZXNGb3IoKEFyY2hpdmUpIG9iaikpKSB7Ci0JCQkJYXBwbGllc0hlbHBlcnMuYWRkKGhlbHBlcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFwcGxpZXNIZWxwZXJzLnNpemUoKSA9PSAwKSB7Ci0JCQlhcHBsaWVzSGVscGVycy5hZGQoZ2V0RGVmYXVsdEhlbHBlcigpKTsKLQkJfQotCi0JCUlKTkRJQmluZGluZ3NIZWxwZXJbXSBoZWxwZXJzQXJyYXkgPSBuZXcgSUpORElCaW5kaW5nc0hlbHBlclthcHBsaWVzSGVscGVycy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGhlbHBlcnNBcnJheS5sZW5ndGg7IGkrKykgewotCQkJaGVscGVyc0FycmF5W2ldID0gKElKTkRJQmluZGluZ3NIZWxwZXIpIGFwcGxpZXNIZWxwZXJzLmdldChpKTsKLQkJfQotCi0JCXJldHVybiBoZWxwZXJzQXJyYXk7Ci0JfQotCi0JcHJpdmF0ZSBJSk5ESUJpbmRpbmdzSGVscGVyIGdldERlZmF1bHRIZWxwZXIoKSB7Ci0JCWlmIChudWxsID09IGRlZmF1bHRIZWxwZXIpIHsKLQkJCWRlZmF1bHRIZWxwZXIgPSBuZXcgQWJzdHJhY3RKTkRJQmluZGluZ3NIZWxwZXIoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gYXBwbGllc0ZvcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGFwcGxpZXNGb3IoQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRIZWxwZXI7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEhlbHBlcnMoKSB7Ci0JCWlmIChudWxsID09IGFsbEhlbHBlcnMpIHsKLQkJCUJpbmRpbmdzSGVscGVyUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQmluZGluZ3NIZWxwZXJSZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkucmVhZFJlZ2lzdHJ5KCk7Ci0JCQlhbGxIZWxwZXJzID0gcmVnaXN0cnkuZ2V0SGVscGVycygpOwotCQl9Ci0JCXJldHVybiBhbGxIZWxwZXJzOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBUQUdfSjJFRV9CSU5ESU5HU19IRUxQRVIgPSAiam5kaUJpbmRpbmdzSGVscGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgY2xhc3MgQmluZGluZ3NIZWxwZXJSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCQlwcml2YXRlIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgU3RyaW5nIFRBR19CSU5ESU5HU19IRUxQRVIgPSAiam5kaUJpbmRpbmdzSGVscGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgTGlzdCBoZWxwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXByaXZhdGUgQmluZGluZ3NIZWxwZXJSZWdpc3RyeSgpIHsKLQkJCXN1cGVyKEoyRUVDb3JlUGx1Z2luLlBMVUdJTl9JRCwgVEFHX0oyRUVfQklORElOR1NfSEVMUEVSKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoVEFHX0JJTkRJTkdTX0hFTFBFUi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYWRkSGVscGVyKChJSk5ESUJpbmRpbmdzSGVscGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRIZWxwZXJzKCkgewotCQkJcmV0dXJuIGhlbHBlcnM7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkSGVscGVyKElKTkRJQmluZGluZ3NIZWxwZXIgaGVscGVyKSB7Ci0JCQloZWxwZXJzLmFkZChoZWxwZXIpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9Bc3NlcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyYmUyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luOwotCi0vKioKLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcwotICogaW4gY29kZS4KLSAqIFRoZSBwcmVkaWNhdGUgbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZQotICogdHlwZSBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QgaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlCi0gKiB0aHJvd24gd2hlbiBzb21ldGhpbmcgaXMgbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseQotICogdW5zcGVjaWZpZWQgYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQgbmV2ZXIgcmVseSBvbgotICogdGhlc2UgYmVpbmcgdGhyb3duIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbQotICogc3BlY2lmaWNhbGx5KS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydCB7Ci0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCXByaXZhdGUgQXNzZXJ0KCkgewotCQkvLyBub3QgYWxsb3dlZAotCX0KLQotCS8qKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzCi0JICogbm90IDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+Ci0JICogaXMgdGhyb3duLgotCSAqCi0JICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4KLQkgKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc0xlZ2FsKGV4cHJlc3Npb24sICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzCi0JICogbm90IDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+Ci0JICogaXMgdGhyb3duLgotCSAqIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqCi0JICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4KLQkgKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKiogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzCi0JICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QpIHsKLQkJaXNOb3ROdWxsKG9iamVjdCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcwotCSAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIm51bGwgYXJndW1lbnQ6IiArIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcwotCSAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqCi0JICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4KLQkgKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIGlzVHJ1ZShleHByZXNzaW9uLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzCi0JICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybgotCSAqICAgIGlmIHRoZSBjaGVjayBmYWlscykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKQotCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiYXNzZXJ0aW9uIGZhaWxlZDogIiArIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwNzMwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW47Ci0KLS8qKgotICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bgotICogYnkgc29tZSBvZiB0aGUgbWV0aG9kcyBpbiA8Y29kZT5Bc3NlcnQ8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zIHRoYXQgY2F0Y2ggCi0gKiBvciBvdGhlcndpc2UgZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8gdW5leHBlY3RlZAotICogYnJlYWthZ2Ugd2hlbiBhc3NlcnRpb25zIGluIHRoZSBjb2RlIGFyZSBhZGRlZCBvciByZW1vdmVkLgotICogPC9wPgotICovCi0vKiBwYWNrYWdlICovCi1jbGFzcyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBBbGwgc2VyaWFsaXphYmxlIG9iamVjdHMgc2hvdWxkIGhhdmUgYSBzdGFibGUgc2VyaWFsVmVyc2lvblVJRAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsKSB7Ci0JCXN1cGVyKGRldGFpbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0NhdGFsb2dKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9DYXRhbG9nSjJFRVhtbER0REVudGl0eVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjRhZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0NhdGFsb2dKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotcHVibGljIGNsYXNzIENhdGFsb2dKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIgZXh0ZW5kcyBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIgewotCi0JcHJpdmF0ZSBVUklSZXNvbHZlciB1cmlSZXNvbHZlcjsKLQotCXB1YmxpYyBDYXRhbG9nSjJFRVhtbER0REVudGl0eVJlc29sdmVyKCkgewotCX0KLQotCXB1YmxpYyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgSU9FeGNlcHRpb24sIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7Ci0JCWlmICh1cmlSZXNvbHZlciA9PSBudWxsKSB7Ci0JCQl1cmlSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCX0KLQkJU3RyaW5nIHVyaSA9IHVyaVJlc29sdmVyLnJlc29sdmUobnVsbCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJaWYgKG51bGwgIT0gdXJpKSB7Ci0JCQlJbnB1dFNvdXJjZSByZXN1bHQgPSBuZXcgSW5wdXRTb3VyY2UodXJpKTsKLQkJCXJlc3VsdC5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCQkvLyBmb3JjZSB0aGUgZW5jb2RpbmcgdG8gYmUgVVRGOAotCQkJcmVzdWx0LnNldEVuY29kaW5nKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBzdXBlci5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0VjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0NTIyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjksIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5JRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklkZW50aWZpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGVDb21wYXJhdG9yOwotCi0vKioKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgaW1wbGVtZW50cyBJRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgU29ydGVkU2V0IGV4dGVuc2lvbkhlbHBlcnM7Ci0gICAgCi0gICAgLyoKLSAgICAgKiBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9OQU1FID0gImUiOyAvLyROT04tTkxTLTEkIHN0YXRpYyBmaW5hbAotICAgICAqIFN0cmluZyBFTEVNRU5UX0oyRUVNT0RVTEVfRVhURU5TSU9OID0gImoyZWVNb2R1bGVFeHRlbnNpb25IZWxwZXIiOwotICAgICAqIC8vJE5PTi1OTFMtMSQgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfRVhURU5TSU9OX0NMQVNTID0KLSAgICAgKiAiZXh0ZW5zaW9uQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0gICAgICovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBFY2xpcHNlRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIElOU1RBTkNFID0gbnVsbDsKLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVzY3JpcHRvciBpbXBsZW1lbnRzIElkZW50aWZpYWJsZSB7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX01PREVMX0VYVEVOREVSID0gImVqYk1vZGVsRXh0ZW5kZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfRUpCX0VYVEVOU0lPTl9DTEFTUyA9ICJleHRlbnNpb25DbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgbG9hZE9yZGVyQ291bnRlciA9IDA7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbG9hZE9yZGVyOwotCi0gICAgICAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgaW5zdGFuY2U7Ci0KLSAgICAgICAgcHVibGljIERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIEFzc2VydC5pc0xlZ2FsKEVKQl9NT0RFTF9FWFRFTkRFUi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgdXNlZCB0byBjcmVhdGUgRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5EZXNjcmlwdG9yLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLSAgICAgICAgICAgIHRoaXMubG9hZE9yZGVyID0gbG9hZE9yZGVyQ291bnRlcisrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGUjZ2V0TG9hZE9yZGVyKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TG9hZE9yZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIGxvYWRPcmRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSAoRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyKSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9FSkJfRVhURU5TSU9OX0NMQVNTKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBFY2xpcHNlRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyKCkgewotICAgICAgICBzdXBlcihKMkVFQ29yZVBsdWdpbi5QTFVHSU5fSUQsIERlc2NyaXB0b3IuRUpCX01PREVMX0VYVEVOREVSKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyKCk7Ci0gICAgICAgICAgICBJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSU5TVEFOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHcvIGFuIGV4dGVuc2lvbiBsaWtlOiA8ZWFyTW9kdWxlRXh0ZW5zaW9uCi0gICAgICogZXh0ZW5zaW9uQ2xhc3MgPSAiY29tLmlibS5ldG9vbHMud2ViLnBsdWdpbi5XZWJNb2R1bGVFeHRlbnNpb25JbXBsIi8+Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRGVzY3JpcHRvci5FSkJfTU9ERUxfRVhURU5ERVIpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgYWRkTW9kdWxlRXh0ZW5zaW9uKG5ldyBEZXNjcmlwdG9yKGVsZW1lbnQpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkTW9kdWxlRXh0ZW5zaW9uKERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBnZXRFeHRlbnNpb25IZWxwZXJzKCkuYWRkKGRlc2NyaXB0b3IpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29yZS5tb2R1bGVleHRlbnNpb24uaGVscGVyLklFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIjZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBnZXRFSkJNb2R1bGVFeHRlbnNpb24oT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgLy9JUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsgLy8gVE9ETyBNREUgR2V0IHRoZSBwcm9qZWN0IHVzaW5nIFByb2plY3QgVXRpbGl0aWVzIChhZGQgZGVwZW5kIHRvIGVtZi53b3JrYmVuY2ggPykKLSAgICAJaWYgKGdldEV4dGVuc2lvbkhlbHBlcnMoKS5pc0VtcHR5KCkpCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKERlc2NyaXB0b3IpIGdldEV4dGVuc2lvbkhlbHBlcnMoKS5maXJzdCgpOwotICAgICAgICBpZihkZXNjcmlwdG9yICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXRJbnN0YW5jZSgpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvcmUubW9kdWxlZXh0ZW5zaW9uLmhlbHBlci5JRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyI2hhc0VKQk1vZHVsZUV4dGVuc2lvbihqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0VKQk1vZHVsZUV4dGVuc2lvbihPYmplY3QgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBleHRlbnNpb25IZWxwZXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTb3J0ZWRTZXQgZ2V0RXh0ZW5zaW9uSGVscGVycygpIHsgCi0gICAgICAgIGlmIChleHRlbnNpb25IZWxwZXJzID09IG51bGwpIGV4dGVuc2lvbkhlbHBlcnMgPSBuZXcgVHJlZVNldChJZGVudGlmaWFibGVDb21wYXJhdG9yLmdldEluc3RhbmNlKCkpOwotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uSGVscGVyczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vSjJFRUNvcmVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9KMkVFQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGI5N2Q0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9KMkVFQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5EZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5JRUpCTW9kZWxFeHRlbmRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjUsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgSjJFRUNvcmVQbHVnaW4gaW5zdCA9IG51bGw7Ci0JcHJvdGVjdGVkIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gbnVsbDsKLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBKMkVFQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGluc3Q9PW51bGwpIGluc3QgPSB0aGlzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLklOU1RBTkNFLnNldFByb3ZpZGVyKEVjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCS8vIE5vIHRoYXQgd2UgY2FuIHJlZ2lzdGVyIGFnYWluc3QgT1NHSSBkZXBlbmRlbmNpZXMgLSBsZXRzIHJlLXVzZSB0aGUgY2F0YWxvZyByZXNvbHZlcgotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuSU5TVEFOQ0UgPSBuZXcgQ2F0YWxvZ0oyRUVYbWxEdERFbnRpdHlSZXNvbHZlcigpOwotCQlET01VdGlsaXRpZXMuc2V0RGVmYXVsdEVudGl0eVJlc29sdmVyKEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5JTlNUQU5DRSk7IAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEoyRUVDb3JlUGx1Z2luIGdldFBsdWdpbigpewotCQlyZXR1cm4gaW5zdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotCQotCXB1YmxpYyBMb2dnZXIgZ2V0TXNnTG9nZ2VyKCkgewotCQlpZiAobG9nZ2VyID09IG51bGwpIHsKLQkJCWxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0UGx1Z2luSUQoKSk7Ci0JCQlzZXRSZW5kZXJlcihsb2dnZXIpOwotCQl9Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhTG9nZ2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVuZGVyZXIoTG9nZ2VyIGFMb2dnZXIpIHsKLQkJbmV3IERlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyKGFMb2dnZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHNldmVyaXR5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggZXhjZXB0aW9uLmdldFN0YXR1cygpICk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL2VyZWZ2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vZXJlZnZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0ZTExNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vZXJlZnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1RoaXMgcHJvcGVydGllcyBmaWxlIGhvbGQgYWxsIHRoZSBleHRlcm5hbGlzZWQgc3RyaW5ncyBmb3IgZVRvb2xzIEoyRUUgVmFsaWRhdGlvbiBwcm9qZWN0Ci0jIFZhbGlkYXRpb24gcHJvamVjdAotIwotIyBNZXNzYWdlcyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgYXQ6Ci0jICAgICBodHRwOi8vaGFueS5hdXN0aW4uaWJtLmNvbS9tZXNzYWdlcy9pbmRleC5odG1sCi0jCi0jIEJyaWVmbHk6Ci0jICAgICBNRVNTQUdFX0lEPTxDb21wb25lbnRQcmVmaXg+PE1lc3NhZ2VOdW1iZXI+PFR5cGVDb2RlPjogPE1lc3NhZ2VUZXh0PgotIwotIyBUaGUgcHJlZml4IGZvciB0aGlzIGNvbXBvbmVudCBpczoKLSMgICAgIENIS0ogKElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbikKLSMKLSMgTm90ZSB0aGUgIjogIiB0aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgdHlwZSBjb2RlIGFuZCB0aGUgbWVzc2FnZSB0ZXh0LgotIwotIyA6QmVnaW46IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkJlZ2luOgotI0NPTVBPTkVOVFBSRUZJWCBDSEtKCi0jQ09NUE9ORU5UTkFNRUZPUiBDSEtKIElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbgotI0NNVkNQQVRITkFNRSBuY2Yvc3JjL2phdmEvY29tL2libS93ZWJzcGhlcmUvdmFsaWRhdGlvbi9lcmVmdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLSMKLSMgMTQtT2N0b2Jlci0yMDAxOgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfTUlTU0lOR19FUkVGTkFNRT1DSEtKMzAwOUU6IEluIG1vZHVsZSB7MX0sICcnZWpiLXJlZi1uYW1lJycgZWxlbWVudCBpbiAgZWpiLXJlZjogezB9IGlzIGludmFsaWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9JTlZBTElEX0VSRUZUWVBFPUNIS0ozMDEwRTogSW4gbW9kdWxlIHsxfSwgJydlamItcmVmLXR5cGUnJyBlbGVtZW50IGluIGVqYi1yZWY6IHswfSBpcyBpbnZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1FUlJPUl9FQVJfTUlTU0lOR19FUkVGVFlQRT1DSEtKMzAxNEU6IEluIG1vZHVsZSB7MX0sICcnZWpiLXJlZi10eXBlJycgZWxlbWVudCBpbiBlamItcmVmOiB7MH0gaXMgbWlzc2luZy4KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfTUlTU0lOR19FUkVGSE9NRT1DSEtKMzAxMUU6IEluIG1vZHVsZSB7MX0sIEhvbWUgaW50ZXJmYWNlIGlzIG1pc3NpbmcgZnJvbSBlamItcmVmOiB7MH0gZWxlbWVudC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX01JU1NJTkdfRVJFRlJFTU9URT1DSEtKMzAxMkU6IEluIG1vZHVsZSB7MX0sIFJlbW90ZSBpbnRlcmZhY2UgaXMgbWlzc2luZyBmcm9tIGVqYi1yZWY6IHswfSBlbGVtZW50LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRT1DSEtKMjgyN1c6ICcnc2VjdXJpdHktcm9sZS1yZWYnJyBlbGVtZW50IHswfSBkZWZpbmVzIHRoZSAnJ3JvbGUtbGluaycnIGVsZW1lbnQgYnV0IG5vICcnc2VjdXJpdHktcm9sZScnIGVsZW1lbnRzIGluIHRoZSBhcHBsaWNhdGlvbiBkZXNjcmlwdG9yLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfRFVQTElDQVRFX1JFU1JFRj1DSEtKMzAxM0U6IER1cGxpY2F0ZSAnJ3Jlc291cmNlLXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIG5ldyBzdHJpbmcgYWRkZWQgZm9yIHZlcnNpb24gNSBXU0FECi1VTlJFU09MVkVEX0VKQl9SRUZfV0FSTl89SVdBRTAwMzRXIEVKQiBsaW5rIGVsZW1lbnQgezB9IGlzIHVucmVzb2x2YWJsZSBpbiBtb2R1bGUgezF9IGFuZCBFQVIgezJ9LgotCi1FUlJPUl9FQVJfRFVQTElDQVRFX1NFUlZJQ0VSRUY9Q0hLSjMwMTVFOiBEdXBsaWNhdGUgJydzZXJ2aWNlLXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotRVJST1JfRUFSX0RVUExJQ0FURV9TRUNVUklUWVJPTEVSRUY9Q0hLSjMwMTZFOiBEdXBsaWNhdGUgJydzZWN1cml0eSByb2xlLXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotRVJST1JfRUFSX0RVUExJQ0FURV9FSkJSRUY9Q0hLSjMwMTdFOiBEdXBsaWNhdGUgJydlamItcmVmJycgZWxlbWVudCBuYW1lZCB7MH0uCi1FUlJPUl9FQVJfRFVQTElDQVRFX1JFU0VOVlJFRj1DSEtKMzAxOEU6IER1cGxpY2F0ZSAnJ3Jlc291cmNlIGVudmlyb25tZW50LXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotRVJST1JfRUFSX0RVUExJQ0FURV9NRVNTU0FHRURFU1RJTkFUSU9OUkVGPUNIS0ozMDE5RTogRHVwbGljYXRlICcnbWVzc2FnZSBkZXN0aW5hdGlvbi1yZWYnJyBlbGVtZW50IG5hbWVkIHswfS4KLUVSUk9SX0VBUl9NSVNTSU5HX01FU1NTQUdFREVTVElOQVRJT049TWVzc2FnZSBkZXN0aW5hdGlvbiBsaW5rICcnezB9JycgZm9yIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmICcnezF9JycgaXMgdW5yZXNvbHZhYmxlIGluIG1vZHVsZSAnJ3syfScnIGFuZCBFQVIgJyd7M30nJy4KLUVSUk9SX1VOUkVTT0xWRURfTURCX01JU1NJTkdfTUVTU0FHRV9ERVNUSU5BVElPTj1NZXNzYWdlIGRlc3RpbmF0aW9uIGxpbmsgJyd7MH0nJyBvZiBNREIgJyd7MX0nJyBpcyB1bnJlc29sdmFibGUgaW4gbW9kdWxlICcnezJ9JycgYW5kIEVBUiAnJ3szfScnLgotRVJST1JfRUFSX01JU1NJTkdfRU1QVFlfTUVTU1NBR0VERVNUSU5BVElPTj1NZXNzYWdlIGRlc3RpbmF0aW9uIGxpbmsgaXMgZW1wdHkgZm9yIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmICcnezB9JycgaW4gbW9kdWxlICcnezF9JycgYW5kIEVBUiAnJ3syfScnLgotRVJST1JfTU9EVUxFX0REX0ZJTEVfTk9UX0ZPVU5EPVRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgdGhlIG1vZHVsZSAnJ3swfScnIGNhbm5vdCBiZSBsb2FkZWQgb3IgZm91bmQuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZGZiNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgYXBwbGljYXRpb25UeXBlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUKLSAqIAlhcHBsaWNhdGlvbi4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldE1vZHVsZXMgPGVtPk1vZHVsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0U2VjdXJpdHlSb2xlcyA8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0TGlicmFyeURpcmVjdG9yeSA8ZW0+TGlicmFyeSBEaXJlY3Rvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25fRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbl9EaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25fSWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2R1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUKLQkgKiAJICAgIG1vZHVsZSBlbGVtZW50IGZvciBlYWNoIEphdmEgRUUgbW9kdWxlIGluIHRoZQotCSAqIAkgICAgYXBwbGljYXRpb24gcGFja2FnZS4gQSBtb2R1bGUgZWxlbWVudCBpcyBkZWZpbmVkCi0JICogCSAgICBieSBtb2R1bGVUeXBlIGRlZmluaXRpb24uCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNb2R1bGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlY3VyaXR5Um9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpYnJhcnkgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBsaWJyYXJ5LWRpcmVjdG9yeSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcGF0aG5hbWUKLQkgKiAJICAgIG9mIGEgZGlyZWN0b3J5IHdpdGhpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZSwgcmVsYXRpdmUKLQkgKiAJICAgIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuICBBbGwgZmlsZXMKLQkgKiAJICAgIG5hbWVkICIqLmphciIgaW4gdGhpcyBkaXJlY3RvcnkgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZQotCSAqIAkgICAgaW4gdGhlIGNsYXNzIHBhdGggb2YgYWxsIGNvbXBvbmVudHMgaW5jbHVkZWQgaW4gdGhpcwotCSAqIAkgICAgYXBwbGljYXRpb24gcGFja2FnZS4gIElmIHRoaXMgZWxlbWVudCBpc24ndCBzcGVjaWZpZWQsCi0JICogCSAgICB0aGUgZGlyZWN0b3J5IG5hbWVkICJsaWIiIGlzIHNlYXJjaGVkLiAgQW4gZW1wdHkgZWxlbWVudAotCSAqIAkgICAgbWF5IGJlIHVzZWQgdG8gZGlzYWJsZSBzZWFyY2hpbmcuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpYnJhcnkgRGlyZWN0b3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMaWJyYXJ5RGlyZWN0b3J5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX0xpYnJhcnlEaXJlY3RvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGlicmFyeURpcmVjdG9yeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRMaWJyYXJ5RGlyZWN0b3J5IDxlbT5MaWJyYXJ5IERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGlicmFyeSBEaXJlY3Rvcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExpYnJhcnlEaXJlY3RvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpYnJhcnlEaXJlY3RvcnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25fSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgNS4KLQkgKiAKLQkgKiAJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCi0JICogQHNlZSAjdW5zZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX1ZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZlcnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBtb2R1bGUgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCB1cmkKLQkgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgYSBtb2R1bGUgdG8gZmluZC4KLQkgKiBAcmV0dXJuIFRoZSBmaXJzdCBtYXRjaGluZyBtb2R1bGUgb3IgbnVsbCBpZiBubyBtb2R1bGUgaXMgZm91bmQuCi0JICovCi0JcHVibGljIE1vZHVsZSBnZXRGaXJzdE1vZHVsZShTdHJpbmcgdXJpKTsKLQotCXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyB1cmksIFN0cmluZyBhbHRERCk7Ci0KLX0gLy8gQXBwbGljYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzZhZTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldE1peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAlUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSmF2YSBFRQotCSAqIAlhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JICogCi0JICogICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfQXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiB2YWx1ZSk7Ci0KLX0gLy8gQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjVhMDE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvbkZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uIGNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIGNyZWF0ZUFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZHVsZSBjcmVhdGVNb2R1bGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2ViPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYiBjcmVhdGVXZWIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb25QYWNrYWdlIGdldEFwcGxpY2F0aW9uUGFja2FnZSgpOwotCi19IC8vQXBwbGljYXRpb25GYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0lBcHBsaWNhdGlvblJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0lBcHBsaWNhdGlvblJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTM5YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9JQXBwbGljYXRpb25SZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFwcGxpY2F0aW9uUmVzb3VyY2UgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBnZXRSb290T2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVhcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9Nb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZjkzMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9Nb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgbW9kdWxlVHlwZSBkZWZpbmVzIGEgc2luZ2xlIEphdmEgRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi0gKiAJY29ubmVjdG9yLCBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlCi0gKiAJbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlIGZpbGUsIGFuZCBhbgotICogCW9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvCi0gKiAJdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRDb25uZWN0b3IgPGVtPkNvbm5lY3RvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0RWpiIDxlbT5FamI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldEphdmEgPGVtPkphdmE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldFdlYiA8ZW0+V2ViPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRBbHREZCA8ZW0+QWx0IERkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldE1vZHVsZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2R1bGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbm5lY3RvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICAgIFRoZSBjb25uZWN0b3IgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhCi0JICogCSAgICAgIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUKLQkgKiAJICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCSAqIAotCSAqIAkgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3RvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29ubmVjdG9yKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldE1vZHVsZV9Db25uZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29ubmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRDb25uZWN0b3IgPGVtPkNvbm5lY3RvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29ubmVjdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb25uZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbm5lY3RvcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgICAgVGhlIGVqYiBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGFuIGVqYi1qYXIsCi0JICogCSAgICAgIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHBhY2thZ2UuCi0JICogCi0JICogCSAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0TW9kdWxlX0VqYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFamIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldEVqYiA8ZW0+RWpiPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5KYXZhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgICAgVGhlIGphdmEgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEKLQkgKiAJICAgICAgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcAotCSAqIAkgICAgICBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLQkgKiAKLQkgKiAJICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKYXZhKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldE1vZHVsZV9KYXZhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEphdmEoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldEphdmEgPGVtPkphdmE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEphdmEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEphdmEoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlYjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2ViPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlYjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V2ViKFdlYikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldE1vZHVsZV9XZWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWIgZ2V0V2ViKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRXZWIgPGVtPldlYjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2ViPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXZWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdlYihXZWIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWx0IERkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBhbHQtZGQgZWxlbWVudCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvIHRoZQotCSAqIAkgICAgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgKiAJICAgIGZpbGUgZm9yIGEgcGFydGljdWxhciBKYXZhIEVFIG1vZHVsZS4gIFRoZSBVUkkgbXVzdAotCSAqIAkgICAgc3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgZGVwbG95bWVudAotCSAqIAkgICAgZGVzY3JpcHRvciBmaWxlIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbidzIHJvb3QKLQkgKiAJICAgIGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZXBsb3llcgotCSAqIAkgICAgbXVzdCByZWFkIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZnJvbSB0aGUgZGVmYXVsdAotCSAqIAkgICAgbG9jYXRpb24gYW5kIGZpbGUgbmFtZSByZXF1aXJlZCBieSB0aGUgcmVzcGVjdGl2ZQotCSAqIAkgICAgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsdCBEZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWx0RGQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0TW9kdWxlX0FsdERkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFsdERkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRBbHREZCA8ZW0+QWx0IERkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbHQgRGQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFsdERkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbHREZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRNb2R1bGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKTsKLQotfSAvLyBNb2R1bGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL1dlYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9XZWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiZjFmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL1dlYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSB3ZWJUeXBlIGRlZmluZXMgdGhlIHdlYi11cmkgYW5kIGNvbnRleHQtcm9vdCBvZgotICogCWEgd2ViIGFwcGxpY2F0aW9uIG1vZHVsZS4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWIjZ2V0V2ViVXJpIDxlbT5XZWIgVXJpPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYiNnZXRDb250ZXh0Um9vdCA8ZW0+Q29udGV4dCBSb290PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldFdlYigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWIgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlYiBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHdlYi11cmkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHdlYgotCSAqIAkgICAgYXBwbGljYXRpb24gZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUKLQkgKiAJICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlYiBVcmk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdlYlVyaShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRXZWJfV2ViVXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFdlYlVyaSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWIjZ2V0V2ViVXJpIDxlbT5XZWIgVXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgVXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXZWJVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdlYlVyaShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGV4dCBSb290PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdAotCSAqIAkgICAgb2YgYSB3ZWIgYXBwbGljYXRpb24uCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRleHQgUm9vdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udGV4dFJvb3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0V2ViX0NvbnRleHRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbnRleHRSb290KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYiNnZXRDb250ZXh0Um9vdCA8ZW0+Q29udGV4dCBSb290PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZXh0IFJvb3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbnRleHRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250ZXh0Um9vdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRXZWJfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uV2ViI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdlYgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMjVjNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhlZCgpIDxlbT5NaXhlZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WE1MTlNQcmVmaXhNYXAoKSA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhNTE5TUHJlZml4TWFwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkgPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4U0lTY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldE1peGVkKCkgewotCQlpZiAobWl4ZWQgPT0gbnVsbCkgewotCQkJbWl4ZWQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEKTsKLQkJfQotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKLQkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKLQkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOwotCQl9Ci0JCXJldHVybiB4TUxOU1ByZWZpeE1hcC5tYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlpZiAoeFNJU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgewotCQkJeFNJU2NoZW1hTG9jYXRpb24gPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCX0KLQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uLm1hcCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbilnZXRNaXhlZCgpLmdldChBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTiwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24gbmV3QXBwbGljYXRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTiwgbmV3QXBwbGljYXRpb24sIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG5ld0FwcGxpY2F0aW9uKSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoQXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT04sIG5ld0FwcGxpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldEFwcGxpY2F0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldE1peGVkKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKTsKLQkJCQllbHNlIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZykoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZykoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKChBcHBsaWNhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJZ2V0TWl4ZWQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCWdldFhTSVNjaGVtYUxvY2F0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKChBcHBsaWNhdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJcmV0dXJuIG1peGVkICE9IG51bGwgJiYgIW1peGVkLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAgIT0gbnVsbCAmJiAheE1MTlNQcmVmaXhNYXAuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmICF4U0lTY2hlbWFMb2NhdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OOgotCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtaXhlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNTY5MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25GYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBcHBsaWNhdGlvbkZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCUFwcGxpY2F0aW9uRmFjdG9yeSB0aGVBcHBsaWNhdGlvbkZhY3RvcnkgPSAoQXBwbGljYXRpb25GYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWlmICh0aGVBcHBsaWNhdGlvbkZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVBcHBsaWNhdGlvbkZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgQXBwbGljYXRpb25GYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXBwbGljYXRpb24oKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1vZHVsZSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV2ViKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGNyZWF0ZUFwcGxpY2F0aW9uKCkgewotCQlBcHBsaWNhdGlvbkltcGwgYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb25JbXBsKCk7Ci0JCXJldHVybiBhcHBsaWNhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciBjcmVhdGVBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCBhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yID0gbmV3IEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiBhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2R1bGUgY3JlYXRlTW9kdWxlKCkgewotCQlNb2R1bGVJbXBsIG1vZHVsZSA9IG5ldyBNb2R1bGVJbXBsKCk7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYiBjcmVhdGVXZWIoKSB7Ci0JCVdlYkltcGwgd2ViID0gbmV3IFdlYkltcGwoKTsKLQkJcmV0dXJuIHdlYjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25QYWNrYWdlIGdldEFwcGxpY2F0aW9uUGFja2FnZSgpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvblBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25QYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3MzRjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24uSUNvbW1vbkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24uSUNvbW1vbk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0TW9kdWxlcyA8ZW0+TW9kdWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXRMaWJyYXJ5RGlyZWN0b3J5IDxlbT5MaWJyYXJ5IERpcmVjdG9yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb24sIElDb21tb25BcHBsaWNhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaWNvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxlcygpIDxlbT5Nb2R1bGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1vZHVsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtb2R1bGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyaXR5Um9sZXMoKSA8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdXJpdHlSb2xlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlY3VyaXR5Um9sZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpYnJhcnlEaXJlY3RvcnkoKSA8ZW0+TGlicmFyeSBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpYnJhcnlEaXJlY3RvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfRElSRUNUT1JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpYnJhcnlEaXJlY3RvcnkoKSA8ZW0+TGlicmFyeSBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpYnJhcnlEaXJlY3RvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGlicmFyeURpcmVjdG9yeSA9IExJQlJBUllfRElSRUNUT1JZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIjUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZlcnNpb24gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKLQkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKLQkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNb2R1bGVzKCkgewotCQlpZiAobW9kdWxlcyA9PSBudWxsKSB7Ci0JCQltb2R1bGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1vZHVsZS5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTKTsKLQkJfQotCQlyZXR1cm4gbW9kdWxlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWN1cml0eVJvbGVzKCkgewotCQlpZiAoc2VjdXJpdHlSb2xlcyA9PSBudWxsKSB7Ci0JCQlzZWN1cml0eVJvbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlY3VyaXR5Um9sZS5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIHNlY3VyaXR5Um9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbGlicmFyeURpcmVjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaWJyYXJ5RGlyZWN0b3J5KFN0cmluZyBuZXdMaWJyYXJ5RGlyZWN0b3J5KSB7Ci0JCVN0cmluZyBvbGRMaWJyYXJ5RGlyZWN0b3J5ID0gbGlicmFyeURpcmVjdG9yeTsKLQkJbGlicmFyeURpcmVjdG9yeSA9IG5ld0xpYnJhcnlEaXJlY3Rvcnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTElCUkFSWV9ESVJFQ1RPUlksIG9sZExpYnJhcnlEaXJlY3RvcnksIGxpYnJhcnlEaXJlY3RvcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJYm9vbGVhbiBvbGRWZXJzaW9uRVNldCA9IHZlcnNpb25FU2V0OwotCQl2ZXJzaW9uRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbiwgIW9sZFZlcnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWZXJzaW9uKCkgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCWJvb2xlYW4gb2xkVmVyc2lvbkVTZXQgPSB2ZXJzaW9uRVNldDsKLQkJdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0JCXZlcnNpb25FU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OLCBvbGRWZXJzaW9uLCBWRVJTSU9OX0VERUZBVUxULCBvbGRWZXJzaW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb25FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNb2R1bGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5Um9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTOgotCQkJCXJldHVybiBnZXRNb2R1bGVzKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZXMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19MSUJSQVJZX0RJUkVDVE9SWToKLQkJCQlyZXR1cm4gZ2V0TGlicmFyeURpcmVjdG9yeSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTOgotCQkJCWdldE1vZHVsZXMoKS5jbGVhcigpOwotCQkJCWdldE1vZHVsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTElCUkFSWV9ESVJFQ1RPUlk6Ci0JCQkJc2V0TGlicmFyeURpcmVjdG9yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUzoKLQkJCQlnZXRNb2R1bGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0xJQlJBUllfRElSRUNUT1JZOgotCQkJCXNldExpYnJhcnlEaXJlY3RvcnkoTElCUkFSWV9ESVJFQ1RPUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT046Ci0JCQkJdW5zZXRWZXJzaW9uKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6Ci0JCQkJcmV0dXJuIG1vZHVsZXMgIT0gbnVsbCAmJiAhbW9kdWxlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZXMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTElCUkFSWV9ESVJFQ1RPUlk6Ci0JCQkJcmV0dXJuIExJQlJBUllfRElSRUNUT1JZX0VERUZBVUxUID09IG51bGwgPyBsaWJyYXJ5RGlyZWN0b3J5ICE9IG51bGwgOiAhTElCUkFSWV9ESVJFQ1RPUllfRURFRkFVTFQuZXF1YWxzKGxpYnJhcnlEaXJlY3RvcnkpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGlzU2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGlicmFyeURpcmVjdG9yeTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsaWJyYXJ5RGlyZWN0b3J5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZlcnNpb25FU2V0KSByZXN1bHQuYXBwZW5kKHZlcnNpb24pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBtb2R1bGUgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCB1cmkKLQkgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgYSBtb2R1bGUgdG8gZmluZC4KLQkgKiBAcmV0dXJuIFRoZSBmaXJzdCBtYXRjaGluZyBtb2R1bGUgb3IgbnVsbCBpZiBubyBtb2R1bGUgaXMgZm91bmQuCi0JICovCi0JcHVibGljIE1vZHVsZSBnZXRGaXJzdE1vZHVsZShTdHJpbmcgdXJpKXsKLQkJaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJamF2YS51dGlsLkl0ZXJhdG9yIGFsbE1vZHVsZXMgPSBnZXRNb2R1bGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFsbE1vZHVsZXMuaGFzTmV4dCgpKXsKLQkJCU1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSlhbGxNb2R1bGVzLm5leHQoKTsKLQkJCWlmKHVyaS5lcXVhbHMoYU1vZHVsZS5nZXRVcmkoKSkpIHJldHVybiBhTW9kdWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyB1cmksIFN0cmluZyBhbHRERCkgewotCQlMaXN0IGFsbE1vZHVsZXMgPSBnZXRNb2R1bGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlIGFNb2R1bGUgPSAoTW9kdWxlKSBhbGxNb2R1bGVzLmdldChpKTsKLQkJCWlmIChTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbCh1cmksIGFNb2R1bGUuZ2V0VXJpKCkpICYmIFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKGFsdERELCBhTW9kdWxlLmdldEFsdERkKCkpKQotCQkJCXJldHVybiBhTW9kdWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEVBUk1vZHVsZXMoKSB7Ci0JCXJldHVybiBnZXRNb2R1bGVzKCk7Ci0JfQotCi0JcHVibGljIElDb21tb25Nb2R1bGUgZ2V0Rmlyc3RFQVJNb2R1bGUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gKElDb21tb25Nb2R1bGUpIGdldEZpcnN0TW9kdWxlKHVyaSk7Ci0JfQotCi19IC8vQXBwbGljYXRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMTA4YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwubmFtZXNwYWNlLlhNTE5hbWVzcGFjZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25QYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXBwbGljYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtb2R1bGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2ViRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBcHBsaWNhdGlvblBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBBcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25QYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChBcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgQXBwbGljYXRpb25QYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhNTE5hbWVzcGFjZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJV2ViUGFja2FnZUltcGwgdGhlV2ViUGFja2FnZSA9IChXZWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSA6IFdlYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmF2YWVlUGFja2FnZUltcGwgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEphdmFlZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSA6IEphdmFlZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UgPSAoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YWVlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUphdmFlZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUFwcGxpY2F0aW9uUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9TZWN1cml0eVJvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9MaWJyYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX0FwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZHVsZV9Db25uZWN0b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2R1bGVfRWpiKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kdWxlX0phdmEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2R1bGVfV2ViKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kdWxlX0FsdERkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kdWxlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXZWIoKSB7Ci0JCXJldHVybiB3ZWJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViX1dlYlVyaSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYl9Db250ZXh0Um9vdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkgewotCQlyZXR1cm4gKEFwcGxpY2F0aW9uRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlhcHBsaWNhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUFBMSUNBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19JQ09OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19NT0RVTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkVDbGFzcywgQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkVDbGFzcywgQVBQTElDQVRJT05fX0xJQlJBUllfRElSRUNUT1JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkVDbGFzcywgQVBQTElDQVRJT05fX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkVDbGFzcywgQVBQTElDQVRJT05fX1ZFUlNJT04pOwotCi0JCWFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIEFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTik7Ci0KLQkJbW9kdWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1PRFVMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobW9kdWxlRUNsYXNzLCBNT0RVTEVfX0NPTk5FQ1RPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobW9kdWxlRUNsYXNzLCBNT0RVTEVfX0VKQik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobW9kdWxlRUNsYXNzLCBNT0RVTEVfX0pBVkEpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19XRUIpOwotCQljcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19BTFRfREQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19JRCk7Ci0KLQkJd2ViRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViRUNsYXNzLCBXRUJfX1dFQl9VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYkVDbGFzcywgV0VCX19DT05URVhUX1JPT1QpOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYkVDbGFzcywgV0VCX19JRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUphdmFlZVBhY2thZ2UgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uRUNsYXNzLCBBcHBsaWNhdGlvbi5jbGFzcywgIkFwcGxpY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uX01vZHVsZXMoKSwgdGhpcy5nZXRNb2R1bGUoKSwgbnVsbCwgIm1vZHVsZXMiLCBudWxsLCAxLCAtMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbl9MaWJyYXJ5RGlyZWN0b3J5KCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImxpYnJhcnlEaXJlY3RvcnkiLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERld2V5VmVyc2lvblR5cGUoKSwgInZlcnNpb24iLCAiNSIsIDEsIDEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IuY2xhc3MsICJBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgIm1peGVkIiwgbnVsbCwgMCwgLTEsIG51bGwsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4TUxOU1ByZWZpeE1hcCIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX0FwcGxpY2F0aW9uKCksIHRoaXMuZ2V0QXBwbGljYXRpb24oKSwgbnVsbCwgImFwcGxpY2F0aW9uIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKG1vZHVsZUVDbGFzcywgTW9kdWxlLmNsYXNzLCAiTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9Db25uZWN0b3IoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAiY29ubmVjdG9yIiwgbnVsbCwgMCwgMSwgTW9kdWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfRWpiKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImVqYiIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlX0phdmEoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAiamF2YSIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kdWxlX1dlYigpLCB0aGlzLmdldFdlYigpLCBudWxsLCAid2ViIiwgbnVsbCwgMCwgMSwgTW9kdWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9BbHREZCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJhbHREZCIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mod2ViRUNsYXNzLCBXZWIuY2xhc3MsICJXZWIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViX1dlYlVyaSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJ3ZWJVcmkiLCBudWxsLCAxLCAxLCBXZWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYl9Db250ZXh0Um9vdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAiY29udGV4dFJvb3QiLCBudWxsLCAxLCAxLCBXZWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBXZWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYXBwbGljYXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImFwcGxpY2F0aW9uVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uX0Rpc3BsYXlOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uX0ljb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpY29uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtb2R1bGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbl9TZWN1cml0eVJvbGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZWN1cml0eS1yb2xlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uX0xpYnJhcnlEaXJlY3RvcnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImxpYnJhcnktZGlyZWN0b3J5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25fSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInZlcnNpb24iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgIm1peGVkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnRXaWxkY2FyZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIjptaXhlZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ4bWxuczpwcmVmaXgiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAieHNpOnNjaGVtYUxvY2F0aW9uIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYXBwbGljYXRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobW9kdWxlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtb2R1bGVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNb2R1bGVfQ29ubmVjdG9yKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJjb25uZWN0b3IiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TW9kdWxlX0VqYigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1vZHVsZV9KYXZhKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJqYXZhIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TW9kdWxlX1dlYigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAid2ViIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1vZHVsZV9BbHREZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYWx0LWRkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TW9kdWxlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod2ViRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ3ZWJUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJfV2ViVXJpKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ3ZWItdXJpIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYl9Db250ZXh0Um9vdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiY29udGV4dC1yb290IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7Ci0JfQotCi19IC8vQXBwbGljYXRpb25QYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL01vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YjNiYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL01vZHVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklDb21tb25FTUZNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcHBsaWNhdGlvbi5JQ29tbW9uTW9kdWxlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbCNnZXRDb25uZWN0b3IgPGVtPkNvbm5lY3RvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwjZ2V0RWpiIDxlbT5FamI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsI2dldEphdmEgPGVtPkphdmE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsI2dldFdlYiA8ZW0+V2ViPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbCNnZXRBbHREZCA8ZW0+QWx0IERkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNb2R1bGUsIElDb21tb25Nb2R1bGUsIElDb21tb25FTUZNb2R1bGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0b3IoKSA8ZW0+Q29ubmVjdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0b3IoKSA8ZW0+Q29ubmVjdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdG9yID0gQ09OTkVDVE9SX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYigpIDxlbT5FamI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYigpIDxlbT5FamI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamIgPSBFSkJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YSgpIDxlbT5KYXZhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmEoKSA8ZW0+SmF2YTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBqYXZhID0gSkFWQV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYigpIDxlbT5XZWI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlYigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFdlYiB3ZWIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdERkKCkgPGVtPkFsdCBEZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0RGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVF9ERF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHREZCgpIDxlbT5BbHQgRGQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdERkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFsdERkID0gQUxUX0REX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5NT0RVTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25uZWN0b3IoKSB7Ci0JCXJldHVybiBjb25uZWN0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdG9yKFN0cmluZyBuZXdDb25uZWN0b3IpIHsKLQkJU3RyaW5nIG9sZENvbm5lY3RvciA9IGNvbm5lY3RvcjsKLQkJY29ubmVjdG9yID0gbmV3Q29ubmVjdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19DT05ORUNUT1IsIG9sZENvbm5lY3RvciwgY29ubmVjdG9yKSk7Ci0JfQotCS8vIFJldHVybnMgdGhlIHVyaSBvZiB0aGUgZ2l2ZW4gbW9kdWxlIHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLQkJaWYgKGVJc1NldChBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19FSkIpKQotCQkJcmV0dXJuIGdldEVqYigpOwotCQllbHNlIGlmIChlSXNTZXQoQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQ09OTkVDVE9SKSkKLQkJCXJldHVybiBnZXRDb25uZWN0b3IoKTsKLQkJZWxzZSBpZiAoZUlzU2V0KEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0pBVkEpKQotCQkJcmV0dXJuIGdldEphdmEoKTsKLQkJZWxzZSBpZiAoZUlzU2V0KEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1dFQikpCi0JCQlyZXR1cm4gZ2V0V2ViKCkuZ2V0V2ViVXJpKCk7Ci0JCXJldHVybiBudWxsOwotCQkKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYigpIHsKLQkJcmV0dXJuIGVqYjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamIoU3RyaW5nIG5ld0VqYikgewotCQlTdHJpbmcgb2xkRWpiID0gZWpiOwotCQllamIgPSBuZXdFamI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0VKQiwgb2xkRWpiLCBlamIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmEoKSB7Ci0JCXJldHVybiBqYXZhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmEoU3RyaW5nIG5ld0phdmEpIHsKLQkJU3RyaW5nIG9sZEphdmEgPSBqYXZhOwotCQlqYXZhID0gbmV3SmF2YTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fSkFWQSwgb2xkSmF2YSwgamF2YSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWIgZ2V0V2ViKCkgewotCQlyZXR1cm4gd2ViOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdlYihXZWIgbmV3V2ViLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdlYiBvbGRXZWIgPSB3ZWI7Ci0JCXdlYiA9IG5ld1dlYjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fV0VCLCBvbGRXZWIsIG5ld1dlYik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViKFdlYiBuZXdXZWIpIHsKLQkJaWYgKG5ld1dlYiAhPSB3ZWIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdlYiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3ZWIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19XRUIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dlYiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19XRUIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V2ViKG5ld1dlYiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19XRUIsIG5ld1dlYiwgbmV3V2ViKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbHREZCgpIHsKLQkJcmV0dXJuIGFsdERkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdERkKFN0cmluZyBuZXdBbHREZCkgewotCQlTdHJpbmcgb2xkQWx0RGQgPSBhbHREZDsKLQkJYWx0RGQgPSBuZXdBbHREZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQUxUX0RELCBvbGRBbHREZCwgYWx0RGQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19XRUI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0NPTk5FQ1RPUjoKLQkJCQlyZXR1cm4gZ2V0Q29ubmVjdG9yKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0VKQjoKLQkJCQlyZXR1cm4gZ2V0RWpiKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0pBVkE6Ci0JCQkJcmV0dXJuIGdldEphdmEoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fV0VCOgotCQkJCXJldHVybiBnZXRXZWIoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQUxUX0REOgotCQkJCXJldHVybiBnZXRBbHREZCgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19DT05ORUNUT1I6Ci0JCQkJc2V0Q29ubmVjdG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fRUpCOgotCQkJCXNldEVqYigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0pBVkE6Ci0JCQkJc2V0SmF2YSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1dFQjoKLQkJCQlzZXRXZWIoKFdlYiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BTFRfREQ6Ci0JCQkJc2V0QWx0RGQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19DT05ORUNUT1I6Ci0JCQkJc2V0Q29ubmVjdG9yKENPTk5FQ1RPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19FSkI6Ci0JCQkJc2V0RWpiKEVKQl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19KQVZBOgotCQkJCXNldEphdmEoSkFWQV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19XRUI6Ci0JCQkJc2V0V2ViKChXZWIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BTFRfREQ6Ci0JCQkJc2V0QWx0RGQoQUxUX0REX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQ09OTkVDVE9SOgotCQkJCXJldHVybiBDT05ORUNUT1JfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3RvciAhPSBudWxsIDogIUNPTk5FQ1RPUl9FREVGQVVMVC5lcXVhbHMoY29ubmVjdG9yKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fRUpCOgotCQkJCXJldHVybiBFSkJfRURFRkFVTFQgPT0gbnVsbCA/IGVqYiAhPSBudWxsIDogIUVKQl9FREVGQVVMVC5lcXVhbHMoZWpiKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fSkFWQToKLQkJCQlyZXR1cm4gSkFWQV9FREVGQVVMVCA9PSBudWxsID8gamF2YSAhPSBudWxsIDogIUpBVkFfRURFRkFVTFQuZXF1YWxzKGphdmEpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19XRUI6Ci0JCQkJcmV0dXJuIHdlYiAhPSBudWxsOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BTFRfREQ6Ci0JCQkJcmV0dXJuIEFMVF9ERF9FREVGQVVMVCA9PSBudWxsID8gYWx0RGQgIT0gbnVsbCA6ICFBTFRfRERfRURFRkFVTFQuZXF1YWxzKGFsdERkKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb25uZWN0b3I6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY29ubmVjdG9yKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlamI6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZWpiKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXZhOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGphdmEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsdERkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFsdERkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0b3JNb2R1bGUoKSB7Ci0JCWlmIChlSXNTZXQoQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQ09OTkVDVE9SKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIFJldHVybnMgZmFsc2UgYnkgZGVmYXVsdAotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFamJNb2R1bGUoKSB7Ci0JCWlmIChlSXNTZXQoQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fRUpCKSApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAKLQkgKiBSZXR1cm5zIGZhbHNlIGJ5IGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0phdmFNb2R1bGUoKSB7Ci0JCWlmIChlSXNTZXQoQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fSkFWQSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAKLQkgKiBSZXR1cm5zIGZhbHNlIGJ5IGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYk1vZHVsZSgpIHsKLQkJaWYgKGVJc1NldChBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19XRUIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCi19IC8vTW9kdWxlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTkxMWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlYjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYkltcGwjZ2V0V2ViVXJpIDxlbT5XZWIgVXJpPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViSW1wbCNnZXRDb250ZXh0Um9vdCA8ZW0+Q29udGV4dCBSb290PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWJVcmkoKSA8ZW0+V2ViIFVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2ViVXJpKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlVyaSgpIDxlbT5XZWIgVXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWJVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd2ViVXJpID0gV0VCX1VSSV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZXh0Um9vdCgpIDxlbT5Db250ZXh0IFJvb3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRleHRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1JPT1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGV4dFJvb3QoKSA8ZW0+Q29udGV4dCBSb290PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZXh0Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0Um9vdCA9IENPTlRFWFRfUk9PVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdlYkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuV0VCOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2ViVXJpKCkgewotCQlyZXR1cm4gd2ViVXJpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYlVyaShTdHJpbmcgbmV3V2ViVXJpKSB7Ci0JCVN0cmluZyBvbGRXZWJVcmkgPSB3ZWJVcmk7Ci0JCXdlYlVyaSA9IG5ld1dlYlVyaTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fV0VCX1VSSSwgb2xkV2ViVXJpLCB3ZWJVcmkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHRSb290KCkgewotCQlyZXR1cm4gY29udGV4dFJvb3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dFJvb3QoU3RyaW5nIG5ld0NvbnRleHRSb290KSB7Ci0JCVN0cmluZyBvbGRDb250ZXh0Um9vdCA9IGNvbnRleHRSb290OwotCQljb250ZXh0Um9vdCA9IG5ld0NvbnRleHRSb290OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX19DT05URVhUX1JPT1QsIG9sZENvbnRleHRSb290LCBjb250ZXh0Um9vdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfX1dFQl9VUkk6Ci0JCQkJcmV0dXJuIGdldFdlYlVyaSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX19DT05URVhUX1JPT1Q6Ci0JCQkJcmV0dXJuIGdldENvbnRleHRSb290KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfX1dFQl9VUkk6Ci0JCQkJc2V0V2ViVXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fQ09OVEVYVF9ST09UOgotCQkJCXNldENvbnRleHRSb290KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fV0VCX1VSSToKLQkJCQlzZXRXZWJVcmkoV0VCX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX19DT05URVhUX1JPT1Q6Ci0JCQkJc2V0Q29udGV4dFJvb3QoQ09OVEVYVF9ST09UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fV0VCX1VSSToKLQkJCQlyZXR1cm4gV0VCX1VSSV9FREVGQVVMVCA9PSBudWxsID8gd2ViVXJpICE9IG51bGwgOiAhV0VCX1VSSV9FREVGQVVMVC5lcXVhbHMod2ViVXJpKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fQ09OVEVYVF9ST09UOgotCQkJCXJldHVybiBDT05URVhUX1JPT1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnRleHRSb290ICE9IG51bGwgOiAhQ09OVEVYVF9ST09UX0VERUZBVUxULmVxdWFscyhjb250ZXh0Um9vdCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAod2ViVXJpOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHdlYlVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29udGV4dFJvb3Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY29udGV4dFJvb3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV2ViSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvbWV0YWRhdGEvQXBwbGljYXRpb25QYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL21ldGFkYXRhL0FwcGxpY2F0aW9uUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTBjMGIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvbWV0YWRhdGEvQXBwbGljYXRpb25QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqICAgICAgIEAoIylhcHBsaWNhdGlvbl81LnhzZHMJMS4xNyAwOC8wNS8wNQotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgICAgIAotICogCi0gKiAJVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIGFwcGxpY2F0aW9uIDUgZGVwbG95bWVudAotICogCWRlc2NyaXB0b3IuICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQKLSAqIAkiTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIiBpbiB0aGUgYXBwbGljYXRpb24ncyBlYXIgZmlsZS4KLSAqIAlBbGwgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlCi0gKiAJdGhlIGFwcGxpY2F0aW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0gKiAKLSAqIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAqIAotICogCWFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gKiAJdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLSAqIAotICogCSAgICAmbHQ7YXBwbGljYXRpb24geG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAqIAkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICogCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gKiAJCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl81LnhzZCIKLSAqIAkgICAgICB2ZXJzaW9uPSI1IiZndDsKLSAqIAkgICAgICAuLi4KLSAqIAkgICAgJmx0Oy9hcHBsaWNhdGlvbiZndDsKLSAqIAotICogCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotICogCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLSAqIAluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotICogCi0gKiAJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkCi0gKiAKLSAqIAkKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gKiAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0gKiAKLSAqICAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAqIAlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICogCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICogCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICogCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gKiAJcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gKiAJbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gKiAKLSAqICAgICAKLSAqIAotICogICAgICAgQCgjKWphdmFlZV81LnhzZHMJMS42NSAwNi8wMi8xNwotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi0gKiBzaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLSAqIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLSAqIAotICogRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgIGoyZWUgYXBwbGljYXRpb247Ci0gKiAgICAgYXBwbGljYXRpb24gY2xpZW50OwotICogICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAqICAgICBlbnRlcnByaXNlIGJlYW47Ci0gKiAgICAgcmVzb3VyY2UgYWRhcHRlcjsKLSAqIAotICogRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBlYXIgZmlsZTsKLSAqICAgICB3YXIgZmlsZTsKLSAqICAgICBqYXIgZmlsZTsKLSAqICAgICByYXIgZmlsZTsKLSAqIAotICogCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkcwkxLjE5IDAyLzEzLzA2Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgotICogCi0gKiAgICAgVGhpcyBzY2hlbWEgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBYTUwgbmFtZXNwYWNlLCBpbiBhIGZvcm0KLSAqICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuICAKLSAqIAotICogICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUgZGVmaW5lZAotICogICAgIG9ubHkgYnkgdGhlIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gb3IgaXRzIHN1Ymdyb3Vwcy4gIFRoZQotICogICAgIGZvbGxvd2luZyBuYW1lcyBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgYW5kIHNob3VsZAotICogICAgIG5vdCBiZSB1c2VkIHdpdGggY29uZmxpY3Rpbmcgc2VtYW50aWNzIGJ5IGFueSBXb3JraW5nIEdyb3VwLAotICogICAgIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlOgotICogCi0gKiAgICAgYmFzZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgcHJvdmlkZXMgYSBVUkkgdG8gYmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IgaW50ZXJwcmV0aW5nIGFueQotICogICAgICAgICAgcmVsYXRpdmUgVVJJcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVsZW1lbnQgb24gd2hpY2ggaXQKLSAqICAgICAgICAgIGFwcGVhcnM7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIEJhc2Ugc3BlY2lmaWNhdGlvbi4KLSAqIAotICogICAgIGlkICAgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBpZiBkZWNsYXJlZCB0byBiZSBvZiB0eXBlIElELgotICogICAgICAgICAgVGhlIHhtbDppZCBzcGVjaWZpY2F0aW9uIGlzIG5vdCB5ZXQgYSBXM0MgUmVjb21tZW5kYXRpb24sCi0gKiAgICAgICAgICBidXQgdGhpcyBhdHRyaWJ1dGUgaXMgaW5jbHVkZWQgaGVyZSB0byBmYWNpbGl0YXRlIGV4cGVyaW1lbnRhdGlvbgotICogICAgICAgICAgd2l0aCB0aGUgbWVjaGFuaXNtcyBpdCBwcm9wb3Nlcy4gIE5vdGUgdGhhdCBpdCBpcyBfbm90XyBpbmNsdWRlZAotICogICAgICAgICAgaW4gdGhlIHNwZWNpYWxBdHRycyBhdHRyaWJ1dGUgZ3JvdXAuCi0gKiAKLSAqICAgICBsYW5nIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBpcyBhIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBuYXR1cmFsIGxhbmd1YWdlIG9mIHRoZSBjb250ZW50IG9mCi0gKiAgICAgICAgICBhbnkgZWxlbWVudDsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAotICogICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KLSAqICAgCi0gKiAgICAgc3BhY2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UKLSAqICAgICAgICAgIHZhbHVlIGlzIGEga2V5d29yZCBpbmRpY2F0aW5nIHdoYXQgd2hpdGVzcGFjZSBwcm9jZXNzaW5nCi0gKiAgICAgICAgICBkaXNjaXBsaW5lIGlzIGludGVuZGVkIGZvciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDsgaXRzCi0gKiAgICAgICAgICB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgdmlydHVlIG9mIGl0cwotICogICAgICAgICAgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBGYXRoZXIgKGluIGFueSBjb250ZXh0IGF0IGFsbCk6IGRlbm90ZXMgSm9uIEJvc2FrLCB0aGUgY2hhaXIgb2YgCi0gKiAgICAgICAgICB0aGUgb3JpZ2luYWwgWE1MIFdvcmtpbmcgR3JvdXAuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgCi0gKiAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kIAotICogICAgICAgICAgWE1MIENvb3JkaW5hdGlvbiBncm91cHM6Ci0gKiAKLSAqICAgICAgICAgICAgICBJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kIGRlZGljYXRpb24KLSAqICAgICAgICAgICAgICB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YgRmVicnVhcnksIDIwMDAKLSAqICAgICAgICAgICAgICByZXNlcnZlcyBmb3IgSm9uIEJvc2FrIGluIHBlcnBldHVpdHkgdGhlIFhNTCBuYW1lCi0gKiAgICAgICAgICAgICAgeG1sOkZhdGhlcgotICogICAKLSAqIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gKiAgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAqICAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZywgeG1sOnNwYWNlIG9yIHhtbDppZAotICogICAgICAgICBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgotICogCi0gKiAgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gKiAgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICogICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gKiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKLSAqIAotICogICAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzCi0gKiAgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KLSAqIAotICogICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8mZ3Q7Ci0gKiAgCi0gKiAgICAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UKLSAqICAgICAgICAgIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcwotICogSW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZwotICogICAgcG9saWN5LCB0aGlzIHNjaGVtYSBkb2N1bWVudCB3aWxsIHBlcnNpc3QgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZC4KLSAqICAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QuCi0gKiAgICBUaGUgc2NoZW1hIGRvY3VtZW50IGF0IHRoYXQgVVJJIG1heSBob3dldmVyIGNoYW5nZSBpbiB0aGUgZnV0dXJlLAotICogICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYQotICogICAgaXRzZWxmLCBvciB3aXRoIHRoZSBYTUwgbmFtZXNwYWNlIGl0c2VsZi4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgWE1MCi0gKiAgICBTY2hlbWEgb3IgWE1MIG5hbWVzcGFjZXMgY2hhbmdlLCB0aGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAqICAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAqICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImFwcGxpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl81LnhzZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gImFwcGxpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvblBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0lDT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9fTU9EVUxFUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlicmFyeSBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9fTElCUkFSWV9ESVJFQ1RPUlkgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0lEID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX1ZFUlNJT04gPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsIDxlbT5Nb2R1bGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0TW9kdWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1PRFVMRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX19DT05ORUNUT1IgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9fRUpCID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXZhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX19KQVZBID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfX1dFQiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0IERkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX19BTFRfREQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX19JRCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TW9kdWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYkltcGwgPGVtPldlYjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRXZWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0VCID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgVXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX19XRUJfVVJJID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZXh0IFJvb3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfX0NPTlRFWFRfUk9PVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XZWI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fRGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkljb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRJY29ucygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRNb2R1bGVzIDxlbT5Nb2R1bGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Nb2R1bGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRNb2R1bGVzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0U2VjdXJpdHlSb2xlcyA8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRTZWN1cml0eVJvbGVzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldExpYnJhcnlEaXJlY3RvcnkgPGVtPkxpYnJhcnkgRGlyZWN0b3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGlicmFyeSBEaXJlY3Rvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldExpYnJhcnlEaXJlY3RvcnkoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9MaWJyYXJ5RGlyZWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldElkKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25fSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uX1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk1peGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfQXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlIDxlbT5Nb2R1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRDb25uZWN0b3IgPGVtPkNvbm5lY3RvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbm5lY3RvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldENvbm5lY3RvcigpCi0JICogQHNlZSAjZ2V0TW9kdWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNb2R1bGVfQ29ubmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldEVqYiA8ZW0+RWpiPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0RWpiKCkKLQkgKiBAc2VlICNnZXRNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1vZHVsZV9FamIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0SmF2YSA8ZW0+SmF2YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkphdmE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRKYXZhKCkKLQkgKiBAc2VlICNnZXRNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1vZHVsZV9KYXZhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldFdlYiA8ZW0+V2ViPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V2ViPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0V2ViKCkKLQkgKiBAc2VlICNnZXRNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1vZHVsZV9XZWIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGUjZ2V0QWx0RGQgPGVtPkFsdCBEZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsdCBEZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldEFsdERkKCkKLQkgKiBAc2VlICNnZXRNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1vZHVsZV9BbHREZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlI2dldElkKCkKLQkgKiBAc2VlICNnZXRNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1vZHVsZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWIgPGVtPldlYjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XZWI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V2ViKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uV2ViI2dldFdlYlVyaSA8ZW0+V2ViIFVyaTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldlYiBVcmk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYiNnZXRXZWJVcmkoKQotCSAqIEBzZWUgI2dldFdlYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViX1dlYlVyaSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYiNnZXRDb250ZXh0Um9vdCA8ZW0+Q29udGV4dCBSb290PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29udGV4dCBSb290PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWIjZ2V0Q29udGV4dFJvb3QoKQotCSAqIEBzZWUgI2dldFdlYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViX0NvbnRleHRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uV2ViI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWIjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFdlYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRBcHBsaWNhdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUFBMSUNBVElPTiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fX0lDT05TID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX0ljb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9fTU9EVUxFUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpYnJhcnkgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fX0xJQlJBUllfRElSRUNUT1JZID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX0xpYnJhcnlEaXJlY3RvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fX0lEID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsIDxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfQXBwbGljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsIDxlbT5Nb2R1bGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldE1vZHVsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNT0RVTEUgPSBlSU5TVEFOQ0UuZ2V0TW9kdWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNT0RVTEVfX0NPTk5FQ1RPUiA9IGVJTlNUQU5DRS5nZXRNb2R1bGVfQ29ubmVjdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNT0RVTEVfX0VKQiA9IGVJTlNUQU5DRS5nZXRNb2R1bGVfRWpiKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTU9EVUxFX19KQVZBID0gZUlOU1RBTkNFLmdldE1vZHVsZV9KYXZhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNT0RVTEVfX1dFQiA9IGVJTlNUQU5DRS5nZXRNb2R1bGVfV2ViKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHQgRGQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNT0RVTEVfX0FMVF9ERCA9IGVJTlNUQU5DRS5nZXRNb2R1bGVfQWx0RGQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTU9EVUxFX19JRCA9IGVJTlNUQU5DRS5nZXRNb2R1bGVfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJJbXBsIDxlbT5XZWI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFdlYigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXRUIgPSBlSU5TVEFOQ0UuZ2V0V2ViKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgVXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX19XRUJfVVJJID0gZUlOU1RBTkNFLmdldFdlYl9XZWJVcmkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHQgUm9vdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9fQ09OVEVYVF9ST09UID0gZUlOU1RBTkNFLmdldFdlYl9Db250ZXh0Um9vdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfX0lEID0gZUlOU1RBTkNFLmdldFdlYl9JZCgpOwotCi0JfQotCi19IC8vQXBwbGljYXRpb25QYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViNDMyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQXBwbGljYXRpb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEFwcGxpY2F0aW9uU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb24oQXBwbGljYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcihBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTW9kdWxlKE1vZHVsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViKFdlYiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSA8ZW0+TW9kdWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5XZWIgPGVtPldlYjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLldlYgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDcxYWJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIEZhY3Rvcnk8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWwuQXBwbGljYXRpb25SZXNvdXJjZUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBBcHBsaWNhdGlvblJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLS8vCQlYTUxPcHRpb25zIHhtbE9wdGlvbnMgPSBuZXcgWE1MT3B0aW9uc0ltcGwoKTsKLS8vCi0vLwkJeG1sT3B0aW9ucy5zZXRQcm9jZXNzU2NoZW1hTG9jYXRpb25zKHRydWUpOwotLy8JCSAgICAKLS8vCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9YTUxfT1BUSU9OUywgeG1sT3B0aW9ucyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19IC8vQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25SZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc3ZjZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTExvYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5JQXBwbGljYXRpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSkVFWE1MTG9hZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSmF2YWVlUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklSb290T2JqZWN0UmVzb3VyY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSA8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWwuQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnlJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblJlc291cmNlSW1wbCBleHRlbmRzIEphdmFlZVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIElSb290T2JqZWN0UmVzb3VyY2UsIElBcHBsaWNhdGlvblJlc291cmNlIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25SZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQlwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgewotCQkgcmV0dXJuIG5ldyBKRUVYTUxMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCQotCQlyZXR1cm4gbmV3IEVhclhNTEhlbHBlckltcGwodGhpcyk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbC5JQXBwbGljYXRpb25SZXNvdXJjZSNnZXRSb290T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRSb290T2JqZWN0KCkgewotCQlpZiAoY29udGVudHMgPT0gbnVsbCB8fCBjb250ZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IHJvb3QgPSBnZXRDb250ZW50cygpLmdldCgwKTsKLQkJaWYocm9vdCA9PSBudWxsKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoRU9iamVjdCkoKEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3Ipcm9vdCkuZ2V0QXBwbGljYXRpb24oKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsLklBcHBsaWNhdGlvblJlc291cmNlI2dldEFwcGxpY2F0aW9uKCkKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb24pZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uUmVzb3VyY2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25Td2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTU4MTcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBBcHBsaWNhdGlvblBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvblN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTjogewotCQkJCUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKEFwcGxpY2F0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbihhcHBsaWNhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SOiB7Ci0JCQkJQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciBhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yID0gKEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IoYXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFOiB7Ci0JCQkJTW9kdWxlIG1vZHVsZSA9IChNb2R1bGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1vZHVsZShtb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQjogewotCQkJCVdlYiB3ZWIgPSAoV2ViKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWIod2ViKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcihBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZHVsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTW9kdWxlKE1vZHVsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlYihXZWIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25YTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblhNTFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjU0ODY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblhNTFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkudXRpbC5YTUxQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlciBtZXRob2RzIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgWE1MIGRvY3VtZW50cwotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25YTUxQcm9jZXNzb3IgZXh0ZW5kcyBYTUxQcm9jZXNzb3IgewotCS8qKgotCSAqIFB1YmxpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgaGVscGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvblhNTFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGZvciAiKiIgYW5kICJ4bWwiIGZpbGUgZXh0ZW5zaW9ucyB0aGUgQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnlJbXBsIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRSZWdpc3RyYXRpb25zKCkgewotCQlpZiAocmVnaXN0cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRSZWdpc3RyYXRpb25zKCk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChYTUxfRVhURU5TSU9OLCBuZXcgQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoU1RBUl9FWFRFTlNJT04sIG5ldyBBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJhdGlvbnM7Ci0JfQotCi19IC8vQXBwbGljYXRpb25YTUxQcm9jZXNzb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9FYXJYTUxIZWxwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvRWFyWE1MSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNiZWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9FYXJYTUxIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSkVFWE1MSGVscGVySW1wbDsKLQotcHVibGljIGNsYXNzIEVhclhNTEhlbHBlckltcGwgZXh0ZW5kcyBKRUVYTUxIZWxwZXJJbXBsIHsKLQotCXB1YmxpYyBFYXJYTUxIZWxwZXJJbXBsKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JCi0JcHVibGljIFN0cmluZyBnZXRVUkkoU3RyaW5nIHByZWZpeCkgewotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygiIikpCi0JCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRVUkkocHJlZml4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRRTmFtZShFUGFja2FnZSBlUGFja2FnZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gbXVzdEhhdmVQcmVmaXgpCi0JICB7Ci0JICAgU3RyaW5nIG5zUHJlZml4ID0gZ2V0UHJlZml4KGVQYWNrYWdlLCBtdXN0SGF2ZVByZWZpeCk7Ci0JLy8gTm90IHVzaW5nIEVFNSBwYWNrYWdlIG5hbWVzcGFjZSAtIGRlZmF1bHQgamVlNSBuYW1lc3BhY2UgaXMgdXNlZAotCSAgIGlmIChuc1ByZWZpeC5lcXVhbHMoQXBwbGljYXRpb25QYWNrYWdlLmVOU19QUkVGSVgpKSAKLQkgICAgewotCSAgICAJcmV0dXJuIG5hbWU7Ci0JICAgIH0KLQkgICAgZWxzZSByZXR1cm4gc3VwZXIuZ2V0UU5hbWUoZVBhY2thZ2UsIG5hbWUsIG11c3RIYXZlUHJlZml4KTsKLQkgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9BcHBsaWNhdGlvbkNsaWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9BcHBsaWNhdGlvbkNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzljOWJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvQXBwbGljYXRpb25DbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhdGlvbiBDbGllbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0Q2FsbGJhY2tIYW5kbGVyIDxlbT5DYWxsYmFjayBIYW5kbGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQ2xpZW50IGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9EaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfSWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnYgRW50cmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudiBFbnRyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfRW52RW50cmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RW52RW50cmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9FamJSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFamJSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlRW52UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfUGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X1Bvc3RDb25zdHJ1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBEZXN0cm95czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBEZXN0cm95czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X1ByZURlc3Ryb3lzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQcmVEZXN0cm95cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsbGJhY2sgSGFuZGxlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgY2FsbGJhY2staGFuZGxlciBlbGVtZW50IG5hbWVzIGEgY2xhc3MgcHJvdmlkZWQgYnkKLQkgKiAJICAgIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzCi0JICogCSAgICBjb25zdHJ1Y3RvciBhbmQgbXVzdCBpbXBsZW1lbnQgdGhlCi0JICogCSAgICBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcgotCSAqIAkgICAgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZQotCSAqIAkgICAgYXBwbGljYXRpb24gY2xpZW50IGNvbnRhaW5lciBhbmQgdXNlZCBieSB0aGUgY29udGFpbmVyCi0JICogCSAgICB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbGxiYWNrIEhhbmRsZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhbGxiYWNrSGFuZGxlcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2FsbGJhY2tIYW5kbGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldENhbGxiYWNrSGFuZGxlciA8ZW0+Q2FsbGJhY2sgSGFuZGxlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsbGJhY2sgSGFuZGxlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FsbGJhY2tIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxsYmFja0hhbmRsZXIoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICBUaGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGRlZmluZXMgd2hldGhlciB0aGlzCi0JICogCSAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCBvdGhlciByZWxhdGVkIGRlcGxveW1lbnQKLQkgKiAJICBkZXNjcmlwdG9ycyBmb3IgdGhpcyBtb2R1bGUgKGUuZy4sIHdlYiBzZXJ2aWNlCi0JICogCSAgZGVzY3JpcHRvcnMpIGFyZSBjb21wbGV0ZSwgb3Igd2hldGhlciB0aGUgY2xhc3MKLQkgKiAJICBmaWxlcyBhdmFpbGFibGUgdG8gdGhpcyBtb2R1bGUgYW5kIHBhY2thZ2VkIHdpdGgKLQkgKiAJICB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgYW5ub3RhdGlvbnMKLQkgKiAJICB0aGF0IHNwZWNpZnkgZGVwbG95bWVudCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiAJICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBzZXQgdG8gInRydWUiLCB0aGUgZGVwbG95bWVudAotCSAqIAkgIHRvb2wgbXVzdCBpZ25vcmUgYW55IGFubm90YXRpb25zIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50Ci0JICogCSAgaW5mb3JtYXRpb24sIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlIGNsYXNzIGZpbGVzCi0JICogCSAgb2YgdGhlIGFwcGxpY2F0aW9uLgotCSAqIAotCSAqIAkgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvCi0JICogCSAgImZhbHNlIiwgdGhlIGRlcGxveW1lbnQgdG9vbCBtdXN0IGV4YW1pbmUgdGhlIGNsYXNzCi0JICogCSAgZmlsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBhbm5vdGF0aW9ucywgYXMKLQkgKiAJICBzcGVjaWZpZWQgYnkgdGhlIHNwZWNpZmljYXRpb25zLgotCSAqIAotCSAqIAkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01ldGFkYXRhQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1ldGFkYXRhQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgNS4KLQkgKiAKLQkgKiAJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCi0JICogQHNlZSAjdW5zZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZlcnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWZXJzaW9uKCk7Ci0KLX0gLy8gQXBwbGljYXRpb25DbGllbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjgzODA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciNnZXRBcHBsaWNhdGlvbkNsaWVudCA8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0TWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbiBDbGllbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAlUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbgotCSAqIAlhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uCi0JICogCWNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cwotCSAqIAlhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uCi0JICogCWNsaWVudC4KLQkgKiAKLQkgKiAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBcHBsaWNhdGlvbkNsaWVudChBcHBsaWNhdGlvbkNsaWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfQXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvbkNsaWVudCBnZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yI2dldEFwcGxpY2F0aW9uQ2xpZW50IDxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFwcGxpY2F0aW9uQ2xpZW50KEFwcGxpY2F0aW9uQ2xpZW50IHZhbHVlKTsKLQotfSAvLyBBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9BcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvQXBwbGljYXRpb25jbGllbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZWJkNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9BcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25jbGllbnRGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvbkNsaWVudCBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb25jbGllbnRQYWNrYWdlIGdldEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSgpOwotCi19IC8vQXBwbGljYXRpb25jbGllbnRGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0lBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0lBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NjQxODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9JQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBnZXRSb290T2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVhcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBBcHBsaWNhdGlvbkNsaWVudCBnZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjMGU4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVFTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhdGlvbiBDbGllbnQgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldEFwcGxpY2F0aW9uQ2xpZW50IDxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWl4ZWQoKSA8ZW0+TWl4ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWl4ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIG1peGVkID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4TUxOU1ByZWZpeE1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeFNJU2NoZW1hTG9jYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0TWl4ZWQoKSB7Ci0JCWlmIChtaXhlZCA9PSBudWxsKSB7Ci0JCQltaXhlZCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEKTsKLQkJfQotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKLQkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKLQkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQKTsKLQkJfQotCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAubWFwKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKLQkJfQotCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24ubWFwKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgewotCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50KWdldE1peGVkKCkuZ2V0KEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5MaXRlcmFscy5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTl9DTElFTlQsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFwcGxpY2F0aW9uQ2xpZW50KEFwcGxpY2F0aW9uQ2xpZW50IG5ld0FwcGxpY2F0aW9uQ2xpZW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuYmFzaWNBZGQoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0NMSUVOVCwgbmV3QXBwbGljYXRpb25DbGllbnQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uQ2xpZW50KEFwcGxpY2F0aW9uQ2xpZW50IG5ld0FwcGxpY2F0aW9uQ2xpZW50KSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0NMSUVOVCwgbmV3QXBwbGljYXRpb25DbGllbnQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0NMSUVOVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBcHBsaWNhdGlvbkNsaWVudChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0TWl4ZWQoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0NMSUVOVDoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZykoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTl9DTElFTlQ6Ci0JCQkJc2V0QXBwbGljYXRpb25DbGllbnQoKEFwcGxpY2F0aW9uQ2xpZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJZ2V0TWl4ZWQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0NMSUVOVDoKLQkJCQlzZXRBcHBsaWNhdGlvbkNsaWVudCgoQXBwbGljYXRpb25DbGllbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQlyZXR1cm4gbWl4ZWQgIT0gbnVsbCAmJiAhbWl4ZWQuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAgIT0gbnVsbCAmJiAheE1MTlNQcmVmaXhNYXAuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAheFNJU2NoZW1hTG9jYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fQ0xJRU5UOgotCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbkNsaWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtaXhlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjJiNTdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhdGlvbiBDbGllbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldENhbGxiYWNrSGFuZGxlciA8ZW0+Q2FsbGJhY2sgSGFuZGxlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkNsaWVudCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaWNvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cmllcygpIDxlbT5FbnYgRW50cmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnZFbnRyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW52RW50cmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZzKCkgPGVtPkVqYiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZzKCkgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlcnZpY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlUmVmcygpIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUVudlJlZnMoKSA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VFbnZSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwZXJzaXN0ZW5jZVVuaXRSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3RDb25zdHJ1Y3RzKCkgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Q29uc3RydWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvc3RDb25zdHJ1Y3RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZURlc3Ryb3lzKCkgPGVtPlByZSBEZXN0cm95czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVEZXN0cm95cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByZURlc3Ryb3lzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxsYmFja0hhbmRsZXIoKSA8ZW0+Q2FsbGJhY2sgSGFuZGxlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsbGJhY2tIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMQkFDS19IQU5ETEVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGxiYWNrSGFuZGxlcigpIDxlbT5DYWxsYmFjayBIYW5kbGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxsYmFja0hhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2FsbGJhY2tIYW5kbGVyID0gQ0FMTEJBQ0tfSEFORExFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1lc3NhZ2VEZXN0aW5hdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXRhZGF0YUNvbXBsZXRlKCkgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXRhZGF0YUNvbXBsZXRlKCkgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGUgPSBNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWV0YWRhdGEgQ29tcGxldGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIjUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZlcnNpb24gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25DbGllbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0NMSUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKLQkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lDT05TKTsKLQkJfQotCQlyZXR1cm4gaWNvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RW52RW50cmllcygpIHsKLQkJaWYgKGVudkVudHJpZXMgPT0gbnVsbCkgewotCQkJZW52RW50cmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFbnZFbnRyeS5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WX0VOVFJJRVMpOwotCQl9Ci0JCXJldHVybiBlbnZFbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYlJlZnMoKSB7Ci0JCWlmIChlamJSZWZzID09IG51bGwpIHsKLQkJCWVqYlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiUmVmLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYlJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmljZVJlZnMoKSB7Ci0JCWlmIChzZXJ2aWNlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiBzZXJ2aWNlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXNvdXJjZVJlZnMoKSB7Ci0JCWlmIChyZXNvdXJjZVJlZnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlUmVmLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlRW52UmVmcygpIHsKLQkJaWYgKHJlc291cmNlRW52UmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUVudlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VFbnZSZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25SZWZzID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXRSZWZzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbmNlVW5pdFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QRVJTSVNURU5DRV9VTklUX1JFRlMpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCkgewotCQlpZiAocG9zdENvbnN0cnVjdHMgPT0gbnVsbCkgewotCQkJcG9zdENvbnN0cnVjdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BPU1RfQ09OU1RSVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByZURlc3Ryb3lzKCkgewotCQlpZiAocHJlRGVzdHJveXMgPT0gbnVsbCkgewotCQkJcHJlRGVzdHJveXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BSRV9ERVNUUk9ZUyk7Ci0JCX0KLQkJcmV0dXJuIHByZURlc3Ryb3lzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FsbGJhY2tIYW5kbGVyKCkgewotCQlyZXR1cm4gY2FsbGJhY2tIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGxiYWNrSGFuZGxlcihTdHJpbmcgbmV3Q2FsbGJhY2tIYW5kbGVyKSB7Ci0JCVN0cmluZyBvbGRDYWxsYmFja0hhbmRsZXIgPSBjYWxsYmFja0hhbmRsZXI7Ci0JCWNhbGxiYWNrSGFuZGxlciA9IG5ld0NhbGxiYWNrSGFuZGxlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUiwgb2xkQ2FsbGJhY2tIYW5kbGVyLCBjYWxsYmFja0hhbmRsZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgewotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9ucyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiBtZXRhZGF0YUNvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbiBuZXdNZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCWJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JCW1ldGFkYXRhQ29tcGxldGUgPSBuZXdNZXRhZGF0YUNvbXBsZXRlOwotCQlib29sZWFuIG9sZE1ldGFkYXRhQ29tcGxldGVFU2V0ID0gbWV0YWRhdGFDb21wbGV0ZUVTZXQ7Ci0JCW1ldGFkYXRhQ29tcGxldGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVUQURBVEFfQ09NUExFVEUsIG9sZE1ldGFkYXRhQ29tcGxldGUsIG1ldGFkYXRhQ29tcGxldGUsICFvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCA9IG1ldGFkYXRhQ29tcGxldGVFU2V0OwotCQltZXRhZGF0YUNvbXBsZXRlID0gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQ7Ci0JCW1ldGFkYXRhQ29tcGxldGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVUQURBVEFfQ09NUExFVEUsIG9sZE1ldGFkYXRhQ29tcGxldGUsIE1FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxULCBvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIG1ldGFkYXRhQ29tcGxldGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlib29sZWFuIG9sZFZlcnNpb25FU2V0ID0gdmVyc2lvbkVTZXQ7Ci0JCXZlcnNpb25FU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbiwgIW9sZFZlcnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWZXJzaW9uKCkgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCWJvb2xlYW4gb2xkVmVyc2lvbkVTZXQgPSB2ZXJzaW9uRVNldDsKLQkJdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0JCXZlcnNpb25FU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgVkVSU0lPTl9FREVGQVVMVCwgb2xkVmVyc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZFbnRyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZUVudlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvc3RDb25zdHJ1Y3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UHJlRGVzdHJveXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuIGdldEVudkVudHJpZXMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYlJlZnMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmcygpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZVJlZnMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlRW52UmVmcygpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gZ2V0UG9zdENvbnN0cnVjdHMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiBnZXRQcmVEZXN0cm95cygpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSOgotCQkJCXJldHVybiBnZXRDYWxsYmFja0hhbmRsZXIoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc01ldGFkYXRhQ29tcGxldGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WX0VOVFJJRVM6Ci0JCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW52RW50cmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGUzoKLQkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5jbGVhcigpOwotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BSRV9ERVNUUk9ZUzoKLQkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUjoKLQkJCQlzZXRDYWxsYmFja0hhbmRsZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJc2V0TWV0YWRhdGFDb21wbGV0ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VOVl9FTlRSSUVTOgotCQkJCWdldEVudkVudHJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QUkVfREVTVFJPWVM6Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUjoKLQkJCQlzZXRDYWxsYmFja0hhbmRsZXIoQ0FMTEJBQ0tfSEFORExFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXVuc2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTjoKLQkJCQl1bnNldFZlcnNpb24oKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiBlbnZFbnRyaWVzICE9IG51bGwgJiYgIWVudkVudHJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZWpiUmVmcyAhPSBudWxsICYmICFlamJSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBzZXJ2aWNlUmVmcyAhPSBudWxsICYmICFzZXJ2aWNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlUmVmcyAhPSBudWxsICYmICFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzICE9IG51bGwgJiYgIXJlc291cmNlRW52UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmcyAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25SZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZzICE9IG51bGwgJiYgIXBlcnNpc3RlbmNlVW5pdFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzICE9IG51bGwgJiYgIXBvc3RDb25zdHJ1Y3RzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiBwcmVEZXN0cm95cyAhPSBudWxsICYmICFwcmVEZXN0cm95cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVI6Ci0JCQkJcmV0dXJuIENBTExCQUNLX0hBTkRMRVJfRURFRkFVTFQgPT0gbnVsbCA/IGNhbGxiYWNrSGFuZGxlciAhPSBudWxsIDogIUNBTExCQUNLX0hBTkRMRVJfRURFRkFVTFQuZXF1YWxzKGNhbGxiYWNrSGFuZGxlcik7Ci0JCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25zICE9IG51bGwgJiYgIW1lc3NhZ2VEZXN0aW5hdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGlzU2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OOgotCQkJCXJldHVybiBpc1NldFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNhbGxiYWNrSGFuZGxlcjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjYWxsYmFja0hhbmRsZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXRhZGF0YUNvbXBsZXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWV0YWRhdGFDb21wbGV0ZUVTZXQpIHJlc3VsdC5hcHBlbmQobWV0YWRhdGFDb21wbGV0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZlcnNpb25FU2V0KSByZXN1bHQuYXBwZW5kKHZlcnNpb24pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbkNsaWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25jbGllbnRGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uY2xpZW50RmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkODRlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25jbGllbnRGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJQXBwbGljYXRpb25jbGllbnRGYWN0b3J5IHRoZUFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeSA9IChBcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudCIpOyAvLyROT04tTkxTLTEkIAotCQkJaWYgKHRoZUFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZUFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBBcHBsaWNhdGlvbmNsaWVudEZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25jbGllbnRGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXBwbGljYXRpb25DbGllbnQoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCkgewotCQlBcHBsaWNhdGlvbkNsaWVudEltcGwgYXBwbGljYXRpb25DbGllbnQgPSBuZXcgQXBwbGljYXRpb25DbGllbnRJbXBsKCk7Ci0JCXJldHVybiBhcHBsaWNhdGlvbkNsaWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCBhcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yID0gbmV3IEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiBhcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UgZ2V0QXBwbGljYXRpb25jbGllbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vQXBwbGljYXRpb25jbGllbnRGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZGJkNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwubmFtZXNwYWNlLlhNTE5hbWVzcGFjZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbmNsaWVudEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXBwbGljYXRpb25DbGllbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgQXBwbGljYXRpb25jbGllbnRGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlID0gKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxOYW1lc3BhY2VQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVdlYlBhY2thZ2VJbXBsIHRoZVdlYlBhY2thZ2UgPSAoV2ViUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgOiBXZWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmF2YWVlUGFja2FnZUltcGwgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEphdmFlZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSA6IEphdmFlZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YWVlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcHBsaWNhdGlvbkNsaWVudCgpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRGlzcGxheU5hbWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9JY29ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRW52RW50cmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9Qb3N0Q29uc3RydWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1ByZURlc3Ryb3lzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnRfTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfQXBwbGljYXRpb25DbGllbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeSBnZXRBcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25jbGllbnRGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFQUExJQ0FUSU9OX0NMSUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19JQ09OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WX0VOVFJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fUE9TVF9DT05TVFJVQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19QUkVfREVTVFJPWVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVUQURBVEFfQ09NUExFVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT04pOwotCi0JCWFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0NMSUVOVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUphdmFlZVBhY2thZ2UgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIkFwcGxpY2F0aW9uQ2xpZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0VudkVudHJpZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFbnZFbnRyeSgpLCBudWxsLCAiZW52RW50cmllcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9FamJSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VSZWYoKSwgbnVsbCwgInJlc291cmNlUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZUVudlJlZigpLCBudWxsLCAicmVzb3VyY2VFbnZSZWZzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfUGVyc2lzdGVuY2VVbml0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlVW5pdFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0UmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9Qb3N0Q29uc3RydWN0cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwb3N0Q29uc3RydWN0cyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9QcmVEZXN0cm95cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVEZXN0cm95cyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiY2FsbGJhY2tIYW5kbGVyIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25DbGllbnRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25DbGllbnRfTWV0YWRhdGFDb21wbGV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJtZXRhZGF0YUNvbXBsZXRlIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERld2V5VmVyc2lvblR5cGUoKSwgInZlcnNpb24iLCAiNSIsIDEsIDEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IuY2xhc3MsICJBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgIm1peGVkIiwgbnVsbCwgMCwgLTEsIG51bGwsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4TUxOU1ByZWZpeE1hcCIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX0FwcGxpY2F0aW9uQ2xpZW50KCksIHRoaXMuZ2V0QXBwbGljYXRpb25DbGllbnQoKSwgbnVsbCwgImFwcGxpY2F0aW9uQ2xpZW50IiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI7IC8vJE5PTi1OTFMtMSQJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiYXBwbGljYXRpb24tY2xpZW50VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudF9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X0Rpc3BsYXlOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X0ljb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpY29uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X0VudkVudHJpZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVudi1lbnRyeSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X0VqYlJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmljZS1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZXNvdXJjZS1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLWVudi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X1BlcnNpc3RlbmNlVW5pdFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLXVuaXQtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfUG9zdENvbnN0cnVjdHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBvc3QtY29uc3RydWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfUHJlRGVzdHJveXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInByZS1kZXN0cm95IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiY2FsbGJhY2staGFuZGxlciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50X01ldGFkYXRhQ29tcGxldGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWV0YWRhdGEtY29tcGxldGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudF9WZXJzaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInZlcnNpb24iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgIm1peGVkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnRXaWxkY2FyZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIjptaXhlZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ4bWxuczpwcmVmaXgiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAieHNpOnNjaGVtYUxvY2F0aW9uIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbkNsaWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYXBwbGljYXRpb24tY2xpZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvbWV0YWRhdGEvQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL21ldGFkYXRhL0FwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNjNjcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvbWV0YWRhdGEvQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqICAgICAgIEAoIylhcHBsaWNhdGlvbi1jbGllbnRfNS54c2RzCTEuMjYgMDIvMTcvMDYKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAgICAgICAKLSAqIAotICogCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgNQotICogCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdAotICogCWJlIG5hbWVkICJNRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIiBpbiB0aGUKLSAqIAlhcHBsaWNhdGlvbiBjbGllbnQncyBqYXIgZmlsZS4gIEFsbCBhcHBsaWNhdGlvbiBjbGllbnQKLSAqIAlkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlIGFwcGxpY2F0aW9uCi0gKiAJY2xpZW50IHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0gKiAKLSAqIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAqIAotICogCWFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gKiAJdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLSAqIAotICogCSAgICAmbHQ7YXBwbGljYXRpb24tY2xpZW50IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gKiAJICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAqIAkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICogCQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIgotICogCSAgICAgIHZlcnNpb249IjUiJmd0OwotICogCSAgICAgIC4uLgotICogCSAgICAmbHQ7L2FwcGxpY2F0aW9uLWNsaWVudCZndDsKLSAqIAotICogCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotICogCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLSAqIAluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotICogCi0gKiAJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZAotICogCi0gKiAJCi0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICogICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotICogCi0gKiAgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gKiAJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAqIAl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAqIAlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICogCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICogCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfNS54c2RzCTEuNjUgMDYvMDIvMTcKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAKLSAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgotICogc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCi0gKiBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6Ci0gKiAKLSAqIERlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBqMmVlIGFwcGxpY2F0aW9uOwotICogICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKLSAqICAgICB3ZWIgYXBwbGljYXRpb247Ci0gKiAgICAgZW50ZXJwcmlzZSBiZWFuOwotICogICAgIHJlc291cmNlIGFkYXB0ZXI7Ci0gKiAKLSAqIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgZWFyIGZpbGU7Ci0gKiAgICAgd2FyIGZpbGU7Ci0gKiAgICAgamFyIGZpbGU7Ci0gKiAgICAgcmFyIGZpbGU7Ci0gKiAKLSAqIAotICogCi0gKiAgICAgICBAKCMpamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZHMJMS4xOSAwMi8xMy8wNgotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLSAqIAotICogICAgIAotICogCi0gKiAgICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gKiAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAqIAotICogICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCi0gKiAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgCi0gKiAKLSAqICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQKLSAqICAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUKLSAqICAgICBmb2xsb3dpbmcgbmFtZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFuZCBzaG91bGQKLSAqICAgICBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZyBHcm91cCwKLSAqICAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZToKLSAqIAotICogICAgIGJhc2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkKLSAqICAgICAgICAgIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoIGl0Ci0gKiAgICAgICAgICBhcHBlYXJzOyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBpZCAgIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4KLSAqICAgICAgICAgIFRoZSB4bWw6aWQgc3BlY2lmaWNhdGlvbiBpcyBub3QgeWV0IGEgVzNDIFJlY29tbWVuZGF0aW9uLAotICogICAgICAgICAgYnV0IHRoaXMgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGhlcmUgdG8gZmFjaWxpdGF0ZSBleHBlcmltZW50YXRpb24KLSAqICAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQKLSAqICAgICAgICAgIGluIHRoZSBzcGVjaWFsQXR0cnMgYXR0cmlidXRlIGdyb3VwLgotICogCi0gKiAgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgotICogICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAgIAotICogICAgIHNwYWNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlCi0gKiAgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZwotICogICAgICAgICAgZGlzY2lwbGluZSBpcyBpbnRlbmRlZCBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQ7IGl0cwotICogICAgICAgICAgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IHZpcnR1ZSBvZiBpdHMKLSAqICAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgRmF0aGVyIChpbiBhbnkgY29udGV4dCBhdCBhbGwpOiBkZW5vdGVzIEpvbiBCb3NhaywgdGhlIGNoYWlyIG9mIAotICogICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IAotICogICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNpc2lvbiBvZiB0aGUgVzNDIFhNTCBQbGVuYXJ5IGFuZCAKLSAqICAgICAgICAgIFhNTCBDb29yZGluYXRpb24gZ3JvdXBzOgotICogCi0gKiAgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCi0gKiAgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQotICogICAgICAgICAgICAgIHhtbDpGYXRoZXIKLSAqICAgCi0gKiBUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICogICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gKiAgICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcsIHhtbDpzcGFjZSBvciB4bWw6aWQKLSAqICAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KLSAqIAotICogICAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYQotICogICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKLSAqICAgICAgICAgJmx0O3NjaGVtYSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICogICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8mZ3Q7Ci0gKiAKLSAqICAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICogICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCi0gKiAKLSAqICAgICAgICAgJmx0O3R5cGUgLiAuIC4mZ3Q7Ci0gKiAgICAgICAgICAuIC4gLgotICogICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OwotICogIAotICogICAgICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlCi0gKiAgICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMKLSAqIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKLSAqICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2QuCi0gKiAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkLgotICogICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKLSAqICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTCBTY2hlbWEKLSAqICAgIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTAotICogICAgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIHdpbGwgY2hhbmdlCi0gKiAgICBhY2NvcmRpbmdseTsgdGhlIHZlcnNpb24gYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuCi0gKiAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJhcHBsaWNhdGlvbmNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAiYXBwbGljYXRpb25jbGllbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwgPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19JQ09OUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WX0VOVFJJRVMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlMgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fUE9TVF9DT05TVFJVQ1RTID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1BSRV9ERVNUUk9ZUyA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGxiYWNrIEhhbmRsZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVIgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUyA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19JRCA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19NRVRBREFUQV9DT01QTEVURSA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT04gPSAxNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZFQVRVUkVfQ09VTlQgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsIDxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCNnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVAgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbiBDbGllbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTl9DTElFTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCA8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkljb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRJY29ucygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW52IEVudHJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldEVudkVudHJpZXMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZFbnRyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldEVqYlJlZnMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9FamJSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0UmVzb3VyY2VSZWZzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0UmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRQb3N0Q29uc3RydWN0cygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1Bvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmUgRGVzdHJveXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFByZURlc3Ryb3lzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUHJlRGVzdHJveXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRDYWxsYmFja0hhbmRsZXIgPGVtPkNhbGxiYWNrIEhhbmRsZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYWxsYmFjayBIYW5kbGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRDYWxsYmFja0hhbmRsZXIoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjaXNNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnRfTWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yIDxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NaXhlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciNnZXRNaXhlZCgpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yI2dldEFwcGxpY2F0aW9uQ2xpZW50IDxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfQXBwbGljYXRpb25DbGllbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeSBnZXRBcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwgPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUFBMSUNBVElPTl9DTElFTlQgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19JQ09OUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9JY29ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WX0VOVFJJRVMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfRW52RW50cmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfUGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX1BPU1RfQ09OU1RSVUNUUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9Qb3N0Q29uc3RydWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX1BSRV9ERVNUUk9ZUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9QcmVEZXN0cm95cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FsbGJhY2sgSGFuZGxlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fQ0xJRU5UX19JRCA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9DTElFTlRfX01FVEFEQVRBX0NPTVBMRVRFID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X01ldGFkYXRhQ29tcGxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsIDxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwjZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbiBDbGllbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTl9DTElFTlQgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbkNsaWVudCgpOwotCi0JfQotCi19IC8vQXBwbGljYXRpb25jbGllbnRQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwQ2xpZW50WE1MSGVscGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcENsaWVudFhNTEhlbHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3MWMzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwQ2xpZW50WE1MSGVscGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsLkpFRVhNTEhlbHBlckltcGw7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRYTUxIZWxwZXJJbXBsIGV4dGVuZHMgSkVFWE1MSGVscGVySW1wbCB7Ci0KLQlwdWJsaWMgQXBwQ2xpZW50WE1MSGVscGVySW1wbChYTUxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzdXBlcihyZXNvdXJjZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoIiIpKQotCQkJcmV0dXJuIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VVJJKHByZWZpeCk7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UU5hbWUoRVBhY2thZ2UgZVBhY2thZ2UsIFN0cmluZyBuYW1lLCBib29sZWFuIG11c3RIYXZlUHJlZml4KQotCSAgewotCSAgIFN0cmluZyBuc1ByZWZpeCA9IGdldFByZWZpeChlUGFja2FnZSwgbXVzdEhhdmVQcmVmaXgpOwotCSAgIC8vIE5vdCB1c2luZyBFRTUgcGFja2FnZSBuYW1lc3BhY2UgLSBkZWZhdWx0IGplZTUgbmFtZXNwYWNlIGlzIHVzZWQKLQkgICBpZiAobnNQcmVmaXguZXF1YWxzKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfUFJFRklYKSkgCi0JICAgIHsKLQkgICAgCXJldHVybiBuYW1lOwotCSAgICB9Ci0JICAgIGVsc2UgcmV0dXJuIHN1cGVyLmdldFFOYW1lKGVQYWNrYWdlLCBuYW1lLCBtdXN0SGF2ZVByZWZpeCk7Ci0JICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDNkZjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbmNsaWVudEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbmNsaWVudEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25jbGllbnRTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgQXBwbGljYXRpb25jbGllbnRTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudChBcHBsaWNhdGlvbkNsaWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25DbGllbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCA8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25DbGllbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+QXBwbGljYXRpb24gQ2xpZW50IERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbmNsaWVudEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzY0NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxPcHRpb25zSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIEZhY3Rvcnk8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLnV0aWwuQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBBcHBsaWNhdGlvbmNsaWVudFJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJWE1MT3B0aW9ucyB4bWxPcHRpb25zID0gbmV3IFhNTE9wdGlvbnNJbXBsKCk7Ci0KLQkJeG1sT3B0aW9ucy5zZXRQcm9jZXNzU2NoZW1hTG9jYXRpb25zKHRydWUpOwotCQkgICAgCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1hNTF9PUFRJT05TLCB4bWxPcHRpb25zKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhY2Y0ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LklBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KRUVYTUxMb2FkSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXZhZWVSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSVJvb3RPYmplY3RSZXNvdXJjZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwudXRpbC5BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlRmFjdG9yeUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VJbXBsIGV4dGVuZHMgSmF2YWVlUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgSVJvb3RPYmplY3RSZXNvdXJjZSwgSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2V7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhNTExvYWQgY3JlYXRlWE1MTG9hZCgpIHsKLQkJIHJldHVybiBuZXcgSkVFWE1MTG9hZEltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQotCQotCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgewotCQkKLQkJcmV0dXJuIG5ldyBBcHBDbGllbnRYTUxIZWxwZXJJbXBsKHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLnV0aWwuSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UjZ2V0Um9vdE9iamVjdCgpCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpIHsKLQkJaWYgKGNvbnRlbnRzID09IG51bGwgfHwgY29udGVudHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCByb290ID0gZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCWlmKHJvb3QgPT0gbnVsbCl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKEVPYmplY3QpKChBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKXJvb3QpLmdldEFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwudXRpbC5JQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgewotCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50KWdldFJvb3RPYmplY3QoKTsKLQkJCi0JfQotCi19IC8vQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50U3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZWY0Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50U3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uY2xpZW50U3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uY2xpZW50U3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVDogewotCQkJCUFwcGxpY2F0aW9uQ2xpZW50IGFwcGxpY2F0aW9uQ2xpZW50ID0gKEFwcGxpY2F0aW9uQ2xpZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkNsaWVudChhcHBsaWNhdGlvbkNsaWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUjogewotCQkJCUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IgYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciA9IChBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKGFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudChBcHBsaWNhdGlvbkNsaWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50IERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcihBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbmNsaWVudFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50WE1MUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRYTUxQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4NDFiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRYTUxQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLnV0aWwuWE1MUHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIFhNTCBkb2N1bWVudHMKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uY2xpZW50WE1MUHJvY2Vzc29yIGV4dGVuZHMgWE1MUHJvY2Vzc29yIHsKLQkvKioKLQkgKiBQdWJsaWMgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgdGhlIGhlbHBlci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25jbGllbnRYTUxQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRSkpOwotCQlBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBmb3IgIioiIGFuZCAieG1sIiBmaWxlIGV4dGVuc2lvbnMgdGhlIEFwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VGYWN0b3J5SW1wbCBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0UmVnaXN0cmF0aW9ucygpIHsKLQkJaWYgKHJlZ2lzdHJhdGlvbnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UmVnaXN0cmF0aW9ucygpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoWE1MX0VYVEVOU0lPTiwgbmV3IEFwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJCXJlZ2lzdHJhdGlvbnMucHV0KFNUQVJfRVhURU5TSU9OLCBuZXcgQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQl9Ci0JCXJldHVybiByZWdpc3RyYXRpb25zOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uY2xpZW50WE1MUHJvY2Vzc29yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9EZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZjMmYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9EZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8KLSAqIAlwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZWxlbWVudHMKLSAqIAl0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlCi0gKiAJRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cwotICogCXRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0gKiAJRGVwbG95bWVudCBGaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZQotICogCXRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkKLSAqIAl0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0Ci0gKiAJY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotICogCi0gKiAJVGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi0gKiAJZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24jZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24jZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RGVzY3JpcHRpb24oKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRpb24gZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RGVzY3JpcHRpb25fVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEF0dGVtcHRpbmcgdG8gaW5zdGFsbCB0aGUgcmVsZXZhbnQgSVNPIDItIGFuZCAzLWxldHRlcgotCSAqICAgICAgICAgIGNvZGVzIGFzIHRoZSBlbnVtZXJhdGVkIHBvc3NpYmxlIHZhbHVlcyBpcyBwcm9iYWJseSBuZXZlcgotCSAqICAgICAgICAgIGdvaW5nIHRvIGJlIGEgcmVhbGlzdGljIHBvc3NpYmlsaXR5LiAgU2VlCi0JICogICAgICAgICAgUkZDIDMwNjYgYXQgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzA2Ni50eHQgYW5kIHRoZSBJQU5BIHJlZ2lzdHJ5Ci0JICogICAgICAgICAgYXQgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9sYW5nLXRhZy1hcHBzLmh0bSBmb3IKLQkgKiAgICAgICAgICBmdXJ0aGVyIGluZm9ybWF0aW9uLgotCSAqIAotCSAqICAgICAgICAgIFRoZSB1bmlvbiBhbGxvd3MgZm9yIHRoZSAndW4tZGVjbGFyYXRpb24nIG9mIHhtbDpsYW5nIHdpdGgKLQkgKiAgICAgICAgICB0aGUgZW1wdHkgc3RyaW5nLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERlc2NyaXB0aW9uX0xhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGFuZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhbmcoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9EaXNwbGF5TmFtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0Rpc3BsYXlOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMjk2MWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0Rpc3BsYXlOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCQotICogCi0gKiAJICBUaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKLSAqIAkgIHRvIGJlIGRpc3BsYXllZCBieSB0b29scy4gSXQgaXMgdXNlZCBieSBkaXNwbGF5LW5hbWUKLSAqIAkgIGVsZW1lbnRzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCi0gKiAKLSAqIAkgIEV4YW1wbGU6Ci0gKiAKLSAqIAkgIC4uLgotICogCSAgICAgJmx0O2Rpc3BsYXktbmFtZSB4bWw6bGFuZz0iZW4iJmd0OwotICogCSAgICAgICBFbXBsb3llZSBTZWxmIFNlcnZpY2UKLSAqIAkgICAgICZsdDsvZGlzcGxheS1uYW1lJmd0OwotICogCi0gKiAJICBUaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0LgotICogCi0gKiAJICAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXREaXNwbGF5TmFtZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNwbGF5TmFtZSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXREaXNwbGF5TmFtZV9WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQXR0ZW1wdGluZyB0byBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCi0JICogICAgICAgICAgY29kZXMgYXMgdGhlIGVudW1lcmF0ZWQgcG9zc2libGUgdmFsdWVzIGlzIHByb2JhYmx5IG5ldmVyCi0JICogICAgICAgICAgZ29pbmcgdG8gYmUgYSByZWFsaXN0aWMgcG9zc2liaWxpdHkuICBTZWUKLQkgKiAgICAgICAgICBSRkMgMzA2NiBhdCBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzMDY2LnR4dCBhbmQgdGhlIElBTkEgcmVnaXN0cnkKLQkgKiAgICAgICAgICBhdCBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2xhbmctdGFnLWFwcHMuaHRtIGZvcgotCSAqICAgICAgICAgIGZ1cnRoZXIgaW5mb3JtYXRpb24uCi0JICogCi0JICogICAgICAgICAgVGhlIHVuaW9uIGFsbG93cyBmb3IgdGhlICd1bi1kZWNsYXJhdGlvbicgb2YgeG1sOmxhbmcgd2l0aAotCSAqICAgICAgICAgIHRoZSBlbXB0eSBzdHJpbmcuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RGlzcGxheU5hbWVfTGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWUjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFuZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIERpc3BsYXlOYW1lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VqYkxvY2FsUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRWpiTG9jYWxSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmYmY1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRWpiTG9jYWxSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWpiIExvY2FsIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3IKLSAqIAl0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwKLSAqIAlob21lIG9yIHRvIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KLSAqICAgICAgICAgVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotICogCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqIAkgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIERlcGxveW1lbnQKLSAqIAkgICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uCi0gKiAJICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gKiAJICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGxvY2FsIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZAotICogICAgICAgICAgICAgICBlbnRlcnByaXNlIGJlYW4gb3IgdGhlIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0gKiAJICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGxvY2FsIGhvbWUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkCi0gKiAgICAgICAgICAgICAgIGVudGVycHJpc2UgYmVhbi4gTm90IGFwcGxpY2FibGUgaWYgdGhpcyBlamItbG9jYWwtcmVmIHJlZmVycwotICogICAgICAgICAgICAgICB0byB0aGUgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCi0gKiAJICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLSAqIAkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICogICAgICAgICAgICAgLSBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mIHRoZSBuYW1lZCBlbnRlcnByaXNlCi0gKiAgICAgICAgICAgICAgIGJlYW4gaW50byBhIGNvbXBvbmVudCBmaWVsZCBvciBwcm9wZXJ0eS4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiUmVmTmFtZSA8ZW0+RWpiIFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TG9jYWxIb21lIDxlbT5Mb2NhbCBIb21lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TG9jYWwgPGVtPkxvY2FsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJMb2NhbFJlZigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFamJMb2NhbFJlZiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYkxvY2FsUmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYlJlZk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiTG9jYWxSZWZfRWpiUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFamJSZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiUmVmTmFtZSA8ZW0+RWpiIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYlJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYlJlZk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJFbnRpdHkiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVmIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlCi0JICogQHNlZSAjaXNTZXRFamJSZWZUeXBlKCkKLQkgKiBAc2VlICN1bnNldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI3NldEVqYlJlZlR5cGUoRWpiUmVmVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYkxvY2FsUmVmX0VqYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFamJSZWZUeXBlIGdldEVqYlJlZlR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRFamJSZWZUeXBlIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWYgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZQotCSAqIEBzZWUgI2lzU2V0RWpiUmVmVHlwZSgpCi0JICogQHNlZSAjdW5zZXRFamJSZWZUeXBlKCkKLQkgKiBAc2VlICNnZXRFamJSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFamJSZWZUeXBlKEVqYlJlZlR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI2dldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI3NldEVqYlJlZlR5cGUoRWpiUmVmVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVqYlJlZlR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldEVqYlJlZlR5cGUgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFamJSZWZUeXBlKCkKLQkgKiBAc2VlICNnZXRFamJSZWZUeXBlKCkKLQkgKiBAc2VlICNzZXRFamJSZWZUeXBlKEVqYlJlZlR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFamJSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2FsSG9tZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJMb2NhbFJlZl9Mb2NhbEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYWxIb21lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TG9jYWxIb21lIDxlbT5Mb2NhbCBIb21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhbEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2FsSG9tZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2FsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2NhbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJMb2NhbFJlZl9Mb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMb2NhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldExvY2FsIDxlbT5Mb2NhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBMaW5rPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJMaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYkxvY2FsUmVmX0VqYkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiTGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldEVqYkxpbmsgPGVtPkVqYiBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiTGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgKiAJICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgKiAJICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotCSAqIAkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgKiAJICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotCSAqIAkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAqIAkgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiTG9jYWxSZWZfTWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYkxvY2FsUmVmX0luamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEluamVjdGlvblRhcmdldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiTG9jYWxSZWZfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFamJMb2NhbFJlZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FamJSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FamJSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxM2Q4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRWpiUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVqYiBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBlamItcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1yZWYgZWxlbWVudHMgZm9yIHRoZQotICogCWRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUgb3IKLSAqICAgICAgICAgdG8gdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KLSAqIAlUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0gKiAKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICogCSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgotICogCSAgICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UKLSAqIAkgICAgICBiZWFuLgotICogCSAgICAtIHRoZSBvcHRpb25hbCBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICogICAgICAgICAgICAgLSB0aGUgb3B0aW9uYWwgcmVtb3RlIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAqICAgICAgICAgICAgICAgb3IgdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotICogICAgICAgICAgICAgICBiZWFuCi0gKiAJICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGhvbWUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkCi0gKiAgICAgICAgICAgICAgIGVudGVycHJpc2UgYmVhbi4gIE5vdCBhcHBsaWNhYmxlIGlmIHRoaXMgZWpiLXJlZgotICogICAgICAgICAgICAgICByZWZlcnMgdG8gdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KLSAqIAkgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQotICogCSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gKiAgICAgICAgICAgICAtIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YgdGhlIG5hbWVkIGVudGVycHJpc2UKLSAqICAgICAgICAgICAgICAgYmVhbiBpbnRvIGEgY29tcG9uZW50IGZpZWxkIG9yIHByb3BlcnR5Ci0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RWpiUmVmTmFtZSA8ZW0+RWpiIFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEVqYlJlZlR5cGUgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRIb21lIDxlbT5Ib21lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldFJlbW90ZSA8ZW0+UmVtb3RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEVqYkxpbmsgPGVtPkVqYiBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiUmVmKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVqYlJlZiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYlJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJSZWZOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYlJlZl9FamJSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYlJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RWpiUmVmTmFtZSA8ZW0+RWpiIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYlJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYlJlZk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJFbnRpdHkiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVmIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlCi0JICogQHNlZSAjaXNTZXRFamJSZWZUeXBlKCkKLQkgKiBAc2VlICN1bnNldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI3NldEVqYlJlZlR5cGUoRWpiUmVmVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYlJlZl9FamJSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWpiUmVmVHlwZSBnZXRFamJSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEVqYlJlZlR5cGUgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlCi0JICogQHNlZSAjaXNTZXRFamJSZWZUeXBlKCkKLQkgKiBAc2VlICN1bnNldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI2dldEVqYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYlJlZlR5cGUoRWpiUmVmVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI2dldEVqYlJlZlR5cGUoKQotCSAqIEBzZWUgI3NldEVqYlJlZlR5cGUoRWpiUmVmVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVqYlJlZlR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRFamJSZWZUeXBlIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWYgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RWpiUmVmVHlwZSgpCi0JICogQHNlZSAjZ2V0RWpiUmVmVHlwZSgpCi0JICogQHNlZSAjc2V0RWpiUmVmVHlwZShFamJSZWZUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RWpiUmVmVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SG9tZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib21lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIb21lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYlJlZl9Ib21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEhvbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SG9tZSA8ZW0+SG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SG9tZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SG9tZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZW1vdGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1vdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiUmVmX1JlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZW1vdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0UmVtb3RlIDxlbT5SZW1vdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbW90ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtb3RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1vdGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgTGluazwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiTGluayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJSZWZfRWpiTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFamJMaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEVqYkxpbmsgPGVtPkVqYiBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiTGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgKiAJICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgKiAJICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotCSAqIAkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgKiAJICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotCSAqIAkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAqIAkgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiUmVmX01hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiUmVmX0luamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEluamVjdGlvblRhcmdldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiUmVmX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEVqYlJlZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FamJSZWZUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRWpiUmVmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjA3ZTg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FamJSZWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgZWpiLXJlZi10eXBlVHlwZSBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUKLSAqIAlyZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLSAqIAotICogCVRoZSBlamItcmVmLXR5cGUgZGVzaWduYXRlcyBhIHZhbHVlCi0gKiAJdGhhdCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogCi0gKiAJICAgIEVudGl0eQotICogCSAgICBTZXNzaW9uCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJSZWZUeXBlKCkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVqYlJlZlR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VOVElUWV9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNlc3Npb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNlc3Npb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VTU0lPTl9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRU5USVRZCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlIEVOVElUWV9MSVRFUkFMID0gbmV3IEVqYlJlZlR5cGUoRU5USVRZLCAiRW50aXR5IiwgIkVudGl0eSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNlc3Npb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VTU0lPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWpiUmVmVHlwZSBTRVNTSU9OX0xJVEVSQUwgPSBuZXcgRWpiUmVmVHlwZShTRVNTSU9OLCAiU2Vzc2lvbiIsICJTZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWpiUmVmVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBFamJSZWZUeXBlW10gewotCQkJRU5USVRZX0xJVEVSQUwsCi0JCQlTRVNTSU9OX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFamJSZWZUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRWpiUmVmVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYlJlZlR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlFamJSZWZUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFamJSZWZUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBFTlRJVFk6IHJldHVybiBFTlRJVFlfTElURVJBTDsKLQkJCWNhc2UgU0VTU0lPTjogcmV0dXJuIFNFU1NJT05fTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWpiUmVmVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vRWpiUmVmVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VtcHR5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VtcHR5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjE3MjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FbXB0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbXB0eSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGlzIHR5cGUgaXMgdXNlZCB0byBkZXNpZ25hdGUgYW4gZW1wdHkKLSAqIAllbGVtZW50IHdoZW4gdXNlZC4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVtcHR5VHlwZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFbXB0eVR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RW1wdHlUeXBlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEVtcHR5VHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FbnZFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VudkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMTU2ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VudkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudiBFbnRyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGVudi1lbnRyeVR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGFuIGFwcGxpY2F0aW9uJ3MKLSAqIAllbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi0gKiAJZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYSB0eXBlCi0gKiAJKG9wdGlvbmFsIGlmIHRoZSB2YWx1ZSBpcyBpbmplY3RlZCwgb3RoZXJ3aXNlIHJlcXVpcmVkKSwgYW5kCi0gKiAJYW4gb3B0aW9uYWwgdmFsdWUuCi0gKiAKLSAqIAlJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLSAqIAl0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0gKiAKLSAqIAlJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgYW5kIGluamVjdGlvbiBpcyByZXF1ZXN0ZWQsCi0gKiAJbm8gaW5qZWN0aW9uIHdpbGwgb2NjdXIgYW5kIG5vIGVudHJ5IG9mIHRoZSBzcGVjaWZpZWQgbmFtZQotICogCXdpbGwgYmUgY3JlYXRlZC4gIFRoaXMgYWxsb3dzIGFuIGluaXRpYWwgdmFsdWUgdG8gYmUKLSAqIAlzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBjb2RlIHdpdGhvdXQgYmVpbmcgaW5jb3JyZWN0bHkKLSAqIAljaGFuZ2VkIHdoZW4gbm8gb3ZlcnJpZGUgaGFzIGJlZW4gc3BlY2lmaWVkLgotICogCi0gKiAJSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkIGFuZCBubyBpbmplY3Rpb24gaXMgcmVxdWVzdGVkLAotICogCWEgdmFsdWUgbXVzdCBiZSBzdXBwbGllZCBkdXJpbmcgZGVwbG95bWVudC4KLSAqIAotICogCVRoaXMgdHlwZSBpcyB1c2VkIGJ5IGVudi1lbnRyeSBlbGVtZW50cy4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlOYW1lIDxlbT5FbnYgRW50cnkgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEVudkVudHJ5VHlwZSA8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRFbnZFbnRyeVZhbHVlIDxlbT5FbnYgRW50cnkgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFbnZFbnRyeSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFbnZFbnRyeSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnYgRW50cnkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAqIAkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUKLQkgKiAJICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLQkgKiAJICAgICAgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhCi0JICogCSAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50LiBUaGUgdW5pcXVlbmVzcwotCSAqIAkgICAgICBjb25zdHJhaW50cyBtdXN0IGJlIGRlZmluZWQgd2l0aGluIHRoZSBkZWNsYXJlZAotCSAqIAkgICAgICBjb250ZXh0LgotCSAqIAotCSAqIAkgICAgICBFeGFtcGxlOgotCSAqIAotCSAqIAkgICAgICAmbHQ7ZW52LWVudHJ5LW5hbWUmZ3Q7bWluQW1vdW50Jmx0Oy9lbnYtZW50cnktbmFtZSZndDsKLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudiBFbnRyeSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFbnZFbnRyeU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RW52RW50cnlfRW52RW50cnlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVudkVudHJ5TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEVudkVudHJ5TmFtZSA8ZW0+RW52IEVudHJ5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudiBFbnRyeSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFbnZFbnRyeU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudkVudHJ5TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW52IEVudHJ5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iamF2YS5sYW5nLkJvb2xlYW4iPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIFRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBKYXZhIGxhbmd1YWdlCi0JICogCSAgICAgIHR5cGUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LiAgSWYgYW4gaW5qZWN0aW9uIHRhcmdldAotCSAqIAkgICAgICBpcyBzcGVjaWZpZWQgZm9yIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgdGhlIHR5cGUgbWF5Ci0JICogCSAgICAgIGJlIG9taXR0ZWQsIG9yIG11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbgotCSAqIAkgICAgICB0YXJnZXQuICBJZiBubyBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgdGhlIHR5cGUKLQkgKiAJICAgICAgaXMgcmVxdWlyZWQuCi0JICogCi0JICogCSAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogCSAgICAgICZsdDtlbnYtZW50cnktdHlwZSZndDtqYXZhLmxhbmcuSW50ZWdlciZsdDsvZW52LWVudHJ5LXR5cGUmZ3Q7Ci0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnYgRW50cnkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlCi0JICogQHNlZSAjaXNTZXRFbnZFbnRyeVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0RW52RW50cnlUeXBlKCkKLQkgKiBAc2VlICNzZXRFbnZFbnRyeVR5cGUoRW52RW50cnlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RW52RW50cnlfRW52RW50cnlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRW52RW50cnlUeXBlIGdldEVudkVudHJ5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEVudkVudHJ5VHlwZSA8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudiBFbnRyeSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGUKLQkgKiBAc2VlICNpc1NldEVudkVudHJ5VHlwZSgpCi0JICogQHNlZSAjdW5zZXRFbnZFbnRyeVR5cGUoKQotCSAqIEBzZWUgI2dldEVudkVudHJ5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW52RW50cnlUeXBlKEVudkVudHJ5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRFbnZFbnRyeVR5cGUgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVudkVudHJ5VHlwZSgpCi0JICogQHNlZSAjZ2V0RW52RW50cnlUeXBlKCkKLQkgKiBAc2VlICNzZXRFbnZFbnRyeVR5cGUoRW52RW50cnlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RW52RW50cnlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRFbnZFbnRyeVR5cGUgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnYgRW50cnkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RW52RW50cnlUeXBlKCkKLQkgKiBAc2VlICNnZXRFbnZFbnRyeVR5cGUoKQotCSAqIEBzZWUgI3NldEVudkVudHJ5VHlwZShFbnZFbnRyeVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFbnZFbnRyeVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgVGhlIGVudi1lbnRyeS12YWx1ZSBkZXNpZ25hdGVzIHRoZSB2YWx1ZSBvZiBhCi0JICogCSAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZQotCSAqIAkgICAgICBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZQotCSAqIAkgICAgICBjb25zdHJ1Y3RvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhCi0JICogCSAgICAgIHNpbmdsZSBTdHJpbmcgcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwKLQkgKiAJICAgICAgYSBzaW5nbGUgY2hhcmFjdGVyLgotCSAqIAotCSAqIAkgICAgICBFeGFtcGxlOgotCSAqIAotCSAqIAkgICAgICAmbHQ7ZW52LWVudHJ5LXZhbHVlJmd0OzEwMC4wMCZsdDsvZW52LWVudHJ5LXZhbHVlJmd0OwotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJ5IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFbnZFbnRyeVZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVudkVudHJ5X0VudkVudHJ5VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RW52RW50cnlWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEVudkVudHJ5VmFsdWUgPGVtPkVudiBFbnRyeSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJ5IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFbnZFbnRyeVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnZFbnRyeVZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQotCSAqIAkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAqIAkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICogCSAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgotCSAqIAkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICogCSAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KLQkgKiAJICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICogCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCSAqIAotCSAqIAkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgKiAJICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAqIAkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICogCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgKiAJICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFbnZFbnRyeV9NYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RW52RW50cnlfSW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFbnZFbnRyeV9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEVudkVudHJ5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VudkVudHJ5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VudkVudHJ5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjlmMjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FbnZFbnRyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkVudiBFbnRyeSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCQotICogCi0gKiAJICBUaGlzIHR5cGUgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YgdGhlCi0gKiAJICBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZQotICogCSAgYXBwbGljYXRpb24ncyBjb2RlLgotICogCi0gKiAJICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGU6Ci0gKiAKLSAqIAkgICAgICBqYXZhLmxhbmcuQm9vbGVhbgotICogCSAgICAgIGphdmEubGFuZy5CeXRlCi0gKiAJICAgICAgamF2YS5sYW5nLkNoYXJhY3RlcgotICogCSAgICAgIGphdmEubGFuZy5TdHJpbmcKLSAqIAkgICAgICBqYXZhLmxhbmcuU2hvcnQKLSAqIAkgICAgICBqYXZhLmxhbmcuSW50ZWdlcgotICogCSAgICAgIGphdmEubGFuZy5Mb25nCi0gKiAJICAgICAgamF2YS5sYW5nLkZsb2F0Ci0gKiAJICAgICAgamF2YS5sYW5nLkRvdWJsZQotICogCi0gKiAJICBFeGFtcGxlOgotICogCi0gKiAJICAmbHQ7ZW52LWVudHJ5LXR5cGUmZ3Q7amF2YS5sYW5nLkJvb2xlYW4mbHQ7L2Vudi1lbnRyeS10eXBlJmd0OwotICogCi0gKiAJICAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFbnZFbnRyeVR5cGUoKQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW52RW50cnlUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgQm9vbGVhbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SmF2YSBMYW5nIEJvb2xlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9MQU5HX0JPT0xFQU5fTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTEFOR19CT09MRUFOID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBCeXRlPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgQnl0ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfQllURV9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MQU5HX0JZVEUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIENoYXJhY3RlcjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SmF2YSBMYW5nIENoYXJhY3RlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfQ0hBUkFDVEVSX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0xBTkdfQ0hBUkFDVEVSID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBTdHJpbmc8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkphdmEgTGFuZyBTdHJpbmc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9MQU5HX1NUUklOR19MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MQU5HX1NUUklORyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgU2hvcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkphdmEgTGFuZyBTaG9ydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfU0hPUlRfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTEFOR19TSE9SVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgSW50ZWdlcjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SmF2YSBMYW5nIEludGVnZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9MQU5HX0lOVEVHRVJfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTEFOR19JTlRFR0VSID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBMb25nPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgTG9uZzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfTE9OR19MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MQU5HX0xPTkcgPSA2OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIEZsb2F0PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgRmxvYXQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9MQU5HX0ZMT0FUX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0xBTkdfRkxPQVQgPSA3OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIERvdWJsZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SmF2YSBMYW5nIERvdWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfRE9VQkxFX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0xBTkdfRE9VQkxFID0gODsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBCb29sZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfTEFOR19CT09MRUFOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgSkFWQV9MQU5HX0JPT0xFQU5fTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoSkFWQV9MQU5HX0JPT0xFQU4sICJqYXZhTGFuZ0Jvb2xlYW4iLCAiamF2YS5sYW5nLkJvb2xlYW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgQnl0ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfQllURQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIEpBVkFfTEFOR19CWVRFX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEpBVkFfTEFOR19CWVRFLCAiamF2YUxhbmdCeXRlIiwgImphdmEubGFuZy5CeXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIENoYXJhY3RlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfQ0hBUkFDVEVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgSkFWQV9MQU5HX0NIQVJBQ1RFUl9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShKQVZBX0xBTkdfQ0hBUkFDVEVSLCAiamF2YUxhbmdDaGFyYWN0ZXIiLCAiamF2YS5sYW5nLkNoYXJhY3RlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBTdHJpbmc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9MQU5HX1NUUklORwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIEpBVkFfTEFOR19TVFJJTkdfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoSkFWQV9MQU5HX1NUUklORywgImphdmFMYW5nU3RyaW5nIiwgImphdmEubGFuZy5TdHJpbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgU2hvcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9MQU5HX1NIT1JUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgSkFWQV9MQU5HX1NIT1JUX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEpBVkFfTEFOR19TSE9SVCwgImphdmFMYW5nU2hvcnQiLCAiamF2YS5sYW5nLlNob3J0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIEludGVnZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9MQU5HX0lOVEVHRVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBKQVZBX0xBTkdfSU5URUdFUl9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShKQVZBX0xBTkdfSU5URUdFUiwgImphdmFMYW5nSW50ZWdlciIsICJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBMb25nPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pBVkFfTEFOR19MT05HCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgSkFWQV9MQU5HX0xPTkdfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoSkFWQV9MQU5HX0xPTkcsICJqYXZhTGFuZ0xvbmciLCAiamF2YS5sYW5nLkxvbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgRmxvYXQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9MQU5HX0ZMT0FUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgSkFWQV9MQU5HX0ZMT0FUX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEpBVkFfTEFOR19GTE9BVCwgImphdmFMYW5nRmxvYXQiLCAiamF2YS5sYW5nLkZsb2F0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIERvdWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX0xBTkdfRE9VQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgSkFWQV9MQU5HX0RPVUJMRV9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShKQVZBX0xBTkdfRE9VQkxFLCAiamF2YUxhbmdEb3VibGUiLCAiamF2YS5sYW5nLkRvdWJsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEVudkVudHJ5VHlwZVtdIHsKLQkJCUpBVkFfTEFOR19CT09MRUFOX0xJVEVSQUwsCi0JCQlKQVZBX0xBTkdfQllURV9MSVRFUkFMLAotCQkJSkFWQV9MQU5HX0NIQVJBQ1RFUl9MSVRFUkFMLAotCQkJSkFWQV9MQU5HX1NUUklOR19MSVRFUkFMLAotCQkJSkFWQV9MQU5HX1NIT1JUX0xJVEVSQUwsCi0JCQlKQVZBX0xBTkdfSU5URUdFUl9MSVRFUkFMLAotCQkJSkFWQV9MQU5HX0xPTkdfTElURVJBTCwKLQkJCUpBVkFfTEFOR19GTE9BVF9MSVRFUkFMLAotCQkJSkFWQV9MQU5HX0RPVUJMRV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudkVudHJ5VHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUVudkVudHJ5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW52RW50cnlUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRW52RW50cnlUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudkVudHJ5VHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgSkFWQV9MQU5HX0JPT0xFQU46IHJldHVybiBKQVZBX0xBTkdfQk9PTEVBTl9MSVRFUkFMOwotCQkJY2FzZSBKQVZBX0xBTkdfQllURTogcmV0dXJuIEpBVkFfTEFOR19CWVRFX0xJVEVSQUw7Ci0JCQljYXNlIEpBVkFfTEFOR19DSEFSQUNURVI6IHJldHVybiBKQVZBX0xBTkdfQ0hBUkFDVEVSX0xJVEVSQUw7Ci0JCQljYXNlIEpBVkFfTEFOR19TVFJJTkc6IHJldHVybiBKQVZBX0xBTkdfU1RSSU5HX0xJVEVSQUw7Ci0JCQljYXNlIEpBVkFfTEFOR19TSE9SVDogcmV0dXJuIEpBVkFfTEFOR19TSE9SVF9MSVRFUkFMOwotCQkJY2FzZSBKQVZBX0xBTkdfSU5URUdFUjogcmV0dXJuIEpBVkFfTEFOR19JTlRFR0VSX0xJVEVSQUw7Ci0JCQljYXNlIEpBVkFfTEFOR19MT05HOiByZXR1cm4gSkFWQV9MQU5HX0xPTkdfTElURVJBTDsKLQkJCWNhc2UgSkFWQV9MQU5HX0ZMT0FUOiByZXR1cm4gSkFWQV9MQU5HX0ZMT0FUX0xJVEVSQUw7Ci0JCQljYXNlIEpBVkFfTEFOR19ET1VCTEU6IHJldHVybiBKQVZBX0xBTkdfRE9VQkxFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVudkVudHJ5VHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vRW52RW50cnlUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSWNvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0ljb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkOWZkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSWNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JY29uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgaWNvbiB0eXBlIGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMKLSAqIAl0aGF0IHNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsIGFuZCBsYXJnZSBHSUYsIEpQRUcsCi0gKiAJb3IgUE5HIGljb24gaW1hZ2VzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhCi0gKiAJR1VJIHRvb2wuCi0gKiAKLSAqIAlUaGUgeG1sOmxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi0gKiAJaWNvbiBmaWxlIG5hbWVzIGFyZSBwcm92aWRlZCBpbi4gSXRzIHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpCi0gKiAJYnkgZGVmYXVsdC4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24jZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24jZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0SWNvbigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJY29uIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJICAgIAotCSAqIAotCSAqIAkgICAgICBUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotCSAqIAkgICAgICBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi0JICogCSAgICAgIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudAotCSAqIAkgICAgICBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUuCi0JICogCi0JICogCSAgICAgIFRoZSBpbWFnZSBtYXkgYmUgaW4gdGhlIEdJRiwgSlBFRywgb3IgUE5HIGZvcm1hdC4KLQkgKiAJICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0JICogCi0JICogCSAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogCSAgICAgICZsdDtzbWFsbC1pY29uJmd0O2VtcGxveWVlLXNlcnZpY2UtaWNvbjE2eDE2LmpwZyZsdDsvc21hbGwtaWNvbiZndDsKLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNtYWxsSWNvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRJY29uX1NtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTbWFsbEljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIFRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0JICogCSAgICAgIGNvbnRhaW5pbmcgYSBsYXJnZQotCSAqIAkgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlCi0JICogCSAgICAgIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQKLQkgKiAJICAgICAgRmlsZS4KLQkgKiAKLQkgKiAJICAgICAgVGhlIGltYWdlIG1heSBiZSBpbiB0aGUgR0lGLCBKUEVHLCBvciBQTkcgZm9ybWF0LgotCSAqIAkgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQkgKiAKLQkgKiAJICAgICAgRXhhbXBsZToKLQkgKiAKLQkgKiAJICAgICAgJmx0O2xhcmdlLWljb24mZ3Q7ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnJmx0Oy9sYXJnZS1pY29uJmd0OwotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFyZ2VJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEljb25fTGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExhcmdlSWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24jZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRJY29uX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEF0dGVtcHRpbmcgdG8gaW5zdGFsbCB0aGUgcmVsZXZhbnQgSVNPIDItIGFuZCAzLWxldHRlcgotCSAqICAgICAgICAgIGNvZGVzIGFzIHRoZSBlbnVtZXJhdGVkIHBvc3NpYmxlIHZhbHVlcyBpcyBwcm9iYWJseSBuZXZlcgotCSAqICAgICAgICAgIGdvaW5nIHRvIGJlIGEgcmVhbGlzdGljIHBvc3NpYmlsaXR5LiAgU2VlCi0JICogICAgICAgICAgUkZDIDMwNjYgYXQgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzA2Ni50eHQgYW5kIHRoZSBJQU5BIHJlZ2lzdHJ5Ci0JICogICAgICAgICAgYXQgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9sYW5nLXRhZy1hcHBzLmh0bSBmb3IKLQkgKiAgICAgICAgICBmdXJ0aGVyIGluZm9ybWF0aW9uLgotCSAqIAotCSAqICAgICAgICAgIFRoZSB1bmlvbiBhbGxvd3MgZm9yIHRoZSAndW4tZGVjbGFyYXRpb24nIG9mIHhtbDpsYW5nIHdpdGgKLQkgKiAgICAgICAgICB0aGUgZW1wdHkgc3RyaW5nLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEljb25fTGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiNnZXRMYW5nIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYW5nKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSWNvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9JbmplY3Rpb25UYXJnZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9JbmplY3Rpb25UYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkZWM0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSW5qZWN0aW9uVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCUFuIGluamVjdGlvbiB0YXJnZXQgc3BlY2lmaWVzIGEgY2xhc3MgYW5kIGEgbmFtZSB3aXRoaW4KLSAqIAl0aGF0IGNsYXNzIGludG8gd2hpY2ggYSByZXNvdXJjZSBzaG91bGQgYmUgaW5qZWN0ZWQuCi0gKiAKLSAqIAlUaGUgaW5qZWN0aW9uIHRhcmdldCBjbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZAotICogCWNsYXNzIG5hbWUgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBpbmplY3Rpb24uICBUaGUKLSAqIAlKYXZhIEVFIHNwZWNpZmljYXRpb25zIGRlc2NyaWJlIHdoaWNoIGNsYXNzZXMgY2FuIGJlIGFuCi0gKiAJaW5qZWN0aW9uIHRhcmdldC4KLSAqIAotICogCVRoZSBpbmplY3Rpb24gdGFyZ2V0IG5hbWUgc3BlY2lmaWVzIHRoZSB0YXJnZXQgd2l0aGluCi0gKiAJdGhlIHNwZWNpZmllZCBjbGFzcy4gIFRoZSB0YXJnZXQgaXMgZmlyc3QgbG9va2VkIGZvciBhcyBhCi0gKiAJSmF2YUJlYW5zIHByb3BlcnR5IG5hbWUuICBJZiBub3QgZm91bmQsIHRoZSB0YXJnZXQgaXMKLSAqIAlsb29rZWQgZm9yIGFzIGEgZmllbGQgbmFtZS4KLSAqIAotICogCVRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSB0YXJnZXQKLSAqIAlkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsYXNzIGJ5IGVpdGhlciBjYWxsaW5nIHRoZQotICogCXNldCBtZXRob2QgZm9yIHRoZSB0YXJnZXQgcHJvcGVydHkgb3IgYnkgc2V0dGluZyBhIHZhbHVlCi0gKiAJaW50byB0aGUgbmFtZWQgZmllbGQuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQjZ2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MgPGVtPkluamVjdGlvbiBUYXJnZXQgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQjZ2V0SW5qZWN0aW9uVGFyZ2V0TmFtZSA8ZW0+SW5qZWN0aW9uIFRhcmdldCBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRJbmplY3Rpb25UYXJnZXQoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5qZWN0aW9uVGFyZ2V0IGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluamVjdGlvblRhcmdldENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEluamVjdGlvblRhcmdldF9JbmplY3Rpb25UYXJnZXRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbmplY3Rpb25UYXJnZXRDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldCNnZXRJbmplY3Rpb25UYXJnZXRDbGFzcyA8ZW0+SW5qZWN0aW9uIFRhcmdldCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluamVjdGlvblRhcmdldENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluamVjdGlvblRhcmdldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0SW5qZWN0aW9uVGFyZ2V0X0luamVjdGlvblRhcmdldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SW5qZWN0aW9uVGFyZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldCNnZXRJbmplY3Rpb25UYXJnZXROYW1lIDxlbT5JbmplY3Rpb24gVGFyZ2V0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5qZWN0aW9uVGFyZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5qZWN0aW9uVGFyZ2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEluamVjdGlvblRhcmdldApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KRUVTQVhYTUxIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSkVFU0FYWE1MSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjcxZDQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KRUVTQVhYTUxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlNBWFhNSUhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBKRUVTQVhYTUxIYW5kbGVyIGV4dGVuZHMgU0FYWE1JSGFuZGxlciB7Ci0KLQlwdWJsaWMgSkVFU0FYWE1MSGFuZGxlcihYTUxSZXNvdXJjZSB4bWlSZXNvdXJjZSwgWE1MSGVscGVyIGhlbHBlciwKLQkJCU1hcDw/LCA/PiBvcHRpb25zKSB7Ci0JCXN1cGVyKHhtaVJlc291cmNlLCBoZWxwZXIsIG9wdGlvbnMpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwcm90ZWN0ZWQgRVBhY2thZ2UgZ2V0UGFja2FnZUZvclVSSShTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCUVQYWNrYWdlIGRlZlBhY2thZ2U7Ci0JCS8vIEdyYWIgdGhlIHNjaGVtYSBsb2NhdGlvbiBiZWNhdXNlIGFsbCBKRUUgREQgZmlsZXMgc2hhcmUgYSBjb21tb24gbmFtZXNwYWNlCi0JCWlmICh1cmlzVG9Mb2NhdGlvbnMgPT0gbnVsbCkgey8vdXJpTWFwIG5vdCBpbml0aWFsaXplZCB5ZXQKLQkJCWRlZlBhY2thZ2UgPSBzdXBlci5nZXRQYWNrYWdlRm9yVVJJKHVyaVN0cmluZyk7Ci0JCQlpZiAodXJpc1RvTG9jYXRpb25zID09IG51bGwpLy8gaWYgc3RpbGwgbm90IGluaXRpYWxpemVkLi4gdGhlbiBqdXN0IHJldHVybiBkZWZQYWNrYWdlCi0JCQkJcmV0dXJuIGRlZlBhY2thZ2U7Ci0JCX0KLQkJVVJJIHVyaSA9IHVyaXNUb0xvY2F0aW9ucy5nZXQodXJpU3RyaW5nKTsKLQkJU3RyaW5nIGxvY1N0cmluZyA9ICh1cmkgPT0gbnVsbCkgPyB1cmlTdHJpbmcgOiB1cmkudG9TdHJpbmcoKTsKLQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBwYWNrYWdlUmVnaXN0cnkuZ2V0RVBhY2thZ2UobG9jU3RyaW5nKTsKLQkJaWYgKGVQYWNrYWdlID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFja2FnZUZvclVSSShsb2NTdHJpbmcpOwotCQllbHNlIHJldHVybiBlUGFja2FnZTsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSkVFWE1MTG9hZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KRUVYTUxMb2FkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGYwYjc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KRUVYTUxMb2FkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxMb2FkSW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgSkVFWE1MTG9hZEltcGwgZXh0ZW5kcyBYTUxMb2FkSW1wbCB7Ci0KLQlwcm90ZWN0ZWQgRGVmYXVsdEhhbmRsZXIgbWFrZURlZmF1bHRIYW5kbGVyKCkgewotCQkKLQkJIHJldHVybiBuZXcgSkVFU0FYWE1MSGFuZGxlcihyZXNvdXJjZSwgaGVscGVyLCBvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgSkVFWE1MTG9hZEltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0phdmFFRU9iamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0phdmFFRU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjAwYzdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KYXZhRUVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVFT2JqZWN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0phdmFlZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KYXZhZWVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOGQyYzFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KYXZhZWVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhZWVGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YWVlRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpc3BsYXlOYW1lIGNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVqYiBMb2NhbCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVqYiBMb2NhbCBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVqYkxvY2FsUmVmIGNyZWF0ZUVqYkxvY2FsUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVqYiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVqYiBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVqYlJlZiBjcmVhdGVFamJSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW1wdHkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW1wdHkgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRW1wdHlUeXBlIGNyZWF0ZUVtcHR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnYgRW50cnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudiBFbnRyeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRW52RW50cnkgY3JlYXRlRW52RW50cnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SWNvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SWNvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSWNvbiBjcmVhdGVJY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluamVjdGlvbiBUYXJnZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluamVjdGlvbiBUYXJnZXQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUluamVjdGlvblRhcmdldCBjcmVhdGVJbmplY3Rpb25UYXJnZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5MaWZlY3ljbGUgQ2FsbGJhY2s8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpZmVjeWNsZUNhbGxiYWNrIGNyZWF0ZUxpZmVjeWNsZUNhbGxiYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxpc3RlbmVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5MaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWVzc2FnZURlc3RpbmF0aW9uIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1lc3NhZ2VEZXN0aW5hdGlvblJlZiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQYXJhbVZhbHVlIGNyZWF0ZVBhcmFtVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQZXJzaXN0ZW5jZUNvbnRleHRSZWYgY3JlYXRlUGVyc2lzdGVuY2VDb250ZXh0UmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGVyc2lzdGVuY2VVbml0UmVmIGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9ydENvbXBvbmVudFJlZiBjcmVhdGVQb3J0Q29tcG9uZW50UmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb3BlcnR5IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb3BlcnR5IFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb3BlcnR5VHlwZSBjcmVhdGVQcm9wZXJ0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVzb3VyY2VFbnZSZWYgY3JlYXRlUmVzb3VyY2VFbnZSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlUmVmIGNyZWF0ZVJlc291cmNlUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJ1biBBczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UnVuIEFzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSdW5BcyBjcmVhdGVSdW5BcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN1cml0eVJvbGUgY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VjdXJpdHlSb2xlUmVmIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmljZSBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZpY2VSZWYgY3JlYXRlU2VydmljZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2aWNlUmVmSGFuZGxlciBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2aWNlUmVmSGFuZGxlckNoYWluIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW5zPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VcmwgUGF0dGVybiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VcmwgUGF0dGVybiBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVcmxQYXR0ZXJuVHlwZSBjcmVhdGVVcmxQYXR0ZXJuVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhZWVQYWNrYWdlIGdldEphdmFlZVBhY2thZ2UoKTsKLQotfSAvL0phdmFlZUZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9MaWZlY3ljbGVDYWxsYmFjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0xpZmVjeWNsZUNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkODRmZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0xpZmVjeWNsZUNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGlmZWN5Y2xlIENhbGxiYWNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgbGlmZWN5Y2xlLWNhbGxiYWNrIHR5cGUgc3BlY2lmaWVzIGEgbWV0aG9kIG9uIGEKLSAqIAljbGFzcyB0byBiZSBjYWxsZWQgd2hlbiBhIGxpZmVjeWNsZSBldmVudCBvY2N1cnMuCi0gKiAJTm90ZSB0aGF0IGVhY2ggY2xhc3MgbWF5IGhhdmUgb25seSBvbmUgbGlmZWN5Y2xlIGNhbGxiYWNrCi0gKiAgICAgICAgIG1ldGhvZCBmb3IgYW55IGdpdmVuIGV2ZW50IGFuZCB0aGF0IHRoZSBtZXRob2QgbWF5IG5vdAotICogCWJlIG92ZXJsb2FkZWQuCi0gKiAKLSAqICAgICAgICAgSWYgdGhlIGxpZmVmeWNsZS1jYWxsYmFjay1jbGFzcyBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbgotICogICAgICAgICB0aGUgY2xhc3MgZGVmaW5pbmcgdGhlIGNhbGxiYWNrIGlzIGFzc3VtZWQgdG8gYmUgdGhlCi0gKiAgICAgICAgIGNvbXBvbmVudCBjbGFzcyBpbiBzY29wZSBhdCB0aGUgcGxhY2UgaW4gdGhlIGRlc2NyaXB0b3IKLSAqICAgICAgICAgaW4gd2hpY2ggdGhlIGNhbGxiYWNrIGRlZmluaXRpb24gYXBwZWFycy4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrI2dldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MgPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrI2dldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kIDxlbT5MaWZlY3ljbGUgQ2FsbGJhY2sgTWV0aG9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRMaWZlY3ljbGVDYWxsYmFjaygpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWZlY3ljbGVDYWxsYmFjayBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGlmZWN5Y2xlIENhbGxiYWNrIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MaWZlY3ljbGUgQ2FsbGJhY2sgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrI2dldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MgPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaWZlY3ljbGUgQ2FsbGJhY2sgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MaWZlY3ljbGUgQ2FsbGJhY2sgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2sjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QgPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaWZlY3ljbGVDYWxsYmFja01ldGhvZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIExpZmVjeWNsZUNhbGxiYWNrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0xpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiMzVmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGlzdGVuZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBsaXN0ZW5lclR5cGUgaW5kaWNhdGVzIHRoZSBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViCi0gKiAJYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0TGlzdGVuZXJDbGFzcyA8ZW0+TGlzdGVuZXIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldExpc3RlbmVyKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TGlzdGVuZXJfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRMaXN0ZW5lcl9EaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TGlzdGVuZXJfSWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaXN0ZW5lciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZQotCSAqIAkgICAgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViCi0JICogCSAgICBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiBUaGUgdmFsdWUgaXMgdGhlIGZ1bGx5Ci0JICogCSAgICBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBsaXN0ZW5lciBjbGFzcy4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlzdGVuZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExpc3RlbmVyQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMaXN0ZW5lckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0TGlzdGVuZXJDbGFzcyA8ZW0+TGlzdGVuZXIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpc3RlbmVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMaXN0ZW5lckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaXN0ZW5lckNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldExpc3RlbmVyX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTGlzdGVuZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTcwOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL01lc3NhZ2VEZXN0aW5hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSBzcGVjaWZpZXMgYSBtZXNzYWdlCi0gKiAJICBkZXN0aW5hdGlvbi4gVGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMKLSAqIAkgIGVsZW1lbnQgaXMgbWFwcGVkIHRvIGEgcGh5c2ljYWwgZGVzdGluYXRpb24gYnkgdGhlIERlcGxveWVyLgotICogCi0gKiAJICBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOgotICogCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICogCQkgIC0gYW4gb3B0aW9uYWwgZGlzcGxheS1uYW1lCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBpY29uCi0gKiAJCSAgLSBhIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZSB3aGljaCBtdXN0IGJlIHVuaXF1ZQotICogCQkgICAgYW1vbmcgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lcyB3aXRoaW4gdGhlIHNhbWUKLSAqIAkJICAgIERlcGxveW1lbnQgRmlsZS4KLSAqIAkJICAtIGFuIG9wdGlvbmFsIG1hcHBlZCBuYW1lCi0gKiAKLSAqIAkgIEV4YW1wbGU6Ci0gKiAKLSAqIAkgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uJmd0OwotICogCQkgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUmZ3Q7Q29ycG9yYXRlU3RvY2tzCi0gKiAJCSAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUmZ3Q7Ci0gKiAJICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24mZ3Q7Ci0gKiAKLSAqIAkgIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlRGVzdGluYXRpb24gZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25fRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25fRGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvbl9JY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEKLQkgKiAJICAgIG5hbWUgZm9yIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgbmFtZSBtdXN0IGJlCi0JICogCSAgICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIG1lc3NhZ2UgZGVzdGluYXRpb25zCi0JICogCSAgICB3aXRoaW4gdGhlIERlcGxveW1lbnQgRmlsZS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvbl9NZXNzYWdlRGVzdGluYXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJICAgIAotCSAqIAotCSAqIAkgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgbWVzc2FnZSBkZXN0aW5hdGlvbgotCSAqIAkgICAgICBzaG91bGQgYmUgbWFwcGVkIHRvLiAgRWFjaCBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZgotCSAqIAkgICAgICBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGlzIG1lc3NhZ2UgZGVzdGluYXRpb24gd2lsbAotCSAqIAkgICAgICBkZWZpbmUgYSBuYW1lIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nCi0JICogCSAgICAgIGNvbXBvbmVudC4gIChJdCdzIGEgbmFtZSBpbiB0aGUgSk5ESSBqYXZhOmNvbXAvZW52Ci0JICogCSAgICAgIG5hbWVzcGFjZS4pICBNYW55IGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0bwotCSAqIAkgICAgICBtYXAgdGhlc2UgbG9jYWwgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXIuICBUaGlzIG1hcHBlZCBuYW1lIGlzIG9mdGVuIGEgZ2xvYmFsCi0JICogCSAgICAgIEpOREkgbmFtZSwgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uICBFYWNoIG9mIHRoZQotCSAqIAkgICAgICBsb2NhbCBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIHRoaXMgc2FtZSBnbG9iYWwgbmFtZS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uX01hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1lc3NhZ2VEZXN0aW5hdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9NZXNzYWdlRGVzdGluYXRpb25SZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9NZXNzYWdlRGVzdGluYXRpb25SZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiMGY2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLSAqIAkgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBkZXN0aW5hdGlvbgotICogCSAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncwotICogCSAgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotICogCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICogCQkgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUKLSAqIAkJICAtIGFuIG9wdGlvbmFsIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQotICogCQkgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyCi0gKiAJCSAgICB0aGUgZGVzdGluYXRpb24gaXMgdXNlZCBmb3IKLSAqIAkJICAgIGNvbnN1bWluZyBvciBwcm9kdWNpbmcgbWVzc2FnZXMsIG9yIGJvdGguCi0gKiAJCSAgICBpZiBub3Qgc3BlY2lmaWVkLCAiYm90aCIgaXMgYXNzdW1lZC4KLSAqIAkJICAtIGFuIG9wdGlvbmFsIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24KLSAqIAkJICAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCi0gKiAKLSAqIAkgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLSAqIAkgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0gKiAJICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0gKiAJICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLSAqIAkgIHRhcmdldC4KLSAqIAotICogCSAgRXhhbXBsZXM6Ci0gKiAKLSAqIAkgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiZndDsKLSAqIAkJICAmbHQ7bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSZndDtqbXMvU3RvY2tRdWV1ZQotICogCQkgICZsdDsvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSZndDsKLSAqIAkJICAmbHQ7bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlJmd0O2phdmF4Lmptcy5RdWV1ZQotICogCQkgICZsdDsvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlJmd0OwotICogCQkgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlJmd0O0NvbnN1bWVzCi0gKiAJCSAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlJmd0OwotICogCQkgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsmZ3Q7Q29ycG9yYXRlU3RvY2tzCi0gKiAJCSAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsmZ3Q7Ci0gKiAJICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmJmd0OwotICogCi0gKiAJICAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotCSAqIAkgICAgdGhlIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzCi0JICogCSAgICB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0JICogCSAgICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLQkgKiAJICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUKLQkgKiAJICAgIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLWphciAoZm9yIGVudGVycHJpc2UgYmVhbnMpIG9yIGEKLQkgKiAJICAgIERlcGxveW1lbnQgRmlsZSAoZm9yIG90aGVycykuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJDb25zdW1lcyI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUKLQkgKiBAc2VlICNpc1NldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkKLQkgKiBAc2VlICN1bnNldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkKLQkgKiBAc2VlICNzZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZShNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZQotCSAqIEBzZWUgI2lzU2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKQotCSAqIEBzZWUgI3Vuc2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZShNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpCi0JICogQHNlZSAjc2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkKLQkgKiBAc2VlICNzZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZShNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJICAgIAotCSAqIAotCSAqIAkgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCi0JICogCSAgICAgIG1hcHBlZCB0by4gIFRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UsIGFzIGRlZmluZWQgYnkgdGhlCi0JICogCSAgICAgIHJlc291cmNlJ3MgbmFtZSBlbGVtZW50IG9yIGRlZmF1bHRlZCwgaXMgYSBuYW1lIHRoYXQgaXMKLQkgKiAJICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCi0JICogCSAgICAgIChJdCdzIGEgbmFtZSBpbiB0aGUgSk5ESSBqYXZhOmNvbXAvZW52IG5hbWVzcGFjZS4pICBNYW55Ci0JICogCSAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0byBtYXAgdGhlc2UgbG9jYWwKLQkgKiAJICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgotCSAqIAkgICAgICBzZXJ2ZXIuICBUaGlzIG1hcHBlZCBuYW1lIGlzIG9mdGVuIGEgZ2xvYmFsIEpOREkgbmFtZSwKLQkgKiAJICAgICAgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uCi0JICogCi0JICogCSAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQotCSAqIAkgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5Ci0JICogCSAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLQkgKiAJICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObwotCSAqIAkgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXBwZWROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXNzYWdlRGVzdGluYXRpb25SZWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYzA2M2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZQotICogCW1lc3NhZ2UgZGVzdGluYXRpb24gaW5kaWNhdGVkIGJ5IHRoZSByZWZlcmVuY2UuICBUaGUgdmFsdWUKLSAqIAlpbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlcyBhcmUgY29uc3VtZWQgZnJvbSB0aGUgbWVzc2FnZQotICogCWRlc3RpbmF0aW9uLCBwcm9kdWNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLCBvciBib3RoLiAgVGhlCi0gKiAJQXNzZW1ibGVyIG1ha2VzIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGxpbmtpbmcgcHJvZHVjZXJzCi0gKiAJb2YgYSBkZXN0aW5hdGlvbiB3aXRoIGl0cyBjb25zdW1lcnMuCi0gKiAKLSAqIAlUaGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UgZWxlbWVudCBtdXN0IGJlCi0gKiAJb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAJICAgIENvbnN1bWVzCi0gKiAJICAgIFByb2R1Y2VzCi0gKiAJICAgIENvbnN1bWVzUHJvZHVjZXMKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db25zdW1lczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05TVU1FU19MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1VNRVMgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlByb2R1Y2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BST0RVQ0VTX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9EVUNFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db25zdW1lcyBQcm9kdWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q29uc3VtZXMgUHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OU1VNRVNfUFJPRFVDRVNfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNVTUVTX1BST0RVQ0VTID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlNVTUVTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgQ09OU1VNRVNfTElURVJBTCA9IG5ldyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoQ09OU1VNRVMsICJDb25zdW1lcyIsICJDb25zdW1lcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlByb2R1Y2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BST0RVQ0VTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgUFJPRFVDRVNfTElURVJBTCA9IG5ldyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoUFJPRFVDRVMsICJQcm9kdWNlcyIsICJQcm9kdWNlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzIFByb2R1Y2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlNVTUVTX1BST0RVQ0VTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgQ09OU1VNRVNfUFJPRFVDRVNfTElURVJBTCA9IG5ldyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoQ09OU1VNRVNfUFJPRFVDRVMsICJDb25zdW1lc1Byb2R1Y2VzIiwgIkNvbnN1bWVzUHJvZHVjZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlW10gewotCQkJQ09OU1VNRVNfTElURVJBTCwKLQkJCVBST0RVQ0VTX0xJVEVSQUwsCi0JCQlDT05TVU1FU19QUk9EVUNFU19MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIENPTlNVTUVTOiByZXR1cm4gQ09OU1VNRVNfTElURVJBTDsKLQkJCWNhc2UgUFJPRFVDRVM6IHJldHVybiBQUk9EVUNFU19MSVRFUkFMOwotCQkJY2FzZSBDT05TVU1FU19QUk9EVUNFUzogcmV0dXJuIENPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGFyYW1WYWx1ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BhcmFtVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYwOGE0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGFyYW1WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJhbSBWYWx1ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhpcyB0eXBlIGlzIGEgZ2VuZXJhbCB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZQotICogCXBhcmFtZXRlci92YWx1ZSBsaXN0cy4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlI2dldFBhcmFtTmFtZSA8ZW0+UGFyYW0gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUjZ2V0UGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGFyYW1WYWx1ZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYXJhbVZhbHVlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW0gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgKiAJICAgIHBhcmFtZXRlci4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW0gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyYW1OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBhcmFtVmFsdWVfUGFyYW1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhcmFtTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUjZ2V0UGFyYW1OYW1lIDxlbT5QYXJhbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJhbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmFtTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEKLQkgKiAJICAgIHBhcmFtZXRlci4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmFtVmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGFyYW1WYWx1ZV9QYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhcmFtVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlI2dldFBhcmFtVmFsdWUgPGVtPlBhcmFtIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQYXJhbVZhbHVlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQYXJhbVZhbHVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BlcnNpc3RlbmNlQ29udGV4dFJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BlcnNpc3RlbmNlQ29udGV4dFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2Y4MjBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QZXJzaXN0ZW5jZUNvbnRleHRSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotICogCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBwZXJzaXN0ZW5jZSBjb250ZXh0Ci0gKiAJICBhc3NvY2lhdGVkIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAqIAkgIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLSAqIAotICogCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqIAkJICAtIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZSBuYW1lCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBwZXJzaXN0ZW5jZSB1bml0IG5hbWUuICBJZiBub3Qgc3BlY2lmaWVkLAotICogICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBwZXJzaXN0ZW5jZSB1bml0IGlzIGFzc3VtZWQuCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIKLSAqIAkJICAgIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHR5cGUgaXMgVHJhbnNhY3Rpb24gb3IKLSAqIAkJICAgIEV4dGVuZGVkLiAgSWYgbm90IHNwZWNpZmllZCwgVHJhbnNhY3Rpb24gaXMgYXNzdW1lZC4KLSAqICAgICAgICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiBwZXJzaXN0ZW5jZSBwcm9wZXJ0aWVzCi0gKiAJCSAgLSBvcHRpb25hbCBpbmplY3Rpb24gdGFyZ2V0cwotICogCi0gKiAJICBFeGFtcGxlczoKLSAqIAotICogICAgICAgICAgICAgJmx0O3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmJmd0OwotICogICAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZSZndDtteVBlcnNpc3RlbmNlQ29udGV4dAotICogICAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUmZ3Q7Ci0gKiAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmJmd0OwotICogCi0gKiAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtY29udGV4dC1yZWYmZ3Q7Ci0gKiAgICAgICAgICAgICAgICZsdDtwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lJmd0O215UGVyc2lzdGVuY2VDb250ZXh0Ci0gKiAgICAgICAgICAgICAgICAgJmx0Oy9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lJmd0OwotICogICAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtdW5pdC1uYW1lJmd0O1BlcnNpc3RlbmNlVW5pdDEKLSAqICAgICAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLXVuaXQtbmFtZSZndDsKLSAqICAgICAgICAgICAgICAgJmx0O3BlcnNpc3RlbmNlLWNvbnRleHQtdHlwZSZndDtFeHRlbmRlZCZsdDsvcGVyc2lzdGVuY2UtY29udGV4dC10eXBlJmd0OwotICogICAgICAgICAgICAgJmx0Oy9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZiZndDsKLSAqIAotICogCSAgCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMgPGVtPlBlcnNpc3RlbmNlIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VDb250ZXh0UmVmIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0JICogCSAgICB0aGUgbmFtZSBvZiBhIHBlcnNpc3RlbmNlIGNvbnRleHQgcmVmZXJlbmNlOyBpdHMKLQkgKiAJICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLQkgKiAJICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAqIAkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlcihvciBCZWFuUHJvdmlkZXIpIG1heSB1c2UgdGhlCi0JICogICAgICAgICAgICAgZm9sbG93aW5nIHN5bnRheCB0byBhdm9pZCB0aGUgbmVlZCB0byByZW5hbWUgcGVyc2lzdGVuY2UKLQkgKiAgICAgICAgICAgICB1bml0cyB0byBoYXZlIHVuaXF1ZSBuYW1lcyB3aXRoaW4gYSBKYXZhIEVFIGFwcGxpY2F0aW9uLgotCSAqIAotCSAqICAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgc3BlY2lmaWVzIHRoZSBwYXRobmFtZSBvZiB0aGUKLQkgKiAgICAgICAgICAgICByb290IG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBmb3IgdGhlIHJlZmVyZW5jZWQKLQkgKiAgICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IGFuZCBhcHBlbmRzIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZQotCSAqICAgICAgICAgICAgIHVuaXQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGhuYW1lIGJ5ICMuIFRoZSBwYXRobmFtZSBpcwotCSAqICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBjb21wb25lbnQgamFyIGZpbGUuCi0JICogICAgICAgICAgICAgSW4gdGhpcyBtYW5uZXIsIG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzIHdpdGggdGhlIHNhbWUKLQkgKiAgICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IG5hbWUgbWF5IGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgd2hlbiB0aGUKLQkgKiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgY2Fubm90IGNoYW5nZSBwZXJzaXN0ZW5jZSB1bml0IG5hbWVzLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcnNpc3RlbmNlVW5pdE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyc2lzdGVuY2VVbml0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IlRyYW5zYWN0aW9uIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZQotCSAqIEBzZWUgI2lzU2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpCi0JICogQHNlZSAjdW5zZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKLQkgKiBAc2VlICNzZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKFBlcnNpc3RlbmNlQ29udGV4dFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBlcnNpc3RlbmNlQ29udGV4dFR5cGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZQotCSAqIEBzZWUgI2lzU2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpCi0JICogQHNlZSAjdW5zZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKLQkgKiBAc2VlICNzZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKFBlcnNpc3RlbmNlQ29udGV4dFR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQotCSAqIEBzZWUgI3NldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoUGVyc2lzdGVuY2VDb250ZXh0VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBwcm9wZXJ0aWVzIGZvciB0aGUgY29udGFpbmVyIG9yIHBlcnNpc3RlbmNlCi0JICogICAgICAgICAgICAgcHJvdmlkZXIuICBWZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcyBtYXkgYmUgaW5jbHVkZWQgaW4KLQkgKiAgICAgICAgICAgICB0aGUgc2V0IG9mIHByb3BlcnRpZXMuICBQcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkCi0JICogICAgICAgICAgICAgYnkgYSB2ZW5kb3IgbXVzdCBiZSBpZ25vcmVkLiAgRW50cmllcyB0aGF0IG1ha2UgdXNlIG9mIHRoZQotCSAqICAgICAgICAgICAgIG5hbWVzcGFjZSBqYXZheC5wZXJzaXN0ZW5jZSBhbmQgaXRzIHN1Ym5hbWVzcGFjZXMgbXVzdCBub3QKLQkgKiAgICAgICAgICAgICBiZSB1c2VkIGZvciB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcy4gIFRoZSBuYW1lc3BhY2UKLQkgKiAgICAgICAgICAgICBqYXZheC5wZXJzaXN0ZW5jZSBpcyByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBzcGVjaWZpY2F0aW9uLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQotCSAqIAkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAqIAkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICogCSAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgotCSAqIAkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICogCSAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KLQkgKiAJICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICogCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCSAqIAotCSAqIAkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgKiAJICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAqIAkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICogCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgKiAJICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfTWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfSW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUGVyc2lzdGVuY2VDb250ZXh0UmVmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BlcnNpc3RlbmNlQ29udGV4dFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QZXJzaXN0ZW5jZUNvbnRleHRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YTM4MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BlcnNpc3RlbmNlQ29udGV4dFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHJhbnNhY3Rpb25hbAotICogCW5hdHVyZSBvZiBhIHBlcnNpc3RlbmNlIGNvbnRleHQgcmVmZXJlbmNlLgotICogCi0gKiAJVGhlIHZhbHVlIG9mIHRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUgZWxlbWVudCBtdXN0IGJlCi0gKiAJb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAJICAgIFRyYW5zYWN0aW9uCi0gKiAgICAgICAgICAgICBFeHRlbmRlZAotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5UcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVFJBTlNBQ1RJT05fTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZGVkPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FeHRlbmRlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRFRF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5ERUQgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVFJBTlNBQ1RJT04KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgVFJBTlNBQ1RJT05fTElURVJBTCA9IG5ldyBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKFRSQU5TQUNUSU9OLCAiVHJhbnNhY3Rpb24iLCAiVHJhbnNhY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBFWFRFTkRFRF9MSVRFUkFMID0gbmV3IFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoRVhURU5ERUQsICJFeHRlbmRlZCIsICJFeHRlbmRlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlQ29udGV4dFR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgUGVyc2lzdGVuY2VDb250ZXh0VHlwZVtdIHsKLQkJCVRSQU5TQUNUSU9OX0xJVEVSQUwsCi0JCQlFWFRFTkRFRF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVBlcnNpc3RlbmNlQ29udGV4dFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUGVyc2lzdGVuY2VDb250ZXh0VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgVFJBTlNBQ1RJT046IHJldHVybiBUUkFOU0FDVElPTl9MSVRFUkFMOwotCQkJY2FzZSBFWFRFTkRFRDogcmV0dXJuIEVYVEVOREVEX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1BlcnNpc3RlbmNlQ29udGV4dFR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QZXJzaXN0ZW5jZVVuaXRSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QZXJzaXN0ZW5jZVVuaXRSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1N2Q3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGVyc2lzdGVuY2VVbml0UmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoZSBwZXJzaXN0ZW5jZS11bml0LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLSAqIAkgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgcGVyc2lzdGVuY2UgdW5pdAotICogCSAgYXNzb2NpYXRlZCB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0gKiAJICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0gKiAKLSAqIAkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJCSAgLSB0aGUgcGVyc2lzdGVuY2UgdW5pdCByZWZlcmVuY2UgbmFtZQotICogCQkgIC0gYW4gb3B0aW9uYWwgcGVyc2lzdGVuY2UgdW5pdCBuYW1lLiAgSWYgbm90IHNwZWNpZmllZCwKLSAqICAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgcGVyc2lzdGVuY2UgdW5pdCBpcyBhc3N1bWVkLgotICogCQkgIC0gb3B0aW9uYWwgaW5qZWN0aW9uIHRhcmdldHMKLSAqIAotICogCSAgRXhhbXBsZXM6Ci0gKiAKLSAqICAgICAgICAgICAgICZsdDtwZXJzaXN0ZW5jZS11bml0LXJlZiZndDsKLSAqICAgICAgICAgICAgICAgJmx0O3BlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWUmZ3Q7bXlQZXJzaXN0ZW5jZVVuaXQKLSAqICAgICAgICAgICAgICAgJmx0Oy9wZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lJmd0OwotICogICAgICAgICAgICAgJmx0Oy9wZXJzaXN0ZW5jZS11bml0LXJlZiZndDsKLSAqIAotICogICAgICAgICAgICAgJmx0O3BlcnNpc3RlbmNlLXVuaXQtcmVmJmd0OwotICogICAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSZndDtteVBlcnNpc3RlbmNlVW5pdAotICogICAgICAgICAgICAgICAgICZsdDsvcGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSZndDsKLSAqICAgICAgICAgICAgICAgJmx0O3BlcnNpc3RlbmNlLXVuaXQtbmFtZSZndDtQZXJzaXN0ZW5jZVVuaXQxCi0gKiAgICAgICAgICAgICAgICAgJmx0Oy9wZXJzaXN0ZW5jZS11bml0LW5hbWUmZ3Q7Ci0gKiAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLXVuaXQtcmVmJmd0OwotICogCi0gKiAJICAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VVbml0UmVmIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0JICogCSAgICB0aGUgbmFtZSBvZiBhIHBlcnNpc3RlbmNlIHVuaXQgcmVmZXJlbmNlOyBpdHMKLQkgKiAJICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLQkgKiAJICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAqIAkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfUGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlcihvciBCZWFuUHJvdmlkZXIpIG1heSB1c2UgdGhlCi0JICogICAgICAgICAgICAgZm9sbG93aW5nIHN5bnRheCB0byBhdm9pZCB0aGUgbmVlZCB0byByZW5hbWUgcGVyc2lzdGVuY2UKLQkgKiAgICAgICAgICAgICB1bml0cyB0byBoYXZlIHVuaXF1ZSBuYW1lcyB3aXRoaW4gYSBKYXZhIEVFIGFwcGxpY2F0aW9uLgotCSAqIAotCSAqICAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgc3BlY2lmaWVzIHRoZSBwYXRobmFtZSBvZiB0aGUKLQkgKiAgICAgICAgICAgICByb290IG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBmb3IgdGhlIHJlZmVyZW5jZWQKLQkgKiAgICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IGFuZCBhcHBlbmRzIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZQotCSAqICAgICAgICAgICAgIHVuaXQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGhuYW1lIGJ5ICMuIFRoZSBwYXRobmFtZSBpcwotCSAqICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBjb21wb25lbnQgamFyIGZpbGUuCi0JICogICAgICAgICAgICAgSW4gdGhpcyBtYW5uZXIsIG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzIHdpdGggdGhlIHNhbWUKLQkgKiAgICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IG5hbWUgbWF5IGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgd2hlbiB0aGUKLQkgKiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgY2Fubm90IGNoYW5nZSBwZXJzaXN0ZW5jZSB1bml0IG5hbWVzLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcnNpc3RlbmNlVW5pdE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyc2lzdGVuY2VVbml0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgKiAJICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgKiAJICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotCSAqIAkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgKiAJICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotCSAqIAkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAqIAkgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0UmVmX01hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0luamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEluamVjdGlvblRhcmdldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFBlcnNpc3RlbmNlVW5pdFJlZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9Qb3J0Q29tcG9uZW50UmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUG9ydENvbXBvbmVudFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGFkYTE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9Qb3J0Q29tcG9uZW50UmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLSAqIAlvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotICogCXRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLSAqIAlJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0gKiAJYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNpc0VuYWJsZU10b20gPGVtPkVuYWJsZSBNdG9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRQb3J0Q29tcG9uZW50TGluayA8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50UmVmKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvcnRDb21wb25lbnRSZWYgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKLQkgKiAJICAgIEphdmEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBvZiBhCi0JICogCSAgICBXU0RMIHBvcnQuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuYWJsZSBNdG9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAgICAgICAgICAgICBVc2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIFNPQVAgTVRPTS9YT1AgbWVjaGFuaXNtIG9uIHRoZSBjbGllbnQKLQkgKiAJICAgIHNpZGUgZm9yIGEgcG9ydC1jb21wb25lbnQuCi0JICogCi0JICogCSAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtUlBDIHJ1bnRpbWUKLQkgKiAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuYWJsZSBNdG9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVuYWJsZU10b20oKQotCSAqIEBzZWUgI3Vuc2V0RW5hYmxlTXRvbSgpCi0JICogQHNlZSAjc2V0RW5hYmxlTXRvbShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudFJlZl9FbmFibGVNdG9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VuYWJsZU10b20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2lzRW5hYmxlTXRvbSA8ZW0+RW5hYmxlIE10b208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVuYWJsZSBNdG9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVuYWJsZU10b20oKQotCSAqIEBzZWUgI3Vuc2V0RW5hYmxlTXRvbSgpCi0JICogQHNlZSAjaXNFbmFibGVNdG9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbmFibGVNdG9tKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNpc0VuYWJsZU10b20gPGVtPkVuYWJsZSBNdG9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVuYWJsZU10b20oKQotCSAqIEBzZWUgI2lzRW5hYmxlTXRvbSgpCi0JICogQHNlZSAjc2V0RW5hYmxlTXRvbShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RW5hYmxlTXRvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNpc0VuYWJsZU10b20gPGVtPkVuYWJsZSBNdG9tPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmFibGUgTXRvbTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RW5hYmxlTXRvbSgpCi0JICogQHNlZSAjaXNFbmFibGVNdG9tKCkKLQkgKiBAc2VlICNzZXRFbmFibGVNdG9tKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFbmFibGVNdG9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBwb3J0LWNvbXBvbmVudC1saW5rIGVsZW1lbnQgbGlua3MgYSBwb3J0LWNvbXBvbmVudC1yZWYKLQkgKiAJICAgIHRvIGEgc3BlY2lmaWMgcG9ydC1jb21wb25lbnQgcmVxdWlyZWQgdG8gYmUgbWFkZSBhdmFpbGFibGUKLQkgKiAJICAgIGJ5IGEgc2VydmljZSByZWZlcmVuY2UuCi0JICogCi0JICogCSAgICBUaGUgdmFsdWUgb2YgYSBwb3J0LWNvbXBvbmVudC1saW5rIG11c3QgYmUgdGhlCi0JICogCSAgICBwb3J0LWNvbXBvbmVudC1uYW1lIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlCi0JICogCSAgICBvciBhbm90aGVyIG1vZHVsZSBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbiB1bml0LiBUaGUgc3ludGF4Ci0JICogCSAgICBmb3Igc3BlY2lmaWNhdGlvbiBmb2xsb3dzIHRoZSBzeW50YXggZGVmaW5lZCBmb3IgZWpiLWxpbmsKLQkgKiAJICAgIGluIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvcnRDb21wb25lbnRMaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UG9ydENvbXBvbmVudExpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldFBvcnRDb21wb25lbnRMaW5rIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9ydENvbXBvbmVudExpbmsoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudFJlZl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUG9ydENvbXBvbmVudFJlZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9Qcm9wZXJ0eVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9Qcm9wZXJ0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1OGIzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUHJvcGVydHlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnR5IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVNwZWNpZmllcyBhIG5hbWUvdmFsdWUgcGFpci4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFByb3BlcnR5VHlwZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQcm9wZXJ0eVR5cGVfTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UHJvcGVydHlUeXBlX1ZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQcm9wZXJ0eVR5cGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvcGVydHlUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc0F1dGhUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzQXV0aFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhN2YwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzQXV0aFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlJlcyBBdXRoIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgcmVzLWF1dGhUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudAotICogCWNvZGUgc2lnbnMgb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3IKLSAqIAl3aGV0aGVyIHRoZSBDb250YWluZXIgd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0gKiAJb24gYmVoYWxmIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudC4gSW4gdGhlIGxhdHRlciBjYXNlLAotICogCXRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotICogCURlcGxveWVyLgotICogCi0gKiAJVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICogCi0gKiAJICAgIEFwcGxpY2F0aW9uCi0gKiAJICAgIENvbnRhaW5lcgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzQXV0aFR5cGUoKQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzQXV0aFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBUFBMSUNBVElPTl9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQTElDQVRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UQUlORVIgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVBQTElDQVRJT04KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlIEFQUExJQ0FUSU9OX0xJVEVSQUwgPSBuZXcgUmVzQXV0aFR5cGUoQVBQTElDQVRJT04sICJBcHBsaWNhdGlvbiIsICJBcHBsaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UQUlORVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlIENPTlRBSU5FUl9MSVRFUkFMID0gbmV3IFJlc0F1dGhUeXBlKENPTlRBSU5FUiwgIkNvbnRhaW5lciIsICJDb250YWluZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIEF1dGggVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzQXV0aFR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgUmVzQXV0aFR5cGVbXSB7Ci0JCQlBUFBMSUNBVElPTl9MSVRFUkFMLAotCQkJQ09OVEFJTkVSX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIEF1dGggVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIEF1dGggVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc0F1dGhUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzQXV0aFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aFR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlSZXNBdXRoVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIEF1dGggVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc0F1dGhUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBBUFBMSUNBVElPTjogcmV0dXJuIEFQUExJQ0FUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIENPTlRBSU5FUjogcmV0dXJuIENPTlRBSU5FUl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBSZXNBdXRoVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vUmVzQXV0aFR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNTaGFyaW5nU2NvcGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzU2hhcmluZ1Njb3BlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjMxOWVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNTaGFyaW5nU2NvcGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHJlcy1zaGFyaW5nLXNjb3BlIHR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMKLSAqIAlvYnRhaW5lZCB0aHJvdWdoIHRoZSBnaXZlbiByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24KLSAqIAlmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUgc2hhcmVkLiBUaGUgdmFsdWUsIGlmIHNwZWNpZmllZCwKLSAqIAltdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLSAqIAotICogCSAgICBTaGFyZWFibGUKLSAqIAkgICAgVW5zaGFyZWFibGUKLSAqIAotICogCVRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc1NoYXJpbmdTY29wZVR5cGUoKQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzU2hhcmluZ1Njb3BlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+U2hhcmVhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0hBUkVBQkxFX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFSRUFCTEUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VW5zaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVuc2hhcmVhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1VOU0hBUkVBQkxFX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNIQVJFQUJMRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0hBUkVBQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlIFNIQVJFQUJMRV9MSVRFUkFMID0gbmV3IFJlc1NoYXJpbmdTY29wZVR5cGUoU0hBUkVBQkxFLCAiU2hhcmVhYmxlIiwgIlNoYXJlYWJsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVuc2hhcmVhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1VOU0hBUkVBQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlIFVOU0hBUkVBQkxFX0xJVEVSQUwgPSBuZXcgUmVzU2hhcmluZ1Njb3BlVHlwZShVTlNIQVJFQUJMRSwgIlVuc2hhcmVhYmxlIiwgIlVuc2hhcmVhYmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc1NoYXJpbmdTY29wZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgUmVzU2hhcmluZ1Njb3BlVHlwZVtdIHsKLQkJCVNIQVJFQUJMRV9MSVRFUkFMLAotCQkJVU5TSEFSRUFCTEVfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzU2hhcmluZ1Njb3BlVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJlc1NoYXJpbmdTY29wZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzU2hhcmluZ1Njb3BlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJlc1NoYXJpbmdTY29wZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBTSEFSRUFCTEU6IHJldHVybiBTSEFSRUFCTEVfTElURVJBTDsKLQkJCWNhc2UgVU5TSEFSRUFCTEU6IHJldHVybiBVTlNIQVJFQUJMRV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBSZXNTaGFyaW5nU2NvcGVUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9SZXNTaGFyaW5nU2NvcGVUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzb3VyY2VFbnZSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNvdXJjZUVudlJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDMxM2M5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNvdXJjZUVudlJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoZSByZXNvdXJjZS1lbnYtcmVmVHlwZSBpcyB1c2VkIHRvIGRlZmluZQotICogCSAgcmVzb3VyY2UtZW52LXR5cGUgZWxlbWVudHMuICBJdCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLSAqIAkgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QKLSAqIAkgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0gKiAJICBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLSAqIAkgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gb3B0aW9uYWwKLSAqIAkgIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlCi0gKiAJICBleHBlY3RlZCBieSB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4KLSAqIAotICogCSAgSXQgYWxzbyBpbmNsdWRlcyBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mCi0gKiAJICB0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0gKiAKLSAqIAkgIFRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCB0eXBlIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzIGFuCi0gKiAJICBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSB0aGUgdHlwZQotICogCSAgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZQotICogCSAgbXVzdCBiZSBhc3NpZ25tZW50IGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCi0gKiAJICB0YXJnZXQuCi0gKiAKLSAqIAkgIEV4YW1wbGU6Ci0gKiAKLSAqIAkgICZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0OwotICogCSAgICAgICZsdDtyZXNvdXJjZS1lbnYtcmVmLW5hbWUmZ3Q7am1zL1N0b2NrUXVldWUKLSAqIAkgICAgICAmbHQ7L3Jlc291cmNlLWVudi1yZWYtbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7cmVzb3VyY2UtZW52LXJlZi10eXBlJmd0O2phdmF4Lmptcy5RdWV1ZQotICogCSAgICAgICZsdDsvcmVzb3VyY2UtZW52LXJlZi10eXBlJmd0OwotICogCSAgJmx0Oy9yZXNvdXJjZS1lbnYtcmVmJmd0OwotICogCi0gKiAJICAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldFJlc291cmNlRW52UmVmTmFtZSA8ZW0+UmVzb3VyY2UgRW52IFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0UmVzb3VyY2VFbnZSZWZUeXBlIDxlbT5SZXNvdXJjZSBFbnYgUmVmIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNvdXJjZUVudlJlZigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUVudlJlZiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAqIAkgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAqIAkgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAqIAkgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgKiAJICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdAotCSAqIAkgICAgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50LgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlc291cmNlRW52UmVmTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNvdXJjZUVudlJlZl9SZXNvdXJjZUVudlJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0UmVzb3VyY2VFbnZSZWZOYW1lIDxlbT5SZXNvdXJjZSBFbnYgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZUVudlJlZk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWYgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlCi0JICogCSAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZQotCSAqIAkgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yCi0JICogCSAgICBpbnRlcmZhY2UuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWYgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzb3VyY2VFbnZSZWZUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlRW52UmVmX1Jlc291cmNlRW52UmVmVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXNvdXJjZUVudlJlZlR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRSZXNvdXJjZUVudlJlZlR5cGUgPGVtPlJlc291cmNlIEVudiBSZWYgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc291cmNlRW52UmVmVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgKiAJICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgKiAJICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotCSAqIAkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgKiAJICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotCSAqIAkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAqIAkgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VFbnZSZWZfTWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlRW52UmVmX0luamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEluamVjdGlvblRhcmdldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VFbnZSZWZfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBSZXNvdXJjZUVudlJlZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNvdXJjZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc291cmNlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZWYyMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc291cmNlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCQotICogCi0gKiAJICBUaGUgcmVzb3VyY2UtcmVmVHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLSAqIAkgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdAotICogCSAgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0gKiAJICBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsIGFuIG9wdGlvbmFsIGluZGljYXRpb24gb2YKLSAqIAkgIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIGV4cGVjdGVkIGJ5IHRoZQotICogCSAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZSwgYW4gb3B0aW9uYWwgdHlwZSBvZiBhdXRoZW50aWNhdGlvbgotICogCSAgKEFwcGxpY2F0aW9uIG9yIENvbnRhaW5lciksIGFuZCBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mCi0gKiAJICB0aGUgc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlCi0gKiAJICAoU2hhcmVhYmxlIG9yIFVuc2hhcmVhYmxlKS4KLSAqIAotICogCSAgSXQgYWxzbyBpbmNsdWRlcyBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mCi0gKiAJICB0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0gKiAKLSAqIAkgIFRoZSBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBtdXN0IGJlIHN1cHBsaWVkIHVubGVzcyBhbgotICogCSAgaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgdGhlIHR5cGUKLSAqIAkgIG9mIHRoZSB0YXJnZXQgaXMgdXNlZC4gIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHR5cGUKLSAqIAkgIG11c3QgYmUgYXNzaWdubWVudCBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbgotICogCSAgdGFyZ2V0LgotICogCi0gKiAJICBFeGFtcGxlOgotICogCi0gKiAJICAmbHQ7cmVzb3VyY2UtcmVmJmd0OwotICogCSAgICAgICZsdDtyZXMtcmVmLW5hbWUmZ3Q7amRiYy9FbXBsb3llZUFwcERCJmx0Oy9yZXMtcmVmLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O3Jlcy10eXBlJmd0O2phdmF4LnNxbC5EYXRhU291cmNlJmx0Oy9yZXMtdHlwZSZndDsKLSAqIAkgICAgICAmbHQ7cmVzLWF1dGgmZ3Q7Q29udGFpbmVyJmx0Oy9yZXMtYXV0aCZndDsKLSAqIAkgICAgICAmbHQ7cmVzLXNoYXJpbmctc2NvcGUmZ3Q7U2hhcmVhYmxlJmx0Oy9yZXMtc2hhcmluZy1zY29wZSZndDsKLSAqIAkgICZsdDsvcmVzb3VyY2UtcmVmJmd0OwotICogCi0gKiAJICAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc1JlZk5hbWUgPGVtPlJlcyBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc1R5cGUgPGVtPlJlcyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzQXV0aCA8ZW0+UmVzIEF1dGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNTaGFyaW5nU2NvcGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VSZWYoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VSZWYgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAqIAkgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLgotCSAqIAkgICAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICogCSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICogCSAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IEZpbGUuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcyBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzUmVmTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNvdXJjZVJlZl9SZXNSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlc1JlZk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNSZWZOYW1lIDxlbT5SZXMgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcyBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzUmVmTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhCi0JICogCSAgICBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkCi0JICogCSAgICBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZQotCSAqIAkgICAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXMgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNvdXJjZVJlZl9SZXNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlc1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNUeXBlIDxlbT5SZXMgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc1R5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcyBBdXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkFwcGxpY2F0aW9uIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcyBBdXRoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcyBBdXRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNBdXRoVHlwZQotCSAqIEBzZWUgI2lzU2V0UmVzQXV0aCgpCi0JICogQHNlZSAjdW5zZXRSZXNBdXRoKCkKLQkgKiBAc2VlICNzZXRSZXNBdXRoKFJlc0F1dGhUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VSZWZfUmVzQXV0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc0F1dGhUeXBlIGdldFJlc0F1dGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNBdXRoIDxlbT5SZXMgQXV0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzIEF1dGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlCi0JICogQHNlZSAjaXNTZXRSZXNBdXRoKCkKLQkgKiBAc2VlICN1bnNldFJlc0F1dGgoKQotCSAqIEBzZWUgI2dldFJlc0F1dGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc0F1dGgoUmVzQXV0aFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzQXV0aCA8ZW0+UmVzIEF1dGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVzQXV0aCgpCi0JICogQHNlZSAjZ2V0UmVzQXV0aCgpCi0JICogQHNlZSAjc2V0UmVzQXV0aChSZXNBdXRoVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc0F1dGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc0F1dGggPGVtPlJlcyBBdXRoPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXMgQXV0aDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVzQXV0aCgpCi0JICogQHNlZSAjZ2V0UmVzQXV0aCgpCi0JICogQHNlZSAjc2V0UmVzQXV0aChSZXNBdXRoVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlc0F1dGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IlNoYXJlYWJsZSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlCi0JICogQHNlZSAjaXNTZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI3Vuc2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAc2VlICNzZXRSZXNTaGFyaW5nU2NvcGUoUmVzU2hhcmluZ1Njb3BlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlUmVmX1Jlc1NoYXJpbmdTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc1NoYXJpbmdTY29wZVR5cGUgZ2V0UmVzU2hhcmluZ1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzU2hhcmluZ1Njb3BlIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGUKLQkgKiBAc2VlICNpc1NldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjdW5zZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI2dldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzU2hhcmluZ1Njb3BlIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI2dldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc1NoYXJpbmdTY29wZSA8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI2dldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJICAgIAotCSAqIAotCSAqIAkgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCi0JICogCSAgICAgIG1hcHBlZCB0by4gIFRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UsIGFzIGRlZmluZWQgYnkgdGhlCi0JICogCSAgICAgIHJlc291cmNlJ3MgbmFtZSBlbGVtZW50IG9yIGRlZmF1bHRlZCwgaXMgYSBuYW1lIHRoYXQgaXMKLQkgKiAJICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCi0JICogCSAgICAgIChJdCdzIGEgbmFtZSBpbiB0aGUgSk5ESSBqYXZhOmNvbXAvZW52IG5hbWVzcGFjZS4pICBNYW55Ci0JICogCSAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0byBtYXAgdGhlc2UgbG9jYWwKLQkgKiAJICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgotCSAqIAkgICAgICBzZXJ2ZXIuICBUaGlzIG1hcHBlZCBuYW1lIGlzIG9mdGVuIGEgZ2xvYmFsIEpOREkgbmFtZSwKLQkgKiAJICAgICAgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uCi0JICogCi0JICogCSAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQotCSAqIAkgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5Ci0JICogCSAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLQkgKiAJICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObwotCSAqIAkgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXBwZWROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlUmVmX01hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNvdXJjZVJlZl9JbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlUmVmX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUmVzb3VyY2VSZWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUnVuQXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SdW5Bcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmYyMzFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SdW5Bcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SdW4gQXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBydW4tYXNUeXBlIHNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlCi0gKiAJdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbXBvbmVudC4gSXQgY29udGFpbnMgYW4KLSAqIAlvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXMjZ2V0Um9sZU5hbWUgPGVtPlJvbGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UnVuQXMoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUnVuQXMgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSdW5Bc19EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSb2xlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSdW5Bc19Sb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSb2xlTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzI2dldFJvbGVOYW1lIDxlbT5Sb2xlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Um9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvbGVOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJ1bkFzX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXMjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUnVuQXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VjdXJpdHlSb2xlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VjdXJpdHlSb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMWFjMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlY3VyaXR5Um9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWN1cml0eSBSb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoZSBzZWN1cml0eS1yb2xlVHlwZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5Ci0gKiAJICByb2xlLiBUaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZgotICogCSAgdGhlIHNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotICogCi0gKiAJICBFeGFtcGxlOgotICogCi0gKiAJICAgICAgJmx0O3NlY3VyaXR5LXJvbGUmZ3Q7Ci0gKiAJICAgICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwotICogCQkgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZAotICogCQkgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4KLSAqIAkgICAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICogCSAgICAgICZsdDtyb2xlLW5hbWUmZ3Q7ZW1wbG95ZWUmbHQ7L3JvbGUtbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7L3NlY3VyaXR5LXJvbGUmZ3Q7Ci0gKiAKLSAqIAkgIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZSNnZXRSb2xlTmFtZSA8ZW0+Um9sZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VjdXJpdHlSb2xlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3VyaXR5Um9sZSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSb2xlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Um9sZU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUjZ2V0Um9sZU5hbWUgPGVtPlJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VjdXJpdHlSb2xlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFNlY3VyaXR5Um9sZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZWN1cml0eVJvbGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZWN1cml0eVJvbGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiMWQ3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VjdXJpdHlSb2xlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgc2VjdXJpdHktcm9sZS1yZWZUeXBlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhCi0gKiAJc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgaW4gYSBjb21wb25lbnQncyBvciBhCi0gKiAJRGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4KLSAqIAlvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZQotICogCWNvZGUsIGFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlCi0gKiAJc2VjdXJpdHkgcm9sZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4KLSAqIAlhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmI2dldFJvbGVOYW1lIDxlbT5Sb2xlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0Um9sZUxpbmsgPGVtPlJvbGUgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlY3VyaXR5Um9sZVJlZigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZWN1cml0eVJvbGVSZWYgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkCi0JICogCSAgICBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZQotCSAqIAkgICAgRUpCQ29udGV4dC5pc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZU5hbWUpIG1ldGhvZCBvciB0aGUKLQkgKiAJICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSb2xlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZWN1cml0eVJvbGVSZWZfUm9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Um9sZU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0Um9sZU5hbWUgPGVtPlJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGUgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkCi0JICogCSAgICBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluCi0JICogCSAgICB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlCi0JICogCSAgICBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGVMaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlY3VyaXR5Um9sZVJlZl9Sb2xlTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSb2xlTGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiNnZXRSb2xlTGluayA8ZW0+Um9sZSBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJvbGVMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb2xlTGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZWN1cml0eVJvbGVSZWZfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2VjdXJpdHlSb2xlUmVmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZXJ2aWNlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZTA0ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViCi0gKiAJc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQKLSAqIAlpY29ucywgYSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVxdWlyZWQgU2VydmljZSBpbnRlcmZhY2UsCi0gKiAJYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0Ci0gKiAJb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsCi0gKiAJYW4gb3B0aW9uYWwgc2V0IG9mIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0byBiZSByZXNvbHZlZAotICogCWJ5IHRoZSBjb250YWluZXIgdG8gYSBXU0RMIHBvcnQsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgaGFuZGxlcnMuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZVJlZk5hbWUgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldFNlcnZpY2VJbnRlcmZhY2UgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlUmVmVHlwZSA8ZW0+U2VydmljZSBSZWYgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0V3NkbEZpbGUgPGVtPldzZGwgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldFNlcnZpY2VRbmFtZSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0UG9ydENvbXBvbmVudFJlZnMgPGVtPlBvcnQgQ29tcG9uZW50IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SGFuZGxlckNoYWlucyA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VSZWYgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9EaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9JY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHNlcnZpY2UtcmVmLW5hbWUgZWxlbWVudCBkZWNsYXJlcyBsb2dpY2FsIG5hbWUgdGhhdCB0aGUKLQkgKiAJICAgIGNvbXBvbmVudHMgaW4gdGhlIG1vZHVsZSB1c2UgdG8gbG9vayB1cCB0aGUgV2ViIHNlcnZpY2UuIEl0Ci0JICogCSAgICBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzZXJ2aWNlIHJlZmVyZW5jZSBuYW1lcyBzdGFydCB3aXRoCi0JICogCSAgICAic2VydmljZS8iLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlUmVmTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlcnZpY2VSZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlUmVmTmFtZSA8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VSZWZOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgc2VydmljZS1pbnRlcmZhY2UgZWxlbWVudCBkZWNsYXJlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0JICogCSAgICBuYW1lIG9mIHRoZSBKQVgtUlBDIFNlcnZpY2UgaW50ZXJmYWNlIHRoZSBjbGllbnQgZGVwZW5kcyBvbi4KLQkgKiAJICAgIEluIG1vc3QgY2FzZXMgdGhlIHZhbHVlIHdpbGwgYmUgamF2YXgueG1sLnJwYy5TZXJ2aWNlLiAgQSBKQVgtUlBDCi0JICogCSAgICBnZW5lcmF0ZWQgU2VydmljZSBJbnRlcmZhY2UgY2xhc3MgbWF5IGFsc28gYmUgc3BlY2lmaWVkLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VydmljZUludGVyZmFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VydmljZUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZUludGVyZmFjZSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBzZXJ2aWNlLXJlZi10eXBlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIHR5cGUgb2YgdGhlIHNlcnZpY2UtcmVmCi0JICogCSAgICBlbGVtZW50IHRoYXQgaXMgaW5qZWN0ZWQgb3IgcmV0dXJuZWQgd2hlbiBhIEpOREkgbG9va3VwIGlzIGRvbmUuCi0JICogCSAgICBUaGlzIG11c3QgYmUgZWl0aGVyIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgU2VydmljZSBjbGFzcyBvcgotCSAqIAkgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIGNsYXNzLgotCSAqIAkgICAgVGhpcyBpcyBvbmx5IHVzZWQgd2l0aCBKQVgtV1MgcnVudGltZSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZwotCSAqIAkgICAgQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBjYW4gYmUgdXNlZCB0byBkZW5vdGUgYm90aCBhIFNlcnZpY2UKLQkgKiAJICAgIG9yIGEgUG9ydC4KLQkgKiAKLQkgKiAJICAgIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgdHlwZSBvZiBzZXJ2aWNlLXJlZiBlbGVtZW50Ci0JICogCSAgICB0aGF0IGlzIGluamVjdGVkIG9yIHJldHVybmVkIHdoZW4gYSBKTkRJIGxvb2t1cCBpcyBkb25lIGlzCi0JICogCSAgICBhbHdheXMgYSBTZXJ2aWNlIGludGVyZmFjZS9jbGFzcy4KLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWYgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VydmljZVJlZlR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXJ2aWNlUmVmVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZVJlZlR5cGUgPGVtPlNlcnZpY2UgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2aWNlUmVmVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgVVJJIGxvY2F0aW9uIG9mIGEgV1NETAotCSAqIAkgICAgZmlsZS4gVGhlIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBtb2R1bGUuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V3NkbEZpbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXc2RsRmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0V3NkbEZpbGUgPGVtPldzZGwgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXc2RsRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V3NkbEZpbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpheHJwYyBNYXBwaW5nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGpheHJwYy1tYXBwaW5nLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdAotCSAqIAkgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQotCSAqIAkgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCi0JICogCSAgICBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlIGZpbGUuCi0JICogCi0JICogCSAgICBUaGlzIGlzIG5vdCByZXF1aXJlZCB3aGVuIEpBWC1XUyBiYXNlZCBydW50aW1lIGlzIHVzZWQuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEpheHJwY01hcHBpbmdGaWxlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEpheHJwY01hcHBpbmdGaWxlIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SmF4cnBjTWFwcGluZ0ZpbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUW5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHNlcnZpY2UtcW5hbWUgZWxlbWVudCBkZWNsYXJlcyB0aGUgc3BlY2lmaWMgV1NETCBzZXJ2aWNlCi0JICogCSAgICBlbGVtZW50IHRoYXQgaXMgYmVpbmcgcmVmZXJlZCB0by4gIEl0IGlzIG5vdCBzcGVjaWZpZWQgaWYgbm8KLQkgKiAJICAgIHdzZGwtZmlsZSBpcyBkZWNsYXJlZC4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBRbmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VydmljZVFuYW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFNlcnZpY2VRbmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZVFuYW1lIDxlbT5TZXJ2aWNlIFFuYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFFuYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUW5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VRbmFtZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLQkgKiAJICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0JICogCSAgICB0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci0JICogCSAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0JICogCSAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQb3J0Q29tcG9uZW50UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCQlEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuCi0JICogCQlhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUKLQkgKiAJCUhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZQotCSAqIAkJaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwgcG9ydHMgb2YgdGhlCi0JICogCQlzZXJ2aWNlLgotCSAqIAotCSAqIAkJVG8gYmUgdXNlZCB3aXRoIEpBWC1SUEMgYmFzZWQgcnVudGltZSBvbmx5LgotCSAqIAotCSAqIAkgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX0hhbmRsZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRIYW5kbGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFuZGxlciBDaGFpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkJIFRvIGJlIHVzZWQgd2l0aCBKQVgtV1MgYmFzZWQgcnVudGltZSBvbmx5LgotCSAqIAkgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEhhbmRsZXJDaGFpbnMoU2VydmljZVJlZkhhbmRsZXJDaGFpbnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX0hhbmRsZXJDaGFpbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBnZXRIYW5kbGVyQ2hhaW5zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRIYW5kbGVyQ2hhaW5zIDxlbT5IYW5kbGVyIENoYWluczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEhhbmRsZXJDaGFpbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhhbmRsZXJDaGFpbnMoU2VydmljZVJlZkhhbmRsZXJDaGFpbnMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgKiAJICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgKiAJICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotCSAqIAkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgKiAJICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotCSAqIAkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAqIAkgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9NYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX0luamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEluamVjdGlvblRhcmdldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2VydmljZVJlZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZXJ2aWNlUmVmSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxN2M5Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgUmVmIEhhbmRsZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotICogCWluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZgotICogCXBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQKLSAqIAl3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KLSAqIAotICogCVVzZWQgaW46IHNlcnZpY2UtcmVmCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldEhhbmRsZXJOYW1lIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRIYW5kbGVyQ2xhc3MgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldFNvYXBIZWFkZXJzIDxlbT5Tb2FwIEhlYWRlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRTb2FwUm9sZXMgPGVtPlNvYXAgUm9sZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRQb3J0TmFtZXMgPGVtPlBvcnQgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VSZWZIYW5kbGVyIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlcl9EaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfSWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgKiAJICAgIHdpdGhpbiB0aGUgbW9kdWxlLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhhbmRsZXJOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEhhbmRsZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIYW5kbGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFuZGxlck5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgRGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGFuZGxlcgotCSAqIAkgICAgaW1wbGVtZW50YXRpb24uCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhhbmRsZXJDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlcl9IYW5kbGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SGFuZGxlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SGFuZGxlckNsYXNzIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhhbmRsZXJDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfSW5pdFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLk9iamVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZAotCSAqIAkgICAgYnkgdGhlIGhhbmRsZXIuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgSGVhZGVyczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBIZWFkZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTb2FwSGVhZGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBSb2xlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdAotCSAqIAkgICAgdGhlIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBSb2xlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBSb2xlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U29hcFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBwb3J0LW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBXU0RMIHBvcnQtbmFtZSB0aGF0IGEKLQkgKiAJICAgIGhhbmRsZXIgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyX1BvcnROYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UG9ydE5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2VydmljZVJlZkhhbmRsZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZkhhbmRsZXJDaGFpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwYjg4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZkhhbmRsZXJDaGFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqICAgICAgIFRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWluLgotICogICAgICAgSGFuZGxlcmNoYWluIGNhbiBiZSBkZWZpbmVkIHN1Y2ggdGhhdCB0aGUgaGFuZGxlcnMgaW4gdGhlCi0gKiAgICAgICBoYW5kbGVyY2hhaW4gb3BlcmF0ZSxhbGwgcG9ydHMgb2YgYSBzZXJ2aWNlLCBvbiBhIHNwZWNpZmljCi0gKiAgICAgICBwb3J0IG9yIG9uIGEgbGlzdCBvZiBwcm90b2NvbC1iaW5kaW5ncy4gVGhlIGNob2ljZSBvZiBlbGVtZW50cwotICogICAgICAgc2VydmljZS1uYW1lLXBhdHRlcm4sIHBvcnQtbmFtZS1wYXR0ZXJuIGFuZCBwcm90b2NvbC1iaW5kaW5ncwotICogICAgICAgYXJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBoYW5kbGVycyBpbiBoYW5kbGVyLWNoYWluIGFyZQotICogICAgICAgZm9yIGEgc2VydmljZSwgcG9ydCBvciBwcm90b2NvbCBiaW5kaW5nLiBJZiBub25lIG9mIHRoZXNlCi0gKiAgICAgICBjaG9pY2VzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgaGFuZGxlci1jaGFpbiBlbGVtZW50IHRoZW4gdGhlCi0gKiAgICAgICBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhlIGhhbmRsZXItY2hhaW4gd2lsbCBiZSBhcHBsaWVkIG9uCi0gKiAgICAgICBldmVyeXRoaW5nLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4gPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRQb3J0TmFtZVBhdHRlcm4gPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRQcm90b2NvbEJpbmRpbmdzIDxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZVJlZkhhbmRsZXJDaGFpbiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlTmFtZVBhdHRlcm4oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9TZXJ2aWNlTmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4gPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2aWNlTmFtZVBhdHRlcm4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcnQgTmFtZSBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3J0IE5hbWUgUGF0dGVybjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWUgUGF0dGVybjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9ydE5hbWVQYXR0ZXJuKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fUG9ydE5hbWVQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBvcnROYW1lUGF0dGVybigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0UG9ydE5hbWVQYXR0ZXJuIDxlbT5Qb3J0IE5hbWUgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvcnROYW1lUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9ydE5hbWVQYXR0ZXJuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm90b2NvbCBCaW5kaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvdG9jb2wgQmluZGluZ3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdG9jb2wgQmluZGluZ3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb3RvY29sQmluZGluZ3MoTGlzdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fUHJvdG9jb2xCaW5kaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UHJvdG9jb2xCaW5kaW5ncygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0UHJvdG9jb2xCaW5kaW5ncyA8ZW0+UHJvdG9jb2wgQmluZGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb3RvY29sIEJpbmRpbmdzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcm90b2NvbEJpbmRpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm90b2NvbEJpbmRpbmdzKExpc3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFuZGxlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fSGFuZGxlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEhhbmRsZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZkhhbmRsZXJDaGFpbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZXJ2aWNlUmVmSGFuZGxlckNoYWlucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGNhN2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZXJ2aWNlUmVmSGFuZGxlckNoYWlucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW5zPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqICAgICAgIFRoZSBoYW5kbGVyLWNoYWlucyBlbGVtZW50IGRlZmluZXMgdGhlIGhhbmRsZXJjaGFpbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAqICAgICAgIHNlcnZpY2Ugb3Igc2VydmljZSBlbmRwb2ludC4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zI2dldEhhbmRsZXJDaGFpbnMgPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbnMjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFuZGxlciBDaGFpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYW5kbGVyIENoYWluczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnNfSGFuZGxlckNoYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SGFuZGxlckNoYWlucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1VybFBhdHRlcm5UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvVXJsUGF0dGVyblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2NjkxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvVXJsUGF0dGVyblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VcmwgUGF0dGVybiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgdXJsLXBhdHRlcm5UeXBlIGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4KLSAqIAlJdCBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTEuMiBvZiB0aGUKLSAqIAlTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLiBUaGlzIHBhdHRlcm4gaXMgYXNzdW1lZCB0byBiZSBpbgotICogCVVSTC1kZWNvZGVkIGZvcm0gYW5kIG11c3Qgbm90IGNvbnRhaW4gQ1IoI3hEKSBvciBMRigjeEEpLgotICogCUlmIGl0IGNvbnRhaW5zIHRob3NlIGNoYXJhY3RlcnMsIHRoZSBjb250YWluZXIgbXVzdCBpbmZvcm0KLSAqIAl0aGUgZGV2ZWxvcGVyIHdpdGggYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlLgotICogCVRoZSBjb250YWluZXIgbXVzdCBwcmVzZXJ2ZSBhbGwgY2hhcmFjdGVycyBpbmNsdWRpbmcgd2hpdGVzcGFjZXMuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFVybFBhdHRlcm5UeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVybFBhdHRlcm5UeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFVybFBhdHRlcm5UeXBlX1ZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVXJsUGF0dGVyblR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzgwNTZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhbmcgPSBMQU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZygpIHsKLQkJcmV0dXJuIGxhbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZyhTdHJpbmcgbmV3TGFuZykgewotCQlTdHJpbmcgb2xkTGFuZyA9IGxhbmc7Ci0JCWxhbmcgPSBuZXdMYW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HLCBvbGRMYW5nLCBsYW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTl9fTEFORzoKLQkJCQlyZXR1cm4gZ2V0TGFuZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTl9fTEFORzoKLQkJCQlzZXRMYW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkc6Ci0JCQkJc2V0TGFuZyhMQU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTl9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkc6Ci0JCQkJcmV0dXJuIExBTkdfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmcgIT0gbnVsbCA6ICFMQU5HX0VERUZBVUxULmVxdWFscyhsYW5nKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxhbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9EaXNwbGF5TmFtZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0Rpc3BsYXlOYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGMwZWIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0Rpc3BsYXlOYW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lSW1wbCNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzcGxheU5hbWVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEaXNwbGF5TmFtZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsYW5nID0gTEFOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNwbGF5TmFtZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkRJU1BMQVlfTkFNRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkRJU1BMQVlfTkFNRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZygpIHsKLQkJcmV0dXJuIGxhbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZyhTdHJpbmcgbmV3TGFuZykgewotCQlTdHJpbmcgb2xkTGFuZyA9IGxhbmc7Ci0JCWxhbmcgPSBuZXdMYW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkRJU1BMQVlfTkFNRV9fTEFORywgb2xkTGFuZywgbGFuZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ESVNQTEFZX05BTUVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRJU1BMQVlfTkFNRV9fTEFORzoKLQkJCQlyZXR1cm4gZ2V0TGFuZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ESVNQTEFZX05BTUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FX19MQU5HOgotCQkJCXNldExhbmcoTEFOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkc6Ci0JCQkJcmV0dXJuIExBTkdfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmcgIT0gbnVsbCA6ICFMQU5HX0VERUZBVUxULmVxdWFscyhsYW5nKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxhbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaXNwbGF5TmFtZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9FamJMb2NhbFJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VqYkxvY2FsUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGZjNDgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VqYkxvY2FsUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVqYiBMb2NhbCBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYkxvY2FsUmVmSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiTG9jYWxSZWZJbXBsI2dldEVqYlJlZk5hbWUgPGVtPkVqYiBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiTG9jYWxSZWZJbXBsI2dldEVqYlJlZlR5cGUgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiTG9jYWxSZWZJbXBsI2dldExvY2FsSG9tZSA8ZW0+TG9jYWwgSG9tZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiTG9jYWxSZWZJbXBsI2dldExvY2FsIDxlbT5Mb2NhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiTG9jYWxSZWZJbXBsI2dldEVqYkxpbmsgPGVtPkVqYiBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJMb2NhbFJlZkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYkxvY2FsUmVmSW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiTG9jYWxSZWZJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVqYkxvY2FsUmVmSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRWpiTG9jYWxSZWYgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZOYW1lKCkgPGVtPkVqYiBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1JFRl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZk5hbWUoKSA8ZW0+RWpiIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYlJlZk5hbWUgPSBFSkJfUkVGX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVmVHlwZSgpIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRWpiUmVmVHlwZSBFSkJfUkVGX1RZUEVfRURFRkFVTFQgPSBFamJSZWZUeXBlLkVOVElUWV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVmVHlwZSgpIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFamJSZWZUeXBlIGVqYlJlZlR5cGUgPSBFSkJfUkVGX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEVqYiBSZWYgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWpiUmVmVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEhvbWUoKSA8ZW0+TG9jYWwgSG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9IT01FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsSG9tZSgpIDxlbT5Mb2NhbCBIb21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYWxIb21lID0gTE9DQUxfSE9NRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbCgpIDxlbT5Mb2NhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsKCkgPGVtPkxvY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhbCA9IExPQ0FMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkxpbmsoKSA8ZW0+RWpiIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9MSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkxpbmsoKSA8ZW0+RWpiIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiTGluayA9IEVKQl9MSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkTmFtZSA9IE1BUFBFRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5qZWN0aW9uVGFyZ2V0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFamJMb2NhbFJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkVKQl9MT0NBTF9SRUY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJSZWZOYW1lKCkgewotCQlyZXR1cm4gZWpiUmVmTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJSZWZOYW1lKFN0cmluZyBuZXdFamJSZWZOYW1lKSB7Ci0JCVN0cmluZyBvbGRFamJSZWZOYW1lID0gZWpiUmVmTmFtZTsKLQkJZWpiUmVmTmFtZSA9IG5ld0VqYlJlZk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9OQU1FLCBvbGRFamJSZWZOYW1lLCBlamJSZWZOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYlJlZlR5cGUgZ2V0RWpiUmVmVHlwZSgpIHsKLQkJcmV0dXJuIGVqYlJlZlR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiUmVmVHlwZShFamJSZWZUeXBlIG5ld0VqYlJlZlR5cGUpIHsKLQkJRWpiUmVmVHlwZSBvbGRFamJSZWZUeXBlID0gZWpiUmVmVHlwZTsKLQkJZWpiUmVmVHlwZSA9IG5ld0VqYlJlZlR5cGUgPT0gbnVsbCA/IEVKQl9SRUZfVFlQRV9FREVGQVVMVCA6IG5ld0VqYlJlZlR5cGU7Ci0JCWJvb2xlYW4gb2xkRWpiUmVmVHlwZUVTZXQgPSBlamJSZWZUeXBlRVNldDsKLQkJZWpiUmVmVHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfVFlQRSwgb2xkRWpiUmVmVHlwZSwgZWpiUmVmVHlwZSwgIW9sZEVqYlJlZlR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFamJSZWZUeXBlKCkgewotCQlFamJSZWZUeXBlIG9sZEVqYlJlZlR5cGUgPSBlamJSZWZUeXBlOwotCQlib29sZWFuIG9sZEVqYlJlZlR5cGVFU2V0ID0gZWpiUmVmVHlwZUVTZXQ7Ci0JCWVqYlJlZlR5cGUgPSBFSkJfUkVGX1RZUEVfRURFRkFVTFQ7Ci0JCWVqYlJlZlR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19FSkJfUkVGX1RZUEUsIG9sZEVqYlJlZlR5cGUsIEVKQl9SRUZfVFlQRV9FREVGQVVMVCwgb2xkRWpiUmVmVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEVqYlJlZlR5cGUoKSB7Ci0JCXJldHVybiBlamJSZWZUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsSG9tZSgpIHsKLQkJcmV0dXJuIGxvY2FsSG9tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEhvbWUoU3RyaW5nIG5ld0xvY2FsSG9tZSkgewotCQlTdHJpbmcgb2xkTG9jYWxIb21lID0gbG9jYWxIb21lOwotCQlsb2NhbEhvbWUgPSBuZXdMb2NhbEhvbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRSwgb2xkTG9jYWxIb21lLCBsb2NhbEhvbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsKCkgewotCQlyZXR1cm4gbG9jYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWwoU3RyaW5nIG5ld0xvY2FsKSB7Ci0JCVN0cmluZyBvbGRMb2NhbCA9IGxvY2FsOwotCQlsb2NhbCA9IG5ld0xvY2FsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMLCBvbGRMb2NhbCwgbG9jYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYkxpbmsoKSB7Ci0JCXJldHVybiBlamJMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYkxpbmsoU3RyaW5nIG5ld0VqYkxpbmspIHsKLQkJU3RyaW5nIG9sZEVqYkxpbmsgPSBlamJMaW5rOwotCQllamJMaW5rID0gbmV3RWpiTGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19FSkJfTElOSywgb2xkRWpiTGluaywgZWpiTGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIG1hcHBlZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgbmV3TWFwcGVkTmFtZSkgewotCQlTdHJpbmcgb2xkTWFwcGVkTmFtZSA9IG1hcHBlZE5hbWU7Ci0JCW1hcHBlZE5hbWUgPSBuZXdNYXBwZWROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX01BUFBFRF9OQU1FLCBvbGRNYXBwZWROYW1lLCBtYXBwZWROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJaWYgKGluamVjdGlvblRhcmdldHMgPT0gbnVsbCkgewotCQkJaW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbmplY3Rpb25UYXJnZXQuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOwotCQl9Ci0JCXJldHVybiBpbmplY3Rpb25UYXJnZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmVHlwZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMX0hPTUU6Ci0JCQkJcmV0dXJuIGdldExvY2FsSG9tZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMOgotCQkJCXJldHVybiBnZXRMb2NhbCgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9MSU5LOgotCQkJCXJldHVybiBnZXRFamJMaW5rKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1hcHBlZE5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9OQU1FOgotCQkJCXNldEVqYlJlZk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfVFlQRToKLQkJCQlzZXRFamJSZWZUeXBlKChFamJSZWZUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRToKLQkJCQlzZXRMb2NhbEhvbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMOgotCQkJCXNldExvY2FsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19FSkJfTElOSzoKLQkJCQlzZXRFamJMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9OQU1FOgotCQkJCXNldEVqYlJlZk5hbWUoRUpCX1JFRl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9UWVBFOgotCQkJCXVuc2V0RWpiUmVmVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FOgotCQkJCXNldExvY2FsSG9tZShMT0NBTF9IT01FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJc2V0TG9jYWwoTE9DQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19FSkJfTElOSzoKLQkJCQlzZXRFamJMaW5rKEVKQl9MSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZShNQVBQRURfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19FSkJfUkVGX05BTUU6Ci0JCQkJcmV0dXJuIEVKQl9SRUZfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZWpiUmVmTmFtZSAhPSBudWxsIDogIUVKQl9SRUZfTkFNRV9FREVGQVVMVC5lcXVhbHMoZWpiUmVmTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9UWVBFOgotCQkJCXJldHVybiBpc1NldEVqYlJlZlR5cGUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FOgotCQkJCXJldHVybiBMT0NBTF9IT01FX0VERUZBVUxUID09IG51bGwgPyBsb2NhbEhvbWUgIT0gbnVsbCA6ICFMT0NBTF9IT01FX0VERUZBVUxULmVxdWFscyhsb2NhbEhvbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMOgotCQkJCXJldHVybiBMT0NBTF9FREVGQVVMVCA9PSBudWxsID8gbG9jYWwgIT0gbnVsbCA6ICFMT0NBTF9FREVGQVVMVC5lcXVhbHMobG9jYWwpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9MSU5LOgotCQkJCXJldHVybiBFSkJfTElOS19FREVGQVVMVCA9PSBudWxsID8gZWpiTGluayAhPSBudWxsIDogIUVKQl9MSU5LX0VERUZBVUxULmVxdWFscyhlamJMaW5rKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gTUFQUEVEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZE5hbWUgIT0gbnVsbCA6ICFNQVBQRURfTkFNRV9FREVGQVVMVC5lcXVhbHMobWFwcGVkTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGluamVjdGlvblRhcmdldHMgIT0gbnVsbCAmJiAhaW5qZWN0aW9uVGFyZ2V0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJSZWZOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYlJlZk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVqYlJlZlR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChlamJSZWZUeXBlRVNldCkgcmVzdWx0LmFwcGVuZChlamJSZWZUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2NhbEhvbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobG9jYWxIb21lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2NhbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsb2NhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWpiTGluazogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlamJMaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRWpiTG9jYWxSZWZJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRWpiUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRWpiUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTA4ZTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VqYlJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWpiIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCNnZXRFamJSZWZOYW1lIDxlbT5FamIgUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0RWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJSZWZJbXBsI2dldEhvbWUgPGVtPkhvbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0UmVtb3RlIDxlbT5SZW1vdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiUmVmSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRWpiUmVmIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVmTmFtZSgpIDxlbT5FamIgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9SRUZfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZOYW1lKCkgPGVtPkVqYiBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJSZWZOYW1lID0gRUpCX1JFRl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZlR5cGUoKSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVqYlJlZlR5cGUgRUpCX1JFRl9UWVBFX0VERUZBVUxUID0gRWpiUmVmVHlwZS5FTlRJVFlfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZlR5cGUoKSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWpiUmVmVHlwZSBlamJSZWZUeXBlID0gRUpCX1JFRl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFamIgUmVmIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVqYlJlZlR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG9tZSgpIDxlbT5Ib21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIT01FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvbWUoKSA8ZW0+SG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBob21lID0gSE9NRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1vdGUoKSA8ZW0+UmVtb3RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1vdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1vdGUoKSA8ZW0+UmVtb3RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1vdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVtb3RlID0gUkVNT1RFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkxpbmsoKSA8ZW0+RWpiIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9MSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkxpbmsoKSA8ZW0+RWpiIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiTGluayA9IEVKQl9MSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkTmFtZSA9IE1BUFBFRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5qZWN0aW9uVGFyZ2V0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFamJSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5FSkJfUkVGOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiUmVmTmFtZSgpIHsKLQkJcmV0dXJuIGVqYlJlZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiUmVmTmFtZShTdHJpbmcgbmV3RWpiUmVmTmFtZSkgewotCQlTdHJpbmcgb2xkRWpiUmVmTmFtZSA9IGVqYlJlZk5hbWU7Ci0JCWVqYlJlZk5hbWUgPSBuZXdFamJSZWZOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9SRUZfTkFNRSwgb2xkRWpiUmVmTmFtZSwgZWpiUmVmTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJSZWZUeXBlIGdldEVqYlJlZlR5cGUoKSB7Ci0JCXJldHVybiBlamJSZWZUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYlJlZlR5cGUoRWpiUmVmVHlwZSBuZXdFamJSZWZUeXBlKSB7Ci0JCUVqYlJlZlR5cGUgb2xkRWpiUmVmVHlwZSA9IGVqYlJlZlR5cGU7Ci0JCWVqYlJlZlR5cGUgPSBuZXdFamJSZWZUeXBlID09IG51bGwgPyBFSkJfUkVGX1RZUEVfRURFRkFVTFQgOiBuZXdFamJSZWZUeXBlOwotCQlib29sZWFuIG9sZEVqYlJlZlR5cGVFU2V0ID0gZWpiUmVmVHlwZUVTZXQ7Ci0JCWVqYlJlZlR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19FSkJfUkVGX1RZUEUsIG9sZEVqYlJlZlR5cGUsIGVqYlJlZlR5cGUsICFvbGRFamJSZWZUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RWpiUmVmVHlwZSgpIHsKLQkJRWpiUmVmVHlwZSBvbGRFamJSZWZUeXBlID0gZWpiUmVmVHlwZTsKLQkJYm9vbGVhbiBvbGRFamJSZWZUeXBlRVNldCA9IGVqYlJlZlR5cGVFU2V0OwotCQllamJSZWZUeXBlID0gRUpCX1JFRl9UWVBFX0VERUZBVUxUOwotCQllamJSZWZUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fRUpCX1JFRl9UWVBFLCBvbGRFamJSZWZUeXBlLCBFSkJfUkVGX1RZUEVfRURFRkFVTFQsIG9sZEVqYlJlZlR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFamJSZWZUeXBlKCkgewotCQlyZXR1cm4gZWpiUmVmVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb21lKCkgewotCQlyZXR1cm4gaG9tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb21lKFN0cmluZyBuZXdIb21lKSB7Ci0JCVN0cmluZyBvbGRIb21lID0gaG9tZTsKLQkJaG9tZSA9IG5ld0hvbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSE9NRSwgb2xkSG9tZSwgaG9tZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlKCkgewotCQlyZXR1cm4gcmVtb3RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZShTdHJpbmcgbmV3UmVtb3RlKSB7Ci0JCVN0cmluZyBvbGRSZW1vdGUgPSByZW1vdGU7Ci0JCXJlbW90ZSA9IG5ld1JlbW90ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19SRU1PVEUsIG9sZFJlbW90ZSwgcmVtb3RlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJMaW5rKCkgewotCQlyZXR1cm4gZWpiTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJMaW5rKFN0cmluZyBuZXdFamJMaW5rKSB7Ci0JCVN0cmluZyBvbGRFamJMaW5rID0gZWpiTGluazsKLQkJZWpiTGluayA9IG5ld0VqYkxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fRUpCX0xJTkssIG9sZEVqYkxpbmssIGVqYkxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiBtYXBwZWROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIG5ld01hcHBlZE5hbWUpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZE5hbWUgPSBtYXBwZWROYW1lOwotCQltYXBwZWROYW1lID0gbmV3TWFwcGVkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19NQVBQRURfTkFNRSwgb2xkTWFwcGVkTmFtZSwgbWFwcGVkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluamVjdGlvblRhcmdldHMoKSB7Ci0JCWlmIChpbmplY3Rpb25UYXJnZXRzID09IG51bGwpIHsKLQkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKLQkJfQotCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluamVjdGlvblRhcmdldHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19FSkJfUkVGX05BTUU6Ci0JCQkJcmV0dXJuIGdldEVqYlJlZk5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19FSkJfUkVGX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVqYlJlZlR5cGUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19IT01FOgotCQkJCXJldHVybiBnZXRIb21lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fUkVNT1RFOgotCQkJCXJldHVybiBnZXRSZW1vdGUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19FSkJfTElOSzoKLQkJCQlyZXR1cm4gZ2V0RWpiTGluaygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBnZXRNYXBwZWROYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGdldEluamVjdGlvblRhcmdldHMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9SRUZfTkFNRToKLQkJCQlzZXRFamJSZWZOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19FSkJfUkVGX1RZUEU6Ci0JCQkJc2V0RWpiUmVmVHlwZSgoRWpiUmVmVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0hPTUU6Ci0JCQkJc2V0SG9tZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fUkVNT1RFOgotCQkJCXNldFJlbW90ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fRUpCX0xJTks6Ci0JCQkJc2V0RWpiTGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9SRUZfTkFNRToKLQkJCQlzZXRFamJSZWZOYW1lKEVKQl9SRUZfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9SRUZfVFlQRToKLQkJCQl1bnNldEVqYlJlZlR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSE9NRToKLQkJCQlzZXRIb21lKEhPTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19SRU1PVEU6Ci0JCQkJc2V0UmVtb3RlKFJFTU9URV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9MSU5LOgotCQkJCXNldEVqYkxpbmsoRUpCX0xJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKE1BUFBFRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9SRUZfTkFNRToKLQkJCQlyZXR1cm4gRUpCX1JFRl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlamJSZWZOYW1lICE9IG51bGwgOiAhRUpCX1JFRl9OQU1FX0VERUZBVUxULmVxdWFscyhlamJSZWZOYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19FSkJfUkVGX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0RWpiUmVmVHlwZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0hPTUU6Ci0JCQkJcmV0dXJuIEhPTUVfRURFRkFVTFQgPT0gbnVsbCA/IGhvbWUgIT0gbnVsbCA6ICFIT01FX0VERUZBVUxULmVxdWFscyhob21lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19SRU1PVEU6Ci0JCQkJcmV0dXJuIFJFTU9URV9FREVGQVVMVCA9PSBudWxsID8gcmVtb3RlICE9IG51bGwgOiAhUkVNT1RFX0VERUZBVUxULmVxdWFscyhyZW1vdGUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0VKQl9MSU5LOgotCQkJCXJldHVybiBFSkJfTElOS19FREVGQVVMVCA9PSBudWxsID8gZWpiTGluayAhPSBudWxsIDogIUVKQl9MSU5LX0VERUZBVUxULmVxdWFscyhlamJMaW5rKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gTUFQUEVEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZE5hbWUgIT0gbnVsbCA6ICFNQVBQRURfTkFNRV9FREVGQVVMVC5lcXVhbHMobWFwcGVkTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGluamVjdGlvblRhcmdldHMgIT0gbnVsbCAmJiAhaW5qZWN0aW9uVGFyZ2V0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJSZWZOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYlJlZk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVqYlJlZlR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChlamJSZWZUeXBlRVNldCkgcmVzdWx0LmFwcGVuZChlamJSZWZUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBob21lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGhvbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbW90ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZW1vdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVqYkxpbms6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZWpiTGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtYXBwZWROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0VqYlJlZkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9FbXB0eVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9FbXB0eVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGE4NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRW1wdHlUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW1wdHkgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW1wdHlUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbXB0eVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbXB0eVR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVtcHR5VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkVNUFRZX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FTVBUWV9UWVBFX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVNUFRZX1RZUEVfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU1QVFlfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTVBUWV9UWVBFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU1QVFlfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0VtcHR5VHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9FbnZFbnRyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQyNTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW52IEVudHJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbnZFbnRyeUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVudkVudHJ5SW1wbCNnZXRFbnZFbnRyeU5hbWUgPGVtPkVudiBFbnRyeSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbnZFbnRyeUltcGwjZ2V0RW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW52RW50cnlJbXBsI2dldEVudkVudHJ5VmFsdWUgPGVtPkVudiBFbnRyeSBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW52RW50cnlJbXBsI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbnZFbnRyeUltcGwjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVudkVudHJ5SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZFbnRyeUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVudkVudHJ5IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cnlOYW1lKCkgPGVtPkVudiBFbnRyeSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnZFbnRyeU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVl9FTlRSWV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudkVudHJ5TmFtZSgpIDxlbT5FbnYgRW50cnkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW52RW50cnlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVudkVudHJ5TmFtZSA9IEVOVl9FTlRSWV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudkVudHJ5VHlwZSgpIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW52RW50cnlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBFTlZfRU5UUllfVFlQRV9FREVGQVVMVCA9IEVudkVudHJ5VHlwZS5KQVZBX0xBTkdfQk9PTEVBTl9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cnlUeXBlKCkgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnZFbnRyeVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFbnZFbnRyeVR5cGUgZW52RW50cnlUeXBlID0gRU5WX0VOVFJZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEVudiBFbnRyeSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnZFbnRyeVR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cnlWYWx1ZSgpIDxlbT5FbnYgRW50cnkgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudkVudHJ5VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVl9FTlRSWV9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZFbnRyeVZhbHVlKCkgPGVtPkVudiBFbnRyeSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW52RW50cnlWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlbnZFbnRyeVZhbHVlID0gRU5WX0VOVFJZX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkTmFtZSA9IE1BUFBFRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5qZWN0aW9uVGFyZ2V0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbnZFbnRyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkVOVl9FTlRSWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW52RW50cnlOYW1lKCkgewotCQlyZXR1cm4gZW52RW50cnlOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudkVudHJ5TmFtZShTdHJpbmcgbmV3RW52RW50cnlOYW1lKSB7Ci0JCVN0cmluZyBvbGRFbnZFbnRyeU5hbWUgPSBlbnZFbnRyeU5hbWU7Ci0JCWVudkVudHJ5TmFtZSA9IG5ld0VudkVudHJ5TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9OQU1FLCBvbGRFbnZFbnRyeU5hbWUsIGVudkVudHJ5TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnZFbnRyeVR5cGUgZ2V0RW52RW50cnlUeXBlKCkgewotCQlyZXR1cm4gZW52RW50cnlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudkVudHJ5VHlwZShFbnZFbnRyeVR5cGUgbmV3RW52RW50cnlUeXBlKSB7Ci0JCUVudkVudHJ5VHlwZSBvbGRFbnZFbnRyeVR5cGUgPSBlbnZFbnRyeVR5cGU7Ci0JCWVudkVudHJ5VHlwZSA9IG5ld0VudkVudHJ5VHlwZSA9PSBudWxsID8gRU5WX0VOVFJZX1RZUEVfRURFRkFVTFQgOiBuZXdFbnZFbnRyeVR5cGU7Ci0JCWJvb2xlYW4gb2xkRW52RW50cnlUeXBlRVNldCA9IGVudkVudHJ5VHlwZUVTZXQ7Ci0JCWVudkVudHJ5VHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX1RZUEUsIG9sZEVudkVudHJ5VHlwZSwgZW52RW50cnlUeXBlLCAhb2xkRW52RW50cnlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RW52RW50cnlUeXBlKCkgewotCQlFbnZFbnRyeVR5cGUgb2xkRW52RW50cnlUeXBlID0gZW52RW50cnlUeXBlOwotCQlib29sZWFuIG9sZEVudkVudHJ5VHlwZUVTZXQgPSBlbnZFbnRyeVR5cGVFU2V0OwotCQllbnZFbnRyeVR5cGUgPSBFTlZfRU5UUllfVFlQRV9FREVGQVVMVDsKLQkJZW52RW50cnlUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfVFlQRSwgb2xkRW52RW50cnlUeXBlLCBFTlZfRU5UUllfVFlQRV9FREVGQVVMVCwgb2xkRW52RW50cnlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RW52RW50cnlUeXBlKCkgewotCQlyZXR1cm4gZW52RW50cnlUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVudkVudHJ5VmFsdWUoKSB7Ci0JCXJldHVybiBlbnZFbnRyeVZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudkVudHJ5VmFsdWUoU3RyaW5nIG5ld0VudkVudHJ5VmFsdWUpIHsKLQkJU3RyaW5nIG9sZEVudkVudHJ5VmFsdWUgPSBlbnZFbnRyeVZhbHVlOwotCQllbnZFbnRyeVZhbHVlID0gbmV3RW52RW50cnlWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9WQUxVRSwgb2xkRW52RW50cnlWYWx1ZSwgZW52RW50cnlWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIG1hcHBlZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgbmV3TWFwcGVkTmFtZSkgewotCQlTdHJpbmcgb2xkTWFwcGVkTmFtZSA9IG1hcHBlZE5hbWU7Ci0JCW1hcHBlZE5hbWUgPSBuZXdNYXBwZWROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fTUFQUEVEX05BTUUsIG9sZE1hcHBlZE5hbWUsIG1hcHBlZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCkgewotCQlpZiAoaW5qZWN0aW9uVGFyZ2V0cyA9PSBudWxsKSB7Ci0JCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluamVjdGlvblRhcmdldC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTKTsKLQkJfQotCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluamVjdGlvblRhcmdldHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX05BTUU6Ci0JCQkJcmV0dXJuIGdldEVudkVudHJ5TmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVudkVudHJ5VHlwZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX1ZBTFVFOgotCQkJCXJldHVybiBnZXRFbnZFbnRyeVZhbHVlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGdldEluamVjdGlvblRhcmdldHMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9OQU1FOgotCQkJCXNldEVudkVudHJ5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfVFlQRToKLQkJCQlzZXRFbnZFbnRyeVR5cGUoKEVudkVudHJ5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX1ZBTFVFOgotCQkJCXNldEVudkVudHJ5VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX05BTUU6Ci0JCQkJc2V0RW52RW50cnlOYW1lKEVOVl9FTlRSWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfVFlQRToKLQkJCQl1bnNldEVudkVudHJ5VHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9WQUxVRToKLQkJCQlzZXRFbnZFbnRyeVZhbHVlKEVOVl9FTlRSWV9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZShNQVBQRURfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9OQU1FOgotCQkJCXJldHVybiBFTlZfRU5UUllfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZW52RW50cnlOYW1lICE9IG51bGwgOiAhRU5WX0VOVFJZX05BTUVfRURFRkFVTFQuZXF1YWxzKGVudkVudHJ5TmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRFbnZFbnRyeVR5cGUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9WQUxVRToKLQkJCQlyZXR1cm4gRU5WX0VOVFJZX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBlbnZFbnRyeVZhbHVlICE9IG51bGwgOiAhRU5WX0VOVFJZX1ZBTFVFX0VERUZBVUxULmVxdWFscyhlbnZFbnRyeVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiBpbmplY3Rpb25UYXJnZXRzICE9IG51bGwgJiYgIWluamVjdGlvblRhcmdldHMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlbnZFbnRyeU5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZW52RW50cnlOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnZFbnRyeVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbnZFbnRyeVR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGVudkVudHJ5VHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgZW52RW50cnlWYWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlbnZFbnRyeVZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRW52RW50cnlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSWNvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0ljb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDJlYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSWNvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JY29uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5JY29uSW1wbCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkljb25JbXBsI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSWNvbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5JY29uSW1wbCNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSWNvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEljb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTbWFsbEljb24oKSA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTTUFMTF9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNtYWxsSWNvbigpIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc21hbGxJY29uID0gU01BTExfSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXJnZUljb24oKSA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVJHRV9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhcmdlSWNvbigpIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFyZ2VJY29uID0gTEFSR0VfSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFuZyA9IExBTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSWNvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLklDT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTbWFsbEljb24oKSB7Ci0JCXJldHVybiBzbWFsbEljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJU3RyaW5nIG9sZFNtYWxsSWNvbiA9IHNtYWxsSWNvbjsKLQkJc21hbGxJY29uID0gbmV3U21hbGxJY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLklDT05fX1NNQUxMX0lDT04sIG9sZFNtYWxsSWNvbiwgc21hbGxJY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7Ci0JCXJldHVybiBsYXJnZUljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBuZXdMYXJnZUljb24pIHsKLQkJU3RyaW5nIG9sZExhcmdlSWNvbiA9IGxhcmdlSWNvbjsKLQkJbGFyZ2VJY29uID0gbmV3TGFyZ2VJY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLklDT05fX0xBUkdFX0lDT04sIG9sZExhcmdlSWNvbiwgbGFyZ2VJY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5JQ09OX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYW5nKCkgewotCQlyZXR1cm4gbGFuZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5nKFN0cmluZyBuZXdMYW5nKSB7Ci0JCVN0cmluZyBvbGRMYW5nID0gbGFuZzsKLQkJbGFuZyA9IG5ld0xhbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuSUNPTl9fTEFORywgb2xkTGFuZywgbGFuZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19MQU5HOgotCQkJCXJldHVybiBnZXRMYW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSUNPTl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSUNPTl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oTEFSR0VfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSUNPTl9fTEFORzoKLQkJCQlzZXRMYW5nKExBTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSUNPTl9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gTEFSR0VfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbGFyZ2VJY29uICE9IG51bGwgOiAhTEFSR0VfSUNPTl9FREVGQVVMVC5lcXVhbHMobGFyZ2VJY29uKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19MQU5HOgotCQkJCXJldHVybiBMQU5HX0VERUZBVUxUID09IG51bGwgPyBsYW5nICE9IG51bGwgOiAhTEFOR19FREVGQVVMVC5lcXVhbHMobGFuZyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzbWFsbEljb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc21hbGxJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXJnZUljb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobGFyZ2VJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFuZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsYW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSWNvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9JbmplY3Rpb25UYXJnZXRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9JbmplY3Rpb25UYXJnZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2ZmNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSW5qZWN0aW9uVGFyZ2V0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSW5qZWN0aW9uVGFyZ2V0SW1wbCNnZXRJbmplY3Rpb25UYXJnZXRDbGFzcyA8ZW0+SW5qZWN0aW9uIFRhcmdldCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSW5qZWN0aW9uVGFyZ2V0SW1wbCNnZXRJbmplY3Rpb25UYXJnZXROYW1lIDxlbT5JbmplY3Rpb24gVGFyZ2V0IE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmplY3Rpb25UYXJnZXRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbmplY3Rpb25UYXJnZXQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXRDbGFzcygpIDxlbT5JbmplY3Rpb24gVGFyZ2V0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5KRUNUSU9OX1RBUkdFVF9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXRDbGFzcygpIDxlbT5JbmplY3Rpb24gVGFyZ2V0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpbmplY3Rpb25UYXJnZXRDbGFzcyA9IElOSkVDVElPTl9UQVJHRVRfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5qZWN0aW9uVGFyZ2V0TmFtZSgpIDxlbT5JbmplY3Rpb24gVGFyZ2V0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOSkVDVElPTl9UQVJHRVRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXROYW1lKCkgPGVtPkluamVjdGlvbiBUYXJnZXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5qZWN0aW9uVGFyZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpbmplY3Rpb25UYXJnZXROYW1lID0gSU5KRUNUSU9OX1RBUkdFVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEluamVjdGlvblRhcmdldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLklOSkVDVElPTl9UQVJHRVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbmplY3Rpb25UYXJnZXRDbGFzcygpIHsKLQkJcmV0dXJuIGluamVjdGlvblRhcmdldENsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluamVjdGlvblRhcmdldENsYXNzKFN0cmluZyBuZXdJbmplY3Rpb25UYXJnZXRDbGFzcykgewotCQlTdHJpbmcgb2xkSW5qZWN0aW9uVGFyZ2V0Q2xhc3MgPSBpbmplY3Rpb25UYXJnZXRDbGFzczsKLQkJaW5qZWN0aW9uVGFyZ2V0Q2xhc3MgPSBuZXdJbmplY3Rpb25UYXJnZXRDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5JTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX0NMQVNTLCBvbGRJbmplY3Rpb25UYXJnZXRDbGFzcywgaW5qZWN0aW9uVGFyZ2V0Q2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluamVjdGlvblRhcmdldE5hbWUoKSB7Ci0JCXJldHVybiBpbmplY3Rpb25UYXJnZXROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluamVjdGlvblRhcmdldE5hbWUoU3RyaW5nIG5ld0luamVjdGlvblRhcmdldE5hbWUpIHsKLQkJU3RyaW5nIG9sZEluamVjdGlvblRhcmdldE5hbWUgPSBpbmplY3Rpb25UYXJnZXROYW1lOwotCQlpbmplY3Rpb25UYXJnZXROYW1lID0gbmV3SW5qZWN0aW9uVGFyZ2V0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5JTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX05BTUUsIG9sZEluamVjdGlvblRhcmdldE5hbWUsIGluamVjdGlvblRhcmdldE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSU5KRUNUSU9OX1RBUkdFVF9fSU5KRUNUSU9OX1RBUkdFVF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX05BTUU6Ci0JCQkJcmV0dXJuIGdldEluamVjdGlvblRhcmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklOSkVDVElPTl9UQVJHRVRfX0lOSkVDVElPTl9UQVJHRVRfQ0xBU1M6Ci0JCQkJc2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklOSkVDVElPTl9UQVJHRVRfX0lOSkVDVElPTl9UQVJHRVRfTkFNRToKLQkJCQlzZXRJbmplY3Rpb25UYXJnZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSU5KRUNUSU9OX1RBUkdFVF9fSU5KRUNUSU9OX1RBUkdFVF9DTEFTUzoKLQkJCQlzZXRJbmplY3Rpb25UYXJnZXRDbGFzcyhJTkpFQ1RJT05fVEFSR0VUX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSU5KRUNUSU9OX1RBUkdFVF9fSU5KRUNUSU9OX1RBUkdFVF9OQU1FOgotCQkJCXNldEluamVjdGlvblRhcmdldE5hbWUoSU5KRUNUSU9OX1RBUkdFVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX0NMQVNTOgotCQkJCXJldHVybiBJTkpFQ1RJT05fVEFSR0VUX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBpbmplY3Rpb25UYXJnZXRDbGFzcyAhPSBudWxsIDogIUlOSkVDVElPTl9UQVJHRVRfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGluamVjdGlvblRhcmdldENsYXNzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX05BTUU6Ci0JCQkJcmV0dXJuIElOSkVDVElPTl9UQVJHRVRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gaW5qZWN0aW9uVGFyZ2V0TmFtZSAhPSBudWxsIDogIUlOSkVDVElPTl9UQVJHRVRfTkFNRV9FREVGQVVMVC5lcXVhbHMoaW5qZWN0aW9uVGFyZ2V0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpbmplY3Rpb25UYXJnZXRDbGFzczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbmplY3Rpb25UYXJnZXRDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW5qZWN0aW9uVGFyZ2V0TmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbmplY3Rpb25UYXJnZXROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSW5qZWN0aW9uVGFyZ2V0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0phdmFlZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9KYXZhZWVGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDYzZDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0phdmFlZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRGlhZ25vc3RpY2lhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFlZUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSmF2YWVlRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YWVlRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJSmF2YWVlRmFjdG9yeSB0aGVKYXZhZWVGYWN0b3J5ID0gKEphdmFlZUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpOyAvLyROT04tTkxTLTEkIAotCQkJaWYgKHRoZUphdmFlZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVKYXZhZWVGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEphdmFlZUZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YWVlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRWpiTG9jYWxSZWYoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRWpiUmVmKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU1QVFlfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVtcHR5VHlwZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVudkVudHJ5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSUNPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUljb24oKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JTkpFQ1RJT05fVEFSR0VUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlSW5qZWN0aW9uVGFyZ2V0KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElGRUNZQ0xFX0NBTExCQUNLOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTGlmZWN5Y2xlQ2FsbGJhY2soKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUxpc3RlbmVyKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUU6IHJldHVybiAoRU9iamVjdCljcmVhdGVQYXJhbVZhbHVlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUY6IHJldHVybiAoRU9iamVjdCljcmVhdGVQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBlcnNpc3RlbmNlVW5pdFJlZigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBvcnRDb21wb25lbnRSZWYoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvcGVydHlUeXBlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJlc291cmNlRW52UmVmKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVzb3VyY2VSZWYoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVM6IHJldHVybiAoRU9iamVjdCljcmVhdGVSdW5BcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVTZWN1cml0eVJvbGUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlY3VyaXR5Um9sZVJlZigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU2VydmljZVJlZigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVTZXJ2aWNlUmVmSGFuZGxlcigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU46IHJldHVybiAoRU9iamVjdCljcmVhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWluKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlM6IHJldHVybiAoRU9iamVjdCljcmVhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlVSTF9QQVRURVJOX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVVcmxQYXR0ZXJuVHlwZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFamJSZWZUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVudkVudHJ5VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVQZXJzaXN0ZW5jZUNvbnRleHRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX0FVVEhfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUmVzQXV0aFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNfU0hBUklOR19TQ09QRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVSZXNTaGFyaW5nU2NvcGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuREVXRVlfVkVSU0lPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEZXdleVZlcnNpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xJTks6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQkxpbmtGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRWpiUmVmTmFtZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVFamJSZWZUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVFbnZFbnRyeVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5GVUxMWV9RVUFMSUZJRURfQ0xBU1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5IT01FOgotCQkJCXJldHVybiBjcmVhdGVIb21lRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSkFWQV9JREVOVElGSUVSOgotCQkJCXJldHVybiBjcmVhdGVKYXZhSWRlbnRpZmllckZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkpBVkFfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5KTkRJX05BTUU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUpORElOYW1lRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTE9DQUw6Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvY2FsRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTE9DQUxfSE9NRToKLQkJCQlyZXR1cm4gY3JlYXRlTG9jYWxIb21lRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LOgotCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25MaW5rRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFUSF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVQYXRoVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRU1PVEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlbW90ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU19BVVRIX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVSZXNBdXRoVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU19TSEFSSU5HX1NDT1BFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUk9MRV9OQU1FOgotCQkJCXJldHVybiBjcmVhdGVSb2xlTmFtZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfTElTVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk46Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZRbmFtZVBhdHRlcm5Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5UUlVFX0ZBTFNFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVRydWVGYWxzZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5UUlVFX0ZBTFNFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVUcnVlRmFsc2VUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFamJSZWZUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVudkVudHJ5VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNfQVVUSF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0UmVzQXV0aFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU19TSEFSSU5HX1NDT1BFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXNTaGFyaW5nU2NvcGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVdFWV9WRVJTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREZXdleVZlcnNpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTElOSzoKLQkJCQlyZXR1cm4gY29udmVydEVKQkxpbmtUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfTkFNRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RWpiUmVmTmFtZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFamJSZWZUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFbnZFbnRyeVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkhPTUU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIb21lVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5KQVZBX0lERU5USUZJRVI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRKYXZhSWRlbnRpZmllclRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSkFWQV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0SmF2YVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkpORElfTkFNRToKLQkJCQlyZXR1cm4gY29udmVydEpORElOYW1lVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MT0NBTDoKLQkJCQlyZXR1cm4gY29udmVydExvY2FsVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MT0NBTF9IT01FOgotCQkJCXJldHVybiBjb252ZXJ0TG9jYWxIb21lVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTks6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNZXNzYWdlRGVzdGluYXRpb25MaW5rVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVRIX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQYXRoVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFTU9URToKLQkJCQlyZXR1cm4gY29udmVydFJlbW90ZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX0FVVEhfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXNBdXRoVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSb2xlTmFtZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUU5BTUVfUEFUVEVSTjoKLQkJCQlyZXR1cm4gY29udmVydFNlcnZpY2VSZWZRbmFtZVBhdHRlcm5Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlRSVUVfRkFMU0VfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFRydWVGYWxzZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlRSVUVfRkFMU0VfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUcnVlRmFsc2VUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRpb24oKSB7Ci0JCURlc2NyaXB0aW9uSW1wbCBkZXNjcmlwdGlvbiA9IG5ldyBEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNwbGF5TmFtZSBjcmVhdGVEaXNwbGF5TmFtZSgpIHsKLQkJRGlzcGxheU5hbWVJbXBsIGRpc3BsYXlOYW1lID0gbmV3IERpc3BsYXlOYW1lSW1wbCgpOwotCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYkxvY2FsUmVmIGNyZWF0ZUVqYkxvY2FsUmVmKCkgewotCQlFamJMb2NhbFJlZkltcGwgZWpiTG9jYWxSZWYgPSBuZXcgRWpiTG9jYWxSZWZJbXBsKCk7Ci0JCXJldHVybiBlamJMb2NhbFJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiUmVmIGNyZWF0ZUVqYlJlZigpIHsKLQkJRWpiUmVmSW1wbCBlamJSZWYgPSBuZXcgRWpiUmVmSW1wbCgpOwotCQlyZXR1cm4gZWpiUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbXB0eVR5cGUgY3JlYXRlRW1wdHlUeXBlKCkgewotCQlFbXB0eVR5cGVJbXBsIGVtcHR5VHlwZSA9IG5ldyBFbXB0eVR5cGVJbXBsKCk7Ci0JCXJldHVybiBlbXB0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudkVudHJ5IGNyZWF0ZUVudkVudHJ5KCkgewotCQlFbnZFbnRyeUltcGwgZW52RW50cnkgPSBuZXcgRW52RW50cnlJbXBsKCk7Ci0JCXJldHVybiBlbnZFbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSWNvbiBjcmVhdGVJY29uKCkgewotCQlJY29uSW1wbCBpY29uID0gbmV3IEljb25JbXBsKCk7Ci0JCXJldHVybiBpY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbmplY3Rpb25UYXJnZXQgY3JlYXRlSW5qZWN0aW9uVGFyZ2V0KCkgewotCQlJbmplY3Rpb25UYXJnZXRJbXBsIGluamVjdGlvblRhcmdldCA9IG5ldyBJbmplY3Rpb25UYXJnZXRJbXBsKCk7Ci0JCXJldHVybiBpbmplY3Rpb25UYXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpZmVjeWNsZUNhbGxiYWNrIGNyZWF0ZUxpZmVjeWNsZUNhbGxiYWNrKCkgewotCQlMaWZlY3ljbGVDYWxsYmFja0ltcGwgbGlmZWN5Y2xlQ2FsbGJhY2sgPSBuZXcgTGlmZWN5Y2xlQ2FsbGJhY2tJbXBsKCk7Ci0JCXJldHVybiBsaWZlY3ljbGVDYWxsYmFjazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoKSB7Ci0JCUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lckltcGwoKTsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb24gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uKCkgewotCQlNZXNzYWdlRGVzdGluYXRpb25JbXBsIG1lc3NhZ2VEZXN0aW5hdGlvbiA9IG5ldyBNZXNzYWdlRGVzdGluYXRpb25JbXBsKCk7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWYoKSB7Ci0JCU1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwgbWVzc2FnZURlc3RpbmF0aW9uUmVmID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwoKTsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyYW1WYWx1ZSBjcmVhdGVQYXJhbVZhbHVlKCkgewotCQlQYXJhbVZhbHVlSW1wbCBwYXJhbVZhbHVlID0gbmV3IFBhcmFtVmFsdWVJbXBsKCk7Ci0JCXJldHVybiBwYXJhbVZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZUNvbnRleHRSZWYgY3JlYXRlUGVyc2lzdGVuY2VDb250ZXh0UmVmKCkgewotCQlQZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsIHBlcnNpc3RlbmNlQ29udGV4dFJlZiA9IG5ldyBQZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsKCk7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZUNvbnRleHRSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFJlZiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRSZWYoKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdFJlZkltcGwgcGVyc2lzdGVuY2VVbml0UmVmID0gbmV3IFBlcnNpc3RlbmNlVW5pdFJlZkltcGwoKTsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9ydENvbXBvbmVudFJlZiBjcmVhdGVQb3J0Q29tcG9uZW50UmVmKCkgewotCQlQb3J0Q29tcG9uZW50UmVmSW1wbCBwb3J0Q29tcG9uZW50UmVmID0gbmV3IFBvcnRDb21wb25lbnRSZWZJbXBsKCk7Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50UmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eVR5cGUgY3JlYXRlUHJvcGVydHlUeXBlKCkgewotCQlQcm9wZXJ0eVR5cGVJbXBsIHByb3BlcnR5VHlwZSA9IG5ldyBQcm9wZXJ0eVR5cGVJbXBsKCk7Ci0JCXJldHVybiBwcm9wZXJ0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlRW52UmVmIGNyZWF0ZVJlc291cmNlRW52UmVmKCkgewotCQlSZXNvdXJjZUVudlJlZkltcGwgcmVzb3VyY2VFbnZSZWYgPSBuZXcgUmVzb3VyY2VFbnZSZWZJbXBsKCk7Ci0JCXJldHVybiByZXNvdXJjZUVudlJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VSZWYgY3JlYXRlUmVzb3VyY2VSZWYoKSB7Ci0JCVJlc291cmNlUmVmSW1wbCByZXNvdXJjZVJlZiA9IG5ldyBSZXNvdXJjZVJlZkltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSdW5BcyBjcmVhdGVSdW5BcygpIHsKLQkJUnVuQXNJbXBsIHJ1bkFzID0gbmV3IFJ1bkFzSW1wbCgpOwotCQlyZXR1cm4gcnVuQXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5Um9sZSBjcmVhdGVTZWN1cml0eVJvbGUoKSB7Ci0JCVNlY3VyaXR5Um9sZUltcGwgc2VjdXJpdHlSb2xlID0gbmV3IFNlY3VyaXR5Um9sZUltcGwoKTsKLQkJcmV0dXJuIHNlY3VyaXR5Um9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlUmVmIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZigpIHsKLQkJU2VjdXJpdHlSb2xlUmVmSW1wbCBzZWN1cml0eVJvbGVSZWYgPSBuZXcgU2VjdXJpdHlSb2xlUmVmSW1wbCgpOwotCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUmVmIGNyZWF0ZVNlcnZpY2VSZWYoKSB7Ci0JCVNlcnZpY2VSZWZJbXBsIHNlcnZpY2VSZWYgPSBuZXcgU2VydmljZVJlZkltcGwoKTsKLQkJcmV0dXJuIHNlcnZpY2VSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VSZWZIYW5kbGVyIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyKCkgewotCQlTZXJ2aWNlUmVmSGFuZGxlckltcGwgc2VydmljZVJlZkhhbmRsZXIgPSBuZXcgU2VydmljZVJlZkhhbmRsZXJJbXBsKCk7Ci0JCXJldHVybiBzZXJ2aWNlUmVmSGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZVJlZkhhbmRsZXJDaGFpbiBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWluKCkgewotCQlTZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbCBzZXJ2aWNlUmVmSGFuZGxlckNoYWluID0gbmV3IFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsKCk7Ci0JCXJldHVybiBzZXJ2aWNlUmVmSGFuZGxlckNoYWluOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygpIHsKLQkJU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsIHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zID0gbmV3IFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zSW1wbCgpOwotCQlyZXR1cm4gc2VydmljZVJlZkhhbmRsZXJDaGFpbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVybFBhdHRlcm5UeXBlIGNyZWF0ZVVybFBhdHRlcm5UeXBlKCkgewotCQlVcmxQYXR0ZXJuVHlwZUltcGwgdXJsUGF0dGVyblR5cGUgPSBuZXcgVXJsUGF0dGVyblR5cGVJbXBsKCk7Ci0JCXJldHVybiB1cmxQYXR0ZXJuVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiUmVmVHlwZSBjcmVhdGVFamJSZWZUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUVqYlJlZlR5cGUgcmVzdWx0ID0gRWpiUmVmVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RWpiUmVmVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnZFbnRyeVR5cGUgY3JlYXRlRW52RW50cnlUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUVudkVudHJ5VHlwZSByZXN1bHQgPSBFbnZFbnRyeVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVudkVudHJ5VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSByZXN1bHQgPSBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIGNyZWF0ZVBlcnNpc3RlbmNlQ29udGV4dFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJUGVyc2lzdGVuY2VDb250ZXh0VHlwZSByZXN1bHQgPSBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc0F1dGhUeXBlIGNyZWF0ZVJlc0F1dGhUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVJlc0F1dGhUeXBlIHJlc3VsdCA9IFJlc0F1dGhUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSZXNBdXRoVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGNyZWF0ZVJlc1NoYXJpbmdTY29wZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJUmVzU2hhcmluZ1Njb3BlVHlwZSByZXN1bHQgPSBSZXNTaGFyaW5nU2NvcGVUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSZXNTaGFyaW5nU2NvcGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVEZXdleVZlcnNpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERld2V5VmVyc2lvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVFSkJMaW5rRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVKQkxpbmtUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVFamJSZWZOYW1lVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFamJSZWZOYW1lVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiUmVmVHlwZSBjcmVhdGVFamJSZWZUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoRWpiUmVmVHlwZSljcmVhdGVFamJSZWZUeXBlRnJvbVN0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkVKQl9SRUZfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFamJSZWZUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRFamJSZWZUeXBlVG9TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5FSkJfUkVGX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnZFbnRyeVR5cGUgY3JlYXRlRW52RW50cnlUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoRW52RW50cnlUeXBlKWNyZWF0ZUVudkVudHJ5VHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5FTlZfRU5UUllfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFbnZFbnRyeVR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydEVudkVudHJ5VHlwZVRvU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRU5WX0VOVFJZX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIb21lRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEhvbWVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVKYXZhSWRlbnRpZmllckZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRKYXZhSWRlbnRpZmllclRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUphdmFUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEphdmFUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSk5ESU5hbWVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Sk5ESU5hbWVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVMb2NhbEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRMb2NhbFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUxvY2FsSG9tZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRMb2NhbEhvbWVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25MaW5rRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSljcmVhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlVG9TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlUGF0aFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UGF0aFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgY3JlYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlQ29udGV4dFR5cGUpY3JlYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QRVJTSVNURU5DRV9DT05URVhUX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0UGVyc2lzdGVuY2VDb250ZXh0VHlwZVRvU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVJlbW90ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSZW1vdGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc0F1dGhUeXBlIGNyZWF0ZVJlc0F1dGhUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoUmVzQXV0aFR5cGUpY3JlYXRlUmVzQXV0aFR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUkVTX0FVVEhfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSZXNBdXRoVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0UmVzQXV0aFR5cGVUb1N0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlJFU19BVVRIX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGNyZWF0ZVJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChSZXNTaGFyaW5nU2NvcGVUeXBlKWNyZWF0ZVJlc1NoYXJpbmdTY29wZVR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRSZXNTaGFyaW5nU2NvcGVUeXBlVG9TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5SRVNfU0hBUklOR19TQ09QRV9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVJvbGVOYW1lRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJvbGVOYW1lVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbml0aWFsVmFsdWUpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsKLQkJCVN0cmluZyBpdGVtID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJcmVzdWx0LmFkZChjcmVhdGVTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX1RZUEUsIGl0ZW0pKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCWlmIChpbnN0YW5jZVZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCQlMaXN0IGxpc3QgPSAoTGlzdClpbnN0YW5jZVZhbHVlOwotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHJldHVybiAiIjsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZVRvU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19UWVBFLCBpLm5leHQoKSkpOwotCQkJcmVzdWx0LmFwcGVuZCgnICcpOwotCQl9Ci0JCXJldHVybiByZXN1bHQuc3Vic3RyaW5nKDAsIHJlc3VsdC5sZW5ndGgoKSAtIDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCVJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSSwgaW5pdGlhbFZhbHVlKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVEYXRhVHlwZSwgcmVzdWx0LCBudWxsLCBudWxsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uID0gZTsKLQkJfQotCQl0cnkgewotCQkJcmVzdWx0ID0gKFN0cmluZyljcmVhdGVTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgRGlhZ25vc3RpY2lhbi5JTlNUQU5DRS52YWxpZGF0ZShlRGF0YVR5cGUsIHJlc3VsdCwgbnVsbCwgbnVsbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQkJaWYgKHJlc3VsdCAhPSBudWxsIHx8IGV4Y2VwdGlvbiA9PSBudWxsKSByZXR1cm4gcmVzdWx0OwotICAgIAotCQl0aHJvdyBleGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlpZiAoaW5zdGFuY2VWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJaWYgKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLkFOWV9VUkkuaXNJbnN0YW5jZShpbnN0YW5jZVZhbHVlKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdmFsdWUgPSBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLkFOWV9VUkksIGluc3RhbmNlVmFsdWUpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSByZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlpZiAoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRS5pc0luc3RhbmNlKGluc3RhbmNlVmFsdWUpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB2YWx1ZSA9IGNvbnZlcnRTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVUb1N0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgcmV0dXJuIHZhbHVlOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB2YWx1ZTogJyIraW5zdGFuY2VWYWx1ZSsiJyBmb3IgZGF0YXR5cGUgOiIrZURhdGFUeXBlLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlU2VydmljZVJlZlFuYW1lUGF0dGVybkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGNyZWF0ZVRydWVGYWxzZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCb29sZWFuKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLkJPT0xFQU4sIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHJ1ZUZhbHNlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLkJPT0xFQU4sIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGNyZWF0ZVRydWVGYWxzZVR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCb29sZWFuKWNyZWF0ZVRydWVGYWxzZVR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuVFJVRV9GQUxTRV9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRydWVGYWxzZVR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFRydWVGYWxzZVR5cGVUb1N0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlRSVUVfRkFMU0VfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFlZVBhY2thZ2UgZ2V0SmF2YWVlUGFja2FnZSgpIHsKLQkJcmV0dXJuIChKYXZhZWVQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFlZVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL0phdmFlZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9KYXZhZWVQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSmF2YWVlUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxNzU5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9KYXZhZWVQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLm5hbWVzcGFjZS5YTUxOYW1lc3BhY2VQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNBdXRoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzU2hhcmluZ1Njb3BlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsLkphdmFlZVZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhZWVQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEphdmFlZVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpc3BsYXlOYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYkxvY2FsUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYlJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbXB0eVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZW52RW50cnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaWNvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbmplY3Rpb25UYXJnZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbGlmZWN5Y2xlQ2FsbGJhY2tFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbGlzdGVuZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwYXJhbVZhbHVlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcG9ydENvbXBvbmVudFJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9wZXJ0eVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVzb3VyY2VFbnZSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVzb3VyY2VSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcnVuQXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdXJpdHlSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlY3VyaXR5Um9sZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZXJ2aWNlUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VydmljZVJlZkhhbmRsZXJDaGFpbnNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdXJsUGF0dGVyblR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBlamJSZWZUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBlbnZFbnRyeVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcGVyc2lzdGVuY2VDb250ZXh0VHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcmVzQXV0aFR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkZXdleVZlcnNpb25UeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGVqYkxpbmtFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZWpiUmVmTmFtZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZWpiUmVmVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlbnZFbnRyeVR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaG9tZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBqYXZhSWRlbnRpZmllckVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBqYXZhVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBqbmRpTmFtZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBsb2NhbEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBsb2NhbEhvbWVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbWVzc2FnZURlc3RpbmF0aW9uTGlua0VEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBtZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcGF0aFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByZW1vdGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcmVzQXV0aFR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByb2xlTmFtZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHNlcnZpY2VSZWZRbmFtZVBhdHRlcm5FRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHJ1ZUZhbHNlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0cnVlRmFsc2VUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBKYXZhZWVQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhZWVQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChKYXZhZWVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlKYXZhZWVQYWNrYWdlSW1wbCB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEphdmFlZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgSmF2YWVlUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxOYW1lc3BhY2VQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVdlYlBhY2thZ2VJbXBsIHRoZVdlYlBhY2thZ2UgPSAoV2ViUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgOiBXZWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UgPSAoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUphdmFlZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlSmF2YWVlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gUmVnaXN0ZXIgcGFja2FnZSB2YWxpZGF0b3IKLQkJRVZhbGlkYXRvci5SZWdpc3RyeS5JTlNUQU5DRS5wdXQKLQkJCSh0aGVKYXZhZWVQYWNrYWdlLCAKLQkJCSBuZXcgRVZhbGlkYXRvci5EZXNjcmlwdG9yKCkgewotCQkJCSBwdWJsaWMgRVZhbGlkYXRvciBnZXRFVmFsaWRhdG9yKCkgewotCQkJCQkgcmV0dXJuIEphdmFlZVZhbGlkYXRvci5JTlNUQU5DRTsKLQkJCQkgfQotCQkJIH0pOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlSmF2YWVlUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlSmF2YWVlUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRpb25fVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX0xhbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNwbGF5TmFtZV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc3BsYXlOYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzcGxheU5hbWVfTGFuZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc3BsYXlOYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFamJMb2NhbFJlZigpIHsKLQkJcmV0dXJuIGVqYkxvY2FsUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVqYkxvY2FsUmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYkxvY2FsUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfRWpiUmVmTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkxvY2FsUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfRWpiUmVmVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkxvY2FsUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfTG9jYWxIb21lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9Mb2NhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkxvY2FsUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfRWpiTGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkxvY2FsUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfTWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkxvY2FsUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RWpiTG9jYWxSZWZfSW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYkxvY2FsUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJMb2NhbFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RWpiUmVmKCkgewotCQlyZXR1cm4gZWpiUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVqYlJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfRWpiUmVmTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYlJlZl9FamJSZWZUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0hvbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfUmVtb3RlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0VqYkxpbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfTWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVqYlJlZl9JbmplY3Rpb25UYXJnZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbXB0eVR5cGUoKSB7Ci0JCXJldHVybiBlbXB0eVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW1wdHlUeXBlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW1wdHlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbnZFbnRyeSgpIHsKLQkJcmV0dXJuIGVudkVudHJ5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudkVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfRW52RW50cnlOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW52RW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9FbnZFbnRyeVR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudkVudHJ5X0VudkVudHJ5VmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudkVudHJ5X01hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudkVudHJ5X0luamVjdGlvblRhcmdldHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudkVudHJ5X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW52RW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEljb24oKSB7Ci0JCXJldHVybiBpY29uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEljb25fU21hbGxJY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaWNvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEljb25fTGFyZ2VJY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaWNvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEljb25fSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpY29uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SWNvbl9MYW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaWNvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW5qZWN0aW9uVGFyZ2V0KCkgewotCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEluamVjdGlvblRhcmdldF9JbmplY3Rpb25UYXJnZXRDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWluamVjdGlvblRhcmdldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEluamVjdGlvblRhcmdldF9JbmplY3Rpb25UYXJnZXROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5qZWN0aW9uVGFyZ2V0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMaWZlY3ljbGVDYWxsYmFjaygpIHsKLQkJcmV0dXJuIGxpZmVjeWNsZUNhbGxiYWNrRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaWZlY3ljbGVDYWxsYmFja0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGlmZWN5Y2xlQ2FsbGJhY2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExpc3RlbmVyKCkgewotCQlyZXR1cm4gbGlzdGVuZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TGlzdGVuZXJfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGlzdGVuZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMaXN0ZW5lcl9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpc3RlbmVyX0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGlzdGVuZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGlzdGVuZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaXN0ZW5lcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxpc3RlbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXNzYWdlRGVzdGluYXRpb24oKSB7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fSWNvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fTWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NYXBwZWROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSB7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uTGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NYXBwZWROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0luamVjdGlvblRhcmdldHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhcmFtVmFsdWUoKSB7Ci0JCXJldHVybiBwYXJhbVZhbHVlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGFyYW1WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBhcmFtVmFsdWVfUGFyYW1OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFyYW1WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBhcmFtVmFsdWVfUGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBhcmFtVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYXJhbVZhbHVlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFyYW1WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZVVuaXROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlQ29udGV4dFR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX01hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfSW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNpc3RlbmNlVW5pdFJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfUGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlVW5pdFJlZl9QZXJzaXN0ZW5jZVVuaXROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc2lzdGVuY2VVbml0UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VVbml0UmVmX01hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfSW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlVW5pdFJlZl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UG9ydENvbXBvbmVudFJlZigpIHsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnRSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0Q29tcG9uZW50UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudFJlZl9FbmFibGVNdG9tKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0Q29tcG9uZW50UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudFJlZl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb3BlcnR5VHlwZSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eVR5cGVfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5VHlwZV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5VHlwZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2VFbnZSZWYoKSB7Ci0JCXJldHVybiByZXNvdXJjZUVudlJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX1Jlc291cmNlRW52UmVmTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlRW52UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VFbnZSZWZfUmVzb3VyY2VFbnZSZWZUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9NYXBwZWROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9JbmplY3Rpb25UYXJnZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlRW52UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXNvdXJjZVJlZigpIHsKLQkJcmV0dXJuIHJlc291cmNlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VSZWZfUmVzUmVmTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VSZWZfUmVzVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VSZWZfUmVzQXV0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VSZWZfUmVzU2hhcmluZ1Njb3BlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9NYXBwZWROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZVJlZl9JbmplY3Rpb25UYXJnZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSdW5BcygpIHsKLQkJcmV0dXJuIHJ1bkFzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJ1bkFzX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJ1bkFzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UnVuQXNfUm9sZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlydW5Bc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJ1bkFzX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcnVuQXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlY3VyaXR5Um9sZSgpIHsKLQkJcmV0dXJuIHNlY3VyaXR5Um9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN1cml0eVJvbGVSZWYoKSB7Ci0JCXJldHVybiBzZWN1cml0eVJvbGVSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5Um9sZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZVJlZl9Sb2xlTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5Um9sZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZVJlZl9Sb2xlTGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5Um9sZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZVJlZl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5Um9sZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VydmljZVJlZigpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9JY29ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfSGFuZGxlckNoYWlucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9NYXBwZWROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX0luamVjdGlvblRhcmdldHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VydmljZVJlZkhhbmRsZXIoKSB7Ci0JCXJldHVybiBzZXJ2aWNlUmVmSGFuZGxlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZIYW5kbGVyX0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZkhhbmRsZXJfSWNvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9IYW5kbGVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZIYW5kbGVyX0luaXRQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBIZWFkZXJzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9Tb2FwUm9sZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyX1BvcnROYW1lcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbigpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9TZXJ2aWNlTmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9Qb3J0TmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9Qcm90b2NvbEJpbmRpbmdzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkhhbmRsZXJDaGFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fSGFuZGxlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCkgewotCQlyZXR1cm4gc2VydmljZVJlZkhhbmRsZXJDaGFpbnNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnNfSGFuZGxlckNoYWlucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnNfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmSGFuZGxlckNoYWluc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VXJsUGF0dGVyblR5cGUoKSB7Ci0JCXJldHVybiB1cmxQYXR0ZXJuVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVcmxQYXR0ZXJuVHlwZV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXVybFBhdHRlcm5UeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldEVqYlJlZlR5cGUoKSB7Ci0JCXJldHVybiBlamJSZWZUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldEVudkVudHJ5VHlwZSgpIHsKLQkJcmV0dXJuIGVudkVudHJ5VHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKSB7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0UmVzQXV0aFR5cGUoKSB7Ci0JCXJldHVybiByZXNBdXRoVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRSZXNTaGFyaW5nU2NvcGVUeXBlKCkgewotCQlyZXR1cm4gcmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGV3ZXlWZXJzaW9uVHlwZSgpIHsKLQkJcmV0dXJuIGRld2V5VmVyc2lvblR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFSkJMaW5rKCkgewotCQlyZXR1cm4gZWpiTGlua0VEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVqYlJlZk5hbWVUeXBlKCkgewotCQlyZXR1cm4gZWpiUmVmTmFtZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFamJSZWZUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gZWpiUmVmVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVudkVudHJ5VHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIGVudkVudHJ5VHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCkgewotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIb21lKCkgewotCQlyZXR1cm4gaG9tZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEphdmFJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gamF2YUlkZW50aWZpZXJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRKYXZhVHlwZSgpIHsKLQkJcmV0dXJuIGphdmFUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Sk5ESU5hbWUoKSB7Ci0JCXJldHVybiBqbmRpTmFtZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExvY2FsKCkgewotCQlyZXR1cm4gbG9jYWxFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRMb2NhbEhvbWUoKSB7Ci0JCXJldHVybiBsb2NhbEhvbWVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uTGlua0VEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQYXRoVHlwZSgpIHsKLQkJcmV0dXJuIHBhdGhUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSZW1vdGUoKSB7Ci0JCXJldHVybiByZW1vdGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSZXNBdXRoVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHJlc0F1dGhUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSb2xlTmFtZSgpIHsKLQkJcmV0dXJuIHJvbGVOYW1lRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlKCkgewotCQlyZXR1cm4gc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUoKSB7Ci0JCXJldHVybiBzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFNlcnZpY2VSZWZRbmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiBzZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHJ1ZUZhbHNlVHlwZSgpIHsKLQkJcmV0dXJuIHRydWVGYWxzZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUcnVlRmFsc2VUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gdHJ1ZUZhbHNlVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YWVlRmFjdG9yeSBnZXRKYXZhZWVGYWN0b3J5KCkgewotCQlyZXR1cm4gKEphdmFlZUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJZGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0aW9uRUNsYXNzLCBERVNDUklQVElPTl9fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0aW9uRUNsYXNzLCBERVNDUklQVElPTl9fTEFORyk7Ci0KLQkJZGlzcGxheU5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTUExBWV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNwbGF5TmFtZUVDbGFzcywgRElTUExBWV9OQU1FX19WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzcGxheU5hbWVFQ2xhc3MsIERJU1BMQVlfTkFNRV9fTEFORyk7Ci0KLQkJZWpiTG9jYWxSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX0xPQ0FMX1JFRik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiTG9jYWxSZWZFQ2xhc3MsIEVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiTG9jYWxSZWZFQ2xhc3MsIEVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiTG9jYWxSZWZFQ2xhc3MsIEVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiTG9jYWxSZWZFQ2xhc3MsIEVKQl9MT0NBTF9SRUZfX0xPQ0FMX0hPTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYkxvY2FsUmVmRUNsYXNzLCBFSkJfTE9DQUxfUkVGX19MT0NBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiTG9jYWxSZWZFQ2xhc3MsIEVKQl9MT0NBTF9SRUZfX0VKQl9MSU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fTUFQUEVEX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYkxvY2FsUmVmRUNsYXNzLCBFSkJfTE9DQUxfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiTG9jYWxSZWZFQ2xhc3MsIEVKQl9MT0NBTF9SRUZfX0lEKTsKLQotCQllamJSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX1JFRik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlZkVDbGFzcywgRUpCX1JFRl9fRUpCX1JFRl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX0VKQl9SRUZfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19IT01FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX1JFTU9URSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19FSkJfTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19NQVBQRURfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19JRCk7Ci0KLQkJZW1wdHlUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVNUFRZX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVtcHR5VHlwZUVDbGFzcywgRU1QVFlfVFlQRV9fSUQpOwotCi0JCWVudkVudHJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVOVl9FTlRSWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW52RW50cnlFQ2xhc3MsIEVOVl9FTlRSWV9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19FTlZfRU5UUllfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW52RW50cnlFQ2xhc3MsIEVOVl9FTlRSWV9fRU5WX0VOVFJZX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX0VOVl9FTlRSWV9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW52RW50cnlFQ2xhc3MsIEVOVl9FTlRSWV9fTUFQUEVEX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19JRCk7Ci0KLQkJaWNvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpY29uRUNsYXNzLCBJQ09OX19TTUFMTF9JQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpY29uRUNsYXNzLCBJQ09OX19MQVJHRV9JQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpY29uRUNsYXNzLCBJQ09OX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaWNvbkVDbGFzcywgSUNPTl9fTEFORyk7Ci0KLQkJaW5qZWN0aW9uVGFyZ2V0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElOSkVDVElPTl9UQVJHRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKGluamVjdGlvblRhcmdldEVDbGFzcywgSU5KRUNUSU9OX1RBUkdFVF9fSU5KRUNUSU9OX1RBUkdFVF9DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW5qZWN0aW9uVGFyZ2V0RUNsYXNzLCBJTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX05BTUUpOwotCi0JCWxpZmVjeWNsZUNhbGxiYWNrRUNsYXNzID0gY3JlYXRlRUNsYXNzKExJRkVDWUNMRV9DQUxMQkFDSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlmZWN5Y2xlQ2FsbGJhY2tFQ2xhc3MsIExJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaWZlY3ljbGVDYWxsYmFja0VDbGFzcywgTElGRUNZQ0xFX0NBTExCQUNLX19MSUZFQ1lDTEVfQ0FMTEJBQ0tfTUVUSE9EKTsKLQotCQlsaXN0ZW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMSVNURU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobGlzdGVuZXJFQ2xhc3MsIExJU1RFTkVSX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxpc3RlbmVyRUNsYXNzLCBMSVNURU5FUl9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobGlzdGVuZXJFQ2xhc3MsIExJU1RFTkVSX19JQ09OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlzdGVuZXJFQ2xhc3MsIExJU1RFTkVSX19MSVNURU5FUl9DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlzdGVuZXJFQ2xhc3MsIExJU1RFTkVSX19JRCk7Ci0KLQkJbWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FU1NBR0VfREVTVElOQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fX0lEKTsKLQotCQltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTkspOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01BUFBFRF9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSUQpOwotCi0JCXBhcmFtVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFSQU1fVkFMVUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBhcmFtVmFsdWVFQ2xhc3MsIFBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHBhcmFtVmFsdWVFQ2xhc3MsIFBBUkFNX1ZBTFVFX19QQVJBTV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwYXJhbVZhbHVlRUNsYXNzLCBQQVJBTV9WQUxVRV9fUEFSQU1fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHBhcmFtVmFsdWVFQ2xhc3MsIFBBUkFNX1ZBTFVFX19JRCk7Ci0KLQkJcGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3MsIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcywgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcywgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3MsIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9QUk9QRVJUSUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzaXN0ZW5jZUNvbnRleHRSZWZFQ2xhc3MsIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19NQVBQRURfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcywgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lEKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEVSU0lTVEVOQ0VfVU5JVF9SRUYpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcywgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc2lzdGVuY2VVbml0UmVmRUNsYXNzLCBQRVJTSVNURU5DRV9VTklUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc2lzdGVuY2VVbml0UmVmRUNsYXNzLCBQRVJTSVNURU5DRV9VTklUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MsIFBFUlNJU1RFTkNFX1VOSVRfUkVGX19NQVBQRURfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocGVyc2lzdGVuY2VVbml0UmVmRUNsYXNzLCBQRVJTSVNURU5DRV9VTklUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcywgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lEKTsKLQotCQlwb3J0Q29tcG9uZW50UmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPUlRfQ09NUE9ORU5UX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydENvbXBvbmVudFJlZkVDbGFzcywgUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydENvbXBvbmVudFJlZkVDbGFzcywgUE9SVF9DT01QT05FTlRfUkVGX19FTkFCTEVfTVRPTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydENvbXBvbmVudFJlZkVDbGFzcywgUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9SRUZfX0lEKTsKLQotCQlwcm9wZXJ0eVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPUEVSVFlfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlUeXBlRUNsYXNzLCBQUk9QRVJUWV9UWVBFX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eVR5cGVFQ2xhc3MsIFBST1BFUlRZX1RZUEVfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eVR5cGVFQ2xhc3MsIFBST1BFUlRZX1RZUEVfX0lEKTsKLQotCQlyZXNvdXJjZUVudlJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVNPVVJDRV9FTlZfUkVGKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZUVudlJlZkVDbGFzcywgUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUVudlJlZkVDbGFzcywgUkVTT1VSQ0VfRU5WX1JFRl9fUkVTT1VSQ0VfRU5WX1JFRl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUVudlJlZkVDbGFzcywgUkVTT1VSQ0VfRU5WX1JFRl9fUkVTT1VSQ0VfRU5WX1JFRl9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUVudlJlZkVDbGFzcywgUkVTT1VSQ0VfRU5WX1JFRl9fTUFQUEVEX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlRW52UmVmRUNsYXNzLCBSRVNPVVJDRV9FTlZfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJFU09VUkNFX0VOVl9SRUZfX0lEKTsKLQotCQlyZXNvdXJjZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVNPVVJDRV9SRUYpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VSZWZFQ2xhc3MsIFJFU09VUkNFX1JFRl9fUkVTX1JFRl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZVJlZkVDbGFzcywgUkVTT1VSQ0VfUkVGX19SRVNfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VSZWZFQ2xhc3MsIFJFU09VUkNFX1JFRl9fUkVTX0FVVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZVJlZkVDbGFzcywgUkVTT1VSQ0VfUkVGX19NQVBQRURfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VSZWZFQ2xhc3MsIFJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX0lEKTsKLQotCQlydW5Bc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSVU5fQVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJ1bkFzRUNsYXNzLCBSVU5fQVNfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocnVuQXNFQ2xhc3MsIFJVTl9BU19fUk9MRV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShydW5Bc0VDbGFzcywgUlVOX0FTX19JRCk7Ci0KLQkJc2VjdXJpdHlSb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1VSSVRZX1JPTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Um9sZUVDbGFzcywgU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN1cml0eVJvbGVFQ2xhc3MsIFNFQ1VSSVRZX1JPTEVfX1JPTEVfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlSb2xlRUNsYXNzLCBTRUNVUklUWV9ST0xFX19JRCk7Ci0KLQkJc2VjdXJpdHlSb2xlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1VSSVRZX1JPTEVfUkVGKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eVJvbGVSZWZFQ2xhc3MsIFNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlSb2xlUmVmRUNsYXNzLCBTRUNVUklUWV9ST0xFX1JFRl9fUk9MRV9MSU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN1cml0eVJvbGVSZWZFQ2xhc3MsIFNFQ1VSSVRZX1JPTEVfUkVGX19JRCk7Ci0KLQkJc2VydmljZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWSUNFX1JFRik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19JQ09OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19XU0RMX0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19IQU5ETEVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0hBTkRMRVJfQ0hBSU5TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fTUFQUEVEX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0lEKTsKLQotCQlzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWSUNFX1JFRl9IQU5ETEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MsIFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lDT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9fSEFORExFUl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9fSEFORExFUl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MsIFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lOSVRfUEFSQU1TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9IRUFERVJTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9ST0xFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MsIFNFUlZJQ0VfUkVGX0hBTkRMRVJfX1BPUlRfTkFNRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX19JRCk7Ci0KLQkJc2VydmljZVJlZkhhbmRsZXJDaGFpbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkhhbmRsZXJDaGFpbkVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fUE9SVF9OQU1FX1BBVFRFUk4pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MsIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzLCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19IQU5ETEVSUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkhhbmRsZXJDaGFpbkVDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSUQpOwotCi0JCXNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmSGFuZGxlckNoYWluc0VDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0hBTkRMRVJfQ0hBSU5TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmSGFuZGxlckNoYWluc0VDbGFzcywgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0lEKTsKLQotCQl1cmxQYXR0ZXJuVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhVUkxfUEFUVEVSTl9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh1cmxQYXR0ZXJuVHlwZUVDbGFzcywgVVJMX1BBVFRFUk5fVFlQRV9fVkFMVUUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQllamJSZWZUeXBlRUVudW0gPSBjcmVhdGVFRW51bShFSkJfUkVGX1RZUEUpOwotCQllbnZFbnRyeVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEVOVl9FTlRSWV9UWVBFKTsKLQkJbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0gPSBjcmVhdGVFRW51bShNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEUpOwotCQlwZXJzaXN0ZW5jZUNvbnRleHRUeXBlRUVudW0gPSBjcmVhdGVFRW51bShQRVJTSVNURU5DRV9DT05URVhUX1RZUEUpOwotCQlyZXNBdXRoVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oUkVTX0FVVEhfVFlQRSk7Ci0JCXJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFJFU19TSEFSSU5HX1NDT1BFX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCWRld2V5VmVyc2lvblR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoREVXRVlfVkVSU0lPTl9UWVBFKTsKLQkJZWpiTGlua0VEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShFSkJfTElOSyk7Ci0JCWVqYlJlZk5hbWVUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEVKQl9SRUZfTkFNRV9UWVBFKTsKLQkJZWpiUmVmVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShFSkJfUkVGX1RZUEVfT0JKRUNUKTsKLQkJZW52RW50cnlUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEVOVl9FTlRSWV9UWVBFX09CSkVDVCk7Ci0JCWZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFKTsKLQkJaG9tZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShIT01FKTsKLQkJamF2YUlkZW50aWZpZXJFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSkFWQV9JREVOVElGSUVSKTsKLQkJamF2YVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSkFWQV9UWVBFKTsKLQkJam5kaU5hbWVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSk5ESV9OQU1FKTsKLQkJbG9jYWxFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTE9DQUwpOwotCQlsb2NhbEhvbWVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTE9DQUxfSE9NRSk7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LKTsKLQkJbWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX1RZUEUpOwotCQltZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFX09CSkVDVCk7Ci0JCXBhdGhUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFBBVEhfVFlQRSk7Ci0JCXBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX09CSkVDVCk7Ci0JCXJlbW90ZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShSRU1PVEUpOwotCQlyZXNBdXRoVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShSRVNfQVVUSF9UWVBFX09CSkVDVCk7Ci0JCXJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoUkVTX1NIQVJJTkdfU0NPUEVfVFlQRV9PQkpFQ1QpOwotCQlyb2xlTmFtZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShST0xFX05BTUUpOwotCQlzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEUpOwotCQlzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX1RZUEUpOwotCQlzZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUpOwotCQlzZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk4pOwotCQl0cnVlRmFsc2VUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFRSVUVfRkFMU0VfVFlQRSk7Ci0JCXRydWVGYWxzZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVFJVRV9GQUxTRV9UWVBFX09CSkVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCQlYTUxOYW1lc3BhY2VQYWNrYWdlIHRoZVhNTE5hbWVzcGFjZVBhY2thZ2UgPSAoWE1MTmFtZXNwYWNlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxOYW1lc3BhY2VQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGRlc2NyaXB0aW9uRUNsYXNzLCBEZXNjcmlwdGlvbi5jbGFzcywgIkRlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0aW9uX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpcHRpb25fTGFuZygpLCB0aGVYTUxOYW1lc3BhY2VQYWNrYWdlLmdldExhbmdUeXBlKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkaXNwbGF5TmFtZUVDbGFzcywgRGlzcGxheU5hbWUuY2xhc3MsICJEaXNwbGF5TmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNwbGF5TmFtZV9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgRGlzcGxheU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERpc3BsYXlOYW1lX0xhbmcoKSwgdGhlWE1MTmFtZXNwYWNlUGFja2FnZS5nZXRMYW5nVHlwZSgpLCAibGFuZyIsIG51bGwsIDAsIDEsIERpc3BsYXlOYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZWpiTG9jYWxSZWZFQ2xhc3MsIEVqYkxvY2FsUmVmLmNsYXNzLCAiRWpiTG9jYWxSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RWpiTG9jYWxSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFamJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9FamJSZWZOYW1lKCksIHRoaXMuZ2V0RWpiUmVmTmFtZVR5cGUoKSwgImVqYlJlZk5hbWUiLCBudWxsLCAxLCAxLCBFamJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiTG9jYWxSZWZfRWpiUmVmVHlwZSgpLCB0aGlzLmdldEVqYlJlZlR5cGUoKSwgImVqYlJlZlR5cGUiLCAiRW50aXR5IiwgMCwgMSwgRWpiTG9jYWxSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9Mb2NhbEhvbWUoKSwgdGhpcy5nZXRMb2NhbEhvbWUoKSwgImxvY2FsSG9tZSIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9Mb2NhbCgpLCB0aGlzLmdldExvY2FsKCksICJsb2NhbCIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9FamJMaW5rKCksIHRoaXMuZ2V0RUpCTGluaygpLCAiZWpiTGluayIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFamJMb2NhbFJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYkxvY2FsUmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhlamJSZWZFQ2xhc3MsIEVqYlJlZi5jbGFzcywgIkVqYlJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFamJSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX0VqYlJlZk5hbWUoKSwgdGhpcy5nZXRFamJSZWZOYW1lVHlwZSgpLCAiZWpiUmVmTmFtZSIsIG51bGwsIDEsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX0VqYlJlZlR5cGUoKSwgdGhpcy5nZXRFamJSZWZUeXBlKCksICJlamJSZWZUeXBlIiwgIkVudGl0eSIsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9Ib21lKCksIHRoaXMuZ2V0SG9tZSgpLCAiaG9tZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX1JlbW90ZSgpLCB0aGlzLmdldFJlbW90ZSgpLCAicmVtb3RlIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfRWpiTGluaygpLCB0aGlzLmdldEVKQkxpbmsoKSwgImVqYkxpbmsiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RWpiUmVmX0luamVjdGlvblRhcmdldHMoKSwgdGhpcy5nZXRJbmplY3Rpb25UYXJnZXQoKSwgbnVsbCwgImluamVjdGlvblRhcmdldHMiLCBudWxsLCAwLCAtMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGVtcHR5VHlwZUVDbGFzcywgRW1wdHlUeXBlLmNsYXNzLCAiRW1wdHlUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVtcHR5VHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFbXB0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGVudkVudHJ5RUNsYXNzLCBFbnZFbnRyeS5jbGFzcywgIkVudkVudHJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW52RW50cnlfRW52RW50cnlOYW1lKCksIHRoaXMuZ2V0Sk5ESU5hbWUoKSwgImVudkVudHJ5TmFtZSIsIG51bGwsIDEsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9FbnZFbnRyeVR5cGUoKSwgdGhpcy5nZXRFbnZFbnRyeVR5cGUoKSwgImVudkVudHJ5VHlwZSIsICJqYXZhLmxhbmcuQm9vbGVhbiIsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW52RW50cnlfRW52RW50cnlWYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVudkVudHJ5VmFsdWUiLCBudWxsLCAwLCAxLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW52RW50cnlfTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW52RW50cnlfSW5qZWN0aW9uVGFyZ2V0cygpLCB0aGlzLmdldEluamVjdGlvblRhcmdldCgpLCBudWxsLCAiaW5qZWN0aW9uVGFyZ2V0cyIsIG51bGwsIDAsIC0xLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoaWNvbkVDbGFzcywgSWNvbi5jbGFzcywgIkljb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvbl9TbWFsbEljb24oKSwgdGhpcy5nZXRQYXRoVHlwZSgpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgSWNvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvbl9MYXJnZUljb24oKSwgdGhpcy5nZXRQYXRoVHlwZSgpLCAibGFyZ2VJY29uIiwgbnVsbCwgMCwgMSwgSWNvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBJY29uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEljb25fTGFuZygpLCB0aGVYTUxOYW1lc3BhY2VQYWNrYWdlLmdldExhbmdUeXBlKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgSWNvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGluamVjdGlvblRhcmdldEVDbGFzcywgSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCAiSW5qZWN0aW9uVGFyZ2V0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEluamVjdGlvblRhcmdldF9JbmplY3Rpb25UYXJnZXRDbGFzcygpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJpbmplY3Rpb25UYXJnZXRDbGFzcyIsIG51bGwsIDEsIDEsIEluamVjdGlvblRhcmdldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5qZWN0aW9uVGFyZ2V0X0luamVjdGlvblRhcmdldE5hbWUoKSwgdGhpcy5nZXRKYXZhSWRlbnRpZmllcigpLCAiaW5qZWN0aW9uVGFyZ2V0TmFtZSIsIG51bGwsIDEsIDEsIEluamVjdGlvblRhcmdldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGxpZmVjeWNsZUNhbGxiYWNrRUNsYXNzLCBMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgIkxpZmVjeWNsZUNhbGxiYWNrIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAibGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcyIsIG51bGwsIDAsIDEsIExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMaWZlY3ljbGVDYWxsYmFja19MaWZlY3ljbGVDYWxsYmFja01ldGhvZCgpLCB0aGlzLmdldEphdmFJZGVudGlmaWVyKCksICJsaWZlY3ljbGVDYWxsYmFja01ldGhvZCIsIG51bGwsIDEsIDEsIExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobGlzdGVuZXJFQ2xhc3MsIExpc3RlbmVyLmNsYXNzLCAiTGlzdGVuZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGlzdGVuZXJfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRMaXN0ZW5lcl9EaXNwbGF5TmFtZXMoKSwgdGhpcy5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIExpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldExpc3RlbmVyX0ljb25zKCksIHRoaXMuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJsaXN0ZW5lckNsYXNzIiwgbnVsbCwgMSwgMSwgTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExpc3RlbmVyX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIExpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRGVzdGluYXRpb25fRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0Rpc3BsYXlOYW1lcygpLCB0aGlzLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JY29ucygpLCB0aGlzLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25fTWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAibWVzc2FnZURlc3RpbmF0aW9uTmFtZSIsIG51bGwsIDEsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvblJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSIsIG51bGwsIDEsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKSwgdGhpcy5nZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSgpLCAibWVzc2FnZURlc3RpbmF0aW9uVHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCksIHRoaXMuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCksICJtZXNzYWdlRGVzdGluYXRpb25Vc2FnZSIsICJDb25zdW1lcyIsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25MaW5rKCksIHRoaXMuZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpLCAibWVzc2FnZURlc3RpbmF0aW9uTGluayIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfSW5qZWN0aW9uVGFyZ2V0cygpLCB0aGlzLmdldEluamVjdGlvblRhcmdldCgpLCBudWxsLCAiaW5qZWN0aW9uVGFyZ2V0cyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocGFyYW1WYWx1ZUVDbGFzcywgUGFyYW1WYWx1ZS5jbGFzcywgIlBhcmFtVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFyYW1WYWx1ZV9QYXJhbU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInBhcmFtTmFtZSIsIG51bGwsIDEsIDEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBhcmFtVmFsdWVfUGFyYW1WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBhcmFtVmFsdWUiLCBudWxsLCAxLCAxLCBQYXJhbVZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcywgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAiUGVyc2lzdGVuY2VDb250ZXh0UmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpLCB0aGlzLmdldEpORElOYW1lKCksICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lIiwgbnVsbCwgMSwgMSwgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VVbml0TmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAicGVyc2lzdGVuY2VVbml0TmFtZSIsIG51bGwsIDAsIDEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlQ29udGV4dFR5cGUoKSwgdGhpcy5nZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCksICJwZXJzaXN0ZW5jZUNvbnRleHRUeXBlIiwgIlRyYW5zYWN0aW9uIiwgMCwgMSwgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlUHJvcGVydGllcygpLCB0aGlzLmdldFByb3BlcnR5VHlwZSgpLCBudWxsLCAicGVyc2lzdGVuY2VQcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MsIFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgIlBlcnNpc3RlbmNlVW5pdFJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX1BlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAicGVyc2lzdGVuY2VVbml0UmVmTmFtZSIsIG51bGwsIDEsIDEsIFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInBlcnNpc3RlbmNlVW5pdE5hbWUiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlVW5pdFJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0luamVjdGlvblRhcmdldHMoKSwgdGhpcy5nZXRJbmplY3Rpb25UYXJnZXQoKSwgbnVsbCwgImluamVjdGlvblRhcmdldHMiLCBudWxsLCAwLCAtMSwgUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlVW5pdFJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHBvcnRDb21wb25lbnRSZWZFQ2xhc3MsIFBvcnRDb21wb25lbnRSZWYuY2xhc3MsICJQb3J0Q29tcG9uZW50UmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsIG51bGwsIDEsIDEsIFBvcnRDb21wb25lbnRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRSZWZfRW5hYmxlTXRvbSgpLCB0aGlzLmdldFRydWVGYWxzZVR5cGUoKSwgImVuYWJsZU10b20iLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInBvcnRDb21wb25lbnRMaW5rIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudFJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhwcm9wZXJ0eVR5cGVFQ2xhc3MsIFByb3BlcnR5VHlwZS5jbGFzcywgIlByb3BlcnR5VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eVR5cGVfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBQcm9wZXJ0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5VHlwZV9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMSwgMSwgUHJvcGVydHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eVR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUHJvcGVydHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhyZXNvdXJjZUVudlJlZkVDbGFzcywgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICJSZXNvdXJjZUVudlJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX1Jlc291cmNlRW52UmVmTmFtZSgpLCB0aGlzLmdldEpORElOYW1lKCksICJyZXNvdXJjZUVudlJlZk5hbWUiLCBudWxsLCAxLCAxLCBSZXNvdXJjZUVudlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VFbnZSZWZfUmVzb3VyY2VFbnZSZWZUeXBlKCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgInJlc291cmNlRW52UmVmVHlwZSIsIG51bGwsIDAsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUVudlJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUVudlJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhyZXNvdXJjZVJlZkVDbGFzcywgUmVzb3VyY2VSZWYuY2xhc3MsICJSZXNvdXJjZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX1Jlc1JlZk5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAicmVzUmVmTmFtZSIsIG51bGwsIDEsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9SZXNUeXBlKCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgInJlc1R5cGUiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfUmVzQXV0aCgpLCB0aGlzLmdldFJlc0F1dGhUeXBlKCksICJyZXNBdXRoIiwgIkFwcGxpY2F0aW9uIiwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9SZXNTaGFyaW5nU2NvcGUoKSwgdGhpcy5nZXRSZXNTaGFyaW5nU2NvcGVUeXBlKCksICJyZXNTaGFyaW5nU2NvcGUiLCAiU2hhcmVhYmxlIiwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZVJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhydW5Bc0VDbGFzcywgUnVuQXMuY2xhc3MsICJSdW5BcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSdW5Bc19EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJ1bkFzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJ1bkFzX1JvbGVOYW1lKCksIHRoaXMuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lIiwgbnVsbCwgMSwgMSwgUnVuQXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJ1bkFzX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFJ1bkFzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eVJvbGVFQ2xhc3MsIFNlY3VyaXR5Um9sZS5jbGFzcywgIlNlY3VyaXR5Um9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eVJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCksIHRoaXMuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lIiwgbnVsbCwgMSwgMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eVJvbGVSZWZFQ2xhc3MsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIlNlY3VyaXR5Um9sZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVOYW1lKCksIHRoaXMuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lIiwgbnVsbCwgMSwgMSwgU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVSZWZfUm9sZUxpbmsoKSwgdGhpcy5nZXRSb2xlTmFtZSgpLCAicm9sZUxpbmsiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Um9sZVJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHNlcnZpY2VSZWZFQ2xhc3MsIFNlcnZpY2VSZWYuY2xhc3MsICJTZXJ2aWNlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfRGlzcGxheU5hbWVzKCksIHRoaXMuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfSWNvbnMoKSwgdGhpcy5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAic2VydmljZVJlZk5hbWUiLCBudWxsLCAxLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAic2VydmljZUludGVyZmFjZSIsIG51bGwsIDEsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfU2VydmljZVJlZlR5cGUoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAic2VydmljZVJlZlR5cGUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEFueVVSSSgpLCAid3NkbEZpbGUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCksIHRoaXMuZ2V0UGF0aFR5cGUoKSwgImpheHJwY01hcHBpbmdGaWxlIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0UU5hbWUoKSwgInNlcnZpY2VRbmFtZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKSwgdGhpcy5nZXRQb3J0Q29tcG9uZW50UmVmKCksIG51bGwsICJwb3J0Q29tcG9uZW50UmVmcyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSwgdGhpcy5nZXRTZXJ2aWNlUmVmSGFuZGxlcigpLCBudWxsLCAiaGFuZGxlcnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmX0hhbmRsZXJDaGFpbnMoKSwgdGhpcy5nZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygpLCBudWxsLCAiaGFuZGxlckNoYWlucyIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpLCB0aGlzLmdldEluamVjdGlvblRhcmdldCgpLCBudWxsLCAiaW5qZWN0aW9uVGFyZ2V0cyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAiU2VydmljZVJlZkhhbmRsZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmSGFuZGxlcl9EaXNwbGF5TmFtZXMoKSwgdGhpcy5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZIYW5kbGVyX0ljb25zKCksIHRoaXMuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJfSGFuZGxlck5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImhhbmRsZXJOYW1lIiwgbnVsbCwgMSwgMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJDbGFzcygpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJoYW5kbGVyQ2xhc3MiLCBudWxsLCAxLCAxLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJfSW5pdFBhcmFtcygpLCB0aGlzLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJfU29hcEhlYWRlcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0UU5hbWUoKSwgInNvYXBIZWFkZXJzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlcl9Tb2FwUm9sZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInNvYXBSb2xlcyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJfUG9ydE5hbWVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJwb3J0TmFtZXMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzLCBTZXJ2aWNlUmVmSGFuZGxlckNoYWluLmNsYXNzLCAiU2VydmljZVJlZkhhbmRsZXJDaGFpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1NlcnZpY2VOYW1lUGF0dGVybigpLCB0aGlzLmdldFNlcnZpY2VSZWZRbmFtZVBhdHRlcm4oKSwgInNlcnZpY2VOYW1lUGF0dGVybiIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fUG9ydE5hbWVQYXR0ZXJuKCksIHRoaXMuZ2V0U2VydmljZVJlZlFuYW1lUGF0dGVybigpLCAicG9ydE5hbWVQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9Qcm90b2NvbEJpbmRpbmdzKCksIHRoaXMuZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlKCksICJwcm90b2NvbEJpbmRpbmdzIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9IYW5kbGVycygpLCB0aGlzLmdldFNlcnZpY2VSZWZIYW5kbGVyKCksIG51bGwsICJoYW5kbGVycyIsIG51bGwsIDEsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlckNoYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2VydmljZVJlZkhhbmRsZXJDaGFpbnNFQ2xhc3MsIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zLmNsYXNzLCAiU2VydmljZVJlZkhhbmRsZXJDaGFpbnMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnNfSGFuZGxlckNoYWlucygpLCB0aGlzLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKSwgbnVsbCwgImhhbmRsZXJDaGFpbnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnNfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHVybFBhdHRlcm5UeXBlRUNsYXNzLCBVcmxQYXR0ZXJuVHlwZS5jbGFzcywgIlVybFBhdHRlcm5UeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFVybFBhdHRlcm5UeXBlX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBVcmxQYXR0ZXJuVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oZWpiUmVmVHlwZUVFbnVtLCBFamJSZWZUeXBlLmNsYXNzLCAiRWpiUmVmVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChlamJSZWZUeXBlRUVudW0sIEVqYlJlZlR5cGUuRU5USVRZX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZWpiUmVmVHlwZUVFbnVtLCBFamJSZWZUeXBlLlNFU1NJT05fTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuY2xhc3MsICJFbnZFbnRyeVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5KQVZBX0xBTkdfQk9PTEVBTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuSkFWQV9MQU5HX0JZVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19DSEFSQUNURVJfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19TVFJJTkdfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19TSE9SVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuSkFWQV9MQU5HX0lOVEVHRVJfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19MT05HX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5KQVZBX0xBTkdfRkxPQVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19ET1VCTEVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwobWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5DT05TVU1FU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuUFJPRFVDRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLkNPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShwZXJzaXN0ZW5jZUNvbnRleHRUeXBlRUVudW0sIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUuY2xhc3MsICJQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFRW51bSwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5UUkFOU0FDVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFRW51bSwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5FWFRFTkRFRF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0ocmVzQXV0aFR5cGVFRW51bSwgUmVzQXV0aFR5cGUuY2xhc3MsICJSZXNBdXRoVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoVHlwZUVFbnVtLCBSZXNBdXRoVHlwZS5BUFBMSUNBVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc0F1dGhUeXBlRUVudW0sIFJlc0F1dGhUeXBlLkNPTlRBSU5FUl9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0ocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCBSZXNTaGFyaW5nU2NvcGVUeXBlLmNsYXNzLCAiUmVzU2hhcmluZ1Njb3BlVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChyZXNTaGFyaW5nU2NvcGVUeXBlRUVudW0sIFJlc1NoYXJpbmdTY29wZVR5cGUuU0hBUkVBQkxFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCBSZXNTaGFyaW5nU2NvcGVUeXBlLlVOU0hBUkVBQkxFX0xJVEVSQUwpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGRld2V5VmVyc2lvblR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkRld2V5VmVyc2lvblR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZWpiTGlua0VEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiRUpCTGluayIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShlamJSZWZOYW1lVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiRWpiUmVmTmFtZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZWpiUmVmVHlwZU9iamVjdEVEYXRhVHlwZSwgRWpiUmVmVHlwZS5jbGFzcywgIkVqYlJlZlR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShlbnZFbnRyeVR5cGVPYmplY3RFRGF0YVR5cGUsIEVudkVudHJ5VHlwZS5jbGFzcywgIkVudkVudHJ5VHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJGdWxseVF1YWxpZmllZENsYXNzVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShob21lRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJIb21lIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGphdmFJZGVudGlmaWVyRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJKYXZhSWRlbnRpZmllciIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShqYXZhVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiSmF2YVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoam5kaU5hbWVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkpORElOYW1lIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGxvY2FsRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJMb2NhbCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShsb2NhbEhvbWVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkxvY2FsSG9tZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShtZXNzYWdlRGVzdGluYXRpb25MaW5rRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25MaW5rIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKG1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3RFRGF0YVR5cGUsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHBhdGhUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJQYXRoVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShwZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0RURhdGFUeXBlLCBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlLmNsYXNzLCAiUGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHJlbW90ZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiUmVtb3RlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHJlc0F1dGhUeXBlT2JqZWN0RURhdGFUeXBlLCBSZXNBdXRoVHlwZS5jbGFzcywgIlJlc0F1dGhUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUocmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdEVEYXRhVHlwZSwgUmVzU2hhcmluZ1Njb3BlVHlwZS5jbGFzcywgIlJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShyb2xlTmFtZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiUm9sZU5hbWUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlRURhdGFUeXBlLCBMaXN0LmNsYXNzLCAiU2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIlNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHRydWVGYWxzZVR5cGVFRGF0YVR5cGUsIGJvb2xlYW4uY2xhc3MsICJUcnVlRmFsc2VUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHRydWVGYWxzZVR5cGVPYmplY3RFRGF0YVR5cGUsIEJvb2xlYW4uY2xhc3MsICJUcnVlRmFsc2VUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKLQkJLy8gaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhCi0JCWNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+aHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7Ci0JCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIjsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb25UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAic2ltcGxlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZXNjcmlwdGlvbl9WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICI6MCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgInNpbXBsZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaXB0aW9uX0xhbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibGFuZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGV3ZXlWZXJzaW9uVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZGV3ZXktdmVyc2lvblR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3Rva2VuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgInBhdHRlcm4iLCAiXFwuP1swLTldKyhcXC5bMC05XSspKiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRpc3BsYXlOYW1lRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJkaXNwbGF5LW5hbWVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAic2ltcGxlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNwbGF5TmFtZV9WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICI6MCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgInNpbXBsZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERpc3BsYXlOYW1lX0xhbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibGFuZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZWpiTGlua0VEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZWpiLWxpbmtUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZWpiTG9jYWxSZWZFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImVqYi1sb2NhbC1yZWZUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYkxvY2FsUmVmX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJMb2NhbFJlZl9FamJSZWZOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItcmVmLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJMb2NhbFJlZl9FamJSZWZUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItcmVmLXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJMb2NhbFJlZl9Mb2NhbEhvbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImxvY2FsLWhvbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJMb2NhbFJlZl9Mb2NhbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibG9jYWwiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJMb2NhbFJlZl9FamJMaW5rKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItbGluayIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJMb2NhbFJlZl9NYXBwZWROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtYXBwZWQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYkxvY2FsUmVmX0luamVjdGlvblRhcmdldHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluamVjdGlvbi10YXJnZXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJMb2NhbFJlZl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVqYlJlZkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZWpiLXJlZlR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFamJSZWZfRWpiUmVmTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLXJlZi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RWpiUmVmX0VqYlJlZlR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1yZWYtdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYlJlZl9Ib21lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJob21lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RWpiUmVmX1JlbW90ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVtb3RlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RWpiUmVmX0VqYkxpbmsoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1saW5rIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYlJlZl9NYXBwZWROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtYXBwZWQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVqYlJlZl9JbmplY3Rpb25UYXJnZXRzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RWpiUmVmX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZWpiUmVmTmFtZVR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImVqYi1yZWYtbmFtZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlamJSZWZUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImVqYi1yZWYtdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVqYlJlZlR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImVqYi1yZWYtdHlwZVR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImVqYi1yZWYtdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlbXB0eVR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImVtcHR5VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVtcHR5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbXB0eVR5cGVfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlbnZFbnRyeUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZW52LWVudHJ5VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnZFbnRyeV9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudkVudHJ5X0VudkVudHJ5TmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZW52LWVudHJ5LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW52RW50cnlfRW52RW50cnlUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlbnYtZW50cnktdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnZFbnRyeV9FbnZFbnRyeVZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlbnYtZW50cnktdmFsdWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW52RW50cnlfTWFwcGVkTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWFwcGVkLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnZFbnRyeV9JbmplY3Rpb25UYXJnZXRzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW52RW50cnlfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlbnZFbnRyeVR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZW52RW50cnlUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChob21lRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJob21lVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGljb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImljb25UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJY29uX1NtYWxsSWNvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic21hbGwtaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJY29uX0xhcmdlSWNvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibGFyZ2UtaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEljb25fSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJY29uX0xhbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibGFuZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoaW5qZWN0aW9uVGFyZ2V0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbmplY3Rpb25UYXJnZXRfSW5qZWN0aW9uVGFyZ2V0Q2xhc3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluamVjdGlvbi10YXJnZXQtY2xhc3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbmplY3Rpb25UYXJnZXRfSW5qZWN0aW9uVGFyZ2V0TmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW5qZWN0aW9uLXRhcmdldC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGphdmFJZGVudGlmaWVyRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJqYXZhLWlkZW50aWZpZXJUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSN0b2tlbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJwYXR0ZXJuIiwgIigkfF98XFxwe0x9KShcXHB7TH18XFxwe05kfXxffCQpKiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGphdmFUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJqYXZhLXR5cGVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSN0b2tlbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJwYXR0ZXJuIiwgIlteXFxwe1p9XSoiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChqbmRpTmFtZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiam5kaS1uYW1lVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGxpZmVjeWNsZUNhbGxiYWNrRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImxpZmVjeWNsZS1jYWxsYmFjay1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsaWZlY3ljbGUtY2FsbGJhY2stbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGxpc3RlbmVyRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJsaXN0ZW5lclR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGlzdGVuZXJfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExpc3RlbmVyX0Rpc3BsYXlOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGlzdGVuZXJfSWNvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImljb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibGlzdGVuZXItY2xhc3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMaXN0ZW5lcl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGxvY2FsRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJsb2NhbFR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChsb2NhbEhvbWVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImxvY2FsLWhvbWVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRGVzdGluYXRpb25fRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9EaXNwbGF5TmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JY29ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRGVzdGluYXRpb25fTWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NYXBwZWROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtYXBwZWQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25UeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uTGluaygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NYXBwZWROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtYXBwZWQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JbmplY3Rpb25UYXJnZXRzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocGFyYW1WYWx1ZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicGFyYW0tdmFsdWVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQYXJhbVZhbHVlX1BhcmFtTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGFyYW0tbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQYXJhbVZhbHVlX1BhcmFtVmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBhcmFtLXZhbHVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGFyYW1WYWx1ZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBhdGhUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJwYXRoVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtY29udGV4dC1yZWZUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZVVuaXROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS11bml0LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtY29udGV4dC10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZVByb3BlcnRpZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLXByb3BlcnR5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9NYXBwZWROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtYXBwZWQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9JbmplY3Rpb25UYXJnZXRzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocGVyc2lzdGVuY2VDb250ZXh0VHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocGVyc2lzdGVuY2VVbml0UmVmRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS11bml0LXJlZlR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX1BlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLXVuaXQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfTWFwcGVkTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWFwcGVkLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfSW5qZWN0aW9uVGFyZ2V0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW5qZWN0aW9uLXRhcmdldCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBlcnNpc3RlbmNlVW5pdFJlZl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBvcnRDb21wb25lbnRSZWZFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInBvcnQtY29tcG9uZW50LXJlZlR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQb3J0Q29tcG9uZW50UmVmX0VuYWJsZU10b20oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVuYWJsZS1tdG9tIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBvcnQtY29tcG9uZW50LWxpbmsiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQb3J0Q29tcG9uZW50UmVmX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvcGVydHlUeXBlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJwcm9wZXJ0eVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvcGVydHlUeXBlX05hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9wZXJ0eVR5cGVfVmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInZhbHVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvcGVydHlUeXBlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocmVtb3RlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJyZW1vdGVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocmVzQXV0aFR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicmVzLWF1dGhUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXNBdXRoVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicmVzLWF1dGhUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJyZXMtYXV0aFR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXNvdXJjZUVudlJlZkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicmVzb3VyY2UtZW52LXJlZlR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZXNvdXJjZUVudlJlZl9SZXNvdXJjZUVudlJlZk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLWVudi1yZWYtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZXNvdXJjZUVudlJlZl9SZXNvdXJjZUVudlJlZlR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLWVudi1yZWYtdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZXNvdXJjZUVudlJlZl9NYXBwZWROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtYXBwZWQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlc291cmNlRW52UmVmX0luamVjdGlvblRhcmdldHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluamVjdGlvbi10YXJnZXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZXNvdXJjZUVudlJlZl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJlc291cmNlUmVmRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJyZXNvdXJjZS1yZWZUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVzb3VyY2VSZWZfUmVzUmVmTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzLXJlZi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlc291cmNlUmVmX1Jlc1R5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlcy10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVzb3VyY2VSZWZfUmVzQXV0aCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzLWF1dGgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZXNvdXJjZVJlZl9SZXNTaGFyaW5nU2NvcGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlcy1zaGFyaW5nLXNjb3BlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlc291cmNlUmVmX01hcHBlZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1hcHBlZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVzb3VyY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW5qZWN0aW9uLXRhcmdldCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlc291cmNlUmVmX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJyZXMtc2hhcmluZy1zY29wZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInJlcy1zaGFyaW5nLXNjb3BlVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAicmVzLXNoYXJpbmctc2NvcGVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZU5hbWVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInJvbGUtbmFtZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChydW5Bc0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicnVuLWFzVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSdW5Bc19EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UnVuQXNfUm9sZU5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJvbGUtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJ1bkFzX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VjdXJpdHlSb2xlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZWN1cml0eS1yb2xlVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicm9sZS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdXJpdHlSb2xlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VjdXJpdHlSb2xlUmVmRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZWN1cml0eS1yb2xlLXJlZlR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyb2xlLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVMaW5rKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyb2xlLWxpbmsiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN1cml0eVJvbGVSZWZfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZXJ2aWNlUmVmRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZlR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9EaXNwbGF5TmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZfSWNvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImljb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmljZS1yZWYtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZpY2UtaW50ZXJmYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZfU2VydmljZVJlZlR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmLXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAid3NkbC1maWxlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImpheHJwYy1tYXBwaW5nLWZpbGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZpY2UtcW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicG9ydC1jb21wb25lbnQtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImhhbmRsZXIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9IYW5kbGVyQ2hhaW5zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJoYW5kbGVyLWNoYWlucyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmX01hcHBlZE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1hcHBlZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9JbmplY3Rpb25UYXJnZXRzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZl9oYW5kbGVyVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmSGFuZGxlcl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZkhhbmRsZXJfRGlzcGxheU5hbWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkaXNwbGF5LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmSGFuZGxlcl9JY29ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmSGFuZGxlcl9IYW5kbGVyTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaGFuZGxlci1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJDbGFzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaGFuZGxlci1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyX0luaXRQYXJhbXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluaXQtcGFyYW0iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZkhhbmRsZXJfU29hcEhlYWRlcnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNvYXAtaGVhZGVyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBSb2xlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic29hcC1yb2xlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyX1BvcnROYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicG9ydC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZkhhbmRsZXJfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1NlcnZpY2VOYW1lUGF0dGVybigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmljZS1uYW1lLXBhdHRlcm4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1BvcnROYW1lUGF0dGVybigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicG9ydC1uYW1lLXBhdHRlcm4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1Byb3RvY29sQmluZGluZ3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInByb3RvY29sLWJpbmRpbmdzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9IYW5kbGVycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaGFuZGxlciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZXJ2aWNlUmVmSGFuZGxlckNoYWluc0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAic2VydmljZS1yZWZfaGFuZGxlci1jaGFpbnNUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zX0hhbmRsZXJDaGFpbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImhhbmRsZXItY2hhaW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAic2VydmljZS1yZWZfcHJvdG9jb2wtYmluZGluZ0xpc3RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIml0ZW1UeXBlIiwgInNlcnZpY2UtcmVmX3Byb3RvY29sLWJpbmRpbmdUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmX3Byb3RvY29sLWJpbmRpbmdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm1lbWJlclR5cGVzIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNhbnlVUkkgc2VydmljZS1yZWZfcHJvdG9jb2wtVVJJQWxpYXNUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZl9wcm90b2NvbC1VUklBbGlhc1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3Rva2VuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgInBhdHRlcm4iLCAiIyMuKyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlcnZpY2VSZWZRbmFtZVBhdHRlcm5FRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmX3FuYW1lLXBhdHRlcm4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3Rva2VuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgInBhdHRlcm4iLCAiXFwqfChbXFxpLVs6XV1bXFxjLVs6XV0qOik/W1xcaS1bOl1dW1xcYy1bOl1dKlxcKj8iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0cnVlRmFsc2VUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ0cnVlLWZhbHNlVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjYm9vbGVhbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJwYXR0ZXJuIiwgIih0cnVlfGZhbHNlKSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodHJ1ZUZhbHNlVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAidHJ1ZS1mYWxzZVR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgInRydWUtZmFsc2VUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodXJsUGF0dGVyblR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInVybC1wYXR0ZXJuVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgInNpbXBsZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VXJsUGF0dGVyblR5cGVfVmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiOjAiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJzaW1wbGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsKLQl9Ci0KLX0gLy9KYXZhZWVQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvTGlmZWN5Y2xlQ2FsbGJhY2tJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9MaWZlY3ljbGVDYWxsYmFja0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmNjZjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9MaWZlY3ljbGVDYWxsYmFja0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGlmZWN5Y2xlIENhbGxiYWNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaWZlY3ljbGVDYWxsYmFja0ltcGwjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcyA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaWZlY3ljbGVDYWxsYmFja0ltcGwjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QgPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWZlY3ljbGVDYWxsYmFja0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExpZmVjeWNsZUNhbGxiYWNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpIDxlbT5MaWZlY3ljbGUgQ2FsbGJhY2sgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJRkVDWUNMRV9DQUxMQkFDS19DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKCkgPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsaWZlY3ljbGVDYWxsYmFja0NsYXNzID0gTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCkgPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSUZFQ1lDTEVfQ0FMTEJBQ0tfTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCkgPGVtPkxpZmVjeWNsZSBDYWxsYmFjayBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpZmVjeWNsZUNhbGxiYWNrTWV0aG9kID0gTElGRUNZQ0xFX0NBTExCQUNLX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaWZlY3ljbGVDYWxsYmFja0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkxJRkVDWUNMRV9DQUxMQkFDSzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKSB7Ci0JCXJldHVybiBsaWZlY3ljbGVDYWxsYmFja0NsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoU3RyaW5nIG5ld0xpZmVjeWNsZUNhbGxiYWNrQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MgPSBsaWZlY3ljbGVDYWxsYmFja0NsYXNzOwotCQlsaWZlY3ljbGVDYWxsYmFja0NsYXNzID0gbmV3TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19DTEFTUywgb2xkTGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcywgbGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKSB7Ci0JCXJldHVybiBsaWZlY3ljbGVDYWxsYmFja01ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaWZlY3ljbGVDYWxsYmFja01ldGhvZChTdHJpbmcgbmV3TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QpIHsKLQkJU3RyaW5nIG9sZExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kID0gbGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2Q7Ci0JCWxpZmVjeWNsZUNhbGxiYWNrTWV0aG9kID0gbmV3TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuTElGRUNZQ0xFX0NBTExCQUNLX19MSUZFQ1lDTEVfQ0FMTEJBQ0tfTUVUSE9ELCBvbGRMaWZlY3ljbGVDYWxsYmFja01ldGhvZCwgbGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElGRUNZQ0xFX0NBTExCQUNLX19MSUZFQ1lDTEVfQ0FMTEJBQ0tfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19DTEFTUzoKLQkJCQlzZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19NRVRIT0Q6Ci0JCQkJc2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19DTEFTUzoKLQkJCQlzZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKExJRkVDWUNMRV9DQUxMQkFDS19DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX01FVEhPRDoKLQkJCQlzZXRMaWZlY3ljbGVDYWxsYmFja01ldGhvZChMSUZFQ1lDTEVfQ0FMTEJBQ0tfTUVUSE9EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19DTEFTUzoKLQkJCQlyZXR1cm4gTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBsaWZlY3ljbGVDYWxsYmFja0NsYXNzICE9IG51bGwgOiAhTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTX0VERUZBVUxULmVxdWFscyhsaWZlY3ljbGVDYWxsYmFja0NsYXNzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19NRVRIT0Q6Ci0JCQkJcmV0dXJuIExJRkVDWUNMRV9DQUxMQkFDS19NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGxpZmVjeWNsZUNhbGxiYWNrTWV0aG9kICE9IG51bGwgOiAhTElGRUNZQ0xFX0NBTExCQUNLX01FVEhPRF9FREVGQVVMVC5lcXVhbHMobGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGlmZWN5Y2xlQ2FsbGJhY2tDbGFzczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsaWZlY3ljbGVDYWxsYmFja0NsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaWZlY3ljbGVDYWxsYmFja01ldGhvZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsaWZlY3ljbGVDYWxsYmFja01ldGhvZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0xpZmVjeWNsZUNhbGxiYWNrSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvTGlzdGVuZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OWZiMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvTGlzdGVuZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MaXN0ZW5lcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTGlzdGVuZXJJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaXN0ZW5lckltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaXN0ZW5lckltcGwjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaXN0ZW5lckltcGwjZ2V0TGlzdGVuZXJDbGFzcyA8ZW0+TGlzdGVuZXIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlzdGVuZXJDbGFzcygpIDxlbT5MaXN0ZW5lciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlzdGVuZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVEVORVJfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlzdGVuZXJDbGFzcygpIDxlbT5MaXN0ZW5lciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlzdGVuZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsaXN0ZW5lckNsYXNzID0gTElTVEVORVJfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0ZW5lckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkxJU1RFTkVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19ESVNQTEFZX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgewotCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBsaXN0ZW5lckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyQ2xhc3MoU3RyaW5nIG5ld0xpc3RlbmVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZExpc3RlbmVyQ2xhc3MgPSBsaXN0ZW5lckNsYXNzOwotCQlsaXN0ZW5lckNsYXNzID0gbmV3TGlzdGVuZXJDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1MsIG9sZExpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19MSVNURU5FUl9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0TGlzdGVuZXJDbGFzcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6Ci0JCQkJc2V0TGlzdGVuZXJDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6Ci0JCQkJc2V0TGlzdGVuZXJDbGFzcyhMSVNURU5FUl9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19MSVNURU5FUl9DTEFTUzoKLQkJCQlyZXR1cm4gTElTVEVORVJfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGxpc3RlbmVyQ2xhc3MgIT0gbnVsbCA6ICFMSVNURU5FUl9DTEFTU19FREVGQVVMVC5lcXVhbHMobGlzdGVuZXJDbGFzcyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGlzdGVuZXJDbGFzczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsaXN0ZW5lckNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0xpc3RlbmVySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0YjJmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRGVzdGluYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25JbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbCNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXNzYWdlRGVzdGluYXRpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUgPSBNRVNTQUdFX0RFU1RJTkFUSU9OX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWROYW1lID0gTUFQUEVEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRGVzdGluYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5NRVNTQUdFX0RFU1RJTkFUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKLQkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKLQkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoU3RyaW5nIG5ld01lc3NhZ2VEZXN0aW5hdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUgPSBtZXNzYWdlRGVzdGluYXRpb25OYW1lOwotCQltZXNzYWdlRGVzdGluYXRpb25OYW1lID0gbmV3TWVzc2FnZURlc3RpbmF0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OX05BTUUsIG9sZE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUsIG1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiBtYXBwZWROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIG5ld01hcHBlZE5hbWUpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZE5hbWUgPSBtYXBwZWROYW1lOwotCQltYXBwZWROYW1lID0gbmV3TWFwcGVkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19NQVBQRURfTkFNRSwgb2xkTWFwcGVkTmFtZSwgbWFwcGVkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX01FU1NBR0VfREVTVElOQVRJT05fTkFNRToKLQkJCQlzZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FOgotCQkJCXNldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZShNQVBQRURfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FOgotCQkJCXJldHVybiBNRVNTQUdFX0RFU1RJTkFUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUgIT0gbnVsbCA6ICFNRVNTQUdFX0RFU1RJTkFUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1lc3NhZ2VEZXN0aW5hdGlvbk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWVzc2FnZURlc3RpbmF0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtYXBwZWROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01lc3NhZ2VEZXN0aW5hdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzU1NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXNzYWdlRGVzdGluYXRpb25SZWYgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUgPSBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZURlc3RpbmF0aW9uVHlwZSA9IE1FU1NBR0VfREVTVElOQVRJT05fVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9FREVGQVVMVCA9IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5DT05TVU1FU19MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UgPSBNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPSBNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWROYW1lID0gTUFQUEVEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXRzKCkgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfREVTVElOQVRJT05fUkVGOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKSB7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoU3RyaW5nIG5ld01lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUpIHsKLQkJU3RyaW5nIG9sZE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUgPSBtZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lOwotCQltZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lID0gbmV3TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfTkFNRSwgb2xkTWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSwgbWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZShTdHJpbmcgbmV3TWVzc2FnZURlc3RpbmF0aW9uVHlwZSkgewotCQlTdHJpbmcgb2xkTWVzc2FnZURlc3RpbmF0aW9uVHlwZSA9IG1lc3NhZ2VEZXN0aW5hdGlvblR5cGU7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgPSBuZXdNZXNzYWdlRGVzdGluYXRpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEUsIG9sZE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUsIG1lc3NhZ2VEZXN0aW5hdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIG5ld01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKSB7Ci0JCU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBvbGRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSA9IG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlOwotCQltZXNzYWdlRGVzdGluYXRpb25Vc2FnZSA9IG5ld01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlID09IG51bGwgPyBNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX0VERUZBVUxUIDogbmV3TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2U7Ci0JCWJvb2xlYW4gb2xkTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VFU2V0ID0gbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VFU2V0OwotCQltZXNzYWdlRGVzdGluYXRpb25Vc2FnZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFLCBvbGRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSwgbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UsICFvbGRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkgewotCQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgb2xkTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UgPSBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZTsKLQkJYm9vbGVhbiBvbGRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZUVTZXQgPSBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZUVTZXQ7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlID0gTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9FREVGQVVMVDsKLQkJbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRSwgb2xkTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UsIE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfRURFRkFVTFQsIG9sZE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKSB7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKFN0cmluZyBuZXdNZXNzYWdlRGVzdGluYXRpb25MaW5rKSB7Ci0JCVN0cmluZyBvbGRNZXNzYWdlRGVzdGluYXRpb25MaW5rID0gbWVzc2FnZURlc3RpbmF0aW9uTGluazsKLQkJbWVzc2FnZURlc3RpbmF0aW9uTGluayA9IG5ld01lc3NhZ2VEZXN0aW5hdGlvbkxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fTElOSywgb2xkTWVzc2FnZURlc3RpbmF0aW9uTGluaywgbWVzc2FnZURlc3RpbmF0aW9uTGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIG1hcHBlZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgbmV3TWFwcGVkTmFtZSkgewotCQlTdHJpbmcgb2xkTWFwcGVkTmFtZSA9IG1hcHBlZE5hbWU7Ci0JCW1hcHBlZE5hbWUgPSBuZXdNYXBwZWROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NQVBQRURfTkFNRSwgb2xkTWFwcGVkTmFtZSwgbWFwcGVkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluamVjdGlvblRhcmdldHMoKSB7Ci0JCWlmIChpbmplY3Rpb25UYXJnZXRzID09IG51bGwpIHsKLQkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCX0KLQkJcmV0dXJuIGluamVjdGlvblRhcmdldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbmplY3Rpb25UYXJnZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9OQU1FOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTks6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1hcHBlZE5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGdldEluamVjdGlvblRhcmdldHMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fUkVGX05BTUU6Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fVFlQRToKLQkJCQlzZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRToKLQkJCQlzZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fTElOSzoKLQkJCQlzZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9OQU1FOgotCQkJCXNldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEU6Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZShNRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRToKLQkJCQl1bnNldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTks6Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayhNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZShNQVBQRURfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfTkFNRToKLQkJCQlyZXR1cm4gTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSAhPSBudWxsIDogIU1FU1NBR0VfREVTVElOQVRJT05fUkVGX05BTUVfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIE1FU1NBR0VfREVTVElOQVRJT05fVFlQRV9FREVGQVVMVCA9PSBudWxsID8gbWVzc2FnZURlc3RpbmF0aW9uVHlwZSAhPSBudWxsIDogIU1FU1NBR0VfREVTVElOQVRJT05fVFlQRV9FREVGQVVMVC5lcXVhbHMobWVzc2FnZURlc3RpbmF0aW9uVHlwZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fVVNBR0U6Ci0JCQkJcmV0dXJuIGlzU2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LOgotCQkJCXJldHVybiBNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTktfRURFRkFVTFQgPT0gbnVsbCA/IG1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgIT0gbnVsbCA6ICFNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTktfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2VEZXN0aW5hdGlvbkxpbmspOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gTUFQUEVEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZE5hbWUgIT0gbnVsbCA6ICFNQVBQRURfTkFNRV9FREVGQVVMVC5lcXVhbHMobWFwcGVkTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiBpbmplY3Rpb25UYXJnZXRzICE9IG51bGwgJiYgIWluamVjdGlvblRhcmdldHMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWVzc2FnZURlc3RpbmF0aW9uVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtZXNzYWdlRGVzdGluYXRpb25UeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlRVNldCkgcmVzdWx0LmFwcGVuZChtZXNzYWdlRGVzdGluYXRpb25Vc2FnZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgbWVzc2FnZURlc3RpbmF0aW9uTGluazogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtZXNzYWdlRGVzdGluYXRpb25MaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BhcmFtVmFsdWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9QYXJhbVZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjZmOWZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BhcmFtVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QYXJhbVZhbHVlSW1wbCNnZXRQYXJhbU5hbWUgPGVtPlBhcmFtIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsI2dldFBhcmFtVmFsdWUgPGVtPlBhcmFtIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QYXJhbVZhbHVlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUGFyYW1WYWx1ZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtTmFtZSgpIDxlbT5QYXJhbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1OYW1lKCkgPGVtPlBhcmFtIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJhbU5hbWUgPSBQQVJBTV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtVmFsdWUoKSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtVmFsdWUoKSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFyYW1WYWx1ZSA9IFBBUkFNX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFyYW1WYWx1ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlBBUkFNX1ZBTFVFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtTmFtZSgpIHsKLQkJcmV0dXJuIHBhcmFtTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbU5hbWUoU3RyaW5nIG5ld1BhcmFtTmFtZSkgewotCQlTdHJpbmcgb2xkUGFyYW1OYW1lID0gcGFyYW1OYW1lOwotCQlwYXJhbU5hbWUgPSBuZXdQYXJhbU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX1BBUkFNX05BTUUsIG9sZFBhcmFtTmFtZSwgcGFyYW1OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbVZhbHVlKCkgewotCQlyZXR1cm4gcGFyYW1WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbVZhbHVlKFN0cmluZyBuZXdQYXJhbVZhbHVlKSB7Ci0JCVN0cmluZyBvbGRQYXJhbVZhbHVlID0gcGFyYW1WYWx1ZTsKLQkJcGFyYW1WYWx1ZSA9IG5ld1BhcmFtVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX1BBUkFNX1ZBTFVFLCBvbGRQYXJhbVZhbHVlLCBwYXJhbVZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19QQVJBTV9OQU1FOgotCQkJCXJldHVybiBnZXRQYXJhbU5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fUEFSQU1fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtVmFsdWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX1BBUkFNX05BTUU6Ci0JCQkJc2V0UGFyYW1OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fUEFSQU1fVkFMVUU6Ci0JCQkJc2V0UGFyYW1WYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fUEFSQU1fTkFNRToKLQkJCQlzZXRQYXJhbU5hbWUoUEFSQU1fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19QQVJBTV9WQUxVRToKLQkJCQlzZXRQYXJhbVZhbHVlKFBBUkFNX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fUEFSQU1fTkFNRToKLQkJCQlyZXR1cm4gUEFSQU1fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGFyYW1OYW1lICE9IG51bGwgOiAhUEFSQU1fTkFNRV9FREVGQVVMVC5lcXVhbHMocGFyYW1OYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fUEFSQU1fVkFMVUU6Ci0JCQkJcmV0dXJuIFBBUkFNX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBwYXJhbVZhbHVlICE9IG51bGwgOiAhUEFSQU1fVkFMVUVfRURFRkFVTFQuZXF1YWxzKHBhcmFtVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhcmFtTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwYXJhbU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmFtVmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGFyYW1WYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QYXJhbVZhbHVlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhZTBjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9QZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsI2dldFBlcnNpc3RlbmNlUHJvcGVydGllcyA8ZW0+UGVyc2lzdGVuY2UgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbCNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZUNvbnRleHRSZWYgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCkgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUgPSBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUoKSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGVyc2lzdGVuY2VVbml0TmFtZSA9IFBFUlNJU1RFTkNFX1VOSVRfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV9FREVGQVVMVCA9IFBlcnNpc3RlbmNlQ29udGV4dFR5cGUuVFJBTlNBQ1RJT05fTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlID0gUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBQZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMoKSA8ZW0+UGVyc2lzdGVuY2UgUHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwZXJzaXN0ZW5jZVByb3BlcnRpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkTmFtZSA9IE1BUFBFRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5qZWN0aW9uVGFyZ2V0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QRVJTSVNURU5DRV9DT05URVhUX1JFRjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKFN0cmluZyBuZXdQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKSB7Ci0JCVN0cmluZyBvbGRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lID0gcGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZTsKLQkJcGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSA9IG5ld1BlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX05BTUUsIG9sZFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUsIHBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbmNlVW5pdE5hbWUoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcnNpc3RlbmNlVW5pdE5hbWUoU3RyaW5nIG5ld1BlcnNpc3RlbmNlVW5pdE5hbWUpIHsKLQkJU3RyaW5nIG9sZFBlcnNpc3RlbmNlVW5pdE5hbWUgPSBwZXJzaXN0ZW5jZVVuaXROYW1lOwotCQlwZXJzaXN0ZW5jZVVuaXROYW1lID0gbmV3UGVyc2lzdGVuY2VVbml0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9OQU1FLCBvbGRQZXJzaXN0ZW5jZVVuaXROYW1lLCBwZXJzaXN0ZW5jZVVuaXROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZShQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIG5ld1BlcnNpc3RlbmNlQ29udGV4dFR5cGUpIHsKLQkJUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBvbGRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlID0gcGVyc2lzdGVuY2VDb250ZXh0VHlwZTsKLQkJcGVyc2lzdGVuY2VDb250ZXh0VHlwZSA9IG5ld1BlcnNpc3RlbmNlQ29udGV4dFR5cGUgPT0gbnVsbCA/IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV9FREVGQVVMVCA6IG5ld1BlcnNpc3RlbmNlQ29udGV4dFR5cGU7Ci0JCWJvb2xlYW4gb2xkUGVyc2lzdGVuY2VDb250ZXh0VHlwZUVTZXQgPSBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlRVNldDsKLQkJcGVyc2lzdGVuY2VDb250ZXh0VHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9DT05URVhUX1RZUEUsIG9sZFBlcnNpc3RlbmNlQ29udGV4dFR5cGUsIHBlcnNpc3RlbmNlQ29udGV4dFR5cGUsICFvbGRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpIHsKLQkJUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBvbGRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlID0gcGVyc2lzdGVuY2VDb250ZXh0VHlwZTsKLQkJYm9vbGVhbiBvbGRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlRVNldCA9IHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFU2V0OwotCQlwZXJzaXN0ZW5jZUNvbnRleHRUeXBlID0gUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX0VERUZBVUxUOwotCQlwZXJzaXN0ZW5jZUNvbnRleHRUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRSwgb2xkUGVyc2lzdGVuY2VDb250ZXh0VHlwZSwgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX0VERUZBVUxULCBvbGRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlUHJvcGVydGllcygpIHsKLQkJaWYgKHBlcnNpc3RlbmNlUHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW5jZVByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUHJvcGVydHlUeXBlLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2VQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIG1hcHBlZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgbmV3TWFwcGVkTmFtZSkgewotCQlTdHJpbmcgb2xkTWFwcGVkTmFtZSA9IG1hcHBlZE5hbWU7Ci0JCW1hcHBlZE5hbWUgPSBuZXdNYXBwZWROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19NQVBQRURfTkFNRSwgb2xkTWFwcGVkTmFtZSwgbWFwcGVkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluamVjdGlvblRhcmdldHMoKSB7Ci0JCWlmIChpbmplY3Rpb25UYXJnZXRzID09IG51bGwpIHsKLQkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7Ci0JCX0KLQkJcmV0dXJuIGluamVjdGlvblRhcmdldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbmNlUHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfTkFNRToKLQkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUU6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdE5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlUHJvcGVydGllcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfTkFNRToKLQkJCQlzZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9OQU1FOgotCQkJCXNldFBlcnNpc3RlbmNlVW5pdE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9DT05URVhUX1RZUEU6Ci0JCQkJc2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgoUGVyc2lzdGVuY2VDb250ZXh0VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9QUk9QRVJUSUVTOgotCQkJCWdldFBlcnNpc3RlbmNlUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfTkFNRToKLQkJCQlzZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9OQU1FOgotCQkJCXNldFBlcnNpc3RlbmNlVW5pdE5hbWUoUEVSU0lTVEVOQ0VfVU5JVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRToKLQkJCQl1bnNldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoTUFQUEVEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX05BTUU6Ci0JCQkJcmV0dXJuIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUgIT0gbnVsbCA6ICFQRVJTSVNURU5DRV9DT05URVhUX1JFRl9OQU1FX0VERUZBVUxULmVxdWFscyhwZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9OQU1FOgotCQkJCXJldHVybiBQRVJTSVNURU5DRV9VTklUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBlcnNpc3RlbmNlVW5pdE5hbWUgIT0gbnVsbCA6ICFQRVJTSVNURU5DRV9VTklUX05BTUVfRURFRkFVTFQuZXF1YWxzKHBlcnNpc3RlbmNlVW5pdE5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9DT05URVhUX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwZXJzaXN0ZW5jZVByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcGVyc2lzdGVuY2VQcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIE1BUFBFRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWROYW1lICE9IG51bGwgOiAhTUFQUEVEX05BTUVfRURFRkFVTFQuZXF1YWxzKG1hcHBlZE5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0cyAhPSBudWxsICYmICFpbmplY3Rpb25UYXJnZXRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcnNpc3RlbmNlVW5pdE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGVyc2lzdGVuY2VVbml0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyc2lzdGVuY2VDb250ZXh0VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHBlcnNpc3RlbmNlQ29udGV4dFR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUGVyc2lzdGVuY2VVbml0UmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUGVyc2lzdGVuY2VVbml0UmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODhjOTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BlcnNpc3RlbmNlVW5pdFJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlVW5pdFJlZkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlVW5pdFJlZkltcGwjZ2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VVbml0UmVmSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlVW5pdFJlZkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlVW5pdFJlZkltcGwjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlVW5pdFJlZkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0UmVmSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUGVyc2lzdGVuY2VVbml0UmVmIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1JFRl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwZXJzaXN0ZW5jZVVuaXRSZWZOYW1lID0gUEVSU0lTVEVOQ0VfVU5JVF9SRUZfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUoKSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBlcnNpc3RlbmNlVW5pdE5hbWUgPSBQRVJTSVNURU5DRV9VTklUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWROYW1lID0gTUFQUEVEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXRzKCkgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlBFUlNJU1RFTkNFX1VOSVRfUkVGOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoU3RyaW5nIG5ld1BlcnNpc3RlbmNlVW5pdFJlZk5hbWUpIHsKLQkJU3RyaW5nIG9sZFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUgPSBwZXJzaXN0ZW5jZVVuaXRSZWZOYW1lOwotCQlwZXJzaXN0ZW5jZVVuaXRSZWZOYW1lID0gbmV3UGVyc2lzdGVuY2VVbml0UmVmTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZfTkFNRSwgb2xkUGVyc2lzdGVuY2VVbml0UmVmTmFtZSwgcGVyc2lzdGVuY2VVbml0UmVmTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VVbml0TmFtZShTdHJpbmcgbmV3UGVyc2lzdGVuY2VVbml0TmFtZSkgewotCQlTdHJpbmcgb2xkUGVyc2lzdGVuY2VVbml0TmFtZSA9IHBlcnNpc3RlbmNlVW5pdE5hbWU7Ci0JCXBlcnNpc3RlbmNlVW5pdE5hbWUgPSBuZXdQZXJzaXN0ZW5jZVVuaXROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUUsIG9sZFBlcnNpc3RlbmNlVW5pdE5hbWUsIHBlcnNpc3RlbmNlVW5pdE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZE5hbWUoKSB7Ci0JCXJldHVybiBtYXBwZWROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIG5ld01hcHBlZE5hbWUpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZE5hbWUgPSBtYXBwZWROYW1lOwotCQltYXBwZWROYW1lID0gbmV3TWFwcGVkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fTUFQUEVEX05BTUUsIG9sZE1hcHBlZE5hbWUsIG1hcHBlZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCkgewotCQlpZiAoaW5qZWN0aW9uVGFyZ2V0cyA9PSBudWxsKSB7Ci0JCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluamVjdGlvblRhcmdldC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOwotCQl9Ci0JCXJldHVybiBpbmplY3Rpb25UYXJnZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZfTkFNRToKLQkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUU6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdE5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1hcHBlZE5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGdldEluamVjdGlvblRhcmdldHMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfUkVGX05BTUU6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfTkFNRToKLQkJCQlzZXRQZXJzaXN0ZW5jZVVuaXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX1JFRl9OQU1FOgotCQkJCXNldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoUEVSU0lTVEVOQ0VfVU5JVF9SRUZfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUU6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0TmFtZShQRVJTSVNURU5DRV9VTklUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZShNQVBQRURfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZfTkFNRToKLQkJCQlyZXR1cm4gUEVSU0lTVEVOQ0VfVU5JVF9SRUZfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGVyc2lzdGVuY2VVbml0UmVmTmFtZSAhPSBudWxsIDogIVBFUlNJU1RFTkNFX1VOSVRfUkVGX05BTUVfRURFRkFVTFQuZXF1YWxzKHBlcnNpc3RlbmNlVW5pdFJlZk5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUU6Ci0JCQkJcmV0dXJuIFBFUlNJU1RFTkNFX1VOSVRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGVyc2lzdGVuY2VVbml0TmFtZSAhPSBudWxsIDogIVBFUlNJU1RFTkNFX1VOSVRfTkFNRV9FREVGQVVMVC5lcXVhbHMocGVyc2lzdGVuY2VVbml0TmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJcmV0dXJuIGluamVjdGlvblRhcmdldHMgIT0gbnVsbCAmJiAhaW5qZWN0aW9uVGFyZ2V0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocGVyc2lzdGVuY2VVbml0UmVmTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJzaXN0ZW5jZVVuaXROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHBlcnNpc3RlbmNlVW5pdE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QZXJzaXN0ZW5jZVVuaXRSZWZJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudFJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZWQ3YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudFJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsI2lzRW5hYmxlTXRvbSA8ZW0+RW5hYmxlIE10b208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsI2dldFBvcnRDb21wb25lbnRMaW5rIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0Q29tcG9uZW50UmVmSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUG9ydENvbXBvbmVudFJlZiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VuYWJsZU10b20oKSA8ZW0+RW5hYmxlIE10b208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRW5hYmxlTXRvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVOQUJMRV9NVE9NX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VuYWJsZU10b20oKSA8ZW0+RW5hYmxlIE10b208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRW5hYmxlTXRvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlTXRvbSA9IEVOQUJMRV9NVE9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFbmFibGUgTXRvbSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlTXRvbUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0Q29tcG9uZW50TGluaygpIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0Q29tcG9uZW50TGluaygpIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwb3J0Q29tcG9uZW50TGluayA9IFBPUlRfQ09NUE9ORU5UX0xJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb3J0Q29tcG9uZW50UmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUE9SVF9DT01QT05FTlRfUkVGOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTdHJpbmcgbmV3U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0JCVN0cmluZyBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JCXNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IG5ld1NlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFLCBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UsIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlTXRvbSgpIHsKLQkJcmV0dXJuIGVuYWJsZU10b207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlTXRvbShib29sZWFuIG5ld0VuYWJsZU10b20pIHsKLQkJYm9vbGVhbiBvbGRFbmFibGVNdG9tID0gZW5hYmxlTXRvbTsKLQkJZW5hYmxlTXRvbSA9IG5ld0VuYWJsZU10b207Ci0JCWJvb2xlYW4gb2xkRW5hYmxlTXRvbUVTZXQgPSBlbmFibGVNdG9tRVNldDsKLQkJZW5hYmxlTXRvbUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fRU5BQkxFX01UT00sIG9sZEVuYWJsZU10b20sIGVuYWJsZU10b20sICFvbGRFbmFibGVNdG9tRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RW5hYmxlTXRvbSgpIHsKLQkJYm9vbGVhbiBvbGRFbmFibGVNdG9tID0gZW5hYmxlTXRvbTsKLQkJYm9vbGVhbiBvbGRFbmFibGVNdG9tRVNldCA9IGVuYWJsZU10b21FU2V0OwotCQllbmFibGVNdG9tID0gRU5BQkxFX01UT01fRURFRkFVTFQ7Ci0JCWVuYWJsZU10b21FU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX0VOQUJMRV9NVE9NLCBvbGRFbmFibGVNdG9tLCBFTkFCTEVfTVRPTV9FREVGQVVMVCwgb2xkRW5hYmxlTXRvbUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEVuYWJsZU10b20oKSB7Ci0JCXJldHVybiBlbmFibGVNdG9tRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnRDb21wb25lbnRMaW5rKCkgewotCQlyZXR1cm4gcG9ydENvbXBvbmVudExpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9ydENvbXBvbmVudExpbmsoU3RyaW5nIG5ld1BvcnRDb21wb25lbnRMaW5rKSB7Ci0JCVN0cmluZyBvbGRQb3J0Q29tcG9uZW50TGluayA9IHBvcnRDb21wb25lbnRMaW5rOwotCQlwb3J0Q29tcG9uZW50TGluayA9IG5ld1BvcnRDb21wb25lbnRMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSywgb2xkUG9ydENvbXBvbmVudExpbmssIHBvcnRDb21wb25lbnRMaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19FTkFCTEVfTVRPTToKLQkJCQlyZXR1cm4gaXNFbmFibGVNdG9tKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSzoKLQkJCQlyZXR1cm4gZ2V0UG9ydENvbXBvbmVudExpbmsoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fRU5BQkxFX01UT006Ci0JCQkJc2V0RW5hYmxlTXRvbSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LOgotCQkJCXNldFBvcnRDb21wb25lbnRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX0VOQUJMRV9NVE9NOgotCQkJCXVuc2V0RW5hYmxlTXRvbSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTks6Ci0JCQkJc2V0UG9ydENvbXBvbmVudExpbmsoUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUID09IG51bGwgPyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCA6ICFTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX0VOQUJMRV9NVE9NOgotCQkJCXJldHVybiBpc1NldEVuYWJsZU10b20oKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTks6Ci0JCQkJcmV0dXJuIFBPUlRfQ09NUE9ORU5UX0xJTktfRURFRkFVTFQgPT0gbnVsbCA/IHBvcnRDb21wb25lbnRMaW5rICE9IG51bGwgOiAhUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVC5lcXVhbHMocG9ydENvbXBvbmVudExpbmspOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbmFibGVNdG9tOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW5hYmxlTXRvbUVTZXQpIHJlc3VsdC5hcHBlbmQoZW5hYmxlTXRvbSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgcG9ydENvbXBvbmVudExpbms6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocG9ydENvbXBvbmVudExpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9ydENvbXBvbmVudFJlZkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9Qcm9wZXJ0eVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9Qcm9wZXJ0eVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MjM1NDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUHJvcGVydHlUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHkgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlUeXBlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eVR5cGVJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQcm9wZXJ0eVR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QUk9QRVJUWV9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvcGVydHlUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlRW52UmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VFbnZSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTAwZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VFbnZSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VFbnZSZWZJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwjZ2V0UmVzb3VyY2VFbnZSZWZOYW1lIDxlbT5SZXNvdXJjZSBFbnYgUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlRW52UmVmSW1wbCNnZXRSZXNvdXJjZUVudlJlZlR5cGUgPGVtPlJlc291cmNlIEVudiBSZWYgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VFbnZSZWZJbXBsI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlRW52UmVmSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUVudlJlZkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlRW52UmVmIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCkgPGVtPlJlc291cmNlIEVudiBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9FTlZfUkVGX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCkgPGVtPlJlc291cmNlIEVudiBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlRW52UmVmTmFtZSA9IFJFU09VUkNFX0VOVl9SRUZfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUVudlJlZlR5cGUoKSA8ZW0+UmVzb3VyY2UgRW52IFJlZiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0VOVl9SRUZfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUVudlJlZlR5cGUoKSA8ZW0+UmVzb3VyY2UgRW52IFJlZiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VFbnZSZWZUeXBlID0gUkVTT1VSQ0VfRU5WX1JFRl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkTmFtZSA9IE1BUFBFRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5qZWN0aW9uVGFyZ2V0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUVudlJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX0VOVl9SRUY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUVudlJlZk5hbWUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUVudlJlZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VFbnZSZWZOYW1lKFN0cmluZyBuZXdSZXNvdXJjZUVudlJlZk5hbWUpIHsKLQkJU3RyaW5nIG9sZFJlc291cmNlRW52UmVmTmFtZSA9IHJlc291cmNlRW52UmVmTmFtZTsKLQkJcmVzb3VyY2VFbnZSZWZOYW1lID0gbmV3UmVzb3VyY2VFbnZSZWZOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX1JFU09VUkNFX0VOVl9SRUZfTkFNRSwgb2xkUmVzb3VyY2VFbnZSZWZOYW1lLCByZXNvdXJjZUVudlJlZk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlRW52UmVmVHlwZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlRW52UmVmVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUVudlJlZlR5cGUoU3RyaW5nIG5ld1Jlc291cmNlRW52UmVmVHlwZSkgewotCQlTdHJpbmcgb2xkUmVzb3VyY2VFbnZSZWZUeXBlID0gcmVzb3VyY2VFbnZSZWZUeXBlOwotCQlyZXNvdXJjZUVudlJlZlR5cGUgPSBuZXdSZXNvdXJjZUVudlJlZlR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fUkVTT1VSQ0VfRU5WX1JFRl9UWVBFLCBvbGRSZXNvdXJjZUVudlJlZlR5cGUsIHJlc291cmNlRW52UmVmVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIG1hcHBlZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgbmV3TWFwcGVkTmFtZSkgewotCQlTdHJpbmcgb2xkTWFwcGVkTmFtZSA9IG1hcHBlZE5hbWU7Ci0JCW1hcHBlZE5hbWUgPSBuZXdNYXBwZWROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX01BUFBFRF9OQU1FLCBvbGRNYXBwZWROYW1lLCBtYXBwZWROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJaWYgKGluamVjdGlvblRhcmdldHMgPT0gbnVsbCkgewotCQkJaW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbmplY3Rpb25UYXJnZXQuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOwotCQl9Ci0JCXJldHVybiBpbmplY3Rpb25UYXJnZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX1JFU09VUkNFX0VOVl9SRUZfTkFNRToKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fUkVTT1VSQ0VfRU5WX1JFRl9UWVBFOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZlR5cGUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiBnZXRJbmplY3Rpb25UYXJnZXRzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX05BTUU6Ci0JCQkJc2V0UmVzb3VyY2VFbnZSZWZOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX1RZUEU6Ci0JCQkJc2V0UmVzb3VyY2VFbnZSZWZUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fUkVTT1VSQ0VfRU5WX1JFRl9OQU1FOgotCQkJCXNldFJlc291cmNlRW52UmVmTmFtZShSRVNPVVJDRV9FTlZfUkVGX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX1RZUEU6Ci0JCQkJc2V0UmVzb3VyY2VFbnZSZWZUeXBlKFJFU09VUkNFX0VOVl9SRUZfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoTUFQUEVEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fUkVTT1VSQ0VfRU5WX1JFRl9OQU1FOgotCQkJCXJldHVybiBSRVNPVVJDRV9FTlZfUkVGX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlRW52UmVmTmFtZSAhPSBudWxsIDogIVJFU09VUkNFX0VOVl9SRUZfTkFNRV9FREVGQVVMVC5lcXVhbHMocmVzb3VyY2VFbnZSZWZOYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX1RZUEU6Ci0JCQkJcmV0dXJuIFJFU09VUkNFX0VOVl9SRUZfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VFbnZSZWZUeXBlICE9IG51bGwgOiAhUkVTT1VSQ0VfRU5WX1JFRl9UWVBFX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZUVudlJlZlR5cGUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0cyAhPSBudWxsICYmICFpbmplY3Rpb25UYXJnZXRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlc291cmNlRW52UmVmTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZXNvdXJjZUVudlJlZk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlRW52UmVmVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZXNvdXJjZUVudlJlZlR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SZXNvdXJjZUVudlJlZkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRkYTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzQXV0aFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsI2dldFJlc1JlZk5hbWUgPGVtPlJlcyBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsI2dldFJlc1R5cGUgPGVtPlJlcyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGwjZ2V0UmVzQXV0aCA8ZW0+UmVzIEF1dGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbCNnZXRSZXNTaGFyaW5nU2NvcGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlUmVmSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VSZWYgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNSZWZOYW1lKCkgPGVtPlJlcyBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX1JFRl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc1JlZk5hbWUoKSA8ZW0+UmVzIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc1JlZk5hbWUgPSBSRVNfUkVGX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzVHlwZSgpIDxlbT5SZXMgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzVHlwZSgpIDxlbT5SZXMgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXNUeXBlID0gUkVTX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzQXV0aCgpIDxlbT5SZXMgQXV0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzQXV0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXNBdXRoVHlwZSBSRVNfQVVUSF9FREVGQVVMVCA9IFJlc0F1dGhUeXBlLkFQUExJQ0FUSU9OX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNBdXRoKCkgPGVtPlJlcyBBdXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNBdXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzQXV0aFR5cGUgcmVzQXV0aCA9IFJFU19BVVRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXMgQXV0aCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzQXV0aEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNTaGFyaW5nU2NvcGUoKSA8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlIFJFU19TSEFSSU5HX1NDT1BFX0VERUZBVUxUID0gUmVzU2hhcmluZ1Njb3BlVHlwZS5TSEFSRUFCTEVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc1NoYXJpbmdTY29wZSgpIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzU2hhcmluZ1Njb3BlVHlwZSByZXNTaGFyaW5nU2NvcGUgPSBSRVNfU0hBUklOR19TQ09QRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzIFNoYXJpbmcgU2NvcGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc1NoYXJpbmdTY29wZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZE5hbWUgPSBNQVBQRURfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluamVjdGlvblRhcmdldHMoKSA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluamVjdGlvblRhcmdldHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5SRVNPVVJDRV9SRUY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc1JlZk5hbWUoKSB7Ci0JCXJldHVybiByZXNSZWZOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc1JlZk5hbWUoU3RyaW5nIG5ld1Jlc1JlZk5hbWUpIHsKLQkJU3RyaW5nIG9sZFJlc1JlZk5hbWUgPSByZXNSZWZOYW1lOwotCQlyZXNSZWZOYW1lID0gbmV3UmVzUmVmTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19SRUZfTkFNRSwgb2xkUmVzUmVmTmFtZSwgcmVzUmVmTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzVHlwZSgpIHsKLQkJcmV0dXJuIHJlc1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzVHlwZShTdHJpbmcgbmV3UmVzVHlwZSkgewotCQlTdHJpbmcgb2xkUmVzVHlwZSA9IHJlc1R5cGU7Ci0JCXJlc1R5cGUgPSBuZXdSZXNUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1RZUEUsIG9sZFJlc1R5cGUsIHJlc1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzQXV0aFR5cGUgZ2V0UmVzQXV0aCgpIHsKLQkJcmV0dXJuIHJlc0F1dGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzQXV0aChSZXNBdXRoVHlwZSBuZXdSZXNBdXRoKSB7Ci0JCVJlc0F1dGhUeXBlIG9sZFJlc0F1dGggPSByZXNBdXRoOwotCQlyZXNBdXRoID0gbmV3UmVzQXV0aCA9PSBudWxsID8gUkVTX0FVVEhfRURFRkFVTFQgOiBuZXdSZXNBdXRoOwotCQlib29sZWFuIG9sZFJlc0F1dGhFU2V0ID0gcmVzQXV0aEVTZXQ7Ci0JCXJlc0F1dGhFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19BVVRILCBvbGRSZXNBdXRoLCByZXNBdXRoLCAhb2xkUmVzQXV0aEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc0F1dGgoKSB7Ci0JCVJlc0F1dGhUeXBlIG9sZFJlc0F1dGggPSByZXNBdXRoOwotCQlib29sZWFuIG9sZFJlc0F1dGhFU2V0ID0gcmVzQXV0aEVTZXQ7Ci0JCXJlc0F1dGggPSBSRVNfQVVUSF9FREVGQVVMVDsKLQkJcmVzQXV0aEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX0FVVEgsIG9sZFJlc0F1dGgsIFJFU19BVVRIX0VERUZBVUxULCBvbGRSZXNBdXRoRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzQXV0aCgpIHsKLQkJcmV0dXJuIHJlc0F1dGhFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGdldFJlc1NoYXJpbmdTY29wZSgpIHsKLQkJcmV0dXJuIHJlc1NoYXJpbmdTY29wZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNTaGFyaW5nU2NvcGUoUmVzU2hhcmluZ1Njb3BlVHlwZSBuZXdSZXNTaGFyaW5nU2NvcGUpIHsKLQkJUmVzU2hhcmluZ1Njb3BlVHlwZSBvbGRSZXNTaGFyaW5nU2NvcGUgPSByZXNTaGFyaW5nU2NvcGU7Ci0JCXJlc1NoYXJpbmdTY29wZSA9IG5ld1Jlc1NoYXJpbmdTY29wZSA9PSBudWxsID8gUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQgOiBuZXdSZXNTaGFyaW5nU2NvcGU7Ci0JCWJvb2xlYW4gb2xkUmVzU2hhcmluZ1Njb3BlRVNldCA9IHJlc1NoYXJpbmdTY29wZUVTZXQ7Ci0JCXJlc1NoYXJpbmdTY29wZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEUsIG9sZFJlc1NoYXJpbmdTY29wZSwgcmVzU2hhcmluZ1Njb3BlLCAhb2xkUmVzU2hhcmluZ1Njb3BlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVzU2hhcmluZ1Njb3BlKCkgewotCQlSZXNTaGFyaW5nU2NvcGVUeXBlIG9sZFJlc1NoYXJpbmdTY29wZSA9IHJlc1NoYXJpbmdTY29wZTsKLQkJYm9vbGVhbiBvbGRSZXNTaGFyaW5nU2NvcGVFU2V0ID0gcmVzU2hhcmluZ1Njb3BlRVNldDsKLQkJcmVzU2hhcmluZ1Njb3BlID0gUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQ7Ci0JCXJlc1NoYXJpbmdTY29wZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEUsIG9sZFJlc1NoYXJpbmdTY29wZSwgUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQsIG9sZFJlc1NoYXJpbmdTY29wZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlc1NoYXJpbmdTY29wZSgpIHsKLQkJcmV0dXJuIHJlc1NoYXJpbmdTY29wZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWROYW1lKCkgewotCQlyZXR1cm4gbWFwcGVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyBuZXdNYXBwZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRNYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLQkJbWFwcGVkTmFtZSA9IG5ld01hcHBlZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19NQVBQRURfTkFNRSwgb2xkTWFwcGVkTmFtZSwgbWFwcGVkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluamVjdGlvblRhcmdldHMoKSB7Ci0JCWlmIChpbmplY3Rpb25UYXJnZXRzID09IG51bGwpIHsKLQkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOwotCQl9Ci0JCXJldHVybiBpbmplY3Rpb25UYXJnZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfUkVGX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJlc1JlZk5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19UWVBFOgotCQkJCXJldHVybiBnZXRSZXNUeXBlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfQVVUSDoKLQkJCQlyZXR1cm4gZ2V0UmVzQXV0aCgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEU6Ci0JCQkJcmV0dXJuIGdldFJlc1NoYXJpbmdTY29wZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1hcHBlZE5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiBnZXRJbmplY3Rpb25UYXJnZXRzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfUkVGX05BTUU6Ci0JCQkJc2V0UmVzUmVmTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfVFlQRToKLQkJCQlzZXRSZXNUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19BVVRIOgotCQkJCXNldFJlc0F1dGgoKFJlc0F1dGhUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRToKLQkJCQlzZXRSZXNTaGFyaW5nU2NvcGUoKFJlc1NoYXJpbmdTY29wZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19SRUZfTkFNRToKLQkJCQlzZXRSZXNSZWZOYW1lKFJFU19SRUZfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1RZUEU6Ci0JCQkJc2V0UmVzVHlwZShSRVNfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX0FVVEg6Ci0JCQkJdW5zZXRSZXNBdXRoKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEU6Ci0JCQkJdW5zZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19NQVBQRURfTkFNRToKLQkJCQlzZXRNYXBwZWROYW1lKE1BUFBFRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1JFRl9OQU1FOgotCQkJCXJldHVybiBSRVNfUkVGX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc1JlZk5hbWUgIT0gbnVsbCA6ICFSRVNfUkVGX05BTUVfRURFRkFVTFQuZXF1YWxzKHJlc1JlZk5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1RZUEU6Ci0JCQkJcmV0dXJuIFJFU19UWVBFX0VERUZBVUxUID09IG51bGwgPyByZXNUeXBlICE9IG51bGwgOiAhUkVTX1RZUEVfRURFRkFVTFQuZXF1YWxzKHJlc1R5cGUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX0FVVEg6Ci0JCQkJcmV0dXJuIGlzU2V0UmVzQXV0aCgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEU6Ci0JCQkJcmV0dXJuIGlzU2V0UmVzU2hhcmluZ1Njb3BlKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gTUFQUEVEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZE5hbWUgIT0gbnVsbCA6ICFNQVBQRURfTkFNRV9FREVGQVVMVC5lcXVhbHMobWFwcGVkTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0cyAhPSBudWxsICYmICFpbmplY3Rpb25UYXJnZXRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVzUmVmTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZXNSZWZOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXNUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlc1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc0F1dGg6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXNBdXRoRVNldCkgcmVzdWx0LmFwcGVuZChyZXNBdXRoKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXNTaGFyaW5nU2NvcGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXNTaGFyaW5nU2NvcGVFU2V0KSByZXN1bHQuYXBwZW5kKHJlc1NoYXJpbmdTY29wZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtYXBwZWROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Jlc291cmNlUmVmSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1J1bkFzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUnVuQXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNWI3MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUnVuQXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJ1biBBczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUnVuQXNJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SdW5Bc0ltcGwjZ2V0Um9sZU5hbWUgPGVtPlJvbGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUnVuQXNJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJ1bkFzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUnVuQXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZSgpIDxlbT5Sb2xlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByb2xlTmFtZSA9IFJPTEVfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJ1bkFzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUlVOX0FTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZSgpIHsKLQkJcmV0dXJuIHJvbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGVOYW1lKFN0cmluZyBuZXdSb2xlTmFtZSkgewotCQlTdHJpbmcgb2xkUm9sZU5hbWUgPSByb2xlTmFtZTsKLQkJcm9sZU5hbWUgPSBuZXdSb2xlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5SVU5fQVNfX1JPTEVfTkFNRSwgb2xkUm9sZU5hbWUsIHJvbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5SVU5fQVNfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BU19fUk9MRV9OQU1FOgotCQkJCXJldHVybiBnZXRSb2xlTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BU19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVNfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BU19fUk9MRV9OQU1FOgotCQkJCXNldFJvbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVNfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoUk9MRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BU19fUk9MRV9OQU1FOgotCQkJCXJldHVybiBST0xFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGVOYW1lICE9IG51bGwgOiAhUk9MRV9OQU1FX0VERUZBVUxULmVxdWFscyhyb2xlTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJvbGVOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJvbGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1J1bkFzSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzNDMzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWN1cml0eSBSb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVJbXBsI2dldFJvbGVOYW1lIDxlbT5Sb2xlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgU2VjdXJpdHlSb2xlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVOYW1lKCkgPGVtPlJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcm9sZU5hbWUgPSBST0xFX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN1cml0eVJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRUNVUklUWV9ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWUoKSB7Ci0JCXJldHVybiByb2xlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgbmV3Um9sZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFJvbGVOYW1lID0gcm9sZU5hbWU7Ci0JCXJvbGVOYW1lID0gbmV3Um9sZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FLCBvbGRSb2xlTmFtZSwgcm9sZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBnZXRSb2xlTmFtZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FOgotCQkJCXNldFJvbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoUk9MRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBST0xFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGVOYW1lICE9IG51bGwgOiAhUk9MRV9OQU1FX0VERUZBVUxULmVxdWFscyhyb2xlTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyb2xlTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyb2xlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZWN1cml0eVJvbGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWRkYzkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVSZWZJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVSZWZJbXBsI2dldFJvbGVOYW1lIDxlbT5Sb2xlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZVJlZkltcGwjZ2V0Um9sZUxpbmsgPGVtPlJvbGUgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VjdXJpdHlSb2xlUmVmSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVJvbGVSZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZWN1cml0eVJvbGVSZWYgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZSgpIDxlbT5Sb2xlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByb2xlTmFtZSA9IFJPTEVfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTGluaygpIDxlbT5Sb2xlIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0xJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZUxpbmsoKSA8ZW0+Um9sZSBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByb2xlTGluayA9IFJPTEVfTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5Um9sZVJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFQ1VSSVRZX1JPTEVfUkVGOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJvbGVOYW1lKCkgewotCQlyZXR1cm4gcm9sZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sZU5hbWUoU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JCVN0cmluZyBvbGRSb2xlTmFtZSA9IHJvbGVOYW1lOwotCQlyb2xlTmFtZSA9IG5ld1JvbGVOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ST0xFX05BTUUsIG9sZFJvbGVOYW1lLCByb2xlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9sZUxpbmsoKSB7Ci0JCXJldHVybiByb2xlTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlTGluayhTdHJpbmcgbmV3Um9sZUxpbmspIHsKLQkJU3RyaW5nIG9sZFJvbGVMaW5rID0gcm9sZUxpbms7Ci0JCXJvbGVMaW5rID0gbmV3Um9sZUxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTElOSywgb2xkUm9sZUxpbmssIHJvbGVMaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJvbGVOYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTElOSzoKLQkJCQlyZXR1cm4gZ2V0Um9sZUxpbmsoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTElOSzoKLQkJCQlzZXRSb2xlTGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fUk9MRV9OQU1FOgotCQkJCXNldFJvbGVOYW1lKFJPTEVfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ST0xFX0xJTks6Ci0JCQkJc2V0Um9sZUxpbmsoUk9MRV9MSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBST0xFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGVOYW1lICE9IG51bGwgOiAhUk9MRV9OQU1FX0VERUZBVUxULmVxdWFscyhyb2xlTmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX1JPTEVfTElOSzoKLQkJCQlyZXR1cm4gUk9MRV9MSU5LX0VERUZBVUxUID09IG51bGwgPyByb2xlTGluayAhPSBudWxsIDogIVJPTEVfTElOS19FREVGQVVMVC5lcXVhbHMocm9sZUxpbmspOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJvbGVOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJvbGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb2xlTGluazogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyb2xlTGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZWN1cml0eVJvbGVSZWZJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJDaGFpbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZWQwMzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJDaGFpbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbCNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4gPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbCNnZXRQb3J0TmFtZVBhdHRlcm4gPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbCNnZXRQcm90b2NvbEJpbmRpbmdzIDxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJDaGFpbkltcGwjZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgU2VydmljZVJlZkhhbmRsZXJDaGFpbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VOYW1lUGF0dGVybigpIDxlbT5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUVfUEFUVEVSTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKSA8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VOYW1lUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlTmFtZVBhdHRlcm4gPSBTRVJWSUNFX05BTUVfUEFUVEVSTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZVBhdHRlcm4oKSA8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnROYW1lUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9OQU1FX1BBVFRFUk5fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWVQYXR0ZXJuKCkgPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0TmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWVQYXR0ZXJuID0gUE9SVF9OQU1FX1BBVFRFUk5fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvdG9jb2xCaW5kaW5ncygpIDxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvdG9jb2xCaW5kaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMaXN0IFBST1RPQ09MX0JJTkRJTkdTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3RvY29sQmluZGluZ3MoKSA8ZW0+UHJvdG9jb2wgQmluZGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3RvY29sQmluZGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IHByb3RvY29sQmluZGluZ3MgPSBQUk9UT0NPTF9CSU5ESU5HU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJzKCkgPGVtPkhhbmRsZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaGFuZGxlcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZVJlZkhhbmRsZXJDaGFpbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiBzZXJ2aWNlTmFtZVBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWVQYXR0ZXJuKFN0cmluZyBuZXdTZXJ2aWNlTmFtZVBhdHRlcm4pIHsKLQkJU3RyaW5nIG9sZFNlcnZpY2VOYW1lUGF0dGVybiA9IHNlcnZpY2VOYW1lUGF0dGVybjsKLQkJc2VydmljZU5hbWVQYXR0ZXJuID0gbmV3U2VydmljZU5hbWVQYXR0ZXJuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOLCBvbGRTZXJ2aWNlTmFtZVBhdHRlcm4sIHNlcnZpY2VOYW1lUGF0dGVybikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWVQYXR0ZXJuKCkgewotCQlyZXR1cm4gcG9ydE5hbWVQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvcnROYW1lUGF0dGVybihTdHJpbmcgbmV3UG9ydE5hbWVQYXR0ZXJuKSB7Ci0JCVN0cmluZyBvbGRQb3J0TmFtZVBhdHRlcm4gPSBwb3J0TmFtZVBhdHRlcm47Ci0JCXBvcnROYW1lUGF0dGVybiA9IG5ld1BvcnROYW1lUGF0dGVybjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTiwgb2xkUG9ydE5hbWVQYXR0ZXJuLCBwb3J0TmFtZVBhdHRlcm4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm90b2NvbEJpbmRpbmdzKCkgewotCQlyZXR1cm4gcHJvdG9jb2xCaW5kaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm90b2NvbEJpbmRpbmdzKExpc3QgbmV3UHJvdG9jb2xCaW5kaW5ncykgewotCQlMaXN0IG9sZFByb3RvY29sQmluZGluZ3MgPSBwcm90b2NvbEJpbmRpbmdzOwotCQlwcm90b2NvbEJpbmRpbmdzID0gbmV3UHJvdG9jb2xCaW5kaW5nczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QUk9UT0NPTF9CSU5ESU5HUywgb2xkUHJvdG9jb2xCaW5kaW5ncywgcHJvdG9jb2xCaW5kaW5ncykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEhhbmRsZXJzKCkgewotCQlpZiAoaGFuZGxlcnMgPT0gbnVsbCkgewotCQkJaGFuZGxlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSEFORExFUlMpOwotCQl9Ci0JCXJldHVybiBoYW5kbGVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRIYW5kbGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTjoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fUE9SVF9OQU1FX1BBVFRFUk46Ci0JCQkJcmV0dXJuIGdldFBvcnROYW1lUGF0dGVybigpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTOgotCQkJCXJldHVybiBnZXRQcm90b2NvbEJpbmRpbmdzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTjoKLQkJCQlzZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1BPUlRfTkFNRV9QQVRURVJOOgotCQkJCXNldFBvcnROYW1lUGF0dGVybigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fUFJPVE9DT0xfQklORElOR1M6Ci0JCQkJc2V0UHJvdG9jb2xCaW5kaW5ncygoTGlzdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTOgotCQkJCWdldEhhbmRsZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRIYW5kbGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk46Ci0JCQkJc2V0U2VydmljZU5hbWVQYXR0ZXJuKFNFUlZJQ0VfTkFNRV9QQVRURVJOX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fUE9SVF9OQU1FX1BBVFRFUk46Ci0JCQkJc2V0UG9ydE5hbWVQYXR0ZXJuKFBPUlRfTkFNRV9QQVRURVJOX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fUFJPVE9DT0xfQklORElOR1M6Ci0JCQkJc2V0UHJvdG9jb2xCaW5kaW5ncyhQUk9UT0NPTF9CSU5ESU5HU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTOgotCQkJCWdldEhhbmRsZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOOgotCQkJCXJldHVybiBTRVJWSUNFX05BTUVfUEFUVEVSTl9FREVGQVVMVCA9PSBudWxsID8gc2VydmljZU5hbWVQYXR0ZXJuICE9IG51bGwgOiAhU0VSVklDRV9OQU1FX1BBVFRFUk5fRURFRkFVTFQuZXF1YWxzKHNlcnZpY2VOYW1lUGF0dGVybik7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fUE9SVF9OQU1FX1BBVFRFUk46Ci0JCQkJcmV0dXJuIFBPUlRfTkFNRV9QQVRURVJOX0VERUZBVUxUID09IG51bGwgPyBwb3J0TmFtZVBhdHRlcm4gIT0gbnVsbCA6ICFQT1JUX05BTUVfUEFUVEVSTl9FREVGQVVMVC5lcXVhbHMocG9ydE5hbWVQYXR0ZXJuKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QUk9UT0NPTF9CSU5ESU5HUzoKLQkJCQlyZXR1cm4gUFJPVE9DT0xfQklORElOR1NfRURFRkFVTFQgPT0gbnVsbCA/IHByb3RvY29sQmluZGluZ3MgIT0gbnVsbCA6ICFQUk9UT0NPTF9CSU5ESU5HU19FREVGQVVMVC5lcXVhbHMocHJvdG9jb2xCaW5kaW5ncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuIGhhbmRsZXJzICE9IG51bGwgJiYgIWhhbmRsZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZpY2VOYW1lUGF0dGVybjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlTmFtZVBhdHRlcm4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lUGF0dGVybjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwb3J0TmFtZVBhdHRlcm4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb3RvY29sQmluZGluZ3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJvdG9jb2xCaW5kaW5ncyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOTJhYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zSW1wbCNnZXRIYW5kbGVyQ2hhaW5zIDxlbT5IYW5kbGVyIENoYWluczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgU2VydmljZVJlZkhhbmRsZXJDaGFpbnMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJDaGFpbnMoKSA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlckNoYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGhhbmRsZXJDaGFpbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRIYW5kbGVyQ2hhaW5zKCkgewotCQlpZiAoaGFuZGxlckNoYWlucyA9PSBudWxsKSB7Ci0JCQloYW5kbGVyQ2hhaW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0hBTkRMRVJfQ0hBSU5TKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlckNoYWluczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX19IQU5ETEVSX0NIQUlOUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEhhbmRsZXJDaGFpbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0hBTkRMRVJfQ0hBSU5TOgotCQkJCXJldHVybiBnZXRIYW5kbGVyQ2hhaW5zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0hBTkRMRVJfQ0hBSU5TOgotCQkJCWdldEhhbmRsZXJDaGFpbnMoKS5jbGVhcigpOwotCQkJCWdldEhhbmRsZXJDaGFpbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSEFORExFUl9DSEFJTlM6Ci0JCQkJZ2V0SGFuZGxlckNoYWlucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0hBTkRMRVJfQ0hBSU5TOgotCQkJCXJldHVybiBoYW5kbGVyQ2hhaW5zICE9IG51bGwgJiYgIWhhbmRsZXJDaGFpbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSGFuZGxlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzZGFmOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIFJlZiBIYW5kbGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbCNnZXRIYW5kbGVyTmFtZSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckltcGwjZ2V0SGFuZGxlckNsYXNzIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckltcGwjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbCNnZXRTb2FwSGVhZGVycyA8ZW0+U29hcCBIZWFkZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckltcGwjZ2V0U29hcFJvbGVzIDxlbT5Tb2FwIFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckltcGwjZ2V0UG9ydE5hbWVzIDxlbT5Qb3J0IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZkhhbmRsZXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2aWNlUmVmSGFuZGxlciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaWNvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJOYW1lKCkgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyTmFtZSgpIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGhhbmRsZXJOYW1lID0gSEFORExFUl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJDbGFzcygpIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlckNsYXNzKCkgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoYW5kbGVyQ2xhc3MgPSBIQU5ETEVSX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdFBhcmFtcygpIDxlbT5Jbml0IFBhcmFtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0UGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5pdFBhcmFtcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwSGVhZGVycygpIDxlbT5Tb2FwIEhlYWRlcnM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U29hcEhlYWRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzb2FwSGVhZGVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwUm9sZXMoKSA8ZW0+U29hcCBSb2xlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb2FwUm9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzb2FwUm9sZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWVzKCkgPGVtPlBvcnQgTmFtZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydE5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9ydE5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZpY2VSZWZIYW5kbGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfSEFORExFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RJU1BMQVlfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7Ci0JCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lDT05TKTsKLQkJfQotCQlyZXR1cm4gaWNvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIYW5kbGVyTmFtZSgpIHsKLQkJcmV0dXJuIGhhbmRsZXJOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhbmRsZXJOYW1lKFN0cmluZyBuZXdIYW5kbGVyTmFtZSkgewotCQlTdHJpbmcgb2xkSGFuZGxlck5hbWUgPSBoYW5kbGVyTmFtZTsKLQkJaGFuZGxlck5hbWUgPSBuZXdIYW5kbGVyTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19IQU5ETEVSX05BTUUsIG9sZEhhbmRsZXJOYW1lLCBoYW5kbGVyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlckNsYXNzKCkgewotCQlyZXR1cm4gaGFuZGxlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhbmRsZXJDbGFzcyhTdHJpbmcgbmV3SGFuZGxlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGRIYW5kbGVyQ2xhc3MgPSBoYW5kbGVyQ2xhc3M7Ci0JCWhhbmRsZXJDbGFzcyA9IG5ld0hhbmRsZXJDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19IQU5ETEVSX0NMQVNTLCBvbGRIYW5kbGVyQ2xhc3MsIGhhbmRsZXJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluaXRQYXJhbXMoKSB7Ci0JCWlmIChpbml0UGFyYW1zID09IG51bGwpIHsKLQkJCWluaXRQYXJhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGFyYW1WYWx1ZS5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JTklUX1BBUkFNUyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRQYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U29hcEhlYWRlcnMoKSB7Ci0JCWlmIChzb2FwSGVhZGVycyA9PSBudWxsKSB7Ci0JCQlzb2FwSGVhZGVycyA9IG5ldyBFRGF0YVR5cGVFTGlzdChPYmplY3QuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9IRUFERVJTKTsKLQkJfQotCQlyZXR1cm4gc29hcEhlYWRlcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U29hcFJvbGVzKCkgewotCQlpZiAoc29hcFJvbGVzID09IG51bGwpIHsKLQkJCXNvYXBSb2xlcyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIHNvYXBSb2xlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3J0TmFtZXMoKSB7Ci0JCWlmIChwb3J0TmFtZXMgPT0gbnVsbCkgewotCQkJcG9ydE5hbWVzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19QT1JUX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gcG9ydE5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlyZXR1cm4gZ2V0SGFuZGxlck5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19IQU5ETEVSX0NMQVNTOgotCQkJCXJldHVybiBnZXRIYW5kbGVyQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdFBhcmFtcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX1NPQVBfSEVBREVSUzoKLQkJCQlyZXR1cm4gZ2V0U29hcEhlYWRlcnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX1JPTEVTOgotCQkJCXJldHVybiBnZXRTb2FwUm9sZXMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19QT1JUX05BTUVTOgotCQkJCXJldHVybiBnZXRQb3J0TmFtZXMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19IQU5ETEVSX05BTUU6Ci0JCQkJc2V0SGFuZGxlck5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJc2V0SGFuZGxlckNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCWdldFNvYXBIZWFkZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRTb2FwSGVhZGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJZ2V0U29hcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTb2FwUm9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19QT1JUX05BTUVTOgotCQkJCWdldFBvcnROYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9ydE5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlzZXRIYW5kbGVyTmFtZShIQU5ETEVSX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19IQU5ETEVSX0NMQVNTOgotCQkJCXNldEhhbmRsZXJDbGFzcyhIQU5ETEVSX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX1NPQVBfSEVBREVSUzoKLQkJCQlnZXRTb2FwSGVhZGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJZ2V0U29hcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fUE9SVF9OQU1FUzoKLQkJCQlnZXRQb3J0TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlyZXR1cm4gSEFORExFUl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBoYW5kbGVyTmFtZSAhPSBudWxsIDogIUhBTkRMRVJfTkFNRV9FREVGQVVMVC5lcXVhbHMoaGFuZGxlck5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIEhBTkRMRVJfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGhhbmRsZXJDbGFzcyAhPSBudWxsIDogIUhBTkRMRVJfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGhhbmRsZXJDbGFzcyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGluaXRQYXJhbXMgIT0gbnVsbCAmJiAhaW5pdFBhcmFtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCXJldHVybiBzb2FwSGVhZGVycyAhPSBudWxsICYmICFzb2FwSGVhZGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlyZXR1cm4gc29hcFJvbGVzICE9IG51bGwgJiYgIXNvYXBSb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fUE9SVF9OQU1FUzoKLQkJCQlyZXR1cm4gcG9ydE5hbWVzICE9IG51bGwgJiYgIXBvcnROYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChoYW5kbGVyTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChoYW5kbGVyTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGFuZGxlckNsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGhhbmRsZXJDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcEhlYWRlcnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc29hcEhlYWRlcnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBSb2xlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzb2FwUm9sZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwb3J0TmFtZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VydmljZVJlZkhhbmRsZXJJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNzk4MTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldFNlcnZpY2VSZWZOYW1lIDxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRTZXJ2aWNlSW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0U2VydmljZVJlZlR5cGUgPGVtPlNlcnZpY2UgUmVmIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldFdzZGxGaWxlIDxlbT5Xc2RsIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldEpheHJwY01hcHBpbmdGaWxlIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRTZXJ2aWNlUW5hbWUgPGVtPlNlcnZpY2UgUW5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldFBvcnRDb21wb25lbnRSZWZzIDxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRIYW5kbGVycyA8ZW0+SGFuZGxlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldEhhbmRsZXJDaGFpbnMgPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VSZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2aWNlUmVmIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZk5hbWUoKSA8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUkVGX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZk5hbWUoKSA8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmljZVJlZk5hbWUgPSBTRVJWSUNFX1JFRl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmljZUludGVyZmFjZSA9IFNFUlZJQ0VfSU5URVJGQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZUeXBlKCkgPGVtPlNlcnZpY2UgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1JFRl9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZUeXBlKCkgPGVtPlNlcnZpY2UgUmVmIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VSZWZUeXBlID0gU0VSVklDRV9SRUZfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRmlsZSgpIDxlbT5Xc2RsIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbEZpbGUoKSA8ZW0+V3NkbCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB3c2RsRmlsZSA9IFdTRExfRklMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBqYXhycGNNYXBwaW5nRmlsZSA9IEpBWFJQQ19NQVBQSU5HX0ZJTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVFuYW1lKCkgPGVtPlNlcnZpY2UgUW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VRbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU0VSVklDRV9RTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUW5hbWUoKSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHNlcnZpY2VRbmFtZSA9IFNFUlZJQ0VfUU5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0Q29tcG9uZW50UmVmcygpIDxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9ydENvbXBvbmVudFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlcnMoKSA8ZW0+SGFuZGxlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBoYW5kbGVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyQ2hhaW5zKCkgPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2hhaW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZVJlZkhhbmRsZXJDaGFpbnMgaGFuZGxlckNoYWlucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWROYW1lID0gTUFQUEVEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmplY3Rpb25UYXJnZXRzKCkgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZpY2VSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKLQkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lDT05TKTsKLQkJfQotCQlyZXR1cm4gaWNvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlUmVmTmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWZOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VSZWZOYW1lKFN0cmluZyBuZXdTZXJ2aWNlUmVmTmFtZSkgewotCQlTdHJpbmcgb2xkU2VydmljZVJlZk5hbWUgPSBzZXJ2aWNlUmVmTmFtZTsKLQkJc2VydmljZVJlZk5hbWUgPSBuZXdTZXJ2aWNlUmVmTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRSwgb2xkU2VydmljZVJlZk5hbWUsIHNlcnZpY2VSZWZOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gc2VydmljZUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlKFN0cmluZyBuZXdTZXJ2aWNlSW50ZXJmYWNlKSB7Ci0JCVN0cmluZyBvbGRTZXJ2aWNlSW50ZXJmYWNlID0gc2VydmljZUludGVyZmFjZTsKLQkJc2VydmljZUludGVyZmFjZSA9IG5ld1NlcnZpY2VJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfSU5URVJGQUNFLCBvbGRTZXJ2aWNlSW50ZXJmYWNlLCBzZXJ2aWNlSW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlUmVmVHlwZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWZUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VSZWZUeXBlKFN0cmluZyBuZXdTZXJ2aWNlUmVmVHlwZSkgewotCQlTdHJpbmcgb2xkU2VydmljZVJlZlR5cGUgPSBzZXJ2aWNlUmVmVHlwZTsKLQkJc2VydmljZVJlZlR5cGUgPSBuZXdTZXJ2aWNlUmVmVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfVFlQRSwgb2xkU2VydmljZVJlZlR5cGUsIHNlcnZpY2VSZWZUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXc2RsRmlsZSgpIHsKLQkJcmV0dXJuIHdzZGxGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdzZGxGaWxlKFN0cmluZyBuZXdXc2RsRmlsZSkgewotCQlTdHJpbmcgb2xkV3NkbEZpbGUgPSB3c2RsRmlsZTsKLQkJd3NkbEZpbGUgPSBuZXdXc2RsRmlsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fV1NETF9GSUxFLCBvbGRXc2RsRmlsZSwgd3NkbEZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpheHJwY01hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gamF4cnBjTWFwcGluZ0ZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmF4cnBjTWFwcGluZ0ZpbGUoU3RyaW5nIG5ld0pheHJwY01hcHBpbmdGaWxlKSB7Ci0JCVN0cmluZyBvbGRKYXhycGNNYXBwaW5nRmlsZSA9IGpheHJwY01hcHBpbmdGaWxlOwotCQlqYXhycGNNYXBwaW5nRmlsZSA9IG5ld0pheHJwY01hcHBpbmdGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFLCBvbGRKYXhycGNNYXBwaW5nRmlsZSwgamF4cnBjTWFwcGluZ0ZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlcnZpY2VRbmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VRbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUW5hbWUoT2JqZWN0IG5ld1NlcnZpY2VRbmFtZSkgewotCQlPYmplY3Qgb2xkU2VydmljZVFuYW1lID0gc2VydmljZVFuYW1lOwotCQlzZXJ2aWNlUW5hbWUgPSBuZXdTZXJ2aWNlUW5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUUsIG9sZFNlcnZpY2VRbmFtZSwgc2VydmljZVFuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UG9ydENvbXBvbmVudFJlZnMoKSB7Ci0JCWlmIChwb3J0Q29tcG9uZW50UmVmcyA9PSBudWxsKSB7Ci0JCQlwb3J0Q29tcG9uZW50UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SGFuZGxlcnMoKSB7Ci0JCWlmIChoYW5kbGVycyA9PSBudWxsKSB7Ci0JCQloYW5kbGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlMpOwotCQl9Ci0JCXJldHVybiBoYW5kbGVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZVJlZkhhbmRsZXJDaGFpbnMgZ2V0SGFuZGxlckNoYWlucygpIHsKLQkJcmV0dXJuIGhhbmRsZXJDaGFpbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGFuZGxlckNoYWlucyhTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBuZXdIYW5kbGVyQ2hhaW5zLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIG9sZEhhbmRsZXJDaGFpbnMgPSBoYW5kbGVyQ2hhaW5zOwotCQloYW5kbGVyQ2hhaW5zID0gbmV3SGFuZGxlckNoYWluczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUl9DSEFJTlMsIG9sZEhhbmRsZXJDaGFpbnMsIG5ld0hhbmRsZXJDaGFpbnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhbmRsZXJDaGFpbnMoU2VydmljZVJlZkhhbmRsZXJDaGFpbnMgbmV3SGFuZGxlckNoYWlucykgewotCQlpZiAobmV3SGFuZGxlckNoYWlucyAhPSBoYW5kbGVyQ2hhaW5zKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChoYW5kbGVyQ2hhaW5zICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWhhbmRsZXJDaGFpbnMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSX0NIQUlOUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SGFuZGxlckNoYWlucyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdIYW5kbGVyQ2hhaW5zKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUl9DSEFJTlMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SGFuZGxlckNoYWlucyhuZXdIYW5kbGVyQ2hhaW5zLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJfQ0hBSU5TLCBuZXdIYW5kbGVyQ2hhaW5zLCBuZXdIYW5kbGVyQ2hhaW5zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWROYW1lKCkgewotCQlyZXR1cm4gbWFwcGVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyBuZXdNYXBwZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRNYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLQkJbWFwcGVkTmFtZSA9IG5ld01hcHBlZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX01BUFBFRF9OQU1FLCBvbGRNYXBwZWROYW1lLCBtYXBwZWROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKLQkJaWYgKGluamVjdGlvblRhcmdldHMgPT0gbnVsbCkgewotCQkJaW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbmplY3Rpb25UYXJnZXQuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKLQkJfQotCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQb3J0Q29tcG9uZW50UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SGFuZGxlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSX0NIQUlOUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRIYW5kbGVyQ2hhaW5zKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluamVjdGlvblRhcmdldHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRToKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VJbnRlcmZhY2UoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfVFlQRToKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZlR5cGUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fV1NETF9GSUxFOgotCQkJCXJldHVybiBnZXRXc2RsRmlsZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXJldHVybiBnZXRKYXhycGNNYXBwaW5nRmlsZSgpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUW5hbWUoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UG9ydENvbXBvbmVudFJlZnMoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJfQ0hBSU5TOgotCQkJCXJldHVybiBnZXRIYW5kbGVyQ2hhaW5zKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBnZXRNYXBwZWROYW1lKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiBnZXRJbmplY3Rpb25UYXJnZXRzKCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FOgotCQkJCXNldFNlcnZpY2VSZWZOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUludGVyZmFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX1RZUEU6Ci0JCQkJc2V0U2VydmljZVJlZlR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEU6Ci0JCQkJc2V0V3NkbEZpbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXNldEpheHJwY01hcHBpbmdGaWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRToKLQkJCQlzZXRTZXJ2aWNlUW5hbWUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgotCQkJCWdldFBvcnRDb21wb25lbnRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3J0Q29tcG9uZW50UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSUzoKLQkJCQlnZXRIYW5kbGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0SGFuZGxlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUl9DSEFJTlM6Ci0JCQkJc2V0SGFuZGxlckNoYWlucygoU2VydmljZVJlZkhhbmRsZXJDaGFpbnMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FOgotCQkJCXNldFNlcnZpY2VSZWZOYW1lKFNFUlZJQ0VfUkVGX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUludGVyZmFjZShTRVJWSUNFX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9UWVBFOgotCQkJCXNldFNlcnZpY2VSZWZUeXBlKFNFUlZJQ0VfUkVGX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fV1NETF9GSUxFOgotCQkJCXNldFdzZGxGaWxlKFdTRExfRklMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXNldEpheHJwY01hcHBpbmdGaWxlKEpBWFJQQ19NQVBQSU5HX0ZJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRToKLQkJCQlzZXRTZXJ2aWNlUW5hbWUoU0VSVklDRV9RTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgotCQkJCWdldFBvcnRDb21wb25lbnRSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTOgotCQkJCWdldEhhbmRsZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJfQ0hBSU5TOgotCQkJCXNldEhhbmRsZXJDaGFpbnMoKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZShNQVBQRURfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUU6Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfUkVGX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VSZWZOYW1lICE9IG51bGwgOiAhU0VSVklDRV9SRUZfTkFNRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZVJlZk5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gU0VSVklDRV9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VJbnRlcmZhY2UgIT0gbnVsbCA6ICFTRVJWSUNFX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZUludGVyZmFjZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX1RZUEU6Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfUkVGX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VSZWZUeXBlICE9IG51bGwgOiAhU0VSVklDRV9SRUZfVFlQRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZVJlZlR5cGUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEU6Ci0JCQkJcmV0dXJuIFdTRExfRklMRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbEZpbGUgIT0gbnVsbCA6ICFXU0RMX0ZJTEVfRURFRkFVTFQuZXF1YWxzKHdzZGxGaWxlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRToKLQkJCQlyZXR1cm4gSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVCA9PSBudWxsID8gamF4cnBjTWFwcGluZ0ZpbGUgIT0gbnVsbCA6ICFKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxULmVxdWFscyhqYXhycGNNYXBwaW5nRmlsZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUU6Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfUU5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VRbmFtZSAhPSBudWxsIDogIVNFUlZJQ0VfUU5BTUVfRURFRkFVTFQuZXF1YWxzKHNlcnZpY2VRbmFtZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlM6Ci0JCQkJcmV0dXJuIHBvcnRDb21wb25lbnRSZWZzICE9IG51bGwgJiYgIXBvcnRDb21wb25lbnRSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuIGhhbmRsZXJzICE9IG51bGwgJiYgIWhhbmRsZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUl9DSEFJTlM6Ci0JCQkJcmV0dXJuIGhhbmRsZXJDaGFpbnMgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIE1BUFBFRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWROYW1lICE9IG51bGwgOiAhTUFQUEVEX05BTUVfRURFRkFVTFQuZXF1YWxzKG1hcHBlZE5hbWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0cyAhPSBudWxsICYmICFpbmplY3Rpb25UYXJnZXRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzZXJ2aWNlUmVmTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlUmVmTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VydmljZUludGVyZmFjZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlSW50ZXJmYWNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXJ2aWNlUmVmVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlUmVmVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbEZpbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQod3NkbEZpbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGpheHJwY01hcHBpbmdGaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGpheHJwY01hcHBpbmdGaWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXJ2aWNlUW5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2VydmljZVFuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VydmljZVJlZkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9VcmxQYXR0ZXJuVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1VybFBhdHRlcm5UeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTZjY2QxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1VybFBhdHRlcm5UeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VcmwgUGF0dGVybiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5VcmxQYXR0ZXJuVHlwZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVXJsUGF0dGVyblR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBVcmxQYXR0ZXJuVHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVXJsUGF0dGVyblR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5VUkxfUEFUVEVSTl9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9VcmxQYXR0ZXJuVHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvbWV0YWRhdGEvSmF2YWVlUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL21ldGFkYXRhL0phdmFlZVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyNmUxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvbWV0YWRhdGEvSmF2YWVlUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfNS54c2RzCTEuNjUgMDYvMDIvMTcKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAKLSAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgotICogc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCi0gKiBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6Ci0gKiAKLSAqIERlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBqMmVlIGFwcGxpY2F0aW9uOwotICogICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKLSAqICAgICB3ZWIgYXBwbGljYXRpb247Ci0gKiAgICAgZW50ZXJwcmlzZSBiZWFuOwotICogICAgIHJlc291cmNlIGFkYXB0ZXI7Ci0gKiAKLSAqIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgZWFyIGZpbGU7Ci0gKiAgICAgd2FyIGZpbGU7Ci0gKiAgICAgamFyIGZpbGU7Ci0gKiAgICAgcmFyIGZpbGU7Ci0gKiAKLSAqIAotICogCi0gKiAgICAgICBAKCMpamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZHMJMS4xOSAwMi8xMy8wNgotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLSAqIAotICogICAgIAotICogCi0gKiAgICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gKiAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAqIAotICogICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCi0gKiAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgCi0gKiAKLSAqICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQKLSAqICAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUKLSAqICAgICBmb2xsb3dpbmcgbmFtZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFuZCBzaG91bGQKLSAqICAgICBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZyBHcm91cCwKLSAqICAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZToKLSAqIAotICogICAgIGJhc2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkKLSAqICAgICAgICAgIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoIGl0Ci0gKiAgICAgICAgICBhcHBlYXJzOyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBpZCAgIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4KLSAqICAgICAgICAgIFRoZSB4bWw6aWQgc3BlY2lmaWNhdGlvbiBpcyBub3QgeWV0IGEgVzNDIFJlY29tbWVuZGF0aW9uLAotICogICAgICAgICAgYnV0IHRoaXMgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGhlcmUgdG8gZmFjaWxpdGF0ZSBleHBlcmltZW50YXRpb24KLSAqICAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQKLSAqICAgICAgICAgIGluIHRoZSBzcGVjaWFsQXR0cnMgYXR0cmlidXRlIGdyb3VwLgotICogCi0gKiAgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgotICogICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAgIAotICogICAgIHNwYWNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlCi0gKiAgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZwotICogICAgICAgICAgZGlzY2lwbGluZSBpcyBpbnRlbmRlZCBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQ7IGl0cwotICogICAgICAgICAgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IHZpcnR1ZSBvZiBpdHMKLSAqICAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgRmF0aGVyIChpbiBhbnkgY29udGV4dCBhdCBhbGwpOiBkZW5vdGVzIEpvbiBCb3NhaywgdGhlIGNoYWlyIG9mIAotICogICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IAotICogICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNpc2lvbiBvZiB0aGUgVzNDIFhNTCBQbGVuYXJ5IGFuZCAKLSAqICAgICAgICAgIFhNTCBDb29yZGluYXRpb24gZ3JvdXBzOgotICogCi0gKiAgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCi0gKiAgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQotICogICAgICAgICAgICAgIHhtbDpGYXRoZXIKLSAqICAgCi0gKiBUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICogICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gKiAgICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcsIHhtbDpzcGFjZSBvciB4bWw6aWQKLSAqICAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KLSAqIAotICogICAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYQotICogICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKLSAqICAgICAgICAgJmx0O3NjaGVtYSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICogICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8mZ3Q7Ci0gKiAKLSAqICAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICogICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCi0gKiAKLSAqICAgICAgICAgJmx0O3R5cGUgLiAuIC4mZ3Q7Ci0gKiAgICAgICAgICAuIC4gLgotICogICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OwotICogIAotICogICAgICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlCi0gKiAgICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMKLSAqIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKLSAqICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2QuCi0gKiAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkLgotICogICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKLSAqICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTCBTY2hlbWEKLSAqICAgIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTAotICogICAgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIHdpbGwgY2hhbmdlCi0gKiAgICBhY2NvcmRpbmdseTsgdGhlIHZlcnNpb24gYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuCi0gKiAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFlZVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAiamF2YWVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhZWVQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT05fX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT05fX0xBTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EaXNwbGF5TmFtZUltcGwgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElTUExBWV9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU1BMQVlfTkFNRV9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNQTEFZX05BTUVfX0xBTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNQTEFZX05BTUVfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYkxvY2FsUmVmSW1wbCA8ZW0+RWpiIExvY2FsIFJlZjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYkxvY2FsUmVmSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RWpiTG9jYWxSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fRUpCX1JFRl9UWVBFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19MT0NBTCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19FSkJfTElOSyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19NQVBQRURfTkFNRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0lEID0gODsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FamIgTG9jYWwgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfRkVBVFVSRV9DT1VOVCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwgPGVtPkVqYiBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJSZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFamJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUpCX1JFRiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVGX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUZfX0VKQl9SRUZfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9fRUpCX1JFRl9UWVBFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9fSE9NRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9fUkVNT1RFID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUZfX0VKQl9MSU5LID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUZfX01BUFBFRF9OQU1FID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9fSUQgPSA4OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVqYiBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9GRUFUVVJFX0NPVU5UID0gOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW1wdHlUeXBlSW1wbCA8ZW0+RW1wdHkgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVtcHR5VHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVtcHR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTVBUWV9UWVBFID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVNUFRZX1RZUEVfX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbXB0eSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVNUFRZX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVudkVudHJ5SW1wbCA8ZW0+RW52IEVudHJ5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW52RW50cnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFbnZFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTlZfRU5UUlkgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5WX0VOVFJZX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5WX0VOVFJZX19FTlZfRU5UUllfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJ5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfX0VOVl9FTlRSWV9UWVBFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfX0VOVl9FTlRSWV9WQUxVRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfX01BUFBFRF9OQU1FID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5WX0VOVFJZX19JTkpFQ1RJT05fVEFSR0VUUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfX0lEID0gNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbnYgRW50cnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5WX0VOVFJZX0ZFQVRVUkVfQ09VTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5JY29uSW1wbCA8ZW0+SWNvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkljb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElDT04gPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJQ09OX19TTUFMTF9JQ09OID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUNPTl9fTEFSR0VfSUNPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJQ09OX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElDT05fX0xBTkcgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkljb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUNPTl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSW5qZWN0aW9uVGFyZ2V0SW1wbCA8ZW0+SW5qZWN0aW9uIFRhcmdldDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkluamVjdGlvblRhcmdldEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEluamVjdGlvblRhcmdldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTkpFQ1RJT05fVEFSR0VUID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5KRUNUSU9OX1RBUkdFVF9fSU5KRUNUSU9OX1RBUkdFVF9DTEFTUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5KRUNUSU9OX1RBUkdFVF9fSU5KRUNUSU9OX1RBUkdFVF9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbmplY3Rpb24gVGFyZ2V0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOSkVDVElPTl9UQVJHRVRfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkxpZmVjeWNsZUNhbGxiYWNrSW1wbCA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTGlmZWN5Y2xlQ2FsbGJhY2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRMaWZlY3ljbGVDYWxsYmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMSUZFQ1lDTEVfQ0FMTEJBQ0sgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpZmVjeWNsZSBDYWxsYmFjayBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaWZlY3ljbGUgQ2FsbGJhY2sgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElGRUNZQ0xFX0NBTExCQUNLX19MSUZFQ1lDTEVfQ0FMTEJBQ0tfTUVUSE9EID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5MaWZlY3ljbGUgQ2FsbGJhY2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElGRUNZQ0xFX0NBTExCQUNLX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaXN0ZW5lckltcGwgPGVtPkxpc3RlbmVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTGlzdGVuZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRMaXN0ZW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMSVNURU5FUiA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSVNURU5FUl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSVNURU5FUl9fRElTUExBWV9OQU1FUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19JQ09OUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlzdGVuZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSVNURU5FUl9fTElTVEVORVJfQ0xBU1MgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfX0lEID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5MaXN0ZW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSVNURU5FUl9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbCA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX0RJU1BMQVlfTkFNRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19JQ09OUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX0lEID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fUkVGX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fTElOSyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUFQUEVEX05BTUUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lEID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9GRUFUVVJFX0NPVU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGFyYW1WYWx1ZUltcGwgPGVtPlBhcmFtIFZhbHVlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGFyYW1WYWx1ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFSQU1fVkFMVUUgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9fUEFSQU1fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9fUEFSQU1fVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1fVkFMVUVfX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbCA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUYgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfTkFNRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX1BST1BFUlRJRVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX01BUFBFRF9OQU1FID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JRCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlVW5pdFJlZkltcGwgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUGVyc2lzdGVuY2VVbml0UmVmSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBFUlNJU1RFTkNFX1VOSVRfUkVGID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX1BFUlNJU1RFTkNFX1VOSVRfUkVGX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX05BTUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX01BUFBFRF9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBFUlNJU1RFTkNFX1VOSVRfUkVGX19JRCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfVU5JVF9SRUZfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsIDxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UG9ydENvbXBvbmVudFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9SRUYgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZSBNdG9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfUkVGX19FTkFCTEVfTVRPTSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9SRUZfX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfUkVGX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eVR5cGVJbXBsIDxlbT5Qcm9wZXJ0eSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UHJvcGVydHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST1BFUlRZX1RZUEUgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfVFlQRV9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9UWVBFX19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9UWVBFX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvcGVydHkgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwgPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlc291cmNlRW52UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUYgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fUkVTT1VSQ0VfRU5WX1JFRl9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX1RZUEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fTUFQUEVEX05BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9FTlZfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9FTlZfUkVGX19JRCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9FTlZfUkVGX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGwgPGVtPlJlc291cmNlIFJlZjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX19SRVNfUkVGX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX19SRVNfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzIEF1dGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX1JFU19BVVRIID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXMgU2hhcmluZyBTY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX19NQVBQRURfTkFNRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX19JRCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9GRUFUVVJFX0NPVU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUnVuQXNJbXBsIDxlbT5SdW4gQXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SdW5Bc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJ1bkFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJVTl9BUyA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUlVOX0FTX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJVTl9BU19fUk9MRV9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJVTl9BU19fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJ1biBBczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSVU5fQVNfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZUltcGwgPGVtPlNlY3VyaXR5IFJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZWN1cml0eVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRSA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX19ST0xFX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFJvbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VjdXJpdHlSb2xlUmVmSW1wbCA8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVSZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZWN1cml0eVJvbGVSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9SRUYgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX19ST0xFX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX19ST0xFX0xJTksgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9SRUZfX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX1JFRl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwgPGVtPlNlcnZpY2UgUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUYgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0lDT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX1NFUlZJQ0VfSU5URVJGQUNFID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX1RZUEUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19XU0RMX0ZJTEUgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpheHJwYyBNYXBwaW5nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRSA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBRbmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUyA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19IQU5ETEVSUyA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2hhaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0hBTkRMRVJfQ0hBSU5TID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fTUFQUEVEX05BTUUgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fSUQgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9GRUFUVVJFX0NPVU5UID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbCA8ZW0+U2VydmljZSBSZWYgSGFuZGxlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUiA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX19ESVNQTEFZX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9fSUNPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfTkFNRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0hBTkRMRVJfQ0xBU1MgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX19JTklUX1BBUkFNUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX0hFQURFUlMgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgUm9sZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfX1NPQVBfUk9MRVMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVJfX1BPUlRfTkFNRVMgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9fSUQgPSA5OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9GRUFUVVJFX0NPVU5UID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsIDxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJDaGFpbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTiA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk4gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZSBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fUE9SVF9OQU1FX1BBVFRFUk4gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3RvY29sIEJpbmRpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fUFJPVE9DT0xfQklORElOR1MgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19IQU5ETEVSUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19JRCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckNoYWluc0ltcGwgPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW5zPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOUyA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2hhaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSEFORExFUl9DSEFJTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuVXJsUGF0dGVyblR5cGVJbXBsIDxlbT5VcmwgUGF0dGVybiBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuVXJsUGF0dGVyblR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRVcmxQYXR0ZXJuVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVUkxfUEFUVEVSTl9UWVBFID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVUkxfUEFUVEVSTl9UWVBFX19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VXJsIFBhdHRlcm4gVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVUkxfUEFUVEVSTl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RWpiUmVmVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFSkJfUkVGX1RZUEUgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZSA8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVudkVudHJ5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTlZfRU5UUllfVFlQRSA9IDI4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEUgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGUgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNBdXRoVHlwZSA8ZW0+UmVzIEF1dGggVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZXNBdXRoVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVNfQVVUSF9UWVBFID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlIDxlbT5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzU2hhcmluZ1Njb3BlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVNfU0hBUklOR19TQ09QRV9UWVBFID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRld2V5IFZlcnNpb24gVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldERld2V5VmVyc2lvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVXRVlfVkVSU0lPTl9UWVBFID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVKQiBMaW5rPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RUpCTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFSkJfTElOSyA9IDM0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5FamIgUmVmIE5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVqYlJlZk5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVKQl9SRUZfTkFNRV9UWVBFID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVqYiBSZWYgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RWpiUmVmVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFSkJfUkVGX1RZUEVfT0JKRUNUID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVudiBFbnRyeSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVudkVudHJ5VHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTlZfRU5UUllfVFlQRV9PQkpFQ1QgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RnVsbHkgUXVhbGlmaWVkIENsYXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGVUxMWV9RVUFMSUZJRURfQ0xBU1NfVFlQRSA9IDM4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Ib21lPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0SG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIT01FID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkphdmEgSWRlbnRpZmllcjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEphdmFJZGVudGlmaWVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpBVkFfSURFTlRJRklFUiA9IDQwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5KYXZhIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRKYXZhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKQVZBX1RZUEUgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Sk5ESSBOYW1lPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0Sk5ESU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSk5ESV9OQU1FID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkxvY2FsPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TG9jYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTE9DQUwgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TG9jYWwgSG9tZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldExvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT0NBTF9IT01FID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX1RZUEUgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEVfT0JKRUNUID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlBhdGggVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFBhdGhUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBVEhfVFlQRSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX09CSkVDVCA9IDQ5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5SZW1vdGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZW1vdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVNT1RFID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlJlcyBBdXRoIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZXNBdXRoVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVNfQVVUSF9UWVBFX09CSkVDVCA9IDUxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5SZXMgU2hhcmluZyBTY29wZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU19TSEFSSU5HX1NDT1BFX1RZUEVfT0JKRUNUID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlJvbGUgTmFtZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfTkFNRSA9IDUzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBCaW5kaW5nIExpc3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEUgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19UWVBFID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlNlcnZpY2UgUmVmIFByb3RvY29sIFVSSSBBbGlhcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlNlcnZpY2UgUmVmIFFuYW1lIFBhdHRlcm48L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk4gPSA1NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHJ1ZSBGYWxzZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0VHJ1ZUZhbHNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUUlVFX0ZBTFNFX1RZUEUgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHJ1ZSBGYWxzZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5Cb29sZWFuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRUcnVlRmFsc2VUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRSVUVfRkFMU0VfVFlQRV9PQkpFQ1QgPSA1OTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRpb25fVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uI2dldExhbmcoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdGlvbl9MYW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc3BsYXlOYW1lX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFuZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZSNnZXRMYW5nKCkKLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlzcGxheU5hbWVfTGFuZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmIDxlbT5FamIgTG9jYWwgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVqYiBMb2NhbCBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVqYkxvY2FsUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFamJMb2NhbFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RWpiTG9jYWxSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRFamJSZWZOYW1lIDxlbT5FamIgUmVmIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgUmVmIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiUmVmTmFtZSgpCi0JICogQHNlZSAjZ2V0RWpiTG9jYWxSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYkxvY2FsUmVmX0VqYlJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldEVqYlJlZlR5cGUgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBSZWYgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRFamJSZWZUeXBlKCkKLQkgKiBAc2VlICNnZXRFamJMb2NhbFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfRWpiUmVmVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TG9jYWxIb21lIDxlbT5Mb2NhbCBIb21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWwgSG9tZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRMb2NhbEhvbWUoKQotCSAqIEBzZWUgI2dldEVqYkxvY2FsUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9Mb2NhbEhvbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldExvY2FsIDxlbT5Mb2NhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2FsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldExvY2FsKCkKLQkgKiBAc2VlICNnZXRFamJMb2NhbFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiTG9jYWxSZWZfTG9jYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldEVqYkxpbmsgPGVtPkVqYiBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiTGluaygpCi0JICogQHNlZSAjZ2V0RWpiTG9jYWxSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYkxvY2FsUmVmX0VqYkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TWFwcGVkTmFtZSgpCi0JICogQHNlZSAjZ2V0RWpiTG9jYWxSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYkxvY2FsUmVmX01hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBzZWUgI2dldEVqYkxvY2FsUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFamJMb2NhbFJlZl9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0RWpiTG9jYWxSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYkxvY2FsUmVmX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmIDxlbT5FamIgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVqYiBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFamJSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0RWpiUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFamJSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RWpiUmVmTmFtZSA8ZW0+RWpiIFJlZiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIFJlZiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRFamJSZWZOYW1lKCkKLQkgKiBAc2VlICNnZXRFamJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9FamJSZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIFJlZiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRFamJSZWZUeXBlKCkKLQkgKiBAc2VlICNnZXRFamJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9FamJSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SG9tZSA8ZW0+SG9tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhvbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldEhvbWUoKQotCSAqIEBzZWUgI2dldEVqYlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0hvbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRSZW1vdGUgPGVtPlJlbW90ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbW90ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0UmVtb3RlKCkKLQkgKiBAc2VlICNnZXRFamJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9SZW1vdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRFamJMaW5rIDxlbT5FamIgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRFamJMaW5rKCkKLQkgKiBAc2VlICNnZXRFamJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9FamJMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0TWFwcGVkTmFtZSgpCi0JICogQHNlZSAjZ2V0RWpiUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJSZWZfTWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRJbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAc2VlICNnZXRFamJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVqYlJlZl9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmI2dldElkKCkKLQkgKiBAc2VlICNnZXRFamJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZSA8ZW0+RW1wdHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbXB0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RW1wdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlI2dldElkKCkKLQkgKiBAc2VlICNnZXRFbXB0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVtcHR5VHlwZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5IDxlbT5FbnYgRW50cnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW52IEVudHJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFbnZFbnRyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0RW52RW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlOYW1lIDxlbT5FbnYgRW50cnkgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVudiBFbnRyeSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEVudkVudHJ5TmFtZSgpCi0JICogQHNlZSAjZ2V0RW52RW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudkVudHJ5X0VudkVudHJ5TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVudiBFbnRyeSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEVudkVudHJ5VHlwZSgpCi0JICogQHNlZSAjZ2V0RW52RW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudkVudHJ5X0VudkVudHJ5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlWYWx1ZSA8ZW0+RW52IEVudHJ5IFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW52IEVudHJ5IFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEVudkVudHJ5VmFsdWUoKQotCSAqIEBzZWUgI2dldEVudkVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9FbnZFbnRyeVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldE1hcHBlZE5hbWUoKQotCSAqIEBzZWUgI2dldEVudkVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9NYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRJbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAc2VlICNnZXRFbnZFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW52RW50cnlfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEVudkVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24gPGVtPkljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNtYWxsIEljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiNnZXRTbWFsbEljb24oKQotCSAqIEBzZWUgI2dldEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEljb25fU21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhcmdlIEljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiNnZXRMYXJnZUljb24oKQotCSAqIEBzZWUgI2dldEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEljb25fTGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24jZ2V0SWQoKQotCSAqIEBzZWUgI2dldEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEljb25fSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb24jZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiNnZXRMYW5nKCkKLQkgKiBAc2VlICNnZXRJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJY29uX0xhbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQgPGVtPkluamVjdGlvbiBUYXJnZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW5qZWN0aW9uIFRhcmdldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEluamVjdGlvblRhcmdldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0I2dldEluamVjdGlvblRhcmdldENsYXNzIDxlbT5JbmplY3Rpb24gVGFyZ2V0IENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5qZWN0aW9uIFRhcmdldCBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQjZ2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MoKQotCSAqIEBzZWUgI2dldEluamVjdGlvblRhcmdldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW5qZWN0aW9uVGFyZ2V0X0luamVjdGlvblRhcmdldENsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQjZ2V0SW5qZWN0aW9uVGFyZ2V0TmFtZSA8ZW0+SW5qZWN0aW9uIFRhcmdldCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5qZWN0aW9uIFRhcmdldCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldCNnZXRJbmplY3Rpb25UYXJnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRJbmplY3Rpb25UYXJnZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEluamVjdGlvblRhcmdldF9JbmplY3Rpb25UYXJnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2sgPGVtPkxpZmVjeWNsZSBDYWxsYmFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MaWZlY3ljbGUgQ2FsbGJhY2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExpZmVjeWNsZUNhbGxiYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjayNnZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzIDxlbT5MaWZlY3ljbGUgQ2FsbGJhY2sgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaWZlY3ljbGUgQ2FsbGJhY2sgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2sjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpCi0JICogQHNlZSAjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrI2dldExpZmVjeWNsZUNhbGxiYWNrTWV0aG9kIDxlbT5MaWZlY3ljbGUgQ2FsbGJhY2sgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjayNnZXRMaWZlY3ljbGVDYWxsYmFja01ldGhvZCgpCi0JICogQHNlZSAjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIgPGVtPkxpc3RlbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxpc3RlbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0TGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExpc3RlbmVyX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRMaXN0ZW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TGlzdGVuZXJfRGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0SWNvbnMoKQotCSAqIEBzZWUgI2dldExpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMaXN0ZW5lcl9JY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0TGlzdGVuZXJDbGFzcyA8ZW0+TGlzdGVuZXIgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaXN0ZW5lciBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciNnZXRMaXN0ZW5lckNsYXNzKCkKLQkgKiBAc2VlICNnZXRMaXN0ZW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIjZ2V0SWQoKQotCSAqIEBzZWUgI2dldExpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMaXN0ZW5lcl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JY29uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0SWNvbnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NZXNzYWdlRGVzdGluYXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TWFwcGVkTmFtZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fTWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNYXBwZWROYW1lKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0luamVjdGlvblRhcmdldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0SWQoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGFyYW1WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlI2dldFBhcmFtTmFtZSA8ZW0+UGFyYW0gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcmFtIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZSNnZXRQYXJhbU5hbWUoKQotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBhcmFtVmFsdWVfUGFyYW1OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlI2dldFBhcmFtVmFsdWUgPGVtPlBhcmFtIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZSNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAc2VlICNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQYXJhbVZhbHVlX1BhcmFtVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWYgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRQZXJzaXN0ZW5jZVVuaXROYW1lIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlQ29udGV4dFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldFBlcnNpc3RlbmNlUHJvcGVydGllcyA8ZW0+UGVyc2lzdGVuY2UgUHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGVyc2lzdGVuY2UgUHJvcGVydGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRNYXBwZWROYW1lKCkKLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9NYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0luamVjdGlvblRhcmdldHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBlcnNpc3RlbmNlVW5pdFJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBlcnNpc3RlbmNlVW5pdFJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWYgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfUGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldFBlcnNpc3RlbmNlVW5pdE5hbWUgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfUGVyc2lzdGVuY2VVbml0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldE1hcHBlZE5hbWUoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VVbml0UmVmX01hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cygpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmIDxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBvcnRDb21wb25lbnRSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNpc0VuYWJsZU10b20gPGVtPkVuYWJsZSBNdG9tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5hYmxlIE10b208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNpc0VuYWJsZU10b20oKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRSZWZfRW5hYmxlTXRvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRQb3J0Q29tcG9uZW50TGluayA8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRQb3J0Q29tcG9uZW50TGluaygpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldElkKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50UmVmX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlIDxlbT5Qcm9wZXJ0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb3BlcnR5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9wZXJ0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eVR5cGVfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eVR5cGVfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlUeXBlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYgPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVzb3VyY2VFbnZSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldFJlc291cmNlRW52UmVmTmFtZSA8ZW0+UmVzb3VyY2UgRW52IFJlZiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgRW52IFJlZiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldFJlc291cmNlRW52UmVmTmFtZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX1Jlc291cmNlRW52UmVmTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0UmVzb3VyY2VFbnZSZWZUeXBlIDxlbT5SZXNvdXJjZSBFbnYgUmVmIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0UmVzb3VyY2VFbnZSZWZUeXBlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VFbnZSZWZfUmVzb3VyY2VFbnZSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldE1hcHBlZE5hbWUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9NYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRJbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VFbnZSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmIDxlbT5SZXNvdXJjZSBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZXNvdXJjZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzUmVmTmFtZSA8ZW0+UmVzIFJlZiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzIFJlZiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc1JlZk5hbWUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9SZXNSZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNUeXBlIDxlbT5SZXMgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc1R5cGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9SZXNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNBdXRoIDxlbT5SZXMgQXV0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcyBBdXRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldFJlc0F1dGgoKQotCSAqIEBzZWUgI2dldFJlc291cmNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9SZXNBdXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRSZXNTaGFyaW5nU2NvcGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VSZWZfUmVzU2hhcmluZ1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldE1hcHBlZE5hbWUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9NYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRJbmplY3Rpb25UYXJnZXRzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzIDxlbT5SdW4gQXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UnVuIEFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSdW5BcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BcyNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UnVuQXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJ1bkFzX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXMjZ2V0Um9sZU5hbWUgPGVtPlJvbGUgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvbGUgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BcyNnZXRSb2xlTmFtZSgpCi0JICogQHNlZSAjZ2V0UnVuQXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJ1bkFzX1JvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BcyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BcyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UnVuQXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJ1bkFzX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlIDxlbT5TZWN1cml0eSBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlY3VyaXR5IFJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZWN1cml0eVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUjZ2V0Um9sZU5hbWUgPGVtPlJvbGUgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvbGUgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUjZ2V0Um9sZU5hbWUoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlI2dldElkKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiA8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZWN1cml0eVJvbGVSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlSb2xlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0Um9sZU5hbWUgPGVtPlJvbGUgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvbGUgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0Um9sZU5hbWUoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5Um9sZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0Um9sZUxpbmsgPGVtPlJvbGUgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvbGUgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0Um9sZUxpbmsoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5Um9sZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWYjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmI2dldElkKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGVSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZVJlZl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYgPGVtPlNlcnZpY2UgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlcnZpY2VSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkljb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SWNvbnMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfSWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZVJlZk5hbWUgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZVJlZk5hbWUoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZUludGVyZmFjZSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldFNlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlUmVmVHlwZSA8ZW0+U2VydmljZSBSZWYgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgUmVmIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlUmVmVHlwZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0V3NkbEZpbGUoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0U2VydmljZVFuYW1lIDxlbT5TZXJ2aWNlIFFuYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmljZSBRbmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldFNlcnZpY2VRbmFtZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRQb3J0Q29tcG9uZW50UmVmcyA8ZW0+UG9ydCBDb21wb25lbnQgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldFBvcnRDb21wb25lbnRSZWZzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IYW5kbGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEhhbmRsZXJzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX0hhbmRsZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEhhbmRsZXJDaGFpbnMgPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRIYW5kbGVyQ2hhaW5zKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX0hhbmRsZXJDaGFpbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldE1hcHBlZE5hbWUoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfTWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEluamVjdGlvblRhcmdldHMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldElkKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIgPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VydmljZVJlZkhhbmRsZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZIYW5kbGVyX0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkljb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldEljb25zKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmSGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZkhhbmRsZXJfSWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldEhhbmRsZXJOYW1lIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IYW5kbGVyIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SGFuZGxlck5hbWUoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9IYW5kbGVyTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SGFuZGxlckNsYXNzIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFuZGxlciBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRIYW5kbGVyQ2xhc3MoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9IYW5kbGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluaXQgUGFyYW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldEluaXRQYXJhbXMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9Jbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldFNvYXBIZWFkZXJzIDxlbT5Tb2FwIEhlYWRlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlNvYXAgSGVhZGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRTb2FwSGVhZGVycygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBIZWFkZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldFNvYXBSb2xlcyA8ZW0+U29hcCBSb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U29hcCBSb2xlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlciNnZXRTb2FwUm9sZXMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9Tb2FwUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0UG9ydE5hbWVzIDxlbT5Qb3J0IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Qb3J0IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyI2dldFBvcnROYW1lcygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyX1BvcnROYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlcl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4gPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldFNlcnZpY2VOYW1lUGF0dGVybiA8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldFNlcnZpY2VOYW1lUGF0dGVybigpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9TZXJ2aWNlTmFtZVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0UG9ydE5hbWVQYXR0ZXJuIDxlbT5Qb3J0IE5hbWUgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0UG9ydE5hbWVQYXR0ZXJuKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1BvcnROYW1lUGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiNnZXRQcm90b2NvbEJpbmRpbmdzIDxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb3RvY29sIEJpbmRpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0UHJvdG9jb2xCaW5kaW5ncygpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9Qcm90b2NvbEJpbmRpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IYW5kbGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldEhhbmRsZXJzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX0hhbmRsZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4jZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWlucyA8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zI2dldEhhbmRsZXJDaGFpbnMgPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IYW5kbGVyIENoYWluczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWlucyNnZXRIYW5kbGVyQ2hhaW5zKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnNfSGFuZGxlckNoYWlucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbnMjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbnMjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlIDxlbT5VcmwgUGF0dGVybiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVybCBQYXR0ZXJuIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFVybFBhdHRlcm5UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0VXJsUGF0dGVyblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFVybFBhdHRlcm5UeXBlX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5FamIgUmVmIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRFamJSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGUgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldEVudkVudHJ5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzQXV0aFR5cGUgPGVtPlJlcyBBdXRoIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5SZXMgQXV0aCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFJlc0F1dGhUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlIDxlbT5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFJlc1NoYXJpbmdTY29wZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5EZXdleSBWZXJzaW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRld2V5IFZlcnNpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldERld2V5VmVyc2lvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5FSkIgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RUpCIExpbms8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFSkJMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+RWpiIFJlZiBOYW1lIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkVqYiBSZWYgTmFtZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RWpiUmVmTmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RWpiIFJlZiBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFamJSZWZUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZSA8ZW0+RW52IEVudHJ5IFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FbnYgRW50cnkgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFbnZFbnRyeVR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5GdWxseSBRdWFsaWZpZWQgQ2xhc3MgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RnVsbHkgUXVhbGlmaWVkIENsYXNzIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkhvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkhvbWU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SmF2YSBJZGVudGlmaWVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5KYXZhIElkZW50aWZpZXI8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRKYXZhSWRlbnRpZmllcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkphdmEgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SmF2YSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SmF2YVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5KTkRJIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkpOREkgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEpORElOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TG9jYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxvY2FsPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TG9jYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Mb2NhbCBIb21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TG9jYWxIb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+UGF0aCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5QYXRoIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRQYXRoVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRUeXBlIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5SZW1vdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlJlbW90ZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFJlbW90ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNBdXRoVHlwZSA8ZW0+UmVzIEF1dGggVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlJlcyBBdXRoIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRSZXNBdXRoVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlIDxlbT5SZXMgU2hhcmluZyBTY29wZSBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzU2hhcmluZ1Njb3BlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlJvbGUgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Um9sZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Um9sZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLnV0aWwuTGlzdCA8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBMaXN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlNlcnZpY2UgUmVmIFByb3RvY29sIEJpbmRpbmcgTGlzdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlNlcnZpY2UgUmVmIFByb3RvY29sIEJpbmRpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBVUkkgQWxpYXMgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgVVJJIEFsaWFzIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5TZXJ2aWNlIFJlZiBRbmFtZSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TZXJ2aWNlIFJlZiBRbmFtZSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U2VydmljZVJlZlFuYW1lUGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRydWUgRmFsc2UgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UcnVlIEZhbHNlIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUcnVlRmFsc2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLkJvb2xlYW4gPGVtPlRydWUgRmFsc2UgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRydWUgRmFsc2UgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuQm9vbGVhbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHJ1ZUZhbHNlVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YWVlRmFjdG9yeSBnZXRKYXZhZWVGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkltcGwgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRJT05fX1ZBTFVFID0gZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRJT05fX0xBTkcgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25fTGFuZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EaXNwbGF5TmFtZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXREaXNwbGF5TmFtZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESVNQTEFZX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RGlzcGxheU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTUExBWV9OQU1FX19WQUxVRSA9IGVJTlNUQU5DRS5nZXREaXNwbGF5TmFtZV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJU1BMQVlfTkFNRV9fTEFORyA9IGVJTlNUQU5DRS5nZXREaXNwbGF5TmFtZV9MYW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJMb2NhbFJlZkltcGwgPGVtPkVqYiBMb2NhbCBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJMb2NhbFJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFamJMb2NhbFJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFSkJfTE9DQUxfUkVGID0gZUlOU1RBTkNFLmdldEVqYkxvY2FsUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRFamJMb2NhbFJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfTkFNRSA9IGVJTlNUQU5DRS5nZXRFamJMb2NhbFJlZl9FamJSZWZOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfTE9DQUxfUkVGX19FSkJfUkVGX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RWpiTG9jYWxSZWZfRWpiUmVmVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgSG9tZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9MT0NBTF9SRUZfX0xPQ0FMX0hPTUUgPSBlSU5TVEFOQ0UuZ2V0RWpiTG9jYWxSZWZfTG9jYWxIb21lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9MT0NBTF9SRUZfX0xPQ0FMID0gZUlOU1RBTkNFLmdldEVqYkxvY2FsUmVmX0xvY2FsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTGluazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9MT0NBTF9SRUZfX0VKQl9MSU5LID0gZUlOU1RBTkNFLmdldEVqYkxvY2FsUmVmX0VqYkxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0xPQ0FMX1JFRl9fTUFQUEVEX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RWpiTG9jYWxSZWZfTWFwcGVkTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9MT0NBTF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gZUlOU1RBTkNFLmdldEVqYkxvY2FsUmVmX0luamVjdGlvblRhcmdldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0xPQ0FMX1JFRl9fSUQgPSBlSU5TVEFOQ0UuZ2V0RWpiTG9jYWxSZWZfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwgPGVtPkVqYiBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJSZWZJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RWpiUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVKQl9SRUYgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9SRUZfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRFamJSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVGX19FSkJfUkVGX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmX0VqYlJlZk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUZfX0VKQl9SRUZfVFlQRSA9IGVJTlNUQU5DRS5nZXRFamJSZWZfRWpiUmVmVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUZfX0hPTUUgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmX0hvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUZfX1JFTU9URSA9IGVJTlNUQU5DRS5nZXRFamJSZWZfUmVtb3RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTGluazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUZfX0VKQl9MSU5LID0gZUlOU1RBTkNFLmdldEVqYlJlZl9FamJMaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUZfX01BUFBFRF9OQU1FID0gZUlOU1RBTkNFLmdldEVqYlJlZl9NYXBwZWROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmX0luamVjdGlvblRhcmdldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFRl9fSUQgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbXB0eVR5cGVJbXBsIDxlbT5FbXB0eSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW1wdHlUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVtcHR5VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTVBUWV9UWVBFID0gZUlOU1RBTkNFLmdldEVtcHR5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTVBUWV9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRFbXB0eVR5cGVfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVudkVudHJ5SW1wbCA8ZW0+RW52IEVudHJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW52RW50cnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RW52RW50cnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRU5WX0VOVFJZID0gZUlOU1RBTkNFLmdldEVudkVudHJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVl9FTlRSWV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJ5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlZfRU5UUllfX0VOVl9FTlRSWV9OQU1FID0gZUlOU1RBTkNFLmdldEVudkVudHJ5X0VudkVudHJ5TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJ5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlZfRU5UUllfX0VOVl9FTlRSWV9UWVBFID0gZUlOU1RBTkNFLmdldEVudkVudHJ5X0VudkVudHJ5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJ5IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5WX0VOVFJZX19FTlZfRU5UUllfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfRW52RW50cnlWYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlZfRU5UUllfX01BUFBFRF9OQU1FID0gZUlOU1RBTkNFLmdldEVudkVudHJ5X01hcHBlZE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTID0gZUlOU1RBTkNFLmdldEVudkVudHJ5X0luamVjdGlvblRhcmdldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5WX0VOVFJZX19JRCA9IGVJTlNUQU5DRS5nZXRFbnZFbnRyeV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSWNvbkltcGwgPGVtPkljb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5JY29uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEljb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSUNPTiA9IGVJTlNUQU5DRS5nZXRJY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSUNPTl9fU01BTExfSUNPTiA9IGVJTlNUQU5DRS5nZXRJY29uX1NtYWxsSWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElDT05fX0xBUkdFX0lDT04gPSBlSU5TVEFOQ0UuZ2V0SWNvbl9MYXJnZUljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSUNPTl9fSUQgPSBlSU5TVEFOQ0UuZ2V0SWNvbl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElDT05fX0xBTkcgPSBlSU5TVEFOQ0UuZ2V0SWNvbl9MYW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5JbmplY3Rpb25UYXJnZXRJbXBsIDxlbT5JbmplY3Rpb24gVGFyZ2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSW5qZWN0aW9uVGFyZ2V0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEluamVjdGlvblRhcmdldCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJTkpFQ1RJT05fVEFSR0VUID0gZUlOU1RBTkNFLmdldEluamVjdGlvblRhcmdldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOSkVDVElPTl9UQVJHRVRfX0lOSkVDVElPTl9UQVJHRVRfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0SW5qZWN0aW9uVGFyZ2V0X0luamVjdGlvblRhcmdldENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SW5qZWN0aW9uVGFyZ2V0X0luamVjdGlvblRhcmdldE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkxpZmVjeWNsZUNhbGxiYWNrSW1wbCA8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTGlmZWN5Y2xlQ2FsbGJhY2tJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTElGRUNZQ0xFX0NBTExCQUNLID0gZUlOU1RBTkNFLmdldExpZmVjeWNsZUNhbGxiYWNrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaWZlY3ljbGUgQ2FsbGJhY2sgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19DTEFTUyA9IGVJTlNUQU5DRS5nZXRMaWZlY3ljbGVDYWxsYmFja19MaWZlY3ljbGVDYWxsYmFja0NsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaWZlY3ljbGUgQ2FsbGJhY2sgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElGRUNZQ0xFX0NBTExCQUNLX19MSUZFQ1lDTEVfQ0FMTEJBQ0tfTUVUSE9EID0gZUlOU1RBTkNFLmdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5MaXN0ZW5lckltcGwgPGVtPkxpc3RlbmVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTGlzdGVuZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TGlzdGVuZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTElTVEVORVIgPSBlSU5TVEFOQ0UuZ2V0TGlzdGVuZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTElTVEVORVJfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRMaXN0ZW5lcl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExJU1RFTkVSX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldExpc3RlbmVyX0Rpc3BsYXlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExJU1RFTkVSX19JQ09OUyA9IGVJTlNUQU5DRS5nZXRMaXN0ZW5lcl9JY29ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGlzdGVuZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMSVNURU5FUl9fTElTVEVORVJfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMSVNURU5FUl9fSUQgPSBlSU5TVEFOQ0UuZ2V0TGlzdGVuZXJfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FU1NBR0VfREVTVElOQVRJT04gPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvbl9EaXNwbGF5TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RFU1RJTkFUSU9OX19JQ09OUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25fSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fX01FU1NBR0VfREVTVElOQVRJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25fTWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RFU1RJTkFUSU9OX19NQVBQRURfTkFNRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25fTWFwcGVkTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RFU1RJTkFUSU9OX19JRCA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25fSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRiA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fUkVGX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTksgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01BUFBFRF9OQU1FID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NYXBwZWROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JbmplY3Rpb25UYXJnZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JRCA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGFyYW1WYWx1ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQQVJBTV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQQVJBTV9WQUxVRV9fUEFSQU1fTkFNRSA9IGVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlX1BhcmFtTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQQVJBTV9WQUxVRV9fUEFSQU1fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UGFyYW1WYWx1ZV9QYXJhbVZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBBUkFNX1ZBTFVFX19JRCA9IGVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUYgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9DT05URVhUX1JFRl9OQU1FID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9OQU1FID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZVVuaXROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19NQVBQRURfTkFNRSA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfTWFwcGVkTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9DT05URVhUX1JFRl9fSUQgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QZXJzaXN0ZW5jZVVuaXRSZWZJbXBsIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBlcnNpc3RlbmNlVW5pdFJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEVSU0lTVEVOQ0VfVU5JVF9SRUYgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBFUlNJU1RFTkNFX1VOSVRfUkVGX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX1JFRl9OQU1FID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlVW5pdFJlZl9QZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9VTklUX1JFRl9fUEVSU0lTVEVOQ0VfVU5JVF9OQU1FID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlVW5pdFJlZl9QZXJzaXN0ZW5jZVVuaXROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBFUlNJU1RFTkNFX1VOSVRfUkVGX19NQVBQRURfTkFNRSA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZfTWFwcGVkTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBFUlNJU1RFTkNFX1VOSVRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9VTklUX1JFRl9fSUQgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbCA8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudFJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQb3J0Q29tcG9uZW50UmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBPUlRfQ09NUE9ORU5UX1JFRiA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZSBNdG9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9SVF9DT01QT05FTlRfUkVGX19FTkFCTEVfTVRPTSA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX0VuYWJsZU10b20oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTksgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX0NPTVBPTkVOVF9SRUZfX0lEID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWZfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlByb3BlcnR5VHlwZUltcGwgPGVtPlByb3BlcnR5IFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eVR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UHJvcGVydHlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST1BFUlRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPUEVSVFlfVFlQRV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eVR5cGVfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9UWVBFX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eVR5cGVfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPUEVSVFlfVFlQRV9fSUQgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlUeXBlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwgPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZUVudlJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVNPVVJDRV9FTlZfUkVGID0gZUlOU1RBTkNFLmdldFJlc291cmNlRW52UmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0VOVl9SRUZfX1JFU09VUkNFX0VOVl9SRUZfTkFNRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9SZXNvdXJjZUVudlJlZk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWYgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0VOVl9SRUZfX1JFU09VUkNFX0VOVl9SRUZfVFlQRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9SZXNvdXJjZUVudlJlZlR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfRU5WX1JFRl9fTUFQUEVEX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VFbnZSZWZfTWFwcGVkTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gZUlOU1RBTkNFLmdldFJlc291cmNlRW52UmVmX0luamVjdGlvblRhcmdldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfRU5WX1JFRl9fSUQgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VFbnZSZWZfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbCA8ZW0+UmVzb3VyY2UgUmVmPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVTT1VSQ0VfUkVGID0gZUlOU1RBTkNFLmdldFJlc291cmNlUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfUkVGX19SRVNfUkVGX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfUmVzUmVmTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9SRUZfX1JFU19UWVBFID0gZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX1Jlc1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcyBBdXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfUkVGX19SRVNfQVVUSCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9SZXNBdXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXMgU2hhcmluZyBTY29wZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEUgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfUmVzU2hhcmluZ1Njb3BlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX1JFRl9fTUFQUEVEX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfTWFwcGVkTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5qZWN0aW9uIFRhcmdldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9SRUZfX0lEID0gZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SdW5Bc0ltcGwgPGVtPlJ1biBBczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJ1bkFzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJ1bkFzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJVTl9BUyA9IGVJTlNUQU5DRS5nZXRSdW5BcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSVU5fQVNfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRSdW5Bc19EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJVTl9BU19fUk9MRV9OQU1FID0gZUlOU1RBTkNFLmdldFJ1bkFzX1JvbGVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJVTl9BU19fSUQgPSBlSU5TVEFOQ0UuZ2V0UnVuQXNfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZUltcGwgPGVtPlNlY3VyaXR5IFJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VjdXJpdHlSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFQ1VSSVRZX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNVUklUWV9ST0xFX19ST0xFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1VSSVRZX1JPTEVfX0lEID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VjdXJpdHlSb2xlUmVmSW1wbCA8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVSZWZJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VjdXJpdHlSb2xlUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFQ1VSSVRZX1JPTEVfUkVGID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1VSSVRZX1JPTEVfUkVGX19ST0xFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNVUklUWV9ST0xFX1JFRl9fUk9MRV9MSU5LID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZl9Sb2xlTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNVUklUWV9ST0xFX1JFRl9fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCA8ZW0+U2VydmljZSBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VSVklDRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0Rpc3BsYXlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX19JQ09OUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0ljb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9SRUZfX1dTRExfRklMRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXhycGMgTWFwcGluZyBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBRbmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9SRUZfX0hBTkRMRVJTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2hhaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9SRUZfX0hBTkRMRVJfQ0hBSU5TID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSGFuZGxlckNoYWlucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9fTUFQUEVEX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9NYXBwZWROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmplY3Rpb24gVGFyZ2V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJJbXBsIDxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZkhhbmRsZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VSVklDRV9SRUZfSEFORExFUiA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9IQU5ETEVSX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZkhhbmRsZXJfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9IQU5ETEVSX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyX0Rpc3BsYXlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lDT05TID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyX0ljb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9IQU5ETEVSX19IQU5ETEVSX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZkhhbmRsZXJfSGFuZGxlck5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9IQU5ETEVSX19IQU5ETEVSX0NMQVNTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lOSVRfUEFSQU1TID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyX0luaXRQYXJhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgSGVhZGVyczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9IRUFERVJTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBIZWFkZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIFJvbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX1JPTEVTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBSb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9SRUZfSEFORExFUl9fUE9SVF9OQU1FUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlcl9Qb3J0TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9SRUZfSEFORExFUl9fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZkhhbmRsZXJfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsIDxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJDaGFpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU4gPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1NlcnZpY2VOYW1lUGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1BvcnROYW1lUGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvdG9jb2wgQmluZGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QUk9UT0NPTF9CSU5ESU5HUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1Byb3RvY29sQmluZGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19IQU5ETEVSUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX0hhbmRsZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0lEID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zSW1wbCA8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSGFuZGxlckNoYWluc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBDaGFpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX19IQU5ETEVSX0NIQUlOUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19IYW5kbGVyQ2hhaW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX19JRCA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuVXJsUGF0dGVyblR5cGVJbXBsIDxlbT5VcmwgUGF0dGVybiBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuVXJsUGF0dGVyblR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0VXJsUGF0dGVyblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVVJMX1BBVFRFUk5fVFlQRSA9IGVJTlNUQU5DRS5nZXRVcmxQYXR0ZXJuVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBVUkxfUEFUVEVSTl9UWVBFX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRVcmxQYXR0ZXJuVHlwZV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGUgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFamJSZWZUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gRUpCX1JFRl9UWVBFID0gZUlOU1RBTkNFLmdldEVqYlJlZlR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGUgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RW52RW50cnlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gRU5WX0VOVFJZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0VHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBQRVJTSVNURU5DRV9DT05URVhUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlIDxlbT5SZXMgQXV0aCBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzQXV0aFR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZXNBdXRoVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFJFU19BVVRIX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UmVzQXV0aFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlIDxlbT5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzU2hhcmluZ1Njb3BlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlc1NoYXJpbmdTY29wZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBSRVNfU0hBUklOR19TQ09QRV9UWVBFID0gZUlOU1RBTkNFLmdldFJlc1NoYXJpbmdTY29wZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkRld2V5IFZlcnNpb24gVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXREZXdleVZlcnNpb25UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIERFV0VZX1ZFUlNJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXREZXdleVZlcnNpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5FSkIgTGluazwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFSkJMaW5rKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEVKQl9MSU5LID0gZUlOU1RBTkNFLmdldEVKQkxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkVqYiBSZWYgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVqYlJlZk5hbWVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEVKQl9SRUZfTkFNRV9UWVBFID0gZUlOU1RBTkNFLmdldEVqYlJlZk5hbWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5FamIgUmVmIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFamJSZWZUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEVKQl9SRUZfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmVHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+RW52IEVudHJ5IFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVudkVudHJ5VHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBFTlZfRU5UUllfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5GdWxseSBRdWFsaWZpZWQgQ2xhc3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBGVUxMWV9RVUFMSUZJRURfQ0xBU1NfVFlQRSA9IGVJTlNUQU5DRS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+SG9tZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRIb21lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEhPTUUgPSBlSU5TVEFOQ0UuZ2V0SG9tZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+SmF2YSBJZGVudGlmaWVyPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEphdmFJZGVudGlmaWVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEpBVkFfSURFTlRJRklFUiA9IGVJTlNUQU5DRS5nZXRKYXZhSWRlbnRpZmllcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+SmF2YSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEphdmFUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEpBVkFfVFlQRSA9IGVJTlNUQU5DRS5nZXRKYXZhVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Sk5ESSBOYW1lPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEpORElOYW1lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEpORElfTkFNRSA9IGVJTlNUQU5DRS5nZXRKTkRJTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+TG9jYWw8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TG9jYWwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgTE9DQUwgPSBlSU5TVEFOQ0UuZ2V0TG9jYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TG9jYWxIb21lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIExPQ0FMX0hPTUUgPSBlSU5TVEFOQ0UuZ2V0TG9jYWxIb21lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTksgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5QYXRoIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGF0aFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgUEFUSF9UWVBFID0gZUlOU1RBTkNFLmdldFBhdGhUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+UmVtb3RlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlbW90ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBSRU1PVEUgPSBlSU5TVEFOQ0UuZ2V0UmVtb3RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5SZXMgQXV0aCBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNBdXRoVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlc0F1dGhUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFJFU19BVVRIX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFJlc0F1dGhUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5SZXMgU2hhcmluZyBTY29wZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBSRVNfU0hBUklOR19TQ09QRV9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Sb2xlIE5hbWU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0Um9sZU5hbWUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgUk9MRV9OQU1FID0gZUlOU1RBTkNFLmdldFJvbGVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBCaW5kaW5nIExpc3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfTElTVF9UWVBFID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgVVJJIEFsaWFzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+U2VydmljZSBSZWYgUW5hbWUgUGF0dGVybjwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZlFuYW1lUGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VHJ1ZSBGYWxzZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0VHJ1ZUZhbHNlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBUUlVFX0ZBTFNFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VHJ1ZUZhbHNlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VHJ1ZSBGYWxzZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5Cb29sZWFuCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0VHJ1ZUZhbHNlVHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBUUlVFX0ZBTFNFX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFRydWVGYWxzZVR5cGVPYmplY3QoKTsKLQotCX0KLQotfSAvL0phdmFlZVBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0pFRVhNTEhlbHBlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0pFRVhNTEhlbHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwYzhkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KRUVYTUxIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotcHVibGljIGNsYXNzIEpFRVhNTEhlbHBlckltcGwgZXh0ZW5kcyBYTUxIZWxwZXJJbXBsIHsKLQotCXB1YmxpYyBKRUVYTUxIZWxwZXJJbXBsKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQl9Ci0KLQotCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKEVDbGFzcyBjbGFzczEsIFN0cmluZyBuYW1lc3BhY2VVUkksCi0JCQlTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0VsZW1lbnQpIHsKLQkJLy8gSWYgbm90IGZvdW5kIGluIGN1cnJlbnQgbmFtZXNwYWNlIHBhY2thZ2UsIGdvIHRvIGNvbW1vbiBwYWNrYWdlCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSA9ICBzdXBlci5nZXRGZWF0dXJlKGNsYXNzMSwgbmFtZXNwYWNlVVJJLCBuYW1lLCBpc0VsZW1lbnQpOwotCQlpZiAoYUZlYXR1cmUgPT0gbnVsbCkKLQkJCWFGZWF0dXJlID0gIHN1cGVyLmdldEZlYXR1cmUoY2xhc3MxLCBKYXZhZWVQYWNrYWdlLmVOU19VUkksIG5hbWUsIGlzRWxlbWVudCk7Ci0JcmV0dXJuIGFGZWF0dXJlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzRiMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhZWVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSmF2YWVlUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFlZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEphdmFlZVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFlZVN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBKYXZhZWVTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNwbGF5TmFtZShEaXNwbGF5TmFtZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGlzcGxheU5hbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFamJMb2NhbFJlZihFamJMb2NhbFJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRWpiTG9jYWxSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFamJSZWYoRWpiUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFamJSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFbXB0eVR5cGUoRW1wdHlUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFbXB0eVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFbnZFbnRyeShFbnZFbnRyeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRW52RW50cnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJY29uKEljb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUljb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbmplY3Rpb25UYXJnZXQoSW5qZWN0aW9uVGFyZ2V0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJbmplY3Rpb25UYXJnZXRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMaWZlY3ljbGVDYWxsYmFjayhMaWZlY3ljbGVDYWxsYmFjayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTGlmZWN5Y2xlQ2FsbGJhY2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMaXN0ZW5lcihMaXN0ZW5lciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTGlzdGVuZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRGVzdGluYXRpb24oTWVzc2FnZURlc3RpbmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRGVzdGluYXRpb25SZWYoTWVzc2FnZURlc3RpbmF0aW9uUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQYXJhbVZhbHVlKFBhcmFtVmFsdWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBhcmFtVmFsdWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQZXJzaXN0ZW5jZUNvbnRleHRSZWYoUGVyc2lzdGVuY2VDb250ZXh0UmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQZXJzaXN0ZW5jZUNvbnRleHRSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQZXJzaXN0ZW5jZVVuaXRSZWYoUGVyc2lzdGVuY2VVbml0UmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0Q29tcG9uZW50UmVmKFBvcnRDb21wb25lbnRSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9wZXJ0eVR5cGUoUHJvcGVydHlUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9wZXJ0eVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZUVudlJlZihSZXNvdXJjZUVudlJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VFbnZSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZVJlZihSZXNvdXJjZVJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSdW5BcyhSdW5BcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUnVuQXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eVJvbGUoU2VjdXJpdHlSb2xlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eVJvbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eVJvbGVSZWYoU2VjdXJpdHlSb2xlUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eVJvbGVSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmSGFuZGxlcihTZXJ2aWNlUmVmSGFuZGxlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlZkhhbmRsZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmSGFuZGxlckNoYWluKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyhTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlZkhhbmRsZXJDaGFpbnNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VVcmxQYXR0ZXJuVHlwZShVcmxQYXR0ZXJuVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVXJsUGF0dGVyblR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNwbGF5TmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmIDxlbT5FamIgTG9jYWwgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFamJMb2NhbFJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiA8ZW0+RWpiIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVqYlJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZSA8ZW0+RW1wdHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVtcHR5VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5IDxlbT5FbnYgRW50cnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudkVudHJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbiA8ZW0+SWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJY29uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0IDxlbT5JbmplY3Rpb24gVGFyZ2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5qZWN0aW9uVGFyZ2V0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2sgPGVtPkxpZmVjeWNsZSBDYWxsYmFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTGlmZWN5Y2xlQ2FsbGJhY2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciA8ZW0+TGlzdGVuZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpc3RlbmVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUgPGVtPlBhcmFtIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhcmFtVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGVyc2lzdGVuY2VDb250ZXh0UmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYgPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0Q29tcG9uZW50UmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUHJvcGVydHlUeXBlIDxlbT5Qcm9wZXJ0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvcGVydHlUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYgPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlRW52UmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYgPGVtPlJlc291cmNlIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BcyA8ZW0+UnVuIEFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSdW5Bc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZSA8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3VyaXR5Um9sZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZiA8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmIDxlbT5TZXJ2aWNlIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXIgPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZIYW5kbGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbiA8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWluQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZkhhbmRsZXJDaGFpbnMgPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWlucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWluc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlIDxlbT5VcmwgUGF0dGVybiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVcmxQYXR0ZXJuVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9KYXZhZWVBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2IxZmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsLkphdmFlZVJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YWVlUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFlZVJlc291cmNlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IEphdmFlZVJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0gLy9KYXZhZWVSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDJiZWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSA8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXZhZWVSZXNvdXJjZUZhY3RvcnlJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhZWVSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhZWVSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkKLQkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZSgpOwotCQkKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkgcmV0dXJuOyAvLyBPbmx5IHNhdmUgaWYgZmlsZSBleGlzdGVkCi0JCXN1cGVyLnNhdmUob3B0aW9ucyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSUZpbGUgZm9yIHRoZSA8Y29kZT51cmk8L2NvZGU+IHdpdGhpbiB0aGUgV29ya3NwYWNlLiBUaGlzIFVSSSBpcyBhc3N1bWVkIHRvIGJlCi0JICogYWJzb2x1dGUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6IHBsYXRmb3JtOi9yZXNvdXJjZS8uLi4uCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoVVJJIHVyaSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKSB7Ci0JCQlTdHJpbmcgZmlsZVN0cmluZyA9IFVSSS5kZWNvZGUodXJpLnBhdGgoKSk7Ci0JCQlmaWxlU3RyaW5nID0gZmlsZVN0cmluZy5zdWJzdHJpbmcoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9SRVNPVVJDRS5sZW5ndGgoKSArIDEpOwotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlmaWxlID0gZ2V0UGxhdGZvcm1GaWxlKGdldFVSSSgpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKGdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBnZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCQkJCVVSSSBjb252ZXJ0ZWRVcmkgPSBjb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0JCQkJaWYgKCF1cmkuZXF1YWxzKGNvbnZlcnRlZFVyaSkpCi0JCQkJCWZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUoY29udmVydGVkVXJpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gZ2V0UGxhdGZvcm1GaWxlKCk7Ci0JCWlmICghZm9yY2UgJiYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkpIHJldHVybjsgLy8gT25seSBzYXZlIGlmIGZpbGUgZXhpc3RlZAotCQlzdXBlci5zYXZlKG9wdGlvbnMpOwotCQlpZiAoZm9yY2UpIGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHRoaXMpOyAvL1JlbW92ZSBpbml0aWFsIHJlc291cmNlCi0JfQotCi19IC8vSmF2YWVlUmVzb3VyY2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDNlZjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YWVlU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEphdmFlZVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhZWVTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTjogewotCQkJCURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRJU1BMQVlfTkFNRTogewotCQkJCURpc3BsYXlOYW1lIGRpc3BsYXlOYW1lID0gKERpc3BsYXlOYW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEaXNwbGF5TmFtZShkaXNwbGF5TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUY6IHsKLQkJCQlFamJMb2NhbFJlZiBlamJMb2NhbFJlZiA9IChFamJMb2NhbFJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRWpiTG9jYWxSZWYoZWpiTG9jYWxSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGOiB7Ci0JCQkJRWpiUmVmIGVqYlJlZiA9IChFamJSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVqYlJlZihlamJSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTVBUWV9UWVBFOiB7Ci0JCQkJRW1wdHlUeXBlIGVtcHR5VHlwZSA9IChFbXB0eVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVtcHR5VHlwZShlbXB0eVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUlk6IHsKLQkJCQlFbnZFbnRyeSBlbnZFbnRyeSA9IChFbnZFbnRyeSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRW52RW50cnkoZW52RW50cnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OOiB7Ci0JCQkJSWNvbiBpY29uID0gKEljb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUljb24oaWNvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklOSkVDVElPTl9UQVJHRVQ6IHsKLQkJCQlJbmplY3Rpb25UYXJnZXQgaW5qZWN0aW9uVGFyZ2V0ID0gKEluamVjdGlvblRhcmdldCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW5qZWN0aW9uVGFyZ2V0KGluamVjdGlvblRhcmdldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJRkVDWUNMRV9DQUxMQkFDSzogewotCQkJCUxpZmVjeWNsZUNhbGxiYWNrIGxpZmVjeWNsZUNhbGxiYWNrID0gKExpZmVjeWNsZUNhbGxiYWNrKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMaWZlY3ljbGVDYWxsYmFjayhsaWZlY3ljbGVDYWxsYmFjayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSOiB7Ci0JCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSAoTGlzdGVuZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTjogewotCQkJCU1lc3NhZ2VEZXN0aW5hdGlvbiBtZXNzYWdlRGVzdGluYXRpb24gPSAoTWVzc2FnZURlc3RpbmF0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXNzYWdlRGVzdGluYXRpb24obWVzc2FnZURlc3RpbmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUY6IHsKLQkJCQlNZXNzYWdlRGVzdGluYXRpb25SZWYgbWVzc2FnZURlc3RpbmF0aW9uUmVmID0gKE1lc3NhZ2VEZXN0aW5hdGlvblJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZURlc3RpbmF0aW9uUmVmKG1lc3NhZ2VEZXN0aW5hdGlvblJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFOiB7Ci0JCQkJUGFyYW1WYWx1ZSBwYXJhbVZhbHVlID0gKFBhcmFtVmFsdWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBhcmFtVmFsdWUocGFyYW1WYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGOiB7Ci0JCQkJUGVyc2lzdGVuY2VDb250ZXh0UmVmIHBlcnNpc3RlbmNlQ29udGV4dFJlZiA9IChQZXJzaXN0ZW5jZUNvbnRleHRSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBlcnNpc3RlbmNlQ29udGV4dFJlZihwZXJzaXN0ZW5jZUNvbnRleHRSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRjogewotCQkJCVBlcnNpc3RlbmNlVW5pdFJlZiBwZXJzaXN0ZW5jZVVuaXRSZWYgPSAoUGVyc2lzdGVuY2VVbml0UmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQZXJzaXN0ZW5jZVVuaXRSZWYocGVyc2lzdGVuY2VVbml0UmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGOiB7Ci0JCQkJUG9ydENvbXBvbmVudFJlZiBwb3J0Q29tcG9uZW50UmVmID0gKFBvcnRDb21wb25lbnRSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBvcnRDb21wb25lbnRSZWYocG9ydENvbXBvbmVudFJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEU6IHsKLQkJCQlQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlID0gKFByb3BlcnR5VHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvcGVydHlUeXBlKHByb3BlcnR5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUY6IHsKLQkJCQlSZXNvdXJjZUVudlJlZiByZXNvdXJjZUVudlJlZiA9IChSZXNvdXJjZUVudlJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVzb3VyY2VFbnZSZWYocmVzb3VyY2VFbnZSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUY6IHsKLQkJCQlSZXNvdXJjZVJlZiByZXNvdXJjZVJlZiA9IChSZXNvdXJjZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVzb3VyY2VSZWYocmVzb3VyY2VSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVM6IHsKLQkJCQlSdW5BcyBydW5BcyA9IChSdW5Bcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUnVuQXMocnVuQXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFOiB7Ci0JCQkJU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZSA9IChTZWN1cml0eVJvbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5Um9sZShzZWN1cml0eVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRjogewotCQkJCVNlY3VyaXR5Um9sZVJlZiBzZWN1cml0eVJvbGVSZWYgPSAoU2VjdXJpdHlSb2xlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZWN1cml0eVJvbGVSZWYoc2VjdXJpdHlSb2xlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUY6IHsKLQkJCQlTZXJ2aWNlUmVmIHNlcnZpY2VSZWYgPSAoU2VydmljZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZVJlZihzZXJ2aWNlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUjogewotCQkJCVNlcnZpY2VSZWZIYW5kbGVyIHNlcnZpY2VSZWZIYW5kbGVyID0gKFNlcnZpY2VSZWZIYW5kbGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlUmVmSGFuZGxlcihzZXJ2aWNlUmVmSGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU46IHsKLQkJCQlTZXJ2aWNlUmVmSGFuZGxlckNoYWluIHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4gPSAoU2VydmljZVJlZkhhbmRsZXJDaGFpbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZVJlZkhhbmRsZXJDaGFpbihzZXJ2aWNlUmVmSGFuZGxlckNoYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlM6IHsKLQkJCQlTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBzZXJ2aWNlUmVmSGFuZGxlckNoYWlucyA9IChTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZVJlZkhhbmRsZXJDaGFpbnMoc2VydmljZVJlZkhhbmRsZXJDaGFpbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFOiB7Ci0JCQkJVXJsUGF0dGVyblR5cGUgdXJsUGF0dGVyblR5cGUgPSAoVXJsUGF0dGVyblR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVVybFBhdHRlcm5UeXBlKHVybFBhdHRlcm5UeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uKERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgTG9jYWwgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVqYiBMb2NhbCBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVqYkxvY2FsUmVmKEVqYkxvY2FsUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWpiIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFamJSZWYoRWpiUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW1wdHkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbXB0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFbXB0eVR5cGUoRW1wdHlUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW52IEVudHJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudiBFbnRyeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRW52RW50cnkoRW52RW50cnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JY29uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkljb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUljb24oSWNvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluamVjdGlvbiBUYXJnZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5qZWN0aW9uIFRhcmdldDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW5qZWN0aW9uVGFyZ2V0KEluamVjdGlvblRhcmdldCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaWZlY3ljbGUgQ2FsbGJhY2s8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxpZmVjeWNsZUNhbGxiYWNrKExpZmVjeWNsZUNhbGxiYWNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlzdGVuZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlzdGVuZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxpc3RlbmVyKExpc3RlbmVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRGVzdGluYXRpb24oTWVzc2FnZURlc3RpbmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEZXN0aW5hdGlvblJlZihNZXNzYWdlRGVzdGluYXRpb25SZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUGFyYW1WYWx1ZShQYXJhbVZhbHVlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVBlcnNpc3RlbmNlQ29udGV4dFJlZihQZXJzaXN0ZW5jZUNvbnRleHRSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUGVyc2lzdGVuY2VVbml0UmVmKFBlcnNpc3RlbmNlVW5pdFJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVBvcnRDb21wb25lbnRSZWYoUG9ydENvbXBvbmVudFJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvcGVydHlUeXBlKFByb3BlcnR5VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VFbnZSZWYoUmVzb3VyY2VFbnZSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZVJlZihSZXNvdXJjZVJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJ1biBBczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SdW4gQXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJ1bkFzKFJ1bkFzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eVJvbGUoU2VjdXJpdHlSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZVJlZihTZWN1cml0eVJvbGVSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmljZVJlZihTZXJ2aWNlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmSGFuZGxlcihTZXJ2aWNlUmVmSGFuZGxlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmljZVJlZkhhbmRsZXJDaGFpbihTZXJ2aWNlUmVmSGFuZGxlckNoYWluIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXJsIFBhdHRlcm4gVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VcmwgUGF0dGVybiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VVcmxQYXR0ZXJuVHlwZShVcmxQYXR0ZXJuVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSmF2YWVlU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzRiYTk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0VmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLnV0aWwuWE1MVHlwZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLnV0aWwuWE1MVHlwZVZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5WYWxpZGF0b3I8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFlZVZhbGlkYXRvciBleHRlbmRzIEVPYmplY3RWYWxpZGF0b3IgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YWVlVmFsaWRhdG9yIElOU1RBTkNFID0gbmV3IEphdmFlZVZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogQSBjb25zdGFudCBmb3IgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyNnZXRTb3VyY2UoKSBzb3VyY2V9IG9mIGRpYWdub3N0aWMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldENvZGUoKSBjb2Rlc30gZnJvbSB0aGlzIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldFNvdXJjZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyNnZXRDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR05PU1RJQ19TT1VSQ0UgPSAib3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBjb25zdGFudCB3aXRoIGEgZml4ZWQgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBiYXNlIHZhbHVlIGZvciBhZGRpdGlvbmFsIGhhbmQgd3JpdHRlbiBjb25zdGFudHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFTkVSQVRFRF9ESUFHTk9TVElDX0NPREVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB3aXRoIGEgZml4ZWQgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBiYXNlIHZhbHVlIGZvciBhZGRpdGlvbmFsIGhhbmQgd3JpdHRlbiBjb25zdGFudHMgaW4gYSBkZXJpdmVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERJQUdOT1NUSUNfQ09ERV9DT1VOVCA9IEdFTkVSQVRFRF9ESUFHTk9TVElDX0NPREVfQ09VTlQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIGJhc2UgcGFja2FnZSB2YWxpZGF0b3IuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhNTFR5cGVWYWxpZGF0b3IgeG1sVHlwZVZhbGlkYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YWVlVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCQl4bWxUeXBlVmFsaWRhdG9yID0gWE1MVHlwZVZhbGlkYXRvci5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG9mIHRoaXMgdmFsaWRhdG9yIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JICByZXR1cm4gSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+dmFsaWRhdGVYWFg8L2NvZGU+IGZvciB0aGUgY29ycmVzb25kaW5nIGNsYXNzaWZpZXIgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKGludCBjbGFzc2lmaWVySUQsIE9iamVjdCB2YWx1ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRFU0NSSVBUSU9OOgotCQkJCXJldHVybiB2YWxpZGF0ZURlc2NyaXB0aW9uKChEZXNjcmlwdGlvbil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEaXNwbGF5TmFtZSgoRGlzcGxheU5hbWUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGOgotCQkJCXJldHVybiB2YWxpZGF0ZUVqYkxvY2FsUmVmKChFamJMb2NhbFJlZil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUY6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRWpiUmVmKChFamJSZWYpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTVBUWV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUVtcHR5VHlwZSgoRW1wdHlUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZOgotCQkJCXJldHVybiB2YWxpZGF0ZUVudkVudHJ5KChFbnZFbnRyeSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT046Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSWNvbigoSWNvbil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklOSkVDVElPTl9UQVJHRVQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSW5qZWN0aW9uVGFyZ2V0KChJbmplY3Rpb25UYXJnZXQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0s6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTGlmZWN5Y2xlQ2FsbGJhY2soKExpZmVjeWNsZUNhbGxiYWNrKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTGlzdGVuZXIoKExpc3RlbmVyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb24oKE1lc3NhZ2VEZXN0aW5hdGlvbil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGOgotCQkJCXJldHVybiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZigoTWVzc2FnZURlc3RpbmF0aW9uUmVmKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUGFyYW1WYWx1ZSgoUGFyYW1WYWx1ZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGOgotCQkJCXJldHVybiB2YWxpZGF0ZVBlcnNpc3RlbmNlQ29udGV4dFJlZigoUGVyc2lzdGVuY2VDb250ZXh0UmVmKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUY6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUGVyc2lzdGVuY2VVbml0UmVmKChQZXJzaXN0ZW5jZVVuaXRSZWYpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUY6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUG9ydENvbXBvbmVudFJlZigoUG9ydENvbXBvbmVudFJlZil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUHJvcGVydHlUeXBlKChQcm9wZXJ0eVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGOgotCQkJCXJldHVybiB2YWxpZGF0ZVJlc291cmNlRW52UmVmKChSZXNvdXJjZUVudlJlZil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVSZXNvdXJjZVJlZigoUmVzb3VyY2VSZWYpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUnVuQXMoKFJ1bkFzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVTZWN1cml0eVJvbGUoKFNlY3VyaXR5Um9sZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGOgotCQkJCXJldHVybiB2YWxpZGF0ZVNlY3VyaXR5Um9sZVJlZigoU2VjdXJpdHlSb2xlUmVmKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUY6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VydmljZVJlZigoU2VydmljZVJlZil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VydmljZVJlZkhhbmRsZXIoKFNlcnZpY2VSZWZIYW5kbGVyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWluKChTZXJ2aWNlUmVmSGFuZGxlckNoYWluKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VydmljZVJlZkhhbmRsZXJDaGFpbnMoKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVVcmxQYXR0ZXJuVHlwZSgoVXJsUGF0dGVyblR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRWpiUmVmVHlwZSgoRWpiUmVmVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUVudkVudHJ5VHlwZSgoRW52RW50cnlUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKFBlcnNpc3RlbmNlQ29udGV4dFR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNfQVVUSF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVJlc0F1dGhUeXBlKChSZXNBdXRoVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU19TSEFSSU5HX1NDT1BFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmVzU2hhcmluZ1Njb3BlVHlwZSgoUmVzU2hhcmluZ1Njb3BlVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRFV0VZX1ZFUlNJT05fVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEZXdleVZlcnNpb25UeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTElOSzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFSkJMaW5rKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFamJSZWZOYW1lVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFamJSZWZUeXBlT2JqZWN0KChFamJSZWZUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiB2YWxpZGF0ZUVudkVudHJ5VHlwZU9iamVjdCgoRW52RW50cnlUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRlVMTFlfUVVBTElGSUVEX0NMQVNTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkhPTUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSG9tZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuSkFWQV9JREVOVElGSUVSOgotCQkJCXJldHVybiB2YWxpZGF0ZUphdmFJZGVudGlmaWVyKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5KQVZBX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSmF2YVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkpORElfTkFNRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVKTkRJTmFtZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTE9DQUw6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTG9jYWwoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxPQ0FMX0hPTUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTG9jYWxIb21lKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTks6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uTGluaygoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0KChNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVRIX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUGF0aFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCgoUGVyc2lzdGVuY2VDb250ZXh0VHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFTU9URToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSZW1vdGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU19BVVRIX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiB2YWxpZGF0ZVJlc0F1dGhUeXBlT2JqZWN0KChSZXNBdXRoVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU19TSEFSSU5HX1NDT1BFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiB2YWxpZGF0ZVJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3QoKFJlc1NoYXJpbmdTY29wZVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUm9sZU5hbWUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfTElTVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSgoTGlzdCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9RTkFNRV9QQVRURVJOOgotCQkJCXJldHVybiB2YWxpZGF0ZVNlcnZpY2VSZWZRbmFtZVBhdHRlcm4oKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlRSVUVfRkFMU0VfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVUcnVlRmFsc2VUeXBlKCgoQm9vbGVhbil2YWx1ZSkuYm9vbGVhblZhbHVlKCksIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5UUlVFX0ZBTFNFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiB2YWxpZGF0ZVRydWVGYWxzZVR5cGVPYmplY3QoKEJvb2xlYW4pdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWRlZmF1bHQ6IAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClkZXNjcmlwdGlvbiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgZGlzcGxheU5hbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpZGlzcGxheU5hbWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVqYkxvY2FsUmVmKEVqYkxvY2FsUmVmIGVqYkxvY2FsUmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWVqYkxvY2FsUmVmLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFamJSZWYoRWpiUmVmIGVqYlJlZiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCllamJSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5VHlwZShFbXB0eVR5cGUgZW1wdHlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWVtcHR5VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW52RW50cnkoRW52RW50cnkgZW52RW50cnksIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpZW52RW50cnksIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUljb24oSWNvbiBpY29uLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWljb24sIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUluamVjdGlvblRhcmdldChJbmplY3Rpb25UYXJnZXQgaW5qZWN0aW9uVGFyZ2V0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWluamVjdGlvblRhcmdldCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGlmZWN5Y2xlQ2FsbGJhY2soTGlmZWN5Y2xlQ2FsbGJhY2sgbGlmZWN5Y2xlQ2FsbGJhY2ssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpbGlmZWN5Y2xlQ2FsbGJhY2ssIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWxpc3RlbmVyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb24oTWVzc2FnZURlc3RpbmF0aW9uIG1lc3NhZ2VEZXN0aW5hdGlvbiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCltZXNzYWdlRGVzdGluYXRpb24sIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZihNZXNzYWdlRGVzdGluYXRpb25SZWYgbWVzc2FnZURlc3RpbmF0aW9uUmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KW1lc3NhZ2VEZXN0aW5hdGlvblJlZiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGFyYW1WYWx1ZShQYXJhbVZhbHVlIHBhcmFtVmFsdWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpcGFyYW1WYWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGVyc2lzdGVuY2VDb250ZXh0UmVmKFBlcnNpc3RlbmNlQ29udGV4dFJlZiBwZXJzaXN0ZW5jZUNvbnRleHRSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpcGVyc2lzdGVuY2VDb250ZXh0UmVmLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQZXJzaXN0ZW5jZVVuaXRSZWYoUGVyc2lzdGVuY2VVbml0UmVmIHBlcnNpc3RlbmNlVW5pdFJlZiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClwZXJzaXN0ZW5jZVVuaXRSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBvcnRDb21wb25lbnRSZWYoUG9ydENvbXBvbmVudFJlZiBwb3J0Q29tcG9uZW50UmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXBvcnRDb21wb25lbnRSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVByb3BlcnR5VHlwZShQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXByb3BlcnR5VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2VFbnZSZWYoUmVzb3VyY2VFbnZSZWYgcmVzb3VyY2VFbnZSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpcmVzb3VyY2VFbnZSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc291cmNlUmVmKFJlc291cmNlUmVmIHJlc291cmNlUmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXJlc291cmNlUmVmLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSdW5BcyhSdW5BcyBydW5BcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClydW5BcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VjdXJpdHlSb2xlKFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpc2VjdXJpdHlSb2xlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZWN1cml0eVJvbGVSZWYoU2VjdXJpdHlSb2xlUmVmIHNlY3VyaXR5Um9sZVJlZiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZWN1cml0eVJvbGVSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWYoU2VydmljZVJlZiBzZXJ2aWNlUmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXNlcnZpY2VSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZIYW5kbGVyKFNlcnZpY2VSZWZIYW5kbGVyIHNlcnZpY2VSZWZIYW5kbGVyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXNlcnZpY2VSZWZIYW5kbGVyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWluKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4gc2VydmljZVJlZkhhbmRsZXJDaGFpbiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZXJ2aWNlUmVmSGFuZGxlckNoYWluLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyhTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBzZXJ2aWNlUmVmSGFuZGxlckNoYWlucywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZXJ2aWNlUmVmSGFuZGxlckNoYWlucywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVXJsUGF0dGVyblR5cGUoVXJsUGF0dGVyblR5cGUgdXJsUGF0dGVyblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpdXJsUGF0dGVyblR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVqYlJlZlR5cGUoRWpiUmVmVHlwZSBlamJSZWZUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW52RW50cnlUeXBlKEVudkVudHJ5VHlwZSBlbnZFbnRyeVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBlcnNpc3RlbmNlQ29udGV4dFR5cGUoUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzQXV0aFR5cGUoUmVzQXV0aFR5cGUgcmVzQXV0aFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNTaGFyaW5nU2NvcGVUeXBlKFJlc1NoYXJpbmdTY29wZVR5cGUgcmVzU2hhcmluZ1Njb3BlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURld2V5VmVyc2lvblR5cGUoU3RyaW5nIGRld2V5VmVyc2lvblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZURld2V5VmVyc2lvblR5cGVfUGF0dGVybihkZXdleVZlcnNpb25UeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEZXdleVZlcnNpb25UeXBlX1BhdHRlcm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIERFV0VZX1ZFUlNJT05fVFlQRV9fUEFUVEVSTl9fVkFMVUVTID0KLQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdW10gewotCQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdIHsKLQkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiXFwuP1swLTldKyhcXC5bMC05XSspKiIpCi0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIFBhdHRlcm4gY29uc3RyYWludCBvZiAnPGVtPkRld2V5IFZlcnNpb24gVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURld2V5VmVyc2lvblR5cGVfUGF0dGVybihTdHJpbmcgZGV3ZXlWZXJzaW9uVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuREVXRVlfVkVSU0lPTl9UWVBFLCBkZXdleVZlcnNpb25UeXBlLCBERVdFWV9WRVJTSU9OX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRUpCTGluayhTdHJpbmcgZWpiTGluaywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVqYlJlZk5hbWVUeXBlKFN0cmluZyBlamJSZWZOYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVqYlJlZlR5cGVPYmplY3QoRWpiUmVmVHlwZSBlamJSZWZUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW52RW50cnlUeXBlT2JqZWN0KEVudkVudHJ5VHlwZSBlbnZFbnRyeVR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGdWxseVF1YWxpZmllZENsYXNzVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIb21lKFN0cmluZyBob21lLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSmF2YUlkZW50aWZpZXIoU3RyaW5nIGphdmFJZGVudGlmaWVyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVKYXZhSWRlbnRpZmllcl9QYXR0ZXJuKGphdmFJZGVudGlmaWVyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVKYXZhSWRlbnRpZmllcl9QYXR0ZXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBKQVZBX0lERU5USUZJRVJfX1BBVFRFUk5fX1ZBTFVFUyA9Ci0JCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKLQkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIigkfF98XFxwe0x9KShcXHB7TH18XFxwe05kfXxffCQpKiIpCi0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIFBhdHRlcm4gY29uc3RyYWludCBvZiAnPGVtPkphdmEgSWRlbnRpZmllcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUphdmFJZGVudGlmaWVyX1BhdHRlcm4oU3RyaW5nIGphdmFJZGVudGlmaWVyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oSmF2YWVlUGFja2FnZS5MaXRlcmFscy5KQVZBX0lERU5USUZJRVIsIGphdmFJZGVudGlmaWVyLCBKQVZBX0lERU5USUZJRVJfX1BBVFRFUk5fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSmF2YVR5cGUoU3RyaW5nIGphdmFUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVKYXZhVHlwZV9QYXR0ZXJuKGphdmFUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVKYXZhVHlwZV9QYXR0ZXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBKQVZBX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUyA9Ci0JCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKLQkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIlteXFxwe1p9XSoiKQotCQkJfQotCQl9OwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBQYXR0ZXJuIGNvbnN0cmFpbnQgb2YgJzxlbT5KYXZhIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVKYXZhVHlwZV9QYXR0ZXJuKFN0cmluZyBqYXZhVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9UWVBFLCBqYXZhVHlwZSwgSkFWQV9UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUpORElOYW1lKFN0cmluZyBqbmRpTmFtZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvY2FsKFN0cmluZyBsb2NhbCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvY2FsSG9tZShTdHJpbmcgbG9jYWxIb21lLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uTGluayhTdHJpbmcgbWVzc2FnZURlc3RpbmF0aW9uTGluaywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlKFN0cmluZyBtZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdChNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGF0aFR5cGUoU3RyaW5nIHBhdGhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdChQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIHBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZW1vdGUoU3RyaW5nIHJlbW90ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc0F1dGhUeXBlT2JqZWN0KFJlc0F1dGhUeXBlIHJlc0F1dGhUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdChSZXNTaGFyaW5nU2NvcGVUeXBlIHJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb2xlTmFtZShTdHJpbmcgcm9sZU5hbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUoTGlzdCBzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZV9JdGVtVHlwZShzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEl0ZW1UeXBlIGNvbnN0cmFpbnQgb2YgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBCaW5kaW5nIExpc3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZV9JdGVtVHlwZShMaXN0IHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZS5pdGVyYXRvcigpOyBpLmhhc05leHQoKSAmJiAocmVzdWx0IHx8IGRpYWdub3N0aWNzICE9IG51bGwpOyApIHsKLQkJCU9iamVjdCBpdGVtID0gaS5uZXh0KCk7Ci0JCQlpZiAoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX1RZUEUuaXNJbnN0YW5jZShpdGVtKSkgewotCQkJCXJlc3VsdCAmPSB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKChTdHJpbmcpaXRlbSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJcmVwb3J0RGF0YVZhbHVlVHlwZVZpb2xhdGlvbihKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRSwgaXRlbSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZShTdHJpbmcgc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlX01lbWJlclR5cGVzKHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNZW1iZXJUeXBlcyBjb25zdHJhaW50IG9mICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGVfTWVtYmVyVHlwZXMoU3RyaW5nIHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWlmIChkaWFnbm9zdGljcyAhPSBudWxsKSB7Ci0JCQlCYXNpY0RpYWdub3N0aWMgdGVtcERpYWdub3N0aWNzID0gbmV3IEJhc2ljRGlhZ25vc3RpYygpOwotCQkJaWYgKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLkFOWV9VUkkuaXNJbnN0YW5jZShzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSkpIHsKLQkJCQlpZiAoeG1sVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFueVVSSSgoU3RyaW5nKXNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlLCB0ZW1wRGlhZ25vc3RpY3MsIGNvbnRleHQpKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFLmlzSW5zdGFuY2Uoc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUpKSB7Ci0JCQkJaWYgKHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlKChTdHJpbmcpc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUsIHRlbXBEaWFnbm9zdGljcywgY29udGV4dCkpIHJldHVybiB0cnVlOwotCQkJfQotCQkJTGlzdCBjaGlsZHJlbiA9IHRlbXBEaWFnbm9zdGljcy5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCWRpYWdub3N0aWNzLmFkZCgoRGlhZ25vc3RpYyljaGlsZHJlbi5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLkFOWV9VUkkuaXNJbnN0YW5jZShzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSkpIHsKLQkJCQlpZiAoeG1sVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFueVVSSSgoU3RyaW5nKXNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlLCBudWxsLCBjb250ZXh0KSkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRS5pc0luc3RhbmNlKHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKSkgewotCQkJCWlmICh2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSgoU3RyaW5nKXNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlLCBudWxsLCBjb250ZXh0KSkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlKFN0cmluZyBzZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZV9QYXR0ZXJuKHNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlX1BhdHRlcm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIFNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFX19QQVRURVJOX19WQUxVRVMgPQotCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7Ci0JCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCIjIy4rIikKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgVVJJIEFsaWFzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVfUGF0dGVybihTdHJpbmcgc2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRSwgc2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlLCBTRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRV9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuKFN0cmluZyBzZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuX1BhdHRlcm4oc2VydmljZVJlZlFuYW1lUGF0dGVybiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlU2VydmljZVJlZlFuYW1lUGF0dGVybl9QYXR0ZXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBTRVJWSUNFX1JFRl9RTkFNRV9QQVRURVJOX19QQVRURVJOX19WQUxVRVMgPQotCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7Ci0JCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCJcXCp8KFtcXGktWzpdXVtcXGMtWzpdXSo6KT9bXFxpLVs6XV1bXFxjLVs6XV0qXFwqPyIpCi0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIFBhdHRlcm4gY29uc3RyYWludCBvZiAnPGVtPlNlcnZpY2UgUmVmIFFuYW1lIFBhdHRlcm48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuX1BhdHRlcm4oU3RyaW5nIHNlcnZpY2VSZWZRbmFtZVBhdHRlcm4sIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk4sIHNlcnZpY2VSZWZRbmFtZVBhdHRlcm4sIFNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk5fX1BBVFRFUk5fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHJ1ZUZhbHNlVHlwZShib29sZWFuIHRydWVGYWxzZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVRydWVGYWxzZVR5cGVfUGF0dGVybih0cnVlRmFsc2VUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVUcnVlRmFsc2VUeXBlX1BhdHRlcm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIFRSVUVfRkFMU0VfVFlQRV9fUEFUVEVSTl9fVkFMVUVTID0KLQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdW10gewotCQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdIHsKLQkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiKHRydWV8ZmFsc2UpIikKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+VHJ1ZSBGYWxzZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHJ1ZUZhbHNlVHlwZV9QYXR0ZXJuKGJvb2xlYW4gdHJ1ZUZhbHNlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuVFJVRV9GQUxTRV9UWVBFLCBuZXcgQm9vbGVhbih0cnVlRmFsc2VUeXBlKSwgVFJVRV9GQUxTRV9UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRydWVGYWxzZVR5cGVPYmplY3QoQm9vbGVhbiB0cnVlRmFsc2VUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUcnVlRmFsc2VUeXBlX1BhdHRlcm4odHJ1ZUZhbHNlVHlwZU9iamVjdC5ib29sZWFuVmFsdWUoKSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL0phdmFlZVZhbGlkYXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlWE1MUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVYTUxQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4ODdjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVYTUxQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkudXRpbC5YTUxQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlciBtZXRob2RzIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgWE1MIGRvY3VtZW50cwotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YWVlWE1MUHJvY2Vzc29yIGV4dGVuZHMgWE1MUHJvY2Vzc29yIHsKLQkvKioKLQkgKiBQdWJsaWMgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgdGhlIGhlbHBlci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YWVlWE1MUHJvY2Vzc29yKCkgewotCQlzdXBlcigoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UpKTsKLQkJSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGZvciAiKiIgYW5kICJ4bWwiIGZpbGUgZXh0ZW5zaW9ucyB0aGUgSmF2YWVlUmVzb3VyY2VGYWN0b3J5SW1wbCBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0UmVnaXN0cmF0aW9ucygpIHsKLQkJaWYgKHJlZ2lzdHJhdGlvbnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UmVnaXN0cmF0aW9ucygpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoWE1MX0VYVEVOU0lPTiwgbmV3IEphdmFlZVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChTVEFSX0VYVEVOU0lPTiwgbmV3IEphdmFlZVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJhdGlvbnM7Ci0JfQotCi19IC8vSmF2YWVlWE1MUHJvY2Vzc29yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNDg1MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQWN0aXZhdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICogCWV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbgotICogCWluIGl0cyBvcGVyYXRpb25hbCBlbnZpcm9ubWVudC4gVGhpcyBtYXkgaW5jbHVkZSBpbmZvcm1hdGlvbgotICogCWFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZAotICogCWRlc3RpbmF0aW9uIHR5cGUsIGV0Yy4KLSAqIAotICogCVRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZgotICogCW5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotICogCi0gKiAJVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0gKiAJbWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWcoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZhdGlvbkNvbmZpZyBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZ19BY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFjdGl2YXRpb25Db25maWcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIwZjhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBuYW1lL3ZhbHVlCi0gKiAJY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBwYWlyIGZvciBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0gKiAKLSAqIAlUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLSAqIAltZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSBlbGVtZW50IGNvbnRhaW5zCi0JICogCSAgICB0aGUgbmFtZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnR5IG9mCi0JICogCSAgICBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0JICogCi0JICogCSAgICBGb3IgSk1TIG1lc3NhZ2UtZHJpdmVuIGJlYW5zLCB0aGUgZm9sbG93aW5nIHByb3BlcnR5Ci0JICogCSAgICBuYW1lcyBhcmUgcmVjb2duaXplZDogYWNrbm93bGVkZ2VNb2RlLAotCSAqIAkgICAgbWVzc2FnZVNlbGVjdG9yLCBkZXN0aW5hdGlvblR5cGUsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHkKLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUgZWxlbWVudAotCSAqIAkgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLQkgKiAJICAgIHByb3BlcnR5IG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQXBwbGljYXRpb25FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDY3ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAgICAgICAgIFRoZSBhcHBsaWNhdGlvbi1leGNlcHRpb25UeXBlIGRlY2xhcmVzIGFuIGFwcGxpY2F0aW9uCi0gKiAgICAgICAgIGV4Y2VwdGlvbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotICogCi0gKiAgICAgICAgICAgICAtIHRoZSBleGNlcHRpb24gY2xhc3MuIFdoZW4gdGhlIGNvbnRhaW5lciByZWNlaXZlcwotICogICAgICAgICAgICAgICBhbiBleGNlcHRpb24gb2YgdGhpcyB0eXBlLCBpdCBpcyByZXF1aXJlZCB0bwotICogICAgICAgICAgICAgICBmb3J3YXJkIHRoaXMgZXhjZXB0aW9uIGFzIGFuIGFwcGxjYXRpb24gZXhjZXB0aW9uCi0gKiAgICAgICAgICAgICAgIHRvIHRoZSBjbGllbnQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGEgY2hlY2tlZAotICogICAgICAgICAgICAgICBvciB1bmNoZWNrZWQgZXhjZXB0aW9uLgotICogICAgICAgICAgICAgLSBhbiBvcHRpb25hbCByb2xsYmFjayBlbGVtZW50LiBJZiB0aGlzIGVsZW1lbnQgaXMKLSAqICAgICAgICAgICAgICAgc2V0IHRvIHRydWUsIHRoZSBjb250YWluZXIgbXVzdCByb2xsYmFjayB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICB0cmFuc2FjdGlvbiBiZWZvcmUgZm9yd2FyZGluZyB0aGUgZXhjZXB0aW9uIHRvIHRoZQotICogICAgICAgICAgICAgICBjbGllbnQuICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBmYWxzZS4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jZ2V0RXhjZXB0aW9uQ2xhc3MgPGVtPkV4Y2VwdGlvbiBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jaXNSb2xsYmFjayA8ZW0+Um9sbGJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjZXB0aW9uIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNlcHRpb24gQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNlcHRpb25DbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9uX0V4Y2VwdGlvbkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4Y2VwdGlvbkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNnZXRFeGNlcHRpb25DbGFzcyA8ZW0+RXhjZXB0aW9uIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNlcHRpb24gQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4Y2VwdGlvbkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeGNlcHRpb25DbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sbGJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGxiYWNrPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGxiYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJvbGxiYWNrKCkKLQkgKiBAc2VlICN1bnNldFJvbGxiYWNrKCkKLQkgKiBAc2VlICNzZXRSb2xsYmFjayhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9Sb2xsYmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSb2xsYmFjaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jaXNSb2xsYmFjayA8ZW0+Um9sbGJhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGxiYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJvbGxiYWNrKCkKLQkgKiBAc2VlICN1bnNldFJvbGxiYWNrKCkKLQkgKiBAc2VlICNpc1JvbGxiYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb2xsYmFjayhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jaXNSb2xsYmFjayA8ZW0+Um9sbGJhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Um9sbGJhY2soKQotCSAqIEBzZWUgI2lzUm9sbGJhY2soKQotCSAqIEBzZWUgI3NldFJvbGxiYWNrKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSb2xsYmFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNpc1JvbGxiYWNrIDxlbT5Sb2xsYmFjazwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbGJhY2s8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJvbGxiYWNrKCkKLQkgKiBAc2VlICNpc1JvbGxiYWNrKCkKLQkgKiBAc2VlICNzZXRSb2xsYmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Um9sbGJhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQXBwbGljYXRpb25FeGNlcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Bcm91bmRJbnZva2VUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Bcm91bmRJbnZva2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMjIwODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQXJvdW5kSW52b2tlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJvdW5kIEludm9rZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqICAgICAgICAgVGhlIGFyb3VuZC1pbnZva2UgdHlwZSBzcGVjaWZpZXMgYSBtZXRob2Qgb24gYQotICogICAgICAgICBjbGFzcyB0byBiZSBjYWxsZWQgZHVyaW5nIHRoZSBhcm91bmQgaW52b2tlIHBvcnRpb24gb2YgYW4KLSAqICAgICAgICAgZWpiIGludm9jYXRpb24uICBOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSBvbmx5IG9uZQotICogICAgICAgICBhcm91bmQgaW52b2tlIG1ldGhvZCBhbmQgdGhhdCB0aGUgbWV0aG9kIG1heSBub3QgYmUKLSAqICAgICAgICAgb3ZlcmxvYWRlZC4KLSAqIAotICogICAgICAgICBJZiB0aGUgY2xhc3MgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4KLSAqICAgICAgICAgdGhlIGNsYXNzIGRlZmluaW5nIHRoZSBjYWxsYmFjayBpcyBhc3N1bWVkIHRvIGJlIHRoZQotICogICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBvciBjb21wb25lbnQgY2xhc3MgaW4gc2NvcGUgYXQgdGhlCi0gKiAgICAgICAgIGxvY2F0aW9uIGluIHRoZSBkZXNjcmlwdG9yIGluIHdoaWNoIHRoZSBhcm91bmQgaW52b2tlCi0gKiAgICAgICAgIGRlZmluaXRpb24gYXBwZWFycy4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZSNnZXRDbGFzc18gPGVtPkNsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFyb3VuZEludm9rZVR5cGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJvdW5kSW52b2tlVHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFyb3VuZEludm9rZVR5cGVfQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xhc3NfKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlI2dldENsYXNzXyA8ZW0+Q2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbGFzc18oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1ldGhvZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBcm91bmRJbnZva2VUeXBlX01ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZSNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBcm91bmRJbnZva2VUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQXNzZW1ibHlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Bc3NlbWJseURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5MTEzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Bc3NlbWJseURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXNzZW1ibHkgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIGRlZmluZXMKLSAqIAlhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4KLSAqIAotICogCVRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUKLSAqIAlmb2xsb3dpbmcgcGFydHM6IHRoZSBkZWZpbml0aW9uIG9mIHNlY3VyaXR5IHJvbGVzLCB0aGUKLSAqIAlkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgdGhlIGRlZmluaXRpb24gb2YKLSAqIAl0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGZvciBlbnRlcnByaXNlIGJlYW5zIHdpdGgKLSAqIAljb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiwgdGhlIGRlZmluaXRpb24KLSAqICAgICAgICAgb2YgaW50ZXJjZXB0b3IgYmluZGluZ3MsIGEgbGlzdCBvZgotICogCW1ldGhvZHMgdG8gYmUgZXhjbHVkZWQgZnJvbSBiZWluZyBpbnZva2VkLCBhbmQgYSBsaXN0IG9mCi0gKiAgICAgICAgIGV4Y2VwdGlvbiB0eXBlcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuCi0gKiAKLSAqIAlBbGwgdGhlIHBhcnRzIGFyZSBvcHRpb25hbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZQotICogCW9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotICogCi0gKiAJUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLSAqIAlkZXNjcmlwdG9yIGlzIG9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0U2VjdXJpdHlSb2xlcyA8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRNZXRob2RQZXJtaXNzaW9ucyA8ZW0+TWV0aG9kIFBlcm1pc3Npb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25zIDxlbT5Db250YWluZXIgVHJhbnNhY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncyA8ZW0+SW50ZXJjZXB0b3IgQmluZGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldEV4Y2x1ZGVMaXN0IDxlbT5FeGNsdWRlIExpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbnMgPGVtPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFzc2VtYmx5RGVzY3JpcHRvciBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZWN1cml0eVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGVybWlzc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQZXJtaXNzaW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQZXJtaXNzaW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXRob2RQZXJtaXNzaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFpbmVyIFRyYW5zYWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZXIgVHJhbnNhY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0NvbnRhaW5lclRyYW5zYWN0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBCaW5kaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3IgQmluZGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBCaW5kaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0ludGVyY2VwdG9yQmluZGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEludGVyY2VwdG9yQmluZGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBMaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNsdWRlIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBMaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXhjbHVkZUxpc3QgZ2V0RXhjbHVkZUxpc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRFeGNsdWRlTGlzdCA8ZW0+RXhjbHVkZSBMaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4Y2x1ZGVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbiBFeGNlcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFzc2VtYmx5RGVzY3JpcHRvcl9BcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFzc2VtYmx5RGVzY3JpcHRvcl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFzc2VtYmx5RGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NNUEZpZWxkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVBGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjliODIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NNUEZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNNUCBGaWVsZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGNtcC1maWVsZFR5cGUgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZQotICogCWNtcC1maWVsZFR5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkLAotICogCWFuZCB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVBGaWVsZCNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDTVBGaWVsZCgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDTVBGaWVsZCBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q01QRmllbGRfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAqIAkgICAgY29udGFpbmVyIG1hbmFnZWQgZmllbGQuCi0JICogCi0JICogCSAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgKiAJICAgIGNtcC12ZXJzaW9uIDIueCBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UKLQkgKiAJICAgIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzIHdob3NlCi0JICogCSAgICBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci0JICogCSAgICBmaWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdCBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwKLQkgKiAJICAgIHByZWZpeGVkIGJ5ICJnZXQiIG9yICJzZXQiLgotCSAqIAotCSAqIAkgICAgVGhlIG5hbWUgb2YgdGhlIGNtcC1maWVsZCBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JICogCSAgICBjbXAtdmVyc2lvbiAxLnggbXVzdCBkZW5vdGUgYSBwdWJsaWMgZmllbGQgb2YgdGhlCi0JICogCSAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENNUEZpZWxkX0ZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDTVBGaWVsZF9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQ01QRmllbGQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVJGaWVsZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ01SRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmZDNlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVJGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DTVIgRmllbGQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBjbXItZmllbGRUeXBlIGRlc2NyaWJlcyB0aGUgYmVhbiBwcm92aWRlcidzIHZpZXcgb2YKLSAqIAlhIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotICogCXRoZSBuYW1lIGFuZCB0aGUgY2xhc3MgdHlwZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2Ugb2YgYQotICogCXJvbGUgb2YgYSByZWxhdGlvbnNoaXAuIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50Ci0gKiAJY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yCi0gKiAJbWV0aG9kcyBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgaXMKLSAqIAl1c2VkIG9ubHkgZm9yIGNvbGxlY3Rpb24tdmFsdWVkIGNtci1maWVsZHMuIEl0IHNwZWNpZmllcyB0aGUKLSAqIAl0eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZC4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkI2dldENtckZpZWxkTmFtZSA8ZW0+Q21yIEZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkI2dldENtckZpZWxkVHlwZSA8ZW0+Q21yIEZpZWxkIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDTVJGaWVsZCgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDTVJGaWVsZCBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q01SRmllbGRfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNtciBGaWVsZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICogCSAgICBsb2dpY2FsIHJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4KLQkgKiAJICAgIGNsYXNzLiBUaGUgbmFtZSBvZiB0aGUgY21yLWZpZWxkIG11c3QgYmVnaW4gd2l0aCBhCi0JICogCSAgICBsb3dlcmNhc2UgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMKLQkgKiAJICAgIHdob3NlIG5hbWVzIGNvbnNpc3Qgb2YgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0JICogCSAgICBzcGVjaWZpZWQgYnkgY21yLWZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0Ci0JICogCSAgICBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNtciBGaWVsZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDbXJGaWVsZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDTVJGaWVsZF9DbXJGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q21yRmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCNnZXRDbXJGaWVsZE5hbWUgPGVtPkNtciBGaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbXIgRmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q21yRmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDbXJGaWVsZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNtciBGaWVsZCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImphdmEudXRpbC5Db2xsZWN0aW9uIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNtciBGaWVsZCBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNtciBGaWVsZCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkVHlwZQotCSAqIEBzZWUgI2lzU2V0Q21yRmllbGRUeXBlKCkKLQkgKiBAc2VlICN1bnNldENtckZpZWxkVHlwZSgpCi0JICogQHNlZSAjc2V0Q21yRmllbGRUeXBlKENNUkZpZWxkVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q01SRmllbGRfQ21yRmllbGRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ01SRmllbGRUeXBlIGdldENtckZpZWxkVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0Q21yRmllbGRUeXBlIDxlbT5DbXIgRmllbGQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q21yIEZpZWxkIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlCi0JICogQHNlZSAjaXNTZXRDbXJGaWVsZFR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0Q21yRmllbGRUeXBlKCkKLQkgKiBAc2VlICNnZXRDbXJGaWVsZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENtckZpZWxkVHlwZShDTVJGaWVsZFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCNnZXRDbXJGaWVsZFR5cGUgPGVtPkNtciBGaWVsZCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENtckZpZWxkVHlwZSgpCi0JICogQHNlZSAjZ2V0Q21yRmllbGRUeXBlKCkKLQkgKiBAc2VlICNzZXRDbXJGaWVsZFR5cGUoQ01SRmllbGRUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q21yRmllbGRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkI2dldENtckZpZWxkVHlwZSA8ZW0+Q21yIEZpZWxkIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNtciBGaWVsZCBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDbXJGaWVsZFR5cGUoKQotCSAqIEBzZWUgI2dldENtckZpZWxkVHlwZSgpCi0JICogQHNlZSAjc2V0Q21yRmllbGRUeXBlKENNUkZpZWxkVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENtckZpZWxkVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENNUkZpZWxkX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDTVJGaWVsZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NNUkZpZWxkVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ01SRmllbGRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTI4ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ01SRmllbGRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkNNUiBGaWVsZCBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjbGFzcyBvZiBhCi0gKiAJY29sbGVjdGlvbi12YWx1ZWQgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eQotICogCWJlYW4gY2xhc3MuIFRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IHVzaW5nIGNtci1maWVsZC10eXBlVHlwZQotICogCW11c3QgYmUgZWl0aGVyOiBqYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBqYXZhLnV0aWwuU2V0LgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDTVJGaWVsZFR5cGUoKQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ01SRmllbGRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIFV0aWwgQ29sbGVjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SmF2YSBVdGlsIENvbGxlY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9VVElMX0NPTExFQ1RJT05fTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfVVRJTF9DT0xMRUNUSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkphdmEgVXRpbCBTZXQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkphdmEgVXRpbCBTZXQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSkFWQV9VVElMX1NFVF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9VVElMX1NFVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIFV0aWwgQ29sbGVjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX1VUSUxfQ09MTEVDVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ01SRmllbGRUeXBlIEpBVkFfVVRJTF9DT0xMRUNUSU9OX0xJVEVSQUwgPSBuZXcgQ01SRmllbGRUeXBlKEpBVkFfVVRJTF9DT0xMRUNUSU9OLCAiamF2YVV0aWxDb2xsZWN0aW9uIiwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBVdGlsIFNldDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX1VUSUxfU0VUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDTVJGaWVsZFR5cGUgSkFWQV9VVElMX1NFVF9MSVRFUkFMID0gbmV3IENNUkZpZWxkVHlwZShKQVZBX1VUSUxfU0VULCAiamF2YVV0aWxTZXQiLCAiamF2YS51dGlsLlNldCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5DTVIgRmllbGQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ01SRmllbGRUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IENNUkZpZWxkVHlwZVtdIHsKLQkJCUpBVkFfVVRJTF9DT0xMRUNUSU9OX0xJVEVSQUwsCi0JCQlKQVZBX1VUSUxfU0VUX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+Q01SIEZpZWxkIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNNUiBGaWVsZCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ01SRmllbGRUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJQ01SRmllbGRUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q01SIEZpZWxkIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDTVJGaWVsZFR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlDTVJGaWVsZFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNNUiBGaWVsZCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ01SRmllbGRUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBKQVZBX1VUSUxfQ09MTEVDVElPTjogcmV0dXJuIEpBVkFfVVRJTF9DT0xMRUNUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIEpBVkFfVVRJTF9TRVQ6IHJldHVybiBKQVZBX1VUSUxfU0VUX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENNUkZpZWxkVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vQ01SRmllbGRUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DbXBWZXJzaW9uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ21wVmVyc2lvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzNzg1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DbXBWZXJzaW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5DbXAgVmVyc2lvbiBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGNtcC12ZXJzaW9uVHlwZSBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4KLSAqIAl3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiBJdCBpcyB1c2VkIGJ5Ci0gKiAJY21wLXZlcnNpb24gZWxlbWVudHMuCi0gKiAKLSAqIAlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0gKiAKLSAqIAkgICAgMS54Ci0gKiAJICAgIDIueAotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDbXBWZXJzaW9uVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbXBWZXJzaW9uVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+MVg8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPjFYPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI18xWF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgXzFYID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPjJYPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj4yWDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNfMlhfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF8yWCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj4xWDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNfMVgKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENtcFZlcnNpb25UeXBlIF8xWF9MSVRFUkFMID0gbmV3IENtcFZlcnNpb25UeXBlKF8xWCwgIl8xWCIsICIxLngiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj4yWDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNfMlgKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENtcFZlcnNpb25UeXBlIF8yWF9MSVRFUkFMID0gbmV3IENtcFZlcnNpb25UeXBlKF8yWCwgIl8yWCIsICIyLngiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Q21wIFZlcnNpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ21wVmVyc2lvblR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgQ21wVmVyc2lvblR5cGVbXSB7Ci0JCQlfMVhfTElURVJBTCwKLQkJCV8yWF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkNtcCBWZXJzaW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNtcCBWZXJzaW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDbXBWZXJzaW9uVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUNtcFZlcnNpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q21wIFZlcnNpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENtcFZlcnNpb25UeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJQ21wVmVyc2lvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNtcCBWZXJzaW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDbXBWZXJzaW9uVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgXzFYOiByZXR1cm4gXzFYX0xJVEVSQUw7Ci0JCQljYXNlIF8yWDogcmV0dXJuIF8yWF9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDbXBWZXJzaW9uVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vQ21wVmVyc2lvblR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDIyYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgY29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIKLSAqIAltdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotICogCW1ldGhvZCBpbnZvY2F0aW9ucy4gSXQgZGVmaW5lcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYQotICogCWxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuIFRoZQotICogCXRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkCi0gKiAJbWV0aG9kcy4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0TWV0aG9kcyA8ZW0+TWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlI2dldFRyYW5zQXR0cmlidXRlIDxlbT5UcmFucyBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zIEF0dHJpYnV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJOb3RTdXBwb3J0ZWQiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHJhbnMgQXR0cmlidXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zIEF0dHJpYnV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUKLQkgKiBAc2VlICNpc1NldFRyYW5zQXR0cmlidXRlKCkKLQkgKiBAc2VlICN1bnNldFRyYW5zQXR0cmlidXRlKCkKLQkgKiBAc2VlICNzZXRUcmFuc0F0dHJpYnV0ZShUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9UcmFuc0F0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBnZXRUcmFuc0F0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlI2dldFRyYW5zQXR0cmlidXRlIDxlbT5UcmFucyBBdHRyaWJ1dGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zIEF0dHJpYnV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUKLQkgKiBAc2VlICNpc1NldFRyYW5zQXR0cmlidXRlKCkKLQkgKiBAc2VlICN1bnNldFRyYW5zQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRUcmFuc0F0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHJhbnNBdHRyaWJ1dGUoVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlI2dldFRyYW5zQXR0cmlidXRlIDxlbT5UcmFucyBBdHRyaWJ1dGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHJhbnNBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldFRyYW5zQXR0cmlidXRlKCkKLQkgKiBAc2VlICNzZXRUcmFuc0F0dHJpYnV0ZShUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUcmFuc0F0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0VHJhbnNBdHRyaWJ1dGUgPGVtPlRyYW5zIEF0dHJpYnV0ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnMgQXR0cmlidXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmFuc0F0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI3NldFRyYW5zQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFRyYW5zQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRUpCSmFyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJKYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxMWNhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJKYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RUpCIEphcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGVqYi1qYXJUeXBlIGRlZmluZXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCCi0gKiAJZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJdCBjb250YWlucwotICogCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZQotICogCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICogCSAgICAtIGFuIG9wdGlvbmFsIGljb24gdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gKiAJICAgICAgaWNvbiBmaWxlIG5hbWUKLSAqIAkgICAgLSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBpbmNsdWRlZAotICogCSAgICAgIGVudGVycHJpc2UgYmVhbnMgdGhhdCBpcyBub3Qgc3BlY2lmaWVkIHRocm91Z2gKLSAqICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMKLSAqICAgICAgICAgICAgIC0gc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBpbnRlcmNlcHRvciBjbGFzc2VzCi0gKiAJICAgIC0gYSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLAotICogCSAgICAgIGlmIGFueS4KLSAqIAkgICAgLSBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUKLSAqIAkgICAgICBlamItamFyLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRFbnRlcnByaXNlQmVhbnMgPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRJbnRlcmNlcHRvcnMgPGVtPkludGVyY2VwdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldFJlbGF0aW9uc2hpcHMgPGVtPlJlbGF0aW9uc2hpcHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRBc3NlbWJseURlc2NyaXB0b3IgPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRFamJDbGllbnRKYXIgPGVtPkVqYiBDbGllbnQgSmFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkphciBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJfRGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyX0ljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZSBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbnRlcnByaXNlQmVhbnMoRW50ZXJwcmlzZUJlYW5zKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRW50ZXJwcmlzZUJlYW5zIGdldEVudGVycHJpc2VCZWFucygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEVudGVycHJpc2VCZWFucyA8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZUJlYW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRlcnByaXNlQmVhbnMoRW50ZXJwcmlzZUJlYW5zIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyY2VwdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW50ZXJjZXB0b3JzKEludGVyY2VwdG9yc1R5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphcl9JbnRlcmNlcHRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnRlcmNlcHRvcnNUeXBlIGdldEludGVyY2VwdG9ycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEludGVyY2VwdG9ycyA8ZW0+SW50ZXJjZXB0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEludGVyY2VwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW50ZXJjZXB0b3JzKEludGVyY2VwdG9yc1R5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVsYXRpb25zaGlwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWxhdGlvbnNoaXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZWxhdGlvbnNoaXBzKFJlbGF0aW9uc2hpcHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphcl9SZWxhdGlvbnNoaXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVsYXRpb25zaGlwcyBnZXRSZWxhdGlvbnNoaXBzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0UmVsYXRpb25zaGlwcyA8ZW0+UmVsYXRpb25zaGlwczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVsYXRpb25zaGlwcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2VtYmx5IERlc2NyaXB0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLQkgKiAJICAgIGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUKLQkgKiAJICAgIHByb2R1Y2VyLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXNzZW1ibHlEZXNjcmlwdG9yIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEFzc2VtYmx5RGVzY3JpcHRvciA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBDbGllbnQgSmFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJICAgIAotCSAqIAotCSAqIAkgICAgICBUaGUgb3B0aW9uYWwgZWpiLWNsaWVudC1qYXIgZWxlbWVudCBzcGVjaWZpZXMgYSBKQVIKLQkgKiAJICAgICAgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzcyBmaWxlcyBuZWNlc3NhcnkgZm9yIGEKLQkgKiAJICAgICAgY2xpZW50IHByb2dyYW0gdG8gYWNjZXNzIHRoZQotCSAqIAkgICAgICBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBlamItamFyIGZpbGUuCi0JICogCi0JICogCSAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogCQkgICZsdDtlamItY2xpZW50LWphciZndDtlbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXIKLQkgKiAJCSAgJmx0Oy9lamItY2xpZW50LWphciZndDsKLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBDbGllbnQgSmFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJDbGllbnRKYXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJfRWpiQ2xpZW50SmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYkNsaWVudEphcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEVqYkNsaWVudEphciA8ZW0+RWpiIENsaWVudCBKYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBDbGllbnQgSmFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJDbGllbnRKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYkNsaWVudEphcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphcl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKLQkgKiAJICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIG90aGVyIHJlbGF0ZWQgZGVwbG95bWVudAotCSAqIAkgIGRlc2NyaXB0b3JzIGZvciB0aGlzIG1vZHVsZSAoZS5nLiwgd2ViIHNlcnZpY2UKLQkgKiAJICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcwotCSAqIAkgIGZpbGVzIGF2YWlsYWJsZSB0byB0aGlzIG1vZHVsZSBhbmQgcGFja2FnZWQgd2l0aAotCSAqIAkgIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlIGV4YW1pbmVkIGZvciBhbm5vdGF0aW9ucwotCSAqIAkgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIAkgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50Ci0JICogCSAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKLQkgKiAJICBpbmZvcm1hdGlvbiwgd2hpY2ggbWlnaHQgYmUgcHJlc2VudCBpbiB0aGUgY2xhc3MgZmlsZXMKLQkgKiAJICBvZiB0aGUgYXBwbGljYXRpb24uCi0JICogCi0JICogCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgbm90IHNwZWNpZmllZCBvciBpcyBzZXQgdG8KLQkgKiAJICAiZmFsc2UiLCB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgZXhhbWluZSB0aGUgY2xhc3MKLQkgKiAJICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcwotCSAqIAkgIHNwZWNpZmllZCBieSB0aGUgc3BlY2lmaWNhdGlvbnMuCi0JICogCi0JICogCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICN1bnNldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyX01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3Vuc2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1ldGFkYXRhQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1ldGFkYXRhQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMy4wIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICBUaGUgdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlCi0JICogCSAgRUpCIHNwZWNpZmljYXRpb24gdGhhdCB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgbXVzdAotCSAqIAkgIGNvbXBseSB3aXRoLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95bWVudCB0b29scwotCSAqIAkgIHRvIHZhbGlkYXRlIGEgcGFydGljdWxhciBFSkIgRGVwbG95bWVudAotCSAqIAkgIERlc2NyaXB0b3Igd2l0aCByZXNwZWN0IHRvIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgRUpCCi0JICogCSAgc2NoZW1hLgotCSAqIAotCSAqIAkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICN1bnNldFZlcnNpb24oKQotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJfVmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICN1bnNldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZlcnNpb24oKTsKLQotfSAvLyBFSkJKYXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzYjc2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgSmFyIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0RWpiSmFyIDxlbT5FamIgSmFyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldE1peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIEphcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCVRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIGVqYi1qYXIgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCSAqIAotCSAqICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgSmFyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFamJKYXIoRUpCSmFyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9FamJKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFSkJKYXIgZ2V0RWpiSmFyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRFamJKYXIgPGVtPkVqYiBKYXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBKYXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVqYkphcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWpiSmFyKEVKQkphciB2YWx1ZSk7Ci0KLX0gLy8gRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJSZWxhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRUpCUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzYzJlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgUmVsYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBlamItcmVsYXRpb25UeXBlIGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3bwotICogCWVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiAgSXQgaXMgdXNlZAotICogCWJ5IGVqYi1yZWxhdGlvbiBlbGVtZW50cy4gSXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbjsgYW4KLSAqIAlvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28KLSAqIAlyZWxhdGlvbnNoaXAgcm9sZSBkZWNsYXJhdGlvbnMsIGRlZmluZWQgYnkgdGhlCi0gKiAJZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnRzLiBUaGUgbmFtZSBvZiB0aGUKLSAqIAlyZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgotICogCWZpbGUuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiNnZXRFamJSZWxhdGlvbk5hbWUgPGVtPkVqYiBSZWxhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiNnZXRFamJSZWxhdGlvbnNoaXBSb2xlcyA8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb24jZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQlJlbGF0aW9uIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlbGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQotCSAqIAkgICAgd2l0aGluIHRoZSBlamItamFyIGZpbGUgZm9yIGEgcmVsYXRpb25zaGlwLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlbGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYlJlbGF0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFamJSZWxhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uI2dldEVqYlJlbGF0aW9uTmFtZSA8ZW0+RWpiIFJlbGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWxhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJSZWxhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYlJlbGF0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlbGF0aW9uc2hpcCBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWxhdGlvbnNoaXAgUm9sZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uc2hpcFJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFamJSZWxhdGlvbnNoaXBSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFSkJSZWxhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQlJlbGF0aW9uc2hpcFJvbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQlJlbGF0aW9uc2hpcFJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5OGVjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJSZWxhdGlvbnNoaXBSb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGRlc2NyaWJlcyBhIHJvbGUgd2l0aGluIGEKLSAqIAkgIHJlbGF0aW9uc2hpcC4gVGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4KLSAqIAotICogCSAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwKLSAqIAkgIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEKLSAqIAkgIHNwZWNpZmljYXRpb24gb2YgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcm9sZTsgYW4gb3B0aW9uYWwKLSAqIAkgIHNwZWNpZmljYXRpb24gb2YgY2FzY2FkZS1kZWxldGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHJvbGU7Ci0gKiAJICB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBjbXItZmllbGQsIGlmIGFueSwKLSAqIAkgIGJ5IG1lYW5zIG9mIHdoaWNoIHRoZSBvdGhlciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgaXMKLSAqIAkgIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZS4KLSAqIAotICogCSAgVGhlIG11bHRpcGxpY2l0eSBhbmQgcm9sZS1zb3VyY2UgZWxlbWVudCBhcmUgbWFuZGF0b3J5LgotICogCi0gKiAJICBUaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgZGVzaWduYXRlcyBhbiBlbnRpdHkKLSAqIAkgIGJlYW4gYnkgbWVhbnMgb2YgYW4gZWpiLW5hbWUgZWxlbWVudC4gRm9yIGJpZGlyZWN0aW9uYWwKLSAqIAkgIHJlbGF0aW9uc2hpcHMsIGJvdGggcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgbXVzdCBkZWNsYXJlIGEKLSAqIAkgIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHRoYXQgc3BlY2lmaWVzIGEgY21yLWZpZWxkCi0gKiAJICBpbiB0ZXJtcyBvZiB3aGljaCB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkLiBUaGUgbGFjayBvZgotICogCSAgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUgc3BlY2lmaWVzCi0gKiAJICB0aGF0IHRoZSByZWxhdGlvbnNoaXAgaXMgdW5pZGlyZWN0aW9uYWwgaW4gbmF2aWdhYmlsaXR5IGFuZAotICogCSAgdGhlIGVudGl0eSBiZWFuIHRoYXQgcGFydGljaXBhdGVzIGluIHRoZSByZWxhdGlvbnNoaXAgaXMKLSAqIAkgICJub3QgYXdhcmUiIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gKiAKLSAqIAkgIEV4YW1wbGU6Ci0gKiAKLSAqIAkgICZsdDtlamItcmVsYXRpb24mZ3Q7Ci0gKiAJICAgICAgJmx0O2VqYi1yZWxhdGlvbi1uYW1lJmd0O1Byb2R1Y3QtTGluZUl0ZW0mbHQ7L2VqYi1yZWxhdGlvbi1uYW1lJmd0OwotICogCSAgICAgICZsdDtlamItcmVsYXRpb25zaGlwLXJvbGUmZ3Q7Ci0gKiAJCSAgJmx0O2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lJmd0O3Byb2R1Y3QtaGFzLWxpbmVpdGVtcwotICogCQkgICZsdDsvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUmZ3Q7Ci0gKiAJCSAgJmx0O211bHRpcGxpY2l0eSZndDtPbmUmbHQ7L211bHRpcGxpY2l0eSZndDsKLSAqIAkJICAmbHQ7cmVsYXRpb25zaGlwLXJvbGUtc291cmNlJmd0OwotICogCQkgICZsdDtlamItbmFtZSZndDtQcm9kdWN0RUpCJmx0Oy9lamItbmFtZSZndDsKLSAqIAkJICAmbHQ7L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSZndDsKLSAqIAkgICAgICAgJmx0Oy9lamItcmVsYXRpb25zaGlwLXJvbGUmZ3Q7Ci0gKiAJICAmbHQ7L2VqYi1yZWxhdGlvbiZndDsKLSAqIAotICogCSAgCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lIDxlbT5FamIgUmVsYXRpb25zaGlwIFJvbGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRNdWx0aXBsaWNpdHkgPGVtPk11bHRpcGxpY2l0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRDYXNjYWRlRGVsZXRlIDxlbT5DYXNjYWRlIERlbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlIDxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0Q21yRmllbGQgPGVtPkNtciBGaWVsZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFSkJSZWxhdGlvbnNoaXBSb2xlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUmVsYXRpb25zaGlwIFJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgZWxlbWVudCBkZWZpbmVzIGEKLQkgKiAJICAgIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4KLQkgKiAJICAgIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUKLQkgKiAJICAgIHNhbWUgbmFtZSBmb3IgYSByb2xlLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVsYXRpb25zaGlwIFJvbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0VqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lIDxlbT5FamIgUmVsYXRpb25zaGlwIFJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Ik9uZSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TXVsdGlwbGljaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxpY2l0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NdWx0aXBsaWNpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI3Vuc2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9NdWx0aXBsaWNpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNdWx0aXBsaWNpdHlUeXBlIGdldE11bHRpcGxpY2l0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRNdWx0aXBsaWNpdHkgPGVtPk11bHRpcGxpY2l0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGljaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGUKLQkgKiBAc2VlICNpc1NldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjdW5zZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI2dldE11bHRpcGxpY2l0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TXVsdGlwbGljaXR5KE11bHRpcGxpY2l0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldE11bHRpcGxpY2l0eSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjZ2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE11bHRpcGxpY2l0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldE11bHRpcGxpY2l0eSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsaWNpdHk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjZ2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE11bHRpcGxpY2l0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBEZWxldGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhCi0JICogCSAgICBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0JICogCSAgICBlbnRpdHkgYmVhbnMgaXMgZGVwZW5kZW50IHVwb24gdGhlIGxpZmV0aW1lIG9mCi0JICogCSAgICBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBjYW4KLQkgKiAJICAgIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUKLQkgKiAJICAgIGVsZW1lbnQgY29udGFpbmVkIGluIGFuIGVqYi1yZWxhdGlvbiBlbGVtZW50IGluCi0JICogCSAgICB3aGljaCB0aGUgb3RoZXIgZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0JICogCSAgICBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgRGVsZXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlRGVsZXRlKEVtcHR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DYXNjYWRlRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRW1wdHlUeXBlIGdldENhc2NhZGVEZWxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0Q2FzY2FkZURlbGV0ZSA8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgRGVsZXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYXNjYWRlRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlRGVsZXRlKEVtcHR5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uc2hpcFJvbGVfUmVsYXRpb25zaGlwUm9sZVNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlIGdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZSA8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q21yIEZpZWxkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbXIgRmllbGQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q21yIEZpZWxkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDbXJGaWVsZChDTVJGaWVsZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNNUkZpZWxkIGdldENtckZpZWxkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldENtckZpZWxkIDxlbT5DbXIgRmllbGQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNtciBGaWVsZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q21yRmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENtckZpZWxkKENNUkZpZWxkIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEVKQlJlbGF0aW9uc2hpcFJvbGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FamJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FamJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYTIyMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRWpiRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVqYkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFamJGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2YXRpb25Db25maWcgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uRXhjZXB0aW9uIGNyZWF0ZUFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFyb3VuZCBJbnZva2UgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJvdW5kIEludm9rZSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcm91bmRJbnZva2VUeXBlIGNyZWF0ZUFyb3VuZEludm9rZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXNzZW1ibHlEZXNjcmlwdG9yIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DTVAgRmllbGQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNNUCBGaWVsZDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ01QRmllbGQgY3JlYXRlQ01QRmllbGQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q01SIEZpZWxkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DTVIgRmllbGQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNNUkZpZWxkIGNyZWF0ZUNNUkZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250YWluZXIgVHJhbnNhY3Rpb24gVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlIGNyZWF0ZUNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FSkIgSmFyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FSkIgSmFyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFSkJKYXIgY3JlYXRlRUpCSmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVKQiBKYXIgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FSkIgSmFyIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IgY3JlYXRlRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FSkIgUmVsYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVKQlJlbGF0aW9uIGNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVKQiBSZWxhdGlvbnNoaXAgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFSkJSZWxhdGlvbnNoaXBSb2xlIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRW50ZXJwcmlzZUJlYW5zIGNyZWF0ZUVudGVycHJpc2VCZWFucygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRpdHkgQmVhbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW50aXR5IEJlYW48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVudGl0eUJlYW4gY3JlYXRlRW50aXR5QmVhbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGNsdWRlIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXhjbHVkZUxpc3QgY3JlYXRlRXhjbHVkZUxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5pdCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5pdCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5pdE1ldGhvZFR5cGUgY3JlYXRlSW5pdE1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZXJjZXB0b3IgQmluZGluZyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcmNlcHRvciBCaW5kaW5nIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUludGVyY2VwdG9yQmluZGluZ1R5cGUgY3JlYXRlSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcmNlcHRvciBPcmRlciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcmNlcHRvciBPcmRlciBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnRlcmNlcHRvck9yZGVyVHlwZSBjcmVhdGVJbnRlcmNlcHRvck9yZGVyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcmNlcHRvcnMgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZXJjZXB0b3JzIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUludGVyY2VwdG9yc1R5cGUgY3JlYXRlSW50ZXJjZXB0b3JzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcmNlcHRvciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcmNlcHRvciBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnRlcmNlcHRvclR5cGUgY3JlYXRlSW50ZXJjZXB0b3JUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1lc3NhZ2VEcml2ZW5CZWFuIGNyZWF0ZU1lc3NhZ2VEcml2ZW5CZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBhcmFtcyBjcmVhdGVNZXRob2RQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQZXJtaXNzaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQZXJtaXNzaW9uIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RUeXBlIGNyZWF0ZU1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TmFtZWQgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVkIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlOYW1lZE1ldGhvZFR5cGUgY3JlYXRlTmFtZWRNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlF1ZXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5RdWVyeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUXVlcnkgY3JlYXRlUXVlcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UXVlcnkgTWV0aG9kPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVF1ZXJ5TWV0aG9kIGNyZWF0ZVF1ZXJ5TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2UgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgY3JlYXRlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVsYXRpb25zaGlwcyBjcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlbW92ZSBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVtb3ZlIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZW1vdmVNZXRob2RUeXBlIGNyZWF0ZVJlbW92ZU1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VjdXJpdHlJZGVudGl0eVR5cGUgY3JlYXRlU2VjdXJpdHlJZGVudGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2Vzc2lvbiBCZWFuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXNzaW9uIEJlYW48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlc3Npb25CZWFuIGNyZWF0ZVNlc3Npb25CZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVqYlBhY2thZ2UgZ2V0RWpiUGFja2FnZSgpOwotCi19IC8vRWpiRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRW50ZXJwcmlzZUJlYW5zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FbnRlcnByaXNlQmVhbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkZGI5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FbnRlcnByaXNlQmVhbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGVycHJpc2UgQmVhbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBlbnRlcnByaXNlLWJlYW5zVHlwZSBkZWNsYXJlcyBvbmUgb3IgbW9yZSBlbnRlcnByaXNlCi0gKiAJYmVhbnMuIEVhY2ggYmVhbiBjYW4gYmUgYSBzZXNzaW9uLCBlbnRpdHkgb3IgbWVzc2FnZS1kcml2ZW4KLSAqIAliZWFuLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0U2Vzc2lvbkJlYW5zIDxlbT5TZXNzaW9uIEJlYW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0RW50aXR5QmVhbnMgPGVtPkVudGl0eSBCZWFuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zI2dldE1lc3NhZ2VEcml2ZW5CZWFucyA8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50ZXJwcmlzZUJlYW5zKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudGVycHJpc2VCZWFucyBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGVycHJpc2VCZWFuc19Hcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlc3Npb24gQmVhbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXNzaW9uIEJlYW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2Vzc2lvbiBCZWFuczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50ZXJwcmlzZUJlYW5zX1Nlc3Npb25CZWFucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2Vzc2lvbkJlYW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHkgQmVhbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eSBCZWFuczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBCZWFuczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50ZXJwcmlzZUJlYW5zX0VudGl0eUJlYW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFbnRpdHlCZWFucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEcml2ZW4gQmVhbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERyaXZlbiBCZWFuczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRlcnByaXNlQmVhbnNfTWVzc2FnZURyaXZlbkJlYW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXNzYWdlRHJpdmVuQmVhbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRlcnByaXNlQmVhbnNfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFbnRlcnByaXNlQmVhbnMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FbnRpdHlCZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FbnRpdHlCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZGE1MjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRW50aXR5QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRpdHkgQmVhbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGVudGl0eS1iZWFuVHlwZSBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCi0gKiAJY29uc2lzdHMgb2Y6Ci0gKiAKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICogCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICogCSAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLSAqIAkgICAgICBpY29uIGZpbGUgbmFtZQotICogCSAgICAtIGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotICogCSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAqICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbWFwcGVkLW5hbWUgZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKLSAqICAgICAgICAgICAgICAgdmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcGh5c2ljYWwKLSAqICAgICAgICAgICAgICAgam5kaS1uYW1lIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lIGludGVyZmFjZS4gVGhpcwotICogICAgICAgICAgICAgICBlbGVtZW50IGlzIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAqICAgICAgICAgICAgICAgQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotICogCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaG9tZQotICogCSAgICAgIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0gKiAJICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsCi0gKiAJICAgICAgaW50ZXJmYWNlcywgaWYgYW55Ci0gKiAJICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGUuIElmCi0gKiAgICAgICAgICAgICAgIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0gKiAJICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MgbmFtZQotICogCSAgICAtIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotICogCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlCi0gKiAJICAgICAgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbgotICogCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MKLSAqIAkgICAgICBhYnN0cmFjdCBzY2hlbWEgbmFtZQotICogCSAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkKLSAqIAkgICAgICBmaWVsZAotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQKLSAqIAkgICAgICBlbnRyaWVzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIKLSAqIAkgICAgICByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotICogCSAgICAgIEVKQiByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIKLSAqIAkgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotICogCSAgICAgIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLSAqIAkgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAqIAkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICogCSAgICAgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLSAqIAkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucwotICogCSAgICAgIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkKLSAqIAkgICAgICBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LgotICogCi0gKiAJVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQKLSAqIAlmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSBhbmQKLSAqIAljbXAtdmVyc2lvbiAyLnguCi0gKiAKLSAqIAlUaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvcgotICogCWlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4KLSAqIAotICogCVRoZSBvcHRpb25hbCBjbXAtdmVyc2lvbiBlbGVtZW50IG1heSBiZSBwcmVzZW50IGluIHRoZQotICogCWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZgotICogCXRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uCi0gKiAJZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUgZGVmYXVsdHMgdG8gMi54LgotICogCi0gKiAJVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotICogCXRoZSBlbnRpdHkgYmVhbiBjbXAtdmVyc2lvbiBpcyAxLnguCi0gKiAKLSAqIAlUaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0gKiAJdGhlIGVudGl0eSBiZWFuIGhhcyBhIHJlbW90ZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlLgotICogCi0gKiAJVGhlIG9wdGlvbmFsIGxvY2FsLWhvbWUgYW5kIGxvY2FsIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkCi0gKiAJaWYgdGhlIGVudGl0eSBiZWFuIGhhcyBhIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZS4KLSAqIAotICogCUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotICogCXRoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkLgotICogCi0gKiAJVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUKLSAqIAlwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQKLSAqIAlxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4gZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZAotICogCWZvciB0aGUgZW50aXR5IGJlYW4uCi0gKiAKLSAqIAlUaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlCi0gKiAJc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtCi0gKiAJYXJlIGVtcHR5LgotICogCi0gKiAJQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUKLSAqIAlkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQKLSAqIAl0aGUgY21wLXZlcnNpb24gaXMgMS54LCBhbmQgbm9uZSBtdXN0IG5vdCBiZSBwcmVzZW50IGlmIHRoZQotICogCWVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEhvbWUgPGVtPkhvbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UmVtb3RlIDxlbT5SZW1vdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0TG9jYWxIb21lIDxlbT5Mb2NhbCBIb21lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldExvY2FsIDxlbT5Mb2NhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRFamJDbGFzcyA8ZW0+RWpiIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFBlcnNpc3RlbmNlVHlwZSA8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQcmltS2V5Q2xhc3MgPGVtPlByaW0gS2V5IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0Q21wVmVyc2lvbiA8ZW0+Q21wIFZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0QWJzdHJhY3RTY2hlbWFOYW1lIDxlbT5BYnN0cmFjdCBTY2hlbWEgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRDbXBGaWVsZHMgPGVtPkNtcCBGaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UHJpbWtleUZpZWxkIDxlbT5Qcmlta2V5IEZpZWxkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRSZXNvdXJjZVJlZnMgPGVtPlJlc291cmNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0U2VjdXJpdHlSb2xlUmVmcyA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFNlY3VyaXR5SWRlbnRpdHkgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFF1ZXJpZXMgPGVtPlF1ZXJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW4oKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW50aXR5QmVhbiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9EaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX0ljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9FamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFamJOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX01hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhvbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SG9tZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SG9tZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIb21lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEhvbWUgPGVtPkhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhvbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhvbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVtb3RlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbW90ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtb3RlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9SZW1vdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVtb3RlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFJlbW90ZSA8ZW0+UmVtb3RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1vdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtb3RlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2FsSG9tZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fTG9jYWxIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2FsSG9tZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRMb2NhbEhvbWUgPGVtPkxvY2FsIEhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYWxIb21lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2FsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9Mb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMb2NhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRMb2NhbCA8ZW0+TG9jYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX0VqYkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYkNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkJlYW4iPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5QZXJzaXN0ZW5jZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZQotCSAqIEBzZWUgI2lzU2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAc2VlICN1bnNldFBlcnNpc3RlbmNlVHlwZSgpCi0JICogQHNlZSAjc2V0UGVyc2lzdGVuY2VUeXBlKFBlcnNpc3RlbmNlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQZXJzaXN0ZW5jZVR5cGUgZ2V0UGVyc2lzdGVuY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFBlcnNpc3RlbmNlVHlwZSA8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5QZXJzaXN0ZW5jZVR5cGUKLQkgKiBAc2VlICNpc1NldFBlcnNpc3RlbmNlVHlwZSgpCi0JICogQHNlZSAjdW5zZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyc2lzdGVuY2VUeXBlKFBlcnNpc3RlbmNlVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VUeXBlIDxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFBlcnNpc3RlbmNlVHlwZSgpCi0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAc2VlICNzZXRQZXJzaXN0ZW5jZVR5cGUoUGVyc2lzdGVuY2VUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UGVyc2lzdGVuY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VUeXBlIDxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVHlwZSgpCi0JICogQHNlZSAjc2V0UGVyc2lzdGVuY2VUeXBlKFBlcnNpc3RlbmNlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFBlcnNpc3RlbmNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbSBLZXkgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICogCSAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhbgotCSAqIAkgICAgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcy4KLQkgKiAKLQkgKiAJICAgIElmIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBpcwotCSAqIAkgICAgZGVmZXJyZWQgdG8gZGVwbG95bWVudCB0aW1lLCB0aGUgcHJpbS1rZXktY2xhc3MKLQkgKiAJICAgIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbSBLZXkgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByaW1LZXlDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUHJpbUtleUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByaW1LZXlDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQcmltS2V5Q2xhc3MgPGVtPlByaW0gS2V5IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltIEtleSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJpbUtleUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmltS2V5Q2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZW50cmFudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYW4gZW50aXR5Ci0JICogCSAgICBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuCi0JICogCi0JICogCSAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3bwotCSAqIAkgICAgZm9sbG93aW5nOiB0cnVlIG9yIGZhbHNlCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZW50cmFudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZWVudHJhbnQoKQotCSAqIEBzZWUgI3Vuc2V0UmVlbnRyYW50KCkKLQkgKiBAc2VlICNzZXRSZWVudHJhbnQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9SZWVudHJhbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVlbnRyYW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZW50cmFudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZWVudHJhbnQoKQotCSAqIEBzZWUgI3Vuc2V0UmVlbnRyYW50KCkKLQkgKiBAc2VlICNpc1JlZW50cmFudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVlbnRyYW50KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVlbnRyYW50KCkKLQkgKiBAc2VlICNpc1JlZW50cmFudCgpCi0JICogQHNlZSAjc2V0UmVlbnRyYW50KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZWVudHJhbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNpc1JlZW50cmFudCA8ZW0+UmVlbnRyYW50PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWVudHJhbnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlZW50cmFudCgpCi0JICogQHNlZSAjaXNSZWVudHJhbnQoKQotCSAqIEBzZWUgI3NldFJlZW50cmFudChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVlbnRyYW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbXAgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIxLngiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbXAgVmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbXAgVmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZQotCSAqIEBzZWUgI2lzU2V0Q21wVmVyc2lvbigpCi0JICogQHNlZSAjdW5zZXRDbXBWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRDbXBWZXJzaW9uKENtcFZlcnNpb25UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX0NtcFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDbXBWZXJzaW9uVHlwZSBnZXRDbXBWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldENtcFZlcnNpb24gPGVtPkNtcCBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbXAgVmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZQotCSAqIEBzZWUgI2lzU2V0Q21wVmVyc2lvbigpCi0JICogQHNlZSAjdW5zZXRDbXBWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRDbXBWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDbXBWZXJzaW9uKENtcFZlcnNpb25UeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRDbXBWZXJzaW9uIDxlbT5DbXAgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDbXBWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRDbXBWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRDbXBWZXJzaW9uKENtcFZlcnNpb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q21wVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldENtcFZlcnNpb24gPGVtPkNtcCBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbXAgVmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q21wVmVyc2lvbigpCi0JICogQHNlZSAjZ2V0Q21wVmVyc2lvbigpCi0JICogQHNlZSAjc2V0Q21wVmVyc2lvbihDbXBWZXJzaW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENtcFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFic3RyYWN0IFNjaGVtYSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAqIAkgICAgb2YgdGhlIGFic3RyYWN0IHNjaGVtYSB0eXBlIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgKiAJICAgIGNtcC12ZXJzaW9uIDIueC4gSXQgaXMgdXNlZCBpbiBFSkIgUUwgcXVlcmllcy4KLQkgKiAKLQkgKiAJICAgIEZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZm9yIGFuIGVudGl0eQotCSAqIAkgICAgYmVhbiB3aG9zZSBsb2NhbCBpbnRlcmZhY2UgaXMKLQkgKiAJICAgIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BYnN0cmFjdCBTY2hlbWEgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWJzdHJhY3RTY2hlbWFOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9BYnN0cmFjdFNjaGVtYU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEFic3RyYWN0U2NoZW1hTmFtZSA8ZW0+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFic3RyYWN0IFNjaGVtYSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFic3RyYWN0U2NoZW1hTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q21wIEZpZWxkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNtcCBGaWVsZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbXAgRmllbGRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX0NtcEZpZWxkcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Q21wRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcmlta2V5IEZpZWxkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotCSAqIAkgICAgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQgZm9yIGFuIGVudGl0eSB3aXRoCi0JICogCSAgICBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQkgKiAKLQkgKiAJICAgIFRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUgb25lIG9mIHRoZSBmaWVsZHMgZGVjbGFyZWQKLQkgKiAJICAgIGluIHRoZSBjbXAtZmllbGQgZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAotCSAqIAkgICAgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLQkgKiAKLQkgKiAJICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkKLQkgKiAJICAgIGtleSBtYXBzIHRvIG11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotCSAqIAkgICAgKGkuZS4gdGhlIGtleSBpcyBhIGNvbXBvdW5kIGtleSkuIEluIHRoaXMgY2FzZSwgdGhlCi0JICogCSAgICBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLQkgKiAJICAgIHRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YKLQkgKiAJICAgIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1rZXkgRmllbGQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByaW1rZXlGaWVsZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUHJpbWtleUZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByaW1rZXlGaWVsZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQcmlta2V5RmllbGQgPGVtPlByaW1rZXkgRmllbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW1rZXkgRmllbGQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByaW1rZXlGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJpbWtleUZpZWxkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnYgRW50cmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudiBFbnRyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX0VudkVudHJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVudkVudHJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX0VqYlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fRWpiTG9jYWxSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFamJMb2NhbFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9TZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUmVzb3VyY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZXNvdXJjZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgQ29uc3RydWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFja30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUG9zdENvbnN0cnVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX1ByZURlc3Ryb3lzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQcmVEZXN0cm95cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fU2VjdXJpdHlSb2xlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJpdHkgSWRlbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZWN1cml0eUlkZW50aXR5KFNlY3VyaXR5SWRlbnRpdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX1NlY3VyaXR5SWRlbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN1cml0eUlkZW50aXR5VHlwZSBnZXRTZWN1cml0eUlkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFNlY3VyaXR5SWRlbnRpdHkgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlJZGVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UXVlcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRW50aXR5QmVhbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0V4Y2x1ZGVMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FeGNsdWRlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY4ZDNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0V4Y2x1ZGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4Y2x1ZGUgTGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGV4Y2x1ZGUtbGlzdFR5cGUgc3BlY2lmaWVzIG9uZSBvciBtb3JlIG1ldGhvZHMgd2hpY2gKLSAqIAl0aGUgQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuCi0gKiAKLSAqIAlJZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZQotICogCWluIHRoZSBleGNsdWRlIGxpc3QsIHRoZSBEZXBsb3llciBzaG91bGQgY29uc2lkZXIgdGhvc2UKLSAqIAltZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdCNnZXRNZXRob2RzIDxlbT5NZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RXhjbHVkZUxpc3QoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhjbHVkZUxpc3QgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RXhjbHVkZUxpc3RfTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEV4Y2x1ZGVMaXN0X0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFeGNsdWRlTGlzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0lFSkJSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSUVKQlJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMDg1MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSUVKQlJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVKQlJlc291cmNlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBqYXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRUpCSmFyIGdldEVqYkphcigpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW5pdE1ldGhvZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0luaXRNZXRob2RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MmUxMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW5pdE1ldGhvZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluaXQgTWV0aG9kIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGUjZ2V0Q3JlYXRlTWV0aG9kIDxlbT5DcmVhdGUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZSNnZXRCZWFuTWV0aG9kIDxlbT5CZWFuIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEluaXRNZXRob2RUeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluaXRNZXRob2RUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGUgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DcmVhdGUgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0ZSBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENyZWF0ZU1ldGhvZChOYW1lZE1ldGhvZFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEluaXRNZXRob2RUeXBlX0NyZWF0ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU5hbWVkTWV0aG9kVHlwZSBnZXRDcmVhdGVNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlI2dldENyZWF0ZU1ldGhvZCA8ZW0+Q3JlYXRlIE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRlIE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q3JlYXRlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcmVhdGVNZXRob2QoTmFtZWRNZXRob2RUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJlYW4gTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CZWFuIE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CZWFuIE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QmVhbk1ldGhvZChOYW1lZE1ldGhvZFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEluaXRNZXRob2RUeXBlX0JlYW5NZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlOYW1lZE1ldGhvZFR5cGUgZ2V0QmVhbk1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGUjZ2V0QmVhbk1ldGhvZCA8ZW0+QmVhbiBNZXRob2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCZWFuTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCZWFuTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW5pdE1ldGhvZFR5cGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEluaXRNZXRob2RUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWZkYTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yQmluZGluZ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW50ZXJjZXB0b3IgQmluZGluZyBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqICAgICAgICAgVGhlIGludGVyY2VwdG9yLWJpbmRpbmdUeXBlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBiaW5kaW5nIG9mCi0gKiAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzZXMgdG8gYmVhbnMgd2l0aGluIHRoZSBlamItamFyLgotICogICAgICAgICBJdCBjb25zaXN0cyBvZiA6Ci0gKiAKLSAqICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICogICAgICAgICAgIC0gVGhlIG5hbWUgb2YgYW4gZWpiIHdpdGhpbiB0aGUgZWpiLWphciBvciB0aGUgd2lsZGNhcmQgdmFsdWUgIioiLAotICogICAgICAgICAgICAgd2hpY2ggaXMgdXNlZCB0byBkZWZpbmUgaW50ZXJjZXB0b3JzIHRoYXQgYXJlIGJvdW5kIHRvIGFsbAotICogICAgICAgICAgICAgYmVhbnMgaW4gdGhlIGVqYi1qYXIuCi0gKiAgICAgICAgICAgLSBBIGxpc3Qgb2YgaW50ZXJjZXB0b3IgY2xhc3NlcyB0aGF0IGFyZSBib3VuZCB0byB0aGUgY29udGVudHMgb2YKLSAqICAgICAgICAgICAgIHRoZSBlamItbmFtZSBlbGVtZW50IG9yIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdG90YWwgb3JkZXJpbmcKLSAqICAgICAgICAgICAgIG92ZXIgdGhlIGludGVyY2VwdG9ycyBkZWZpbmVkIGZvciB0aGUgZ2l2ZW4gbGV2ZWwgYW5kIGFib3ZlLgotICogICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZXhjbHVkZS1kZWZhdWx0LWludGVyY2VwdG9ycyBlbGVtZW50LiAgSWYgc2V0IHRvIHRydWUsCi0gKiAgICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBkZWZhdWx0IGludGVyY2VwdG9ycyBhcmUgbm90IHRvIGJlIGFwcGxpZWQgdG8KLSAqICAgICAgICAgICAgIGEgYmVhbi1jbGFzcyBhbmQvb3IgYnVzaW5lc3MgbWV0aG9kLgotICogICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZXhjbHVkZS1jbGFzcy1pbnRlcmNlcHRvcnMgZWxlbWVudC4gIElmIHNldCB0byB0cnVlLAotICogICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgY2xhc3MgaW50ZXJjZXB0b3JzIGFyZSBub3QgdG8gYmUgYXBwbGllZCB0bwotICogICAgICAgICAgICAgYSBidXNpbmVzcyBtZXRob2QuCi0gKiAgICAgICAgICAgLSBBbiBvcHRpb25hbCBzZXQgb2YgbWV0aG9kIGVsZW1lbnRzIGZvciBkZXNjcmliaW5nIHRoZSBuYW1lL3BhcmFtcwotICogICAgICAgICAgICAgb2YgYSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3IuCi0gKiAKLSAqICAgICAgICAgIEludGVyY2VwdG9ycyBib3VuZCB0byBhbGwgY2xhc3NlcyB1c2luZyB0aGUgd2lsZGNhcmQgc3ludGF4Ci0gKiAgICAgICAgICAiKiIgYXJlIGRlZmF1bHQgaW50ZXJjZXB0b3JzIGZvciB0aGUgY29tcG9uZW50cyBpbiB0aGUgZWpiLWphci4KLSAqICAgICAgICAgIEluIGFkZGl0aW9uLCBpbnRlcmNlcHRvcnMgbWF5IGJlIGJvdW5kIGF0IHRoZSBsZXZlbCBvZiB0aGUgYmVhbgotICogICAgICAgICAgY2xhc3MgKGNsYXNzLWxldmVsIGludGVyY2VwdG9ycykgb3IgYnVzaW5lc3MgbWV0aG9kcyAobWV0aG9kLWxldmVsCi0gKiAgICAgICAgICBpbnRlcmNlcHRvcnMgKS4KLSAqIAotICogICAgICAgICAgVGhlIGJpbmRpbmcgb2YgaW50ZXJjZXB0b3JzIHRvIGNsYXNzZXMgaXMgYWRkaXRpdmUuICBJZiBpbnRlcmNlcHRvcnMKLSAqICAgICAgICAgIGFyZSBib3VuZCBhdCB0aGUgY2xhc3MtbGV2ZWwgYW5kL29yIGRlZmF1bHQtbGV2ZWwgYXMgd2VsbCBhcyB0aGUKLSAqICAgICAgICAgIG1ldGhvZC1sZXZlbCwgYm90aCBjbGFzcy1sZXZlbCBhbmQvb3IgZGVmYXVsdC1sZXZlbCBhcyB3ZWxsIGFzCi0gKiAgICAgICAgICBtZXRob2QtbGV2ZWwgd2lsbCBhcHBseS4KLSAqIAotICogICAgICAgICAgVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgc3R5bGVzIG9mIHRoZSBpbnRlcmNlcHRvciBlbGVtZW50IHN5bnRheCA6Ci0gKiAKLSAqICAgICAgICAgIDEuCi0gKiAgICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICogICAgICAgICAgICA8ZWpiLW5hbWU+KjwvZWpiLW5hbWU+Ci0gKiAgICAgICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gKiAgICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0gKiAKLSAqICAgICAgICAgIFNwZWNpZnlpbmcgdGhlIGVqYi1uYW1lIGFzIHRoZSB3aWxkY2FyZCB2YWx1ZSAiKiIgZGVzaWduYXRlcwotICogICAgICAgICAgZGVmYXVsdCBpbnRlcmNlcHRvcnMgKGludGVyY2VwdG9ycyB0aGF0IGFwcGx5IHRvIGFsbCBzZXNzaW9uIGFuZAotICogICAgICAgICAgbWVzc2FnZS1kcml2ZW4gYmVhbnMgY29udGFpbmVkIGluIHRoZSBlamItamFyKS4KLSAqIAotICogICAgICAgICAgMi4KLSAqICAgICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gKiAgICAgICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAqICAgICAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAqICAgICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLSAqIAotICogICAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGludGVyY2VwdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gKiAgICAgICAgICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuKGNsYXNzLWxldmVsIGludGVyY2VwdG9ycykuCi0gKiAKLSAqICAgICAgICAgIDMuCi0gKiAgICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICogICAgICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gKiAgICAgICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gKiAgICAgICAgICAgIDxtZXRob2Q+Ci0gKiAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0gKiAgICAgICAgICAgIDwvbWV0aG9kPgotICogICAgICAgICAgPC9pbnRlcmNlcHRvci1iaW5kaW5nPgotICogCi0gKiAgICAgICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gYXNzb2NpYXRlIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yIHdpdGgKLSAqICAgICAgICAgIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMKLSAqICAgICAgICAgIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZiB0aGlzIHN0eWxlIHJlZmVycwotICogICAgICAgICAgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQgbmFtZS4gIE1ldGhvZC1sZXZlbAotICogICAgICAgICAgaW50ZXJjZXB0b3JzIGNhbiBvbmx5IGJlIGFzc29jaWF0ZWQgd2l0aCBidXNpbmVzcyBtZXRob2RzIG9mIHRoZQotICogICAgICAgICAgYmVhbiBjbGFzcy4gICBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkIHZhbHVlICIqIiBjYW5ub3QgYmUgdXNlZAotICogICAgICAgICAgdG8gc3BlY2lmeSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3JzLgotICogCi0gKiAgICAgICAgICA0LgotICogICAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAqICAgICAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICogICAgICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICogICAgICAgICAgICA8bWV0aG9kPgotICogICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotICogICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICogICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gKiAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KLSAqICAgICAgICAgICAgICAgIC4uLgotICogICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS1OPC9tZXRob2QtcGFyYW0+Ci0gKiAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICogICAgICAgICAgICA8L21ldGhvZD4KLSAqICAgICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLSAqIAotICogICAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIGFzc29jaWF0ZSBhIG1ldGhvZC1sZXZlbCBpbnRlcmNlcHRvciB3aXRoCi0gKiAgICAgICAgICB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZiB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gIFRoaXMKLSAqICAgICAgICAgIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhIHNldCBvZiBtZXRob2RzCi0gKiAgICAgICAgICB3aXRoIGFuIG92ZXJsb2FkZWQgbmFtZS4gIFRoZSB2YWx1ZXMgUEFSQU0tMSB0aHJvdWdoIFBBUkFNLU4KLSAqICAgICAgICAgIGFyZSB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMKLSAqICAgICAgICAgIChpZiB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dCBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQKLSAqICAgICAgICAgIGNvbnRhaW5zIG5vIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotICogICAgICAgICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2Ygc3F1YXJlCi0gKiAgICAgICAgICBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRJbnRlcmNlcHRvckNsYXNzZXMgPGVtPkludGVyY2VwdG9yIENsYXNzZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0SW50ZXJjZXB0b3JPcmRlciA8ZW0+SW50ZXJjZXB0b3IgT3JkZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyA8ZW0+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0TWV0aG9kIDxlbT5NZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFamJOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBDbGFzc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBDbGFzc2VzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3IgQ2xhc3NlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JbnRlcmNlcHRvckNsYXNzZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEludGVyY2VwdG9yQ2xhc3NlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3IgT3JkZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyY2VwdG9yIE9yZGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyY2VwdG9yIE9yZGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbnRlcmNlcHRvck9yZGVyKEludGVyY2VwdG9yT3JkZXJUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0ludGVyY2VwdG9yT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnRlcmNlcHRvck9yZGVyVHlwZSBnZXRJbnRlcmNlcHRvck9yZGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldEludGVyY2VwdG9yT3JkZXIgPGVtPkludGVyY2VwdG9yIE9yZGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBPcmRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW50ZXJjZXB0b3JPcmRlcihJbnRlcmNlcHRvck9yZGVyVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBJbnRlcmNlcHRvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI3Vuc2V0RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI3NldEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpCi0JICogQHNlZSAjdW5zZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpCi0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpCi0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpCi0JICogQHNlZSAjc2V0RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9yczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9yczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI2lzRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI3NldEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpCi0JICogQHNlZSAjdW5zZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI3NldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjaXNFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMgPGVtPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIENsYXNzIEludGVyY2VwdG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI3Vuc2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkKLQkgKiBAc2VlICNpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2lzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzIDxlbT5FeGNsdWRlIENsYXNzIEludGVyY2VwdG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI2lzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkKLQkgKiBAc2VlICNzZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2lzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzIDxlbT5FeGNsdWRlIENsYXNzIEludGVyY2VwdG9yczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpCi0JICogQHNlZSAjaXNFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI3NldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1ldGhvZChOYW1lZE1ldGhvZFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGVfTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTmFtZWRNZXRob2RUeXBlIGdldE1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRNZXRob2QgPGVtPk1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW50ZXJjZXB0b3JCaW5kaW5nVHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yT3JkZXJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvck9yZGVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGNhNGFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yT3JkZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW50ZXJjZXB0b3IgT3JkZXIgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogICAgICAgICBUaGUgaW50ZXJjZXB0b3Itb3JkZXJUeXBlIGVsZW1lbnQgZGVzY3JpYmVzIGEgdG90YWwgb3JkZXJpbmcKLSAqICAgICAgICAgb2YgaW50ZXJjZXB0b3IgY2xhc3Nlcy4KLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yT3JkZXJUeXBlI2dldEludGVyY2VwdG9yQ2xhc3NlcyA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3NlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yT3JkZXJUeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEludGVyY2VwdG9yT3JkZXJUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBDbGFzc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBDbGFzc2VzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3IgQ2xhc3NlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbnRlcmNlcHRvckNsYXNzZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvck9yZGVyVHlwZV9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW50ZXJjZXB0b3JPcmRlclR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvclR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWMxMDI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlcmNlcHRvciBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqICAgICAgICAgVGhlIGludGVyY2VwdG9yVHlwZSBlbGVtZW50IGRlY2xhcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlCi0gKiAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzLiAgSXQgY29uc2lzdHMgb2YgOgotICogCi0gKiAgICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICogICAgICAgICAgICAgLSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGludGVyY2VwdG9yIGNsYXNzLgotICogICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIGFyb3VuZCBpbnZva2UgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUKLSAqICAgICAgICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotICogICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IGVudmlyb25tZW50IGRlcGVuZGVuY2llcyBmb3IgdGhlIGludGVyY2VwdG9yCi0gKiAgICAgICAgICAgICAgIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAqICAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBwb3N0LWFjdGl2YXRlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gKiAgICAgICAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAqICAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBwcmUtcGFzc2l2YXRlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gKiAgICAgICAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0SW50ZXJjZXB0b3JDbGFzcyA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRBcm91bmRJbnZva2VzIDxlbT5Bcm91bmQgSW52b2tlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFBvc3RBY3RpdmF0ZXMgPGVtPlBvc3QgQWN0aXZhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UHJlUGFzc2l2YXRlcyA8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEludGVyY2VwdG9yVHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3IgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3IgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEludGVyY2VwdG9yQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfSW50ZXJjZXB0b3JDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbnRlcmNlcHRvckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0SW50ZXJjZXB0b3JDbGFzcyA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkludGVyY2VwdG9yIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnRlcmNlcHRvckNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bcm91bmQgSW52b2tlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXJvdW5kIEludm9rZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bcm91bmQgSW52b2tlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX0Fyb3VuZEludm9rZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEFyb3VuZEludm9rZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudiBFbnRyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9FbnZFbnRyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFbnZFbnRyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9FamJMb2NhbFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfU2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZXNvdXJjZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9SZXNvdXJjZUVudlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlRW52UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RDb25zdHJ1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBEZXN0cm95czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBEZXN0cm95czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX1ByZURlc3Ryb3lzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQcmVEZXN0cm95cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBBY3RpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IEFjdGl2YXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RBY3RpdmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBvc3RBY3RpdmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBQYXNzaXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBQYXNzaXZhdGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9QcmVQYXNzaXZhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQcmVQYXNzaXZhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW50ZXJjZXB0b3JUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JzVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODUxNjQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW50ZXJjZXB0b3JzIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogICAgICAgICBUaGUgaW50ZXJjZXB0b3JzVHlwZSBlbGVtZW50IGRlY2xhcmVzIG9uZSBvciBtb3JlIGludGVyY2VwdG9yCi0gKiAgICAgICAgIGNsYXNzZXMgdXNlZCBieSBjb21wb25lbnRzIHdpdGhpbiB0aGlzIGVqYi1qYXIuICBUaGUgZGVjbGFyYXRpb24KLSAqICAgICAgICAgY29uc2lzdHMgb2YgOgotICogCi0gKiAgICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICogICAgICAgICAgICAgLSBPbmUgb3IgbW9yZSBpbnRlcmNlcHRvciBlbGVtZW50cy4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZSNnZXRJbnRlcmNlcHRvcnMgPGVtPkludGVyY2VwdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JzVHlwZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnRlcmNlcHRvcnNUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvcnNUeXBlX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvcnNUeXBlX0ludGVyY2VwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW50ZXJjZXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JzVHlwZV9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBJbnRlcmNlcHRvcnNUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWVzc2FnZURyaXZlbkJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01lc3NhZ2VEcml2ZW5CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjFmZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWVzc2FnZURyaXZlbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEcml2ZW4gQmVhbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbgotICogCWJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLSAqIAotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotICogCSAgICAgIGljb24gZmlsZSBuYW1lLgotICogCSAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi0gKiAJICAgICAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQotICogICAgICAgICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAotICogICAgICAgICAgICAgICBqbmRpLW5hbWUgb2YgZGVzdGluYXRpb24gZnJvbSB3aGljaCB0aGlzIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLSAqICAgICAgICAgICAgICAgc2hvdWxkIGNvbnN1bWUuICBUaGlzIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgICBieSBhbGwgaW1wbGVtZW50YXRpb25zLiAgQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotICogCSAgICAtIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2luZwotICogCSAgICAgIHR5cGUKLSAqICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB0aW1lb3V0IG1ldGhvZC4KLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgbWVzc2FnZS1kcml2ZW4gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQKLSAqICAgICAgICAgICAgICAgdHlwZS4gSWYgaXQgaXMgbm90IGRlZmluZWQsIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICogCSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAqIAkgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0gKiAJICAgICAgYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMKLSAqICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbiBjbGFzcyBhbmQvb3IKLSAqICAgICAgICAgICAgICAgc3VwZXJjbGFzcyBhcm91bmQtaW52b2tlIG1ldGhvZHMuCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotICogCSAgICAgIGVudHJpZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIKLSAqIAkgICAgICByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIgc2VydmljZQotICogCSAgICAgIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkKLSAqIAkgICAgICBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MKLSAqIAkgICAgICBtZXRob2RzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICogCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5Ci0gKiAJICAgICAgcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLSAqIAkgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLgotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotICogCSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2luZ1R5cGUgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUaW1lb3V0TWV0aG9kIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0QWN0aXZhdGlvbkNvbmZpZyA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0U2VjdXJpdHlJZGVudGl0eSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlRHJpdmVuQmVhbiBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX0ljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFamJOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX01hcHBlZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqICAgICAgICAgICAgICBUaGUgZWpiLWNsYXNzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZQotCSAqICAgICAgICAgICAgICBvZiB0aGUgYmVhbiBjbGFzcyBmb3IgdGhpcyBlamIuICBJdCBpcyByZXF1aXJlZCB1bmxlc3MKLQkgKiAgICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21wb25lbnQtZGVmaW5pbmcgYW5ub3RhdGlvbiBmb3IgdGhlIHNhbWUKLQkgKiAgICAgICAgICAgICAgZWpiLW5hbWUuCi0JICogCi0JICogICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYkNsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYkNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdpbmcgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UKLQkgKiAJICAgIGxpc3RlbmVyIGludGVyZmFjZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2luZ1R5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1lc3NhZ2luZ1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2luZ1R5cGUgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWVzc2FnaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnaW5nVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZW91dCBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUaW1lb3V0TWV0aG9kKE5hbWVkTWV0aG9kVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fVGltZW91dE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU5hbWVkTWV0aG9kVHlwZSBnZXRUaW1lb3V0TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUaW1lb3V0TWV0aG9kIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZW91dCBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRpbWVvdXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpbWVvdXRNZXRob2QoTmFtZWRNZXRob2RUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iQmVhbiI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9UcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX0FjdGl2YXRpb25Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBY3RpdmF0aW9uQ29uZmlnIGdldEFjdGl2YXRpb25Db25maWcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEFjdGl2YXRpb25Db25maWcgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFyb3VuZCBJbnZva2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bcm91bmQgSW52b2tlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFyb3VuZCBJbnZva2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9Bcm91bmRJbnZva2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRBcm91bmRJbnZva2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnYgRW50cmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudiBFbnRyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9FbnZFbnRyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFbnZFbnRyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiTG9jYWxSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFamJMb2NhbFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fUmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgQ29uc3RydWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFja30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX1Bvc3RDb25zdHJ1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBEZXN0cm95czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBEZXN0cm95czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fUHJlRGVzdHJveXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByZURlc3Ryb3lzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlY3VyaXR5SWRlbnRpdHkoU2VjdXJpdHlJZGVudGl0eVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX1NlY3VyaXR5SWRlbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN1cml0eUlkZW50aXR5VHlwZSBnZXRTZWN1cml0eUlkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRTZWN1cml0eUlkZW50aXR5IDxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlY3VyaXR5SWRlbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlY3VyaXR5SWRlbnRpdHkoU2VjdXJpdHlJZGVudGl0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXNzYWdlRHJpdmVuQmVhbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZEludGVyZmFjZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZEludGVyZmFjZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkOWM3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RJbnRlcmZhY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPk1ldGhvZCBJbnRlcmZhY2UgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvCi0gKiAJZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLSAqIAlzaWduYXR1cmUgdGhhdCBhcmUgbXVsdGlwbHkgZGVmaW5lZCBhY3Jvc3MgdGhlIGhvbWUgYW5kCi0gKiAJY29tcG9uZW50IGludGVyZmFjZXMgKGUuZywgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotICogCXJlbW90ZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvciBpbiBib3RoIGFuIGVudGVycHJpc2UgYmVhbidzCi0gKiAJaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGV0Yy4pOyB0aGUgY29tcG9uZW50IGFuZCB3ZWIKLSAqIAlzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMsIGFuZCBzbyBvbi4gVGhlIExvY2FsIGFwcGxpZXMgdG8KLSAqICAgICAgICAgYm90aCBsb2NhbCBjb21wb25lbnQgaW50ZXJmYWNlIGFuZCBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2UuCi0gKiAgICAgICAgIFNpbWlsYXJseSwgUmVtb3RlIGFwcGxpZXMgdG8gYm90aCByZW1vdGUgY29tcG9uZW50IGludGVyZmFjZQotICogICAgICAgICBhbmQgdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2UuCi0gKiAKLSAqIAlUaGUgbWV0aG9kLWludGYgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogCi0gKiAJICAgIEhvbWUKLSAqIAkgICAgUmVtb3RlCi0gKiAJICAgIExvY2FsSG9tZQotICogCSAgICBMb2NhbAotICogCSAgICBTZXJ2aWNlRW5kcG9pbnQKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kSW50ZXJmYWNlVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RJbnRlcmZhY2VUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Ib21lPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Ib21lPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0hPTUVfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVNT1RFX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgSG9tZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgSG9tZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9IT01FX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9IT01FID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUwgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWSUNFX0VORFBPSU5UX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0VORFBPSU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkhvbWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSE9NRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kSW50ZXJmYWNlVHlwZSBIT01FX0xJVEVSQUwgPSBuZXcgTWV0aG9kSW50ZXJmYWNlVHlwZShIT01FLCAiSG9tZSIsICJIb21lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFTU9URQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kSW50ZXJmYWNlVHlwZSBSRU1PVEVfTElURVJBTCA9IG5ldyBNZXRob2RJbnRlcmZhY2VUeXBlKFJFTU9URSwgIlJlbW90ZSIsICJSZW1vdGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0hPTUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEludGVyZmFjZVR5cGUgTE9DQUxfSE9NRV9MSVRFUkFMID0gbmV3IE1ldGhvZEludGVyZmFjZVR5cGUoTE9DQUxfSE9NRSwgIkxvY2FsSG9tZSIsICJMb2NhbEhvbWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kSW50ZXJmYWNlVHlwZSBMT0NBTF9MSVRFUkFMID0gbmV3IE1ldGhvZEludGVyZmFjZVR5cGUoTE9DQUwsICJMb2NhbCIsICJMb2NhbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VSVklDRV9FTkRQT0lOVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kSW50ZXJmYWNlVHlwZSBTRVJWSUNFX0VORFBPSU5UX0xJVEVSQUwgPSBuZXcgTWV0aG9kSW50ZXJmYWNlVHlwZShTRVJWSUNFX0VORFBPSU5ULCAiU2VydmljZUVuZHBvaW50IiwgIlNlcnZpY2VFbmRwb2ludCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5NZXRob2QgSW50ZXJmYWNlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZEludGVyZmFjZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgTWV0aG9kSW50ZXJmYWNlVHlwZVtdIHsKLQkJCUhPTUVfTElURVJBTCwKLQkJCVJFTU9URV9MSVRFUkFMLAotCQkJTE9DQUxfSE9NRV9MSVRFUkFMLAotCQkJTE9DQUxfTElURVJBTCwKLQkJCVNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5NZXRob2QgSW50ZXJmYWNlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk1ldGhvZCBJbnRlcmZhY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEludGVyZmFjZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlNZXRob2RJbnRlcmZhY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWV0aG9kIEludGVyZmFjZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kSW50ZXJmYWNlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCU1ldGhvZEludGVyZmFjZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk1ldGhvZCBJbnRlcmZhY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEludGVyZmFjZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEhPTUU6IHJldHVybiBIT01FX0xJVEVSQUw7Ci0JCQljYXNlIFJFTU9URTogcmV0dXJuIFJFTU9URV9MSVRFUkFMOwotCQkJY2FzZSBMT0NBTF9IT01FOiByZXR1cm4gTE9DQUxfSE9NRV9MSVRFUkFMOwotCQkJY2FzZSBMT0NBTDogcmV0dXJuIExPQ0FMX0xJVEVSQUw7Ci0JCQljYXNlIFNFUlZJQ0VfRU5EUE9JTlQ6IHJldHVybiBTRVJWSUNFX0VORFBPSU5UX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1ldGhvZEludGVyZmFjZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL01ldGhvZEludGVyZmFjZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZFBhcmFtcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kUGFyYW1zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzU2ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kUGFyYW1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIG1ldGhvZC1wYXJhbXNUeXBlIGRlZmluZXMgYSBsaXN0IG9mIHRoZQotICogCWZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQYXJhbXMjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQYXJhbXMjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1ldGhvZFBhcmFtcygpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQYXJhbXMgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIG1ldGhvZC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgcHJpbWl0aXZlCi0JICogCSAgICBvciBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiBhIG1ldGhvZAotCSAqIAkgICAgcGFyYW1ldGVyLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RQYXJhbXNfTWV0aG9kUGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXRob2RQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RQYXJhbXNfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBhcmFtcyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RQYXJhbXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RQZXJtaXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RQZXJtaXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDk4NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kUGVybWlzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQZXJtaXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlCi0gKiAJc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLSAqIAliZWFuIG1ldGhvZHMuIFRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUgY29uc2lzdHMgb2YgYW4KLSAqIAlvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgb3IgYW4KLSAqIAlpbmRpY2F0b3IgdG8gc3RhdGUgdGhhdCB0aGUgbWV0aG9kIGlzIHVuY2hlY2tlZCBmb3IKLSAqIAlhdXRob3JpemF0aW9uLCBhbmQgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cy4KLSAqIAotICogCVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUKLSAqIAltdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgb2YgdGhlCi0gKiAJZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbmQgdGhlIG1ldGhvZHMgbXVzdCBiZSBtZXRob2RzCi0gKiAJZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudAotICogICAgICAgICBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXRSb2xlTmFtZXMgPGVtPlJvbGUgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0VW5jaGVja2VkIDxlbT5VbmNoZWNrZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0TWV0aG9kcyA8ZW0+TWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kUGVybWlzc2lvbigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQZXJtaXNzaW9uIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlTmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJvbGVOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5jaGVja2VkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgICAgVGhlIHVuY2hlY2tlZCBlbGVtZW50IHNwZWNpZmllcyB0aGF0IGEgbWV0aG9kIGlzCi0JICogCSAgICAgIG5vdCBjaGVja2VkIGZvciBhdXRob3JpemF0aW9uIGJ5IHRoZSBjb250YWluZXIKLQkgKiAJICAgICAgcHJpb3IgdG8gaW52b2NhdGlvbiBvZiB0aGUgbWV0aG9kLgotCSAqIAotCSAqIAkgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuY2hlY2tlZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VW5jaGVja2VkKEVtcHR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbXB0eVR5cGUgZ2V0VW5jaGVja2VkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldFVuY2hlY2tlZCA8ZW0+VW5jaGVja2VkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmNoZWNrZWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFVuY2hlY2tlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VW5jaGVja2VkKEVtcHR5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kUGVybWlzc2lvbl9NZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kUGVybWlzc2lvbl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RQZXJtaXNzaW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQ2NTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIG1ldGhvZFR5cGUgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZQotICogCSAgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAotICogCSAgaW50ZXJmYWNlLCBvciwgaW4gdGhlIGNhc2Ugb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLCB0aGUKLSAqIAkgIGJlYW4ncyBtZXNzYWdlIGxpc3RlbmVyIG1ldGhvZCwgb3IgYSBzZXQgb2Ygc3VjaAotICogCSAgbWV0aG9kcy4gVGhlIGVqYi1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlCi0gKiAJICBlbnRlcnByaXNlIGJlYW5zIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZQotICogCSAgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhCi0gKiAJICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBtdWx0aXBseSBkZWZpbmVkCi0gKiAJICBhY3Jvc3MgdGhlIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZQotICogICAgICAgICAgIGVuZHBvaW50IG50ZXJmYWNlczsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotICogICAgICAgICAgIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkKLSAqICAgICAgICAgICBhIHNpbmdsZSBtZXRob2QgYW1vbmcgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQKLSAqIAkgIG1ldGhvZCBuYW1lLgotICogCi0gKiAJICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzIG9mIHVzaW5nIG1ldGhvZFR5cGUgZWxlbWVudAotICogCSAgd2l0aGluIGEgbWV0aG9kIGVsZW1lbnQ6Ci0gKiAKLSAqIAkgIDEuCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFSkJOQU1FJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7KiZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUKLSAqIAkgICAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50LAotICogICAgICAgICAgICAgIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLgotICogCi0gKiAJICAyLgotICogCSAgJmx0O21ldGhvZCZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7RUpCTkFNRSZsdDsvZWpiLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1uYW1lJmd0O01FVEhPRCZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCi0gKiAJICAgICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gKiAJICAgICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZgotICogCSAgICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKLSAqIAkgICAgIG5hbWUuCi0gKiAKLSAqIAkgIDMuCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFSkJOQU1FJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7TUVUSE9EJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLXBhcmFtcyZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O1BBUkFNLTEmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O1BBUkFNLTImbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAuLi4KLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O1BBUkFNLW4mbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkgICAgICAmbHQ7L21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYQotICogCSAgICAgc2V0IG9mIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaAotICogCSAgICAgUEFSQU0tbiBhcmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZQotICogCSAgICAgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQKLSAqIAkgICAgIGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBubwotICogCSAgICAgbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0gKiAJICAgICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZgotICogCSAgICAgc3F1YXJlIGJyYWNrZXRzIChlLmcuIGludFtdW10pLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKLSAqIAkgICAgIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoaXMgc3R5bGUgcmVmZXJzCi0gKiAJICAgICB0byBhbGwgb2YgdGhlIG92ZXJsb2FkZWQgbWV0aG9kcy4KLSAqIAotICogCSAgRXhhbXBsZXM6Ci0gKiAKLSAqIAkgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUKLSAqIAkgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsCi0gKiAgICAgICAgICAgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlczoKLSAqIAotICogCSAgJmx0O21ldGhvZCZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7KiZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgU3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZQotICogCSAgY3JlYXRlIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZQotICogCSAgaW50ZXJmYWNlKHMpLgotICogCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtbmFtZSZndDtjcmVhdGUmbHQ7L21ldGhvZC1uYW1lJmd0OwotICogCSAgJmx0Oy9tZXRob2QmZ3Q7Ci0gKiAKLSAqIAkgIFN0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZQotICogCSAgY3JlYXRlKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBMYXN0TmFtZSkgbWV0aG9kIG9mIHRoZQotICogCSAgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZShzKS4KLSAqIAotICogCSAgJmx0O21ldGhvZCZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7Y3JlYXRlJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLXBhcmFtcyZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkgICAgICAmbHQ7L21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLSAqIAkgIG1vcmUgY29tcGxleCBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBtZXRob2QKLSAqIAkgIGZvb2JhcihjaGFyIHMsIGludCBpLCBpbnRbXSBpYXIsIG15cGFja2FnZS5NeUNsYXNzIG15Y2wsCi0gKiAJICBteXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikgd291bGQgYmUgc3BlY2lmaWVkIGFzOgotICogCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtbmFtZSZndDtmb29iYXImbHQ7L21ldGhvZC1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtcGFyYW1zJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7Y2hhciZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7aW50Jmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtpbnRbXSZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7bXlwYWNrYWdlLk15Q2xhc3MmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O215cGFja2FnZS5NeUNsYXNzW11bXSZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCSAgICAgICZsdDsvbWV0aG9kLXBhcmFtcyZndDsKLSAqIAkgICZsdDsvbWV0aG9kJmd0OwotICogCi0gKiAJICBUaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLSAqIAkgIG5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgdGhhdCBpcyBtdWx0aXBseQotICogCSAgZGVmaW5lZCBhY3Jvc3MgdGhlIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsCi0gKiAgICAgICAgICAgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotICogCSAgc2lnbmF0dXJlLiBIb3dldmVyLCBpZiB0aGUgc2FtZSBtZXRob2QgaXMgYSBtZXRob2Qgb2YgYm90aCB0aGUKLSAqICAgICAgICAgICBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2UsIGFuZCB0aGUgbG9jYWwgY29tcG9uZW50IGludGVyZmFjZSwKLSAqICAgICAgICAgICB0aGUgc2FtZSBhdHRyaWJ1dGUgYXBwbGllcyB0byB0aGUgbWV0aG9kIGZvciBib3RoIGludGVyZmFjZXMuCi0gKiAgICAgICAgICAgTGlrZXdpc2UsIGlmIHRoZSBzYW1lIG1ldGhvZCBpcyBhIG1ldGhvZCBvZiBib3RoIHRoZSByZW1vdGUKLSAqICAgICAgICAgICBidXNpbmVzcyBpbnRlcmZhY2UgYW5kIHRoZSByZW1vdGUgY29tcG9uZW50IGludGVyZmFjZSwgdGhlIHNhbWUKLSAqICAgICAgICAgICBhdHRyaWJ1dGUgYXBwbGllcyB0byB0aGUgbWV0aG9kIGZvciBib3RoIGludGVyZmFjZXMuCi0gKiAKLSAqIAkgIEZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIAotICogCSAgJmx0O21ldGhvZCZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLWludGYmZ3Q7UmVtb3RlJmx0Oy9tZXRob2QtaW50ZiZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7Y3JlYXRlJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLXBhcmFtcyZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkgICAgICAmbHQ7L21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKQotICogCSAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUKLSAqIAkgIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBob21lCi0gKiAJICBpbnRlcmZhY2UsIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLSAqIAotICogCSAgJmx0O21ldGhvZCZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLWludGYmZ3Q7SG9tZSZsdDsvbWV0aG9kLWludGYmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1uYW1lJmd0O2NyZWF0ZSZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtqYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtqYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJICAgICAgJmx0Oy9tZXRob2QtcGFyYW1zJmd0OwotICogCSAgJmx0Oy9tZXRob2QmZ3Q7Ci0gKiAKLSAqIAkgIGFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKLSAqIAkgIGludGVyZmFjZSB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0gKiAKLSAqIAkgICZsdDttZXRob2QmZ3Q7Ci0gKiAJICAgICAgJmx0O2VqYi1uYW1lJmd0O0VtcGxveWVlU2VydmljZSZsdDsvZWpiLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1pbnRmJmd0O0xvY2FsSG9tZSZsdDsvbWV0aG9kLWludGYmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1uYW1lJmd0O2NyZWF0ZSZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtqYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtqYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJICAgICAgJmx0Oy9tZXRob2QtcGFyYW1zJmd0OwotICogCSAgJmx0Oy9tZXRob2QmZ3Q7Ci0gKiAKLSAqIAkgIFRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdpdGggYWxsIHRocmVlIFN0eWxlcwotICogCSAgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotICogCSAgbWV0aG9kIGVsZW1lbnQgZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUKLSAqIAkgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlCi0gKiAgICAgICAgICAgYW5kIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlLgotICogCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtaW50ZiZndDtIb21lJmx0Oy9tZXRob2QtaW50ZiZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7KiZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldE1ldGhvZEludGYgPGVtPk1ldGhvZCBJbnRmPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kVHlwZSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RUeXBlX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RUeXBlX0VqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBJbnRmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkhvbWUiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RJbnRlcmZhY2VUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBJbnRmPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBJbnRmPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGUKLQkgKiBAc2VlICNpc1NldE1ldGhvZEludGYoKQotCSAqIEBzZWUgI3Vuc2V0TWV0aG9kSW50ZigpCi0JICogQHNlZSAjc2V0TWV0aG9kSW50ZihNZXRob2RJbnRlcmZhY2VUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RUeXBlX01ldGhvZEludGYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RJbnRlcmZhY2VUeXBlIGdldE1ldGhvZEludGYoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kSW50ZiA8ZW0+TWV0aG9kIEludGY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBJbnRmPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGUKLQkgKiBAc2VlICNpc1NldE1ldGhvZEludGYoKQotCSAqIEBzZWUgI3Vuc2V0TWV0aG9kSW50ZigpCi0JICogQHNlZSAjZ2V0TWV0aG9kSW50ZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kSW50ZihNZXRob2RJbnRlcmZhY2VUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRNZXRob2RJbnRmIDxlbT5NZXRob2QgSW50ZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNZXRob2RJbnRmKCkKLQkgKiBAc2VlICNnZXRNZXRob2RJbnRmKCkKLQkgKiBAc2VlICNzZXRNZXRob2RJbnRmKE1ldGhvZEludGVyZmFjZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNZXRob2RJbnRmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kSW50ZiA8ZW0+TWV0aG9kIEludGY8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBJbnRmPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNZXRob2RJbnRmKCkKLQkgKiBAc2VlICNnZXRNZXRob2RJbnRmKCkKLQkgKiBAc2VlICNzZXRNZXRob2RJbnRmKE1ldGhvZEludGVyZmFjZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNZXRob2RJbnRmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1ldGhvZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RUeXBlX01ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWV0aG9kUGFyYW1zKE1ldGhvZFBhcmFtcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQYXJhbXMgZ2V0TWV0aG9kUGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RUeXBlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZFR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NdWx0aXBsaWNpdHlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NdWx0aXBsaWNpdHlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODBjMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTXVsdGlwbGljaXR5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5NdWx0aXBsaWNpdHkgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBtdWx0aXBsaWNpdHlUeXBlIGRlc2NyaWJlcyB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZQotICogCXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbi4KLSAqIAotICogCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLSAqIAotICogCSAgICBPbmUKLSAqIAkgICAgTWFueQotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNdWx0aXBsaWNpdHlUeXBlKCkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE11bHRpcGxpY2l0eVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9uZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T25lPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09ORV9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05FID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTUFOWV9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFOWSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PbmU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT05FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlUeXBlIE9ORV9MSVRFUkFMID0gbmV3IE11bHRpcGxpY2l0eVR5cGUoT05FLCAiT25lIiwgIk9uZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTUFOWQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTXVsdGlwbGljaXR5VHlwZSBNQU5ZX0xJVEVSQUwgPSBuZXcgTXVsdGlwbGljaXR5VHlwZShNQU5ZLCAiTWFueSIsICJNYW55Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk11bHRpcGxpY2l0eSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IE11bHRpcGxpY2l0eVR5cGVbXSB7Ci0JCQlPTkVfTElURVJBTCwKLQkJCU1BTllfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHkgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNdWx0aXBsaWNpdHlUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTXVsdGlwbGljaXR5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk11bHRpcGxpY2l0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXVsdGlwbGljaXR5VHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCU11bHRpcGxpY2l0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk11bHRpcGxpY2l0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXVsdGlwbGljaXR5VHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgT05FOiByZXR1cm4gT05FX0xJVEVSQUw7Ci0JCQljYXNlIE1BTlk6IHJldHVybiBNQU5ZX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE11bHRpcGxpY2l0eVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL011bHRpcGxpY2l0eVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL05hbWVkTWV0aG9kVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTmFtZWRNZXRob2RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMjU0ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTmFtZWRNZXRob2RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBNZXRob2QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGUjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZSNnZXRNZXRob2RQYXJhbXMgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TmFtZWRNZXRob2RUeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkTWV0aG9kVHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXRob2ROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TmFtZWRNZXRob2RUeXBlX01ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWV0aG9kTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXROYW1lZE1ldGhvZFR5cGVfTWV0aG9kUGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kUGFyYW1zIGdldE1ldGhvZFBhcmFtcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXROYW1lZE1ldGhvZFR5cGVfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBOYW1lZE1ldGhvZFR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9QZXJzaXN0ZW5jZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1BlcnNpc3RlbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWVlNmE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1BlcnNpc3RlbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5QZXJzaXN0ZW5jZSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHBlcnNpc3RlbmNlLXR5cGVUeXBlIHNwZWNpZmllcyBhbiBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlCi0gKiAJbWFuYWdlbWVudCB0eXBlLgotICogCi0gKiAJVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLSAqIAotICogCSAgICBCZWFuCi0gKiAJICAgIENvbnRhaW5lcgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUGVyc2lzdGVuY2VUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CZWFuPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0JFQU5fTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFQU4gPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UQUlORVIgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QmVhbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNCRUFOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVR5cGUgQkVBTl9MSVRFUkFMID0gbmV3IFBlcnNpc3RlbmNlVHlwZShCRUFOLCAiQmVhbiIsICJCZWFuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRBSU5FUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VUeXBlIENPTlRBSU5FUl9MSVRFUkFMID0gbmV3IFBlcnNpc3RlbmNlVHlwZShDT05UQUlORVIsICJDb250YWluZXIiLCAiQ29udGFpbmVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBQZXJzaXN0ZW5jZVR5cGVbXSB7Ci0JCQlCRUFOX0xJVEVSQUwsCi0JCQlDT05UQUlORVJfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUGVyc2lzdGVuY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVBlcnNpc3RlbmNlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQkVBTjogcmV0dXJuIEJFQU5fTElURVJBTDsKLQkJCWNhc2UgQ09OVEFJTkVSOiByZXR1cm4gQ09OVEFJTkVSX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFBlcnNpc3RlbmNlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vUGVyc2lzdGVuY2VUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9RdWVyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhMGI0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9RdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlF1ZXJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgcXVlcnlUeXBlIGRlZmluZXMgYSBmaW5kZXIgb3Igc2VsZWN0Ci0gKiAJcXVlcnkuIEl0IGNvbnRhaW5zCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5Ci0gKiAJICAgIC0gdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QKLSAqIAkgICAgICBtZXRob2QgaXQgaXMgdXNlZCBieQotICogCQktIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHJlc3VsdCB0eXBlCi0gKiAJCSAgbWFwcGluZywgaWYgdGhlIHF1ZXJ5IGlzIGZvciBhIHNlbGVjdCBtZXRob2QKLSAqIAkJICBhbmQgZW50aXR5IG9iamVjdHMgYXJlIHJldHVybmVkLgotICogCQktIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuCi0gKiAKLSAqIAlRdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTCBtdXN0IHVzZSB0aGUgZWpiLXFsCi0gKiAJZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeSBpcyBub3QgZXhwcmVzc2libGUKLSAqIAlpbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvCi0gKiAJZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudAotICogCXNob3VsZCBiZSBlbXB0eS4KLSAqIAotICogCVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIEl0IGNhbiBvbmx5Ci0gKiAJYmUgcHJlc2VudCBpZiB0aGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyBhIHNlbGVjdCBtZXRob2QKLSAqIAl0aGF0IHJldHVybnMgZW50aXR5IG9iamVjdHMuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCi0gKiAJcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzICJMb2NhbCIuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0UXVlcnlNZXRob2QgPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0UmVzdWx0VHlwZU1hcHBpbmcgPGVtPlJlc3VsdCBUeXBlIE1hcHBpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldEVqYlFsIDxlbT5FamIgUWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRRdWVyeSgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBRdWVyeSBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihEZXNjcmlwdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UXVlcnlfRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKERlc2NyaXB0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1ZXJ5IE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UXVlcnkgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UXVlcnlNZXRob2QoUXVlcnlNZXRob2QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFF1ZXJ5X1F1ZXJ5TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUXVlcnlNZXRob2QgZ2V0UXVlcnlNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldFF1ZXJ5TWV0aG9kIDxlbT5RdWVyeSBNZXRob2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UXVlcnlNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3VsdCBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iTG9jYWwiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZXN1bHRUeXBlTWFwcGluZ1R5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZQotCSAqIEBzZWUgI2lzU2V0UmVzdWx0VHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI3Vuc2V0UmVzdWx0VHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI3NldFJlc3VsdFR5cGVNYXBwaW5nKFJlc3VsdFR5cGVNYXBwaW5nVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UXVlcnlfUmVzdWx0VHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXN1bHRUeXBlTWFwcGluZ1R5cGUgZ2V0UmVzdWx0VHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldFJlc3VsdFR5cGVNYXBwaW5nIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZQotCSAqIEBzZWUgI2lzU2V0UmVzdWx0VHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI3Vuc2V0UmVzdWx0VHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI2dldFJlc3VsdFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXN1bHRUeXBlTWFwcGluZyhSZXN1bHRUeXBlTWFwcGluZ1R5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSNnZXRSZXN1bHRUeXBlTWFwcGluZyA8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXN1bHRUeXBlTWFwcGluZygpCi0JICogQHNlZSAjZ2V0UmVzdWx0VHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI3NldFJlc3VsdFR5cGVNYXBwaW5nKFJlc3VsdFR5cGVNYXBwaW5nVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3VsdFR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldFJlc3VsdFR5cGVNYXBwaW5nIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZXN1bHRUeXBlTWFwcGluZygpCi0JICogQHNlZSAjZ2V0UmVzdWx0VHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI3NldFJlc3VsdFR5cGVNYXBwaW5nKFJlc3VsdFR5cGVNYXBwaW5nVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlc3VsdFR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBRbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYlFsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UXVlcnlfRWpiUWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiUWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldEVqYlFsIDxlbT5FamIgUWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBRbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiUWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYlFsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UXVlcnlfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFF1ZXJ5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUXVlcnlNZXRob2QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1F1ZXJ5TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNWNiMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUXVlcnlNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlF1ZXJ5IE1ldGhvZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCQotICogCi0gKiAJICBUaGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvciBzZWxlY3QKLSAqIAkgIHF1ZXJ5LgotICogCi0gKiAJICBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci0gKiAJICBtZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gKiAKLSAqIAkgIEVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi0gKiAJICBtZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0gKiAKLSAqIAkgIEl0IGlzIHVzZWQgYnkgdGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50LgotICogCi0gKiAJICBFeGFtcGxlOgotICogCi0gKiAJICAmbHQ7cXVlcnkmZ3Q7Ci0gKiAJICAgICAgJmx0O2Rlc2NyaXB0aW9uJmd0O01ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnMmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICogCSAgICAgICZsdDtxdWVyeS1tZXRob2QmZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1uYW1lJmd0O2ZpbmRMYXJnZU9yZGVycyZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbXMmZ3Q7Jmx0Oy9tZXRob2QtcGFyYW1zJmd0OwotICogCSAgICAgICZsdDsvcXVlcnktbWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItcWwmZ3Q7Ci0gKiAJCVNFTEVDVCBPQkpFQ1QobykgRlJPTSBPcmRlciBvCi0gKiAJCSAgV0hFUkUgby5hbW91bnQgJmFtcDtndDsgMTAwMAotICogCSAgICAgICZsdDsvZWpiLXFsJmd0OwotICogCSAgJmx0Oy9xdWVyeSZndDsKLSAqIAotICogCSAgCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZCNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2QjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UXVlcnlNZXRob2QoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnlNZXRob2QgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWV0aG9kTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFF1ZXJ5TWV0aG9kX01ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2QjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2ROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFF1ZXJ5TWV0aG9kX01ldGhvZFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBhcmFtcyBnZXRNZXRob2RQYXJhbXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRRdWVyeU1ldGhvZF9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2QjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUXVlcnlNZXRob2QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3ZDY3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2UgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgZGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEKLSAqIAlyb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBCi0gKiAJcmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSBpcyB1c2VkIGJ5Ci0gKiAJcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnRzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuCi0gKiAJZW50aXR5IGJlYW4uCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFamJOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVqYk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZWxhdGlvbnNoaXBzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZWxhdGlvbnNoaXBzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNmJlNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUmVsYXRpb25zaGlwcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWxhdGlvbnNoaXBzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgcmVsYXRpb25zaGlwc1R5cGUgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluCi0gKiAJd2hpY2ggZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UKLSAqIAlwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHNUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi0gKiAJZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaAotICogCXNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMjZ2V0RWpiUmVsYXRpb25zIDxlbT5FamIgUmVsYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBzI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRSZWxhdGlvbnNoaXBzKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcHMgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWxhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVsYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlbGF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UmVsYXRpb25zaGlwc19FamJSZWxhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYlJlbGF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlbGF0aW9uc2hpcHNfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUmVsYXRpb25zaGlwcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1JlbW92ZU1ldGhvZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1JlbW92ZU1ldGhvZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyZTQxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZW1vdmVNZXRob2RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZW1vdmUgTWV0aG9kIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZSNnZXRCZWFuTWV0aG9kIDxlbT5CZWFuIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZSNpc1JldGFpbklmRXhjZXB0aW9uIDxlbT5SZXRhaW4gSWYgRXhjZXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRSZW1vdmVNZXRob2RUeXBlKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbW92ZU1ldGhvZFR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJlYW4gTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CZWFuIE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CZWFuIE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QmVhbk1ldGhvZChOYW1lZE1ldGhvZFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlbW92ZU1ldGhvZFR5cGVfQmVhbk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU5hbWVkTWV0aG9kVHlwZSBnZXRCZWFuTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2dldEJlYW5NZXRob2QgPGVtPkJlYW4gTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CZWFuIE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QmVhbk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QmVhbk1ldGhvZChOYW1lZE1ldGhvZFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV0YWluIElmIEV4Y2VwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV0YWluIElmIEV4Y2VwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXRhaW4gSWYgRXhjZXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJldGFpbklmRXhjZXB0aW9uKCkKLQkgKiBAc2VlICN1bnNldFJldGFpbklmRXhjZXB0aW9uKCkKLQkgKiBAc2VlICNzZXRSZXRhaW5JZkV4Y2VwdGlvbihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRSZW1vdmVNZXRob2RUeXBlX1JldGFpbklmRXhjZXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1JldGFpbklmRXhjZXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2lzUmV0YWluSWZFeGNlcHRpb24gPGVtPlJldGFpbiBJZiBFeGNlcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldGFpbiBJZiBFeGNlcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmV0YWluSWZFeGNlcHRpb24oKQotCSAqIEBzZWUgI3Vuc2V0UmV0YWluSWZFeGNlcHRpb24oKQotCSAqIEBzZWUgI2lzUmV0YWluSWZFeGNlcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJldGFpbklmRXhjZXB0aW9uKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2lzUmV0YWluSWZFeGNlcHRpb24gPGVtPlJldGFpbiBJZiBFeGNlcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmV0YWluSWZFeGNlcHRpb24oKQotCSAqIEBzZWUgI2lzUmV0YWluSWZFeGNlcHRpb24oKQotCSAqIEBzZWUgI3NldFJldGFpbklmRXhjZXB0aW9uKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZXRhaW5JZkV4Y2VwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2lzUmV0YWluSWZFeGNlcHRpb24gPGVtPlJldGFpbiBJZiBFeGNlcHRpb248L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldGFpbiBJZiBFeGNlcHRpb248L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJldGFpbklmRXhjZXB0aW9uKCkKLQkgKiBAc2VlICNpc1JldGFpbklmRXhjZXB0aW9uKCkKLQkgKiBAc2VlICNzZXRSZXRhaW5JZkV4Y2VwdGlvbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmV0YWluSWZFeGNlcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRSZW1vdmVNZXRob2RUeXBlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFJlbW92ZU1ldGhvZFR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZXN1bHRUeXBlTWFwcGluZ1R5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Jlc3VsdFR5cGVNYXBwaW5nVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjg1Nzg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Jlc3VsdFR5cGVNYXBwaW5nVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgcmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUgaXMgdXNlZCBpbiB0aGUgcXVlcnkgZWxlbWVudCB0bwotICogCXNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSByZXR1cm5lZCBieSBhIHF1ZXJ5Ci0gKiAJZm9yIGEgc2VsZWN0IG1ldGhvZCBpcyB0byBiZSBtYXBwZWQgdG8gYW4gRUpCTG9jYWxPYmplY3Qgb3IKLSAqIAlFSkJPYmplY3QgdHlwZS4KLSAqIAotICogCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogCi0gKiAJICAgIExvY2FsCi0gKiAJICAgIFJlbW90ZQotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRSZXN1bHRUeXBlTWFwcGluZ1R5cGUoKQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzdWx0VHlwZU1hcHBpbmdUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFTU9URV9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1RFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXN1bHRUeXBlTWFwcGluZ1R5cGUgTE9DQUxfTElURVJBTCA9IG5ldyBSZXN1bHRUeXBlTWFwcGluZ1R5cGUoTE9DQUwsICJMb2NhbCIsICJMb2NhbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRU1PVEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc3VsdFR5cGVNYXBwaW5nVHlwZSBSRU1PVEVfTElURVJBTCA9IG5ldyBSZXN1bHRUeXBlTWFwcGluZ1R5cGUoUkVNT1RFLCAiUmVtb3RlIiwgIlJlbW90ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc3VsdFR5cGVNYXBwaW5nVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBSZXN1bHRUeXBlTWFwcGluZ1R5cGVbXSB7Ci0JCQlMT0NBTF9MSVRFUkFMLAotCQkJUkVNT1RFX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzdWx0IFR5cGUgTWFwcGluZyBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXN1bHRUeXBlTWFwcGluZ1R5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlSZXN1bHRUeXBlTWFwcGluZ1R5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXN1bHRUeXBlTWFwcGluZ1R5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlSZXN1bHRUeXBlTWFwcGluZ1R5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlc3VsdCBUeXBlIE1hcHBpbmcgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc3VsdFR5cGVNYXBwaW5nVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTE9DQUw6IHJldHVybiBMT0NBTF9MSVRFUkFMOwotCQkJY2FzZSBSRU1PVEU6IHJldHVybiBSRU1PVEVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUmVzdWx0VHlwZU1hcHBpbmdUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9SZXN1bHRUeXBlTWFwcGluZ1R5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1NlY3VyaXR5SWRlbnRpdHlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9TZWN1cml0eUlkZW50aXR5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y1ODRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1NlY3VyaXR5SWRlbnRpdHlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXR5IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBzZWN1cml0eS1pZGVudGl0eVR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzCi0gKiAJc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLSAqIAltZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcwotICogCWlkZW50aXR5IGlzIHRvIGJlIHVzZWQuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlI2dldFVzZUNhbGxlcklkZW50aXR5IDxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXRSdW5BcyA8ZW0+UnVuIEFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGUoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VjdXJpdHlJZGVudGl0eVR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlY3VyaXR5SWRlbnRpdHlUeXBlX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2UgQ2FsbGVyIElkZW50aXR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgICAgVGhlIHVzZS1jYWxsZXItaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgdGhhdAotCSAqIAkgICAgICB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUKLQkgKiAJICAgICAgc2VjdXJpdHkgaWRlbnRpdHkgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlCi0JICogCSAgICAgIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZHMuCi0JICogCi0JICogCSAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VXNlQ2FsbGVySWRlbnRpdHkoRW1wdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9Vc2VDYWxsZXJJZGVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVtcHR5VHlwZSBnZXRVc2VDYWxsZXJJZGVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGUjZ2V0VXNlQ2FsbGVySWRlbnRpdHkgPGVtPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFVzZUNhbGxlcklkZW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2VDYWxsZXJJZGVudGl0eShFbXB0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UnVuIEFzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SdW4gQXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UnVuIEFzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSdW5BcyhSdW5BcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfUnVuQXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSdW5BcyBnZXRSdW5BcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGUjZ2V0UnVuQXMgPGVtPlJ1biBBczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UnVuIEFzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSdW5BcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UnVuQXMoUnVuQXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlY3VyaXR5SWRlbnRpdHlUeXBlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTZWN1cml0eUlkZW50aXR5VHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Nlc3Npb25CZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9TZXNzaW9uQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGYyMDVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Nlc3Npb25CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlc3Npb24gQmVhbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHNlc3Npb24tYmVhblR5cGUgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUKLSAqIAlkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLSAqIAotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotICogCSAgICAgIGljb24gZmlsZSBuYW1lCi0gKiAJICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLSAqIAkgICAgICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbgotICogICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQotICogICAgICAgICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAotICogICAgICAgICAgICAgICBqbmRpLW5hbWUgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lL2J1c2luZXNzIGludGVyZmFjZS4KLSAqICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsCi0gKiAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucy4gQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotICogICAgICAgICAgICAgLSB0aGUgbmFtZXMgb2YgYWxsIHRoZSByZW1vdGUgb3IgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlcywKLSAqICAgICAgICAgICAgICAgaWYgYW55Ci0gKiAJICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaG9tZSBhbmQKLSAqIAkgICAgICByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0gKiAJICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZAotICogCSAgICAgIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueQotICogCSAgICAtIHRoZSBuYW1lIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyB3ZWIgc2VydmljZSBlbmRwb2ludAotICogCSAgICAgIGludGVyZmFjZSwgaWYgYW55Ci0gKiAJICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gKiAJICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIHN0YXRlIG1hbmFnZW1lbnQgdHlwZQotICogICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgdGltZW91dCBtZXRob2QuCi0gKiAJICAgIC0gdGhlIG9wdGlvbmFsIHNlc3Npb24gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLSAqICAgICAgICAgICAgICAgSWYgaXQgaXMgbm90IHByZXNlbnQsIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0gKiAgICAgICAgICAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBhbmQvb3IKLSAqICAgICAgICAgICAgICAgc3VwZXJjbGFzcyBhcm91bmQtaW52b2tlIG1ldGhvZHMuCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICogCSAgICAgIGVudmlyb25tZW50IGVudHJpZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotICogCSAgICAgIEVKQiByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIKLSAqIAkgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotICogCSAgICAgIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLSAqIAkgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLSAqIAkgICAgICBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICogCSAgICAgIGVudmlyb25tZW50IHJlZmVyZW5jZXMuCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlCi0gKiAJICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICogCi0gKiAJVGhlIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZQotICogCXRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlCi0gKiAJZW1wdHkuCi0gKiAKLSAqIAlFaXRoZXIgYm90aCB0aGUgbG9jYWwtaG9tZSBhbmQgdGhlIGxvY2FsIGVsZW1lbnRzIG9yIGJvdGgKLSAqIAl0aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlCi0gKiAJc2Vzc2lvbiBiZWFuLgotICogCi0gKiAJVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgaWYgdGhlCi0gKiAJYmVhbiBpcyBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4uCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRIb21lIDxlbT5Ib21lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRSZW1vdGUgPGVtPlJlbW90ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0TG9jYWxIb21lIDxlbT5Mb2NhbCBIb21lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRMb2NhbCA8ZW0+TG9jYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEJ1c2luZXNzTG9jYWxzIDxlbT5CdXNpbmVzcyBMb2NhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEJ1c2luZXNzUmVtb3RlcyA8ZW0+QnVzaW5lc3MgUmVtb3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VydmljZUVuZHBvaW50IDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJDbGFzcyA8ZW0+RWpiIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXNzaW9uVHlwZSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRUaW1lb3V0TWV0aG9kIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0SW5pdE1ldGhvZHMgPGVtPkluaXQgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UmVtb3ZlTWV0aG9kcyA8ZW0+UmVtb3ZlIE1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QXJvdW5kSW52b2tlcyA8ZW0+QXJvdW5kIEludm9rZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RWpiTG9jYWxSZWZzIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQb3N0QWN0aXZhdGVzIDxlbT5Qb3N0IEFjdGl2YXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UHJlUGFzc2l2YXRlcyA8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlY3VyaXR5Um9sZVJlZnMgPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VjdXJpdHlJZGVudGl0aWVzIDxlbT5TZWN1cml0eSBJZGVudGl0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW4oKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2Vzc2lvbkJlYW4gZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9EaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9JY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0VqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RWpiTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFamJOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9NYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SG9tZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib21lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIb21lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIb21lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRIb21lIDxlbT5Ib21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ib21lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIb21lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlbW90ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1vdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbW90ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1JlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZW1vdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFJlbW90ZSA8ZW0+UmVtb3RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1vdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtb3RlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2FsSG9tZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0xvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMb2NhbEhvbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldExvY2FsSG9tZSA8ZW0+TG9jYWwgSG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWwgSG9tZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9jYWxIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhbEhvbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9jYWwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9Mb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMb2NhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0TG9jYWwgPGVtPkxvY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9jYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2FsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CdXNpbmVzcyBMb2NhbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJ1c2luZXNzIExvY2FsczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJ1c2luZXNzIExvY2FsczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fQnVzaW5lc3NMb2NhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEJ1c2luZXNzTG9jYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CdXNpbmVzcyBSZW1vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CdXNpbmVzcyBSZW1vdGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnVzaW5lc3MgUmVtb3RlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fQnVzaW5lc3NSZW1vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRCdXNpbmVzc1JlbW90ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBjb250YWlucyB0aGUKLQkgKiAJICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyB3ZWIKLQkgKiAJICAgIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLiBUaGUgc2VydmljZS1lbmRwb2ludAotCSAqIAkgICAgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGEgc3RhdGVsZXNzCi0JICogCSAgICBzZXNzaW9uIGJlYW4uIFRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG11c3QgYmUgYQotCSAqIAkgICAgdmFsaWQgSkFYLVJQQyBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VydmljZUVuZHBvaW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fU2VydmljZUVuZHBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlcnZpY2VFbmRwb2ludCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VydmljZUVuZHBvaW50IDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VFbmRwb2ludChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAgICAgICAgICAgICAgVGhlIGVqYi1jbGFzcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUKLQkgKiAgICAgICAgICAgICAgb2YgdGhlIGJlYW4gY2xhc3MgZm9yIHRoaXMgZWpiLiAgSXQgaXMgcmVxdWlyZWQgdW5sZXNzCi0JICogICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tcG9uZW50LWRlZmluaW5nIGFubm90YXRpb24gZm9yIHRoZSBzYW1lCi0JICogICAgICAgICAgICAgIGVqYi1uYW1lLgotCSAqIAotCSAqICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFamJDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0VqYkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVqYkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJDbGFzcyA8ZW0+RWpiIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVqYkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFamJDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IlN0YXRlZnVsIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2Vzc2lvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlc3Npb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZQotCSAqIEBzZWUgI2lzU2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI3NldFNlc3Npb25UeXBlKFNlc3Npb25UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9TZXNzaW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlc3Npb25UeXBlIGdldFNlc3Npb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXNzaW9uVHlwZSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXNzaW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvblR5cGUKLQkgKiBAc2VlICNpc1NldFNlc3Npb25UeXBlKCkKLQkgKiBAc2VlICN1bnNldFNlc3Npb25UeXBlKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2Vzc2lvblR5cGUoU2Vzc2lvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXNzaW9uVHlwZSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNlc3Npb25UeXBlKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjc2V0U2Vzc2lvblR5cGUoU2Vzc2lvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTZXNzaW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXNzaW9uVHlwZSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXNzaW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNlc3Npb25UeXBlKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjc2V0U2Vzc2lvblR5cGUoU2Vzc2lvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTZXNzaW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZW91dCBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUaW1lb3V0TWV0aG9kKE5hbWVkTWV0aG9kVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fVGltZW91dE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU5hbWVkTWV0aG9kVHlwZSBnZXRUaW1lb3V0TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRUaW1lb3V0TWV0aG9kIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZW91dCBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRpbWVvdXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpbWVvdXRNZXRob2QoTmFtZWRNZXRob2RUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXQgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGluaXQtbWV0aG9kIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtYXBwaW5ncyBmb3IKLQkgKiAJICAgIEVKQiAyLnggc3R5bGUgY3JlYXRlIG1ldGhvZHMgZm9yIGFuIEVKQiAzLjAgYmVhbi4KLQkgKiAJICAgIFRoaXMgZWxlbWVudCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHN0YXRlZnVsCi0JICogICAgICAgICAgICAgc2Vzc2lvbiBiZWFucy4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdCBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9Jbml0TWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5pdE1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbW92ZSBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSByZW1vdmUtbWV0aG9kIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtYXBwaW5ncyBmb3IKLQkgKiAJICAgIEVKQiAyLnggc3R5bGUgcmVtb3ZlIG1ldGhvZHMgZm9yIGFuIEVKQiAzLjAgYmVhbi4KLQkgKiAJICAgIFRoaXMgZWxlbWVudCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHN0YXRlZnVsCi0JICogICAgICAgICAgICAgc2Vzc2lvbiBiZWFucy4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3ZlIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1JlbW92ZU1ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlbW92ZU1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iQmVhbiI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9UcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXJvdW5kIEludm9rZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFyb3VuZCBJbnZva2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXJvdW5kIEludm9rZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0Fyb3VuZEludm9rZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEFyb3VuZEludm9rZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudiBFbnRyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0VudkVudHJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVudkVudHJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9FamJSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFamJSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9FamJMb2NhbFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9TZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1Jlc291cmNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9SZXNvdXJjZUVudlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlRW52UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fUG9zdENvbnN0cnVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9QcmVEZXN0cm95cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UHJlRGVzdHJveXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgQWN0aXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgQWN0aXZhdGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1Bvc3RBY3RpdmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBvc3RBY3RpdmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBQYXNzaXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBQYXNzaXZhdGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1ByZVBhc3NpdmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByZVBhc3NpdmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9TZWN1cml0eVJvbGVSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cml0eSBJZGVudGl0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IElkZW50aXRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlY3VyaXR5SWRlbnRpdGllcyhTZWN1cml0eUlkZW50aXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fU2VjdXJpdHlJZGVudGl0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VjdXJpdHlJZGVudGl0eVR5cGUgZ2V0U2VjdXJpdHlJZGVudGl0aWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZWN1cml0eUlkZW50aXRpZXMgPGVtPlNlY3VyaXR5IElkZW50aXRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IElkZW50aXRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlY3VyaXR5SWRlbnRpdGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VjdXJpdHlJZGVudGl0aWVzKFNlY3VyaXR5SWRlbnRpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2Vzc2lvbkJlYW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9TZXNzaW9uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvU2Vzc2lvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxNzEwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9TZXNzaW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgc2Vzc2lvbi10eXBlVHlwZSBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLSAqIAlzdGF0ZWZ1bCBzZXNzaW9uIG9yIHN0YXRlbGVzcyBzZXNzaW9uLiBJdCBpcyB1c2VkIGJ5Ci0gKiAJc2Vzc2lvbi10eXBlIGVsZW1lbnRzLgotICogCi0gKiAJVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICogCi0gKiAJICAgIFN0YXRlZnVsCi0gKiAJICAgIFN0YXRlbGVzcwotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXNzaW9uVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhdGVmdWw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXRlZnVsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVRFRlVMX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURUZVTCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGF0ZWxlc3M8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXRlbGVzczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFURUxFU1NfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTEVTUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGF0ZWZ1bDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFURUZVTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2Vzc2lvblR5cGUgU1RBVEVGVUxfTElURVJBTCA9IG5ldyBTZXNzaW9uVHlwZShTVEFURUZVTCwgIlN0YXRlZnVsIiwgIlN0YXRlZnVsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhdGVsZXNzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVRFTEVTUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2Vzc2lvblR5cGUgU1RBVEVMRVNTX0xJVEVSQUwgPSBuZXcgU2Vzc2lvblR5cGUoU1RBVEVMRVNTLCAiU3RhdGVsZXNzIiwgIlN0YXRlbGVzcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNlc3Npb25UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFNlc3Npb25UeXBlW10gewotCQkJU1RBVEVGVUxfTElURVJBTCwKLQkJCVNUQVRFTEVTU19MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlNlc3Npb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2Vzc2lvblR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlTZXNzaW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNlc3Npb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlc3Npb25UeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJU2Vzc2lvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNlc3Npb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlc3Npb25UeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBTVEFURUZVTDogcmV0dXJuIFNUQVRFRlVMX0xJVEVSQUw7Ci0JCQljYXNlIFNUQVRFTEVTUzogcmV0dXJuIFNUQVRFTEVTU19MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTZXNzaW9uVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vU2Vzc2lvblR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTI0MWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHRyYW5zLWF0dHJpYnV0ZVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QKLSAqIAltYW5hZ2UgdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kCi0gKiAJaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0gKiAKLSAqIAlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqIAotICogCSAgICBOb3RTdXBwb3J0ZWQKLSAqIAkgICAgU3VwcG9ydHMKLSAqIAkgICAgUmVxdWlyZWQKLSAqIAkgICAgUmVxdWlyZXNOZXcKLSAqIAkgICAgTWFuZGF0b3J5Ci0gKiAJICAgIE5ldmVyCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5vdCBTdXBwb3J0ZWQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5vdCBTdXBwb3J0ZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9UX1NVUFBPUlRFRF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1NVUFBPUlRFRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdXBwb3J0czwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3VwcG9ydHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1VQUE9SVFNfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUFBPUlRTID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVFVSVJFRF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUlSRUQgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVxdWlyZXMgTmV3PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SZXF1aXJlcyBOZXc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVRVUlSRVNfTkVXX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFU19ORVcgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TWFuZGF0b3J5PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5NYW5kYXRvcnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTUFOREFUT1JZX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQU5EQVRPUlkgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TmV2ZXI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5ldmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05FVkVSX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVZFUiA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Ob3QgU3VwcG9ydGVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PVF9TVVBQT1JURUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBOT1RfU1VQUE9SVEVEX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKE5PVF9TVVBQT1JURUQsICJOb3RTdXBwb3J0ZWQiLCAiTm90U3VwcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3VwcG9ydHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1VQUE9SVFMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBTVVBQT1JUU19MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShTVVBQT1JUUywgIlN1cHBvcnRzIiwgIlN1cHBvcnRzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVRVUlSRUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBSRVFVSVJFRF9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShSRVFVSVJFRCwgIlJlcXVpcmVkIiwgIlJlcXVpcmVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVxdWlyZXMgTmV3PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUVVJUkVTX05FVwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIFJFUVVJUkVTX05FV19MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShSRVFVSVJFU19ORVcsICJSZXF1aXJlc05ldyIsICJSZXF1aXJlc05ldyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk1hbmRhdG9yeTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNNQU5EQVRPUlkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBNQU5EQVRPUllfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoTUFOREFUT1JZLCAiTWFuZGF0b3J5IiwgIk1hbmRhdG9yeSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5ldmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05FVkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgTkVWRVJfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoTkVWRVIsICJOZXZlciIsICJOZXZlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZVtdIHsKLQkJCU5PVF9TVVBQT1JURURfTElURVJBTCwKLQkJCVNVUFBPUlRTX0xJVEVSQUwsCi0JCQlSRVFVSVJFRF9MSVRFUkFMLAotCQkJUkVRVUlSRVNfTkVXX0xJVEVSQUwsCi0JCQlNQU5EQVRPUllfTElURVJBTCwKLQkJCU5FVkVSX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOT1RfU1VQUE9SVEVEOiByZXR1cm4gTk9UX1NVUFBPUlRFRF9MSVRFUkFMOwotCQkJY2FzZSBTVVBQT1JUUzogcmV0dXJuIFNVUFBPUlRTX0xJVEVSQUw7Ci0JCQljYXNlIFJFUVVJUkVEOiByZXR1cm4gUkVRVUlSRURfTElURVJBTDsKLQkJCWNhc2UgUkVRVUlSRVNfTkVXOiByZXR1cm4gUkVRVUlSRVNfTkVXX0xJVEVSQUw7Ci0JCQljYXNlIE1BTkRBVE9SWTogcmV0dXJuIE1BTkRBVE9SWV9MSVRFUkFMOwotCQkJY2FzZSBORVZFUjogcmV0dXJuIE5FVkVSX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9UcmFuc2FjdGlvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1RyYW5zYWN0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTk3YjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1RyYW5zYWN0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHRyYW5zYWN0aW9uLXR5cGVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncwotICogCXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLSAqIAotICogCVRoZSB0cmFuc2FjdGlvbi10eXBlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICogCi0gKiAJICAgIEJlYW4KLSAqIAkgICAgQ29udGFpbmVyCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc2FjdGlvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJlYW48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkJlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQkVBTl9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVBTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UQUlORVJfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5FUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0JFQU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uVHlwZSBCRUFOX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25UeXBlKEJFQU4sICJCZWFuIiwgIkJlYW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgQ09OVEFJTkVSX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25UeXBlKENPTlRBSU5FUiwgIkNvbnRhaW5lciIsICJDb250YWluZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFRyYW5zYWN0aW9uVHlwZVtdIHsKLQkJCUJFQU5fTElURVJBTCwKLQkJCUNPTlRBSU5FUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvblR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc2FjdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25UeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHJhbnNhY3Rpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25UeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBCRUFOOiByZXR1cm4gQkVBTl9MSVRFUkFMOwotCQkJY2FzZSBDT05UQUlORVI6IHJldHVybiBDT05UQUlORVJfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25UeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9UcmFuc2FjdGlvblR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwZmQxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdGlvbkNvbmZpZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFjdGl2YXRpb25Db25maWcgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3RpdmF0aW9uQ29uZmlnSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZBVElPTl9DT05GSUc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkgewotCQlpZiAoYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMgIT0gbnVsbCAmJiAhYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQWN0aXZhdGlvbkNvbmZpZ0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmUxMTdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSgpIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKSA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lID0gQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgpIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKCkgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSA9IEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKFN0cmluZyBuZXdBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKSB7Ci0JCVN0cmluZyBvbGRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lID0gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZTsKLQkJYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSA9IG5ld0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX05BTUUsIG9sZEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUsIGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKCkgewotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoU3RyaW5nIG5ld0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKSB7Ci0JCVN0cmluZyBvbGRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSA9IGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlOwotCQlhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSA9IG5ld0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9WQUxVRSwgb2xkQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUsIGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfTkFNRToKLQkJCQlzZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfVkFMVUU6Ci0JCQkJc2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FOgotCQkJCXNldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9WQUxVRToKLQkJCQlzZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZShBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX05BTUU6Ci0JCQkJcmV0dXJuIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUgIT0gbnVsbCA6ICFBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FX0VERUZBVUxULmVxdWFscyhhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfVkFMVUU6Ci0JCQkJcmV0dXJuIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSAhPSBudWxsIDogIUFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX1ZBTFVFX0VERUZBVUxULmVxdWFscyhhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25FeGNlcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTc2OTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXBwbGljYXRpb24gRXhjZXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRXhjZXB0aW9uSW1wbCNnZXRFeGNlcHRpb25DbGFzcyA8ZW0+RXhjZXB0aW9uIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRXhjZXB0aW9uSW1wbCNpc1JvbGxiYWNrIDxlbT5Sb2xsYmFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25FeGNlcHRpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2VwdGlvbkNsYXNzKCkgPGVtPkV4Y2VwdGlvbiBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjZXB0aW9uQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNlcHRpb25DbGFzcygpIDxlbT5FeGNlcHRpb24gQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4Y2VwdGlvbkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4Y2VwdGlvbkNsYXNzID0gRVhDRVBUSU9OX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUm9sbGJhY2soKSA8ZW0+Um9sbGJhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUm9sbGJhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBST0xMQkFDS19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSb2xsYmFjaygpIDxlbT5Sb2xsYmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSb2xsYmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcm9sbGJhY2sgPSBST0xMQkFDS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUm9sbGJhY2sgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJvbGxiYWNrRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25FeGNlcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BUFBMSUNBVElPTl9FWENFUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGNlcHRpb25DbGFzcygpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvbkNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbkNsYXNzKFN0cmluZyBuZXdFeGNlcHRpb25DbGFzcykgewotCQlTdHJpbmcgb2xkRXhjZXB0aW9uQ2xhc3MgPSBleGNlcHRpb25DbGFzczsKLQkJZXhjZXB0aW9uQ2xhc3MgPSBuZXdFeGNlcHRpb25DbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0VYQ0VQVElPTl9DTEFTUywgb2xkRXhjZXB0aW9uQ2xhc3MsIGV4Y2VwdGlvbkNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsYmFjaygpIHsKLQkJcmV0dXJuIHJvbGxiYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGxiYWNrKGJvb2xlYW4gbmV3Um9sbGJhY2spIHsKLQkJYm9vbGVhbiBvbGRSb2xsYmFjayA9IHJvbGxiYWNrOwotCQlyb2xsYmFjayA9IG5ld1JvbGxiYWNrOwotCQlib29sZWFuIG9sZFJvbGxiYWNrRVNldCA9IHJvbGxiYWNrRVNldDsKLQkJcm9sbGJhY2tFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX1JPTExCQUNLLCBvbGRSb2xsYmFjaywgcm9sbGJhY2ssICFvbGRSb2xsYmFja0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJvbGxiYWNrKCkgewotCQlib29sZWFuIG9sZFJvbGxiYWNrID0gcm9sbGJhY2s7Ci0JCWJvb2xlYW4gb2xkUm9sbGJhY2tFU2V0ID0gcm9sbGJhY2tFU2V0OwotCQlyb2xsYmFjayA9IFJPTExCQUNLX0VERUZBVUxUOwotCQlyb2xsYmFja0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fUk9MTEJBQ0ssIG9sZFJvbGxiYWNrLCBST0xMQkFDS19FREVGQVVMVCwgb2xkUm9sbGJhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSb2xsYmFjaygpIHsKLQkJcmV0dXJuIHJvbGxiYWNrRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0VYQ0VQVElPTl9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RXhjZXB0aW9uQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX1JPTExCQUNLOgotCQkJCXJldHVybiBpc1JvbGxiYWNrKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0VYQ0VQVElPTl9DTEFTUzoKLQkJCQlzZXRFeGNlcHRpb25DbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19ST0xMQkFDSzoKLQkJCQlzZXRSb2xsYmFjaygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fRVhDRVBUSU9OX0NMQVNTOgotCQkJCXNldEV4Y2VwdGlvbkNsYXNzKEVYQ0VQVElPTl9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fUk9MTEJBQ0s6Ci0JCQkJdW5zZXRSb2xsYmFjaygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0VYQ0VQVElPTl9DTEFTUzoKLQkJCQlyZXR1cm4gRVhDRVBUSU9OX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBleGNlcHRpb25DbGFzcyAhPSBudWxsIDogIUVYQ0VQVElPTl9DTEFTU19FREVGQVVMVC5lcXVhbHMoZXhjZXB0aW9uQ2xhc3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fUk9MTEJBQ0s6Ci0JCQkJcmV0dXJuIGlzU2V0Um9sbGJhY2soKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZXhjZXB0aW9uQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXhjZXB0aW9uQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJvbGxiYWNrOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocm9sbGJhY2tFU2V0KSByZXN1bHQuYXBwZW5kKHJvbGxiYWNrKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uRXhjZXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXJvdW5kSW52b2tlVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXJvdW5kSW52b2tlVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxY2U3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fyb3VuZEludm9rZVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJvdW5kIEludm9rZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFyb3VuZEludm9rZVR5cGVJbXBsI2dldENsYXNzXyA8ZW0+Q2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXJvdW5kSW52b2tlVHlwZUltcGwjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcm91bmRJbnZva2VUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXJvdW5kSW52b2tlVHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzXygpIDxlbT5DbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NfKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc18oKSA8ZW0+Q2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzXygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc18gPSBDTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZE5hbWUgPSBNRVRIT0RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcm91bmRJbnZva2VUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQVJPVU5EX0lOVk9LRV9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NfKCkgewotCQlyZXR1cm4gY2xhc3NfOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzKFN0cmluZyBuZXdDbGFzcykgewotCQlTdHJpbmcgb2xkQ2xhc3MgPSBjbGFzc187Ci0JCWNsYXNzXyA9IG5ld0NsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRV9fQ0xBU1MsIG9sZENsYXNzLCBjbGFzc18pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7Ci0JCXJldHVybiBtZXRob2ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIG5ld01ldGhvZE5hbWUpIHsKLQkJU3RyaW5nIG9sZE1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotCQltZXRob2ROYW1lID0gbmV3TWV0aG9kTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BUk9VTkRfSU5WT0tFX1RZUEVfX01FVEhPRF9OQU1FLCBvbGRNZXRob2ROYW1lLCBtZXRob2ROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRV9fQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldENsYXNzXygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRV9fTUVUSE9EX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRV9fQ0xBU1M6Ci0JCQkJc2V0Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRV9fTUVUSE9EX05BTUU6Ci0JCQkJc2V0TWV0aG9kTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRV9fQ0xBU1M6Ci0JCQkJc2V0Q2xhc3MoQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BUk9VTkRfSU5WT0tFX1RZUEVfX01FVEhPRF9OQU1FOgotCQkJCXNldE1ldGhvZE5hbWUoTUVUSE9EX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRV9fQ0xBU1M6Ci0JCQkJcmV0dXJuIENMQVNTX0VERUZBVUxUID09IG51bGwgPyBjbGFzc18gIT0gbnVsbCA6ICFDTEFTU19FREVGQVVMVC5lcXVhbHMoY2xhc3NfKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BUk9VTkRfSU5WT0tFX1RZUEVfX01FVEhPRF9OQU1FOgotCQkJCXJldHVybiBNRVRIT0RfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWV0aG9kTmFtZSAhPSBudWxsIDogIU1FVEhPRF9OQU1FX0VERUZBVUxULmVxdWFscyhtZXRob2ROYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNsYXNzXyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0aG9kTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtZXRob2ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQXJvdW5kSW52b2tlVHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fzc2VtYmx5RGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXNzZW1ibHlEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTA3YTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXNzZW1ibHlEZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRXhjbHVkZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFzc2VtYmx5IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3NlbWJseURlc2NyaXB0b3JJbXBsI2dldE1ldGhvZFBlcm1pc3Npb25zIDxlbT5NZXRob2QgUGVybWlzc2lvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCNnZXRDb250YWluZXJUcmFuc2FjdGlvbnMgPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCNnZXRJbnRlcmNlcHRvckJpbmRpbmdzIDxlbT5JbnRlcmNlcHRvciBCaW5kaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3NlbWJseURlc2NyaXB0b3JJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzc2VtYmx5RGVzY3JpcHRvckltcGwjZ2V0RXhjbHVkZUxpc3QgPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3NlbWJseURlc2NyaXB0b3JJbXBsI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9ucyA8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3NlbWJseURlc2NyaXB0b3JJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFzc2VtYmx5RGVzY3JpcHRvckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFzc2VtYmx5RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdXJpdHlSb2xlcygpIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQZXJtaXNzaW9ucygpIDxlbT5NZXRob2QgUGVybWlzc2lvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGVybWlzc2lvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RQZXJtaXNzaW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250YWluZXJUcmFuc2FjdGlvbnMoKSA8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250YWluZXJUcmFuc2FjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb250YWluZXJUcmFuc2FjdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpIDxlbT5JbnRlcmNlcHRvciBCaW5kaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW50ZXJjZXB0b3JCaW5kaW5ncyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVMaXN0KCkgPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjbHVkZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFeGNsdWRlTGlzdCBleGNsdWRlTGlzdCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKSA8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhcHBsaWNhdGlvbkV4Y2VwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQVNTRU1CTFlfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWN1cml0eVJvbGVzKCkgewotCQlpZiAoc2VjdXJpdHlSb2xlcyA9PSBudWxsKSB7Ci0JCQlzZWN1cml0eVJvbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlY3VyaXR5Um9sZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIHNlY3VyaXR5Um9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGVybWlzc2lvbnMoKSB7Ci0JCWlmIChtZXRob2RQZXJtaXNzaW9ucyA9PSBudWxsKSB7Ci0JCQltZXRob2RQZXJtaXNzaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBlcm1pc3Npb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbnRhaW5lclRyYW5zYWN0aW9ucygpIHsKLQkJaWYgKGNvbnRhaW5lclRyYW5zYWN0aW9ucyA9PSBudWxsKSB7Ci0JCQljb250YWluZXJUcmFuc2FjdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0NPTlRBSU5FUl9UUkFOU0FDVElPTlMpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXJUcmFuc2FjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpIHsKLQkJaWYgKGludGVyY2VwdG9yQmluZGluZ3MgPT0gbnVsbCkgewotCQkJaW50ZXJjZXB0b3JCaW5kaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0lOVEVSQ0VQVE9SX0JJTkRJTkdTKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJjZXB0b3JCaW5kaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgewotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9ucyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4Y2x1ZGVMaXN0IGdldEV4Y2x1ZGVMaXN0KCkgewotCQlyZXR1cm4gZXhjbHVkZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXhjbHVkZUxpc3QoRXhjbHVkZUxpc3QgbmV3RXhjbHVkZUxpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRXhjbHVkZUxpc3Qgb2xkRXhjbHVkZUxpc3QgPSBleGNsdWRlTGlzdDsKLQkJZXhjbHVkZUxpc3QgPSBuZXdFeGNsdWRlTGlzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1QsIG9sZEV4Y2x1ZGVMaXN0LCBuZXdFeGNsdWRlTGlzdCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhjbHVkZUxpc3QoRXhjbHVkZUxpc3QgbmV3RXhjbHVkZUxpc3QpIHsKLQkJaWYgKG5ld0V4Y2x1ZGVMaXN0ICE9IGV4Y2x1ZGVMaXN0KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChleGNsdWRlTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClleGNsdWRlTGlzdCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFeGNsdWRlTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeGNsdWRlTGlzdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEV4Y2x1ZGVMaXN0KG5ld0V4Y2x1ZGVMaXN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNULCBuZXdFeGNsdWRlTGlzdCwgbmV3RXhjbHVkZUxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKSB7Ci0JCWlmIChhcHBsaWNhdGlvbkV4Y2VwdGlvbnMgPT0gbnVsbCkgewotCQkJYXBwbGljYXRpb25FeGNlcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0VYQ0VQVElPTlMpOwotCQl9Ci0JCXJldHVybiBhcHBsaWNhdGlvbkV4Y2VwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kUGVybWlzc2lvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0NPTlRBSU5FUl9UUkFOU0FDVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250YWluZXJUcmFuc2FjdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0lOVEVSQ0VQVE9SX0JJTkRJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RXhjbHVkZUxpc3QobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fRVhDRVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGVybWlzc2lvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19DT05UQUlORVJfVFJBTlNBQ1RJT05TOgotCQkJCXJldHVybiBnZXRDb250YWluZXJUcmFuc2FjdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19JTlRFUkNFUFRPUl9CSU5ESU5HUzoKLQkJCQlyZXR1cm4gZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNUOgotCQkJCXJldHVybiBnZXRFeGNsdWRlTGlzdCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0VYQ0VQVElPTlM6Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKLQkJCQlnZXRNZXRob2RQZXJtaXNzaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kUGVybWlzc2lvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19DT05UQUlORVJfVFJBTlNBQ1RJT05TOgotCQkJCWdldENvbnRhaW5lclRyYW5zYWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSU5URVJDRVBUT1JfQklORElOR1M6Ci0JCQkJZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJc2V0RXhjbHVkZUxpc3QoKEV4Y2x1ZGVMaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fRVhDRVBUSU9OUzoKLQkJCQlnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKLQkJCQlnZXRNZXRob2RQZXJtaXNzaW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0NPTlRBSU5FUl9UUkFOU0FDVElPTlM6Ci0JCQkJZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSU5URVJDRVBUT1JfQklORElOR1M6Ci0JCQkJZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJc2V0RXhjbHVkZUxpc3QoKEV4Y2x1ZGVMaXN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19BUFBMSUNBVElPTl9FWENFUFRJT05TOgotCQkJCWdldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlSb2xlcyAhPSBudWxsICYmICFzZWN1cml0eVJvbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlM6Ci0JCQkJcmV0dXJuIG1ldGhvZFBlcm1pc3Npb25zICE9IG51bGwgJiYgIW1ldGhvZFBlcm1pc3Npb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19DT05UQUlORVJfVFJBTlNBQ1RJT05TOgotCQkJCXJldHVybiBjb250YWluZXJUcmFuc2FjdGlvbnMgIT0gbnVsbCAmJiAhY29udGFpbmVyVHJhbnNhY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19JTlRFUkNFUFRPUl9CSU5ESU5HUzoKLQkJCQlyZXR1cm4gaW50ZXJjZXB0b3JCaW5kaW5ncyAhPSBudWxsICYmICFpbnRlcmNlcHRvckJpbmRpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9ucyAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJcmV0dXJuIGV4Y2x1ZGVMaXN0ICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fRVhDRVBUSU9OUzoKLQkJCQlyZXR1cm4gYXBwbGljYXRpb25FeGNlcHRpb25zICE9IG51bGwgJiYgIWFwcGxpY2F0aW9uRXhjZXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Fzc2VtYmx5RGVzY3JpcHRvckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUEZpZWxkSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVBGaWVsZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5ZmI5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUEZpZWxkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNNUCBGaWVsZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVBGaWVsZEltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ01QRmllbGRJbXBsI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVBGaWVsZEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ01QRmllbGRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDTVBGaWVsZCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkTmFtZSgpIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGROYW1lKCkgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZE5hbWUgPSBGSUVMRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ01QRmllbGRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5DTVBfRklFTEQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DTVBfRklFTERfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuIGZpZWxkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZE5hbWUoU3RyaW5nIG5ld0ZpZWxkTmFtZSkgewotCQlTdHJpbmcgb2xkRmllbGROYW1lID0gZmllbGROYW1lOwotCQlmaWVsZE5hbWUgPSBuZXdGaWVsZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ01QX0ZJRUxEX19GSUVMRF9OQU1FLCBvbGRGaWVsZE5hbWUsIGZpZWxkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ01QX0ZJRUxEX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTERfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIGdldEZpZWxkTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTERfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fRklFTERfTkFNRToKLQkJCQlzZXRGaWVsZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTERfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTERfX0ZJRUxEX05BTUU6Ci0JCQkJc2V0RmllbGROYW1lKEZJRUxEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTERfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTERfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0ZJRUxEX19GSUVMRF9OQU1FOgotCQkJCXJldHVybiBGSUVMRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBmaWVsZE5hbWUgIT0gbnVsbCA6ICFGSUVMRF9OQU1FX0VERUZBVUxULmVxdWFscyhmaWVsZE5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaWVsZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZmllbGROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NNUEZpZWxkSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ01SRmllbGRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUkZpZWxkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjkyMWJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ01SRmllbGRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNNUiBGaWVsZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVJGaWVsZEltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ01SRmllbGRJbXBsI2dldENtckZpZWxkTmFtZSA8ZW0+Q21yIEZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ01SRmllbGRJbXBsI2dldENtckZpZWxkVHlwZSA8ZW0+Q21yIEZpZWxkIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ01SRmllbGRJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENNUkZpZWxkSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ01SRmllbGQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbXJGaWVsZE5hbWUoKSA8ZW0+Q21yIEZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENtckZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01SX0ZJRUxEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q21yRmllbGROYW1lKCkgPGVtPkNtciBGaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbXJGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY21yRmllbGROYW1lID0gQ01SX0ZJRUxEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q21yRmllbGRUeXBlKCkgPGVtPkNtciBGaWVsZCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbXJGaWVsZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ01SRmllbGRUeXBlIENNUl9GSUVMRF9UWVBFX0VERUZBVUxUID0gQ01SRmllbGRUeXBlLkpBVkFfVVRJTF9DT0xMRUNUSU9OX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbXJGaWVsZFR5cGUoKSA8ZW0+Q21yIEZpZWxkIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENtckZpZWxkVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENNUkZpZWxkVHlwZSBjbXJGaWVsZFR5cGUgPSBDTVJfRklFTERfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ21yIEZpZWxkIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNtckZpZWxkVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENNUkZpZWxkSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQ01SX0ZJRUxEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbXJGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiBjbXJGaWVsZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q21yRmllbGROYW1lKFN0cmluZyBuZXdDbXJGaWVsZE5hbWUpIHsKLQkJU3RyaW5nIG9sZENtckZpZWxkTmFtZSA9IGNtckZpZWxkTmFtZTsKLQkJY21yRmllbGROYW1lID0gbmV3Q21yRmllbGROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ01SX0ZJRUxEX05BTUUsIG9sZENtckZpZWxkTmFtZSwgY21yRmllbGROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENNUkZpZWxkVHlwZSBnZXRDbXJGaWVsZFR5cGUoKSB7Ci0JCXJldHVybiBjbXJGaWVsZFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q21yRmllbGRUeXBlKENNUkZpZWxkVHlwZSBuZXdDbXJGaWVsZFR5cGUpIHsKLQkJQ01SRmllbGRUeXBlIG9sZENtckZpZWxkVHlwZSA9IGNtckZpZWxkVHlwZTsKLQkJY21yRmllbGRUeXBlID0gbmV3Q21yRmllbGRUeXBlID09IG51bGwgPyBDTVJfRklFTERfVFlQRV9FREVGQVVMVCA6IG5ld0NtckZpZWxkVHlwZTsKLQkJYm9vbGVhbiBvbGRDbXJGaWVsZFR5cGVFU2V0ID0gY21yRmllbGRUeXBlRVNldDsKLQkJY21yRmllbGRUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DTVJfRklFTERfVFlQRSwgb2xkQ21yRmllbGRUeXBlLCBjbXJGaWVsZFR5cGUsICFvbGRDbXJGaWVsZFR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDbXJGaWVsZFR5cGUoKSB7Ci0JCUNNUkZpZWxkVHlwZSBvbGRDbXJGaWVsZFR5cGUgPSBjbXJGaWVsZFR5cGU7Ci0JCWJvb2xlYW4gb2xkQ21yRmllbGRUeXBlRVNldCA9IGNtckZpZWxkVHlwZUVTZXQ7Ci0JCWNtckZpZWxkVHlwZSA9IENNUl9GSUVMRF9UWVBFX0VERUZBVUxUOwotCQljbXJGaWVsZFR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5DTVJfRklFTERfX0NNUl9GSUVMRF9UWVBFLCBvbGRDbXJGaWVsZFR5cGUsIENNUl9GSUVMRF9UWVBFX0VERUZBVUxULCBvbGRDbXJGaWVsZFR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDbXJGaWVsZFR5cGUoKSB7Ci0JCXJldHVybiBjbXJGaWVsZFR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0NNUl9GSUVMRF9OQU1FOgotCQkJCXJldHVybiBnZXRDbXJGaWVsZE5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0NNUl9GSUVMRF9UWVBFOgotCQkJCXJldHVybiBnZXRDbXJGaWVsZFR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0NNUl9GSUVMRF9OQU1FOgotCQkJCXNldENtckZpZWxkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DTVJfRklFTERfVFlQRToKLQkJCQlzZXRDbXJGaWVsZFR5cGUoKENNUkZpZWxkVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0NNUl9GSUVMRF9OQU1FOgotCQkJCXNldENtckZpZWxkTmFtZShDTVJfRklFTERfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ01SX0ZJRUxEX1RZUEU6Ci0JCQkJdW5zZXRDbXJGaWVsZFR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ01SX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIENNUl9GSUVMRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBjbXJGaWVsZE5hbWUgIT0gbnVsbCA6ICFDTVJfRklFTERfTkFNRV9FREVGQVVMVC5lcXVhbHMoY21yRmllbGROYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0NNUl9GSUVMRF9UWVBFOgotCQkJCXJldHVybiBpc1NldENtckZpZWxkVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjbXJGaWVsZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY21yRmllbGROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjbXJGaWVsZFR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjbXJGaWVsZFR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGNtckZpZWxkVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9DTVJGaWVsZEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGUwMTI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250YWluZXIgVHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUltcGwjZ2V0TWV0aG9kcyA8ZW0+TWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsI2dldFRyYW5zQXR0cmlidXRlIDxlbT5UcmFucyBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb250YWluZXJUcmFuc2FjdGlvblR5cGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZHMoKSA8ZW0+TWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNBdHRyaWJ1dGUoKSA8ZW0+VHJhbnMgQXR0cmlidXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc0F0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgVFJBTlNfQVRUUklCVVRFX0VERUZBVUxUID0gVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLk5PVF9TVVBQT1JURURfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zQXR0cmlidXRlKCkgPGVtPlRyYW5zIEF0dHJpYnV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgdHJhbnNBdHRyaWJ1dGUgPSBUUkFOU19BVFRSSUJVVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFRyYW5zIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNBdHRyaWJ1dGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kcygpIHsKLQkJaWYgKG1ldGhvZHMgPT0gbnVsbCkgewotCQkJbWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXRob2RUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19NRVRIT0RTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGdldFRyYW5zQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdHJhbnNBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNBdHRyaWJ1dGUoVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIG5ld1RyYW5zQXR0cmlidXRlKSB7Ci0JCVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBvbGRUcmFuc0F0dHJpYnV0ZSA9IHRyYW5zQXR0cmlidXRlOwotCQl0cmFuc0F0dHJpYnV0ZSA9IG5ld1RyYW5zQXR0cmlidXRlID09IG51bGwgPyBUUkFOU19BVFRSSUJVVEVfRURFRkFVTFQgOiBuZXdUcmFuc0F0dHJpYnV0ZTsKLQkJYm9vbGVhbiBvbGRUcmFuc0F0dHJpYnV0ZUVTZXQgPSB0cmFuc0F0dHJpYnV0ZUVTZXQ7Ci0JCXRyYW5zQXR0cmlidXRlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX1RSQU5TX0FUVFJJQlVURSwgb2xkVHJhbnNBdHRyaWJ1dGUsIHRyYW5zQXR0cmlidXRlLCAhb2xkVHJhbnNBdHRyaWJ1dGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRUcmFuc0F0dHJpYnV0ZSgpIHsKLQkJVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIG9sZFRyYW5zQXR0cmlidXRlID0gdHJhbnNBdHRyaWJ1dGU7Ci0JCWJvb2xlYW4gb2xkVHJhbnNBdHRyaWJ1dGVFU2V0ID0gdHJhbnNBdHRyaWJ1dGVFU2V0OwotCQl0cmFuc0F0dHJpYnV0ZSA9IFRSQU5TX0FUVFJJQlVURV9FREVGQVVMVDsKLQkJdHJhbnNBdHRyaWJ1dGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fVFJBTlNfQVRUUklCVVRFLCBvbGRUcmFuc0F0dHJpYnV0ZSwgVFJBTlNfQVRUUklCVVRFX0VERUZBVUxULCBvbGRUcmFuc0F0dHJpYnV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFRyYW5zQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdHJhbnNBdHRyaWJ1dGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX01FVEhPRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRNZXRob2RzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX1RSQU5TX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0VHJhbnNBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX01FVEhPRFM6Ci0JCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19UUkFOU19BVFRSSUJVVEU6Ci0JCQkJc2V0VHJhbnNBdHRyaWJ1dGUoKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX01FVEhPRFM6Ci0JCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19UUkFOU19BVFRSSUJVVEU6Ci0JCQkJdW5zZXRUcmFuc0F0dHJpYnV0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19NRVRIT0RTOgotCQkJCXJldHVybiBtZXRob2RzICE9IG51bGwgJiYgIW1ldGhvZHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19UUkFOU19BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGlzU2V0VHJhbnNBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0cmFuc0F0dHJpYnV0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRyYW5zQXR0cmlidXRlRVNldCkgcmVzdWx0LmFwcGVuZCh0cmFuc0F0dHJpYnV0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjg1YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RUpCIEphciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRFamJKYXIgPGVtPkVqYiBKYXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhlZCgpIDxlbT5NaXhlZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WE1MTlNQcmVmaXhNYXAoKSA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhNTE5TUHJlZml4TWFwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkgPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4U0lTY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCk7Ci0JCX0KLQkJcmV0dXJuIG1peGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKSB7Ci0JCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQKTsKLQkJfQotCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAubWFwKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbi5tYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUpCSmFyIGdldEVqYkphcigpIHsKLQkJcmV0dXJuIChFSkJKYXIpZ2V0TWl4ZWQoKS5nZXQoRWpiUGFja2FnZS5MaXRlcmFscy5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fRUpCX0pBUiwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RWpiSmFyKEVKQkphciBuZXdFamJKYXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChFamJQYWNrYWdlLkxpdGVyYWxzLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19FSkJfSkFSLCBuZXdFamJKYXIsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYkphcihFSkJKYXIgbmV3RWpiSmFyKSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoRWpiUGFja2FnZS5MaXRlcmFscy5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fRUpCX0pBUiwgbmV3RWpiSmFyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RWpiSmFyKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldE1peGVkKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKTsKLQkJCQllbHNlIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19FSkJfSkFSOgotCQkJCXJldHVybiBnZXRFamJKYXIoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZykoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZykoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0VKQl9KQVI6Ci0JCQkJc2V0RWpiSmFyKChFSkJKYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQlyZXR1cm4gbWl4ZWQgIT0gbnVsbCAmJiAhbWl4ZWQuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiB4TUxOU1ByZWZpeE1hcCAhPSBudWxsICYmICF4TUxOU1ByZWZpeE1hcC5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgIXhTSVNjaGVtYUxvY2F0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZ2V0RWpiSmFyKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1peGVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1peGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0NjRmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgSmFyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCNnZXRFbnRlcnByaXNlQmVhbnMgPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCNnZXRJbnRlcmNlcHRvcnMgPGVtPkludGVyY2VwdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsI2dldFJlbGF0aW9uc2hpcHMgPGVtPlJlbGF0aW9uc2hpcHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCNnZXRBc3NlbWJseURlc2NyaXB0b3IgPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCNnZXRFamJDbGllbnRKYXIgPGVtPkVqYiBDbGllbnQgSmFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJKYXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFSkJKYXIgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGVycHJpc2VCZWFucygpIDxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlQmVhbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFbnRlcnByaXNlQmVhbnMgZW50ZXJwcmlzZUJlYW5zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyY2VwdG9ycygpIDxlbT5JbnRlcmNlcHRvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyY2VwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVyY2VwdG9yc1R5cGUgaW50ZXJjZXB0b3JzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbGF0aW9uc2hpcHMoKSA8ZW0+UmVsYXRpb25zaGlwczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVsYXRpb25zaGlwcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NlbWJseURlc2NyaXB0b3IoKSA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiQ2xpZW50SmFyKCkgPGVtPkVqYiBDbGllbnQgSmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJDbGllbnRKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9DTElFTlRfSkFSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkNsaWVudEphcigpIDxlbT5FamIgQ2xpZW50IEphcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiQ2xpZW50SmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYkNsaWVudEphciA9IEVKQl9DTElFTlRfSkFSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXRhZGF0YUNvbXBsZXRlKCkgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXRhZGF0YUNvbXBsZXRlKCkgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGUgPSBNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWV0YWRhdGEgQ29tcGxldGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIjMuMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyc2lvbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFSkJKYXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FSkJfSkFSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKLQkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKLQkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW50ZXJwcmlzZUJlYW5zIGdldEVudGVycHJpc2VCZWFucygpIHsKLQkJcmV0dXJuIGVudGVycHJpc2VCZWFuczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbnRlcnByaXNlQmVhbnMoRW50ZXJwcmlzZUJlYW5zIG5ld0VudGVycHJpc2VCZWFucywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlFbnRlcnByaXNlQmVhbnMgb2xkRW50ZXJwcmlzZUJlYW5zID0gZW50ZXJwcmlzZUJlYW5zOwotCQllbnRlcnByaXNlQmVhbnMgPSBuZXdFbnRlcnByaXNlQmVhbnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUywgb2xkRW50ZXJwcmlzZUJlYW5zLCBuZXdFbnRlcnByaXNlQmVhbnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGVycHJpc2VCZWFucyhFbnRlcnByaXNlQmVhbnMgbmV3RW50ZXJwcmlzZUJlYW5zKSB7Ci0JCWlmIChuZXdFbnRlcnByaXNlQmVhbnMgIT0gZW50ZXJwcmlzZUJlYW5zKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlbnRlcnByaXNlQmVhbnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZW50ZXJwcmlzZUJlYW5zKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFbnRlcnByaXNlQmVhbnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RW50ZXJwcmlzZUJlYW5zKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVudGVycHJpc2VCZWFucyhuZXdFbnRlcnByaXNlQmVhbnMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TLCBuZXdFbnRlcnByaXNlQmVhbnMsIG5ld0VudGVycHJpc2VCZWFucykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlcmNlcHRvcnNUeXBlIGdldEludGVyY2VwdG9ycygpIHsKLQkJcmV0dXJuIGludGVyY2VwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnRlcmNlcHRvcnMoSW50ZXJjZXB0b3JzVHlwZSBuZXdJbnRlcmNlcHRvcnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJSW50ZXJjZXB0b3JzVHlwZSBvbGRJbnRlcmNlcHRvcnMgPSBpbnRlcmNlcHRvcnM7Ci0JCWludGVyY2VwdG9ycyA9IG5ld0ludGVyY2VwdG9yczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19JTlRFUkNFUFRPUlMsIG9sZEludGVyY2VwdG9ycywgbmV3SW50ZXJjZXB0b3JzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcmNlcHRvcnMoSW50ZXJjZXB0b3JzVHlwZSBuZXdJbnRlcmNlcHRvcnMpIHsKLQkJaWYgKG5ld0ludGVyY2VwdG9ycyAhPSBpbnRlcmNlcHRvcnMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGludGVyY2VwdG9ycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnRlcmNlcHRvcnMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9KQVJfX0lOVEVSQ0VQVE9SUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW50ZXJjZXB0b3JzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0ludGVyY2VwdG9ycykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRUpCX0pBUl9fSU5URVJDRVBUT1JTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEludGVyY2VwdG9ycyhuZXdJbnRlcmNlcHRvcnMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19JTlRFUkNFUFRPUlMsIG5ld0ludGVyY2VwdG9ycywgbmV3SW50ZXJjZXB0b3JzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlbGF0aW9uc2hpcHMgZ2V0UmVsYXRpb25zaGlwcygpIHsKLQkJcmV0dXJuIHJlbGF0aW9uc2hpcHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBzIG5ld1JlbGF0aW9uc2hpcHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUmVsYXRpb25zaGlwcyBvbGRSZWxhdGlvbnNoaXBzID0gcmVsYXRpb25zaGlwczsKLQkJcmVsYXRpb25zaGlwcyA9IG5ld1JlbGF0aW9uc2hpcHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQUywgb2xkUmVsYXRpb25zaGlwcywgbmV3UmVsYXRpb25zaGlwcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBzIG5ld1JlbGF0aW9uc2hpcHMpIHsKLQkJaWYgKG5ld1JlbGF0aW9uc2hpcHMgIT0gcmVsYXRpb25zaGlwcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVsYXRpb25zaGlwcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWxhdGlvbnNoaXBzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZWxhdGlvbnNoaXBzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlbGF0aW9uc2hpcHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVsYXRpb25zaGlwcyhuZXdSZWxhdGlvbnNoaXBzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQUywgbmV3UmVsYXRpb25zaGlwcywgbmV3UmVsYXRpb25zaGlwcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gYXNzZW1ibHlEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBvbGRBc3NlbWJseURlc2NyaXB0b3IgPSBhc3NlbWJseURlc2NyaXB0b3I7Ci0JCWFzc2VtYmx5RGVzY3JpcHRvciA9IG5ld0Fzc2VtYmx5RGVzY3JpcHRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SLCBvbGRBc3NlbWJseURlc2NyaXB0b3IsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IpIHsKLQkJaWYgKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBhc3NlbWJseURlc2NyaXB0b3IpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhc3NlbWJseURlc2NyaXB0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBc3NlbWJseURlc2NyaXB0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXNzZW1ibHlEZXNjcmlwdG9yKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgbmV3QXNzZW1ibHlEZXNjcmlwdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJDbGllbnRKYXIoKSB7Ci0JCXJldHVybiBlamJDbGllbnRKYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiQ2xpZW50SmFyKFN0cmluZyBuZXdFamJDbGllbnRKYXIpIHsKLQkJU3RyaW5nIG9sZEVqYkNsaWVudEphciA9IGVqYkNsaWVudEphcjsKLQkJZWpiQ2xpZW50SmFyID0gbmV3RWpiQ2xpZW50SmFyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX0VKQl9DTElFTlRfSkFSLCBvbGRFamJDbGllbnRKYXIsIGVqYkNsaWVudEphcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIG1ldGFkYXRhQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuIG5ld01ldGFkYXRhQ29tcGxldGUpIHsKLQkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQkJbWV0YWRhdGFDb21wbGV0ZSA9IG5ld01ldGFkYXRhQ29tcGxldGU7Ci0JCWJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBtZXRhZGF0YUNvbXBsZXRlRVNldDsKLQkJbWV0YWRhdGFDb21wbGV0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX01FVEFEQVRBX0NPTVBMRVRFLCBvbGRNZXRhZGF0YUNvbXBsZXRlLCBtZXRhZGF0YUNvbXBsZXRlLCAhb2xkTWV0YWRhdGFDb21wbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCWJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JCWJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBtZXRhZGF0YUNvbXBsZXRlRVNldDsKLQkJbWV0YWRhdGFDb21wbGV0ZSA9IE1FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUOwotCQltZXRhZGF0YUNvbXBsZXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fTUVUQURBVEFfQ09NUExFVEUsIG9sZE1ldGFkYXRhQ29tcGxldGUsIE1FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxULCBvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIG1ldGFkYXRhQ29tcGxldGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlib29sZWFuIG9sZFZlcnNpb25FU2V0ID0gdmVyc2lvbkVTZXQ7Ci0JCXZlcnNpb25FU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uLCAhb2xkVmVyc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZlcnNpb24oKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJYm9vbGVhbiBvbGRWZXJzaW9uRVNldCA9IHZlcnNpb25FU2V0OwotCQl2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQkJdmVyc2lvbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX1ZFUlNJT04sIG9sZFZlcnNpb24sIFZFUlNJT05fRURFRkFVTFQsIG9sZFZlcnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRFbnRlcnByaXNlQmVhbnMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fSU5URVJDRVBUT1JTOgotCQkJCXJldHVybiBiYXNpY1NldEludGVyY2VwdG9ycyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBTOgotCQkJCXJldHVybiBiYXNpY1NldFJlbGF0aW9uc2hpcHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBc3NlbWJseURlc2NyaXB0b3IobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lOVEVSQ0VQVE9SUzoKLQkJCQlyZXR1cm4gZ2V0SW50ZXJjZXB0b3JzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQUzoKLQkJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VKQl9DTElFTlRfSkFSOgotCQkJCXJldHVybiBnZXRFamJDbGllbnRKYXIoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlyZXR1cm4gaXNNZXRhZGF0YUNvbXBsZXRlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TOgotCQkJCXNldEVudGVycHJpc2VCZWFucygoRW50ZXJwcmlzZUJlYW5zKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fSU5URVJDRVBUT1JTOgotCQkJCXNldEludGVyY2VwdG9ycygoSW50ZXJjZXB0b3JzVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUFM6Ci0JCQkJc2V0UmVsYXRpb25zaGlwcygoUmVsYXRpb25zaGlwcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKLQkJCQlzZXRFamJDbGllbnRKYXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlzZXRNZXRhZGF0YUNvbXBsZXRlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJc2V0RW50ZXJwcmlzZUJlYW5zKChFbnRlcnByaXNlQmVhbnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lOVEVSQ0VQVE9SUzoKLQkJCQlzZXRJbnRlcmNlcHRvcnMoKEludGVyY2VwdG9yc1R5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUFM6Ci0JCQkJc2V0UmVsYXRpb25zaGlwcygoUmVsYXRpb25zaGlwcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlzZXRBc3NlbWJseURlc2NyaXB0b3IoKEFzc2VtYmx5RGVzY3JpcHRvciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVI6Ci0JCQkJc2V0RWpiQ2xpZW50SmFyKEVKQl9DTElFTlRfSkFSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19NRVRBREFUQV9DT01QTEVURToKLQkJCQl1bnNldE1ldGFkYXRhQ29tcGxldGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fVkVSU0lPTjoKLQkJCQl1bnNldFZlcnNpb24oKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUzoKLQkJCQlyZXR1cm4gZW50ZXJwcmlzZUJlYW5zICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fSU5URVJDRVBUT1JTOgotCQkJCXJldHVybiBpbnRlcmNlcHRvcnMgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBTOgotCQkJCXJldHVybiByZWxhdGlvbnNoaXBzICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gYXNzZW1ibHlEZXNjcmlwdG9yICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVI6Ci0JCQkJcmV0dXJuIEVKQl9DTElFTlRfSkFSX0VERUZBVUxUID09IG51bGwgPyBlamJDbGllbnRKYXIgIT0gbnVsbCA6ICFFSkJfQ0xJRU5UX0pBUl9FREVGQVVMVC5lcXVhbHMoZWpiQ2xpZW50SmFyKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlyZXR1cm4gaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gaXNTZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJDbGllbnRKYXI6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZWpiQ2xpZW50SmFyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0YWRhdGFDb21wbGV0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1ldGFkYXRhQ29tcGxldGVFU2V0KSByZXN1bHQuYXBwZW5kKG1ldGFkYXRhQ29tcGxldGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2ZXJzaW9uRVNldCkgcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRUpCSmFySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTkwYmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgUmVsYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25JbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uSW1wbCNnZXRFamJSZWxhdGlvbk5hbWUgPGVtPkVqYiBSZWxhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uSW1wbCNnZXRFamJSZWxhdGlvbnNoaXBSb2xlcyA8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRUpCUmVsYXRpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFSkJSZWxhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlbGF0aW9uTmFtZSgpIDxlbT5FamIgUmVsYXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVsYXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUkVMQVRJT05fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWxhdGlvbk5hbWUoKSA8ZW0+RWpiIFJlbGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlbGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJSZWxhdGlvbk5hbWUgPSBFSkJfUkVMQVRJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlbGF0aW9uc2hpcFJvbGVzKCkgPGVtPkVqYiBSZWxhdGlvbnNoaXAgUm9sZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVsYXRpb25zaGlwUm9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJSZWxhdGlvbnNoaXBSb2xlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFSkJSZWxhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVKQl9SRUxBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiUmVsYXRpb25OYW1lKCkgewotCQlyZXR1cm4gZWpiUmVsYXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYlJlbGF0aW9uTmFtZShTdHJpbmcgbmV3RWpiUmVsYXRpb25OYW1lKSB7Ci0JCVN0cmluZyBvbGRFamJSZWxhdGlvbk5hbWUgPSBlamJSZWxhdGlvbk5hbWU7Ci0JCWVqYlJlbGF0aW9uTmFtZSA9IG5ld0VqYlJlbGF0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTl9OQU1FLCBvbGRFamJSZWxhdGlvbk5hbWUsIGVqYlJlbGF0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYlJlbGF0aW9uc2hpcFJvbGVzKCkgewotCQlpZiAoZWpiUmVsYXRpb25zaGlwUm9sZXMgPT0gbnVsbCkgewotCQkJZWpiUmVsYXRpb25zaGlwUm9sZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTlNISVBfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBlamJSZWxhdGlvbnNoaXBSb2xlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05TSElQX1JPTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVsYXRpb25zaGlwUm9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIGdldEVqYlJlbGF0aW9uTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OU0hJUF9ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0RWpiUmVsYXRpb25zaGlwUm9sZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTl9OQU1FOgotCQkJCXNldEVqYlJlbGF0aW9uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05TSElQX1JPTEVTOgotCQkJCWdldEVqYlJlbGF0aW9uc2hpcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWxhdGlvbnNoaXBSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTl9OQU1FOgotCQkJCXNldEVqYlJlbGF0aW9uTmFtZShFSkJfUkVMQVRJT05fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OU0hJUF9ST0xFUzoKLQkJCQlnZXRFamJSZWxhdGlvbnNoaXBSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTl9OQU1FOgotCQkJCXJldHVybiBFSkJfUkVMQVRJT05fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZWpiUmVsYXRpb25OYW1lICE9IG51bGwgOiAhRUpCX1JFTEFUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKGVqYlJlbGF0aW9uTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05TSElQX1JPTEVTOgotCQkJCXJldHVybiBlamJSZWxhdGlvbnNoaXBSb2xlcyAhPSBudWxsICYmICFlamJSZWxhdGlvbnNoaXBSb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVqYlJlbGF0aW9uTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlamJSZWxhdGlvbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRUpCUmVsYXRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjkxYTM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25zaGlwUm9sZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTXVsdGlwbGljaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25zaGlwUm9sZUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25zaGlwUm9sZUltcGwjZ2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUgPGVtPkVqYiBSZWxhdGlvbnNoaXAgUm9sZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsI2dldE11bHRpcGxpY2l0eSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsI2dldENhc2NhZGVEZWxldGUgPGVtPkNhc2NhZGUgRGVsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UgPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCNnZXRDbXJGaWVsZCA8ZW0+Q21yIEZpZWxkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFSkJSZWxhdGlvbnNoaXBSb2xlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKSA8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpIDxlbT5FamIgUmVsYXRpb25zaGlwIFJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiUmVsYXRpb25zaGlwUm9sZU5hbWUgPSBFSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdWx0aXBsaWNpdHkoKSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTXVsdGlwbGljaXR5VHlwZSBNVUxUSVBMSUNJVFlfRURFRkFVTFQgPSBNdWx0aXBsaWNpdHlUeXBlLk9ORV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXVsdGlwbGljaXR5KCkgPGVtPk11bHRpcGxpY2l0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTXVsdGlwbGljaXR5VHlwZSBtdWx0aXBsaWNpdHkgPSBNVUxUSVBMSUNJVFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE11bHRpcGxpY2l0eSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVsdGlwbGljaXR5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZURlbGV0ZSgpIDxlbT5DYXNjYWRlIERlbGV0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZURlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVtcHR5VHlwZSBjYXNjYWRlRGVsZXRlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKSA8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgcmVsYXRpb25zaGlwUm9sZVNvdXJjZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbXJGaWVsZCgpIDxlbT5DbXIgRmllbGQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENtckZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ01SRmllbGQgY21yRmllbGQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUpCUmVsYXRpb25zaGlwUm9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVKQl9SRUxBVElPTlNISVBfUk9MRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKSB7Ci0JCXJldHVybiBlamJSZWxhdGlvbnNoaXBSb2xlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZShTdHJpbmcgbmV3RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUpIHsKLQkJU3RyaW5nIG9sZEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lID0gZWpiUmVsYXRpb25zaGlwUm9sZU5hbWU7Ci0JCWVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lID0gbmV3RWpiUmVsYXRpb25zaGlwUm9sZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19FSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRSwgb2xkRWpiUmVsYXRpb25zaGlwUm9sZU5hbWUsIGVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE11bHRpcGxpY2l0eVR5cGUgZ2V0TXVsdGlwbGljaXR5KCkgewotCQlyZXR1cm4gbXVsdGlwbGljaXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlUeXBlIG5ld011bHRpcGxpY2l0eSkgewotCQlNdWx0aXBsaWNpdHlUeXBlIG9sZE11bHRpcGxpY2l0eSA9IG11bHRpcGxpY2l0eTsKLQkJbXVsdGlwbGljaXR5ID0gbmV3TXVsdGlwbGljaXR5ID09IG51bGwgPyBNVUxUSVBMSUNJVFlfRURFRkFVTFQgOiBuZXdNdWx0aXBsaWNpdHk7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGljaXR5RVNldCA9IG11bHRpcGxpY2l0eUVTZXQ7Ci0JCW11bHRpcGxpY2l0eUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZLCBvbGRNdWx0aXBsaWNpdHksIG11bHRpcGxpY2l0eSwgIW9sZE11bHRpcGxpY2l0eUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE11bHRpcGxpY2l0eSgpIHsKLQkJTXVsdGlwbGljaXR5VHlwZSBvbGRNdWx0aXBsaWNpdHkgPSBtdWx0aXBsaWNpdHk7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGljaXR5RVNldCA9IG11bHRpcGxpY2l0eUVTZXQ7Ci0JCW11bHRpcGxpY2l0eSA9IE1VTFRJUExJQ0lUWV9FREVGQVVMVDsKLQkJbXVsdGlwbGljaXR5RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFksIG9sZE11bHRpcGxpY2l0eSwgTVVMVElQTElDSVRZX0VERUZBVUxULCBvbGRNdWx0aXBsaWNpdHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNdWx0aXBsaWNpdHkoKSB7Ci0JCXJldHVybiBtdWx0aXBsaWNpdHlFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbXB0eVR5cGUgZ2V0Q2FzY2FkZURlbGV0ZSgpIHsKLQkJcmV0dXJuIGNhc2NhZGVEZWxldGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FzY2FkZURlbGV0ZShFbXB0eVR5cGUgbmV3Q2FzY2FkZURlbGV0ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlFbXB0eVR5cGUgb2xkQ2FzY2FkZURlbGV0ZSA9IGNhc2NhZGVEZWxldGU7Ci0JCWNhc2NhZGVEZWxldGUgPSBuZXdDYXNjYWRlRGVsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEUsIG9sZENhc2NhZGVEZWxldGUsIG5ld0Nhc2NhZGVEZWxldGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVEZWxldGUoRW1wdHlUeXBlIG5ld0Nhc2NhZGVEZWxldGUpIHsKLQkJaWYgKG5ld0Nhc2NhZGVEZWxldGUgIT0gY2FzY2FkZURlbGV0ZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2FzY2FkZURlbGV0ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYXNjYWRlRGVsZXRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDYXNjYWRlRGVsZXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Nhc2NhZGVEZWxldGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FzY2FkZURlbGV0ZShuZXdDYXNjYWRlRGVsZXRlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURSwgbmV3Q2FzY2FkZURlbGV0ZSwgbmV3Q2FzY2FkZURlbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSBnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlKCkgewotCQlyZXR1cm4gcmVsYXRpb25zaGlwUm9sZVNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlKFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlIG5ld1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgb2xkUmVsYXRpb25zaGlwUm9sZVNvdXJjZSA9IHJlbGF0aW9uc2hpcFJvbGVTb3VyY2U7Ci0JCXJlbGF0aW9uc2hpcFJvbGVTb3VyY2UgPSBuZXdSZWxhdGlvbnNoaXBSb2xlU291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQX1JPTEVfU09VUkNFLCBvbGRSZWxhdGlvbnNoaXBSb2xlU291cmNlLCBuZXdSZWxhdGlvbnNoaXBSb2xlU291cmNlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlKFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlIG5ld1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UpIHsKLQkJaWYgKG5ld1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UgIT0gcmVsYXRpb25zaGlwUm9sZVNvdXJjZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVsYXRpb25zaGlwUm9sZVNvdXJjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWxhdGlvbnNoaXBSb2xlU291cmNlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVsYXRpb25zaGlwUm9sZVNvdXJjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZWxhdGlvbnNoaXBSb2xlU291cmNlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlKG5ld1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRSwgbmV3UmVsYXRpb25zaGlwUm9sZVNvdXJjZSwgbmV3UmVsYXRpb25zaGlwUm9sZVNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDTVJGaWVsZCBnZXRDbXJGaWVsZCgpIHsKLQkJcmV0dXJuIGNtckZpZWxkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENtckZpZWxkKENNUkZpZWxkIG5ld0NtckZpZWxkLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNNUkZpZWxkIG9sZENtckZpZWxkID0gY21yRmllbGQ7Ci0JCWNtckZpZWxkID0gbmV3Q21yRmllbGQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQsIG9sZENtckZpZWxkLCBuZXdDbXJGaWVsZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q21yRmllbGQoQ01SRmllbGQgbmV3Q21yRmllbGQpIHsKLQkJaWYgKG5ld0NtckZpZWxkICE9IGNtckZpZWxkKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjbXJGaWVsZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljbXJGaWVsZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NtckZpZWxkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NtckZpZWxkKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDbXJGaWVsZChuZXdDbXJGaWVsZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxELCBuZXdDbXJGaWVsZCwgbmV3Q21yRmllbGQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDYXNjYWRlRGVsZXRlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQX1JPTEVfU09VUkNFOgotCQkJCXJldHVybiBiYXNpY1NldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q21yRmllbGQobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19FSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWToKLQkJCQlyZXR1cm4gZ2V0TXVsdGlwbGljaXR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURToKLQkJCQlyZXR1cm4gZ2V0Q2FzY2FkZURlbGV0ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQX1JPTEVfU09VUkNFOgotCQkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQ6Ci0JCQkJcmV0dXJuIGdldENtckZpZWxkKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19FSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRToKLQkJCQlzZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFk6Ci0JCQkJc2V0TXVsdGlwbGljaXR5KChNdWx0aXBsaWNpdHlUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlRGVsZXRlKChFbXB0eVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRToKLQkJCQlzZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlKChSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEOgotCQkJCXNldENtckZpZWxkKChDTVJGaWVsZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0VKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FOgotCQkJCXNldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKEVKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFk6Ci0JCQkJdW5zZXRNdWx0aXBsaWNpdHkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlRGVsZXRlKChFbXB0eVR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQX1JPTEVfU09VUkNFOgotCQkJCXNldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRDoKLQkJCQlzZXRDbXJGaWVsZCgoQ01SRmllbGQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0VKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FOgotCQkJCXJldHVybiBFSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZWpiUmVsYXRpb25zaGlwUm9sZU5hbWUgIT0gbnVsbCA6ICFFSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRV9FREVGQVVMVC5lcXVhbHMoZWpiUmVsYXRpb25zaGlwUm9sZU5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZOgotCQkJCXJldHVybiBpc1NldE11bHRpcGxpY2l0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEU6Ci0JCQkJcmV0dXJuIGNhc2NhZGVEZWxldGUgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRToKLQkJCQlyZXR1cm4gcmVsYXRpb25zaGlwUm9sZVNvdXJjZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEOgotCQkJCXJldHVybiBjbXJGaWVsZCAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJSZWxhdGlvbnNoaXBSb2xlTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlamJSZWxhdGlvbnNoaXBSb2xlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbXVsdGlwbGljaXR5OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobXVsdGlwbGljaXR5RVNldCkgcmVzdWx0LmFwcGVuZChtdWx0aXBsaWNpdHkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRUpCUmVsYXRpb25zaGlwUm9sZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmI5N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVqYkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgRWpiRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWpiRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJRWpiRmFjdG9yeSB0aGVFamJGYWN0b3J5ID0gKEVqYkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamIiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWlmICh0aGVFamJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlRWpiRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBFamJGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYkZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUc6IHJldHVybiAoRU9iamVjdCljcmVhdGVBY3RpdmF0aW9uQ29uZmlnKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFk6IHJldHVybiAoRU9iamVjdCljcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFyb3VuZEludm9rZVR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0ZJRUxEOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ01QRmllbGQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTEQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVDTVJGaWVsZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVKQkphcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVFSkJSZWxhdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRW50ZXJwcmlzZUJlYW5zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU46IHJldHVybiAoRU9iamVjdCljcmVhdGVFbnRpdHlCZWFuKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRXhjbHVkZUxpc3QoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlSW5pdE1ldGhvZFR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfT1JERVJfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUludGVyY2VwdG9yT3JkZXJUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVJbnRlcmNlcHRvcnNUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUludGVyY2VwdG9yVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU46IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXNzYWdlRHJpdmVuQmVhbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QQVJBTVM6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RQYXJhbXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZFR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU5hbWVkTWV0aG9kVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUXVlcnkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVRdWVyeU1ldGhvZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVsYXRpb25zaGlwcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJlbW92ZU1ldGhvZFR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU2VjdXJpdHlJZGVudGl0eVR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU46IHJldHVybiAoRU9iamVjdCljcmVhdGVTZXNzaW9uQmVhbigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX1ZFUlNJT05fVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ21wVmVyc2lvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ01SRmllbGRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0lOVEVSRkFDRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVNZXRob2RJbnRlcmZhY2VUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTVVMVElQTElDSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU11bHRpcGxpY2l0eVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5QRVJTSVNURU5DRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVQZXJzaXN0ZW5jZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRVNVTFRfVFlQRV9NQVBQSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc3VsdFR5cGVNYXBwaW5nVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU2Vzc2lvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX1ZFUlNJT05fVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZUNtcFZlcnNpb25UeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVDTVJGaWVsZFR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfQ0xBU1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRWpiQ2xhc3NUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRWpiTmFtZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfSU5URVJGQUNFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVNZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kTmFtZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NVUxUSVBMSUNJVFlfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZU11bHRpcGxpY2l0eVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5QRVJTSVNURU5DRV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlUGVyc2lzdGVuY2VUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVTVUxUX1RZUEVfTUFQUElOR19UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlUmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlU2Vzc2lvblR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlRSQU5TQUNUSU9OX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVUcmFuc2FjdGlvblR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9WRVJTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDbXBWZXJzaW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDTVJGaWVsZFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9JTlRFUkZBQ0VfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE1ldGhvZEludGVyZmFjZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1VTFRJUExJQ0lUWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TXVsdGlwbGljaXR5VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUEVSU0lTVEVOQ0VfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFBlcnNpc3RlbmNlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVTVUxUX1RZUEVfTUFQUElOR19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0UmVzdWx0VHlwZU1hcHBpbmdUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRTZXNzaW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlRSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUcmFuc2FjdGlvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9WRVJTSU9OX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0Q21wVmVyc2lvblR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydENNUkZpZWxkVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0NMQVNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFamJDbGFzc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFamJOYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0lOVEVSRkFDRV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydE1ldGhvZEludGVyZmFjZVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNZXRob2ROYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTVVMVElQTElDSVRZX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0TXVsdGlwbGljaXR5VHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUEVSU0lTVEVOQ0VfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQZXJzaXN0ZW5jZVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRTZXNzaW9uVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFRyYW5zYWN0aW9uVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2YXRpb25Db25maWcgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZygpIHsKLQkJQWN0aXZhdGlvbkNvbmZpZ0ltcGwgYWN0aXZhdGlvbkNvbmZpZyA9IG5ldyBBY3RpdmF0aW9uQ29uZmlnSW1wbCgpOwotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpIHsKLQkJQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgPSBuZXcgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCgpOwotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkV4Y2VwdGlvbiBjcmVhdGVBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHsKLQkJQXBwbGljYXRpb25FeGNlcHRpb25JbXBsIGFwcGxpY2F0aW9uRXhjZXB0aW9uID0gbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYXRpb25FeGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFyb3VuZEludm9rZVR5cGUgY3JlYXRlQXJvdW5kSW52b2tlVHlwZSgpIHsKLQkJQXJvdW5kSW52b2tlVHlwZUltcGwgYXJvdW5kSW52b2tlVHlwZSA9IG5ldyBBcm91bmRJbnZva2VUeXBlSW1wbCgpOwotCQlyZXR1cm4gYXJvdW5kSW52b2tlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXNzZW1ibHlEZXNjcmlwdG9yIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQkJQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCBhc3NlbWJseURlc2NyaXB0b3IgPSBuZXcgQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gYXNzZW1ibHlEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDTVBGaWVsZCBjcmVhdGVDTVBGaWVsZCgpIHsKLQkJQ01QRmllbGRJbXBsIGNtcEZpZWxkID0gbmV3IENNUEZpZWxkSW1wbCgpOwotCQlyZXR1cm4gY21wRmllbGQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENNUkZpZWxkIGNyZWF0ZUNNUkZpZWxkKCkgewotCQlDTVJGaWVsZEltcGwgY21yRmllbGQgPSBuZXcgQ01SRmllbGRJbXBsKCk7Ci0JCXJldHVybiBjbXJGaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlIGNyZWF0ZUNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlSW1wbCBjb250YWluZXJUcmFuc2FjdGlvblR5cGUgPSBuZXcgQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlSW1wbCgpOwotCQlyZXR1cm4gY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFSkJKYXIgY3JlYXRlRUpCSmFyKCkgewotCQlFSkJKYXJJbXBsIGVqYkphciA9IG5ldyBFSkJKYXJJbXBsKCk7Ci0JCXJldHVybiBlamJKYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yIGNyZWF0ZUVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3IgPSBuZXcgRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiBlamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUpCUmVsYXRpb24gY3JlYXRlRUpCUmVsYXRpb24oKSB7Ci0JCUVKQlJlbGF0aW9uSW1wbCBlamJSZWxhdGlvbiA9IG5ldyBFSkJSZWxhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGVqYlJlbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKSB7Ci0JCUVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsIGVqYlJlbGF0aW9uc2hpcFJvbGUgPSBuZXcgRUpCUmVsYXRpb25zaGlwUm9sZUltcGwoKTsKLQkJcmV0dXJuIGVqYlJlbGF0aW9uc2hpcFJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudGVycHJpc2VCZWFucyBjcmVhdGVFbnRlcnByaXNlQmVhbnMoKSB7Ci0JCUVudGVycHJpc2VCZWFuc0ltcGwgZW50ZXJwcmlzZUJlYW5zID0gbmV3IEVudGVycHJpc2VCZWFuc0ltcGwoKTsKLQkJcmV0dXJuIGVudGVycHJpc2VCZWFuczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW50aXR5QmVhbiBjcmVhdGVFbnRpdHlCZWFuKCkgewotCQlFbnRpdHlCZWFuSW1wbCBlbnRpdHlCZWFuID0gbmV3IEVudGl0eUJlYW5JbXBsKCk7Ci0JCXJldHVybiBlbnRpdHlCZWFuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeGNsdWRlTGlzdCBjcmVhdGVFeGNsdWRlTGlzdCgpIHsKLQkJRXhjbHVkZUxpc3RJbXBsIGV4Y2x1ZGVMaXN0ID0gbmV3IEV4Y2x1ZGVMaXN0SW1wbCgpOwotCQlyZXR1cm4gZXhjbHVkZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRNZXRob2RUeXBlIGNyZWF0ZUluaXRNZXRob2RUeXBlKCkgewotCQlJbml0TWV0aG9kVHlwZUltcGwgaW5pdE1ldGhvZFR5cGUgPSBuZXcgSW5pdE1ldGhvZFR5cGVJbXBsKCk7Ci0JCXJldHVybiBpbml0TWV0aG9kVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSBjcmVhdGVJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCkgewotCQlJbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCBpbnRlcmNlcHRvckJpbmRpbmdUeXBlID0gbmV3IEludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsKCk7Ci0JCXJldHVybiBpbnRlcmNlcHRvckJpbmRpbmdUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlcmNlcHRvck9yZGVyVHlwZSBjcmVhdGVJbnRlcmNlcHRvck9yZGVyVHlwZSgpIHsKLQkJSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsIGludGVyY2VwdG9yT3JkZXJUeXBlID0gbmV3IEludGVyY2VwdG9yT3JkZXJUeXBlSW1wbCgpOwotCQlyZXR1cm4gaW50ZXJjZXB0b3JPcmRlclR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVyY2VwdG9yc1R5cGUgY3JlYXRlSW50ZXJjZXB0b3JzVHlwZSgpIHsKLQkJSW50ZXJjZXB0b3JzVHlwZUltcGwgaW50ZXJjZXB0b3JzVHlwZSA9IG5ldyBJbnRlcmNlcHRvcnNUeXBlSW1wbCgpOwotCQlyZXR1cm4gaW50ZXJjZXB0b3JzVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZXJjZXB0b3JUeXBlIGNyZWF0ZUludGVyY2VwdG9yVHlwZSgpIHsKLQkJSW50ZXJjZXB0b3JUeXBlSW1wbCBpbnRlcmNlcHRvclR5cGUgPSBuZXcgSW50ZXJjZXB0b3JUeXBlSW1wbCgpOwotCQlyZXR1cm4gaW50ZXJjZXB0b3JUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRHJpdmVuQmVhbiBjcmVhdGVNZXNzYWdlRHJpdmVuQmVhbigpIHsKLQkJTWVzc2FnZURyaXZlbkJlYW5JbXBsIG1lc3NhZ2VEcml2ZW5CZWFuID0gbmV3IE1lc3NhZ2VEcml2ZW5CZWFuSW1wbCgpOwotCQlyZXR1cm4gbWVzc2FnZURyaXZlbkJlYW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFBhcmFtcyBjcmVhdGVNZXRob2RQYXJhbXMoKSB7Ci0JCU1ldGhvZFBhcmFtc0ltcGwgbWV0aG9kUGFyYW1zID0gbmV3IE1ldGhvZFBhcmFtc0ltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGVybWlzc2lvbiBjcmVhdGVNZXRob2RQZXJtaXNzaW9uKCkgewotCQlNZXRob2RQZXJtaXNzaW9uSW1wbCBtZXRob2RQZXJtaXNzaW9uID0gbmV3IE1ldGhvZFBlcm1pc3Npb25JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQZXJtaXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RUeXBlIGNyZWF0ZU1ldGhvZFR5cGUoKSB7Ci0JCU1ldGhvZFR5cGVJbXBsIG1ldGhvZFR5cGUgPSBuZXcgTWV0aG9kVHlwZUltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWVkTWV0aG9kVHlwZSBjcmVhdGVOYW1lZE1ldGhvZFR5cGUoKSB7Ci0JCU5hbWVkTWV0aG9kVHlwZUltcGwgbmFtZWRNZXRob2RUeXBlID0gbmV3IE5hbWVkTWV0aG9kVHlwZUltcGwoKTsKLQkJcmV0dXJuIG5hbWVkTWV0aG9kVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUXVlcnkgY3JlYXRlUXVlcnkoKSB7Ci0JCVF1ZXJ5SW1wbCBxdWVyeSA9IG5ldyBRdWVyeUltcGwoKTsKLQkJcmV0dXJuIHF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBRdWVyeU1ldGhvZCBjcmVhdGVRdWVyeU1ldGhvZCgpIHsKLQkJUXVlcnlNZXRob2RJbXBsIHF1ZXJ5TWV0aG9kID0gbmV3IFF1ZXJ5TWV0aG9kSW1wbCgpOwotCQlyZXR1cm4gcXVlcnlNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlIGNyZWF0ZVJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKCkgewotCQlSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUltcGwgcmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgPSBuZXcgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVJbXBsKCk7Ci0JCXJldHVybiByZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVsYXRpb25zaGlwcyBjcmVhdGVSZWxhdGlvbnNoaXBzKCkgewotCQlSZWxhdGlvbnNoaXBzSW1wbCByZWxhdGlvbnNoaXBzID0gbmV3IFJlbGF0aW9uc2hpcHNJbXBsKCk7Ci0JCXJldHVybiByZWxhdGlvbnNoaXBzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZW1vdmVNZXRob2RUeXBlIGNyZWF0ZVJlbW92ZU1ldGhvZFR5cGUoKSB7Ci0JCVJlbW92ZU1ldGhvZFR5cGVJbXBsIHJlbW92ZU1ldGhvZFR5cGUgPSBuZXcgUmVtb3ZlTWV0aG9kVHlwZUltcGwoKTsKLQkJcmV0dXJuIHJlbW92ZU1ldGhvZFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHlUeXBlIGNyZWF0ZVNlY3VyaXR5SWRlbnRpdHlUeXBlKCkgewotCQlTZWN1cml0eUlkZW50aXR5VHlwZUltcGwgc2VjdXJpdHlJZGVudGl0eVR5cGUgPSBuZXcgU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsKCk7Ci0JCXJldHVybiBzZWN1cml0eUlkZW50aXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvbkJlYW4gY3JlYXRlU2Vzc2lvbkJlYW4oKSB7Ci0JCVNlc3Npb25CZWFuSW1wbCBzZXNzaW9uQmVhbiA9IG5ldyBTZXNzaW9uQmVhbkltcGwoKTsKLQkJcmV0dXJuIHNlc3Npb25CZWFuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDbXBWZXJzaW9uVHlwZSBjcmVhdGVDbXBWZXJzaW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlDbXBWZXJzaW9uVHlwZSByZXN1bHQgPSBDbXBWZXJzaW9uVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q21wVmVyc2lvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ01SRmllbGRUeXBlIGNyZWF0ZUNNUkZpZWxkVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlDTVJGaWVsZFR5cGUgcmVzdWx0ID0gQ01SRmllbGRUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDTVJGaWVsZFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kSW50ZXJmYWNlVHlwZSBjcmVhdGVNZXRob2RJbnRlcmZhY2VUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCU1ldGhvZEludGVyZmFjZVR5cGUgcmVzdWx0ID0gTWV0aG9kSW50ZXJmYWNlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TWV0aG9kSW50ZXJmYWNlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNdWx0aXBsaWNpdHlUeXBlIGNyZWF0ZU11bHRpcGxpY2l0eVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJTXVsdGlwbGljaXR5VHlwZSByZXN1bHQgPSBNdWx0aXBsaWNpdHlUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNdWx0aXBsaWNpdHlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVHlwZSBjcmVhdGVQZXJzaXN0ZW5jZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJUGVyc2lzdGVuY2VUeXBlIHJlc3VsdCA9IFBlcnNpc3RlbmNlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UGVyc2lzdGVuY2VUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc3VsdFR5cGVNYXBwaW5nVHlwZSBjcmVhdGVSZXN1bHRUeXBlTWFwcGluZ1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJUmVzdWx0VHlwZU1hcHBpbmdUeXBlIHJlc3VsdCA9IFJlc3VsdFR5cGVNYXBwaW5nVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UmVzdWx0VHlwZU1hcHBpbmdUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlc3Npb25UeXBlIGNyZWF0ZVNlc3Npb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVNlc3Npb25UeXBlIHJlc3VsdCA9IFNlc3Npb25UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTZXNzaW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgY3JlYXRlVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSByZXN1bHQgPSBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvblR5cGUgY3JlYXRlVHJhbnNhY3Rpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVRyYW5zYWN0aW9uVHlwZSByZXN1bHQgPSBUcmFuc2FjdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRyYW5zYWN0aW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDbXBWZXJzaW9uVHlwZSBjcmVhdGVDbXBWZXJzaW9uVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKENtcFZlcnNpb25UeXBlKWNyZWF0ZUNtcFZlcnNpb25UeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLkNNUF9WRVJTSU9OX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q21wVmVyc2lvblR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydENtcFZlcnNpb25UeXBlVG9TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5DTVBfVkVSU0lPTl9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ01SRmllbGRUeXBlIGNyZWF0ZUNNUkZpZWxkVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKENNUkZpZWxkVHlwZSljcmVhdGVDTVJGaWVsZFR5cGVGcm9tU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuQ01SX0ZJRUxEX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q01SRmllbGRUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRDTVJGaWVsZFR5cGVUb1N0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLkNNUl9GSUVMRF9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUVqYkNsYXNzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRlVMTFlfUVVBTElGSUVEX0NMQVNTX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RWpiQ2xhc3NUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUVqYk5hbWVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLk5NVE9LRU4sIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RWpiTmFtZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5OTVRPS0VOLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kSW50ZXJmYWNlVHlwZSBjcmVhdGVNZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoTWV0aG9kSW50ZXJmYWNlVHlwZSljcmVhdGVNZXRob2RJbnRlcmZhY2VUeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9JTlRFUkZBQ0VfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRNZXRob2RJbnRlcmZhY2VUeXBlVG9TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfSU5URVJGQUNFX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTWV0aG9kTmFtZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TWV0aG9kTmFtZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE11bHRpcGxpY2l0eVR5cGUgY3JlYXRlTXVsdGlwbGljaXR5VHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKE11bHRpcGxpY2l0eVR5cGUpY3JlYXRlTXVsdGlwbGljaXR5VHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5NVUxUSVBMSUNJVFlfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNdWx0aXBsaWNpdHlUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRNdWx0aXBsaWNpdHlUeXBlVG9TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5NVUxUSVBMSUNJVFlfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVHlwZSBjcmVhdGVQZXJzaXN0ZW5jZVR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChQZXJzaXN0ZW5jZVR5cGUpY3JlYXRlUGVyc2lzdGVuY2VUeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLlBFUlNJU1RFTkNFX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UGVyc2lzdGVuY2VUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRQZXJzaXN0ZW5jZVR5cGVUb1N0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLlBFUlNJU1RFTkNFX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXN1bHRUeXBlTWFwcGluZ1R5cGUgY3JlYXRlUmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoUmVzdWx0VHlwZU1hcHBpbmdUeXBlKWNyZWF0ZVJlc3VsdFR5cGVNYXBwaW5nVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5SRVNVTFRfVFlQRV9NQVBQSU5HX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRSZXN1bHRUeXBlTWFwcGluZ1R5cGVUb1N0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLlJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlc3Npb25UeXBlIGNyZWF0ZVNlc3Npb25UeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU2Vzc2lvblR5cGUpY3JlYXRlU2Vzc2lvblR5cGVGcm9tU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuU0VTU0lPTl9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlc3Npb25UeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRTZXNzaW9uVHlwZVRvU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuU0VTU0lPTl9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGNyZWF0ZVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSljcmVhdGVUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVGcm9tU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVUb1N0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLlRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlIGNyZWF0ZVRyYW5zYWN0aW9uVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFRyYW5zYWN0aW9uVHlwZSljcmVhdGVUcmFuc2FjdGlvblR5cGVGcm9tU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNBQ1RJT05fVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFuc2FjdGlvblR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFRyYW5zYWN0aW9uVHlwZVRvU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNBQ1RJT05fVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYlBhY2thZ2UgZ2V0RWpiUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFamJQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYlBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL0VqYkZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYlBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDZhMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwubmFtZXNwYWNlLlhNTE5hbWVzcGFjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGFyYW1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NdWx0aXBsaWNpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5QZXJzaXN0ZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEVqYlBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2YXRpb25Db25maWdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2F0aW9uRXhjZXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFyb3VuZEludm9rZVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNtcEZpZWxkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNtckZpZWxkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlamJKYXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiUmVsYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbnRlcnByaXNlQmVhbnNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZW50aXR5QmVhbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleGNsdWRlTGlzdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbml0TWV0aG9kVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGludGVyY2VwdG9yT3JkZXJUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGludGVyY2VwdG9yc1R5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW50ZXJjZXB0b3JUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFBhcmFtc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RQZXJtaXNzaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbmFtZWRNZXRob2RUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHF1ZXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHF1ZXJ5TWV0aG9kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlbGF0aW9uc2hpcHNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVtb3ZlTWV0aG9kVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN1cml0eUlkZW50aXR5VHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZXNzaW9uQmVhbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGNtcFZlcnNpb25UeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBjbXJGaWVsZFR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIG1ldGhvZEludGVyZmFjZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIG11bHRpcGxpY2l0eVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHBlcnNpc3RlbmNlVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcmVzdWx0VHlwZU1hcHBpbmdUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBzZXNzaW9uVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB0cmFuc2FjdGlvblR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjbXBWZXJzaW9uVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjbXJGaWVsZFR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZWpiQ2xhc3NUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGVqYk5hbWVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1ldGhvZEludGVyZmFjZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbWV0aG9kTmFtZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbXVsdGlwbGljaXR5VHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwZXJzaXN0ZW5jZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHNlc3Npb25UeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0cmFuc2FjdGlvblR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWpiUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIEVqYkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWpiUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoRWpiUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEVqYlBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJWE1MTmFtZXNwYWNlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlXZWJQYWNrYWdlSW1wbCB0aGVXZWJQYWNrYWdlID0gKFdlYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJQYWNrYWdlLmVOU19VUkkpIDogV2ViUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUphdmFlZVBhY2thZ2VJbXBsIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKYXZhZWVQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSkgOiBKYXZhZWVQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlID0gKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUphdmFlZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YWVlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlRWpiUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlRWpiUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2YXRpb25Db25maWcoKSB7Ci0JCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2YXRpb25Db25maWdfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2YXRpb25Db25maWdfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZhdGlvbkNvbmZpZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2YXRpb25Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXBwbGljYXRpb25FeGNlcHRpb24oKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbkV4Y2VwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9FeGNlcHRpb25DbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uRXhjZXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fUm9sbGJhY2soKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkV4Y2VwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25FeGNlcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFyb3VuZEludm9rZVR5cGUoKSB7Ci0JCXJldHVybiBhcm91bmRJbnZva2VUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFyb3VuZEludm9rZVR5cGVfQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcm91bmRJbnZva2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJvdW5kSW52b2tlVHlwZV9NZXRob2ROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJvdW5kSW52b2tlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0NvbnRhaW5lclRyYW5zYWN0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9JbnRlcmNlcHRvckJpbmRpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfRXhjbHVkZUxpc3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfQXBwbGljYXRpb25FeGNlcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDTVBGaWVsZCgpIHsKLQkJcmV0dXJuIGNtcEZpZWxkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENNUEZpZWxkX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNtcEZpZWxkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q01QRmllbGRfRmllbGROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY21wRmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDTVBGaWVsZF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNtcEZpZWxkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDTVJGaWVsZCgpIHsKLQkJcmV0dXJuIGNtckZpZWxkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENNUkZpZWxkX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNtckZpZWxkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q01SRmllbGRfQ21yRmllbGROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY21yRmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDTVJGaWVsZF9DbXJGaWVsZFR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljbXJGaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENNUkZpZWxkX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY21yRmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX01ldGhvZHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfVHJhbnNBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVKQkphcigpIHsKLQkJcmV0dXJuIGVqYkphckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyX0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYkphckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9JY29ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYkphckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfSW50ZXJjZXB0b3JzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkphckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkphcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkphckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkphcl9NZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCSmFyX1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX0VqYkphcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFSkJSZWxhdGlvbigpIHsKLQkJcmV0dXJuIGVqYlJlbGF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25fRWpiUmVsYXRpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVsYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbl9FamJSZWxhdGlvbnNoaXBSb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25fSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWxhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpIHsKLQkJcmV0dXJuIGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9FamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX011bHRpcGxpY2l0eSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Nhc2NhZGVEZWxldGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9SZWxhdGlvbnNoaXBSb2xlU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVudGVycHJpc2VCZWFucygpIHsKLQkJcmV0dXJuIGVudGVycHJpc2VCZWFuc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRlcnByaXNlQmVhbnNfR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRlcnByaXNlQmVhbnNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbnNfU2Vzc2lvbkJlYW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50ZXJwcmlzZUJlYW5zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5zX0VudGl0eUJlYW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50ZXJwcmlzZUJlYW5zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5zX01lc3NhZ2VEcml2ZW5CZWFucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGVycHJpc2VCZWFuc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGVycHJpc2VCZWFuc19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGVycHJpc2VCZWFuc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RW50aXR5QmVhbigpIHsKLQkJcmV0dXJuIGVudGl0eUJlYW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9JY29ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0VqYk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9NYXBwZWROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fSG9tZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX1JlbW90ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0xvY2FsSG9tZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0xvY2FsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fRWpiQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fUHJpbUtleUNsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX1JlZW50cmFudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9DbXBWZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0Fic3RyYWN0U2NoZW1hTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9DbXBGaWVsZHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fUHJpbWtleUZpZWxkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0VudkVudHJpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fRWpiUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9FamJMb2NhbFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fUmVzb3VyY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1Jlc291cmNlRW52UmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9Qb3N0Q29uc3RydWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9QcmVEZXN0cm95cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9TZWN1cml0eVJvbGVSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1NlY3VyaXR5SWRlbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fUXVlcmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeGNsdWRlTGlzdCgpIHsKLQkJcmV0dXJuIGV4Y2x1ZGVMaXN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV4Y2x1ZGVMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXhjbHVkZUxpc3RfTWV0aG9kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV4Y2x1ZGVMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXhjbHVkZUxpc3RfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlleGNsdWRlTGlzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW5pdE1ldGhvZFR5cGUoKSB7Ci0JCXJldHVybiBpbml0TWV0aG9kVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbml0TWV0aG9kVHlwZV9DcmVhdGVNZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbml0TWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEluaXRNZXRob2RUeXBlX0JlYW5NZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbml0TWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEluaXRNZXRob2RUeXBlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5pdE1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKSB7Ci0JCXJldHVybiBpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRWpiTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0ludGVyY2VwdG9yQ2xhc3NlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0ludGVyY2VwdG9yT3JkZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX01ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGUoKSB7Ci0JCXJldHVybiBpbnRlcmNlcHRvck9yZGVyVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvck9yZGVyVHlwZV9JbnRlcmNlcHRvckNsYXNzZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbnRlcmNlcHRvck9yZGVyVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEludGVyY2VwdG9yT3JkZXJUeXBlX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW50ZXJjZXB0b3JPcmRlclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEludGVyY2VwdG9yc1R5cGUoKSB7Ci0JCXJldHVybiBpbnRlcmNlcHRvcnNUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yc1R5cGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JzVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yc1R5cGVfSW50ZXJjZXB0b3JzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JzVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEludGVyY2VwdG9yc1R5cGVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbnRlcmNlcHRvcnNUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbnRlcmNlcHRvclR5cGUoKSB7Ci0JCXJldHVybiBpbnRlcmNlcHRvclR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEludGVyY2VwdG9yVHlwZV9JbnRlcmNlcHRvckNsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX0Fyb3VuZEludm9rZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfRW52RW50cmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9FamJSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYkxvY2FsUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9TZXJ2aWNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9SZXNvdXJjZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VFbnZSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VVbml0UmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUG9zdENvbnN0cnVjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1ByZURlc3Ryb3lzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9Qb3N0QWN0aXZhdGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9QcmVQYXNzaXZhdGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEludGVyY2VwdG9yVHlwZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1lc3NhZ2VEcml2ZW5CZWFuKCkgewotCQlyZXR1cm4gbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9NYXBwZWROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnaW5nVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fVGltZW91dE1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25MaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fQWN0aXZhdGlvbkNvbmZpZygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Fyb3VuZEludm9rZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9FbnZFbnRyaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYkxvY2FsUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlcnZpY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fUmVzb3VyY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fUmVzb3VyY2VFbnZSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fUG9zdENvbnN0cnVjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9QcmVEZXN0cm95cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlY3VyaXR5SWRlbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kUGFyYW1zKCkgewotCQlyZXR1cm4gbWV0aG9kUGFyYW1zRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtc19NZXRob2RQYXJhbXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQYXJhbXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYXJhbXNfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQYXJhbXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBlcm1pc3Npb24oKSB7Ci0JCXJldHVybiBtZXRob2RQZXJtaXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kUGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBlcm1pc3Npb25fUm9sZU5hbWVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBlcm1pc3Npb25fVW5jaGVja2VkKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kUGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFBlcm1pc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQZXJtaXNzaW9uX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIG1ldGhvZFR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kVHlwZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVHlwZV9FamJOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFR5cGVfTWV0aG9kSW50ZigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RUeXBlX01ldGhvZE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVHlwZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVkTWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIG5hbWVkTWV0aG9kVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lZE1ldGhvZFR5cGVfTWV0aG9kTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5hbWVkTWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE5hbWVkTWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSluYW1lZE1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lZE1ldGhvZFR5cGVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSluYW1lZE1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFF1ZXJ5KCkgewotCQlyZXR1cm4gcXVlcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UXVlcnlfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlxdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFF1ZXJ5X1F1ZXJ5TWV0aG9kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRRdWVyeV9SZXN1bHRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UXVlcnlfRWpiUWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlxdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFF1ZXJ5X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFF1ZXJ5TWV0aG9kKCkgewotCQlyZXR1cm4gcXVlcnlNZXRob2RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UXVlcnlNZXRob2RfTWV0aG9kTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXF1ZXJ5TWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UXVlcnlNZXRob2RfTWV0aG9kUGFyYW1zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcXVlcnlNZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRRdWVyeU1ldGhvZF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXF1ZXJ5TWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIHJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRWpiTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVsYXRpb25zaGlwcygpIHsKLQkJcmV0dXJuIHJlbGF0aW9uc2hpcHNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZWxhdGlvbnNoaXBzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwc19FamJSZWxhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZWxhdGlvbnNoaXBzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVsYXRpb25zaGlwc19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlbGF0aW9uc2hpcHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlbW92ZU1ldGhvZFR5cGUoKSB7Ci0JCXJldHVybiByZW1vdmVNZXRob2RUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlbW92ZU1ldGhvZFR5cGVfQmVhbk1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlbW92ZU1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZW1vdmVNZXRob2RUeXBlX1JldGFpbklmRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVtb3ZlTWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlbW92ZU1ldGhvZFR5cGVfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZW1vdmVNZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpIHsKLQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdHlUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5SWRlbnRpdHlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfVXNlQ2FsbGVySWRlbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eUlkZW50aXR5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX1J1bkFzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5SWRlbnRpdHlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXNzaW9uQmVhbigpIHsKLQkJcmV0dXJuIHNlc3Npb25CZWFuRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRGlzcGxheU5hbWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9JY29ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fRWpiTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fTWFwcGVkTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fSG9tZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fUmVtb3RlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9Mb2NhbEhvbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX0xvY2FsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9CdXNpbmVzc0xvY2FscygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fQnVzaW5lc3NSZW1vdGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fU2VydmljZUVuZHBvaW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fRWpiQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9TZXNzaW9uVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1RpbWVvdXRNZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Jbml0TWV0aG9kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1JlbW92ZU1ldGhvZHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9UcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Bcm91bmRJbnZva2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRW52RW50cmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0VqYlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9FamJMb2NhbFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9TZXJ2aWNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1Jlc291cmNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1Jlc291cmNlRW52UmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1Bvc3RDb25zdHJ1Y3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUHJlRGVzdHJveXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Qb3N0QWN0aXZhdGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUHJlUGFzc2l2YXRlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9TZWN1cml0eUlkZW50aXRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRDbXBWZXJzaW9uVHlwZSgpIHsKLQkJcmV0dXJuIGNtcFZlcnNpb25UeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldENNUkZpZWxkVHlwZSgpIHsKLQkJcmV0dXJuIGNtckZpZWxkVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRNZXRob2RJbnRlcmZhY2VUeXBlKCkgewotCQlyZXR1cm4gbWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRNdWx0aXBsaWNpdHlUeXBlKCkgewotCQlyZXR1cm4gbXVsdGlwbGljaXR5VHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRQZXJzaXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0UmVzdWx0VHlwZU1hcHBpbmdUeXBlKCkgewotCQlyZXR1cm4gcmVzdWx0VHlwZU1hcHBpbmdUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFNlc3Npb25UeXBlKCkgewotCQlyZXR1cm4gc2Vzc2lvblR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q21wVmVyc2lvblR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiBjbXBWZXJzaW9uVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENNUkZpZWxkVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIGNtckZpZWxkVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVqYkNsYXNzVHlwZSgpIHsKLQkJcmV0dXJuIGVqYkNsYXNzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVqYk5hbWVUeXBlKCkgewotCQlyZXR1cm4gZWpiTmFtZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRNZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gbWV0aG9kSW50ZXJmYWNlVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE1ldGhvZE5hbWVUeXBlKCkgewotCQlyZXR1cm4gbWV0aG9kTmFtZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRNdWx0aXBsaWNpdHlUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gbXVsdGlwbGljaXR5VHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFBlcnNpc3RlbmNlVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFJlc3VsdFR5cGVNYXBwaW5nVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHJlc3VsdFR5cGVNYXBwaW5nVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFNlc3Npb25UeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gc2Vzc2lvblR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUcmFuc2FjdGlvblR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChFamJGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWFjdGl2YXRpb25Db25maWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZBVElPTl9DT05GSUcpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIEFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIEFDVElWQVRJT05fQ09ORklHX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLCBBQ1RJVkFUSU9OX0NPTkZJR19fSUQpOwotCi0JCWFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcywgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0lEKTsKLQotCQlhcHBsaWNhdGlvbkV4Y2VwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUFBMSUNBVElPTl9FWENFUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uRXhjZXB0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9FWENFUFRJT05fX0VYQ0VQVElPTl9DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25FeGNlcHRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fUk9MTEJBQ0spOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uRXhjZXB0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9FWENFUFRJT05fX0lEKTsKLQotCQlhcm91bmRJbnZva2VUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFST1VORF9JTlZPS0VfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJvdW5kSW52b2tlVHlwZUVDbGFzcywgQVJPVU5EX0lOVk9LRV9UWVBFX19DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJvdW5kSW52b2tlVHlwZUVDbGFzcywgQVJPVU5EX0lOVk9LRV9UWVBFX19NRVRIT0RfTkFNRSk7Ci0KLQkJYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFTU0VNQkxZX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIEFTU0VNQkxZX0RFU0NSSVBUT1JfX0NPTlRBSU5FUl9UUkFOU0FDVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQVNTRU1CTFlfREVTQ1JJUFRPUl9fSU5URVJDRVBUT1JfQklORElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIEFTU0VNQkxZX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0VYQ0VQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQVNTRU1CTFlfREVTQ1JJUFRPUl9fSUQpOwotCi0JCWNtcEZpZWxkRUNsYXNzID0gY3JlYXRlRUNsYXNzKENNUF9GSUVMRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY21wRmllbGRFQ2xhc3MsIENNUF9GSUVMRF9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjbXBGaWVsZEVDbGFzcywgQ01QX0ZJRUxEX19GSUVMRF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjbXBGaWVsZEVDbGFzcywgQ01QX0ZJRUxEX19JRCk7Ci0KLQkJY21yRmllbGRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ01SX0ZJRUxEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjbXJGaWVsZEVDbGFzcywgQ01SX0ZJRUxEX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGNtckZpZWxkRUNsYXNzLCBDTVJfRklFTERfX0NNUl9GSUVMRF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjbXJGaWVsZEVDbGFzcywgQ01SX0ZJRUxEX19DTVJfRklFTERfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY21yRmllbGRFQ2xhc3MsIENNUl9GSUVMRF9fSUQpOwotCi0JCWNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlRUNsYXNzLCBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MsIENPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19NRVRIT0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MsIENPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19UUkFOU19BVFRSSUJVVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzcywgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0lEKTsKLQotCQllamJKYXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX0pBUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19JQ09OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJFQ2xhc3MsIEVKQl9KQVJfX0lOVEVSQ0VQVE9SUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19SRUxBVElPTlNISVBTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJFQ2xhc3MsIEVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fTUVUQURBVEFfQ09NUExFVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fVkVSU0lPTik7Ci0KLQkJZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIEVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0VKQl9KQVIpOwotCi0JCWVqYlJlbGF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVKQl9SRUxBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVsYXRpb25FQ2xhc3MsIEVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWxhdGlvbkVDbGFzcywgRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVsYXRpb25FQ2xhc3MsIEVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OU0hJUF9ST0xFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVsYXRpb25FQ2xhc3MsIEVKQl9SRUxBVElPTl9fSUQpOwotCi0JCWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX1JFTEFUSU9OU0hJUF9ST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19FSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQX1JPTEVfU09VUkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19JRCk7Ci0KLQkJZW50ZXJwcmlzZUJlYW5zRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVOVEVSUFJJU0VfQkVBTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGVycHJpc2VCZWFuc0VDbGFzcywgRU5URVJQUklTRV9CRUFOU19fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGVycHJpc2VCZWFuc0VDbGFzcywgRU5URVJQUklTRV9CRUFOU19fU0VTU0lPTl9CRUFOUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50ZXJwcmlzZUJlYW5zRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5TX19FTlRJVFlfQkVBTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGVycHJpc2VCZWFuc0VDbGFzcywgRU5URVJQUklTRV9CRUFOU19fTUVTU0FHRV9EUklWRU5fQkVBTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGVycHJpc2VCZWFuc0VDbGFzcywgRU5URVJQUklTRV9CRUFOU19fSUQpOwotCi0JCWVudGl0eUJlYW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRU5USVRZX0JFQU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19ESVNQTEFZX05BTUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fSUNPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19FSkJfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX01BUFBFRF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fSE9NRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1JFTU9URSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX0xPQ0FMX0hPTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19MT0NBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX0VKQl9DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19QUklNX0tFWV9DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1JFRU5UUkFOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX0NNUF9WRVJTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fQUJTVFJBQ1RfU0NIRU1BX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19DTVBfRklFTERTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUFJJTUtFWV9GSUVMRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX0VOVl9FTlRSSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fRUpCX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19FSkJfTE9DQUxfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1NFUlZJQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1JFU09VUkNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUVVFUklFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX0lEKTsKLQotCQlleGNsdWRlTGlzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFWENMVURFX0xJU1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGV4Y2x1ZGVMaXN0RUNsYXNzLCBFWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXhjbHVkZUxpc3RFQ2xhc3MsIEVYQ0xVREVfTElTVF9fTUVUSE9EUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXhjbHVkZUxpc3RFQ2xhc3MsIEVYQ0xVREVfTElTVF9fSUQpOwotCi0JCWluaXRNZXRob2RUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOSVRfTUVUSE9EX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGluaXRNZXRob2RUeXBlRUNsYXNzLCBJTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbml0TWV0aG9kVHlwZUVDbGFzcywgSU5JVF9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRNZXRob2RUeXBlRUNsYXNzLCBJTklUX01FVEhPRF9UWVBFX19JRCk7Ci0KLQkJaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VKQl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfT1JERVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRVhDTFVERV9ERUZBVUxUX0lOVEVSQ0VQVE9SUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0NMQVNTX0lOVEVSQ0VQVE9SUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19NRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKGludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSUQpOwotCi0JCWludGVyY2VwdG9yT3JkZXJUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOVEVSQ0VQVE9SX09SREVSX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGludGVyY2VwdG9yT3JkZXJUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbnRlcmNlcHRvck9yZGVyVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSUQpOwotCi0JCWludGVyY2VwdG9yc1R5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5URVJDRVBUT1JTX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yc1R5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SU19UWVBFX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yc1R5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SU19UWVBFX19JTlRFUkNFUFRPUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGludGVyY2VwdG9yc1R5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SU19UWVBFX19JRCk7Ci0KLQkJaW50ZXJjZXB0b3JUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOVEVSQ0VQVE9SX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX0FST1VORF9JTlZPS0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX0VOVl9FTlRSSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX0VKQl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX0VKQl9MT0NBTF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX1NFUlZJQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQ09OU1RSVUNUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19QUkVfREVTVFJPWVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9BQ1RJVkFURVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fUFJFX1BBU1NJVkFURVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fSUQpOwotCi0JCW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FU1NBR0VfRFJJVkVOX0JFQU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19ESVNQTEFZX05BTUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fSUNPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX01BUFBFRF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHSU5HX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19USU1FT1VUX01FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTkspOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19BQ1RJVkFUSU9OX0NPTkZJRyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9JTlZPS0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fRU5WX0VOVFJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9MT0NBTF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VSVklDRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fUE9TVF9DT05TVFJVQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fUFJFX0RFU1RST1lTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfSURFTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19JRCk7Ci0KLQkJbWV0aG9kUGFyYW1zRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QQVJBTVMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBhcmFtc0VDbGFzcywgTUVUSE9EX1BBUkFNU19fTUVUSE9EX1BBUkFNUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFyYW1zRUNsYXNzLCBNRVRIT0RfUEFSQU1TX19JRCk7Ci0KLQkJbWV0aG9kUGVybWlzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUEVSTUlTU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGVybWlzc2lvbkVDbGFzcywgTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGVybWlzc2lvbkVDbGFzcywgTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBlcm1pc3Npb25FQ2xhc3MsIE1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBlcm1pc3Npb25FQ2xhc3MsIE1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNRVRIT0RfUEVSTUlTU0lPTl9fSUQpOwotCi0JCW1ldGhvZFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFR5cGVFQ2xhc3MsIE1FVEhPRF9UWVBFX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFR5cGVFQ2xhc3MsIE1FVEhPRF9UWVBFX19FSkJfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVHlwZUVDbGFzcywgTUVUSE9EX1RZUEVfX01FVEhPRF9JTlRGKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RUeXBlRUNsYXNzLCBNRVRIT0RfVFlQRV9fTUVUSE9EX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFR5cGVFQ2xhc3MsIE1FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RUeXBlRUNsYXNzLCBNRVRIT0RfVFlQRV9fSUQpOwotCi0JCW5hbWVkTWV0aG9kVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FRF9NRVRIT0RfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobmFtZWRNZXRob2RUeXBlRUNsYXNzLCBOQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG5hbWVkTWV0aG9kVHlwZUVDbGFzcywgTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMpOwotCQljcmVhdGVFQXR0cmlidXRlKG5hbWVkTWV0aG9kVHlwZUVDbGFzcywgTkFNRURfTUVUSE9EX1RZUEVfX0lEKTsKLQotCQlxdWVyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhRVUVSWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocXVlcnlFQ2xhc3MsIFFVRVJZX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocXVlcnlFQ2xhc3MsIFFVRVJZX19RVUVSWV9NRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKHF1ZXJ5RUNsYXNzLCBRVUVSWV9fUkVTVUxUX1RZUEVfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocXVlcnlFQ2xhc3MsIFFVRVJZX19FSkJfUUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHF1ZXJ5RUNsYXNzLCBRVUVSWV9fSUQpOwotCi0JCXF1ZXJ5TWV0aG9kRUNsYXNzID0gY3JlYXRlRUNsYXNzKFFVRVJZX01FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocXVlcnlNZXRob2RFQ2xhc3MsIFFVRVJZX01FVEhPRF9fTUVUSE9EX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHF1ZXJ5TWV0aG9kRUNsYXNzLCBRVUVSWV9NRVRIT0RfX01FVEhPRF9QQVJBTVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHF1ZXJ5TWV0aG9kRUNsYXNzLCBRVUVSWV9NRVRIT0RfX0lEKTsKLQotCQlyZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVFQ2xhc3MsIFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlRUNsYXNzLCBSRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fRUpCX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlRUNsYXNzLCBSRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fSUQpOwotCi0JCXJlbGF0aW9uc2hpcHNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVMQVRJT05TSElQUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVsYXRpb25zaGlwc0VDbGFzcywgUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWxhdGlvbnNoaXBzRUNsYXNzLCBSRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZWxhdGlvbnNoaXBzRUNsYXNzLCBSRUxBVElPTlNISVBTX19JRCk7Ci0KLQkJcmVtb3ZlTWV0aG9kVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRU1PVkVfTUVUSE9EX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlbW92ZU1ldGhvZFR5cGVFQ2xhc3MsIFJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlbW92ZU1ldGhvZFR5cGVFQ2xhc3MsIFJFTU9WRV9NRVRIT0RfVFlQRV9fUkVUQUlOX0lGX0VYQ0VQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVtb3ZlTWV0aG9kVHlwZUVDbGFzcywgUkVNT1ZFX01FVEhPRF9UWVBFX19JRCk7Ci0KLQkJc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVVJJVFlfSURFTlRJVFlfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3MsIFNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3MsIFNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1VTRV9DQUxMRVJfSURFTlRJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5SWRlbnRpdHlUeXBlRUNsYXNzLCBTRUNVUklUWV9JREVOVElUWV9UWVBFX19SVU5fQVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5SWRlbnRpdHlUeXBlRUNsYXNzLCBTRUNVUklUWV9JREVOVElUWV9UWVBFX19JRCk7Ci0KLQkJc2Vzc2lvbkJlYW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VTU0lPTl9CRUFOKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0lDT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19FSkJfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fTUFQUEVEX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0hPTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1JFTU9URSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fTE9DQUxfSE9NRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fTE9DQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0JVU0lORVNTX0xPQ0FMUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fU0VSVklDRV9FTkRQT0lOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fRUpCX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19TRVNTSU9OX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19JTklUX01FVEhPRFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1JFTU9WRV9NRVRIT0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19BUk9VTkRfSU5WT0tFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fRU5WX0VOVFJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0VKQl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19FSkJfTE9DQUxfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fU0VSVklDRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fUE9TVF9DT05TVFJVQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19QUkVfREVTVFJPWVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1BPU1RfQUNUSVZBVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19QUkVfUEFTU0lWQVRFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19TRUNVUklUWV9JREVOVElUSUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19JRCk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWNtcFZlcnNpb25UeXBlRUVudW0gPSBjcmVhdGVFRW51bShDTVBfVkVSU0lPTl9UWVBFKTsKLQkJY21yRmllbGRUeXBlRUVudW0gPSBjcmVhdGVFRW51bShDTVJfRklFTERfVFlQRSk7Ci0JCW1ldGhvZEludGVyZmFjZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKE1FVEhPRF9JTlRFUkZBQ0VfVFlQRSk7Ci0JCW11bHRpcGxpY2l0eVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKE1VTFRJUExJQ0lUWV9UWVBFKTsKLQkJcGVyc2lzdGVuY2VUeXBlRUVudW0gPSBjcmVhdGVFRW51bShQRVJTSVNURU5DRV9UWVBFKTsKLQkJcmVzdWx0VHlwZU1hcHBpbmdUeXBlRUVudW0gPSBjcmVhdGVFRW51bShSRVNVTFRfVFlQRV9NQVBQSU5HX1RZUEUpOwotCQlzZXNzaW9uVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oU0VTU0lPTl9UWVBFKTsKLQkJdHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0gPSBjcmVhdGVFRW51bShUUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRSk7Ci0JCXRyYW5zYWN0aW9uVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oVFJBTlNBQ1RJT05fVFlQRSk7Ci0KLQkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKLQkJY21wVmVyc2lvblR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoQ01QX1ZFUlNJT05fVFlQRV9PQkpFQ1QpOwotCQljbXJGaWVsZFR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoQ01SX0ZJRUxEX1RZUEVfT0JKRUNUKTsKLQkJZWpiQ2xhc3NUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEVKQl9DTEFTU19UWVBFKTsKLQkJZWpiTmFtZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRUpCX05BTUVfVFlQRSk7Ci0JCW1ldGhvZEludGVyZmFjZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTUVUSE9EX0lOVEVSRkFDRV9UWVBFX09CSkVDVCk7Ci0JCW1ldGhvZE5hbWVUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKE1FVEhPRF9OQU1FX1RZUEUpOwotCQltdWx0aXBsaWNpdHlUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKE1VTFRJUExJQ0lUWV9UWVBFX09CSkVDVCk7Ci0JCXBlcnNpc3RlbmNlVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShQRVJTSVNURU5DRV9UWVBFX09CSkVDVCk7Ci0JCXJlc3VsdFR5cGVNYXBwaW5nVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShSRVNVTFRfVFlQRV9NQVBQSU5HX1RZUEVfT0JKRUNUKTsKLQkJc2Vzc2lvblR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoU0VTU0lPTl9UWVBFX09CSkVDVCk7Ci0JCXRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShUUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRV9PQkpFQ1QpOwotCQl0cmFuc2FjdGlvblR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVFJBTlNBQ1RJT05fVFlQRV9PQkpFQ1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlKYXZhZWVQYWNrYWdlIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpOwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLCBBY3RpdmF0aW9uQ29uZmlnLmNsYXNzLCAiQWN0aXZhdGlvbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBY3RpdmF0aW9uQ29uZmlnX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQWN0aXZhdGlvbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBY3RpdmF0aW9uQ29uZmlnX0FjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCksIG51bGwsICJhY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyIsIG51bGwsIDEsIC0xLCBBY3RpdmF0aW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2YXRpb25Db25maWdfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQWN0aXZhdGlvbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuY2xhc3MsICJBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lIiwgbnVsbCwgMSwgMSwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSIsIG51bGwsIDEsIDEsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoYXBwbGljYXRpb25FeGNlcHRpb25FQ2xhc3MsIEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzLCAiQXBwbGljYXRpb25FeGNlcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fRXhjZXB0aW9uQ2xhc3MoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiZXhjZXB0aW9uQ2xhc3MiLCBudWxsLCAxLCAxLCBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fUm9sbGJhY2soKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJyb2xsYmFjayIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhhcm91bmRJbnZva2VUeXBlRUNsYXNzLCBBcm91bmRJbnZva2VUeXBlLmNsYXNzLCAiQXJvdW5kSW52b2tlVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcm91bmRJbnZva2VUeXBlX0NsYXNzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImNsYXNzIiwgbnVsbCwgMCwgMSwgQXJvdW5kSW52b2tlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJvdW5kSW52b2tlVHlwZV9NZXRob2ROYW1lKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SmF2YUlkZW50aWZpZXIoKSwgIm1ldGhvZE5hbWUiLCBudWxsLCAxLCAxLCBBcm91bmRJbnZva2VUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICJBc3NlbWJseURlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZWN1cml0eVJvbGUoKSwgbnVsbCwgInNlY3VyaXR5Um9sZXMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpLCB0aGlzLmdldE1ldGhvZFBlcm1pc3Npb24oKSwgbnVsbCwgIm1ldGhvZFBlcm1pc3Npb25zIiwgbnVsbCwgMCwgLTEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfQ29udGFpbmVyVHJhbnNhY3Rpb25zKCksIHRoaXMuZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCksIG51bGwsICJjb250YWluZXJUcmFuc2FjdGlvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9JbnRlcmNlcHRvckJpbmRpbmdzKCksIHRoaXMuZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZSgpLCBudWxsLCAiaW50ZXJjZXB0b3JCaW5kaW5ncyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpLCB0aGlzLmdldEV4Y2x1ZGVMaXN0KCksIG51bGwsICJleGNsdWRlTGlzdCIsIG51bGwsIDAsIDEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfQXBwbGljYXRpb25FeGNlcHRpb25zKCksIHRoaXMuZ2V0QXBwbGljYXRpb25FeGNlcHRpb24oKSwgbnVsbCwgImFwcGxpY2F0aW9uRXhjZXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoY21wRmllbGRFQ2xhc3MsIENNUEZpZWxkLmNsYXNzLCAiQ01QRmllbGQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q01QRmllbGRfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBDTVBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRDTVBGaWVsZF9GaWVsZE5hbWUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRKYXZhSWRlbnRpZmllcigpLCAiZmllbGROYW1lIiwgbnVsbCwgMSwgMSwgQ01QRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldENNUEZpZWxkX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIENNUEZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhjbXJGaWVsZEVDbGFzcywgQ01SRmllbGQuY2xhc3MsICJDTVJGaWVsZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRDTVJGaWVsZF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIENNUkZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldENNUkZpZWxkX0NtckZpZWxkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAiY21yRmllbGROYW1lIiwgbnVsbCwgMSwgMSwgQ01SRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldENNUkZpZWxkX0NtckZpZWxkVHlwZSgpLCB0aGlzLmdldENNUkZpZWxkVHlwZSgpLCAiY21yRmllbGRUeXBlIiwgImphdmEudXRpbC5Db2xsZWN0aW9uIiwgMCwgMSwgQ01SRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRDTVJGaWVsZF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBDTVJGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlRUNsYXNzLCBDb250YWluZXJUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJDb250YWluZXJUcmFuc2FjdGlvblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9NZXRob2RzKCksIHRoaXMuZ2V0TWV0aG9kVHlwZSgpLCBudWxsLCAibWV0aG9kcyIsIG51bGwsIDEsIC0xLCBDb250YWluZXJUcmFuc2FjdGlvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX1RyYW5zQXR0cmlidXRlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCksICJ0cmFuc0F0dHJpYnV0ZSIsICJOb3RTdXBwb3J0ZWQiLCAxLCAxLCBDb250YWluZXJUcmFuc2FjdGlvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhlamJKYXJFQ2xhc3MsIEVKQkphci5jbGFzcywgIkVKQkphciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQkphcl9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCksIHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW5zKCksIG51bGwsICJlbnRlcnByaXNlQmVhbnMiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0ludGVyY2VwdG9ycygpLCB0aGlzLmdldEludGVyY2VwdG9yc1R5cGUoKSwgbnVsbCwgImludGVyY2VwdG9ycyIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfUmVsYXRpb25zaGlwcygpLCB0aGlzLmdldFJlbGF0aW9uc2hpcHMoKSwgbnVsbCwgInJlbGF0aW9uc2hpcHMiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCB0aGlzLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLCBudWxsLCAiYXNzZW1ibHlEZXNjcmlwdG9yIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVKQkphcl9FamJDbGllbnRKYXIoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAiZWpiQ2xpZW50SmFyIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJKYXJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVKQkphcl9NZXRhZGF0YUNvbXBsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm1ldGFkYXRhQ29tcGxldGUiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCSmFyX1ZlcnNpb24oKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXdleVZlcnNpb25UeXBlKCksICJ2ZXJzaW9uIiwgIjMuMCIsIDEsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcyhlamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IuY2xhc3MsICJFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAibWl4ZWQiLCBudWxsLCAwLCAtMSwgbnVsbCwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4TUxOU1ByZWZpeE1hcCIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4U0lTY2hlbWFMb2NhdGlvbiIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfRWpiSmFyKCksIHRoaXMuZ2V0RUpCSmFyKCksIG51bGwsICJlamJKYXIiLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZWpiUmVsYXRpb25FQ2xhc3MsIEVKQlJlbGF0aW9uLmNsYXNzLCAiRUpCUmVsYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25fRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFSkJSZWxhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbl9FamJSZWxhdGlvbk5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImVqYlJlbGF0aW9uTmFtZSIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbl9FamJSZWxhdGlvbnNoaXBSb2xlcygpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGUoKSwgbnVsbCwgImVqYlJlbGF0aW9uc2hpcFJvbGVzIiwgbnVsbCwgMiwgMiwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICJFSkJSZWxhdGlvbnNoaXBSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9NdWx0aXBsaWNpdHkoKSwgdGhpcy5nZXRNdWx0aXBsaWNpdHlUeXBlKCksICJtdWx0aXBsaWNpdHkiLCAiT25lIiwgMSwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVtcHR5VHlwZSgpLCBudWxsLCAiY2FzY2FkZURlbGV0ZSIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9SZWxhdGlvbnNoaXBSb2xlU291cmNlKCksIHRoaXMuZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoKSwgbnVsbCwgInJlbGF0aW9uc2hpcFJvbGVTb3VyY2UiLCBudWxsLCAxLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKSwgdGhpcy5nZXRDTVJGaWVsZCgpLCBudWxsLCAiY21yRmllbGQiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZW50ZXJwcmlzZUJlYW5zRUNsYXNzLCBFbnRlcnByaXNlQmVhbnMuY2xhc3MsICJFbnRlcnByaXNlQmVhbnMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50ZXJwcmlzZUJlYW5zX0dyb3VwKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cCIsIG51bGwsIDAsIC0xLCBFbnRlcnByaXNlQmVhbnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuc19TZXNzaW9uQmVhbnMoKSwgdGhpcy5nZXRTZXNzaW9uQmVhbigpLCBudWxsLCAic2Vzc2lvbkJlYW5zIiwgbnVsbCwgMCwgLTEsIEVudGVycHJpc2VCZWFucy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbnNfRW50aXR5QmVhbnMoKSwgdGhpcy5nZXRFbnRpdHlCZWFuKCksIG51bGwsICJlbnRpdHlCZWFucyIsIG51bGwsIDAsIC0xLCBFbnRlcnByaXNlQmVhbnMuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5zX01lc3NhZ2VEcml2ZW5CZWFucygpLCB0aGlzLmdldE1lc3NhZ2VEcml2ZW5CZWFuKCksIG51bGwsICJtZXNzYWdlRHJpdmVuQmVhbnMiLCBudWxsLCAwLCAtMSwgRW50ZXJwcmlzZUJlYW5zLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGVycHJpc2VCZWFuc19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFbnRlcnByaXNlQmVhbnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGVudGl0eUJlYW5FQ2xhc3MsIEVudGl0eUJlYW4uY2xhc3MsICJFbnRpdHlCZWFuIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fRWpiTmFtZSgpLCB0aGlzLmdldEVqYk5hbWVUeXBlKCksICJlamJOYW1lIiwgbnVsbCwgMSwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fSG9tZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEhvbWUoKSwgImhvbWUiLCBudWxsLCAwLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX1JlbW90ZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlbW90ZSgpLCAicmVtb3RlIiwgbnVsbCwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9Mb2NhbEhvbWUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMb2NhbEhvbWUoKSwgImxvY2FsSG9tZSIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fTG9jYWwoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMb2NhbCgpLCAibG9jYWwiLCBudWxsLCAwLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX0VqYkNsYXNzKCksIHRoaXMuZ2V0RWpiQ2xhc3NUeXBlKCksICJlamJDbGFzcyIsIG51bGwsIDEsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VUeXBlKCksIHRoaXMuZ2V0UGVyc2lzdGVuY2VUeXBlKCksICJwZXJzaXN0ZW5jZVR5cGUiLCAiQmVhbiIsIDEsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX1ByaW1LZXlDbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJwcmltS2V5Q2xhc3MiLCBudWxsLCAxLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX1JlZW50cmFudCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgInJlZW50cmFudCIsIG51bGwsIDEsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9DbXBWZXJzaW9uKCksIHRoaXMuZ2V0Q21wVmVyc2lvblR5cGUoKSwgImNtcFZlcnNpb24iLCAiMS54IiwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fQWJzdHJhY3RTY2hlbWFOYW1lKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SmF2YUlkZW50aWZpZXIoKSwgImFic3RyYWN0U2NoZW1hTmFtZSIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fQ21wRmllbGRzKCksIHRoaXMuZ2V0Q01QRmllbGQoKSwgbnVsbCwgImNtcEZpZWxkcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fUHJpbWtleUZpZWxkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJwcmlta2V5RmllbGQiLCBudWxsLCAwLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX0VudkVudHJpZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFbnZFbnRyeSgpLCBudWxsLCAiZW52RW50cmllcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fRWpiUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fRWpiTG9jYWxSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiTG9jYWxSZWYoKSwgbnVsbCwgImVqYkxvY2FsUmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fU2VydmljZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fUmVzb3VyY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VSZWYoKSwgbnVsbCwgInJlc291cmNlUmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fUmVzb3VyY2VFbnZSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VDb250ZXh0UmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlVW5pdFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0UmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fUG9zdENvbnN0cnVjdHMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicG9zdENvbnN0cnVjdHMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX1ByZURlc3Ryb3lzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInByZURlc3Ryb3lzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9TZWN1cml0eVJvbGVSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlUmVmKCksIG51bGwsICJzZWN1cml0eVJvbGVSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9TZWN1cml0eUlkZW50aXR5KCksIHRoaXMuZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGUoKSwgbnVsbCwgInNlY3VyaXR5SWRlbnRpdHkiLCBudWxsLCAwLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fUXVlcmllcygpLCB0aGlzLmdldFF1ZXJ5KCksIG51bGwsICJxdWVyaWVzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhleGNsdWRlTGlzdEVDbGFzcywgRXhjbHVkZUxpc3QuY2xhc3MsICJFeGNsdWRlTGlzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEV4Y2x1ZGVMaXN0X01ldGhvZHMoKSwgdGhpcy5nZXRNZXRob2RUeXBlKCksIG51bGwsICJtZXRob2RzIiwgbnVsbCwgMSwgLTEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEV4Y2x1ZGVMaXN0X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhpbml0TWV0aG9kVHlwZUVDbGFzcywgSW5pdE1ldGhvZFR5cGUuY2xhc3MsICJJbml0TWV0aG9kVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbml0TWV0aG9kVHlwZV9DcmVhdGVNZXRob2QoKSwgdGhpcy5nZXROYW1lZE1ldGhvZFR5cGUoKSwgbnVsbCwgImNyZWF0ZU1ldGhvZCIsIG51bGwsIDEsIDEsIEluaXRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEluaXRNZXRob2RUeXBlX0JlYW5NZXRob2QoKSwgdGhpcy5nZXROYW1lZE1ldGhvZFR5cGUoKSwgbnVsbCwgImJlYW5NZXRob2QiLCBudWxsLCAxLCAxLCBJbml0TWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0TWV0aG9kVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBJbml0TWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcywgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIkludGVyY2VwdG9yQmluZGluZ1R5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FamJOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJlamJOYW1lIiwgbnVsbCwgMSwgMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JbnRlcmNlcHRvckNsYXNzZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiaW50ZXJjZXB0b3JDbGFzc2VzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSW50ZXJjZXB0b3JPcmRlcigpLCB0aGlzLmdldEludGVyY2VwdG9yT3JkZXJUeXBlKCksIG51bGwsICJpbnRlcmNlcHRvck9yZGVyIiwgbnVsbCwgMCwgMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzIiwgbnVsbCwgMCwgMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX01ldGhvZCgpLCB0aGlzLmdldE5hbWVkTWV0aG9kVHlwZSgpLCBudWxsLCAibWV0aG9kIiwgbnVsbCwgMCwgMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGludGVyY2VwdG9yT3JkZXJUeXBlRUNsYXNzLCBJbnRlcmNlcHRvck9yZGVyVHlwZS5jbGFzcywgIkludGVyY2VwdG9yT3JkZXJUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yT3JkZXJUeXBlX0ludGVyY2VwdG9yQ2xhc3NlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJpbnRlcmNlcHRvckNsYXNzZXMiLCBudWxsLCAxLCAtMSwgSW50ZXJjZXB0b3JPcmRlclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yT3JkZXJUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEludGVyY2VwdG9yT3JkZXJUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhpbnRlcmNlcHRvcnNUeXBlRUNsYXNzLCBJbnRlcmNlcHRvcnNUeXBlLmNsYXNzLCAiSW50ZXJjZXB0b3JzVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvcnNUeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JzVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvcnNUeXBlX0ludGVyY2VwdG9ycygpLCB0aGlzLmdldEludGVyY2VwdG9yVHlwZSgpLCBudWxsLCAiaW50ZXJjZXB0b3JzIiwgbnVsbCwgMSwgLTEsIEludGVyY2VwdG9yc1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JzVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvcnNUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIkludGVyY2VwdG9yVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JUeXBlX0ludGVyY2VwdG9yQ2xhc3MoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiaW50ZXJjZXB0b3JDbGFzcyIsIG51bGwsIDEsIDEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX0Fyb3VuZEludm9rZXMoKSwgdGhpcy5nZXRBcm91bmRJbnZva2VUeXBlKCksIG51bGwsICJhcm91bmRJbnZva2VzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfRW52RW50cmllcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZFbnRyaWVzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfRWpiUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYkxvY2FsUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYkxvY2FsUmVmKCksIG51bGwsICJlamJMb2NhbFJlZnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9TZXJ2aWNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VSZWYoKSwgbnVsbCwgInJlc291cmNlUmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX1Jlc291cmNlRW52UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlRW52UmVmKCksIG51bGwsICJyZXNvdXJjZUVudlJlZnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VDb250ZXh0UmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX1BlcnNpc3RlbmNlVW5pdFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlVW5pdFJlZnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9Qb3N0Q29uc3RydWN0cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwb3N0Q29uc3RydWN0cyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX1ByZURlc3Ryb3lzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInByZURlc3Ryb3lzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUG9zdEFjdGl2YXRlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwb3N0QWN0aXZhdGVzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUHJlUGFzc2l2YXRlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVQYXNzaXZhdGVzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvclR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICJNZXNzYWdlRHJpdmVuQmVhbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJOYW1lKCksIHRoaXMuZ2V0RWpiTmFtZVR5cGUoKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiQ2xhc3MoKSwgdGhpcy5nZXRFamJDbGFzc1R5cGUoKSwgImVqYkNsYXNzIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2luZ1R5cGUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAibWVzc2FnaW5nVHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9UaW1lb3V0TWV0aG9kKCksIHRoaXMuZ2V0TmFtZWRNZXRob2RUeXBlKCksIG51bGwsICJ0aW1lb3V0TWV0aG9kIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlKCksICJ0cmFuc2FjdGlvblR5cGUiLCAiQmVhbiIsIDAsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlKCksICJtZXNzYWdlRGVzdGluYXRpb25UeXBlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCksICJtZXNzYWdlRGVzdGluYXRpb25MaW5rIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0FjdGl2YXRpb25Db25maWcoKSwgdGhpcy5nZXRBY3RpdmF0aW9uQ29uZmlnKCksIG51bGwsICJhY3RpdmF0aW9uQ29uZmlnIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fQXJvdW5kSW52b2tlcygpLCB0aGlzLmdldEFyb3VuZEludm9rZVR5cGUoKSwgbnVsbCwgImFyb3VuZEludm9rZXMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRW52RW50cmllcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZFbnRyaWVzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJSZWYoKSwgbnVsbCwgImVqYlJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiTG9jYWxSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiTG9jYWxSZWYoKSwgbnVsbCwgImVqYkxvY2FsUmVmcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9TZXJ2aWNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Jlc291cmNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fUmVzb3VyY2VFbnZSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlQ29udGV4dFJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlVW5pdFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0UmVmcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9Qb3N0Q29uc3RydWN0cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwb3N0Q29uc3RydWN0cyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9QcmVEZXN0cm95cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVEZXN0cm95cyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9TZWN1cml0eUlkZW50aXR5KCksIHRoaXMuZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGUoKSwgbnVsbCwgInNlY3VyaXR5SWRlbnRpdHkiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobWV0aG9kUGFyYW1zRUNsYXNzLCBNZXRob2RQYXJhbXMuY2xhc3MsICJNZXRob2RQYXJhbXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGFyYW1zX01ldGhvZFBhcmFtcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEphdmFUeXBlKCksICJtZXRob2RQYXJhbXMiLCBudWxsLCAwLCAtMSwgTWV0aG9kUGFyYW1zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYXJhbXNfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWV0aG9kUGFyYW1zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAiTWV0aG9kUGVybWlzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQZXJtaXNzaW9uX1JvbGVOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJvbGVOYW1lKCksICJyb2xlTmFtZXMiLCBudWxsLCAwLCAtMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFbXB0eVR5cGUoKSwgbnVsbCwgInVuY2hlY2tlZCIsIG51bGwsIDAsIDEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGVybWlzc2lvbl9NZXRob2RzKCksIHRoaXMuZ2V0TWV0aG9kVHlwZSgpLCBudWxsLCAibWV0aG9kcyIsIG51bGwsIDEsIC0xLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBlcm1pc3Npb25fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobWV0aG9kVHlwZUVDbGFzcywgTWV0aG9kVHlwZS5jbGFzcywgIk1ldGhvZFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kVHlwZV9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVHlwZV9FamJOYW1lKCksIHRoaXMuZ2V0RWpiTmFtZVR5cGUoKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RUeXBlX01ldGhvZEludGYoKSwgdGhpcy5nZXRNZXRob2RJbnRlcmZhY2VUeXBlKCksICJtZXRob2RJbnRmIiwgIkhvbWUiLCAwLCAxLCBNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVHlwZV9NZXRob2ROYW1lKCksIHRoaXMuZ2V0TWV0aG9kTmFtZVR5cGUoKSwgIm1ldGhvZE5hbWUiLCBudWxsLCAxLCAxLCBNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RUeXBlX01ldGhvZFBhcmFtcygpLCB0aGlzLmdldE1ldGhvZFBhcmFtcygpLCBudWxsLCAibWV0aG9kUGFyYW1zIiwgbnVsbCwgMCwgMSwgTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKG5hbWVkTWV0aG9kVHlwZUVDbGFzcywgTmFtZWRNZXRob2RUeXBlLmNsYXNzLCAiTmFtZWRNZXRob2RUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE5hbWVkTWV0aG9kVHlwZV9NZXRob2ROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJtZXRob2ROYW1lIiwgbnVsbCwgMSwgMSwgTmFtZWRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXROYW1lZE1ldGhvZFR5cGVfTWV0aG9kUGFyYW1zKCksIHRoaXMuZ2V0TWV0aG9kUGFyYW1zKCksIG51bGwsICJtZXRob2RQYXJhbXMiLCBudWxsLCAwLCAxLCBOYW1lZE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TmFtZWRNZXRob2RUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIE5hbWVkTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocXVlcnlFQ2xhc3MsIFF1ZXJ5LmNsYXNzLCAiUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UXVlcnlfRGVzY3JpcHRpb24oKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRRdWVyeV9RdWVyeU1ldGhvZCgpLCB0aGlzLmdldFF1ZXJ5TWV0aG9kKCksIG51bGwsICJxdWVyeU1ldGhvZCIsIG51bGwsIDEsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFF1ZXJ5X1Jlc3VsdFR5cGVNYXBwaW5nKCksIHRoaXMuZ2V0UmVzdWx0VHlwZU1hcHBpbmdUeXBlKCksICJyZXN1bHRUeXBlTWFwcGluZyIsICJMb2NhbCIsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlfRWpiUWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlamJRbCIsIG51bGwsIDEsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocXVlcnlNZXRob2RFQ2xhc3MsIFF1ZXJ5TWV0aG9kLmNsYXNzLCAiUXVlcnlNZXRob2QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlNZXRob2RfTWV0aG9kTmFtZSgpLCB0aGlzLmdldE1ldGhvZE5hbWVUeXBlKCksICJtZXRob2ROYW1lIiwgbnVsbCwgMSwgMSwgUXVlcnlNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5TWV0aG9kX01ldGhvZFBhcmFtcygpLCB0aGlzLmdldE1ldGhvZFBhcmFtcygpLCBudWxsLCAibWV0aG9kUGFyYW1zIiwgbnVsbCwgMSwgMSwgUXVlcnlNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlNZXRob2RfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUXVlcnlNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlRUNsYXNzLCBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZS5jbGFzcywgIlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRWpiTmFtZSgpLCB0aGlzLmdldEVqYk5hbWVUeXBlKCksICJlamJOYW1lIiwgbnVsbCwgMSwgMSwgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhyZWxhdGlvbnNoaXBzRUNsYXNzLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAiUmVsYXRpb25zaGlwcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVsYXRpb25zaGlwcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpLCB0aGlzLmdldEVKQlJlbGF0aW9uKCksIG51bGwsICJlamJSZWxhdGlvbnMiLCBudWxsLCAxLCAtMSwgUmVsYXRpb25zaGlwcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZWxhdGlvbnNoaXBzX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHJlbW92ZU1ldGhvZFR5cGVFQ2xhc3MsIFJlbW92ZU1ldGhvZFR5cGUuY2xhc3MsICJSZW1vdmVNZXRob2RUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlbW92ZU1ldGhvZFR5cGVfQmVhbk1ldGhvZCgpLCB0aGlzLmdldE5hbWVkTWV0aG9kVHlwZSgpLCBudWxsLCAiYmVhbk1ldGhvZCIsIG51bGwsIDEsIDEsIFJlbW92ZU1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVtb3ZlTWV0aG9kVHlwZV9SZXRhaW5JZkV4Y2VwdGlvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgInJldGFpbklmRXhjZXB0aW9uIiwgbnVsbCwgMCwgMSwgUmVtb3ZlTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZW1vdmVNZXRob2RUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFJlbW92ZU1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHNlY3VyaXR5SWRlbnRpdHlUeXBlRUNsYXNzLCBTZWN1cml0eUlkZW50aXR5VHlwZS5jbGFzcywgIlNlY3VyaXR5SWRlbnRpdHlUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgU2VjdXJpdHlJZGVudGl0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfVXNlQ2FsbGVySWRlbnRpdHkoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFbXB0eVR5cGUoKSwgbnVsbCwgInVzZUNhbGxlcklkZW50aXR5IiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlJZGVudGl0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfUnVuQXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSdW5BcygpLCBudWxsLCAicnVuQXMiLCBudWxsLCAwLCAxLCBTZWN1cml0eUlkZW50aXR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZWN1cml0eUlkZW50aXR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2Vzc2lvbkJlYW5FQ2xhc3MsIFNlc3Npb25CZWFuLmNsYXNzLCAiU2Vzc2lvbkJlYW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0ljb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fRWpiTmFtZSgpLCB0aGlzLmdldEVqYk5hbWVUeXBlKCksICJlamJOYW1lIiwgbnVsbCwgMSwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0hvbWUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRIb21lKCksICJob21lIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX1JlbW90ZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlbW90ZSgpLCAicmVtb3RlIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0xvY2FsSG9tZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExvY2FsSG9tZSgpLCAibG9jYWxIb21lIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0xvY2FsKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TG9jYWwoKSwgImxvY2FsIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0J1c2luZXNzTG9jYWxzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImJ1c2luZXNzTG9jYWxzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQmVhbl9CdXNpbmVzc1JlbW90ZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiYnVzaW5lc3NSZW1vdGVzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQmVhbl9TZXJ2aWNlRW5kcG9pbnQoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAic2VydmljZUVuZHBvaW50IiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0VqYkNsYXNzKCksIHRoaXMuZ2V0RWpiQ2xhc3NUeXBlKCksICJlamJDbGFzcyIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQmVhbl9TZXNzaW9uVHlwZSgpLCB0aGlzLmdldFNlc3Npb25UeXBlKCksICJzZXNzaW9uVHlwZSIsICJTdGF0ZWZ1bCIsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fVGltZW91dE1ldGhvZCgpLCB0aGlzLmdldE5hbWVkTWV0aG9kVHlwZSgpLCBudWxsLCAidGltZW91dE1ldGhvZCIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0luaXRNZXRob2RzKCksIHRoaXMuZ2V0SW5pdE1ldGhvZFR5cGUoKSwgbnVsbCwgImluaXRNZXRob2RzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1JlbW92ZU1ldGhvZHMoKSwgdGhpcy5nZXRSZW1vdmVNZXRob2RUeXBlKCksIG51bGwsICJyZW1vdmVNZXRob2RzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX1RyYW5zYWN0aW9uVHlwZSgpLCB0aGlzLmdldFRyYW5zYWN0aW9uVHlwZSgpLCAidHJhbnNhY3Rpb25UeXBlIiwgIkJlYW4iLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0Fyb3VuZEludm9rZXMoKSwgdGhpcy5nZXRBcm91bmRJbnZva2VUeXBlKCksIG51bGwsICJhcm91bmRJbnZva2VzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0VudkVudHJpZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFbnZFbnRyeSgpLCBudWxsLCAiZW52RW50cmllcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9FamJSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0VqYkxvY2FsUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYkxvY2FsUmVmKCksIG51bGwsICJlamJMb2NhbFJlZnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fU2VydmljZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9SZXNvdXJjZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1Jlc291cmNlRW52UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlRW52UmVmKCksIG51bGwsICJyZXNvdXJjZUVudlJlZnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlVW5pdFJlZnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUG9zdENvbnN0cnVjdHMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicG9zdENvbnN0cnVjdHMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUHJlRGVzdHJveXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicHJlRGVzdHJveXMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUG9zdEFjdGl2YXRlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwb3N0QWN0aXZhdGVzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1ByZVBhc3NpdmF0ZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicHJlUGFzc2l2YXRlcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9TZWN1cml0eVJvbGVSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlUmVmKCksIG51bGwsICJzZWN1cml0eVJvbGVSZWZzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1NlY3VyaXR5SWRlbnRpdGllcygpLCB0aGlzLmdldFNlY3VyaXR5SWRlbnRpdHlUeXBlKCksIG51bGwsICJzZWN1cml0eUlkZW50aXRpZXMiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQmVhbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShjbXBWZXJzaW9uVHlwZUVFbnVtLCBDbXBWZXJzaW9uVHlwZS5jbGFzcywgIkNtcFZlcnNpb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGNtcFZlcnNpb25UeXBlRUVudW0sIENtcFZlcnNpb25UeXBlLl8xWF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNtcFZlcnNpb25UeXBlRUVudW0sIENtcFZlcnNpb25UeXBlLl8yWF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oY21yRmllbGRUeXBlRUVudW0sIENNUkZpZWxkVHlwZS5jbGFzcywgIkNNUkZpZWxkVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChjbXJGaWVsZFR5cGVFRW51bSwgQ01SRmllbGRUeXBlLkpBVkFfVVRJTF9DT0xMRUNUSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoY21yRmllbGRUeXBlRUVudW0sIENNUkZpZWxkVHlwZS5KQVZBX1VUSUxfU0VUX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuY2xhc3MsICJNZXRob2RJbnRlcmZhY2VUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKG1ldGhvZEludGVyZmFjZVR5cGVFRW51bSwgTWV0aG9kSW50ZXJmYWNlVHlwZS5IT01FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtLCBNZXRob2RJbnRlcmZhY2VUeXBlLlJFTU9URV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG1ldGhvZEludGVyZmFjZVR5cGVFRW51bSwgTWV0aG9kSW50ZXJmYWNlVHlwZS5MT0NBTF9IT01FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtLCBNZXRob2RJbnRlcmZhY2VUeXBlLkxPQ0FMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtLCBNZXRob2RJbnRlcmZhY2VUeXBlLlNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKG11bHRpcGxpY2l0eVR5cGVFRW51bSwgTXVsdGlwbGljaXR5VHlwZS5jbGFzcywgIk11bHRpcGxpY2l0eVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwobXVsdGlwbGljaXR5VHlwZUVFbnVtLCBNdWx0aXBsaWNpdHlUeXBlLk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG11bHRpcGxpY2l0eVR5cGVFRW51bSwgTXVsdGlwbGljaXR5VHlwZS5NQU5ZX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShwZXJzaXN0ZW5jZVR5cGVFRW51bSwgUGVyc2lzdGVuY2VUeXBlLmNsYXNzLCAiUGVyc2lzdGVuY2VUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHBlcnNpc3RlbmNlVHlwZUVFbnVtLCBQZXJzaXN0ZW5jZVR5cGUuQkVBTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHBlcnNpc3RlbmNlVHlwZUVFbnVtLCBQZXJzaXN0ZW5jZVR5cGUuQ09OVEFJTkVSX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShyZXN1bHRUeXBlTWFwcGluZ1R5cGVFRW51bSwgUmVzdWx0VHlwZU1hcHBpbmdUeXBlLmNsYXNzLCAiUmVzdWx0VHlwZU1hcHBpbmdUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHJlc3VsdFR5cGVNYXBwaW5nVHlwZUVFbnVtLCBSZXN1bHRUeXBlTWFwcGluZ1R5cGUuTE9DQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXN1bHRUeXBlTWFwcGluZ1R5cGVFRW51bSwgUmVzdWx0VHlwZU1hcHBpbmdUeXBlLlJFTU9URV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oc2Vzc2lvblR5cGVFRW51bSwgU2Vzc2lvblR5cGUuY2xhc3MsICJTZXNzaW9uVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChzZXNzaW9uVHlwZUVFbnVtLCBTZXNzaW9uVHlwZS5TVEFURUZVTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHNlc3Npb25UeXBlRUVudW0sIFNlc3Npb25UeXBlLlNUQVRFTEVTU19MSVRFUkFMKTsKLQotCQlpbml0RUVudW0odHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5jbGFzcywgIlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLk5PVF9TVVBQT1JURURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlNVUFBPUlRTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuUkVRVUlSRVNfTkVXX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5NQU5EQVRPUllfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLk5FVkVSX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bSh0cmFuc2FjdGlvblR5cGVFRW51bSwgVHJhbnNhY3Rpb25UeXBlLmNsYXNzLCAiVHJhbnNhY3Rpb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuQkVBTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuQ09OVEFJTkVSX0xJVEVSQUwpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGNtcFZlcnNpb25UeXBlT2JqZWN0RURhdGFUeXBlLCBDbXBWZXJzaW9uVHlwZS5jbGFzcywgIkNtcFZlcnNpb25UeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoY21yRmllbGRUeXBlT2JqZWN0RURhdGFUeXBlLCBDTVJGaWVsZFR5cGUuY2xhc3MsICJDTVJGaWVsZFR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShlamJDbGFzc1R5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkVqYkNsYXNzVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShlamJOYW1lVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiRWpiTmFtZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUobWV0aG9kSW50ZXJmYWNlVHlwZU9iamVjdEVEYXRhVHlwZSwgTWV0aG9kSW50ZXJmYWNlVHlwZS5jbGFzcywgIk1ldGhvZEludGVyZmFjZVR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShtZXRob2ROYW1lVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiTWV0aG9kTmFtZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUobXVsdGlwbGljaXR5VHlwZU9iamVjdEVEYXRhVHlwZSwgTXVsdGlwbGljaXR5VHlwZS5jbGFzcywgIk11bHRpcGxpY2l0eVR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShwZXJzaXN0ZW5jZVR5cGVPYmplY3RFRGF0YVR5cGUsIFBlcnNpc3RlbmNlVHlwZS5jbGFzcywgIlBlcnNpc3RlbmNlVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHJlc3VsdFR5cGVNYXBwaW5nVHlwZU9iamVjdEVEYXRhVHlwZSwgUmVzdWx0VHlwZU1hcHBpbmdUeXBlLmNsYXNzLCAiUmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoc2Vzc2lvblR5cGVPYmplY3RFRGF0YVR5cGUsIFNlc3Npb25UeXBlLmNsYXNzLCAiU2Vzc2lvblR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZSh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3RFRGF0YVR5cGUsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5jbGFzcywgIlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHRyYW5zYWN0aW9uVHlwZU9iamVjdEVEYXRhVHlwZSwgVHJhbnNhY3Rpb25UeXBlLmNsYXNzLCAiVHJhbnNhY3Rpb25UeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKLQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGE8L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiOyAvLyROT04tTkxTLTEkCQkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImFjdGl2YXRpb24tY29uZmlnVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3RpdmF0aW9uQ29uZmlnX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3RpdmF0aW9uQ29uZmlnX0FjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2YXRpb25Db25maWdfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFwcGxpY2F0aW9uRXhjZXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJhcHBsaWNhdGlvbi1leGNlcHRpb25UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2F0aW9uRXhjZXB0aW9uX0V4Y2VwdGlvbkNsYXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJleGNlcHRpb24tY2xhc3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9Sb2xsYmFjaygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicm9sbGJhY2siLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFyb3VuZEludm9rZVR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImFyb3VuZC1pbnZva2VUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFyb3VuZEludm9rZVR5cGVfQ2xhc3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJvdW5kSW52b2tlVHlwZV9NZXRob2ROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRob2QtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZWN1cml0eS1yb2xlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRob2QtcGVybWlzc2lvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9Db250YWluZXJUcmFuc2FjdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImNvbnRhaW5lci10cmFuc2FjdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9JbnRlcmNlcHRvckJpbmRpbmdzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbnRlcmNlcHRvci1iaW5kaW5nIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBc3NlbWJseURlc2NyaXB0b3JfRXhjbHVkZUxpc3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImV4Y2x1ZGUtbGlzdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9BcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImFwcGxpY2F0aW9uLWV4Y2VwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNtcEZpZWxkRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJjbXAtZmllbGRUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENNUEZpZWxkX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q01QRmllbGRfRmllbGROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJmaWVsZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q01QRmllbGRfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjbXBWZXJzaW9uVHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJjbXAtdmVyc2lvblR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNtcFZlcnNpb25UeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJjbXAtdmVyc2lvblR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImNtcC12ZXJzaW9uVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNtckZpZWxkRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJjbXItZmllbGRUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENNUkZpZWxkX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q01SRmllbGRfQ21yRmllbGROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJjbXItZmllbGQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENNUkZpZWxkX0NtckZpZWxkVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiY21yLWZpZWxkLXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDTVJGaWVsZF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNtckZpZWxkVHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJjbXItZmllbGQtdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNtckZpZWxkVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiY21yLWZpZWxkLXR5cGVUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJjbXItZmllbGQtdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfTWV0aG9kcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX1RyYW5zQXR0cmlidXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ0cmFucy1hdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlamJDbGFzc1R5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImVqYi1jbGFzc1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlI2Z1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlamJKYXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImVqYi1qYXJUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphcl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphcl9EaXNwbGF5TmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJKYXJfSWNvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImljb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZW50ZXJwcmlzZS1iZWFucyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphcl9JbnRlcmNlcHRvcnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImludGVyY2VwdG9ycyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphcl9SZWxhdGlvbnNoaXBzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZWxhdGlvbnNoaXBzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImFzc2VtYmx5LWRlc2NyaXB0b3IiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLWNsaWVudC1qYXIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJKYXJfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJKYXJfTWV0YWRhdGFDb21wbGV0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRhZGF0YS1jb21wbGV0ZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphcl9WZXJzaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInZlcnNpb24iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJtaXhlZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudFdpbGRjYXJkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiOm1peGVkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ4bWxuczpwcmVmaXgiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInhzaTpzY2hlbWFMb2NhdGlvbiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX0VqYkphcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLWphciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlamJOYW1lVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZWpiLW5hbWVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNOTVRPS0VOIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZWpiUmVsYXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImVqYi1yZWxhdGlvblR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCUmVsYXRpb25fRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJSZWxhdGlvbl9FamJSZWxhdGlvbk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1yZWxhdGlvbi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCUmVsYXRpb25fRWpiUmVsYXRpb25zaGlwUm9sZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1yZWxhdGlvbnNoaXAtcm9sZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQlJlbGF0aW9uX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9FamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX011bHRpcGxpY2l0eSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibXVsdGlwbGljaXR5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiY2FzY2FkZS1kZWxldGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImNtci1maWVsZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlbnRlcnByaXNlQmVhbnNFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImVudGVycHJpc2UtYmVhbnNUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGVycHJpc2VCZWFuc19Hcm91cCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImdyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGVycHJpc2VCZWFuc19TZXNzaW9uQmVhbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlc3Npb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRlcnByaXNlQmVhbnNfRW50aXR5QmVhbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVudGl0eSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGVycHJpc2VCZWFuc19NZXNzYWdlRHJpdmVuQmVhbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZHJpdmVuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50ZXJwcmlzZUJlYW5zX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZW50aXR5QmVhbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZW50aXR5LWJlYW5UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX0Rpc3BsYXlOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fSWNvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImljb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9FamJOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fTWFwcGVkTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWFwcGVkLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX0hvbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImhvbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX1JlbW90ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVtb3RlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9Mb2NhbEhvbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImxvY2FsLWhvbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX0xvY2FsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsb2NhbCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fRWpiQ2xhc3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fUHJpbUtleUNsYXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwcmltLWtleS1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX1JlZW50cmFudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVlbnRyYW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9DbXBWZXJzaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJjbXAtdmVyc2lvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX0Fic3RyYWN0U2NoZW1hTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYWJzdHJhY3Qtc2NoZW1hLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX0NtcEZpZWxkcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiY21wLWZpZWxkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fUHJpbWtleUZpZWxkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwcmlta2V5LWZpZWxkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9FbnZFbnRyaWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlbnYtZW50cnkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9FamJSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fRWpiTG9jYWxSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItbG9jYWwtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fU2VydmljZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fUmVzb3VyY2VSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZXNvdXJjZS1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9SZXNvdXJjZUVudlJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLWVudi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtdW5pdC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9Qb3N0Q29uc3RydWN0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicG9zdC1jb25zdHJ1Y3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9QcmVEZXN0cm95cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicHJlLWRlc3Ryb3kiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9TZWN1cml0eVJvbGVSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZWN1cml0eS1yb2xlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVudGl0eUJlYW5fU2VjdXJpdHlJZGVudGl0eSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VjdXJpdHktaWRlbnRpdHkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFbnRpdHlCZWFuX1F1ZXJpZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInF1ZXJ5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RW50aXR5QmVhbl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGV4Y2x1ZGVMaXN0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJleGNsdWRlLWxpc3RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFeGNsdWRlTGlzdF9NZXRob2RzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRob2QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFeGNsdWRlTGlzdF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoaW5pdE1ldGhvZFR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImluaXQtbWV0aG9kVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbml0TWV0aG9kVHlwZV9DcmVhdGVNZXRob2QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImNyZWF0ZS1tZXRob2QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbml0TWV0aG9kVHlwZV9CZWFuTWV0aG9kKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJiZWFuLW1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEluaXRNZXRob2RUeXBlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoaW50ZXJjZXB0b3JCaW5kaW5nVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiaW50ZXJjZXB0b3ItYmluZGluZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FamJOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbnRlcmNlcHRvci1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSW50ZXJjZXB0b3JPcmRlcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW50ZXJjZXB0b3Itb3JkZXIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJleGNsdWRlLWRlZmF1bHQtaW50ZXJjZXB0b3JzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImV4Y2x1ZGUtY2xhc3MtaW50ZXJjZXB0b3JzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9NZXRob2QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChpbnRlcmNlcHRvck9yZGVyVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiaW50ZXJjZXB0b3Itb3JkZXJUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yT3JkZXJUeXBlX0ludGVyY2VwdG9yQ2xhc3NlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW50ZXJjZXB0b3ItY2xhc3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvck9yZGVyVHlwZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGludGVyY2VwdG9yc1R5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImludGVyY2VwdG9yc1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JzVHlwZV9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JzVHlwZV9JbnRlcmNlcHRvcnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImludGVyY2VwdG9yIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JzVHlwZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGludGVyY2VwdG9yVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiaW50ZXJjZXB0b3JUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yVHlwZV9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX0ludGVyY2VwdG9yQ2xhc3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImludGVyY2VwdG9yLWNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX0Fyb3VuZEludm9rZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImFyb3VuZC1pbnZva2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfRW52RW50cmllcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZW52LWVudHJ5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yVHlwZV9FamJSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yVHlwZV9FamJMb2NhbFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1sb2NhbC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX1NlcnZpY2VSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZXNvdXJjZS1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX1Jlc291cmNlRW52UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzb3VyY2UtZW52LXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS11bml0LXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfUG9zdENvbnN0cnVjdHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBvc3QtY29uc3RydWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yVHlwZV9QcmVEZXN0cm95cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicHJlLWRlc3Ryb3kiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RBY3RpdmF0ZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBvc3QtYWN0aXZhdGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfUHJlUGFzc2l2YXRlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicHJlLXBhc3NpdmF0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEludGVyY2VwdG9yVHlwZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtZXNzYWdlLWRyaXZlbi1iZWFuVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9EZXNjcmlwdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Rpc3BsYXlOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0ljb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpY29uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWFwcGVkTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWFwcGVkLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiQ2xhc3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdpbmdUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXNzYWdpbmctdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1RpbWVvdXRNZXRob2QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInRpbWVvdXQtbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ0cmFuc2FjdGlvbi10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uTGluaygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fQWN0aXZhdGlvbkNvbmZpZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYWN0aXZhdGlvbi1jb25maWciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9Bcm91bmRJbnZva2VzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJhcm91bmQtaW52b2tlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRW52RW50cmllcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZW52LWVudHJ5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYlJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiTG9jYWxSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItbG9jYWwtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlcnZpY2VSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZUVudlJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc291cmNlLWVudi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtY29udGV4dC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtdW5pdC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fUG9zdENvbnN0cnVjdHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBvc3QtY29uc3RydWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1ByZURlc3Ryb3lzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwcmUtZGVzdHJveSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9TZWN1cml0eUlkZW50aXR5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZWN1cml0eS1pZGVudGl0eSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtZXRob2QtaW50ZlR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZEludGVyZmFjZVR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1ldGhvZC1pbnRmVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAibWV0aG9kLWludGZUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kTmFtZVR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1ldGhvZC1uYW1lVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZFBhcmFtc0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibWV0aG9kLXBhcmFtc1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBhcmFtc19NZXRob2RQYXJhbXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZC1wYXJhbSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBhcmFtc19JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZFBlcm1pc3Npb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm1ldGhvZC1wZXJtaXNzaW9uVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQZXJtaXNzaW9uX1JvbGVOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicm9sZS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBlcm1pc3Npb25fVW5jaGVja2VkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ1bmNoZWNrZWQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBlcm1pc3Npb25fSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RUeXBlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtZXRob2RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFR5cGVfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFR5cGVfRWpiTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RUeXBlX01ldGhvZEludGYoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZC1pbnRmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVHlwZV9NZXRob2ROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRob2QtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFR5cGVfTWV0aG9kUGFyYW1zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRob2QtcGFyYW1zIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVHlwZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG11bHRpcGxpY2l0eVR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibXVsdGlwbGljaXR5VHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobXVsdGlwbGljaXR5VHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibXVsdGlwbGljaXR5VHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAibXVsdGlwbGljaXR5VHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobmFtZWRNZXRob2RUeXBlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJuYW1lZC1tZXRob2RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE5hbWVkTWV0aG9kVHlwZV9NZXRob2ROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRob2QtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE5hbWVkTWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1ldGhvZC1wYXJhbXMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXROYW1lZE1ldGhvZFR5cGVfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwZXJzaXN0ZW5jZVR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBlcnNpc3RlbmNlVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtdHlwZVR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgInBlcnNpc3RlbmNlLXR5cGVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocXVlcnlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInF1ZXJ5VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRRdWVyeV9EZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRRdWVyeV9RdWVyeU1ldGhvZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicXVlcnktbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UXVlcnlfUmVzdWx0VHlwZU1hcHBpbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlc3VsdC10eXBlLW1hcHBpbmciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRRdWVyeV9FamJRbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLXFsIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UXVlcnlfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChxdWVyeU1ldGhvZEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicXVlcnktbWV0aG9kVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRRdWVyeU1ldGhvZF9NZXRob2ROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRob2QtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFF1ZXJ5TWV0aG9kX01ldGhvZFBhcmFtcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWV0aG9kLXBhcmFtcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFF1ZXJ5TWV0aG9kX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlX0VqYk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZWxhdGlvbnNoaXBzRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJyZWxhdGlvbnNoaXBzVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLXJlbGF0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVsYXRpb25zaGlwc19JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocmVtb3ZlTWV0aG9kVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAicmVtb3ZlLW1ldGhvZFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UmVtb3ZlTWV0aG9kVHlwZV9CZWFuTWV0aG9kKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJiZWFuLW1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJlbW92ZU1ldGhvZFR5cGVfUmV0YWluSWZFeGNlcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJldGFpbi1pZi1leGNlcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSZW1vdmVNZXRob2RUeXBlX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocmVzdWx0VHlwZU1hcHBpbmdUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInJlc3VsdC10eXBlLW1hcHBpbmdUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJyZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlY3VyaXR5SWRlbnRpdHlUeXBlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZWN1cml0eS1pZGVudGl0eVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9Vc2VDYWxsZXJJZGVudGl0eSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidXNlLWNhbGxlci1pZGVudGl0eSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX1J1bkFzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJydW4tYXMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlc3Npb25CZWFuRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXNzaW9uLWJlYW5UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fRGlzcGxheU5hbWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkaXNwbGF5LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fSWNvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImljb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fRWpiTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9NYXBwZWROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtYXBwZWQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0hvbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImhvbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9SZW1vdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJlbW90ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0xvY2FsSG9tZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibG9jYWwtaG9tZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0xvY2FsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsb2NhbCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0J1c2luZXNzTG9jYWxzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJidXNpbmVzcy1sb2NhbCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0J1c2luZXNzUmVtb3RlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYnVzaW5lc3MtcmVtb3RlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1NlcnZpY2VFbmRwb2ludCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmljZS1lbmRwb2ludCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9FamJDbGFzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLWNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fU2Vzc2lvblR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlc3Npb24tdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1RpbWVvdXRNZXRob2QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInRpbWVvdXQtbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0luaXRNZXRob2RzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpbml0LW1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9SZW1vdmVNZXRob2RzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZW1vdmUtbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ0cmFuc2FjdGlvbi10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fQXJvdW5kSW52b2tlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYXJvdW5kLWludm9rZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0VudkVudHJpZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVudi1lbnRyeSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9FamJSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX0VqYkxvY2FsUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZWpiLWxvY2FsLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9TZXJ2aWNlUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmljZS1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZXNvdXJjZS1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VFbnZSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZXNvdXJjZS1lbnYtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLXVuaXQtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1Bvc3RDb25zdHJ1Y3RzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwb3N0LWNvbnN0cnVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9QcmVEZXN0cm95cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicHJlLWRlc3Ryb3kiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2Vzc2lvbkJlYW5fUG9zdEFjdGl2YXRlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicG9zdC1hY3RpdmF0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1ByZVBhc3NpdmF0ZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInByZS1wYXNzaXZhdGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9TZWN1cml0eVJvbGVSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZWN1cml0eS1yb2xlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25CZWFuX1NlY3VyaXR5SWRlbnRpdGllcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VjdXJpdHktaWRlbnRpdHkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXNzaW9uQmVhbl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlc3Npb25UeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlc3Npb24tdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlc3Npb25UeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXNzaW9uLXR5cGVUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJzZXNzaW9uLXR5cGVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInRyYW5zLWF0dHJpYnV0ZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAidHJhbnMtYXR0cmlidXRlVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAidHJhbnMtYXR0cmlidXRlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ0cmFuc2FjdGlvbi10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodHJhbnNhY3Rpb25UeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ0cmFuc2FjdGlvbi10eXBlVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAidHJhbnNhY3Rpb24tdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsKLQl9Ci0KLX0gLy9FamJQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRlcnByaXNlQmVhbnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGVycHJpc2VCZWFuc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4NTRmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGVycHJpc2VCZWFuc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50ZXJwcmlzZSBCZWFuczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRlcnByaXNlQmVhbnNJbXBsI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRlcnByaXNlQmVhbnNJbXBsI2dldFNlc3Npb25CZWFucyA8ZW0+U2Vzc2lvbiBCZWFuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRlcnByaXNlQmVhbnNJbXBsI2dldEVudGl0eUJlYW5zIDxlbT5FbnRpdHkgQmVhbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50ZXJwcmlzZUJlYW5zSW1wbCNnZXRNZXNzYWdlRHJpdmVuQmVhbnMgPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGVycHJpc2VCZWFuc0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRW50ZXJwcmlzZUJlYW5zSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRW50ZXJwcmlzZUJlYW5zIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW50ZXJwcmlzZUJlYW5zSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRU5URVJQUklTRV9CRUFOUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2Vzc2lvbkJlYW5zKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoRWpiUGFja2FnZS5MaXRlcmFscy5FTlRFUlBSSVNFX0JFQU5TX19TRVNTSU9OX0JFQU5TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFbnRpdHlCZWFucygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KEVqYlBhY2thZ2UuTGl0ZXJhbHMuRU5URVJQUklTRV9CRUFOU19fRU5USVRZX0JFQU5TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRHJpdmVuQmVhbnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChFamJQYWNrYWdlLkxpdGVyYWxzLkVOVEVSUFJJU0VfQkVBTlNfX01FU1NBR0VfRFJJVkVOX0JFQU5TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fU0VTU0lPTl9CRUFOUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlc3Npb25CZWFucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fRU5USVRZX0JFQU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW50aXR5QmVhbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX01FU1NBR0VfRFJJVkVOX0JFQU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX0dST1VQOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fU0VTU0lPTl9CRUFOUzoKLQkJCQlyZXR1cm4gZ2V0U2Vzc2lvbkJlYW5zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fRU5USVRZX0JFQU5TOgotCQkJCXJldHVybiBnZXRFbnRpdHlCZWFucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX01FU1NBR0VfRFJJVkVOX0JFQU5TOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRHJpdmVuQmVhbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX0dST1VQOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19TRVNTSU9OX0JFQU5TOgotCQkJCWdldFNlc3Npb25CZWFucygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2Vzc2lvbkJlYW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fRU5USVRZX0JFQU5TOgotCQkJCWdldEVudGl0eUJlYW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnRpdHlCZWFucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX01FU1NBR0VfRFJJVkVOX0JFQU5TOgotCQkJCWdldE1lc3NhZ2VEcml2ZW5CZWFucygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX1NFU1NJT05fQkVBTlM6Ci0JCQkJZ2V0U2Vzc2lvbkJlYW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fRU5USVRZX0JFQU5TOgotCQkJCWdldEVudGl0eUJlYW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fTUVTU0FHRV9EUklWRU5fQkVBTlM6Ci0JCQkJZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fU0VTU0lPTl9CRUFOUzoKLQkJCQlyZXR1cm4gIWdldFNlc3Npb25CZWFucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19FTlRJVFlfQkVBTlM6Ci0JCQkJcmV0dXJuICFnZXRFbnRpdHlCZWFucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19NRVNTQUdFX0RSSVZFTl9CRUFOUzoKLQkJCQlyZXR1cm4gIWdldE1lc3NhZ2VEcml2ZW5CZWFucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0VudGVycHJpc2VCZWFuc0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGl0eUJlYW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGl0eUJlYW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzc5MzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRpdHlCZWFuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ21wVmVyc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5QZXJzaXN0ZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5IEJlYW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRIb21lIDxlbT5Ib21lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFJlbW90ZSA8ZW0+UmVtb3RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldExvY2FsSG9tZSA8ZW0+TG9jYWwgSG9tZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRMb2NhbCA8ZW0+TG9jYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0RWpiQ2xhc3MgPGVtPkVqYiBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRQZXJzaXN0ZW5jZVR5cGUgPGVtPlBlcnNpc3RlbmNlIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0UHJpbUtleUNsYXNzIDxlbT5QcmltIEtleSBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNpc1JlZW50cmFudCA8ZW0+UmVlbnRyYW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldENtcFZlcnNpb24gPGVtPkNtcCBWZXJzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldEFic3RyYWN0U2NoZW1hTmFtZSA8ZW0+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0Q21wRmllbGRzIDxlbT5DbXAgRmllbGRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFByaW1rZXlGaWVsZCA8ZW0+UHJpbWtleSBGaWVsZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFNlY3VyaXR5Um9sZVJlZnMgPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRTZWN1cml0eUlkZW50aXR5IDxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRRdWVyaWVzIDxlbT5RdWVyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUJlYW5JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbnRpdHlCZWFuIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTmFtZSgpIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTmFtZSgpIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJOYW1lID0gRUpCX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWROYW1lID0gTUFQUEVEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG9tZSgpIDxlbT5Ib21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIT01FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvbWUoKSA8ZW0+SG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBob21lID0gSE9NRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1vdGUoKSA8ZW0+UmVtb3RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1vdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1vdGUoKSA8ZW0+UmVtb3RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1vdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVtb3RlID0gUkVNT1RFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsSG9tZSgpIDxlbT5Mb2NhbCBIb21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0hPTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxIb21lKCkgPGVtPkxvY2FsIEhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhbEhvbWUgPSBMT0NBTF9IT01FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsKCkgPGVtPkxvY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWwoKSA8ZW0+TG9jYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsID0gTE9DQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiQ2xhc3MoKSA8ZW0+RWpiIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkNsYXNzKCkgPGVtPkVqYiBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiQ2xhc3MgPSBFSkJfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VUeXBlKCkgPGVtPlBlcnNpc3RlbmNlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVR5cGUgUEVSU0lTVEVOQ0VfVFlQRV9FREVGQVVMVCA9IFBlcnNpc3RlbmNlVHlwZS5CRUFOX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVR5cGUoKSA8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VUeXBlIHBlcnNpc3RlbmNlVHlwZSA9IFBFUlNJU1RFTkNFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFBlcnNpc3RlbmNlIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3RlbmNlVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmltS2V5Q2xhc3MoKSA8ZW0+UHJpbSBLZXkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW1LZXlDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9LRVlfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbUtleUNsYXNzKCkgPGVtPlByaW0gS2V5IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmltS2V5Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJpbUtleUNsYXNzID0gUFJJTV9LRVlfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWVudHJhbnQoKSA8ZW0+UmVlbnRyYW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlZW50cmFudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFRU5UUkFOVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWVudHJhbnQoKSA8ZW0+UmVlbnRyYW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlZW50cmFudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVlbnRyYW50ID0gUkVFTlRSQU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZWVudHJhbnQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlZW50cmFudEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbXBWZXJzaW9uKCkgPGVtPkNtcCBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbXBWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENtcFZlcnNpb25UeXBlIENNUF9WRVJTSU9OX0VERUZBVUxUID0gQ21wVmVyc2lvblR5cGUuXzFYX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbXBWZXJzaW9uKCkgPGVtPkNtcCBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbXBWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ21wVmVyc2lvblR5cGUgY21wVmVyc2lvbiA9IENNUF9WRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDbXAgVmVyc2lvbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY21wVmVyc2lvbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSA8ZW0+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFic3RyYWN0U2NoZW1hTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJTVFJBQ1RfU0NIRU1BX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgPGVtPkFic3RyYWN0IFNjaGVtYSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWJzdHJhY3RTY2hlbWFOYW1lID0gQUJTVFJBQ1RfU0NIRU1BX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbXBGaWVsZHMoKSA8ZW0+Q21wIEZpZWxkczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbXBGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjbXBGaWVsZHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByaW1rZXlGaWVsZCgpIDxlbT5Qcmlta2V5IEZpZWxkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmlta2V5RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1LRVlfRklFTERfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWtleUZpZWxkKCkgPGVtPlByaW1rZXkgRmllbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW1rZXlGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmlta2V5RmllbGQgPSBQUklNS0VZX0ZJRUxEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cmllcygpIDxlbT5FbnYgRW50cmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnZFbnRyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW52RW50cmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZzKCkgPGVtPkVqYiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkxvY2FsUmVmcygpIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJMb2NhbFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJMb2NhbFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZnMoKSA8ZW0+U2VydmljZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VydmljZVJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VSZWZzKCkgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRW52UmVmcygpIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZUVudlJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlVW5pdFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdENvbnN0cnVjdHMoKSA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3RDb25zdHJ1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9zdENvbnN0cnVjdHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlRGVzdHJveXMoKSA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZURlc3Ryb3lzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJlRGVzdHJveXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdXJpdHlSb2xlUmVmcygpIDxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdXJpdHlSb2xlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlY3VyaXR5Um9sZVJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdXJpdHlJZGVudGl0eSgpIDxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdXJpdHlJZGVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5SWRlbnRpdHlUeXBlIHNlY3VyaXR5SWRlbnRpdHkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UXVlcmllcygpIDxlbT5RdWVyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBxdWVyaWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eUJlYW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FTlRJVFlfQkVBTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKLQkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0lDT05TKTsKLQkJfQotCQlyZXR1cm4gaWNvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJOYW1lKCkgewotCQlyZXR1cm4gZWpiTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJOYW1lKFN0cmluZyBuZXdFamJOYW1lKSB7Ci0JCVN0cmluZyBvbGRFamJOYW1lID0gZWpiTmFtZTsKLQkJZWpiTmFtZSA9IG5ld0VqYk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9OQU1FLCBvbGRFamJOYW1lLCBlamJOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWROYW1lKCkgewotCQlyZXR1cm4gbWFwcGVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyBuZXdNYXBwZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRNYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLQkJbWFwcGVkTmFtZSA9IG5ld01hcHBlZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX01BUFBFRF9OQU1FLCBvbGRNYXBwZWROYW1lLCBtYXBwZWROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb21lKCkgewotCQlyZXR1cm4gaG9tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb21lKFN0cmluZyBuZXdIb21lKSB7Ci0JCVN0cmluZyBvbGRIb21lID0gaG9tZTsKLQkJaG9tZSA9IG5ld0hvbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0hPTUUsIG9sZEhvbWUsIGhvbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZSgpIHsKLQkJcmV0dXJuIHJlbW90ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGUoU3RyaW5nIG5ld1JlbW90ZSkgewotCQlTdHJpbmcgb2xkUmVtb3RlID0gcmVtb3RlOwotCQlyZW1vdGUgPSBuZXdSZW1vdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFTU9URSwgb2xkUmVtb3RlLCByZW1vdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsSG9tZSgpIHsKLQkJcmV0dXJuIGxvY2FsSG9tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEhvbWUoU3RyaW5nIG5ld0xvY2FsSG9tZSkgewotCQlTdHJpbmcgb2xkTG9jYWxIb21lID0gbG9jYWxIb21lOwotCQlsb2NhbEhvbWUgPSBuZXdMb2NhbEhvbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0xPQ0FMX0hPTUUsIG9sZExvY2FsSG9tZSwgbG9jYWxIb21lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbCgpIHsKLQkJcmV0dXJuIGxvY2FsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsKFN0cmluZyBuZXdMb2NhbCkgewotCQlTdHJpbmcgb2xkTG9jYWwgPSBsb2NhbDsKLQkJbG9jYWwgPSBuZXdMb2NhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTE9DQUwsIG9sZExvY2FsLCBsb2NhbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiQ2xhc3MoKSB7Ci0JCXJldHVybiBlamJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJDbGFzcyhTdHJpbmcgbmV3RWpiQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZEVqYkNsYXNzID0gZWpiQ2xhc3M7Ci0JCWVqYkNsYXNzID0gbmV3RWpiQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9DTEFTUywgb2xkRWpiQ2xhc3MsIGVqYkNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVHlwZSBnZXRQZXJzaXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VUeXBlKFBlcnNpc3RlbmNlVHlwZSBuZXdQZXJzaXN0ZW5jZVR5cGUpIHsKLQkJUGVyc2lzdGVuY2VUeXBlIG9sZFBlcnNpc3RlbmNlVHlwZSA9IHBlcnNpc3RlbmNlVHlwZTsKLQkJcGVyc2lzdGVuY2VUeXBlID0gbmV3UGVyc2lzdGVuY2VUeXBlID09IG51bGwgPyBQRVJTSVNURU5DRV9UWVBFX0VERUZBVUxUIDogbmV3UGVyc2lzdGVuY2VUeXBlOwotCQlib29sZWFuIG9sZFBlcnNpc3RlbmNlVHlwZUVTZXQgPSBwZXJzaXN0ZW5jZVR5cGVFU2V0OwotCQlwZXJzaXN0ZW5jZVR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVFlQRSwgb2xkUGVyc2lzdGVuY2VUeXBlLCBwZXJzaXN0ZW5jZVR5cGUsICFvbGRQZXJzaXN0ZW5jZVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRQZXJzaXN0ZW5jZVR5cGUoKSB7Ci0JCVBlcnNpc3RlbmNlVHlwZSBvbGRQZXJzaXN0ZW5jZVR5cGUgPSBwZXJzaXN0ZW5jZVR5cGU7Ci0JCWJvb2xlYW4gb2xkUGVyc2lzdGVuY2VUeXBlRVNldCA9IHBlcnNpc3RlbmNlVHlwZUVTZXQ7Ci0JCXBlcnNpc3RlbmNlVHlwZSA9IFBFUlNJU1RFTkNFX1RZUEVfRURFRkFVTFQ7Ci0JCXBlcnNpc3RlbmNlVHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9UWVBFLCBvbGRQZXJzaXN0ZW5jZVR5cGUsIFBFUlNJU1RFTkNFX1RZUEVfRURFRkFVTFQsIG9sZFBlcnNpc3RlbmNlVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmltS2V5Q2xhc3MoKSB7Ci0JCXJldHVybiBwcmltS2V5Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpbUtleUNsYXNzKFN0cmluZyBuZXdQcmltS2V5Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZFByaW1LZXlDbGFzcyA9IHByaW1LZXlDbGFzczsKLQkJcHJpbUtleUNsYXNzID0gbmV3UHJpbUtleUNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUklNX0tFWV9DTEFTUywgb2xkUHJpbUtleUNsYXNzLCBwcmltS2V5Q2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZW50cmFudCgpIHsKLQkJcmV0dXJuIHJlZW50cmFudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWVudHJhbnQoYm9vbGVhbiBuZXdSZWVudHJhbnQpIHsKLQkJYm9vbGVhbiBvbGRSZWVudHJhbnQgPSByZWVudHJhbnQ7Ci0JCXJlZW50cmFudCA9IG5ld1JlZW50cmFudDsKLQkJYm9vbGVhbiBvbGRSZWVudHJhbnRFU2V0ID0gcmVlbnRyYW50RVNldDsKLQkJcmVlbnRyYW50RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFRU5UUkFOVCwgb2xkUmVlbnRyYW50LCByZWVudHJhbnQsICFvbGRSZWVudHJhbnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZWVudHJhbnQoKSB7Ci0JCWJvb2xlYW4gb2xkUmVlbnRyYW50ID0gcmVlbnRyYW50OwotCQlib29sZWFuIG9sZFJlZW50cmFudEVTZXQgPSByZWVudHJhbnRFU2V0OwotCQlyZWVudHJhbnQgPSBSRUVOVFJBTlRfRURFRkFVTFQ7Ci0JCXJlZW50cmFudEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRUVOVFJBTlQsIG9sZFJlZW50cmFudCwgUkVFTlRSQU5UX0VERUZBVUxULCBvbGRSZWVudHJhbnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZWVudHJhbnQoKSB7Ci0JCXJldHVybiByZWVudHJhbnRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDbXBWZXJzaW9uVHlwZSBnZXRDbXBWZXJzaW9uKCkgewotCQlyZXR1cm4gY21wVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbXBWZXJzaW9uKENtcFZlcnNpb25UeXBlIG5ld0NtcFZlcnNpb24pIHsKLQkJQ21wVmVyc2lvblR5cGUgb2xkQ21wVmVyc2lvbiA9IGNtcFZlcnNpb247Ci0JCWNtcFZlcnNpb24gPSBuZXdDbXBWZXJzaW9uID09IG51bGwgPyBDTVBfVkVSU0lPTl9FREVGQVVMVCA6IG5ld0NtcFZlcnNpb247Ci0JCWJvb2xlYW4gb2xkQ21wVmVyc2lvbkVTZXQgPSBjbXBWZXJzaW9uRVNldDsKLQkJY21wVmVyc2lvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19DTVBfVkVSU0lPTiwgb2xkQ21wVmVyc2lvbiwgY21wVmVyc2lvbiwgIW9sZENtcFZlcnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDbXBWZXJzaW9uKCkgewotCQlDbXBWZXJzaW9uVHlwZSBvbGRDbXBWZXJzaW9uID0gY21wVmVyc2lvbjsKLQkJYm9vbGVhbiBvbGRDbXBWZXJzaW9uRVNldCA9IGNtcFZlcnNpb25FU2V0OwotCQljbXBWZXJzaW9uID0gQ01QX1ZFUlNJT05fRURFRkFVTFQ7Ci0JCWNtcFZlcnNpb25FU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQ01QX1ZFUlNJT04sIG9sZENtcFZlcnNpb24sIENNUF9WRVJTSU9OX0VERUZBVUxULCBvbGRDbXBWZXJzaW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q21wVmVyc2lvbigpIHsKLQkJcmV0dXJuIGNtcFZlcnNpb25FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgewotCQlyZXR1cm4gYWJzdHJhY3RTY2hlbWFOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFic3RyYWN0U2NoZW1hTmFtZShTdHJpbmcgbmV3QWJzdHJhY3RTY2hlbWFOYW1lKSB7Ci0JCVN0cmluZyBvbGRBYnN0cmFjdFNjaGVtYU5hbWUgPSBhYnN0cmFjdFNjaGVtYU5hbWU7Ci0JCWFic3RyYWN0U2NoZW1hTmFtZSA9IG5ld0Fic3RyYWN0U2NoZW1hTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQUJTVFJBQ1RfU0NIRU1BX05BTUUsIG9sZEFic3RyYWN0U2NoZW1hTmFtZSwgYWJzdHJhY3RTY2hlbWFOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q21wRmllbGRzKCkgewotCQlpZiAoY21wRmllbGRzID09IG51bGwpIHsKLQkJCWNtcEZpZWxkcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChDTVBGaWVsZC5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQ01QX0ZJRUxEUyk7Ci0JCX0KLQkJcmV0dXJuIGNtcEZpZWxkczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1rZXlGaWVsZCgpIHsKLQkJcmV0dXJuIHByaW1rZXlGaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmlta2V5RmllbGQoU3RyaW5nIG5ld1ByaW1rZXlGaWVsZCkgewotCQlTdHJpbmcgb2xkUHJpbWtleUZpZWxkID0gcHJpbWtleUZpZWxkOwotCQlwcmlta2V5RmllbGQgPSBuZXdQcmlta2V5RmllbGQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSSU1LRVlfRklFTEQsIG9sZFByaW1rZXlGaWVsZCwgcHJpbWtleUZpZWxkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RW52RW50cmllcygpIHsKLQkJaWYgKGVudkVudHJpZXMgPT0gbnVsbCkgewotCQkJZW52RW50cmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFbnZFbnRyeS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRU5WX0VOVFJJRVMpOwotCQl9Ci0JCXJldHVybiBlbnZFbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYlJlZnMoKSB7Ci0JCWlmIChlamJSZWZzID09IG51bGwpIHsKLQkJCWVqYlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYlJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RWpiTG9jYWxSZWZzKCkgewotCQlpZiAoZWpiTG9jYWxSZWZzID09IG51bGwpIHsKLQkJCWVqYkxvY2FsUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJMb2NhbFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX0xPQ0FMX1JFRlMpOwotCQl9Ci0JCXJldHVybiBlamJMb2NhbFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmljZVJlZnMoKSB7Ci0JCWlmIChzZXJ2aWNlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRVJWSUNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiBzZXJ2aWNlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXNvdXJjZVJlZnMoKSB7Ci0JCWlmIChyZXNvdXJjZVJlZnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRVNPVVJDRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlRW52UmVmcygpIHsKLQkJaWYgKHJlc291cmNlRW52UmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUVudlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VFbnZSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25SZWZzID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXRSZWZzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbmNlVW5pdFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCkgewotCQlpZiAocG9zdENvbnN0cnVjdHMgPT0gbnVsbCkgewotCQkJcG9zdENvbnN0cnVjdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByZURlc3Ryb3lzKCkgewotCQlpZiAocHJlRGVzdHJveXMgPT0gbnVsbCkgewotCQkJcHJlRGVzdHJveXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUyk7Ci0JCX0KLQkJcmV0dXJuIHByZURlc3Ryb3lzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlY3VyaXR5Um9sZVJlZnMoKSB7Ci0JCWlmIChzZWN1cml0eVJvbGVSZWZzID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMpOwotCQl9Ci0JCXJldHVybiBzZWN1cml0eVJvbGVSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN1cml0eUlkZW50aXR5VHlwZSBnZXRTZWN1cml0eUlkZW50aXR5KCkgewotCQlyZXR1cm4gc2VjdXJpdHlJZGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZWN1cml0eUlkZW50aXR5KFNlY3VyaXR5SWRlbnRpdHlUeXBlIG5ld1NlY3VyaXR5SWRlbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VjdXJpdHlJZGVudGl0eVR5cGUgb2xkU2VjdXJpdHlJZGVudGl0eSA9IHNlY3VyaXR5SWRlbnRpdHk7Ci0JCXNlY3VyaXR5SWRlbnRpdHkgPSBuZXdTZWN1cml0eUlkZW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWSwgb2xkU2VjdXJpdHlJZGVudGl0eSwgbmV3U2VjdXJpdHlJZGVudGl0eSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5VHlwZSBuZXdTZWN1cml0eUlkZW50aXR5KSB7Ci0JCWlmIChuZXdTZWN1cml0eUlkZW50aXR5ICE9IHNlY3VyaXR5SWRlbnRpdHkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlY3VyaXR5SWRlbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2VjdXJpdHlJZGVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZWN1cml0eUlkZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlY3VyaXR5SWRlbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZWN1cml0eUlkZW50aXR5KG5ld1NlY3VyaXR5SWRlbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFksIG5ld1NlY3VyaXR5SWRlbnRpdHksIG5ld1NlY3VyaXR5SWRlbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRRdWVyaWVzKCkgewotCQlpZiAocXVlcmllcyA9PSBudWxsKSB7Ci0JCQlxdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFF1ZXJ5LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gcXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9GSUVMRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDbXBGaWVsZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVudkVudHJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZpY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9zdENvbnN0cnVjdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcmVEZXN0cm95cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5Um9sZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZWN1cml0eUlkZW50aXR5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RWpiTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19IT01FOgotCQkJCXJldHVybiBnZXRIb21lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFTU9URToKLQkJCQlyZXR1cm4gZ2V0UmVtb3RlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0xPQ0FMX0hPTUU6Ci0JCQkJcmV0dXJuIGdldExvY2FsSG9tZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19MT0NBTDoKLQkJCQlyZXR1cm4gZ2V0TG9jYWwoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX0NMQVNTOgotCQkJCXJldHVybiBnZXRFamJDbGFzcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9UWVBFOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJJTV9LRVlfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldFByaW1LZXlDbGFzcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRUVOVFJBTlQ6Ci0JCQkJcmV0dXJuIGlzUmVlbnRyYW50KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19DTVBfVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0Q21wVmVyc2lvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19BQlNUUkFDVF9TQ0hFTUFfTkFNRToKLQkJCQlyZXR1cm4gZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9GSUVMRFM6Ci0JCQkJcmV0dXJuIGdldENtcEZpZWxkcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUklNS0VZX0ZJRUxEOgotCQkJCXJldHVybiBnZXRQcmlta2V5RmllbGQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuIGdldEVudkVudHJpZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gZ2V0UG9zdENvbnN0cnVjdHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiBnZXRQcmVEZXN0cm95cygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0UXVlcmllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX05BTUU6Ci0JCQkJc2V0RWpiTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19IT01FOgotCQkJCXNldEhvbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRU1PVEU6Ci0JCQkJc2V0UmVtb3RlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTE9DQUxfSE9NRToKLQkJCQlzZXRMb2NhbEhvbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19MT0NBTDoKLQkJCQlzZXRMb2NhbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlzZXRFamJDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1RZUEU6Ci0JCQkJc2V0UGVyc2lzdGVuY2VUeXBlKChQZXJzaXN0ZW5jZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJJTV9LRVlfQ0xBU1M6Ci0JCQkJc2V0UHJpbUtleUNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVFTlRSQU5UOgotCQkJCXNldFJlZW50cmFudCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9WRVJTSU9OOgotCQkJCXNldENtcFZlcnNpb24oKENtcFZlcnNpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0FCU1RSQUNUX1NDSEVNQV9OQU1FOgotCQkJCXNldEFic3RyYWN0U2NoZW1hTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9GSUVMRFM6Ci0JCQkJZ2V0Q21wRmllbGRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDbXBGaWVsZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJJTUtFWV9GSUVMRDoKLQkJCQlzZXRQcmlta2V5RmllbGQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FTlZfRU5UUklFUzoKLQkJCQlnZXRFbnZFbnRyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZFbnRyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJFX0RFU1RST1lTOgotCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmVEZXN0cm95cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlzZXRTZWN1cml0eUlkZW50aXR5KChTZWN1cml0eUlkZW50aXR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19RVUVSSUVTOgotCQkJCWdldFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldFF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfTkFNRToKLQkJCQlzZXRFamJOYW1lKEVKQl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoTUFQUEVEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSE9NRToKLQkJCQlzZXRIb21lKEhPTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVNT1RFOgotCQkJCXNldFJlbW90ZShSRU1PVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTE9DQUxfSE9NRToKLQkJCQlzZXRMb2NhbEhvbWUoTE9DQUxfSE9NRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19MT0NBTDoKLQkJCQlzZXRMb2NhbChMT0NBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJc2V0RWpiQ2xhc3MoRUpCX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1RZUEU6Ci0JCQkJdW5zZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSSU1fS0VZX0NMQVNTOgotCQkJCXNldFByaW1LZXlDbGFzcyhQUklNX0tFWV9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRUVOVFJBTlQ6Ci0JCQkJdW5zZXRSZWVudHJhbnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9WRVJTSU9OOgotCQkJCXVuc2V0Q21wVmVyc2lvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQUJTVFJBQ1RfU0NIRU1BX05BTUU6Ci0JCQkJc2V0QWJzdHJhY3RTY2hlbWFOYW1lKEFCU1RSQUNUX1NDSEVNQV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9GSUVMRFM6Ci0JCQkJZ2V0Q21wRmllbGRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSSU1LRVlfRklFTEQ6Ci0JCQkJc2V0UHJpbWtleUZpZWxkKFBSSU1LRVlfRklFTERfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRU5WX0VOVFJJRVM6Ci0JCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfUkVGUzoKLQkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUkVfREVTVFJPWVM6Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJc2V0U2VjdXJpdHlJZGVudGl0eSgoU2VjdXJpdHlJZGVudGl0eVR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19RVUVSSUVTOgotCQkJCWdldFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX05BTUU6Ci0JCQkJcmV0dXJuIEVKQl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlamJOYW1lICE9IG51bGwgOiAhRUpCX05BTUVfRURFRkFVTFQuZXF1YWxzKGVqYk5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gTUFQUEVEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZE5hbWUgIT0gbnVsbCA6ICFNQVBQRURfTkFNRV9FREVGQVVMVC5lcXVhbHMobWFwcGVkTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0hPTUU6Ci0JCQkJcmV0dXJuIEhPTUVfRURFRkFVTFQgPT0gbnVsbCA/IGhvbWUgIT0gbnVsbCA6ICFIT01FX0VERUZBVUxULmVxdWFscyhob21lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVNT1RFOgotCQkJCXJldHVybiBSRU1PVEVfRURFRkFVTFQgPT0gbnVsbCA/IHJlbW90ZSAhPSBudWxsIDogIVJFTU9URV9FREVGQVVMVC5lcXVhbHMocmVtb3RlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTE9DQUxfSE9NRToKLQkJCQlyZXR1cm4gTE9DQUxfSE9NRV9FREVGQVVMVCA9PSBudWxsID8gbG9jYWxIb21lICE9IG51bGwgOiAhTE9DQUxfSE9NRV9FREVGQVVMVC5lcXVhbHMobG9jYWxIb21lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTE9DQUw6Ci0JCQkJcmV0dXJuIExPQ0FMX0VERUZBVUxUID09IG51bGwgPyBsb2NhbCAhPSBudWxsIDogIUxPQ0FMX0VERUZBVUxULmVxdWFscyhsb2NhbCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlyZXR1cm4gRUpCX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBlamJDbGFzcyAhPSBudWxsIDogIUVKQl9DTEFTU19FREVGQVVMVC5lcXVhbHMoZWpiQ2xhc3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9UWVBFOgotCQkJCXJldHVybiBpc1NldFBlcnNpc3RlbmNlVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUklNX0tFWV9DTEFTUzoKLQkJCQlyZXR1cm4gUFJJTV9LRVlfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IHByaW1LZXlDbGFzcyAhPSBudWxsIDogIVBSSU1fS0VZX0NMQVNTX0VERUZBVUxULmVxdWFscyhwcmltS2V5Q2xhc3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRUVOVFJBTlQ6Ci0JCQkJcmV0dXJuIGlzU2V0UmVlbnRyYW50KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9WRVJTSU9OOgotCQkJCXJldHVybiBpc1NldENtcFZlcnNpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQUJTVFJBQ1RfU0NIRU1BX05BTUU6Ci0JCQkJcmV0dXJuIEFCU1RSQUNUX1NDSEVNQV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBhYnN0cmFjdFNjaGVtYU5hbWUgIT0gbnVsbCA6ICFBQlNUUkFDVF9TQ0hFTUFfTkFNRV9FREVGQVVMVC5lcXVhbHMoYWJzdHJhY3RTY2hlbWFOYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fQ01QX0ZJRUxEUzoKLQkJCQlyZXR1cm4gY21wRmllbGRzICE9IG51bGwgJiYgIWNtcEZpZWxkcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSSU1LRVlfRklFTEQ6Ci0JCQkJcmV0dXJuIFBSSU1LRVlfRklFTERfRURFRkFVTFQgPT0gbnVsbCA/IHByaW1rZXlGaWVsZCAhPSBudWxsIDogIVBSSU1LRVlfRklFTERfRURFRkFVTFQuZXF1YWxzKHByaW1rZXlGaWVsZCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiBlbnZFbnRyaWVzICE9IG51bGwgJiYgIWVudkVudHJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZWpiUmVmcyAhPSBudWxsICYmICFlamJSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYkxvY2FsUmVmcyAhPSBudWxsICYmICFlamJMb2NhbFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlcnZpY2VSZWZzICE9IG51bGwgJiYgIXNlcnZpY2VSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VSZWZzICE9IG51bGwgJiYgIXJlc291cmNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZUVudlJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VFbnZSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZzICE9IG51bGwgJiYgIW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgIT0gbnVsbCAmJiAhcGVyc2lzdGVuY2VDb250ZXh0UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UmVmcyAhPSBudWxsICYmICFwZXJzaXN0ZW5jZVVuaXRSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiBwb3N0Q29uc3RydWN0cyAhPSBudWxsICYmICFwb3N0Q29uc3RydWN0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gcHJlRGVzdHJveXMgIT0gbnVsbCAmJiAhcHJlRGVzdHJveXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXJldHVybiBzZWN1cml0eUlkZW50aXR5ICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIHF1ZXJpZXMgIT0gbnVsbCAmJiAhcXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZWpiTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlamJOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhvbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaG9tZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtb3RlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlbW90ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9jYWxIb21lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxvY2FsSG9tZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9jYWw6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobG9jYWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVqYkNsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYkNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJzaXN0ZW5jZVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwZXJzaXN0ZW5jZVR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHBlcnNpc3RlbmNlVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgcHJpbUtleUNsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByaW1LZXlDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVlbnRyYW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVlbnRyYW50RVNldCkgcmVzdWx0LmFwcGVuZChyZWVudHJhbnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGNtcFZlcnNpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjbXBWZXJzaW9uRVNldCkgcmVzdWx0LmFwcGVuZChjbXBWZXJzaW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBhYnN0cmFjdFNjaGVtYU5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWJzdHJhY3RTY2hlbWFOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmlta2V5RmllbGQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJpbWtleUZpZWxkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0VudGl0eUJlYW5JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FeGNsdWRlTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRXhjbHVkZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZGJhMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FeGNsdWRlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4Y2x1ZGUgTGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FeGNsdWRlTGlzdEltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRXhjbHVkZUxpc3RJbXBsI2dldE1ldGhvZHMgPGVtPk1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRXhjbHVkZUxpc3RJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4Y2x1ZGVMaXN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXhjbHVkZUxpc3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZHMoKSA8ZW0+TWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeGNsdWRlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVYQ0xVREVfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZHMoKSB7Ci0JCWlmIChtZXRob2RzID09IG51bGwpIHsKLQkJCW1ldGhvZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRFMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRFM6Ci0JCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRFM6Ci0JCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRFM6Ci0JCQkJcmV0dXJuIG1ldGhvZHMgIT0gbnVsbCAmJiAhbWV0aG9kcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXhjbHVkZUxpc3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Jbml0TWV0aG9kVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW5pdE1ldGhvZFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OTBiMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Jbml0TWV0aG9kVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5pdCBNZXRob2QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Jbml0TWV0aG9kVHlwZUltcGwjZ2V0Q3JlYXRlTWV0aG9kIDxlbT5DcmVhdGUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkluaXRNZXRob2RUeXBlSW1wbCNnZXRCZWFuTWV0aG9kIDxlbT5CZWFuIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Jbml0TWV0aG9kVHlwZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdE1ldGhvZFR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbml0TWV0aG9kVHlwZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRlTWV0aG9kKCkgPGVtPkNyZWF0ZSBNZXRob2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVkTWV0aG9kVHlwZSBjcmVhdGVNZXRob2QgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmVhbk1ldGhvZCgpIDxlbT5CZWFuIE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmVhbk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVkTWV0aG9kVHlwZSBiZWFuTWV0aG9kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEluaXRNZXRob2RUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuSU5JVF9NRVRIT0RfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZWRNZXRob2RUeXBlIGdldENyZWF0ZU1ldGhvZCgpIHsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDcmVhdGVNZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld0NyZWF0ZU1ldGhvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlOYW1lZE1ldGhvZFR5cGUgb2xkQ3JlYXRlTWV0aG9kID0gY3JlYXRlTWV0aG9kOwotCQljcmVhdGVNZXRob2QgPSBuZXdDcmVhdGVNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fQ1JFQVRFX01FVEhPRCwgb2xkQ3JlYXRlTWV0aG9kLCBuZXdDcmVhdGVNZXRob2QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0ZU1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3Q3JlYXRlTWV0aG9kKSB7Ci0JCWlmIChuZXdDcmVhdGVNZXRob2QgIT0gY3JlYXRlTWV0aG9kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjcmVhdGVNZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY3JlYXRlTWV0aG9kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDcmVhdGVNZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q3JlYXRlTWV0aG9kKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENyZWF0ZU1ldGhvZChuZXdDcmVhdGVNZXRob2QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9ELCBuZXdDcmVhdGVNZXRob2QsIG5ld0NyZWF0ZU1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZE1ldGhvZFR5cGUgZ2V0QmVhbk1ldGhvZCgpIHsKLQkJcmV0dXJuIGJlYW5NZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QmVhbk1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3QmVhbk1ldGhvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlOYW1lZE1ldGhvZFR5cGUgb2xkQmVhbk1ldGhvZCA9IGJlYW5NZXRob2Q7Ci0JCWJlYW5NZXRob2QgPSBuZXdCZWFuTWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0JFQU5fTUVUSE9ELCBvbGRCZWFuTWV0aG9kLCBuZXdCZWFuTWV0aG9kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCZWFuTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSBuZXdCZWFuTWV0aG9kKSB7Ci0JCWlmIChuZXdCZWFuTWV0aG9kICE9IGJlYW5NZXRob2QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGJlYW5NZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYmVhbk1ldGhvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0JlYW5NZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QmVhbk1ldGhvZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QmVhbk1ldGhvZChuZXdCZWFuTWV0aG9kLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QsIG5ld0JlYW5NZXRob2QsIG5ld0JlYW5NZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fQ1JFQVRFX01FVEhPRDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDcmVhdGVNZXRob2QobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QmVhbk1ldGhvZChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0NSRUFURV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldENyZWF0ZU1ldGhvZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0JFQU5fTUVUSE9EOgotCQkJCXJldHVybiBnZXRCZWFuTWV0aG9kKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9EOgotCQkJCXNldENyZWF0ZU1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0Q6Ci0JCQkJc2V0QmVhbk1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9EOgotCQkJCXNldENyZWF0ZU1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRDoKLQkJCQlzZXRCZWFuTWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9EOgotCQkJCXJldHVybiBjcmVhdGVNZXRob2QgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRDoKLQkJCQlyZXR1cm4gYmVhbk1ldGhvZCAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Jbml0TWV0aG9kVHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjAwZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVyY2VwdG9yIEJpbmRpbmcgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCNnZXRJbnRlcmNlcHRvckNsYXNzZXMgPGVtPkludGVyY2VwdG9yIENsYXNzZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZUltcGwjZ2V0SW50ZXJjZXB0b3JPcmRlciA8ZW0+SW50ZXJjZXB0b3IgT3JkZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZUltcGwjaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCNpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyA8ZW0+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZUltcGwjZ2V0TWV0aG9kIDxlbT5NZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEludGVyY2VwdG9yQmluZGluZ1R5cGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYk5hbWUgPSBFSkJfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyY2VwdG9yQ2xhc3NlcygpIDxlbT5JbnRlcmNlcHRvciBDbGFzc2VzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQ2xhc3NlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGludGVyY2VwdG9yQ2xhc3NlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmNlcHRvck9yZGVyKCkgPGVtPkludGVyY2VwdG9yIE9yZGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvck9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZXJjZXB0b3JPcmRlclR5cGUgaW50ZXJjZXB0b3JPcmRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpIDxlbT5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhDTFVERV9ERUZBVUxUX0lOVEVSQ0VQVE9SU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpIDxlbT5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyA9IEVYQ0xVREVfREVGQVVMVF9JTlRFUkNFUFRPUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEV4Y2x1ZGUgRGVmYXVsdCBJbnRlcmNlcHRvcnMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkgPGVtPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYQ0xVREVfQ0xBU1NfSU5URVJDRVBUT1JTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpIDxlbT5FeGNsdWRlIENsYXNzIEludGVyY2VwdG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyA9IEVYQ0xVREVfQ0xBU1NfSU5URVJDRVBUT1JTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFeGNsdWRlIENsYXNzIEludGVyY2VwdG9ycyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kKCkgPGVtPk1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIG1ldGhvZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuSU5URVJDRVBUT1JfQklORElOR19UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJOYW1lKCkgewotCQlyZXR1cm4gZWpiTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJOYW1lKFN0cmluZyBuZXdFamJOYW1lKSB7Ci0JCVN0cmluZyBvbGRFamJOYW1lID0gZWpiTmFtZTsKLQkJZWpiTmFtZSA9IG5ld0VqYk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FSkJfTkFNRSwgb2xkRWpiTmFtZSwgZWpiTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEludGVyY2VwdG9yQ2xhc3NlcygpIHsKLQkJaWYgKGludGVyY2VwdG9yQ2xhc3NlcyA9PSBudWxsKSB7Ci0JCQlpbnRlcmNlcHRvckNsYXNzZXMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUyk7Ci0JCX0KLQkJcmV0dXJuIGludGVyY2VwdG9yQ2xhc3NlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZXJjZXB0b3JPcmRlclR5cGUgZ2V0SW50ZXJjZXB0b3JPcmRlcigpIHsKLQkJcmV0dXJuIGludGVyY2VwdG9yT3JkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW50ZXJjZXB0b3JPcmRlcihJbnRlcmNlcHRvck9yZGVyVHlwZSBuZXdJbnRlcmNlcHRvck9yZGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUludGVyY2VwdG9yT3JkZXJUeXBlIG9sZEludGVyY2VwdG9yT3JkZXIgPSBpbnRlcmNlcHRvck9yZGVyOwotCQlpbnRlcmNlcHRvck9yZGVyID0gbmV3SW50ZXJjZXB0b3JPcmRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX09SREVSLCBvbGRJbnRlcmNlcHRvck9yZGVyLCBuZXdJbnRlcmNlcHRvck9yZGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcmNlcHRvck9yZGVyKEludGVyY2VwdG9yT3JkZXJUeXBlIG5ld0ludGVyY2VwdG9yT3JkZXIpIHsKLQkJaWYgKG5ld0ludGVyY2VwdG9yT3JkZXIgIT0gaW50ZXJjZXB0b3JPcmRlcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW50ZXJjZXB0b3JPcmRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnRlcmNlcHRvck9yZGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX09SREVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbnRlcmNlcHRvck9yZGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0ludGVyY2VwdG9yT3JkZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfT1JERVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW50ZXJjZXB0b3JPcmRlcihuZXdJbnRlcmNlcHRvck9yZGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9PUkRFUiwgbmV3SW50ZXJjZXB0b3JPcmRlciwgbmV3SW50ZXJjZXB0b3JPcmRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKSB7Ci0JCXJldHVybiBleGNsdWRlRGVmYXVsdEludGVyY2VwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyhib29sZWFuIG5ld0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKSB7Ci0JCWJvb2xlYW4gb2xkRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMgPSBleGNsdWRlRGVmYXVsdEludGVyY2VwdG9yczsKLQkJZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMgPSBuZXdFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9yczsKLQkJYm9vbGVhbiBvbGRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9yc0VTZXQgPSBleGNsdWRlRGVmYXVsdEludGVyY2VwdG9yc0VTZXQ7Ci0JCWV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0RFRkFVTFRfSU5URVJDRVBUT1JTLCBvbGRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycywgZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMsICFvbGRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9yc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkgewotCQlib29sZWFuIG9sZEV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzID0gZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnM7Ci0JCWJvb2xlYW4gb2xkRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnNFU2V0ID0gZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnNFU2V0OwotCQlleGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyA9IEVYQ0xVREVfREVGQVVMVF9JTlRFUkNFUFRPUlNfRURFRkFVTFQ7Ci0JCWV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0RFRkFVTFRfSU5URVJDRVBUT1JTLCBvbGRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycywgRVhDTFVERV9ERUZBVUxUX0lOVEVSQ0VQVE9SU19FREVGQVVMVCwgb2xkRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpIHsKLQkJcmV0dXJuIGV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpIHsKLQkJcmV0dXJuIGV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoYm9vbGVhbiBuZXdFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMpIHsKLQkJYm9vbGVhbiBvbGRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMgPSBleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnM7Ci0JCWV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyA9IG5ld0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9yczsKLQkJYm9vbGVhbiBvbGRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnNFU2V0ID0gZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzRVNldDsKLQkJZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0NMQVNTX0lOVEVSQ0VQVE9SUywgb2xkRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzLCBleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMsICFvbGRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKSB7Ci0JCWJvb2xlYW4gb2xkRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzID0gZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzOwotCQlib29sZWFuIG9sZEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9yc0VTZXQgPSBleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnNFU2V0OwotCQlleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMgPSBFWENMVURFX0NMQVNTX0lOVEVSQ0VQVE9SU19FREVGQVVMVDsKLQkJZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0NMQVNTX0lOVEVSQ0VQVE9SUywgb2xkRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzLCBFWENMVURFX0NMQVNTX0lOVEVSQ0VQVE9SU19FREVGQVVMVCwgb2xkRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkgewotCQlyZXR1cm4gZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZWRNZXRob2RUeXBlIGdldE1ldGhvZCgpIHsKLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld01ldGhvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlOYW1lZE1ldGhvZFR5cGUgb2xkTWV0aG9kID0gbWV0aG9kOwotCQltZXRob2QgPSBuZXdNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19NRVRIT0QsIG9sZE1ldGhvZCwgbmV3TWV0aG9kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld01ldGhvZCkgewotCQlpZiAobmV3TWV0aG9kICE9IG1ldGhvZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWV0aG9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1ldGhvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNZXRob2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fTUVUSE9ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1ldGhvZChuZXdNZXRob2QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX01FVEhPRCwgbmV3TWV0aG9kLCBuZXdNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9PUkRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbnRlcmNlcHRvck9yZGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fTUVUSE9EOgotCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VKQl9OQU1FOgotCQkJCXJldHVybiBnZXRFamJOYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTOgotCQkJCXJldHVybiBnZXRJbnRlcmNlcHRvckNsYXNzZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX09SREVSOgotCQkJCXJldHVybiBnZXRJbnRlcmNlcHRvck9yZGVyKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0RFRkFVTFRfSU5URVJDRVBUT1JTOgotCQkJCXJldHVybiBpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRVhDTFVERV9DTEFTU19JTlRFUkNFUFRPUlM6Ci0JCQkJcmV0dXJuIGlzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fTUVUSE9EOgotCQkJCXJldHVybiBnZXRNZXRob2QoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VKQl9OQU1FOgotCQkJCXNldEVqYk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUzoKLQkJCQlnZXRJbnRlcmNlcHRvckNsYXNzZXMoKS5jbGVhcigpOwotCQkJCWdldEludGVyY2VwdG9yQ2xhc3NlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfT1JERVI6Ci0JCQkJc2V0SW50ZXJjZXB0b3JPcmRlcigoSW50ZXJjZXB0b3JPcmRlclR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfREVGQVVMVF9JTlRFUkNFUFRPUlM6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRVhDTFVERV9DTEFTU19JTlRFUkNFUFRPUlM6Ci0JCQkJc2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX01FVEhPRDoKLQkJCQlzZXRNZXRob2QoKE5hbWVkTWV0aG9kVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VKQl9OQU1FOgotCQkJCXNldEVqYk5hbWUoRUpCX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTRVM6Ci0JCQkJZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9PUkRFUjoKLQkJCQlzZXRJbnRlcmNlcHRvck9yZGVyKChJbnRlcmNlcHRvck9yZGVyVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0RFRkFVTFRfSU5URVJDRVBUT1JTOgotCQkJCXVuc2V0RXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0NMQVNTX0lOVEVSQ0VQVE9SUzoKLQkJCQl1bnNldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX01FVEhPRDoKLQkJCQlzZXRNZXRob2QoKE5hbWVkTWV0aG9kVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRUpCX05BTUU6Ci0JCQkJcmV0dXJuIEVKQl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlamJOYW1lICE9IG51bGwgOiAhRUpCX05BTUVfRURFRkFVTFQuZXF1YWxzKGVqYk5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gaW50ZXJjZXB0b3JDbGFzc2VzICE9IG51bGwgJiYgIWludGVyY2VwdG9yQ2xhc3Nlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9PUkRFUjoKLQkJCQlyZXR1cm4gaW50ZXJjZXB0b3JPcmRlciAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRVhDTFVERV9ERUZBVUxUX0lOVEVSQ0VQVE9SUzoKLQkJCQlyZXR1cm4gaXNTZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRVhDTFVERV9DTEFTU19JTlRFUkNFUFRPUlM6Ci0JCQkJcmV0dXJuIGlzU2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19NRVRIT0Q6Ci0JCQkJcmV0dXJuIG1ldGhvZCAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGludGVyY2VwdG9yQ2xhc3NlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbnRlcmNlcHRvckNsYXNzZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnNFU2V0KSByZXN1bHQuYXBwZW5kKGV4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnNFU2V0KSByZXN1bHQuYXBwZW5kKGV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yT3JkZXJUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQwOWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvck9yZGVyVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlcmNlcHRvciBPcmRlciBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yT3JkZXJUeXBlSW1wbCNnZXRJbnRlcmNlcHRvckNsYXNzZXMgPGVtPkludGVyY2VwdG9yIENsYXNzZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEludGVyY2VwdG9yT3JkZXJUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSW50ZXJjZXB0b3JPcmRlclR5cGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyY2VwdG9yQ2xhc3NlcygpIDxlbT5JbnRlcmNlcHRvciBDbGFzc2VzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQ2xhc3NlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGludGVyY2VwdG9yQ2xhc3NlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlcmNlcHRvck9yZGVyVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLklOVEVSQ0VQVE9SX09SREVSX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkgewotCQlpZiAoaW50ZXJjZXB0b3JDbGFzc2VzID09IG51bGwpIHsKLQkJCWludGVyY2VwdG9yQ2xhc3NlcyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUyk7Ci0JCX0KLQkJcmV0dXJuIGludGVyY2VwdG9yQ2xhc3NlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX09SREVSX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTOgotCQkJCWdldEludGVyY2VwdG9yQ2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTOgotCQkJCWdldEludGVyY2VwdG9yQ2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX09SREVSX1RZUEVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTOgotCQkJCXJldHVybiBpbnRlcmNlcHRvckNsYXNzZXMgIT0gbnVsbCAmJiAhaW50ZXJjZXB0b3JDbGFzc2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGludGVyY2VwdG9yQ2xhc3NlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbnRlcmNlcHRvckNsYXNzZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvclR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxZjRlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW50ZXJjZXB0b3IgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0SW50ZXJjZXB0b3JDbGFzcyA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRBcm91bmRJbnZva2VzIDxlbT5Bcm91bmQgSW52b2tlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldFBvc3RBY3RpdmF0ZXMgPGVtPlBvc3QgQWN0aXZhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0UHJlUGFzc2l2YXRlcyA8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcmNlcHRvclR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbnRlcmNlcHRvclR5cGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmNlcHRvckNsYXNzKCkgPGVtPkludGVyY2VwdG9yIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUkNFUFRPUl9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmNlcHRvckNsYXNzKCkgPGVtPkludGVyY2VwdG9yIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGludGVyY2VwdG9yQ2xhc3MgPSBJTlRFUkNFUFRPUl9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFyb3VuZEludm9rZXMoKSA8ZW0+QXJvdW5kIEludm9rZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXJvdW5kSW52b2tlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFyb3VuZEludm9rZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cmllcygpIDxlbT5FbnYgRW50cmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnZFbnRyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW52RW50cmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZzKCkgPGVtPkVqYiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkxvY2FsUmVmcygpIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJMb2NhbFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJMb2NhbFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZnMoKSA8ZW0+U2VydmljZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VydmljZVJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VSZWZzKCkgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRW52UmVmcygpIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZUVudlJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlVW5pdFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdENvbnN0cnVjdHMoKSA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3RDb25zdHJ1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9zdENvbnN0cnVjdHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlRGVzdHJveXMoKSA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZURlc3Ryb3lzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJlRGVzdHJveXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdEFjdGl2YXRlcygpIDxlbT5Qb3N0IEFjdGl2YXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0QWN0aXZhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9zdEFjdGl2YXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVQYXNzaXZhdGVzKCkgPGVtPlByZSBQYXNzaXZhdGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVBhc3NpdmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcmVQYXNzaXZhdGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEludGVyY2VwdG9yVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLklOVEVSQ0VQVE9SX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnRlcmNlcHRvckNsYXNzKCkgewotCQlyZXR1cm4gaW50ZXJjZXB0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcmNlcHRvckNsYXNzKFN0cmluZyBuZXdJbnRlcmNlcHRvckNsYXNzKSB7Ci0JCVN0cmluZyBvbGRJbnRlcmNlcHRvckNsYXNzID0gaW50ZXJjZXB0b3JDbGFzczsKLQkJaW50ZXJjZXB0b3JDbGFzcyA9IG5ld0ludGVyY2VwdG9yQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1MsIG9sZEludGVyY2VwdG9yQ2xhc3MsIGludGVyY2VwdG9yQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBcm91bmRJbnZva2VzKCkgewotCQlpZiAoYXJvdW5kSW52b2tlcyA9PSBudWxsKSB7Ci0JCQlhcm91bmRJbnZva2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEFyb3VuZEludm9rZVR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX0lOVk9LRVMpOwotCQl9Ci0JCXJldHVybiBhcm91bmRJbnZva2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVudkVudHJpZXMoKSB7Ci0JCWlmIChlbnZFbnRyaWVzID09IG51bGwpIHsKLQkJCWVudkVudHJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRW52RW50cnkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRU5WX0VOVFJJRVMpOwotCQl9Ci0JCXJldHVybiBlbnZFbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYlJlZnMoKSB7Ci0JCWlmIChlamJSZWZzID09IG51bGwpIHsKLQkJCWVqYlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VKQl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gZWpiUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJMb2NhbFJlZnMoKSB7Ci0JCWlmIChlamJMb2NhbFJlZnMgPT0gbnVsbCkgewotCQkJZWpiTG9jYWxSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVqYkxvY2FsUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VKQl9MT0NBTF9SRUZTKTsKLQkJfQotCQlyZXR1cm4gZWpiTG9jYWxSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZpY2VSZWZzKCkgewotCQlpZiAoc2VydmljZVJlZnMgPT0gbnVsbCkgewotCQkJc2VydmljZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19TRVJWSUNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiBzZXJ2aWNlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXNvdXJjZVJlZnMoKSB7Ci0JCWlmIChyZXNvdXJjZVJlZnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9FTlZfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRW52UmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIHsKLQkJaWYgKHBlcnNpc3RlbmNlVW5pdFJlZnMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2VVbml0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpIHsKLQkJaWYgKHBvc3RDb25zdHJ1Y3RzID09IG51bGwpIHsKLQkJCXBvc3RDb25zdHJ1Y3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQ09OU1RSVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByZURlc3Ryb3lzKCkgewotCQlpZiAocHJlRGVzdHJveXMgPT0gbnVsbCkgewotCQkJcHJlRGVzdHJveXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX0RFU1RST1lTKTsKLQkJfQotCQlyZXR1cm4gcHJlRGVzdHJveXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UG9zdEFjdGl2YXRlcygpIHsKLQkJaWYgKHBvc3RBY3RpdmF0ZXMgPT0gbnVsbCkgewotCQkJcG9zdEFjdGl2YXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QT1NUX0FDVElWQVRFUyk7Ci0JCX0KLQkJcmV0dXJuIHBvc3RBY3RpdmF0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJlUGFzc2l2YXRlcygpIHsKLQkJaWYgKHByZVBhc3NpdmF0ZXMgPT0gbnVsbCkgewotCQkJcHJlUGFzc2l2YXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QUkVfUEFTU0lWQVRFUyk7Ci0JCX0KLQkJcmV0dXJuIHByZVBhc3NpdmF0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBcm91bmRJbnZva2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVudkVudHJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VKQl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJMb2NhbFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZpY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9zdENvbnN0cnVjdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QT1NUX0FDVElWQVRFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvc3RBY3RpdmF0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UHJlUGFzc2l2YXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTOgotCQkJCXJldHVybiBnZXRJbnRlcmNlcHRvckNsYXNzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJcmV0dXJuIGdldEFyb3VuZEludm9rZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gZ2V0RW52RW50cmllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VKQl9SRUZTOgotCQkJCXJldHVybiBnZXRFamJSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiBnZXRQb3N0Q29uc3RydWN0cygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gZ2V0UHJlRGVzdHJveXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QT1NUX0FDVElWQVRFUzoKLQkJCQlyZXR1cm4gZ2V0UG9zdEFjdGl2YXRlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTOgotCQkJCXJldHVybiBnZXRQcmVQYXNzaXZhdGVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTUzoKLQkJCQlzZXRJbnRlcmNlcHRvckNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlnZXRBcm91bmRJbnZva2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRBcm91bmRJbnZva2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRU5WX0VOVFJJRVM6Ci0JCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW52RW50cmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYkxvY2FsUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5jbGVhcigpOwotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX0RFU1RST1lTOgotCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmVEZXN0cm95cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQUNUSVZBVEVTOgotCQkJCWdldFBvc3RBY3RpdmF0ZXMoKS5jbGVhcigpOwotCQkJCWdldFBvc3RBY3RpdmF0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QUkVfUEFTU0lWQVRFUzoKLQkJCQlnZXRQcmVQYXNzaXZhdGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmVQYXNzaXZhdGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1M6Ci0JCQkJc2V0SW50ZXJjZXB0b3JDbGFzcyhJTlRFUkNFUFRPUl9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0FST1VORF9JTlZPS0VTOgotCQkJCWdldEFyb3VuZEludm9rZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FTlZfRU5UUklFUzoKLQkJCQlnZXRFbnZFbnRyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX0RFU1RST1lTOgotCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9BQ1RJVkFURVM6Ci0JCQkJZ2V0UG9zdEFjdGl2YXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTOgotCQkJCWdldFByZVBhc3NpdmF0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTUzoKLQkJCQlyZXR1cm4gSU5URVJDRVBUT1JfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGludGVyY2VwdG9yQ2xhc3MgIT0gbnVsbCA6ICFJTlRFUkNFUFRPUl9DTEFTU19FREVGQVVMVC5lcXVhbHMoaW50ZXJjZXB0b3JDbGFzcyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJcmV0dXJuIGFyb3VuZEludm9rZXMgIT0gbnVsbCAmJiAhYXJvdW5kSW52b2tlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuIGVudkVudHJpZXMgIT0gbnVsbCAmJiAhZW52RW50cmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYlJlZnMgIT0gbnVsbCAmJiAhZWpiUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYkxvY2FsUmVmcyAhPSBudWxsICYmICFlamJMb2NhbFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gc2VydmljZVJlZnMgIT0gbnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlUmVmcyAhPSBudWxsICYmICFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZUVudlJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VFbnZSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9uUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCXJldHVybiBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzICE9IG51bGwgJiYgIXBlcnNpc3RlbmNlQ29udGV4dFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UmVmcyAhPSBudWxsICYmICFwZXJzaXN0ZW5jZVVuaXRSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzICE9IG51bGwgJiYgIXBvc3RDb25zdHJ1Y3RzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuIHByZURlc3Ryb3lzICE9IG51bGwgJiYgIXByZURlc3Ryb3lzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QT1NUX0FDVElWQVRFUzoKLQkJCQlyZXR1cm4gcG9zdEFjdGl2YXRlcyAhPSBudWxsICYmICFwb3N0QWN0aXZhdGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QUkVfUEFTU0lWQVRFUzoKLQkJCQlyZXR1cm4gcHJlUGFzc2l2YXRlcyAhPSBudWxsICYmICFwcmVQYXNzaXZhdGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGludGVyY2VwdG9yQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaW50ZXJjZXB0b3JDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9JbnRlcmNlcHRvclR5cGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvcnNUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvcnNUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Y1MTk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JzVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlcmNlcHRvcnMgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvcnNUeXBlSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvcnNUeXBlSW1wbCNnZXRJbnRlcmNlcHRvcnMgPGVtPkludGVyY2VwdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvcnNUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcmNlcHRvcnNUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSW50ZXJjZXB0b3JzVHlwZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJjZXB0b3JzKCkgPGVtPkludGVyY2VwdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbnRlcmNlcHRvcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZXJjZXB0b3JzVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLklOVEVSQ0VQVE9SU19UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcmNlcHRvcnMoKSB7Ci0JCWlmIChpbnRlcmNlcHRvcnMgPT0gbnVsbCkgewotCQkJaW50ZXJjZXB0b3JzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEludGVyY2VwdG9yVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fSU5URVJDRVBUT1JTKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJjZXB0b3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0lOVEVSQ0VQVE9SUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEludGVyY2VwdG9ycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fSU5URVJDRVBUT1JTOgotCQkJCXJldHVybiBnZXRJbnRlcmNlcHRvcnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0lOVEVSQ0VQVE9SUzoKLQkJCQlnZXRJbnRlcmNlcHRvcnMoKS5jbGVhcigpOwotCQkJCWdldEludGVyY2VwdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0lOVEVSQ0VQVE9SUzoKLQkJCQlnZXRJbnRlcmNlcHRvcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19JTlRFUkNFUFRPUlM6Ci0JCQkJcmV0dXJuIGludGVyY2VwdG9ycyAhPSBudWxsICYmICFpbnRlcmNlcHRvcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSW50ZXJjZXB0b3JzVHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEcml2ZW5CZWFuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuQmVhbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5ZDY1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEcml2ZW5CZWFuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRHJpdmVuIEJlYW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRFamJDbGFzcyA8ZW0+RWpiIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRNZXNzYWdpbmdUeXBlIDxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0VGltZW91dE1ldGhvZCA8ZW0+VGltZW91dCBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldEFjdGl2YXRpb25Db25maWcgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRBcm91bmRJbnZva2VzIDxlbT5Bcm91bmQgSW52b2tlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRSZXNvdXJjZVJlZnMgPGVtPlJlc291cmNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFNlY3VyaXR5SWRlbnRpdHkgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRHJpdmVuQmVhbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VEcml2ZW5CZWFuIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTmFtZSgpIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTmFtZSgpIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJOYW1lID0gRUpCX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkTmFtZSgpIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWROYW1lID0gTUFQUEVEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiQ2xhc3MoKSA8ZW0+RWpiIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkNsYXNzKCkgPGVtPkVqYiBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiQ2xhc3MgPSBFSkJfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnaW5nVHlwZSgpIDxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHSU5HX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnaW5nVHlwZSgpIDxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdpbmdUeXBlID0gTUVTU0FHSU5HX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lb3V0TWV0aG9kKCkgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lb3V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIHRpbWVvdXRNZXRob2QgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zYWN0aW9uVHlwZSgpIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25UeXBlIFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQgPSBUcmFuc2FjdGlvblR5cGUuQkVBTl9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uVHlwZSB0cmFuc2FjdGlvblR5cGUgPSBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc2FjdGlvbiBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc2FjdGlvblR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfREVTVElOQVRJT05fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlRGVzdGluYXRpb25UeXBlID0gTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZURlc3RpbmF0aW9uTGluayA9IE1FU1NBR0VfREVTVElOQVRJT05fTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2YXRpb25Db25maWcoKSA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBBY3RpdmF0aW9uQ29uZmlnIGFjdGl2YXRpb25Db25maWcgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJvdW5kSW52b2tlcygpIDxlbT5Bcm91bmQgSW52b2tlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcm91bmRJbnZva2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXJvdW5kSW52b2tlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZFbnRyaWVzKCkgPGVtPkVudiBFbnRyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudkVudHJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnZFbnRyaWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZnMoKSA8ZW0+RWpiIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYlJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTG9jYWxSZWZzKCkgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkxvY2FsUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYkxvY2FsUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmcygpIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVJlZnMoKSA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZVJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VFbnZSZWZzKCkgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlRW52UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGVyc2lzdGVuY2VVbml0UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Q29uc3RydWN0cygpIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdENvbnN0cnVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwb3N0Q29uc3RydWN0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVEZXN0cm95cygpIDxlbT5QcmUgRGVzdHJveXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlRGVzdHJveXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcmVEZXN0cm95cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN1cml0eUlkZW50aXR5KCkgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN1cml0eUlkZW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlJZGVudGl0eVR5cGUgc2VjdXJpdHlJZGVudGl0eSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRHJpdmVuQmVhbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfRFJJVkVOX0JFQU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19ESVNQTEFZX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgewotCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19JQ09OUyk7Ci0JCX0KLQkJcmV0dXJuIGljb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiTmFtZSgpIHsKLQkJcmV0dXJuIGVqYk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiTmFtZShTdHJpbmcgbmV3RWpiTmFtZSkgewotCQlTdHJpbmcgb2xkRWpiTmFtZSA9IGVqYk5hbWU7Ci0JCWVqYk5hbWUgPSBuZXdFamJOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9OQU1FLCBvbGRFamJOYW1lLCBlamJOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWROYW1lKCkgewotCQlyZXR1cm4gbWFwcGVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyBuZXdNYXBwZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRNYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLQkJbWFwcGVkTmFtZSA9IG5ld01hcHBlZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUFQUEVEX05BTUUsIG9sZE1hcHBlZE5hbWUsIG1hcHBlZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYkNsYXNzKCkgewotCQlyZXR1cm4gZWpiQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiQ2xhc3MoU3RyaW5nIG5ld0VqYkNsYXNzKSB7Ci0JCVN0cmluZyBvbGRFamJDbGFzcyA9IGVqYkNsYXNzOwotCQllamJDbGFzcyA9IG5ld0VqYkNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9DTEFTUywgb2xkRWpiQ2xhc3MsIGVqYkNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdpbmdUeXBlKCkgewotCQlyZXR1cm4gbWVzc2FnaW5nVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdpbmdUeXBlKFN0cmluZyBuZXdNZXNzYWdpbmdUeXBlKSB7Ci0JCVN0cmluZyBvbGRNZXNzYWdpbmdUeXBlID0gbWVzc2FnaW5nVHlwZTsKLQkJbWVzc2FnaW5nVHlwZSA9IG5ld01lc3NhZ2luZ1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHSU5HX1RZUEUsIG9sZE1lc3NhZ2luZ1R5cGUsIG1lc3NhZ2luZ1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZWRNZXRob2RUeXBlIGdldFRpbWVvdXRNZXRob2QoKSB7Ci0JCXJldHVybiB0aW1lb3V0TWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRpbWVvdXRNZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld1RpbWVvdXRNZXRob2QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTmFtZWRNZXRob2RUeXBlIG9sZFRpbWVvdXRNZXRob2QgPSB0aW1lb3V0TWV0aG9kOwotCQl0aW1lb3V0TWV0aG9kID0gbmV3VGltZW91dE1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19USU1FT1VUX01FVEhPRCwgb2xkVGltZW91dE1ldGhvZCwgbmV3VGltZW91dE1ldGhvZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3VGltZW91dE1ldGhvZCkgewotCQlpZiAobmV3VGltZW91dE1ldGhvZCAhPSB0aW1lb3V0TWV0aG9kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0aW1lb3V0TWV0aG9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRpbWVvdXRNZXRob2QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUaW1lb3V0TWV0aG9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RpbWVvdXRNZXRob2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRpbWVvdXRNZXRob2QobmV3VGltZW91dE1ldGhvZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9ELCBuZXdUaW1lb3V0TWV0aG9kLCBuZXdUaW1lb3V0TWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSBuZXdUcmFuc2FjdGlvblR5cGUpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJdHJhbnNhY3Rpb25UeXBlID0gbmV3VHJhbnNhY3Rpb25UeXBlID09IG51bGwgPyBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25UeXBlOwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cmFuc2FjdGlvblR5cGVFU2V0OwotCQl0cmFuc2FjdGlvblR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFLCBvbGRUcmFuc2FjdGlvblR5cGUsIHRyYW5zYWN0aW9uVHlwZSwgIW9sZFRyYW5zYWN0aW9uVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblR5cGVFU2V0ID0gdHJhbnNhY3Rpb25UeXBlRVNldDsKLQkJdHJhbnNhY3Rpb25UeXBlID0gVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVDsKLQkJdHJhbnNhY3Rpb25UeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRSwgb2xkVHJhbnNhY3Rpb25UeXBlLCBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvblR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZShTdHJpbmcgbmV3TWVzc2FnZURlc3RpbmF0aW9uVHlwZSkgewotCQlTdHJpbmcgb2xkTWVzc2FnZURlc3RpbmF0aW9uVHlwZSA9IG1lc3NhZ2VEZXN0aW5hdGlvblR5cGU7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgPSBuZXdNZXNzYWdlRGVzdGluYXRpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRSwgb2xkTWVzc2FnZURlc3RpbmF0aW9uVHlwZSwgbWVzc2FnZURlc3RpbmF0aW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbkxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayhTdHJpbmcgbmV3TWVzc2FnZURlc3RpbmF0aW9uTGluaykgewotCQlTdHJpbmcgb2xkTWVzc2FnZURlc3RpbmF0aW9uTGluayA9IG1lc3NhZ2VEZXN0aW5hdGlvbkxpbms7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPSBuZXdNZXNzYWdlRGVzdGluYXRpb25MaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fTElOSywgb2xkTWVzc2FnZURlc3RpbmF0aW9uTGluaywgbWVzc2FnZURlc3RpbmF0aW9uTGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3RpdmF0aW9uQ29uZmlnIGdldEFjdGl2YXRpb25Db25maWcoKSB7Ci0JCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZyBuZXdBY3RpdmF0aW9uQ29uZmlnLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUFjdGl2YXRpb25Db25maWcgb2xkQWN0aXZhdGlvbkNvbmZpZyA9IGFjdGl2YXRpb25Db25maWc7Ci0JCWFjdGl2YXRpb25Db25maWcgPSBuZXdBY3RpdmF0aW9uQ29uZmlnOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FDVElWQVRJT05fQ09ORklHLCBvbGRBY3RpdmF0aW9uQ29uZmlnLCBuZXdBY3RpdmF0aW9uQ29uZmlnKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcgbmV3QWN0aXZhdGlvbkNvbmZpZykgewotCQlpZiAobmV3QWN0aXZhdGlvbkNvbmZpZyAhPSBhY3RpdmF0aW9uQ29uZmlnKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY3RpdmF0aW9uQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjdGl2YXRpb25Db25maWcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FDVElWQVRJT05fQ09ORklHLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY3RpdmF0aW9uQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjdGl2YXRpb25Db25maWcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FDVElWQVRJT05fQ09ORklHLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjdGl2YXRpb25Db25maWcobmV3QWN0aXZhdGlvbkNvbmZpZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FDVElWQVRJT05fQ09ORklHLCBuZXdBY3RpdmF0aW9uQ29uZmlnLCBuZXdBY3RpdmF0aW9uQ29uZmlnKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXJvdW5kSW52b2tlcygpIHsKLQkJaWYgKGFyb3VuZEludm9rZXMgPT0gbnVsbCkgewotCQkJYXJvdW5kSW52b2tlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBcm91bmRJbnZva2VUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9JTlZPS0VTKTsKLQkJfQotCQlyZXR1cm4gYXJvdW5kSW52b2tlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFbnZFbnRyaWVzKCkgewotCQlpZiAoZW52RW50cmllcyA9PSBudWxsKSB7Ci0JCQllbnZFbnRyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVudkVudHJ5LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VOVl9FTlRSSUVTKTsKLQkJfQotCQlyZXR1cm4gZW52RW50cmllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJSZWZzKCkgewotCQlpZiAoZWpiUmVmcyA9PSBudWxsKSB7Ci0JCQllamJSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVqYlJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYlJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RWpiTG9jYWxSZWZzKCkgewotCQlpZiAoZWpiTG9jYWxSZWZzID09IG51bGwpIHsKLQkJCWVqYkxvY2FsUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJMb2NhbFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfTE9DQUxfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYkxvY2FsUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2aWNlUmVmcygpIHsKLQkJaWYgKHNlcnZpY2VSZWZzID09IG51bGwpIHsKLQkJCXNlcnZpY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VSVklDRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gc2VydmljZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VSZWZzKCkgewotCQlpZiAocmVzb3VyY2VSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19SRVNPVVJDRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlRW52UmVmcygpIHsKLQkJaWYgKHJlc291cmNlRW52UmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUVudlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VFbnZSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUVudlJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKLQkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPT0gbnVsbCkgewotCQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgewotCQlpZiAocGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXRSZWZzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbmNlVW5pdFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UG9zdENvbnN0cnVjdHMoKSB7Ci0JCWlmIChwb3N0Q29uc3RydWN0cyA9PSBudWxsKSB7Ci0JCQlwb3N0Q29uc3RydWN0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QT1NUX0NPTlNUUlVDVFMpOwotCQl9Ci0JCXJldHVybiBwb3N0Q29uc3RydWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcmVEZXN0cm95cygpIHsKLQkJaWYgKHByZURlc3Ryb3lzID09IG51bGwpIHsKLQkJCXByZURlc3Ryb3lzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BSRV9ERVNUUk9ZUyk7Ci0JCX0KLQkJcmV0dXJuIHByZURlc3Ryb3lzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN1cml0eUlkZW50aXR5VHlwZSBnZXRTZWN1cml0eUlkZW50aXR5KCkgewotCQlyZXR1cm4gc2VjdXJpdHlJZGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZWN1cml0eUlkZW50aXR5KFNlY3VyaXR5SWRlbnRpdHlUeXBlIG5ld1NlY3VyaXR5SWRlbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VjdXJpdHlJZGVudGl0eVR5cGUgb2xkU2VjdXJpdHlJZGVudGl0eSA9IHNlY3VyaXR5SWRlbnRpdHk7Ci0JCXNlY3VyaXR5SWRlbnRpdHkgPSBuZXdTZWN1cml0eUlkZW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZLCBvbGRTZWN1cml0eUlkZW50aXR5LCBuZXdTZWN1cml0eUlkZW50aXR5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWN1cml0eUlkZW50aXR5KFNlY3VyaXR5SWRlbnRpdHlUeXBlIG5ld1NlY3VyaXR5SWRlbnRpdHkpIHsKLQkJaWYgKG5ld1NlY3VyaXR5SWRlbnRpdHkgIT0gc2VjdXJpdHlJZGVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VjdXJpdHlJZGVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZWN1cml0eUlkZW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9JREVOVElUWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U2VjdXJpdHlJZGVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZWN1cml0eUlkZW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9JREVOVElUWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZWN1cml0eUlkZW50aXR5KG5ld1NlY3VyaXR5SWRlbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9JREVOVElUWSwgbmV3U2VjdXJpdHlJZGVudGl0eSwgbmV3U2VjdXJpdHlJZGVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9EOgotCQkJCXJldHVybiBiYXNpY1NldFRpbWVvdXRNZXRob2QobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQUNUSVZBVElPTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWN0aXZhdGlvbkNvbmZpZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFyb3VuZEludm9rZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW52RW50cmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQb3N0Q29uc3RydWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UHJlRGVzdHJveXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXJldHVybiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9OQU1FOgotCQkJCXJldHVybiBnZXRFamJOYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1hcHBlZE5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEVqYkNsYXNzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2luZ1R5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19USU1FT1VUX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0VGltZW91dE1ldGhvZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fTElOSzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FDVElWQVRJT05fQ09ORklHOgotCQkJCXJldHVybiBnZXRBY3RpdmF0aW9uQ29uZmlnKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJcmV0dXJuIGdldEFyb3VuZEludm9rZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gZ2V0RW52RW50cmllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9SRUZTOgotCQkJCXJldHVybiBnZXRFamJSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiBnZXRQb3N0Q29uc3RydWN0cygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gZ2V0UHJlRGVzdHJveXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlJZGVudGl0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9OQU1FOgotCQkJCXNldEVqYk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlzZXRFamJDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHSU5HX1RZUEU6Ci0JCQkJc2V0TWVzc2FnaW5nVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRU9VVF9NRVRIT0Q6Ci0JCQkJc2V0VGltZW91dE1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlzZXRUcmFuc2FjdGlvblR5cGUoKFRyYW5zYWN0aW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRToKLQkJCQlzZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTks6Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQUNUSVZBVElPTl9DT05GSUc6Ci0JCQkJc2V0QWN0aXZhdGlvbkNvbmZpZygoQWN0aXZhdGlvbkNvbmZpZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9JTlZPS0VTOgotCQkJCWdldEFyb3VuZEludm9rZXMoKS5jbGVhcigpOwotCQkJCWdldEFyb3VuZEludm9rZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FTlZfRU5UUklFUzoKLQkJCQlnZXRFbnZFbnRyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZFbnRyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QUkVfREVTVFJPWVM6Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5jbGVhcigpOwotCQkJCWdldFByZURlc3Ryb3lzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJc2V0U2VjdXJpdHlJZGVudGl0eSgoU2VjdXJpdHlJZGVudGl0eVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX05BTUU6Ci0JCQkJc2V0RWpiTmFtZShFSkJfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoTUFQUEVEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJc2V0RWpiQ2xhc3MoRUpCX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHSU5HX1RZUEU6Ci0JCQkJc2V0TWVzc2FnaW5nVHlwZShNRVNTQUdJTkdfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9EOgotCQkJCXNldFRpbWVvdXRNZXRob2QoKE5hbWVkTWV0aG9kVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQl1bnNldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEU6Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZShNRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTks6Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayhNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19BQ1RJVkFUSU9OX0NPTkZJRzoKLQkJCQlzZXRBY3RpdmF0aW9uQ29uZmlnKChBY3RpdmF0aW9uQ29uZmlnKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlnZXRBcm91bmRJbnZva2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRU5WX0VOVFJJRVM6Ci0JCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXNldFNlY3VyaXR5SWRlbnRpdHkoKFNlY3VyaXR5SWRlbnRpdHlUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9OQU1FOgotCQkJCXJldHVybiBFSkJfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZWpiTmFtZSAhPSBudWxsIDogIUVKQl9OQU1FX0VERUZBVUxULmVxdWFscyhlamJOYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NQVBQRURfTkFNRToKLQkJCQlyZXR1cm4gTUFQUEVEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZE5hbWUgIT0gbnVsbCA6ICFNQVBQRURfTkFNRV9FREVGQVVMVC5lcXVhbHMobWFwcGVkTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0NMQVNTOgotCQkJCXJldHVybiBFSkJfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGVqYkNsYXNzICE9IG51bGwgOiAhRUpCX0NMQVNTX0VERUZBVUxULmVxdWFscyhlamJDbGFzcyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIE1FU1NBR0lOR19UWVBFX0VERUZBVUxUID09IG51bGwgPyBtZXNzYWdpbmdUeXBlICE9IG51bGwgOiAhTUVTU0FHSU5HX1RZUEVfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2luZ1R5cGUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9EOgotCQkJCXJldHVybiB0aW1lb3V0TWV0aG9kICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIE1FU1NBR0VfREVTVElOQVRJT05fVFlQRV9FREVGQVVMVCA9PSBudWxsID8gbWVzc2FnZURlc3RpbmF0aW9uVHlwZSAhPSBudWxsIDogIU1FU1NBR0VfREVTVElOQVRJT05fVFlQRV9FREVGQVVMVC5lcXVhbHMobWVzc2FnZURlc3RpbmF0aW9uVHlwZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LOgotCQkJCXJldHVybiBNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTktfRURFRkFVTFQgPT0gbnVsbCA/IG1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgIT0gbnVsbCA6ICFNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTktfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2VEZXN0aW5hdGlvbkxpbmspOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FDVElWQVRJT05fQ09ORklHOgotCQkJCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJcmV0dXJuIGFyb3VuZEludm9rZXMgIT0gbnVsbCAmJiAhYXJvdW5kSW52b2tlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuIGVudkVudHJpZXMgIT0gbnVsbCAmJiAhZW52RW50cmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYlJlZnMgIT0gbnVsbCAmJiAhZWpiUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYkxvY2FsUmVmcyAhPSBudWxsICYmICFlamJMb2NhbFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gc2VydmljZVJlZnMgIT0gbnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlUmVmcyAhPSBudWxsICYmICFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZUVudlJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VFbnZSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9uUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCXJldHVybiBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzICE9IG51bGwgJiYgIXBlcnNpc3RlbmNlQ29udGV4dFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UmVmcyAhPSBudWxsICYmICFwZXJzaXN0ZW5jZVVuaXRSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzICE9IG51bGwgJiYgIXBvc3RDb25zdHJ1Y3RzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuIHByZURlc3Ryb3lzICE9IG51bGwgJiYgIXByZURlc3Ryb3lzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlyZXR1cm4gc2VjdXJpdHlJZGVudGl0eSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZWpiTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlamJOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVqYkNsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYkNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXNzYWdpbmdUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1lc3NhZ2luZ1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRyYW5zYWN0aW9uVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRyYW5zYWN0aW9uVHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25UeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXNzYWdlRGVzdGluYXRpb25UeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1lc3NhZ2VEZXN0aW5hdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1lc3NhZ2VEZXN0aW5hdGlvbkxpbms6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWVzc2FnZURlc3RpbmF0aW9uTGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXNzYWdlRHJpdmVuQmVhbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFBhcmFtc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGFyYW1zSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDU5ZmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGFyYW1zSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGFyYW1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1zSW1wbCNnZXRNZXRob2RQYXJhbXMgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1zSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQYXJhbXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXRob2RQYXJhbXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhcmFtcygpIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZFBhcmFtcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYXJhbXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFSQU1TOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZFBhcmFtcygpIHsKLQkJaWYgKG1ldGhvZFBhcmFtcyA9PSBudWxsKSB7Ci0JCQltZXRob2RQYXJhbXMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FVEhPRF9QQVJBTVNfX01FVEhPRF9QQVJBTVMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RQYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfUEFSQU1TX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QQVJBTVNfX01FVEhPRF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBhcmFtcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QQVJBTVNfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fTUVUSE9EX1BBUkFNUzoKLQkJCQlnZXRNZXRob2RQYXJhbXMoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QQVJBTVNfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fTUVUSE9EX1BBUkFNUzoKLQkJCQlnZXRNZXRob2RQYXJhbXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEFSQU1TX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fTUVUSE9EX1BBUkFNUzoKLQkJCQlyZXR1cm4gbWV0aG9kUGFyYW1zICE9IG51bGwgJiYgIW1ldGhvZFBhcmFtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtZXRob2RQYXJhbXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWV0aG9kUGFyYW1zKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBhcmFtc0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFBlcm1pc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFBlcm1pc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYTY3YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RQZXJtaXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQZXJtaXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsI2dldFJvbGVOYW1lcyA8ZW0+Um9sZSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQZXJtaXNzaW9uSW1wbCNnZXRVbmNoZWNrZWQgPGVtPlVuY2hlY2tlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQZXJtaXNzaW9uSW1wbCNnZXRNZXRob2RzIDxlbT5NZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBlcm1pc3Npb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXRob2RQZXJtaXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZXMoKSA8ZW0+Um9sZSBOYW1lczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByb2xlTmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5jaGVja2VkKCkgPGVtPlVuY2hlY2tlZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5jaGVja2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW1wdHlUeXBlIHVuY2hlY2tlZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RzKCkgPGVtPk1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGVybWlzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QRVJNSVNTSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSb2xlTmFtZXMoKSB7Ci0JCWlmIChyb2xlTmFtZXMgPT0gbnVsbCkgewotCQkJcm9sZU5hbWVzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fUk9MRV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW1wdHlUeXBlIGdldFVuY2hlY2tlZCgpIHsKLQkJcmV0dXJuIHVuY2hlY2tlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVbmNoZWNrZWQoRW1wdHlUeXBlIG5ld1VuY2hlY2tlZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlFbXB0eVR5cGUgb2xkVW5jaGVja2VkID0gdW5jaGVja2VkOwotCQl1bmNoZWNrZWQgPSBuZXdVbmNoZWNrZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRCwgb2xkVW5jaGVja2VkLCBuZXdVbmNoZWNrZWQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuY2hlY2tlZChFbXB0eVR5cGUgbmV3VW5jaGVja2VkKSB7Ci0JCWlmIChuZXdVbmNoZWNrZWQgIT0gdW5jaGVja2VkKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh1bmNoZWNrZWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdW5jaGVja2VkKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdVbmNoZWNrZWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VW5jaGVja2VkKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFVuY2hlY2tlZChuZXdVbmNoZWNrZWQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VELCBuZXdVbmNoZWNrZWQsIG5ld1VuY2hlY2tlZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZHMoKSB7Ci0JCWlmIChtZXRob2RzID09IG51bGwpIHsKLQkJCW1ldGhvZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEOgotCQkJCXJldHVybiBiYXNpY1NldFVuY2hlY2tlZChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldFJvbGVOYW1lcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQ6Ci0JCQkJcmV0dXJuIGdldFVuY2hlY2tlZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRNZXRob2RzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ST0xFX05BTUVTOgotCQkJCWdldFJvbGVOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRDoKLQkJCQlzZXRVbmNoZWNrZWQoKEVtcHR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RTOgotCQkJCWdldE1ldGhvZHMoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ST0xFX05BTUVTOgotCQkJCWdldFJvbGVOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQ6Ci0JCQkJc2V0VW5jaGVja2VkKChFbXB0eVR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RTOgotCQkJCWdldE1ldGhvZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ST0xFX05BTUVTOgotCQkJCXJldHVybiByb2xlTmFtZXMgIT0gbnVsbCAmJiAhcm9sZU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEOgotCQkJCXJldHVybiB1bmNoZWNrZWQgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EUzoKLQkJCQlyZXR1cm4gbWV0aG9kcyAhPSBudWxsICYmICFtZXRob2RzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyb2xlTmFtZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocm9sZU5hbWVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBlcm1pc3Npb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjg3YThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RJbnRlcmZhY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBhcmFtczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFR5cGVJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFR5cGVJbXBsI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFR5cGVJbXBsI2dldE1ldGhvZEludGYgPGVtPk1ldGhvZCBJbnRmPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFR5cGVJbXBsI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFR5cGVJbXBsI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTWV0aG9kVHlwZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYk5hbWUoKSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYk5hbWUoKSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiTmFtZSA9IEVKQl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZEludGYoKSA8ZW0+TWV0aG9kIEludGY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZEludGYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWV0aG9kSW50ZXJmYWNlVHlwZSBNRVRIT0RfSU5URl9FREVGQVVMVCA9IE1ldGhvZEludGVyZmFjZVR5cGUuSE9NRV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kSW50ZigpIDxlbT5NZXRob2QgSW50ZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kSW50ZigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEludGVyZmFjZVR5cGUgbWV0aG9kSW50ZiA9IE1FVEhPRF9JTlRGX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNZXRob2QgSW50ZiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0aG9kSW50ZkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZE5hbWUgPSBNRVRIT0RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhcmFtcygpIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYXJhbXMgbWV0aG9kUGFyYW1zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJOYW1lKCkgewotCQlyZXR1cm4gZWpiTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJOYW1lKFN0cmluZyBuZXdFamJOYW1lKSB7Ci0JCVN0cmluZyBvbGRFamJOYW1lID0gZWpiTmFtZTsKLQkJZWpiTmFtZSA9IG5ld0VqYk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0VKQl9OQU1FLCBvbGRFamJOYW1lLCBlamJOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEludGVyZmFjZVR5cGUgZ2V0TWV0aG9kSW50ZigpIHsKLQkJcmV0dXJuIG1ldGhvZEludGY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kSW50ZihNZXRob2RJbnRlcmZhY2VUeXBlIG5ld01ldGhvZEludGYpIHsKLQkJTWV0aG9kSW50ZXJmYWNlVHlwZSBvbGRNZXRob2RJbnRmID0gbWV0aG9kSW50ZjsKLQkJbWV0aG9kSW50ZiA9IG5ld01ldGhvZEludGYgPT0gbnVsbCA/IE1FVEhPRF9JTlRGX0VERUZBVUxUIDogbmV3TWV0aG9kSW50ZjsKLQkJYm9vbGVhbiBvbGRNZXRob2RJbnRmRVNldCA9IG1ldGhvZEludGZFU2V0OwotCQltZXRob2RJbnRmRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9JTlRGLCBvbGRNZXRob2RJbnRmLCBtZXRob2RJbnRmLCAhb2xkTWV0aG9kSW50ZkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1ldGhvZEludGYoKSB7Ci0JCU1ldGhvZEludGVyZmFjZVR5cGUgb2xkTWV0aG9kSW50ZiA9IG1ldGhvZEludGY7Ci0JCWJvb2xlYW4gb2xkTWV0aG9kSW50ZkVTZXQgPSBtZXRob2RJbnRmRVNldDsKLQkJbWV0aG9kSW50ZiA9IE1FVEhPRF9JTlRGX0VERUZBVUxUOwotCQltZXRob2RJbnRmRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9JTlRGLCBvbGRNZXRob2RJbnRmLCBNRVRIT0RfSU5URl9FREVGQVVMVCwgb2xkTWV0aG9kSW50ZkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1ldGhvZEludGYoKSB7Ci0JCXJldHVybiBtZXRob2RJbnRmRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7Ci0JCXJldHVybiBtZXRob2ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIG5ld01ldGhvZE5hbWUpIHsKLQkJU3RyaW5nIG9sZE1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotCQltZXRob2ROYW1lID0gbmV3TWV0aG9kTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUUsIG9sZE1ldGhvZE5hbWUsIG1ldGhvZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFyYW1zIGdldE1ldGhvZFBhcmFtcygpIHsKLQkJcmV0dXJuIG1ldGhvZFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zIG5ld01ldGhvZFBhcmFtcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlNZXRob2RQYXJhbXMgb2xkTWV0aG9kUGFyYW1zID0gbWV0aG9kUGFyYW1zOwotCQltZXRob2RQYXJhbXMgPSBuZXdNZXRob2RQYXJhbXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMsIG9sZE1ldGhvZFBhcmFtcywgbmV3TWV0aG9kUGFyYW1zKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zIG5ld01ldGhvZFBhcmFtcykgewotCQlpZiAobmV3TWV0aG9kUGFyYW1zICE9IG1ldGhvZFBhcmFtcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWV0aG9kUGFyYW1zICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1ldGhvZFBhcmFtcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01ldGhvZFBhcmFtcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNZXRob2RQYXJhbXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1ldGhvZFBhcmFtcyhuZXdNZXRob2RQYXJhbXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUywgbmV3TWV0aG9kUGFyYW1zLCBuZXdNZXRob2RQYXJhbXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TOgotCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZFBhcmFtcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19FSkJfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RWpiTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfSU5URjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kSW50ZigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TOgotCQkJCXJldHVybiBnZXRNZXRob2RQYXJhbXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0VKQl9OQU1FOgotCQkJCXNldEVqYk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfSU5URjoKLQkJCQlzZXRNZXRob2RJbnRmKChNZXRob2RJbnRlcmZhY2VUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FOgotCQkJCXNldE1ldGhvZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TOgotCQkJCXNldE1ldGhvZFBhcmFtcygoTWV0aG9kUGFyYW1zKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fRUpCX05BTUU6Ci0JCQkJc2V0RWpiTmFtZShFSkJfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfSU5URjoKLQkJCQl1bnNldE1ldGhvZEludGYoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FOgotCQkJCXNldE1ldGhvZE5hbWUoTUVUSE9EX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUzoKLQkJCQlzZXRNZXRob2RQYXJhbXMoKE1ldGhvZFBhcmFtcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fRUpCX05BTUU6Ci0JCQkJcmV0dXJuIEVKQl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlamJOYW1lICE9IG51bGwgOiAhRUpCX05BTUVfRURFRkFVTFQuZXF1YWxzKGVqYk5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfSU5URjoKLQkJCQlyZXR1cm4gaXNTZXRNZXRob2RJbnRmKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FOgotCQkJCXJldHVybiBNRVRIT0RfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWV0aG9kTmFtZSAhPSBudWxsIDogIU1FVEhPRF9OQU1FX0VERUZBVUxULmVxdWFscyhtZXRob2ROYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUzoKLQkJCQlyZXR1cm4gbWV0aG9kUGFyYW1zICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZWpiTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlamJOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXRob2RJbnRmOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWV0aG9kSW50ZkVTZXQpIHJlc3VsdC5hcHBlbmQobWV0aG9kSW50Zik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0aG9kTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtZXRob2ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFR5cGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9OYW1lZE1ldGhvZFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL05hbWVkTWV0aG9kVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M1ZTU2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL05hbWVkTWV0aG9kVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQYXJhbXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIE1ldGhvZCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk5hbWVkTWV0aG9kVHlwZUltcGwjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTmFtZWRNZXRob2RUeXBlSW1wbCNnZXRNZXRob2RQYXJhbXMgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTmFtZWRNZXRob2RUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lZE1ldGhvZFR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBOYW1lZE1ldGhvZFR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZE5hbWUgPSBNRVRIT0RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhcmFtcygpIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYXJhbXMgbWV0aG9kUGFyYW1zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVkTWV0aG9kVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX01FVEhPRF9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKLQkJcmV0dXJuIG1ldGhvZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgbmV3TWV0aG9kTmFtZSkgewotCQlTdHJpbmcgb2xkTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0JCW1ldGhvZE5hbWUgPSBuZXdNZXRob2ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRSwgb2xkTWV0aG9kTmFtZSwgbWV0aG9kTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQYXJhbXMgZ2V0TWV0aG9kUGFyYW1zKCkgewotCQlyZXR1cm4gbWV0aG9kUGFyYW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMgbmV3TWV0aG9kUGFyYW1zLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCU1ldGhvZFBhcmFtcyBvbGRNZXRob2RQYXJhbXMgPSBtZXRob2RQYXJhbXM7Ci0JCW1ldGhvZFBhcmFtcyA9IG5ld01ldGhvZFBhcmFtczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUywgb2xkTWV0aG9kUGFyYW1zLCBuZXdNZXRob2RQYXJhbXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMgbmV3TWV0aG9kUGFyYW1zKSB7Ci0JCWlmIChuZXdNZXRob2RQYXJhbXMgIT0gbWV0aG9kUGFyYW1zKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChtZXRob2RQYXJhbXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWV0aG9kUGFyYW1zKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TWV0aG9kUGFyYW1zICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01ldGhvZFBhcmFtcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TWV0aG9kUGFyYW1zKG5ld01ldGhvZFBhcmFtcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TLCBuZXdNZXRob2RQYXJhbXMsIG5ld01ldGhvZFBhcmFtcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWV0aG9kUGFyYW1zKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FOgotCQkJCXJldHVybiBnZXRNZXRob2ROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBhcmFtcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRToKLQkJCQlzZXRNZXRob2ROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUzoKLQkJCQlzZXRNZXRob2RQYXJhbXMoKE1ldGhvZFBhcmFtcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRToKLQkJCQlzZXRNZXRob2ROYW1lKE1FVEhPRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVM6Ci0JCQkJc2V0TWV0aG9kUGFyYW1zKChNZXRob2RQYXJhbXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FOgotCQkJCXJldHVybiBNRVRIT0RfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWV0aG9kTmFtZSAhPSBudWxsIDogIU1FVEhPRF9OQU1FX0VERUZBVUxULmVxdWFscyhtZXRob2ROYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUzoKLQkJCQlyZXR1cm4gbWV0aG9kUGFyYW1zICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWV0aG9kTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtZXRob2ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL05hbWVkTWV0aG9kVHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2Yzk0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5RdWVyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeUltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5SW1wbCNnZXRRdWVyeU1ldGhvZCA8ZW0+UXVlcnkgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5SW1wbCNnZXRSZXN1bHRUeXBlTWFwcGluZyA8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeUltcGwjZ2V0RWpiUWwgPGVtPkVqYiBRbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUXVlcnlJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBRdWVyeSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UXVlcnlNZXRob2QoKSA8ZW0+UXVlcnkgTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRRdWVyeU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFF1ZXJ5TWV0aG9kIHF1ZXJ5TWV0aG9kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHRUeXBlTWFwcGluZygpIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bHRUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXN1bHRUeXBlTWFwcGluZ1R5cGUgUkVTVUxUX1RZUEVfTUFQUElOR19FREVGQVVMVCA9IFJlc3VsdFR5cGVNYXBwaW5nVHlwZS5MT0NBTF9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdWx0VHlwZU1hcHBpbmcoKSA8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzdWx0VHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSZXN1bHRUeXBlTWFwcGluZ1R5cGUgcmVzdWx0VHlwZU1hcHBpbmcgPSBSRVNVTFRfVFlQRV9NQVBQSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXN1bHQgVHlwZSBNYXBwaW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bHRUeXBlTWFwcGluZ0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJRbCgpIDxlbT5FamIgUWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUWwoKSA8ZW0+RWpiIFFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJRbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlamJRbCA9IEVKQl9RTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFF1ZXJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuUVVFUlk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGVzY3JpcHRpb24oRGVzY3JpcHRpb24gbmV3RGVzY3JpcHRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRGVzY3JpcHRpb24gb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBuZXdEZXNjcmlwdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oRGVzY3JpcHRpb24gbmV3RGVzY3JpcHRpb24pIHsKLQkJaWYgKG5ld0Rlc2NyaXB0aW9uICE9IGRlc2NyaXB0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkZXNjcmlwdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdEZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEZXNjcmlwdGlvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OLCBuZXdEZXNjcmlwdGlvbiwgbmV3RGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUXVlcnlNZXRob2QgZ2V0UXVlcnlNZXRob2QoKSB7Ci0JCXJldHVybiBxdWVyeU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRRdWVyeU1ldGhvZChRdWVyeU1ldGhvZCBuZXdRdWVyeU1ldGhvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlRdWVyeU1ldGhvZCBvbGRRdWVyeU1ldGhvZCA9IHF1ZXJ5TWV0aG9kOwotCQlxdWVyeU1ldGhvZCA9IG5ld1F1ZXJ5TWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIG9sZFF1ZXJ5TWV0aG9kLCBuZXdRdWVyeU1ldGhvZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVlcnlNZXRob2QoUXVlcnlNZXRob2QgbmV3UXVlcnlNZXRob2QpIHsKLQkJaWYgKG5ld1F1ZXJ5TWV0aG9kICE9IHF1ZXJ5TWV0aG9kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChxdWVyeU1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClxdWVyeU1ldGhvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UXVlcnlNZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UXVlcnlNZXRob2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UXVlcnlNZXRob2QobmV3UXVlcnlNZXRob2QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9ELCBuZXdRdWVyeU1ldGhvZCwgbmV3UXVlcnlNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzdWx0VHlwZU1hcHBpbmdUeXBlIGdldFJlc3VsdFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gcmVzdWx0VHlwZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0VHlwZU1hcHBpbmcoUmVzdWx0VHlwZU1hcHBpbmdUeXBlIG5ld1Jlc3VsdFR5cGVNYXBwaW5nKSB7Ci0JCVJlc3VsdFR5cGVNYXBwaW5nVHlwZSBvbGRSZXN1bHRUeXBlTWFwcGluZyA9IHJlc3VsdFR5cGVNYXBwaW5nOwotCQlyZXN1bHRUeXBlTWFwcGluZyA9IG5ld1Jlc3VsdFR5cGVNYXBwaW5nID09IG51bGwgPyBSRVNVTFRfVFlQRV9NQVBQSU5HX0VERUZBVUxUIDogbmV3UmVzdWx0VHlwZU1hcHBpbmc7Ci0JCWJvb2xlYW4gb2xkUmVzdWx0VHlwZU1hcHBpbmdFU2V0ID0gcmVzdWx0VHlwZU1hcHBpbmdFU2V0OwotCQlyZXN1bHRUeXBlTWFwcGluZ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19SRVNVTFRfVFlQRV9NQVBQSU5HLCBvbGRSZXN1bHRUeXBlTWFwcGluZywgcmVzdWx0VHlwZU1hcHBpbmcsICFvbGRSZXN1bHRUeXBlTWFwcGluZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3VsdFR5cGVNYXBwaW5nKCkgewotCQlSZXN1bHRUeXBlTWFwcGluZ1R5cGUgb2xkUmVzdWx0VHlwZU1hcHBpbmcgPSByZXN1bHRUeXBlTWFwcGluZzsKLQkJYm9vbGVhbiBvbGRSZXN1bHRUeXBlTWFwcGluZ0VTZXQgPSByZXN1bHRUeXBlTWFwcGluZ0VTZXQ7Ci0JCXJlc3VsdFR5cGVNYXBwaW5nID0gUkVTVUxUX1RZUEVfTUFQUElOR19FREVGQVVMVDsKLQkJcmVzdWx0VHlwZU1hcHBpbmdFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fUkVTVUxUX1RZUEVfTUFQUElORywgb2xkUmVzdWx0VHlwZU1hcHBpbmcsIFJFU1VMVF9UWVBFX01BUFBJTkdfRURFRkFVTFQsIG9sZFJlc3VsdFR5cGVNYXBwaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzdWx0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiByZXN1bHRUeXBlTWFwcGluZ0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJRbCgpIHsKLQkJcmV0dXJuIGVqYlFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYlFsKFN0cmluZyBuZXdFamJRbCkgewotCQlTdHJpbmcgb2xkRWpiUWwgPSBlamJRbDsKLQkJZWpiUWwgPSBuZXdFamJRbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fRUpCX1FMLCBvbGRFamJRbCwgZWpiUWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXREZXNjcmlwdGlvbihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9EOgotCQkJCXJldHVybiBiYXNpY1NldFF1ZXJ5TWV0aG9kKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldFF1ZXJ5TWV0aG9kKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1JFU1VMVF9UWVBFX01BUFBJTkc6Ci0JCQkJcmV0dXJuIGdldFJlc3VsdFR5cGVNYXBwaW5nKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTDoKLQkJCQlyZXR1cm4gZ2V0RWpiUWwoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKERlc2NyaXB0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRDoKLQkJCQlzZXRRdWVyeU1ldGhvZCgoUXVlcnlNZXRob2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUkVTVUxUX1RZUEVfTUFQUElORzoKLQkJCQlzZXRSZXN1bHRUeXBlTWFwcGluZygoUmVzdWx0VHlwZU1hcHBpbmdUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTDoKLQkJCQlzZXRFamJRbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChEZXNjcmlwdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRDoKLQkJCQlzZXRRdWVyeU1ldGhvZCgoUXVlcnlNZXRob2QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19SRVNVTFRfVFlQRV9NQVBQSU5HOgotCQkJCXVuc2V0UmVzdWx0VHlwZU1hcHBpbmcoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTDoKLQkJCQlzZXRFamJRbChFSkJfUUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb24gIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9EOgotCQkJCXJldHVybiBxdWVyeU1ldGhvZCAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19SRVNVTFRfVFlQRV9NQVBQSU5HOgotCQkJCXJldHVybiBpc1NldFJlc3VsdFR5cGVNYXBwaW5nKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTDoKLQkJCQlyZXR1cm4gRUpCX1FMX0VERUZBVUxUID09IG51bGwgPyBlamJRbCAhPSBudWxsIDogIUVKQl9RTF9FREVGQVVMVC5lcXVhbHMoZWpiUWwpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlc3VsdFR5cGVNYXBwaW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0VHlwZU1hcHBpbmdFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3VsdFR5cGVNYXBwaW5nKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBlamJRbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlamJRbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9RdWVyeUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeU1ldGhvZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyOTg3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBhcmFtczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5RdWVyeSBNZXRob2Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlNZXRob2RJbXBsI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5TWV0aG9kSW1wbCNnZXRNZXRob2RQYXJhbXMgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlNZXRob2RJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFF1ZXJ5TWV0aG9kSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUXVlcnlNZXRob2QgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZE5hbWUgPSBNRVRIT0RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhcmFtcygpIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYXJhbXMgbWV0aG9kUGFyYW1zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFF1ZXJ5TWV0aG9kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuUVVFUllfTUVUSE9EOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKLQkJcmV0dXJuIG1ldGhvZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgbmV3TWV0aG9kTmFtZSkgewotCQlTdHJpbmcgb2xkTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0JCW1ldGhvZE5hbWUgPSBuZXdNZXRob2ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX05BTUUsIG9sZE1ldGhvZE5hbWUsIG1ldGhvZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFyYW1zIGdldE1ldGhvZFBhcmFtcygpIHsKLQkJcmV0dXJuIG1ldGhvZFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zIG5ld01ldGhvZFBhcmFtcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlNZXRob2RQYXJhbXMgb2xkTWV0aG9kUGFyYW1zID0gbWV0aG9kUGFyYW1zOwotCQltZXRob2RQYXJhbXMgPSBuZXdNZXRob2RQYXJhbXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19NRVRIT0RfUEFSQU1TLCBvbGRNZXRob2RQYXJhbXMsIG5ld01ldGhvZFBhcmFtcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kUGFyYW1zKE1ldGhvZFBhcmFtcyBuZXdNZXRob2RQYXJhbXMpIHsKLQkJaWYgKG5ld01ldGhvZFBhcmFtcyAhPSBtZXRob2RQYXJhbXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG1ldGhvZFBhcmFtcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltZXRob2RQYXJhbXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX1BBUkFNUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TWV0aG9kUGFyYW1zICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01ldGhvZFBhcmFtcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19NRVRIT0RfUEFSQU1TLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1ldGhvZFBhcmFtcyhuZXdNZXRob2RQYXJhbXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX01FVEhPRF9QQVJBTVMsIG5ld01ldGhvZFBhcmFtcywgbmV3TWV0aG9kUGFyYW1zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19NRVRIT0RfUEFSQU1TOgotCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZFBhcmFtcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX05BTUU6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZE5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX01FVEhPRF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBhcmFtcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX01FVEhPRF9OQU1FOgotCQkJCXNldE1ldGhvZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX1BBUkFNUzoKLQkJCQlzZXRNZXRob2RQYXJhbXMoKE1ldGhvZFBhcmFtcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX01FVEhPRF9OQU1FOgotCQkJCXNldE1ldGhvZE5hbWUoTUVUSE9EX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX01FVEhPRF9QQVJBTVM6Ci0JCQkJc2V0TWV0aG9kUGFyYW1zKChNZXRob2RQYXJhbXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX05BTUU6Ci0JCQkJcmV0dXJuIE1FVEhPRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtZXRob2ROYW1lICE9IG51bGwgOiAhTUVUSE9EX05BTUVfRURFRkFVTFQuZXF1YWxzKG1ldGhvZE5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX1BBUkFNUzoKLQkJCQlyZXR1cm4gbWV0aG9kUGFyYW1zICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1ldGhvZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9RdWVyeU1ldGhvZEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlOGY1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUltcGwjZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYk5hbWUgPSBFSkJfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiTmFtZSgpIHsKLQkJcmV0dXJuIGVqYk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiTmFtZShTdHJpbmcgbmV3RWpiTmFtZSkgewotCQlTdHJpbmcgb2xkRWpiTmFtZSA9IGVqYk5hbWU7Ci0JCWVqYk5hbWUgPSBuZXdFamJOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19FSkJfTkFNRSwgb2xkRWpiTmFtZSwgZWpiTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fRUpCX05BTUU6Ci0JCQkJcmV0dXJuIGdldEVqYk5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0VKQl9OQU1FOgotCQkJCXNldEVqYk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0VKQl9OQU1FOgotCQkJCXNldEVqYk5hbWUoRUpCX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19FSkJfTkFNRToKLQkJCQlyZXR1cm4gRUpCX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGVqYk5hbWUgIT0gbnVsbCA6ICFFSkJfTkFNRV9FREVGQVVMVC5lcXVhbHMoZWpiTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZWpiTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlamJOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjNWQ3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcHNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWxhdGlvbnNoaXBzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcHNJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcHNJbXBsI2dldEVqYlJlbGF0aW9ucyA8ZW0+RWpiIFJlbGF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZWxhdGlvbnNoaXBzSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVsYXRpb25zaGlwcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVsYXRpb25zKCkgPGVtPkVqYiBSZWxhdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVsYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiUmVsYXRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcHNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5SRUxBVElPTlNISVBTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYlJlbGF0aW9ucygpIHsKLQkJaWYgKGVqYlJlbGF0aW9ucyA9PSBudWxsKSB7Ci0JCQllamJSZWxhdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRUpCUmVsYXRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYlJlbGF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVsYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RWpiUmVsYXRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCWdldEVqYlJlbGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVsYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUzoKLQkJCQlnZXRFamJSZWxhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCXJldHVybiBlamJSZWxhdGlvbnMgIT0gbnVsbCAmJiAhZWpiUmVsYXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmVsYXRpb25zaGlwc0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbW92ZU1ldGhvZFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbW92ZU1ldGhvZFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ODAyOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9SZW1vdmVNZXRob2RUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlbW92ZSBNZXRob2QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZW1vdmVNZXRob2RUeXBlSW1wbCNnZXRCZWFuTWV0aG9kIDxlbT5CZWFuIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZW1vdmVNZXRob2RUeXBlSW1wbCNpc1JldGFpbklmRXhjZXB0aW9uIDxlbT5SZXRhaW4gSWYgRXhjZXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbW92ZU1ldGhvZFR5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZU1ldGhvZFR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZW1vdmVNZXRob2RUeXBlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCZWFuTWV0aG9kKCkgPGVtPkJlYW4gTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCZWFuTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIGJlYW5NZXRob2QgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmV0YWluSWZFeGNlcHRpb24oKSA8ZW0+UmV0YWluIElmIEV4Y2VwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXRhaW5JZkV4Y2VwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFVEFJTl9JRl9FWENFUFRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmV0YWluSWZFeGNlcHRpb24oKSA8ZW0+UmV0YWluIElmIEV4Y2VwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXRhaW5JZkV4Y2VwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSWZFeGNlcHRpb24gPSBSRVRBSU5fSUZfRVhDRVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXRhaW4gSWYgRXhjZXB0aW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JZkV4Y2VwdGlvbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlbW92ZU1ldGhvZFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5SRU1PVkVfTUVUSE9EX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWVkTWV0aG9kVHlwZSBnZXRCZWFuTWV0aG9kKCkgewotCQlyZXR1cm4gYmVhbk1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCZWFuTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSBuZXdCZWFuTWV0aG9kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCU5hbWVkTWV0aG9kVHlwZSBvbGRCZWFuTWV0aG9kID0gYmVhbk1ldGhvZDsKLQkJYmVhbk1ldGhvZCA9IG5ld0JlYW5NZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCwgb2xkQmVhbk1ldGhvZCwgbmV3QmVhbk1ldGhvZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmVhbk1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3QmVhbk1ldGhvZCkgewotCQlpZiAobmV3QmVhbk1ldGhvZCAhPSBiZWFuTWV0aG9kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChiZWFuTWV0aG9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWJlYW5NZXRob2QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0JlYW5NZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QmVhbk1ldGhvZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCZWFuTWV0aG9kKG5ld0JlYW5NZXRob2QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX0JFQU5fTUVUSE9ELCBuZXdCZWFuTWV0aG9kLCBuZXdCZWFuTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXRhaW5JZkV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIHJldGFpbklmRXhjZXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldGFpbklmRXhjZXB0aW9uKGJvb2xlYW4gbmV3UmV0YWluSWZFeGNlcHRpb24pIHsKLQkJYm9vbGVhbiBvbGRSZXRhaW5JZkV4Y2VwdGlvbiA9IHJldGFpbklmRXhjZXB0aW9uOwotCQlyZXRhaW5JZkV4Y2VwdGlvbiA9IG5ld1JldGFpbklmRXhjZXB0aW9uOwotCQlib29sZWFuIG9sZFJldGFpbklmRXhjZXB0aW9uRVNldCA9IHJldGFpbklmRXhjZXB0aW9uRVNldDsKLQkJcmV0YWluSWZFeGNlcHRpb25FU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX1JFVEFJTl9JRl9FWENFUFRJT04sIG9sZFJldGFpbklmRXhjZXB0aW9uLCByZXRhaW5JZkV4Y2VwdGlvbiwgIW9sZFJldGFpbklmRXhjZXB0aW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmV0YWluSWZFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gb2xkUmV0YWluSWZFeGNlcHRpb24gPSByZXRhaW5JZkV4Y2VwdGlvbjsKLQkJYm9vbGVhbiBvbGRSZXRhaW5JZkV4Y2VwdGlvbkVTZXQgPSByZXRhaW5JZkV4Y2VwdGlvbkVTZXQ7Ci0JCXJldGFpbklmRXhjZXB0aW9uID0gUkVUQUlOX0lGX0VYQ0VQVElPTl9FREVGQVVMVDsKLQkJcmV0YWluSWZFeGNlcHRpb25FU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX1JFVEFJTl9JRl9FWENFUFRJT04sIG9sZFJldGFpbklmRXhjZXB0aW9uLCBSRVRBSU5fSUZfRVhDRVBUSU9OX0VERUZBVUxULCBvbGRSZXRhaW5JZkV4Y2VwdGlvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJldGFpbklmRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gcmV0YWluSWZFeGNlcHRpb25FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QmVhbk1ldGhvZChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEJlYW5NZXRob2QoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX1JFVEFJTl9JRl9FWENFUFRJT046Ci0JCQkJcmV0dXJuIGlzUmV0YWluSWZFeGNlcHRpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0Q6Ci0JCQkJc2V0QmVhbk1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19SRVRBSU5fSUZfRVhDRVBUSU9OOgotCQkJCXNldFJldGFpbklmRXhjZXB0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19CRUFOX01FVEhPRDoKLQkJCQlzZXRCZWFuTWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fUkVUQUlOX0lGX0VYQ0VQVElPTjoKLQkJCQl1bnNldFJldGFpbklmRXhjZXB0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGJlYW5NZXRob2QgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX1JFVEFJTl9JRl9FWENFUFRJT046Ci0JCQkJcmV0dXJuIGlzU2V0UmV0YWluSWZFeGNlcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmV0YWluSWZFeGNlcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXRhaW5JZkV4Y2VwdGlvbkVTZXQpIHJlc3VsdC5hcHBlbmQocmV0YWluSWZFeGNlcHRpb24pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmVtb3ZlTWV0aG9kVHlwZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9TZWN1cml0eUlkZW50aXR5VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkMjBlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXR5IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbCNnZXRVc2VDYWxsZXJJZGVudGl0eSA8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUlkZW50aXR5VHlwZUltcGwjZ2V0UnVuQXMgPGVtPlJ1biBBczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUlkZW50aXR5VHlwZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZWN1cml0eUlkZW50aXR5VHlwZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlQ2FsbGVySWRlbnRpdHkoKSA8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNlQ2FsbGVySWRlbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFbXB0eVR5cGUgdXNlQ2FsbGVySWRlbnRpdHkgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UnVuQXMoKSA8ZW0+UnVuIEFzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSdW5BcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJ1bkFzIHJ1bkFzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuU0VDVVJJVFlfSURFTlRJVFlfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW1wdHlUeXBlIGdldFVzZUNhbGxlcklkZW50aXR5KCkgewotCQlyZXR1cm4gdXNlQ2FsbGVySWRlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VXNlQ2FsbGVySWRlbnRpdHkoRW1wdHlUeXBlIG5ld1VzZUNhbGxlcklkZW50aXR5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUVtcHR5VHlwZSBvbGRVc2VDYWxsZXJJZGVudGl0eSA9IHVzZUNhbGxlcklkZW50aXR5OwotCQl1c2VDYWxsZXJJZGVudGl0eSA9IG5ld1VzZUNhbGxlcklkZW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1VTRV9DQUxMRVJfSURFTlRJVFksIG9sZFVzZUNhbGxlcklkZW50aXR5LCBuZXdVc2VDYWxsZXJJZGVudGl0eSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlQ2FsbGVySWRlbnRpdHkoRW1wdHlUeXBlIG5ld1VzZUNhbGxlcklkZW50aXR5KSB7Ci0JCWlmIChuZXdVc2VDYWxsZXJJZGVudGl0eSAhPSB1c2VDYWxsZXJJZGVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodXNlQ2FsbGVySWRlbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdXNlQ2FsbGVySWRlbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1VTRV9DQUxMRVJfSURFTlRJVFksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1VzZUNhbGxlcklkZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1VzZUNhbGxlcklkZW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19VU0VfQ0FMTEVSX0lERU5USVRZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFVzZUNhbGxlcklkZW50aXR5KG5ld1VzZUNhbGxlcklkZW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fVVNFX0NBTExFUl9JREVOVElUWSwgbmV3VXNlQ2FsbGVySWRlbnRpdHksIG5ld1VzZUNhbGxlcklkZW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJ1bkFzIGdldFJ1bkFzKCkgewotCQlyZXR1cm4gcnVuQXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UnVuQXMoUnVuQXMgbmV3UnVuQXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUnVuQXMgb2xkUnVuQXMgPSBydW5BczsKLQkJcnVuQXMgPSBuZXdSdW5BczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19SVU5fQVMsIG9sZFJ1bkFzLCBuZXdSdW5Bcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVuQXMoUnVuQXMgbmV3UnVuQXMpIHsKLQkJaWYgKG5ld1J1bkFzICE9IHJ1bkFzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChydW5BcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClydW5BcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fUlVOX0FTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSdW5BcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSdW5BcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fUlVOX0FTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJ1bkFzKG5ld1J1bkFzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fUlVOX0FTLCBuZXdSdW5BcywgbmV3UnVuQXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19VU0VfQ0FMTEVSX0lERU5USVRZOgotCQkJCXJldHVybiBiYXNpY1NldFVzZUNhbGxlcklkZW50aXR5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1JVTl9BUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSdW5BcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fVVNFX0NBTExFUl9JREVOVElUWToKLQkJCQlyZXR1cm4gZ2V0VXNlQ2FsbGVySWRlbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19SVU5fQVM6Ci0JCQkJcmV0dXJuIGdldFJ1bkFzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19VU0VfQ0FMTEVSX0lERU5USVRZOgotCQkJCXNldFVzZUNhbGxlcklkZW50aXR5KChFbXB0eVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19SVU5fQVM6Ci0JCQkJc2V0UnVuQXMoKFJ1bkFzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fVVNFX0NBTExFUl9JREVOVElUWToKLQkJCQlzZXRVc2VDYWxsZXJJZGVudGl0eSgoRW1wdHlUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19SVU5fQVM6Ci0JCQkJc2V0UnVuQXMoKFJ1bkFzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19VU0VfQ0FMTEVSX0lERU5USVRZOgotCQkJCXJldHVybiB1c2VDYWxsZXJJZGVudGl0eSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1JVTl9BUzoKLQkJCQlyZXR1cm4gcnVuQXMgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9TZXNzaW9uQmVhbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvU2Vzc2lvbkJlYW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMjQwZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9TZXNzaW9uQmVhbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlc3Npb24gQmVhbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEhvbWUgPGVtPkhvbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFJlbW90ZSA8ZW0+UmVtb3RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRMb2NhbEhvbWUgPGVtPkxvY2FsIEhvbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldExvY2FsIDxlbT5Mb2NhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0QnVzaW5lc3NMb2NhbHMgPGVtPkJ1c2luZXNzIExvY2FsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0QnVzaW5lc3NSZW1vdGVzIDxlbT5CdXNpbmVzcyBSZW1vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnQgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFRpbWVvdXRNZXRob2QgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRJbml0TWV0aG9kcyA8ZW0+SW5pdCBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRSZW1vdmVNZXRob2RzIDxlbT5SZW1vdmUgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRBcm91bmRJbnZva2VzIDxlbT5Bcm91bmQgSW52b2tlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRSZXNvdXJjZVJlZnMgPGVtPlJlc291cmNlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFBvc3RBY3RpdmF0ZXMgPGVtPlBvc3QgQWN0aXZhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRQcmVQYXNzaXZhdGVzIDxlbT5QcmUgUGFzc2l2YXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0U2VjdXJpdHlSb2xlUmVmcyA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRTZWN1cml0eUlkZW50aXRpZXMgPGVtPlNlY3VyaXR5IElkZW50aXRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25CZWFuSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgU2Vzc2lvbkJlYW4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYk5hbWUgPSBFSkJfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZE5hbWUgPSBNQVBQRURfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb21lKCkgPGVtPkhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG9tZSgpIDxlbT5Ib21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGhvbWUgPSBIT01FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbW90ZSgpIDxlbT5SZW1vdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbW90ZSgpIDxlbT5SZW1vdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbW90ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZW1vdGUgPSBSRU1PVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxIb21lKCkgPGVtPkxvY2FsIEhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfSE9NRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEhvbWUoKSA8ZW0+TG9jYWwgSG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsSG9tZSA9IExPQ0FMX0hPTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWwoKSA8ZW0+TG9jYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbCgpIDxlbT5Mb2NhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYWwgPSBMT0NBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJ1c2luZXNzTG9jYWxzKCkgPGVtPkJ1c2luZXNzIExvY2FsczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCdXNpbmVzc0xvY2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJ1c2luZXNzTG9jYWxzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJ1c2luZXNzUmVtb3RlcygpIDxlbT5CdXNpbmVzcyBSZW1vdGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJ1c2luZXNzUmVtb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJ1c2luZXNzUmVtb3RlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50KCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9FTkRQT0lOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnQoKSA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VFbmRwb2ludCA9IFNFUlZJQ0VfRU5EUE9JTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiQ2xhc3MoKSA8ZW0+RWpiIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkNsYXNzKCkgPGVtPkVqYiBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiQ2xhc3MgPSBFSkJfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vzc2lvblR5cGUoKSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXNzaW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTRVNTSU9OX1RZUEVfRURFRkFVTFQgPSBTZXNzaW9uVHlwZS5TVEFURUZVTF9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vzc2lvblR5cGUoKSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXNzaW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlc3Npb25UeXBlIHNlc3Npb25UeXBlID0gU0VTU0lPTl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTZXNzaW9uIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNlc3Npb25UeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZW91dE1ldGhvZCgpIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGltZW91dE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVkTWV0aG9kVHlwZSB0aW1lb3V0TWV0aG9kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRNZXRob2RzKCkgPGVtPkluaXQgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0TWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRNZXRob2RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbW92ZU1ldGhvZHMoKSA8ZW0+UmVtb3ZlIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtb3ZlTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlbW92ZU1ldGhvZHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zYWN0aW9uVHlwZSgpIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25UeXBlIFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQgPSBUcmFuc2FjdGlvblR5cGUuQkVBTl9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uVHlwZSB0cmFuc2FjdGlvblR5cGUgPSBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc2FjdGlvbiBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc2FjdGlvblR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcm91bmRJbnZva2VzKCkgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFyb3VuZEludm9rZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhcm91bmRJbnZva2VzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudkVudHJpZXMoKSA8ZW0+RW52IEVudHJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW52RW50cmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVudkVudHJpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVmcygpIDxlbT5FamIgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJMb2NhbFJlZnMoKSA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTG9jYWxSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiTG9jYWxSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZzKCkgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlcnZpY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlUmVmcygpIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUVudlJlZnMoKSA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VFbnZSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwZXJzaXN0ZW5jZVVuaXRSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3RDb25zdHJ1Y3RzKCkgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Q29uc3RydWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvc3RDb25zdHJ1Y3RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZURlc3Ryb3lzKCkgPGVtPlByZSBEZXN0cm95czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVEZXN0cm95cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByZURlc3Ryb3lzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3RBY3RpdmF0ZXMoKSA8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdEFjdGl2YXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvc3RBY3RpdmF0ZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlUGFzc2l2YXRlcygpIDxlbT5QcmUgUGFzc2l2YXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVQYXNzaXZhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJlUGFzc2l2YXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN1cml0eVJvbGVSZWZzKCkgPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGVSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN1cml0eUlkZW50aXRpZXMoKSA8ZW0+U2VjdXJpdHkgSWRlbnRpdGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdXJpdHlJZGVudGl0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlJZGVudGl0eVR5cGUgc2VjdXJpdHlJZGVudGl0aWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlc3Npb25CZWFuSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuU0VTU0lPTl9CRUFOOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RJU1BMQVlfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7Ci0JCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYk5hbWUoKSB7Ci0JCXJldHVybiBlamJOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYk5hbWUoU3RyaW5nIG5ld0VqYk5hbWUpIHsKLQkJU3RyaW5nIG9sZEVqYk5hbWUgPSBlamJOYW1lOwotCQllamJOYW1lID0gbmV3RWpiTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9OQU1FLCBvbGRFamJOYW1lLCBlamJOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWROYW1lKCkgewotCQlyZXR1cm4gbWFwcGVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyBuZXdNYXBwZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRNYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLQkJbWFwcGVkTmFtZSA9IG5ld01hcHBlZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19NQVBQRURfTkFNRSwgb2xkTWFwcGVkTmFtZSwgbWFwcGVkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG9tZSgpIHsKLQkJcmV0dXJuIGhvbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9tZShTdHJpbmcgbmV3SG9tZSkgewotCQlTdHJpbmcgb2xkSG9tZSA9IGhvbWU7Ci0JCWhvbWUgPSBuZXdIb21lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSE9NRSwgb2xkSG9tZSwgaG9tZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlKCkgewotCQlyZXR1cm4gcmVtb3RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZShTdHJpbmcgbmV3UmVtb3RlKSB7Ci0JCVN0cmluZyBvbGRSZW1vdGUgPSByZW1vdGU7Ci0JCXJlbW90ZSA9IG5ld1JlbW90ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFTU9URSwgb2xkUmVtb3RlLCByZW1vdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsSG9tZSgpIHsKLQkJcmV0dXJuIGxvY2FsSG9tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEhvbWUoU3RyaW5nIG5ld0xvY2FsSG9tZSkgewotCQlTdHJpbmcgb2xkTG9jYWxIb21lID0gbG9jYWxIb21lOwotCQlsb2NhbEhvbWUgPSBuZXdMb2NhbEhvbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTF9IT01FLCBvbGRMb2NhbEhvbWUsIGxvY2FsSG9tZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWwoKSB7Ci0JCXJldHVybiBsb2NhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbChTdHJpbmcgbmV3TG9jYWwpIHsKLQkJU3RyaW5nIG9sZExvY2FsID0gbG9jYWw7Ci0JCWxvY2FsID0gbmV3TG9jYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTCwgb2xkTG9jYWwsIGxvY2FsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QnVzaW5lc3NMb2NhbHMoKSB7Ci0JCWlmIChidXNpbmVzc0xvY2FscyA9PSBudWxsKSB7Ci0JCQlidXNpbmVzc0xvY2FscyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19CVVNJTkVTU19MT0NBTFMpOwotCQl9Ci0JCXJldHVybiBidXNpbmVzc0xvY2FsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRCdXNpbmVzc1JlbW90ZXMoKSB7Ci0JCWlmIChidXNpbmVzc1JlbW90ZXMgPT0gbnVsbCkgewotCQkJYnVzaW5lc3NSZW1vdGVzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JVU0lORVNTX1JFTU9URVMpOwotCQl9Ci0JCXJldHVybiBidXNpbmVzc1JlbW90ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50KFN0cmluZyBuZXdTZXJ2aWNlRW5kcG9pbnQpIHsKLQkJU3RyaW5nIG9sZFNlcnZpY2VFbmRwb2ludCA9IHNlcnZpY2VFbmRwb2ludDsKLQkJc2VydmljZUVuZHBvaW50ID0gbmV3U2VydmljZUVuZHBvaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VSVklDRV9FTkRQT0lOVCwgb2xkU2VydmljZUVuZHBvaW50LCBzZXJ2aWNlRW5kcG9pbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVqYkNsYXNzKCkgewotCQlyZXR1cm4gZWpiQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiQ2xhc3MoU3RyaW5nIG5ld0VqYkNsYXNzKSB7Ci0JCVN0cmluZyBvbGRFamJDbGFzcyA9IGVqYkNsYXNzOwotCQllamJDbGFzcyA9IG5ld0VqYkNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX0NMQVNTLCBvbGRFamJDbGFzcywgZWpiQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvblR5cGUgZ2V0U2Vzc2lvblR5cGUoKSB7Ci0JCXJldHVybiBzZXNzaW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uVHlwZShTZXNzaW9uVHlwZSBuZXdTZXNzaW9uVHlwZSkgewotCQlTZXNzaW9uVHlwZSBvbGRTZXNzaW9uVHlwZSA9IHNlc3Npb25UeXBlOwotCQlzZXNzaW9uVHlwZSA9IG5ld1Nlc3Npb25UeXBlID09IG51bGwgPyBTRVNTSU9OX1RZUEVfRURFRkFVTFQgOiBuZXdTZXNzaW9uVHlwZTsKLQkJYm9vbGVhbiBvbGRTZXNzaW9uVHlwZUVTZXQgPSBzZXNzaW9uVHlwZUVTZXQ7Ci0JCXNlc3Npb25UeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVNTSU9OX1RZUEUsIG9sZFNlc3Npb25UeXBlLCBzZXNzaW9uVHlwZSwgIW9sZFNlc3Npb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U2Vzc2lvblR5cGUoKSB7Ci0JCVNlc3Npb25UeXBlIG9sZFNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7Ci0JCWJvb2xlYW4gb2xkU2Vzc2lvblR5cGVFU2V0ID0gc2Vzc2lvblR5cGVFU2V0OwotCQlzZXNzaW9uVHlwZSA9IFNFU1NJT05fVFlQRV9FREVGQVVMVDsKLQkJc2Vzc2lvblR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRSwgb2xkU2Vzc2lvblR5cGUsIFNFU1NJT05fVFlQRV9FREVGQVVMVCwgb2xkU2Vzc2lvblR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTZXNzaW9uVHlwZSgpIHsKLQkJcmV0dXJuIHNlc3Npb25UeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZWRNZXRob2RUeXBlIGdldFRpbWVvdXRNZXRob2QoKSB7Ci0JCXJldHVybiB0aW1lb3V0TWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRpbWVvdXRNZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld1RpbWVvdXRNZXRob2QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTmFtZWRNZXRob2RUeXBlIG9sZFRpbWVvdXRNZXRob2QgPSB0aW1lb3V0TWV0aG9kOwotCQl0aW1lb3V0TWV0aG9kID0gbmV3VGltZW91dE1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9ELCBvbGRUaW1lb3V0TWV0aG9kLCBuZXdUaW1lb3V0TWV0aG9kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0TWV0aG9kKE5hbWVkTWV0aG9kVHlwZSBuZXdUaW1lb3V0TWV0aG9kKSB7Ci0JCWlmIChuZXdUaW1lb3V0TWV0aG9kICE9IHRpbWVvdXRNZXRob2QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRpbWVvdXRNZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGltZW91dE1ldGhvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19USU1FT1VUX01FVEhPRCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VGltZW91dE1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUaW1lb3V0TWV0aG9kKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRpbWVvdXRNZXRob2QobmV3VGltZW91dE1ldGhvZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0QsIG5ld1RpbWVvdXRNZXRob2QsIG5ld1RpbWVvdXRNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbml0TWV0aG9kcygpIHsKLQkJaWYgKGluaXRNZXRob2RzID09IG51bGwpIHsKLQkJCWluaXRNZXRob2RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluaXRNZXRob2RUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSU5JVF9NRVRIT0RTKTsKLQkJfQotCQlyZXR1cm4gaW5pdE1ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVtb3ZlTWV0aG9kcygpIHsKLQkJaWYgKHJlbW92ZU1ldGhvZHMgPT0gbnVsbCkgewotCQkJcmVtb3ZlTWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZW1vdmVNZXRob2RUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFMpOwotCQl9Ci0JCXJldHVybiByZW1vdmVNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUgbmV3VHJhbnNhY3Rpb25UeXBlKSB7Ci0JCVRyYW5zYWN0aW9uVHlwZSBvbGRUcmFuc2FjdGlvblR5cGUgPSB0cmFuc2FjdGlvblR5cGU7Ci0JCXRyYW5zYWN0aW9uVHlwZSA9IG5ld1RyYW5zYWN0aW9uVHlwZSA9PSBudWxsID8gVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCA6IG5ld1RyYW5zYWN0aW9uVHlwZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblR5cGVFU2V0ID0gdHJhbnNhY3Rpb25UeXBlRVNldDsKLQkJdHJhbnNhY3Rpb25UeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFLCBvbGRUcmFuc2FjdGlvblR5cGUsIHRyYW5zYWN0aW9uVHlwZSwgIW9sZFRyYW5zYWN0aW9uVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblR5cGVFU2V0ID0gdHJhbnNhY3Rpb25UeXBlRVNldDsKLQkJdHJhbnNhY3Rpb25UeXBlID0gVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVDsKLQkJdHJhbnNhY3Rpb25UeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFLCBvbGRUcmFuc2FjdGlvblR5cGUsIFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQsIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXJvdW5kSW52b2tlcygpIHsKLQkJaWYgKGFyb3VuZEludm9rZXMgPT0gbnVsbCkgewotCQkJYXJvdW5kSW52b2tlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBcm91bmRJbnZva2VUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQVJPVU5EX0lOVk9LRVMpOwotCQl9Ci0JCXJldHVybiBhcm91bmRJbnZva2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVudkVudHJpZXMoKSB7Ci0JCWlmIChlbnZFbnRyaWVzID09IG51bGwpIHsKLQkJCWVudkVudHJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRW52RW50cnkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FTlZfRU5UUklFUyk7Ci0JCX0KLQkJcmV0dXJuIGVudkVudHJpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RWpiUmVmcygpIHsKLQkJaWYgKGVqYlJlZnMgPT0gbnVsbCkgewotCQkJZWpiUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYlJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RWpiTG9jYWxSZWZzKCkgewotCQlpZiAoZWpiTG9jYWxSZWZzID09IG51bGwpIHsKLQkJCWVqYkxvY2FsUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJMb2NhbFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9MT0NBTF9SRUZTKTsKLQkJfQotCQlyZXR1cm4gZWpiTG9jYWxSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZpY2VSZWZzKCkgewotCQlpZiAoc2VydmljZVJlZnMgPT0gbnVsbCkgewotCQkJc2VydmljZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFUlZJQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlUmVmcygpIHsKLQkJaWYgKHJlc291cmNlUmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlRW52UmVmcygpIHsKLQkJaWYgKHJlc291cmNlRW52UmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUVudlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VFbnZSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRW52UmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKLQkJaWYgKHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXRSZWZzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbmNlVW5pdFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpIHsKLQkJaWYgKHBvc3RDb25zdHJ1Y3RzID09IG51bGwpIHsKLQkJCXBvc3RDb25zdHJ1Y3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUE9TVF9DT05TVFJVQ1RTKTsKLQkJfQotCQlyZXR1cm4gcG9zdENvbnN0cnVjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJlRGVzdHJveXMoKSB7Ci0JCWlmIChwcmVEZXN0cm95cyA9PSBudWxsKSB7Ci0JCQlwcmVEZXN0cm95cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUyk7Ci0JCX0KLQkJcmV0dXJuIHByZURlc3Ryb3lzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBvc3RBY3RpdmF0ZXMoKSB7Ci0JCWlmIChwb3N0QWN0aXZhdGVzID09IG51bGwpIHsKLQkJCXBvc3RBY3RpdmF0ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0FDVElWQVRFUyk7Ci0JCX0KLQkJcmV0dXJuIHBvc3RBY3RpdmF0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJlUGFzc2l2YXRlcygpIHsKLQkJaWYgKHByZVBhc3NpdmF0ZXMgPT0gbnVsbCkgewotCQkJcHJlUGFzc2l2YXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9QQVNTSVZBVEVTKTsKLQkJfQotCQlyZXR1cm4gcHJlUGFzc2l2YXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWN1cml0eVJvbGVSZWZzKCkgewotCQlpZiAoc2VjdXJpdHlSb2xlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZWN1cml0eVJvbGVSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHlUeXBlIGdldFNlY3VyaXR5SWRlbnRpdGllcygpIHsKLQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZWN1cml0eUlkZW50aXRpZXMoU2VjdXJpdHlJZGVudGl0eVR5cGUgbmV3U2VjdXJpdHlJZGVudGl0aWVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlY3VyaXR5SWRlbnRpdHlUeXBlIG9sZFNlY3VyaXR5SWRlbnRpdGllcyA9IHNlY3VyaXR5SWRlbnRpdGllczsKLQkJc2VjdXJpdHlJZGVudGl0aWVzID0gbmV3U2VjdXJpdHlJZGVudGl0aWVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfSURFTlRJVElFUywgb2xkU2VjdXJpdHlJZGVudGl0aWVzLCBuZXdTZWN1cml0eUlkZW50aXRpZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3VyaXR5SWRlbnRpdGllcyhTZWN1cml0eUlkZW50aXR5VHlwZSBuZXdTZWN1cml0eUlkZW50aXRpZXMpIHsKLQkJaWYgKG5ld1NlY3VyaXR5SWRlbnRpdGllcyAhPSBzZWN1cml0eUlkZW50aXRpZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlY3VyaXR5SWRlbnRpdGllcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZWN1cml0eUlkZW50aXRpZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfSURFTlRJVElFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U2VjdXJpdHlJZGVudGl0aWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlY3VyaXR5SWRlbnRpdGllcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRUNVUklUWV9JREVOVElUSUVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdGllcyhuZXdTZWN1cml0eUlkZW50aXRpZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRJRVMsIG5ld1NlY3VyaXR5SWRlbnRpdGllcywgbmV3U2VjdXJpdHlJZGVudGl0aWVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9EOgotCQkJCXJldHVybiBiYXNpY1NldFRpbWVvdXRNZXRob2QobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JTklUX01FVEhPRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0TWV0aG9kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRU1PVkVfTUVUSE9EUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlbW92ZU1ldGhvZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBcm91bmRJbnZva2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW52RW50cmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJMb2NhbFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQb3N0Q29uc3RydWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcmVEZXN0cm95cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0FDVElWQVRFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvc3RBY3RpdmF0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX1BBU1NJVkFURVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcmVQYXNzaXZhdGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5Um9sZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfSURFTlRJVElFUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZWN1cml0eUlkZW50aXRpZXMobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX05BTUU6Ci0JCQkJcmV0dXJuIGdldEVqYk5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX01BUFBFRF9OQU1FOgotCQkJCXJldHVybiBnZXRNYXBwZWROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19IT01FOgotCQkJCXJldHVybiBnZXRIb21lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRU1PVEU6Ci0JCQkJcmV0dXJuIGdldFJlbW90ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTE9DQUxfSE9NRToKLQkJCQlyZXR1cm4gZ2V0TG9jYWxIb21lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTDoKLQkJCQlyZXR1cm4gZ2V0TG9jYWwoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JVU0lORVNTX0xPQ0FMUzoKLQkJCQlyZXR1cm4gZ2V0QnVzaW5lc3NMb2NhbHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JVU0lORVNTX1JFTU9URVM6Ci0JCQkJcmV0dXJuIGdldEJ1c2luZXNzUmVtb3RlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VSVklDRV9FTkRQT0lOVDoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEVqYkNsYXNzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVNTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFNlc3Npb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19USU1FT1VUX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0VGltZW91dE1ldGhvZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSU5JVF9NRVRIT0RTOgotCQkJCXJldHVybiBnZXRJbml0TWV0aG9kcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldFJlbW92ZU1ldGhvZHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJcmV0dXJuIGdldEFyb3VuZEludm9rZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiBnZXRFbnZFbnRyaWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuIGdldFBvc3RDb25zdHJ1Y3RzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuIGdldFByZURlc3Ryb3lzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0FDVElWQVRFUzoKLQkJCQlyZXR1cm4gZ2V0UG9zdEFjdGl2YXRlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX1BBU1NJVkFURVM6Ci0JCQkJcmV0dXJuIGdldFByZVBhc3NpdmF0ZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfSURFTlRJVElFUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlJZGVudGl0aWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9OQU1FOgotCQkJCXNldEVqYk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTUFQUEVEX05BTUU6Ci0JCQkJc2V0TWFwcGVkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19IT01FOgotCQkJCXNldEhvbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1RFOgotCQkJCXNldFJlbW90ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTF9IT01FOgotCQkJCXNldExvY2FsSG9tZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTDoKLQkJCQlzZXRMb2NhbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19CVVNJTkVTU19MT0NBTFM6Ci0JCQkJZ2V0QnVzaW5lc3NMb2NhbHMoKS5jbGVhcigpOwotCQkJCWdldEJ1c2luZXNzTG9jYWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19CVVNJTkVTU19SRU1PVEVTOgotCQkJCWdldEJ1c2luZXNzUmVtb3RlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QnVzaW5lc3NSZW1vdGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVJWSUNFX0VORFBPSU5UOgotCQkJCXNldFNlcnZpY2VFbmRwb2ludCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJc2V0RWpiQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VTU0lPTl9UWVBFOgotCQkJCXNldFNlc3Npb25UeXBlKChTZXNzaW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0Q6Ci0JCQkJc2V0VGltZW91dE1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JTklUX01FVEhPRFM6Ci0JCQkJZ2V0SW5pdE1ldGhvZHMoKS5jbGVhcigpOwotCQkJCWdldEluaXRNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRU1PVkVfTUVUSE9EUzoKLQkJCQlnZXRSZW1vdmVNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZW1vdmVNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFOgotCQkJCXNldFRyYW5zYWN0aW9uVHlwZSgoVHJhbnNhY3Rpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlnZXRBcm91bmRJbnZva2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRBcm91bmRJbnZva2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FTlZfRU5UUklFUzoKLQkJCQlnZXRFbnZFbnRyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZFbnRyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfUkVGUzoKLQkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYkxvY2FsUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQUNUSVZBVEVTOgotCQkJCWdldFBvc3RBY3RpdmF0ZXMoKS5jbGVhcigpOwotCQkJCWdldFBvc3RBY3RpdmF0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9QQVNTSVZBVEVTOgotCQkJCWdldFByZVBhc3NpdmF0ZXMoKS5jbGVhcigpOwotCQkJCWdldFByZVBhc3NpdmF0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRUNVUklUWV9JREVOVElUSUVTOgotCQkJCXNldFNlY3VyaXR5SWRlbnRpdGllcygoU2VjdXJpdHlJZGVudGl0eVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9OQU1FOgotCQkJCXNldEVqYk5hbWUoRUpCX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX01BUFBFRF9OQU1FOgotCQkJCXNldE1hcHBlZE5hbWUoTUFQUEVEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0hPTUU6Ci0JCQkJc2V0SG9tZShIT01FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRU1PVEU6Ci0JCQkJc2V0UmVtb3RlKFJFTU9URV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTE9DQUxfSE9NRToKLQkJCQlzZXRMb2NhbEhvbWUoTE9DQUxfSE9NRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTE9DQUw6Ci0JCQkJc2V0TG9jYWwoTE9DQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JVU0lORVNTX0xPQ0FMUzoKLQkJCQlnZXRCdXNpbmVzc0xvY2FscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUzoKLQkJCQlnZXRCdXNpbmVzc1JlbW90ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFUlZJQ0VfRU5EUE9JTlQ6Ci0JCQkJc2V0U2VydmljZUVuZHBvaW50KFNFUlZJQ0VfRU5EUE9JTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlzZXRFamJDbGFzcyhFSkJfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRToKLQkJCQl1bnNldFNlc3Npb25UeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0Q6Ci0JCQkJc2V0VGltZW91dE1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUzoKLQkJCQlnZXRJbml0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFM6Ci0JCQkJZ2V0UmVtb3ZlTWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQl1bnNldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FST1VORF9JTlZPS0VTOgotCQkJCWdldEFyb3VuZEludm9rZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VOVl9FTlRSSUVTOgotCQkJCWdldEVudkVudHJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUE9TVF9BQ1RJVkFURVM6Ci0JCQkJZ2V0UG9zdEFjdGl2YXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX1BBU1NJVkFURVM6Ci0JCQkJZ2V0UHJlUGFzc2l2YXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRJRVM6Ci0JCQkJc2V0U2VjdXJpdHlJZGVudGl0aWVzKChTZWN1cml0eUlkZW50aXR5VHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX05BTUU6Ci0JCQkJcmV0dXJuIEVKQl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlamJOYW1lICE9IG51bGwgOiAhRUpCX05BTUVfRURFRkFVTFQuZXF1YWxzKGVqYk5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTUFQUEVEX05BTUU6Ci0JCQkJcmV0dXJuIE1BUFBFRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWROYW1lICE9IG51bGwgOiAhTUFQUEVEX05BTUVfRURFRkFVTFQuZXF1YWxzKG1hcHBlZE5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSE9NRToKLQkJCQlyZXR1cm4gSE9NRV9FREVGQVVMVCA9PSBudWxsID8gaG9tZSAhPSBudWxsIDogIUhPTUVfRURFRkFVTFQuZXF1YWxzKGhvbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1RFOgotCQkJCXJldHVybiBSRU1PVEVfRURFRkFVTFQgPT0gbnVsbCA/IHJlbW90ZSAhPSBudWxsIDogIVJFTU9URV9FREVGQVVMVC5lcXVhbHMocmVtb3RlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0xPQ0FMX0hPTUU6Ci0JCQkJcmV0dXJuIExPQ0FMX0hPTUVfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsSG9tZSAhPSBudWxsIDogIUxPQ0FMX0hPTUVfRURFRkFVTFQuZXF1YWxzKGxvY2FsSG9tZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTDoKLQkJCQlyZXR1cm4gTE9DQUxfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsICE9IG51bGwgOiAhTE9DQUxfRURFRkFVTFQuZXF1YWxzKGxvY2FsKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JVU0lORVNTX0xPQ0FMUzoKLQkJCQlyZXR1cm4gYnVzaW5lc3NMb2NhbHMgIT0gbnVsbCAmJiAhYnVzaW5lc3NMb2NhbHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUzoKLQkJCQlyZXR1cm4gYnVzaW5lc3NSZW1vdGVzICE9IG51bGwgJiYgIWJ1c2luZXNzUmVtb3Rlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVJWSUNFX0VORFBPSU5UOgotCQkJCXJldHVybiBTRVJWSUNFX0VORFBPSU5UX0VERUZBVUxUID09IG51bGwgPyBzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbCA6ICFTRVJWSUNFX0VORFBPSU5UX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlRW5kcG9pbnQpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX0NMQVNTOgotCQkJCXJldHVybiBFSkJfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGVqYkNsYXNzICE9IG51bGwgOiAhRUpCX0NMQVNTX0VERUZBVUxULmVxdWFscyhlamJDbGFzcyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVNTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0U2Vzc2lvblR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9EOgotCQkJCXJldHVybiB0aW1lb3V0TWV0aG9kICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JTklUX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGluaXRNZXRob2RzICE9IG51bGwgJiYgIWluaXRNZXRob2RzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFTU9WRV9NRVRIT0RTOgotCQkJCXJldHVybiByZW1vdmVNZXRob2RzICE9IG51bGwgJiYgIXJlbW92ZU1ldGhvZHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FST1VORF9JTlZPS0VTOgotCQkJCXJldHVybiBhcm91bmRJbnZva2VzICE9IG51bGwgJiYgIWFyb3VuZEludm9rZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuIGVudkVudHJpZXMgIT0gbnVsbCAmJiAhZW52RW50cmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZWpiUmVmcyAhPSBudWxsICYmICFlamJSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCXJldHVybiBlamJMb2NhbFJlZnMgIT0gbnVsbCAmJiAhZWpiTG9jYWxSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gc2VydmljZVJlZnMgIT0gbnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VSZWZzICE9IG51bGwgJiYgIXJlc291cmNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzICE9IG51bGwgJiYgIXJlc291cmNlRW52UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9uUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgIT0gbnVsbCAmJiAhcGVyc2lzdGVuY2VDb250ZXh0UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZnMgIT0gbnVsbCAmJiAhcGVyc2lzdGVuY2VVbml0UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzICE9IG51bGwgJiYgIXBvc3RDb25zdHJ1Y3RzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gcHJlRGVzdHJveXMgIT0gbnVsbCAmJiAhcHJlRGVzdHJveXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUE9TVF9BQ1RJVkFURVM6Ci0JCQkJcmV0dXJuIHBvc3RBY3RpdmF0ZXMgIT0gbnVsbCAmJiAhcG9zdEFjdGl2YXRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QUkVfUEFTU0lWQVRFUzoKLQkJCQlyZXR1cm4gcHJlUGFzc2l2YXRlcyAhPSBudWxsICYmICFwcmVQYXNzaXZhdGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmcyAhPSBudWxsICYmICFzZWN1cml0eVJvbGVSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRJRVM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdGllcyAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaG9tZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChob21lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1vdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmVtb3RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2NhbEhvbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobG9jYWxIb21lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2NhbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsb2NhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYnVzaW5lc3NMb2NhbHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYnVzaW5lc3NMb2NhbHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJ1c2luZXNzUmVtb3RlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChidXNpbmVzc1JlbW90ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcnZpY2VFbmRwb2ludDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlRW5kcG9pbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVqYkNsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVqYkNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXNzaW9uVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlc3Npb25UeXBlRVNldCkgcmVzdWx0LmFwcGVuZChzZXNzaW9uVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgdHJhbnNhY3Rpb25UeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodHJhbnNhY3Rpb25UeXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0cmFuc2FjdGlvblR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2Vzc2lvbkJlYW5JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvbWV0YWRhdGEvRWpiUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvbWV0YWRhdGEvRWpiUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzQ3NTM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL21ldGFkYXRhL0VqYlBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FamJGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogICAgICAgQCgjKWVqYi1qYXJfM18wLnhzZHMJMS41MSAwMi8yMy8wNgotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBqYXZhZWUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogICAgICAgCi0gKiAKLSAqIAlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgRUpCIDMuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gKiAJVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkICJNRVRBLUlORi9lamItamFyLnhtbCIgaW4KLSAqIAl0aGUgRUpCJ3MgamFyIGZpbGUuICBBbGwgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZQotICogCXRoZSBlamItamFyIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0gKiAKLSAqIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAqIAotICogCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLSAqIAl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotICogCi0gKiAJICAgICZsdDtlamItamFyIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gKiAJICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAqIAkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICogCQkgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMC54c2QiCi0gKiAJICAgICAgdmVyc2lvbj0iMy4wIiZndDsKLSAqIAkgICAgICAuLi4KLSAqIAkgICAgJmx0Oy9lamItamFyJmd0OwotICogCi0gKiAJVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0gKiAJdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgdGhlCi0gKiAJSmF2YSBFRSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotICogCi0gKiAJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZAotICogCi0gKiAJCi0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICogICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotICogCi0gKiAgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gKiAJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAqIAl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAqIAlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICogCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICogCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfNS54c2RzCTEuNjUgMDYvMDIvMTcKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAKLSAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgotICogc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCi0gKiBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6Ci0gKiAKLSAqIERlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBqMmVlIGFwcGxpY2F0aW9uOwotICogICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKLSAqICAgICB3ZWIgYXBwbGljYXRpb247Ci0gKiAgICAgZW50ZXJwcmlzZSBiZWFuOwotICogICAgIHJlc291cmNlIGFkYXB0ZXI7Ci0gKiAKLSAqIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgZWFyIGZpbGU7Ci0gKiAgICAgd2FyIGZpbGU7Ci0gKiAgICAgamFyIGZpbGU7Ci0gKiAgICAgcmFyIGZpbGU7Ci0gKiAKLSAqIAotICogCi0gKiAgICAgICBAKCMpamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZHMJMS4xOSAwMi8xMy8wNgotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLSAqIAotICogICAgIAotICogCi0gKiAgICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gKiAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KLSAqIAotICogICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCi0gKiAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgCi0gKiAKLSAqICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQKLSAqICAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUKLSAqICAgICBmb2xsb3dpbmcgbmFtZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFuZCBzaG91bGQKLSAqICAgICBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZyBHcm91cCwKLSAqICAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZToKLSAqIAotICogICAgIGJhc2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkKLSAqICAgICAgICAgIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoIGl0Ci0gKiAgICAgICAgICBhcHBlYXJzOyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBpZCAgIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4KLSAqICAgICAgICAgIFRoZSB4bWw6aWQgc3BlY2lmaWNhdGlvbiBpcyBub3QgeWV0IGEgVzNDIFJlY29tbWVuZGF0aW9uLAotICogICAgICAgICAgYnV0IHRoaXMgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGhlcmUgdG8gZmFjaWxpdGF0ZSBleHBlcmltZW50YXRpb24KLSAqICAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQKLSAqICAgICAgICAgIGluIHRoZSBzcGVjaWFsQXR0cnMgYXR0cmlidXRlIGdyb3VwLgotICogCi0gKiAgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgotICogICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAgIAotICogICAgIHNwYWNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlCi0gKiAgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZwotICogICAgICAgICAgZGlzY2lwbGluZSBpcyBpbnRlbmRlZCBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQ7IGl0cwotICogICAgICAgICAgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IHZpcnR1ZSBvZiBpdHMKLSAqICAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgRmF0aGVyIChpbiBhbnkgY29udGV4dCBhdCBhbGwpOiBkZW5vdGVzIEpvbiBCb3NhaywgdGhlIGNoYWlyIG9mIAotICogICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IAotICogICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNpc2lvbiBvZiB0aGUgVzNDIFhNTCBQbGVuYXJ5IGFuZCAKLSAqICAgICAgICAgIFhNTCBDb29yZGluYXRpb24gZ3JvdXBzOgotICogCi0gKiAgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCi0gKiAgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQotICogICAgICAgICAgICAgIHhtbDpGYXRoZXIKLSAqICAgCi0gKiBUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICogICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gKiAgICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcsIHhtbDpzcGFjZSBvciB4bWw6aWQKLSAqICAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KLSAqIAotICogICAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYQotICogICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKLSAqICAgICAgICAgJmx0O3NjaGVtYSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICogICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8mZ3Q7Ci0gKiAKLSAqICAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICogICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCi0gKiAKLSAqICAgICAgICAgJmx0O3R5cGUgLiAuIC4mZ3Q7Ci0gKiAgICAgICAgICAuIC4gLgotICogICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OwotICogIAotICogICAgICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlCi0gKiAgICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMKLSAqIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKLSAqICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2QuCi0gKiAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkLgotICogICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKLSAqICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTCBTY2hlbWEKLSAqICAgIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTAotICogICAgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIHdpbGwgY2hhbmdlCi0gKiAgICBhY2NvcmRpbmdseTsgdGhlIHZlcnNpb24gYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuCi0gKiAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FamJGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWpiUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJlamIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gImVqYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWpiUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnSW1wbCA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEFjdGl2YXRpb25Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUcgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFkgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwgPGVtPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXBwbGljYXRpb25FeGNlcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0VYQ0VQVElPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjZXB0aW9uIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fRVhDRVBUSU9OX19FWENFUFRJT05fQ0xBU1MgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGxiYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fRVhDRVBUSU9OX19ST0xMQkFDSyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9FWENFUFRJT05fX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fRVhDRVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFyb3VuZEludm9rZVR5cGVJbXBsIDxlbT5Bcm91bmQgSW52b2tlIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFyb3VuZEludm9rZVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEFyb3VuZEludm9rZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJPVU5EX0lOVk9LRV9UWVBFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFST1VORF9JTlZPS0VfVFlQRV9fQ0xBU1MgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJPVU5EX0lOVk9LRV9UWVBFX19NRVRIT0RfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXJvdW5kIEludm9rZSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFST1VORF9JTlZPS0VfVFlQRV9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3NlbWJseURlc2NyaXB0b3JJbXBsIDxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3NlbWJseURlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQZXJtaXNzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXIgVHJhbnNhY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19DT05UQUlORVJfVFJBTlNBQ1RJT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBCaW5kaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9fSU5URVJDRVBUT1JfQklORElOR1MgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBMaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNUID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbiBFeGNlcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19BUFBMSUNBVElPTl9FWENFUFRJT05TID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX0lEID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ01QRmllbGRJbXBsIDxlbT5DTVAgRmllbGQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNNUEZpZWxkSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDTVBGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDTVBfRklFTEQgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0ZJRUxEX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfRklFTERfX0ZJRUxEX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0ZJRUxEX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q01QIEZpZWxkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9GSUVMRF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVJGaWVsZEltcGwgPGVtPkNNUiBGaWVsZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ01SRmllbGRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENNUkZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENNUl9GSUVMRCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q21yIEZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0NNUl9GSUVMRF9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbXIgRmllbGQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fQ01SX0ZJRUxEX1RZUEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q01SIEZpZWxkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsIDxlbT5Db250YWluZXIgVHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEUgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX01FVEhPRFMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zIEF0dHJpYnV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19UUkFOU19BVFRSSUJVVEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250YWluZXIgVHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsIDxlbT5FSkIgSmFyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVKQkphcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFSkJfSkFSID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fRElTUExBWV9OQU1FUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfX0lDT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRlcnByaXNlIEJlYW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fSU5URVJDRVBUT1JTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGlvbnNoaXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fUkVMQVRJT05TSElQUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZW1ibHkgRGVzY3JpcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBDbGllbnQgSmFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVIgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fSUQgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fTUVUQURBVEFfQ09NUExFVEUgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19WRVJTSU9OID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RUpCIEphcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX0ZFQVRVUkVfQ09VTlQgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPkVKQiBKYXIgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgSmFyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0VKQl9KQVIgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVKQiBKYXIgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uSW1wbCA8ZW0+RUpCIFJlbGF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RUpCUmVsYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlbGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTl9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVsYXRpb25zaGlwIFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTlNISVBfUk9MRVMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OX19JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCA8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRSA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWxhdGlvbnNoaXAgUm9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19FSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFkgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgRGVsZXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0UgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNtciBGaWVsZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9fSUQgPSA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVKQiBSZWxhdGlvbnNoaXAgUm9sZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfRkVBVFVSRV9DT1VOVCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50ZXJwcmlzZUJlYW5zSW1wbCA8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50ZXJwcmlzZUJlYW5zSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFbnRlcnByaXNlQmVhbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOUyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5TX19HUk9VUCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vzc2lvbiBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOU19fU0VTU0lPTl9CRUFOUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IEJlYW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5TX19FTlRJVFlfQkVBTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRHJpdmVuIEJlYW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5TX19NRVNTQUdFX0RSSVZFTl9CRUFOUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5TX19JRCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5TX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsIDxlbT5FbnRpdHkgQmVhbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTiA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX0RJU1BMQVlfTkFNRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fSUNPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX0VKQl9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19NQVBQRURfTkFNRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19IT01FID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fUkVNT1RFID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX0xPQ0FMX0hPTUUgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX0xPQ0FMID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fRUpCX0NMQVNTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1RZUEUgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltIEtleSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19QUklNX0tFWV9DTEFTUyA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZW50cmFudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19SRUVOVFJBTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbXAgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19DTVBfVkVSU0lPTiA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0IFNjaGVtYSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX0FCU1RSQUNUX1NDSEVNQV9OQU1FID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q21wIEZpZWxkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX0NNUF9GSUVMRFMgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcmlta2V5IEZpZWxkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX1BSSU1LRVlfRklFTEQgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX0JFQU5fX0VOVl9FTlRSSUVTID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19FSkJfUkVGUyA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fRUpCX0xPQ0FMX1JFRlMgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19TRVJWSUNFX1JFRlMgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fUkVTT1VSQ0VfUkVGUyA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19QT1NUX0NPTlNUUlVDVFMgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19QUkVfREVTVFJPWVMgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMgPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWSA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9CRUFOX19RVUVSSUVTID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9fSUQgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbnRpdHkgQmVhbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfQkVBTl9GRUFUVVJFX0NPVU5UID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRXhjbHVkZUxpc3RJbXBsIDxlbT5FeGNsdWRlIExpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkV4Y2x1ZGVMaXN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFeGNsdWRlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWENMVURFX0xJU1QgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWENMVURFX0xJU1RfX01FVEhPRFMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhDTFVERV9MSVNUX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXhjbHVkZSBMaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQ0xVREVfTElTVF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Jbml0TWV0aG9kVHlwZUltcGwgPGVtPkluaXQgTWV0aG9kIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkluaXRNZXRob2RUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRJbml0TWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTklUX01FVEhPRF9UWVBFID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRlIE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOSVRfTUVUSE9EX1RZUEVfX0NSRUFURV9NRVRIT0QgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJlYW4gTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5JVF9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5JVF9NRVRIT0RfVFlQRV9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkluaXQgTWV0aG9kIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5JVF9NRVRIT0RfVFlQRV9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCA8ZW0+SW50ZXJjZXB0b3IgQmluZGluZyBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRSA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FSkJfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3IgQ2xhc3NlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBPcmRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfT1JERVIgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBJbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VYQ0xVREVfREVGQVVMVF9JTlRFUkNFUFRPUlMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0NMQVNTX0lOVEVSQ0VQVE9SUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19NRVRIT0QgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JRCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3IgQmluZGluZyBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9GRUFUVVJFX0NPVU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvck9yZGVyVHlwZUltcGwgPGVtPkludGVyY2VwdG9yIE9yZGVyIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yT3JkZXJUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRJbnRlcmNlcHRvck9yZGVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9PUkRFUl9UWVBFID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3IgQ2xhc3NlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3IgT3JkZXIgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9PUkRFUl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yc1R5cGVJbXBsIDxlbT5JbnRlcmNlcHRvcnMgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JzVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0SW50ZXJjZXB0b3JzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUlNfVFlQRSA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JTX1RZUEVfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUlNfVFlQRV9fSU5URVJDRVBUT1JTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SU19UWVBFX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3JzIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JTX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCA8ZW0+SW50ZXJjZXB0b3IgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRJbnRlcmNlcHRvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRSA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bcm91bmQgSW52b2tlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX0lOVk9LRVMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19FTlZfRU5UUklFUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX0VKQl9SRUZTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fRUpCX0xPQ0FMX1JFRlMgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fU0VSVklDRV9SRUZTID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9SRUZTID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfRU5WX1JFRlMgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19QT1NUX0NPTlNUUlVDVFMgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX1BSRV9ERVNUUk9ZUyA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgQWN0aXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19QT1NUX0FDVElWQVRFUyA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBQYXNzaXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19QUkVfUEFTU0lWQVRFUyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fSUQgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbnRlcmNlcHRvciBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCA8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU4gPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fRElTUExBWV9OQU1FUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX0lDT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX01BUFBFRF9OQU1FID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfQ0xBU1MgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2luZyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHSU5HX1RZUEUgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWVvdXQgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRU9VVF9NRVRIT0QgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEUgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fTElOSyA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fQUNUSVZBVElPTl9DT05GSUcgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bcm91bmQgSW52b2tlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX0lOVk9LRVMgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fRU5WX0VOVFJJRVMgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX1JFRlMgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0xPQ0FMX1JFRlMgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFUlZJQ0VfUkVGUyA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX1JFRlMgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fUFJFX0RFU1RST1lTID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgSWRlbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9JREVOVElUWSA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fSUQgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXNzYWdlIERyaXZlbiBCZWFuPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fRkVBVFVSRV9DT1VOVCA9IDI2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBhcmFtc0ltcGwgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBhcmFtc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9QQVJBTVMgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFyYW1zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFSQU1TX19NRVRIT0RfUEFSQU1TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQVJBTVNfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQVJBTVNfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGVybWlzc2lvbkltcGwgPGVtPk1ldGhvZCBQZXJtaXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQZXJtaXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RQZXJtaXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9QRVJNSVNTSU9OID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fUk9MRV9OQU1FUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5jaGVja2VkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRFMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fX0lEID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgUGVybWlzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RUeXBlSW1wbCA8ZW0+TWV0aG9kIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1RZUEUgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9UWVBFX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1RZUEVfX0VKQl9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgSW50ZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9UWVBFX19NRVRIT0RfSU5URiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVFlQRV9fTUVUSE9EX05BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVFlQRV9fSUQgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9UWVBFX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk5hbWVkTWV0aG9kVHlwZUltcGwgPGVtPk5hbWVkIE1ldGhvZCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5OYW1lZE1ldGhvZFR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE5hbWVkTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FRF9NRVRIT0RfVFlQRSA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfTUVUSE9EX1RZUEVfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OYW1lZCBNZXRob2QgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9NRVRIT0RfVFlQRV9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeUltcGwgPGVtPlF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUVVFUlkgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFVRVJZX19ERVNDUklQVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UXVlcnkgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfX1FVRVJZX01FVEhPRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdWx0IFR5cGUgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFVRVJZX19SRVNVTFRfVFlQRV9NQVBQSU5HID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRVUVSWV9fRUpCX1FMID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFVRVJZX19JRCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UXVlcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlNZXRob2RJbXBsIDxlbT5RdWVyeSBNZXRob2Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5TWV0aG9kSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRRdWVyeU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBRVUVSWV9NRVRIT0QgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFVRVJZX01FVEhPRF9fTUVUSE9EX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRVUVSWV9NRVRIT0RfX01FVEhPRF9QQVJBTVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UXVlcnkgTWV0aG9kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFVRVJZX01FVEhPRF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUltcGwgPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEUgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0VKQl9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVsYXRpb25zaGlwc0ltcGwgPGVtPlJlbGF0aW9uc2hpcHM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcHNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlbGF0aW9uc2hpcHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQUyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVsYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUFNfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZWxhdGlvbnNoaXBzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUFNfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVtb3ZlTWV0aG9kVHlwZUltcGwgPGVtPlJlbW92ZSBNZXRob2QgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVtb3ZlTWV0aG9kVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UmVtb3ZlTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRU1PVkVfTUVUSE9EX1RZUEUgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CZWFuIE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldGFpbiBJZiBFeGNlcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRU1PVkVfTUVUSE9EX1RZUEVfX1JFVEFJTl9JRl9FWENFUFRJT04gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVNT1ZFX01FVEhPRF9UWVBFX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVtb3ZlIE1ldGhvZCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFTU9WRV9NRVRIT0RfVFlQRV9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUlkZW50aXR5VHlwZUltcGwgPGVtPlNlY3VyaXR5IElkZW50aXR5IFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRUNVUklUWV9JREVOVElUWV9UWVBFID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9JREVOVElUWV9UWVBFX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9JREVOVElUWV9UWVBFX19VU0VfQ0FMTEVSX0lERU5USVRZID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SdW4gQXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9JREVOVElUWV9UWVBFX19SVU5fQVMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlY3VyaXR5IElkZW50aXR5IFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwgPGVtPlNlc3Npb24gQmVhbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTiA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19ERVNDUklQVElPTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fRElTUExBWV9OQU1FUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fSUNPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19FSkJfTkFNRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX01BUFBFRF9OQU1FID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19IT01FID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1JFTU9URSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgSG9tZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fTE9DQUxfSE9NRSA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0xPQ0FMID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CdXNpbmVzcyBMb2NhbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fQlVTSU5FU1NfTE9DQUxTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CdXNpbmVzcyBSZW1vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0JVU0lORVNTX1JFTU9URVMgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19TRVJWSUNFX0VORFBPSU5UID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19FSkJfQ0xBU1MgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWVvdXQgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19USU1FT1VUX01FVEhPRCA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXQgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19JTklUX01FVEhPRFMgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1vdmUgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19SRU1PVkVfTUVUSE9EUyA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bcm91bmQgSW52b2tlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19BUk9VTkRfSU5WT0tFUyA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0VOVl9FTlRSSUVTID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fRUpCX1JFRlMgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19FSkJfTE9DQUxfUkVGUyA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19TRVJWSUNFX1JFRlMgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1JFU09VUkNFX1JFRlMgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgQ29uc3RydWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19QT1NUX0NPTlNUUlVDVFMgPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fUFJFX0RFU1RST1lTID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBBY3RpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9fUE9TVF9BQ1RJVkFURVMgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUGFzc2l2YXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19QUkVfUEFTU0lWQVRFUyA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19TRUNVUklUWV9JREVOVElUSUVTID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0lEID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2Vzc2lvbiBCZWFuPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQkVBTl9GRUFUVVJFX0NPVU5UID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlIDxlbT5DbXAgVmVyc2lvbiBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDbXBWZXJzaW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDTVBfVkVSU0lPTl9UWVBFID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkVHlwZSA8ZW0+Q01SIEZpZWxkIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDTVJGaWVsZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX1RZUEUgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kSW50ZXJmYWNlVHlwZSA8ZW0+TWV0aG9kIEludGVyZmFjZSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RJbnRlcmZhY2VUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1ldGhvZEludGVyZmFjZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0lOVEVSRkFDRV9UWVBFID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGUgPGVtPk11bHRpcGxpY2l0eSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NdWx0aXBsaWNpdHlUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE11bHRpcGxpY2l0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTVVMVElQTElDSVRZX1RZUEUgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUGVyc2lzdGVuY2VUeXBlIDxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5QZXJzaXN0ZW5jZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBFUlNJU1RFTkNFX1RZUEUgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRSZXN1bHRUeXBlTWFwcGluZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVTVUxUX1RZUEVfTUFQUElOR19UWVBFID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFNlc3Npb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFU1NJT05fVFlQRSA9IDM4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUUkFOU0FDVElPTl9UWVBFID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNtcCBWZXJzaW9uIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ21wVmVyc2lvblR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q21wVmVyc2lvblR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ01QX1ZFUlNJT05fVFlQRV9PQkpFQ1QgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q01SIEZpZWxkIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENNUkZpZWxkVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDTVJfRklFTERfVFlQRV9PQkpFQ1QgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q2xhc3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RWpiQ2xhc3NUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVKQl9DTEFTU19UWVBFID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RWpiTmFtZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUpCX05BTUVfVFlQRSA9IDQ0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NZXRob2QgSW50ZXJmYWNlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kSW50ZXJmYWNlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9JTlRFUkZBQ0VfVFlQRV9PQkpFQ1QgPSA0NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWV0aG9kIE5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kTmFtZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX05BTUVfVFlQRSA9IDQ2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NdWx0aXBsaWNpdHkgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NdWx0aXBsaWNpdHlUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE11bHRpcGxpY2l0eVR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTVVMVElQTElDSVRZX1RZUEVfT0JKRUNUID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUGVyc2lzdGVuY2VUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFBlcnNpc3RlbmNlVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQRVJTSVNURU5DRV9UWVBFX09CSkVDVCA9IDQ4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlc3VsdFR5cGVNYXBwaW5nVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVNVTFRfVFlQRV9NQVBQSU5HX1RZUEVfT0JKRUNUID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlNlc3Npb24gVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRTZXNzaW9uVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVNTSU9OX1RZUEVfT0JKRUNUID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEVfT0JKRUNUID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRyYW5zYWN0aW9uVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUUkFOU0FDVElPTl9UWVBFX09CSkVDVCA9IDUyOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFjdGl2YXRpb25Db25maWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZhdGlvbkNvbmZpZ19BY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZhdGlvbkNvbmZpZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCkKLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldElkKCkKLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24gPGVtPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXBwbGljYXRpb25FeGNlcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jZ2V0RXhjZXB0aW9uQ2xhc3MgPGVtPkV4Y2VwdGlvbiBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2VwdGlvbiBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uI2dldEV4Y2VwdGlvbkNsYXNzKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fRXhjZXB0aW9uQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jaXNSb2xsYmFjayA8ZW0+Um9sbGJhY2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Sb2xsYmFjazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uI2lzUm9sbGJhY2soKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9Sb2xsYmFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uI2dldElkKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGUgPGVtPkFyb3VuZCBJbnZva2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Bcm91bmQgSW52b2tlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcm91bmRJbnZva2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGUjZ2V0Q2xhc3NfIDxlbT5DbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZSNnZXRDbGFzc18oKQotCSAqIEBzZWUgI2dldEFyb3VuZEludm9rZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFyb3VuZEludm9rZVR5cGVfQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZSNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZSNnZXRNZXRob2ROYW1lKCkKLQkgKiBAc2VlICNnZXRBcm91bmRJbnZva2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcm91bmRJbnZva2VUeXBlX01ldGhvZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0U2VjdXJpdHlSb2xlcyA8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldFNlY3VyaXR5Um9sZXMoKQotCSAqIEBzZWUgI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0TWV0aG9kUGVybWlzc2lvbnMgPGVtPk1ldGhvZCBQZXJtaXNzaW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBlcm1pc3Npb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldE1ldGhvZFBlcm1pc3Npb25zKCkKLQkgKiBAc2VlICNnZXRBc3NlbWJseURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRDb250YWluZXJUcmFuc2FjdGlvbnMgPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25zKCkKLQkgKiBAc2VlICNnZXRBc3NlbWJseURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9Db250YWluZXJUcmFuc2FjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncyA8ZW0+SW50ZXJjZXB0b3IgQmluZGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyY2VwdG9yIEJpbmRpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldEludGVyY2VwdG9yQmluZGluZ3MoKQotCSAqIEBzZWUgI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0ludGVyY2VwdG9yQmluZGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBzZWUgI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldEV4Y2x1ZGVMaXN0IDxlbT5FeGNsdWRlIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FeGNsdWRlIExpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0RXhjbHVkZUxpc3QoKQotCSAqIEBzZWUgI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9ucyA8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKQotCSAqIEBzZWUgI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0FwcGxpY2F0aW9uRXhjZXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVBGaWVsZCA8ZW0+Q01QIEZpZWxkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNNUCBGaWVsZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDTVBGaWVsZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVBGaWVsZCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldENNUEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDTVBGaWVsZF9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkI2dldEZpZWxkTmFtZSgpCi0JICogQHNlZSAjZ2V0Q01QRmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENNUEZpZWxkX0ZpZWxkTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVBGaWVsZCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkI2dldElkKCkKLQkgKiBAc2VlICNnZXRDTVBGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q01QRmllbGRfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkIDxlbT5DTVIgRmllbGQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q01SIEZpZWxkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENNUkZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0Q01SRmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENNUkZpZWxkX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCNnZXRDbXJGaWVsZE5hbWUgPGVtPkNtciBGaWVsZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q21yIEZpZWxkIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZCNnZXRDbXJGaWVsZE5hbWUoKQotCSAqIEBzZWUgI2dldENNUkZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDTVJGaWVsZF9DbXJGaWVsZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0Q21yRmllbGRUeXBlIDxlbT5DbXIgRmllbGQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNtciBGaWVsZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0Q21yRmllbGRUeXBlKCkKLQkgKiBAc2VlICNnZXRDTVJGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q01SRmllbGRfQ21yRmllbGRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQjZ2V0SWQoKQotCSAqIEBzZWUgI2dldENNUkZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDTVJGaWVsZF9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlIDxlbT5Db250YWluZXIgVHJhbnNhY3Rpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250YWluZXIgVHJhbnNhY3Rpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0TWV0aG9kcyA8ZW0+TWV0aG9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSNnZXRNZXRob2RzKCkKLQkgKiBAc2VlICNnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9NZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSNnZXRUcmFuc0F0dHJpYnV0ZSA8ZW0+VHJhbnMgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnMgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlI2dldFRyYW5zQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9UcmFuc0F0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIgPGVtPkVKQiBKYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RUpCIEphcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RUpCSmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFSkJKYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQkphcl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJfRGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0SWNvbnMoKQotCSAqIEBzZWUgI2dldEVKQkphcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCSmFyX0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRFbnRlcnByaXNlQmVhbnMgPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEVudGVycHJpc2VCZWFucygpCi0JICogQHNlZSAjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRJbnRlcmNlcHRvcnMgPGVtPkludGVyY2VwdG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkludGVyY2VwdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI2dldEVKQkphcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCSmFyX0ludGVyY2VwdG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0UmVsYXRpb25zaGlwcyA8ZW0+UmVsYXRpb25zaGlwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlbGF0aW9uc2hpcHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0UmVsYXRpb25zaGlwcygpCi0JICogQHNlZSAjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJfUmVsYXRpb25zaGlwcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yIDxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRBc3NlbWJseURlc2NyaXB0b3IoKQotCSAqIEBzZWUgI2dldEVKQkphcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RWpiQ2xpZW50SmFyIDxlbT5FamIgQ2xpZW50IEphcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBDbGllbnQgSmFyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldEVqYkNsaWVudEphcigpCi0JICogQHNlZSAjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJKYXJfRWpiQ2xpZW50SmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJKYXJfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2dldEVKQkphcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCSmFyX01ldGFkYXRhQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldEVKQkphcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCSmFyX1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yIDxlbT5FSkIgSmFyIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FSkIgSmFyIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRNaXhlZCgpCi0JICogQHNlZSAjZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAc2VlICNnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRFamJKYXIgPGVtPkVqYiBKYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FamIgSmFyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0RWpiSmFyKCkKLQkgKiBAc2VlICNnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfRWpiSmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiA8ZW0+RUpCIFJlbGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVKQiBSZWxhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFSkJSZWxhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEVKQlJlbGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb24jZ2V0RWpiUmVsYXRpb25OYW1lIDxlbT5FamIgUmVsYXRpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBSZWxhdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb24jZ2V0RWpiUmVsYXRpb25OYW1lKCkKLQkgKiBAc2VlICNnZXRFSkJSZWxhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25fRWpiUmVsYXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb24jZ2V0RWpiUmVsYXRpb25zaGlwUm9sZXMgPGVtPkVqYiBSZWxhdGlvbnNoaXAgUm9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVqYiBSZWxhdGlvbnNoaXAgUm9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiNnZXRFamJSZWxhdGlvbnNoaXBSb2xlcygpCi0JICogQHNlZSAjZ2V0RUpCUmVsYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb24jZ2V0SWQoKQotCSAqIEBzZWUgI2dldEVKQlJlbGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSA8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVKQiBSZWxhdGlvbnNoaXAgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRFamJSZWxhdGlvbnNoaXBSb2xlTmFtZSA8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgUmVsYXRpb25zaGlwIFJvbGUgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0RWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKQotCSAqIEBzZWUgI2dldEVKQlJlbGF0aW9uc2hpcFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRNdWx0aXBsaWNpdHkgPGVtPk11bHRpcGxpY2l0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk11bHRpcGxpY2l0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX011bHRpcGxpY2l0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldENhc2NhZGVEZWxldGUgPGVtPkNhc2NhZGUgRGVsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldENhc2NhZGVEZWxldGUoKQotCSAqIEBzZWUgI2dldEVKQlJlbGF0aW9uc2hpcFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2UgPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZSgpCi0JICogQHNlZSAjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9SZWxhdGlvbnNoaXBSb2xlU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0Q21yRmllbGQgPGVtPkNtciBGaWVsZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNtciBGaWVsZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0Q21yRmllbGQoKQotCSAqIEBzZWUgI2dldEVKQlJlbGF0aW9uc2hpcFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEVKQlJlbGF0aW9uc2hpcFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyA8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFbnRlcnByaXNlQmVhbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZUJlYW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRlcnByaXNlQmVhbnNfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0U2Vzc2lvbkJlYW5zIDxlbT5TZXNzaW9uIEJlYW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXNzaW9uIEJlYW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zI2dldFNlc3Npb25CZWFucygpCi0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZUJlYW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbnNfU2Vzc2lvbkJlYW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zI2dldEVudGl0eUJlYW5zIDxlbT5FbnRpdHkgQmVhbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVudGl0eSBCZWFuczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFucyNnZXRFbnRpdHlCZWFucygpCi0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZUJlYW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbnNfRW50aXR5QmVhbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0TWVzc2FnZURyaXZlbkJlYW5zIDxlbT5NZXNzYWdlIERyaXZlbiBCZWFuczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMjZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkKLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlQmVhbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuc19NZXNzYWdlRHJpdmVuQmVhbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zI2dldElkKCkKLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlQmVhbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGVycHJpc2VCZWFuc19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiA8ZW0+RW50aXR5IEJlYW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW50aXR5IEJlYW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFbnRpdHlCZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEljb25zKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiTmFtZSgpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9FamJOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0TWFwcGVkTmFtZSgpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9NYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0SG9tZSA8ZW0+SG9tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhvbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEhvbWUoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fSG9tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFJlbW90ZSA8ZW0+UmVtb3RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtb3RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRSZW1vdGUoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fUmVtb3RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0TG9jYWxIb21lIDxlbT5Mb2NhbCBIb21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWwgSG9tZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0TG9jYWxIb21lKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0xvY2FsSG9tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldExvY2FsIDxlbT5Mb2NhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2FsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRMb2NhbCgpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW50aXR5QmVhbl9Mb2NhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEVqYkNsYXNzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0VqYkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VUeXBlIDxlbT5QZXJzaXN0ZW5jZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX1BlcnNpc3RlbmNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFByaW1LZXlDbGFzcyA8ZW0+UHJpbSBLZXkgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmltIEtleSBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UHJpbUtleUNsYXNzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX1ByaW1LZXlDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWVudHJhbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2lzUmVlbnRyYW50KCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX1JlZW50cmFudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldENtcFZlcnNpb24gPGVtPkNtcCBWZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q21wIFZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldENtcFZlcnNpb24oKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fQ21wVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEFic3RyYWN0U2NoZW1hTmFtZSA8ZW0+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BYnN0cmFjdCBTY2hlbWEgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0Fic3RyYWN0U2NoZW1hTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0Q21wRmllbGRzIDxlbT5DbXAgRmllbGRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DbXAgRmllbGRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRDbXBGaWVsZHMoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fQ21wRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UHJpbWtleUZpZWxkIDxlbT5Qcmlta2V5IEZpZWxkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJpbWtleSBGaWVsZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UHJpbWtleUZpZWxkKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX1ByaW1rZXlGaWVsZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVudiBFbnRyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRFbnZFbnRyaWVzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0VudkVudHJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiUmVmcygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9FamJSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0RWpiTG9jYWxSZWZzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0VqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRTZXJ2aWNlUmVmcygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9TZXJ2aWNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRSZXNvdXJjZVJlZnMoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fUmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1Jlc291cmNlRW52UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQb3N0Q29uc3RydWN0cygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9Qb3N0Q29uc3RydWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRQcmVEZXN0cm95cygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9QcmVEZXN0cm95cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0U2VjdXJpdHlSb2xlUmVmcyA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFNlY3VyaXR5Um9sZVJlZnMoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fU2VjdXJpdHlSb2xlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFNlY3VyaXR5SWRlbnRpdHkgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFNlY3VyaXR5SWRlbnRpdHkoKQotCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fU2VjdXJpdHlJZGVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UXVlcmllcyA8ZW0+UXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UXVlcmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UXVlcmllcygpCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9RdWVyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldElkKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlCZWFuX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdCA8ZW0+RXhjbHVkZSBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeGNsdWRlTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEV4Y2x1ZGVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdCNnZXRNZXRob2RzIDxlbT5NZXRob2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRXhjbHVkZUxpc3QjZ2V0TWV0aG9kcygpCi0JICogQHNlZSAjZ2V0RXhjbHVkZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV4Y2x1ZGVMaXN0X01ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRXhjbHVkZUxpc3QjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0RXhjbHVkZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4Y2x1ZGVMaXN0X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZSA8ZW0+SW5pdCBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Jbml0IE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEluaXRNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlI2dldENyZWF0ZU1ldGhvZCA8ZW0+Q3JlYXRlIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNyZWF0ZSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZSNnZXRDcmVhdGVNZXRob2QoKQotCSAqIEBzZWUgI2dldEluaXRNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbml0TWV0aG9kVHlwZV9DcmVhdGVNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGUjZ2V0QmVhbk1ldGhvZCA8ZW0+QmVhbiBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5CZWFuIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlI2dldEJlYW5NZXRob2QoKQotCSAqIEBzZWUgI2dldEluaXRNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbml0TWV0aG9kVHlwZV9CZWFuTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEluaXRNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbml0TWV0aG9kVHlwZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSA8ZW0+SW50ZXJjZXB0b3IgQmluZGluZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkludGVyY2VwdG9yIEJpbmRpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRFamJOYW1lKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0VqYk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldEludGVyY2VwdG9yQ2xhc3NlcyA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3NlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW50ZXJjZXB0b3IgQ2xhc3NlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0ludGVyY2VwdG9yQ2xhc3NlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldEludGVyY2VwdG9yT3JkZXIgPGVtPkludGVyY2VwdG9yIE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW50ZXJjZXB0b3IgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldEludGVyY2VwdG9yT3JkZXIoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSW50ZXJjZXB0b3JPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2lzRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBJbnRlcmNlcHRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNpc0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0V4Y2x1ZGVEZWZhdWx0SW50ZXJjZXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjaXNFeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMgPGVtPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBDbGFzcyBJbnRlcmNlcHRvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2lzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSNnZXRNZXRob2QoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvckJpbmRpbmdUeXBlI2dldElkKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvck9yZGVyVHlwZSA8ZW0+SW50ZXJjZXB0b3IgT3JkZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlcmNlcHRvciBPcmRlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEludGVyY2VwdG9yT3JkZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGUjZ2V0SW50ZXJjZXB0b3JDbGFzc2VzIDxlbT5JbnRlcmNlcHRvciBDbGFzc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbnRlcmNlcHRvciBDbGFzc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGUjZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvck9yZGVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yT3JkZXJUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGUjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yT3JkZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvck9yZGVyVHlwZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZSA8ZW0+SW50ZXJjZXB0b3JzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW50ZXJjZXB0b3JzIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJbnRlcmNlcHRvcnNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yc1R5cGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZSNnZXRJbnRlcmNlcHRvcnMgPGVtPkludGVyY2VwdG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJjZXB0b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JzVHlwZSNnZXRJbnRlcmNlcHRvcnMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yc1R5cGVfSW50ZXJjZXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yc1R5cGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvcnNUeXBlI2dldElkKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvcnNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvcnNUeXBlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUgPGVtPkludGVyY2VwdG9yIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW50ZXJjZXB0b3IgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW50ZXJjZXB0b3JUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEludGVyY2VwdG9yQ2xhc3MgPGVtPkludGVyY2VwdG9yIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW50ZXJjZXB0b3IgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0SW50ZXJjZXB0b3JDbGFzcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbnRlcmNlcHRvclR5cGVfSW50ZXJjZXB0b3JDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRBcm91bmRJbnZva2VzIDxlbT5Bcm91bmQgSW52b2tlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXJvdW5kIEludm9rZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0QXJvdW5kSW52b2tlcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfQXJvdW5kSW52b2tlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW52IEVudHJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0RW52RW50cmllcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfRW52RW50cmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0RWpiUmVmcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfRWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRFamJMb2NhbFJlZnMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1NlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRSZXNvdXJjZVJlZnMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1Jlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRSZXNvdXJjZUVudlJlZnMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1Jlc291cmNlRW52UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UG9zdENvbnN0cnVjdHMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZSBEZXN0cm95czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQcmVEZXN0cm95cygpCi0JICogQHNlZSAjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUHJlRGVzdHJveXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UG9zdEFjdGl2YXRlcyA8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBvc3QgQWN0aXZhdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFBvc3RBY3RpdmF0ZXMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RBY3RpdmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UHJlUGFzc2l2YXRlcyA8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZSBQYXNzaXZhdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldFByZVBhc3NpdmF0ZXMoKQotCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1ByZVBhc3NpdmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldElkKCkKLQkgKiBAc2VlICNnZXRJbnRlcmNlcHRvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEludGVyY2VwdG9yVHlwZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4gPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXNzYWdlRHJpdmVuQmVhbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkljb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0SWNvbnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9JY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RWpiTmFtZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1hcHBlZE5hbWUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9NYXBwZWROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRFamJDbGFzcygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2luZ1R5cGUgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNZXNzYWdpbmdUeXBlKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnaW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUaW1lb3V0TWV0aG9kIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0VGltZW91dE1ldGhvZCgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1RpbWVvdXRNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1RyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRBY3RpdmF0aW9uQ29uZmlnIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0FjdGl2YXRpb25Db25maWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRBcm91bmRJbnZva2VzIDxlbT5Bcm91bmQgSW52b2tlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXJvdW5kIEludm9rZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRBcm91bmRJbnZva2VzKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fQXJvdW5kSW52b2tlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnYgRW50cmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVudkVudHJpZXMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9FbnZFbnRyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVqYiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RWpiUmVmcygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVqYkxvY2FsUmVmcygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRSZXNvdXJjZVJlZnMgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRSZXNvdXJjZVJlZnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFJlc291cmNlRW52UmVmcygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Jlc291cmNlRW52UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFBvc3RDb25zdHJ1Y3RzKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fUG9zdENvbnN0cnVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmUgRGVzdHJveXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRQcmVEZXN0cm95cygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1ByZURlc3Ryb3lzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFNlY3VyaXR5SWRlbnRpdHkgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRTZWN1cml0eUlkZW50aXR5KCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VjdXJpdHlJZGVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldElkKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGFyYW1zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQYXJhbXMjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGFyYW1zI2dldE1ldGhvZFBhcmFtcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQYXJhbXNfTWV0aG9kUGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBhcmFtcyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBhcmFtcyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQYXJhbXNfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24gPGVtPk1ldGhvZCBQZXJtaXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBQZXJtaXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kUGVybWlzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQZXJtaXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0Um9sZU5hbWVzIDxlbT5Sb2xlIE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2xlIE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXRSb2xlTmFtZXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBlcm1pc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBlcm1pc3Npb25fUm9sZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0VW5jaGVja2VkIDxlbT5VbmNoZWNrZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5VbmNoZWNrZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldFVuY2hlY2tlZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGVybWlzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldE1ldGhvZHMgPGVtPk1ldGhvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldE1ldGhvZHMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBlcm1pc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGVybWlzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGVybWlzc2lvbl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSA8ZW0+TWV0aG9kIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFR5cGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0RWpiTmFtZSA8ZW0+RWpiIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0RWpiTmFtZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVHlwZV9FamJOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kSW50ZiA8ZW0+TWV0aG9kIEludGY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRob2QgSW50ZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kSW50ZigpCi0JICogQHNlZSAjZ2V0TWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVHlwZV9NZXRob2RJbnRmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kTmFtZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVHlwZV9NZXRob2ROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZFR5cGUjZ2V0TWV0aG9kUGFyYW1zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RUeXBlX01ldGhvZFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kVHlwZSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVHlwZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlIDxlbT5OYW1lZCBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lZCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TmFtZWRNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZSNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlI2dldE1ldGhvZE5hbWUoKQotCSAqIEBzZWUgI2dldE5hbWVkTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TmFtZWRNZXRob2RUeXBlX01ldGhvZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGUjZ2V0TWV0aG9kUGFyYW1zKCkKLQkgKiBAc2VlICNnZXROYW1lZE1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE5hbWVkTWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlI2dldElkKCkKLQkgKiBAc2VlICNnZXROYW1lZE1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE5hbWVkTWV0aG9kVHlwZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkgPGVtPlF1ZXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlF1ZXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFF1ZXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRRdWVyeV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSNnZXRRdWVyeU1ldGhvZCA8ZW0+UXVlcnkgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UXVlcnkgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0UXVlcnlNZXRob2QoKQotCSAqIEBzZWUgI2dldFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRRdWVyeV9RdWVyeU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSNnZXRSZXN1bHRUeXBlTWFwcGluZyA8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VsdCBUeXBlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSNnZXRSZXN1bHRUeXBlTWFwcGluZygpCi0JICogQHNlZSAjZ2V0UXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFF1ZXJ5X1Jlc3VsdFR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldEVqYlFsIDxlbT5FamIgUWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FamIgUWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeSNnZXRFamJRbCgpCi0JICogQHNlZSAjZ2V0UXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFF1ZXJ5X0VqYlFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5I2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRRdWVyeV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2QgPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UXVlcnlNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2QjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kI2dldE1ldGhvZE5hbWUoKQotCSAqIEBzZWUgI2dldFF1ZXJ5TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRRdWVyeU1ldGhvZF9NZXRob2ROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZCNnZXRNZXRob2RQYXJhbXMoKQotCSAqIEBzZWUgI2dldFF1ZXJ5TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRRdWVyeU1ldGhvZF9NZXRob2RQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnlNZXRob2QjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UXVlcnlNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFF1ZXJ5TWV0aG9kX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSA8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSNnZXRFamJOYW1lKCkKLQkgKiBAc2VlICNnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRWpiTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlI2dldElkKCkKLQkgKiBAc2VlICNnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMgPGVtPlJlbGF0aW9uc2hpcHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJlbGF0aW9uc2hpcHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBzI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBzI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UmVsYXRpb25zaGlwcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBzI2dldEVqYlJlbGF0aW9ucyA8ZW0+RWpiIFJlbGF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIFJlbGF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMjZ2V0RWpiUmVsYXRpb25zKCkKLQkgKiBAc2VlICNnZXRSZWxhdGlvbnNoaXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBzI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwcyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UmVsYXRpb25zaGlwcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVsYXRpb25zaGlwc19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZSA8ZW0+UmVtb3ZlIE1ldGhvZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlbW92ZSBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJlbW92ZU1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZSNnZXRCZWFuTWV0aG9kIDxlbT5CZWFuIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkJlYW4gTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZSNnZXRCZWFuTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRSZW1vdmVNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZW1vdmVNZXRob2RUeXBlX0JlYW5NZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZSNpc1JldGFpbklmRXhjZXB0aW9uIDxlbT5SZXRhaW4gSWYgRXhjZXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmV0YWluIElmIEV4Y2VwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbW92ZU1ldGhvZFR5cGUjaXNSZXRhaW5JZkV4Y2VwdGlvbigpCi0JICogQHNlZSAjZ2V0UmVtb3ZlTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVtb3ZlTWV0aG9kVHlwZV9SZXRhaW5JZkV4Y2VwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UmVtb3ZlTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVtb3ZlTWV0aG9kVHlwZV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGUgPGVtPlNlY3VyaXR5IElkZW50aXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5SWRlbnRpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGUjZ2V0VXNlQ2FsbGVySWRlbnRpdHkgPGVtPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGUjZ2V0VXNlQ2FsbGVySWRlbnRpdHkoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5SWRlbnRpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9Vc2VDYWxsZXJJZGVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXRSdW5BcyA8ZW0+UnVuIEFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UnVuIEFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGUjZ2V0UnVuQXMoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5SWRlbnRpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9SdW5BcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlI2dldElkKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIDxlbT5TZXNzaW9uIEJlYW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2Vzc2lvbiBCZWFuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlc3Npb25CZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRJY29ucygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJOYW1lKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fRWpiTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0TWFwcGVkTmFtZSgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX01hcHBlZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0SG9tZSA8ZW0+SG9tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhvbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRIb21lKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fSG9tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRSZW1vdGUgPGVtPlJlbW90ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbW90ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFJlbW90ZSgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX1JlbW90ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRMb2NhbEhvbWUgPGVtPkxvY2FsIEhvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0TG9jYWxIb21lKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fTG9jYWxIb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldExvY2FsIDxlbT5Mb2NhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2FsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0TG9jYWwoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9Mb2NhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEJ1c2luZXNzTG9jYWxzIDxlbT5CdXNpbmVzcyBMb2NhbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkJ1c2luZXNzIExvY2FsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEJ1c2luZXNzTG9jYWxzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fQnVzaW5lc3NMb2NhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRCdXNpbmVzc1JlbW90ZXMgPGVtPkJ1c2luZXNzIFJlbW90ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkJ1c2luZXNzIFJlbW90ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRCdXNpbmVzc1JlbW90ZXMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9CdXNpbmVzc1JlbW90ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VydmljZUVuZHBvaW50IDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlcnZpY2VFbmRwb2ludCgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX1NlcnZpY2VFbmRwb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJDbGFzcyA8ZW0+RWpiIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RWpiQ2xhc3MoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9FamJDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZXNzaW9uVHlwZSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2Vzc2lvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9TZXNzaW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRUaW1lb3V0TWV0aG9kIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0VGltZW91dE1ldGhvZCgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1RpbWVvdXRNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRJbml0TWV0aG9kcyA8ZW0+SW5pdCBNZXRob2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Jbml0IE1ldGhvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRJbml0TWV0aG9kcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0luaXRNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UmVtb3ZlTWV0aG9kcyA8ZW0+UmVtb3ZlIE1ldGhvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlbW92ZSBNZXRob2RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UmVtb3ZlTWV0aG9kcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1JlbW92ZU1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX1RyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bcm91bmQgSW52b2tlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEFyb3VuZEludm9rZXMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Bcm91bmRJbnZva2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVudiBFbnRyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RW52RW50cmllcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0VudkVudHJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJSZWZzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RWpiTG9jYWxSZWZzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRWpiTG9jYWxSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VydmljZVJlZnMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9TZXJ2aWNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFJlc291cmNlUmVmcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1Jlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UG9zdENvbnN0cnVjdHMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Qb3N0Q29uc3RydWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZSBEZXN0cm95czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFByZURlc3Ryb3lzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUHJlRGVzdHJveXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQb3N0QWN0aXZhdGVzIDxlbT5Qb3N0IEFjdGl2YXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQb3N0QWN0aXZhdGVzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUG9zdEFjdGl2YXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFByZVBhc3NpdmF0ZXMgPGVtPlByZSBQYXNzaXZhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmUgUGFzc2l2YXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFByZVBhc3NpdmF0ZXMoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9QcmVQYXNzaXZhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VjdXJpdHlSb2xlUmVmcyA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZWN1cml0eVJvbGVSZWZzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fU2VjdXJpdHlSb2xlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTZWN1cml0eUlkZW50aXRpZXMgPGVtPlNlY3VyaXR5IElkZW50aXRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TZWN1cml0eSBJZGVudGl0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VjdXJpdHlJZGVudGl0aWVzKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fU2VjdXJpdHlJZGVudGl0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZSA8ZW0+Q21wIFZlcnNpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkNtcCBWZXJzaW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRDbXBWZXJzaW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZFR5cGUgPGVtPkNNUiBGaWVsZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Q01SIEZpZWxkIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0Q01SRmllbGRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGUgPGVtPk1ldGhvZCBJbnRlcmZhY2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPk1ldGhvZCBJbnRlcmZhY2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0TWV0aG9kSW50ZXJmYWNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NdWx0aXBsaWNpdHlUeXBlIDxlbT5NdWx0aXBsaWNpdHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPk11bHRpcGxpY2l0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTXVsdGlwbGljaXR5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRNdWx0aXBsaWNpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZSA8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlBlcnNpc3RlbmNlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5QZXJzaXN0ZW5jZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0UGVyc2lzdGVuY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZSA8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFJlc3VsdFR5cGVNYXBwaW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+U2Vzc2lvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0U2Vzc2lvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIDxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlIDxlbT5DbXAgVmVyc2lvbiBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q21wIFZlcnNpb24gVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q21wVmVyc2lvblR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZFR5cGUgPGVtPkNNUiBGaWVsZCBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q01SIEZpZWxkIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDTVJGaWVsZFR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5DbGFzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5DbGFzcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RWpiQ2xhc3NUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFamJOYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGUgPGVtPk1ldGhvZCBJbnRlcmZhY2UgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk1ldGhvZCBJbnRlcmZhY2UgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RJbnRlcmZhY2VUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRNZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TWV0aG9kIE5hbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TWV0aG9kIE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE1ldGhvZE5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTXVsdGlwbGljaXR5VHlwZSA8ZW0+TXVsdGlwbGljaXR5IFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5NdWx0aXBsaWNpdHkgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NdWx0aXBsaWNpdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRNdWx0aXBsaWNpdHlUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUGVyc2lzdGVuY2VUeXBlIDxlbT5QZXJzaXN0ZW5jZSBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UGVyc2lzdGVuY2UgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5QZXJzaXN0ZW5jZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFBlcnNpc3RlbmNlVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZSA8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZyBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZyBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvblR5cGUgPGVtPlNlc3Npb24gVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlNlc3Npb24gVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U2Vzc2lvblR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVkFUSU9OX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWQVRJT05fQ09ORklHX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25Db25maWdfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZBVElPTl9DT05GSUdfX0lEID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25Db25maWdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfTkFNRSA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19JRCA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXBwbGljYXRpb25FeGNlcHRpb25JbXBsIDxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRXhjZXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QXBwbGljYXRpb25FeGNlcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVBQTElDQVRJT05fRVhDRVBUSU9OID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNlcHRpb24gQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9FWENFUFRJT05fX0VYQ0VQVElPTl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9FeGNlcHRpb25DbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sbGJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9FWENFUFRJT05fX1JPTExCQUNLID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRXhjZXB0aW9uX1JvbGxiYWNrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSUQgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXJvdW5kSW52b2tlVHlwZUltcGwgPGVtPkFyb3VuZCBJbnZva2UgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXJvdW5kSW52b2tlVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEFyb3VuZEludm9rZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJPVU5EX0lOVk9LRV9UWVBFID0gZUlOU1RBTkNFLmdldEFyb3VuZEludm9rZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJPVU5EX0lOVk9LRV9UWVBFX19DTEFTUyA9IGVJTlNUQU5DRS5nZXRBcm91bmRJbnZva2VUeXBlX0NsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFST1VORF9JTlZPS0VfVFlQRV9fTUVUSE9EX05BTUUgPSBlSU5TVEFOQ0UuZ2V0QXJvdW5kSW52b2tlVHlwZV9NZXRob2ROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzc2VtYmx5RGVzY3JpcHRvckltcGwgPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzc2VtYmx5RGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEFzc2VtYmx5RGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBU1NFTUJMWV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTID0gZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGVybWlzc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUyA9IGVJTlNUQU5DRS5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lciBUcmFuc2FjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX0NPTlRBSU5FUl9UUkFOU0FDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0NvbnRhaW5lclRyYW5zYWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3IgQmluZGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX0lOVEVSQ0VQVE9SX0JJTkRJTkdTID0gZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9JbnRlcmNlcHRvckJpbmRpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgTGlzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCA9IGVJTlNUQU5DRS5nZXRBc3NlbWJseURlc2NyaXB0b3JfRXhjbHVkZUxpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0VYQ0VQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0FwcGxpY2F0aW9uRXhjZXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBU1NFTUJMWV9ERVNDUklQVE9SX19JRCA9IGVJTlNUQU5DRS5nZXRBc3NlbWJseURlc2NyaXB0b3JfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ01QRmllbGRJbXBsIDxlbT5DTVAgRmllbGQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNNUEZpZWxkSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q01QRmllbGQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ01QX0ZJRUxEID0gZUlOU1RBTkNFLmdldENNUEZpZWxkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENNUF9GSUVMRF9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldENNUEZpZWxkX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENNUF9GSUVMRF9fRklFTERfTkFNRSA9IGVJTlNUQU5DRS5nZXRDTVBGaWVsZF9GaWVsZE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ01QX0ZJRUxEX19JRCA9IGVJTlNUQU5DRS5nZXRDTVBGaWVsZF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVJGaWVsZEltcGwgPGVtPkNNUiBGaWVsZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ01SRmllbGRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDTVJGaWVsZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDTVJfRklFTEQgPSBlSU5TVEFOQ0UuZ2V0Q01SRmllbGQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ01SX0ZJRUxEX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0Q01SRmllbGRfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbXIgRmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENNUl9GSUVMRF9fQ01SX0ZJRUxEX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q01SRmllbGRfQ21yRmllbGROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbXIgRmllbGQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENNUl9GSUVMRF9fQ01SX0ZJRUxEX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q01SRmllbGRfQ21yRmllbGRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENNUl9GSUVMRF9fSUQgPSBlSU5TVEFOQ0UuZ2V0Q01SRmllbGRfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlSW1wbCA8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fTUVUSE9EUyA9IGVJTlNUQU5DRS5nZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfTWV0aG9kcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJhbnMgQXR0cmlidXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX1RSQU5TX0FUVFJJQlVURSA9IGVJTlNUQU5DRS5nZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfVHJhbnNBdHRyaWJ1dGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsIDxlbT5FSkIgSmFyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJKYXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUpCX0pBUiA9IGVJTlNUQU5DRS5nZXRFSkJKYXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0pBUl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEVKQkphcl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9KQVJfX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX0Rpc3BsYXlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9KQVJfX0lDT05TID0gZUlOU1RBTkNFLmdldEVKQkphcl9JY29ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZSBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0pBUl9fSU5URVJDRVBUT1JTID0gZUlOU1RBTkNFLmdldEVKQkphcl9JbnRlcmNlcHRvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aW9uc2hpcHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfSkFSX19SRUxBVElPTlNISVBTID0gZUlOU1RBTkNFLmdldEVKQkphcl9SZWxhdGlvbnNoaXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NlbWJseSBEZXNjcmlwdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgQ2xpZW50IEphcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9KQVJfX0VKQl9DTElFTlRfSkFSID0gZUlOU1RBTkNFLmdldEVKQkphcl9FamJDbGllbnRKYXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0pBUl9fSUQgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9KQVJfX01FVEFEQVRBX0NPTVBMRVRFID0gZUlOU1RBTkNFLmdldEVKQkphcl9NZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0pBUl9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRFSkJKYXJfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPkVKQiBKYXIgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEID0gZUlOU1RBTkNFLmdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVAgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIEphcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19FSkJfSkFSID0gZUlOU1RBTkNFLmdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX0VqYkphcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbkltcGwgPGVtPkVKQiBSZWxhdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJSZWxhdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFSkJfUkVMQVRJT04gPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVsYXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUxBVElPTl9fRUpCX1JFTEFUSU9OX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25fRWpiUmVsYXRpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVsYXRpb25zaGlwIFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTlNISVBfUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25fRWpiUmVsYXRpb25zaGlwUm9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFTEFUSU9OX19JRCA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCA8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFSkJfUkVMQVRJT05TSElQX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlbGF0aW9uc2hpcCBSb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0VKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk11bHRpcGxpY2l0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfTXVsdGlwbGljaXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIERlbGV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEUgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DYXNjYWRlRGVsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNtciBGaWVsZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19JRCA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGVycHJpc2VCZWFuc0ltcGwgPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGVycHJpc2VCZWFuc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVudGVycHJpc2VCZWFucygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTlRFUlBSSVNFX0JFQU5TID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVEVSUFJJU0VfQkVBTlNfX0dST1VQID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuc19Hcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vzc2lvbiBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5URVJQUklTRV9CRUFOU19fU0VTU0lPTl9CRUFOUyA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbnNfU2Vzc2lvbkJlYW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgQmVhbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVEVSUFJJU0VfQkVBTlNfX0VOVElUWV9CRUFOUyA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbnNfRW50aXR5QmVhbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRHJpdmVuIEJlYW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRFUlBSSVNFX0JFQU5TX19NRVNTQUdFX0RSSVZFTl9CRUFOUyA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbnNfTWVzc2FnZURyaXZlbkJlYW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVEVSUFJJU0VfQkVBTlNfX0lEID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuc19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCA8ZW0+RW50aXR5IEJlYW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFbnRpdHlCZWFuKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVOVElUWV9CRUFOID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9EaXNwbGF5TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fSUNPTlMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9JY29ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlRJVFlfQkVBTl9fRUpCX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9FamJOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVElUWV9CRUFOX19NQVBQRURfTkFNRSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX01hcHBlZE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlRJVFlfQkVBTl9fSE9NRSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0hvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVElUWV9CRUFOX19SRU1PVEUgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9SZW1vdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlRJVFlfQkVBTl9fTE9DQUxfSE9NRSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0xvY2FsSG9tZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlRJVFlfQkVBTl9fTE9DQUwgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9Mb2NhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5USVRZX0JFQU5fX0VKQl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0VqYkNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByaW0gS2V5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5USVRZX0JFQU5fX1BSSU1fS0VZX0NMQVNTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fUHJpbUtleUNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWVudHJhbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlRJVFlfQkVBTl9fUkVFTlRSQU5UID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fUmVlbnRyYW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbXAgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVElUWV9CRUFOX19DTVBfVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0NtcFZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0IFNjaGVtYSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5USVRZX0JFQU5fX0FCU1RSQUNUX1NDSEVNQV9OQU1FID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fQWJzdHJhY3RTY2hlbWFOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbXAgRmllbGRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fQ01QX0ZJRUxEUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0NtcEZpZWxkcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpbWtleSBGaWVsZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVElUWV9CRUFOX19QUklNS0VZX0ZJRUxEID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fUHJpbWtleUZpZWxkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX0VOVl9FTlRSSUVTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fRW52RW50cmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19FSkJfUkVGUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX0VqYlJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fRUpCX0xPQ0FMX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9FamJMb2NhbFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX1NFUlZJQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX1NlcnZpY2VSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fUkVTT1VSQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX1Jlc291cmNlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX1Jlc291cmNlRW52UmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRJVFlfQkVBTl9fUE9TVF9DT05TVFJVQ1RTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fUG9zdENvbnN0cnVjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX1ByZURlc3Ryb3lzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9TZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX1NlY3VyaXR5SWRlbnRpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVElUWV9CRUFOX19RVUVSSUVTID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fUXVlcmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlRJVFlfQkVBTl9fSUQgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5QmVhbl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FeGNsdWRlTGlzdEltcGwgPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRXhjbHVkZUxpc3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFeGNsdWRlTGlzdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFWENMVURFX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0RXhjbHVkZUxpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFWENMVURFX0xJU1RfX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0RXhjbHVkZUxpc3RfTWV0aG9kcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFWENMVURFX0xJU1RfX0lEID0gZUlOU1RBTkNFLmdldEV4Y2x1ZGVMaXN0X0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkluaXRNZXRob2RUeXBlSW1wbCA8ZW0+SW5pdCBNZXRob2QgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW5pdE1ldGhvZFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRJbml0TWV0aG9kVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJTklUX01FVEhPRF9UWVBFID0gZUlOU1RBTkNFLmdldEluaXRNZXRob2RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DcmVhdGUgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5JVF9NRVRIT0RfVFlQRV9fQ1JFQVRFX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRJbml0TWV0aG9kVHlwZV9DcmVhdGVNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJlYW4gTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5JVF9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0SW5pdE1ldGhvZFR5cGVfQmVhbk1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTklUX01FVEhPRF9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRJbml0TWV0aG9kVHlwZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbCA8ZW0+SW50ZXJjZXB0b3IgQmluZGluZyBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VKQl9OQU1FID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRWpiTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3IgQ2xhc3NlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBPcmRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfT1JERVIgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JbnRlcmNlcHRvck9yZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgSW50ZXJjZXB0b3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0RFRkFVTFRfSU5URVJDRVBUT1JTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19FWENMVURFX0NMQVNTX0lOVEVSQ0VQVE9SUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9NZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yT3JkZXJUeXBlSW1wbCA8ZW0+SW50ZXJjZXB0b3IgT3JkZXIgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRJbnRlcmNlcHRvck9yZGVyVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJTlRFUkNFUFRPUl9PUkRFUl9UWVBFID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yT3JkZXJUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBDbGFzc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yT3JkZXJUeXBlX0ludGVyY2VwdG9yQ2xhc3NlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvck9yZGVyVHlwZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvcnNUeXBlSW1wbCA8ZW0+SW50ZXJjZXB0b3JzIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yc1R5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRJbnRlcmNlcHRvcnNUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElOVEVSQ0VQVE9SU19UWVBFID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yc1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JTX1RZUEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvcnNUeXBlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUlNfVFlQRV9fSU5URVJDRVBUT1JTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yc1R5cGVfSW50ZXJjZXB0b3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOVEVSQ0VQVE9SU19UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvcnNUeXBlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwgPGVtPkludGVyY2VwdG9yIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEludGVyY2VwdG9yVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJTlRFUkNFUFRPUl9UWVBFID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9UWVBFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3IgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTlRFUkNFUFRPUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfSW50ZXJjZXB0b3JDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXJvdW5kIEludm9rZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX0FST1VORF9JTlZPS0VTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9Bcm91bmRJbnZva2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfVFlQRV9fRU5WX0VOVFJJRVMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlX0VudkVudHJpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9UWVBFX19FSkJfUkVGUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfRWpiUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX0VKQl9MT0NBTF9SRUZTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9FamJMb2NhbFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfVFlQRV9fU0VSVklDRV9SRUZTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9TZXJ2aWNlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfRU5WX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlX1Jlc291cmNlRW52UmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9UWVBFX19QT1NUX0NPTlNUUlVDVFMgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX1BSRV9ERVNUUk9ZUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfUHJlRGVzdHJveXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgQWN0aXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9UWVBFX19QT1NUX0FDVElWQVRFUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfUG9zdEFjdGl2YXRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBhc3NpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9QcmVQYXNzaXZhdGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOVEVSQ0VQVE9SX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwgPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVTU0FHRV9EUklWRU5fQkVBTiA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX0Rpc3BsYXlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0lDT05TID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX0ljb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9OQU1FID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUFQUEVEX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWFwcGVkTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0NMQVNTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYkNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdpbmcgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0lOR19UWVBFID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2luZ1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRpbWVvdXQgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRU9VVF9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fVGltZW91dE1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fQUNUSVZBVElPTl9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fQWN0aXZhdGlvbkNvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXJvdW5kIEludm9rZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9JTlZPS0VTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX0Fyb3VuZEludm9rZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19FTlZfRU5UUklFUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9FbnZFbnRyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9MT0NBTF9SRUZTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYkxvY2FsUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19TRVJWSUNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VydmljZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fUmVzb3VyY2VSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9Qb3N0Q29uc3RydWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19QUkVfREVTVFJPWVMgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fUHJlRGVzdHJveXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfSURFTlRJVFkgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VjdXJpdHlJZGVudGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19JRCA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQYXJhbXNJbXBsIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQYXJhbXNJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RQYXJhbXMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX1BBUkFNUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QQVJBTVNfX01FVEhPRF9QQVJBTVMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1zX01ldGhvZFBhcmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFSQU1TX19JRCA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbXNfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGVybWlzc2lvbkltcGwgPGVtPk1ldGhvZCBQZXJtaXNzaW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQZXJtaXNzaW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kUGVybWlzc2lvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEVSTUlTU0lPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RQZXJtaXNzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QRVJNSVNTSU9OX19ST0xFX05BTUVTID0gZUlOU1RBTkNFLmdldE1ldGhvZFBlcm1pc3Npb25fUm9sZU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbmNoZWNrZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEID0gZUlOU1RBTkNFLmdldE1ldGhvZFBlcm1pc3Npb25fVW5jaGVja2VkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BFUk1JU1NJT05fX0lEID0gZUlOU1RBTkNFLmdldE1ldGhvZFBlcm1pc3Npb25fSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kVHlwZUltcGwgPGVtPk1ldGhvZCBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9UWVBFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1RZUEVfX0VKQl9OQU1FID0gZUlOU1RBTkNFLmdldE1ldGhvZFR5cGVfRWpiTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEludGY8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVFlQRV9fTUVUSE9EX0lOVEYgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVHlwZV9NZXRob2RJbnRmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9UWVBFX19NRVRIT0RfTkFNRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RUeXBlX01ldGhvZE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RUeXBlX01ldGhvZFBhcmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVFlQRV9fSUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVHlwZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5OYW1lZE1ldGhvZFR5cGVJbXBsIDxlbT5OYW1lZCBNZXRob2QgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTmFtZWRNZXRob2RUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TmFtZWRNZXRob2RUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5BTUVEX01FVEhPRF9UWVBFID0gZUlOU1RBTkNFLmdldE5hbWVkTWV0aG9kVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TmFtZWRNZXRob2RUeXBlX01ldGhvZE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBOQU1FRF9NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUyA9IGVJTlNUQU5DRS5nZXROYW1lZE1ldGhvZFR5cGVfTWV0aG9kUGFyYW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5BTUVEX01FVEhPRF9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXROYW1lZE1ldGhvZFR5cGVfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlJbXBsIDxlbT5RdWVyeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRRdWVyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBRVUVSWSA9IGVJTlNUQU5DRS5nZXRRdWVyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBRVUVSWV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UXVlcnlfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5IE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFFVRVJZX19RVUVSWV9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0UXVlcnlfUXVlcnlNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBRVUVSWV9fUkVTVUxUX1RZUEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRRdWVyeV9SZXN1bHRUeXBlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUVVFUllfX0VKQl9RTCA9IGVJTlNUQU5DRS5nZXRRdWVyeV9FamJRbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBRVUVSWV9fSUQgPSBlSU5TVEFOQ0UuZ2V0UXVlcnlfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlNZXRob2RJbXBsIDxlbT5RdWVyeSBNZXRob2Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5TWV0aG9kSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UXVlcnlNZXRob2QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUVVFUllfTUVUSE9EID0gZUlOU1RBTkNFLmdldFF1ZXJ5TWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFFVRVJZX01FVEhPRF9fTUVUSE9EX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UXVlcnlNZXRob2RfTWV0aG9kTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFFVRVJZX01FVEhPRF9fTUVUSE9EX1BBUkFNUyA9IGVJTlNUQU5DRS5nZXRRdWVyeU1ldGhvZF9NZXRob2RQYXJhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUVVFUllfTUVUSE9EX19JRCA9IGVJTlNUQU5DRS5nZXRRdWVyeU1ldGhvZF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUltcGwgPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFID0gZUlOU1RBTkNFLmdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19FSkJfTkFNRSA9IGVJTlNUQU5DRS5nZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9FamJOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5SZWxhdGlvbnNoaXBzSW1wbCA8ZW0+UmVsYXRpb25zaGlwczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuUmVsYXRpb25zaGlwc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlbGF0aW9uc2hpcHMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVMQVRJT05TSElQUyA9IGVJTlNUQU5DRS5nZXRSZWxhdGlvbnNoaXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlbGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUyA9IGVJTlNUQU5DRS5nZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRUxBVElPTlNISVBTX19JRCA9IGVJTlNUQU5DRS5nZXRSZWxhdGlvbnNoaXBzX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbW92ZU1ldGhvZFR5cGVJbXBsIDxlbT5SZW1vdmUgTWV0aG9kIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbW92ZU1ldGhvZFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRSZW1vdmVNZXRob2RUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFTU9WRV9NRVRIT0RfVFlQRSA9IGVJTlNUQU5DRS5nZXRSZW1vdmVNZXRob2RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CZWFuIE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0UmVtb3ZlTWV0aG9kVHlwZV9CZWFuTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXRhaW4gSWYgRXhjZXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVNT1ZFX01FVEhPRF9UWVBFX19SRVRBSU5fSUZfRVhDRVBUSU9OID0gZUlOU1RBTkNFLmdldFJlbW92ZU1ldGhvZFR5cGVfUmV0YWluSWZFeGNlcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVNT1ZFX01FVEhPRF9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRSZW1vdmVNZXRob2RUeXBlX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbCA8ZW0+U2VjdXJpdHkgSWRlbnRpdHkgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRUNVUklUWV9JREVOVElUWV9UWVBFID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5SWRlbnRpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUlkZW50aXR5VHlwZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNVUklUWV9JREVOVElUWV9UWVBFX19VU0VfQ0FMTEVSX0lERU5USVRZID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX1VzZUNhbGxlcklkZW50aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SdW4gQXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNVUklUWV9JREVOVElUWV9UWVBFX19SVU5fQVMgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfUnVuQXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsIDxlbT5TZXNzaW9uIEJlYW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0U2Vzc2lvbkJlYW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VTU0lPTl9CRUFOID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX0Rpc3BsYXlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fSUNPTlMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9CRUFOX19FSkJfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9FamJOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFU1NJT05fQkVBTl9fTUFQUEVEX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fTWFwcGVkTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFU1NJT05fQkVBTl9fSE9NRSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9Ib21lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX1JFTU9URSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9SZW1vdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX0xPQ0FMX0hPTUUgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fTG9jYWxIb21lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFU1NJT05fQkVBTl9fTE9DQUwgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fTG9jYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJ1c2luZXNzIExvY2FsczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9CRUFOX19CVVNJTkVTU19MT0NBTFMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fQnVzaW5lc3NMb2NhbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJ1c2luZXNzIFJlbW90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9CdXNpbmVzc1JlbW90ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX1NFUlZJQ0VfRU5EUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fU2VydmljZUVuZHBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX0VKQl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9FamJDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9CRUFOX19TRVNTSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fU2Vzc2lvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRpbWVvdXQgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19USU1FT1VUX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9UaW1lb3V0TWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0IE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fSU5JVF9NRVRIT0RTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX0luaXRNZXRob2RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZW1vdmUgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19SRU1PVkVfTUVUSE9EUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9SZW1vdmVNZXRob2RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1RyYW5zYWN0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXJvdW5kIEludm9rZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fQVJPVU5EX0lOVk9LRVMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fQXJvdW5kSW52b2tlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fRU5WX0VOVFJJRVMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fRW52RW50cmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fRUpCX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fRWpiUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fRUpCX0xPQ0FMX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fRWpiTG9jYWxSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fU0VSVklDRV9SRUZTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1NlcnZpY2VSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1JFU09VUkNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9SZXNvdXJjZUVudlJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgQ29uc3RydWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19QT1NUX0NPTlNUUlVDVFMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fUG9zdENvbnN0cnVjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19QUkVfREVTVFJPWVMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fUHJlRGVzdHJveXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgQWN0aXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1BPU1RfQUNUSVZBVEVTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1Bvc3RBY3RpdmF0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBQYXNzaXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1BSRV9QQVNTSVZBVEVTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1ByZVBhc3NpdmF0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fU2VjdXJpdHlSb2xlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgSWRlbnRpdGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fU0VDVVJJVFlfSURFTlRJVElFUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9TZWN1cml0eUlkZW50aXRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9CRUFOX19JRCA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ21wVmVyc2lvblR5cGUgPGVtPkNtcCBWZXJzaW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNtcFZlcnNpb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDbXBWZXJzaW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIENNUF9WRVJTSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q21wVmVyc2lvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkVHlwZSA8ZW0+Q01SIEZpZWxkIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q01SRmllbGRUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gQ01SX0ZJRUxEX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q01SRmllbGRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RJbnRlcmZhY2VUeXBlIDxlbT5NZXRob2QgSW50ZXJmYWNlIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1ldGhvZEludGVyZmFjZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBNRVRIT0RfSU5URVJGQUNFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kSW50ZXJmYWNlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTXVsdGlwbGljaXR5VHlwZSA8ZW0+TXVsdGlwbGljaXR5IFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE11bHRpcGxpY2l0eVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBNVUxUSVBMSUNJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRNdWx0aXBsaWNpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5QZXJzaXN0ZW5jZVR5cGUgPGVtPlBlcnNpc3RlbmNlIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gUEVSU0lTVEVOQ0VfVFlQRSA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZSA8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZyBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZXN1bHRUeXBlTWFwcGluZ1R5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlc3VsdFR5cGVNYXBwaW5nVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXRSZXN1bHRUeXBlTWFwcGluZ1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRTZXNzaW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFNFU1NJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIDxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBUUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUcmFuc2FjdGlvblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBUUkFOU0FDVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Q21wIFZlcnNpb24gVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q21wVmVyc2lvblR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgQ01QX1ZFUlNJT05fVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0Q21wVmVyc2lvblR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkNNUiBGaWVsZCBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUkZpZWxkVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q01SRmllbGRUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIENNUl9GSUVMRF9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRDTVJGaWVsZFR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkNsYXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFamJDbGFzc1R5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgRUpCX0NMQVNTX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RWpiQ2xhc3NUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5OYW1lIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFamJOYW1lVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBFSkJfTkFNRV9UWVBFID0gZUlOU1RBTkNFLmdldEVqYk5hbWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5NZXRob2QgSW50ZXJmYWNlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kSW50ZXJmYWNlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kSW50ZXJmYWNlVHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBNRVRIT0RfSU5URVJGQUNFX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldE1ldGhvZEludGVyZmFjZVR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPk1ldGhvZCBOYW1lIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2ROYW1lVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBNRVRIT0RfTkFNRV9UWVBFID0gZUlOU1RBTkNFLmdldE1ldGhvZE5hbWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5NdWx0aXBsaWNpdHkgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NdWx0aXBsaWNpdHlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNdWx0aXBsaWNpdHlUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIE1VTFRJUExJQ0lUWV9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRNdWx0aXBsaWNpdHlUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UGVyc2lzdGVuY2VUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFBFUlNJU1RFTkNFX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlVHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZyBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlc3VsdFR5cGVNYXBwaW5nVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0UmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXNzaW9uIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvblR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFNlc3Npb25UeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFU1NJT05fVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvblR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUcmFuc2FjdGlvblR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgVFJBTlNBQ1RJT05fVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNhY3Rpb25UeXBlT2JqZWN0KCk7Ci0KLQl9Ci0KLX0gLy9FamJQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMGEwMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEVqYlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFamJTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgRWpiU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25FeGNlcHRpb24oQXBwbGljYXRpb25FeGNlcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uRXhjZXB0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXJvdW5kSW52b2tlVHlwZShBcm91bmRJbnZva2VUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcm91bmRJbnZva2VUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ01QRmllbGQoQ01QRmllbGQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNNUEZpZWxkQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ01SRmllbGQoQ01SRmllbGQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNNUkZpZWxkQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCSmFyKEVKQkphciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUpCSmFyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCUmVsYXRpb24oRUpCUmVsYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQlJlbGF0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCUmVsYXRpb25zaGlwUm9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRW50ZXJwcmlzZUJlYW5zKEVudGVycHJpc2VCZWFucyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRW50ZXJwcmlzZUJlYW5zQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRW50aXR5QmVhbihFbnRpdHlCZWFuIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFbnRpdHlCZWFuQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXhjbHVkZUxpc3QoRXhjbHVkZUxpc3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4Y2x1ZGVMaXN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW5pdE1ldGhvZFR5cGUoSW5pdE1ldGhvZFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUluaXRNZXRob2RUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW50ZXJjZXB0b3JCaW5kaW5nVHlwZShJbnRlcmNlcHRvckJpbmRpbmdUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJbnRlcmNlcHRvckJpbmRpbmdUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW50ZXJjZXB0b3JPcmRlclR5cGUoSW50ZXJjZXB0b3JPcmRlclR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUludGVyY2VwdG9yT3JkZXJUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW50ZXJjZXB0b3JzVHlwZShJbnRlcmNlcHRvcnNUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJbnRlcmNlcHRvcnNUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW50ZXJjZXB0b3JUeXBlKEludGVyY2VwdG9yVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSW50ZXJjZXB0b3JUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURyaXZlbkJlYW4oTWVzc2FnZURyaXZlbkJlYW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEcml2ZW5CZWFuQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGFyYW1zKE1ldGhvZFBhcmFtcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGFyYW1zQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGVybWlzc2lvbihNZXRob2RQZXJtaXNzaW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RQZXJtaXNzaW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kVHlwZShNZXRob2RUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTmFtZWRNZXRob2RUeXBlKE5hbWVkTWV0aG9kVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZWRNZXRob2RUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUXVlcnkoUXVlcnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVF1ZXJ5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUXVlcnlNZXRob2QoUXVlcnlNZXRob2Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVF1ZXJ5TWV0aG9kQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZWxhdGlvbnNoaXBzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVtb3ZlTWV0aG9kVHlwZShSZW1vdmVNZXRob2RUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZW1vdmVNZXRob2RUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlJZGVudGl0eVR5cGUoU2VjdXJpdHlJZGVudGl0eVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5SWRlbnRpdHlUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbkJlYW4oU2Vzc2lvbkJlYW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25CZWFuQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiA8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uRXhjZXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlIDxlbT5Bcm91bmQgSW52b2tlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcm91bmRJbnZva2VUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IgPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQgPGVtPkNNUCBGaWVsZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVBGaWVsZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDTVBGaWVsZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGQgPGVtPkNNUiBGaWVsZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDTVJGaWVsZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlIDxlbT5Db250YWluZXIgVHJhbnNhY3Rpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIgPGVtPkVKQiBKYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkphckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IgPGVtPkVKQiBKYXIgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbiA8ZW0+RUpCIFJlbGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQlJlbGF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQlJlbGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlIDxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnMgPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudGVycHJpc2VCZWFuc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiA8ZW0+RW50aXR5IEJlYW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbnRpdHlCZWFuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FeGNsdWRlTGlzdCA8ZW0+RXhjbHVkZSBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkV4Y2x1ZGVMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2x1ZGVMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZSA8ZW0+SW5pdCBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Jbml0TWV0aG9kVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0TWV0aG9kVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSA8ZW0+SW50ZXJjZXB0b3IgQmluZGluZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yQmluZGluZ1R5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZXJjZXB0b3JCaW5kaW5nVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGUgPGVtPkludGVyY2VwdG9yIE9yZGVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JPcmRlclR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZXJjZXB0b3JPcmRlclR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yc1R5cGUgPGVtPkludGVyY2VwdG9ycyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yc1R5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZXJjZXB0b3JzVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlIDxlbT5JbnRlcmNlcHRvciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlcmNlcHRvclR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuIDxlbT5NZXNzYWdlIERyaXZlbiBCZWFuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VEcml2ZW5CZWFuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQYXJhbXMgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGFyYW1zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBhcmFtc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbiA8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kUGVybWlzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQZXJtaXNzaW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlIDxlbT5NZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZSA8ZW0+TmFtZWQgTWV0aG9kIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVkTWV0aG9kVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUXVlcnkgPGVtPlF1ZXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVF1ZXJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5RdWVyeU1ldGhvZCA8ZW0+UXVlcnkgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlF1ZXJ5TWV0aG9kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVF1ZXJ5TWV0aG9kQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSA8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlJlbGF0aW9uc2hpcHMgPGVtPlJlbGF0aW9uc2hpcHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVsYXRpb25zaGlwcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWxhdGlvbnNoaXBzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlIDxlbT5SZW1vdmUgTWV0aG9kIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVtb3ZlTWV0aG9kVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZW1vdmVNZXRob2RUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eUlkZW50aXR5VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4gPGVtPlNlc3Npb24gQmVhbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXNzaW9uQmVhbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9FamJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzZDU1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTE9wdGlvbnNJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLnV0aWwuRWpiUmVzb3VyY2VJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBFamJSZXNvdXJjZUltcGwodXJpKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9MRVhJQ0FMX0hBTkRMRVIsIEJvb2xlYW4uVFJVRSk7Ci0JCVhNTE9wdGlvbnMgeG1sT3B0aW9ucyA9IG5ldyBYTUxPcHRpb25zSW1wbCgpOwotCi0JCXhtbE9wdGlvbnMuc2V0UHJvY2Vzc1NjaGVtYUxvY2F0aW9ucyh0cnVlKTsKLQkJICAgIAotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9YTUxfT1BUSU9OUywgeG1sT3B0aW9ucyk7Ci0JCQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0gLy9FamJSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4ZWE1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxMb2FkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KRUVYTUxMb2FkSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXZhZWVSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLklFSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JUm9vdE9iamVjdFJlc291cmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgPC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbC5FamJSZXNvdXJjZUZhY3RvcnlJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJSZXNvdXJjZUltcGwgZXh0ZW5kcyBKYXZhZWVSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBJUm9vdE9iamVjdFJlc291cmNlLCBJRUpCUmVzb3VyY2UgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgewotCQkgcmV0dXJuIG5ldyBKRUVYTUxMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCQotCQlyZXR1cm4gbmV3IEVqYlhNTEhlbHBlckltcGwodGhpcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLnV0aWwuSUVKQlJlc291cmNlI2dldFJvb3RPYmplY3QoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCWlmIChjb250ZW50cyA9PSBudWxsIHx8IGNvbnRlbnRzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3Qgcm9vdCA9IGdldENvbnRlbnRzKCkuZ2V0KDApOwotCQlpZihyb290ID09IG51bGwpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChFT2JqZWN0KSgoRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3Ipcm9vdCkuZ2V0RWpiSmFyKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLnV0aWwuSUVKQlJlc291cmNlI2dldEVqYkphcigpCi0JICovCi0JcHVibGljIEVKQkphciBnZXRFamJKYXIoKSB7Ci0JCXJldHVybiAoRUpCSmFyKWdldFJvb3RPYmplY3QoKTsKLQl9Ci0KLX0gLy9FamJSZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGUxOGFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVqYlN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBFamJQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUc6IHsKLQkJCQlBY3RpdmF0aW9uQ29uZmlnIGFjdGl2YXRpb25Db25maWcgPSAoQWN0aXZhdGlvbkNvbmZpZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQWN0aXZhdGlvbkNvbmZpZyhhY3RpdmF0aW9uQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFk6IHsKLQkJCQlBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5ID0gKEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTjogewotCQkJCUFwcGxpY2F0aW9uRXhjZXB0aW9uIGFwcGxpY2F0aW9uRXhjZXB0aW9uID0gKEFwcGxpY2F0aW9uRXhjZXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkV4Y2VwdGlvbihhcHBsaWNhdGlvbkV4Y2VwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRTogewotCQkJCUFyb3VuZEludm9rZVR5cGUgYXJvdW5kSW52b2tlVHlwZSA9IChBcm91bmRJbnZva2VUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcm91bmRJbnZva2VUeXBlKGFyb3VuZEludm9rZVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SOiB7Ci0JCQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IChBc3NlbWJseURlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFzc2VtYmx5RGVzY3JpcHRvcihhc3NlbWJseURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTEQ6IHsKLQkJCQlDTVBGaWVsZCBjbXBGaWVsZCA9IChDTVBGaWVsZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ01QRmllbGQoY21wRmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTEQ6IHsKLQkJCQlDTVJGaWVsZCBjbXJGaWVsZCA9IChDTVJGaWVsZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ01SRmllbGQoY21yRmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRTogewotCQkJCUNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSBjb250YWluZXJUcmFuc2FjdGlvblR5cGUgPSAoQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250YWluZXJUcmFuc2FjdGlvblR5cGUoY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUjogewotCQkJCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJKYXIoZWpiSmFyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1I6IHsKLQkJCQlFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciBlamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciA9IChFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT046IHsKLQkJCQlFSkJSZWxhdGlvbiBlamJSZWxhdGlvbiA9IChFSkJSZWxhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCUmVsYXRpb24oZWpiUmVsYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEU6IHsKLQkJCQlFSkJSZWxhdGlvbnNoaXBSb2xlIGVqYlJlbGF0aW9uc2hpcFJvbGUgPSAoRUpCUmVsYXRpb25zaGlwUm9sZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCUmVsYXRpb25zaGlwUm9sZShlamJSZWxhdGlvbnNoaXBSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOUzogewotCQkJCUVudGVycHJpc2VCZWFucyBlbnRlcnByaXNlQmVhbnMgPSAoRW50ZXJwcmlzZUJlYW5zKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFbnRlcnByaXNlQmVhbnMoZW50ZXJwcmlzZUJlYW5zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU46IHsKLQkJCQlFbnRpdHlCZWFuIGVudGl0eUJlYW4gPSAoRW50aXR5QmVhbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRW50aXR5QmVhbihlbnRpdHlCZWFuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUOiB7Ci0JCQkJRXhjbHVkZUxpc3QgZXhjbHVkZUxpc3QgPSAoRXhjbHVkZUxpc3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4Y2x1ZGVMaXN0KGV4Y2x1ZGVMaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRTogewotCQkJCUluaXRNZXRob2RUeXBlIGluaXRNZXRob2RUeXBlID0gKEluaXRNZXRob2RUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbml0TWV0aG9kVHlwZShpbml0TWV0aG9kVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRTogewotCQkJCUludGVyY2VwdG9yQmluZGluZ1R5cGUgaW50ZXJjZXB0b3JCaW5kaW5nVHlwZSA9IChJbnRlcmNlcHRvckJpbmRpbmdUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbnRlcmNlcHRvckJpbmRpbmdUeXBlKGludGVyY2VwdG9yQmluZGluZ1R5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFOiB7Ci0JCQkJSW50ZXJjZXB0b3JPcmRlclR5cGUgaW50ZXJjZXB0b3JPcmRlclR5cGUgPSAoSW50ZXJjZXB0b3JPcmRlclR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUludGVyY2VwdG9yT3JkZXJUeXBlKGludGVyY2VwdG9yT3JkZXJUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEU6IHsKLQkJCQlJbnRlcmNlcHRvcnNUeXBlIGludGVyY2VwdG9yc1R5cGUgPSAoSW50ZXJjZXB0b3JzVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW50ZXJjZXB0b3JzVHlwZShpbnRlcmNlcHRvcnNUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRTogewotCQkJCUludGVyY2VwdG9yVHlwZSBpbnRlcmNlcHRvclR5cGUgPSAoSW50ZXJjZXB0b3JUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbnRlcmNlcHRvclR5cGUoaW50ZXJjZXB0b3JUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTjogewotCQkJCU1lc3NhZ2VEcml2ZW5CZWFuIG1lc3NhZ2VEcml2ZW5CZWFuID0gKE1lc3NhZ2VEcml2ZW5CZWFuKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXNzYWdlRHJpdmVuQmVhbihtZXNzYWdlRHJpdmVuQmVhbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QQVJBTVM6IHsKLQkJCQlNZXRob2RQYXJhbXMgbWV0aG9kUGFyYW1zID0gKE1ldGhvZFBhcmFtcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kUGFyYW1zKG1ldGhvZFBhcmFtcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OOiB7Ci0JCQkJTWV0aG9kUGVybWlzc2lvbiBtZXRob2RQZXJtaXNzaW9uID0gKE1ldGhvZFBlcm1pc3Npb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZFBlcm1pc3Npb24obWV0aG9kUGVybWlzc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFOiB7Ci0JCQkJTWV0aG9kVHlwZSBtZXRob2RUeXBlID0gKE1ldGhvZFR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZFR5cGUobWV0aG9kVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFOiB7Ci0JCQkJTmFtZWRNZXRob2RUeXBlIG5hbWVkTWV0aG9kVHlwZSA9IChOYW1lZE1ldGhvZFR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU5hbWVkTWV0aG9kVHlwZShuYW1lZE1ldGhvZFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWTogewotCQkJCVF1ZXJ5IHF1ZXJ5ID0gKFF1ZXJ5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VRdWVyeShxdWVyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRDogewotCQkJCVF1ZXJ5TWV0aG9kIHF1ZXJ5TWV0aG9kID0gKFF1ZXJ5TWV0aG9kKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VRdWVyeU1ldGhvZChxdWVyeU1ldGhvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFOiB7Ci0JCQkJUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgcmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgPSAoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKHJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQUzogewotCQkJCVJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IChSZWxhdGlvbnNoaXBzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcHMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEU6IHsKLQkJCQlSZW1vdmVNZXRob2RUeXBlIHJlbW92ZU1ldGhvZFR5cGUgPSAoUmVtb3ZlTWV0aG9kVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVtb3ZlTWV0aG9kVHlwZShyZW1vdmVNZXRob2RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRTogewotCQkJCVNlY3VyaXR5SWRlbnRpdHlUeXBlIHNlY3VyaXR5SWRlbnRpdHlUeXBlID0gKFNlY3VyaXR5SWRlbnRpdHlUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZWN1cml0eUlkZW50aXR5VHlwZShzZWN1cml0eUlkZW50aXR5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTjogewotCQkJCVNlc3Npb25CZWFuIHNlc3Npb25CZWFuID0gKFNlc3Npb25CZWFuKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXNzaW9uQmVhbihzZXNzaW9uQmVhbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uRXhjZXB0aW9uKEFwcGxpY2F0aW9uRXhjZXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJvdW5kIEludm9rZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFyb3VuZCBJbnZva2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXJvdW5kSW52b2tlVHlwZShBcm91bmRJbnZva2VUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01QIEZpZWxkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNNUCBGaWVsZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ01QRmllbGQoQ01QRmllbGQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DTVIgRmllbGQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01SIEZpZWxkPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDTVJGaWVsZChDTVJGaWVsZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXJUcmFuc2FjdGlvblR5cGUoQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIEphcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgSmFyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXIoRUpCSmFyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIEphciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIEphciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBSZWxhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUpCUmVsYXRpb24oRUpCUmVsYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbnNoaXBSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVudGVycHJpc2VCZWFucyhFbnRlcnByaXNlQmVhbnMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnRpdHkgQmVhbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnRpdHkgQmVhbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRW50aXR5QmVhbihFbnRpdHlCZWFuIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjbHVkZSBMaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXhjbHVkZUxpc3QoRXhjbHVkZUxpc3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Jbml0IE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXQgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUluaXRNZXRob2RUeXBlKEluaXRNZXRob2RUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJjZXB0b3IgQmluZGluZyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyY2VwdG9yIEJpbmRpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW50ZXJjZXB0b3JCaW5kaW5nVHlwZShJbnRlcmNlcHRvckJpbmRpbmdUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJjZXB0b3IgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlcmNlcHRvciBPcmRlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJbnRlcmNlcHRvck9yZGVyVHlwZShJbnRlcmNlcHRvck9yZGVyVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyY2VwdG9ycyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyY2VwdG9ycyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJbnRlcmNlcHRvcnNUeXBlKEludGVyY2VwdG9yc1R5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlcmNlcHRvciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyY2VwdG9yIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUludGVyY2VwdG9yVHlwZShJbnRlcmNlcHRvclR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERyaXZlbiBCZWFuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEcml2ZW5CZWFuKE1lc3NhZ2VEcml2ZW5CZWFuIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBlcm1pc3Npb24oTWV0aG9kUGVybWlzc2lvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RUeXBlKE1ldGhvZFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTmFtZWRNZXRob2RUeXBlKE5hbWVkTWV0aG9kVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlF1ZXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlF1ZXJ5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VRdWVyeShRdWVyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVsYXRpb25zaGlwIFJvbGUgU291cmNlIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWxhdGlvbnNoaXBzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZWxhdGlvbnNoaXBzKFJlbGF0aW9uc2hpcHMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZW1vdmUgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVtb3ZlIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZW1vdmVNZXRob2RUeXBlKFJlbW92ZU1ldGhvZFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBJZGVudGl0eSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IElkZW50aXR5IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5SWRlbnRpdHlUeXBlKFNlY3VyaXR5SWRlbnRpdHlUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2Vzc2lvbiBCZWFuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlc3Npb24gQmVhbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbkJlYW4oU2Vzc2lvbkJlYW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0VqYlN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJYTUxIZWxwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlhNTEhlbHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcyNDgxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlhNTEhlbHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSkVFWE1MSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgRWpiWE1MSGVscGVySW1wbCBleHRlbmRzIEpFRVhNTEhlbHBlckltcGwgewotCi0JcHVibGljIEVqYlhNTEhlbHBlckltcGwoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFVSSShTdHJpbmcgcHJlZml4KSB7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKCIiKSkKLQkJCXJldHVybiBFamJQYWNrYWdlLmVOU19VUkk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRVUkkocHJlZml4KTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRRTmFtZShFUGFja2FnZSBlUGFja2FnZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gbXVzdEhhdmVQcmVmaXgpCi0JICB7Ci0JICAgU3RyaW5nIG5zUHJlZml4ID0gZ2V0UHJlZml4KGVQYWNrYWdlLCBtdXN0SGF2ZVByZWZpeCk7Ci0JICAgLy8gTm90IHVzaW5nIEVFNSBwYWNrYWdlIG5hbWVzcGFjZSAtIGRlZmF1bHQgamVlNSBuYW1lc3BhY2UgaXMgdXNlZAotCSAgIGlmIChuc1ByZWZpeC5lcXVhbHMoRWpiUGFja2FnZS5lTlNfUFJFRklYKSkgCi0JICAgIHsKLQkgICAgCXJldHVybiBuYW1lOwotCSAgICB9Ci0JICAgIGVsc2UgcmV0dXJuIHN1cGVyLmdldFFOYW1lKGVQYWNrYWdlLCBuYW1lLCBtdXN0SGF2ZVByZWZpeCk7Ci0JICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJYTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiWE1MUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YTRiOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJYTUxQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIFhNTCBkb2N1bWVudHMKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVqYlhNTFByb2Nlc3NvciBleHRlbmRzIFhNTFByb2Nlc3NvciB7Ci0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIHRvIGluc3RhbnRpYXRlIHRoZSBoZWxwZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYlhNTFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKSk7Ci0JCUVqYlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBmb3IgIioiIGFuZCAieG1sIiBmaWxlIGV4dGVuc2lvbnMgdGhlIEVqYlJlc291cmNlRmFjdG9yeUltcGwgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFJlZ2lzdHJhdGlvbnMoKSB7Ci0JCWlmIChyZWdpc3RyYXRpb25zID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFJlZ2lzdHJhdGlvbnMoKTsKLQkJCXJlZ2lzdHJhdGlvbnMucHV0KFhNTF9FWFRFTlNJT04sIG5ldyBFamJSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoU1RBUl9FWFRFTlNJT04sIG5ldyBFamJSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQl9Ci0JCXJldHVybiByZWdpc3RyYXRpb25zOwotCX0KLQotfSAvL0VqYlhNTFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvSnNwQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9Kc3BDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZjRkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9Kc3BDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uZmlnPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUganNwLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBwcm92aWRlIGdsb2JhbCBjb25maWd1cmF0aW9uCi0gKiAJaW5mb3JtYXRpb24gZm9yIHRoZSBKU1AgZmlsZXMgaW4gYSB3ZWIgYXBwbGljYXRpb24uIEl0IGhhcwotICogCXR3byBzdWJlbGVtZW50cywgdGFnbGliIGFuZCBqc3AtcHJvcGVydHktZ3JvdXAuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcENvbmZpZyNnZXRUYWdMaWJzIDxlbT5UYWcgTGliczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnI2dldEpzcFByb3BlcnR5R3JvdXBzIDxlbT5Kc3AgUHJvcGVydHkgR3JvdXBzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcENvbmZpZygpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKc3BDb25maWcgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhZyBMaWJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGlifS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhZyBMaWJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFnIExpYnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcENvbmZpZ19UYWdMaWJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRUYWdMaWJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kc3AgUHJvcGVydHkgR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kc3AgUHJvcGVydHkgR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SnNwIFByb3BlcnR5IEdyb3VwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwQ29uZmlnX0pzcFByb3BlcnR5R3JvdXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRKc3BQcm9wZXJ0eUdyb3VwcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcENvbmZpZ19JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEpzcENvbmZpZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL0pzcEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL0pzcEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzMzUzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9Kc3BGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpzcEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKc3BGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25maWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmZpZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSnNwQ29uZmlnIGNyZWF0ZUpzcENvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvcGVydHkgR3JvdXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUpzcFByb3BlcnR5R3JvdXAgY3JlYXRlSnNwUHJvcGVydHlHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWcgTGliPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWcgTGliPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYWdMaWIgY3JlYXRlVGFnTGliKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUpzcFBhY2thZ2UgZ2V0SnNwUGFja2FnZSgpOwotCi19IC8vSnNwRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvSnNwUHJvcGVydHlHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvSnNwUHJvcGVydHlHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZlZGY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL0pzcFByb3BlcnR5R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHkgR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBqc3AtcHJvcGVydHktZ3JvdXBUeXBlIGlzIHVzZWQgdG8gZ3JvdXAgYSBudW1iZXIgb2YKLSAqIAlmaWxlcyBzbyB0aGV5IGNhbiBiZSBnaXZlbiBnbG9iYWwgcHJvcGVydHkgaW5mb3JtYXRpb24uCi0gKiAJQWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gIFRoZQotICogCWZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDoKLSAqIAotICogCSAgICAtIENvbnRyb2wgd2hldGhlciBFTCBpcyBpZ25vcmVkLgotICogCSAgICAtIENvbnRyb2wgd2hldGhlciBzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGludmFsaWQuCi0gKiAJICAgIC0gSW5kaWNhdGUgcGFnZUVuY29kaW5nIGluZm9ybWF0aW9uLgotICogCSAgICAtIEluZGljYXRlIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUCBkb2N1bWVudCAoWE1MKS4KLSAqIAkgICAgLSBQcmVsdWRlIGFuZCBDb2RhIGF1dG9tYXRpYyBpbmNsdWRlcy4KLSAqICAgICAgICAgICAgIC0gQ29udHJvbCB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgI3sgaXMgYWxsb3dlZAotICogICAgICAgICAgICAgICB3aGVuIHVzZWQgYXMgYSBTdHJpbmcgbGl0ZXJhbC4KLSAqICAgICAgICAgICAgIC0gQ29udHJvbCB3aGV0aGVyIHRlbXBsYXRlIHRleHQgY29udGFpbmluZyBvbmx5Ci0gKiAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXNwb25zZSBvdXRwdXQuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRVcmxQYXR0ZXJucyA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkIDxlbT5FbCBJZ25vcmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldFBhZ2VFbmNvZGluZyA8ZW0+UGFnZSBFbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc1NjcmlwdGluZ0ludmFsaWQgPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzSXNYbWwgPGVtPklzIFhtbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRJbmNsdWRlUHJlbHVkZXMgPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZUNvZGFzIDxlbT5JbmNsdWRlIENvZGFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsIDxlbT5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzIDxlbT5UcmltIERpcmVjdGl2ZSBXaGl0ZXNwYWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKc3BQcm9wZXJ0eUdyb3VwIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfSWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXJsIFBhdHRlcm5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJsIFBhdHRlcm5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX1VybFBhdHRlcm5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRVcmxQYXR0ZXJucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWwgSWdub3JlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgc2V0IHRoZSBpc0VMSWdub3JlZAotCSAqIAkgICAgcHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCB0aGUKLQkgKiAJICAgIEVMIGV2YWx1YXRpb24gaXMgZW5hYmxlZCBmb3IgV2ViIEFwcGxpY2F0aW9ucyB1c2luZwotCSAqIAkgICAgYSBTZXJ2bGV0IDIuNCBvciBncmVhdGVyIHdlYi54bWwsIGFuZCBkaXNhYmxlZAotCSAqIAkgICAgb3RoZXJ3aXNlLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbCBJZ25vcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVsSWdub3JlZCgpCi0JICogQHNlZSAjdW5zZXRFbElnbm9yZWQoKQotCSAqIEBzZWUgI3NldEVsSWdub3JlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFbElnbm9yZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNFbElnbm9yZWQgPGVtPkVsIElnbm9yZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsIElnbm9yZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWxJZ25vcmVkKCkKLQkgKiBAc2VlICN1bnNldEVsSWdub3JlZCgpCi0JICogQHNlZSAjaXNFbElnbm9yZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsSWdub3JlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0VsSWdub3JlZCA8ZW0+RWwgSWdub3JlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFbElnbm9yZWQoKQotCSAqIEBzZWUgI2lzRWxJZ25vcmVkKCkKLQkgKiBAc2VlICNzZXRFbElnbm9yZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVsSWdub3JlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkIDxlbT5FbCBJZ25vcmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbCBJZ25vcmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFbElnbm9yZWQoKQotCSAqIEBzZWUgI2lzRWxJZ25vcmVkKCkKLQkgKiBAc2VlICNzZXRFbElnbm9yZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVsSWdub3JlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFnZSBFbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgdmFsaWQgdmFsdWVzIG9mIHBhZ2UtZW5jb2RpbmcgYXJlIHRob3NlIG9mIHRoZQotCSAqIAkgICAgcGFnZUVuY29kaW5nIHBhZ2UgZGlyZWN0aXZlLiAgSXQgaXMgYQotCSAqIAkgICAgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MKLQkgKiAJICAgIGluIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZQotCSAqIAkgICAgb2YgYSBKU1AgcGFnZSBhbmQgaW4gYSBKU1AgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICogCSAgICBtYXRjaGluZyB0aGUgcGFnZS4gIEl0IGlzIGFsc28gYSB0cmFuc2xhdGlvbi10aW1lCi0JICogCSAgICBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MgaW4gdGhlIHByb2xvZwotCSAqIAkgICAgb3IgdGV4dCBkZWNsYXJhdGlvbiBvZiBhIGRvY3VtZW50IGluIFhNTCBzeW50YXggYW5kCi0JICogCSAgICBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGRvY3VtZW50LgotCSAqIAkgICAgSXQgaXMgbGVnYWwgdG8gbmFtZSB0aGUgc2FtZSBlbmNvZGluZyB0aHJvdWdoCi0JICogCSAgICBtdWxpdHBsZSBtZWNoYW5pc21zLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWdlIEVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYWdlRW5jb2RpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYWdlRW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0UGFnZUVuY29kaW5nIDxlbT5QYWdlIEVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYWdlIEVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYWdlRW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhZ2VFbmNvZGluZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NyaXB0aW5nIEludmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IGRpc2FibGUgc2NyaXB0aW5nIGluIGEKLQkgKiAJICAgIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHNjcmlwdGluZyBpcwotCSAqIAkgICAgZW5hYmxlZC4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjdW5zZXRTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICNzZXRTY3JpcHRpbmdJbnZhbGlkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTY3JpcHRpbmdJbnZhbGlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzU2NyaXB0aW5nSW52YWxpZCA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI3Vuc2V0U2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjaXNTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTY3JpcHRpbmdJbnZhbGlkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzU2NyaXB0aW5nSW52YWxpZCA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjaXNTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICNzZXRTY3JpcHRpbmdJbnZhbGlkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTY3JpcHRpbmdJbnZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNTY3JpcHRpbmdJbnZhbGlkIDxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI2lzU2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjc2V0U2NyaXB0aW5nSW52YWxpZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U2NyaXB0aW5nSW52YWxpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgWG1sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIElmIHRydWUsIGRlbm90ZXMgdGhhdCB0aGUgZ3JvdXAgb2YgcmVzb3VyY2VzCi0JICogCSAgICB0aGF0IG1hdGNoIHRoZSBVUkwgcGF0dGVybiBhcmUgSlNQIGRvY3VtZW50cywKLQkgKiAJICAgIGFuZCB0aHVzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgWE1MIGRvY3VtZW50cy4KLQkgKiAJICAgIElmIGZhbHNlLCB0aGUgcmVzb3VyY2VzIGFyZSBhc3N1bWVkIHRvIG5vdAotCSAqIAkgICAgYmUgSlNQIGRvY3VtZW50cywgdW5sZXNzIHRoZXJlIGlzIGFub3RoZXIKLQkgKiAJICAgIHByb3BlcnR5IGdyb3VwIHRoYXQgaW5kaWNhdGVzIG90aGVyd2lzZS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgWG1sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzWG1sKCkKLQkgKiBAc2VlICN1bnNldElzWG1sKCkKLQkgKiBAc2VlICNzZXRJc1htbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX0lzWG1sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzWG1sKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzSXNYbWwgPGVtPklzIFhtbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgWG1sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzWG1sKCkKLQkgKiBAc2VlICN1bnNldElzWG1sKCkKLQkgKiBAc2VlICNpc0lzWG1sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1htbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0lzWG1sIDxlbT5JcyBYbWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNYbWwoKQotCSAqIEBzZWUgI2lzSXNYbWwoKQotCSAqIEBzZWUgI3NldElzWG1sKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1htbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzSXNYbWwgPGVtPklzIFhtbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgWG1sPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1htbCgpCi0JICogQHNlZSAjaXNJc1htbCgpCi0JICogQHNlZSAjc2V0SXNYbWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzWG1sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmNsdWRlIFByZWx1ZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBpbmNsdWRlLXByZWx1ZGUgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLQkgKiAJICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLQkgKiAJICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKLQkgKiAJICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLQkgKiAJICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2gKLQkgKiAJICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5jbHVkZVByZWx1ZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmNsdWRlIENvZGFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSBpbmNsdWRlLWNvZGEgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLQkgKiAJICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLQkgKiAJICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKLQkgKiAJICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLQkgKiAJICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgZW5kIG9mIGVhY2gKLQkgKiAJICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNsdWRlIENvZGFzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5jbHVkZUNvZGFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAgICAgICAgICAgICAgVGhlIGNoYXJhY3RlciBzZXF1ZW5jZSAjeyBpcyByZXNlcnZlZCBmb3IgRUwgZXhwcmVzc2lvbnMuCi0JICogICAgICAgICAgICAgIENvbnNlcXVlbnRseSwgYSB0cmFuc2xhdGlvbiBlcnJvciBvY2N1cnMgaWYgdGhlICN7Ci0JICogICAgICAgICAgICAgIGNoYXJhY3RlciBzZXF1ZW5jZSBpcyB1c2VkIGFzIGEgU3RyaW5nIGxpdGVyYWwsIHVubGVzcwotCSAqICAgICAgICAgICAgICB0aGlzIGVsZW1lbnQgaXMgZW5hYmxlZCAodHJ1ZSkuIERpc2FibGVkIChmYWxzZSkgYnkKLQkgKiAgICAgICAgICAgICAgZGVmYXVsdC4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmZXJyZWQgU3ludGF4IEFsbG93ZWQgQXMgTGl0ZXJhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKQotCSAqIEBzZWUgI3Vuc2V0RGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkKLQkgKiBAc2VlICNzZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwUHJvcGVydHlHcm91cF9EZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsIDxlbT5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpCi0JICogQHNlZSAjdW5zZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKQotCSAqIEBzZWUgI2lzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwgPGVtPkRlZmVycmVkIFN5bnRheCBBbGxvd2VkIEFzIExpdGVyYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkKLQkgKiBAc2VlICNpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpCi0JICogQHNlZSAjc2V0RGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCA8ZW0+RGVmZXJyZWQgU3ludGF4IEFsbG93ZWQgQXMgTGl0ZXJhbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmZXJyZWQgU3ludGF4IEFsbG93ZWQgQXMgTGl0ZXJhbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkKLQkgKiBAc2VlICNpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpCi0JICogQHNlZSAjc2V0RGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAgICAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgdGVtcGxhdGUgdGV4dCBjb250YWluaW5nIG9ubHkgd2hpdGVzcGFjZXMKLQkgKiAgICAgICAgICAgICAgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIHJlc3BvbnNlIG91dHB1dC4gSXQgaGFzIG5vCi0JICogICAgICAgICAgICAgIGVmZmVjdCBvbiBKU1AgZG9jdW1lbnRzIChYTUwgc3ludGF4KS4gRGlzYWJsZWQgKGZhbHNlKQotCSAqICAgICAgICAgICAgICBieSBkZWZhdWx0LgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmltIERpcmVjdGl2ZSBXaGl0ZXNwYWNlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKQotCSAqIEBzZWUgI3Vuc2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkKLQkgKiBAc2VlICNzZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwUHJvcGVydHlHcm91cF9UcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzIDxlbT5UcmltIERpcmVjdGl2ZSBXaGl0ZXNwYWNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJpbSBEaXJlY3RpdmUgV2hpdGVzcGFjZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkKLQkgKiBAc2VlICN1bnNldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpCi0JICogQHNlZSAjaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyA8ZW0+VHJpbSBEaXJlY3RpdmUgV2hpdGVzcGFjZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkKLQkgKiBAc2VlICNpc1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpCi0JICogQHNlZSAjc2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyA8ZW0+VHJpbSBEaXJlY3RpdmUgV2hpdGVzcGFjZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKQotCSAqIEBzZWUgI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkKLQkgKiBAc2VlICNzZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSnNwUHJvcGVydHlHcm91cApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL1RhZ0xpYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvVGFnTGliLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOTRmZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvVGFnTGliLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWcgTGliPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgdGFnbGliVHlwZSBkZWZpbmVzIHRoZSBzeW50YXggZm9yIGRlY2xhcmluZyBpbgotICogCXRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdGhhdCBhIHRhZyBsaWJyYXJ5IGlzCi0gKiAJYXZhaWxhYmxlIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgY2FuIGJlIGRvbmUKLSAqIAl0byBvdmVycmlkZSBpbXBsaWNpdCBtYXAgZW50cmllcyBmcm9tIFRMRCBmaWxlcyBhbmQKLSAqIAlmcm9tIHRoZSBjb250YWluZXIuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYiNnZXRUYWdsaWJVcmkgPGVtPlRhZ2xpYiBVcmk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYiNnZXRUYWdsaWJMb2NhdGlvbiA8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5UYWdMaWIjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldFRhZ0xpYigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYWdMaWIgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhZ2xpYiBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgQSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJIGlkZW50aWZ5aW5nIGEKLQkgKiAJICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5Ci0JICogCSAgICBvZiB0aGUgdGFnbGliLXVyaSBlbGVtZW50IG1heSBiZSBlaXRoZXIgYW4KLQkgKiAJICAgIGFic29sdXRlIFVSSSBzcGVjaWZpY2F0aW9uLCBvciBhIHJlbGF0aXZlIFVSSS4KLQkgKiAJICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUKLQkgKiAJICAgIHNhbWUgdGFnbGliLXVyaSB2YWx1ZS4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFnbGliIFVyaTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFnbGliVXJpKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0VGFnTGliX1RhZ2xpYlVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYWdsaWJVcmkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYiNnZXRUYWdsaWJVcmkgPGVtPlRhZ2xpYiBVcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhZ2xpYiBVcmk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhZ2xpYlVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFnbGliVXJpKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWdsaWIgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgdGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbgotCSAqIAkgICAgKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYgotCSAqIAkgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5Ci0JICogCSAgICBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFnbGliTG9jYXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRUYWdMaWJfVGFnbGliTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGFnbGliTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYiNnZXRUYWdsaWJMb2NhdGlvbiA8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYWdsaWIgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhZ2xpYkxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYWdsaWJMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldFRhZ0xpYl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRhZ0xpYgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BDb25maWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjEyMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BDb25maWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BDb25maWdJbXBsI2dldFRhZ0xpYnMgPGVtPlRhZyBMaWJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcENvbmZpZ0ltcGwjZ2V0SnNwUHJvcGVydHlHcm91cHMgPGVtPkpzcCBQcm9wZXJ0eSBHcm91cHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwQ29uZmlnSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3BDb25maWdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBKc3BDb25maWcgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ0xpYnMoKSA8ZW0+VGFnIExpYnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnTGlicygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRhZ0xpYnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SnNwUHJvcGVydHlHcm91cHMoKSA8ZW0+SnNwIFByb3BlcnR5IEdyb3VwczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKc3BQcm9wZXJ0eUdyb3VwcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGpzcFByb3BlcnR5R3JvdXBzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEpzcENvbmZpZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKc3BQYWNrYWdlLkxpdGVyYWxzLkpTUF9DT05GSUc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VGFnTGlicygpIHsKLQkJaWYgKHRhZ0xpYnMgPT0gbnVsbCkgewotCQkJdGFnTGlicyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUYWdMaWIuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlMpOwotCQl9Ci0JCXJldHVybiB0YWdMaWJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEpzcFByb3BlcnR5R3JvdXBzKCkgewotCQlpZiAoanNwUHJvcGVydHlHcm91cHMgPT0gbnVsbCkgewotCQkJanNwUHJvcGVydHlHcm91cHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSnNwUHJvcGVydHlHcm91cC5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfQ09ORklHX19KU1BfUFJPUEVSVFlfR1JPVVBTKTsKLQkJfQotCQlyZXR1cm4ganNwUHJvcGVydHlHcm91cHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfQ09ORklHX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGFnTGlicygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fSlNQX1BST1BFUlRZX0dST1VQUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEpzcFByb3BlcnR5R3JvdXBzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTOgotCQkJCXJldHVybiBnZXRUYWdMaWJzKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fSlNQX1BST1BFUlRZX0dST1VQUzoKLQkJCQlyZXR1cm4gZ2V0SnNwUHJvcGVydHlHcm91cHMoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTOgotCQkJCWdldFRhZ0xpYnMoKS5jbGVhcigpOwotCQkJCWdldFRhZ0xpYnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19KU1BfUFJPUEVSVFlfR1JPVVBTOgotCQkJCWdldEpzcFByb3BlcnR5R3JvdXBzKCkuY2xlYXIoKTsKLQkJCQlnZXRKc3BQcm9wZXJ0eUdyb3VwcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6Ci0JCQkJZ2V0VGFnTGlicygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX0pTUF9QUk9QRVJUWV9HUk9VUFM6Ci0JCQkJZ2V0SnNwUHJvcGVydHlHcm91cHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6Ci0JCQkJcmV0dXJuIHRhZ0xpYnMgIT0gbnVsbCAmJiAhdGFnTGlicy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fSlNQX1BST1BFUlRZX0dST1VQUzoKLQkJCQlyZXR1cm4ganNwUHJvcGVydHlHcm91cHMgIT0gbnVsbCAmJiAhanNwUHJvcGVydHlHcm91cHMuaXNFbXB0eSgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Kc3BDb25maWdJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWYxYjc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpzcEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSnNwRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnNwRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJSnNwRmFjdG9yeSB0aGVKc3BGYWN0b3J5ID0gKEpzcEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qc3AiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWlmICh0aGVKc3BGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlSnNwRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBKc3BGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpzcEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJRzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUpzcENvbmZpZygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUpzcFByb3BlcnR5R3JvdXAoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGFnTGliKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfRklMRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVKc3BGaWxlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0ZJTEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEpzcEZpbGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwQ29uZmlnIGNyZWF0ZUpzcENvbmZpZygpIHsKLQkJSnNwQ29uZmlnSW1wbCBqc3BDb25maWcgPSBuZXcgSnNwQ29uZmlnSW1wbCgpOwotCQlyZXR1cm4ganNwQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BQcm9wZXJ0eUdyb3VwIGNyZWF0ZUpzcFByb3BlcnR5R3JvdXAoKSB7Ci0JCUpzcFByb3BlcnR5R3JvdXBJbXBsIGpzcFByb3BlcnR5R3JvdXAgPSBuZXcgSnNwUHJvcGVydHlHcm91cEltcGwoKTsKLQkJcmV0dXJuIGpzcFByb3BlcnR5R3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhZ0xpYiBjcmVhdGVUYWdMaWIoKSB7Ci0JCVRhZ0xpYkltcGwgdGFnTGliID0gbmV3IFRhZ0xpYkltcGwoKTsKLQkJcmV0dXJuIHRhZ0xpYjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUpzcEZpbGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKUphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QQVRIX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SnNwRmlsZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUEFUSF9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwUGFja2FnZSBnZXRKc3BQYWNrYWdlKCkgewotCQlyZXR1cm4gKEpzcFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnNwUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gSnNwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vSnNwRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhOWIyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLm5hbWVzcGFjZS5YTUxOYW1lc3BhY2VQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3BQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEpzcFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGpzcENvbmZpZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhZ0xpYkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBqc3BGaWxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBKc3BQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSnNwRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKc3BQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChKc3BQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgSnNwUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxOYW1lc3BhY2VQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVdlYlBhY2thZ2VJbXBsIHRoZVdlYlBhY2thZ2UgPSAoV2ViUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgOiBXZWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmF2YWVlUGFja2FnZUltcGwgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEphdmFlZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSA6IEphdmFlZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UgPSAoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YWVlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVKc3BQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVKc3BQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SnNwQ29uZmlnKCkgewotCQlyZXR1cm4ganNwQ29uZmlnRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpzcENvbmZpZ19UYWdMaWJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SnNwQ29uZmlnX0pzcFByb3BlcnR5R3JvdXBzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SnNwQ29uZmlnX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKc3BQcm9wZXJ0eUdyb3VwKCkgewotCQlyZXR1cm4ganNwUHJvcGVydHlHcm91cEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpzcFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9FbElnbm9yZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9QYWdlRW5jb2RpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9TY3JpcHRpbmdJbnZhbGlkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpzcFByb3BlcnR5R3JvdXBfSXNYbWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9JbmNsdWRlUHJlbHVkZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9EZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpzcFByb3BlcnR5R3JvdXBfVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhZ0xpYigpIHsKLQkJcmV0dXJuIHRhZ0xpYkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJfVGFnbGliVXJpKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnTGliRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnTGliX1RhZ2xpYkxvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnTGliRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnTGliX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnTGliRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRKc3BGaWxlVHlwZSgpIHsKLQkJcmV0dXJuIGpzcEZpbGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BGYWN0b3J5IGdldEpzcEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSnNwRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlqc3BDb25maWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSlNQX0NPTkZJRyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwQ29uZmlnRUNsYXNzLCBKU1BfQ09ORklHX19UQUdfTElCUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwQ29uZmlnRUNsYXNzLCBKU1BfQ09ORklHX19KU1BfUFJPUEVSVFlfR1JPVVBTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BDb25maWdFQ2xhc3MsIEpTUF9DT05GSUdfX0lEKTsKLQotCQlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpTUF9QUk9QRVJUWV9HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19JQ09OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19UUklNX0RJUkVDVElWRV9XSElURVNQQUNFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19JRCk7Ci0KLQkJdGFnTGliRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBR19MSUIpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0xpYkVDbGFzcywgVEFHX0xJQl9fVEFHTElCX1VSSSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnTGliRUNsYXNzLCBUQUdfTElCX19UQUdMSUJfTE9DQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0xpYkVDbGFzcywgVEFHX0xJQl9fSUQpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCWpzcEZpbGVUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEpTUF9GSUxFX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQkJSmF2YWVlUGFja2FnZSB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhqc3BDb25maWdFQ2xhc3MsIEpzcENvbmZpZy5jbGFzcywgIkpzcENvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRKc3BDb25maWdfVGFnTGlicygpLCB0aGlzLmdldFRhZ0xpYigpLCBudWxsLCAidGFnTGlicyIsIG51bGwsIDAsIC0xLCBKc3BDb25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwQ29uZmlnX0pzcFByb3BlcnR5R3JvdXBzKCksIHRoaXMuZ2V0SnNwUHJvcGVydHlHcm91cCgpLCBudWxsLCAianNwUHJvcGVydHlHcm91cHMiLCBudWxsLCAwLCAtMSwgSnNwQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEpzcENvbmZpZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBKc3BDb25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICJKc3BQcm9wZXJ0eUdyb3VwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEpzcFByb3BlcnR5R3JvdXBfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEpzcFByb3BlcnR5R3JvdXBfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEpzcFByb3BlcnR5R3JvdXBfSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEpzcFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRVcmxQYXR0ZXJuVHlwZSgpLCBudWxsLCAidXJsUGF0dGVybnMiLCBudWxsLCAxLCAtMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgImVsSWdub3JlZCIsIG51bGwsIDAsIDEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9QYWdlRW5jb2RpbmcoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInBhZ2VFbmNvZGluZyIsIG51bGwsIDAsIDEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEpzcFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgInNjcmlwdGluZ0ludmFsaWQiLCBudWxsLCAwLCAxLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEpzcFByb3BlcnR5R3JvdXBfSXNYbWwoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJpc1htbCIsIG51bGwsIDAsIDEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9JbmNsdWRlUHJlbHVkZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAiaW5jbHVkZVByZWx1ZGVzIiwgbnVsbCwgMCwgLTEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEpzcFByb3BlcnR5R3JvdXBfSW5jbHVkZUNvZGFzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImluY2x1ZGVDb2RhcyIsIG51bGwsIDAsIC0xLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgImRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCIsIG51bGwsIDAsIDEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9UcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJ0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXMiLCBudWxsLCAwLCAxLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEpzcFByb3BlcnR5R3JvdXBfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3ModGFnTGliRUNsYXNzLCBUYWdMaWIuY2xhc3MsICJUYWdMaWIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX1RhZ2xpYlVyaSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAidGFnbGliVXJpIiwgbnVsbCwgMSwgMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJfVGFnbGliTG9jYXRpb24oKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAidGFnbGliTG9jYXRpb24iLCBudWxsLCAxLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZShqc3BGaWxlVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiSnNwRmlsZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKLQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGE8L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiOyAvLyROT04tTkxTLTEkCQkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGpzcENvbmZpZ0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAianNwLWNvbmZpZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwQ29uZmlnX1RhZ0xpYnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInRhZ2xpYiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpzcENvbmZpZ19Kc3BQcm9wZXJ0eUdyb3VwcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAianNwLXByb3BlcnR5LWdyb3VwIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwQ29uZmlnX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoanNwRmlsZVR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImpzcC1maWxlVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUjcGF0aFR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJqc3AtcHJvcGVydHktZ3JvdXBUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpzcFByb3BlcnR5R3JvdXBfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKc3BQcm9wZXJ0eUdyb3VwX0Rpc3BsYXlOYW1lcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpzcFByb3BlcnR5R3JvdXBfSWNvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImljb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidXJsLXBhdHRlcm4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwUHJvcGVydHlHcm91cF9FbElnbm9yZWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVsLWlnbm9yZWQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwUHJvcGVydHlHcm91cF9QYWdlRW5jb2RpbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBhZ2UtZW5jb2RpbmciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwUHJvcGVydHlHcm91cF9TY3JpcHRpbmdJbnZhbGlkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzY3JpcHRpbmctaW52YWxpZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKc3BQcm9wZXJ0eUdyb3VwX0lzWG1sKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpcy14bWwiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0SnNwUHJvcGVydHlHcm91cF9JbmNsdWRlUHJlbHVkZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluY2x1ZGUtcHJlbHVkZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKc3BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW5jbHVkZS1jb2RhIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpzcFByb3BlcnR5R3JvdXBfRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZWZlcnJlZC1zeW50YXgtYWxsb3dlZC1hcy1saXRlcmFsIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpzcFByb3BlcnR5R3JvdXBfVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ0cmltLWRpcmVjdGl2ZS13aGl0ZXNwYWNlcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpzcFByb3BlcnR5R3JvdXBfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0YWdMaWJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInRhZ2xpYlR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhZ0xpYl9UYWdsaWJVcmkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInRhZ2xpYi11cmkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFnTGliX1RhZ2xpYkxvY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ0YWdsaWItbG9jYXRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYWdMaWJfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsKLQl9Ci0KLX0gLy9Kc3BQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQcm9wZXJ0eUdyb3VwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQcm9wZXJ0eUdyb3VwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjJiZGM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwUHJvcGVydHlHcm91cEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHkgR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQcm9wZXJ0eUdyb3VwSW1wbCNnZXRVcmxQYXR0ZXJucyA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsI2lzRWxJZ25vcmVkIDxlbT5FbCBJZ25vcmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsI2dldFBhZ2VFbmNvZGluZyA8ZW0+UGFnZSBFbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQcm9wZXJ0eUdyb3VwSW1wbCNpc1NjcmlwdGluZ0ludmFsaWQgPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsI2lzSXNYbWwgPGVtPklzIFhtbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQcm9wZXJ0eUdyb3VwSW1wbCNnZXRJbmNsdWRlUHJlbHVkZXMgPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjZ2V0SW5jbHVkZUNvZGFzIDxlbT5JbmNsdWRlIENvZGFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsI2lzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsIDxlbT5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzIDxlbT5UcmltIERpcmVjdGl2ZSBXaGl0ZXNwYWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQcm9wZXJ0eUdyb3VwSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3BQcm9wZXJ0eUdyb3VwSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSnNwUHJvcGVydHlHcm91cCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaWNvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJsUGF0dGVybnMoKSA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVybFBhdHRlcm5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdXJsUGF0dGVybnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWxJZ25vcmVkKCkgPGVtPkVsIElnbm9yZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWxJZ25vcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRUxfSUdOT1JFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFbElnbm9yZWQoKSA8ZW0+RWwgSWdub3JlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFbElnbm9yZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVsSWdub3JlZCA9IEVMX0lHTk9SRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEVsIElnbm9yZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVsSWdub3JlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWdlRW5jb2RpbmcoKSA8ZW0+UGFnZSBFbmNvZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFnZUVuY29kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0VOQ09ESU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZ2VFbmNvZGluZygpIDxlbT5QYWdlIEVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWdlRW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFnZUVuY29kaW5nID0gUEFHRV9FTkNPRElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NjcmlwdGluZ0ludmFsaWQoKSA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2NyaXB0aW5nSW52YWxpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNDUklQVElOR19JTlZBTElEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NjcmlwdGluZ0ludmFsaWQoKSA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2NyaXB0aW5nSW52YWxpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NyaXB0aW5nSW52YWxpZCA9IFNDUklQVElOR19JTlZBTElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTY3JpcHRpbmcgSW52YWxpZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NyaXB0aW5nSW52YWxpZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzWG1sKCkgPGVtPklzIFhtbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1htbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1hNTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1htbCgpIDxlbT5JcyBYbWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNYbWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzWG1sID0gSVNfWE1MX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBYbWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzWG1sRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jbHVkZVByZWx1ZGVzKCkgPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5jbHVkZVByZWx1ZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5jbHVkZVByZWx1ZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2x1ZGVDb2RhcygpIDxlbT5JbmNsdWRlIENvZGFzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY2x1ZGVDb2RhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluY2x1ZGVDb2RhcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKSA8ZW0+RGVmZXJyZWQgU3ludGF4IEFsbG93ZWQgQXMgTGl0ZXJhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpIDxlbT5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsID0gREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRGVmZXJyZWQgU3ludGF4IEFsbG93ZWQgQXMgTGl0ZXJhbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkgPGVtPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpIDxlbT5UcmltIERpcmVjdGl2ZSBXaGl0ZXNwYWNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyA9IFRSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmltIERpcmVjdGl2ZSBXaGl0ZXNwYWNlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSnNwUHJvcGVydHlHcm91cEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKc3BQYWNrYWdlLkxpdGVyYWxzLkpTUF9QUk9QRVJUWV9HUk9VUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKLQkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgewotCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lDT05TKTsKLQkJfQotCQlyZXR1cm4gaWNvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VXJsUGF0dGVybnMoKSB7Ci0JCWlmICh1cmxQYXR0ZXJucyA9PSBudWxsKSB7Ci0JCQl1cmxQYXR0ZXJucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChVcmxQYXR0ZXJuVHlwZS5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOUyk7Ci0JCX0KLQkJcmV0dXJuIHVybFBhdHRlcm5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWxJZ25vcmVkKCkgewotCQlyZXR1cm4gZWxJZ25vcmVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsSWdub3JlZChib29sZWFuIG5ld0VsSWdub3JlZCkgewotCQlib29sZWFuIG9sZEVsSWdub3JlZCA9IGVsSWdub3JlZDsKLQkJZWxJZ25vcmVkID0gbmV3RWxJZ25vcmVkOwotCQlib29sZWFuIG9sZEVsSWdub3JlZEVTZXQgPSBlbElnbm9yZWRFU2V0OwotCQllbElnbm9yZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQsIG9sZEVsSWdub3JlZCwgZWxJZ25vcmVkLCAhb2xkRWxJZ25vcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RWxJZ25vcmVkKCkgewotCQlib29sZWFuIG9sZEVsSWdub3JlZCA9IGVsSWdub3JlZDsKLQkJYm9vbGVhbiBvbGRFbElnbm9yZWRFU2V0ID0gZWxJZ25vcmVkRVNldDsKLQkJZWxJZ25vcmVkID0gRUxfSUdOT1JFRF9FREVGQVVMVDsKLQkJZWxJZ25vcmVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVELCBvbGRFbElnbm9yZWQsIEVMX0lHTk9SRURfRURFRkFVTFQsIG9sZEVsSWdub3JlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEVsSWdub3JlZCgpIHsKLQkJcmV0dXJuIGVsSWdub3JlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlRW5jb2RpbmcoKSB7Ci0JCXJldHVybiBwYWdlRW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZUVuY29kaW5nKFN0cmluZyBuZXdQYWdlRW5jb2RpbmcpIHsKLQkJU3RyaW5nIG9sZFBhZ2VFbmNvZGluZyA9IHBhZ2VFbmNvZGluZzsKLQkJcGFnZUVuY29kaW5nID0gbmV3UGFnZUVuY29kaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORywgb2xkUGFnZUVuY29kaW5nLCBwYWdlRW5jb2RpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NjcmlwdGluZ0ludmFsaWQoKSB7Ci0JCXJldHVybiBzY3JpcHRpbmdJbnZhbGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjcmlwdGluZ0ludmFsaWQoYm9vbGVhbiBuZXdTY3JpcHRpbmdJbnZhbGlkKSB7Ci0JCWJvb2xlYW4gb2xkU2NyaXB0aW5nSW52YWxpZCA9IHNjcmlwdGluZ0ludmFsaWQ7Ci0JCXNjcmlwdGluZ0ludmFsaWQgPSBuZXdTY3JpcHRpbmdJbnZhbGlkOwotCQlib29sZWFuIG9sZFNjcmlwdGluZ0ludmFsaWRFU2V0ID0gc2NyaXB0aW5nSW52YWxpZEVTZXQ7Ci0JCXNjcmlwdGluZ0ludmFsaWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElELCBvbGRTY3JpcHRpbmdJbnZhbGlkLCBzY3JpcHRpbmdJbnZhbGlkLCAhb2xkU2NyaXB0aW5nSW52YWxpZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNjcmlwdGluZ0ludmFsaWQoKSB7Ci0JCWJvb2xlYW4gb2xkU2NyaXB0aW5nSW52YWxpZCA9IHNjcmlwdGluZ0ludmFsaWQ7Ci0JCWJvb2xlYW4gb2xkU2NyaXB0aW5nSW52YWxpZEVTZXQgPSBzY3JpcHRpbmdJbnZhbGlkRVNldDsKLQkJc2NyaXB0aW5nSW52YWxpZCA9IFNDUklQVElOR19JTlZBTElEX0VERUZBVUxUOwotCQlzY3JpcHRpbmdJbnZhbGlkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRCwgb2xkU2NyaXB0aW5nSW52YWxpZCwgU0NSSVBUSU5HX0lOVkFMSURfRURFRkFVTFQsIG9sZFNjcmlwdGluZ0ludmFsaWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTY3JpcHRpbmdJbnZhbGlkKCkgewotCQlyZXR1cm4gc2NyaXB0aW5nSW52YWxpZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1htbCgpIHsKLQkJcmV0dXJuIGlzWG1sOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzWG1sKGJvb2xlYW4gbmV3SXNYbWwpIHsKLQkJYm9vbGVhbiBvbGRJc1htbCA9IGlzWG1sOwotCQlpc1htbCA9IG5ld0lzWG1sOwotCQlib29sZWFuIG9sZElzWG1sRVNldCA9IGlzWG1sRVNldDsKLQkJaXNYbWxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTCwgb2xkSXNYbWwsIGlzWG1sLCAhb2xkSXNYbWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1htbCgpIHsKLQkJYm9vbGVhbiBvbGRJc1htbCA9IGlzWG1sOwotCQlib29sZWFuIG9sZElzWG1sRVNldCA9IGlzWG1sRVNldDsKLQkJaXNYbWwgPSBJU19YTUxfRURFRkFVTFQ7Ci0JCWlzWG1sRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUwsIG9sZElzWG1sLCBJU19YTUxfRURFRkFVTFQsIG9sZElzWG1sRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNYbWwoKSB7Ci0JCXJldHVybiBpc1htbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5jbHVkZVByZWx1ZGVzKCkgewotCQlpZiAoaW5jbHVkZVByZWx1ZGVzID09IG51bGwpIHsKLQkJCWluY2x1ZGVQcmVsdWRlcyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTKTsKLQkJfQotCQlyZXR1cm4gaW5jbHVkZVByZWx1ZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluY2x1ZGVDb2RhcygpIHsKLQkJaWYgKGluY2x1ZGVDb2RhcyA9PSBudWxsKSB7Ci0JCQlpbmNsdWRlQ29kYXMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUyk7Ci0JCX0KLQkJcmV0dXJuIGluY2x1ZGVDb2RhczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIGRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoYm9vbGVhbiBuZXdEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwpIHsKLQkJYm9vbGVhbiBvbGREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwgPSBkZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWw7Ci0JCWRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCA9IG5ld0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbDsKLQkJYm9vbGVhbiBvbGREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWxFU2V0ID0gZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsRVNldDsKLQkJZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMLCBvbGREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwsIGRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCwgIW9sZERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpIHsKLQkJYm9vbGVhbiBvbGREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwgPSBkZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWw7Ci0JCWJvb2xlYW4gb2xkRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsRVNldCA9IGRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbEVTZXQ7Ci0JCWRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCA9IERFRkVSUkVEX1NZTlRBWF9BTExPV0VEX0FTX0xJVEVSQUxfRURFRkFVTFQ7Ci0JCWRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTCwgb2xkRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsLCBERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMX0VERUZBVUxULCBvbGREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKSB7Ci0JCXJldHVybiBkZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCkgewotCQlyZXR1cm4gdHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyhib29sZWFuIG5ld1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcykgewotCQlib29sZWFuIG9sZFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyA9IHRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlczsKLQkJdHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzID0gbmV3VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzOwotCQlib29sZWFuIG9sZFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlc0VTZXQgPSB0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXNFU2V0OwotCQl0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTLCBvbGRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMsIHRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcywgIW9sZFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpIHsKLQkJYm9vbGVhbiBvbGRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMgPSB0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXM7Ci0JCWJvb2xlYW4gb2xkVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzRVNldCA9IHRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlc0VTZXQ7Ci0JCXRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyA9IFRSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTX0VERUZBVUxUOwotCQl0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTLCBvbGRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMsIFRSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTX0VERUZBVUxULCBvbGRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKSB7Ci0JCXJldHVybiB0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRVcmxQYXR0ZXJucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk5TOgotCQkJCXJldHVybiBnZXRVcmxQYXR0ZXJucygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRDoKLQkJCQlyZXR1cm4gaXNFbElnbm9yZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HOgotCQkJCXJldHVybiBnZXRQYWdlRW5jb2RpbmcoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEOgotCQkJCXJldHVybiBpc1NjcmlwdGluZ0ludmFsaWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUw6Ci0JCQkJcmV0dXJuIGlzSXNYbWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTOgotCQkJCXJldHVybiBnZXRJbmNsdWRlUHJlbHVkZXMoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVM6Ci0JCQkJcmV0dXJuIGdldEluY2x1ZGVDb2RhcygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTDoKLQkJCQlyZXR1cm4gaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19UUklNX0RJUkVDVElWRV9XSElURVNQQUNFUzoKLQkJCQlyZXR1cm4gaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOUzoKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQkJZ2V0VXJsUGF0dGVybnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQ6Ci0JCQkJc2V0RWxJZ25vcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkc6Ci0JCQkJc2V0UGFnZUVuY29kaW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEOgotCQkJCXNldFNjcmlwdGluZ0ludmFsaWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MOgotCQkJCXNldElzWG1sKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVM6Ci0JCQkJZ2V0SW5jbHVkZVByZWx1ZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmNsdWRlUHJlbHVkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVM6Ci0JCQkJZ2V0SW5jbHVkZUNvZGFzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmNsdWRlQ29kYXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RFRkVSUkVEX1NZTlRBWF9BTExPV0VEX0FTX0xJVEVSQUw6Ci0JCQkJc2V0RGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTOgotCQkJCXNldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTlM6Ci0JCQkJZ2V0VXJsUGF0dGVybnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQ6Ci0JCQkJdW5zZXRFbElnbm9yZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HOgotCQkJCXNldFBhZ2VFbmNvZGluZyhQQUdFX0VOQ09ESU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRDoKLQkJCQl1bnNldFNjcmlwdGluZ0ludmFsaWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUw6Ci0JCQkJdW5zZXRJc1htbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVM6Ci0JCQkJZ2V0SW5jbHVkZVByZWx1ZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTOgotCQkJCWdldEluY2x1ZGVDb2RhcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTDoKLQkJCQl1bnNldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTOgotCQkJCXVuc2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOUzoKLQkJCQlyZXR1cm4gdXJsUGF0dGVybnMgIT0gbnVsbCAmJiAhdXJsUGF0dGVybnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRDoKLQkJCQlyZXR1cm4gaXNTZXRFbElnbm9yZWQoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkc6Ci0JCQkJcmV0dXJuIFBBR0VfRU5DT0RJTkdfRURFRkFVTFQgPT0gbnVsbCA/IHBhZ2VFbmNvZGluZyAhPSBudWxsIDogIVBBR0VfRU5DT0RJTkdfRURFRkFVTFQuZXF1YWxzKHBhZ2VFbmNvZGluZyk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRDoKLQkJCQlyZXR1cm4gaXNTZXRTY3JpcHRpbmdJbnZhbGlkKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUw6Ci0JCQkJcmV0dXJuIGlzU2V0SXNYbWwoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVM6Ci0JCQkJcmV0dXJuIGluY2x1ZGVQcmVsdWRlcyAhPSBudWxsICYmICFpbmNsdWRlUHJlbHVkZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUzoKLQkJCQlyZXR1cm4gaW5jbHVkZUNvZGFzICE9IG51bGwgJiYgIWluY2x1ZGVDb2Rhcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMOgotCQkJCXJldHVybiBpc1NldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVM6Ci0JCQkJcmV0dXJuIGlzU2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVsSWdub3JlZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGVsSWdub3JlZEVTZXQpIHJlc3VsdC5hcHBlbmQoZWxJZ25vcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYWdlRW5jb2Rpbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGFnZUVuY29kaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY3JpcHRpbmdJbnZhbGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2NyaXB0aW5nSW52YWxpZEVTZXQpIHJlc3VsdC5hcHBlbmQoc2NyaXB0aW5nSW52YWxpZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgaXNYbWw6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpc1htbEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNYbWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCIsIGluY2x1ZGVQcmVsdWRlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbmNsdWRlUHJlbHVkZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluY2x1ZGVDb2RhczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbmNsdWRlQ29kYXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbEVTZXQpIHJlc3VsdC5hcHBlbmQoZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCB0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXNFU2V0KSByZXN1bHQuYXBwZW5kKHRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Kc3BQcm9wZXJ0eUdyb3VwSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvVGFnTGliSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MDBhNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWcgTGliPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYkltcGwjZ2V0VGFnbGliVXJpIDxlbT5UYWdsaWIgVXJpPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYkltcGwjZ2V0VGFnbGliTG9jYXRpb24gPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5UYWdMaWJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhZ0xpYkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFRhZ0xpYiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ2xpYlVyaSgpIDxlbT5UYWdsaWIgVXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdsaWJVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0xJQl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnbGliVXJpKCkgPGVtPlRhZ2xpYiBVcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhZ2xpYlVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YWdsaWJVcmkgPSBUQUdMSUJfVVJJX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ2xpYkxvY2F0aW9uKCkgPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnbGliTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdsaWJMb2NhdGlvbigpIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhZ2xpYkxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhZ2xpYkxvY2F0aW9uID0gVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFnTGliSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpzcFBhY2thZ2UuTGl0ZXJhbHMuVEFHX0xJQjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhZ2xpYlVyaSgpIHsKLQkJcmV0dXJuIHRhZ2xpYlVyaTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdsaWJVcmkoU3RyaW5nIG5ld1RhZ2xpYlVyaSkgewotCQlTdHJpbmcgb2xkVGFnbGliVXJpID0gdGFnbGliVXJpOwotCQl0YWdsaWJVcmkgPSBuZXdUYWdsaWJVcmk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpzcFBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX1VSSSwgb2xkVGFnbGliVXJpLCB0YWdsaWJVcmkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhZ2xpYkxvY2F0aW9uKCkgewotCQlyZXR1cm4gdGFnbGliTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFnbGliTG9jYXRpb24oU3RyaW5nIG5ld1RhZ2xpYkxvY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRUYWdsaWJMb2NhdGlvbiA9IHRhZ2xpYkxvY2F0aW9uOwotCQl0YWdsaWJMb2NhdGlvbiA9IG5ld1RhZ2xpYkxvY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLlRBR19MSUJfX1RBR0xJQl9MT0NBVElPTiwgb2xkVGFnbGliTG9jYXRpb24sIHRhZ2xpYkxvY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5UQUdfTElCX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX1RBR0xJQl9VUkk6Ci0JCQkJcmV0dXJuIGdldFRhZ2xpYlVyaSgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX1RBR0xJQl9MT0NBVElPTjoKLQkJCQlyZXR1cm4gZ2V0VGFnbGliTG9jYXRpb24oKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX1RBR0xJQl9VUkk6Ci0JCQkJc2V0VGFnbGliVXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJc2V0VGFnbGliTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX1VSSToKLQkJCQlzZXRUYWdsaWJVcmkoVEFHTElCX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX1RBR0xJQl9MT0NBVElPTjoKLQkJCQlzZXRUYWdsaWJMb2NhdGlvbihUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX1VSSToKLQkJCQlyZXR1cm4gVEFHTElCX1VSSV9FREVGQVVMVCA9PSBudWxsID8gdGFnbGliVXJpICE9IG51bGwgOiAhVEFHTElCX1VSSV9FREVGQVVMVC5lcXVhbHModGFnbGliVXJpKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJcmV0dXJuIFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gdGFnbGliTG9jYXRpb24gIT0gbnVsbCA6ICFUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKHRhZ2xpYkxvY2F0aW9uKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRhZ2xpYlVyaTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0YWdsaWJVcmkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhZ2xpYkxvY2F0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRhZ2xpYkxvY2F0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1RhZ0xpYkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9tZXRhZGF0YS9Kc3BQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9tZXRhZGF0YS9Kc3BQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4M2Y0ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvbWV0YWRhdGEvSnNwUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqICAgICAgIEAoIylqc3BfMl8xLnhzZHMJMS41IDA4LzExLzA1Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIDIuMSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAqICAgICAgIHR5cGVzLiAgVGhlIEpTUCAyLjEgc2NoZW1hIGNvbnRhaW5zIGFsbCB0aGUgc3BlY2lhbAotICogICAgICAgc3RydWN0dXJlcyBhbmQgZGF0YXR5cGVzIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byB1c2UgSlNQIGZpbGVzCi0gKiAgICAgICBmcm9tIGEgd2ViIGFwcGxpY2F0aW9uLgotICogCi0gKiAgICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBzY2hlbWEgaXMgdXNlZCBieSB0aGUgd2ViLWFwcF8yXzUueHNkCi0gKiAgICAgICBmaWxlIHRvIGRlZmluZSBKU1Agc3BlY2lmaWMgY29udGVudC4KLSAqIAotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAqICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAqIAotICogICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICogCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gKiAJdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICogCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gKiAJSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAqIAlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAqIAluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLSAqIAotICogICAgIAotICogCi0gKiAgICAgICBAKCMpamF2YWVlXzUueHNkcwkxLjY1IDA2LzAyLzE3Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogCi0gKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KLSAqIHNoYXJlYWJsZSBzY2hlbWEocykgb2YgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQotICogaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgotICogCi0gKiBEZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgajJlZSBhcHBsaWNhdGlvbjsKLSAqICAgICBhcHBsaWNhdGlvbiBjbGllbnQ7Ci0gKiAgICAgd2ViIGFwcGxpY2F0aW9uOwotICogICAgIGVudGVycHJpc2UgYmVhbjsKLSAqICAgICByZXNvdXJjZSBhZGFwdGVyOwotICogCi0gKiBEZXBsb3ltZW50IEZpbGUgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgIGVhciBmaWxlOwotICogICAgIHdhciBmaWxlOwotICogICAgIGphciBmaWxlOwotICogICAgIHJhciBmaWxlOwotICogCi0gKiAKLSAqIAotICogICAgICAgQCgjKWphdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2RzCTEuMTkgMDIvMTMvMDYKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0gKiAKLSAqICAgICAKLSAqIAotICogICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZAotICogICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuYW1lc3BhY2UuCi0gKiAKLSAqICAgICBUaGlzIHNjaGVtYSBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFhNTCBuYW1lc3BhY2UsIGluIGEgZm9ybQotICogICAgIHN1aXRhYmxlIGZvciBpbXBvcnQgYnkgb3RoZXIgc2NoZW1hIGRvY3VtZW50cy4gIAotICogCi0gKiAgICAgTm90ZSB0aGF0IGxvY2FsIG5hbWVzIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBkZWZpbmVkCi0gKiAgICAgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLiAgVGhlCi0gKiAgICAgZm9sbG93aW5nIG5hbWVzIGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGlzIG5hbWVzcGFjZSBhbmQgc2hvdWxkCi0gKiAgICAgbm90IGJlIHVzZWQgd2l0aCBjb25mbGljdGluZyBzZW1hbnRpY3MgYnkgYW55IFdvcmtpbmcgR3JvdXAsCi0gKiAgICAgc3BlY2lmaWNhdGlvbiwgb3IgZG9jdW1lbnQgaW5zdGFuY2U6Ci0gKiAKLSAqICAgICBiYXNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBwcm92aWRlcyBhIFVSSSB0byBiZSB1c2VkIGFzIHRoZSBiYXNlIGZvciBpbnRlcnByZXRpbmcgYW55Ci0gKiAgICAgICAgICByZWxhdGl2ZSBVUklzIGluIHRoZSBzY29wZSBvZiB0aGUgZWxlbWVudCBvbiB3aGljaCBpdAotICogICAgICAgICAgYXBwZWFyczsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAotICogICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgQmFzZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgaWQgICAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGlmIGRlY2xhcmVkIHRvIGJlIG9mIHR5cGUgSUQuCi0gKiAgICAgICAgICBUaGUgeG1sOmlkIHNwZWNpZmljYXRpb24gaXMgbm90IHlldCBhIFczQyBSZWNvbW1lbmRhdGlvbiwKLSAqICAgICAgICAgIGJ1dCB0aGlzIGF0dHJpYnV0ZSBpcyBpbmNsdWRlZCBoZXJlIHRvIGZhY2lsaXRhdGUgZXhwZXJpbWVudGF0aW9uCi0gKiAgICAgICAgICB3aXRoIHRoZSBtZWNoYW5pc21zIGl0IHByb3Bvc2VzLiAgTm90ZSB0aGF0IGl0IGlzIF9ub3RfIGluY2x1ZGVkCi0gKiAgICAgICAgICBpbiB0aGUgc3BlY2lhbEF0dHJzIGF0dHJpYnV0ZSBncm91cC4KLSAqIAotICogICAgIGxhbmcgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIGlzIGEgbGFuZ3VhZ2UgY29kZSBmb3IgdGhlIG5hdHVyYWwgbGFuZ3VhZ2Ugb2YgdGhlIGNvbnRlbnQgb2YKLSAqICAgICAgICAgIGFueSBlbGVtZW50OyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgotICogICAKLSAqICAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZQotICogICAgICAgICAgdmFsdWUgaXMgYSBrZXl3b3JkIGluZGljYXRpbmcgd2hhdCB3aGl0ZXNwYWNlIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGRpc2NpcGxpbmUgaXMgaW50ZW5kZWQgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50OyBpdHMKLSAqICAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzCi0gKiAgICAgICAgICBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KLSAqIAotICogICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKLSAqICAgICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKLSAqICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCi0gKiAgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKLSAqIAotICogICAgICAgICAgICAgIEluIGFwcHJlY2lhdGlvbiBmb3IgaGlzIHZpc2lvbiwgbGVhZGVyc2hpcCBhbmQgZGVkaWNhdGlvbgotICogICAgICAgICAgICAgIHRoZSBXM0MgWE1MIFBsZW5hcnkgb24gdGhpcyAxMHRoIGRheSBvZiBGZWJydWFyeSwgMjAwMAotICogICAgICAgICAgICAgIHJlc2VydmVzIGZvciBKb24gQm9zYWsgaW4gcGVycGV0dWl0eSB0aGUgWE1MIG5hbWUKLSAqICAgICAgICAgICAgICB4bWw6RmF0aGVyCi0gKiAgIAotICogVGhpcyBzY2hlbWEgZGVmaW5lcyBhdHRyaWJ1dGVzIGFuZCBhbiBhdHRyaWJ1dGUgZ3JvdXAKLSAqICAgICAgICAgc3VpdGFibGUgZm9yIHVzZSBieQotICogICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nLCB4bWw6c3BhY2Ugb3IgeG1sOmlkCi0gKiAgICAgICAgIGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCi0gKiAKLSAqICAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKLSAqICAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6Ci0gKiAgICAgICAgICZsdDtzY2hlbWEgLiAuIC4mZ3Q7Ci0gKiAgICAgICAgICAuIC4gLgotICogICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAqICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvJmd0OwotICogCi0gKiAgICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKLSAqICAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgotICogCi0gKiAgICAgICAgICZsdDt0eXBlIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLyZndDsKLSAqICAKLSAqICAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICogICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzCi0gKiBJbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gKiAgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkLgotICogICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAqICAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gKiAgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gKiAgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwKLSAqICAgIFNjaGVtYSBvciBYTUwgbmFtZXNwYWNlcyBjaGFuZ2UsIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCB3aWxsIGNoYW5nZQotICogICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2Qgd2lsbCBub3QgY2hhbmdlLgotICogICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwRmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpzcFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAianNwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvanNwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAianNwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKc3BQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcENvbmZpZ0ltcGwgPGVtPkNvbmZpZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwQ29uZmlnSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbCNnZXRKc3BDb25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSlNQX0NPTkZJRyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnIExpYnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9DT05GSUdfX1RBR19MSUJTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kc3AgUHJvcGVydHkgR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfQ09ORklHX19KU1BfUFJPUEVSVFlfR1JPVVBTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9DT05GSUdfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25maWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX0NPTkZJR19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQcm9wZXJ0eUdyb3VwSW1wbCA8ZW0+UHJvcGVydHkgR3JvdXA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldEpzcFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lDT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk5TID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbCBJZ25vcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWdlIEVuY29kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY3JpcHRpbmcgSW52YWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFhtbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlIFByZWx1ZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVMgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGUgQ29kYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUyA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmZXJyZWQgU3ludGF4IEFsbG93ZWQgQXMgTGl0ZXJhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19UUklNX0RJUkVDVElWRV9XSElURVNQQUNFUyA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19JRCA9IDEyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb3BlcnR5IEdyb3VwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9GRUFUVVJFX0NPVU5UID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuVGFnTGliSW1wbCA8ZW0+VGFnIExpYjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuVGFnTGliSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbCNnZXRUYWdMaWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFHX0xJQiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnbGliIFVyaTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX1RBR0xJQl9VUkkgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhZ2xpYiBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX1RBR0xJQl9MT0NBVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFnIExpYjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5GaWxlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldEpzcEZpbGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpTUF9GSUxFX1RZUEUgPSAzOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWcgPGVtPkNvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25maWc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEpzcENvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcENvbmZpZyNnZXRUYWdMaWJzIDxlbT5UYWcgTGliczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFnIExpYnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWcjZ2V0VGFnTGlicygpCi0JICogQHNlZSAjZ2V0SnNwQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKc3BDb25maWdfVGFnTGlicygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcENvbmZpZyNnZXRKc3BQcm9wZXJ0eUdyb3VwcyA8ZW0+SnNwIFByb3BlcnR5IEdyb3VwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SnNwIFByb3BlcnR5IEdyb3VwczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcENvbmZpZyNnZXRKc3BQcm9wZXJ0eUdyb3VwcygpCi0JICogQHNlZSAjZ2V0SnNwQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKc3BDb25maWdfSnNwUHJvcGVydHlHcm91cHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnI2dldElkKCkKLQkgKiBAc2VlICNnZXRKc3BDb25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpzcENvbmZpZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCA8ZW0+UHJvcGVydHkgR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvcGVydHkgR3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRKc3BQcm9wZXJ0eUdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEpzcFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpzcFByb3BlcnR5R3JvdXBfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SnNwUHJvcGVydHlHcm91cF9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldEljb25zKCkKLQkgKiBAc2VlICNnZXRKc3BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRVcmxQYXR0ZXJucyA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5VcmwgUGF0dGVybnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldFVybFBhdHRlcm5zKCkKLQkgKiBAc2VlICNnZXRKc3BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX1VybFBhdHRlcm5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNFbElnbm9yZWQgPGVtPkVsIElnbm9yZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbCBJZ25vcmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0VsSWdub3JlZCgpCi0JICogQHNlZSAjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9FbElnbm9yZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRQYWdlRW5jb2RpbmcgPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYWdlIEVuY29kaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRQYWdlRW5jb2RpbmcoKQotCSAqIEBzZWUgI2dldEpzcFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpzcFByb3BlcnR5R3JvdXBfUGFnZUVuY29kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNTY3JpcHRpbmdJbnZhbGlkIDxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc1NjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI2dldEpzcFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpzcFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzSXNYbWwgPGVtPklzIFhtbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFhtbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNJc1htbCgpCi0JICogQHNlZSAjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9Jc1htbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZVByZWx1ZGVzIDxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRJbmNsdWRlUHJlbHVkZXMoKQotCSAqIEBzZWUgI2dldEpzcFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpzcFByb3BlcnR5R3JvdXBfSW5jbHVkZVByZWx1ZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRJbmNsdWRlQ29kYXMgPGVtPkluY2x1ZGUgQ29kYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkluY2x1ZGUgQ29kYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldEluY2x1ZGVDb2RhcygpCi0JICogQHNlZSAjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCA8ZW0+RGVmZXJyZWQgU3ludGF4IEFsbG93ZWQgQXMgTGl0ZXJhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmVycmVkIFN5bnRheCBBbGxvd2VkIEFzIExpdGVyYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCkKLQkgKiBAc2VlICNnZXRKc3BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzIDxlbT5UcmltIERpcmVjdGl2ZSBXaGl0ZXNwYWNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpCi0JICogQHNlZSAjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9UcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEpzcFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpzcFByb3BlcnR5R3JvdXBfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYiA8ZW0+VGFnIExpYjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWcgTGliPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYWdMaWIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliI2dldFRhZ2xpYlVyaSA8ZW0+VGFnbGliIFVyaTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhZ2xpYiBVcmk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5UYWdMaWIjZ2V0VGFnbGliVXJpKCkKLQkgKiBAc2VlICNnZXRUYWdMaWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhZ0xpYl9UYWdsaWJVcmkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliI2dldFRhZ2xpYkxvY2F0aW9uIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYWdsaWIgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5UYWdMaWIjZ2V0VGFnbGliTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldFRhZ0xpYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliX1RhZ2xpYkxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLlRhZ0xpYiNnZXRJZCgpCi0JICogQHNlZSAjZ2V0VGFnTGliKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdMaWJfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5GaWxlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkZpbGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEpzcEZpbGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKc3BGYWN0b3J5IGdldEpzcEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BDb25maWdJbXBsIDxlbT5Db25maWc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcENvbmZpZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldEpzcENvbmZpZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKU1BfQ09ORklHID0gZUlOU1RBTkNFLmdldEpzcENvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnIExpYnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpTUF9DT05GSUdfX1RBR19MSUJTID0gZUlOU1RBTkNFLmdldEpzcENvbmZpZ19UYWdMaWJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Kc3AgUHJvcGVydHkgR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKU1BfQ09ORklHX19KU1BfUFJPUEVSVFlfR1JPVVBTID0gZUlOU1RBTkNFLmdldEpzcENvbmZpZ19Kc3BQcm9wZXJ0eUdyb3VwcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfQ09ORklHX19JRCA9IGVJTlNUQU5DRS5nZXRKc3BDb25maWdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwgPGVtPlByb3BlcnR5IEdyb3VwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQcm9wZXJ0eUdyb3VwSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwjZ2V0SnNwUHJvcGVydHlHcm91cCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKU1BfUFJPUEVSVFlfR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0SnNwUHJvcGVydHlHcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKU1BfUFJPUEVSVFlfR1JPVVBfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRKc3BQcm9wZXJ0eUdyb3VwX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldEpzcFByb3BlcnR5R3JvdXBfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSlNQX1BST1BFUlRZX0dST1VQX19JQ09OUyA9IGVJTlNUQU5DRS5nZXRKc3BQcm9wZXJ0eUdyb3VwX0ljb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk5TID0gZUlOU1RBTkNFLmdldEpzcFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsIElnbm9yZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQgPSBlSU5TVEFOQ0UuZ2V0SnNwUHJvcGVydHlHcm91cF9FbElnbm9yZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhZ2UgRW5jb2Rpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkcgPSBlSU5TVEFOQ0UuZ2V0SnNwUHJvcGVydHlHcm91cF9QYWdlRW5jb2RpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjcmlwdGluZyBJbnZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRCA9IGVJTlNUQU5DRS5nZXRKc3BQcm9wZXJ0eUdyb3VwX1NjcmlwdGluZ0ludmFsaWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFhtbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MID0gZUlOU1RBTkNFLmdldEpzcFByb3BlcnR5R3JvdXBfSXNYbWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGUgUHJlbHVkZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUyA9IGVJTlNUQU5DRS5nZXRKc3BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZSBDb2RhczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTID0gZUlOU1RBTkNFLmdldEpzcFByb3BlcnR5R3JvdXBfSW5jbHVkZUNvZGFzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19ERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMID0gZUlOU1RBTkNFLmdldEpzcFByb3BlcnR5R3JvdXBfRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmltIERpcmVjdGl2ZSBXaGl0ZXNwYWNlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9QUk9QRVJUWV9HUk9VUF9fVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVMgPSBlSU5TVEFOQ0UuZ2V0SnNwUHJvcGVydHlHcm91cF9UcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19JRCA9IGVJTlNUQU5DRS5nZXRKc3BQcm9wZXJ0eUdyb3VwX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYkltcGwgPGVtPlRhZyBMaWI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldFRhZ0xpYigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQUdfTElCID0gZUlOU1RBTkNFLmdldFRhZ0xpYigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnbGliIFVyaTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBR19MSUJfX1RBR0xJQl9VUkkgPSBlSU5TVEFOQ0UuZ2V0VGFnTGliX1RhZ2xpYlVyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnbGliIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFHX0xJQl9fVEFHTElCX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldFRhZ0xpYl9UYWdsaWJMb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfTElCX19JRCA9IGVJTlNUQU5DRS5nZXRUYWdMaWJfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkZpbGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldEpzcEZpbGVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEpTUF9GSUxFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SnNwRmlsZVR5cGUoKTsKLQotCX0KLQotfSAvL0pzcFBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwMTFhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3BBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSnNwUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpzcEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEpzcFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEpzcFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBKc3BTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKc3BDb25maWcoSnNwQ29uZmlnIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKc3BDb25maWdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKc3BQcm9wZXJ0eUdyb3VwKEpzcFByb3BlcnR5R3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpzcFByb3BlcnR5R3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWIoVGFnTGliIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYWdMaWJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnIDxlbT5Db25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpzcENvbmZpZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCA8ZW0+UHJvcGVydHkgR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKc3BQcm9wZXJ0eUdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5UYWdMaWIgPGVtPlRhZyBMaWI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuVGFnTGliCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Kc3BBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxYWUwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwudXRpbC5Kc3BSZXNvdXJjZUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpzcFJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBKc3BSZXNvdXJjZUltcGwodXJpKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9MRVhJQ0FMX0hBTkRMRVIsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19IC8vSnNwUmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NGMyYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLnV0aWwuSnNwUmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLX0gLy9Kc3BSZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWRhZmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpzcFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKc3BQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEpzcFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJRzogewotCQkJCUpzcENvbmZpZyBqc3BDb25maWcgPSAoSnNwQ29uZmlnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKc3BDb25maWcoanNwQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQOiB7Ci0JCQkJSnNwUHJvcGVydHlHcm91cCBqc3BQcm9wZXJ0eUdyb3VwID0gKEpzcFByb3BlcnR5R3JvdXApdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpzcFByb3BlcnR5R3JvdXAoanNwUHJvcGVydHlHcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUI6IHsKLQkJCQlUYWdMaWIgdGFnTGliID0gKFRhZ0xpYil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFnTGliKHRhZ0xpYik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25maWc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUpzcENvbmZpZyhKc3BDb25maWcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSnNwUHJvcGVydHlHcm91cChKc3BQcm9wZXJ0eUdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFnIExpYjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWcgTGliPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWIoVGFnTGliIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Kc3BTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwWE1MUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFhNTFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzUxZjk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwWE1MUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkudXRpbC5YTUxQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVyIG1ldGhvZHMgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBYTUwgZG9jdW1lbnRzCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3BYTUxQcm9jZXNzb3IgZXh0ZW5kcyBYTUxQcm9jZXNzb3IgewotCS8qKgotCSAqIFB1YmxpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgaGVscGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BYTUxQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRSkpOwotCQlKc3BQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgZm9yICIqIiBhbmQgInhtbCIgZmlsZSBleHRlbnNpb25zIHRoZSBKc3BSZXNvdXJjZUZhY3RvcnlJbXBsIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRSZWdpc3RyYXRpb25zKCkgewotCQlpZiAocmVnaXN0cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRSZWdpc3RyYXRpb25zKCk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChYTUxfRVhURU5TSU9OLCBuZXcgSnNwUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJCXJlZ2lzdHJhdGlvbnMucHV0KFNUQVJfRVhURU5TSU9OLCBuZXcgSnNwUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJfQotCQlyZXR1cm4gcmVnaXN0cmF0aW9uczsKLQl9Ci0KLX0gLy9Kc3BYTUxQcm9jZXNzb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0F1dGhDb25zdHJhaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9BdXRoQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDA1MTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0F1dGhDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF1dGggQ29uc3RyYWludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGF1dGgtY29uc3RyYWludFR5cGUgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQKLSAqIAlzaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlCi0gKiAJY29sbGVjdGlvbi4gVGhlIHJvbGUtbmFtZSB1c2VkIGhlcmUgbXVzdCBlaXRoZXIgY29ycmVzcG9uZAotICogCXRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzCi0gKiAJZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGJlIHRoZSBzcGVjaWFsbHkKLSAqIAlyZXNlcnZlZCByb2xlLW5hbWUgIioiIHRoYXQgaXMgYSBjb21wYWN0IHN5bnRheCBmb3IKLSAqIAlpbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIgotICogCWFuZCByb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwKLSAqIAlyb2xlcy4gIElmIG5vIHJvbGVzIGFyZSBkZWZpbmVkLCBubyB1c2VyIGlzIGFsbG93ZWQgYWNjZXNzCi0gKiAJdG8gdGhlIHBvcnRpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXNjcmliZWQgYnkgdGhlCi0gKiAJY29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LiAgVGhlIGNvbnRhaW5lciBtYXRjaGVzCi0gKiAJcm9sZSBuYW1lcyBjYXNlIHNlbnNpdGl2ZWx5IHdoZW4gZGV0ZXJtaW5pbmcgYWNjZXNzLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQXV0aENvbnN0cmFpbnQjZ2V0Um9sZU5hbWVzIDxlbT5Sb2xlIE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0QXV0aENvbnN0cmFpbnQoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXV0aENvbnN0cmFpbnQgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0QXV0aENvbnN0cmFpbnRfUm9sZU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSb2xlTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRBdXRoQ29uc3RyYWludF9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQXV0aENvbnN0cmFpbnQjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQXV0aENvbnN0cmFpbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9EaXNwYXRjaGVyVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRGlzcGF0Y2hlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEzOTM1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9EaXNwYXRjaGVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgZGlzcGF0Y2hlciBoYXMgZm91ciBsZWdhbCB2YWx1ZXM6IEZPUldBUkQsIFJFUVVFU1QsIElOQ0xVREUsCi0gKiAJYW5kIEVSUk9SLiBBIHZhbHVlIG9mIEZPUldBUkQgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQKLSAqIAl1bmRlciBSZXF1ZXN0RGlzcGF0Y2hlci5mb3J3YXJkKCkgY2FsbHMuICBBIHZhbHVlIG9mIFJFUVVFU1QKLSAqIAltZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZCB1bmRlciBvcmRpbmFyeSBjbGllbnQgY2FsbHMgdG8KLSAqIAl0aGUgcGF0aCBvciBzZXJ2bGV0LiBBIHZhbHVlIG9mIElOQ0xVREUgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlCi0gKiAJYXBwbGllZCB1bmRlciBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCkgY2FsbHMuICBBIHZhbHVlIG9mCi0gKiAJRVJST1IgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgdGhlIGVycm9yIHBhZ2UKLSAqIAltZWNoYW5pc20uICBUaGUgYWJzZW5jZSBvZiBhbnkgZGlzcGF0Y2hlciBlbGVtZW50cyBpbiBhCi0gKiAJZmlsdGVyLW1hcHBpbmcgaW5kaWNhdGVzIGEgZGVmYXVsdCBvZiBhcHBseWluZyBmaWx0ZXJzIG9ubHkgdW5kZXIKLSAqIAlvcmRpbmFyeSBjbGllbnQgY2FsbHMgdG8gdGhlIHBhdGggb3Igc2VydmxldC4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RGlzcGF0Y2hlclR5cGUoKQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlzcGF0Y2hlclR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZPUldBUkQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZPUldBUkQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRk9SV0FSRF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SV0FSRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTkNMVURFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTkNMVURFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOQ0xVREVfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVRVUVTVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVRVUVTVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVFVRVNUX0xJVEVSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVSUk9SPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FUlJPUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFUlJPUl9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Rk9SV0FSRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGT1JXQVJECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBGT1JXQVJEX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoRk9SV0FSRCwgIkZPUldBUkQiLCAiRk9SV0FSRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOQ0xVREU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5DTFVERQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGF0Y2hlclR5cGUgSU5DTFVERV9MSVRFUkFMID0gbmV3IERpc3BhdGNoZXJUeXBlKElOQ0xVREUsICJJTkNMVURFIiwgIklOQ0xVREUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVFVRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUVVFU1QKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpc3BhdGNoZXJUeXBlIFJFUVVFU1RfTElURVJBTCA9IG5ldyBEaXNwYXRjaGVyVHlwZShSRVFVRVNULCAiUkVRVUVTVCIsICJSRVFVRVNUIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVJST1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVJST1IKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpc3BhdGNoZXJUeXBlIEVSUk9SX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoRVJST1IsICJFUlJPUiIsICJFUlJPUiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERpc3BhdGNoZXJUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IERpc3BhdGNoZXJUeXBlW10gewotCQkJRk9SV0FSRF9MSVRFUkFMLAotCQkJSU5DTFVERV9MSVRFUkFMLAotCQkJUkVRVUVTVF9MSVRFUkFMLAotCQkJRVJST1JfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BhdGNoZXJUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRGlzcGF0Y2hlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwYXRjaGVyVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURpc3BhdGNoZXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwYXRjaGVyVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgRk9SV0FSRDogcmV0dXJuIEZPUldBUkRfTElURVJBTDsKLQkJCWNhc2UgSU5DTFVERTogcmV0dXJuIElOQ0xVREVfTElURVJBTDsKLQkJCWNhc2UgUkVRVUVTVDogcmV0dXJuIFJFUVVFU1RfTElURVJBTDsKLQkJCWNhc2UgRVJST1I6IHJldHVybiBFUlJPUl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXNwYXRjaGVyVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vRGlzcGF0Y2hlclR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Vycm9yUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRXJyb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTRkYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRXJyb3JQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVycm9yIFBhZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBlcnJvci1wYWdlVHlwZSBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCi0gKiAJb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViCi0gKiAJYXBwbGljYXRpb24uCi0gKiAKLSAqIAlVc2VkIGluOiB3ZWItYXBwCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSNnZXRFcnJvckNvZGUgPGVtPkVycm9yIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSNnZXRFeGNlcHRpb25UeXBlIDxlbT5FeGNlcHRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRFcnJvclBhZ2UoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXJyb3JQYWdlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FcnJvciBDb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FcnJvciBDb2RlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVycm9yIENvZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVycm9yQ29kZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRFcnJvclBhZ2VfRXJyb3JDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRFcnJvckNvZGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSNnZXRFcnJvckNvZGUgPGVtPkVycm9yIENvZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVycm9yIENvZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVycm9yQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXJyb3JDb2RlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjZXB0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgICBUaGUgZXhjZXB0aW9uLXR5cGUgY29udGFpbnMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLQkgKiAJICAgICAgbmFtZSBvZiBhIEphdmEgZXhjZXB0aW9uIHR5cGUuCi0JICogCi0JICogCSAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4Y2VwdGlvblR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeGNlcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UjZ2V0RXhjZXB0aW9uVHlwZSA8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeGNlcHRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeGNlcHRpb25UeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlCi0JICogCSAgICByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JICogCSAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIG11c3QgaGF2ZQotCSAqIAkgICAgYSBsZWFkaW5nIGAvJy4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2F0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RXJyb3JQYWdlX0xvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RXJyb3JQYWdlX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRXJyb3JQYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxMDNmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmlsdGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgZmlsdGVyVHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBmaWx0ZXIgaW4gdGhlIHdlYgotICogCWFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0byBlaXRoZXIgYSBzZXJ2bGV0IG9yIGEKLSAqIAlVUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlCi0gKiAJZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlCi0gKiAJaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudAotICogCWRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuCi0gKiAKLSAqIAlVc2VkIGluOiB3ZWItYXBwCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldEZpbHRlck5hbWUgPGVtPkZpbHRlciBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0RmlsdGVyQ2xhc3MgPGVtPkZpbHRlciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlcigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXIgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlcl9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RmlsdGVyX0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlcl9JY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbHRlciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaWx0ZXIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWx0ZXIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmlsdGVyTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlcl9GaWx0ZXJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpbHRlck5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRGaWx0ZXJOYW1lIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmlsdGVyIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbHRlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbHRlck5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbHRlciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWx0ZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbHRlckNsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RmlsdGVyX0ZpbHRlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpbHRlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0RmlsdGVyQ2xhc3MgPGVtPkZpbHRlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmlsdGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWx0ZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmlsdGVyQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzCi0JICogCSAgICBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBvZiBhIHNlcnZsZXQgZmlsdGVyCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJfSW5pdFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlcl9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEZpbHRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0ZpbHRlck1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0ZpbHRlck1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlZjRiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9GaWx0ZXJNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWx0ZXIgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJRGVjbGFyYXRpb24gb2YgdGhlIGZpbHRlciBtYXBwaW5ncyBpbiB0aGlzIHdlYgotICogCWFwcGxpY2F0aW9uIGlzIGRvbmUgYnkgdXNpbmcgZmlsdGVyLW1hcHBpbmdUeXBlLgotICogCVRoZSBjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcKLSAqIAlkZWNsYXJhdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgdG8gYSByZXF1ZXN0LAotICogCWFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvCi0gKiAJYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycyB0bwotICogCWFwcGx5IGl0IG1hdGNoZXMgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIGVpdGhlciBvbgotICogCXNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcKLSAqIAllbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluCi0gKiAJd2hpY2ggZmlsdGVycyBhcmUgaW52b2tlZCBpcyB0aGUgb3JkZXIgaW4gd2hpY2gKLSAqIAlmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhCi0gKiAJc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlCi0gKiAJZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIGZpbHRlci1uYW1lCi0gKiAJc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUgZmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUKLSAqIAlkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0RmlsdGVyTmFtZSA8ZW0+RmlsdGVyIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldFVybFBhdHRlcm5zIDxlbT5VcmwgUGF0dGVybnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0U2VydmxldE5hbWVzIDxlbT5TZXJ2bGV0IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldERpc3BhdGNoZXJzIDxlbT5EaXNwYXRjaGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RmlsdGVyTWFwcGluZygpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXJNYXBwaW5nIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWx0ZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmlsdGVyIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmlsdGVyIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbHRlck5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmlsdGVyTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyNnZXRGaWx0ZXJOYW1lIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmlsdGVyIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbHRlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbHRlck5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJNYXBwaW5nX0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJsIFBhdHRlcm5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVybCBQYXR0ZXJuczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVybCBQYXR0ZXJuczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0VXJsUGF0dGVybnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZsZXQgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZsZXQgTmFtZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2bGV0IE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJNYXBwaW5nX1NlcnZsZXROYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VydmxldE5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlfS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5EaXNwYXRjaGVyVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwYXRjaGVyczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BhdGNoZXJzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGF0Y2hlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJNYXBwaW5nX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEZpbHRlck1hcHBpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Gb3JtTG9naW5Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Zvcm1Mb2dpbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzU2ZmM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Zvcm1Mb2dpbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Rm9ybSBMb2dpbiBDb25maWc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBmb3JtLWxvZ2luLWNvbmZpZ1R5cGUgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IKLSAqIAlwYWdlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQKLSAqIAlhdXRoZW50aWNhdGlvbiBpcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCi0gKiAKLSAqIAlVc2VkIGluOiBsb2dpbi1jb25maWcKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRm9ybUxvZ2luQ29uZmlnI2dldEZvcm1Mb2dpblBhZ2UgPGVtPkZvcm0gTG9naW4gUGFnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRm9ybUxvZ2luQ29uZmlnI2dldEZvcm1FcnJvclBhZ2UgPGVtPkZvcm0gRXJyb3IgUGFnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRm9ybUxvZ2luQ29uZmlnI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGb3JtTG9naW5Db25maWcoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRm9ybUxvZ2luQ29uZmlnIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Gb3JtIExvZ2luIFBhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIKLQkgKiAJICAgIGFwcCB3aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUKLQkgKiAJICAgIGZvdW5kLiAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCi0JICogCSAgICByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtIExvZ2luIFBhZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZvcm1Mb2dpblBhZ2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGb3JtTG9naW5QYWdlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcjZ2V0Rm9ybUxvZ2luUGFnZSA8ZW0+Rm9ybSBMb2dpbiBQYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtIExvZ2luIFBhZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZvcm1Mb2dpblBhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZvcm1Mb2dpblBhZ2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZvcm0gRXJyb3IgUGFnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4KLQkgKiAJICAgIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkCi0JICogCSAgICB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZC4KLQkgKiAJICAgIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAotCSAqIAkgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rm9ybSBFcnJvciBQYWdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGb3JtRXJyb3JQYWdlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1FcnJvclBhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Rm9ybUVycm9yUGFnZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRm9ybUxvZ2luQ29uZmlnI2dldEZvcm1FcnJvclBhZ2UgPGVtPkZvcm0gRXJyb3IgUGFnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rm9ybSBFcnJvciBQYWdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGb3JtRXJyb3JQYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGb3JtRXJyb3JQYWdlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0Rm9ybUxvZ2luQ29uZmlnX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRm9ybUxvZ2luQ29uZmlnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvSVdlYlJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9JV2ViUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxM2Q0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9JV2ViUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJV2ViUmVzb3VyY2UgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBnZXRSb290T2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdhcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0xvY2FsZUVuY29kaW5nTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGIzMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIGNvbnRhaW5zIGxvY2FsZSBuYW1lIGFuZAotICogCWVuY29kaW5nIG5hbWUuIFRoZSBsb2NhbGUgbmFtZSBtdXN0IGJlIGVpdGhlciAiTGFuZ3VhZ2UtY29kZSIsCi0gKiAJc3VjaCBhcyAiamEiLCBkZWZpbmVkIGJ5IElTTy02Mzkgb3IgIkxhbmd1YWdlLWNvZGVfQ291bnRyeS1jb2RlIiwKLSAqIAlzdWNoIGFzICJqYV9KUCIuICAiQ291bnRyeSBjb2RlIiBpcyBkZWZpbmVkIGJ5IElTTy0zMTY2LgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmcjZ2V0TG9jYWxlIDxlbT5Mb2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZyNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvY2FsZUVuY29kaW5nTWFwcGluZyBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2NhbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2FsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nI2dldExvY2FsZSA8ZW0+TG9jYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYWxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVuY29kaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmcjZ2V0RW5jb2RpbmcgPGVtPkVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVuY29kaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTG9jYWxlRW5jb2RpbmdNYXBwaW5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTcyNGVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0xvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCBjb250YWlucyBvbmUgb3IgbW9yZQotICogCWxvY2FsZS1lbmNvZGluZy1tYXBwaW5nKHMpLgotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0I2dldExvY2FsRW5jb2RpbmdNYXBwaW5ncyA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdF9Mb2NhbEVuY29kaW5nTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0xvZ2luQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Mb2dpbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzlhOGJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0xvZ2luQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb2dpbiBDb25maWc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSBsb2dpbi1jb25maWdUeXBlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotICogCW1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZQotICogCXVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZQotICogCW5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbiBtZWNoYW5pc20uCi0gKiAKLSAqIAlVc2VkIGluOiB3ZWItYXBwCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldEF1dGhNZXRob2QgPGVtPkF1dGggTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZyNnZXRSZWFsbU5hbWUgPGVtPlJlYWxtIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldEZvcm1Mb2dpbkNvbmZpZyA8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRMb2dpbkNvbmZpZygpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2dpbkNvbmZpZyBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF1dGggTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGggTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdXRoTWV0aG9kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TG9naW5Db25maWdfQXV0aE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdXRoTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZyNnZXRBdXRoTWV0aG9kIDxlbT5BdXRoIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF1dGhNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhNZXRob2QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYWxtIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8KLQkgKiAJICAgIHVzZSBpbiBIVFRQIEJhc2ljIGF1dGhvcml6YXRpb24uCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYWxtIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYWxtTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldExvZ2luQ29uZmlnX1JlYWxtTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWFsbU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldFJlYWxtTmFtZSA8ZW0+UmVhbG0gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhbG0gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVhbG1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFsbU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZvcm0gTG9naW4gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Rm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRm9ybUxvZ2luQ29uZmlnIGdldEZvcm1Mb2dpbkNvbmZpZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcjZ2V0Rm9ybUxvZ2luQ29uZmlnIDxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEZvcm1Mb2dpbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Rm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TG9naW5Db25maWdfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIExvZ2luQ29uZmlnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTWltZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL01pbWVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNGJjNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTWltZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbWUgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIG1pbWUtbWFwcGluZ1R5cGUgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBleHRlbnNpb24KLSAqIAlhbmQgYSBtaW1lIHR5cGUuCi0gKiAKLSAqIAlVc2VkIGluOiB3ZWItYXBwCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk1pbWVNYXBwaW5nI2dldEV4dGVuc2lvbiA8ZW0+RXh0ZW5zaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZyNnZXRNaW1lVHlwZSA8ZW0+TWltZSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TWltZU1hcHBpbmcoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWltZU1hcHBpbmcgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXh0ZW5zaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZW5zaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcjZ2V0RXh0ZW5zaW9uIDxlbT5FeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWltZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRNaW1lTWFwcGluZ19NaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNaW1lVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRNaW1lTWFwcGluZ19JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWltZU1hcHBpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9OdWxsQ2hhclR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL051bGxDaGFyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTY5ODdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL051bGxDaGFyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5OdWxsIENoYXIgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldE51bGxDaGFyVHlwZSgpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQ2hhclR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI19fTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF8gPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI18KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE51bGxDaGFyVHlwZSBfX0xJVEVSQUwgPSBuZXcgTnVsbENoYXJUeXBlKF8sICJfIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5OdWxsIENoYXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbENoYXJUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IE51bGxDaGFyVHlwZVtdIHsKLQkJCV9fTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5OdWxsIENoYXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TnVsbCBDaGFyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBOdWxsQ2hhclR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlOdWxsQ2hhclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5OdWxsIENoYXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE51bGxDaGFyVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCU51bGxDaGFyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TnVsbCBDaGFyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBOdWxsQ2hhclR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIF86IHJldHVybiBfX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE51bGxDaGFyVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vTnVsbENoYXJUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZWN1cml0eUNvbnN0cmFpbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1NlY3VyaXR5Q29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDNiMTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1NlY3VyaXR5Q29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWN1cml0eSBDb25zdHJhaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgc2VjdXJpdHktY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBhc3NvY2lhdGUKLSAqIAlzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZQotICogCWNvbGxlY3Rpb25zCi0gKiAKLSAqIAlVc2VkIGluOiB3ZWItYXBwCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zIDxlbT5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRBdXRoQ29uc3RyYWludCA8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0VXNlckRhdGFDb25zdHJhaW50IDxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZWN1cml0eUNvbnN0cmFpbnQoKQotICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VjdXJpdHlDb25zdHJhaW50IGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlYiBSZXNvdXJjZSBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRoIENvbnN0cmFpbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF1dGggQ29uc3RyYWludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBdXRoQ29uc3RyYWludCBnZXRBdXRoQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50I2dldEF1dGhDb25zdHJhaW50IDxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGggQ29uc3RyYWludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QXV0aENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzZXIgRGF0YSBDb25zdHJhaW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVzZXJEYXRhQ29uc3RyYWludCBnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRVc2VyRGF0YUNvbnN0cmFpbnQgPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VXNlckRhdGFDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZWN1cml0eUNvbnN0cmFpbnRfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTZWN1cml0eUNvbnN0cmFpbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXJ2bGV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMzUzZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmxldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHNlcnZsZXRUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIHNlcnZsZXQuCi0gKiAJSXQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYQotICogCXNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwCi0gKiAJZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZAotICogCWxvYWRlZC4KLSAqIAotICogCVVzZWQgaW46IHdlYi1hcHAKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldFNlcnZsZXROYW1lIDxlbT5TZXJ2bGV0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0U2VydmxldENsYXNzIDxlbT5TZXJ2bGV0IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldEpzcEZpbGUgPGVtPkpzcCBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldExvYWRPblN0YXJ0dXAgPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRSdW5BcyA8ZW0+UnVuIEFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldFNlY3VyaXR5Um9sZVJlZnMgPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldCgpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2bGV0IGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0X0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0X0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfSWNvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2bGV0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZsZXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2bGV0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZsZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRTZXJ2bGV0TmFtZSA8ZW0+U2VydmxldCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2bGV0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcnZsZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2bGV0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmxldCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICAgIFRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0JICogCSAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2bGV0LgotCSAqIAotCSAqIAkgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZsZXRDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfU2VydmxldENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlcnZsZXRDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRTZXJ2bGV0Q2xhc3MgPGVtPlNlcnZsZXQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcnZsZXRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VydmxldENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kc3AgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SnNwIEZpbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SnNwIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEpzcEZpbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0X0pzcEZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SnNwRmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRKc3BGaWxlIDxlbT5Kc3AgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SnNwIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEpzcEZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEpzcEZpbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldF9Jbml0UGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRJbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2FkIE9uIFN0YXJ0dXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMKLQkgKiAJICAgIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlCi0JICogCSAgICBpdHMgaW5pdCgpIGNhbGxlZCkgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYgotCSAqIAkgICAgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZiB0aGVzZQotCSAqIAkgICAgZWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4KLQkgKiAJICAgIHdoaWNoIHRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIElmIHRoZSB2YWx1ZQotCSAqIAkgICAgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLCBvciB0aGUgZWxlbWVudCBpcyBub3QKLQkgKiAJICAgIHByZXNlbnQsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIHRoZSBzZXJ2bGV0Ci0JICogCSAgICB3aGVuZXZlciBpdCBjaG9vc2VzLiBJZiB0aGUgdmFsdWUgaXMgYSBwb3NpdGl2ZQotCSAqIAkgICAgaW50ZWdlciBvciAwLCB0aGUgY29udGFpbmVyIG11c3QgbG9hZCBhbmQKLQkgKiAJICAgIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlIGFwcGxpY2F0aW9uIGlzCi0JICogCSAgICBkZXBsb3llZC4gVGhlIGNvbnRhaW5lciBtdXN0IGd1YXJhbnRlZSB0aGF0Ci0JICogCSAgICBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBsb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkCi0JICogCSAgICBiZWZvcmUgc2VydmxldHMgbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUKLQkgKiAJICAgIGNvbnRhaW5lciBtYXkgY2hvb3NlIHRoZSBvcmRlciBvZiBsb2FkaW5nIG9mCi0JICogCSAgICBzZXJ2bGV0cyB3aXRoIHRoZSBzYW1lIGxvYWQtb24tc3RhcnQtdXAgdmFsdWUuCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9hZE9uU3RhcnR1cChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRMb2FkT25TdGFydHVwKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldExvYWRPblN0YXJ0dXAgPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2FkT25TdGFydHVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2FkT25TdGFydHVwKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SdW4gQXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJ1biBBczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SdW4gQXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJ1bkFzKFJ1bkFzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0X1J1bkFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUnVuQXMgZ2V0UnVuQXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0UnVuQXMgPGVtPlJ1biBBczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UnVuIEFzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSdW5BcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UnVuQXMoUnVuQXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2VydmxldApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1NlcnZsZXRNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXJ2bGV0TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJjNmFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1NlcnZsZXRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZsZXQgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHNlcnZsZXQtbWFwcGluZ1R5cGUgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhCi0gKiAJc2VydmxldCBhbmQgYSB1cmwgcGF0dGVybi4KLSAqIAotICogCVVzZWQgaW46IHdlYi1hcHAKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcjZ2V0U2VydmxldE5hbWUgPGVtPlNlcnZsZXQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcjZ2V0VXJsUGF0dGVybnMgPGVtPlVybCBQYXR0ZXJuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRNYXBwaW5nKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXRNYXBwaW5nIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2bGV0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZsZXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2bGV0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZsZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldE1hcHBpbmdfU2VydmxldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VydmxldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nI2dldFNlcnZsZXROYW1lIDxlbT5TZXJ2bGV0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VydmxldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZsZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXJsIFBhdHRlcm5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJsIFBhdHRlcm5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0VXJsUGF0dGVybnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0TWFwcGluZ19JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2VydmxldE1hcHBpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXNzaW9uQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXNzaW9uQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNDBiMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvU2Vzc2lvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXNzaW9uIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHNlc3Npb24tY29uZmlnVHlwZSBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMKLSAqIAlmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gKiAKLSAqIAlVc2VkIGluOiB3ZWItYXBwCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0U2Vzc2lvblRpbWVvdXQgPGVtPlNlc3Npb24gVGltZW91dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2Vzc2lvbkNvbmZpZygpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXNzaW9uQ29uZmlnIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXNzaW9uIFRpbWVvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQKLQkgKiAJICAgIHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQKLQkgKiAJICAgIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgc3BlY2lmaWVkIHRpbWVvdXQKLQkgKiAJICAgIG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0JICogCSAgICBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcwotCSAqIAkgICAgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHNlc3Npb25zIGlzIG5ldmVyIHRvIHRpbWUKLQkgKiAJICAgIG91dC4gSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIKLQkgKiAJICAgIG11c3Qgc2V0IGl0cyBkZWZhdWx0IHRpbWVvdXQgcGVyaW9kLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlc3Npb25UaW1lb3V0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFNlc3Npb25UaW1lb3V0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnI2dldFNlc3Npb25UaW1lb3V0IDxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlc3Npb24gVGltZW91dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2Vzc2lvblRpbWVvdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlc3Npb25UaW1lb3V0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlc3Npb25Db25maWdfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2Vzc2lvbkNvbmZpZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyMTcyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgotICogCWJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvcgotICogCUNPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdAotICogCXJlcXVpcmUgYW55IHRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zCi0gKiAJdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlCi0gKiAJY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUKLSAqIAljaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbgotICogCXJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYSBmYXNoaW9uIHRoYXQKLSAqIAlwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlCi0gKiAJdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yCi0gKiAJQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzCi0gKiAJcmVxdWlyZWQuCi0gKiAKLSAqIAlVc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludAotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKCkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORV9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFR1JBTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5URUdSQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5URUdSQUxfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHUkFMID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNPTkZJREVOVElBTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q09ORklERU5USUFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTkZJREVOVElBTF9MSVRFUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklERU5USUFMID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBOT05FX0xJVEVSQUwgPSBuZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShOT05FLCAiTk9ORSIsICJOT05FIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5URUdSQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5URUdSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgSU5URUdSQUxfTElURVJBTCA9IG5ldyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKElOVEVHUkFMLCAiSU5URUdSQUwiLCAiSU5URUdSQUwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DT05GSURFTlRJQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09ORklERU5USUFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIENPTkZJREVOVElBTF9MSVRFUkFMID0gbmV3IFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoQ09ORklERU5USUFMLCAiQ09ORklERU5USUFMIiwgIkNPTkZJREVOVElBTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZVtdIHsKLQkJCU5PTkVfTElURVJBTCwKLQkJCUlOVEVHUkFMX0xJVEVSQUwsCi0JCQlDT05GSURFTlRJQUxfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5PTkU6IHJldHVybiBOT05FX0xJVEVSQUw7Ci0JCQljYXNlIElOVEVHUkFMOiByZXR1cm4gSU5URUdSQUxfTElURVJBTDsKLQkJCWNhc2UgQ09ORklERU5USUFMOiByZXR1cm4gQ09ORklERU5USUFMX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1VzZXJEYXRhQ29uc3RyYWludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvVXNlckRhdGFDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZDM0NmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvVXNlckRhdGFDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVzZXIgRGF0YSBDb25zdHJhaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAKLSAqIAlUaGUgdXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgaG93Ci0gKiAJZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlCi0gKiAJcHJvdGVjdGVkLgotICogCi0gKiAJVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotICogCi0gKiAgICAgICAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXRUcmFuc3BvcnRHdWFyYW50ZWUgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0VXNlckRhdGFDb25zdHJhaW50KCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXJEYXRhQ29uc3RyYWludCBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Ik5PTkUiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlCi0JICogQHNlZSAjaXNTZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAc2VlICNzZXRUcmFuc3BvcnRHdWFyYW50ZWUoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0VHJhbnNwb3J0R3VhcmFudGVlIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUKLQkgKiBAc2VlICNpc1NldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjdW5zZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHJhbnNwb3J0R3VhcmFudGVlKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0VHJhbnNwb3J0R3VhcmFudGVlIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAc2VlICNzZXRUcmFuc3BvcnRHdWFyYW50ZWUoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRyYW5zcG9ydEd1YXJhbnRlZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0VHJhbnNwb3J0R3VhcmFudGVlIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjc2V0VHJhbnNwb3J0R3VhcmFudGVlKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRVc2VyRGF0YUNvbnN0cmFpbnRfSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBVc2VyRGF0YUNvbnN0cmFpbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJBcHAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ4ZDcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkFwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXBwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldERpc3RyaWJ1dGFibGVzIDxlbT5EaXN0cmlidXRhYmxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldENvbnRleHRQYXJhbXMgPGVtPkNvbnRleHQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RmlsdGVycyA8ZW0+RmlsdGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEZpbHRlck1hcHBpbmdzIDxlbT5GaWx0ZXIgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRMaXN0ZW5lcnMgPGVtPkxpc3RlbmVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlcnZsZXRzIDxlbT5TZXJ2bGV0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlcnZsZXRNYXBwaW5ncyA8ZW0+U2VydmxldCBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlc3Npb25Db25maWdzIDxlbT5TZXNzaW9uIENvbmZpZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRNaW1lTWFwcGluZ3MgPGVtPk1pbWUgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRXZWxjb21lRmlsZUxpc3RzIDxlbT5XZWxjb21lIEZpbGUgTGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRFcnJvclBhZ2VzIDxlbT5FcnJvciBQYWdlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEpzcENvbmZpZ3MgPGVtPkpzcCBDb25maWdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2VjdXJpdHlDb25zdHJhaW50cyA8ZW0+U2VjdXJpdHkgQ29uc3RyYWludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRMb2dpbkNvbmZpZ3MgPGVtPkxvZ2luIENvbmZpZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwKCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYkFwcCBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9Hcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9JY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3RyaWJ1dGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXN0cmlidXRhYmxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3RyaWJ1dGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfRGlzdHJpYnV0YWJsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3RyaWJ1dGFibGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZXh0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgICAgVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24KLQkgKiAJICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0Ci0JICogCSAgICBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotCSAqIAotCSAqIAkgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZXh0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0NvbnRleHRQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldENvbnRleHRQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbHRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmlsdGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbHRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9GaWx0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRGaWx0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWx0ZXIgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbHRlciBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbHRlciBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRGaWx0ZXJNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxpc3RlbmVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpc3RlbmVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0xpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2bGV0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmxldHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2bGV0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1NlcnZsZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZXJ2bGV0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmxldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZsZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2bGV0IE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlc3Npb24gQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2Vzc2lvbiBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2Vzc2lvbiBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlc3Npb25Db25maWdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaW1lIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWltZSBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbWUgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9NaW1lTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1pbWVNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2VsY29tZSBGaWxlIExpc3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldlbGNvbWUgRmlsZSBMaXN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlbGNvbWUgRmlsZSBMaXN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1dlbGNvbWVGaWxlTGlzdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFdlbGNvbWVGaWxlTGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVycm9yIFBhZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVycm9yIFBhZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgUGFnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9FcnJvclBhZ2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFcnJvclBhZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kc3AgQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcENvbmZpZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kc3AgQ29uZmlnczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpzcCBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfSnNwQ29uZmlncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SnNwQ29uZmlncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJpdHkgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdXJpdHkgQ29uc3RyYWludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1NlY3VyaXR5Q29uc3RyYWludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlY3VyaXR5Q29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvZ2luIENvbmZpZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2dpbiBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9naW4gQ29uZmlnczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0xvZ2luQ29uZmlncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TG9naW5Db25maWdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlY3VyaXR5Um9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudiBFbnRyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9FbnZFbnRyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFbnZFbnRyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0VqYlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9FamJMb2NhbFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfU2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfUmVzb3VyY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRSZXNvdXJjZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9SZXNvdXJjZUVudlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlRW52UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfUGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1Bvc3RDb25zdHJ1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBEZXN0cm95czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBEZXN0cm95czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1ByZURlc3Ryb3lzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQcmVEZXN0cm95cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3MgTGlzdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAkgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKLQkgKiAJICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIG90aGVyIHJlbGF0ZWQgZGVwbG95bWVudAotCSAqIAkgIGRlc2NyaXB0b3JzIGZvciB0aGlzIG1vZHVsZSAoZS5nLiwgd2ViIHNlcnZpY2UKLQkgKiAJICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcwotCSAqIAkgIGZpbGVzIGF2YWlsYWJsZSB0byB0aGlzIG1vZHVsZSBhbmQgcGFja2FnZWQgd2l0aAotCSAqIAkgIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlIGV4YW1pbmVkIGZvciBhbm5vdGF0aW9ucwotCSAqIAkgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIAkgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50Ci0JICogCSAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKLQkgKiAJICBpbmZvcm1hdGlvbiwgd2hpY2ggbWlnaHQgYmUgcHJlc2VudCBpbiB0aGUgY2xhc3MgZmlsZXMKLQkgKiAJICBvZiB0aGUgYXBwbGljYXRpb24uCi0JICogCi0JICogCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgbm90IHNwZWNpZmllZCBvciBpcyBzZXQgdG8KLQkgKiAJICAiZmFsc2UiLCB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgZXhhbWluZSB0aGUgY2xhc3MKLQkgKiAJICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcwotCSAqIAkgIHNwZWNpZmllZCBieSB0aGUgc3BlY2lmaWNhdGlvbnMuCi0JICogCi0JICogCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICN1bnNldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3Vuc2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1ldGFkYXRhQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1ldGFkYXRhQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMi41IjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlCi0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICN1bnNldFZlcnNpb24oKQotCSAqIEBzZWUgI3NldFZlcnNpb24oV2ViQXBwVmVyc2lvblR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9WZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViQXBwVmVyc2lvblR5cGUgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGUKLQkgKiBAc2VlICNpc1NldFZlcnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihXZWJBcHBWZXJzaW9uVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI3NldFZlcnNpb24oV2ViQXBwVmVyc2lvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRWZXJzaW9uKFdlYkFwcFZlcnNpb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VmVyc2lvbigpOwotCi19IC8vIFdlYkFwcApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzU2ZmFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFdlYkFwcCA8ZW0+V2ViIEFwcDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRNaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFwIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAotCSAqIAlUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50Ci0JICogCWRlc2NyaXB0b3IgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLiAgTm90ZSB0aGF0IHRoZSBzdWItZWxlbWVudHMKLQkgKiAJb2YgdGhpcyBlbGVtZW50IGNhbiBiZSBpbiB0aGUgYXJiaXRyYXJ5IG9yZGVyLiBCZWNhdXNlIG9mCi0JICogCXRoYXQsIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGVsZW1lbnRzIG9mIGRpc3RyaWJ1dGFibGUsCi0JICogCXNlc3Npb24tY29uZmlnLCB3ZWxjb21lLWZpbGUtbGlzdCwganNwLWNvbmZpZywgbG9naW4tY29uZmlnLAotCSAqIAlhbmQgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCB3YXMgY2hhbmdlZCBmcm9tICI/IiB0byAiKiIKLQkgKiAJaW4gdGhpcyBzY2hlbWEuICBIb3dldmVyLCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluc3RhbmNlCi0JICogCWZpbGUgbXVzdCBub3QgY29udGFpbiBtdWx0aXBsZSBlbGVtZW50cyBvZiBzZXNzaW9uLWNvbmZpZywKLQkgKiAJanNwLWNvbmZpZywgYW5kIGxvZ2luLWNvbmZpZy4gV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZWxlbWVudHMgb2YKLQkgKiAJd2VsY29tZS1maWxlLWxpc3Qgb3IgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCwgdGhlIGNvbnRhaW5lcgotCSAqIAltdXN0IGNvbmNhdGVuYXRlIHRoZSBlbGVtZW50IGNvbnRlbnRzLiAgVGhlIG11bHRpcGxlIG9jY3VyZW5jZQotCSAqIAlvZiB0aGUgZWxlbWVudCBkaXN0cmlidXRhYmxlIGlzIHJlZHVuZGFudCBhbmQgdGhlIGNvbnRhaW5lcgotCSAqIAl0cmVhdHMgdGhhdCBjYXNlIGV4YWN0bHkgaW4gdGhlIHNhbWUgd2F5IHdoZW4gdGhlcmUgaXMgb25seQotCSAqIAlvbmUgZGlzdHJpYnV0YWJsZS4KLQkgKiAKLQkgKiAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIEFwcDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V2ViQXBwKFdlYkFwcCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfV2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0V2ViQXBwIDxlbT5XZWIgQXBwPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgQXBwPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdlYkFwcChXZWJBcHAgdmFsdWUpOwotCi19IC8vIFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwVmVyc2lvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkFwcFZlcnNpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDUyYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwVmVyc2lvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+QXBwIFZlcnNpb24gVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIAotICogCVRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgotICogCXdlYi1hcHBsaWNhdGlvbiBzdXBwb3J0ZWQuIEl0IGlzIHVzZWQgdG8gZGVzaWduYXRlIHRoZQotICogCXZlcnNpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwVmVyc2lvblR5cGUoKQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV2ViQXBwVmVyc2lvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPjI1PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj4yNTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNfMjVfTElURVJBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF8yNSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj4yNTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNfMjUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdlYkFwcFZlcnNpb25UeXBlIF8yNV9MSVRFUkFMID0gbmV3IFdlYkFwcFZlcnNpb25UeXBlKF8yNSwgIl8yNSIsICIyLjUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+QXBwIFZlcnNpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2ViQXBwVmVyc2lvblR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgV2ViQXBwVmVyc2lvblR5cGVbXSB7Ci0JCQlfMjVfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5BcHAgVmVyc2lvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BcHAgVmVyc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViQXBwVmVyc2lvblR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlXZWJBcHBWZXJzaW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkFwcCBWZXJzaW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJBcHBWZXJzaW9uVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVdlYkFwcFZlcnNpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BcHAgVmVyc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViQXBwVmVyc2lvblR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIF8yNTogcmV0dXJuIF8yNV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXZWJBcHBWZXJzaW9uVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vV2ViQXBwVmVyc2lvblR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhNjAxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF1dGhDb25zdHJhaW50IGNyZWF0ZUF1dGhDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVycm9yIFBhZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVycm9yIFBhZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVycm9yUGFnZSBjcmVhdGVFcnJvclBhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmlsdGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GaWx0ZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZpbHRlciBjcmVhdGVGaWx0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGaWx0ZXJNYXBwaW5nIGNyZWF0ZUZpbHRlck1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGb3JtTG9naW5Db25maWcgY3JlYXRlRm9ybUxvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTG9jYWxlRW5jb2RpbmdNYXBwaW5nIGNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IGNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Mb2dpbiBDb25maWc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvZ2luQ29uZmlnIGNyZWF0ZUxvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbWUgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWltZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNaW1lTWFwcGluZyBjcmVhdGVNaW1lTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN1cml0eUNvbnN0cmFpbnQgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZsZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZsZXQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZsZXQgY3JlYXRlU2VydmxldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2bGV0IE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VydmxldE1hcHBpbmcgY3JlYXRlU2VydmxldE1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlc3Npb24gQ29uZmlnPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXNzaW9uQ29uZmlnIGNyZWF0ZVNlc3Npb25Db25maWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVc2VyRGF0YUNvbnN0cmFpbnQgY3JlYXRlVXNlckRhdGFDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJBcHAgY3JlYXRlV2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIGNyZWF0ZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIENvbGxlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIENvbGxlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYlJlc291cmNlQ29sbGVjdGlvbiBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2VsY29tZSBGaWxlIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWxjb21lRmlsZUxpc3QgY3JlYXRlV2VsY29tZUZpbGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYlBhY2thZ2UgZ2V0V2ViUGFja2FnZSgpOwotCi19IC8vV2ViRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJSZXNvdXJjZUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhY2EwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJSZXNvdXJjZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0Ci0gKiAJb2YgdGhlIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB3aXRoaW4KLSAqIAlhIHdlYiBhcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYKLSAqIAlubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludAotICogCWFwcGxpZXMgdG8gYWxsIEhUVFAgbWV0aG9kcy4KLSAqIAotICogCVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLSAqIAotICogICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldFdlYlJlc291cmNlTmFtZSA8ZW0+V2ViIFJlc291cmNlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldFVybFBhdHRlcm5zIDxlbT5VcmwgUGF0dGVybnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRIdHRwTWV0aG9kcyA8ZW0+SHR0cCBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0gKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24gZXh0ZW5kcyBKYXZhRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlYiBSZXNvdXJjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJICAgIFRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYgotCSAqIAkgICAgcmVzb3VyY2UgY29sbGVjdGlvbi4KLQkgKiAKLQkgKiAJICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIFJlc291cmNlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdlYlJlc291cmNlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0V2ViUmVzb3VyY2VOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0V2ViUmVzb3VyY2VOYW1lIDxlbT5XZWIgUmVzb3VyY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIFJlc291cmNlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V2ViUmVzb3VyY2VOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VcmwgUGF0dGVybnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcmwgUGF0dGVybnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0VXJsUGF0dGVybnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh0dHAgTWV0aG9kczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SHR0cCBNZXRob2RzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHR0cCBNZXRob2RzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEh0dHBNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gV2ViUmVzb3VyY2VDb2xsZWN0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2VsY29tZUZpbGVMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWxjb21lRmlsZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3MmNhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWxjb21lRmlsZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWxjb21lIEZpbGUgTGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCi0gKiAJVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lCi0gKiAJZmlsZXMgZWxlbWVudHMuCi0gKiAKLSAqIAlVc2VkIGluOiB3ZWItYXBwCi0gKiAKLSAqICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlbGNvbWVGaWxlTGlzdCNnZXRXZWxjb21lRmlsZXMgPGVtPldlbGNvbWUgRmlsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlbGNvbWVGaWxlTGlzdCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2VsY29tZUZpbGVMaXN0KCkKLSAqIEBleHRlbmRzIEphdmFFRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlbGNvbWVGaWxlTGlzdCBleHRlbmRzIEphdmFFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2VsY29tZSBGaWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCi0JICogCSAgICBUaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZQotCSAqIAkgICAgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0JICogCi0JICogCSAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlbGNvbWUgRmlsZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlbGNvbWVGaWxlTGlzdF9XZWxjb21lRmlsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFdlbGNvbWVGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlbGNvbWVGaWxlTGlzdF9JZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdlbGNvbWVGaWxlTGlzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvQXV0aENvbnN0cmFpbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0F1dGhDb25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTFlY2FmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvQXV0aENvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQXV0aENvbnN0cmFpbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXV0aCBDb25zdHJhaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkF1dGhDb25zdHJhaW50SW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5BdXRoQ29uc3RyYWludEltcGwjZ2V0Um9sZU5hbWVzIDxlbT5Sb2xlIE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkF1dGhDb25zdHJhaW50SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRoQ29uc3RyYWludEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEF1dGhDb25zdHJhaW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZXMoKSA8ZW0+Um9sZSBOYW1lczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByb2xlTmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXV0aENvbnN0cmFpbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5BVVRIX0NPTlNUUkFJTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSb2xlTmFtZXMoKSB7Ci0JCWlmIChyb2xlTmFtZXMgPT0gbnVsbCkgewotCQkJcm9sZU5hbWVzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1JPTEVfTkFNRVMpOwotCQl9Ci0JCXJldHVybiByb2xlTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fUk9MRV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0Um9sZU5hbWVzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFX05BTUVTOgotCQkJCWdldFJvbGVOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fUk9MRV9OQU1FUzoKLQkJCQlnZXRSb2xlTmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFX05BTUVTOgotCQkJCXJldHVybiByb2xlTmFtZXMgIT0gbnVsbCAmJiAhcm9sZU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocm9sZU5hbWVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJvbGVOYW1lcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BdXRoQ29uc3RyYWludEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0Vycm9yUGFnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRXJyb3JQYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWVkODM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRXJyb3JQYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FcnJvciBQYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkVycm9yUGFnZUltcGwjZ2V0RXJyb3JDb2RlIDxlbT5FcnJvciBDb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkVycm9yUGFnZUltcGwjZ2V0RXhjZXB0aW9uVHlwZSA8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRXJyb3JQYWdlSW1wbCNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRXJyb3JQYWdlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvclBhZ2VJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFcnJvclBhZ2UgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFcnJvckNvZGUoKSA8ZW0+RXJyb3IgQ29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXJyb3JDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRVJST1JfQ09ERV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFcnJvckNvZGUoKSA8ZW0+RXJyb3IgQ29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXJyb3JDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBlcnJvckNvZGUgPSBFUlJPUl9DT0RFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2VwdGlvblR5cGUoKSA8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4Y2VwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2VwdGlvblR5cGUoKSA8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4Y2VwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXhjZXB0aW9uVHlwZSA9IEVYQ0VQVElPTl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uID0gTE9DQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFcnJvclBhZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5FUlJPUl9QQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEVycm9yQ29kZSgpIHsKLQkJcmV0dXJuIGVycm9yQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvckNvZGUoQmlnSW50ZWdlciBuZXdFcnJvckNvZGUpIHsKLQkJQmlnSW50ZWdlciBvbGRFcnJvckNvZGUgPSBlcnJvckNvZGU7Ci0JCWVycm9yQ29kZSA9IG5ld0Vycm9yQ29kZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19FUlJPUl9DT0RFLCBvbGRFcnJvckNvZGUsIGVycm9yQ29kZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uVHlwZShTdHJpbmcgbmV3RXhjZXB0aW9uVHlwZSkgewotCQlTdHJpbmcgb2xkRXhjZXB0aW9uVHlwZSA9IGV4Y2VwdGlvblR5cGU7Ci0JCWV4Y2VwdGlvblR5cGUgPSBuZXdFeGNlcHRpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFLCBvbGRFeGNlcHRpb25UeXBlLCBleGNlcHRpb25UeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikgewotCQlTdHJpbmcgb2xkTG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJbG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTiwgb2xkTG9jYXRpb24sIGxvY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0VSUk9SX0NPREU6Ci0JCQkJcmV0dXJuIGdldEVycm9yQ29kZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXRFeGNlcHRpb25UeXBlKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19FUlJPUl9DT0RFOgotCQkJCXNldEVycm9yQ29kZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFOgotCQkJCXNldEV4Y2VwdGlvblR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0xPQ0FUSU9OOgotCQkJCXNldExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0VSUk9SX0NPREU6Ci0JCQkJc2V0RXJyb3JDb2RlKEVSUk9SX0NPREVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRToKLQkJCQlzZXRFeGNlcHRpb25UeXBlKEVYQ0VQVElPTl9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fTE9DQVRJT046Ci0JCQkJc2V0TG9jYXRpb24oTE9DQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fRVJST1JfQ09ERToKLQkJCQlyZXR1cm4gRVJST1JfQ09ERV9FREVGQVVMVCA9PSBudWxsID8gZXJyb3JDb2RlICE9IG51bGwgOiAhRVJST1JfQ09ERV9FREVGQVVMVC5lcXVhbHMoZXJyb3JDb2RlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRToKLQkJCQlyZXR1cm4gRVhDRVBUSU9OX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGV4Y2VwdGlvblR5cGUgIT0gbnVsbCA6ICFFWENFUFRJT05fVFlQRV9FREVGQVVMVC5lcXVhbHMoZXhjZXB0aW9uVHlwZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fTE9DQVRJT046Ci0JCQkJcmV0dXJuIExPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBsb2NhdGlvbiAhPSBudWxsIDogIUxPQ0FUSU9OX0VERUZBVUxULmVxdWFscyhsb2NhdGlvbik7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlcnJvckNvZGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXJyb3JDb2RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGNlcHRpb25UeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGV4Y2VwdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvY2F0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxvY2F0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Vycm9yUGFnZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0ZpbHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRmlsdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk4MTQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRmlsdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmlsdGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlckltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVySW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVySW1wbCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVySW1wbCNnZXRGaWx0ZXJOYW1lIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsI2dldEZpbHRlckNsYXNzIDxlbT5GaWx0ZXIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVySW1wbCNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEZpbHRlciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEljb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaWNvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbHRlck5hbWUoKSA8ZW0+RmlsdGVyIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbHRlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbHRlck5hbWUoKSA8ZW0+RmlsdGVyIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbHRlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmlsdGVyTmFtZSA9IEZJTFRFUl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbHRlckNsYXNzKCkgPGVtPkZpbHRlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmlsdGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUl9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWx0ZXJDbGFzcygpIDxlbT5GaWx0ZXIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbHRlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbHRlckNsYXNzID0gRklMVEVSX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdFBhcmFtcygpIDxlbT5Jbml0IFBhcmFtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0UGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5pdFBhcmFtcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBGaWx0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5GSUxURVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5GSUxURVJfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLkZJTFRFUl9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKLQkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuRklMVEVSX19JQ09OUyk7Ci0JCX0KLQkJcmV0dXJuIGljb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTmFtZSgpIHsKLQkJcmV0dXJuIGZpbHRlck5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyTmFtZShTdHJpbmcgbmV3RmlsdGVyTmFtZSkgewotCQlTdHJpbmcgb2xkRmlsdGVyTmFtZSA9IGZpbHRlck5hbWU7Ci0JCWZpbHRlck5hbWUgPSBuZXdGaWx0ZXJOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkZJTFRFUl9fRklMVEVSX05BTUUsIG9sZEZpbHRlck5hbWUsIGZpbHRlck5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbHRlckNsYXNzKCkgewotCQlyZXR1cm4gZmlsdGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyQ2xhc3MoU3RyaW5nIG5ld0ZpbHRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGRGaWx0ZXJDbGFzcyA9IGZpbHRlckNsYXNzOwotCQlmaWx0ZXJDbGFzcyA9IG5ld0ZpbHRlckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkZJTFRFUl9fRklMVEVSX0NMQVNTLCBvbGRGaWx0ZXJDbGFzcywgZmlsdGVyQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbml0UGFyYW1zKCkgewotCQlpZiAoaW5pdFBhcmFtcyA9PSBudWxsKSB7Ci0JCQlpbml0UGFyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBhcmFtVmFsdWUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRQYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5GSUxURVJfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fRklMVEVSX05BTUU6Ci0JCQkJcmV0dXJuIGdldEZpbHRlck5hbWUoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyQ2xhc3MoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRJbml0UGFyYW1zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9OQU1FOgotCQkJCXNldEZpbHRlck5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fRklMVEVSX0NMQVNTOgotCQkJCXNldEZpbHRlckNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1TOgotCQkJCWdldEluaXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCWdldEluaXRQYXJhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9OQU1FOgotCQkJCXNldEZpbHRlck5hbWUoRklMVEVSX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9DTEFTUzoKLQkJCQlzZXRGaWx0ZXJDbGFzcyhGSUxURVJfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1TOgotCQkJCWdldEluaXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19GSUxURVJfTkFNRToKLQkJCQlyZXR1cm4gRklMVEVSX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZpbHRlck5hbWUgIT0gbnVsbCA6ICFGSUxURVJfTkFNRV9FREVGQVVMVC5lcXVhbHMoZmlsdGVyTmFtZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIEZJTFRFUl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gZmlsdGVyQ2xhc3MgIT0gbnVsbCA6ICFGSUxURVJfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGZpbHRlckNsYXNzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBpbml0UGFyYW1zICE9IG51bGwgJiYgIWluaXRQYXJhbXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaWx0ZXJOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGZpbHRlck5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbHRlckNsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGZpbHRlckNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0ZpbHRlckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0ZpbHRlck1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0ZpbHRlck1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDE1YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9GaWx0ZXJNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmlsdGVyIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVyTWFwcGluZ0ltcGwjZ2V0RmlsdGVyTmFtZSA8ZW0+RmlsdGVyIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVyTWFwcGluZ0ltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlck1hcHBpbmdJbXBsI2dldFVybFBhdHRlcm5zIDxlbT5VcmwgUGF0dGVybnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVyTWFwcGluZ0ltcGwjZ2V0U2VydmxldE5hbWVzIDxlbT5TZXJ2bGV0IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlck1hcHBpbmdJbXBsI2dldERpc3BhdGNoZXJzIDxlbT5EaXNwYXRjaGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJNYXBwaW5nSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRmlsdGVyTWFwcGluZyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbHRlck5hbWUoKSA8ZW0+RmlsdGVyIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbHRlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbHRlck5hbWUoKSA8ZW0+RmlsdGVyIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbHRlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmlsdGVyTmFtZSA9IEZJTFRFUl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BhdGNoZXJzKCkgPGVtPkRpc3BhdGNoZXJzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BhdGNoZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGF0Y2hlcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmlsdGVyTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkZJTFRFUl9NQVBQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTmFtZSgpIHsKLQkJcmV0dXJuIGZpbHRlck5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyTmFtZShTdHJpbmcgbmV3RmlsdGVyTmFtZSkgewotCQlTdHJpbmcgb2xkRmlsdGVyTmFtZSA9IGZpbHRlck5hbWU7Ci0JCWZpbHRlck5hbWUgPSBuZXdGaWx0ZXJOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19GSUxURVJfTkFNRSwgb2xkRmlsdGVyTmFtZSwgZmlsdGVyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwKCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkgewotCQkJZ3JvdXAgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VXJsUGF0dGVybnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZsZXROYW1lcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuRklMVEVSX01BUFBJTkdfX1NFUlZMRVRfTkFNRVMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BhdGNoZXJzKCkgewotCQlpZiAoZGlzcGF0Y2hlcnMgPT0gbnVsbCkgewotCQkJZGlzcGF0Y2hlcnMgPSBuZXcgRURhdGFUeXBlRUxpc3QoRGlzcGF0Y2hlclR5cGUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJTKTsKLQkJfQotCQlyZXR1cm4gZGlzcGF0Y2hlcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFVybFBhdHRlcm5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19GSUxURVJfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyTmFtZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19HUk9VUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTlM6Ci0JCQkJcmV0dXJuIGdldFVybFBhdHRlcm5zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVRfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldFNlcnZsZXROYW1lcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGF0Y2hlcnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSX05BTUU6Ci0JCQkJc2V0RmlsdGVyTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0dST1VQOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk5TOgotCQkJCWdldFVybFBhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19TRVJWTEVUX05BTUVTOgotCQkJCWdldFNlcnZsZXROYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmxldE5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJTOgotCQkJCWdldERpc3BhdGNoZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwYXRjaGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19GSUxURVJfTkFNRToKLQkJCQlzZXRGaWx0ZXJOYW1lKEZJTFRFUl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOUzoKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19TRVJWTEVUX05BTUVTOgotCQkJCWdldFNlcnZsZXROYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSUzoKLQkJCQlnZXREaXNwYXRjaGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUl9OQU1FOgotCQkJCXJldHVybiBGSUxURVJfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZmlsdGVyTmFtZSAhPSBudWxsIDogIUZJTFRFUl9OQU1FX0VERUZBVUxULmVxdWFscyhmaWx0ZXJOYW1lKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fR1JPVVA6Ci0JCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk5TOgotCQkJCXJldHVybiAhZ2V0VXJsUGF0dGVybnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVRfTkFNRVM6Ci0JCQkJcmV0dXJuICFnZXRTZXJ2bGV0TmFtZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJTOgotCQkJCXJldHVybiBkaXNwYXRjaGVycyAhPSBudWxsICYmICFkaXNwYXRjaGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZmlsdGVyTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChmaWx0ZXJOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChncm91cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlzcGF0Y2hlcnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZGlzcGF0Y2hlcnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRmlsdGVyTWFwcGluZ0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0Zvcm1Mb2dpbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ0ODU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Rm9ybSBMb2dpbiBDb25maWc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRm9ybUxvZ2luQ29uZmlnSW1wbCNnZXRGb3JtTG9naW5QYWdlIDxlbT5Gb3JtIExvZ2luIFBhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRm9ybUxvZ2luQ29uZmlnSW1wbCNnZXRGb3JtRXJyb3JQYWdlIDxlbT5Gb3JtIEVycm9yIFBhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRm9ybUxvZ2luQ29uZmlnSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtTG9naW5Db25maWdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBGb3JtTG9naW5Db25maWcgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtTG9naW5QYWdlKCkgPGVtPkZvcm0gTG9naW4gUGFnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rm9ybUxvZ2luUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9MT0dJTl9QQUdFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm1Mb2dpblBhZ2UoKSA8ZW0+Rm9ybSBMb2dpbiBQYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGb3JtTG9naW5QYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1Mb2dpblBhZ2UgPSBGT1JNX0xPR0lOX1BBR0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybUVycm9yUGFnZSgpIDxlbT5Gb3JtIEVycm9yIFBhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZvcm1FcnJvclBhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fRVJST1JfUEFHRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtRXJyb3JQYWdlKCkgPGVtPkZvcm0gRXJyb3IgUGFnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rm9ybUVycm9yUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtRXJyb3JQYWdlID0gRk9STV9FUlJPUl9QQUdFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRm9ybUxvZ2luQ29uZmlnSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuRk9STV9MT0dJTl9DT05GSUc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb3JtTG9naW5QYWdlKCkgewotCQlyZXR1cm4gZm9ybUxvZ2luUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JtTG9naW5QYWdlKFN0cmluZyBuZXdGb3JtTG9naW5QYWdlKSB7Ci0JCVN0cmluZyBvbGRGb3JtTG9naW5QYWdlID0gZm9ybUxvZ2luUGFnZTsKLQkJZm9ybUxvZ2luUGFnZSA9IG5ld0Zvcm1Mb2dpblBhZ2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRSwgb2xkRm9ybUxvZ2luUGFnZSwgZm9ybUxvZ2luUGFnZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUVycm9yUGFnZSgpIHsKLQkJcmV0dXJuIGZvcm1FcnJvclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9ybUVycm9yUGFnZShTdHJpbmcgbmV3Rm9ybUVycm9yUGFnZSkgewotCQlTdHJpbmcgb2xkRm9ybUVycm9yUGFnZSA9IGZvcm1FcnJvclBhZ2U7Ci0JCWZvcm1FcnJvclBhZ2UgPSBuZXdGb3JtRXJyb3JQYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0UsIG9sZEZvcm1FcnJvclBhZ2UsIGZvcm1FcnJvclBhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6Ci0JCQkJcmV0dXJuIGdldEZvcm1Mb2dpblBhZ2UoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFOgotCQkJCXJldHVybiBnZXRGb3JtRXJyb3JQYWdlKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRToKLQkJCQlzZXRGb3JtTG9naW5QYWdlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFOgotCQkJCXNldEZvcm1FcnJvclBhZ2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6Ci0JCQkJc2V0Rm9ybUxvZ2luUGFnZShGT1JNX0xPR0lOX1BBR0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFOgotCQkJCXNldEZvcm1FcnJvclBhZ2UoRk9STV9FUlJPUl9QQUdFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFOgotCQkJCXJldHVybiBGT1JNX0xPR0lOX1BBR0VfRURFRkFVTFQgPT0gbnVsbCA/IGZvcm1Mb2dpblBhZ2UgIT0gbnVsbCA6ICFGT1JNX0xPR0lOX1BBR0VfRURFRkFVTFQuZXF1YWxzKGZvcm1Mb2dpblBhZ2UpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0U6Ci0JCQkJcmV0dXJuIEZPUk1fRVJST1JfUEFHRV9FREVGQVVMVCA9PSBudWxsID8gZm9ybUVycm9yUGFnZSAhPSBudWxsIDogIUZPUk1fRVJST1JfUEFHRV9FREVGQVVMVC5lcXVhbHMoZm9ybUVycm9yUGFnZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZm9ybUxvZ2luUGFnZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChmb3JtTG9naW5QYWdlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmb3JtRXJyb3JQYWdlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGZvcm1FcnJvclBhZ2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRm9ybUxvZ2luQ29uZmlnSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvTG9jYWxlRW5jb2RpbmdNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Mb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjhmMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Mb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsI2dldExvY2FsZSA8ZW0+TG9jYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvY2FsZUVuY29kaW5nTWFwcGluZ0ltcGwjZ2V0RW5jb2RpbmcgPGVtPkVuY29kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvY2FsZUVuY29kaW5nTWFwcGluZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxlRW5jb2RpbmdNYXBwaW5nSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTG9jYWxlRW5jb2RpbmdNYXBwaW5nIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxlKCkgPGVtPkxvY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxlKCkgPGVtPkxvY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsZSA9IExPQ0FMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmNvZGluZygpIDxlbT5FbmNvZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuY29kaW5nKCkgPGVtPkVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZyA9IEVOQ09ESU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTG9jYWxlRW5jb2RpbmdNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGUoKSB7Ci0JCXJldHVybiBsb2NhbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxlKFN0cmluZyBuZXdMb2NhbGUpIHsKLQkJU3RyaW5nIG9sZExvY2FsZSA9IGxvY2FsZTsKLQkJbG9jYWxlID0gbmV3TG9jYWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19MT0NBTEUsIG9sZExvY2FsZSwgbG9jYWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIGVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBuZXdFbmNvZGluZykgewotCQlTdHJpbmcgb2xkRW5jb2RpbmcgPSBlbmNvZGluZzsKLQkJZW5jb2RpbmcgPSBuZXdFbmNvZGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkcsIG9sZEVuY29kaW5nLCBlbmNvZGluZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKLQkJCQlyZXR1cm4gZ2V0TG9jYWxlKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HOgotCQkJCXJldHVybiBnZXRFbmNvZGluZygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19MT0NBTEU6Ci0JCQkJc2V0TG9jYWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkc6Ci0JCQkJc2V0RW5jb2RpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19MT0NBTEU6Ci0JCQkJc2V0TG9jYWxlKExPQ0FMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORzoKLQkJCQlzZXRFbmNvZGluZyhFTkNPRElOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKLQkJCQlyZXR1cm4gTE9DQUxFX0VERUZBVUxUID09IG51bGwgPyBsb2NhbGUgIT0gbnVsbCA6ICFMT0NBTEVfRURFRkFVTFQuZXF1YWxzKGxvY2FsZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HOgotCQkJCXJldHVybiBFTkNPRElOR19FREVGQVVMVCA9PSBudWxsID8gZW5jb2RpbmcgIT0gbnVsbCA6ICFFTkNPRElOR19FREVGQVVMVC5lcXVhbHMoZW5jb2RpbmcpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2FsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsb2NhbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVuY29kaW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGVuY29kaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0xvY2FsZUVuY29kaW5nTWFwcGluZ0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNWRhNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGxvY2FsRW5jb2RpbmdNYXBwaW5ncyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKSB7Ci0JCWlmIChsb2NhbEVuY29kaW5nTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJbG9jYWxFbmNvZGluZ01hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExvY2FsZUVuY29kaW5nTWFwcGluZy5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUyk7Ci0JCX0KLQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1M6Ci0JCQkJZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgotCQkJCWdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUzoKLQkJCQlyZXR1cm4gbG9jYWxFbmNvZGluZ01hcHBpbmdzICE9IG51bGwgJiYgIWxvY2FsRW5jb2RpbmdNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0xvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Mb2dpbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvTG9naW5Db25maWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NGEzOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Mb2dpbkNvbmZpZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TG9naW4gQ29uZmlnPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvZ2luQ29uZmlnSW1wbCNnZXRBdXRoTWV0aG9kIDxlbT5BdXRoIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2dpbkNvbmZpZ0ltcGwjZ2V0UmVhbG1OYW1lIDxlbT5SZWFsbSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvZ2luQ29uZmlnSW1wbCNnZXRGb3JtTG9naW5Db25maWcgPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvZ2luQ29uZmlnSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dpbkNvbmZpZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExvZ2luQ29uZmlnIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aE1ldGhvZCgpIDxlbT5BdXRoIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSF9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aE1ldGhvZCgpIDxlbT5BdXRoIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRoTWV0aG9kID0gQVVUSF9NRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhbG1OYW1lKCkgPGVtPlJlYWxtIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYWxtTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBTE1fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFsbU5hbWUoKSA8ZW0+UmVhbG0gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhbG1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYWxtTmFtZSA9IFJFQUxNX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtTG9naW5Db25maWcoKSA8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZvcm1Mb2dpbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZvcm1Mb2dpbkNvbmZpZyBmb3JtTG9naW5Db25maWcgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTG9naW5Db25maWdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5MT0dJTl9DT05GSUc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRoTWV0aG9kKCkgewotCQlyZXR1cm4gYXV0aE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRoTWV0aG9kKFN0cmluZyBuZXdBdXRoTWV0aG9kKSB7Ci0JCVN0cmluZyBvbGRBdXRoTWV0aG9kID0gYXV0aE1ldGhvZDsKLQkJYXV0aE1ldGhvZCA9IG5ld0F1dGhNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRCwgb2xkQXV0aE1ldGhvZCwgYXV0aE1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVhbG1OYW1lKCkgewotCQlyZXR1cm4gcmVhbG1OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWxtTmFtZShTdHJpbmcgbmV3UmVhbG1OYW1lKSB7Ci0JCVN0cmluZyBvbGRSZWFsbU5hbWUgPSByZWFsbU5hbWU7Ci0JCXJlYWxtTmFtZSA9IG5ld1JlYWxtTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX1JFQUxNX05BTUUsIG9sZFJlYWxtTmFtZSwgcmVhbG1OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZvcm1Mb2dpbkNvbmZpZyBnZXRGb3JtTG9naW5Db25maWcoKSB7Ci0JCXJldHVybiBmb3JtTG9naW5Db25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Rm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBuZXdGb3JtTG9naW5Db25maWcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRm9ybUxvZ2luQ29uZmlnIG9sZEZvcm1Mb2dpbkNvbmZpZyA9IGZvcm1Mb2dpbkNvbmZpZzsKLQkJZm9ybUxvZ2luQ29uZmlnID0gbmV3Rm9ybUxvZ2luQ29uZmlnOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUcsIG9sZEZvcm1Mb2dpbkNvbmZpZywgbmV3Rm9ybUxvZ2luQ29uZmlnKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIG5ld0Zvcm1Mb2dpbkNvbmZpZykgewotCQlpZiAobmV3Rm9ybUxvZ2luQ29uZmlnICE9IGZvcm1Mb2dpbkNvbmZpZykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZm9ybUxvZ2luQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWZvcm1Mb2dpbkNvbmZpZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Rm9ybUxvZ2luQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Zvcm1Mb2dpbkNvbmZpZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRGb3JtTG9naW5Db25maWcobmV3Rm9ybUxvZ2luQ29uZmlnLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRywgbmV3Rm9ybUxvZ2luQ29uZmlnLCBuZXdGb3JtTG9naW5Db25maWcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHOgotCQkJCXJldHVybiBiYXNpY1NldEZvcm1Mb2dpbkNvbmZpZyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEF1dGhNZXRob2QoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX1JFQUxNX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJlYWxtTmFtZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGdldEZvcm1Mb2dpbkNvbmZpZygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9EOgotCQkJCXNldEF1dGhNZXRob2QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fUkVBTE1fTkFNRToKLQkJCQlzZXRSZWFsbU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUc6Ci0JCQkJc2V0Rm9ybUxvZ2luQ29uZmlnKChGb3JtTG9naW5Db25maWcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKLQkJCQlzZXRBdXRoTWV0aG9kKEFVVEhfTUVUSE9EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FOgotCQkJCXNldFJlYWxtTmFtZShSRUFMTV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRzoKLQkJCQlzZXRGb3JtTG9naW5Db25maWcoKEZvcm1Mb2dpbkNvbmZpZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKLQkJCQlyZXR1cm4gQVVUSF9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhNZXRob2QgIT0gbnVsbCA6ICFBVVRIX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoYXV0aE1ldGhvZCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FOgotCQkJCXJldHVybiBSRUFMTV9OQU1FX0VERUZBVUxUID09IG51bGwgPyByZWFsbU5hbWUgIT0gbnVsbCA6ICFSRUFMTV9OQU1FX0VERUZBVUxULmVxdWFscyhyZWFsbU5hbWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGZvcm1Mb2dpbkNvbmZpZyAhPSBudWxsOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdXRoTWV0aG9kOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGF1dGhNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYWxtTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZWFsbU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTG9naW5Db25maWdJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9NaW1lTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvTWltZU1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYmY2OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9NaW1lTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWltZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk1pbWVNYXBwaW5nSW1wbCNnZXRFeHRlbnNpb24gPGVtPkV4dGVuc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5NaW1lTWFwcGluZ0ltcGwjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5NaW1lTWFwcGluZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWltZU1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNaW1lTWFwcGluZyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuc2lvbigpIDxlbT5FeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuc2lvbigpIDxlbT5FeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlbnNpb24gPSBFWFRFTlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWltZVR5cGUoKSA8ZW0+TWltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbWVUeXBlKCkgPGVtPk1pbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWltZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWltZVR5cGUgPSBNSU1FX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNaW1lTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLk1JTUVfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIG5ld0V4dGVuc2lvbikgewotCQlTdHJpbmcgb2xkRXh0ZW5zaW9uID0gZXh0ZW5zaW9uOwotCQlleHRlbnNpb24gPSBuZXdFeHRlbnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT04sIG9sZEV4dGVuc2lvbiwgZXh0ZW5zaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLQkJcmV0dXJuIG1pbWVUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbWVUeXBlKFN0cmluZyBuZXdNaW1lVHlwZSkgewotCQlTdHJpbmcgb2xkTWltZVR5cGUgPSBtaW1lVHlwZTsKLQkJbWltZVR5cGUgPSBuZXdNaW1lVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5NSU1FX01BUFBJTkdfX01JTUVfVFlQRSwgb2xkTWltZVR5cGUsIG1pbWVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5NSU1FX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT046Ci0JCQkJcmV0dXJuIGdldEV4dGVuc2lvbigpOwotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fTUlNRV9UWVBFOgotCQkJCXJldHVybiBnZXRNaW1lVHlwZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX01BUFBJTkdfX0VYVEVOU0lPTjoKLQkJCQlzZXRFeHRlbnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fTUlNRV9UWVBFOgotCQkJCXNldE1pbWVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT046Ci0JCQkJc2V0RXh0ZW5zaW9uKEVYVEVOU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fTUlNRV9UWVBFOgotCQkJCXNldE1pbWVUeXBlKE1JTUVfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fRVhURU5TSU9OOgotCQkJCXJldHVybiBFWFRFTlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVuc2lvbiAhPSBudWxsIDogIUVYVEVOU0lPTl9FREVGQVVMVC5lcXVhbHMoZXh0ZW5zaW9uKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX01BUFBJTkdfX01JTUVfVFlQRToKLQkJCQlyZXR1cm4gTUlNRV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBtaW1lVHlwZSAhPSBudWxsIDogIU1JTUVfVFlQRV9FREVGQVVMVC5lcXVhbHMobWltZVR5cGUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleHRlbnNpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXh0ZW5zaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaW1lVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtaW1lVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NaW1lTWFwcGluZ0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTc2OWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VjdXJpdHlDb25zdHJhaW50SW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VjdXJpdHlDb25zdHJhaW50SW1wbCNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zIDxlbT5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VjdXJpdHlDb25zdHJhaW50SW1wbCNnZXRBdXRoQ29uc3RyYWludCA8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Q29uc3RyYWludEltcGwjZ2V0VXNlckRhdGFDb25zdHJhaW50IDxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUNvbnN0cmFpbnRJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5Q29uc3RyYWludEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5Q29uc3RyYWludCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKSA8ZW0+V2ViIFJlc291cmNlIENvbGxlY3Rpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhDb25zdHJhaW50KCkgPGVtPkF1dGggQ29uc3RyYWludDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBBdXRoQ29uc3RyYWludCBhdXRoQ29uc3RyYWludCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKSA8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzZXJEYXRhQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFVzZXJEYXRhQ29uc3RyYWludCB1c2VyRGF0YUNvbnN0cmFpbnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlDb25zdHJhaW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuU0VDVVJJVFlfQ09OU1RSQUlOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpIHsKLQkJaWYgKHdlYlJlc291cmNlQ29sbGVjdGlvbnMgPT0gbnVsbCkgewotCQkJd2ViUmVzb3VyY2VDb2xsZWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TKTsKLQkJfQotCQlyZXR1cm4gd2ViUmVzb3VyY2VDb2xsZWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXV0aENvbnN0cmFpbnQgZ2V0QXV0aENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBhdXRoQ29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBdXRoQ29uc3RyYWludChBdXRoQ29uc3RyYWludCBuZXdBdXRoQ29uc3RyYWludCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlBdXRoQ29uc3RyYWludCBvbGRBdXRoQ29uc3RyYWludCA9IGF1dGhDb25zdHJhaW50OwotCQlhdXRoQ29uc3RyYWludCA9IG5ld0F1dGhDb25zdHJhaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVCwgb2xkQXV0aENvbnN0cmFpbnQsIG5ld0F1dGhDb25zdHJhaW50KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRoQ29uc3RyYWludChBdXRoQ29uc3RyYWludCBuZXdBdXRoQ29uc3RyYWludCkgewotCQlpZiAobmV3QXV0aENvbnN0cmFpbnQgIT0gYXV0aENvbnN0cmFpbnQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGF1dGhDb25zdHJhaW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWF1dGhDb25zdHJhaW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0F1dGhDb25zdHJhaW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0F1dGhDb25zdHJhaW50KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXV0aENvbnN0cmFpbnQobmV3QXV0aENvbnN0cmFpbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQsIG5ld0F1dGhDb25zdHJhaW50LCBuZXdBdXRoQ29uc3RyYWludCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVc2VyRGF0YUNvbnN0cmFpbnQgZ2V0VXNlckRhdGFDb25zdHJhaW50KCkgewotCQlyZXR1cm4gdXNlckRhdGFDb25zdHJhaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgbmV3VXNlckRhdGFDb25zdHJhaW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVVzZXJEYXRhQ29uc3RyYWludCBvbGRVc2VyRGF0YUNvbnN0cmFpbnQgPSB1c2VyRGF0YUNvbnN0cmFpbnQ7Ci0JCXVzZXJEYXRhQ29uc3RyYWludCA9IG5ld1VzZXJEYXRhQ29uc3RyYWludDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCwgb2xkVXNlckRhdGFDb25zdHJhaW50LCBuZXdVc2VyRGF0YUNvbnN0cmFpbnQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgbmV3VXNlckRhdGFDb25zdHJhaW50KSB7Ci0JCWlmIChuZXdVc2VyRGF0YUNvbnN0cmFpbnQgIT0gdXNlckRhdGFDb25zdHJhaW50KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh1c2VyRGF0YUNvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdXNlckRhdGFDb25zdHJhaW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VXNlckRhdGFDb25zdHJhaW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1VzZXJEYXRhQ29uc3RyYWludCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VXNlckRhdGFDb25zdHJhaW50KG5ld1VzZXJEYXRhQ29uc3RyYWludCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5ULCBuZXdVc2VyRGF0YUNvbnN0cmFpbnQsIG5ld1VzZXJEYXRhQ29uc3RyYWludCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QXV0aENvbnN0cmFpbnQobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VXNlckRhdGFDb25zdHJhaW50KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UOgotCQkJCXJldHVybiBnZXRBdXRoQ29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCXJldHVybiBnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlM6Ci0JCQkJZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVDoKLQkJCQlzZXRBdXRoQ29uc3RyYWludCgoQXV0aENvbnN0cmFpbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVDoKLQkJCQlzZXRVc2VyRGF0YUNvbnN0cmFpbnQoKFVzZXJEYXRhQ29uc3RyYWludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlM6Ci0JCQkJZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVDoKLQkJCQlzZXRBdXRoQ29uc3RyYWludCgoQXV0aENvbnN0cmFpbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCXNldFVzZXJEYXRhQ29uc3RyYWludCgoVXNlckRhdGFDb25zdHJhaW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zICE9IG51bGwgJiYgIXdlYlJlc291cmNlQ29sbGVjdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gYXV0aENvbnN0cmFpbnQgIT0gbnVsbDsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gdXNlckRhdGFDb25zdHJhaW50ICE9IG51bGw7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlY3VyaXR5Q29uc3RyYWludEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzFmMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9TZXJ2bGV0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZsZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCNnZXRTZXJ2bGV0TmFtZSA8ZW0+U2VydmxldCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsI2dldFNlcnZsZXRDbGFzcyA8ZW0+U2VydmxldCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCNnZXRKc3BGaWxlIDxlbT5Kc3AgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCNnZXRMb2FkT25TdGFydHVwIDxlbT5Mb2FkIE9uIFN0YXJ0dXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwjZ2V0UnVuQXMgPGVtPlJ1biBBczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCNnZXRTZWN1cml0eVJvbGVSZWZzIDxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlcnZsZXQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2bGV0TmFtZSgpIDxlbT5TZXJ2bGV0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZsZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmxldE5hbWUoKSA8ZW0+U2VydmxldCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2bGV0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2bGV0TmFtZSA9IFNFUlZMRVRfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2bGV0Q2xhc3MoKSA8ZW0+U2VydmxldCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmxldENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZsZXRDbGFzcygpIDxlbT5TZXJ2bGV0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2bGV0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmxldENsYXNzID0gU0VSVkxFVF9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKc3BGaWxlKCkgPGVtPkpzcCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKc3BGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKc3BGaWxlKCkgPGVtPkpzcCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKc3BGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGpzcEZpbGUgPSBKU1BfRklMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRQYXJhbXMoKSA8ZW0+SW5pdCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRQYXJhbXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvYWRPblN0YXJ0dXAoKSA8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2FkT25TdGFydHVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBMT0FEX09OX1NUQVJUVVBfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9hZE9uU3RhcnR1cCgpIDxlbT5Mb2FkIE9uIFN0YXJ0dXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvYWRPblN0YXJ0dXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbG9hZE9uU3RhcnR1cCA9IExPQURfT05fU1RBUlRVUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJ1bkFzKCkgPGVtPlJ1biBBczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UnVuQXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSdW5BcyBydW5BcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN1cml0eVJvbGVSZWZzKCkgPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGVSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2bGV0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuU0VSVkxFVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFUlZMRVRfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFUlZMRVRfX0RJU1BMQVlfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7Ci0JCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFUlZMRVRfX0lDT05TKTsKLQkJfQotCQlyZXR1cm4gaWNvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZsZXROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZsZXROYW1lKFN0cmluZyBuZXdTZXJ2bGV0TmFtZSkgewotCQlTdHJpbmcgb2xkU2VydmxldE5hbWUgPSBzZXJ2bGV0TmFtZTsKLQkJc2VydmxldE5hbWUgPSBuZXdTZXJ2bGV0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX05BTUUsIG9sZFNlcnZsZXROYW1lLCBzZXJ2bGV0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldENsYXNzKCkgewotCQlyZXR1cm4gc2VydmxldENsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZsZXRDbGFzcyhTdHJpbmcgbmV3U2VydmxldENsYXNzKSB7Ci0JCVN0cmluZyBvbGRTZXJ2bGV0Q2xhc3MgPSBzZXJ2bGV0Q2xhc3M7Ci0JCXNlcnZsZXRDbGFzcyA9IG5ld1NlcnZsZXRDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX0NMQVNTLCBvbGRTZXJ2bGV0Q2xhc3MsIHNlcnZsZXRDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNwRmlsZSgpIHsKLQkJcmV0dXJuIGpzcEZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SnNwRmlsZShTdHJpbmcgbmV3SnNwRmlsZSkgewotCQlTdHJpbmcgb2xkSnNwRmlsZSA9IGpzcEZpbGU7Ci0JCWpzcEZpbGUgPSBuZXdKc3BGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFUlZMRVRfX0pTUF9GSUxFLCBvbGRKc3BGaWxlLCBqc3BGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW5pdFBhcmFtcygpIHsKLQkJaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkgewotCQkJaW5pdFBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJhbVZhbHVlLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExvYWRPblN0YXJ0dXAoKSB7Ci0JCXJldHVybiBsb2FkT25TdGFydHVwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYWRPblN0YXJ0dXAoT2JqZWN0IG5ld0xvYWRPblN0YXJ0dXApIHsKLQkJT2JqZWN0IG9sZExvYWRPblN0YXJ0dXAgPSBsb2FkT25TdGFydHVwOwotCQlsb2FkT25TdGFydHVwID0gbmV3TG9hZE9uU3RhcnR1cDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVAsIG9sZExvYWRPblN0YXJ0dXAsIGxvYWRPblN0YXJ0dXApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUnVuQXMgZ2V0UnVuQXMoKSB7Ci0JCXJldHVybiBydW5BczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSdW5BcyhSdW5BcyBuZXdSdW5BcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSdW5BcyBvbGRSdW5BcyA9IHJ1bkFzOwotCQlydW5BcyA9IG5ld1J1bkFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFUlZMRVRfX1JVTl9BUywgb2xkUnVuQXMsIG5ld1J1bkFzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSdW5BcyhSdW5BcyBuZXdSdW5BcykgewotCQlpZiAobmV3UnVuQXMgIT0gcnVuQXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJ1bkFzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJ1bkFzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5TRVJWTEVUX19SVU5fQVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1J1bkFzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1J1bkFzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5TRVJWTEVUX19SVU5fQVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UnVuQXMobmV3UnVuQXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRVJWTEVUX19SVU5fQVMsIG5ld1J1bkFzLCBuZXdSdW5BcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlY3VyaXR5Um9sZVJlZnMoKSB7Ci0JCWlmIChzZWN1cml0eVJvbGVSZWZzID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRVJWTEVUX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UnVuQXMobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0U2VydmxldE5hbWUoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX0NMQVNTOgotCQkJCXJldHVybiBnZXRTZXJ2bGV0Q2xhc3MoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19KU1BfRklMRToKLQkJCQlyZXR1cm4gZ2V0SnNwRmlsZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRJbml0UGFyYW1zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQOgotCQkJCXJldHVybiBnZXRMb2FkT25TdGFydHVwKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTOgotCQkJCXJldHVybiBnZXRSdW5BcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfTkFNRToKLQkJCQlzZXRTZXJ2bGV0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9DTEFTUzoKLQkJCQlzZXRTZXJ2bGV0Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0pTUF9GSUxFOgotCQkJCXNldEpzcEZpbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TOgotCQkJCWdldEluaXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCWdldEluaXRQYXJhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVA6Ci0JCQkJc2V0TG9hZE9uU3RhcnR1cCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTOgotCQkJCXNldFJ1bkFzKChSdW5BcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfTkFNRToKLQkJCQlzZXRTZXJ2bGV0TmFtZShTRVJWTEVUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX0NMQVNTOgotCQkJCXNldFNlcnZsZXRDbGFzcyhTRVJWTEVUX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSlNQX0ZJTEU6Ci0JCQkJc2V0SnNwRmlsZShKU1BfRklMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TOgotCQkJCWdldEluaXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVA6Ci0JCQkJc2V0TG9hZE9uU3RhcnR1cChMT0FEX09OX1NUQVJUVVBfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6Ci0JCQkJc2V0UnVuQXMoKFJ1bkFzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FOgotCQkJCXJldHVybiBTRVJWTEVUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZsZXROYW1lICE9IG51bGwgOiAhU0VSVkxFVF9OQU1FX0VERUZBVUxULmVxdWFscyhzZXJ2bGV0TmFtZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9DTEFTUzoKLQkJCQlyZXR1cm4gU0VSVkxFVF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gc2VydmxldENsYXNzICE9IG51bGwgOiAhU0VSVkxFVF9DTEFTU19FREVGQVVMVC5lcXVhbHMoc2VydmxldENsYXNzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19KU1BfRklMRToKLQkJCQlyZXR1cm4gSlNQX0ZJTEVfRURFRkFVTFQgPT0gbnVsbCA/IGpzcEZpbGUgIT0gbnVsbCA6ICFKU1BfRklMRV9FREVGQVVMVC5lcXVhbHMoanNwRmlsZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGluaXRQYXJhbXMgIT0gbnVsbCAmJiAhaW5pdFBhcmFtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQOgotCQkJCXJldHVybiBMT0FEX09OX1NUQVJUVVBfRURFRkFVTFQgPT0gbnVsbCA/IGxvYWRPblN0YXJ0dXAgIT0gbnVsbCA6ICFMT0FEX09OX1NUQVJUVVBfRURFRkFVTFQuZXF1YWxzKGxvYWRPblN0YXJ0dXApOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1JVTl9BUzoKLQkJCQlyZXR1cm4gcnVuQXMgIT0gbnVsbDsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzZXJ2bGV0TmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzZXJ2bGV0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VydmxldENsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlcnZsZXRDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwganNwRmlsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChqc3BGaWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2FkT25TdGFydHVwOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxvYWRPblN0YXJ0dXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VydmxldEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9TZXJ2bGV0TWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNTJmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZsZXQgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TWFwcGluZ0ltcGwjZ2V0U2VydmxldE5hbWUgPGVtPlNlcnZsZXQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TWFwcGluZ0ltcGwjZ2V0VXJsUGF0dGVybnMgPGVtPlVybCBQYXR0ZXJuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TWFwcGluZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldE1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2bGV0TWFwcGluZyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZsZXROYW1lKCkgPGVtPlNlcnZsZXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmxldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2bGV0TmFtZSgpIDxlbT5TZXJ2bGV0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZsZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZsZXROYW1lID0gU0VSVkxFVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJsUGF0dGVybnMoKSA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVybFBhdHRlcm5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdXJsUGF0dGVybnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmxldE1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5TRVJWTEVUX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZsZXROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZsZXROYW1lKFN0cmluZyBuZXdTZXJ2bGV0TmFtZSkgewotCQlTdHJpbmcgb2xkU2VydmxldE5hbWUgPSBzZXJ2bGV0TmFtZTsKLQkJc2VydmxldE5hbWUgPSBuZXdTZXJ2bGV0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVRfTkFNRSwgb2xkU2VydmxldE5hbWUsIHNlcnZsZXROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VXJsUGF0dGVybnMoKSB7Ci0JCWlmICh1cmxQYXR0ZXJucyA9PSBudWxsKSB7Ci0JCQl1cmxQYXR0ZXJucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChVcmxQYXR0ZXJuVHlwZS5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOUyk7Ci0JCX0KLQkJcmV0dXJuIHVybFBhdHRlcm5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VXJsUGF0dGVybnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUX05BTUU6Ci0JCQkJcmV0dXJuIGdldFNlcnZsZXROYW1lKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTlM6Ci0JCQkJcmV0dXJuIGdldFVybFBhdHRlcm5zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVF9OQU1FOgotCQkJCXNldFNlcnZsZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOUzoKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQkJZ2V0VXJsUGF0dGVybnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUX05BTUU6Ci0JCQkJc2V0U2VydmxldE5hbWUoU0VSVkxFVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTlM6Ci0JCQkJZ2V0VXJsUGF0dGVybnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVRfTkFNRToKLQkJCQlyZXR1cm4gU0VSVkxFVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZXJ2bGV0TmFtZSAhPSBudWxsIDogIVNFUlZMRVRfTkFNRV9FREVGQVVMVC5lcXVhbHMoc2VydmxldE5hbWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk5TOgotCQkJCXJldHVybiB1cmxQYXR0ZXJucyAhPSBudWxsICYmICF1cmxQYXR0ZXJucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZsZXROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlcnZsZXROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlcnZsZXRNYXBwaW5nSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2Vzc2lvbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2Vzc2lvbkNvbmZpZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiZWQ4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25Db25maWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXNzaW9uIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQ29uZmlnSW1wbCNnZXRTZXNzaW9uVGltZW91dCA8ZW0+U2Vzc2lvbiBUaW1lb3V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25Db25maWdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25Db25maWdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXNzaW9uQ29uZmlnIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vzc2lvblRpbWVvdXQoKSA8ZW0+U2Vzc2lvbiBUaW1lb3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXNzaW9uVGltZW91dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFNFU1NJT05fVElNRU9VVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXNzaW9uVGltZW91dCgpIDxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlc3Npb25UaW1lb3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzZXNzaW9uVGltZW91dCA9IFNFU1NJT05fVElNRU9VVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlc3Npb25Db25maWdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5TRVNTSU9OX0NPTkZJRzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRTZXNzaW9uVGltZW91dCgpIHsKLQkJcmV0dXJuIHNlc3Npb25UaW1lb3V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlc3Npb25UaW1lb3V0KEJpZ0ludGVnZXIgbmV3U2Vzc2lvblRpbWVvdXQpIHsKLQkJQmlnSW50ZWdlciBvbGRTZXNzaW9uVGltZW91dCA9IHNlc3Npb25UaW1lb3V0OwotCQlzZXNzaW9uVGltZW91dCA9IG5ld1Nlc3Npb25UaW1lb3V0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQsIG9sZFNlc3Npb25UaW1lb3V0LCBzZXNzaW9uVGltZW91dCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVDoKLQkJCQlyZXR1cm4gZ2V0U2Vzc2lvblRpbWVvdXQoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgotCQkJCWlmKG5ld1ZhbHVlLmdldENsYXNzKCkgPT0gSW50ZWdlci5jbGFzcykgewotCQkJICAgICAgICBJbnRlZ2VyIGkgPSAoSW50ZWdlcikgbmV3VmFsdWU7Ci0JCQkJICAgIHNldFNlc3Npb25UaW1lb3V0KEJpZ0ludGVnZXIudmFsdWVPZihpKSk7Ci0JCQkJfSBlbHNlIGlmIChuZXdWYWx1ZS5nZXRDbGFzcygpID09IEJpZ0ludGVnZXIuY2xhc3MpCi0JCQkJCXNldFNlc3Npb25UaW1lb3V0KCAoQmlnSW50ZWdlcikgbmV3VmFsdWUpOwotCQkJCWVsc2UgewotCQkJCQkvLyBkbyBub3RoaW5nIGlmIHZhbHVlIGlzIG5vdCBJbnRlZ2VyIG9yIEJpZ0ludGVnZXIuCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgotCQkJCXNldFNlc3Npb25UaW1lb3V0KFNFU1NJT05fVElNRU9VVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVDoKLQkJCQlyZXR1cm4gU0VTU0lPTl9USU1FT1VUX0VERUZBVUxUID09IG51bGwgPyBzZXNzaW9uVGltZW91dCAhPSBudWxsIDogIVNFU1NJT05fVElNRU9VVF9FREVGQVVMVC5lcXVhbHMoc2Vzc2lvblRpbWVvdXQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlc3Npb25UaW1lb3V0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlc3Npb25UaW1lb3V0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Nlc3Npb25Db25maWdJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1VzZXJEYXRhQ29uc3RyYWludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3MWFkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1VzZXJEYXRhQ29uc3RyYWludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Vc2VyIERhdGEgQ29uc3RyYWludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlVzZXJEYXRhQ29uc3RyYWludEltcGwjZ2V0VHJhbnNwb3J0R3VhcmFudGVlIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlVzZXJEYXRhQ29uc3RyYWludEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVXNlckRhdGFDb25zdHJhaW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVXNlckRhdGFDb25zdHJhaW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQgPSBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLk5PTkVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIHRyYW5zcG9ydEd1YXJhbnRlZSA9IFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFRyYW5zcG9ydCBHdWFyYW50ZWUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRyYW5zcG9ydEd1YXJhbnRlZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVzZXJEYXRhQ29uc3RyYWludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLlVTRVJfREFUQV9DT05TVFJBSU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKSB7Ci0JCXJldHVybiB0cmFuc3BvcnRHdWFyYW50ZWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNwb3J0R3VhcmFudGVlKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgbmV3VHJhbnNwb3J0R3VhcmFudGVlKSB7Ci0JCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgb2xkVHJhbnNwb3J0R3VhcmFudGVlID0gdHJhbnNwb3J0R3VhcmFudGVlOwotCQl0cmFuc3BvcnRHdWFyYW50ZWUgPSBuZXdUcmFuc3BvcnRHdWFyYW50ZWUgPT0gbnVsbCA/IFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQgOiBuZXdUcmFuc3BvcnRHdWFyYW50ZWU7Ci0JCWJvb2xlYW4gb2xkVHJhbnNwb3J0R3VhcmFudGVlRVNldCA9IHRyYW5zcG9ydEd1YXJhbnRlZUVTZXQ7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFLCBvbGRUcmFuc3BvcnRHdWFyYW50ZWUsIHRyYW5zcG9ydEd1YXJhbnRlZSwgIW9sZFRyYW5zcG9ydEd1YXJhbnRlZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zcG9ydEd1YXJhbnRlZSgpIHsKLQkJVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBvbGRUcmFuc3BvcnRHdWFyYW50ZWUgPSB0cmFuc3BvcnRHdWFyYW50ZWU7Ci0JCWJvb2xlYW4gb2xkVHJhbnNwb3J0R3VhcmFudGVlRVNldCA9IHRyYW5zcG9ydEd1YXJhbnRlZUVTZXQ7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZSA9IFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQ7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFLCBvbGRUcmFuc3BvcnRHdWFyYW50ZWUsIFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQsIG9sZFRyYW5zcG9ydEd1YXJhbnRlZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFRyYW5zcG9ydEd1YXJhbnRlZSgpIHsKLQkJcmV0dXJuIHRyYW5zcG9ydEd1YXJhbnRlZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFOgotCQkJCXJldHVybiBnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUU6Ci0JCQkJc2V0VHJhbnNwb3J0R3VhcmFudGVlKChUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRToKLQkJCQl1bnNldFRyYW5zcG9ydEd1YXJhbnRlZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFOgotCQkJCXJldHVybiBpc1NldFRyYW5zcG9ydEd1YXJhbnRlZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRyYW5zcG9ydEd1YXJhbnRlZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRyYW5zcG9ydEd1YXJhbnRlZUVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNwb3J0R3VhcmFudGVlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1VzZXJEYXRhQ29uc3RyYWludEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2YmRjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVFTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0V2ViQXBwIDxlbT5XZWIgQXBwPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWl4ZWQoKSA8ZW0+TWl4ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWl4ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIG1peGVkID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4TUxOU1ByZWZpeE1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeFNJU2NoZW1hTG9jYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0TWl4ZWQoKSB7Ci0JCWlmIChtaXhlZCA9PSBudWxsKSB7Ci0JCQltaXhlZCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQpOwotCQl9Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFhNTE5TUHJlZml4TWFwKCkgewotCQlpZiAoeE1MTlNQcmVmaXhNYXAgPT0gbnVsbCkgewotCQkJeE1MTlNQcmVmaXhNYXAgPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCX0KLQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwLm1hcCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCWlmICh4U0lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQl4U0lTY2hlbWFMb2NhdGlvbiA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKLQkJfQotCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24ubWFwKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCXJldHVybiAoV2ViQXBwKWdldE1peGVkKCkuZ2V0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9BUFAsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuYmFzaWNBZGQoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUCwgbmV3V2ViQXBwLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCkgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9BUFAsIG5ld1dlYkFwcCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1peGVkKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQOgotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRNaXhlZCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpOwotCQkJCWVsc2UgcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKLQkJCQlnZXRNaXhlZCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJcmV0dXJuIG1peGVkICE9IG51bGwgJiYgIW1peGVkLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAgIT0gbnVsbCAmJiAheE1MTlNQcmVmaXhNYXAuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmICF4U0lTY2hlbWFMb2NhdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtaXhlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViQXBwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTliMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldERpc3RyaWJ1dGFibGVzIDxlbT5EaXN0cmlidXRhYmxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldENvbnRleHRQYXJhbXMgPGVtPkNvbnRleHQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0RmlsdGVycyA8ZW0+RmlsdGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldEZpbHRlck1hcHBpbmdzIDxlbT5GaWx0ZXIgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRMaXN0ZW5lcnMgPGVtPkxpc3RlbmVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFNlcnZsZXRzIDxlbT5TZXJ2bGV0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFNlcnZsZXRNYXBwaW5ncyA8ZW0+U2VydmxldCBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFNlc3Npb25Db25maWdzIDxlbT5TZXNzaW9uIENvbmZpZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRNaW1lTWFwcGluZ3MgPGVtPk1pbWUgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRXZWxjb21lRmlsZUxpc3RzIDxlbT5XZWxjb21lIEZpbGUgTGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRFcnJvclBhZ2VzIDxlbT5FcnJvciBQYWdlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldEpzcENvbmZpZ3MgPGVtPkpzcCBDb25maWdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0U2VjdXJpdHlDb25zdHJhaW50cyA8ZW0+U2VjdXJpdHkgQ29uc3RyYWludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRMb2dpbkNvbmZpZ3MgPGVtPkxvZ2luIENvbmZpZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHBJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWJBcHAgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01ldGFkYXRhQ29tcGxldGUoKSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01ldGFkYXRhQ29tcGxldGUoKSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSA9IE1FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNZXRhZGF0YSBDb21wbGV0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgV2ViQXBwVmVyc2lvblR5cGUgVkVSU0lPTl9FREVGQVVMVCA9IFdlYkFwcFZlcnNpb25UeXBlLl8yNV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViQXBwVmVyc2lvblR5cGUgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZlcnNpb24gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViQXBwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBXZWJQYWNrYWdlLldFQl9BUFBfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19ERVNDUklQVElPTlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fRElTUExBWV9OQU1FUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0lDT05TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXN0cmlidXRhYmxlcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fRElTVFJJQlVUQUJMRVMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbnRleHRQYXJhbXMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19GSUxURVJTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJNYXBwaW5ncygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0xJU1RFTkVSUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmxldHMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFUlZMRVRTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2bGV0TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlc3Npb25Db25maWdzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19TRVNTSU9OX0NPTkZJR1MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1pbWVNYXBwaW5ncygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2VsY29tZUZpbGVMaXN0cygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fV0VMQ09NRV9GSUxFX0xJU1RTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFcnJvclBhZ2VzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19FUlJPUl9QQUdFUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0SnNwQ29uZmlncygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fSlNQX0NPTkZJR1MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlY3VyaXR5Q29uc3RyYWludHMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMb2dpbkNvbmZpZ3MoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0xPR0lOX0NPTkZJR1MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlY3VyaXR5Um9sZXMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFbnZFbnRyaWVzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19FTlZfRU5UUklFUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RWpiUmVmcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fRUpCX1JFRlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYkxvY2FsUmVmcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZpY2VSZWZzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19TRVJWSUNFX1JFRlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlUmVmcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UG9zdENvbnN0cnVjdHMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1BPU1RfQ09OU1RSVUNUUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJlRGVzdHJveXMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1BSRV9ERVNUUk9ZUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5XRUJfQVBQX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gbWV0YWRhdGFDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4gbmV3TWV0YWRhdGFDb21wbGV0ZSkgewotCQlib29sZWFuIG9sZE1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCQltZXRhZGF0YUNvbXBsZXRlID0gbmV3TWV0YWRhdGFDb21wbGV0ZTsKLQkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCA9IG1ldGFkYXRhQ29tcGxldGVFU2V0OwotCQltZXRhZGF0YUNvbXBsZXRlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVUQURBVEFfQ09NUExFVEUsIG9sZE1ldGFkYXRhQ29tcGxldGUsIG1ldGFkYXRhQ29tcGxldGUsICFvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCA9IG1ldGFkYXRhQ29tcGxldGVFU2V0OwotCQltZXRhZGF0YUNvbXBsZXRlID0gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQ7Ci0JCW1ldGFkYXRhQ29tcGxldGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgV2ViUGFja2FnZS5XRUJfQVBQX19NRVRBREFUQV9DT01QTEVURSwgb2xkTWV0YWRhdGFDb21wbGV0ZSwgTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQsIG9sZE1ldGFkYXRhQ29tcGxldGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gbWV0YWRhdGFDb21wbGV0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYkFwcFZlcnNpb25UeXBlIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oV2ViQXBwVmVyc2lvblR5cGUgbmV3VmVyc2lvbikgewotCQlXZWJBcHBWZXJzaW9uVHlwZSBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb24gPT0gbnVsbCA/IFZFUlNJT05fRURFRkFVTFQgOiBuZXdWZXJzaW9uOwotCQlib29sZWFuIG9sZFZlcnNpb25FU2V0ID0gdmVyc2lvbkVTZXQ7Ci0JCXZlcnNpb25FU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5XRUJfQVBQX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uLCAhb2xkVmVyc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZlcnNpb24oKSB7Ci0JCVdlYkFwcFZlcnNpb25UeXBlIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQlib29sZWFuIG9sZFZlcnNpb25FU2V0ID0gdmVyc2lvbkVTZXQ7Ci0JCXZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCQl2ZXJzaW9uRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFdlYlBhY2thZ2UuV0VCX0FQUF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgVkVSU0lPTl9FREVGQVVMVCwgb2xkVmVyc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ESVNUUklCVVRBQkxFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3RyaWJ1dGFibGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19DT05URVhUX1BBUkFNUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRleHRQYXJhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0ZJTFRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWx0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWx0ZXJNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTElTVEVORVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TGlzdGVuZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZsZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmxldE1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVNTSU9OX0NPTkZJR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXNzaW9uQ29uZmlncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1pbWVNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fV0VMQ09NRV9GSUxFX0xJU1RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V2VsY29tZUZpbGVMaXN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFcnJvclBhZ2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEpzcENvbmZpZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExvZ2luQ29uZmlncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVudkVudHJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VKQl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJMb2NhbFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZpY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9zdENvbnN0cnVjdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fR1JPVVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEVTOgotCQkJCXJldHVybiBnZXREaXN0cmlidXRhYmxlcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRDb250ZXh0UGFyYW1zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUzoKLQkJCQlyZXR1cm4gZ2V0RmlsdGVycygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyTWFwcGluZ3MoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGdldExpc3RlbmVycygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTOgotCQkJCXJldHVybiBnZXRTZXJ2bGV0cygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldFNlcnZsZXRNYXBwaW5ncygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHUzoKLQkJCQlyZXR1cm4gZ2V0U2Vzc2lvbkNvbmZpZ3MoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRNaW1lTWFwcGluZ3MoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19XRUxDT01FX0ZJTEVfTElTVFM6Ci0JCQkJcmV0dXJuIGdldFdlbGNvbWVGaWxlTGlzdHMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUzoKLQkJCQlyZXR1cm4gZ2V0RXJyb3JQYWdlcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUdTOgotCQkJCXJldHVybiBnZXRKc3BDb25maWdzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Q29uc3RyYWludHMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUdTOgotCQkJCXJldHVybiBnZXRMb2dpbkNvbmZpZ3MoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiBnZXRFbnZFbnRyaWVzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYlJlZnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiTG9jYWxSZWZzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlUmVmcygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuIGdldFBvc3RDb25zdHJ1Y3RzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiBnZXRQcmVEZXN0cm95cygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1NfTElTVFM6Ci0JCQkJcmV0dXJuIGdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGlzTWV0YWRhdGFDb21wbGV0ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEVTOgotCQkJCWdldERpc3RyaWJ1dGFibGVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXN0cmlidXRhYmxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCWdldENvbnRleHRQYXJhbXMoKS5jbGVhcigpOwotCQkJCWdldENvbnRleHRQYXJhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19GSUxURVJTOgotCQkJCWdldEZpbHRlcnMoKS5jbGVhcigpOwotCQkJCWdldEZpbHRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1M6Ci0JCQkJZ2V0RmlsdGVyTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldEZpbHRlck1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTElTVEVORVJTOgotCQkJCWdldExpc3RlbmVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0TGlzdGVuZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6Ci0JCQkJZ2V0U2VydmxldHMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZsZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUzoKLQkJCQlnZXRTZXJ2bGV0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldFNlcnZsZXRNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHUzoKLQkJCQlnZXRTZXNzaW9uQ29uZmlncygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2Vzc2lvbkNvbmZpZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTOgotCQkJCWdldE1pbWVNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWltZU1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fV0VMQ09NRV9GSUxFX0xJU1RTOgotCQkJCWdldFdlbGNvbWVGaWxlTGlzdHMoKS5jbGVhcigpOwotCQkJCWdldFdlbGNvbWVGaWxlTGlzdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUzoKLQkJCQlnZXRFcnJvclBhZ2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRFcnJvclBhZ2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJR1M6Ci0JCQkJZ2V0SnNwQ29uZmlncygpLmNsZWFyKCk7Ci0JCQkJZ2V0SnNwQ29uZmlncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTOgotCQkJCWdldFNlY3VyaXR5Q29uc3RyYWludHMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Q29uc3RyYWludHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUdTOgotCQkJCWdldExvZ2luQ29uZmlncygpLmNsZWFyKCk7Ci0JCQkJZ2V0TG9naW5Db25maWdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VOVl9FTlRSSUVTOgotCQkJCWdldEVudkVudHJpZXMoKS5jbGVhcigpOwotCQkJCWdldEVudkVudHJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FSkJfUkVGUzoKLQkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BSRV9ERVNUUk9ZUzoKLQkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1NfTElTVFM6Ci0JCQkJZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKS5jbGVhcigpOwotCQkJCWdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXNldE1ldGFkYXRhQ29tcGxldGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoV2ViQXBwVmVyc2lvblR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEVTOgotCQkJCWdldERpc3RyaWJ1dGFibGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVM6Ci0JCQkJZ2V0Q29udGV4dFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0ZJTFRFUlM6Ci0JCQkJZ2V0RmlsdGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUzoKLQkJCQlnZXRGaWx0ZXJNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0xJU1RFTkVSUzoKLQkJCQlnZXRMaXN0ZW5lcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUzoKLQkJCQlnZXRTZXJ2bGV0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJZ2V0U2VydmxldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUdTOgotCQkJCWdldFNlc3Npb25Db25maWdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUzoKLQkJCQlnZXRNaW1lTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19XRUxDT01FX0ZJTEVfTElTVFM6Ci0JCQkJZ2V0V2VsY29tZUZpbGVMaXN0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTOgotCQkJCWdldEVycm9yUGFnZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHUzoKLQkJCQlnZXRKc3BDb25maWdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfQ09OU1RSQUlOVFM6Ci0JCQkJZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJR1M6Ci0JCQkJZ2V0TG9naW5Db25maWdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VOVl9FTlRSSUVTOgotCQkJCWdldEVudkVudHJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FSkJfUkVGUzoKLQkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QUkVfREVTVFJPWVM6Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1NfTElTVFM6Ci0JCQkJZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXVuc2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19WRVJTSU9OOgotCQkJCXVuc2V0VmVyc2lvbigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAhZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICFnZXREaXNwbGF5TmFtZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSUNPTlM6Ci0JCQkJcmV0dXJuICFnZXRJY29ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ESVNUUklCVVRBQkxFUzoKLQkJCQlyZXR1cm4gIWdldERpc3RyaWJ1dGFibGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCXJldHVybiAhZ2V0Q29udGV4dFBhcmFtcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19GSUxURVJTOgotCQkJCXJldHVybiAhZ2V0RmlsdGVycygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICFnZXRGaWx0ZXJNYXBwaW5ncygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuICFnZXRMaXN0ZW5lcnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6Ci0JCQkJcmV0dXJuICFnZXRTZXJ2bGV0cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTOgotCQkJCXJldHVybiAhZ2V0U2VydmxldE1hcHBpbmdzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHUzoKLQkJCQlyZXR1cm4gIWdldFNlc3Npb25Db25maWdzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICFnZXRNaW1lTWFwcGluZ3MoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fV0VMQ09NRV9GSUxFX0xJU1RTOgotCQkJCXJldHVybiAhZ2V0V2VsY29tZUZpbGVMaXN0cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUzoKLQkJCQlyZXR1cm4gIWdldEVycm9yUGFnZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJR1M6Ci0JCQkJcmV0dXJuICFnZXRKc3BDb25maWdzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiAhZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUdTOgotCQkJCXJldHVybiAhZ2V0TG9naW5Db25maWdzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiAhZ2V0U2VjdXJpdHlSb2xlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gIWdldEVudkVudHJpZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuICFnZXRFamJSZWZzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VKQl9MT0NBTF9SRUZTOgotCQkJCXJldHVybiAhZ2V0RWpiTG9jYWxSZWZzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gIWdldFNlcnZpY2VSZWZzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuICFnZXRSZXNvdXJjZVJlZnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuICFnZXRSZXNvdXJjZUVudlJlZnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiAhZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuICFnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlyZXR1cm4gIWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiAhZ2V0UG9zdENvbnN0cnVjdHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiAhZ2V0UHJlRGVzdHJveXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuICFnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTOgotCQkJCXJldHVybiAhZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGlzU2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGlzU2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXRhZGF0YUNvbXBsZXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWV0YWRhdGFDb21wbGV0ZUVTZXQpIHJlc3VsdC5hcHBlbmQobWV0YWRhdGFDb21wbGV0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZlcnNpb25FU2V0KSByZXN1bHQuYXBwZW5kKHZlcnNpb24pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9XZWJBcHBJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmEzMmNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkRpYWdub3N0aWNpYW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBXZWJGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlXZWJGYWN0b3J5IHRoZVdlYkZhY3RvcnkgPSAoV2ViRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYiIpOyAvLyROT04tTkxTLTEkIAotCQkJaWYgKHRoZVdlYkZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVXZWJGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IFdlYkZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVBdXRoQ29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVFcnJvclBhZ2UoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVGaWx0ZXIoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUZpbHRlck1hcHBpbmcoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJRzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUZvcm1Mb2dpbkNvbmZpZygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUc6IHJldHVybiAoRU9iamVjdCljcmVhdGVMb2dpbkNvbmZpZygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1pbWVNYXBwaW5nKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVTZXJ2bGV0KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU2VydmxldE1hcHBpbmcoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJRzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlc3Npb25Db25maWcoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFA6IHJldHVybiAoRU9iamVjdCljcmVhdGVXZWJBcHAoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdlbGNvbWVGaWxlTGlzdCgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRElTUEFUQ0hFUl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEaXNwYXRjaGVyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLk5VTExfQ0hBUl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVOdWxsQ2hhclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX1ZFUlNJT05fVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlV2ViQXBwVmVyc2lvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVBdXRoTWV0aG9kVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkRJU1BBVENIRVJfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc3BhdGNoZXJUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRU5DT0RJTkdfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRW5jb2RpbmdUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfQ09ERV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFcnJvckNvZGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRmlsdGVyTmFtZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVIdHRwTWV0aG9kVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQURfT05fU1RBUlRVUF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVMb2FkT25TdGFydHVwVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVMb2NhbGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1pbWVUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLk5PTl9FTVBUWV9TVFJJTkdfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTm9uRW1wdHlTdHJpbmdUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTlVMTF9DSEFSX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVOdWxsQ2hhclR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmxldE5hbWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlVHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldBUl9QQVRIX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdhclBhdGhUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9WRVJTSU9OX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVXZWJBcHBWZXJzaW9uVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRElTUEFUQ0hFUl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGlzcGF0Y2hlclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLk5VTExfQ0hBUl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TnVsbENoYXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX1ZFUlNJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFdlYkFwcFZlcnNpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0QXV0aE1ldGhvZFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkRJU1BBVENIRVJfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnREaXNwYXRjaGVyVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRU5DT0RJTkdfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVuY29kaW5nVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfQ09ERV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RXJyb3JDb2RlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEZpbHRlck5hbWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0SHR0cE1ldGhvZFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQURfT05fU1RBUlRVUF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TG9hZE9uU3RhcnR1cFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TG9jYWxlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNaW1lVHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLk5PTl9FTVBUWV9TVFJJTkdfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE5vbkVtcHR5U3RyaW5nVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTlVMTF9DSEFSX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0TnVsbENoYXJUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFNlcnZsZXROYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldBUl9QQVRIX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXYXJQYXRoVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9WRVJTSU9OX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0V2ViQXBwVmVyc2lvblR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBdXRoQ29uc3RyYWludCBjcmVhdGVBdXRoQ29uc3RyYWludCgpIHsKLQkJQXV0aENvbnN0cmFpbnRJbXBsIGF1dGhDb25zdHJhaW50ID0gbmV3IEF1dGhDb25zdHJhaW50SW1wbCgpOwotCQlyZXR1cm4gYXV0aENvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVycm9yUGFnZSBjcmVhdGVFcnJvclBhZ2UoKSB7Ci0JCUVycm9yUGFnZUltcGwgZXJyb3JQYWdlID0gbmV3IEVycm9yUGFnZUltcGwoKTsKLQkJcmV0dXJuIGVycm9yUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmlsdGVyIGNyZWF0ZUZpbHRlcigpIHsKLQkJRmlsdGVySW1wbCBmaWx0ZXIgPSBuZXcgRmlsdGVySW1wbCgpOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGaWx0ZXJNYXBwaW5nIGNyZWF0ZUZpbHRlck1hcHBpbmcoKSB7Ci0JCUZpbHRlck1hcHBpbmdJbXBsIGZpbHRlck1hcHBpbmcgPSBuZXcgRmlsdGVyTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIGZpbHRlck1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZvcm1Mb2dpbkNvbmZpZyBjcmVhdGVGb3JtTG9naW5Db25maWcoKSB7Ci0JCUZvcm1Mb2dpbkNvbmZpZ0ltcGwgZm9ybUxvZ2luQ29uZmlnID0gbmV3IEZvcm1Mb2dpbkNvbmZpZ0ltcGwoKTsKLQkJcmV0dXJuIGZvcm1Mb2dpbkNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTG9jYWxlRW5jb2RpbmdNYXBwaW5nIGNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZygpIHsKLQkJTG9jYWxlRW5jb2RpbmdNYXBwaW5nSW1wbCBsb2NhbGVFbmNvZGluZ01hcHBpbmcgPSBuZXcgTG9jYWxlRW5jb2RpbmdNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gbG9jYWxlRW5jb2RpbmdNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IGNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKSB7Ci0JCUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsIGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QgPSBuZXcgTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwoKTsKLQkJcmV0dXJuIGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExvZ2luQ29uZmlnIGNyZWF0ZUxvZ2luQ29uZmlnKCkgewotCQlMb2dpbkNvbmZpZ0ltcGwgbG9naW5Db25maWcgPSBuZXcgTG9naW5Db25maWdJbXBsKCk7Ci0JCXJldHVybiBsb2dpbkNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWltZU1hcHBpbmcgY3JlYXRlTWltZU1hcHBpbmcoKSB7Ci0JCU1pbWVNYXBwaW5nSW1wbCBtaW1lTWFwcGluZyA9IG5ldyBNaW1lTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIG1pbWVNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnQgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCkgewotCQlTZWN1cml0eUNvbnN0cmFpbnRJbXBsIHNlY3VyaXR5Q29uc3RyYWludCA9IG5ldyBTZWN1cml0eUNvbnN0cmFpbnRJbXBsKCk7Ci0JCXJldHVybiBzZWN1cml0eUNvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZsZXQgY3JlYXRlU2VydmxldCgpIHsKLQkJU2VydmxldEltcGwgc2VydmxldCA9IG5ldyBTZXJ2bGV0SW1wbCgpOwotCQlyZXR1cm4gc2VydmxldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmxldE1hcHBpbmcgY3JlYXRlU2VydmxldE1hcHBpbmcoKSB7Ci0JCVNlcnZsZXRNYXBwaW5nSW1wbCBzZXJ2bGV0TWFwcGluZyA9IG5ldyBTZXJ2bGV0TWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIHNlcnZsZXRNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXNzaW9uQ29uZmlnIGNyZWF0ZVNlc3Npb25Db25maWcoKSB7Ci0JCVNlc3Npb25Db25maWdJbXBsIHNlc3Npb25Db25maWcgPSBuZXcgU2Vzc2lvbkNvbmZpZ0ltcGwoKTsKLQkJcmV0dXJuIHNlc3Npb25Db25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVzZXJEYXRhQ29uc3RyYWludCBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnQoKSB7Ci0JCVVzZXJEYXRhQ29uc3RyYWludEltcGwgdXNlckRhdGFDb25zdHJhaW50ID0gbmV3IFVzZXJEYXRhQ29uc3RyYWludEltcGwoKTsKLQkJcmV0dXJuIHVzZXJEYXRhQ29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGNyZWF0ZVdlYkFwcCgpIHsKLQkJV2ViQXBwSW1wbCB3ZWJBcHAgPSBuZXcgV2ViQXBwSW1wbCgpOwotCQlyZXR1cm4gd2ViQXBwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciBjcmVhdGVXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsIHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yID0gbmV3IFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYlJlc291cmNlQ29sbGVjdGlvbiBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSB7Ci0JCVdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwgd2ViUmVzb3VyY2VDb2xsZWN0aW9uID0gbmV3IFdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwoKTsKLQkJcmV0dXJuIHdlYlJlc291cmNlQ29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2VsY29tZUZpbGVMaXN0IGNyZWF0ZVdlbGNvbWVGaWxlTGlzdCgpIHsKLQkJV2VsY29tZUZpbGVMaXN0SW1wbCB3ZWxjb21lRmlsZUxpc3QgPSBuZXcgV2VsY29tZUZpbGVMaXN0SW1wbCgpOwotCQlyZXR1cm4gd2VsY29tZUZpbGVMaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNwYXRjaGVyVHlwZSBjcmVhdGVEaXNwYXRjaGVyVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlEaXNwYXRjaGVyVHlwZSByZXN1bHQgPSBEaXNwYXRjaGVyVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RGlzcGF0Y2hlclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTnVsbENoYXJUeXBlIGNyZWF0ZU51bGxDaGFyVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlOdWxsQ2hhclR5cGUgcmVzdWx0ID0gTnVsbENoYXJUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROdWxsQ2hhclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBjcmVhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgcmVzdWx0ID0gVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHJhbnNwb3J0R3VhcmFudGVlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJBcHBWZXJzaW9uVHlwZSBjcmVhdGVXZWJBcHBWZXJzaW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlXZWJBcHBWZXJzaW9uVHlwZSByZXN1bHQgPSBXZWJBcHBWZXJzaW9uVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V2ViQXBwVmVyc2lvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUF1dGhNZXRob2RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEF1dGhNZXRob2RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNwYXRjaGVyVHlwZSBjcmVhdGVEaXNwYXRjaGVyVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKERpc3BhdGNoZXJUeXBlKWNyZWF0ZURpc3BhdGNoZXJUeXBlRnJvbVN0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLkRJU1BBVENIRVJfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREaXNwYXRjaGVyVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0RGlzcGF0Y2hlclR5cGVUb1N0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLkRJU1BBVENIRVJfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVFbmNvZGluZ1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuU1RSSU5HLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVuY29kaW5nVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlNUUklORywgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRXJyb3JDb2RlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuUE9TSVRJVkVfSU5URUdFUiwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFcnJvckNvZGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuUE9TSVRJVkVfSU5URUdFUiwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVGaWx0ZXJOYW1lVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZyljcmVhdGVOb25FbXB0eVN0cmluZ1R5cGVGcm9tU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTk9OX0VNUFRZX1NUUklOR19UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEZpbHRlck5hbWVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnROb25FbXB0eVN0cmluZ1R5cGVUb1N0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLk5PTl9FTVBUWV9TVFJJTkdfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIdHRwTWV0aG9kVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIdHRwTWV0aG9kVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUxvYWRPblN0YXJ0dXBUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCWlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSAoT2JqZWN0KWNyZWF0ZU51bGxDaGFyVHlwZUZyb21TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5OVUxMX0NIQVJfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVEYXRhVHlwZSwgcmVzdWx0LCBudWxsLCBudWxsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uID0gZTsKLQkJfQotCQl0cnkgewotCQkJcmVzdWx0ID0gKE9iamVjdClYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5JTlRFR0VSLCBpbml0aWFsVmFsdWUpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIERpYWdub3N0aWNpYW4uSU5TVEFOQ0UudmFsaWRhdGUoZURhdGFUeXBlLCByZXN1bHQsIG51bGwsIG51bGwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb24gPSBlOwotCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCB8fCBleGNlcHRpb24gPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKLSAgICAKLQkJdGhyb3cgZXhjZXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TG9hZE9uU3RhcnR1cFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlpZiAoaW5zdGFuY2VWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJaWYgKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTlVMTF9DSEFSX1RZUEUuaXNJbnN0YW5jZShpbnN0YW5jZVZhbHVlKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdmFsdWUgPSBjb252ZXJ0TnVsbENoYXJUeXBlVG9TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5OVUxMX0NIQVJfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHJldHVybiB2YWx1ZTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCWlmIChYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5JTlRFR0VSLmlzSW5zdGFuY2UoaW5zdGFuY2VWYWx1ZSkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5JTlRFR0VSLCBpbnN0YW5jZVZhbHVlKTsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgcmV0dXJuIHZhbHVlOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIHZhbHVlID0gaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgcmV0dXJuIHZhbHVlOwotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlOiAnIitpbnN0YW5jZVZhbHVlKyInIGZvciBkYXRhdHlwZSA6IitlRGF0YVR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUxvY2FsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuU1RSSU5HLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExvY2FsZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5TVFJJTkcsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTWltZVR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE1pbWVUeXBlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU5vbkVtcHR5U3RyaW5nVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROb25FbXB0eVN0cmluZ1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE51bGxDaGFyVHlwZSBjcmVhdGVOdWxsQ2hhclR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChOdWxsQ2hhclR5cGUpY3JlYXRlTnVsbENoYXJUeXBlRnJvbVN0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLk5VTExfQ0hBUl9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE51bGxDaGFyVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0TnVsbENoYXJUeXBlVG9TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5OVUxMX0NIQVJfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTZXJ2bGV0TmFtZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpY3JlYXRlTm9uRW1wdHlTdHJpbmdUeXBlRnJvbVN0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLk5PTl9FTVBUWV9TVFJJTkdfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTZXJ2bGV0TmFtZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydE5vbkVtcHR5U3RyaW5nVHlwZVRvU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTk9OX0VNUFRZX1NUUklOR19UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBjcmVhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSljcmVhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlRnJvbVN0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLlRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlVG9TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlV2FyUGF0aFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuVE9LRU4sIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V2FyUGF0aFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYkFwcFZlcnNpb25UeXBlIGNyZWF0ZVdlYkFwcFZlcnNpb25UeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoV2ViQXBwVmVyc2lvblR5cGUpY3JlYXRlV2ViQXBwVmVyc2lvblR5cGVGcm9tU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9WRVJTSU9OX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V2ViQXBwVmVyc2lvblR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFdlYkFwcFZlcnNpb25UeXBlVG9TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX1ZFUlNJT05fVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYlBhY2thZ2UgZ2V0V2ViUGFja2FnZSgpIHsKLQkJcmV0dXJuIChXZWJQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYlBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL1dlYkZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYlBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDJiY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwubmFtZXNwYWNlLlhNTE5hbWVzcGFjZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5OdWxsQ2hhclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWwuV2ViVmFsaWRhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgV2ViUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXV0aENvbnN0cmFpbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXJyb3JQYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZpbHRlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmaWx0ZXJNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb2NhbGVFbmNvZGluZ01hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb2dpbkNvbmZpZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtaW1lTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VydmxldEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZXJ2bGV0TWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZXNzaW9uQ29uZmlnRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWJBcHBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlbGNvbWVGaWxlTGlzdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGRpc3BhdGNoZXJUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBudWxsQ2hhclR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHdlYkFwcFZlcnNpb25UeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYXV0aE1ldGhvZFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGlzcGF0Y2hlclR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZW5jb2RpbmdUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGVycm9yQ29kZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZmlsdGVyTmFtZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHR0cE1ldGhvZFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbG9hZE9uU3RhcnR1cFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbG9jYWxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBtaW1lVHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbm9uRW1wdHlTdHJpbmdUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG51bGxDaGFyVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzZXJ2bGV0TmFtZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3YXJQYXRoVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3ZWJBcHBWZXJzaW9uVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXZWJQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgV2ViRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChXZWJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlXZWJQYWNrYWdlSW1wbCB0aGVXZWJQYWNrYWdlID0gKFdlYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFdlYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgV2ViUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxOYW1lc3BhY2VQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmF2YWVlUGFja2FnZUltcGwgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEphdmFlZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSA6IEphdmFlZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UgPSAoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVdlYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YWVlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlV2ViUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUphdmFlZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gUmVnaXN0ZXIgcGFja2FnZSB2YWxpZGF0b3IKLQkJRVZhbGlkYXRvci5SZWdpc3RyeS5JTlNUQU5DRS5wdXQKLQkJCSh0aGVXZWJQYWNrYWdlLCAKLQkJCSBuZXcgRVZhbGlkYXRvci5EZXNjcmlwdG9yKCkgewotCQkJCSBwdWJsaWMgRVZhbGlkYXRvciBnZXRFVmFsaWRhdG9yKCkgewotCQkJCQkgcmV0dXJuIFdlYlZhbGlkYXRvci5JTlNUQU5DRTsKLQkJCQkgfQotCQkJIH0pOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlV2ViUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlV2ViUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEF1dGhDb25zdHJhaW50KCkgewotCQlyZXR1cm4gYXV0aENvbnN0cmFpbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXV0aENvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdXRoQ29uc3RyYWludF9Sb2xlTmFtZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhdXRoQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dGhDb25zdHJhaW50X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0aENvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVycm9yUGFnZSgpIHsKLQkJcmV0dXJuIGVycm9yUGFnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFcnJvclBhZ2VfRXJyb3JDb2RlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXJyb3JQYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXJyb3JQYWdlX0V4Y2VwdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllcnJvclBhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFcnJvclBhZ2VfTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllcnJvclBhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFcnJvclBhZ2VfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllcnJvclBhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWx0ZXJfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsdGVyX0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbHRlcl9JY29ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbHRlcl9GaWx0ZXJOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsdGVyX0ZpbHRlckNsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWx0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWx0ZXJfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWx0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZpbHRlck1hcHBpbmcoKSB7Ci0JCXJldHVybiBmaWx0ZXJNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbHRlck1hcHBpbmdfRmlsdGVyTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbHRlck1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX0dyb3VwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsdGVyTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWx0ZXJNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsdGVyTWFwcGluZ19TZXJ2bGV0TmFtZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWx0ZXJNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVycygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbHRlck1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsdGVyTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Rm9ybUxvZ2luQ29uZmlnKCkgewotCQlyZXR1cm4gZm9ybUxvZ2luQ29uZmlnRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtTG9naW5QYWdlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZm9ybUxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1FcnJvclBhZ2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmb3JtTG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGb3JtTG9naW5Db25maWdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmb3JtTG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvY2FsZUVuY29kaW5nTWFwcGluZygpIHsKLQkJcmV0dXJuIGxvY2FsZUVuY29kaW5nTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9jYWxlRW5jb2RpbmdNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9jYWxlRW5jb2RpbmdNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9jYWxlRW5jb2RpbmdNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KCkgewotCQlyZXR1cm4gbG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9naW5Db25maWcoKSB7Ci0JCXJldHVybiBsb2dpbkNvbmZpZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2dpbkNvbmZpZ19SZWFsbU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExvZ2luQ29uZmlnX0Zvcm1Mb2dpbkNvbmZpZygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9naW5Db25maWdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWltZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBtaW1lTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNaW1lTWFwcGluZ19FeHRlbnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltaW1lTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1pbWVNYXBwaW5nX01pbWVUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWltZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNaW1lTWFwcGluZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1pbWVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN1cml0eUNvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X0F1dGhDb25zdHJhaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3VyaXR5Q29uc3RyYWludF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VydmxldCgpIHsKLQkJcmV0dXJuIHNlcnZsZXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9JY29ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRfU2VydmxldENsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRfSnNwRmlsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X0luaXRQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldF9Mb2FkT25TdGFydHVwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZsZXRfUnVuQXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9TZWN1cml0eVJvbGVSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VydmxldE1hcHBpbmcoKSB7Ci0JCXJldHVybiBzZXJ2bGV0TWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0TWFwcGluZ19TZXJ2bGV0TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZsZXRNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldE1hcHBpbmdfVXJsUGF0dGVybnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRNYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlc3Npb25Db25maWcoKSB7Ci0JCXJldHVybiBzZXNzaW9uQ29uZmlnRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXNzaW9uQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkNvbmZpZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFVzZXJEYXRhQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIHVzZXJEYXRhQ29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdXNlckRhdGFDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXVzZXJEYXRhQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFVzZXJEYXRhQ29uc3RyYWludF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXVzZXJEYXRhQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2ViQXBwKCkgewotCQlyZXR1cm4gd2ViQXBwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkFwcF9Hcm91cCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRGlzcGxheU5hbWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ljb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0Rpc3RyaWJ1dGFibGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0NvbnRleHRQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRmlsdGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmxldHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXNzaW9uQ29uZmlncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWltZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9XZWxjb21lRmlsZUxpc3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9FcnJvclBhZ2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Kc3BDb25maWdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZWN1cml0eUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Mb2dpbkNvbmZpZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0VudkVudHJpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0VqYlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0VqYkxvY2FsUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1Jlc291cmNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfUmVzb3VyY2VFbnZSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Qb3N0Q29uc3RydWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfUHJlRGVzdHJveXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkFwcF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJBcHBfTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJBcHBfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfV2ViQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fV2ViUmVzb3VyY2VOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2VsY29tZUZpbGVMaXN0KCkgewotCQlyZXR1cm4gd2VsY29tZUZpbGVMaXN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlbGNvbWVGaWxlTGlzdF9XZWxjb21lRmlsZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWxjb21lRmlsZUxpc3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWxjb21lRmlsZUxpc3RfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWxjb21lRmlsZUxpc3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RGlzcGF0Y2hlclR5cGUoKSB7Ci0JCXJldHVybiBkaXNwYXRjaGVyVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXROdWxsQ2hhclR5cGUoKSB7Ci0JCXJldHVybiBudWxsQ2hhclR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpIHsKLQkJcmV0dXJuIHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0V2ViQXBwVmVyc2lvblR5cGUoKSB7Ci0JCXJldHVybiB3ZWJBcHBWZXJzaW9uVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0QXV0aE1ldGhvZFR5cGUoKSB7Ci0JCXJldHVybiBhdXRoTWV0aG9kVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERpc3BhdGNoZXJUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gZGlzcGF0Y2hlclR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFbmNvZGluZ1R5cGUoKSB7Ci0JCXJldHVybiBlbmNvZGluZ1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFcnJvckNvZGVUeXBlKCkgewotCQlyZXR1cm4gZXJyb3JDb2RlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEZpbHRlck5hbWVUeXBlKCkgewotCQlyZXR1cm4gZmlsdGVyTmFtZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIdHRwTWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIGh0dHBNZXRob2RUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TG9hZE9uU3RhcnR1cFR5cGUoKSB7Ci0JCXJldHVybiBsb2FkT25TdGFydHVwVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExvY2FsZVR5cGUoKSB7Ci0JCXJldHVybiBsb2NhbGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TWltZVR5cGVUeXBlKCkgewotCQlyZXR1cm4gbWltZVR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Tm9uRW1wdHlTdHJpbmdUeXBlKCkgewotCQlyZXR1cm4gbm9uRW1wdHlTdHJpbmdUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TnVsbENoYXJUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbENoYXJUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U2VydmxldE5hbWVUeXBlKCkgewotCQlyZXR1cm4gc2VydmxldE5hbWVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXYXJQYXRoVHlwZSgpIHsKLQkJcmV0dXJuIHdhclBhdGhUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0V2ViQXBwVmVyc2lvblR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiB3ZWJBcHBWZXJzaW9uVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViRmFjdG9yeSBnZXRXZWJGYWN0b3J5KCkgewotCQlyZXR1cm4gKFdlYkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYXV0aENvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVVUSF9DT05TVFJBSU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdXRoQ29uc3RyYWludEVDbGFzcywgQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBVVRIX0NPTlNUUkFJTlRfX1JPTEVfTkFNRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBVVRIX0NPTlNUUkFJTlRfX0lEKTsKLQotCQllcnJvclBhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVJST1JfUEFHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXJyb3JQYWdlRUNsYXNzLCBFUlJPUl9QQUdFX19FUlJPUl9DT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlcnJvclBhZ2VFQ2xhc3MsIEVSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlcnJvclBhZ2VFQ2xhc3MsIEVSUk9SX1BBR0VfX0xPQ0FUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlcnJvclBhZ2VFQ2xhc3MsIEVSUk9SX1BBR0VfX0lEKTsKLQotCQlmaWx0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklMVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fRElTUExBWV9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsdGVyRUNsYXNzLCBGSUxURVJfX0lDT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fRklMVEVSX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbHRlckVDbGFzcywgRklMVEVSX19GSUxURVJfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpbHRlckVDbGFzcywgRklMVEVSX19JTklUX1BBUkFNUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsdGVyRUNsYXNzLCBGSUxURVJfX0lEKTsKLQotCQlmaWx0ZXJNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEZJTFRFUl9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGSUxURVJfTUFQUElOR19fRklMVEVSX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZJTFRFUl9NQVBQSU5HX19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsdGVyTWFwcGluZ0VDbGFzcywgRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsdGVyTWFwcGluZ0VDbGFzcywgRklMVEVSX01BUFBJTkdfX1NFUlZMRVRfTkFNRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsdGVyTWFwcGluZ0VDbGFzcywgRklMVEVSX01BUFBJTkdfX0lEKTsKLQotCQlmb3JtTG9naW5Db25maWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRk9STV9MT0dJTl9DT05GSUcpOwotCQljcmVhdGVFQXR0cmlidXRlKGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcywgRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZm9ybUxvZ2luQ29uZmlnRUNsYXNzLCBGT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmb3JtTG9naW5Db25maWdFQ2xhc3MsIEZPUk1fTE9HSU5fQ09ORklHX19JRCk7Ci0KLQkJbG9jYWxlRW5jb2RpbmdNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPQ0FMRV9FTkNPRElOR19NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb2NhbGVFbmNvZGluZ01hcHBpbmdFQ2xhc3MsIExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19MT0NBTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvY2FsZUVuY29kaW5nTWFwcGluZ0VDbGFzcywgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb2NhbGVFbmNvZGluZ01hcHBpbmdFQ2xhc3MsIExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19JRCk7Ci0KLQkJbG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzLCBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcywgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fSUQpOwotCi0JCWxvZ2luQ29uZmlnRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPR0lOX0NPTkZJRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9naW5Db25maWdFQ2xhc3MsIExPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvZ2luQ29uZmlnRUNsYXNzLCBMT0dJTl9DT05GSUdfX1JFQUxNX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxvZ2luQ29uZmlnRUNsYXNzLCBMT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb2dpbkNvbmZpZ0VDbGFzcywgTE9HSU5fQ09ORklHX19JRCk7Ci0KLQkJbWltZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUlNRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtaW1lTWFwcGluZ0VDbGFzcywgTUlNRV9NQVBQSU5HX19FWFRFTlNJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1pbWVNYXBwaW5nRUNsYXNzLCBNSU1FX01BUFBJTkdfX01JTUVfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWltZU1hcHBpbmdFQ2xhc3MsIE1JTUVfTUFQUElOR19fSUQpOwotCi0JCXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNVUklUWV9DT05TVFJBSU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTRUNVUklUWV9DT05TVFJBSU5UX19JRCk7Ci0KLQkJc2VydmxldEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWTEVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX0lDT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19TRVJWTEVUX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX1NFUlZMRVRfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX0pTUF9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19JTklUX1BBUkFNUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19SVU5fQVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fSUQpOwotCi0JCXNlcnZsZXRNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZMRVRfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldE1hcHBpbmdFQ2xhc3MsIFNFUlZMRVRfTUFQUElOR19fU0VSVkxFVF9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0TWFwcGluZ0VDbGFzcywgU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRNYXBwaW5nRUNsYXNzLCBTRVJWTEVUX01BUFBJTkdfX0lEKTsKLQotCQlzZXNzaW9uQ29uZmlnRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFU1NJT05fQ09ORklHKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQ29uZmlnRUNsYXNzLCBTRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQ29uZmlnRUNsYXNzLCBTRVNTSU9OX0NPTkZJR19fSUQpOwotCi0JCXVzZXJEYXRhQ29uc3RyYWludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhVU0VSX0RBVEFfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodXNlckRhdGFDb25zdHJhaW50RUNsYXNzLCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIFVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIFVTRVJfREFUQV9DT05TVFJBSU5UX19JRCk7Ci0KLQkJd2ViQXBwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9BUFApOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fSUNPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRElTVFJJQlVUQUJMRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRklMVEVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19GSUxURVJfTUFQUElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fTElTVEVORVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1NFUlZMRVRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fU0VTU0lPTl9DT05GSUdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX01JTUVfTUFQUElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fV0VMQ09NRV9GSUxFX0xJU1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0VSUk9SX1BBR0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0pTUF9DT05GSUdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0xPR0lOX0NPTkZJR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRU5WX0VOVFJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRUpCX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fU0VSVklDRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1JFU09VUkNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fUkVTT1VSQ0VfRU5WX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19QRVJTSVNURU5DRV9VTklUX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fUE9TVF9DT05TVFJVQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1BSRV9ERVNUUk9ZUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19NRVRBREFUQV9DT01QTEVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19WRVJTSU9OKTsKLQotCQl3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUCk7Ci0KLQkJd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSUQpOwotCi0JCXdlbGNvbWVGaWxlTGlzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUxDT01FX0ZJTEVfTElTVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2VsY29tZUZpbGVMaXN0RUNsYXNzLCBXRUxDT01FX0ZJTEVfTElTVF9fV0VMQ09NRV9GSUxFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2VsY29tZUZpbGVMaXN0RUNsYXNzLCBXRUxDT01FX0ZJTEVfTElTVF9fSUQpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlkaXNwYXRjaGVyVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oRElTUEFUQ0hFUl9UWVBFKTsKLQkJbnVsbENoYXJUeXBlRUVudW0gPSBjcmVhdGVFRW51bShOVUxMX0NIQVJfVFlQRSk7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRSk7Ci0JCXdlYkFwcFZlcnNpb25UeXBlRUVudW0gPSBjcmVhdGVFRW51bShXRUJfQVBQX1ZFUlNJT05fVFlQRSk7Ci0KLQkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKLQkJYXV0aE1ldGhvZFR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoQVVUSF9NRVRIT0RfVFlQRSk7Ci0JCWRpc3BhdGNoZXJUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKERJU1BBVENIRVJfVFlQRV9PQkpFQ1QpOwotCQllbmNvZGluZ1R5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRU5DT0RJTkdfVFlQRSk7Ci0JCWVycm9yQ29kZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRVJST1JfQ09ERV9UWVBFKTsKLQkJZmlsdGVyTmFtZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRklMVEVSX05BTUVfVFlQRSk7Ci0JCWh0dHBNZXRob2RUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEhUVFBfTUVUSE9EX1RZUEUpOwotCQlsb2FkT25TdGFydHVwVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShMT0FEX09OX1NUQVJUVVBfVFlQRSk7Ci0JCWxvY2FsZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTE9DQUxFX1RZUEUpOwotCQltaW1lVHlwZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTUlNRV9UWVBFX1RZUEUpOwotCQlub25FbXB0eVN0cmluZ1R5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTk9OX0VNUFRZX1NUUklOR19UWVBFKTsKLQkJbnVsbENoYXJUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKE5VTExfQ0hBUl9UWVBFX09CSkVDVCk7Ci0JCXNlcnZsZXROYW1lVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTRVJWTEVUX05BTUVfVFlQRSk7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFX09CSkVDVCk7Ci0JCXdhclBhdGhUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFdBUl9QQVRIX1RZUEUpOwotCQl3ZWJBcHBWZXJzaW9uVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShXRUJfQVBQX1ZFUlNJT05fVFlQRV9PQkpFQ1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlKYXZhZWVQYWNrYWdlIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpOwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQkJSnNwUGFja2FnZSB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhhdXRoQ29uc3RyYWludEVDbGFzcywgQXV0aENvbnN0cmFpbnQuY2xhc3MsICJBdXRoQ29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhDb25zdHJhaW50X1JvbGVOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJvbGVOYW1lKCksICJyb2xlTmFtZXMiLCBudWxsLCAwLCAtMSwgQXV0aENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhDb25zdHJhaW50X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhlcnJvclBhZ2VFQ2xhc3MsIEVycm9yUGFnZS5jbGFzcywgIkVycm9yUGFnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFcnJvclBhZ2VfRXJyb3JDb2RlKCksIHRoaXMuZ2V0RXJyb3JDb2RlVHlwZSgpLCAiZXJyb3JDb2RlIiwgbnVsbCwgMCwgMSwgRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJleGNlcHRpb25UeXBlIiwgbnVsbCwgMCwgMSwgRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFcnJvclBhZ2VfTG9jYXRpb24oKSwgdGhpcy5nZXRXYXJQYXRoVHlwZSgpLCAibG9jYXRpb24iLCBudWxsLCAxLCAxLCBFcnJvclBhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVycm9yUGFnZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFcnJvclBhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGZpbHRlckVDbGFzcywgRmlsdGVyLmNsYXNzLCAiRmlsdGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlcl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyX0ljb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlcl9GaWx0ZXJOYW1lKCksIHRoaXMuZ2V0RmlsdGVyTmFtZVR5cGUoKSwgImZpbHRlck5hbWUiLCBudWxsLCAxLCAxLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlcl9GaWx0ZXJDbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJmaWx0ZXJDbGFzcyIsIG51bGwsIDEsIDEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJpbml0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAiRmlsdGVyTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlck5hbWUoKSwgdGhpcy5nZXRGaWx0ZXJOYW1lVHlwZSgpLCAiZmlsdGVyTmFtZSIsIG51bGwsIDEsIDEsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlck1hcHBpbmdfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRVcmxQYXR0ZXJuVHlwZSgpLCBudWxsLCAidXJsUGF0dGVybnMiLCBudWxsLCAwLCAtMSwgRmlsdGVyTWFwcGluZy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX1NlcnZsZXROYW1lcygpLCB0aGlzLmdldFNlcnZsZXROYW1lVHlwZSgpLCAic2VydmxldE5hbWVzIiwgbnVsbCwgMCwgLTEsIEZpbHRlck1hcHBpbmcuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlcnMoKSwgdGhpcy5nZXREaXNwYXRjaGVyVHlwZSgpLCAiZGlzcGF0Y2hlcnMiLCAiRk9SV0FSRCIsIDAsIDQsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyTWFwcGluZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhmb3JtTG9naW5Db25maWdFQ2xhc3MsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgIkZvcm1Mb2dpbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpLCB0aGlzLmdldFdhclBhdGhUeXBlKCksICJmb3JtTG9naW5QYWdlIiwgbnVsbCwgMSwgMSwgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGb3JtTG9naW5Db25maWdfRm9ybUVycm9yUGFnZSgpLCB0aGlzLmdldFdhclBhdGhUeXBlKCksICJmb3JtRXJyb3JQYWdlIiwgbnVsbCwgMSwgMSwgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGb3JtTG9naW5Db25maWdfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhsb2NhbGVFbmNvZGluZ01hcHBpbmdFQ2xhc3MsIExvY2FsZUVuY29kaW5nTWFwcGluZy5jbGFzcywgIkxvY2FsZUVuY29kaW5nTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCksIHRoaXMuZ2V0TG9jYWxlVHlwZSgpLCAibG9jYWxlIiwgbnVsbCwgMSwgMSwgTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKSwgdGhpcy5nZXRFbmNvZGluZ1R5cGUoKSwgImVuY29kaW5nIiwgbnVsbCwgMSwgMSwgTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzLCBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0LmNsYXNzLCAiTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpLCB0aGlzLmdldExvY2FsZUVuY29kaW5nTWFwcGluZygpLCBudWxsLCAibG9jYWxFbmNvZGluZ01hcHBpbmdzIiwgbnVsbCwgMSwgLTEsIExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhsb2dpbkNvbmZpZ0VDbGFzcywgTG9naW5Db25maWcuY2xhc3MsICJMb2dpbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCksIHRoaXMuZ2V0QXV0aE1ldGhvZFR5cGUoKSwgImF1dGhNZXRob2QiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJyZWFsbU5hbWUiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCksIHRoaXMuZ2V0Rm9ybUxvZ2luQ29uZmlnKCksIG51bGwsICJmb3JtTG9naW5Db25maWciLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2dpbkNvbmZpZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobWltZU1hcHBpbmdFQ2xhc3MsIE1pbWVNYXBwaW5nLmNsYXNzLCAiTWltZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJleHRlbnNpb24iLCBudWxsLCAxLCAxLCBNaW1lTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSwgdGhpcy5nZXRNaW1lVHlwZVR5cGUoKSwgIm1pbWVUeXBlIiwgbnVsbCwgMSwgMSwgTWltZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1pbWVNYXBwaW5nX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIE1pbWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIlNlY3VyaXR5Q29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSwgdGhpcy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSwgbnVsbCwgIndlYlJlc291cmNlQ29sbGVjdGlvbnMiLCBudWxsLCAxLCAtMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpLCB0aGlzLmdldEF1dGhDb25zdHJhaW50KCksIG51bGwsICJhdXRoQ29uc3RyYWludCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCksIHRoaXMuZ2V0VXNlckRhdGFDb25zdHJhaW50KCksIG51bGwsICJ1c2VyRGF0YUNvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlDb25zdHJhaW50X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2VydmxldEVDbGFzcywgU2VydmxldC5jbGFzcywgIlNlcnZsZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpLCB0aGlzLmdldFNlcnZsZXROYW1lVHlwZSgpLCAic2VydmxldE5hbWUiLCBudWxsLCAxLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0X1NlcnZsZXRDbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJzZXJ2bGV0Q2xhc3MiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0X0pzcEZpbGUoKSwgdGhlSnNwUGFja2FnZS5nZXRKc3BGaWxlVHlwZSgpLCAianNwRmlsZSIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfSW5pdFBhcmFtcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSwgdGhpcy5nZXRMb2FkT25TdGFydHVwVHlwZSgpLCAibG9hZE9uU3RhcnR1cCIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfUnVuQXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSdW5BcygpLCBudWxsLCAicnVuQXMiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlY3VyaXR5Um9sZVJlZigpLCBudWxsLCAic2VjdXJpdHlSb2xlUmVmcyIsIG51bGwsIDAsIC0xLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2VydmxldE1hcHBpbmdFQ2xhc3MsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAiU2VydmxldE1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldE1hcHBpbmdfU2VydmxldE5hbWUoKSwgdGhpcy5nZXRTZXJ2bGV0TmFtZVR5cGUoKSwgInNlcnZsZXROYW1lIiwgbnVsbCwgMSwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRNYXBwaW5nX1VybFBhdHRlcm5zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VXJsUGF0dGVyblR5cGUoKSwgbnVsbCwgInVybFBhdHRlcm5zIiwgbnVsbCwgMSwgLTEsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRNYXBwaW5nX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZXNzaW9uQ29uZmlnRUNsYXNzLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAiU2Vzc2lvbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQ29uZmlnX1Nlc3Npb25UaW1lb3V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludGVnZXIoKSwgInNlc3Npb25UaW1lb3V0IiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkNvbmZpZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIlVzZXJEYXRhQ29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBVc2VyRGF0YUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpLCB0aGlzLmdldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoKSwgInRyYW5zcG9ydEd1YXJhbnRlZSIsICJOT05FIiwgMSwgMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXNlckRhdGFDb25zdHJhaW50X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mod2ViQXBwRUNsYXNzLCBXZWJBcHAuY2xhc3MsICJXZWJBcHAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViQXBwX0dyb3VwKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cCIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ljb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9EaXN0cmlidXRhYmxlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVtcHR5VHlwZSgpLCBudWxsLCAiZGlzdHJpYnV0YWJsZXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiY29udGV4dFBhcmFtcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ZpbHRlcnMoKSwgdGhpcy5nZXRGaWx0ZXIoKSwgbnVsbCwgImZpbHRlcnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpLCB0aGlzLmdldEZpbHRlck1hcHBpbmcoKSwgbnVsbCwgImZpbHRlck1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTGlzdGVuZXJzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlzdGVuZXIoKSwgbnVsbCwgImxpc3RlbmVycyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlcnZsZXRzKCksIHRoaXMuZ2V0U2VydmxldCgpLCBudWxsLCAic2VydmxldHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSwgdGhpcy5nZXRTZXJ2bGV0TWFwcGluZygpLCBudWxsLCAic2VydmxldE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZ3MoKSwgdGhpcy5nZXRTZXNzaW9uQ29uZmlnKCksIG51bGwsICJzZXNzaW9uQ29uZmlncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpLCB0aGlzLmdldE1pbWVNYXBwaW5nKCksIG51bGwsICJtaW1lTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9XZWxjb21lRmlsZUxpc3RzKCksIHRoaXMuZ2V0V2VsY29tZUZpbGVMaXN0KCksIG51bGwsICJ3ZWxjb21lRmlsZUxpc3RzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRXJyb3JQYWdlcygpLCB0aGlzLmdldEVycm9yUGFnZSgpLCBudWxsLCAiZXJyb3JQYWdlcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0pzcENvbmZpZ3MoKSwgdGhlSnNwUGFja2FnZS5nZXRKc3BDb25maWcoKSwgbnVsbCwgImpzcENvbmZpZ3MiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZWN1cml0eUNvbnN0cmFpbnRzKCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIG51bGwsICJzZWN1cml0eUNvbnN0cmFpbnRzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTG9naW5Db25maWdzKCksIHRoaXMuZ2V0TG9naW5Db25maWcoKSwgbnVsbCwgImxvZ2luQ29uZmlncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZWN1cml0eVJvbGUoKSwgbnVsbCwgInNlY3VyaXR5Um9sZXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9FbnZFbnRyaWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudkVudHJpZXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9FamJSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRWpiTG9jYWxSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiTG9jYWxSZWYoKSwgbnVsbCwgImVqYkxvY2FsUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlcnZpY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9SZXNvdXJjZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfUmVzb3VyY2VFbnZSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfUGVyc2lzdGVuY2VVbml0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlVW5pdFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0UmVmcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1Bvc3RDb25zdHJ1Y3RzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RDb25zdHJ1Y3RzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfUHJlRGVzdHJveXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicHJlRGVzdHJveXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25zIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSwgdGhpcy5nZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KCksIG51bGwsICJsb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViQXBwX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBfTWV0YWRhdGFDb21wbGV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJtZXRhZGF0YUNvbXBsZXRlIiwgbnVsbCwgMCwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYkFwcF9WZXJzaW9uKCksIHRoaXMuZ2V0V2ViQXBwVmVyc2lvblR5cGUoKSwgInZlcnNpb24iLCAiMi41IiwgMSwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvci5jbGFzcywgIldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhNTE5TUHJlZml4TWFwIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgbnVsbCwgIndlYkFwcCIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIldlYlJlc291cmNlQ29sbGVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fV2ViUmVzb3VyY2VOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJ3ZWJSZXNvdXJjZU5hbWUiLCBudWxsLCAxLCAxLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRVcmxQYXR0ZXJuVHlwZSgpLCBudWxsLCAidXJsUGF0dGVybnMiLCBudWxsLCAxLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kcygpLCB0aGlzLmdldEh0dHBNZXRob2RUeXBlKCksICJodHRwTWV0aG9kcyIsIG51bGwsIDAsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHdlbGNvbWVGaWxlTGlzdEVDbGFzcywgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCAiV2VsY29tZUZpbGVMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlbGNvbWVGaWxlTGlzdF9XZWxjb21lRmlsZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3ZWxjb21lRmlsZXMiLCBudWxsLCAxLCAtMSwgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWxjb21lRmlsZUxpc3RfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLmNsYXNzLCAiRGlzcGF0Y2hlclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuRk9SV0FSRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLklOQ0xVREVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5SRVFVRVNUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuRVJST1JfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKG51bGxDaGFyVHlwZUVFbnVtLCBOdWxsQ2hhclR5cGUuY2xhc3MsICJOdWxsQ2hhclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwobnVsbENoYXJUeXBlRUVudW0sIE51bGxDaGFyVHlwZS5fX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bSh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuY2xhc3MsICJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5OT05FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLklOVEVHUkFMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLkNPTkZJREVOVElBTF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0od2ViQXBwVmVyc2lvblR5cGVFRW51bSwgV2ViQXBwVmVyc2lvblR5cGUuY2xhc3MsICJXZWJBcHBWZXJzaW9uVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbCh3ZWJBcHBWZXJzaW9uVHlwZUVFbnVtLCBXZWJBcHBWZXJzaW9uVHlwZS5fMjVfTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoYXV0aE1ldGhvZFR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkF1dGhNZXRob2RUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGRpc3BhdGNoZXJUeXBlT2JqZWN0RURhdGFUeXBlLCBEaXNwYXRjaGVyVHlwZS5jbGFzcywgIkRpc3BhdGNoZXJUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZW5jb2RpbmdUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJFbmNvZGluZ1R5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZXJyb3JDb2RlVHlwZUVEYXRhVHlwZSwgQmlnSW50ZWdlci5jbGFzcywgIkVycm9yQ29kZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZmlsdGVyTmFtZVR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkZpbHRlck5hbWVUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGh0dHBNZXRob2RUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJIdHRwTWV0aG9kVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShsb2FkT25TdGFydHVwVHlwZUVEYXRhVHlwZSwgT2JqZWN0LmNsYXNzLCAiTG9hZE9uU3RhcnR1cFR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUobG9jYWxlVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiTG9jYWxlVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShtaW1lVHlwZVR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIk1pbWVUeXBlVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShub25FbXB0eVN0cmluZ1R5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIk5vbkVtcHR5U3RyaW5nVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShudWxsQ2hhclR5cGVPYmplY3RFRGF0YVR5cGUsIE51bGxDaGFyVHlwZS5jbGFzcywgIk51bGxDaGFyVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHNlcnZsZXROYW1lVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiU2VydmxldE5hbWVUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3RFRGF0YVR5cGUsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuY2xhc3MsICJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUod2FyUGF0aFR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIldhclBhdGhUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHdlYkFwcFZlcnNpb25UeXBlT2JqZWN0RURhdGFUeXBlLCBXZWJBcHBWZXJzaW9uVHlwZS5jbGFzcywgIldlYkFwcFZlcnNpb25UeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKLQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGE8L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiOyAvLyROT04tTkxTLTEkCQkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGF1dGhDb25zdHJhaW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJhdXRoLWNvbnN0cmFpbnRUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBdXRoQ29uc3RyYWludF9Sb2xlTmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInJvbGUtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEF1dGhDb25zdHJhaW50X0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYXV0aE1ldGhvZFR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImF1dGgtbWV0aG9kVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjdG9rZW4iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkaXNwYXRjaGVyVHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJkaXNwYXRjaGVyVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGlzcGF0Y2hlclR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImRpc3BhdGNoZXJUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJkaXNwYXRjaGVyVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVuY29kaW5nVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZW5jb2RpbmdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAicGF0dGVybiIsICJbXlxcc10rIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXJyb3JDb2RlVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZXJyb3ItY29kZVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3Bvc2l0aXZlSW50ZWdlciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJwYXR0ZXJuIiwgIlxcZHszfSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVycm9yUGFnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZXJyb3ItcGFnZVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RXJyb3JQYWdlX0Vycm9yQ29kZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZXJyb3ItY29kZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZXhjZXB0aW9uLXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RXJyb3JQYWdlX0xvY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsb2NhdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVycm9yUGFnZV9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGZpbHRlckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiZmlsdGVyVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWx0ZXJfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWx0ZXJfRGlzcGxheU5hbWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkaXNwbGF5LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RmlsdGVyX0ljb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpY29uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEZpbHRlcl9GaWx0ZXJOYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJmaWx0ZXItbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWx0ZXJfRmlsdGVyQ2xhc3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImZpbHRlci1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWx0ZXJfSW5pdFBhcmFtcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaW5pdC1wYXJhbSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEZpbHRlcl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGZpbHRlck1hcHBpbmdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImZpbHRlci1tYXBwaW5nVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlck5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImZpbHRlci1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RmlsdGVyTWFwcGluZ19Hcm91cCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImdyb3VwOjEiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInVybC1wYXR0ZXJuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RmlsdGVyTWFwcGluZ19TZXJ2bGV0TmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZsZXQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjEiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlcnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRpc3BhdGNoZXIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWx0ZXJNYXBwaW5nX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZmlsdGVyTmFtZVR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImZpbHRlci1uYW1lVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJub25FbXB0eVN0cmluZ1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChmb3JtTG9naW5Db25maWdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImZvcm0tbG9naW4tY29uZmlnVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1Mb2dpblBhZ2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImZvcm0tbG9naW4tcGFnZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGb3JtTG9naW5Db25maWdfRm9ybUVycm9yUGFnZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZm9ybS1lcnJvci1wYWdlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Rm9ybUxvZ2luQ29uZmlnX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoaHR0cE1ldGhvZFR5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImh0dHAtbWV0aG9kVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjdG9rZW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAicGF0dGVybiIsICJbXFxwe0x9LVtcXHB7Q2N9XFxwe1p9XV0rIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChsb2FkT25TdGFydHVwVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAibG9hZC1vbi1zdGFydHVwVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJtZW1iZXJUeXBlcyIsICJudWxsLWNoYXJUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobG9jYWxlRW5jb2RpbmdNYXBwaW5nRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJsb2NhbGUtZW5jb2RpbmctbWFwcGluZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0xvY2FsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibG9jYWxlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlbmNvZGluZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExvY2FsZUVuY29kaW5nTWFwcGluZ19JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsb2NhbGUtZW5jb2RpbmctbWFwcGluZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChsb2NhbGVUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJsb2NhbGVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAicGF0dGVybiIsICJbYS16XXsyfShffC0pPyhbXFxwe0x9XFwtXFxwe05kfV17Mn0pPyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGxvZ2luQ29uZmlnRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJsb2dpbi1jb25maWdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImF1dGgtbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExvZ2luQ29uZmlnX1JlYWxtTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVhbG0tbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExvZ2luQ29uZmlnX0Zvcm1Mb2dpbkNvbmZpZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZm9ybS1sb2dpbi1jb25maWciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMb2dpbkNvbmZpZ19JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1pbWVNYXBwaW5nRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtaW1lLW1hcHBpbmdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1pbWVNYXBwaW5nX0V4dGVuc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZXh0ZW5zaW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1pbWUtdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1pbWVNYXBwaW5nX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWltZVR5cGVUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJtaW1lLXR5cGVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSN0b2tlbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJwYXR0ZXJuIiwgIlteXFxwe0NjfV5cXHNdKy9bXlxccHtDY31eXFxzXSsiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChub25FbXB0eVN0cmluZ1R5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm5vbkVtcHR5U3RyaW5nVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjdG9rZW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibWluTGVuZ3RoIiwgIjEiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG51bGxDaGFyVHlwZUVFbnVtLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJudWxsLWNoYXJUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChudWxsQ2hhclR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIm51bGwtY2hhclR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgIm51bGwtY2hhclR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiYXV0aC1jb25zdHJhaW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidXNlci1kYXRhLWNvbnN0cmFpbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN1cml0eUNvbnN0cmFpbnRfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZXJ2bGV0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXJ2bGV0VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2bGV0X0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmxldF9EaXNwbGF5TmFtZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2bGV0X0ljb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpY29uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZsZXRfU2VydmxldE5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZsZXQtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2bGV0X1NlcnZsZXRDbGFzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAic2VydmxldC1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZsZXRfSnNwRmlsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAianNwLWZpbGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2bGV0X0luaXRQYXJhbXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImluaXQtcGFyYW0iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmxldF9Mb2FkT25TdGFydHVwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJsb2FkLW9uLXN0YXJ0dXAiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2bGV0X1J1bkFzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJydW4tYXMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlY3VyaXR5LXJvbGUtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmxldF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlcnZsZXRNYXBwaW5nRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXJ2bGV0LW1hcHBpbmdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXROYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2bGV0LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidXJsLXBhdHRlcm4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2bGV0TWFwcGluZ19JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlcnZsZXROYW1lVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAic2VydmxldC1uYW1lVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJub25FbXB0eVN0cmluZ1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZXNzaW9uQ29uZmlnRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXNzaW9uLWNvbmZpZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlc3Npb24tdGltZW91dCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlc3Npb25Db25maWdfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiYmFzZVR5cGUiLCAidHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInVzZXItZGF0YS1jb25zdHJhaW50VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFVzZXJEYXRhQ29uc3RyYWludF9UcmFuc3BvcnRHdWFyYW50ZWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInRyYW5zcG9ydC1ndWFyYW50ZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRVc2VyRGF0YUNvbnN0cmFpbnRfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3YXJQYXRoVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAid2FyLXBhdGhUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSN0b2tlbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJwYXR0ZXJuIiwgIi8uKiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod2ViQXBwRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ3ZWItYXBwVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfR3JvdXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfRGVzY3JpcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfRGlzcGxheU5hbWVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJkaXNwbGF5LW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX0ljb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpY29uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9EaXN0cmlidXRhYmxlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGlzdHJpYnV0YWJsZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiY29udGV4dC1wYXJhbSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9GaWx0ZXJzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJmaWx0ZXIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImZpbHRlci1tYXBwaW5nIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX0xpc3RlbmVycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibGlzdGVuZXIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfU2VydmxldHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlcnZsZXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2bGV0LW1hcHBpbmciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZ3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlc3Npb24tY29uZmlnIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWltZS1tYXBwaW5nIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX1dlbGNvbWVGaWxlTGlzdHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIndlbGNvbWUtZmlsZS1saXN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVycm9yLXBhZ2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfSnNwQ29uZmlncygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAianNwLWNvbmZpZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9TZWN1cml0eUNvbnN0cmFpbnRzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZWN1cml0eS1jb25zdHJhaW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX0xvZ2luQ29uZmlncygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibG9naW4tY29uZmlnIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInNlY3VyaXR5LXJvbGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfRW52RW50cmllcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZW52LWVudHJ5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9FamJSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJlamItcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9FamJMb2NhbFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImVqYi1sb2NhbC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX1NlcnZpY2VSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfUmVzb3VyY2VSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJyZXNvdXJjZS1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX1Jlc291cmNlRW52UmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicmVzb3VyY2UtZW52LXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS11bml0LXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfUG9zdENvbnN0cnVjdHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInBvc3QtY29uc3RydWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcF9QcmVEZXN0cm95cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAicHJlLWRlc3Ryb3kiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBfTWV0YWRhdGFDb21wbGV0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJtZXRhZGF0YS1jb21wbGV0ZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwX1ZlcnNpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAidmVyc2lvbiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJraW5kIiwgIm1peGVkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50V2lsZGNhcmQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICI6bWl4ZWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInhtbG5zOnByZWZpeCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAieHNpOnNjaGVtYUxvY2F0aW9uIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfV2ViQXBwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ3ZWItYXBwIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdlYkFwcFZlcnNpb25UeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIndlYi1hcHAtdmVyc2lvblR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdlYkFwcFZlcnNpb25UeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ3ZWItYXBwLXZlcnNpb25UeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJ3ZWItYXBwLXZlcnNpb25UeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgIndlYi1yZXNvdXJjZS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lIiwgInVybC1wYXR0ZXJuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2RzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJodHRwLW1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdlbGNvbWVGaWxlTGlzdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAid2VsY29tZS1maWxlLWxpc3RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWxjb21lRmlsZUxpc3RfV2VsY29tZUZpbGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZSIsICJ3ZWxjb21lLWZpbGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXZWxjb21lRmlsZUxpc3RfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsKLQl9Ci0KLX0gLy9XZWJQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYlJlc291cmNlQ29sbGVjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhNTA2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYlJlc291cmNlQ29sbGVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIENvbGxlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCNnZXRXZWJSZXNvdXJjZU5hbWUgPGVtPldlYiBSZXNvdXJjZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlJlc291cmNlQ29sbGVjdGlvbkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCNnZXRVcmxQYXR0ZXJucyA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlJlc291cmNlQ29sbGVjdGlvbkltcGwjZ2V0SHR0cE1ldGhvZHMgPGVtPkh0dHAgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYlJlc291cmNlQ29sbGVjdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlJlc291cmNlTmFtZSgpIDxlbT5XZWIgUmVzb3VyY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2ViUmVzb3VyY2VOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUkVTT1VSQ0VfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWJSZXNvdXJjZU5hbWUoKSA8ZW0+V2ViIFJlc291cmNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB3ZWJSZXNvdXJjZU5hbWUgPSBXRUJfUkVTT1VSQ0VfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVybFBhdHRlcm5zKCkgPGVtPlVybCBQYXR0ZXJuczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmxQYXR0ZXJucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHVybFBhdHRlcm5zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh0dHBNZXRob2RzKCkgPGVtPkh0dHAgTWV0aG9kczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIdHRwTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGh0dHBNZXRob2RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2ViUmVzb3VyY2VOYW1lKCkgewotCQlyZXR1cm4gd2ViUmVzb3VyY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYlJlc291cmNlTmFtZShTdHJpbmcgbmV3V2ViUmVzb3VyY2VOYW1lKSB7Ci0JCVN0cmluZyBvbGRXZWJSZXNvdXJjZU5hbWUgPSB3ZWJSZXNvdXJjZU5hbWU7Ci0JCXdlYlJlc291cmNlTmFtZSA9IG5ld1dlYlJlc291cmNlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUUsIG9sZFdlYlJlc291cmNlTmFtZSwgd2ViUmVzb3VyY2VOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFVybFBhdHRlcm5zKCkgewotCQlpZiAodXJsUGF0dGVybnMgPT0gbnVsbCkgewotCQkJdXJsUGF0dGVybnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVXJsUGF0dGVyblR5cGUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOUyk7Ci0JCX0KLQkJcmV0dXJuIHVybFBhdHRlcm5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEh0dHBNZXRob2RzKCkgewotCQlpZiAoaHR0cE1ldGhvZHMgPT0gbnVsbCkgewotCQkJaHR0cE1ldGhvZHMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRFMpOwotCQl9Ci0JCXJldHVybiBodHRwTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRVcmxQYXR0ZXJucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFdlYlJlc291cmNlTmFtZSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTlM6Ci0JCQkJcmV0dXJuIGdldFVybFBhdHRlcm5zKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0SHR0cE1ldGhvZHMoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUU6Ci0JCQkJc2V0V2ViUmVzb3VyY2VOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOUzoKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQkJZ2V0VXJsUGF0dGVybnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RTOgotCQkJCWdldEh0dHBNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlnZXRIdHRwTWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRToKLQkJCQlzZXRXZWJSZXNvdXJjZU5hbWUoV0VCX1JFU09VUkNFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTlM6Ci0JCQkJZ2V0VXJsUGF0dGVybnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RTOgotCQkJCWdldEh0dHBNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUU6Ci0JCQkJcmV0dXJuIFdFQl9SRVNPVVJDRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyB3ZWJSZXNvdXJjZU5hbWUgIT0gbnVsbCA6ICFXRUJfUkVTT1VSQ0VfTkFNRV9FREVGQVVMVC5lcXVhbHMod2ViUmVzb3VyY2VOYW1lKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk5TOgotCQkJCXJldHVybiB1cmxQYXR0ZXJucyAhPSBudWxsICYmICF1cmxQYXR0ZXJucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EUzoKLQkJCQlyZXR1cm4gaHR0cE1ldGhvZHMgIT0gbnVsbCAmJiAhaHR0cE1ldGhvZHMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdlYlJlc291cmNlTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh3ZWJSZXNvdXJjZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh0dHBNZXRob2RzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGh0dHBNZXRob2RzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dlYlJlc291cmNlQ29sbGVjdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2VsY29tZUZpbGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTE4Yjk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2VsY29tZUZpbGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlbGNvbWUgRmlsZSBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlbGNvbWVGaWxlTGlzdEltcGwjZ2V0V2VsY29tZUZpbGVzIDxlbT5XZWxjb21lIEZpbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlbGNvbWVGaWxlTGlzdEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZUZpbGVMaXN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV2VsY29tZUZpbGVMaXN0IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWxjb21lRmlsZXMoKSA8ZW0+V2VsY29tZSBGaWxlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWxjb21lRmlsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3ZWxjb21lRmlsZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2VsY29tZUZpbGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VMQ09NRV9GSUxFX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2VsY29tZUZpbGVzKCkgewotCQlpZiAod2VsY29tZUZpbGVzID09IG51bGwpIHsKLQkJCXdlbGNvbWVGaWxlcyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFTENPTUVfRklMRVMpOwotCQl9Ci0JCXJldHVybiB3ZWxjb21lRmlsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VMQ09NRV9GSUxFUzoKLQkJCQlyZXR1cm4gZ2V0V2VsY29tZUZpbGVzKCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFTENPTUVfRklMRVM6Ci0JCQkJZ2V0V2VsY29tZUZpbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRXZWxjb21lRmlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VMQ09NRV9GSUxFUzoKLQkJCQlnZXRXZWxjb21lRmlsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUxDT01FX0ZJTEVTOgotCQkJCXJldHVybiB3ZWxjb21lRmlsZXMgIT0gbnVsbCAmJiAhd2VsY29tZUZpbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh3ZWxjb21lRmlsZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQod2VsY29tZUZpbGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dlbGNvbWVGaWxlTGlzdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9tZXRhZGF0YS9XZWJQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9tZXRhZGF0YS9XZWJQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZDFhNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvbWV0YWRhdGEvV2ViUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAgICAgICBAKCMpd2ViLWFwcF8yXzUueHNkcwkxLjYyIDA1LzA4LzA2Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogICAgICAgCi0gKiAKLSAqIAlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAyLjUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogCVRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZCAiV0VCLUlORi93ZWIueG1sIiBpbiB0aGUKLSAqIAl3ZWIgYXBwbGljYXRpb24ncyB3YXIgZmlsZS4gIEFsbCBTZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLSAqIAltdXN0IGluZGljYXRlIHRoZSB3ZWIgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFCi0gKiAJbmFtZXNwYWNlOgotICogCi0gKiAJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gKiAKLSAqIAlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gKiAJdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLSAqIAotICogCSAgICAmbHQ7d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICogCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gKiAJICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0gKiAJICAgICAgdmVyc2lvbj0iMi41IiZndDsKLSAqIAkgICAgICAuLi4KLSAqIAkgICAgJmx0Oy93ZWItYXBwJmd0OwotICogCi0gKiAJVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0gKiAJdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotICogCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gKiAKLSAqIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkCi0gKiAKLSAqIAkKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gKiAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0gKiAKLSAqICAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAqIAlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICogCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICogCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICogCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gKiAJcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gKiAJbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gKiAKLSAqICAgICAKLSAqIAotICogICAgICAgQCgjKWphdmFlZV81LnhzZHMJMS42NSAwNi8wMi8xNwotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi0gKiBzaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLSAqIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLSAqIAotICogRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgIGoyZWUgYXBwbGljYXRpb247Ci0gKiAgICAgYXBwbGljYXRpb24gY2xpZW50OwotICogICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAqICAgICBlbnRlcnByaXNlIGJlYW47Ci0gKiAgICAgcmVzb3VyY2UgYWRhcHRlcjsKLSAqIAotICogRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBlYXIgZmlsZTsKLSAqICAgICB3YXIgZmlsZTsKLSAqICAgICBqYXIgZmlsZTsKLSAqICAgICByYXIgZmlsZTsKLSAqIAotICogCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkcwkxLjE5IDAyLzEzLzA2Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgotICogCi0gKiAgICAgVGhpcyBzY2hlbWEgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBYTUwgbmFtZXNwYWNlLCBpbiBhIGZvcm0KLSAqICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuICAKLSAqIAotICogICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUgZGVmaW5lZAotICogICAgIG9ubHkgYnkgdGhlIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gb3IgaXRzIHN1Ymdyb3Vwcy4gIFRoZQotICogICAgIGZvbGxvd2luZyBuYW1lcyBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgYW5kIHNob3VsZAotICogICAgIG5vdCBiZSB1c2VkIHdpdGggY29uZmxpY3Rpbmcgc2VtYW50aWNzIGJ5IGFueSBXb3JraW5nIEdyb3VwLAotICogICAgIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlOgotICogCi0gKiAgICAgYmFzZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgcHJvdmlkZXMgYSBVUkkgdG8gYmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IgaW50ZXJwcmV0aW5nIGFueQotICogICAgICAgICAgcmVsYXRpdmUgVVJJcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVsZW1lbnQgb24gd2hpY2ggaXQKLSAqICAgICAgICAgIGFwcGVhcnM7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIEJhc2Ugc3BlY2lmaWNhdGlvbi4KLSAqIAotICogICAgIGlkICAgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBpZiBkZWNsYXJlZCB0byBiZSBvZiB0eXBlIElELgotICogICAgICAgICAgVGhlIHhtbDppZCBzcGVjaWZpY2F0aW9uIGlzIG5vdCB5ZXQgYSBXM0MgUmVjb21tZW5kYXRpb24sCi0gKiAgICAgICAgICBidXQgdGhpcyBhdHRyaWJ1dGUgaXMgaW5jbHVkZWQgaGVyZSB0byBmYWNpbGl0YXRlIGV4cGVyaW1lbnRhdGlvbgotICogICAgICAgICAgd2l0aCB0aGUgbWVjaGFuaXNtcyBpdCBwcm9wb3Nlcy4gIE5vdGUgdGhhdCBpdCBpcyBfbm90XyBpbmNsdWRlZAotICogICAgICAgICAgaW4gdGhlIHNwZWNpYWxBdHRycyBhdHRyaWJ1dGUgZ3JvdXAuCi0gKiAKLSAqICAgICBsYW5nIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBpcyBhIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBuYXR1cmFsIGxhbmd1YWdlIG9mIHRoZSBjb250ZW50IG9mCi0gKiAgICAgICAgICBhbnkgZWxlbWVudDsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAotICogICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KLSAqICAgCi0gKiAgICAgc3BhY2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UKLSAqICAgICAgICAgIHZhbHVlIGlzIGEga2V5d29yZCBpbmRpY2F0aW5nIHdoYXQgd2hpdGVzcGFjZSBwcm9jZXNzaW5nCi0gKiAgICAgICAgICBkaXNjaXBsaW5lIGlzIGludGVuZGVkIGZvciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDsgaXRzCi0gKiAgICAgICAgICB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgdmlydHVlIG9mIGl0cwotICogICAgICAgICAgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBGYXRoZXIgKGluIGFueSBjb250ZXh0IGF0IGFsbCk6IGRlbm90ZXMgSm9uIEJvc2FrLCB0aGUgY2hhaXIgb2YgCi0gKiAgICAgICAgICB0aGUgb3JpZ2luYWwgWE1MIFdvcmtpbmcgR3JvdXAuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgCi0gKiAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kIAotICogICAgICAgICAgWE1MIENvb3JkaW5hdGlvbiBncm91cHM6Ci0gKiAKLSAqICAgICAgICAgICAgICBJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kIGRlZGljYXRpb24KLSAqICAgICAgICAgICAgICB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YgRmVicnVhcnksIDIwMDAKLSAqICAgICAgICAgICAgICByZXNlcnZlcyBmb3IgSm9uIEJvc2FrIGluIHBlcnBldHVpdHkgdGhlIFhNTCBuYW1lCi0gKiAgICAgICAgICAgICAgeG1sOkZhdGhlcgotICogICAKLSAqIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gKiAgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAqICAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZywgeG1sOnNwYWNlIG9yIHhtbDppZAotICogICAgICAgICBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgotICogCi0gKiAgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gKiAgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICogICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gKiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKLSAqIAotICogICAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzCi0gKiAgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KLSAqIAotICogICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8mZ3Q7Ci0gKiAgCi0gKiAgICAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UKLSAqICAgICAgICAgIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcwotICogSW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZwotICogICAgcG9saWN5LCB0aGlzIHNjaGVtYSBkb2N1bWVudCB3aWxsIHBlcnNpc3QgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZC4KLSAqICAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QuCi0gKiAgICBUaGUgc2NoZW1hIGRvY3VtZW50IGF0IHRoYXQgVVJJIG1heSBob3dldmVyIGNoYW5nZSBpbiB0aGUgZnV0dXJlLAotICogICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYQotICogICAgaXRzZWxmLCBvciB3aXRoIHRoZSBYTUwgbmFtZXNwYWNlIGl0c2VsZi4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgWE1MCi0gKiAgICBTY2hlbWEgb3IgWE1MIG5hbWVzcGFjZXMgY2hhbmdlLCB0aGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAqICAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KLSAqICAgCi0gKiAKLSAqICAgICAgIEAoIylqc3BfMl8xLnhzZHMJMS41IDA4LzExLzA1Ci0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIDIuMSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAqICAgICAgIHR5cGVzLiAgVGhlIEpTUCAyLjEgc2NoZW1hIGNvbnRhaW5zIGFsbCB0aGUgc3BlY2lhbAotICogICAgICAgc3RydWN0dXJlcyBhbmQgZGF0YXR5cGVzIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byB1c2UgSlNQIGZpbGVzCi0gKiAgICAgICBmcm9tIGEgd2ViIGFwcGxpY2F0aW9uLgotICogCi0gKiAgICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBzY2hlbWEgaXMgdXNlZCBieSB0aGUgd2ViLWFwcF8yXzUueHNkCi0gKiAgICAgICBmaWxlIHRvIGRlZmluZSBKU1Agc3BlY2lmaWMgY29udGVudC4KLSAqIAotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAqICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAqIAotICogICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICogCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0gKiAJdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICogCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gKiAJSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLSAqIAlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAqIAluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLSAqIAotICogICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJ3ZWIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIndlYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5BdXRoQ29uc3RyYWludEltcGwgPGVtPkF1dGggQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQXV0aENvbnN0cmFpbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEF1dGhDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVVUSF9DT05TVFJBSU5UX19ST0xFX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVF9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkF1dGggQ29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVVRIX0NPTlNUUkFJTlRfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRXJyb3JQYWdlSW1wbCA8ZW0+RXJyb3IgUGFnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRXJyb3JQYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRFcnJvclBhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVJST1JfUEFHRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXJyb3IgQ29kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVSUk9SX1BBR0VfX0VSUk9SX0NPREUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2VwdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVJST1JfUEFHRV9fTE9DQVRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVJST1JfUEFHRV9fSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVycm9yIFBhZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVJST1JfUEFHRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsIDxlbT5GaWx0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0RmlsdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEZJTFRFUiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX19ESVNQTEFZX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX19JQ09OUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0ZJTFRFUl9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0ZJTFRFUl9DTEFTUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9fSU5JVF9QQVJBTVMgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX19JRCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmlsdGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9GRUFUVVJFX0NPVU5UID0gNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbCA8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlck1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEZpbHRlck1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkcgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbHRlciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkdfX0ZJTFRFUl9OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkdfX0dST1VQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9NQVBQSU5HX19TRVJWTEVUX05BTUVTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9NQVBQSU5HX19JRCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRm9ybUxvZ2luQ29uZmlnSW1wbCA8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZvcm1Mb2dpbkNvbmZpZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0Rm9ybUxvZ2luQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEZPUk1fTE9HSU5fQ09ORklHID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gb3JtIExvZ2luIFBhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gb3JtIEVycm9yIFBhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZPUk1fTE9HSU5fQ09ORklHX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRk9STV9MT0dJTl9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9jYWxlRW5jb2RpbmdNYXBwaW5nSW1wbCA8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvY2FsZUVuY29kaW5nTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExPQ0FMRV9FTkNPRElOR19NQVBQSU5HID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsIDxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1QgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkxvZ2luQ29uZmlnSW1wbCA8ZW0+TG9naW4gQ29uZmlnPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2dpbkNvbmZpZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TG9naW5Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRoIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0QgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWxtIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0dJTl9DT05GSUdfX1JFQUxNX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZvcm0gTG9naW4gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0dJTl9DT05GSUdfX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Mb2dpbiBDb25maWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk1pbWVNYXBwaW5nSW1wbCA8ZW0+TWltZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5NaW1lTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TWltZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUlNRV9NQVBQSU5HID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01BUFBJTkdfX0VYVEVOU0lPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NQVBQSU5HX19NSU1FX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NQVBQSU5HX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWltZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUNvbnN0cmFpbnRJbXBsIDxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUNvbnN0cmFpbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFNlY3VyaXR5Q29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aCBDb25zdHJhaW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2VyIERhdGEgQ29uc3RyYWludDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0lEID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlRfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwgPGVtPlNlcnZsZXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFNlcnZsZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVkxFVCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19ESVNQTEFZX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fSUNPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfX1NFUlZMRVRfTkFNRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfX1NFUlZMRVRfQ0xBU1MgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpzcCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fSlNQX0ZJTEUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19JTklUX1BBUkFNUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9hZCBPbiBTdGFydHVwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SdW4gQXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19SVU5fQVMgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfX0lEID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmxldDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX0ZFQVRVUkVfQ09VTlQgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TWFwcGluZ0ltcGwgPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldE1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFNlcnZsZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFUlZMRVRfTUFQUElORyA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfTUFQUElOR19fU0VSVkxFVF9OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk5TID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfTUFQUElOR19fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2Vzc2lvbkNvbmZpZ0ltcGwgPGVtPlNlc3Npb24gQ29uZmlnPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQ29uZmlnSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRTZXNzaW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFU1NJT05fQ09ORklHID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUaW1lb3V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX0NPTkZJR19fSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlc3Npb24gQ29uZmlnPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQ09ORklHX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlVzZXJEYXRhQ29uc3RyYWludEltcGwgPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFVzZXJEYXRhQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVU0VSX0RBVEFfQ09OU1RSQUlOVCA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVTRVJfREFUQV9DT05TVFJBSU5UX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVVNFUl9EQVRBX0NPTlNUUkFJTlRfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCA8ZW0+QXBwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXRUJfQVBQID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0RFU0NSSVBUSU9OUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fRElTUExBWV9OQU1FUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0lDT05TID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXN0cmlidXRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fRElTVFJJQlVUQUJMRVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19DT05URVhUX1BBUkFNUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fRklMVEVSUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19GSUxURVJfTUFQUElOR1MgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fTElTVEVORVJTID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fU0VSVkxFVFMgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXNzaW9uIENvbmZpZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX1NFU1NJT05fQ09ORklHUyA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbWUgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX01JTUVfTUFQUElOR1MgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWxjb21lIEZpbGUgTGlzdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX1dFTENPTUVfRklMRV9MSVNUUyA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVycm9yIFBhZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19FUlJPUl9QQUdFUyA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpzcCBDb25maWdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19KU1BfQ09ORklHUyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19TRUNVUklUWV9DT05TVFJBSU5UUyA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvZ2luIENvbmZpZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0xPR0lOX0NPTkZJR1MgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVMgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fRU5WX0VOVFJJRVMgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fRUpCX1JFRlMgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlMgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX1NFUlZJQ0VfUkVGUyA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX1JFU09VUkNFX1JFRlMgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fUkVTT1VSQ0VfRU5WX1JFRlMgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX1BPU1RfQ09OU1RSVUNUUyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fUFJFX0RFU1RST1lTID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3MgTGlzdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19JRCA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fTUVUQURBVEFfQ09NUExFVEUgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fVkVSU0lPTiA9IDM0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX0ZFQVRVUkVfQ09VTlQgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9BUFAgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCA8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT04gPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgUmVzb3VyY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh0dHAgTWV0aG9kczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSUQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlc291cmNlIENvbGxlY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2VsY29tZUZpbGVMaXN0SW1wbCA8ZW0+V2VsY29tZSBGaWxlIExpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlbGNvbWVGaWxlTGlzdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2VsY29tZUZpbGVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdFTENPTUVfRklMRV9MSVNUID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2VsY29tZSBGaWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VMQ09NRV9GSUxFX0xJU1RfX1dFTENPTUVfRklMRVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VMQ09NRV9GSUxFX0xJU1RfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfTElTVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGUgPGVtPkRpc3BhdGNoZXIgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0RGlzcGF0Y2hlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElTUEFUQ0hFUl9UWVBFID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk51bGxDaGFyVHlwZSA8ZW0+TnVsbCBDaGFyIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk51bGxDaGFyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXROdWxsQ2hhclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTlVMTF9DSEFSX1RZUEUgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlIDxlbT5BcHAgVmVyc2lvbiBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRXZWJBcHBWZXJzaW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXRUJfQVBQX1ZFUlNJT05fVFlQRSA9IDIxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5BdXRoIE1ldGhvZCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRBdXRoTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBVVRIX01FVEhPRF9UWVBFID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRpc3BhdGNoZXIgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5EaXNwYXRjaGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXREaXNwYXRjaGVyVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNQQVRDSEVSX1RZUEVfT0JKRUNUID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVuY29kaW5nIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEVuY29kaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTkNPRElOR19UWVBFID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVycm9yIENvZGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEVycm9yQ29kZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVJST1JfQ09ERV9UWVBFID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkZpbHRlciBOYW1lIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEZpbHRlck5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEZJTFRFUl9OQU1FX1RZUEUgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHR0cCBNZXRob2QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0SHR0cE1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFRUUF9NRVRIT0RfVFlQRSA9IDI3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Mb2FkIE9uIFN0YXJ0dXAgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TG9hZE9uU3RhcnR1cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTE9BRF9PTl9TVEFSVFVQX1RZUEUgPSAyODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TG9jYWxlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldExvY2FsZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTE9DQUxFX1RZUEUgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWltZSBUeXBlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE1pbWVUeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSU1FX1RZUEVfVFlQRSA9IDMwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Ob24gRW1wdHkgU3RyaW5nIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE5vbkVtcHR5U3RyaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOT05fRU1QVFlfU1RSSU5HX1RZUEUgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TnVsbCBDaGFyIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTnVsbENoYXJUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE51bGxDaGFyVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOVUxMX0NIQVJfVFlQRV9PQkpFQ1QgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2VydmxldCBOYW1lIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFNlcnZsZXROYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWTEVUX05BTUVfVFlQRSA9IDMzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRV9PQkpFQ1QgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+V2FyIFBhdGggVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2FyUGF0aFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0FSX1BBVEhfVFlQRSA9IDM1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5BcHAgVmVyc2lvbiBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYkFwcFZlcnNpb25UeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdFQl9BUFBfVkVSU0lPTl9UWVBFX09CSkVDVCA9IDM2OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCA8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF1dGggQ29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBdXRoQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEF1dGhDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCNnZXRSb2xlTmFtZXMgPGVtPlJvbGUgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJvbGUgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCNnZXRSb2xlTmFtZXMoKQotCSAqIEBzZWUgI2dldEF1dGhDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdXRoQ29uc3RyYWludF9Sb2xlTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQXV0aENvbnN0cmFpbnQjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0QXV0aENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF1dGhDb25zdHJhaW50X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UgPGVtPkVycm9yIFBhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXJyb3JQYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSNnZXRFcnJvckNvZGUgPGVtPkVycm9yIENvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FcnJvciBDb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlI2dldEVycm9yQ29kZSgpCi0JICogQHNlZSAjZ2V0RXJyb3JQYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFcnJvclBhZ2VfRXJyb3JDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZSNnZXRFeGNlcHRpb25UeXBlIDxlbT5FeGNlcHRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlI2dldEV4Y2VwdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldEVycm9yUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXJyb3JQYWdlX0V4Y2VwdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlI2dldExvY2F0aW9uKCkKLQkgKiBAc2VlICNnZXRFcnJvclBhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVycm9yUGFnZV9Mb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEVycm9yUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXJyb3JQYWdlX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIgPGVtPkZpbHRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GaWx0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEZpbHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0RmlsdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWx0ZXJfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBzZWUgI2dldEZpbHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmlsdGVyX0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkljb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldEljb25zKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpbHRlcl9JY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0RmlsdGVyTmFtZSA8ZW0+RmlsdGVyIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWx0ZXIgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRGaWx0ZXJOYW1lKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbHRlcl9GaWx0ZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRGaWx0ZXJDbGFzcyA8ZW0+RmlsdGVyIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmlsdGVyIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldEZpbHRlckNsYXNzKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbHRlcl9GaWx0ZXJDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0SW5pdFBhcmFtcygpCi0JICogQHNlZSAjZ2V0RmlsdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWx0ZXJfSW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEZpbHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsdGVyX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nIDxlbT5GaWx0ZXIgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GaWx0ZXIgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEZpbHRlck1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyNnZXRGaWx0ZXJOYW1lIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbHRlciBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyNnZXRGaWx0ZXJOYW1lKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXJNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlck5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXJNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyNnZXRVcmxQYXR0ZXJucyA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5VcmwgUGF0dGVybnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldFVybFBhdHRlcm5zKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXJNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWx0ZXJNYXBwaW5nX1VybFBhdHRlcm5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyNnZXRTZXJ2bGV0TmFtZXMgPGVtPlNlcnZsZXQgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlNlcnZsZXQgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldFNlcnZsZXROYW1lcygpCi0JICogQHNlZSAjZ2V0RmlsdGVyTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsdGVyTWFwcGluZ19TZXJ2bGV0TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldERpc3BhdGNoZXJzIDxlbT5EaXNwYXRjaGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RGlzcGF0Y2hlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldERpc3BhdGNoZXJzKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXJNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX0Rpc3BhdGNoZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRGaWx0ZXJNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcgPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRm9ybUxvZ2luQ29uZmlnCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRGb3JtTG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRm9ybUxvZ2luQ29uZmlnI2dldEZvcm1Mb2dpblBhZ2UgPGVtPkZvcm0gTG9naW4gUGFnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZvcm0gTG9naW4gUGFnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZyNnZXRGb3JtTG9naW5QYWdlKCkKLQkgKiBAc2VlICNnZXRGb3JtTG9naW5Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtTG9naW5QYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZyNnZXRGb3JtRXJyb3JQYWdlIDxlbT5Gb3JtIEVycm9yIFBhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Gb3JtIEVycm9yIFBhZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcjZ2V0Rm9ybUVycm9yUGFnZSgpCi0JICogQHNlZSAjZ2V0Rm9ybUxvZ2luQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGb3JtTG9naW5Db25maWdfRm9ybUVycm9yUGFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldEZvcm1Mb2dpbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Rm9ybUxvZ2luQ29uZmlnX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmcgPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nI2dldExvY2FsZSA8ZW0+TG9jYWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nI2dldExvY2FsZSgpCi0JICogQHNlZSAjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZyNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbmNvZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZyNnZXRFbmNvZGluZygpCi0JICogQHNlZSAjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExvY2FsZUVuY29kaW5nTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCA8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0I2dldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdF9Mb2NhbEVuY29kaW5nTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QjZ2V0SWQoKQotCSAqIEBzZWUgI2dldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnIDxlbT5Mb2dpbiBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldEF1dGhNZXRob2QgPGVtPkF1dGggTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aCBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZyNnZXRBdXRoTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRMb2dpbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9naW5Db25maWdfQXV0aE1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZyNnZXRSZWFsbU5hbWUgPGVtPlJlYWxtIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWFsbSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcjZ2V0UmVhbG1OYW1lKCkKLQkgKiBAc2VlICNnZXRMb2dpbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldEZvcm1Mb2dpbkNvbmZpZyA8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldEZvcm1Mb2dpbkNvbmZpZygpCi0JICogQHNlZSAjZ2V0TG9naW5Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExvZ2luQ29uZmlnX0Zvcm1Mb2dpbkNvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnI2dldElkKCkKLQkgKiBAc2VlICNnZXRMb2dpbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9naW5Db25maWdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk1pbWVNYXBwaW5nIDxlbT5NaW1lIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWltZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1pbWVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk1pbWVNYXBwaW5nI2dldEV4dGVuc2lvbiA8ZW0+RXh0ZW5zaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXh0ZW5zaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcjZ2V0RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNnZXRNaW1lTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk1pbWVNYXBwaW5nI2dldE1pbWVUeXBlIDxlbT5NaW1lIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZyNnZXRNaW1lVHlwZSgpCi0JICogQHNlZSAjZ2V0TWltZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1pbWVNYXBwaW5nX01pbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk1pbWVNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldE1pbWVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNaW1lTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50IDxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlY3VyaXR5Q29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eUNvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucyA8ZW0+V2ViIFJlc291cmNlIENvbGxlY3Rpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0QXV0aENvbnN0cmFpbnQgPGVtPkF1dGggQ29uc3RyYWludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkF1dGggQ29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRBdXRoQ29uc3RyYWludCgpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50I2dldFVzZXJEYXRhQ29uc3RyYWludCA8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCNnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5Q29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5Q29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlDb25zdHJhaW50X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0IDxlbT5TZXJ2bGV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZsZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZXJ2bGV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFNlcnZsZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0U2VydmxldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmxldF9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldEljb25zKCkKLQkgKiBAc2VlICNnZXRTZXJ2bGV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0U2VydmxldE5hbWUgPGVtPlNlcnZsZXQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZsZXQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0U2VydmxldE5hbWUoKQotCSAqIEBzZWUgI2dldFNlcnZsZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZsZXRfU2VydmxldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRTZXJ2bGV0Q2xhc3MgPGVtPlNlcnZsZXQgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2bGV0IENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRTZXJ2bGV0Q2xhc3MoKQotCSAqIEBzZWUgI2dldFNlcnZsZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZsZXRfU2VydmxldENsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0SnNwRmlsZSA8ZW0+SnNwIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Kc3AgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0SnNwRmlsZSgpCi0JICogQHNlZSAjZ2V0U2VydmxldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldF9Kc3BGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldEluaXRQYXJhbXMoKQotCSAqIEBzZWUgI2dldFNlcnZsZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRfSW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldExvYWRPblN0YXJ0dXAgPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0TG9hZE9uU3RhcnR1cCgpCi0JICogQHNlZSAjZ2V0U2VydmxldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldF9Mb2FkT25TdGFydHVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0UnVuQXMgPGVtPlJ1biBBczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJ1biBBczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0UnVuQXMoKQotCSAqIEBzZWUgI2dldFNlcnZsZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRfUnVuQXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldFNlY3VyaXR5Um9sZVJlZnMgPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRTZWN1cml0eVJvbGVSZWZzKCkKLQkgKiBAc2VlICNnZXRTZXJ2bGV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlcnZsZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZsZXRfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nIDxlbT5TZXJ2bGV0IE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlcnZsZXRNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nI2dldFNlcnZsZXROYW1lIDxlbT5TZXJ2bGV0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2bGV0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyNnZXRTZXJ2bGV0TmFtZSgpCi0JICogQHNlZSAjZ2V0U2VydmxldE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcjZ2V0VXJsUGF0dGVybnMgPGVtPlVybCBQYXR0ZXJuczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VXJsIFBhdHRlcm5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcjZ2V0VXJsUGF0dGVybnMoKQotCSAqIEBzZWUgI2dldFNlcnZsZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRTZXJ2bGV0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldE1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcgPGVtPlNlc3Npb24gQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlc3Npb24gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2Vzc2lvbkNvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnI2dldFNlc3Npb25UaW1lb3V0IDxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnI2dldFNlc3Npb25UaW1lb3V0KCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQ29uZmlnX1Nlc3Npb25UaW1lb3V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnI2dldElkKCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQ29uZmlnX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQgPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVXNlckRhdGFDb25zdHJhaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFVzZXJEYXRhQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0VHJhbnNwb3J0R3VhcmFudGVlIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludCNnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI2dldFVzZXJEYXRhQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFVzZXJEYXRhQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VXNlckRhdGFDb25zdHJhaW50X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgPGVtPkFwcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcHA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYkFwcF9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkljb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEljb25zKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9JY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXREaXN0cmlidXRhYmxlcyA8ZW0+RGlzdHJpYnV0YWJsZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3RyaWJ1dGFibGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldERpc3RyaWJ1dGFibGVzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9EaXN0cmlidXRhYmxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRDb250ZXh0UGFyYW1zIDxlbT5Db250ZXh0IFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGV4dCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0Q29udGV4dFBhcmFtcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRGaWx0ZXJzIDxlbT5GaWx0ZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5GaWx0ZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEZpbHRlcnMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ZpbHRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RmlsdGVyTWFwcGluZ3MgPGVtPkZpbHRlciBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RmlsdGVyIE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEZpbHRlck1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRMaXN0ZW5lcnMgPGVtPkxpc3RlbmVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldExpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlcnZsZXRzIDxlbT5TZXJ2bGV0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmxldHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2VydmxldHMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlcnZsZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlcnZsZXRNYXBwaW5ncyA8ZW0+U2VydmxldCBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmxldCBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZXJ2bGV0TWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZXNzaW9uQ29uZmlncyA8ZW0+U2Vzc2lvbiBDb25maWdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXNzaW9uIENvbmZpZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2Vzc2lvbkNvbmZpZ3MoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1Nlc3Npb25Db25maWdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldE1pbWVNYXBwaW5ncyA8ZW0+TWltZSBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWltZSBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRNaW1lTWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRXZWxjb21lRmlsZUxpc3RzIDxlbT5XZWxjb21lIEZpbGUgTGlzdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlbGNvbWUgRmlsZSBMaXN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRXZWxjb21lRmlsZUxpc3RzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9XZWxjb21lRmlsZUxpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEVycm9yUGFnZXMgPGVtPkVycm9yIFBhZ2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FcnJvciBQYWdlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRFcnJvclBhZ2VzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9FcnJvclBhZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEpzcENvbmZpZ3MgPGVtPkpzcCBDb25maWdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Kc3AgQ29uZmlnczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRKc3BDb25maWdzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9Kc3BDb25maWdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFNlY3VyaXR5Q29uc3RyYWludHMgPGVtPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZWN1cml0eUNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9TZWN1cml0eUNvbnN0cmFpbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldExvZ2luQ29uZmlncyA8ZW0+TG9naW4gQ29uZmlnczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TG9naW4gQ29uZmlnczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRMb2dpbkNvbmZpZ3MoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xvZ2luQ29uZmlncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2VjdXJpdHlSb2xlcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW52IEVudHJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RW52RW50cmllcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfRW52RW50cmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RWpiUmVmcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfRWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRFamJMb2NhbFJlZnMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0VqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRSZXNvdXJjZVJlZnMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1Jlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRSZXNvdXJjZUVudlJlZnMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1Jlc291cmNlRW52UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfUGVyc2lzdGVuY2VVbml0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0UG9zdENvbnN0cnVjdHMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1Bvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZSBEZXN0cm95czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRQcmVEZXN0cm95cygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfUHJlRGVzdHJveXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldElkKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYkFwcF9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWJBcHBfTWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWJBcHBfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IgPGVtPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRNaXhlZCgpCi0JICogQHNlZSAjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAc2VlICNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRXZWJBcHAgPGVtPldlYiBBcHA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5XZWIgQXBwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0V2ViQXBwKCkKLQkgKiBAc2VlICNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfV2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24gPGVtPlJlc291cmNlIENvbGxlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRXZWJSZXNvdXJjZU5hbWUgPGVtPldlYiBSZXNvdXJjZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V2ViIFJlc291cmNlIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0V2ViUmVzb3VyY2VOYW1lKCkKLQkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRVcmxQYXR0ZXJucyA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5VcmwgUGF0dGVybnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0VXJsUGF0dGVybnMoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldEh0dHBNZXRob2RzIDxlbT5IdHRwIE1ldGhvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkh0dHAgTWV0aG9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRIdHRwTWV0aG9kcygpCi0JICogQHNlZSAjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldElkKCkKLQkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0IDxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlbGNvbWVGaWxlTGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V2VsY29tZUZpbGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0I2dldFdlbGNvbWVGaWxlcyA8ZW0+V2VsY29tZSBGaWxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+V2VsY29tZSBGaWxlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlbGNvbWVGaWxlTGlzdCNnZXRXZWxjb21lRmlsZXMoKQotCSAqIEBzZWUgI2dldFdlbGNvbWVGaWxlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2VsY29tZUZpbGVMaXN0X1dlbGNvbWVGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3QjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3QjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFdlbGNvbWVGaWxlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2VsY29tZUZpbGVMaXN0X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlIDxlbT5EaXNwYXRjaGVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5EaXNwYXRjaGVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5EaXNwYXRjaGVyVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREaXNwYXRjaGVyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5OdWxsQ2hhclR5cGUgPGVtPk51bGwgQ2hhciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+TnVsbCBDaGFyIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5OdWxsQ2hhclR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0TnVsbENoYXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZSA8ZW0+QXBwIFZlcnNpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkFwcCBWZXJzaW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRXZWJBcHBWZXJzaW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkF1dGggTWV0aG9kIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkF1dGggTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRBdXRoTWV0aG9kVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlIDxlbT5EaXNwYXRjaGVyIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EaXNwYXRjaGVyIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldERpc3BhdGNoZXJUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+RW5jb2RpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RW5jb2RpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVuY29kaW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5FcnJvciBDb2RlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkVycm9yIENvZGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFcnJvckNvZGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+RmlsdGVyIE5hbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RmlsdGVyIE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZpbHRlck5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHR0cCBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHR0cCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh0dHBNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLk9iamVjdCA8ZW0+TG9hZCBPbiBTdGFydHVwIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxvYWQgT24gU3RhcnR1cCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TG9hZE9uU3RhcnR1cFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Mb2NhbGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TG9jYWxlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRMb2NhbGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TWltZSBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk1pbWUgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TWltZVR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+Tm9uIEVtcHR5IFN0cmluZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Ob24gRW1wdHkgU3RyaW5nIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXROb25FbXB0eVN0cmluZ1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5OdWxsQ2hhclR5cGUgPGVtPk51bGwgQ2hhciBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TnVsbCBDaGFyIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTnVsbENoYXJUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXROdWxsQ2hhclR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5TZXJ2bGV0IE5hbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U2VydmxldCBOYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTZXJ2bGV0TmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPldhciBQYXRoIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPldhciBQYXRoIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXYXJQYXRoVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlIDxlbT5BcHAgVmVyc2lvbiBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QXBwIFZlcnNpb24gVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0V2ViQXBwVmVyc2lvblR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYkZhY3RvcnkgZ2V0V2ViRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5BdXRoQ29uc3RyYWludEltcGwgPGVtPkF1dGggQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQXV0aENvbnN0cmFpbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRBdXRoQ29uc3RyYWludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBVVRIX0NPTlNUUkFJTlQgPSBlSU5TVEFOQ0UuZ2V0QXV0aENvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBVVRIX0NPTlNUUkFJTlRfX1JPTEVfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0QXV0aENvbnN0cmFpbnRfUm9sZU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFVVEhfQ09OU1RSQUlOVF9fSUQgPSBlSU5TVEFOQ0UuZ2V0QXV0aENvbnN0cmFpbnRfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRXJyb3JQYWdlSW1wbCA8ZW0+RXJyb3IgUGFnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRXJyb3JQYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0RXJyb3JQYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVSUk9SX1BBR0UgPSBlSU5TVEFOQ0UuZ2V0RXJyb3JQYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FcnJvciBDb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVJST1JfUEFHRV9fRVJST1JfQ09ERSA9IGVJTlNUQU5DRS5nZXRFcnJvclBhZ2VfRXJyb3JDb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNlcHRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldEVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVSUk9SX1BBR0VfX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldEVycm9yUGFnZV9Mb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFUlJPUl9QQUdFX19JRCA9IGVJTlNUQU5DRS5nZXRFcnJvclBhZ2VfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVySW1wbCA8ZW0+RmlsdGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRGaWx0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRklMVEVSID0gZUlOU1RBTkNFLmdldEZpbHRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGSUxURVJfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGSUxURVJfX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyX0Rpc3BsYXlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJTFRFUl9fSUNPTlMgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyX0ljb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTFRFUl9fRklMVEVSX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyX0ZpbHRlck5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbHRlciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTFRFUl9fRklMVEVSX0NMQVNTID0gZUlOU1RBTkNFLmdldEZpbHRlcl9GaWx0ZXJDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJTFRFUl9fSU5JVF9QQVJBTVMgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyX0luaXRQYXJhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMVEVSX19JRCA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRmlsdGVyTWFwcGluZ0ltcGwgPGVtPkZpbHRlciBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0RmlsdGVyTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBGSUxURVJfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTFRFUl9NQVBQSU5HX19GSUxURVJfTkFNRSA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlck5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUxURVJfTUFQUElOR19fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyTWFwcGluZ19Hcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXJsIFBhdHRlcm5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk5TID0gZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTFRFUl9NQVBQSU5HX19TRVJWTEVUX05BTUVTID0gZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfU2VydmxldE5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJTID0gZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMVEVSX01BUFBJTkdfX0lEID0gZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRm9ybUxvZ2luQ29uZmlnSW1wbCA8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZvcm1Mb2dpbkNvbmZpZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEZvcm1Mb2dpbkNvbmZpZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBGT1JNX0xPR0lOX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRGb3JtTG9naW5Db25maWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZvcm0gTG9naW4gUGFnZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0UgPSBlSU5TVEFOQ0UuZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1Mb2dpblBhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZvcm0gRXJyb3IgUGFnZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0UgPSBlSU5TVEFOQ0UuZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1FcnJvclBhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRk9STV9MT0dJTl9DT05GSUdfX0lEID0gZUlOU1RBTkNFLmdldEZvcm1Mb2dpbkNvbmZpZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsIDxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9jYWxlRW5jb2RpbmdNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExPQ0FMRV9FTkNPRElOR19NQVBQSU5HID0gZUlOU1RBTkNFLmdldExvY2FsZUVuY29kaW5nTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRSA9IGVJTlNUQU5DRS5nZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORyA9IGVJTlNUQU5DRS5nZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0lEID0gZUlOU1RBTkNFLmdldExvY2FsZUVuY29kaW5nTWFwcGluZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0SW1wbCA8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVCA9IGVJTlNUQU5DRS5nZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdF9Mb2NhbEVuY29kaW5nTWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fSUQgPSBlSU5TVEFOQ0UuZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Mb2dpbkNvbmZpZ0ltcGwgPGVtPkxvZ2luIENvbmZpZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTG9naW5Db25maWdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRMb2dpbkNvbmZpZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMT0dJTl9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0TG9naW5Db25maWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGggTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFsbSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FID0gZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX1JlYWxtTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Rm9ybSBMb2dpbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBMT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHID0gZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX0Zvcm1Mb2dpbkNvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMT0dJTl9DT05GSUdfX0lEID0gZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk1pbWVNYXBwaW5nSW1wbCA8ZW0+TWltZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5NaW1lTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE1pbWVNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1JTUVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRNaW1lTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUlNRV9NQVBQSU5HX19FWFRFTlNJT04gPSBlSU5TVEFOQ0UuZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNSU1FX01BUFBJTkdfX01JTUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRNaW1lTWFwcGluZ19NaW1lVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNSU1FX01BUFBJTkdfX0lEID0gZUlOU1RBTkNFLmdldE1pbWVNYXBwaW5nX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Q29uc3RyYWludEltcGwgPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Q29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFNlY3VyaXR5Q29uc3RyYWludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRUNVUklUWV9DT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Q29uc3RyYWludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUyA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgUmVzb3VyY2UgQ29sbGVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUyA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aCBDb25zdHJhaW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0lEID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Q29uc3RyYWludF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCA8ZW0+U2VydmxldDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFNlcnZsZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VSVkxFVCA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZMRVRfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9fRElTUExBWV9OQU1FUyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X0Rpc3BsYXlOYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZMRVRfX0lDT05TID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZMRVRfX1NFUlZMRVRfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkxFVF9fU0VSVkxFVF9DTEFTUyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X1NlcnZsZXRDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SnNwIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWTEVUX19KU1BfRklMRSA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X0pzcEZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWTEVUX19JTklUX1BBUkFNUyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X0luaXRQYXJhbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvYWQgT24gU3RhcnR1cDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZMRVRfX0xPQURfT05fU1RBUlRVUCA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJ1biBBczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZMRVRfX1JVTl9BUyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X1J1bkFzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkxFVF9fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TWFwcGluZ0ltcGwgPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldE1hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRTZXJ2bGV0TWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVJWTEVUX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldE1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZMRVRfTUFQUElOR19fU0VSVkxFVF9OQU1FID0gZUlOU1RBTkNFLmdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk5TID0gZUlOU1RBTkNFLmdldFNlcnZsZXRNYXBwaW5nX1VybFBhdHRlcm5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZMRVRfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldE1hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2Vzc2lvbkNvbmZpZ0ltcGwgPGVtPlNlc3Npb24gQ29uZmlnPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQ29uZmlnSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0U2Vzc2lvbkNvbmZpZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVNTSU9OX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXNzaW9uIFRpbWVvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUID0gZUlOU1RBTkNFLmdldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9DT05GSUdfX0lEID0gZUlOU1RBTkNFLmdldFNlc3Npb25Db25maWdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuVXNlckRhdGFDb25zdHJhaW50SW1wbCA8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlVzZXJEYXRhQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFVzZXJEYXRhQ29uc3RyYWludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBVU0VSX0RBVEFfQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUUgPSBlSU5TVEFOQ0UuZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fSUQgPSBlSU5TVEFOQ0UuZ2V0VXNlckRhdGFDb25zdHJhaW50X0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwgPGVtPkFwcDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2ViQXBwKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFQl9BUFAgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX0FQUF9fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0dyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9EaXNwbGF5TmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19JQ09OUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3RyaWJ1dGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19ESVNUUklCVVRBQkxFUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfRGlzdHJpYnV0YWJsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19DT05URVhUX1BBUkFNUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fRklMVEVSUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfRmlsdGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19GSUxURVJfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfTGlzdGVuZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fU0VSVkxFVFMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlcnZsZXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlc3Npb24gQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fU0VTU0lPTl9DT05GSUdTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9TZXNzaW9uQ29uZmlncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWltZSBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fTUlNRV9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfTWltZU1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWxjb21lIEZpbGUgTGlzdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1dFTENPTUVfRklMRV9MSVNUUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfV2VsY29tZUZpbGVMaXN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXJyb3IgUGFnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0VSUk9SX1BBR0VTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9FcnJvclBhZ2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Kc3AgQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fSlNQX0NPTkZJR1MgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0pzcENvbmZpZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19TRUNVUklUWV9DT05TVFJBSU5UUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfU2VjdXJpdHlDb25zdHJhaW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9naW4gQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fTE9HSU5fQ09ORklHUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfTG9naW5Db25maWdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19FTlZfRU5UUklFUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfRW52RW50cmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0VKQl9SRUZTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9FamJSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0VqYkxvY2FsUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19TRVJWSUNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlcnZpY2VSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19SRVNPVVJDRV9SRUZTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9SZXNvdXJjZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1BPU1RfQ09OU1RSVUNUUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfUG9zdENvbnN0cnVjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fUFJFX0RFU1RST1lTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9QcmVEZXN0cm95cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TID0gZUlOU1RBTkNFLmdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1NfTElTVFMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9BUFBfX0lEID0gZUlOU1RBTkNFLmdldFdlYkFwcF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfQVBQX19NRVRBREFUQV9DT01QTEVURSA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfTWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9BUFBfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1ZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsIDxlbT5BcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEID0gZUlOU1RBTkNFLmdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVAgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIEFwcDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQID0gZUlOU1RBTkNFLmdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1dlYkFwcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsIDxlbT5SZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0VCX1JFU09VUkNFX0NPTExFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgUmVzb3VyY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRSA9IGVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fV2ViUmVzb3VyY2VOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXJsIFBhdHRlcm5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk5TID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SHR0cCBNZXRob2RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RTID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSUQgPSBlSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlbGNvbWVGaWxlTGlzdEltcGwgPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWxjb21lRmlsZUxpc3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRXZWxjb21lRmlsZUxpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0VMQ09NRV9GSUxFX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0V2VsY29tZUZpbGVMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWxjb21lIEZpbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUxDT01FX0ZJTEVfTElTVF9fV0VMQ09NRV9GSUxFUyA9IGVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZUxpc3RfV2VsY29tZUZpbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFTENPTUVfRklMRV9MSVNUX19JRCA9IGVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZUxpc3RfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlIDxlbT5EaXNwYXRjaGVyIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXREaXNwYXRjaGVyVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIERJU1BBVENIRVJfVFlQRSA9IGVJTlNUQU5DRS5nZXREaXNwYXRjaGVyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTnVsbENoYXJUeXBlIDxlbT5OdWxsIENoYXIgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTnVsbENoYXJUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXROdWxsQ2hhclR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBOVUxMX0NIQVJfVFlQRSA9IGVJTlNUQU5DRS5nZXROdWxsQ2hhclR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZSA8ZW0+QXBwIFZlcnNpb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYkFwcFZlcnNpb25UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gV0VCX0FQUF9WRVJTSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwVmVyc2lvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkF1dGggTWV0aG9kIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRBdXRoTWV0aG9kVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBBVVRIX01FVEhPRF9UWVBFID0gZUlOU1RBTkNFLmdldEF1dGhNZXRob2RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5EaXNwYXRjaGVyIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldERpc3BhdGNoZXJUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIERJU1BBVENIRVJfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0RGlzcGF0Y2hlclR5cGVPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkVuY29kaW5nIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRFbmNvZGluZ1R5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgRU5DT0RJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXRFbmNvZGluZ1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkVycm9yIENvZGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRFcnJvckNvZGVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEVSUk9SX0NPREVfVFlQRSA9IGVJTlNUQU5DRS5nZXRFcnJvckNvZGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5GaWx0ZXIgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0RmlsdGVyTmFtZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgRklMVEVSX05BTUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJOYW1lVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+SHR0cCBNZXRob2QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEh0dHBNZXRob2RUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEhUVFBfTUVUSE9EX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SHR0cE1ldGhvZFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkxvYWQgT24gU3RhcnR1cCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TG9hZE9uU3RhcnR1cFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgTE9BRF9PTl9TVEFSVFVQX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TG9hZE9uU3RhcnR1cFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkxvY2FsZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TG9jYWxlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBMT0NBTEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRMb2NhbGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5NaW1lIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE1pbWVUeXBlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBNSU1FX1RZUEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRNaW1lVHlwZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPk5vbiBFbXB0eSBTdHJpbmcgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE5vbkVtcHR5U3RyaW5nVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBOT05fRU1QVFlfU1RSSU5HX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Tm9uRW1wdHlTdHJpbmdUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5OdWxsIENoYXIgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5OdWxsQ2hhclR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE51bGxDaGFyVHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBOVUxMX0NIQVJfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0TnVsbENoYXJUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXJ2bGV0IE5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFNlcnZsZXROYW1lVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBTRVJWTEVUX05BTUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0TmFtZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+V2FyIFBhdGggVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdhclBhdGhUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFdBUl9QQVRIX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V2FyUGF0aFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkFwcCBWZXJzaW9uIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYkFwcFZlcnNpb25UeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFdFQl9BUFBfVkVSU0lPTl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRXZWJBcHBWZXJzaW9uVHlwZU9iamVjdCgpOwotCi0JfQotCi19IC8vV2ViUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNThjODAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBXZWJQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gV2ViUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IFdlYlN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBdXRoQ29uc3RyYWludEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVycm9yUGFnZShFcnJvclBhZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVycm9yUGFnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlcihGaWx0ZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUZpbHRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlck1hcHBpbmcoRmlsdGVyTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRmlsdGVyTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsZUVuY29kaW5nTWFwcGluZyhMb2NhbGVFbmNvZGluZ01hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxvZ2luQ29uZmlnKExvZ2luQ29uZmlnIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb2dpbkNvbmZpZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1pbWVNYXBwaW5nKE1pbWVNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNaW1lTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Q29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXQoU2VydmxldCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmxldEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRNYXBwaW5nKFNlcnZsZXRNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2bGV0TWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2Vzc2lvbkNvbmZpZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYkFwcChXZWJBcHAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYkFwcEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlbGNvbWVGaWxlTGlzdChXZWxjb21lRmlsZUxpc3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlbGNvbWVGaWxlTGlzdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCA8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkF1dGhDb25zdHJhaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF1dGhDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UgPGVtPkVycm9yIFBhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVycm9yUGFnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyIDxlbT5GaWx0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbHRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyA8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWx0ZXJNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Gb3JtTG9naW5Db25maWcgPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZvcm1Mb2dpbkNvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGb3JtTG9naW5Db25maWdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZyA8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCA8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnIDxlbT5Mb2dpbiBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9naW5Db25maWdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk1pbWVNYXBwaW5nIDxlbT5NaW1lIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWltZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCA8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZWN1cml0eUNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0IDxlbT5TZXJ2bGV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcgPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0TWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZyA8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXNzaW9uQ29uZmlnQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Vc2VyRGF0YUNvbnN0cmFpbnQgPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlVzZXJEYXRhQ29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCA8ZW0+QXBwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJBcHBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIDxlbT5BcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24gPGVtPlJlc291cmNlIENvbGxlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0IDxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2VsY29tZUZpbGVMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1dlYkFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjQwMWJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTE9wdGlvbnNJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWwuV2ViUmVzb3VyY2VJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBXZWJSZXNvdXJjZUltcGwodXJpKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9MRVhJQ0FMX0hBTkRMRVIsIEJvb2xlYW4uVFJVRSk7Ci0JCVhNTE9wdGlvbnMgeG1sT3B0aW9ucyA9IG5ldyBYTUxPcHRpb25zSW1wbCgpOwotCi0JCXhtbE9wdGlvbnMuc2V0UHJvY2Vzc1NjaGVtYUxvY2F0aW9ucyh0cnVlKTsKLQkJICAgIAotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9YTUxfT1BUSU9OUywgeG1sT3B0aW9ucyk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL1dlYlJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2RkMWMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTExvYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkpFRVhNTExvYWRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsLkphdmFlZVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklSb290T2JqZWN0UmVzb3VyY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSA8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC51dGlsLldlYlJlc291cmNlRmFjdG9yeUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlJlc291cmNlSW1wbCBleHRlbmRzIEphdmFlZVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIElSb290T2JqZWN0UmVzb3VyY2UsIElXZWJSZXNvdXJjZXsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgewotCQkgcmV0dXJuIG5ldyBKRUVYTUxMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFdlYlhNTEhlbHBlckltcGwodGhpcyk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWwuSVdlYlJlc291cmNlI2dldFJvb3RPYmplY3QoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCWlmIChjb250ZW50cyA9PSBudWxsIHx8IGNvbnRlbnRzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3Qgcm9vdCA9IGdldENvbnRlbnRzKCkuZ2V0KDApOwotCQlpZihyb290ID09IG51bGwpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChFT2JqZWN0KSgoV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3Ipcm9vdCkuZ2V0V2ViQXBwKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWwuSVdlYlJlc291cmNlI2dldFdlYkFwcCgpCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCXJldHVybiAoV2ViQXBwKWdldFJvb3RPYmplY3QoKTsKLQl9Ci0KLX0gLy9XZWJSZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjY4OGJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBXZWJQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFdlYlBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UOiB7Ci0JCQkJQXV0aENvbnN0cmFpbnQgYXV0aENvbnN0cmFpbnQgPSAoQXV0aENvbnN0cmFpbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUF1dGhDb25zdHJhaW50KGF1dGhDb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRTogewotCQkJCUVycm9yUGFnZSBlcnJvclBhZ2UgPSAoRXJyb3JQYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFcnJvclBhZ2UoZXJyb3JQYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSOiB7Ci0JCQkJRmlsdGVyIGZpbHRlciA9IChGaWx0ZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZpbHRlcihmaWx0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElORzogewotCQkJCUZpbHRlck1hcHBpbmcgZmlsdGVyTWFwcGluZyA9IChGaWx0ZXJNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGaWx0ZXJNYXBwaW5nKGZpbHRlck1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJRzogewotCQkJCUZvcm1Mb2dpbkNvbmZpZyBmb3JtTG9naW5Db25maWcgPSAoRm9ybUxvZ2luQ29uZmlnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGb3JtTG9naW5Db25maWcoZm9ybUxvZ2luQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkc6IHsKLQkJCQlMb2NhbGVFbmNvZGluZ01hcHBpbmcgbG9jYWxlRW5jb2RpbmdNYXBwaW5nID0gKExvY2FsZUVuY29kaW5nTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9jYWxlRW5jb2RpbmdNYXBwaW5nKGxvY2FsZUVuY29kaW5nTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1Q6IHsKLQkJCQlMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QgPSAoTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdChsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHOiB7Ci0JCQkJTG9naW5Db25maWcgbG9naW5Db25maWcgPSAoTG9naW5Db25maWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvZ2luQ29uZmlnKGxvZ2luQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HOiB7Ci0JCQkJTWltZU1hcHBpbmcgbWltZU1hcHBpbmcgPSAoTWltZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1pbWVNYXBwaW5nKG1pbWVNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVDogewotCQkJCVNlY3VyaXR5Q29uc3RyYWludCBzZWN1cml0eUNvbnN0cmFpbnQgPSAoU2VjdXJpdHlDb25zdHJhaW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZWN1cml0eUNvbnN0cmFpbnQoc2VjdXJpdHlDb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVDogewotCQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2bGV0KHNlcnZsZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkc6IHsKLQkJCQlTZXJ2bGV0TWFwcGluZyBzZXJ2bGV0TWFwcGluZyA9IChTZXJ2bGV0TWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmxldE1hcHBpbmcoc2VydmxldE1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJRzogewotCQkJCVNlc3Npb25Db25maWcgc2Vzc2lvbkNvbmZpZyA9IChTZXNzaW9uQ29uZmlnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXNzaW9uQ29uZmlnKHNlc3Npb25Db25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVDogewotCQkJCVVzZXJEYXRhQ29uc3RyYWludCB1c2VyRGF0YUNvbnN0cmFpbnQgPSAoVXNlckRhdGFDb25zdHJhaW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VVc2VyRGF0YUNvbnN0cmFpbnQodXNlckRhdGFDb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUDogewotCQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJBcHAod2ViQXBwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1I6IHsKLQkJCQlXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciB3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciA9IChXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3Iod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTjogewotCQkJCVdlYlJlc291cmNlQ29sbGVjdGlvbiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb24gPSAoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJSZXNvdXJjZUNvbGxlY3Rpb24od2ViUmVzb3VyY2VDb2xsZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1Q6IHsKLQkJCQlXZWxjb21lRmlsZUxpc3Qgd2VsY29tZUZpbGVMaXN0ID0gKFdlbGNvbWVGaWxlTGlzdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2VsY29tZUZpbGVMaXN0KHdlbGNvbWVGaWxlTGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF1dGggQ29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FcnJvciBQYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFcnJvclBhZ2UoRXJyb3JQYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRmlsdGVyKEZpbHRlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGaWx0ZXJNYXBwaW5nKEZpbHRlck1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb2NhbGVFbmNvZGluZ01hcHBpbmcoTG9jYWxlRW5jb2RpbmdNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb2dpbiBDb25maWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbWUgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaW1lIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1pbWVNYXBwaW5nKE1pbWVNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eUNvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2bGV0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0KFNlcnZsZXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2bGV0IE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0TWFwcGluZyhTZXJ2bGV0TWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlc3Npb24gQ29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlc3Npb24gQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXNzaW9uQ29uZmlnKFNlc3Npb25Db25maWcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlYkFwcChXZWJBcHAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJSZXNvdXJjZUNvbGxlY3Rpb24oV2ViUmVzb3VyY2VDb2xsZWN0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VsY29tZSBGaWxlIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VsY29tZSBGaWxlIExpc3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlbGNvbWVGaWxlTGlzdChXZWxjb21lRmlsZUxpc3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1dlYlN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNjllY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpY0NoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS51dGlsLlhNTFR5cGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS51dGlsLlhNTFR5cGVWYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlZhbGlkYXRvcjwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJWYWxpZGF0b3IgZXh0ZW5kcyBFT2JqZWN0VmFsaWRhdG9yIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlZhbGlkYXRvciBJTlNUQU5DRSA9IG5ldyBXZWJWYWxpZGF0b3IoKTsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgZm9yIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0U291cmNlKCkgc291cmNlfSBvZiBkaWFnbm9zdGljIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyNnZXRDb2RlKCkgY29kZXN9IGZyb20gdGhpcyBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyNnZXRTb3VyY2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdOT1NUSUNfU09VUkNFID0gIm9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBjb25zdGFudCB3aXRoIGEgZml4ZWQgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBiYXNlIHZhbHVlIGZvciBhZGRpdGlvbmFsIGhhbmQgd3JpdHRlbiBjb25zdGFudHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFTkVSQVRFRF9ESUFHTk9TVElDX0NPREVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB3aXRoIGEgZml4ZWQgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBiYXNlIHZhbHVlIGZvciBhZGRpdGlvbmFsIGhhbmQgd3JpdHRlbiBjb25zdGFudHMgaW4gYSBkZXJpdmVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERJQUdOT1NUSUNfQ09ERV9DT1VOVCA9IEdFTkVSQVRFRF9ESUFHTk9TVElDX0NPREVfQ09VTlQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIGJhc2UgcGFja2FnZSB2YWxpZGF0b3IuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhNTFR5cGVWYWxpZGF0b3IgeG1sVHlwZVZhbGlkYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCQl4bWxUeXBlVmFsaWRhdG9yID0gWE1MVHlwZVZhbGlkYXRvci5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG9mIHRoaXMgdmFsaWRhdG9yIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JICByZXR1cm4gV2ViUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+dmFsaWRhdGVYWFg8L2NvZGU+IGZvciB0aGUgY29ycmVzb25kaW5nIGNsYXNzaWZpZXIgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKGludCBjbGFzc2lmaWVySUQsIE9iamVjdCB2YWx1ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBdXRoQ29uc3RyYWludCgoQXV0aENvbnN0cmFpbnQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFOgotCQkJCXJldHVybiB2YWxpZGF0ZUVycm9yUGFnZSgoRXJyb3JQYWdlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSOgotCQkJCXJldHVybiB2YWxpZGF0ZUZpbHRlcigoRmlsdGVyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkc6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRmlsdGVyTWFwcGluZygoRmlsdGVyTWFwcGluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHOgotCQkJCXJldHVybiB2YWxpZGF0ZUZvcm1Mb2dpbkNvbmZpZygoRm9ybUxvZ2luQ29uZmlnKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkc6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nKChMb2NhbGVFbmNvZGluZ01hcHBpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUOgotCQkJCXJldHVybiB2YWxpZGF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTG9naW5Db25maWcoKExvZ2luQ29uZmlnKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HOgotCQkJCXJldHVybiB2YWxpZGF0ZU1pbWVNYXBwaW5nKChNaW1lTWFwcGluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VjdXJpdHlDb25zdHJhaW50KChTZWN1cml0eUNvbnN0cmFpbnQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUOgotCQkJCXJldHVybiB2YWxpZGF0ZVNlcnZsZXQoKFNlcnZsZXQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkc6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VydmxldE1hcHBpbmcoKFNlcnZsZXRNYXBwaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUc6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2Vzc2lvbkNvbmZpZygoU2Vzc2lvbkNvbmZpZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCXJldHVybiB2YWxpZGF0ZVVzZXJEYXRhQ29uc3RyYWludCgoVXNlckRhdGFDb25zdHJhaW50KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXZWJBcHAoKFdlYkFwcCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXJldHVybiB2YWxpZGF0ZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKChXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OOgotCQkJCXJldHVybiB2YWxpZGF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV2VsY29tZUZpbGVMaXN0KChXZWxjb21lRmlsZUxpc3QpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5ESVNQQVRDSEVSX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRGlzcGF0Y2hlclR5cGUoKERpc3BhdGNoZXJUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTlVMTF9DSEFSX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTnVsbENoYXJUeXBlKChOdWxsQ2hhclR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHJhbnNwb3J0R3VhcmFudGVlVHlwZSgoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfVkVSU0lPTl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVdlYkFwcFZlcnNpb25UeXBlKChXZWJBcHBWZXJzaW9uVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXV0aE1ldGhvZFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkRJU1BBVENIRVJfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRGlzcGF0Y2hlclR5cGVPYmplY3QoKERpc3BhdGNoZXJUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRU5DT0RJTkdfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFbmNvZGluZ1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX0NPREVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFcnJvckNvZGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVGaWx0ZXJOYW1lVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuSFRUUF9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIdHRwTWV0aG9kVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuTE9BRF9PTl9TVEFSVFVQX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTG9hZE9uU3RhcnR1cFR5cGUodmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVMb2NhbGVUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVNaW1lVHlwZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLk5PTl9FTVBUWV9TVFJJTkdfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOb25FbXB0eVN0cmluZ1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLk5VTExfQ0hBUl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVOdWxsQ2hhclR5cGVPYmplY3QoKE51bGxDaGFyVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTkFNRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVNlcnZsZXROYW1lVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0KChUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0FSX1BBVEhfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXYXJQYXRoVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9WRVJTSU9OX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiB2YWxpZGF0ZVdlYkFwcFZlcnNpb25UeXBlT2JqZWN0KChXZWJBcHBWZXJzaW9uVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJZGVmYXVsdDogCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IGF1dGhDb25zdHJhaW50LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWF1dGhDb25zdHJhaW50LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFcnJvclBhZ2UoRXJyb3JQYWdlIGVycm9yUGFnZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCllcnJvclBhZ2UsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZpbHRlcihGaWx0ZXIgZmlsdGVyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWZpbHRlciwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRmlsdGVyTWFwcGluZyhGaWx0ZXJNYXBwaW5nIGZpbHRlck1hcHBpbmcsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpZmlsdGVyTWFwcGluZywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBmb3JtTG9naW5Db25maWcsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpZm9ybUxvZ2luQ29uZmlnLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMb2NhbGVFbmNvZGluZ01hcHBpbmcoTG9jYWxlRW5jb2RpbmdNYXBwaW5nIGxvY2FsZUVuY29kaW5nTWFwcGluZywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClsb2NhbGVFbmNvZGluZ01hcHBpbmcsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCBsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvZ2luQ29uZmlnKExvZ2luQ29uZmlnIGxvZ2luQ29uZmlnLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWxvZ2luQ29uZmlnLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNaW1lTWFwcGluZyhNaW1lTWFwcGluZyBtaW1lTWFwcGluZywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCltaW1lTWFwcGluZywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VjdXJpdHlDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBzZWN1cml0eUNvbnN0cmFpbnQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpc2VjdXJpdHlDb25zdHJhaW50LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2bGV0KFNlcnZsZXQgc2VydmxldCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZXJ2bGV0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2bGV0TWFwcGluZyhTZXJ2bGV0TWFwcGluZyBzZXJ2bGV0TWFwcGluZywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZXJ2bGV0TWFwcGluZywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIHNlc3Npb25Db25maWcsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpc2Vzc2lvbkNvbmZpZywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCB1c2VyRGF0YUNvbnN0cmFpbnQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpdXNlckRhdGFDb25zdHJhaW50LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWJBcHAoV2ViQXBwIHdlYkFwcCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCl3ZWJBcHAsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHdlYlJlc291cmNlQ29sbGVjdGlvbiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCl3ZWJSZXNvdXJjZUNvbGxlY3Rpb24sIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdlbGNvbWVGaWxlTGlzdChXZWxjb21lRmlsZUxpc3Qgd2VsY29tZUZpbGVMaXN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXdlbGNvbWVGaWxlTGlzdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGlzcGF0Y2hlclR5cGUoRGlzcGF0Y2hlclR5cGUgZGlzcGF0Y2hlclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOdWxsQ2hhclR5cGUoTnVsbENoYXJUeXBlIG51bGxDaGFyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSB0cmFuc3BvcnRHdWFyYW50ZWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2ViQXBwVmVyc2lvblR5cGUoV2ViQXBwVmVyc2lvblR5cGUgd2ViQXBwVmVyc2lvblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBdXRoTWV0aG9kVHlwZShTdHJpbmcgYXV0aE1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEaXNwYXRjaGVyVHlwZU9iamVjdChEaXNwYXRjaGVyVHlwZSBkaXNwYXRjaGVyVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVuY29kaW5nVHlwZShTdHJpbmcgZW5jb2RpbmdUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVFbmNvZGluZ1R5cGVfUGF0dGVybihlbmNvZGluZ1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUVuY29kaW5nVHlwZV9QYXR0ZXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBFTkNPRElOR19UWVBFX19QQVRURVJOX19WQUxVRVMgPQotCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7Ci0JCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCJbXlxcc10rIikKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+RW5jb2RpbmcgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVuY29kaW5nVHlwZV9QYXR0ZXJuKFN0cmluZyBlbmNvZGluZ1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihXZWJQYWNrYWdlLkxpdGVyYWxzLkVOQ09ESU5HX1RZUEUsIGVuY29kaW5nVHlwZSwgRU5DT0RJTkdfVFlQRV9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFcnJvckNvZGVUeXBlKEJpZ0ludGVnZXIgZXJyb3JDb2RlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHhtbFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQb3NpdGl2ZUludGVnZXJfTWluKGVycm9yQ29kZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJaWYgKHJlc3VsdCB8fCBkaWFnbm9zdGljcyAhPSBudWxsKSByZXN1bHQgJj0gdmFsaWRhdGVFcnJvckNvZGVUeXBlX1BhdHRlcm4oZXJyb3JDb2RlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRXJyb3JDb2RlVHlwZV9QYXR0ZXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBFUlJPUl9DT0RFX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUyA9Ci0JCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKLQkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIlxcZHszfSIpCi0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIFBhdHRlcm4gY29uc3RyYWludCBvZiAnPGVtPkVycm9yIENvZGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVycm9yQ29kZVR5cGVfUGF0dGVybihCaWdJbnRlZ2VyIGVycm9yQ29kZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihXZWJQYWNrYWdlLkxpdGVyYWxzLkVSUk9SX0NPREVfVFlQRSwgZXJyb3JDb2RlVHlwZSwgRVJST1JfQ09ERV9UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZpbHRlck5hbWVUeXBlKFN0cmluZyBmaWx0ZXJOYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTm9uRW1wdHlTdHJpbmdUeXBlX01pbkxlbmd0aChmaWx0ZXJOYW1lVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHR0cE1ldGhvZFR5cGUoU3RyaW5nIGh0dHBNZXRob2RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIdHRwTWV0aG9kVHlwZV9QYXR0ZXJuKGh0dHBNZXRob2RUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVIdHRwTWV0aG9kVHlwZV9QYXR0ZXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBIVFRQX01FVEhPRF9UWVBFX19QQVRURVJOX19WQUxVRVMgPQotCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7Ci0JCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCJbXFxwe0x9LVtcXHB7Q2N9XFxwe1p9XV0rIikKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+SHR0cCBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh0dHBNZXRob2RUeXBlX1BhdHRlcm4oU3RyaW5nIGh0dHBNZXRob2RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oV2ViUGFja2FnZS5MaXRlcmFscy5IVFRQX01FVEhPRF9UWVBFLCBodHRwTWV0aG9kVHlwZSwgSFRUUF9NRVRIT0RfVFlQRV9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMb2FkT25TdGFydHVwVHlwZShPYmplY3QgbG9hZE9uU3RhcnR1cFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUxvYWRPblN0YXJ0dXBUeXBlX01lbWJlclR5cGVzKGxvYWRPblN0YXJ0dXBUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNZW1iZXJUeXBlcyBjb25zdHJhaW50IG9mICc8ZW0+TG9hZCBPbiBTdGFydHVwIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMb2FkT25TdGFydHVwVHlwZV9NZW1iZXJUeXBlcyhPYmplY3QgbG9hZE9uU3RhcnR1cFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaWYgKGRpYWdub3N0aWNzICE9IG51bGwpIHsKLQkJCUJhc2ljRGlhZ25vc3RpYyB0ZW1wRGlhZ25vc3RpY3MgPSBuZXcgQmFzaWNEaWFnbm9zdGljKCk7Ci0JCQlpZiAoV2ViUGFja2FnZS5MaXRlcmFscy5OVUxMX0NIQVJfVFlQRS5pc0luc3RhbmNlKGxvYWRPblN0YXJ0dXBUeXBlKSkgewotCQkJCWlmICh2YWxpZGF0ZU51bGxDaGFyVHlwZSgoTnVsbENoYXJUeXBlKWxvYWRPblN0YXJ0dXBUeXBlLCB0ZW1wRGlhZ25vc3RpY3MsIGNvbnRleHQpKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5JTlRFR0VSLmlzSW5zdGFuY2UobG9hZE9uU3RhcnR1cFR5cGUpKSB7Ci0JCQkJaWYgKHhtbFR5cGVWYWxpZGF0b3IudmFsaWRhdGVJbnRlZ2VyKChCaWdJbnRlZ2VyKWxvYWRPblN0YXJ0dXBUeXBlLCB0ZW1wRGlhZ25vc3RpY3MsIGNvbnRleHQpKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCUxpc3QgY2hpbGRyZW4gPSB0ZW1wRGlhZ25vc3RpY3MuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQlkaWFnbm9zdGljcy5hZGQoKERpYWdub3N0aWMpY2hpbGRyZW4uZ2V0KGkpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChXZWJQYWNrYWdlLkxpdGVyYWxzLk5VTExfQ0hBUl9UWVBFLmlzSW5zdGFuY2UobG9hZE9uU3RhcnR1cFR5cGUpKSB7Ci0JCQkJaWYgKHZhbGlkYXRlTnVsbENoYXJUeXBlKChOdWxsQ2hhclR5cGUpbG9hZE9uU3RhcnR1cFR5cGUsIG51bGwsIGNvbnRleHQpKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5JTlRFR0VSLmlzSW5zdGFuY2UobG9hZE9uU3RhcnR1cFR5cGUpKSB7Ci0JCQkJaWYgKHhtbFR5cGVWYWxpZGF0b3IudmFsaWRhdGVJbnRlZ2VyKChCaWdJbnRlZ2VyKWxvYWRPblN0YXJ0dXBUeXBlLCBudWxsLCBjb250ZXh0KSkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTG9jYWxlVHlwZShTdHJpbmcgbG9jYWxlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTG9jYWxlVHlwZV9QYXR0ZXJuKGxvY2FsZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUxvY2FsZVR5cGVfUGF0dGVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gTE9DQUxFX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUyA9Ci0JCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKLQkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIlthLXpdezJ9KF98LSk/KFtcXHB7TH1cXC1cXHB7TmR9XXsyfSk/IikKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+TG9jYWxlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMb2NhbGVUeXBlX1BhdHRlcm4oU3RyaW5nIGxvY2FsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihXZWJQYWNrYWdlLkxpdGVyYWxzLkxPQ0FMRV9UWVBFLCBsb2NhbGVUeXBlLCBMT0NBTEVfVFlQRV9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNaW1lVHlwZVR5cGUoU3RyaW5nIG1pbWVUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTWltZVR5cGVUeXBlX1BhdHRlcm4obWltZVR5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVNaW1lVHlwZVR5cGVfUGF0dGVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gTUlNRV9UWVBFX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUyA9Ci0JCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKLQkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIlteXFxwe0NjfV5cXHNdKy9bXlxccHtDY31eXFxzXSsiKQotCQkJfQotCQl9OwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBQYXR0ZXJuIGNvbnN0cmFpbnQgb2YgJzxlbT5NaW1lIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1pbWVUeXBlVHlwZV9QYXR0ZXJuKFN0cmluZyBtaW1lVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihXZWJQYWNrYWdlLkxpdGVyYWxzLk1JTUVfVFlQRV9UWVBFLCBtaW1lVHlwZVR5cGUsIE1JTUVfVFlQRV9UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5vbkVtcHR5U3RyaW5nVHlwZShTdHJpbmcgbm9uRW1wdHlTdHJpbmdUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOb25FbXB0eVN0cmluZ1R5cGVfTWluTGVuZ3RoKG5vbkVtcHR5U3RyaW5nVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWluTGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5Ob24gRW1wdHkgU3RyaW5nIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOb25FbXB0eVN0cmluZ1R5cGVfTWluTGVuZ3RoKFN0cmluZyBub25FbXB0eVN0cmluZ1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG5vbkVtcHR5U3RyaW5nVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA+PSAxOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1pbkxlbmd0aFZpb2xhdGlvbihXZWJQYWNrYWdlLkxpdGVyYWxzLk5PTl9FTVBUWV9TVFJJTkdfVFlQRSwgbm9uRW1wdHlTdHJpbmdUeXBlLCBsZW5ndGgsIDEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU51bGxDaGFyVHlwZU9iamVjdChOdWxsQ2hhclR5cGUgbnVsbENoYXJUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmxldE5hbWVUeXBlKFN0cmluZyBzZXJ2bGV0TmFtZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5vbkVtcHR5U3RyaW5nVHlwZV9NaW5MZW5ndGgoc2VydmxldE5hbWVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0KFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgdHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdhclBhdGhUeXBlKFN0cmluZyB3YXJQYXRoVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV2FyUGF0aFR5cGVfUGF0dGVybih3YXJQYXRoVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlV2FyUGF0aFR5cGVfUGF0dGVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gV0FSX1BBVEhfVFlQRV9fUEFUVEVSTl9fVkFMVUVTID0KLQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdW10gewotCQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdIHsKLQkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiLy4qIikKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+V2FyIFBhdGggVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdhclBhdGhUeXBlX1BhdHRlcm4oU3RyaW5nIHdhclBhdGhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oV2ViUGFja2FnZS5MaXRlcmFscy5XQVJfUEFUSF9UWVBFLCB3YXJQYXRoVHlwZSwgV0FSX1BBVEhfVFlQRV9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWJBcHBWZXJzaW9uVHlwZU9iamVjdChXZWJBcHBWZXJzaW9uVHlwZSB3ZWJBcHBWZXJzaW9uVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0gLy9XZWJWYWxpZGF0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViWE1MSGVscGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJYTUxIZWxwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MWQzOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJYTUxIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsLkpFRVhNTEhlbHBlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQotcHVibGljIGNsYXNzIFdlYlhNTEhlbHBlckltcGwgZXh0ZW5kcyBKRUVYTUxIZWxwZXJJbXBsIHsKLQotCXB1YmxpYyBXZWJYTUxIZWxwZXJJbXBsKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkkoU3RyaW5nIHByZWZpeCkgewotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygiIikpCi0JCQlyZXR1cm4gV2ViUGFja2FnZS5lTlNfVVJJOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VVJJKHByZWZpeCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRRTmFtZShFUGFja2FnZSBlUGFja2FnZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gbXVzdEhhdmVQcmVmaXgpIHsKLQkJU3RyaW5nIG5zUHJlZml4ID0gZ2V0UHJlZml4KGVQYWNrYWdlLCBtdXN0SGF2ZVByZWZpeCk7Ci0JCS8vIE5vdCB1c2luZyBFRTUgcGFja2FnZSBuYW1lc3BhY2UgLSBkZWZhdWx0IGplZTUgbmFtZXNwYWNlIGlzIHVzZWQKLQkJaWYgKG5zUHJlZml4LmVxdWFscyhXZWJQYWNrYWdlLmVOU19QUkVGSVgpIHx8IG5zUHJlZml4LmVxdWFscyhKc3BQYWNrYWdlLmVOU19QUkVGSVgpKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0UU5hbWUoZVBhY2thZ2UsIG5hbWUsIG11c3RIYXZlUHJlZml4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoRUNsYXNzIGNsYXNzMSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNFbGVtZW50KSB7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdCA9IHN1cGVyLmdldEZlYXR1cmUoY2xhc3MxLCBuYW1lc3BhY2VVUkksIG5hbWUsIGlzRWxlbWVudCk7Ci0JCWlmIChmZWF0ID09IG51bGwpCi0JCQkvL1RyeSB0byB1c2UgSlNQIG5hbWVzcGFjZQotCQkJZmVhdCA9IHN1cGVyLmdldEZlYXR1cmUoY2xhc3MxLCBKc3BQYWNrYWdlLmVOU19VUkksIG5hbWUsIGlzRWxlbWVudCk7Ci0JCXJldHVybiBmZWF0OwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViWE1MUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlhNTFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYThmZjE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViWE1MUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkudXRpbC5YTUxQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVyIG1ldGhvZHMgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBYTUwgZG9jdW1lbnRzCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJYTUxQcm9jZXNzb3IgZXh0ZW5kcyBYTUxQcm9jZXNzb3IgewotCS8qKgotCSAqIFB1YmxpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgaGVscGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJYTUxQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRSkpOwotCQlXZWJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgZm9yICIqIiBhbmQgInhtbCIgZmlsZSBleHRlbnNpb25zIHRoZSBXZWJSZXNvdXJjZUZhY3RvcnlJbXBsIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRSZWdpc3RyYXRpb25zKCkgewotCQlpZiAocmVnaXN0cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRSZWdpc3RyYXRpb25zKCk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChYTUxfRVhURU5TSU9OLCBuZXcgV2ViUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJCXJlZ2lzdHJhdGlvbnMucHV0KFNUQVJfRVhURU5TSU9OLCBuZXcgV2ViUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJfQotCQlyZXR1cm4gcmVnaXN0cmF0aW9uczsKLQl9Ci0KLX0gLy9XZWJYTUxQcm9jZXNzb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9hcHBsaWNhdGlvbi5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9hcHBsaWNhdGlvbi5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5YTdmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvYXBwbGljYXRpb24uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJhcHBsaWNhdGlvbiIKLSAgICBuc1VSST0iYXBwbGljYXRpb24ueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24iPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFwcGxpY2F0aW9uIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhcHBsaWNhdGlvblR5cGUgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHRoZSYjeEQ7JiN4QTthcHBsaWNhdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgJiN4RDsmI3hBO1RoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS40LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN1cml0eVJvbGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGUiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHNlY3VyaXR5IHJvbGVzIHdoaWNoIGFyZSYjeEQ7JiN4QTtnbG9iYWwgdG8gdGhlIGFwcGxpY2F0aW9uLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kdWxlcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Nb2R1bGUiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01vZHVsZS9hcHBsaWNhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZSYjeEQ7JiN4QTsgICAgICAgIG1vZHVsZSBlbGVtZW50IGZvciBlYWNoIEoyRUUgbW9kdWxlIGluIHRoZSYjeEQ7JiN4QTsgICAgICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuIEEgbW9kdWxlIGVsZW1lbnQgaXMgZGVmaW5lZCYjeEQ7JiN4QTsgICAgICAgIGJ5IG1vZHVsZVR5cGUgZGVmaW5pdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTW9kdWxlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtb2R1bGUgZWxlbWVudCByZXByZXNlbnRzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhbiBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4gb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIFVSSSBvZiBhIG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdEREIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gVGhlIFVSSSBtdXN0IHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbidzIHJvb3QgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyIG11c3QgcmVhZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIGRlZmF1bHQgbG9jYXRpb24gYW5kIGZpbGUgbmFtZSByZXF1aXJlZCBieSB0aGUgcmVzcGVjdGl2ZSBjb21wb25lbnQgc3BlY2lmaWNhdGlvbi4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFwcGxpY2F0aW9uIiBlVHlwZT0iIy8vQXBwbGljYXRpb24iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcHBsaWNhdGlvbi9tb2R1bGVzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlYk1vZHVsZSIgZVN1cGVyVHlwZXM9IiMvL01vZHVsZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGFpbnMgdGhlIHdlYi11cmkgYW5kIGNvbnRleHQtcm9vdCBvZiBhIHdlYiBhcHBsaWNhdGlvbiBtb2R1bGUuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb250ZXh0Um9vdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdCBvZiBhIHdlYiBhcHBsaWNhdGlvbiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUNsaWVudE1vZHVsZSIgZVN1cGVyVHlwZXM9IiMvL01vZHVsZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0ic3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBqYXZhIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFamJNb2R1bGUiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgVVJJIG9mIGEgZWpiLWphciwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbm5lY3Rvck1vZHVsZSIgZVN1cGVyVHlwZXM9IiMvL01vZHVsZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBVUkkgb2YgYSByZXNvdXJjZSBhZGFwdGVyIGFyY2hpdmUgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NsaWVudC5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9jbGllbnQuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWNjODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NsaWVudC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImNsaWVudCIKLSAgICBuc1VSST0iY2xpZW50LnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXBwbGljYXRpb25DbGllbnQiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFwcGxpY2F0aW9uLWNsaWVudCBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgRUpCIGNvbXBvbmVudHMgYW5kIGV4dGVybmFsIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuNC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2VSZWZzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9SZXNvdXJjZVJlZiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudHMncyByZWZlcmVuY2VzIHRvIGFuIGV4dGVybmFsIHJlc291cmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW52aXJvbm1lbnRQcm9wcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRW52RW50cnkiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVudi1lbnRyeSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudCBlbnRyaWVzLiBFYWNoIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWpiUmVmZXJlbmNlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRWpiUmVmIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRhaW5zIGEgbGlzdCBvZiBlamItcmVmIGVsZW1lbnRzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlJiN4RDsmI3hBO2JlYW4ncyBob21lLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2VFbnZSZWZzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9SZXNvdXJjZUVudlJlZiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzb3VyY2UtZW52LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwmI3hEOyYjeEE7ZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IGFwcGxpY2F0aW9uLWNsaWVudCYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyZsdDtyZXNvdXJjZS1lbnYtcmVmPiYjeEQ7JiN4QTsgICAgJmx0O3Jlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZSZsdDsvcmVzb3VyY2UtZW52LXJlZi1uYW1lPiYjeEQ7JiN4QTsgICAgJmx0O3Jlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWUmbHQ7L3Jlc291cmNlLWVudi1yZWYtdHlwZT4mI3hEOyYjeEE7Jmx0Oy9yZXNvdXJjZS1lbnYtcmVmPiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2FsbGJhY2tIYW5kbGVyIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjbGFzcyBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24uICBUaGUgY2xhc3MgbXVzdCBoYXZlIGEgbm8gYXJncyBjb25zdHJ1Y3RvciBhbmQgbXVzdCBpbXBsZW1lbnQgdGhlIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyIGludGVyZmFjZS4gIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvbnRhaW5lciBhbmQgdXNlZCBieSB0aGUgY29udGFpbmVyIHRvIGNvbGxlY3QgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgdXNlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmljZVJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzY2xpZW50LmVjb3JlIy8vU2VydmljZVJlZiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvblJlZiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSYjeEQ7JiN4QTsgICAgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMmI3hEOyYjeEE7ICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlJiN4RDsmI3hBOyAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUmI3hEOyYjeEE7ICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlJiN4RDsmI3hBOyAgICB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlRGVzdGluYXRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlJlc0F1dGhBcHBsaWNhdGlvblR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFwcGxpY2F0aW9uPTAmI3hEOyYjeEE7Q29udGFpbmVyPTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkFwcGxpY2F0aW9uIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDb250YWluZXIiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9jb21tb24uZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvY29tbW9uLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTEyZmFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9jb21tb24uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iY29tbW9uIgotICAgIG5zVVJJPSJjb21tb24ueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFamJSZWYiIGVTdXBlclR5cGVzPSIjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlJiN4RDsmI3hBO2RlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZSYjeEQ7JiN4QTtkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uJiN4RDsmI3hBOyAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiYjeEQ7JiN4QTsgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlJiN4RDsmI3hBOyAgICAgIGJlYW4mI3hEOyYjeEE7ICAgIC0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuJiN4RDsmI3hBOyAgICAtIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZCYjeEQ7JiN4QTsgICAgICBlbnRlcnByaXNlIGJlYW4mI3hEOyYjeEE7ICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUmI3hEOyYjeEE7ICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGlzIGlzIHRoZSBKTkRJIG5hbWUgdGhhdCB0aGUgc2VydmxldCBjb2RlIHVzZXMgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4uJiN4RDsmI3hBO0V4YW1wbGU6ICZsdDtlamItcmVmLW5hbWU+ZWpiL1BheXJvbGwmbHQ7L2VqYi1yZWYtbmFtZT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9IiMvL0VqYlJlZlR5cGUiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLiBUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzomI3hEOyYjeEE7Jmx0O2VqYi1yZWYtdHlwZT5FbnRpdHkmbHQ7L2VqYi1yZWYtdHlwZT4mI3hEOyYjeEE7Jmx0O2VqYi1yZWYtdHlwZT5TZXNzaW9uJmx0Oy9lamItcmVmLXR5cGU+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhvbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFu4oCZcyBob21lIGludGVyZmFjZS4mI3hEOyYjeEE7RXhhbXBsZTogJmx0O2hvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWUmbHQ7L2hvbWU+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbW90ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbuKAmXMgcmVtb3RlIGludGVyZmFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGluayIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBlbmNvbXBhc3NpbmcgSjJFRSBBcHBsaWNhdGlvbiBwYWNrYWdlLiBUaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIEoyRUUgQXBwbGljYXRpb24gcGFja2FnZS4gJiN4RDsmI3hBO0V4YW1wbGU6ICZsdDtlamItbGluaz5FbXBsb3llZVJlY29yZCZsdDsvZWpiLWxpbms+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVudkVudHJ5IiBlU3VwZXJUeXBlcz0iIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbnYtZW50cnlUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiBhcHBsaWNhdGlvbidzJiN4RDsmI3hBO2Vudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwmI3hEOyYjeEE7ZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuJiN4RDsmI3hBO29wdGlvbmFsIHZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZSYjeEQ7JiN4QTtzdXBwbGllZCBkdXJpbmcgZGVwbG95bWVudC4mI3hEOyYjeEE7JiN4RDsmI3hBO0l0IGlzIHVzZWQgYnkgZW52LWVudHJ5IGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSYjeEQ7JiN4QTsgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSYjeEQ7JiN4QTsgICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52JiN4RDsmI3hBOyAgICAgICAgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhJiN4RDsmI3hBOyAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQuIFRoZSB1bmlxdWVuZXNzJiN4RDsmI3hBOyAgICAgICAgY29uc3RyYWludHMgbXVzdCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZGVjbGFyZWQmI3hEOyYjeEE7ICAgICAgICBjb250ZXh0LiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICAmbHQ7ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50Jmx0Oy9lbnYtZW50cnktbmFtZT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW52LWVudHJ5LXZhbHVlIGRlc2lnbmF0ZXMgdGhlIHZhbHVlIG9mIGEmI3hEOyYjeEE7ICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUmI3hEOyYjeEE7ICAgICAgICBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSYjeEQ7JiN4QTsgICAgICAgIGNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEmI3hEOyYjeEE7ICAgICAgICBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsJiN4RDsmI3hBOyAgICAgICAgYSBzaW5nbGUgY2hhcmFjdGVyLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICAmbHQ7ZW52LWVudHJ5LXZhbHVlPjEwMC4wMCZsdDsvZW52LWVudHJ5LXZhbHVlPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iIy8vRW52RW50cnlUeXBlIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudOKAmXMgY29kZS4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZTogamF2YS5sYW5nLkJvb2wtZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwgamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkJ5dGUsIGphdmEubGFuZy5TaG9ydCwgamF2YS5sYW5nLkxvbmcsIGFuZCBqYXZhLmxhbmcuRmxvYXQuICYjeEQ7JiN4QTtFeGFtcGxlOiAmbHQ7ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW4mbHQ7L2Vudi1lbnRyeS10eXBlPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZVJlZiIgZVN1cGVyVHlwZXM9IiMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzb3VyY2UtcmVmVHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEmI3hEOyYjeEE7RGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0JiN4RDsmI3hBO2NvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlciYjeEQ7JiN4QTtjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsIHRoZSBpbmRpY2F0aW9uIG9mIHRoZSYjeEQ7JiN4QTtyZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIGV4cGVjdGVkIGJ5IHRoZSYjeEQ7JiN4QTtEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLCB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiYjeEQ7JiN4QTsoQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YmI3hEOyYjeEE7dGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZSYjeEQ7JiN4QTsoU2hhcmVhYmxlIG9yIFVuc2hhcmVhYmxlKS4mI3hEOyYjeEE7JiN4RDsmI3hBO0V4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTsmbHQ7cmVzb3VyY2UtcmVmPiYjeEQ7JiN4QTsgICAgJmx0O3Jlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREImbHQ7L3Jlcy1yZWYtbmFtZT4mI3hEOyYjeEE7ICAgICZsdDtyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZSZsdDsvcmVzLXR5cGU+JiN4RDsmI3hBOyAgICAmbHQ7cmVzLWF1dGg+Q29udGFpbmVyJmx0Oy9yZXMtYXV0aD4mI3hEOyYjeEE7ICAgICZsdDtyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGUmbHQ7L3Jlcy1zaGFyaW5nLXNjb3BlPiYjeEQ7JiN4QTsmbHQ7L3Jlc291cmNlLXJlZj4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSYjeEQ7JiN4QTsgICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4mI3hEOyYjeEE7ICAgICAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUmI3hEOyYjeEE7ICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuJiN4RDsmI3hBOyAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBGaWxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhJiN4RDsmI3hBOyAgICAgICAgc291cmNlLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIGZ1bGx5IHF1YWxpZmllZCYjeEQ7JiN4QTsgICAgICAgIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlJiN4RDsmI3hBOyAgICAgICAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRoIiBlVHlwZT0iIy8vUmVzQXV0aFR5cGVCYXNlIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yIHdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSBiZWFuLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZSBEZXBsb3llci4gIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6JiN4RDsmI3hBOyZsdDtyZXMtYXV0aD5BcHBsaWNhdGlvbiZsdDsvcmVzLWF1dGg+JiN4RDsmI3hBOyZsdDtyZXMtYXV0aD5Db250YWluZXImbHQ7L3Jlcy1hdXRoPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc1NoYXJpbmdTY29wZSIgZVR5cGU9IiMvL1Jlc1NoYXJpbmdTY29wZVR5cGUiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzLXNoYXJpbmctc2NvcGUgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZCYjeEQ7JiN4QTt0aHJvdWdoIHRoZSBnaXZlbiByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlJiN4RDsmI3hBO3NoYXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCwgaWYgc3BlY2lmaWVkLCBtdXN0IGJlIG9uZSBvZiB0aGUmI3hEOyYjeEE7dHdvIGZvbGxvd2luZzogIFNoYXJlYWJsZSwgVW5zaGFyZWFibGUmI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJFbnZFbnRyeVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjMgYWRkZWQgQ2hhcmFjdGVyJiN4RDsmI3hBO1N0cmluZz0wJiN4RDsmI3hBO0ludGVnZXI9MSYjeEQ7JiN4QTtCb29sZWFuPTImI3hEOyYjeEE7RG91YmxlPTMmI3hEOyYjeEE7Qnl0ZT00JiN4RDsmI3hBO1Nob3J0PTUmI3hEOyYjeEE7TG9uZz02JiN4RDsmI3hBO0Zsb2F0PTcmI3hEOyYjeEE7Q2hhcmFjdGVyPTgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlN0cmluZyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSW50ZWdlciIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkJvb2xlYW4iIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJEb3VibGUiIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJCeXRlIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU2hvcnQiIHZhbHVlPSI1Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJMb25nIiB2YWx1ZT0iNiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRmxvYXQiIHZhbHVlPSI3Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDaGFyYWN0ZXIiIHZhbHVlPSI4Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3VyaXR5Um9sZVJlZiIgZVN1cGVyVHlwZXM9IiMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VjdXJpdHktcm9sZS1yZWZUeXBlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhJiN4RDsmI3hBO3NlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGluIGEgY29tcG9uZW50J3Mgb3IgYSYjeEQ7JiN4QTtEZXBsb3ltZW50IENvbXBvbmVudCdzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiYjeEQ7JiN4QTtvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZSYjeEQ7JiN4QTtjb2RlLCBhbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIHNlY3VyaXR5IHJvbGUuIElmIHRoZSYjeEQ7JiN4QTtzZWN1cml0eSByb2xlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbiYjeEQ7JiN4QTthcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZCYjeEQ7JiN4QTsgICAgICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlJiN4RDsmI3hBOyAgICAgICAgRUpCQ29udGV4dC5pc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZU5hbWUpIG1ldGhvZCBvciB0aGUmI3hEOyYjeEE7ICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmsiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkJiN4RDsmI3hBOyAgICAgICAgc2VjdXJpdHkgcm9sZS4gVGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbiYjeEQ7JiN4QTsgICAgICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUmI3hEOyYjeEE7ICAgICAgICBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlJlc0F1dGhUeXBlQmFzZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ09OVEFJTkVSPTAmI3hEOyYjeEE7Q29udGFpbmVyPTEmI3hEOyYjeEE7QXBwbGljYXRpb249MiYjeEQ7JiN4QTtTRVJWTEVUPTMmI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDb250YWluZXIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkFwcGxpY2F0aW9uIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU0VSVkxFVCIgdmFsdWU9IjIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJFamJSZWZUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTZXNzaW9uPTAmI3hEOyYjeEE7RW50aXR5PTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNlc3Npb24iLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkVudGl0eSIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdXJpdHlSb2xlIiBlU3VwZXJUeXBlcz0iIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZWN1cml0eS1yb2xlVHlwZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5JiN4RDsmI3hBO3JvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSYjeEQ7JiN4QTtzZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4mI3hEOyYjeEE7JiN4RDsmI3hBO0V4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgJmx0O3NlY3VyaXR5LXJvbGU+JiN4RDsmI3hBOyAgICAmbHQ7ZGVzY3JpcHRpb24+JiN4RDsmI3hBOyAgICAgICAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkJiN4RDsmI3hBOyAgICAgICAgdG8gYWNjZXNzIHRoZSBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLiYjeEQ7JiN4QTsgICAgJmx0Oy9kZXNjcmlwdGlvbj4mI3hEOyYjeEE7ICAgICZsdDtyb2xlLW5hbWU+ZW1wbG95ZWUmbHQ7L3JvbGUtbmFtZT4mI3hEOyYjeEE7ICAgICZsdDsvc2VjdXJpdHktcm9sZT4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCBTZWUgZGVzY3JpcHRpb25zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGVOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcm9sZS4gVGhpcyBlbGVtZW50IG11c3QgY29udGFpbiBhIG5vbi1lbXB0eSBzdHJpbmcuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlRW52UmVmIiBlU3VwZXJUeXBlcz0iIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXNvdXJjZS1lbnYtcmVmVHlwZSBpcyB1c2VkIHRvIGRlZmluZSYjeEQ7JiN4QTtyZXNvdXJjZS1lbnYtdHlwZSBlbGVtZW50cy4gIEl0IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSYjeEQ7JiN4QTtEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0JiN4RDsmI3hBO2Fzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzJiN4RDsmI3hBO2Vudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSYjeEQ7JiN4QTtyZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuIGluZGljYXRpb24gb2YmI3hEOyYjeEE7dGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5IHRoZSYjeEQ7JiN4QTtEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyZsdDtyZXNvdXJjZS1lbnYtcmVmPiYjeEQ7JiN4QTsgICAgJmx0O3Jlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZSYjeEQ7JiN4QTsgICAgJmx0Oy9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+JiN4RDsmI3hBOyAgICAmbHQ7cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZSYjeEQ7JiN4QTsgICAgJmx0Oy9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+JiN4RDsmI3hBOyZsdDsvcmVzb3VyY2UtZW52LXJlZj4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHJlc291cmNlIGVudiByZWYuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSYjeEQ7JiN4QTsgICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMmI3hEOyYjeEE7ICAgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluJiN4RDsmI3hBOyAgICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkmI3hEOyYjeEE7ICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QmI3hEOyYjeEE7ICAgICAgICBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlJiN4RDsmI3hBOyAgICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUmI3hEOyYjeEE7ICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3ImI3hEOyYjeEE7ICAgICAgICBpbnRlcmZhY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJSZXNTaGFyaW5nU2NvcGVUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTaGFyZWFibGU9MCYjeEQ7JiN4QTtVbnNoYXJlYWJsZT0xIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTaGFyZWFibGUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlVuc2hhcmVhYmxlIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFSkJMb2NhbFJlZiIgZVN1cGVyVHlwZXM9IiMvL0VqYlJlZiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuMyYjeEQ7JiN4QTtUaGUgZWpiLWxvY2FsLXJlZlR5cGUgaXMgdXNlZCBieSBlamItbG9jYWwtcmVmIGVsZW1lbnRzIGZvciYjeEQ7JiN4QTt0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwmI3hEOyYjeEE7aG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24mI3hEOyYjeEE7ICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSBEZXBsb3ltZW50JiN4RDsmI3hBOyAgICAgIENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbiYjeEQ7JiN4QTsgICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4mI3hEOyYjeEE7ICAgIC0gdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlJiN4RDsmI3hBOyAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuJiN4RDsmI3hBOyAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlJiN4RDsmI3hBOyAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2FsSG9tZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5IiBlU3VwZXJUeXBlcz0iIy8vU2VjdXJpdHlJZGVudGl0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlY3VyaXR5LWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzIGlkZW50aXR5IGlzIHRvIGJlIHVzZWQuIEl0ICAgIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpZGVudGl0eSIgZVR5cGU9IiMvL0lkZW50aXR5IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik9wdGlvbmFsIHNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSWRlbnRpdHkiIGVTdXBlclR5cGVzPSIjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4uIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHJ1biBhcyBpZGVudGl0eS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGVOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJY29uVHlwZSIgZVN1cGVyVHlwZXM9IiMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cyYjeEQ7JiN4QTt0aGF0IHNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsIGFuZCBsYXJnZSBHSUYgb3ImI3hEOyYjeEE7SlBFRyBpY29uIGltYWdlcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSYjeEQ7JiN4QTtHVUkgdG9vbC4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUmI3hEOyYjeEE7aWNvbiBmaWxlIG5hbWVzIGFyZSBwcm92aWRlZCBpbi4gSXRzIHZhbHVlIGlzICZxdW90O2VuJnF1b3Q7IChFbmdsaXNoKSYjeEQ7JiN4QTtieSBkZWZhdWx0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzbWFsbEljb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSYjeEQ7JiN4QTsgICAgICAgIGNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUmI3hEOyYjeEE7ICAgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQmI3hEOyYjeEE7ICAgICAgICBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuJiN4RDsmI3hBOyAgICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgICZsdDtzbWFsbC1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjE2eDE2LmpwZyZsdDsvc21hbGwtaWNvbj4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFyZ2VJY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUmI3hEOyYjeEE7ICAgICAgICBjb250YWluaW5nIGEgbGFyZ2UmI3hEOyYjeEE7ICAgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlJiN4RDsmI3hBOyAgICAgICAgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudCYjeEQ7JiN4QTsgICAgICAgIEZpbGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuJiN4RDsmI3hBOyAgICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgICZsdDtsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZyZsdDsvbGFyZ2UtaWNvbj4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzcGxheU5hbWUiIGVTdXBlclR5cGVzPSIjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQmI3hEOyYjeEE7dG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZSYjeEQ7JiN4QTtlbGVtZW50cy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOy4uLiYjeEQ7JiN4QTsgICAmbHQ7ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSZxdW90O2VuJnF1b3Q7PkVtcGxveWVlIFNlbGYgU2VydmljZSZsdDsvZGlzcGxheS1uYW1lPiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHZhbHVlIG9mIHRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgaXMgJnF1b3Q7ZW4mcXVvdDsgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWVzc2FnZURlc3RpbmF0aW9uUmVmIiBlU3VwZXJUeXBlcz0iIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiYjeEQ7JiN4QTtvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIG1lc3NhZ2UgZGVzdGluYXRpb24mI3hEOyYjeEE7YXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncyYjeEQ7JiN4QTtlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24mI3hEOyYjeEE7ICAgICAgICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lJiN4RDsmI3hBOyAgICAgICAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlJiN4RDsmI3hBOyAgICAgICAgLSBhIHNwZWNpZmljYXRpb24gYXMgdG8gd2hldGhlciB0aGUmI3hEOyYjeEE7ICAgICAgICAgIGRlc3RpbmF0aW9uIGlzIHVzZWQgZm9yJiN4RDsmI3hBOyAgICAgICAgICBjb25zdW1pbmcgb3IgcHJvZHVjaW5nIG1lc3NhZ2VzLCBvciBib3RoJiN4RDsmI3hBOyAgICAgICAgLSBhIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24mI3hEOyYjeEE7JiN4RDsmI3hBO0V4YW1wbGVzOiYjeEQ7JiN4QTsmI3hEOyYjeEE7Jmx0O21lc3NhZ2UtZGVzdGluYXRpb24tcmVmPiYjeEQ7JiN4QTsgICAgICAgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlJiN4RDsmI3hBOyAgICAgICAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPiYjeEQ7JiN4QTsgICAgICAgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlJiN4RDsmI3hBOyAgICAgICAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+JiN4RDsmI3hBOyAgICAgICAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Q29uc3VtZXMmI3hEOyYjeEE7ICAgICAgICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+JiN4RDsmI3hBOyAgICAgICAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tbGluaz5Db3Jwb3JhdGVTdG9ja3MmI3hEOyYjeEE7ICAgICAgICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tbGluaz4mI3hEOyYjeEE7Jmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlIiBlVHlwZT0iIy8vTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmsiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXNzYWdlRGVzdGluYXRpb24iIGVTdXBlclR5cGVzPSIjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgbWVzc2FnZS1kZXN0aW5hdGlvblR5cGUgc3BlY2lmaWVzIGEgbWVzc2FnZSYjeEQ7JiN4QTtkZXN0aW5hdGlvbi4gVGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMmI3hEOyYjeEE7ZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uJiN4RDsmI3hBOyAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUmI3hEOyYjeEE7ICAgICAgICAtIGFuIG9wdGlvbmFsIGljb24mI3hEOyYjeEE7ICAgICAgICAtIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIHdoaWNoIG11c3QgYmUgdW5pcXVlJiN4RDsmI3hBOyAgICAgICAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZSYjeEQ7JiN4QTsgICAgICAgICAgRGVwbG95bWVudCBGaWxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyZsdDttZXNzYWdlLWRlc3RpbmF0aW9uPiYjeEQ7JiN4QTsgICAgICAgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Q29ycG9yYXRlU3RvY2tzJiN4RDsmI3hBOyAgICAgICAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+JiN4RDsmI3hBOyZsdDsvbWVzc2FnZS1kZXN0aW5hdGlvbj4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSYjeEQ7JiN4QTsgICAgICAgIG5hbWUgZm9yIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgbmFtZSBtdXN0IGJlJiN4RDsmI3hBOyAgICAgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucyYjeEQ7JiN4QTsgICAgICAgIHdpdGhpbiB0aGUgRGVwbG95bWVudCBGaWxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYXJhbVZhbHVlIiBlU3VwZXJUeXBlcz0iIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhpcyB0eXBlIGlzIGEgZ2VuZXJhbCB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZSYjeEQ7JiN4QTtwYXJhbWV0ZXIvdmFsdWUgbGlzdHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRpb25Hcm91cCIgZVN1cGVyVHlwZXM9IiMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgZGVzY3JpcHRpb24gcmVsYXRlZCYjeEQ7JiN4QTtlbGVtZW50cyBjb25zaXN0ZW50IGFjcm9zcyBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imljb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0ljb25UeXBlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNwbGF5TmFtZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlzcGxheU5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSk5ESUVudlJlZnNHcm91cCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIEpOREkgZW52aXJvbm1lbnQmI3hEOyYjeEE7cmVmZXJlbmNlIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VudkVudHJ5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZVJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUmVzb3VyY2VSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVqYlJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRWpiUmVmIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZUVudlJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUmVzb3VyY2VFbnZSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBsaXN0IG9mIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VzIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWpiTG9jYWxSZWZzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0VKQkxvY2FsUmVmIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlRGVzdGluYXRpb25SZWZzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01lc3NhZ2VEZXN0aW5hdGlvblJlZiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmljZVJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzY2xpZW50LmVjb3JlIy8vU2VydmljZVJlZiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdXJpdHlJZGVudGl0eSIgZVN1cGVyVHlwZXM9IiMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQmI3hEOyYjeEE7Y29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVc2VDYWxsZXJJZGVudGl0eSIgZVN1cGVyVHlwZXM9IiMvL1NlY3VyaXR5SWRlbnRpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1c2UtY2FsbGVyLWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGJlIHVzZWQgYXMgdGhlIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2RzLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gdHlwZSBpcyB1c2VkIGJ5IGEgZGVzY3JpcHRpb24gZWxlbWVudCB0byYjeEQ7JiN4QTtwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZWxlbWVudHMmI3hEOyYjeEE7dGhhdCB1c2UgdGhpcyB0eXBlIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSYjeEQ7JiN4QTtEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZSBmaWxlIHByb2R1Y2VyIHdhbnRzJiN4RDsmI3hBO3RvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzJiN4RDsmI3hBO0RlcGxveW1lbnQgRmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUmI3hEOyYjeEE7dG9vbHMgdXNlZCBieSBzdWNoIGEgRGVwbG95bWVudCBGaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSYjeEQ7JiN4QTt0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0JiN4RDsmI3hBO2NvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZSYjeEQ7JiN4QTtkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBpbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgJnF1b3Q7ZW4mcXVvdDsgKEVuZ2xpc2gpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNvbnN1bWVzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQcm9kdWNlcyIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNvbnN1bWVzUHJvZHVjZXMiIHZhbHVlPSIyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlFOYW1lIiBlU3VwZXJUeXBlcz0iIy8vSjJFRUVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYWxQYXJ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbWJpbmVkUU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW50ZXJuYWxQcmVmaXhPck5zVVJJIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikxpc3RlbmVyIiBlU3VwZXJUeXBlcz0iIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgbW92ZWQgZnJvbSB3ZWJhcHAmI3hEOyYjeEE7JiN4RDsmI3hBO0RlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaXN0ZW5lckNsYXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNtYWxsSWNvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXJnZUljb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzcGxheU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSjJFRUVPYmplY3QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKMkVFRUF0dHJpYnV0ZSIgZVN1cGVyVHlwZXM9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUF0dHJpYnV0ZSIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9jb21tb25BcmNoaXZlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NvbW1vbkFyY2hpdmUuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTU1M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NvbW1vbkFyY2hpdmUuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIiBtb2RlbE5hbWU9IkNvbW1vbkFyY2hpdmUiIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuajJlZS5jb21tb25hcmNoaXZlY29yZS5wcm92aWRlci5Db21tb25BcmNoaXZlRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuajJlZS5jb21tb25hcmNoaXZlY29yZS5wcmVzZW50YXRpb24uQ29tbW9uQXJjaGl2ZUVkaXRvclBsdWdpbiIKLSAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIucm9zZSIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZSBqMmVlLmdlbm1vZGVsIy8vd3NjbGllbnQgajJlZS5nZW5tb2RlbCMvL2NvbW1vbiBqMmVlLmdlbm1vZGVsIy8vd2ViYXBwbGljYXRpb24gajJlZS5nZW5tb2RlbCMvL2VqYiBqMmVlLmdlbm1vZGVsIy8vanNwIGoyZWUuZ2VubW9kZWwjLy9hcHBsaWNhdGlvbiBqMmVlLmdlbm1vZGVsIy8vY2xpZW50IGoyZWUuZ2VubW9kZWwjLy9qY2EgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbCMvL2phdmEiPgotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcY29tbW9uQXJjaGl2ZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5XT1JLU1BBQ0VfUk9PVDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkNvbW1vbmFyY2hpdmUiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgaW50ZXJmYWNlUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwiCi0gICAgICBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIiBlY29yZVBhY2thZ2U9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9GaWxlL1VSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRmlsZS9sYXN0TW9kaWZpZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0ZpbGUvc2l6ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRmlsZS9kaXJlY3RvcnlFbnRyeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRmlsZS9vcmlnaW5hbFVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRmlsZS9sb2FkaW5nQ29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRmlsZS9jb250YWluZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9BcmNoaXZlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0FyY2hpdmUvdHlwZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9FSkJKYXJGaWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0VKQkphckZpbGUvZGVwbG95bWVudERlc2NyaXB0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9XQVJGaWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL1dBUkZpbGUvZGVwbG95bWVudERlc2NyaXB0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9FQVJGaWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9FQVJGaWxlL21vZHVsZVJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0VBUkZpbGUvZGVwbG95bWVudERlc2NyaXB0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudEZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnRGaWxlL2RlcGxveW1lbnREZXNjcmlwdG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vTW9kdWxlRmlsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vQ29udGFpbmVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9Db250YWluZXIvZmlsZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9SZWFkT25seURpcmVjdG9yeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vUkFSRmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9SQVJGaWxlL2RlcGxveW1lbnREZXNjcmlwdG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vTW9kdWxlUmVmIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL01vZHVsZVJlZi9tb2R1bGVGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vTW9kdWxlUmVmL2VhckZpbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL01vZHVsZVJlZi9tb2R1bGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9FSkJNb2R1bGVSZWYiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL1dlYk1vZHVsZVJlZiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vQ2xpZW50TW9kdWxlUmVmIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9Db25uZWN0b3JNb2R1bGVSZWYiLz4KLSAgICA8bmVzdGVkR2VuUGFja2FnZXMgcHJlZml4PSJMb29zZWNvbmZpZyIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlIgotICAgICAgICBpbnRlcmZhY2VQYWNrYWdlU3VmZml4PSJpbnRlcm5hbCIgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIKLSAgICAgICAgZWNvcmVQYWNrYWdlPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnIj4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VBcHBsaWNhdGlvbiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUFwcGxpY2F0aW9uL2xvb3NlQXJjaGl2ZXMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VBcmNoaXZlIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VBcmNoaXZlL3VyaSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUvYmluYXJpZXNQYXRoIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZS9yZXNvdXJjZXNQYXRoIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUvbG9vc2VBcHAiLz4KLSAgICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VBcmNoaXZlL2lzTW9kdWxlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlTGlicmFyeSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUxpYnJhcnkvbG9vc2VXQVIiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VNb2R1bGUiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZU1vZHVsZS9hbHRERCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUNvbmZpZ3VyYXRpb24iPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VDb25maWd1cmF0aW9uL2FwcGxpY2F0aW9ucyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZVdBUkZpbGUiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VXQVJGaWxlL2xvb3NlTGlicyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgIDwvbmVzdGVkR2VuUGFja2FnZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NvbW1vbmFyY2hpdmVjb3JlLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmI0MTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9jb21tb25hcmNoaXZlY29yZS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImNvbW1vbmFyY2hpdmVjb3JlIgotICAgIG5zVVJJPSJjb21tb25hcmNoaXZlLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGaWxlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFzdE1vZGlmaWVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaXplIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXJlY3RvcnlFbnRyeSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3JpZ2luYWxVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibG9hZGluZ0NvbnRhaW5lciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9Db250YWluZXIiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Db250YWluZXIvZmlsZXMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJjaGl2ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRhaW5lciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFSkJKYXJGaWxlIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlRmlsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlcGxveW1lbnREZXNjcmlwdG9yIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGVqYi5lY29yZSMvL0VKQkphciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXQVJGaWxlIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlRmlsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlcGxveW1lbnREZXNjcmlwdG9yIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVBUkZpbGUiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVGaWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kdWxlUmVmcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Nb2R1bGVSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01vZHVsZVJlZi9lYXJGaWxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlcGxveW1lbnREZXNjcmlwdG9yIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGFwcGxpY2F0aW9uLmVjb3JlIy8vQXBwbGljYXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXBwbGljYXRpb25DbGllbnRGaWxlIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlRmlsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlcGxveW1lbnREZXNjcmlwdG9yIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNsaWVudC5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1vZHVsZUZpbGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQXJjaGl2ZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9GaWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmlsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRmlsZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRmlsZS9jb250YWluZXIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVhZE9ubHlEaXJlY3RvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250YWluZXIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSQVJGaWxlIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlRmlsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlcGxveW1lbnREZXNjcmlwdG9yIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGpjYS5lY29yZSMvL0Nvbm5lY3RvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNb2R1bGVSZWYiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGVGaWxlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTW9kdWxlRmlsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlYXJGaWxlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRUFSRmlsZSIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0VBUkZpbGUvbW9kdWxlUmVmcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgYXBwbGljYXRpb24uZWNvcmUjLy9Nb2R1bGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRUpCTW9kdWxlUmVmIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlUmVmIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2ViTW9kdWxlUmVmIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlUmVmIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2xpZW50TW9kdWxlUmVmIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlUmVmIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29ubmVjdG9yTW9kdWxlUmVmIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlUmVmIi8+Ci0gIDxlU3VicGFja2FnZXMgbmFtZT0ibG9vc2Vjb25maWciIG5zVVJJPSJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnIj4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikxvb3NlQXBwbGljYXRpb24iIGVTdXBlclR5cGVzPSIjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imxvb3NlQXJjaGl2ZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZS9sb29zZUFwcCIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9vc2VBcmNoaXZlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc01vZHVsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiaW5hcmllc1BhdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZXNQYXRoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibG9vc2VBcHAiIGVUeXBlPSIjLy9sb29zZWNvbmZpZy9Mb29zZUFwcGxpY2F0aW9uIgotICAgICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9sb29zZWNvbmZpZy9Mb29zZUFwcGxpY2F0aW9uL2xvb3NlQXJjaGl2ZXMiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikxvb3NlTGlicmFyeSIgZVN1cGVyVHlwZXM9IiMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibG9vc2VXQVIiIGVUeXBlPSIjLy9sb29zZWNvbmZpZy9Mb29zZVdBUkZpbGUiCi0gICAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL2xvb3NlY29uZmlnL0xvb3NlV0FSRmlsZS9sb29zZUxpYnMiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikxvb3NlTW9kdWxlIiBlU3VwZXJUeXBlcz0iIy8vbG9vc2Vjb25maWcvTG9vc2VBcmNoaXZlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRERCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9vc2VDb25maWd1cmF0aW9uIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFwcGxpY2F0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9IiMvL2xvb3NlY29uZmlnL0xvb3NlQXBwbGljYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMb29zZVdBUkZpbGUiIGVTdXBlclR5cGVzPSIjLy9sb29zZWNvbmZpZy9Mb29zZU1vZHVsZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibG9vc2VMaWJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgICBlVHlwZT0iIy8vbG9vc2Vjb25maWcvTG9vc2VMaWJyYXJ5IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9sb29zZWNvbmZpZy9Mb29zZUxpYnJhcnkvbG9vc2VXQVIiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgPC9lU3VicGFja2FnZXM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2VqYi5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9lamIuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZWNiMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2VqYi5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDU4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJlamIiCi0gICAgbnNVUkk9ImVqYi54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGVTdXBlclR5cGVzPSIjLy9FbnRpdHkiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIyLngiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4mI3hEOyYjeEE7JiN4RDsmI3hBO0BpbnZhcmlhbnQgVGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IDEueCAsIDIueCYjeEQ7JiN4QTtAZGVmYXVsdCAyLngmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFic3RyYWN0U2NoZW1hTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkgYmVhbiB3aG9zZSBsb2NhbCBpbnRlcmZhY2UgaXMgY29tLmFjbWUuY29tbWVyY2UuT3JkZXIgbWlnaHQgYmUgT3JkZXIuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVudEF0dHJpYnV0ZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ01QQXR0cmlidXRlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJrZXlBdHRyaWJ1dGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NNUEF0dHJpYnV0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJxdWVyaWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1F1ZXJ5IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9RdWVyeS9lbnRpdHkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IG1vdmVkIGZyb20gQ01FJiN4RDsmI3hBO1RoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMi54IGFuZCBxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4gZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZCBmb3IgdGhlIGVudGl0eSBiZWFuLiYjeEQ7JiN4QTsmI3hEOyYjeEE7QGludmFyaWFudCBzZWUgZGVzY3JpcHRpb24mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IkNNUEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9DTVBBdHRyaWJ1dGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJpbUtleUZpZWxkIiBlVHlwZT0iIy8vQ01QQXR0cmlidXRlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBlcm1pc3Npb24iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUgc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMsIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLiAgVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kL29yIGhvbWUgaW50ZXJmYWNlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5jaGVja2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NlbWJseURlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Bc3NlbWJseURlc2NyaXB0b3IiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Bc3NlbWJseURlc2NyaXB0b3IvbWV0aG9kUGVybWlzc2lvbnMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZXMiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RFbGVtZW50cyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXNzZW1ibHlEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhc3NlbWJseS1kZXNjcmlwdG9yIGVsZW1lbnQgY29udGFpbnMgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4gQWxsIHRoZSBwYXJ0cyBhcmUgb3B0aW9uYWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIFByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBlcm1pc3Npb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFBlcm1pc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01ldGhvZFBlcm1pc3Npb24vYXNzZW1ibHlEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFRyYW5zYWN0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RUcmFuc2FjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTWV0aG9kVHJhbnNhY3Rpb24vYXNzZW1ibHlEZXNjcmlwdG9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QgbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZCBpbnZvY2F0aW9ucy4gIFRoZSBlbGVtZW50IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuVGhlIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkIG1ldGhvZHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVqYkphciIgZVR5cGU9IiMvL0VKQkphciIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0VKQkphci9hc3NlbWJseURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdXJpdHlSb2xlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGNsdWRlTGlzdCIgZVR5cGU9IiMvL0V4Y2x1ZGVMaXN0IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlRGVzdGluYXRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RUcmFuc2FjdGlvbiIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kIGludm9jYXRpb25zLiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS5UaGUgdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNhY3Rpb25BdHRyaWJ1dGUiIGVUeXBlPSIjLy9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHJhbnMtYXR0cmlidXRlIGVsZW1lbnQgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QgbWFuYWdlIHRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZCBpbnZvY2F0aW9uIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzIG1ldGhvZC4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2VtYmx5RGVzY3JpcHRvciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0Fzc2VtYmx5RGVzY3JpcHRvciIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0Fzc2VtYmx5RGVzY3JpcHRvci9tZXRob2RUcmFuc2FjdGlvbnMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kRWxlbWVudHMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9FbnRlcnByaXNlQmVhbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlc3Npb24tYmVhblR5cGUgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUmI3hEOyYjeEE7ZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZSYjeEQ7JiN4QTsgICAgICBpY29uIGZpbGUgbmFtZSYjeEQ7JiN4QTsgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbiYjeEQ7JiN4QTsgICAgICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbiYjeEQ7JiN4QTsgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lIGFuZCYjeEQ7JiN4QTsgICAgICByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55JiN4RDsmI3hBOyAgICAtIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQmI3hEOyYjeEE7ICAgICAgbG9jYWwgaW50ZXJmYWNlcywgaWYgYW55JiN4RDsmI3hBOyAgICAtIHRoZSBuYW1lIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyB3ZWIgc2VydmljZSBlbmRwb2ludCYjeEQ7JiN4QTsgICAgICBpbnRlcmZhY2UsIGlmIGFueSYjeEQ7JiN4QTsgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MmI3hEOyYjeEE7ICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIHN0YXRlIG1hbmFnZW1lbnQgdHlwZSYjeEQ7JiN4QTsgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MmI3hEOyYjeEE7ICAgICAgZW52aXJvbm1lbnQgZW50cmllcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwmI3hEOyYjeEE7ICAgICAgRUpCIHJlZmVyZW5jZXMmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWImI3hEOyYjeEE7ICAgICAgc2VydmljZSByZWZlcmVuY2VzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlJiN4RDsmI3hBOyAgICAgIHJlZmVyZW5jZXMmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5JiN4RDsmI3hBOyAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UmI3hEOyYjeEE7ICAgICAgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlJiN4RDsmI3hBOyAgICAgIGVudmlyb25tZW50IHJlZmVyZW5jZXMuJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZSYjeEQ7JiN4QTsgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICZxdW90O29wdGlvbmFsJnF1b3Q7IGluIHRoZSBzZW5zZSYjeEQ7JiN4QTt0aGF0IHRoZXkgYXJlIG9taXR0ZWQgd2hlbiBpZiBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSYjeEQ7JiN4QTtlbXB0eS4mI3hEOyYjeEE7JiN4RDsmI3hBO0VpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aCYjeEQ7JiN4QTt0aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlJiN4RDsmI3hBO3Nlc3Npb24gYmVhbi4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGlmIHRoZSYjeEQ7JiN4QTtiZWFuIGlzIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNhY3Rpb25UeXBlIiBlVHlwZT0iIy8vVHJhbnNhY3Rpb25UeXBlIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlc3Npb25UeXBlIiBlVHlwZT0iIy8vU2Vzc2lvblR5cGUiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmljZUVuZHBvaW50IiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IGNvbnRhaW5zIHRoZSYjeEQ7JiN4QTsgICAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyB3ZWImI3hEOyYjeEE7ICAgICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQmI3hEOyYjeEE7ICAgICAgICBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYSBzdGF0ZWxlc3MmI3hEOyYjeEE7ICAgICAgICBzZXNzaW9uIGJlYW4uIFRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG11c3QgYmUgYSYjeEQ7JiN4QTsgICAgICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVudGl0eSIgZVN1cGVyVHlwZXM9IiMvL0VudGVycHJpc2VCZWFuIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW50aXR5IGVsZW1lbnQgZGVjbGFyZXMgYW4gZW50aXR5IGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjogYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IG9wdGlvbmFsIGRpc3BsYXkgbmFtZTsgb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lOyBhIHVuaXF1ZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbuKAmXMgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueTsgdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbuKAmXMgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLCBpZiBhbnk7IHRoZSBlbnRpdHkgYmVhbuKAmXMgaW1wbGVtZW50YXRpb24gY2xhc3M7IHRoZSBlbnRpdHkgYmVhbuKAmXMgcGVyc2lzdGVuY2UgbWFuYWdlbWVudCB0eXBlOyB0aGUgZW50aXR5IGJlYW7igJlzIHByaW1hcnkga2V5IGNsYXNzIG5hbWU7IGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFu4oCZcyByZWVudHJhbmN5OyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbuKAmXMgY21wLXZlcnNpb247IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFu4oCZcyBhYnN0cmFjdCBzY2hlbWEgbmFtZTsgYW4gb3B0aW9uYWwgbGlzdCBvZiBjb250YWluZXItbWFuYWdlZCBmaWVsZHM7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbuKAmXMgZW52aXJvbm1lbnQgZW50cmllczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW7igJlzIEVKQiByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbuKAmXMgbG9jYWwgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFu4oCZcyBtZXRob2RzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbuKAmXMgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW7igJlzIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMgZm9yIGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LiYjeEQ7JiN4QTtUaGUgb3B0aW9uYWwgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZSBhbmQgY21wLXZlcnNpb24gMi54LiBUaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUgZW50aXR54oCZcyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4gVGhlIG9wdGlvbmFsIGNtcC12ZXJzaW9uIGVsZW1lbnQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eeKAmXMgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4mI3hEOyYjeEE7VGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgZW50aXR5IGJlYW4gY21wLXZlcnNpb24gaXMgMS54LiYjeEQ7JiN4QTtUaGUgb3B0aW9uYWwgbG9jYWwtaG9tZSBhbmQgbG9jYWwgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYgdGhlIGVudGl0eSBiZWFuIGhhcyBhIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZS4mI3hEOyYjeEE7VGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGUgZW50aXR5IGJlYW4uJiN4RDsmI3hBO1RoZSBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgJnF1b3Q7b3B0aW9uYWwmcXVvdDsgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIEF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYmI3hEOyYjeEE7dGhlIGVudGl0eeKAmXMgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAxLngsIGFuZCBub25lIG11c3Qgbm90IGJlIHByZXNlbnQgaWYgdGhlIGVudGl0eeKAmXMgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWVudHJhbnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eSBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmltYXJ5S2V5IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkIGZvciBhbiBlbnRpdHkgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIFRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUgb25lIG9mIHRoZSBmaWVsZHMgZGVjbGFyZWQgaW4gdGhlIGNtcC1maWVsZCYjeEQ7JiN4QTtlbGVtZW50LCBhbmQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkga2V5IHR5cGUuICBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5IGtleSBtYXBzIHRvIG11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcyAoaS5lLiB0aGUga2V5IGlzIGEgY29tcG91bmQga2V5KS4gSW4gdGhpcyBjYXNlLCB0aGUgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIHRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29tcHJpc2UgdGhlIGtleS4mI3hEOyYjeEE7RXhhbXBsZXM6Jmx0O3ByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmcmbHQ7L3ByaW0ta2V5LWNsYXNzPiYjeEQ7JiN4QTsmI3g5OyZsdDtwcmltLWtleS1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVJRCZsdDsvcHJpbS1rZXktY2xhc3M+JiN4RDsmI3hBOyYjeDk7Jmx0O3ByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5PYmplY3QmbHQ7L3ByaW0ta2V5LWNsYXNzPiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRW50ZXJwcmlzZUJlYW4iIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSk5ESUVudlJlZnNHcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRW50ZXJwcmlzZUphdmFCZWFuIGlzIGEgY2xhc3MuICBJdCBjYW4gaGF2ZSBpbnN0YW5jZXMsIHNvbWVvbmUgY291bGQgd3JpdGUgYW4gJiN4RDsmI3hBO2luc3RhbmNlIGRvY3VtZW50IGNvbnRhaW5pbmcgRGVwYXJ0bWVudHMgYW5kIEVtcGxveWVlcy4gIEl0IGFsc28gaGFzICYjeEQ7JiN4QTthdHRyaWJ1dGVzLCBvcGVyYXRpb25zLCBhbmQgYXNzb2NpYXRpb25zLiAgVGhlc2UgYXJlIGFjdHVhbGx5IGRlcml2ZWQvZmlsdGVyZWQgJiN4RDsmI3hBO2Zyb20gaXRzIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuICBGb3IgbWFwcGluZyBhbmQgYnJvd3NpbmcgJiN4RDsmI3hBO3B1cnBvc2VzLCB0aG91Z2gsIHlvdSB3b3VsZCBsaWtlIHRoZSBFSkIgdG8gYXBwZWFyIGFzIGEgY2xhc3MuICAmI3hEOyYjeEE7JiN4RDsmI3hBO0luIHRoaXMgbGlnaHQsIGV2ZW4gU2Vzc2lvbiBCZWFucyBjYW4gaGF2ZSBhc3NvY2lhdGlvbnMgYW5kIHByb3BlcnRpZXMgJiN4RDsmI3hBO2ltcGxlbWVudGVkIGJ5IHRoZWlyIGJlYW4uICBGb3IgZXhhbXBsZSwgaXQgd291bGQgYmUgbWVhbmluZ2Z1bCB0byBkZXNjcmliZSAmI3hEOyYjeEE7YXNzb2NpYXRpb25zIGZyb20gYSBTZXNzaW9uIHRvIHRoZSBFbnRpdGllcyB3aGljaCBpdCB1c2VzIHRvIHBlcmZvcm0gaXRzIHdvcmsuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY3VyaXR5Um9sZVJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZVJlZiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWpiQ2xhc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaG9tZUludGVyZmFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZW1vdGVJbnRlcmZhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWpiSmFyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRUpCSmFyIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRUpCSmFyL2VudGVycHJpc2VCZWFucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN1cml0eUlkZW50aXR5IiBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5SWRlbnRpdHkiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlY3VyaXR5LWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzIGlkZW50aXR5IGlzIHRvIGJlIHVzZWQuIEl0JiN4RDsmI3hBO2NvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxvY2FsSG9tZUludGVyZmFjZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsb2NhbEludGVyZmFjZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTm90U3VwcG9ydGVkPTEmI3hEOyYjeEE7U3VwcG9ydHM9MiYjeEQ7JiN4QTtSZXF1aXJlZD0zJiN4RDsmI3hBO1JlcXVpcmVzTmV3PTQmI3hEOyYjeEE7TWFuZGF0b3J5PTUmI3hEOyYjeEE7TmV2ZXI9NiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5vdFN1cHBvcnRlZCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU3VwcG9ydHMiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSZXF1aXJlZCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJlcXVpcmVzTmV3IiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTWFuZGF0b3J5IiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTmV2ZXIiIHZhbHVlPSI1Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVHJhbnNhY3Rpb25UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCZWFuPTEmI3hEOyYjeEE7Q29udGFpbmVyPTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkJlYW4iLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNvbnRhaW5lciIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJTZXNzaW9uVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3RhdGVmdWw9MSYjeEQ7JiN4QTtTdGF0ZWxlc3M9MiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU3RhdGVmdWwiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlN0YXRlbGVzcyIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRUpCTWV0aG9kQ2F0ZWdvcnkiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbGlkIEVKQiBtZXRob2QgY2F0ZWdvcnkgbmFtZXMgYXJlOiBFSkJIT01FTUVUSE9ELCBFSkJDUkVBVEVNRVRIT0QsIEVKQkZJTkRFUk1FVEhPRCwgRUpCUkVNT1RFTUVUSE9ELiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFSkJKYXIiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZTsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlJiN4RDsmI3hBO25hbWU7IG1hbmRhdG9yeSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBpbmNsdWRlZCBlbnRlcnByaXNlIGJlYW5zOyBhIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMsIGlmIGFueTsgYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcjsgYW5kIGFuIG9wdGlvbmFsIG5hbWUgb2YgYW4gZWpiLWNsaWVudC1qYXIgZmlsZSBmb3IgdGhlIGVqYi1qYXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVqYkNsaWVudEphciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUiBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYSBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4gVGhlIERlcGxveWVyIHNob3VsZCBtYWtlIHRoZSBlamItY2xpZW50IEpBUiBmaWxlIGFjY2Vzc2libGUgdG8gdGhlIGNsaWVudCdzIGNsYXNzLWxvYWRlci4gIEV4YW1wbGU6Jmx0O2VqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphciZsdDsvZWpiLWNsaWVudC1qYXI+JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlJiN4RDsmI3hBOyAgICBFSkIgc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSBpbnN0YW5jZSBkb2N1bWVudCBtdXN0JiN4RDsmI3hBOyAgICBjb21wbHkgd2l0aC4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveW1lbnQgdG9vbHMmI3hEOyYjeEE7ICAgIHRvIHZhbGlkYXRlIGEgcGFydGljdWxhciBFSkIgRGVwbG95bWVudCYjeEQ7JiN4QTsgICAgRGVzY3JpcHRvciB3aXRoIHJlc3BlY3QgdG8gYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBFSkImI3hEOyYjeEE7ICAgIHNjaGVtYS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzZW1ibHlEZXNjcmlwdG9yIiBlVHlwZT0iIy8vQXNzZW1ibHlEZXNjcmlwdG9yIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Bc3NlbWJseURlc2NyaXB0b3IvZWpiSmFyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGVycHJpc2VCZWFucyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FbnRlcnByaXNlQmVhbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRW50ZXJwcmlzZUJlYW4vZWpiSmFyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVudGVycHJpc2UtYmVhbnMgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlbGF0aW9uc2hpcExpc3QiIGVUeXBlPSIjLy9SZWxhdGlvbnNoaXBzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWxhdGlvbnNoaXBzL2VqYkphciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZWxhdGlvbnNoaXBzIGNvbGxlY3Rpb24gZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluIHdoaWNoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlIGVudGl0eSBiZWFucyBhbmQgZGVwZW5kZW50IG9iamVjdHMgcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGEgbGlzdCBvZiBlamItZW50aXR5LXJlZiBlbGVtZW50cyAocmVmZXJlbmNlcyB0byBlbnRpdHkgYmVhbnMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzIGJ1dCB3aG9zZSBhYnN0cmFjdCBwZXJzaXN0ZW5jZSBzY2hlbWFzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGVqYi1qYXIgZmlsZSk7JiN4RDsmI3hBO2FuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50IiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyYjeEQ7JiN4QTtob21lIG9yIHJlbW90ZSBpbnRlcmZhY2UsIG9yIGEgc2V0IG9mIG1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50JiN4RDsmI3hBO211c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIGRlY2xhcmVkIGluIHRoZSYjeEQ7JiN4QTtkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0byYjeEQ7JiN4QTtkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgZGVmaW5lZCBpbiYjeEQ7JiN4QTtib3RoIHRoZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlOyB0aGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMmI3hEOyYjeEE7dGhlIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkgYSYjeEQ7JiN4QTtzaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG1ldGhvZCBuYW1lLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgc3ludGF4OiYjeEQ7JiN4QTsmI3hEOyYjeEE7MS4gJiN4OTsmbHQ7bWV0aG9kPiYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0O2VqYi1uYW1lPkVKQk5BTUUmbHQ7L2VqYi1uYW1lPiYjeEQ7JiN4QTsgICAmI3g5OyYjeDk7Jmx0O21ldGhvZC1uYW1lPiombHQ7L21ldGhvZC1uYW1lPiYjeEQ7JiN4QTsmI3g5OyZsdDsvbWV0aG9kPiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgc3BlY2lmaWVkJiN4RDsmI3hBOyAgIGVudGVycHJpc2UgYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7Mi4gJiN4OTsmbHQ7bWV0aG9kPiYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0O2VqYi1uYW1lPkVKQk5BTUUmbHQ7L2VqYi1uYW1lPiYjeEQ7JiN4QTsgICAmI3g5OyYjeDk7Jmx0O21ldGhvZC1uYW1lPk1FVEhPRCZsdDsvbWV0aG9kLW5hbWU+JiN4RDsmI3hBOyYjeDk7Jmx0Oy9tZXRob2Q+PiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mIHRoZSYjeEQ7JiN4QTsgICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcyB3aXRoJiN4RDsmI3hBOyAgIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YgdGhpcyBzdHlsZSByZWZlcnMgdG8mI3hEOyYjeEE7ICAgYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQgbmFtZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTszLiAmI3g5OyZsdDttZXRob2Q+JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7ZWpiLW5hbWU+RUpCTkFNRSZsdDsvZWpiLW5hbWU+JiN4RDsmI3hBOyAgICYjeDk7JiN4OTsmbHQ7bWV0aG9kLW5hbWU+TUVUSE9EJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW1zPiYjeEQ7JiN4QTsgICAmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPlBBUkFNLTEmbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7ICAgJiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5QQVJBTS0yJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyAgICAgICAgICAmI3g5OyYjeDk7JiN4OTsuLi4mI3hEOyYjeEE7ICAgJiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5QQVJBTS1uJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7L21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyYjeDk7Jmx0O21ldGhvZD4mI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYSBzZXQgb2YmI3hEOyYjeEE7ICAgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQgbmFtZS4gUEFSQU0tMSB0aHJvdWdoIFBBUkFNLW4gYXJlIHRoZSYjeEQ7JiN4QTsgICBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYmI3hEOyYjeEE7ICAgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50JiN4RDsmI3hBOyAgIGNvbnRhaW5zIG5vIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZSYjeEQ7JiN4QTsgICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZiBzcXVhcmUmI3hEOyYjeEE7ICAgYnJhY2tldHMgKGUuZy4gaW50W11bXSkuJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogbWV0aG9kLXBlcm1pc3Npb24gYW5kIGNvbnRhaW5lci10cmFuc2FjdGlvbiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZXM6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgU3R5bGUgMTogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIG9mJiN4RDsmI3hBOyYjeDk7JiN4OTt0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlczomI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7bWV0aG9kPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1uYW1lPiombHQ7L21ldGhvZC1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0Oy9tZXRob2Q+JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5O1N0eWxlIDI6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgY3JlYXRlJiN4RDsmI3hBOyYjeDk7JiN4OTttZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICYjeDk7JiN4OTsmbHQ7bWV0aG9kPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1uYW1lPmNyZWF0ZSZsdDsvbWV0aG9kLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7L21ldGhvZD4mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7U3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlJiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlJiN4RDsmI3hBOyYjeDk7ICYjeDk7RW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAmI3g5OyYjeDk7Jmx0O21ldGhvZD4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O2VqYi1uYW1lPkVtcGxveWVlU2VydmljZSZsdDsvZWpiLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtbmFtZT5jcmVhdGUmbHQ7L21ldGhvZC1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtcz4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0Oy9tZXRob2QtcGFyYW1zPiYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0Oy9tZXRob2Q+JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5O1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoJiN4RDsmI3hBOyYjeDk7bW9yZSBjb21wbGV4IHBhcmFtZXRlciB0eXBlcy4gVGhlIG1ldGhvZCYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTtmb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLCYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O215cGFja2FnZS5NeUNsYXNzW11bXSBteWNsYWFyKSYjeEQ7JiN4QTsgICAgICAgIHdvdWxkIGJlIHNwZWNpZmllZCBhczomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAmI3g5OyYjeDk7Jmx0O21ldGhvZD4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O2VqYi1uYW1lPkVtcGxveWVlU2VydmljZSZsdDsvZWpiLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtbmFtZT5mb29iYXImbHQ7L21ldGhvZC1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtcz4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPmNoYXImbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPmludCZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+aW50W10mbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzc1tdW10mbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0Oy9tZXRob2QtcGFyYW1zPiYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0Oy9tZXRob2Q+JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5O1RoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdoZW4gaXQgYmVjb21lcyYjeEQ7JiN4QTsgICBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUmI3hEOyYjeEE7ICAgaW50ZXJmYWNlIGFuZCBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHNpZ25hdHVyZSB0aGF0IGlzJiN4RDsmI3hBOyAgIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5O0ZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQmI3hEOyYjeEE7JiN4RDsmI3hBOyAgICYjeDk7JiN4OTsmbHQ7bWV0aG9kPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1pbnRmPlJlbW90ZSZsdDsvbWV0aG9kLWludGY+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtbmFtZT5jcmVhdGUmbHQ7L21ldGhvZC1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtcz4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0Oy9tZXRob2QtcGFyYW1zPiYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0Oy9tZXRob2Q+JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5O2NhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kJiN4RDsmI3hBOyAgIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKSYjeEQ7JiN4QTsgICBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZSBpbnRlcmZhY2UsIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMmI3hEOyYjeEE7JiN4RDsmI3hBOyAgICYjeDk7JiN4OTsmbHQ7bWV0aG9kPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1pbnRmPkhvbWUmbHQ7L21ldGhvZC1pbnRmPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLW5hbWU+Y3JlYXRlJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDsvbWV0aG9kLXBhcmFtcz4mI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDsvbWV0aG9kPiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXRob2QtbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gbWV0aG9kLCYjeEQ7JiN4QTtvciB0aGUgYXN0ZXJpc2sgKCopIGNoYXJhY3Rlci4gVGhlIGFzdGVyaXNrIGlzIHVzZWQgd2hlbiB0aGUgZWxlbWVudCYjeEQ7JiN4QTtkZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kIGhvbWUmI3hEOyYjeEE7aW50ZXJmYWNlcy4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcm1zIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBhIGxpc3Qgb2YgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLiAgSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdGhpcyBpcyBhIHNwYWNlIGRlbGltaXR0ZWQgU3RyaW5nLiAgQSBudWxsIHN0cmluZyBpbmRpY2F0ZXMgYSBnZW5lcmljIG1ldGhvZCBlbGVtZW50IHRoYXQgY2FuIGFwcGx5IHRvIG11bHRpcGxlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lLiAgQW4gZW1wdHkgc3RyaW5nIGluZGljYXRlcyBhIG1ldGhvZCB3aXRoIHplcm8gcGFyYW1ldGVycy4gIEluIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgKHBvc3QgVjUpLCB0aGlzIGZpZWxkIHdpbGwgYmUgZGVwcmVjYXRlZCBhbmQgbWlncmF0ZWQgdG8gdXNlIHRoZSBtdWx0aS12YWx1ZWQgcGFyYW1zIGZpZWxkIGFuZCB0aGUgaXNaZXJvUGFyYW1zIGZsYWcuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudEtpbmQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW50ZXJwcmlzZUJlYW4iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FbnRlcnByaXNlQmVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9Ik1ldGhvZEVsZW1lbnRLaW5kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGFkZGVkIFNlcnZpY2VFbmRwb2ludCYjeEQ7JiN4QTtVbnNwZWNpZmllZD0wJiN4RDsmI3hBO1JlbW90ZT0xJiN4RDsmI3hBO0hvbWU9MiYjeEQ7JiN4QTtMb2NhbD0zJiN4RDsmI3hBO0xvY2FsSG9tZT00JiN4RDsmI3hBO1NlcnZpY2VFbmRwb2ludD01Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJVbnNwZWNpZmllZCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUmVtb3RlIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSG9tZSIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxvY2FsIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTG9jYWxIb21lIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU2VydmljZUVuZHBvaW50IiB2YWx1ZT0iNSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDTVBBdHRyaWJ1dGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRUF0dHJpYnV0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZSBmaWVsZCBlbGVtZW50IGluY2x1ZGVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwgYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBjbXIgZmllbGQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVsYXRpb25zaGlwcyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVsYXRpb25zaGlwcyBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4gd2hpY2ggZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgY29sbGVjdGlvbiBvZiByZWxhdGlvbnNoaXBzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWpiSmFyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRUpCSmFyIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRUpCSmFyL3JlbGF0aW9uc2hpcExpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWpiUmVsYXRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0VKQlJlbGF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJSZWxhdGlvbi9yZWxhdGlvbnNoaXBMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlF1ZXJ5IiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBxdWVyeSBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGZpbmRlciBvciBzZWxlY3QgcXVlcnkuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeTsgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QgbWV0aG9kIGl0IGlzIHVzZWQgYnk7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmV0dXJuIHR5cGUgbWFwcGluZywgaWYgYW55LCBpZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZDsgYW5kIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuIFF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwgZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeSYjeEQ7JiN4QTtpcyBub3QgZXhwcmVzc2libGUgaW4gRUpCIFFMLCB0aGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgYmUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBxdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50IHNob3VsZCBiZSBlbXB0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHF1ZXJ5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWpiUUwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250YWlucyB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgYSBmaW5kZXIgb3Igc2VsZWN0IHF1ZXJ5LiBUaGlzIGVsZW1lbnQgaXMgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgcXVlcnkgZWxlbWVudCB3aG9zZSBjb250ZW50cyBzcGVjaWZ5IHRoZSBmaW5kZXIgb3IgdGhlIHNlbGVjdCBtZXRob2QgdGhhdCB1c2VzIHRoZSBxdWVyeS4gVGhlIGNvbnRlbnQgbXVzdCBiZSBhIHZhbGlkIEVKQiBRTCBxdWVyeSBzdHJpbmcgZm9yIHRoZSBlbnRpdHkgYmVhbiBmb3Igd2hpY2ggdGhlIHF1ZXJ5IGlzIHNwZWNpZmllZC4gVGhlIGVqYi1xbCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbGwgcXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwuJiN4RDsmI3hBOyYjeEQ7JiN4QTtAaW52YXJpYW50IFRoZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgRUpCIFFMIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIGVudGl0eSBiZWFuIG9yIGRlcGVuZGVudCBvYmplY3QgY2xhc3MgZm9yIHdoaWNoIHRoZSBxdWVyeSBpcyBzcGVjaWZpZWQuJiN4RDsmI3hBO0BpbnZhcmlhbnQgVGhlIGVqYi1xbCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbGwgcXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmbHQ7cXVlcnk+JiN4RDsmI3hBOyZsdDtxdWVyeS1tZXRob2Q+JiN4RDsmI3hBOyZsdDttZXRob2QtbmFtZT5lamJTZWxlY3RQZW5kaW5nTGluZWl0ZW1zJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7Jmx0O21ldGhvZC1wYXJhbXMvPiYjeEQ7JiN4QTsmbHQ7L3F1ZXJ5LW1ldGhvZD4mI3hEOyYjeEE7Jmx0O2VqYi1xbD5TRUxFQ1QgRU5USVRZKGwpJiN4RDsmI3hBO0ZST00gTGluZUl0ZW1zIGwmI3hEOyYjeEE7V0hFUkUgbC5zaGlwcGVkIGlzIEZBTFNFJiN4RDsmI3hBOyZsdDsvZWpiLXFsPiYjeEQ7JiN4QTsmbHQ7L3F1ZXJ5PiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXR1cm5UeXBlTWFwcGluZyIgZVR5cGU9IiMvL1JldHVyblR5cGVNYXBwaW5nIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvIHNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSB0aGF0IGlzIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgc2VsZWN0IG1ldGhvZCBpcyB0byBiZSBtYXBwZWQgdG8gYW4gRUpCTG9jYWxPYmplY3Qgb3IgRUpCT2JqZWN0IHR5cGUuICBUaGUgdmFsdWUgb2YgdGhlIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCwgaWYgc3BlY2lmaWVkIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InF1ZXJ5TWV0aG9kIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUXVlcnlNZXRob2QiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1F1ZXJ5TWV0aG9kL3F1ZXJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWV0aG9kIChEQi9TUi9DTS0mcXVvdDtvbiB0aGUgaG9tZSZxdW90OykgZm9yIGEgZmluZGVyIG9yJiN4RDsmI3hBO3NlbGVjdCBxdWVyeS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGZpbmRlciBvciBzZWxlY3QmI3hEOyYjeEE7bWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzIG9yIGEgc2VsZWN0IG1ldGhvZCBpbiYjeEQ7JiN4QTt0aGUgZGVwZW5kZW50IG9iamVjdCBjbGFzcy4mI3hEOyYjeEE7JiN4RDsmI3hBO0VhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlJiN4RDsmI3hBO21ldGhvZC1wYXJhbXMgZWxlbWVudC4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHF1ZXJ5JiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7Jmx0O3F1ZXJ5PiYjeEQ7JiN4QTsgICZsdDtkZXNjcmlwdGlvbj5NZXRob2QgZmluZHMgbGFyZ2Ugb3JkZXJzJmx0Oy9kZXNjcmlwdGlvbj4mI3hEOyYjeEE7ICAmbHQ7cXVlcnktbWV0aG9kPiYjeEQ7JiN4QTsgICAgJmx0O21ldGhvZC1uYW1lPmZpbmRMYXJnZU9yZGVycyZsdDsvbWV0aG9kLW5hbWU+JiN4RDsmI3hBOyAgICAmbHQ7bWV0aG9kLXBhcmFtcz4mbHQ7L21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyAgJmx0Oy9xdWVyeS1tZXRob2Q+JiN4RDsmI3hBOyAgJmx0O2VqYi1xbD5TRUxFQ1QgRU5USVRZKG8pIEZST00gT3JkZXIgbyBXSEVSRSBvLmFtb3VudCAmYW1wO2d0OyAxMDAwJmx0Oy9lamItcWw+JiN4RDsmI3hBOyZsdDsvcXVlcnk+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0eSIgZVR5cGU9IiMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Db250YWluZXJNYW5hZ2VkRW50aXR5L3F1ZXJpZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRUpCUmVsYXRpb24iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuMyYjeEQ7JiN4QTtUaGUgZWpiLXJlbGF0aW9uIGVsZW1lbnQgZGVzY3JpYmVzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlLiBBbiBlamItcmVsYXRpb24gZWxlbWVudCBjb250YWlucyBhIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28gcmVsYXRpb25zaGlwIHJvbGUgZGVjbGFyYXRpb25zLCBkZWZpbmVkIGJ5IHRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVzLiBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4mI3hEOyYjeEE7JiN4RDsmI3hBO0BpbnZhcmlhbnQgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuJiN4RDsmI3hBO0BpbnZhcmlhbnQgc2VsZi5yZWxhdGlvbnNoaXBSb2xlcy5zaXplID09IDImI3hEOyYjeEE7QGludmFyaWFudCBzZWxmLnJlbGF0aW9uc2hpcFJvbGVzWzBdLm5hbWUgIT0gc2VsZi5yZWxhdGlvbnNoaXBSb2xlc1sxXS5uYW1lJiN4RDsmI3hBOyYjeEQ7JiN4QTtAbWlncmF0aW9uIEVKQjEuMSBNb3ZlZCBmcm9tIGVqYmV4dDo6RWpiUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgdW5kZXIgZWpiZXh0OjpFSkJKYXJFeHRlbnNpb24mI3hEOyYjeEE7QG1pZ3JhdGlvbiBFSkIxLjEgYWRkZWQgb3B0aW9uYWwgYXR0cmlidXRlLCBkZXNjcmlwdGlvbjpTdHJpbmcmI3hEOyYjeEE7QG1pZ3JhdGlvbiBFSkIxLjEgYWRkZWQgb3B0aW9uYWwgYXR0cmlidXRlLCBuYW1lOlN0cmluZyAoTWF5IGhhdmUgYmVlbiBpbmhlcml0ZWQgZnJvbSBSZWZCYXNlT2JqZWN0IHByZXZpb3VzbHkpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBlamIgcmVsYXRpb24uJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gSWYgc3BlY2lmaWVkLCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4mI3hEOyYjeEE7QGludmFyaWFudCBzZWxmLm5hbWUgdW5pcXVlIHdpdGhpbiBTZXQmbHQ7Y29sbGVjdChlamJKYXIuZWpiUmVsYXRpb25zLm5hbWUpPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWxhdGlvbnNoaXBMaXN0IiBlVHlwZT0iIy8vUmVsYXRpb25zaGlwcyIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlbGF0aW9uc2hpcHMvZWpiUmVsYXRpb25zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlbGF0aW9uc2hpcFJvbGVzIiBsb3dlckJvdW5kPSIyIgotICAgICAgICB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vRUpCUmVsYXRpb25zaGlwUm9sZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRUpCUmVsYXRpb25zaGlwUm9sZS9yZWxhdGlvbnNoaXAiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gY29udGFpbmluZyBleGFjdGx5IHR3byByZWxhdGlvbnNoaXAgcm9sZXMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtAbWlncmF0aW9uIEVKQjEuMSBDb250YWlubWVudCB1c2VkIHRvIGJlIGJ5IHJlZmVyZW5jZSBvbiByZWxhdGlvbi0tbm93IGJ5IHZhbHVlLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVKQlJlbGF0aW9uc2hpcFJvbGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuMyYjeEQ7JiN4QTtUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnQgZGVzY3JpYmVzIGEgcm9sZSB3aXRoaW4gYSByZWxhdGlvbnNoaXAuJiN4RDsmI3hBO1RoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHJlbGF0aW9uc2hpcCByb2xlOyBhIHNwZWNpZmljYXRpb24gb2YgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcm9sZTsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiBjYXNjYWRlLWRlbGV0ZSBmdW5jdGlvbmFsaXR5IGZvciB0aGUgcm9sZTsgdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgY21yLWZpZWxkLCBpZiBhbnksIGJ5IG1lYW5zIG9mIHdoaWNoIHRoZSBvdGhlciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHJvbGUgc291cmNlLiBUaGUgbXVsdGlwbGljaXR5IGFuZCByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBhcmUgbWFuZGF0b3J5LiBUaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgZGVzaWduYXRlcyBhbiBlbnRpdHktYmVhbiBieSBtZWFucyBvZiBhbiBlamItbmFtZSBlbGVtZW50LiBGb3IgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHRoYXQgc3BlY2lmaWVzIGEgY21yLWZpZWxkIGluIHRlcm1zIG9mIHdoaWNoIHRoZSByZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQuIFRoZSBsYWNrIG9mIGEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcyB0aGF0IHRoZSByZWxhdGlvbnNoaXAgaXMgdW5pZGlyZWN0aW9uYWwgaW4gbmF2aWdhYmlsaXR5IGFuZCB0aGF0IGVudGl0eSBiZWFuIHRoYXQgcGFydGljaXBhdGVzIGluIHRoZSByZWxhdGlvbnNoaXAgaXMgJnF1b3Q7bm90IGF3YXJlJnF1b3Q7IG9mIHRoZSByZWxhdGlvbnNoaXAuJiN4RDsmI3hBOyYjeEQ7JiN4QTtAaW52YXJpYW50IG11bHRpcGxpY2l0eSAhPSBudWxsJiN4RDsmI3hBO0BpbnZhcmlhbnQgcm9sZVNvdXJjZSAhPSBudWxsJiN4RDsmI3hBO0BpbnZhcmlhbnQgQ2FzY2FkZSBkZWxldGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGluIGFuIEVKQlJlbGF0aW9uc2hpcFJvbGUgZWxlbWVudCBpbiB3aGljaCB0aGUgcm9sZVNvdXJjZSBlbGVtZW50IHNwZWNpZmllcyBhIGRlcGVuZGVudCBvYmplY3QgY2xhc3MuICYjeEQ7JiN4QTtAaW52YXJpYW50IENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gRUpCUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgaW4gYW4gRUpCcmVsYXRpb24gaW4gd2hpY2ggdGhlIG90aGVyIEVKQlJlbGF0aW9uc2hpcFJvbGUgZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7Jmx0O2VqYi1yZWxhdGlvbj4mI3hEOyYjeEE7ICAmbHQ7ZWpiLXJlbGF0aW9uLW5hbWU+UHJvZHVjdC1MaW5lSXRlbSZsdDsvZWpiLXJlbGF0aW9uLW5hbWU+JiN4RDsmI3hBOyAgJmx0O2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4mI3hEOyYjeEE7ICAgICZsdDtlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5wcm9kdWN0LWhhcy1saW5laXRlbXMmbHQ7L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPiYjeEQ7JiN4QTsgICAgJmx0O211bHRpcGxpY2l0eT5PbmUmbHQ7L211bHRpcGxpY2l0eT4mI3hEOyYjeEE7ICAgICZsdDtyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+JiN4RDsmI3hBOyAgICAgICZsdDtlamItbmFtZT5Qcm9kdWN0RUpCJmx0Oy9lamItbmFtZT4mI3hEOyYjeEE7ICAgICZsdDsvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPiYjeEQ7JiN4QTsgICZsdDsvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPiYjeEQ7JiN4QTsuLi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGVqYiByZWxhdGlvbnNoaXAgcm9sZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGVOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyBhIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBjYW4gdXNlIHRoZSBzYW1lIG5hbWUgZm9yIGEgcm9sZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im11bHRpcGxpY2l0eSIgZVR5cGU9IiMvL011bHRpcGxpY2l0eUtpbmQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIG11bHRpcGxpY2l0eSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiYjeEQ7JiN4QTsgICAgIE9uZSYjeEQ7JiN4QTsgICAgIE1hbnkmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVEZWxldGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhIHBhcnRpY3VsYXIgcmVsYXRpb25zaGlwLCB0aGUgbGlmZXRpbWUgb2Ygb25lIG9yIG1vcmUgZW50aXR5IGJlYW5zIGlzIGRlcGVuZGVudCB1cG9uIHRoZSBsaWZldGltZSBvZiBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBjYW4gQ2FzY2FkZSBkZWxldGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIGNvbnRhaW5lZCBpbiBhbiBFSkJyZWxhdGlvbiBpbiB3aGljaCB0aGUgb3RoZXIgRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlbGF0aW9uc2hpcCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0VKQlJlbGF0aW9uIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRUpCUmVsYXRpb24vcmVsYXRpb25zaGlwUm9sZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic291cmNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUm9sZVNvdXJjZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUm9sZVNvdXJjZS9yb2xlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzIGFuIGVudGl0eSBiZWFuLiYjeEQ7JiN4QTtAbWlncmF0aW9uIEVKQjEuMTogd2FzIGlibWVqYmV4dDo6RWpiUmVsYXRpb25zaGlwUm9sZTo6c291cmNlRUpCTmFtZSwgYnV0IHRoYXQgbWF5IG5vdCBiZSBzdWZmaWNpZW50LCBhcyB0aGlzIGNhbiBub3cgcmVmZXIgdG8gZGVwZW5kZW50IGNsYXNzIG5hbWVzIG9yIGVqYiByZWZzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNtckZpZWxkIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQ01SRmllbGQiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0NNUkZpZWxkL3JvbGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlY2xhcmF0aW9uIG9mIHRoZSBDTVJGaWVsZCwgaWYgYW55LCBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZSYjeEQ7JiN4QTsmI3hEOyYjeEE7QG1pZ3JhdGlvbiBFSkIxLjE6IFVzZWQgdG8gYmUgaGFuZGxlZCB2aWEgaWJtZWpiZXh0OjpFamJSb2xlOjphdHRyaWJ1dGVzIGxpc3QiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTb3VyY2UiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzIGFuIGVudGl0eSBiZWFuLiYjeEQ7JiN4QTtAaW52YXJpYW50IFRoZSBjb250ZW50IG9mIGVhY2ggcm9sZS1zb3VyY2UgZWxlbWVudCBzaGFsbCByZWZlciB0byBhbiBleGlzdGluZyBlbnRpdHkgYmVhbiwgZW50aXR5IGJlYW4gcmVmZXJlbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0VKQlJlbGF0aW9uc2hpcFJvbGUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL3NvdXJjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnRpdHlCZWFuIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQ29udGFpbmVyTWFuYWdlZEVudGl0eSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ01SRmllbGQiIGVTdXBlclR5cGVzPSIjLy9DTVBBdHRyaWJ1dGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjMmI3hEOyYjeEE7RGVzY3JpYmVzIHRoZSBiZWFuIHByb3ZpZGVyJ3MgdmlldyBvZiBhIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBhbmQgdGhlIGNsYXNzIHR5cGUgb2YgYSBmaWVsZCBpbiB0aGUgc291cmNlIG9mIGEgcm9sZSBvZiBhIHJlbGF0aW9uc2hpcC4gVGhlIENNUkZpZWxkOjpuYW1lIGVsZW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yIG1ldGhvZHMgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBDTVJGaWVsZDo6dHlwZSBlbGVtZW50IGlzIHVzZWQgb25seSBmb3IgY29sbGVjdGlvbi12YWx1ZWQgQ01SRmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBpcyB1c2VkIChhIGphdmEgY2xhc3MgbmFtZSkuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZSIgZVR5cGU9IiMvL0VKQlJlbGF0aW9uc2hpcFJvbGUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL2NtckZpZWxkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbGxlY3Rpb25UeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1lc3NhZ2VEcml2ZW4iIGVTdXBlclR5cGVzPSIjLy9FbnRlcnByaXNlQmVhbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbiYjeEQ7JiN4QTtiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZSYjeEQ7JiN4QTsgICAgICBpY29uIGZpbGUgbmFtZS4mI3hEOyYjeEE7ICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4mI3hEOyYjeEE7ICAgICAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciYjeEQ7JiN4QTsgICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnaW5nJiN4RDsmI3hBOyAgICAgIHR5cGUmI3hEOyYjeEE7ICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyYjeEQ7JiN4QTsgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyYjeEQ7JiN4QTsgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyYjeEQ7JiN4QTsgICAgICBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50JiN4RDsmI3hBOyAgICAgIGVudHJpZXMmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQiYjeEQ7JiN4QTsgICAgICByZWZlcmVuY2VzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIHNlcnZpY2UmI3hEOyYjeEE7ICAgICAgcmVmZXJlbmNlcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkmI3hEOyYjeEE7ICAgICAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzJiN4RDsmI3hBOyAgICAgIG1ldGhvZHMmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyYjeEQ7JiN4QTsgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSYjeEQ7JiN4QTsgICAgICByZWZlcmVuY2VzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UmI3hEOyYjeEE7ICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4mI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlJiN4RDsmI3hBOyAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNhY3Rpb25UeXBlIiBlVHlwZT0iIy8vVHJhbnNhY3Rpb25UeXBlIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogQmVhbiwgQ29udGFpbmVyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1lc3NhZ2VTZWxlY3RvciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXNzYWdlLXNlbGVjdG9yIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBKTVMgbWVzc2FnZSYjeEQ7JiN4QTtzZWxlY3RvciB0byBiZSB1c2VkIGluIGRldGVybWluaW5nIHdoaWNoIG1lc3NhZ2VzIGEgbWVzc2FnZS1kcml2ZW4mI3hEOyYjeEE7YmVhbiBpcyB0byByZWNlaXZlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZSB2YWx1ZTogJiN4RDsmI3hBO0pNU1R5cGUgPSBgY2FyJyBBTkQgY29sb3IgPSBgYmx1ZScgQU5EIHdlaWdodCA+IDI1MDAmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFja25vd2xlZGdlTW9kZSIgZVR5cGU9IiMvL0Fja25vd2xlZGdlTW9kZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9ImFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBhY2tub3dsZWRnbWVudCBtb2RlIGZvciB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbiBpZiBiZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gaXMgdXNlZCAoaWUuIHNlbGYudHJhbnNhY3Rpb25UeXBlID0gQmVhbikmI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBhY2tub3dsZWRnZS1tb2RlIHNwZWNpZmllcyB3aGV0aGVyIEpNUyBBVVRPX0FDS05PV0xFREdFIG9yIERVUFNfT0tfQUNLTk9XTEVER0UgbWVzc2FnZSBhY2tub3dsZWRnbWVudCBzZW1hbnRpY3Mgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBvbk1lc3NhZ2UgbWVzc2FnZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdGhhdCB1c2VzIGJlYW4gbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBhY2tub3dsZWRnZS1tb2RlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiAgQXV0by1hY2tub3dsZWRnZSwgRHVwcy1vay1hY2tub3dsZWRnZSYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGluayIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MmI3hEOyYjeEE7JiN4OTsgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc3RpbmF0aW9uIiBlVHlwZT0iIy8vTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24vYmVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBhY3RpdmF0aW9uQ29uZmlnJiN4RDsmI3hBO0FuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBpbnRlbmRlZCBkZXN0aW5hdGlvbiB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGl2YXRpb25Db25maWciIGVUeXBlPSIjLy9BY3RpdmF0aW9uQ29uZmlnIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWVzc2FnZURlc3RpbmF0aW9uIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdpbmdUeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UmI3hEOyYjeEE7ICAgICAgICBsaXN0ZW5lciBpbnRlcmZhY2Ugb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4uIElmJiN4RDsmI3hBOyAgICAgICAgdGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMmI3hEOyYjeEE7ICAgICAgICBhc3N1bWVkIHRvIGJlIGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24gZWxlbWVudCBwcm92aWRlcyBhZHZpY2UgdG8gdGhlIERlcGxveWVyIGFzIHRvIHdoZXRoZXIgYSBtZXNzYWdlLWRyaXZlbiBiZWFuIGlzIGludGVuZGVkIGZvciBhIFF1ZXVlIG9yIGEgVG9waWMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjogdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyBpbnRlbmRlZCBkZXN0aW5hdGlvbiBhbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2Ygd2hldGhlciBhIGR1cmFibGUgb3Igbm9uLWR1cmFibGUgc3Vic2NyaXB0aW9uIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBkZXN0aW5hdGlvbi10eXBlIGlzIGphdmF4Lmptcy5Ub3BpYy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9IiMvL0Rlc3RpbmF0aW9uVHlwZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBKTVMgZGVzdGluYXRpb24uIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlc3RpbmF0aW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogamF2YXguam1zLlF1ZXVlLCBqYXZheC5qbXMuVG9waWMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3Vic2NyaXB0aW9uRHVyYWJpbGl0eSIKLSAgICAgICAgZVR5cGU9IiMvL1N1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYSBKTVMgdG9waWMgc3Vic2NyaXB0aW9uIGlzIGludGVuZGVkIHRvIGJlIGR1cmFibGUgb3Igbm9uZHVyYWJsZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBzdWJzY3JpcHRpb24tZHVyYWJpbGl0eSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiAgRHVyYWJsZSwgTm9uRHVyYWJsZSYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmVhbiIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL01lc3NhZ2VEcml2ZW4iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9NZXNzYWdlRHJpdmVuL2Rlc3RpbmF0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQWNrbm93bGVkZ2VNb2RlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBdXRvLWFja25vd2xlZGdlPTAmI3hEOyYjeEE7RHVwcy1vay1hY2tub3dsZWRnZT0xIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJBdXRvQWNrbm93bGVkZ2UiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkR1cHNPa0Fja25vd2xlZGdlIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEdXJhYmxlPTAmI3hEOyYjeEE7Tm9uRHVyYWJsZT0xIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJEdXJhYmxlIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJOb25EdXJhYmxlIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlJldHVyblR5cGVNYXBwaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMb2NhbD0wJiN4RDsmI3hBO1JlbW90ZT0xIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJMb2NhbCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUmVtb3RlIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeGNsdWRlTGlzdCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhjbHVkZSBsaXN0IGVsZW1lbnQgZGVmaW5lcyBhIHNldCBvZiBtZXRob2RzIHdoaWNoIHRoZSBBc3NlbWJsZXIgbWFya3MgdG8gYmUgdW5jYWxsYWJsZS4gSXQgY29udGFpbnMgb25lIG9yIG1vcmUgbWV0aG9kcy4mI3hEOyYjeEE7JiN4RDsmI3hBO0lmIHRoZSBtZXRob2QgcGVybWlzc2lvbiByZWxhdGlvbiBjb250YWlucyBtZXRob2RzIHRoYXQgYXJlIGluIHRoZSBleGNsdWRlIGxpc3QsIHRoZSBEZXBsb3llciBtdXN0IGNvbnNpZGVyIHRob3NlIG1ldGhvZHMgdG8gYmUgdW5jYWxsYWJsZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RFbGVtZW50cyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJEZXN0aW5hdGlvblR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlF1ZXVlPTAmI3hEOyYjeEE7VG9waWM9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUXVldWUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlRvcGljIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJRdWVyeU1ldGhvZCIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJxdWVyeSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1F1ZXJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUXVlcnkvcXVlcnlNZXRob2QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJNdWx0aXBsaWNpdHlLaW5kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPbmU9MCYjeEQ7JiN4QTtNYW55PTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9uZSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTWFueSIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIG5hbWUvdmFsdWUmI3hEOyYjeEE7Y29uZmlndXJhdGlvbiBwcm9wZXJ0eSBwYWlyIGZvciBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXImI3hEOyYjeEE7bWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQmI3hEOyYjeEE7ICAgICAgICBjb250YWlucyB0aGUgdmFsdWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiYjeEQ7JiN4QTsgICAgICAgIHByb3BlcnR5IG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIGVsZW1lbnQgY29udGFpbnMmI3hEOyYjeEE7ICAgICAgICB0aGUgbmFtZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnR5IG9mJiN4RDsmI3hBOyAgICAgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBGb3IgSk1TIG1lc3NhZ2UtZHJpdmVuIGJlYW5zLCB0aGUgZm9sbG93aW5nIHByb3BlcnR5JiN4RDsmI3hBOyAgICAgICAgbmFtZXMgYXJlIHJlY29nbml6ZWQ6IGFja25vd2xlZGdlTW9kZSwmI3hEOyYjeEE7ICAgICAgICBtZXNzYWdlU2VsZWN0b3IsIGRlc3RpbmF0aW9uVHlwZSwgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3RpdmF0aW9uQ29uZmlnIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSYjeEQ7JiN4QTtleHBlY3RlZCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4mI3hEOyYjeEE7aW4gaXRzIG9wZXJhdGlvbmFsIGVudmlyb25tZW50LiBUaGlzIG1heSBpbmNsdWRlIGluZm9ybWF0aW9uJiN4RDsmI3hBO2Fib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZCYjeEQ7JiN4QTtkZXN0aW5hdGlvbiB0eXBlLCBldGMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YmI3hEOyYjeEE7bmFtZS92YWx1ZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXImI3hEOyYjeEE7bWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmZpZ1Byb3BlcnRpZXMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvajJlZS5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9qMmVlLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzk3MmI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9qMmVlLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsOTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZSIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIiBtb2RlbE5hbWU9IkoyZWUiIHRlc3RzRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMiCi0gICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLnJvc2UiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhTW9kZWwuZ2VubW9kZWwjLy9qYXZhIj4KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXGoyZWUubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+V09SS1NQQUNFX1JPT1Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5EOlx3b3JrXE01PC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkNsaWVudCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJjbGllbnQuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iY2xpZW50LmVjb3JlIy8vUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNsaWVudC5lY29yZSMvL1Jlc0F1dGhBcHBsaWNhdGlvblR5cGUvQXBwbGljYXRpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY2xpZW50LmVjb3JlIy8vUmVzQXV0aEFwcGxpY2F0aW9uVHlwZS9Db250YWluZXIiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNsaWVudC5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjbGllbnQuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudC92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNsaWVudC5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50L3Jlc291cmNlUmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjbGllbnQuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudC9lbnZpcm9ubWVudFByb3BzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNsaWVudC5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50L2VqYlJlZmVyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQvcmVzb3VyY2VFbnZSZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQvY2FsbGJhY2tIYW5kbGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNsaWVudC5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50L3NlcnZpY2VSZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNsaWVudC5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50L21lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQvbWVzc2FnZURlc3RpbmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iQXBwbGljYXRpb24iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0iYXBwbGljYXRpb24uZWNvcmUjLyI+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9BcHBsaWNhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXBwbGljYXRpb24uZWNvcmUjLy9BcHBsaWNhdGlvbi92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGFwcGxpY2F0aW9uLmVjb3JlIy8vQXBwbGljYXRpb24vc2VjdXJpdHlSb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBhcHBsaWNhdGlvbi5lY29yZSMvL0FwcGxpY2F0aW9uL21vZHVsZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9Nb2R1bGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGFwcGxpY2F0aW9uLmVjb3JlIy8vTW9kdWxlL3VyaSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGFwcGxpY2F0aW9uLmVjb3JlIy8vTW9kdWxlL2FsdEREIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGFwcGxpY2F0aW9uLmVjb3JlIy8vTW9kdWxlL2FwcGxpY2F0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViTW9kdWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhcHBsaWNhdGlvbi5lY29yZSMvL1dlYk1vZHVsZS9jb250ZXh0Um9vdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL0phdmFDbGllbnRNb2R1bGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL0VqYk1vZHVsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vQ29ubmVjdG9yTW9kdWxlIi8+Ci0gICAgPG5lc3RlZEdlblBhY2thZ2VzIHByZWZpeD0iQXBwbGljYXRpb24iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgICAgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJhcHBsaWNhdGlvbi5lY29yZSMvIj4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vQXBwbGljYXRpb24iIGxhYmVsRmVhdHVyZT0iIy8vY29tbW9uL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwL2Rpc3BsYXlOYW1lIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGFwcGxpY2F0aW9uLmVjb3JlIy8vQXBwbGljYXRpb24vdmVyc2lvbiIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGFwcGxpY2F0aW9uLmVjb3JlIy8vQXBwbGljYXRpb24vc2VjdXJpdHlSb2xlcyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGFwcGxpY2F0aW9uLmVjb3JlIy8vQXBwbGljYXRpb24vbW9kdWxlcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9Nb2R1bGUiIGxhYmVsRmVhdHVyZT0iIy8vYXBwbGljYXRpb24vYXBwbGljYXRpb24vTW9kdWxlL3VyaSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhcHBsaWNhdGlvbi5lY29yZSMvL01vZHVsZS91cmkiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGFwcGxpY2F0aW9uLmVjb3JlIy8vTW9kdWxlL2FsdEREIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYXBwbGljYXRpb24uZWNvcmUjLy9Nb2R1bGUvYXBwbGljYXRpb24iLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViTW9kdWxlIiBsYWJlbEZlYXR1cmU9IiMvL2FwcGxpY2F0aW9uL2FwcGxpY2F0aW9uL01vZHVsZS91cmkiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXBwbGljYXRpb24uZWNvcmUjLy9XZWJNb2R1bGUvY29udGV4dFJvb3QiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vSmF2YUNsaWVudE1vZHVsZSIgbGFiZWxGZWF0dXJlPSIjLy9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbi9Nb2R1bGUvdXJpIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL0VqYk1vZHVsZSIgbGFiZWxGZWF0dXJlPSIjLy9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbi9Nb2R1bGUvdXJpIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL0Nvbm5lY3Rvck1vZHVsZSIgbGFiZWxGZWF0dXJlPSIjLy9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbi9Nb2R1bGUvdXJpIi8+Ci0gICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iQ29tbW9uIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIiBlY29yZVBhY2thZ2U9ImNvbW1vbi5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJjb21tb24uZWNvcmUjLy9FbnZFbnRyeVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9FbnZFbnRyeVR5cGUvU3RyaW5nIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL0VudkVudHJ5VHlwZS9JbnRlZ2VyIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL0VudkVudHJ5VHlwZS9Cb29sZWFuIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL0VudkVudHJ5VHlwZS9Eb3VibGUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vRW52RW50cnlUeXBlL0J5dGUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vRW52RW50cnlUeXBlL1Nob3J0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL0VudkVudHJ5VHlwZS9Mb25nIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL0VudkVudHJ5VHlwZS9GbG9hdCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9FbnZFbnRyeVR5cGUvQ2hhcmFjdGVyIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJjb21tb24uZWNvcmUjLy9SZXNBdXRoVHlwZUJhc2UiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9SZXNBdXRoVHlwZUJhc2UvQ29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL1Jlc0F1dGhUeXBlQmFzZS9BcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9SZXNBdXRoVHlwZUJhc2UvU0VSVkxFVCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iY29tbW9uLmVjb3JlIy8vRWpiUmVmVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL0VqYlJlZlR5cGUvU2Vzc2lvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9FamJSZWZUeXBlL0VudGl0eSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iY29tbW9uLmVjb3JlIy8vUmVzU2hhcmluZ1Njb3BlVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL1Jlc1NoYXJpbmdTY29wZVR5cGUvU2hhcmVhYmxlIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL1Jlc1NoYXJpbmdTY29wZVR5cGUvVW5zaGFyZWFibGUiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS9Db25zdW1lcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUvUHJvZHVjZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlL0NvbnN1bWVzUHJvZHVjZXMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0VqYlJlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRWpiUmVmL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FamJSZWYvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VqYlJlZi9ob21lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRWpiUmVmL3JlbW90ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VqYlJlZi9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRWpiUmVmL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0VqYlJlZi9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vRW52RW50cnkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VudkVudHJ5L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRW52RW50cnkvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VudkVudHJ5L3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRW52RW50cnkvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9FbnZFbnRyeS9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlUmVmL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VSZWYvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlUmVmL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9SZXNvdXJjZVJlZi9hdXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VSZWYvbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlUmVmL3Jlc1NoYXJpbmdTY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9SZXNvdXJjZVJlZi9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlUmVmIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGVSZWYvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZVJlZi9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZVJlZi9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZVJlZi9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGUvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGUvcm9sZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9SZXNvdXJjZUVudlJlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VFbnZSZWYvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9SZXNvdXJjZUVudlJlZi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VFbnZSZWYvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9SZXNvdXJjZUVudlJlZi9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vRUpCTG9jYWxSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VKQkxvY2FsUmVmL2xvY2FsSG9tZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VKQkxvY2FsUmVmL2xvY2FsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9SdW5Bc1NwZWNpZmllZElkZW50aXR5L2lkZW50aXR5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0lkZW50aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9JZGVudGl0eS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0lkZW50aXR5L3JvbGVOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0lkZW50aXR5L2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9JY29uVHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vSWNvblR5cGUvc21hbGxJY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vSWNvblR5cGUvbGFyZ2VJY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vSWNvblR5cGUvbGFuZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9EaXNwbGF5TmFtZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRGlzcGxheU5hbWUvbGFuZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0Rpc3BsYXlOYW1lL3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvblJlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uUmVmL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb25SZWYvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvblJlZi91c2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvblJlZi9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvblJlZi9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb24vbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9QYXJhbVZhbHVlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9QYXJhbVZhbHVlL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9QYXJhbVZhbHVlL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUGFyYW1WYWx1ZS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9QYXJhbVZhbHVlL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbkdyb3VwIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25Hcm91cC9pY29ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbkdyb3VwL2Rpc3BsYXlOYW1lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbkdyb3VwL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0pORElFbnZSZWZzR3JvdXAiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9KTkRJRW52UmVmc0dyb3VwL2Vudmlyb25tZW50UHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9KTkRJRW52UmVmc0dyb3VwL3Jlc291cmNlUmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9KTkRJRW52UmVmc0dyb3VwL2VqYlJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vSk5ESUVudlJlZnNHcm91cC9yZXNvdXJjZUVudlJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vSk5ESUVudlJlZnNHcm91cC9lamJMb2NhbFJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vSk5ESUVudlJlZnNHcm91cC9tZXNzYWdlRGVzdGluYXRpb25SZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0pORElFbnZSZWZzR3JvdXAvc2VydmljZVJlZnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlJZGVudGl0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlJZGVudGl0eS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9TZWN1cml0eUlkZW50aXR5L2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9Vc2VDYWxsZXJJZGVudGl0eSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbi9sYW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24vdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vUU5hbWUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1FOYW1lL25hbWVzcGFjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1FOYW1lL2xvY2FsUGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1FOYW1lL2NvbWJpbmVkUU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9RTmFtZS9pbnRlcm5hbFByZWZpeE9yTnNVUkkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vTGlzdGVuZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0xpc3RlbmVyL2xpc3RlbmVyQ2xhc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwL3NtYWxsSWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwL2xhcmdlSWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAvZGlzcGxheU5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9KMkVFRUF0dHJpYnV0ZSIvPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJFamIiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0iZWpiLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS9Ob3RTdXBwb3J0ZWQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlL1N1cHBvcnRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS9SZXF1aXJlZCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUvUmVxdWlyZXNOZXciLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlL01hbmRhdG9yeSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUvTmV2ZXIiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uVHlwZS9CZWFuIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uVHlwZS9Db250YWluZXIiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL1Nlc3Npb25UeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vU2Vzc2lvblR5cGUvU3RhdGVmdWwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vU2Vzc2lvblR5cGUvU3RhdGVsZXNzIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50S2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnRLaW5kL1Vuc3BlY2lmaWVkIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnRLaW5kL1JlbW90ZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50S2luZC9Ib21lIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnRLaW5kL0xvY2FsIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnRLaW5kL0xvY2FsSG9tZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50S2luZC9TZXJ2aWNlRW5kcG9pbnQiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL0Fja25vd2xlZGdlTW9kZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL0Fja25vd2xlZGdlTW9kZS9BdXRvQWNrbm93bGVkZ2UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vQWNrbm93bGVkZ2VNb2RlL0R1cHNPa0Fja25vd2xlZGdlIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJlamIuZWNvcmUjLy9TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1N1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kL0R1cmFibGUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQvTm9uRHVyYWJsZSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iZWpiLmVjb3JlIy8vUmV0dXJuVHlwZU1hcHBpbmciPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9SZXR1cm5UeXBlTWFwcGluZy9Mb2NhbCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9SZXR1cm5UeXBlTWFwcGluZy9SZW1vdGUiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL0Rlc3RpbmF0aW9uVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL0Rlc3RpbmF0aW9uVHlwZS9RdWV1ZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9EZXN0aW5hdGlvblR5cGUvVG9waWMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL011bHRpcGxpY2l0eUtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9NdWx0aXBsaWNpdHlLaW5kL09uZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9NdWx0aXBsaWNpdHlLaW5kL01hbnkiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkvYWJzdHJhY3RTY2hlbWFOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkvcGVyc2lzdGVudEF0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Db250YWluZXJNYW5hZ2VkRW50aXR5L2tleUF0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQ29udGFpbmVyTWFuYWdlZEVudGl0eS9xdWVyaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQ29udGFpbmVyTWFuYWdlZEVudGl0eS9DTVBBdHRyaWJ1dGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Db250YWluZXJNYW5hZ2VkRW50aXR5L3ByaW1LZXlGaWVsZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9NZXRob2RQZXJtaXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXRob2RQZXJtaXNzaW9uL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWV0aG9kUGVybWlzc2lvbi91bmNoZWNrZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kUGVybWlzc2lvbi9hc3NlbWJseURlc2NyaXB0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXRob2RQZXJtaXNzaW9uL3JvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01ldGhvZFBlcm1pc3Npb24vbWV0aG9kRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kUGVybWlzc2lvbi9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vQXNzZW1ibHlEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQXNzZW1ibHlEZXNjcmlwdG9yL21ldGhvZFBlcm1pc3Npb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0Fzc2VtYmx5RGVzY3JpcHRvci9tZXRob2RUcmFuc2FjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQXNzZW1ibHlEZXNjcmlwdG9yL2VqYkphciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Bc3NlbWJseURlc2NyaXB0b3Ivc2VjdXJpdHlSb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Bc3NlbWJseURlc2NyaXB0b3IvZXhjbHVkZUxpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQXNzZW1ibHlEZXNjcmlwdG9yL21lc3NhZ2VEZXN0aW5hdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vTWV0aG9kVHJhbnNhY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL01ldGhvZFRyYW5zYWN0aW9uL3RyYW5zYWN0aW9uQXR0cmlidXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWV0aG9kVHJhbnNhY3Rpb24vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kVHJhbnNhY3Rpb24vYXNzZW1ibHlEZXNjcmlwdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01ldGhvZFRyYW5zYWN0aW9uL21ldGhvZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01ldGhvZFRyYW5zYWN0aW9uL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9TZXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9TZXNzaW9uL3RyYW5zYWN0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL1Nlc3Npb24vc2Vzc2lvblR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9TZXNzaW9uL3NlcnZpY2VFbmRwb2ludCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9FbnRpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0VudGl0eS9yZWVudHJhbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FbnRpdHkvcHJpbWFyeUtleSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9FbnRlcnByaXNlQmVhbi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuL3NlY3VyaXR5Um9sZVJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FbnRlcnByaXNlQmVhbi9lamJDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuL2hvbWVJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FbnRlcnByaXNlQmVhbi9yZW1vdGVJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRW50ZXJwcmlzZUJlYW4vZWpiSmFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuL3NlY3VyaXR5SWRlbnRpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FbnRlcnByaXNlQmVhbi9sb2NhbEhvbWVJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FbnRlcnByaXNlQmVhbi9sb2NhbEludGVyZmFjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9FSkJNZXRob2RDYXRlZ29yeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0VKQkphciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vRUpCSmFyL2VqYkNsaWVudEphciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0VKQkphci92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VKQkphci9hc3NlbWJseURlc2NyaXB0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCSmFyL2VudGVycHJpc2VCZWFucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FSkJKYXIvcmVsYXRpb25zaGlwTGlzdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50L3Bhcm1zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWV0aG9kRWxlbWVudC90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnQvZW50ZXJwcmlzZUJlYW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vQ01QQXR0cmlidXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9DTVBBdHRyaWJ1dGUvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQ01QQXR0cmlidXRlL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9SZWxhdGlvbnNoaXBzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9SZWxhdGlvbnNoaXBzL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1JlbGF0aW9uc2hpcHMvZWpiSmFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1JlbGF0aW9uc2hpcHMvZWpiUmVsYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1JlbGF0aW9uc2hpcHMvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL1F1ZXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9RdWVyeS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL1F1ZXJ5L2VqYlFMIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vUXVlcnkvcmV0dXJuVHlwZU1hcHBpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vUXVlcnkvcXVlcnlNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vUXVlcnkvZW50aXR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1F1ZXJ5L2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9FSkJSZWxhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb24vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VKQlJlbGF0aW9uL3JlbGF0aW9uc2hpcExpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb24vcmVsYXRpb25zaGlwUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb24vZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0VKQlJlbGF0aW9uc2hpcFJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0VKQlJlbGF0aW9uc2hpcFJvbGUvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL3JvbGVOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb25zaGlwUm9sZS9tdWx0aXBsaWNpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL2Nhc2NhZGVEZWxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb25zaGlwUm9sZS9yZWxhdGlvbnNoaXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb25zaGlwUm9sZS9zb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb25zaGlwUm9sZS9jbXJGaWVsZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9Sb2xlU291cmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9Sb2xlU291cmNlL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1JvbGVTb3VyY2Uvcm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1JvbGVTb3VyY2UvZW50aXR5QmVhbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Sb2xlU291cmNlL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9DTVJGaWVsZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0NNUkZpZWxkL3JvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9DTVJGaWVsZC9jb2xsZWN0aW9uVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuL3RyYW5zYWN0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW4vbWVzc2FnZVNlbGVjdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWVzc2FnZURyaXZlbi9hY2tub3dsZWRnZU1vZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuL2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWVzc2FnZURyaXZlbi9kZXN0aW5hdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuL2FjdGl2YXRpb25Db25maWciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuL21lc3NhZ2VEZXN0aW5hdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW4vbWVzc2FnaW5nVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uL3N1YnNjcmlwdGlvbkR1cmFiaWxpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uL2JlYW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vRXhjbHVkZUxpc3QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0V4Y2x1ZGVMaXN0L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0V4Y2x1ZGVMaXN0L21ldGhvZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0V4Y2x1ZGVMaXN0L2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9RdWVyeU1ldGhvZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1F1ZXJ5TWV0aG9kL3F1ZXJ5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vQWN0aXZhdGlvbkNvbmZpZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0FjdGl2YXRpb25Db25maWcvY29uZmlnUHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9BY3RpdmF0aW9uQ29uZmlnL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iVGFnbGliIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBpbnRlcmZhY2VQYWNrYWdlU3VmZml4PSJpbnRlcm5hbCIgbWV0YURhdGFQYWNrYWdlU3VmZml4PSJpbnRlcm5hbCIgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIgotICAgICAgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0idGFnbGliLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InRhZ2xpYi5lY29yZSMvL0JvZHlDb250ZW50VHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InRhZ2xpYi5lY29yZSMvL0JvZHlDb250ZW50VHlwZS90YWdkZXBlbmRlbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idGFnbGliLmVjb3JlIy8vQm9keUNvbnRlbnRUeXBlL0pTUCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ0YWdsaWIuZWNvcmUjLy9Cb2R5Q29udGVudFR5cGUvZW1wdHkiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idGFnbGliLmVjb3JlIy8vQm9keUNvbnRlbnRUeXBlL3NjcmlwdGxlc3MiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InRhZ2xpYi5lY29yZSMvL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ0YWdsaWIuZWNvcmUjLy9KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlL05FU1RFRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ0YWdsaWIuZWNvcmUjLy9KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlL0FUX0JFR0lOIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InRhZ2xpYi5lY29yZSMvL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUvQVRfRU5EIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0YWdsaWIuZWNvcmUjLy9UYWdMaWIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL1RhZ0xpYi90YWdMaWJWZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vVGFnTGliL2pzcFZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9UYWdMaWIvc2hvcnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vVGFnTGliL3VyaSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9UYWdMaWIvdGFncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9UYWdMaWIvdmFsaWRhdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1RhZ0xpYi9saXN0ZW5lcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vVGFnTGliL2Z1bmN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9UYWdMaWIvdGFnbGliRXh0ZW5zaW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0YWdsaWIuZWNvcmUjLy9KU1BUYWciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFRhZy9ib2R5Q29udGVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFRhZy9leGFtcGxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVGFnL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BUYWcvZHluYW1pY0F0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVGFnL2F0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVGFnL3ZhcmlhYmxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL0pTUFRhZy90YWdDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL0pTUFRhZy90ZWlDbGFzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0YWdsaWIuZWNvcmUjLy9KU1BUYWdBdHRyaWJ1dGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFRhZ0F0dHJpYnV0ZS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVGFnQXR0cmlidXRlL3JlcXVpcmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVGFnQXR0cmlidXRlL3J0RXhwclZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVGFnQXR0cmlidXRlL2ZyYWdtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVGFnQXR0cmlidXRlL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVGFnQXR0cmlidXRlL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0YWdsaWIuZWNvcmUjLy9WYWxpZGF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1ZhbGlkYXRvci92YWxpZGF0b3JDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9WYWxpZGF0b3IvaW5pdFBhcmFtcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9WYWxpZGF0b3IvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL0pTUFZhcmlhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BWYXJpYWJsZS9uYW1lR2l2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BWYXJpYWJsZS9uYW1lRnJvbUF0dHJpYnV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFZhcmlhYmxlL2RlY2xhcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BWYXJpYWJsZS9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL0pTUFZhcmlhYmxlL3ZhcmlhYmxlQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVmFyaWFibGUvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL0Z1bmN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9GdW5jdGlvbi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vRnVuY3Rpb24vc2lnbmF0dXJlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vRnVuY3Rpb24vZXhhbXBsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL0Z1bmN0aW9uL2Z1bmN0aW9uQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vRnVuY3Rpb24vZnVuY3Rpb25FeHRlbnNpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL1RhZ0ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL1RhZ0ZpbGUvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL1RhZ0ZpbGUvcGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL1RhZ0ZpbGUvZXhhbXBsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9UYWdGaWxlL3RhZ0V4dGVuc2lvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idGFnbGliLmVjb3JlIy8vVGxkRXh0ZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9UbGRFeHRlbnNpb24vbmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1RsZEV4dGVuc2lvbi9leHRlbnNpb25FbGVtZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL0V4dGVuc2libGVUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9FeHRlbnNpYmxlVHlwZS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iV2ViYXBwbGljYXRpb24iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0id2ViYXBwbGljYXRpb24uZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9SZXNBdXRoU2VydmxldFR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1Jlc0F1dGhTZXJ2bGV0VHlwZS9DT05UQUlORVIiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9SZXNBdXRoU2VydmxldFR5cGUvU0VSVkxFVCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZUVudW0iPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlRW51bS9HRVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZUVudW0vUE9TVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlRW51bS9QVVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZUVudW0vREVMRVRFIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vSFRUUE1ldGhvZFR5cGVFbnVtL0hFQUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZUVudW0vT1BUSU9OUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlRW51bS9UUkFDRSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlL05PTkUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlL0lOVEVHUkFMIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVHJhbnNwb3J0R3VhcmFudGVlVHlwZS9DT05GSURFTlRJQUwiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRGlzcGF0Y2hlclR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Rpc3BhdGNoZXJUeXBlL0ZPUldBUkQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9EaXNwYXRjaGVyVHlwZS9JTkNMVURFIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRGlzcGF0Y2hlclR5cGUvUkVRVUVTVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Rpc3BhdGNoZXJUeXBlL0VSUk9SIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhNZXRob2RLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9BdXRoTWV0aG9kS2luZC9VTlNQRUNJRklFRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhNZXRob2RLaW5kL0JBU0lDIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQXV0aE1ldGhvZEtpbmQvRElHRVNUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQXV0aE1ldGhvZEtpbmQvRk9STSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhNZXRob2RLaW5kL0NMSUVOVF9DRVJUIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvZGlzdHJpYnV0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvY29udGV4dHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvZXJyb3JQYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9maWxlTGlzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC90YWdMaWJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL2NvbnN0cmFpbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL2xvZ2luQ29uZmlnIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL21pbWVNYXBwaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9zZXNzaW9uQ29uZmlnIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL3NlcnZsZXRNYXBwaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9zZXJ2bGV0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9zZWN1cml0eVJvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL2ZpbHRlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvZmlsdGVyTWFwcGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvbGlzdGVuZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL2NvbnRleHRQYXJhbXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvanNwQ29uZmlnIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL21lc3NhZ2VEZXN0aW5hdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQ29udGV4dFBhcmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0NvbnRleHRQYXJhbS9wYXJhbU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0NvbnRleHRQYXJhbS9wYXJhbVZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Db250ZXh0UGFyYW0vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Db250ZXh0UGFyYW0vd2ViQXBwIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0L3NlcnZsZXROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0L2xvYWRPblN0YXJ0dXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0L3dlYkFwcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXQvd2ViVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXQvcGFyYW1zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldC9zZWN1cml0eVJvbGVSZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldC9ydW5BcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXQvaW5pdFBhcmFtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXRNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXRNYXBwaW5nL3VybFBhdHRlcm4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXRNYXBwaW5nL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0TWFwcGluZy93ZWJBcHAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXRNYXBwaW5nL3NlcnZsZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXNzaW9uQ29uZmlnIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1Nlc3Npb25Db25maWcvc2Vzc2lvblRpbWVvdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXNzaW9uQ29uZmlnL3dlYkFwcCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL01pbWVNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL01pbWVNYXBwaW5nL2V4dGVuc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTWltZU1hcHBpbmcvbWltZVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9NaW1lTWFwcGluZy93ZWJBcHAiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWxjb21lRmlsZUxpc3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlbGNvbWVGaWxlTGlzdC93ZWJBcHAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWxjb21lRmlsZUxpc3QvZmlsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Vycm9yUGFnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9FcnJvclBhZ2UvbG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9FcnJvclBhZ2Uvd2ViQXBwIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVGFnTGliUmVmIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1RhZ0xpYlJlZi90YWdsaWJVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1RhZ0xpYlJlZi90YWdsaWJMb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1RhZ0xpYlJlZi93ZWJBcHAiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZWN1cml0eUNvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VjdXJpdHlDb25zdHJhaW50L2Rpc3BsYXlOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VjdXJpdHlDb25zdHJhaW50L3dlYkFwcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlY3VyaXR5Q29uc3RyYWludC93ZWJSZXNvdXJjZUNvbGxlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VjdXJpdHlDb25zdHJhaW50L2F1dGhDb25zdHJhaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VjdXJpdHlDb25zdHJhaW50L3VzZXJEYXRhQ29uc3RyYWludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlY3VyaXR5Q29uc3RyYWludC9kaXNwbGF5TmFtZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL3dlYlJlc291cmNlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24vdXJsUGF0dGVybiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL2h0dHBNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24vc2VjQ29uc3RyYWludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYlJlc291cmNlQ29sbGVjdGlvbi9VUkxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL2Rlc2NyaXB0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYlJlc291cmNlQ29sbGVjdGlvbi9IVFRQcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhDb25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhDb25zdHJhaW50L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9BdXRoQ29uc3RyYWludC9yb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhDb25zdHJhaW50L3NlY0NvbnN0cmFpbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9BdXRoQ29uc3RyYWludC9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9Vc2VyRGF0YUNvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVXNlckRhdGFDb25zdHJhaW50L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Vc2VyRGF0YUNvbnN0cmFpbnQvdHJhbnNwb3J0R3VhcmFudGVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVXNlckRhdGFDb25zdHJhaW50L3NlY0NvbnN0cmFpbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Vc2VyRGF0YUNvbnN0cmFpbnQvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9naW5Db25maWciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9naW5Db25maWcvYXV0aE1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9naW5Db25maWcvcmVhbG1OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Mb2dpbkNvbmZpZy9hdXRob3JpemF0aW9uTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9naW5Db25maWcvd2ViQXBwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9naW5Db25maWcvZm9ybUxvZ2luQ29uZmlnIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRm9ybUxvZ2luQ29uZmlnIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Zvcm1Mb2dpbkNvbmZpZy9mb3JtTG9naW5QYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Gb3JtTG9naW5Db25maWcvZm9ybUVycm9yUGFnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Zvcm1Mb2dpbkNvbmZpZy9sb2dpbkNvbmZpZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0luaXRQYXJhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Jbml0UGFyYW0vcGFyYW1OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Jbml0UGFyYW0vcGFyYW1WYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vSW5pdFBhcmFtL2Rlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJUeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0VHlwZS9jbGFzc05hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9KU1BUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0pTUFR5cGUvanNwRmlsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1VSTFBhdHRlcm5UeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1VSTFBhdHRlcm5UeXBlL3VybFBhdHRlcm4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9VUkxQYXR0ZXJuVHlwZS9yZXNDb2xsZWN0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vUm9sZU5hbWVUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1JvbGVOYW1lVHlwZS9yb2xlTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlbGNvbWVGaWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlbGNvbWVGaWxlL3dlbGNvbWVGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2VsY29tZUZpbGUvZmlsZUxpc3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9FeGNlcHRpb25UeXBlRXJyb3JQYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2UvZXhjZXB0aW9uVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Vycm9yQ29kZUVycm9yUGFnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9FcnJvckNvZGVFcnJvclBhZ2UvZXJyb3JDb2RlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRmlsdGVyTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXJNYXBwaW5nL3VybFBhdHRlcm4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0ZpbHRlck1hcHBpbmcvZGlzcGF0Y2hlclR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0ZpbHRlck1hcHBpbmcvZmlsdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXJNYXBwaW5nL3NlcnZsZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRmlsdGVyL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXIvaW5pdFBhcmFtcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRmlsdGVyL2ZpbHRlckNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRmlsdGVyL2luaXRQYXJhbVZhbHVlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0L2xvY2FsRW5jb2RpbmdNYXBwaW5ncyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0xvY2FsRW5jb2RpbmdNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0xvY2FsRW5jb2RpbmdNYXBwaW5nL2xvY2FsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9jYWxFbmNvZGluZ01hcHBpbmcvZW5jb2RpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZS9odHRwTWV0aG9kIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJKY2EiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0iamNhLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS9CYXNpY1Bhc3N3b3JkIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS9LZXJidjUiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImpjYS5lY29yZSMvL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqY2EuZWNvcmUjLy9UcmFuc2FjdGlvblN1cHBvcnRLaW5kL05vVHJhbnNhY3Rpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamNhLmVjb3JlIy8vVHJhbnNhY3Rpb25TdXBwb3J0S2luZC9Mb2NhbFRyYW5zYWN0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImpjYS5lY29yZSMvL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQvWEFUcmFuc2FjdGlvbiIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vQ29ubmVjdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25uZWN0b3IvdmVuZG9yTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0Nvbm5lY3Rvci9zcGVjVmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0Nvbm5lY3Rvci9laXNUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29ubmVjdG9yL3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vQ29ubmVjdG9yL2xpY2Vuc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vQ29ubmVjdG9yL3Jlc291cmNlQWRhcHRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9SZXNvdXJjZUFkYXB0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9jb25uZWN0aW9uSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL2Nvbm5lY3Rpb25JbXBsQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9SZXNvdXJjZUFkYXB0ZXIvdHJhbnNhY3Rpb25TdXBwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL3JlYXV0aGVudGljYXRpb25TdXBwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL3Jlc291cmNlQWRhcHRlckNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9zZWN1cml0eVBlcm1pc3Npb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL2NvbmZpZ1Byb3BlcnRpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL291dGJvdW5kUmVzb3VyY2VBZGFwdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9pbmJvdW5kUmVzb3VyY2VBZGFwdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9hZG1pbk9iamVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc20iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc20vYXV0aGVudGljYXRpb25NZWNoYW5pc20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS9jcmVkZW50aWFsSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc20vY3VzdG9tQXV0aE1lY2hUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9Db25maWdQcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29uZmlnUHJvcGVydHkvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25maWdQcm9wZXJ0eS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29uZmlnUHJvcGVydHkvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0NvbmZpZ1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL0NvbmZpZ1Byb3BlcnR5L2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9TZWN1cml0eVBlcm1pc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1NlY3VyaXR5UGVybWlzc2lvbi9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1NlY3VyaXR5UGVybWlzc2lvbi9zcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL1NlY3VyaXR5UGVybWlzc2lvbi9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vTGljZW5zZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vTGljZW5zZS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0xpY2Vuc2UvcmVxdWlyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vTGljZW5zZS9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vSW5ib3VuZFJlc291cmNlQWRhcHRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL0luYm91bmRSZXNvdXJjZUFkYXB0ZXIvbWVzc2FnZUFkYXB0ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL091dGJvdW5kUmVzb3VyY2VBZGFwdGVyL3JlYXV0aGVudGljYXRpb25TdXBwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIvdHJhbnNhY3Rpb25TdXBwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL091dGJvdW5kUmVzb3VyY2VBZGFwdGVyL2Nvbm5lY3Rpb25EZWZpbml0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9PdXRib3VuZFJlc291cmNlQWRhcHRlci9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vTWVzc2FnZUFkYXB0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9NZXNzYWdlQWRhcHRlci9tZXNzYWdlTGlzdGVuZXJzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpjYS5lY29yZSMvL0Nvbm5lY3Rpb25EZWZpbml0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25uZWN0aW9uRGVmaW5pdGlvbi9tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0Nvbm5lY3Rpb25EZWZpbml0aW9uL2Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29ubmVjdGlvbkRlZmluaXRpb24vY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25uZWN0aW9uRGVmaW5pdGlvbi9jb25uZWN0aW9uSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29ubmVjdGlvbkRlZmluaXRpb24vY29ubmVjdGlvbkltcGxDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9Db25uZWN0aW9uRGVmaW5pdGlvbi9jb25maWdQcm9wZXJ0aWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpjYS5lY29yZSMvL0FkbWluT2JqZWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9BZG1pbk9iamVjdC9hZG1pbk9iamVjdEludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0FkbWluT2JqZWN0L2FkbWluT2JqZWN0Q2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vQWRtaW5PYmplY3QvY29uZmlnUHJvcGVydGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9NZXNzYWdlTGlzdGVuZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL01lc3NhZ2VMaXN0ZW5lci9tZXNzYWdlTGlzdGVuZXJUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL01lc3NhZ2VMaXN0ZW5lci9hY3RpdmF0aW9uU3BlYyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9BY3RpdmF0aW9uU3BlYyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQWN0aXZhdGlvblNwZWMvYWN0aXZhdGlvblNwZWNDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9BY3RpdmF0aW9uU3BlYy9yZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJXZWJzZXJ2aWNlX2NsaWVudCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiCi0gICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIgotICAgICAgZWNvcmVQYWNrYWdlPSJ3c2NsaWVudC5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NsaWVudC5lY29yZSMvL1NlcnZpY2VSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vU2VydmljZVJlZi9zZXJ2aWNlSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmL3NlcnZpY2VSZWZOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmL3dzZGxGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmL2pheHJwY01hcHBpbmdGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vU2VydmljZVJlZi9wb3J0Q29tcG9uZW50UmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2NsaWVudC5lY29yZSMvL1NlcnZpY2VSZWYvaGFuZGxlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmL3NlcnZpY2VRbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NsaWVudC5lY29yZSMvL1BvcnRDb21wb25lbnRSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzY2xpZW50LmVjb3JlIy8vUG9ydENvbXBvbmVudFJlZi9wb3J0Q29tcG9uZW50TGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vUG9ydENvbXBvbmVudFJlZi9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NjbGllbnQuZWNvcmUjLy9IYW5kbGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NsaWVudC5lY29yZSMvL0hhbmRsZXIvaGFuZGxlck5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NsaWVudC5lY29yZSMvL0hhbmRsZXIvc29hcFJvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NjbGllbnQuZWNvcmUjLy9IYW5kbGVyL3BvcnROYW1lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vSGFuZGxlci9oYW5kbGVyQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9IYW5kbGVyL2luaXRQYXJhbXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9IYW5kbGVyL3NvYXBIZWFkZXJzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzY2xpZW50LmVjb3JlIy8vV2ViU2VydmljZXNDbGllbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2NsaWVudC5lY29yZSMvL1dlYlNlcnZpY2VzQ2xpZW50L2NvbXBvbmVudFNjb3BlZFJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9XZWJTZXJ2aWNlc0NsaWVudC9zZXJ2aWNlUmVmcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NsaWVudC5lY29yZSMvL0NvbXBvbmVudFNjb3BlZFJlZnMiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzY2xpZW50LmVjb3JlIy8vQ29tcG9uZW50U2NvcGVkUmVmcy9jb21wb25lbnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vQ29tcG9uZW50U2NvcGVkUmVmcy9zZXJ2aWNlUmVmcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iSnNwIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIiBlY29yZVBhY2thZ2U9ImpzcC5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqc3AuZWNvcmUjLy9KU1BDb25maWciPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqc3AuZWNvcmUjLy9KU1BDb25maWcvdGFnTGlicyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqc3AuZWNvcmUjLy9KU1BDb25maWcvcHJvcGVydHlHcm91cHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ianNwLmVjb3JlIy8vSlNQUHJvcGVydHlHcm91cCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUganNwLmVjb3JlIy8vSlNQUHJvcGVydHlHcm91cC91cmxQYXR0ZXJuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUganNwLmVjb3JlIy8vSlNQUHJvcGVydHlHcm91cC9lbElnbm9yZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqc3AuZWNvcmUjLy9KU1BQcm9wZXJ0eUdyb3VwL3BhZ2VFbmNvZGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpzcC5lY29yZSMvL0pTUFByb3BlcnR5R3JvdXAvc2NyaXB0aW5nSW52YWxpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpzcC5lY29yZSMvL0pTUFByb3BlcnR5R3JvdXAvaXNYTUwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqc3AuZWNvcmUjLy9KU1BQcm9wZXJ0eUdyb3VwL2luY2x1ZGVQcmVsdWRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpzcC5lY29yZSMvL0pTUFByb3BlcnR5R3JvdXAvaW5jbHVkZUNvZGFzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpzcC5lY29yZSMvL1RhZ0xpYlJlZlR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpzcC5lY29yZSMvL1RhZ0xpYlJlZlR5cGUvdGFnbGliVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUganNwLmVjb3JlIy8vVGFnTGliUmVmVHlwZS90YWdsaWJMb2NhdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iV3Njb21tb24iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJ3c2NvbW1vbi5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NvbW1vbi5lY29yZSMvL0luaXRQYXJhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3Njb21tb24uZWNvcmUjLy9Jbml0UGFyYW0vcGFyYW1OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3Njb21tb24uZWNvcmUjLy9Jbml0UGFyYW0vcGFyYW1WYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzY29tbW9uLmVjb3JlIy8vSW5pdFBhcmFtL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY29tbW9uLmVjb3JlIy8vSW5pdFBhcmFtL2Rlc2NyaXB0aW9uVHlwZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3Njb21tb24uZWNvcmUjLy9TT0FQSGVhZGVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3Njb21tb24uZWNvcmUjLy9TT0FQUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3Njb21tb24uZWNvcmUjLy9TT0FQUm9sZS9zb2FwUm9sZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NvbW1vbi5lY29yZSMvL1BvcnROYW1lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NvbW1vbi5lY29yZSMvL1BvcnROYW1lL3BvcnROYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25UeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3Njb21tb24uZWNvcmUjLy9EaXNwbGF5TmFtZVR5cGUiLz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iV3NkZCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIiBlY29yZVBhY2thZ2U9IndzZGQuZWNvcmUjLyI+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkZC5lY29yZSMvL1dlYlNlcnZpY2VzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VzL3dlYlNlcnZpY2VEZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi9qYXhycGNNYXBwaW5nRmlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vd2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vd3NkbEZpbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uL3NtYWxsSWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vbGFyZ2VJY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vZGlzcGxheU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi9wb3J0Q29tcG9uZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uL2Rlc2NyaXB0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uL2Rpc3BsYXlOYW1lVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uL2ljb25UeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC9wb3J0Q29tcG9uZW50TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L3NlcnZpY2VFbmRwb2ludEludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L3NtYWxsSWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L2xhcmdlSWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvZGlzcGxheU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvd3NkbFBvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvc2VydmljZUltcGxCZWFuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L2hhbmRsZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L2Rlc2NyaXB0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC9kaXNwbGF5TmFtZVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvaWNvblR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkZC5lY29yZSMvL1dTRExQb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkZC5lY29yZSMvL1NlcnZpY2VJbXBsQmVhbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9TZXJ2aWNlSW1wbEJlYW4vZUVKQkxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1NlcnZpY2VJbXBsQmVhbi9lU2VydmxldExpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1NlcnZpY2VJbXBsQmVhbi9iZWFuTGluayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vU2VydmxldExpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9TZXJ2bGV0TGluay9zZXJ2bGV0TGluayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vRUpCTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL0VKQkxpbmsvZWpiTGluayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vSGFuZGxlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL0hhbmRsZXIvaGFuZGxlck5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vSGFuZGxlci9oYW5kbGVyQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL0hhbmRsZXIvaW5pdFBhcmFtcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vSGFuZGxlci9zb2FwSGVhZGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vSGFuZGxlci9zb2FwUm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkZC5lY29yZSMvL0JlYW5MaW5rIi8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2pheHJwY21hcC5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9qYXhycGNtYXAuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZWJmMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2pheHJwY21hcC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJqYXhycGNtYXAiCi0gICAgbnNVUkk9ImpheHJwY21hcC54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVdTRExNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50IGRlc2NyaWJlcyB0aGUgSmF2YSBtYXBwaW5nIHRvIGEga25vd24gV1NETCBkb2N1bWVudC5JdCBjb250YWlucyB0aGUgbWFwcGluZyBiZXR3ZWVuIHBhY2thZ2UgbmFtZXMgYW5kIFhNTCBuYW1lc3BhY2VzLCAmI3hEOyYjeEE7V1NETCByb290IHR5cGVzIGFuZCBKYXZhIGFydGlmYWN0cywgYW5kIHRoZSBzZXQgb2YgbWFwcGluZ3MgZm9yIHNlcnZpY2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYWNrYWdlTWFwcGluZ3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUGFja2FnZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImphdmFYTUxUeXBlTWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YVhNTFR5cGVNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGNlcHRpb25NYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeGNlcHRpb25NYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9JbnRlcmZhY2VNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlTWFwcGluZyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGFja2FnZS1tYXBwaW5nIGluZGljYXRlcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGphdmEtcGFja2FnZS1uYW1lIGFuZCBYTUwgbmFtZXNwYWNlIGluIHRoZSBXU0RMIGRvY3VtZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFja2FnZVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGFja2FnZS10eXBlIGluZGljYXRlcyB0aGUgSmF2YSBwYWNrYWdlIG5hbWUuIEl0IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHBhY2thZ2UtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVhNTFR5cGVNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBqYXZhLXhtbC10eXBlLW1hcHBpbmcgZWxlbWVudCBjb250YWlucyBhIGNsYXNzLXR5cGUgdGhhdCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MsIFFOYW1lIG9mIHRoZSBYTUwgcm9vdCB0eXBlLCB0aGUgV1NETCB0eXBlIHNjb3BlIHRoZSBRTmFtZSBhcHBsaWVzIHRvIGFuZCB0aGUgc2V0IG9mIHZhcmlhYmxlICYjeEQ7JiN4QTttYXBwaW5ncyBmb3IgZWFjaCBwdWJsaWMgdmFyaWFibGUgd2l0aGluIHRoZSBKYXZhIGNsYXNzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNsYXNzLXR5cGUgZWxlbWVudCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGNsYXNzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InFuYW1lU2NvcGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcW5hbWUtc2NvcGUgZWxlbWVudHMgc2NvcGVzIHRoZSByZWZlcmVuY2Ugb2YgYSBRTmFtZSB0byB0aGUgV1NETCBlbGVtZW50IHR5cGUgaXQgYXBwbGllcyB0by4gVGhlIHZhbHVlIG9mIHFuYW1lLXNjb3BlIG1heSBiZSBzaW1wbGVUeXBlLCBjb21wbGV4VHlwZSwgb3IgZWxlbWVudC4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbm9ueW1vdXNUeXBlUW5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9vdFR5cGVRbmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Jvb3RUeXBlUW5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhcmlhYmxlTWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVmFyaWFibGVNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeGNlcHRpb25NYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleGNlcHRpb24tbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgc2VydmljZSBzcGVjaWZpYyBleGNlcHRpb24gdHlwZXMgYW5kIHRoZSB3c2RsIGZhdWx0cy4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoaXMgZWxlbWVudCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSYjeEQ7JiN4QTttYXBwaW5nIGJldHdlZW4gYSBtZXRob2QgYW5kIGFuIG9wZXJhdGlvbiB3aGljaCBwcm92aWRlcyB0aGUgbWFwcGluZyBjb250ZXh0LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNlcHRpb25UeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4Y2VwdGlvbi10eXBlIGVsZW1lbnQgZGVmaW5lcyBKYXZhIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbi4gSXQgbWF5IGJlIGEgc2VydmljZSBzcGVjaWZpYyBleGNlcHRpb24uJiN4RDsmI3hBOyYjeEQ7JiN4QTtJdCBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBleGNlcHRpb24tbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsTWVzc2FnZVBhcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndzZGxNZXNzYWdlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vV1NETE1lc3NhZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiCi0gICAgICAgIGVUeXBlPSIjLy9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyIgZVN1cGVyVHlwZXM9IiMvL0ludGVyZmFjZU1hcHBpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBob3cgYSBKYXZhIHR5cGUgZm9yIHRoZSBzZXJ2aWNlIGludGVyZmFjZSBtYXBzIHRvIGEgV1NETCBzZXJ2aWNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcmI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcnZpY2VJbnRlcmZhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgZm9yIHRoZSBzZXJ2aWNlLiBGb3Igc3RhdGljIHNlcnZpY2VzLCBpdCBpcyBqYXZheC54bWwucnBjLlNlcnZpY2UgaW50ZXJmYWNlLiBGb3IgZ2VuZXJhdGVkIHNlcnZpY2UsIGl0IHdvdWxkIGJlIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlIG5hbWUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgbmFtZSBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndzZGxTZXJ2aWNlTmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dTRExTZXJ2aWNlTmFtZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9ydE1hcHBpbmdzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BvcnRNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIiBlU3VwZXJUeXBlcz0iIy8vSW50ZXJmYWNlTWFwcGluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcgZGVmaW5lcyBhIHR1cGxlJiN4RDsmI3hBO3RvIHNwZWNpZnkgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIFdTREwgcG9ydCB0eXBlcyBhbmQgV1NETCBiaW5kaW5ncy4mI3hEOyYjeEE7JiN4RDsmI3hBO0FuIGludGVyZmFjZSBtYXkgYmUgbWFwcGVkIHRvIGEgcG9ydC10eXBlIGFuZCBiaW5kaW5nIG11bHRpcGxlIHRpbWVzLiBUaGlzIGhhcHBlbnMgcmFyZWx5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VydmljZUVuZHBvaW50SW50ZXJmYWNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIGZvciB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlLiBUaGUgbmFtZSBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndzZGxQb3J0VHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dTRExQb3J0VHlwZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id3NkbEJpbmRpbmciIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMQmluZGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9vdFR5cGVRbmFtZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL1FOYW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcm9vdC10eXBlLXFuYW1lIGlkZW50aWZpZXMgdGhlIFdTREwgUU5hbWUgb2YgYW4gWE1MIHR5cGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFyaWFibGVNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYWJsZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBhIEphdmEgY2xhc3MgZGF0YSBtZW1iZXIgb3IgSmF2YUJlYW5zIHByb3BlcnR5IHRvIGFuIFhNTCBlbGVtZW50IG5hbWUgb2YgYW4gWE1MIHJvb3QgdHlwZS4gSWYgdGhlIGRhdGEtbWVtYmVyIGVsZW1lbnQgaXMgcHJlc2VudCwgdGhlIEphdmEgdmFyaWFibGUgbmFtZSBpcyBhIHB1YmxpYyBkYXRhIG1lbWJlci4gIElmIGRhdGEtbWVtYmVyJiN4RDsmI3hBO2lzIG5vdCBwcmVzZW50LCB0aGUgSmF2YSB2YXJpYWJsZSBuYW1lIGlzIGEgSmF2YUJlYW5zIHByb3BlcnR5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImphdmFWYXJpYWJsZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgamF2YS12YXJpYWJsZS1uYW1lIGRlZmluZXMgdGhlIG5hbWUgb2YgYSBwdWJsaWMgZGF0YSBtZW1iZXIgb3IgIEphdmFCZWFucyBwcm9wZXJ0eSB3aXRoaW4gYSBKYXZhIGNsYXNzLiAmI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHZhcmlhYmxlLW1hcHBpbmcmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhtbEVsZW1lbnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHhtbC1lbGVtZW50LW5hbWUgZWxlbWVudCBkZWZpbmVzIG5hbWUgYXR0cmlidXRlIHZhbHVlIG9mIGEgV1NETCBlbGVtZW50IHdpdGhpbiBhIHJvb3QgdHlwZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHZhcmlhYmxlLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0YU1lbWJlciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieG1sQXR0cmlidXRlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4bWxXaWxkY2FyZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETE1lc3NhZ2UiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9RTmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdzZGwtbWVzc2FnZSAgZWxlbWVudCBkZWZpbmVzIGEgV1NETCBtZXNzYWdlIGJ5IGEgUU5BTUUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIgZWxlbWVudCBkZWZpbmVzIHRoZSBvcmRlciB0aGF0IGNvbXBsZXhUeXBlIGVsZW1lbnQgdmFsdWVzIGFyZSBhcHBsaWVkIHRvIGEgSmF2YSBleGNlcHRpb24gY29uc3RydWN0b3IuIEVsZW1lbnQgbmFtZXMgYXJlIHNwZWNpZmllZCBmb3IgZWFjaCBwYXJhbWV0ZXIgb2YgdGhlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgZWxlbWVudCBuYW1lcyBvZiBpbmhlcml0ZWQgdHlwZXMgaWYgbmVjZXNzYXJ5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogZXhjZXB0aW9uLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWxlbWVudE5hbWVzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VsZW1lbnROYW1lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50TmFtZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIGNvbXBsZXhUeXBlIGVsZW1lbnQgbmFtZSBhdHRyaWJ1dGUgdmFsdWUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGV4dCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMU2VydmljZU5hbWUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9RTmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdzZGwtc2VydmljZS1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBzZXJ2aWNlIG5hbWUgYnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgc2VydmljZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9ydE1hcHBpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvcnQtbWFwcGluZyBkZWZpbmVzIHRoZSBtYXBwaW5nIG9mIHRoZSBXU0RMIHBvcnQgbmFtZSBhdHRyaWJ1dGUgdG8gdGhlIEphdmEgbmFtZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBHZW5lcmF0ZWQgU2VydmljZSBJbnRlcmZhY2UgbWV0aG9kIGdldCZsdDtqYXZhLW5hbWU+LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3J0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3J0LW5hbWUgaXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIG5hbWUgYXR0cmlidXRlIG9mIGEgV1NETCBwb3J0IGVsZW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBwb3J0LW1hcHBpbmcmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImphdmFQb3J0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBqYXZhLXBvcnQtbmFtZSBlbGVtZW50IGlzIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBwb3J0IG5hbWUgaW4gSmF2YS4gIEl0IGlzIHVzZWQgaW4gZ2VuZXJhdGluZyB0aGUgR2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIG1ldGhvZCYjeEQ7JiN4QTtnZXQmbHQ7amF2YS1wb3J0LW5hbWU+LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogcG9ydC1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTRExQb3J0VHlwZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL1FOYW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd3NkbC1wb3J0LXR5cGUgZWxlbWVudCBkZWZpbmVzIHRoZSB3c2RsIHBvcnQgdHlwZSYjeEQ7JiN4QTtieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBwb3J0IHR5cGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTRExCaW5kaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vUU5hbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3c2RsLWJpbmRpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSB3c2RsIGJpbmRpbmcmI3hEOyYjeEE7YnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgYmluZGluZy4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgb2YgSmF2YSBtZXRob2RzIHRvIG9wZXJhdGlvbnMgKHdoaWNoIGFyZSBub3QgdW5pcXVlbHkgcXVhbGlmaWVkIGJ5IHFuYW1lcykuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgd3NkbC1vcGVyYXRpb24gc2hvdWxkIGJlIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgcG9ydFR5cGUgYW5kIGJpbmRpbmcgaW4gd2hpY2ggdGhpcyBkZWZpbml0aW9uIGlzIGVtYmVkZGVkIHdpdGhpbi4gU2VlIHRoZSBkZWZpbml0aW9ucyBmb3Igc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyBhbmQgJiN4RDsmI3hBO3NlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcgdG8gYWNxdWlyZSB0aGUgcHJvcGVyIGNvbnRleHQuIFRoZSB3cmFwcGVkLWVsZW1lbnQgaW5kaWNhdG9yIHNob3VsZCBvbmx5IGJlIHNwZWNpZmllZCB3aGVuIGEgV1NETCBtZXNzYWdlIHdyYXBzIGFuIGVsZW1lbnQgdHlwZS4gIFRoZSB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nIGlzIG5vdCBzcGVjaWZpZWQgZm9yIG9uZS13YXkgb3BlcmF0aW9ucy4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YU1ldGhvZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgamF2YS1tZXRob2QtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIG5hbWUgb2YgYSBKYXZhIG1ldGhvZCB3aXRoaW4gYW4gaW50ZXJmYWNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsT3BlcmF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdzZGwtb3BlcmF0aW9uIGVsZW1lbnQgZGVmaW5lcyBhbiBvcGVyYXRpb24gd2l0aGluIGEgV1NETCBkb2N1bWVudC4gSXQgbXVzdCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gYSBwb3J0IHR5cGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndyYXBwZWRFbGVtZW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndzZGxSZXR1cm5WYWx1ZU1hcHBpbmciCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMT3BlcmF0aW9uIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsT3BlcmF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBhIEphdmEgbWV0aG9kIHBhcmFtZXRlcnMgYW5kIGEgd3NkbC1tZXNzYWdlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbVBvc2l0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBhcmFtLXBvc2l0aW9uIGVsZW1lbnQgZGVmaW5lcyB0aGUgcG9zaXRpb24gb2YgYSBwYXJhbWV0ZXIgd2l0aGluIGEgSmF2YSBtZXRob2QuICBJdCBtdXN0IGJlIGFuIGludGVnZXIgc3RhcnRpbmcgZnJvbSAwLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyYW1UeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBhcmFtLXR5cGUgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgb2YgYSBwYXJhbWV0ZXIgd2l0aGluIGEgSmF2YSBtZXRob2QuIEl0IG11c3QgYmUgZGVmaW5lZCBieSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id3NkbE1lc3NhZ2VNYXBwaW5nIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vV1NETE1lc3NhZ2VNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nICBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgZm9yIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUuIEl0IGRlZmluZXMgdGhlIG1hcHBpbmcgdG8gYSBzcGVjaWZpYyBtZXNzYWdlIGFuZCBpdHMgcGFydC4gIFRvZ2V0aGVyIHRoZXkgZGVmaW5lIHVuaXF1ZWx5IHRoZSBtYXBwaW5nIGZvciBhIHNwZWNpZmljIHBhcmFtZXRlci4gUGFydHMgd2l0aGluIGEgbWVzc2FnZSBjb250ZXh0IGFyZSB1bmlxdWVseSAmI3hEOyYjeEE7aWRlbnRpZmllZCB3aXRoIHRoZWlyIG5hbWVzLiBUaGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBpcyBub3QmI3hEOyYjeEE7c3BlY2lmaWVkIGlmIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZSBvciBPVVQgcGFyYW1ldGVycy4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0aG9kUmV0dXJuVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWV0aG9kLXJldHVybi12YWx1ZSAgZWxlbWVudCBkZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3Igdm9pZCB0eXBlIGZvciB0aGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHR5cGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxNZXNzYWdlUGFydE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbnRlcnByZXRhdGlvbiBvZiB0aGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBlbGVtZW50IGRlcGVuZHMgb24gd2hldGhlciBvciBub3Qgd3JhcHBlZC1lbGVtZW50IGhhcyBiZWVuIGRlZmluZWQgaW4gdGhlIHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcuICBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBkZWZpbmVzIGEgV1NETCBtZXNzYWdlIHBhcnQuIEl0IHNob3VsZCBhbHdheXMgYmUgaW50ZXJwcmV0ZXIgd2l0aCByZXNwZWN0IHRvIGEgd3NkbC1tZXNzYWdlIGVsZW1lbnQuIElmIHdyYXBwZWQtZWxlbWVudCBpcyBzcGVjaWZpZWQsIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgcmVmZXJzIHRvIGFuIGVsZW1lbnQmI3hEOyYjeEE7bmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id3NkbE1lc3NhZ2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMTWVzc2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETE1lc3NhZ2VNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3c2RsLW1lc3NhZ2UtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgdG8gYSBzcGVjaWZpYyBtZXNzYWdlIGFuZCBpdHMgcGFydC4gVG9nZXRoZXIgdGhleSBkZWZpbmUgdW5pcXVlbHkgdGhlIG1hcHBpbmcgZm9yIGEgc3BlY2lmaWMgcGFyYW1ldGVyLiBQYXJ0cyB3aXRoaW4gYSBtZXNzYWdlIGNvbnRleHQgYXJlIHVuaXF1ZWx5ICYjeEQ7JiN4QTtpZGVudGlmaWVkIHdpdGggdGhlaXIgbmFtZXMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgcGFyYW1ldGVyLW1vZGUgaXMgZGVmaW5lZCBieSB0aGUgbWFwcGluZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBtYXBwaW5nIHdpbGwgYmUgSU4sIE9VVCwgb3IgSU5PVVQuLiAgVGhlIHByZXNlbmNlIG9mIHRoZSBzb2FwLWhlYWRlciYjeEQ7JiN4QTtlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMgbWFwcGVkIHRvIGEgc29hcCBoZWFkZXIgb25seS4gV2hlbiBhYnNlbnQsIGl0IG1lYW5zIHRoYXQgdGhlIHdzZGwtbWVzc2FnZSBpcyBtYXBwZWQgdG8gYSBKYXZhIHBhcmFtZXRlci4gVGhlIHNvYXAgaGVhZGVycyBhcmUgaW50ZXJwcmV0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlJiN4RDsmI3hBO3Byb3ZpZGVkIGluIHRoZSBtYXBwaW5nLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbE1lc3NhZ2VQYXJ0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkludGVycHJldGF0aW9uIG9mIHRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGVsZW1lbnQgZGVwZW5kcyBvbiB3aGV0aGVyIG9yIG5vdCB3cmFwcGVkLWVsZW1lbnQgaGFzIGJlZW4gZGVmaW5lZCBpbiB0aGUgc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZy4gIElmIHdyYXBwZWQtZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgcGFydC4gSXQgc2hvdWxkIGFsd2F5cyBiZSBpbnRlcnByZXRlciB3aXRoIHJlc3BlY3QgdG8gYSB3c2RsLW1lc3NhZ2UgZWxlbWVudC4gSWYgd3JhcHBlZC1lbGVtZW50IGlzIHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSByZWZlcnMgdG8gYW4gZWxlbWVudCYjeEQ7JiN4QTtuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbWV0ZXJNb2RlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBhcmFtZXRlci1tb2RlICBlbGVtZW50IGRlZmluZXMgdGhlIG1vZGUgb2YgdGhlIHBhcmFtZXRlci4gSXQgY2FuIGhhdmUgb25seSB0aHJlZSB2YWx1ZXMsIElOLCBPVVQsIElOT1VULiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcEhlYWRlciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id3NkbE1lc3NhZ2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMTWVzc2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETE1lc3NhZ2VQYXJ0TmFtZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbE1lc3NhZ2VQYXJ0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbnRlcmZhY2VNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiLz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvamNhLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2pjYS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3ZTMzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvamNhLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImpjYSIKLSAgICBuc1VSST0iamNhLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYSI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGVsZW1lbnQgaW5jbHVkZXMgZ2VuZXJhbCBpbmZvcm1hdGlvbiAtIHZlbmRvciBuYW1lLCB2ZXJzaW9uLCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gc3VwcG9ydGVkLCBpY29uIC0gIGFib3V0IHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gSXQgYWxzbyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXIuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZW5kb3JOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgdmVuZG9yLiYjeEQ7JiN4QTtFeGFtcGxlOiBXb21iYXQgQ29ycC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY1ZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3llciB0byBjb25maWd1cmUgdGhlIHJlc291cmNlIGFkYXB0ZXIgdG8gc3VwcG9ydCBkZXBsb3ltZW50IGFuZCBydW50aW1lIHJlcXVpcmVtZW50cyBvZiB0aGUgY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlaXNUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgdGhlIEVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyBjYW4gYmUgcHJvZHVjdCBuYW1lIG9mIEVJUyBpbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbiBpbmZvLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhpcyBoZWxwcyBpbiBpZGVudGlmeWluZyBFSVMgaW5zdGFuY2VzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCYjeEQ7JiN4QTt0aGlzIHJlc291cmNlIGFkYXB0ZXIuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIGEgc3RyaW5nLWJhc2VkIHZlcnNpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlci4mI3hEOyYjeEE7JiN4RDsmI3hBO0V4YW1wbGU6IDEuNSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaWNlbnNlIiBlVHlwZT0iIy8vTGljZW5zZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYSBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YmI3hEOyYjeEE7Y29ubmVjdGlvbiByZXN0cmljdGlvbnMpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZUFkYXB0ZXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZUFkYXB0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlQWRhcHRlciIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseS1xdWFsaWZpZWQgbmFtZXMgb2YgY2xhc3MvaW50ZXJmYWNlcyByZXF1aXJlZCBhcyBwYXJ0IG9mIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQgcHJvdmlkZWQsIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGZvciBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2VzLCBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZCBhbmQgYWRkaXRpb25hbCYjeEQ7JiN4QTtyZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4mI3hEOyYjeEE7JiN4RDsmI3hBO0lmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZWQgYXMgcGFydCBvZiYjeEQ7JiN4QTtyZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdCYjeEQ7JiN4QTtzdXBwb3J0IGFueSBzdGFuZGFyZCBzZWN1cml0eSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIGFzIHBhcnQmI3hEOyYjeEE7b2Ygc2VjdXJpdHkgY29udHJhY3QuIFRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaWdub3JlcyB0aGUgc2VjdXJpdHkmI3hEOyYjeEE7cGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5jb25uZWN0aW9uRGVmaW5pdGlvbnMubWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MmI3hEOyYjeEE7U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGphdmF4LnJlc291cmNlLnNwaS5NYW5hZ2VkLUNvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cy4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNvbm5lY3Rpb25EZWZpbml0aW9ucy5jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSYjeEQ7JiN4QTtTcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY29ubmVjdGlvbkRlZmluaXRpb25zLmNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzJiN4RDsmI3hBO1NwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29ubmVjdGlvbkludGVyZmFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5jb25uZWN0aW9uRGVmaW5pdGlvbnMuY29ubmVjdGlvbkludGVyZmFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25uZWN0aW9uSW1wbENsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNvbm5lY3Rpb25EZWZpbml0aW9ucy5jb25uZWN0aW9uSW1wbENsYXNzJiN4RDsmI3hBO1NwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNhY3Rpb25TdXBwb3J0IiBlVHlwZT0iIy8vVHJhbnNhY3Rpb25TdXBwb3J0S2luZCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci50cmFuc2FjdGlvblN1cHBvcnQmI3hEOyYjeEE7VGhlIHRyYW5zYWN0aW9uLXN1cHBvcnQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxldmVsIG9mIHRyYW5zYWN0aW9uJiN4RDsmI3hBO3N1cHBvcnQgcHJvdmlkZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuJiN4RDsmI3hBO1RoZSB2YWx1ZSBvZiB0cmFuc2FjdGlvbi1zdXBwb3J0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6JiN4RDsmI3hBOyAgTm9UcmFuc2FjdGlvbiYjeEQ7JiN4QTsgIExvY2FsVHJhbnNhY3Rpb24mI3hEOyYjeEE7ICBYQVRyYW5zYWN0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYXV0aGVudGljYXRpb25TdXBwb3J0IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5yZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCYjeEQ7JiN4QTtTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLUNvbm5lY3Rpb24gaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IGZvciB0aGUgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlQWRhcHRlckNsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgcmVzb3VyY2VhZGFwdGVyLWNsYXNzIHNwZWNpZmllcyB0aGUmI3hEOyYjeEE7ICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzJiN4RDsmI3hBOyAgICAgICAgdGhlIGphdmF4LnJlc291cmNlLnNwaS5SZXNvdXJjZUFkYXB0ZXImI3hEOyYjeEE7ICAgICAgICBpbnRlcmZhY2UuIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mJiN4RDsmI3hBOyAgICAgICAgcmVzb3VyY2UgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvciYjeEQ7JiN4QTsgICAgICAgIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLiBUaGUgaW1wbGVtZW50YXRpb24mI3hEOyYjeEE7ICAgICAgICBvZiB0aGlzIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEgSmF2YUJlYW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY3VyaXR5UGVybWlzc2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vU2VjdXJpdHlQZXJtaXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uZmlnUHJvcGVydGllcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Db25maWdQcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRib3VuZFJlc291cmNlQWRhcHRlciIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UgZWxlbWVudCBjb250ZW50IG11c3QgYmUmI3hEOyYjeEE7ICAgICAgICB1bmlxdWUgaW4gdGhlIG91dGJvdW5kLXJlc291cmNlYWRhcHRlci4gTXVsdGlwbGUgY29ubmVjdGlvbi1kZWZpbml0aW9ucyYjeEQ7JiN4QTsgICAgICAgIGNhbiBub3QgdXNlIHRoZSBzYW1lIGNvbm5lY3Rpb25mYWN0b3J5LXR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluYm91bmRSZXNvdXJjZUFkYXB0ZXIiCi0gICAgICAgIGVUeXBlPSIjLy9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRtaW5PYmplY3RzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0FkbWluT2JqZWN0IiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXV0aGVudGljYXRpb25NZWNoYW5pc20iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllcyBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBOb3RlIHRoYXQgdGhpcyBzdXBwb3J0IGlzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgbm90IGZvciB0aGUgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBzcGVjaWZpZXMgYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQgZm9yIHRoZSBzdXBwb3J0IG9mIHNlY3VyaXR5IGNvbnRyYWN0IGFuZCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uJiN4RDsmI3hBOyYjeEQ7JiN4QTtOb3RlIHRoYXQgQmFzaWNQYXNzd29yZCBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUmI3hEOyYjeEE7amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbCBpbnRlcmZhY2UuJiN4RDsmI3hBO1RoZSBLZXJidjUgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlJiN4RDsmI3hBO2phdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aGVudGljYXRpb25NZWNoYW5pc20iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIgotICAgICAgICBlVHlwZT0iIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQgU2VlIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGV4YW1wbGUgdmFsdWVzIGFyZTomI3hEOyYjeEE7ICAtIEJhc2ljUGFzc3dvcmQmI3hEOyYjeEE7ICAtIEtlcmJ2NSYjeEQ7JiN4QTsmI3hEOyYjeEE7QW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlJiN4RDsmI3hBO0Nvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWRlbnRpYWxJbnRlcmZhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGludGVyZmFjZSB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGZvciB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNyZWRlbnRpYWxzLiBUaGlzIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgYnkgYXBwbGljYXRpb24gc2VydmVyIHRvIGZpbmQgb3V0IHRoZSBDcmVkZW50aWFsIGludGVyZmFjZSBpdCBzaG91bGQgdXNlIGFzIHBhcnQgb2YgdGhlIHNlY3VyaXR5IGNvbnRyYWN0LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6JiN4RDsmI3hBOyAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwmI3hEOyYjeEE7ICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXN0b21BdXRoTWVjaFR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkJiN4RDsmI3hBO1RoaXMgaXMgYW4gaW50ZXJuYWwgdmFyaWFibGUgdXNlZCB0byBzdG9yZSB0aGUgQXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgd2hlbiBpdCBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBCYXNpY1Bhc3N3b3JkIG9yIEtlcmJ2NS4gIEF1dGhlbnRpY2F0aW9uTWVjYW5pc21UeXBlIGlzIHNldCB0byAnQ3VzdG9tJyBpbiB0aG9zZSBjYXNlcy4gIFRoaXMgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgdXNlZCBieSBydW50aW1lLiAgSXQgaXMgb25seSB1c2VkIGJ5IHRoZSB3cml0ZXIgdG8gd3JpdGUgYmFjayBvdXQgdGhlIGN1c3RvbSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgc3RyaW5nIGluIHRoZSBjYXNlIG9mIGN1c3RvbSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUncy4gICYjeEQ7JiN4QTtUaGlzIHZhcmlhYmxlIGlzIGludGVybmFsLCB1c2VkIG9ubHkgYnkgdGhlIHJlYWRlci93cml0ZXIgY2xhc3NlcywgYW5kIGNhbiBjaGFuZ2Ugb3IgZGlzYXBwZWFyIHdpdGhvdXQgbm90aWNlLiAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtCYXNpY1Bhc3N3b3JkPTAmI3hEOyYjeEE7S2VyYnY1PTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkJhc2ljUGFzc3dvcmQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IktlcmJ2NSIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uZmlnUHJvcGVydHkiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbmZpZyBwcm9wZXJ0eSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgc2luZ2xlJiN4RDsmI3hBO2NvbmZpZ3VyYXRpb24gcHJvcGVydHkgZm9yIGEgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RWFjaCBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UgY3JlYXRlcyBjb25uZWN0aW9ucyB0byBhIHNwZWNpZmljIEVJUyBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBjb25maWd1cmVkIG9uIHRoZSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuIFRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIG9ubHkgb25jZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBldmVuIHRob3VnaCBhIHJlc291cmNlIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIG11bHRpcGxlIE1hbmFnZWRDb25ubmVjdGlvbi1GYWN0b3J5IGluc3RhbmNlcyAodGhhdCBjcmVhdGUgY29ubmVjdGlvbnMgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBFSVMpLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBuYW1lLCB0eXBlJiN4RDsmI3hBO2FuZCBhbiBvcHRpb25hbCB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gSWYgdGhlIHJlc291cmNlJiN4RDsmI3hBO2FkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4gdGhlIGRlcGxveWVyIGlzJiN4RDsmI3hBO3Jlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSB2YWxpZCB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7QW55IGJvdW5kcyBvciB3ZWxsLWRlZmluZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkIHByb3BlcnRpZXMgYWxsIG9mIHR5cGUgamF2YS5sYW5nLlN0cmluZy4gVGhlc2UgYXJlIGFzIGZvbGxvd3M6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgIFNlcnZlck5hbWUmI3hEOyYjeEE7ICAgICBQb3J0TnVtYmVyJiN4RDsmI3hBOyAgICAgVXNlck5hbWUmI3hEOyYjeEE7ICAgICBQYXNzd29yZCYjeEQ7JiN4QTsgICAgIENvbm5lY3Rpb25VUkwmI3hEOyYjeEE7JiN4RDsmI3hBO0EgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciBjYW4gZXh0ZW5kIHRoaXMgcHJvcGVydHkgc2V0IHRvIGluY2x1ZGUgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgaXRzIHVuZGVybHlpbmcgRUlTLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSB0eXBlIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBhcyByZXF1aXJlZCBieSBNYW5hZ2VkQ29ubmVjdGlvbi1GYWN0b3J5IGluc3RhbmNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBjb25maWctcHJvcGVydHktdHlwZTomI3hEOyYjeEE7ICAgamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLCYjeEQ7JiN4QTsgICBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LCYjeEQ7JiN4QTsgICBqYXZhLmxhbmcuTG9uZywgamF2YS5sYW5nLkZsb2F0LCBqYXZhLmxhbmcuQ2hhcmFjdGVyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LXZhbHVlIGNvbnRhaW5zIHRoZSB2YWx1ZSYjeEQ7JiN4QTsgICAgICAgIG9mIGEgY29uZmlndXJhdGlvbiBlbnRyeS4gTm90ZSwgaXQgaXMgcG9zc2libGUgZm9yIGEmI3hEOyYjeEE7ICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGRlcGxveWVyIHRvIG92ZXJyaWRlIHRoaXMmI3hEOyYjeEE7ICAgICAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGR1cmluZyBkZXBsb3ltZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsgICAgICAgICZsdDtjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyJmx0Oy9jb25maWctcHJvcGVydHktdmFsdWU+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN1cml0eVBlcm1pc3Npb24iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIGEgc2VjdXJpdHkgcGVybWlzc2lvbiB0aGF0IGlzIHJlcXVpcmVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyIGNvZGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgc2VjdXJpdHkgcGVybWlzc2lvbiBsaXN0ZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhcmUgb25lcyB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aG9zZSByZXF1aXJlZCBieSB0aGUgZGVmYXVsdCBwZXJtaXNzaW9uIHNldCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3RvciBzcGVjaWZpY2F0aW9uLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gY2FuIG1lbnRpb24gc3BlY2lmaWMgcmVhc29uIHRoYXQgcmVzb3VyY2UgYWRhcHRlciByZXF1aXJlcyBhIGdpdmVuIHNlY3VyaXR5IHBlcm1pc3Npb24uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWNhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50IHBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIGJhc2VkIG9uIHRoZSBTZWN1cml0eSBwb2xpY3kgZmlsZSBzeW50YXguICYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxpY2Vuc2UiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIGxpY2Vuc2luZyByZXF1aXJlbWVudHMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gU3BlY2lmaWVzIHdoZXRoZXIgYSBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YgY29ubmVjdGlvbiByZXN0cmljdGlvbnMpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkIFJlcGxhY2VkIHdpdGggZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBsaWNlbnNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXF1aXJlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJUcmFuc2FjdGlvblN1cHBvcnRLaW5kIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5vVHJhbnNhY3Rpb24iLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxvY2FsVHJhbnNhY3Rpb24iIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJYQVRyYW5zYWN0aW9uIiB2YWx1ZT0iMiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24mI3hEOyYjeEE7YWJvdXQgYW4gaW5ib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uJiN4RDsmI3hBO3NwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciYjeEQ7JiN4QTtsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBtZXNzYWdlYWRhcHRlciBlbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlQWRhcHRlciIgZVR5cGU9IiMvL01lc3NhZ2VBZGFwdGVyIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXNzYWdlbGlzdGVuZXItdHlwZSBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSYjeEQ7JiN4QTsgICAgICAgIHVuaXF1ZSBpbiB0aGUgbWVzc2FnZWFkYXB0ZXIuIFNldmVyYWwgbWVzc2FnZWxpc3RlbmVycyYjeEQ7JiN4QTsgICAgICAgIGNhbiBub3QgdXNlIHRoZSBzYW1lIG1lc3NhZ2VsaXN0ZW5lci10eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRib3VuZFJlc291cmNlQWRhcHRlciIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCYjeEQ7JiN4QTthbiBvdXRib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkmI3hEOyYjeEE7cXVhbGlmaWVkIG5hbWVzIG9mIGNsYXNzZXMvaW50ZXJmYWNlcyByZXF1aXJlZCBhcyBwYXJ0IG9mJiN4RDsmI3hBO3RoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMgZm9yJiN4RDsmI3hBO2Nvbm5lY3Rpb24gbWFuYWdlbWVudCwgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydCYjeEQ7JiN4QTtwcm92aWRlZCwgb25lIG9yIG1vcmUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBzdXBwb3J0ZWQmI3hEOyYjeEE7YW5kIGFkZGl0aW9uYWwgcmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtJZiB0aGVyZSBpcyBubyBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gc3BlY2lmaWVkIGFzIHBhcnQgb2YmI3hEOyYjeEE7cmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QmI3hEOyYjeEE7c3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcyYjeEQ7JiN4QTtwYXJ0IG9mIHNlY3VyaXR5IGNvbnRyYWN0LiBUaGUgYXBwbGljYXRpb24gc2VydmVyIGlnbm9yZXMmI3hEOyYjeEE7dGhlIHNlY3VyaXR5IHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgc3BlY2lmaWVzJiN4RDsmI3hBOyAgICAgICAgd2hldGhlciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyYjeEQ7JiN4QTsgICAgICAgIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtIENvbm5lY3Rpb24mI3hEOyYjeEE7ICAgICAgICBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZSYjeEQ7JiN4QTsgICAgICAgIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gYW5kIG5vdCBmb3IgdGhlJiN4RDsmI3hBOyAgICAgICAgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoaXMgZWxlbWVudCBtdXN0IGhhdmUmI3hEOyYjeEE7ICAgICAgICBlaXRoZXIgYSAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7IHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc2FjdGlvblN1cHBvcnQiIGVUeXBlPSIjLy9UcmFuc2FjdGlvblN1cHBvcnRLaW5kIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbm5lY3Rpb25EZWZpbml0aW9ucyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25uZWN0aW9uRGVmaW5pdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXV0aGVudGljYXRpb25NZWNoYW5pc21zIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXNzYWdlQWRhcHRlciIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBtZXNzYWdlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSYjeEQ7JiN4QTttZXNzYWdpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzJiN4RDsmI3hBO2NvbnRhaW5zIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUmI3hEOyYjeEE7cmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSYjeEQ7JiN4QTttZXNzYWdlbGlzdGVuZXIgZWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWVzc2FnZUxpc3RlbmVycyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXNzYWdlTGlzdGVuZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbm5lY3Rpb25EZWZpbml0aW9uIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUgZGVmaW5lcyBhIHNldCBvZiBjb25uZWN0aW9uJiN4RDsmI3hBO2ludGVyZmFjZXMgYW5kIGNsYXNzZXMgcGVydGFpbmluZyB0byBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbiYjeEQ7JiN4QTt0eXBlLiBUaGlzIGFsc28gaW5jbHVkZXMgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yJiN4RDsmI3hBO01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMgdGhhdCBtYXkgYmUgcHJvZHVjZWQgb3V0JiN4RDsmI3hBO29mIHRoaXMgc2V0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50IG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcyBzcGVjaWZpZXMmI3hEOyYjeEE7ICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCYjeEQ7JiN4QTsgICAgICAgIGltcGxlbWVudHMgdGhlJiN4RDsmI3hBOyAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuJiN4RDsmI3hBOyAgICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UmI3hEOyYjeEE7ICAgICAgICBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSYjeEQ7JiN4QTsgICAgICAgIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzJiN4RDsmI3hBOyAgICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7ICAgICAgICAmbHQ7bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPiYjeEQ7JiN4QTsgICAgICAgICAgICBjb20ud29tYmF0Lk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUltcGwmI3hEOyYjeEE7ICAgICAgICAmbHQ7L21hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2Ugc3BlY2lmaWVzJiN4RDsmI3hBOyAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeSYjeEQ7JiN4QTsgICAgICAgIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyAgICAgICAgJmx0O2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5JiN4RDsmI3hBOyAgICAgICAgJmx0Oy9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIE9SJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgICZsdDtjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb25GYWN0b3J5JiN4RDsmI3hBOyAgICAgICAgJmx0Oy9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyBzcGVjaWZpZXMmI3hEOyYjeEE7ICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5JiN4RDsmI3hBOyAgICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXImI3hEOyYjeEE7ICAgICAgICBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgICZsdDtjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPmNvbS53b21iYXQuQ29ubmVjdGlvbkZhY3RvcnlJbXBsJiN4RDsmI3hBOyAgICAgICAgJmx0Oy9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25uZWN0aW9uSW50ZXJmYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbm5lY3Rpb24taW50ZXJmYWNlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseSYjeEQ7JiN4QTsgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uIGludGVyZmFjZSBzdXBwb3J0ZWQmI3hEOyYjeEE7ICAgICAgICBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgICAgICZsdDtjb25uZWN0aW9uLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbiYjeEQ7JiN4QTsgICAgICAgICAgICAmbHQ7L2Nvbm5lY3Rpb24taW50ZXJmYWNlPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25uZWN0aW9uSW1wbENsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbm5lY3Rpb24taW1wbC1jbGFzc1R5cGUgc3BlY2lmaWVzIHRoZSBmdWxseSYjeEQ7JiN4QTsgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uIGNsYXNzIHRoYXQmI3hEOyYjeEE7ICAgICAgICBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbiYjeEQ7JiN4QTsgICAgICAgIGludGVyZmFjZS4gIEl0IGlzIHVzZWQgYnkgdGhlIGNvbm5lY3Rpb24taW1wbC1jbGFzcyYjeEQ7JiN4QTsgICAgICAgIGVsZW1lbnRzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICAgICAgJmx0O2Nvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsJiN4RDsmI3hBOyAgICAgICAgICAgICZsdDsvY29ubmVjdGlvbi1pbXBsLWNsYXNzPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25maWdQcm9wZXJ0aWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbmZpZ1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBZG1pbk9iamVjdCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBhZG1pbm9iamVjdFR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGFuJiN4RDsmI3hBO2FkbWluaXN0ZXJlZCBvYmplY3QuICBBZG1pbmlzdGVyZWQgb2JqZWN0cyBhcmUgc3BlY2lmaWMgdG8gYSYjeEQ7JiN4QTttZXNzYWdpbmcgc3R5bGUgb3IgbWVzc2FnZSBwcm92aWRlci4gIFRoaXMgY29udGFpbnMmI3hEOyYjeEE7aW5mb3JtYXRpb24gb24gdGhlIEphdmEgdHlwZSBvZiB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5JiN4RDsmI3hBO2FuIGFkbWluaXN0ZXJlZCBvYmplY3QsIGl0cyBKYXZhIGNsYXNzIG5hbWUgYW5kIGl0cyYjeEQ7JiN4QTtjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkbWluT2JqZWN0SW50ZXJmYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgYWRtaW5vYmplY3QtaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUmI3hEOyYjeEE7ICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIHRoZSYjeEQ7JiN4QTsgICAgICAgIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsgICAgICAgICAgJmx0O2FkbWlub2JqZWN0LWludGVyZmFjZT5qYXZheC5qbXMuRGVzdGluYXRpb24mI3hEOyYjeEE7ICAgICAgICAgICZsdDsvYWRtaW5vYmplY3QtaW50ZXJmYWNlPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZG1pbk9iamVjdENsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgYWRtaW5vYmplY3QtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseSYjeEQ7JiN4QTsgICAgICAgIHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7ICAgICAgICAgICAgJmx0O2FkbWlub2JqZWN0LWNsYXNzPmNvbS53b21iYXQuRGVzdGluYXRpb25JbXBsJiN4RDsmI3hBOyAgICAgICAgICAgICZsdDsvYWRtaW5vYmplY3QtY2xhc3M+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmZpZ1Byb3BlcnRpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ29uZmlnUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1lc3NhZ2VMaXN0ZW5lciIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBtZXNzYWdlbGlzdGVuZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhJiN4RDsmI3hBO3NwZWNpZmljIG1lc3NhZ2UgbGlzdGVuZXIgc3VwcG9ydGVkIGJ5IHRoZSBtZXNzYWdpbmcmI3hEOyYjeEE7cmVzb3VyY2UgYWRhcHRlci4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIEphdmEgdHlwZSYjeEQ7JiN4QTtvZiB0aGUgbWVzc2FnZSBsaXN0ZW5lciBpbnRlcmZhY2UgYW5kIGFuIGFjdGl2YXRpb24mI3hEOyYjeEE7c3BlY2lmaWNhdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVzc2FnZUxpc3RlbmVyVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50IG1lc3NhZ2VsaXN0ZW5lci10eXBlIHNwZWNpZmllcyB0aGUgZnVsbHkmI3hEOyYjeEE7ICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIGEgbWVzc2FnZSYjeEQ7JiN4QTsgICAgICAgIGxpc3RlbmVyIGludGVyZmFjZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgICAmbHQ7bWVzc2FnZWxpc3RlbmVyLXR5cGU+amF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lciYjeEQ7JiN4QTsgICAgICAgICAgJmx0Oy9tZXNzYWdlbGlzdGVuZXItdHlwZT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWN0aXZhdGlvblNwZWMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9BY3RpdmF0aW9uU3BlYyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZhdGlvblNwZWMiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgYWN0aXZhdGlvbnNwZWNUeXBlIHNwZWNpZmllcyBhbiBhY3RpdmF0aW9uJiN4RDsmI3hBO3NwZWNpZmljYXRpb24uICBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkgcXVhbGlmaWVkJiN4RDsmI3hBO0phdmEgY2xhc3MgbmFtZSBvZiBhbiBhY3RpdmF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGEgc2V0IG9mJiN4RDsmI3hBO3JlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2YXRpb25TcGVjQ2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBhY3RpdmF0aW9uc3BlYy1jbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5JiN4RDsmI3hBOyAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZhdGlvbiYjeEQ7JiN4QTsgICAgICAgIHNwZWNpZmljYXRpb24gY2xhc3MuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlJiN4RDsmI3hBOyAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLkFjdGl2YXRpb25TcGVjIGludGVyZmFjZS4gVGhlJiN4RDsmI3hBOyAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhJiN4RDsmI3hBOyAgICAgICAgSmF2YUJlYW4uJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyAgICAgICAgICAgICZsdDthY3RpdmF0aW9uc3BlYy1jbGFzcz5jb20ud29tYmF0LkFjdGl2YXRpb25TcGVjSW1wbCYjeEQ7JiN4QTsgICAgICAgICAgICAmbHQ7L2FjdGl2YXRpb25zcGVjLWNsYXNzPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiYjeEQ7JiN4QTtvZiBhIHNpbmdsZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IHVzZWQgZm9yIHNwZWNpZnlpbmcgYSYjeEQ7JiN4QTtyZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWUuIEl0IGlzIHVzZWQmI3hEOyYjeEE7YnkgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5IGVsZW1lbnRzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyZsdDtyZXF1aXJlZC1jb25maWctcHJvcGVydHk+RGVzdGluYXRpb24mbHQ7L3JlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eT4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvanNwLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2pzcC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhMDQ4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvanNwLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ianNwIgotICAgIG5zVVJJPSJqc3AueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuanNwIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKU1BDb25maWciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUganNwLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBwcm92aWRlIGdsb2JhbCBjb25maWd1cmF0aW9uJiN4RDsmI3hBO2luZm9ybWF0aW9uIGZvciB0aGUgSlNQIGZpbGVzIGluIGEgd2ViIGFwcGxpY2F0aW9uLiBJdCBoYXMmI3hEOyYjeEE7dHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFnTGlicyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UYWdMaWJSZWZUeXBlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0eUdyb3VwcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KU1BQcm9wZXJ0eUdyb3VwIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKU1BQcm9wZXJ0eUdyb3VwIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZiYjeEQ7JiN4QTtmaWxlcyBzbyB0aGV5IGNhbiBiZSBnaXZlbiBnbG9iYWwgcHJvcGVydHkgaW5mb3JtYXRpb24uJiN4RDsmI3hBO0FsbCBmaWxlcyBzbyBkZXNjcmliZWQgYXJlIGRlZW1lZCB0byBiZSBKU1AgZmlsZXMuIFRoZSYjeEQ7JiN4QTtmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGNhbiBiZSBkZXNjcmliZWQ6JiN4RDsmI3hBOyYjeEQ7JiN4QTstIENvbnRyb2wgZW5hYmxpbmcgb2YgRUwgZXZhbHVhdGlvbi4gLSBDb250cm9sIGVuYWJsaW5nJiN4RDsmI3hBO29mIFNjcmlwdGluZyBlbGVtZW50cy4gLSBJbmRpY2F0ZSBwYWdlRW5jb2RpbmcmI3hEOyYjeEE7aW5mb3JtYXRpb24uIC0gSW5kaWNhdGluZyB0aGF0IGEgcmVzb3VyY2UgaXMgYSBKU1AmI3hEOyYjeEE7ZG9jdW1lbnQgLSBQcmVsdWRlIGFuZCBDb2RhIGF1dG9tYXRpYyBpbmNsdWRlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJsUGF0dGVybiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWxJZ25vcmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNhbiBiZSB1c2VkIHRvIGVhc2lseSBzZXQgdGhlIGlzRUxJZ25vcmVkJiN4RDsmI3hBOyYjeDk7cHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuIEJ5IGRlZmF1bHQsJiN4RDsmI3hBOyYjeDk7dGhlIEVMIGV2YWx1YXRpb24gaXMgZW5hYmxlZCBmb3IgV2ViJiN4RDsmI3hBOyYjeDk7QXBwbGljYXRpb25zIHVzaW5nIGEgU2VydmxldCAyLjQgb3IgZ3JlYXRlciYjeEQ7JiN4QTsmI3g5O3dlYi54bWwsIGFuZCBkaXNhYmxlZCBvdGhlcndpc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhZ2VFbmNvZGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWxpZCB2YWx1ZXMgb2YgcGFnZS1lbmNvZGluZyBhcmUgdGhvc2Ugb2YmI3hEOyYjeEE7JiN4OTt0aGUgcGFnZUVuY29kaW5nIHBhZ2UgZGlyZWN0aXZlLiBJdCBpcyBhJiN4RDsmI3hBOyYjeDk7dHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudCYjeEQ7JiN4QTsmI3g5O2VuY29kaW5ncyBpbiB0aGUgcGFnZUVuY29kaW5nIGF0dHJpYnV0ZSBvZiB0aGUmI3hEOyYjeEE7JiN4OTtwYWdlIGRpcmVjdGl2ZSBvZiBhIEpTUCBwYWdlIGFuZCBpbiBhIEpTUCYjeEQ7JiN4QTsmI3g5O2NvbmZpZ3VyYXRpb24gZWxlbWVudCBtYXRjaGluZyB0aGUgcGFnZS4gSXQgaXMmI3hEOyYjeEE7JiN4OTthbHNvIGEgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudCYjeEQ7JiN4QTsmI3g5O2VuY29kaW5ncyBpbiB0aGUgcHJvbG9nIG9mIGEgZG9jdW1lbnQgaW4gWE1MJiN4RDsmI3hBOyYjeDk7c3ludGF4IGFuZCBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQmI3hEOyYjeEE7JiN4OTttYXRjaGluZyB0aGUgZG9jdW1lbnQuIEl0IGlzIGxlZ2FsIHRvIG5hbWUgdGhlJiN4RDsmI3hBOyYjeDk7c2FtZSBlbmNvZGluZyB0aHJvdWdoIG11bGl0cGxlIG1lY2hhbmlzbXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjcmlwdGluZ0ludmFsaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IGRpc2FibGUgc2NyaXB0aW5nIGluIGEmI3hEOyYjeEE7JiN4OTtncm91cCBvZiBKU1AgcGFnZXMuIEJ5IGRlZmF1bHQsIHNjcmlwdGluZyBpcyYjeEQ7JiN4QTsmI3g5O2VuYWJsZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzWE1MIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0cnVlLCBkZW5vdGVzIHRoYXQgdGhlIGdyb3VwIG9mIHJlc291cmNlcyYjeEQ7JiN4QTsmI3g5O3RoYXQgbWF0Y2ggdGhlIFVSTCBwYXR0ZXJuIGFyZSBKU1AgZG9jdW1lbnRzLCYjeEQ7JiN4QTsmI3g5O2FuZCB0aHVzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgWE1MIGRvY3VtZW50cy4mI3hEOyYjeEE7JiN4OTtJZiBmYWxzZSwgdGhlIHJlc291cmNlcyBhcmUgYXNzdW1lZCB0byBub3QgYmUmI3hEOyYjeEE7JiN4OTtKU1AgZG9jdW1lbnRzLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlciBwcm9wZXJ0eSYjeEQ7JiN4QTsmI3g5O2dyb3VwIHRoYXQgaW5kaWNhdGVzIG90aGVyd2lzZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5jbHVkZVByZWx1ZGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbmNsdWRlLXByZWx1ZGUgZWxlbWVudCBpcyBhJiN4RDsmI3hBOyYjeDk7Y29udGV4dC1yZWxhdGl2ZSBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvJiN4RDsmI3hBOyYjeDk7YW4gZWxlbWVudCBpbiB0aGUgV2ViIEFwcGxpY2F0aW9uLiBXaGVuIHRoZSYjeEQ7JiN4QTsmI3g5O2VsZW1lbnQgaXMgcHJlc2VudCwgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSYjeEQ7JiN4QTsmI3g5O2F1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzIGluIGFuIGluY2x1ZGUmI3hEOyYjeEE7JiN4OTtkaXJlY3RpdmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBKU1AgcGFnZSBpbiYjeEQ7JiN4QTsmI3g5O3RoaXMganNwLXByb3BlcnR5LWdyb3VwLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbmNsdWRlQ29kYXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGluY2x1ZGUtY29kYSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZSYjeEQ7JiN4QTsmI3g5O3BhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUmI3hEOyYjeEE7JiN4OTtXZWIgQXBwbGljYXRpb24uIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwmI3hEOyYjeEE7JiN4OTt0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQmI3hEOyYjeEE7JiN4OTsoYXMgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBlbmQgb2YgZWFjaCYjeEQ7JiN4QTsmI3g5O0pTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYWdMaWJSZWZUeXBlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7QSB0YWdsaWIgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBhIHRhZyYjeEQ7JiN4QTtsaWJyYXJ5IHRoYXQgaXMgdXNlZCBieSBhIEpTUCBwYWdlIHdpdGhpbiB0aGUgV2ViJiN4RDsmI3hBO0FwcGxpY2F0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YWdsaWJVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIgQSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJIGlkZW50aWZ5aW5nIGEmI3hEOyYjeEE7ICAgICAgICB0YWcgbGlicmFyeSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uICBUaGUgYm9keSYjeEQ7JiN4QTsgICAgICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbiYjeEQ7JiN4QTsgICAgICAgIGFic29sdXRlIFVSSSBzcGVjaWZpY2F0aW9uLCBvciBhIHJlbGF0aXZlIFVSSS4mI3hEOyYjeEE7ICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gZW50cmllcyBpbiB3ZWIueG1sIHdpdGggdGhlJiN4RDsmI3hBOyAgICAgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YWdsaWJMb2NhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9InRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24mI3hEOyYjeEE7ICAgICAgICAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViJiN4RDsmI3hBOyAgICAgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5JiN4RDsmI3hBOyAgICAgICAgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvdGFnbGliLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3RhZ2xpYi5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjODRkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvdGFnbGliLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InRhZ2xpYiIKLSAgICBuc1VSST0idGFnbGliLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYiI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFnTGliIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ZGVzY3JpcHRpb24gICAgIGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAmcXVvdDt1c2UmcXVvdDsgb2YgdGhpcyB0YWdsaWIsJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZSYjeEQ7JiN4QTsmI3hEOyYjeEE7ZGlzcGxheS1uYW1lICAgIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBieSB0b29scyYjeEQ7JiN4QTsmI3hEOyYjeEE7aWNvbiAgICAgICAgICAgIG9wdGlvbmFsIGljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scyYjeEQ7JiN4QTsmI3hEOyYjeEE7dGxpYi12ZXJzaW9uICAgIHRoZSB2ZXJzaW9uIG9mIHRoZSB0YWcgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiYjeEQ7JiN4QTsmI3hEOyYjeEE7c2hvcnQtbmFtZSAgICAgIGEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlJiN4RDsmI3hBOyAgICAgICAgICAgICAgICB1c2VkIGJ5IGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgbmFtZXMgd2l0aCBhIG1uZW1vbmljIHZhbHVlOyBmb3IgZXhhbXBsZSwmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIHRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQgcHJlZml4JiN4RDsmI3hBOyAgICAgICAgICAgICAgICB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcyYjeEQ7JiN4QTsmI3hEOyYjeEE7dXJpICAgICAgICAgICAgIGEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliJiN4RDsmI3hBOyYjeEQ7JiN4QTt2YWxpZGF0b3IgICAgICAgb3B0aW9uYWwgVGFnTGlicmFyeVZhbGlkYXRvciBpbmZvcm1hdGlvbiYjeEQ7JiN4QTsmI3hEOyYjeEE7bGlzdGVuZXIgICAgICAgIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIHNwZWNpZmljYXRpb24mI3hEOyYjeEE7JiN4RDsmI3hBO3RhZyAgICAgICAgICAgICBvbmUgb3IgbW9yZSB0YWdzIGluIHRoZSB0YWcgbGlicmFyeSYjeEQ7JiN4QTsmI3hEOyYjeEE7dGFnLWZpbGUgICAgICAgIG9uZSBvciBtb3JlIHRhZyBmaWxlcyBpbiB0aGUgdGFnIGxpYnJhcnkmI3hEOyYjeEE7JiN4RDsmI3hBO2Z1bmN0aW9uICAgICAgICB6ZXJvIG9yIG1vcmUgRUwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgdGFnIGxpYnJhcnkmI3hEOyYjeEE7JiN4RDsmI3hBO3RhZ2xpYi1leHRlbnNpb24gemVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhJiN4RDsmI3hBOyYjeDk7JiN4OTtpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZ2xpYiwgZm9yIHRvb2wmI3hEOyYjeEE7JiN4OTsmI3g5O2NvbnN1bXB0aW9uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhZ0xpYlZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhpcyB2ZXJzaW9uIG51bWJlciBvZiB0aGUgdGFnIGxpYnJhcnkgKGRld2V5IGRlY2ltYWwpLiYjeEQ7JiN4QTtAcmVnZXhwIFswLTldKnsgJnF1b3Q7LiZxdW90O1swLTldIH0wLi4zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImpzcFZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnIGxpYnJhcnkgcmVxdWlyZXMgaW4gb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpLiAgRGVmYXVsdCBpcyAxLjImI3hEOyYjeEE7QHJlZ2V4cCBbMC05XSp7ICZxdW90Oy4mcXVvdDtbMC05XSB9MC4uMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaG9ydE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIHNob3J0LW5hbWUgZWxlbWVudCBpcyBhIG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5IGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQgcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzLiBEbyBub3QgdXNlIHdoaXRlIHNwYWNlLCBhbmQgZG8gbm90IHN0YXJ0IHdpdGggZGlnaXRzIG9yIHVuZGVyc2NvcmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiB0aGUgdXJpIGVsZW1lbnQgaXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZXhhY3Qgc2VtYW50aWNzIG9mIHRoaXMgdGFnbGlicmFyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFncyIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KU1BUYWciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbGlkYXRvciIgZVR5cGU9IiMvL1ZhbGlkYXRvciIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imxpc3RlbmVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vTGlzdGVuZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZ1bmN0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9GdW5jdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhZ2xpYkV4dGVuc2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGxkRXh0ZW5zaW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKU1BUYWciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFnIGVsZW1lbnQgZGVmaW5lcyBhbiBhY3Rpb24gaW4gdGhpcyB0YWcgbGlicmFyeS4gVGhlIHRhZyBlbGVtZW50IGhhcyBvbmUgYXR0cmlidXRlLCBpZC4mI3hEOyYjeEE7VGhlIHRhZyBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6JiN4RDsmI3hBO25hbWUgLS0gVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZSYjeEQ7JiN4QTt0YWctY2xhc3MgLS0gVGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZyBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnJiN4RDsmI3hBO3RlaS1jbGFzcyAtLSBBbiBvcHRpb25hbCBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvJiN4RDsmI3hBO2JvZHktY29udGVudCAtLSBUaGUgYm9keSBjb250ZW50IHR5cGUmI3hEOyYjeEE7ZGlzcGxheS1uYW1lIC0tIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scyYjeEQ7JiN4QTtzbWFsbC1pY29uIC0tIE9wdGlvbmFsIHNtYWxsLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scyYjeEQ7JiN4QTtsYXJnZS1pY29uIC0tIE9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scyYjeEQ7JiN4QTtkZXNjcmlwdGlvbiAtLSBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24mI3hEOyYjeEE7dmFyaWFibGUgLS0gT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uJiN4RDsmI3hBO2F0dHJpYnV0ZSAtLSBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbiYjeEQ7JiN4QTtleGFtcGxlIC0tIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBhY3Rpb24uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib2R5Q29udGVudCIgZVR5cGU9IiMvL0JvZHlDb250ZW50VHlwZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgaGludCBhcyB0byB0aGUgY29udGVudCBvZiB0aGUgYm9keSBvZiB0aGlzIHRhZy4gUHJpbWFyaWx5IGludGVuZGVkIGZvciB1c2UgYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scy5UaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6JiN4RDsmI3hBOyYjeEQ7JiN4QTt0YWdkZXBlbmRlbnQgLSBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcgaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYSYjeDk7JiN4OTtkaWZmZXJlbnQgJnF1b3Q7bGFuZ2FnZSZxdW90OywgZS5nIGVtYmVkZGVkIFNRTCBzdGF0ZW1lbnRzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7SlNQIC0gVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheCYjeEQ7JiN4QTsmI3hEOyYjeEE7ZW1wdHkgLSBUaGUgYm9keSBtdXN0IGJlIGVtcHR5VGhlIGRlZmF1bHQgKGlmIG5vdCBkZWZpbmVkKSBpcyBKU1AjUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhhbXBsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleGFtcGxlIGVsZW1lbnQgcHJvdmlkZXMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGEgdGFnLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR5bmFtaWNBdHRyaWJ1dGVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdHRyaWJ1dGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0pTUFRhZ0F0dHJpYnV0ZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFibGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0pTUFZhcmlhYmxlIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYWJsZSBlbGVtZW50IHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzIGRlZmluZWQgYnkgdGhpcyB0YWcuJiN4RDsmI3hBO0l0IGlzIGEgKHRyYW5zbGF0aW9uIHRpbWUpIGVycm9yIGZvciBhbiBhY3Rpb24gdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUgc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbyBjbGFzcyB0aGF0IHJldHVybnMgYSBub24tbnVsbCBvYmplY3QuJiN4RDsmI3hBO1RoZSBzdWJlbGVtZW50cyBvZiB2YXJpYWJsZSBhcmUgb2YgdGhlIGZvcm06JiN4RDsmI3hBO25hbWUtZ2l2ZW4gLS0gVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudCYjeEQ7JiN4QTtuYW1lLWZyb20tYXR0cmlidXRlIC0tIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gT25lIG9mIG5hbWUtZ2l2ZW4gb3IgbmFtZWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLiYjeEQ7JiN4QTt2YXJpYWJsZS1jbGFzcyAtLSBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuIGphdmEubGFuZy5TdHJpbmcgaXMgZGVmYXVsdC4mI3hEOyYjeEE7ZGVjbGFyZSAtLSBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCBvciBub3QuIFRydWUgaXMgdGhlIGRlZmF1bHQuJiN4RDsmI3hBO3Njb3BlIC0tIFRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGRlZmluZWQuIE5FU1RFRCBpcyBkZWZhdWx0LiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFnQ2xhc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFnLWNsYXNzIGVsZW1lbnQgaW5kaWNhdGVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJsdmV0LmpzcC50YWdleHQuVGFnIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IgdGhpcyB0YWcuIFRoaXMgZWxlbWVudCBpcyByZXF1aXJlZC4mI3hEOyYjeEE7QHJlZ2V4cCBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWlDbGFzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0ZWktY2xhc3MgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8gZm9yIHRoaXMgdGFnLiBUaGUgY2xhc3MgaXMgaW5zdGFudGlhdGVkIGF0IHRyYW5zbGF0aW9uIHRpbWUuIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbC4mI3hEOyYjeEE7QHJlZ2V4cCBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpTUFRhZ0F0dHJpYnV0ZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZCAocmVxdWlyZWQpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXF1aXJlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icnRFeHByVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGNhbiBoYXZlIHNjcmlwdGxldCBleHByZXNzaW9ucyBhc2EgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZGF0IHJlcXVlc3QgdGltZSwgYXMgb3Bwb3NlZCB0byBhIHN0YXRpYyB2YWx1ZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9udGltZS4gKG9wdGlvbmFsKSYjeEQ7JiN4QTtEZWZhdWx0ID0gZmFsc2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJhZ21lbnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIHRoZSB0eXBlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUuJiN4RDsmI3hBO0ZvciBzdGF0aWMgdmFsdWVzICh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpIHRoZSB0eXBlIGlzIGFsd2F5cyBqYXZhLmxhbmcuU3RyaW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJCb2R5Q29udGVudFR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQsIGFkZGVkIFRBR0RFUEVOREVOVCxFTVBUWSxzY3JpcHRsZXNzLFNDUklQVExFU1MmI3hEOyYjeEE7UHJvdmlkZXMgYSBoaW50IGFzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBib2R5IG9mIHRoaXMgdGFnLiYjeEQ7JiN4QTtQcmltYXJpbHkgaW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlcmUgYXJlIGN1cnJlbnRseSBmb3VyIHZhbHVlcyBzcGVjaWZpZWQ6JiN4RDsmI3hBOyYjeEQ7JiN4QTt0YWdkZXBlbmRlbnQgICAgVGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBpbnRlcnByZXRlZCBieSB0aGUgdGFnJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgaW4gYSBkaWZmZXJlbnQgJnF1b3Q7bGFuZ2FnZSZxdW90OywgZS5nIGVtYmVkZGVkIFNRTCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgc3RhdGVtZW50cy4mI3hEOyYjeEE7JiN4RDsmI3hBO0pTUCAgICAgICAgICAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1AmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIHN5bnRheC4mI3hEOyYjeEE7JiN4RDsmI3hBO2VtcHR5ICAgICAgICAgICBUaGUgYm9keSBtdXN0IGJlIGVtcHR5JiN4RDsmI3hBOyYjeEQ7JiN4QTtzY3JpcHRsZXNzICAgICAgVGhlIGJvZHkgYWNjZXB0cyBvbmx5IHRlbXBsYXRlIHRleHQsIEVMJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBFeHByZXNzaW9ucywgYW5kIEpTUCBhY3Rpb24gZWxlbWVudHMuICBObyYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgc2NyaXB0aW5nIGVsZW1lbnRzIGFyZSBhbGxvd2VkLiYjeEQ7JiN4QTtKU1A9MCYjeEQ7JiN4QTtlbXB0eT0xJiN4RDsmI3hBO3RhZ2RlcGVuZGVudD0yJiN4RDsmI3hBO1RBR0RFUEVOREVOVD0zJiN4RDsmI3hBO0VNUFRZPTQmI3hEOyYjeEE7c2NyaXB0bGVzcz01JiN4RDsmI3hBO1NDUklQVExFU1M9NiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0idGFnZGVwZW5kZW50Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJKU1AiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJlbXB0eSIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InNjcmlwdGxlc3MiIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbGlkYXRvciIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbGlkYXRvckNsYXNzIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iZGVmaW5lcyB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzcyB0aGF0IGNhbiBiZSYjeEQ7JiN4QTt1c2VkIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRQYXJhbXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vSW5pdFBhcmFtIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSlNQVmFyaWFibGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVHaXZlbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lLWdpdmVuIGVsZW1lbnQgcHJvdmlkZXMgdGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lRnJvbUF0dHJpYnV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24tdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVjbGFyZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIGRlY2xhcmUgZWxlbWVudCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIGJlIGRlZmluZWQgb3Igbm90LiBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiYjeEQ7JiN4QTtUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kIGlzIHRoZSBkZWZhdWx0IGlzIHRydWUuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgZVR5cGU9IiMvL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFibGVDbGFzcyIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik5FU1RFRD0wJiN4RDsmI3hBO0FUX0JFR0lOPTEmI3hEOyYjeEE7QVRfRU5EPTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5FU1RFRCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVRfQkVHSU4iIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJBVF9FTkQiIHZhbHVlPSIyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZ1bmN0aW9uIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgZnVuY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gZWFjaCYjeEQ7JiN4QTtmdW5jdGlvbiBpbiB0aGUgdGFnIGxpYnJhcnkgdGhhdCBpcyB0byBiZSBleHBvc2VkIHRvIHRoZSBFTC4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBmdW5jdGlvbiBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6JiN4RDsmI3hBOyYjeEQ7JiN4QTtkZXNjcmlwdGlvbiAgICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbiYjeEQ7JiN4QTsmI3hEOyYjeEE7ZGlzcGxheS1uYW1lICAgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCBieSB0b29scyYjeEQ7JiN4QTsmI3hEOyYjeEE7aWNvbiAgICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGJ5IHRvb2xzJiN4RDsmI3hBOyYjeEQ7JiN4QTtuYW1lICAgICAgICAgICAgICAgIEEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb24mI3hEOyYjeEE7JiN4RDsmI3hBO2Z1bmN0aW9uLWNsYXNzICAgICAgUHJvdmlkZXMgdGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uJiN4RDsmI3hBOyYjeEQ7JiN4QTtmdW5jdGlvbi1zaWduYXR1cmUgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgb2YgdGhlIEphdmEmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBtZXRob2QgdGhhdCBpcyB0byBiZSB1c2VkIHRvIGltcGxlbWVudCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbi4mI3hEOyYjeEE7JiN4RDsmI3hBO2V4YW1wbGUgICAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgZnVuY3Rpb24iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaWduYXR1cmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBhcyBpbiB0aGUgSmF2YSBMYW5ndWFnZSYjeEQ7JiN4QTsgICAgICAgIFNwZWNpZmljYXRpb24sIG9mIHRoZSBzdGF0aWMgSmF2YSBtZXRob2QgdGhhdCBpcyYjeEQ7JiN4QTsgICAgICAgIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbi4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWNrTmFtZSggamF2YS5sYW5nLlN0cmluZywgaW50ICkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhhbXBsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24mI3hEOyYjeEE7ICAgICAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZnVuY3Rpb25DbGFzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YSYjeEQ7JiN4QTsgICAgICAgIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBtZXRob2QgdGhhdCBpbXBsZW1lbnRzJiN4RDsmI3hBOyAgICAgICAgdGhlIGZ1bmN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmdW5jdGlvbkV4dGVuc2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGxkRXh0ZW5zaW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYWdGaWxlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtEZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5IHRoYXQgaXMgaW1wbGVtZW50ZWQmI3hEOyYjeEE7YXMgYSAudGFnIGZpbGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgdGFnLWZpbGUgZWxlbWVudCBoYXMgdHdvIHJlcXVpcmVkIHN1YmVsZW1lbnRzOiYjeEQ7JiN4QTsmI3hEOyYjeEE7bmFtZSAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lJiN4RDsmI3hBOyYjeEQ7JiN4QTtwYXRoICAgIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcyYjeEQ7JiN4QTsgICAgICAgIGFjdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBvciYjeEQ7JiN4QTsmI3g5O3RoZSByb290IG9mIHRoZSBKQVIgZmlsZSBmb3IgYSB0YWcgbGlicmFyeSBwYWNrYWdlZCBpbiYjeEQ7JiN4QTsmI3g5O2EgSkFSLiAgVGhpcyBtdXN0IGJlZ2luIHdpdGggL1dFQi1JTkYvdGFncyBpZiB0aGUgLnRhZyYjeEQ7JiN4QTsmI3g5O2ZpbGUgcmVzaWRlcyBpbiB0aGUgV0FSLCBvciAvTUVUQS1JTkYvdGFncyBpZiB0aGUgLnRhZyYjeEQ7JiN4QTsmI3g5O2ZpbGUgcmVzaWRlcyBpbiBhIEpBUi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXRoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4YW1wbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFnRXh0ZW5zaW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UbGRFeHRlbnNpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRsZEV4dGVuc2lvbiIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZXNwYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuc2lvbkVsZW1lbnRzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4dGVuc2libGVUeXBlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbnNpYmxlVHlwZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93ZWJhcHBsaWNhdGlvbi5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93ZWJhcHBsaWNhdGlvbi5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkNjBhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd2ViYXBwbGljYXRpb24uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1MzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0id2ViYXBwbGljYXRpb24iCi0gICAgbnNVUkk9IndlYmFwcGxpY2F0aW9uLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWJBcHAiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KTkRJRW52UmVmc0dyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yJiN4RDsmI3hBO2Egd2ViIGFwcGxpY2F0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXN0cmlidXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaXN0cmlidXRhYmxlIGVsZW1lbnQsIGJ5IGl0cyBwcmVzZW5jZSBpbiBhIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGluZGljYXRlcyB0aGF0IHRoaXMgd2ViIGFwcGxpY2F0aW9uIGlzIHByb2dyYW1tZWQgYXBwcm9wcmlhdGVseSB0byBiZSBkZXBsb3llZCBpbnRvIGEgZGlzdHJpYnV0ZWQgc2VydmxldCBjb250YWluZXIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZXh0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Db250ZXh0UGFyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0NvbnRleHRQYXJhbS93ZWJBcHAiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCBzZWUgY29udGV4dFBhcmFtcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlcnJvclBhZ2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Vycm9yUGFnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRXJyb3JQYWdlL3dlYkFwcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWxlTGlzdCIgZVR5cGU9IiMvL1dlbGNvbWVGaWxlTGlzdCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2VsY29tZUZpbGVMaXN0L3dlYkFwcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YWdMaWJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RhZ0xpYlJlZiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vVGFnTGliUmVmL3dlYkFwcCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkIFNlZSBqc3A6OlRhZ0xpYlJlZiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uc3RyYWludHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vU2VjdXJpdHlDb25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZWN1cml0eUNvbnN0cmFpbnQvd2ViQXBwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxvZ2luQ29uZmlnIiBlVHlwZT0iIy8vTG9naW5Db25maWciCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0xvZ2luQ29uZmlnL3dlYkFwcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtaW1lTWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWltZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01pbWVNYXBwaW5nL3dlYkFwcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXNzaW9uQ29uZmlnIiBlVHlwZT0iIy8vU2Vzc2lvbkNvbmZpZyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2Vzc2lvbkNvbmZpZy93ZWJBcHAiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmxldE1hcHBpbmdzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlcnZsZXRNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZXJ2bGV0TWFwcGluZy93ZWJBcHAiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmxldHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vU2VydmxldCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VydmxldC93ZWJBcHAiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdXJpdHlSb2xlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWx0ZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpbHRlciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmlsdGVyTWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRmlsdGVyTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJGaWx0ZXIgbWFwcGluZ3MgZGVmaW5lZCBmb3IgdGhlIHdlYiBhcHAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlzdGVuZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9MaXN0ZW5lciIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGlzdGVuZXJzIGNvbGxlY3Rpb24gY29udGFpbnMgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFucyBpbiB0aGUgd2ViIGFwcC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGV4dFBhcmFtcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vUGFyYW1WYWx1ZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ianNwQ29uZmlnIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGpzcC5lY29yZSMvL0pTUENvbmZpZyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWVzc2FnZURlc3RpbmF0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QiCi0gICAgICAgIGVUeXBlPSIjLy9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRleHRQYXJhbSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQmI3hEOyYjeEE7VGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyYW1OYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQmI3hEOyYjeEE7VGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyYW1WYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkJiN4RDsmI3hBO1RoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvY29udGV4dHMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmxldCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEgc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZCBsb2FkZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcnZsZXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgc2VydmxldC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9hZE9uU3RhcnR1cCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludGVnZXJPYmplY3QiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlIGVsZW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gTG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZCBiZWZvcmUgaGlnaGVyIGludGVnZXJzLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgaXQgYXQgYW55IHRpbWUgaW4gdGhlIHN0YXJ0dXAgc2VxdWVuY2UuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvc2VydmxldHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViVHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dlYlR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Jbml0UGFyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGluaXRQYXJhbXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdXJpdHlSb2xlUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlUmVmIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJydW5BcyIgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9SdW5Bc1NwZWNpZmllZElkZW50aXR5IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGRlZmluZWQgZm9yIGEgc2VydmxldCwgb3ZlcnJpZGVzIHRoZSBzZWN1cml0eSBpZGVudGl0eSB1c2VkIHRvIGNhbGwgYW4gRUpCIGJ5IHRoYXQgc2VydmxldCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHJvbGUtbmFtZSBpcyBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRQYXJhbXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1BhcmFtVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlcnZsZXRNYXBwaW5nIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXJ2bGV0LW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEgc2VydmxldCBhbmQgYSB1cmwgcGF0dGVybiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmxQYXR0ZXJuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBNdXN0IGZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTAgb2YgdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlJiN4RDsmI3hBO3NlcnZsZXQuIEVhY2ggc2VydmxldCBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiYjeEQ7JiN4QTthcHBsaWNhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViQXBwIiBlVHlwZT0iIy8vV2ViQXBwIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViQXBwL3NlcnZsZXRNYXBwaW5ncyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2bGV0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU2VydmxldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXNzaW9uQ29uZmlnIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXNzaW9uLWNvbmZpZyBlbGVtZW50IGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlc3Npb25UaW1lb3V0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQmI3hEOyYjeEE7ICAgICAgICBzZXNzaW9uIHRpbWVvdXQgaW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkJiN4RDsmI3hBOyAgICAgICAgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBzcGVjaWZpZWQgdGltZW91dCYjeEQ7JiN4QTsgICAgICAgIG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuJiN4RDsmI3hBOyAgICAgICAgSWYgdGhlIHRpbWVvdXQgaXMgMCBvciBsZXNzLCB0aGUgY29udGFpbmVyIGVuc3VyZXMmI3hEOyYjeEE7ICAgICAgICB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZSYjeEQ7JiN4QTsgICAgICAgIG91dC4gSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXImI3hEOyYjeEE7ICAgICAgICBtdXN0IHNldCBpdHMgZGVmYXVsdCB0aW1lb3V0IHBlcmlvZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViQXBwIiBlVHlwZT0iIy8vV2ViQXBwIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViQXBwL3Nlc3Npb25Db25maWciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWltZU1hcHBpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1pbWUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uIGFuZCBhIG1pbWUgdHlwZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVuc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuIGV4dGVuc2lvbi4gZXhhbXBsZTogJnF1b3Q7dHh0JnF1b3Q7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1pbWUtdHlwZSBlbGVtZW50IGNvbnRhaW5zIGEgZGVmaW5lZCBtaW1lIHR5cGUuIGV4YW1wbGU6ICZxdW90O3RleHQvcGxhaW4mcXVvdDsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViQXBwIiBlVHlwZT0iIy8vV2ViQXBwIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViQXBwL21pbWVNYXBwaW5ncyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWxjb21lRmlsZUxpc3QiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lIGZpbGVzIGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvZmlsZUxpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmlsZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9XZWxjb21lRmlsZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2VsY29tZUZpbGUvZmlsZUxpc3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXJyb3JQYWdlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlcnJvci1wYWdlIGVsZW1lbnQgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZSBvciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViQXBwIiBlVHlwZT0iIy8vV2ViQXBwIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViQXBwL2Vycm9yUGFnZXMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFnTGliUmVmIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBqc3A6OlRhZ0xpYlJlZiYjeEQ7JiN4QTtUaGUgdGFnbGliIGVsZW1lbnQgaXMgdXNlZCB0byBkZXNjcmliZSBhIEpTUCB0YWcgbGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFnbGliVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQgU2VlIGpzcDo6VGFnTGliUmVmJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSwgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSB3ZWIueG1sIGRvY3VtZW50LCBpZGVudGlmeWluZyBhIFRhZyBMaWJyYXJ5IHVzZWQgaW4gdGhlIFdlYiBBcHBsaWNhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFnbGliTG9jYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCBTZWUganNwOjpUYWdMaWJSZWYmI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYmFyeSBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYkFwcCIgZVR5cGU9IiMvL1dlYkFwcCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dlYkFwcC90YWdMaWJzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3VyaXR5Q29uc3RyYWludCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VjdXJpdHktY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc3BsYXlOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRpc3BsYXlOYW1lcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvY29uc3RyYWludHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViUmVzb3VyY2VDb2xsZWN0aW9ucyIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL1dlYlJlc291cmNlQ29sbGVjdGlvbi9zZWNDb25zdHJhaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF1dGhDb25zdHJhaW50IiBlVHlwZT0iIy8vQXV0aENvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0F1dGhDb25zdHJhaW50L3NlY0NvbnN0cmFpbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idXNlckRhdGFDb25zdHJhaW50IiBlVHlwZT0iIy8vVXNlckRhdGFDb25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Vc2VyRGF0YUNvbnN0cmFpbnQvc2VjQ29uc3RyYWludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNwbGF5TmFtZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rpc3BsYXlOYW1lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb24iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBpZGVudGlmeSBhIHN1YnNldCBvZiB0aGUgcmVzb3VyY2VzIGFuZCBIVFRQIG1ldGhvZHMgb24gdGhvc2UgcmVzb3VyY2VzIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYgbm8gSFRUUCBtZXRob2RzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcyB0byBhbGwgSFRUUCBtZXRob2RzLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2ViUmVzb3VyY2VOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVybFBhdHRlcm4iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJodHRwTWV0aG9kIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0hUVFBNZXRob2RUeXBlRW51bSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjQ29uc3RyYWludCIgZVR5cGU9IiMvL1NlY3VyaXR5Q29uc3RyYWludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlY3VyaXR5Q29uc3RyYWludC93ZWJSZXNvdXJjZUNvbGxlY3Rpb25zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlVSTHMiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVVJMUGF0dGVyblR5cGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1VSTFBhdHRlcm5UeXBlL3Jlc0NvbGxlY3Rpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgdXJsUGF0dGVybiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iSFRUUHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSFRUUE1ldGhvZFR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGh0dHBNZXRob2QiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXV0aENvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGF1dGgtY29uc3RyYWludFR5cGUgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQmI3hEOyYjeEE7c2hvdWxkIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSYjeEQ7JiN4QTtjb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kJiN4RDsmI3hBO3RvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzJiN4RDsmI3hBO2RlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBvciBiZSB0aGUgc3BlY2lhbGx5JiN4RDsmI3hBO3Jlc2VydmVkIHJvbGUtbmFtZSAmcXVvdDsqJnF1b3Q7IHRoYXQgaXMgYSBjb21wYWN0IHN5bnRheCBmb3ImI3hEOyYjeEE7aW5kaWNhdGluZyBhbGwgcm9sZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gSWYgYm90aCAmcXVvdDsqJnF1b3Q7JiN4RDsmI3hBO2FuZCByb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwmI3hEOyYjeEE7cm9sZXMuICBJZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcyYjeEQ7JiN4QTt0byB0aGUgcG9ydGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUmI3hEOyYjeEE7Y29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LiAgVGhlIGNvbnRhaW5lciBtYXRjaGVzJiN4RDsmI3hBO3JvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nIGFjY2Vzcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO0EgZGVzY3JpcHRpb24gb2YgdGhlIGF1dGggY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBsaXN0IG9mIHJvbGUgbmFtZXMgZm9yIHRoZSBhdXRoIGNvbnN0cmFpbnQuICBFYWNoIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZSAoYSBTdHJpbmcpLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjQ29uc3RyYWludCIgZVR5cGU9IiMvL1NlY3VyaXR5Q29uc3RyYWludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlY3VyaXR5Q29uc3RyYWludC9hdXRoQ29uc3RyYWludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVXNlckRhdGFDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1c2VyLWRhdGEtY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gaW5kaWNhdGUgaG93IGRhdGEgY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZSBwcm90ZWN0ZWQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO0EgZGVzY3JpcHRpb24gZm9yIHRoZSB1c2VyIGRhdGEgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNwb3J0R3VhcmFudGVlIiBlVHlwZT0iIy8vVHJhbnNwb3J0R3VhcmFudGVlVHlwZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yIENPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueSYjeEQ7JiN4QTt0cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUgY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdCBwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvciBDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMgcmVxdWlyZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY0NvbnN0cmFpbnQiIGVUeXBlPSIjLy9TZWN1cml0eUNvbnN0cmFpbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZWN1cml0eUNvbnN0cmFpbnQvdXNlckRhdGFDb25zdHJhaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMb2dpbkNvbmZpZyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbG9naW4tY29uZmlnIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbmVlZGVkIGJ5IHRoZSBmb3JtIGxvZ2luJiN4RDsmI3hBO21lY2hhbmlzbS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aE1ldGhvZCIgZVR5cGU9IiMvL0F1dGhNZXRob2RLaW5kIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCAgZGVwcmVjYXRlZCwgYmVjb21lcyBpbml0UGFyYW1WYWx1ZXMmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgYXV0aC1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0byBnYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IGFuIGF1dGhvcml6YXRpb24gY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkIG1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGZvciB0aGlzIGVsZW1lbnQgYXJlICZxdW90O0JBU0lDJnF1b3Q7LCAmcXVvdDtESUdFU1QmcXVvdDssICZxdW90O0ZPUk0mcXVvdDssIG9yICZxdW90O0NMSUVOVC1DRVJUJnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWFsbU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0byB1c2UgaW4gSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcml6YXRpb25NZXRob2QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYkFwcCIgZVR5cGU9IiMvL1dlYkFwcCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dlYkFwcC9sb2dpbkNvbmZpZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmb3JtTG9naW5Db25maWciIGVUeXBlPSIjLy9Gb3JtTG9naW5Db25maWciCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0Zvcm1Mb2dpbkNvbmZpZy9sb2dpbkNvbmZpZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGb3JtTG9naW5Db25maWciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm0tbG9naW4tY29uZmlnIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IgcGFnZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZm9ybUxvZ2luUGFnZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUgZm91bmQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZm9ybUVycm9yUGFnZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsb2dpbkNvbmZpZyIgZVR5cGU9IiMvL0xvZ2luQ29uZmlnIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTG9naW5Db25maWcvZm9ybUxvZ2luQ29uZmlnIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkluaXRQYXJhbSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQmI3hEOyYjeEE7VGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBvZiB0aGUgc2VydmxldCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyYW1WYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJSZXNBdXRoU2VydmxldFR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNPTlRBSU5FUj0wJiN4RDsmI3hBO1NFUlZMRVQ9MSYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNPTlRBSU5FUiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU0VSVkxFVCIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2ViVHlwZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlcnZsZXRUeXBlIiBlU3VwZXJUeXBlcz0iIy8vV2ViVHlwZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKU1BUeXBlIiBlU3VwZXJUeXBlcz0iIy8vV2ViVHlwZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImpzcEZpbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVUkxQYXR0ZXJuVHlwZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJsUGF0dGVybiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNDb2xsZWN0aW9uIiBlVHlwZT0iIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL1VSTHMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJIVFRQTWV0aG9kVHlwZUVudW0iPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iR0VUIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh0dHAtbWV0aG9kIGNvbnRhaW5zIGFuIEhUVFAgbWV0aG9kIChHRVQgfCBQT1NUIHwuLi4pIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBPU1QiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQVVQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJERUxFVEUiIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJIRUFEIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1BUSU9OUyIgdmFsdWU9IjUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlRSQUNFIiB2YWx1ZT0iNiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlTmFtZVR5cGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGVOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlbGNvbWVGaWxlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlIGFzIGEgZGVmYXVsdCB3ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbCYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2VsY29tZUZpbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmlsZUxpc3QiIGVUeXBlPSIjLy9XZWxjb21lRmlsZUxpc3QiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWxjb21lRmlsZUxpc3QvZmlsZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik5PTkU9MSYjeEQ7JiN4QTtJTlRFR1JBTD0yJiN4RDsmI3hBO0NPTkZJREVOVElBTD0zIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJOT05FIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTlRFR1JBTCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNPTkZJREVOVElBTCIgdmFsdWU9IjIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhjZXB0aW9uVHlwZUVycm9yUGFnZSIgZVN1cGVyVHlwZXM9IiMvL0Vycm9yUGFnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4Y2VwdGlvblR5cGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhjZXB0aW9uIHR5cGUgY29udGFpbnMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIEphdmEgZXhjZXB0aW9uIHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVycm9yQ29kZUVycm9yUGFnZSIgZVN1cGVyVHlwZXM9IiMvL0Vycm9yUGFnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVycm9yQ29kZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNCYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmlsdGVyTWFwcGluZyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsIGFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvIGEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uIHNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoIHN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhIHNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZSBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgJmx0O2ZpbHRlcm5hbWU+IHN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlICZsdDtmaWx0ZXI+IGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiYjeEQ7JiN4QTsmI3hEOyYjeEE7QGludmFyaWFudCBUaGUgZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIEZpbHRlcjo6bmFtZSBvZiBvbmUgb2YgdGhlIEZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVybFBhdHRlcm4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIE11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMCBvZiB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzcGF0Y2hlclR5cGUiIHVwcGVyQm91bmQ9IjQiCi0gICAgICAgIGVUeXBlPSIjLy9EaXNwYXRjaGVyVHlwZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWx0ZXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9GaWx0ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmlsdGVyIGJlaW5nIG1hcHBlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2bGV0IiBlVHlwZT0iIy8vU2VydmxldCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIG9wdGlvbmFsIHNlcnZsZXQgdGhhdCBpcyBtYXBwZWQgYnkgYSBmaWx0ZXIgbWFwcGluZy4gIHNlcnZsZXROYW1lIGlzIHVzZWQgdG8gcmVzb2x2ZSB0aGUgc2VydmxldCByZWZlcmVuY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZpbHRlciIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWNsYXJlcyBhIGZpbHRlciBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0byBlaXRoZXIgYSBzZXJ2bGV0IG9yIGEgVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZSBmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlci4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gbWFwIHRoZSBmaWx0ZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRQYXJhbXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSW5pdFBhcmFtIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBpbml0UGFyYW1WYWx1ZXMmI3hEOyYjeEE7VGhlIGluaXQtcGFyYW1zIGNvbnRhaW4gYSBuYW1lL3ZhbHVlIHBhaXJzIGFzIGluaXRpYWxpemF0aW9uIHBhcmFtcyBmb3IgdGhlIGZpbHRlciYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmlsdGVyQ2xhc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbml0UGFyYW1WYWx1ZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1BhcmFtVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzJiN4RDsmI3hBOyAgICAgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkRpc3BhdGNoZXJUeXBlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkZPUldBUkQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOQ0xVREUiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSRVFVRVNUIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRVJST1IiIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibG9jYWxFbmNvZGluZ01hcHBpbmdzIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0xvY2FsRW5jb2RpbmdNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMb2NhbEVuY29kaW5nTWFwcGluZyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVuY29kaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkhUVFBNZXRob2RUeXBlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJodHRwTWV0aG9kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQXV0aE1ldGhvZEtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVU5TUEVDSUZJRUQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkJBU0lDIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRElHRVNUIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRk9STSIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNMSUVOVF9DRVJUIiB2YWx1ZT0iNCIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd2Vic2VydmljZS1qMmVlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dlYnNlcnZpY2UtajJlZS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjYzNlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd2Vic2VydmljZS1qMmVlLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZSIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIiBtb2RlbE5hbWU9IldlYnNlcnZpY2UtajJlZSIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLnJvc2UiCi0gICAgdXNlZEdlblBhY2thZ2VzPSJqMmVlLmdlbm1vZGVsIy8vY2xpZW50IGoyZWUuZ2VubW9kZWwjLy9hcHBsaWNhdGlvbiBqMmVlLmdlbm1vZGVsIy8vY29tbW9uIGoyZWUuZ2VubW9kZWwjLy9lamIgajJlZS5nZW5tb2RlbCMvL3dlYmFwcGxpY2F0aW9uIGoyZWUuZ2VubW9kZWwjLy93c2NsaWVudCBqMmVlLmdlbm1vZGVsIy8vanNwIGoyZWUuZ2VubW9kZWwjLy93c2NvbW1vbiBqMmVlLmdlbm1vZGVsIy8vd3NkZCBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhTW9kZWwuZ2VubW9kZWwjLy9qYXZhIj4KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXHdlYnNlcnZpY2UtajJlZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5XT1JLU1BBQ0VfUk9PVDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPkQ6XHdvcmtcTTU8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iSmF4cnBjbWFwIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0iamF4cnBjbWFwLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL0phdmFXU0RMTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVdTRExNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL0phdmFXU0RMTWFwcGluZy9wYWNrYWdlTWFwcGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVdTRExNYXBwaW5nL2phdmFYTUxUeXBlTWFwcGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVdTRExNYXBwaW5nL2V4Y2VwdGlvbk1hcHBpbmdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL0phdmFXU0RMTWFwcGluZy9pbnRlcmZhY2VNYXBwaW5ncyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9QYWNrYWdlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vUGFja2FnZU1hcHBpbmcvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9QYWNrYWdlTWFwcGluZy9wYWNrYWdlVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1BhY2thZ2VNYXBwaW5nL25hbWVzcGFjZVVSSSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9KYXZhWE1MVHlwZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0phdmFYTUxUeXBlTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0phdmFYTUxUeXBlTWFwcGluZy9jbGFzc1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9KYXZhWE1MVHlwZU1hcHBpbmcvcW5hbWVTY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0phdmFYTUxUeXBlTWFwcGluZy9hbm9ueW1vdXNUeXBlUW5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVhNTFR5cGVNYXBwaW5nL3Jvb3RUeXBlUW5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVhNTFR5cGVNYXBwaW5nL3ZhcmlhYmxlTWFwcGluZ3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vRXhjZXB0aW9uTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vRXhjZXB0aW9uTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0V4Y2VwdGlvbk1hcHBpbmcvZXhjZXB0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0V4Y2VwdGlvbk1hcHBpbmcvd3NkbE1lc3NhZ2VQYXJ0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9FeGNlcHRpb25NYXBwaW5nL3dzZGxNZXNzYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL0V4Y2VwdGlvbk1hcHBpbmcvY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUludGVyZmFjZU1hcHBpbmcvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy9zZXJ2aWNlSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nL3dzZGxTZXJ2aWNlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy9wb3J0TWFwcGluZ3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcvc2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcvd3NkbFBvcnRUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcvd3NkbEJpbmRpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy9zZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9Sb290VHlwZVFuYW1lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vVmFyaWFibGVNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9WYXJpYWJsZU1hcHBpbmcvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9WYXJpYWJsZU1hcHBpbmcvamF2YVZhcmlhYmxlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1ZhcmlhYmxlTWFwcGluZy94bWxFbGVtZW50TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1ZhcmlhYmxlTWFwcGluZy9kYXRhTWVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vVmFyaWFibGVNYXBwaW5nL3htbEF0dHJpYnV0ZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9WYXJpYWJsZU1hcHBpbmcveG1sV2lsZGNhcmQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETE1lc3NhZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIvZWxlbWVudE5hbWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL0VsZW1lbnROYW1lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9FbGVtZW50TmFtZS9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0VsZW1lbnROYW1lL3RleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETFNlcnZpY2VOYW1lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vUG9ydE1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1BvcnRNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vUG9ydE1hcHBpbmcvcG9ydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9Qb3J0TWFwcGluZy9qYXZhUG9ydE5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETFBvcnRUeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETEJpbmRpbmciLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy9qYXZhTWV0aG9kTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcvd3NkbE9wZXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcvd3JhcHBlZEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy9tZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy93c2RsUmV0dXJuVmFsdWVNYXBwaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL1dTRExPcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExPcGVyYXRpb24vaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMT3BlcmF0aW9uL3dzZGxPcGVyYXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcvcGFyYW1Qb3NpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nL3BhcmFtVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9NZXRob2RQYXJhbVBhcnRzTWFwcGluZy93c2RsTWVzc2FnZU1hcHBpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETFJldHVyblZhbHVlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vV1NETFJldHVyblZhbHVlTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmcvbWV0aG9kUmV0dXJuVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nL3dzZGxNZXNzYWdlUGFydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vV1NETFJldHVyblZhbHVlTWFwcGluZy93c2RsTWVzc2FnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9XU0RMTWVzc2FnZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExNZXNzYWdlTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExNZXNzYWdlTWFwcGluZy93c2RsTWVzc2FnZVBhcnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vV1NETE1lc3NhZ2VNYXBwaW5nL3BhcmFtZXRlck1vZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMTWVzc2FnZU1hcHBpbmcvc29hcEhlYWRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMTWVzc2FnZU1hcHBpbmcvd3NkbE1lc3NhZ2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETE1lc3NhZ2VQYXJ0TmFtZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vV1NETE1lc3NhZ2VQYXJ0TmFtZS9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExNZXNzYWdlUGFydE5hbWUvd3NkbE1lc3NhZ2VQYXJ0TmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9JbnRlcmZhY2VNYXBwaW5nIi8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dzY2xpZW50LmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dzY2xpZW50LmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzY3Zjg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2NsaWVudC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ3c2NsaWVudCIKLSAgICBuc1VSST0id2Vic2VydmljZV9jbGllbnQueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmljZVJlZiIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIHJlZmVyZW5jZSB0byBhIFdlYiYjeEQ7JiN4QTsgICAgc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQmI3hEOyYjeEE7ICAgIGljb25zLCBhIGRlY2xhcmF0aW9uIG9mIHRoZSByZXF1aXJlZCBTZXJ2aWNlIGludGVyZmFjZSwmI3hEOyYjeEE7ICAgIGFuIG9wdGlvbmFsIFdTREwgZG9jdW1lbnQgbG9jYXRpb24sIGFuIG9wdGlvbmFsIHNldCYjeEQ7JiN4QTsgICAgb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsJiN4RDsmI3hBOyAgICBhbiBvcHRpb25hbCBzZXQgb2YgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIGJlIHJlc29sdmVkJiN4RDsmI3hBOyAgICBieSB0aGUgY29udGFpbmVyIHRvIGEgV1NETCBwb3J0LCBhbmQgYW4gb3B0aW9uYWwgc2V0IG9mIGhhbmRsZXJzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlSW50ZXJmYWNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyYjeEQ7JiN4QTsgICAgICAgIG5hbWUgb2YgdGhlIEpBWC1SUEMgU2VydmljZSBpbnRlcmZhY2UgdGhlIGNsaWVudCBkZXBlbmRzIG9uLiYjeEQ7JiN4QTsgICAgICAgIEluIG1vc3QgY2FzZXMgdGhlIHZhbHVlIHdpbGwgYmUgamF2YXgueG1sLnJwYy5TZXJ2aWNlLiAgQSBKQVgtUlBDJiN4RDsmI3hBOyAgICAgICAgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIGNsYXNzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VydmljZVJlZk5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1yZWYtbmFtZSBlbGVtZW50IGRlY2xhcmVzIGxvZ2ljYWwgbmFtZSB0aGF0IHRoZSYjeEQ7JiN4QTsgICAgICAgIGNvbXBvbmVudHMgaW4gdGhlIG1vZHVsZSB1c2UgdG8gbG9vayB1cCB0aGUgV2ViIHNlcnZpY2UuIEl0JiN4RDsmI3hBOyAgICAgICAgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc2VydmljZSByZWZlcmVuY2UgbmFtZXMgc3RhcnQgd2l0aCYjeEQ7JiN4QTsgICAgICAgICZxdW90O3NlcnZpY2UvJnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIFVSSSBsb2NhdGlvbiBvZiBhIFdTREwgZmlsZS4gVGhlJiN4RDsmI3hBOyAgICAgICAgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF4cnBjTWFwcGluZ0ZpbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0JiN4RDsmI3hBOyAgICAgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieSYjeEQ7JiN4QTsgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIFdTREwgZGVzY3JpcHRpb24gaW4gdGhlIHdzZGwtZmlsZS4gIFRoZSYjeEQ7JiN4QTsgICAgICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUgZmlsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9ydENvbXBvbmVudFJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUG9ydENvbXBvbmVudFJlZiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeSYjeEQ7JiN4QTsgICAgICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlJiN4RDsmI3hBOyAgICAgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludCYjeEQ7JiN4QTsgICAgICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQmI3hEOyYjeEE7ICAgICAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhhbmRsZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0hhbmRsZXIiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iIERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZSYjeEQ7JiN4QTsgICAgICAgIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZiYjeEQ7JiN4QTsgICAgICAgIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQmI3hEOyYjeEE7ICAgICAgICB3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmljZVFuYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1FOYW1lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0Q29tcG9uZW50UmVmIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5JiN4RDsmI3hBOyAgICBvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSYjeEQ7JiN4QTsgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludCYjeEQ7JiN4QTsgICAgSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZCYjeEQ7JiN4QTsgICAgYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3J0Q29tcG9uZW50TGluayIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3J0LWNvbXBvbmVudC1saW5rIGVsZW1lbnQgbGlua3MgYSBwb3J0LWNvbXBvbmVudC1yZWYgdG8gYSYjeEQ7JiN4QTsgICAgICAgIHNwZWNpZmljIHBvcnQtY29tcG9uZW50IHJlcXVpcmVkIHRvIGJlIG1hZGUgYXZhaWxhYmxlIGJ5IGEgc2VydmljZSYjeEQ7JiN4QTsgICAgICAgIHJlZmVyZW5jZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgVGhlIHZhbHVlIG9mIGEgcG9ydC1jb21wb25lbnQtbGluayBtdXN0IGJlIHRoZSBwb3J0LWNvbXBvbmVudC1uYW1lJiN4RDsmI3hBOyAgICAgICAgb2YgYSBwb3J0LWNvbXBvbmVudCBpbiB0aGUgc2FtZSBtb2R1bGUgb3IgYW5vdGhlciBtb2R1bGUgaW4gdGhlIHNhbWUmI3hEOyYjeEE7ICAgICAgICBhcHBsaWNhdGlvbiB1bml0LiBUaGUgc3ludGF4IGZvciBzcGVjaWZpY2F0aW9uIGZvbGxvd3MgdGhlIHN5bnRheCYjeEQ7JiN4QTsgICAgICAgIGRlZmluZWQgZm9yIGVqYi1saW5rIGluIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQmI3hEOyYjeEE7ICAgICAgICBKYXZhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2Ugb2YgYSYjeEQ7JiN4QTsgICAgICAgIFdTREwgcG9ydC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSGFuZGxlciIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUmI3hEOyYjeEE7ICAgIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZiYjeEQ7JiN4QTsgICAgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZCYjeEQ7JiN4QTsgICAgd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgVXNlZCBpbjogc2VydmljZS1yZWYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFuZGxlck5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIG1vZHVsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcFJvbGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvcnROYW1lcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9ydC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgV1NETCBwb3J0LW5hbWUgdGhhdCBhIGhhbmRsZXIgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGFuZGxlckNsYXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGFuZGxlciBpbXBsZW1lbnRhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdFBhcmFtcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vUGFyYW1WYWx1ZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic29hcEhlYWRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1FOYW1lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWJTZXJ2aWNlc0NsaWVudCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tcG9uZW50U2NvcGVkUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Db21wb25lbnRTY29wZWRSZWZzIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TZXJ2aWNlUmVmIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb25lbnRTY29wZWRSZWZzIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21wb25lbnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VSZWZzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlcnZpY2VSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2NvbW1vbi5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2NvbW1vbi5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlMTc0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd3Njb21tb24uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ3c2NvbW1vbiIKLSAgICBuc1VSST0id3Njb21tb24ueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbiI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5pdFBhcmFtIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyYW1WYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvblR5cGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uVHlwZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU09BUEhlYWRlciIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL1FOYW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBRTmFtZSBvZiBhIFNPQVAgaGVhZGVyIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhlIGhhbmRsZXIuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQUm9sZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdCB0aGUgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcFJvbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9ydE5hbWUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0aW9uVHlwZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzcGxheU5hbWVUeXBlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vRGlzcGxheU5hbWUiLz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd3NkZC5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2RkLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDQwMGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2RkLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9IndzZGQiCi0gICAgbnNVUkk9IndzZGQueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWJTZXJ2aWNlcyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIFdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKMkVFIEFwcGxpY2F0aW9uIFNlcnZlciBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQgc2VydmljZXMuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2ViU2VydmljZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgZG9jdW1lbnQgZmlsZSBhbmQgdGhlIHNldCBvZiBQb3J0IGNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBXU0RMIHBvcnRzIGRlZmluZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuICBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBtb2R1bGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtBbGwgV1NETCBmaWxlIHBvcnRzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcG9ydC1jb21wb25lbnQgZWxlbWVudCBkZWZpbmVkLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogd2Vic2VydmljZXMmI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImpheHJwY01hcHBpbmdGaWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGpheHJwYy1tYXBwaW5nLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdCBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIFdTREwgZGVzY3JpcHRpb24gaW4gdGhlIHdzZGwtZmlsZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSBpZGVudGlmaWVzIHRoZSBjb2xsZWN0aW9uIG9mIHBvcnQtY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggYSBXU0RMIGZpbGUgYW5kIEpBWC1SUEMgbWFwcGluZy4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxGaWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdzZGwtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgV1NETCBmaWxlIGluIHRoZSBtb2R1bGUuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic21hbGxJY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhcmdlSWNvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNwbGF5TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3J0Q29tcG9uZW50cyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb3J0Q29tcG9uZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvblR5cGUiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3Njb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvblR5cGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc3BsYXlOYW1lVHlwZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2NvbW1vbi5lY29yZSMvL0Rpc3BsYXlOYW1lVHlwZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaWNvblR5cGUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vSWNvblR5cGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvcnRDb21wb25lbnQiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvcnQtY29tcG9uZW50IGVsZW1lbnQgYXNzb2NpYXRlcyBhIFdTREwgcG9ydCB3aXRoIGEgV2ViIHNlcnZpY2UgaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbi4gIEl0IGRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIHBvcnQgYXMgYSBjb21wb25lbnQsIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBvcHRpb25hbCBkaXNwbGF5IG5hbWUsIG9wdGlvbmFsIGljb25pYyByZXByZXNlbnRhdGlvbnMsIFdTREwgcG9ydCBRTmFtZSwgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UsIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbi4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvcnRDb21wb25lbnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0IGNvbXBvbmVudCdzIG5hbWUuIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUgbW9kdWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VydmljZUVuZHBvaW50SW50ZXJmYWNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBwb3J0IGNvbXBvbmVudCdzIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic21hbGxJY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhcmdlSWNvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNwbGF5TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3c2RsUG9ydCIgZVR5cGU9IiMvL1dTRExQb3J0IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlSW1wbEJlYW4iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZXJ2aWNlSW1wbEJlYW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhhbmRsZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0hhbmRsZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9uVHlwZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2NvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlzcGxheU5hbWVUeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzY29tbW9uLmVjb3JlIy8vRGlzcGxheU5hbWVUeXBlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpY29uVHlwZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9JY29uVHlwZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id3NkbFNlcnZpY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMU2VydmljZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5hYmxlTXRvbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvdG9jb2xCaW5kaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhhbmRsZXJDaGFpbnMiIGVUeXBlPSIjLy9IYW5kbGVyc0NoYWlucyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETFBvcnQiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9RTmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgbmFtZSBzcGFjZSBhbmQgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBXU0RMIHBvcnQgUU5hbWUuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2aWNlSW1wbEJlYW4iIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgZGVmaW5lcyB0aGUgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uQSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNhbiBiZSBhbiBFSkIgYmVhbiBjbGFzcyBvciBKQVgtUlBDIHdlYiBjb21wb25lbnQuIEV4aXN0aW5nIEVKQiBpbXBsZW1lbnRhdGlvbnMgYXJlIGV4cG9zZWQgYXMgYSBXZWIgc2VydmljZSB1c2luZyBhbiBlamItbGluay4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHBvcnQtY29tcG9uZW50JiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlRUpCTGluayIgZVR5cGU9IiMvL0VKQkxpbmsiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVTZXJ2bGV0TGluayIgZVR5cGU9IiMvL1NlcnZsZXRMaW5rIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiZWFuTGluayIgZVR5cGU9IiMvL0JlYW5MaW5rIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2bGV0TGluayIgZVN1cGVyVHlwZXM9IiMvL0JlYW5MaW5rIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmxldC1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludC4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSB2YWx1ZSBvZiB0aGUgc2VydmxldC1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgc2VydmxldC1uYW1lIG9mIGEgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50IGluIHRoZSBzYW1lIFdBUiBmaWxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1pbXBsLWJlYW4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcnZsZXRMaW5rIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVKQkxpbmsiIGVTdXBlclR5cGVzPSIjLy9CZWFuTGluayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhIFdlYiBTZXJ2aWNlIEVuZHBvaW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZXM6JiN4RDsmI3hBOyZsdDtlamItbGluaz5FbXBsb3llZVJlY29yZCZsdDsvZWpiLWxpbms+JiN4RDsmI3hBOyYjeDk7Jmx0O2VqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkImbHQ7L2VqYi1saW5rPiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWpiTGluayIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJIYW5kbGVyIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHBvcnQtY29tcG9uZW50JiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYW5kbGVyTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYW5kbGVyQ2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdFBhcmFtcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3Njb21tb24uZWNvcmUjLy9Jbml0UGFyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvYXBIZWFkZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2NvbW1vbi5lY29yZSMvL1NPQVBIZWFkZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvYXBSb2xlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3Njb21tb24uZWNvcmUjLy9TT0FQUm9sZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmVhbkxpbmsiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTRExTZXJ2aWNlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vUU5hbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIG5hbWUgc3BhY2UgYW5kIGxvY2FsIG5hbWUgcGFydCBvZiB0aGUgV1NETCBwb3J0IFFOYW1lLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSGFuZGxlckNoYWluIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHBvcnQtY29tcG9uZW50JiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXJ2aWNlTmFtZVBhdHRlcm4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9ydE5hbWVQYXR0ZXJuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb3RvY29sQmluZGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhhbmRsZXJzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0hhbmRsZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkhhbmRsZXJzQ2hhaW5zIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSjJFRUVPYmplY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGEgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuIGlzIGRlZmluZWQgYXMgYSBXZWIgU2VydmljZSBFbmRwb2ludC4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1pbXBsLWJlYW4mI3hEOyYjeEE7JiN4RDsmI3hBO0V4YW1wbGVzOiYjeEQ7JiN4QTsmbHQ7ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQmbHQ7L2VqYi1saW5rPiYjeEQ7JiN4QTsmI3g5OyZsdDtlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCJmx0Oy9lamItbGluaz4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhhbmRsZXJDaGFpbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9IYW5kbGVyQ2hhaW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL2VqYi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvZWpiLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MjJjYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvZWpiLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUVqYl9wcm92aWRlcl9wbHVnaW5fcHJvYj1FamIgcHJvdmlkZXIgcGx1Z2luIHN0YXJ0dXAgLSBQcm9ibGVtIGluaXRpYWxpemluZyBwbHVnaW4KLUVqYmV4dF9wcm92aWRlcl9wbHVnaW5fcHJvYj1FamJleHQgcHJvdmlkZXIgcGx1Z2luIHN0YXJ0dXAgLSBQcm9ibGVtIGluaXRpYWxpemluZyBwbHVnaW4KLUVKQl9VSV9TVEFSVFVQPUVKQiBVSSBTVEFSVFVQCi1FSkJfUGF0aF9fPUVKQiBQYXRoOgotU2l6ZV9fPVNpemU6Ci1FZGl0X3RoZV9iZWFuX2NsYXNzPUVkaXQgdGhlIGJlYW4gY2xhc3MKLUVKQl9UcmVlPUVKQiBUcmVlCi1FSkJfSmFyX0NvbXBvbmVudHM9RUpCIEpBUiBDb21wb25lbnRzCi1FSkJfTW9kZWxzPUVKQiBNb2RlbHMKLUVKQl9GZWF0dXJlcz1FSkIgRmVhdHVyZXMKLUV4Y2VwdGlvbl9sb2FkaW5nX3BsdWdpbj1FeGNlcHRpb24gbG9hZGluZyBwbHVnaW4KLUNyZWF0ZT1DcmVhdGUKLUNyZWF0ZV9BdHRyaWJ1dGUuLi49Q3JlYXRlIEF0dHJpYnV0ZS4uLgotY3JlYXRlQXR0cmlidXRlPWNyZWF0ZUF0dHJpYnV0ZQotRWRpdD1FZGl0Ci1BZGRfVG9fS2V5PUFkZCBUbyBLZXkKLWRlbGV0ZT1kZWxldGUKLVVua25vd249VW5rbm93bgotUmVtb3ZlX0Zyb21fS2V5PVJlbW92ZSBGcm9tIEtleQotRGVsZXRlPURlbGV0ZQotRGVsZXRlX0F0dHJpYnV0ZS4uLj1EZWxldGUgQXR0cmlidXRlLi4uCi1hZGRpdGlvbnM9YWRkaXRpb25zCi1DTURTX0Nhbm5vdF9yZWZsZWN0X0phdmFDbGFzc19FUlJPUl89SVdBRTAwNjhFIENhbm5vdCByZWZsZWN0IEphdmFDbGFzcyBiZWNhdXNlIGl0cyBuYW1lIGlzIG5vdCBzZXQgZm9yCi1DTURTX0NMQVNTX1NFVF9GQUlMRURfU1RSSU5HX0VSUk9SXz1JV0FFMDA2OUUgVGhlIEphdmEgdHlwZSBuYW1lZCB7MH0gY291bGQgbm90IGJlIHNldCBmb3IgdGhlIHsxfSBiZWNhdXNlIGl0cyBFSkIgaXMgbnVsbC4KLUNNRFNfQ2Fubm90X3BlcmZvcm1fSU5GT189SVdBRTAwNzBJIENhbm5vdCBwZXJmb3JtIHRoZSBjb21tYW5kIHJlcXVlc3QgYmVjYXVzZSB0aGUgRUpCIGlzIG51bGwgZm9yIHRoZSBjb21tYW5kOgotQ01EU19DYW5ub3RfYWRkX3RoZV9mZWF0X0lORk9fPUlXQUUwMDcxSSBDYW5ub3QgYWRkIHRoZSBmZWF0dXJlIHRvIHRoZSBrZXkgYmVjYXVzZSB0aGUgZmVhdHVyZSBpcyBudWxsIGZvciB0aGUgY29tbWFuZDoKLUNNRFNfQ2Fubm90X3JlbW92ZV90aGVfSU5GT189SVdBRTAwNzJJIENhbm5vdCByZW1vdmUgdGhlIGZlYXR1cmUgZnJvbSB0aGUga2V5IGJlY2F1c2UgdGhlIGZlYXR1cmUgaXMgbnVsbCBmb3IgdGhlIGNvbW1hbmQ6Ci1DTURTX0luaXRpYWxpemluZ19VSV89SW5pdGlhbGl6aW5nLi4uCi1DTURTX0dlbmVyYXRpbmdfVUlfPUdlbmVyYXRpbmcuLi4KLUNNRFNfRmluaXNoaW5nX1VJXz1GaW5pc2hpbmcuLi4KLUNNRFNfQW5hbHl6aW5nX1VJXz1BbmFseXppbmcuLi4KLUNNRFNfQ2FuY2VsbGVkX1dBUk5JTkdfPUNhbmNlbGxlZAotQ01EU19NdWx0aXBsZV9FbnRlcnByaXNlQmVhbl9VcF9JTkZPXz1JV0FFMDA3M0kgTXVsdGlwbGUgRW50ZXJwcmlzZUJlYW4gVXBkYXRlcwotQ01EU19DUkVBVElOR19UQVNLX1VJXz1DcmVhdGluZyBiZWFuIG5hbWVkICJ7MH0iCi1DTURTX1VQREFUSU5HX1RBU0tfVUlfPVVwZGF0aW5nIGJlYW4gbmFtZWQgInswfSIKLUNNRFNfREVMRVRJTkdfVEFTS19VSV89RGVsZXRpbmcgYmVhbiBuYW1lZCAiezB9IgotQ01EU19VcGRhdGluZ19NZXRhZGF0YS4uLl9VSV89LS0gVXBkYXRpbmcgTWV0YWRhdGEuLi4KLVVwZGF0aW5nPVVwZGF0aW5nCi1OZXdfa2V5X2F0dHJpYnV0ZV9hZGRlZF93aT1OZXcga2V5IGF0dHJpYnV0ZSBhZGRlZCB3aXRob3V0IGF0dHJpYnV0ZSBoZWxwZXIuCi1FcnJvcl9oYXNfb2NjdXJyZWQ9RXJyb3IgaGFzIG9jY3VycmVkCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL2oyZWVwbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL2oyZWVwbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzMTk0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9qMmVlcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Db3VsZF9ub3RfZmluZF9yb290X29iamVjdF9FUlJPUl89SVdBRTAwNzRFIENvdWxkIG5vdCBmaW5kIHJvb3Qgb2JqZWN0IGluIHJlc291cmNlOiB7MH0KLUFuX2Vycm9yX29jY3VycmVkX3doaWxlX3NhX0VSUk9SXz1JV0FFMDA3NUUgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2F2aW5nLgotQ2Fubm90X3J1bl9KMkVFVUlXb3JraW5nQ29fRVJST1JfPUlXQUUwMDc2RSBDYW5ub3QgcnVuIEoyRUVVSVdvcmtpbmdDb3B5TWFuYWdlciBvcGVyYXRpb24gYmVjYXVzZSB0aGUgV29ya3NwYWNlIHRyZWUgaXMgbG9ja2VkLgotVW5hYmxlX3RvX3NhdmVfcmVhZC1vbmx5X2ZfRVJST1JfPUlXQUUwMDc3RSBVbmFibGUgdG8gc2F2ZSByZWFkLW9ubHkgZmlsZTogezB9Ci1UaGVfZm9sbG93aW5nX3Jlc291cmNlc19uZV9VSV89VGhlIGZvbGxvd2luZyByZXNvdXJjZXMgbmVlZCB0byBiZSBzYXZlZCBidXQgYXJlIGN1cnJlbnRseSBzaGFyZWQsIGRvIHlvdSB3YW50IHRvIHNhdmUgbm93PwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9qMmVleG1sLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9qMmVleG1sLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OWE3YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvajJlZXhtbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1yYXJfZHRkX25vdF9mb3VuZF9FWENfPUlXQUUwMDc4RSBSQVIgZmlsZSBzdXBwb3J0OiBEVEQgZmlsZSBub3QgZm91bmQ6IHswfQotaW9fZXhfc2F2aW5nX0VYQ189SVdBRTAwNzlFIElPRXhjZXB0aW9uIG9jY3VycmVkIHNhdmluZyB7MH0KLWNvdWxkX25vdF9jcmVhdGVfZmlsZV9FWENfPUlXQUUwMDgwRSBDb3VsZCBub3QgY3JlYXRlIHRoZSBmaWxlIG5hbWVkIHswfQotdW5zdXBwb3J0ZWRfZW5jb2RpbmdfRVhDXz1JV0FFMDA4MUUgezB9IGlzIG5vdCBhIHN1cHBvcnRlZCBlbmNvZGluZyBvbiB0aGlzIHBsYXRmb3JtCi11bnN1cHBvcnRlZF90eXBlX0VYQ189SVdBRTAwODJFIFR5cGUgaXMgdW5yZWNvZ25pemVkIG9yIG5vdCB5ZXQgc3VwcG9ydGVkOiBQVUJMSUNfSUQ9ezB9IFNZU1RFTV9JRD17MX0KLWR0ZF9ub3RfZm91bmRfRVhDXz1JV0FFMDA4M0UgQ291bGQgbm90IHBhcnNlIHhtbCBiZWNhdXNlIHRoZSByZXNvbHZlZCByZXNvdXJjZSAiezB9IiBjb3VsZCBub3QgYmUgZm91bmQgaW4gY2xhc3NwYXRoCi1tdXN0X2JlX2Jvb2xlYW5fRVhDXz1JV0FFMDA4NEUgRXhjZXB0aW9uIG9jY3VycmVkIHJlYWRpbmcgezB9LiAgVmFsdWUgbXVzdCBiZSBhIGJvb2xlYW46IFN0cmluZyB2YWx1ZSA9IHsxfQotbXVzdF9iZV9pbnRfRVhDXz1JV0FFMDA4NUUgRXhjZXB0aW9uIG9jY3VycmVkIHJlYWRpbmcgezB9LiAgVmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyOiBTdHJpbmcgdmFsdWUgPSB7MX0KLWVtcHR5X2NvbGxlY3Rpb25fRVhDXz1JV0FFMDA4NkUgRW1wdHkgY29sbGVjdGlvbiBmb3IgezB9IGluIHsxfQotbWlzc2luZ19yZXFfZmllbGRfRVhDXz1JV0FFMDA4N0UgTWlzc2luZyByZXF1aXJlZCBmaWVsZCB7MH0gaW4gezF9Ci1Bbl9FeGNlcHRpb25fb2NjdXJyZWRfd2hpbF9FWENfPUlXQUUwMDg4RSBBbiBFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgd3JpdGluZyB4bWwKLU5vdF9zdXBwb3J0ZWRfaW5fdGhpc19yZWxlX0VYQ189SVdBRTAwODlFIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyByZWxlYXNlCi1SQVJfZmlsZV9zdXBwb3J0X19JT19leGNlcF9FWENfPUlXQUUwMDkwRSBSQVIgZmlsZSBzdXBwb3J0OiBJTyBleGNlcHRpb24gaW4gY3VzdG9tIERURCByZXNvbHZlci4KLUFuX0lPX0V4Y2VwdGlvbl9vY2N1cnJlZF93X0VYQ189SVdBRTAwOTFFIEFuIElPIEV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHhtbAotRmFpbHVyZV9vY2N1cnJlZF9yZWFkaW5nX3hfRVhDXz1JV0FFMDA5MkUgRmFpbHVyZSBvY2N1cnJlZCByZWFkaW5nIHhtbDoKLUludmFsaWRfdmFsdWVfZm9yX19FWENfPUlXQUUwMDkzRSBJbnZhbGlkIHZhbHVlIGZvcgotVmFsaWRfdmFsdWVzX2FyZV9fX0VYQ189SVdBRTAwOTRFIFZhbGlkIHZhbHVlcyBhcmU6Ci1LZXkxPQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9tb2ZqMmVlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9tb2ZqMmVlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjk0MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvbW9majJlZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1TdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZT1TdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOgotRVJST1I9RXJyb3I6Ci1XQVJOSU5HPVdhcm5pbmc6Ci1JTkZPPUluZm86Ci1ERUZBVUxUX0NPTVBMRVRFRF9TVEFUVVNfTVNHPU1pZ3JhdGlvbiB3YXMgY29tcGxldGVkIGZvciB7MH0uCi1ERUZBVUxUX05PVF9ORUVERURfU1RBVFVTX01TRz1NaWdyYXRpb24gd2FzIG5vdCByZXF1aXJlZCBmb3IgezB9LgotREVGQVVMVF9OT1RfUE9TU0lCTEVfU1RBVFVTX01TRz1NaWdyYXRpb24gd2FzIG5vdCBwb3NzaWJsZSBmb3IgezB9LgotREVGQVVMVF9FUlJPUl9TVEFUVVNfTVNHPUlXQUUwMTAwRSBFcnJvciBtaWdyYXRpbmcgezB9LgotUkVNT1ZFRF9MT0NBTF9DTElFTlRfTVNHPVJlbW92ZWQgbG9jYWwgY2xpZW50IHZpZXcgZm9yIEVKQiB7MH0uCi1SRU1PVkVEX0FDQ0VTU19JTlRFTlRTX01TRz1SZW1vdmVkIHswfSAxLjEgbWV0aG9kIGFjY2VzcyBpbnRlbnQocykgZnJvbSBDTVAgYmVhbiB7MX0uCi1SRU1PVkVEX0lTT0xBVElPTl9MRVZFTFNfTVNHPVJlbW92ZWQgezB9IDEuMSBtZXRob2QgaXNvbGF0aW9uIGxldmVsKHMpIGZyb20gQ01QIGJlYW4gezF9LgotQ09OVkVSVEVEX0ZJTkRFUl9NU0c9Q29udmVydGVkIGZpbmRlciBkZXNjcmlwdGVyIGZvciB7MH0gaW4gQ01QIGJlYW4gezF9LiAgVXNlIHRoZSBFSkIgZWRpdG9yIHRvIHVwZGF0ZSB0aGUgcXVlcnkgRUpCIFFMLgotVU5OQU1FRF9FSkI9PFVubmFtZWQgQ01QIGJlYW4+Ci1DT05WRVJURURfUVVFUllfREVTQ1JJUFRJT049Q29udmVydGVkIGZyb20gSUJNIHZlcnNpb24gMS4xIGV4dGVuc2lvbnMuCi1NSUdSQVRFRF9ERUZBVUxUX0RBVEFTT1VSQ0VfSkFSX01TRz1NaWdyYXRlZCBkZWZhdWx0IERhdGFzb3VyY2UgYmluZGluZyB0byBhIGRlZmF1bHQgQ01QIENvbm5lY3Rpb24gRmFjdG9yeSBiaW5kaW5nIGZvciBFSkIgSkFSIFwiezB9XCIuCi1NSUdSQVRFRF9ERUZBVUxUX0RBVEFTT1VSQ0VfTVNHPU1pZ3JhdGVkIGRlZmF1bHQgRGF0YXNvdXJjZSBiaW5kaW5nIHRvIGEgZGVmYXVsdCBDTVAgQ29ubmVjdGlvbiBGYWN0b3J5IGJpbmRpbmcgZm9yIEVKQiBKQVIuCi1KMkVFX1ZFUlNJT05fTlVMTF9FUlJPUj1VbmFibGUgdG8gZ2V0IEphdmEgRUUgdmVyc2lvbiBvZiBvYmplY3QgYmVjYXVzZSBpdCBpcyBub3QgY29udGFpbmVkIGJ5IGEgZG9jdW1lbnQuCi1KMkVFX1ZFUlNJT05fUFJPWFlfRVJST1I9VW5hYmxlIHRvIGdldCBKYXZhIEVFIHZlcnNpb24gb2YgcmVmZXJlbmNlZCBvYmplY3QgYmVjYXVzZSB0aGUgcHJveHkgY2Fubm90IGJlIHJlc29sdmVkLiAgQ2hlY2sgdGhlIGlkcyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGVzLiAgSFJFRiA9IHswfS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjMyNzNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci0KLS8qKgotICogVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIEoyRUUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgewotCi0KLS8qKgotICogQHBhcmFtIG5hbWUgLSBTdHJpbmcgcm9sZSBuYW1lCi0gKiBAcmV0dXJuIGlmIGNvbnRhaW5zIHRoZSByb2xlCi0gKi8KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU2VjdXJpdHlSb2xlKFN0cmluZyBuYW1lKTsKLS8qKgotICogUmV0dXJucyB0aGUgZmlyc3QgbW9kdWxlIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgdXJpIGFuZCBhbHRERAotICogQHBhcmFtIHVyaSAtIFN0cmluZyBhVVJJCi0gKiBAcGFyYW0gYWx0REQgLSBTdHJpbmcgYWx0REQKLSAqIEByZXR1cm4gdGhlIGZpcnN0IG1vZHVsZSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHVyaSBhbmQgYWx0REQKLSAqLwotcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIHVyaSwgU3RyaW5nIGFsdEREKTsKLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBmaXJzdCBtb2R1bGUgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCB1cmkKLSAqIEBkZXByZWNhdGVkIHByZWZlcmFibHkgdXNlIHtAbGluayAjZ2V0TW9kdWxlKFN0cmluZywgU3RyaW5nKX0gb3Ige0BsaW5rICNnZXRGaXJzdE1vZHVsZShTdHJpbmcpfQotICogVGhlcmUgbWF5IGJlIG11bHRpcGxlIG1vZHVsZXMgd2l0aCB0aGUgc2FtZSB1cmkgYnV0IGRpZmZlcmVudCBhbHQtZGRzCi0gKgotICogQHBhcmFtIHVyaSAtIFN0cmluZyB1cmkKLSAqIEByZXR1cm4gdGhlIGZpcnN0IG1vZHVsZSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHVyaQotICovCi1wdWJsaWMgTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgdXJpKTsKLS8qKgotICpUaGlzIHJldHVybnMgdGhlIGoyZWUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBqMmVlIGxldmVsCi0gKgotICogQHJldHVybiByZXR1cm5zIHRoZSBqMmVlIHZlcnNpb24gaWQKLSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0gV2hlbiByZXNvdXJjZSBpcyBwcm94eQotICovCi0KLXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotLyoqCi0gKiBUaGlzIHJldHVybnMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkLiAgQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqCi0gKiBAcmV0dXJuIHJldHVybnMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0gKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAtIFdoZW4gcmVzb3VyY2UgaXMgcHJveHkKLSAqLwotcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIDsKLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBmaXJzdCBtb2R1bGUgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCB1cmkKLSAqCi0gKiBAcGFyYW0gdXJpIC0gU3RyaW5nIHVyaSBwYXRoCi0gKiBAcmV0dXJuIHRoZSBmaXJzdCBtb2R1bGUgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCB1cmkKLSAqLwotcHVibGljIE1vZHVsZSBnZXRGaXJzdE1vZHVsZShTdHJpbmcgdXJpKTsKLS8qKgotICogUmV0dXJucyB0aGUgZmlyc3QgbW9kdWxlIHdoZXJlIHRoZSBhbHQgZGQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHVyaQotICoKLSAqIEBwYXJhbSB1cmkgLSBTdHJpbmcgdXJpIHBhdGgKLSAqIEByZXR1cm4gdGhlIGZpcnN0IG1vZHVsZSB3aGVyZSB0aGUgYWx0IGRkIG1hdGNoZXMgdGhlIHNwZWNpZmllZCB1cmkKLSAqLwotcHVibGljIE1vZHVsZSBnZXRNb2R1bGVIYXZpbmdBbHRERChTdHJpbmcgdXJpKTsKLS8qKgotICogQHBhcmFtIG5hbWUgLSBTdHJpbmcgcm9sZSBuYW1lCi0gKiBAcmV0dXJuIHNlY3VyaXR5IHJvbGUgd2l0aCBuYW1lCi0gKi8KLXB1YmxpYyBTZWN1cml0eVJvbGUgZ2V0U2VjdXJpdHlSb2xlTmFtZWQoU3RyaW5nIG5hbWUpOwotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgQXBwbGljYXRpb24gd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEFwcGxjYXRpb24xLjIgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfMkRlc2NyaXB0b3IoKTsKLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIEFwcGxpY2F0aW9uIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBBcHBsaWNhdGlvbjEuMyBjb21wbGlhbnQgZGVzY3JpcHRvcgotICogQHJldHVybiBib29sZWFuCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICoKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8zRGVzY3JpcHRvcigpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNCAKLQkgKiBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuNC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgU2VjdXJpdHlSb2xlcyByZWZlcmVuY2VzCi0JICogQ29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHNlY3VyaXR5IHJvbGVzIHdoaWNoIGFyZQotCSAqIGdsb2JhbCB0byB0aGUgYXBwbGljYXRpb24uIAotCSAqLwotCi0JRUxpc3QgZ2V0U2VjdXJpdHlSb2xlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBNb2R1bGVzIHJlZmVyZW5jZXMKLQkgKi8KLQotCUVMaXN0IGdldE1vZHVsZXMoKTsKLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0ZjhhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2F0aW9uRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBcHBsaWNhdGlvbiB2YWx1ZQotCSAqLwotCUFwcGxpY2F0aW9uIGNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1vZHVsZSB2YWx1ZQotCSAqLwotCU1vZHVsZSBjcmVhdGVNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2ViTW9kdWxlIHZhbHVlCi0JICovCi0JV2ViTW9kdWxlIGNyZWF0ZVdlYk1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhQ2xpZW50TW9kdWxlIHZhbHVlCi0JICovCi0JSmF2YUNsaWVudE1vZHVsZSBjcmVhdGVKYXZhQ2xpZW50TW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVqYk1vZHVsZSB2YWx1ZQotCSAqLwotCUVqYk1vZHVsZSBjcmVhdGVFamJNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29ubmVjdG9yTW9kdWxlIHZhbHVlCi0JICovCi0JQ29ubmVjdG9yTW9kdWxlIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBtZXRob2QgaXMgTk9UIGFwaSwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLiAgCi0JICogRU1GIHBhY2thZ2UgY2xhc3NlcyBzaG91bGQgYmUgYWNjZXNzIHZpYSB0aGVpciAiZUlOU1RBTkNFIiBzdGF0aWMgZmllbGRzCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvblBhY2thZ2UgZ2V0QXBwbGljYXRpb25QYWNrYWdlKCk7Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YTY5YTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKglAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImFwcGxpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19JQ09OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9fVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19NT0RVTEVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX19VUkkgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX19BTFRfREQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX19BUFBMSUNBVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1vZHVsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9NT0RVTEUgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfTU9EVUxFX19VUkkgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9NT0RVTEVfX0FMVF9ERCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX01PRFVMRV9fQVBQTElDQVRJT04gPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfTU9EVUxFX19DT05URVhUX1JPT1QgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XZWIgTW9kdWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9NT0RVTEVfRkVBVFVSRV9DT1VOVCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTElFTlRfTU9EVUxFID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTElFTlRfTU9EVUxFX19VUkkgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xJRU5UX01PRFVMRV9fQUxUX0REID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQUxUX0REOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMSUVOVF9NT0RVTEVfX0FQUExJQ0FUSU9OID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SmF2YSBDbGllbnQgTW9kdWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xJRU5UX01PRFVMRV9GRUFUVVJFX0NPVU5UID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTU9EVUxFID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX01PRFVMRV9fVVJJID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTU9EVUxFX19BTFRfREQgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BTFRfREQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9NT0RVTEVfX0FQUExJQ0FUSU9OID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWpiIE1vZHVsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTU9EVUxFX0ZFQVRVUkVfQ09VTlQgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFID0gNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX01PRFVMRV9fVVJJID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFX19BTFRfREQgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BTFRfREQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEVfX0FQUExJQ0FUSU9OID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT047Ci0KLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25uZWN0b3IgTW9kdWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEVfRkVBVFVSRV9DT1VOVCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImFwcGxpY2F0aW9uLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb25QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNb2R1bGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNb2R1bGVfVXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1vZHVsZV9BbHRERCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNb2R1bGVfQXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2ViTW9kdWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRXZWJNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViTW9kdWxlX0NvbnRleHRSb290KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFDbGllbnRNb2R1bGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEphdmFDbGllbnRNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRWpiTW9kdWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFamJNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29ubmVjdG9yTW9kdWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb25uZWN0b3JNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEFwcGxpY2F0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFQUExJQ0FUSU9OID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9TZWN1cml0eVJvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9fTU9EVUxFUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwgPGVtPk1vZHVsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRNb2R1bGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTU9EVUxFID0gZUlOU1RBTkNFLmdldE1vZHVsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTU9EVUxFX19VUkkgPSBlSU5TVEFOQ0UuZ2V0TW9kdWxlX1VyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWx0IEREPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTU9EVUxFX19BTFRfREQgPSBlSU5TVEFOQ0UuZ2V0TW9kdWxlX0FsdEREKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNT0RVTEVfX0FQUExJQ0FUSU9OID0gZUlOU1RBTkNFLmdldE1vZHVsZV9BcHBsaWNhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJNb2R1bGVJbXBsIDxlbT5XZWIgTW9kdWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJNb2R1bGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFdlYk1vZHVsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXRUJfTU9EVUxFID0gZUlOU1RBTkNFLmdldFdlYk1vZHVsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGV4dCBSb290PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX01PRFVMRV9fQ09OVEVYVF9ST09UID0gZUlOU1RBTkNFLmdldFdlYk1vZHVsZV9Db250ZXh0Um9vdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5KYXZhQ2xpZW50TW9kdWxlSW1wbCA8ZW0+SmF2YSBDbGllbnQgTW9kdWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5KYXZhQ2xpZW50TW9kdWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRKYXZhQ2xpZW50TW9kdWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpBVkFfQ0xJRU5UX01PRFVMRSA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xpZW50TW9kdWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkVqYk1vZHVsZUltcGwgPGVtPkVqYiBNb2R1bGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkVqYk1vZHVsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0RWpiTW9kdWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVKQl9NT0RVTEUgPSBlSU5TVEFOQ0UuZ2V0RWpiTW9kdWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rvck1vZHVsZUltcGwgPGVtPkNvbm5lY3RvciBNb2R1bGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rvck1vZHVsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0Q29ubmVjdG9yTW9kdWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTk5FQ1RPUl9NT0RVTEUgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yTW9kdWxlKCk7Ci0KLQl9Ci0KLX0gLy9BcHBsaWNhdGlvblBhY2thZ2UKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlYWJlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvblJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLS8qKgotICogVGhlIHJlcHJlc2VudHMgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBvZiB0aGUgRUFSLgotCi0gKiBAc2luY2UgMS4wICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25SZXNvdXJjZSBleHRlbmRzIFhNTFJlc291cmNlIHsKLQkKLQkgIC8qKgotCSAgICogVGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciAKLQkgICAqIEBzaW5jZSAxLjAKLQkgICAqIEByZXR1cm4gVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBvZiB0aGUgRUFSLCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgICAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpIDsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQ29ubmVjdG9yTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9Db25uZWN0b3JNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhYjIxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9Db25uZWN0b3JNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uOwotCi0KLS8qKgotICogU3BlY2lmaWVzIHRoZSBVUkkgb2YgYSByZXNvdXJjZSBhZGFwdGVyIGFyY2hpdmUgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdG9yTW9kdWxlIGV4dGVuZHMgTW9kdWxlewotCS8vQ29ubmVjdG9yTW9kdWxlCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vRWpiTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9FamJNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhYmI1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9FamJNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uOwotCi0KLS8qKgotICogU3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBlamItamFyLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBFamJNb2R1bGUgZXh0ZW5kcyBNb2R1bGV7Ci0JLy9FamJNb2R1bGUKLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9KYXZhQ2xpZW50TW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9KYXZhQ2xpZW50TW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NWYwNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vSmF2YUNsaWVudE1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb247Ci0KLQotLyoqCi0gKiBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNsaWVudE1vZHVsZSBleHRlbmRzIE1vZHVsZXsKLQkvL0phdmFDbGllbnRNb2R1bGUKLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9Nb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDkxMDhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL01vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFRoZSBtb2R1bGUgZWxlbWVudCByZXByZXNlbnRzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhbiBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4gb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybnMgYm9vbGVhbiB2YWx1ZSBpZiB0aGlzIE1vZHVsZSByZXByZXNlbnRzIGEgQ29ubmVjdG9yTW9kdWxlCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0b3JNb2R1bGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgaWYgdGhpcyBNb2R1bGUgcmVwcmVzZW50cyBhIEVqYk1vZHVsZQotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWpiTW9kdWxlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGlmIHRoaXMgTW9kdWxlIHJlcHJlc2VudHMgYSBKYXZhQ2xpZW50TW9kdWxlKEFwcGxpY2F0aW9uQ2xpZW50KQotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSmF2YU1vZHVsZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgYm9vbGVhbiB2YWx1ZSBpZiB0aGlzIE1vZHVsZSByZXByZXNlbnRzIGEgV2ViTW9kdWxlCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXZWJNb2R1bGUoKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqIFNwZWNpZmllcyB0aGUgVVJJIG9mIGEgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbgotCSAqIHBhY2thZ2UuCi0KLQkgKi8KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VXJpKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQWx0REQgYXR0cmlidXRlCi0JICogVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZgotCSAqIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIEoyRUUgbW9kdWxlLiBUaGUgVVJJIG11c3QKLQkgKiBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUKLQkgKiBhcHBsaWNhdGlvbidzIHJvb3QgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyIG11c3QKLQkgKiByZWFkIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZnJvbSB0aGUgZGVmYXVsdCBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lIHJlcXVpcmVkIAotCSAqIGJ5IHRoZSByZXNwZWN0aXZlIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLgotCi0JICovCi0JU3RyaW5nIGdldEFsdEREKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQWx0REQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRBbHRERChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgQXBwbGljYXRpb24gcmVmZXJlbmNlCi0JICovCi0JQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBBcHBsaWNhdGlvbiByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIHZhbHVlKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL1dlYk1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vV2ViTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDQwMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vV2ViTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbjsKLQotCi0vKioKLSAqIENvbnRhaW5zIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YgYSB3ZWIgYXBwbGljYXRpb24gbW9kdWxlLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBXZWJNb2R1bGUgZXh0ZW5kcyBNb2R1bGUgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBDb250ZXh0Um9vdCBhdHRyaWJ1dGUKLQkgKiBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3Qgb2YgYSB3ZWIgYXBwbGljYXRpb24KLQotCSAqLwotCVN0cmluZyBnZXRDb250ZXh0Um9vdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENvbnRleHRSb290IGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Q29udGV4dFJvb3QoU3RyaW5nIHZhbHVlKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTkzY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQ29ubmVjdG9yTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkVqYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5KYXZhQ2xpZW50TW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25GYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uRmFjdG9yeSB7Ci0gCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25GYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlBcHBsaWNhdGlvbkZhY3RvcnkgdGhlQXBwbGljYXRpb25GYWN0b3J5ID0gKEFwcGxpY2F0aW9uRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiYXBwbGljYXRpb24ueG1pIik7IAotCQkJaWYgKHRoZUFwcGxpY2F0aW9uRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZUFwcGxpY2F0aW9uRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7IAkKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OOiByZXR1cm4gY3JlYXRlQXBwbGljYXRpb24oKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRTogcmV0dXJuIGNyZWF0ZU1vZHVsZSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRTogcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuSkFWQV9DTElFTlRfTU9EVUxFOiByZXR1cm4gY3JlYXRlSmF2YUNsaWVudE1vZHVsZSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuRUpCX01PRFVMRTogcmV0dXJuIGNyZWF0ZUVqYk1vZHVsZSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRTogcmV0dXJuIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi1wdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBY3RpdmVGYWN0b3J5KCkgewotCXJldHVybiAoQXBwbGljYXRpb25GYWN0b3J5KSBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbiBjcmVhdGVBcHBsaWNhdGlvbigpIHsKLQkJQXBwbGljYXRpb25JbXBsIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1vZHVsZSBjcmVhdGVNb2R1bGUoKSB7Ci0JCU1vZHVsZUltcGwgbW9kdWxlID0gbmV3IE1vZHVsZUltcGwoKTsKLQkJcmV0dXJuIG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgV2ViTW9kdWxlIGNyZWF0ZVdlYk1vZHVsZSgpIHsKLQkJV2ViTW9kdWxlSW1wbCB3ZWJNb2R1bGUgPSBuZXcgV2ViTW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gd2ViTW9kdWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xpZW50TW9kdWxlIGNyZWF0ZUphdmFDbGllbnRNb2R1bGUoKSB7Ci0JCUphdmFDbGllbnRNb2R1bGVJbXBsIGphdmFDbGllbnRNb2R1bGUgPSBuZXcgSmF2YUNsaWVudE1vZHVsZUltcGwoKTsKLQkJcmV0dXJuIGphdmFDbGllbnRNb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVqYk1vZHVsZSBjcmVhdGVFamJNb2R1bGUoKSB7Ci0JCUVqYk1vZHVsZUltcGwgZWpiTW9kdWxlID0gbmV3IEVqYk1vZHVsZUltcGwoKTsKLQkJcmV0dXJuIGVqYk1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yTW9kdWxlIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpIHsKLQkJQ29ubmVjdG9yTW9kdWxlSW1wbCBjb25uZWN0b3JNb2R1bGUgPSBuZXcgQ29ubmVjdG9yTW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gY29ubmVjdG9yTW9kdWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvblBhY2thZ2UgZ2V0QXBwbGljYXRpb25QYWNrYWdlKCkgewotCQlyZXR1cm4gKEFwcGxpY2F0aW9uUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25QYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjZlZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24uSUNvbW1vbkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24uSUNvbW1vbk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKLQotCi0vKioKLSAqIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBKMkVFIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25JbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb24sIElDb21tb25BcHBsaWNhdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWN1cml0eVJvbGVzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbW9kdWxlcyA9IG51bGw7Ci0JcHVibGljIEFwcGxpY2F0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT047Ci0JfQotCi0vKioKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24uQXBwbGljYXRpb24KLSAqLwotcHVibGljIGJvb2xlYW4gY29udGFpbnNTZWN1cml0eVJvbGUoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB7Ci0JcmV0dXJuIGdldFNlY3VyaXR5Um9sZU5hbWVkKG5hbWUpICE9IG51bGw7Ci19Ci1wdWJsaWMgTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgdXJpKSB7Ci0JcmV0dXJuIGdldEZpcnN0TW9kdWxlKHVyaSk7Ci19Ci0KLXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyB1cmksIFN0cmluZyBhbHRERCkgewotCUxpc3QgYWxsTW9kdWxlcyA9IGdldE1vZHVsZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJTW9kdWxlIGFNb2R1bGUgPSAoTW9kdWxlKSBhbGxNb2R1bGVzLmdldChpKTsKLQkJaWYgKFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHVyaSwgYU1vZHVsZS5nZXRVcmkoKSkgJiYgU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwoYWx0REQsIGFNb2R1bGUuZ2V0QWx0REQoKSkpCi0JCQlyZXR1cm4gYU1vZHVsZTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3QgbW9kdWxlIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgdXJpCi0JICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIGEgbW9kdWxlIHRvIGZpbmQuCi0JICogQHJldHVybiBUaGUgZmlyc3QgbWF0Y2hpbmcgbW9kdWxlIG9yIG51bGwgaWYgbm8gbW9kdWxlIGlzIGZvdW5kLgotCSAqLwotCXB1YmxpYyBNb2R1bGUgZ2V0Rmlyc3RNb2R1bGUoU3RyaW5nIHVyaSl7Ci0JCWlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCWphdmEudXRpbC5JdGVyYXRvciBhbGxNb2R1bGVzID0gZ2V0TW9kdWxlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhbGxNb2R1bGVzLmhhc05leHQoKSl7Ci0JCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpYWxsTW9kdWxlcy5uZXh0KCk7Ci0JCQlpZih1cmkuZXF1YWxzKGFNb2R1bGUuZ2V0VXJpKCkpKSByZXR1cm4gYU1vZHVsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0vKioKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24uQXBwbGljYXRpb24KLSAqLwotcHVibGljIE1vZHVsZSBnZXRNb2R1bGVIYXZpbmdBbHRERChqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCWlmICh1cmkgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7Ci0JTGlzdCBhTW9kdWxlcyA9IGdldE1vZHVsZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFNb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCU1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSkgYU1vZHVsZXMuZ2V0KGkpOwotCQlpZiAodXJpLmVxdWFscyhhTW9kdWxlLmdldEFsdEREKCkpKQotCQkJcmV0dXJuIGFNb2R1bGU7Ci0JfQotCXJldHVybiBudWxsOwotfQotcHVibGljIFNlY3VyaXR5Um9sZSBnZXRTZWN1cml0eVJvbGVOYW1lZChTdHJpbmcgcm9sZU5hbWUpIHsKLQlqYXZhLnV0aWwuTGlzdCB0ZW1wUm9sZXMgPSBnZXRTZWN1cml0eVJvbGVzKCk7Ci0JU2VjdXJpdHlSb2xlIHJvbGU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wUm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJcm9sZSA9IChTZWN1cml0eVJvbGUpIHRlbXBSb2xlcy5nZXQoaSk7Ci0JCWlmIChyb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKHJvbGVOYW1lKSkKLQkJCXJldHVybiByb2xlOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQkKLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIEFwcGxpY2F0aW9uIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBBcHBsY2F0aW9uMS4yIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfMkRlc2NyaXB0b3IoKSB7Ci0JQ29tbW9uVXRpbC5jaGVja0RET2JqZWN0Rm9yVmVyc2lvbih0aGlzKTsKLQlTdHJpbmcgc3lzdGVtSWQgPSAoKFhNTFJlc291cmNlKWVSZXNvdXJjZSgpKS5nZXRTeXN0ZW1JZCgpOwotCXJldHVybiBzeXN0ZW1JZCA9PSBudWxsID8gZmFsc2UgOiBzeXN0ZW1JZC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzIpOwotfQotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgQXBwbGljYXRpb24gd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEFwcGxpY2F0aW9uMS4zIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfM0Rlc2NyaXB0b3IoKSB7Ci0JQ29tbW9uVXRpbC5jaGVja0RET2JqZWN0Rm9yVmVyc2lvbih0aGlzKTsKLQlTdHJpbmcgc3lzdGVtSWQgPSAoKFhNTFJlc291cmNlKWVSZXNvdXJjZSgpKS5nZXRTeXN0ZW1JZCgpOwotCXJldHVybiBzeXN0ZW1JZCA9PSBudWxsID8gZmFsc2UgOiBzeXN0ZW1JZC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzMpOwotfQotCS8qKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCXN1cGVyLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQlUaGlzIHJldHVybnMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlcy5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQl9Ci0JLyoqCi0JICpUaGlzIHJldHVybnMgdGhlIGoyZWUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBqMmVlIGxldmVsCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlcy5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBDb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2Ygc2VjdXJpdHkgcm9sZXMgd2hpY2ggYXJlCi0JICogZ2xvYmFsIHRvIHRoZSBhcHBsaWNhdGlvbi4gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlY3VyaXR5Um9sZXMoKSB7Ci0JCWlmIChzZWN1cml0eVJvbGVzID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlSb2xlLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gc2VjdXJpdHlSb2xlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TW9kdWxlcygpIHsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkgewotCQkJbW9kdWxlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KE1vZHVsZS5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTLCBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTik7Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNb2R1bGVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1vZHVsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUzoKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUzoKLQkJCQlnZXRNb2R1bGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRNb2R1bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6Ci0JCQkJZ2V0TW9kdWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiBzZWN1cml0eVJvbGVzICE9IG51bGwgJiYgIXNlY3VyaXR5Um9sZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6Ci0JCQkJcmV0dXJuIG1vZHVsZXMgIT0gbnVsbCAmJiAhbW9kdWxlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCXB1YmxpYyBMaXN0IGdldEVBUk1vZHVsZXMoKSB7Ci0JCXJldHVybiBnZXRNb2R1bGVzKCk7Ci0JfQotCXB1YmxpYyBJQ29tbW9uTW9kdWxlIGdldEZpcnN0RUFSTW9kdWxlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIChJQ29tbW9uTW9kdWxlKWdldEZpcnN0TW9kdWxlKHVyaSk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2ZTBiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Db25uZWN0b3JNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvblBhY2thZ2UsIEVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcHBsaWNhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtb2R1bGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2ViTW9kdWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFDbGllbnRNb2R1bGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiTW9kdWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbm5lY3Rvck1vZHVsZUVDbGFzcyA9IG51bGw7Ci0KLQkJICAgLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcml2YXRlIEFwcGxpY2F0aW9uUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIEFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25QYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChBcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgQXBwbGljYXRpb25QYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlQXBwbGljYXRpb25QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9TZWN1cml0eVJvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1vZHVsZSgpIHsKLQkJcmV0dXJuIG1vZHVsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2R1bGVfVXJpKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kdWxlX0FsdEREKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TW9kdWxlX0FwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXZWJNb2R1bGUoKSB7Ci0JCXJldHVybiB3ZWJNb2R1bGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViTW9kdWxlX0NvbnRleHRSb290KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViTW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhQ2xpZW50TW9kdWxlKCkgewotCQlyZXR1cm4gamF2YUNsaWVudE1vZHVsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVqYk1vZHVsZSgpIHsKLQkJcmV0dXJuIGVqYk1vZHVsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbm5lY3Rvck1vZHVsZSgpIHsKLQkJcmV0dXJuIGNvbm5lY3Rvck1vZHVsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYXBwbGljYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fVkVSU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19NT0RVTEVTKTsKLQotCQltb2R1bGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTU9EVUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtb2R1bGVFQ2xhc3MsIE1PRFVMRV9fVVJJKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtb2R1bGVFQ2xhc3MsIE1PRFVMRV9fQUxUX0REKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtb2R1bGVFQ2xhc3MsIE1PRFVMRV9fQVBQTElDQVRJT04pOwotCi0JCXdlYk1vZHVsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUJfTU9EVUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJNb2R1bGVFQ2xhc3MsIFdFQl9NT0RVTEVfX0NPTlRFWFRfUk9PVCk7Ci0KLQkJamF2YUNsaWVudE1vZHVsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0NMSUVOVF9NT0RVTEUpOwotCi0JCWVqYk1vZHVsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfTU9EVUxFKTsKLQotCQljb25uZWN0b3JNb2R1bGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OTkVDVE9SX01PRFVMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZSB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJbW9kdWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdlYk1vZHVsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSk7Ci0JCWphdmFDbGllbnRNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlKCkpOwotCQllamJNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlKCkpOwotCQljb25uZWN0b3JNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYXBwbGljYXRpb25FQ2xhc3MsIEFwcGxpY2F0aW9uLmNsYXNzLCAiQXBwbGljYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uX1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlX0FwcGxpY2F0aW9uKCksICJtb2R1bGVzIiwgbnVsbCwgMSwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobW9kdWxlRUNsYXNzLCBNb2R1bGUuY2xhc3MsICJNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlX0FsdEREKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhbHRERCIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kdWxlX0FwcGxpY2F0aW9uKCksIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmdldEFwcGxpY2F0aW9uKCksIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmdldEFwcGxpY2F0aW9uX01vZHVsZXMoKSwgImFwcGxpY2F0aW9uIiwgbnVsbCwgMCwgMSwgTW9kdWxlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2ViTW9kdWxlRUNsYXNzLCBXZWJNb2R1bGUuY2xhc3MsICJXZWJNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYk1vZHVsZV9Db250ZXh0Um9vdCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29udGV4dFJvb3QiLCBudWxsLCAwLCAxLCBXZWJNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhQ2xpZW50TW9kdWxlRUNsYXNzLCBKYXZhQ2xpZW50TW9kdWxlLmNsYXNzLCAiSmF2YUNsaWVudE1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGVqYk1vZHVsZUVDbGFzcywgRWpiTW9kdWxlLmNsYXNzLCAiRWpiTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29ubmVjdG9yTW9kdWxlRUNsYXNzLCBDb25uZWN0b3JNb2R1bGUuY2xhc3MsICJDb25uZWN0b3JNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JfQotCi19IC8vQXBwbGljYXRpb25QYWNrYWdlSW1wbAotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjJmZWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkgewotCi0JLyoqCi0JICogTWV0aG9kIHJlZ2lzdGVyRHRkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEdGRzKCkgewotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzIsICJhcHBsaWNhdGlvbl8xXzIuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fQUxUX1NZU1RFTUlEXzFfMiwgImFwcGxpY2F0aW9uXzEuMi5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzMsICJhcHBsaWNhdGlvbl8xXzMuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fQUxUX1NZU1RFTUlEXzFfMywgImFwcGxpY2F0aW9uXzEuMy5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TQ0hFTUFfTE9DXzFfNCwgImFwcGxpY2F0aW9uXzFfNC54c2QiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBtb3ZlZCB0byB0aGUgd2ViIHN2Y3MgSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9TQ0hFTUFfTE9DXzFfMSwgImoyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuSjJFRV8xXzRfWFNEX1NIT1JUX05BTUUsIEoyRUVDb25zdGFudHMuSjJFRV8xXzRfWFNEX1NIT1JUX05BTUUpOyAKLQl9Ci0KLQkKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhUmVuZGVyZXJGYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIEFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5KCkgewotICAgICAgICBzdXBlcihSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLSAgICB9Ci0JCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFSZW5kZXJlckZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlcikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IEFwcGxpY2F0aW9uUmVzb3VyY2VJbXBsKHVyaSwgYVJlbmRlcmVyKTsKLSAgICB9Ci0JLyoqCi0JICogUmVnaXN0ZXIgbXlzZWxmIHdpdGggdGhlIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCUoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1NIT1JUX05BTUUsIG5ldyBBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCXJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCWFSZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1NIT1JUX05BTUUsIG5ldyBBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZS5GYWN0b3J5IGdldFJlZ2lzdGVyZWRGYWN0b3J5KCkgewotCQlyZXR1cm4gSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUklfT0JKKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25SZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25SZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkZGFkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uUmVzb3VyY2UgewotICAgIC8qKgotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiBAcGFyYW0gYVJlbmRlcmVyCi0gICAgICovCi0gICAgcHVibGljIEFwcGxpY2F0aW9uUmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotICAgICAgICBzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0gICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFSZW5kZXJlcgotICAgICAqLwotICAgIHB1YmxpYyBBcHBsaWNhdGlvblJlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLSAgICAgICAgc3VwZXIoYVJlbmRlcmVyKTsKLSAgICB9Ci0JLyoqCi0JKiBSZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIEVMaXN0LgkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb24pIGdldFJvb3RPYmplY3QoKTsKLQl9Ci0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEFQUExJQ0FUSU9OX1RZUEU7Ci0JfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3R5cGUoKSB7Ci0gICAgCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoJCi0JCQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRE9DVFlQRTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotICAgIH0KLQkvKiBBcHAgdmVyc2lvbiBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIEoyRUUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIGdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLSAgICBwdWJsaWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uVHJhbnNsYXRvci5JTlNUQU5DRTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKMkVFX0FsdF8xXzJfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0FMVF9TWVNURU1JRF8xXzI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMzsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKMkVFX0FsdF8xXzNfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0FMVF9TWVNURU1JRF8xXzM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfUHVibGljSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMzsKLQl9Ci0JLyogCi0JICogVGhpcyBkaXJlY3RseSBzZXRzIHRoZSBtb2R1bGUgdmVyc2lvbiBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVZlcnNpb25JRChpbnQgaWQpIHsKLQkJc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKLQkJc3dpdGNoIChpZCkgewotCQkJCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQl9Ci0JCXN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JfQotCQkvKgotCQkgKiBCYXNlZCBvbiB0aGUgSjJFRSB2ZXJzaW9uLCB0aGlzIHdpbGwgc2V0IHRoZSBtb2R1bGUgdmVyc2lvbihTYW1lIGFzIEoyRUUgVmVyc2lvbiBmb3IgQXBwbGljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCkgewotCQlwcmltU2V0VmVyc2lvbklEKGlkKTsKLQkJc3dpdGNoIChpZCkgewotCQkJCQljYXNlIChKMkVFXzFfNF9JRCkgOgotCQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCQl9Ci0JCXN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JCX0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmltcGwuWE1MUmVzb3VyY2VJbXBsI3N5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpIHsKLQkJQXBwbGljYXRpb24gYXBwID0gZ2V0QXBwbGljYXRpb24oKTsKLQkJaWYgKGFwcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJU3RyaW5nIHZlcnNpb24gPSBhcHAuZ2V0VmVyc2lvbigpOwotCQlTdHJpbmcgbmV3VmVyc2lvbiA9IGdldE1vZHVsZVZlcnNpb25TdHJpbmcoKTsKLQkJaWYgKCFuZXdWZXJzaW9uLmVxdWFscyh2ZXJzaW9uKSkKLQkJCWFwcC5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rvck1vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGIyM2MwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkNvbm5lY3Rvck1vZHVsZTsKLQotLyoqCi0gKiBTcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yTW9kdWxlSW1wbCBleHRlbmRzIE1vZHVsZUltcGwgaW1wbGVtZW50cyBDb25uZWN0b3JNb2R1bGUgewotCi0JcHVibGljIENvbm5lY3Rvck1vZHVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkNPTk5FQ1RPUl9NT0RVTEU7Ci0JfQotCi1wdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3Rvck1vZHVsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci19Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FamJNb2R1bGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0VqYk1vZHVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZTE1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0VqYk1vZHVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5FamJNb2R1bGU7Ci0KLS8qKgotICogU3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBlamItamFyLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiTW9kdWxlSW1wbCBleHRlbmRzIE1vZHVsZUltcGwgaW1wbGVtZW50cyBFamJNb2R1bGUgewotCi0JcHVibGljIEVqYk1vZHVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkVKQl9NT0RVTEU7Ci0JfQotCi1wdWJsaWMgYm9vbGVhbiBpc0VqYk1vZHVsZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0phdmFDbGllbnRNb2R1bGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0phdmFDbGllbnRNb2R1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTAzMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9KYXZhQ2xpZW50TW9kdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGU7Ci0KLS8qKgotICogc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBqYXZhIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ2xpZW50TW9kdWxlSW1wbCBleHRlbmRzIE1vZHVsZUltcGwgaW1wbGVtZW50cyBKYXZhQ2xpZW50TW9kdWxlIHsKLQotCXB1YmxpYyBKYXZhQ2xpZW50TW9kdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9DTElFTlRfTU9EVUxFOwotCX0KLQotcHVibGljIGJvb2xlYW4gaXNKYXZhTW9kdWxlKCkgewotCXJldHVybiB0cnVlOwotfQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTW9kdWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NDg5NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklDb21tb25FTUZNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcHBsaWNhdGlvbi5JQ29tbW9uTW9kdWxlOwotCi0vKioKLSAqIFRoZSBtb2R1bGUgZWxlbWVudCByZXByZXNlbnRzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhbiBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4gb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTW9kdWxlLCBJQ29tbW9uTW9kdWxlLCBJQ29tbW9uRU1GTW9kdWxlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgRk9SV0FSRF9TTEFTSCA9ICcvJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgQkFDS1dBUkRfU0xBU0ggPSAnXFwnOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRERCgpIDxlbT5BbHQgREQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdEREKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRfRERfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRERCA9IEFMVF9ERF9FREVGQVVMVDsKLQlwdWJsaWMgTW9kdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTU9EVUxFOwotCX0KLQotcHVibGljIGJvb2xlYW4gaXNDb25uZWN0b3JNb2R1bGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyogUmV0dXJucyBmYWxzZSBieSBkZWZhdWx0Ci0gKgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0VqYk1vZHVsZSgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKiAKLSAqIFJldHVybnMgZmFsc2UgYnkgZGVmYXVsdAotICovCi1wdWJsaWMgYm9vbGVhbiBpc0phdmFNb2R1bGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyogCi0gKiBSZXR1cm5zIGZhbHNlIGJ5IGRlZmF1bHQKLSAqLwotcHVibGljIGJvb2xlYW4gaXNXZWJNb2R1bGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGUgVVJJIG9mIGEgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJU3RyaW5nIG9sZFVyaSA9IHVyaTsKLQkJdXJpID0gbmV3VXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkksIG9sZFVyaSwgdXJpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gVGhlIFVSSSBtdXN0IHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbidzIHJvb3QgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyIG11c3QgcmVhZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIGRlZmF1bHQgbG9jYXRpb24gYW5kIGZpbGUgbmFtZSByZXF1aXJlZCBieSB0aGUgcmVzcGVjdGl2ZSBjb21wb25lbnQgc3BlY2lmaWNhdGlvbi4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0REQoKSB7Ci0JCXJldHVybiBhbHRERDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRERChTdHJpbmcgbmV3QWx0REQpIHsKLQkJU3RyaW5nIG9sZEFsdEREID0gYWx0REQ7Ci0JCWFsdEREID0gbmV3QWx0REQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERCwgb2xkQWx0REQsIGFsdEREKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQXBwbGljYXRpb24pZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG5ld0FwcGxpY2F0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdBcHBsaWNhdGlvbiwgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT04sIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBuZXdBcHBsaWNhdGlvbikgewotCQlpZiAobmV3QXBwbGljYXRpb24gIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT04gJiYgbmV3QXBwbGljYXRpb24gIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdBcHBsaWNhdGlvbikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0FwcGxpY2F0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FwcGxpY2F0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVMsIEFwcGxpY2F0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFwcGxpY2F0aW9uKG5ld0FwcGxpY2F0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OLCBuZXdBcHBsaWNhdGlvbiwgbmV3QXBwbGljYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldEFwcGxpY2F0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUywgQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VXJpKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gZ2V0QWx0REQoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fVVJJOgotCQkJCXNldFVyaSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDoKLQkJCQlzZXRBbHRERCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKChBcHBsaWNhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fVVJJOgotCQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQUxUX0REOgotCQkJCXNldEFsdEREKEFMVF9ERF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gQUxUX0REX0VERUZBVUxUID09IG51bGwgPyBhbHRERCAhPSBudWxsIDogIUFMVF9ERF9FREVGQVVMVC5lcXVhbHMoYWx0REQpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJpOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsdEREOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbHRERCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgZnJhZykgewotCQkvLyBUaGlzIGlzIGEgTm8tb3AgYmVjYXVzZSBJZCdzIGFyZSBhdXRvbWF0aWNhbGx5IHNldCBkdXJpbmcgcHJveHkgcmVzb2x1dGlvbgotCQkKLQl9Ci0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5JQ29tbW9uRU1GTW9kdWxlI2dldElkKCkKLQkgKiBUaGlzIHJldHVybnMgdGhlIGlkIGJhc2VkIG9uIHRoZSBjb250YWluaW5nIHJlc291cmNlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJaWYgKGVSZXNvdXJjZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZVJlc291cmNlKCkuZ2V0VVJJRnJhZ21lbnQodGhpcyk7Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViTW9kdWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYmUzYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci0KLQotLyoqCi0gKiBDb250YWlucyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mIGEgd2ViIGFwcGxpY2F0aW9uIG1vZHVsZS4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYk1vZHVsZUltcGwgZXh0ZW5kcyBNb2R1bGVJbXBsIGltcGxlbWVudHMgV2ViTW9kdWxlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZXh0Um9vdCgpIDxlbT5Db250ZXh0IFJvb3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRleHRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1JPT1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0Um9vdCA9IENPTlRFWFRfUk9PVF9FREVGQVVMVDsKLQlwdWJsaWMgV2ViTW9kdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuV0VCX01PRFVMRTsKLQl9Ci0KLXB1YmxpYyBib29sZWFuIGlzV2ViTW9kdWxlKCkgewotCXJldHVybiB0cnVlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdCBvZiBhIHdlYiBhcHBsaWNhdGlvbgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZXh0Um9vdCgpIHsKLQkJcmV0dXJuIGNvbnRleHRSb290OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHRSb290KFN0cmluZyBuZXdDb250ZXh0Um9vdCkgewotCQlTdHJpbmcgb2xkQ29udGV4dFJvb3QgPSBjb250ZXh0Um9vdDsKLQkJY29udGV4dFJvb3QgPSBuZXdDb250ZXh0Um9vdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLldFQl9NT0RVTEVfX0NPTlRFWFRfUk9PVCwgb2xkQ29udGV4dFJvb3QsIGNvbnRleHRSb290KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQ09OVEVYVF9ST09UOgotCQkJCXJldHVybiBnZXRDb250ZXh0Um9vdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19DT05URVhUX1JPT1Q6Ci0JCQkJc2V0Q29udGV4dFJvb3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9NT0RVTEVfX0NPTlRFWFRfUk9PVDoKLQkJCQlzZXRDb250ZXh0Um9vdChDT05URVhUX1JPT1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQ09OVEVYVF9ST09UOgotCQkJCXJldHVybiBDT05URVhUX1JPT1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnRleHRSb290ICE9IG51bGwgOiAhQ09OVEVYVF9ST09UX0VERUZBVUxULmVxdWFscyhjb250ZXh0Um9vdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb250ZXh0Um9vdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29udGV4dFJvb3QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTgyOWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQ29ubmVjdG9yTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkVqYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5KYXZhQ2xpZW50TW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgQXBwbGljYXRpb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCXB1YmxpYyBBcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpdHlwZSkuZUNsYXNzKCkuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uU3dpdGNoIHN3ID0gbmV3IEFwcGxpY2F0aW9uU3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJNb2R1bGUoV2ViTW9kdWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhQ2xpZW50TW9kdWxlKEphdmFDbGllbnRNb2R1bGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSmF2YUNsaWVudE1vZHVsZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFamJNb2R1bGUoRWpiTW9kdWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVqYk1vZHVsZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3JNb2R1bGUoQ29ubmVjdG9yTW9kdWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZUFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpc3cuZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYk1vZHVsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFDbGllbnRNb2R1bGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFamJNb2R1bGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25uZWN0b3JNb2R1bGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZUdlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25Td2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgQXBwbGljYXRpb25Td2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJNb2R1bGUoV2ViTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWJNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhQ2xpZW50TW9kdWxlKEphdmFDbGllbnRNb2R1bGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFDbGllbnRNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFamJNb2R1bGUoRWpiTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFamJNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3JNb2R1bGUoQ29ubmVjdG9yTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb25uZWN0b3JNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbl9Nb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbl9Nb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyR2VuKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4KLQkgKiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uQWRhcHRlckdlbigpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kdWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViTW9kdWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YUNsaWVudE1vZHVsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVqYk1vZHVsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCA8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIDxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlIDxlbT5Nb2R1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uX01vZHVsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9BcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWIxZDE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25Td2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Db25uZWN0b3JNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25Td2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQXBwbGljYXRpb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25Td2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT046IHsKLQkJCQlBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IChBcHBsaWNhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXBwbGljYXRpb24oYXBwbGljYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGFwcGxpY2F0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGFwcGxpY2F0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChhcHBsaWNhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFOiB7Ci0JCQkJTW9kdWxlIG1vZHVsZSA9IChNb2R1bGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1vZHVsZShtb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KG1vZHVsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRTogewotCQkJCVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoV2ViTW9kdWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJNb2R1bGUod2ViTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbl9Nb2R1bGUod2ViTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3ZWJNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkpBVkFfQ0xJRU5UX01PRFVMRTogewotCQkJCUphdmFDbGllbnRNb2R1bGUgamF2YUNsaWVudE1vZHVsZSA9IChKYXZhQ2xpZW50TW9kdWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhQ2xpZW50TW9kdWxlKGphdmFDbGllbnRNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uX01vZHVsZShqYXZhQ2xpZW50TW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChqYXZhQ2xpZW50TW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5FSkJfTU9EVUxFOiB7Ci0JCQkJRWpiTW9kdWxlIGVqYk1vZHVsZSA9IChFamJNb2R1bGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVqYk1vZHVsZShlamJNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uX01vZHVsZShlamJNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGVqYk1vZHVsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRTogewotCQkJCUNvbm5lY3Rvck1vZHVsZSBjb25uZWN0b3JNb2R1bGUgPSAoQ29ubmVjdG9yTW9kdWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb25uZWN0b3JNb2R1bGUoY29ubmVjdG9yTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbl9Nb2R1bGUoY29ubmVjdG9yTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChjb25uZWN0b3JNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb24oQXBwbGljYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIE1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWIgTW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJNb2R1bGUoV2ViTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBDbGllbnQgTW9kdWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgQ2xpZW50IE1vZHVsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSmF2YUNsaWVudE1vZHVsZShKYXZhQ2xpZW50TW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWpiIE1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgTW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFamJNb2R1bGUoRWpiTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29ubmVjdG9yIE1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25uZWN0b3IgTW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3JNb2R1bGUoQ29ubmVjdG9yTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uX01vZHVsZShNb2R1bGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2ZiYWIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPkVudGVycHJpc2UgQXBwbGljYXRpb24gbW9kZWwgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgajJlZSBBcHBsaWNhdGlvbiBtb2R1bGUgbW9kZWwgYXBpLiBVc2luZyB0aGlzIGFwaSB0aGUgYXJ0aWZhY3RzIG9mIGFuIEFwcGxpY2F0aW9uCi0gICAgICAgIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZC4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjFlOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cyBhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbkNsaWVudCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCi0vKioKLSAqIFJldHVybnMgdGhlIFN0cmluZyBuYW1lIG9mIHRoZSBjYWxsIGJhY2sgaGFuZGxlcgotICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgY2FsbGJhY2sgaGFuZGxlcgotICovCi1wdWJsaWMgU3RyaW5nIGdldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSgpOwotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgQXBwbGljYXRpb24gQ2xpZW50IHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBBcHBsaWNhdGlvbiBDbGllbnQgMS4yIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfMkRlc2NyaXB0b3IoKTsKLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIEFwcGxpY2F0aW9uIGNsaWVudCB3YXMgcG9wdWxhdGVkIGZyb20gYW4gQXBwbGljYXRpb24gQ2xpZW50IDEuMyBjb21wbGlhbnQgZGVzY3JpcHRvcgotICogQHJldHVybiBib29sZWFuCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24xXzNEZXNjcmlwdG9yKCk7Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBBcHBsaWNhdGlvbiBjbGllbnQgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEFwcGxpY2F0aW9uIENsaWVudCAxLjQgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24xXzREZXNjcmlwdG9yKCk7Ci0vKioKLSAqIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzIGNvbnN0cnVjdG9yIAotICogYW5kIG11c3QgaW1wbGVtZW50IHRoZSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlciBpbnRlcmZhY2UuCi0gKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgQ2FsbGJhY2tIYW5kbGVyIHJlZmVyZW5jZQotICovCi1wdWJsaWMgdm9pZCBzZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoU3RyaW5nIGNhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBSZXNvdXJjZVJlZnMgcmVmZXJlbmNlcwotCSAqIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50cydzIHJlZmVyZW5jZXMgdG8gYW4gZXh0ZXJuYWwKLQkgKiByZXNvdXJjZXMuCi0JICovCi0JRUxpc3QgZ2V0UmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLQkgKgotCSAqIEByZXR1cm4gdGhlIGludCByZXByZXNlbnRpbmcgdGhlIGFwcCBjbGllbnQgbW9kdWxlIHZlcnNpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAtIHdoZW4gRU1GIHJlc291cmNlIGlzIG5vdCBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCS8qKgotCSAqVGhpcyByZXR1cm5zIHRoZSBqMmVlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgajJlZSBsZXZlbAotCSAqIEByZXR1cm4gdGhlIGludCByZXByZXNlbnRpbmcgdGhlIEoyRUUgc3BlYyB2ZXJzaW9uLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0gd2hlbiBFTUYgcmVzb3VyY2UgaXMgbm90IGxvYWRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBFbnZpcm9ubWVudFByb3BzIHJlZmVyZW5jZXMKLQkgKiBUaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi0JICogZW52aXJvbm1lbnQgZW50cmllcy4gRWFjaCBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCi0JICogbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4KLQkgKi8KLQlFTGlzdCBnZXRFbnZpcm9ubWVudFByb3BzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEVqYlJlZmVyZW5jZXMgcmVmZXJlbmNlcwotCSAqIENvbnRhaW5zIGEgbGlzdCBvZiBlamItcmVmIGVsZW1lbnRzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotCSAqIGFuIGVudGVycHJpc2UKLQkgKiBiZWFuJ3MgaG9tZS4gCi0JICovCi0JRUxpc3QgZ2V0RWpiUmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBSZXNvdXJjZUVudlJlZnMgcmVmZXJlbmNlcwotCSAqIFRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotCSAqIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZQotCSAqIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLQkgKiBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUKLQkgKiByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuCi0JICogCi0JICogVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0JICogCi0JICogRXhhbXBsZToKLQkgKiAKLQkgKiA8cmVzb3VyY2UtZW52LXJlZj4KLQkgKiAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvL1N0b2NrUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0JICogICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC8vcmVzb3VyY2UtZW52LXJlZi10eXBlPgotCSAqIDwvL3Jlc291cmNlLWVudi1yZWY+Ci0KLQkgKi8KLQlFTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIENhbGxiYWNrSGFuZGxlciByZWZlcmVuY2UKLQkgKiBBIGNsYXNzIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzIGNvbnN0cnVjdG9yIAotCSAqIGFuZCBtdXN0IGltcGxlbWVudCB0aGUgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIgaW50ZXJmYWNlLiAgCi0JICogVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5Ci0JICogdGhlIGNvbnRhaW5lciB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuCi0JICovCi0JSmF2YUNsYXNzIGdldENhbGxiYWNrSGFuZGxlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENhbGxiYWNrSGFuZGxlciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldENhbGxiYWNrSGFuZGxlcihKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTZXJ2aWNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlCi0JICogICAgIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICogICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlCi0JICogICAgIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAqICAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZQotCSAqICAgICB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzcxNDNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogRU1GIFJlc291cmNlIGNsYXNzIHRoZSBjb250cmFpbnMgQXBwIENsaWVudCBkb2N1bWVudAotICoJQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UgZXh0ZW5kcyBYTUxSZXNvdXJjZSB7Ci0vKioKLSAqIFJldHVybnMgdGhlIG9uZSBjb250YWluZWQgb2JqZWN0IGluIHRoaXMgcmVzb3VyY2UncyBjb2xsZWN0aW9uIG9mIHJvb3Qgb2JqZWN0cwotICogQHJldHVybiBBcHBsaWNhdGlvbkNsaWVudCwgdGhlIHJvb3Qgb2JqZWN0IGZvciB0aGUgQXBwIENsaWVudCBkb2N1bWVudC4KLSAqLwotcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgOwotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9DbGllbnRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvQ2xpZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU5MTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9DbGllbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xpZW50RmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUNsaWVudEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50RmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBcHBsaWNhdGlvbkNsaWVudCB2YWx1ZQotCSAqLwotCUFwcGxpY2F0aW9uQ2xpZW50IGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKiBAcmV0dXJuIENsaWVudFBhY2thZ2UgdmFsdWUKLQkgKi8KLQlDbGllbnRQYWNrYWdlIGdldENsaWVudFBhY2thZ2UoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9DbGllbnRQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvQ2xpZW50UGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWU3MjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9DbGllbnRQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCUBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIENsaWVudFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiY2xpZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlQgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19JQ09OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0VOVklST05NRU5UX1BST1BTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVIgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LlJlc0F1dGhBcHBsaWNhdGlvblR5cGUgPGVtPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5SZXNBdXRoQXBwbGljYXRpb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbCNnZXRSZXNBdXRoQXBwbGljYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU19BVVRIX0FQUExJQ0FUSU9OX1RZUEUgPSAxOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJjbGllbnQueG1pIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2xpZW50UGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uQ2xpZW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0Vudmlyb25tZW50UHJvcHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRTZXJ2aWNlUmVmcygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSA8ZW0+UmVzIEF1dGggQXBwbGljYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuUmVzQXV0aEFwcGxpY2F0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRSZXNBdXRoQXBwbGljYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlDbGllbnRGYWN0b3J5IGdldENsaWVudEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCA8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGwjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVBQTElDQVRJT05fQ0xJRU5UID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudmlyb25tZW50IFByb3BzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX0VOVklST05NRU5UX1BST1BTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X0Vudmlyb25tZW50UHJvcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZlcmVuY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X0VqYlJlZmVyZW5jZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlRW52UmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FsbGJhY2sgSGFuZGxlcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LlJlc0F1dGhBcHBsaWNhdGlvblR5cGUgPGVtPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5SZXNBdXRoQXBwbGljYXRpb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGwjZ2V0UmVzQXV0aEFwcGxpY2F0aW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFJFU19BVVRIX0FQUExJQ0FUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UmVzQXV0aEFwcGxpY2F0aW9uVHlwZSgpOwotCi0JfQotCi19IC8vQ2xpZW50UGFja2FnZQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L1Jlc0F1dGhBcHBsaWNhdGlvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9SZXNBdXRoQXBwbGljYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MDIxOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L1Jlc0F1dGhBcHBsaWNhdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICpAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFJlc0F1dGhBcHBsaWNhdGlvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBUFBMSUNBVElPTl9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IkFwcGxpY2F0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExJQ0FUSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRBSU5FUl9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IkNvbnRhaW5lciIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UQUlORVIgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBUFBMSUNBVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSBBUFBMSUNBVElPTl9MSVRFUkFMID0gbmV3IFJlc0F1dGhBcHBsaWNhdGlvblR5cGUoQVBQTElDQVRJT04sICJBcHBsaWNhdGlvbiIsICJBcHBsaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoQXBwbGljYXRpb25UeXBlIENPTlRBSU5FUl9MSVRFUkFMID0gbmV3IFJlc0F1dGhBcHBsaWNhdGlvblR5cGUoQ09OVEFJTkVSLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIEF1dGggQXBwbGljYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBSZXNBdXRoQXBwbGljYXRpb25UeXBlW10gewotCQkJQVBQTElDQVRJT05fTElURVJBTCwKLQkJCUNPTlRBSU5FUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJlc0F1dGhBcHBsaWNhdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgQXV0aCBBcHBsaWNhdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJlc0F1dGhBcHBsaWNhdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNBdXRoQXBwbGljYXRpb25UeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBBUFBMSUNBVElPTjogcmV0dXJuIEFQUExJQ0FUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIENPTlRBSU5FUjogcmV0dXJuIENPTlRBSU5FUl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBSZXNBdXRoQXBwbGljYXRpb25UeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9SZXNBdXRoQXBwbGljYXRpb25UeXBlCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDY2YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuQ29tbW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci0KLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cyBhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25DbGllbnQgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VSZWZzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW52aXJvbm1lbnRQcm9wcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYlJlZmVyZW5jZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZUVudlJlZnMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgY2FsbGJhY2tIYW5kbGVyID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmcygpIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ2xpZW50UGFja2FnZS5MaXRlcmFscy5BUFBMSUNBVElPTl9DTElFTlQ7Ci0JfQotCi0vKioKLSAqIGNyZWF0ZUNsYXNzUmVmIC0gcmV0dXJuIGEgSmF2YVVSTCByZWZlcmVuY2UgdG8gdGhlIG5hbWVkIEphdmEgY2xhc3MKLSAqLwotcHVibGljIEphdmFDbGFzcyBjcmVhdGVDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSkgewotCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYodGFyZ2V0TmFtZSk7Ci19Ci1wdWJsaWMgU3RyaW5nIGdldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSgpIHsKLQlnZXRDYWxsYmFja0hhbmRsZXIoKTsKLQlyZXR1cm4gKGNhbGxiYWNrSGFuZGxlciA9PSBudWxsKSA/IG51bGwgOiBjYWxsYmFja0hhbmRsZXIuZ2V0UXVhbGlmaWVkTmFtZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgQXBwbGljYXRpb24gQ2xpZW50IHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBBcHBsaWNhdGlvbiBDbGllbnQgMS4yIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfMkRlc2NyaXB0b3IoKSB7Ci0JQ29tbW9uVXRpbC5jaGVja0RET2JqZWN0Rm9yVmVyc2lvbih0aGlzKTsKLQlTdHJpbmcgc3lzdGVtSWQgPSAoKFhNTFJlc291cmNlKWVSZXNvdXJjZSgpKS5nZXRTeXN0ZW1JZCgpOwotCXJldHVybiBzeXN0ZW1JZCA9PSBudWxsID8gZmFsc2UgOiBzeXN0ZW1JZC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NZU1RFTUlEXzFfMik7Ci19Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBBcHBsaWNhdGlvbiBjbGllbnQgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEFwcGxpY2F0aW9uIENsaWVudCAxLjMgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8zRGVzY3JpcHRvcigpIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCVN0cmluZyBzeXN0ZW1JZCA9ICgoWE1MUmVzb3VyY2UpZVJlc291cmNlKCkpLmdldFN5c3RlbUlkKCk7Ci0JcmV0dXJuIHN5c3RlbUlkID09IG51bGwgPyBmYWxzZSA6IHN5c3RlbUlkLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8zKTsKLX0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV80RGVzY3JpcHRvcigpIHsKLQlyZXR1cm4gdmVyc2lvbiAhPSBudWxsICYmIEoyRUVDb25zdGFudHMuSjJFRV8xXzRfVEVYVC5lcXVhbHModmVyc2lvbik7Ci19Ci1wdWJsaWMgdm9pZCBzZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoU3RyaW5nIGNhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSkgewotCWVTZXQoQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCksIGNyZWF0ZUNsYXNzUmVmKGNhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSkpOwotfQotLyoqCi0gKlRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JaWYgKHJlcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JcmV0dXJuIHJlcy5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLX0KLS8qKgotICpUaGlzIHJldHVybnMgdGhlIGoyZWUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBqMmVlIGxldmVsCi0gKi8KLXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCXJldHVybiByZXMuZ2V0SjJFRVZlcnNpb25JRCgpOwotfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50cydzIHJlZmVyZW5jZXMgdG8gYW4gZXh0ZXJuYWwKLQkgKiByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJlc291cmNlUmVmcygpIHsKLQkJaWYgKHJlc291cmNlUmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VSZWYuY2xhc3MsIHRoaXMsIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLQkgKiBlbnZpcm9ubWVudCBlbnRyaWVzLiBFYWNoIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLQkgKiBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbnZpcm9ubWVudFByb3BzKCkgewotCQlpZiAoZW52aXJvbm1lbnRQcm9wcyA9PSBudWxsKSB7Ci0JCQllbnZpcm9ubWVudFByb3BzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVudkVudHJ5LmNsYXNzLCB0aGlzLCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WSVJPTk1FTlRfUFJPUFMpOwotCQl9Ci0JCXJldHVybiBlbnZpcm9ubWVudFByb3BzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIENvbnRhaW5zIGEgbGlzdCBvZiBlamItcmVmIGVsZW1lbnRzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotCSAqIGFuIGVudGVycHJpc2UKLQkgKiBiZWFuJ3MgaG9tZS4gCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVqYlJlZmVyZW5jZXMoKSB7Ci0JCWlmIChlamJSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWVqYlJlZmVyZW5jZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiUmVmLmNsYXNzLCB0aGlzLCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRkVSRU5DRVMpOwotCQl9Ci0JCXJldHVybiBlamJSZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotCSAqIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZQotCSAqIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLQkgKiBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUKLQkgKiByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuCi0JICogCi0JICogVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0JICogCi0JICogRXhhbXBsZToKLQkgKiAKLQkgKiA8cmVzb3VyY2UtZW52LXJlZj4KLQkgKiAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvL1N0b2NrUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0JICogICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC8vcmVzb3VyY2UtZW52LXJlZi10eXBlPgotCSAqIDwvL3Jlc291cmNlLWVudi1yZWY+Ci0KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEEgY2xhc3MgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBhIG5vIGFyZ3MgY29uc3RydWN0b3IgYW5kIG11c3QgaW1wbGVtZW50IHRoZSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlciBpbnRlcmZhY2UuICBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgYW5kIHVzZWQgYnkgdGhlIGNvbnRhaW5lciB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRDYWxsYmFja0hhbmRsZXIoKSB7Ci0JCWlmIChjYWxsYmFja0hhbmRsZXIgIT0gbnVsbCAmJiBjYWxsYmFja0hhbmRsZXIuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZENhbGxiYWNrSGFuZGxlciA9IChJbnRlcm5hbEVPYmplY3QpY2FsbGJhY2tIYW5kbGVyOwotCQkJY2FsbGJhY2tIYW5kbGVyID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZENhbGxiYWNrSGFuZGxlcik7Ci0JCQlpZiAoY2FsbGJhY2tIYW5kbGVyICE9IG9sZENhbGxiYWNrSGFuZGxlcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSLCBvbGRDYWxsYmFja0hhbmRsZXIsIGNhbGxiYWNrSGFuZGxlcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjYWxsYmFja0hhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldENhbGxiYWNrSGFuZGxlcigpIHsKLQkJcmV0dXJuIGNhbGxiYWNrSGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWxsYmFja0hhbmRsZXIoSmF2YUNsYXNzIG5ld0NhbGxiYWNrSGFuZGxlcikgewotCQlpZiAoKGNhbGxiYWNrSGFuZGxlciA9PSBudWxsIHx8IGNhbGxiYWNrSGFuZGxlci5nZXRRdWFsaWZpZWROYW1lKCkgPT0gbnVsbCkKLQkJCQkmJiAobmV3Q2FsbGJhY2tIYW5kbGVyID09IG51bGwgfHwgbmV3Q2FsbGJhY2tIYW5kbGVyLmdldFF1YWxpZmllZE5hbWUoKSA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUphdmFDbGFzcyBvbGRDYWxsYmFja0hhbmRsZXIgPSBjYWxsYmFja0hhbmRsZXI7Ci0JCWNhbGxiYWNrSGFuZGxlciA9IG5ld0NhbGxiYWNrSGFuZGxlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVIsIG9sZENhbGxiYWNrSGFuZGxlciwgY2FsbGJhY2tIYW5kbGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlcnZpY2VSZWZzKCkgewotCQlpZiAoc2VydmljZVJlZnMgPT0gbnVsbCkgewotCQkJc2VydmljZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZi5jbGFzcywgdGhpcywgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgdGhpcywgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25zID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCB0aGlzLCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WSVJPTk1FTlRfUFJPUFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZpcm9ubWVudFByb3BzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVmZXJlbmNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlUmVmcygpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WSVJPTk1FTlRfUFJPUFM6Ci0JCQkJcmV0dXJuIGdldEVudmlyb25tZW50UHJvcHMoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRFamJSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0Q2FsbGJhY2tIYW5kbGVyKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0Q2FsbGJhY2tIYW5kbGVyKCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZzKCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZJUk9OTUVOVF9QUk9QUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGRVJFTkNFUzoKLQkJCQlnZXRFamJSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUjoKLQkJCQlzZXRDYWxsYmFja0hhbmRsZXIoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VOVklST05NRU5UX1BST1BTOgotCQkJCWdldEVudmlyb25tZW50UHJvcHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTOgotCQkJCWdldEVqYlJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUjoKLQkJCQlzZXRDYWxsYmFja0hhbmRsZXIoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbCA6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlUmVmcyAhPSBudWxsICYmICFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WSVJPTk1FTlRfUFJPUFM6Ci0JCQkJcmV0dXJuIGVudmlyb25tZW50UHJvcHMgIT0gbnVsbCAmJiAhZW52aXJvbm1lbnRQcm9wcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZWpiUmVmZXJlbmNlcyAhPSBudWxsICYmICFlamJSZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZUVudlJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VFbnZSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVI6Ci0JCQkJcmV0dXJuIGNhbGxiYWNrSGFuZGxlciAhPSBudWxsOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBzZXJ2aWNlUmVmcyAhPSBudWxsICYmICFzZXJ2aWNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9uUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9ucyAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDJkNGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5IHsKLQotCS8qKgotCSAqIE1ldGhvZCByZWdpc3RlckR0ZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHRkcygpIHsKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzIsICJhcHBsaWNhdGlvbi1jbGllbnRfMV8yLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfQUxUX1NZU1RFTUlEXzFfMiwgImFwcGxpY2F0aW9uLWNsaWVudF8xLjIuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzMsICJhcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfQUxUX1NZU1RFTUlEXzFfMywgImFwcGxpY2F0aW9uLWNsaWVudF8xLjMuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TQ0hFTUFfTE9DXzFfNCwgImFwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIik7IC8vJE5PTi1OTFMtMSQJCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeSgpIHsKLQkJc3VwZXIoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeS4KLQkgKiBAcGFyYW0gYVJlbmRlcmVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKFVSSSwgUmVuZGVyZXIpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1NIT1JUX05BTUUsIG5ldyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCXJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCWFSZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfU0hPUlRfTkFNRSwgbmV3IEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJX09CSik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxNjI0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwuCi0JICogQHBhcmFtIHVyaQotCSAqIEBwYXJhbSBhUmVuZGVyZXIKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwuCi0JICogQHBhcmFtIGFSZW5kZXJlcgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIEVMaXN0LgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBnZXRBcHBsaWNhdGlvbkNsaWVudCgpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudCkgZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotCQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEFQUF9DTElFTlRfVFlQRTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1N5c3RlbUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NZU1RFTUlEXzFfMjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKMkVFX0FsdF8xXzJfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfQUxUX1NZU1RFTUlEXzFfMjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8zX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0FMVF9TWVNURU1JRF8xXzM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMjsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfUFVCTElDSURfMV8zOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgewotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCQkJCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRE9DVFlQRTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0Um9vdFRyYW5zbGF0b3IoKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25DbGllbnRUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQotCS8qIEFwcCBjbGllbnQgdmVyc2lvbiBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIEoyRUUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIGdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQkvKiAKLQkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewotCQlzdXBlci5zZXRWZXJzaW9uSUQoaWQpOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJY2FzZSAoSjJFRV8xXzRfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JCS8qCi0JCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uKFNhbWUgYXMgSjJFRSBWZXJzaW9uIGZvciBBcHAgY2xpZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIHsKLQkJcHJpbVNldFZlcnNpb25JRChpZCk7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCQkJY2FzZSAoSjJFRV8xXzRfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQkJfQotCQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQkJfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5pbXBsLlhNTFJlc291cmNlSW1wbCNzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50IGNsdCA9IGdldEFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0JCWlmIChjbHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJU3RyaW5nIHZlcnNpb24gPSBjbHQuZ2V0VmVyc2lvbigpOwotCQlTdHJpbmcgbmV3VmVyc2lvbiA9IGdldE1vZHVsZVZlcnNpb25TdHJpbmcoKTsKLQkJaWYgKCFuZXdWZXJzaW9uLmVxdWFscyh2ZXJzaW9uKSkKLQkJCWNsdC5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9DbGllbnRGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQ2xpZW50RmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiMmY3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9DbGllbnRGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LlJlc0F1dGhBcHBsaWNhdGlvblR5cGU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50RmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBDbGllbnRGYWN0b3J5IHsKLSAKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGllbnRGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlDbGllbnRGYWN0b3J5IHRoZUNsaWVudEZhY3RvcnkgPSAoQ2xpZW50RmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiY2xpZW50LnhtaSIpOyAKLQkJCWlmICh0aGVDbGllbnRGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlQ2xpZW50RmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDbGllbnRGYWN0b3J5SW1wbCgpOwotCX0KLQotCXB1YmxpYyBDbGllbnRGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsgCQkKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlQ6IHJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5SRVNfQVVUSF9BUFBMSUNBVElPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVSZXNBdXRoQXBwbGljYXRpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDbGllbnRQYWNrYWdlLlJFU19BVVRIX0FQUExJQ0FUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXNBdXRoQXBwbGljYXRpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotcHVibGljIHN0YXRpYyBDbGllbnRGYWN0b3J5IGdldEFjdGl2ZUZhY3RvcnkoKSB7Ci0JcmV0dXJuIChDbGllbnRGYWN0b3J5KSBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpIHsKLQkJQXBwbGljYXRpb25DbGllbnRJbXBsIGFwcGxpY2F0aW9uQ2xpZW50ID0gbmV3IEFwcGxpY2F0aW9uQ2xpZW50SW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYXRpb25DbGllbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc0F1dGhBcHBsaWNhdGlvblR5cGUgY3JlYXRlUmVzQXV0aEFwcGxpY2F0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlSZXNBdXRoQXBwbGljYXRpb25UeXBlIHJlc3VsdCA9IFJlc0F1dGhBcHBsaWNhdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlc0F1dGhBcHBsaWNhdGlvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ2xpZW50UGFja2FnZSBnZXRDbGllbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gKENsaWVudFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsaWVudFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIENsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQ2xpZW50UGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0NsaWVudFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YTUzMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQ2xpZW50UGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuUmVzQXV0aEFwcGxpY2F0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ2xpZW50UGFja2FnZSwgRVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcmVzQXV0aEFwcGxpY2F0aW9uVHlwZUVFbnVtID0gbnVsbDsKLQotCQkgICAvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByaXZhdGUgQ2xpZW50UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIENsaWVudEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsaWVudFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKENsaWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBDbGllbnRQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQ2xpZW50UGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlQ2xpZW50UGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgewotCQlyZXR1cm4gYXBwbGljYXRpb25DbGllbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZpcm9ubWVudFByb3BzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9FamJSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRSZXNBdXRoQXBwbGljYXRpb25UeXBlKCkgewotCQlyZXR1cm4gcmVzQXV0aEFwcGxpY2F0aW9uVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDbGllbnRGYWN0b3J5IGdldENsaWVudEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoQ2xpZW50RmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUFBMSUNBVElPTl9DTElFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX0VOVklST05NRU5UX1BST1BTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGRVJFTkNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCXJlc0F1dGhBcHBsaWNhdGlvblR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFJFU19BVVRIX0FQUExJQ0FUSU9OX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQlKYXZhUmVmUGFja2FnZSB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIkFwcGxpY2F0aW9uQ2xpZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkNsaWVudF9WZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0Vudmlyb25tZW50UHJvcHMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRFbnZFbnRyeSgpLCBudWxsLCAiZW52aXJvbm1lbnRQcm9wcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmZXJlbmNlcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiY2FsbGJhY2tIYW5kbGVyIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCksIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGVDb21tb25QYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0ocmVzQXV0aEFwcGxpY2F0aW9uVHlwZUVFbnVtLCBSZXNBdXRoQXBwbGljYXRpb25UeXBlLmNsYXNzLCAiUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aEFwcGxpY2F0aW9uVHlwZUVFbnVtLCBSZXNBdXRoQXBwbGljYXRpb25UeXBlLkFQUExJQ0FUSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aEFwcGxpY2F0aW9uVHlwZUVFbnVtLCBSZXNBdXRoQXBwbGljYXRpb25UeXBlLkNPTlRBSU5FUl9MSVRFUkFMKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vQ2xpZW50UGFja2FnZUltcGwKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvdXRpbC9DbGllbnRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ3MGNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotcHVibGljIGNsYXNzIENsaWVudEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIENsaWVudFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHVibGljIENsaWVudEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IChDbGllbnRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSk7Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCl0eXBlKS5lQ2xhc3MoKS5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xpZW50U3dpdGNoIHN3ID0gbmV3IENsaWVudFN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnQoQXBwbGljYXRpb25DbGllbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25DbGllbnRBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKXN3LmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25DbGllbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZUdlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xpZW50U3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IENsaWVudFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50KEFwcGxpY2F0aW9uQ2xpZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJHZW4oTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25DbGllbnRBZGFwdGVyR2VuKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vQ2xpZW50QWRhcHRlckZhY3RvcnkKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvdXRpbC9DbGllbnRTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNkMTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ2xpZW50UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENsaWVudFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVDogewotCQkJCUFwcGxpY2F0aW9uQ2xpZW50IGFwcGxpY2F0aW9uQ2xpZW50ID0gKEFwcGxpY2F0aW9uQ2xpZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkNsaWVudChhcHBsaWNhdGlvbkNsaWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoYXBwbGljYXRpb25DbGllbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoYXBwbGljYXRpb25DbGllbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGFwcGxpY2F0aW9uQ2xpZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnQoQXBwbGljYXRpb25DbGllbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9DbGllbnRTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkMWY1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGoyZWUgQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZSBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSBhcnRpZmFjdHMgb2YgYW4gQXBwbGljYXRpb24gQ2xpZW50IGFwcAotICAgICAgICBjYW4gYmUgY3JlYXRlZCBhbmQgYWNjZXNzZWQuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tbW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0NvbW1vbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFmNzY5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tbW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vbkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21tb25GYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vbkZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWpiIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWpiIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWpiUmVmIGNyZWF0ZUVqYlJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnYgRW50cnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudiBFbnRyeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRW52RW50cnkgY3JlYXRlRW52RW50cnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlUmVmIGNyZWF0ZVJlc291cmNlUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VjdXJpdHlSb2xlUmVmIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN1cml0eVJvbGUgY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlRW52UmVmIGNyZWF0ZVJlc291cmNlRW52UmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVKQiBMb2NhbCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVKQiBMb2NhbCBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVKQkxvY2FsUmVmIGNyZWF0ZUVKQkxvY2FsUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJ1biBBcyBTcGVjaWZpZWQgSWRlbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJ1biBBcyBTcGVjaWZpZWQgSWRlbnRpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JZGVudGl0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SWRlbnRpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUlkZW50aXR5IGNyZWF0ZUlkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkljb24gVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SWNvbiBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJY29uVHlwZSBjcmVhdGVJY29uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlzcGxheU5hbWUgY3JlYXRlRGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXNzYWdlRGVzdGluYXRpb25SZWYgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1lc3NhZ2VEZXN0aW5hdGlvbiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQYXJhbVZhbHVlIGNyZWF0ZVBhcmFtVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdGlvbkdyb3VwIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN1cml0eUlkZW50aXR5IGNyZWF0ZVNlY3VyaXR5SWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVXNlQ2FsbGVySWRlbnRpdHkgY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5RTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UU5hbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVFOYW1lIGNyZWF0ZVFOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxpc3RlbmVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5MaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUoyRUVFT2JqZWN0IGNyZWF0ZUoyRUVFT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkoyRUVFIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKMkVFRUF0dHJpYnV0ZSBjcmVhdGVKMkVFRUF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBtZXRob2QgaXMgTk9UIGFwaSwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLiAgCi0JICogRU1GIHBhY2thZ2UgY2xhc3NlcyBzaG91bGQgYmUgYWNjZXNzIHZpYSB0aGVpciAiZUlOU1RBTkNFIiBzdGF0aWMgZmllbGRzCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21tb25QYWNrYWdlIGdldENvbW1vblBhY2thZ2UoKTsKLQotfSAvL0NvbW1vbkZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Db21tb25QYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tbW9uUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODNmZmFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Db21tb25QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci0KLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCUBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tb25QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImNvbW1vbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9ST0xFID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFRiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGID0gNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5WX0VOVFJZID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9SRUYgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZID0gNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfSURFTlRJVFkgPSAxNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVVNFX0NBTExFUl9JREVOVElUWSA9IDE3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJREVOVElUWSA9IDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUYgPSA1OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSWNvblR5cGVJbXBsIDxlbT5JY29uIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5JY29uVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldEljb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElDT05fVFlQRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lSW1wbCA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNQTEFZX05BTUUgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbCA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBUkFNX1ZBTFVFID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXREZXNjcmlwdGlvbkdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX0dST1VQID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUCA9IDIxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KTkRJRW52UmVmc0dyb3VwSW1wbCA8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVAgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT04gPSAxODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsIDxlbT5RTmFtZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0UU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUU5BTUUgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTGlzdGVuZXJJbXBsIDxlbT5MaXN0ZW5lcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0TGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTElTVEVORVIgPSAyMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVGX1RZUEUgPSAyNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5WX0VOVFJZX1RZUEUgPSAyNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTX0FVVEhfVFlQRV9CQVNFID0gMjU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU19TSEFSSU5HX1NDT1BFX1RZUEUgPSAyNzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRSA9IDI4OwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJjb21tb24ueG1pIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tbW9uUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRKMkVFRU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKMkVFRV9PQkpFQ1QgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUZfX05BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUZfX1RZUEUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUZfX0hPTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUZfX1JFTU9URSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFRl9fTElOSyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFRl9fREVTQ1JJUFRJT04gPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9fREVTQ1JJUFRJT05TID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVqYiBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9GRUFUVVJFX0NPVU5UID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVl9FTlRSWV9fREVTQ1JJUFRJT04gPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVl9FTlRSWV9fTkFNRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5WX0VOVFJZX19WQUxVRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5WX0VOVFJZX19UWVBFID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVl9FTlRSWV9fREVTQ1JJUFRJT05TID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVudiBFbnRyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX05BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fVFlQRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX19BVVRIID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9SRUZfX0xJTksgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlMgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9GRUFUVVJFX0NPVU5UID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX19OQU1FID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT04gPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX19MSU5LID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlMgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9SRUZfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX19ERVNDUklQVElPTiA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTiA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fVFlQRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19OQU1FID0gRUpCX1JFRl9fTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fVFlQRSA9IEVKQl9SRUZfX1RZUEU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0hPTUUgPSBFSkJfUkVGX19IT01FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19SRU1PVEUgPSBFSkJfUkVGX19SRU1PVEU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0xJTksgPSBFSkJfUkVGX19MSU5LOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTiA9IEVKQl9SRUZfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUyA9IEVKQl9SRUZfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRSA9IEVKQl9SRUZfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19MT0NBTCA9IEVKQl9SRUZfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RUpCIExvY2FsIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX0ZFQVRVUkVfQ09VTlQgPSBFSkJfUkVGX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTiA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlMgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfSURFTlRJVFlfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19ERVNDUklQVElPTiA9IFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0RFU0NSSVBUSU9OUyA9IFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFkgPSBTRUNVUklUWV9JREVOVElUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UnVuIEFzIFNwZWNpZmllZCBJZGVudGl0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBTRUNVUklUWV9JREVOVElUWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJREVOVElUWV9fREVTQ1JJUFRJT04gPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElERU5USVRZX19ST0xFX05BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJREVOVElUWV9fREVTQ1JJUFRJT05TID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklkZW50aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElERU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElDT05fVFlQRV9fU01BTExfSUNPTiA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUNPTl9UWVBFX19MQVJHRV9JQ09OID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJQ09OX1RZUEVfX0xBTkcgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SWNvbiBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElDT05fVFlQRV9GRUFUVVJFX0NPVU5UID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNQTEFZX05BTUVfX0xBTkcgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNQTEFZX05BTUVfX1ZBTFVFID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNQTEFZX05BTUVfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1VTQUdFID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlMgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfRkVBVFVSRV9DT1VOVCA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUyA9IERFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTID0gREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlMgPSBERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OID0gREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT04gPSBERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FID0gREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUVTID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fU01BTExfSUNPTiA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX0xBUkdFX0lDT04gPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fREVTQ1JJUFRJT04gPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUUgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX05BTUUgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9GRUFUVVJFX0NPVU5UID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1fVkFMVUVfX05BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9fVkFMVUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9fREVTQ1JJUFRJT04gPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX0lDT05TID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9FTlZfUkVGU19HUk9VUF9fRElTUExBWV9OQU1FUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0VOVl9SRUZTX0dST1VQX19ERVNDUklQVElPTlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX1NNQUxMX0lDT04gPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0VOVl9SRUZTX0dST1VQX19MQVJHRV9JQ09OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX0RFU0NSSVBUSU9OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9FTlZfUkVGU19HUk9VUF9fRElTUExBWV9OQU1FID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudmlyb25tZW50IFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX0VOVklST05NRU5UX1BST1BFUlRJRVMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX1JFRlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfUkVGUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX0xPQ0FMX1JFRlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVTRV9DQUxMRVJfSURFTlRJVFlfX0RFU0NSSVBUSU9OID0gU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVVNFX0NBTExFUl9JREVOVElUWV9fREVTQ1JJUFRJT05TID0gU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVTRV9DQUxMRVJfSURFTlRJVFlfRkVBVFVSRV9DT1VOVCA9IFNFQ1VSSVRZX0lERU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9fTEFORyA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX19WQUxVRSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRTkFNRV9fTkFNRVNQQUNFX1VSSSA9IEoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBQYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUU5BTUVfX0xPQ0FMX1BBUlQgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRTkFNRV9fQ09NQklORURfUU5BTUUgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJID0gSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFOQU1FX0ZFQVRVUkVfQ09VTlQgPSBKMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19JQ09OUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19ESVNQTEFZX05BTUVTID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19ERVNDUklQVElPTlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19TTUFMTF9JQ09OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfX0xBUkdFX0lDT04gPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfX0RFU0NSSVBUSU9OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfX0RJU1BMQVlfTkFNRSA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lciBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19MSVNURU5FUl9DTEFTUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGlzdGVuZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfRkVBVFVSRV9DT1VOVCA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFQXR0cmlidXRlSW1wbCA8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVBdHRyaWJ1dGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRKMkVFRUF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEUgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSjJFRUVfQVRUUklCVVRFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fT1JERVJFRCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19PUkRFUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX01BTlkgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fUkVRVUlSRUQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX0VUWVBFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX0NIQU5HRUFCTEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fQ0hBTkdFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fVk9MQVRJTEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVk9MQVRJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSjJFRUVfQVRUUklCVVRFX19UUkFOU0lFTlQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVFJBTlNJRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgTGl0ZXJhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSjJFRUVfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5zZXR0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19VTlNFVFRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlcml2ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX0RFUklWRUQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fREVSSVZFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQ29udGFpbmluZyBDbGFzczwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSjJFRUVfQVRUUklCVVRFX19JRCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKMkVFRV9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19FQVRUUklCVVRFX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEoyRUVFX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlY3VyaXR5Um9sZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VjdXJpdHlSb2xlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJlc291cmNlUmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRSZXNvdXJjZVJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX1R5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VSZWZfQXV0aCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9MaW5rKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX1Jlc1NoYXJpbmdTY29wZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFamJSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVqYlJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJSZWZfTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJSZWZfVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJSZWZfSG9tZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFamJSZWZfUmVtb3RlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9MaW5rKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFamJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVqYlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRUpCTG9jYWxSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVKQkxvY2FsUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZiNnZXRMb2NhbEhvbWUgPGVtPkxvY2FsIEhvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmI2dldExvY2FsSG9tZSgpCi0JICogQHNlZSAjZ2V0RUpCTG9jYWxSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQkxvY2FsUmVmX0xvY2FsSG9tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWYjZ2V0TG9jYWwgPGVtPkxvY2FsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWYjZ2V0TG9jYWwoKQotCSAqIEBzZWUgI2dldEVKQkxvY2FsUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJMb2NhbFJlZl9Mb2NhbCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFbnZFbnRyeSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RW52RW50cnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9WYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnkjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFbnZFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlY3VyaXR5Um9sZVJlZiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VjdXJpdHlSb2xlUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZVJlZl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVSZWZfTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGVSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0UnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5X0lkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlY3VyaXR5SWRlbnRpdHkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5SWRlbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFVzZUNhbGxlcklkZW50aXR5IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRVc2VDYWxsZXJJZGVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldExhbmcoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdGlvbl9MYW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUgPGVtPlFOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlFOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRRTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXROYW1lc3BhY2VVUkkoKQotCSAqIEBzZWUgI2dldFFOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRRTmFtZV9OYW1lc3BhY2VVUkkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldExvY2FsUGFydCA8ZW0+TG9jYWwgUGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2FsIFBhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TG9jYWxQYXJ0KCkKLQkgKiBAc2VlICNnZXRRTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UU5hbWVfTG9jYWxQYXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXRDb21iaW5lZFFOYW1lIDxlbT5Db21iaW5lZCBRTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldENvbWJpbmVkUU5hbWUoKQotCSAqIEBzZWUgI2dldFFOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRRTmFtZV9Db21iaW5lZFFOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkgPGVtPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldEludGVybmFsUHJlZml4T3JOc1VSSSgpCi0JICogQHNlZSAjZ2V0UU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFFOYW1lX0ludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyIDxlbT5MaXN0ZW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyI2dldExpc3RlbmVyQ2xhc3MgPGVtPkxpc3RlbmVyIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TGlzdGVuZXIgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXIjZ2V0TGlzdGVuZXJDbGFzcygpCi0JICogQHNlZSAjZ2V0TGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExpc3RlbmVyX0xpc3RlbmVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAjZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U21hbGwgSWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRTbWFsbEljb24oKQotCSAqIEBzZWUgI2dldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhcmdlIEljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAc2VlICNnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAc2VlICNnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SjJFRUVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZSA8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkoyRUVFIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SjJFRUVBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSWRlbnRpdHkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldElkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldElkZW50aXR5X0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldElkZW50aXR5X1JvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLklkZW50aXR5I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHkjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRJZGVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SWRlbnRpdHlfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUgPGVtPkljb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JY29uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEljb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlI2dldFNtYWxsSWNvbigpCi0JICogQHNlZSAjZ2V0SWNvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEljb25UeXBlX1NtYWxsSWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRMYXJnZUljb24oKQotCSAqIEBzZWUgI2dldEljb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJY29uVHlwZV9MYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlI2dldExhbmcoKQotCSAqIEBzZWUgI2dldEljb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJY29uVHlwZV9MYW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFuZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSNnZXRMYW5nKCkKLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlzcGxheU5hbWVfTGFuZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNwbGF5TmFtZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0VXNhZ2UgPGVtPlVzYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNhZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldFVzYWdlKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9Vc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldExpbmsgPGVtPkxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRMaW5rKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbiA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQYXJhbVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBhcmFtVmFsdWVfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCA8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRpb25Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldEljb25zIDxlbT5JY29uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWNvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCNnZXRJY29ucygpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25Hcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVzY3JpcHRpb25Hcm91cF9JY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25Hcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbkdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAgPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRKTkRJRW52UmVmc0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzIDxlbT5FbnZpcm9ubWVudCBQcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnZpcm9ubWVudCBQcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX0Vudmlyb25tZW50UHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFJlc291cmNlUmVmcygpCi0JICogQHNlZSAjZ2V0Sk5ESUVudlJlZnNHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRFamJSZWZzKCkKLQkgKiBAc2VlICNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX0VqYlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFJlc291cmNlRW52UmVmcygpCi0JICogQHNlZSAjZ2V0Sk5ESUVudlJlZnNHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldEVqYkxvY2FsUmVmcygpCi0JICogQHNlZSAjZ2V0Sk5ESUVudlJlZnNHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBzZWUgI2dldEpORElFbnZSZWZzR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpORElFbnZSZWZzR3JvdXBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAc2VlICNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX1NlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJlc291cmNlRW52UmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRSZXNvdXJjZUVudlJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlRW52UmVmX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRWpiUmVmVHlwZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRFamJSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVudkVudHJ5VHlwZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRFbnZFbnRyeVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUmVzQXV0aFR5cGVCYXNlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFJlc0F1dGhUeXBlQmFzZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBSZXNTaGFyaW5nU2NvcGVUeXBlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFJlc1NoYXJpbmdTY29wZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUNvbW1vbkZhY3RvcnkgZ2V0Q29tbW9uRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRWpiUmVmSW1wbCA8ZW0+RWpiIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRFamJSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUpCX1JFRiA9IGVJTlNUQU5DRS5nZXRFamJSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVGX19OQU1FID0gZUlOU1RBTkNFLmdldEVqYlJlZl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFRl9fVFlQRSA9IGVJTlNUQU5DRS5nZXRFamJSZWZfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUZfX0hPTUUgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmX0hvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUZfX1JFTU9URSA9IGVJTlNUQU5DRS5nZXRFamJSZWZfUmVtb3RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFRl9fTElOSyA9IGVJTlNUQU5DRS5nZXRFamJSZWZfTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfUkVGX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRFamJSZWZfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFRl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEVqYlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVudkVudHJ5SW1wbCA8ZW0+RW52IEVudHJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRW52RW50cnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0RW52RW50cnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRU5WX0VOVFJZID0gZUlOU1RBTkNFLmdldEVudkVudHJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVl9FTlRSWV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlZfRU5UUllfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlZfRU5UUllfX1ZBTFVFID0gZUlOU1RBTkNFLmdldEVudkVudHJ5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRU5WX0VOVFJZX19UWVBFID0gZUlOU1RBTkNFLmdldEVudkVudHJ5X1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5WX0VOVFJZX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGwgPGVtPlJlc291cmNlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldFJlc291cmNlUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFU09VUkNFX1JFRiA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfUkVGX19OQU1FID0gZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9SRUZfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX1JFRl9fQVVUSCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9BdXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfUkVGX19MSU5LID0gZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX0xpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9SZXNTaGFyaW5nU2NvcGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5TZWN1cml0eVJvbGVSZWZJbXBsIDxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZVJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRTZWN1cml0eVJvbGVSZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VDVVJJVFlfUk9MRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfUk9MRV9SRUZfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1VSSVRZX1JPTEVfUkVGX19MSU5LID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZl9MaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuU2VjdXJpdHlSb2xlSW1wbCA8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Um9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRTZWN1cml0eVJvbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VDVVJJVFlfUk9MRSA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNVUklUWV9ST0xFX19ST0xFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwgPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRSZXNvdXJjZUVudlJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVNPVVJDRV9FTlZfUkVGID0gZUlOU1RBTkNFLmdldFJlc291cmNlRW52UmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfRU5WX1JFRl9fVFlQRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVKQkxvY2FsUmVmSW1wbCA8ZW0+RUpCIExvY2FsIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVKQkxvY2FsUmVmSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldEVKQkxvY2FsUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVKQl9MT0NBTF9SRUYgPSBlSU5TVEFOQ0UuZ2V0RUpCTG9jYWxSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FID0gZUlOU1RBTkNFLmdldEVKQkxvY2FsUmVmX0xvY2FsSG9tZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFSkJfTE9DQUxfUkVGX19MT0NBTCA9IGVJTlNUQU5DRS5nZXRFSkJMb2NhbFJlZl9Mb2NhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUnVuQXNTcGVjaWZpZWRJZGVudGl0eUltcGwgPGVtPlJ1biBBcyBTcGVjaWZpZWQgSWRlbnRpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SdW5Bc1NwZWNpZmllZElkZW50aXR5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWSA9IGVJTlNUQU5DRS5nZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZGVudGl0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZID0gZUlOU1RBTkNFLmdldFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfSWRlbnRpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLklkZW50aXR5SW1wbCA8ZW0+SWRlbnRpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5JZGVudGl0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRJZGVudGl0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJREVOVElUWSA9IGVJTlNUQU5DRS5nZXRJZGVudGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJREVOVElUWV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0SWRlbnRpdHlfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElERU5USVRZX19ST0xFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SWRlbnRpdHlfUm9sZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSURFTlRJVFlfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRJZGVudGl0eV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkljb25UeXBlSW1wbCA8ZW0+SWNvbiBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSWNvblR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0SWNvblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSUNPTl9UWVBFID0gZUlOU1RBTkNFLmdldEljb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSUNPTl9UWVBFX19TTUFMTF9JQ09OID0gZUlOU1RBTkNFLmdldEljb25UeXBlX1NtYWxsSWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElDT05fVFlQRV9fTEFSR0VfSUNPTiA9IGVJTlNUQU5DRS5nZXRJY29uVHlwZV9MYXJnZUljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJQ09OX1RZUEVfX0xBTkcgPSBlSU5TVEFOQ0UuZ2V0SWNvblR5cGVfTGFuZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EaXNwbGF5TmFtZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXREaXNwbGF5TmFtZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESVNQTEFZX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RGlzcGxheU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNQTEFZX05BTUVfX0xBTkcgPSBlSU5TVEFOQ0UuZ2V0RGlzcGxheU5hbWVfTGFuZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNQTEFZX05BTUVfX1ZBTFVFID0gZUlOU1RBTkNFLmdldERpc3BsYXlOYW1lX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fVVNBR0UgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1VzYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0xJTksgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0xpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25JbXBsIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVNTQUdFX0RFU1RJTkFUSU9OID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0UGFyYW1WYWx1ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQQVJBTV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUEFSQU1fVkFMVUVfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UGFyYW1WYWx1ZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBBUkFNX1ZBTFVFX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBBUkFNX1ZBTFVFX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRpb25Hcm91cCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVElPTl9HUk9VUCA9IGVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbkdyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TID0gZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uR3JvdXBfSWNvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTID0gZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsIDxlbT5KTkRJIEVudiBSZWZzIEdyb3VwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpORElfRU5WX1JFRlNfR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52aXJvbm1lbnQgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX0Vudmlyb25tZW50UHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9SRUZTID0gZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTID0gZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfUmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX0xPQ0FMX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKTkRJX0VOVl9SRUZTX0dST1VQX19TRVJWSUNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9TZXJ2aWNlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuU2VjdXJpdHlJZGVudGl0eUltcGwgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuU2VjdXJpdHlJZGVudGl0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRTZWN1cml0eUlkZW50aXR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFQ1VSSVRZX0lERU5USVRZID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuVXNlQ2FsbGVySWRlbnRpdHlJbXBsIDxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuVXNlQ2FsbGVySWRlbnRpdHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0VXNlQ2FsbGVySWRlbnRpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVVNFX0NBTExFUl9JREVOVElUWSA9IGVJTlNUQU5DRS5nZXRVc2VDYWxsZXJJZGVudGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldERlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRJT05fX0xBTkcgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25fTGFuZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklQVElPTl9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25fVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbCA8ZW0+UU5hbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRRTmFtZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBRTkFNRSA9IGVJTlNUQU5DRS5nZXRRTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFFOQU1FX19OQU1FU1BBQ0VfVVJJID0gZUlOU1RBTkNFLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgUGFydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFFOQU1FX19MT0NBTF9QQVJUID0gZUlOU1RBTkNFLmdldFFOYW1lX0xvY2FsUGFydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBRTkFNRV9fQ09NQklORURfUU5BTUUgPSBlSU5TVEFOQ0UuZ2V0UU5hbWVfQ29tYmluZWRRTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJID0gZUlOU1RBTkNFLmdldFFOYW1lX0ludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTGlzdGVuZXJJbXBsIDxlbT5MaXN0ZW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldExpc3RlbmVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExJU1RFTkVSID0gZUlOU1RBTkNFLmdldExpc3RlbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lciBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExJU1RFTkVSX19MSVNURU5FUl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQID0gZUlOU1RBTkNFLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTiA9IGVJTlNUQU5DRS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OID0gZUlOU1RBTkNFLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FID0gZUlOU1RBTkNFLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGwgPGVtPkoyRUVFIE9iamVjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldEoyRUVFT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEoyRUVFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRKMkVFRU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVBdHRyaWJ1dGVJbXBsIDxlbT5KMkVFRSBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRUF0dHJpYnV0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRKMkVFRUF0dHJpYnV0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKMkVFRV9BVFRSSUJVVEUgPSBlSU5TVEFOQ0UuZ2V0SjJFRUVBdHRyaWJ1dGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeVR5cGUgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0RW52RW50cnlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gRU5WX0VOVFJZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlIDxlbT5SZXMgQXV0aCBUeXBlIEJhc2U8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNBdXRoVHlwZUJhc2UKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRSZXNBdXRoVHlwZUJhc2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBSRVNfQVVUSF9UWVBFX0JBU0UgPSBlSU5TVEFOQ0UuZ2V0UmVzQXV0aFR5cGVCYXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmVHlwZSA8ZW0+RWpiIFJlZiBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldEVqYlJlZlR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBFSkJfUkVGX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RWpiUmVmVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc1NoYXJpbmdTY29wZVR5cGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNTaGFyaW5nU2NvcGVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFJFU19TSEFSSU5HX1NDT1BFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpOwotCi0JfQotCi19IC8vQ29tbW9uUGFja2FnZQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmMGQzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXAgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U21hbGxJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTbWFsbEljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U21hbGxJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgU21hbGwgSWNvbiBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRTbWFsbEljb25HZW4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFyZ2VJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgTGFyZ2UgSWNvbgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBMYXJnZSBJY29uCi0JICovCi0Jdm9pZCBzZXRMYXJnZUljb25HZW4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uR2VuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERpc3BsYXlOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBEaXNwbGF5IE5hbWUKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGlzcGxheSBOYW1lCi0JICovCi0Jdm9pZCBzZXREaXNwbGF5TmFtZUdlbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVwbG95bWVudEV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0RlcGxveW1lbnRFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmY2IwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVwbG95bWVudEV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVwbG95bWVudCBFeHRlbnNpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkRlcGxveW1lbnRFeHRlbnNpb24jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5EZXBsb3ltZW50RXh0ZW5zaW9uI2lzTXVzdFVuZGVyc3RhbmQgPGVtPk11c3QgVW5kZXJzdGFuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkRlcGxveW1lbnRFeHRlbnNpb24jZ2V0RXh0ZW5zaW9uRWxlbWVudHMgPGVtPkV4dGVuc2lvbiBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVwbG95bWVudEV4dGVuc2lvbigpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIERlcGxveW1lbnRFeHRlbnNpb24gZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWVzcGFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREZXBsb3ltZW50RXh0ZW5zaW9uX05hbWVzcGFjZSgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRGVwbG95bWVudEV4dGVuc2lvbiNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVzdCBVbmRlcnN0YW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdXN0IFVuZGVyc3RhbmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVzdCBVbmRlcnN0YW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNdXN0VW5kZXJzdGFuZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVwbG95bWVudEV4dGVuc2lvbl9NdXN0VW5kZXJzdGFuZCgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTXVzdFVuZGVyc3RhbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5EZXBsb3ltZW50RXh0ZW5zaW9uI2lzTXVzdFVuZGVyc3RhbmQgPGVtPk11c3QgVW5kZXJzdGFuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXVzdCBVbmRlcnN0YW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc011c3RVbmRlcnN0YW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNdXN0VW5kZXJzdGFuZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuc2lvbiBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5FeHRlbnNpYmxlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREZXBsb3ltZW50RXh0ZW5zaW9uX0V4dGVuc2lvbkVsZW1lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkV4dGVuc2libGVUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuc2lvbkVsZW1lbnRzKCk7Ci0KLX0gLy8gRGVwbG95bWVudEV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJlOWM3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgZGVzY3JpcHRpb24gdHlwZSBpcyB1c2VkIGJ5IGEgZGVzY3JpcHRpb24gZWxlbWVudCB0bwotICogcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGVsZW1lbnRzCi0gKiB0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlCi0gKiBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZSBmaWxlIHByb2R1Y2VyIHdhbnRzCi0gKiB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncwotICogRGVwbG95bWVudCBGaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZQotICogdG9vbHMgdXNlZCBieSBzdWNoIGEgRGVwbG95bWVudCBGaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheQotICogdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdAotICogY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotICogCi0gKiBUaGUgbGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLSAqIGRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGluLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24jZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRpb24gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERlc2NyaXB0aW9uX0xhbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGFuZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVzY3JpcHRpb25fVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rlc2NyaXB0aW9uR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9EZXNjcmlwdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGYyODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rlc2NyaXB0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb24gR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIGRlc2NyaXB0aW9uIHJlbGF0ZWQKLSAqIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERlc2NyaXB0aW9uR3JvdXAoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRpb25Hcm91cCBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVzY3JpcHRpb25Hcm91cF9JY29ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19IC8vIERlc2NyaXB0aW9uR3JvdXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9EaXNwbGF5TmFtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rpc3BsYXlOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOGE2ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rpc3BsYXlOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGRpc3BsYXktbmFtZSB0eXBlIGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkCi0gKiB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMuIEl0IGlzIHVzZWQgYnkgZGlzcGxheS1uYW1lCi0gKiBlbGVtZW50cy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotICogCi0gKiBFeGFtcGxlOgotICogCi0gKiAuLi4KLSAqICAgIDxkaXNwbGF5LW5hbWUgeG1sOmxhbmc9ImVuIj5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLSAqIAotICogVGhlIHZhbHVlIG9mIHRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgaXMgImVuIiAoRW5nbGlzaCkgYnkgZGVmYXVsdC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGlzcGxheU5hbWUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheU5hbWUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERpc3BsYXlOYW1lX0xhbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGFuZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGlzcGxheU5hbWVfVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEaXNwbGF5TmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VKQkxvY2FsUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRUpCTG9jYWxSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2NTMzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRUpCTG9jYWxSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotCi0KLQotLyoqCi0gKiBUaGUgZWpiLWxvY2FsLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbm90aGVyIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSByZWZlcmVuY2luZyBlbnRlcnByaXNlIGJlYW47IHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbjsgdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyBhbmQgYW4gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24uIFRoZSBvcHRpb25hbCBlamItbGluayBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0gKiBVc2VkIGluOiBlbnRpdHksIHNlc3Npb24sIG1lc3NhZ2UtZHJpdmVuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkxvY2FsUmVmIGV4dGVuZHMgRWpiUmVmewotCi0JLyoqCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExvY2FsIGF0dHJpYnV0ZQotCSAqIFRoZSBMb2NhbCBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWwoKTsKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWxIb21lIGF0dHJpYnV0ZQotCSAqIFRoZSBsb2NhbCBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lIGludGVyZmFjZS4KLQkgKiBFeGFtcGxlOiA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvL2hvbWU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbEhvbWUoKTsKLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgbG9jYWwgYXR0cmlidXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWwoU3RyaW5nIHZhbHVlKTsKLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgbG9jYWxIb21lIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsSG9tZShTdHJpbmcgdmFsdWUpOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwZGM1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRWpiUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLS8qKgotICogVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNsaWVudDsgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyBhbmQgYW4gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24uIFRoZSBvcHRpb25hbCAgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBFamJSZWYgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLS8qKgotICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMsIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBhcmFtZXRlci4KLSAqIFRoZSBlamItbGluayB2YWx1ZSBvZiB0aGUgcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgCi0gKiByZXR1cm4gbnVsbAotICovCi1wdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0TGlua2VkRWpiKEVKQkphciBlamJKYXIpOy8qKgotICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMsIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBhcmFtZXRlci4KLSAqIFRoZSBlamItbGluayB2YWx1ZSBvZiB0aGUgcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgCi0gKiByZXR1cm4gbnVsbAotICovICAKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhlIG5hbWUsIGhvbWUsIHJlbW90ZSwgYW5kIGxpbmsgYXJlIGVxdWl2YWxlbnQuCi0gKi8KLWJvb2xlYW4gaXNFcXVpdmFsZW50KEVqYlJlZiBhbkVqYlJlZikgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlZmVyZW5jZSBpcyBwaHlzaWNhbGx5IGxpbmtlZCB0bwotICogQGFuRUpCLgotICovCi1ib29sZWFuIGlzTGlua2VkKEVudGVycHJpc2VCZWFuIGFuRUpCKSA7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBlamJyZWYgaXMgZm9yIGEgbG9jYWwgZWpiIGludGVyZmFjZS4KLSAqLwotYm9vbGVhbiBpc0xvY2FsKCk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoaXMgaXMgdGhlCi0JICogSk5ESSBuYW1lIHRoYXQgdGhlIHNlcnZsZXQgY29kZSB1c2VzIHRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgZW50ZXJwcmlzZSBiZWFuLgotCSAqIEV4YW1wbGU6IDxlamItcmVmLW5hbWU+ZWpiLy9QYXlyb2xsPC8vZWpiLXJlZi1uYW1lPgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqIFRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZAotCSAqIGVudGVycHJpc2UgYmVhbi4gVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICogPGVqYi1yZWYtdHlwZT5FbnRpdHk8Ly9lamItcmVmLXR5cGU+Ci0JICogPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC8vZWpiLXJlZi10eXBlPgotCSAqLwotCUVqYlJlZlR5cGUgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWZUeXBlCi0JICogQHNlZSAjaXNTZXRUeXBlKCkKLQkgKiBAc2VlICN1bnNldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoRWpiUmVmVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWYjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAc2VlICNzZXRUeXBlKEVqYlJlZlR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWYjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShFamJSZWZUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEhvbWUgYXR0cmlidXRlCi0JICogVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzCi0JICogaG9tZSBpbnRlcmZhY2UuCi0JICogRXhhbXBsZTogPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8Ly9ob21lPgotCSAqLwotCVN0cmluZyBnZXRIb21lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgSG9tZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEhvbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSZW1vdGUgYXR0cmlidXRlCi0JICogVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLQkgKiByZW1vdGUgaW50ZXJmYWNlLgotCSAqLwotCVN0cmluZyBnZXRSZW1vdGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZW1vdGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSZW1vdGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBMaW5rIGF0dHJpYnV0ZQotCSAqIFRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYW4gRUpCCi0JICogcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGVuY29tcGFzc2luZyBKMkVFIEFwcGxpY2F0aW9uCi0JICogcGFja2FnZS4gVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuCi0JICogZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIEoyRUUgQXBwbGljYXRpb24gcGFja2FnZS4gCi0JICogRXhhbXBsZTogPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC8vZWpiLWxpbms+Ci0JICovCi0JU3RyaW5nIGdldExpbmsoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMaW5rIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQKLQkgKiBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueQotCSAqIGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotCSAqIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUKLQkgKiBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudAotCSAqIGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VqYlJlZlR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MmJlNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VqYlJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIEVqYlJlZlR5cGUge30KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVqYlJlZlR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTj0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFk9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TZXNzaW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U2Vzc2lvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVNTSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlIFNFU1NJT05fTElURVJBTCA9IG5ldyBFamJSZWZUeXBlKFNFU1NJT04sICJTZXNzaW9uIiwgIlNlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VOVElUWQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWpiUmVmVHlwZSBFTlRJVFlfTElURVJBTCA9IG5ldyBFamJSZWZUeXBlKEVOVElUWSwgIkVudGl0eSIsICJFbnRpdHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWpiUmVmVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBFamJSZWZUeXBlW10gewotCQkJU0VTU0lPTl9MSVRFUkFMLAotCQkJRU5USVRZX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWpiUmVmVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUVqYlJlZlR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFamJSZWZUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRWpiUmVmVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWpiUmVmVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgU0VTU0lPTjogcmV0dXJuIFNFU1NJT05fTElURVJBTDsKLQkJCWNhc2UgRU5USVRZOiByZXR1cm4gRU5USVRZX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVqYlJlZlR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL0VqYlJlZlR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FbnZFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2M2Q0YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIFRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQgZW50cmllcy4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW52RW50cnkgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQKLQkgKiBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueQotCSAqIGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotCSAqIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUKLQkgKiBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudAotCSAqIGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLQkgKiBlbnZpcm9ubWVudCBlbnRyeS4gCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFZhbHVlIGF0dHJpYnV0ZQotCSAqIFRoZSBlbnYtZW50cnktdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLQkgKiBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlIGNvbnN0cnVjdG9yIAotCSAqIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIuCi0JICogVXNlZCBpbjogZW52LWVudHJ5Ci0JICogRXhhbXBsZToKLQkgKiA8ZW52LWVudHJ5LXZhbHVlPi8vZGF0YXNvdXJjZXMvL015RGF0YWJhc2U8Ly9lbnYtZW50cnktdmFsdWU+Ci0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVmFsdWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFR5cGUgYXR0cmlidXRlCi0JICogVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YgdGhlCi0JICogZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MgY29kZS4gVGhlCi0JICogZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOiBqYXZhLmxhbmcuQm9vbC1lYW4sCi0JICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLAotCSAqIGphdmEubGFuZy5TaG9ydCwgamF2YS5sYW5nLkxvbmcsIGFuZCBqYXZhLmxhbmcuRmxvYXQuIAotCSAqIEV4YW1wbGU6IDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvL2Vudi1lbnRyeS10eXBlPgotCSAqLwotCUVudkVudHJ5VHlwZSBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnkjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnlUeXBlCi0JICogQHNlZSAjaXNTZXRUeXBlKCkKLQkgKiBAc2VlICN1bnNldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoRW52RW50cnlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShFbnZFbnRyeVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAc2VlICNzZXRUeXBlKEVudkVudHJ5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmM5ZGRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FbnZFbnRyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIEVudkVudHJ5VHlwZSB7fQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW52RW50cnlUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklORz0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR0VSPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU49IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJZVEU9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlQ9IDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9ORz0gNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTE9BVD0gNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFSQUNURVI9IDg7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdHJpbmc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TdHJpbmc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RSSU5HCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgU1RSSU5HX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKFNUUklORywgIlN0cmluZyIsICJTdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SW50ZWdlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkludGVnZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5URUdFUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIElOVEVHRVJfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoSU5URUdFUiwgIkludGVnZXIiLCAiSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Cb29sZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Qm9vbGVhbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNCT09MRUFOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgQk9PTEVBTl9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShCT09MRUFOLCAiQm9vbGVhbiIsICJCb29sZWFuIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRvdWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRvdWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNET1VCTEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBET1VCTEVfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoRE9VQkxFLCAiRG91YmxlIiwgIkRvdWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CeXRlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Qnl0ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNCWVRFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgQllURV9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShCWVRFLCAiQnl0ZSIsICJCeXRlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNob3J0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U2hvcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0hPUlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBTSE9SVF9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShTSE9SVCwgIlNob3J0IiwgIlNob3J0Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvbmc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb25nPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPTkcKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBMT05HX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKExPTkcsICJMb25nIiwgIkxvbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RmxvYXQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GbG9hdDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGTE9BVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIEZMT0FUX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEZMT0FULCAiRmxvYXQiLCAiRmxvYXQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q2hhcmFjdGVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q2hhcmFjdGVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NIQVJBQ1RFUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIENIQVJBQ1RFUl9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShDSEFSQUNURVIsICJDaGFyYWN0ZXIiLCAiQ2hhcmFjdGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEVudkVudHJ5VHlwZVtdIHsKLQkJCVNUUklOR19MSVRFUkFMLAotCQkJSU5URUdFUl9MSVRFUkFMLAotCQkJQk9PTEVBTl9MSVRFUkFMLAotCQkJRE9VQkxFX0xJVEVSQUwsCi0JCQlCWVRFX0xJVEVSQUwsCi0JCQlTSE9SVF9MSVRFUkFMLAotCQkJTE9OR19MSVRFUkFMLAotCQkJRkxPQVRfTElURVJBTCwKLQkJCUNIQVJBQ1RFUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnZFbnRyeVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlFbnZFbnRyeVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudkVudHJ5VHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUVudkVudHJ5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW52IEVudHJ5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnZFbnRyeVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFNUUklORzogcmV0dXJuIFNUUklOR19MSVRFUkFMOwotCQkJY2FzZSBJTlRFR0VSOiByZXR1cm4gSU5URUdFUl9MSVRFUkFMOwotCQkJY2FzZSBCT09MRUFOOiByZXR1cm4gQk9PTEVBTl9MSVRFUkFMOwotCQkJY2FzZSBET1VCTEU6IHJldHVybiBET1VCTEVfTElURVJBTDsKLQkJCWNhc2UgQllURTogcmV0dXJuIEJZVEVfTElURVJBTDsKLQkJCWNhc2UgU0hPUlQ6IHJldHVybiBTSE9SVF9MSVRFUkFMOwotCQkJY2FzZSBMT05HOiByZXR1cm4gTE9OR19MSVRFUkFMOwotCQkJY2FzZSBGTE9BVDogcmV0dXJuIEZMT0FUX0xJVEVSQUw7Ci0JCQljYXNlIENIQVJBQ1RFUjogcmV0dXJuIENIQVJBQ1RFUl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFbnZFbnRyeVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL0VudkVudHJ5VHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0V4dGVuc2libGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRXh0ZW5zaWJsZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiNzlhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRXh0ZW5zaWJsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbnNpYmxlIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkV4dGVuc2libGVUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RXh0ZW5zaWJsZVR5cGUoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbnNpYmxlVHlwZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RXh0ZW5zaWJsZVR5cGVfVmFsdWUoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRXh0ZW5zaWJsZVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5zaWJsZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9JY29uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0ljb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZGFkNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0ljb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkljb24gVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cwotICogdGhhdCBzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yCi0gKiBKUEVHIGljb24gaW1hZ2VzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhCi0gKiBHVUkgdG9vbC4KLSAqIAotICogVGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotICogaWNvbiBmaWxlIG5hbWVzIGFyZSBwcm92aWRlZCBpbi4gSXRzIHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpCi0gKiBieSBkZWZhdWx0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRJY29uVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJY29uVHlwZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0JICogICAgICAgICBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi0JICogICAgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQKLQkgKiAgICAgICAgIENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZS4KLQkgKiAKLQkgKiAgICAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi0JICogICAgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogICAgICAgICA8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNtYWxsSWNvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRJY29uVHlwZV9TbWFsbEljb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUjZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotCSAqICAgICAgICAgY29udGFpbmluZyBhIGxhcmdlCi0JICogICAgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlCi0JICogICAgICAgICBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50Ci0JICogICAgICAgICBGaWxlLgotCSAqIAotCSAqICAgICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLQkgKiAgICAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAKLQkgKiAgICAgICAgIDxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFyZ2VJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEljb25UeXBlX0xhcmdlSWNvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0SWNvblR5cGVfTGFuZygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFuZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEljb25UeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSWRlbnRpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9JZGVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDFlYTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9JZGVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotLyoqCi0gKiBTcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aXR5IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIAotCSAqIHRoZSBydW4gYXMgaWRlbnRpdHkuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIKLQkgKiB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuCi0JICogVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUKLQkgKiBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUm9sZU5hbWUgYXR0cmlidXRlCi0JICogVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQkgKiAKLQkgKiBUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0JICovCi0JU3RyaW5nIGdldFJvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUm9sZU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldElkZW50aXR5X0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0oyRUVFQXR0cmlidXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSjJFRUVBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0OTUwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSjJFRUVBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KMkVFRSBBdHRyaWJ1dGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0SjJFRUVBdHRyaWJ1dGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRUVBdHRyaWJ1dGUgZXh0ZW5kcyBFQXR0cmlidXRlIHsKLX0gLy8gSjJFRUVBdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9KMkVFRU9iamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0oyRUVFT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NmI5YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0oyRUVFT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SjJFRUUgT2JqZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEoyRUVFT2JqZWN0KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVFT2JqZWN0IGV4dGVuZHMgRU9iamVjdCB7Ci19IC8vIEoyRUVFT2JqZWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSk5ESUVudlJlZnNHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0pORElFbnZSZWZzR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyNDFkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSk5ESUVudlJlZnNHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Sk5ESSBFbnYgUmVmcyBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgSk5ESSBlbnZpcm9ubWVudAotICogcmVmZXJlbmNlIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMgPGVtPkVudmlyb25tZW50IFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Sk5ESUVudlJlZnNHcm91cCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSk5ESUVudlJlZnNHcm91cCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnZpcm9ubWVudCBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudmlyb25tZW50IFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnZpcm9ubWVudCBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Sk5ESUVudlJlZnNHcm91cF9FbnZpcm9ubWVudFByb3BlcnRpZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnkiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlUmVmcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRKTkRJRW52UmVmc0dyb3VwX0VqYlJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGxpc3Qgb2YgZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZXMgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZUVudlJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRKTkRJRW52UmVmc0dyb3VwX0VqYkxvY2FsUmVmcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRKTkRJRW52UmVmc0dyb3VwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEpORElFbnZSZWZzR3JvdXBfU2VydmljZVJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTZXJ2aWNlUmVmcygpOwotCi19IC8vIEpORElFbnZSZWZzR3JvdXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9MaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzE4N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0vKioKLSAqIERlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCi0vKioKLSAqIEdldCB0aGUgSmF2YUNsYXNzIGZvciB0aGUgbGlzdGVuZXIuCi0gKi8KLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBMaXN0ZW5lckNsYXNzIHJlZmVyZW5jZQotCSAqIFRoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIG11c3QgYmUKLQkgKiByZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCi0JICovCi0JSmF2YUNsYXNzIGdldExpc3RlbmVyQ2xhc3MoKTsKLQotLyoqCi0gKiBHZXQgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgbGlzdGVuZXIuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0TGlzdGVuZXJDbGFzc05hbWUoKTsKLS8qKgotICogU2V0cyB0aGUgbGlzdGVuZXIgY2xhc3MgbmFtZS4KLSAqLwotcHVibGljIHZvaWQgc2V0TGlzdGVuZXJDbGFzc05hbWUoU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMaXN0ZW5lckNsYXNzIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TGlzdGVuZXJDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmU4YWE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvblR5cGUgc3BlY2lmaWVzIGEgbWVzc2FnZQotICogZGVzdGluYXRpb24uIFRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIGRlc2NyaWJlZCBieSB0aGlzCi0gKiBlbGVtZW50IGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGRlc3RpbmF0aW9uIGJ5IHRoZSBEZXBsb3llci4KLSAqIAotICogVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gZWxlbWVudCBjb250YWluczoKLSAqIAotICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheS1uYW1lCi0gKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgaWNvbgotICogICAgICAgICAtIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIHdoaWNoIG11c3QgYmUgdW5pcXVlCi0gKiAgICAgICAgICAgYW1vbmcgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lcyB3aXRoaW4gdGhlIHNhbWUKLSAqICAgICAgICAgICBEZXBsb3ltZW50IEZpbGUuCi0gKiAKLSAqIEV4YW1wbGU6Ci0gKiAKLSAqIDxtZXNzYWdlLWRlc3RpbmF0aW9uPgotICogICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPkNvcnBvcmF0ZVN0b2NrcwotICogICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT4KLSAqIDwvbWVzc2FnZS1kZXN0aW5hdGlvbj4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlRGVzdGluYXRpb24gZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEKLQkgKiAgICAgICAgIG5hbWUgZm9yIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgbmFtZSBtdXN0IGJlCi0JICogICAgICAgICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIG1lc3NhZ2UgZGVzdGluYXRpb25zCi0JICogICAgICAgICB3aXRoaW4gdGhlIERlcGxveW1lbnQgRmlsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXNzYWdlRGVzdGluYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb25SZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb25SZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhNTAxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vTWVzc2FnZURlc3RpbmF0aW9uUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLSAqIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBkZXN0aW5hdGlvbgotICogYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncwotICogZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotICogCi0gKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqICAgICAgICAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZQotICogICAgICAgICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUKLSAqICAgICAgICAgLSBhIHNwZWNpZmljYXRpb24gYXMgdG8gd2hldGhlciB0aGUKLSAqICAgICAgICAgICBkZXN0aW5hdGlvbiBpcyB1c2VkIGZvcgotICogICAgICAgICAgIGNvbnN1bWluZyBvciBwcm9kdWNpbmcgbWVzc2FnZXMsIG9yIGJvdGgKLSAqICAgICAgICAgLSBhIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24KLSAqIAotICogRXhhbXBsZXM6Ci0gKiAKLSAqIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLSAqICAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKLSAqICAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPgotICogICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotICogICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4KLSAqICAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Q29uc3VtZXMKLSAqICAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPgotICogICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPkNvcnBvcmF0ZVN0b2NrcwotICogICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbGluaz4KLSAqIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0VXNhZ2UgPGVtPlVzYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldExpbmsgPGVtPkxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlRGVzdGluYXRpb25SZWYgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzYWdlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzYWdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUKLQkgKiBAc2VlICNzZXRVc2FnZShNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVXNhZ2UoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0VXNhZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0VXNhZ2UgPGVtPlVzYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCi0JICogQHNlZSAjZ2V0VXNhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlKE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0xpbmsoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRMaW5rIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19IC8vIE1lc3NhZ2VEZXN0aW5hdGlvblJlZgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTlmNmEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OU1VNRVNfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJDb25zdW1lcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVU1FUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Qcm9kdWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BST0RVQ0VTX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iUHJvZHVjZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRFVDRVMgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29uc3VtZXMgUHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05TVU1FU19QUk9EVUNFU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IkNvbnN1bWVzUHJvZHVjZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1VNRVNfUFJPRFVDRVMgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29uc3VtZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db25zdW1lczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05TVU1FUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIENPTlNVTUVTX0xJVEVSQUwgPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKENPTlNVTUVTLCAiQ29uc3VtZXMiLCAiQ29uc3VtZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Qcm9kdWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQUk9EVUNFUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIFBST0RVQ0VTX0xJVEVSQUwgPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKFBST0RVQ0VTLCAiUHJvZHVjZXMiLCAiUHJvZHVjZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29uc3VtZXMgUHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db25zdW1lcyBQcm9kdWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05TVU1FU19QUk9EVUNFUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIENPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwgPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKENPTlNVTUVTX1BST0RVQ0VTLCAiQ29uc3VtZXNQcm9kdWNlcyIsICJDb25zdW1lc1Byb2R1Y2VzIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVbXSB7Ci0JCQlDT05TVU1FU19MSVRFUkFMLAotCQkJUFJPRFVDRVNfTElURVJBTCwKLQkJCUNPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIENPTlNVTUVTOiByZXR1cm4gQ09OU1VNRVNfTElURVJBTDsKLQkJCWNhc2UgUFJPRFVDRVM6IHJldHVybiBQUk9EVUNFU19MSVRFUkFMOwotCQkJY2FzZSBDT05TVU1FU19QUk9EVUNFUzogcmV0dXJuIENPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUGFyYW1WYWx1ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1BhcmFtVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExMDBiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUGFyYW1WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlCi0gKiBwYXJhbWV0ZXIvdmFsdWUgbGlzdHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRQYXJhbVZhbHVlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhcmFtVmFsdWUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFBhcmFtVmFsdWVfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UGFyYW1WYWx1ZV9WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfSAvLyBQYXJhbVZhbHVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUU5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9RTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMwNjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9RTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TG9jYWxQYXJ0IDxlbT5Mb2NhbCBQYXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0Q29tYmluZWRRTmFtZSA8ZW0+Q29tYmluZWQgUU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkgPGVtPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFFOYW1lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFFOYW1lIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZXNwYWNlVVJJKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFFOYW1lX05hbWVzcGFjZVVSSSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBQYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBQYXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIFBhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2FsUGFydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRRTmFtZV9Mb2NhbFBhcnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYWxQYXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TG9jYWxQYXJ0IDxlbT5Mb2NhbCBQYXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBQYXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhbFBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2FsUGFydChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21iaW5lZFFOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFFOYW1lX0NvbWJpbmVkUU5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tYmluZWRRTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldENvbWJpbmVkUU5hbWUgPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21iaW5lZCBRTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tYmluZWRRTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tYmluZWRRTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSW50ZXJuYWwgZmllbGQgdXNlZCBieSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLiAgQ2xpZW50cyBzaG91bGQgdXNlIAotCSAqIHtAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCl9LgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UU5hbWVfSW50ZXJuYWxQcmVmaXhPck5zVVJJKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldEludGVybmFsUHJlZml4T3JOc1VSSSA8ZW0+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogSW50ZXJuYWwgZmllbGQgdXNlZCBieSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLiAgQ2xpZW50cyBzaG91bGQgdXNlIAotCSAqIHtAbGluayAjc2V0VmFsdWVzKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEludGVybmFsUHJlZml4T3JOc1VSSShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0cyBhbGwgdGhlIHZhbHVlcyBmb3IgdGhpcyBxTmFtZQotCSAqIEBwYXJhbSBwcmVmaXggICAgLSBUaGUgbmFtZXNwYWNlIHByZWZpeAotCSAqIEBwYXJhbSBuc1VSSSAgICAgLSBUaGUgbmFtZXNwYWNlIFVSSQotCSAqIEBwYXJhbSBsb2NhbFBhcnQgLSBUaGUgbG9jYWwgcGFydAotCSAqLwotCXZvaWQgc2V0VmFsdWVzKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuc1VSSSwgU3RyaW5nIGxvY2FsUGFydCk7Ci0JCi0KLX0gLy8gUU5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNBdXRoVHlwZUJhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNBdXRoVHlwZUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2ZTRkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUmVzQXV0aFR5cGVCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5SZXMgQXV0aCBUeXBlIEJhc2U8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ09OVEFJTkVSPTAKLSAqIENvbnRhaW5lcj0xCi0gKiBBcHBsaWNhdGlvbj0yCi0gKiBTRVJWTEVUPTMKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRSZXNBdXRoVHlwZUJhc2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNBdXRoVHlwZUJhc2UgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRBSU5FUl9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IkNvbnRhaW5lciIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UQUlORVIgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBUFBMSUNBVElPTl9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IkFwcGxpY2F0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExJQ0FUSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFUlZMRVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWTEVUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWTEVUID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UQUlORVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlQmFzZSBDT05UQUlORVJfTElURVJBTCA9IG5ldyBSZXNBdXRoVHlwZUJhc2UoQ09OVEFJTkVSLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FQUExJQ0FUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoVHlwZUJhc2UgQVBQTElDQVRJT05fTElURVJBTCA9IG5ldyBSZXNBdXRoVHlwZUJhc2UoQVBQTElDQVRJT04sICJBcHBsaWNhdGlvbiIsICJBcHBsaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRVJWTEVUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VSVkxFVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWTEVUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoVHlwZUJhc2UgU0VSVkxFVF9MSVRFUkFMID0gbmV3IFJlc0F1dGhUeXBlQmFzZShTRVJWTEVULCAiU0VSVkxFVCIsICJTRVJWTEVUIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlIEJhc2U8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlQmFzZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBSZXNBdXRoVHlwZUJhc2VbXSB7Ci0JCQlDT05UQUlORVJfTElURVJBTCwKLQkJCUFQUExJQ0FUSU9OX0xJVEVSQUwsCi0JCQlTRVJWTEVUX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIEF1dGggVHlwZSBCYXNlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlIEJhc2U8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aFR5cGVCYXNlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzQXV0aFR5cGVCYXNlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIEF1dGggVHlwZSBCYXNlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aFR5cGVCYXNlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzQXV0aFR5cGVCYXNlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlIEJhc2U8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNBdXRoVHlwZUJhc2UgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIENPTlRBSU5FUjogcmV0dXJuIENPTlRBSU5FUl9MSVRFUkFMOwotCQkJY2FzZSBBUFBMSUNBVElPTjogcmV0dXJuIEFQUExJQ0FUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIFNFUlZMRVQ6IHJldHVybiBTRVJWTEVUX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJlc0F1dGhUeXBlQmFzZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vUmVzQXV0aFR5cGVCYXNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUmVzU2hhcmluZ1Njb3BlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc1NoYXJpbmdTY29wZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1NGE5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUmVzU2hhcmluZ1Njb3BlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgUmVzU2hhcmluZ1Njb3BlVHlwZSB7fQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzU2hhcmluZ1Njb3BlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFSRUFCTEU9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TSEFSRUFCTEU9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0hBUkVBQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlIFNIQVJFQUJMRV9MSVRFUkFMID0gbmV3IFJlc1NoYXJpbmdTY29wZVR5cGUoU0hBUkVBQkxFLCAiU2hhcmVhYmxlIiwgIlNoYXJlYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5VbnNoYXJlYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVuc2hhcmVhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1VOU0hBUkVBQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlIFVOU0hBUkVBQkxFX0xJVEVSQUwgPSBuZXcgUmVzU2hhcmluZ1Njb3BlVHlwZShVTlNIQVJFQUJMRSwgIlVuc2hhcmVhYmxlIiwgIlVuc2hhcmVhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFJlc1NoYXJpbmdTY29wZVR5cGVbXSB7Ci0JCQlTSEFSRUFCTEVfTElURVJBTCwKLQkJCVVOU0hBUkVBQkxFX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzU2hhcmluZ1Njb3BlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzU2hhcmluZ1Njb3BlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSBwYXNzZXMgbGl0ZXJhbCB2YWx1ZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc1NoYXJpbmdTY29wZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFNIQVJFQUJMRTogcmV0dXJuIFNIQVJFQUJMRV9MSVRFUkFMOwotCQkJY2FzZSBVTlNIQVJFQUJMRTogcmV0dXJuIFVOU0hBUkVBQkxFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJlc1NoYXJpbmdTY29wZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1Jlc1NoYXJpbmdTY29wZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNvdXJjZUVudlJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc291cmNlRW52UmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZDVhZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc291cmNlRW52UmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UtZW52LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLgotICogCi0gKiBFeGFtcGxlczoKLSAqIAotICogPHJlc291cmNlLWVudi1yZWY+Ci0gKiAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvL1N0b2NrUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gKiAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gKiA8Ly9yZXNvdXJjZS1lbnYtcmVmPgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUVudlJlZiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWUgZm9yIHRoZSB0eXBlCi0JICogQHJldHVybiBTdHJpbmcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gY2xhc3NOYW1lIHNldHMgdGhlIG5hbWUgZm9yIHRoZSB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgCi0JICogdGhlIHJlc291cmNlIGVudiByZWYuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIKLQkgKiB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuCi0JICogVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUKLQkgKiBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLQkgKiBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFR5cGUgcmVmZXJlbmNlCi0JICogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgU2VlIHRoZSBjbGFzcwotCSAqIGRlc2NyaXB0aW9uIGZvciBhbiBleGFtcGxlLgotCSAqLwotCUphdmFDbGFzcyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVHlwZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFR5cGUoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNvdXJjZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc291cmNlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZTdhMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc291cmNlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIFRoZSByZXNvdXJjZS1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFwcGxpY2F0aW9uIGNsaWVudHMncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgdGhlIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGZhY3RvcnkgdHlwZSBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MgY29kZSwgYW5kIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uIChiZWFuIG9yIGNvbnRhaW5lcikuCi0gKiBFeGFtcGxlOgotICogPHJlc291cmNlLXJlZj4KLSAqIDxyZXMtcmVmLW5hbWU+RW1wbG95ZWVBcHBEQjwvL3Jlcy1yZWYtbmFtZT4KLSAqIDxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvL3Jlcy10eXBlPgotICogPHJlcy1hdXRoPkNvbnRhaW5lcjwvL3Jlcy1hdXRoPgotICogPC8vcmVzb3VyY2UtcmVmPgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVJlZiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dAotCSAqIGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55Ci0JICogaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mCi0JICogdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZQotCSAqIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50Ci0JICogZWxlbWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5IHJlZmVyZW5jZQotCSAqIG5hbWUuIFRoZSByZXNvdXJjZSBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbgotCSAqIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5IHdob3NlIHZhbHVlIGNvbnRhaW5zIHRoZSBKTkRJIG5hbWUgb2YgdGhlIGRhdGEKLQkgKiBzb3VyY2UuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFR5cGUgYXR0cmlidXRlCi0JICogVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhIHNvdXJjZS4gVGhlIHR5cGUgaXMKLQkgKiBzcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlIChvciBjbGFzcykgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlCi0JICogZGF0YSBzb3VyY2UuCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEF1dGggYXR0cmlidXRlCi0JICogVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlIHNpZ25zIG9uCi0JICogcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiAKLQkgKiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIGJlYW4uIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCi0JICogQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUgRGVwbG95ZXIuICBUaGUgdmFsdWUgb2YgdGhpcyAKLQkgKiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCSAqIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvL3Jlcy1hdXRoPgotCSAqIDxyZXMtYXV0aD5Db250YWluZXI8Ly9yZXMtYXV0aD4KLQkgKi8KLQlSZXNBdXRoVHlwZUJhc2UgZ2V0QXV0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmI2dldEF1dGggPGVtPkF1dGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc0F1dGhUeXBlQmFzZQotCSAqIEBzZWUgI2lzU2V0QXV0aCgpCi0JICogQHNlZSAjdW5zZXRBdXRoKCkKLQkgKiBAc2VlICNnZXRBdXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRoKFJlc0F1dGhUeXBlQmFzZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZiNnZXRBdXRoIDxlbT5BdXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF1dGgoKQotCSAqIEBzZWUgI2dldEF1dGgoKQotCSAqIEBzZWUgI3NldEF1dGgoUmVzQXV0aFR5cGVCYXNlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWYjZ2V0QXV0aCA8ZW0+QXV0aDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QXV0aCgpCi0JICogQHNlZSAjZ2V0QXV0aCgpCi0JICogQHNlZSAjc2V0QXV0aChSZXNBdXRoVHlwZUJhc2UpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdXRoKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTGluayBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0TGluaygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExpbmsgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRMaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUmVzU2hhcmluZ1Njb3BlIGF0dHJpYnV0ZQotCSAqIFRoZSByZXMtc2hhcmluZy1zY29wZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkCi0JICogdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZQotCSAqIHNoYXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCwgaWYgc3BlY2lmaWVkLCBtdXN0IGJlIG9uZSBvZiB0aGUKLQkgKiB0d28gZm9sbG93aW5nOiAgU2hhcmVhYmxlLCBVbnNoYXJlYWJsZQotCSAqIAotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLQotCSAqLwotCVJlc1NoYXJpbmdTY29wZVR5cGUgZ2V0UmVzU2hhcmluZ1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWYjZ2V0UmVzU2hhcmluZ1Njb3BlIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc1NoYXJpbmdTY29wZVR5cGUKLQkgKiBAc2VlICNpc1NldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjdW5zZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI2dldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWYjZ2V0UmVzU2hhcmluZ1Njb3BlIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI2dldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmI2dldFJlc1NoYXJpbmdTY29wZSA8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI2dldFJlc1NoYXJpbmdTY29wZSgpCi0JICogQHNlZSAjc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SdW5Bc1NwZWNpZmllZElkZW50aXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUnVuQXNTcGVjaWZpZWRJZGVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDRmZDRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SdW5Bc1NwZWNpZmllZElkZW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotCi0vKioKLSAqIFRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcyBpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCAgICBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBSdW5Bc1NwZWNpZmllZElkZW50aXR5IGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eXsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBJZGVudGl0eSByZWZlcmVuY2UKLQkgKiBPcHRpb25hbCBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotCSAqIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZQotCSAqIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCSAqLwotCUlkZW50aXR5IGdldElkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgSWRlbnRpdHkgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRJZGVudGl0eShJZGVudGl0eSB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vU2VjdXJpdHlJZGVudGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1NlY3VyaXR5SWRlbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwZDFkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vU2VjdXJpdHlJZGVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotLyoqCi0gKiBUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQKLSAqIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3VyaXR5SWRlbnRpdHkgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgZm9yIHRoZSBSdW5Bc1NwZWNpZmllZElkZW50aXR5Ci0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JYm9vbGVhbiBpc1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgZm9yIHRoZSBDYWxsZXIgSWRlbnRpdHkKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlib29sZWFuIGlzVXNlQ2FsbGVySWRlbnRpdHkoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9TZWN1cml0eVJvbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9TZWN1cml0eVJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExOWQwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vU2VjdXJpdHlSb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0vKioKLSAqIEEgc2VtYW50aWMgZ3JvdXBpbmcgb2Ygb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBwZXJmb3JtZWQgYnkgYSBzdWJqZWN0LgotICogVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN1cml0eSByb2xlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRzIHBsYWNlZCBvbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBTZWN1cml0eVJvbGUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSb2xlTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSByb2xlLiBUaGlzIGVsZW1lbnQgbXVzdCBjb250YWluIGEKLQkgKiBub24tZW1wdHkgc3RyaW5nLgotCi0JICovCi0JU3RyaW5nIGdldFJvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUm9sZU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9TZWN1cml0eVJvbGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9TZWN1cml0eVJvbGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmYTJlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vU2VjdXJpdHlSb2xlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBTZWN1cml0eVJvbGVSZWYgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQKLQkgKiBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueQotCSAqIGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotCSAqIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUKLQkgKiBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudAotCSAqIGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExpbmsgYXR0cmlidXRlCi0JICogVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIHVzZWQgdG8gbGluayBhIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZAotCSAqIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotCSAqIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0JICovCi0JU3RyaW5nIGdldExpbmsoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMaW5rIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Vc2VDYWxsZXJJZGVudGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1VzZUNhbGxlcklkZW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMjU1MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1VzZUNhbGxlcklkZW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotCi0vKioKLSAqIFRoZSB1c2UtY2FsbGVyLWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGJlIHVzZWQgYXMgdGhlIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2RzLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBVc2VDYWxsZXJJZGVudGl0eSBleHRlbmRzIFNlY3VyaXR5SWRlbnRpdHl7Ci0JLy9Vc2VDYWxsZXJJZGVudGl0eQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vbkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Db21tb25GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjcyODYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vbkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNTaGFyaW5nU2NvcGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Vc2VDYWxsZXJJZGVudGl0eTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQ29tbW9uRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJQ29tbW9uRmFjdG9yeSB0aGVDb21tb25GYWN0b3J5ID0gKENvbW1vbkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImNvbW1vbi54bWkiKTsgCi0JCQlpZiAodGhlQ29tbW9uRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZUNvbW1vbkZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbW9uRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tb25GYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUY6IHJldHVybiBjcmVhdGVFamJSZWYoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUlk6IHJldHVybiBjcmVhdGVFbnZFbnRyeSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRjogcmV0dXJuIGNyZWF0ZVJlc291cmNlUmVmKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUY6IHJldHVybiBjcmVhdGVTZWN1cml0eVJvbGVSZWYoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFOiByZXR1cm4gY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRjogcmV0dXJuIGNyZWF0ZVJlc291cmNlRW52UmVmKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRjogcmV0dXJuIGNyZWF0ZUVKQkxvY2FsUmVmKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWTogcmV0dXJuIGNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWTogcmV0dXJuIGNyZWF0ZUlkZW50aXR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFOiByZXR1cm4gY3JlYXRlSWNvblR5cGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUU6IHJldHVybiBjcmVhdGVEaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGOiByZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTjogcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFOiByZXR1cm4gY3JlYXRlUGFyYW1WYWx1ZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQOiByZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cCgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZOiByZXR1cm4gY3JlYXRlU2VjdXJpdHlJZGVudGl0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlVTRV9DQUxMRVJfSURFTlRJVFk6IHJldHVybiBjcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OOiByZXR1cm4gY3JlYXRlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRTogcmV0dXJuIGNyZWF0ZVFOYW1lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVI6IHJldHVybiBjcmVhdGVMaXN0ZW5lcigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVA6IHJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVDogcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFOiByZXR1cm4gY3JlYXRlSjJFRUVBdHRyaWJ1dGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVudkVudHJ5VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU19BVVRIX1RZUEVfQkFTRToKLQkJCQlyZXR1cm4gY3JlYXRlUmVzQXV0aFR5cGVCYXNlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFamJSZWZUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUmVzU2hhcmluZ1Njb3BlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RW52RW50cnlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNfQVVUSF9UWVBFX0JBU0U6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXNBdXRoVHlwZUJhc2VUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVqYlJlZlR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU19TSEFSSU5HX1NDT1BFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXNTaGFyaW5nU2NvcGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYlJlZiBjcmVhdGVFamJSZWYoKSB7Ci0JCUVqYlJlZkltcGwgZWpiUmVmID0gbmV3IEVqYlJlZkltcGwoKTsKLQkJcmV0dXJuIGVqYlJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW52RW50cnkgY3JlYXRlRW52RW50cnkoKSB7Ci0JCUVudkVudHJ5SW1wbCBlbnZFbnRyeSA9IG5ldyBFbnZFbnRyeUltcGwoKTsKLQkJcmV0dXJuIGVudkVudHJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVJlZiBjcmVhdGVSZXNvdXJjZVJlZigpIHsKLQkJUmVzb3VyY2VSZWZJbXBsIHJlc291cmNlUmVmID0gbmV3IFJlc291cmNlUmVmSW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2VSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5Um9sZVJlZiBjcmVhdGVTZWN1cml0eVJvbGVSZWYoKSB7Ci0JCVNlY3VyaXR5Um9sZVJlZkltcGwgc2VjdXJpdHlSb2xlUmVmID0gbmV3IFNlY3VyaXR5Um9sZVJlZkltcGwoKTsKLQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlIGNyZWF0ZVNlY3VyaXR5Um9sZSgpIHsKLQkJU2VjdXJpdHlSb2xlSW1wbCBzZWN1cml0eVJvbGUgPSBuZXcgU2VjdXJpdHlSb2xlSW1wbCgpOwotCQlyZXR1cm4gc2VjdXJpdHlSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUVudlJlZiBjcmVhdGVSZXNvdXJjZUVudlJlZigpIHsKLQkJUmVzb3VyY2VFbnZSZWZJbXBsIHJlc291cmNlRW52UmVmID0gbmV3IFJlc291cmNlRW52UmVmSW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVKQkxvY2FsUmVmIGNyZWF0ZUVKQkxvY2FsUmVmKCkgewotCQlFSkJMb2NhbFJlZkltcGwgZWpiTG9jYWxSZWYgPSBuZXcgRUpCTG9jYWxSZWZJbXBsKCk7Ci0JCXJldHVybiBlamJMb2NhbFJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBjcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkgewotCQlSdW5Bc1NwZWNpZmllZElkZW50aXR5SW1wbCBydW5Bc1NwZWNpZmllZElkZW50aXR5ID0gbmV3IFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJbXBsKCk7Ci0JCXJldHVybiBydW5Bc1NwZWNpZmllZElkZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJZGVudGl0eSBjcmVhdGVJZGVudGl0eSgpIHsKLQkJSWRlbnRpdHlJbXBsIGlkZW50aXR5ID0gbmV3IElkZW50aXR5SW1wbCgpOwotCQlyZXR1cm4gaWRlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEljb25UeXBlIGNyZWF0ZUljb25UeXBlKCkgewotCQlJY29uVHlwZUltcGwgaWNvblR5cGUgPSBuZXcgSWNvblR5cGVJbXBsKCk7Ci0JCXJldHVybiBpY29uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzcGxheU5hbWUgY3JlYXRlRGlzcGxheU5hbWUoKSB7Ci0JCURpc3BsYXlOYW1lSW1wbCBkaXNwbGF5TmFtZSA9IG5ldyBEaXNwbGF5TmFtZUltcGwoKTsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25SZWYgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCkgewotCQlNZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsIG1lc3NhZ2VEZXN0aW5hdGlvblJlZiA9IG5ldyBNZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsKCk7Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvbiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb24oKSB7Ci0JCU1lc3NhZ2VEZXN0aW5hdGlvbkltcGwgbWVzc2FnZURlc3RpbmF0aW9uID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvbkltcGwoKTsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyYW1WYWx1ZSBjcmVhdGVQYXJhbVZhbHVlKCkgewotCQlQYXJhbVZhbHVlSW1wbCBwYXJhbVZhbHVlID0gbmV3IFBhcmFtVmFsdWVJbXBsKCk7Ci0JCXJldHVybiBwYXJhbVZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvbkdyb3VwIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXAoKSB7Ci0JCURlc2NyaXB0aW9uR3JvdXBJbXBsIGRlc2NyaXB0aW9uR3JvdXAgPSBuZXcgRGVzY3JpcHRpb25Hcm91cEltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHkgY3JlYXRlU2VjdXJpdHlJZGVudGl0eSgpIHsKLQkJU2VjdXJpdHlJZGVudGl0eUltcGwgc2VjdXJpdHlJZGVudGl0eSA9IG5ldyBTZWN1cml0eUlkZW50aXR5SW1wbCgpOwotCQlyZXR1cm4gc2VjdXJpdHlJZGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVXNlQ2FsbGVySWRlbnRpdHkgY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKSB7Ci0JCVVzZUNhbGxlcklkZW50aXR5SW1wbCB1c2VDYWxsZXJJZGVudGl0eSA9IG5ldyBVc2VDYWxsZXJJZGVudGl0eUltcGwoKTsKLQkJcmV0dXJuIHVzZUNhbGxlcklkZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdGlvbigpIHsKLQkJRGVzY3JpcHRpb25JbXBsIGRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFFOYW1lIGNyZWF0ZVFOYW1lKCkgewotCQlRTmFtZUltcGwgcU5hbWUgPSBuZXcgUU5hbWVJbXBsKCk7Ci0JCXJldHVybiBxTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoKSB7Ci0JCUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lckltcGwoKTsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpIHsKLQkJQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gbmV3IENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCgpOwotCQlyZXR1cm4gY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEoyRUVFT2JqZWN0IGNyZWF0ZUoyRUVFT2JqZWN0KCkgewotCQlKMkVFRU9iamVjdEltcGwgajJFRUVPYmplY3QgPSBuZXcgSjJFRUVPYmplY3RJbXBsKCk7Ci0JCXJldHVybiBqMkVFRU9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSjJFRUVBdHRyaWJ1dGUgY3JlYXRlSjJFRUVBdHRyaWJ1dGUoKSB7Ci0JCUoyRUVFQXR0cmlidXRlSW1wbCBqMkVFRUF0dHJpYnV0ZSA9IG5ldyBKMkVFRUF0dHJpYnV0ZUltcGwoKTsKLQkJcmV0dXJuIGoyRUVFQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnZFbnRyeVR5cGUgY3JlYXRlRW52RW50cnlUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUVudkVudHJ5VHlwZSByZXN1bHQgPSBFbnZFbnRyeVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVudkVudHJ5VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNBdXRoVHlwZUJhc2UgY3JlYXRlUmVzQXV0aFR5cGVCYXNlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVJlc0F1dGhUeXBlQmFzZSByZXN1bHQgPSBSZXNBdXRoVHlwZUJhc2UuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlc0F1dGhUeXBlQmFzZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJSZWZUeXBlIGNyZWF0ZUVqYlJlZlR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJRWpiUmVmVHlwZSByZXN1bHQgPSBFamJSZWZUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFamJSZWZUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc1NoYXJpbmdTY29wZVR5cGUgY3JlYXRlUmVzU2hhcmluZ1Njb3BlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlSZXNTaGFyaW5nU2NvcGVUeXBlIHJlc3VsdCA9IFJlc1NoYXJpbmdTY29wZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlc1NoYXJpbmdTY29wZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgcmVzdWx0ID0gTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbW9uUGFja2FnZSBnZXRDb21tb25QYWNrYWdlKCkgewotCQlyZXR1cm4gKENvbW1vblBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vQ29tbW9uRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Db21tb25QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTljMGIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vblBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc0F1dGhUeXBlQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzU2hhcmluZ1Njb3BlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SdW5Bc1NwZWNpZmllZElkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uVXNlQ2FsbGVySWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIENvbW1vblBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ29tbW9uUGFja2FnZSwgRVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYlJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbnZFbnRyeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN1cml0eVJvbGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdXJpdHlSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlc291cmNlRW52UmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYkxvY2FsUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdXJpdHlJZGVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpZGVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpY29uVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaXNwbGF5TmFtZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhcmFtVmFsdWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRpb25Hcm91cEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqbmRpRW52UmVmc0dyb3VwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHVzZUNhbGxlcklkZW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHFOYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxpc3RlbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGoyRUVFT2JqZWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGoyRUVFQXR0cmlidXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZW52RW50cnlUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSByZXNBdXRoVHlwZUJhc2VFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGVqYlJlZlR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtID0gbnVsbDsKLQotCQkgICAvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByaXZhdGUgQ29tbW9uUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vblBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBDb21tb25QYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQ29tbW9uUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlQ29tbW9uUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlY3VyaXR5Um9sZSgpIHsKLQkJcmV0dXJuIHNlY3VyaXR5Um9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXNvdXJjZVJlZigpIHsKLQkJcmV0dXJuIHJlc291cmNlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9BdXRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9MaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9SZXNTaGFyaW5nU2NvcGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFamJSZWYoKSB7Ci0JCXJldHVybiBlamJSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYlJlZl9Ib21lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX1JlbW90ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYlJlZl9MaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCTG9jYWxSZWYoKSB7Ci0JCXJldHVybiBlamJMb2NhbFJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJMb2NhbFJlZl9Mb2NhbEhvbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJMb2NhbFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkxvY2FsUmVmX0xvY2FsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVudkVudHJ5KCkgewotCQlyZXR1cm4gZW52RW50cnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudkVudHJ5X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudkVudHJ5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW52RW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW52RW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnZFbnRyeV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdXJpdHlSb2xlUmVmKCkgewotCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZVJlZl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX0xpbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVJvbGVSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkgewotCQlyZXR1cm4gcnVuQXNTcGVjaWZpZWRJZGVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5X0lkZW50aXR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcnVuQXNTcGVjaWZpZWRJZGVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdXJpdHlJZGVudGl0eSgpIHsKLQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5SWRlbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5SWRlbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFVzZUNhbGxlcklkZW50aXR5KCkgewotCQlyZXR1cm4gdXNlQ2FsbGVySWRlbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX0xhbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFFOYW1lKCkgewotCQlyZXR1cm4gcU5hbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcU5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRRTmFtZV9Mb2NhbFBhcnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlxTmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFFOYW1lX0NvbWJpbmVkUU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlxTmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFFOYW1lX0ludGVybmFsUHJlZml4T3JOc1VSSSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXFOYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGxpc3RlbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpc3RlbmVyX0xpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSB7Ci0JCXJldHVybiBjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEoyRUVFT2JqZWN0KCkgewotCQlyZXR1cm4gajJFRUVPYmplY3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKMkVFRUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGoyRUVFQXR0cmlidXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SWRlbnRpdHkoKSB7Ci0JCXJldHVybiBpZGVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJZGVudGl0eV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWlkZW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SWRlbnRpdHlfUm9sZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpZGVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldElkZW50aXR5X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlkZW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJY29uVHlwZSgpIHsKLQkJcmV0dXJuIGljb25UeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEljb25UeXBlX1NtYWxsSWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWljb25UeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SWNvblR5cGVfTGFyZ2VJY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaWNvblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJY29uVHlwZV9MYW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaWNvblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzcGxheU5hbWVfTGFuZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc3BsYXlOYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzcGxheU5hbWVfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNwbGF5TmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVXNhZ2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1lc3NhZ2VEZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIHBhcmFtVmFsdWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFyYW1WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBhcmFtVmFsdWVfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwYXJhbVZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBhcmFtVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBhcmFtVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0aW9uR3JvdXAoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbkdyb3VwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlc2NyaXB0aW9uR3JvdXBfSWNvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKTkRJRW52UmVmc0dyb3VwKCkgewotCQlyZXR1cm4gam5kaUVudlJlZnNHcm91cEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX0Vudmlyb25tZW50UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX0VqYlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZUVudlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upam5kaUVudlJlZnNHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpORElFbnZSZWZzR3JvdXBfU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXNvdXJjZUVudlJlZigpIHsKLQkJcmV0dXJuIHJlc291cmNlRW52UmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRFamJSZWZUeXBlKCkgewotCQlyZXR1cm4gZWpiUmVmVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRFbnZFbnRyeVR5cGUoKSB7Ci0JCXJldHVybiBlbnZFbnRyeVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0UmVzQXV0aFR5cGVCYXNlKCkgewotCQlyZXR1cm4gcmVzQXV0aFR5cGVCYXNlRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldFJlc1NoYXJpbmdTY29wZVR5cGUoKSB7Ci0JCXJldHVybiByZXNTaGFyaW5nU2NvcGVUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb21tb25GYWN0b3J5IGdldENvbW1vbkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoQ29tbW9uRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQllamJSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlZkVDbGFzcywgRUpCX1JFRl9fSE9NRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19SRU1PVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlZkVDbGFzcywgRUpCX1JFRl9fTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19ERVNDUklQVElPTlMpOwotCi0JCWVudkVudHJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVOVl9FTlRSWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW52RW50cnlFQ2xhc3MsIEVOVl9FTlRSWV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19ERVNDUklQVElPTlMpOwotCi0JCXJlc291cmNlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU09VUkNFX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VSZWZFQ2xhc3MsIFJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX0FVVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX0xJTkspOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZVJlZkVDbGFzcywgUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlMpOwotCi0JCXNlY3VyaXR5Um9sZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNVUklUWV9ST0xFX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlSb2xlUmVmRUNsYXNzLCBTRUNVUklUWV9ST0xFX1JFRl9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlSb2xlUmVmRUNsYXNzLCBTRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU0VDVVJJVFlfUk9MRV9SRUZfX0xJTkspOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJc2VjdXJpdHlSb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1VSSVRZX1JPTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZUVDbGFzcywgU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZUVDbGFzcywgU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eVJvbGVFQ2xhc3MsIFNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJcmVzb3VyY2VFbnZSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVTT1VSQ0VfRU5WX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUVudlJlZkVDbGFzcywgUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJFU09VUkNFX0VOVl9SRUZfX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlRW52UmVmRUNsYXNzLCBSRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlMpOwotCi0JCWVqYkxvY2FsUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVKQl9MT0NBTF9SRUYpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYkxvY2FsUmVmRUNsYXNzLCBFSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fTE9DQUwpOwotCi0JCXJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocnVuQXNTcGVjaWZpZWRJZGVudGl0eUVDbGFzcywgUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFkpOwotCi0JCWlkZW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKElERU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpZGVudGl0eUVDbGFzcywgSURFTlRJVFlfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpZGVudGl0eUVDbGFzcywgSURFTlRJVFlfX1JPTEVfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaWRlbnRpdHlFQ2xhc3MsIElERU5USVRZX19ERVNDUklQVElPTlMpOwotCi0JCWljb25UeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElDT05fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaWNvblR5cGVFQ2xhc3MsIElDT05fVFlQRV9fU01BTExfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaWNvblR5cGVFQ2xhc3MsIElDT05fVFlQRV9fTEFSR0VfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaWNvblR5cGVFQ2xhc3MsIElDT05fVFlQRV9fTEFORyk7Ci0KLQkJZGlzcGxheU5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTUExBWV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNwbGF5TmFtZUVDbGFzcywgRElTUExBWV9OQU1FX19MQU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNwbGF5TmFtZUVDbGFzcywgRElTUExBWV9OQU1FX19WQUxVRSk7Ci0KLQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FU1NBR0VfREVTVElOQVRJT05fUkVGKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19VU0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TKTsKLQotCQltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9ERVNUSU5BVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FKTsKLQotCQlwYXJhbVZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBUkFNX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwYXJhbVZhbHVlRUNsYXNzLCBQQVJBTV9WQUxVRV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGFyYW1WYWx1ZUVDbGFzcywgUEFSQU1fVkFMVUVfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwYXJhbVZhbHVlRUNsYXNzLCBQQVJBTV9WQUxVRV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHBhcmFtVmFsdWVFQ2xhc3MsIFBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMpOwotCi0JCWRlc2NyaXB0aW9uR3JvdXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRJT05fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIERFU0NSSVBUSU9OX0dST1VQX19JQ09OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVzY3JpcHRpb25Hcm91cEVDbGFzcywgREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIERFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlMpOwotCi0JCWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSk5ESV9FTlZfUkVGU19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MsIEpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqbmRpRW52UmVmc0dyb3VwRUNsYXNzLCBKTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqbmRpRW52UmVmc0dyb3VwRUNsYXNzLCBKTkRJX0VOVl9SRUZTX0dST1VQX19TRVJWSUNFX1JFRlMpOwotCi0JCXNlY3VyaXR5SWRlbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVVJJVFlfSURFTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5SWRlbnRpdHlFQ2xhc3MsIFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlJZGVudGl0eUVDbGFzcywgU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJdXNlQ2FsbGVySWRlbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVVNFX0NBTExFUl9JREVOVElUWSk7Ci0KLQkJZGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0aW9uRUNsYXNzLCBERVNDUklQVElPTl9fTEFORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRpb25FQ2xhc3MsIERFU0NSSVBUSU9OX19WQUxVRSk7Ci0KLQkJcU5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUU5BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHFOYW1lRUNsYXNzLCBRTkFNRV9fTkFNRVNQQUNFX1VSSSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocU5hbWVFQ2xhc3MsIFFOQU1FX19MT0NBTF9QQVJUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxTmFtZUVDbGFzcywgUU5BTUVfX0NPTUJJTkVEX1FOQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxTmFtZUVDbGFzcywgUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkpOwotCi0JCWxpc3RlbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKExJU1RFTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsaXN0ZW5lckVDbGFzcywgTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTKTsKLQotCQljb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcywgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzLCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRSk7Ci0KLQkJajJFRUVPYmplY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSjJFRUVfT0JKRUNUKTsKLQotCQlqMkVFRUF0dHJpYnV0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKMkVFRV9BVFRSSUJVVEUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQllbnZFbnRyeVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEVOVl9FTlRSWV9UWVBFKTsKLQkJcmVzQXV0aFR5cGVCYXNlRUVudW0gPSBjcmVhdGVFRW51bShSRVNfQVVUSF9UWVBFX0JBU0UpOwotCQllamJSZWZUeXBlRUVudW0gPSBjcmVhdGVFRW51bShFSkJfUkVGX1RZUEUpOwotCQlyZXNTaGFyaW5nU2NvcGVUeXBlRUVudW0gPSBjcmVhdGVFRW51bShSRVNfU0hBUklOR19TQ09QRV9UWVBFKTsKLQkJbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0gPSBjcmVhdGVFRW51bShNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlKYXZhUmVmUGFja2FnZSB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpOwotCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQllamJSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZW52RW50cnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKLQkJc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXNlY3VyaXR5Um9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQllamJMb2NhbFJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVqYlJlZigpKTsKLQkJcnVuQXNTcGVjaWZpZWRJZGVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlY3VyaXR5SWRlbnRpdHkoKSk7Ci0JCWlkZW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWljb25UeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWRpc3BsYXlOYW1lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJcGFyYW1WYWx1ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJc2VjdXJpdHlJZGVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQl1c2VDYWxsZXJJZGVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlY3VyaXR5SWRlbnRpdHkoKSk7Ci0JCWRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXFOYW1lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWxpc3RlbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJajJFRUVBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVBdHRyaWJ1dGUoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhlamJSZWZFQ2xhc3MsIEVqYlJlZi5jbGFzcywgIkVqYlJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9UeXBlKCksIHRoaXMuZ2V0RWpiUmVmVHlwZSgpLCAidHlwZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfSG9tZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaG9tZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX1JlbW90ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVtb3RlIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfTGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGluayIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZW52RW50cnlFQ2xhc3MsIEVudkVudHJ5LmNsYXNzLCAiRW52RW50cnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9UeXBlKCksIHRoaXMuZ2V0RW52RW50cnlUeXBlKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlc291cmNlUmVmRUNsYXNzLCBSZXNvdXJjZVJlZi5jbGFzcywgIlJlc291cmNlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX0F1dGgoKSwgdGhpcy5nZXRSZXNBdXRoVHlwZUJhc2UoKSwgImF1dGgiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9MaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsaW5rIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX1Jlc1NoYXJpbmdTY29wZSgpLCB0aGlzLmdldFJlc1NoYXJpbmdTY29wZVR5cGUoKSwgInJlc1NoYXJpbmdTY29wZSIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eVJvbGVSZWZFQ2xhc3MsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIlNlY3VyaXR5Um9sZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlUmVmX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Um9sZVJlZl9MaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsaW5rIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eVJvbGVFQ2xhc3MsIFNlY3VyaXR5Um9sZS5jbGFzcywgIlNlY3VyaXR5Um9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyb2xlTmFtZSIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJlc291cmNlRW52UmVmLmNsYXNzLCAiUmVzb3VyY2VFbnZSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUVudlJlZl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlRW52UmVmX1R5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJ0eXBlIiwgbnVsbCwgMSwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJMb2NhbFJlZkVDbGFzcywgRUpCTG9jYWxSZWYuY2xhc3MsICJFSkJMb2NhbFJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCTG9jYWxSZWZfTG9jYWxIb21lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhbEhvbWUiLCBudWxsLCAwLCAxLCBFSkJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCTG9jYWxSZWZfTG9jYWwoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2FsIiwgbnVsbCwgMCwgMSwgRUpCTG9jYWxSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhydW5Bc1NwZWNpZmllZElkZW50aXR5RUNsYXNzLCBSdW5Bc1NwZWNpZmllZElkZW50aXR5LmNsYXNzLCAiUnVuQXNTcGVjaWZpZWRJZGVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UnVuQXNTcGVjaWZpZWRJZGVudGl0eV9JZGVudGl0eSgpLCB0aGlzLmdldElkZW50aXR5KCksIG51bGwsICJpZGVudGl0eSIsIG51bGwsIDAsIDEsIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpZGVudGl0eUVDbGFzcywgSWRlbnRpdHkuY2xhc3MsICJJZGVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWRlbnRpdHlfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgSWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldElkZW50aXR5X1JvbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyb2xlTmFtZSIsIG51bGwsIDAsIDEsIElkZW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJZGVudGl0eV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIElkZW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaWNvblR5cGVFQ2xhc3MsIEljb25UeXBlLmNsYXNzLCAiSWNvblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEljb25UeXBlX1NtYWxsSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgSWNvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEljb25UeXBlX0xhcmdlSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFyZ2VJY29uIiwgbnVsbCwgMCwgMSwgSWNvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEljb25UeXBlX0xhbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxhbmciLCBudWxsLCAwLCAxLCBJY29uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRpc3BsYXlOYW1lRUNsYXNzLCBEaXNwbGF5TmFtZS5jbGFzcywgIkRpc3BsYXlOYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNwbGF5TmFtZV9MYW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgRGlzcGxheU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc3BsYXlOYW1lX1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIERpc3BsYXlOYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25SZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1VzYWdlKCksIHRoaXMuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCksICJ1c2FnZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0xpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxpbmsiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAiTWVzc2FnZURlc3RpbmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBhcmFtVmFsdWVFQ2xhc3MsIFBhcmFtVmFsdWUuY2xhc3MsICJQYXJhbVZhbHVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQYXJhbVZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUGFyYW1WYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLCBEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAiRGVzY3JpcHRpb25Hcm91cCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVzY3JpcHRpb25Hcm91cF9JY29ucygpLCB0aGlzLmdldEljb25UeXBlKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lcygpLCB0aGlzLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgRGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIERlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqbmRpRW52UmVmc0dyb3VwRUNsYXNzLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAiSk5ESUVudlJlZnNHcm91cCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX0Vudmlyb25tZW50UHJvcGVydGllcygpLCB0aGlzLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZpcm9ubWVudFByb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgSk5ESUVudlJlZnNHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZVJlZnMoKSwgdGhpcy5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpLCB0aGlzLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlRW52UmVmcygpLCB0aGlzLmdldFJlc291cmNlRW52UmVmKCksIG51bGwsICJyZXNvdXJjZUVudlJlZnMiLCBudWxsLCAwLCAtMSwgSk5ESUVudlJlZnNHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKSwgdGhpcy5nZXRFSkJMb2NhbFJlZigpLCBudWxsLCAiZWpiTG9jYWxSZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGlzLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX1NlcnZpY2VSZWZzKCksIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VjdXJpdHlJZGVudGl0eUVDbGFzcywgU2VjdXJpdHlJZGVudGl0eS5jbGFzcywgIlNlY3VyaXR5SWRlbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlJZGVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5SWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh1c2VDYWxsZXJJZGVudGl0eUVDbGFzcywgVXNlQ2FsbGVySWRlbnRpdHkuY2xhc3MsICJVc2VDYWxsZXJJZGVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaXB0aW9uRUNsYXNzLCBEZXNjcmlwdGlvbi5jbGFzcywgIkRlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdGlvbl9MYW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0aW9uX1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocU5hbWVFQ2xhc3MsIFFOYW1lLmNsYXNzLCAiUU5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX05hbWVzcGFjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIiwgbnVsbCwgMCwgMSwgUU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX0xvY2FsUGFydCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYWxQYXJ0IiwgbnVsbCwgMCwgMSwgUU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX0NvbWJpbmVkUU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbWJpbmVkUU5hbWUiLCBudWxsLCAwLCAxLCBRTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UU5hbWVfSW50ZXJuYWxQcmVmaXhPck5zVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpbnRlcm5hbFByZWZpeE9yTnNVUkkiLCBudWxsLCAwLCAxLCBRTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxpc3RlbmVyRUNsYXNzLCBMaXN0ZW5lci5jbGFzcywgIkxpc3RlbmVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAibGlzdGVuZXJDbGFzcyIsIG51bGwsIDEsIDEsIExpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAiQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFyZ2VJY29uIiwgbnVsbCwgMCwgMSwgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGlzcGxheU5hbWUiLCBudWxsLCAwLCAxLCBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGoyRUVFT2JqZWN0RUNsYXNzLCBKMkVFRU9iamVjdC5jbGFzcywgIkoyRUVFT2JqZWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoajJFRUVBdHRyaWJ1dGVFQ2xhc3MsIEoyRUVFQXR0cmlidXRlLmNsYXNzLCAiSjJFRUVBdHRyaWJ1dGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuY2xhc3MsICJFbnZFbnRyeVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuU1RSSU5HX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5JTlRFR0VSX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5CT09MRUFOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5ET1VCTEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkJZVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLlNIT1JUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5MT05HX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5GTE9BVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuQ0hBUkFDVEVSX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShyZXNBdXRoVHlwZUJhc2VFRW51bSwgUmVzQXV0aFR5cGVCYXNlLmNsYXNzLCAiUmVzQXV0aFR5cGVCYXNlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoVHlwZUJhc2VFRW51bSwgUmVzQXV0aFR5cGVCYXNlLkNPTlRBSU5FUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc0F1dGhUeXBlQmFzZUVFbnVtLCBSZXNBdXRoVHlwZUJhc2UuQVBQTElDQVRJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoVHlwZUJhc2VFRW51bSwgUmVzQXV0aFR5cGVCYXNlLlNFUlZMRVRfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGVqYlJlZlR5cGVFRW51bSwgRWpiUmVmVHlwZS5jbGFzcywgIkVqYlJlZlR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVqYlJlZlR5cGVFRW51bSwgRWpiUmVmVHlwZS5TRVNTSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZWpiUmVmVHlwZUVFbnVtLCBFamJSZWZUeXBlLkVOVElUWV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0ocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCBSZXNTaGFyaW5nU2NvcGVUeXBlLmNsYXNzLCAiUmVzU2hhcmluZ1Njb3BlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCBSZXNTaGFyaW5nU2NvcGVUeXBlLlNIQVJFQUJMRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSwgUmVzU2hhcmluZ1Njb3BlVHlwZS5VTlNIQVJFQUJMRV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwobWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5DT05TVU1FU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuUFJPRFVDRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLkNPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9Db21tb25QYWNrYWdlSW1wbAotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjOGQ3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgZXh0ZW5kcyBEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U21hbGxJY29uKCkgPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU01BTExfSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTbWFsbEljb24oKSA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNtYWxsSWNvbiA9IFNNQUxMX0lDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFyZ2VJY29uKCkgPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFSR0VfSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXJnZUljb24oKSA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhcmdlSWNvbiA9IExBUkdFX0lDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZSgpIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWUoKSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5TmFtZSA9IERJU1BMQVlfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZUFkYXB0ZXJzKCkuYWRkKG5ldyBEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgCi0JCQlyZXR1cm4gZ2V0U21hbGxJY29uR2VuKCk7Ci0JCQotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQlyZXR1cm4gZ2V0U21hbGxJY29uR2VuKCk7IAotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJZGVmYXVsdCA6Ci0JCQlpZiAoZ2V0SWNvbnMoKS5zaXplKCkgPiAwKQotCQkJCXJldHVybiAoKEljb25UeXBlKWdldEljb25zKCkuZ2V0KDApKS5nZXRTbWFsbEljb24oKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJc2V0U21hbGxJY29uR2VuKG5ld1NtYWxsSWNvbik7Ci0JCQlpbnRlcm5hbFNldFNtYWxsSWNvbkluTGlzdChuZXdTbWFsbEljb24pOyAKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJc2V0U21hbGxJY29uR2VuKG5ld1NtYWxsSWNvbik7Ci0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOiAKLQkJCWludGVybmFsU2V0U21hbGxJY29uSW5MaXN0KG5ld1NtYWxsSWNvbik7IAotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHBhcmFtIG5ld1NtYWxsSWNvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2V0U21hbGxJY29uSW5MaXN0KFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJSWNvblR5cGUgbmV3VmFsdWUgPSBudWxsOwotCQlpZihnZXRJY29ucygpLnNpemUoKSA+IDApIHsKLQkJCW5ld1ZhbHVlID0gKEljb25UeXBlKSBnZXRJY29ucygpLmdldCgwKTsKLQkJCW5ld1ZhbHVlLnNldFNtYWxsSWNvbihuZXdTbWFsbEljb24pOwotCQl9Ci0JCWVsc2UgewotCQkJbmV3VmFsdWUgPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJY29uVHlwZSgpOwotCQkJbmV3VmFsdWUuc2V0U21hbGxJY29uKG5ld1NtYWxsSWNvbik7Ci0JCQlnZXRJY29ucygpLmFkZChuZXdWYWx1ZSk7IAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTbWFsbEljb25HZW4oKSB7Ci0JCXJldHVybiBzbWFsbEljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U21hbGxJY29uR2VuKFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJU3RyaW5nIG9sZFNtYWxsSWNvbiA9IHNtYWxsSWNvbjsKLQkJc21hbGxJY29uID0gbmV3U21hbGxJY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT04sIG9sZFNtYWxsSWNvbiwgc21hbGxJY29uKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7Ci0JCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIAotCQkJcmV0dXJuIGdldExhcmdlSWNvbkdlbigpOwotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJcmV0dXJuIGdldExhcmdlSWNvbkdlbigpOyAKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOgotCQkJaWYgKGdldEljb25zKCkuc2l6ZSgpID4gMCkKLQkJCQlyZXR1cm4gKChJY29uVHlwZSlnZXRJY29ucygpLmdldCgwKSkuZ2V0TGFyZ2VJY29uKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgbmV3TGFyZ2VJY29uKSB7Ci0JCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCXNldExhcmdlSWNvbkdlbihuZXdMYXJnZUljb24pOwotCQkJaW50ZXJuYWxTZXRMYXJnZUljb25Jbkxpc3QobmV3TGFyZ2VJY29uKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJc2V0TGFyZ2VJY29uR2VuKG5ld0xhcmdlSWNvbik7Ci0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOiAKLQkJCWludGVybmFsU2V0TGFyZ2VJY29uSW5MaXN0KG5ld0xhcmdlSWNvbik7IAotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3TGFyZ2VJY29uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTZXRMYXJnZUljb25Jbkxpc3QoU3RyaW5nIG5ld0xhcmdlSWNvbikgewotCQlJY29uVHlwZSBuZXdWYWx1ZSA9IG51bGw7Ci0JCWlmKGdldEljb25zKCkuc2l6ZSgpID4gMCkgewotCQkJbmV3VmFsdWUgPSAoSWNvblR5cGUpIGdldEljb25zKCkuZ2V0KDApOwotCQkJbmV3VmFsdWUuc2V0TGFyZ2VJY29uKG5ld0xhcmdlSWNvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdWYWx1ZSA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUljb25UeXBlKCk7Ci0JCQluZXdWYWx1ZS5zZXRMYXJnZUljb24obmV3TGFyZ2VJY29uKTsKLQkJCWdldEljb25zKCkuYWRkKG5ld1ZhbHVlKTsgCi0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXJnZUljb25HZW4oKSB7Ci0JCXJldHVybiBsYXJnZUljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uR2VuKFN0cmluZyBuZXdMYXJnZUljb24pIHsKLQkJU3RyaW5nIG9sZExhcmdlSWNvbiA9IGxhcmdlSWNvbjsKLQkJbGFyZ2VJY29uID0gbmV3TGFyZ2VJY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT04sIG9sZExhcmdlSWNvbiwgbGFyZ2VJY29uKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgCi0JCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25HZW4oKTsKLQkJCi0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbkdlbigpOyAKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOgotCQkJaWYgKGdldERlc2NyaXB0aW9ucygpLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuICgoRGVzY3JpcHRpb24pZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApKS5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJc2V0RGVzY3JpcHRpb25HZW4obmV3RGVzY3JpcHRpb24pOwotCQkJaW50ZXJuYWxTZXREZXNjcmlwdGlvbkluTGlzdChuZXdEZXNjcmlwdGlvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCXNldERlc2NyaXB0aW9uR2VuKG5ld0Rlc2NyaXB0aW9uKTsKLQkJCWJyZWFrOwotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJZGVmYXVsdCA6Ci0JCQlpbnRlcm5hbFNldERlc2NyaXB0aW9uSW5MaXN0KG5ld0Rlc2NyaXB0aW9uKTsgCi0JCQlicmVhazsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbmV3RGVzY3JpcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFNldERlc2NyaXB0aW9uSW5MaXN0KFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlEZXNjcmlwdGlvbiBuZXdWYWx1ZSA9IG51bGw7Ci0JCWlmKGdldERlc2NyaXB0aW9ucygpLnNpemUoKSA+IDApIHsKLQkJCW5ld1ZhbHVlID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0JCQluZXdWYWx1ZS5zZXRWYWx1ZShuZXdEZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdWYWx1ZSA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQluZXdWYWx1ZS5zZXRWYWx1ZShuZXdEZXNjcmlwdGlvbik7Ci0JCQlnZXREZXNjcmlwdGlvbnMoKS5hZGQobmV3VmFsdWUpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25HZW4oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbkdlbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIAotCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lR2VuKCk7Ci0JCQotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVHZW4oKTsgCi0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotCQlkZWZhdWx0IDoKLQkJCWlmIChnZXREaXNwbGF5TmFtZXMoKS5zaXplKCkgPiAwKQotCQkJCXJldHVybiAoKERpc3BsYXlOYW1lKWdldERpc3BsYXlOYW1lcygpLmdldCgwKSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI3NldERpc3BsYXlOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCXNldERpc3BsYXlOYW1lR2VuKG5ld0Rpc3BsYXlOYW1lKTsKLQkJCWludGVybmFsU2V0RGlzcGxheU5hbWVJbkxpc3QobmV3RGlzcGxheU5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQlzZXREaXNwbGF5TmFtZUdlbihuZXdEaXNwbGF5TmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOgotCQkJaW50ZXJuYWxTZXREaXNwbGF5TmFtZUluTGlzdChuZXdEaXNwbGF5TmFtZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdEaXNwbGF5TmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2V0RGlzcGxheU5hbWVJbkxpc3QoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCURpc3BsYXlOYW1lIG5ld1ZhbHVlID0gbnVsbDsKLQkJaWYoZ2V0RGlzcGxheU5hbWVzKCkuc2l6ZSgpID4gMCkgewotCQkJbmV3VmFsdWUgPSAoRGlzcGxheU5hbWUpIGdldERpc3BsYXlOYW1lcygpLmdldCgwKTsKLQkJCW5ld1ZhbHVlLnNldFZhbHVlKG5ld0Rpc3BsYXlOYW1lKTsKLQkJfQotCQllbHNlICB7Ci0JCQluZXdWYWx1ZSA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0JCQluZXdWYWx1ZS5zZXRWYWx1ZShuZXdEaXNwbGF5TmFtZSk7Ci0JCQlnZXREaXNwbGF5TmFtZXMoKS5hZGQobmV3VmFsdWUpOwotCQl9CQkJICAKLQkJCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZUdlbigpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lR2VuKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlTdHJpbmcgb2xkRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQkJZGlzcGxheU5hbWUgPSBuZXdEaXNwbGF5TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUUsIG9sZERpc3BsYXlOYW1lLCBkaXNwbGF5TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oTEFSR0VfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKERJU1BMQVlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gU01BTExfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gc21hbGxJY29uICE9IG51bGwgOiAhU01BTExfSUNPTl9FREVGQVVMVC5lcXVhbHMoc21hbGxJY29uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gRElTUExBWV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBkaXNwbGF5TmFtZSAhPSBudWxsIDogIURJU1BMQVlfTkFNRV9FREVGQVVMVC5lcXVhbHMoZGlzcGxheU5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc21hbGxJY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzbWFsbEljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhcmdlSWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFyZ2VJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpc3BsYXlOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkaXNwbGF5TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uR3JvdXBBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4N2IyZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotCi0KLQotLyoqCi0JICogQGF1dGhvciBjYnJpZGdoYQotCSAqCi0JICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0JICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbkdyb3VwX0ljb25zKCkgfHwKLQkJCQkJbXNnLmdldEZlYXR1cmUoKSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJY29uVHlwZV9MYXJnZUljb24oKSB8fAotCQkJCQltc2cuZ2V0RmVhdHVyZSgpID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEljb25UeXBlX1NtYWxsSWNvbigpKSB7Ci0JCQkJCXN5bmNoSWNvbnMoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCWVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKSB8fAotCQkJCQltc2cuZ2V0RmVhdHVyZSgpID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uX1ZhbHVlKCkpIHsKLQkJCQkJc3luY2hEZXNjcmlwdGlvbigpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lcygpIHx8Ci0JCQkJCW1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzcGxheU5hbWVfVmFsdWUoKSkgewotCQkJCQlzeW5jaERpc3BsYXlOYW1lKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzeW5jaERlc2NyaXB0aW9uKCkgewotCQkJQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgbXlUYXJnZXQgPSAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXApZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAobXlUYXJnZXQuZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKQotCQkJCW15VGFyZ2V0LnNldERlc2NyaXB0aW9uR2VuKG51bGwpOwotCQkJZWxzZSB7Ci0JCQkJRGVzY3JpcHRpb24gYURlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKW15VGFyZ2V0LmdldERlc2NyaXB0aW9ucygpLmdldCgwKTsKLQkJCQlpZiAoIWFEZXNjcmlwdGlvbi5lQWRhcHRlcnMoKS5jb250YWlucyh0aGlzKSkKLQkJCQkJYURlc2NyaXB0aW9uLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCQllbHNlIAotCQkJCQlteVRhcmdldC5zZXREZXNjcmlwdGlvbkdlbihhRGVzY3JpcHRpb24uZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc3luY2hEaXNwbGF5TmFtZSgpIHsKLQkJCUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG15VGFyZ2V0ID0gKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKWdldFRhcmdldCgpOwotCQkJaWYgKG15VGFyZ2V0LmdldERpc3BsYXlOYW1lcygpLmlzRW1wdHkoKSkKLQkJCQlteVRhcmdldC5zZXREaXNwbGF5TmFtZUdlbihudWxsKTsKLQkJCWVsc2UgewotCQkJCURpc3BsYXlOYW1lIGFEaXNwbGF5TmFtZSA9IChEaXNwbGF5TmFtZSlteVRhcmdldC5nZXREaXNwbGF5TmFtZXMoKS5nZXQoMCk7Ci0JCQkJaWYgKCFhRGlzcGxheU5hbWUuZUFkYXB0ZXJzKCkuY29udGFpbnModGhpcykpCi0JCQkJCWFEaXNwbGF5TmFtZS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQkJbXlUYXJnZXQuc2V0RGlzcGxheU5hbWVHZW4oYURpc3BsYXlOYW1lLmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHN5bmNoSWNvbnMoKSB7Ci0JCQlDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBteVRhcmdldCA9IChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cClnZXRUYXJnZXQoKTsKLQkJCWlmIChteVRhcmdldC5nZXRJY29ucygpLmlzRW1wdHkoKSkgewotCQkJCW15VGFyZ2V0LnNldExhcmdlSWNvbkdlbihudWxsKTsKLQkJCQlteVRhcmdldC5zZXRTbWFsbEljb25HZW4obnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJY29uVHlwZSBhbkljb24gPSAoSWNvblR5cGUpbXlUYXJnZXQuZ2V0SWNvbnMoKS5nZXQoMCk7Ci0JCQkJaWYgKCFhbkljb24uZUFkYXB0ZXJzKCkuY29udGFpbnModGhpcykpCi0JCQkJCWFuSWNvbi5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCW15VGFyZ2V0LnNldExhcmdlSWNvbkdlbihhbkljb24uZ2V0TGFyZ2VJY29uKCkpOwotCQkJCQlteVRhcmdldC5zZXRTbWFsbEljb25HZW4oYW5JY29uLmdldFNtYWxsSWNvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjc2V0VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJaWYgKG5ld1RhcmdldCBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKQotCQkJc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25Hcm91cEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTJlOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25Hcm91cEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT5BbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb24gR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25Hcm91cEltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkdyb3VwSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uR3JvdXBJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRGVzY3JpcHRpb25Hcm91cCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0SWNvbnMoKSBAZ2VuZXJhdGVkIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPjwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpIEBnZW5lcmF0ZWQgQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkgQGdlbmVyYXRlZCBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT48IS0tIGVuZC11c2VyLWRvYyAtLT5AZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0aW9uR3JvdXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+QGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVElPTl9HUk9VUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPjwhLS0gZW5kLXVzZXItZG9jIC0tPkBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SWNvbnMoKSB7Ci0JCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uVHlwZS5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fSUNPTlMpOwotCQl9Ci0JCXJldHVybiBpY29uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPjwhLS0gZW5kLXVzZXItZG9jIC0tPkBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPjwhLS0gZW5kLXVzZXItZG9jIC0tPkBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRGVzY3JpcHRpb25Hcm91cCNnZXRKMkVFVmVyc2lvbklEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJCi0JCXRyeSB7Ci0JCQlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQlyZXR1cm4gcmVzLmdldEoyRUVWZXJzaW9uSUQoKTsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQl9Ci0JCQotCX0KLQotfSAvL0Rlc2NyaXB0aW9uR3JvdXBJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDEwYTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25JbXBsI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFuZyA9IExBTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZygpIHsKLQkJcmV0dXJuIGxhbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZyhTdHJpbmcgbmV3TGFuZykgewotCQlTdHJpbmcgb2xkTGFuZyA9IGxhbmc7Ci0JCWxhbmcgPSBuZXdMYW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HLCBvbGRMYW5nLCBsYW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fTEFORzoKLQkJCQlyZXR1cm4gZ2V0TGFuZygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgotCQkJCXNldExhbmcoTEFOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkc6Ci0JCQkJcmV0dXJuIExBTkdfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmcgIT0gbnVsbCA6ICFMQU5HX0VERUZBVUxULmVxdWFscyhsYW5nKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsYW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rpc3BsYXlOYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMGQwMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwbGF5TmFtZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBEaXNwbGF5TmFtZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFuZyA9IExBTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNwbGF5TmFtZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRJU1BMQVlfTkFNRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmcoKSB7Ci0JCXJldHVybiBsYW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmcoU3RyaW5nIG5ld0xhbmcpIHsKLQkJU3RyaW5nIG9sZExhbmcgPSBsYW5nOwotCQlsYW5nID0gbmV3TGFuZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkcsIG9sZExhbmcsIGxhbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkc6Ci0JCQkJcmV0dXJuIGdldExhbmcoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkc6Ci0JCQkJc2V0TGFuZyhMQU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19MQU5HOgotCQkJCXJldHVybiBMQU5HX0VERUZBVUxUID09IG51bGwgPyBsYW5nICE9IG51bGwgOiAhTEFOR19FREVGQVVMVC5lcXVhbHMobGFuZyk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxhbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rpc3BsYXlOYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRUpCTG9jYWxSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FSkJMb2NhbFJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4MTMyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FSkJMb2NhbFJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLQotLyoqCi0gKiBUaGUgZWpiLWxvY2FsLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbm90aGVyIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSByZWZlcmVuY2luZyBlbnRlcnByaXNlIGJlYW47IHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbjsgdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyBhbmQgYW4gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24uIFRoZSBvcHRpb25hbCBlamItbGluayBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0gKiBVc2VkIGluOiBlbnRpdHksIHNlc3Npb24sIG1lc3NhZ2UtZHJpdmVuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJMb2NhbFJlZkltcGwgZXh0ZW5kcyBFamJSZWZJbXBsIGltcGxlbWVudHMgRUpCTG9jYWxSZWYgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsSG9tZSgpIDxlbT5Mb2NhbCBIb21lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0hPTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxIb21lKCkgPGVtPkxvY2FsIEhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhbEhvbWUgPSBMT0NBTF9IT01FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsKCkgPGVtPkxvY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWwoKSA8ZW0+TG9jYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsID0gTE9DQUxfRURFRkFVTFQ7Ci0KLQlwdWJsaWMgRUpCTG9jYWxSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRUpCX0xPQ0FMX1JFRjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsSG9tZSgpIHsKLQkJcmV0dXJuIGxvY2FsSG9tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEhvbWUoU3RyaW5nIG5ld0xvY2FsSG9tZSkgewotCQlTdHJpbmcgb2xkTG9jYWxIb21lID0gbG9jYWxIb21lOwotCQlsb2NhbEhvbWUgPSBuZXdMb2NhbEhvbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRSwgb2xkTG9jYWxIb21lLCBsb2NhbEhvbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsKCkgewotCQlyZXR1cm4gbG9jYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWwoU3RyaW5nIG5ld0xvY2FsKSB7Ci0JCVN0cmluZyBvbGRMb2NhbCA9IGxvY2FsOwotCQlsb2NhbCA9IG5ld0xvY2FsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMLCBvbGRMb2NhbCwgbG9jYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRToKLQkJCQlyZXR1cm4gZ2V0TG9jYWxIb21lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJcmV0dXJuIGdldExvY2FsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FOgotCQkJCXNldExvY2FsSG9tZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJc2V0TG9jYWwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FOgotCQkJCXNldExvY2FsSG9tZShMT0NBTF9IT01FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJc2V0TG9jYWwoTE9DQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMX0hPTUU6Ci0JCQkJcmV0dXJuIExPQ0FMX0hPTUVfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsSG9tZSAhPSBudWxsIDogIUxPQ0FMX0hPTUVfRURFRkFVTFQuZXF1YWxzKGxvY2FsSG9tZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUw6Ci0JCQkJcmV0dXJuIExPQ0FMX0VERUZBVUxUID09IG51bGwgPyBsb2NhbCAhPSBudWxsIDogIUxPQ0FMX0VERUZBVUxULmVxdWFscyhsb2NhbCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsb2NhbEhvbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2FsSG9tZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9jYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2FsKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBlamJyZWYgaXMgZm9yIGEgbG9jYWwgZWpiIGludGVyZmFjZS4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNMb2NhbCgpewotCXJldHVybiB0cnVlOwotfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5FamJSZWYjZ2V0UmVtb3RlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZSgpIHsKLQkJcmV0dXJuIGdldExvY2FsKCk7IC8vZm9yd2FyZCB0byB0aGUgbG9jYWwKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkVqYlJlZiNzZXRSZW1vdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGUoU3RyaW5nIHZhbHVlKSB7Ci0JCXNldExvY2FsKHZhbHVlKTsgLy9mb3J3YXJkIHRvIHRoZSBsb2NhbAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRWpiUmVmI2dldEhvbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG9tZSgpIHsKLQkJcmV0dXJuIGdldExvY2FsSG9tZSgpOyAvL2ZvcndhcmQgdG8gdGhlIGxvY2FsIGhvbWUKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkVqYlJlZiNzZXRIb21lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9tZShTdHJpbmcgdmFsdWUpIHsKLQkJc2V0TG9jYWxIb21lKHZhbHVlKTsgLy9mb3J3YXJkIHRvIHRoZSBsb2NhbCBob21lCi0JfQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VqYlJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VqYlJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlNTlmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FamJSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLS8qKgotICogVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNsaWVudDsgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyBhbmQgYW4gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24uIFRoZSBvcHRpb25hbCAgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiUmVmSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVqYlJlZiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlIFRZUEVfRURFRkFVTFQgPSBFamJSZWZUeXBlLlNFU1NJT05fTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFamJSZWZUeXBlIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb21lKCkgPGVtPkhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBob21lID0gSE9NRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtb3RlKCkgPGVtPlJlbW90ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtb3RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZW1vdGUgPSBSRU1PVEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmsoKSA8ZW0+TGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpbmsgPSBMSU5LX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgRWpiUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkVKQl9SRUY7Ci0JfQotCi0vKioKLSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmLCBpZiBvbmUgZXhpc3RzLCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwYXJhbWV0ZXIuCi0gKiBUaGUgZWpiLWxpbmsgdmFsdWUgb2YgdGhlIHJlZiBtdXN0IGVxdWF0ZSB0byBhIG5hbWVkIGVudGVycHJpc2UgYmVhbiBjb250YWluZWQgaW4gdGhlIGphcjsgb3RoZXJ3aXNlIAotICogcmV0dXJuIG51bGwKLSAqLwotcHVibGljIEVudGVycHJpc2VCZWFuIGdldExpbmtlZEVqYihFSkJKYXIgZWpiSmFyKSB7Ci0JaWYgKGdldExpbmsoKSA9PSBudWxsKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlyZXR1cm4gZWpiSmFyLmdldEVudGVycGlzZUJlYW5Gcm9tUmVmKHRoaXMpOwotfS8qKgotICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMsIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBhcmFtZXRlci4KLSAqIFRoZSBlamItbGluayB2YWx1ZSBvZiB0aGUgcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgCi0gKiByZXR1cm4gbnVsbAotICovICAKLXB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudChFamJSZWYgYW5FamJSZWYpIHsKLQlpZiAoYW5FamJSZWYgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCWJvb2xlYW4gZXF1aXYgPSB0cnVlOwotCWVxdWl2ID0gZ2V0TmFtZSgpID09IGFuRWpiUmVmLmdldE5hbWUoKSB8fCAoZ2V0TmFtZSgpICE9IG51bGwgJiYgZ2V0TmFtZSgpLmVxdWFscyhhbkVqYlJlZi5nZXROYW1lKCkpKTsKLQlpZiAoZXF1aXYpCi0JCWVxdWl2ID0gZ2V0SG9tZSgpID09IGFuRWpiUmVmLmdldEhvbWUoKSB8fCAoZ2V0SG9tZSgpICE9IG51bGwgJiYgZ2V0SG9tZSgpLmVxdWFscyhhbkVqYlJlZi5nZXRIb21lKCkpKTsKLQlpZiAoZXF1aXYpCi0JCWVxdWl2ID0gZ2V0UmVtb3RlKCkgPT0gYW5FamJSZWYuZ2V0UmVtb3RlKCkgfHwgKGdldFJlbW90ZSgpICE9IG51bGwgJiYgZ2V0UmVtb3RlKCkuZXF1YWxzKGFuRWpiUmVmLmdldFJlbW90ZSgpKSk7Ci0JaWYgKGVxdWl2KQotCQllcXVpdiA9IGdldExpbmsoKSA9PSBhbkVqYlJlZi5nZXRMaW5rKCkgfHwgKGdldExpbmsoKSAhPSBudWxsICYmIGdldExpbmsoKS5lcXVhbHMoYW5FamJSZWYuZ2V0TGluaygpKSk7Ci0JcmV0dXJuIGVxdWl2OwotfQotcHVibGljIGJvb2xlYW4gaXNMaW5rZWQoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQlpZiAoZ2V0TGluaygpID09IG51bGwpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gZ2V0TGluaygpLmVxdWFscyhhbkVKQi5nZXROYW1lKCkpOwotfQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZWpicmVmIGlzIGZvciBhIGxvY2FsIGVqYiBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzTG9jYWwoKXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoaXMgaXMgdGhlIEpOREkgbmFtZSB0aGF0IHRoZSBzZXJ2bGV0IGNvZGUgdXNlcyB0byBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGVudGVycHJpc2UgYmVhbi4KLQkgKiBFeGFtcGxlOiA8ZWpiLXJlZi1uYW1lPmVqYi8vUGF5cm9sbDwvL2VqYi1yZWYtbmFtZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4gVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICogPGVqYi1yZWYtdHlwZT5FbnRpdHk8Ly9lamItcmVmLXR5cGU+Ci0JICogPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC8vZWpiLXJlZi10eXBlPgotCSAqLwotCXB1YmxpYyBFamJSZWZUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoRWpiUmVmVHlwZSBuZXdUeXBlKSB7Ci0JCUVqYlJlZlR5cGUgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlID09IG51bGwgPyBUWVBFX0VERUZBVUxUIDogbmV3VHlwZTsKLQkJYm9vbGVhbiBvbGRUeXBlRVNldCA9IHR5cGVFU2V0OwotCQl0eXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fVFlQRSwgb2xkVHlwZSwgdHlwZSwgIW9sZFR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRUeXBlKCkgewotCQlFamJSZWZUeXBlIG9sZFR5cGUgPSB0eXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGUgPSBUWVBFX0VERUZBVUxUOwotCQl0eXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fVFlQRSwgb2xkVHlwZSwgVFlQRV9FREVGQVVMVCwgb2xkVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0JICogRXhhbXBsZTogPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8Ly9ob21lPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG9tZSgpIHsKLQkJcmV0dXJuIGhvbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9tZShTdHJpbmcgbmV3SG9tZSkgewotCQlTdHJpbmcgb2xkSG9tZSA9IGhvbWU7Ci0JCWhvbWUgPSBuZXdIb21lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0hPTUUsIG9sZEhvbWUsIGhvbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlKCkgewotCQlyZXR1cm4gcmVtb3RlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZShTdHJpbmcgbmV3UmVtb3RlKSB7Ci0JCVN0cmluZyBvbGRSZW1vdGUgPSByZW1vdGU7Ci0JCXJlbW90ZSA9IG5ld1JlbW90ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19SRU1PVEUsIG9sZFJlbW90ZSwgcmVtb3RlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGVuY29tcGFzc2luZyBKMkVFIEFwcGxpY2F0aW9uIHBhY2thZ2UuIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgSjJFRSBBcHBsaWNhdGlvbiBwYWNrYWdlLiAKLQkgKiBFeGFtcGxlOiA8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8Ly9lamItbGluaz4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmsoKSB7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIG5ld0xpbmspIHsKLQkJU3RyaW5nIG9sZExpbmsgPSBsaW5rOwotCQlsaW5rID0gbmV3TGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19MSU5LLCBvbGRMaW5rLCBsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gVGhlCi0JICogICAgICAgICAgICBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0bwotCSAqICAgICAgICAgICAgcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiBUaGUgZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZQotCSAqICAgICAgICAgICAgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZQotCSAqICAgICAgICAgICAgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUKLQkgKiAgICAgICAgICAgIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4KLQkgKiAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uR2VuKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCWlmICghZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIAlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0gICAgICAgIAlpZiAoZCAhPSBudWxsKQotICAgICAgICAJCWQuc2V0VmFsdWUobmV3RGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0JCXNldERlc2NyaXB0aW9uR2VuKG5ld0Rlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYgKGdldERlc2NyaXB0aW9ucygpICE9IG51bGwgJiYgIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbiA9IGQuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19IT01FOgotCQkJCXJldHVybiBnZXRIb21lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fUkVNT1RFOgotCQkJCXJldHVybiBnZXRSZW1vdGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19MSU5LOgotCQkJCXJldHVybiBnZXRMaW5rKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fVFlQRToKLQkJCQlzZXRUeXBlKChFamJSZWZUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fSE9NRToKLQkJCQlzZXRIb21lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19SRU1PVEU6Ci0JCQkJc2V0UmVtb3RlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19MSU5LOgotCQkJCXNldExpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19UWVBFOgotCQkJCXVuc2V0VHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19IT01FOgotCQkJCXNldEhvbWUoSE9NRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX1JFTU9URToKLQkJCQlzZXRSZW1vdGUoUkVNT1RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fTElOSzoKLQkJCQlzZXRMaW5rKExJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19UWVBFOgotCQkJCXJldHVybiBpc1NldFR5cGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19IT01FOgotCQkJCXJldHVybiBIT01FX0VERUZBVUxUID09IG51bGwgPyBob21lICE9IG51bGwgOiAhSE9NRV9FREVGQVVMVC5lcXVhbHMoaG9tZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fUkVNT1RFOgotCQkJCXJldHVybiBSRU1PVEVfRURFRkFVTFQgPT0gbnVsbCA/IHJlbW90ZSAhPSBudWxsIDogIVJFTU9URV9FREVGQVVMVC5lcXVhbHMocmVtb3RlKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19MSU5LOgotCQkJCXJldHVybiBMSU5LX0VERUZBVUxUID09IG51bGwgPyBsaW5rICE9IG51bGwgOiAhTElOS19FREVGQVVMVC5lcXVhbHMobGluayk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlpZiAodHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhvbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGhvbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbW90ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtb3RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FbnZFbnRyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzFmNzNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5VHlwZTsKLQotLyoqCi0gKiBUaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJpZXMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwgdmFsdWUuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZFbnRyeUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbnZFbnRyeSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBUWVBFX0VERUZBVUxUID0gRW52RW50cnlUeXBlLlNUUklOR19MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVudkVudHJ5VHlwZSB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgRW52RW50cnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRU5WX0VOVFJZOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5LiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlci4KLQkgKiBVc2VkIGluOiBlbnYtZW50cnkKLQkgKiBFeGFtcGxlOgotCSAqIDxlbnYtZW50cnktdmFsdWU+Ly9kYXRhc291cmNlcy8vTXlEYXRhYmFzZTwvL2Vudi1lbnRyeS12YWx1ZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBjb2RlLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOiBqYXZhLmxhbmcuQm9vbC1lYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLCBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LCBqYXZhLmxhbmcuTG9uZywgYW5kIGphdmEubGFuZy5GbG9hdC4gCi0JICogRXhhbXBsZTogPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC8vZW52LWVudHJ5LXR5cGU+Ci0JICovCi0JcHVibGljIEVudkVudHJ5VHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEVudkVudHJ5VHlwZSBuZXdUeXBlKSB7Ci0JCUVudkVudHJ5VHlwZSBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX1RZUEUsIG9sZFR5cGUsIHR5cGUsICFvbGRUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHlwZSgpIHsKLQkJRW52RW50cnlUeXBlIG9sZFR5cGUgPSB0eXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGUgPSBUWVBFX0VERUZBVUxUOwotCQl0eXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19UWVBFLCBvbGRUeXBlLCBUWVBFX0VERUZBVUxULCBvbGRUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVFlQRToKLQkJCQlzZXRUeXBlKChFbnZFbnRyeVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX1RZUEU6Ci0JCQkJdW5zZXRUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRUeXBlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlpZiAodHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9JY29uVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0ljb25UeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTY0NjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0ljb25UeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JY29uIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkljb25UeXBlSW1wbCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkljb25UeXBlSW1wbCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkljb25UeXBlSW1wbCNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSWNvblR5cGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgSWNvblR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTbWFsbEljb24oKSA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTTUFMTF9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNtYWxsSWNvbigpIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc21hbGxJY29uID0gU01BTExfSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXJnZUljb24oKSA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVJHRV9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhcmdlSWNvbigpIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFyZ2VJY29uID0gTEFSR0VfSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhbmcgPSBMQU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEljb25UeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSUNPTl9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgewotCQlyZXR1cm4gc21hbGxJY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgbmV3U21hbGxJY29uKSB7Ci0JCVN0cmluZyBvbGRTbWFsbEljb24gPSBzbWFsbEljb247Ci0JCXNtYWxsSWNvbiA9IG5ld1NtYWxsSWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX1NNQUxMX0lDT04sIG9sZFNtYWxsSWNvbiwgc21hbGxJY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7Ci0JCXJldHVybiBsYXJnZUljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBuZXdMYXJnZUljb24pIHsKLQkJU3RyaW5nIG9sZExhcmdlSWNvbiA9IGxhcmdlSWNvbjsKLQkJbGFyZ2VJY29uID0gbmV3TGFyZ2VJY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFSR0VfSUNPTiwgb2xkTGFyZ2VJY29uLCBsYXJnZUljb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmcoKSB7Ci0JCXJldHVybiBsYW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmcoU3RyaW5nIG5ld0xhbmcpIHsKLQkJU3RyaW5nIG9sZExhbmcgPSBsYW5nOwotCQlsYW5nID0gbmV3TGFuZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX0xBTkcsIG9sZExhbmcsIGxhbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFORzoKLQkJCQlyZXR1cm4gZ2V0TGFuZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX0xBTkc6Ci0JCQkJc2V0TGFuZyhMQU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFORzoKLQkJCQlyZXR1cm4gTEFOR19FREVGQVVMVCA9PSBudWxsID8gbGFuZyAhPSBudWxsIDogIUxBTkdfRURFRkFVTFQuZXF1YWxzKGxhbmcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc21hbGxJY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzbWFsbEljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhcmdlSWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFyZ2VJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSWNvblR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9JZGVudGl0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0lkZW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2M5ZWJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0lkZW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci0KLQotLyoqCi0gKiBTcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBJZGVudGl0eSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVOYW1lKCkgPGVtPlJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJvbGVOYW1lID0gUk9MRV9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBJZGVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5JREVOVElUWTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBydW4gYXMgaWRlbnRpdHkuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQkgKiAKLQkgKiBUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZSgpIHsKLQkJcmV0dXJuIHJvbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGVOYW1lKFN0cmluZyBuZXdSb2xlTmFtZSkgewotCQlTdHJpbmcgb2xkUm9sZU5hbWUgPSByb2xlTmFtZTsKLQkJcm9sZU5hbWUgPSBuZXdSb2xlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fUk9MRV9OQU1FLCBvbGRSb2xlTmFtZSwgcm9sZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBnZXRSb2xlTmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fUk9MRV9OQU1FOgotCQkJCXNldFJvbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoUk9MRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBST0xFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGVOYW1lICE9IG51bGwgOiAhUk9MRV9OQU1FX0VERUZBVUxULmVxdWFscyhyb2xlTmFtZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJvbGVOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyb2xlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVFQXR0cmlidXRlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRUVBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTEzMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRUVBdHRyaWJ1dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQXR0cmlidXRlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkoyRUVFIEF0dHJpYnV0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEoyRUVFQXR0cmlidXRlSW1wbCBleHRlbmRzIEVBdHRyaWJ1dGVJbXBsIGltcGxlbWVudHMgSjJFRUVBdHRyaWJ1dGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKMkVFRUF0dHJpYnV0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkoyRUVFX0FUVFJJQlVURTsKLQl9Ci0KLX0gLy9KMkVFRUF0dHJpYnV0ZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVFT2JqZWN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRUVPYmplY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMjk0N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRUVPYmplY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SjJFRUUgT2JqZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSjJFRUVPYmplY3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEoyRUVFT2JqZWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSjJFRUVfT0JKRUNUOwotCX0KLQotfSAvL0oyRUVFT2JqZWN0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVSZXNvdWNlRmFjdG9yeVNheFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTBhNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTEsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25SZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFyUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzZGQuV3NkZFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMlNBWFJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZQotICogYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFUmVzb3VjZUZhY3RvcnlTYXhSZWdpc3RyeSBleHRlbmRzIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSB7Ci0gICAgcHVibGljIHN0YXRpYyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkoKTsKLQotICAgIHB1YmxpYyBKMkVFUmVzb3VjZUZhY3RvcnlTYXhSZWdpc3RyeSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaW5pdFJlZ2lzdHJhdGlvbigpOwotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJlZ2lzdHJhdGlvbigpIHsKLSAgICAJRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgbmV3IEVKQkphclJlc291cmNlRmFjdG9yeShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1NIT1JUX05BTUUsIG5ldyBXZWJBcHBSZXNvdXJjZUZhY3RvcnkoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfU0hPUlRfTkFNRSwgbmV3IEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5KEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9TSE9SVF9OQU1FLCBuZXcgQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnkoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLlJBUl9TSE9SVF9OQU1FLCBuZXcgQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5KEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NIT1JUTkFNRSwgbmV3IFdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5KEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX0REX1NIT1JUX05BTUUsIG5ldyBXc2RkUmVzb3VyY2VGYWN0b3J5KEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQl9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5RG9tUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVSZXNvdXJjZUZhY3RvcnlEb21SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWI1OTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVSZXNvdXJjZUZhY3RvcnlEb21SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAyMCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25SZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFyUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzZGQuV3NkZFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyU0FYUmVuZGVyZXJGYWN0b3J5OwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVSZXNvdXJjZUZhY3RvcnlEb21SZWdpc3RyeQotICAgICAgICBleHRlbmRzIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSB7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgSjJFRVJlc291cmNlRmFjdG9yeURvbVJlZ2lzdHJ5KCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpbml0UmVnaXN0cmF0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbml0UmVnaXN0cmF0aW9uKCkgewotICAgIAlFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FLCBuZXcgRUpCSmFyUmVzb3VyY2VGYWN0b3J5KEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfU0hPUlRfTkFNRSwgbmV3IFdlYkFwcFJlc291cmNlRmFjdG9yeShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9TSE9SVF9OQU1FLCBuZXcgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1NIT1JUX05BTUUsIG5ldyBBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuUkFSX1NIT1JUX05BTUUsIG5ldyBDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfU0hPUlROQU1FLCBuZXcgV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfRERfU0hPUlRfTkFNRSwgbmV3IFdzZGRSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyOWFiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgewotCQotCXB1YmxpYyBzdGF0aWMgSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCi0JcHVibGljIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlLkZhY3RvcnkgZGVsZWdhdGVkR2V0RmFjdG9yeShVUkkgdXJpKSB7Ci0JCWlmIChKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UgPT0gdGhpcykKLQkJCXJldHVybiBzdXBlci5kZWxlZ2F0ZWRHZXRGYWN0b3J5KHVyaSk7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeSh1cmkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KTkRJRW52UmVmc0dyb3VwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSk5ESUVudlJlZnNHcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ5YjhlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KTkRJRW52UmVmc0dyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkpOREkgRW52IFJlZnMgR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsI2dldEVudmlyb25tZW50UHJvcGVydGllcyA8ZW0+RW52aXJvbm1lbnQgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KTkRJRW52UmVmc0dyb3VwSW1wbCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwjZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwjZ2V0RWpiTG9jYWxSZWZzIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KTkRJRW52UmVmc0dyb3VwSW1wbCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSk5ESUVudlJlZnNHcm91cEltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBKTkRJRW52UmVmc0dyb3VwIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKSA8ZW0+RW52aXJvbm1lbnQgUHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnZpcm9ubWVudFByb3BlcnRpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VSZWZzKCkgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZnMoKSA8ZW0+RWpiIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYlJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VFbnZSZWZzKCkgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlRW52UmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJMb2NhbFJlZnMoKSA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTG9jYWxSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiTG9jYWxSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZzKCkgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlcnZpY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKTkRJRW52UmVmc0dyb3VwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSk5ESV9FTlZfUkVGU19HUk9VUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkgewotCQlpZiAoZW52aXJvbm1lbnRQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCWVudmlyb25tZW50UHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFbnZFbnRyeS5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gZW52aXJvbm1lbnRQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXNvdXJjZVJlZnMoKSB7Ci0JCWlmIChyZXNvdXJjZVJlZnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlUmVmLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVqYlJlZnMoKSB7Ci0JCWlmIChlamJSZWZzID09IG51bGwpIHsKLQkJCWVqYlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiUmVmLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gZWpiUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9FTlZfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRW52UmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RWpiTG9jYWxSZWZzKCkgewotCQlpZiAoZWpiTG9jYWxSZWZzID09IG51bGwpIHsKLQkJCWVqYkxvY2FsUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFSkJMb2NhbFJlZi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYkxvY2FsUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKLQkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPT0gbnVsbCkgewotCQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VydmljZVJlZnMoKSB7Ci0JCWlmIChzZXJ2aWNlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYlJlZnMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZW52aXJvbm1lbnRQcm9wZXJ0aWVzICE9IG51bGwgJiYgIWVudmlyb25tZW50UHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VSZWZzICE9IG51bGwgJiYgIXJlc291cmNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYlJlZnMgIT0gbnVsbCAmJiAhZWpiUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlRW52UmVmcyAhPSBudWxsICYmICFyZXNvdXJjZUVudlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9MT0NBTF9SRUZTOgotCQkJCXJldHVybiBlamJMb2NhbFJlZnMgIT0gbnVsbCAmJiAhZWpiTG9jYWxSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9uUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBzZXJ2aWNlUmVmcyAhPSBudWxsICYmICFzZXJ2aWNlUmVmcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0pORElFbnZSZWZzR3JvdXBJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9MaXN0ZW5lckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjhiYTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotCi0KLS8qKgotICogRGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBsaXN0ZW5lckNsYXNzID0gbnVsbDsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcm90ZWN0ZWQgTGlzdGVuZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5MSVNURU5FUjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCWlmIChsaXN0ZW5lckNsYXNzICE9IG51bGwgJiYgbGlzdGVuZXJDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkTGlzdGVuZXJDbGFzcyA9IChJbnRlcm5hbEVPYmplY3QpbGlzdGVuZXJDbGFzczsKLQkJCWxpc3RlbmVyQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkTGlzdGVuZXJDbGFzcyk7Ci0JCQlpZiAobGlzdGVuZXJDbGFzcyAhPSBvbGRMaXN0ZW5lckNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1MsIG9sZExpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdGVuZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIGxpc3RlbmVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXJDbGFzcyhKYXZhQ2xhc3MgbmV3TGlzdGVuZXJDbGFzcykgewotCQlKYXZhQ2xhc3Mgb2xkTGlzdGVuZXJDbGFzcyA9IGxpc3RlbmVyQ2xhc3M7Ci0JCWxpc3RlbmVyQ2xhc3MgPSBuZXdMaXN0ZW5lckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19MSVNURU5FUl9DTEFTUywgb2xkTGlzdGVuZXJDbGFzcywgbGlzdGVuZXJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMaXN0ZW5lckNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TGlzdGVuZXJDbGFzcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTOgotCQkJCXNldExpc3RlbmVyQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6Ci0JCQkJc2V0TGlzdGVuZXJDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19MSVNURU5FUl9DTEFTUzoKLQkJCQlyZXR1cm4gbGlzdGVuZXJDbGFzcyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLS8qKgotICogY3JlYXRlQ2xhc3NSZWYgLSByZXR1cm4gYSBKYXZhVVJMIHJlZmVyZW5jZSB0byB0aGUgbmFtZWQgSmF2YSBjbGFzcwotICovCi1wdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0JcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLX0KLS8qKgotICogR2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGxpc3RlbmVyLgotICovCi1wdWJsaWMgU3RyaW5nIGdldExpc3RlbmVyQ2xhc3NOYW1lKCkgewotCWdldExpc3RlbmVyQ2xhc3MoKTsKLQlyZXR1cm4gKGxpc3RlbmVyQ2xhc3MgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGxpc3RlbmVyIGNsYXNzIG5hbWUuCi0gKi8KLXB1YmxpYyB2b2lkIHNldExpc3RlbmVyQ2xhc3NOYW1lKFN0cmluZyBsaXN0ZW5lckNsYXNzTmFtZSkgewotCWVTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpLCBjcmVhdGVDbGFzc1JlZihsaXN0ZW5lckNsYXNzTmFtZSkpOwotfQotfSAvL0xpc3RlbmVySW1wbAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGJkYzNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvbkltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBNZXNzYWdlRGVzdGluYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEZXN0aW5hdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfREVTVElOQVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01lc3NhZ2VEZXN0aW5hdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkYWVkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldFVzYWdlIDxlbT5Vc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCNnZXRMaW5rIDxlbT5MaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZSgpIDxlbT5Vc2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIFVTQUdFX0VERUZBVUxUID0gTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLkNPTlNVTUVTX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZSgpIDxlbT5Vc2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgdXNhZ2UgPSBVU0FHRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEF1dGggYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlRVNldCA9IGZhbHNlOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rKCkgPGVtPkxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGluaygpIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpbmsgPSBMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfREVTVElOQVRJT05fUkVGOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGdldFVzYWdlKCkgewotCQlyZXR1cm4gdXNhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNhZ2UoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIG5ld1VzYWdlKSB7Ci0JCU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBvbGRVc2FnZSA9IHVzYWdlOwotCQl1c2FnZSA9IG5ld1VzYWdlID09IG51bGwgPyBVU0FHRV9FREVGQVVMVCA6IG5ld1VzYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19VU0FHRSwgb2xkVXNhZ2UsIHVzYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVzYWdlKCkgewotCQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgb2xkVXNhZ2UgPSB1c2FnZTsKLQkJYm9vbGVhbiBvbGRVc2FnZUVTZXQgPSB1c2VFU2V0OwotCQl1c2FnZSA9IFVTQUdFX0VERUZBVUxUOwotCQl1c2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fVVNBR0UsIG9sZFVzYWdlLCBVU0FHRV9FREVGQVVMVCwgb2xkVXNhZ2VFU2V0KSk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRVc2UoKSB7Ci0JCXJldHVybiB1c2VFU2V0OwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmsoKSB7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIG5ld0xpbmspIHsKLQkJU3RyaW5nIG9sZExpbmsgPSBsaW5rOwotCQlsaW5rID0gbmV3TGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSywgb2xkTGluaywgbGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19VU0FHRToKLQkJCQlyZXR1cm4gZ2V0VXNhZ2UoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gZ2V0TGluaygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1VTQUdFOgotCQkJCXNldFVzYWdlKChNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSzoKLQkJCQlzZXRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19VU0FHRToKLQkJCQlzZXRVc2FnZShVU0FHRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19MSU5LOgotCQkJCXNldExpbmsoTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1VTQUdFOgotCQkJCXJldHVybiB1c2FnZSAhPSBVU0FHRV9FREVGQVVMVDsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gTElOS19FREVGQVVMVCA9PSBudWxsID8gbGluayAhPSBudWxsIDogIUxJTktfRURFRkFVTFQuZXF1YWxzKGxpbmspOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXNhZ2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVzYWdlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUGFyYW1WYWx1ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1BhcmFtVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNDIyN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUGFyYW1WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcmFtIFZhbHVlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5QYXJhbVZhbHVlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5QYXJhbVZhbHVlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUGFyYW1WYWx1ZUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBhcmFtVmFsdWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYXJhbVZhbHVlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuUEFSQU1fVkFMVUU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUGFyYW1WYWx1ZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1FOYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUU5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNWU5NDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUU5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbCNnZXRMb2NhbFBhcnQgPGVtPkxvY2FsIFBhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbCNnZXRDb21iaW5lZFFOYW1lIDxlbT5Db21iaW5lZCBRTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsI2dldEludGVybmFsUHJlZml4T3JOc1VSSSA8ZW0+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFFOYW1lSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFFOYW1lIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IE5BTUVTUEFDRV9VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxQYXJ0KCkgPGVtPkxvY2FsIFBhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsUGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfUEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbFBhcnQoKSA8ZW0+TG9jYWwgUGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsUGFydCA9IExPQ0FMX1BBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tYmluZWRRTmFtZSgpIDxlbT5Db21iaW5lZCBRTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tYmluZWRRTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NQklORURfUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tYmluZWRRTmFtZSgpIDxlbT5Db21iaW5lZCBRTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tYmluZWRRTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21iaW5lZFFOYW1lID0gQ09NQklORURfUU5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCkgPGVtPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVybmFsUHJlZml4T3JOc1VSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKSA8ZW0+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGludGVybmFsUHJlZml4T3JOc1VSSSA9IElOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUU5hbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5RTkFNRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSUdlbigpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZVVSSTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotCQkJcmV0dXJuIG5hbWVzcGFjZVVSSTsKLQkJU3RyaW5nIHJlc29sdmVkID0gTmFtZXNwYWNlQWRhcHRlci5nZXRSZXNvbHZlZE5hbWVzcGFjZVVSSShpbnRlcm5hbFByZWZpeE9yTnNVUkksIHRoaXMpOwotCQlyZXR1cm4gcmVzb2x2ZWQgPT0gbnVsbCA/IGludGVybmFsUHJlZml4T3JOc1VSSSA6IHJlc29sdmVkOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUklHZW4oU3RyaW5nIG5ld05hbWVzcGFjZVVSSSkgewotCQlTdHJpbmcgb2xkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCQluYW1lc3BhY2VVUkkgPSBuZXdOYW1lc3BhY2VVUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuZXdOYW1lc3BhY2VVUkkpIHsKLQkgICAgU3RyaW5nIHByZWZpeCA9IGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCSAgICBTdHJpbmcgb2xkTnNVUkkgPSBnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKTsKLQkgICAgaWYgKCFTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChwcmVmaXgsIG9sZE5zVVJJKSkKLQkgICAgICAgIHNldFZhbHVlcyhwcmVmaXgsIG5ld05hbWVzcGFjZVVSSSwgZ2V0TG9jYWxQYXJ0KCkpOwotCSAgICBlbHNlIHsKLQkgICAgICAgIHNldE5hbWVzcGFjZVVSSUdlbihuZXdOYW1lc3BhY2VVUkkpOwotCSAgICAgICAgc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKG5ld05hbWVzcGFjZVVSSSk7Ci0JICAgIH0KLQkJCQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxQYXJ0KCkgewotCQlyZXR1cm4gbG9jYWxQYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsUGFydEdlbihTdHJpbmcgbmV3TG9jYWxQYXJ0KSB7Ci0JCVN0cmluZyBvbGRMb2NhbFBhcnQgPSBsb2NhbFBhcnQ7Ci0JCWxvY2FsUGFydCA9IG5ld0xvY2FsUGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVCwgb2xkTG9jYWxQYXJ0LCBsb2NhbFBhcnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbFBhcnQoU3RyaW5nIG5ld0xvY2FsUGFydCkgewotCQlzZXRMb2NhbFBhcnRHZW4obmV3TG9jYWxQYXJ0KTsKLQkJdXBkYXRlQ29tYmluZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tYmluZWRRTmFtZSgpIHsKLQkJcmV0dXJuIGNvbWJpbmVkUU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tYmluZWRRTmFtZUdlbihTdHJpbmcgbmV3Q29tYmluZWRRTmFtZSkgewotCQlTdHJpbmcgb2xkQ29tYmluZWRRTmFtZSA9IGNvbWJpbmVkUU5hbWU7Ci0JCWNvbWJpbmVkUU5hbWUgPSBuZXdDb21iaW5lZFFOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRSwgb2xkQ29tYmluZWRRTmFtZSwgY29tYmluZWRRTmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbWJpbmVkUU5hbWUoU3RyaW5nIG5ld0NvbWJpbmVkUU5hbWUpIHsKLQkJc2V0Q29tYmluZWRRTmFtZUdlbihuZXdDb21iaW5lZFFOYW1lKTsKLQkJdXBkYXRlUGFyc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGNvbWJpbmVkIG5hbWUgaW50byB0aGUgY29tcG9uZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVQYXJzZSgpIHsKLQkJU3RyaW5nIG5zID0gbnVsbDsKLQkJU3RyaW5nIGxwID0gbnVsbDsKLQkJaWYgKGNvbWJpbmVkUU5hbWUgIT0gbnVsbCB8fCBjb21iaW5lZFFOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJaW50IGluZGV4ID0gY29tYmluZWRRTmFtZS5sYXN0SW5kZXhPZignOicpOwotCQkJCi0JCQlpZiAoaW5kZXggPCAwKSB7IC8vTm8gc2VwYXJhdG9yCi0JCQkJbnMgPSBjb21iaW5lZFFOYW1lOwotCQkJfSBlbHNlIGlmIChpbmRleCA9PSAwKSB7IC8vRmlyc3QgY2hhcgotCQkJCWxwID0gY29tYmluZWRRTmFtZS5zdWJzdHJpbmcoMSk7IAotCQkJfSBlbHNlIGlmIChpbmRleCA9PSBjb21iaW5lZFFOYW1lLmxlbmd0aCgpLTEpIHsgLy9MYXN0IGNoYXIKLQkJCQlucyA9IGNvbWJpbmVkUU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCX0gZWxzZSB7IC8vSW4gdGhlIG1pZGRsZSwgd2hpY2ggaXMgd2hhdCBpdCBzaG91bGQgYmUKLQkJCQlucyA9IGNvbWJpbmVkUU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQlscCA9IGNvbWJpbmVkUU5hbWUuc3Vic3RyaW5nKGluZGV4KzEsIGNvbWJpbmVkUU5hbWUubGVuZ3RoKCkpOwotCQkJfQotCQl9Ci0JCXNldEludGVybmFsUHJlZml4T3JOc1VSSUdlbihucyk7Ci0JCXNldExvY2FsUGFydEdlbihscCk7Ci0JfQotCQkKLQkvKioKLQkgKiB1cGRhdGVzIHRoZSBjb21iaW5lZCBuYW1lIGZyb20gdGhlIGNvbXBvbmVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29tYmluZSgpIHsKLQkJU3RyaW5nIGNuID0gbnVsbDsKLQkJaWYgKGludGVybmFsUHJlZml4T3JOc1VSSSAhPSBudWxsIHx8IGxvY2FsUGFydCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbnMgPSBpbnRlcm5hbFByZWZpeE9yTnNVUkkgPT0gbnVsbCA/ICIiIDogaW50ZXJuYWxQcmVmaXhPck5zVVJJOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbHAgPSBsb2NhbFBhcnQgPT0gbnVsbCA/ICIiIDogbG9jYWxQYXJ0OyAvLyROT04tTkxTLTEkCi0JCQljbiA9IG5zKyc6JytscDsKLQkJfQotCQlzZXRDb21iaW5lZFFOYW1lR2VuKGNuKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpIHsKLQkJcmV0dXJuIGludGVybmFsUHJlZml4T3JOc1VSSTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcm5hbFByZWZpeE9yTnNVUklHZW4oU3RyaW5nIG5ld0ludGVybmFsUHJlZml4T3JOc1VSSSkgewotCQlTdHJpbmcgb2xkSW50ZXJuYWxQcmVmaXhPck5zVVJJID0gaW50ZXJuYWxQcmVmaXhPck5zVVJJOwotCQlpbnRlcm5hbFByZWZpeE9yTnNVUkkgPSBuZXdJbnRlcm5hbFByZWZpeE9yTnNVUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkksIG9sZEludGVybmFsUHJlZml4T3JOc1VSSSwgaW50ZXJuYWxQcmVmaXhPck5zVVJJKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKFN0cmluZyBuZXdJbnRlcm5hbFByZWZpeE9yTnNVUkkpIHsKLQkJc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJR2VuKG5ld0ludGVybmFsUHJlZml4T3JOc1VSSSk7Ci0JCXVwZGF0ZUNvbWJpbmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOgotCQkJCXJldHVybiBnZXROYW1lc3BhY2VVUkkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDoKLQkJCQlyZXR1cm4gZ2V0TG9jYWxQYXJ0KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXJldHVybiBnZXRDb21iaW5lZFFOYW1lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJcmV0dXJuIGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDoKLQkJCQlzZXRMb2NhbFBhcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRToKLQkJCQlzZXRDb21iaW5lZFFOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSToKLQkJCQlzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOgotCQkJCXNldExvY2FsUGFydChMT0NBTF9QQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXNldENvbWJpbmVkUU5hbWUoQ09NQklORURfUU5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVSSSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQ6Ci0JCQkJcmV0dXJuIExPQ0FMX1BBUlRfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsUGFydCAhPSBudWxsIDogIUxPQ0FMX1BBUlRfRURFRkFVTFQuZXF1YWxzKGxvY2FsUGFydCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXJldHVybiBDT01CSU5FRF9RTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY29tYmluZWRRTmFtZSAhPSBudWxsIDogIUNPTUJJTkVEX1FOQU1FX0VERUZBVUxULmVxdWFscyhjb21iaW5lZFFOYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlyZXR1cm4gSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVCA9PSBudWxsID8gaW50ZXJuYWxQcmVmaXhPck5zVVJJICE9IG51bGwgOiAhSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVC5lcXVhbHMoaW50ZXJuYWxQcmVmaXhPck5zVVJJKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBlSXNTZXQgZm9yIG5hbWVzcGFjZSB1cmkgbXVzdCBiZSBkZXJpdmVkIGlmIG51bGwgc28gbmFtZXNwYWNlVVJJICEgPSBudWxsIGFuZCBpbnRlcm5hbFByZWZpeE9yTnNVUkkgIT0gbnVsbCBtdXN0IGJvdGggYmUgY2hlY2suCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSToKLQkJCQlyZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gKG5hbWVzcGFjZVVSSSAhPSBudWxsIHx8IGludGVybmFsUHJlZml4T3JOc1VSSSAhPSBudWxsKSA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOgotCQkJCXJldHVybiBMT0NBTF9QQVJUX0VERUZBVUxUID09IG51bGwgPyBsb2NhbFBhcnQgIT0gbnVsbCA6ICFMT0NBTF9QQVJUX0VERUZBVUxULmVxdWFscyhsb2NhbFBhcnQpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRToKLQkJCQlyZXR1cm4gQ09NQklORURfUU5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNvbWJpbmVkUU5hbWUgIT0gbnVsbCA6ICFDT01CSU5FRF9RTkFNRV9FREVGQVVMVC5lcXVhbHMoY29tYmluZWRRTmFtZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJcmV0dXJuIElOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQgPT0gbnVsbCA/IGludGVybmFsUHJlZml4T3JOc1VSSSAhPSBudWxsIDogIUlOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQuZXF1YWxzKGludGVybmFsUHJlZml4T3JOc1VSSSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lc3BhY2VVUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVSSSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9jYWxQYXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsb2NhbFBhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbWJpbmVkUU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbWJpbmVkUU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGludGVybmFsUHJlZml4T3JOc1VSSTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW50ZXJuYWxQcmVmaXhPck5zVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlFOYW1lI3NldFZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgbnNVUkksIFN0cmluZyBsb2NhbFBhcnQpIHsKLQkJc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJR2VuKHByZWZpeCk7Ci0JCXNldExvY2FsUGFydEdlbihsb2NhbFBhcnQpOwotCQlTdHJpbmcgZXhpc3RpbmdVUkkgPSBOYW1lc3BhY2VBZGFwdGVyLmdldE5hbWVzcGFjZVVSSUF0VGhpc0xldmVsKHByZWZpeCwgdGhpcyk7Ci0JCWJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotCQlpZiAoZXhpc3RpbmdVUkkgIT0gbnVsbCAmJiAhZXhpc3RpbmdVUkkuZXF1YWxzKG5zVVJJKSkgewotCQkJTmFtZXNwYWNlQWRhcHRlci5yZW1vdmVOYW1lc3BhY2UocHJlZml4LCB0aGlzKTsKLQkJCXJlbW92ZWQgPSB0cnVlOwotCQl9IAotCQlpZiAoZXhpc3RpbmdVUkkgPT0gbnVsbCB8fCByZW1vdmVkKQotCQkJTmFtZXNwYWNlQWRhcHRlci5hZGROYW1lc3BhY2UocHJlZml4LCBuc1VSSSwgdGhpcyk7Ci0JCXVwZGF0ZUNvbWJpbmUoKTsKLQl9Ci0KLQotfSAvL1FOYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUmVzb3VyY2VFbnZSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUVudlJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyYjcyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUVudlJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UtZW52LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLgotICogCi0gKiBFeGFtcGxlczoKLSAqIAotICogPHJlc291cmNlLWVudi1yZWY+Ci0gKiAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvL1N0b2NrUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gKiAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gKiA8Ly9yZXNvdXJjZS1lbnYtcmVmPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VFbnZSZWZJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VFbnZSZWYgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHR5cGUgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBSZXNvdXJjZUVudlJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5SRVNPVVJDRV9FTlZfUkVGOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUNsYXNzUmVmIC0gcmV0dXJuIGEgSmF2YVVSTCByZWZlcmVuY2UgdG8gdGhlIG5hbWVkIEphdmEgY2xhc3MKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYodGFyZ2V0TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJZ2V0VHlwZSgpOwotCQlyZXR1cm4gdHlwZSA9PSBudWxsID8gbnVsbCA6IHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJZVNldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9UeXBlKCksIGNyZWF0ZUNsYXNzUmVmKGNsYXNzTmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGdldERlc2NyaXB0aW9ucygpICE9IG51bGwgJiYgIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlkLnNldFZhbHVlKG5ld0Rlc2NyaXB0aW9uKTsKLQkJfQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkgIT0gbnVsbCAmJiAhZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0JCQlpZiAoZCAhPSBudWxsKQotCQkJCWRlc2NyaXB0aW9uID0gZC5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMKLQkgKiAgICAgICAgICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGVudGVycHJpc2UKLQkgKiAgICAgICAgICAgIGJlYW4gY29kZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgU2VlIHRoZSBjbGFzcyBkZXNjcmlwdGlvbiBmb3IgYW4gZXhhbXBsZS4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFR5cGUoKSB7Ci0JCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVHlwZSA9IChJbnRlcm5hbEVPYmplY3QpdHlwZTsKLQkJCXR5cGUgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkVHlwZSk7Ci0JCQlpZiAodHlwZSAhPSBvbGRUeXBlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoSmF2YUNsYXNzIG5ld1R5cGUpIHsKLQkJSmF2YUNsYXNzIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX1RZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0VHlwZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19UWVBFOgotCQkJCXNldFR5cGUoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fVFlQRToKLQkJCQlzZXRUeXBlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IG51bGw7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUmVzb3VyY2VSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmN2U5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc0F1dGhUeXBlQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzU2hhcmluZ1Njb3BlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci0KLS8qKgotICogVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYXBwbGljYXRpb24gY2xpZW50cydzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLCB0aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeSB0eXBlIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBjb2RlLCBhbmQgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24gKGJlYW4gb3IgY29udGFpbmVyKS4KLSAqIEV4YW1wbGU6Ci0gKiA8cmVzb3VyY2UtcmVmPgotICogPHJlcy1yZWYtbmFtZT5FbXBsb3llZUFwcERCPC8vcmVzLXJlZi1uYW1lPgotICogPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC8vcmVzLXR5cGU+Ci0gKiA8cmVzLWF1dGg+Q29udGFpbmVyPC8vcmVzLWF1dGg+Ci0gKiA8Ly9yZXNvdXJjZS1yZWY+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVJlZkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZXNvdXJjZVJlZiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aCgpIDxlbT5BdXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlQmFzZSBBVVRIX0VERUZBVUxUID0gUmVzQXV0aFR5cGVCYXNlLkNPTlRBSU5FUl9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFJlc0F1dGhUeXBlQmFzZSBhdXRoID0gQVVUSF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEF1dGggYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dGhFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGluaygpIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGluayA9IExJTktfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc1NoYXJpbmdTY29wZSgpIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc1NoYXJpbmdTY29wZVR5cGUgUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQgPSBSZXNTaGFyaW5nU2NvcGVUeXBlLlNIQVJFQUJMRV9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFJlc1NoYXJpbmdTY29wZVR5cGUgcmVzU2hhcmluZ1Njb3BlID0gUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXMgU2hhcmluZyBTY29wZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzU2hhcmluZ1Njb3BlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIFJlc291cmNlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX1JFRjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChnZXREZXNjcmlwdGlvbnMoKSAhPSBudWxsICYmICFnZXREZXNjcmlwdGlvbnMoKS5pc0VtcHR5KCkpIHsKLQkJCURlc2NyaXB0aW9uIGQgPSAoRGVzY3JpcHRpb24pIGdldERlc2NyaXB0aW9ucygpLmdldCgwKTsKLQkJCWlmIChkICE9IG51bGwpCi0JCQkJZC5zZXRWYWx1ZShuZXdEZXNjcmlwdGlvbik7Ci0JCX0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYgKGdldERlc2NyaXB0aW9ucygpICE9IG51bGwgJiYgIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbiA9IGQuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeSByZWZlcmVuY2UgbmFtZS4gVGhlIHJlc291cmNlIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5IHdob3NlIHZhbHVlIGNvbnRhaW5zIHRoZSBKTkRJIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgKG9yIGNsYXNzKSBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yIHdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSBiZWFuLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZSBEZXBsb3llci4gIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0JICogPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC8vcmVzLWF1dGg+Ci0JICogPHJlcy1hdXRoPkNvbnRhaW5lcjwvL3Jlcy1hdXRoPgotCSAqLwotCXB1YmxpYyBSZXNBdXRoVHlwZUJhc2UgZ2V0QXV0aCgpIHsKLQkJcmV0dXJuIGF1dGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aChSZXNBdXRoVHlwZUJhc2UgbmV3QXV0aCkgewotCQlSZXNBdXRoVHlwZUJhc2Ugb2xkQXV0aCA9IGF1dGg7Ci0JCWF1dGggPSBuZXdBdXRoID09IG51bGwgPyBBVVRIX0VERUZBVUxUIDogbmV3QXV0aDsKLQkJYm9vbGVhbiBvbGRBdXRoRVNldCA9IGF1dGhFU2V0OwotCQlhdXRoRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19BVVRILCBvbGRBdXRoLCBhdXRoLCAhb2xkQXV0aEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF1dGgoKSB7Ci0JCVJlc0F1dGhUeXBlQmFzZSBvbGRBdXRoID0gYXV0aDsKLQkJYm9vbGVhbiBvbGRBdXRoRVNldCA9IGF1dGhFU2V0OwotCQlhdXRoID0gQVVUSF9FREVGQVVMVDsKLQkJYXV0aEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fQVVUSCwgb2xkQXV0aCwgQVVUSF9FREVGQVVMVCwgb2xkQXV0aEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF1dGgoKSB7Ci0JCXJldHVybiBhdXRoRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmsoKSB7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIG5ld0xpbmspIHsKLQkJU3RyaW5nIG9sZExpbmsgPSBsaW5rOwotCQlsaW5rID0gbmV3TGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0xJTkssIG9sZExpbmssIGxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcmVzLXNoYXJpbmctc2NvcGUgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZAotCSAqIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUKLQkgKiBzaGFyZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBvbmUgb2YgdGhlCi0JICogdHdvIGZvbGxvd2luZzogIFNoYXJlYWJsZSwgVW5zaGFyZWFibGUKLQkgKiAKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLQkgKi8KLQlwdWJsaWMgUmVzU2hhcmluZ1Njb3BlVHlwZSBnZXRSZXNTaGFyaW5nU2NvcGUoKSB7Ci0JCXJldHVybiByZXNTaGFyaW5nU2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUgbmV3UmVzU2hhcmluZ1Njb3BlKSB7Ci0JCVJlc1NoYXJpbmdTY29wZVR5cGUgb2xkUmVzU2hhcmluZ1Njb3BlID0gcmVzU2hhcmluZ1Njb3BlOwotCQlyZXNTaGFyaW5nU2NvcGUgPSBuZXdSZXNTaGFyaW5nU2NvcGUgPT0gbnVsbCA/IFJFU19TSEFSSU5HX1NDT1BFX0VERUZBVUxUIDogbmV3UmVzU2hhcmluZ1Njb3BlOwotCQlib29sZWFuIG9sZFJlc1NoYXJpbmdTY29wZUVTZXQgPSByZXNTaGFyaW5nU2NvcGVFU2V0OwotCQlyZXNTaGFyaW5nU2NvcGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFLCBvbGRSZXNTaGFyaW5nU2NvcGUsIHJlc1NoYXJpbmdTY29wZSwgIW9sZFJlc1NoYXJpbmdTY29wZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc1NoYXJpbmdTY29wZSgpIHsKLQkJUmVzU2hhcmluZ1Njb3BlVHlwZSBvbGRSZXNTaGFyaW5nU2NvcGUgPSByZXNTaGFyaW5nU2NvcGU7Ci0JCWJvb2xlYW4gb2xkUmVzU2hhcmluZ1Njb3BlRVNldCA9IHJlc1NoYXJpbmdTY29wZUVTZXQ7Ci0JCXJlc1NoYXJpbmdTY29wZSA9IFJFU19TSEFSSU5HX1NDT1BFX0VERUZBVUxUOwotCQlyZXNTaGFyaW5nU2NvcGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFLCBvbGRSZXNTaGFyaW5nU2NvcGUsIFJFU19TSEFSSU5HX1NDT1BFX0VERUZBVUxULCBvbGRSZXNTaGFyaW5nU2NvcGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXNTaGFyaW5nU2NvcGUoKSB7Ci0JCXJldHVybiByZXNTaGFyaW5nU2NvcGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fQVVUSDoKLQkJCQlyZXR1cm4gZ2V0QXV0aCgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gZ2V0TGluaygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEU6Ci0JCQkJcmV0dXJuIGdldFJlc1NoYXJpbmdTY29wZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19BVVRIOgotCQkJCXNldEF1dGgoKFJlc0F1dGhUeXBlQmFzZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTElOSzoKLQkJCQlzZXRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFOgotCQkJCXNldFJlc1NoYXJpbmdTY29wZSgoUmVzU2hhcmluZ1Njb3BlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fQVVUSDoKLQkJCQl1bnNldEF1dGgoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19MSU5LOgotCQkJCXNldExpbmsoTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEU6Ci0JCQkJdW5zZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fQVVUSDoKLQkJCQlyZXR1cm4gaXNTZXRBdXRoKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19MSU5LOgotCQkJCXJldHVybiBMSU5LX0VERUZBVUxUID09IG51bGwgPyBsaW5rICE9IG51bGwgOiAhTElOS19FREVGQVVMVC5lcXVhbHMobGluayk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRToKLQkJCQlyZXR1cm4gaXNTZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGg6ICIpOwotCQlpZiAoYXV0aEVTZXQpIHJlc3VsdC5hcHBlbmQoYXV0aCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc1NoYXJpbmdTY29wZTogIik7Ci0JCWlmIChyZXNTaGFyaW5nU2NvcGVFU2V0KSByZXN1bHQuYXBwZW5kKHJlc1NoYXJpbmdTY29wZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SdW5Bc1NwZWNpZmllZElkZW50aXR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUnVuQXNTcGVjaWZpZWRJZGVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmMzBjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SdW5Bc1NwZWNpZmllZElkZW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci0KLQotLyoqCi0gKiBUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQgICAgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJbXBsIGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eUltcGwgaW1wbGVtZW50cyBSdW5Bc1NwZWNpZmllZElkZW50aXR5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBJZGVudGl0eSBpZGVudGl0eSA9IG51bGw7Ci0JcHVibGljIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBPcHRpb25hbCBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0JICovCi0JcHVibGljIElkZW50aXR5IGdldElkZW50aXR5KCkgewotCQlyZXR1cm4gaWRlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SWRlbnRpdHkoSWRlbnRpdHkgbmV3SWRlbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJSWRlbnRpdHkgb2xkSWRlbnRpdHkgPSBpZGVudGl0eTsKLQkJaWRlbnRpdHkgPSBuZXdJZGVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWSwgb2xkSWRlbnRpdHksIG5ld0lkZW50aXR5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZGVudGl0eShJZGVudGl0eSBuZXdJZGVudGl0eSkgewotCQlpZiAobmV3SWRlbnRpdHkgIT0gaWRlbnRpdHkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGlkZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWlkZW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SWRlbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SWRlbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldElkZW50aXR5KG5ld0lkZW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFksIG5ld0lkZW50aXR5LCBuZXdJZGVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJZGVudGl0eShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZOgotCQkJCXJldHVybiBnZXRJZGVudGl0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFk6Ci0JCQkJc2V0SWRlbnRpdHkoKElkZW50aXR5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZOgotCQkJCXNldElkZW50aXR5KChJZGVudGl0eSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWToKLQkJCQlyZXR1cm4gaWRlbnRpdHkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uU2VjdXJpdHlJZGVudGl0eSNpc1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjY2OGY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotCSAqLwotCXB1YmxpYyBjbGFzcyBTZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCkpIHsKLQkJCQkJc3luY2hEaXNwbGF5TmFtZSgpOwotCQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKSB8fAotCQkJCQltc2cuZ2V0RmVhdHVyZSgpID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldERpc3BsYXlOYW1lX1ZhbHVlKCkpIHsKLQkJCQkJc3luY2hEaXNwbGF5TmFtZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHN5bmNoRGlzcGxheU5hbWUoKSB7Ci0JCQlTZWN1cml0eUNvbnN0cmFpbnQgbXlUYXJnZXQgPSAoU2VjdXJpdHlDb25zdHJhaW50KWdldFRhcmdldCgpOwotCQkJaWYgKG15VGFyZ2V0LmdldERpc3BsYXlOYW1lcygpLmlzRW1wdHkoKSkKLQkJCQlteVRhcmdldC5zZXREaXNwbGF5TmFtZShudWxsKTsKLQkJCWVsc2UgewotCQkJCURpc3BsYXlOYW1lIGFEaXNwbGF5TmFtZSA9IChEaXNwbGF5TmFtZSlteVRhcmdldC5nZXREaXNwbGF5TmFtZXMoKS5nZXQoMCk7Ci0JCQkJaWYgKCFhRGlzcGxheU5hbWUuZUFkYXB0ZXJzKCkuY29udGFpbnModGhpcykpCi0JCQkJCWFEaXNwbGF5TmFtZS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQkJbXlUYXJnZXQuc2V0RGlzcGxheU5hbWUoYURpc3BsYXlOYW1lLmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI3NldFRhcmdldChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JCWlmIChuZXdUYXJnZXQgaW5zdGFuY2VvZiBTZWN1cml0eUNvbnN0cmFpbnQpCi0JCQlzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eUlkZW50aXR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlJZGVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1MzY1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eUlkZW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLQotCi0vKioKLSAqIFRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcyBpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdAotICogY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5SWRlbnRpdHlJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgU2VjdXJpdHlJZGVudGl0eSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuU0VDVVJJVFlfSURFTlRJVFk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5I2lzUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uU2VjdXJpdHlJZGVudGl0eSNpc1VzZUNhbGxlcklkZW50aXR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZUNhbGxlcklkZW50aXR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMThhYTg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aS5Xb3JrYmVuY2hVdGlsOwotCi0vKioKLSAqIEEgc2VtYW50aWMgZ3JvdXBpbmcgb2Ygb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBwZXJmb3JtZWQgYnkgYSBzdWJqZWN0LgotICogVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN1cml0eSByb2xlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRzIHBsYWNlZCBvbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5Um9sZSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQlzdGF0aWMgYm9vbGVhbiBpbkVjbGlwc2UgPSBXb3JrYmVuY2hVdGlsLndvcmtiZW5jaElzUnVubmluZygpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcm9sZU5hbWUgPSBST0xFX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIFNlY3VyaXR5Um9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5TRUNVUklUWV9ST0xFOwotCX0KLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JaWYgKGluRWNsaXBzZSkKLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKLQkJCi0JaWYgKG8gaW5zdGFuY2VvZiBTZWN1cml0eVJvbGVJbXBsKSB7Ci0JCVN0cmluZyByMSA9IGdldFJvbGVOYW1lKCk7Ci0JCVN0cmluZyByMiA9ICgoU2VjdXJpdHlSb2xlKSBvKS5nZXRSb2xlTmFtZSgpOwotCQlpZiAoKHIxICE9IG51bGwpICYmIChyMiAhPSBudWxsKSkgewotCQkJaWYgKHIxLmVxdWFscyhyMikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChyMSA9PSBudWxsICYmIHIyID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci1wdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCWlmIChpbkVjbGlwc2UgfHwgZ2V0Um9sZU5hbWUoKSA9PSBudWxsKQotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQlyZXR1cm4gZ2V0Um9sZU5hbWUoKS5oYXNoQ29kZSgpOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlTdHJpbmcgbmFtZSA9IGdldFJvbGVOYW1lKCkgPT0gbnVsbCA/ICI8dW5rbm93bj4iIDogZ2V0Um9sZU5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIoIiArIG5hbWUgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25HZW4oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbiA9IGQuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25HZW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJaWYgKGdldERlc2NyaXB0aW9ucygpICE9IG51bGwpIHsKLQkJCWlmIChnZXREZXNjcmlwdGlvbnMoKS5pc0VtcHR5KCkpIHsKLQkJCQlEZXNjcmlwdGlvbiBkID0gbmV3IERlc2NyaXB0aW9uSW1wbCgpOwotCQkJCWQuc2V0VmFsdWUobmV3RGVzY3JpcHRpb24pOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZChkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJCWlmIChkICE9IG51bGwpCi0JCQkJCWQuc2V0VmFsdWUobmV3RGVzY3JpcHRpb24pOwotCQkJfQotCQl9Ci0JCXNldERlc2NyaXB0aW9uR2VuKG5ld0Rlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25HZW4oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiBUaGUKLQkgKiAgICAgICAgICAgIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcm9sZS4gVGhpcyBlbGVtZW50Ci0JICogICAgICAgICAgICBtdXN0IGNvbnRhaW4gYSBub24tZW1wdHkgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWUoKSB7Ci0JCXJldHVybiByb2xlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgbmV3Um9sZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFJvbGVOYW1lID0gcm9sZU5hbWU7Ci0JCXJvbGVOYW1lID0gbmV3Um9sZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FLCBvbGRSb2xlTmFtZSwgcm9sZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJvbGVOYW1lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZShST0xFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIFJPTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcm9sZU5hbWUgIT0gbnVsbCA6ICFST0xFX05BTUVfRURFRkFVTFQuZXF1YWxzKHJvbGVOYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb2xlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm9sZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmZkMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlUmVmSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5Um9sZVJlZiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rKCkgPGVtPkxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsaW5rID0gTElOS19FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgU2VjdXJpdHlSb2xlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLlNFQ1VSSVRZX1JPTEVfUkVGOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkgIT0gbnVsbCAmJiAhZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0JCQlpZiAoZCAhPSBudWxsKQotCQkJCWQuc2V0VmFsdWUobmV3RGVzY3JpcHRpb24pOwotCQl9Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkgIT0gbnVsbCAmJiAhZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0JCQlpZiAoZCAhPSBudWxsKQotCQkJCWRlc2NyaXB0aW9uID0gZC5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgdXNlZCB0byBsaW5rIGEgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluayhTdHJpbmcgbmV3TGluaykgewotCQlTdHJpbmcgb2xkTGluayA9IGxpbms7Ci0JCWxpbmsgPSBuZXdMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19MSU5LLCBvbGRMaW5rLCBsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gZ2V0TGluaygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTElOSzoKLQkJCQlzZXRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19MSU5LOgotCQkJCXNldExpbmsoTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gTElOS19FREVGQVVMVCA9PSBudWxsID8gbGluayAhPSBudWxsIDogIUxJTktfRURFRkFVTFQuZXF1YWxzKGxpbmspOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvVXNlQ2FsbGVySWRlbnRpdHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Vc2VDYWxsZXJJZGVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0NDQzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Vc2VDYWxsZXJJZGVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uVXNlQ2FsbGVySWRlbnRpdHk7Ci0KLQotLyoqCi0gKiBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBiZSB1c2VkIGFzIHRoZSBzZWN1cml0eSBpZGVudGl0eSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVzZUNhbGxlcklkZW50aXR5SW1wbCBleHRlbmRzIFNlY3VyaXR5SWRlbnRpdHlJbXBsIGltcGxlbWVudHMgVXNlQ2FsbGVySWRlbnRpdHkgewotCi0JcHVibGljIFVzZUNhbGxlcklkZW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLlVTRV9DQUxMRVJfSURFTlRJVFk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uU2VjdXJpdHlJZGVudGl0eSNpc1VzZUNhbGxlcklkZW50aXR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZUNhbGxlcklkZW50aXR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9YTUxSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjliN2FmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNpbmNlIDQvMjIvMjAwMwotICogVGhpcyBpcyByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIGltcGxlbWVudGVycyBvZiB7QGxpbmsgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3Rvcnl9Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFJlc291cmNlRmFjdG9yeSBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotLyoqCi0gKiBFSkJKYXJSZXNvdXJjZUZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFhNTFJlc291cmNlRmFjdG9yeSgpIHsKLQkvL1RPRE86IERlbGV0ZSB0aGlzIGNsYXNzCi0Jc3VwZXIoKTsKLX0KLQotLyoqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsI2NyZWF0ZVJlc291cmNlKFVSSSkKLSAqLwotcHVibGljIGZpbmFsIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQlYTUxSZXNvdXJjZSByZXNvdXJjZSA9IHByaW1DcmVhdGVSZXNvdXJjZSh1cmkpOwotCXJlc291cmNlLmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgcmVzb3VyY2UuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UuT1BUSU9OX0xJTkVfV0lEVEgsIG5ldyBJbnRlZ2VyKDgwKSk7Ci0gICAgcmV0dXJuIHJlc291cmNlOwotfQotCi0vKioKLSAqIE1ldGhvZCBwcmltQ3JlYXRlUmVzb3VyY2UuCi0gKiBAcGFyYW0gdXJpCi0gKiBAcmV0dXJuIFhNTFJlc291cmNlCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCBYTUxSZXNvdXJjZSBwcmltQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgOwotCi19Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9YTUxSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjJkYjQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MUmVzb3VyY2VJbXBsIGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFhNTFJlc291cmNlLEoyRUVWZXJzaW9uUmVzb3VyY2UgewotCS8qKiBJbmRpY2F0b3IgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcmVzb3VyY2Ugd2FzIGxvYWRlZCBhcyBhbiBhbHQtZGQgKGZyb20gYW4gZWFyKSwKLQkgICogZGVmYXVsdCBpcyBmYWxzZSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWx0ID0gZmFsc2U7Ci0JLyoqIFRoZSBhcHBsaWNhdGlvbiB3aGljaCBkZWNsYXJlZCB0aGUgYWx0LWRkIGZvciB0aGlzIHJlc291cmNlOyBleGlzdHMgb25seSBpZiB0aGlzIHJlc291cmNlIGlzIGFuZAotCSAgKiBhbHQgZGQgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXcgPSB0cnVlOwotCXByaXZhdGUgQm9vbGVhbiBuZWVkc1N5bmMgPSBuZXcgQm9vbGVhbih0cnVlKTsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSb290VmVyc2lvbkFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9UWVBFID0gUm9vdFZlcnNpb25BZGFwdGVyLmNsYXNzLmdldE5hbWUoKTsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAobXNnLmdldEZlYXR1cmVJRChudWxsKSA9PSBSRVNPVVJDRV9fQ09OVEVOVFMgJiYKLQkJCQltc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCkgewotCQkJCQkoKFhNTFJlc291cmNlSW1wbCltc2cuZ2V0Tm90aWZpZXIoKSkuc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQkJCQkJKChOb3RpZmllciltc2cuZ2V0Tm90aWZpZXIoKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCX0KLQkJfQotCQkKLQkJCi0KLQkKLQl9Ci0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgc2luY2UgNC8yOS8yMDAzIC0gdXNlZCBmb3IgY29tcGF0aWJpbGl0eQotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIGJlIHVzaW5nIHRoZSBSZW5kZXJlcnMgYW5kIHRyYW5zbGF0b3IgZnJhbWV3b3JrIAotCSAqLwotCXB1YmxpYyBYTUxSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgc2luY2UgNC8yOS8yMDAzIC0gdXNlZCBmb3IgY29tcGF0aWJpbGl0eQotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIGJlIHVzaW5nIHRoZSBSZW5kZXJlcnMgYW5kIHRyYW5zbGF0b3IgZnJhbWV3b3JrIAotCSAqLwotCXB1YmxpYyBYTUxSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQkKLQlwdWJsaWMgWE1MUmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JfQotCi0JcHVibGljIFhNTFJlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoYVJlbmRlcmVyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjaW5pdGlhbGl6ZUNvbnRlbnRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udGVudHMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVDb250ZW50cygpOwotCQllQWRhcHRlcnMoKS5hZGQobmV3IFJvb3RWZXJzaW9uQWRhcHRlcigpKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBJcyB0aGlzIGEgcmVzb3VyY2UgbG9hZGVkIGFzIGFuIGFsdGVybmF0ZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I/Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbHQoKSB7Ci0JCXJldHVybiBpc0FsdDsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24gbmV3QXBwbGljYXRpb24pIHsKLQkJYXBwbGljYXRpb24gPSBuZXdBcHBsaWNhdGlvbjsKLQl9Ci0JLyoqCi0JICogSXMgdGhpcyBhIHJlc291cmNlIGxvYWRlZCBhcyBhbiBhbHRlcm5hdGUgZGVwbG95bWVudCBkZXNjcmlwdG9yPwotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzQWx0KGJvb2xlYW4gaXNBbHRlcm5hdGVERCkgewotCQlpc0FsdCA9IGlzQWx0ZXJuYXRlREQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSUQoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIEoyRUVfMV80X0lEOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNzZXREb2N0eXBlVmFsdWVzKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICogVGhpcyBpcyBzZXR0aW5nIHRoZSBtb2R1bGUgdmVyc2lvbiBvbiB0aGUgcmVzb3VyY2UsIHdoZXJlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHRoYXQgdGhlIEoyRUUgdmVyc2lvbiwgdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N0eXBlVmFsdWVzKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWludCB2ZXJzaW9uID0gSjJFRV8xXzRfSUQ7Ci0JCWlmIChzeXN0ZW1JZCA9PSBudWxsKSAKLQkJCXZlcnNpb24gPSBKMkVFXzFfNF9JRDsKLQkJZWxzZSBpZiAoc3lzdGVtSWQuZXF1YWxzKGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpIHx8IHN5c3RlbUlkLmVxdWFscyhnZXRKMkVFX0FsdF8xXzNfU3lzdGVtSUQoKSkpCi0JCQl2ZXJzaW9uID0gSjJFRV8xXzNfSUQ7Ci0JCWVsc2UgaWYgKHN5c3RlbUlkLmVxdWFscyhnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKSB8fCBzeXN0ZW1JZC5lcXVhbHMoZ2V0SjJFRV9BbHRfMV8yX1N5c3RlbUlEKCkpKQotCQkJdmVyc2lvbiA9IEoyRUVfMV8yX0lEOwotCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCXNldEoyRUVWZXJzaW9uSUQodmVyc2lvbik7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSN1c2VzRFREKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1c2VzRFREKCkgewotCQlyZXR1cm4gKGdldFZlcnNpb25JRCgpID09IEoyRUVfMV8yX0lEKSB8fCAoZ2V0VmVyc2lvbklEKCkgPT0gSjJFRV8xXzNfSUQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNzZXRWZXJzaW9uSUQoaW50KQotCSAqIEBkZXByZWNhdGVkLCBVc2Ugc2V0SjJFRVZlcnNpb25JRCgpIHRvIHNldCBtb2R1bGUgdmVyc2lvbiBiYXNlZCBvbiBqMmVlIHZlcnNpb24KLQkgKiovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbklEKGludCBpZCkgewotCQlzZXRKMkVFVmVyc2lvbklEKGlkKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcHJpbVNldFZlcnNpb25JRChpbnQgaWQpIHsKLQkJc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcHJpbVNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIGFQdWJsaWNJZCwgU3RyaW5nIGFTeXN0ZW1JZCkgewotCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGFQdWJsaWNJZCxhU3lzdGVtSWQpOwotCX0KLQkvKgotCSAqIFNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCk7Ci0JLyoKLQkgKiBTZXRzIHRoZSBtb2R1bGUgdmVyc2lvbiBkaXJlY3RseQotCSAqICovCi0JIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE1vZHVsZVZlcnNpb25JRChpbnQgaWQpOwotCS8qKgotCSAqIEBkZXByZWNhdGVkIAotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLlhNTFJlc291cmNlI2lzSjJFRTFfMygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKMkVFMV8zKCkgewotCQlyZXR1cm4gZ2V0VmVyc2lvbklEKCkgPT0gSjJFRV8xXzNfSUQ7Ci0JfQotCQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgVHJhbnNsYXRvclJlc291cmNlI3NldFZlcnNpb25JRChpbnQpfSwgCi0JICoge0BsaW5rIFRyYW5zbGF0b3JSZXNvdXJjZSNzZXREb2N0eXBlVmFsdWVzKFN0cmluZywgU3RyaW5nKX0KLQkgKiBTZXRzIHRoZSBzeXN0ZW0gaWQgb2YgdGhlIFhNTCBkb2N1bWVudC4KLQkgKiBAc2VlIEoyRUVWZXJzaW9uQ29uc3RhbnRzCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIGlkKSB7Ci0JCXNldERvY3R5cGVWYWx1ZXMoaWQsIGdldFN5c3RlbUlkKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIFRyYW5zbGF0b3JSZXNvdXJjZSNzZXRWZXJzaW9uSUQoaW50KX0sCi0JICoge0BsaW5rIFRyYW5zbGF0b3JSZXNvdXJjZSNzZXREb2N0eXBlVmFsdWVzKFN0cmluZywgU3RyaW5nKX0KLQkgKiBTZXRzIHRoZSBwdWJsaWMgaWQgb2YgdGhlIFhNTCBkb2N1bWVudC4KLQkgKiBAc2VlIEoyRUVWZXJzaW9uQ29uc3RhbnRzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIGlkKSB7Ci0JCXNldERvY3R5cGVWYWx1ZXMoZ2V0UHVibGljSWQoKSwgaWQpOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRQdWJsaWNJZCgpIHsKLQkJc3dpdGNoIChnZXRWZXJzaW9uSUQoKSkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQlyZXR1cm4gZ2V0SjJFRV8xXzJfUHVibGljSUQoKTsKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCQkJCXJldHVybiBnZXRKMkVFXzFfM19QdWJsaWNJRCgpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0JCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U3lzdGVtSWQoKSB7Ci0JCXN3aXRjaCAoZ2V0VmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQkJcmV0dXJuIGdldEoyRUVfMV8yX1N5c3RlbUlEKCk7Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgkKLQkJCQlyZXR1cm4gZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SjJFRV8xXzJfUHVibGljSUQoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEoyRUVfMV8yX1N5c3RlbUlEKCk7Ci0JCi0JLyoqCi0JICogQnkgZGVmYXVsdCBqdXN0IHJldHVybiB0aGUgcHJvcGVyIDEuMiBzeXN0ZW0gSUQsIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0JICogQHJldHVybiBhbHRlcm5hdGUgc3RyaW5nIGZvciBzeXN0ZW0gSUQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfMl9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIGdldEoyRUVfMV8yX1N5c3RlbUlEKCk7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEoyRUVfMV8zX1N5c3RlbUlEKCk7Ci0JCi0JLyoqCi0JICogQnkgZGVmYXVsdCBqdXN0IHJldHVybiB0aGUgcHJvcGVyIDEuMyBzeXN0ZW0gSUQsIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0JICogQHJldHVybiBhbHRlcm5hdGUgc3RyaW5nIGZvciBzeXN0ZW0gSUQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIGdldEoyRUVfMV8zX1N5c3RlbUlEKCk7Ci0JfQotCQotCQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlc291cmNlU2V0KFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgTm90aWZpY2F0aW9uQ2hhaW4gbm90aWZpY2F0aW9ucykgewotCQlpZiAoYVJlc291cmNlU2V0ID09IG51bGwgJiYgdGhpcy5yZXNvdXJjZVNldCAhPSBudWxsKQotCQkJcHJlRGVsZXRlKCk7Ci0JCXJldHVybiBzdXBlci5iYXNpY1NldFJlc291cmNlU2V0KGFSZXNvdXJjZVNldCwgbm90aWZpY2F0aW9ucyk7Ci0JfQotCQkKLQlwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgZ2V0SjJFRVZlcnNpb25JRCgpIGFuZCBnZXRNb2R1bGVWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gZ2V0SjJFRVZlcnNpb25JRCgpOwotCX0KLQkKLQlwdWJsaWMgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuSU5TVEFOQ0U7Ci0JfQkKLQkvKiBBbGwgc3ViY2xhc3NlcyB3aWxsIGRlcml2ZSB0aGlzIHZhbHVlIGJhc2VkIG9uIHRoZWlyIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRKMkVFVmVyc2lvbklEKCk7Ci0KLQkKLQotCS8qIFRoaXMgd2lsbCBiZSBjb21wdXRlZCBkdXJpbmcgbG9hZHMgb2YgdGhlIHJlc291cmNlCi0JICovCi0JcHVibGljIGludCBnZXRNb2R1bGVWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRWZXJzaW9uSUQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZVZlcnNpb25TdHJpbmcoKSB7Ci0JCQotCQlpbnQgdmVyID0gZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JCXJldHVybiBuZXcgQmlnRGVjaW1hbChTdHJpbmcudmFsdWVPZih2ZXIpKS5tb3ZlUG9pbnRMZWZ0KDEpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZEV4aXN0aW5nKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlib29sZWFuIGxvY2FsTmVlZHNTeW5jID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAobmVlZHNTeW5jKSB7Ci0JCQlsb2NhbE5lZWRzU3luYyA9IG5lZWRzU3luYzsKLQkJfQotCQlpZiAobG9jYWxOZWVkc1N5bmMpIHsgLy8gT25seSBjaGVjayBzeW5jIG9uY2UgZm9yIGxpZmUgb2YgdGhpcyBtb2RlbAotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUodGhpcyk7Ci0JCQlpZiAoIWZpbGUuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotCQkJewotCQkJCXRyeSB7Ci0JCQkJCVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSAoV29ya3NwYWNlKWZpbGUuZ2V0V29ya3NwYWNlKCk7Ci0JCQkJCWlmICh3b3Jrc3BhY2UuZ2V0RWxlbWVudFRyZWUoKS5pc0ltbXV0YWJsZSgpKQotCQkJCQl7Ci0JCQkJCQl3b3Jrc3BhY2UubmV3V29ya2luZ1RyZWUoKTsKLQkJCQkJfQotCQkJCQkoKG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlKWZpbGUpLmdldExvY2FsTWFuYWdlcigpLnJlZnJlc2goZmlsZS5nZXRQcm9qZWN0KCksIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuSU9XcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJCXN5bmNocm9uaXplZCAobmVlZHNTeW5jKSB7Ci0JCQkJbmVlZHNTeW5jID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQkJfQotCQl9Ci0JCXN1cGVyLmxvYWRFeGlzdGluZyhvcHRpb25zKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvQ29tbW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5NjVjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Vc2VDYWxsZXJJZGVudGl0eTsKLQotCi0KLXB1YmxpYyBjbGFzcyBDb21tb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBDb21tb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCXB1YmxpYyBDb21tb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpdHlwZSkuZUNsYXNzKCkuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFamJSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJMb2NhbFJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudkVudHJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlSb2xlUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3VyaXR5SWRlbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVc2VDYWxsZXJJZGVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VFbnZSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZUdlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbW9uU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IENvbW1vblN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVqYlJlZihFamJSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVqYlJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVudkVudHJ5KEVudkVudHJ5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFbnZFbnRyeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlUmVmKFJlc291cmNlUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZVJlZihTZWN1cml0eVJvbGVSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZShTZWN1cml0eVJvbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5Um9sZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlRW52UmVmKFJlc291cmNlRW52UmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZUVudlJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQkxvY2FsUmVmKEVKQkxvY2FsUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFSkJMb2NhbFJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlkZW50aXR5KElkZW50aXR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJZGVudGl0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUljb25UeXBlKEljb25UeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJY29uVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURpc3BsYXlOYW1lKERpc3BsYXlOYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEaXNwbGF5TmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEZXN0aW5hdGlvblJlZihNZXNzYWdlRGVzdGluYXRpb25SZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEZXN0aW5hdGlvbihNZXNzYWdlRGVzdGluYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBhcmFtVmFsdWUoUGFyYW1WYWx1ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUGFyYW1WYWx1ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpORElFbnZSZWZzR3JvdXAoSk5ESUVudlJlZnNHcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSk5ESUVudlJlZnNHcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5SWRlbnRpdHkoU2VjdXJpdHlJZGVudGl0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlJZGVudGl0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVVzZUNhbGxlcklkZW50aXR5KFVzZUNhbGxlcklkZW50aXR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVVc2VDYWxsZXJJZGVudGl0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uKERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVFOYW1lKFFOYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVRTmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxpc3RlbmVyKExpc3RlbmVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMaXN0ZW5lckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFQXR0cmlidXRlKEoyRUVFQXR0cmlidXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKMkVFRUF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJHZW4oTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlSb2xlQWRhcHRlckdlbigpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VSZWZBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFamJSZWZBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJMb2NhbFJlZkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudkVudHJ5QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlSb2xlUmVmQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3VyaXR5SWRlbnRpdHlBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVc2VDYWxsZXJJZGVudGl0eUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVFOYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXIgPGVtPkxpc3RlbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMaXN0ZW5lckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIDxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVBdHRyaWJ1dGUgPGVtPkoyRUVFIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSjJFRUVBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50IDxlbT5FTW9kZWwgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudCA8ZW0+RU5hbWVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQgPGVtPkVUeXBlZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgPGVtPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIDxlbT5FQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpdHlBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJY29uVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc3BsYXlOYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbiA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUgPGVtPlBhcmFtIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhcmFtVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCA8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKTkRJRW52UmVmc0dyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VFbnZSZWZBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Db21tb25BZGFwdGVyRmFjdG9yeQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0NvbW1vblN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvQ29tbW9uU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmNkNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvQ29tbW9uU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Vc2VDYWxsZXJJZGVudGl0eTsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbW1vblN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21tb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbW9uU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRjogewotCQkJCUVqYlJlZiBlamJSZWYgPSAoRWpiUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFamJSZWYoZWpiUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChlamJSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUlk6IHsKLQkJCQlFbnZFbnRyeSBlbnZFbnRyeSA9IChFbnZFbnRyeSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRW52RW50cnkoZW52RW50cnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGVudkVudHJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGOiB7Ci0JCQkJUmVzb3VyY2VSZWYgcmVzb3VyY2VSZWYgPSAoUmVzb3VyY2VSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlUmVmKHJlc291cmNlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChyZXNvdXJjZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGOiB7Ci0JCQkJU2VjdXJpdHlSb2xlUmVmIHNlY3VyaXR5Um9sZVJlZiA9IChTZWN1cml0eVJvbGVSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5Um9sZVJlZihzZWN1cml0eVJvbGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNlY3VyaXR5Um9sZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEU6IHsKLQkJCQlTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlID0gKFNlY3VyaXR5Um9sZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc2VjdXJpdHlSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRjogewotCQkJCVJlc291cmNlRW52UmVmIHJlc291cmNlRW52UmVmID0gKFJlc291cmNlRW52UmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZUVudlJlZihyZXNvdXJjZUVudlJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QocmVzb3VyY2VFbnZSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGOiB7Ci0JCQkJRUpCTG9jYWxSZWYgZWpiTG9jYWxSZWYgPSAoRUpCTG9jYWxSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQkxvY2FsUmVmKGVqYkxvY2FsUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFamJSZWYoZWpiTG9jYWxSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGVqYkxvY2FsUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWTogewotCQkJCVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgcnVuQXNTcGVjaWZpZWRJZGVudGl0eSA9IChSdW5Bc1NwZWNpZmllZElkZW50aXR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSdW5Bc1NwZWNpZmllZElkZW50aXR5KHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNlY3VyaXR5SWRlbnRpdHkocnVuQXNTcGVjaWZpZWRJZGVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QocnVuQXNTcGVjaWZpZWRJZGVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZOiB7Ci0JCQkJSWRlbnRpdHkgaWRlbnRpdHkgPSAoSWRlbnRpdHkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUlkZW50aXR5KGlkZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChpZGVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRTogewotCQkJCUljb25UeXBlIGljb25UeXBlID0gKEljb25UeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJY29uVHlwZShpY29uVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoaWNvblR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUU6IHsKLQkJCQlEaXNwbGF5TmFtZSBkaXNwbGF5TmFtZSA9IChEaXNwbGF5TmFtZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGlzcGxheU5hbWUoZGlzcGxheU5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGRpc3BsYXlOYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUY6IHsKLQkJCQlNZXNzYWdlRGVzdGluYXRpb25SZWYgbWVzc2FnZURlc3RpbmF0aW9uUmVmID0gKE1lc3NhZ2VEZXN0aW5hdGlvblJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZURlc3RpbmF0aW9uUmVmKG1lc3NhZ2VEZXN0aW5hdGlvblJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobWVzc2FnZURlc3RpbmF0aW9uUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTjogewotCQkJCU1lc3NhZ2VEZXN0aW5hdGlvbiBtZXNzYWdlRGVzdGluYXRpb24gPSAoTWVzc2FnZURlc3RpbmF0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXNzYWdlRGVzdGluYXRpb24obWVzc2FnZURlc3RpbmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChtZXNzYWdlRGVzdGluYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAobWVzc2FnZURlc3RpbmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChtZXNzYWdlRGVzdGluYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRTogewotCQkJCVBhcmFtVmFsdWUgcGFyYW1WYWx1ZSA9IChQYXJhbVZhbHVlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQYXJhbVZhbHVlKHBhcmFtVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHBhcmFtVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUDogewotCQkJCURlc2NyaXB0aW9uR3JvdXAgZGVzY3JpcHRpb25Hcm91cCA9IChEZXNjcmlwdGlvbkdyb3VwKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGRlc2NyaXB0aW9uR3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGRlc2NyaXB0aW9uR3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQOiB7Ci0JCQkJSk5ESUVudlJlZnNHcm91cCBqbmRpRW52UmVmc0dyb3VwID0gKEpORElFbnZSZWZzR3JvdXApdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpORElFbnZSZWZzR3JvdXAoam5kaUVudlJlZnNHcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoam5kaUVudlJlZnNHcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChqbmRpRW52UmVmc0dyb3VwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChqbmRpRW52UmVmc0dyb3VwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFk6IHsKLQkJCQlTZWN1cml0eUlkZW50aXR5IHNlY3VyaXR5SWRlbnRpdHkgPSAoU2VjdXJpdHlJZGVudGl0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VjdXJpdHlJZGVudGl0eShzZWN1cml0eUlkZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzZWN1cml0eUlkZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuVVNFX0NBTExFUl9JREVOVElUWTogewotCQkJCVVzZUNhbGxlcklkZW50aXR5IHVzZUNhbGxlcklkZW50aXR5ID0gKFVzZUNhbGxlcklkZW50aXR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VVc2VDYWxsZXJJZGVudGl0eSh1c2VDYWxsZXJJZGVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2VjdXJpdHlJZGVudGl0eSh1c2VDYWxsZXJJZGVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QodXNlQ2FsbGVySWRlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTjogewotCQkJCURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRTogewotCQkJCVFOYW1lIHFOYW1lID0gKFFOYW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VRTmFtZShxTmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QocU5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUjogewotCQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gKExpc3RlbmVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAobGlzdGVuZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAobGlzdGVuZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxpc3RlbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUDogewotCQkJCUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1Q6IHsKLQkJCQlKMkVFRU9iamVjdCBqMkVFRU9iamVjdCA9IChKMkVFRU9iamVjdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoajJFRUVPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEU6IHsKLQkJCQlKMkVFRUF0dHJpYnV0ZSBqMkVFRUF0dHJpYnV0ZSA9IChKMkVFRUF0dHJpYnV0ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSjJFRUVBdHRyaWJ1dGUoajJFRUVBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVBdHRyaWJ1dGUoajJFRUVBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShqMkVFRUF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVR5cGVkRWxlbWVudChqMkVFRUF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChqMkVFRUF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChqMkVFRUF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVqYiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWpiIFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRWpiUmVmKEVqYlJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudiBFbnRyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnYgRW50cnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVudkVudHJ5KEVudkVudHJ5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VSZWYoUmVzb3VyY2VSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlSb2xlUmVmKFNlY3VyaXR5Um9sZVJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlSb2xlKFNlY3VyaXR5Um9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VFbnZSZWYoUmVzb3VyY2VFbnZSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgTG9jYWwgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBMb2NhbCBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQkxvY2FsUmVmKEVKQkxvY2FsUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UnVuIEFzIFNwZWNpZmllZCBJZGVudGl0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SdW4gQXMgU3BlY2lmaWVkIElkZW50aXR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSdW5Bc1NwZWNpZmllZElkZW50aXR5KFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpdHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlkZW50aXR5KElkZW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWNvbiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkljb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSWNvblR5cGUoSWNvblR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNwbGF5TmFtZShEaXNwbGF5TmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRGVzdGluYXRpb25SZWYoTWVzc2FnZURlc3RpbmF0aW9uUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRGVzdGluYXRpb24oTWVzc2FnZURlc3RpbmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVBhcmFtVmFsdWUoUGFyYW1WYWx1ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KTkRJIEVudiBSZWZzIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUpORElFbnZSZWZzR3JvdXAoSk5ESUVudlJlZnNHcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXNlIENhbGxlciBJZGVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVXNlQ2FsbGVySWRlbnRpdHkoVXNlQ2FsbGVySWRlbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUU5hbWUoUU5hbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaXN0ZW5lcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTGlzdGVuZXIoTGlzdGVuZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRUF0dHJpYnV0ZShKMkVFRUF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRU5hbWVkRWxlbWVudChFTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVR5cGVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVR5cGVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUF0dHJpYnV0ZShFQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Db21tb25Td2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0NvbW1vblV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0NvbW1vblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkMTA0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25GYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5NT0ZKMkVFUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbW9uVXRpbCB7Ci1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoRU9iamVjdCBvKSB7Ci0JcmV0dXJuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KG8sIHRydWUpOwotfQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KEVPYmplY3QgbywgYm9vbGVhbiBpbmNsdWRlRWFycykgewotCUVPYmplY3QgbWV0YSA9IG8uZUNsYXNzKCk7Ci0JcmV0dXJuIChpbmNsdWRlRWFycyAmJiBtZXRhID09IGVDbGFzc0FwcGxpY2F0aW9uKCkpIHx8Ci0JCW1ldGEgPT0gZUNsYXNzQXBwbGljYXRpb25DbGllbnQoKSB8fAotCQltZXRhID09IGVDbGFzc0VKQkphcigpIHx8Ci0JCW1ldGEgPT0gZUNsYXNzV2ViQXBwKCkgfHwKLQkJbWV0YSA9PSBlQ2xhc3NDb25uZWN0b3IoKTsKLX0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChPYmplY3QgbykgewotCXJldHVybiBpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChvLCB0cnVlKTsKLX0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChPYmplY3QgbywgYm9vbGVhbiBpbmNsdWRlRUFScykgewotCWlmIChvIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJcmV0dXJuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KChFT2JqZWN0KW8sIGluY2x1ZGVFQVJzKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci1wcm90ZWN0ZWQgc3RhdGljIEVDbGFzcyBlQ2xhc3NBcHBsaWNhdGlvbigpIHsKLQlyZXR1cm4gQXBwbGljYXRpb25GYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0QXBwbGljYXRpb24oKTsKLX0KLXByb3RlY3RlZCBzdGF0aWMgRUNsYXNzIGVDbGFzc0FwcGxpY2F0aW9uQ2xpZW50KCkgewotCXJldHVybiBDbGllbnRGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKLX0KLXByb3RlY3RlZCBzdGF0aWMgRUNsYXNzIGVDbGFzc0VKQkphcigpIHsKLQlyZXR1cm4gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldEVKQkphcigpOwotfQotcHJvdGVjdGVkIHN0YXRpYyBFQ2xhc3MgZUNsYXNzV2ViQXBwKCkgewotCXJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRXZWJBcHAoKTsKLX0KLQotcHJvdGVjdGVkIHN0YXRpYyBFQ2xhc3MgZUNsYXNzQ29ubmVjdG9yKCkgewotCXJldHVybiBKY2FGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0Q29ubmVjdG9yKCk7Ci19Ci0vKioKLSAqIFNhZmV0eSBjaGVjayBtZXRob2QgdG8gZW5zdXJlIHRoYXQgdGhlIHZlcnNpb24gb2YgdGhlIGRkIG9iamVjdCBjYW4gYmUgY29tcHV0ZWQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0RET2JqZWN0Rm9yVmVyc2lvbihFT2JqZWN0IGRkKSB7Ci0JaWYgKGRkLmVJc1Byb3h5KCkpIHsKLQkJU3RyaW5nIHByb3h5VXJpID0gKChJbnRlcm5hbEVPYmplY3QpZGQpLmVQcm94eVVSSSgpLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBtZXNzYWdlID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoTU9GSjJFRVJlc291cmNlSGFuZGxlci5KMkVFX1ZFUlNJT05fUFJPWFlfRVJST1IsIG5ldyBPYmplY3RbXXtwcm94eVVyaX0pOyAKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtZXNzYWdlKTsKLQl9IGVsc2UgaWYgKGRkLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLkoyRUVfVkVSU0lPTl9OVUxMX0VSUk9SOyAKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtZXNzYWdlKTsKLQl9Ci19Ci0KLX0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvRGVmYXVsdGFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0RlZmF1bHRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDFlZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvRGVmYXVsdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0vKioKLSAqIEludGVyZmFjZSB1c2VkIGZvciBvYmplY3RzIHRoYXQgY2FuIGJlICJmbHVmZmVkIHVwIiBvbiBkZW1hbmQsIGJ1dCBub3Qgc2VyaWFsaXplZCB1bmxlc3MgbW9kaWZpZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVmYXVsdGFibGUgZXh0ZW5kcyBOb3RpZmllciB7Ci1wdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKTsKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0ZWRBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvRGVmYXVsdGVkQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1NDA5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0ZWRBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwMy8yMi8wMSAxMDo1NDoyMiBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlZmF1bHRlZEFkYXB0ZXJJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgewotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQURBUFRFUl9LRVkgPSAiREVGQVVMVEVEX0FEQVBURVIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGJvb2xlYW4gZk5vdGlmeSA9IHRydWU7Ci0vKioKLSAqIERlZmF1bHRlZEFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIERlZmF1bHRlZEFkYXB0ZXJJbXBsKCkgewotCXN1cGVyKCk7Ci19Ci1wdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBkZWZhdWx0Q29udGFpbmVyKCk7Ci1wdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JcmV0dXJuIEFEQVBURVJfS0VZLmVxdWFscyh0eXBlKTsKLX0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlZmF1bHQoRGVmYXVsdGFibGUgb2JqZWN0KSB7Ci0JRGVmYXVsdG9yIGRlZmF1bHRvciA9IChEZWZhdWx0b3IpIHJldHJpZXZlRGVmYXVsdENvbnRhaW5lckZvcihvYmplY3QpOwotCXJldHVybiBkZWZhdWx0b3IgIT0gbnVsbCAmJiBkZWZhdWx0b3IuaXNEZWZhdWx0KG9iamVjdCk7Ci19Ci0JCQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi8xMy8yMDAxIDg6NDM6NDEgUE0pCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNOb3RpZnkoKSB7Ci0JcmV0dXJuIGZOb3RpZnk7Ci19Ci1wdWJsaWMgc3RhdGljIERlZmF1bHRlZEFkYXB0ZXJJbXBsIHJldHJpZXZlQWRhcHRlckZvcihEZWZhdWx0YWJsZSBub3RpZmllcikgewotCXJldHVybiAoRGVmYXVsdGVkQWRhcHRlckltcGwpRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihub3RpZmllcixBREFQVEVSX0tFWSk7Ci19Ci1wdWJsaWMgc3RhdGljIEVPYmplY3QgcmV0cmlldmVEZWZhdWx0Q29udGFpbmVyRm9yKERlZmF1bHRhYmxlIG5vdGlmaWVyKSB7Ci0JRGVmYXVsdGVkQWRhcHRlckltcGwgYWRhcHRlciA9IHJldHJpZXZlQWRhcHRlckZvcihub3RpZmllcik7Ci0JcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IG51bGwgOiBhZGFwdGVyLmRlZmF1bHRDb250YWluZXIoKTsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvMTMvMjAwMSA4OjQzOjQxIFBNKQotICogQHBhcmFtIG5ld05vdGlmeSBib29sZWFuCi0gKi8KLXB1YmxpYyB2b2lkIHNldE5vdGlmeShib29sZWFuIG5ld05vdGlmeSkgewotCWZOb3RpZnkgPSBuZXdOb3RpZnk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvRGVmYXVsdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhZGViMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi8xNS8yMDAxIDQ6NTg6MTUgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRvciB7Ci0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9iamVjdHMgY3JlYXRlIEBhRGVmYXVsdGFibGUgYW5kIGl0IGlzIHN0aWxsCi0gKiBjdXJyZW50bHkgZGVmYXVsdCBhbmQgbm90IGNvbnRhaW5lZC4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzE1LzIwMDEgNDo1OToyOCBQTSkKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQHBhcmFtIGFEZWZhdWx0YWJsZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24udXRpbC5EZWZhdWx0YWJsZQotICovCi1ib29sZWFuIGlzRGVmYXVsdChEZWZhdWx0YWJsZSBhRGVmYXVsdGFibGUpOwotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0lEVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvSURVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYmNkZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvSURVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLklEVXRpbDsKLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGdlbmVyYXRpbmcgYW5kIHNldHRpbmcgdW5pcXVlIGlkJ3MgZm9yIHJlZiBvYmplY3RzIGNvbnRhaW5lZCB3aXRoaW4gYSByZXNvdXJjZS4gIFRoaXMgaXMgbmVlZGVkCi0gKiBzb21ldGltZXMgd2hlbiBhIHJlZm9iamVjdCBpcyByZWZlcmVuY2VkIGJ5IGFuIG9iamVjdCBpbiBhIHNlcGFyYXRlIHJlc291cmNlLiAgVGhpcyB1dGlsaXR5IHdpbGwgZm9yY2UgdGhlIHJlZm9iamVjdCAKLSAqIHRvIG5vdGlmeSBhZnRlciB0aGUgaWQgZ2V0cyBzZXQsIHVzaW5nIHRoZSBzdGF0aWMgZmVhdHVyZSBvbiB0aGlzIGNsYXNzLiAgVGhlIG9iamVjdCBtdXN0IGJlIGNvbnRhaW5lZCBpbiBhIHJlc291cmNlCi0gKiBmb3IgdGhlIHV0aWxpdHkgbWV0aG9kcyB0byB3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgSURVdGlsaXR5IHsKLQotLyoqCi0gKiBJRFV0aWxpdHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIElEVXRpbGl0eSgpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBHZW5lcmF0ZSBhIGRlZmF1bHQgaWQgYW5kIG5vdGlmeS4KLSAqLwotcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcHJpbVNldERlZmF1bHRJRChFT2JqZWN0IG9iamVjdCkgewotCXJldHVybiBJRFV0aWwuZ2V0T3JBc3NpZ25JRChvYmplY3QpOwotfQotCQotLyoqCi0gKiBHZW5lcmF0ZSBhIGRlZmF1bHQgaWQgYW5kIG5vdGlmeS4KLSAqIEhlbHBlciBmb3IgZGVmYXVsdCBpZCBnZW5lcmF0aW9uIHRvIHN1cHBvcnQgY3Jvc3MgZG9jdW1lbnQgcmVmZXJlbmNlcyB0byBub24geG1pIHJlc291cmNlcwotICogKGVnLCB4bWwgZGVwbG95bWVudCBkZXNjcmlwdG9ycyk7IGNhbGxlZCBmcm9tIG92ZXJyaWRlbiBhY2Nlc3NvcnMgaW4gc2VsZWN0ZWQgb2JqZWN0czsgIAotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBzZXREZWZhdWx0SUQoRU9iamVjdCBvYmplY3QpIHsKLQlpZiAob2JqZWN0ID09IG51bGwgfHwgb2JqZWN0LmVSZXNvdXJjZSgpID09IG51bGwpCi0JCXJldHVybiBudWxsOwotCXJldHVybiBwcmltU2V0RGVmYXVsdElEKG9iamVjdCk7Ci19Ci0JCi0vKioKLSAqIEdlbmVyYXRlIGEgZGVmYXVsdCBpZCBhbmQgbm90aWZ5LCBmb3IgdGhpcyBvYmplY3QgYW5kIGZvciBhbGwgcmVmZXJlbmNlZCBvYmplY3RzIHRoYXQgYXJlIGNvbnRhaW5lZAotICogd2l0aGluIHRoZSBzYW1lIHJlc291cmNlLiAgSGVscGVyIGZvciBkZWZhdWx0IGlkIGdlbmVyYXRpb24gdG8gc3VwcG9ydCBjcm9zcyBkb2N1bWVudCByZWZlcmVuY2VzIHRvIG5vbiB4bWkgcmVzb3VyY2VzCi0gKiAoZWcsIHhtbCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzKTsgdXNlZnVsIGZvciBwb3N0IGNvcHkvYWRkICAKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0RGVmYXVsdElEKEVPYmplY3Qgb2JqZWN0LCBib29sZWFuIHJlY3Vyc2VDaGlsZHJlbikgewotCWlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZVJlc291cmNlKCkgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7Ci0JCQotCVN0cmluZyByZXN1bHQgPSBwcmltU2V0RGVmYXVsdElEKG9iamVjdCk7Ci0KLQlpZiAocmVjdXJzZUNoaWxkcmVuKQotCQlzZXREZWZhdWx0SURGb3JDaGlsZHJlbihvYmplY3QpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQkKLXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXREZWZhdWx0SURGb3JDaGlsZHJlbihFT2JqZWN0IG9iamVjdCkgewotCi0JTGlzdCBvYmplY3RzID0gb2JqZWN0LmVDb250ZW50cygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5zaXplKCk7IGkrKyl7Ci0JCUVPYmplY3QgbyA9IChFT2JqZWN0KW9iamVjdHMuZ2V0KGkpOwotCQlwcmltU2V0RGVmYXVsdElEKG8pOwotCX0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvWG1sU3BlY2lmaWVkRGF0YUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL1htbFNwZWNpZmllZERhdGFBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZDE5MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvWG1sU3BlY2lmaWVkRGF0YUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDYvMDQvMDEgNzo1NjoyMiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFhtbFNwZWNpZmllZERhdGFBZGFwdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURBUFRFUl9LRVkgPSAiWE1MX1NQRUNJRklFRF9BREFQVEVSIjsgLy8kTk9OLU5MUy0xJAotLyoqCi0gKiBYbWxTcGVjaWZpZWREYXRhQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgWG1sU3BlY2lmaWVkRGF0YUFkYXB0ZXIoKSB7Ci0Jc3VwZXIoKTsKLX0KLXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQlyZXR1cm4gQURBUFRFUl9LRVkuZXF1YWxzKHR5cGUpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkOTFkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgYXBpIHRoZSBjb21tb24gbW9kZWwgYXJ0aWZhY3RzIHRoYXQgaW5jbHVkZSAoUmVzb3VyY2UgUmVmZXJlbmNlcywgRUpCIFJlZmVyZW5jZXMsIERpc3BsYXkgTmFtZSwgRGVzY3JpcHRpb24gR3JvdXAsIFNlY3VyaXR5IHJvbGVzLCBFbnZpcm9ubWVudCB2YXJpYWJsZXMpLiAKLSAgICAgICAgIFVzaW5nIHRoaXMgYXBpIHRoZSBjb21tb24gbW9kZWwgYXJ0aWZhY3RzIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZCBpbiBhbnkgajJlZSBtb2R1bGVzIChFbnRlcnByaXNlIEFwcGxpY2F0aW9uLCBBcHBsaWNhdGlvbiBDbGllbnQsIFdlYiBBcHAsIEVKQiBBcHAsIENvbm5lY3RvcnMpLgotICAgICAgICBjYW4gYmUgY3JlYXRlZCBhbmQgYWNjZXNzZWQuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQWNrbm93bGVkZ2VNb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQWNrbm93bGVkZ2VNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDJjNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0Fja25vd2xlZGdlTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgQWNrbm93bGVkZ2VNb2RlIHt9Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBY2tub3dsZWRnZU1vZGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19BQ0tOT1dMRURHRT0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVVBTX09LX0FDS05PV0xFREdFPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QXV0byBBY2tub3dsZWRnZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkF1dG8gQWNrbm93bGVkZ2U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVVUT19BQ0tOT1dMRURHRQotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBY2tub3dsZWRnZU1vZGUgQVVUT19BQ0tOT1dMRURHRV9MSVRFUkFMID0gbmV3IEFja25vd2xlZGdlTW9kZShBVVRPX0FDS05PV0xFREdFLCAiQXV0by1hY2tub3dsZWRnZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5EdXBzIE9rIEFja25vd2xlZGdlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RHVwcyBPayBBY2tub3dsZWRnZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNEVVBTX09LX0FDS05PV0xFREdFCi0JICpUT0RPOiBnZW5lcmF0ZSBjb3JyZWN0bHkKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWNrbm93bGVkZ2VNb2RlIERVUFNfT0tfQUNLTk9XTEVER0VfTElURVJBTCA9IG5ldyBBY2tub3dsZWRnZU1vZGUoRFVQU19PS19BQ0tOT1dMRURHRSwgIkR1cHMtb2stYWNrbm93bGVkZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkFja25vd2xlZGdlIE1vZGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFja25vd2xlZGdlTW9kZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBBY2tub3dsZWRnZU1vZGVbXSB7Ci0JCQlBVVRPX0FDS05PV0xFREdFX0xJVEVSQUwsCi0JCQlEVVBTX09LX0FDS05PV0xFREdFX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+QWNrbm93bGVkZ2UgTW9kZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QWNrbm93bGVkZ2UgTW9kZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBY2tub3dsZWRnZU1vZGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlBY2tub3dsZWRnZU1vZGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BY2tub3dsZWRnZSBNb2RlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWNrbm93bGVkZ2VNb2RlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJQWNrbm93bGVkZ2VNb2RlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BY2tub3dsZWRnZSBNb2RlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWNrbm93bGVkZ2VNb2RlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBBVVRPX0FDS05PV0xFREdFOiByZXR1cm4gQVVUT19BQ0tOT1dMRURHRV9MSVRFUkFMOwotCQkJY2FzZSBEVVBTX09LX0FDS05PV0xFREdFOiByZXR1cm4gRFVQU19PS19BQ0tOT1dMRURHRV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBY2tub3dsZWRnZU1vZGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotCXByaXZhdGUgQWNrbm93bGVkZ2VNb2RlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyh2YWx1ZSwgbmFtZSwgbmFtZSk7Ci0JfQotCi19IC8vQWNrbm93bGVkZ2VNb2RlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQWN0aXZhdGlvbkNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0FjdGl2YXRpb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyOWU2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQWN0aXZhdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgYWN0aXZhdGlvbi1jb25maWdUeXBlIGRlZmluZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gKiBleHBlY3RlZCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLSAqIGluIGl0cyBvcGVyYXRpb25hbCBlbnZpcm9ubWVudC4gVGhpcyBtYXkgaW5jbHVkZSBpbmZvcm1hdGlvbgotICogYWJvdXQgbWVzc2FnZSBhY2tub3dsZWRnZW1lbnQsIG1lc3NhZ2Ugc2VsZWN0b3IsIGV4cGVjdGVkCi0gKiBkZXN0aW5hdGlvbiB0eXBlLCBldGMuCi0gKiAKLSAqIFRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZgotICogbmFtZS92YWx1ZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCi0gKiAKLSAqIFRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhcgotICogbWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0Q29uZmlnUHJvcGVydGllcyA8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2YXRpb25Db25maWcgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnX0NvbmZpZ1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19IC8vIEFjdGl2YXRpb25Db25maWcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2YmI5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBuYW1lL3ZhbHVlCi0gKiBjb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLSAqIAotICogVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0gKiBtZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUgZWxlbWVudAotCSAqICAgICAgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIHByb3BlcnR5IG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUgZWxlbWVudCBjb250YWlucwotCSAqICAgICAgICAgdGhlIG5hbWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBvZgotCSAqICAgICAgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCSAqIAotCSAqICAgICAgICAgRm9yIEpNUyBtZXNzYWdlLWRyaXZlbiBiZWFucywgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eQotCSAqICAgICAgICAgbmFtZXMgYXJlIHJlY29nbml6ZWQ6IGFja25vd2xlZGdlTW9kZSwKLQkgKiAgICAgICAgIG1lc3NhZ2VTZWxlY3RvciwgZGVzdGluYXRpb25UeXBlLCBzdWJzY3JpcHRpb25EdXJhYmlsaXR5Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQXNzZW1ibHlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQXNzZW1ibHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODYwYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0Fzc2VtYmx5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotCi0vKioKLSAqIFRoZSBhc3NlbWJseS1kZXNjcmlwdG9yIGVsZW1lbnQgY29udGFpbnMgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4gQWxsIHRoZSBwYXJ0cyBhcmUgb3B0aW9uYWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIFByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEFzc2VtYmx5RGVzY3JpcHRvciBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgbWV0aG9kIHBlcm1pc3Npb24gdGhhdCBjb250YWlucyBhbGwgdGhlIHJvbGVzIGluIHNlY3VyaXR5Um9sZXMgYW5kCi0JICogaXMgdGhlIHNhbWUgc2l6ZQotCSAqIEBwYXJhbSAgc2VjdXJpdHlSb2xlcyB0aGUgbGlzdCBvZiBTZWN1cml0eVJvbGUKLQkgKiBAcmV0dXJuIFRoZSBNZXRob2RQZXJtaXNzaW9uCi0JICovCi0JTWV0aG9kUGVybWlzc2lvbiBnZXRNZXRob2RQZXJtaXNzaW9uKExpc3Qgc2VjdXJpdHlSb2xlcyk7Ci0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyBmb3IgQGFuRUpCIGdvaW5nCi0JICogdGhyb3VnaCB0aGUgTWV0aG9kUGVybWlzc2lvbnMuCi0JICogQHBhcmFtIGFuRUpCIHRoZSBFbnRlcnByaXNlIEJlYW4gbW9kZWwKLQkgKiBAcmV0dXJuIExpc3Qgb2YgTWV0aG9kRWxlbWVudAotCSAqLwotCUxpc3QgZ2V0TWV0aG9kUGVybWlzc2lvbk1ldGhvZEVsZW1lbnRzKEVudGVycHJpc2VCZWFuIGFuRUpCKSA7Ci0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyBmb3IgQGFuRUpCIGdvaW5nCi0JICogdGhyb3VnaCB0aGUgTWV0aG9kVHJhbnNhY3Rpb25zLgotCSAqIEBwYXJhbSBhbkVKQiB0aGUgRW50ZXJwcmlzZSBCZWFuIG1vZGVsCi0JICogQHJldHVybiBMaXN0IG9mIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlMaXN0IGdldE1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIDsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIFNlY3VyaXR5Um9sZSBnaXZlbiBhIHJvbGVOYW1lCi0JICogQHBhcmFtIHJvbGVOYW1lIHRoZSBuYW1lIG9mIHRoZSByb2xlCi0JICogQHJldHVybiBTZWN1cml0eVJvbGUKLQkgKi8JCi0JcHVibGljIFNlY3VyaXR5Um9sZSBnZXRTZWN1cml0eVJvbGVOYW1lZChTdHJpbmcgcm9sZU5hbWUpOwotCi0JLyoqCi0JICogUmVuYW1lIHRoZSBzZWN1cml0eSByb2xlLCBpZiBpdCBleGlzdHMKLQkgKiBAcGFyYW0gZXhpc3RpbmdSb2xlTmFtZSB0aGUgZXhpc3Rpbmcgcm9sZSBuYW1lCi0JICogQHBhcmFtIG5ld1JvbGVOYW1lIHRoZSBuZXcgcm9sZSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgcmVuYW1lU2VjdXJpdHlSb2xlKFN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBTdHJpbmcgbmV3Um9sZU5hbWUpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTWV0aG9kUGVybWlzc2lvbnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIE1ldGhvZFRyYW5zYWN0aW9ucyByZWZlcmVuY2VzCi0JICogU3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QgbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UKLQkgKiBiZWFuJ3MgbWV0aG9kIGludm9jYXRpb25zLiAgVGhlIGVsZW1lbnQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEKLQkgKiBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLlRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUKLQkgKiBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkIG1ldGhvZHMuCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFamJKYXIgcmVmZXJlbmNlCi0JICovCi0JRUpCSmFyIGdldEVqYkphcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIEVqYkphciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEVqYkphcihFSkJKYXIgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBTZWN1cml0eVJvbGVzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRTZWN1cml0eVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFeGNsdWRlTGlzdCByZWZlcmVuY2UKLQkgKi8KLQlFeGNsdWRlTGlzdCBnZXRFeGNsdWRlTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIEV4Y2x1ZGVMaXN0IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RXhjbHVkZUxpc3QoRXhjbHVkZUxpc3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgTWV0aG9kRWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNpbmcgQGFuRUpCLgotCSAqIEBwYXJhbSBhbkVKQiB0aGUgRW50ZXJwcmlzZSBCZWFuIG1vZGVsCi0JICovCi0Jdm9pZCByZW1vdmVEYXRhKEVudGVycHJpc2VCZWFuIGFuRUpCKSA7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ01QQXR0cmlidXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ01QQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZWQ2NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NNUEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVBdHRyaWJ1dGU7Ci0vKioKLSAqIERlc2NyaWJlcyBhIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkLiBUaGUgZmllbGQgZWxlbWVudCBpbmNsdWRlcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsIGFuZCB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIENNUEF0dHJpYnV0ZSBleHRlbmRzIEoyRUVFQXR0cmlidXRlIHsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gV2l0aCBFSkIgMi4wLCBhc3N1bWluZyBhIEphdmEgZmllbGQgaXMgbm8gbG9uZ2VyIHNhZmUuCi0JICogCQlVc2UgZ2V0VHlwZSgpIGFuZCBnZXROYW1lKCkgdG8gZ2V0IHRoZSBtb3N0IGNvbW1vbiBmaWVsZCBpbmZvLgotCSAqCQlPciB1c2UgZ2V0RWpiQ2xhc3MoKSB0byBnZXQgYWRkaXRpb25hbCBKYXZhIGluZm8uCi0JICpAcmV0dXJuIHRoZSBGaWVsZCB2YWx1ZQotCSAqLwotCi0JRmllbGQgZ2V0RmllbGQoKSA7Ci0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGdldCBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGlzIGF0dHJyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBTdHJpbmcgdmFsdWUKLQkgKi8KLQlTdHJpbmcgZ2V0R2V0dGVyTmFtZSgpOwotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpbiBpdHMgb3JpZ2luYWwgZm9ybSAoaS5lLiwgdW53cmFwcGVkIGlmCi0JICogdGhlIHR5cGUgaGFzIGJlZW4gd3JhcHBlZCkuCi0JICogQHJldHVybiBKYXZhSGVscGVycyB2YWx1ZQotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRPcmlnaW5hdGluZ1R5cGUoKSA7Ci0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHNldCBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGlzIGF0dHJyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBTdHJpbmcgdmFsdWUKLQkgKi8KLQlTdHJpbmcgZ2V0U2V0dGVyTmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgVHlwZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgSmF2YUhlbHBlcnMKLQkgKi8KLQlKYXZhSGVscGVycyBnZXRUeXBlKCkgOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGEgQ01SIGZpZWxkCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JYm9vbGVhbiBpc0NNUkZpZWxkKCkgOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHRoZSBrZXkgZmllbGQgb2YgdGhlIGJlYW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlib29sZWFuIGlzS2V5KCkgOwotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGEgcHJpbWtleS1maWVsZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbUtleUZpZWxkKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgb3JpZ2luYXRpbmcgSmF2YSB0eXBlCi0JICogQHBhcmFtIG5ld09yaWdpbmF0aW5nVHlwZSB0aGUgSmF2YUhlbHBlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcmlnaW5hdGluZ1R5cGUoSmF2YUhlbHBlcnMgbmV3T3JpZ2luYXRpbmdUeXBlKSA7Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgCi0JICogdGhlIGNtciBmaWVsZC4KLQkgKiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlcgotCSAqIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4KLQkgKiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZQotCSAqIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGEgdGFyZ2V0QXR0cmlidXRlIGV4aXN0cy4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlib29sZWFuIGlzRGVyaXZlZCgpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIGF0dHJpYnV0ZSBhcyBhIGRlcml2ZWQgYXR0cmlidXRlCi0JICogQHBhcmFtIGFCb29sZWFuIHRoZSBib29sZWFuIHZhbHVlCi0JICovCi0Jdm9pZCBzZXREZXJpdmVkKGJvb2xlYW4gYUJvb2xlYW4pOwotCQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NNUkZpZWxkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ01SRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjMjEzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ01SRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLS8qKgotICogRGVzY3JpYmVzIHRoZSBiZWFuIHByb3ZpZGVyJ3MgdmlldyBvZiBhIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBhbmQgdGhlIGNsYXNzIHR5cGUgb2YgYSBmaWVsZCBpbiB0aGUgc291cmNlIG9mIGEgcm9sZSBvZiBhIHJlbGF0aW9uc2hpcC4gVGhlIENNUkZpZWxkOjpuYW1lIGVsZW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yIG1ldGhvZHMgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBDTVJGaWVsZDo6dHlwZSBlbGVtZW50IGlzIHVzZWQgb25seSBmb3IgY29sbGVjdGlvbi12YWx1ZWQgQ01SRmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBpcyB1c2VkIChhIGphdmEgY2xhc3MgbmFtZSkuCi0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01SRmllbGQgZXh0ZW5kcyBDTVBBdHRyaWJ1dGV7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBqYXZhIENvbGxlY3Rpb25UeXBlIG5hbWUKLQkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBqYXZhIGNvbGxlY3Rpb24gdHlwZQotCSAqLwotCXB1YmxpYyAgU3RyaW5nIGdldENvbGxlY3Rpb25UeXBlTmFtZSgpOyAgCi0JCi0JLyoqCi0JICogU2V0cyB0aGUgamF2YSBjb2xsZWN0aW9uIHR5cGUgbmFtZQotCSAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgbmFtZSBvZiB0aGUgamF2YSBjb2xsZWN0aW9uIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2xsZWN0aW9uVHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSb2xlIHJlZmVyZW5jZQotCSAqLwotCUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJvbGUgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgQ29sbGVjdGlvblR5cGUgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldENvbGxlY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQ29sbGVjdGlvblR5cGUgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRDb2xsZWN0aW9uVHlwZShKYXZhQ2xhc3MgdmFsdWUpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NvbW1vblJlbGF0aW9uc2hpcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NvbW1vblJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWM3MzIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Db21tb25SZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMC8yNi8yMDAxIDk6MjQ6MjcgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vblJlbGF0aW9uc2hpcCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIEVMaXN0IG9mIHRoZSBjb21tb24gcm9sZXMKLQkgKiBAcmV0dXJuIEVMaXN0IHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb21tb25Sb2xlcygpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIGZpcnN0IGNvbW1vbiByb2xlCi0JICogQHJldHVybiBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBDb21tb25SZWxhdGlvbnNoaXBSb2xlIGdldEZpcnN0Q29tbW9uUm9sZSgpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIHNlY29uZCBjb21tb24gcm9sZQotCSAqIEByZXR1cm4gQ29tbW9uUmVsYXRpb25zaGlwUm9sZQotCSAqLwotCXB1YmxpYyBDb21tb25SZWxhdGlvbnNoaXBSb2xlIGdldFNlY29uZENvbW1vblJvbGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBDb21tb25SZWxhdGlvbnNoaXAKLQkgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIENvbW1vblJlbGF0aW9uc2hpcAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NvbW1vblJlbGF0aW9uc2hpcFJvbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Db21tb25SZWxhdGlvbnNoaXBSb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMjVjYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NvbW1vblJlbGF0aW9uc2hpcFJvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvMjYvMjAwMSA5OjI0OjI3IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBDb21tb25SZWxhdGlvbnNoaXBSb2xlIGV4dGVuZHMgRU9iamVjdCB7Ci0vKioKLSAqIFJldHVybiB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZXMgZnJvbSBteSBFbnRpdHkgdGhhdCBhcmUgdXNlZAotICogYnkgdGhpcyByb2xlLgotICogQHJldHVybiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgQ29tbW9uUmVsYXRpb25zaGlwUm9sZQotICovCi0KLXB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVzKCk7Ci0vKioKLSAqIFJldHVybiBvdXIgcGFyZW50IHJlbGF0aW9uc2hpcCBhcyBhIENvbW1vblJlbGF0aW9uc2hpcAotICogQHJldHVybiB0aGUgQ29tbW9uUmVsYXRpb25zaGlwIHJlZmVyZW5jZQotICovCi0KLXB1YmxpYyBDb21tb25SZWxhdGlvbnNoaXAgZ2V0Q29tbW9uUmVsYXRpb25zaGlwKCk7Ci0KLQotLyoqCi0KLSAqIERlZmluZXMgYSBuYW1lIGZvciBhIHJvbGUgdGhhdCBpcyB1bmlxdWUgd2l0aGluIGFuIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0gKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLS8qKgotICogUmV0dXJuIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGlzIHJvbGUuICBUaGlzIGlzIHRoZSBuYW1lIGRlZmluZWQgaW4gdGhlIERlcGxveW1lbnQKLSAqIERlc2NyaXB0b3IuICBZb3Ugc2hvdWxkIHVzZSA8Y29kZT5nZXROYW1lKCk8L2NvZGU+IGZvciB0aGUgbmFtZSB0byB1c2UgaW4gY29kZQotICogZ2VuZXJhdGlvbi4KLSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgCi0gKi8KLVN0cmluZyBnZXRSb2xlTmFtZSgpOwotLyoqCi0gKiBSZXR1cm4gdGhlIG90aGVyIHJvbGUuCi0gKiBAcmV0dXJuIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgcmVmZXJlbmNlCi0gKi8KLQotQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBnZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpIDsKLS8qKgotICogQHJldHVybiBUaGUgU291cmNlIGVqYgotICogQ29tcHV0ZSB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSB3aGljaCBpcyB0aGUgc291cmNlIG9mIGEgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4KLSAqIEByZXR1cm4gIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgcmVmZXJlbmNlCi0gKi8KLXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldFNvdXJjZUVudGl0eSgpOwotCi0vKioKLSAqIENvbXB1dGUgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgd2hpY2ggaXMgdGhlIHR5cGUgb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLgotICogQHJldHVybiBUaGUgdHlwZSBlamIgCi0gKi8KLXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldFR5cGVFbnRpdHkoKTsKLS8qKgotKiBAcmV0dXJuIFRoZSBjb21wdXRlZCB2YWx1ZSBvZiB0aGUgaXNGb3J3YXJkIGF0dHJpYnV0ZQotKiBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHJvbGUgc2hvdWxkIGJlIG1hcHBlZCB0byBhIHBlcnNpc3RlbnQgcmVmZXJlbmNlLCBzdWNoIGFzIGEgZm9yZWlnbiBrZXkuCi0qLwotcHVibGljIGJvb2xlYW4gaXNGb3J3YXJkKCk7Ci0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBrZXkgCi0gKiBAcmV0dXJuIFRoZSBjb21wdXRlZCB2YWx1ZSBpc0tleQotICovCi1wdWJsaWMgYm9vbGVhbiBpc0tleSgpOwotCi0vKioKLSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGFzIGEgaGludCBhYm91dCB0aGUga2V5IHN0YXR1cyBvZiB0aGUgcm9sZS4KLSAqIEBwYXJhbSBhQm9vbGVhbiB0aGUgYm9vbGVhbiB2YWx1ZQotICovCi1wdWJsaWMgdm9pZCBzZXRLZXkoYm9vbGVhbiBhQm9vbGVhbikgOwotLyoqCi0qIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIGlzTWFueQotKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVwcGVyIGxpbWl0IG9mIG91ciBtdWx0aXBsaWNpdHkgaXMgPiAxCi0qLwotcHVibGljIGJvb2xlYW4gaXNNYW55KCk7Ci0KLS8qKgotKiAKLSogc2V0cyB0aGUgdXBwZXIgbGltaXQgb2Ygb3VyIG11bHRpcGxpY2l0eQotKiBAcGFyYW0gdXBwZXJCb3VuZCB0aGUgaW50IHZhbHVlIG9mIHRoZSBtdWx0aXBsaWNpdHkKLSovCi1wdWJsaWMgdm9pZCBzZXRVcHBlcihpbnQgdXBwZXJCb3VuZCk7Ci0KLS8qKgotKiAKLSogc2V0cyB0aGUgbG93ZXIgbGltaXQgb2Ygb3VyIG11bHRpcGxpY2l0eQotKiBAcGFyYW0gbG93ZXJCb3VuZCB0aGUgaW50IHZhbHVlIGlmIHRoZSBtdWx0aXBsaWNpdHkKLSovCi1wdWJsaWMgdm9pZCBzZXRMb3dlcihpbnQgbG93ZXJCb3VuZCk7Ci0KLS8qKgotKiBAcmV0dXJuIFRoZSBjb21wdXRlZCB2YWx1ZSBvZiB0aGUgaXNOYXZpZ2FibGUgYXR0cmlidXRlCi0qIFNwZWNpZmllcyB0aGF0IGFjY2Vzc29ycyBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGlzIHJlbGF0aW9uc2hpcCByb2xlLgotKi8KLXB1YmxpYyBib29sZWFuIGlzTmF2aWdhYmxlKCk7Ci0KLS8qKgotICogR2V0cyB0aGUgYXR0cmlidXRlIG5hbWUgb2YgYSBnaXZlbiBDTVBBdHRyaWJ1dGUKLSAqIEBwYXJhbSByb2xlQXR0cmlidXRlIHRoZSBDTVBBdHRyaWJ1dGUKLSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRhcmdldEF0dHJpYnV0ZQotICovCi1wdWJsaWMgU3RyaW5nIGdldFRhcmdldEF0dHJpYnV0ZU5hbWUoQ01QQXR0cmlidXRlIHJvbGVBdHRyaWJ1dGUpOwotCi0vKioKLSAqIENvbGxlY3RzIHRoZSBhdHRyaWJ1dGVzCi0gKgotICovCi12b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoKTsKLQkvKioKLQkgKiBNZXRob2QgaXNSZXF1aXJlZC4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlib29sZWFuIGlzUmVxdWlyZWQoKTsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Db250YWluZXJNYW5hZ2VkRW50aXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ29udGFpbmVyTWFuYWdlZEVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTliZDIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Db250YWluZXJNYW5hZ2VkRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBDb250YWluZXJNYW5hZ2VkRW50aXR5IGV4dGVuZHMgRW50aXR5ewotCi0JLyoqCi0JICogRGVub3RlcyAxLnggdmVyc2lvbiBvZiB0aGUgQ01QIEJlYW4KLQkgKi8KLQlTdHJpbmcgVkVSU0lPTl8xX1ggPSAiMS54IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIERlbm90ZXMgMi54IHZlcnNpb24gb2YgdGhlIENNUCBCZWFuCi0JICovCi0JU3RyaW5nIFZFUlNJT05fMl9YID0gIjIueCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgV0FTX0dFTkVSQVRFRF9TVFJJTkdfS0VZID0gImNvbS5pYm0ud3MuZWpicGVyc2lzdGVuY2UuZGF0YWFjY2Vzcy5HZW5lcmF0ZWRTdHJpbmdQSyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgV0FTX0dFTkVSQVRFRF9TVFJJTkdfRklFTEQgPSAid2FzR2VuVW5rbm93bmtleVZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFNldCB0byBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JU3RyaW5nIFVOS05PV05fUFJJTUFSWV9LRVkgPSAiamF2YS5sYW5nLk9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTZXQgdG8gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBKQVZBX0xBTkdfU1RSSU5HID0gImphdmEubGFuZy5TdHJpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogCi0JICovCi0JaW50IERFUklWRURfRkxBR19DSEFOR0UgPSAzMDE7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIENNUEF0dHJpYnV0ZSB3aXRoIGFOYW1lIGFuZCBhZGQgaXQgdG8gdGhlIGtleUF0dHJpYnV0ZXMgICAgIAotCSAqIG9mIHRoZSBiZWFuCi0JICogQHBhcmFtIGFOYW1lIHRoZSBuYW1lIG9mIHRoZSBrZXkgYXR0cmlidXRlCi0JICogQHJldHVybiBDTVBBdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgQ01QQXR0cmlidXRlIGFkZEtleUF0dHJpYnV0ZU5hbWUoU3RyaW5nIGFOYW1lKTsKLQotCS8qKgotCSAqIEFkZCBhIHBlcnNpc3RlbnQgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgbmFtZSBmb3IgYUZpZWxkLgotCSAqIEBwYXJhbSBhRmllbGQgYSByZWZlcmVuY2Ugb2YgdHlwZSBGaWVsZAotCSAqIEByZXR1cm4gQ01QQXR0cmlidXRlCi0JICovCi0JcHVibGljIGFic3RyYWN0IENNUEF0dHJpYnV0ZSBhZGRQZXJzaXN0ZW50QXR0cmlidXRlKEZpZWxkIGFGaWVsZCkgOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBDTVBBdHRyaWJ1dGUgd2l0aCBhTmFtZSBhbmQgYWRkIGl0IHRvIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gYU5hbWUgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlCi0JICogQHJldHVybiBDTVBBdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQ01QQXR0cmlidXRlIGFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVOYW1lKFN0cmluZyBhTmFtZSkgOwotCS8qKgotCSAqIFJldHVybiB0aGUga2V5QXR0cmlidXRlIHdpdGggYU5hbWUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvOC8yMDAwIDk6MjU6MjcgUE0pCi0JICogQHJldHVybiBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiBAcGFyYW0gYU5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUNNUEF0dHJpYnV0ZSBnZXRLZXlBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSA7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW50QXR0cmlidXRlIHdpdGggYU5hbWUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvOC8yMDAwIDk6MjU6MjcgUE0pCi0JICogQHJldHVybiBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiBAcGFyYW0gYU5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUNNUEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKFN0cmluZyBhTmFtZSkgOwotCS8qKgotCSAqIElmIGEgcHJpbWFyeSBrZXkgZXhpc3RzLCByZXR1cm4gdGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlOyB0aGUgcHJpbWFyeSBrZXkgaXMgZGVmaW5lZCBhcyBvbmUgYW5kIG9ubHkgb25lCi0JICoga2V5IGF0dHJpYnV0ZSwgd2hvc2UgdHlwZSBpcyB0aGUgc2FtZSBhcyB0aGUga2V5IGNsYXNzCi0JICogQHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgQ01QQXR0cmlidXRlCi0JICogQGRlcHJlY2F0ZWQgLSBVc2UgZ2V0UHJpbUtleUZpZWxkKCkKLQkgKi8KLQlDTVBBdHRyaWJ1dGUgZ2V0UHJpbWFyeUtleUF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIHdoZW4gaW52b2tlZCBvbiB0aGUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZSAgCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTVAgaXMgb2YgdmVyc2lvbiAxLlgKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24xX1goKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNUCBpcyBvZiB2ZXJzaW9uIDIuWAotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjJfWCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhbkF0dHJpYnV0ZSBpcyBhIGtleSBhdHRyaWJ1dGUgb2YgdGhlIENNUAotCSAqIEBwYXJhbSBhbkF0dHJpYnV0ZSBhIGF0dHJpYnV0ZSBvZiB0aGUgQ01QIG9mIHR5cGUgQ01QQXR0cmlidXRlCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNLZXlBdHRyaWJ1dGUoQ01QQXR0cmlidXRlIGFuQXR0cmlidXRlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIGJlYW4gcmVwcmVzZW50cyBhbiBpbnN0YW5jZSBvZiB0aGUgInVua25vd24gcHJpbWFyeSBrZXkiIGNhc2UKLQkgKiBkZXNjcmliZWQgaW4gdGhlIHNwZWNpZmljYXRpb24uICBUaGlzIGlzIGlkZW50aWZpZWQgYnkgdGhlIHByaW1hcnkga2V5IGNsYXNzCi0JICogYmVpbmcgc3BlY2lmaWVkIGFzICJqYXZhLmxhbmcuT2JqZWN0Ii4KLQkgKiBJbiBvcmRlciB0byBkZXBsb3kgYW4gdW5rbm93biBwcmltYXJ5IGtleSBiZWFuLCB3ZSBtdXN0IHN1YnN0aXR1dGUgYSByZWFsIGtleSwKLQkgKiBhbmQgYWRkIGEgY29ycmVzcG9uZGluZyBmaWVsZC4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Vua25vd25QcmltYXJ5S2V5KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBQZXJzaXN0ZW50IEZpZWxkIE5hbWVzCi0JICogQHJldHVybiBhbiBTdHJpbmcgYXJyYXkgb2YgbmFtZXMgCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGxpc3RQZXJzaXN0ZW50RmllbGROYW1lcygpOwotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBuYW1lIHNwZWNpZmllZCBpbiB0aGUgYUZpZWxkIGZyb20gdGhlIGxpc3Qgb2YgcGVyc2lzdGVudCBhdHRyaWJ1dGVzCi0JICogQHBhcmFtIGFGaWVsZCB0aGUgRmllbGQgcmVmZXJlbmNlCi0JICogQHJldHVybiBDTVBBdHRyaWJ1dGUgcmVmZXJlbmNlCi0JICovCi0KLQlDTVBBdHRyaWJ1dGUgcmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZShGaWVsZCBhRmllbGQpIDsKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZWQgYU5hbWUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMi8yMDAwIDg6NTk6MzIgUE0pCi0JICogQHBhcmFtIGFOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIENNUEF0dHJpYnV0ZSByZWZlcmVuY2UKLQkgKi8KLQlDTVBBdHRyaWJ1dGUgcmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZShTdHJpbmcgYU5hbWUpIDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQkgKiAKLQkgKiBAaW52YXJpYW50IFRoZSBjbXAtdmVyc2lvbiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiAxLnggLCAyLngKLQkgKiBAZGVmYXVsdCAyLngKLQotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB0aHJvd3MgdGhpcyBleGNlcHRpb24gd2hlbiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBpbiBnZXR0aW5nIHZlcnNpb24gb2YgdGhlIENNUAotCSogQHJldHVybiB0aGUgdmVyc2lvbiBvZiBDTVAgcmVwcmVzZW50ZWQgaW4gaW50IHR5cGUgCi0JKi8KLQlwdWJsaWMgaW50IGdldENNUFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBBYnN0cmFjdFNjaGVtYU5hbWUgYXR0cmlidXRlCi0JICogVGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSAKLQkgKiBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4gSXQgaXMgdXNlZCBpbiBFSkIgUUwgcXVlcmllcy4KLQkgKiAKLQkgKiBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkgYmVhbiB3aG9zZSBsb2NhbCBpbnRlcmZhY2UKLQkgKiBpcyBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4KLQkgKiAKLQotCSAqLwotCVN0cmluZyBnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBBYnN0cmFjdFNjaGVtYU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRBYnN0cmFjdFNjaGVtYU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgUGVyc2lzdGVudEF0dHJpYnV0ZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEtleUF0dHJpYnV0ZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEtleUF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnl9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeSNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNCBtb3ZlZCBmcm9tIENNRQotCSAqIFRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMi54IGFuZCBxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4gZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZCBmb3IgdGhlIGVudGl0eSBiZWFuLgotCSAqIAotCSAqIEBpbnZhcmlhbnQgc2VlIGRlc2NyaXB0aW9uCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1F1ZXJpZXMoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5I2dldEVudGl0eQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnkiIG9wcG9zaXRlPSJlbnRpdHkiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRRdWVyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DTVAgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DTVAgQXR0cmlidXRlPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q01QIEF0dHJpYnV0ZTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQ01QQXR0cmlidXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q01QQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltIEtleSBGaWVsZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbSBLZXkgRmllbGQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbSBLZXkgRmllbGQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByaW1LZXlGaWVsZChDTVBBdHRyaWJ1dGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ByaW1LZXlGaWVsZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNNUEF0dHJpYnV0ZSBnZXRQcmltS2V5RmllbGQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5I2dldFByaW1LZXlGaWVsZCA8ZW0+UHJpbSBLZXkgRmllbGQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW0gS2V5IEZpZWxkPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmltS2V5RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByaW1LZXlGaWVsZChDTVBBdHRyaWJ1dGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBhbGwgdGhlIGF2YWlsYWJsZSBRdWVyeSBtZXRob2RzIGZvciB0aGUgSG9tZSBhbmQgTG9jYWwgSG9tZSBpbnRlcmZhY2VzLgotCSAqIEByZXR1cm4gTGlzdCBvZiBGaW5kIFF1ZXJ5IE1ldGhvZHMKLQkgKi8KLQlMaXN0IGdldEF2YWlsYWJsZUZpbmRRdWVyeU1ldGhvZHMoKSA7Ci0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBhbGwgdGhlIGF2YWlsYWJsZSBRdWVyeSBtZXRob2RzIGZvciB0aGUgQmVhbiBjbGFzcy4KLQkgKiBAcmV0dXJuIExpc3Qgb2YgU2VsZWN0IFF1ZXJ5IE1ldGhvZHMKLQkgKi8KLQlMaXN0IGdldEF2YWlsYWJsZVNlbGVjdFF1ZXJ5TWV0aG9kcygpOwotCS8qKgotCSAqIFJldHVybiBhIExpc3QsIHNvcnRlZCBieSBzaWduYXR1cmUsIG9mIGFsbCB0aGUgYXZhaWxhYmxlIFF1ZXJ5IG1ldGhvZHMgCi0JICogb24gdGhlIHJlbW90ZSBIb21lLCBsb2NhbCBIb21lLCBvciBlamJTZWxlY3QgbWV0aG9kcyBvbiB0aGUgYmVhbiBjbGFzcwotCSAqIEByZXR1cm4gTGlzdCBvZiBRdWVyeSBtZXRob2RzCi0JICovCi0JTGlzdCBnZXRBbGxBdmFpbGFibGVRdWVyeU1ldGhvZHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIEVKQkV4dGVuc2lvbkZpbHRlcgotCSAqIEBwYXJhbSBhRmlsdGVyIGEgcmVmZXJlbmNlIG9mIHR5cGUgRUpCRXh0ZW5zaW9uRmlsdGVyCi0JICogQHJldHVybiBMaXN0IG9mIGZpbHRlcmVkIGZlYXR1cmVzCi0JICovCi0JcHVibGljIExpc3QgZ2V0RmlsdGVyZWRGZWF0dXJlcyhFSkJFeHRlbnNpb25GaWx0ZXIgYUZpbHRlcik7Ci0JCi0JLyoqCi0JICogTWFrZXMgdGhlIHByaW1hcnkgS2V5IEZpZWxkIHByb3h5LgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgbWFrZVByaW1LZXlGaWVsZFByb3h5KCk7Ci0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBDTVIgRmllbGRzCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBhbGwgQ01SIGZpZWxkcyBmb3IgdGhpcyBiZWFuLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldENNUkZpZWxkcygpOwotCS8qKgotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgYWxsIHJvbGVzIHdoZXJlIHRoaXMgYmVhbiBpcyB0aGUgc291cmNlLgotCSAqIEBsaW5rIENvbW1vblJlbGF0aW9uc2hpcFJvbGUKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgc3BlY2lmaWMgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSB3aGljaCBoYXMgYSBuYW1lZCByb2xlCi0JICogdGhhdCBpcyBlcXVhbCB0byA8Y29kZT5yb2xlTmFtZTwvY29kZT4uCi0JICogQHNlZSBDb21tb25SZWxhdGlvbnNoaXBSb2xlCi0JICogQHBhcmFtIHJvbGVOYW1lIHRoZSByb2xlIG5hbWUgCi0JICogQHJldHVybiBhIHJlZmVyZW5jZSB0byBDb21tb25SZWxhdGlvbnNoaXBSb2xlIGluc3RhbmNlCi0JICovCi0JcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZShTdHJpbmcgcm9sZU5hbWUpOwotCQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0Rlc3RpbmF0aW9uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0Rlc3RpbmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWJiMzlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9EZXN0aW5hdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIERlc3RpbmF0aW9uVHlwZSB7fQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVzdGluYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVVFPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPUElDPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UXVldWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5RdWV1ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNRVUVVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVzdGluYXRpb25UeXBlIFFVRVVFX0xJVEVSQUwgPSBuZXcgRGVzdGluYXRpb25UeXBlKFFVRVVFLCAiUXVldWUiLCAiUXVldWUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VG9waWM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Ub3BpYzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUT1BJQwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVzdGluYXRpb25UeXBlIFRPUElDX0xJVEVSQUwgPSBuZXcgRGVzdGluYXRpb25UeXBlKFRPUElDLCAiVG9waWMiLCAiVG9waWMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkRlc3RpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlc3RpbmF0aW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBEZXN0aW5hdGlvblR5cGVbXSB7Ci0JCQlRVUVVRV9MSVRFUkFMLAotCQkJVE9QSUNfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5EZXN0aW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EZXN0aW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlc3RpbmF0aW9uVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURlc3RpbmF0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRlc3RpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEZXN0aW5hdGlvblR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEZXN0aW5hdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRlc3RpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEZXN0aW5hdGlvblR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFFVRVVFOiByZXR1cm4gUVVFVUVfTElURVJBTDsKLQkJCWNhc2UgVE9QSUM6IHJldHVybiBUT1BJQ19MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEZXN0aW5hdGlvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL0Rlc3RpbmF0aW9uVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQkV4dGVuc2lvbkZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQkV4dGVuc2lvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQyMTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FSkJFeHRlbnNpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA1OjMxOjUzIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBFSkJFeHRlbnNpb25GaWx0ZXIgewotCQotCS8qKgotCSAqIFJldHVybiBhIExpc3Qgb2Ygb25lIG9mIHRoZSBwcm9wZXJ0aWVzIHVzaW5nIGEgRmlsdGVyCi0JICogQHBhcmFtIGVqYiByZWZlcmVuY2UgdG8gdGhlIEVudGVycHJpc2UgQmVhbiBtb2RlbAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwkKLQlMaXN0IGZpbHRlcihFbnRlcnByaXNlQmVhbiBlamIpIDsKLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCSmFyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCSmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYWRlYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQkphci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLQotLyoqCi0gKiBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWpiLWphciBmaWxlOyBvcHRpb25hbCBkaXNwbGF5IG5hbWU7IG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lOyBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUKLSAqIG5hbWU7IG1hbmRhdG9yeSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBpbmNsdWRlZCBlbnRlcnByaXNlIGJlYW5zOyBhIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMsIGlmIGFueTsgYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcjsgYW5kIGFuIG9wdGlvbmFsIG5hbWUgb2YgYW4gZWpiLWNsaWVudC1qYXIgZmlsZSBmb3IgdGhlIGVqYi1qYXIuCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkphciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCi0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotICovCi1ib29sZWFuIGNvbnRhaW5zQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgOwotCi0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBzZWN1cml0eSByb2xlIHdpdGggdGhlIG5hbWUgc3BlY2lmaWVkIGluIHRoZSBhcmd1bWVudAotICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IHJvbGUKLSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotICovCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc1NlY3VyaXR5Um9sZShTdHJpbmcgbmFtZSk7Ci0vKioKLSAqIFJldHVybiBMaXN0IG9mIEJlYW5NYW5hZ2VkIGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1MaXN0IGdldEJlYW5NYW5hZ2VkQmVhbnMoKSA7Ci0vKioKLSAqIFJldHVybiBMaXN0IG9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYmVhbnMgaW4gdGhpcyBqYXIuCi0gKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0gKi8KLUxpc3QgZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zKCkgOwotLyoqCi0gKiBSZXR1cm4gTGlzdCBvZiBFSkIgMS4xIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYmVhbnMgaW4gdGhpcyBqYXIuCi0gKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0gKi8KLUxpc3QgZ2V0RUpCMTFDb250YWluZXJNYW5hZ2VkQmVhbnMoKSA7Ci0vKioKLSAqIFJldHVybiBMaXN0IG9mIEVKQiAyLjAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotTGlzdCBnZXRFSkIyMENvbnRhaW5lck1hbmFnZWRCZWFucygpIDsKLS8qKgotICogUmV0dXJuIExpc3Qgb2YgTWVzc2FnZURyaXZlbiBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotTGlzdCBnZXRNZXNzYWdlRHJpdmVuQmVhbnMoKSA7Ci0vKioKLSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRWpiUmVsYXRpb25zIHJlZmVyZW5jZXMKLSAqIEEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuCi0gKi8KLXB1YmxpYyBMaXN0IGdldEVqYlJlbGF0aW9ucygpOwotLyoqCi0gKiBSZXR1cm4gYW4gZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZWQgYnkgdGhlIEVqYlJlZiwgaWYgb25lIGV4aXN0cy4gIFRoZSBlamItbGluayB2YWx1ZQotICogb2YgdGhlIHJlZiBtdXN0IGVxdWF0ZSB0byBhIG5hbWVkIGVudGVycHJpc2UgYmVhbiBjb250YWluZWQgaW4gdGhlIGphcjsgb3RoZXJ3aXNlIHJldHVybgotICogbnVsbAotICogQHBhcmFtIHJlZiByZWZlcmVuY2UgdG8gdGhlIEVqYlJlZgotICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIEVudGVycHJpc2VCZWFuIG1vZGVsCi0gKi8KLXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmKTsKLQotLyoqCi0gKiBSZXR1cm4gdGhlIGVudGVycHJpc2UgYmVhbiBtb2RlbCB3aGljaCBoYXMgdGhlIGJlYW4gbmFtZSBvZiBlamJOYW1lCi0gKiBAcGFyYW0gZWpiTmFtZSB0aGUgbmFtZSBvZiB0aGUgRW50ZXJwcmlzZSBCZWFuCi0gKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgRW50ZXJwcmlzZUJlYW4gbW9kZWwKLSAqLwotcHVibGljIEVudGVycHJpc2VCZWFuIGdldEVudGVycHJpc2VCZWFuTmFtZWQoU3RyaW5nIGVqYk5hbWUpOwotLyoqCi0gKiBSZXR1cm4gQUxMIEVudGVycHJpc2VCZWFuKHMpIHRoYXQgYXJlIHJlZmVyZW5jaW5nIEBhSmF2YUNsYXNzIGFzIGEKLSAqIGhvbWUsIHJlbW90ZSwgYmVhbiBjbGFzcywgb3Iga2V5IGNsYXNzLgotICogQHBhcmFtIGFKYXZhQ2xhc3MgYSByZWZlcmVuY2Ugb2YgdHlwZSBKYXZhQ2xhc3MKLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2YgRW50ZXJwcmlzZUJlYW4KLSAqLwotTGlzdCBnZXRFbnRlcnByaXNlQmVhbnNXaXRoUmVmZXJlbmNlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSA7Ci0vKioKLSAqIFJldHVybiB0aGUgKkZJUlNUKiBFbnRlcnByaXNlQmVhbiB0aGF0IGlzIHJlZmVyZW5jaW5nIEBhSmF2YUNsYXNzIGFzIGl0cwotICogaG9tZSwgcmVtb3RlLCBiZWFuIGNsYXNzLCBvciBrZXkgY2xhc3MuCi0gKiBAcGFyYW0gYUphdmFDbGFzcyBhIHJlZmVybmNlIG9mIHR5cGUgSmF2YUNsYXNzCi0gKiBAcmV0dXJuIHJlZmVyZW5jZSB0byBFbnRlcnByaXNlQmVhbiBtb2RlbAotICovCi1FbnRlcnByaXNlQmVhbiBnZXRFbnRlcnByaXNlQmVhbldpdGhSZWZlcmVuY2UoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIDsKLS8qKgotICogUmV0dXJuIExpc3Qgb2YgU2Vzc2lvbiBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2YgRW50ZXJwcmlzZUJlYW4KLSAqLwotTGlzdCBnZXRTZXNzaW9uQmVhbnMoKSA7Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBFSkIgSkFSIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBFSkIgMS4xIGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotYm9vbGVhbiBpc1ZlcnNpb24xXzFEZXNjcmlwdG9yKCkgOwotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgRUpCIEpBUiB3YXMgcG9wdWxhdGVkIGZyb20gYW4gRUpCIDIuMCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLWJvb2xlYW4gaXNWZXJzaW9uMl8wRGVzY3JpcHRvcigpIDsKLS8qKgotICogUmVuYW1lIHRoZSBzZWN1cml0eSByb2xlIGNvbnRhaW5lZCBpbiB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvcjsgZm9yIGVhY2ggZW50ZXJwcmlzZSBiZWFuLCBmaXggdGhlIHJvbGUtbGluayBvbiBhbnkgY29udGFpbmVkIHJvbGUKLSAqIHJlZnMKLSAqIEBwYXJhbSBleGlzdGluZ1JvbGVOYW1lIHRoZSBvbGQgbmFtZSBvZiB0aGUgU2VjdXJpdHkgUm9sZQotICogQHBhcmFtIG5ld1JvbGVOYW1lIHRoZSBuZXcgbmFtZSBvZiB0aGUgU2VjdXJpdHkgUm9sZQotICovCi1wdWJsaWMgdm9pZCByZW5hbWVTZWN1cml0eVJvbGUoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSk7Ci0JLyoqCi0JICpUaGlzIHJldHVybnMgdGhlIGoyZWUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBqMmVlIGxldmVsCi0JICpAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIHdoaWxlIGdldHRpbmcgdGhlIHZlcnNpb24KLQkgKkByZXR1cm4gdGhlIGoyZWUgdmVyc2lvbiBvZiB0aGUgRW50ZXJwcmlzZSBCZWFuIGluIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEVqYkNsaWVudEphciBhdHRyaWJ1dGUKLQkgKiBUaGUgb3B0aW9uYWwgZWpiLWNsaWVudC1qYXIgZWxlbWVudCBzcGVjaWZpZXMgYSBKQVIgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZQotCSAqIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYSBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4KLQkgKiB0aGUgZWpiLWphciBmaWxlLiBUaGUgRGVwbG95ZXIgc2hvdWxkIG1ha2UgdGhlIGVqYi1jbGllbnQgSkFSIGZpbGUgYWNjZXNzaWJsZQotCSAqIHRvIHRoZSBjbGllbnQncyBjbGFzcy1sb2FkZXIuIAotCSAqIEV4YW1wbGU6PGVqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcjwvL2VqYi1jbGllbnQtamFyPgotCi0JICovCi0JU3RyaW5nIGdldEVqYkNsaWVudEphcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEVqYkNsaWVudEphciBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEVqYkNsaWVudEphcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogVGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQotCSAqICAgICBFSkIgc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSBpbnN0YW5jZSBkb2N1bWVudCBtdXN0Ci0JICogICAgIGNvbXBseSB3aXRoLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95bWVudCB0b29scwotCSAqICAgICB0byB2YWxpZGF0ZSBhIHBhcnRpY3VsYXIgRUpCIERlcGxveW1lbnQKLQkgKiAgICAgRGVzY3JpcHRvciB3aXRoIHJlc3BlY3QgdG8gYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBFSkIKLQkgKiAgICAgc2NoZW1hLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEVKQkphcl9WZXJzaW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuICBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2hpbGUgZ2V0dGluZyB0aGUgc3BlYyB2ZXJzaW9uIG9mIHRoZSBiZWFuIAotCSAqIEByZXR1cm4gdGhlIHNwZWMgdmVyc2lvbiBvZiB0aGUgRW50ZXJwcmlzZUJlYW4sIDExLCAyMCwgMjEgCi0JICovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIDsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgQXNzZW1ibHlEZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCUFzc2VtYmx5RGVzY3JpcHRvciBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBBc3NlbWJseURlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRW50ZXJwcmlzZUJlYW5zIHJlZmVyZW5jZXMKLQkgKiBUaGUgZW50ZXJwcmlzZS1iZWFucyBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2Ygb25lIG9yIG1vcmUKLQkgKiBlbnRlcnByaXNlIGJlYW5zLgotCSAqLwotCUVMaXN0IGdldEVudGVycHJpc2VCZWFucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgUmVsYXRpb25zaGlwTGlzdCByZWZlcmVuY2UKLQkgKiBUaGUgcmVsYXRpb25zaGlwcyBjb2xsZWN0aW9uIGRlc2NyaWJlcyB0aGUgcmVsYXRpb25zaGlwcyBpbiB3aGljaCBjb250YWluZXIKLQkgKiBtYW5hZ2VkIHBlcnNpc3RlbmNlIGVudGl0eSBiZWFucyBhbmQgZGVwZW5kZW50IG9iamVjdHMgcGFydGljaXBhdGUuIFRoZQotCSAqIHJlbGF0aW9uc2hpcHMgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYSBsaXN0IG9mCi0JICogZWpiLWVudGl0eS1yZWYgZWxlbWVudHMgKHJlZmVyZW5jZXMgdG8gZW50aXR5IGJlYW5zIHRoYXQgcGFydGljaXBhdGUgaW4KLQkgKiBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzIGJ1dCB3aG9zZSBhYnN0cmFjdCBwZXJzaXN0ZW5jZSBzY2hlbWFzIGFyZSBub3QKLQkgKiBpbmNsdWRlZCBpbiB0aGUgZWpiLWphciBmaWxlKTsKLQkgKiBhbmQgYSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQKLQkgKiByZWxhdGlvbnNoaXBzLgotCSAqLwotCVJlbGF0aW9uc2hpcHMgZ2V0UmVsYXRpb25zaGlwTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJlbGF0aW9uc2hpcExpc3QgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRSZWxhdGlvbnNoaXBMaXN0KFJlbGF0aW9uc2hpcHMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBFSkJSZWxhdGlvbnNoaXBSb2xlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyA8Y29kZT5hUm9sZU5hbWU8L2NvZGU+Ci0JICogdGhhdCBoYXMgPGNvZGU+c291cmNlQ01QPC9jb2RlPiBhcyBpdHMgc291cmNlIGJlYW4uCi0JICogQHBhcmFtIGFSb2xlTmFtZSB0aGUgcm9sZSBuYW1lCi0JICogQHBhcmFtIHNvdXJjZUNNUCByZWZlcmVuY2UgdG8gQ29udGFpbmVyTWFuYWdlZEVudGl0eQotCSAqIEByZXR1cm4gYSByZWZlcmVuY2UgdG8gRUpCUmVsYXRpb25zaGlwUm9sZQotCSAqLwotCUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0UmVsYXRpb25zaGlwUm9sZShTdHJpbmcgYVJvbGVOYW1lLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IHNvdXJjZUNNUCkgOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgRUpCUmVsYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFzIDxjb2RlPmFSZWxhdGlvbk5hbWU8L2NvZGU+LgotCSAqIEBwYXJhbSBhUmVsYXRpb25OYW1lIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbgotCSAqIEByZXR1cm4gYSByZWZlcmVuY2UgdG8gRUpCUmVsYXRpb24KLQkgKi8KLQlFSkJSZWxhdGlvbiBnZXRFSkJSZWxhdGlvbihTdHJpbmcgYVJlbGF0aW9uTmFtZSkgOwotCQotCS8qKgotCSAqIFJldHVybiBhbGwgRUpCUmVsYXRpb24gb2JqZWN0cyB0aGF0IGhhdmUgYW4gRUpCUmVsYXRpb25zaGlwUm9sZSB3aXRoIGEKLQkgKiBzb3VyY2UgRUpCIG9mIDxjb2RlPmNtcDwvY29kZT4uCi0JICogQHBhcmFtIGNtcCByZWZlcmVuY2UgdG8gQ29udGFpbmVyTWFuYWdlZEVudGl0eQotCSAqIEByZXR1cm4gTGlzdCBvZiBFSkJSZWxhdGlvbgotCSAqLwotCUxpc3QgZ2V0RUpCUmVsYXRpb25zRm9yU291cmNlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0cyB0aGF0IGhhdmUgYW4gRUpCUmVsYXRpb25zaGlwUm9sZSB3aXRoIGEKLQkgKiB0eXBlIEVKQiBvZiA8Y29kZT5jbXA8L2NvZGU+LgotCSAqIEBwYXJhbSBjbXAgcmVmZXJlbmNlIHRvIENvbnRhaW5lck1hbmFnZWRFbnRpdAotCSAqIEByZXR1cm4gTGlzdCBvZiBFSkJSZWxhdGlvbnNoaXBSb2xlCi0JICovCi0JTGlzdCBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlc0ZvclR5cGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIDsKLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FSkJNZXRob2RDYXRlZ29yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQk1ldGhvZENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZDFmN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQk1ldGhvZENhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFRoZSB2YWxpZCBFSkIgbWV0aG9kIGNhdGVnb3J5IG5hbWVzIGFyZTogRUpCSE9NRU1FVEhPRCwgRUpCQ1JFQVRFTUVUSE9ELCBFSkJGSU5ERVJNRVRIT0QsIEVKQlJFTU9URU1FVEhPRC4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUpCTWV0aG9kQ2F0ZWdvcnkgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLy9FSkJNZXRob2RDYXRlZ29yeQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FSkJSZWxhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQlJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMmY0MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQlJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIGVqYi1yZWxhdGlvbiBlbGVtZW50IGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZS4gQW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgY29udGFpbnMgYSBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudDsgYW5kIGV4YWN0bHkgdHdvIHJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlcy4gVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0gKiAKLSAqIEBpbnZhcmlhbnQgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0gKiBAaW52YXJpYW50IHNlbGYucmVsYXRpb25zaGlwUm9sZXMuc2l6ZSA9PSAyCi0gKiBAaW52YXJpYW50IHNlbGYucmVsYXRpb25zaGlwUm9sZXNbMF0ubmFtZSAhPSBzZWxmLnJlbGF0aW9uc2hpcFJvbGVzWzFdLm5hbWUKLSAqIAotICogQG1pZ3JhdGlvbiBFSkIxLjEgTW92ZWQgZnJvbSBlamJleHQ6OkVqYlJlbGF0aW9uc2hpcFJvbGUgY29udGFpbmVkIHVuZGVyIGVqYmV4dDo6RUpCSmFyRXh0ZW5zaW9uCi0gKiBAbWlncmF0aW9uIEVKQjEuMSBhZGRlZCBvcHRpb25hbCBhdHRyaWJ1dGUsIGRlc2NyaXB0aW9uOlN0cmluZwotICogQG1pZ3JhdGlvbiBFSkIxLjEgYWRkZWQgb3B0aW9uYWwgYXR0cmlidXRlLCBuYW1lOlN0cmluZyAoTWF5IGhhdmUgYmVlbiBpbmhlcml0ZWQgZnJvbSBFT2JqZWN0IHByZXZpb3VzbHkpCi0gKiBAc2luY2UgMS4wIAotICogQGdlbmVyYXRlZAotICogQGV4dGVuZHMgQ29tbW9uUmVsYXRpb25zaGlwCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUpCUmVsYXRpb24gZXh0ZW5kcyBKMkVFRU9iamVjdCwgQ29tbW9uUmVsYXRpb25zaGlwIHsKLQotYm9vbGVhbiBjb250YWluc1JlbGF0aW9uc2hpcFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgOwotRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRGaXJzdFJvbGUoKSA7Ci0vKioKLSAqIFJldHVybiB0aGUgb3RoZXIgcm9sZS4KLSAqLwotCi1FSkJSZWxhdGlvbnNoaXBSb2xlIGdldE9wcG9zaXRlUm9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSA7Ci1FSkJSZWxhdGlvbnNoaXBSb2xlIGdldFNlY29uZFJvbGUoKSA7Ci0vKioKLSAqIFNldCB0aGUgZm9yd2FyZCByb2xlLgotICovCi0KLXZvaWQgc2V0Rm93YXJkKEVKQlJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyAKLQkgKiB0aGUgZWpiIHJlbGF0aW9uLgotCSAqIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyCi0JICogd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLgotCSAqIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlCi0JICogZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gSWYgc3BlY2lmaWVkLCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIKLQkgKiBmaWxlLgotCSAqIEBpbnZhcmlhbnQgc2VsZi5uYW1lIHVuaXF1ZSB3aXRoaW4gU2V0PGNvbGxlY3QoZWpiSmFyLmVqYlJlbGF0aW9ucy5uYW1lKT4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSZWxhdGlvbnNoaXBMaXN0IHJlZmVyZW5jZQotCSAqLwotCVJlbGF0aW9uc2hpcHMgZ2V0UmVsYXRpb25zaGlwTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVsYXRpb25zaGlwTGlzdCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFJlbGF0aW9uc2hpcExpc3QoUmVsYXRpb25zaGlwcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFJlbGF0aW9uc2hpcFJvbGVzIHJlZmVyZW5jZXMKLQkgKiBBIGNvbGxlY3Rpb24gY29udGFpbmluZyBleGFjdGx5IHR3byByZWxhdGlvbnNoaXAgcm9sZXMuCi0JICogCi0JICogQG1pZ3JhdGlvbiBFSkIxLjEgQ29udGFpbm1lbnQgdXNlZCB0byBiZSBieSByZWZlcmVuY2Ugb24gcmVsYXRpb24tLW5vdyBieSB2YWx1ZS4KLQotCSAqLwotCUVMaXN0IGdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRUpCUmVsYXRpb25zaGlwUm9sZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgPGNvZGU+YVJvbGVOYW1lPC9jb2RlPi4KLQkgKi8KLQlFSkJSZWxhdGlvbnNoaXBSb2xlIGdldFJlbGF0aW9uc2hpcFJvbGUoU3RyaW5nIGFSb2xlTmFtZSkgOwotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQlJlbGF0aW9uc2hpcFJvbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FSkJSZWxhdGlvbnNoaXBSb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMmM3OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQlJlbGF0aW9uc2hpcFJvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0KLS8qKgotICogVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGRlc2NyaWJlcyBhIHJvbGUgd2l0aGluIGEgcmVsYXRpb25zaGlwLgotICogVGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4gVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOyB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBjbXItZmllbGQsIGlmIGFueSwgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIGFuIGVudGl0eS1iZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMsIGJvdGggcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgbXVzdCBkZWNsYXJlIGEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjbXItZmllbGQgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUgc3BlY2lmaWVzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyB1bmlkaXJlY3Rpb25hbCBpbiBuYXZpZ2FiaWxpdHkgYW5kIHRoYXQgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBpcyAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotICogCi0gKiBAaW52YXJpYW50IG11bHRpcGxpY2l0eSAhPSBudWxsCi0gKiBAaW52YXJpYW50IHJvbGVTb3VyY2UgIT0gbnVsbAotICogQGludmFyaWFudCBDYXNjYWRlIGRlbGV0ZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgaW4gYW4gRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IGluIHdoaWNoIHRoZSByb2xlU291cmNlIGVsZW1lbnQgc3BlY2lmaWVzIGEgZGVwZW5kZW50IG9iamVjdCBjbGFzcy4gCi0gKiBAaW52YXJpYW50IENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gRUpCUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgaW4gYW4gRUpCcmVsYXRpb24gaW4gd2hpY2ggdGhlIG90aGVyIEVKQlJlbGF0aW9uc2hpcFJvbGUgZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLgotICogCi0gKiBFeGFtcGxlOgotICogPGVqYi1yZWxhdGlvbj4KLSAqICAgPGVqYi1yZWxhdGlvbi1uYW1lPlByb2R1Y3QtTGluZUl0ZW08Ly9lamItcmVsYXRpb24tbmFtZT4KLSAqICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAqICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zPC8vZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gKiAgICAgPG11bHRpcGxpY2l0eT5PbmU8Ly9tdWx0aXBsaWNpdHk+Ci0gKiAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAqICAgICAgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC8vZWpiLW5hbWU+Ci0gKiAgICAgPC8vcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICogICA8Ly9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gKiAuLi4KLSAqIEBzaW5jZSAxLjAgCi0gKiBAZ2VuZXJhdGVkCi0gKiBAZXh0ZW5kcyBDb21tb25SZWxhdGlvbnNoaXBSb2xlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUpCUmVsYXRpb25zaGlwUm9sZSBleHRlbmRzIEoyRUVFT2JqZWN0LCBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHsKLQotLyoqCi0gKiBAcmV0dXJuIFRoZSBsb2dpY2FsIG5hbWUgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIG5hbWluZyB0aGlzIHJvbGUuCi0gKiBSZXF1aXJlZCB0byBiZSB1bmlxdWUgd2l0aGluIGEgSkFSLgotICogSWYgYSBjbXItZmllbGQgaXMgZGVmaW5lZCwgdGhlbiBhIG5hbWUgaW4gdGhlIGZvcm0gJXNvdXJjZS1lamItbmFtZSVfJWNtci1maWVsZC1uYW1lJSBpcyBjb21wdXRlZC4KLSAqIE90aGVyd2lzZSBhIGRlZmF1bHQgSUQgaXMgZ2VuZXJhdGVkLgotICovCi1wdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxOYW1lKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgb3RoZXIgcm9sZS4KLSAqLwotCi1FSkJSZWxhdGlvbnNoaXBSb2xlIGdldE9wcG9zaXRlKCkgOwotLyoqCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgdGhlIHVuaXF1ZSBuYW1lIGZvciB0aGlzIHJvbGUKLSAqICovCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCk7Ci0vKioKLSAqIEByZXR1cm4gVGhlIFNvdXJjZSBlamIKLSAqIENvbXB1dGUgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBhIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIAotICovCi1wdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRTb3VyY2VFbnRpdHkoKTsKLS8qKgotKiBAcmV0dXJuIFRoZSBjb21wdXRlZCB2YWx1ZSBvZiB0aGUgaXNGb3J3YXJkIGF0dHJpYnV0ZQotKiBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHJvbGUgc2hvdWxkIGJlIG1hcHBlZCB0byBhIHBlcnNpc3RlbnQgcmVmZXJlbmNlLCBzdWNoIGFzIGEgZm9yZWlnbiBrZXkuCi0qLwotcHVibGljIGJvb2xlYW4gaXNGb3J3YXJkKCk7Ci0vKioKLSogQHJldHVybiBUaGUgY29tcHV0ZWQgdmFsdWUgaXNNYW55Ci0qIFJldHVybnMgd2hldGhlciB0aGUgdXBwZXIgbGltaXQgb2Ygb3VyIG11bHRpcGxpY2l0eSBpcyA+IDEKLSovCi1wdWJsaWMgYm9vbGVhbiBpc01hbnkoKTsKLS8qKgotKiBAcmV0dXJuIFRoZSBjb21wdXRlZCB2YWx1ZSBvZiB0aGUgaXNOYXZpZ2FibGUgYXR0cmlidXRlCi0qIFNwZWNpZmllcyB0aGF0IGFjY2Vzc29ycyBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGlzIHJlbGF0aW9uc2hpcCByb2xlLgotKi8KLXB1YmxpYyBib29sZWFuIGlzTmF2aWdhYmxlKCk7Ci0vKioKLSAqIFNldCB0aGlzIHJvbGUgdG8gYmUgdGhlIGZvcndhcmQgcm9sZS4KLSAqLwotCi12b2lkIHNldEZvd2FyZCgpIDsKLQotcHVibGljIHZvaWQgc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nIHVuaXF1ZU5hbWUpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIAotCSAqIHRoZSBlamIgcmVsYXRpb25zaGlwIHJvbGUuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIKLQkgKiB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuCi0JICogVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUKLQkgKiBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUm9sZU5hbWUgYXR0cmlidXRlCi0JICogRGVmaW5lcyBhIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQKLQkgKiByZWxhdGlvbnNoaXBzIGNhbiB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgYSByb2xlLgotCi0JICovCi0JU3RyaW5nIGdldFJvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUm9sZU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TXVsdGlwbGljaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uCi0JICogCi0JICogVGhlIG11bHRpcGxpY2l0eSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCSAqICAgICAgT25lCi0JICogICAgICBNYW55Ci0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxpY2l0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTXVsdGlwbGljaXR5S2luZAotCSAqIEBzZWUgI2lzU2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICN1bnNldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjc2V0TXVsdGlwbGljaXR5KE11bHRpcGxpY2l0eUtpbmQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX011bHRpcGxpY2l0eSgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU11bHRpcGxpY2l0eUtpbmQgZ2V0TXVsdGlwbGljaXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRNdWx0aXBsaWNpdHkgPGVtPk11bHRpcGxpY2l0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGljaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NdWx0aXBsaWNpdHlLaW5kCi0JICogQHNlZSAjaXNTZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI3Vuc2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNnZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0TXVsdGlwbGljaXR5IDxlbT5NdWx0aXBsaWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNnZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI3NldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlLaW5kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TXVsdGlwbGljaXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldE11bHRpcGxpY2l0eSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsaWNpdHk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjZ2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5S2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE11bHRpcGxpY2l0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIENhc2NhZGVEZWxldGUgYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhIHBhcnRpY3VsYXIgcmVsYXRpb25zaGlwLCB0aGUgbGlmZXRpbWUgb2Ygb25lIG9yIG1vcmUKLQkgKiBlbnRpdHkgYmVhbnMgaXMgZGVwZW5kZW50IHVwb24gdGhlIGxpZmV0aW1lIG9mIGFub3RoZXIgZW50aXR5IGJlYW4uIFRoZQotCSAqIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuIENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4KLQkgKiBFSkJSZWxhdGlvbnNoaXBSb2xlIGNvbnRhaW5lZCBpbiBhbiBFSkJyZWxhdGlvbiBpbiB3aGljaCB0aGUgb3RoZXIKLQkgKiBFSkJSZWxhdGlvbnNoaXBSb2xlIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4KLQkgKiAKLQkgKiAKLQotCSAqLwotCWJvb2xlYW4gaXNDYXNjYWRlRGVsZXRlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQ2FzY2FkZURlbGV0ZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldENhc2NhZGVEZWxldGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2lzQ2FzY2FkZURlbGV0ZSA8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENhc2NhZGVEZWxldGUoKQotCSAqIEBzZWUgI2lzQ2FzY2FkZURlbGV0ZSgpCi0JICogQHNlZSAjc2V0Q2FzY2FkZURlbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCB1bnNldENhc2NhZGVEZWxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjaXNDYXNjYWRlRGVsZXRlIDxlbT5DYXNjYWRlIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDYXNjYWRlRGVsZXRlKCkKLQkgKiBAc2VlICNpc0Nhc2NhZGVEZWxldGUoKQotCSAqIEBzZWUgI3NldENhc2NhZGVEZWxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGJvb2xlYW4gaXNTZXRDYXNjYWRlRGVsZXRlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSZWxhdGlvbnNoaXAgcmVmZXJlbmNlCi0JICovCi0JRUpCUmVsYXRpb24gZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZWxhdGlvbnNoaXAgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRSZWxhdGlvbnNoaXAoRUpCUmVsYXRpb24gdmFsdWUpOwotCi0Jdm9pZCBzZXRSZXF1aXJlZChCb29sZWFuIGlzUmVxdWlyZWQpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNvdXJjZSByZWZlcmVuY2UKLQkgKiBEZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBCi0JICogcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdW5pcXVlbHkgaWRlbnRpZmllcyBhbiBlbnRpdHkgYmVhbi4KLQkgKiBAbWlncmF0aW9uIEVKQjEuMTogd2FzIGlibWVqYmV4dDo6RWpiUmVsYXRpb25zaGlwUm9sZTo6c291cmNlRUpCTmFtZSwgYnV0IHRoYXQKLQkgKiBtYXkgbm90IGJlIHN1ZmZpY2llbnQsIGFzIHRoaXMgY2FuIG5vdyByZWZlciB0byBkZXBlbmRlbnQgY2xhc3MgbmFtZXMgb3IgZWpiCi0JICogcmVmcwotCSAqLwotCVJvbGVTb3VyY2UgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTb3VyY2UgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRTb3VyY2UoUm9sZVNvdXJjZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBDbXJGaWVsZCByZWZlcmVuY2UKLQkgKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBDTVJGaWVsZCwgaWYgYW55LCBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUKLQkgKiByZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHJvbGUgc291cmNlCi0JICogCi0JICogQG1pZ3JhdGlvbiBFSkIxLjE6IFVzZWQgdG8gYmUgaGFuZGxlZCB2aWEgaWJtZWpiZXh0OjpFamJSb2xlOjphdHRyaWJ1dGVzIGxpc3QKLQkgKi8KLQlDTVJGaWVsZCBnZXRDbXJGaWVsZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQ21yRmllbGQgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRDbXJGaWVsZChDTVJGaWVsZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyByb2xlIGlzIHBhcnQgb2YgdGhlIGtleSBvZiB0aGUgc291cmNlIEVKQi4KLQkgKi8KLQlib29sZWFuIGlzS2V5KCk7Ci0JCi0JLyoqCi0JICogVGhpcyBhbGxvd3MgeW91IHRvIHNldCB0aGUgUm9sZSBhcyBiZWluZyBrZXkgc28gaXQgd2lsbAotCSAqIG5vdCB0cmF2ZXJzZSBpdCBhdHRyaWJ1dGVzIHRvIGRldGVybWluZSBpZiBpdCBpcyBrZXkuCi0JICovCi0Jdm9pZCBzZXRLZXkoYm9vbGVhbiBhQm9vbGVhbikgOwotCQotCXZvaWQgcmVjb25jaWxlQXR0cmlidXRlcygpIDsKLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FSkJSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQlJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTFiNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQlJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQlJlc291cmNlIGV4dGVuZHMgWE1MUmVzb3VyY2UgewotCUVKQkphciBnZXRFSkJKYXIoKTsKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFJlc291cmNlIHN1cHBvcnRzIHRoZSBFSkIgMS4xIHNwZWMuCi0JICovCi0JYm9vbGVhbiBpc0VKQjFfMSgpOwotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgUmVzb3VyY2Ugc3VwcG9ydHMgdGhlIEVKQiAyLjAgc3BlYy4KLQkgKi8KLQlib29sZWFuIGlzRUpCMl8wKCk7Ci0JLyoqCi0JICogU2V0cyB0aGUgYmF0Y2hNb2RlLgotCSAqIEBwYXJhbSBiYXRjaE1vZGUgVGhlIGJhdGNoTW9kZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXRjaE1vZGUoYm9vbGVhbiBpc0JhdGNoKTsKLQkvKioKLQkgKiBHZXRzIHRoZSBiYXRjaG1vZGUgLSBmcm9tIHRoZSByZW5kZXJlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmF0Y2hNb2RlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FamJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2VkMzhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FamJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWpiRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWpiRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgTWV0aG9kRWxlbWVudCBmcm9tIHRoZSBnaXZlbiBzaWduYXR1cmUKLQkgKiBAcGFyYW0gYVNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBNZXRob2RFbGVtZW50IHJlZmVyZW5jZQotCSAqLwotCU1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudChTdHJpbmcgYVNpZ25hdHVyZSkgOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBNZXRob2RFbGVtZW50IGZyb20gdGhlIGdpdmVuIHJlZmVyZW5jZSBvZiBhIE1ldGhvZAotCSAqIEBwYXJhbSBtZXRob2QgdGhlIHJlZmVyZW5jZSBvZiBhIE1ldGhvZAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudCByZWZlcmVuY2UKLQkgKi8KLQlNZXRob2RFbGVtZW50IGNyZWF0ZU1ldGhvZEVsZW1lbnRGcm9tKE1ldGhvZCBtZXRob2QpIDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgTWV0aG9kRWxlbWVudCBmcm9tIHRoZSBnaXZlbiByZWZlcmVuY2Ugb2YgYSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QKLQkgKiBAcGFyYW0gbWV0aG9kIHJlZmVyZW5jZSBvZiBhIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudCByZWZlcmVuY2UKLQkgKi8KLQlNZXRob2RFbGVtZW50IGNyZWF0ZU1ldGhvZEVsZW1lbnRGcm9tKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QpIDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1ldGhvZFBlcm1pc3Npb24gdmFsdWUKLQkgKi8KLQlNZXRob2RQZXJtaXNzaW9uIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXNzZW1ibHlEZXNjcmlwdG9yIHZhbHVlCi0JICovCi0JQXNzZW1ibHlEZXNjcmlwdG9yIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXRob2RUcmFuc2FjdGlvbiB2YWx1ZQotCSAqLwotCU1ldGhvZFRyYW5zYWN0aW9uIGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVudGl0eSB2YWx1ZQotCSAqLwotCUVudGl0eSBjcmVhdGVFbnRpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29udGFpbmVyTWFuYWdlZEVudGl0eSB2YWx1ZQotCSAqLwotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDTVBBdHRyaWJ1dGUgdmFsdWUKLQkgKi8KLQlDTVBBdHRyaWJ1dGUgY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENNUkZpZWxkIHZhbHVlCi0JICovCi0JQ01SRmllbGQgY3JlYXRlQ01SRmllbGQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRUpCUmVsYXRpb25zaGlwUm9sZSB2YWx1ZQotCSAqLwotCUVKQlJlbGF0aW9uc2hpcFJvbGUgY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFSkJSZWxhdGlvbiB2YWx1ZQotCSAqLwotCUVKQlJlbGF0aW9uIGNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJlbGF0aW9uc2hpcHMgdmFsdWUKLQkgKi8KLQlSZWxhdGlvbnNoaXBzIGNyZWF0ZVJlbGF0aW9uc2hpcHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRUpCSmFyIHZhbHVlCi0JICovCi0JRUpCSmFyIGNyZWF0ZUVKQkphcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBSb2xlU291cmNlIHZhbHVlCi0JICovCi0JUm9sZVNvdXJjZSBjcmVhdGVSb2xlU291cmNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFF1ZXJ5IHZhbHVlCi0JICovCi0JUXVlcnkgY3JlYXRlUXVlcnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUXVlcnlNZXRob2QgdmFsdWUKLQkgKi8KLQlRdWVyeU1ldGhvZCBjcmVhdGVRdWVyeU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBY3RpdmF0aW9uQ29uZmlnIGNyZWF0ZUFjdGl2YXRpb25Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudCB2YWx1ZQotCSAqLwotCU1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFeGNsdWRlTGlzdCB2YWx1ZQotCSAqLwotCUV4Y2x1ZGVMaXN0IGNyZWF0ZUV4Y2x1ZGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlc3Npb24gdmFsdWUKLQkgKi8KLQlTZXNzaW9uIGNyZWF0ZVNlc3Npb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWVzc2FnZURyaXZlbiB2YWx1ZQotCSAqLwotCU1lc3NhZ2VEcml2ZW4gY3JlYXRlTWVzc2FnZURyaXZlbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gdmFsdWUKLQkgKi8KLQlNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVKQk1ldGhvZENhdGVnb3J5IHZhbHVlCi0JICovCi0JRUpCTWV0aG9kQ2F0ZWdvcnkgY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgbWV0aG9kIGlzIE5PVCBhcGksIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4gIAotCSAqIEVNRiBwYWNrYWdlIGNsYXNzZXMgc2hvdWxkIGJlIGFjY2VzcyB2aWEgdGhlaXIgImVJTlNUQU5DRSIgc3RhdGljIGZpZWxkcwotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWpiUGFja2FnZSBnZXRFamJQYWNrYWdlKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FamJNZXRob2RFbGVtZW50Q29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWI5ZTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FamJNZXRob2RFbGVtZW50Q29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkvKioKLQkgKiBTcGVjaWZpZXMgdGhlIEludGVyZmFjZSB0eXBlIEhPTUUKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEhPTUUgPSBNZXRob2RFbGVtZW50S2luZC5IT01FOwotCS8qKgotCSAqIFNwZWNpZmllcyB0aGUgSW50ZXJmYWNlIHR5cGUgUkVNT1RFCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBSRU1PVEUgPSBNZXRob2RFbGVtZW50S2luZC5SRU1PVEU7Ci0JLyoqCi0JICogU3BlY2lmaWVzIHRoZSBJbnRlcmZhY2UgdHlwZSBMT0NBTF9IT01FCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBMT0NBTF9IT01FID0gTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfSE9NRTsKLQkvKioKLQkgKiBTcGVjaWZpZXMgdGhlIEludGVyZmFjZSB0eXBlIExPQ0FMCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBMT0NBTCA9IE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMOwotCS8qKgotCSAqIFRoZSBJbnRlcmZhY2UgdHlwZSBpcyB1bnNwZWNpZmllZAotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgVU5TUEVDSUZJRUQgPSBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyZXMgdHdvIGFyZ3VtZW50cyBmb3Igb3JkZXIuCi0JICogQHNlZSBDb21wYXJhdG9yI2NvbXBhcmUoT2JqZWN0LCBPYmplY3QpCi0JICpAcGFyYW0gbzEgdGhlIGZpcnN0IG9iamVjdCB0byBiZSBjb21wYXJlZAotCSAqQHBhcmFtIDAyIHRoZSBzZWNvbmQgb2JqZWN0IHRvIGJlIGNvbXBhcmVkCi0JICpAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCXJldHVybiBjb21wYXJlKChNZXRob2RFbGVtZW50KSBvMSwgKE1ldGhvZEVsZW1lbnQpIG8yKTsKLQl9Ci0JLyoqCi0JICogU29ydCBieSB0eXBlIGZpcnN0IGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0JICogSG9tZSwgUmVtb3RlLCBMb2NhbEhvbWUsIExvY2FsLCBVbnNwZWNpZmllZAotCSAqIFRoZW4gYWxwaGFiZXRpY2FsbHkgb3JkZXIuCi0JICoKLQkgKiBAcGFyYW0gbWUxIHRoZSBmaXJzdCBvYmplY3QgdG8gYmUgY29tcGFyZWQKLQkgKiBAcGFyYW0gbWUyIHRoZSBzZWNvbmQgb2JqZWN0IHRvIGJlIGNvbXBhcmVkCi0JICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlcgotCSAqLwotCXByb3RlY3RlZCBpbnQgY29tcGFyZShNZXRob2RFbGVtZW50IG1lMSwgTWV0aG9kRWxlbWVudCBtZTIpIHsKLQkJaW50IHR5cGUxLCB0eXBlMjsKLQkJdHlwZTEgPSBtZTEuZ2V0VHlwZSgpLmdldFZhbHVlKCk7Ci0JCXR5cGUyID0gbWUyLmdldFR5cGUoKS5nZXRWYWx1ZSgpOwotCQlpZiAodHlwZTEgPT0gdHlwZTIpCi0JCQlyZXR1cm4gY29tcGFyZVNpZ25hdHVyZXMobWUxLCBtZTIpOwotCQlyZXR1cm4gY29tcGFyZVR5cGVzKHR5cGUxLCB0eXBlMik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHR5cGUxIHRoZSBmaXJzdCBvYmplY3QgdG8gYmUgY29tcGFyZWQKLQkgKiBAcGFyYW0gdHlwZTIgdGhlIHNlY29uZCBvYmplY3QgdG8gYmUgY29tcGFyZWQKLQkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyCi0JICovCi0JcHJvdGVjdGVkIGludCBjb21wYXJlVHlwZXMoaW50IHR5cGUxLCBpbnQgdHlwZTIpIHsKLQkJaWYgKHR5cGUxID09IEhPTUUpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmICh0eXBlMSA9PSBSRU1PVEUpIHsKLQkJCWlmICh0eXBlMiA9PSBIT01FKQotCQkJCXJldHVybiAxOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICh0eXBlMSA9PSBMT0NBTF9IT01FKSB7Ci0JCQlpZiAodHlwZTIgPT0gSE9NRSB8fCB0eXBlMiA9PSBSRU1PVEUpCi0JCQkJcmV0dXJuIDE7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKHR5cGUxID09IExPQ0FMKSB7Ci0JCQlpZiAodHlwZTIgPT0gSE9NRSB8fCB0eXBlMiA9PSBSRU1PVEUgfHwgdHlwZTIgPT0gTE9DQUxfSE9NRSkKLQkJCQlyZXR1cm4gMTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAodHlwZTEgPT0gVU5TUEVDSUZJRUQpIHsKLQkJCWlmICh0eXBlMiA9PSBIT01FIHx8IHR5cGUyID09IFJFTU9URSB8fCB0eXBlMiA9PSBMT0NBTF9IT01FIHx8IHR5cGUyID09IExPQ0FMKQotCQkJCXJldHVybiAxOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIG1lMSB0aGUgZmlyc3Qgb2JqZWN0IHRvIGJlIGNvbXBhcmVkCi0JICogQHBhcmFtIG1lMiB0aGUgc2Vjb25kIG9iamVjdCB0byBiZSBjb21wYXJlZAotCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvbXBhcmVTaWduYXR1cmVzKE1ldGhvZEVsZW1lbnQgbWUxLCBNZXRob2RFbGVtZW50IG1lMikgewotCQlTdHJpbmcgc2lnMSwgc2lnMjsKLQkJc2lnMSA9IG1lMS5nZXRTaWduYXR1cmUoKTsKLQkJc2lnMiA9IG1lMi5nZXRTaWduYXR1cmUoKTsKLQkJcmV0dXJuIHNpZzEuY29tcGFyZVRvKHNpZzIpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYk1ldGhvZEVsZW1lbnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FamJNZXRob2RFbGVtZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWIyNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYk1ldGhvZEVsZW1lbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgYmxhbmNldHQKLSAqIEBzaW5jZSAxLjAKLSAqIFVzZWQgdG8gc29ydCBhbmQgZmlsdGVyIG1ldGhvZCBlbGVtZW50IGxpc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJNZXRob2RFbGVtZW50SGVscGVyIHsKLQkvKioKLQkgKiBVc2VkIHRvIGZpbHRlciBtZXRob2RzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMX01FVEhPRFMgPSAwOwotCS8qKgotCSAqIFVzZWQgdG8gZmlsdGVyIG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT01FX01FVEhPRFMgPSAxOwotCS8qKgotCSAqIFVzZWQgdG8gZmlsdGVyIG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTUVUSE9EUyA9IDI7Ci0JLyoqCi0JICogVXNlZCB0byBmaWx0ZXIgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9URV9NRVRIT0RTID0gMzsKLQkvKioKLQkgKiBVc2VkIHRvIGZpbHRlciBtZXRob2RzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfTUVUSE9EUyA9IDQ7Ci0JLyoqCi0JICogVXNlZCB0byBmaWx0ZXIgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0hPTUVfTUVUSE9EUyA9IDU7Ci0JLyoqCi0JICogVXNlZCB0byBmaWx0ZXIgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX1JFTU9URV9NRVRIT0RTID0gNjsKLQkvKioKLQkgKiBhIE1ldGhvZEVsZW1lbnQgY29tcGFyYXRvcgotCSAqLwotCXByb3RlY3RlZCBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvciBkZWZhdWx0TUVDb21wYXJhdG9yOwotCS8qKgotCSAqIGEgTWV0aG9kRWxlbWVudCBjb21wYXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yIGRlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvcjsKLQlwcml2YXRlIHN0YXRpYyBFamJNZXRob2RFbGVtZW50SGVscGVyIHNpbmdsZXRvbjsKLQkvKioKLQkgKiBVc2VkIHRvIGZpbHRlciBtZXRob2RzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NRVRIT0RfTkFNRSA9ICIqIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9FTEVNRU5UX05BTUUgPSAiTWV0aG9kRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgaGVscGVyIGNsYXNzCi0JICovCi0JcHVibGljIEVqYk1ldGhvZEVsZW1lbnRIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBmb3IgdGhpcyBoZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYk1ldGhvZEVsZW1lbnRIZWxwZXIgc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgRWpiTWV0aG9kRWxlbWVudEhlbHBlcigpOwotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZEVsZW1lbnRzRXF1YWwoTWV0aG9kRWxlbWVudCBtZTEsIE1ldGhvZEVsZW1lbnQgbWUyKSB7Ci0JCXJldHVybiAobWUxLmdldFNpZ25hdHVyZSgpLmVxdWFscyhtZTIuZ2V0U2lnbmF0dXJlKCkpIAotCQkJCSYmIG1lMS5nZXRFbnRlcnByaXNlQmVhbigpID09IG1lMi5nZXRFbnRlcnByaXNlQmVhbigpIAotCQkJCSYmIG1lMS5nZXRNZXRob2RQYXJhbXMoKS5lcXVhbHMobWUyLmdldE1ldGhvZFBhcmFtcygpKSAKLQkJCQkmJiBtZTEuZ2V0VHlwZSgpID09IG1lMi5nZXRUeXBlKCkpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZEVsZW1lbnRpbkxpc3QoTGlzdCBtZUxpc3QsIE9iamVjdCBtZSkgewotCQlpZiAoISAobWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChtZUxpc3QuZ2V0KGkpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBtZUxpc3QuZ2V0KGkpOwotCQkJCWlmIChpc01ldGhvZEVsZW1lbnRzRXF1YWwoZWxlbWVudCwgKE1ldGhvZEVsZW1lbnQpbWUpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gYSBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvcgotCSAqLwotCXByb3RlY3RlZCBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvciBnZXREZWZhdWx0TUVDb21wYXJhdG9yKCkgewotCQlpZiAoZGVmYXVsdE1FQ29tcGFyYXRvciA9PSBudWxsKQotCQkJZGVmYXVsdE1FQ29tcGFyYXRvciA9IG5ldyBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvcigpOwotCQlyZXR1cm4gZGVmYXVsdE1FQ29tcGFyYXRvcjsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBhIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yIGdldERlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvcigpIHsKLQkJaWYgKGRlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvciA9PSBudWxsKQotCQkJZGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yID0gbmV3IEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCk7Ci0JCXJldHVybiBkZWZhdWx0TWV0aG9kRWxlbWVudENvbXBhcmF0b3I7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcGFyYW0gc29tZVF1ZXJpZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleGNsdWRlUXVlcnlNZXRob2RzKExpc3QgcmVzdWx0LCBMaXN0IHNvbWVRdWVyaWVzKSB7Ci0JCWlmIChzb21lUXVlcmllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWludCBzaXplID0gc29tZVF1ZXJpZXMuc2l6ZSgpOwotCQlMaXN0IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlRdWVyeSBxdWVyeSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlxdWVyeSA9IChRdWVyeSkgc29tZVF1ZXJpZXMuZ2V0KGkpOwotCQkJbWV0aG9kcy5hZGQocXVlcnkuZ2V0UXVlcnlNZXRob2QoKSk7Ci0JCX0KLQkJZXhjbHVkZU1ldGhvZEVsZW1lbnRzKHJlc3VsdCwgbWV0aG9kcyk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBjbXAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlNZXRob2RzRXhjbHVkaW5nRXhpc3RpbmcoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYgKGNtcCA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3QgcmVzdWx0ID0gY21wLmdldEF2YWlsYWJsZVNlbGVjdFF1ZXJ5TWV0aG9kcygpOwotCQlMaXN0IGV4aXN0aW5nID0gY21wLmdldFF1ZXJpZXMoKTsKLQkJZXhjbHVkZVF1ZXJ5TWV0aG9kcyhyZXN1bHQsIGV4aXN0aW5nKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogVXNlZCB0byByZXR1cm4gZmluZGVyIG1ldGhvZHMgd2l0aCBmaWx0ZXIKLQkgKiBAcGFyYW0gY21wIGJlYW4gdG8gZXhjbHVkZQotCSAqIEByZXR1cm4gbGlzdCBvZiBtZXRob2QgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVGaW5kUXVlcnlNZXRob2RzRXhjbHVkaW5nRXhpc3RpbmcoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYgKGNtcCA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3QgcmVzdWx0ID0gY21wLmdldEF2YWlsYWJsZUZpbmRRdWVyeU1ldGhvZHMoKTsKLQkJTGlzdCBleGlzdGluZyA9IGNtcC5nZXRRdWVyaWVzKCk7Ci0JCWV4Y2x1ZGVRdWVyeU1ldGhvZHMocmVzdWx0LCBleGlzdGluZyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gYmVhbiB1c2VkIHRvIHNlYXJjaAotCSAqIEByZXR1cm4gbGlzdCBvZiBtZXRob2QgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeGlzdGluZ09yQXZhaWxhYmxlVHJhbnNhY3Rpb25NZXRob2RFbGVtZW50cyhFT2JqZWN0IG9iamVjdCwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChnZXRBdmFpbGFibGVNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzRXhjbHVkaW5nRXhpc3RpbmcoYmVhbikpOwotCQl1bmlvbk1ldGhvZEVsZW1lbnRzKHJlc3VsdCwgZ2V0RXhpc3RpbmdNZXRob2RFbGVtZW50cyhvYmplY3QsIGJlYW4pKTsKLQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHQsIGdldERlZmF1bHRNRUNvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSByZWZPYmplY3QKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ01ldGhvZEVsZW1lbnRzKEVPYmplY3QgcmVmT2JqZWN0LCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChyZWZPYmplY3QgIT0gbnVsbCkgewotCQkJRWpiUGFja2FnZSBwYWNrID0gZ2V0RWpiUGFja2FnZSgpOwotCQkJaWYgKHJlZk9iamVjdC5lQ2xhc3MoKSA9PSBwYWNrLmdldE1ldGhvZFRyYW5zYWN0aW9uKCkpCi0JCQkJcmV0dXJuICgoTWV0aG9kVHJhbnNhY3Rpb24pIHJlZk9iamVjdCkuZ2V0TWV0aG9kRWxlbWVudHMoYmVhbik7Ci0JCQlpZiAocmVmT2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0TWV0aG9kUGVybWlzc2lvbigpKQotCQkJCXJldHVybiAoKE1ldGhvZFBlcm1pc3Npb24pIHJlZk9iamVjdCkuZ2V0TWV0aG9kRWxlbWVudHMoYmVhbik7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2VNZXRob2RFbGVtZW50cwotCSAqIEBwYXJhbSBhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmlvbk1ldGhvZEVsZW1lbnRzKExpc3Qgc291cmNlTWV0aG9kRWxlbWVudHMsIExpc3QgYWRkaXRpb25hbE1ldGhvZEVsZW1lbnRzKSB7Ci0JCU1ldGhvZEVsZW1lbnQgc291cmNlTUUsIGFkZGl0aW9uYWxNRTsKLQkJaW50IHNvdXJjZVNpemUsIGFkZFNpemU7Ci0JCXNvdXJjZVNpemUgPSBzb3VyY2VNZXRob2RFbGVtZW50cy5zaXplKCk7Ci0JCWFkZFNpemUgPSBhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMuc2l6ZSgpOwotCQlMaXN0IGZvdW5kRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KGFkZFNpemUpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkU2l6ZTsgaSsrKSB7Ci0JCQlmb3VuZCA9IGZhbHNlOwotCQkJYWRkaXRpb25hbE1FID0gKE1ldGhvZEVsZW1lbnQpIGFkZGl0aW9uYWxNZXRob2RFbGVtZW50cy5nZXQoaSk7Ci0JCQlzb3VyY2VNRSA9IG51bGw7Ci0JCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgc291cmNlU2l6ZTsgaWkrKykgewotCQkJCXNvdXJjZU1FID0gKE1ldGhvZEVsZW1lbnQpIHNvdXJjZU1ldGhvZEVsZW1lbnRzLmdldChpaSk7Ci0JCQkJaWYgKHNvdXJjZU1FLmlzRXF1aXZhbGVudChhZGRpdGlvbmFsTUUpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKQotCQkJCWZvdW5kRWxlbWVudHMuYWRkKHNvdXJjZU1FKTsKLQkJfQotCQlzb3VyY2VNZXRob2RFbGVtZW50cy5yZW1vdmVBbGwoZm91bmRFbGVtZW50cyk7Ci0JCXNvdXJjZU1ldGhvZEVsZW1lbnRzLmFkZEFsbChhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzRXhjbHVkaW5nRXhpc3RpbmcoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWx0ZXJlZE1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChiZWFuLmlzRW50aXR5KCkpIHsKLQkJCWlmIChiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpICE9IG51bGwpIHsKLQkJCQlmaWx0ZXJlZE1ldGhvZHMgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpLmdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIGdldEVudGl0eU1ldGhvZFRyYW5zYWN0aW9uRXhjbHVkZWRNZXRob2RzKChFbnRpdHkpIGJlYW4sIFJFTU9URV9NRVRIT0RTKSk7Ci0JCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVNZXRob2RFbGVtZW50cyhnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyhmaWx0ZXJlZE1ldGhvZHMpLCBNZXRob2RFbGVtZW50S2luZC5SRU1PVEVfTElURVJBTCwgYmVhbikpOwotCQkJfQotCQkJaWYgKGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpICE9IG51bGwpIHsKLQkJCQlmaWx0ZXJlZE1ldGhvZHMgPSBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKS5nZXRNZXRob2RzRXh0ZW5kZWRXaXRoRmlsdGVycyhDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBnZXRFbnRpdHlNZXRob2RUcmFuc2FjdGlvbkV4Y2x1ZGVkTWV0aG9kcygoRW50aXR5KSBiZWFuLCBIT01FX01FVEhPRFMpKTsKLQkJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU1ldGhvZEVsZW1lbnRzKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGZpbHRlcmVkTWV0aG9kcyksIE1ldGhvZEVsZW1lbnRLaW5kLkhPTUVfTElURVJBTCwgYmVhbikpOwotCQkJfQotCQkJaWYgKGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSAhPSBudWxsKSB7Ci0JCQkJZmlsdGVyZWRNZXRob2RzID0gYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpLmdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIGdldEVudGl0eU1ldGhvZFRyYW5zYWN0aW9uRXhjbHVkZWRNZXRob2RzKChFbnRpdHkpIGJlYW4sIExPQ0FMX01FVEhPRFMpKTsKLQkJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU1ldGhvZEVsZW1lbnRzKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGZpbHRlcmVkTWV0aG9kcyksIE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0xJVEVSQUwsIGJlYW4pKTsKLQkJCX0KLQkJCWlmIChiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpICE9IG51bGwpCi0JCQkJcmVzdWx0LmFkZEFsbChiZWFuLmdldEF2YWlsYWJsZUxvY2FsSG9tZU1ldGhvZEVsZW1lbnRzKCkpOwotCQkJcmVzdWx0LmFkZEFsbChiZWFuLmdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudHMoKSk7Ci0JCX0gZWxzZSBpZiAoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJaWYgKGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkgIT0gbnVsbCkgewotCQkJCWZpbHRlcmVkTWV0aG9kcyA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkuZ2V0TWV0aG9kc0V4dGVuZGVkV2l0aEZpbHRlcnMoZ2V0U2Vzc2lvbk1ldGhvZFRyYW5zYWN0aW9uRXhjbHVkZWRDbGFzc2VzKChTZXNzaW9uKSBiZWFuLCBSRU1PVEVfTUVUSE9EUyksIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCQkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTWV0aG9kRWxlbWVudHMoZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoZmlsdGVyZWRNZXRob2RzKSwgTWV0aG9kRWxlbWVudEtpbmQuUkVNT1RFX0xJVEVSQUwsIGJlYW4pKTsKLQkJCX0KLQkJCWlmIChiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkgIT0gbnVsbCkgewotCQkJCWZpbHRlcmVkTWV0aG9kcyA9IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKS5nZXRNZXRob2RzRXh0ZW5kZWRXaXRoRmlsdGVycyhnZXRTZXNzaW9uTWV0aG9kVHJhbnNhY3Rpb25FeGNsdWRlZENsYXNzZXMoKFNlc3Npb24pIGJlYW4sIExPQ0FMX01FVEhPRFMpLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU1ldGhvZEVsZW1lbnRzKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGZpbHRlcmVkTWV0aG9kcyksIE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0xJVEVSQUwsIGJlYW4pKTsKLQkJCX0KLQkJCXJlc3VsdC5hZGQoYmVhbi5nZXRBdmFpbGFibGVVbnNwZWNpZmllZE1ldGhvZEVsZW1lbnRzKCkuZ2V0KDApKTsKLQkJfSBlbHNlIGlmIChiZWFuLmlzTWVzc2FnZURyaXZlbigpKSB7Ci0JCQlmaWx0ZXJlZE1ldGhvZHMgPSBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXtnZXRNZXRob2QoYmVhbi5nZXRFamJDbGFzcygpLCBnZXRNREJNZXRob2RfU2lnKCkpfSk7Ci0JCQlyZXN1bHQuYWRkQWxsKGJlYW4uY3JlYXRlTWV0aG9kRWxlbWVudHMoZmlsdGVyZWRNZXRob2RzLCBiZWFuLmdldEVqYkNsYXNzKCkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyhMaXN0IG1ldGhvZHMpIHsKLQkJTGlzdCBzaWduYXR1cmVzLCBzYW1lTmFtZXM7Ci0JCXNhbWVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2lnbmF0dXJlcyA9IG5ldyBBcnJheUxpc3QobWV0aG9kcy5zaXplKCkgKyAxKTsKLQkJc2lnbmF0dXJlcy5hZGQoREVGQVVMVF9NRVRIT0RfTkFNRSk7Ci0JCUl0ZXJhdG9yIGl0ID0gbWV0aG9kcy5pdGVyYXRvcigpOwotCQlNZXRob2QgYU1ldGhvZDsKLQkJU3RyaW5nIG1ldGhvZE5hbWU7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWFNZXRob2QgPSAoTWV0aG9kKSBpdC5uZXh0KCk7Ci0JCQltZXRob2ROYW1lID0gYU1ldGhvZC5nZXROYW1lKCk7Ci0JCQlpZiAoc2FtZU5hbWVzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKSB7Ci0JCQkJaWYgKCFzaWduYXR1cmVzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKQotCQkJCQlzaWduYXR1cmVzLmFkZChtZXRob2ROYW1lKTsKLQkJCX0gZWxzZQotCQkJCXNhbWVOYW1lcy5hZGQobWV0aG9kTmFtZSk7Ci0JCQlzaWduYXR1cmVzLmFkZChhTWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChzaWduYXR1cmVzKTsKLQkJcmV0dXJuIHNpZ25hdHVyZXM7Ci0JfQotCS8qKgotCSAqIENyZWF0ZSBtZXRob2QgZWxlbWVudHMgb24gRUpCCi0JICogQHBhcmFtIHNpZ25hdHVyZXMgLSBMaXN0IG9mIG1ldGhvZCBzaWdzCi0JICogQHBhcmFtIGFUeXBlIC0gVGhlIGVudW0gdHlwZQotCSAqIEBwYXJhbSBiZWFuIC0gRUpCIGJlYW4gcGFzc2VkCi0JICogQHJldHVybiBhIExpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlTWV0aG9kRWxlbWVudHMoTGlzdCBzaWduYXR1cmVzLCBFbnVtZXJhdG9yIGFUeXBlLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50cyhNRVRIT0RfRUxFTUVOVF9OQU1FLCBzaWduYXR1cmVzLCBhVHlwZSwgYmVhbik7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRWpiUGFja2FnZSBnZXRFamJQYWNrYWdlKCkgewotCQlyZXR1cm4gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLQkJcmV0dXJuICgoRWpiUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSkuZ2V0RWpiRmFjdG9yeSgpOwotCX0KLQkvKioKLQkgKiBDcmVhdGUgbWV0aG9kIGVsZW1lbnRzIHdpdGggTUUgdHlwZSBuYW1lCi0JICogQHBhcmFtIG1lVHlwZU5hbWUgVGhlIE1FIHR5cGUKLQkgKiBAcGFyYW0gc2lnbmF0dXJlcyBsaXN0IG9mIG1ldGhvZCBzaWduYXR1cmVzCi0JICogQHBhcmFtIGFUeXBlIC0gZW51bSB0eXBlCi0JICogQHBhcmFtIGJlYW4gLSBFSkIgYmVhbgotCSAqIEByZXR1cm4gTGlzdCBvZiBjcmVhdGVkIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlTWV0aG9kRWxlbWVudHMoU3RyaW5nIG1lVHlwZU5hbWUsIExpc3Qgc2lnbmF0dXJlcywgRW51bWVyYXRvciBhVHlwZSwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpbnQgc2l6ZSA9IHNpZ25hdHVyZXMuc2l6ZSgpOwotCQlMaXN0IG1ldGhvZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJU3RyaW5nIHNpZ25hdHVyZTsKLQkJTWV0aG9kRWxlbWVudCBtZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXNpZ25hdHVyZSA9IChTdHJpbmcpIHNpZ25hdHVyZXMuZ2V0KGkpOwotCQkJbWUgPSAoTWV0aG9kRWxlbWVudCkgZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZSgoRUNsYXNzKSBnZXRFamJQYWNrYWdlKCkuZ2V0RUNsYXNzaWZpZXIobWVUeXBlTmFtZSkpOwotCQkJbWUuaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoc2lnbmF0dXJlKTsKLQkJCW1lLnNldEVudGVycHJpc2VCZWFuKGJlYW4pOwotCQkJbWUuc2V0VHlwZSgoTWV0aG9kRWxlbWVudEtpbmQpIGFUeXBlKTsKLQkJCW1ldGhvZEVsZW1lbnRzLmFkZChtZSk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRzOwotCX0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiBNVEUncyBleGNsdWRpbmcgYmVhbgotCSAqIEBwYXJhbSBlbnRpdHkgLSBleGNsdWRlZCBiZWFuCi0JICogQHBhcmFtIHR5cGUgLSBmaWx0ZXIgb24gbWV0aG9kIHR5cGUgY29uc3RhbnRzCi0JICogQHJldHVybiBMaXN0IG9mIG1ldGhvZCBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEVudGl0eU1ldGhvZFRyYW5zYWN0aW9uRXhjbHVkZWRNZXRob2RzKEVudGl0eSBlbnRpdHksIGludCB0eXBlKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgKFJFTU9URV9NRVRIT0RTKSA6Ci0JCQkJewotCQkJCQlKYXZhQ2xhc3MgYUNsYXNzID0gZ2V0RUpCT2JqZWN0Q2xhc3MoZW50aXR5KTsKLQkJCQkJYUNsYXNzLmdldENsYXNzSW1wb3J0KCk7Ci0JCQkJCXJlc3VsdC5hZGRBbGwoZXhjbHVkZU1ldGhvZHMoYUNsYXNzLCBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXtnZXRNZXRob2QoYUNsYXNzLCBnZXRSZW1vdGVSZW1vdmVNZXRob2RfU2lnKCkpfSkpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJY2FzZSAoSE9NRV9NRVRIT0RTKSA6Ci0JCQkJewotCQkJCQlKYXZhQ2xhc3MgYUNsYXNzID0gZ2V0RUpCSG9tZUNsYXNzKGVudGl0eSk7Ci0JCQkJCWFDbGFzcy5nZXRDbGFzc0ltcG9ydCgpOwotCQkJCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtde2dldE1ldGhvZChhQ2xhc3MsIGdldEVqYkdldE1ldGFEYXRhTWV0aG9kX1NpZygpKSwgZ2V0TWV0aG9kKGFDbGFzcywgZ2V0RWpiR2V0SG9tZUhhbmRsZU1ldGhvZF9TaWcoKSl9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCWNhc2UgKExPQ0FMX01FVEhPRFMpIDoKLQkJCQl7Ci0JCQkJCUphdmFDbGFzcyBhQ2xhc3MgPSBnZXRFSkJMb2NhbE9iamVjdENsYXNzKGVudGl0eSk7Ci0JCQkJCWFDbGFzcy5nZXRDbGFzc0ltcG9ydCgpOwotCQkJCQlyZXN1bHQuYWRkQWxsKGV4Y2x1ZGVNZXRob2RzKGFDbGFzcywgQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117Z2V0TWV0aG9kKGFDbGFzcywgZ2V0TG9jYWxSZW1vdmVNZXRob2RfU2lnKCkpfSkpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEdldCBTZXNzaW9uIE1FIGxpc3QgZXhjbHVzaW5nIHNlc3Npb24gYmVhbnMKLQkgKiBAcGFyYW0gc2Vzc2lvbiAtIGV4Y2x1ZG5nIGJlYW5zCi0JICogQHBhcmFtIHR5cGUgLSBJbnRlcmZhY2UgdHlwZQotCSAqIEByZXR1cm4gLSBsaXN0IG9mIE1FJ3MKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZXNzaW9uTWV0aG9kVHJhbnNhY3Rpb25FeGNsdWRlZENsYXNzZXMoU2Vzc2lvbiBzZXNzaW9uLCBpbnQgdHlwZSkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0W10gYWxsSW50ZXJmYWNlczsKLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIChSRU1PVEVfTUVUSE9EUykgOgotCQkJCXsKLQkJCQkJY2xhc3NOYW1lID0gZ2V0RUpCT2JqZWN0Q2xhc3NOYW1lKCk7Ci0JCQkJCWFsbEludGVyZmFjZXMgPSBzZXNzaW9uLmdldFJlbW90ZUludGVyZmFjZSgpLmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkudG9BcnJheSgpOwotCQkJCQlyZXN1bHQuYWRkQWxsKGdldEludGVyZmFjZXMoYWxsSW50ZXJmYWNlcywgY2xhc3NOYW1lKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCWNhc2UgKExPQ0FMX01FVEhPRFMpIDoKLQkJCQl7Ci0JCQkJCWNsYXNzTmFtZSA9IGdldEVKQkxvY2FsT2JqZWN0Q2xhc3NOYW1lKCk7Ci0JCQkJCWFsbEludGVyZmFjZXMgPSBzZXNzaW9uLmdldExvY2FsSW50ZXJmYWNlKCkuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS50b0FycmF5KCk7Ci0JCQkJCXJlc3VsdC5hZGRBbGwoZ2V0SW50ZXJmYWNlcyhhbGxJbnRlcmZhY2VzLCBjbGFzc05hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBhQ2xhc3MKLQkgKiBAcGFyYW0gbWV0aG9kcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBleGNsdWRlTWV0aG9kcyhKYXZhQ2xhc3MgYUNsYXNzLCBMaXN0IG1ldGhvZHMpIHsKLQkJTGlzdCBjdXJyZW50TWV0aG9kcyA9IGFDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCUxpc3QgcmVzdWx0TWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50TWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJaWYgKCFtZXRob2RzLmNvbnRhaW5zKGN1cnJlbnRNZXRob2RzLmdldChpKSkpCi0JCQkJcmVzdWx0TWV0aG9kcy5hZGQoY3VycmVudE1ldGhvZHMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0TWV0aG9kczsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGFDbGFzcwotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBNZXRob2QgZ2V0TWV0aG9kKEphdmFDbGFzcyBhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCUxpc3QgY3VycmVudE1ldGhvZHMgPSBhQ2xhc3MuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRNZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgY3VycmVudE1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG1ldGhvZE5hbWUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpCi0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIE1ldGhvZCBnZXRNZXRob2RVc2luZ01ldGhvZFNpZyhKYXZhQ2xhc3MgYUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlMaXN0IGN1cnJlbnRNZXRob2RzID0gYUNsYXNzLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50TWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIGN1cnJlbnRNZXRob2RzLmdldChpKTsKLQkJCWlmIChtZXRob2ROYW1lLmVxdWFscyhtZXRob2QuZ2V0U2lnbmF0dXJlKCkpKQotCQkJCXJldHVybiBtZXRob2Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIFVzZWQgdG8gY29sbGVjdCBtYXRjaGVkIGludGVyZmFjZXMgZm9yIGVqYnMKLQkgKiBAcGFyYW0gaW50ZXJmYWNlcyBmb3IgZmlsdGVyaW5nCi0JICogQHBhcmFtIGFFamJPYmplY3RDbGFzc05hbWUgLSB0aGUgZWpiIG5hbWUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgaW50ZXJmYWNlcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEludGVyZmFjZXMoT2JqZWN0W10gaW50ZXJmYWNlcywgU3RyaW5nIGFFamJPYmplY3RDbGFzc05hbWUpIHsKLQkJTGlzdCBleHRyYWN0ZWRJbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoKEphdmFDbGFzcykgaW50ZXJmYWNlc1tpXSkuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhhRWpiT2JqZWN0Q2xhc3NOYW1lKSkKLQkJCQlleHRyYWN0ZWRJbnRlcmZhY2VzLmFkZChpbnRlcmZhY2VzW2ldKTsKLQkJfQotCQlyZXR1cm4gZXh0cmFjdGVkSW50ZXJmYWNlczsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGVqYgotCSAqIEBwYXJhbSBzb21lTWV0aG9kRWxlbWVudE93bmVycwotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50UmVmZXJlbmNlCi0JICogQHBhcmFtIHVzYWdlRmxhZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50c0V4Y2x1ZGluZ0V4aXN0aW5nKEVudGVycHJpc2VCZWFuIGVqYiwgTGlzdCBzb21lTWV0aG9kRWxlbWVudE93bmVycywgRVJlZmVyZW5jZSBtZXRob2RFbGVtZW50UmVmZXJlbmNlLCBpbnQgdXNhZ2VGbGFnKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50c0V4Y2x1ZGluZ0V4aXN0aW5nKGVqYiwgc29tZU1ldGhvZEVsZW1lbnRPd25lcnMsIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UsIGdldERlZmF1bHRNRUNvbXBhcmF0b3IoKSwgdXNhZ2VGbGFnKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGVqYgotCSAqIEBwYXJhbSBzb21lTWV0aG9kRWxlbWVudE93bmVycwotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50UmVmZXJlbmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzRXhjbHVkaW5nRXhpc3RpbmcoRW50ZXJwcmlzZUJlYW4gZWpiLCBMaXN0IHNvbWVNZXRob2RFbGVtZW50T3duZXJzLCBFUmVmZXJlbmNlIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzRXhjbHVkaW5nRXhpc3RpbmcoZWpiLCBzb21lTWV0aG9kRWxlbWVudE93bmVycywgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSwgZ2V0RGVmYXVsdE1FQ29tcGFyYXRvcigpKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGVqYgotCSAqIEBwYXJhbSBzb21lTWV0aG9kRWxlbWVudE93bmVycwotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50UmVmZXJlbmNlCi0JICogQHBhcmFtIGNvbXBhcmF0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHNFeGNsdWRpbmdFeGlzdGluZyhFbnRlcnByaXNlQmVhbiBlamIsIExpc3Qgc29tZU1ldGhvZEVsZW1lbnRPd25lcnMsIEVSZWZlcmVuY2UgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSwgQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50c0V4Y2x1ZGluZ0V4aXN0aW5nKGVqYiwgc29tZU1ldGhvZEVsZW1lbnRPd25lcnMsIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UsIGNvbXBhcmF0b3IsIEFMTF9NRVRIT0RTKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNvbWVNZXRob2RFbGVtZW50T3duZXJzCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdNZXRob2RFbGVtZW50cyhMaXN0IHNvbWVNZXRob2RFbGVtZW50T3duZXJzLCBFUmVmZXJlbmNlIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UpIHsKLQkJaWYgKHNvbWVNZXRob2RFbGVtZW50T3duZXJzID09IG51bGwgfHwgc29tZU1ldGhvZEVsZW1lbnRPd25lcnMuaXNFbXB0eSgpIHx8IG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UgPT0gbnVsbCB8fCAhbWV0aG9kRWxlbWVudFJlZmVyZW5jZS5pc01hbnkoKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IHNpemUgPSBzb21lTWV0aG9kRWxlbWVudE93bmVycy5zaXplKCk7Ci0JCUVPYmplY3Qgb3duZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJb3duZXIgPSAoRU9iamVjdCkgc29tZU1ldGhvZEVsZW1lbnRPd25lcnMuZ2V0KGkpOwotCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb3duZXIuZUdldChtZXRob2RFbGVtZW50UmVmZXJlbmNlKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGVqYgotCSAqIEBwYXJhbSBzb21lTWV0aG9kRWxlbWVudE93bmVycwotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50UmVmZXJlbmNlCi0JICogQHBhcmFtIGNvbXBhcmF0b3IKLQkgKiBAcGFyYW0gdXNhZ2VGbGFnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzRXhjbHVkaW5nRXhpc3RpbmcoRW50ZXJwcmlzZUJlYW4gZWpiLCBMaXN0IHNvbWVNZXRob2RFbGVtZW50T3duZXJzLCBFUmVmZXJlbmNlIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UsIENvbXBhcmF0b3IgY29tcGFyYXRvciwgaW50IHVzYWdlRmxhZykgewotCQlpZiAoZWpiID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWJvb2xlYW4gc2hvd0hvbWVzID0gdXNhZ2VGbGFnID09IEFMTF9NRVRIT0RTIHx8IHVzYWdlRmxhZyA9PSBIT01FX01FVEhPRFM7Ci0JCWJvb2xlYW4gc2hvd0NsaWVudHMgPSB1c2FnZUZsYWcgPT0gQUxMX01FVEhPRFMgfHwgdXNhZ2VGbGFnID09IENMSUVOVF9NRVRIT0RTOwotCQlpZiAoc2hvd0hvbWVzKQotCQkJcmVzdWx0LmFkZEFsbChlamIuZ2V0QXZhaWxhYmxlSG9tZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlpZiAoc2hvd0NsaWVudHMpCi0JCQlyZXN1bHQuYWRkQWxsKGVqYi5nZXRBdmFpbGFibGVSZW1vdGVNZXRob2RFbGVtZW50cygpKTsKLQkJaWYgKHNob3dIb21lcykKLQkJCXJlc3VsdC5hZGRBbGwoZWpiLmdldEF2YWlsYWJsZUxvY2FsSG9tZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlpZiAoc2hvd0NsaWVudHMpCi0JCQlyZXN1bHQuYWRkQWxsKGVqYi5nZXRBdmFpbGFibGVMb2NhbE1ldGhvZEVsZW1lbnRzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGVqYi5nZXRBdmFpbGFibGVVbnNwZWNpZmllZE1ldGhvZEVsZW1lbnRzKCkpOwotCQlleGNsdWRlTWV0aG9kRWxlbWVudHMocmVzdWx0LCBnZXRFeGlzdGluZ01ldGhvZEVsZW1lbnRzKHNvbWVNZXRob2RFbGVtZW50T3duZXJzLCBtZXRob2RFbGVtZW50UmVmZXJlbmNlKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNvdXJjZU1ldGhvZEVsZW1lbnRzCi0JICogQHBhcmFtIGV4aXN0aW5nTWV0aG9kRWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleGNsdWRlTWV0aG9kRWxlbWVudHMoTGlzdCBzb3VyY2VNZXRob2RFbGVtZW50cywgTGlzdCBleGlzdGluZ01ldGhvZEVsZW1lbnRzKSB7Ci0JCU1ldGhvZEVsZW1lbnQgc291cmNlTUUsIGV4aXN0aW5nTUU7Ci0JCWludCBzb3VyY2VTaXplLCBleGlzdGluZ1NpemU7Ci0JCXNvdXJjZVNpemUgPSBzb3VyY2VNZXRob2RFbGVtZW50cy5zaXplKCk7Ci0JCWV4aXN0aW5nU2l6ZSA9IGV4aXN0aW5nTWV0aG9kRWxlbWVudHMuc2l6ZSgpOwotCQlMaXN0IGZvdW5kRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KGV4aXN0aW5nU2l6ZSk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ1NpemU7IGkrKykgewotCQkJZm91bmQgPSBmYWxzZTsKLQkJCWV4aXN0aW5nTUUgPSAoTWV0aG9kRWxlbWVudCkgZXhpc3RpbmdNZXRob2RFbGVtZW50cy5nZXQoaSk7Ci0JCQlzb3VyY2VNRSA9IG51bGw7Ci0JCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgc291cmNlU2l6ZTsgaWkrKykgewotCQkJCXNvdXJjZU1FID0gKE1ldGhvZEVsZW1lbnQpIHNvdXJjZU1ldGhvZEVsZW1lbnRzLmdldChpaSk7Ci0JCQkJaWYgKGV4aXN0aW5nTUUgIT0gbnVsbCAmJiBleGlzdGluZ01FLmdldE5hbWUoKSAhPSBudWxsICYmIHNvdXJjZU1FLmdldFNpZ25hdHVyZSgpLmVxdWFscyhleGlzdGluZ01FLmdldFNpZ25hdHVyZSgpKSAmJiBzb3VyY2VNRS5nZXRUeXBlSmF2YUNsYXNzKCkgPT0gZXhpc3RpbmdNRS5nZXRUeXBlSmF2YUNsYXNzKCkpIHsKLQkJCQkJaWYgKHNvdXJjZU1FLmdldFR5cGVKYXZhQ2xhc3MoKSAhPSBudWxsKSB7IC8vaXQgcmV0dXJucwotCQkJCQkJLy8gbnVsbCBpZiB0aGUKLQkJCQkJCS8vIG1ldGhvZCBpcyAqCi0JCQkJCQkvLyBhbmQgaXQgaXMgbm90Ci0JCQkJCQkvLyBhIG1lc3NhZ2UKLQkJCQkJCS8vIGJlYW4KLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHNvdXJjZU1FLmdldEVudGVycHJpc2VCZWFuKCkuZ2V0RWpiQ2xhc3MoKSA9PSBleGlzdGluZ01FLmdldEVudGVycHJpc2VCZWFuKCkuZ2V0RWpiQ2xhc3MoKSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZm91bmQpCi0JCQkJZm91bmRFbGVtZW50cy5hZGQoc291cmNlTUUpOwotCQl9Ci0JCXNvdXJjZU1ldGhvZEVsZW1lbnRzLnJlbW92ZUFsbChmb3VuZEVsZW1lbnRzKTsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWpiR2V0SG9tZUhhbmRsZU1ldGhvZF9TaWcoKSB7Ci0JCXJldHVybiAiUHVibGljIGFic3RyYWN0IGphdmF4LmVqYi5Ib21lSGFuZGxlIGphdmF4LmVqYi5FSkJIb21lLmdldEhvbWVIYW5kbGUoKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRFamJHZXRNZXRhRGF0YU1ldGhvZF9TaWcoKSB7Ci0JCXJldHVybiAiUHVibGljIGFic3RyYWN0IGphdmF4LmVqYi5FSkJNZXRhRGF0YSBqYXZheC5lamIuRUpCSG9tZS5nZXRFSkJNZXRhRGF0YSgpIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgU3RyaW5nIGdldFJlbW90ZVJlbW92ZU1ldGhvZF9TaWcoKSB7Ci0JCXJldHVybiAiUHVibGljIGFic3RyYWN0IHZvaWQgamF2YXguZWpiLkVKQk9iamVjdC5yZW1vdmUoKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLGphdmF4LmVqYi5SZW1vdmVFeGNlcHRpb24iOyAvL25vbi1ubHMgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRMb2NhbFJlbW92ZU1ldGhvZF9TaWcoKSB7Ci0JCXJldHVybiAiUHVibGljIGFic3RyYWN0IHZvaWQgamF2YXguZWpiLkVKQkxvY2FsT2JqZWN0LnJlbW92ZSgpIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24samF2YXguZWpiLlJlbW92ZUV4Y2VwdGlvbiI7IC8vbm9uLW5scyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgU3RyaW5nIGdldE1EQk1ldGhvZF9TaWcoKSB7Ci0JCXJldHVybiAicHVibGljIHZvaWQgb25NZXNzYWdlKGphdmF4Lmptcy5NZXNzYWdlIG1zZykiOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgU3RyaW5nIGdldEVKQk9iamVjdENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuICJqYXZheC5lamIuRUpCT2JqZWN0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRFSkJMb2NhbE9iamVjdENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuICJqYXZheC5lamIuRUpCTG9jYWxPYmplY3QiOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgSmF2YUNsYXNzIGdldEVKQk9iamVjdENsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJUmVzb3VyY2UgcmVzID0gYmVhbi5lUmVzb3VyY2UoKTsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gcmVzICE9IG51bGwgPyByZXMuZ2V0UmVzb3VyY2VTZXQoKSA6IG51bGw7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImphdmF4LmVqYiIsICJFSkJPYmplY3QiLCBzZXQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHJpdmF0ZSBKYXZhQ2xhc3MgZ2V0RUpCTG9jYWxPYmplY3RDbGFzcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCVJlc291cmNlIHJlcyA9IGJlYW4uZVJlc291cmNlKCk7Ci0JCVJlc291cmNlU2V0IHNldCA9IHJlcyAhPSBudWxsID8gcmVzLmdldFJlc291cmNlU2V0KCkgOiBudWxsOwotCQlyZXR1cm4gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJqYXZheC5lamIiLCAiRUpCTG9jYWxPYmplY3QiLCBzZXQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHJpdmF0ZSBKYXZhQ2xhc3MgZ2V0RUpCSG9tZUNsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJUmVzb3VyY2UgcmVzID0gYmVhbi5lUmVzb3VyY2UoKTsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gcmVzICE9IG51bGwgPyByZXMuZ2V0UmVzb3VyY2VTZXQoKSA6IG51bGw7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImphdmF4LmVqYiIsICJFSkJIb21lIiwgc2V0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYlBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FamJQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Nzg2N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYlBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0vKioKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKglAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWpiUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJlamIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT04gPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUiA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9UUkFOU0FDVElPTiA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTiA9IDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0lDT05TID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fRUpCX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9FTlZfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19FSkJfTE9DQUxfUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX0xPQ0FMX1JFRlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fU0VSVklDRV9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19TRVJWSUNFX1JFRlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19OQU1FID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fSE9NRV9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRSA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19FSkJfSkFSID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0lOVEVSRkFDRSA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZSBCZWFuPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWSA9IDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfX0lDT05TID0gRU5URVJQUklTRV9CRUFOX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfX0RJU1BMQVlfTkFNRVMgPSBFTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfX0RFU0NSSVBUSU9OUyA9IEVOVEVSUFJJU0VfQkVBTl9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fU01BTExfSUNPTiA9IEVOVEVSUFJJU0VfQkVBTl9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19MQVJHRV9JQ09OID0gRU5URVJQUklTRV9CRUFOX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0RFU0NSSVBUSU9OID0gRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19ESVNQTEFZX05BTUUgPSBFTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTID0gRU5URVJQUklTRV9CRUFOX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX1JFU09VUkNFX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fRUpCX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX0VKQl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX1JFU09VUkNFX0VOVl9SRUZTID0gRU5URVJQUklTRV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19FSkJfTE9DQUxfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0xPQ0FMX1JFRlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9fU0VSVklDRV9SRUZTID0gRU5URVJQUklTRV9CRUFOX19TRVJWSUNFX1JFRlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19OQU1FID0gRU5URVJQUklTRV9CRUFOX19OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0VKQl9DTEFTUyA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0hPTUVfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19IT01FX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19SRU1PVEVfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19SRU1PVEVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0VKQl9KQVIgPSBFTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fU0VDVVJJVFlfSURFTlRJVFkgPSBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0xPQ0FMX0hPTUVfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19MT0NBTF9IT01FX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19MT0NBTF9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVlbnRyYW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX19SRUVOVFJBTlQgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19QUklNQVJZX0tFWSA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9GRUFUVVJFX0NPVU5UID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWSA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0lDT05TID0gRU5USVRZX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RJU1BMQVlfTkFNRVMgPSBFTlRJVFlfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RFU0NSSVBUSU9OUyA9IEVOVElUWV9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU01BTExfSUNPTiA9IEVOVElUWV9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19MQVJHRV9JQ09OID0gRU5USVRZX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RFU0NSSVBUSU9OID0gRU5USVRZX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19ESVNQTEFZX05BTUUgPSBFTlRJVFlfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTID0gRU5USVRZX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1JFU09VUkNFX1JFRlMgPSBFTlRJVFlfX1JFU09VUkNFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRUpCX1JFRlMgPSBFTlRJVFlfX0VKQl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1JFU09VUkNFX0VOVl9SRUZTID0gRU5USVRZX19SRVNPVVJDRV9FTlZfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FSkJfTE9DQUxfUkVGUyA9IEVOVElUWV9fRUpCX0xPQ0FMX1JFRlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBFTlRJVFlfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VSVklDRV9SRUZTID0gRU5USVRZX19TRVJWSUNFX1JFRlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19OQU1FID0gRU5USVRZX19OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IEVOVElUWV9fU0VDVVJJVFlfUk9MRV9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9DTEFTUyA9IEVOVElUWV9fRUpCX0NMQVNTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0hPTUVfSU5URVJGQUNFID0gRU5USVRZX19IT01FX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19SRU1PVEVfSU5URVJGQUNFID0gRU5USVRZX19SRU1PVEVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9KQVIgPSBFTlRJVFlfX0VKQl9KQVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VDVVJJVFlfSURFTlRJVFkgPSBFTlRJVFlfX1NFQ1VSSVRZX0lERU5USVRZOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0xPQ0FMX0hPTUVfSU5URVJGQUNFID0gRU5USVRZX19MT0NBTF9IT01FX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19MT0NBTF9JTlRFUkZBQ0UgPSBFTlRJVFlfX0xPQ0FMX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVlbnRyYW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19SRUVOVFJBTlQgPSBFTlRJVFlfX1JFRU5UUkFOVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1BUllfS0VZID0gRU5USVRZX19QUklNQVJZX0tFWTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19WRVJTSU9OID0gRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0FCU1RSQUNUX1NDSEVNQV9OQU1FID0gRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BFUlNJU1RFTlRfQVRUUklCVVRFUyA9IEVOVElUWV9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19LRVlfQVRUUklCVVRFUyA9IEVOVElUWV9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTID0gRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DTVAgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0NNUF9BVFRSSUJVVEUgPSBFTlRJVFlfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbSBLZXkgRmllbGQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1fS0VZX0ZJRUxEID0gRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRhaW5lciBNYW5hZ2VkIEVudGl0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfRkVBVFVSRV9DT1VOVCA9IEVOVElUWV9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fUk9MRVMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRF9FTEVNRU5UUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQZXJtaXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QRVJNSVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1RSQU5TQUNUSU9OX19UUkFOU0FDVElPTl9BVFRSSUJVVEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1IgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1RSQU5TQUNUSU9OX19NRVRIT0RfRUxFTUVOVFMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFRyYW5zYWN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9UUkFOU0FDVElPTl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURSA9IDEwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTVJfRklFTEQgPSAxNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFID0gMTQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTiA9IDEzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRUxBVElPTlNISVBTID0gMTE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVIgPSA4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBST0xFX1NPVVJDRSA9IDE1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWSA9IDEyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9NRVRIT0QgPSAyMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlQgPSA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFWENMVURFX0xJU1QgPSAxOTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTiA9IDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX19JQ09OUyA9IEVOVEVSUFJJU0VfQkVBTl9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9fRElTUExBWV9OQU1FUyA9IEVOVEVSUFJJU0VfQkVBTl9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fX0RFU0NSSVBUSU9OUyA9IEVOVEVSUFJJU0VfQkVBTl9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX1NNQUxMX0lDT04gPSBFTlRFUlBSSVNFX0JFQU5fX1NNQUxMX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX0xBUkdFX0lDT04gPSBFTlRFUlBSSVNFX0JFQU5fX0xBUkdFX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX0RFU0NSSVBUSU9OID0gRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fRElTUExBWV9OQU1FID0gRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX0VOVklST05NRU5UX1BST1BFUlRJRVMgPSBFTlRFUlBSSVNFX0JFQU5fX0VOVklST05NRU5UX1BST1BFUlRJRVM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX1JFU09VUkNFX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX0VKQl9SRUZTID0gRU5URVJQUklTRV9CRUFOX19FSkJfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fUkVTT1VSQ0VfRU5WX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19FSkJfTE9DQUxfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0xPQ0FMX1JFRlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gRU5URVJQUklTRV9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX19TRVJWSUNFX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1NFUlZJQ0VfUkVGUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19OQU1FID0gRU5URVJQUklTRV9CRUFOX19OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19TRUNVUklUWV9ST0xFX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fRUpCX0NMQVNTID0gRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1M7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX0hPTUVfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19IT01FX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fUkVNT1RFX0lOVEVSRkFDRSA9IEVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fRUpCX0pBUiA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fU0VDVVJJVFlfSURFTlRJVFkgPSBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19MT0NBTF9IT01FX0lOVEVSRkFDRSA9IEVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX0xPQ0FMX0lOVEVSRkFDRSA9IEVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19UUkFOU0FDVElPTl9UWVBFID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19TRVNTSU9OX1RZUEUgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX19TRVJWSUNFX0VORFBPSU5UID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9GRUFUVVJFX0NPVU5UID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOID0gMTc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OID0gMTg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9NRVRIT0RfQ0FURUdPUlkgPSA3OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FSkIgTWV0aG9kIENhdGVnb3J5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9NRVRIT0RfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19JQ09OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfX0VKQl9DTElFTlRfSkFSID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX19SRUxBVElPTlNISVBfTElTVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FSkIgSmFyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fUEFSTVMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19FTlRFUlBSSVNFX0JFQU4gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX09SREVSRUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fT1JERVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19VTklRVUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19VUFBFUl9CT1VORCA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fTUFOWSA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fUkVRVUlSRUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19FVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fQ0hBTkdFQUJMRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19DSEFOR0VBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fVk9MQVRJTEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fVk9MQVRJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fVFJBTlNJRU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEVfX1RSQU5TSUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlIExpdGVyYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5zZXR0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX1VOU0VUVEFCTEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fVU5TRVRUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXJpdmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fREVSSVZFRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19ERVJJVkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDb250YWluaW5nIENsYXNzPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBDTVBfQVRUUklCVVRFX19JRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19FQVRUUklCVVRFX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9fRUFUVFJJQlVURV9UWVBFOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9BVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q01QIEF0dHJpYnV0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRUxBVElPTlNISVBTX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRUxBVElPTlNISVBTX19FSkJfSkFSID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlbGF0aW9uc2hpcHM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQU19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUVVFUllfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX19FSkJfUUwgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUVVFUllfX1JFVFVSTl9UWVBFX01BUFBJTkcgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUVVFUllfX1FVRVJZX01FVEhPRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9fRU5USVRZID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRVUVSWV9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UXVlcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OX19OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1QgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfUk9MRVMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX1JPTEVfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVKQiBSZWxhdGlvbnNoaXAgUm9sZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJPTEVfU09VUkNFX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBST0xFX1NPVVJDRV9fUk9MRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBST0xFX1NPVVJDRV9fRU5USVRZX0JFQU4gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU09VUkNFX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIFNvdXJjZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NPVVJDRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0VBTk5PVEFUSU9OUyA9IENNUF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTVJfRklFTERfX05BTUUgPSBDTVBfQVRUUklCVVRFX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19PUkRFUkVEID0gQ01QX0FUVFJJQlVURV9fT1JERVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX1VOSVFVRSA9IENNUF9BVFRSSUJVVEVfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fTE9XRVJfQk9VTkQgPSBDTVBfQVRUUklCVVRFX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fVVBQRVJfQk9VTkQgPSBDTVBfQVRUUklCVVRFX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19NQU5ZID0gQ01QX0FUVFJJQlVURV9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fUkVRVUlSRUQgPSBDTVBfQVRUUklCVVRFX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fRVRZUEUgPSBDTVBfQVRUUklCVVRFX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19DSEFOR0VBQkxFID0gQ01QX0FUVFJJQlVURV9fQ0hBTkdFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUl9GSUVMRF9fVk9MQVRJTEUgPSBDTVBfQVRUUklCVVRFX19WT0xBVElMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX1RSQU5TSUVOVCA9IENNUF9BVFRSSUJVVEVfX1RSQU5TSUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlIExpdGVyYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0RFRkFVTFRfVkFMVUVfTElURVJBTCA9IENNUF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19ERUZBVUxUX1ZBTFVFID0gQ01QX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbnNldHRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19VTlNFVFRBQkxFID0gQ01QX0FUVFJJQlVURV9fVU5TRVRUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXJpdmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19ERVJJVkVEID0gQ01QX0FUVFJJQlVURV9fREVSSVZFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQ29udGFpbmluZyBDbGFzczwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0VDT05UQUlOSU5HX0NMQVNTID0gQ01QX0FUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IENNUl9GSUVMRF9fSUQgPSBDTVBfQVRUUklCVVRFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0VBVFRSSUJVVEVfVFlQRSA9IENNUF9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTVJfRklFTERfX0RFU0NSSVBUSU9OID0gQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19ERVNDUklQVElPTlMgPSBDTVBfQVRUUklCVVRFX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19ST0xFID0gQ01QX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX19DT0xMRUNUSU9OX1RZUEUgPSBDTVBfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DTVIgRmllbGQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX0ZFQVRVUkVfQ09VTlQgPSBDTVBfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fSUNPTlMgPSBFTlRFUlBSSVNFX0JFQU5fX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19ESVNQTEFZX05BTUVTID0gRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0RFU0NSSVBUSU9OUyA9IEVOVEVSUFJJU0VfQkVBTl9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19TTUFMTF9JQ09OID0gRU5URVJQUklTRV9CRUFOX19TTUFMTF9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTEFSR0VfSUNPTiA9IEVOVEVSUFJJU0VfQkVBTl9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0RFU0NSSVBUSU9OID0gRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0RJU1BMQVlfTkFNRSA9IEVOVEVSUFJJU0VfQkVBTl9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA9IEVOVEVSUFJJU0VfQkVBTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX1JFU09VUkNFX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19FSkJfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19SRVNPVVJDRV9FTlZfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19FSkJfTE9DQUxfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0xPQ0FMX1JFRlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX1NFUlZJQ0VfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fU0VSVklDRV9SRUZTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19OQU1FID0gRU5URVJQUklTRV9CRUFOX19OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fU0VDVVJJVFlfUk9MRV9SRUZTID0gRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19FSkJfQ0xBU1MgPSBFTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0hPTUVfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19IT01FX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX1JFTU9URV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19FSkJfSkFSID0gRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fU0VDVVJJVFlfSURFTlRJVFkgPSBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTE9DQUxfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19UUkFOU0FDVElPTl9UWVBFID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9TRUxFQ1RPUiA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0FDS05PV0xFREdFX01PREUgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTElOSyA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT04gPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9ERVNUSU5BVElPTiA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdpbmcgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRSA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXNzYWdlIERyaXZlbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9GRUFUVVJFX0NPVU5UID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19TVUJTQ1JJUFRJT05fRFVSQUJJTElUWSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRHJpdmVuIERlc3RpbmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVYQ0xVREVfTElTVF9fTUVUSE9EX0VMRU1FTlRTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWENMVURFX0xJU1RfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX01FVEhPRF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9NRVRIT0RfX1BBUk1TID0gTUVUSE9EX0VMRU1FTlRfX1BBUk1TOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9NRVRIT0RfX1RZUEUgPSBNRVRIT0RfRUxFTUVOVF9fVFlQRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX19ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX19FTlRFUlBSSVNFX0JFQU4gPSBNRVRIT0RfRUxFTUVOVF9fRU5URVJQUklTRV9CRUFOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX19ERVNDUklQVElPTlMgPSBNRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX01FVEhPRF9fUVVFUlkgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UXVlcnkgTWV0aG9kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFVRVJZX01FVEhPRF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fVkFMVUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdJbXBsIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX19DT05GSUdfUFJPUEVSVElFUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRSA9IDIzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNVUxUSVBMSUNJVFlfS0lORCA9IDMxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVRVUk5fVFlQRV9NQVBQSU5HID0gMjk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX0tJTkQgPSAyNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVFJBTlNBQ1RJT05fVFlQRSA9IDI0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBQ0tOT1dMRURHRV9NT0RFID0gMjc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IERFU1RJTkFUSU9OX1RZUEUgPSAzMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFlfS0lORCA9IDI4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX1RZUEUgPSAyNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJlamIueG1pIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWpiUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1ldGhvZFBlcm1pc3Npb24gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1ldGhvZFBlcm1pc3Npb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQZXJtaXNzaW9uX1VuY2hlY2tlZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQZXJtaXNzaW9uX0Fzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQZXJtaXNzaW9uX1JvbGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQZXJtaXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBc3NlbWJseURlc2NyaXB0b3Igb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFRyYW5zYWN0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfRWpiSmFyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAc2VlICNnZXRBc3NlbWJseURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1ldGhvZFRyYW5zYWN0aW9uIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RUcmFuc2FjdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RUcmFuc2FjdGlvbl9UcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RUcmFuc2FjdGlvbl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RUcmFuc2FjdGlvbl9Bc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFRyYW5zYWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RUcmFuc2FjdGlvbl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRW50ZXJwcmlzZUJlYW4gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVudGVycHJpc2VCZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RW50ZXJwcmlzZUJlYW5fTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9TZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX0hvbWVJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX0VqYkphcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9TZWN1cml0eUlkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX0xvY2FsSG9tZUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFbnRpdHkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5I2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWVudHJhbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5I2lzUmVlbnRyYW50KCkKLQkgKiBAc2VlICNnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGl0eV9SZWVudHJhbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50aXR5X1ByaW1hcnlLZXkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9BYnN0cmFjdFNjaGVtYU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0tleUF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eSNnZXRRdWVyaWVzIDxlbT5RdWVyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5RdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHkjZ2V0UXVlcmllcygpCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9RdWVyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHkjZ2V0Q01QQXR0cmlidXRlIDxlbT5DTVAgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5DTVAgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHkjZ2V0Q01QQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0NNUEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eSNnZXRQcmltS2V5RmllbGQgPGVtPlByaW0gS2V5IEZpZWxkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJpbSBLZXkgRmllbGQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eSNnZXRQcmltS2V5RmllbGQoKQotCSAqIEBzZWUgI2dldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUHJpbUtleUZpZWxkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENNUEF0dHJpYnV0ZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0Q01QQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRDTVBBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ01SRmllbGQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENNUkZpZWxkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldENNUkZpZWxkX1JvbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRUpCUmVsYXRpb25zaGlwUm9sZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUm9sZU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9NdWx0aXBsaWNpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DYXNjYWRlRGVsZXRlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUmVsYXRpb25zaGlwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfU291cmNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFSkJSZWxhdGlvbiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RUpCUmVsYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25fRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25fTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uX1JlbGF0aW9uc2hpcFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb24jZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFSkJSZWxhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJlbGF0aW9uc2hpcHMgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFJlbGF0aW9uc2hpcHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBzX0VqYkphcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwcyNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFJlbGF0aW9uc2hpcHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVKQkphciBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RUpCSmFyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQkphcl9FamJDbGllbnRKYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphciNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0RUpCSmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJKYXJfVmVyc2lvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcExpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUm9sZVNvdXJjZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZVNvdXJjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVTb3VyY2VfUm9sZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlU291cmNlX0VudGl0eUJlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2UjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRSb2xlU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBRdWVyeSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0UXVlcnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UXVlcnlfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UXVlcnlfRWpiUUwoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UXVlcnlfUmV0dXJuVHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UXVlcnlfUXVlcnlNZXRob2QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UXVlcnlfRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnkjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UXVlcnlfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFF1ZXJ5TWV0aG9kIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRRdWVyeU1ldGhvZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRRdWVyeU1ldGhvZF9RdWVyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3RpdmF0aW9uQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0Q29uZmlnUHJvcGVydGllcyA8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0Q29uZmlnUHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZhdGlvbkNvbmZpZ19Db25maWdQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWcjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9QYXJtcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1R5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X0VudGVycHJpc2VCZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50I2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRXhjbHVkZUxpc3Qgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEV4Y2x1ZGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV4Y2x1ZGVMaXN0X01ldGhvZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkV4Y2x1ZGVMaXN0I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3QjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRFeGNsdWRlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlc3Npb24gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFNlc3Npb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbl9UcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbl9TZXNzaW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbiNnZXRTZXJ2aWNlRW5kcG9pbnQgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb24jZ2V0U2VydmljZUVuZHBvaW50KCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXNzaW9uX1NlcnZpY2VFbmRwb2ludCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXNzYWdlRHJpdmVuIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRNZXNzYWdlRHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5fVHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZVNlbGVjdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5fQWNrbm93bGVkZ2VNb2RlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5fRGVzdGluYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0QWN0aXZhdGlvbkNvbmZpZyA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldEFjdGl2YXRpb25Db25maWcoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5fQWN0aXZhdGlvbkNvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRNZXNzYWdlRGVzdGluYXRpb24gPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2VEZXN0aW5hdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRMaW5rIDxlbT5MaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldExpbmsoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5fTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRNZXNzYWdpbmdUeXBlIDxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0TWVzc2FnaW5nVHlwZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbl9UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbl9TdWJzY3JpcHRpb25EdXJhYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbl9CZWFuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVKQk1ldGhvZENhdGVnb3J5IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFSkJNZXRob2RDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE11bHRpcGxpY2l0eUtpbmQgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0TXVsdGlwbGljaXR5S2luZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBSZXR1cm5UeXBlTWFwcGluZyBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRSZXR1cm5UeXBlTWFwcGluZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50S2luZCBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRNZXRob2RFbGVtZW50S2luZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUcmFuc2FjdGlvblR5cGUgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFja25vd2xlZGdlTW9kZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRBY2tub3dsZWRnZU1vZGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRGVzdGluYXRpb25UeXBlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldERlc3RpbmF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZXNzaW9uVHlwZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRTZXNzaW9uVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRWpiRmFjdG9yeSBnZXRFamJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5Db250YWluZXJNYW5hZ2VkRW50aXR5SW1wbCA8ZW0+Q29udGFpbmVyIE1hbmFnZWQgRW50aXR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWSA9IGVJTlNUQU5DRS5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0FCU1RSQUNUX1NDSEVNQV9OQU1FID0gZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQWJzdHJhY3RTY2hlbWFOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW50IEF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTID0gZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktleSBBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0tFWV9BVFRSSUJVVEVTID0gZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfS2V5QXR0cmlidXRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTID0gZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUXVlcmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q01QIEF0dHJpYnV0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19DTVBfQVRUUklCVVRFID0gZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQ01QQXR0cmlidXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmltIEtleSBGaWVsZDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTV9LRVlfRklFTEQgPSBlSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QcmltS2V5RmllbGQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsIDxlbT5NZXRob2QgUGVybWlzc2lvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kUGVybWlzc2lvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEVSTUlTU0lPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RQZXJtaXNzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbmNoZWNrZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEID0gZUlOU1RBTkNFLmdldE1ldGhvZFBlcm1pc3Npb25fVW5jaGVja2VkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NlbWJseSBEZXNjcmlwdG9yPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldE1ldGhvZFBlcm1pc3Npb25fQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVTID0gZUlOU1RBTkNFLmdldE1ldGhvZFBlcm1pc3Npb25fUm9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRF9FTEVNRU5UUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZEVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzc2VtYmx5RGVzY3JpcHRvckltcGwgPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3NlbWJseURlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFTU0VNQkxZX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGVybWlzc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUyA9IGVJTlNUQU5DRS5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBUcmFuc2FjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9UUkFOU0FDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFRyYW5zYWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWpiIEphcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSID0gZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9FamJKYXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUyA9IGVJTlNUQU5DRS5nZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBMaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNUID0gZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TID0gZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RUcmFuc2FjdGlvbkltcGwgPGVtPk1ldGhvZCBUcmFuc2FjdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFRyYW5zYWN0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1ldGhvZFRyYW5zYWN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9UUkFOU0FDVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RUcmFuc2FjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1RSQU5TQUNUSU9OX19UUkFOU0FDVElPTl9BVFRSSUJVVEUgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fVHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RUcmFuc2FjdGlvbl9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXNzZW1ibHkgRGVzY3JpcHRvcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTID0gZUlOU1RBTkNFLmdldE1ldGhvZFRyYW5zYWN0aW9uX01ldGhvZEVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkltcGwgPGVtPlNlc3Npb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFNlc3Npb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VTU0lPTiA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9fVFJBTlNBQ1RJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uX1RyYW5zYWN0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9fU0VTU0lPTl9UWVBFID0gZUlOU1RBTkNFLmdldFNlc3Npb25fU2Vzc2lvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVNTSU9OX19TRVJWSUNFX0VORFBPSU5UID0gZUlOU1RBTkNFLmdldFNlc3Npb25fU2VydmljZUVuZHBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlJbXBsIDxlbT5FbnRpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RW50aXR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVOVElUWSA9IGVJTlNUQU5DRS5nZXRFbnRpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZW50cmFudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVOVElUWV9fUkVFTlRSQU5UID0gZUlOU1RBTkNFLmdldEVudGl0eV9SZWVudHJhbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5USVRZX19QUklNQVJZX0tFWSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlfUHJpbWFyeUtleSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRW50ZXJwcmlzZUJlYW5JbXBsIDxlbT5FbnRlcnByaXNlIEJlYW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRlcnByaXNlQmVhbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFbnRlcnByaXNlQmVhbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTlRFUlBSSVNFX0JFQU4gPSBlSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTlRFUlBSSVNFX0JFQU5fX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9TZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9FamJDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SG9tZSBJbnRlcmZhY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0hvbWVJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbW90ZSBJbnRlcmZhY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgSmFyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUiA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9FamJKYXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9JREVOVElUWSA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9TZWN1cml0eUlkZW50aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBIb21lIEludGVyZmFjZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBJbnRlcmZhY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCTWV0aG9kQ2F0ZWdvcnlJbXBsIDxlbT5FSkIgTWV0aG9kIENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCTWV0aG9kQ2F0ZWdvcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RUpCTWV0aG9kQ2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUpCX01FVEhPRF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRFSkJNZXRob2RDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCA8ZW0+RUpCIEphcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJKYXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRUpCX0pBUiA9IGVJTlNUQU5DRS5nZXRFSkJKYXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBDbGllbnQgSmFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVIgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9KQVJfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX1ZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2VtYmx5IERlc2NyaXB0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2UgQmVhbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMgPSBlSU5TVEFOQ0UuZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpb25zaGlwIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfSkFSX19SRUxBVElPTlNISVBfTElTVCA9IGVJTlNUQU5DRS5nZXRFSkJKYXJfUmVsYXRpb25zaGlwTGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kRWxlbWVudEltcGwgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fTkFNRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcm1zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX1BBUk1TID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUGFybXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2UgQmVhbjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9FTEVNRU5UX19FTlRFUlBSSVNFX0JFQU4gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9FbnRlcnByaXNlQmVhbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVBBdHRyaWJ1dGVJbXBsIDxlbT5DTVAgQXR0cmlidXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQ01QQXR0cmlidXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENNUEF0dHJpYnV0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDTVBfQVRUUklCVVRFID0gZUlOU1RBTkNFLmdldENNUEF0dHJpYnV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDTVBfQVRUUklCVVRFX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlJlbGF0aW9uc2hpcHNJbXBsIDxlbT5SZWxhdGlvbnNoaXBzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuUmVsYXRpb25zaGlwc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRSZWxhdGlvbnNoaXBzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFTEFUSU9OU0hJUFMgPSBlSU5TVEFOQ0UuZ2V0UmVsYXRpb25zaGlwcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRUxBVElPTlNISVBTX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgSmFyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFTEFUSU9OU0hJUFNfX0VKQl9KQVIgPSBlSU5TVEFOQ0UuZ2V0UmVsYXRpb25zaGlwc19FamJKYXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWxhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlMgPSBlSU5TVEFOQ0UuZ2V0UmVsYXRpb25zaGlwc19FamJSZWxhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeUltcGwgPGVtPlF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0UXVlcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUVVFUlkgPSBlSU5TVEFOQ0UuZ2V0UXVlcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUVVFUllfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFF1ZXJ5X0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUUw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBRVUVSWV9fRUpCX1FMID0gZUlOU1RBTkNFLmdldFF1ZXJ5X0VqYlFMKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gVHlwZSBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUVVFUllfX1JFVFVSTl9UWVBFX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0UXVlcnlfUmV0dXJuVHlwZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5IE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFFVRVJZX19RVUVSWV9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0UXVlcnlfUXVlcnlNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBRVUVSWV9fRU5USVRZID0gZUlOU1RBTkNFLmdldFF1ZXJ5X0VudGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBRVUVSWV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFF1ZXJ5X0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25JbXBsIDxlbT5FSkIgUmVsYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJSZWxhdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFSkJfUkVMQVRJT04gPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUxBVElPTl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWxhdGlvbnNoaXAgTGlzdDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNUID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uX1JlbGF0aW9uc2hpcExpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aW9uc2hpcCBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCA8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCUmVsYXRpb25zaGlwUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVKQl9SRUxBVElPTlNISVBfUk9MRSA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ST0xFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9Sb2xlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFkgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9NdWx0aXBsaWNpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURSA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Nhc2NhZGVEZWxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aW9uc2hpcDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUCA9IGVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9Tb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNtciBGaWVsZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEID0gZUlOU1RBTkNFLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlJvbGVTb3VyY2VJbXBsIDxlbT5Sb2xlIFNvdXJjZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlJvbGVTb3VyY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Um9sZVNvdXJjZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRSb2xlU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfU09VUkNFX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfU09VUkNFX19ST0xFID0gZUlOU1RBTkNFLmdldFJvbGVTb3VyY2VfUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IEJlYW48L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX1NPVVJDRV9fRU5USVRZX0JFQU4gPSBlSU5TVEFOQ0UuZ2V0Um9sZVNvdXJjZV9FbnRpdHlCZWFuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfU09VUkNFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNvdXJjZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkNNUkZpZWxkSW1wbCA8ZW0+Q01SIEZpZWxkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQ01SRmllbGRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q01SRmllbGQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ01SX0ZJRUxEID0gZUlOU1RBTkNFLmdldENNUkZpZWxkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENNUl9GSUVMRF9fUk9MRSA9IGVJTlNUQU5DRS5nZXRDTVJGaWVsZF9Sb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2xsZWN0aW9uIFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDTVJfRklFTERfX0NPTExFQ1RJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRDTVJGaWVsZF9Db2xsZWN0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkltcGwgPGVtPk1lc3NhZ2UgRHJpdmVuPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRHJpdmVuKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FU1NBR0VfRFJJVkVOID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RSSVZFTl9fVFJBTlNBQ1RJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuX1RyYW5zYWN0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBTZWxlY3RvcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX1NFTEVDVE9SID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZVNlbGVjdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY2tub3dsZWRnZSBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVTU0FHRV9EUklWRU5fX0FDS05PV0xFREdFX01PREUgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9BY2tub3dsZWRnZU1vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RSSVZFTl9fTElOSyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuX0xpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc3RpbmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fRGVzdGluYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fQWN0aXZhdGlvbkNvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX0RFU1RJTkFUSU9OID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdpbmcgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2luZ1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkltcGwgPGVtPk1lc3NhZ2UgRHJpdmVuIERlc3RpbmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTiA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFkgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1N1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJlYW48L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4gPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX0JlYW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkV4Y2x1ZGVMaXN0SW1wbCA8ZW0+RXhjbHVkZSBMaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRXhjbHVkZUxpc3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RXhjbHVkZUxpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhDTFVERV9MSVNUID0gZUlOU1RBTkNFLmdldEV4Y2x1ZGVMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFMgPSBlSU5TVEFOQ0UuZ2V0RXhjbHVkZUxpc3RfTWV0aG9kRWxlbWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeU1ldGhvZEltcGwgPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5TWV0aG9kSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFF1ZXJ5TWV0aG9kKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFFVRVJZX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRRdWVyeU1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UXVlcnk8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUVVFUllfTUVUSE9EX19RVUVSWSA9IGVJTlNUQU5DRS5nZXRRdWVyeU1ldGhvZF9RdWVyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdJbXBsIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVkFUSU9OX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZBVElPTl9DT05GSUdfX0NPTkZJR19QUk9QRVJUSUVTID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25Db25maWdfQ29uZmlnUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25Db25maWdfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIDxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFID0gZUlOU1RBTkNFLmdldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFRSQU5TQUNUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvblR5cGUgPGVtPlNlc3Npb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0U2Vzc2lvblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBTRVNTSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZCA8ZW0+TWV0aG9kIEVsZW1lbnQgS2luZDwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudEtpbmQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBNRVRIT0RfRUxFTUVOVF9LSU5EID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRLaW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWNrbm93bGVkZ2VNb2RlIDxlbT5BY2tub3dsZWRnZSBNb2RlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWNrbm93bGVkZ2VNb2RlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QWNrbm93bGVkZ2VNb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gQUNLTk9XTEVER0VfTU9ERSA9IGVJTlNUQU5DRS5nZXRBY2tub3dsZWRnZU1vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCA8ZW0+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHkgS2luZDwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBTVUJTQ1JJUFRJT05fRFVSQUJJTElUWV9LSU5EID0gZUlOU1RBTkNFLmdldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmV0dXJuVHlwZU1hcHBpbmcgPGVtPlJldHVybiBUeXBlIE1hcHBpbmc8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZXR1cm5UeXBlTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJldHVyblR5cGVNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gUkVUVVJOX1RZUEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRSZXR1cm5UeXBlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkRlc3RpbmF0aW9uVHlwZSA8ZW0+RGVzdGluYXRpb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkRlc3RpbmF0aW9uVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldERlc3RpbmF0aW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIERFU1RJTkFUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RGVzdGluYXRpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTXVsdGlwbGljaXR5S2luZCA8ZW0+TXVsdGlwbGljaXR5IEtpbmQ8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NdWx0aXBsaWNpdHlLaW5kCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TXVsdGlwbGljaXR5S2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIE1VTFRJUExJQ0lUWV9LSU5EID0gZUlOU1RBTkNFLmdldE11bHRpcGxpY2l0eUtpbmQoKTsKLQotCX0KLQotfSAvL0VqYlBhY2thZ2UKLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRW50ZXJwcmlzZUJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FbnRlcnByaXNlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDFkNTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FbnRlcnByaXNlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBFbnRlcnByaXNlSmF2YUJlYW4gaXMgYSBjbGFzcy4gIEl0IGNhbiBoYXZlIGluc3RhbmNlcywgc29tZW9uZSBjb3VsZCB3cml0ZSBhbiBpbnN0YW5jZSBkb2N1bWVudCBjb250YWluaW5nIERlcGFydG1lbnRzIGFuZCBFbXBsb3llZXMuICBJdCBhbHNvIGhhcyBhdHRyaWJ1dGVzLCBvcGVyYXRpb25zLCBhbmQgYXNzb2NpYXRpb25zLiAgVGhlc2UgYXJlIGFjdHVhbGx5IGRlcml2ZWQvL2ZpbHRlcmVkIGZyb20gaXRzIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuICBGb3IgbWFwcGluZyBhbmQgYnJvd3NpbmcgcHVycG9zZXMsIHRob3VnaCwgeW91IHdvdWxkIGxpa2UgdGhlIEVKQiB0byBhcHBlYXIgYXMgYSBjbGFzcy4gIAotICogCi0gKiBJbiB0aGlzIGxpZ2h0LCBldmVuIFNlc3Npb24gQmVhbnMgY2FuIGhhdmUgYXNzb2NpYXRpb25zIGFuZCBwcm9wZXJ0aWVzIGltcGxlbWVudGVkIGJ5IHRoZWlyIGJlYW4uICBGb3IgZXhhbXBsZSwgaXQgd291bGQgYmUgbWVhbmluZ2Z1bCB0byBkZXNjcmliZSBhc3NvY2lhdGlvbnMgZnJvbSBhIFNlc3Npb24gdG8gdGhlIEVudGl0aWVzIHdoaWNoIGl0IHVzZXMgdG8gcGVyZm9ybSBpdHMgd29yay4KLSAqIEBleHRlbmRzIEVOYW1lZEVsZW1lbnQKLSAqCi0gKiogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBFbnRlcnByaXNlQmVhbiBleHRlbmRzIEpORElFbnZSZWZzR3JvdXAsIEVOYW1lZEVsZW1lbnR7Ci0KLS8qKgotICogQ3JlYXRlcyBhIExpc3Qgb2YgTWV0aG9kRWxlbWVudHMgdGhhdCByZXByZXNlbnQgdGhlCi0gKiBNZXRob2RzIGZyb20gQHNvbWVNZXRob2RzIHBvaW50aW5nIHRvIHRoaXMgRUpCLiAgSXQgaXMKLSAqIGFzc3VtZWQgdGhhdCBhbGwgb2YgdGhlIG1ldGhvZHMgYmVsb25nIHRvIEBhbkludGVyZmFjZS4KLSAqLwotTGlzdCBjcmVhdGVNZXRob2RFbGVtZW50cyhMaXN0IHNvbWVNZXRob2RzLCBKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIDsKLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotICogYW5kIGFyZSBjb21tb24gdG8gYm90aCB0aGUgSG9tZSBhbmQgUmVtb3RlIGludGVyZmFjZXMuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0gKiBzb2xlbHkgZm9yIGNvbXBhcmluZyB3aXRoIGFjdHVhbCBNZXRob2RFbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1vZGVsLgotICogQGRlcHJlY2F0ZWQgdXNlZCBnZXRBdmFpbGFibGVVbnNwZWNpZmllZE1ldGhvZEVsZW1lbnRzCi0gKi8KLUxpc3QgZ2V0QXZhaWxhYmxlQ29tbW9uTWV0aG9kRWxlbWVudHMoKSA7Ci0KLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotICogYW5kIGFyZSBjb21tb24gdG8gYm90aCB0aGUgSG9tZSBhbmQgUmVtb3RlIGludGVyZmFjZXMuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0gKiBzb2xlbHkgZm9yIGNvbXBhcmluZyB3aXRoIGFjdHVhbCBNZXRob2RFbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1vZGVsLgotICovCi1MaXN0IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudHMoKSA7Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyBzaWduYXR1cmVzCi0gKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLSAqIGFuZCBhcmUgY29tbW9uIHRvIGJvdGggdGhlIEhvbWUgYW5kIFJlbW90ZSBpbnRlcmZhY2VzLgotICogQGRlcHJlY2F0ZWQgdXNlZCBnZXRBdmFpbGFibGVVbnNwZWNpZmllZE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzCi0gKi8KLUxpc3QgZ2V0QXZhaWxhYmxlQ29tbW9uTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKSA7Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyBzaWduYXR1cmVzCi0gKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLSAqIGFuZCBhcmUgY29tbW9uIHRvIGJvdGggdGhlIEhvbWUgYW5kIFJlbW90ZSBpbnRlcmZhY2VzLgotICovCi1MaXN0IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKSA7Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgTGlzdCBvZiBuZXdseSBjcmVhdGVkIE1ldGhvZEVsZW1lbnRzCi0gKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLSAqIGZvciB0aGUgSG9tZSBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0gKiBzb2xlbHkgZm9yIGNvbXBhcmluZyB3aXRoIGFjdHVhbCBNZXRob2RFbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1vZGVsLgotICovCi1MaXN0IGdldEF2YWlsYWJsZUhvbWVNZXRob2RFbGVtZW50cygpIDsKLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotICogZm9yIHRoZSBMb2NhbCBIb21lIGludGVyZmFjZS4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0gKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0gKi8KLUxpc3QgZ2V0QXZhaWxhYmxlTG9jYWxIb21lTWV0aG9kRWxlbWVudHMoKSA7Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgTGlzdCBvZiBuZXdseSBjcmVhdGVkIE1ldGhvZEVsZW1lbnRzCi0gKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLSAqIGZvciB0aGUgTG9jYWwgaW50ZXJmYWNlLiAgVGhlc2UgTWV0aG9kRWxlbWVudHMgYXJlIG5vdCBjb250YWluZWQgYW5kIHdpbGwKLSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotICogc29sZWx5IGZvciBjb21wYXJpbmcgd2l0aCBhY3R1YWwgTWV0aG9kRWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtb2RlbC4KLSAqLwotTGlzdCBnZXRBdmFpbGFibGVMb2NhbE1ldGhvZEVsZW1lbnRzKCkgOwotLyoqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotICogdGhhdCByZXByZXNlbnQgYWxsIHRoZSBwb3NzaWJsZSBNZXRob2RFbGVtZW50cyB0aGF0IGNhbiBiZSBjcmVhdGVkCi0gKiBmb3IgdGhlIFJlbW90ZSBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0gKiBzb2xlbHkgZm9yIGNvbXBhcmluZyB3aXRoIGFjdHVhbCBNZXRob2RFbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1vZGVsLgotICovCi1MaXN0IGdldEF2YWlsYWJsZVJlbW90ZU1ldGhvZEVsZW1lbnRzKCkgOwotLyoqCi0gKiBSZXR1cm4gYSBMaXN0IG9mIGFsbCBhdmFpbGFibGUgTWV0aG9kRWxlbWVudHMgZm9yIGFsbCB0eXBlcyBhcyB3ZWxsIGFzIHRoZQotICogZXhpc3RpbmcgTWV0aG9kRWxlbWVudHMgZnJvbSB0aGUgPGNvZGU+cmVmT2JqZWN0PC9jb2RlPi4gIFRoZSBwYXJhbWV0ZXIKLSAqIHdpbGwgYmUgZWl0aGVyIGEgTWV0aG9kVHJhbnNhY3Rpb24gb3IgYSBNZXRob2RQZXJtaXNzaW9uLiAgVGhlIExpc3Qgd2lsbCBiZQotICogc29ydGVkIGJhc2VkIG9uIHRoZSBwYXNzZWQgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IKLSAqLwotcHVibGljIExpc3QgZ2V0RXhpc3RpbmdPckF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKEVPYmplY3QgcmVmT2JqZWN0LCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIDsKLS8qKgotICogUmV0dXJuIGEgTGlzdCBvZiBhbGwgYXZhaWxhYmxlIE1ldGhvZEVsZW1lbnRzIGZvciBhbGwgdHlwZXMgYXMgd2VsbCBhcyB0aGUKLSAqIGV4aXN0aW5nIE1ldGhvZEVsZW1lbnRzIGZyb20gdGhlIDxjb2RlPnJlZk9iamVjdDwvY29kZT4uICBUaGUgcGFyYW1ldGVyCi0gKiB3aWxsIGJlIGVpdGhlciBhIE1ldGhvZFRyYW5zYWN0aW9uIG9yIGEgTWV0aG9kUGVybWlzc2lvbi4gIFRoZSBMaXN0IHdpbGwgYmUKLSAqIHNvcnRlZCBiYXNlZCBvbiB0aGUgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IKLSAqLwotcHVibGljIExpc3QgZ2V0RXhpc3RpbmdPckF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKEVPYmplY3QgcmVmT2JqZWN0KSA7Ci1wdWJsaWMgU3RyaW5nIGdldEVqYkNsYXNzTmFtZSgpOwotLyoqCi0gKiBSZXR1cm4gYW4gRWpiUmVmIGNvbnRhaW5lZCBieSB0aGlzIGJlYW4gd2hpY2ggaXMKLSAqIGVxdWl2YWxlbnQgdG8gQGFuRWpiUmVmLgotICovCi1FamJSZWYgZ2V0RXF1aXZhbGVudEVqYlJlZihFamJSZWYgYW5FamJSZWYpIDsKLS8qKgotICogTWV0aG9kIGdldEVxdWl2YWxlbnRFSkJMb2NhbFJlZi4KLSAqIEBwYXJhbSBhbkVqYkxvY2FsUmVmCi0gKiBAcmV0dXJuIEVKQkxvY2FsUmVmCi0gKi8KLUVKQkxvY2FsUmVmIGdldEVxdWl2YWxlbnRFSkJMb2NhbFJlZihFSkJMb2NhbFJlZiBhbkVqYkxvY2FsUmVmKTsKLQotcHVibGljIFN0cmluZyBnZXRIb21lSW50ZXJmYWNlTmFtZSgpOwotcHVibGljIE1ldGhvZFtdIGdldEhvbWVNZXRob2RzRm9yRGVwbG95bWVudCgpOwotLyoqCi0gKiBSZXR1cm4gYW4gRWpiUmVmIHRoYXQgaXMgcGh5c2ljYWxseSBsaW5rZWQgdG8gQGFuRUpCLgotICovCi1FamJSZWYgZ2V0TGlua2VkRUpCUmVmZXJlbmNlKEVudGVycHJpc2VCZWFuIGFuRUpCKSA7Ci0vKioKLSAqIFJldHVybiBhbiBFSkJMb2NhbFJlZiB0aGF0IGlzIHBoeXNpY2FsbHkgbGlua2VkIHRvIEBhbkVKQi4KLSAqLwotRUpCTG9jYWxSZWYgZ2V0TGlua2VkRUpCTG9jYWxSZWZlcmVuY2UoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIDsKLXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxIb21lSW50ZXJmYWNlTmFtZSgpOwotcHVibGljIE1ldGhvZFtdIGdldExvY2FsSG9tZU1ldGhvZHNGb3JEZXBsb3ltZW50KCk7Ci1wdWJsaWMgU3RyaW5nIGdldExvY2FsSW50ZXJmYWNlTmFtZSgpOwotcHVibGljIFN0cmluZyBnZXRSZW1vdGVJbnRlcmZhY2VOYW1lKCk7Ci1wdWJsaWMgTWV0aG9kW10gZ2V0UmVtb3RlTWV0aG9kc0ZvckRlcGxveW1lbnQoKTsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgQGFKYXZhQ2xhc3MgYXMgZXF1YWwgdG8gdGhlCi0gKiBob21lLCByZW1vdGUsIGJlYW4gY2xhc3MsIG9yIGtleSBjbGFzcy4KLSAqLwotYm9vbGVhbiBoYXNKYXZhUmVmZXJlbmNlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSA7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgZWpiIGhhcyBCZWFuTWFuYWdlZFBlcnNpc3RhbmNlLgotICovCi1ib29sZWFuIGlzQmVhbk1hbmFnZWRFbnRpdHkoKSA7Ci1wdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLXB1YmxpYyBib29sZWFuIGlzRW50aXR5KCk7Ci1wdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2VEcml2ZW4oKTsKLXB1YmxpYyBib29sZWFuIGlzU2Vzc2lvbigpOwotCi0vKioKLSAqIHJldHVybnMgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGJlYW4gaW4gdGhlIEVKQkphcgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50cwotICovCi1wdWJsaWMgaW50IGdldFZlcnNpb25JRCgpOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gVXNlIHtAbGluayAjZ2V0VmVyc2lvbklEKCl9Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfWCgpIDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIFVzZSB7QGxpbmsgI2dldFZlcnNpb25JRCgpfQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50cwotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24yX1goKSA7Ci0KLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBFSkIgaGFzIGEgbG9jYWwgaW50ZXJmYWNlIGFuZCBhIGxvY2FsIGhvbWUKLSAqIGludGVyZmFjZS4KLSAqLwotcHVibGljIGJvb2xlYW4gaGFzTG9jYWxDbGllbnQoKTsKLQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIEVKQiBoYXMgYSByZW1vdGUgaW50ZXJmYWNlIGFuZCBhIGhvbWUKLSAqIGludGVyZmFjZS4KLSAqLwotcHVibGljIGJvb2xlYW4gaGFzUmVtb3RlQ2xpZW50KCk7Ci0KLS8qKgotICogRml4IHRoZSByb2xlLWxpbmsgb24gYW55IGNvbnRhaW5lZCByb2xlIHJlZnMKLSAqLwotcHVibGljIHZvaWQgcmVTeW5jU2VjdXJpdHlSb2xlUmVmKFN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBTdHJpbmcgbmV3Um9sZU5hbWUpOwotcHVibGljIHZvaWQgc2V0RWpiQ2xhc3NOYW1lKFN0cmluZyBlamJDbGFzc05hbWUpOwotcHVibGljIHZvaWQgc2V0SG9tZUludGVyZmFjZU5hbWUoU3RyaW5nIGhvbWVJbnRlcmZhY2VOYW1lKTsKLXB1YmxpYyB2b2lkIHNldExvY2FsSG9tZUludGVyZmFjZU5hbWUoU3RyaW5nIGxvY2FsSG9tZUludGVyZmFjZU5hbWUpOwotcHVibGljIHZvaWQgc2V0TG9jYWxJbnRlcmZhY2VOYW1lKFN0cmluZyBsb2NhbEludGVyZmFjZU5hbWUpOwotcHVibGljIHZvaWQgc2V0UmVtb3RlSW50ZXJmYWNlTmFtZShTdHJpbmcgcmVtb3RlSW50ZXJmYWNlTmFtZSk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEVudGVycHJpc2VCZWFuX05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgU2VjdXJpdHlSb2xlUmVmcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRWpiQ2xhc3MgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldEVqYkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBFamJDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEVqYkNsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBIb21lSW50ZXJmYWNlIHJlZmVyZW5jZQotCSAqLwotCUphdmFDbGFzcyBnZXRIb21lSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBIb21lSW50ZXJmYWNlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0SG9tZUludGVyZmFjZShKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgUmVtb3RlSW50ZXJmYWNlIHJlZmVyZW5jZQotCSAqLwotCUphdmFDbGFzcyBnZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJlbW90ZUludGVyZmFjZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFJlbW90ZUludGVyZmFjZShKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRWpiSmFyIHJlZmVyZW5jZQotCSAqLwotCUVKQkphciBnZXRFamJKYXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEVqYkphciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEVqYkphcihFSkJKYXIgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgU2VjdXJpdHlJZGVudGl0eSByZWZlcmVuY2UKLQkgKiBUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkKLQkgKiBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3IKLQkgKiB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzIGlkZW50aXR5IGlzIHRvIGJlIHVzZWQuIEl0Ci0JICogY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLQkgKiB0byBiZSB1c2VkLgotCSAqLwotCVNlY3VyaXR5SWRlbnRpdHkgZ2V0U2VjdXJpdHlJZGVudGl0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2VjdXJpdHlJZGVudGl0eSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFNlY3VyaXR5SWRlbnRpdHkoU2VjdXJpdHlJZGVudGl0eSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBMb2NhbEhvbWVJbnRlcmZhY2UgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTG9jYWxIb21lSW50ZXJmYWNlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TG9jYWxIb21lSW50ZXJmYWNlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBMb2NhbEludGVyZmFjZSByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExvY2FsSW50ZXJmYWNlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TG9jYWxJbnRlcmZhY2UoSmF2YUNsYXNzIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VudGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE5YWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0KLS8qKgotICogVGhlIGVudGl0eSBlbGVtZW50IGRlY2xhcmVzIGFuIGVudGl0eSBiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBvcHRpb25hbCBkaXNwbGF5IG5hbWU7IG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lOyBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZTsgYSB1bmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55OyB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLCBpZiBhbnk7IHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzOyB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGU7IHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWU7IGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeTsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbjsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBhYnN0cmFjdCBzY2hlbWEgbmFtZTsgYW4gb3B0aW9uYWwgbGlzdCBvZiBjb250YWluZXItbWFuYWdlZCBmaWVsZHM7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMgZm9yIGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LgotICogVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgYW5kIGNtcC12ZXJzaW9uIDIueC4gVGhlIG9wdGlvbmFsIHByaW1rZXktZmllbGQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBUaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLSAqIFRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYgdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLSAqIFRoZSBvcHRpb25hbCBsb2NhbC1ob21lIGFuZCBsb2NhbCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgZW50aXR5IGJlYW4gaGFzIGEgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLgotICogVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGUgZW50aXR5IGJlYW4uCi0gKiBUaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIEF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYKLSAqIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLgotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBFbnRpdHkgZXh0ZW5kcyBFbnRlcnByaXNlQmVhbnsKLQotcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5TmFtZSgpOwotcHVibGljIGJvb2xlYW4gaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0KLXB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXlOYW1lKFN0cmluZyBwcmltYXJ5S2V5TmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzUmVlbnRyYW50IGF0dHJpYnV0ZQotCSAqIFRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkgYmVhbiBpcyByZWVudHJhbnQgb3Igbm90LgotCi0JICovCi0JYm9vbGVhbiBpc1JlZW50cmFudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eSNpc1JlZW50cmFudCA8ZW0+UmVlbnRyYW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWVudHJhbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVlbnRyYW50KCkKLQkgKiBAc2VlICN1bnNldFJlZW50cmFudCgpCi0JICogQHNlZSAjaXNSZWVudHJhbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZW50cmFudChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eSNpc1JlZW50cmFudCA8ZW0+UmVlbnRyYW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZWVudHJhbnQoKQotCSAqIEBzZWUgI2lzUmVlbnRyYW50KCkKLQkgKiBAc2VlICNzZXRSZWVudHJhbnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgdW5zZXRSZWVudHJhbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eSNpc1JlZW50cmFudCA8ZW0+UmVlbnRyYW50PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVlbnRyYW50PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZWVudHJhbnQoKQotCSAqIEBzZWUgI2lzUmVlbnRyYW50KCkKLQkgKiBAc2VlICNzZXRSZWVudHJhbnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGJvb2xlYW4gaXNTZXRSZWVudHJhbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFByaW1hcnlLZXkgcmVmZXJlbmNlCi0JICogVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkCi0JICogZm9yIGFuIGVudGl0eSB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiAgVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZQotCSAqIG9uZSBvZiB0aGUgZmllbGRzIGRlY2xhcmVkIGluIHRoZSBjbXAtZmllbGQKLQkgKiBlbGVtZW50LCBhbmQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkga2V5IHR5cGUuIAotCSAqIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkga2V5IG1hcHMgdG8gbXVsdGlwbGUKLQkgKiBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgKGkuZS4gdGhlIGtleSBpcyBhIGNvbXBvdW5kIGtleSkuIEluIHRoaXMgY2FzZSwgdGhlCi0JICogZmllbGRzIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIHRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCAKLQkgKiB0byB0aGUgZmllbGQgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29tcHJpc2UgdGhlIGtleS4KLQkgKiBFeGFtcGxlczo8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvL3ByaW0ta2V5LWNsYXNzPgotCSAqIAk8cHJpbS1rZXktY2xhc3M+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlSUQ8Ly9wcmltLWtleS1jbGFzcz4KLQkgKiAJPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5PYmplY3Q8Ly9wcmltLWtleS1jbGFzcz4KLQotCSAqLwotCUphdmFDbGFzcyBnZXRQcmltYXJ5S2V5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBQcmltYXJ5S2V5IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UHJpbWFyeUtleShKYXZhQ2xhc3MgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRXhjbHVkZUxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FeGNsdWRlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDUyOTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FeGNsdWRlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgZXhjbHVkZSBsaXN0IGVsZW1lbnQgZGVmaW5lcyBhIHNldCBvZiBtZXRob2RzIHdoaWNoIHRoZSBBc3NlbWJsZXIgbWFya3MgdG8gYmUgdW5jYWxsYWJsZS4gSXQgY29udGFpbnMgb25lIG9yIG1vcmUgbWV0aG9kcy4KLSAqIAotICogSWYgdGhlIG1ldGhvZCBwZXJtaXNzaW9uIHJlbGF0aW9uIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBhcmUgaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIG11c3QgY29uc2lkZXIgdGhvc2UgbWV0aG9kcyB0byBiZSB1bmNhbGxhYmxlLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBFeGNsdWRlTGlzdCBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBNZXRob2RFbGVtZW50cyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JKiBSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHRoYXQgcG9pbnQgdG8KLQkqIEBhbkVKQi4KLQkqLwotCUxpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpOwotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvSVJvbGVTaGFwZVN0cmF0ZWd5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvSVJvbGVTaGFwZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNmVkZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0lSb2xlU2hhcGVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzYvMjAwMCAxMTo0MDoxNiBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJvbGVTaGFwZVN0cmF0ZWd5IHsKLQlTdHJpbmcgQVRUUklCVVRFX05BTUVfSk9JTkVSID0gIl8iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJPTEVfR0VUX1BSRUZJWCA9ICJnZXQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJPTEVfU0VUX1BSRUZJWCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCi1ib29sZWFuIGlzRmxhdCgpOwotYm9vbGVhbiBpc1JvdW5kKCk7Ci12b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoTGlzdCByb2xlQXR0cmlidXRlcykgOwotYm9vbGVhbiB1c2VzQXR0cmlidXRlTmFtZWQoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIDsKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWVzc2FnZURyaXZlbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01lc3NhZ2VEcml2ZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0ZWNjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWVzc2FnZURyaXZlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0KLQotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlRHJpdmVuIGV4dGVuZHMgRW50ZXJwcmlzZUJlYW57Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFRyYW5zYWN0aW9uVHlwZSBhdHRyaWJ1dGUKLQkgKiBUaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyB0cmFuc2FjdGlvbgotCSAqIG1hbmFnZW1lbnQgdHlwZS4KLQkgKiAKLQkgKiBUaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiBCZWFuLCBDb250YWluZXIKLQkgKi8KLQlUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZQotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBNZXNzYWdlU2VsZWN0b3IgYXR0cmlidXRlCi0JICogVGhlIG1lc3NhZ2Utc2VsZWN0b3IgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIEpNUyBtZXNzYWdlCi0JICogc2VsZWN0b3IgdG8gYmUgdXNlZCBpbiBkZXRlcm1pbmluZyB3aGljaCBtZXNzYWdlcyBhIG1lc3NhZ2UtZHJpdmVuCi0JICogYmVhbiBpcyB0byByZWNlaXZlLgotCSAqIAotCSAqIEV4YW1wbGUgdmFsdWU6IAotCSAqIEpNU1R5cGUgPSBgY2FyJyBBTkQgY29sb3IgPSBgYmx1ZScgQU5EIHdlaWdodCA+IDI1MDAKLQotCSAqLwotCVN0cmluZyBnZXRNZXNzYWdlU2VsZWN0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBNZXNzYWdlU2VsZWN0b3IgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRNZXNzYWdlU2VsZWN0b3IoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBBY2tub3dsZWRnZU1vZGUgYXR0cmlidXRlCi0JICogYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGFja25vd2xlZGdtZW50IG1vZGUgZm9yIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi0JICogaWYgYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uIGlzIHVzZWQgKGllLiBzZWxmLnRyYW5zYWN0aW9uVHlwZSA9Ci0JICogQmVhbikKLQkgKiAKLQkgKiBUaGUgYWNrbm93bGVkZ2UtbW9kZSBzcGVjaWZpZXMgd2hldGhlciBKTVMgQVVUT19BQ0tOT1dMRURHRSBvcgotCSAqIERVUFNfT0tfQUNLTk9XTEVER0UgbWVzc2FnZSBhY2tub3dsZWRnbWVudCBzZW1hbnRpY3Mgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZQotCSAqIG9uTWVzc2FnZSBtZXNzYWdlIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiB0aGF0IHVzZXMgYmVhbiBtYW5hZ2VkIHRyYW5zYWN0aW9uCi0JICogZGVtYXJjYXRpb24uCi0JICogCi0JICogVGhlIGFja25vd2xlZGdlLW1vZGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6ICBBdXRvLWFja25vd2xlZGdlLAotCSAqIER1cHMtb2stYWNrbm93bGVkZ2UKLQotCSAqLwotCUFja25vd2xlZGdlTW9kZSBnZXRBY2tub3dsZWRnZU1vZGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldEFja25vd2xlZGdlTW9kZSA8ZW0+QWNrbm93bGVkZ2UgTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNrbm93bGVkZ2UgTW9kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWNrbm93bGVkZ2VNb2RlCi0JICogQHNlZSAjaXNTZXRBY2tub3dsZWRnZU1vZGUoKQotCSAqIEBzZWUgI3Vuc2V0QWNrbm93bGVkZ2VNb2RlKCkKLQkgKiBAc2VlICNnZXRBY2tub3dsZWRnZU1vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFja25vd2xlZGdlTW9kZShBY2tub3dsZWRnZU1vZGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRBY2tub3dsZWRnZU1vZGUgPGVtPkFja25vd2xlZGdlIE1vZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QWNrbm93bGVkZ2VNb2RlKCkKLQkgKiBAc2VlICNnZXRBY2tub3dsZWRnZU1vZGUoKQotCSAqIEBzZWUgI3NldEFja25vd2xlZGdlTW9kZShBY2tub3dsZWRnZU1vZGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBY2tub3dsZWRnZU1vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0QWNrbm93bGVkZ2VNb2RlIDxlbT5BY2tub3dsZWRnZSBNb2RlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2tub3dsZWRnZSBNb2RlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBY2tub3dsZWRnZU1vZGUoKQotCSAqIEBzZWUgI2dldEFja25vd2xlZGdlTW9kZSgpCi0JICogQHNlZSAjc2V0QWNrbm93bGVkZ2VNb2RlKEFja25vd2xlZGdlTW9kZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFja25vd2xlZGdlTW9kZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRGVzdGluYXRpb24gcmVmZXJlbmNlCi0JICogQW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGludGVuZGVkIGRlc3RpbmF0aW9uIHR5cGUgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuCi0JICogYmVhbgotCSAqLwotCU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBnZXREZXN0aW5hdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc3RpbmF0aW9uIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RGVzdGluYXRpb24oTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuX0FjdGl2YXRpb25Db25maWcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZhdGlvbkNvbmZpZyBnZXRBY3RpdmF0aW9uQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRBY3RpdmF0aW9uQ29uZmlnIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWVzc2FnZURlc3RpbmF0aW9uKEphdmFDbGFzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YUNsYXNzIGdldE1lc3NhZ2VEZXN0aW5hdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvbihKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGluazwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICogCSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluawotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5fTGluaygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRMaW5rIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdpbmcgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIFRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWVzc2FnZQotCSAqICAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLiBJZgotCSAqICAgICAgICAgdGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMKLQkgKiAgICAgICAgIGFzc3VtZWQgdG8gYmUgamF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2luZ1R5cGUoSmF2YUNsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdpbmdUeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YUNsYXNzIGdldE1lc3NhZ2luZ1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldE1lc3NhZ2luZ1R5cGUgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWVzc2FnaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnaW5nVHlwZShKYXZhQ2xhc3MgdmFsdWUpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDExZmVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogVGhlIG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uIGVsZW1lbnQgcHJvdmlkZXMgYWR2aWNlIHRvIHRoZSBEZXBsb3llciBhcyB0byB3aGV0aGVyIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiBpcyBpbnRlbmRlZCBmb3IgYSBRdWV1ZSBvciBhIFRvcGljLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW50ZW5kZWQgZGVzdGluYXRpb24gYW5kIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHdoZXRoZXIgYSBkdXJhYmxlIG9yIG5vbi1kdXJhYmxlIHN1YnNjcmlwdGlvbiBzaG91bGQgYmUgdXNlZCBpZiB0aGUgZGVzdGluYXRpb24tdHlwZSBpcyBqYXZheC5qbXMuVG9waWMuCi0gKiBAc2luY2UgMS4wIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVHlwZSBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzdGluYXRpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgSk1TIGRlc3RpbmF0aW9uLiBUaGUKLQkgKiB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlCi0JICogZGVzdGluYXRpb24uCi0JICogCi0JICogVGhlIGRlc3RpbmF0aW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogamF2YXguam1zLlF1ZXVlLCAKLQkgKiBqYXZheC5qbXMuVG9waWMKLQkgKi8KLQlEZXN0aW5hdGlvblR5cGUgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5EZXN0aW5hdGlvblR5cGUKLQkgKiBAc2VlICNpc1NldFR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShEZXN0aW5hdGlvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShEZXN0aW5hdGlvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShEZXN0aW5hdGlvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSBhdHRyaWJ1dGUKLQkgKiBUaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIEpNUyB0b3BpYyBzdWJzY3JpcHRpb24KLQkgKiBpcyBpbnRlbmRlZCB0byBiZSBkdXJhYmxlIG9yIG5vbmR1cmFibGUuCi0JICogCi0JICogVGhlIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6ICBEdXJhYmxlLCAKLQkgKiBOb25EdXJhYmxlCi0KLQkgKi8KLQlTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBnZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uI2dldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkgPGVtPlN1YnNjcmlwdGlvbiBEdXJhYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQKLQkgKiBAc2VlICNpc1NldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKQotCSAqIEBzZWUgI3Vuc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpCi0JICogQHNlZSAjZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eShTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24jZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSA8ZW0+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpCi0JICogQHNlZSAjZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpCi0JICogQHNlZSAjc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eShTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiNnZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5IDxlbT5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKQotCSAqIEBzZWUgI2dldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKQotCSAqIEBzZWUgI3NldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBCZWFuIHJlZmVyZW5jZQotCSAqLwotCU1lc3NhZ2VEcml2ZW4gZ2V0QmVhbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEJlYW4gcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRCZWFuKE1lc3NhZ2VEcml2ZW4gdmFsdWUpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNmNhYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFRoZSBtZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotICogaG9tZSBvciByZW1vdGUgaW50ZXJmYWNlLCBvciBhIHNldCBvZiBtZXRob2RzLiBUaGUgZWpiLW5hbWUgZWxlbWVudAotICogbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gZGVjbGFyZWQgaW4gdGhlCi0gKiBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0bwotICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IGlzIGRlZmluZWQgaW4KLSAqIGJvdGggdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2U7IHRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotICogdGhlIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkgYQotICogc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBtZXRob2QgbmFtZS4KLSAqIAotICogVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgc3ludGF4OgotICogCi0gKiAxLiAJPG1ldGhvZD4KLSAqIAkJPGVqYi1uYW1lPkVKQk5BTUU8Ly9lamItbmFtZT4KLSAqICAgIAkJPG1ldGhvZC1uYW1lPio8Ly9tZXRob2QtbmFtZT4KLSAqIAk8Ly9tZXRob2Q+Ci0gKiAKLSAqICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNwZWNpZmllZAotICogICAgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMuCi0gKiAKLSAqIDIuIAk8bWV0aG9kPgotICogCQk8ZWpiLW5hbWU+RUpCTkFNRTwvL2VqYi1uYW1lPgotICogICAgCQk8bWV0aG9kLW5hbWU+TUVUSE9EPC8vbWV0aG9kLW5hbWU+Ci0gKiAJPC8vbWV0aG9kPj4KLSAqIAotICogICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mIHRoZQotICogICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMgd2l0aAotICogICAgdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZiB0aGlzIHN0eWxlIHJlZmVycyB0bwotICogICAgYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQgbmFtZS4KLSAqIAotICogCi0gKiAKLSAqIAotICogCi0gKiAzLiAJPG1ldGhvZD4KLSAqIAkJPGVqYi1uYW1lPkVKQk5BTUU8Ly9lamItbmFtZT4KLSAqICAgIAkJPG1ldGhvZC1uYW1lPk1FVEhPRDwvL21ldGhvZC1uYW1lPgotICogCQk8bWV0aG9kLXBhcmFtcz4KLSAqICAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tMTwvL21ldGhvZC1wYXJhbT4KLSAqICAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tMjwvL21ldGhvZC1wYXJhbT4KLSAqICAgICAgICAgICAJCQkuLi4KLSAqICAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tbjwvL21ldGhvZC1wYXJhbT4KLSAqIAkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAk8bWV0aG9kPgkKLSAqIAotICogICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYSBzZXQgb2YKLSAqICAgIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaCBQQVJBTS1uIGFyZSB0aGUKLSAqICAgIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZSBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzIChpZgotICogICAgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50Ci0gKiAgICBjb250YWlucyBubyBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLSAqICAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mIHNxdWFyZQotICogICAgYnJhY2tldHMgKGUuZy4gaW50W11bXSkuCi0gKiAKLSAqIAotICogVXNlZCBpbjogbWV0aG9kLXBlcm1pc3Npb24gYW5kIGNvbnRhaW5lci10cmFuc2FjdGlvbgotICogCi0gKiBFeGFtcGxlczoKLSAqIAotICogICAgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgbWV0aG9kcyBvZgotICogCQl0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlczoKLSAqIAotICogCQk8bWV0aG9kPgotICogCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvL2VqYi1uYW1lPgotICogCQkJPG1ldGhvZC1uYW1lPio8Ly9tZXRob2QtbmFtZT4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJU3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZSBjcmVhdGUKLSAqIAkJbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZToKLSAqIAotICogICAgIAkJPG1ldGhvZD4KLSAqIAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8Ly9lamItbmFtZT4KLSAqIAkJCTxtZXRob2QtbmFtZT5jcmVhdGU8Ly9tZXRob2QtbmFtZT4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi0gKiAJCWNyZWF0ZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgTGFzdE5hbWUpIG1ldGhvZCBvZiB0aGUKLSAqIAkgCUVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0gKiAKLSAqICAgICAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC8vbWV0aG9kLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLXBhcmFtcz4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJCi0gKiAJVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLSAqIAltb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi0gKiAJCQlmb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotICogCQkJCW15cGFja2FnZS5NeUNsYXNzW11bXSBteWNsYWFyKQotICogICAgICAgICB3b3VsZCBiZSBzcGVjaWZpZWQgYXM6Ci0gKiAKLSAqICAgICAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLW5hbWU+Zm9vYmFyPC8vbWV0aG9kLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLXBhcmFtcz4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmNoYXI8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5pbnQ8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5pbnRbXTwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3NbXVtdPC8vbWV0aG9kLXBhcmFtPgotICogCQkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJVGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2hlbiBpdCBiZWNvbWVzCi0gKiAgICBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUKLSAqICAgIGludGVyZmFjZSBhbmQgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUgdGhhdCBpcwotICogICAgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLSAqIAotICogCUZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIAotICogICAgCQk8bWV0aG9kPgotICogCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvL2VqYi1uYW1lPgotICogCQkJPG1ldGhvZC1pbnRmPlJlbW90ZTwvL21ldGhvZC1pbnRmPgotICogCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvL21ldGhvZC1uYW1lPgotICogCQkJPG1ldGhvZC1wYXJhbXM+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCTwvL21ldGhvZC1wYXJhbXM+Ci0gKiAJCTwvL21ldGhvZD4KLSAqIAotICogCWNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kCi0gKiAgICBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLSAqICAgIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotICogCi0gKiAgICAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLWludGY+SG9tZTwvL21ldGhvZC1pbnRmPgotICogCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvL21ldGhvZC1uYW1lPgotICogCQkJPG1ldGhvZC1wYXJhbXM+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCTwvL21ldGhvZC1wYXJhbXM+Ci0gKiAJCTwvL21ldGhvZD4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudCBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJJR0hUX1BBUkVOID0gIigiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVGVF9QQVJFTiA9ICIpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BID0gIiwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHZvaWQgYWRkTWV0aG9kUGFyYW1zKFN0cmluZyBwYXJhbSk7Ci0vKioKLSAqIFNldCB0aGUgcGFyYW1zIGZvciB0aGlzIG1ldGhvZCBlbGVtZW50IHRvIGFuIGVtcHR5IGFycmF5LCBhcyBvcHBvc2VkCi0gKiB0byBudWxsLgotICovCi1wdWJsaWMgdm9pZCBhcHBseVplcm9QYXJhbXMoKTsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RFbGVtZW50IGFuZCBAYW5vdGhlck1ldGhvZEVsZW1lbnQKLSAqIGhhdmUgdGhlIHNhbWUgbmFtZSwgcGFyYW1ldGVycywgYW5kIHR5cGUuCi0gKi8KLWJvb2xlYW4gZXF1YWxTaWduYXR1cmUoTWV0aG9kRWxlbWVudCBhbm90aGVyTWV0aG9kRWxlbWVudCkgOwotCWphdmEudXRpbC5MaXN0IGdldE1ldGhvZFBhcmFtcygpIDsvKioKLSAqIEFuc3dlciB3aGV0aGVyIG1ldGhvZCBwYXJhbXMgYXBwbHkgdG8gdGhpcyBtZXRob2QsIGUuZy4sIGl0IGlzIHNwZWNpZmljIHRvIG9uZQotICogb3ZlcmxvYWRlZCBtZXRob2QsIGV2ZW4gaWYgdGhlIG1ldGhvZCBpcyBhIHplcm8gcGFyYW1ldGVyIG1ldGhvZC4gIEFuc3dlciBmYWxzZSBpZiBubwotICogcGFyYW1ldGVycyBhcHBseSwgdGhhdCBpcywgdGhlIG1ldGhvZCBlbGVtZW50IGFwcGxpZXMgdG8gYWxsIG92ZXJsb2FkZWQgbWV0aG9kcyB3aXRoIHRoaXMgbmFtZQotICovIAotLyoqCi0gKiBBbnN3ZXIgYSBsaXN0IG9mIGFsbCB0aGUgbWV0aG9kcyBmb3Igd2hpY2ggdGhpcyBtZXRob2QgZWxlbWVudCBhcHBsaWVzLiAgVGhlIGZvbGxvd2luZyBydWxlcyBhcmUgdXNlZDoKLSAqCi0gKiAxKSAgSWYgdGhlIG1ldGhvZCBlbGVtZW50IHR5cGUgaXMgdW5zcGVjaWZpZWQsIHRoZSBtZXRob2RzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSByZW1vdGUgaW50ZXJmYWNlIG9mIHRoZSBlamI7Ci0gKgkJSWYgaXQgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBhcHByb3ByaWF0ZSBpbnRlcmZhY2UgaXMgdXNlZAotICoKLSAqIDIpICBJZiB0aGUgbWV0aG9kIG5hbWUgPSAiKiIsIHRoZW4gYWxsIHRoZSBQVUJMSUMgbWV0aG9kcyBmb3IgdGhhdCBpbnRlcmZhY2UgYXJlIHJldHVybmVkCi0gKgotICogMykgIElmIHRoZSBtZXRob2QgbmFtZSBpcyBzcGVjaWZpZWQsIGFuZCBubyBtZXRob2QgcGFyYW1zIGFyZSBzcGVjaWZpZWQsIHRoZW4gYWxsIHB1YmxpYyBtZXRob2RzIGZvciB0aGUgaW50ZXJmYWNlCi0gKiAgICAgIGhhdmluZyB0aGUgc2FtZSBuYW1lIGFyZSByZXR1cm5lZC4KLSAqCi0gKiA0KSAgSWYgdGhlIG1ldGhvZCBuYW1lIGFuZCBwYXJhbXMgYXJlIHNwZWNpZmllZCwgdGhlbiBhIHplcm8gb3Igb25lIGVsZW1lbnQgYXJyYXkgaXMgcmV0dXJuZWQsIGNvbnRhaW5pbmcgdGhlIG9uZSBhbmQgb25seSBtZXRob2QKLSAqICAgICAgb24gdGhlIGludGVyZmFjZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzaWduYXR1cmUsIGlmIGl0IGV4aXN0cwotICovCi1wdWJsaWMgTWV0aG9kW10gZ2V0TWV0aG9kcygpOwotLyoqCi0gKiBSZXR1cm4gdGhlIE1ldGhvZEVsZW1lbnQgdGhhdCBpcyBtb3N0IHNwZWNpZmljLgotICovCi1NZXRob2RFbGVtZW50IGdldE1vc3RTcGVjaWZpYyhNZXRob2RFbGVtZW50IGFNZXRob2RFbGVtZW50LCBKYXZhQ2xhc3MgYUphdmFDbGFzcyk7Ci0vKioKLSAqIFJldHVybiB0aGUgc2lnbmF0dXJlLgotICogRm9yIGV4YW1wbGU6ICBzZXRUd29QYXJhbU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICovCi1TdHJpbmcgZ2V0U2lnbmF0dXJlKCkgOwotLyoqCi0gKiBSZXR1cm4gdGhlIHR5cGUgY2FzdCB0byBhIEphdmFDbGFzcy4KLSAqLwotSmF2YUNsYXNzIGdldFR5cGVKYXZhQ2xhc3MoKSA7Ci1wdWJsaWMgYm9vbGVhbiBoYXNNZXRob2RQYXJhbXMoKTsKLS8qKgotICogUGFyc2UgQGFTaWduYXR1cmUgc2V0dGluZyB0aGUgbmFtZSBhbmQgdGhlIHBhcmFtcy4KLSAqIEEgc2lnbmF0dXJlIGV4YW1wbGU6ICBzZXRUd29QYXJhbU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICovCi12b2lkIGluaXRpYWxpemVGcm9tU2lnbmF0dXJlKFN0cmluZyBhU2lnbmF0dXJlKSA7Ci1ib29sZWFuIGlzRGVmYXVsdCgpOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIE1ldGhvZEVsZW1lbnQgYW5kIEBhbm90aGVyTWV0aG9kRWxlbWVudAotICogcmVwcmVzZW50IHRoZSBzYW1lIGV4YWN0IG1ldGhvZHMuCi0gKi8KLWJvb2xlYW4gaXNFcXVpdmFsZW50KE1ldGhvZEVsZW1lbnQgYW5vdGhlck1ldGhvZEVsZW1lbnQpIDsKLWJvb2xlYW4gaXNIb21lKCkgOwotYm9vbGVhbiBpc1JlbW90ZSgpIDsKLWJvb2xlYW4gaXNVbnNwZWNpZmllZCgpIDsKLWJvb2xlYW4gaXNMb2NhbEhvbWUoKSA7Ci1ib29sZWFuIGlzTG9jYWwoKSA7Ci1ib29sZWFuIGlzU2VydmljZSgpOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIE1ldGhvZEVsZW1lbnQgcmVwcmVzZW50cyBvbmUgb3IgbW9yZQotICogbWV0aG9kcy4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIDsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RFbGVtZW50IGhhcyB0aGUgc2FtZSBiYXNpYyBzaWduYXR1cmUgYXMKLSAqIEBhTWV0aG9kLCBpZ25vcmluZyB0aGUgcmV0dXJuIHR5cGUsIHRocm93biBleGNlcHRpb25zLCBhbmQgZGVjbGFyaW5nIGNsYXNzIG9mIAotICogdGhpcyBpbnN0YW5jZSBvciBAYU1ldGhvZC4gIFJldHVybiBmYWxzZSwgaWYgcGFyYW1zIGlzIG51bGwKLSAqLwotcHVibGljIGJvb2xlYW4gbmFtZUFuZFBhcmFtc0VxdWFscyhNZXRob2QgYU1ldGhvZCk7Ci0JcHVibGljIHZvaWQgcmVtb3ZlTWV0aG9kUGFyYW1zKFN0cmluZyBwYXJhbSk7Ci1ib29sZWFuIHJlcHJlc2VudHMoTWV0aG9kIGFNZXRob2QpOwotcHVibGljIHZvaWQgc2V0SWRUb1JlYWRhYmxlU3RyaW5nKCk7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kRWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzCi0gKiBAYU1ldGhvZC4gIFJldHVybiBmYWxzZSwgZXZlbiBpZiB0aGUgTWV0aG9kRWxlbWVudCByZXByZXNlbnRzCi0gKiBAYU1ldGhvZCAoaS5lLiwgQGFNZXRob2QgaXMgY29udGFpbmVkIGluIGl0cyBsaXN0IG9mIG1ldGhvZHMpLgotICovCi1ib29sZWFuIHVuaXF1ZWx5SWRlbnRpZmllcyhNZXRob2QgYU1ldGhvZCk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogVGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBtZXRob2QsCi0JICogb3IgdGhlIGFzdGVyaXNrICgqKSBjaGFyYWN0ZXIuIFRoZSBhc3RlcmlzayBpcyB1c2VkIHdoZW4gdGhlIGVsZW1lbnQKLQkgKiBkZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kIGhvbWUKLQkgKiBpbnRlcmZhY2VzLgotCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFBhcm1zIGF0dHJpYnV0ZQotCSAqIFRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgYSBsaXN0IG9mIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlCi0JICogbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLiAgSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdGhpcyBpcyBhIHNwYWNlCi0JICogZGVsaW1pdHRlZCBTdHJpbmcuICBBIG51bGwgc3RyaW5nIGluZGljYXRlcyBhIGdlbmVyaWMgbWV0aG9kIGVsZW1lbnQgdGhhdCBjYW4KLQkgKiBhcHBseSB0byBtdWx0aXBsZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZS4gIEFuIGVtcHR5IHN0cmluZyBpbmRpY2F0ZXMgYQotCSAqIG1ldGhvZCB3aXRoIHplcm8gcGFyYW1ldGVycy4gIAotCSAqLwotCVN0cmluZyBnZXRQYXJtcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFBhcm1zIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UGFybXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqLwotCU1ldGhvZEVsZW1lbnRLaW5kIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kCi0JICogQHNlZSAjaXNTZXRUeXBlKCkKLQkgKiBAc2VlICN1bnNldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBzZWUgI3NldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBzZWUgI3NldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dAotCSAqIGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55Ci0JICogaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mCi0JICogdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZQotCSAqIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50Ci0JICogZWxlbWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFbnRlcnByaXNlQmVhbiByZWZlcmVuY2UKLQkgKi8KLQlFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnByaXNlQmVhbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRW50ZXJwcmlzZUJlYW4gcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRFbnRlcnByaXNlQmVhbihFbnRlcnByaXNlQmVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RFbGVtZW50S2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZEVsZW1lbnRLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMGQyZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZEVsZW1lbnRLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBNZXRob2RFbGVtZW50S2luZCB7fQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWV0aG9kRWxlbWVudEtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TUEVDSUZJRUQgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9URSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9NRSA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUwgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0hPTUUgPSA0OwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWSUNFX0VORFBPSU5UX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iU2VydmljZUVuZHBvaW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfRU5EUE9JTlQgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VW5zcGVjaWZpZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VbnNwZWNpZmllZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNVTlNQRUNJRklFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgVU5TUEVDSUZJRURfTElURVJBTCA9IG5ldyBNZXRob2RFbGVtZW50S2luZChVTlNQRUNJRklFRCwgIlVuc3BlY2lmaWVkIiwgIlVuc3BlY2lmaWVkIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRU1PVEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRLaW5kIFJFTU9URV9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKFJFTU9URSwgIlJlbW90ZSIsICJSZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkhvbWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSE9NRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgSE9NRV9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKEhPTUUsICJIb21lIiwgIkhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgTE9DQUxfTElURVJBTCA9IG5ldyBNZXRob2RFbGVtZW50S2luZChMT0NBTCwgIkxvY2FsIiwgIkxvY2FsIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0hPTUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRLaW5kIExPQ0FMX0hPTUVfTElURVJBTCA9IG5ldyBNZXRob2RFbGVtZW50S2luZChMT0NBTF9IT01FLCAiTG9jYWxIb21lIiwgIkxvY2FsSG9tZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWSUNFX0VORFBPSU5UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBTRVJWSUNFX0VORFBPSU5UX0xJVEVSQUwgPSBuZXcgTWV0aG9kRWxlbWVudEtpbmQoU0VSVklDRV9FTkRQT0lOVCwgIlNlcnZpY2VFbmRwb2ludCIsICJTZXJ2aWNlRW5kcG9pbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IE1ldGhvZEVsZW1lbnRLaW5kW10gewotCQkJVU5TUEVDSUZJRURfTElURVJBTCwKLQkJCVJFTU9URV9MSVRFUkFMLAotCQkJSE9NRV9MSVRFUkFMLAotCQkJTE9DQUxfTElURVJBTCwKLQkJCUxPQ0FMX0hPTUVfTElURVJBTCwKLQkJCVNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnRLaW5kIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTWV0aG9kRWxlbWVudEtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudEtpbmQgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlNZXRob2RFbGVtZW50S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSBwYXNzZXMgbGl0ZXJhbCB2YWx1ZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnRLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBVTlNQRUNJRklFRDogcmV0dXJuIFVOU1BFQ0lGSUVEX0xJVEVSQUw7Ci0JCQljYXNlIFJFTU9URTogcmV0dXJuIFJFTU9URV9MSVRFUkFMOwotCQkJY2FzZSBIT01FOiByZXR1cm4gSE9NRV9MSVRFUkFMOwotCQkJY2FzZSBMT0NBTDogcmV0dXJuIExPQ0FMX0xJVEVSQUw7Ci0JCQljYXNlIExPQ0FMX0hPTUU6IHJldHVybiBMT0NBTF9IT01FX0xJVEVSQUw7Ci0JCQljYXNlIFNFUlZJQ0VfRU5EUE9JTlQ6IHJldHVybiBTRVJWSUNFX0VORFBPSU5UX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnRLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9NZXRob2RFbGVtZW50S2luZAotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RQZXJtaXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kUGVybWlzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTBhYWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RQZXJtaXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci0KLS8qKgotICogVGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUgc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMsIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLiAgVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kLy9vciBob21lIGludGVyZmFjZXMuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFBlcm1pc3Npb24gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLS8qKgotICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyB0aGF0IHBvaW50IHRvCi0gKiBAYW5FSkIuCi0gKi8KLUxpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIDsKLS8qKgotICogUmV0dXJuIHRoZSBTZWN1cml0eVJvbGUgbmFtZWQgQGFSb2xlTmFtZS4KLSAqLwotU2VjdXJpdHlSb2xlIGdldFNlY3VyaXR5Um9sZShTdHJpbmcgYVJvbGVOYW1lKSA7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcGVybWlzc2lvbiBjb250YWlucyBAYVNlY3VyaXR5Um9sZQotICovCi1ib29sZWFuIGhhc1NlY3VyaXR5Um9sZShTZWN1cml0eVJvbGUgYVNlY3VyaXR5Um9sZSkgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBlcm1pc3Npb24gY29udGFpbnMgYSBTZWN1cml0eVJvbGUKLSAqIG5hbWVkIEBhUm9sZU5hbWUuCi0gKi8KLWJvb2xlYW4gaGFzU2VjdXJpdHlSb2xlKFN0cmluZyBhUm9sZU5hbWUpIDsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RQZXJtaXNzaW9uIGFuZCBAYW5vdGhlck1ldGhvZFBlcm1pc3Npb24KLSAqIGhhdmUgdGhlIHNhbWUgcm9sZXMuCi0gKi8KLWJvb2xlYW4gaXNFcXVpdmFsZW50KE1ldGhvZFBlcm1pc3Npb24gYW5vdGhlck1ldGhvZFBlcm1pc3Npb24pIDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dAotCSAqIGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55Ci0JICogaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mCi0JICogdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZQotCSAqIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50Ci0JICogZWxlbWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVW5jaGVja2VkIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNVbmNoZWNrZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBVbmNoZWNrZWQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVbmNoZWNrZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2lzVW5jaGVja2VkIDxlbT5VbmNoZWNrZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VW5jaGVja2VkKCkKLQkgKiBAc2VlICNpc1VuY2hlY2tlZCgpCi0JICogQHNlZSAjc2V0VW5jaGVja2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRVbmNoZWNrZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jaXNVbmNoZWNrZWQgPGVtPlVuY2hlY2tlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5jaGVja2VkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRVbmNoZWNrZWQoKQotCSAqIEBzZWUgI2lzVW5jaGVja2VkKCkKLQkgKiBAc2VlICNzZXRVbmNoZWNrZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFVuY2hlY2tlZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgQXNzZW1ibHlEZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCUFzc2VtYmx5RGVzY3JpcHRvciBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEFzc2VtYmx5RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBSb2xlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0Um9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTWV0aG9kRWxlbWVudHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldE1ldGhvZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZFRyYW5zYWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kVHJhbnNhY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyM2NlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kVHJhbnNhY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBTcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kIGludm9jYXRpb25zLiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS5UaGUgdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kVHJhbnNhY3Rpb24gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLS8qKgotICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyB0aGF0IHBvaW50IHRvCi0gKiBAYW5FSkIuCi0gKi8KLUxpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIDsKLU1ldGhvZEVsZW1lbnQgZ2V0TW9zdFNwZWNpZmljTWV0aG9kRWxlbWVudChNZXRob2QgYU1ldGhvZCkgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhbnNhY3Rpb24gYXR0cmlidXRlcyBhcmUgdGhlIHNhbWUuCi0gKi8KLWJvb2xlYW4gaXNFcXVpdmFsZW50KE1ldGhvZFRyYW5zYWN0aW9uIGFub3RoZXJNZXRob2RUcmFuc2FjdGlvbikgOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUcmFuc2FjdGlvbkF0dHJpYnV0ZSBhdHRyaWJ1dGUKLQkgKiBUaGUgdHJhbnMtYXR0cmlidXRlIGVsZW1lbnQgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QgbWFuYWdlIHRoZQotCSAqIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kIGludm9jYXRpb24gdG8gYW4gZW50ZXJwcmlzZQotCSAqIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0KLQkgKi8KLQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbiNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSA8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZQotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZShUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb24jZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUgPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbiNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSA8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0Ci0JICogZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkKLQkgKiBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLQkgKiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlCi0JICogZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQKLQkgKiBlbGVtZW50LgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEFzc2VtYmx5RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQlBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBBc3NlbWJseURlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTWV0aG9kRWxlbWVudHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldE1ldGhvZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRNZXRob2RUcmFuc2FjdGlvbl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NdWx0aXBsaWNpdHlLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTXVsdGlwbGljaXR5S2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzE3NGMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NdWx0aXBsaWNpdHlLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBNdWx0aXBsaWNpdHlLaW5kIHt9Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNdWx0aXBsaWNpdHlLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9ORT0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQU5ZPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T25lPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T25lPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09ORQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTXVsdGlwbGljaXR5S2luZCBPTkVfTElURVJBTCA9IG5ldyBNdWx0aXBsaWNpdHlLaW5kKE9ORSwgIk9uZSIsICJPbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTUFOWQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTXVsdGlwbGljaXR5S2luZCBNQU5ZX0xJVEVSQUwgPSBuZXcgTXVsdGlwbGljaXR5S2luZChNQU5ZLCAiTWFueSIsICJNYW55Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHkgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTXVsdGlwbGljaXR5S2luZFtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBNdWx0aXBsaWNpdHlLaW5kW10gewotCQkJT05FX0xJVEVSQUwsCi0JCQlNQU5ZX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk11bHRpcGxpY2l0eSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE11bHRpcGxpY2l0eUtpbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlNdWx0aXBsaWNpdHlLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNdWx0aXBsaWNpdHlLaW5kIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJTXVsdGlwbGljaXR5S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNdWx0aXBsaWNpdHlLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBPTkU6IHJldHVybiBPTkVfTElURVJBTDsKLQkJCWNhc2UgTUFOWTogcmV0dXJuIE1BTllfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTXVsdGlwbGljaXR5S2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vTXVsdGlwbGljaXR5S2luZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1F1ZXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjMzVkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIFRoZSBxdWVyeSBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGZpbmRlciBvciBzZWxlY3QgcXVlcnkuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeTsgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QgbWV0aG9kIGl0IGlzIHVzZWQgYnk7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmV0dXJuIHR5cGUgbWFwcGluZywgaWYgYW55LCBpZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZDsgYW5kIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuIFF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwgZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeQotICogaXMgbm90IGV4cHJlc3NpYmxlIGluIEVKQiBRTCwgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudCBzaG91bGQgYmUgZW1wdHkuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGZvciBSZXR1cm5UeXBlTWFwcGluZywgY2hlY2tzIGlmIGl0IGlzIG9mIHR5cGUgUmV0dXJuVHlwZU1hcHBpbmcuTE9DQUwKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsUmVzdWx0TWFwcGluZygpOwotCQotCS8qKgotCSAqIFJldHVybnMgYm9vbGVhbiB2YWx1ZSBmb3IgUmV0dXJuVHlwZU1hcHBpbmcsIGNoZWNrcyBpZiBpdCBpcyBvZiB0eXBlIFJldHVyblR5cGVNYXBwaW5nLlJFTU9URQotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVtb3RlUmVzdWx0TWFwcGluZygpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIAotCSAqIHRoZSBxdWVyeS4KLQkgKiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlcgotCSAqIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4KLQkgKiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZQotCSAqIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBFamJRTCBhdHRyaWJ1dGUKLQkgKiBDb250YWlucyB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgYSBmaW5kZXIgb3Igc2VsZWN0IHF1ZXJ5LiBUaGlzCi0JICogZWxlbWVudCBpcyBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBxdWVyeSBlbGVtZW50IHdob3NlIGNvbnRlbnRzIHNwZWNpZnkKLQkgKiB0aGUgZmluZGVyIG9yIHRoZSBzZWxlY3QgbWV0aG9kIHRoYXQgdXNlcyB0aGUgcXVlcnkuIFRoZSBjb250ZW50IG11c3QgYmUgYQotCSAqIHZhbGlkIEVKQiBRTCBxdWVyeSBzdHJpbmcgZm9yIHRoZSBlbnRpdHkgYmVhbiBmb3Igd2hpY2ggdGhlIHF1ZXJ5IGlzIHNwZWNpZmllZC4gCi0JICogVGhlIGVqYi1xbCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbGwgcXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbgotCSAqIEVKQiBRTC4KLQkgKiAKLQkgKiBAaW52YXJpYW50IFRoZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgRUpCIFFMIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIGVudGl0eSBiZWFuIG9yIAotCSAqIGRlcGVuZGVudCBvYmplY3QgY2xhc3MgZm9yIHdoaWNoIHRoZSBxdWVyeSBpcyBzcGVjaWZpZWQuCi0JICogQGludmFyaWFudCBUaGUgZWpiLXFsIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFsbCBxdWVyaWVzIHRoYXQgYXJlCi0JICogZXhwcmVzc2libGUgaW4gRUpCIFFMLgotCSAqIAotCSAqIEV4YW1wbGU6Ci0JICogPHF1ZXJ5PgotCSAqIDxxdWVyeS1tZXRob2Q+Ci0JICogPG1ldGhvZC1uYW1lPmVqYlNlbGVjdFBlbmRpbmdMaW5laXRlbXM8Ly9tZXRob2QtbmFtZT4KLQkgKiA8bWV0aG9kLXBhcmFtcy8vPgotCSAqIDwvL3F1ZXJ5LW1ldGhvZD4KLQkgKiA8ZWpiLXFsPlNFTEVDVCBFTlRJVFkobCkKLQkgKiBGUk9NIExpbmVJdGVtcyBsCi0JICogV0hFUkUgbC5zaGlwcGVkIGlzIEZBTFNFCi0JICogPC8vZWpiLXFsPgotCSAqIDwvL3F1ZXJ5PgotCSAqLwotCVN0cmluZyBnZXRFamJRTCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEVqYlFMIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RWpiUUwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSZXR1cm5UeXBlTWFwcGluZyBhdHRyaWJ1dGUKLQkgKiBUaGUgcmV0dXJuLXR5cGUtbWFwcGluZyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8gc3BlY2lmeSB3aGV0aGVyIAotCSAqIGFuIGFic3RyYWN0IHNjaGVtYSB0eXBlIHRoYXQgaXMgcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvCi0JICogYmUgbWFwcGVkIHRvIGFuIEVKQkxvY2FsT2JqZWN0IG9yIEVKQk9iamVjdCB0eXBlLiAgVGhlIHZhbHVlIG9mIHRoZQotCSAqIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCwgaWYgc3BlY2lmaWVkIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcuCi0JICovCi0JUmV0dXJuVHlwZU1hcHBpbmcgZ2V0UmV0dXJuVHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeSNnZXRSZXR1cm5UeXBlTWFwcGluZyA8ZW0+UmV0dXJuIFR5cGUgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIFR5cGUgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmV0dXJuVHlwZU1hcHBpbmcKLQkgKiBAc2VlICNpc1NldFJldHVyblR5cGVNYXBwaW5nKCkKLQkgKiBAc2VlICN1bnNldFJldHVyblR5cGVNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRSZXR1cm5UeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmV0dXJuVHlwZU1hcHBpbmcoUmV0dXJuVHlwZU1hcHBpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnkjZ2V0UmV0dXJuVHlwZU1hcHBpbmcgPGVtPlJldHVybiBUeXBlIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmV0dXJuVHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI2dldFJldHVyblR5cGVNYXBwaW5nKCkKLQkgKiBAc2VlICNzZXRSZXR1cm5UeXBlTWFwcGluZyhSZXR1cm5UeXBlTWFwcGluZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeSNnZXRSZXR1cm5UeXBlTWFwcGluZyA8ZW0+UmV0dXJuIFR5cGUgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIFR5cGUgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmV0dXJuVHlwZU1hcHBpbmcoKQotCSAqIEBzZWUgI2dldFJldHVyblR5cGVNYXBwaW5nKCkKLQkgKiBAc2VlICNzZXRSZXR1cm5UeXBlTWFwcGluZyhSZXR1cm5UeXBlTWFwcGluZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBRdWVyeU1ldGhvZCByZWZlcmVuY2UKLQkgKiBUaGUgcXVlcnktbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtZXRob2QgKERCLy9TUi8vQ00tIm9uIHRoZQotCSAqIGhvbWUiKSBmb3IgYSBmaW5kZXIgb3IKLQkgKiBzZWxlY3QgcXVlcnkuCi0JICogCi0JICogVGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgZmluZGVyIG9yIHNlbGVjdAotCSAqIG1ldGhvZCBpbiB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcyBvciBhIHNlbGVjdCBtZXRob2QgaW4KLQkgKiB0aGUgZGVwZW5kZW50IG9iamVjdCBjbGFzcy4KLQkgKiAKLQkgKiBFYWNoIG1ldGhvZC1wYXJhbSBtdXN0IGJlIGRlZmluZWQgZm9yIGEgcXVlcnktbWV0aG9kIHVzaW5nIHRoZQotCSAqIG1ldGhvZC1wYXJhbXMgZWxlbWVudC4KLQkgKiAKLQkgKiBVc2VkIGluOiBxdWVyeQotCSAqIAotCSAqIEV4YW1wbGU6Ci0JICogCi0JICogRXhhbXBsZToKLQkgKiA8cXVlcnk+Ci0JICogICA8ZGVzY3JpcHRpb24+TWV0aG9kIGZpbmRzIGxhcmdlIG9yZGVyczwvL2Rlc2NyaXB0aW9uPgotCSAqICAgPHF1ZXJ5LW1ldGhvZD4KLQkgKiAgICAgPG1ldGhvZC1uYW1lPmZpbmRMYXJnZU9yZGVyczwvL21ldGhvZC1uYW1lPgotCSAqICAgICA8bWV0aG9kLXBhcmFtcz48Ly9tZXRob2QtcGFyYW1zPgotCSAqICAgPC8vcXVlcnktbWV0aG9kPgotCSAqICAgPGVqYi1xbD5TRUxFQ1QgRU5USVRZKG8pIEZST00gT3JkZXIgbyBXSEVSRSBvLmFtb3VudCAmZ3Q7IDEwMDA8Ly9lamItcWw+Ci0JICogPC8vcXVlcnk+Ci0JICovCi0JUXVlcnlNZXRob2QgZ2V0UXVlcnlNZXRob2QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBRdWVyeU1ldGhvZCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEVudGl0eSByZWZlcmVuY2UKLQkgKi8KLQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldEVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5I2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRpdHkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0UXVlcnlfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUXVlcnlNZXRob2QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9RdWVyeU1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWZmYTg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9RdWVyeU1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5TWV0aG9kIGV4dGVuZHMgTWV0aG9kRWxlbWVudHsKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfUFJFRklYID0gImVqYlNlbGVjdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5EX1BSRUZJWCA9ICJmaW5kIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFF1ZXJ5IHJlZmVyZW5jZQotCSAqLwotCVF1ZXJ5IGdldFF1ZXJ5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUXVlcnkgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRRdWVyeShRdWVyeSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgSmF2YUNsYXNzZXMgb2YgYWxsIHRoZSBpbnRlcmZhY2VzIG9yIGJlYW4gY2xhc3MgdGhhdCB0aGlzIG1ldGhvZCBpcyBwcmVzZW50ZWQKLQkgKiB0byBhIGNsaWVudC4gIElmIGl0IGlzIGFuIGVqYlNlbGVjdC4uLiBvbiB0aGUgYmVhbiBjbGFzcyB3aWxsIGJlIHJldHVybmVkIGFuZCBpZgotCSAqIGl0IGlmIGEgZmluZCBib3RoIGhvbWUgaW50ZXJmYWNlcyB3aWxsIGJlIHJldHVybmVkIGlmIHRoZXkgZXhpc3QuCi0JICogCi0JICogTWF5IHJldHVybiBudWxsLgotCSAqIEByZXR1cm4gYXJyYXkgb2YgSmF2YUNsYXNzCi0JICovCi0JSmF2YUNsYXNzW10gZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCkgOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZWxhdGlvbnNoaXBzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUmVsYXRpb25zaGlwcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2RiODU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZWxhdGlvbnNoaXBzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgcmVsYXRpb25zaGlwcyBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4gd2hpY2ggZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBSZWxhdGlvbnNoaXBzIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIAotCSAqIHRoZSBjb2xsZWN0aW9uIG9mIHJlbGF0aW9uc2hpcHMuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIKLQkgKiB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuCi0JICogVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUKLQkgKiBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFamJKYXIgcmVmZXJlbmNlCi0JICovCi0JRUpCSmFyIGdldEVqYkphcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEVqYkphciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEVqYkphcihFSkJKYXIgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBFamJSZWxhdGlvbnMgcmVmZXJlbmNlcwotCSAqIEEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkCi0JICogcmVsYXRpb25zaGlwcy4KLQkgKi8KLQlFTGlzdCBnZXRFamJSZWxhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUmV0dXJuVHlwZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZXR1cm5UeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2U0MmUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZXR1cm5UeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgUmV0dXJuVHlwZU1hcHBpbmcge30KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJldHVyblR5cGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMPSAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1RFPSAxOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldHVyblR5cGVNYXBwaW5nIExPQ0FMX0xJVEVSQUwgPSBuZXcgUmV0dXJuVHlwZU1hcHBpbmcoTE9DQUwsICJMb2NhbCIsICJMb2NhbCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVNT1RFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXR1cm5UeXBlTWFwcGluZyBSRU1PVEVfTElURVJBTCA9IG5ldyBSZXR1cm5UeXBlTWFwcGluZyhSRU1PVEUsICJSZW1vdGUiLCAiUmVtb3RlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXR1cm4gVHlwZSBNYXBwaW5nPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXR1cm5UeXBlTWFwcGluZ1tdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBSZXR1cm5UeXBlTWFwcGluZ1tdIHsKLQkJCUxPQ0FMX0xJVEVSQUwsCi0JCQlSRU1PVEVfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXR1cm4gVHlwZSBNYXBwaW5nPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXR1cm4gVHlwZSBNYXBwaW5nPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJldHVyblR5cGVNYXBwaW5nIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmV0dXJuVHlwZU1hcHBpbmcgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXR1cm4gVHlwZSBNYXBwaW5nPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV0dXJuVHlwZU1hcHBpbmcgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlSZXR1cm5UeXBlTWFwcGluZyByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmV0dXJuIFR5cGUgTWFwcGluZzwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSBwYXNzZXMgbGl0ZXJhbCB2YWx1ZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJldHVyblR5cGVNYXBwaW5nIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBMT0NBTDogcmV0dXJuIExPQ0FMX0xJVEVSQUw7Ci0JCQljYXNlIFJFTU9URTogcmV0dXJuIFJFTU9URV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBSZXR1cm5UeXBlTWFwcGluZyhpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vUmV0dXJuVHlwZU1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Sb2xlU291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUm9sZVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzExODY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Sb2xlU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBEZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gZW50aXR5IGJlYW4uCi0gKiBAaW52YXJpYW50IFRoZSBjb250ZW50IG9mIGVhY2ggcm9sZS1zb3VyY2UgZWxlbWVudCBzaGFsbCByZWZlciB0byBhbiBleGlzdGluZyBlbnRpdHkgYmVhbiwgZW50aXR5IGJlYW4gcmVmZXJlbmNlLgotICogQHNpbmNlIDEuMCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlU291cmNlIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSb2xlIHJlZmVyZW5jZQotCSAqLwotCUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJvbGUgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRW50aXR5QmVhbiByZWZlcmVuY2UKLQkgKi8KLQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldEVudGl0eUJlYW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlI2dldEVudGl0eUJlYW4gPGVtPkVudGl0eSBCZWFuPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgQmVhbjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RW50aXR5QmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW50aXR5QmVhbihDb250YWluZXJNYW5hZ2VkRW50aXR5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldFJvbGVTb3VyY2VfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU2Vzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1Nlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwMTdiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU2Vzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0KLQotCi0KLS8qKgotICogVGhlIHNlc3Npb24gZWxlbWVudCBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjogYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IG9wdGlvbmFsIGRpc3BsYXkgbmFtZTsgb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lOyBhIG5hbWUgYXNzaWduZWQKLSAqIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRpb247IHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueTsgdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzLCBpZiBhbnk7IHRoZSBzZXNzaW9uIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzczsgdGhlIHNlc3Npb24gYmVhbidzIHN0YXRlIG1hbmFnZW1lbnQgdHlwZTsgdGhlIHNlc3Npb24gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZTsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudCBlbnRyaWVzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQiByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlczsgYW5kIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4gVGhlIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgd2hlbiBpZiBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2Vzc2lvbiBleHRlbmRzIEVudGVycHJpc2VCZWFuewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUcmFuc2FjdGlvblR5cGUgYXR0cmlidXRlCi0JICogVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24KLQkgKiBtYW5hZ2VtZW50IHR5cGUuCi0JICogCi0KLQkgKi8KLQlUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZQotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb24jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBTZXNzaW9uVHlwZSBhdHRyaWJ1dGUKLQkgKi8KLQlTZXNzaW9uVHlwZSBnZXRTZXNzaW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb24jZ2V0U2Vzc2lvblR5cGUgPGVtPlNlc3Npb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2Vzc2lvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uVHlwZQotCSAqIEBzZWUgI2lzU2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI2dldFNlc3Npb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXNzaW9uVHlwZShTZXNzaW9uVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uI2dldFNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI2dldFNlc3Npb25UeXBlKCkKLQkgKiBAc2VlICNzZXRTZXNzaW9uVHlwZShTZXNzaW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNlc3Npb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uI2dldFNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlc3Npb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI2dldFNlc3Npb25UeXBlKCkKLQkgKiBAc2VlICNzZXRTZXNzaW9uVHlwZShTZXNzaW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNlc3Npb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiBUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IGNvbnRhaW5zIHRoZQotCSAqICAgICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHdlYgotCSAqICAgICAgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIFRoZSBzZXJ2aWNlLWVuZHBvaW50Ci0JICogICAgICAgICBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYSBzdGF0ZWxlc3MKLQkgKiAgICAgICAgIHNlc3Npb24gYmVhbi4gVGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgbXVzdCBiZSBhCi0JICogICAgICAgICB2YWxpZCBKQVgtUlBDIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlRW5kcG9pbnQoSmF2YUNsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbl9TZXJ2aWNlRW5kcG9pbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbiNnZXRTZXJ2aWNlRW5kcG9pbnQgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VydmljZUVuZHBvaW50KEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIHNldCBKYXZhIENsYXNzIG5hbWUgdmlhIFN0cmluZwotCSAqIEBwYXJhbSBzZXJ2aWNlRW5kcG9pbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBTZXJ2aWNlRW5kcG9pbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnROYW1lKFN0cmluZyBzZXJ2aWNlRW5kcG9pbnROYW1lKTsKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFNlc3Npb24gYmVhbiBoYXMgYSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZQotCSAqIGludGVyZmFjZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTZXJ2aWNlRW5kcG9pbnQoKSA7Ci0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBnZXQgSmF2YSBDbGFzcyBuYW1lIAotCSAqIEByZXR1cm4gU3RyaW5nIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnROYW1lKCk7Ci0JCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1Nlc3Npb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU2Vzc2lvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5MWM3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU2Vzc2lvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIFNlc3Npb25UeXBlIHt9Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXNzaW9uVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURUZVTD0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURUxFU1M9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGF0ZWZ1bDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXRlZnVsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVRFRlVMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTVEFURUZVTF9MSVRFUkFMID0gbmV3IFNlc3Npb25UeXBlKFNUQVRFRlVMLCAiU3RhdGVmdWwiLCAiU3RhdGVmdWwiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhdGVsZXNzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhdGVsZXNzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVRFTEVTUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2Vzc2lvblR5cGUgU1RBVEVMRVNTX0xJVEVSQUwgPSBuZXcgU2Vzc2lvblR5cGUoU1RBVEVMRVNTLCAiU3RhdGVsZXNzIiwgIlN0YXRlbGVzcyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBTZXNzaW9uVHlwZVtdIHsKLQkJCVNUQVRFRlVMX0xJVEVSQUwsCi0JCQlTVEFURUxFU1NfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNlc3Npb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXNzaW9uVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVNlc3Npb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2Vzc2lvblR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlTZXNzaW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2Vzc2lvblR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFNUQVRFRlVMOiByZXR1cm4gU1RBVEVGVUxfTElURVJBTDsKLQkJCWNhc2UgU1RBVEVMRVNTOiByZXR1cm4gU1RBVEVMRVNTX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNlc3Npb25UeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9TZXNzaW9uVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1N1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjOGU3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIHt9Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVVJBQkxFPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTl9EVVJBQkxFPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RHVyYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkR1cmFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRFVSQUJMRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgRFVSQUJMRV9MSVRFUkFMID0gbmV3IFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kKERVUkFCTEUsICJEdXJhYmxlIiwgIkR1cmFibGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tm9uIER1cmFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Ob24gRHVyYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT05fRFVSQUJMRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgTk9OX0RVUkFCTEVfTElURVJBTCA9IG5ldyBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZChOT05fRFVSQUJMRSwgIk5vbkR1cmFibGUiLCAiTm9uRHVyYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHkgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRbXSB7Ci0JCQlEVVJBQkxFX0xJVEVSQUwsCi0JCQlOT05fRFVSQUJMRV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlN1YnNjcmlwdGlvbiBEdXJhYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlN1YnNjcmlwdGlvbiBEdXJhYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlN1YnNjcmlwdGlvbiBEdXJhYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIERVUkFCTEU6IHJldHVybiBEVVJBQkxFX0xJVEVSQUw7Ci0JCQljYXNlIE5PTl9EVVJBQkxFOiByZXR1cm4gTk9OX0RVUkFCTEVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1N1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MjhlYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIHt9Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1NVUFBPUlRFRD0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBQT1JUUz0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRD0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFU19ORVc9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFOREFUT1JZPSA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FVkVSPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tm90IFN1cHBvcnRlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5vdCBTdXBwb3J0ZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9UX1NVUFBPUlRFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIE5PVF9TVVBQT1JURURfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoTk9UX1NVUFBPUlRFRCwgIk5vdFN1cHBvcnRlZCIsICJOb3RTdXBwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3VwcG9ydHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TdXBwb3J0czwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVVBQT1JUUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIFNVUFBPUlRTX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKFNVUFBPUlRTLCAiU3VwcG9ydHMiLCAiU3VwcG9ydHMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVFVSVJFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIFJFUVVJUkVEX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKFJFUVVJUkVELCAiUmVxdWlyZWQiLCAiUmVxdWlyZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVxdWlyZXMgTmV3PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UmVxdWlyZXMgTmV3PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUVVJUkVTX05FVwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIFJFUVVJUkVTX05FV19MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShSRVFVSVJFU19ORVcsICJSZXF1aXJlc05ldyIsICJSZXF1aXJlc05ldyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5NYW5kYXRvcnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5NYW5kYXRvcnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTUFOREFUT1JZCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgTUFOREFUT1JZX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKE1BTkRBVE9SWSwgIk1hbmRhdG9yeSIsICJNYW5kYXRvcnkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TmV2ZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OZXZlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNORVZFUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIE5FVkVSX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKE5FVkVSLCAiTmV2ZXIiLCAiTmV2ZXIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlW10gewotCQkJTk9UX1NVUFBPUlRFRF9MSVRFUkFMLAotCQkJU1VQUE9SVFNfTElURVJBTCwKLQkJCVJFUVVJUkVEX0xJVEVSQUwsCi0JCQlSRVFVSVJFU19ORVdfTElURVJBTCwKLQkJCU1BTkRBVE9SWV9MSVRFUkFMLAotCQkJTkVWRVJfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOT1RfU1VQUE9SVEVEOiByZXR1cm4gTk9UX1NVUFBPUlRFRF9MSVRFUkFMOwotCQkJY2FzZSBTVVBQT1JUUzogcmV0dXJuIFNVUFBPUlRTX0xJVEVSQUw7Ci0JCQljYXNlIFJFUVVJUkVEOiByZXR1cm4gUkVRVUlSRURfTElURVJBTDsKLQkJCWNhc2UgUkVRVUlSRVNfTkVXOiByZXR1cm4gUkVRVUlSRVNfTkVXX0xJVEVSQUw7Ci0JCQljYXNlIE1BTkRBVE9SWTogcmV0dXJuIE1BTkRBVE9SWV9MSVRFUkFMOwotCQkJY2FzZSBORVZFUjogcmV0dXJuIE5FVkVSX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvVHJhbnNhY3Rpb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvVHJhbnNhY3Rpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzNjOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1RyYW5zYWN0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgVHJhbnNhY3Rpb25UeXBlIHt9Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc2FjdGlvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVBTj0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UQUlORVI9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QmVhbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNCRUFOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgQkVBTl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uVHlwZShCRUFOLCAiQmVhbiIsICJCZWFuIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UQUlORVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uVHlwZSBDT05UQUlORVJfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvblR5cGUoQ09OVEFJTkVSLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFRyYW5zYWN0aW9uVHlwZVtdIHsKLQkJCUJFQU5fTElURVJBTCwKLQkJCUNPTlRBSU5FUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25UeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHJhbnNhY3Rpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zYWN0aW9uVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVRyYW5zYWN0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSBwYXNzZXMgbGl0ZXJhbCB2YWx1ZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zYWN0aW9uVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQkVBTjogcmV0dXJuIEJFQU5fTElURVJBTDsKLQkJCWNhc2UgQ09OVEFJTkVSOiByZXR1cm4gQ09OVEFJTkVSX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vVHJhbnNhY3Rpb25UeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BYnN0cmFjdFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fic3RyYWN0UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2NmZGI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fic3RyYWN0UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciB7Ci0JLyoqCi0JICogQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJOb3RjYWNoZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IGdldFNvdXJjZVJvbGVzKGNtcCkuaXRlcmF0b3IoKTsKLQkJQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByb2xlOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlyb2xlID0gKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpIGl0Lm5leHQoKTsKLQkJCWF0dHJpYnV0ZXMuYWRkQWxsKHJvbGUuZ2V0QXR0cmlidXRlcygpKTsKLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb3BlciBsaXN0IG9mIHJvbGVzIGZyb20gY21wRXh0LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRTb3VyY2VSb2xlcygKLQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wRXh0KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fic3RyYWN0UmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BYnN0cmFjdFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDY1ZWJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fic3RyYWN0UmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvMTUvMjAwMSAxMTozNzoxOSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIGV4dGVuZHMgQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciB7Ci0vKioKLSAqIEFic3RyYWN0UmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBBYnN0cmFjdFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlcigpIHsKLQlzdXBlcigpOwotfQotcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlMaXN0IGFsbFJvbGVzID0gZ2V0Um9sZXNUb0ZpbHRlcihjbXApOwotCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCXJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgYWxsUm9sZXMuZ2V0KGkpOwotCQlpZiAoc2hvdWxkQWRkRmlsdGVyZWRSZXN1bHQocm9sZSkpCi0JCQlyb2xlcy5hZGQocm9sZSk7Ci0JfQotCXJldHVybiByb2xlczsKLX0KLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRSb2xlc1RvRmlsdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSA7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBtdWx0aXBsaWNpdHkgZm9yIEBhUm9sZSBpcyByZXF1aXJlZC4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWRkRmlsdGVyZWRSZXN1bHQoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWJvb2xlYW4gcmVxdWlyZWQgPSBhUm9sZS5pc1JlcXVpcmVkKCk7Ci0JaWYgKHJlcXVpcmVkKSB7Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgb3Bwb3NpdGUgPSBhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpOwotCQlpZiAob3Bwb3NpdGUgIT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlLmlzUmVxdWlyZWQoKSAmJiAhYVJvbGUuaXNLZXkoKSkgewotCQkJCWlmIChvcHBvc2l0ZS5pc0tleSgpIHx8IGFSb2xlLmlzTWFueSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKCFvcHBvc2l0ZS5pc01hbnkoKSkKLQkJCQkJLy9ib3RoIGFyZSBzaW5nbGUgYW5kIG5vdCBrZXkKLQkJCQkJcmV0dXJuIGFSb2xlLmlzRm9yd2FyZCgpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiByZXF1aXJlZDsKLX0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjVjZTU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwjZ2V0Q29uZmlnUHJvcGVydGllcyA8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdGlvbkNvbmZpZ0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBBY3RpdmF0aW9uQ29uZmlnIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25maWdQcm9wZXJ0aWVzKCkgPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb25maWdQcm9wZXJ0aWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3RpdmF0aW9uQ29uZmlnSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZBVElPTl9DT05GSUc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCWlmIChjb25maWdQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCWNvbmZpZ1Byb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19DT05GSUdfUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ1Byb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29uZmlnUHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJZ2V0Q29uZmlnUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGNvbmZpZ1Byb3BlcnRpZXMgIT0gbnVsbCAmJiAhY29uZmlnUHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0FjdGl2YXRpb25Db25maWdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNmJhYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQXNzZW1ibHlEZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQXNzZW1ibHlEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRiOGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fzc2VtYmx5RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLQotCi0vKioKLSAqIFRoZSBhc3NlbWJseS1kZXNjcmlwdG9yIGVsZW1lbnQgY29udGFpbnMgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4gQWxsIHRoZSBwYXJ0cyBhcmUgb3B0aW9uYWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIFByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlbWJseURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgQXNzZW1ibHlEZXNjcmlwdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RQZXJtaXNzaW9ucyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZFRyYW5zYWN0aW9ucyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlY3VyaXR5Um9sZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFeGNsdWRlTGlzdCBleGNsdWRlTGlzdCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkFTU0VNQkxZX0RFU0NSSVBUT1I7Ci0JfQotCi0vKioKLSAqIFJldHVybiB0aGUgZmlyc3QgbWV0aG9kIHBlcm1pc3Npb24gdGhhdCBjb250YWlucyBhbGwgdGhlIHJvbGVzIGluIHNlY3VyaXR5Um9sZXMgYW5kCi0gKiBpcyB0aGUgc2FtZSBzaXplCi0gKi8KLQotcHVibGljIE1ldGhvZFBlcm1pc3Npb24gZ2V0TWV0aG9kUGVybWlzc2lvbihMaXN0IHNlY3VyaXR5Um9sZXNMaXN0KSB7Ci0JTGlzdCBwZXJtaXNzaW9ucyA9IGdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0JTWV0aG9kUGVybWlzc2lvbiB0ZW1wID0gbnVsbDsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBlcm1pc3Npb25zLnNpemUoKTsgaSsrKSB7Ci0JCXRlbXAgPSAoTWV0aG9kUGVybWlzc2lvbikgcGVybWlzc2lvbnMuZ2V0KGkpOwotCQlpZiAodGVtcC5nZXRSb2xlcygpLmNvbnRhaW5zQWxsKHNlY3VyaXR5Um9sZXNMaXN0KSAmJiB0ZW1wLmdldFJvbGVzKCkuc2l6ZSgpID09IHNlY3VyaXR5Um9sZXNMaXN0LnNpemUoKSkKLQkJCXJldHVybiB0ZW1wOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBMaXN0IGdldE1ldGhvZFBlcm1pc3Npb25NZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCUxpc3QgYWxsTWV0aG9kRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JTGlzdCBwZXJtaXNzaW9ucyA9IGdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0JTWV0aG9kUGVybWlzc2lvbiBwZXJtaXNzaW9uOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGVybWlzc2lvbnMuc2l6ZSgpOyBpKyspewotCQlwZXJtaXNzaW9uID0gKE1ldGhvZFBlcm1pc3Npb24pIHBlcm1pc3Npb25zLmdldChpKTsKLQkJYWxsTWV0aG9kRWxlbWVudHMuYWRkQWxsKHBlcm1pc3Npb24uZ2V0TWV0aG9kRWxlbWVudHMoYW5FSkIpKTsgCi0JfQotCXJldHVybiBhbGxNZXRob2RFbGVtZW50czsKLX0KLQkKLQotcHVibGljIExpc3QgZ2V0TWV0aG9kVHJhbnNhY3Rpb25NZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCUxpc3QgYWxsTWV0aG9kRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JTGlzdCB0cmFuc2FjdGlvbnMgPSBnZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLQlNZXRob2RUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbjsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zYWN0aW9ucy5zaXplKCk7IGkrKyl7Ci0JCXRyYW5zYWN0aW9uID0gKE1ldGhvZFRyYW5zYWN0aW9uKSB0cmFuc2FjdGlvbnMuZ2V0KGkpOwotCQlhbGxNZXRob2RFbGVtZW50cy5hZGRBbGwodHJhbnNhY3Rpb24uZ2V0TWV0aG9kRWxlbWVudHMoYW5FSkIpKTsgCi0JfQotCXJldHVybiBhbGxNZXRob2RFbGVtZW50czsKLX0KLQkKLXB1YmxpYyBTZWN1cml0eVJvbGUgZ2V0U2VjdXJpdHlSb2xlTmFtZWQoU3RyaW5nIHJvbGVOYW1lKSB7Ci0JamF2YS51dGlsLkxpc3QgdGVtcFJvbGVzID0gZ2V0U2VjdXJpdHlSb2xlcygpOwotCVNlY3VyaXR5Um9sZSByb2xlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcFJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCXJvbGUgPSAoU2VjdXJpdHlSb2xlKSB0ZW1wUm9sZXMuZ2V0KGkpOwotCQlpZiAocm9sZS5nZXRSb2xlTmFtZSgpLmVxdWFscyhyb2xlTmFtZSkpCi0JCQlyZXR1cm4gcm9sZTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLS8qKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuQXNzZW1ibHlEZXNjcmlwdG9yCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmFtZVNlY3VyaXR5Um9sZShqYXZhLmxhbmcuU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIGphdmEubGFuZy5TdHJpbmcgbmV3Um9sZU5hbWUpIHsKLQlTZWN1cml0eVJvbGUgcm9sZSA9IGdldFNlY3VyaXR5Um9sZU5hbWVkKGV4aXN0aW5nUm9sZU5hbWUpOwotCXJvbGUuc2V0Um9sZU5hbWUobmV3Um9sZU5hbWUpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXRob2RQZXJtaXNzaW9ucygpIHsKLQkJaWYgKG1ldGhvZFBlcm1pc3Npb25zID09IG51bGwpIHsKLQkJCW1ldGhvZFBlcm1pc3Npb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlMsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1IpOwotCQl9Ci0JCXJldHVybiBtZXRob2RQZXJtaXNzaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZQotCSAqIGJlYW4ncyBtZXRob2QgaW52b2NhdGlvbnMuICBUaGUgZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYQotCSAqIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuVGhlIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZQotCSAqIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCkgewotCQlpZiAobWV0aG9kVHJhbnNhY3Rpb25zID09IG51bGwpIHsKLQkJCW1ldGhvZFRyYW5zYWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9UUkFOU0FDVElPTlMsIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kVHJhbnNhY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFSkJKYXIgZ2V0RWpiSmFyKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEVKQkphcillQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RWpiSmFyKEVKQkphciBuZXdFamJKYXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0VqYkphciwgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiSmFyKEVKQkphciBuZXdFamJKYXIpIHsKLQkJaWYgKG5ld0VqYkphciAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVIgJiYgbmV3RWpiSmFyICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RWpiSmFyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RWpiSmFyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0VqYkphcikuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SLCBFSkJKYXIuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RWpiSmFyKG5ld0VqYkphciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVIsIG5ld0VqYkphciwgbmV3RWpiSmFyKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlY3VyaXR5Um9sZXMoKSB7Ci0JCWlmIChzZWN1cml0eVJvbGVzID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlSb2xlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gc2VjdXJpdHlSb2xlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRXhjbHVkZUxpc3QgZ2V0RXhjbHVkZUxpc3QoKSB7Ci0JCXJldHVybiBleGNsdWRlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBuZXdFeGNsdWRlTGlzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlFeGNsdWRlTGlzdCBvbGRFeGNsdWRlTGlzdCA9IGV4Y2x1ZGVMaXN0OwotCQlleGNsdWRlTGlzdCA9IG5ld0V4Y2x1ZGVMaXN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCwgb2xkRXhjbHVkZUxpc3QsIG5ld0V4Y2x1ZGVMaXN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBuZXdFeGNsdWRlTGlzdCkgewotCQlpZiAobmV3RXhjbHVkZUxpc3QgIT0gZXhjbHVkZUxpc3QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4Y2x1ZGVMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4Y2x1ZGVMaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4Y2x1ZGVMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4Y2x1ZGVMaXN0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXhjbHVkZUxpc3QobmV3RXhjbHVkZUxpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1QsIG5ld0V4Y2x1ZGVMaXN0LCBuZXdFeGNsdWRlTGlzdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgewotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9ucyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZFBlcm1pc3Npb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRFamJKYXIoKEVKQkphcilvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RQZXJtaXNzaW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZFRyYW5zYWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRFamJKYXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RXhjbHVkZUxpc3QobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SLCBFSkJKYXIuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCXJldHVybiBnZXRNZXRob2RQZXJtaXNzaW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9UUkFOU0FDVElPTlM6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFRyYW5zYWN0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkphcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNUOgotCQkJCXJldHVybiBnZXRFeGNsdWRlTGlzdCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlM6Ci0JCQkJZ2V0TWV0aG9kUGVybWlzc2lvbnMoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBlcm1pc3Npb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUzoKLQkJCQlnZXRNZXRob2RUcmFuc2FjdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFRyYW5zYWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVI6Ci0JCQkJc2V0RWpiSmFyKChFSkJKYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNUOgotCQkJCXNldEV4Y2x1ZGVMaXN0KChFeGNsdWRlTGlzdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCWdldE1ldGhvZFBlcm1pc3Npb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUzoKLQkJCQlnZXRNZXRob2RUcmFuc2FjdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNUOgotCQkJCXNldEV4Y2x1ZGVMaXN0KChFeGNsdWRlTGlzdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCXJldHVybiBtZXRob2RQZXJtaXNzaW9ucyAhPSBudWxsICYmICFtZXRob2RQZXJtaXNzaW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUzoKLQkJCQlyZXR1cm4gbWV0aG9kVHJhbnNhY3Rpb25zICE9IG51bGwgJiYgIW1ldGhvZFRyYW5zYWN0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZ2V0RWpiSmFyKCkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlSb2xlcyAhPSBudWxsICYmICFzZWN1cml0eVJvbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJcmV0dXJuIGV4Y2x1ZGVMaXN0ICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgTWV0aG9kRWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNpbmcgQGFuRUpCLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURhdGEoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJaWYgKGFuRUpCICE9IG51bGwpIHsKLQkJCXJlbW92ZU1ldGhvZFBlcm1pc3Npb25EYXRhKGFuRUpCKTsKLQkJCXJlbW92ZU1ldGhvZFRyYW5zYWN0aW9uRGF0YShhbkVKQik7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmVtb3ZlIHRoZSBNZXRob2RFbGVtZW50cyB0aGF0IGFyZSByZWZlcmVuY2luZyBAYW5FSkIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWV0aG9kUGVybWlzc2lvbkRhdGEoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJTGlzdCBtZXMgPSBnZXRNZXRob2RQZXJtaXNzaW9uTWV0aG9kRWxlbWVudHMoYW5FSkIpOwotCQlNZXRob2RFbGVtZW50IG1lOwotCQlNZXRob2RQZXJtaXNzaW9uIG1wOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lcy5zaXplKCk7IGkrKyl7Ci0JCQltZSA9IChNZXRob2RFbGVtZW50KSBtZXMuZ2V0KGkpOwotCQkJbXAgPSAoTWV0aG9kUGVybWlzc2lvbiltZS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAobXAuZ2V0TWV0aG9kRWxlbWVudHMoKS5zaXplKCkgPT0gMSl7Ci0JCQkJRXh0ZW5kZWRFY29yZVV0aWwuYmVjb21lUHJveHkobXAsIG1wLmVSZXNvdXJjZSgpKTsKLQkJCQlnZXRNZXRob2RQZXJtaXNzaW9ucygpLnJlbW92ZShtcCk7Ci0JCQl9Ci0JCQllbHNlewotCQkJCUV4dGVuZGVkRWNvcmVVdGlsLmJlY29tZVByb3h5KG1lLCBtZS5lUmVzb3VyY2UoKSk7Ci0JCQkJbXAuZ2V0TWV0aG9kRWxlbWVudHMoKS5yZW1vdmUobWUpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIFJlbW92ZSB0aGUgTWV0aG9kRWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNpbmcgQGFuRUpCLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1ldGhvZFRyYW5zYWN0aW9uRGF0YShFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlMaXN0IG1lcyA9IGdldE1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHMoYW5FSkIpOwotCQlNZXRob2RFbGVtZW50IG1lOwotCQlNZXRob2RUcmFuc2FjdGlvbiBtdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXMuc2l6ZSgpOyBpKyspewotCQkJbWUgPSAoTWV0aG9kRWxlbWVudCkgbWVzLmdldChpKTsKLQkJCW10ID0gKE1ldGhvZFRyYW5zYWN0aW9uKW1lLmVDb250YWluZXIoKTsKLQkJCWlmIChtdC5nZXRNZXRob2RFbGVtZW50cygpLnNpemUoKSA9PSAxKXsKLQkJCQlFeHRlbmRlZEVjb3JlVXRpbC5iZWNvbWVQcm94eShtdCwgbXQuZVJlc291cmNlKCkpOwotCQkJCWdldE1ldGhvZFRyYW5zYWN0aW9ucygpLnJlbW92ZShtdCk7Ci0JCQl9Ci0JCQllbHNlewotCQkJCUV4dGVuZGVkRWNvcmVVdGlsLmJlY29tZVByb3h5KG1lLCBtZS5lUmVzb3VyY2UoKSk7CQotCQkJCW10LmdldE1ldGhvZEVsZW1lbnRzKCkucmVtb3ZlKG1lKTsKLQkJCX0KLQkJfQotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUEF0dHJpYnV0ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUEF0dHJpYnV0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc2NjhlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVBBdHRyaWJ1dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVBdHRyaWJ1dGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZSBmaWVsZCBlbGVtZW50IGluY2x1ZGVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwgYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLQotICovCi1wdWJsaWMgY2xhc3MgQ01QQXR0cmlidXRlSW1wbCBleHRlbmRzIEVBdHRyaWJ1dGVJbXBsIGltcGxlbWVudHMgQ01QQXR0cmlidXRlLCBFQXR0cmlidXRlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCXByb3RlY3RlZCB0cmFuc2llbnQgSmF2YUhlbHBlcnMgb3JpZ2luYXRpbmdUeXBlOwotCXByb3RlY3RlZCB0cmFuc2llbnQgQ01QQXR0cmlidXRlIHRhcmdldEF0dHJpYnV0ZTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVyaXZlZDsKLQkKLQlwdWJsaWMgQ01QQXR0cmlidXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkNNUF9BVFRSSUJVVEU7Ci0JfQotCi1wcm90ZWN0ZWQgRmllbGQgZmluZEV4aXN0aW5nRmllbGQoKSB7Ci0JSmF2YUNsYXNzIGphdmFDbGFzcyA9IGdldEVqYkNsYXNzKCk7Ci0JaWYgKGphdmFDbGFzcyAhPSBudWxsKQotCQlyZXR1cm4gamF2YUNsYXNzLmdldEZpZWxkRXh0ZW5kZWQoZ2V0TmFtZSgpKTsKLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXIgZ2V0QWNjZXNzb3JUeXBlKCkgewotCWlmIChnZXRFamJDbGFzcygpICE9IG51bGwpIHsKLQkJTWV0aG9kIGdldHRlciA9IGdldEVqYkNsYXNzKCkuZ2V0TWV0aG9kRXh0ZW5kZWQoZ2V0R2V0dGVyTmFtZSgpLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJaWYgKGdldHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGdldHRlci5nZXRSZXR1cm5UeXBlKCk7Ci0JfQotCXJldHVybiBudWxsOwotfQotcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0Q01QRW50aXR5KCkgewotCXJldHVybiAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgZUNvbnRhaW5lcigpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIEVqYkNsYXNzIGZyb20gdGhlIENNUCBFbnRpdHkuCi0gKi8KLQotcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRFamJDbGFzcygpIHsKLQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVqYiA9IGdldENNUEVudGl0eSgpOwotCXJldHVybiBlamIgPT0gbnVsbCA/IG51bGwgOiBlamIuZ2V0RWpiQ2xhc3MoKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBLZXlDbGFzcyBmcm9tIHRoZSBDTVAgRW50aXR5LgotICovCi0KLXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0S2V5Q2xhc3MoKSB7Ci0JQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlamIgPSBnZXRDTVBFbnRpdHkoKTsKLQlyZXR1cm4gZWpiID09IG51bGwgPyBudWxsIDogZWpiLmdldFByaW1hcnlLZXkoKTsKLX0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSBXaXRoIEVKQiAyLjAsIGFzc3VtaW5nIGEgSmF2YSBmaWVsZCBpcyBubyBsb25nZXIgc2FmZS4KLSAqIAkJVXNlIGdldFR5cGUoKSBhbmQgZ2V0TmFtZSgpIHRvIGdldCB0aGUgbW9zdCBjb21tb24gZmllbGQgaW5mby4KLSAqCQlPciB1c2UgZ2V0RWpiQ2xhc3MoKSB0byBnZXQgYWRkaXRpb25hbCBKYXZhIGluZm8uCi0gKi8KLQotIHB1YmxpYyBGaWVsZCBnZXRGaWVsZCgpIHsKLQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVqYiA9IGdldENNUEVudGl0eSgpOwotCQotCWlmKGVqYiA9PSBudWxsKQotCQlyZXR1cm4gbnVsbDsKLQotCUZpZWxkIGZpZWxkID0gbnVsbDsKLQlzd2l0Y2goZWpiLmdldFZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOgotCQkJZmllbGQgPSBmaW5kRXhpc3RpbmdGaWVsZCgpOwotCQkJLy9TZXQgdGhlIGZpZWxkIHR5cGUgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZSB0eXBlIGlmIG5lY2Vzc2FyeQotCQkJaWYgKGZpZWxkICE9IG51bGwgJiYgZ2V0RVR5cGUoKSAhPSBudWxsICYmIGZpZWxkLmdldEVUeXBlKCkgPT0gbnVsbCkKLQkJCQlmaWVsZC5zZXRFVHlwZShnZXRFVHlwZSgpKTsgCi0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ6IGRlZmF1bHQ6Ci0JCQlmaWVsZCA9ICgoSmF2YVJlZlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSkpLmdldEphdmFSZWZGYWN0b3J5KCkuY3JlYXRlRmllbGQoKTsKLQkJCWZpZWxkLnNldE5hbWUoZ2V0TmFtZSgpKTsKLQkJCWZpZWxkLnNldEVUeXBlKGdldEFjY2Vzc29yVHlwZSgpKTsKLQkJCWJyZWFrOyAKLQl9Ci0JcmV0dXJuIGZpZWxkOwotfQotcHVibGljIFN0cmluZyBnZXRHZXR0ZXJOYW1lKCkgewotCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCJnZXQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWIuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShuYW1lLmNoYXJBdCgwKSkpLmFwcGVuZChuYW1lLmxlbmd0aCgpID4gMSA/IG5hbWUuc3Vic3RyaW5nKDEpIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBiLnRvU3RyaW5nKCk7Ci0JfQotCXJldHVybiBuYW1lOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBhdHRyaWJ1dGUgaW4gaXRzIG9yaWdpbmFsIGZvcm0gKGkuZS4sIHVud3JhcHBlZCBpZgotICogdGhlIHR5cGUgaGFzIGJlZW4gd3JhcHBlZCkuCi0gKi8KLXB1YmxpYyBKYXZhSGVscGVycyBnZXRPcmlnaW5hdGluZ1R5cGUoKSB7Ci0JcmV0dXJuIG9yaWdpbmF0aW5nVHlwZTsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyTmFtZSgpIHsKLQlyZXR1cm4gInNldCIgKyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoZ2V0TmFtZSgpLmNoYXJBdCgwKSkgKyAoZ2V0TmFtZSgpLmxlbmd0aCgpID4gMSA/IGdldE5hbWUoKS5zdWJzdHJpbmcoMSkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotfQotcHVibGljIEphdmFIZWxwZXJzIGdldFR5cGUoKSB7Ci0JaWYgKGdldEVUeXBlKCkgIT0gbnVsbCkKLQkJcmV0dXJuIChKYXZhSGVscGVycykgZ2V0RVR5cGUoKTsKLQkvLyBCZSBzZW5zaXRpdmUgdG8gQ01QIDIuMCBiZWFucywgZ2V0IHR5cGUgZnJvbSBmaWVsZCBvciBnZXQgYWNjZXNzb3IgdHlwZQotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZWpiID0gZ2V0Q01QRW50aXR5KCk7Ci0JUmVzb3VyY2UgcmVzID0gZVJlc291cmNlKCk7Ci0JYm9vbGVhbiBtb2RGbGFnID0gcmVzID09IG51bGwgPyBmYWxzZSA6IHJlcy5pc01vZGlmaWVkKCk7Ci0JYm9vbGVhbiBkZWxpdmVyeUZsYWcgPSBlRGVsaXZlcigpOwotCXRyeSB7Ci0JCWVTZXREZWxpdmVyKGZhbHNlKTsKLQkJaWYoZWpiICE9IG51bGwpIHsKLQkJCXN3aXRjaChlamIuZ2V0VmVyc2lvbklEKCkpIHsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQ6Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOgotCQkJCQlzZXRFVHlwZShnZXRUeXBlRnJvbUJlYW5GaWVsZCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOgotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDogZGVmYXVsdDoKLQkJCQkJc2V0RVR5cGUoZ2V0MjBUeXBlKCkpOwotCQkJCQlicmVhazsgCi0JCQl9IAotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZVNldERlbGl2ZXIoZGVsaXZlcnlGbGFnKTsKLQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5pc1RyYWNraW5nTW9kaWZpY2F0aW9uKCkpCi0JCQlyZXMuc2V0TW9kaWZpZWQobW9kRmxhZyk7Ci0JfQotCXJldHVybiAoSmF2YUhlbHBlcnMpIGdldEVUeXBlKCk7Ci19Ci1wcm90ZWN0ZWQgRUNsYXNzaWZpZXIgZ2V0VHlwZUZyb21CZWFuRmllbGQoKSB7Ci0JRUNsYXNzaWZpZXIgdHlwZSA9IG51bGw7Ci0JRmllbGQgZmllbGQgPSBnZXRGaWVsZCgpOwotCWlmIChmaWVsZCAhPSBudWxsKQotCQl0eXBlID0gZmllbGQuZ2V0RVR5cGUoKTsKLQlpZiAodHlwZSA9PSBudWxsKQotCQl0eXBlID0gZ2V0S2V5RmllbGRUeXBlRnJvbUtleUNsYXNzKCk7Ci0JcmV0dXJuIHR5cGU7Ci19Ci1wdWJsaWMgRUNsYXNzaWZpZXIgZ2V0MjBUeXBlKCkgewotCUVDbGFzc2lmaWVyIHR5cGUgPSBudWxsOwotCWlmIChnZXRFamJDbGFzcygpICE9IG51bGwpIHsKLQkJU3RyaW5nIGdldHRlck5hbWUgPSBnZXRHZXR0ZXJOYW1lKCk7Ci0JCWlmIChnZXR0ZXJOYW1lICE9IG51bGwgJiYgZ2V0dGVyTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCU1ldGhvZCBnZXR0ZXIgPSBnZXRFamJDbGFzcygpLmdldE1ldGhvZEV4dGVuZGVkKGdldHRlck5hbWUsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCQkJaWYgKGdldHRlciAhPSBudWxsKQotCQkJCXR5cGUgPSBnZXR0ZXIuZ2V0UmV0dXJuVHlwZSgpOwotCQl9Ci0JfQotCWlmICh0eXBlID09IG51bGwpCi0JCXR5cGUgPSBnZXRLZXlGaWVsZFR5cGVGcm9tS2V5Q2xhc3MoKTsKLQlyZXR1cm4gdHlwZTsJCi19Ci0vKioKLSAqIEByZXR1cm4KLSAqLwotcHJpdmF0ZSBFQ2xhc3NpZmllciBnZXRLZXlGaWVsZFR5cGVGcm9tS2V5Q2xhc3MoKSB7Ci0JaWYgKGlzS2V5KCkpIHsKLQkJSmF2YUNsYXNzIGtleSA9IGdldENNUEVudGl0eSgpLmdldFByaW1hcnlLZXkoKTsKLQkJaWYgKGtleSAhPSBudWxsICYmIGtleS5nZXRRdWFsaWZpZWROYW1lKCkgIT0gbnVsbCAmJiAha2V5LmdldFF1YWxpZmllZE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhLmxhbmciKSkgeyAvLyROT04tTkxTLTEkCi0JCQlGaWVsZCBmaWVsZCA9IGtleS5nZXRGaWVsZEV4dGVuZGVkKGdldE5hbWUoKSk7Ci0JCQlpZiAoZmllbGQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmllbGQuZ2V0RVR5cGUoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4ga2V5OwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBib29sZWFuIGlzQ01SRmllbGQoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotcHVibGljIGJvb2xlYW4gaXNLZXkoKSB7Ci0JcmV0dXJuIGdldENNUEVudGl0eSgpID09IG51bGwgPyBmYWxzZSA6IGdldENNUEVudGl0eSgpLmlzS2V5QXR0cmlidXRlKHRoaXMpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1LZXlGaWVsZCgpewotCXJldHVybiBnZXRDTVBFbnRpdHkoKSA9PSBudWxsID8gZmFsc2UgOiBnZXRDTVBFbnRpdHkoKS5nZXRQcmltS2V5RmllbGQoKSA9PSB0aGlzOwotfQotCi1wdWJsaWMgdm9pZCBzZXRPcmlnaW5hdGluZ1R5cGUoSmF2YUhlbHBlcnMgbmV3T3JpZ2luYXRpbmdUeXBlKSB7Ci0Jb3JpZ2luYXRpbmdUeXBlID0gbmV3T3JpZ2luYXRpbmdUeXBlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGNtciBmaWVsZC4KLQkgKiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpICsgIiA6OiAiICsgZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhIHRhcmdldEF0dHJpYnV0ZSBpcyBiZWluZyB1c2VkLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rlcml2ZWQoKSB7Ci0JCXJldHVybiBkZXJpdmVkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXREZXJpdmVkKGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJaWYgKGFCb29sZWFuICYmIGdldEVUeXBlKCkgPT0gbnVsbCkKLQkJCWdldFR5cGUoKTsgLy9UaGlzIGVuc3VyZXMgdGhhdCB0aGUgdHlwZSBpcyBzZXQuCi0JCWRlcml2ZWQgPSBhQm9vbGVhbjsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ0dlbigpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ01SRmllbGRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVJGaWVsZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1MmE0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVJGaWVsZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBiZWFuIHByb3ZpZGVyJ3MgdmlldyBvZiBhIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBhbmQgdGhlIGNsYXNzIHR5cGUgb2YgYSBmaWVsZCBpbiB0aGUgc291cmNlIG9mIGEgcm9sZSBvZiBhIHJlbGF0aW9uc2hpcC4gVGhlIENNUkZpZWxkOjpuYW1lIGVsZW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yIG1ldGhvZHMgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBDTVJGaWVsZDo6dHlwZSBlbGVtZW50IGlzIHVzZWQgb25seSBmb3IgY29sbGVjdGlvbi12YWx1ZWQgQ01SRmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBpcyB1c2VkIChhIGphdmEgY2xhc3MgbmFtZSkuCi0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENNUkZpZWxkSW1wbCBleHRlbmRzIENNUEF0dHJpYnV0ZUltcGwgaW1wbGVtZW50cyBDTVJGaWVsZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGNvbGxlY3Rpb25UeXBlID0gbnVsbDsKLQlwdWJsaWMgQ01SRmllbGRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQ01SX0ZJRUxEOwotCX0KLQotLyoqCi0gKiBjcmVhdGVDbGFzc1JlZiAtIHJldHVybiBhIEphdmFVUkwgcmVmZXJlbmNlIHRvIHRoZSBuYW1lZCBKYXZhIGNsYXNzCi0gKi8KLXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKHRhcmdldE5hbWUpOwotfQotcHVibGljIFN0cmluZyBnZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSB7Ci0JZ2V0Q29sbGVjdGlvblR5cGUoKTsKLQlyZXR1cm4gY29sbGVjdGlvblR5cGUgPT0gbnVsbCA/IG51bGwgOiBjb2xsZWN0aW9uVHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci19ICAgICAgICAgIAotCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1LZXlGaWVsZCgpewotCXJldHVybiBmYWxzZTsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNDTVJGaWVsZCgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLXB1YmxpYyB2b2lkIHNldENvbGxlY3Rpb25UeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKLQllU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldENNUkZpZWxkX0NvbGxlY3Rpb25UeXBlKCksIGNyZWF0ZUNsYXNzUmVmKHR5cGVOYW1lKSk7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEUpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEVKQlJlbGF0aW9uc2hpcFJvbGUpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBuZXdSb2xlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdSb2xlLCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRSwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBuZXdSb2xlKSB7Ci0JCWlmIChuZXdSb2xlICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFICYmIG5ld1JvbGUgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdSb2xlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3Um9sZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSb2xlKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxELCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJvbGUobmV3Um9sZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRSwgbmV3Um9sZSwgbmV3Um9sZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0Q29sbGVjdGlvblR5cGUoKSB7Ci0JCWlmIChjb2xsZWN0aW9uVHlwZSAhPSBudWxsICYmIGNvbGxlY3Rpb25UeXBlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRDb2xsZWN0aW9uVHlwZSA9IChJbnRlcm5hbEVPYmplY3QpY29sbGVjdGlvblR5cGU7Ci0JCQljb2xsZWN0aW9uVHlwZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRDb2xsZWN0aW9uVHlwZSk7Ci0JCQlpZiAoY29sbGVjdGlvblR5cGUgIT0gb2xkQ29sbGVjdGlvblR5cGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ09MTEVDVElPTl9UWVBFLCBvbGRDb2xsZWN0aW9uVHlwZSwgY29sbGVjdGlvblR5cGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sbGVjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldENvbGxlY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gY29sbGVjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvblR5cGUoSmF2YUNsYXNzIG5ld0NvbGxlY3Rpb25UeXBlKSB7Ci0JCUphdmFDbGFzcyBvbGRDb2xsZWN0aW9uVHlwZSA9IGNvbGxlY3Rpb25UeXBlOwotCQljb2xsZWN0aW9uVHlwZSA9IG5ld0NvbGxlY3Rpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ09MTEVDVElPTl9UWVBFLCBvbGRDb2xsZWN0aW9uVHlwZSwgY29sbGVjdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRSb2xlKChFSkJSZWxhdGlvbnNoaXBSb2xlKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRSb2xlKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEU6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DT0xMRUNUSU9OX1RZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRDb2xsZWN0aW9uVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldENvbGxlY3Rpb25UeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEU6Ci0JCQkJc2V0Um9sZSgoRUpCUmVsYXRpb25zaGlwUm9sZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ09MTEVDVElPTl9UWVBFOgotCQkJCXNldENvbGxlY3Rpb25UeXBlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgotCQkJCXNldFJvbGUoKEVKQlJlbGF0aW9uc2hpcFJvbGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ09MTEVDVElPTl9UWVBFOgotCQkJCXNldENvbGxlY3Rpb25UeXBlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0NPTExFQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gY29sbGVjdGlvblR5cGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVBBdHRyaWJ1dGVJbXBsI2dldENNUEVudGl0eSgpCi0JICovCi0JcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0Q01QRW50aXR5KCkgewotCQlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUgPSBnZXRSb2xlKCk7Ci0JCWlmIChyb2xlICE9IG51bGwpCi0JCQlyZXR1cm4gcm9sZS5nZXRTb3VyY2VFbnRpdHkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3ZDc5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCRXh0ZW5zaW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5JRUpCTW9kZWxFeHRlbmRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIGltcGxlbWVudHMgRUpCRXh0ZW5zaW9uRmlsdGVyIHsKLSAJCi0JcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWw8Q01QQ2FjaGU+IF9jYWNoZSA9IG5ldyBUaHJlYWRMb2NhbDxDTVBDYWNoZT4oKTsKLQotICAgIHB1YmxpYyBMaXN0IGZpbHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCl7Ci0gICAgCUxpc3QgbGlzdCA9IGdldENhY2hlKHRoaXMsIGNtcCk7Ci0gICAgCWlmIChsaXN0ICE9IG51bGwpcmV0dXJuIGxpc3Q7Ci0gICAgCQotICAgIAlsaXN0ID0gZmlsdGVyTm90Y2FjaGVkKGNtcCk7Ci0gICAgCXNldENhY2hlKHRoaXMsIGNtcCwgbGlzdCk7Ci0gICAgCXJldHVybiBsaXN0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTdWJjbGFzc2VzIHRoYXQgZG9uJ3QgaW1wbGVtZW50IHRoZSBmaWx0ZXIgbWV0aG9kIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgCi0gICAgICogdG8gcHJvdmlkZWQgdGhlIGZpbHRlcmVkIHJlc3VsdHMuIAotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGZpbHRlck5vdGNhY2hlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCl7Ci0gICAgCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsIENNUEF0dHJpYnV0ZUZpbHRlcnMgb25seSBvcGVyYXRlIG9uIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24KLSAgICAgKiBvYmplY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGZpbHRlcihFbnRlcnByaXNlQmVhbiBlamIpIHsKLSAgICAgICAgaWYgKGVqYi5pc0VudGl0eSgpICYmICgoRW50aXR5KSBlamIpLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSByZXR1cm4gZmlsdGVyKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBlamIpOwotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbHRlclJvbGVBdHRyaWJ1dGVzQnlOYW1lKExpc3QgYWxsQXR0cmlidXRlcywgTGlzdCByb2xlQXR0cmlidXRlcykgewotICAgICAgICBpZiAoIXJvbGVBdHRyaWJ1dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaW50IGFsbFNpemUsIHJvbGVTaXplOwotICAgICAgICAgICAgcm9sZVNpemUgPSByb2xlQXR0cmlidXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBDTVBBdHRyaWJ1dGUgcm9sZUF0dCwgYWxsQXR0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcm9sZUF0dCA9IChDTVBBdHRyaWJ1dGUpIHJvbGVBdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBhbGxTaXplID0gYWxsQXR0cmlidXRlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGFsbFNpemUgLSAxOyBqICE9IC0xOyBqLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgYWxsQXR0ID0gKENNUEF0dHJpYnV0ZSkgYWxsQXR0cmlidXRlcy5nZXQoaik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlQXR0ID09IGFsbEF0dCB8fCByb2xlQXR0LmdldE5hbWUoKS5lcXVhbHMoYWxsQXR0LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbEF0dHJpYnV0ZXMucmVtb3ZlKGopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGdldEVqYk1vZHVsZUV4dEhlbHBlcihPYmplY3QgY29udGV4dCkgewotICAgICAgICByZXR1cm4gSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLklOU1RBTkNFLmdldEVKQk1vZHVsZUV4dGVuc2lvbihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRMb2NhbFJlbGF0aW9uc2hpcFJvbGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0gICAgICAgIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBtb2RlbEV4dGVuZGVyID0gbnVsbDsKLSAgICAgICAgaWYgKGNtcC5nZXRWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKQotICAgICAgICAgICAgcmV0dXJuIGNtcC5nZXRSb2xlcygpOwotICAgICAgICBlbHNlIGlmICggKG1vZGVsRXh0ZW5kZXIgPSBnZXRFamJNb2R1bGVFeHRIZWxwZXIoY21wKSkgIT0gbnVsbCApewotICAgICAgICAgICAgcmV0dXJuIG1vZGVsRXh0ZW5kZXIuZ2V0TG9jYWxSZWxhdGlvbnNoaXBSb2xlc19jbXAxMShjbXApOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0UmVsYXRpb25zaGlwUm9sZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsgCi0gICAgICAgIExpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7IAotICAgICAgICBjb2xsZWN0UmVsYXRpb25zaGlwUm9sZXMoY21wLCBnZXRFamJNb2R1bGVFeHRIZWxwZXIoY21wKSwgcm9sZXMpOwotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyb2xlcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNvbGxlY3RSZWxhdGlvbnNoaXBSb2xlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCwgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGV4dGVuc2lvbkhlbHBlciwgTGlzdCBjb250YWluZXJMaXN0KSB7Ci0gICAgICAgIGlmKGNtcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjb250YWluZXJMaXN0LmFkZEFsbChnZXRMb2NhbFJlbGF0aW9uc2hpcFJvbGVzKGNtcCkpOwotICAgICAgICBpZihleHRlbnNpb25IZWxwZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGNvbGxlY3RSZWxhdGlvbnNoaXBSb2xlcygoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgZXh0ZW5zaW9uSGVscGVyLmdldFN1cGVyVHlwZShjbXApLCBleHRlbnNpb25IZWxwZXIsIGNvbnRhaW5lckxpc3QpOyAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBjYWNoZSBhbmQgdHVybiBvZmYgY2FjaGluZy4KLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCl7Ci0JCWlmIChfY2FjaGUgPT0gbnVsbClyZXR1cm47Ci0JCWdldENhY2hlKCkuY2xlYXIoKTsKLQkJZ2V0Q2FjaGUoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2FjaGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciBmaWx0ZXIsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBMaXN0IGxpc3QpIHsKLQkJZ2V0Q2FjaGUoKS5zZXQoZmlsdGVyLCBjbXAsIGxpc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q2FjaGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciBmaWx0ZXIsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCXJldHVybiBnZXRDYWNoZSgpLmdldChmaWx0ZXIsIGNtcCk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgQ01QQ2FjaGUgZm9yIHRoaXMgdGhyZWFkLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENNUENhY2hlIGdldENhY2hlKCl7Ci0JCUNNUENhY2hlIGNhY2hlID0gX2NhY2hlLmdldCgpOwotCQlpZiAoY2FjaGUgPT0gbnVsbCl7Ci0JCQljYWNoZSA9IG5ldyBDTVBDYWNoZSgpOwotCQkJX2NhY2hlLnNldChjYWNoZSk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgKHdpdGggdGhlIHBhcmFtZXRlciB0cnVlKSBpZiB5b3Ugd2lzaCB0aGUgCi0JICogZmlsdGVyIHJlc3VsdHMgdG8gYmUgY2FjaGVkLiBCeSBkZWZhdWx0IHRoZSByZXN1bHRzIGFyZSBub3QgY2FjaGVkLgotCSAqIDxwPgotCSAqIFRoZSBjYWNoZSBpcyB0aHJlYWQgYmFzZWQuIFdoZW4gZG9uZSB0aGUgY2xlYXJDYWNoZSBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaXNFbmFibGVkIHNldCB0aGlzIHRvIHRydWUgdG8gaGF2ZSB0aGUgZmlsdGVyIHJlc3VsdHMgY2FjaGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZUNhY2hlKGJvb2xlYW4gaXNFbmFibGVkKXsKLQkJZ2V0Q2FjaGUoKS5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogS2VlcCBhIHRocmVhZCBsb2NhbCBjYWNoZSBvZiBmaWx0ZXJlZCByZXN1bHRzLgotICAgICAqIEBhdXRob3Iga2FyYXNpdWsKLSAgICAgKgotICAgICAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENNUENhY2hlIHsKLQkJCi0JCS8qCi0JCSAqIFdlIGRpc2NvdmVyZWQgc29tZSB2ZXJ5IGRlZXAgY29kZSBwYXRocyB3aGVuIHZhbGlkYXRpbmcgRUpCcy4gSW4gb25lIGV4YW1wbGUgcHJvamVjdCB0aGF0IAotCQkgKiBvbmx5IGhhZCBhIGZldyBiZWFucywgaXQgdG9vayAxMiBob3VycyB0byB2YWxpZGF0ZS4gS2VlcGluZyBhIGNhY2hlIGR1cmluZyB2YWxpZGF0aW9uCi0JCSAqIHJlZHVjZWQgdGhlIHRpbWUgdG8gc2Vjb25kcy4KLQkJICovCi0JCQotCQlwcml2YXRlIE1hcCAJCV9tYXAgPSBuZXcgSGFzaE1hcCgzMCk7Ci0JCQotCQkvKiogSXMgdGhlIGNhY2hlIHR1cm5lZCBvbiwgYnkgZGVmYXVsdCBpdCBpcyBub3QuICovCi0JCXByaXZhdGUgYm9vbGVhbgkJX2VuYWJsZWQ7Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKXsKLQkJCV9lbmFibGVkID0gaXNFbmFibGVkOwotCQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0KENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgZmlsdGVyLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQkJaWYgKCFfZW5hYmxlZClyZXR1cm4gbnVsbDsKLQkJCQotCQkJTWFwIG1hcCA9IChNYXApX21hcC5nZXQoZmlsdGVyKTsKLQkJCWlmIChtYXAgPT0gbnVsbCl7Ci0JCQkJbWFwID0gbmV3IEhhc2hNYXAoMTAwKTsKLQkJCQlfbWFwLnB1dChmaWx0ZXIsIG1hcCk7Ci0JCQl9Ci0JCQlyZXR1cm4gKExpc3QpbWFwLmdldChjbXApOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0KENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgZmlsdGVyLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCwgTGlzdCBsaXN0KSB7Ci0JCQlpZiAoIV9lbmFibGVkKXJldHVybjsgCi0JCQkKLQkJCU1hcCBtYXAgPSAoTWFwKV9tYXAuZ2V0KGZpbHRlcik7Ci0JCQlpZiAobWFwID09IG51bGwpewotCQkJCW1hcCA9IG5ldyBIYXNoTWFwKDEwMCk7Ci0JCQkJX21hcC5wdXQoZmlsdGVyLCBtYXApOwotCQkJfQotCQkJCi0JCQltYXAucHV0KGNtcCwgbGlzdCk7CQkJCi0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCl7Ci0JCQlfbWFwLmNsZWFyKCk7Ci0JCX0KLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJNYW5hZ2VkRW50aXR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFiZjBhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJNYW5hZ2VkRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJFeHRlbnNpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWwuQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsIGV4dGVuZHMgRW50aXR5SW1wbCBpbXBsZW1lbnRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIjEueCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBFQ2xhc3NpZmllciBmR2VuZXJhdGVkSWRUeXBlID0gbnVsbDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTX0ZFQVRVUkVfQ0hOR19OT1RJRklFUiA9ICJQZXJzaXN0ZW50RmVhdHVyZUNoYW5nZU5vdGlmaWNhdGlvbkFkYXB0ZXIiOwkgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX01FVEhPRF9OQU1FID0gIlF1ZXJ5TWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkRfQllfUFJJTV9LRVlfTUVUSE9EX05BTUUgPSAiZmluZEJ5UHJpbWFyeUtleSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSA8ZW0+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFic3RyYWN0U2NoZW1hTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJTVFJBQ1RfU0NIRU1BX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhYnN0cmFjdFNjaGVtYU5hbWUgPSBBQlNUUkFDVF9TQ0hFTUFfTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBrZXlBdHRyaWJ1dGVzID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyaWVzKCkgPGVtPlF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHF1ZXJpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q01QQXR0cmlidXRlKCkgPGVtPkNNUCBBdHRyaWJ1dGU8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q01QQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY21wQXR0cmlidXRlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByaW1LZXlGaWVsZCgpIDxlbT5QcmltIEtleSBGaWVsZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJpbUtleUZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ01QQXR0cmlidXRlIHByaW1LZXlGaWVsZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFk7Ci0JfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBdHRyaWJ1dGVFeHRuIHdpdGggYU5hbWUgYW5kIGFkZCBpdCB0byB0aGUga2V5RmVhdHVyZXMuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8yLzIwMDAgOToxMToxMyBQTSkKLSAqIEBwYXJhbSBhTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKiBAcmV0dXJuIENNUEF0dHJpYnV0ZQotICovCi1wdWJsaWMgQ01QQXR0cmlidXRlIGFkZEtleUF0dHJpYnV0ZU5hbWUoU3RyaW5nIGFOYW1lKSB7Ci0JQ01QQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoYU5hbWUpOwotCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotCQlMaXN0IGtleXMgPSBnZXRLZXlBdHRyaWJ1dGVzKCk7Ci0JCUNNUEF0dHJpYnV0ZSBrZXk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5zaXplKCk7IGkrKykgewotCQkJa2V5ID0gKENNUEF0dHJpYnV0ZSkga2V5cy5nZXQoaSk7Ci0JCQlpZiAoYU5hbWUuZXF1YWxzKGtleS5nZXROYW1lKCkpKQotCQkJCXJldHVybiBhdHRyaWJ1dGU7Ci0JCX0KLQkJa2V5cy5hZGQoYXR0cmlidXRlKTsKLQl9Ci0JcmV0dXJuIGF0dHJpYnV0ZTsKLX0KLS8qKgotICogUmV0dXJuIGEgTGlzdCBvZiBvbmUgb2YgdGhlIHByb3BlcnRpZXMgdXNpbmcgYUZpbHRlci4KLSovCi1wdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEZlYXR1cmVzKEVKQkV4dGVuc2lvbkZpbHRlciBhRmlsdGVyKSB7Ci0JCXJldHVybiBhRmlsdGVyLmZpbHRlcih0aGlzKTsKLQl9Ci0vKioKLSAqIEFkZCBhIHBlcnNpc3RlbnQgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgbmFtZSBmb3IgYUZpZWxkLgotICogQ3JlYXRpb24gZGF0ZTogKDgvMy8yMDAwIDg6MzA6NDIgQU0pCi0gKiBAcGFyYW0gYUZpZWxkIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkZpZWxkCi0gKiBAcmV0dXJuIENNUEF0dHJpYnV0ZQotICovCi1wdWJsaWMgQ01QQXR0cmlidXRlIGFkZFBlcnNpc3RlbnRBdHRyaWJ1dGUoRmllbGQgYUZpZWxkKSB7Ci0JaWYgKGFGaWVsZCA9PSBudWxsKQotCQlyZXR1cm4gbnVsbDsKLQlyZXR1cm4gYWRkUGVyc2lzdGVudEF0dHJpYnV0ZU5hbWUoYUZpZWxkLmdldE5hbWUoKSk7Ci19Ci0vKioKLSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBdHRyaWJ1dGVFeHRuIHdpdGggYU5hbWUgYW5kIGFkZCBpdCB0byB0aGUgcGVyc2lzdGVudEZlYXR1cmVzLgotICogQ3JlYXRpb24gZGF0ZTogKDgvMi8yMDAwIDk6MTE6MTMgUE0pCi0gKiBAcGFyYW0gYU5hbWUgamF2YS5sYW5nLlN0cmluZwotICogQHJldHVybiBDTVBBdHRyaWJ1dGUKLSAqLwotcHVibGljIENNUEF0dHJpYnV0ZSBhZGRQZXJzaXN0ZW50QXR0cmlidXRlTmFtZShTdHJpbmcgYU5hbWUpIHsKLQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhTmFtZSk7Ci0JaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCWF0dHJpYnV0ZSA9IGNyZWF0ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoYU5hbWUpOwotCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLmFkZChhdHRyaWJ1dGUpOwotCX0KLQlyZXR1cm4gYXR0cmlidXRlOwotfQotcHJvdGVjdGVkIENNUEF0dHJpYnV0ZSBjcmVhdGVQZXJzaXN0ZW50QXR0cmlidXRlKFN0cmluZyBhTmFtZSkgewotCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoKEVqYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSkuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotCWF0dHJpYnV0ZS5zZXROYW1lKGFOYW1lKTsKLQlyZXR1cm4gYXR0cmlidXRlOwotfQotcHVibGljIExpc3QgZ2V0QWxsQXZhaWxhYmxlUXVlcnlNZXRob2RzKCkgewotCVNldCBzaWdzID0gbmV3IEhhc2hTZXQoKTsKLQlMaXN0IGphdmFNZXRob2RzID0gZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlKYXZhTWV0aG9kcygpOwotCXNpZ3MuYWRkQWxsKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGphdmFNZXRob2RzKSk7Ci0JamF2YU1ldGhvZHMgPSBnZXRBdmFpbGFibGVMb2NhbFF1ZXJ5SmF2YU1ldGhvZHMoKTsKLQlzaWdzLmFkZEFsbChnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyhqYXZhTWV0aG9kcykpOwotCWphdmFNZXRob2RzID0gZ2V0QXZhaWxhYmxlUmVtb3RlUXVlcnlKYXZhTWV0aG9kcygpOwotCXNpZ3MuYWRkQWxsKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGphdmFNZXRob2RzKSk7Ci0JTGlzdCBzaWduYXR1cmVzID0gbmV3IEFycmF5TGlzdChzaWdzKTsKLQlyZXR1cm4gY3JlYXRlUXVlcnlNZXRob2RzKHNpZ25hdHVyZXMpOwotfQotcHJvdGVjdGVkIExpc3QgY3JlYXRlUXVlcnlNZXRob2RzKExpc3Qgc2lnbmF0dXJlcykgewotCUNvbGxlY3Rpb25zLnNvcnQoc2lnbmF0dXJlcyk7Ci0JRW51bWVyYXRvciBlbnVtZXJhdG9yID0gTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTDsKLQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudHMoUVVFUllfTUVUSE9EX05BTUUsIHNpZ25hdHVyZXMsIGVudW1lcmF0b3IpOwotfQotCi1wdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVTZWxlY3RRdWVyeU1ldGhvZHMoKSB7Ci0JTGlzdCBtZXRob2RzID0gZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlKYXZhTWV0aG9kcygpOwotCUxpc3Qgc2lncyA9IGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKG1ldGhvZHMpOwotCXJldHVybiBjcmVhdGVRdWVyeU1ldGhvZHMoc2lncyk7Ci19Ci1wcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVTZWxlY3RRdWVyeUphdmFNZXRob2RzKCkgewotCUphdmFDbGFzcyBiZWFuID0gZ2V0RWpiQ2xhc3MoKTsKLQlpZiAoYmVhbiA9PSBudWxsKQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQlyZXR1cm4gYmVhbi5nZXRPbmx5U3BlY2lmaWNNZXRob2RzKCJlamJTZWxlY3QiLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsJIC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlRmluZFF1ZXJ5TWV0aG9kcygpIHsKLQlTZXQgc2lncyA9IG5ldyBIYXNoU2V0KCk7Ci0JTGlzdCBqYXZhTWV0aG9kcyA9IGdldEF2YWlsYWJsZVJlbW90ZVF1ZXJ5SmF2YU1ldGhvZHMoKTsKLQlzaWdzLmFkZEFsbChnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyhqYXZhTWV0aG9kcykpOwotCWphdmFNZXRob2RzID0gZ2V0QXZhaWxhYmxlTG9jYWxRdWVyeUphdmFNZXRob2RzKCk7Ci0Jc2lncy5hZGRBbGwoZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoamF2YU1ldGhvZHMpKTsKLQlMaXN0IHNpZ25hdHVyZXMgPSBuZXcgQXJyYXlMaXN0KHNpZ3MpOwotCXJldHVybiBjcmVhdGVRdWVyeU1ldGhvZHMoc2lnbmF0dXJlcyk7Ci19Ci1wcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVMb2NhbFF1ZXJ5SmF2YU1ldGhvZHMoKSB7Ci0JcmV0dXJuIGdldEF2YWlsYWJsZVF1ZXJ5SmF2YU1ldGhvZHMoZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotfQotLyoqCi0qIFRoaXMgcmV0dXJucyB0aGUgQ01QIHZlcnNpb24gaWQgYnkgdXNpbmcgdGhlIG1vZHVsZSBpZCBhbmQgdGhlIDxjbXAtdmVyc2lvbj4uIAotKiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIENNUCBsZXZlbAotKiBUaGlzIHdpbGwgaGVscCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gMi4wLDIuMSwuLi4gICByYXRoZXIgdGhhbiAiMi54IgotKi8KLXB1YmxpYyBpbnQgZ2V0Q01QVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JLyogSWYgcmVzb3VyY2UgaXMgbnVsbCB3ZSB3aWxsIHJldHVybiBiYXNlZCBvbiBDTVAgdmVyc2lvbi4uLi4qLwotCWlmIChyZXMgPT0gbnVsbCkgewotCQlpZiAoZ2V0VmVyc2lvbigpLmVxdWFscyhDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMV9YKSkKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwotCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDsKLQl9Ci0JaW50IGNtcFZlcnNpb247Ci0Jc3dpdGNoIChyZXMuZ2V0TW9kdWxlVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEIDoKLQkJCWlmIChnZXRWZXJzaW9uKCkuZXF1YWxzSWdub3JlQ2FzZShWRVJTSU9OXzJfWCkpCi0JCQkJY21wVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ7Ci0JCQllbHNlCi0JCQkJY21wVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEIDoKLQkJCQkJaWYgKGdldFZlcnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKFZFUlNJT05fMl9YKSkKLQkJCQkJCWNtcFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwotCQkJCQllbHNlCi0JCQkJCQljbXBWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdCA6Ci0JCQljbXBWZXJzaW9uID0gcmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQlyZXR1cm4gY21wVmVyc2lvbjsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4jZ2V0VmVyc2lvbklEKCkKLSAqLwotcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB7Ci0JcmV0dXJuIGdldENNUFZlcnNpb25JRCgpOwotfXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZVJlbW90ZVF1ZXJ5SmF2YU1ldGhvZHMoKSB7Ci0JcmV0dXJuIGdldEF2YWlsYWJsZVF1ZXJ5SmF2YU1ldGhvZHMoZ2V0SG9tZUludGVyZmFjZSgpKTsKLX0KLQotcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlUXVlcnlKYXZhTWV0aG9kcyhKYXZhQ2xhc3MgaG9tZSkgewotCWlmIChob21lID09IG51bGwpIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCUxpc3QgZXhjbHVkZWQgPSBuZXcgQXJyYXlMaXN0KDEpOwotCWV4Y2x1ZGVkLmFkZCgiZmluZEJ5UHJpbWFyeUtleSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGhvbWUuZ2V0T25seVNwZWNpZmljTWV0aG9kcygiZmluZCIsIGV4Y2x1ZGVkKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wcm90ZWN0ZWQgRUNsYXNzaWZpZXIgZ2V0R2VuZXJhdGVkSWRUeXBlKCkgewotCWlmIChmR2VuZXJhdGVkSWRUeXBlID09IG51bGwpIHsKLQkJZkdlbmVyYXRlZElkVHlwZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShKQVZBX0xBTkdfU1RSSU5HLCB0aGlzKTsKLQl9Ci0JcmV0dXJuIGZHZW5lcmF0ZWRJZFR5cGU7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUga2V5QXR0cmlidXRlIHdpdGggYU5hbWUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC84LzIwMDAgOToyNToyNyBQTSkKLSAqIEByZXR1cm4gRVN0cnVjdHVyYWxGZWF0dXJlCi0gKiBAcGFyYW0gYU5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgQ01QQXR0cmlidXRlIGdldEtleUF0dHJpYnV0ZShTdHJpbmcgYU5hbWUpIHsKLQlpZiAoYU5hbWUgIT0gbnVsbCkgewotCQlJdGVyYXRvciBpdCA9IGdldEtleUF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlDTVBBdHRyaWJ1dGUgbmV4dDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJbmV4dCA9IChDTVBBdHRyaWJ1dGUpIGl0Lm5leHQoKTsKLQkJCWlmIChhTmFtZS5lcXVhbHMobmV4dC5nZXROYW1lKCkpKQotCQkJCXJldHVybiBuZXh0OwotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgd2l0aCBhTmFtZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzgvMjAwMCA5OjI1OjI3IFBNKQotICogQHJldHVybiBFU3RydWN0dXJhbEZlYXR1cmUKLSAqIEBwYXJhbSBhTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBDTVBBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShTdHJpbmcgYU5hbWUpIHsKLQlpZiAoYU5hbWUgIT0gbnVsbCkgewotCQlJdGVyYXRvciBpdCA9IGdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJQ01QQXR0cmlidXRlIG5leHQ7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW5leHQgPSAoQ01QQXR0cmlidXRlKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYU5hbWUuZXF1YWxzKG5leHQuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gbmV4dDsKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotLyoqCi0gKiBJZiBhIHByaW1hcnkga2V5IGV4aXN0cywgcmV0dXJuIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZTsgdGhlIHByaW1hcnkga2V5IGlzIGRlZmluZWQgYXMgb25lIGFuZCBvbmx5IG9uZQotICoga2V5IGF0dHJpYnV0ZSwgd2hvc2UgdHlwZSBpcyB0aGUgc2FtZSBhcyB0aGUga2V5IGNsYXNzCi0gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UHJpbUtleUZpZWxkKCkKLSAqLwotcHVibGljIENNUEF0dHJpYnV0ZSBnZXRQcmltYXJ5S2V5QXR0cmlidXRlKCkgewotCXJldHVybiBnZXRQcmltS2V5RmllbGQoKTsKLX0KLQotCi0vKioKLSAqIGlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCXJldHVybiB0cnVlOwotfQotcHVibGljIGJvb2xlYW4gaXNLZXlBdHRyaWJ1dGUoQ01QQXR0cmlidXRlIGFuQXR0cmlidXRlKSB7Ci0JamF2YS51dGlsLkxpc3QgYXR0cmlidXRlcyA9IGdldEtleUF0dHJpYnV0ZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspewotCQlpZiAoYXR0cmlidXRlcy5nZXQoaSkgPT0gYW5BdHRyaWJ1dGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoKLSAqIFJldHVybiB3aGV0aGVyIHRoaXMgYmVhbiByZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIHRoZSAidW5rbm93biBwcmltYXJ5IGtleSIgY2FzZQotICogZGVzY3JpYmVkIGluIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhpcyBpcyBpZGVudGlmaWVkIGJ5IHRoZSBwcmltYXJ5IGtleSBjbGFzcwotICogYmVpbmcgc3BlY2lmaWVkIGFzICJqYXZhLmxhbmcuT2JqZWN0Ii4KLSAqIEluIG9yZGVyIHRvIGRlcGxveSBhbiB1bmtub3duIHByaW1hcnkga2V5IGJlYW4sIHdlIG11c3Qgc3Vic3RpdHV0ZSBhIHJlYWwga2V5LAotICogYW5kIGFkZCBhIGNvcnJlc3BvbmRpbmcgZmllbGQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVW5rbm93blByaW1hcnlLZXkoKSB7Ci0JU3RyaW5nIGtleU5hbWUgPSBnZXRQcmltYXJ5S2V5TmFtZSgpOwotCWlmIChrZXlOYW1lID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkvL3Rlc3Qgd2hldGhlciBpdCBpcyB1bmtub3duIG9yIHdlIGhhdmUgdGhlIFdBUyBnZW5lcmF0ZWQga2V5IGZvciB0aGUgdW5rbm93biBwcmltIGtleQotCWJvb2xlYW4gZ2VuVGVzdCA9IGtleU5hbWUuZXF1YWxzKFVOS05PV05fUFJJTUFSWV9LRVkpIHx8IGtleU5hbWUuZXF1YWxzKFdBU19HRU5FUkFURURfU1RSSU5HX0tFWSk7Ci0JaWYgKGdlblRlc3QpIHJldHVybiB0cnVlOwotCS8vTGFzdGx5LCB0ZXN0IGZvciB0aGUgZmluZEJ5UHJpbWFyeUtleShPYmplY3QpIG1ldGhvZCBvbiB0aGUgaG9tZS4KLQlKYXZhQ2xhc3MgaG9tZSA9IGdldEhvbWVJbnRlcmZhY2UoKTsKLQlpZiAoaG9tZSA9PSBudWxsKQotCQlob21lID0gZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JaWYgKGhvbWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCUxpc3QgcGFybVR5cGUgPSBuZXcgQXJyYXlMaXN0KDEpOwotICAgIHBhcm1UeXBlLmFkZChVTktOT1dOX1BSSU1BUllfS0VZKTsKLSAgIAlyZXR1cm4gaG9tZS5nZXRNZXRob2RFeHRlbmRlZChGSU5EX0JZX1BSSU1fS0VZX01FVEhPRF9OQU1FLCBwYXJtVHlwZSkgIT0gbnVsbDsKLX0KLS8qKgotICogaXNWZXJzaW9uMV9YIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24xX1goKSB7Ci0JcmV0dXJuIGdldFZlcnNpb24oKS5lcXVhbHMoQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzFfWCk7Ci19Ci0vKioKLSAqIGlzVmVyc2lvbjJfWCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMl9YKCkgewotCXJldHVybiBnZXRWZXJzaW9uKCkuZXF1YWxzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1gpOwotfQotLyogCi0gKiBsaXN0UGVyc2lzdGVudEZpZWxkTmFtZXMgLSByZXR1cm4gdGhlIG5hbWVzIG9mIG91ciBDTVAgZmllbGRzLiBkZXJpdmVkIGZyb20gcGVyc2lzdGVudEZlYXR1cmVzCi0gKi8KLXB1YmxpYyBTdHJpbmdbXSBsaXN0UGVyc2lzdGVudEZpZWxkTmFtZXMoKSB7Ci0JamF2YS51dGlsLkxpc3QgYXR0cmlidXRlcyA9IGdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2F0dHJpYnV0ZXMuc2l6ZSgpXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJbmFtZXNbaV0gPSAoKENNUEF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSkpLmdldE5hbWUoKTsKLQl9Ci0JcmV0dXJuIG5hbWVzOwotfQotCi0vKioKLSAqIFJlbW92ZSB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIEZpZWxkJ3MgbmFtZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzMvMjAwMCA4OjMzOjAxIEFNKQotICogQHBhcmFtIGFGaWVsZCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5GaWVsZAotICovCi1wdWJsaWMgQ01QQXR0cmlidXRlIHJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoRmllbGQgYUZpZWxkKSB7Ci0JaWYgKGFGaWVsZCAhPSBudWxsKQotCQlyZXR1cm4gcmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZShhRmllbGQuZ2V0TmFtZSgpKTsKLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogUmVtb3ZlIHRoZSBwZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVkIGFOYW1lLgotICogQ3JlYXRpb24gZGF0ZTogKDgvMi8yMDAwIDg6NTk6MzIgUE0pCi0gKiBAcGFyYW0gYU5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgQ01QQXR0cmlidXRlIHJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSB7Ci0JaWYgKGFOYW1lICE9IG51bGwpIHsKLQkJSXRlcmF0b3IgaXQgPSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUNNUEF0dHJpYnV0ZSBuZXh0OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQluZXh0ID0gKENNUEF0dHJpYnV0ZSkgaXQubmV4dCgpOwotCQkJaWYgKGFOYW1lLmVxdWFscyhuZXh0LmdldE5hbWUoKSkpIHsKLQkJCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLnJlbW92ZShuZXh0KTsKLQkJCQlyZXR1cm4gbmV4dDsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLgotCSAqIAotCSAqIEBpbnZhcmlhbnQgVGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IDEueCAsIDIueAotCSAqIEBkZWZhdWx0IDIueAotCSAqIFJldHVybnMgIjEueCIgaWYgaW4gYSAxLjEgSmFyIChGb3IgY29tcGF0aWJpbGl0eSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGFic3RyYWN0IHNjaGVtYSB0eXBlIG9mIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LiBJdCBpcyB1c2VkIGluIEVKQiBRTCBxdWVyaWVzLgotCSAqIAotCSAqIEZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdob3NlIGxvY2FsIGludGVyZmFjZSBpcyBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4KLQkgKiAKLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgewotCQlyZXR1cm4gYWJzdHJhY3RTY2hlbWFOYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFic3RyYWN0U2NoZW1hTmFtZShTdHJpbmcgbmV3QWJzdHJhY3RTY2hlbWFOYW1lKSB7Ci0JCVN0cmluZyBvbGRBYnN0cmFjdFNjaGVtYU5hbWUgPSBhYnN0cmFjdFNjaGVtYU5hbWU7Ci0JCWFic3RyYWN0U2NoZW1hTmFtZSA9IG5ld0Fic3RyYWN0U2NoZW1hTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0FCU1RSQUNUX1NDSEVNQV9OQU1FLCBvbGRBYnN0cmFjdFNjaGVtYU5hbWUsIGFic3RyYWN0U2NoZW1hTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpIHsKLQkJaWYgKHBlcnNpc3RlbnRBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENNUEF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BFUlNJU1RFTlRfQVRUUklCVVRFUyk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhYnN0cmFjdFNjaGVtYU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFic3RyYWN0U2NoZW1hTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRLZXlBdHRyaWJ1dGVzR2VuKCkgewotCQlpZiAoa2V5QXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlrZXlBdHRyaWJ1dGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChDTVBBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19LRVlfQVRUUklCVVRFUyk7Ci0JCX0KLQkJcmV0dXJuIGtleUF0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEtleUF0dHJpYnV0ZXMoKSB7Ci0JICAgIGlmKGtleUF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkgICAgQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlciBzeW5jQWRhcHRlciA9IChDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyKSAgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcih0aGlzLCBDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyLkFEQVBURVJfVFlQRSk7Ci0JCQlpZihzeW5jQWRhcHRlciAhPSBudWxsKSAKLQkJCSAgICBzeW5jQWRhcHRlci5pbml0aWFsaXplS2V5QXR0cmlidXRlcygpOyAKLQkgICAgfQotCQlyZXR1cm4gZ2V0S2V5QXR0cmlidXRlc0dlbigpOwotCX0KLQotCS8qKgotCSAqIDxwPkNoYW5nZSBmb3IgYnVnemlsbGEgMTc3Mzk3LiAgUHJvdmlkZSBhY2Nlc3MgdG8gdGhlCi0JICogaW5pdGlhbGl6YXRpb24gc3RhdGUgb2YgdGhlIGtleSBhdHRyaWJ1dGVzIGF0dHJpYnV0ZS48L3A+Ci0JICogCi0JICogPHA+VGhlIGluaXRpYWxpemF0aW9uIHN0YXRlIGlzIHVzZWQgd2hpbGUgY29weWluZyB0aGUKLQkgKiByZWNlaXZlci4gIElmIHRoZSBrZXkgYXR0cmlidXRlcyBhdHRyaWJ1dGUgaGFzIG5vdCBiZWVuCi0JICogaW5pdGlhbGl6ZWQsIHRoZW4gdGhlIGNvcHkgZG9lcyBub3QgbmVlZCB0byBkZXNjZW5kIGludG8gdGhlCi0JICoga2V5IGF0dHJpYnV0ZXMuPC9wPgotCSAqIAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUga2V5IGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotCSAqICAgICAgICAgT3RoZXJ3aXNlLCBmYWxzZS4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldElzSW5pdGlhbGl6ZWRLZXlBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gKGtleUF0dHJpYnV0ZXMgPT0gbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRRdWVyaWVzKCkgewotCQlpZiAocXVlcmllcyA9PSBudWxsKSB7Ci0JCQlxdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoUXVlcnkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTLCBFamJQYWNrYWdlLlFVRVJZX19FTlRJVFkpOwotCQl9Ci0JCXJldHVybiBxdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDTVBBdHRyaWJ1dGUoKSB7Ci0JCWlmIChjbXBBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJY21wQXR0cmlidXRlID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChDTVBBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19DTVBfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gY21wQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDTVBBdHRyaWJ1dGUgZ2V0UHJpbUtleUZpZWxkKCkgewotCQlpZiAocHJpbUtleUZpZWxkICE9IG51bGwgJiYgcHJpbUtleUZpZWxkLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmltS2V5RmllbGQgPSAoSW50ZXJuYWxFT2JqZWN0KXByaW1LZXlGaWVsZDsKLQkJCXByaW1LZXlGaWVsZCA9IChDTVBBdHRyaWJ1dGUpZVJlc29sdmVQcm94eShvbGRQcmltS2V5RmllbGQpOwotCQkJaWYgKHByaW1LZXlGaWVsZCAhPSBvbGRQcmltS2V5RmllbGQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTV9LRVlfRklFTEQsIG9sZFByaW1LZXlGaWVsZCwgcHJpbUtleUZpZWxkKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByaW1LZXlGaWVsZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlUHJpbUtleUZpZWxkUHJveHkoKSB7Ci0JCWlmIChwcmltS2V5RmllbGQgPT0gbnVsbCkgcmV0dXJuOwotCQlTdHJpbmcgZmllbGROYW1lID0gcHJpbUtleUZpZWxkLmdldE5hbWUoKTsKLQkJaWYgKGZpZWxkTmFtZSA9PSBudWxsKSBmaWVsZE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlwcmltS2V5RmllbGQgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLQkJKChJbnRlcm5hbEVPYmplY3QpcHJpbUtleUZpZWxkKS5lU2V0UHJveHlVUkkoVVJJLmNyZWF0ZVVSSShmaWVsZE5hbWUpKTsKLQkJCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENNUEF0dHJpYnV0ZSBiYXNpY0dldFByaW1LZXlGaWVsZCgpIHsKLQkJcmV0dXJuIHByaW1LZXlGaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmltS2V5RmllbGQoQ01QQXR0cmlidXRlIG5ld1ByaW1LZXlGaWVsZCkgewotCQlDTVBBdHRyaWJ1dGUgb2xkUHJpbUtleUZpZWxkID0gcHJpbUtleUZpZWxkOwotCQlwcmltS2V5RmllbGQgPSBuZXdQcmltS2V5RmllbGQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNX0tFWV9GSUVMRCwgb2xkUHJpbUtleUZpZWxkLCBwcmltS2V5RmllbGQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UXVlcmllcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BFUlNJU1RFTlRfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQUJTVFJBQ1RfU0NIRU1BX05BTUU6Ci0JCQkJcmV0dXJuIGdldEFic3RyYWN0U2NoZW1hTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fS0VZX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIGdldFF1ZXJpZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0NNUF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldENNUEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTV9LRVlfRklFTEQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRQcmltS2V5RmllbGQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRQcmltS2V5RmllbGQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0FCU1RSQUNUX1NDSEVNQV9OQU1FOgotCQkJCXNldEFic3RyYWN0U2NoZW1hTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QRVJTSVNURU5UX0FUVFJJQlVURVM6Ci0JCQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19LRVlfQVRUUklCVVRFUzoKLQkJCQlnZXRLZXlBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRLZXlBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTOgotCQkJCWdldFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldFF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0NNUF9BVFRSSUJVVEU6Ci0JCQkJZ2V0Q01QQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRDTVBBdHRyaWJ1dGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1fS0VZX0ZJRUxEOgotCQkJCXNldFByaW1LZXlGaWVsZCgoQ01QQXR0cmlidXRlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0FCU1RSQUNUX1NDSEVNQV9OQU1FOgotCQkJCXNldEFic3RyYWN0U2NoZW1hTmFtZShBQlNUUkFDVF9TQ0hFTUFfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTOgotCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19LRVlfQVRUUklCVVRFUzoKLQkJCQlnZXRLZXlBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTOgotCQkJCWdldFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0NNUF9BVFRSSUJVVEU6Ci0JCQkJZ2V0Q01QQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNX0tFWV9GSUVMRDoKLQkJCQlzZXRQcmltS2V5RmllbGQoKENNUEF0dHJpYnV0ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbCA6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0FCU1RSQUNUX1NDSEVNQV9OQU1FOgotCQkJCXJldHVybiBBQlNUUkFDVF9TQ0hFTUFfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gYWJzdHJhY3RTY2hlbWFOYW1lICE9IG51bGwgOiAhQUJTVFJBQ1RfU0NIRU1BX05BTUVfRURFRkFVTFQuZXF1YWxzKGFic3RyYWN0U2NoZW1hTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QRVJTSVNURU5UX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGVzICE9IG51bGwgJiYgIXBlcnNpc3RlbnRBdHRyaWJ1dGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0tFWV9BVFRSSUJVVEVTOgotCQkJCXJldHVybiBrZXlBdHRyaWJ1dGVzICE9IG51bGwgJiYgIWtleUF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUVVFUklFUzoKLQkJCQlyZXR1cm4gcXVlcmllcyAhPSBudWxsICYmICFxdWVyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0NNUF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGNtcEF0dHJpYnV0ZSAhPSBudWxsICYmICFjbXBBdHRyaWJ1dGUuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTV9LRVlfRklFTEQ6Ci0JCQkJcmV0dXJuIHByaW1LZXlGaWVsZCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eSNnZXRDTVJGaWVsZHMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldENNUkZpZWxkcygpIHsKLQkJTGlzdCBteVJvbGVzID0gZ2V0Um9sZXMoKTsKLQkJTGlzdCBjbXJGaWVsZHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlpZiAobXlSb2xlcyAhPSBudWxsICYmICFteVJvbGVzLmlzRW1wdHkoKSkgewotCQkJY21yRmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3IgaSA9IG15Um9sZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IChFSkJSZWxhdGlvbnNoaXBSb2xlKSBpLm5leHQoKTsKLQkJCQlDTVJGaWVsZCBmaWVsZCA9IHJvbGUuZ2V0Q21yRmllbGQoKTsKLQkJCQlpZiAoZmllbGQgIT0gbnVsbCkKLQkJCQkJY21yRmllbGRzLmFkZChmaWVsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNtckZpZWxkczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGZSZWZlcmVuY2luZyhFSkJSZWxhdGlvbiByZWwpIHsKLQkJaWYgKHJlbC5nZXRTZWNvbmRSb2xlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChyZWwuZ2V0Rmlyc3RSb2xlKCkuZ2V0U291cmNlRW50aXR5KCkgPT0gdGhpcykgJiYKLQkJCShyZWwuZ2V0U2Vjb25kUm9sZSgpLmdldFNvdXJjZUVudGl0eSgpID09IHRoaXMpOwotCX0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5I2dldFJvbGVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSb2xlcygpIHsKLQkJaWYgKGdldEVqYkphcigpID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCBhbGxSb2xlcyA9IGdldEVqYkphcigpLmdldEVqYlJlbGF0aW9ucygpOwotCQlMaXN0IG15Um9sZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlpZiAoYWxsUm9sZXMgIT0gbnVsbCAmJiAhYWxsUm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQlteVJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3IgaSA9IGFsbFJvbGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlFSkJSZWxhdGlvbiByZWwgPSAoRUpCUmVsYXRpb24pIGkubmV4dCgpOwotCQkJCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IHJlbC5nZXRGaXJzdFJvbGUoKTsKLQkJCQlpZiAoaXNTZWxmUmVmZXJlbmNpbmcocmVsKSkgewotCQkJCQlteVJvbGVzLmFkZChyZWwuZ2V0Rmlyc3RSb2xlKCkpOwotCQkJCQlteVJvbGVzLmFkZChyZWwuZ2V0U2Vjb25kUm9sZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHJvbGUgIT0gbnVsbCkgJiYgcm9sZS5nZXRTb3VyY2VFbnRpdHkoKSA9PSB0aGlzKSB7Ci0JCQkJCW15Um9sZXMuYWRkKHJvbGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJvbGUgPSByZWwuZ2V0U2Vjb25kUm9sZSgpOwotCQkJCQlpZiAoKHJvbGUgIT0gbnVsbCkgJiYgKHJvbGUuZ2V0U291cmNlRW50aXR5KCkgPT0gdGhpcykpCi0JCQkJCQlteVJvbGVzLmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG15Um9sZXM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHkjZ2V0Um9sZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBDb21tb25SZWxhdGlvbnNoaXBSb2xlIGdldFJvbGUoU3RyaW5nIHJvbGVOYW1lKSB7Ci0JCUxpc3Qgcm9sZXMgPSBnZXRSb2xlcygpOwotCQlmb3IgKGludCBpPTA7IGk8cm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IChDb21tb25SZWxhdGlvbnNoaXBSb2xlKXJvbGVzLmdldChpKTsKLQkJCWlmIChyb2xlLmdldE5hbWUoKS5lcXVhbHMocm9sZU5hbWUpKQotCQkJCXJldHVybiByb2xlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCMjBGbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCMjBGbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDBmNDA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQjIwRmxhdHRlbmVkUm9sZVNoYXBlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5JUm9sZVNoYXBlU3RyYXRlZ3k7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS82LzIwMDAgMTE6NDE6MzMgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkIyMEZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5IGV4dGVuZHMgUm9sZVNoYXBlU3RyYXRlZ3kgewotCS8qKgotCSAqIEZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVKQjIwRmxhdHRlbmVkUm9sZVNoYXBlU3RyYXRlZ3koQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCQlzdXBlcihhUm9sZSk7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGNhbkNvbnRpbnVlKCkgewotCQlyZXR1cm4gIWJ1c3kgJiYgcm9sZS5nZXROYW1lKCkgIT0gbnVsbCAmJiAocm9sZS5pc0ZvcndhcmQoKSB8fAotCQkJKHJvbGUuaXNNYW55KCkgJiYgKHJvbGUuZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSA9PSBudWxsIHx8Ci0JCQlyb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuaXNNYW55KCkpKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHVzZXNBdHRyaWJ1dGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlpZiAoYXR0cmlidXRlTmFtZSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBhdHRyaWJ1dGVOYW1lLmluZGV4T2YoSVJvbGVTaGFwZVN0cmF0ZWd5LkFUVFJJQlVURV9OQU1FX0pPSU5FUik7Ci0JCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCXJldHVybiBnZXRSb2xlKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSb2xlU2hhcGVTdHJhdGVneSNyZWNvbmNpbGVBdHRyaWJ1dGVzKENvbW1vblJlbGF0aW9uc2hpcFJvbGUsIFN0cmluZywgTGlzdCwgTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IGFMaXN0LCBMaXN0IGNvbXB1dGVkTmFtZXMpIHsKLQkJCi0JCVJlc291cmNlIHJlcyA9IGFSb2xlLmVSZXNvdXJjZSgpOwotCQlib29sZWFuIGRpcnR5RmxhZyA9IHJlcyAhPSBudWxsID8gcmVzLmlzTW9kaWZpZWQoKSA6IGZhbHNlOwotCQl0cnkgewkJCi0JCQlpZiAoYVJvbGUuZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSAhPSBudWxsKSB7Ci0JCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpLmdldFNvdXJjZUVudGl0eSgpOwotCQkvLwlDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHJvbGVUeXBlID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24pZ2V0VHlwZUV4dGVuc2lvbihhUm9sZSk7Ci0JCQlpZiAoZW50aXR5ICE9IG51bGwpCi0JCQkJY29sbGVjdEF0dHJpYnV0ZXMoZW50aXR5LCBhdHRyaWJ1dGVOYW1lLCBhTGlzdCwgY29tcHV0ZWROYW1lcyk7Ci0JCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQlyZXMuc2V0TW9kaWZpZWQoZGlydHlGbGFnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5GbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneSNzZXREZXJpdmVkQXR0cmlidXRlVHlwZShDTVBBdHRyaWJ1dGUsIEphdmFIZWxwZXJzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERlcml2ZWRBdHRyaWJ1dGVUeXBlKENNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIENNUEF0dHJpYnV0ZSB0YXJnZXRBdHRyaWJ1dGUsIGJvb2xlYW4gaXNOZXcpIHsKLQkJaWYgKHRhcmdldEF0dHJpYnV0ZSA9PSBudWxsKSByZXR1cm47Ci0JCUphdmFIZWxwZXJzIGZpZWxkVHlwZSA9IHRhcmdldEF0dHJpYnV0ZS5nZXRUeXBlKCk7Ci0JCWlmIChmaWVsZFR5cGUgIT0gbnVsbCkgewotCQkJaW50IHNpbmdsZVJvbGVOYW1lU2l6ZSA9IGdldFJvbGUoKS5nZXROYW1lKCkubGVuZ3RoKCkgKyB0YXJnZXRBdHRyaWJ1dGUuZ2V0TmFtZSgpLmxlbmd0aCgpICsgMTsgLy9vbmUgZm9yIHRoZSB1bmRlcnNjb3JlCi0JCQlpZiAoIShhdHRyaWJ1dGUuZ2V0TmFtZSgpLmxlbmd0aCgpID4gc2luZ2xlUm9sZU5hbWVTaXplKSkgLy9kb24ndCBzZXQgdGhlIG9yaWdpbmF0aW5nIHR5cGUgc2luY2Ugd2UgYXJlIGRlcml2ZWQgZnJvbSBhbm90aGVyIGRlcml2ZWQgYXR0cmlidXRlCi0JCQkJYXR0cmlidXRlLnNldE9yaWdpbmF0aW5nVHlwZShmaWVsZFR5cGUpOwotCQkJYXR0cmlidXRlLnNldEVUeXBlKGZpZWxkVHlwZS5nZXRXcmFwcGVyKCkpOwotCQl9Ci0JCWlmIChpc05ldyAmJiAhZ2V0Um9sZSgpLmlzS2V5KCkpCi0JCQlhdHRyaWJ1dGUuc2V0RGVyaXZlZCh0cnVlKTsKLQl9Ci0JLyoqCi0JICogZ2V0RmllbGRzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgdHlwZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3QgYUxpc3QsIExpc3QgY29tcHV0ZWROYW1lcykgewotCQljb2xsZWN0S2V5TW9kZWxsZWRBdHRyaWJ1dGVzKHR5cGUsIGF0dHJpYnV0ZU5hbWUsIGFMaXN0LCBjb21wdXRlZE5hbWVzKTsKLQkJY29sbGVjdEtleVJvbGVBdHRyaWJ1dGVzKHR5cGUsIGF0dHJpYnV0ZU5hbWUsIGFMaXN0LCBjb21wdXRlZE5hbWVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdG8gYmUgc2FmZSwgcmVhbGx5IHNob3VsZCB1c2UgY29sbGVjdEF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHksIENNUEF0dHJpYnV0ZSB0eXBlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCBhTGlzdCwgTGlzdCBjb21wdXRlZE5hbWVzKQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiBAcGFyYW0gYUxpc3QKLQkgKiBAcGFyYW0gY29tcHV0ZWROYW1lcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RBdHRyaWJ1dGVzKENNUEF0dHJpYnV0ZSB0eXBlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCBhTGlzdCwgTGlzdCBjb21wdXRlZE5hbWVzKSB7Ci0JCS8vIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBjb2RlIGdlbmVyYXRpb24KLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgdHlwZS5lQ29udGFpbmVyKCk7Ci0JCWNvbGxlY3RBdHRyaWJ1dGVzKGVudGl0eSwgdHlwZSwgYXR0cmlidXRlTmFtZSwgYUxpc3QsIGNvbXB1dGVkTmFtZXMpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0QXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSwgQ01QQXR0cmlidXRlIHR5cGUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IGFMaXN0LCBMaXN0IGNvbXB1dGVkTmFtZXMpIHsKLQkJYm9vbGVhbiBpc05ld0F0dHJpYnV0ZSA9IGZhbHNlOwotCQlhdHRyaWJ1dGVOYW1lID0gYXBwZW5kTmFtZShhdHRyaWJ1dGVOYW1lLCB0eXBlLmdldE5hbWUoKSk7Ci0JCWNvbXB1dGVkTmFtZXMuYWRkKGF0dHJpYnV0ZU5hbWUpOwotCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0Q01QRW50aXR5KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGUgPSBjcmVhdGVQZXJzaXN0ZW50QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotCQkJaXNOZXdBdHRyaWJ1dGUgPSB0cnVlOwotCQl9Ci0JCWlmIChlbnRpdHkgIT0gbnVsbCkKLQkJCXNldERlcml2ZWRBdHRyaWJ1dGVUeXBlKGF0dHJpYnV0ZSwgdHlwZSwgaXNOZXdBdHRyaWJ1dGUpOwotCQlpZiAoaXNOZXdBdHRyaWJ1dGUpIHsKLQkJCWlmIChnZXRSb2xlKCkuaXNLZXkoKSkKLQkJCQlnZXRDTVBFbnRpdHkoKS5nZXRLZXlBdHRyaWJ1dGVzKCkuYWRkKGF0dHJpYnV0ZSk7Ci0JCQlhTGlzdC5hZGQoYXR0cmlidXRlKTsKLQkJCWdldENNUEVudGl0eSgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkuYWRkKGF0dHJpYnV0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWFMaXN0LmNvbnRhaW5zKGF0dHJpYnV0ZSkpCi0JCQkJYUxpc3QuYWRkKGF0dHJpYnV0ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENNUEF0dHJpYnV0ZSBjcmVhdGVQZXJzaXN0ZW50QXR0cmlidXRlKFN0cmluZyBhTmFtZSkgewotCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKChFamJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkpLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLQkJYXR0cmlidXRlLnNldE5hbWUoYU5hbWUpOwotCQlhdHRyaWJ1dGUuc2V0RGVzY3JpcHRpb24oIkdlbmVyYXRlZCB0byBzdXBwb3J0IHJlbGF0aW9uc2hpcHMuICBEbyBOT1QgZGVsZXRlLiIpOwotCQlyZXR1cm4gYXR0cmlidXRlOwotCX0KLQkvKioKLQkgKiBnZXRGaWVsZHMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdEtleU1vZGVsbGVkQXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3QgYUxpc3QsIExpc3QgY29tcHV0ZWROYW1lcykgewotCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBlbnRpdHkuZ2V0RmlsdGVyZWRGZWF0dXJlcyhNb2RlbGxlZEtleUF0dHJpYnV0ZUZpbHRlci5zaW5nbGV0b24oKSkuaXRlcmF0b3IoKTsKLQkJQ01QQXR0cmlidXRlIGF0dHJpYnV0ZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSkgaXQubmV4dCgpOwotCQkJY29sbGVjdEF0dHJpYnV0ZXMoZW50aXR5LCBhdHRyaWJ1dGUsIGF0dHJpYnV0ZU5hbWUsIGFMaXN0LCBjb21wdXRlZE5hbWVzKTsKLQkJfQotCX0KLQkvKioKLQkgKiBnZXRGaWVsZHMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdEtleVJvbGVBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCBhTGlzdCwgTGlzdCBjb21wdXRlZE5hbWVzKSB7Ci0JCWlmKHZpc2l0ZWRLZXlUeXBlcy5jb250YWlucyhlbnRpdHkpKXsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJLZXkgcm9sZSBjeWNsZSBkZXRlY3RlZCIpOwotCQl9Ci0JCXZpc2l0ZWRLZXlUeXBlcy5hZGQoZW50aXR5KTsKLQkJamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gZW50aXR5LmdldEZpbHRlcmVkRmVhdHVyZXMoS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlci5zaW5nbGV0b24oKSkuaXRlcmF0b3IoKTsKLQkJQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYVJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGF0dE5hbWUgPSBhcHBlbmROYW1lKGF0dHJpYnV0ZU5hbWUsIGFSb2xlLmdldE5hbWUoKSk7Ci0JCQlyZWNvbmNpbGVBdHRyaWJ1dGVzKGFSb2xlLCBhdHROYW1lLCBhTGlzdCwgY29tcHV0ZWROYW1lcyk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0Q01QRW50aXR5KCkgewotCQlyZXR1cm4gZ2V0Um9sZSgpLmdldFNvdXJjZUVudGl0eSgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3N2E3MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotCi0vKioKLSAqIFRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGU7IG9wdGlvbmFsIGRpc3BsYXkgbmFtZTsgb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZQotICogbmFtZTsgbWFuZGF0b3J5IHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkIGVudGVycHJpc2UgYmVhbnM7IGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywgaWYgYW55OyBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yOyBhbmQgYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUgZWpiLWphci4KLSAqLwotcHVibGljIGNsYXNzIEVKQkphckltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBFSkJKYXIgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkNsaWVudEphcigpIDxlbT5FamIgQ2xpZW50IEphcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiQ2xpZW50SmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfQ0xJRU5UX0pBUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYkNsaWVudEphciA9IEVKQl9DTElFTlRfSkFSX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBSZWxhdGlvbnNoaXBzIHJlbGF0aW9uc2hpcExpc3QgPSBudWxsOwotCXB1YmxpYyBFSkJKYXJJbXBsKCkgewotCQlzdXBlcigpOwotLy8JCXNldFJlZklkKGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZUNvbnN0YW50cy5FSkJKQVJfSUQpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRUpCX0pBUjsKLQl9Ci0KLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSBDb250YWluZXJNYW5hZ2VkRW50aXR5IGJlYW5zIGluIHRoaXMgamFyLgotICovCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0NvbnRhaW5lck1hbmFnZWRCZWFucygpIHsKLQlJdGVyYXRvciBpdCA9IGdldEVudGVycHJpc2VCZWFucygpLml0ZXJhdG9yKCk7Ci0JRW50ZXJwcmlzZUJlYW4gZWpiOwotCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJZWpiID0gKEVudGVycHJpc2VCZWFuKWl0Lm5leHQoKTsKLQkJaWYgKGVqYi5pc0VudGl0eSgpICYmICgoRW50aXR5KWVqYikuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5FSkJKYXIKLSAqLwotcHVibGljIGJvb2xlYW4gY29udGFpbnNTZWN1cml0eVJvbGUoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB7Ci0JQXNzZW1ibHlEZXNjcmlwdG9yIGFkID0gZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JcmV0dXJuIChhZCAhPSBudWxsKSAmJiAoYWQuZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmFtZSkgIT0gbnVsbCk7Ci19Ci0vKioKLSAqIFJldHVybiBMaXN0IG9mIEJNUCBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotcHVibGljIExpc3QgZ2V0QmVhbk1hbmFnZWRCZWFucygpIHsKLQlMaXN0IGFsbEJlYW5zLCBiZWFuczsKLQlhbGxCZWFucyA9IGdldEVudGVycHJpc2VCZWFucygpOwotCWludCBzaXplID0gYWxsQmVhbnMuc2l6ZSgpOwotCWJlYW5zID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQlFbnRlcnByaXNlQmVhbiBlamI7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJZWpiID0gKEVudGVycHJpc2VCZWFuKSBhbGxCZWFucy5nZXQoaSk7Ci0JCWlmIChlamIuaXNCZWFuTWFuYWdlZEVudGl0eSgpKQotCQkJYmVhbnMuYWRkKGVqYik7Ci0JfQotCXJldHVybiBiZWFuczsKLX0KLS8qKgotICogUmV0dXJuIExpc3Qgb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotcHVibGljIExpc3QgZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotCUxpc3QgY21wcyA9IG5ldyBBcnJheUxpc3QoZ2V0RW50ZXJwcmlzZUJlYW5zKCkuc2l6ZSgpKTsKLQlJdGVyYXRvciBpdCA9IGdldEVudGVycHJpc2VCZWFucygpLml0ZXJhdG9yKCk7Ci0JRW50ZXJwcmlzZUJlYW4gZWpiOwotCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJZWpiID0gKEVudGVycHJpc2VCZWFuKWl0Lm5leHQoKTsKLQkJaWYgKGVqYi5pc0VudGl0eSgpICYmICgoRW50aXR5KWVqYikuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpCi0JCQljbXBzLmFkZChlamIpOwotCX0KLQlyZXR1cm4gY21wczsKLX0KLQotLyoqCi0gKiBSZXR1cm4gTGlzdCBvZiBFSkIgMS4xIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYmVhbnMgaW4gdGhpcyBqYXIuCi0gKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0gKi8KLXB1YmxpYyBMaXN0IGdldEVKQjExQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotCUxpc3QgY21wcyA9IG5ldyBBcnJheUxpc3QoZ2V0RW50ZXJwcmlzZUJlYW5zKCkuc2l6ZSgpKTsKLQlJdGVyYXRvciBpdCA9IGdldEVudGVycHJpc2VCZWFucygpLml0ZXJhdG9yKCk7Ci0JRW50ZXJwcmlzZUJlYW4gZWpiOwotCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJZWpiID0gKEVudGVycHJpc2VCZWFuKWl0Lm5leHQoKTsKLQkJaWYgKGVqYi5pc0VudGl0eSgpICYmICgoRW50aXR5KWVqYikuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgJiYgZWpiLmdldFZlcnNpb25JRCgpIDw9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQpCi0JCQljbXBzLmFkZChlamIpOwotCX0KLQlyZXR1cm4gY21wczsKLX0KLQotLyoqCi0gKiBSZXR1cm4gTGlzdCBvZiBFSkIgMi4wIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYmVhbnMgaW4gdGhpcyBqYXIuCi0gKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0gKi8KLXB1YmxpYyBMaXN0IGdldEVKQjIwQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotCUxpc3QgY21wcyA9IG5ldyBBcnJheUxpc3QoZ2V0RW50ZXJwcmlzZUJlYW5zKCkuc2l6ZSgpKTsKLQlJdGVyYXRvciBpdCA9IGdldEVudGVycHJpc2VCZWFucygpLml0ZXJhdG9yKCk7Ci0JRW50ZXJwcmlzZUJlYW4gZWpiOwotCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJZWpiID0gKEVudGVycHJpc2VCZWFuKWl0Lm5leHQoKTsKLQkJaWYgKGVqYi5pc0VudGl0eSgpICYmICgoRW50aXR5KWVqYikuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgJiYgZWpiLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpCi0JCQljbXBzLmFkZChlamIpOwotCX0KLQlyZXR1cm4gY21wczsKLX0KLQkvKgotCSAqIEBzZWUgRUpCSmFyI2dldE1lc3NhZ2VEcml2ZW5CZWFucygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkgewotCQlMaXN0IGVqYnMgPSBnZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJaW50IHNpemUgPSBlamJzLnNpemUoKTsKLQkJTGlzdCBtZGJzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJRW50ZXJwcmlzZUJlYW4gZWpiOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJZWpiID0gKEVudGVycHJpc2VCZWFuKWVqYnMuZ2V0KGkpOwotCQkJaWYgKGVqYi5pc01lc3NhZ2VEcml2ZW4oKSkKLQkJCQltZGJzLmFkZChlamIpOwotCQl9Ci0JCXJldHVybiBtZGJzOwotCX0KLS8qKgotICogQHJldHVybiBUaGUgbGlzdCBvZiBFamJSZWxhdGlvbnMgcmVmZXJlbmNlcwotICogQSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLSAqLwotcHVibGljIExpc3QgZ2V0RWpiUmVsYXRpb25zKCkgewotCXJldHVybiBnZXRSZWxhdGlvbnNoaXBMaXN0KCkgPT0gbnVsbCA/IG51bGwgOiBnZXRSZWxhdGlvbnNoaXBMaXN0KCkuZ2V0RWpiUmVsYXRpb25zKCk7Ci19Ci0vKioKLSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmLCBpZiBvbmUgZXhpc3RzLiAgVGhlIGVqYi1saW5rIHZhbHVlCi0gKiBvZiB0aGUgcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgcmV0dXJuCi0gKiBudWxsCi0gKi8KLXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmKSB7Ci0JU3RyaW5nIGxpbmsgPSByZWYuZ2V0TGluaygpOwotCWlmIChsaW5rID09IG51bGwpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbk5hbWVkKGxpbmspOwotfQotcHVibGljIEVudGVycHJpc2VCZWFuIGdldEVudGVycHJpc2VCZWFuTmFtZWQoU3RyaW5nIGVqYk5hbWUpIHsKLQlpZiAoZWpiTmFtZSA9PSBudWxsKQotCQlyZXR1cm4gbnVsbDsKLQlFTGlzdCBiZWFucyA9IGdldEVudGVycHJpc2VCZWFucygpOwotCUVudGVycHJpc2VCZWFuIGJlYW47Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBiZWFucy5zaXplKCk7IGkrKykgewotCQliZWFuID0gKEVudGVycHJpc2VCZWFuKSBiZWFucy5nZXQoaSk7Ci0JCWlmIChlamJOYW1lLmVxdWFscyhiZWFuLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYmVhbjsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFJldHVybiBBTEwgRW50ZXJwcmlzZUJlYW4ocykgdGhhdCBhcmUgcmVmZXJlbmNpbmcgQGFKYXZhQ2xhc3MgYXMgYQotICogaG9tZSwgcmVtb3RlLCBiZWFuIGNsYXNzLCBvciBrZXkgY2xhc3MuCi0gKi8KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRFbnRlcnByaXNlQmVhbnNXaXRoUmVmZXJlbmNlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JTGlzdCBiZWFucyA9IGdldEVudGVycHJpc2VCZWFucygpOwotCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCUVudGVycHJpc2VCZWFuIGJlYW4gPSBudWxsOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYmVhbnMuc2l6ZSgpOyBpKyspewotCQliZWFuID0gKEVudGVycHJpc2VCZWFuKSBiZWFucy5nZXQoaSk7Ci0JCWlmIChiZWFuLmhhc0phdmFSZWZlcmVuY2UoYUphdmFDbGFzcykpCi0JCQlyZXN1bHQuYWRkKGJlYW4pOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBSZXR1cm4gdGhlICpGSVJTVCogRW50ZXJwcmlzZUJlYW4gdGhhdCBpcyByZWZlcmVuY2luZyBAYUphdmFDbGFzcyBhcyBpdHMKLSAqIGhvbWUsIHJlbW90ZSwgYmVhbiBjbGFzcywgb3Iga2V5IGNsYXNzLgotICovCi1wdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwcmlzZUJlYW5XaXRoUmVmZXJlbmNlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JTGlzdCBiZWFucyA9IGdldEVudGVycHJpc2VCZWFucygpOwotCUVudGVycHJpc2VCZWFuIGJlYW4gPSBudWxsOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYmVhbnMuc2l6ZSgpOyBpKyspewotCQliZWFuID0gKEVudGVycHJpc2VCZWFuKSBiZWFucy5nZXQoaSk7Ci0JCWlmIChiZWFuLmhhc0phdmFSZWZlcmVuY2UoYUphdmFDbGFzcykpCi0JCQlyZXR1cm4gYmVhbjsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFJldHVybiBMaXN0IG9mIFNlc3Npb24gYmVhbnMgaW4gdGhpcyBqYXIuCi0gKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0gKi8KLXB1YmxpYyBMaXN0IGdldFNlc3Npb25CZWFucygpIHsKLQlMaXN0IGFsbEJlYW5zLCBiZWFuczsKLQlhbGxCZWFucyA9IGdldEVudGVycHJpc2VCZWFucygpOwotCWludCBzaXplID0gYWxsQmVhbnMuc2l6ZSgpOwotCWJlYW5zID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQlFbnRlcnByaXNlQmVhbiBlamI7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJZWpiID0gKEVudGVycHJpc2VCZWFuKSBhbGxCZWFucy5nZXQoaSk7Ci0JCWlmIChlamIuaXNTZXNzaW9uKCkpCi0JCQliZWFucy5hZGQoZWpiKTsKLQl9Ci0JcmV0dXJuIGJlYW5zOwotfQotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgRUpCIEpBUiB3YXMgcG9wdWxhdGVkIGZyb20gYW4gRUpCIDEuMSBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfMURlc2NyaXB0b3IoKSB7Ci0JQ29tbW9uVXRpbC5jaGVja0RET2JqZWN0Rm9yVmVyc2lvbih0aGlzKTsKLQlFSkJSZXNvdXJjZSBlamJSZXMgPSAoRUpCUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCXJldHVybiBlamJSZXMuaXNFSkIxXzEoKTsKLX0KLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIEVKQiBKQVIgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEVKQiAyLjAgZGVzY3JpcHRvcgotICogQHJldHVybiBib29sZWFuCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24yXzBEZXNjcmlwdG9yKCkgIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCUVKQlJlc291cmNlIGVqYlJlcyA9IChFSkJSZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JcmV0dXJuIGVqYlJlcy5pc0VKQjJfMCgpOwotfQotLyoqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5FSkJKYXIKLSAqLwotcHVibGljIHZvaWQgcmVuYW1lU2VjdXJpdHlSb2xlKGphdmEubGFuZy5TdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSwgamF2YS5sYW5nLlN0cmluZyBuZXdSb2xlTmFtZSkgewotCUFzc2VtYmx5RGVzY3JpcHRvciBhZCA9IGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCWlmIChhZCAhPSBudWxsKQotCQlhZC5yZW5hbWVTZWN1cml0eVJvbGUoZXhpc3RpbmdSb2xlTmFtZSwgbmV3Um9sZU5hbWUpOwotCUxpc3QgZWpicyA9IGdldEVudGVycHJpc2VCZWFucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZWpicy5zaXplKCk7IGkrKykgewotCQlFbnRlcnByaXNlQmVhbiBlamIgPSAoRW50ZXJwcmlzZUJlYW4pIGVqYnMuZ2V0KGkpOwotCQllamIucmVTeW5jU2VjdXJpdHlSb2xlUmVmKGV4aXN0aW5nUm9sZU5hbWUsIG5ld1JvbGVOYW1lKTsKLQl9Ci19Ci0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgb3B0aW9uYWwgZWpiLWNsaWVudC1qYXIgZWxlbWVudCBzcGVjaWZpZXMgYSBKQVIgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzcyBmaWxlcyBuZWNlc3NhcnkgZm9yIGEgY2xpZW50IHByb2dyYW0gdG8gYWNjZXNzIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBlamItamFyIGZpbGUuIFRoZSBEZXBsb3llciBzaG91bGQgbWFrZSB0aGUgZWpiLWNsaWVudCBKQVIgZmlsZSBhY2Nlc3NpYmxlIHRvIHRoZSBjbGllbnQncyBjbGFzcy1sb2FkZXIuICBFeGFtcGxlOjxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXI8Ly9lamItY2xpZW50LWphcj4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiQ2xpZW50SmFyKCkgewotCQlyZXR1cm4gZWpiQ2xpZW50SmFyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYkNsaWVudEphcihTdHJpbmcgbmV3RWpiQ2xpZW50SmFyKSB7Ci0JCVN0cmluZyBvbGRFamJDbGllbnRKYXIgPSBlamJDbGllbnRKYXI7Ci0JCWVqYkNsaWVudEphciA9IG5ld0VqYkNsaWVudEphcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUiwgb2xkRWpiQ2xpZW50SmFyLCBlamJDbGllbnRKYXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCVRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuICBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotCSovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSBlamJSZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChlamJSZXMgPT0gbnVsbCkgewotCQkJLy8gZml4IGRlZmVjdCAzMjc2LCB3aGVuIHJlc291cmNlIGlzIHVubG9hZGVkCi0JCQlpZiAodmVyc2lvbiA9PSBudWxsKSAKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQlpZiAodmVyc2lvbi5lcXVhbHMoIjIuMSIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0JCQlpZiAodmVyc2lvbi5lcXVhbHMoIjIuMCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ7Ci0JCQlpZiAodmVyc2lvbi5lcXVhbHMoIjEuMSIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ7Ci0JCQlpZiAodmVyc2lvbi5lcXVhbHMoIjEuMCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQ7Ci0JCX0KLQkJcmV0dXJuIGVqYlJlcy5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQl9Ci0JLyoqCi0JICpUaGlzIHJldHVybnMgdGhlIGoyZWUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBqMmVlIGxldmVsCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlhNTFJlc291cmNlIGlzIG51bGwiKTsKLQkJcmV0dXJuIHJlcy5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQXNzZW1ibHlEZXNjcmlwdG9yIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGFzc2VtYmx5RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlBc3NlbWJseURlc2NyaXB0b3Igb2xkQXNzZW1ibHlEZXNjcmlwdG9yID0gYXNzZW1ibHlEZXNjcmlwdG9yOwotCQlhc3NlbWJseURlc2NyaXB0b3IgPSBuZXdBc3NlbWJseURlc2NyaXB0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgb2xkQXNzZW1ibHlEZXNjcmlwdG9yLCBuZXdBc3NlbWJseURlc2NyaXB0b3IpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgbmV3QXNzZW1ibHlEZXNjcmlwdG9yKSB7Ci0JCWlmIChuZXdBc3NlbWJseURlc2NyaXB0b3IgIT0gYXNzZW1ibHlEZXNjcmlwdG9yKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhc3NlbWJseURlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYXNzZW1ibHlEZXNjcmlwdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVIsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3QXNzZW1ibHlEZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Fzc2VtYmx5RGVzY3JpcHRvcikuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXNzZW1ibHlEZXNjcmlwdG9yKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgbmV3QXNzZW1ibHlEZXNjcmlwdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGVudGVycHJpc2UtYmVhbnMgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIG9uZSBvciBtb3JlCi0JICogZW50ZXJwcmlzZSBiZWFucy4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RW50ZXJwcmlzZUJlYW5zKCkgewotCQlpZiAoZW50ZXJwcmlzZUJlYW5zID09IG51bGwpIHsKLQkJCWVudGVycHJpc2VCZWFucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KEVudGVycHJpc2VCZWFuLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSKTsKLQkJfQotCQlyZXR1cm4gZW50ZXJwcmlzZUJlYW5zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByZWxhdGlvbnNoaXBzIGNvbGxlY3Rpb24gZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluIHdoaWNoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlIGVudGl0eSBiZWFucyBhbmQgZGVwZW5kZW50IG9iamVjdHMgcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGEgbGlzdCBvZiBlamItZW50aXR5LXJlZiBlbGVtZW50cyAocmVmZXJlbmNlcyB0byBlbnRpdHkgYmVhbnMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzIGJ1dCB3aG9zZSBhYnN0cmFjdCBwZXJzaXN0ZW5jZSBzY2hlbWFzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGVqYi1qYXIgZmlsZSk7Ci0JICogYW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuCi0JICovCi0JcHVibGljIFJlbGF0aW9uc2hpcHMgZ2V0UmVsYXRpb25zaGlwTGlzdCgpIHsKLQkJcmV0dXJuIHJlbGF0aW9uc2hpcExpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVsYXRpb25zaGlwTGlzdChSZWxhdGlvbnNoaXBzIG5ld1JlbGF0aW9uc2hpcExpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUmVsYXRpb25zaGlwcyBvbGRSZWxhdGlvbnNoaXBMaXN0ID0gcmVsYXRpb25zaGlwTGlzdDsKLQkJcmVsYXRpb25zaGlwTGlzdCA9IG5ld1JlbGF0aW9uc2hpcExpc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQX0xJU1QsIG9sZFJlbGF0aW9uc2hpcExpc3QsIG5ld1JlbGF0aW9uc2hpcExpc3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbGF0aW9uc2hpcExpc3QoUmVsYXRpb25zaGlwcyBuZXdSZWxhdGlvbnNoaXBMaXN0KSB7Ci0JCWlmIChuZXdSZWxhdGlvbnNoaXBMaXN0ICE9IHJlbGF0aW9uc2hpcExpc3QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlbGF0aW9uc2hpcExpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVsYXRpb25zaGlwTGlzdCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdSZWxhdGlvbnNoaXBMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlbGF0aW9uc2hpcExpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX0pBUiwgUmVsYXRpb25zaGlwcy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZWxhdGlvbnNoaXBMaXN0KG5ld1JlbGF0aW9uc2hpcExpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVCwgbmV3UmVsYXRpb25zaGlwTGlzdCwgbmV3UmVsYXRpb25zaGlwTGlzdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCWlmIChhc3NlbWJseURlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFzc2VtYmx5RGVzY3JpcHRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbnVsbCwgbXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3Ipb3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnRlcnByaXNlQmVhbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNUOgotCQkJCWlmIChyZWxhdGlvbnNoaXBMaXN0ICE9IG51bGwpCi0JCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWxhdGlvbnNoaXBMaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVsYXRpb25zaGlwTGlzdCgoUmVsYXRpb25zaGlwcylvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW50ZXJwcmlzZUJlYW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZWxhdGlvbnNoaXBMaXN0KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkNsaWVudEphcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TOgotCQkJCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTGlzdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVI6Ci0JCQkJc2V0RWpiQ2xpZW50SmFyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TOgotCQkJCWdldEVudGVycHJpc2VCZWFucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJc2V0UmVsYXRpb25zaGlwTGlzdCgoUmVsYXRpb25zaGlwcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKLQkJCQlzZXRFamJDbGllbnRKYXIoRUpCX0NMSUVOVF9KQVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJZ2V0RW50ZXJwcmlzZUJlYW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJc2V0UmVsYXRpb25zaGlwTGlzdCgoUmVsYXRpb25zaGlwcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKLQkJCQlyZXR1cm4gRUpCX0NMSUVOVF9KQVJfRURFRkFVTFQgPT0gbnVsbCA/IGVqYkNsaWVudEphciAhPSBudWxsIDogIUVKQl9DTElFTlRfSkFSX0VERUZBVUxULmVxdWFscyhlamJDbGllbnRKYXIpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbCA6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBhc3NlbWJseURlc2NyaXB0b3IgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TOgotCQkJCXJldHVybiBlbnRlcnByaXNlQmVhbnMgIT0gbnVsbCAmJiAhZW50ZXJwcmlzZUJlYW5zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQlyZXR1cm4gcmVsYXRpb25zaGlwTGlzdCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZWpiQ2xpZW50SmFyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlamJDbGllbnRKYXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRSZWxhdGlvbnNoaXBSb2xlKFN0cmluZyBhUm9sZU5hbWUsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgc291cmNlQ01QKSB7Ci0JCWlmIChhUm9sZU5hbWUgPT0gbnVsbCB8fCBzb3VyY2VDTVAgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IG51bGw7Ci0JCWlmIChnZXRSZWxhdGlvbnNoaXBMaXN0KCkgIT0gbnVsbCkgewotCQkJTGlzdCByZWxhdGlvbnMgPSBnZXRSZWxhdGlvbnNoaXBMaXN0KCkuZ2V0RWpiUmVsYXRpb25zKCk7Ci0JCQlpbnQgc2l6ZSA9IHJlbGF0aW9ucy5zaXplKCk7Ci0JCQlFSkJSZWxhdGlvbiByZWwgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlyZWwgPSAoRUpCUmVsYXRpb24pIHJlbGF0aW9ucy5nZXQoaSk7Ci0JCQkJcm9sZSA9IHJlbC5nZXRSZWxhdGlvbnNoaXBSb2xlKGFSb2xlTmFtZSk7Ci0JCQkJaWYgKHJvbGUgIT0gbnVsbCAmJiByb2xlLmdldFNvdXJjZUVudGl0eSgpID09IHNvdXJjZUNNUCkKLQkJCQkJcmV0dXJuIHJvbGU7CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgRUpCUmVsYXRpb24gZ2V0RUpCUmVsYXRpb24oU3RyaW5nIGFSZWxhdGlvbk5hbWUpIHsKLQkJUmVsYXRpb25zaGlwcyByZWxMaXN0ID0gZ2V0UmVsYXRpb25zaGlwTGlzdCgpOwotCQlpZiAocmVsTGlzdCAhPSBudWxsKSB7Ci0JCQlMaXN0IHJlbHMgPSByZWxMaXN0LmdldEVqYlJlbGF0aW9ucygpOwotCQkJaW50IHNpemUgPSByZWxzLnNpemUoKTsKLQkJCUVKQlJlbGF0aW9uIHJlbCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXJlbCA9IChFSkJSZWxhdGlvbikgcmVscy5nZXQoaSk7Ci0JCQkJaWYgKHJlbCA9PSBudWxsKSBjb250aW51ZTsKLQkJCQlpZiAoYVJlbGF0aW9uTmFtZS5lcXVhbHMocmVsLmdldE5hbWUoKSkpCi0JCQkJCXJldHVybiByZWw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBzZWUgRUpCSmFyI2dldEVKQlJlbGF0aW9uc0ZvclNvdXJjZShDb250YWluZXJNYW5hZ2VkRW50aXR5KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVKQlJlbGF0aW9uc0ZvclNvdXJjZShDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlSZWxhdGlvbnNoaXBzIHJlbExpc3QgPSBnZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlbExpc3QgIT0gbnVsbCkgewotCQkJTGlzdCByZWxzID0gcmVsTGlzdC5nZXRFamJSZWxhdGlvbnMoKTsKLQkJCWludCBzaXplID0gcmVscy5zaXplKCk7Ci0JCQlFSkJSZWxhdGlvbiByZWwgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlyZWwgPSAoRUpCUmVsYXRpb24pIHJlbHMuZ2V0KGkpOwotCQkJCWlmIChyZWwgPT0gbnVsbCkgY29udGludWU7Ci0JCQkJTGlzdCByb2xlcyA9IHJlbC5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotCQkJCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJvbGVzLnNpemUoKTsgaisrKSB7Ci0JCQkJCXJvbGUgPSAoRUpCUmVsYXRpb25zaGlwUm9sZSkgcm9sZXMuZ2V0KGopOwotCQkJCQlpZiAocm9sZS5nZXRTb3VyY2VFbnRpdHkoKSA9PSBjbXApIHsKLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlyZXN1bHQuYWRkKHJlbCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlc0ZvclR5cGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJUmVsYXRpb25zaGlwcyByZWxMaXN0ID0gZ2V0UmVsYXRpb25zaGlwTGlzdCgpOwotCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyZWxMaXN0ICE9IG51bGwpIHsKLQkJCUxpc3QgcmVscyA9IHJlbExpc3QuZ2V0RWpiUmVsYXRpb25zKCk7Ci0JCQlpbnQgc2l6ZSA9IHJlbHMuc2l6ZSgpOwotCQkJRUpCUmVsYXRpb24gcmVsID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJcmVsID0gKEVKQlJlbGF0aW9uKSByZWxzLmdldChpKTsKLQkJCQlpZiAocmVsID09IG51bGwpIGNvbnRpbnVlOwotCQkJCUxpc3Qgcm9sZXMgPSByZWwuZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQkJCQlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByb2xlcy5zaXplKCk7IGorKykgewotCQkJCQlyb2xlID0gKEVKQlJlbGF0aW9uc2hpcFJvbGUpIHJvbGVzLmdldChqKTsKLQkJCQkJaWYgKGNtcC5lcXVhbHMoKChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSByb2xlKS5nZXRUeXBlRW50aXR5KCkpKSB7Ci0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcmVzdWx0LmFkZChyb2xlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphclJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFyUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMTQyZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFyUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIEVKQkphclJlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkgewotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckR0ZHMoKSB7Ci0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8xXzEsICJlamItamFyXzFfMS5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5FSkJKQVJfQUxUX1NZU1RFTUlEXzFfMSwgImVqYi1qYXJfMS4xLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8yXzAsICJlamItamFyXzJfMC5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5FSkJKQVJfQUxUX1NZU1RFTUlEXzJfMCwgImVqYi1qYXJfMi4wLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkVKQl9KQVJfU0NIRU1BX0xPQ18yXzEsICJlamItamFyXzJfMS54c2QiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiAgCi0JICovCi0JcHVibGljIEVKQkphclJlc291cmNlRmFjdG9yeSgpIHsKLQkJc3VwZXIoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZW5kZXJlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBFSkJSZXNvdXJjZUltcGwodXJpLCBhUmVuZGVyZXIpOwotCX0KLQkvKioKLQkgKiBSZWdpc3RlciBteXNlbGYgd2l0aCB0aGUgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUsIG5ldyBFSkJKYXJSZXNvdXJjZUZhY3RvcnkoYVJlbmRlcmVyRmFjdG9yeSkpOwotCX0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUklfT0JKKTsKLQl9Ci0JCi0JLyoqCi0JICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLQkgKiBAc2VlICNyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUsIG5ldyBFSkJKYXJSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCTWV0aG9kQ2F0ZWdvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJNZXRob2RDYXRlZ29yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjNDg3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJNZXRob2RDYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk1ldGhvZENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotCi0vKioKLSAqIFRoZSB2YWxpZCBFSkIgbWV0aG9kIGNhdGVnb3J5IG5hbWVzIGFyZTogRUpCSE9NRU1FVEhPRCwgRUpCQ1JFQVRFTUVUSE9ELCBFSkJGSU5ERVJNRVRIT0QsIEVKQlJFTU9URU1FVEhPRC4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQk1ldGhvZENhdGVnb3J5SW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVKQk1ldGhvZENhdGVnb3J5IHsKLQotCXB1YmxpYyBFSkJNZXRob2RDYXRlZ29yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FSkJfTUVUSE9EX0NBVEVHT1JZOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDBmNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJlbGF0aW9uc2hpcHM7Ci0KLS8qKgotICogVGhlIGVqYi1yZWxhdGlvbiBlbGVtZW50IGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZS4gQW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgY29udGFpbnMgYSBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudDsgYW5kIGV4YWN0bHkgdHdvIHJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlcy4gVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0gKiAKLSAqIEBpbnZhcmlhbnQgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0gKiBAaW52YXJpYW50IHNlbGYucmVsYXRpb25zaGlwUm9sZXMuc2l6ZSA9PSAyCi0gKiBAaW52YXJpYW50IHNlbGYucmVsYXRpb25zaGlwUm9sZXNbMF0ubmFtZSAhPSBzZWxmLnJlbGF0aW9uc2hpcFJvbGVzWzFdLm5hbWUKLSAqIAotICogQG1pZ3JhdGlvbiBFSkIxLjEgTW92ZWQgZnJvbSBlamJleHQ6OkVqYlJlbGF0aW9uc2hpcFJvbGUgY29udGFpbmVkIHVuZGVyIGVqYmV4dDo6RUpCSmFyRXh0ZW5zaW9uCi0gKiBAbWlncmF0aW9uIEVKQjEuMSBhZGRlZCBvcHRpb25hbCBhdHRyaWJ1dGUsIGRlc2NyaXB0aW9uOlN0cmluZwotICogQG1pZ3JhdGlvbiBFSkIxLjEgYWRkZWQgb3B0aW9uYWwgYXR0cmlidXRlLCBuYW1lOlN0cmluZyAoTWF5IGhhdmUgYmVlbiBpbmhlcml0ZWQgZnJvbSBFT2JqZWN0IHByZXZpb3VzbHkpCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJSZWxhdGlvbkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBFSkJSZWxhdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZWxhdGlvbnNoaXBSb2xlcyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIEVKQlJlbGF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVKQl9SRUxBVElPTjsKLQl9Ci0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUmVsYXRpb25zaGlwUm9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JcmV0dXJuIGdldFJlbGF0aW9uc2hpcFJvbGVzKCkuY29udGFpbnMoYVJvbGUpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHJvbGVzLgotICovCi1wdWJsaWMgRUxpc3QgZ2V0Q29tbW9uUm9sZXMoKSB7Ci0JcmV0dXJuIGdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgZmlyc3Qgcm9sZS4KLSAqLwotcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0Rmlyc3RDb21tb25Sb2xlKCkgewotCXJldHVybiBnZXRGaXJzdFJvbGUoKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBmaXJzdCByb2xlLgotICovCi1wdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRGaXJzdFJvbGUoKSB7Ci0JTGlzdCBsaXN0ID0gZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQlpZiAobGlzdC5zaXplKCkgPT0gMCkKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIChFSkJSZWxhdGlvbnNoaXBSb2xlKSBsaXN0LmdldCgwKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBvdGhlciByb2xlLgotICovCi1wdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRPcHBvc2l0ZVJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSAhPSBudWxsKSB7Ci0JCWlmIChhUm9sZSA9PSBnZXRGaXJzdFJvbGUoKSkKLQkJCXJldHVybiBnZXRTZWNvbmRSb2xlKCk7Ci0JCWlmIChhUm9sZSA9PSBnZXRTZWNvbmRSb2xlKCkpCi0JCQlyZXR1cm4gZ2V0Rmlyc3RSb2xlKCk7Ci0JfQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGZpcnN0IHJvbGUuCi0gKi8KLXB1YmxpYyBDb21tb25SZWxhdGlvbnNoaXBSb2xlIGdldFNlY29uZENvbW1vblJvbGUoKSB7Ci0JcmV0dXJuIGdldFNlY29uZFJvbGUoKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBzZWNvbmQgcm9sZS4KLSAqLwotcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0U2Vjb25kUm9sZSgpIHsKLQlMaXN0IGxpc3QgPSBnZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotCWlmIChsaXN0LnNpemUoKSA8IDIpCi0JCXJldHVybiBudWxsOwotCXJldHVybiAoRUpCUmVsYXRpb25zaGlwUm9sZSkgbGlzdC5nZXQoMSk7Ci19Ci0vKioKLSAqIFNldCB0aGUgZm9yd2FyZCByb2xlLiAgSW1wbGVtZW50ZWQgYnkgZW5zdXJpbmcgdGhhdCB0aGUgcGFzc2VkIHJvbGUgaXMgdGhlIGZpcnN0IHJvbGUgCi0gKiB3aGljaCBpcyB0aGUgInRpZWJyZWFrZXIiIGluIGNhc2Ugb2YgdW5jbGVhciByZWxhdGlvbnNoaXBzLCBzdWNoIGFzIDE6MS4KLSAqLwotcHVibGljIHZvaWQgc2V0Rm93YXJkKEVKQlJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIHsKLQkKLQlFTGlzdCByb2xlcyA9IGdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JaW50IGN1cnJlbnRJbmRleCA9IHJvbGVzLmluZGV4T2YoYVJvbGUpOwotCWlmIChjdXJyZW50SW5kZXggIT0gMCkgewotCQlpZiAoY3VycmVudEluZGV4ID4gLTEpCi0JCQlyb2xlcy5tb3ZlKDAsIGFSb2xlKTsKLQkJZWxzZQotCQkJcm9sZXMuc2V0KDAsIGFSb2xlKTsKLQl9Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgZWpiIHJlbGF0aW9uLgotCSAqIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBJZiBzcGVjaWZpZWQsIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlLgotCSAqIEBpbnZhcmlhbnQgc2VsZi5uYW1lIHVuaXF1ZSB3aXRoaW4gU2V0PGNvbGxlY3QoZWpiSmFyLmVqYlJlbGF0aW9ucy5uYW1lKT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgUmVsYXRpb25zaGlwcyBnZXRSZWxhdGlvbnNoaXBMaXN0KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1QpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFJlbGF0aW9uc2hpcHMpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlbGF0aW9uc2hpcExpc3QoUmVsYXRpb25zaGlwcyBuZXdSZWxhdGlvbnNoaXBMaXN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdSZWxhdGlvbnNoaXBMaXN0LCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1QsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXBMaXN0KFJlbGF0aW9uc2hpcHMgbmV3UmVsYXRpb25zaGlwTGlzdCkgewotCQlpZiAobmV3UmVsYXRpb25zaGlwTGlzdCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1QgJiYgbmV3UmVsYXRpb25zaGlwTGlzdCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1JlbGF0aW9uc2hpcExpc3QpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdSZWxhdGlvbnNoaXBMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlbGF0aW9uc2hpcExpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUywgUmVsYXRpb25zaGlwcy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZWxhdGlvbnNoaXBMaXN0KG5ld1JlbGF0aW9uc2hpcExpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNULCBuZXdSZWxhdGlvbnNoaXBMaXN0LCBuZXdSZWxhdGlvbnNoaXBMaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgZXhhY3RseSB0d28gcmVsYXRpb25zaGlwIHJvbGVzLgotCSAqIAotCSAqIEBtaWdyYXRpb24gRUpCMS4xIENvbnRhaW5tZW50IHVzZWQgdG8gYmUgYnkgcmVmZXJlbmNlIG9uIHJlbGF0aW9uLS1ub3cgYnkgdmFsdWUuCi0KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVsYXRpb25zaGlwUm9sZXMoKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXBSb2xlcyA9PSBudWxsKSB7Ci0JCQlyZWxhdGlvbnNoaXBSb2xlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfUk9MRVMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVApOwotCQl9Ci0JCXJldHVybiByZWxhdGlvbnNoaXBSb2xlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVsYXRpb25zaGlwTGlzdCgoUmVsYXRpb25zaGlwcylvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfUk9MRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZWxhdGlvbnNoaXBSb2xlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNUOgotCQkJCXJldHVybiBiYXNpY1NldFJlbGF0aW9uc2hpcExpc3QobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfUk9MRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZWxhdGlvbnNoaXBSb2xlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNUOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlMsIFJlbGF0aW9uc2hpcHMuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNUOgotCQkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfUk9MRVM6Ci0JCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJc2V0UmVsYXRpb25zaGlwTGlzdCgoUmVsYXRpb25zaGlwcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX1JPTEVTOgotCQkJCWdldFJlbGF0aW9uc2hpcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWxhdGlvbnNoaXBSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQlzZXRSZWxhdGlvbnNoaXBMaXN0KChSZWxhdGlvbnNoaXBzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUzoKLQkJCQlnZXRSZWxhdGlvbnNoaXBSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNUOgotCQkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBMaXN0KCkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUzoKLQkJCQlyZXR1cm4gcmVsYXRpb25zaGlwUm9sZXMgIT0gbnVsbCAmJiAhcmVsYXRpb25zaGlwUm9sZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlIGdldFJlbGF0aW9uc2hpcFJvbGUoU3RyaW5nIGFSb2xlTmFtZSkgewotCQlpZiAoYVJvbGVOYW1lID09IG51bGwpIHJldHVybiBudWxsOwotCQlMaXN0IHJvbGVzID0gZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQkJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlcy5zaXplKCk7IGkrKykgewotCQkJcm9sZSA9IChFSkJSZWxhdGlvbnNoaXBSb2xlKSByb2xlcy5nZXQoaSk7Ci0JCQlpZiAoYVJvbGVOYW1lLmVxdWFscyhyb2xlLmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIHJvbGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkJCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25zaGlwUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0NWZlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5JUm9sZVNoYXBlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLklEVXRpbDsKLS8qKgotICogVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGRlc2NyaWJlcyBhIHJvbGUgd2l0aGluIGEgcmVsYXRpb25zaGlwLgotICogVGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4gVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOyB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBjbXItZmllbGQsIGlmIGFueSwgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIGFuIGVudGl0eS1iZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMsIGJvdGggcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgbXVzdCBkZWNsYXJlIGEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjbXItZmllbGQgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUgc3BlY2lmaWVzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyB1bmlkaXJlY3Rpb25hbCBpbiBuYXZpZ2FiaWxpdHkgYW5kIHRoYXQgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBpcyAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotICogCi0gKiBAaW52YXJpYW50IG11bHRpcGxpY2l0eSAhPSBudWxsCi0gKiBAaW52YXJpYW50IHJvbGVTb3VyY2UgIT0gbnVsbAotICogQGludmFyaWFudCBDYXNjYWRlIGRlbGV0ZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgaW4gYW4gRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IGluIHdoaWNoIHRoZSByb2xlU291cmNlIGVsZW1lbnQgc3BlY2lmaWVzIGEgZGVwZW5kZW50IG9iamVjdCBjbGFzcy4gCi0gKiBAaW52YXJpYW50IENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gRUpCUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgaW4gYW4gRUpCUmVsYXRpb24gaW4gd2hpY2ggdGhlIG90aGVyIEVKQlJlbGF0aW9uc2hpcFJvbGUgZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLgotICogCi0gKiBFeGFtcGxlOgotICogPGVqYi1yZWxhdGlvbj4KLSAqICAgPGVqYi1yZWxhdGlvbi1uYW1lPlByb2R1Y3QtTGluZUl0ZW08Ly9lamItcmVsYXRpb24tbmFtZT4KLSAqICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAqICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zPC8vZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gKiAgICAgPG11bHRpcGxpY2l0eT5PbmU8Ly9tdWx0aXBsaWNpdHk+Ci0gKiAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAqICAgICAgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC8vZWpiLW5hbWU+Ci0gKiAgICAgPC8vcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICogICA8Ly9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gKiAuLi4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRUpCUmVsYXRpb25zaGlwUm9sZSB7Ci0KLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFTGlzdCBFTVBUWV9FTElTVCA9IG5ldyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCgwKTsKLQotCS8vIE5lZWQgdG8gY2FjaGUgdGhlIGNvbXB1dGVkIGF0dHJpYnV0ZXMgc28gdGhhdCB0aGV5IG1haW50YWluIGlkZW50aXR5Ci0JcHJvdGVjdGVkIEVMaXN0IGZBdHRyaWJ1dGVzID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZOYW1lID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVJvbGVTaGFwZVN0cmF0ZWd5IHJvbGVTaGFwZVN0cmF0ZWd5OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX1NUUkFURUdZX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCMjBGbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTU9OX1JPTEVfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBDT01NT05fUk9MRV9DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBST0xFX1NUUkFURUdZX0NMQVNTOwotCXByaXZhdGUgc3RhdGljIENvbnN0cnVjdG9yIFJPTEVfU1RSQVRFR1lfQ09OU1RSVUNUT1I7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU1VGRklYID0gIkludmVyc2UiOyAvLyROT04tTkxTLTEkCi0gICAgCi0JcHJpdmF0ZSBib29sZWFuIHRvU3RyaW5nR3VhcmQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVOYW1lKCkgPGVtPlJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJvbGVOYW1lID0gUk9MRV9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdWx0aXBsaWNpdHkoKSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTXVsdGlwbGljaXR5S2luZCBNVUxUSVBMSUNJVFlfRURFRkFVTFQgPSBNdWx0aXBsaWNpdHlLaW5kLk9ORV9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE11bHRpcGxpY2l0eUtpbmQgbXVsdGlwbGljaXR5ID0gTVVMVElQTElDSVRZX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTXVsdGlwbGljaXR5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdWx0aXBsaWNpdHlFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNjYWRlRGVsZXRlKCkgPGVtPkNhc2NhZGUgRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVEZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDQVNDQURFX0RFTEVURV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZURlbGV0ZSA9IENBU0NBREVfREVMRVRFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ2FzY2FkZSBEZWxldGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZURlbGV0ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBSb2xlU291cmNlIHNvdXJjZSA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIENNUkZpZWxkIGNtckZpZWxkID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gd2FzRm9yd2FyZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiB3YXNNYW55ID0gZmFsc2U7Ci0gICAgCi0JcHJpdmF0ZSBib29sZWFuIGlzS2V5U2V0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGtleSA9IGZhbHNlOwotCQotCXByaXZhdGUgdHJhbnNpZW50IEJvb2xlYW4gcmVxdWlyZWQgPSBudWxsOwotCi0JcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRUpCX1JFTEFUSU9OU0hJUF9ST0xFOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZXMgZnJvbSBteSBFbnRpdHkgdGhhdCBhcmUgdXNlZAotCSAqIGJ5IHRoaXMgcm9sZS4KLQkgKi8KLQkKLQlwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGZBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWZBdHRyaWJ1dGVzID0gbmV3IEJhc2ljRUxpc3QoMSk7Ci0JCX0KLQkJaWYgKGZBdHRyaWJ1dGVzLmlzRW1wdHkoKSkgewotCQkJZ2V0Um9sZVNoYXBlU3RyYXRlZ3koKS5yZWNvbmNpbGVBdHRyaWJ1dGVzKGZBdHRyaWJ1dGVzKTsKLQkJfQotCQlyZXR1cm4gZkF0dHJpYnV0ZXM7Ci0JfQotCS8qKgotCSAqIFJldHVybiBvdXIgcGFyZW50IHJlbGF0aW9uc2hpcCBhcyBhIENvbW1vblJlbGF0aW9uc2hpcAotCSAqLwotCi0JcHVibGljIENvbW1vblJlbGF0aW9uc2hpcCBnZXRDb21tb25SZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiBnZXRSZWxhdGlvbnNoaXAoKTsKLQl9Ci0JcHJvdGVjdGVkIElSb2xlU2hhcGVTdHJhdGVneSBnZXREZWZhdWx0Um9sZVNoYXBlU3RyYXRlZ3koKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElSb2xlU2hhcGVTdHJhdGVneSkgZ2V0Um9sZVN0cmF0ZWd5Q29uc3RydWN0b3IodGhpcykubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgdGhpcyB9KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRUpCUmVsYXRpb25zaGlwUm9sZUltcGw6Q291bGQgbm90IGluc3RhbnRpYXRlIHJvbGUgc2hhcGUgc3RyYXRlZ3k7IHRoaXMgcmVxdWlyZXMgZXh0ZW5zaW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IodCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBsb2dpY2FsIG5hbWUgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIG5hbWluZyB0aGlzIHJvbGUuCi0JICogUmVxdWlyZWQgdG8gYmUgdW5pcXVlIHdpdGhpbiBhIEpBUi4KLQkgKiBJZiBhIGNtci1maWVsZCBpcyBkZWZpbmVkLCB0aGVuIGEgbmFtZSBpbiB0aGUgZm9ybSAlc291cmNlLWVqYi1uYW1lJV8lY21yLWZpZWxkLW5hbWUlIGlzIGNvbXB1dGVkLgotCSAqIE90aGVyd2lzZSBhIGRlZmF1bHQgSUQgaXMgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9naWNhbE5hbWUoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgcXVhbGlmaWVyID0gZ2V0Q21yRmllbGQoKS5nZXROYW1lKCk7Ci0JCWlmIChxdWFsaWZpZXIgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZ2V0U291cmNlKCkuZ2V0RW50aXR5QmVhbigpLmdldE5hbWUoKSArICJfIiArIHF1YWxpZmllcjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJLy8gQXBwbHkgYSBkZWZhdWx0IElECi0JCQlyZXN1bHQgPSBJRFV0aWwuZ2V0T3JBc3NpZ25JRCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBuYW1lIGZvciB0aGlzIHJvbGUsIGRlcml2ZWQgZnJvbSB0aGUgQ01SLWZpZWxkIG5hbWUKLQkgKiBVc2VkIHRvIGRldGVybWluZSB0aGUgbmFtZSB1c2VkIGluIHF1ZXJ5aW5nIHRoaXMgcm9sZSBhcyB3ZWxsIGFzIHRoZSBhY2Nlc3NvciBtZXRob2QgbmFtZXMgd2hpY2ggaW1wbGVtZW50IGl0LgotCSAqIE5vdGU6IG1heSByZXR1cm4gdGhlIFhNSSBJRCBmb3Igbm9uLW5hdmlnYWJsZSByb2xlcywgaWUgLSB3aGVyZSB0aGVyZSBpcyBubyBDTVItZmllbGQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoZk5hbWUgPT0gbnVsbCkgewotCQkJaWYgKGdldENtckZpZWxkKCkgIT0gbnVsbCkKLQkJCQlmTmFtZSA9IGdldENtckZpZWxkKCkuZ2V0TmFtZSgpOwotCQkJZWxzZSBpZiAoZ2V0T3Bwb3NpdGUoKSAhPSBudWxsKSB7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZSBvcCA9IGdldE9wcG9zaXRlKCk7Ci0JCQkJaWYgKG9wLmdldENtckZpZWxkKCkgIT0gbnVsbCkKLQkJCQkJZk5hbWUgPSBvcC5nZXRDbXJGaWVsZCgpLmdldE5hbWUoKSArIG9wLmdldFNvdXJjZUVudGl0eSgpLmdldE5hbWUoKSArIE5BTUVfU1VGRklYOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZUdldElkKCkgPT0gbnVsbCkgCi0JCQkJCWVTZXRJZCgpOwotCQkJCWZOYW1lID0gZUdldElkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZOYW1lOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG90aGVyIHJvbGUuCi0JICovCi0JcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0T3Bwb3NpdGUoKSB7Ci0JCWlmIChnZXRSZWxhdGlvbnNoaXAoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcCgpLmdldE9wcG9zaXRlUm9sZSh0aGlzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgb3RoZXIgcm9sZS4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBnZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpIHsKLQkJcmV0dXJuIGdldE9wcG9zaXRlKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMS8xNS8yMDAwIDY6NTA6MzAgUE0pCi0JICogQHJldHVybiBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmVqYmV4dC5pbXBsLklSb2xlU2hhcGVTdHJhdGVneQotCSAqLwotCXB1YmxpYyBJUm9sZVNoYXBlU3RyYXRlZ3kgZ2V0Um9sZVNoYXBlU3RyYXRlZ3koKSB7Ci0JCWlmIChyb2xlU2hhcGVTdHJhdGVneSA9PSBudWxsKQotCQkJcm9sZVNoYXBlU3RyYXRlZ3kgPSBnZXREZWZhdWx0Um9sZVNoYXBlU3RyYXRlZ3koKTsKLQkJcmV0dXJuIHJvbGVTaGFwZVN0cmF0ZWd5OwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBTb3VyY2UgZWpiCi0JICogQ29tcHV0ZSB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSB3aGljaCBpcyB0aGUgc291cmNlIG9mIGEgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gCi0JICovCi0JcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0U291cmNlRW50aXR5KCkgewotCQlpZihudWxsID09IGdldFNvdXJjZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0U291cmNlKCkuZ2V0RW50aXR5QmVhbigpOwotCX0KLQkvKioKLQkqIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIG9mIHRoZSBpc0ZvcndhcmQgYXR0cmlidXRlCi0JKiBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHJvbGUgc2hvdWxkIGJlIG1hcHBlZCB0byBhIHBlcnNpc3RlbnQgcmVmZXJlbmNlLCBzdWNoIGFzIGEgZm9yZWlnbiBrZXkuCi0JKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpczoKLQkqIC0gaWYgdGhlIHJvbGUgaXMgbWFueSwgaXQgY2Fubm90IGJlIGZvcndhcmQKLQkqIC0gaWYgdGhlIHJvbGUgaXMgc2luZ2xlIGFuZCBub3QgbmF2aWdhYmxlLCBpdCBjYW5ub3QgYmUgZm9yd2FyZAotCSogLSBhbGwgb3RoZXIgdGhpbmdzIGJlaW5nIGVxdWFsLCB0aGUgZmlyc3Qgcm9sZSBpcyBjb25zaWRlcmVkIHRvIGJlIGZvcndhcmQKLQkqIC0gY2xpZW50cyBjYW4gbWFuaXB1bGF0ZSB0aGlzIGJ5IHNldHRpbmcgYW4gYW1iaWd1b3VzIHJvbGUgdG8gYmUgZndkIChieSBtYW5pcHVsYXRpbmcgdGhlIHJvbGUgb3JkZXIgdW5kZXIgdGhlIGNvdmVycykuCi0JKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcndhcmQoKSB7Ci0JCWlmICh0aGlzLmlzTWFueSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIHdhc0ZvcndhcmQ7Ci0JCWlmIChnZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpLmlzTWFueSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JICAgLy8gaWYgKCF0aGlzLmlzTmF2aWdhYmxlKCkpICByZW1vdmVkIHRvIGFsbG93IG5vbi1uYXZpZ2FibGUgcm9sZSBpbiBrZXkKLQkgICAvLyAgICByZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRSZWxhdGlvbnNoaXAoKSA9PSBudWxsKQotCQkJcmV0dXJuIHdhc0ZvcndhcmQ7Ci0JCXJldHVybiAoZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Rmlyc3RSb2xlKCkgPT0gdGhpcyk7Ci0JfQotCS8qKgotCSogQHJldHVybiBUaGUgY29tcHV0ZWQgdmFsdWUgaXNLZXkKLQkqLwotCXB1YmxpYyBib29sZWFuIGlzS2V5KCkgewotCQlpZiAoaXNLZXlTZXQpCi0JCQlyZXR1cm4ga2V5OwotCQlyZXR1cm4gaXNLZXlGcm9tQXR0cmlidXRlcygpOwotCX0KLSAgICAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0tleUZyb21BdHRyaWJ1dGVzKCkgewotCQlMaXN0IGxpc3QgPSBnZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGU7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWF0dHJpYnV0ZSA9IChDTVBBdHRyaWJ1dGUpIGl0Lm5leHQoKTsKLQkJCWlmICghYXR0cmlidXRlLmlzS2V5KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBSb2xlIGFzIGJlaW5nIGtleSBzbyBpdCB3aWxsCi0JICogbm90IHRyYXZlcnNlIGl0IGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGtleS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoYm9vbGVhbiBhQm9vbGVhbikgewotCQlrZXkgPSBhQm9vbGVhbjsKLQkJaXNLZXlTZXQgPSB0cnVlOwotCX0gCi0gCi0JLyoqCi0JICogSGFuZHdyaXR0ZW4gdmVyc2lvbiBvZiBpc01hbnkoKToKLQkgKi8KLSAKLSAKLQlwdWJsaWMgYm9vbGVhbiBpc01hbnkoKSAgeyAKLQkJaWYgKGdldE9wcG9zaXRlKCkgPT0gbnVsbCkgCi0JCQkgcmV0dXJuIHdhc01hbnk7ICAKLQkJcmV0dXJuIGdldE9wcG9zaXRlKCkuZ2V0TXVsdGlwbGljaXR5KCkgPT0gTXVsdGlwbGljaXR5S2luZC5NQU5ZX0xJVEVSQUw7ICAKLQl9IAotIAotICAgICAgICAgCi0KLQkvKioKLQkqIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIG9mIHRoZSBpc05hdmlnYWJsZSBhdHRyaWJ1dGUKLQkqIFNwZWNpZmllcyB0aGF0IGFjY2Vzc29ycyBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGlzIHJlbGF0aW9uc2hpcCByb2xlLgotCSogQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyB0byB0ZXN0IHdoZXRoZXIgb3Igbm90IGEgQ01SIGZpZWxkIGV4aXN0cy4KLQkqLwotCXB1YmxpYyBib29sZWFuIGlzTmF2aWdhYmxlKCkgewotCQlyZXR1cm4gZ2V0Q21yRmllbGQoKSAhPSBudWxsOwotCX0KLQotCi0JcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcygpIHsKLQkJaWYgKGZBdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlnZXRSb2xlU2hhcGVTdHJhdGVneSgpLnJlY29uY2lsZUF0dHJpYnV0ZXMoZkF0dHJpYnV0ZXMpOwotCX0KLQotCi0JLyoqCi0JICogU2V0IHRoaXMgcm9sZSB0byBiZSB0aGUgZm9yd2FyZCByb2xlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvd2FyZCgpIHsKLQkJZ2V0UmVsYXRpb25zaGlwKCkuc2V0Rm93YXJkKHRoaXMpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKGphdmEubGFuZy5TdHJpbmcgdW5pcXVlTmFtZSkgewotCQlmTmFtZSA9IHVuaXF1ZU5hbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmICh0b1N0cmluZ0d1YXJkKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCXRvU3RyaW5nR3VhcmQgPSB0cnVlOwotCQkJU3RyaW5nIG9wcG9zaXRlVHlwZSA9IGdldE9wcG9zaXRlKCkgIT0gbnVsbCA/IGdldFR5cGVFbnRpdHkoKS5nZXROYW1lKCkgOiAiPDx1bmtub3duPj4iOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ2V0TmFtZSgpICsgIigiICsgb3Bwb3NpdGVUeXBlICsgIikiICsgKGlzTWFueSgpID8gIiAqIiA6ICIgMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS50b1N0cmluZygpOwotCQl9IGZpbmFsbHkgewotCQkJdG9TdHJpbmdHdWFyZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZ2V0Q29tbW9uUm9sZUNsYXNzKE9iamVjdCBjYWxsZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQotCQlpZiAoQ09NTU9OX1JPTEVfQ0xBU1MgPT0gbnVsbCkgewotCQkJQ09NTU9OX1JPTEVfQ0xBU1MgPSBsb2FkQ2xhc3MoQ09NTU9OX1JPTEVfQ0xBU1NfTkFNRSwgY2FsbGVyKTsKLQkJfQotCQlyZXR1cm4gQ09NTU9OX1JPTEVfQ0xBU1M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lLCBPYmplY3QgY2FsbGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUNsYXNzTG9hZGVyIGNsID0gY2FsbGVyLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJaWYgKGNsICE9IG51bGwpCi0JCQlyZXR1cm4gY2wubG9hZENsYXNzKG5hbWUpOwotCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBnZXRSb2xlU3RyYXRlZ3lDbGFzcyhPYmplY3QgY2FsbGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChST0xFX1NUUkFURUdZX0NMQVNTID09IG51bGwpCi0JCQlST0xFX1NUUkFURUdZX0NMQVNTID0gbG9hZENsYXNzKFJPTEVfU1RSQVRFR1lfQ0xBU1NfTkFNRSwgY2FsbGVyKTsKLQkJcmV0dXJuIFJPTEVfU1RSQVRFR1lfQ0xBU1M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29uc3RydWN0b3IgZ2V0Um9sZVN0cmF0ZWd5Q29uc3RydWN0b3IoT2JqZWN0IGNhbGxlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCWlmIChST0xFX1NUUkFURUdZX0NPTlNUUlVDVE9SID09IG51bGwpIHsKLQkJCUNsYXNzW10gcGFybVR5cGVzID0gbmV3IENsYXNzW10geyBnZXRDb21tb25Sb2xlQ2xhc3MoY2FsbGVyKX07Ci0JCQlST0xFX1NUUkFURUdZX0NPTlNUUlVDVE9SID0gZ2V0Um9sZVN0cmF0ZWd5Q2xhc3MoY2FsbGVyKS5nZXRDb25zdHJ1Y3RvcihwYXJtVHlwZXMpOwotCQl9Ci0JCXJldHVybiBST0xFX1NUUkFURUdZX0NPTlNUUlVDVE9SOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgCi0JICogdGhlIGVqYiByZWxhdGlvbnNoaXAgcm9sZS4KLQkgKiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlcgotCSAqIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4KLQkgKiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZQotCSAqIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRGVmaW5lcyBhIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQKLQkgKiByZWxhdGlvbnNoaXBzIGNhbiB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgYSByb2xlLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZSgpIHsKLQkJcmV0dXJuIHJvbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGVOYW1lKFN0cmluZyBuZXdSb2xlTmFtZSkgewotCQlTdHJpbmcgb2xkUm9sZU5hbWUgPSByb2xlTmFtZTsKLQkJcm9sZU5hbWUgPSBuZXdSb2xlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JPTEVfTkFNRSwgb2xkUm9sZU5hbWUsIHJvbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE11bHRpcGxpY2l0eUtpbmQgZ2V0TXVsdGlwbGljaXR5KCkgewotCQlyZXR1cm4gbXVsdGlwbGljaXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlLaW5kIG5ld011bHRpcGxpY2l0eSkgewotCQlNdWx0aXBsaWNpdHlLaW5kIG9sZE11bHRpcGxpY2l0eSA9IG11bHRpcGxpY2l0eTsKLQkJbXVsdGlwbGljaXR5ID0gbmV3TXVsdGlwbGljaXR5ID09IG51bGwgPyBNVUxUSVBMSUNJVFlfRURFRkFVTFQgOiBuZXdNdWx0aXBsaWNpdHk7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGljaXR5RVNldCA9IG11bHRpcGxpY2l0eUVTZXQ7Ci0JCW11bHRpcGxpY2l0eUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZLCBvbGRNdWx0aXBsaWNpdHksIG11bHRpcGxpY2l0eSwgIW9sZE11bHRpcGxpY2l0eUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE11bHRpcGxpY2l0eSgpIHsKLQkJTXVsdGlwbGljaXR5S2luZCBvbGRNdWx0aXBsaWNpdHkgPSBtdWx0aXBsaWNpdHk7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGljaXR5RVNldCA9IG11bHRpcGxpY2l0eUVTZXQ7Ci0JCW11bHRpcGxpY2l0eSA9IE1VTFRJUExJQ0lUWV9FREVGQVVMVDsKLQkJbXVsdGlwbGljaXR5RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFksIG9sZE11bHRpcGxpY2l0eSwgTVVMVElQTElDSVRZX0VERUZBVUxULCBvbGRNdWx0aXBsaWNpdHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNdWx0aXBsaWNpdHkoKSB7Ci0JCXJldHVybiBtdWx0aXBsaWNpdHlFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYSBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0JICogZW50aXR5IGJlYW5zIGlzIGRlcGVuZGVudCB1cG9uIHRoZSBsaWZldGltZSBvZiBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUKLQkgKiBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IGNhbiBDYXNjYWRlIGRlbGV0ZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuCi0JICogRUpCUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgaW4gYW4gRUpCcmVsYXRpb24gaW4gd2hpY2ggdGhlIG90aGVyCi0JICogRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0JICogCi0JICogCi0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVEZWxldGUoKSB7Ci0JCXJldHVybiBjYXNjYWRlRGVsZXRlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVEZWxldGUoYm9vbGVhbiBuZXdDYXNjYWRlRGVsZXRlKSB7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZURlbGV0ZSA9IGNhc2NhZGVEZWxldGU7Ci0JCWNhc2NhZGVEZWxldGUgPSBuZXdDYXNjYWRlRGVsZXRlOwotCQlib29sZWFuIG9sZENhc2NhZGVEZWxldGVFU2V0ID0gY2FzY2FkZURlbGV0ZUVTZXQ7Ci0JCWNhc2NhZGVEZWxldGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFLCBvbGRDYXNjYWRlRGVsZXRlLCBjYXNjYWRlRGVsZXRlLCAhb2xkQ2FzY2FkZURlbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHVuc2V0Q2FzY2FkZURlbGV0ZSgpIHsKLQkJYm9vbGVhbiBvbGRDYXNjYWRlRGVsZXRlID0gY2FzY2FkZURlbGV0ZTsKLQkJYm9vbGVhbiBvbGRDYXNjYWRlRGVsZXRlRVNldCA9IGNhc2NhZGVEZWxldGVFU2V0OwotCQljYXNjYWRlRGVsZXRlID0gQ0FTQ0FERV9ERUxFVEVfRURFRkFVTFQ7Ci0JCWNhc2NhZGVEZWxldGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFLCBvbGRDYXNjYWRlRGVsZXRlLCBDQVNDQURFX0RFTEVURV9FREVGQVVMVCwgb2xkQ2FzY2FkZURlbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0Q2FzY2FkZURlbGV0ZSgpIHsKLQkJcmV0dXJuIGNhc2NhZGVEZWxldGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFSkJSZWxhdGlvbiBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEVKQlJlbGF0aW9uKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWxhdGlvbnNoaXAoRUpCUmVsYXRpb24gbmV3UmVsYXRpb25zaGlwLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdSZWxhdGlvbnNoaXAsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVAsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwKEVKQlJlbGF0aW9uIG5ld0NvbnRhaW5lcikgewotCQlpZiAobmV3Q29udGFpbmVyID09IG51bGwgJiYgZ2V0UmVsYXRpb25zaGlwKCkgIT0gbnVsbCkgewotCQkJdXBkYXRlQ2FjaGVkU2V0dGluZ3MoKTsKLQkJCUVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsIHJvbGVPcHBvc2l0ZSA9IChFSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCkgZ2V0T3Bwb3NpdGUoKTsKLQkJCWlmIChyb2xlT3Bwb3NpdGUgIT0gbnVsbCkKLQkJCQlyb2xlT3Bwb3NpdGUudXBkYXRlQ2FjaGVkU2V0dGluZ3MoKTsKLQkJfSBlbHNlCi0JCQl3YXNGb3J3YXJkID0gZmFsc2U7Ci0JCXNldFJlbGF0aW9uc2hpcEdlbihuZXdDb250YWluZXIpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZSNnZXRUYXJnZXRBdHRyaWJ1dGVOYW1lKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5DTVBBdHRyaWJ1dGUpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRBdHRyaWJ1dGVOYW1lKENNUEF0dHJpYnV0ZSByb2xlQXR0cmlidXRlKSB7Ci0JCWludCByb2xlTmFtZVNpemUgPSBnZXROYW1lKCkubGVuZ3RoKCk7Ci0JCXJldHVybiByb2xlQXR0cmlidXRlLmdldE5hbWUoKS5zdWJzdHJpbmcocm9sZU5hbWVTaXplICsgMSk7Ci0JfQotCS8qKgotCSAqIE1ldGhvZCB1cGRhdGVDYWNoZWRTZXR0aW5ncy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWNoZWRTZXR0aW5ncygpIHsKLQkJd2FzRm9yd2FyZCA9IGlzRm9yd2FyZCgpOwotCQl3YXNNYW55ID0gaXNNYW55KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQQotCSAqIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gZW50aXR5IGJlYW4uCi0JICogQG1pZ3JhdGlvbiBFSkIxLjE6IHdhcyBpYm1lamJleHQ6OkVqYlJlbGF0aW9uc2hpcFJvbGU6OnNvdXJjZUVKQk5hbWUsIGJ1dCB0aGF0Ci0JICogbWF5IG5vdCBiZSBzdWZmaWNpZW50LCBhcyB0aGlzIGNhbiBub3cgcmVmZXIgdG8gZGVwZW5kZW50IGNsYXNzIG5hbWVzIG9yIGVqYgotCSAqIHJlZnMKLQkgKi8KLQlwdWJsaWMgUm9sZVNvdXJjZSBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U291cmNlKFJvbGVTb3VyY2UgbmV3U291cmNlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJvbGVTb3VyY2Ugb2xkU291cmNlID0gc291cmNlOwotCQlzb3VyY2UgPSBuZXdTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19TT1VSQ0UsIG9sZFNvdXJjZSwgbmV3U291cmNlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoUm9sZVNvdXJjZSBuZXdTb3VyY2UpIHsKLQkJaWYgKG5ld1NvdXJjZSAhPSBzb3VyY2UpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzb3VyY2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEUsIFJvbGVTb3VyY2UuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1NvdXJjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTb3VyY2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEUsIFJvbGVTb3VyY2UuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U291cmNlKG5ld1NvdXJjZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFLCBuZXdTb3VyY2UsIG5ld1NvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEEgZGVjbGFyYXRpb24gb2YgdGhlIENNUkZpZWxkLCBpZiBhbnksIGJ5IG1lYW5zIG9mIHdoaWNoIHRoZSBvdGhlciBzaWRlIG9mIHRoZQotCSAqIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UKLQkgKiAKLQkgKiBAbWlncmF0aW9uIEVKQjEuMTogVXNlZCB0byBiZSBoYW5kbGVkIHZpYSBpYm1lamJleHQ6OkVqYlJvbGU6OmF0dHJpYnV0ZXMgbGlzdAotCSAqLwotCXB1YmxpYyBDTVJGaWVsZCBnZXRDbXJGaWVsZCgpIHsKLQkJcmV0dXJuIGNtckZpZWxkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENtckZpZWxkKENNUkZpZWxkIG5ld0NtckZpZWxkLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNNUkZpZWxkIG9sZENtckZpZWxkID0gY21yRmllbGQ7Ci0JCWNtckZpZWxkID0gbmV3Q21yRmllbGQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQsIG9sZENtckZpZWxkLCBuZXdDbXJGaWVsZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q21yRmllbGQoQ01SRmllbGQgbmV3Q21yRmllbGQpIHsKLQkJaWYgKG5ld0NtckZpZWxkICE9IGNtckZpZWxkKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjbXJGaWVsZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljbXJGaWVsZCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEUsIENNUkZpZWxkLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdDbXJGaWVsZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDbXJGaWVsZCkuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEUsIENNUkZpZWxkLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENtckZpZWxkKG5ld0NtckZpZWxkLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQsIG5ld0NtckZpZWxkLCBuZXdDbXJGaWVsZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVsYXRpb25zaGlwKChFSkJSZWxhdGlvbilvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19TT1VSQ0U6Ci0JCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc291cmNlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRSwgbnVsbCwgbXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U291cmNlKChSb2xlU291cmNlKW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRDoKLQkJCQlpZiAoY21yRmllbGQgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNtckZpZWxkKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRCwgbnVsbCwgbXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q21yRmllbGQoKENNUkZpZWxkKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQOgotCQkJCXJldHVybiBiYXNpY1NldFJlbGF0aW9uc2hpcChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRTb3VyY2UobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q21yRmllbGQobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUywgRUpCUmVsYXRpb24uY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JPTEVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Um9sZU5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWToKLQkJCQlyZXR1cm4gZ2V0TXVsdGlwbGljaXR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURToKLQkJCQlyZXR1cm4gaXNDYXNjYWRlRGVsZXRlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQOgotCQkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXAoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQ6Ci0JCQkJcmV0dXJuIGdldENtckZpZWxkKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZOgotCQkJCXNldE11bHRpcGxpY2l0eSgoTXVsdGlwbGljaXR5S2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZURlbGV0ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVA6Ci0JCQkJc2V0UmVsYXRpb25zaGlwKChFSkJSZWxhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoUm9sZVNvdXJjZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEOgotCQkJCXNldENtckZpZWxkKChDTVJGaWVsZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZShST0xFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWToKLQkJCQl1bnNldE11bHRpcGxpY2l0eSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFOgotCQkJCXVuc2V0Q2FzY2FkZURlbGV0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUDoKLQkJCQlzZXRSZWxhdGlvbnNoaXAoKEVKQlJlbGF0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFJvbGVTb3VyY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEOgotCQkJCXNldENtckZpZWxkKChDTVJGaWVsZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBST0xFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGVOYW1lICE9IG51bGwgOiAhUk9MRV9OQU1FX0VERUZBVUxULmVxdWFscyhyb2xlTmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFk6Ci0JCQkJcmV0dXJuIGlzU2V0TXVsdGlwbGljaXR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DQVNDQURFX0RFTEVURToKLQkJCQlyZXR1cm4gaXNTZXRDYXNjYWRlRGVsZXRlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVA6Ci0JCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcCgpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIHNvdXJjZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEOgotCQkJCXJldHVybiBjbXJGaWVsZCAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ0dlbigpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJvbGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtdWx0aXBsaWNpdHk6ICIpOwotCQlpZiAobXVsdGlwbGljaXR5RVNldCkgcmVzdWx0LmFwcGVuZChtdWx0aXBsaWNpdHkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXNjYWRlRGVsZXRlOiAiKTsKLQkJaWYgKGNhc2NhZGVEZWxldGVFU2V0KSByZXN1bHQuYXBwZW5kKGNhc2NhZGVEZWxldGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbW1vblJlbGF0aW9uc2hpcFJvbGUjZ2V0VHlwZUVudGl0eSgpCi0JICovCi0JcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0VHlwZUVudGl0eSgpIHsKLQkJaWYgKGdldE9wcG9zaXRlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRPcHBvc2l0ZSgpLmdldFNvdXJjZUVudGl0eSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbW1vblJlbGF0aW9uc2hpcFJvbGUjaXNSZXF1aXJlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLQkJaWYgKHJlcXVpcmVkIT1udWxsKQotCQkJcmV0dXJuIHJlcXVpcmVkLmJvb2xlYW5WYWx1ZSgpOwotCQlyZXR1cm4gaXNLZXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBpc1JlcXVpcmVkIGZsYWcgZm9yIGJvdHRvbSB1cAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gaXNSZXF1aXJlZCkgewotCQlyZXF1aXJlZCA9IGlzUmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwR2VuKEVKQlJlbGF0aW9uIG5ld1JlbGF0aW9uc2hpcCkgewotCQlpZiAobmV3UmVsYXRpb25zaGlwICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVAgJiYgbmV3UmVsYXRpb25zaGlwICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3UmVsYXRpb25zaGlwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3UmVsYXRpb25zaGlwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlbGF0aW9uc2hpcCkuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUywgRUpCUmVsYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVsYXRpb25zaGlwKG5ld1JlbGF0aW9uc2hpcCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQLCBuZXdSZWxhdGlvbnNoaXAsIG5ld1JlbGF0aW9uc2hpcCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGUjc2V0TG93ZXIoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvd2VyKGludCBsb3dlckJvdW5kKSB7Ci0JCS8vIERvIG5vdGhpbmcuLi4gIE9ubHkgdXBwZXJib3VuZCBpcyByZWxldmFudCBoZXJlCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZSNzZXRVcHBlcihpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXBwZXIoaW50IHVwcGVyQm91bmQpIHsKLQkJc3dpdGNoICh1cHBlckJvdW5kKSB7Ci0JCQljYXNlIE11bHRpcGxpY2l0eUtpbmQuT05FIDoKLQkJCQlzZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5S2luZC5PTkVfTElURVJBTCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlzZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5S2luZC5NQU5ZX0xJVEVSQUwpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCS8qKgotCSAgR2V0cyB0aGUgTU9GIFhNSSByZWYgaWQgZm9yIHRoaXMgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGVHZXRJZCgpIHsKLQkJWE1JUmVzb3VyY2UgcmVzID0gKFhNSVJlc291cmNlKWVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlcy5nZXRJRCh0aGlzKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBTZXQgYW5kIHJldHVybiBUaGUgaWQgb2YgdGhpcyBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZVNldElkKCkgewotCi0KLQkJSURVdGlsLmdldE9yQXNzaWduSUQodGhpcyk7Ci0KLQkJcmV0dXJuIGVHZXRJZCgpOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmFhYzgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIuRUpCSmFyVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgRUpCUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgRUpCUmVzb3VyY2UgewotCi0JLyoqCi0JICogQHBhcmFtIHVyaQotCSAqIEBwYXJhbSBhUmVuZGVyZXIKLQkgKi8KLQlwdWJsaWMgRUpCUmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZW5kZXJlcgotCSAqLwotCXB1YmxpYyBFSkJSZXNvdXJjZUltcGwoUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKGFSZW5kZXJlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVKQlJlc291cmNlI2lzRUpCMV8xKCkKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBnZXRNb2R1bGVWZXJzaW9uSUQoKSBhbmQgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQjFfMSgpIHsKLQkJcmV0dXJuIGdldE1vZHVsZVZlcnNpb25JRCgpID09IEVKQl8xXzFfSUQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVKQlJlc291cmNlI2lzRUpCMl8wKCkKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBnZXRNb2R1bGVWZXJzaW9uSUQoKSBhbmQgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQjJfMCgpIHsKLQkJcmV0dXJuIGdldE1vZHVsZVZlcnNpb25JRCgpID09IEVKQl8yXzBfSUQ7Ci0JfQotCi0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gWE1MUmVzb3VyY2UuRUpCX1RZUEU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0RG9jdHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgewotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCQkJCXJldHVybiBKMkVFQ29uc3RhbnRzLkVKQkpBUl9ET0NUWVBFOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfUHVibGljSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkVKQkpBUl9QVUJMSUNJRF8xXzE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8xXzE7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8yX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5FSkJKQVJfQUxUX1NZU1RFTUlEXzFfMTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX1BVQkxJQ0lEXzJfMDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzJfMDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKMkVFX0FsdF8xXzNfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkVKQkpBUl9BTFRfU1lTVEVNSURfMl8wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI2dldFJvb3RUcmFuc2xhdG9yKCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIEVKQkphclRyYW5zbGF0b3IuSU5TVEFOQ0U7Ci0JfQotCQotCS8qIFJldHVybiBKMkVFIHZlcnNpb24gYmFzZWQgb24gbW9kdWxlIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7Ci0JCXN3aXRjaCAoZ2V0TW9kdWxlVmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKLQkJCWRlZmF1bHQgOgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JcHVibGljIEVKQkphciBnZXRFSkJKYXIoKSB7Ci0JCXJldHVybiAoRUpCSmFyKSBnZXRSb290T2JqZWN0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJhdGNoTW9kZShib29sZWFuIGlzQmF0Y2gpIHsKLQkJcmVuZGVyZXIuc2V0QmF0Y2hNb2RlKGlzQmF0Y2gpOwotCi0JfQotCS8qIAotCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7Ci0JCXN1cGVyLnNldFZlcnNpb25JRChpZCk7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCQljYXNlIChFSkJfM18wX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJCXByaW1TZXRWZXJzaW9uSUQoRUpCXzNfMF9JRCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEVKQl8yXzFfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChFSkJfMl8xX0lEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoRUpCXzJfMF9JRCkgOgotCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIChFSkJfMV8xX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEVKQl8xXzBfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCQkJCi0JCQl9Ci0JCXN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JfQotCS8qCi0JICogQmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbiwgdGhpcyB3aWxsIHNldCB0aGUgbW9kdWxlIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCkgewotCXN3aXRjaCAoaWQpIHsKLQkJY2FzZSAoSkVFXzVfMF9JRCkgOgotCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChFSkJfM18wX0lEKTsKLQkJCQkJYnJlYWs7Ci0JCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0JCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQlwcmltU2V0VmVyc2lvbklEKEVKQl8yXzFfSUQpOwotCQkJCQlicmVhazsKLQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCXByaW1TZXRWZXJzaW9uSUQoRUpCXzJfMF9JRCk7Ci0JCQkJCWJyZWFrOwotCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChFSkJfMV8xX0lEKTsKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gRUpCXzJfMV9JRDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmltcGwuWE1MUmVzb3VyY2VJbXBsI3N5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpIHsKLQkJRUpCSmFyIGVqYkphciA9IGdldEVKQkphcigpOwotCQlpZiAoZWpiSmFyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmcgdmVyc2lvbiA9IGVqYkphci5nZXRWZXJzaW9uKCk7Ci0JCVN0cmluZyBuZXdWZXJzaW9uID0gZ2V0TW9kdWxlVmVyc2lvblN0cmluZygpOwotCQlpZiAoIW5ld1ZlcnNpb24uZXF1YWxzKHZlcnNpb24pKQotCQkJZWpiSmFyLnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCYXRjaE1vZGUoKSB7Ci0JCXJldHVybiByZW5kZXJlci5pc0JhdGNoTW9kZSgpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXREb2N0eXBlVmFsdWVzKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCQotCQlpbnQgbXlWZXJzaW9uID0gSjJFRV8xXzRfSUQ7Ci0JCWlmIChzeXN0ZW1JZCA9PSBudWxsKSB7Ci0JCQlteVZlcnNpb24gPSBwcmltR2V0VmVyc2lvbklEKCk7Ci0JCQlzZXRNb2R1bGVWZXJzaW9uSUQobXlWZXJzaW9uKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQotfQotCi1wcml2YXRlIGludCBwcmltR2V0VmVyc2lvbklEKCkgewotCUlGaWxlIGFmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSh0aGlzKTsKLQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG51bGw7Ci0JaWYgKGFmaWxlICE9IG51bGwgJiYgYWZpbGUuZXhpc3RzKCkpIHsKLQkJdHJ5IHsKLQkJCWluID0gYWZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoaW4pOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JcmV0dXJuIHF1aWNrUGVlay5nZXRWZXJzaW9uKCk7Ci0JfQotCXJldHVybiBnZXRNb2R1bGVWZXJzaW9uSUQoKTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ1NDlhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWNrbm93bGVkZ2VNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRGVzdGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk1ldGhvZENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmV0dXJuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWwuQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5BZGFwdGVyRmFjdG9yeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotCi0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEVqYkZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYkZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCUVqYkZhY3RvcnkgdGhlRWpiRmFjdG9yeSA9IChFamJGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJlamIueG1pIik7IAotCQkJaWYgKHRoZUVqYkZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVFamJGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVqYkZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBDTVBfQURBUFRFUl9GQUNUT1JJRVMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCXByaXZhdGUgc3RhdGljIExpc3QgQ01QX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBFSkJfUkVMQVRJT05fQURBUFRFUl9GQUNUT1JJRVMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCXByaXZhdGUgc3RhdGljIExpc3QgRUpCX1JFTEFUSU9OX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBSRUxBVElPTlNISVBTX0FEQVBURVJfRkFDVE9SSUVTID0gbmV3IEFycmF5TGlzdCgxKTsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IFJFTEFUSU9OU0hJUFNfQURBUFRFUl9GQUNUT1JZX0RFU0NSSVBUT1JTID0gbmV3IEFycmF5TGlzdCgxKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNTV9WRVJTSU9OID0gIjEuMSI7ICAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIGNyZWF0ZWRBZGFwdGVyRmFjdG9yaWVzID0gZmFsc2U7Ci0KLQlwdWJsaWMgRWpiRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7IAotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWTogcmV0dXJuIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTjogcmV0dXJuIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SOiByZXR1cm4gY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OOiByZXR1cm4gY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OOiByZXR1cm4gY3JlYXRlU2Vzc2lvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWTogcmV0dXJuIGNyZWF0ZUVudGl0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9NRVRIT0RfQ0FURUdPUlk6IHJldHVybiBjcmVhdGVFSkJNZXRob2RDYXRlZ29yeSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVI6IHJldHVybiBjcmVhdGVFSkJKYXIoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVDogcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFOiByZXR1cm4gY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQUzogcmV0dXJuIGNyZWF0ZVJlbGF0aW9uc2hpcHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWTogcmV0dXJuIGNyZWF0ZVF1ZXJ5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OOiByZXR1cm4gY3JlYXRlRUpCUmVsYXRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEU6IHJldHVybiBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0U6IHJldHVybiBjcmVhdGVSb2xlU291cmNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEOiByZXR1cm4gY3JlYXRlQ01SRmllbGQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTjogcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEcml2ZW4oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTjogcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVDogcmV0dXJuIGNyZWF0ZUV4Y2x1ZGVMaXN0KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EOiByZXR1cm4gY3JlYXRlUXVlcnlNZXRob2QoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWTogcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHOiByZXR1cm4gY3JlYXRlQWN0aXZhdGlvbkNvbmZpZygpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVTZXNzaW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX0tJTkQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNLTk9XTEVER0VfTU9ERToKLQkJCQlyZXR1cm4gY3JlYXRlQWNrbm93bGVkZ2VNb2RlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFlfS0lORDoKLQkJCQlyZXR1cm4gY3JlYXRlU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRVRVUk5fVFlQRV9NQVBQSU5HOgotCQkJCXJldHVybiBjcmVhdGVSZXR1cm5UeXBlTWFwcGluZ0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkRFU1RJTkFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc3RpbmF0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1VTFRJUExJQ0lUWV9LSU5EOgotCQkJCXJldHVybiBjcmVhdGVNdWx0aXBsaWNpdHlLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLlRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRTZXNzaW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfS0lORDoKLQkJCQlyZXR1cm4gY29udmVydE1ldGhvZEVsZW1lbnRLaW5kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ0tOT1dMRURHRV9NT0RFOgotCQkJCXJldHVybiBjb252ZXJ0QWNrbm93bGVkZ2VNb2RlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TVUJTQ1JJUFRJT05fRFVSQUJJTElUWV9LSU5EOgotCQkJCXJldHVybiBjb252ZXJ0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFVFVSTl9UWVBFX01BUFBJTkc6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSZXR1cm5UeXBlTWFwcGluZ1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuREVTVElOQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydERlc3RpbmF0aW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTVVMVElQTElDSVRZX0tJTkQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNdWx0aXBsaWNpdHlLaW5kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotcHVibGljIE1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudChTdHJpbmcgYVNpZ25hdHVyZSkgewotCU1ldGhvZEVsZW1lbnQgbWUgPSBjcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JbWUuaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoYVNpZ25hdHVyZSk7Ci0JcmV0dXJuIG1lOwotfQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIE1ldGhvZEVsZW1lbnQgZnJvbSBhIGphdmEgbWV0aG9kLiAgIERlZmF1bHRzIHRoZSB0eXBlIHRvICJVbnNwZWNpZmllZCIuCi0gKi8KLXB1YmxpYyBNZXRob2RFbGVtZW50IGNyZWF0ZU1ldGhvZEVsZW1lbnRGcm9tKAotCU1ldGhvZCBtZXRob2QpIHsKLQotCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZU1ldGhvZEVsZW1lbnQoKTsKLQllbGVtZW50LnNldE5hbWUobWV0aG9kLmdldE5hbWUoKSk7Ci0JZWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotCi0JSmF2YVBhcmFtZXRlcltdIHBhcmFtcyA9IAotCQltZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JaWYgKHBhcmFtcy5sZW5ndGggPT0gMCkKLQkJZWxlbWVudC5hcHBseVplcm9QYXJhbXMoKTsKLQllbHNlIHsgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlKYXZhSGVscGVycyBoZWxwZXIgPSAoSmF2YUhlbHBlcnMpIHBhcmFtc1tpXS5nZXRFVHlwZSgpOwotCQkJZWxlbWVudC5hZGRNZXRob2RQYXJhbXMoaGVscGVyLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVsZW1lbnQ7Ci19IAotLyoqCi0gKiBIZWxwZXIgbWV0aG9kIHRvIHJlZmxlY3QgdGhlIG1ldGhvZCBhbmQgY3JlYXRlIGEgTWV0aG9kRWxlbWVudC4gIElmIHRoZSBwYXJhbWV0ZXIgaXMgbnVsbCwgY3JlYXRlcyBhbiBlbGVtZW50Ci0gKiB3aXRoIGEgbmFtZSBvZiAiKiIuICBEZWZhdWx0cyB0aGUgdHlwZSB0byAiVW5zcGVjaWZpZWQiLgotICovCi1wdWJsaWMgTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50RnJvbShqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kKSB7Ci0KLQlTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZCA9PSBudWxsID8gIioiIDogbWV0aG9kLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCU1ldGhvZEVsZW1lbnQgbWUgPSBjcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JbWUuc2V0TmFtZShtZXRob2ROYW1lKTsKLQltZS5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQlDbGFzc1tdIHR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCW1lLmFkZE1ldGhvZFBhcmFtcyhnZXRUeXBlTmFtZSh0eXBlc1tpXSkpOwotCQl9Ci0JfQotCXJldHVybiBtZTsKLX0KLXB1YmxpYyBzdGF0aWMgRWpiRmFjdG9yeSBnZXRBY3RpdmVGYWN0b3J5KCkgewotCXJldHVybiAoRWpiRmFjdG9yeSkgZ2V0UGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLX0KLS8qCi0gKiBVdGlsaXR5IHJvdXRpbmUgdG8gcGFwZXIgb3ZlciBhcnJheSB0eXBlIG5hbWVzCi0gKiBCb3Jyb3dlZCBmcm9tIGEgcGFja2FnZS12aXNpYmlsaXR5IGhlbHBlciBvbiBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZAotICovCi1zdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKENsYXNzIHR5cGUpIHsKLQlpZiAodHlwZS5pc0FycmF5KCkpIHsKLQkJdHJ5IHsKLQkJCUNsYXNzIGNsID0gdHlwZTsKLQkJCWludCBkaW1lbnNpb25zID0gMDsKLQkJCXdoaWxlIChjbC5pc0FycmF5KCkpIHsKLQkJCQlkaW1lbnNpb25zKys7Ci0JCQkJY2wgPSBjbC5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQl9Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoY2wuZ2V0TmFtZSgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uczsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKCJbXSIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeyAvKkZBTExUSFJVKi8KLQkJfQotCX0KLQlyZXR1cm4gdHlwZS5nZXROYW1lKCk7Ci19Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBNZXRob2RQZXJtaXNzaW9uIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKSB7Ci0JCU1ldGhvZFBlcm1pc3Npb25JbXBsIG1ldGhvZFBlcm1pc3Npb24gPSBuZXcgTWV0aG9kUGVybWlzc2lvbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBlcm1pc3Npb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFzc2VtYmx5RGVzY3JpcHRvciBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvckltcGwgYXNzZW1ibHlEZXNjcmlwdG9yID0gbmV3IEFzc2VtYmx5RGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIGFzc2VtYmx5RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kVHJhbnNhY3Rpb24gY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKSB7Ci0JCU1ldGhvZFRyYW5zYWN0aW9uSW1wbCBtZXRob2RUcmFuc2FjdGlvbiA9IG5ldyBNZXRob2RUcmFuc2FjdGlvbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFRyYW5zYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFbnRpdHkgY3JlYXRlRW50aXR5KCkgewotCQlFbnRpdHlJbXBsIGVudGl0eSA9IG5ldyBFbnRpdHlJbXBsKCk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUdlbigpIHsKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGwgY29udGFpbmVyTWFuYWdlZEVudGl0eSA9IG5ldyBDb250YWluZXJNYW5hZ2VkRW50aXR5SW1wbCgpOwotCQlyZXR1cm4gY29udGFpbmVyTWFuYWdlZEVudGl0eTsKLQl9Ci0KLSAgCXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSB7Ci0gIAkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5R2VuKCk7Ci0gIAkJYWRhcHROZXcoY21wLCBDTVBfQURBUFRFUl9GQUNUT1JJRVMpOwotICAJCWFkZEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIoY21wKTsKLSAgCQlyZXR1cm4gY21wOwotICAJfQotICAJCi0JLyoqCi0JICogQHBhcmFtIGNtcAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCUNNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIgY21wQWRhcHRlciA9IG5ldyBDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyKGNtcCk7Ci0JCUFkYXB0ZXIgbG9hZGluZ0FkYXB0ZXIgPSBFeHRlbmRlZEVjb3JlVXRpbC5jcmVhdGVBZGFwdGVyRm9yTG9hZGluZyhjbXBBZGFwdGVyLGNtcCk7Ci0JCWNtcC5lQWRhcHRlcnMoKS5hZGQobG9hZGluZ0FkYXB0ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ01QQXR0cmlidXRlIGNyZWF0ZUNNUEF0dHJpYnV0ZSgpIHsKLQkJQ01QQXR0cmlidXRlSW1wbCBjbXBBdHRyaWJ1dGUgPSBuZXcgQ01QQXR0cmlidXRlSW1wbCgpOwotCQlyZXR1cm4gY21wQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDTVJGaWVsZCBjcmVhdGVDTVJGaWVsZCgpIHsKLQkJQ01SRmllbGRJbXBsIGNtckZpZWxkID0gbmV3IENNUkZpZWxkSW1wbCgpOwotCQlyZXR1cm4gY21yRmllbGQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpIHsKLQkJRUpCUmVsYXRpb25zaGlwUm9sZUltcGwgZWpiUmVsYXRpb25zaGlwUm9sZSA9IG5ldyBFSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCgpOwotCQlyZXR1cm4gZWpiUmVsYXRpb25zaGlwUm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUpCUmVsYXRpb24gY3JlYXRlRUpCUmVsYXRpb25HZW4oKSB7Ci0JCUVKQlJlbGF0aW9uSW1wbCBlamJSZWxhdGlvbiA9IG5ldyBFSkJSZWxhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGVqYlJlbGF0aW9uOwotCX0KLQotICAJcHVibGljIEVKQlJlbGF0aW9uIGNyZWF0ZUVKQlJlbGF0aW9uKCkgewotICAJCUVKQlJlbGF0aW9uIHJlbCA9IGNyZWF0ZUVKQlJlbGF0aW9uR2VuKCk7Ci0gIAkJYWRhcHROZXcocmVsLCBFSkJfUkVMQVRJT05fQURBUFRFUl9GQUNUT1JJRVMpOwotICAJCXJldHVybiByZWw7Ci0gIAl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUmVsYXRpb25zaGlwcyBjcmVhdGVSZWxhdGlvbnNoaXBzR2VuKCkgewotCQlSZWxhdGlvbnNoaXBzSW1wbCByZWxhdGlvbnNoaXBzID0gbmV3IFJlbGF0aW9uc2hpcHNJbXBsKCk7Ci0JCXJldHVybiByZWxhdGlvbnNoaXBzOwotCX0KLQotCXB1YmxpYyBSZWxhdGlvbnNoaXBzIGNyZWF0ZVJlbGF0aW9uc2hpcHMoKSB7Ci0JCVJlbGF0aW9uc2hpcHMgcmVsID0gY3JlYXRlUmVsYXRpb25zaGlwc0dlbigpOwotCQlhZGFwdE5ldyhyZWwsIFJFTEFUSU9OU0hJUFNfQURBUFRFUl9GQUNUT1JJRVMpOwotCQlyZXR1cm4gcmVsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyIGNyZWF0ZUVKQkphcigpIHsKLQkJRUpCSmFySW1wbCBlamJKYXIgPSBuZXcgRUpCSmFySW1wbCgpOwotCQlyZXR1cm4gZWpiSmFyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBSb2xlU291cmNlIGNyZWF0ZVJvbGVTb3VyY2UoKSB7Ci0JCVJvbGVTb3VyY2VJbXBsIHJvbGVTb3VyY2UgPSBuZXcgUm9sZVNvdXJjZUltcGwoKTsKLQkJcmV0dXJuIHJvbGVTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFF1ZXJ5IGNyZWF0ZVF1ZXJ5KCkgewotCQlRdWVyeUltcGwgcXVlcnkgPSBuZXcgUXVlcnlJbXBsKCk7Ci0JCXJldHVybiBxdWVyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUXVlcnlNZXRob2QgY3JlYXRlUXVlcnlNZXRob2QoKSB7Ci0JCVF1ZXJ5TWV0aG9kSW1wbCBxdWVyeU1ldGhvZCA9IG5ldyBRdWVyeU1ldGhvZEltcGwoKTsKLQkJcmV0dXJuIHF1ZXJ5TWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkgewotCQlBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsIGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSA9IG5ldyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2YXRpb25Db25maWcgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZygpIHsKLQkJQWN0aXZhdGlvbkNvbmZpZ0ltcGwgYWN0aXZhdGlvbkNvbmZpZyA9IG5ldyBBY3RpdmF0aW9uQ29uZmlnSW1wbCgpOwotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGNyZWF0ZVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgcmVzdWx0ID0gVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlIGNyZWF0ZVRyYW5zYWN0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlUcmFuc2FjdGlvblR5cGUgcmVzdWx0ID0gVHJhbnNhY3Rpb25UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFuc2FjdGlvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvblR5cGUgY3JlYXRlU2Vzc2lvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJU2Vzc2lvblR5cGUgcmVzdWx0ID0gU2Vzc2lvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlc3Npb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRLaW5kIGNyZWF0ZU1ldGhvZEVsZW1lbnRLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCU1ldGhvZEVsZW1lbnRLaW5kIHJlc3VsdCA9IE1ldGhvZEVsZW1lbnRLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNZXRob2RFbGVtZW50S2luZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY2tub3dsZWRnZU1vZGUgY3JlYXRlQWNrbm93bGVkZ2VNb2RlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUFja25vd2xlZGdlTW9kZSByZXN1bHQgPSBBY2tub3dsZWRnZU1vZGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEFja25vd2xlZGdlTW9kZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBjcmVhdGVTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCByZXN1bHQgPSBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmV0dXJuVHlwZU1hcHBpbmcgY3JlYXRlUmV0dXJuVHlwZU1hcHBpbmdGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJUmV0dXJuVHlwZU1hcHBpbmcgcmVzdWx0ID0gUmV0dXJuVHlwZU1hcHBpbmcuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJldHVyblR5cGVNYXBwaW5nVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc3RpbmF0aW9uVHlwZSBjcmVhdGVEZXN0aW5hdGlvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJRGVzdGluYXRpb25UeXBlIHJlc3VsdCA9IERlc3RpbmF0aW9uVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RGVzdGluYXRpb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE11bHRpcGxpY2l0eUtpbmQgY3JlYXRlTXVsdGlwbGljaXR5S2luZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlNdWx0aXBsaWNpdHlLaW5kIHJlc3VsdCA9IE11bHRpcGxpY2l0eUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE11bHRpcGxpY2l0eUtpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50KCkgewotCQlNZXRob2RFbGVtZW50SW1wbCBtZXRob2RFbGVtZW50ID0gbmV3IE1ldGhvZEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFeGNsdWRlTGlzdCBjcmVhdGVFeGNsdWRlTGlzdCgpIHsKLQkJRXhjbHVkZUxpc3RJbXBsIGV4Y2x1ZGVMaXN0ID0gbmV3IEV4Y2x1ZGVMaXN0SW1wbCgpOwotCQlyZXR1cm4gZXhjbHVkZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFNlc3Npb24gY3JlYXRlU2Vzc2lvbigpIHsKLQkJU2Vzc2lvbkltcGwgc2Vzc2lvbiA9IG5ldyBTZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gc2Vzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURyaXZlbiBjcmVhdGVNZXNzYWdlRHJpdmVuKCkgewotCQlNZXNzYWdlRHJpdmVuSW1wbCBtZXNzYWdlRHJpdmVuID0gbmV3IE1lc3NhZ2VEcml2ZW5JbXBsKCk7Ci0JCXJldHVybiBtZXNzYWdlRHJpdmVuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKCkgewotCQlNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsIG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiA9IG5ldyBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsKCk7Ci0JCXJldHVybiBtZXNzYWdlRHJpdmVuRGVzdGluYXRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVKQk1ldGhvZENhdGVnb3J5IGNyZWF0ZUVKQk1ldGhvZENhdGVnb3J5KCkgewotCQlFSkJNZXRob2RDYXRlZ29yeUltcGwgZWpiTWV0aG9kQ2F0ZWdvcnkgPSBuZXcgRUpCTWV0aG9kQ2F0ZWdvcnlJbXBsKCk7Ci0JCXJldHVybiBlamJNZXRob2RDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRWpiUGFja2FnZSBnZXRFamJQYWNrYWdlKCkgewotCQlyZXR1cm4gKEVqYlBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYlBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnRlcm5hbFJlZ2lzdGVyQ01QQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGNvbmZpZykgewotCQlDTVBfQURBUFRFUl9GQUNUT1JZX0RFU0NSSVBUT1JTLmFkZChjb25maWcpOwotCQkKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIGludGVybmFsUmVnaXN0ZXJFSkJSZWxhdGlvbkFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBjb25maWcpIHsKLQkJRUpCX1JFTEFUSU9OX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUy5hZGQoY29uZmlnKTsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIGludGVybmFsUmVnaXN0ZXJSZWxhdGlvbnNoaXBzQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGNvbmZpZykgewotCQlSRUxBVElPTlNISVBTX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUy5hZGQoY29uZmlnKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCWNyZWF0ZWRBZGFwdGVyRmFjdG9yaWVzID0gdHJ1ZTsKLQkJQWRhcHRlckZhY3RvcnlVdGlsLmNyZWF0ZUFkYXB0ZXJGYWN0b3JpZXMoQ01QX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUywgQ01QX0FEQVBURVJfRkFDVE9SSUVTKTsKLQkJQWRhcHRlckZhY3RvcnlVdGlsLmNyZWF0ZUFkYXB0ZXJGYWN0b3JpZXMoRUpCX1JFTEFUSU9OX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUywgRUpCX1JFTEFUSU9OX0FEQVBURVJfRkFDVE9SSUVTKTsKLQkJQWRhcHRlckZhY3RvcnlVdGlsLmNyZWF0ZUFkYXB0ZXJGYWN0b3JpZXMoUkVMQVRJT05TSElQU19BREFQVEVSX0ZBQ1RPUllfREVTQ1JJUFRPUlMsIFJFTEFUSU9OU0hJUFNfQURBUFRFUl9GQUNUT1JJRVMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRhcHROZXcoTm90aWZpZXIgbm90aWZpZXIsIExpc3QgZmFjdG9yaWVzKSB7Ci0JCWlmICghY3JlYXRlZEFkYXB0ZXJGYWN0b3JpZXMpCi0JCQljcmVhdGVBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5VXRpbC5hZGFwdE5ldyhub3RpZmllciwgZmFjdG9yaWVzKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDkyNGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYlBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFja25vd2xlZGdlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkRlc3RpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJNZXRob2RDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkV4Y2x1ZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTXVsdGlwbGljaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZXR1cm5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIEVqYlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRWpiUGFja2FnZSwgRVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGVybWlzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kVHJhbnNhY3Rpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2Vzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZW50ZXJwcmlzZUJlYW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiTWV0aG9kQ2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiSmFyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY21wQXR0cmlidXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlbGF0aW9uc2hpcHNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcXVlcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiUmVsYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlU291cmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNtckZpZWxkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1lc3NhZ2VEcml2ZW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4Y2x1ZGVMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHF1ZXJ5TWV0aG9kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3RpdmF0aW9uQ29uZmlnRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB0cmFuc2FjdGlvblR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHNlc3Npb25UeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBtZXRob2RFbGVtZW50S2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gYWNrbm93bGVkZ2VNb2RlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcmV0dXJuVHlwZU1hcHBpbmdFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGRlc3RpbmF0aW9uVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gbXVsdGlwbGljaXR5S2luZEVFbnVtID0gbnVsbDsKLQotCQkgICAvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByaXZhdGUgRWpiUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIEVqYkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYlBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEVqYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBFamJQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlRWpiUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlRWpiUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBlcm1pc3Npb24oKSB7Ci0JCXJldHVybiBtZXRob2RQZXJtaXNzaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFBlcm1pc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kUGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kUGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RUcmFuc2FjdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfRWpiSmFyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfRXhjbHVkZUxpc3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kVHJhbnNhY3Rpb24oKSB7Ci0JCXJldHVybiBtZXRob2RUcmFuc2FjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RUcmFuc2FjdGlvbl9UcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RUcmFuc2FjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFRyYW5zYWN0aW9uX0Fzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RUcmFuc2FjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbnRlcnByaXNlQmVhbigpIHsKLQkJcmV0dXJuIGVudGVycHJpc2VCZWFuRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGVycHJpc2VCZWFuX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRlcnByaXNlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRlcnByaXNlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50ZXJwcmlzZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9Ib21lSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50ZXJwcmlzZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRlcnByaXNlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX0VqYkphcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGVycHJpc2VCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fU2VjdXJpdHlJZGVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGVycHJpc2VCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50ZXJwcmlzZUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGVycHJpc2VCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiBlbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW50aXR5X1JlZW50cmFudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eV9QcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCQlyZXR1cm4gY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9BYnN0cmFjdFNjaGVtYU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QZXJzaXN0ZW50QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0tleUF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9RdWVyaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQ01QQXR0cmlidXRlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUHJpbUtleUZpZWxkKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q01QQXR0cmlidXRlKCkgewotCQlyZXR1cm4gY21wQXR0cmlidXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNtcEF0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljbXBBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENNUkZpZWxkKCkgewotCQlyZXR1cm4gY21yRmllbGRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q01SRmllbGRfUm9sZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNtckZpZWxkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljbXJGaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpIHsKLQkJcmV0dXJuIGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JvbGVOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfTXVsdGlwbGljaXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1NvdXJjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0NtckZpZWxkKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCUmVsYXRpb24oKSB7Ci0JCXJldHVybiBlamJSZWxhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25fTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwTGlzdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJSZWxhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZWxhdGlvbnNoaXBzKCkgewotCQlyZXR1cm4gcmVsYXRpb25zaGlwc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVsYXRpb25zaGlwc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcHNfRWpiSmFyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVsYXRpb25zaGlwc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVsYXRpb25zaGlwc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVsYXRpb25zaGlwc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCSmFyKCkgewotCQlyZXR1cm4gZWpiSmFyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkphcl9FamJDbGllbnRKYXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJKYXJfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkphckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcExpc3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVTb3VyY2UoKSB7Ci0JCXJldHVybiByb2xlU291cmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVTb3VyY2VfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlU291cmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZVNvdXJjZV9Sb2xlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upcm9sZVNvdXJjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJvbGVTb3VyY2VfRW50aXR5QmVhbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVTb3VyY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVTb3VyY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFF1ZXJ5KCkgewotCQlyZXR1cm4gcXVlcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UXVlcnlfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlxdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFF1ZXJ5X0VqYlFMKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRRdWVyeV9SZXR1cm5UeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UXVlcnlfUXVlcnlNZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlxdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFF1ZXJ5X0VudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UXVlcnlfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFF1ZXJ5TWV0aG9kKCkgewotCQlyZXR1cm4gcXVlcnlNZXRob2RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UXVlcnlNZXRob2RfUXVlcnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlxdWVyeU1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkgewotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3RpdmF0aW9uQ29uZmlnKCkgewotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3RpdmF0aW9uQ29uZmlnX0NvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9QYXJtcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X0VudGVycHJpc2VCZWFuKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXhjbHVkZUxpc3QoKSB7Ci0JCXJldHVybiBleGNsdWRlTGlzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWV4Y2x1ZGVMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXhjbHVkZUxpc3RfTWV0aG9kRWxlbWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlleGNsdWRlTGlzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV4Y2x1ZGVMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXNzaW9uKCkgewotCQlyZXR1cm4gc2Vzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uX1RyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uX1Nlc3Npb25UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25fU2VydmljZUVuZHBvaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZURyaXZlbigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEcml2ZW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9UcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlU2VsZWN0b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9BY2tub3dsZWRnZU1vZGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbl9EZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuX0FjdGl2YXRpb25Db25maWcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlRGVzdGluYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbl9MaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnaW5nVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbl9TdWJzY3JpcHRpb25EdXJhYmlsaXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX0JlYW4oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVKQk1ldGhvZENhdGVnb3J5KCkgewotCQlyZXR1cm4gZWpiTWV0aG9kQ2F0ZWdvcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRNdWx0aXBsaWNpdHlLaW5kKCkgewotCQlyZXR1cm4gbXVsdGlwbGljaXR5S2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRSZXR1cm5UeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHJldHVyblR5cGVNYXBwaW5nRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldE1ldGhvZEVsZW1lbnRLaW5kKCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudEtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25UeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldEFja25vd2xlZGdlTW9kZSgpIHsKLQkJcmV0dXJuIGFja25vd2xlZGdlTW9kZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREZXN0aW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiBkZXN0aW5hdGlvblR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoKSB7Ci0JCXJldHVybiBzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRTZXNzaW9uVHlwZSgpIHsKLQkJcmV0dXJuIHNlc3Npb25UeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChFamJGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEFJTkVSX01BTkFHRURfRU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1ZFUlNJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MsIENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQUJTVFJBQ1RfU0NIRU1BX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MsIENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0tFWV9BVFRSSUJVVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MsIENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQ01QX0FUVFJJQlVURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzcywgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNX0tFWV9GSUVMRCk7Ci0KLQkJbWV0aG9kUGVybWlzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUEVSTUlTU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGVybWlzc2lvbkVDbGFzcywgTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGVybWlzc2lvbkVDbGFzcywgTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TKTsKLQotCQlhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVNTRU1CTFlfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIEFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIEFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0KLQkJbWV0aG9kVHJhbnNhY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1RSQU5TQUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RUcmFuc2FjdGlvbkVDbGFzcywgTUVUSE9EX1RSQU5TQUNUSU9OX19UUkFOU0FDVElPTl9BVFRSSUJVVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzLCBNRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RUcmFuc2FjdGlvbkVDbGFzcywgTUVUSE9EX1RSQU5TQUNUSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RUcmFuc2FjdGlvbkVDbGFzcywgTUVUSE9EX1RSQU5TQUNUSU9OX19NRVRIT0RfRUxFTUVOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzLCBNRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OUyk7Ci0KLQkJc2Vzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVNTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uRUNsYXNzLCBTRVNTSU9OX19UUkFOU0FDVElPTl9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uRUNsYXNzLCBTRVNTSU9OX19TRVNTSU9OX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25FQ2xhc3MsIFNFU1NJT05fX1NFUlZJQ0VfRU5EUE9JTlQpOwotCi0JCWVudGl0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eUVDbGFzcywgRU5USVRZX19SRUVOVFJBTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUVDbGFzcywgRU5USVRZX19QUklNQVJZX0tFWSk7Ci0KLQkJZW50ZXJwcmlzZUJlYW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRU5URVJQUklTRV9CRUFOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRlcnByaXNlQmVhbkVDbGFzcywgRU5URVJQUklTRV9CRUFOX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRlcnByaXNlQmVhbkVDbGFzcywgRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGVycHJpc2VCZWFuRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50ZXJwcmlzZUJlYW5FQ2xhc3MsIEVOVEVSUFJJU0VfQkVBTl9fSE9NRV9JTlRFUkZBQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGVycHJpc2VCZWFuRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGVycHJpc2VCZWFuRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGVycHJpc2VCZWFuRUNsYXNzLCBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRlcnByaXNlQmVhbkVDbGFzcywgRU5URVJQUklTRV9CRUFOX19MT0NBTF9IT01FX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50ZXJwcmlzZUJlYW5FQ2xhc3MsIEVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFKTsKLQotCQllamJNZXRob2RDYXRlZ29yeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfTUVUSE9EX0NBVEVHT1JZKTsKLQotCQllamJKYXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX0pBUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19FSkJfQ0xJRU5UX0pBUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19WRVJTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJFQ2xhc3MsIEVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiSmFyRUNsYXNzLCBFSkJfSkFSX19SRUxBVElPTlNISVBfTElTVCk7Ci0KLQkJbWV0aG9kRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19QQVJNUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0VOVEVSUFJJU0VfQkVBTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJY21wQXR0cmlidXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENNUF9BVFRSSUJVVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNtcEF0dHJpYnV0ZUVDbGFzcywgQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGNtcEF0dHJpYnV0ZUVDbGFzcywgQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TKTsKLQotCQlyZWxhdGlvbnNoaXBzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFTEFUSU9OU0hJUFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlbGF0aW9uc2hpcHNFQ2xhc3MsIFJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWxhdGlvbnNoaXBzRUNsYXNzLCBSRUxBVElPTlNISVBTX19FSkJfSkFSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWxhdGlvbnNoaXBzRUNsYXNzLCBSRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWxhdGlvbnNoaXBzRUNsYXNzLCBSRUxBVElPTlNISVBTX19ERVNDUklQVElPTlMpOwotCi0JCXF1ZXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFFVRVJZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxdWVyeUVDbGFzcywgUVVFUllfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxdWVyeUVDbGFzcywgUVVFUllfX0VKQl9RTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocXVlcnlFQ2xhc3MsIFFVRVJZX19SRVRVUk5fVFlQRV9NQVBQSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShxdWVyeUVDbGFzcywgUVVFUllfX1FVRVJZX01FVEhPRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocXVlcnlFQ2xhc3MsIFFVRVJZX19FTlRJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHF1ZXJ5RUNsYXNzLCBRVUVSWV9fREVTQ1JJUFRJT05TKTsKLQotCQllamJSZWxhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfUkVMQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlbGF0aW9uRUNsYXNzLCBFSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWxhdGlvbkVDbGFzcywgRUpCX1JFTEFUSU9OX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWxhdGlvbkVDbGFzcywgRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVsYXRpb25FQ2xhc3MsIEVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWxhdGlvbkVDbGFzcywgRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlMpOwotCi0JCWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX1JFTEFUSU9OU0hJUF9ST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX1JPTEVfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TKTsKLQotCQlyb2xlU291cmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfU09VUkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlU291cmNlRUNsYXNzLCBST0xFX1NPVVJDRV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVTb3VyY2VFQ2xhc3MsIFJPTEVfU09VUkNFX19ST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlU291cmNlRUNsYXNzLCBST0xFX1NPVVJDRV9fRU5USVRZX0JFQU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVTb3VyY2VFQ2xhc3MsIFJPTEVfU09VUkNFX19ERVNDUklQVElPTlMpOwotCi0JCWNtckZpZWxkRUNsYXNzID0gY3JlYXRlRUNsYXNzKENNUl9GSUVMRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY21yRmllbGRFQ2xhc3MsIENNUl9GSUVMRF9fUk9MRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY21yRmllbGRFQ2xhc3MsIENNUl9GSUVMRF9fQ09MTEVDVElPTl9UWVBFKTsKLQotCQltZXNzYWdlRHJpdmVuRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FU1NBR0VfRFJJVkVOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9fVFJBTlNBQ1RJT05fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfU0VMRUNUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEcml2ZW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX19BQ0tOT1dMRURHRV9NT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9fTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUcpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX0RFU1RJTkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9fTUVTU0FHSU5HX1RZUEUpOwotCi0JCW1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4pOwotCi0JCWV4Y2x1ZGVMaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYQ0xVREVfTElTVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXhjbHVkZUxpc3RFQ2xhc3MsIEVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGV4Y2x1ZGVMaXN0RUNsYXNzLCBFWENMVURFX0xJU1RfX01FVEhPRF9FTEVNRU5UUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXhjbHVkZUxpc3RFQ2xhc3MsIEVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TKTsKLQotCQlxdWVyeU1ldGhvZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhRVUVSWV9NRVRIT0QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHF1ZXJ5TWV0aG9kRUNsYXNzLCBRVUVSWV9NRVRIT0RfX1FVRVJZKTsKLQotCQlhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcywgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MsIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19OQU1FKTsKLQotCQlhY3RpdmF0aW9uQ29uZmlnRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWQVRJT05fQ09ORklHKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLCBBQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIEFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlMpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFKTsKLQkJdHJhbnNhY3Rpb25UeXBlRUVudW0gPSBjcmVhdGVFRW51bShUUkFOU0FDVElPTl9UWVBFKTsKLQkJc2Vzc2lvblR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFNFU1NJT05fVFlQRSk7Ci0JCW1ldGhvZEVsZW1lbnRLaW5kRUVudW0gPSBjcmVhdGVFRW51bShNRVRIT0RfRUxFTUVOVF9LSU5EKTsKLQkJYWNrbm93bGVkZ2VNb2RlRUVudW0gPSBjcmVhdGVFRW51bShBQ0tOT1dMRURHRV9NT0RFKTsKLQkJc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKFNVQlNDUklQVElPTl9EVVJBQklMSVRZX0tJTkQpOwotCQlyZXR1cm5UeXBlTWFwcGluZ0VFbnVtID0gY3JlYXRlRUVudW0oUkVUVVJOX1RZUEVfTUFQUElORyk7Ci0JCWRlc3RpbmF0aW9uVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oREVTVElOQVRJT05fVFlQRSk7Ci0JCW11bHRpcGxpY2l0eUtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKE1VTFRJUExJQ0lUWV9LSU5EKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJSmF2YVJlZlBhY2thZ2UgdGhlSmF2YVJlZlBhY2thZ2UgPSAoSmF2YVJlZlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQljb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RW50aXR5KCkpOwotCQltZXRob2RQZXJtaXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQltZXRob2RUcmFuc2FjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlzZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW4oKSk7Ci0JCWVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVudGVycHJpc2VCZWFuKCkpOwotCQllbnRlcnByaXNlQmVhbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEpORElFbnZSZWZzR3JvdXAoKSk7Ci0JCWVqYk1ldGhvZENhdGVnb3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWVqYkphckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWNtcEF0dHJpYnV0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFQXR0cmlidXRlKCkpOwotCQlyZWxhdGlvbnNoaXBzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXF1ZXJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWVqYlJlbGF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcm9sZVNvdXJjZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQljbXJGaWVsZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENNUEF0dHJpYnV0ZSgpKTsKLQkJbWVzc2FnZURyaXZlbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVudGVycHJpc2VCZWFuKCkpOwotCQltZXNzYWdlRHJpdmVuRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZXhjbHVkZUxpc3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcXVlcnlNZXRob2RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzcywgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsICIyLngiLCAwLCAxLCBDb250YWluZXJNYW5hZ2VkRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0Fic3RyYWN0U2NoZW1hTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWJzdHJhY3RTY2hlbWFOYW1lIiwgbnVsbCwgMCwgMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QZXJzaXN0ZW50QXR0cmlidXRlcygpLCB0aGlzLmdldENNUEF0dHJpYnV0ZSgpLCBudWxsLCAicGVyc2lzdGVudEF0dHJpYnV0ZXMiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9LZXlBdHRyaWJ1dGVzKCksIHRoaXMuZ2V0Q01QQXR0cmlidXRlKCksIG51bGwsICJrZXlBdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUXVlcmllcygpLCB0aGlzLmdldFF1ZXJ5KCksIHRoaXMuZ2V0UXVlcnlfRW50aXR5KCksICJxdWVyaWVzIiwgbnVsbCwgMCwgLTEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQ01QQXR0cmlidXRlKCksIHRoaXMuZ2V0Q01QQXR0cmlidXRlKCksIG51bGwsICJDTVBBdHRyaWJ1dGUiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QcmltS2V5RmllbGQoKSwgdGhpcy5nZXRDTVBBdHRyaWJ1dGUoKSwgbnVsbCwgInByaW1LZXlGaWVsZCIsIG51bGwsIDAsIDEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAiTWV0aG9kUGVybWlzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQZXJtaXNzaW9uX1VuY2hlY2tlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuY2hlY2tlZCIsIG51bGwsIDAsIDEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGVybWlzc2lvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKSwgImFzc2VtYmx5RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBlcm1pc3Npb25fUm9sZXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRTZWN1cml0eVJvbGUoKSwgbnVsbCwgInJvbGVzIiwgbnVsbCwgMSwgLTEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kRWxlbWVudHMoKSwgdGhpcy5nZXRNZXRob2RFbGVtZW50KCksIG51bGwsICJtZXRob2RFbGVtZW50cyIsIG51bGwsIDEsIC0xLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAiQXNzZW1ibHlEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKSwgdGhpcy5nZXRNZXRob2RQZXJtaXNzaW9uKCksIHRoaXMuZ2V0TWV0aG9kUGVybWlzc2lvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgIm1ldGhvZFBlcm1pc3Npb25zIiwgbnVsbCwgMCwgLTEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFRyYW5zYWN0aW9ucygpLCB0aGlzLmdldE1ldGhvZFRyYW5zYWN0aW9uKCksIHRoaXMuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fQXNzZW1ibHlEZXNjcmlwdG9yKCksICJtZXRob2RUcmFuc2FjdGlvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfRWpiSmFyKCksIHRoaXMuZ2V0RUpCSmFyKCksIHRoaXMuZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCAiZWpiSmFyIiwgbnVsbCwgMCwgMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpLCB0aGlzLmdldEV4Y2x1ZGVMaXN0KCksIG51bGwsICJleGNsdWRlTGlzdCIsIG51bGwsIDAsIDEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kVHJhbnNhY3Rpb25FQ2xhc3MsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAiTWV0aG9kVHJhbnNhY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFRyYW5zYWN0aW9uX1RyYW5zYWN0aW9uQXR0cmlidXRlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCksICJ0cmFuc2FjdGlvbkF0dHJpYnV0ZSIsIG51bGwsIDAsIDEsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RUcmFuc2FjdGlvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kVHJhbnNhY3Rpb25zKCksICJhc3NlbWJseURlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKSwgdGhpcy5nZXRNZXRob2RFbGVtZW50KCksIG51bGwsICJtZXRob2RFbGVtZW50cyIsIG51bGwsIDEsIC0xLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlc3Npb25FQ2xhc3MsIFNlc3Npb24uY2xhc3MsICJTZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uX1RyYW5zYWN0aW9uVHlwZSgpLCB0aGlzLmdldFRyYW5zYWN0aW9uVHlwZSgpLCAidHJhbnNhY3Rpb25UeXBlIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uX1Nlc3Npb25UeXBlKCksIHRoaXMuZ2V0U2Vzc2lvblR5cGUoKSwgInNlc3Npb25UeXBlIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uX1NlcnZpY2VFbmRwb2ludCgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInNlcnZpY2VFbmRwb2ludCIsIG51bGwsIDAsIDEsIFNlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbnRpdHlFQ2xhc3MsIEVudGl0eS5jbGFzcywgIkVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5X1JlZW50cmFudCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlZW50cmFudCIsIG51bGwsIDAsIDEsIEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlfUHJpbWFyeUtleSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInByaW1hcnlLZXkiLCBudWxsLCAxLCAxLCBFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbnRlcnByaXNlQmVhbkVDbGFzcywgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICJFbnRlcnByaXNlQmVhbiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRlcnByaXNlQmVhbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRTZWN1cml0eVJvbGVSZWYoKSwgbnVsbCwgInNlY3VyaXR5Um9sZVJlZnMiLCBudWxsLCAwLCAtMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiZWpiQ2xhc3MiLCBudWxsLCAxLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImhvbWVJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAicmVtb3RlSW50ZXJmYWNlIiwgbnVsbCwgMSwgMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX0VqYkphcigpLCB0aGlzLmdldEVKQkphcigpLCB0aGlzLmdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKSwgImVqYkphciIsIG51bGwsIDEsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbl9TZWN1cml0eUlkZW50aXR5KCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlJZGVudGl0eSgpLCBudWxsLCAic2VjdXJpdHlJZGVudGl0eSIsIG51bGwsIDAsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEhvbWVJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJsb2NhbEhvbWVJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJsb2NhbEludGVyZmFjZSIsIG51bGwsIDAsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWpiTWV0aG9kQ2F0ZWdvcnlFQ2xhc3MsIEVKQk1ldGhvZENhdGVnb3J5LmNsYXNzLCAiRUpCTWV0aG9kQ2F0ZWdvcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhlamJKYXJFQ2xhc3MsIEVKQkphci5jbGFzcywgIkVKQkphciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZWpiQ2xpZW50SmFyIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJKYXJfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCB0aGlzLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLCB0aGlzLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9FamJKYXIoKSwgImFzc2VtYmx5RGVzY3JpcHRvciIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpLCB0aGlzLmdldEVudGVycHJpc2VCZWFuKCksIHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW5fRWpiSmFyKCksICJlbnRlcnByaXNlQmVhbnMiLCBudWxsLCAxLCAtMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfUmVsYXRpb25zaGlwTGlzdCgpLCB0aGlzLmdldFJlbGF0aW9uc2hpcHMoKSwgdGhpcy5nZXRSZWxhdGlvbnNoaXBzX0VqYkphcigpLCAicmVsYXRpb25zaGlwTGlzdCIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICJNZXRob2RFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X1Bhcm1zKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJtcyIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfVHlwZSgpLCB0aGlzLmdldE1ldGhvZEVsZW1lbnRLaW5kKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZEVsZW1lbnRfRW50ZXJwcmlzZUJlYW4oKSwgdGhpcy5nZXRFbnRlcnByaXNlQmVhbigpLCBudWxsLCAiZW50ZXJwcmlzZUJlYW4iLCBudWxsLCAxLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNtcEF0dHJpYnV0ZUVDbGFzcywgQ01QQXR0cmlidXRlLmNsYXNzLCAiQ01QQXR0cmlidXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ01QQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBDTVBBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZWxhdGlvbnNoaXBzRUNsYXNzLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAiUmVsYXRpb25zaGlwcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZWxhdGlvbnNoaXBzX0VqYkphcigpLCB0aGlzLmdldEVKQkphcigpLCB0aGlzLmdldEVKQkphcl9SZWxhdGlvbnNoaXBMaXN0KCksICJlamJKYXIiLCBudWxsLCAxLCAxLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpLCB0aGlzLmdldEVKQlJlbGF0aW9uKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwTGlzdCgpLCAiZWpiUmVsYXRpb25zIiwgbnVsbCwgMCwgLTEsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocXVlcnlFQ2xhc3MsIFF1ZXJ5LmNsYXNzLCAiUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFF1ZXJ5X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeV9FamJRTCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZWpiUUwiLCBudWxsLCAwLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlfUmV0dXJuVHlwZU1hcHBpbmcoKSwgdGhpcy5nZXRSZXR1cm5UeXBlTWFwcGluZygpLCAicmV0dXJuVHlwZU1hcHBpbmciLCBudWxsLCAwLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRRdWVyeV9RdWVyeU1ldGhvZCgpLCB0aGlzLmdldFF1ZXJ5TWV0aG9kKCksIHRoaXMuZ2V0UXVlcnlNZXRob2RfUXVlcnkoKSwgInF1ZXJ5TWV0aG9kIiwgbnVsbCwgMSwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5X0VudGl0eSgpLCB0aGlzLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSwgdGhpcy5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1F1ZXJpZXMoKSwgImVudGl0eSIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRRdWVyeV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWpiUmVsYXRpb25FQ2xhc3MsIEVKQlJlbGF0aW9uLmNsYXNzLCAiRUpCUmVsYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uX1JlbGF0aW9uc2hpcExpc3QoKSwgdGhpcy5nZXRSZWxhdGlvbnNoaXBzKCksIHRoaXMuZ2V0UmVsYXRpb25zaGlwc19FamJSZWxhdGlvbnMoKSwgInJlbGF0aW9uc2hpcExpc3QiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKSwgdGhpcy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9SZWxhdGlvbnNoaXAoKSwgInJlbGF0aW9uc2hpcFJvbGVzIiwgbnVsbCwgMiwgMiwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAiRUpCUmVsYXRpb25zaGlwUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JvbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyb2xlTmFtZSIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfTXVsdGlwbGljaXR5KCksIHRoaXMuZ2V0TXVsdGlwbGljaXR5S2luZCgpLCAibXVsdGlwbGljaXR5IiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Nhc2NhZGVEZWxldGUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJjYXNjYWRlRGVsZXRlIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcCgpLCB0aGlzLmdldEVKQlJlbGF0aW9uKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKSwgInJlbGF0aW9uc2hpcCIsIG51bGwsIDEsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfU291cmNlKCksIHRoaXMuZ2V0Um9sZVNvdXJjZSgpLCB0aGlzLmdldFJvbGVTb3VyY2VfUm9sZSgpLCAic291cmNlIiwgbnVsbCwgMSwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpLCB0aGlzLmdldENNUkZpZWxkKCksIHRoaXMuZ2V0Q01SRmllbGRfUm9sZSgpLCAiY21yRmllbGQiLCBudWxsLCAxLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVTb3VyY2VFQ2xhc3MsIFJvbGVTb3VyY2UuY2xhc3MsICJSb2xlU291cmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFJvbGVTb3VyY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJvbGVTb3VyY2VfUm9sZSgpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGUoKSwgdGhpcy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1NvdXJjZSgpLCAicm9sZSIsIG51bGwsIDEsIDEsIFJvbGVTb3VyY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJvbGVTb3VyY2VfRW50aXR5QmVhbigpLCB0aGlzLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSwgbnVsbCwgImVudGl0eUJlYW4iLCBudWxsLCAxLCAxLCBSb2xlU291cmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUm9sZVNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNtckZpZWxkRUNsYXNzLCBDTVJGaWVsZC5jbGFzcywgIkNNUkZpZWxkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDTVJGaWVsZF9Sb2xlKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKSwgInJvbGUiLCBudWxsLCAwLCAxLCBDTVJGaWVsZC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJjb2xsZWN0aW9uVHlwZSIsIG51bGwsIDAsIDEsIENNUkZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWVzc2FnZURyaXZlbkVDbGFzcywgTWVzc2FnZURyaXZlbi5jbGFzcywgIk1lc3NhZ2VEcml2ZW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5fVHJhbnNhY3Rpb25UeXBlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlKCksICJ0cmFuc2FjdGlvblR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZVNlbGVjdG9yKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtZXNzYWdlU2VsZWN0b3IiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuX0Fja25vd2xlZGdlTW9kZSgpLCB0aGlzLmdldEFja25vd2xlZGdlTW9kZSgpLCAiYWNrbm93bGVkZ2VNb2RlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuX0xpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxpbmsiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuX0Rlc3RpbmF0aW9uKCksIHRoaXMuZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKCksIHRoaXMuZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX0JlYW4oKSwgImRlc3RpbmF0aW9uIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbl9BY3RpdmF0aW9uQ29uZmlnKCksIHRoaXMuZ2V0QWN0aXZhdGlvbkNvbmZpZygpLCBudWxsLCAiYWN0aXZhdGlvbkNvbmZpZyIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZURlc3RpbmF0aW9uKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdpbmdUeXBlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAibWVzc2FnaW5nVHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlRHJpdmVuRGVzdGluYXRpb25FQ2xhc3MsIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgIk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1R5cGUoKSwgdGhpcy5nZXREZXN0aW5hdGlvblR5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1N1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSwgdGhpcy5nZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCgpLCAic3Vic2NyaXB0aW9uRHVyYWJpbGl0eSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fQmVhbigpLCB0aGlzLmdldE1lc3NhZ2VEcml2ZW4oKSwgdGhpcy5nZXRNZXNzYWdlRHJpdmVuX0Rlc3RpbmF0aW9uKCksICJiZWFuIiwgbnVsbCwgMSwgMSwgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXhjbHVkZUxpc3RFQ2xhc3MsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAiRXhjbHVkZUxpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFeGNsdWRlTGlzdF9NZXRob2RFbGVtZW50cygpLCB0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSwgbnVsbCwgIm1ldGhvZEVsZW1lbnRzIiwgbnVsbCwgMSwgLTEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocXVlcnlNZXRob2RFQ2xhc3MsIFF1ZXJ5TWV0aG9kLmNsYXNzLCAiUXVlcnlNZXRob2QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5TWV0aG9kX1F1ZXJ5KCksIHRoaXMuZ2V0UXVlcnkoKSwgdGhpcy5nZXRRdWVyeV9RdWVyeU1ldGhvZCgpLCAicXVlcnkiLCBudWxsLCAxLCAxLCBRdWVyeU1ldGhvZC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcywgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAiQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICJBY3RpdmF0aW9uQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBY3RpdmF0aW9uQ29uZmlnX0NvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKSwgbnVsbCwgImNvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAxLCAtMSwgQWN0aXZhdGlvbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuY2xhc3MsICJUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTk9UX1NVUFBPUlRFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuU1VQUE9SVFNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlJFUVVJUkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFU19ORVdfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLk1BTkRBVE9SWV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTkVWRVJfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJUcmFuc2FjdGlvblR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuQkVBTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuQ09OVEFJTkVSX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShzZXNzaW9uVHlwZUVFbnVtLCBTZXNzaW9uVHlwZS5jbGFzcywgIlNlc3Npb25UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChzZXNzaW9uVHlwZUVFbnVtLCBTZXNzaW9uVHlwZS5TVEFURUZVTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHNlc3Npb25UeXBlRUVudW0sIFNlc3Npb25UeXBlLlNUQVRFTEVTU19MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuY2xhc3MsICJNZXRob2RFbGVtZW50S2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5SRU1PVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oYWNrbm93bGVkZ2VNb2RlRUVudW0sIEFja25vd2xlZGdlTW9kZS5jbGFzcywgIkFja25vd2xlZGdlTW9kZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoYWNrbm93bGVkZ2VNb2RlRUVudW0sIEFja25vd2xlZGdlTW9kZS5BVVRPX0FDS05PV0xFREdFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoYWNrbm93bGVkZ2VNb2RlRUVudW0sIEFja25vd2xlZGdlTW9kZS5EVVBTX09LX0FDS05PV0xFREdFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtLCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5jbGFzcywgIlN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtLCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5EVVJBQkxFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRFRW51bSwgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQuTk9OX0RVUkFCTEVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHJldHVyblR5cGVNYXBwaW5nRUVudW0sIFJldHVyblR5cGVNYXBwaW5nLmNsYXNzLCAiUmV0dXJuVHlwZU1hcHBpbmciKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJldHVyblR5cGVNYXBwaW5nRUVudW0sIFJldHVyblR5cGVNYXBwaW5nLkxPQ0FMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocmV0dXJuVHlwZU1hcHBpbmdFRW51bSwgUmV0dXJuVHlwZU1hcHBpbmcuUkVNT1RFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkZXN0aW5hdGlvblR5cGVFRW51bSwgRGVzdGluYXRpb25UeXBlLmNsYXNzLCAiRGVzdGluYXRpb25UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkZXN0aW5hdGlvblR5cGVFRW51bSwgRGVzdGluYXRpb25UeXBlLlFVRVVFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZGVzdGluYXRpb25UeXBlRUVudW0sIERlc3RpbmF0aW9uVHlwZS5UT1BJQ19MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obXVsdGlwbGljaXR5S2luZEVFbnVtLCBNdWx0aXBsaWNpdHlLaW5kLmNsYXNzLCAiTXVsdGlwbGljaXR5S2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwobXVsdGlwbGljaXR5S2luZEVFbnVtLCBNdWx0aXBsaWNpdHlLaW5kLk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG11bHRpcGxpY2l0eUtpbmRFRW51bSwgTXVsdGlwbGljaXR5S2luZC5NQU5ZX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9FamJQYWNrYWdlSW1wbAotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGVycHJpc2VCZWFuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNWM5MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJldmlzaXQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICogRW50ZXJwcmlzZUphdmFCZWFuIGlzIGEgY2xhc3MuICBJdCBjYW4gaGF2ZSBpbnN0YW5jZXMsIHNvbWVvbmUgY291bGQgd3JpdGUgYW4gaW5zdGFuY2UgZG9jdW1lbnQgY29udGFpbmluZyBEZXBhcnRtZW50cyBhbmQgRW1wbG95ZWVzLiAgSXQgYWxzbyBoYXMgYXR0cmlidXRlcywgb3BlcmF0aW9ucywgYW5kIGFzc29jaWF0aW9ucy4gIFRoZXNlIGFyZSBhY3R1YWxseSBkZXJpdmVkLy9maWx0ZXJlZCBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLiAgRm9yIG1hcHBpbmcgYW5kIGJyb3dzaW5nIHB1cnBvc2VzLCB0aG91Z2gsIHlvdSB3b3VsZCBsaWtlIHRoZSBFSkIgdG8gYXBwZWFyIGFzIGEgY2xhc3MuICAKLSAqIAotICogSW4gdGhpcyBsaWdodCwgZXZlbiBTZXNzaW9uIEJlYW5zIGNhbiBoYXZlIGFzc29jaWF0aW9ucyBhbmQgcHJvcGVydGllcyBpbXBsZW1lbnRlZCBieSB0aGVpciBiZWFuLiAgRm9yIGV4YW1wbGUsIGl0IHdvdWxkIGJlIG1lYW5pbmdmdWwgdG8gZGVzY3JpYmUgYXNzb2NpYXRpb25zIGZyb20gYSBTZXNzaW9uIHRvIHRoZSBFbnRpdGllcyB3aGljaCBpdCB1c2VzIHRvIHBlcmZvcm0gaXRzIHdvcmsuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnRlcnByaXNlQmVhbkltcGwgZXh0ZW5kcyBKTkRJRW52UmVmc0dyb3VwSW1wbCBpbXBsZW1lbnRzIEVudGVycHJpc2VCZWFuIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgTWV0aG9kW10gRU1QVFlfTUVUSE9EX0FSUkFZID0gbmV3IE1ldGhvZFswXTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfRUxFTUVOVF9OQU1FID0gIk1ldGhvZEVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlUmVmcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBlamJDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBob21lSW50ZXJmYWNlID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHJlbW90ZUludGVyZmFjZSA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5SWRlbnRpdHkgc2VjdXJpdHlJZGVudGl0eSA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBsb2NhbEhvbWVJbnRlcmZhY2UgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgbG9jYWxJbnRlcmZhY2UgPSBudWxsOwotCXByb3RlY3RlZCBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvciBkZWZhdWx0TWV0aG9kRWxlbWVudENvbXBhcmF0b3I7Ci0JcHVibGljIEVudGVycHJpc2VCZWFuSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVOVEVSUFJJU0VfQkVBTjsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVDbGFzc1JlZiAtIHJldHVybiBhIEphdmFVUkwgcmVmZXJlbmNlIHRvIHRoZSBuYW1lZCBKYXZhIGNsYXNzCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBjcmVhdGVDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSkgewotCQlyZXR1cm4gZ2V0SmF2YVJlZkZhY3RvcnkoKS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVNZXRob2RFbGVtZW50cyhMaXN0IHNpZ25hdHVyZXMsIEVudW1lcmF0b3IgYVR5cGUpIHsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKE1FVEhPRF9FTEVNRU5UX05BTUUsIHNpZ25hdHVyZXMsIGFUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlTWV0aG9kRWxlbWVudHMoU3RyaW5nIG1lVHlwZU5hbWUsIExpc3Qgc2lnbmF0dXJlcywgRW51bWVyYXRvciBhVHlwZSkgewotCQlpbnQgc2l6ZSA9IHNpZ25hdHVyZXMuc2l6ZSgpOwotCQlMaXN0IG1ldGhvZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJU3RyaW5nIHNpZ25hdHVyZTsKLQkJTWV0aG9kRWxlbWVudCBtZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXNpZ25hdHVyZSA9IChTdHJpbmcpIHNpZ25hdHVyZXMuZ2V0KGkpOwotCQkJbWUgPSAoTWV0aG9kRWxlbWVudCkgZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZSgoRUNsYXNzKWdldEVqYlBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcihtZVR5cGVOYW1lKSk7Ci0JCQltZS5zZXRFbnRlcnByaXNlQmVhbih0aGlzKTsKLQkJCW1lLnNldFR5cGUoKE1ldGhvZEVsZW1lbnRLaW5kKWFUeXBlKTsKLQkJCW1lLmluaXRpYWxpemVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZSk7Ci0JCQltZXRob2RFbGVtZW50cy5hZGQobWUpOwotCQl9Ci0JCXJldHVybiBtZXRob2RFbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBjcmVhdGVNZXRob2RFbGVtZW50cyhMaXN0IHNvbWVNZXRob2RzLCBKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIHsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKE1FVEhPRF9FTEVNRU5UX05BTUUsIHNvbWVNZXRob2RzLCBhbkludGVyZmFjZSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGNyZWF0ZU1ldGhvZEVsZW1lbnRzKFN0cmluZyBtZVR5cGVOYW1lLCBMaXN0IHNvbWVNZXRob2RzLCBKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIHsKLQkJaWYgKGFuSW50ZXJmYWNlID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCBzaWduYXR1cmVzID0gZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoc29tZU1ldGhvZHMpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHNpZ25hdHVyZXMpOwotCQlFbnVtZXJhdG9yIGVudW1lcmF0b3IgPSBnZXRNZXRob2RFbGVtZW50S2luZExpdGVyYWwoYW5JbnRlcmZhY2UpOwotCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudHMobWVUeXBlTmFtZSwgc2lnbmF0dXJlcywgZW51bWVyYXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCBFbnVtZXJhdG9yIGdldE1ldGhvZEVsZW1lbnRLaW5kTGl0ZXJhbChKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIHsKLQkJRW51bWVyYXRvciBlbnVtZXJhdG9yID0gTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTDsKLQkJaWYgKGFuSW50ZXJmYWNlID09IGdldEhvbWVJbnRlcmZhY2UoKSkKLQkJCWVudW1lcmF0b3IgPSBNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUw7Ci0JCWVsc2UgaWYgKGFuSW50ZXJmYWNlID09IGdldFJlbW90ZUludGVyZmFjZSgpKQotCQkJZW51bWVyYXRvciA9IE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URV9MSVRFUkFMOwotCQllbHNlIGlmIChhbkludGVyZmFjZSA9PSBnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSkKLQkJCWVudW1lcmF0b3IgPSBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUw7Ci0JCWVsc2UgaWYgKGFuSW50ZXJmYWNlID09IGdldExvY2FsSW50ZXJmYWNlKCkpCi0JCQllbnVtZXJhdG9yID0gTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTDsKLQkJcmV0dXJuIGVudW1lcmF0b3I7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKExpc3Qgc29tZU1ldGhvZHMpIHsKLQkJaW50IHNpemUgPSBzb21lTWV0aG9kcy5zaXplKCk7Ci0JCUxpc3Qgc2lnbmF0dXJlcyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCU1ldGhvZCBtZXRob2Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBzb21lTWV0aG9kcy5nZXQoaSk7Ci0JCQlzaWduYXR1cmVzLmFkZChtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLQkJfQotCQlyZXR1cm4gc2lnbmF0dXJlczsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBhbmQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBIb21lIGFuZCBSZW1vdGUgaW50ZXJmYWNlcy4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0JICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0JICogc29sZWx5IGZvciBjb21wYXJpbmcgd2l0aCBhY3R1YWwgTWV0aG9kRWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtb2RlbC4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpOwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbW1vbk1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGFuZCBhcmUgY29tbW9uIHRvIGJvdGggdGhlIEhvbWUgYW5kIFJlbW90ZSBpbnRlcmZhY2VzLiAgVGhlc2UgTWV0aG9kRWxlbWVudHMgYXJlIG5vdCBjb250YWluZWQgYW5kIHdpbGwKLQkgKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLQkgKiBzb2xlbHkgZm9yIGNvbXBhcmluZyB3aXRoIGFjdHVhbCBNZXRob2RFbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudHMoKSB7Ci0JCUxpc3QgY29tbW9uU2lncyA9IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKTsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKGNvbW1vblNpZ3MsIE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotCX0KLQlwcm90ZWN0ZWQgTGlzdCBnYXRoZXJDb21tb25TaWduYXR1cmVzKExpc3Qgc2lnQ29sbGVjdGlvbnMpIHsKLQkJaWYgKHNpZ0NvbGxlY3Rpb25zLmlzRW1wdHkoKSkgcmV0dXJuIHNpZ0NvbGxlY3Rpb25zOwotCQlMaXN0IGZpcnN0ID0gKExpc3Qpc2lnQ29sbGVjdGlvbnMuZ2V0KDApOwotCQlpZiAoc2lnQ29sbGVjdGlvbnMuc2l6ZSgpID09IDEpIHJldHVybiBmaXJzdDsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGZpcnN0LnNpemUoKSk7Ci0JCXNpZ0NvbGxlY3Rpb25zLnJlbW92ZSgwKTsKLQkJU3RyaW5nIHNpZyA9IG51bGw7Ci0JCWJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaXJzdC5zaXplKCk7IGkrKykgewotCQkJY29udGFpbnMgPSBmYWxzZTsKLQkJCXNpZyA9IChTdHJpbmcpIGZpcnN0LmdldChpKTsKLQkJCUxpc3QgbGlzdCA9IG51bGw7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpZ0NvbGxlY3Rpb25zLnNpemUoKTsgaisrKSB7Ci0JCQkJbGlzdCA9IChMaXN0KSBzaWdDb2xsZWN0aW9ucy5nZXQoaik7Ci0JCQkJaWYgKGxpc3QuY29udGFpbnMoc2lnKSkKLQkJCQkJY29udGFpbnMgPSB0cnVlOwotCQkJfQotCQkJaWYgKGNvbnRhaW5zKQotCQkJCXJlc3VsdC5hZGQoc2lnKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHRoYXQgYXJlIHNldCBmb3IgYSBwYXJ0aWN1bGFyIEVPYmplY3QKLQkgKiB3aGljaCBjYW4gYmUgYSBNZXRob2RUcmFuc2FjdGlvbiBvciBhIE1ldGhvZFBlcm1pc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdNZXRob2RFbGVtZW50cyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlpZiAocmVmT2JqZWN0ICE9IG51bGwpIHsKLQkJCUVqYlBhY2thZ2UgcGFjayA9IGdldEVqYlBhY2thZ2UoKTsKLQkJCWlmIChyZWZPYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRNZXRob2RUcmFuc2FjdGlvbigpKQotCQkJCXJldHVybiAoKE1ldGhvZFRyYW5zYWN0aW9uKXJlZk9iamVjdCkuZ2V0TWV0aG9kRWxlbWVudHModGhpcyk7Ci0JCQlpZiAocmVmT2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0TWV0aG9kUGVybWlzc2lvbigpKQotCQkJCXJldHVybiAoKE1ldGhvZFBlcm1pc3Npb24pcmVmT2JqZWN0KS5nZXRNZXRob2RFbGVtZW50cyh0aGlzKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHNpZ25hdHVyZXMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBhbmQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBIb21lIGFuZCBSZW1vdGUgaW50ZXJmYWNlcy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpOwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbW1vbk1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgTWV0aG9kRWxlbWVudHMgc2lnbmF0dXJlcwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGFuZCBhcmUgY29tbW9uIHRvIGJvdGggdGhlIEhvbWUgYW5kIFJlbW90ZSBpbnRlcmZhY2VzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKSB7Ci0JCUxpc3Qgc2lnQ29sbGVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChnZXRIb21lSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCXNpZ0NvbGxlY3Rpb25zLmFkZChnZXRIb21lSW50ZXJmYWNlKCkuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKSk7Ci0JCWlmIChnZXRSZW1vdGVJbnRlcmZhY2UoKSAhPSBudWxsKQotCQkJc2lnQ29sbGVjdGlvbnMuYWRkKGdldFJlbW90ZUludGVyZmFjZSgpLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkpOwotCQlpZiAoZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCXNpZ0NvbGxlY3Rpb25zLmFkZChnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKS5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpKTsKLQkJaWYgKGdldExvY2FsSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCXNpZ0NvbGxlY3Rpb25zLmFkZChnZXRMb2NhbEludGVyZmFjZSgpLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkpOwkKLQkJcmV0dXJuIGdhdGhlckNvbW1vblNpZ25hdHVyZXMoc2lnQ29sbGVjdGlvbnMpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGZvciB0aGUgSG9tZSBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotCSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotCSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlSG9tZU1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoZ2V0SG9tZUludGVyZmFjZSgpLCBNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUwpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGZvciB0aGUgTG9jYWwgSG9tZSBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotCSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotCSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlTG9jYWxIb21lTWV0aG9kRWxlbWVudHMoKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50cyhnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSwgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfSE9NRV9MSVRFUkFMKTsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBmb3IgdGhlIExvY2FsIGludGVyZmFjZS4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0JICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0JICogc29sZWx5IGZvciBjb21wYXJpbmcgd2l0aCBhY3R1YWwgTWV0aG9kRWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVMb2NhbE1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoZ2V0TG9jYWxJbnRlcmZhY2UoKSwgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlU2VydmljZUVuZHBvaW50TWV0aG9kRWxlbWVudHMoKXsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKGdldFNlcnZpY2VFbmRwb2ludCgpLCBNZXRob2RFbGVtZW50S2luZC5TRVJWSUNFX0VORFBPSU5UX0xJVEVSQUwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50cyhKYXZhQ2xhc3MgYW5JbnRlcmZhY2UsIEVudW1lcmF0b3IgYVR5cGUpIHsKLQkJaWYgKGFuSW50ZXJmYWNlID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCBzaWduYXR1cmVzID0gYW5JbnRlcmZhY2UuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKTsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKHNpZ25hdHVyZXMsIGFUeXBlKTsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBmb3IgdGhlIFJlbW90ZSBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotCSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotCSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlUmVtb3RlTWV0aG9kRWxlbWVudHMoKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50cyhnZXRSZW1vdGVJbnRlcmZhY2UoKSwgTWV0aG9kRWxlbWVudEtpbmQuUkVNT1RFX0xJVEVSQUwpOwotCX0KLQkKLQkvKgotCSAqIFNlZSBFbnRlcnByaXNlQmVhbiNnZXRFeGlzdGluZ09yQXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoRU9iamVjdCwgQ29tcGFyYXRvcik7Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RXhpc3RpbmdPckF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKEVPYmplY3QgcmVmT2JqZWN0LCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0QXZhaWxhYmxlSG9tZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGdldEF2YWlsYWJsZVJlbW90ZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGdldEF2YWlsYWJsZUxvY2FsSG9tZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGdldEF2YWlsYWJsZUxvY2FsTWV0aG9kRWxlbWVudHMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0QXZhaWxhYmxlU2VydmljZUVuZHBvaW50TWV0aG9kRWxlbWVudHMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpKTsKLQkJCi0JCUxpc3QgbGlzdCA9IGdldEVqYkNsYXNzKCkuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlKCBpdC5oYXNOZXh0KCkpewotCQkJSmF2YUNsYXNzICBpbnRlcmZhY2VDbGFzcyA9IChKYXZhQ2xhc3MpaXQubmV4dCgpOwotCQkJU3RyaW5nIGludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQlpZiggIWludGVyZmFjZU5hbWUuZXF1YWxzKCJqYXZheC5lamIuTWVzc2FnZURyaXZlbkJlYW4iKSAmJiAKLQkJCQkJIWludGVyZmFjZU5hbWUuZXF1YWxzKCJqYXZheC5lamIuRW50aXR5QmVhbiIpJiYKLQkJCQkJIWludGVyZmFjZU5hbWUuZXF1YWxzKCJqYXZheC5lamIuU2Vzc2lvbkJlYW4iKSl7Ci0JCQkJcmVzdWx0LmFkZEFsbCggZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoaW50ZXJmYWNlQ2xhc3MsIE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpKTsKLQkJCX0KLQkJfQotCQkKLQkJdW5pb25NZXRob2RFbGVtZW50cyhyZXN1bHQsIGdldEV4aXN0aW5nTWV0aG9kRWxlbWVudHMocmVmT2JqZWN0KSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoKLQkgKiBTZWUgRW50ZXJwcmlzZUJlYW4jZ2V0RXhpc3RpbmdPckF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKEVPYmplY3QpOwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4aXN0aW5nT3JBdmFpbGFibGVNZXRob2RFbGVtZW50cyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlyZXR1cm4gZ2V0RXhpc3RpbmdPckF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKHJlZk9iamVjdCwgZ2V0RGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCkpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yIGdldERlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvcigpIHsKLQkJaWYgKGRlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvciA9PSBudWxsKQotCQkJZGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yID0gbmV3IEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCk7Ci0JCXJldHVybiBkZWZhdWx0TWV0aG9kRWxlbWVudENvbXBhcmF0b3I7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHVuaW9uTWV0aG9kRWxlbWVudHMoTGlzdCBzb3VyY2VNZXRob2RFbGVtZW50cywgTGlzdCBhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMpIHsKLQkJTWV0aG9kRWxlbWVudCBzb3VyY2VNRSwgYWRkaXRpb25hbE1FOwotCQlpbnQgc291cmNlU2l6ZSwgYWRkU2l6ZTsKLQkJc291cmNlU2l6ZSA9IHNvdXJjZU1ldGhvZEVsZW1lbnRzLnNpemUoKTsKLQkJYWRkU2l6ZSA9IGFkZGl0aW9uYWxNZXRob2RFbGVtZW50cy5zaXplKCk7Ci0JCUxpc3QgZm91bmRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoYWRkU2l6ZSk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRTaXplOyBpKyspewotCQkJZm91bmQgPSBmYWxzZTsKLQkJCWFkZGl0aW9uYWxNRSA9IChNZXRob2RFbGVtZW50KSBhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMuZ2V0KGkpOwotCQkJc291cmNlTUUgPSBudWxsOwotCQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHNvdXJjZVNpemU7IGlpKyspewotCQkJCXNvdXJjZU1FID0gKE1ldGhvZEVsZW1lbnQpIHNvdXJjZU1ldGhvZEVsZW1lbnRzLmdldChpaSk7Ci0JCQkJaWYgKHNvdXJjZU1FLmlzRXF1aXZhbGVudChhZGRpdGlvbmFsTUUpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKQotCQkJCWZvdW5kRWxlbWVudHMuYWRkKHNvdXJjZU1FKTsKLQkJfQotCQlzb3VyY2VNZXRob2RFbGVtZW50cy5yZW1vdmVBbGwoZm91bmRFbGVtZW50cyk7Ci0JCXNvdXJjZU1ldGhvZEVsZW1lbnRzLmFkZEFsbChhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEVqYkNsYXNzTmFtZSgpIHsKLQkJZ2V0RWpiQ2xhc3MoKTsKLQkJcmV0dXJuIChlamJDbGFzcyA9PSBudWxsKSA/IG51bGwgOiBlamJDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCXByb3RlY3RlZCBFamJQYWNrYWdlIGdldEVqYlBhY2thZ2UoKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCXByb3RlY3RlZCBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoKEVqYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSkuZ2V0RWpiRmFjdG9yeSgpOwotCX0KLQlwdWJsaWMgRWpiUmVmIGdldEVxdWl2YWxlbnRFamJSZWYoRWpiUmVmIGFuRWpiUmVmKSB7Ci0JCXJldHVybiBnZXRFcXVpdmFsZW50RWpiUmVmKGFuRWpiUmVmLCBnZXRFamJSZWZzKCkpOwotCX0KLQlwdWJsaWMgRUpCTG9jYWxSZWYgZ2V0RXF1aXZhbGVudEVKQkxvY2FsUmVmKEVKQkxvY2FsUmVmIGFuRWpiTG9jYWxSZWYpIHsKLQkJcmV0dXJuIChFSkJMb2NhbFJlZikgZ2V0RXF1aXZhbGVudEVqYlJlZihhbkVqYkxvY2FsUmVmLCBnZXRFamJMb2NhbFJlZnMoKSk7Ci0JfQotCXByaXZhdGUgRWpiUmVmIGdldEVxdWl2YWxlbnRFamJSZWYoRWpiUmVmIGFuRWpiUmVmLCBMaXN0IHNvbWVSZWZzKSB7Ci0JCWlmIChhbkVqYlJlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBzaXplID0gc29tZVJlZnMuc2l6ZSgpOwotCQlFamJSZWYgcmVmOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmID0gKEVqYlJlZikgc29tZVJlZnMuZ2V0KGkpOwotCQkJaWYgKHJlZi5pc0VxdWl2YWxlbnQoYW5FamJSZWYpKQotCQkJCXJldHVybiByZWY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0SG9tZUludGVyZmFjZU5hbWUoKSB7Ci0JCWdldEhvbWVJbnRlcmZhY2UoKTsKLQkJcmV0dXJuIGhvbWVJbnRlcmZhY2UgPT0gbnVsbCA/IG51bGwgOiBob21lSW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0JLyoqCi0JICogU2VlIDxjb2RlPmdldE1ldGhvZHM8Y29kZT4gZm9yIGNvbW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kW10gZ2V0SG9tZU1ldGhvZHNGb3JEZXBsb3ltZW50KCkgewotCQlyZXR1cm4gKGdldEhvbWVJbnRlcmZhY2UoKSAhPSBudWxsID8gZ2V0TWV0aG9kcyhnZXRIb21lSW50ZXJmYWNlKCkpIDogRU1QVFlfTUVUSE9EX0FSUkFZKTsKLQl9Ci0JcHJpdmF0ZSBKYXZhUmVmRmFjdG9yeSBnZXRKYXZhUmVmRmFjdG9yeSgpIHsKLQkJcmV0dXJuICgoSmF2YVJlZlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSkpLmdldEphdmFSZWZGYWN0b3J5KCk7Ci0JfQotCXB1YmxpYyBFamJSZWYgZ2V0TGlua2VkRUpCUmVmZXJlbmNlKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCXJldHVybiBnZXRMaW5rZWRFSkJSZWZlcmVuY2UoYW5FSkIsIGdldEVqYlJlZnMoKSk7Ci0JfQotCXB1YmxpYyBFSkJMb2NhbFJlZiBnZXRMaW5rZWRFSkJMb2NhbFJlZmVyZW5jZShFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlyZXR1cm4gKEVKQkxvY2FsUmVmKSBnZXRMaW5rZWRFSkJSZWZlcmVuY2UoYW5FSkIsIGdldEVqYkxvY2FsUmVmcygpKTsKLQl9Ci0JcHJpdmF0ZSBFamJSZWYgZ2V0TGlua2VkRUpCUmVmZXJlbmNlKEVudGVycHJpc2VCZWFuIGFuRUpCLCBMaXN0IHNvbWVSZWZzKSB7Ci0JCWlmIChhbkVKQiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBzaXplID0gc29tZVJlZnMuc2l6ZSgpOwotCQlFamJSZWYgcmVmOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmID0gKEVqYlJlZikgc29tZVJlZnMuZ2V0KGkpOwotCQkJaWYgKHJlZi5pc0xpbmtlZChhbkVKQikpCi0JCQkJcmV0dXJuIHJlZjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkgewotCQlnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQkJcmV0dXJuIGxvY2FsSG9tZUludGVyZmFjZSA9PSBudWxsID8gbnVsbCA6IGxvY2FsSG9tZUludGVyZmFjZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCS8qKgotCSAqIFNlZSA8Y29kZT5nZXRNZXRob2RzPGNvZGU+IGZvciBjb21tZW50Ci0JICovCi0JcHVibGljIE1ldGhvZFtdIGdldExvY2FsSG9tZU1ldGhvZHNGb3JEZXBsb3ltZW50KCkgewotCQlyZXR1cm4gKGdldExvY2FsSG9tZUludGVyZmFjZSgpICE9IG51bGwgPyBnZXRNZXRob2RzKGdldExvY2FsSG9tZUludGVyZmFjZSgpKSA6IEVNUFRZX01FVEhPRF9BUlJBWSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxJbnRlcmZhY2VOYW1lKCkgewotCQlnZXRMb2NhbEludGVyZmFjZSgpOwotCQlyZXR1cm4gbG9jYWxJbnRlcmZhY2UgPT0gbnVsbCA/IG51bGwgOiBsb2NhbEludGVyZmFjZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCS8qKgotCSAqIFJldHJpZXZlIGFuIG9yZGVyZWQgbGlzdCBvZiBtZXRob2RzIGZvciB0aGUgZ2l2ZW4gSmF2YUNsYXNzLgotCSAqIFRoZSBsaXN0IHNob3VsZCBpbmNsdWRlIGFsbCBub24tc3RhdGljLCBwdWJsaWMgbWV0aG9kcyB0aGF0IGFyZQotCSAqIG5vdCBpbmhlcml0ZWQgZnJvbSBqYXZheC5lamIuRUpCT2JqZWN0Ci0JICogVGhpcyB1c2VzIHRoZSBhbGdvcml0aG0gdGhhdCB3ZWIgc3BoZXJlIGN1cnJlbnRseSB1c2VzLCBhbmQgY291bGQKLQkgKiBiZSBzdWJqZWN0IHRvIGNoYW5nZQotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzIxLzAwIDE6NDE6MDMgUE0pCi0JICogQHBhcmFtIGludGYgSmF2YUNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RbXSBnZXRNZXRob2RzKEphdmFDbGFzcyBpbnRmKSB7Ci0JCU1ldGhvZFtdIGFsbE1ldGhvZHMgPSBpbnRmLmxpc3RNZXRob2RFeHRlbmRlZCgpOwotCQlqYXZhLnV0aWwuVmVjdG9yIHJlc3VsdFZlY3RvciA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKGFsbE1ldGhvZHMubGVuZ3RoKTsKLQkJamF2YS51dGlsLkhhc2h0YWJsZSBtZXRob2ROYW1lVGFibGUgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBJdGVyYXRlIG92ZXIgdGhlIGxpc3QgcmV0dXJuZWQgYnkgImxpc3RNZXRob2RFeHRlbmRlZCIgYW5kCi0JCS8vIGZpbHRlciBvdXQgbWV0aG9kcyBiZWxvbmdpbmcgdG8gdGhlIEVKQk9iamVjdCBpbnRlcmZhY2UKLQkJLy8gYW5kIG1ldGhvZCBzeW5vbnltcy4gCi0JCS8vCi0JCS8vIE1ldGhvZCBzeW5vbnltcyBjb3JyZXNwb25kIHRvIG92ZXJyaWRlcy4gRm9yIGFsbCBzeW5vbnltcwotCQkvLyBrZWVwIHRoZSBtZXRob2QgaW5zdGFuY2UgZGVjbGFyZWQgb24gdGhlIG1vc3Qgc3BlY2lmaWMgY2xhc3MuIAotCQkvLyBIb3cgZG8geW91IGRldGVybWluZSB0aGUgbW9zdCBzcGVjaWZpYyBjbGFzcz8gRG9uJ3Qga25vdy4KLQkJLy8gRm9yIG5vdywgaWYgdGhlIG1ldGhvZCBpcyBkZWNsYXJlZCBvbiB0aGUgaW50ZXJmYWNlIGNsYXNzCi0JCS8vIGl0IGFsd2F5cyBvdmVycmlkZXMgb3RoZXJzLgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQlNZXRob2RbXSByZXN1bHQgPSBudWxsOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kIG0gPSBhbGxNZXRob2RzW2ldOwotCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gRmlsdGVyIG91dCBzdGF0aWMgbWV0aG9kcwotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQkJaWYgKG0uaXNTdGF0aWMoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlTdHJpbmcgbUtleSA9IG1ldGhvZEtleShtKTsKLQotCQkJU3RyaW5nIGludGVyZmFjZU5hbWUgPSBtLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpOwotCQkJaWYgKCFpbnRlcmZhY2VOYW1lLmVxdWFscygiamF2YXguZWpiLkVKQk9iamVjdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXRob2Qgc3lub255bSA9IChNZXRob2QpIG1ldGhvZE5hbWVUYWJsZS5nZXQobUtleSk7Ci0JCQkJaWYgKHN5bm9ueW0gPT0gbnVsbCkgewotCQkJCQltZXRob2ROYW1lVGFibGUucHV0KG1LZXksIG0pOwotCQkJCQlyZXN1bHRWZWN0b3IuYWRkRWxlbWVudChtKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCQkvLyBNZXRob2QgZGVjbGFyZWQgb24gbW9zdCBzcGVjaWZpYyBjbGFzcyB3aW5zCi0JCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJCUphdmFDbGFzcyBtQ2xhc3MgPSBtLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJCQkJSmF2YUNsYXNzIHNDbGFzcyA9IHN5bm9ueW0uZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCQkJCQlpZiAoc0NsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UobUNsYXNzKSkgewotCQkJCQkJcmVzdWx0VmVjdG9yLnJlbW92ZUVsZW1lbnQoc3lub255bSk7Ci0JCQkJCQltZXRob2ROYW1lVGFibGUucHV0KG1LZXksIG0pOwotCQkJCQkJcmVzdWx0VmVjdG9yLmFkZEVsZW1lbnQobSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXN1bHQgPSBuZXcgTWV0aG9kW3Jlc3VsdFZlY3Rvci5zaXplKCldOwotCQlyZXN1bHRWZWN0b3IuY29weUludG8ocmVzdWx0KTsKLQkJcmV0dXJuIHNvcnRNZXRob2RzKHJlc3VsdCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSW50ZXJmYWNlTmFtZSgpIHsKLQkJZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCXJldHVybiByZW1vdGVJbnRlcmZhY2UgPT0gbnVsbCA/IG51bGwgOiByZW1vdGVJbnRlcmZhY2UuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQkvKioKLQkgKiBTZWUgPGNvZGU+Z2V0TWV0aG9kczxjb2RlPiBmb3IgY29tbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RbXSBnZXRSZW1vdGVNZXRob2RzRm9yRGVwbG95bWVudCgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZHMoZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBAYUphdmFDbGFzcyBhcyBlcXVhbCB0byB0aGUKLQkgKiBob21lLCByZW1vdGUsIGJlYW4gY2xhc3MsIG9yIGtleSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNKYXZhUmVmZXJlbmNlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JCWlmIChhSmF2YUNsYXNzICE9IG51bGwpIHsKLQkJCXJldHVybiBhSmF2YUNsYXNzLmVxdWFscyhnZXRFamJDbGFzcygpKXx8Ci0JCQkJCWFKYXZhQ2xhc3MuZXF1YWxzKGdldFJlbW90ZUludGVyZmFjZSgpKSB8fCAKLQkJCQkJYUphdmFDbGFzcy5lcXVhbHMoZ2V0SG9tZUludGVyZmFjZSgpKSB8fCAKLQkJCQkJYUphdmFDbGFzcy5lcXVhbHMoZ2V0TG9jYWxJbnRlcmZhY2UoKSkgfHwKLQkJCQkJYUphdmFDbGFzcy5lcXVhbHMoZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBlamIgaGFzIEJlYW5NYW5hZ2VkUGVyc2lzdGFuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCZWFuTWFuYWdlZEVudGl0eSgpIHsKLQkJcmV0dXJuIGlzRW50aXR5KCkgJiYgIWlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCX0KLQkvKioKLQkgKiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8vUmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQKLQlwdWJsaWMgYm9vbGVhbiBpc0VudGl0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvL1JldHVybiBmYWxzZSBieSBkZWZhdWx0Ci0JcHVibGljIGJvb2xlYW4gaXNNZXNzYWdlRHJpdmVuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8vUmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQKLQlwdWJsaWMgYm9vbGVhbiBpc1Nlc3Npb24oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBVc2UgZ2V0RWpiSmFyKCkuZ2V0VmVyc2lvbklEKCkKLQkgKiBpc1ZlcnNpb24xX1ggbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV9YKCkgewotCQlpZiAoZ2V0RWpiSmFyKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRFamJKYXIoKS5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwotCQlSZXZpc2l0LnJldmlzaXQoKTsgLy9qc2hvbGwgdGhpcyBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uLiBpZiB0aGVyZSBpcyBub3QgSkFSIHRoZW4gdGhlIHZlcnNpb24gaXMgdW5kZWZpbmVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBVc2UgZ2V0RWpiSmFyKCkuZ2V0VmVyc2lvbklEKCkKLQkgKiBpc1ZlcnNpb24yX1ggbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMl9YKCkgewotCQlpZiAoZ2V0RWpiSmFyKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVqYkphcigpLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ7Ci0JCX0KLQkJUmV2aXNpdC5yZXZpc2l0KCk7IC8vanNob2xsIHRoaXMgc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbi4gaWYgdGhlcmUgaXMgbm90IEpBUiB0aGVuIHRoZSB2ZXJzaW9uIGlzIHVuZGVmaW5lZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5FbnRlcnByaXNlQmVhbiNnZXRWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlcy5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkKLQkvKgotCSAqIEBzZWUgRW50ZXJwcmlzZUJlYW4jaGFzTG9jYWxDbGllbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0xvY2FsQ2xpZW50KCkgewotCQlyZXR1cm4gZ2V0TG9jYWxJbnRlcmZhY2UoKSAhPSBudWxsICYmIGdldExvY2FsSG9tZUludGVyZmFjZSgpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVudGVycHJpc2VCZWFuI2hhc1JlbW90ZUNsaWVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVtb3RlQ2xpZW50KCkgewotCQlyZXR1cm4gZ2V0UmVtb3RlSW50ZXJmYWNlKCkgIT0gbnVsbCAmJiBnZXRIb21lSW50ZXJmYWNlKCkgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogIEdldCBtZXRob2QgbmFtZSBzdHJpbmcgb2YgZm9ybTogCi0JICogIG1ldGhvZE5hbWUoY2xhc3MgbmFtZSBvZiBhcmcxLGNsYXNzIG5hbWUgb2YgYXJnMiwuLi4pCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMjQvMDAgMToyMToxMCBQTSkKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBwYXJhbSBtIE1ldGhvZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtZXRob2RLZXkoTWV0aG9kIG0pIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobS5nZXROYW1lKCkpOwotCi0JCXJlc3VsdC5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWphdmEudXRpbC5MaXN0IGFyZ3MgPSBtLmdldFBhcmFtZXRlcnMoKTsKLQkJSmF2YVBhcmFtZXRlciBhcmc7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewotCQkJYXJnID0gKEphdmFQYXJhbWV0ZXIpIGFyZ3MuZ2V0KGkpOwotCQkJcmVzdWx0LmFwcGVuZCgoKEphdmFIZWxwZXJzKSBhcmcuZ2V0RVR5cGUoKSkuZ2V0SmF2YU5hbWUoKSk7Ci0JCQlyZXN1bHQuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXN1bHQuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgT2JqZWN0IHByaW1SZWZWYWx1ZShFT2JqZWN0IGZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoKChFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZSkuZ2V0RmVhdHVyZUlEKCksICgoRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmUpLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTiA6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUUgOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU01BTExfSUNPTiA6Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTEFSR0VfSUNPTiA6Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfUkVGUyA6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTIDoKLQkJCQlyZXR1cm4gZ2V0RWpiQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuIGdldFJlbW90ZUludGVyZmFjZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA6Ci0JCQkJcmV0dXJuIGdldEVudmlyb25tZW50UHJvcGVydGllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTIDoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX1JFRlMgOgotCQkJCXJldHVybiBnZXRFamJSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfTE9DQUxfUkVGUyA6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMgOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlJZGVudGl0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTkFNRSA6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZVN5bmNTZWN1cml0eVJvbGVSZWYoamF2YS5sYW5nLlN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JCUxpc3Qgcm9sZVJlZnMgPSBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZVJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCVNlY3VyaXR5Um9sZVJlZiByb2xlUmVmID0gKFNlY3VyaXR5Um9sZVJlZikgcm9sZVJlZnMuZ2V0KGkpOwotCQkJaWYgKHJvbGVSZWYuZ2V0TGluaygpICE9IG51bGwgJiYgcm9sZVJlZi5nZXRMaW5rKCkuZXF1YWxzKGV4aXN0aW5nUm9sZU5hbWUpKQotCQkJCXJvbGVSZWYuc2V0TGluayhuZXdSb2xlTmFtZSk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2V0RWpiQ2xhc3NOYW1lKFN0cmluZyBlamJDbGFzc05hbWUpIHsKLQkJZVNldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9FamJDbGFzcygpLCBjcmVhdGVDbGFzc1JlZihlamJDbGFzc05hbWUpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SG9tZUludGVyZmFjZU5hbWUoU3RyaW5nIGhvbWVJbnRlcmZhY2VOYW1lKSB7Ci0JCWVTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpLCBjcmVhdGVDbGFzc1JlZihob21lSW50ZXJmYWNlTmFtZSkpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKFN0cmluZyBsb2NhbEhvbWVJbnRlcmZhY2VOYW1lKSB7Ci0JCWVTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCksIGNyZWF0ZUNsYXNzUmVmKGxvY2FsSG9tZUludGVyZmFjZU5hbWUpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0TG9jYWxJbnRlcmZhY2VOYW1lKFN0cmluZyBsb2NhbEludGVyZmFjZU5hbWUpIHsKLQkJZVNldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpLCBjcmVhdGVDbGFzc1JlZihsb2NhbEludGVyZmFjZU5hbWUpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UmVtb3RlSW50ZXJmYWNlTmFtZShTdHJpbmcgcmVtb3RlSW50ZXJmYWNlTmFtZSkgewotCQllU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1JlbW90ZUludGVyZmFjZSgpLCBjcmVhdGVDbGFzc1JlZihyZW1vdGVJbnRlcmZhY2VOYW1lKSk7Ci0JfQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8yNC8wMCAxOjMyOjEzIFBNKQotCSAqIEByZXR1cm4gTWV0aG9kW10KLQkgKiBAcGFyYW0gbWV0aG9kcyBNZXRob2RbXQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1ldGhvZFtdIHNvcnRNZXRob2RzKE1ldGhvZFtdIG1ldGhvZHMpIHsKLQkJTWV0aG9kIHJlc3VsdFtdID0gbmV3IE1ldGhvZFttZXRob2RzLmxlbmd0aF07Ci0KLQkJLyoqCi0JCSAqICBJbnNlcnQgZWFjaCBlbGVtZW50IG9mIGdpdmVuIGxpc3Qgb2YgbWV0aG9kcyBpbnRvIHJlc3VsdAotCQkgKiAgYXJhcnkgaW4gc29ydGVkIG9yZGVyCi0JCSAqLwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kIGN1cnJNZXRob2QgPSBtZXRob2RzW2ldOwotCQkJU3RyaW5nIGN1cnJNZXRob2ROYW1lID0gY3Vyck1ldGhvZC5nZXRTaWduYXR1cmUoKTsKLQkJCWludCBpbnNlcnRJbmRleCA9IDA7Ci0JCQl3aGlsZSAoaW5zZXJ0SW5kZXggPCBpKSB7Ci0JCQkJaWYgKGN1cnJNZXRob2ROYW1lLmNvbXBhcmVUbyhyZXN1bHRbaW5zZXJ0SW5kZXhdLmdldFNpZ25hdHVyZSgpKSA8PSAwKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpbnNlcnRJbmRleCsrOwotCQkJfQotCi0JCQlmb3IgKGludCBqID0gaW5zZXJ0SW5kZXg7IGogPD0gaTsgaisrKSB7Ci0JCQkJTWV0aG9kIHRtcE1ldGhvZCA9IHJlc3VsdFtqXTsKLQkJCQlyZXN1bHRbal0gPSBjdXJyTWV0aG9kOwotCQkJCWN1cnJNZXRob2QgPSB0bXBNZXRob2Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIigiICsgZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VjdXJpdHlSb2xlUmVmcygpIHsKLQkJaWYgKHNlY3VyaXR5Um9sZVJlZnMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGVSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMpOwotCQl9Ci0JCXJldHVybiBzZWN1cml0eVJvbGVSZWZzOwotCX0KLQotICAgIC8qKgotICAgICAqIEhhbmR3cml0dGVuIHZlcnNpb24gb2YgZ2V0RWpiQ2xhc3MoKToKLSAgICAgKi8KLSAKLSAKLSAgICBwdWJsaWMgSmF2YUNsYXNzIGdldEVqYkNsYXNzKCkgIHsgCi0gICAgICAgaWYgKGVqYkNsYXNzICE9IG51bGwgJiYgZWpiQ2xhc3MuZUlzUHJveHkoKSkgeyAKLSAgICAgICAgICBKYXZhQ2xhc3Mgb2xkRWpiQ2xhc3MgPSBlamJDbGFzczsgCi0gICAgICAgICAgSmF2YUNsYXNzIHJlc29sdmVkID0gKEphdmFDbGFzcylFY29yZVV0aWwucmVzb2x2ZShlamJDbGFzcywgdGhpcyk7IAotICAgICAgICAgIHJlc29sdmVkKHRoaXMuZWpiQ2xhc3MsIHJlc29sdmVkKTsKLSAgICAgICAgICB0aGlzLmVqYkNsYXNzID0gcmVzb2x2ZWQ7Ci0gICAgICAgICAgaWYgKGVqYkNsYXNzICE9IG9sZEVqYkNsYXNzKSB7IAotICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgCi0gICAgICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1MsIG9sZEVqYkNsYXNzLCBlamJDbGFzcykpOyAKLSAgICAgICAgICB9IAotICAgICAgIH0gCi0gICAgICAgcmV0dXJuIGVqYkNsYXNzOyAKLSAgICB9IAotIAotICAgICAgICAgCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJDbGFzcyhKYXZhQ2xhc3MgbmV3RWpiQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZEVqYkNsYXNzID0gZWpiQ2xhc3M7Ci0JCWVqYkNsYXNzID0gbmV3RWpiQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1MsIG9sZEVqYkNsYXNzLCBlamJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SG9tZUludGVyZmFjZSgpIHsKLQkJaWYgKGhvbWVJbnRlcmZhY2UgIT0gbnVsbCAmJiBob21lSW50ZXJmYWNlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRIb21lSW50ZXJmYWNlID0gKEludGVybmFsRU9iamVjdClob21lSW50ZXJmYWNlOwotCQkJaG9tZUludGVyZmFjZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRIb21lSW50ZXJmYWNlKTsKLQkJCWlmIChob21lSW50ZXJmYWNlICE9IG9sZEhvbWVJbnRlcmZhY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fSE9NRV9JTlRFUkZBQ0UsIG9sZEhvbWVJbnRlcmZhY2UsIGhvbWVJbnRlcmZhY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaG9tZUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0SG9tZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGhvbWVJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9tZUludGVyZmFjZShKYXZhQ2xhc3MgbmV3SG9tZUludGVyZmFjZSkgewotCQlKYXZhQ2xhc3Mgb2xkSG9tZUludGVyZmFjZSA9IGhvbWVJbnRlcmZhY2U7Ci0JCWhvbWVJbnRlcmZhY2UgPSBuZXdIb21lSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fSE9NRV9JTlRFUkZBQ0UsIG9sZEhvbWVJbnRlcmZhY2UsIGhvbWVJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFJlbW90ZUludGVyZmFjZSgpIHsKLQkJaWYgKHJlbW90ZUludGVyZmFjZSAhPSBudWxsICYmIHJlbW90ZUludGVyZmFjZS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUmVtb3RlSW50ZXJmYWNlID0gKEludGVybmFsRU9iamVjdClyZW1vdGVJbnRlcmZhY2U7Ci0JCQlyZW1vdGVJbnRlcmZhY2UgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkUmVtb3RlSW50ZXJmYWNlKTsKLQkJCWlmIChyZW1vdGVJbnRlcmZhY2UgIT0gb2xkUmVtb3RlSW50ZXJmYWNlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0UsIG9sZFJlbW90ZUludGVyZmFjZSwgcmVtb3RlSW50ZXJmYWNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlbW90ZUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0UmVtb3RlSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gcmVtb3RlSW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZUludGVyZmFjZShKYXZhQ2xhc3MgbmV3UmVtb3RlSW50ZXJmYWNlKSB7Ci0JCUphdmFDbGFzcyBvbGRSZW1vdGVJbnRlcmZhY2UgPSByZW1vdGVJbnRlcmZhY2U7Ci0JCXJlbW90ZUludGVyZmFjZSA9IG5ld1JlbW90ZUludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0UsIG9sZFJlbW90ZUludGVyZmFjZSwgcmVtb3RlSW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVKQkphciBnZXRFamJKYXIoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFSkJKYXIpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVqYkphcihFSkJKYXIgbmV3RWpiSmFyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdFamJKYXIsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiSmFyKEVKQkphciBuZXdFamJKYXIpIHsKLQkJaWYgKG5ld0VqYkphciAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUiAmJiBuZXdFamJKYXIgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdFamJKYXIpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFamJKYXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RWpiSmFyKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFamJKYXIobmV3RWpiSmFyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSLCBuZXdFamJKYXIsIG5ld0VqYkphcikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcyBpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdAotCSAqIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0JICovCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHkgZ2V0U2VjdXJpdHlJZGVudGl0eSgpIHsKLQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5IG5ld1NlY3VyaXR5SWRlbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VjdXJpdHlJZGVudGl0eSBvbGRTZWN1cml0eUlkZW50aXR5ID0gc2VjdXJpdHlJZGVudGl0eTsKLQkJc2VjdXJpdHlJZGVudGl0eSA9IG5ld1NlY3VyaXR5SWRlbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9JREVOVElUWSwgb2xkU2VjdXJpdHlJZGVudGl0eSwgbmV3U2VjdXJpdHlJZGVudGl0eSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5IG5ld1NlY3VyaXR5SWRlbnRpdHkpIHsKLQkJaWYgKG5ld1NlY3VyaXR5SWRlbnRpdHkgIT0gc2VjdXJpdHlJZGVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VjdXJpdHlJZGVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZWN1cml0eUlkZW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZWN1cml0eUlkZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlY3VyaXR5SWRlbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2VjdXJpdHlJZGVudGl0eShuZXdTZWN1cml0eUlkZW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9JREVOVElUWSwgbmV3U2VjdXJpdHlJZGVudGl0eSwgbmV3U2VjdXJpdHlJZGVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkgewotCQlpZiAobG9jYWxIb21lSW50ZXJmYWNlICE9IG51bGwgJiYgbG9jYWxIb21lSW50ZXJmYWNlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRMb2NhbEhvbWVJbnRlcmZhY2UgPSAoSW50ZXJuYWxFT2JqZWN0KWxvY2FsSG9tZUludGVyZmFjZTsKLQkJCWxvY2FsSG9tZUludGVyZmFjZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRMb2NhbEhvbWVJbnRlcmZhY2UpOwotCQkJaWYgKGxvY2FsSG9tZUludGVyZmFjZSAhPSBvbGRMb2NhbEhvbWVJbnRlcmZhY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0UsIG9sZExvY2FsSG9tZUludGVyZmFjZSwgbG9jYWxIb21lSW50ZXJmYWNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvY2FsSG9tZUludGVyZmFjZTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFNlcnZpY2VFbmRwb2ludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBsb2NhbEhvbWVJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxIb21lSW50ZXJmYWNlKEphdmFDbGFzcyBuZXdMb2NhbEhvbWVJbnRlcmZhY2UpIHsKLQkJSmF2YUNsYXNzIG9sZExvY2FsSG9tZUludGVyZmFjZSA9IGxvY2FsSG9tZUludGVyZmFjZTsKLQkJbG9jYWxIb21lSW50ZXJmYWNlID0gbmV3TG9jYWxIb21lSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0UsIG9sZExvY2FsSG9tZUludGVyZmFjZSwgbG9jYWxIb21lSW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRMb2NhbEludGVyZmFjZSgpIHsKLQkJaWYgKGxvY2FsSW50ZXJmYWNlICE9IG51bGwgJiYgbG9jYWxJbnRlcmZhY2UuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZExvY2FsSW50ZXJmYWNlID0gKEludGVybmFsRU9iamVjdClsb2NhbEludGVyZmFjZTsKLQkJCWxvY2FsSW50ZXJmYWNlID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZExvY2FsSW50ZXJmYWNlKTsKLQkJCWlmIChsb2NhbEludGVyZmFjZSAhPSBvbGRMb2NhbEludGVyZmFjZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0UsIG9sZExvY2FsSW50ZXJmYWNlLCBsb2NhbEludGVyZmFjZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsb2NhbEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0TG9jYWxJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBsb2NhbEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEludGVyZmFjZShKYXZhQ2xhc3MgbmV3TG9jYWxJbnRlcmZhY2UpIHsKLQkJSmF2YUNsYXNzIG9sZExvY2FsSW50ZXJmYWNlID0gbG9jYWxJbnRlcmZhY2U7Ci0JCWxvY2FsSW50ZXJmYWNlID0gbmV3TG9jYWxJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0UsIG9sZExvY2FsSW50ZXJmYWNlLCBsb2NhbEludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVI6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEVqYkphcigoRUpCSmFyKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOgotCQkJCXJldHVybiBiYXNpY1NldEVqYkphcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXJldHVybiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TLCBFSkJKYXIuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVqYkNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RWpiQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEhvbWVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkphcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2NhbEludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldExvY2FsSW50ZXJmYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTOgotCQkJCXNldEVqYkNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFOgotCQkJCXNldEhvbWVJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlzZXRSZW1vdGVJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUjoKLQkJCQlzZXRFamJKYXIoKEVKQkphciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJc2V0U2VjdXJpdHlJZGVudGl0eSgoU2VjdXJpdHlJZGVudGl0eSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0TG9jYWxIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0lOVEVSRkFDRToKLQkJCQlzZXRMb2NhbEludGVyZmFjZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJc2V0RWpiQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19IT01FX0lOVEVSRkFDRToKLQkJCQlzZXRIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlzZXRSZW1vdGVJbnRlcmZhY2UoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXNldFNlY3VyaXR5SWRlbnRpdHkoKFNlY3VyaXR5SWRlbnRpdHkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0TG9jYWxIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFOgotCQkJCXNldExvY2FsSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGVqYkNsYXNzICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19IT01FX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gaG9tZUludGVyZmFjZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gcmVtb3RlSW50ZXJmYWNlICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOgotCQkJCXJldHVybiBnZXRFamJKYXIoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdHkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFOgotCQkJCXJldHVybiBsb2NhbEhvbWVJbnRlcmZhY2UgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gbG9jYWxJbnRlcmZhY2UgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ0dlbigpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmVzZXJ2ZSBhZGFwdGVycyB3aGVuIG9iamVjdCBpcyByZXNvbHZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNvbHZlZChFT2JqZWN0IG9yaWdpbmFsT2JqZWN0LCBFT2JqZWN0IHJlc29sdmVkT2JqZWN0KSB7Ci0JCWlmIChvcmlnaW5hbE9iamVjdCAhPSBudWxsICYmIHJlc29sdmVkT2JqZWN0ICE9IG51bGwgJiYgb3JpZ2luYWxPYmplY3QgIT0gcmVzb2x2ZWRPYmplY3QpIHsKLQkJCUNvbGxlY3Rpb24gY29sID0gb3JpZ2luYWxPYmplY3QuZUFkYXB0ZXJzKCk7Ci0JCQlpZiAoIWNvbC5pc0VtcHR5KCkpIHsKLQkJCQlJdGVyYXRvciBpdCA9IGNvbC5pdGVyYXRvcigpOwotCQkJCUFkYXB0ZXIgYTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWEgPSAoQWRhcHRlcikgaXQubmV4dCgpOwotCQkJCQlpZiAoYSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQkJcmVzb2x2ZWRPYmplY3QuZUFkYXB0ZXJzKCkuYWRkKGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEVqYkNsYXNzR2VuKCkgewotCQlpZiAoZWpiQ2xhc3MgIT0gbnVsbCAmJiBlamJDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRWpiQ2xhc3MgPSAoSW50ZXJuYWxFT2JqZWN0KWVqYkNsYXNzOwotCQkJZWpiQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkRWpiQ2xhc3MpOwotCQkJaWYgKGVqYkNsYXNzICE9IG9sZEVqYkNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUywgb2xkRWpiQ2xhc3MsIGVqYkNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVqYkNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRFamJDbGFzcygpIHsKLQkJcmV0dXJuIGVqYkNsYXNzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50I2dldEVBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVBbm5vdGF0aW9uIGdldEVBbm5vdGF0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudCNnZXRFQW5ub3RhdGlvbnMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFQW5ub3RhdGlvbnMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRpdHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODEyMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci0KLS8qKgotICogVGhlIGVudGl0eSBlbGVtZW50IGRlY2xhcmVzIGFuIGVudGl0eSBiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBvcHRpb25hbCBkaXNwbGF5IG5hbWU7IG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lOyBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZTsgYSB1bmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55OyB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLCBpZiBhbnk7IHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzOyB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGU7IHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWU7IGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeTsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbjsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBhYnN0cmFjdCBzY2hlbWEgbmFtZTsgYW4gb3B0aW9uYWwgbGlzdCBvZiBjb250YWluZXItbWFuYWdlZCBmaWVsZHM7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMgZm9yIGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LgotICogVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgYW5kIGNtcC12ZXJzaW9uIDIueC4gVGhlIG9wdGlvbmFsIHByaW1rZXktZmllbGQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBUaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLSAqIFRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYgdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLSAqIFRoZSBvcHRpb25hbCBsb2NhbC1ob21lIGFuZCBsb2NhbCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgZW50aXR5IGJlYW4gaGFzIGEgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLgotICogVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGUgZW50aXR5IGJlYW4uCi0gKiBUaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIEF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYKLSAqIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5SW1wbCBleHRlbmRzIEVudGVycHJpc2VCZWFuSW1wbCBpbXBsZW1lbnRzIEVudGl0eSwgRW50ZXJwcmlzZUJlYW4gewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVlbnRyYW50KCkgPGVtPlJlZW50cmFudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZWVudHJhbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUVOVFJBTlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVlbnRyYW50KCkgPGVtPlJlZW50cmFudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZWVudHJhbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlZW50cmFudCA9IFJFRU5UUkFOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVlbnRyYW50IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBib29sZWFuIHJlZW50cmFudEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgcHJpbWFyeUtleSA9IG51bGw7Ci0JcHVibGljIEVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FTlRJVFk7Ci0JfQotCi1wdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlOYW1lKCkgewotCWdldFByaW1hcnlLZXkoKTsKLQlyZXR1cm4gcHJpbWFyeUtleSA9PSBudWxsID8gbnVsbCA6IHByaW1hcnlLZXkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiBAYUphdmFDbGFzcyBhcyBlcXVhbCB0byB0aGUKLSAqIGhvbWUsIHJlbW90ZSwgYmVhbiBjbGFzcywgb3Iga2V5IGNsYXNzLgotICovCi1wdWJsaWMgYm9vbGVhbiBoYXNKYXZhUmVmZXJlbmNlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JYm9vbGVhbiByZXN1bHQgPSBzdXBlci5oYXNKYXZhUmVmZXJlbmNlKGFKYXZhQ2xhc3MpOwotCWlmICghcmVzdWx0ICYmIGFKYXZhQ2xhc3MgIT0gbnVsbCkKLQkJcmVzdWx0ID0gYUphdmFDbGFzcy5lcXVhbHMoZ2V0UHJpbWFyeUtleSgpKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotLy9SZXR1cm4gZmFsc2UgYnkgZGVmYXVsdAotcHVibGljIGJvb2xlYW4gaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBib29sZWFuIGlzRW50aXR5KCkgewotCXJldHVybiB0cnVlOwotfQotcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUdldElzUmVlbnRyYW50KCkgewotICAgcmV0dXJuIGlzUmVlbnRyYW50KCk7Ci19Ci1wcm90ZWN0ZWQgSmF2YUNsYXNzIHByaW1HZXRQcmltYXJ5S2V5KCkgewotCXJldHVybiBnZXRQcmltYXJ5S2V5KCk7Ci19Ci0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHByaW1SZWZWYWx1ZShFT2JqZWN0IGZlYXR1cmUpIHsKLQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRCgoKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlKS5nZXRGZWF0dXJlSUQoKSwgKChFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZSkuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5UOiByZXR1cm4gbmV3IEJvb2xlYW4oaXNSZWVudHJhbnQoKSk7Ci0JCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1BSSU1BUllfS0VZOiByZXR1cm4gZ2V0UHJpbWFyeUtleSgpOwotCX0KLQlyZXR1cm4gc3VwZXIucHJpbVJlZlZhbHVlKGZlYXR1cmUpOwotfQotcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleU5hbWUoU3RyaW5nIHByaW1hcnlLZXlOYW1lKSB7Ci0JZVNldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRpdHlfUHJpbWFyeUtleSgpLCBjcmVhdGVDbGFzc1JlZihwcmltYXJ5S2V5TmFtZSkpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkgYmVhbiBpcyByZWVudHJhbnQgb3Igbm90LgotCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWVudHJhbnQoKSB7Ci0JCXJldHVybiByZWVudHJhbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVlbnRyYW50KGJvb2xlYW4gbmV3UmVlbnRyYW50KSB7Ci0JCWJvb2xlYW4gb2xkUmVlbnRyYW50ID0gcmVlbnRyYW50OwotCQlyZWVudHJhbnQgPSBuZXdSZWVudHJhbnQ7Ci0JCWJvb2xlYW4gb2xkUmVlbnRyYW50RVNldCA9IHJlZW50cmFudEVTZXQ7Ci0JCXJlZW50cmFudEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5ULCBvbGRSZWVudHJhbnQsIHJlZW50cmFudCwgIW9sZFJlZW50cmFudEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHVuc2V0UmVlbnRyYW50KCkgewotCQlib29sZWFuIG9sZFJlZW50cmFudCA9IHJlZW50cmFudDsKLQkJYm9vbGVhbiBvbGRSZWVudHJhbnRFU2V0ID0gcmVlbnRyYW50RVNldDsKLQkJcmVlbnRyYW50ID0gUkVFTlRSQU5UX0VERUZBVUxUOwotCQlyZWVudHJhbnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfX1JFRU5UUkFOVCwgb2xkUmVlbnRyYW50LCBSRUVOVFJBTlRfRURFRkFVTFQsIG9sZFJlZW50cmFudEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0UmVlbnRyYW50KCkgewotCQlyZXR1cm4gcmVlbnRyYW50RVNldDsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kd3JpdHRlbiB2ZXJzaW9uIG9mIGdldFByaW1hcnlLZXkoKToKLSAgICAgKi8KLSAKLSAKLSAgICBwdWJsaWMgSmF2YUNsYXNzIGdldFByaW1hcnlLZXkoKSAgeyAKLSAgICAgICBpZiAocHJpbWFyeUtleSAhPSBudWxsICYmIHByaW1hcnlLZXkuZUlzUHJveHkoKSkgeyAKLSAgICAgICAgICBKYXZhQ2xhc3Mgb2xkUHJpbWFyeUtleSA9IHByaW1hcnlLZXk7IAotICAgICAgICAgIEphdmFDbGFzcyByZXNvbHZlZCA9IChKYXZhQ2xhc3MpRWNvcmVVdGlsLnJlc29sdmUocHJpbWFyeUtleSwgdGhpcyk7IAotICAgICAgICAgIHJlc29sdmVkKHRoaXMucHJpbWFyeUtleSwgcmVzb2x2ZWQpOwotICAgICAgICAgIHRoaXMucHJpbWFyeUtleSA9IHJlc29sdmVkOwotICAgICAgICAgIGlmIChwcmltYXJ5S2V5ICE9IG9sZFByaW1hcnlLZXkpIHsgCi0gICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSAKLSAgICAgICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUywgb2xkUHJpbWFyeUtleSwgcHJpbWFyeUtleSkpOyAKLSAgICAgICAgICB9IAotICAgICAgIH0gCi0gICAgICAgcmV0dXJuIHByaW1hcnlLZXk7IAotICAgIH0gCi0gCi0gICAgICAgICAKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXkoSmF2YUNsYXNzIG5ld1ByaW1hcnlLZXkpIHsKLQkJSmF2YUNsYXNzIG9sZFByaW1hcnlLZXkgPSBwcmltYXJ5S2V5OwotCQlwcmltYXJ5S2V5ID0gbmV3UHJpbWFyeUtleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRJVFlfX1BSSU1BUllfS0VZLCBvbGRQcmltYXJ5S2V5LCBwcmltYXJ5S2V5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5UOgotCQkJCXJldHVybiBpc1JlZW50cmFudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1BSSU1BUllfS0VZOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UHJpbWFyeUtleSgpOwotCQkJCXJldHVybiBiYXNpY0dldFByaW1hcnlLZXkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5UOgotCQkJCXNldFJlZW50cmFudCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlzZXRQcmltYXJ5S2V5KChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRUVOVFJBTlQ6Ci0JCQkJdW5zZXRSZWVudHJhbnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlzZXRQcmltYXJ5S2V5KChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRUVOVFJBTlQ6Ci0JCQkJcmV0dXJuIGlzU2V0UmVlbnRyYW50KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlyZXR1cm4gcHJpbWFyeUtleSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVlbnRyYW50OiAiKTsKLQkJaWYgKHJlZW50cmFudEVTZXQpIHJlc3VsdC5hcHBlbmQocmVlbnRyYW50KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZAotCSAqIGZvciBhbiBlbnRpdHkgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIFRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUKLQkgKiBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZCBpbiB0aGUgY21wLWZpZWxkCi0JICogZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLiAKLQkgKiBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5IGtleSBtYXBzIHRvIG11bHRpcGxlCi0JICogY29udGFpbmVyLW1hbmFnZWQgZmllbGRzIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZQotCSAqIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIGFuZCB0aGVpciBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgCi0JICogdG8gdGhlIGZpZWxkIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuCi0JICogRXhhbXBsZXM6PHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8Ly9wcmltLWtleS1jbGFzcz4KLQkgKiAJPHByaW0ta2V5LWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZUlEPC8vcHJpbS1rZXktY2xhc3M+Ci0JICogCTxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuT2JqZWN0PC8vcHJpbS1rZXktY2xhc3M+Ci0KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFByaW1hcnlLZXlHZW4oKSB7Ci0JCWlmIChwcmltYXJ5S2V5ICE9IG51bGwgJiYgcHJpbWFyeUtleS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJpbWFyeUtleSA9IChJbnRlcm5hbEVPYmplY3QpcHJpbWFyeUtleTsKLQkJCXByaW1hcnlLZXkgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkUHJpbWFyeUtleSk7Ci0JCQlpZiAocHJpbWFyeUtleSAhPSBvbGRQcmltYXJ5S2V5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5FTlRJVFlfX1BSSU1BUllfS0VZLCBvbGRQcmltYXJ5S2V5LCBwcmltYXJ5S2V5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByaW1hcnlLZXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiBwcmltYXJ5S2V5OwotCX0KLQotfQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FeGNsdWRlTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0V4Y2x1ZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzhkYmEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0V4Y2x1ZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBUaGUgZXhjbHVkZSBsaXN0IGVsZW1lbnQgZGVmaW5lcyBhIHNldCBvZiBtZXRob2RzIHdoaWNoIHRoZSBBc3NlbWJsZXIgbWFya3MgdG8gYmUgdW5jYWxsYWJsZS4gSXQgY29udGFpbnMgb25lIG9yIG1vcmUgbWV0aG9kcy4KLSAqIAotICogSWYgdGhlIG1ldGhvZCBwZXJtaXNzaW9uIHJlbGF0aW9uIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBhcmUgaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIG11c3QgY29uc2lkZXIgdGhvc2UgbWV0aG9kcyB0byBiZSB1bmNhbGxhYmxlLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhjbHVkZUxpc3RJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgRXhjbHVkZUxpc3QgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RFbGVtZW50cyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIEV4Y2x1ZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVYQ0xVREVfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXRob2RFbGVtZW50cygpIHsKLQkJaWYgKG1ldGhvZEVsZW1lbnRzID09IG51bGwpIHsKLQkJCW1ldGhvZEVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1ldGhvZEVsZW1lbnQuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlnZXRNZXRob2RFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRzICE9IG51bGwgJiYgIW1ldGhvZEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlpZiAoYW5FSkIgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBlbGVtZW50cyA9IGdldE1ldGhvZEVsZW1lbnRzKCk7Ci0JCU1ldGhvZEVsZW1lbnQgbWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChhbkVKQi5lcXVhbHMobWUuZ2V0RW50ZXJwcmlzZUJlYW4oKSkpCi0JCQkJcmVzdWx0LmFkZChtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0tleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0tleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0MzZjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9LZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIGtleUF0dHJpYnV0ZXMgKHRoaXMgaW5jbHVkZXMgaW5oZXJpdGVkIAotICoga2V5IGF0dHJpYnV0ZXMpIGZyb20gdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gdGhhdCBpcyBwYXNzZWQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IGtleSBhdHRyaWJ1dGUgdGhhdCBpcyBub3QgcG9pbnRlZCB0byBieSBhbiBFamJSZWxhdGlvbnNoaXBSb2xlLgotICogVGh1cywgdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBjb250YWluIGtleSBhdHRyaWJ1dGVzIChpbmNsdWRpbmcgaW5oZXJpdGVkIGtleSBhdHRyaWJ1dGVzKSB0aGF0IG9ubHkKLSAqIGJlbG9uZyB0byByb2xlcy4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDc6MjM6MjIgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBLZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBLZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LgotICovCi1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlUm9sZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQlyZXR1cm4gY21wLmdldEZpbHRlcmVkRmVhdHVyZXMoS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlci5zaW5nbGV0b24oKSk7Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDU6MzY6MDAgUE0pCi0gKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuS2V5UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlcgotICovCi1wdWJsaWMgc3RhdGljIEtleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uKCkgewotCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJc2luZ2xldG9uID0gbmV3IEtleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIoKTsKLQlyZXR1cm4gc2luZ2xldG9uOwotfQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmN2NiNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIHJlbGF0aW9uc2hpcFJvbGVzICh0aGlzIGluY2x1ZGVzCi0gKiBpbmhlcml0ZWQgRWpiUmVsYXRpb25zaGlwUm9sZXMpIGZyb20gdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24KLSAqIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLiBJdCB3aWxsIHJlbW92ZSBhbnkKLSAqIEVqYlJlbGF0aW9uc2hpcFJvbGUgdGhhdCBpcyBub3QgcGFydCBvZiB0aGUga2V5LiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMAotICogNzoxNDo1NyBQTSkgQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlciBleHRlbmRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlciBzaW5nbGV0b247Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJOb3RjYWNoZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLSAgICAgICAgTGlzdCBrZXlSb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBnZXRSZWxhdGlvbnNoaXBSb2xlcyhjbXApLml0ZXJhdG9yKCk7Ci0gICAgICAgIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgcm9sZSA9IChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocm9sZS5pc0tleSgpKSBrZXlSb2xlcy5hZGQocm9sZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGtleVJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNzoxNTozNwotICAgICAqIFBNKQotICAgICAqIAotICAgICAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBLZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIHNpbmdsZXRvbigpIHsKLSAgICAgICAgaWYgKHNpbmdsZXRvbiA9PSBudWxsKSBzaW5nbGV0b24gPSBuZXcgS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlcigpOwotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsS2V5QXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbEtleUF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDgwYmZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIGtleUF0dHJpYnV0ZXMgZnJvbSB0aGUgCi0gKiBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IGtleVBlcnNpc3RlbnRBdHRyaWJ1dGVzIHRoYXQgYXJlIGluaGVyaXRlZCBieSBhbnkgc3VwZXJ0eXBlcy4KLSAqIFRoYXQgbWVhbnMgdGhlIHJldHVybmVkIGxpc3Qgb2YgQ01QQXR0cmlidXRlcyB3aWxsIGJlIGtleSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBkZWZpbmVkIGxvY2FsbHkKLSAqIGZvciB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBoZWxkIGJ5IHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHBsdXMga2V5IGF0dHJpYnV0ZXMKLSAqIHRoYXQgd2VyZSBhZGRlZCBmcm9tIEVqYlJlbGF0aW9uc2hpcFJvbGVzIHRoYXQgYXJlIGhlbGQgYnkgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24uCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA2OjI0OjMzIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxLZXlBdHRyaWJ1dGVGaWx0ZXIgZXh0ZW5kcyBTdXBlcnR5cGVDTVBBdHRyaWJ1dGVGaWx0ZXIgewotCXByaXZhdGUgc3RhdGljIExvY2FsS2V5QXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LgotICovCi1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlQXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCXJldHVybiBuZXcgQXJyYXlMaXN0KGNtcC5nZXRLZXlBdHRyaWJ1dGVzKCkpOwotfQotLyoqCi0gKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbkF0dHJpYnV0ZSBhbHNvIGV4aXN0cyBpbiB0aGUgc3VwZXJFbnRpdHkuCi0gKiBGb3IgdGhpcyBmaWx0ZXIsIG9ubHkgdGhlIG5hbWUgaGFzIHRvIGJlIHRoZSBzYW1lLgotICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cGVydHlwZUF0dHJpYnV0ZShDb250YWluZXJNYW5hZ2VkRW50aXR5IHN1cGVyRW50aXR5LCBDTVBBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpIHsKLQlDTVBBdHRyaWJ1dGUgZm91bmQgPSBzdXBlckVudGl0eS5nZXRLZXlBdHRyaWJ1dGUoYW5BdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQlyZXR1cm4gZm91bmQgIT0gbnVsbDsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNTozNjowMCBQTSkKLSAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5Mb2NhbEtleUF0dHJpYnV0ZUZpbHRlcgotICovCi1wdWJsaWMgc3RhdGljIExvY2FsS2V5QXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbigpIHsKLQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCXNpbmdsZXRvbiA9IG5ldyBMb2NhbEtleUF0dHJpYnV0ZUZpbHRlcigpOwotCXJldHVybiBzaW5nbGV0b247Ci19Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODk1MzVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIHJldHVybiBhIHN1YnNldCBvZiB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZXMgZnJvbSB0aGUKLSAqIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gdGhhdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIGZpbHRlcgotICogbWV0aG9kLiBJdCB3aWxsIHJlbW92ZSBhbnkgaW5oZXJpdGVkIHBlcnNpc3RlbnRBdHRyaWJ1dGVzIGFuZCBhbnkKLSAqIHBlcnNpc3RlbnRBdHRyaWJ1dGVzIHRoYXQgYXJlIGhlbGQgYnkgRWpiUmVsYXRpb25zaGlwUm9sZSBvYmplY3RzIChpbmNsdWRpbmcKLSAqIGluaGVyaXRlZCBFamJSZWxhdGlvbnNoaXBSb2xlIGF0dHJpYnV0ZXMpLiBUaGF0IG1lYW5zIHRoZSByZXR1cm5lZCBsaXN0IG9mCi0gKiBDTVBBdHRyaWJ1dGVzIHdpbGwgYmUgYXR0cmlidXRlcyB0aGF0IHdlcmUgZGVmaW5lZCBsb2NhbGx5IG1pbnVzIGFsbAotICogaW5oZXJpdGVkIGF0dHJpYnV0ZXMgYW5kIG1pbnVzIGFueSBhdHRyaWJ1dGVzIHBvaW50ZWQgdG8gYnkKLSAqIEVqYlJlbGF0aW9uc2hpcFJvbGVzLCB0aHVzIHRoZSBhdHRyaWJ1dGVzIHdpbGwgb25seSBiZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZQotICogZGVmaW5lZCBsb2NhbGx5IGJ5IHRoZSB1c2VyLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA3OjMxOjQyIFBNKSBAYXV0aG9yOgotICogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgZXh0ZW5kcyBTdXBlcnR5cGVDTVBBdHRyaWJ1dGVGaWx0ZXIgewotCXByaXZhdGUgc3RhdGljIExvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb3BlciBsaXN0IG9mIGF0dHJpYnV0ZXMgZnJvbSBjbXBFeHQuIFJldHVybiBsb2NhbAotCSAqIGF0dHJpYnV0ZXMgbWludXMgdGhvc2UgYWRkZWQgZHVlIHRvIFJlbGF0aW9uc2hpcCBSb2xlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlQXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlqYXZhLnV0aWwuTGlzdCBsb2NhbCA9IG51bGwsIGxvY2FsUm9sZUF0dHJpYnV0ZXM7IAotCQlsb2NhbCA9IGNtcC5nZXRGaWx0ZXJlZEZlYXR1cmVzKExvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5zaW5nbGV0b24oKSk7Ci0JCWxvY2FsUm9sZUF0dHJpYnV0ZXMgPSBjbXAuZ2V0RmlsdGVyZWRGZWF0dXJlcyhMb2NhbFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuc2luZ2xldG9uKCkpOwotCQlpZihsb2NhbCAhPSBudWxsKQotCQkgIGxvY2FsLnJlbW92ZUFsbChsb2NhbFJvbGVBdHRyaWJ1dGVzKTsKLQkJcmV0dXJuIGxvY2FsOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbkF0dHJpYnV0ZSBhbHNvIGV4aXN0cyBpbiB0aGUKLQkgKiBzdXBlckVudGl0eS4gRm9yIHRoaXMgZmlsdGVyLCBvbmx5IHRoZSBuYW1lIGhhcyB0byBiZSB0aGUgc2FtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cGVydHlwZUF0dHJpYnV0ZShDb250YWluZXJNYW5hZ2VkRW50aXR5IHN1cGVyRW50aXR5LCBDTVBBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpIHsKLQkJQ01QQXR0cmlidXRlIGZvdW5kID0gc3VwZXJFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhbkF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlyZXR1cm4gZm91bmQgIT0gbnVsbDsKLQl9Ci0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA1OjM2OjAwCi0JICogUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmVqYmV4dC5pbXBsLkxvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXNpbmdsZXRvbiA9IG5ldyBMb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlcigpOwotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsT3Bwb3NpdGVSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmFkMzc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsT3Bwb3NpdGVSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLQotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIHJldHVybiBhIHN1YnNldCBvZiB0aGUgcmVsYXRpb25zaGlwUm9sZXMgKHRoaXMgaW5jbHVkZXMKLSAqIGluaGVyaXRlZCBFamJSZWxhdGlvbnNoaXBSb2xlcykgZnJvbSB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbgotICogdGhhdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIGZpbHRlciBtZXRob2QuIEl0IHdpbGwgcmVtb3ZlIGFueQotICogRWpiUmVsYXRpb25zaGlwUm9sZSB0aGF0IGlzIGluaGVyaXRlZCBhbmQgaXQgd2lsbCByZXR1cm4gdGhlIG9wcG9zaXRlIHJvbGUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA3OjE0OjU3IFBNKSBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlciBleHRlbmRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxPcHBvc2l0ZVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgc2luZ2xldG9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgTGlzdCB3aXRoIHRoZSBvcHBvc2l0ZSByb2xlcyBmb3IgdGhlIGxvY2FsIHJlbGF0aW9uc2hpcCByb2xlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJOb3RjYWNoZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLSAgICAgICAgTGlzdCBvcHBvc2l0ZVJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGdldExvY2FsUmVsYXRpb25zaGlwUm9sZXMoY21wKS5pdGVyYXRvcigpOwotICAgICAgICBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGUsIG9wcG9zaXRlOwotICAgICAgICB3aGlsZSAoaXQgIT0gbnVsbCAmJiBpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgaXQubmV4dCgpOwotICAgICAgICAgICAgb3Bwb3NpdGUgPSByb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCk7Ci0gICAgICAgICAgICBpZiAob3Bwb3NpdGUgIT0gbnVsbCkgb3Bwb3NpdGVSb2xlcy5hZGQob3Bwb3NpdGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcHBvc2l0ZVJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNzoxNTozNwotICAgICAqIFBNKQotICAgICAqIAotICAgICAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5Mb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxPcHBvc2l0ZVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgc2luZ2xldG9uKCkgewotICAgICAgICBpZiAoc2luZ2xldG9uID09IG51bGwpIHNpbmdsZXRvbiA9IG5ldyBMb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlcigpOwotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzU1YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLQotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIHJldHVybiBhIHN1YnNldCBvZiB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZXMgZnJvbSB0aGUgCi0gKiBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IHBlcnNpc3RlbnRBdHRyaWJ1dGVzIHRoYXQgYXJlIGluaGVyaXRlZCBieSBhbnkgc3VwZXJ0eXBlcy4KLSAqIFRoYXQgbWVhbnMgdGhlIHJldHVybmVkIGxpc3Qgb2YgQ01QQXR0cmlidXRlcyB3aWxsIGJlIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGRlZmluZWQgbG9jYWxseQotICogZm9yIHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5IGhlbGQgYnkgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gcGx1cyBhdHRyaWJ1dGVzCi0gKiB0aGF0IHdlcmUgYWRkZWQgZnJvbSBFamJSZWxhdGlvbnNoaXBSb2xlcyB0aGF0IGFyZSBoZWxkIGJ5IHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNTozNTowMyBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIExvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBleHRlbmRzIFN1cGVydHlwZUNNUEF0dHJpYnV0ZUZpbHRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LgotICovCi1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlQXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCXJldHVybiBuZXcgQXJyYXlMaXN0KGNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpKTsKLX0KLS8qKgotICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYW5BdHRyaWJ1dGUgYWxzbyBleGlzdHMgaW4gdGhlIHN1cGVyRW50aXR5LgotICogRm9yIHRoaXMgZmlsdGVyLCBvbmx5IHRoZSBuYW1lIGhhcyB0byBiZSB0aGUgc2FtZS4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBlcnR5cGVBdHRyaWJ1dGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBzdXBlckVudGl0eSwgQ01QQXR0cmlidXRlIGFuQXR0cmlidXRlKSB7Ci0JQ01QQXR0cmlidXRlIGZvdW5kID0gc3VwZXJFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhbkF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCXJldHVybiBmb3VuZCAhPSBudWxsOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA1OjM2OjAwIFBNKQotICogQHJldHVybiBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmVqYmV4dC5pbXBsLkxvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlcgotICovCi1wdWJsaWMgc3RhdGljIExvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyKCk7Ci0JcmV0dXJuIHNpbmdsZXRvbjsKLX0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzllZTIxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGVzIGZyb20gdGhlIAotICogQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbiB0aGF0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgZmlsdGVyIG1ldGhvZC4KLSAqIEl0IHdpbGwgcmVtb3ZlIGFueSBhdHRyaWJ1dGUgdGhhdCBpcyBub3QgcG9pbnRlZCB0byBieSBhbiBFamJSZWxhdGlvbnNoaXBSb2xlIGFuZAotICogaXQgd2lsbCBmdXJ0aGVyIHJlbW92ZSBhdHRyaWJ1dGVzIHBvaW50ZWQgdG8gYnkgaW5oZXJpdGVkIEVqYlJlbGF0aW9uc2hpcFJvbGVzLgotICogVGh1cywgdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBjb250YWluIGF0dHJpYnV0ZXMgdGhhdCBvbmx5IGJlbG9uZyB0byBsb2NhbAotICogRWpiUmVsYXRpb25zaGlwUm9sZXMgKG5vdCBpbmNsdWRpbmcgaWhlcml0ZWQgcm9sZXMpLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNjo0NjowOCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIExvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciBleHRlbmRzIEFic3RyYWN0UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiByb2xlcyBmcm9tIGNtcEV4dC4KLSAqLwotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNvdXJjZVJvbGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0gICByZXR1cm4gZ2V0UmVsYXRpb25zaGlwUm9sZXMoY21wKTsgCi19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDU6MzY6MDAgUE0pCi0gKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyCi0gKi8KLXB1YmxpYyBzdGF0aWMgTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbigpIHsKLQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCXNpbmdsZXRvbiA9IG5ldyBMb2NhbFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIoKTsKLQlyZXR1cm4gc2luZ2xldG9uOwotfQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbFJlbGF0aW9uc2hpcFJvbGVLZXlBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsUmVsYXRpb25zaGlwUm9sZUtleUF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWE1YjdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsUmVsYXRpb25zaGlwUm9sZUtleUF0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIExvY2FsUmVsYXRpb25zaGlwUm9sZUtleUF0dHJpYnV0ZUZpbHRlciBleHRlbmRzIExvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBMb2NhbFJlbGF0aW9uc2hpcFJvbGVLZXlBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uOwotCi1wdWJsaWMgc3RhdGljIExvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgTG9jYWxSZWxhdGlvbnNoaXBSb2xlS2V5QXR0cmlidXRlRmlsdGVyKCk7Ci0JcmV0dXJuIHNpbmdsZXRvbjsKLX0KLQotLyoqCi0gKiBmaWx0ZXIgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBMaXN0IGZpbHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCUxpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlJdGVyYXRvciBpdCA9IGdldFNvdXJjZVJvbGVzKGNtcCkuaXRlcmF0b3IoKTsKLQlDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGU7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQlyb2xlID0gKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpIGl0Lm5leHQoKTsKLQkJaWYgKHJvbGUuaXNLZXkoKSkKLQkJCWF0dHJpYnV0ZXMuYWRkQWxsKHJvbGUuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0JcmV0dXJuIGF0dHJpYnV0ZXM7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZWYwMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5EZXN0aW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQ7Ci0KLS8qKgotICogVGhlIG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uIGVsZW1lbnQgcHJvdmlkZXMgYWR2aWNlIHRvIHRoZSBEZXBsb3llciBhcyB0byB3aGV0aGVyIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiBpcyBpbnRlbmRlZCBmb3IgYSBRdWV1ZSBvciBhIFRvcGljLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW50ZW5kZWQgZGVzdGluYXRpb24gYW5kIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHdoZXRoZXIgYSBkdXJhYmxlIG9yIG5vbi1kdXJhYmxlIHN1YnNjcmlwdGlvbiBzaG91bGQgYmUgdXNlZCBpZiB0aGUgZGVzdGluYXRpb24tdHlwZSBpcyBqYXZheC5qbXMuVG9waWMuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVzdGluYXRpb25UeXBlIFRZUEVfRURFRkFVTFQgPSBEZXN0aW5hdGlvblR5cGUuUVVFVUVfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEZXN0aW5hdGlvblR5cGUgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSA8ZW0+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFlfRURFRkFVTFQgPSBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5EVVJBQkxFX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eSA9IFNVQlNDUklQVElPTl9EVVJBQklMSVRZX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3Vic2NyaXB0aW9uIER1cmFiaWxpdHkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBKTVMgZGVzdGluYXRpb24uIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotCSAqIAotCSAqIFRoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IGphdmF4Lmptcy5RdWV1ZSwgamF2YXguam1zLlRvcGljCi0JICovCi0JcHVibGljIERlc3RpbmF0aW9uVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKERlc3RpbmF0aW9uVHlwZSBuZXdUeXBlKSB7Ci0JCURlc3RpbmF0aW9uVHlwZSBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRSwgb2xkVHlwZSwgdHlwZSwgIW9sZFR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRUeXBlKCkgewotCQlEZXN0aW5hdGlvblR5cGUgb2xkVHlwZSA9IHR5cGU7Ci0JCWJvb2xlYW4gb2xkVHlwZUVTZXQgPSB0eXBlRVNldDsKLQkJdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0JCXR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRSwgb2xkVHlwZSwgVFlQRV9FREVGQVVMVCwgb2xkVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIEpNUyB0b3BpYyBzdWJzY3JpcHRpb24gaXMgaW50ZW5kZWQgdG8gYmUgZHVyYWJsZSBvciBub25kdXJhYmxlLgotCSAqIAotCSAqIFRoZSBzdWJzY3JpcHRpb24tZHVyYWJpbGl0eSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiAgRHVyYWJsZSwgTm9uRHVyYWJsZQotCi0JICovCi0JcHVibGljIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIGdldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSB7Ci0JCXJldHVybiBzdWJzY3JpcHRpb25EdXJhYmlsaXR5OwotCX0KLQotCS8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZCBOT1QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIG5ld1N1YnNjcmlwdGlvbkR1cmFiaWxpdHkpIHsKLSAgICAJU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgb2xkU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSA9IHN1YnNjcmlwdGlvbkR1cmFiaWxpdHk7Ci0gICAgCXN1YnNjcmlwdGlvbkR1cmFiaWxpdHkgPSBuZXdTdWJzY3JpcHRpb25EdXJhYmlsaXR5ID09IG51bGwgPyBudWxsIDogbmV3U3Vic2NyaXB0aW9uRHVyYWJpbGl0eTsKLSAgICAJYm9vbGVhbiBvbGRTdWJzY3JpcHRpb25EdXJhYmlsaXR5RVNldCA9IHN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0OwotICAgIAlzdWJzY3JpcHRpb25EdXJhYmlsaXR5RVNldCA9IHRydWU7Ci0gICAgCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1NVQlNDUklQVElPTl9EVVJBQklMSVRZLCBvbGRTdWJzY3JpcHRpb25EdXJhYmlsaXR5LCBzdWJzY3JpcHRpb25EdXJhYmlsaXR5LCAhb2xkU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQpKTsKLSAgICB9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSB7Ci0JCVN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIG9sZFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkgPSBzdWJzY3JpcHRpb25EdXJhYmlsaXR5OwotCQlib29sZWFuIG9sZFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0ID0gc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQ7Ci0JCXN1YnNjcmlwdGlvbkR1cmFiaWxpdHkgPSBTVUJTQ1JJUFRJT05fRFVSQUJJTElUWV9FREVGQVVMVDsKLQkJc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19TVUJTQ1JJUFRJT05fRFVSQUJJTElUWSwgb2xkU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSwgU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFlfRURFRkFVTFQsIG9sZFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCkgewotCQlyZXR1cm4gc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIE1lc3NhZ2VEcml2ZW4gZ2V0QmVhbigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoTWVzc2FnZURyaXZlbillQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QmVhbihNZXNzYWdlRHJpdmVuIG5ld0JlYW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0JlYW4sIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4sIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCZWFuKE1lc3NhZ2VEcml2ZW4gbmV3QmVhbikgewotCQlpZiAobmV3QmVhbiAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOICYmIG5ld0JlYW4gIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdCZWFuKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3QmVhbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCZWFuKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTiwgTWVzc2FnZURyaXZlbi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCZWFuKG5ld0JlYW4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTiwgbmV3QmVhbiwgbmV3QmVhbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QmVhbigoTWVzc2FnZURyaXZlbilvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRCZWFuKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT04sIE1lc3NhZ2VEcml2ZW4uY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFk6Ci0JCQkJcmV0dXJuIGdldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlyZXR1cm4gZ2V0QmVhbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZSgoRGVzdGluYXRpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1NVQlNDUklQVElPTl9EVVJBQklMSVRZOgotCQkJCXNldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU46Ci0JCQkJc2V0QmVhbigoTWVzc2FnZURyaXZlbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRToKLQkJCQl1bnNldFR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1NVQlNDUklQVElPTl9EVVJBQklMSVRZOgotCQkJCXVuc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlzZXRCZWFuKChNZXNzYWdlRHJpdmVuKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19UWVBFOgotCQkJCXJldHVybiBpc1NldFR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFk6Ci0JCQkJcmV0dXJuIGlzU2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOOgotCQkJCXJldHVybiBnZXRCZWFuKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlpZiAodHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHk6ICIpOwotCQlpZiAoc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQpIHJlc3VsdC5hcHBlbmQoc3Vic2NyaXB0aW9uRHVyYWJpbGl0eSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWVzc2FnZURyaXZlbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxZGE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWNrbm93bGVkZ2VNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRHJpdmVuSW1wbCBleHRlbmRzIEVudGVycHJpc2VCZWFuSW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VEcml2ZW4gewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zYWN0aW9uVHlwZSgpIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25UeXBlIFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQgPSBUcmFuc2FjdGlvblR5cGUuQkVBTl9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uVHlwZSB0cmFuc2FjdGlvblR5cGUgPSBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHJhbnNhY3Rpb24gVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNhY3Rpb25UeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VTZWxlY3RvcigpIDxlbT5NZXNzYWdlIFNlbGVjdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlU2VsZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfU0VMRUNUT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlU2VsZWN0b3IgPSBNRVNTQUdFX1NFTEVDVE9SX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2tub3dsZWRnZU1vZGUoKSA8ZW0+QWNrbm93bGVkZ2UgTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNrbm93bGVkZ2VNb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFja25vd2xlZGdlTW9kZSBBQ0tOT1dMRURHRV9NT0RFX0VERUZBVUxUID0gQWNrbm93bGVkZ2VNb2RlLkFVVE9fQUNLTk9XTEVER0VfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBBY2tub3dsZWRnZU1vZGUgYWNrbm93bGVkZ2VNb2RlID0gQUNLTk9XTEVER0VfTU9ERV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFja25vd2xlZGdlIE1vZGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFja25vd2xlZGdlTW9kZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rKCkgPGVtPkxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGluaygpIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpbmsgPSBMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBkZXN0aW5hdGlvbiA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2YXRpb25Db25maWcgYWN0aXZhdGlvbkNvbmZpZyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb24oKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIG1lc3NhZ2VEZXN0aW5hdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdpbmdUeXBlKCkgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIG1lc3NhZ2luZ1R5cGUgPSBudWxsOwotCi0JcHVibGljIE1lc3NhZ2VEcml2ZW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuTUVTU0FHRV9EUklWRU47Ci0JfQotCi1wdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2VEcml2ZW4oKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotCSAqIAotCSAqIFRoZSB0cmFuc2FjdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IEJlYW4sIENvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUgbmV3VHJhbnNhY3Rpb25UeXBlKSB7Ci0JCVRyYW5zYWN0aW9uVHlwZSBvbGRUcmFuc2FjdGlvblR5cGUgPSB0cmFuc2FjdGlvblR5cGU7Ci0JCXRyYW5zYWN0aW9uVHlwZSA9IG5ld1RyYW5zYWN0aW9uVHlwZSA9PSBudWxsID8gVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCA6IG5ld1RyYW5zYWN0aW9uVHlwZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblR5cGVFU2V0ID0gdHJhbnNhY3Rpb25UeXBlRVNldDsKLQkJdHJhbnNhY3Rpb25UeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEUsIG9sZFRyYW5zYWN0aW9uVHlwZSwgdHJhbnNhY3Rpb25UeXBlLCAhb2xkVHJhbnNhY3Rpb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlUcmFuc2FjdGlvblR5cGUgb2xkVHJhbnNhY3Rpb25UeXBlID0gdHJhbnNhY3Rpb25UeXBlOwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cmFuc2FjdGlvblR5cGVFU2V0OwotCQl0cmFuc2FjdGlvblR5cGUgPSBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUOwotCQl0cmFuc2FjdGlvblR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fVFJBTlNBQ1RJT05fVFlQRSwgb2xkVHJhbnNhY3Rpb25UeXBlLCBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvblR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBtZXNzYWdlLXNlbGVjdG9yIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBKTVMgbWVzc2FnZQotCSAqIHNlbGVjdG9yIHRvIGJlIHVzZWQgaW4gZGV0ZXJtaW5pbmcgd2hpY2ggbWVzc2FnZXMgYSBtZXNzYWdlLWRyaXZlbgotCSAqIGJlYW4gaXMgdG8gcmVjZWl2ZS4KLQkgKiAKLQkgKiBFeGFtcGxlIHZhbHVlOiAKLQkgKiBKTVNUeXBlID0gYGNhcicgQU5EIGNvbG9yID0gYGJsdWUnIEFORCB3ZWlnaHQgPiAyNTAwCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VTZWxlY3RvcigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VTZWxlY3RvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlU2VsZWN0b3IoU3RyaW5nIG5ld01lc3NhZ2VTZWxlY3RvcikgewotCQlTdHJpbmcgb2xkTWVzc2FnZVNlbGVjdG9yID0gbWVzc2FnZVNlbGVjdG9yOwotCQltZXNzYWdlU2VsZWN0b3IgPSBuZXdNZXNzYWdlU2VsZWN0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfU0VMRUNUT1IsIG9sZE1lc3NhZ2VTZWxlY3RvciwgbWVzc2FnZVNlbGVjdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGFja25vd2xlZGdtZW50IG1vZGUgZm9yIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIGlmIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBpcyB1c2VkIChpZS4gc2VsZi50cmFuc2FjdGlvblR5cGUgPSBCZWFuKQotCSAqIAotCSAqIFRoZSBhY2tub3dsZWRnZS1tb2RlIHNwZWNpZmllcyB3aGV0aGVyIEpNUyBBVVRPX0FDS05PV0xFREdFIG9yIERVUFNfT0tfQUNLTk9XTEVER0UgbWVzc2FnZSBhY2tub3dsZWRnbWVudCBzZW1hbnRpY3Mgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBvbk1lc3NhZ2UgbWVzc2FnZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdGhhdCB1c2VzIGJlYW4gbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4KLQkgKiAKLQkgKiBUaGUgYWNrbm93bGVkZ2UtbW9kZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogIEF1dG8tYWNrbm93bGVkZ2UsIER1cHMtb2stYWNrbm93bGVkZ2UKLQotCSAqLwotCXB1YmxpYyBBY2tub3dsZWRnZU1vZGUgZ2V0QWNrbm93bGVkZ2VNb2RlKCkgewotCQlyZXR1cm4gYWNrbm93bGVkZ2VNb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFja25vd2xlZGdlTW9kZShBY2tub3dsZWRnZU1vZGUgbmV3QWNrbm93bGVkZ2VNb2RlKSB7Ci0JCUFja25vd2xlZGdlTW9kZSBvbGRBY2tub3dsZWRnZU1vZGUgPSBhY2tub3dsZWRnZU1vZGU7Ci0JCWFja25vd2xlZGdlTW9kZSA9IG5ld0Fja25vd2xlZGdlTW9kZSA9PSBudWxsID8gQUNLTk9XTEVER0VfTU9ERV9FREVGQVVMVCA6IG5ld0Fja25vd2xlZGdlTW9kZTsKLQkJYm9vbGVhbiBvbGRBY2tub3dsZWRnZU1vZGVFU2V0ID0gYWNrbm93bGVkZ2VNb2RlRVNldDsKLQkJYWNrbm93bGVkZ2VNb2RlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDS05PV0xFREdFX01PREUsIG9sZEFja25vd2xlZGdlTW9kZSwgYWNrbm93bGVkZ2VNb2RlLCAhb2xkQWNrbm93bGVkZ2VNb2RlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QWNrbm93bGVkZ2VNb2RlKCkgewotCQlBY2tub3dsZWRnZU1vZGUgb2xkQWNrbm93bGVkZ2VNb2RlID0gYWNrbm93bGVkZ2VNb2RlOwotCQlib29sZWFuIG9sZEFja25vd2xlZGdlTW9kZUVTZXQgPSBhY2tub3dsZWRnZU1vZGVFU2V0OwotCQlhY2tub3dsZWRnZU1vZGUgPSBBQ0tOT1dMRURHRV9NT0RFX0VERUZBVUxUOwotCQlhY2tub3dsZWRnZU1vZGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNLTk9XTEVER0VfTU9ERSwgb2xkQWNrbm93bGVkZ2VNb2RlLCBBQ0tOT1dMRURHRV9NT0RFX0VERUZBVUxULCBvbGRBY2tub3dsZWRnZU1vZGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBY2tub3dsZWRnZU1vZGUoKSB7Ci0JCXJldHVybiBhY2tub3dsZWRnZU1vZGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBpbnRlbmRlZCBkZXN0aW5hdGlvbiB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi0JICovCi0JcHVibGljIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBnZXREZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIGRlc3RpbmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERlc3RpbmF0aW9uKE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBuZXdEZXN0aW5hdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gb2xkRGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQkJZGVzdGluYXRpb24gPSBuZXdEZXN0aW5hdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT04sIG9sZERlc3RpbmF0aW9uLCBuZXdEZXN0aW5hdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb24oTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIG5ld0Rlc3RpbmF0aW9uKSB7Ci0JCWlmIChuZXdEZXN0aW5hdGlvbiAhPSBkZXN0aW5hdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGVzdGluYXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4sIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3RGVzdGluYXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGVzdGluYXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4sIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXREZXN0aW5hdGlvbihuZXdEZXN0aW5hdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTiwgbmV3RGVzdGluYXRpb24sIG5ld0Rlc3RpbmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2YXRpb25Db25maWcgZ2V0QWN0aXZhdGlvbkNvbmZpZygpIHsKLQkJcmV0dXJuIGFjdGl2YXRpb25Db25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG5ld0FjdGl2YXRpb25Db25maWcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQWN0aXZhdGlvbkNvbmZpZyBvbGRBY3RpdmF0aW9uQ29uZmlnID0gYWN0aXZhdGlvbkNvbmZpZzsKLQkJYWN0aXZhdGlvbkNvbmZpZyA9IG5ld0FjdGl2YXRpb25Db25maWc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHLCBvbGRBY3RpdmF0aW9uQ29uZmlnLCBuZXdBY3RpdmF0aW9uQ29uZmlnKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcgbmV3QWN0aXZhdGlvbkNvbmZpZykgewotCQlpZiAobmV3QWN0aXZhdGlvbkNvbmZpZyAhPSBhY3RpdmF0aW9uQ29uZmlnKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY3RpdmF0aW9uQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjdGl2YXRpb25Db25maWcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ1RJVkFUSU9OX0NPTkZJRywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWN0aXZhdGlvbkNvbmZpZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY3RpdmF0aW9uQ29uZmlnKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWN0aXZhdGlvbkNvbmZpZyhuZXdBY3RpdmF0aW9uQ29uZmlnLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHLCBuZXdBY3RpdmF0aW9uQ29uZmlnLCBuZXdBY3RpdmF0aW9uQ29uZmlnKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRNZXNzYWdlRGVzdGluYXRpb24oKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb24gIT0gbnVsbCAmJiBtZXNzYWdlRGVzdGluYXRpb24uZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZE1lc3NhZ2VEZXN0aW5hdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpbWVzc2FnZURlc3RpbmF0aW9uOwotCQkJbWVzc2FnZURlc3RpbmF0aW9uID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZE1lc3NhZ2VEZXN0aW5hdGlvbik7Ci0JCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uICE9IG9sZE1lc3NhZ2VEZXN0aW5hdGlvbikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT04sIG9sZE1lc3NhZ2VEZXN0aW5hdGlvbiwgbWVzc2FnZURlc3RpbmF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0TWVzc2FnZURlc3RpbmF0aW9uKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvbihKYXZhQ2xhc3MgbmV3TWVzc2FnZURlc3RpbmF0aW9uKSB7Ci0JCUphdmFDbGFzcyBvbGRNZXNzYWdlRGVzdGluYXRpb24gPSBtZXNzYWdlRGVzdGluYXRpb247Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvbiA9IG5ld01lc3NhZ2VEZXN0aW5hdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9ERVNUSU5BVElPTiwgb2xkTWVzc2FnZURlc3RpbmF0aW9uLCBtZXNzYWdlRGVzdGluYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmsoKSB7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIG5ld0xpbmspIHsKLQkJU3RyaW5nIG9sZExpbmsgPSBsaW5rOwotCQlsaW5rID0gbmV3TGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTElOSywgb2xkTGluaywgbGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0TWVzc2FnaW5nVHlwZSgpIHsKLQkJaWYgKG1lc3NhZ2luZ1R5cGUgIT0gbnVsbCAmJiBtZXNzYWdpbmdUeXBlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRNZXNzYWdpbmdUeXBlID0gKEludGVybmFsRU9iamVjdCltZXNzYWdpbmdUeXBlOwotCQkJbWVzc2FnaW5nVHlwZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRNZXNzYWdpbmdUeXBlKTsKLQkJCWlmIChtZXNzYWdpbmdUeXBlICE9IG9sZE1lc3NhZ2luZ1R5cGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRSwgb2xkTWVzc2FnaW5nVHlwZSwgbWVzc2FnaW5nVHlwZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtZXNzYWdpbmdUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRNZXNzYWdpbmdUeXBlKCkgewotCQlyZXR1cm4gbWVzc2FnaW5nVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdpbmdUeXBlKEphdmFDbGFzcyBuZXdNZXNzYWdpbmdUeXBlKSB7Ci0JCUphdmFDbGFzcyBvbGRNZXNzYWdpbmdUeXBlID0gbWVzc2FnaW5nVHlwZTsKLQkJbWVzc2FnaW5nVHlwZSA9IG5ld01lc3NhZ2luZ1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0lOR19UWVBFLCBvbGRNZXNzYWdpbmdUeXBlLCBtZXNzYWdpbmdUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTjoKLQkJCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlc3RpbmF0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT04sIG51bGwsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldERlc3RpbmF0aW9uKChNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24pb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldERlc3RpbmF0aW9uKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ1RJVkFUSU9OX0NPTkZJRzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY3RpdmF0aW9uQ29uZmlnKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX1NFTEVDVE9SOgotCQkJCXJldHVybiBnZXRNZXNzYWdlU2VsZWN0b3IoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNLTk9XTEVER0VfTU9ERToKLQkJCQlyZXR1cm4gZ2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0xJTks6Ci0JCQkJcmV0dXJuIGdldExpbmsoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT046Ci0JCQkJcmV0dXJuIGdldERlc3RpbmF0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHOgotCQkJCXJldHVybiBnZXRBY3RpdmF0aW9uQ29uZmlnKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT046Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb24oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRNZXNzYWdlRGVzdGluYXRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHSU5HX1RZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNZXNzYWdpbmdUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TWVzc2FnaW5nVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJc2V0VHJhbnNhY3Rpb25UeXBlKChUcmFuc2FjdGlvblR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9TRUxFQ1RPUjoKLQkJCQlzZXRNZXNzYWdlU2VsZWN0b3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ0tOT1dMRURHRV9NT0RFOgotCQkJCXNldEFja25vd2xlZGdlTW9kZSgoQWNrbm93bGVkZ2VNb2RlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0xJTks6Ci0JCQkJc2V0TGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OOgotCQkJCXNldERlc3RpbmF0aW9uKChNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUc6Ci0JCQkJc2V0QWN0aXZhdGlvbkNvbmZpZygoQWN0aXZhdGlvbkNvbmZpZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX0RFU1RJTkFUSU9OOgotCQkJCXNldE1lc3NhZ2VEZXN0aW5hdGlvbigoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0lOR19UWVBFOgotCQkJCXNldE1lc3NhZ2luZ1R5cGUoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQl1bnNldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9TRUxFQ1RPUjoKLQkJCQlzZXRNZXNzYWdlU2VsZWN0b3IoTUVTU0FHRV9TRUxFQ1RPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ0tOT1dMRURHRV9NT0RFOgotCQkJCXVuc2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19MSU5LOgotCQkJCXNldExpbmsoTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTjoKLQkJCQlzZXREZXN0aW5hdGlvbigoTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUc6Ci0JCQkJc2V0QWN0aXZhdGlvbkNvbmZpZygoQWN0aXZhdGlvbkNvbmZpZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT046Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRToKLQkJCQlzZXRNZXNzYWdpbmdUeXBlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfU0VMRUNUT1I6Ci0JCQkJcmV0dXJuIE1FU1NBR0VfU0VMRUNUT1JfRURFRkFVTFQgPT0gbnVsbCA/IG1lc3NhZ2VTZWxlY3RvciAhPSBudWxsIDogIU1FU1NBR0VfU0VMRUNUT1JfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2VTZWxlY3Rvcik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDS05PV0xFREdFX01PREU6Ci0JCQkJcmV0dXJuIGlzU2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0xJTks6Ci0JCQkJcmV0dXJuIExJTktfRURFRkFVTFQgPT0gbnVsbCA/IGxpbmsgIT0gbnVsbCA6ICFMSU5LX0VERUZBVUxULmVxdWFscyhsaW5rKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT046Ci0JCQkJcmV0dXJuIGRlc3RpbmF0aW9uICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHOgotCQkJCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT046Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbiAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRToKLQkJCQlyZXR1cm4gbWVzc2FnaW5nVHlwZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHJhbnNhY3Rpb25UeXBlOiAiKTsKLQkJaWYgKHRyYW5zYWN0aW9uVHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25UeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWVzc2FnZVNlbGVjdG9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtZXNzYWdlU2VsZWN0b3IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFja25vd2xlZGdlTW9kZTogIik7Ci0JCWlmIChhY2tub3dsZWRnZU1vZGVFU2V0KSByZXN1bHQuYXBwZW5kKGFja25vd2xlZGdlTW9kZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW50ZXJwcmlzZUJlYW4jZ2V0QXZhaWxhYmxlTG9jYWxIb21lTWV0aG9kRWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUxvY2FsSG9tZU1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW50ZXJwcmlzZUJlYW4jZ2V0QXZhaWxhYmxlTG9jYWxNZXRob2RFbGVtZW50cygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlTG9jYWxNZXRob2RFbGVtZW50cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVudGVycHJpc2VCZWFuI2dldEF2YWlsYWJsZVJlbW90ZU1ldGhvZEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVSZW1vdGVNZXRob2RFbGVtZW50cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVudGVycHJpc2VCZWFuSW1wbCNnZXRBdmFpbGFibGVVbnNwZWNpZmllZE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVVbnNwZWNpZmllZE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkgewotCQkvL1RoZXJlIGlzIG9ubHkgdGhlIG9uTWVzc2FnZSBtZXRob2QKLQkJTGlzdCBzaWdzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJc2lncy5hZGQoIm9uTWVzc2FnZShqYXZheC5qbXMuTWVzc2FnZSkiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc2lnczsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4NDliZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guVHlwZU5hbWVSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsLk1ldGhvZEVsZW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFRoZSBtZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotICogaG9tZSBvciByZW1vdGUgaW50ZXJmYWNlLCBvciBhIHNldCBvZiBtZXRob2RzLiBUaGUgZWpiLW5hbWUgZWxlbWVudAotICogbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gZGVjbGFyZWQgaW4gdGhlCi0gKiBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0bwotICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IGlzIGRlZmluZWQgaW4KLSAqIGJvdGggdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2U7IHRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotICogdGhlIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkgYQotICogc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBtZXRob2QgbmFtZS4KLSAqIAotICogVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgc3ludGF4OgotICogCi0gKiAxLiAJPG1ldGhvZD4KLSAqIAkJPGVqYi1uYW1lPkVKQk5BTUU8Ly9lamItbmFtZT4KLSAqICAgIAkJPG1ldGhvZC1uYW1lPio8Ly9tZXRob2QtbmFtZT4KLSAqIAk8Ly9tZXRob2Q+Ci0gKiAKLSAqICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNwZWNpZmllZAotICogICAgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMuCi0gKiAKLSAqIDIuIAk8bWV0aG9kPgotICogCQk8ZWpiLW5hbWU+RUpCTkFNRTwvL2VqYi1uYW1lPgotICogICAgCQk8bWV0aG9kLW5hbWU+TUVUSE9EPC8vbWV0aG9kLW5hbWU+Ci0gKiAJPC8vbWV0aG9kPj4KLSAqIAotICogICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mIHRoZQotICogICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMgd2l0aAotICogICAgdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZiB0aGlzIHN0eWxlIHJlZmVycyB0bwotICogICAgYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQgbmFtZS4KLSAqIAotICogCi0gKiAKLSAqIAotICogCi0gKiAzLiAJPG1ldGhvZD4KLSAqIAkJPGVqYi1uYW1lPkVKQk5BTUU8Ly9lamItbmFtZT4KLSAqICAgIAkJPG1ldGhvZC1uYW1lPk1FVEhPRDwvL21ldGhvZC1uYW1lPgotICogCQk8bWV0aG9kLXBhcmFtcz4KLSAqICAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tMTwvL21ldGhvZC1wYXJhbT4KLSAqICAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tMjwvL21ldGhvZC1wYXJhbT4KLSAqICAgICAgICAgICAJCQkuLi4KLSAqICAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tbjwvL21ldGhvZC1wYXJhbT4KLSAqIAkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAk8bWV0aG9kPgkKLSAqIAotICogICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYSBzZXQgb2YKLSAqICAgIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaCBQQVJBTS1uIGFyZSB0aGUKLSAqICAgIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZSBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzIChpZgotICogICAgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50Ci0gKiAgICBjb250YWlucyBubyBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLSAqICAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mIHNxdWFyZQotICogICAgYnJhY2tldHMgKGUuZy4gaW50W11bXSkuCi0gKiAKLSAqIAotICogVXNlZCBpbjogbWV0aG9kLXBlcm1pc3Npb24gYW5kIGNvbnRhaW5lci10cmFuc2FjdGlvbgotICogCi0gKiBFeGFtcGxlczoKLSAqIAotICogICAgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgbWV0aG9kcyBvZgotICogCQl0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlczoKLSAqIAotICogCQk8bWV0aG9kPgotICogCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvL2VqYi1uYW1lPgotICogCQkJPG1ldGhvZC1uYW1lPio8Ly9tZXRob2QtbmFtZT4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJU3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZSBjcmVhdGUKLSAqIAkJbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZToKLSAqIAotICogICAgIAkJPG1ldGhvZD4KLSAqIAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8Ly9lamItbmFtZT4KLSAqIAkJCTxtZXRob2QtbmFtZT5jcmVhdGU8Ly9tZXRob2QtbmFtZT4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi0gKiAJCWNyZWF0ZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgTGFzdE5hbWUpIG1ldGhvZCBvZiB0aGUKLSAqIAkgCUVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0gKiAKLSAqICAgICAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC8vbWV0aG9kLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLXBhcmFtcz4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJCi0gKiAJVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLSAqIAltb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi0gKiAJCQlmb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotICogCQkJCW15cGFja2FnZS5NeUNsYXNzW11bXSBteWNsYWFyKQotICogICAgICAgICB3b3VsZCBiZSBzcGVjaWZpZWQgYXM6Ci0gKiAKLSAqICAgICAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLW5hbWU+Zm9vYmFyPC8vbWV0aG9kLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLXBhcmFtcz4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmNoYXI8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5pbnQ8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5pbnRbXTwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3NbXVtdPC8vbWV0aG9kLXBhcmFtPgotICogCQkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAkJPC8vbWV0aG9kPgotICogCi0gKiAJVGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2hlbiBpdCBiZWNvbWVzCi0gKiAgICBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUKLSAqICAgIGludGVyZmFjZSBhbmQgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUgdGhhdCBpcwotICogICAgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLSAqIAotICogCUZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIAotICogICAgCQk8bWV0aG9kPgotICogCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvL2VqYi1uYW1lPgotICogCQkJPG1ldGhvZC1pbnRmPlJlbW90ZTwvL21ldGhvZC1pbnRmPgotICogCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvL21ldGhvZC1uYW1lPgotICogCQkJPG1ldGhvZC1wYXJhbXM+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCTwvL21ldGhvZC1wYXJhbXM+Ci0gKiAJCTwvL21ldGhvZD4KLSAqIAotICogCWNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kCi0gKiAgICBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLSAqICAgIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotICogCi0gKiAgICAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLWludGY+SG9tZTwvL21ldGhvZC1pbnRmPgotICogCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvL21ldGhvZC1uYW1lPgotICogCQkJPG1ldGhvZC1wYXJhbXM+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCTwvL21ldGhvZC1wYXJhbXM+Ci0gKiAJCTwvL21ldGhvZD4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTWV0aG9kRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcm1zKCkgPGVtPlBhcm1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJtcyA9IFBBUk1TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBUWVBFX0VERUZBVUxUID0gTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50S2luZCB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVudGVycHJpc2VCZWFuIGVudGVycHJpc2VCZWFuID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVDsKLQl9Ci0KLXB1YmxpYyB2b2lkIGFkZE1ldGhvZFBhcmFtcyhTdHJpbmcgcGFyYW0pIHsgCi0JU3RyaW5nIG9sZFBhcm1zID0gZ2V0UGFybXMoKTsKLQlpZiAob2xkUGFybXMgPT0gbnVsbCkgewotCQlzZXRQYXJtcyhwYXJhbSk7Ci0JfSBlbHNlIHsKLQkJc2V0UGFybXMob2xkUGFybXMuY29uY2F0KCIgIikuY29uY2F0KHBhcmFtKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci0vKioKLSAqIFNldCB0aGUgcGFyYW1zIGZvciB0aGlzIG1ldGhvZCBlbGVtZW50IHRvIGFuIGVtcHR5IGFycmF5LCBhcyBvcHBvc2VkCi0gKiB0byBudWxsLgotICovCi1wdWJsaWMgdm9pZCBhcHBseVplcm9QYXJhbXMoKSB7Ci0Jc2V0UGFybXMoIiIpOyAvLyROT04tTkxTLTEkCi19Ci1wdWJsaWMgYm9vbGVhbiBlcXVhbFNpZ25hdHVyZShNZXRob2RFbGVtZW50IGFub3RoZXJNZXRob2RFbGVtZW50KSB7Ci0JYm9vbGVhbiBlcXVhbCA9IGdldE5hbWUoKS5lcXVhbHMoYW5vdGhlck1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLQlpZiAoZXF1YWwpIHsKLQkJZXF1YWwgPSBwYXJtc0VxdWFsKGFub3RoZXJNZXRob2RFbGVtZW50KTsKLQkJaWYgKGVxdWFsKSB7Ci0JCQlpZiAoZ2V0VHlwZSgpID09IG51bGwpCi0JCQkJZXF1YWwgPSBhbm90aGVyTWV0aG9kRWxlbWVudC5nZXRUeXBlKCkgPT0gbnVsbDsKLQkJCWVsc2UKLQkJCQllcXVhbCA9IGdldFR5cGUoKS5lcXVhbHMoYW5vdGhlck1ldGhvZEVsZW1lbnQuZ2V0VHlwZSgpKTsKLQkJfQotCX0KLQlyZXR1cm4gZXF1YWw7Ci19Ci1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0TWV0aG9kUGFyYW1zKCkgeyAKLQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gZ2V0TWV0aG9kUGFyYW1zVG9rZW5pemVyKCk7Ci0JamF2YS51dGlsLkxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQlqYXZhLnV0aWwuTGlzdCBwYXJhbXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCVN0cmluZyBjdXJyZW50ID0gbnVsbDsKLQlpZiAodG9rICE9IG51bGwpIHsKLQkJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCB8fCB0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgcGVlayA9IG51bGw7Ci0JCQlpZiAoY3VycmVudCA9PSBudWxsKQotCQkJCWN1cnJlbnQgPSB0b2submV4dFRva2VuKCk7Ci0JCQlpZiAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXBlZWsgPSB0b2submV4dFRva2VuKCk7Ci0JCQkJaWYgKHBlZWsuc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY3VycmVudCArPSBwZWVrOwotCQkJCQlwZWVrID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQl2LmFkZChjdXJyZW50KTsKLQkJCWlmIChwZWVrICE9IG51bGwpCi0JCQkJY3VycmVudCA9IHBlZWs7Ci0JCQllbHNlCi0JCQkJY3VycmVudCA9IG51bGw7Ci0JCX0KLQotCX0KLQkKLQkvKgotCQkgKiBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBmb3Igb2xkIFhNSSBnZW5lcmF0ZWQgZmlsZXMsIHRoYXQgdmVuIGlmIHRoZXJlIHdhcyAnLCcgc2VwYXJhdGVkIAotCQkgKiBwYXJhbXMsIGl0IHBhcnNlcyB0aGVtIGJhY2sgb3V0IHJpZ2h0LiAgVG8gc3VwcG9ydCA0LjAuWCBBQVQgZ2VuZXJhdGVkIFhNSSBmaWxlcyB3aXRoIHJ1bkFzIHJvbGVzIAotCQkgKiBmb3IgbWV0aG9kcy4KLQkJICovCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKQotCXsKLQkJdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcigoU3RyaW5nKXYuZ2V0KGkpLCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRvayAhPSBudWxsKQotCQl7Ci0JCQl3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkKLQkJCXsKLQkJCQlwYXJhbXNMaXN0LmFkZCh0b2submV4dFRva2VuKCkpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBwYXJhbXNMaXN0OwotfQotcHJpdmF0ZSBTdHJpbmdUb2tlbml6ZXIgZ2V0TWV0aG9kUGFyYW1zVG9rZW5pemVyKCkgewotCS8vVGhpcyBtZXRob2QgaXMgYSBoYWNrIGZvciBub3c7IHRoZSBjYXJkaW5hbGl0eSBpcyB3cm9uZyBmb3IgdGhlIHBhcmFtcwotCVN0cmluZyBhUGFybXMgPSBnZXRQYXJtcygpOwotCWlmIChhUGFybXMgPT0gbnVsbCB8fCBhUGFybXMubGVuZ3RoKCkgPT0gMCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2V0UGFybXMoKSk7Ci19Ci0vKioKLSAqIEFuc3dlciBhIGxpc3Qgb2YgYWxsIHRoZSBtZXRob2RzIGZvciB3aGljaCB0aGlzIG1ldGhvZCBlbGVtZW50IGFwcGxpZXMuICBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSB1c2VkOgotICoKLSAqIDEpICBJZiB0aGUgbWV0aG9kIGVsZW1lbnQgdHlwZSBpcyB1bnNwZWNpZmllZCwgdGhlIG1ldGhvZHMgYXJlIG9idGFpbmVkIGZyb20gdGhlIHJlbW90ZSBpbnRlcmZhY2Ugb2YgdGhlIGVqYjsKLSAqCQlJZiBpdCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGFwcHJvcHJpYXRlIGludGVyZmFjZSBpcyB1c2VkCi0gKgotICogMikgIElmIHRoZSBtZXRob2QgbmFtZSA9ICIqIiwgdGhlbiBhbGwgdGhlIFBVQkxJQyBtZXRob2RzIGZvciB0aGF0IGludGVyZmFjZSBhcmUgcmV0dXJuZWQKLSAqCi0gKiAzKSAgSWYgdGhlIG1ldGhvZCBuYW1lIGlzIHNwZWNpZmllZCwgYW5kIG5vIG1ldGhvZCBwYXJhbXMgYXJlIHNwZWNpZmllZCwgdGhlbiBhbGwgcHVibGljIG1ldGhvZHMgZm9yIHRoZSBpbnRlcmZhY2UKLSAqICAgICAgaGF2aW5nIHRoZSBzYW1lIG5hbWUgYXJlIHJldHVybmVkLgotICoKLSAqIDQpICBJZiB0aGUgbWV0aG9kIG5hbWUgYW5kIHBhcmFtcyBhcmUgc3BlY2lmaWVkLCB0aGVuIGEgemVybyBvciBvbmUgZWxlbWVudCBhcnJheSBpcyByZXR1cm5lZCwgY29udGFpbmluZyB0aGUgb25lIGFuZCBvbmx5IG1ldGhvZAotICogICAgICBvbiB0aGUgaW50ZXJmYWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHNpZ25hdHVyZSwgaWYgaXQgZXhpc3RzCi0gKi8KLXB1YmxpYyBNZXRob2RbXSBnZXRNZXRob2RzKCkgewotCUVudGVycHJpc2VCZWFuIGVqYiA9IGdldEVudGVycHJpc2VCZWFuKCk7Ci0JaWYoZWpiID09IG51bGwpCi0JICAgIHJldHVybiBuZXcgTWV0aG9kWzBdOwotCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQlzd2l0Y2ggKGdldFR5cGUoKS5nZXRWYWx1ZSgpKSB7Ci0JCWNhc2UgTWV0aG9kRWxlbWVudEtpbmQuSE9NRSA6Ci0JCQl7Ci0JCQkJcmVzdWx0ID0gZ2V0TWV0aG9kcyhlamIuZ2V0SG9tZUludGVyZmFjZSgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBNZXRob2RFbGVtZW50S2luZC5SRU1PVEUgOgotCQkJewotCQkJCXJlc3VsdCA9IGdldE1ldGhvZHMoZWpiLmdldFJlbW90ZUludGVyZmFjZSgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FIDoKLQkJCXsKLQkJCQlyZXN1bHQgPSBnZXRNZXRob2RzKGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUwgOgotCQkJewotCQkJCXJlc3VsdCA9IGdldE1ldGhvZHMoZWpiLmdldExvY2FsSW50ZXJmYWNlKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlIE1ldGhvZEVsZW1lbnRLaW5kLlNFUlZJQ0VfRU5EUE9JTlQgOgotCQkgICB7Ci0JCSAgICAJaWYoZWpiLmlzU2Vzc2lvbigpKSB7Ci0JCSAgICAJICAgIHJlc3VsdCA9IGdldE1ldGhvZHMoKChTZXNzaW9uKWVqYikuZ2V0U2VydmljZUVuZHBvaW50KCkpOwotCQkgICAgCSAgICBicmVhazsKLQkJICAgIAl9Ci0JCSAgIH0KLQkJY2FzZSBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRCA6Ci0JCQl7Ci0JCQkJaWYgKGVqYi5pc01lc3NhZ2VEcml2ZW4oKSkKLQkJCQkJcmVzdWx0ID0gZ2V0TWV0aG9kcyhlamIuZ2V0RWpiQ2xhc3MoKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJcmVzdWx0LmFkZEFsbChnZXRNZXRob2RzKGVqYi5nZXRIb21lSW50ZXJmYWNlKCkpKTsKLQkJCQkJcmVzdWx0LmFkZEFsbChnZXRNZXRob2RzKGVqYi5nZXRSZW1vdGVJbnRlcmZhY2UoKSkpOwotCQkJCQlyZXN1bHQuYWRkQWxsKGdldE1ldGhvZHMoZWpiLmdldExvY2FsSG9tZUludGVyZmFjZSgpKSk7Ci0JCQkJCXJlc3VsdC5hZGRBbGwoZ2V0TWV0aG9kcyhlamIuZ2V0TG9jYWxJbnRlcmZhY2UoKSkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQl9Ci0JcmV0dXJuIChNZXRob2RbXSkgcmVzdWx0LnRvQXJyYXkobmV3IE1ldGhvZFtyZXN1bHQuc2l6ZSgpXSk7Ci19Ci0vKioKLSAqIEFuc3dlciBhIGxpc3Qgb2YgYWxsIHRoZSBtZXRob2RzIGZvciB3aGljaCB0aGlzIG1ldGhvZCBlbGVtZW50IGFwcGxpZXMuICBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSB1c2VkOgotICoKLSAqIDEpICBJZiB0aGUgbWV0aG9kIGVsZW1lbnQgdHlwZSBpcyB1bnNwZWNpZmllZCwgdGhlIG1ldGhvZHMgYXJlIG9idGFpbmVkIGZyb20gdGhlIHJlbW90ZSBpbnRlcmZhY2Ugb2YgdGhlIGVqYjsKLSAqCQlJZiBpdCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGFwcHJvcHJpYXRlIGludGVyZmFjZSBpcyB1c2VkCi0gKgotICogMikgIElmIHRoZSBtZXRob2QgbmFtZSA9ICIqIiwgdGhlbiBhbGwgdGhlIFBVQkxJQyBtZXRob2RzIGZvciB0aGF0IGludGVyZmFjZSBhcmUgcmV0dXJuZWQKLSAqCi0gKiAzKSAgSWYgdGhlIG1ldGhvZCBuYW1lIGlzIHNwZWNpZmllZCwgYW5kIG5vIG1ldGhvZCBwYXJhbXMgYXJlIHNwZWNpZmllZCwgdGhlbiBhbGwgcHVibGljIG1ldGhvZHMgZm9yIHRoZSBpbnRlcmZhY2UKLSAqICAgICAgaGF2aW5nIHRoZSBzYW1lIG5hbWUgYXJlIHJldHVybmVkLgotICoKLSAqIDQpICBJZiB0aGUgbWV0aG9kIG5hbWUgYW5kIHBhcmFtcyBhcmUgc3BlY2lmaWVkLCB0aGVuIGEgemVybyBvciBvbmUgZWxlbWVudCBhcnJheSBpcyByZXR1cm5lZCwgY29udGFpbmluZyB0aGUgb25lIGFuZCBvbmx5IG1ldGhvZAotICogICAgICBvbiB0aGUgaW50ZXJmYWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHNpZ25hdHVyZSwgaWYgaXQgZXhpc3RzCi0gKi8KLXByaXZhdGUgTGlzdCBnZXRNZXRob2RzKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQlpZiAoamF2YUNsYXNzID09IG51bGwpIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldE5hbWUoKS50cmltKCk7Ci0JaWYgKG5hbWUuZXF1YWxzKCIqIikpICAvLyROT04tTkxTLTEkCi0JCXJlc3VsdCA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKTsKLQllbHNlIGlmIChoYXNNZXRob2RQYXJhbXMoKSkgewotCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1ldGhvZCBtZXRob2QgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kRXh0ZW5kZWQobmFtZSwgZ2V0TWV0aG9kUGFyYW1zKCkpOwotCQlpZiAobWV0aG9kICE9IG51bGwpCi0JCQlyZXN1bHQuYWRkKG1ldGhvZCk7Ci0JfSBlbHNlCi0gCQlyZXN1bHQgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkTmFtZWQobWV0aG9kTmFtZSk7Ci0gCi0gCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgTWV0aG9kRWxlbWVudCB0aGF0IGlzIG1vc3Qgc3BlY2lmaWMuCi0gKi8KLXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1vc3RTcGVjaWZpYyhNZXRob2RFbGVtZW50IGFNZXRob2RFbGVtZW50LCBKYXZhQ2xhc3MgYUNsYXNzKSB7Ci0JaWYgKGFNZXRob2RFbGVtZW50ID09IG51bGwpIHJldHVybiB0aGlzOwotCWlmIChhTWV0aG9kRWxlbWVudC5pc0RlZmF1bHQoKSAmJiAhaXNEZWZhdWx0KCkpCi0JCXJldHVybiB0aGlzOwotCWlmICghYU1ldGhvZEVsZW1lbnQuaXNEZWZhdWx0KCkgJiYgaXNEZWZhdWx0KCkpCi0JCXJldHVybiBhTWV0aG9kRWxlbWVudDsKLQlpZiAoYU1ldGhvZEVsZW1lbnQuaGFzTWV0aG9kUGFyYW1zKCkgJiYgIWhhc01ldGhvZFBhcmFtcygpKQotCQlyZXR1cm4gYU1ldGhvZEVsZW1lbnQ7Ci0JaWYgKCFhTWV0aG9kRWxlbWVudC5oYXNNZXRob2RQYXJhbXMoKSAmJiBoYXNNZXRob2RQYXJhbXMoKSkKLQkJcmV0dXJuIHRoaXM7Ci0JaWYgKGlzVW5zcGVjaWZpZWQoKSAmJiAhYU1ldGhvZEVsZW1lbnQuaXNVbnNwZWNpZmllZCgpKQotCQlyZXR1cm4gYU1ldGhvZEVsZW1lbnQ7Ci0JcmV0dXJuIHRoaXM7Ci19Ci1wdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TW9zdFNwZWNpZmljTWV0aG9kRWxlbWVudChMaXN0IG1ldGhvZEVsZW1lbnRzLCBNZXRob2QgYU1ldGhvZCkgewotCU1ldGhvZEVsZW1lbnQgc3BlY2lmaWNNRSA9IG51bGw7Ci0JaWYgKGFNZXRob2QgIT0gbnVsbCkgewotCQlJdGVyYXRvciBpdCA9IG1ldGhvZEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCU1ldGhvZEVsZW1lbnQgbWU7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCWlmIChtZS5yZXByZXNlbnRzKGFNZXRob2QpKSB7Ci0JCQkJaWYgKG1lLnVuaXF1ZWx5SWRlbnRpZmllcyhhTWV0aG9kKSkKLQkJCQkJcmV0dXJuIG1lOwotCQkJCWVsc2UgaWYgKHNwZWNpZmljTUUgPT0gbnVsbCkKLQkJCQkJc3BlY2lmaWNNRSA9IG1lOwotCQkJCWVsc2UKLQkJCQkJc3BlY2lmaWNNRSA9IHNwZWNpZmljTUUuZ2V0TW9zdFNwZWNpZmljKG1lLCBhTWV0aG9kLmdldEphdmFDbGFzcygpKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gc3BlY2lmaWNNRTsKLX0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFybXNTdHJpbmcoKSB7Ci0JU3RyaW5nIHBhcm1TdHJpbmcgPSBnZXRQYXJtcygpOwotCWlmIChwYXJtU3RyaW5nID09IG51bGwpCi0JCXBhcm1TdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBwYXJtU3RyaW5nOwotfQotLyoqCi0gKiBSZXR1cm4gYSBTdHJpbmcgYXJyYXkgZm9yIHRoZSBwb3NzaWJsZSBNZXRob2RFbGVtZW50IHR5cGUgbmFtZXMuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UG9zc2libGVUeXBlTmFtZXMoKSB7Ci0JRWpiUGFja2FnZSBwYWNrID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCUxpc3QgbGl0ZXJhbHMgPSBwYWNrLmdldE1ldGhvZEVsZW1lbnRLaW5kKCkuZ2V0RUxpdGVyYWxzKCk7Ci0JU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2xpdGVyYWxzLnNpemUoKV07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsaXRlcmFscy5zaXplKCk7IGkrKykKLQkJbmFtZXNbaV0gPSBsaXRlcmFscy5nZXQoaSkudG9TdHJpbmcoKTsKLQlyZXR1cm4gbmFtZXM7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgc2lnbmF0dXJlLgotICogRm9yIGV4YW1wbGU6ICBzZXRUd29QYXJhbU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQlpZiAoaXNEZWZhdWx0KCkpCi0JCXJldHVybiBnZXROYW1lKCk7Ci0JU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlidWYuYXBwZW5kKGdldE5hbWUoKSk7Ci0JaWYgKGhhc01ldGhvZFBhcmFtcygpKXsKLQkJYnVmLmFwcGVuZChSSUdIVF9QQVJFTik7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2sgPSBnZXRNZXRob2RQYXJhbXNUb2tlbml6ZXIoKTsKLQkJaWYgKHRvayAhPSBudWxsKSB7Ci0JCQl3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCWJ1Zi5hcHBlbmQodG9rLm5leHRUb2tlbigpKTsKLQkJCQlpZiAodG9rLmhhc01vcmVUb2tlbnMoKSkKLQkJCQkJYnVmLmFwcGVuZChDT01NQSk7CQkKLQkJCX0JCQkKLQkJfQotCQlidWYuYXBwZW5kKExFRlRfUEFSRU4pOwotCX0KLQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci19Ci0vLyBSZXR1cm5zIG51bGwgaWYgdGhlIEVFbnVtIGlzIFVOU1BFQ0lGSUVECi0vLyB1bmxlc3MgaXQgaXMgYSBNZXNzYWdlRHJpdmVuIGJlYW4uCi1wdWJsaWMgSmF2YUNsYXNzIGdldFR5cGVKYXZhQ2xhc3MoKSB7Ci0JaWYgKGlzSG9tZSgpKQotCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JZWxzZSBpZiAoaXNSZW1vdGUoKSkKLQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFuKCkuZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JZWxzZSBpZiAoaXNMb2NhbEhvbWUoKSkKLQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFuKCkuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JZWxzZSBpZiAoaXNMb2NhbCgpKQotCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRMb2NhbEludGVyZmFjZSgpOwotCWVsc2UgaWYgKGlzVW5zcGVjaWZpZWQoKSAmJiBnZXRFbnRlcnByaXNlQmVhbigpLmlzTWVzc2FnZURyaXZlbigpKQotCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRFamJDbGFzcygpOwotCWVsc2UKLQkJcmV0dXJuIG51bGw7Ci19Ci0JLyoqCi0gKiBBbnN3ZXIgd2hldGhlciBtZXRob2QgcGFyYW1zIGFwcGx5IHRvIHRoaXMgbWV0aG9kLCBlLmcuLCBpdCBpcyBzcGVjaWZpYyB0byBvbmUKLSAqIG92ZXJsb2FkZWQgbWV0aG9kLCBldmVuIGlmIHRoZSBtZXRob2QgaXMgYSB6ZXJvIHBhcmFtZXRlciBtZXRob2QuICBBbnN3ZXIgZmFsc2UgaWYgbm8KLSAqIHBhcmFtZXRlcnMgYXBwbHksIHRoYXQgaXMsIHRoZSBtZXRob2QgZWxlbWVudCBhcHBsaWVzIHRvIGFsbCBvdmVybG9hZGVkIG1ldGhvZHMgd2l0aCB0aGlzIG5hbWUKLSAqLwotcHVibGljIGJvb2xlYW4gaGFzTWV0aG9kUGFyYW1zKCkgewotCXJldHVybiBnZXRQYXJtcygpICE9IG51bGw7Ci19Ci0vKioKLSAqIFBhcnNlIEBhU2lnbmF0dXJlIHNldHRpbmcgdGhlIG5hbWUgYW5kIHRoZSBwYXJhbXMuCi0gKiBBIHNpZ25hdHVyZSBleGFtcGxlOiAgc2V0VHdvUGFyYW1NZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoU3RyaW5nIGFTaWduYXR1cmUpIHsKLQlwYXJzZVNpZ25hdHVyZShhU2lnbmF0dXJlKTsKLX0KLXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLSAgICByZXR1cm4gSmF2YUNsYXNzLkRFRkFVTFRfTUVUSE9EX05BTUUuZXF1YWxzKGdldE5hbWUoKSk7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kRWxlbWVudCBhbmQgQGFub3RoZXJNZXRob2RFbGVtZW50Ci0gKiByZXByZXNlbnQgdGhlIHNhbWUgZXhhY3QgbWV0aG9kcy4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KE1ldGhvZEVsZW1lbnQgYW5vdGhlck1ldGhvZEVsZW1lbnQpIHsKLQlib29sZWFuIGVxdWFsID0gZXF1YWxTaWduYXR1cmUoYW5vdGhlck1ldGhvZEVsZW1lbnQpOwotCWlmIChlcXVhbCkKLQkJZXF1YWwgPSBnZXRFbnRlcnByaXNlQmVhbigpID09IGFub3RoZXJNZXRob2RFbGVtZW50LmdldEVudGVycHJpc2VCZWFuKCk7Ci0JcmV0dXJuIGVxdWFsOwotfQotcHVibGljIGJvb2xlYW4gaXNIb21lKCkgewotCXJldHVybiBnZXRUeXBlKCkuZ2V0VmFsdWUoKSA9PSBNZXRob2RFbGVtZW50S2luZC5IT01FOwotfQotcHVibGljIGJvb2xlYW4gaXNSZW1vdGUoKSB7Ci0JcmV0dXJuIGdldFR5cGUoKS5nZXRWYWx1ZSgpID09IE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URTsKLX0KLXB1YmxpYyBib29sZWFuIGlzVW5zcGVjaWZpZWQoKSB7Ci0JcmV0dXJuIGdldFR5cGUoKS5nZXRWYWx1ZSgpID09IE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEOwotfQotcHVibGljIGJvb2xlYW4gaXNMb2NhbEhvbWUoKSB7Ci0JcmV0dXJuIGdldFR5cGUoKS5nZXRWYWx1ZSgpID09IE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0hPTUU7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgewotCXJldHVybiBnZXRUeXBlKCkuZ2V0VmFsdWUoKSA9PSBNZXRob2RFbGVtZW50S2luZC5MT0NBTDsKLX0KLXB1YmxpYyBib29sZWFuIGlzU2VydmljZSgpIHsKLQlyZXR1cm4gZ2V0VHlwZSgpLmdldFZhbHVlKCkgPT0gTWV0aG9kRWxlbWVudEtpbmQuU0VSVklDRV9FTkRQT0lOVDsKLX0KLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RFbGVtZW50IHJlcHJlc2VudHMgb25lIG9yIG1vcmUKLSAqIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JcmV0dXJuIGdldE1ldGhvZHMoKS5sZW5ndGggPiAwOwotfQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBvbmx5IGlmIGFsbCB0aGUgcGFyYW1ldGVycyBmb3IgQGFNZXRob2QKLSAqIG1hdGNoZXMgdGhlIG5hbWVzIGluIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMuCi0gKi8KLXB1YmxpYyBib29sZWFuIG1hdGNoZXNQYXJhbXMoTWV0aG9kIGFNZXRob2QpIHsKLQlpZiAoYU1ldGhvZCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JTGlzdCBwYXJhbXMgPSBnZXRNZXRob2RQYXJhbXMoKTsKLQlKYXZhUGFyYW1ldGVyW10gbWV0aG9kUGFyYW1zID0gYU1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQlpZiAocGFyYW1zLnNpemUoKSAhPSBtZXRob2RQYXJhbXMubGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RQYXJhbXMubGVuZ3RoOyBpKyspewotCQlTdHJpbmcgcGFyYW1ldGVyVHlwZSA9ICgoSmF2YUhlbHBlcnMpbWV0aG9kUGFyYW1zW2ldLmdldEVUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKCFwYXJhbXMuZ2V0KGkpLmVxdWFscyhwYXJhbWV0ZXJUeXBlKSkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiB0cnVlOwotfQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIE1ldGhvZEVsZW1lbnQgaGFzIHRoZSBzYW1lIGJhc2ljIHNpZ25hdHVyZSBhcwotICogQGFNZXRob2QsIGlnbm9yaW5nIHRoZSByZXR1cm4gdHlwZSwgdGhyb3duIGV4Y2VwdGlvbnMsIGFuZCBkZWNsYXJpbmcgY2xhc3Mgb2YgCi0gKiB0aGlzIGluc3RhbmNlIG9yIEBhTWV0aG9kLiAgUmV0dXJuIGZhbHNlLCBpZiBwYXJhbXMgaXMgbnVsbAotICovCi1wdWJsaWMgYm9vbGVhbiBuYW1lQW5kUGFyYW1zRXF1YWxzKE1ldGhvZCBhTWV0aG9kKSB7Ci0JaWYgKGFNZXRob2QgIT0gbnVsbCkgewotCQlpZiAoZ2V0TmFtZSgpLmVxdWFscyhhTWV0aG9kLmdldE5hbWUoKSkpIHsKLQkJCWlmIChoYXNNZXRob2RQYXJhbXMoKSkKLQkJCQlyZXR1cm4gbWF0Y2hlc1BhcmFtcyhhTWV0aG9kKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBwYXJtc0VxdWFsKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQlpZiAobWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCUxpc3QgbXlQYXJtcywgb3RoZXJQYXJtczsKLQlteVBhcm1zID0gZ2V0TWV0aG9kUGFyYW1zKCk7Ci0Jb3RoZXJQYXJtcyA9IG1lLmdldE1ldGhvZFBhcmFtcygpOwotCWlmIChteVBhcm1zLnNpemUoKSAhPSBvdGhlclBhcm1zLnNpemUoKSkgcmV0dXJuIGZhbHNlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbXlQYXJtcy5zaXplKCk7IGkrKyl7Ci0JCWlmICghbXlQYXJtcy5nZXQoaSkuZXF1YWxzKG90aGVyUGFybXMuZ2V0KGkpKSkKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0JLyoqCi0JICogUGFyc2UgQGFTaWduYXR1cmUgc2V0dGluZyB0aGUgbmFtZSBhbmQgdGhlIHBhcmFtcy4KLQkgKiBBIHNpZ25hdHVyZSBleGFtcGxlOiAgc2V0VHdvUGFyYW1NZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZVNpZ25hdHVyZShTdHJpbmcgYVNpZ25hdHVyZSkgewotCQlpbnQgaW5kZXggPSBhU2lnbmF0dXJlLmluZGV4T2YoUklHSFRfUEFSRU4pOwotCi0JCWludCBlbmRJbmRleCA9IGFTaWduYXR1cmUuaW5kZXhPZihMRUZUX1BBUkVOKTsKLQkJaWYgKGVuZEluZGV4IDwgMCkgewotCQkJZW5kSW5kZXggPSBhU2lnbmF0dXJlLmxlbmd0aCgpIC0gMTsKLQkJfQotCi0JCWlmIChpbmRleCA8IDApIHsKLQkJCXNldE5hbWUoYVNpZ25hdHVyZSk7Ci0JCQlzZXRQYXJtcyhudWxsKTsgLy8gVGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMgaW4gdGhlIHNpZyBzbyBzZXQgdG8gbnVsbAotCQl9IGVsc2UgewotCQkJU3RyaW5nIHNpZ05hbWUgPSBhU2lnbmF0dXJlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLQkJCXNldE5hbWUoc2lnTmFtZSk7Ci0JCQlTdHJpbmcgc2lnUGFybXMgPSBhU2lnbmF0dXJlLnN1YnN0cmluZyhpbmRleCArIDEsIGVuZEluZGV4KTsKLQotCQkJaWYgKHNpZ1Bhcm1zLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0ZXN0UGFyZW50ID0gc2lnUGFybXMuc3Vic3RyaW5nKDAsIHNpZ1Bhcm1zLmxhc3RJbmRleE9mKCIuIikpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNMb3dlckNhc2UodGVzdFBhcmVudC5zdWJzdHJpbmcodGVzdFBhcmVudC5sYXN0SW5kZXhPZigiLiIpICsgMSwgdGVzdFBhcmVudC5sZW5ndGgoKSkuY2hhckF0KDApKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWNsYXNzIE15VHlwZU5hbWVSZXF1ZXN0b3IgZXh0ZW5kcyBUeXBlTmFtZVJlcXVlc3RvciB7Ci0JCQkJCQlib29sZWFuIGlzTmVzdGVkID0gZmFsc2U7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoaW50IG1vZGlmaWVycywgY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgU3RyaW5nIHBhdGgpIHsKLQkJCQkJCQlpc05lc3RlZCA9IHRydWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkKCkgewotCQkJCQkJCXJldHVybiBpc05lc3RlZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0UHJvamVjdChnZXRFbnRlcnByaXNlQmVhbigpLmVSZXNvdXJjZSgpKSk7Ci0JCQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudHNbXSA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGphdmFQcm9qZWN0IH07Ci0JCQkJCWZpbmFsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGphdmFFbGVtZW50cywgdHJ1ZSk7Ci0JCQotCQkJCQlTdHJpbmcgbmV3U3RyaW5nID0gc2lnUGFybXMuc3Vic3RyaW5nKHNpZ1Bhcm1zLmxhc3RJbmRleE9mKCIuIikgKyAxLCBzaWdQYXJtcy5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQl3aGlsZSAodGVzdFBhcmVudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCVN0cmluZyB0ZW1wID0gbnVsbDsKLQkJCQkJCXRlbXAgPSB0ZXN0UGFyZW50LnN1YnN0cmluZyh0ZXN0UGFyZW50Lmxhc3RJbmRleE9mKCIuIikgKyAxLCB0ZXN0UGFyZW50Lmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkKLQkJCQkJCU15VHlwZU5hbWVSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IE15VHlwZU5hbWVSZXF1ZXN0b3IoKTsKLQkJCQkJCWludCBtYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0ggfCBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkU7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2hBbGxUeXBlTmFtZXMobnVsbCwgbWF0Y2hNb2RlLCB0ZW1wLnRvQ2hhckFycmF5KCksIG1hdGNoTW9kZSwgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRSwgc2NvcGUsIHJlcXVlc3RvciwKLQkJCQkJCQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLldBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNILCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQlpZiAocmVxdWVzdG9yLmlzTmVzdGVkKCkpIHsKLQkJCQkJCQkJbmV3U3RyaW5nID0gdGVtcCArICIkIiArIG5ld1N0cmluZzsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCW5ld1N0cmluZyA9IHRlbXAgKyAiLiIgKyBuZXdTdHJpbmc7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHRlc3RQYXJlbnQubGFzdEluZGV4T2YoIi4iKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl0ZXN0UGFyZW50ID0gdGVzdFBhcmVudC5zdWJzdHJpbmcoMCwgdGVzdFBhcmVudC5sYXN0SW5kZXhPZigiLiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWVsc2UKLQkJCQkJCQkJdGVzdFBhcmVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNpZ1Bhcm1zID0gbmV3U3RyaW5nOwotCQkJCX0KLQotCQkJfQotCi0JCQlpZiAoc2lnUGFybXMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJY2hhciBjb21tYUNoYXIgPSBDT01NQS5jaGFyQXQoMCk7Ci0JCQkJY2hhcltdIHNpZ1Bhcm1zQ2hhcnMgPSBzaWdQYXJtcy50b0NoYXJBcnJheSgpOwotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaWdQYXJtc0NoYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzaWdQYXJtc0NoYXJzW2ldICE9IGNvbW1hQ2hhcikgewotCQkJCQkJYnVmLmFwcGVuZChzaWdQYXJtc0NoYXJzW2ldKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFkZE1ldGhvZFBhcmFtcyhidWYudG9TdHJpbmcoKSk7Ci0JCQkJCQlidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYWRkTWV0aG9kUGFyYW1zKGJ1Zi50b1N0cmluZygpKTsKLQkJCX0gZWxzZQotCQkJCWFwcGx5WmVyb1BhcmFtcygpOwotCQl9Ci0JfQotcHVibGljIHZvaWQgcmVtb3ZlTWV0aG9kUGFyYW1zKFN0cmluZyBwYXJhbSkgeyAKLQlTdHJpbmcgbXlQYXJhbXMgPSBnZXRQYXJtcygpOwotCWlmIChteVBhcmFtcyA9PSBudWxsIHx8IG15UGFyYW1zLmxlbmd0aCgpID09IDApIHsKLQkJcmV0dXJuOwotCX0KLQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihteVBhcmFtcyk7Ci0JU3RyaW5nQnVmZmVyIG5ld1Bhcm1zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXdoaWxlICh0b2suaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJU3RyaW5nIHRva2VuID0gdG9rLm5leHRUb2tlbigpOwotCQlpZiAoIXRva2VuLmVxdWFscyhwYXJhbSkpIHsKLQkJCW5ld1Bhcm1zLmFwcGVuZCh0b2tlbik7Ci0JCQluZXdQYXJtcy5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCXNldFBhcm1zKG5ld1Bhcm1zLnRvU3RyaW5nKCkudHJpbSgpKTsKLX0KLS8qKgotICogcmVwcmVzZW50cyBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJvb2xlYW4gcmVwcmVzZW50cyhNZXRob2QgYU1ldGhvZCkgewotCWlmIChhTWV0aG9kICE9IG51bGwpIHsKLQkJaWYgKGlzVW5zcGVjaWZpZWQoKSB8fCB0eXBlQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKGFNZXRob2QuZ2V0SmF2YUNsYXNzKCkpKSB7Ci0JCQlpZiAoaXNEZWZhdWx0KCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlIAotCQkJCWlmIChnZXROYW1lKCkuZXF1YWxzKGFNZXRob2QuZ2V0TmFtZSgpKSkgewotCQkJCQlpZiAoaGFzTWV0aG9kUGFyYW1zKCkpCi0JCQkJCQlyZXR1cm4gbWF0Y2hlc1BhcmFtcyhhTWV0aG9kKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQl9Ci0JfQkJCQkJCi0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBTZXRzIHRoZSBpZCB0byBiZSBbTWV0aG9kVHJhbnNhY3Rpb25JRHwgTWV0aG9kUGVybWlzc2lvbklEXV9FSkJOQU1FX01ldGhvZE5hbWUsCi0gKiBvciBbTWV0aG9kVHJhbnNhY3Rpb25JRHwgTWV0aG9kUGVybWlzc2lvbklEXV9FSkJOQU1FX01ldGhvZE5hbWVfUGFybXMsIGlmIHBhcm1zIGV4aXN0Ci0gKi8KLXB1YmxpYyB2b2lkIHNldElkVG9SZWFkYWJsZVN0cmluZygpIHsgCi0JU3RyaW5nIGFQYXJtcyA9IGdldFBhcm1zKCkgPT0gbnVsbCA/ICIiIDogIl8iK2dldFBhcm1zKCkucmVwbGFjZSgnICcsICdfJyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCVN0cmluZyBwcmVmaXggPSAiIjsgLy8kTk9OLU5MUy0xJAotCXN3aXRjaCAoTWV0aG9kRWxlbWVudEhlbHBlci5nZXRDb250YWluZWRUeXBlKHRoaXMpKSB7Ci0JCWNhc2UgTWV0aG9kRWxlbWVudEhlbHBlci5NRVRIT0RfUEVSTUlTU0lPTiA6CQotCQkJcHJlZml4ID0gKChYTUlSZXNvdXJjZSllQ29udGFpbmVyLmVSZXNvdXJjZSgpKS5nZXRJRChlQ29udGFpbmVyKTsKLQkJCWJyZWFrOwotCQljYXNlIE1ldGhvZEVsZW1lbnRIZWxwZXIuTUVUSE9EX1RSQU5TQUNUSU9OIDoKLQkJCXByZWZpeCA9ICgoWE1JUmVzb3VyY2UpZUNvbnRhaW5lci5lUmVzb3VyY2UoKSkuZ2V0SUQoZUNvbnRhaW5lcik7Ci0JCQlicmVhazsKLQl9Ci0JKChYTUlSZXNvdXJjZSllUmVzb3VyY2UoKSkuc2V0SUQodGhpcyxwcmVmaXggKyAiXyIgKyBnZXRFbnRlcnByaXNlQmVhbigpLmdldE5hbWUoKSArICJfIiArIGdldE5hbWUoKSArIGFQYXJtcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotfQotcHJvdGVjdGVkIGJvb2xlYW4gdHlwZUNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIHsKLQlpZiAoZ2V0VHlwZUphdmFDbGFzcygpID09IG51bGwgfHwgYW5JbnRlcmZhY2UgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCXJldHVybiBnZXRUeXBlSmF2YUNsYXNzKCkuaW1wbGVtZW50c0ludGVyZmFjZShhbkludGVyZmFjZSk7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kRWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzCi0gKiBAYU1ldGhvZC4gIFJldHVybiBmYWxzZSwgZXZlbiBpZiB0aGUgTWV0aG9kRWxlbWVudCByZXByZXNlbnRzCi0gKiBAYU1ldGhvZCAoaS5lLiwgQGFNZXRob2QgaXMgY29udGFpbmVkIGluIGl0cyBsaXN0IG9mIG1ldGhvZHMpLgotICovCi1wdWJsaWMgYm9vbGVhbiB1bmlxdWVseUlkZW50aWZpZXMoTWV0aG9kIGFNZXRob2QpIHsKLQlpZiAoYU1ldGhvZCAhPSBudWxsKSB7Ci0JCWlmIChnZXRUeXBlSmF2YUNsYXNzKCkgIT0gbnVsbCAmJiAKLQkgICAgICAgIHR5cGVDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoYU1ldGhvZC5nZXRKYXZhQ2xhc3MoKSkgJiYgCi0JICAgICAgICBnZXROYW1lKCkuZXF1YWxzKGFNZXRob2QuZ2V0TmFtZSgpKSkgewotCQkJaWYgKGhhc01ldGhvZFBhcmFtcygpKQotCQkJCXJldHVybiBtYXRjaGVzUGFyYW1zKGFNZXRob2QpOwotCQkJcmV0dXJuIGFNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoPT0wOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIG1ldGhvZCwKLQkgKiBvciB0aGUgYXN0ZXJpc2sgKCopIGNoYXJhY3Rlci4gVGhlIGFzdGVyaXNrIGlzIHVzZWQgd2hlbiB0aGUgZWxlbWVudAotCSAqIGRlbm90ZXMgYWxsIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBhbmQgaG9tZQotCSAqIGludGVyZmFjZXMuCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFybXMoKSB7Ci0JCXJldHVybiBwYXJtczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJtcyhTdHJpbmcgbmV3UGFybXMpIHsKLQkJU3RyaW5nIG9sZFBhcm1zID0gcGFybXM7Ci0JCXBhcm1zID0gbmV3UGFybXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BBUk1TLCBvbGRQYXJtcywgcGFybXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEtpbmQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShNZXRob2RFbGVtZW50S2luZCBuZXdUeXBlKSB7Ci0JCU1ldGhvZEVsZW1lbnRLaW5kIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZSA9PSBudWxsID8gVFlQRV9FREVGQVVMVCA6IG5ld1R5cGU7Ci0JCWJvb2xlYW4gb2xkVHlwZUVTZXQgPSB0eXBlRVNldDsKLQkJdHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19UWVBFLCBvbGRUeXBlLCB0eXBlLCAhb2xkVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFR5cGUoKSB7Ci0JCU1ldGhvZEVsZW1lbnRLaW5kIG9sZFR5cGUgPSB0eXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGUgPSBUWVBFX0VERUZBVUxUOwotCQl0eXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1RZUEUsIG9sZFR5cGUsIFRZUEVfRURFRkFVTFQsIG9sZFR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwcmlzZUJlYW4oKSB7Ci0JCWlmIChlbnRlcnByaXNlQmVhbiAhPSBudWxsICYmIGVudGVycHJpc2VCZWFuLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRFbnRlcnByaXNlQmVhbiA9IChJbnRlcm5hbEVPYmplY3QpZW50ZXJwcmlzZUJlYW47Ci0JCQllbnRlcnByaXNlQmVhbiA9IChFbnRlcnByaXNlQmVhbillUmVzb2x2ZVByb3h5KG9sZEVudGVycHJpc2VCZWFuKTsKLQkJCWlmIChlbnRlcnByaXNlQmVhbiAhPSBvbGRFbnRlcnByaXNlQmVhbikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0VOVEVSUFJJU0VfQkVBTiwgb2xkRW50ZXJwcmlzZUJlYW4sIGVudGVycHJpc2VCZWFuKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVudGVycHJpc2VCZWFuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBiYXNpY0dldEVudGVycHJpc2VCZWFuKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZUJlYW47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW50ZXJwcmlzZUJlYW4oRW50ZXJwcmlzZUJlYW4gbmV3RW50ZXJwcmlzZUJlYW4pIHsKLQkJRW50ZXJwcmlzZUJlYW4gb2xkRW50ZXJwcmlzZUJlYW4gPSBlbnRlcnByaXNlQmVhbjsKLQkJZW50ZXJwcmlzZUJlYW4gPSBuZXdFbnRlcnByaXNlQmVhbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fRU5URVJQUklTRV9CRUFOLCBvbGRFbnRlcnByaXNlQmVhbiwgZW50ZXJwcmlzZUJlYW4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BBUk1TOgotCQkJCXJldHVybiBnZXRQYXJtcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19FTlRFUlBSSVNFX0JFQU46Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFbnRlcnByaXNlQmVhbigpOwotCQkJCXJldHVybiBiYXNpY0dldEVudGVycHJpc2VCZWFuKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUEFSTVM6Ci0JCQkJc2V0UGFybXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19UWVBFOgotCQkJCXNldFR5cGUoKE1ldGhvZEVsZW1lbnRLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fRU5URVJQUklTRV9CRUFOOgotCQkJCXNldEVudGVycHJpc2VCZWFuKChFbnRlcnByaXNlQmVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BBUk1TOgotCQkJCXNldFBhcm1zKFBBUk1TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1RZUEU6Ci0JCQkJdW5zZXRUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19FTlRFUlBSSVNFX0JFQU46Ci0JCQkJc2V0RW50ZXJwcmlzZUJlYW4oKEVudGVycHJpc2VCZWFuKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUEFSTVM6Ci0JCQkJcmV0dXJuIFBBUk1TX0VERUZBVUxUID09IG51bGwgPyBwYXJtcyAhPSBudWxsIDogIVBBUk1TX0VERUZBVUxULmVxdWFscyhwYXJtcyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fRU5URVJQUklTRV9CRUFOOgotCQkJCXJldHVybiBlbnRlcnByaXNlQmVhbiAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFybXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcm1zKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKLQkJaWYgKHR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFBlcm1pc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RQZXJtaXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzBiNjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFBlcm1pc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci0KLS8qKgotICogVGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUgc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMsIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLiAgVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kLy9vciBob21lIGludGVyZmFjZXMuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQZXJtaXNzaW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFBlcm1pc3Npb24gewotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5jaGVja2VkKCkgPGVtPlVuY2hlY2tlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVbmNoZWNrZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVTkNIRUNLRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVuY2hlY2tlZCA9IFVOQ0hFQ0tFRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVuY2hlY2tlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdW5jaGVja2VkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJvbGVzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kRWxlbWVudHMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBNZXRob2RQZXJtaXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QRVJNSVNTSU9OOwotCX0KLQotcHVibGljIExpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQlpZiAoYW5FSkIgPT0gbnVsbCkgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JTGlzdCBlbGVtZW50cyA9IGdldE1ldGhvZEVsZW1lbnRzKCk7Ci0JTWV0aG9kRWxlbWVudCBtZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKXsKLQkJbWUgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpOwotCQlpZiAoYW5FSkIuZXF1YWxzKG1lLmdldEVudGVycHJpc2VCZWFuKCkpKQotCQkJcmVzdWx0LmFkZChtZSk7CQkJCi0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci1wdWJsaWMgU2VjdXJpdHlSb2xlIGdldFNlY3VyaXR5Um9sZShTdHJpbmcgYVJvbGVOYW1lKSB7Ci0JaWYgKGFSb2xlTmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlMaXN0IG15Um9sZXMgPSBnZXRSb2xlcygpOwotCWludCBzaXplID0gbXlSb2xlcy5zaXplKCk7Ci0JU2VjdXJpdHlSb2xlIHJvbGU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspewotCQlyb2xlID0gKFNlY3VyaXR5Um9sZSkgbXlSb2xlcy5nZXQoaSk7Ci0JCWlmIChhUm9sZU5hbWUuZXF1YWxzKHJvbGUuZ2V0Um9sZU5hbWUoKSkpCi0JCQlyZXR1cm4gcm9sZTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcGVybWlzc2lvbiBjb250YWlucyBAYVNlY3VyaXR5Um9sZQotICovCi1wdWJsaWMgYm9vbGVhbiBoYXNTZWN1cml0eVJvbGUoU2VjdXJpdHlSb2xlIGFTZWN1cml0eVJvbGUpIHsKLQlpZiAoYVNlY3VyaXR5Um9sZSA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JTGlzdCBteVJvbGVzID0gZ2V0Um9sZXMoKTsKLQlpbnQgc2l6ZSA9IG15Um9sZXMuc2l6ZSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCWlmIChhU2VjdXJpdHlSb2xlID09IG15Um9sZXMuZ2V0KGkpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBib29sZWFuIGhhc1NlY3VyaXR5Um9sZShTdHJpbmcgYVJvbGVOYW1lKSB7Ci0JcmV0dXJuIGdldFNlY3VyaXR5Um9sZShhUm9sZU5hbWUpICE9IG51bGw7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kUGVybWlzc2lvbiBhbmQgQGFub3RoZXJNZXRob2RQZXJtaXNzaW9uCi0gKiBoYXZlIHRoZSBzYW1lIHJvbGVzLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoTWV0aG9kUGVybWlzc2lvbiBhbm90aGVyTWV0aG9kUGVybWlzc2lvbikgewotCWlmIChhbm90aGVyTWV0aG9kUGVybWlzc2lvbiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGdldFJvbGVzKCkuc2l6ZSgpID09IGFub3RoZXJNZXRob2RQZXJtaXNzaW9uLmdldFJvbGVzKCkuc2l6ZSgpICYmCi0JCQlnZXRSb2xlcygpLmNvbnRhaW5zQWxsKGFub3RoZXJNZXRob2RQZXJtaXNzaW9uLmdldFJvbGVzKCkpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbmNoZWNrZWQoKSB7Ci0JCXJldHVybiB1bmNoZWNrZWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5jaGVja2VkKGJvb2xlYW4gbmV3VW5jaGVja2VkKSB7Ci0JCWJvb2xlYW4gb2xkVW5jaGVja2VkID0gdW5jaGVja2VkOwotCQl1bmNoZWNrZWQgPSBuZXdVbmNoZWNrZWQ7Ci0JCWJvb2xlYW4gb2xkVW5jaGVja2VkRVNldCA9IHVuY2hlY2tlZEVTZXQ7Ci0JCXVuY2hlY2tlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQsIG9sZFVuY2hlY2tlZCwgdW5jaGVja2VkLCAhb2xkVW5jaGVja2VkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VW5jaGVja2VkKCkgewotCQlib29sZWFuIG9sZFVuY2hlY2tlZCA9IHVuY2hlY2tlZDsKLQkJYm9vbGVhbiBvbGRVbmNoZWNrZWRFU2V0ID0gdW5jaGVja2VkRVNldDsKLQkJdW5jaGVja2VkID0gVU5DSEVDS0VEX0VERUZBVUxUOwotCQl1bmNoZWNrZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VELCBvbGRVbmNoZWNrZWQsIFVOQ0hFQ0tFRF9FREVGQVVMVCwgb2xkVW5jaGVja2VkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VW5jaGVja2VkKCkgewotCQlyZXR1cm4gdW5jaGVja2VkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQXNzZW1ibHlEZXNjcmlwdG9yIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQXNzZW1ibHlEZXNjcmlwdG9yKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IpIHsKLQkJaWYgKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SICYmIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBc3NlbWJseURlc2NyaXB0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXNzZW1ibHlEZXNjcmlwdG9yKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SLCBuZXdBc3NlbWJseURlc2NyaXB0b3IsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlcygpIHsKLQkJaWYgKHJvbGVzID09IG51bGwpIHsKLQkJCXJvbGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChTZWN1cml0eVJvbGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gcm9sZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZEVsZW1lbnRzKCkgewotCQlpZiAobWV0aG9kRWxlbWVudHMgPT0gbnVsbCkgewotCQkJbWV0aG9kRWxlbWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kRWxlbWVudC5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcigoQXNzZW1ibHlEZXNjcmlwdG9yKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kRWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlMsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRDoKLQkJCQlyZXR1cm4gaXNVbmNoZWNrZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0Um9sZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50cygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEOgotCQkJCXNldFVuY2hlY2tlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fUk9MRVM6Ci0JCQkJZ2V0Um9sZXMoKS5jbGVhcigpOwotCQkJCWdldFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlnZXRNZXRob2RFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQ6Ci0JCQkJdW5zZXRVbmNoZWNrZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ST0xFUzoKLQkJCQlnZXRSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0VW5jaGVja2VkKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVTOgotCQkJCXJldHVybiByb2xlcyAhPSBudWxsICYmICFyb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gbWV0aG9kRWxlbWVudHMgIT0gbnVsbCAmJiAhbWV0aG9kRWxlbWVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1bmNoZWNrZWQ6ICIpOwotCQlpZiAodW5jaGVja2VkRVNldCkgcmVzdWx0LmFwcGVuZCh1bmNoZWNrZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kVHJhbnNhY3Rpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RUcmFuc2FjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlOGU2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RUcmFuc2FjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZTsKLQotLyoqCi0gKiBTcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kIGludm9jYXRpb25zLiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS5UaGUgdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFRyYW5zYWN0aW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFRyYW5zYWN0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIDxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBUUkFOU0FDVElPTl9BVFRSSUJVVEVfRURFRkFVTFQgPSBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTk9UX1NVUFBPUlRFRF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSB0cmFuc2FjdGlvbkF0dHJpYnV0ZSA9IFRSQU5TQUNUSU9OX0FUVFJJQlVURV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZEVsZW1lbnRzID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgTWV0aG9kVHJhbnNhY3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1RSQU5TQUNUSU9OOwotCX0KLQotLyoqCi0gKiBSZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5ncyBmb3IgYWxsIHRoZSBFRW51bUxpdGVyYWwgdmFsdWVzCi0gKiBmb3IgdGhlIHRyYW5zYWN0aW9uQXR0cmlidXRlIGVudW1lcmF0aW9uLgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEF2YWlsYWJsZVRyYW5zYWN0aW9uQXR0cmlidXRlTmFtZXMoKSB7Ci0JTGlzdCBsID0gZ2V0QXZhaWxhYmxlVHJhbnNhY3Rpb25BdHRyaWJ1dGVzKCk7Ci0JU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2wuc2l6ZSgpXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGwuc2l6ZSgpOyBpKyspCi0JCW5hbWVzW2ldID0gKChFRW51bUxpdGVyYWwpbC5nZXQoaSkpLnRvU3RyaW5nKCk7Ci0JcmV0dXJuIG5hbWVzOwotfQotLyoqCi0gKiBSZXR1cm4gYSBMaXN0IG9mIHRoZSBhbGwgdGhlIEVFbnVtTGl0ZXJhbCB2YWx1ZXMKLSAqIGZvciB0aGUgdHJhbnNhY3Rpb25BdHRyaWJ1dGUgZW51bWVyYXRpb24uCi0gKiBUaGUgdG9TdHJpbmcoKSBtZXRob2QgZm9yIGEgRUVudW1MaXRlcmFsIHdpbGwgZGlzcGxheQotICogdGhlIFN0cmluZyB2YWx1ZSBmb3IgdGhlIGVudW1lcmF0aW9uIHZhbHVlLgotICovCi1wdWJsaWMgc3RhdGljIExpc3QgZ2V0QXZhaWxhYmxlVHJhbnNhY3Rpb25BdHRyaWJ1dGVzKCkgewotCUVqYlBhY2thZ2UgcGFjayA9IChFamJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSk7Ci0JcmV0dXJuIHBhY2suZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCkuZ2V0RUxpdGVyYWxzKCk7Ci19Ci1wdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCUxpc3QgZWxlbWVudHMgPSBnZXRNZXRob2RFbGVtZW50cygpOwotCU1ldGhvZEVsZW1lbnQgbWU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKyl7Ci0JCW1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJaWYgKG1lLmdldEVudGVycHJpc2VCZWFuKCkgIT0gbnVsbCAmJiBtZS5nZXRFbnRlcnByaXNlQmVhbigpLmVxdWFscyhhbkVKQikpCi0JCQlyZXN1bHQuYWRkKG1lKTsJCQkKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1vc3RTcGVjaWZpY01ldGhvZEVsZW1lbnQoTWV0aG9kIGFNZXRob2QpIHsKLSAgIHJldHVybiBNZXRob2RFbGVtZW50SW1wbC5nZXRNb3N0U3BlY2lmaWNNZXRob2RFbGVtZW50KGdldE1ldGhvZEVsZW1lbnRzKCksIGFNZXRob2QpOwotfQotcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KE1ldGhvZFRyYW5zYWN0aW9uIGFub3RoZXJNZXRob2RUcmFuc2FjdGlvbikgewotCXJldHVybiBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpID09IGFub3RoZXJNZXRob2RUcmFuc2FjdGlvbi5nZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0cmFucy1hdHRyaWJ1dGUgZWxlbWVudCBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kIGludm9jYXRpb24gdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MgbWV0aG9kLgotCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBuZXdUcmFuc2FjdGlvbkF0dHJpYnV0ZSkgewotCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgb2xkVHJhbnNhY3Rpb25BdHRyaWJ1dGUgPSB0cmFuc2FjdGlvbkF0dHJpYnV0ZTsKLQkJdHJhbnNhY3Rpb25BdHRyaWJ1dGUgPSBuZXdUcmFuc2FjdGlvbkF0dHJpYnV0ZSA9PSBudWxsID8gVFJBTlNBQ1RJT05fQVRUUklCVVRFX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25BdHRyaWJ1dGU7Ci0JCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0ID0gdHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0OwotCQl0cmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFLCBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZSwgdHJhbnNhY3Rpb25BdHRyaWJ1dGUsICFvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgb2xkVHJhbnNhY3Rpb25BdHRyaWJ1dGUgPSB0cmFuc2FjdGlvbkF0dHJpYnV0ZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQgPSB0cmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQ7Ci0JCXRyYW5zYWN0aW9uQXR0cmlidXRlID0gVFJBTlNBQ1RJT05fQVRUUklCVVRFX0VERUZBVUxUOwotCQl0cmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFLCBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZSwgVFJBTlNBQ1RJT05fQVRUUklCVVRFX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQXNzZW1ibHlEZXNjcmlwdG9yKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgbmV3QXNzZW1ibHlEZXNjcmlwdG9yKSB7Ci0JCWlmIChuZXdBc3NlbWJseURlc2NyaXB0b3IgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1IgJiYgbmV3QXNzZW1ibHlEZXNjcmlwdG9yICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3QXNzZW1ibHlEZXNjcmlwdG9yKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3QXNzZW1ibHlEZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Fzc2VtYmx5RGVzY3JpcHRvcikuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXNzZW1ibHlEZXNjcmlwdG9yKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBuZXdBc3NlbWJseURlc2NyaXB0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kRWxlbWVudHMoKSB7Ci0JCWlmIChtZXRob2RFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQltZXRob2RFbGVtZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXRob2RFbGVtZW50LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3Ipb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZEVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19UUkFOU0FDVElPTl9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uQXR0cmlidXRlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50cygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFOgotCQkJCXNldFRyYW5zYWN0aW9uQXR0cmlidXRlKChUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlnZXRNZXRob2RFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX1RSQU5TQUNUSU9OX0FUVFJJQlVURToKLQkJCQl1bnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCWdldE1ldGhvZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX1RSQU5TQUNUSU9OX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gaXNTZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBnZXRBc3NlbWJseURlc2NyaXB0b3IoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCXJldHVybiBtZXRob2RFbGVtZW50cyAhPSBudWxsICYmICFtZXRob2RFbGVtZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHJhbnNhY3Rpb25BdHRyaWJ1dGU6ICIpOwotCQlpZiAodHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uQXR0cmlidXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZGEzZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0vKioKLSAqIFRoaXMgZmlsdGVyIHdpbGwgcmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBrZXlBdHRyaWJ1dGVzIGZyb20gdGhlCi0gKiBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIKLSAqIG1ldGhvZC4gSXQgd2lsbCByZW1vdmUgYW55IGtleUF0dHJpYnV0ZXMgdGhhdCBhcmUgaGVsZCBieSBFamJSZWxhdGlvbnNoaXBSb2xlCi0gKiBvYmplY3RzIChpbmNsdWRpbmcgaW5oZXJpdGVkIEVqYlJlbGF0aW9uc2hpcFJvbGUgYXR0cmlidXRlcykuIFRoYXQgbWVhbnMgdGhlCi0gKiByZXR1cm5lZCBsaXN0IG9mIENNUEF0dHJpYnV0ZXMgd2lsbCBiZSBrZXkgYXR0cmlidXRlcyB0aGF0IHdlcmUgZGVmaW5lZAotICogbG9jYWxseSBhbmQgYWxsIGluaGVyaXRlZCBrZXkgYXR0cmlidXRlcyBtaW51cyBhbnkga2V5IGF0dHJpYnV0ZXMgcG9pbnRlZCB0bwotICogYnkgRWpiUmVsYXRpb25zaGlwUm9sZXMsIHRodXMgdGhlIGtleSBhdHRyaWJ1dGVzIHdpbGwgb25seSBiZSBrZXkgYXR0cmlidXRlcwotICogdGhhdCB3ZXJlIGRlZmluZWQgYnkgdGhlIHVzZXIuIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDg6MDk6MTAgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VBdHRyaWJ1dGVzKGNtcCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LiBSZXR1cm4gYWxsIGF0dHJpYnV0ZXMKLQkgKiBtaW51cyB0aG9zZSBhZGRlZCBkdWUgdG8gUmVsYXRpb25zaGlwIFJvbGVzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNvdXJjZUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJTGlzdCBhbGwsIGxvY2FsUm9sZUtleUF0dHJpYnV0ZXM7Ci0JCWFsbCA9IG5ldyBBcnJheUxpc3QoY21wLmdldEtleUF0dHJpYnV0ZXMoKSk7Ci0JCWxvY2FsUm9sZUtleUF0dHJpYnV0ZXMgPSBjbXAKLQkJCQkuZ2V0RmlsdGVyZWRGZWF0dXJlcyhLZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyCi0JCQkJCQkuc2luZ2xldG9uKCkpOwotCQlmaWx0ZXJSb2xlQXR0cmlidXRlc0J5TmFtZShhbGwsIGxvY2FsUm9sZUtleUF0dHJpYnV0ZXMpOwotCQlyZXR1cm4gYWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNTozNjowMAotCSAqIFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5Nb2RlbGxlZEtleUF0dHJpYnV0ZUZpbHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIoKTsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Nb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQzOGFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGVzIGZyb20gdGhlCi0gKiBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIKLSAqIG1ldGhvZC4gSXQgd2lsbCByZW1vdmUgYW55IHBlcnNpc3RlbnRBdHRyaWJ1dGVzIHRoYXQgYXJlIGhlbGQgYnkKLSAqIEVqYlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0cyAoaW5jbHVkaW5nIGluaGVyaXRlZCBFamJSZWxhdGlvbnNoaXBSb2xlCi0gKiBhdHRyaWJ1dGVzKS4gVGhhdCBtZWFucyB0aGUgcmV0dXJuZWQgbGlzdCBvZiBDTVBBdHRyaWJ1dGVzIHdpbGwgYmUgYXR0cmlidXRlcwotICogdGhhdCB3ZXJlIGRlZmluZWQgbG9jYWxseSBhbmQgYWxsIGluaGVyaXRlZCBhdHRyaWJ1dGVzIG1pbnVzIGFueSBhdHRyaWJ1dGVzCi0gKiBwb2ludGVkIHRvIGJ5IEVqYlJlbGF0aW9uc2hpcFJvbGVzLCB0aHVzIHRoZSBhdHRyaWJ1dGVzIHdpbGwgb25seSBiZQotICogYXR0cmlidXRlcyB0aGF0IHdlcmUgZGVmaW5lZCBieSB0aGUgdXNlci4gCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgZXh0ZW5kcwotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VBdHRyaWJ1dGVzKGNtcCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LiBSZXR1cm4gYWxsIGF0dHJpYnV0ZXMKLQkgKiBtaW51cyB0aG9zZSBhZGRlZCBkdWUgdG8gUmVsYXRpb25zaGlwIFJvbGVzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNvdXJjZUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJTGlzdCBhbGwsIHJvbGVBdHRyaWJ1dGVzOwotCQlhbGwgPSBuZXcgQXJyYXlMaXN0KGNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpKTsKLQkJcm9sZUF0dHJpYnV0ZXMgPSBjbXAKLQkJCQkuZ2V0RmlsdGVyZWRGZWF0dXJlcyhSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyCi0JCQkJCQkuc2luZ2xldG9uKCkpOwotCQlmaWx0ZXJSb2xlQXR0cmlidXRlc0J5TmFtZShhbGwsIHJvbGVBdHRyaWJ1dGVzKTsKLQkJcmV0dXJuIGFsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDU6MzY6MDAKLQkgKiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyKCk7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTm9uS2V5UmVxdWlyZWRSb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Ob25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2YzAyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Ob25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNSwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLQotcHVibGljIGNsYXNzIE5vbktleVJlcXVpcmVkUm9sZUZpbHRlciBleHRlbmRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTm9uS2V5UmVxdWlyZWRSb2xlRmlsdGVyIHNpbmdsZXRvbjsKLQotICAgIHByb3RlY3RlZCBMaXN0IGZpbHRlck5vdGNhY2hlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotICAgICAgICBMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGdldFJlbGF0aW9uc2hpcFJvbGVzKGNtcCkuaXRlcmF0b3IoKTsKLSAgICAgICAgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByb2xlOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByb2xlID0gKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmICghcm9sZS5pc0tleSgpICYmIHJvbGUuaXNSZXF1aXJlZCgpKSByb2xlcy5hZGQocm9sZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNzoxNTozNwotICAgICAqIFBNKQotICAgICAqIAotICAgICAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOb25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIgc2luZ2xldG9uKCkgewotICAgICAgICBpZiAoc2luZ2xldG9uID09IG51bGwpIHNpbmdsZXRvbiA9IG5ldyBOb25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIoKTsKLSAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjA2OGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJldHVyblR5cGVNYXBwaW5nOwotCi0vKioKLSAqIFRoZSBxdWVyeSBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGZpbmRlciBvciBzZWxlY3QgcXVlcnkuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeTsgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QgbWV0aG9kIGl0IGlzIHVzZWQgYnk7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmV0dXJuIHR5cGUgbWFwcGluZywgaWYgYW55LCBpZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZDsgYW5kIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuIFF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwgZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeQotICogaXMgbm90IGV4cHJlc3NpYmxlIGluIEVKQiBRTCwgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudCBzaG91bGQgYmUgZW1wdHkuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWVyeUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBRdWVyeSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlFMKCkgPGVtPkVqYiBRTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiUUwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9RTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYlFMID0gRUpCX1FMX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5UeXBlTWFwcGluZygpIDxlbT5SZXR1cm4gVHlwZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXR1cm5UeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXR1cm5UeXBlTWFwcGluZyBSRVRVUk5fVFlQRV9NQVBQSU5HX0VERUZBVUxUID0gUmV0dXJuVHlwZU1hcHBpbmcuTE9DQUxfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBSZXR1cm5UeXBlTWFwcGluZyByZXR1cm5UeXBlTWFwcGluZyA9IFJFVFVSTl9UWVBFX01BUFBJTkdfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXR1cm4gVHlwZSBNYXBwaW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXR1cm5UeXBlTWFwcGluZ0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBRdWVyeU1ldGhvZCBxdWVyeU1ldGhvZCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIFF1ZXJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLlFVRVJZOwotCX0KLQotcHVibGljIGJvb2xlYW4gaXNMb2NhbFJlc3VsdE1hcHBpbmcoKSB7Ci0JLy8gb3ZlcnJpZGUgYnVnIGluIHRoZSBtb2RlbCB3aGljaCBtYWRlIFJlbW90ZSB0aGUgZGVmYXVsdAotCXJldHVybiBnZXRSZXR1cm5UeXBlTWFwcGluZygpLmdldFZhbHVlKCkgPT0gUmV0dXJuVHlwZU1hcHBpbmcuTE9DQUw7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc1JlbW90ZVJlc3VsdE1hcHBpbmcoKSB7Ci0JcmV0dXJuIGdldFJldHVyblR5cGVNYXBwaW5nKCkuZ2V0VmFsdWUoKSA9PSBSZXR1cm5UeXBlTWFwcGluZy5SRU1PVEU7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcXVlcnkuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQ29udGFpbnMgdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzIGEgZmluZGVyIG9yIHNlbGVjdCBxdWVyeS4gVGhpcyBlbGVtZW50IGlzIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhIHF1ZXJ5IGVsZW1lbnQgd2hvc2UgY29udGVudHMgc3BlY2lmeSB0aGUgZmluZGVyIG9yIHRoZSBzZWxlY3QgbWV0aG9kIHRoYXQgdXNlcyB0aGUgcXVlcnkuIFRoZSBjb250ZW50IG11c3QgYmUgYSB2YWxpZCBFSkIgUUwgcXVlcnkgc3RyaW5nIGZvciB0aGUgZW50aXR5IGJlYW4gZm9yIHdoaWNoIHRoZSBxdWVyeSBpcyBzcGVjaWZpZWQuIFRoZSBlamItcWwgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYWxsIHF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMLgotCSAqIAotCSAqIEBpbnZhcmlhbnQgVGhlIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBFSkIgUUwgcXVlcnkgc3RyaW5nIGZvciB0aGUgZW50aXR5IGJlYW4gb3IgZGVwZW5kZW50IG9iamVjdCBjbGFzcyBmb3Igd2hpY2ggdGhlIHF1ZXJ5IGlzIHNwZWNpZmllZC4KLQkgKiBAaW52YXJpYW50IFRoZSBlamItcWwgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYWxsIHF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMLgotCSAqIAotCSAqIEV4YW1wbGU6Ci0JICogPHF1ZXJ5PgotCSAqIDxxdWVyeS1tZXRob2Q+Ci0JICogPG1ldGhvZC1uYW1lPmVqYlNlbGVjdFBlbmRpbmdMaW5laXRlbXM8Ly9tZXRob2QtbmFtZT4KLQkgKiA8bWV0aG9kLXBhcmFtcy8vPgotCSAqIDwvL3F1ZXJ5LW1ldGhvZD4KLQkgKiA8ZWpiLXFsPlNFTEVDVCBFTlRJVFkobCkKLQkgKiBGUk9NIExpbmVJdGVtcyBsCi0JICogV0hFUkUgbC5zaGlwcGVkIGlzIEZBTFNFCi0JICogPC8vZWpiLXFsPgotCSAqIDwvL3F1ZXJ5PgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWpiUUwoKSB7Ci0JCXJldHVybiBlamJRTDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJRTChTdHJpbmcgbmV3RWpiUUwpIHsKLQkJU3RyaW5nIG9sZEVqYlFMID0gZWpiUUw7Ci0JCWVqYlFMID0gbmV3RWpiUUw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTCwgb2xkRWpiUUwsIGVqYlFMKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvIHNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSB0aGF0IGlzIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgc2VsZWN0IG1ldGhvZCBpcyB0byBiZSBtYXBwZWQgdG8gYW4gRUpCTG9jYWxPYmplY3Qgb3IgRUpCT2JqZWN0IHR5cGUuICBUaGUgdmFsdWUgb2YgdGhlIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCwgaWYgc3BlY2lmaWVkIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcuCi0JICovCi0JcHVibGljIFJldHVyblR5cGVNYXBwaW5nIGdldFJldHVyblR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gcmV0dXJuVHlwZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZU1hcHBpbmcoUmV0dXJuVHlwZU1hcHBpbmcgbmV3UmV0dXJuVHlwZU1hcHBpbmcpIHsKLQkJUmV0dXJuVHlwZU1hcHBpbmcgb2xkUmV0dXJuVHlwZU1hcHBpbmcgPSByZXR1cm5UeXBlTWFwcGluZzsKLQkJcmV0dXJuVHlwZU1hcHBpbmcgPSBuZXdSZXR1cm5UeXBlTWFwcGluZyA9PSBudWxsID8gUkVUVVJOX1RZUEVfTUFQUElOR19FREVGQVVMVCA6IG5ld1JldHVyblR5cGVNYXBwaW5nOwotCQlib29sZWFuIG9sZFJldHVyblR5cGVNYXBwaW5nRVNldCA9IHJldHVyblR5cGVNYXBwaW5nRVNldDsKLQkJcmV0dXJuVHlwZU1hcHBpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fUkVUVVJOX1RZUEVfTUFQUElORywgb2xkUmV0dXJuVHlwZU1hcHBpbmcsIHJldHVyblR5cGVNYXBwaW5nLCAhb2xkUmV0dXJuVHlwZU1hcHBpbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXR1cm5UeXBlTWFwcGluZygpIHsKLQkJUmV0dXJuVHlwZU1hcHBpbmcgb2xkUmV0dXJuVHlwZU1hcHBpbmcgPSByZXR1cm5UeXBlTWFwcGluZzsKLQkJYm9vbGVhbiBvbGRSZXR1cm5UeXBlTWFwcGluZ0VTZXQgPSByZXR1cm5UeXBlTWFwcGluZ0VTZXQ7Ci0JCXJldHVyblR5cGVNYXBwaW5nID0gUkVUVVJOX1RZUEVfTUFQUElOR19FREVGQVVMVDsKLQkJcmV0dXJuVHlwZU1hcHBpbmdFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fUkVUVVJOX1RZUEVfTUFQUElORywgb2xkUmV0dXJuVHlwZU1hcHBpbmcsIFJFVFVSTl9UWVBFX01BUFBJTkdfRURFRkFVTFQsIG9sZFJldHVyblR5cGVNYXBwaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmV0dXJuVHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiByZXR1cm5UeXBlTWFwcGluZ0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWV0aG9kIChEQi8vU1IvL0NNLSJvbiB0aGUgaG9tZSIpIGZvciBhIGZpbmRlciBvcgotCSAqIHNlbGVjdCBxdWVyeS4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JICogbWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzIG9yIGEgc2VsZWN0IG1ldGhvZCBpbgotCSAqIHRoZSBkZXBlbmRlbnQgb2JqZWN0IGNsYXNzLgotCSAqIAotCSAqIEVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi0JICogbWV0aG9kLXBhcmFtcyBlbGVtZW50LgotCSAqIAotCSAqIFVzZWQgaW46IHF1ZXJ5Ci0JICogCi0JICogRXhhbXBsZToKLQkgKiAKLQkgKiBFeGFtcGxlOgotCSAqIDxxdWVyeT4KLQkgKiAgIDxkZXNjcmlwdGlvbj5NZXRob2QgZmluZHMgbGFyZ2Ugb3JkZXJzPC8vZGVzY3JpcHRpb24+Ci0JICogICA8cXVlcnktbWV0aG9kPgotCSAqICAgICA8bWV0aG9kLW5hbWU+ZmluZExhcmdlT3JkZXJzPC8vbWV0aG9kLW5hbWU+Ci0JICogICAgIDxtZXRob2QtcGFyYW1zPjwvL21ldGhvZC1wYXJhbXM+Ci0JICogICA8Ly9xdWVyeS1tZXRob2Q+Ci0JICogICA8ZWpiLXFsPlNFTEVDVCBFTlRJVFkobykgRlJPTSBPcmRlciBvIFdIRVJFIG8uYW1vdW50ICZndDsgMTAwMDwvL2VqYi1xbD4KLQkgKiA8Ly9xdWVyeT4KLQkgKi8KLQlwdWJsaWMgUXVlcnlNZXRob2QgZ2V0UXVlcnlNZXRob2QoKSB7Ci0JCXJldHVybiBxdWVyeU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRRdWVyeU1ldGhvZChRdWVyeU1ldGhvZCBuZXdRdWVyeU1ldGhvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlRdWVyeU1ldGhvZCBvbGRRdWVyeU1ldGhvZCA9IHF1ZXJ5TWV0aG9kOwotCQlxdWVyeU1ldGhvZCA9IG5ld1F1ZXJ5TWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIG9sZFF1ZXJ5TWV0aG9kLCBuZXdRdWVyeU1ldGhvZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVlcnlNZXRob2QoUXVlcnlNZXRob2QgbmV3UXVlcnlNZXRob2QpIHsKLQkJaWYgKG5ld1F1ZXJ5TWV0aG9kICE9IHF1ZXJ5TWV0aG9kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChxdWVyeU1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClxdWVyeU1ldGhvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZLCBRdWVyeU1ldGhvZC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3UXVlcnlNZXRob2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UXVlcnlNZXRob2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWSwgUXVlcnlNZXRob2QuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UXVlcnlNZXRob2QobmV3UXVlcnlNZXRob2QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9ELCBuZXdRdWVyeU1ldGhvZCwgbmV3UXVlcnlNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWSkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RW50aXR5KENvbnRhaW5lck1hbmFnZWRFbnRpdHkgbmV3RW50aXR5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdFbnRpdHksIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWSwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eShDb250YWluZXJNYW5hZ2VkRW50aXR5IG5ld0VudGl0eSkgewotCQlpZiAobmV3RW50aXR5ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWSAmJiBuZXdFbnRpdHkgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdFbnRpdHkpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUVVFUklFUywgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFbnRpdHkobmV3RW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWSwgbmV3RW50aXR5LCBuZXdFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9EOgotCQkJCWlmIChxdWVyeU1ldGhvZCAhPSBudWxsKQotCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcXVlcnlNZXRob2QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIG51bGwsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFF1ZXJ5TWV0aG9kKChRdWVyeU1ldGhvZClvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWToKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RW50aXR5KChDb250YWluZXJNYW5hZ2VkRW50aXR5KW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UXVlcnlNZXRob2QobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRFbnRpdHkobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19FTlRJVFk6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTLCBDb250YWluZXJNYW5hZ2VkRW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRUpCX1FMOgotCQkJCXJldHVybiBnZXRFamJRTCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19SRVRVUk5fVFlQRV9NQVBQSU5HOgotCQkJCXJldHVybiBnZXRSZXR1cm5UeXBlTWFwcGluZygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldFF1ZXJ5TWV0aG9kKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWToKLQkJCQlyZXR1cm4gZ2V0RW50aXR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19FSkJfUUw6Ci0JCQkJc2V0RWpiUUwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19SRVRVUk5fVFlQRV9NQVBQSU5HOgotCQkJCXNldFJldHVyblR5cGVNYXBwaW5nKChSZXR1cm5UeXBlTWFwcGluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJc2V0UXVlcnlNZXRob2QoKFF1ZXJ5TWV0aG9kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWToKLQkJCQlzZXRFbnRpdHkoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19FSkJfUUw6Ci0JCQkJc2V0RWpiUUwoRUpCX1FMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1JFVFVSTl9UWVBFX01BUFBJTkc6Ci0JCQkJdW5zZXRSZXR1cm5UeXBlTWFwcGluZygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9EOgotCQkJCXNldFF1ZXJ5TWV0aG9kKChRdWVyeU1ldGhvZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWToKLQkJCQlzZXRFbnRpdHkoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTDoKLQkJCQlyZXR1cm4gRUpCX1FMX0VERUZBVUxUID09IG51bGwgPyBlamJRTCAhPSBudWxsIDogIUVKQl9RTF9FREVGQVVMVC5lcXVhbHMoZWpiUUwpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19SRVRVUk5fVFlQRV9NQVBQSU5HOgotCQkJCXJldHVybiBpc1NldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRDoKLQkJCQlyZXR1cm4gcXVlcnlNZXRob2QgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRU5USVRZOgotCQkJCXJldHVybiBnZXRFbnRpdHkoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlamJRTDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWpiUUwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJldHVyblR5cGVNYXBwaW5nOiAiKTsKLQkJaWYgKHJldHVyblR5cGVNYXBwaW5nRVNldCkgcmVzdWx0LmFwcGVuZChyZXR1cm5UeXBlTWFwcGluZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeU1ldGhvZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODIxNWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnlNZXRob2Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUXVlcnlNZXRob2RJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBRdWVyeU1ldGhvZCB7Ci0KLQlwdWJsaWMgUXVlcnlNZXRob2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuUVVFUllfTUVUSE9EOwotCX0KLQotLyoqCi0gKiBGb3IgUXVlcnkgbWV0aG9kcywgdGhlaXIgZW50ZXJwcmlzZSBiZWFuIG11c3QgYmUgZGVyaXZlZC4KLSAqIEl0IGlzIHRoZSBFbnRpdHkgd2hpY2ggY29udGFpbnMgdGhlIFF1ZXJ5LgotICovCi1wdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwcmlzZUJlYW4oKSB7Ci0JaWYgKGVudGVycHJpc2VCZWFuID09IG51bGwpIHsKLQkJaWYgKGdldFF1ZXJ5KCkgIT0gbnVsbCkKLQkJCWVudGVycHJpc2VCZWFuID0gZ2V0UXVlcnkoKS5nZXRFbnRpdHkoKTsKLQl9Ci0JcmV0dXJuIGVudGVycHJpc2VCZWFuOwotfQotLyoqCi0gKiBBbnN3ZXIgdGhlIG1ldGhvZCBmb3Igd2hpY2ggdGhpcyBtZXRob2QgZWxlbWVudCBhcHBsaWVzIGluIHRoZSBIT01FIElOVEVSRkFDRS4KLSAqLwotcHJvdGVjdGVkIE1ldGhvZCBnZXRIb21lTWV0aG9kKCkgewotCU1ldGhvZCByZXN1bHQgPSBudWxsOwotCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBnZXRFbnRlcnByaXNlQmVhbigpLmdldEhvbWVJbnRlcmZhY2UoKTsKLQlpZiAoamF2YUNsYXNzICE9IG51bGwpIHsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBnZXROYW1lKCkudHJpbSgpOwotCQlpZiAoaGFzTWV0aG9kUGFyYW1zKCkpCi0JCQlyZXN1bHQgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kRXh0ZW5kZWQobWV0aG9kTmFtZSwgZ2V0TWV0aG9kUGFyYW1zKCkpOwotCQllbHNlIHsKLQkJCUxpc3QgbWV0aG9kcyA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWROYW1lZChtZXRob2ROYW1lKTsKLQkJCWlmICghbWV0aG9kcy5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0ID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQoMCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qKgotICogQW5zd2VyIHRoZSBtZXRob2QgZm9yIHdoaWNoIHRoaXMgbWV0aG9kIGVsZW1lbnQgYXBwbGllcyBpbiB0aGUgTE9DQUwgSE9NRSBJTlRFUkZBQ0UuCi0gKi8KLXByb3RlY3RlZCBNZXRob2QgZ2V0TG9jYWxIb21lTWV0aG9kKCkgewotCU1ldGhvZCByZXN1bHQgPSBudWxsOwotCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBnZXRFbnRlcnByaXNlQmVhbigpLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCWlmIChqYXZhQ2xhc3MgIT0gbnVsbCkgewotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldE5hbWUoKS50cmltKCk7Ci0JCWlmIChoYXNNZXRob2RQYXJhbXMoKSkKLQkJCXJlc3VsdCA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBnZXRNZXRob2RQYXJhbXMoKSk7Ci0JCWVsc2UgewotCQkJTGlzdCBtZXRob2RzID0gamF2YUNsYXNzLmdldFB1YmxpY01ldGhvZHNFeHRlbmRlZE5hbWVkKG1ldGhvZE5hbWUpOwotCQkJaWYgKCFtZXRob2RzLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQgPSAoTWV0aG9kKSBtZXRob2RzLmdldCgwKTsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLQotcHJvdGVjdGVkIHZvaWQgYWRkTWV0aG9kSWZOb3ROdWxsKExpc3QgYUxpc3QsIE1ldGhvZCBhTWV0aG9kKSB7Ci0JaWYgKGFNZXRob2QgIT0gbnVsbCkKLQkJYUxpc3QuYWRkKGFNZXRob2QpOwotfQotLyoqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHplcm8tbGVuZ3RoIE1ldGhvZFtdIGlmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIG1ldGhvZAotICogb24gdGhlIGhvbWUsIGxvY2FsIGhvbWUsIG9yIGJlYW4gY2xhc3MuICBJdCB3aWxsIHJldHVybiBleGFjdGx5IG9uZSBtZXRob2QKLSAqIGZvciBlamJTZWxlY3QsIGFuZCBvbmUgb3IgdHdvIG1ldGhvZHMgZm9yIGZpbmRlcnMuICBUaGUgdHdvIG1ldGhvZCBjYXNlIG9jY3VycwotICogd2hlbiB0aGUgc2FtZSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgZXhpc3RzIG9uIGJvdGggdGhlIGhvbWUgYW5kCi0gKiBsb2NhbCBob21lLgotICovCi1wdWJsaWMgTWV0aG9kW10gZ2V0TWV0aG9kcygpIHsKLQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMik7Ci0JaWYgKGdldE5hbWUoKS5zdGFydHNXaXRoKCJlamJTZWxlY3QiKSkgeyAvLyROT04tTkxTLTEkCi0JCWFkZE1ldGhvZElmTm90TnVsbChyZXN1bHQsIGdldFNlbGVjdE1ldGhvZCgpKTsKLQl9IGVsc2UgewotCQlhZGRNZXRob2RJZk5vdE51bGwocmVzdWx0LCBnZXRIb21lTWV0aG9kKCkpOwotCQlhZGRNZXRob2RJZk5vdE51bGwocmVzdWx0LCBnZXRMb2NhbEhvbWVNZXRob2QoKSk7Ci0JfQotCXJldHVybiAoTWV0aG9kW10pcmVzdWx0LnRvQXJyYXkobmV3IE1ldGhvZFtyZXN1bHQuc2l6ZSgpXSk7Ci19Ci0vKioKLSAqIEFuc3dlciB0aGUgbWV0aG9kIGZvciB3aGljaCB0aGlzIG1ldGhvZCBlbGVtZW50IGFwcGxpZXMgaW4gdGhlIEhPTUUgSU5URVJGQUNFLgotICovCi1wcm90ZWN0ZWQgTWV0aG9kIGdldFNlbGVjdE1ldGhvZCgpIHsKLQlNZXRob2QgcmVzdWx0ID0gbnVsbDsKLQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRFamJDbGFzcygpOwotCVN0cmluZyBtZXRob2ROYW1lID0gZ2V0TmFtZSgpLnRyaW0oKTsKLQlpZiAoaGFzTWV0aG9kUGFyYW1zKCkpCi0JCXJlc3VsdCA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RFeHRlbmRlZChuYW1lLCBnZXRNZXRob2RQYXJhbXMoKSk7Ci0JZWxzZSB7Ci0JCUxpc3QgbWV0aG9kcyA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWROYW1lZChtZXRob2ROYW1lKTsKLQkJaWYgKCFtZXRob2RzLmlzRW1wdHkoKSkKLQkJCXJlc3VsdCA9IChNZXRob2QpIG1ldGhvZHMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFF1ZXJ5IGdldFF1ZXJ5KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlkpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFF1ZXJ5KWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRRdWVyeShRdWVyeSBuZXdRdWVyeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3UXVlcnksIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWSwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5KFF1ZXJ5IG5ld1F1ZXJ5KSB7Ci0JCWlmIChuZXdRdWVyeSAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlkgJiYgbmV3UXVlcnkgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdRdWVyeSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1F1ZXJ5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1F1ZXJ5KS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIFF1ZXJ5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFF1ZXJ5KG5ld1F1ZXJ5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWSwgbmV3UXVlcnksIG5ld1F1ZXJ5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlk6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFF1ZXJ5KChRdWVyeSlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXJldHVybiBiYXNpY1NldFF1ZXJ5KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIFF1ZXJ5LmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlk6Ci0JCQkJcmV0dXJuIGdldFF1ZXJ5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXNldFF1ZXJ5KChRdWVyeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXNldFF1ZXJ5KChRdWVyeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXJldHVybiBnZXRRdWVyeSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIFlvdSBzaG91bGQgdXNlIGdldENsaWVudFR5cGVKYXZhQ2xhc3NlcyB0byBlbnN1cmUgeW91IHBpY2sgdXAgYm90aCBob21lIGludGVyZmFjZXMKLQkgKiBpZiB0aGV5IGV4aXN0LgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0VHlwZUphdmFDbGFzcygpIHsKLQkJSmF2YUNsYXNzW10gcmVzdWx0ID0gZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID4gMCkKLQkJCXJldHVybiByZXN1bHRbMF07Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgSmF2YUNsYXNzZXMgb2YgYWxsIHRoZSBpbnRlcmZhY2VzIG9yIGJlYW4gY2xhc3MgdGhhdCB0aGlzIG1ldGhvZCBpcyBwcmVzZW50ZWQKLQkgKiB0byBhIGNsaWVudC4gIElmIGl0IGlzIGFuIGVqYlNlbGVjdC4uLiBvbiB0aGUgYmVhbiBjbGFzcyB3aWxsIGJlIHJldHVybmVkIGFuZCBpZgotCSAqIGl0IGlmIGEgZmluZCBib3RoIGhvbWUgaW50ZXJmYWNlcyB3aWxsIGJlIHJldHVybmVkIGlmIHRoZXkgZXhpc3QuCi0JICogCi0JICogTWF5IHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3NbXSBnZXRDbGllbnRUeXBlSmF2YUNsYXNzZXMoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCB8fCBnZXRFbnRlcnByaXNlQmVhbigpID09IG51bGwpIHJldHVybiBudWxsOwotCQlFbnRlcnByaXNlQmVhbiBlamIgPSBnZXRFbnRlcnByaXNlQmVhbigpOwotCQlpZiAoZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoU0VMRUNUX1BSRUZJWCkpCi0JCQlyZXR1cm4gbmV3IEphdmFDbGFzc1tde2VqYi5nZXRFamJDbGFzcygpfTsKLQkJLy9OZXh0IGNhc2UgaXMgdG91Z2hlciBzaW5jZSB5b3UgY291bGQgaGF2ZSBib3RoIGEgcmVtb3ZlIGFuZCBsb2NhbCBjbGllbnQKLQkJLy9XZSB3YW50IHRvIHJldHVybiB0aGUgaG9tZSBpbnRlcmZhY2UgaW4gdGhpcyBjYXNlLgotCQlpZiAoZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRklORF9QUkVGSVgpKSB7Ci0JCQlpZiAoZWpiLmhhc0xvY2FsQ2xpZW50KCkgJiYgIWVqYi5oYXNSZW1vdGVDbGllbnQoKSkKLQkJCQlyZXR1cm4gbmV3IEphdmFDbGFzc1tde2dldEVudGVycHJpc2VCZWFuKCkuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCl9OwotCQkJaWYgKGVqYi5oYXNSZW1vdGVDbGllbnQoKSAmJiAhZWpiLmhhc0xvY2FsQ2xpZW50KCkpCi0JCQkJcmV0dXJuIG5ldyBKYXZhQ2xhc3NbXXtlamIuZ2V0SG9tZUludGVyZmFjZSgpfTsKLQkJCWlmIChlamIuaGFzUmVtb3RlQ2xpZW50KCkgJiYgZWpiLmhhc0xvY2FsQ2xpZW50KCkpCi0JCQkJcmV0dXJuIG5ldyBKYXZhQ2xhc3NbXXtlamIuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCksIGVqYi5nZXRIb21lSW50ZXJmYWNlKCl9OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmZiODRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGVzICh0aGlzIGluY2x1ZGVzIGluaGVyaXRlZCAKLSAqIGF0dHJpYnV0ZXMpIGZyb20gdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gdGhhdCBpcyBwYXNzZWQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IGF0dHJpYnV0ZSB0aGF0IGlzIG5vdCBwb2ludGVkIHRvIGJ5IGFuIEVqYlJlbGF0aW9uc2hpcFJvbGUuCi0gKiBUaHVzLCB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGNvbnRhaW4gYXR0cmlidXRlcyAoaW5jbHVkaW5nIGluaGVyaXRlZCBhdHRyaWJ1dGVzKSB0aGF0IG9ubHkKLSAqIGJlbG9uZyB0byByb2xlcy4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDY6NDY6MDggUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiByb2xlcyBmcm9tIGNtcEV4dC4KLSAqLwotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNvdXJjZVJvbGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7IAotCSAgIHJldHVybiBnZXRSZWxhdGlvbnNoaXBSb2xlcyhjbXApOyAKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNTozNjowMCBQTSkKLSAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5SZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyCi0gKi8KLXB1YmxpYyBzdGF0aWMgUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlcigpOwotCXJldHVybiBzaW5nbGV0b247Ci19Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcHNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTVmM2I2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcHNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLQotLyoqCi0gKiBUaGUgcmVsYXRpb25zaGlwcyBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4gd2hpY2ggZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25zaGlwc0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZWxhdGlvbnNoaXBzIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiUmVsYXRpb25zID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgUmVsYXRpb25zaGlwc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5SRUxBVElPTlNISVBTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGNvbGxlY3Rpb24gb2YgcmVsYXRpb25zaGlwcy4KLQkgKiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFSkJKYXIgZ2V0RWpiSmFyKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEVKQkphcillQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RWpiSmFyKEVKQkphciBuZXdFamJKYXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0VqYkphciwgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiSmFyKEVKQkphciBuZXdFamJKYXIpIHsKLQkJaWYgKG5ld0VqYkphciAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVIgJiYgbmV3RWpiSmFyICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RWpiSmFyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RWpiSmFyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0VqYkphcikuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVCwgRUpCSmFyLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVqYkphcihuZXdFamJKYXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSLCBuZXdFamJKYXIsIG5ld0VqYkphcikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkCi0JICogcmVsYXRpb25zaGlwcy4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RWpiUmVsYXRpb25zKCkgewotCQlpZiAoZWpiUmVsYXRpb25zID09IG51bGwpIHsKLQkJCWVqYlJlbGF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KEVKQlJlbGF0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVCk7Ci0JCX0KLQkJcmV0dXJuIGVqYlJlbGF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVI6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEVqYkphcigoRUpCSmFyKW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVsYXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RWpiSmFyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWxhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQX0xJU1QsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSOgotCQkJCXJldHVybiBnZXRFamJKYXIoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCXJldHVybiBnZXRFamJSZWxhdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVI6Ci0JCQkJc2V0RWpiSmFyKChFSkJKYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCWdldEVqYlJlbGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVsYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX0pBUjoKLQkJCQlzZXRFamJKYXIoKEVKQkphciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUzoKLQkJCQlnZXRFamJSZWxhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSOgotCQkJCXJldHVybiBnZXRFamJKYXIoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6Ci0JCQkJcmV0dXJuIGVqYlJlbGF0aW9ucyAhPSBudWxsICYmICFlamJSZWxhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVxdWlyZWRMb2NhbFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3Y2I5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5FamJNb2R1bGVFeHRlbnNpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEwLzE1LzIwMDEgMTE6MzU6MDAgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlciBleHRlbmRzIEFic3RyYWN0UmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBSZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlciBzaW5nbGV0b247Ci1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0Um9sZXNUb0ZpbHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotICAgIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBtb2RIZWxwZXIgPSBnZXRFamJNb2R1bGVFeHRIZWxwZXIoY21wKTsKLQlpZihtb2RIZWxwZXIgIT0gbnVsbCkKLQkgIHJldHVybiBtb2RIZWxwZXIuZ2V0TG9jYWxSZWxhdGlvbnNoaXBSb2xlc19jbXAxMShjbXApOwotCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC82LzIwMDEgMTE6Mjc6MjUgQU0pCi0gKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuUmVxdWlyZWRMb2NhbFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIKLSAqLwotcHVibGljIHN0YXRpYyBSZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgUmVxdWlyZWRMb2NhbFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIoKTsKLQlyZXR1cm4gc2luZ2xldG9uOwotfQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmNlODIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgZXh0ZW5kcyBDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlciBzaW5nbGV0b247Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJOb3RjYWNoZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLSAgICAgICAgTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBnZXRSZWxhdGlvbnNoaXBSb2xlcyhjbXApLml0ZXJhdG9yKCk7Ci0gICAgICAgIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgcm9sZSA9IChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkQWRkRmlsdGVyZWRSZXN1bHQocm9sZSkpIHJvbGVzLmFkZChyb2xlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm9sZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIG11bHRpcGxpY2l0eSBmb3IgQGFSb2xlIGlzIHJlcXVpcmVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHNob3VsZEFkZEZpbHRlcmVkUmVzdWx0KENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIHsKLSAgICAgICAgcmV0dXJuIGFSb2xlLmlzUmVxdWlyZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzYvMjAwMSAxMToyNzoyNQotICAgICAqIEFNKQotICAgICAqIAotICAgICAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5SZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0gICAgICAgIGlmIChzaW5nbGV0b24gPT0gbnVsbCkgc2luZ2xldG9uID0gbmV3IFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlcigpOwotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JvbGVTaGFwZVN0cmF0ZWd5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Sb2xlU2hhcGVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk1YzFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JvbGVTaGFwZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuSVJvbGVTaGFwZVN0cmF0ZWd5OwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS82LzIwMDAgMTE6NDE6MzMgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSb2xlU2hhcGVTdHJhdGVneSBpbXBsZW1lbnRzIElSb2xlU2hhcGVTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYnVzeSA9IGZhbHNlOwotCXByb3RlY3RlZCBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGU7Ci0JcHJvdGVjdGVkIEFycmF5TGlzdCB2aXNpdGVkS2V5VHlwZXMgPSBuZXcgQXJyYXlMaXN0KDUpOwotLyoqCi0gKiBGbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgUm9sZVNoYXBlU3RyYXRlZ3koQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCXN1cGVyKCk7Ci0Jc2V0Um9sZShhUm9sZSk7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nIGFwcGVuZE5hbWUoU3RyaW5nIGZ1bGxOYW1lLCBTdHJpbmcgYWRkaXRpb25hbE5hbWUpIHsKLQlyZXR1cm4gZnVsbE5hbWUgKyBBVFRSSUJVVEVfTkFNRV9KT0lORVIgKyBhZGRpdGlvbmFsTmFtZTsKLX0KLXByb3RlY3RlZCBib29sZWFuIGNhbkNvbnRpbnVlKCkgewotCXJldHVybiAhYnVzeSAmJiByb2xlLmlzRm9yd2FyZCgpICYmIHJvbGUuZ2V0TmFtZSgpICE9IG51bGw7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBjYW5Db21wdXRlTmFtZXMoKSB7Ci0JLy9yZXR1cm4gZ2V0Um9sZSgpLmdldE9wcG9zaXRlKCkgIT0gbnVsbDsKLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzE2LzAwIDk6MTk6MjcgUE0pCi0gKiBAcmV0dXJuIENvbW1vblJlbGF0aW9uc2hpcFJvbGUKLSAqLwotcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZSgpIHsKLQlyZXR1cm4gcm9sZTsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzE2LzAwIDk6MTk6MjcgUE0pCi0gKiBAcmV0dXJuIENvbW1vblJlbGF0aW9uc2hpcFJvbGUKLSAqLwotCi1wdWJsaWMgYm9vbGVhbiBpc0ZsYXQgKCkgewotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBib29sZWFuIGlzUm91bmQgKCkgewotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogQ3JlYXRlcyBhbiBhcHBlbmRlZCBuYW1lIHdoaWxlIHVwcGVyY2FzaW5nIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIHNlY29uZE5hbWUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VKYXZhTmFtZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgc2Vjb25kTmFtZSkgewotCVN0cmluZ0J1ZmZlciBuYW1lQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmaXJzdE5hbWUpOwotCW5hbWVCdWZmZXIuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzZWNvbmROYW1lLmNoYXJBdCgwKSkpOwotCWZvciAoaW50IGkgPSAxOyBpIDwgc2Vjb25kTmFtZS5sZW5ndGgoKTsgaSsrKQotCQluYW1lQnVmZmVyLmFwcGVuZChzZWNvbmROYW1lLmNoYXJBdChpKSk7Ci0JcmV0dXJuIG5hbWVCdWZmZXIudG9TdHJpbmcoKTsKLX0KLXB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoTGlzdCByb2xlQXR0cmlidXRlcykgewotCWlmIChjYW5Db250aW51ZSgpKSB7Ci0JCWJ1c3kgPSB0cnVlOwotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGdldFJvbGUoKS5nZXROYW1lKCk7Ci0JCUxpc3QgY29tcHV0ZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGNhbkNvbXB1dGVOYW1lcygpKXsKLQkJCXZpc2l0ZWRLZXlUeXBlcy5jbGVhcigpOwotCQkJcmVjb25jaWxlQXR0cmlidXRlcyhnZXRSb2xlKCksIGF0dHJpYnV0ZU5hbWUsIHJvbGVBdHRyaWJ1dGVzLCBjb21wdXRlZE5hbWVzKTsKLQkJfQotCQlyZW1vdmVFeHRyYUF0dHJpYnV0ZXMoY29tcHV0ZWROYW1lcyk7Ci0JCWJ1c3kgPSBmYWxzZTsKLQl9Ci19Ci0vKioKLSAqIGdldEZpZWxkcyBtZXRob2QgY29tbWVudC4KLSAqLwotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCBhTGlzdCwgTGlzdCBjb21wdXRlZE5hbWVzKTsKLS8qKgotICogUmVtb3ZlIGF0dHJpYnV0ZXMgZnJvbSBvdXIgcm9sZSB3aG9zZSBuYW1lIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGxpc3Qgb2YKLSAqIEBjb21wdXRlZE5hbWVzLiAgQWxzbywgcmVtb3ZlIGZyb20gdGhlIHJvbGUncyBzb3VyY2UgRUpCLgotICovCi1wcm90ZWN0ZWQgdm9pZCByZW1vdmVFeHRyYUF0dHJpYnV0ZXMoTGlzdCBjb21wdXRlZE5hbWVzKSB7Ci0JaWYgKCFnZXRSb2xlKCkuZ2V0QXR0cmlidXRlcygpLmlzRW1wdHkoKSkgewotCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBnZXRSb2xlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gZ2V0Um9sZSgpLmdldFNvdXJjZUVudGl0eSgpOwotCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKSBpdC5uZXh0KCk7Ci0JCQlpZiAoY29tcHV0ZWROYW1lcy5jb250YWlucyhhdHRyaWJ1dGUuZ2V0TmFtZSgpKSkKLQkJCQljb250aW51ZTsKLQkJCWl0LnJlbW92ZSgpOwotCQkJY21wLmdldEtleUF0dHJpYnV0ZXMoKS5yZW1vdmUoYXR0cmlidXRlKTsKLQkJCWNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLnJlbW92ZShhdHRyaWJ1dGUpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMTYvMDAgOToxOToyNyBQTSkKLSAqIEBwYXJhbSBuZXdSb2xlIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LkVqYlJlbGF0aW9uc2hpcFJvbGUKLSAqLwotcHVibGljIHZvaWQgc2V0Um9sZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIG5ld1JvbGUpIHsKLQlyb2xlID0gbmV3Um9sZTsKLX0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUm9sZVNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JvbGVTb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGVlYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUm9sZVNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLQotLyoqCi0gKiBEZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gZW50aXR5IGJlYW4uCi0gKiBAaW52YXJpYW50IFRoZSBjb250ZW50IG9mIGVhY2ggcm9sZS1zb3VyY2UgZWxlbWVudCBzaGFsbCByZWZlciB0byBhbiBleGlzdGluZyBlbnRpdHkgYmVhbiwgZW50aXR5IGJlYW4gcmVmZXJlbmNlLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNvdXJjZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBSb2xlU291cmNlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHlCZWFuID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgUm9sZVNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5ST0xFX1NPVVJDRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fUk9MRSkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRUpCUmVsYXRpb25zaGlwUm9sZSllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Um9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIG5ld1JvbGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1JvbGUsIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEUsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgbmV3Um9sZSkgewotCQlpZiAobmV3Um9sZSAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFICYmIG5ld1JvbGUgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdSb2xlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3Um9sZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSb2xlKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJvbGUobmV3Um9sZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFLCBuZXdSb2xlLCBuZXdSb2xlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0RW50aXR5QmVhbigpIHsKLQkJaWYgKGVudGl0eUJlYW4gIT0gbnVsbCAmJiBlbnRpdHlCZWFuLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRFbnRpdHlCZWFuID0gKEludGVybmFsRU9iamVjdCllbnRpdHlCZWFuOwotCQkJZW50aXR5QmVhbiA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KWVSZXNvbHZlUHJveHkob2xkRW50aXR5QmVhbik7Ci0JCQlpZiAoZW50aXR5QmVhbiAhPSBvbGRFbnRpdHlCZWFuKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fRU5USVRZX0JFQU4sIG9sZEVudGl0eUJlYW4sIGVudGl0eUJlYW4pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50aXR5QmVhbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiYXNpY0dldEVudGl0eUJlYW4oKSB7Ci0JCXJldHVybiBlbnRpdHlCZWFuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eUJlYW4oQ29udGFpbmVyTWFuYWdlZEVudGl0eSBuZXdFbnRpdHlCZWFuKSB7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2xkRW50aXR5QmVhbiA9IGVudGl0eUJlYW47Ci0JCWVudGl0eUJlYW4gPSBuZXdFbnRpdHlCZWFuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19FTlRJVFlfQkVBTiwgb2xkRW50aXR5QmVhbiwgZW50aXR5QmVhbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRSb2xlKChFSkJSZWxhdGlvbnNoaXBSb2xlKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFOgotCQkJCXJldHVybiBiYXNpY1NldFJvbGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fUk9MRToKLQkJCQlyZXR1cm4gZ2V0Um9sZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19FTlRJVFlfQkVBTjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVudGl0eUJlYW4oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbnRpdHlCZWFuKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFOgotCQkJCXNldFJvbGUoKEVKQlJlbGF0aW9uc2hpcFJvbGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fRU5USVRZX0JFQU46Ci0JCQkJc2V0RW50aXR5QmVhbigoQ29udGFpbmVyTWFuYWdlZEVudGl0eSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEU6Ci0JCQkJc2V0Um9sZSgoRUpCUmVsYXRpb25zaGlwUm9sZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0VOVElUWV9CRUFOOgotCQkJCXNldEVudGl0eUJlYW4oKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19FTlRJVFlfQkVBTjoKLQkJCQlyZXR1cm4gZW50aXR5QmVhbiAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU2Vzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NWNlZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU2Vzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKLQotLyoqCi0gKiBUaGUgc2Vzc2lvbiBlbGVtZW50IGRlY2xhcmVzIGFuIHNlc3Npb24gYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWU7IGEgbmFtZSBhc3NpZ25lZAotICogdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbjsgdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55OyB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueTsgdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzOyB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlOyB0aGUgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzOyBhbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzLiBUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkltcGwgZXh0ZW5kcyBFbnRlcnByaXNlQmVhbkltcGwgaW1wbGVtZW50cyBTZXNzaW9uLCBFbnRlcnByaXNlQmVhbiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCA9IFRyYW5zYWN0aW9uVHlwZS5CRUFOX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25UeXBlIHRyYW5zYWN0aW9uVHlwZSA9IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc2FjdGlvbiBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc2FjdGlvblR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vzc2lvblR5cGUoKSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXNzaW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTRVNTSU9OX1RZUEVfRURFRkFVTFQgPSBTZXNzaW9uVHlwZS5TVEFURUZVTF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFNlc3Npb25UeXBlIHNlc3Npb25UeXBlID0gU0VTU0lPTl9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU2Vzc2lvbiBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXNzaW9uVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludCgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3Mgc2VydmljZUVuZHBvaW50ID0gbnVsbDsKLQotCXB1YmxpYyBTZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLlNFU1NJT047Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXNzaW9uKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotCSAqIAotCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSBuZXdUcmFuc2FjdGlvblR5cGUpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJdHJhbnNhY3Rpb25UeXBlID0gbmV3VHJhbnNhY3Rpb25UeXBlID09IG51bGwgPyBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25UeXBlOwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cmFuc2FjdGlvblR5cGVFU2V0OwotCQl0cmFuc2FjdGlvblR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX19UUkFOU0FDVElPTl9UWVBFLCBvbGRUcmFuc2FjdGlvblR5cGUsIHRyYW5zYWN0aW9uVHlwZSwgIW9sZFRyYW5zYWN0aW9uVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblR5cGVFU2V0ID0gdHJhbnNhY3Rpb25UeXBlRVNldDsKLQkJdHJhbnNhY3Rpb25UeXBlID0gVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVDsKLQkJdHJhbnNhY3Rpb25UeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9fVFJBTlNBQ1RJT05fVFlQRSwgb2xkVHJhbnNhY3Rpb25UeXBlLCBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvblR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTZXNzaW9uVHlwZSBnZXRTZXNzaW9uVHlwZSgpIHsKLQkJcmV0dXJuIHNlc3Npb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlc3Npb25UeXBlKFNlc3Npb25UeXBlIG5ld1Nlc3Npb25UeXBlKSB7Ci0JCVNlc3Npb25UeXBlIG9sZFNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7Ci0JCXNlc3Npb25UeXBlID0gbmV3U2Vzc2lvblR5cGUgPT0gbnVsbCA/IFNFU1NJT05fVFlQRV9FREVGQVVMVCA6IG5ld1Nlc3Npb25UeXBlOwotCQlib29sZWFuIG9sZFNlc3Npb25UeXBlRVNldCA9IHNlc3Npb25UeXBlRVNldDsKLQkJc2Vzc2lvblR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX19TRVNTSU9OX1RZUEUsIG9sZFNlc3Npb25UeXBlLCBzZXNzaW9uVHlwZSwgIW9sZFNlc3Npb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U2Vzc2lvblR5cGUoKSB7Ci0JCVNlc3Npb25UeXBlIG9sZFNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7Ci0JCWJvb2xlYW4gb2xkU2Vzc2lvblR5cGVFU2V0ID0gc2Vzc2lvblR5cGVFU2V0OwotCQlzZXNzaW9uVHlwZSA9IFNFU1NJT05fVFlQRV9FREVGQVVMVDsKLQkJc2Vzc2lvblR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX19TRVNTSU9OX1RZUEUsIG9sZFNlc3Npb25UeXBlLCBTRVNTSU9OX1RZUEVfRURFRkFVTFQsIG9sZFNlc3Npb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U2Vzc2lvblR5cGUoKSB7Ci0JCXJldHVybiBzZXNzaW9uVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0JCWlmIChzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbCAmJiBzZXJ2aWNlRW5kcG9pbnQuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNlcnZpY2VFbmRwb2ludCA9IChJbnRlcm5hbEVPYmplY3Qpc2VydmljZUVuZHBvaW50OwotCQkJc2VydmljZUVuZHBvaW50ID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZFNlcnZpY2VFbmRwb2ludCk7Ci0JCQlpZiAoc2VydmljZUVuZHBvaW50ICE9IG9sZFNlcnZpY2VFbmRwb2ludCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VSVklDRV9FTkRQT0lOVCwgb2xkU2VydmljZUVuZHBvaW50LCBzZXJ2aWNlRW5kcG9pbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50KEphdmFDbGFzcyBuZXdTZXJ2aWNlRW5kcG9pbnQpIHsKLQkJSmF2YUNsYXNzIG9sZFNlcnZpY2VFbmRwb2ludCA9IHNlcnZpY2VFbmRwb2ludDsKLQkJc2VydmljZUVuZHBvaW50ID0gbmV3U2VydmljZUVuZHBvaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fX1NFUlZJQ0VfRU5EUE9JTlQsIG9sZFNlcnZpY2VFbmRwb2ludCwgc2VydmljZUVuZHBvaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1NFU1NJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0U2Vzc2lvblR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVJWSUNFX0VORFBPSU5UOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0U2VydmljZUVuZHBvaW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19UUkFOU0FDVElPTl9UWVBFOgotCQkJCXNldFRyYW5zYWN0aW9uVHlwZSgoVHJhbnNhY3Rpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VTU0lPTl9UWVBFOgotCQkJCXNldFNlc3Npb25UeXBlKChTZXNzaW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1NFUlZJQ0VfRU5EUE9JTlQ6Ci0JCQkJc2V0U2VydmljZUVuZHBvaW50KChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQl1bnNldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVNTSU9OX1RZUEU6Ci0JCQkJdW5zZXRTZXNzaW9uVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVJWSUNFX0VORFBPSU5UOgotCQkJCXNldFNlcnZpY2VFbmRwb2ludCgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VTU0lPTl9UWVBFOgotCQkJCXJldHVybiBpc1NldFNlc3Npb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VSVklDRV9FTkRQT0lOVDoKLQkJCQlyZXR1cm4gc2VydmljZUVuZHBvaW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0cmFuc2FjdGlvblR5cGU6ICIpOwotCQlpZiAodHJhbnNhY3Rpb25UeXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0cmFuc2FjdGlvblR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXNzaW9uVHlwZTogIik7Ci0JCWlmIChzZXNzaW9uVHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQoc2Vzc2lvblR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLlNlc3Npb24jc2V0U2VydmljZUVuZHBvaW50TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludE5hbWUoU3RyaW5nIHNlcnZpY2VFbmRwb2ludE5hbWUpIHsKLSAgICAgICAgZVNldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXNzaW9uX1NlcnZpY2VFbmRwb2ludCgpLCBjcmVhdGVDbGFzc1JlZihzZXJ2aWNlRW5kcG9pbnROYW1lKSk7Ci0gICAgfQotCS8qCi0JICogQHNlZSBFbnRlcnByaXNlQmVhbiNoYXNMb2NhbENsaWVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU2VydmljZUVuZHBvaW50KCkgewotCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50KCkgIT0gbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnROYW1lKCkgewotCQlnZXRTZXJ2aWNlRW5kcG9pbnQoKTsKLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludCA9PSBudWxsID8gbnVsbCA6IHNlcnZpY2VFbmRwb2ludC5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1N1cGVydHlwZUNNUEF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNTIzNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciB7Ci0vKioKLSAqIFN1cGVydHlwZUNNUEF0dHJpYnV0ZUZpbHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyKCkgewotCXN1cGVyKCk7Ci19Ci0KLXByb3RlY3RlZCBMaXN0IGZpbHRlck5vdGNhY2hlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgc3VwZXJ0eXBlID0gbnVsbDsKLQlFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZXh0ZW5zaW9uSGVscGVyID0gZ2V0RWpiTW9kdWxlRXh0SGVscGVyKGNtcCk7Ci0JaWYoZXh0ZW5zaW9uSGVscGVyICE9IG51bGwpCi0JICAgc3VwZXJ0eXBlID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpZXh0ZW5zaW9uSGVscGVyLmdldFN1cGVyVHlwZShjbXApOwotCWlmIChzdXBlcnR5cGUgPT0gbnVsbCkKLQkJcmV0dXJuIGdldFNvdXJjZUF0dHJpYnV0ZXMoY21wKTsKLQlyZXR1cm4gZmlsdGVyVXNpbmdTdXBlcnR5cGUoY21wLCBzdXBlcnR5cGUpOwotfQotLyoqCi0gKiBmaWx0ZXIgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXByb3RlY3RlZCBMaXN0IGZpbHRlclVzaW5nU3VwZXJ0eXBlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IHN1cGVydHlwZSkgewotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgc3VwZXJFbnRpdHkgPSBzdXBlcnR5cGU7Ci0JTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JSXRlcmF0b3IgaXQgPSBnZXRTb3VyY2VBdHRyaWJ1dGVzKGNtcCkuaXRlcmF0b3IoKTsKLQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlOwotCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJYXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSkgaXQubmV4dCgpOwotCQlpZiAoIWlzU3VwZXJ0eXBlQXR0cmlidXRlKHN1cGVyRW50aXR5LCBhdHRyaWJ1dGUpKQotCQkJcmVzdWx0LmFkZChhdHRyaWJ1dGUpOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3BlciBsaXN0IG9mIGF0dHJpYnV0ZXMgZnJvbSBjbXBFeHQuCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0IGdldFNvdXJjZUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIDsKLS8qKgotICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYW5BdHRyaWJ1dGUgYWxzbyBleGlzdHMgaW4gdGhlIHN1cGVyRW50aXR5LgotICovCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc1N1cGVydHlwZUF0dHJpYnV0ZShDb250YWluZXJNYW5hZ2VkRW50aXR5IHN1cGVyRW50aXR5LCBDTVBBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpIDsKLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QRmllbGREZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBGaWVsZERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2ZDA2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBGaWVsZERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsOwotCi0vKioKLSAqIEEgcGFyYW1ldGVyIGRlc2NyaXB0b3IgaXMgdXNlZCB0byBkZXNjcmliZSBhIG1ldGhvZCBwYXJhbWV0ZXIuCi0gKiBJdCBob2xkcyB0aGUgcGFyYW1ldGVyIG5hbWUgYW5kIHR5cGUuICBUaGUgdHlwZSBpcyBoZWxkIGluCi0gKiBKYXZhIHJlYWRhYmxlIGZvcm0gKG5vdCBhIHNpZ25hdHVyZSkuCi0gKi8KLXB1YmxpYyBjbGFzcyBDTVBGaWVsZERlc2NyaXB0b3IgewotCXByaXZhdGUgU3RyaW5nIGZUeXBlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmTmFtZSA9IG51bGw7Ci0vKioKLSAqIEphdmFQYXJhbWV0ZXJEZXNjcmlwdG9yIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gKi8KLXB1YmxpYyBDTVBGaWVsZERlc2NyaXB0b3IoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogQHJldHVybiB0aGUgcGFyYW1ldGVyIG5hbWUuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQlyZXR1cm4gZk5hbWU7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHBhcmFtZXRlciB0eXBlLgotICogQHJldHVybiBUaGUgcGFyYW1ldGVyIHR5cGUgaW4gSmF2YSByZWFkYWJsZSBmb3JtIChub3QgYSBzaWduYXR1cmUpCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQlyZXR1cm4gZlR5cGU7Ci19Ci0vKioKLSAqIFNldHMgdGhlIHBhcmFtZXRlciBuYW1lLgotICovCi1wdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JZk5hbWUgPSAobmV3TmFtZSA9PSBudWxsKSA/IG51bGwgOiBuZXdOYW1lLnRyaW0oKTsKLX0KLS8qKgotICogU2V0cyB0aGUgcGFyYW1ldGVyIHR5cGUuCi0gKiBAcGFyYW0gbmV3VHlwZSBUaGUgcGFyYW1ldGVyIG5hbWUgaW4gSmF2YSByZWFkYWJsZSBmb3JtIChub3QgYSBzaWduYXR1cmUpCi0gKi8KLXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQlmVHlwZSA9IChuZXdUeXBlID09IG51bGwpID8gbnVsbCA6IG5ld1R5cGUudHJpbSgpOwotfQotLyoqCi0gKiBSZXR1cm5zICJ0eXBlIG5hbWUiLiAgVGhlIHtAbGluayBKYXZhUGFyYW1ldGVyRGVzY3JpcHRvciNnZXRUeXBlKCl9Ci0gKiBhbmQge0BsaW5rIEphdmFQYXJhbWV0ZXJEZXNjcmlwdG9yI2dldE5hbWUoKX0gbWV0aG9kcyBhcmUgdXNlZAotICogdG8gYnVpbGQgdGhlIHJlc3VsdC4KLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0Jc2IuYXBwZW5kKGdldFR5cGUoKSk7Ci0Jc2IuYXBwZW5kKCcgJyk7Ci0Jc2IuYXBwZW5kKGdldE5hbWUoKSk7Ci0JcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NNUEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzQ1YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotCi1wdWJsaWMgY2xhc3MgQ01QSGVscGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVQgPSAiZ2V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wYXJhdG9yIG1ldGhvZENvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJLyoqCi0JCSAqIEBzZWUgQ29tcGFyYXRvciNjb21wYXJlKE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlNZXRob2QgbTEgPSAoTWV0aG9kKSBvMTsKLQkJCU1ldGhvZCBtMiA9IChNZXRob2QpIG8yOwotCQkJU3RyaW5nIHMxID0gbTEuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHMyID0gbTIuZ2V0TmFtZSgpOwotCQkJaWYgKHMxID09IG51bGwpCi0JCQkJcmV0dXJuICIiLmNvbXBhcmVUbyhzMik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBzMS5jb21wYXJlVG8oczIpOwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENNUEZpZWxkRXhpc3RUZXN0ZXIgewotCQlib29sZWFuIGlzRXhpc3RpbmcoRmllbGQgYUZpZWxkKTsKLQkJYm9vbGVhbiBpc0V4aXN0aW5nKE1ldGhvZCBhTWV0aG9kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01QSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgQ01QIDIuMCBiZWFucywgdGhlIGJlYW4gY2xhc3MgaXMgYWJzdHJhY3QgYW5kCi0JICogY29udGFpbnMgYWJzdHJhY3QgZ2V0L3NldCBtZXRob2RzIGZvciB0aGUgZmllbGRzCi0JICogVGhpcyBpbmZlcnMgdGhlIHRob3NlIGZpZWxkcyBiYXNlZCBvbiB0aGUgZ2V0L3NldCBtZXRob2RzCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCBvZiB7QGxpbmsgQ01QRmllbGREZXNjcmlwdG9yfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBdmFpbGFibGVDTVAyMEZpZWxkRGVzY3JpcHRvcnMoSmF2YUNsYXNzIGJlYW5DbGFzcykgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ01QMjBGaWVsZERlc2NyaXB0b3JzKGJlYW5DbGFzcywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEZvciBDTVAgMi4wIGJlYW5zLCB0aGUgYmVhbiBjbGFzcyBpcyBhYnN0cmFjdCBhbmQKLQkgKiBjb250YWlucyBhYnN0cmFjdCBnZXQvc2V0IG1ldGhvZHMgZm9yIHRoZSBmaWVsZHMKLQkgKiBUaGlzIGluZmVycyB0aGUgdGhvc2UgZmllbGRzIGJhc2VkIG9uIHRoZSBnZXQvc2V0IG1ldGhvZHMKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0IG9mIHtAbGluayBDTVBGaWVsZERlc2NyaXB0b3J9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEF2YWlsYWJsZUNNUDIwRmllbGREZXNjcmlwdG9ycyhKYXZhQ2xhc3MgYmVhbkNsYXNzLCBDTVBIZWxwZXIuQ01QRmllbGRFeGlzdFRlc3RlciBmaWVsZFRlc3RlcikgewotCQlpZiAoYmVhbkNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1hcCBnZXR0ZXJzID0gbmV3IEhhc2hNYXAoKTsJCi0JCUxpc3QgbWV0aG9kcyA9IGJlYW5DbGFzcy5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChtZXRob2RzLCBtZXRob2RDb21wYXJhdG9yKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgYU1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKGlzR2V0dGVyKGFNZXRob2QpICYmIGFNZXRob2QuaXNBYnN0cmFjdCgpICYmICFhTWV0aG9kLmlzU3RhdGljKCkgJiYgCi0JCQkJKGZpZWxkVGVzdGVyID09IG51bGwgfHwgZmllbGRUZXN0ZXIuaXNFeGlzdGluZyhhTWV0aG9kKSkpIAotCQkJCWdldHRlcnMucHV0KGdldEZpZWxkTmFtZShhTWV0aG9kKSwgYU1ldGhvZCk7Ci0JCQllbHNlIGlmIChpc1NldHRlcihhTWV0aG9kKSAmJiBhTWV0aG9kLmlzQWJzdHJhY3QoKSAmJiAhYU1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShhTWV0aG9kKTsKLQkJCQlNZXRob2QgZ2V0dGVyID0gKE1ldGhvZCkgZ2V0dGVycy5nZXQoZmllbGROYW1lKTsKLQkJCQlpZiAodHlwZXNBZ3JlZShnZXR0ZXIsIGFNZXRob2QpKSB7Ci0JCQkJCVN0cmluZyB0eXBlTmFtZSA9IGdldFJldHVyblR5cGVOYW1lKGdldHRlcik7Ci0JCQkJCWlmICh0eXBlTmFtZSAhPSBudWxsICYmIChmaWVsZFRlc3RlciA9PSBudWxsIHx8IGZpZWxkVGVzdGVyLmlzRXhpc3RpbmcoZ2V0dGVyKSkpCi0JCQkJCQlyZXN1bHQuYWRkKGNyZWF0ZUZpZWxkRGVzY3JpcHRvcihmaWVsZE5hbWUsIHR5cGVOYW1lKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkKLQkvKioKLQkgKiBGb3IgQ01QIDEuMSBiZWFucywgdGhlIGxpc3QgaXMgc2ltcGx5IHRoZSBmaWVsZHMsIGV4dGVuZGVkLCAKLQkgKiBvbiB0aGUgYmVhbiBjbGFzcwotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2Yge0BsaW5rIENNUEZpZWxkRGVzY3JpcHRvcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXZhaWxhYmxlQ01QMTFGaWVsZERlc2NyaXB0b3JzKEphdmFDbGFzcyBiZWFuQ2xhc3MpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNNUDExRmllbGREZXNjcmlwdG9ycyhiZWFuQ2xhc3MsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgQ01QIDEuMSBiZWFucywgdGhlIGxpc3QgaXMgc2ltcGx5IHRoZSBmaWVsZHMsIGV4dGVuZGVkLCAKLQkgKiBvbiB0aGUgYmVhbiBjbGFzcwotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2Yge0BsaW5rIENNUEZpZWxkRGVzY3JpcHRvcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXZhaWxhYmxlQ01QMTFGaWVsZERlc2NyaXB0b3JzKEphdmFDbGFzcyBiZWFuQ2xhc3MsIENNUEhlbHBlci5DTVBGaWVsZEV4aXN0VGVzdGVyIGZpZWxkVGVzdGVyKSB7Ci0JCWlmIChiZWFuQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IGZpZWxkcyA9IGJlYW5DbGFzcy5nZXRGaWVsZHNFeHRlbmRlZCgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpZWxkIGFGaWVsZCA9IChGaWVsZCkgZmllbGRzLmdldChpKTsKLQkJCWlmICghaXNQdWJsaWMoYUZpZWxkKSB8fCBhRmllbGQuaXNTdGF0aWMoKSB8fCBhRmllbGQuaXNUcmFuc2llbnQoKSB8fAotCQkJKGZpZWxkVGVzdGVyICE9IG51bGwgJiYgIWZpZWxkVGVzdGVyLmlzRXhpc3RpbmcoYUZpZWxkKSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbmFtZSA9IGFGaWVsZC5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZShhRmllbGQpOwotCQkJaWYgKHR5cGVOYW1lICE9IG51bGwgJiYgbmFtZSAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGQoY3JlYXRlRmllbGREZXNjcmlwdG9yKG5hbWUsIHR5cGVOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CQotCQotCS8qKgotCSAqIEdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNtcCBmaWVsZHMgZm9yIHRoZSBDTVAgYmVhbjsgaWYgdGhlIGJlYW4KLQkgKiBpcyB2MS4xLCB0aGlzIGlzIHRoZSBmaWVsZHMgb24gdGhlIGJlYW4gY2xhc3M7IGlmIGl0IGlzIDIuMCwgdGhpcyAKLQkgKiBpcyBkZWZpbmVkIGJ5IHRoZSBhYnN0cmFjdCBnZXQvc2V0IG1ldGhvZHMgb24gdGhlIGJlYW4gY2xhc3MKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0IG9mIHtAbGluayBDTVBGaWVsZERlc2NyaXB0b3J9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEF2YWlsYWJsZUNNUEZpZWxkRGVzY3JpcHRvcnMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXBCZWFuKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDTVBGaWVsZERlc2NyaXB0b3JzKGNtcEJlYW4sIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBjbXAgZmllbGRzIGZvciB0aGUgQ01QIGJlYW47IGlmIHRoZSBiZWFuCi0JICogaXMgdjEuMSwgdGhpcyBpcyB0aGUgZmllbGRzIG9uIHRoZSBiZWFuIGNsYXNzOyBpZiBpdCBpcyAyLjAsIHRoaXMgCi0JICogaXMgZGVmaW5lZCBieSB0aGUgYWJzdHJhY3QgZ2V0L3NldCBtZXRob2RzIG9uIHRoZSBiZWFuIGNsYXNzCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCBvZiB7QGxpbmsgQ01QRmllbGREZXNjcmlwdG9yfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBdmFpbGFibGVDTVBGaWVsZERlc2NyaXB0b3JzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wQmVhbiwgQ01QSGVscGVyLkNNUEZpZWxkRXhpc3RUZXN0ZXIgZmllbGRUZXN0ZXIpIHsKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGNtcEJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJaWYgKGJlYW5DbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXN3aXRjaChjbXBCZWFuLmdldFZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ6Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJsZUNNUDExRmllbGREZXNjcmlwdG9ycyhiZWFuQ2xhc3MsIGZpZWxkVGVzdGVyKTsgCi0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ6IGRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJsZUNNUDIwRmllbGREZXNjcmlwdG9ycyhiZWFuQ2xhc3MsIGZpZWxkVGVzdGVyKTsgCi0JCX0gIAotCX0KLQkKLQkvKioKLQkgKiBEb2VzIHRoZSBtZXRob2QgbmFtZSBzdGFydCB3aXRoICJnZXQiLCBhbmQgaXMgdGhlIG1ldGhvZCBhIHplcm8gYXJnCi0JICogbWV0aG9kLCB0aGF0IGRvZXMgbm90IHJldHVybiB2b2lkPwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0dldHRlcihNZXRob2QgYU1ldGhvZCkgewotCQlTdHJpbmcgbmFtZSA9IGFNZXRob2QuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbmFtZSAhPSBudWxsICYmCi0JCQluYW1lLnN0YXJ0c1dpdGgoR0VUKSAmJgotCQkJbmFtZS5sZW5ndGgoKSA+IDMgJiYKLQkJCWFNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoPT0wICYmCi0JCQkhYU1ldGhvZC5pc1ZvaWQoKTsJCQotCX0KLQkKLQkKLQkvKioKLQkgKiBEb2VzIHRoZSBtZXRob2QgbmFtZSBzdGFydCB3aXRoICJnZXQiLCBhbmQgaXMgdGhlIG1ldGhvZCBhIG9uZSBhcmcKLQkgKiBtZXRob2QsIHRoYXQgaXMgdm9pZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1NldHRlcihNZXRob2QgYU1ldGhvZCkgewotCQlTdHJpbmcgbmFtZSA9IGFNZXRob2QuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbmFtZSAhPSBudWxsICYmCi0JCQluYW1lLnN0YXJ0c1dpdGgoU0VUKSAmJgotCQkJbmFtZS5sZW5ndGgoKSA+IDMgJiYKLQkJCWFNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDEgJiYKLQkJCWFNZXRob2QuaXNWb2lkKCk7Ci0JfQotCQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RmllbGROYW1lKE1ldGhvZCBhTWV0aG9kKSB7Ci0JCWlmIChhTWV0aG9kID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlyZXR1cm4gZ2V0RmllbGROYW1lKGFNZXRob2QuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmllbGROYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCWlmIChtZXRob2ROYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihtZXRob2ROYW1lKTsKLQkJc2IuZGVsZXRlKDAsIDMpOwotCQljaGFyIGxvd2VyID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNiLmNoYXJBdCgwKSk7Ci0JCXNiLnNldENoYXJBdCgwLCBsb3dlcik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRSZXR1cm5UeXBlTmFtZShNZXRob2QgZ2V0dGVyKSB7Ci0JCWlmIChnZXR0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlKYXZhSGVscGVycyByZXRUeXBlID0gZ2V0dGVyLmdldFJldHVyblR5cGUoKTsKLQkJcmV0dXJuIGdldFR5cGVOYW1lKHJldFR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShGaWVsZCBhRmllbGQpIHsKLQkJaWYgKGFGaWVsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUphdmFIZWxwZXJzIHR5cGUgPSAoSmF2YUhlbHBlcnMpYUZpZWxkLmdldEVUeXBlKCk7Ci0JCXJldHVybiBnZXRUeXBlTmFtZSh0eXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoSmF2YUhlbHBlcnMgaGVscGVycykgewotCQlpZiAoaGVscGVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBoZWxwZXJzLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0JLyoqCi0JICogUHJlY29uZGl0aW9uOiBzZXR0ZXIgbXVzdCB0YWtlIG9uZSBwYXJhbWV0ZXIsIGFuZCBnZXR0ZXIgbXVzdCByZXR1cm4KLQkgKiBhIHR5cGUsIG5vdCB2b2lkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHR5cGVzQWdyZWUoTWV0aG9kIGdldHRlciwgTWV0aG9kIHNldHRlcikgewotCQlpZiAoZ2V0dGVyID09IG51bGwgfHwgZ2V0dGVyLmlzVm9pZCgpIHx8IHNldHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCUphdmFQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gc2V0dGVyLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQlpZiAocGFyYW1ldGVycy5sZW5ndGggIT0gMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlKYXZhUGFyYW1ldGVyIHBhcmFtID0gcGFyYW1ldGVyc1swXTsKLQkJcmV0dXJuIHBhcmFtLmdldEVUeXBlKCkgIT0gbnVsbCAmJgotCQkJCXBhcmFtLmdldEVUeXBlKCkgPT0gZ2V0dGVyLmdldFJldHVyblR5cGUoKTsJCQkJCQkJCi0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgQ01QRmllbGREZXNjcmlwdG9yIGNyZWF0ZUZpZWxkRGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUNNUEZpZWxkRGVzY3JpcHRvciBkZXNjID0gbmV3IENNUEZpZWxkRGVzY3JpcHRvcigpOwotCQlkZXNjLnNldE5hbWUobmFtZSk7Ci0JCWRlc2Muc2V0VHlwZSh0eXBlTmFtZSk7Ci0JCXJldHVybiBkZXNjOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNQdWJsaWMoRmllbGQgZmllbGQpIHsKLQkJaWYgKGZpZWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMLmdldFZhbHVlKCkgPT0gZmllbGQuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCQotCQkKLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzE4YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjQsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsOwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9UWVBFID0gQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlci5jbGFzcy5nZXROYW1lKCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBpc1VwZGF0aW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZCA9IHRydWU7Ci0KLQlwcml2YXRlIHN0YXRpYwlXZWFrSGFzaE1hcDxDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyLCBPYmplY3Q+IHVucmVzb2x2ZWRDTVBBdHRyaWJ1dGVzVG9GbHVzaCA9IG5ldyBXZWFrSGFzaE1hcDxDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyLCBPYmplY3Q+KCk7Ci0JCi0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY21wID0gY21wOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBrZXlBdHRyaWJ1dGVzIGxpc3QgaXMgZW1wdHksIHRyeSB0byByZWZsZWN0Ci0JICogdGhlIGtleUF0dHJpYnV0ZXMgZnJvbSB0aGUgZmllbGRzIG9mIHRoZSBwcmltYXJ5S2V5IGNsYXNzLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVLZXlBdHRyaWJ1dGVzKCkgewotCSAgICBpZihjbXAgPT0gbnVsbCB8fCBpbml0aWFsaXplZCkKLQkgICAgICAgIHJldHVybjsKLQkgICAgLy9EaXNhYmxlIG5vdGlmaWNhdGlvbnMgd2hpbGUgd2UgaW5pdGlhbGl6ZQotCSAgICBjbXAuZVNldERlbGl2ZXIoZmFsc2UpOwotCSAgICB0cnkgewotCQkgICAgUmVzb3VyY2UgcmVzID0gY21wLmVSZXNvdXJjZSgpOwotCQkgICAgaWYocmVzID09IG51bGwpCi0JCSAgICAgICAgcmV0dXJuOwotCQkgICAgYm9vbGVhbiBjYWNoZWRJc01vZGlmaWVkID0gcmVzLmlzTW9kaWZpZWQoKTsgCi0JCSAgICB0cnkgewotCQkJCS8vIEhhbmRsZSBwcmlta2V5ZmllbGQgc2NlbmFyaW8KLQkJCQlpZiAoY21wLmdldFByaW1LZXlGaWVsZCgpIT1udWxsKQotCQkJCQlpbml0aWFsaXplRm9yUHJpbUtleSgpOwotCQkJCS8vIEhhbmRsZSBjb21wb3VuZCBrZXkgc2NlbmFyaW8KLQkJCQllbHNlIAotCQkJCQlpbml0aWFsaXplRm9yQ29tcG91bmRLZXkoKTsKLQkJICAgIH0gZmluYWxseSB7Ci0JCSAgICAgICAgcmVzLnNldE1vZGlmaWVkKGNhY2hlZElzTW9kaWZpZWQpOwotCQkgICAgfQotCSAgICB9IGZpbmFsbHkgewotCSAgICAJY21wLmVTZXREZWxpdmVyKHRydWUpOwotCSAgICAJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCSAgICB9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGb3JQcmltS2V5KCkgeyAKLQkJLy8gRW5zdXJlIHRoZSBrZXkgYXR0cmlidXRlcyBsaXN0IGNvbnRhaW5zIG9ubHkgdGhlIHByaW1LZXlGaWVsZCBhdHRyaWJ1dGUKLQkJaWYgKCEoZ2V0S2V5QXR0cmlidXRlcygpLnNpemUoKT09MSAmJiBnZXRLZXlBdHRyaWJ1dGVzKCkuY29udGFpbnMoY21wLmdldFByaW1LZXlGaWVsZCgpKSkpCi0JCQlwcmltS2V5RmllbGRDaGFuZ2VkKGNtcC5nZXRQcmltS2V5RmllbGQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGb3JDb21wb3VuZEtleSgpIHsgCi0JCUxpc3Qga2V5cyA9IGdldEtleUF0dHJpYnV0ZXMoKTsKLQkJLy8gY2xlYXIga2V5IGxpc3QKLQkJa2V5cy5jbGVhcigpOwotCQkvL2Vuc3VyZSB0aGUga2V5IGNsYXNzIGlzIG5vdCBudWxsCi0JCUphdmFDbGFzcyBrZXlDbGFzcyA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JCWlmIChrZXlDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlrZXlDbGFzcy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQotCQkvLyByZWZsZWN0IGtleSBmaWVsZHMgaW50byBrZXkgYXR0cmlidXRlcyBsaXN0Ci0JCUxpc3Qga2V5RmllbGRzID0ga2V5Q2xhc3MuZ2V0RmllbGRzRXh0ZW5kZWQoKTsKLQkJaWYoa2V5RmllbGRzLnNpemUoKSA9PSAwKXsKLQkJCXVucmVzb2x2ZWRDTVBBdHRyaWJ1dGVzVG9GbHVzaC5wdXQodGhpcywgbnVsbCk7Ci0JCX1lbHNlewotCQkJdW5yZXNvbHZlZENNUEF0dHJpYnV0ZXNUb0ZsdXNoLnJlbW92ZSh0aGlzKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleUZpZWxkcy5zaXplKCk7IGkrKykgewotCQkJRmllbGQgZmllbGQgPSAoRmllbGQpIGtleUZpZWxkcy5nZXQoaSk7Ci0JCQlpZiAoZmllbGQuZ2V0SmF2YVZpc2liaWxpdHkoKSA9PSBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpIHsgLy9vbmx5IHB1YmxpYyBmaWVsZHMKLQkJCQlDTVBBdHRyaWJ1dGUga2V5QXR0cmlidXRlID0gY21wLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoZmllbGQuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoa2V5QXR0cmlidXRlICE9IG51bGwpCi0JCQkJCWtleXMuYWRkKGtleUF0dHJpYnV0ZSk7Ci0JCQl9CQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmbHVzaFVucmVzb2x2ZWRLZXlBdHRyaWJ1dGVzT25DbGVhbkJ1aWxkKCl7Ci0JCUl0ZXJhdG9yIGl0ciA9IHVucmVzb2x2ZWRDTVBBdHRyaWJ1dGVzVG9GbHVzaC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdHIuaGFzTmV4dCgpKXsKLQkJCUNNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIgY3VyQWRhcHRlciA9IChDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyKWl0ci5uZXh0KCk7IAotCQkJY3VyQWRhcHRlci5pbml0aWFsaXplZCA9IGZhbHNlOwotCQkJY3VyQWRhcHRlci5pbml0aWFsaXplS2V5QXR0cmlidXRlcygpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAoaXNVcGRhdGluZyB8fCAhaXNFbmFibGVkKSByZXR1cm47IC8vd2UgZG9uJ3Qgd2FudCB0byByZWFjdCB0byBvdXIgb3duIGNoYW5nZXMKLQkJdHJ5IHsKLQkJCWlzVXBkYXRpbmcgPSB0cnVlOwotCQkJRUNsYXNzIGZlYXR1cmVDbGFzcyA9ICgoRU9iamVjdClub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkuZUNsYXNzKCk7Ci0JCQlpZiAoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpLmVxdWFscyhmZWF0dXJlQ2xhc3MpKSB7CQkJCi0JCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MpKSB7Ci0JCQkJCS8vIGhhbmRsZSBpZiBjbXAgYXR0cmlidXRlIGlzIHVwZGF0ZWQsIGFkZGVkLCByZW1vdmVkCi0JCQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BFUlNJU1RFTlRfQVRUUklCVVRFUyA6IHsKLQkJCQkJCWhhbmRsZUNNUEF0dHJpYnV0ZUV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JCQkJCQlicmVhazsJCi0JCQkJCX0KLQkJCQkJLy8gaGFuZGxlIHRoZSBrZXkgYXR0cmlidXRlcyBsaXN0IGlzIHVwZGF0ZWQgcHJvZ3JhbWF0aWNhbGx5Ci0JCQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0tFWV9BVFRSSUJVVEVTIDogewotCQkJCQkJaGFuZGxlQ01QQXR0cmlidXRlRXZlbnQobm90aWZpY2F0aW9uKTsKLQkJCQkJCWJyZWFrOwkKLQkJCQkJfQkKLQkJCQkJLy8gaGFuZGxlIGlmIHRoZSBrZXkgY2xhc3MgaXMgY2hhbmdlZCxhZGRlZCwgcmVtb3ZlZAotCQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNQVJZX0tFWSA6IHsKLQkJCQkJCWhhbmRsZUtleUNsYXNzRXZlbnQobm90aWZpY2F0aW9uKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCS8vIGhhbmRsZSBwcmltIGtleSBmaWVsZCBzZXRzLCBhZGRzLCByZW1vdmVzCi0JCQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1fS0VZX0ZJRUxEIDogewotCQkJCQkJaGFuZGxlUHJpbUtleUZpZWxkRXZlbnQobm90aWZpY2F0aW9uKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRDTVBBdHRyaWJ1dGUoKS5lcXVhbHMoZmVhdHVyZUNsYXNzKSkgewotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDTVBBdHRyaWJ1dGUuY2xhc3MpKSB7Ci0JCQkJCS8vIGhhbmRsZSBhIHNldCBvciBjaGFuZ2Ugb2YgYW4gYXR0cmlidXRlIG5hbWUKLQkJCQkJY2FzZSAoRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19OQU1FKSA6IHsKLQkJCQkJCWhhbmRsZUNNUEF0dHJpYnV0ZVJlbmFtZUV2ZW50KChDTVBBdHRyaWJ1dGUpbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsgCi0JCQkvLyByZXN0b3JlIGluaXRpYWwgbm90aWZpY2F0aW9uIHN0YXRlCi0JCQlpc1VwZGF0aW5nID0gZmFsc2U7Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhdHRyaWJ1dGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ01QQXR0cmlidXRlUmVuYW1lRXZlbnQoQ01QQXR0cmlidXRlIGF0dHJpYnV0ZSwgT2JqZWN0IG9sZFZhbHVlKSB7Ci0JCS8vIGlmIHJlbmFtZWQgYXR0cmlidXRlIHdhcyBpbiBrZXkgYW5kIGlzIG5vdCBhbnltb3JlLCByZW1vdmUgaXQgZnJvbSBrZXkgbGlzdAotCQlpZiAoZ2V0S2V5QXR0cmlidXRlcygpLmNvbnRhaW5zKGF0dHJpYnV0ZSkpIHsKLQkJCWlmICghaXNBdHRyaWJ1dGVLZXlDbGFzc0ZpZWxkKGF0dHJpYnV0ZS5nZXROYW1lKCkpKQotCQkJCXJlbW92ZUtleUF0dHJpYnV0ZShhdHRyaWJ1dGUsKFN0cmluZylvbGRWYWx1ZSk7Ci0JCX0KLQkJLy8gaWYgcmVuYW1lZCBhdHRyaWJ1dGUgaXMgbm93IHBhcnQgb2YgdGhlIGtleSwgYWRkIGl0IHRvIHRoZSBrZXkgbGlzdAkJCi0JCWVsc2UKLQkJCWF0dHJpYnV0ZUFkZGVkKGF0dHJpYnV0ZSk7CQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlUHJpbUtleUZpZWxkRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlFT2JqZWN0IG5ld1ByaW1LZXlGaWVsZCA9IChFT2JqZWN0KW5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQljbXAuc2V0UHJpbUtleUZpZWxkKChDTVBBdHRyaWJ1dGUpbmV3UHJpbUtleUZpZWxkKTsKLQkJLy8gaWYgcHJpbUtleUZpZWxkIGlzIHJlbW92ZWQgb3IgYSBwcm94eSwgcmVjb21wdXRlIGtleSBhdHRyaWJ1dGVzIGJhc2VkIG9uIGtleSBjbGFzcwotCQlpZiAobmV3UHJpbUtleUZpZWxkID09IG51bGwgfHwgbmV3UHJpbUtleUZpZWxkLmVJc1Byb3h5KCkpIHsKLQkJCUNNUEF0dHJpYnV0ZSBwcmltRmllbGQgPSAoQ01QQXR0cmlidXRlKW5ld1ByaW1LZXlGaWVsZDsKLQkJCWlmIChwcmltRmllbGQhPW51bGwgJiYgcHJpbUZpZWxkLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcHJpbUZpZWxkLnNldE5hbWUoKChJbnRlcm5hbEVPYmplY3QpcHJpbUZpZWxkKS5lUHJveHlVUkkoKS50b1N0cmluZygpKTsKLQkJCQltYWtlUHJpbUtleUZpZWxkUHJveHkocHJpbUZpZWxkLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZW1vdmVBbGxLZXlBdHRyaWJ1dGVzKCk7Ci0JCQlpbml0aWFsaXplZCA9IGZhbHNlOwotCQkJaW5pdGlhbGl6ZUtleUF0dHJpYnV0ZXMoKTsKLQkJfQotCQkvLyBFbnN1cmUgdGhlIGtleSBhdHRyaWJ1dGVzIGxpc3QgY29udGFpbnMgb25seSB0aGUgcHJpbUtleUZpZWxkIGF0dHJpYnV0ZQotCQllbHNlIGlmICghKGdldEtleUF0dHJpYnV0ZXMoKS5zaXplKCk9PTEgJiYgZ2V0S2V5QXR0cmlidXRlcygpLmNvbnRhaW5zKG5ld1ByaW1LZXlGaWVsZCkpKSB7Ci0JCQlwcmltS2V5RmllbGRDaGFuZ2VkKG5ld1ByaW1LZXlGaWVsZCk7Ci0JCX0JCQotCQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVLZXlDbGFzc0V2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gaWYgcHJpbWtleSBudWxsIG9yIHByb3h5LCBjbGVhciBrZXkgZmllbGRzIGFuZCByZWluaXRpYWxpemUgaWYga2V5IGNsYXNzIG5vdCBudWxsCi0JCWlmIChjbXAuZ2V0UHJpbUtleUZpZWxkKCk9PW51bGwgfHwgY21wLmdldFByaW1LZXlGaWVsZCgpLmVJc1Byb3h5KCkpIHsKLQkJCWtleUNsYXNzQ2hhbmdlZCgpOwotCQl9Ci0JCS8vIGlmIHByaW1rZXkgaXMgbm90IG51bGwsIHRoZW4gZG8gbm90aGluZwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNNUEF0dHJpYnV0ZUV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaW50IGV2ZW50VHlwZSA9IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKTsKLQkJLy8gaGFuZGxlIGEgQ01QQXR0cmlidXRlIGFkZGVkCi0JCSBpZiAoZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BREQpIHsKLQkJCSBhdHRyaWJ1dGVBZGRlZCgoQ01QQXR0cmlidXRlKW5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKTsKLQkJIH0KLQkJIC8vIGhhbmRsZSBhIENNUEF0dHJpYnV0ZSByZW1vdmVkCi0JCSBlbHNlIGlmIChldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRSkgewotCQkgCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKW5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOwotCQkJLy8gcmVtb3ZlIHRoaXMgYWRhcHRlciBmcm9tIHRoZSBkZWxldGVkIGF0dHJpYnV0ZQotCQkJYXR0cmlidXRlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCXJlbW92ZUtleUF0dHJpYnV0ZShhdHRyaWJ1dGUsIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkJCi0JCSB9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlS2V5QXR0cmlidXRlKENNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIFN0cmluZyBvbGROYW1lKSB7Ci0JCQotCQkvLyBpZiBhdHRyaWJ1dGUgd2FzIGEga2V5IGF0dHJpYnV0ZSBpdCB3aWxsIGJlIHJlbW92ZWQsIG90aGVyd2lzZSBkbyBub3RoaW5nCi0JCWdldEtleUF0dHJpYnV0ZXMoKS5yZW1vdmUoYXR0cmlidXRlKTsKLQkJCi0JCS8vIGlmIGl0IGlzIHRoZSBwcmltIGtleSBhdHRyaWJ1dGUsIHRoZW4gbWFrZSB0aGUgcHJpbSBrZXkgYXR0cmlidXRlIGEgcHJveHkKLQkJaWYgKGNtcC5nZXRQcmltS2V5RmllbGQoKSE9bnVsbCAmJiBjbXAuZ2V0UHJpbUtleUZpZWxkKCkuZXF1YWxzKGF0dHJpYnV0ZSkpIHsKLQkJCW1ha2VQcmltS2V5RmllbGRQcm94eShvbGROYW1lKTsKLQkJfQotCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIG1ha2VQcmltS2V5RmllbGRQcm94eShTdHJpbmcgb2xkTmFtZSkgewotCQlpZiAoY21wLmdldFByaW1LZXlGaWVsZCgpID09IG51bGwpIHJldHVybjsKLQkJY21wLnNldFByaW1LZXlGaWVsZChFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDTVBBdHRyaWJ1dGUoKSk7Ci0JCWNtcC5nZXRQcmltS2V5RmllbGQoKS5zZXROYW1lKG9sZE5hbWUpOwotCQkoKEludGVybmFsRU9iamVjdCljbXAuZ2V0UHJpbUtleUZpZWxkKCkpLmVTZXRQcm94eVVSSShVUkkuY3JlYXRlVVJJKG9sZE5hbWUpKTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbEtleUF0dHJpYnV0ZXMoKSB7Ci0JCS8vIGNsZWFyIGtleSBhdHRyaWJ1dGVzIGxpc3Qgb24gY21wCi0JCWdldEtleUF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRLZXlBdHRyaWJ1dGUoQ01QQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkKLQkJQ01QQXR0cmlidXRlIHByaW1LZXlGaWVsZCA9IGNtcC5nZXRQcmltS2V5RmllbGQoKTsKLQkJLy8gaWYgcHJpbSBrZXkgaXMgbnVsbCBhZGQgYXR0cmlidXRlIHRvIGtleSBsaXN0Ci0JCWlmIChwcmltS2V5RmllbGQ9PW51bGwgfHwgcHJpbUtleUZpZWxkLmVJc1Byb3h5KCkpIHsKLQkJCWlmICghZ2V0S2V5QXR0cmlidXRlcygpLmNvbnRhaW5zKGF0dHJpYnV0ZSkpCi0JCQkJZ2V0S2V5QXR0cmlidXRlcygpLmFkZChhdHRyaWJ1dGUpOwotCQkJLy8gaWYgYXR0IGlzIG9ubHkga2V5IGF0dCwgYW5kIHR5cGUgaXMgdGhlIGtleSBjbGFzcyB0eXBlLCBzZXQgdGhlIHByaW0ga2V5IGZpZWxkCi0JCQlpZiAoZ2V0S2V5QXR0cmlidXRlcygpLnNpemUoKT09MSAmJiBhdHRyaWJ1dGUuZ2V0VHlwZSgpLmVxdWFscyhjbXAuZ2V0UHJpbWFyeUtleSgpKSkKLQkJCQljbXAuc2V0UHJpbUtleUZpZWxkKGF0dHJpYnV0ZSk7Ci0JCX0KLQkJLy8gaWYgcHJpbWtleSBzZXQgKyBwcmlta2V5ZmllbGQgaXMgdGhlIG5ldyBhdHRyaWJ1dGUgZW5zdXJlIGl0cyB0aGUgb25seSBvbmUKLQkJZWxzZSBpZiAocHJpbUtleUZpZWxkLmVxdWFscyhhdHRyaWJ1dGUpKSB7Ci0JCQlpZiAoIShnZXRLZXlBdHRyaWJ1dGVzKCkuc2l6ZSgpPT0xICYmIGdldEtleUF0dHJpYnV0ZXMoKS5jb250YWlucyhhdHRyaWJ1dGUpKSkgewotCQkJCWdldEtleUF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEtleUF0dHJpYnV0ZXMoKS5hZGQoYXR0cmlidXRlKTsKLQkJCX0JCi0JCX0KLQkJLy8gaWYgcHJpbWtleSBzZXQsbmV3IGF0dHJpYnV0ZSBub3QgcHJpbSBrZXksIGtleSBhdHRzID4gMSwgcmVtb3ZlIHByaW1rZXkgZmllbGQKLQkJZWxzZSB7Ci0JCQljbXAuc2V0UHJpbUtleUZpZWxkKG51bGwpOwotCQkJaWYgKCFnZXRLZXlBdHRyaWJ1dGVzKCkuY29udGFpbnMoYXR0cmlidXRlKSkKLQkJCQlnZXRLZXlBdHRyaWJ1dGVzKCkuYWRkKGF0dHJpYnV0ZSk7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhdHRyaWJ1dGVBZGRlZChDTVBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCS8vTWFrZSBzdXJlIGNtcCBrZXkgYWRhcHRlcnMgYXJlIGluaXRpYWxpemVkIGlmIG5lZWRlZAotCQljbXAuZ2V0S2V5QXR0cmlidXRlcygpOwotCQkKLQkJLy8gYWRkIHRoaXMgYXMgYSBsaXN0ZW5lciB0byBuYW1lIGNoYW5nZXMgb24gdGhpcyBhdHRyaWJ1dGUKLQkJaWYgKCFhdHRyaWJ1dGUuZUFkYXB0ZXJzKCkuY29udGFpbnModGhpcykpCi0JCQlhdHRyaWJ1dGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkKLQkJaWYgKGF0dHJpYnV0ZS5nZXROYW1lKCkgPT1udWxsKSByZXR1cm47Ci0JCS8vIGFkZCBpdCB0byB0aGUga2V5IGxpc3QgaWYgYXBwbGljYWJsZSBhbmQgc29ydCB0aGUga2V5IGxpc3QKLQkJaWYgKGlzQXR0cmlidXRlS2V5Q2xhc3NGaWVsZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKSkgewotCQkJYWRkS2V5QXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0JCQlzb3J0S2V5QXR0cmlidXRlTGlzdCgpOwotCQl9Ci0JCS8vIGlmIG5ldyBhdHRyaWJ1dGUgbmFtZSBpcyBub3cgcHJpbSBrZXkgbmFtZSwgZml4IHVwIHByaW0ga2V5IGZpZWxkCi0JCWVsc2UgaWYgKGNtcC5nZXRQcmltS2V5RmllbGQoKSE9bnVsbCAmJiBjbXAuZ2V0UHJpbUtleUZpZWxkKCkuZUlzUHJveHkoKSAmJiBhdHRyaWJ1dGUuZ2V0TmFtZSgpLmVxdWFscyhjbXAuZ2V0UHJpbUtleUZpZWxkKCkuZ2V0TmFtZSgpKSkgewotCQkJY21wLnNldFByaW1LZXlGaWVsZChhdHRyaWJ1dGUpOwotCQkJcHJpbUtleUZpZWxkQ2hhbmdlZChhdHRyaWJ1dGUpOwotCQl9CQotCX0KLQkKLQotCS8qKgotCSAqIElzIHRoZSBjbXAgYXR0cmlidXRlIGFsc28gYSBmaWVsZCBpbiB0aGUga2V5IGNsYXNzPwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQXR0cmlidXRlS2V5Q2xhc3NGaWVsZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkvLyBlbnN1cmUga2V5IGNsYXNzIGlzIG5vdCBudWxsCi0JCUphdmFDbGFzcyBrZXlDbGFzcyA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JCWlmIChrZXlDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBzZWUgaWYgdGhlIGF0dHJpYnV0ZSBuYW1lIG1hdGNocyBhbnkgb2YgdGhlIHJlZmxlY3RlZCBrZXkgY2xhc3MgcHVibGljIGZpZWxkIG5hbWVzCi0JCUxpc3Qga2V5RmllbGRzID0ga2V5Q2xhc3MuZ2V0RmllbGRzRXh0ZW5kZWQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlGaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpZWxkIGZpZWxkID0gKEZpZWxkKSBrZXlGaWVsZHMuZ2V0KGkpOwotCQkJaWYgKGZpZWxkLmdldEphdmFWaXNpYmlsaXR5KCkgPT0gSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKSB7Ci0JCQkJaWYgKGZpZWxkLmdldE5hbWUoKS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQkKLQkvKioKLQkgKiBTb3J0IHRoZSBsaXN0IG9mIHRoZSBrZXkgYXR0cmlidXRlcyB0byBtYXRjaCB0aGUgb3JkZXIgb2YgdGhlIGtleSBjbGFzcwotCSAqLwotCXByaXZhdGUgdm9pZCBzb3J0S2V5QXR0cmlidXRlTGlzdCgpIHsKLQkJCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlKYXZhQ2xhc3Mga2V5Q2xhc3MgPSBjbXAuZ2V0UHJpbWFyeUtleSgpOwotCQlpZiAoa2V5Q2xhc3MgPT0gbnVsbCkgcmV0dXJuOwotCQlMaXN0IGtleUZpZWxkcyA9IGtleUNsYXNzLmdldEZpZWxkc0V4dGVuZGVkKCk7Ci0JCUxpc3QgY3VycmVudEtleXMgPSBnZXRLZXlBdHRyaWJ1dGVzKCk7Ci0JCQotCQkvLyBjcmVhdGUgYSBuZXcgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBpbiBvcmRlciBvZiBrZXkgY2xhc3MgZmllbGRzLgotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleUZpZWxkcy5zaXplKCk7IGkrKykgewotCQkJRmllbGQgZmllbGQgPSAoRmllbGQpIGtleUZpZWxkcy5nZXQoaSk7Ci0JCQlpZiAoZmllbGQuZ2V0SmF2YVZpc2liaWxpdHkoKSA9PSBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpIHsgLy9vbmx5IHB1YmxpYyBmaWVsZHMKLQkJCQlmb3IgKGludCBqPTA7IGo8Y3VycmVudEtleXMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJQ01QQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChDTVBBdHRyaWJ1dGUpIGN1cnJlbnRLZXlzLmdldChqKTsKLQkJCQkJaWYgKGZpZWxkLmdldE5hbWUoKS5lcXVhbHMoYXR0cmlidXRlLmdldE5hbWUoKSkpCi0JCQkJCQlyZXN1bHQuYWRkKGF0dHJpYnV0ZSk7CQotCQkJCX0JCQkKLQkJCX0JCi0JCX0KLQkJLy9jbGVhciBsaXN0IGFuZCBzZXQgdGhlIG5ldyBrZXkgYXR0cmlidXRlIG9yZGVyIG9uIHRoZSBjbXAKLQkJZ2V0S2V5QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCWdldEtleUF0dHJpYnV0ZXMoKS5hZGRBbGwocmVzdWx0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQga2V5Q2xhc3NDaGFuZ2VkKCkgewotCQlKYXZhQ2xhc3Mga2V5ID0gY21wLmdldFByaW1hcnlLZXkoKTsKLQkJaWYgKGtleSAhPW51bGwpCi0JCQlrZXkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkvLyBpZiBub3QgcHJpbSBrZXkgY2xhc3MsIGNsZWFyIGtleSBhdHRyaWJ1dGUgbGlzdAotCQlyZW1vdmVBbGxLZXlBdHRyaWJ1dGVzKCk7Ci0JCWluaXRpYWxpemVkID0gZmFsc2U7Ci0JCWluaXRpYWxpemVLZXlBdHRyaWJ1dGVzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByaW1LZXlGaWVsZENoYW5nZWQoRU9iamVjdCBwcmltS2V5RmllbGQpIHsKLQkJLy8gaWYgYSBwcmltS2V5RmllbGQgaXMgYWRkZWQsIGRvIGEgcmVtb3ZlIGFsbCBhbmQgYW4gYWRkCi0JCXJlbW92ZUFsbEtleUF0dHJpYnV0ZXMoKTsKLQkJCi0JCWlmIChwcmltS2V5RmllbGQgIT0gbnVsbCAmJiAhcHJpbUtleUZpZWxkLmVJc1Byb3h5KCkpIHsKLQkJCWlmICghcHJpbUtleUZpZWxkLmVBZGFwdGVycygpLmNvbnRhaW5zKHRoaXMpKQotCQkJCXByaW1LZXlGaWVsZC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlnZXRLZXlBdHRyaWJ1dGVzKCkuYWRkKHByaW1LZXlGaWVsZCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBFTGlzdCBnZXRLZXlBdHRyaWJ1dGVzKCkgewotCSAgICByZXR1cm4gKChDb250YWluZXJNYW5hZ2VkRW50aXR5SW1wbCljbXApLmdldEtleUF0dHJpYnV0ZXNHZW4oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNzZXRUYXJnZXQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCQlzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsgCi0JfQotCQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIEFEQVBURVJfVFlQRS5lcXVhbHModHlwZSk7Ci0gICAgfQotICAgIC8vVG8gdHVybiBzeW5jIG9uIG9yIG9mZgotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKXsKLSAgICAJaXNFbmFibGVkID0gZW5hYmxlZDsKLSAgICB9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9Db21tb25SZWxhdGlvbnNoaXBBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ1NmEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21tb25SZWxhdGlvbnNoaXBBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBFamJQYWNrYWdlIEVKQl9QQUNLID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb21tb25SZWxhdGlvbnNoaXBBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuCi0JICovCi0JcHVibGljIENvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQlhZGRlZE5vdGlmaWNhdGlvbihtc2cpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCQlyZW1vdmVkTm90aWZpY2F0aW9uKG1zZyk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgYWRkZWROb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpID09IEVKQl9QQUNLLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfS2V5QXR0cmlidXRlcygpKQotCQkJYWRkZWRLZXlBdHRyaWJ1dGUoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIG1zZy5nZXROb3RpZmllcigpLCAoQ01QQXR0cmlidXRlKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCWVsc2UgaWYgKGlzUmVsYXRpb25zaGlwc1NGKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSkpCi0JCQlhZGRlZCgpOwotCQllbHNlIGlmIChpc1JlbGF0aW9uc2hpcFJvbGVzU0YoKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpKSkKLQkJCWFkZGVkUm9sZSgoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgbXNnLmdldE5ld1ZhbHVlKCkpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVkTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSA9PSBFSkJfUEFDSy5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0tleUF0dHJpYnV0ZXMoKSkKLQkJCXJlbW92ZWRLZXlBdHRyaWJ1dGUoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIG1zZy5nZXROb3RpZmllcigpLCAoQ01QQXR0cmlidXRlKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCWVsc2UgaWYgKGlzUmVsYXRpb25zaGlwc1NGKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSkpCi0JCQlyZW1vdmVkKCk7Ci0JCWVsc2UgaWYgKGlzUmVsYXRpb25zaGlwUm9sZXNTRigoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkpKQotCQkJcmVtb3ZlZFJvbGUoKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQl9Ci0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBSb2xlc1NGKEVPYmplY3Qgc2YpOwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzUmVsYXRpb25zaGlwc1NGKEVPYmplY3Qgc2YpOwotCS8vU2FtZSBhcyB0aGUgYWRkCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZWRLZXlBdHRyaWJ1dGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBhQ01QRW50aXR5LCBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlKSB7Ci0JCWFkZGVkS2V5QXR0cmlidXRlKGFDTVBFbnRpdHksIGNtcEF0dHJpYnV0ZSk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGFkZGVkS2V5QXR0cmlidXRlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYUNNUEVudGl0eSwgQ01QQXR0cmlidXRlIG5ld0F0dHJpYnV0ZSkgewotCQlDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGUsIGludmVyc2U7Ci0JCXJvbGUgPSBnZXRSb2xlKGFDTVBFbnRpdHkpOwotCQlpZiAocm9sZSAhPSBudWxsICYmICFyb2xlLmlzRm9yd2FyZCgpKSB7Ci0JCQlpbnZlcnNlID0gcm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpOwotCQkJaWYgKGludmVyc2UgIT0gbnVsbCkKLQkJCQlpbnZlcnNlLnJlY29uY2lsZUF0dHJpYnV0ZXMoKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBnZXRSb2xlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYUNNUEVudGl0eSkgewotCSAgICBDb21tb25SZWxhdGlvbnNoaXAgcmVsYXRpb24gPSBnZXRSZWxhdGlvbnNoaXAoKTsKLQkgICAgaWYgKHJlbGF0aW9uID09IG51bGwpIHJldHVybiBudWxsOwotCQlMaXN0IHJvbGVzID0gcmVsYXRpb24uZ2V0Q29tbW9uUm9sZXMoKTsKLQkJaWYgKHJvbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlyb2xlID0gKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpIHJvbGVzLmdldChpKTsKLQkJCWlmIChyb2xlLmdldFNvdXJjZUVudGl0eSgpID09IGFDTVBFbnRpdHkpCi0JCQkJcmV0dXJuIHJvbGU7Ci0JCX0KLQkJcmV0dXJuIHJvbGU7Ci0JfQotCXByb3RlY3RlZCBDb21tb25SZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gIChDb21tb25SZWxhdGlvbnNoaXApIGdldFRhcmdldCgpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGVSb2xlQXR0cmlidXRlcygpIHsKLQkJTGlzdCByb2xlcyA9IGdldFJlbGF0aW9uc2hpcCgpLmdldENvbW1vblJvbGVzKCk7Ci0JCWlmIChyb2xlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgcm9sZXMuZ2V0KGkpOwotCQkJcm9sZS5yZWNvbmNpbGVBdHRyaWJ1dGVzKCk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgYWRkZWQoKSB7Ci0JCXJlY29uY2lsZVJvbGVBdHRyaWJ1dGVzKCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZWQoKSB7Ci0JCWlmIChnZXRSZWxhdGlvbnNoaXAoKS5nZXRDb21tb25Sb2xlcygpLnNpemUoKSA+IDEpIHsKLQkJCS8vcmVtb3ZlIG9uZSBmb3JjZSBhIGRpc2Nvbm5lY3QKLQkJCWdldFJlbGF0aW9uc2hpcCgpLmdldENvbW1vblJvbGVzKCkucmVtb3ZlKDApOwotCQl9Ci0JfQotCS8qKgotCSogQWRkIHRoaXMgQWRhcHRlciB0byBAYVJvbGUgYW5kIHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5Ci0JKiB0aGF0IHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIGNvbnRhaW5lciBpcyBwb2ludGluZyB0by4KLQkqIFRoaXMgb25seSB3b3JrcyBpZiBAYVJvbGUgaXMgY29udGFpbmVkLgotCSovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWRhcHRvcnMoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCQlyZW1vdmVBZGFwdG9ycyhhUm9sZSk7IC8vdG8gZW5zdXJlIHRoaXMgYWRhcHRlciBpcyBub3QgYWRkZWQgdHdpY2UKLQkJYVJvbGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IGFSb2xlLmdldFNvdXJjZUVudGl0eSgpOwotCQlpZiAoY21wICE9IG51bGwpCi0JCQljbXAuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCX0KLQkvKioKLQkgKiBSZW1vdmUgdGhpcyBBZGFwdGVyIGZyb20gQGFSb2xlIGFuZCB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eQotCSAqIHRoYXQgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gY29udGFpbmVyIGlzIHBvaW50aW5nIHRvLgotCSAqIFRoaXMgb25seSB3b3JrcyBpZiBAYVJvbGUgaXMgY29udGFpbmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFkYXB0b3JzKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIHsKLQkJYVJvbGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IGFSb2xlLmdldFNvdXJjZUVudGl0eSgpOwotCQlpZiAoY21wICE9IG51bGwpCi0JCQljbXAuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRlZFJvbGUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCQlhZGRBZGFwdG9ycyhhUm9sZSk7Ci0JCWlmICgoZ2V0UmVsYXRpb25zaGlwKCkuZUNvbnRhaW5lcigpICE9IG51bGwpICYmIHJvbGVzRnVsbHlSZWZsZWN0ZWQoKSkKLQkJCXJlY29uY2lsZVJvbGVBdHRyaWJ1dGVzKCk7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIHJvbGVzRnVsbHlSZWZsZWN0ZWQoKSB7Ci0JCUxpc3Qgcm9sZXMgPSBnZXRSZWxhdGlvbnNoaXAoKS5nZXRDb21tb25Sb2xlcygpOwotCQlpZiAocm9sZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlyb2xlID0gKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpIHJvbGVzLmdldChpKTsKLQkJCWlmIChyb2xlLmdldFNvdXJjZUVudGl0eSgpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkJCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlZFJvbGUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCQlyZW1vdmVBZGFwdG9ycyhhUm9sZSk7Ci0JCWlmIChnZXRSZWxhdGlvbnNoaXAoKS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJYVJvbGUucmVjb25jaWxlQXR0cmlidXRlcygpOwotCQkJcmVjb25jaWxlUm9sZUF0dHJpYnV0ZXMoKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI3NldFRhcmdldChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJLy9Pbmx5IHNldCB0aGUgdGFyZ2V0IGlmIGl0IGlzIGEgQ29tbW9uUmVsYXRpb25zaGlwCi0JCWlmIChub3RpZmllciA9PSBudWxsIHx8IG5vdGlmaWVyIGluc3RhbmNlb2YgQ29tbW9uUmVsYXRpb25zaGlwKQotCQkJc3VwZXIuc2V0VGFyZ2V0KG5vdGlmaWVyKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ29udmVydGVkRUpCQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ29udmVydGVkRUpCQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmFjNzdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NvbnZlcnRlZEVKQkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLQotcHVibGljIGNsYXNzIENvbnZlcnRlZEVKQkFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0tFWSA9ICJDb252ZXJ0ZWRFSkJBZHBhdGVyIjsgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfMCA9IDE7Ci0JCi0JcHJvdGVjdGVkIGludCB2ZXJzaW9uID0gLTE7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHkgPSBmYWxzZTsKLQkKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29udmVydGVkRUpCQWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgQ29udmVydGVkRUpCQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2ZXJzaW9uLiAgVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgc3RhdGljIGNvbnN0YW50cy4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZlcnNpb24uICBUaGlzIHNob3VsZCBiZSBvbmUgb2YgdGhlIHN0YXRpYyBjb25zdGFudHMuCi0JICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbikgewotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlYWRPbmx5LgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gcmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVhZE9ubHkuCi0JICogQHBhcmFtIHJlYWRPbmx5IFRoZSByZWFkT25seSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGcm9tVmVyc2lvbjFfMCgpIHsKLQkJcmV0dXJuIHZlcnNpb24gPT0gVkVSU0lPTl8xXzA7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1NTU5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBFSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsIGV4dGVuZHMgRWpiQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfS0VZID0gIkVKQkF0dHJpYnV0ZU1haW50ZW5hbmNlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBFSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIudXRpbC5FamJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBZGFwdGVyKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCUFkYXB0ZXIgdGFyZ2V0QWRhcHRlciA9IChBZGFwdGVyKSBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCQlyZXR1cm4gRXh0ZW5kZWRFY29yZVV0aWwuY3JlYXRlQWRhcHRlckZvckxvYWRpbmcodGFyZ2V0QWRhcHRlciwgKEVPYmplY3QpIHRhcmdldCk7Ci0JfQotCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJSZWxhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRUpCUmVsYXRpb25BdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIoKTsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVsYXRpb25zaGlwc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUmVsYXRpb25zaGlwc0F0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIEFEQVBURVJfS0VZID09IHR5cGU7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FSkJSZWxhdGlvbkF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRUpCUmVsYXRpb25BdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjZjcxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FSkJSZWxhdGlvbkF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotcHVibGljIGNsYXNzIEVKQlJlbGF0aW9uQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyIGV4dGVuZHMgQ29tbW9uUmVsYXRpb25zaGlwQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRUpCUmVsYXRpb25BdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuCi0JICogQHBhcmFtIGFSZWxhdGlvbnNoaXAKLQkgKi8KLQlwdWJsaWMgRUpCUmVsYXRpb25BdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbC5Db21tb25SZWxhdGlvbnNoaXBBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIjaXNSZWxhdGlvbnNoaXBSb2xlc1NGKEVPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBSb2xlc1NGKEVPYmplY3Qgc2YpIHsKLQkJcmV0dXJuIHNmID09IEVKQl9QQUNLLmdldEVKQlJlbGF0aW9uX1JlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbC5Db21tb25SZWxhdGlvbnNoaXBBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIjaXNSZWxhdGlvbnNoaXBzU0YoRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbGF0aW9uc2hpcHNTRihFT2JqZWN0IHNmKSB7Ci0JCXJldHVybiBzZiA9PSBFSkJfUEFDSy5nZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBFSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsLkFEQVBURVJfS0VZID09IHR5cGU7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWRlODk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTWV0aG9kQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgRWpiQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgRWpiUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0JcHVibGljIEVqYkFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IChFamJQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpIHR5cGUpLmVDbGFzcygpLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcm90ZWN0ZWQgRWpiU3dpdGNoIHN3ID0gbmV3IEVqYlN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGVybWlzc2lvbihNZXRob2RQZXJtaXNzaW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb25BZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kVHJhbnNhY3Rpb24oTWV0aG9kVHJhbnNhY3Rpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb25BZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRW50ZXJwcmlzZUJlYW4oRW50ZXJwcmlzZUJlYW4gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRW50ZXJwcmlzZUJlYW5BZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRW50aXR5KEVudGl0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFbnRpdHlBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyTWFuYWdlZEVudGl0eShDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlQ01QQXR0cmlidXRlKENNUEF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDTVBBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlQ01SRmllbGQoQ01SRmllbGQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ01SRmllbGRBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRUpCUmVsYXRpb25zaGlwUm9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRUpCUmVsYXRpb24oRUpCUmVsYXRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUpCUmVsYXRpb25BZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlUmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBzIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uc2hpcHNBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRUpCSmFyKEVKQkphciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFSkJKYXJBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlUm9sZVNvdXJjZShSb2xlU291cmNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVTb3VyY2VBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlUXVlcnkoUXVlcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUXVlcnlBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlUXVlcnlNZXRob2QoUXVlcnlNZXRob2Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUXVlcnlNZXRob2RBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRXhjbHVkZUxpc3QoRXhjbHVkZUxpc3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRXhjbHVkZUxpc3RBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbihTZXNzaW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25BZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURyaXZlbihNZXNzYWdlRHJpdmVuIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEcml2ZW5BZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25BZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25Db25maWdBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRUpCTWV0aG9kQ2F0ZWdvcnkoRUpCTWV0aG9kQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRUF0dHJpYnV0ZShFQXR0cmlidXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRU5hbWVkRWxlbWVudChFTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlcikgc3cuZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0JfQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4KLQkgKiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzCi0JICogYW55d2F5LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudGVycHJpc2VCZWFuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNNUEF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDTVJGaWVsZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQlJlbGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlbGF0aW9uc2hpcHNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCSmFyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUXVlcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUXVlcnlNZXRob2RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGNsdWRlTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXNzaW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VEcml2ZW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQk1ldGhvZENhdGVnb3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVDbGFzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQXR0cmlidXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQ2xhc3NpZmllckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGVHZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVqYlN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBFamJTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXJNYW5hZ2VkRW50aXR5KENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQZXJtaXNzaW9uKE1ldGhvZFBlcm1pc3Npb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RUcmFuc2FjdGlvbihNZXRob2RUcmFuc2FjdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXNzaW9uKFNlc3Npb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRpdHkoRW50aXR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFbnRpdHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRlcnByaXNlQmVhbihFbnRlcnByaXNlQmVhbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRW50ZXJwcmlzZUJlYW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJNZXRob2RDYXRlZ29yeShFSkJNZXRob2RDYXRlZ29yeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXIoRUpCSmFyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFSkJKYXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDTVBBdHRyaWJ1dGUoQ01QQXR0cmlidXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDTVBBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWxhdGlvbnNoaXBzKFJlbGF0aW9uc2hpcHMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uc2hpcHNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VRdWVyeShRdWVyeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUXVlcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbihFSkJSZWxhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUpCUmVsYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbnNoaXBSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlU291cmNlKFJvbGVTb3VyY2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVTb3VyY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDTVJGaWVsZChDTVJGaWVsZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ01SRmllbGRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRHJpdmVuKE1lc3NhZ2VEcml2ZW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEcml2ZW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXhjbHVkZUxpc3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VRdWVyeU1ldGhvZChRdWVyeU1ldGhvZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUXVlcnlNZXRob2RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25Db25maWdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKTkRJRW52UmVmc0dyb3VwKEpORElFbnZSZWZzR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpORElFbnZSZWZzR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFVHlwZWRFbGVtZW50KEVUeXBlZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFQXR0cmlidXRlKEVBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRUF0dHJpYnV0ZShKMkVFRUF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSjJFRUVBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckdlbihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcwotCSAqIGFueXdheS4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQZXJtaXNzaW9uQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvckFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW50ZXJwcmlzZUJlYW5BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbnRpdHlBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ01QQXR0cmlidXRlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ01SRmllbGRBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCUmVsYXRpb25BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWxhdGlvbnNoaXBzQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCSmFyQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNvdXJjZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVF1ZXJ5QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUXVlcnlNZXRob2RBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCA8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIDxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAgPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSk5ESUVudlJlZnNHcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGNsdWRlTGlzdEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlc3Npb25BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRHJpdmVuQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnlBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQXR0cmlidXRlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVBdHRyaWJ1dGUgPGVtPkoyRUVFIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSjJFRUVBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQgPGVtPkVUeXBlZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9FamJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3NWZmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJNZXRob2RDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkV4Y2x1ZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEVqYlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFk6IHsKLQkJCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29udGFpbmVyTWFuYWdlZEVudGl0eShjb250YWluZXJNYW5hZ2VkRW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbnRpdHkoY29udGFpbmVyTWFuYWdlZEVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRW50ZXJwcmlzZUJlYW4oY29udGFpbmVyTWFuYWdlZEVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSk5ESUVudlJlZnNHcm91cChjb250YWluZXJNYW5hZ2VkRW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChjb250YWluZXJNYW5hZ2VkRW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGNvbnRhaW5lck1hbmFnZWRFbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGNvbnRhaW5lck1hbmFnZWRFbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTjogewotCQkJCU1ldGhvZFBlcm1pc3Npb24gbWV0aG9kUGVybWlzc2lvbiA9IChNZXRob2RQZXJtaXNzaW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RQZXJtaXNzaW9uKG1ldGhvZFBlcm1pc3Npb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KG1ldGhvZFBlcm1pc3Npb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SOiB7Ci0JCQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IChBc3NlbWJseURlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFzc2VtYmx5RGVzY3JpcHRvcihhc3NlbWJseURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGFzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTjogewotCQkJCU1ldGhvZFRyYW5zYWN0aW9uIG1ldGhvZFRyYW5zYWN0aW9uID0gKE1ldGhvZFRyYW5zYWN0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RUcmFuc2FjdGlvbihtZXRob2RUcmFuc2FjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobWV0aG9kVHJhbnNhY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OOiB7Ci0JCQkJU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlc3Npb24oc2Vzc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRW50ZXJwcmlzZUJlYW4oc2Vzc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSk5ESUVudlJlZnNHcm91cChzZXNzaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChzZXNzaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKHNlc3Npb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNlc3Npb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFk6IHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRW50aXR5KGVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRW50ZXJwcmlzZUJlYW4oZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKTkRJRW52UmVmc0dyb3VwKGVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOOiB7Ci0JCQkJRW50ZXJwcmlzZUJlYW4gZW50ZXJwcmlzZUJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVudGVycHJpc2VCZWFuKGVudGVycHJpc2VCZWFuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKTkRJRW52UmVmc0dyb3VwKGVudGVycHJpc2VCZWFuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChlbnRlcnByaXNlQmVhbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChlbnRlcnByaXNlQmVhbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZW50ZXJwcmlzZUJlYW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfTUVUSE9EX0NBVEVHT1JZOiB7Ci0JCQkJRUpCTWV0aG9kQ2F0ZWdvcnkgZWpiTWV0aG9kQ2F0ZWdvcnkgPSAoRUpCTWV0aG9kQ2F0ZWdvcnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQk1ldGhvZENhdGVnb3J5KGVqYk1ldGhvZENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChlamJNZXRob2RDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVI6IHsKLQkJCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCSmFyKGVqYkphcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoZWpiSmFyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGVqYkphcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZWpiSmFyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlQ6IHsKLQkJCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChtZXRob2RFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURTogewotCQkJCUNNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDTVBBdHRyaWJ1dGUoY21wQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRUF0dHJpYnV0ZShjbXBBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVBdHRyaWJ1dGUoY21wQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoY21wQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGNtcEF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChjbXBBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoY21wQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQUzogewotCQkJCVJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IChSZWxhdGlvbnNoaXBzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcHMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHJlbGF0aW9uc2hpcHMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWTogewotCQkJCVF1ZXJ5IHF1ZXJ5ID0gKFF1ZXJ5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VRdWVyeShxdWVyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QocXVlcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT046IHsKLQkJCQlFSkJSZWxhdGlvbiBlamJSZWxhdGlvbiA9IChFSkJSZWxhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCUmVsYXRpb24oZWpiUmVsYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGVqYlJlbGF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFOiB7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZSBlamJSZWxhdGlvbnNoaXBSb2xlID0gKEVKQlJlbGF0aW9uc2hpcFJvbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQlJlbGF0aW9uc2hpcFJvbGUoZWpiUmVsYXRpb25zaGlwUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZWpiUmVsYXRpb25zaGlwUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFOiB7Ci0JCQkJUm9sZVNvdXJjZSByb2xlU291cmNlID0gKFJvbGVTb3VyY2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvbGVTb3VyY2Uocm9sZVNvdXJjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qocm9sZVNvdXJjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRDogewotCQkJCUNNUkZpZWxkIGNtckZpZWxkID0gKENNUkZpZWxkKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDTVJGaWVsZChjbXJGaWVsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ01QQXR0cmlidXRlKGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRUF0dHJpYnV0ZShjbXJGaWVsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUF0dHJpYnV0ZShjbXJGaWVsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU46IHsKLQkJCQlNZXNzYWdlRHJpdmVuIG1lc3NhZ2VEcml2ZW4gPSAoTWVzc2FnZURyaXZlbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZURyaXZlbihtZXNzYWdlRHJpdmVuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbnRlcnByaXNlQmVhbihtZXNzYWdlRHJpdmVuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKTkRJRW52UmVmc0dyb3VwKG1lc3NhZ2VEcml2ZW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKG1lc3NhZ2VEcml2ZW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAobWVzc2FnZURyaXZlbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QobWVzc2FnZURyaXZlbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OOiB7Ci0JCQkJTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiA9IChNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbihtZXNzYWdlRHJpdmVuRGVzdGluYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVDogewotCQkJCUV4Y2x1ZGVMaXN0IGV4Y2x1ZGVMaXN0ID0gKEV4Y2x1ZGVMaXN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeGNsdWRlTGlzdChleGNsdWRlTGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZXhjbHVkZUxpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0Q6IHsKLQkJCQlRdWVyeU1ldGhvZCBxdWVyeU1ldGhvZCA9IChRdWVyeU1ldGhvZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUXVlcnlNZXRob2QocXVlcnlNZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocXVlcnlNZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHF1ZXJ5TWV0aG9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFk6IHsKLQkJCQlBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5ID0gKEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUc6IHsKLQkJCQlBY3RpdmF0aW9uQ29uZmlnIGFjdGl2YXRpb25Db25maWcgPSAoQWN0aXZhdGlvbkNvbmZpZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQWN0aXZhdGlvbkNvbmZpZyhhY3RpdmF0aW9uQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChhY3RpdmF0aW9uQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGFpbmVyIE1hbmFnZWQgRW50aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRhaW5lciBNYW5hZ2VkIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyTWFuYWdlZEVudGl0eShDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBlcm1pc3Npb24oTWV0aG9kUGVybWlzc2lvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBUcmFuc2FjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgVHJhbnNhY3Rpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFRyYW5zYWN0aW9uKE1ldGhvZFRyYW5zYWN0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2Vzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXNzaW9uKFNlc3Npb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW50aXR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRpdHkoRW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW50ZXJwcmlzZSBCZWFuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudGVycHJpc2UgQmVhbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRW50ZXJwcmlzZUJlYW4oRW50ZXJwcmlzZUJlYW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgTWV0aG9kIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBNZXRob2QgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQk1ldGhvZENhdGVnb3J5KEVKQk1ldGhvZENhdGVnb3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIEphcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgSmFyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXIoRUpCSmFyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNNUCBBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01QIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ01QQXR0cmlidXRlKENNUEF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlbGF0aW9uc2hpcHM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UXVlcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UXVlcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5KFF1ZXJ5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBSZWxhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUpCUmVsYXRpb24oRUpCUmVsYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbnNoaXBSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNvdXJjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZVNvdXJjZShSb2xlU291cmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01SIEZpZWxkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNNUiBGaWVsZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ01SRmllbGQoQ01SRmllbGQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERyaXZlbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERyaXZlbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURyaXZlbihNZXNzYWdlRHJpdmVuIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEcml2ZW4gRGVzdGluYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEcml2ZW4gRGVzdGluYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbihNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGNsdWRlIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjbHVkZSBMaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eShBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSk5ESUVudlJlZnNHcm91cChKTkRJRW52UmVmc0dyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVOYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVOYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FVHlwZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FVHlwZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FU3RydWN0dXJhbCBGZWF0dXJlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQXR0cmlidXRlKEVBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRUF0dHJpYnV0ZShKMkVFRUF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vRWpiU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9NREJBY3RpdmF0aW9uQ29uZmlnTW9kZWxVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9NREJBY3RpdmF0aW9uQ29uZmlnTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZDIzYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMzAsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBNREJBY3RpdmF0aW9uQ29uZmlnTW9kZWxVdGlsIHsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEhhc2hNYXAgYWN0aXZhdGlvbkNvbmZpZ01hcDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBhY2tNb2RlS2V5ID0gImFja25vd2xlZGdlTW9kZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uVHlwZUtleSA9ICJkZXN0aW5hdGlvblR5cGUiOy8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGR1cmFiaWxpdHlLZXkgPSAic3Vic2NyaXB0aW9uRHVyYWJpbGl0eSI7Ly8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWVzc2FnZVNlbGVjdG9yS2V5ID0gIm1lc3NhZ2VTZWxlY3RvciI7Ly8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBhY2tNb2RlVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgIkF1dG8tYWNrbm93bGVkZ2UiLCAiRHVwcy1vay1hY2tub3dsZWRnZSIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRlc3RpbmF0aW9uVHlwZVZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7ICJqYXZheC5qbXMuUXVldWUiLCAiamF2YXguam1zLlRvcGljIiB9Oy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkdXJhYmlsaXR5VmFsdWUgPSBuZXcgU3RyaW5nW10geyAiRHVyYWJsZSIsICJOb25EdXJhYmxlIiB9Oy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIE1EQkFjdGl2YXRpb25Db25maWdNb2RlbFV0aWwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEhhc2hNYXAgY3JlYXRlU3RhbmRhcmRBY3RpdmF0aW9uQ29uZmlnTWFwKCkgewotICAgICAgICBhY3RpdmF0aW9uQ29uZmlnTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgYWN0aXZhdGlvbkNvbmZpZ01hcC5wdXQoYWNrTW9kZUtleSwgYWNrTW9kZVZhbHVlcyk7Ci0gICAgICAgIGFjdGl2YXRpb25Db25maWdNYXAucHV0KGRlc3RpbmF0aW9uVHlwZUtleSwgZGVzdGluYXRpb25UeXBlVmFsdWVzKTsKLSAgICAgICAgYWN0aXZhdGlvbkNvbmZpZ01hcC5wdXQoZHVyYWJpbGl0eUtleSwgZHVyYWJpbGl0eVZhbHVlKTsKLSAgICAgICAgYWN0aXZhdGlvbkNvbmZpZ01hcC5wdXQobWVzc2FnZVNlbGVjdG9yS2V5LCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGFjdGl2YXRpb25Db25maWdNYXA7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9NZXRob2RFbGVtZW50SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9NZXRob2RFbGVtZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OGVjOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvTWV0aG9kRWxlbWVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotCi0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9QRVJNSVNTSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfVFJBTlNBQ1RJT04gPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYQ0xVREVfTElTVCA9IDM7Ci0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Q29udGFpbmVkVHlwZShNZXRob2RFbGVtZW50IG1lKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gbWUuZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gTk9ORTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb24pCi0JCQlyZXR1cm4gTUVUSE9EX1BFUk1JU1NJT047Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBNZXRob2RUcmFuc2FjdGlvbikKLQkJCXJldHVybiBNRVRIT0RfVFJBTlNBQ1RJT047Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFeGNsdWRlTGlzdCkKLQkJCXJldHVybiBFWENMVURFX0xJU1Q7Ci0JCXJldHVybiBOT05FOwotCX0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBlcm1pc3Npb24gZ2V0TWV0aG9kUGVybWlzc2lvbihNZXRob2RFbGVtZW50IG1lKSB7Ci0JCWlmIChNRVRIT0RfUEVSTUlTU0lPTiA9PSBnZXRDb250YWluZWRUeXBlKG1lKSkKLQkJCXJldHVybiAoTWV0aG9kUGVybWlzc2lvbikgbWUuZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyBNZXRob2RUcmFuc2FjdGlvbiBnZXRNZXRob2RUcmFuc2FjdGlvbihNZXRob2RFbGVtZW50IG1lKSB7Ci0JCWlmIChNRVRIT0RfVFJBTlNBQ1RJT04gPT0gZ2V0Q29udGFpbmVkVHlwZShtZSkpCi0JCQlyZXR1cm4gKE1ldGhvZFRyYW5zYWN0aW9uKSBtZS5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIEV4Y2x1ZGVMaXN0IGdldEV4Y2x1ZGVMaXN0KE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYgKEVYQ0xVREVfTElTVCA9PSBnZXRDb250YWluZWRUeXBlKG1lKSkKLQkJCXJldHVybiAoRXhjbHVkZUxpc3QpIG1lLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9SZWxhdGlvbnNoaXBzQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9SZWxhdGlvbnNoaXBzQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMGFlODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvUmVsYXRpb25zaGlwc0F0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLQotcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcHNBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpID09IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQkJCWFkZGVkRUpCUmVsYXRpb24oKEVKQlJlbGF0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSwgKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCQkJcmVtb3ZlZEVKQlJlbGF0aW9uKChFSkJSZWxhdGlvbikgbXNnLmdldE9sZFZhbHVlKCksIChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCByZW1vdmVkRUpCUmVsYXRpb24oRUpCUmVsYXRpb24gYVJlbGF0aW9uLCBFT2JqZWN0IHNmKSB7Ci0JCUFkYXB0ZXIgYSA9IGdldEFkYXB0ZXIoYVJlbGF0aW9uKTsKLQkJaWYgKGEgIT0gbnVsbCkgewotCQkJTm90aWZpY2F0aW9uIG5vdCA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KWFSZWxhdGlvbiwgTm90aWZpY2F0aW9uLlJFTU9WRSwoRVN0cnVjdHVyYWxGZWF0dXJlKSBzZiwgYVJlbGF0aW9uLCBudWxsLCBOb3RpZmljYXRpb24uTk9fSU5ERVgpOwotCQkJYS5ub3RpZnlDaGFuZ2VkKG5vdCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZGVkRUpCUmVsYXRpb24oRUpCUmVsYXRpb24gYVJlbGF0aW9uLCBFT2JqZWN0IHNmKSB7Ci0JCUFkYXB0ZXIgYSA9IGdldEFkYXB0ZXIoYVJlbGF0aW9uKTsKLQkJaWYgKGEgIT0gbnVsbCkgewotCQkJTm90aWZpY2F0aW9uIG5vdCA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KWFSZWxhdGlvbiwgTm90aWZpY2F0aW9uLkFERCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBzZiwgbnVsbCwgYVJlbGF0aW9uLCBOb3RpZmljYXRpb24uTk9fSU5ERVgpOwotCQkJYS5ub3RpZnlDaGFuZ2VkKG5vdCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBBZGFwdGVyIGdldEFkYXB0ZXIoRU9iamVjdCBhbk9iamVjdCkgewotCQlyZXR1cm4gRWNvcmVVdGlsLmdldEFkYXB0ZXIoYW5PYmplY3QuZUFkYXB0ZXJzKCksRUpCQXR0cmlidXRlTWFpbnRlbmFuY2VGYWN0b3J5SW1wbC5BREFQVEVSX0tFWSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2E3OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPkVKQiBBcnRpZmFjdCBFZGl0IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGVudGVycHJpc2UgYmVhbiBtb2R1bGUgbW9kZWwgYXBpLiBVc2luZyB0aGlzIGFwaSB0aGUgYXJ0aWZhY3RzIG9mIGFuIGVudGVycHJpc2UgYmVhbiBhcHAKLSAgICAgICAgY2FuIGJlIGNyZWF0ZWQgYW5kIGFjY2Vzc2VkLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRGVmYXVsdEVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRGVmYXVsdEVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTIxNDYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0RlZmF1bHRFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDI1LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgaW1wbGVtZW50cyBJRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIHsKLSAgICAKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdEVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JfQotCQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvcmUubW9kdWxlZXh0ZW5zaW9uLmhlbHBlci5JRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyI2dldEVKQk1vZHVsZUV4dGVuc2lvbihqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb3JlLm1vZHVsZWV4dGVuc2lvbi5oZWxwZXIuSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciNoYXNFSkJNb2R1bGVFeHRlbnNpb24oamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFSkJNb2R1bGVFeHRlbnNpb24oT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGdldEVKQk1vZHVsZUV4dGVuc2lvbihjb250ZXh0KSAhPSBudWxsOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0VKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9FSkJNb2RlbEV4dGVuZGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTZlODg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0VKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIgaW1wbGVtZW50cyBJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIgeyAKLQotICAgIHByaXZhdGUgSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciBwcm92aWRlciA9IG5ldyBEZWZhdWx0RUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgU2hvdWxkIHVzZSBJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKG51bGwpOwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGdldEVKQk1vZHVsZUV4dGVuc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIElFSkJNb2RlbEV4dGVuZGVyTWFuYWdlci5JTlNUQU5DRS5nZXRFSkJNb2R1bGVFeHRlbnNpb24obnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBnZXRFSkJNb2R1bGVFeHRlbnNpb24oT2JqZWN0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldEVKQk1vZHVsZUV4dGVuc2lvbihjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRUpCTW9kdWxlRXh0ZW5zaW9uKE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBnZXRFSkJNb2R1bGVFeHRlbnNpb24oY29udGV4dCkgIT0gbnVsbDsKLSAgICB9IAotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvcmUubW9kdWxlZXh0ZW5zaW9uLmhlbHBlci5JRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIjc2V0UHJvdmlkZXIob3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29yZS5tb2R1bGVleHRlbnNpb24uaGVscGVyLklFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvdmlkZXIoSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciBwcm92aWRlcikgewotICAgICAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvcmUubW9kdWxlZXh0ZW5zaW9uLmhlbHBlci5JRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIjaXNQcm92aWRlclNldCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm92aWRlclNldCgpIHsKLSAgICAgICAgcmV0dXJuICEodGhpcy5wcm92aWRlciBpbnN0YW5jZW9mIERlZmF1bHRFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0VqYk1vZHVsZUV4dGVuc2lvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYjQyNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0KLS8qKgotICogVGhpcyBpcyBhIGhlbHBlciB1c2VkIGZvciBkZXJpdmluZyB0aGUgSk5ESSBuYW1lIG9mIGVudGVycHJpc2UgYmVhbnMsCi0gKiBhbmQgZm9yIGluaGVyaXRhbmNlIHN1cHBvcnQuICBUaGUgaGVscGVyIGNhbiBiZSBwbHVnZ2VkIGluIGJ5IGFwcGxpY2F0aW9uCi0gKiBzZXJ2ZXIgdmVuZG9ycy4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBleHRlbmRzIEoyRUVNb2R1bGVFeHRlbnNpb25IZWxwZXIgewotCUxpc3QgZ2V0U3VidHlwZXMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpOwotCUVudGVycHJpc2VCZWFuIGdldFN1cGVyVHlwZShFbnRlcnByaXNlQmVhbiBhbkVKQik7Ci0JTGlzdCBnZXRSb2xlTWV0aG9kTmFtZXNFeHRlbmRlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCk7Ci0JU3RyaW5nIGdldEVKQkluaGVyaXRhbmNlRmlsZU5hbWUoKTsKLQlTdHJpbmcgZ2V0Sk5ESU5hbWUoRUpCSmFyIGphciwgRW50ZXJwcmlzZUJlYW4gYmVhbik7IAotCUxpc3QgZ2V0UmVsYXRpb25zaGlwc19jbXAxMShFSkJKYXIgamFyKTsKLQlMaXN0IGdldExvY2FsUmVsYXRpb25zaGlwUm9sZXNfY21wMTEoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApOwotCWJvb2xlYW4gaXNFSkJJbmhlcml0YW5jZVN1cHBvcnRlZCgpOwotCVN0cmluZyBnZXRKYXZhRUVKTkRJTmFtZShvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIgamFyLCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiBiZWFuLCBTdHJpbmcgaW50ZXJmYWNlQ2xhc3NOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0V4Y2VwdGlvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZDdkMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBmYWN0b3IgY29tbW9uIGNvZGUgZm9yIGltcGxlbWVudGVycyBvZiBJV3JhcHBlZEV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGVscGVyIHsKLS8qKgotICogVXRpbGl0eSBjbGFzczsgY2Fubm90IGJlIGluc3RhbnRpYXRlZAotICovCi1wcml2YXRlIEV4Y2VwdGlvbkhlbHBlcigpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gQGV4Y2VwdGlvbiBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLSAqLwotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoSVdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0JbWVzc2FnZXMuYWRkKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleGNlcHRpb24uZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0Jd2hpbGUgKG5lc3RlZCAhPSBudWxsKSB7Ci0JCW1lc3NhZ2VzLmFkZChuZXN0ZWQuZ2V0TWVzc2FnZSgpKTsKLQkJaWYgKG5lc3RlZCBpbnN0YW5jZW9mIElXcmFwcGVkRXhjZXB0aW9uKSAKLQkJCW5lc3RlZCA9ICgoSVdyYXBwZWRFeGNlcHRpb24pbmVzdGVkKS5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJZWxzZQotCQkJbmVzdGVkID0gbnVsbDsKLQl9Ci0JcmV0dXJuIChTdHJpbmdbXSltZXNzYWdlcy50b0FycmF5KG5ldyBTdHJpbmdbbWVzc2FnZXMuc2l6ZSgpXSk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSBAZXhjZXB0aW9uIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdCwKLSAqIGNvbmNhdGVuYXRlZCBhcyBvbmUKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoSVdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JU3RyaW5nW10gbWVzc2FnZXMgPSBnZXRBbGxNZXNzYWdlcyhleGNlcHRpb24pOwotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjU2KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKXsKLQkJc2IuYXBwZW5kKG1lc3NhZ2VzW2ldKTsKLQkJaWYgKGkgPCBtZXNzYWdlcy5sZW5ndGgtMSkKLQkJCXNiLmFwcGVuZCgnXG4nKTsKLQl9Ci0JcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUNvbW1vbkVNRk1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUNvbW1vbkVNRk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmQ5NGY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDb21tb25FTUZNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi0vKioKLSAqIFVzZWQgdG8gaW50cm9kdWNlIEVNRiBtb2RlbCBjb25jZXB0cyBvbiBib3RoIEphdmEgRUUgbW9kZWwgaW1wbGVtZW50YXRpb25zIC0gc2VwYXJhdGVkIGZyb20gY2xlYW4gTW9kdWxlIGludGVyZmFjZQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbW9uRU1GTW9kdWxlIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIHN0cmluZyBmcmFnbWVudCB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgb2JqZWN0IC0gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBmcmFnKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGlkIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lFSkJNb2RlbEV4dGVuZGVyTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MmIyZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLS8qKgotICogVGhlIElFSkJNb2RlbEV4dGVuZGVyTWFuYWdlciByZXBsYWNlcyB0aGUgZm9ybWVyIEoyRUVNb2R1bGVFeHRlbnNpb25NYW5hZ2VyIGFuZCBhY3RzCi0gKiBhcyBhIGZhY2FkZSBmb3IgYSBzaW5nbGUgSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci4gVGhlIElFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgd2lsbAotICogcHJvdmlkZSB0aGUgY29ycmVjdCBleHRlbnNpb24gaGVscGVyIGJhc2VkIG9uIGEgZ2l2ZW4gY29udGV4dCAoQHNlZSBJRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyKS4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyIGV4dGVuZHMgSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciB7Ci0KLSAgICBJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvdmlkZXIgZm9yIHdoaWNoIHRoZSBtYW5hZ2VyIGlzIGEgZmFjYWRlIGhhcyBiZWVuIHNldAotICAgICAqLwotICAgIGJvb2xlYW4gaXNQcm92aWRlclNldCgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3ZpZGVyIHRoZSBtYW5hZ2VyIHdpbGwgYWN0IGFzIGEgZmFjYWRlIHRvIHRoZSBnaXZlbiBwcm92aWRlcgotICAgICAqLwotICAgIHZvaWQgc2V0UHJvdmlkZXIoSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciBwcm92aWRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmMjg1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyNSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgewotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQgYSBzdXBwbGllZCBvYmplY3QgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0IChlLmcuIElQcm9qZWN0IGlmIGF2YWlsYWJsZSkKLSAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgb3IgPGI+bnVsbDwvYj4gaWYgbm9uZSBleGlzdHMKLSAgICAgKi8KLSAgICBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKE9iamVjdCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IGEgc3VwcGxpZWQgb2JqZWN0IHRvIGRldGVybWluZSB0aGUgY29udGV4dCAoZS5nLiBJUHJvamVjdCBpZiBhdmFpbGFibGUpCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjb250ZXh0IGhhcyBhbiBleHRlbnNpb24gCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNFSkJNb2R1bGVFeHRlbnNpb24oT2JqZWN0IGNvbnRleHQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSVdyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlMDIxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi0KLQotLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIGZvciBXcmFwcGVkUnVudGltZSBhbmQgV3JhcHBlZCBleGNlcHRpb25zLCB3aGljaCBjYW4gY29udGFpbiBuZXN0ZWQgZXhjZXB0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXcmFwcGVkRXhjZXB0aW9uIHsKLS8qKgotICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0gKi8KLXB1YmxpYyBTdHJpbmdbXSBnZXRBbGxNZXNzYWdlcygpOwotLyoqCi0gKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QsCi0gKiBjb25jYXRlbmF0ZWQgYXMgb25lCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKTsKLXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpOwotcHVibGljIGphdmEubGFuZy5FeGNlcHRpb24gZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKTsKLXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpOwotcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgcyk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGViYWJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIFN0ZWZhbiBEaW1vdiwgc3RlZmFuLmRpbW92QHNhcC5jb20gLSBidWcgMjA3ODI2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi0KLQotLyoqCi0gKiBUaGlzIGlzIGEgY2F0YWxvZyBvZiB1c2VmdWwgY29uc3RhbnRzIGZvciB0aGUgYXJjaGl2ZSBzdXBwb3J0LiAgQ2FuIGJlIHVzZWQgdG8KLSAqIHN0b3JlIHJlbGF0aXZlIHBhdGhzIHRvIHNwZWNpZmljIHhtbCBhbmQgeG1pIHJlc291cmNlcy4gIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVDb25zdGFudHMgZXh0ZW5kcyBKMkVFVmVyc2lvbkNvbnN0YW50cyB7Ci0gICAgLy9TdGFuZGFyZCBKYXIgaW5mbwotICAgICAgICAgICAgLyoqICJNRVRBLUlORi9NQU5JRkVTVC5NRiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgTUFOSUZFU1RfVVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIk1FVEEtSU5GL01BTklGRVNULk1GIjsgLy8kTk9OLU5MUy0xJAotICAgIFVSSSBNQU5JRkVTVF9VUklfT0JKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgVVJJLmNyZWF0ZVVSSShNQU5JRkVTVF9VUkkpOwotICAgIFN0cmluZyBNQU5JRkVTVF9TSE9SVF9OQU1FICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIk1BTklGRVNULk1GIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAvKiogIk1FVEEtSU5GIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIE1FVEFfSU5GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAiTUVUQS1JTkYiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqICJXRUItSU5GIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBXRUJfSU5GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQl9JTkZfQ0xBU1NFUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAiV0VCLUlORi9jbGFzc2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfSU5GX0xJQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIldFQi1JTkYvbGliIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiAiQUxULUlORiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgQUxUX0lORiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJBTFQtSU5GIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vQXBwbGljYXRpb24gY2xpZW50IGluZm8KLSAgICAvKiogIkFwcGxpY2F0aW9uLWNsaWVudF9JRCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgIkFwcGxpY2F0aW9uLWNsaWVudF9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogIk1FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIEFQUF9DTElFTlRfRERfVVJJICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAiTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBVUkkgQVBQX0NMSUVOVF9ERF9VUklfT0JKICAgICAgICAgICAgICAgPSAgICAgICBVUkkuY3JlYXRlVVJJKEFQUF9DTElFTlRfRERfVVJJKTsKLSAgICAvKiogImFwcGxpY2F0aW9uLWNsaWVudC54bWwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9ERF9TSE9SVF9OQU1FICAgICAgICAgPSAgICAgICAiYXBwbGljYXRpb24tY2xpZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogRG9jIHR5cGUgZm9yIGFwcCBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyAqLwotICAgIFN0cmluZyBBUFBfQ0xJRU5UX0RPQ1RZUEUgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgImFwcGxpY2F0aW9uLWNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzIgICAgICAgICAgPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4yLy9FTiI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzMgICAgICAgICAgPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4zLy9FTiI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9TWVNURU1JRF8xXzIgICAgICAgICAgPSAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvYXBwbGljYXRpb24tY2xpZW50XzFfMi5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUF9DTElFTlRfQUxUX1NZU1RFTUlEXzFfMiAgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2FwcGxpY2F0aW9uLWNsaWVudF8xLjIuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBfQ0xJRU5UX1NZU1RFTUlEXzFfMyAgICAgICAgICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9BTFRfU1lTVEVNSURfMV8zICAgICAgPSAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb24tY2xpZW50XzEuMy5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUF9DTElFTlRfU0NIRU1BXzFfNCAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBfQ0xJRU5UX1NDSEVNQV81ICAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZCI7IC8vJE5PTi1OTFMtMSQgLy8gRUpCMwotICAgIAotICAgIC8vQXBwbGljYXRpb24gY29uc3RhbnRzCi0gICAgLyoqICJBcHBsaWNhdGlvbl9JRCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgQVBQTF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIkFwcGxpY2F0aW9uX0lEIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiAiTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBBUFBMSUNBVElPTl9ERF9VUkkgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBVUkkgQVBQTElDQVRJT05fRERfVVJJX09CSiAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgIFVSSS5jcmVhdGVVUkkoQVBQTElDQVRJT05fRERfVVJJKTsKLSAgICAvKiogImFwcGxpY2F0aW9uLnhtbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBBUFBMSUNBVElPTl9ERF9TSE9SVF9OQU1FICAgICAgICA9ICAgICAgICJhcHBsaWNhdGlvbi54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEVBUl9GSUxFX0VYVCA9ICIuZWFyIjsgLy8vLyROT04tTkxTLTEkCi0gICAgLyoqIERvYyB0eXBlIGZvciBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzICovCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX0RPQ1RZUEUgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMiAgICAgICAgID0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4yLy9FTiI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQVBQTElDQVRJT05fUFVCTElDSURfMV8zICAgICAgICAgPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBMSUNBVElPTl9QVUJMSUNJRF8xXzQgICAgICAgICA9ICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuNC8vRU4iOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMiAgICAgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2FwcGxpY2F0aW9uXzFfMi5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX0FMVF9TWVNURU1JRF8xXzIgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2FwcGxpY2F0aW9uXzEuMi5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMyAgICAgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX0FMVF9TWVNURU1JRF8xXzMgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzEuMy5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfNCAgICAgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfNC5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX0FMVF9TWVNURU1JRF8xXzQgPSAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfNC5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX1NDSEVNQV8xXzQgICAgICAgPSAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIjsvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX1NDSEVNQV81ICAgICAgICAgPSAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNS54c2QiOyAvLyROT04tTkxTLTEkIC8vIEVKQjMKLSAgICAKLSAgICAvL0VKQiBKYXIgQ29uc3RhbnRzCi0gICAgLyoqICJlamItamFyX0lEIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBFSkJKQVJfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAiZWpiLWphcl9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogIkFzc2VtYmx5RGVzY3JpcHRvcl9JRCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBBU1NFTUJMWURFU0NSSVBUT1JfSUQgICAgICAgID0gICAiQXNzZW1ibHlEZXNjcmlwdG9yX0lEIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiAiZWpiLWphci54bWwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgRUpCSkFSX0REX1NIT1JUX05BTUUgICAgICAgICA9ICAgImVqYi1qYXIueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiAiTUVUQS1JTkYvZWpiLWphci54bWwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIEVKQkpBUl9ERF9VUkkgICAgICAgICAgICAgICAgPSAgICJNRVRBLUlORi9lamItamFyLnhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBVUkkgRUpCSkFSX0REX1VSSV9PQkogICAgICAgICAgICAgICA9ICAgVVJJLmNyZWF0ZVVSSShFSkJKQVJfRERfVVJJKTsKLSAgICAvKiogIk1FVEEtSU5GL2libS1lamItamFyLWJuZC54bWkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgRUpCSkFSX0RPQ1RZUEUgICAgICAgICAgICAgICA9ICAgICAgICJlamItamFyIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBFSkJKQVJfUFVCTElDSURfMV8xICAgICAgPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgRUpCSkFSX1BVQkxJQ0lEXzJfMCAgICAgID0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEVKQkpBUl9TWVNURU1JRF8xXzEgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2VqYi1qYXJfMV8xLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgRUpCSkFSX0FMVF9TWVNURU1JRF8xXzEgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvZWpiLWphcl8xLjEuZHRkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBFSkJKQVJfU1lTVEVNSURfMl8wICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9lamItamFyXzJfMC5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEVKQkpBUl9BTFRfU1lTVEVNSURfMl8wICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMi4wLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgRUpCSkFSX1NDSEVNQV8yXzEgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2VqYi1qYXJfMl8xLnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBFSkJKQVJfU0NIRU1BXzJfMV9OUyAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2VqYi1qYXJfMl8xLnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBFSkJKQVJfU0NIRU1BXzNfMCAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZCI7IC8vJE5PTi1OTFMtMSQgLy8gRUpCMwotICAgIFN0cmluZyBFSkJKQVJfU0NIRU1BXzNfMF9OUyAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIjsgLy8kTk9OLU5MUy0xJCAvLyBFSkIzCi0gICAgCi0gICAgLy8gRUFSIGNvbnN0YW50cwotICAgIAotICAgIFN0cmluZyBFQVJfUk9PVF9ESVIJCQkJPQkiLyI7Ci0gICAgU3RyaW5nIEVBUl9ERUZBVUxUX0xJQl9ESVIJCT0JIi9saWIiOwotICAgIAotICAgIC8vV2ViIGFwcCBDb25zdGFudHMKLSAgICAvKiogIldlYkFwcF9JRCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIFdFQkFQUF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJXZWJBcHBfSUQiOyAvLyROT04tTkxTLTEkCi0gICAgLyoqICJXRUItSU5GL3dlYi54bWwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgV0VCQVBQX0REX1VSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJXRUItSU5GL3dlYi54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgVVJJIFdFQkFQUF9ERF9VUklfT0JKICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICBVUkkuY3JlYXRlVVJJKFdFQkFQUF9ERF9VUkkpOwotICAgIC8qKiAid2ViLnhtbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgV0VCQVBQX0REX1NIT1JUX05BTUUgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJ3ZWIueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiAiV0VCLUlORi9pYm0td2ViLWJuZC54bWkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKiBEb2MgdHlwZSBmb3Igd2ViIGFwcCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzICovCi0gICAgU3RyaW5nIFdFQkFQUF9ET0NUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAid2ViLWFwcCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQ09OVEVYVFJPT1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gImNvbnRleHQtcm9vdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCQVBQX1BVQkxJQ0lEXzJfMiAgICAgICAgICAgICAgPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMi8vRU4iOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQkFQUF9QVUJMSUNJRF8yXzMgICAgICAgICAgICAgID0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJBUFBfU1lTVEVNSURfMl8yICAgICAgICAgICAgICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy93ZWItYXBwXzJfMi5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQkFQUF9BTFRfU1lTVEVNSURfMl8yICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy93ZWItYXBwXzIuMi5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQkFQUF9TWVNURU1JRF8yXzMgICAgICAgICAgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCQVBQX0FMVF9TWVNURU1JRF8yXzMgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMi4zLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCQVBQX1NDSEVNQV8yXzQgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJBUFBfU0NIRU1BXzJfNSAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIC8vSjJDIFJlc291cmNlIEFkYXB0ZXIgQ29uc3RhbnRzCi0gICAgLyoqICJKMkNSZXNvdXJjZUFkYXB0ZXJfSUQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBTdHJpbmcgUkFSX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIkoyQ1Jlc291cmNlQWRhcHRlcl9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKiogIk1FVEEtSU5GL3JhLnhtbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBSQVJfRERfVVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAiTUVUQS1JTkYvcmEueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIFVSSSBSQVJfRERfVVJJX09CSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICBVUkkuY3JlYXRlVVJJKFJBUl9ERF9VUkkpOwotICAgIFN0cmluZyBSQVJfU0hPUlRfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgInJhLnhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvL05lZWQgY29ubmVjdG9yIGNvbnN0YW50LgotICAgIFN0cmluZyBDT05ORUNUT1JfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAiQ29ubmVjdG9yX0lEIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiBEb2MgdHlwZSBmb3IgY29ubmVjdG9yIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgKi8KLSAgICBTdHJpbmcgQ09OTkVDVE9SX0RPQ1RZUEUgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJjb25uZWN0b3IiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIENPTk5FQ1RPUl9QVUJMSUNJRF8xXzAgICAgICAgICAgID0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIENvbm5lY3RvciAxLjAvL0VOIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBDT05ORUNUT1JfU1lTVEVNSURfMV8wICAgICAgICAgICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9jb25uZWN0b3JfMV8wLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQ09OTkVDVE9SX0FMVF9TWVNURU1JRF8xXzAgICAgICAgPSAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzEuMC5kdGQiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIENPTk5FQ1RPUl9TQ0hFTUFfMV81ICAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvY29ubmVjdG9yXzFfNS54c2QiOy8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvL1dlYiBTZXJ2aWNlcyBDb25zdGFudHMKLSAgICAvKiogRG9jIHR5cGUgZm9yIHdlYnNlcnZpY2VzIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgKi8KLSAgICBTdHJpbmcgV0VCX1NFUlZJQ0VTX0NMSUVOVF9ET0NUWVBFICAgICAgPSAid2Vic2VydmljZXNjbGllbnQiOyAgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UX1BVQkxJQ0lEXzFfMCA9ICItLy9JQk0gQ29ycG9yYXRpb24sIEluYy4vL0RURCBKMkVFIFdlYiBzZXJ2aWNlcyBjbGllbnQgMS4wLy9FTiI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCX1NFUlZJQ0VTX0NMSUVOVF9TWVNURU1JRF8xXzAgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL2R0ZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8wLmR0ZCI7IC8vJE5PTi1OTFMtMSQgIAotICAgIFN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UX0xPQ18xXzEgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCX1NFUlZJQ0VTX0NMSUVOVF9TSE9SVE5BTUUgICAgPSAid2Vic2VydmljZXNjbGllbnQueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UX0REX1VSSSAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAid2Vic2VydmljZXNjbGllbnQueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UX01FVEFfSU5GX0REX1VSSSAgICAgID0gICAiTUVUQS1JTkYvd2Vic2VydmljZXNjbGllbnQueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UX1dFQl9JTkZfRERfVVJJICAgICAgID0gICAiV0VCLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgVVJJIFdFQl9TRVJWSUNFU19DTElFTlRfRERfVVJJX09CSiAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgIFVSSS5jcmVhdGVVUkkoV0VCX1NFUlZJQ0VTX0NMSUVOVF9ERF9VUkkpOwotICAgIFVSSSBXRUJfU0VSVklDRVNfQ0xJRU5UX01FVEFfSU5GX0REX1VSSV9PQkogICAgID0gICAgICAgVVJJLmNyZWF0ZVVSSShXRUJfU0VSVklDRVNfQ0xJRU5UX01FVEFfSU5GX0REX1VSSSk7Ci0gICAgVVJJIFdFQl9TRVJWSUNFU19DTElFTlRfV0VCX0lORl9ERF9VUklfT0JKICAgICAgPSAgICAgICBVUkkuY3JlYXRlVVJJKFdFQl9TRVJWSUNFU19DTElFTlRfV0VCX0lORl9ERF9VUkkpOwotICAgIAotICAgIC8qKiBEb2MgdHlwZSBmb3Igd2Vic2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyAqLwotICAgIFN0cmluZyBXRUJfU0VSVklDRVNfRE9DVFlQRSAgICAgIAkJPSAid2Vic2VydmljZXMiOyAgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfU0VSVklDRVNfRERfVVJJICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIndlYnNlcnZpY2VzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCX1NFUlZJQ0VTX01FVEFfSU5GX0REX1VSSSAgICAgPSAgICJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQl9TRVJWSUNFU19XRUJfSU5GX0REX1VSSSAgICAgID0gICAiV0VCLUlORi93ZWJzZXJ2aWNlcy54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgVVJJIFdFQl9TRVJWSUNFU19ERF9VUklfT0JKICAgICAgICAgICAgICAgICAgICAgPSAgICAgICBVUkkuY3JlYXRlVVJJKFdFQl9TRVJWSUNFU19ERF9VUkkpOwotICAgIFVSSSBXRUJfU0VSVklDRVNfTUVUQV9JTkZfRERfVVJJX09CSiAgICA9IFVSSS5jcmVhdGVVUkkoV0VCX1NFUlZJQ0VTX01FVEFfSU5GX0REX1VSSSk7Ci0gICAgVVJJIFdFQl9TRVJWSUNFU19XRUJfSU5GX0REX1VSSV9PQkogICAgID0gICAgICAgVVJJLmNyZWF0ZVVSSShXRUJfU0VSVklDRVNfV0VCX0lORl9ERF9VUkkpOwotICAgIFN0cmluZyBXRUJTRVJWSUNFX1NZU1RFTUlEICAgID0gImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy9kdGQvajJlZV93ZWJfc2VydmljZXNfMV8wLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCU0VSVklDRV9QVUJMSUNJRCA9ICItLy9JQk0gQ29ycG9yYXRpb24sIEluYy4vL0RURCBKMkVFIFdlYiBzZXJ2aWNlcyAxLjAvL0VOIjsgLy8kTk9OLU5MUy0xJCAgCi0gICAgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BXzFfMSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJTRVJWSUNFX1NDSEVNQV9MT0NfU1VOXzFfMSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiOy8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfMV8yID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkIjsvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU5fMV8yID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QiOy8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvL01pc2NlbGxhbmVvdXMgY29uc3RhbnRzCi0gICAgLyoqICJVVEYtOCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgU3RyaW5nIERFRkFVTFRfWE1MX0VOQ09ESU5HICAgICAgICAgICAgID0gICAgICAgIlVURi04IjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKiAiMS4wIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFN0cmluZyBERUZBVUxUX1hNTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgIjEuMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgSkFWQV9TVU5fQ09NX1VSTCAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20iOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIFdXV19XM19PUkdfVVJMICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICJodHRwOi8vd3d3LnczLm9yZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV1dXX0lCTV9DT01fVVJMICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgImh0dHA6Ly93d3cuaWJtLmNvbSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBTdHJpbmcgSjJFRV9OU19VUkwgICAgICAgICAgICAgICAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgSkFWQUVFX05TX1VSTCAgICAgICAgICAgICAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIjsgLy8kTk9OLU5MUy0xJCAvL0VKQjMKLSAgICBTdHJpbmcgSjJFRV8xXzRfWFNEX1NIT1JUX05BTUUgICAgICAgICAgPSAiajJlZV8xXzQueHNkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBKQVZBRUVfNV9YU0RfU0hPUlRfTkFNRSAgICAgICAgICA9ICJqYXZhZWVfNS54c2QiOyAvLyROT04tTkxTLTEkICAvL0VKQjMKLSAgICBTdHJpbmcgWFNJX05TX1VSTCAgICAgICAgICAgICAgICAgICAgICAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkIAotICAgIFN0cmluZyBBUFBMSUNBVElPTl9TQ0hFTUFfTE9DXzFfNCAgICAgICA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEFQUExJQ0FUSU9OX1NDSEVNQV9MT0NfNSAgICAgICAgID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl81LnhzZCI7IC8vJE5PTi1OTFMtMSQgICAgICAgIC8vIEVKQjMKLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9TQ0hFTUFfTE9DXzFfNCAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQVBQX0NMSUVOVF9TQ0hFTUFfTE9DXzUgICAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZCI7IC8vJE5PTi1OTFMtMSQgLy9FSkIzCi0gICAgU3RyaW5nIEVKQl9KQVJfU0NIRU1BX0xPQ18yXzEgICAgICAgICAgID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBFSkJfSkFSX1NDSEVNQV9MT0NfM18wICAgIAkJPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZCI7IC8vJE5PTi1OTFMtMSQgLy8gRUpCMwotICAgIFN0cmluZyBDT05ORUNUT1JfU0NIRU1BX0xPQ18xXzUgICAgICAgICA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBXRUJfQVBQX1NDSEVNQV9MT0NfMl80ICAgICAgICAgICA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgV0VCX0FQUF9TQ0hFTUFfTE9DXzJfNSAgICAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI7IC8vJE5PTi1OTFMtMSQgLy9FSkIzCi0gICAgU3RyaW5nIFdFQl9TRVJWSUNFU19DTElFTlRfU0NIRU1BX0xPQ18xXzEgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgSlNQX1NDSEVNQV9MT0NfMl8wICAgICAgICAgICAgICAgPSAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvanNwXzJfMC54c2QiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIEpTUF9TQ0hFTUFfTE9DXzJfMSAgICAgICAgICAgICAgID0gICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvanNwXzJfMS54c2QiOyAvLyROT04tTkxTLTEkIC8vRUpCMwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9NT0RFTF9OQU1FID0gIkVBUl9WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJAotfQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRUluaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVJbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzFjNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRUluaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWwuRUpCQXR0cmlidXRlTWFpbnRlbmFuY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVhNSVJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvclJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZC5Xc2RkUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FbmNvZGVyRGVjb2RlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUGFzc3dvcmRFbmNvZGVyRGVjb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmV2aXNpdDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEwLzMvMjAwMCAzOjA3OjM3IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUluaXQgewotCQotCQotCXN0YXRpYyB7Ci0JCXRyeSB7IAotCQkJaWYoQm9vbGVhbi5nZXRCb29sZWFuKCJMT0dfWEVSQ0VTX1ZFUlNJT04iKSkgewkJCQkgLy8kTk9OLU5MUy0xJAotCQkJCUNsYXNzIGNseiA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkubG9hZENsYXNzKCJvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCU1ldGhvZCBtYWluID0gY2x6LmdldERlY2xhcmVkTWV0aG9kKCJtYWluIiwgbmV3IENsYXNzW10geyBTdHJpbmdbXS5jbGFzcyB9ICk7IC8vJE5PTi1OTFMtMSQKLQkJCQlPYmplY3QgdmVyc2lvbiA9IGNsei5uZXdJbnN0YW5jZSgpOwotCQkJCW1haW4uaW52b2tlKHZlcnNpb24sIG5ldyBPYmplY3RbXSB7IG5ldyBTdHJpbmdbXSB7fSB9KTsgCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGNsei5nZXRSZXNvdXJjZSgiVmVyc2lvbi5jbGFzcyIpKTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaChUaHJvd2FibGUgdCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIHdoaWxlIGxvZ2dpbmcgdmVyc2lvbiAiICsgdCk7Ci0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IAotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gcGx1Z2luX2luaXRpYWxpemVkID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7Ci0JCWluaXQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoYm9vbGVhbiBzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCXNldERlZmF1bHRFbmNvZGVyRGVjb2RlcigpOwotCQkJRE9NVXRpbGl0aWVzLnNldERlZmF1bHRFbnRpdHlSZXNvbHZlcihKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuSU5TVEFOQ0UpOwotCQkJb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdC5KYXZhSW5pdC5pbml0KHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpOwotCQkJaWYgKHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpCi0JCQkJcHJlUmVnaXN0ZXJQYWNrYWdlcygpOwotCQkJaW5pdFJlc291cmNlRmFjdG9yaWVzKCk7Ci0JCQlFamJGYWN0b3J5SW1wbC5pbnRlcm5hbFJlZ2lzdGVyRUpCUmVsYXRpb25BZGFwdGVyRmFjdG9yeShuZXcgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKCkgewotCQkJCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCQkJcmV0dXJuIG5ldyBFSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlFamJGYWN0b3J5SW1wbC5pbnRlcm5hbFJlZ2lzdGVyUmVsYXRpb25zaGlwc0FkYXB0ZXJGYWN0b3J5KG5ldyBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IoKSB7Ci0JCQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCkgewotCQkJCQlyZXR1cm4gbmV3IEVKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQl9Ci0JfQotCi0JLyoqIAotCSAqIElmIHRoZSBjdXJyZW50bHkgZGVmYXVsdGVkIGVuY29kZXIgaXMgdGhlIGluaXRpYWwgcGFzcyB0aHJ1IGVuY29kZXIsCi0JICogdGhlbiByZWdpc3RlciBhIFBhc3N3b3JkIGVuY29kZXIgZm9yIHNlY3VyaXR5OyBvdGhlcndpc2UgaWYgYSBtb3JlIHNvcGhpc3RpY2F0ZWQKLQkgKiBlbmNvZGVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgdGhlbiBkbyBub3RoaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKCkgewotCQlFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IHJlZyA9IEVuY29kZXJEZWNvZGVyUmVnaXN0cnkuZ2V0RGVmYXVsdFJlZ2lzdHJ5KCk7Ci0JCWlmIChyZWcuZ2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKCkgPT0gRW5jb2RlckRlY29kZXJSZWdpc3RyeS5JTklUSUFMX0RFRkFVTFRfRU5DT0RFUikgewotCQkJcmVnLnNldERlZmF1bHRFbmNvZGVyRGVjb2RlcihuZXcgUGFzc3dvcmRFbmNvZGVyRGVjb2RlcigpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlUmVnaXN0ZXJQYWNrYWdlcygpIHsKLQkJLy9jb21tb24KLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJjb21tb24ueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCQlwdWJsaWMgRUZhY3RvcnkgZ2V0RUZhY3RvcnkoKSB7Ci0JCQkJcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsKLQkJLy9hcHBsaWNhdGlvbgotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoImFwcGxpY2F0aW9uLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCQlwdWJsaWMgRUZhY3RvcnkgZ2V0RUZhY3RvcnkoKSB7Ci0JCQkJcmV0dXJuIEFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCQkvL2NsaWVudAotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoImNsaWVudC54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQlyZXR1cm4gQ2xpZW50RmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCQkvL3dlYmFwcGxpY2F0aW9uCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgid2ViYXBwbGljYXRpb24ueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQlyZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JCS8vZWpiCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgiZWpiLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgewotCQkJCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JCS8vamNhCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgiamNhLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgewotCQkJCXJldHVybiBKY2FGYWN0b3J5LmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JCS8vd2Vic2VydmljZXNjbGllbnQKLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJ3ZWJzZXJ2aWNlX2NsaWVudC54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgewotCQkJCXJldHVybiBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsKLQkJLy93ZWJzZXJ2aWNlc2NvbW1vbgotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoIndzY29tbW9uLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCQlwdWJsaWMgRUZhY3RvcnkgZ2V0RUZhY3RvcnkoKSB7Ci0JCQkJcmV0dXJuIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCQkvL3dlYnNlcnZpY2VzZGQKLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJ3c2RkLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIFdzZGRQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQlyZXR1cm4gV3NkZEZhY3RvcnkuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsKLQkJLy9qYXhycGNtYXAKLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJqYXhycGNtYXAueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCQlwdWJsaWMgRUZhY3RvcnkgZ2V0RUZhY3RvcnkoKSB7Ci0JCQkJcmV0dXJuIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsJCQotLy8JCWpzcAotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoImpzcC54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBKc3BQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQlyZXR1cm4gSnNwRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCQkvL3RhZ2xpYgotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoInRhZ2xpYi54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKLQkJCQlyZXR1cm4gVGFnbGliRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwkKLQkJCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRSZXNvdXJjZUZhY3RvcmllcygpIHsKLQkJLy9NYWtlIHByb3RlY3RlZAkKLQkJUmV2aXNpdC5yZXZpc2l0KCk7Ci0KLQkJLy8gT25seSByZWdpc3RlciB0aGUgZGVmYXVsdCBmYWN0b3JpZXMgaWYgYW5vdGhlciBzZXQgaGFzIG5vdAotCQkvLyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZC4KLQotCQlSZXNvdXJjZS5GYWN0b3J5IGoyZWUgPSBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUklfT0JKKTsKLQkJUmVzb3VyY2UuRmFjdG9yeSBkZWZhdWx0RmFjdCA9IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KFVSSS5jcmVhdGVVUkkoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTikpOwotCQlpZiAoajJlZSA9PSBkZWZhdWx0RmFjdCkgewotCQkJRUpCSmFyUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQlXZWJBcHBSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKLQkJCUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQlBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOwotCQkJQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQlXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOwotCQkJV3NkZFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOwotCQkJLy9yZWdpc3RlcigpIGlzIG5vdCBjYWxsZWQgb24gdGhlIEpheHJwY21hcFJlc291cmNlRmFjdG9yeSBiZWNhdXNlCi0JCQkvL3RoZSBqYXhwcmMtbWFwcGluZyBkZXNjcmlwdG9yIGRvZXMgbm90IGhhdmUgYSBzdGFuZGFyZCBzaG9ydCBuYW1lLgotCQkJLy9UaGUgc2hvcnQgbmFtZXMgaGF2ZSB0byBiZSByZWdpc3RlcmVkIG9uY2UgdGhleSBhcmUga25vd24uCi0JCQlKMkVFWE1JUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCX0KLQkJRUpCSmFyUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCQlXZWJBcHBSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXJEdGRzKCk7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCQlBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeS5yZWdpc3RlckR0ZHMoKTsKLQkJQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCQlXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeS5yZWdpc3RlckR0ZHMoKTsKLQkJV3NkZFJlc291cmNlRmFjdG9yeS5yZWdpc3RlckR0ZHMoKTsKLQkJSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGx1Z2luSW5pdChib29sZWFuIGJQbHVnaW5Jbml0KSB7Ci0JCS8vIEhlcmUncyB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHdvdWxkIGJlIHJlYWQuCi0JCXBsdWdpbl9pbml0aWFsaXplZCA9IGJQbHVnaW5Jbml0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVNb2R1bGVFeHRlbnNpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVNb2R1bGVFeHRlbnNpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4Yjg0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTW9kdWxlRXh0ZW5zaW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBKMkVFTW9kdWxlRXh0ZW5zaW9uSGVscGVyIHsKLQlTdHJpbmcgZ2V0RG9jVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRU11bHRpU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTXVsdGlTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmOTFkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTXVsdGlTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICovCi1wdWJsaWMgY2xhc3MgSjJFRU11bHRpU3RhdHVzIGV4dGVuZHMgSjJFRVN0YXR1cyB7Ci0JcHJpdmF0ZSBKMkVFU3RhdHVzW10gY2hpbGRyZW4gPSBuZXcgSjJFRVN0YXR1c1swXTsKLQotCXB1YmxpYyB2b2lkIGFkZChKMkVFU3RhdHVzIHN0YXR1cykgewotCQlKMkVFU3RhdHVzW10gcmVzdWx0ID0KLQkJCW5ldyBKMkVFU3RhdHVzW2NoaWxkcmVuLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNoaWxkcmVuLCAwLCByZXN1bHQsIDAsIGNoaWxkcmVuLmxlbmd0aCk7Ci0JCXJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBzdGF0dXM7Ci0JCWNoaWxkcmVuID0gcmVzdWx0OwotCQlpbnQgbmV3U2V2ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0JCWludCBjdXJyZW50U2V2ID0gZ2V0U2V2ZXJpdHkoKTsKLQkJLyogSWYgYWxsIHRoZSBzdGF0dXNlcyBhcmUgTk9UX05FRURFRCBPUiBOT1RfUE9TU0lCTEUsIHlvdSB3YW50IHRoZSBjb21iaW5lZCBzdGF0dXMgdG8gYmUgdGhlIGhpZ2hlc3Qgc2V2ZXJpdHkKLQkJICogaG93ZXZlciwgaWYgYWxsIGJ1dCBvbmUgc3RhdHVzIGFyZSBOT1RfTkVFREVEIG9yIE5PVF9QT1NTSUJMRSwgYW5kIG9uZSBzdGF0dXMgY29tcGxldGVkLCB0aGVuIHRoZSBjb21iaW5lZCBzdGF0dXMKLQkJICogc2hvdWxkIGJlIE9LLiAgSWYgdGhlcmUgaXMgYSB3YXJuaW5nIG9yIGVycm9yLCB0aGVuIHRoZXkgdGFrZSBwcmVjZWRlbmNlCi0JCSAqLwotCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDEpCi0JCQlzZXRTZXZlcml0eShuZXdTZXYpOwotCQllbHNlIGlmIChjdXJyZW50U2V2ID4gQ09NUExFVEVEX09LICYmIGN1cnJlbnRTZXYgPCBXQVJOSU5HICYmIG5ld1NldiA9PSBDT01QTEVURURfT0spCi0JCQlzZXRTZXZlcml0eShuZXdTZXYpOwotCQllbHNlIGlmIChuZXdTZXYgPiBjdXJyZW50U2V2ICYmIChjdXJyZW50U2V2ICE9IENPTVBMRVRFRF9PSyB8fCBuZXdTZXYgPj0gV0FSTklORykgKQotCQkJc2V0U2V2ZXJpdHkobmV3U2V2KTsKLQotCX0KLQkvKioKLQkgKiBBZGRzIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIHN0YXR1cyB0byB0aGlzIG11bHRpLXN0YXR1cy4KLQkgKiBEb2VzIG5vdGhpbmcgaWYgdGhlIGdpdmVuIHN0YXR1cyBoYXMgbm8gY2hpbGRyZW4gKHdoaWNoIGluY2x1ZGVzCi0JICogdGhlIGNhc2Ugd2hlcmUgaXQgaXMgbm90IGEgbXVsdGktc3RhdHVzKS4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyB3aG9zZSBjaGlsZHJlbiBhcmUgdG8gYmUgYWRkZWQgdG8gdGhpcyBvbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBbGwoSjJFRVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlKMkVFU3RhdHVzW10gc3RhdHVzZXMgPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNlcy5sZW5ndGg7IGkrKykgewotCQkJYWRkKHN0YXR1c2VzW2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyBKMkVFU3RhdHVzW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpU3RhdHVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogTWVyZ2VzIHRoZSBnaXZlbiBzdGF0dXMgaW50byB0aGlzIG11bHRpLXN0YXR1cy4KLQkgKiBFcXVpdmFsZW50IHRvIDxjb2RlPmFkZChzdGF0dXMpPC9jb2RlPiBpZiB0aGUKLQkgKiBnaXZlbiBzdGF0dXMgaXMgbm90IGEgbXVsdGktc3RhdHVzLiAKLQkgKiBFcXVpdmFsZW50IHRvIDxjb2RlPmFkZEFsbChzdGF0dXMpPC9jb2RlPiBpZiB0aGUKLQkgKiBnaXZlbiBzdGF0dXMgaXMgYSBtdWx0aS1zdGF0dXMuIAotCSAqCi0JICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIHRvIG1lcmdlIGludG8gdGhpcyBvbmUKLQkgKiBAc2VlICNhZGQKLQkgKiBAc2VlICNhZGRBbGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZXJnZShKMkVFU3RhdHVzIHN0YXR1cykgewotCQlpZiAoc3RhdHVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJYWRkKHN0YXR1cyk7Ci0JCX0gZWxzZSB7Ci0JCQlhZGRBbGwoc3RhdHVzKTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdGF0dXMsIHN1aXRhYmxlIAotCSAqIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJYnVmLmFwcGVuZCgiIGNoaWxkcmVuPXsiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJYnVmLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmLmFwcGVuZChjaGlsZHJlbltpXS50b1N0cmluZygpKTsKLQkJfQotCQlidWYuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5oZWxwZXIuSjJFRVN0YXR1cyNhcHBlbmQoSjJFRVN0YXR1cykKLQkgKi8KLQlwdWJsaWMgSjJFRVN0YXR1cyBhcHBlbmQoSjJFRVN0YXR1cyBhU3RhdHVzKSB7Ci0JCWlmIChhU3RhdHVzICE9IG51bGwpCi0JCQltZXJnZShhU3RhdHVzKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBjaGlsZHJlbi5sZW5ndGggPT0gMDsKLQl9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFU3BlY2lmaWNhdGlvbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVNwZWNpZmljYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzNjAzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFU3BlY2lmaWNhdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVTcGVjaWZpY2F0aW9uQ29uc3RhbnRzIHsKLQlTdHJpbmcgSjJFRV9WRVJTSU9OXzFfMiA9ICJKMkVFXzEuMiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEoyRUVfVkVSU0lPTl8xXzMgPSAiSjJFRV8xLjMiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKMkVFX1ZFUlNJT05fMV80ID0gIkoyRUVfMS40IjsgIC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBERUZBVUxUX0NPTVBMRVRFRF9TVEFUVVNfTVNHID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5ERUZBVUxUX0NPTVBMRVRFRF9TVEFUVVNfTVNHOyAKLQlTdHJpbmcgREVGQVVMVF9OT1RfTkVFREVEX1NUQVRVU19NU0cgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLkRFRkFVTFRfTk9UX05FRURFRF9TVEFUVVNfTVNHOyAKLQlTdHJpbmcgREVGQVVMVF9OT1RfUE9TU0lCTEVfU1RBVFVTX01TRyA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuREVGQVVMVF9OT1RfUE9TU0lCTEVfU1RBVFVTX01TRzsgCi0JU3RyaW5nIERFRkFVTFRfRVJST1JfU1RBVFVTX01TRyA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuREVGQVVMVF9FUlJPUl9TVEFUVVNfTVNHOyAKLQkKLQlTdHJpbmcgUkVNT1ZFRF9MT0NBTF9DTElFTlRfTVNHID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5SRU1PVkVEX0xPQ0FMX0NMSUVOVF9NU0c7IAotCVN0cmluZyBSRU1PVkVEX0FDQ0VTU19JTlRFTlRTX01TRyA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuUkVNT1ZFRF9BQ0NFU1NfSU5URU5UU19NU0c7IAotCVN0cmluZyBSRU1PVkVEX0lTT0xBVElPTl9MRVZFTFNfTVNHID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5SRU1PVkVEX0lTT0xBVElPTl9MRVZFTFNfTVNHOyAKLQlTdHJpbmcgQ09OVkVSVEVEX0ZJTkRFUl9NU0cgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLkNPTlZFUlRFRF9GSU5ERVJfTVNHOyAKLQlTdHJpbmcgVU5OQU1FRF9FSkIgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLlVOTkFNRURfRUpCOyAKLQlTdHJpbmcgQ09OVkVSVEVEX1FVRVJZX0RFU0NSSVBUSU9OID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5DT05WRVJURURfUVVFUllfREVTQ1JJUFRJT047IAotCVN0cmluZyBNSUdSQVRFRF9ERUZBVUxUX0RBVEFTT1VSQ0VfSkFSX01TRyA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuTUlHUkFURURfREVGQVVMVF9EQVRBU09VUkNFX0pBUl9NU0c7IAotCVN0cmluZyBNSUdSQVRFRF9ERUZBVUxUX0RBVEFTT1VSQ0VfTVNHIAkgICA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuTUlHUkFURURfREVGQVVMVF9EQVRBU09VUkNFX01TRzsgCi0JU3RyaW5nIEVSUk9SX1RFWFQgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLkVSUk9SOyAKLQlTdHJpbmcgV0FSTklOR19URVhUID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5XQVJOSU5HOyAKLQlTdHJpbmcgSU5GT19URVhUID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5JTkZPOyAKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOWIyYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICoKLSAqLwotcHVibGljIGNsYXNzIEoyRUVTdGF0dXMgaW1wbGVtZW50cyBKMkVFU3BlY2lmaWNhdGlvbkNvbnN0YW50cyB7IAotICAgIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFRF9PSyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX05FRURFRCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1BPU1NJQkxFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDQ7IAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBKMkVFU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBKMkVFU3RhdHVzKENPTVBMRVRFRF9PSywgIiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKMkVFU3RhdHVzW10gRW1wdHlTdGF0dXNBcnJheSA9IG5ldyBKMkVFU3RhdHVzWzBdOwotCi0JcHJpdmF0ZSBpbnQgc2V2ZXJpdHk7Ci0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQlwcml2YXRlIFhNTFJlc291cmNlIHJlc291cmNlOwotCXByaXZhdGUgRU9iamVjdCB0YXJnZXRPYmplY3Q7Ci0JCi0JcHVibGljIEoyRUVTdGF0dXMoKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXB1YmxpYyBKMkVFU3RhdHVzKGludCBhU2V2ZXJpdHksIFN0cmluZyBhTWVzc2FnZSkgewotCQl0aGlzKGFTZXZlcml0eSwgKEVPYmplY3QpbnVsbCwgYU1lc3NhZ2UpOwotCX0KLQlwdWJsaWMgSjJFRVN0YXR1cyhpbnQgYVNldmVyaXR5LCBYTUxSZXNvdXJjZSB4bWxSZXNvdXJjZSkgewotCQl0aGlzKGFTZXZlcml0eSwgeG1sUmVzb3VyY2UsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgSjJFRVN0YXR1cyhpbnQgYVNldmVyaXR5LCBFT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCXRoaXMoYVNldmVyaXR5LCBhbk9iamVjdCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEoyRUVTdGF0dXMoaW50IGFTZXZlcml0eSwgWE1MUmVzb3VyY2UgeG1sUmVzb3VyY2UsIFN0cmluZyBhTWVzc2FnZSkgewotCQlzZXZlcml0eSA9IGFTZXZlcml0eTsKLQkJcmVzb3VyY2UgPSB4bWxSZXNvdXJjZTsKLQkJbWVzc2FnZSA9IGFNZXNzYWdlOwotCX0KLQkKLQlwdWJsaWMgSjJFRVN0YXR1cyhpbnQgYVNldmVyaXR5LCBFT2JqZWN0IGFuT2JqZWN0LCBTdHJpbmcgYU1lc3NhZ2UpIHsKLQkJc2V2ZXJpdHkgPSBhU2V2ZXJpdHk7Ci0JCXRhcmdldE9iamVjdCA9IGFuT2JqZWN0OwotCQltZXNzYWdlID0gYU1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBhUGF0dGVybiwgU3RyaW5nIGFyZzEpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGFQYXR0ZXJuLCBuZXcgU3RyaW5nW117YXJnMX0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJbWVzc2FnZSA9IGNyZWF0ZURlZmF1bHRNZXNzYWdlKCk7Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VGb3JEaXNwbGF5KCkgewotCQlyZXR1cm4gZ2V0U2V2ZXJpdHlUZXh0KCkrIiAiK2dldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNldmVyaXR5VGV4dCgpIHsKLQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJY2FzZSBFUlJPUjoKLQkJCQlyZXR1cm4gRVJST1JfVEVYVDsKLQkJCWNhc2UgV0FSTklORzoKLQkJCQlyZXR1cm4gV0FSTklOR19URVhUOwotCQkJY2FzZSBOT1RfTkVFREVEOgotCQkJY2FzZSBOT1RfUE9TU0lCTEU6Ci0JCQkJcmV0dXJuIElORk9fVEVYVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlRGVmYXVsdE1lc3NhZ2UuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVEZWZhdWx0TWVzc2FnZSgpIHsKLQkJU3RyaW5nIG9iakRlc2M7Ci0JCWlmIChnZXRSZXNvdXJjZSgpICE9IG51bGwpCi0JCQlvYmpEZXNjID0gZ2V0UmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpOwotCQllbHNlIGlmIChnZXRUYXJnZXRPYmplY3QoKSAhPSBudWxsICYmIGdldFRhcmdldE9iamVjdCgpIGluc3RhbmNlb2YgRU5hbWVkRWxlbWVudCkKLQkJCW9iakRlc2MgPSAoKEVOYW1lZEVsZW1lbnQpIGdldFRhcmdldE9iamVjdCgpKS5nZXROYW1lKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCQlzd2l0Y2ggKGdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgQ09NUExFVEVEX09LIDoKLQkJCQlyZXR1cm4gZm9ybWF0KERFRkFVTFRfQ09NUExFVEVEX1NUQVRVU19NU0csIG9iakRlc2MpOwotCQkJY2FzZSBOT1RfTkVFREVEIDoKLQkJCQlyZXR1cm4gZm9ybWF0KERFRkFVTFRfTk9UX05FRURFRF9TVEFUVVNfTVNHLCBvYmpEZXNjKTsKLQkJCWNhc2UgTk9UX1BPU1NJQkxFIDoKLQkJCQlyZXR1cm4gZm9ybWF0KERFRkFVTFRfTk9UX1BPU1NJQkxFX1NUQVRVU19NU0csIG9iakRlc2MpOwotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJcmV0dXJuIGZvcm1hdChERUZBVUxUX0VSUk9SX1NUQVRVU19NU0csIG9iakRlc2MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWVzc2FnZS4KLQkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1pZ3JhdGlvbiB3YXMgY29tcGxldGVkIGZpbmUgb3Igd2FzIG5vdCBuZWVkZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPSygpIHsKLQkJcmV0dXJuIHNldmVyaXR5ID09IENPTVBMRVRFRF9PSyB8fCBzZXZlcml0eSA9PSBOT1RfTkVFREVEOwotCX0KLQotCS8qKgotCSAqIEFuIGVycm9yIG9jdXJyZWQgZHVyaW5nIG1pZ3JhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQlyZXR1cm4gc2V2ZXJpdHkgPT0gRVJST1I7Ci0JfQotCQotCS8qKgotCSAqIEEgd2FybmluZyBvY3VycmVkIGR1cmluZyBtaWdyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQlyZXR1cm4gc2V2ZXJpdHkgPT0gV0FSTklORzsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWlncmF0aW9uIHdhcyBub3QgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3ROZWVkZWQoKSB7Ci0JCXJldHVybiBzZXZlcml0eSA9PSBOT1RfTkVFREVEOwotCX0KLQkvKioKLQkgKiBUaGUgbWlncmF0aW9uIHdhcyBub3QgcG9zc2libGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3RQb3NzaWJsZSgpIHsKLQkJcmV0dXJuIHNldmVyaXR5ID09IE5PVF9QT1NTSUJMRTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V2ZXJpdHkuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2V2ZXJpdHkuCi0JICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2ZXJpdHkpIHsKLQkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotCX0KLQotCXB1YmxpYyBKMkVFU3RhdHVzW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBFbXB0eVN0YXR1c0FycmF5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTXVsdGlTdGF0dXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIFhNTFJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCXB1YmxpYyBFT2JqZWN0IGdldFRhcmdldE9iamVjdCgpIHsKLQkJcmV0dXJuIHRhcmdldE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJNaWdyYXRpb25TdGF0dXMgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNldmVyaXR5ID09IENPTVBMRVRFRF9PSykgewotCQkJYnVmLmFwcGVuZCgiQ29tcGxldGVkIE9LIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChzZXZlcml0eSA9PSBFUlJPUikgewotCQkJYnVmLmFwcGVuZCgiRVJST1IiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHNldmVyaXR5ID09IFdBUk5JTkcpIHsKLQkJCWJ1Zi5hcHBlbmQoIldBUk5JTkciKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHNldmVyaXR5ID09IE5PVF9ORUVERUQpIHsKLQkJCWJ1Zi5hcHBlbmQoIk5vdCBOZWVkZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHNldmVyaXR5ID09IE5PVF9QT1NTSUJMRSkgewotCQkJYnVmLmFwcGVuZCgiTm90IFBvc3NpYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWJ1Zi5hcHBlbmQoInNldmVyaXR5PSIpOyAvLyROT04tTkxTLTEkCi0JCQlidWYuYXBwZW5kKHNldmVyaXR5KTsKLQkJfQotCQlidWYuYXBwZW5kKCcgJyk7Ci0JCWJ1Zi5hcHBlbmQobWVzc2FnZSk7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIHRoZSBwYXJhbWF0ZXIgdG8gdGhpcyBzdGF0dXMsIGFuZCByZXR1cm4gdGhlIHJlc3VsdGFudCBzdGF0dXM7Ci0JICogY2xpZW50cyBtdXN0IGJlIGNhcmVmdWwgdG8gc2V0IHRoZWlyIGNhY2hlZCBzdGF0dXMgdG8gdGhlIHJldHVybiB2YWx1ZSwgCi0JICogYXMgaXQgbWF5IGJlIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKMkVFU3RhdHVzIGFwcGVuZChKMkVFU3RhdHVzIGFTdGF0dXMpIHsKLQkJaWYgKGFTdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybiB0aGlzOwotCQlKMkVFTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgSjJFRU11bHRpU3RhdHVzKCk7Ci0JCW11bHRpLm1lcmdlKHRoaXMpOwotCQltdWx0aS5tZXJnZShhU3RhdHVzKTsKLQkJcmV0dXJuIG11bHRpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVZlcnNpb25Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVWZXJzaW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NzRhNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVZlcnNpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTYsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLS8qKgotICogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIHdpdGggdGhlIFhNTFJlc291cmNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRVZlcnNpb25Db25zdGFudHMgewotCQotCXB1YmxpYyBpbnQgVU5LTk9XTiA9IC0xOwotCXB1YmxpYyBpbnQgRUpCX1RZUEUgPSAwOwotCXB1YmxpYyBpbnQgQVBQTElDQVRJT05fVFlQRSA9IDE7Ci0JcHVibGljIGludCBDT05ORUNUT1JfVFlQRSA9IDI7Ci0JcHVibGljIGludCBBUFBMSUNBVElPTl9DTElFTlRfVFlQRSA9IDM7Ci0JcHVibGljIGludCBXRUJfVFlQRSA9IDQ7Ci0JcHVibGljIGludCBXRUJTRVJWSUNFU19UWVBFID0gNTsKLQkKLQlwdWJsaWMgaW50IEoyRUVfMV8yX0lEID0gMTI7Ci0JcHVibGljIGludCBKMkVFXzFfM19JRCA9IDEzOwotCXB1YmxpYyBpbnQgSjJFRV8xXzRfSUQgPSAxNDsKLQlwdWJsaWMgaW50IEpFRV81XzBfSUQgPSA1MDsKLQlwdWJsaWMgaW50IEVKQl8xXzBfSUQgPSAxMDsJCi0JcHVibGljIGludCBFSkJfMV8xX0lEID0gMTE7CQotCXB1YmxpYyBpbnQgRUpCXzJfMF9JRCA9IDIwOwkKLQlwdWJsaWMgaW50IEVKQl8yXzFfSUQgPSAyMTsJCi0JcHVibGljIGludCBFSkJfM18wX0lEID0gMzA7Ci0JcHVibGljIGludCBXRUJfMl8yX0lEID0gMjI7Ci0JcHVibGljIGludCBXRUJfMl8zX0lEID0gMjM7Ci0JcHVibGljIGludCBXRUJfMl80X0lEID0gMjQ7Ci0JcHVibGljIGludCBXRUJfMl81X0lEID0gMjU7Ci0JcHVibGljIGludCBUQUdMSUJfMV8xX0lEID0gMTE7Ci0JcHVibGljIGludCBUQUdMSUJfMV8yX0lEID0gMTI7Ci0JcHVibGljIGludCBUQUdMSUJfMl8wX0lEID0gMjA7Ci0JcHVibGljIGludCBKU1BfMV8xX0lEID0gMTE7Ci0JcHVibGljIGludCBKU1BfMV8yX0lEID0gMTI7Ci0JcHVibGljIGludCBKU1BfMl8wX0lEID0gMjA7Ci0JcHVibGljIGludCBTRVJWTEVUXzJfMiA9IDIyOwotCXB1YmxpYyBpbnQgU0VSVkxFVF8yXzMgPSAyMzsKLQlwdWJsaWMgaW50IFNFUlZMRVRfMl80ID0gMjQ7Ci0JcHVibGljIGludCBTRVJWTEVUXzJfNSA9IDI1OwotCXB1YmxpYyBpbnQgSkNBXzFfMF9JRCA9IDEwOwotCXB1YmxpYyBpbnQgSkNBXzFfNV9JRCA9IDE1OwotCXB1YmxpYyBpbnQgV0VCU0VSVklDRVNfMV8wX0lEID0gMTA7Ci0JcHVibGljIGludCBXRUJTRVJWSUNFU18xXzFfSUQgPSAxMTsKLQlwdWJsaWMgaW50IFdFQlNFUlZJQ0VTXzFfMl9JRCA9IDEyOwotCXB1YmxpYyBTdHJpbmcgSjJFRV8xXzRfVEVYVCAJCT0gIjEuNCI7IC8vJE5PTi1OTFMtMSQKLQkKLQotCi0JcHVibGljIGludCBWRVJTSU9OXzFfMCA9IDEwOwkKLQlwdWJsaWMgaW50IFZFUlNJT05fMV8xID0gMTE7CQotCXB1YmxpYyBpbnQgVkVSU0lPTl8xXzIgPSAxMjsJCi0JcHVibGljIGludCBWRVJTSU9OXzFfMyA9IDEzOwkKLQlwdWJsaWMgaW50IFZFUlNJT05fMV80ID0gMTQ7Ci0JcHVibGljIGludCBWRVJTSU9OXzFfNSA9IDE1OwotCXB1YmxpYyBpbnQgVkVSU0lPTl8yXzAgPSAyMDsKLQlwdWJsaWMgaW50IFZFUlNJT05fMl8xID0gMjE7CQotCXB1YmxpYyBpbnQgVkVSU0lPTl8yXzIgPSAyMjsJCi0JcHVibGljIGludCBWRVJTSU9OXzJfMyA9IDIzOwkKLQlwdWJsaWMgaW50IFZFUlNJT05fMl80ID0gMjQ7CQotCXB1YmxpYyBpbnQgVkVSU0lPTl8yXzUgPSAyNTsgCi0JcHVibGljIGludCBWRVJTSU9OXzNfMCA9IDMwOyAKLQlwdWJsaWMgaW50IFZFUlNJT05fNV8wID0gNTA7IAotCQotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzBfVEVYVAkJPSAiMS4wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzFfVEVYVCAgICAJPSAiMS4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzJfVEVYVAkJPSAiMS4yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzNfVEVYVAkJPSAiMS4zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzRfVEVYVAkJPSAiMS40IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzVfVEVYVAkJPSAiMS41IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzBfVEVYVAkJPSAiMi4wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzFfVEVYVAkJPSAiMi4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzJfVEVYVAkJPSAiMi4yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzNfVEVYVAkJPSAiMi4zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzRfVEVYVAkJPSAiMi40IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzVfVEVYVAkJPSAiMi41IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8zXzBfVEVYVAkJPSAiMy4wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl81XzBfVEVYVAkJPSAiNS4wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl81X1RFWFQgICAgICAgID0gIjUiOyAgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDgzOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvTU9GSjJFRVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm1vZmoyZWUiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTU9GSjJFRVJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQ09NUExFVEVEX1NUQVRVU19NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9OT1RfTkVFREVEX1NUQVRVU19NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9OT1RfUE9TU0lCTEVfU1RBVFVTX01TRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0VSUk9SX1NUQVRVU19NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFRF9MT0NBTF9DTElFTlRfTVNHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRURfQUNDRVNTX0lOVEVOVFNfTVNHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRURfSVNPTEFUSU9OX0xFVkVMU19NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVkVSVEVEX0ZJTkRFUl9NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU5OQU1FRF9FSkI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVkVSVEVEX1FVRVJZX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVEVEX0RFRkFVTFRfREFUQVNPVVJDRV9KQVJfTVNHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JR1JBVEVEX0RFRkFVTFRfREFUQVNPVVJDRV9NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRV9WRVJTSU9OX05VTExfRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRV9WRVJTSU9OX1BST1hZX0VSUk9SOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTU9GSjJFRVJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMjEwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XcmFwcGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotCi0KLS8qKgotICogQmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIG5vbi1ydW50aW1lIGV4Y2VwdGlvbnMsIHdoZXJlIGEgY2F1Z2h0IGV4Y2VwdGlvbgotICogY2F1c2VzIHRoaXMgZXhjZXB0aW9uIHRvIGJlIHRocm93bgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV3JhcHBlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiBpbXBsZW1lbnRzIElXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKiogVGhlIGV4Y2VwdGlvbiB3aGljaCBuZWNlc3NpdGF0ZWQgdGhpcyBleGNlcHRpb24gKi8KLQlwcm90ZWN0ZWQgRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbjsKLQotcHVibGljIFdyYXBwZWRFeGNlcHRpb24oKSB7Ci0Jc3VwZXIoKTsKLX0KLXB1YmxpYyBXcmFwcGVkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0Jc3VwZXIoKTsKLQlzZXROZXN0ZWRFeGNlcHRpb24oZSk7Ci19Ci1wdWJsaWMgV3JhcHBlZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCXN1cGVyKHMpOwotfQotcHVibGljIFdyYXBwZWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0Jc3VwZXIocyk7Ci0Jc2V0TmVzdGVkRXhjZXB0aW9uKGUpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLSAqLwotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBbGxNZXNzYWdlcygpIHsKLQlyZXR1cm4gRXhjZXB0aW9uSGVscGVyLmdldEFsbE1lc3NhZ2VzKHRoaXMpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QsCi0gKiBjb25jYXRlbmF0ZWQgYXMgb25lCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCkgewotCXJldHVybiBFeGNlcHRpb25IZWxwZXIuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXModGhpcyk7Ci19Ci1wdWJsaWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBnZXROZXN0ZWRFeGNlcHRpb24oKSB7Ci0JcmV0dXJuIG5lc3RlZEV4Y2VwdGlvbjsKLX0KLS8qKgotICogQWRkZWQgdG8gcHJvdmlkZSBjb21wYXRpYmlsaXR5IGZvciB0aGUgSmF2YSAxLjQuMiBhZGRpdGlvbiBvZgotICogPGNvZGU+VGhyb3dhYmxlLmdldENhdXNlKCk8L2NvZGU+LgotICovCi1wdWJsaWMgamF2YS5sYW5nLlRocm93YWJsZSBnZXRDYXVzZSgpIHsKLQlyZXR1cm4gZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci19Ci0vKioKLSAqIFByaW50IG91dCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBzeXN0ZW0gZXJyLgotICovCi1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotfQotLyoqCi0qIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuCi0qIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0qLwotcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcykgewotCWlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotCQlzLnByaW50bG4odGhpcyk7Ci0JCXMucHJpbnRsbihNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLlN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlKTsgLy8gPSAiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiCi0JCW5lc3RlZEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2Uocyk7Ci0JfSBlbHNlIHsKLQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCX0KLX0KLS8qKgotKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLgotKiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotKi8KLXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpIHsKLQlpZiAobmVzdGVkRXhjZXB0aW9uICE9IG51bGwpIHsKLQkJcy5wcmludGxuKHRoaXMpOwotCQlzLnByaW50bG4oTU9GSjJFRVJlc291cmNlSGFuZGxlci5TdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZSk7IC8vID0gIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246IgotCQluZXN0ZWRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHMpOwotCX0gZWxzZSB7Ci0JCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCBzZXROZXN0ZWRFeGNlcHRpb24oamF2YS5sYW5nLkV4Y2VwdGlvbiBuZXdOZXN0ZWRFeGNlcHRpb24pIHsKLQluZXN0ZWRFeGNlcHRpb24gPSBuZXdOZXN0ZWRFeGNlcHRpb247Ci0gICAgaW5pdENhdXNlKG5ld05lc3RlZEV4Y2VwdGlvbik7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmM2ExYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotCi0KLQotCi1wdWJsaWMgY2xhc3MgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgSVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04OTI2NzUzMDgyNzIxMjcxMDIxTDsKLQkvKiogVGhlIGV4Y2VwdGlvbiB3aGljaCBuZWNlc3NpdGF0ZWQgdGhpcyBydW50aW1lIGV4Y2VwdGlvbiwgaWYgb25lIGV4aXN0cyAqLwotCXByb3RlY3RlZCBFeGNlcHRpb24gbmVzdGVkRXhjZXB0aW9uOwotcHVibGljIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKCkgewotCXN1cGVyKCk7Ci19Ci1wdWJsaWMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQlzdXBlcigpOwotCXNldE5lc3RlZEV4Y2VwdGlvbihlKTsKLX0KLXB1YmxpYyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCXN1cGVyKHMpOwotfQotcHVibGljIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCXN1cGVyKHMpOwotCXNldE5lc3RlZEV4Y2VwdGlvbihlKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoKSB7Ci0JcmV0dXJuIEV4Y2VwdGlvbkhlbHBlci5nZXRBbGxNZXNzYWdlcyh0aGlzKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0LAotICogY29uY2F0ZW5hdGVkIGFzIG9uZQotICovCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcygpIHsKLQlyZXR1cm4gRXhjZXB0aW9uSGVscGVyLmdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKHRoaXMpOwotfQotLyoqCi0gKiBAcmV0dXJuIGphdmEubGFuZy5FeGNlcHRpb24KLSAqLwotcHVibGljIGphdmEubGFuZy5FeGNlcHRpb24gZ2V0TmVzdGVkRXhjZXB0aW9uKCkgewotCXJldHVybiBuZXN0ZWRFeGNlcHRpb247Ci19Ci0vKioKLSAqIEFkZGVkIHRvIHByb3ZpZGUgY29tcGF0aWJpbGl0eSBmb3IgdGhlIEphdmEgMS40LjIgYWRkaXRpb24gb2YKLSAqIDxjb2RlPlRocm93YWJsZS5nZXRDYXVzZSgpPC9jb2RlPi4KLSAqIEByZXR1cm4gVGhlIG5lc3RlZCBleGNlcHRpb24gaGVsZCBieSB0aGUgcmVjZWl2ZXIuCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuVGhyb3dhYmxlIGdldENhdXNlKCkgewotCXJldHVybiBnZXROZXN0ZWRFeGNlcHRpb24oKTsKLX0KLS8qKgotICogUHJpbnQgb3V0IGEgc3RhY2sgdHJhY2UgdG8gdGhlIHN5c3RlbSBlcnIuCi0gKi8KLXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLQlwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci19Ci0vKioKLSogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4KLSogSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLSovCi1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKSB7Ci0JaWYgKG5lc3RlZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCXMucHJpbnRsbih0aGlzKTsKLQkJcy5wcmludGxuKE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2UpOyAvLyA9ICJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIKLQkJbmVzdGVkRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShzKTsKLQl9IGVsc2UgewotCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JfQotfQotLyoqCi0qIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuCi0qIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0qLwotcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgcykgewotCWlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotCQlzLnByaW50bG4odGhpcyk7Ci0JCXMucHJpbnRsbihNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLlN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlKTsgLy8gPSAiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiCi0JCW5lc3RlZEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2Uocyk7Ci0JfSBlbHNlIHsKLQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCX0KLX0KLS8qKgotICogQHBhcmFtIG5ld05lc3RlZEV4Y2VwdGlvbiBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHNldE5lc3RlZEV4Y2VwdGlvbihqYXZhLmxhbmcuRXhjZXB0aW9uIG5ld05lc3RlZEV4Y2VwdGlvbikgewotCW5lc3RlZEV4Y2VwdGlvbiA9IG5ld05lc3RlZEV4Y2VwdGlvbjsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVZlcnNpb25SZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVWZXJzaW9uUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5MWY1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVZlcnNpb25SZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDb21tb24gSW50ZXJmYWNlIHVzZWQgdG8gY2hlY2sgdmVyc2lvbiBvZiBKMkVFIG1vZGVsIHJlc291cmNlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVWZXJzaW9uUmVzb3VyY2UgewotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpOwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwMTU4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVhNSVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGw7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgcmVxdWlyZWQgLSBjaGFuZ2UgdG8gZXh0ZW5kIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwKLSAqLwotcHVibGljIGNsYXNzIEoyRUVYTUlSZXNvdXJjZSBleHRlbmRzIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBKMkVFVmVyc2lvblJlc291cmNlewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVYTUlSZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgSjJFRVhNSVJlc291cmNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFWE1JUmVzb3VyY2UuCi0JICogQHBhcmFtIHVyaQotCSAqLwotCXB1YmxpYyBKMkVFWE1JUmVzb3VyY2UoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZSNnZXRKMkVFVmVyc2lvbklEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZSNnZXRNb2R1bGVWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlVmVyc2lvbklEKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZSNnZXRWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVhNSVJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzU2MmQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeTsKLQotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG5zc2hldGgKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICogVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFWE1JUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIEoyRUVYTUlSZXNvdXJjZUZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgSjJFRVhNSVJlc291cmNlRmFjdG9yeSgpOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dChSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LkRFRkFVTFRfRVhURU5TSU9OLCBJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVYTUlSZXNvdXJjZUZhY3RvcnkuCi0JICovCi0JcHVibGljIEoyRUVYTUlSZXNvdXJjZUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShVUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJSjJFRVhNSVJlc291cmNlIHJlc291cmNlID0gbmV3IEoyRUVYTUlSZXNvdXJjZSh1cmkpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL1hNTFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vWE1MUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjYjk1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vWE1MUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTFJlc291cmNlIGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlLCBKMkVFVmVyc2lvbkNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0NMSUVOVF9UWVBFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTl9UWVBFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFSkJfVFlQRSA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCX0FQUF9UWVBFID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQVJfVFlQRSA9IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCX1NFUlZJQ0VTX0NMSUVOVF9UWVBFID0gNjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURURfRVJST1JfTVNHID0gIlRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiI7IC8qKgotCSAqIElzIHRoaXMgYSByZXNvdXJjZSBsb2FkZWQgYXMgYW4gYWx0ZXJuYXRlIGRlcGxveW1lbnQgZGVzY3JpcHRvcj8KLQkgKi8KLQlib29sZWFuIGlzQWx0KCk7Ci0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCk7Ci0JcHVibGljIGludCBnZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCk7Ci0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCk7Ci0JLyoqCi0JICogVXNlZCBvbmx5IGlmIHRoaXMgcmVzb3VyY2UgaXMgYW4gYWx0OyByZXR1cm4gdGhlIGFwcGxpY2F0aW9uIHdoaWNoIGRlY2xhcmVzIGl0Ci0JICovCi0JQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKTsKLQotCXZvaWQgc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24gbmV3QXBwbGljYXRpb24pOwotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFZlcnNpb25JRCgpfQotCSAqIEBzZWUgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlib29sZWFuIGlzSjJFRTFfMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIEoyRUUgWE1MUmVzb3VyY2UuCi0JICogWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiB1c2luZyBpbnN0YW5jZW9mLgotCSAqIEBzZWUgWE1MUmVzb3VyY2UjQVBQX0NMSUVOVF9UWVBFCi0JICogQHNlZSBYTUxSZXNvdXJjZSNBUFBMSUNBVElPTl9UWVBFCi0JICogQHNlZSBYTUxSZXNvdXJjZSNFSkJfVFlQRQotCSAqIEBzZWUgWE1MUmVzb3VyY2UjV0VCX0FQUF9UWVBFCi0JICogQHNlZSBYTUxSZXNvdXJjZSNSQVJfVFlQRQotCSAqLwotCWludCBnZXRUeXBlKCk7Ci0JIC8qKgotCSAqIElzIHRoaXMgYSByZXNvdXJjZSBsb2FkZWQgYXMgYW4gYWx0ZXJuYXRlIGRlcGxveW1lbnQgZGVzY3JpcHRvcj8KLQkgKi8KLQl2b2lkIHNldElzQWx0KGJvb2xlYW4gaXNBbHRlcm5hdGVERCk7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBUcmFuc2xhdG9yUmVzb3VyY2Ujc2V0VmVyc2lvbklEKGludCl9LCAKLQkgKiB7QGxpbmsgVHJhbnNsYXRvclJlc291cmNlI3NldERvY3R5cGVWYWx1ZXMoU3RyaW5nLCBTdHJpbmcpfQotCSAqIFNldHMgdGhlIHN5c3RlbSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEBzZWUgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQl2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBpZCk7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBUcmFuc2xhdG9yUmVzb3VyY2Ujc2V0VmVyc2lvbklEKGludCl9LAotCSAqIHtAbGluayBUcmFuc2xhdG9yUmVzb3VyY2Ujc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcsIFN0cmluZyl9Ci0JICogU2V0cyB0aGUgcHVibGljIGlkIG9mIHRoZSBYTUwgZG9jdW1lbnQuCi0JICogQHNlZSBKMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXZvaWQgc2V0UHVibGljSWQoU3RyaW5nIGlkKTsKLQotCS8vVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB0byBzdXBwb3J0IFJlZmVyZW5jZWRSZXNvdXJjZSB3aXRob3V0IGhhdmluZyBhbiBhY3R1YWwKLQkvL1RoaXMgbWF5IGJlIGp1c3QgYSBzdWJzZXQgb2Ygd2hhdCBpcyBhdmFpbGFibGUgaW4gUmVmZXJlbmNlZFJlc291cmNlCi0Jdm9pZCBzYXZlSWZOZWNlc3NhcnkoKSB0aHJvd3MgRXhjZXB0aW9uOwotCXZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpOwotCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7Ci0Jdm9pZCBwcmVEZWxldGUoKTsKLQlib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKTsKLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0JYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0JYm9vbGVhbiBpc05ldygpOwotCXZvaWQgYWNjZXNzRm9yV3JpdGUoKTsKLQl2b2lkIGFjY2Vzc0ZvclJlYWQoKTsgCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vQXBwbGljYXRpb25UcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mzg1ZWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vQXBwbGljYXRpb25UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JRFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUm9vdFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGRmaG9sdHRwCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uVHJhbnNsYXRvciBleHRlbmRzIFJvb3RUcmFuc2xhdG9yIGltcGxlbWVudHMgRWFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLCBKMkVFQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBBcHBsaWNhdGlvblRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMzsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xNDsKLQlwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvblBhY2thZ2UgQVBQTElDQVRJT05fUEtHID0gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBDb21tb25QYWNrYWdlIENPTU1PTl9QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkKLSAgICBwdWJsaWMgQXBwbGljYXRpb25UcmFuc2xhdG9yKCkgewotCQlzdXBlcihBUFBMSUNBVElPTiwgQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbigpKTsKLSAgICB9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTM7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTQgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xNCA9IGNyZWF0ZTE0Q2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xNDsgCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAgbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihJQ09OKyIvIitTTUFMTF9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpKSwgLy8kTk9OLU5MUy0xJAotCQkJbmV3IFRyYW5zbGF0b3IoSUNPTisiLyIrTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSksIC8vJE5PTi1OTFMtMSQKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IE1vZHVsZVRyYW5zbGF0b3IoKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlY3VyaXR5Um9sZVRyYW5zbGF0b3IxMyhBUFBMSUNBVElPTl9QS0cuZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpKSwKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTE0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFZFUlNJT04sIEFQUExJQ0FUSU9OX1BLRy5nZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIEoyRUVfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TX1hTSSwgWFNJX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhTSV9TQ0hFTUFfTE9DQVRJT04sIEoyRUVfTlNfVVJMKycgJytBUFBMSUNBVElPTl9TQ0hFTUFfTE9DXzFfNCksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBNb2R1bGVUcmFuc2xhdG9yKCksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTQoQVBQTElDQVRJT05fUEtHLmdldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKSksCi0JCX07Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2FwcGxpY2F0aW9uL01vZHVsZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vTW9kdWxlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmZkMWU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vTW9kdWxlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlYWRBaGVhZEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFwcGxpY2F0aW9uUGFja2FnZSBBUFBMSUNBVElPTl9QS0cgPSBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBBTFRfRERfVFJBTlNMQVRPUiA9IGNyZWF0ZUFsdEREVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBXRUJfVFJBTlNMQVRPUlMgPSBjcmVhdGVXZWJNb2R1bGVUcmFuc2xhdG9ycygpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBFSkJfVFJBTlNMQVRPUlMgPSBjcmVhdGVFSkJNb2R1bGVUcmFuc2xhdG9ycygpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBKQVZBX1RSQU5TTEFUT1JTID0gY3JlYXRlSmF2YU1vZHVsZVRyYW5zbGF0b3JzKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIENPTk5FQ1RPUl9UUkFOU0xBVE9SUyA9IGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVRyYW5zbGF0b3JzKCk7Ci0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCAgCi0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICovCi0JcHVibGljIE1vZHVsZVRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKE1PRFVMRSwgQVBQTElDQVRJT05fUEtHLmdldEFwcGxpY2F0aW9uX01vZHVsZXMoKSk7Ci0JCWFkZFJlYWRBaGVhZEhlbHBlcihuZXcgUmVhZEFoZWFkSGVscGVyKE1PRFVMRSwgbmV3IFN0cmluZ1tdIHsgRUpCLCBKQVZBLCBXRUIsIENPTk5FQ1RPUiB9LCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjcmVhdGVDb25uZWN0b3JNb2R1bGVUcmFuc2xhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09OTkVDVE9SLCBBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX1VyaSgpKSwKLQkJCUFMVF9ERF9UUkFOU0xBVE9SLAotCQkvLwlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX0V4dGVuc2lvbnMoKSkKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNyZWF0ZUphdmFNb2R1bGVUcmFuc2xhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoSkFWQSwgQVBQTElDQVRJT05fUEtHLmdldE1vZHVsZV9VcmkoKSksCi0JCQlBTFRfRERfVFJBTlNMQVRPUiwKLQkJLy8JQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoQVBQTElDQVRJT05fUEtHLmdldE1vZHVsZV9FeHRlbnNpb25zKCkpCi0JCX07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjcmVhdGVFSkJNb2R1bGVUcmFuc2xhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoRUpCLCBBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX1VyaSgpKSwKLQkJCUFMVF9ERF9UUkFOU0xBVE9SLAotCQkvLwlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX0V4dGVuc2lvbnMoKSkKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNyZWF0ZVdlYk1vZHVsZVRyYW5zbGF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihXRUIgKyAiLyIgKyBXRUJfVVJJLCBBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX1VyaSgpKSwgLy8kTk9OLU5MUy0xJAotCQkJbmV3IFRyYW5zbGF0b3IoV0VCICsgIi8iICsgQ09OVEVYVF9ST09ULCBBUFBMSUNBVElPTl9QS0cuZ2V0V2ViTW9kdWxlX0NvbnRleHRSb290KCkpLCAvLyROT04tTkxTLTEkCi0JCQlBTFRfRERfVFJBTlNMQVRPUiwKLQkJLy8JQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoQVBQTElDQVRJT05fUEtHLmdldE1vZHVsZV9FeHRlbnNpb25zKCkpCi0JCX07Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUFsdEREVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEFMVF9ERCwgQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRNb2R1bGVfQWx0REQoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKG8gPT0gbnVsbCkgCi0JCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47Ci0JCWVsc2UgaWYgKCgoTW9kdWxlKSBvKS5pc0VqYk1vZHVsZSgpKQotCQkJcmV0dXJuIEVKQl9UUkFOU0xBVE9SUzsKLQkJZWxzZSBpZiAoKChNb2R1bGUpIG8pLmlzQ29ubmVjdG9yTW9kdWxlKCkpCi0JCQlyZXR1cm4gQ09OTkVDVE9SX1RSQU5TTEFUT1JTOwotCQllbHNlIGlmICgoKE1vZHVsZSkgbykuaXNXZWJNb2R1bGUoKSkKLQkJCXJldHVybiBXRUJfVFJBTlNMQVRPUlM7Ci0JCWVsc2UgaWYgKCgoTW9kdWxlKSBvKS5pc0phdmFNb2R1bGUoKSkKLQkJCXJldHVybiBKQVZBX1RSQU5TTEFUT1JTOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogTW9kdWxlIFR5cGUgZXhjZXB0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCUFwcGxpY2F0aW9uRmFjdG9yeSBmYWN0ID0gQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRTsKLQkJaWYgKEVKQi5lcXVhbHMocmVhZEFoZWFkTmFtZSkpCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVFamJNb2R1bGUoKTsKLQkJZWxzZSBpZiAoV0VCLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZVdlYk1vZHVsZSgpOwotCQllbHNlIGlmIChKQVZBLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZUphdmFDbGllbnRNb2R1bGUoKTsKLQkJZWxzZSBpZiAoQ09OTkVDVE9SLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVNb2R1bGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc01hbmFnZWRCeVBhcmVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jbGllbnQvQXBwbGljYXRpb25DbGllbnRUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZjFmNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jbGllbnQvQXBwbGljYXRpb25DbGllbnRUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uRW52RW50cnlUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSwgSjJFRUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBBcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgQXBwbGljYXRpb25DbGllbnRUcmFuc2xhdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMTEJBQ0tfSEFORExFUiA9ICJjYWxsYmFjay1oYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0NMSUVOVCA9ICJhcHBsaWNhdGlvbi1jbGllbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uUGFja2FnZSBDT01NT05fUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTM7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTQ7Ci0JCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50VHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoQVBQTElDQVRJT05fQ0xJRU5ULCBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudCgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTM7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTQgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xNCA9IGNyZWF0ZTE0Q2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xNDsgCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCUNsaWVudFBhY2thZ2UgZVBhY2thZ2VDbGllbnQ9Q2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT05fUEFUSCwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTl9QQVRILCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBFbnZFbnRyeVRyYW5zbGF0b3IoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfRW52aXJvbm1lbnRQcm9wcygpLCB0cnVlLCBmYWxzZSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTMoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlUmVmVHJhbnNsYXRvcjEzKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpKSwKLQkJCS8vSjJFRSAxLjMKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlRW52UmVmVHJhbnNsYXRvcjEzKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlRW52UmVmcygpKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKENBTExCQUNLX0hBTkRMRVIsIGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpKSwKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTE0Q2hpbGRyZW4oKSB7Ci0JCUNsaWVudFBhY2thZ2UgZVBhY2thZ2VDbGllbnQ9Q2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFZFUlNJT04sIGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OUywgSjJFRV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlNfWFNJLCBYU0lfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWFNJX1NDSEVNQV9MT0NBVElPTiwgSjJFRV9OU19VUkwrJyAnK0FQUF9DTElFTlRfU0NIRU1BX0xPQ18xXzQpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCi0JCQluZXcgRW52RW50cnlUcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X0Vudmlyb25tZW50UHJvcHMoKSwgdHJ1ZSwgdHJ1ZSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTQoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlcnZpY2VSZWZHcm91cFRyYW5zbGF0b3IoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVSZXNvdXJjZVJlZlRyYW5zbGF0b3IxNChlUGFja2FnZUNsaWVudC5nZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVSZXNvdXJjZUVudlJlZlRyYW5zbGF0b3IxNChlUGFja2FnZUNsaWVudC5nZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWZUcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSksCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihDQUxMQkFDS19IQU5ETEVSLCBlUGFja2FnZUNsaWVudC5nZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25UcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKSksCi0JCS8vCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X0RlcGxveW1lbnRFeHRlbnNpb25zKCkpCi0JCX07Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vQm9vbGVhblRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZWY0YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vQm9vbGVhblRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQm9vbGVhblRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBCb29sZWFuVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIEJPT0xFQU5fTE9XRVJDQVNFKTsKLQl9Ci0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKHN0clZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJZWxzZSBpZiAoc3RyVmFsdWUudG9VcHBlckNhc2UoKS5lcXVhbHMoIjEiKSB8fCBzdHJWYWx1ZS50b1VwcGVyQ2FzZSgpLmVxdWFscygiWUVTIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJZWxzZSAKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2Yoc3RyVmFsdWUpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9Db21tb25UcmFuc2xhdG9ycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vQ29tbW9uVHJhbnNsYXRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2ZWQzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9Db21tb25UcmFuc2xhdG9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjAsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5EZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRGVwZW5kZW5jeVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQSBzdGF0aWMgaGVscGVyIGZvciBjcmVhdGluZyBHZW5lcmljIGNvbW1vbiBKMkVFIHRyYW5zbGF0b3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25UcmFuc2xhdG9ycyBpbXBsZW1lbnRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21tb25QYWNrYWdlIENPTU1PTl9QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgV0VCU0VSVklDRV9QS0cgPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIEVNUFRZX0NISUxEUkVOID0gbmV3IFRyYW5zbGF0b3JbXSB7fTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEVKQl9SRUZfTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoRUpCX1JFRl9OQU1FLCBDT01NT05fUEtHLmdldEVqYlJlZl9OYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRUpCX1JFRl9UWVBFX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihFSkJfUkVGX1RZUEUsIENPTU1PTl9QS0cuZ2V0RWpiUmVmX1R5cGUoKSk7CQkvL0VudW1lcmF0aW9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBFSkJfTElOS19UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoRUpCX0xJTkssIENPTU1PTl9QS0cuZ2V0RWpiUmVmX0xpbmsoKSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBSRVNfUkVGX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFJFU19SRUZfTkFNRSwgQ09NTU9OX1BLRy5nZXRSZXNvdXJjZVJlZl9OYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUkVTX1RZUEVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFJFU19UWVBFLCBDT01NT05fUEtHLmdldFJlc291cmNlUmVmX1R5cGUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBSRVNfQVVUSF9UUkFOU0xBVE9SID0gbmV3IFJlc0F1dGhUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBSRVNfU0hBUklOR19TQ09QRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoUkVTX1NIQVJJTkdfU0NPUEUsIENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VSZWZfUmVzU2hhcmluZ1Njb3BlKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUkVTX0VOVl9SRUZfTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoUkVTT1VSQ0VfRU5WX1JFRl9OQU1FLCBDT01NT05fUEtHLmdldFJlc291cmNlRW52UmVmX05hbWUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBSRVNfRU5WX1JFRl9UWVBFX1RSQU5TTEFUT1IgPSBuZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihSRVNPVVJDRV9FTlZfUkVGX1RZUEUsIENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VFbnZSZWZfVHlwZSgpKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFNFQ19SRUZfUk9MRV9OQU1FX1RSQU5TQUxUT1IgPSBuZXcgVHJhbnNsYXRvcihST0xFX05BTUUsIENPTU1PTl9QS0cuZ2V0U2VjdXJpdHlSb2xlUmVmX05hbWUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBTRUNfUkVGX1JPTEVfTElOS19UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoUk9MRV9MSU5LLCBDT01NT05fUEtHLmdldFNlY3VyaXR5Um9sZVJlZl9MaW5rKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUlVOQVNfUk9MRV9OQU1FX1RSQU5TTEFUT1IgPSBuZXcgRGVwZW5kZW5jeVRyYW5zbGF0b3IoUk9MRV9OQU1FLCBDT01NT05fUEtHLmdldElkZW50aXR5X1JvbGVOYW1lKCksIENPTU1PTl9QS0cuZ2V0UnVuQXNTcGVjaWZpZWRJZGVudGl0eV9JZGVudGl0eSgpKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFNFQ1VSSVRZX1JPTEVfTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoUk9MRV9OQU1FLCBDT01NT05fUEtHLmdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IgPSBjcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXREZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9ucygpKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRElTUExBWU5BTUVTX1RSQU5TTEFUT1IgPSBjcmVhdGVEaXNwbGF5TmFtZVRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXREZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lcygpKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSUNPTlNfVFJBTlNMQVRPUiA9IGNyZWF0ZUljb25UcmFuc2xhdG9yKCk7Ci0JCi0JLy9UaGUgT2ZmaWNpYWwgQ29uY2VwdCBvZiBKTkRJRW52UmVmR3JvdXAgRk9SIEoyRUUgMS40Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX0VOVl9FTlRSWV8xXzQgPSBuZXcgRW52RW50cnlUcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9FbnZpcm9ubWVudFByb3BlcnRpZXMoKSwgdHJ1ZSwgdHJ1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX0VKQl9SRUZfMV80ID0gQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRUpCUmVmVHJhbnNsYXRvcjE0KENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJSZWZzKCkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9FSkJfTE9DQUxfUkVGXzFfNCA9IENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZUVKQkxvY2FsUmVmVHJhbnNsYXRvcjE0KENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX1NFUlZJQ0VfUkVGXzFfNCA9IENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlcnZpY2VSZWZHcm91cFRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRKTkRJRW52UmVmc0dyb3VwX1NlcnZpY2VSZWZzKCkpOwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfUkVGXzFfNCA9IENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlUmVmVHJhbnNsYXRvcjE0KENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZVJlZnMoKSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX1JFU09VUkNFX0VOVl9SRUZfMV80ID0gQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUmVzb3VyY2VFbnZSZWZUcmFuc2xhdG9yMTQoQ09NTU9OX1BLRy5nZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlRW52UmVmcygpKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSk5ESV9SRUZfR1JPVVBfTUVTU0FHRV9ERVNUX1JFRl8xXzQgPSBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWZUcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpOwotCQotCS8vVGhlIHVub2ZmaWNpYWwgY29uY2VwdCBvZiBKTkRJRW52UmVmR3JvdXAgRk9SIEoyRUUgMS4zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX0VOVl9FTlRSWV8xXzMgPSBuZXcgRW52RW50cnlUcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9FbnZpcm9ubWVudFByb3BlcnRpZXMoKSwgdHJ1ZSwgZmFsc2UpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9FSkJfUkVGXzFfMyA9IENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZUVKQlJlZlRyYW5zbGF0b3IxMyhDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSk5ESV9SRUZfR1JPVVBfRUpCX0xPQ0FMX1JFRl8xXzMgPSBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVFSkJMb2NhbFJlZlRyYW5zbGF0b3IxMyhDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfRWpiTG9jYWxSZWZzKCkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9SRUZfMV8zID0gIENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlUmVmVHJhbnNsYXRvcjEzKENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZVJlZnMoKSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX1JFU09VUkNFX0VOVl9SRUZfMV8zID0gQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUmVzb3VyY2VFbnZSZWZUcmFuc2xhdG9yMTMoQ09NTU9OX1BLRy5nZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlRW52UmVmcygpKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgTElTVEVORVJfQ0xBU1NfVFJBTlNMQVRPUiA9IG5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKExJU1RFTkVSX0NMQVNTLCBDT01NT05fUEtHLmdldExpc3RlbmVyX0xpc3RlbmVyQ2xhc3MoKSk7Ci0JCi0JcHJpdmF0ZSBDb21tb25UcmFuc2xhdG9ycygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZlRyYW5zbGF0b3IxMyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFQ1VSSVRZX1JPTEVfUkVGLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9uKCkpLCAKLQkJCVNFQ19SRUZfUk9MRV9OQU1FX1RSQU5TQUxUT1IsIAotCQkJU0VDX1JFRl9ST0xFX0xJTktfVFJBTlNMQVRPUiAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZWN1cml0eVJvbGVSZWZUcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRUNVUklUWV9ST0xFX1JFRiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCWNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT01NT05fUEtHLmdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKSksIAotCQkJU0VDX1JFRl9ST0xFX05BTUVfVFJBTlNBTFRPUiwKLQkJCVNFQ19SRUZfUk9MRV9MSU5LX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVSZXNvdXJjZUVudlJlZlRyYW5zbGF0b3IxMyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUkVTT1VSQ0VfRU5WX1JFRiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwgCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbigpKSwgCi0JCQlSRVNfRU5WX1JFRl9OQU1FX1RSQU5TTEFUT1IsIAotCQkJUkVTX0VOVl9SRUZfVFlQRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUmVzb3VyY2VFbnZSZWZUcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFU09VUkNFX0VOVl9SRUYsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsIAotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb25zKCkpLCAKLQkJCVJFU19FTlZfUkVGX05BTUVfVFJBTlNMQVRPUiwgCi0JCQlSRVNfRU5WX1JFRl9UWVBFX1RSQU5TTEFUT1IsCi0JCQkvL0oyRUUxLjQgQWRkZWQKLQkJLy8JY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRSZXNvdXJjZUVudlJlZl9FeHRlbnNpb25zKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUmVzb3VyY2VSZWZUcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFU09VUkNFX1JFRiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwJCQotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb24oKSksCi0JCQlSRVNfUkVGX05BTUVfVFJBTlNMQVRPUiwKLQkJCVJFU19UWVBFX1RSQU5TTEFUT1IsCi0JCQlSRVNfQVVUSF9UUkFOU0xBVE9SLAotCQkJLy9FSkIgMi4wIEFkZGVkCi0JCQlSRVNfU0hBUklOR19TQ09QRV9UUkFOU0xBVE9SLAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJlc291cmNlUmVmVHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUkVTT1VSQ0VfUkVGLCBmZWF0dXJlKTsKLQkJCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCQkKLQkJCQljcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbnMoKSksCi0JCQkJUkVTX1JFRl9OQU1FX1RSQU5TTEFUT1IsCi0JCQkJUkVTX1RZUEVfVFJBTlNMQVRPUiwKLQkJCQlSRVNfQVVUSF9UUkFOU0xBVE9SLAotCQkJCS8vRUpCIDIuMCBBZGRlZAotCQkJCVJFU19TSEFSSU5HX1NDT1BFX1RSQU5TTEFUT1IsCi0JCQkKLQkJCQkvL0oyRUUxLjQgQWRkZWQKLQkJCS8vCWNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VSZWZfRXh0ZW5zaW9ucygpKQotCQkJfSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlY3VyaXR5Um9sZVRyYW5zbGF0b3IxMyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VDVVJJVFlfUk9MRSwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbigpKSwgCi0JCQlTRUNVUklUWV9ST0xFX05BTUVfVFJBTlNMQVRPUiAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRUNVUklUWV9ST0xFLCBmZWF0dXJlKTsKLQkJCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9ucygpKSwgCi0JCQkJU0VDVVJJVFlfUk9MRV9OQU1FX1RSQU5TTEFUT1IgCi0JCQl9KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCUmVmVHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBjcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTMoZmVhdHVyZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCTG9jYWxSZWZUcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGNyZWF0ZUVKQlJlZlRyYW5zbGF0b3IxMyhmZWF0dXJlLCB0cnVlKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gbG9jYWwpIHsKLQkJU3RyaW5nIG5vZGVOYW1lID0gbG9jYWwgPyBFSkJfTE9DQUxfUkVGIDogRUpCX1JFRjsKLQkJU3RyaW5nIGhvbWVUYWcgPSBsb2NhbCA/IExPQ0FMX0hPTUUgOiBIT01FOwotCQlTdHJpbmcgcmVtb3RlVGFnID0gbG9jYWwgPyBMT0NBTCA6IFJFTU9URTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGhvbWVGZWF0dXJlID0gbG9jYWwgPyBDT01NT05fUEtHLmdldEVKQkxvY2FsUmVmX0xvY2FsSG9tZSgpIDogQ09NTU9OX1BLRy5nZXRFamJSZWZfSG9tZSgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGxvY2FsID8gQ09NTU9OX1BLRy5nZXRFSkJMb2NhbFJlZl9Mb2NhbCgpIDogQ09NTU9OX1BLRy5nZXRFamJSZWZfUmVtb3RlKCk7Ci0JCQotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3Iobm9kZU5hbWUsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCQkJCQotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0RWpiUmVmX0Rlc2NyaXB0aW9uKCkpLAotCQkJRUpCX1JFRl9OQU1FX1RSQU5TTEFUT1IsCi0JCQlFSkJfUkVGX1RZUEVfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKGhvbWVUYWcsIGhvbWVGZWF0dXJlKSwKLQkJCW5ldyBUcmFuc2xhdG9yKHJlbW90ZVRhZywgcmVtb3RlRmVhdHVyZSksCi0JCQlFSkJfTElOS19UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCUmVmVHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBjcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTQoZmVhdHVyZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCTG9jYWxSZWZUcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGNyZWF0ZUVKQlJlZlRyYW5zbGF0b3IxNChmZWF0dXJlLCB0cnVlKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gbG9jYWwpIHsKLQkJU3RyaW5nIG5vZGVOYW1lID0gbG9jYWwgPyBFSkJfTE9DQUxfUkVGIDogRUpCX1JFRjsKLQkJU3RyaW5nIGhvbWVUYWcgPSBsb2NhbCA/IExPQ0FMX0hPTUUgOiBIT01FOwotCQlTdHJpbmcgcmVtb3RlVGFnID0gbG9jYWwgPyBMT0NBTCA6IFJFTU9URTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGhvbWVGZWF0dXJlID0gbG9jYWwgPyBDT01NT05fUEtHLmdldEVKQkxvY2FsUmVmX0xvY2FsSG9tZSgpIDogQ09NTU9OX1BLRy5nZXRFamJSZWZfSG9tZSgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGxvY2FsID8gQ09NTU9OX1BLRy5nZXRFSkJMb2NhbFJlZl9Mb2NhbCgpIDogQ09NTU9OX1BLRy5nZXRFamJSZWZfUmVtb3RlKCk7Ci0JCQotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3Iobm9kZU5hbWUsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCQkJCQotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpKSwKLQkJCUVKQl9SRUZfTkFNRV9UUkFOU0xBVE9SLAotCQkJRUpCX1JFRl9UWVBFX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihob21lVGFnLCBob21lRmVhdHVyZSksCi0JCQluZXcgVHJhbnNsYXRvcihyZW1vdGVUYWcsIHJlbW90ZUZlYXR1cmUpLAotCQkJRUpCX0xJTktfVFJBTlNMQVRPUiwKLQkJLy8JY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRFamJSZWZfRXh0ZW5zaW9ucygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJ1bkFzVHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSVU5fQVMsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9uKCkpLAotCQkJLy9uZXcgRGVwZW5kZW5jeVRyYW5zbGF0b3IoREVTLCkKLQkJCVJVTkFTX1JPTEVfTkFNRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJ1bkFzVHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSVU5fQVMsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9ucygpKSwKLQkJCVJVTkFTX1JPTEVfTkFNRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkKLQkKLQlwdWJsaWMgc3RhdGljICBUcmFuc2xhdG9yIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZlRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVTU0FHRV9ERVNUX1JFRixmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0Rlc2NyaXB0aW9ucygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9SRUZfTkFNRSxDT01NT05fUEtHLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVTU0FHRV9ERVNUX1RZUEUsQ09NTU9OX1BLRy5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVHlwZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9VU0FHRSxDT01NT05fUEtHLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9Vc2FnZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9MSU5LLENPTU1PTl9QS0cuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0xpbmsoKSksCi0JCQkvL2NyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0V4dGVuc2lvbnMoKSkJCi0JCX0pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgIFRyYW5zbGF0b3IgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSl7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNRVNTQUdFX0RFU1QsZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCURFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlJQ09OU19UUkFOU0xBVE9SLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVTU0FHRV9ERVNUX05BTUUsQ09NTU9OX1BLRy5nZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpKSwKLQkJCS8vY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRNZXNzYWdlRGVzdGluYXRpb25fRXh0ZW5zaW9ucygpKQotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbW9kZWwgd2FzIG1vZGVsIGZyb20gV2Vic3BoZXJlIFdlYnNlcnZpY2VzCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmljZVJlZkdyb3VwVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VSVklDRV9SRUYsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUlDT05TX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihTRVJWSUNFX1JFRl9OQU1FLCBXRUJTRVJWSUNFX1BLRy5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCkpLAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoU0VSVklDRV9JTlRFUkZBQ0UsIFdFQlNFUlZJQ0VfUEtHLmdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfRklMRSwgV0VCU0VSVklDRV9QS0cuZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEpBWFJQQ19NQVBQSU5HX0ZJTEUsIFdFQlNFUlZJQ0VfUEtHLmdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKSksCi0JCQljcmVhdGVRTmFtZVRyYW5zbGF0b3IoU0VSVklDRV9RTkFNRSwgV0VCU0VSVklDRV9QS0cuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSksCi0JCQljcmVhdGVQb3J0Q29tcG9uZW50UmVmVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2VydmljZVJlZkhhbmRsZXJUcmFuc2xhdG9yKCksCi0JCX0pOwotCQkKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVRTmFtZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CQkKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKGRvbU5hbWUsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLCBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZV9Db21iaW5lZFFOYW1lKCkpCQkJCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1vZGVsIHdhcyBtb2RlbCBmcm9tIFdlYnNwaGVyZSBXZWJzZXJ2aWNlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmljZVJlZkhhbmRsZXJUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSEFORExFUiwgV0VCU0VSVklDRV9QS0cuZ2V0U2VydmljZVJlZl9IYW5kbGVycygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW117Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCURJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKEhBTkRMRVJfTkFNRSwgV0VCU0VSVklDRV9QS0cuZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKEhBTkRMRVJfQ0xBU1MsIFdFQlNFUlZJQ0VfUEtHLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCkpLAotCQkJY3JlYXRlUGFyYW1WYWx1ZVR5cGUoSEFORExFUl9JTklUX1BBUkFNLCBXRUJTRVJWSUNFX1BLRy5nZXRIYW5kbGVyX0luaXRQYXJhbXMoKSksCi0JCQljcmVhdGVRTmFtZVRyYW5zbGF0b3IoU09BUF9IRUFERVIsIFdFQlNFUlZJQ0VfUEtHLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTT0FQX1JPTEUsIFdFQlNFUlZJQ0VfUEtHLmdldEhhbmRsZXJfU29hcFJvbGVzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUE9SVF9OQU1FLCBXRUJTRVJWSUNFX1BLRy5nZXRIYW5kbGVyX1BvcnROYW1lcygpKQotCQl9KTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQb3J0Q29tcG9uZW50UmVmVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFBPUlRfQ09NUE9ORU5UX1JFRiwgV0VCU0VSVklDRV9QS0cuZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKCBuZXcgVHJhbnNsYXRvcltdewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoU0VSVklDRV9FTlBPSU5UX0lOVEVSRkFDRSwgV0VCU0VSVklDRV9QS0cuZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQT1JUX0NPTVBPTkVOVF9MSU5LICwgV0VCU0VSVklDRV9QS0cuZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoREVTQ1JJUFRJT04sIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihMQU5HLCBDT01NT05fUEtHLmdldERlc2NyaXB0aW9uX0xhbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFRyYW5zbGF0b3IuVEVYVF9BVFRSSUJVVEVfVkFMVUUsIENPTU1PTl9QS0cuZ2V0RGVzY3JpcHRpb25fVmFsdWUoKSkgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZURpc3BsYXlOYW1lVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBmZWF0dXJlLCBUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5UKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTEFORywgQ09NTU9OX1BLRy5nZXREaXNwbGF5TmFtZV9MYW5nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVHJhbnNsYXRvcihUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLCBDT01NT05fUEtHLmdldERpc3BsYXlOYW1lX1ZhbHVlKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlSWNvblRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihJQ09OLCBDT01NT05fUEtHLmdldERlc2NyaXB0aW9uR3JvdXBfSWNvbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKExBTkcsIENPTU1PTl9QS0cuZ2V0SWNvblR5cGVfTGFuZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpLAotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgQ09NTU9OX1BLRy5nZXRJY29uVHlwZV9TbWFsbEljb24oKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRJY29uVHlwZV9MYXJnZUljb24oKSkgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotLy8JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLwkJcmV0dXJuIGNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKERFUExPWV9FWFQsIGZlYXR1cmUpOwotLy8JfQotLy8KLS8vCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoZG9tTmFtZSwgZmVhdHVyZSk7Ci0vLwkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotLy8JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0UsIENPTU1PTl9QS0cuZ2V0RGVwbG95bWVudEV4dGVuc2lvbl9OYW1lc3BhY2UoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwKLS8vCQkJbmV3IFRyYW5zbGF0b3IoTVVTVFVOREVSU1RBTkQsIENPTU1PTl9QS0cuZ2V0RGVwbG95bWVudEV4dGVuc2lvbl9NdXN0VW5kZXJzdGFuZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpLAotLy8JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0vLwkJCVRyYW5zbGF0b3IuY3JlYXRlUGFyZW50QW5kVGV4dEF0dHJpYnV0ZVRyYW5zbGF0b3IoRVhUX0VMRU1FTlQsIENPTU1PTl9QS0cuZ2V0RGVwbG95bWVudEV4dGVuc2lvbl9FeHRlbnNpb25FbGVtZW50cygpLCBDT01NT05fUEtHLmdldEV4dGVuc2libGVUeXBlX1ZhbHVlKCkpCi0vLwkJfSk7Ci0vLwkJcmV0dXJuIHJlc3VsdDsKLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUGFyYW1WYWx1ZVR5cGUoU3RyaW5nIGRvbU5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKXsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKGRvbU5hbWUsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9ucygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX05BTUUsIENPTU1PTl9QS0cuZ2V0UGFyYW1WYWx1ZV9OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fVkFMVUUsIENPTU1PTl9QS0cuZ2V0UGFyYW1WYWx1ZV9WYWx1ZSgpKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0VudkVudHJ5VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vRW52RW50cnlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNmVjNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vRW52RW50cnlUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW52RW50cnlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHJpdmF0ZSBib29sZWFuIGlzSjJFRTE0OwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gcmVvcmRlcmVkQ2hpbGRyZW47Ci0JLy9IYWNrcyBiZWNhdXNlIG9mIGluY29uc2lzdGVuY2llcyBpbiB0aGUgc2VydmxldCBzcGVjCi0JYm9vbGVhbiB0eXBlQmVmb3JlVmFsdWUgPSB0cnVlOwotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFbnZFbnRyeVRyYW5zbGF0b3IuCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEVudkVudHJ5VHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGJvb2xlYW4gd3JpdGVUeXBlQmVmb3JlVmFsdWUsIGJvb2xlYW4gaXNKMkVFMTQpIHsKLQkJc3VwZXIoRU5WX0VOVFJZLCBhRmVhdHVyZSk7Ci0JCXR5cGVCZWZvcmVWYWx1ZSA9IHdyaXRlVHlwZUJlZm9yZVZhbHVlOwotCQl0aGlzLmlzSjJFRTE0ID0gaXNKMkVFMTQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbigpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqLCBpbnQgdmVyc2lvbklEKSB7Ci0JCS8vSGF2YSB0byB5b3UgY3JlYXRlIGEgZGlmZmVyZW50IG9uZSBlYWNoIHRpbWUKLQkJY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQlzZXRSZW9yZGVyZWRDaGlsZHJlbigpOwotCQkKLQkJaWYgKHR5cGVCZWZvcmVWYWx1ZSkKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCi0JCXJldHVybiByZW9yZGVyZWRDaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlDb21tb25QYWNrYWdlIGVQYWNrYWdlQ29tbW9uID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCVRyYW5zbGF0b3IgZGVzY3JpcHRpb25UcmFuc2xhdG9yOwotCQlpZiAoaXNKMkVFMTQpCi0JCQlkZXNjcmlwdGlvblRyYW5zbGF0b3IgPSBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoZVBhY2thZ2VDb21tb24uZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCkpOyAKLQkJZWxzZSAKLQkJCWRlc2NyaXB0aW9uVHJhbnNsYXRvciA9IG5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBlUGFja2FnZUNvbW1vbi5nZXRFbnZFbnRyeV9EZXNjcmlwdGlvbigpKTsKLQkJCQotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCQkJCQotCQkJZGVzY3JpcHRpb25UcmFuc2xhdG9yLAotCQkJbmV3IFRyYW5zbGF0b3IoRU5WX0VOVFJZX05BTUUsIGVQYWNrYWdlQ29tbW9uLmdldEVudkVudHJ5X05hbWUoKSksCi0JCQluZXcgRW52RW50cnlUeXBlVHJhbnNsYXRvcigpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKEVOVl9FTlRSWV9WQUxVRSwgZVBhY2thZ2VDb21tb24uZ2V0RW52RW50cnlfVmFsdWUoKSkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVvcmRlcmVkQ2hpbGRyZW4oKSB7Ci0JCXJlb3JkZXJlZENoaWxkcmVuID0gbmV3IFRyYW5zbGF0b3JbY2hpbGRyZW4ubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShjaGlsZHJlbiwgMCwgcmVvcmRlcmVkQ2hpbGRyZW4sIDAsIGNoaWxkcmVuLmxlbmd0aCk7Ci0JCVRyYW5zbGF0b3IgdGVtcCA9IHJlb3JkZXJlZENoaWxkcmVuWzNdOwotCQlyZW9yZGVyZWRDaGlsZHJlblszXSA9IHJlb3JkZXJlZENoaWxkcmVuWzRdOwotCQlyZW9yZGVyZWRDaGlsZHJlbls0XSA9IHRlbXA7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0VudkVudHJ5VHlwZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0VudkVudHJ5VHlwZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlY2Q1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9FbnZFbnRyeVR5cGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5EZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEVudkVudHJ5VHlwZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9MQU5HPSAiamF2YS5sYW5nLiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VCU1RSSU5HX0xFTkdUSCA9IEpBVkFfTEFORy5sZW5ndGgoKTsKLQlwdWJsaWMgRW52RW50cnlUeXBlVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoRU5WX0VOVFJZX1RZUEUsIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVudkVudHJ5X1R5cGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7CQkKLQkJaWYgKHN0clZhbHVlICE9IG51bGwgJiYgc3RyVmFsdWUuc3RhcnRzV2l0aChKQVZBX0xBTkcpKSAKLQkJCXJldHVybiBzdXBlci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShzdHJWYWx1ZS5zdWJzdHJpbmcoU1VCU1RSSU5HX0xFTkdUSCksIG93bmVyKTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgCi0JCQlyZXR1cm4gSkFWQV9MQU5HICsgKChFbnVtZXJhdG9yKXZhbHVlKS5nZXROYW1lKCk7IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9KYXZhQ2xhc3NUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9KYXZhQ2xhc3NUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZDI0ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vSmF2YUNsYXNzVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JQYXRoOwotCi1wdWJsaWMgY2xhc3MgSmF2YUNsYXNzVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphdmFDbGFzc1RyYW5zbGF0b3IuCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEphdmFDbGFzc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSmF2YUNsYXNzVHJhbnNsYXRvci4KLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBwYXRoKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphdmFDbGFzc1RyYW5zbGF0b3IuCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHBhdGhzCi0JICovCi0JcHVibGljIEphdmFDbGFzc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gcGF0aHMpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRocyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphdmFDbGFzc1RyYW5zbGF0b3IuCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIEphdmFDbGFzc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGludCBzdHlsZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHN0eWxlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUsIFN0cmluZyB2YWx1ZSwgTm90aWZpZXIgb3duZXIpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb252ZXJ0U3RyaW5nVG9WYWx1ZSh2YWx1ZSwgKEVPYmplY3QpIG93bmVyKTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAoc3RyVmFsdWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHF1YWxpZmllZE5hbWUgPSByZW1vdmVQcmVjZWVkaW5nQW5kVHJhaWxpbmdQZXJpb2RzKHN0clZhbHVlLnRyaW0oKSk7CQkKLQkJCWlmIChvd25lciAhPSBudWxsKSB7Ci0JCQkJUmVzb3VyY2Ugb3duZXJSZXMgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJCQlpZiAob3duZXJSZXMgIT0gbnVsbCkgewotCQkJCQlSZXNvdXJjZVNldCBycyA9IG93bmVyUmVzLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCWlmIChycyAhPSBudWxsKSB7Ci0JCQkJCQkvL1RyeSB0byByZWZsZWN0IHRoZSB0eXBlIGRpcmVjdGx5LiAgSWYgbm90aGluZyBpcyByZXR1cm5lZAotCQkJCQkJLy9vciBhbiBlcnJvciBvY2N1cnMsIHJldHVybiBhIHByb3h5LgotCQkJCQkJT2JqZWN0IGphdmFDbGFzcyA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWphdmFDbGFzcyA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShxdWFsaWZpZWROYW1lLCBycyk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vSWdub3JlCi0JCQkJCQl9Ci0JCQkJCQlpZiAoamF2YUNsYXNzICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIGphdmFDbGFzczsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYocXVhbGlmaWVkTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgU3RyaW5nIHJlbW92ZVByZWNlZWRpbmdBbmRUcmFpbGluZ1BlcmlvZHMoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJY2hhcltdIGNoYXJhY3RlcnMgPSBxdWFsaWZpZWROYW1lLnRvQ2hhckFycmF5KCk7Ci0JCWludCBzdGFydEluZGV4ID0gMDsKLQkJZm9yICg7IHN0YXJ0SW5kZXggPCBjaGFyYWN0ZXJzLmxlbmd0aCAmJiBjaGFyYWN0ZXJzW3N0YXJ0SW5kZXhdID09ICcuJzsgc3RhcnRJbmRleCsrKTsKLQkJaW50IHF1YWxpZmllZE5hbWVFbmQgPSBxdWFsaWZpZWROYW1lLmxlbmd0aCgpIC0gMTsKLQkJaW50IGVuZEluZGV4ID0gcXVhbGlmaWVkTmFtZUVuZDsKLQkJZm9yICg7IGVuZEluZGV4ID4gLTEgJiYgY2hhcmFjdGVyc1tlbmRJbmRleF0gPT0gJy4nOyBlbmRJbmRleC0tKQotCQlpZiAoc3RhcnRJbmRleCA9PSAwICYmIGVuZEluZGV4ID09IHF1YWxpZmllZE5hbWVFbmQpCi0JCQlyZXR1cm4gcXVhbGlmaWVkTmFtZTsKLQkJcmV0dXJuIHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4ICsgMSk7Ci0JfQkKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJcmV0dXJuICgoSmF2YUNsYXNzKSB2YWx1ZSkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL1Jlc0F1dGhUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9SZXNBdXRoVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY4Yjk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL1Jlc0F1dGhUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDMwLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc0F1dGhUeXBlQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgUmVzQXV0aFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUlORVJfQVVUSCA9ICJDT05UQUlORVIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfQVVUSCA9ICJTRVJWTEVUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBSZXNBdXRoVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoUkVTX0FVVEgsIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX0F1dGgoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKGlzV2ViKChSZXNvdXJjZVJlZilvd25lcikpCi0JCQlyZXR1cm4gY29udmVydFdlYlN0cmluZ1RvVmFsdWUoc3RyVmFsdWUsIG93bmVyKTsKLQkJCi0JCXJldHVybiBzdXBlci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShzdHJWYWx1ZSwgb3duZXIpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc3RyVmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgY29udmVydFdlYlN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmIChTRVJWTEVUX0FVVEguZXF1YWxzKHN0clZhbHVlKSkgCi0JCQlyZXR1cm4gUmVzQXV0aFR5cGVCYXNlLkFQUExJQ0FUSU9OX0xJVEVSQUw7Ci0JCWVsc2UgaWYgKENPTlRBSU5FUl9BVVRILmVxdWFscyhzdHJWYWx1ZSkpIAotCQkJcmV0dXJuIFJlc0F1dGhUeXBlQmFzZS5DT05UQUlORVJfTElURVJBTDsKLQkJZWxzZSAKLQkJCXJldHVybiBzdXBlci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShzdHJWYWx1ZSwgb3duZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmIChpc1dlYjIyKCgoUmVzb3VyY2VSZWYpb3duZXIpKSkKLQkJCXJldHVybiBjb252ZXJ0V2ViVmFsdWVUb1N0cmluZyh2YWx1ZSwgb3duZXIpOwotCQkgCi0JCXJldHVybiBzdXBlci5jb252ZXJ0VmFsdWVUb1N0cmluZyh2YWx1ZSwgb3duZXIpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjb252ZXJ0V2ViVmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKFJlc0F1dGhUeXBlQmFzZS5BUFBMSUNBVElPTl9MSVRFUkFMID09IHZhbHVlKQotCQkJcmV0dXJuIFNFUlZMRVRfQVVUSDsKLQkJZWxzZSBpZiAoUmVzQXV0aFR5cGVCYXNlLkNPTlRBSU5FUl9MSVRFUkFMID09IHZhbHVlKQotCQkJcmV0dXJuIENPTlRBSU5FUl9BVVRIOwotCQllbHNlIAotCQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKHZhbHVlLCBvd25lcik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXZWIoUmVzb3VyY2VSZWYgcmVmKSB7Ci0JCUVPYmplY3Qgb3duZXIgPSByZWYuZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gKG93bmVyIGluc3RhbmNlb2YgV2ViQXBwKTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXZWIyMihSZXNvdXJjZVJlZiByZWYpIHsgCi0JCXJldHVybiBpc1dlYihyZWYpICYmICgoV2ViQXBwKXJlZi5lQ29udGFpbmVyKCkpLmdldFZlcnNpb25JRCgpIDw9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29ubmVjdG9yL0Nvbm5lY3RvclRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29ubmVjdG9yL0Nvbm5lY3RvclRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2MTZiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2Nvbm5lY3Rvci9Db25uZWN0b3JUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb25uZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLlJhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotcHVibGljIGNsYXNzIENvbm5lY3RvclRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIFJhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSwgSjJFRUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBDb25uZWN0b3JUcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IENvbm5lY3RvclRyYW5zbGF0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1IgPSAiY29ubmVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEpjYVBhY2thZ2UgQ09OTkVDVE9SX1BLRyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCXByaXZhdGUgc3RhdGljIENvbW1vblBhY2thZ2UgQ09NTU9OX1BLRyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEzOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjE0OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgVkVORE9SX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFZFTkRPUl9OQU1FLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRUlTX1RZUEVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKEVJU19UWVBFLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9FaXNUeXBlKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgQ09ORklHX1BST1BFUlRZX05BTUVfVFJBTlNMQVRPUj0gbmV3IFRyYW5zbGF0b3IoQ09ORklHX1BST1BFUlRZX05BTUUsIENPTk5FQ1RPUl9QS0cuZ2V0Q29uZmlnUHJvcGVydHlfTmFtZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIENPTkZJR19QUk9QRVJUWV9UWVBFX1RSQU5TTEFUT1I9IG5ldyBUcmFuc2xhdG9yKENPTkZJR19QUk9QRVJUWV9UWVBFLCBDT05ORUNUT1JfUEtHLmdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBDT05GSUdfUFJPUEVSVFlfVkFMVUVfVFJBTlNMQVRPUj0gbmV3IFRyYW5zbGF0b3IoQ09ORklHX1BST1BFUlRZX1ZBTFVFLCBDT05ORUNUT1JfUEtHLmdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgU0VDVVJJVFlfUEVSTUlTU0lPTl9TUEVDX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihTRUNVUklUWV9QRVJNSVNTSU9OX1NQRUMsIENPTk5FQ1RPUl9QS0cuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NwZWNpZmljYXRpb24oKSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBBVVRIX01FQ0hfVFlQRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoQVVUSF9NRUNIX1RZUEUsIENPTk5FQ1RPUl9QS0cuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgQ1JFREVOVElBTF9JTlRFUkZBQ0VfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKENSRURFTlRJQUxfSU5URVJGQUNFLCBDT05ORUNUT1JfUEtHLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhblRyYW5zbGF0b3IgTElDRU5TRV9SRVFVSVJFRF9UUkFOU0xBVE9SID0gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKExJQ0VOU0VfUkVRVUlSRUQsIENPTk5FQ1RPUl9QS0cuZ2V0TGljZW5zZV9SZXF1aXJlZCgpKTsKLQkKLQlwdWJsaWMgQ29ubmVjdG9yVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoQ09OTkVDVE9SLCBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3IoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMyA9PSBudWxsKQotCQkJCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjEzOwkKLQkJCWRlZmF1bHQgOgotCQkJCWlmIChjaGlsZHJlbjE0ID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTQgPSBjcmVhdGUxNENoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTQ7IAotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkgKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoSUNPTisiLyIrU01BTExfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSApLCAvLyROT04tTkxTLTEkCi0JCQluZXcgVHJhbnNsYXRvcihJQ09OKyIvIitMQVJHRV9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpICksIC8vJE5PTi1OTFMtMSQKLQkJCVZFTkRPUl9OQU1FX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihTUEVDX1ZFUlNJT04sIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCkgKSwKLQkJCUVJU19UWVBFX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihWRVJTSU9OLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9WZXJzaW9uKCkgKSwKLQkJCWNyZWF0ZUxpY2Vuc2VUcmFuc2xhdG9yMTMoKSwKLQkJCWNyZWF0ZVJlc291cmNlQWRhcHRlclRyYW5zbGF0b3IxMygpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoVkVSU0lPTiwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0b3JfU3BlY1ZlcnNpb24oKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OUywgSjJFRV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlNfWFNJLCBYU0lfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWFNJX1NDSEVNQV9MT0NBVElPTiwgSjJFRV9OU19VUkwrJyAnK0NPTk5FQ1RPUl9TQ0hFTUFfTE9DXzFfNSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCVZFTkRPUl9OQU1FX1RSQU5TTEFUT1IsCi0JCQlFSVNfVFlQRV9UUkFOU0xBVE9SLAotCQkJbmV3IFRyYW5zbGF0b3IoUkVTT1VSQ0VBREFQVEVSX1ZFUlNJT04sIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdG9yX1ZlcnNpb24oKSksCi0JCQljcmVhdGVMaWNlbnNlVHJhbnNsYXRvcjE0KCksCi0JCQljcmVhdGVSZXNvdXJjZUFkYXB0ZXJUcmFuc2xhdG9yMTQoKSwKLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUmVzb3VyY2VBZGFwdGVyVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUkVTT1VSQ0VBREFQVEVSLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9SZXNvdXJjZUFkYXB0ZXIoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFJFU09VUkNFQURBUFRFUl9DTEFTUyxDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9SZXNvdXJjZUFkYXB0ZXJDbGFzcygpKSwKLQkJCWNyZWF0ZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRyYW5zbGF0b3IxNChDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCkpLAotCQkJY3JlYXRlT3V0Ym91bmRUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVJbmJvdW5kVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQWRtaW5PYmplY3RUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVTZWN1cml0eVBlcm1pc3Npb25zVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVPdXRib3VuZFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihPVVRCT1VORF9SRVNPVVJDRUFEQVBURVIsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVDb25uZWN0aW9uRGVmaW5hdGlvblRyYW5zbGF0b3IoKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFRSQU5TQUNUSU9OX1NVUFBPUlQsIENPTk5FQ1RPUl9QS0cuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCkpLAotCQkJY3JlYXRlQXV0aE1lY2hhbmlzbVRyYW5zbGF0b3IxNChDT05ORUNUT1JfUEtHLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpKSwKLQkJCW5ldyBCb29sZWFuVHJhbnNsYXRvcihSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQsIENPTk5FQ1RPUl9QS0cuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJbmJvdW5kVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKElOQk9VTkRfUkVTT1VSQ0VBREFQVEVSLCBDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVNZXNzYWdlQWRhcHRlclRyYW5zbGF0b3IoKQotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTWVzc2FnZUFkYXB0ZXJUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVTU0FHRUFEQVBURVIsIENPTk5FQ1RPUl9QS0cuZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9NZXNzYWdlQWRhcHRlcigpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlTWVzc2FnZUxpc3RlbmVyVHJhbnNsYXRvcigpLAotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkJCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU1lc3NhZ2VMaXN0ZW5lclRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNRVNTQUdFTElTVEVORVIsIENPTk5FQ1RPUl9QS0cuZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUxpc3RlbmVycygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVTU0FHRUxJU1RFTkVSX1RZUEUsIENPTk5FQ1RPUl9QS0cuZ2V0TWVzc2FnZUxpc3RlbmVyX01lc3NhZ2VMaXN0ZW5lclR5cGUoKSksCi0JCQljcmVhdGVBY3RpdmF0aW9uU3BlY1RyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQWN0aXZhdGlvblNwZWNUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQUNUSVZBVElPTlNQRUMsIENPTk5FQ1RPUl9QS0cuZ2V0TWVzc2FnZUxpc3RlbmVyX0FjdGl2YXRpb25TcGVjKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihBQ1RJVkFUSU9OU1BFQ19DTEFTUywgQ09OTkVDVE9SX1BLRy5nZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlY0NsYXNzKCkpLAotCQkJY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVRyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFksIENPTk5FQ1RPUl9QS0cuZ2V0QWN0aXZhdGlvblNwZWNfUmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09OTkVDVE9SX1BLRy5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihDT05GSUdfUFJPUEVSVFlfTkFNRSwgQ09OTkVDVE9SX1BLRy5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9OYW1lKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQWRtaW5PYmplY3RUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQURNSU5PQkpFQ1QsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWluT2JqZWN0cygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoQURNSU5PQkpFQ1RfSU5URVJGQUNFLCBDT05ORUNUT1JfUEtHLmdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0SW50ZXJmYWNlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQURNSU5PQkpFQ1RfQ0xBU1MsIENPTk5FQ1RPUl9QS0cuZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RDbGFzcygpKSwKLQkJCWNyZWF0ZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRyYW5zbGF0b3IxNChDT05ORUNUT1JfUEtHLmdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKSkKLQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ29ubmVjdGlvbkRlZmluYXRpb25UcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09OTkVDVElPTl9ERUZJTklUSU9OLCBDT05ORUNUT1JfUEtHLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25EZWZpbml0aW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoTUFOQUdFRENPTk5FQ1RJT05GQUNUT1JZX0NMQVNTLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkpLAotCQkJY3JlYXRlQ29uZmlndXJhdGlvblByb3BlcnR5VHJhbnNsYXRvcjE0KENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29uZmlnUHJvcGVydGllcygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKENPTk5FQ1RJT05GQUNUT1JZX0lOVEVSRkFDRSwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKENPTk5FQ1RJT05GQUNUT1JZX0lNUExfQ0xBU1MsIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSksCi0JCQluZXcgVHJhbnNsYXRvcihDT05ORUNUSU9OX0lOVEVSRkFDRSwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW50ZXJmYWNlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09OTkVDVElPTl9JTVBMX0NMQVNTLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZVJlc291cmNlQWRhcHRlclRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFU09VUkNFQURBUFRFUiwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0b3JfUmVzb3VyY2VBZGFwdGVyKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihNQU5BR0VEQ09OTkVDVElPTkZBQ1RPUllfQ0xBU1MsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkgKSwKLQkJCW5ldyBUcmFuc2xhdG9yKENPTk5FQ1RJT05GQUNUT1JZX0lOVEVSRkFDRSwgQ09OTkVDVE9SX1BLRy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSApLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09OTkVDVElPTkZBQ1RPUllfSU1QTF9DTEFTUywgQ09OTkVDVE9SX1BLRy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSApLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09OTkVDVElPTl9JTlRFUkZBQ0UsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihDT05ORUNUSU9OX0lNUExfQ0xBU1MsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSksCi0JCQluZXcgVHJhbnNsYXRvcihUUkFOU0FDVElPTl9TVVBQT1JULCBDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKSApLAotCQkJY3JlYXRlQ29uZmlndXJhdGlvblByb3BlcnR5VHJhbnNsYXRvcjEzKENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKSksCi0JCQljcmVhdGVBdXRoTWVjaGFuaXNtVHJhbnNsYXRvcjEzKENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpKSwKLQkJCW5ldyBCb29sZWFuVHJhbnNsYXRvcihSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkpLAotCQkJY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uc1RyYW5zbGF0b3IoKQotCQkJCi0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbnNUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VDVVJJVFlfUEVSTUlTU0lPTiwgQ09OTkVDVE9SX1BLRy5nZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTk5FQ1RPUl9QS0cuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCkpLAotCQkJU0VDVVJJVFlfUEVSTUlTU0lPTl9TUEVDX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUF1dGhNZWNoYW5pc21UcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGFmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihBVVRIX01FQ0hBTklTTSwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09OTkVDVE9SX1BLRy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbigpKSwgCi0JCQlBVVRIX01FQ0hfVFlQRV9UUkFOU0xBVE9SLAotCQkJQ1JFREVOVElBTF9JTlRFUkZBQ0VfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlQXV0aE1lY2hhbmlzbVRyYW5zbGF0b3IxNChFU3RydWN0dXJhbEZlYXR1cmUgYWZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEFVVEhfTUVDSEFOSVNNLCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT05ORUNUT1JfUEtHLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpKSwgCi0JCQlBVVRIX01FQ0hfVFlQRV9UUkFOU0xBVE9SLAotCQkJQ1JFREVOVElBTF9JTlRFUkZBQ0VfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlQ29uZmlndXJhdGlvblByb3BlcnR5VHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09ORklHX1BST1BFUlRZLCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT05ORUNUT1JfUEtHLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCkpLAotCQkJQ09ORklHX1BST1BFUlRZX05BTUVfVFJBTlNMQVRPUiwKLQkJCUNPTkZJR19QUk9QRVJUWV9UWVBFX1RSQU5TTEFUT1IsCi0JCQlDT05GSUdfUFJPUEVSVFlfVkFMVUVfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlQ29uZmlndXJhdGlvblByb3BlcnR5VHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09ORklHX1BST1BFUlRZLCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT05ORUNUT1JfUEtHLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9ucygpKSwKLQkJCUNPTkZJR19QUk9QRVJUWV9OQU1FX1RSQU5TTEFUT1IsCi0JCQlDT05GSUdfUFJPUEVSVFlfVFlQRV9UUkFOU0xBVE9SLAotCQkJQ09ORklHX1BST1BFUlRZX1ZBTFVFX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUxpY2Vuc2VUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihMSUNFTlNFLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9MaWNlbnNlKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09OTkVDVE9SX1BLRy5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCkpLCAKLQkJCUxJQ0VOU0VfUkVRVUlSRURfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlTGljZW5zZVRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKExJQ0VOU0UsIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT05ORUNUT1JfUEtHLmdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCkpLCAKLQkJCUxJQ0VOU0VfUkVRVUlSRURfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9BYnN0cmFjdEVKQlRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0Fic3RyYWN0RUpCVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZkNGFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0Fic3RyYWN0RUpCVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMzEsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5KYXZhQ2xhc3NUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFSkJUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSwgSjJFRVZlcnNpb25Db25zdGFudHMgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRWpiUGFja2FnZSBFSkJfUEtHID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb21tb25QYWNrYWdlIENPTU1PTl9QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RFSkJUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgRUpCX1BLRy5nZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCkpOwotCX0KLQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTNDaGlsZHJlbigpIHsKLQkJVHJhbnNsYXRvcltdIHN0YXJ0ID0gZ2V0Q29tbW9uQmVnaW5NYXBzMTMoKTsKLQkJVHJhbnNsYXRvcltdIG1pZGRsZSA9IGdldFNwZWNpZmljTWFwcyhKMkVFXzFfM19JRCk7Ci0JCVRyYW5zbGF0b3JbXSBlbmQgPSBnZXRFbmRNYXBzMTMoKTsKLQkJcmV0dXJuIChUcmFuc2xhdG9yW10pIGNvbmNhdChzdGFydCwgY29uY2F0KG1pZGRsZSwgZW5kKSk7Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTRDaGlsZHJlbigpIHsKLQkJCVRyYW5zbGF0b3JbXSBzdGFydCA9IGdldENvbW1vbkJlZ2luTWFwczE0KCk7Ci0JCQlUcmFuc2xhdG9yW10gbWlkZGxlID0gZ2V0U3BlY2lmaWNNYXBzKEoyRUVfMV80X0lEKTsKLQkJCVRyYW5zbGF0b3JbXSBlbmQgPSBnZXRFbmRNYXBzMTQoKTsKLQkJCS8vVHJhbnNsYXRvcltdIGRlcGxveW1lbnRFeHQgPSBnZXREZXBsb3ltZW50RXh0ZW5zaW9uTWFwcygpOwotCQkJcmV0dXJuIChUcmFuc2xhdG9yW10pIGNvbmNhdChzdGFydCwgY29uY2F0KG1pZGRsZSwgZW5kKSk7Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q29tbW9uQmVnaW5NYXBzMTMoKSB7Ci0JCQotCQlUcmFuc2xhdG9yW10gYmVnaW5NYXBzID0gIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoRUpCX05BTUUsIEVKQl9QS0cuZ2V0RW50ZXJwcmlzZUJlYW5fTmFtZSgpKQotCQl9OwotCQkKLQkJaWYgKHVzZXNIb21lUmVtb3RlQXR0cmlidXRlcygpKQotCQkJcmV0dXJuIChUcmFuc2xhdG9yW10pY29uY2F0KGNvbmNhdChiZWdpbk1hcHMsIGdldEhvbWVSZW1vdGVNYXBzKCkpLCBnZXRFSkJDbGFzc01hcCgpKTsKLQkJcmV0dXJuIChUcmFuc2xhdG9yW10pY29uY2F0KGJlZ2luTWFwcywgZ2V0RUpCQ2xhc3NNYXAoKSk7Ci0JfQotCQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRDb21tb25CZWdpbk1hcHMxNCgpIHsKLQkJCi0JCVRyYW5zbGF0b3JbXSBiZWdpbk1hcHMgPSAgbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKEVKQl9OQU1FLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX05hbWUoKSkKLQkJfTsKLQkJaWYgKHVzZXNIb21lUmVtb3RlQXR0cmlidXRlcygpKQotCQkJcmV0dXJuIChUcmFuc2xhdG9yW10pY29uY2F0KGNvbmNhdChiZWdpbk1hcHMsIGdldEhvbWVSZW1vdGVNYXBzKCkpLCBnZXRFSkJDbGFzc01hcCgpKTsKLQkJcmV0dXJuIChUcmFuc2xhdG9yW10pY29uY2F0KGJlZ2luTWFwcywgZ2V0RUpCQ2xhc3NNYXAoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0SG9tZVJlbW90ZU1hcHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKEhPTUUsIEVKQl9QS0cuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFJFTU9URSwgRUpCX1BLRy5nZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSksCi0JCQkvL0JlZ2luIEVKQiAyLjAKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKExPQ0FMX0hPTUUsIEVKQl9QS0cuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCkpLAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoTE9DQUwsIEVKQl9QS0cuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxJbnRlcmZhY2UoKSkKLQkJCS8vRW5kIEVKQiAyLjAKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldEVKQkNsYXNzTWFwKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihFSkJfQ0xBU1MsIEVKQl9QS0cuZ2V0RW50ZXJwcmlzZUJlYW5fRWpiQ2xhc3MoKSkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VzSG9tZVJlbW90ZUF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRFbmRNYXBzMTMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX0VOVl9FTlRSWV8xXzMsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfUkVGXzFfMywKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX0VKQl9MT0NBTF9SRUZfMV8zLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlU2VjdXJpdHlSb2xlUmVmVHJhbnNsYXRvcjEzKEVKQl9QS0cuZ2V0RW50ZXJwcmlzZUJlYW5fU2VjdXJpdHlSb2xlUmVmcygpKSwKLQkJCW5ldyBTZWN1cml0eUlkZW50aXR5VHJhbnNsYXRvcigpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfUkVGXzFfMywKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1JFU09VUkNFX0VOVl9SRUZfMV8zCi0JCX07Ci0KLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczE0KCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfTE9DQUxfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1NFUlZJQ0VfUkVGXzFfNCwJCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfRU5WX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9NRVNTQUdFX0RFU1RfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlY3VyaXR5Um9sZVJlZlRyYW5zbGF0b3IxNChFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSksCi0JCQluZXcgU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IoKSwKLQkJfTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBUcmFuc2xhdG9yW10gZ2V0U3BlY2lmaWNNYXBzKGludCB2ZXJzaW9uSUQpOwotCi0vLwlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldERlcGxveW1lbnRFeHRlbnNpb25NYXBzKCl7Ci0vLwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotLy8JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX0V4dGVuc2lvbnMoKSkKLS8vCQl9OwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQWNrbm93bGVkZ2VNb2RlVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQWNrbm93bGVkZ2VNb2RlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGZlZjI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0Fja25vd2xlZGdlTW9kZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMzEsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY2tub3dsZWRnZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIEFja25vd2xlZGdlTW9kZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fQUNLTk9XTEVER0UgPSAiQXV0by1hY2tub3dsZWRnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVVBTX09LX0FDS05PV0xFREdFID0gIkR1cHMtb2stYWNrbm93bGVkZ2UiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEFja25vd2xlZGdlTW9kZVRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEFDS05PV0xFREdFX01PREUsIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fQWNrbm93bGVkZ2VNb2RlKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAoQVVUT19BQ0tOT1dMRURHRS5lcXVhbHNJZ25vcmVDYXNlKHN0clZhbHVlKSkKLQkJCXJldHVybiBBY2tub3dsZWRnZU1vZGUuQVVUT19BQ0tOT1dMRURHRV9MSVRFUkFMOwotCQllbHNlIGlmIChEVVBTX09LX0FDS05PV0xFREdFLmVxdWFsc0lnbm9yZUNhc2Uoc3RyVmFsdWUpKQotCQkJcmV0dXJuIEFja25vd2xlZGdlTW9kZS5EVVBTX09LX0FDS05PV0xFREdFX0xJVEVSQUw7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoc3RyVmFsdWUsIG93bmVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAoQWNrbm93bGVkZ2VNb2RlLkFVVE9fQUNLTk9XTEVER0VfTElURVJBTC5lcXVhbHModmFsdWUpKSAKLQkJCXJldHVybiBBVVRPX0FDS05PV0xFREdFOwotCQllbHNlIGlmIChBY2tub3dsZWRnZU1vZGUuRFVQU19PS19BQ0tOT1dMRURHRV9MSVRFUkFMLmVxdWFscyh2YWx1ZSkpCi0JCQlyZXR1cm4gRFVQU19PS19BQ0tOT1dMRURHRTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKHZhbHVlLCBvd25lcik7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUEZpZWxkVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQ01QRmllbGRUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NjFhNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQ01QRmllbGRUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBhZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENNUEZpZWxkVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXB1YmxpYyBzdGF0aWMgRWpiUGFja2FnZSBFSkJfUEtHID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0JcHVibGljIENNUEZpZWxkVHJhbnNsYXRvcigpewotCQlzdXBlcihDTVBfRklFTEQsIEVKQl9QS0cuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QZXJzaXN0ZW50QXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTixFSkJfUEtHLmdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEZJRUxEX05BTUUsIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCkpCQotCQl9OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZDaGlsZHJlbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgewotCQlzd2l0Y2goKChDb250YWluZXJNYW5hZ2VkRW50aXR5KW1vZk9iamVjdCkuZ2V0VmVyc2lvbklEKCkpIHsgIAotCQkJCi0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ6Ci0JCi0JCQkJcmV0dXJuIHN1cGVyLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0JCQkJCi0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ6IGRlZmF1bHQ6Ci0JCi0JCQkJcmV0dXJuIGdldDIwQ01QQXR0cmlidXRlcygoQ29udGFpbmVyTWFuYWdlZEVudGl0eSltb2ZPYmplY3QpOwotCQl9ICAKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0MjBDTVBBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCUxpc3QgYWxsQXR0cmlidXRlcywgcmVtb3ZlZCwgcmVzdWx0OwotCQlyZW1vdmVkID0gbnVsbDsKLQkJYWxsQXR0cmlidXRlcyA9IGNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQlpbnQgc2l6ZSA9IGFsbEF0dHJpYnV0ZXMuc2l6ZSgpOwotCQlDTVBBdHRyaWJ1dGUgYXR0ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWF0dCA9IChDTVBBdHRyaWJ1dGUpIGFsbEF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJaWYgKGF0dC5pc0Rlcml2ZWQoKSkgewotCQkJCWlmIChyZW1vdmVkID09IG51bGwpCi0JCQkJCXJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcmVtb3ZlZC5hZGQoYXR0KTsKLQkJCX0KLQkJfQotCQlpZiAocmVtb3ZlZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQkJcmVzdWx0LmFkZEFsbChhbGxBdHRyaWJ1dGVzKTsKLQkJCXJlc3VsdC5yZW1vdmVBbGwocmVtb3ZlZCk7Ci0JCX0gZWxzZQotCQkJcmVzdWx0ID0gYWxsQXR0cmlidXRlczsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUFZlcnNpb25UcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9DTVBWZXJzaW9uVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTc0M2NkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUFZlcnNpb25UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDMsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDTVBWZXJzaW9uVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBDTVBWZXJzaW9uVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoQ01QX1ZFUlNJT04sIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfVmVyc2lvbigpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCUVKQkphciBwYXJlbnQgPSAoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpbW9mT2JqZWN0KS5nZXRFamJKYXIoKTsKLQkJaWYgKHBhcmVudC5nZXRWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKQotCQkJcmV0dXJuIHN1cGVyLmdldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9Db250YWluZXJNYW5hZ2VkRW50aXR5VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQ29udGFpbmVyTWFuYWdlZEVudGl0eVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U0N2EzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9Db250YWluZXJNYW5hZ2VkRW50aXR5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyTWFuYWdlZEVudGl0eVRyYW5zbGF0b3IgZXh0ZW5kcyBFbnRpdHlUcmFuc2xhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEzOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjE0OwotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5VHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLQl9Ci0JLy9UT0RPIFVuY29tbWVudCBhbGwgY29tbWVudGVkIGNvZGUgYW5kIGZpeAotCS8qCi0JcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0U3RyaW5nVmFsdWUoTWFwSW5mbyBtYXAsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChtYXAuZ2V0RE9NTmFtZSgpLmVxdWFscyhQUklNS0VZX0ZJRUxEKSkgewkKLQkJCUNNUEF0dHJpYnV0ZSBhdHRyID0gZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpLmdldFByaW1hcnlLZXlBdHRyaWJ1dGUoKTsKLQkJCXJldHVybiBhdHRyID09IG51bGwgPyBnZXRTcGVjaWZpZWRQcmltS2V5RmllbGROYW1lKCkgOiBhdHRyLmdldE5hbWUoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gc3VwZXIuZXh0cmFjdFN0cmluZ1ZhbHVlKG1hcCwgbW9mT2JqZWN0KTsKLQkKLQl9IAotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjaWZpZWRQcmltS2V5RmllbGROYW1lKCkgewotCQlyZXR1cm4gQ01QU3BlY0FkYXB0ZXIuZ2V0U3BlY2lmaWVkUHJpbUtleUZpZWxkTmFtZShnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpOwotCX0KLQkqLwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMyA9PSBudWxsKQotCQkJCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjEzOwkKLQkJCWRlZmF1bHQgOgotCQkJCWlmIChjaGlsZHJlbjE0ID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTQgPSBjcmVhdGUxNENoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTQ7IAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQZXJzaXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiBDT05UQUlORVI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiLkVudGl0eVRyYW5zbGF0b3IjZ2V0U3BlY2lmaWNNYXBzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldFNwZWNpZmljTWFwcyhpbnQgdmVyc2lvbklEKSB7Ci0JCVRyYW5zbGF0b3JbXSBjbXBUcmFuc2xhdG9ycyA9IG5ldyBUcmFuc2xhdG9yW10gewotCQkJLy9CZWdpbiBFSkIgMi4wIGFkZGVkCi0JCQluZXcgQ01QVmVyc2lvblRyYW5zbGF0b3IoKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEFCU1RSQUNUX1NDSEVNQV9OQU1FLCBFSkJfUEtHLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQWJzdHJhY3RTY2hlbWFOYW1lKCkpLAotCQkJLy9FbmQgRUpCIDIuMCBhZGRlZAotCQkKLQkJCW5ldyBDTVBGaWVsZFRyYW5zbGF0b3IoKSwKLQkJCW5ldyBQcmltS2V5RmllbGRUcmFuc2xhdG9yKCksCi0JCX07Ci0JCXJldHVybiAoVHJhbnNsYXRvcltdKSBjb25jYXQoc3VwZXIuZ2V0U3BlY2lmaWNNYXBzKHZlcnNpb25JRCksIGNtcFRyYW5zbGF0b3JzKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRFbmRNYXBzMTMoKSB7Ci0JCS8vQWRkZWQgZm9yIEVKQiAyLjAKLQkJVHJhbnNsYXRvcltdIHF1ZXJ5VCA9IG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlUXVlcnlUcmFuc2xhdG9ycygpCi0JCX07Ci0JCXJldHVybiAoVHJhbnNsYXRvcltdKSBjb25jYXQoc3VwZXIuZ2V0RW5kTWFwczEzKCksIHF1ZXJ5VCk7Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczE0KCkgewotCQkJLy9BZGRlZCBmb3IgRUpCIDIuMAotCQkJVHJhbnNsYXRvcltdIHF1ZXJ5VCA9IG5ldyBUcmFuc2xhdG9yW10gewotCQkJCWNyZWF0ZVF1ZXJ5VHJhbnNsYXRvcnMoKQotCQkJfTsKLQkJCXJldHVybiAoVHJhbnNsYXRvcltdKSBjb25jYXQoc3VwZXIuZ2V0RW5kTWFwczE0KCksIHF1ZXJ5VCk7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUXVlcnlUcmFuc2xhdG9ycygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFFVRVJZLCBFSkJfUEtHLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUXVlcmllcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIEVKQl9QS0cuZ2V0UXVlcnlfRGVzY3JpcHRpb24oKSksCi0JCQljcmVhdGVRdWVyeU1ldGhvZFRyYW5zbGF0b3JzKCksCi0JCQluZXcgVHJhbnNsYXRvcihSRVNVTFRfVFlQRV9NQVBQSU5HLCBFSkJfUEtHLmdldFF1ZXJ5X1JldHVyblR5cGVNYXBwaW5nKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoRUpCX1FMLCBFSkJfUEtHLmdldFF1ZXJ5X0VqYlFMKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUXVlcnlNZXRob2RUcmFuc2xhdG9ycygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFFVRVJZX01FVEhPRCwgRUpCX1BLRy5nZXRRdWVyeV9RdWVyeU1ldGhvZCgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVUSE9EX05BTUUsIEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9OYW1lKCkpLAotCQkJbmV3IE1ldGhvZFBhcmFtc1RyYW5zbGF0b3IoRUpCX1BLRy5nZXRNZXRob2RFbGVtZW50X1Bhcm1zKCkpCi0JCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoKLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NRmVhdHVyZShNYXBJbmZvIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAobWFwID09IG5vRmVhdHVyZVByaW1LZXlNYXBJbmZvKQotCQkJcmV0dXJuOwotCQlpZiAobWFwLmdldERPTU5hbWUoKS5lcXVhbHMoQ01QX1ZFUlNJT04pKSB7Ci0JCQl1cGRhdGVET01DbXBWZXJzaW9uSWZOZWNlc3NhcnkobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnByaW1VcGRhdGVET01GZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJLy9JZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgaGFzIGNoYW5nZWQsIHRoaXMgd2lsbCBpbXBhY3QgdGhlIHByaW1hcnkga2V5IGZpZWxkCi0JCWlmIChtYXAuZ2V0RE9NTmFtZSgpLmVxdWFscyhQUklNX0tFWV9DTEFTUykpIHsKLQkJCVN0cmluZyBzcGVjaWZpZWRQcmltS2V5RmllbGQgPSBDTVBTcGVjQWRhcHRlci5nZXRTcGVjaWZpZWRQcmltS2V5RmllbGROYW1lKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSk7Ci0JCQl0cnkgewotCQkJCXN1cGVyLnByaW1VcGRhdGVET01GZWF0dXJlKG5vRmVhdHVyZVByaW1LZXlNYXBJbmZvLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlDTVBTcGVjQWRhcHRlci5zZXRQcmltS2V5RmllbGRGcm9tWG1sKHNwZWNpZmllZFByaW1LZXlGaWVsZCwgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTUNtcFZlcnNpb25JZk5lY2Vzc2FyeShNYXBJbmZvIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoIShtb2ZPYmplY3QgaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KSkgCi0JCQlyZXR1cm47Ci0JCQotCQlFSkJKYXIgcGFyZW50ID0gKChDb250YWluZXJNYW5hZ2VkRW50aXR5KW1vZk9iamVjdCkuZ2V0RWpiSmFyKCk7Ci0JCWlmIChwYXJlbnQuaXNWZXJzaW9uMl8wRGVzY3JpcHRvcigpKQotCQkJc3VwZXIucHJpbVVwZGF0ZURPTUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKE1hcEluZm8gbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChtYXAgPT0gZmVhdHVyZVByaW1LZXlNYXBJbmZvKSAKLQkJCXN1cGVyLnByaW1VcGRhdGVET01GZWF0dXJlKG5vRmVhdHVyZVByaW1LZXlNYXBJbmZvLCBub2RlLCBtb2ZPYmplY3QpOwotCQllbHNlIAotCQkJc3VwZXIucHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIHByaW1VcGRhdGVNT0ZGZWF0dXJlKE1hcEluZm8gbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWJvb2xlYW4gaGFzQ2hhbmdlZCA9IHN1cGVyLnByaW1VcGRhdGVNT0ZGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJLy9JZiB0aGUga2V5IGNsYXNzIGhhcyBjaGFuZ2VkLCBmcm9tIHRoZSB4bWwgc2lkZSwgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBzdGFtcCB0aGUgcHJpbWtleSBmaWVsZAotCQkvL2FzIGJlaW5nIHNwZWNpZmllZCBmcm9tIHhtbCwgc2luY2Ugd2Ugd2lsbCBub3QgYXV0b21hdGljYWxseSByZW1vdmUgdGhhdCBub2RlCi0JCWlmIChtYXAuZ2V0RE9NTmFtZSgpLmVxdWFscyhQUklNX0tFWV9DTEFTUykpIHsKLQkJCXVwZGF0ZVhtbEtleUZpZWxkKG5vRmVhdHVyZVByaW1LZXlNYXBJbmZvLCBub2RlKTsKLQkJCWlmIChoYXNDaGFuZ2VkKQotCQkJCXVwZGF0ZU1PRlByaW1LZXlGaWVsZEZlYXR1cmUoZmVhdHVyZVByaW1LZXlNYXBJbmZvLCBnZXROb2RlKCksIHRydWUpOwotCQl9Ci0JCXJldHVybiBoYXNDaGFuZ2VkOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKE1hcEluZm8gbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChtYXAgPT0gbm9GZWF0dXJlUHJpbUtleU1hcEluZm8pCi0JCQlyZXR1cm47Ci0JCWlmIChtYXAuZ2V0RE9NTmFtZSgpLmVxdWFscyhQUklNS0VZX0ZJRUxEKSkgewotCQkJdXBkYXRlTU9GUHJpbUtleUZpZWxkRmVhdHVyZShtYXAsIG5vZGUsIGZhbHNlKTsKLQkJfSBlbHNlIGlmIChtYXAuZ2V0RE9NTmFtZSgpLmVxdWFscyhDTVBfRklFTEQpKSB7Ci0JCQkvL2NhY2hlIHRoZSBvbGQgbGlzdCBvZiBjbXAgYXR0cmlidXRlcyBiZWZvcmUgdXBkYXRlCi0JCQlMaXN0IGNtcEF0dHJpYnV0ZXNMaXN0Q09QWSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNtcEF0dHJpYnV0ZXNMaXN0Q09QWS5hZGRBbGwoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkpOwotCQkKLQkJCS8vZG8gdGhlIHVwZGF0ZQotCQkJc3VwZXIucHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0KLQkJCUxpc3QgbmV3Q21wQXR0cmlidXRlTGlzdCA9IGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQkJLy9rZXkgdGhlIGNtcCBhdHRyaWJ1dGUgbGlzdCBhbmQgdGhlIGtleSBhdHRyaWJ1dGUgbGlzdC4KLQkJCXBlcmZvcm1LZXlTeW5jaHJvbml6YXRpb24oY21wQXR0cmlidXRlc0xpc3RDT1BZLCBuZXdDbXBBdHRyaWJ1dGVMaXN0KTsKLQkJfSBlbHNlIAotCQkJc3VwZXIucHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JfQotCS8qKgotCSAqIE1ldGhvZCB0aGF0IHN5bmNocm9uaXppZXMgdGhlIGxpc3Qgb2YgY21wIGF0dHJpYnV0ZXMgdGhhdCBhcmUga2V5cyB3aXRoIHRoZSBrZXkgYXR0cmlidXRlIGxpc3QuCi0JICogV2hlbiBrZXlzIGFyZSBhZGRlZCBhbmQgZGVsZXRlZCBmcm9tIHRoZSBjbXAgYXR0cmlidXRlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIExpc3QgY21wQXR0cmlidXRlc0xpc3RDT1BZIC0gQ29weSBvZiB0aGUgY21wIGF0dHJpYnV0ZSBsaXN0IGJlZm9yZSBhbnkgYXR0cmlidXRlcyB3aGVyZSBhZGRlZAotCSAqIAkJCQkJCQkJCQlvciByZW1vdmVkLgotCSAqIEBwYXJhbSBMaXN0IG5ld0NtcEF0dHJpYnV0ZUxpc3QgLSBMaXN0IG9mIGNtcCBhdHRyaWJ1dGVzIGFmdGVyIGEgbW9kaWZpY2F0aW9uIGhhcyBvY2N1cmVkLgotCSAqLwotCSAvKgotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1LZXlTeW5jaHJvbml6YXRpb24oIExpc3QgY21wQXR0cmlidXRlc0xpc3RDT1BZLCBMaXN0IG5ld0NtcEF0dHJpYnV0ZUxpc3QgKSB7CQotCQlpZiggY21wQXR0cmlidXRlc0xpc3RDT1BZICE9IG51bGwgJiYgbmV3Q21wQXR0cmlidXRlTGlzdCAhPSBudWxsICkgewkKLQotCQkJLy9hZGQgYW5kIHJlbW92ZXMga2V5cyBiYXNlZCBvbiB3aGF0IHRoZSBhZGFwdGVycyBnaXZlIGJhY2sKLQkJCi0JCQlMaXN0IGFkZGVkQ21wQXR0cmlidXRlTGlzdCA9IGdldENtcEF0dHJpYnV0ZXNEZWx0YUxpc3QoIGNtcEF0dHJpYnV0ZXNMaXN0Q09QWSwgbmV3Q21wQXR0cmlidXRlTGlzdCApOwotCQkJaWYoIGFkZGVkQ21wQXR0cmlidXRlTGlzdCAhPSBudWxsICYmICFhZGRlZENtcEF0dHJpYnV0ZUxpc3QuaXNFbXB0eSgpICkgewkJCQkJCi0JCQkJLy9kZXRlcm1pbmUgaWYgYW55IG9mIHRoZSBhZGRlZCBhdHRyaWJ1dGVzIGFyZSBrZXlzLCBpZiBzbyBnZXQgYSBsaXN0IG9mIHRoZW0uCi0JCQkJTGlzdCBhZGRlZEtleUF0dHJpYnV0ZUxpc3QgPSBnZXRLZXlBdHRyaWJ1dGVzRnJvbUxpc3QoIGFkZGVkQ21wQXR0cmlidXRlTGlzdCwgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpLmdldFByaW1hcnlLZXkoKSApOwotCQkJCS8vbm93LCBhZGQgdGhlIGtleXMgdG8gdGhlIGxpc3QuCi0JCQkJYWRkS2V5c1RvS2V5QXR0cmlidXRlTGlzdCggYWRkZWRLZXlBdHRyaWJ1dGVMaXN0LCBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgKTsKLQkJCX0vLyBpZgotCQkKLQkJCUxpc3Qgc3VidHJhY3RlZENtcEF0dHJpYnV0ZUxpc3QgPSBnZXRDbXBBdHRyaWJ1dGVzRGVsdGFMaXN0KCBuZXdDbXBBdHRyaWJ1dGVMaXN0LCBjbXBBdHRyaWJ1dGVzTGlzdENPUFkgKTsKLQkJCWlmKCBzdWJ0cmFjdGVkQ21wQXR0cmlidXRlTGlzdCAhPSBudWxsICYmICFzdWJ0cmFjdGVkQ21wQXR0cmlidXRlTGlzdC5pc0VtcHR5KCkgKSB7Ci0JCQkJLy9kZXRlcm1pbmUgaWYgYW55IG9mIHRoZSBzdWJ0cmFjdGVkIGF0dHJpYnV0ZXMgYXJlIGtleXMsIGlmIHNvIGdldCBhIGxpc3Qgb2YgdGhlbS4KLQkJCQlMaXN0IHN1YnRyYWN0ZWRLZXlBdHRyaWJ1dGVMaXN0ID0gZ2V0S2V5QXR0cmlidXRlc0Zyb21MaXN0KCBzdWJ0cmFjdGVkQ21wQXR0cmlidXRlTGlzdCwgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpLmdldFByaW1hcnlLZXkoKSApOwotCQkJCS8vbm93LCBzdWJ0cmFjdCB0aGUga2V5cyBmcm9tIHRoZSBsaXN0LgotCQkJCXJlbW92ZUtleXNGcm9tS2V5QXR0cmlidXRlTGlzdCggc3VidHJhY3RlZEtleUF0dHJpYnV0ZUxpc3QsIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSApOwotCQkJfS8vIGlmCQkKLQkJCi0JCX0vLyBpZgkKLQl9Ly8gcGVyZm9ybUtleVN5bmNocm9uaXphdGlvbgotCi0JLyoqCi0JICogUmVtb3ZlIGEgYnVuY2ggb2Yga2V5cyBmcm9tIHRoZSBjdXJyZW50IGtleSBhdHRyaWJ1dGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gTGlzdCBzdWJ0cmFjdGVkS2V5QXR0cmlidXRlTGlzdCAtIFRoZSBsaXN0IG9mIGtleXMgdG8gc3VidHJhY3QgZnJvbSB0aGUga2V5IGF0dHJpYnV0ZXMgbGlzdC4KLQkgKiBAcGFyYW0gQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgLSBUaGUgY3VycmVudCBjb250YWluZXIgbWFuYWdlZCBlbnRpdHkuCi0JICovCi0JIAotCSAvKgotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVLZXlzRnJvbUtleUF0dHJpYnV0ZUxpc3QoIExpc3Qgc3VidHJhY3RlZEtleUF0dHJpYnV0ZUxpc3QsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wICkgewotCQlpZiggc3VidHJhY3RlZEtleUF0dHJpYnV0ZUxpc3QgIT0gbnVsbCAmJiAhc3VidHJhY3RlZEtleUF0dHJpYnV0ZUxpc3QuaXNFbXB0eSgpICkgewotCQkJLy9TdWJ0cmFjdCB0aGUga2V5IGF0dHJpYnV0ZXMgZnJvbSB0aGUgY29udGFpbmVyIG1hbmFnZWQgZW50aXR5Ci0JCQlJdGVyYXRvciBrbGkgPSBzdWJ0cmFjdGVkS2V5QXR0cmlidXRlTGlzdC5pdGVyYXRvcigpOwotCQkKLQkJCXdoaWxlKCBrbGkuaGFzTmV4dCgpICkgewotCQkJCUNNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKWtsaS5uZXh0KCk7Ci0JCQkJU3RyaW5nIGNtcEF0dHJpYnV0ZU5hbWUgPSBjbXBBdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJCWlmKCBjbXBBdHRyaWJ1dGVOYW1lICE9IG51bGwgKSB7Ci0JCQkJCWlmKCBjbXAgIT0gbnVsbCAmJiBjbXAuZ2V0S2V5QXR0cmlidXRlcygpICE9IG51bGwgKSB7Ci0JCQkJCQlMaXN0IGtleUF0dHJpYnV0ZUxpc3QgPSBjbXAuZ2V0S2V5QXR0cmlidXRlcygpOwotCQkJCQkJa2V5QXR0cmlidXRlTGlzdC5yZW1vdmUoIGNtcEF0dHJpYnV0ZSApOwotCQkJCQl9Ly8gaWYKLQkJCQl9Ly8gaWYKLQkJCX0vLyB3aGlsZQotCQl9Ly8gaWYKLQl9Ly8gcGVyZm9ybUtleVN5bmNocm9uaXphdGlvbgotCi0JLyoqCi0JICogQWRkcyBhIGJ1bmNoIG9mIGtleXMgdG8gdGhlIGN1cnJlbnQga2V5IGF0dHJpYnV0ZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBMaXN0IGFkZGVkQ21wQXR0cmlidXRlTGlzdCAtIFRoZSBsaXN0IG9mIGtleXMgdG8gYWRkIHRvIHRoZSBrZXkgYXR0cmlidXRlcyBsaXN0LgotCSAqIEBwYXJhbSBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCAtIFRoZSBjdXJyZW50IGNvbnRhaW5lciBtYW5hZ2VkIGVudGl0eS4KLQkgKi8KLQkgCi0JIC8qCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEtleXNUb0tleUF0dHJpYnV0ZUxpc3QoIExpc3QgYWRkZWRLZXlBdHRyaWJ1dGVMaXN0LCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCApIHsKLQkJaWYoIGFkZGVkS2V5QXR0cmlidXRlTGlzdCAhPSBudWxsICYmICFhZGRlZEtleUF0dHJpYnV0ZUxpc3QuaXNFbXB0eSgpICkgewotCQkJLy9BZGQgdGhlIGtleSBhdHRyaWJ1dGVzIHRvIHRoZSBjb250YWluZXIgbWFuYWdlZCBlbnRpdHkKLQkJCUl0ZXJhdG9yIGtsaSA9IGFkZGVkS2V5QXR0cmlidXRlTGlzdC5pdGVyYXRvcigpOwotCQkKLQkJCXdoaWxlKCBrbGkuaGFzTmV4dCgpICkgewotCQkJCUNNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKWtsaS5uZXh0KCk7Ci0JCQkJU3RyaW5nIGNtcEF0dHJpYnV0ZU5hbWUgPSBjbXBBdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJCWlmKCBjbXBBdHRyaWJ1dGVOYW1lICE9IG51bGwgKSB7Ci0JCQkJCWlmKCBjbXAgIT0gbnVsbCAmJiBjbXAuZ2V0S2V5QXR0cmlidXRlcygpICE9IG51bGwgKQotCQkJCQkJY21wLmFkZEtleUF0dHJpYnV0ZU5hbWUoIGNtcEF0dHJpYnV0ZU5hbWUgKTsKLQkJCQl9Ly8gaWYKLQkJCX0vLyB3aGlsZQotCQl9Ly8gaWYKLQl9Ly8gYWRkS2V5c1RvS2V5QXR0cmlidXRlTGlzdAotCi0JLyoqCi0JICogR2V0cyB0aGUga2V5IGF0dHJpYnV0ZXMgY29udGFpbmVkIGluIHRoZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBMaXN0IGF0dHJpYnV0ZUxpc3QgLSBMaXN0IG9mIGF0dHJpYnV0ZXMuCi0JICogQHBhcmFtIEphdmFDbGFzcyBwcmltYXJ5S2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBjbXAuCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JIAotCSAvKgotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRLZXlBdHRyaWJ1dGVzRnJvbUxpc3QoICBMaXN0IGF0dHJpYnV0ZUxpc3QsIEphdmFDbGFzcyBwcmltYXJ5S2V5ICkgewotCQlpZiAocHJpbWFyeUtleSA9PSBudWxsIHx8IGF0dHJpYnV0ZUxpc3QgPT0gbnVsbCB8fCBhdHRyaWJ1dGVMaXN0LmlzRW1wdHkoKSkgCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCi0JCUxpc3QgZm91bmRLZXlBdHRyaWJ1dGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZUxpc3QuaXRlcmF0b3IoKTsJCQotCQl3aGlsZSggaXQuaGFzTmV4dCgpICkgewkKLQkJCUNNUEF0dHJpYnV0ZSBjbXBBdHRyID0gKENNUEF0dHJpYnV0ZSlpdC5uZXh0KCk7CQkJCi0JCQlpZiggY21wQXR0ciAhPSBudWxsICkgewotCQkJCVN0cmluZyBjbXBBdHRyaWJ1dGVOYW1lID0gY21wQXR0ci5nZXROYW1lKCk7Ci0JCQkJaWYgKGNtcEF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgewkJCQotCQkJCQlGaWVsZCBrZXlGaWVsZCA9IHByaW1hcnlLZXkuZ2V0RmllbGQoY21wQXR0cmlidXRlTmFtZSk7CQotCQkJCQlpZiAoa2V5RmllbGQgIT0gbnVsbCkgCQkJCQotCQkJCQkJZm91bmRLZXlBdHRyaWJ1dGVMaXN0LmFkZChjbXBBdHRyKTsKLQkJCQl9Ly8gaWYKLQkJCX0gLy9pZgotCQl9Ly8gd2hpbGUJCi0JCXJldHVybiBmb3VuZEtleUF0dHJpYnV0ZUxpc3Q7Ci0JfS8vIGdldEtleUF0dHJpYnV0ZXNGcm9tTGlzdAotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVsdGEgZWxlbWVudHMgb2YgdHdvIGxpc3RzCi0JICogCi0JICogQHBhcmFtIExpc3QgZmlyc3RMaXN0IC0gVGhlIGxpc3QgdGhhdCBpcyBiZWluZyBjb21wYXJlZCB0b28uCi0JICogQHBhcmFtIExpc3Qgc2Vjb25kTGlzdCAtIFRoZSBsaXN0IHRvIGNoZWNrIHRoZSBkaWZmZXJlbmNlIG9mLgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCSAKLQkgLyoKLQlwcm90ZWN0ZWQgTGlzdCBnZXRDbXBBdHRyaWJ1dGVzRGVsdGFMaXN0KCBMaXN0IGZpcnN0TGlzdCwgTGlzdCBzZWNvbmRMaXN0ICkgewotCQlMaXN0IGRpZmZBdHRyaWJ1dGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQlpZiggZmlyc3RMaXN0ICE9IG51bGwgJiYgc2Vjb25kTGlzdCAhPSBudWxsICkgewotCQkJSXRlcmF0b3IgaXQgPSBzZWNvbmRMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSggaXQuaGFzTmV4dCgpICkgewotCQkJCUNNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKWl0Lm5leHQoKTsKLQkJCQlpZiggY21wQXR0cmlidXRlICE9IG51bGwgJiYgIWZpcnN0TGlzdC5jb250YWlucyggY21wQXR0cmlidXRlICkgKSB7Ci0JCQkJCWRpZmZBdHRyaWJ1dGVMaXN0LmFkZCggY21wQXR0cmlidXRlICk7Ci0JCQkJfS8vIGlmCi0JCQl9Ly8gd2hpbGUKLQkJCXJldHVybiBkaWZmQXR0cmlidXRlTGlzdDsKLQkJfS8vIGlmCQotCQlyZXR1cm4gamF2YS51dGlsLkNvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfS8vIGdldENtcEF0dHJpYnV0ZXNEZWx0YUxpc3QKLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRlByaW1LZXlGaWVsZEZlYXR1cmUoTWFwSW5mbyBtYXAsIE5vZGUgbm9kZSwgYm9vbGVhbiBmb3JjZSkgewotCQlSZXNvdXJjZSByZXMgPSBnZXRFT2JqZWN0KCkuZVJlc291cmNlKCk7Ci0JCWJvb2xlYW4gbW9kRmxhZyA9IHJlcyA9PSBudWxsID8gZmFsc2UgOiByZXMuaXNNb2RpZmllZCgpOwotCQlTdHJpbmcga2V5RmllbGQgPSBnZXRET01UZXh0KG1hcCwgbm9kZSk7Ci0JCS8vRGV0ZXJtaW5lIGlmIHRoZSBwcmltLWtleSBmaWVsZCBoYXMgY2hhbmdlZC4gIElmIHNvLCB0aGVuIHJlY29tcHV0ZSB0aGUga2V5czsgb3RoZXJ3aXNlIGxlYXZlIAotCQkvL2l0IGFsb25lCi0JCWlmIChrZXlGaWVsZCAhPSBudWxsKQotCQkJa2V5RmllbGQgPSBrZXlGaWVsZC50cmltKCk7Ci0JCUNNUEF0dHJpYnV0ZSBleGlzdGluZ0tleUF0dCA9IGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQcmltYXJ5S2V5QXR0cmlidXRlKCk7Ci0JCVN0cmluZyBleGlzdGluZ0tleUZpZWxkID0gZXhpc3RpbmdLZXlBdHQgPT0gbnVsbCA/IG51bGwgOiBleGlzdGluZ0tleUF0dC5nZXROYW1lKCk7Ci0JCWlmICghZm9yY2UgCi0JCQkmJiAoKGtleUZpZWxkID09IG51bGwgJiYgZXhpc3RpbmdLZXlGaWVsZCA9PSBudWxsKSAKLQkJCQl8fCAoa2V5RmllbGQgIT0gbnVsbCAmJiBrZXlGaWVsZC5lcXVhbHMoZXhpc3RpbmdLZXlGaWVsZCkpCi0JCQkJfHwgKGV4aXN0aW5nS2V5RmllbGQgIT0gbnVsbCAmJiBleGlzdGluZ0tleUZpZWxkLmVxdWFscyhrZXlGaWVsZCkpKSkKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuY2xlYXJLZXlBdHRyaWJ1dGVzKCk7IC8vbmVjZXNzYXJ5IHRvIGNsZWFyIHJlZmxlY3RlZCBmbGFnCi0JCQlDTVBBdHRyaWJ1dGUga2V5QXR0ID0gbnVsbDsKLQkJCUNNUFNwZWNBZGFwdGVyLnNldFByaW1LZXlGaWVsZEZyb21YbWwoa2V5RmllbGQsIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSk7Ci0JCQlpZiAoa2V5RmllbGQgIT0gbnVsbCkgewotCQkJCWtleUF0dCA9IGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5hZGRLZXlBdHRyaWJ1dGVOYW1lKGtleUZpZWxkLCBmYWxzZSk7Ci0JCQkJaWYgKGtleUF0dCAhPSBudWxsKSB7Ci0JCQkJCS8vVGhpcyBpcyBhbiBpbnZhbGlkIHN0YXRlLgotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpLmdldFByaW1hcnlLZXlOYW1lKCk7Ci0JCQkJCUphdmFDbGFzcyByZWYgPSBudWxsOwotCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpCi0JCQkJCQlyZWYgPSBKYXZhQ2xhc3NJbXBsLmNyZWF0ZUNsYXNzUmVmKGNsYXNzTmFtZSk7Ci0JCQkJCWtleUF0dC5zZXRFVHlwZShyZWYpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy9IYWNrIHRvIGZvcmNlIHRoZSBVSSB0byByZWZyZXNoCi0JCQkJRUxpc3Qga2V5cyA9IGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRLZXlBdHRyaWJ1dGVzKCk7Ci0JCQkJaWYgKCFrZXlzLmlzRW1wdHkoKSkKLQkJCQkJa2V5cy5zZXQoMCwga2V5cy5nZXQoMCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5pc1RyYWNraW5nTW9kaWZpY2F0aW9uKCkpCi0JCQkJcmVzLnNldE1vZGlmaWVkKG1vZEZsYWcpOwotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbEtleUZpZWxkKE1hcEluZm8gbWFwLCBOb2RlIG5vZGUpIHsKLQkJU3RyaW5nIGtleUZpZWxkID0gZ2V0RE9NVGV4dChtYXAsIG5vZGUpOwotCQlDTVBTcGVjQWRhcHRlci5zZXRQcmltS2V5RmllbGRGcm9tWG1sKGtleUZpZWxkLCBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpOwotCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgQWJzdHJhY3RET01Ob2RlQWRhcHRlciNnZXRNT0ZDaGlsZHJlbihFT2JqZWN0LCBNYXBJbmZvKQotCQkgKi8KLQkJIC8qCi0JCXByb3RlY3RlZCBMaXN0IGdldE1PRkNoaWxkcmVuKEVPYmplY3QgbW9mT2JqZWN0LCBNYXBJbmZvIG1hcCkgewotCQkJaWYgKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5pc1ZlcnNpb24yX1goKSAmJiBDTVBfRklFTEQuZXF1YWxzKG1hcC5nZXRET01OYW1lKCkpKQotCQkJCXJldHVybiBnZXQyMENNUEF0dHJpYnV0ZXMoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpbW9mT2JqZWN0KTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0TU9GQ2hpbGRyZW4obW9mT2JqZWN0LCBtYXApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIE1ldGhvZCBnZXQyMENNUEF0dHJpYnV0ZXMuCi0JCSAqIEBwYXJhbSBjb250YWluZXJNYW5hZ2VkRW50aXR5Ci0JCSAqIEByZXR1cm4gTGlzdAotCQkgKi8KLQkJIAotCQkgLyoKLQkJcHJpdmF0ZSBMaXN0IGdldDIwQ01QQXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQkJTGlzdCBhbGxBdHRyaWJ1dGVzLCByZW1vdmVkLCByZXN1bHQ7Ci0JCQlyZW1vdmVkID0gbnVsbDsKLQkJCWFsbEF0dHJpYnV0ZXMgPSBjbXAuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQkJCWludCBzaXplID0gYWxsQXR0cmlidXRlcy5zaXplKCk7Ci0JCQlDTVBBdHRyaWJ1dGUgYXR0ID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJYXR0ID0gKENNUEF0dHJpYnV0ZSkgYWxsQXR0cmlidXRlcy5nZXQoaSk7Ci0JCQkJaWYgKGF0dC5pc0Rlcml2ZWQoKSkgewotCQkJCQlpZiAocmVtb3ZlZCA9PSBudWxsKQotCQkJCQkJcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJcmVtb3ZlZC5hZGQoYXR0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVtb3ZlZCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJCQlyZXN1bHQuYWRkQWxsKGFsbEF0dHJpYnV0ZXMpOwotCQkJCXJlc3VsdC5yZW1vdmVBbGwocmVtb3ZlZCk7Ci0JCQl9IGVsc2UKLQkJCQlyZXN1bHQgPSBhbGxBdHRyaWJ1dGVzOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBjb20uaWJtLmV0b29scy5tb2YyZG9tLkFic3RyYWN0RE9NTm9kZUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClOb3RpZmllciwgaW50LChFU3RydWN0dXJhbEZlYXR1cmUpIEVPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBpbnQpKQotCQkgKi8KLQkJIAotCQkgLyoKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IENvbnRhaW5lck1hbmFnZWRFbnRpdHkuREVSSVZFRF9GTEFHX0NIQU5HRSkKLQkJCQl1cGRhdGVET01GZWF0dXJlKGdldE1hcChDTVBfRklFTEQpLCBnZXROb2RlKCksIGdldEVPYmplY3QoKSk7Ci0JCQllbHNlCi0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0KLQkJcHJpdmF0ZSBNYXBJbmZvIGdldE1hcChTdHJpbmcgYU5vZGVOYW1lKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZNYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGFOb2RlTmFtZS5lcXVhbHMoZk1hcHNbaV0uZ2V0RE9NTmFtZSgpKSkKLQkJCQkJcmV0dXJuIGZNYXBzW2ldOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJKi8KLQl9Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRUpCSmFyVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRUpCSmFyVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWFmZDUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VKQkphclRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uSmF2YUNsYXNzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5HZW5lcmljVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JRFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUm9vdFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuU291cmNlTGlua1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUGF0aDsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJKYXJUcmFuc2xhdG9yIGV4dGVuZHMgUm9vdFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckksIEoyRUVDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCXByaXZhdGUgc3RhdGljIENvbW1vblBhY2thZ2UgQ09NTU9OX1BLRyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCXB1YmxpYyBzdGF0aWMgRUpCSmFyVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBFSkJKYXJUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTM7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTQ7Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3JQYXRoIEVOVEVSUFJJU0VfQkVBTl9OQU1FX1RSQU5TTEFUT1JfUEFUSCA9Ci0JCQluZXcgVHJhbnNsYXRvclBhdGgoCi0JCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJCW5ldyBUcmFuc2xhdG9yKEVKQl9KQVIsIFJPT1RfRkVBVFVSRSksCi0JCQkJCW5ldyBUcmFuc2xhdG9yKEVudGVycHJpc2VCZWFuc1RyYW5zbGF0b3IuRU5URVJQUklTRV9CRUFOU19QQVRILCBFSkJfUEtHLmdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKSksCi0JCQkJCW5ldyBUcmFuc2xhdG9yKEVKQl9OQU1FLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX05hbWUoKSl9KTsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBDTVJfRklFTERfTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoQ01SX0ZJRUxEX05BTUUsIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgQ01SX0ZJRUxEX1RZUEVfVFJBTlNMQVRPUiA9IG5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKENNUl9GSUVMRF9UWVBFLCBFSkJfUEtHLmdldENNUkZpZWxkX0NvbGxlY3Rpb25UeXBlKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUk9MRV9TT1VSQ0VfRUpCX05BTUVfU09VUkNFTElOS19UUkFOU0xBVE9SID0gbmV3IFNvdXJjZUxpbmtUcmFuc2xhdG9yKEVKQl9OQU1FLCBFSkJfUEtHLmdldFJvbGVTb3VyY2VfRW50aXR5QmVhbigpLCBFTlRFUlBSSVNFX0JFQU5fTkFNRV9UUkFOU0xBVE9SX1BBVEgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKEVKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FLCBFSkJfUEtHLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUm9sZU5hbWUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBNVUxUSVBMSUNJVFlfVFJBTlNMQVRPUiA9IG5ldyBNdWx0aXBsaWNpdHlUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBDQVNDQURFX0RFTEVURV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoQ0FTQ0FERV9ERUxFVEUsIEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DYXNjYWRlRGVsZXRlKCksIFRyYW5zbGF0b3IuRU1QVFlfVEFHKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEVKQl9SRUxBVElPTl9OQU1FX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihFSkJfUkVMQVRJT05fTkFNRSwgRUpCX1BLRy5nZXRFSkJSZWxhdGlvbl9OYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgVU5DSEVDS0VEX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihVTkNIRUNLRUQsIEVKQl9QS0cuZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKSwgVHJhbnNsYXRvci5FTVBUWV9UQUcpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgTUVUSE9EX1BFUk1JU1NJT05fUk9MRV9OQU1FX1NPVVJDRUxJTktfVFJBTlNMQVRPUiA9IG5ldyBTb3VyY2VMaW5rVHJhbnNsYXRvcihST0xFX05BTUUsRUpCX1BLRy5nZXRNZXRob2RQZXJtaXNzaW9uX1JvbGVzKCksbmV3IFRyYW5zbGF0b3JQYXRoKAotCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKEFTU0VNQkxZX0RFU0NSSVBUT1IsIENPTlRBSU5FUl9GRUFUVVJFKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNFQ1VSSVRZX1JPTEUsIEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihST0xFX05BTUUsIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpKQotCQl9KSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBTRUNfUk9MRV9OQU1FX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihST0xFX05BTUUsIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpLAluZXcgVHJhbnNsYXRvclBhdGgoCi0JCW5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoQVNTRU1CTFlfREVTQ1JJUFRPUiwgQ09OVEFJTkVSX0ZFQVRVUkUpLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVUSE9EX1BFUk1JU1NJT04sIEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU0VDVVJJVFlfUk9MRSwgRUpCX1BLRy5nZXRNZXRob2RQZXJtaXNzaW9uX1JvbGVzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUk9MRV9OQU1FLCBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKSkKLQkJfSkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgVFJBTlNfQVRUUklCVVRFX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihUUkFOU19BVFRSSUJVVEUsIEVKQl9QS0cuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fVHJhbnNhY3Rpb25BdHRyaWJ1dGUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBNRVRIT0RfRUxFTUVOVF9FSkJfTkFNRV9TT1VSQ0VMSU5LX1RSQU5TTEFUT1IgPSBuZXcgU291cmNlTGlua1RyYW5zbGF0b3IoRUpCX05BTUUsIEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9FbnRlcnByaXNlQmVhbigpLCBFSkJKYXJUcmFuc2xhdG9yLkVOVEVSUFJJU0VfQkVBTl9OQU1FX1RSQU5TTEFUT1JfUEFUSCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBNRVRIT0RfTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoTUVUSE9EX05BTUUsIEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9OYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgTUVUSE9EX1BBUkFNX1RSQU5TTEFUT1IgPSBuZXcgTWV0aG9kUGFyYW1zVHJhbnNsYXRvcihFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfUGFybXMoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBNRVRIT0RfRUxFTUVOVF9LSU5EX1RSQU5TTEFUT1IgPSBuZXcgTWV0aG9kRWxlbWVudEtpbmRUcmFuc2xhdG9yKCk7Ci0JCi0JcHVibGljIEVKQkphclRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEVKQl9KQVIsIEVKQl9QS0cuZ2V0RUpCSmFyKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMyA9PSBudWxsKQotCQkJCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjEzOwkKLQkJCWRlZmF1bHQgOgotCQkJCWlmIChjaGlsZHJlbjE0ID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTQgPSBjcmVhdGUxNENoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTQ7IAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxM0NoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSksCi0JCQluZXcgRW50ZXJwcmlzZUJlYW5zVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUmVsYXRpb25zaGlwc1RyYW5zbGF0b3IxMygpLAotCQkJY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yVHJhbnNsYXRvcjEzKCksCi0JCQluZXcgVHJhbnNsYXRvcihFSkJfQ0xJRU5UX0pBUiwgRUpCX1BLRy5nZXRFSkJKYXJfRWpiQ2xpZW50SmFyKCkpLAotCQl9OwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTRDaGlsZHJlbigpIHsKLQkJcmV0dXJuCW5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoVkVSU0lPTiwgRUpCX1BLRy5nZXRFSkJKYXJfVmVyc2lvbigpLCBET01fQVRUUklCVVRFKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TLCBKMkVFX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OU19YU0ksIFhTSV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYU0lfU0NIRU1BX0xPQ0FUSU9OLCBKMkVFX05TX1VSTCsnICcrRUpCX0pBUl9TQ0hFTUFfTE9DXzJfMSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBFbnRlcnByaXNlQmVhbnNUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVSZWxhdGlvbnNoaXBzVHJhbnNsYXRvcjE0KCksCi0JCQljcmVhdGVBc3NlbWJseURlc2NyaXB0b3JUcmFuc2xhdG9yMTQoKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEVKQl9DTElFTlRfSkFSLCBFSkJfUEtHLmdldEVKQkphcl9FamJDbGllbnRKYXIoKSksCi0JCS8vCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0RUpCSmFyX0V4dGVuc2lvbnMoKSkKLQkJfTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUmVsYXRpb25zaGlwc1RyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFTEFUSU9OU0hJUFMsIEVKQl9QS0cuZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcExpc3QoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgRUpCX1BLRy5nZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9uKCkpLAotCQkJCWNyZWF0ZUVKQlJlbGF0aW9uc1RyYW5zbGF0b3IxMygpLAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUVKQlJlbGF0aW9uc1RyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEVKQl9SRUxBVElPTiwgRUpCX1BLRy5nZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBFSkJfUEtHLmdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9uKCkpLAotCQkJCUVKQl9SRUxBVElPTl9OQU1FX1RSQU5TTEFUT1IsCi0JCQkJY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZVRyYW5zbGF0b3IxMygpLAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGVUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihFSkJfUkVMQVRJT05TSElQX1JPTEUsIEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgRUpCX1BLRy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9uKCkpLAotCQkJCUVKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FX1RSQU5TTEFUT1IsCi0JCQkJTVVMVElQTElDSVRZX1RSQU5TTEFUT1IsCi0JCQkJQ0FTQ0FERV9ERUxFVEVfVFJBTlNMQVRPUiwKLQkJCQljcmVhdGVSZWxhdGlvbnNoaXBSb2xlU291cmNlVHJhbnNsYXRvcjEzKCksCi0JCQkJY3JlYXRlQ01SRmllbGRUcmFuc2xhdG9yMTMoKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVSZWxhdGlvbnNoaXBSb2xlU291cmNlVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUkVMQVRJT05TSElQX1JPTEVfU09VUkNFLCBFSkJfUEtHLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfU291cmNlKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIEVKQl9QS0cuZ2V0Um9sZVNvdXJjZV9EZXNjcmlwdGlvbigpKSwKLQkJCQlST0xFX1NPVVJDRV9FSkJfTkFNRV9TT1VSQ0VMSU5LX1RSQU5TTEFUT1IsCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlQ01SRmllbGRUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihDTVJfRklFTEQsIEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBFSkJfUEtHLmdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbigpKSwKLQkJCQlDTVJfRklFTERfTkFNRV9UUkFOU0xBVE9SLAotCQkJCUNNUl9GSUVMRF9UWVBFX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBKMkVFIDEuNCBSZWxhdGlvbnNoaXAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUmVsYXRpb25zaGlwc1RyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFTEFUSU9OU0hJUFMsIEVKQl9QS0cuZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcExpc3QoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9ucygpKSwKLQkJCQljcmVhdGVFSkJSZWxhdGlvbnNUcmFuc2xhdG9yMTQoKSwKLQkJLy8JCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0UmVsYXRpb25zaGlwc19FeHRlbnNpb25zKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCUmVsYXRpb25zVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRUpCX1JFTEFUSU9OLCBFSkJfUEtHLmdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25fRGVzY3JpcHRpb25zKCkpLAotCQkJCUVKQl9SRUxBVElPTl9OQU1FX1RSQU5TTEFUT1IsCi0JCQkJY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZVRyYW5zbGF0b3IxNCgpLAotCQkvLwkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRFSkJSZWxhdGlvbl9FeHRlbnNpb25zKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZVRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEVKQl9SRUxBVElPTlNISVBfUk9MRSwgRUpCX1BLRy5nZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBSb2xlcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb25zKCkpLAotCQkJCUVKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FX1RSQU5TTEFUT1IsCi0JCQkJTVVMVElQTElDSVRZX1RSQU5TTEFUT1IsCi0JCQkJQ0FTQ0FERV9ERUxFVEVfVFJBTlNMQVRPUiwKLQkJCQljcmVhdGVSZWxhdGlvbnNoaXBSb2xlU291cmNlVHJhbnNsYXRvcjE0KCksCi0JCQkJY3JlYXRlQ01SRmllbGRUcmFuc2xhdG9yMTQoKSwKLQkJLy8JCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9FeHRlbnNpb25zKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRSwgRUpCX1BLRy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1NvdXJjZSgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldFJvbGVTb3VyY2VfRGVzY3JpcHRpb25zKCkpLAotCQkJCVJPTEVfU09VUkNFX0VKQl9OQU1FX1NPVVJDRUxJTktfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUNNUkZpZWxkVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ01SX0ZJRUxELCBFSkJfUEtHLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb25zKCkpLAotCQkJCUNNUl9GSUVMRF9OQU1FX1RSQU5TTEFUT1IsCi0JCQkJQ01SX0ZJRUxEX1RZUEVfVFJBTlNMQVRPUiwKLQkJLy8JCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0Q01QQXR0cmlidXRlX0V4dGVuc2lvbnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiA8PSBKMkVFIDEuMyBBc3NlbWJseSBEZXNjcmlwdG9yIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3JUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihBU1NFTUJMWV9ERVNDUklQVE9SLCBFSkJfUEtHLmdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQljcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTMoKSwKLQkJCQljcmVhdGVNZXRob2RQZXJtaXNzaW9uVHJhbnNsYXRvcjEzKCksCi0JCQkJY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb25UcmFuc2xhdG9yMTMoKSwKLQkJCQljcmVhdGVFeGNsdWRlc0xpc3RUcmFuc2xhdG9yMTMoKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb25UcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNRVRIT0RfUEVSTUlTU0lPTiwgRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgRUpCX1BLRy5nZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCkpLAotCQkJCVVOQ0hFQ0tFRF9UUkFOU0xBVE9SLAotCQkJCU1FVEhPRF9QRVJNSVNTSU9OX1JPTEVfTkFNRV9TT1VSQ0VMSU5LX1RSQU5TTEFUT1IsCi0JCQkJY3JlYXRlTWV0aG9kRWxlbWVudFRyYW5zbGF0b3JzMTMoRUpCX1BLRy5nZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZEVsZW1lbnRzKCkpCi0JCX0pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy9UT0RPOiBORUVEIFRPIEZJR1VSRSBPVVQgU0VDVVJJVFkgUEFUSAkJCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlY3VyaXR5Um9sZVRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFQ1VSSVRZX1JPTEUsIEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX1NlY3VyaXR5Um9sZXMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9uKCkpLAotCQkJCVNFQ19ST0xFX05BTUVfVFJBTlNMQVRPUgotCQkJfSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb25UcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihDT05UQUlORVJfVFJBTlNBQ1RJT04sIEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFRyYW5zYWN0aW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBFSkJfUEtHLmdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9uKCkpLAotCQkJCWNyZWF0ZU1ldGhvZEVsZW1lbnRUcmFuc2xhdG9yczEzKEVKQl9QS0cuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKSksCi0JCQkJVFJBTlNfQVRUUklCVVRFX1RSQU5TTEFUT1IKLQkJfSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRXhjbHVkZXNMaXN0VHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRVhDTFVERV9MSVNULCBFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAluZXcgVHJhbnNsYXRvcltdIHsgCi0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsIAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIEVKQl9QS0cuZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb24oKSksIAotCQkJY3JlYXRlTWV0aG9kRWxlbWVudFRyYW5zbGF0b3JzMTMoRUpCX1BLRy5nZXRFeGNsdWRlTGlzdF9NZXRob2RFbGVtZW50cygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTWV0aG9kRWxlbWVudFRyYW5zbGF0b3JzMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNRVRIT0QsIGVGZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb24oKSksCi0JCQkJTUVUSE9EX0VMRU1FTlRfRUpCX05BTUVfU09VUkNFTElOS19UUkFOU0xBVE9SLAotCQkJCU1FVEhPRF9FTEVNRU5UX0tJTkRfVFJBTlNMQVRPUiwKLQkJCQlNRVRIT0RfTkFNRV9UUkFOU0xBVE9SLAotCQkJCU1FVEhPRF9QQVJBTV9UUkFOU0xBVE9SCi0JCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JCi0JLyoKLQkgKiBKMkVFIDEuNCBBc3NlbWJseSBEZXNjcmlwdG9yIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3JUcmFuc2xhdG9yMTQoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihBU1NFTUJMWV9ERVNDUklQVE9SLCBFSkJfUEtHLmdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQljcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTQoKSwKLQkJCQljcmVhdGVNZXRob2RQZXJtaXNzaW9uVHJhbnNsYXRvcjE0KCksCi0JCQkJY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb25UcmFuc2xhdG9yMTQoKSwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSksCi0JCQkJY3JlYXRlRXhjbHVkZXNMaXN0VHJhbnNsYXRvcjE0KCksCi0JCS8vCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeHRlbnNpb25zKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVNZXRob2RQZXJtaXNzaW9uVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVUSE9EX1BFUk1JU1NJT04sIEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKSksCi0JCQkJVU5DSEVDS0VEX1RSQU5TTEFUT1IsCi0JCQkJTUVUSE9EX1BFUk1JU1NJT05fUk9MRV9OQU1FX1NPVVJDRUxJTktfVFJBTlNMQVRPUiwKLQkJCQljcmVhdGVNZXRob2RFbGVtZW50VHJhbnNsYXRvcnMxNChFSkJfUEtHLmdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kRWxlbWVudHMoKSkKLQkJfSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvL1RPRE86IE5FRUQgVE8gRklHVVJFIE9VVCBTRUNVUklUWSBQQVRICQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VjdXJpdHlSb2xlVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VDVVJJVFlfUk9MRSwgRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCkpLAotCQkJCVNFQ19ST0xFX05BTUVfVFJBTlNMQVRPUgotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVNZXRob2RUcmFuc2FjdGlvblRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKENPTlRBSU5FUl9UUkFOU0FDVElPTiwgRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kVHJhbnNhY3Rpb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb25zKCkpLAotCQkJCWNyZWF0ZU1ldGhvZEVsZW1lbnRUcmFuc2xhdG9yczE0KEVKQl9QS0cuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKSksCi0JCQkJVFJBTlNfQVRUUklCVVRFX1RSQU5TTEFUT1IKLQkJfSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRXhjbHVkZXNMaXN0VHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRVhDTFVERV9MSVNULCBFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAluZXcgVHJhbnNsYXRvcltdIHsgCi0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb25zKCkpLCAKLQkJCWNyZWF0ZU1ldGhvZEVsZW1lbnRUcmFuc2xhdG9yczE0KEVKQl9QS0cuZ2V0RXhjbHVkZUxpc3RfTWV0aG9kRWxlbWVudHMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZU1ldGhvZEVsZW1lbnRUcmFuc2xhdG9yczE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVUSE9ELCBlRmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9ucygpKSwKLQkJCQlNRVRIT0RfRUxFTUVOVF9FSkJfTkFNRV9TT1VSQ0VMSU5LX1RSQU5TTEFUT1IsCi0JCQkJTUVUSE9EX0VMRU1FTlRfS0lORF9UUkFOU0xBVE9SLAotCQkJCU1FVEhPRF9OQU1FX1RSQU5TTEFUT1IsCi0JCQkJTUVUSE9EX1BBUkFNX1RSQU5TTEFUT1IKLQkJCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRW50ZXJwcmlzZUJlYW5zVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRW50ZXJwcmlzZUJlYW5zVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmUwM2VjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VudGVycHJpc2VCZWFuc1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5NdWx0aU9iamVjdFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVhZEFoZWFkSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgRW50ZXJwcmlzZUJlYW5zVHJhbnNsYXRvciBleHRlbmRzIE11bHRpT2JqZWN0VHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5URVJQUklTRV9CRUFOU19QQVRIID0gRU5URVJQUklTRV9CRUFOUysnLycrRU5USVRZKycsJytTRVNTSU9OKycsJytNRVNTQUdFX0RSSVZFTjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFamJQYWNrYWdlIEVKQl9QS0cgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHJhbnNsYXRvciBTRVNTSU9OX1RSQU5TTEFUT1IgPSBuZXcgU2Vzc2lvblRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnRpdHlUcmFuc2xhdG9yIEJNUF9UUkFOU0xBVE9SID0gbmV3IEVudGl0eVRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb250YWluZXJNYW5hZ2VkRW50aXR5VHJhbnNsYXRvciBDTVBfVFJBTlNMQVRPUj0gbmV3IENvbnRhaW5lck1hbmFnZWRFbnRpdHlUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVzc2FnZURyaXZlblRyYW5zbGF0b3IgTUVTU0FHRV9EUklWRU5fVFJBTlNMQVRPUiA9IG5ldyBNZXNzYWdlRHJpdmVuVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIE1hcCBkZWxlZ2F0ZXM7Ci0Jc3RhdGljIHsKLQkJZGVsZWdhdGVzID0gbmV3IEhhc2hNYXAoNyk7Ci0JCWRlbGVnYXRlcy5wdXQoU0VTU0lPTiwgU0VTU0lPTl9UUkFOU0xBVE9SKTsKLQkJZGVsZWdhdGVzLnB1dChCRUFOLCBCTVBfVFJBTlNMQVRPUik7Ci0JCWRlbGVnYXRlcy5wdXQoQ09OVEFJTkVSLCBDTVBfVFJBTlNMQVRPUik7Ci0JCWRlbGVnYXRlcy5wdXQoTUVTU0FHRV9EUklWRU4sIE1FU1NBR0VfRFJJVkVOX1RSQU5TTEFUT1IpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICovCi0JcHVibGljIEVudGVycHJpc2VCZWFuc1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEVOVEVSUFJJU0VfQkVBTlNfUEFUSCwgRUpCX1BLRy5nZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCkpOwotCQlhZGRSZWFkQWhlYWRIZWxwZXIobmV3IFJlYWRBaGVhZEhlbHBlcihFTlRJVFksIG5ldyBTdHJpbmdbXSB7QkVBTiwgQ09OVEFJTkVSfSwgUEVSU0lTVEVOQ0VfVFlQRSApKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLk11bHRpT2JqZWN0VHJhbnNsYXRvciNnZXREZWxlZ2F0ZUZvcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXREZWxlZ2F0ZUZvcihFT2JqZWN0IG8pIHsKLQkJc3dpdGNoIChvLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTiA6Ci0JCQkJcmV0dXJuIFNFU1NJT05fVFJBTlNMQVRPUjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFk6Ci0JCQkJcmV0dXJuIEJNUF9UUkFOU0xBVE9SOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWToKLQkJCQlyZXR1cm4gQ01QX1RSQU5TTEFUT1I7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU46Ci0JCQkJcmV0dXJuIE1FU1NBR0VfRFJJVkVOX1RSQU5TTEFUT1I7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQmVhbiB0eXBlIGRlbGVnYXRlIGV4cGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXREZWxlZ2F0ZUZvcihTdHJpbmcgZG9tTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJVHJhbnNsYXRvciByZXN1bHQgPSBudWxsOwotCQlpZiAocmVhZEFoZWFkTmFtZSAhPSBudWxsKQotCQkJcmVzdWx0ID0gKFRyYW5zbGF0b3IpIGRlbGVnYXRlcy5nZXQocmVhZEFoZWFkTmFtZSk7Ci0JCWVsc2UgCi0JCQlyZXN1bHQgPSAoVHJhbnNsYXRvcikgZGVsZWdhdGVzLmdldChkb21OYW1lKTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FbnRpdHlUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FbnRpdHlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDVhYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRW50aXR5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Cb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5KYXZhQ2xhc3NUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5VHJhbnNsYXRvciBleHRlbmRzIEFic3RyYWN0RUpCVHJhbnNsYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMzsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xNDsKLQotCXByaXZhdGUgY2xhc3MgUGVyc2lzdGVuY2VUeXBlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0JCXB1YmxpYyBQZXJzaXN0ZW5jZVR5cGVUcmFuc2xhdG9yKCkgewotCQkJc3VwZXIoUEVSU0lTVEVOQ0VfVFlQRSwgKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgbnVsbCk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZXh0cmFjdFN0cmluZ1ZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBleHRyYWN0U3RyaW5nVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJCSAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0VmFsdWVUb1N0cmluZyhqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkJCSAgICovCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VUeXBlKCk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZDaGlsZHJlbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBMaXN0IGdldE1PRkNoaWxkcmVuKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChnZXRQZXJzaXN0ZW5jZVR5cGUoKSk7Ci0JCX0KLQotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQZXJzaXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiBCRUFOOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgRW50aXR5VHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoRU5URVJQUklTRV9CRUFOUyArICcvJyArIEVOVElUWSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIuQWJzdHJhY3RFSkJUcmFuc2xhdG9yI2dldFNwZWNpZmljTWFwcygpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMoaW50IHZlcnNpb25JRCkgewotCQlUcmFuc2xhdG9yIHJlZW50cmFudFRyYW5zbGF0b3IgPSBudWxsOwotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSBKMkVFXzFfMl9JRCA6Ci0JCQljYXNlIEoyRUVfMV8zX0lEIDoKLQkJCQlyZWVudHJhbnRUcmFuc2xhdG9yID0gbmV3IFRyYW5zbGF0b3IoUkVFTlRSQU5ULCBFSkJfUEtHLmdldEVudGl0eV9SZWVudHJhbnQoKSwgVU5TRVRfSUZfTlVMTCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEoyRUVfMV80X0lEIDoKLQkJCQlyZWVudHJhbnRUcmFuc2xhdG9yID0gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKFJFRU5UUkFOVCwgRUpCX1BLRy5nZXRFbnRpdHlfUmVlbnRyYW50KCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geyBuZXcgUGVyc2lzdGVuY2VUeXBlVHJhbnNsYXRvcigpLCBuZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihQUklNX0tFWV9DTEFTUywgRUpCX1BLRy5nZXRFbnRpdHlfUHJpbWFyeUtleSgpKSwgcmVlbnRyYW50VHJhbnNsYXRvciB9OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbnRpdHkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJaWYgKGNoaWxkcmVuMTMgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xMyA9IGNyZWF0ZTEzQ2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xMzsKLQkJCWRlZmF1bHQgOgotCQkJCWlmIChjaGlsZHJlbjE0ID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTQgPSBjcmVhdGUxNENoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTQ7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvblR5cGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25UeXBlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQ5MDI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvblR5cGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uVHlwZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0pNUyA9ICJqYXZheC5qbXMuIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKERFU1RJTkFUSU9OX1RZUEUsIEVKQl9QS0cuZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1R5cGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFZhbHVlVG9TdHJpbmcoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpewotCQkJRW51bWVyYXRvciBlbnVtZXJhdG9yID0gKEVudW1lcmF0b3IpIHZhbHVlOwotCQkJaWYgKGVudW1lcmF0b3IgIT0gbnVsbCkKLQkJCQlyZXR1cm4gSkFWQVhfSk1TICsgZW51bWVyYXRvci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VmFsdWVUb1N0cmluZyh2YWx1ZSwgb3duZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJU3RyaW5nIGNvcnJlY3QgPSBzdHJWYWx1ZTsKLQkJaWYgKHN0clZhbHVlICE9IG51bGwpCi0JCQljb3JyZWN0ID0gc3RyVmFsdWUuc3Vic3RyaW5nKEpBVkFYX0pNUy5sZW5ndGgoKSk7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShjb3JyZWN0LCBvd25lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXNzYWdlRHJpdmVuVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWVzc2FnZURyaXZlblRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5Yzc2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXNzYWdlRHJpdmVuVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uSmF2YUNsYXNzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5HZW5lcmljVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURyaXZlblRyYW5zbGF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVKQlRyYW5zbGF0b3IgewotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEzOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjE0OwotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgVFJBTlNBQ1RJT05fVFlQRV9YTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihUUkFOU0FDVElPTl9UWVBFLCBFSkJfUEtHLmdldE1lc3NhZ2VEcml2ZW5fVHJhbnNhY3Rpb25UeXBlKCkpOwotCQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBNZXNzYWdlRHJpdmVuVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoRU5URVJQUklTRV9CRUFOUysnLycrTUVTU0FHRV9EUklWRU4pOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIuQWJzdHJhY3RFSkJUcmFuc2xhdG9yI2dldFNwZWNpZmljTWFwcygpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMoaW50IHZlcnNpb25JRCkgewotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSBKMkVFXzFfNF9JRDoKLQkJCQlyZXR1cm4gZ2V0U3BlY2lmaWNNYXBzMTQoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGdldFNwZWNpZmljTWFwczEzKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMxMygpIHsKLQkKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJVFJBTlNBQ1RJT05fVFlQRV9YTEFUT1IsCi0JCQkKLQkJCS8vRUpCIDIuMCBQQVRICi0JCQluZXcgVHJhbnNsYXRvcihNRVNTQUdFX1NFTEVDVE9SLCBFSkJfUEtHLmdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZVNlbGVjdG9yKCkpLAotCQkJbmV3IEFja25vd2xlZGdlTW9kZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvblRyYW5zbGF0b3IoKSwKLQkJCQotCQl9OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldFNwZWNpZmljTWFwczE0KCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCS8vRUpCIDIuMSBPbmx5Ci0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihNRVNTQUdJTkdfVFlQRSwgRUpCX1BLRy5nZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2luZ1R5cGUoKSksCi0JCQkvL0JvdGgKLQkJCVRSQU5TQUNUSU9OX1RZUEVfWExBVE9SLAotCQkJLy9FSkIgMi4xIFBBVEgKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9UWVBFLCBFSkJfUEtHLmdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZURlc3RpbmF0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVTU0FHRV9ERVNUX0xJTkssIEVKQl9QS0cuZ2V0TWVzc2FnZURyaXZlbl9MaW5rKCkpLAotCQkJY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ3VyYXRpb25NYXBzKCksCi0JCX07IAotCX0KLQkKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFjdGl2YXRpb25Db25maWd1cmF0aW9uTWFwcygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEFDVElWQVRJT05fQ09ORiwgRUpCX1BLRy5nZXRNZXNzYWdlRHJpdmVuX0FjdGl2YXRpb25Db25maWcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdewotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKSksCi0JCQljcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllc01hcCgpLAotCQkvLwlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEFjdGl2YXRpb25Db25maWdfRXh0ZW5zaW9ucygpKQotCQl9KTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzTWFwKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQUNUSVZBVElPTl9DT05GX1BST1BFUlRZLCBFSkJfUEtHLmdldEFjdGl2YXRpb25Db25maWdfQ29uZmlnUHJvcGVydGllcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoQUNUSVZBVElPTl9DT05GX1BST1BFUlRZX05BTUUsIEVKQl9QS0cuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X05hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihBQ1RJVkFUSU9OX0NPTkZfUFJPUEVSVFlfVkFMVUUsIEVKQl9QS0cuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X1ZhbHVlKCkpCi0JCX0pOwkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OLEVKQl9QS0cuZ2V0TWVzc2FnZURyaXZlbl9EZXN0aW5hdGlvbigpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKCBuZXcgVHJhbnNsYXRvcltdewotCQkJbmV3IE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvblR5cGVUcmFuc2xhdG9yKCksCi0JCQluZXcgVHJhbnNsYXRvcihTVUJTQ1JJUFRJT05fRFVSQUJJTElUWSwgRUpCX1BLRy5nZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTM7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTQgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xNCA9IGNyZWF0ZTE0Q2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xNDsgCi0JCX0KLQl9Ci0JCi0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiLkFic3RyYWN0RUpCVHJhbnNsYXRvciNnZXRFbmRNYXBzMTMoKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczEzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV8zLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX1JFRl8xXzMsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfTE9DQUxfUkVGXzFfMywKLQkJCW5ldyBTZWN1cml0eUlkZW50aXR5VHJhbnNsYXRvcigpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfUkVGXzFfMywKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1JFU09VUkNFX0VOVl9SRUZfMV8zCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczE0KCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfTE9DQUxfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1NFUlZJQ0VfUkVGXzFfNCwJCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfRU5WX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9NRVNTQUdFX0RFU1RfUkVGXzFfNCwKLQkJCW5ldyBTZWN1cml0eUlkZW50aXR5VHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYi5BYnN0cmFjdEVKQlRyYW5zbGF0b3IjdXNlc0hvbWVSZW1vdGVBdHRyaWJ1dGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VzSG9tZVJlbW90ZUF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01ldGhvZEVsZW1lbnRLaW5kVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWV0aG9kRWxlbWVudEtpbmRUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODczNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWV0aG9kRWxlbWVudEtpbmRUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50S2luZFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFamJQYWNrYWdlIEVKQl9QS0cgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLSAgICAgKiBAcGFyYW0gZUNsYXNzCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZEVsZW1lbnRLaW5kVHJhbnNsYXRvcigpewotCQlzdXBlcihNRVRIT0RfSU5URiwgRUpCX1BLRy5nZXRNZXRob2RFbGVtZW50X1R5cGUoKSk7Ci0gICAgfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCU9iamVjdCBvYmogPSBzdXBlci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShzdHJWYWx1ZSwgb3duZXIpOwotCQlpZihvYmogIT0gbnVsbCkKLQkJCXJldHVybiBvYmo7Ci0JCVN0cmluZyBjb3JyZWN0ID0gc3RyVmFsdWU7Ci0JCWlmIChzdHJWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJIT01FIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSAiSG9tZSI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoc3RyVmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiUkVNT1RFIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSAiUmVtb3RlIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChzdHJWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJMT0NBTEhPTUUiKSkgLy8kTk9OLU5MUy0xJAotCQkJY29ycmVjdCA9ICJMb2NhbEhvbWUiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHN0clZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIkxPQ0FMIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSAiTG9jYWwiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdXBlci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShjb3JyZWN0LCBvd25lcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotICAgICAgICBpZiAoKChNZXRob2RFbGVtZW50KWVtZk9iamVjdCkuZ2V0VHlwZSgpID09IE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpCi0gICAgICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBzdXBlci5pc1NldE1PRlZhbHVlKGVtZk9iamVjdCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldE1PRkNoaWxkcmVuKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1PRkNoaWxkcmVuKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gc3VwZXIuZ2V0TU9GQ2hpbGRyZW4obW9mT2JqZWN0KTsKLQkJaWYocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IDApIHsKLQkJCU1ldGhvZEVsZW1lbnRLaW5kIG1ldGhvZEludGYgPSAoTWV0aG9kRWxlbWVudEtpbmQpIHJlc3VsdC5nZXQoMCk7Ci0JCQlpZihtZXRob2RJbnRmLmdldFZhbHVlKCkgPT0gTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRUQpIAotCQkJCXJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWV0aG9kUGFyYW1zVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWV0aG9kUGFyYW1zVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODgyNTJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01ldGhvZFBhcmFtc1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGRmaG9sdHRwCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBhcmFtc1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRWpiUGFja2FnZSBFSkJfUEtHID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkvL3ByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlOwotCi0gICAgcHVibGljIE1ldGhvZFBhcmFtc1RyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0gICAgICAgIHN1cGVyKE1FVEhPRF9QQVJBTVMrJy8nK01FVEhPRF9QQVJBTSAsIGVGZWF0dXJlKTsKLSAgICAgICAgLy90aGlzLmVGZWF0dXJlID0gZUZlYXR1cmU7Ci0gICAgICAgIHRoaXMuZlN0eWxlIHw9IFRyYW5zbGF0b3IuRU1QVFlfQ09OVEVOVF9JU19TSUdOSUZJQ0FOVDsKLSAgICB9Ci0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzTXVsdGlWYWx1ZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTXVsdGlWYWx1ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZDaGlsZHJlbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgewotIAkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCltb2ZPYmplY3QpLmdldE1ldGhvZFBhcmFtcygpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNzZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IG1vZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCUxpc3QgbWV0aG9kUGFyYW1zID0gKChNZXRob2RFbGVtZW50KW1vZk9iamVjdCkuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0JCQotICAgIAlpZih2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgeyAgCi0gICAgCQlpZihtZXRob2RQYXJhbXMgPT0gbnVsbCB8fCBtZXRob2RQYXJhbXMuc2l6ZSgpID09IDAgKSB7Ci0gICAgCQkJc2V0TU9GVmFsdWVGcm9tRW1wdHlET01QYXRoKG1vZk9iamVjdCk7Ci0JCQl9Ci0gICAgCX0gZWxzZSB7Ci0JCQkoKE1ldGhvZEVsZW1lbnQpbW9mT2JqZWN0KS5hZGRNZXRob2RQYXJhbXMoKFN0cmluZyl2YWx1ZSk7Ci0gICAgCX0KLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKLQkJKChNZXRob2RFbGVtZW50KW93bmVyKS5hZGRNZXRob2RQYXJhbXMoKFN0cmluZyl2YWx1ZSk7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY2xlYXJMaXN0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyTGlzdChFT2JqZWN0IG1vZk9iamVjdCkgewotCQkoKE1ldGhvZEVsZW1lbnQpbW9mT2JqZWN0KS5lVW5zZXQoZmVhdHVyZSk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3Nob3VsZFJlbmRlckVtcHR5RE9NUGF0aChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5kZXJFbXB0eURPTVBhdGgoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCU1ldGhvZEVsZW1lbnQgbWUgPSAoKE1ldGhvZEVsZW1lbnQpZU9iamVjdCk7Ci0JCXJldHVybiBtZS5oYXNNZXRob2RQYXJhbXMoKSAmJiBtZS5nZXRNZXRob2RQYXJhbXMoKS5pc0VtcHR5KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlRnJvbUVtcHR5RE9NUGF0aChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZUZyb21FbXB0eURPTVBhdGgoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCSgoTWV0aG9kRWxlbWVudCllT2JqZWN0KS5hcHBseVplcm9QYXJhbXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NdWx0aXBsaWNpdHlUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NdWx0aXBsaWNpdHlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDFiNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTXVsdGlwbGljaXR5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBhZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE11bHRpcGxpY2l0eVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJewotCQotCXB1YmxpYyBNdWx0aXBsaWNpdHlUcmFuc2xhdG9yKCl7Ci0JCXN1cGVyKE1VTFRJUExJQ0lUWSxFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX011bHRpcGxpY2l0eSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJU3RyaW5nIGNvcnJlY3QgPSBzdHJWYWx1ZTsKLQkJaWYgKHN0clZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJPTkUiKSkgLy8kTk9OLU5MUy0xJAotCQkJY29ycmVjdCA9ICJPbmUiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHN0clZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJNQU5ZIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSAiTWFueSI7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQlyZXR1cm4gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoY29ycmVjdCwgb3duZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvUHJpbUtleUZpZWxkVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvUHJpbUtleUZpZWxkVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGQzMTI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1ByaW1LZXlGaWVsZFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMywgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuU291cmNlTGlua1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUGF0aDsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqLwotcHVibGljIGNsYXNzIFByaW1LZXlGaWVsZFRyYW5zbGF0b3IgZXh0ZW5kcyBTb3VyY2VMaW5rVHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqIEBwYXJhbSBUcmFuc2xhdG9yUGF0aAotCSAqLwotCXB1YmxpYyBQcmltS2V5RmllbGRUcmFuc2xhdG9yKCkgewotCQlzdXBlcihQUklNS0VZX0ZJRUxELCBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ByaW1LZXlGaWVsZCgpLG5ldyBUcmFuc2xhdG9yUGF0aCgKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCW5ldyBUcmFuc2xhdG9yKENNUF9GSUVMRCwgRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QZXJzaXN0ZW50QXR0cmlidXRlcygpKSwKLQkJCQluZXcgVHJhbnNsYXRvcihGSUVMRF9OQU1FLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpKQotCQkJfSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNpZmllZFByaW1LZXlGaWVsZE5hbWUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJcmV0dXJuIGNtcC5nZXRQcmltS2V5RmllbGQoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewotCQkvLyB0cnkgYW5kIGNvbnZlcnQgdGhlIHN0cmluZyB0byBhIGNtcCBhdHRyaWJ1dGUsIG90aGVyd2lzZSBjcmVhdGUgYSBwcm94eQotCQlPYmplY3QgcmVzdWx0ID0gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoc3RyVmFsdWUsIG93bmVyKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdCA9PSBzdHJWYWx1ZSAvKnJlZmVyZW5jZSBjaGVjayBpcyB2YWxpZCBoZXJlKi8pIHsKLQkJCXJlc3VsdCA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotCQkJaWYgKHN0clZhbHVlID09IG51bGwpIHN0clZhbHVlID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJKChJbnRlcm5hbEVPYmplY3QpcmVzdWx0KS5lU2V0UHJveHlVUkkoVVJJLmNyZWF0ZVVSSShzdHJWYWx1ZSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9TZWN1cml0eUlkZW50aXR5VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxOWI3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9TZWN1cml0eUlkZW50aXR5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5HZW5lcmljVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JRFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVhZEFoZWFkSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21tb25QYWNrYWdlIENPTU1PTl9QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gUlVOX0FTX1RSQU5TTEFUT1JTID0gY3JlYXRlUnVuQXNUcmFuc2xhdG9ycygpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBVU0VfQ0FMTEVSX1RSQU5TTEFUT1JTID0gY3JlYXRlVXNlQ2FsbGVyVHJhbnNsYXRvcnMoKTsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY3JlYXRlUnVuQXNUcmFuc2xhdG9ycygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcnVuQXNUcmFuc2xhdG9yID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJVTl9BUywgQ09NTU9OX1BLRy5nZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5X0lkZW50aXR5KCkpOwotCQlydW5Bc1RyYW5zbGF0b3Iuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRJZGVudGl0eV9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFJPTEVfTkFNRSwgQ09NTU9OX1BLRy5nZXRJZGVudGl0eV9Sb2xlTmFtZSgpKQotCQl9KTsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbigpKSwKLQkJCXJ1bkFzVHJhbnNsYXRvcgotCQl9OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY3JlYXRlVXNlQ2FsbGVyVHJhbnNsYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihVU0VfQ0FMTEVSX0lERU5USVRZLCBudWxsLCBFTVBUWV9UQUcpCi0JCX07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHlUcmFuc2xhdG9yKCkgewotCQlzdXBlcihTRUNVUklUWV9JREVOVElUWSwgRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fU2VjdXJpdHlJZGVudGl0eSgpKTsKLQkJYWRkUmVhZEFoZWFkSGVscGVyKG5ldyBSZWFkQWhlYWRIZWxwZXIoU0VDVVJJVFlfSURFTlRJVFksIG5ldyBTdHJpbmdbXSB7UlVOX0FTLCBVU0VfQ0FMTEVSX0lERU5USVRZfSwgbnVsbCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwotCQlpZiAoKChTZWN1cml0eUlkZW50aXR5KW8pLmlzUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpKQotCQkJcmV0dXJuIFJVTl9BU19UUkFOU0xBVE9SUzsKLQkJZWxzZSBpZiAoKChTZWN1cml0eUlkZW50aXR5KW8pLmlzVXNlQ2FsbGVySWRlbnRpdHkoKSkKLQkJCXJldHVybiBVU0VfQ0FMTEVSX1RSQU5TTEFUT1JTOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogU2VjdXJpdHkgSWRlbnRpdHkgVHlwZSBleHBlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlDb21tb25GYWN0b3J5IGZhY3QgPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRTsgCi0JCWlmIChSVU5fQVMuZXF1YWxzKHJlYWRBaGVhZE5hbWUpKSB7Ci0JCQlSdW5Bc1NwZWNpZmllZElkZW50aXR5IHJlc3VsdCA9IGZhY3QuY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpOwotCQkJcmVzdWx0LnNldElkZW50aXR5KGZhY3QuY3JlYXRlSWRlbnRpdHkoKSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGVsc2UgaWYgKFVTRV9DQUxMRVJfSURFTlRJVFkuZXF1YWxzKHJlYWRBaGVhZE5hbWUpKQotCQkJcmV0dXJuIGZhY3QuY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKTsKLQkJZWxzZSAKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9TZXNzaW9uVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvU2Vzc2lvblRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzZDRjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9TZXNzaW9uVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMzEsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5KYXZhQ2xhc3NUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvblRyYW5zbGF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVKQlRyYW5zbGF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTM7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTQ7Ci0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIFNlc3Npb25UcmFuc2xhdG9yKCkgewotCQlzdXBlcihFTlRFUlBSSVNFX0JFQU5TKycvJytTRVNTSU9OKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYi5BYnN0cmFjdEVKQlRyYW5zbGF0b3IjZ2V0U3BlY2lmaWNNYXBzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldFNwZWNpZmljTWFwcyhpbnQgdmVyc2lvbklEKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKFNFU1NJT05fVFlQRSwgRUpCX1BLRy5nZXRTZXNzaW9uX1Nlc3Npb25UeXBlKCksIFVOU0VUX0lGX05VTEwpLCAJCS8vRW51bWVyYXRpb24KLQkJCW5ldyBUcmFuc2xhdG9yKFRSQU5TQUNUSU9OX1RZUEUsIEVKQl9QS0cuZ2V0U2Vzc2lvbl9UcmFuc2FjdGlvblR5cGUoKSwgVU5TRVRfSUZfTlVMTCkgCQkvL0VudW1lcmF0aW9uCi0JCX07Ci0JfQotCQkKLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIuQWJzdHJhY3RFSkJUcmFuc2xhdG9yI2dldEVKQkNsYXNzTWFwKCkKLQkgKiAKLQkgKiBTdXBwb3J0IDEuNCBhbmQgMS4zCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRFSkJDbGFzc01hcCgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewkJCQotCQkJLy9KMkVFIDEuNAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoU0VSVklDRV9FTkRQT0lOVCxFSkJfUEtHLmdldFNlc3Npb25fU2VydmljZUVuZHBvaW50KCkpLAotCQkJLy9KMkVFIDEuMwotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoRUpCX0NMQVNTLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCkpCi0JCX07Ci0JCQotCX0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMyA9PSBudWxsKQotCQkJCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjEzOwkKLQkJCWRlZmF1bHQgOgotCQkJCWlmIChjaGlsZHJlbjE0ID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTQgPSBjcmVhdGUxNENoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTQ7IAotCQl9Ci0JfQotCQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9FcnJvclBhZ2VUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYmFwcGxpY2F0aW9uL0Vycm9yUGFnZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVjMDU3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYmFwcGxpY2F0aW9uL0Vycm9yUGFnZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjEsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLldhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWFkQWhlYWRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvclBhZ2VUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIFdhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIEVSUk9SX0NPREVfWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotCQluZXcgVHJhbnNsYXRvcihFUlJPUl9DT0RFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEVycm9yQ29kZUVycm9yUGFnZV9FcnJvckNvZGUoKSksCi0JCW5ldyBUcmFuc2xhdG9yKExPQ0FUSU9OLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEVycm9yUGFnZV9Mb2NhdGlvbigpKQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIEVYQ0VQVElPTl9UWVBFX1hMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoRVhDRVBUSU9OX1RZUEUsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uVHlwZUVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCkpLAotCQluZXcgVHJhbnNsYXRvcihMT0NBVElPTiwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFcnJvclBhZ2VfTG9jYXRpb24oKSkKLQl9OwotCQotCXB1YmxpYyBFcnJvclBhZ2VUcmFuc2xhdG9yKCkgewotCQlzdXBlcihFUlJPUl9QQUdFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9FcnJvclBhZ2VzKCkpOwotCQlhZGRSZWFkQWhlYWRIZWxwZXIobmV3IFJlYWRBaGVhZEhlbHBlcihFUlJPUl9QQUdFLCBuZXcgU3RyaW5nW10ge0VSUk9SX0NPREUsIEVYQ0VQVElPTl9UWVBFfSwgbnVsbCkpOwotCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCVdlYmFwcGxpY2F0aW9uRmFjdG9yeSBmYWN0ID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQkJaWYgKEVSUk9SX0NPREUuZXF1YWxzKHJlYWRBaGVhZE5hbWUpKQotCQkJcmV0dXJuIGZhY3QuY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCk7Ci0JCWVsc2UgaWYgKEVYQ0VQVElPTl9UWVBFLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChvID09IG51bGwpCi0JCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47Ci0JCWlmICgoKEVycm9yUGFnZSlvKS5pc0Vycm9yQ29kZSgpKQotCQkJcmV0dXJuIEVSUk9SX0NPREVfWExBVE9SUzsKLQkJZWxzZSBpZiAoKChFcnJvclBhZ2UpbykuaXNFeGNlcHRpb25UeXBlKCkpCi0JCQlyZXR1cm4gRVhDRVBUSU9OX1RZUEVfWExBVE9SUzsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IEVycm9yQ29kZSBleHBlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vV2ViQXBwVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9XZWJBcHBUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDI2ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9XZWJBcHBUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOCwgMjAwMwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2ViYXBwbGljYXRpb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Cb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5FbnZFbnRyeVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uSmF2YUNsYXNzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuV2FyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlNvdXJjZUxpbmtUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclBhdGg7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYkFwcFRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIFdhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSwgSjJFRUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgV2ViYXBwbGljYXRpb25QYWNrYWdlIFdFQkFQUF9QS0cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCXByaXZhdGUgc3RhdGljIENvbW1vblBhY2thZ2UgQ09NTU9OX1BLRyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCXByaXZhdGUgc3RhdGljIEpzcFBhY2thZ2UgSlNQX1BLRyA9IEpzcFBhY2thZ2UuZUlOU1RBTkNFOwotCXB1YmxpYyBzdGF0aWMgV2ViQXBwVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBXZWJBcHBUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTM7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTQ7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBTRVJWTEVUX01BUFBJTkdfVFJBTlNMQVRPUiA9IGNyZWF0ZVNlcnZsZXRNYXBwaW5nVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgU0VTU0lPTl9DT05GSUdfVFJBTlNMQVRPUiA9IGNyZWF0ZVNlc3Npb25Db25maWdUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBXRUxDT01FRklMRV9UUkFOU0xBVE9SID0gY3JlYXRlRmlsZUxpc3RUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBNSU1FX01BUFBJTkdfVFJBTlNMQVRPUiA9IGNyZWF0ZU1pbWVNYXBwaW5nVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRVJST1JfUEFHRV9UUkFOU0xBVE9SID0gbmV3IEVycm9yUGFnZVRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIExPR0lOX0NPTkZJR19UUkFOU0xBVE9SID0gY3JlYXRlTG9naW5Db25maWdUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBESVNUUklCVVRBQkxFX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihESVNUUklCVVRBQkxFLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9EaXN0cmlidXRhYmxlKCksIEVNUFRZX1RBRyk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBXRUJfUkVTT1VSQ0VfTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoV0VCX1JFU09VUkNFX05BTUUsIFdFQkFQUF9QS0cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1dlYlJlc291cmNlTmFtZSgpKTsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBVUkxfUEFUVEVSTl9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoVVJMX1BBVFRFUk4sIFdFQkFQUF9QS0cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm4oKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBIVFRQX01FVEhPRF9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoSFRUUF9NRVRIT0QsIFdFQkFQUF9QS0cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2QoKSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBST0xFX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFJPTEVfTkFNRSwgV0VCQVBQX1BLRy5nZXRBdXRoQ29uc3RyYWludF9Sb2xlcygpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFRSQU5TUE9SVF9HVUFSQU5URUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFRSQU5TUE9SVF9HVUFSQU5URUUsIFdFQkFQUF9QS0cuZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpKTsKLQotCQotCXByb3RlY3RlZCBXZWJBcHBUcmFuc2xhdG9yKCkgewotCQlzdXBlcihXRUJfQVBQLCBXRUJBUFBfUEtHLmdldFdlYkFwcCgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTM7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTQgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xNCA9IGNyZWF0ZTE0Q2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xNDsgCi0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTl9QQVRILCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OX1BBVEgsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwgCi0JCQlESVNUUklCVVRBQkxFX1RSQU5TTEFUT1IsCi0JCQljcmVhdGVDb250ZXh0UGFyYW0xM1RyYW5zbGF0b3IoKSwJIAotCQkJY3JlYXRlRmlsdGVyMTNUcmFuc2xhdG9yKCksCSAKLQkJCWNyZWF0ZUZpbHRlck1hcHBpbmcxM1RyYW5zbGF0b3IoKSwJIAotCQkJY3JlYXRlTGlzdGVuZXIxM1RyYW5zbGF0b3IoKSwgCi0JCQljcmVhdGVTZXJ2bGV0MTNUcmFuc2xhdG9yKCksIAotCQkJU0VSVkxFVF9NQVBQSU5HX1RSQU5TTEFUT1IsCSAKLQkJCVNFU1NJT05fQ09ORklHX1RSQU5TTEFUT1IsCSAKLQkJCU1JTUVfTUFQUElOR19UUkFOU0xBVE9SLAkgCi0JCQlXRUxDT01FRklMRV9UUkFOU0xBVE9SLCAKLQkJCUVSUk9SX1BBR0VfVFJBTlNMQVRPUiwgCi0JCQljcmVhdGVUYWdMaWJUcmFuc2xhdG9yMTMoV0VCQVBQX1BLRy5nZXRXZWJBcHBfVGFnTGlicygpKSwgCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9FTlZfUkVGXzFfMywgCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9SRUZfMV8zLAotCQkJY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50VHJhbnNsYXRvcjEzKCksCi0JCQlMT0dJTl9DT05GSUdfVFJBTlNMQVRPUiwgCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTMoV0VCQVBQX1BLRy5nZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpKSwgCi0JCQluZXcgRW52RW50cnlUcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9FbnZpcm9ubWVudFByb3BlcnRpZXMoKSwgZmFsc2UsIGZhbHNlKSwgCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfUkVGXzFfMywgCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfTE9DQUxfUkVGXzFfMyAKLQkJfTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTE0Q2hpbGRyZW4oKSB7Ci0JCVRyYW5zbGF0b3JbXSBiZWdpbiA9ICBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFZFUlNJT04sIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1ZlcnNpb24oKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OUywgSjJFRV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlNfWFNJLCBYU0lfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWFNJX1NDSEVNQV9MT0NBVElPTiwgSjJFRV9OU19VUkwrJyAnK1dFQl9BUFBfU0NIRU1BX0xPQ18yXzQpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCi0JCQlESVNUUklCVVRBQkxFX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVQYXJhbVZhbHVlVHlwZShDT05URVhUX1BBUkFNLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCkpLAotCQkJY3JlYXRlRmlsdGVyMTRUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVGaWx0ZXJNYXBwaW5nMTRUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVMaXN0ZW5lcjE0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2VydmxldDE0VHJhbnNsYXRvcigpLAotCQkJU0VSVkxFVF9NQVBQSU5HX1RSQU5TTEFUT1IsCSAKLQkJCVNFU1NJT05fQ09ORklHX1RSQU5TTEFUT1IsCSAKLQkJCU1JTUVfTUFQUElOR19UUkFOU0xBVE9SLAkgCi0JCQlXRUxDT01FRklMRV9UUkFOU0xBVE9SLCAKLQkJCUVSUk9SX1BBR0VfVFJBTlNMQVRPUiwKLQkJCWNyZWF0ZUpTUENvbmZpZ1RyYW5zbGF0b3JzKCksCi0JCQljcmVhdGVTZWN1cml0eUNvbnN0cmFpbnRUcmFuc2xhdG9yczE0KCksCi0JCQlMT0dJTl9DT05GSUdfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlY3VyaXR5Um9sZVRyYW5zbGF0b3IxNChXRUJBUFBfUEtHLmdldFdlYkFwcF9TZWN1cml0eVJvbGVzKCkpCi0JCX07Ci0JCVRyYW5zbGF0b3JbXSBlbmQgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblRyYW5zbGF0b3IoV0VCQVBQX1BLRy5nZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpKSwKLQkJCWNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RUcmFuc2xhdG9yKCksCi0JCS8vCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0V4dGVuc2lvbnMoKSkKLQkJfTsKLQkJCi0JCQotCQlyZXR1cm4gKFRyYW5zbGF0b3JbXSljb25jYXQoYmVnaW4sY29uY2F0KGNyZWF0ZUpORElFbnZpcm9ubWVudFJlZnNHcm91cFRyYW5zbGF0b3IoKSwgZW5kKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnRUcmFuc2xhdG9yczE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VDVVJJVFlfQ09OU1RSQUlOVCwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfQ29uc3RyYWludHMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURpc3BsYXlOYW1lVHJhbnNsYXRvcihXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKSksCi0JCQljcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb25UcmFuc2xhdG9yMTQoKSwKLQkJCWNyZWF0ZUF1dGhDb25zdHJhaW50VHJhbnNsYXRvcjE0KCksCi0JCQljcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnRUcmFuc2xhdG9yMTQoKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV0VCX1JFU09VUkNFX0NPTExFQ1RJT04sIFdFQkFQUF9QS0cuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCVdFQl9SRVNPVVJDRV9OQU1FX1RSQU5TTEFUT1IsIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpKSwgCi0JCQlVUkxfUEFUVEVSTl9UUkFOU0xBVE9SLAotCQkJSFRUUF9NRVRIT0RfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVBdXRoQ29uc3RyYWludFRyYW5zbGF0b3IxNCgpIHsgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihBVVRIX0NPTlNUUkFJTlQsIFdFQkFQUF9QS0cuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0F1dGhDb25zdHJhaW50KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoV0VCQVBQX1BLRy5nZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSksIAotCQkJUk9MRV9OQU1FX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlVXNlckRhdGFDb25zdHJhaW50VHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoVVNFUl9EQVRBX0NPTlNUUkFJTlQsIFdFQkFQUF9QS0cuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpKSwgCi0JCQlUUkFOU1BPUlRfR1VBUkFOVEVFX1RSQU5TTEFUT1IgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUpTUENvbmZpZ1RyYW5zbGF0b3JzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSlNQX0NPTkZJRywgV0VCQVBQX1BLRy5nZXRXZWJBcHBfSnNwQ29uZmlnKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVUYWdMaWJUcmFuc2xhdG9yMTQoSlNQX1BLRy5nZXRKU1BDb25maWdfVGFnTGlicygpKSwKLQkJCWNyZWF0ZUpTUFByb3BlcnR5R3JvdXBUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVKU1BQcm9wZXJ0eUdyb3VwVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEpTUF9QUk9QRVJUWV9HUk9VUCwgSlNQX1BLRy5nZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5JQ09OU19UUkFOU0xBVE9SLAotCQkJbmV3IFRyYW5zbGF0b3IoVVJMX1BBVFRFUk4sIEpTUF9QS0cuZ2V0SlNQUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJuKCkpLAotCQkJbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEVMX0lHTk9SRUQsIEpTUF9QS0cuZ2V0SlNQUHJvcGVydHlHcm91cF9FbElnbm9yZWQoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQUdFX0VOQ09ESU5HLCBKU1BfUEtHLmdldEpTUFByb3BlcnR5R3JvdXBfUGFnZUVuY29kaW5nKCkpLAotCQkJbmV3IEJvb2xlYW5UcmFuc2xhdG9yKFNDUklQVElOR19JTlZBTElELCBKU1BfUEtHLmdldEpTUFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpKSwKLQkJCW5ldyBCb29sZWFuVHJhbnNsYXRvcihJU19YTUwsSlNQX1BLRy5nZXRKU1BQcm9wZXJ0eUdyb3VwX0lzWE1MKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoSU5DTFVERV9QUkVMVURFLCBKU1BfUEtHLmdldEpTUFByb3BlcnR5R3JvdXBfSW5jbHVkZVByZWx1ZGVzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoSU5DTFVERV9DT0RBLCBKU1BfUEtHLmdldEpTUFByb3BlcnR5R3JvdXBfSW5jbHVkZUNvZGFzKCkpCi0JCX0pOwkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNULCBXRUJBUFBfUEtHLmdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCWNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZygpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCQotCX0KLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVMb2NhbGVFbmNvZGluZ01hcHBpbmcoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihMT0NBTEVfRU5DT0RJTkdfTUFQUElORywgV0VCQVBQX1BLRy5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihMT0NBTEUsIFdFQkFQUF9QS0cuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKEVOQ09ESU5HLCBXRUJBUFBfUEtHLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCkpIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNyZWF0ZUpORElFbnZpcm9ubWVudFJlZnNHcm91cFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX0VOVl9FTlRSWV8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX0VKQl9MT0NBTF9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfU0VSVklDRV9SRUZfMV80LAkKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1JFU09VUkNFX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9FTlZfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX01FU1NBR0VfREVTVF9SRUZfMV80Ci0JCX07Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUZpbHRlck1hcHBpbmcxNFRyYW5zbGF0b3IoKSB7Ci0JCVRyYW5zbGF0b3IgZGlzcGF0Y2hlciA9IG5ldyBUcmFuc2xhdG9yKERJU1BBVENIRVIsIFdFQkFQUF9QS0cuZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVyVHlwZSgpKTsKLQkJcmV0dXJuIEdlbmVyaWNUcmFuc2xhdG9yLmFwcGVuZENoaWxkKChHZW5lcmljVHJhbnNsYXRvciljcmVhdGVGaWx0ZXJNYXBwaW5nMTNUcmFuc2xhdG9yKCksZGlzcGF0Y2hlcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVDb250ZXh0UGFyYW0xM1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihDT05URVhUX1BBUkFNLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9Db250ZXh0cygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fTkFNRSwgV0VCQVBQX1BLRy5nZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1ZBTFVFLCBXRUJBUFBfUEtHLmdldENvbnRleHRQYXJhbV9QYXJhbVZhbHVlKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXRUJBUFBfUEtHLmdldENvbnRleHRQYXJhbV9EZXNjcmlwdGlvbigpKSwgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRmlsdGVyMTNUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRklMVEVSLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9GaWx0ZXJzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OX1BBVEgsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT05fUEFUSCwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoRklMVEVSX05BTUUsIFdFQkFQUF9QS0cuZ2V0RmlsdGVyX05hbWUoKSwgCi0JCQkJCQluZXcgVHJhbnNsYXRvclBhdGgobmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgVHJhbnNsYXRvci5DT05UQUlORVJfRkVBVFVSRSksIAotCQkJCQkJCW5ldyBUcmFuc2xhdG9yKEZJTFRFUl9NQVBQSU5HLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpKSwgCi0JCQkJCQl9KSksCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSksIAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoRklMVEVSX0NMQVNTLCBXRUJBUFBfUEtHLmdldEZpbHRlcl9GaWx0ZXJDbGFzcygpKSwgCi0JCQljcmVhdGVJbml0UGFyYW1UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVGaWx0ZXIxNFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihGSUxURVIsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0ZpbHRlcnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5JQ09OU19UUkFOU0xBVE9SLAotCQkJbmV3IFRyYW5zbGF0b3IoRklMVEVSX05BTUUsIFdFQkFQUF9QS0cuZ2V0RmlsdGVyX05hbWUoKSwgCi0JCQkJCQkvL1RPRE86IE1ha2Ugc3VyZSB0aGUgcGF0aCBpcyBzdGlsbCB2YWxpZAotCQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJCW5ldyBUcmFuc2xhdG9yKFdFQl9BUFAsIFRyYW5zbGF0b3IuQ09OVEFJTkVSX0ZFQVRVUkUpLCAKLQkJCQkJCQluZXcgVHJhbnNsYXRvcihGSUxURVJfTUFQUElORywgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSksIAotCQkJCQkJfSkpLAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoRklMVEVSX0NMQVNTLCBXRUJBUFBfUEtHLmdldEZpbHRlcl9GaWx0ZXJDbGFzcygpKSwgCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVQYXJhbVZhbHVlVHlwZShJTklUX1BBUkFNLFdFQkFQUF9QS0cuZ2V0RmlsdGVyX0luaXRQYXJhbVZhbHVlcygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUZpbHRlck1hcHBpbmcxM1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihGSUxURVJfTUFQUElORywgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBTb3VyY2VMaW5rVHJhbnNsYXRvcihGSUxURVJfTkFNRSwgV0VCQVBQX1BLRy5nZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlcigpLCAKLQkJCQkJCW5ldyBUcmFuc2xhdG9yUGF0aChuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQkJCQluZXcgVHJhbnNsYXRvcihXRUJfQVBQLCBUcmFuc2xhdG9yLkNPTlRBSU5FUl9GRUFUVVJFKSwgCi0JCQkJCQkJbmV3IFRyYW5zbGF0b3IoRklMVEVSLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9GaWx0ZXJzKCkpLCAKLQkJCQkJCQluZXcgVHJhbnNsYXRvcihGSUxURVJfTUFQUElORywgV0VCQVBQX1BLRy5nZXRGaWx0ZXJfTmFtZSgpKQotCQkJCQkJfSkpLAotCQkJbmV3IFRyYW5zbGF0b3IoVVJMX1BBVFRFUk4sIFdFQkFQUF9QS0cuZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJuKCkpLCAKLQkJCW5ldyBTb3VyY2VMaW5rVHJhbnNsYXRvcihTRVJWTEVUX05BTUUsIFdFQkFQUF9QS0cuZ2V0RmlsdGVyTWFwcGluZ19TZXJ2bGV0KCksIAotCQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJCW5ldyBUcmFuc2xhdG9yKFdFQl9BUFAsIFRyYW5zbGF0b3IuQ09OVEFJTkVSX0ZFQVRVUkUpLCAKLQkJCQkJCQluZXcgVHJhbnNsYXRvcihTRVJWTEVULCBXRUJBUFBfUEtHLmdldFdlYkFwcF9TZXJ2bGV0cygpKSwgCi0JCQkJCQkJbmV3IFRyYW5zbGF0b3IoU0VSVkxFVF9OQU1FLCBXRUJBUFBfUEtHLmdldFNlcnZsZXRfU2VydmxldE5hbWUoKSkgCi0JCQkJCQl9KSwgVHJhbnNsYXRvci5TVFJJTkdfUkVTVUxUX09LKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVJbml0UGFyYW1UcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihJTklUX1BBUkFNLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fTkFNRSwgV0VCQVBQX1BLRy5nZXRJbml0UGFyYW1fUGFyYW1OYW1lKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1ZBTFVFLCBXRUJBUFBfUEtHLmdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXRUJBUFBfUEtHLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvbigpKSwgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTGlzdGVuZXIxM1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihMSVNURU5FUiwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfTGlzdGVuZXJzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5MSVNURU5FUl9DTEFTU19UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTGlzdGVuZXIxNFRyYW5zbGF0b3IoKSB7Ci0JCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTElTVEVORVIsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0xpc3RlbmVycygpKTsKLQkJCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5JQ09OU19UUkFOU0xBVE9SLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLkxJU1RFTkVSX0NMQVNTX1RSQU5TTEFUT1IKLQkJCX0pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlcnZsZXQxM1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWTEVULCBXRUJBUFBfUEtHLmdldFdlYkFwcF9TZXJ2bGV0cygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTl9QQVRILCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OX1BBVEgsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKFNFUlZMRVRfTkFNRSwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCksIAotCQkJCW5ldyBUcmFuc2xhdG9yUGF0aFtdIHsKLQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1dlYkFwcCgpKSwgCi0JCQkJCQluZXcgVHJhbnNsYXRvcihTRVJWTEVUX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpKSwgCi0JCQkJCX0pLCAKLQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1dlYkFwcCgpKSwgCi0JCQkJCQluZXcgVHJhbnNsYXRvcihGSUxURVJfTUFQUElORywgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSksIAotCQkJCQl9KSwgCi0JCQkJfSksCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSksIAotCQkJbmV3IFdlYlR5cGVUcmFuc2xhdG9yKCksIC8vc2VydmxldC1jbGFzcyBvciBqc3AtZmlsZSAgCi0JCQljcmVhdGVJbml0UGFyYW1UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0U2VydmxldF9QYXJhbXMoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTE9BRF9PTl9TVEFSVFVQLCBXRUJBUFBfUEtHLmdldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJ1bkFzVHJhbnNsYXRvcjEzKFdFQkFQUF9QS0cuZ2V0U2VydmxldF9SdW5BcygpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlY3VyaXR5Um9sZVJlZlRyYW5zbGF0b3IxMyhXRUJBUFBfUEtHLmdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpKSAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmxldDE0VHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFUlZMRVQsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1NlcnZsZXRzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKFNFUlZMRVRfTkFNRSwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCksIAotCQkJCW5ldyBUcmFuc2xhdG9yUGF0aFtdIHsKLQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1dlYkFwcCgpKSwgCi0JCQkJCQluZXcgVHJhbnNsYXRvcihTRVJWTEVUX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpKSwgCi0JCQkJCX0pLCAKLQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1dlYkFwcCgpKSwgCi0JCQkJCQluZXcgVHJhbnNsYXRvcihGSUxURVJfTUFQUElORywgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSksIAotCQkJCQl9KSwgCi0JCQkJfSksCi0JCQluZXcgV2ViVHlwZVRyYW5zbGF0b3IoKSwgLy9zZXJ2bGV0LWNsYXNzIG9yIGpzcC1maWxlICAKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVBhcmFtVmFsdWVUeXBlKElOSVRfUEFSQU0sV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X0luaXRQYXJhbXMoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTE9BRF9PTl9TVEFSVFVQLCBXRUJBUFBfUEtHLmdldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJ1bkFzVHJhbnNsYXRvcjE0KFdFQkFQUF9QS0cuZ2V0U2VydmxldF9SdW5BcygpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlY3VyaXR5Um9sZVJlZlRyYW5zbGF0b3IxNChXRUJBUFBfUEtHLmdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpKSwKLQkJLy8JQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X0V4dGVuc2lvbnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZXJ2bGV0TWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWTEVUX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFNvdXJjZUxpbmtUcmFuc2xhdG9yKFNFUlZMRVRfTkFNRSwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0TWFwcGluZ19TZXJ2bGV0KCksIAotCQkJCW5ldyBUcmFuc2xhdG9yUGF0aChuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgQ09OVEFJTkVSX0ZFQVRVUkUpLCAKLQkJCQkJbmV3IFRyYW5zbGF0b3IoU0VSVkxFVCwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfU2VydmxldHMoKSksIAotCQkJCQluZXcgVHJhbnNsYXRvcihTRVJWTEVUX05BTUUsIFdFQkFQUF9QS0cuZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpKSAKLQkJCQl9KSksCi0JCQluZXcgVHJhbnNsYXRvcihVUkxfUEFUVEVSTiwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJuKCkpIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlc3Npb25Db25maWdUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VTU0lPTl9DT05GSUcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKFNFU1NJT05fVElNRU9VVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXNzaW9uQ29uZmlnX1Nlc3Npb25UaW1lb3V0KCkpLCAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVNaW1lTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNSU1FX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoRVhURU5TSU9OLCBXRUJBUFBfUEtHLmdldE1pbWVNYXBwaW5nX0V4dGVuc2lvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihNSU1FX1RZUEUsIFdFQkFQUF9QS0cuZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSksIAotCQkJCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRmlsZUxpc3RUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV0VMQ09NRV9GSUxFX0xJU1QsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0ZpbGVMaXN0KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVQYXJlbnRBbmRUZXh0QXR0cmlidXRlVHJhbnNsYXRvcihXRUxDT01FX0ZJTEUsIFdFQkFQUF9QS0cuZ2V0V2VsY29tZUZpbGVMaXN0X0ZpbGUoKSwgV0VCQVBQX1BLRy5nZXRXZWxjb21lRmlsZV9XZWxjb21lRmlsZSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVRhZ0xpYlRyYW5zbGF0b3IxNChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoVEFHTElCLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoVEFHTElCX1VSSSwgSlNQX1BLRy5nZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYlVSSSgpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihUQUdMSUJfTE9DQVRJT04sIEpTUF9QS0cuZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJMb2NhdGlvbigpKSAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVUYWdMaWJUcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFRBR0xJQiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKFRBR0xJQl9VUkksIFdFQkFQUF9QS0cuZ2V0VGFnTGliUmVmX1RhZ2xpYlVSSSgpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihUQUdMSUJfTE9DQVRJT04sIFdFQkFQUF9QS0cuZ2V0VGFnTGliUmVmX1RhZ2xpYkxvY2F0aW9uKCkpIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludFRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFQ1VSSVRZX0NPTlNUUkFJTlQsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIFdFQkFQUF9QS0cuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lKCkpLAotCQkJY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uVHJhbnNsYXRvcjEzKCksCi0JCQljcmVhdGVBdXRoQ29uc3RyYWludFRyYW5zbGF0b3IxMygpLAotCQkJY3JlYXRlVXNlckRhdGFDb25zdHJhaW50VHJhbnNsYXRvcjEzKCksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvblRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OLCBXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlXRUJfUkVTT1VSQ0VfTkFNRV9UUkFOU0xBVE9SLCAKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLFdFQkFQUF9QS0cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9uKCkpLCAKLQkJCVVSTF9QQVRURVJOX1RSQU5TTEFUT1IsCi0JCQlIVFRQX01FVEhPRF9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUF1dGhDb25zdHJhaW50VHJhbnNsYXRvcjEzKCkgeyAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEFVVEhfQ09OU1RSQUlOVCwgV0VCQVBQX1BLRy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXRUJBUFBfUEtHLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCkpLCAKLQkJCVJPTEVfTkFNRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludFRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFVTRVJfREFUQV9DT05TVFJBSU5ULCBXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXRUJBUFBfUEtHLmdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbigpKSwgCi0JCQlUUkFOU1BPUlRfR1VBUkFOVEVFX1RSQU5TTEFUT1IgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTG9naW5Db25maWdUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTE9HSU5fQ09ORklHLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9Mb2dpbkNvbmZpZygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoQVVUSF9NRVRIT0QsIFdFQkFQUF9QS0cuZ2V0TG9naW5Db25maWdfQXV0aE1ldGhvZCgpLCBUcmFuc2xhdG9yLkVOVU1fRkVBVFVSRV9XSVRIX0hZUEhFTlMpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKFJFQUxNX05BTUUsIFdFQkFQUF9QS0cuZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCkpLCAKLQkJCWNyZWF0ZUZvcm1Mb2dpbkNvbmZpZ1RyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZ1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihGT1JNX0xPR0lOX0NPTkZJRywgIFdFQkFQUF9QS0cuZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihGT1JNX0xPR0lOX1BBR0UsIFdFQkFQUF9QS0cuZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1Mb2dpblBhZ2UoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoRk9STV9FUlJPUl9QQUdFLCBXRUJBUFBfUEtHLmdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCkpLCAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vV2ViVHlwZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vV2ViVHlwZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwMjdiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYmFwcGxpY2F0aW9uL1dlYlR5cGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIwLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2ViYXBwbGljYXRpb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5XYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgV2ViVHlwZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgV2FyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gU0VSVkxFVF9YTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCW5ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRUeXBlX0NsYXNzTmFtZSgpKQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIEpTUF9YTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCW5ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEpTUFR5cGVfSnNwRmlsZSgpKQotCX07Ci0JCi0JcHVibGljIFdlYlR5cGVUcmFuc2xhdG9yKCkgewotCQlzdXBlcihTRVJWTEVUX0NMQVNTKycsJytKU1BfRklMRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0X1dlYlR5cGUoKSk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwotCQlpZiAoKChXZWJUeXBlKW8pLmlzSnNwVHlwZSgpKQotCQkJcmV0dXJuIEpTUF9YTEFUT1JTOwotCQllbHNlIGlmICgoKFdlYlR5cGUpbykuaXNTZXJ2bGV0VHlwZSgpKQotCQkJcmV0dXJuIFNFUlZMRVRfWExBVE9SUzsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IFdlYiBUeXBlIGV4cGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRET01OYW1lKE9iamVjdCB2YWx1ZSkgewotCQlpZiAoKChXZWJUeXBlKXZhbHVlKS5pc0pzcFR5cGUoKSkKLQkJCXJldHVybiBKU1BfRklMRTsKLQkJZWxzZSBpZiAoKChXZWJUeXBlKXZhbHVlKS5pc1NlcnZsZXRUeXBlKCkpCi0JCQlyZXR1cm4gU0VSVkxFVF9DTEFTUzsKLQkJZWxzZSAKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBXZWIgVHlwZSBleHBlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCVdlYmFwcGxpY2F0aW9uRmFjdG9yeSBmYWN0ID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQkJaWYgKFNFUlZMRVRfQ0xBU1MuZXF1YWxzKG5vZGVOYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZVNlcnZsZXRUeXBlKCk7Ci0JCWVsc2UgaWYgKEpTUF9GSUxFLmVxdWFscyhub2RlTmFtZSkpCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVKU1BUeXBlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9FSkJMaW5rVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9FSkJMaW5rVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmU2ZDhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvRUpCTGlua1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBFSkJMaW5rVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBXc2RkWG1sTWFwcGVySSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIEVKQl9MSU5LX1hMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJbmV3IFRyYW5zbGF0b3IoVEVYVF9BVFRSSUJVVEVfVkFMVUUsIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJMaW5rX0VqYkxpbmsoKSkKLQl9OwotCQotCXB1YmxpYyBFSkJMaW5rVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoRUpCX0xJTkssIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRUVKQkxpbmsoKSk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwotCi0JCXJldHVybiBFSkJfTElOS19YTEFUT1JTOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldERPTU5hbWUoT2JqZWN0IHZhbHVlKSB7Ci0JICByZXR1cm4gRUpCX0xJTks7Ci0JfQotCi0JCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCVdzZGRGYWN0b3J5IGZhY3QgPSBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3NkZEZhY3RvcnkoKTsKLQkJcmV0dXJuIGZhY3QuY3JlYXRlRUpCTGluaygpOwotCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvRWxlbWVudE5hbWVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0VsZW1lbnROYW1lVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDM5MTNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvRWxlbWVudE5hbWVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5hbWVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEpheHJwY21hcFhtbE1hcHBlckkgewotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSAgIEVMRU1FTlRfTkFNRV9YTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCW5ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbGVtZW50TmFtZV9UZXh0KCkpCi0JfTsKLQkKLQlwdWJsaWMgRWxlbWVudE5hbWVUcmFuc2xhdG9yKCkgewotCQlzdXBlcihFTEVNRU5UX05BTUUsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfRWxlbWVudE5hbWVzKCkpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKG8gPT0gbnVsbCkKLQkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKLQotCQlyZXR1cm4gRUxFTUVOVF9OQU1FX1hMQVRPUlM7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkgIHJldHVybiBFTEVNRU5UX05BTUU7Ci0JfQotCi0JCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCUpheHJwY21hcEZhY3RvcnkgZmFjdCA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEpheHJwY21hcEZhY3RvcnkoKTsKLQkJcmV0dXJuIGZhY3QuY3JlYXRlRWxlbWVudE5hbWUoKTsKLQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0ludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0ludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YmQ0YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9JbnRlcmZhY2VNYXBwaW5nVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5HZW5lcmljVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JRFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEpheHJwY21hcFhtbE1hcHBlckkgewotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIFNFUlZJQ0VfSU5URVJGQUNFXzEwWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotICAgICBuZXcgVHJhbnNsYXRvcihTRVJWSUNFX0lOVEVSRkFDRSwgSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfU2VydmljZUludGVyZmFjZSgpKSwKLSAgICAgY3JlYXRlMTBXU0RMU2VydmljZU5hbWVUcmFuc2xhdG9yKCksCi0gICAgIGNyZWF0ZVBvcnRNYXBwaW5nVHJhbnNsYXRvcigpCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBTRVJWSUNFX0lOVEVSRkFDRV8xMVhMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLSAgICAgbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9JTlRFUkZBQ0UsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VJbnRlcmZhY2UoKSksCi0gICAgIENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVFOYW1lVHJhbnNsYXRvcihXU0RMX1NFUlZJQ0VfTkFNRSwgSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfV3NkbFNlcnZpY2VOYW1lKCkpLAotICAgICBjcmVhdGVQb3J0TWFwcGluZ1RyYW5zbGF0b3IoKQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gU0VJXzEwWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotICAgICBuZXcgVHJhbnNsYXRvcihTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSwgSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSksCi0gICAgICBjcmVhdGUxMFdTRExQb3J0VHlwZVRyYW5zbGF0b3IoKSwKLSAgICAgIGNyZWF0ZTEwV1NETEJpbmRpbmdUcmFuc2xhdG9yKCksCi0gICAgICBjcmVhdGUxMFNFTWV0aG9kTWFwcGluZ1RyYW5zbGF0b3IoKQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gU0VJXzExWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotICAgICBuZXcgVHJhbnNsYXRvcihTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSwgSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSksCi0gICAgIENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVFOYW1lVHJhbnNsYXRvcihXU0RMX1BPUlRfVFlQRSwgSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsUG9ydFR5cGUoKSksCi0gICAgIENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVFOYW1lVHJhbnNsYXRvcihXU0RMX0JJTkRJTkcsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbEJpbmRpbmcoKSksCi0gICAgIGNyZWF0ZTExU0VNZXRob2RNYXBwaW5nVHJhbnNsYXRvcigpCi0JfTsKLQkKLQlwdWJsaWMgSW50ZXJmYWNlTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkcrJywnK1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkcsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19JbnRlcmZhY2VNYXBwaW5ncygpKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChvID09IG51bGwpCi0JCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47Ci0JCWlmIChvIGluc3RhbmNlb2YgU2VydmljZUludGVyZmFjZU1hcHBpbmcpCi0JCQlyZXR1cm4gZ2V0U2VydmljZUludGVyZmFjZVRyYW5zbGF0b3IodmVyc2lvbklEKTsKLQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcpCi0JCQlyZXR1cm4gZ2V0U0VJVHJhbnNsYXRvcih2ZXJzaW9uSUQpOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogSW50ZXJmYWNlTWFwcGluZyBleHBlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU2VydmljZUludGVyZmFjZU1hcHBpbmcpCi0JCQlyZXR1cm4gU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElORzsKLQkJZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKQotCQkJcmV0dXJuIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkc7Ci0JCWVsc2UgCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogSW50ZXJmYWNlTWFwcGluZyBleHBlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCUpheHJwY21hcEZhY3RvcnkgZmFjdCA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEpheHJwY21hcEZhY3RvcnkoKTsKLQkJaWYgKFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkcuZXF1YWxzKG5vZGVOYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCk7Ci0JCWVsc2UgaWYgKFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkcuZXF1YWxzKG5vZGVOYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0gICBwcml2YXRlIFRyYW5zbGF0b3JbXSBnZXRTZXJ2aWNlSW50ZXJmYWNlVHJhbnNsYXRvcihpbnQgdmVyc2lvbklEKQotICAgewotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCQlyZXR1cm4gU0VSVklDRV9JTlRFUkZBQ0VfMTBYTEFUT1JTOwkKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBTRVJWSUNFX0lOVEVSRkFDRV8xMVhMQVRPUlM7IAotCQl9Ci0gICAgCi0gICB9Ci0KLSAgIHByaXZhdGUgVHJhbnNsYXRvcltdIGdldFNFSVRyYW5zbGF0b3IoaW50IHZlcnNpb25JRCkKLSAgIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQkJcmV0dXJuIFNFSV8xMFhMQVRPUlM7CQotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIFNFSV8xMVhMQVRPUlM7IAotCQl9Ci0gICAgCi0gICB9Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFdTRExTZXJ2aWNlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCSAgICBDb21tb25QYWNrYWdlIGNvbW1vblBhY2thZ2UgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfU0VSVklDRV9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTkFNRVNQQUNFVVJJLCBjb21tb25QYWNrYWdlLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExPQ0FMUEFSVCwgY29tbW9uUGFja2FnZS5nZXRRTmFtZV9Mb2NhbFBhcnQoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUG9ydE1hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFBPUlRfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Qb3J0TWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBPUlRfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRQb3J0TWFwcGluZ19Qb3J0TmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEpBVkFfUE9SVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFBvcnRNYXBwaW5nX0phdmFQb3J0TmFtZSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCS8qCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFBvcnRNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihQT1JUX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfUG9ydE1hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihQT1JUX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0UG9ydE1hcHBpbmdfUG9ydE5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihKQVZBX1BPUlRfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRQb3J0TWFwcGluZ19KYXZhUG9ydE5hbWUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkqLwotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFdTRExQb3J0VHlwZVRyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCSAgICBDb21tb25QYWNrYWdlIGNvbW1vblBhY2thZ2UgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsJICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV1NETF9QT1JUX1RZUEUsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsUG9ydFR5cGUoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgY29tbW9uUGFja2FnZS5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKSksCi0JCQluZXcgVHJhbnNsYXRvcihMT0NBTFBBUlQsIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTG9jYWxQYXJ0KCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwV1NETEJpbmRpbmdUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkgICAgQ29tbW9uUGFja2FnZSBjb21tb25QYWNrYWdlID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7CSAgICAJICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV1NETF9CSU5ESU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbEJpbmRpbmcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgY29tbW9uUGFja2FnZS5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKSksCi0JCQluZXcgVHJhbnNsYXRvcihMT0NBTFBBUlQsIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTG9jYWxQYXJ0KCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwU0VNZXRob2RNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKEpBVkFfTUVUSE9EX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19KYXZhTWV0aG9kTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfT1BFUkFUSU9OLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdSQVBQRURfRUxFTUVOVCwgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dyYXBwZWRFbGVtZW50KCksIFRyYW5zbGF0b3IuRU1QVFlfVEFHKSwKLQkJCWNyZWF0ZTEwTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQljcmVhdGUxMFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTFTRU1ldGhvZE1hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoSkFWQV9NRVRIT0RfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0phdmFNZXRob2ROYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoV1NETF9PUEVSQVRJT04sIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsT3BlcmF0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoV1JBUFBFRF9FTEVNRU5ULCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3JhcHBlZEVsZW1lbnQoKSwgVHJhbnNsYXRvci5FTVBUWV9UQUcpLAotCQkJY3JlYXRlMTFNZXRob2RQYXJhbVBhcnRzTWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZTExV1NETFJldHVyblZhbHVlTWFwcGluZ1RyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxME1ldGhvZFBhcmFtUGFydHNNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX01ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fUE9TSVRJT04sIGpheHJwY21hcFBhY2thZ2UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1Qb3NpdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1RZUEUsIGpheHJwY21hcFBhY2thZ2UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1UeXBlKCkpLAotCQkJY3JlYXRlMTBXU0RMTWVzc2FnZU1hcHBpbmdUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTFNZXRob2RQYXJhbVBhcnRzTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1BPU0lUSU9OLCBqYXhycGNtYXBQYWNrYWdlLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtUG9zaXRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9UWVBFLCBqYXhycGNtYXBQYWNrYWdlLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtVHlwZSgpKSwKLQkJCWNyZWF0ZTExV1NETE1lc3NhZ2VNYXBwaW5nVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwV1NETE1lc3NhZ2VNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXU0RMX01FU1NBR0VfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19Xc2RsTWVzc2FnZU1hcHBpbmcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLSAgICAgICAgICBjcmVhdGUxMFdTRExNZXNzYWdlVHJhbnNsYXRvcihqYXhycGNtYXBQYWNrYWdlLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfTUVTU0FHRV9QQVJUX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTUVURVJfTU9ERSwgamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfUGFyYW1ldGVyTW9kZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNPQVBfSEVBREVSLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExNZXNzYWdlTWFwcGluZ19Tb2FwSGVhZGVyKCksIFRyYW5zbGF0b3IuRU1QVFlfVEFHKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTFXU0RMTWVzc2FnZU1hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfTUVTU0FHRV9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1dzZGxNZXNzYWdlTWFwcGluZygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotICAgICAgICAgIENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVFOYW1lVHJhbnNsYXRvcihXU0RMX01FU1NBR0UsIGpheHJwY21hcFBhY2thZ2UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoV1NETF9NRVNTQUdFX1BBUlRfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNRVRFUl9NT0RFLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExNZXNzYWdlTWFwcGluZ19QYXJhbWV0ZXJNb2RlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU09BUF9IRUFERVIsIGpheHJwY21hcFBhY2thZ2UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1NvYXBIZWFkZXIoKSwgVHJhbnNsYXRvci5FTVBUWV9UQUcpLAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFdTRExNZXNzYWdlVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCSAgICAvL0pheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCSAgICBDb21tb25QYWNrYWdlIGNvbW1vblBhY2thZ2UgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsJICAgIAkgICAgCSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfTUVTU0FHRSwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgY29tbW9uUGFja2FnZS5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKSksCi0JCQluZXcgVHJhbnNsYXRvcihMT0NBTFBBUlQsIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTG9jYWxQYXJ0KCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwV1NETFJldHVyblZhbHVlTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FVEhPRF9SRVRVUk5fVkFMVUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19NZXRob2RSZXR1cm5WYWx1ZSgpKSwKLQkJCWNyZWF0ZTEwV1NETE1lc3NhZ2VUcmFuc2xhdG9yKGpheHJwY21hcFBhY2thZ2UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfTUVTU0FHRV9QQVJUX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZTExV1NETFJldHVyblZhbHVlTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FVEhPRF9SRVRVUk5fVkFMVUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19NZXRob2RSZXR1cm5WYWx1ZSgpKSwKLSAgICAgICAgICBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9NRVNTQUdFLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX01FU1NBR0VfUEFSVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvSmF4cnBjbWFwVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmJlZTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvSmF4cnBjbWFwVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC5XZWJTZXJ2aWNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgSmF4cnBjbWFwVHJhbnNsYXRvciBleHRlbmRzIFJvb3RUcmFuc2xhdG9yIGltcGxlbWVudHMgSmF4cnBjbWFwWG1sTWFwcGVySSwgSjJFRUNvbnN0YW50c3sKLQlwdWJsaWMgc3RhdGljIEpheHJwY21hcFRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgSmF4cnBjbWFwVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEwOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjExOwotCXByaXZhdGUgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlOwotCXByaXZhdGUgQ29tbW9uUGFja2FnZSBjb21tb25QYWNrYWdlOwotCQotCQotCXByb3RlY3RlZCBKYXhycGNtYXBUcmFuc2xhdG9yKCkgewotCQlzdXBlcihKQVZBX1dTRExfTUFQUElORywgSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCSAgICBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCWNvbW1vblBhY2thZ2UgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJaWYgKGNoaWxkcmVuMTAgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWNoaWxkcmVuMTAgPSBjcmVhdGUxMENoaWxkcmVuKCk7Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbjEwOwkKLQkJCWRlZmF1bHQgOgotCQkJCWlmIChjaGlsZHJlbjExID09IG51bGwpCi0JCQkJewotCQkJCQljaGlsZHJlbjExID0gY3JlYXRlMTFDaGlsZHJlbigpOwotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4xMTsgCi0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTBDaGlsZHJlbigpIHsKLQkJCi0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCWNyZWF0ZVBhY2thZ2VNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlMTBKYXZhWE1MVHlwZU1hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQljcmVhdGUxMEV4Y2VwdGlvbk1hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQluZXcgSW50ZXJmYWNlTWFwcGluZ1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTFDaGlsZHJlbigpIHsKLQkJCi0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TLCBKMkVFX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OU19YU0ksIFhTSV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYU0lfU0NIRU1BX0xPQ0FUSU9OLCBKMkVFX05TX1VSTCsnICcrV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfU0NIRU1BX0xPQyksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFZFUlNJT04sIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfVkVSU0lPTl8xXzEpLAkJCSAgCQkJICAKLQkJCWNyZWF0ZVBhY2thZ2VNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlMTFKYXZhWE1MVHlwZU1hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQljcmVhdGUxMUV4Y2VwdGlvbk1hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQluZXcgSW50ZXJmYWNlTWFwcGluZ1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZVBhY2thZ2VNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihQQUNLQUdFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVdTRExNYXBwaW5nX1BhY2thZ2VNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFDS0FHRV9UWVBFLCBqYXhycGNtYXBQYWNrYWdlLmdldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTkFNRVNQQUNFVVJJLCBqYXhycGNtYXBQYWNrYWdlLmdldFBhY2thZ2VNYXBwaW5nX05hbWVzcGFjZVVSSSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTBKYXZhWE1MVHlwZU1hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEpBVkFfWE1MX1RZUEVfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoQ0xBU1NfVFlQRSwgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfQ2xhc3NUeXBlKCkpLAotCQkJY3JlYXRlMTBSb290VHlwZVFuYW1lVHJhbnNsYXRvcigpLAotCQkJbmV3IFRyYW5zbGF0b3IoUU5BTUVfU0NPUEUsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1FuYW1lU2NvcGUoKSksCi0JCQljcmVhdGUxMFZhcmlhYmxlTWFwcGluZ1RyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTFKYXZhWE1MVHlwZU1hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEpBVkFfWE1MX1RZUEVfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoSkFWQV9UWVBFLCBqYXhycGNtYXBQYWNrYWdlLmdldEphdmFYTUxUeXBlTWFwcGluZ19DbGFzc1R5cGUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihBTk9OWU1PVVNfVFlQRV9RTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfQW5vbnltb3VzVHlwZVFuYW1lKCkpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFJPT1RfVFlQRV9RTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfUm9vdFR5cGVRbmFtZSgpKSwKLQkJCS8vY3JlYXRlMTBSb290VHlwZVFuYW1lVHJhbnNsYXRvcigpLCAgLy9Sb290VHlwZVFOYW1lIGlzIHN0aWxsIGdvaW5nIHRvIHdvcmsgdGhlIG9sZCAoMS4zKSB3YXkgYmVjYXVzZSBvZiBhbm9ueW1vdXMgdHlwZXMuCi0JCQluZXcgVHJhbnNsYXRvcihRTkFNRV9TQ09QRSwgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfUW5hbWVTY29wZSgpKSwKLQkJCWNyZWF0ZTExVmFyaWFibGVNYXBwaW5nVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMEV4Y2VwdGlvbk1hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEVYQ0VQVElPTl9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldEphdmFXU0RMTWFwcGluZ19FeGNlcHRpb25NYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoRVhDRVBUSU9OX1RZUEUsIGpheHJwY21hcFBhY2thZ2UuZ2V0RXhjZXB0aW9uTWFwcGluZ19FeGNlcHRpb25UeXBlKCkpLAotCQkJY3JlYXRlMTBXU0RMTWVzc2FnZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1PcmRlclRyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTFFeGNlcHRpb25NYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihFWENFUFRJT05fTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKEVYQ0VQVElPTl9UWVBFLCBqYXhycGNtYXBQYWNrYWdlLmdldEV4Y2VwdGlvbk1hcHBpbmdfRXhjZXB0aW9uVHlwZSgpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVFOYW1lVHJhbnNsYXRvcihXU0RMX01FU1NBR0UsIGpheHJwY21hcFBhY2thZ2UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfTUVTU0FHRV9QQVJUX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCkpLAotCQkJY3JlYXRlQ29uc3RydWN0b3JQYXJhbU9yZGVyVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVJbnRlcmZhY2VNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldEphdmFXU0RMTWFwcGluZygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFDS0FHRV9UWVBFLCBqYXhycGNtYXBQYWNrYWdlLmdldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTkFNRVNQQUNFVVJJLCBqYXhycGNtYXBQYWNrYWdlLmdldFBhY2thZ2VNYXBwaW5nX05hbWVzcGFjZVVSSSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMFJvb3RUeXBlUW5hbWVUcmFuc2xhdG9yKCkgewotCSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJPT1RfVFlQRV9RTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfUm9vdFR5cGVRbmFtZSgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTkFNRVNQQUNFVVJJLCBjb21tb25QYWNrYWdlLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExPQ0FMUEFSVCwgY29tbW9uUGFja2FnZS5nZXRRTmFtZV9Mb2NhbFBhcnQoKSkJCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwVmFyaWFibGVNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihWQVJJQUJMRV9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldEphdmFYTUxUeXBlTWFwcGluZ19WYXJpYWJsZU1hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihKQVZBX1ZBUklBQkxFX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0VmFyaWFibGVNYXBwaW5nX0phdmFWYXJpYWJsZU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihEQVRBX01FTUJFUiwgamF4cnBjbWFwUGFja2FnZS5nZXRWYXJpYWJsZU1hcHBpbmdfRGF0YU1lbWJlcigpLCBUcmFuc2xhdG9yLkVNUFRZX1RBRyksCi0JCQluZXcgVHJhbnNsYXRvcihYTUxfRUxFTUVOVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFZhcmlhYmxlTWFwcGluZ19YbWxFbGVtZW50TmFtZSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTFWYXJpYWJsZU1hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFZBUklBQkxFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKEpBVkFfVkFSSUFCTEVfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRWYXJpYWJsZU1hcHBpbmdfSmF2YVZhcmlhYmxlTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERBVEFfTUVNQkVSLCBqYXhycGNtYXBQYWNrYWdlLmdldFZhcmlhYmxlTWFwcGluZ19EYXRhTWVtYmVyKCksIFRyYW5zbGF0b3IuRU1QVFlfVEFHKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFhNTF9BVFRSSUJVVEVfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sQXR0cmlidXRlTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFhNTF9FTEVNRU5UX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0VmFyaWFibGVNYXBwaW5nX1htbEVsZW1lbnROYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoWE1MX1dJTERDQVJELCBqYXhycGNtYXBQYWNrYWdlLmdldFZhcmlhYmxlTWFwcGluZ19YbWxXaWxkY2FyZCgpLCBUcmFuc2xhdG9yLkVNUFRZX1RBRykKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwV1NETE1lc3NhZ2VUcmFuc2xhdG9yKCkgewotCSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfTUVTU0FHRSwgamF4cnBjbWFwUGFja2FnZS5nZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0VVUkksIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxQQVJULCBjb21tb25QYWNrYWdlLmdldFFOYW1lX0xvY2FsUGFydCgpKQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlQ29uc3RydWN0b3JQYXJhbU9yZGVyVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKENPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiwgamF4cnBjbWFwUGFja2FnZS5nZXRFeGNlcHRpb25NYXBwaW5nX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBFbGVtZW50TmFtZVRyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFhtbE1hcHBlckkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvSmF4cnBjbWFwWG1sTWFwcGVySS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmZjODcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvSmF4cnBjbWFwWG1sTWFwcGVySS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLS8vaW1wb3J0cyBmb3IgSjJFRSBjb3JlIGNsYXNzZXMKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5EZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGNhdGFsb2cgb2YgYWxsIHRoZSB0YWcgbmFtZXMgd2hpY2ggb2NjdXIgaW4gCi0gKiBhbiB3ZWIgc2VydmljZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEludGVyZmFjZSBzaGFyZWQgYnkgcmVhZGVycyBhbmQgCi0gKiB3cml0ZXJzIHRvIGhhdmUgYWNjZXNzIHRvIGNvbW1vbiBjb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhycGNtYXBYbWxNYXBwZXJJIGV4dGVuZHMgV2ViU2VydmljZUNvbW1vblhtbE1hcHBlckkKLXsKLSAgcHVibGljIFN0cmluZyBKQVZBX1dTRExfTUFQUElORyAgICAgICAgICAgICAgICAgICAgICAgPSJqYXZhLXdzZGwtbWFwcGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBDTEFTU19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJjbGFzcy10eXBlIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgSkFWQV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ImphdmEtdHlwZSI7ICAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSICAgICAgICAgICAgID0iY29uc3RydWN0b3ItcGFyYW1ldGVyLW9yZGVyIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgREFUQV9NRU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0iZGF0YS1tZW1iZXIiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBFTEVNRU5UX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJlbGVtZW50LW5hbWUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBFWENFUFRJT05fTUFQUElORyAgICAgICAgICAgICAgICAgICAgICAgPSJleGNlcHRpb24tbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEVYQ0VQVElPTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICA9ImV4Y2VwdGlvbi10eXBlIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgSkFWQV9NRVRIT0RfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgID0iamF2YS1tZXRob2QtbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEpBVkFfUE9SVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICA9ImphdmEtcG9ydC1uYW1lIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgSkFWQV9WQVJJQUJMRV9OQU1FICAgICAgICAgICAgICAgICAgICAgID0iamF2YS12YXJpYWJsZS1uYW1lIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgSkFWQV9YTUxfVFlQRV9NQVBQSU5HICAgICAgICAgICAgICAgICAgID0iamF2YS14bWwtdHlwZS1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkcgICAgICAgICAgICAgID0ibWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBNRVRIT0RfUkVUVVJOX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgPSJtZXRob2QtcmV0dXJuLXZhbHVlIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUEFDS0FHRV9NQVBQSU5HICAgICAgICAgICAgICAgICAgICAgICAgID0icGFja2FnZS1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUEFDS0FHRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0icGFja2FnZS10eXBlIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUEFSQU1FVEVSX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgID0icGFyYW1ldGVyLW1vZGUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBQQVJBTV9QT1NJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSJwYXJhbS1wb3NpdGlvbiI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBBUkFNX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9InBhcmFtLXR5cGUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBQT1JUX01BUFBJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJwb3J0LW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBRTkFNRV9TQ09QRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJxbmFtZS1zY29wZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEFOT05ZTU9VU19UWVBFX1FOQU1FICAgICAgICAgICAgID0gImFub255bW91cy10eXBlLXFuYW1lIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUk9PVF9UWVBFX1FOQU1FICAgICAgICAgICAgICAgICAgICAgICAgID0icm9vdC10eXBlLXFuYW1lIjsvLyROT04tTkxTLTEkCi0gIC8vcHVibGljIFN0cmluZyBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSAgICAgICAgICAgICAgPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSI7Ci0gIHB1YmxpYyBTdHJpbmcgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElORyAgICAgID0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkcgICAgICAgICA9InNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLSAgLy9wdWJsaWMgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgICA9InNlcnZpY2UtaW50ZXJmYWNlIjsKLSAgcHVibGljIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HICAgICAgICAgICAgICAgPSJzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIC8vcHVibGljIFN0cmluZyBTT0FQX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJzb2FwX2hlYWRlciI7Ci0gIHB1YmxpYyBTdHJpbmcgVkFSSUFCTEVfTUFQUElORyAgICAgICAgICAgICAgICAgICAgICAgID0idmFyaWFibGUtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdSQVBQRURfRUxFTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICA9IndyYXBwZWQtZWxlbWVudCI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfQklORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IndzZGwtYmluZGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfTUVTU0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IndzZGwtbWVzc2FnZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfTUVTU0FHRV9NQVBQSU5HICAgICAgICAgICAgICAgICAgICA9IndzZGwtbWVzc2FnZS1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgV1NETF9NRVNTQUdFX1BBUlRfTkFNRSAgICAgICAgICAgICAgICAgID0id3NkbC1tZXNzYWdlLXBhcnQtbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfT1BFUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICA9IndzZGwtb3BlcmF0aW9uIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgV1NETF9QT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgID0id3NkbC1wb3J0LXR5cGUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HICAgICAgICAgICAgICAgPSJ3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgV1NETF9TRVJWSUNFX05BTUUgICAgICAgICAgICAgICAgICAgICAgID0id3NkbC1zZXJ2aWNlLW5hbWUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBYTUxfQVRUUklCVVRFX05BTUUgICAgICAgICAgICAgICAgICAgICAgICA9InhtbC1hdHRyaWJ1dGUtbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFhNTF9FTEVNRU5UX05BTUUgICAgICAgICAgICAgICAgICAgICAgICA9InhtbC1lbGVtZW50LW5hbWUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBYTUxfV0lMRENBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0ieG1sLXdpbGRjYXJkIjsvLyROT04tTkxTLTEkCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvU09BUFJvbGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1NPQVBSb2xlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBhMzVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvU09BUFJvbGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLQotcHVibGljIGNsYXNzIFNPQVBSb2xlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBXc2RkWG1sTWFwcGVySSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIFNPQVBfUk9MRV9YTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCW5ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBSb2xlX1NvYXBSb2xlKCkpCi0JfTsKLQkKLQlwdWJsaWMgU09BUFJvbGVUcmFuc2xhdG9yKCkgewotCQlzdXBlcihTT0FQX1JPTEUsIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBSb2xlcygpKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChvID09IG51bGwpCi0JCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47Ci0KLQkJcmV0dXJuIFNPQVBfUk9MRV9YTEFUT1JTOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldERPTU5hbWUoT2JqZWN0IHZhbHVlKSB7Ci0JICByZXR1cm4gU09BUF9ST0xFOwotCX0KLQotCQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlXc2NvbW1vbkZhY3RvcnkgZmFjdCA9IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3Njb21tb25GYWN0b3J5KCk7Ci0JCXJldHVybiBmYWN0LmNyZWF0ZVNPQVBSb2xlKCk7Ci0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9TZXJ2bGV0TGlua1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvU2VydmxldExpbmtUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmM2FiZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9TZXJ2bGV0TGlua1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLQotcHVibGljIGNsYXNzIFNlcnZsZXRMaW5rVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBXc2RkWG1sTWFwcGVySSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIFNFUlZMRVRfTElOS19YTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCW5ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldExpbmtfU2VydmxldExpbmsoKSkKLQl9OwotCQotCXB1YmxpYyBTZXJ2bGV0TGlua1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKFNFUlZMRVRfTElOSywgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKSk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwotCi0JCXJldHVybiBTRVJWTEVUX0xJTktfWExBVE9SUzsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRET01OYW1lKE9iamVjdCB2YWx1ZSkgewotCSAgcmV0dXJuIFNFUlZMRVRfTElOSzsKLQl9Ci0KLQkJCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJV3NkZEZhY3RvcnkgZmFjdCA9IFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXc2RkRmFjdG9yeSgpOwotCQlyZXR1cm4gZmFjdC5jcmVhdGVTZXJ2bGV0TGluaygpOwotCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV2ViU2VydmljZUNvbW1vblhtbE1hcHBlckkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV2ViU2VydmljZUNvbW1vblhtbE1hcHBlckkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmNjhjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VDb21tb25YbWxNYXBwZXJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlczsKLQotLy9pbXBvcnRzIGZvciBKMkVFIGNvcmUgY2xhc3NlcwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5EZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGNhdGFsb2cgb2YgYWxsIHRoZSB0YWcgbmFtZXMgd2hpY2ggb2NjdXIgaW4gCi0gKiBhbiB3ZWIgc2VydmljZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEludGVyZmFjZSBzaGFyZWQgYnkgcmVhZGVycyBhbmQgCi0gKiB3cml0ZXJzIHRvIGhhdmUgYWNjZXNzIHRvIGNvbW1vbiBjb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlQ29tbW9uWG1sTWFwcGVySSBleHRlbmRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySQotewotLy8gIHB1YmxpYyBTdHJpbmcgV1NETF9GSUxFICAgICAgICAgICAgICAgICAgICAgICA9ICJ3c2RsLWZpbGUiOwotLy8gIHB1YmxpYyBTdHJpbmcgSkFYUlBDX01BUFBJTkdfRklMRSAgICAgICAgICAgICA9ICJqYXhycGMtbWFwcGluZy1maWxlIjsKLSAgcHVibGljIFN0cmluZyBOQU1FU1BBQ0VVUkkgICAgICAgICAgICAgICAgICAgID0gIm5hbWVzcGFjZVVSSSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIExPQ0FMUEFSVCAgICAgICAgICAgICAgICAgICAgICAgPSAibG9jYWxwYXJ0IjsvLyROT04tTkxTLTEkCi0vLyAgcHVibGljIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSAgICAgICAgICAgICAgID0gInNlcnZpY2UtaW50ZXJmYWNlIjsKLSAgcHVibGljIFN0cmluZyBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSAgICAgID0gInNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIjsvLyROT04tTkxTLTEkCi0vLyAgcHVibGljIFN0cmluZyBIQU5ETEVSICAgICAgICAgICAgICAgICAgICAgICAgID0gImhhbmRsZXIiOwotLy8gIHB1YmxpYyBTdHJpbmcgSEFORExFUl9OQU1FICAgICAgICAgICAgICAgICAgICA9ICJoYW5kbGVyLW5hbWUiOwotLy8gIHB1YmxpYyBTdHJpbmcgSEFORExFUl9DTEFTUyAgICAgICAgICAgICAgICAgICA9ICJoYW5kbGVyLWNsYXNzIjsKLSAgcHVibGljIFN0cmluZyBJTklUX1BBUkFNICAgICAgICAgICAgICAgICAgICAgID0gImluaXQtcGFyYW0iOy8vJE5PTi1OTFMtMSQKLS8vICBwdWJsaWMgU3RyaW5nIFBBUkFNX05BTUUgICAgICAgICAgICAgICAgICAgICAgPSAicGFyYW0tbmFtZSI7Ci0vLyAgcHVibGljIFN0cmluZyBQQVJBTV9WQUxVRSAgICAgICAgICAgICAgICAgICAgID0gInBhcmFtLXZhbHVlIjsKLS8vICBwdWJsaWMgU3RyaW5nIFNPQVBfSEVBREVSICAgICAgICAgICAgICAgICAgICAgPSAic29hcC1oZWFkZXIiOwotLy8gIHB1YmxpYyBTdHJpbmcgU09BUF9ST0xFICAgICAgICAgICAgICAgICAgICAgICA9ICJzb2FwLXJvbGUiOwotLy8gIHB1YmxpYyBTdHJpbmcgUE9SVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICA9ICJwb3J0LW5hbWUiOwotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV2ViU2VydmljZXNUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWRlMWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV2ViU2VydmljZXNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uSmF2YUNsYXNzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuV2ViU2VydmljZXNEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc1RyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIFdlYlNlcnZpY2VzRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJewotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZXNUcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IFdlYlNlcnZpY2VzVHJhbnNsYXRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VTQ0xJRU5UID0gV0VCX1NFUlZJQ0VTX0NMSUVOVDsgCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uUGFja2FnZSBDT01NT05fUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQlwcml2YXRlIHN0YXRpYyAgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlIFdFQlNFUlZJQ0VDTElFTlRfUEtHID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMzsKLSAgICAKLQlwdWJsaWMgV2ViU2VydmljZXNUcmFuc2xhdG9yKCkgewotCQlzdXBlcihXRUJTRVJWSUNFU0NMSUVOVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKGNoaWxkcmVuMTMgPT0gbnVsbCkKLQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCXJldHVybiBjaGlsZHJlbjEzOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCWNyZWF0ZVNlcnZpY2VSZWZHcm91cFRyYW5zbGF0b3IxMyhudWxsKSwKLQkJCWNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnMxMygpCi0JCX07Ci0JfQotCS8qKgotCSAqIFRoaXMgbW9kZWwgd2FzIG1vZGVsIGZyb20gV2Vic3BoZXJlIFdlYnNlcnZpY2VzCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmljZVJlZkdyb3VwVHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlmZWF0dXJlID0gV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0V2ViU2VydmljZXNDbGllbnRfU2VydmljZVJlZnMoKTsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFUlZJQ0VfUkVGLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKCBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNFUlZJQ0VfUkVGX05BTUUsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKSksCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihTRVJWSUNFX0lOVEVSRkFDRSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoV1NETF9GSUxFLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoSkFYUlBDX01BUFBJTkdfRklMRSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpKSwKLQkJCWNyZWF0ZVFOYW1lVHJhbnNsYXRvcjEwKFNFUlZJQ0VfUU5BTUUsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCkpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUG9ydENvbXBvbmVudFJlZlRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyVHJhbnNsYXRvcjEzKCksCi0JCX0pOwotCQkKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIFRoaXMgbW9kZWwgd2FzIG1vZGVsIGZyb20gV2Vic3BoZXJlIFdlYnNlcnZpY2VzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlclRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEhBTkRMRVIsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoSEFORExFUl9OQU1FLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCkpLAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoSEFORExFUl9DTEFTUywgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKSksCi0JCQljcmVhdGVQYXJhbVZhbHVlVHlwZTEzKEhBTkRMRVJfSU5JVF9QQVJBTSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkpLAotCQkJY3JlYXRlUU5hbWVUcmFuc2xhdG9yMTAoU09BUF9IRUFERVIsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTT0FQX1JPTEUsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldEhhbmRsZXJfU29hcFJvbGVzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUE9SVF9OQU1FLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRIYW5kbGVyX1BvcnROYW1lcygpKQotCQl9KTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmczEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09NUF9TQ09QRURfUkVGUywgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0V2ViU2VydmljZXNDbGllbnRfQ29tcG9uZW50U2NvcGVkUmVmcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09NUF9DT01QT05FTlRfTkFNRSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnROYW1lKCkpLCAKLQkJCWNyZWF0ZVNlcnZpY2VSZWZHcm91cFRyYW5zbGF0b3IxMyhXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRDb21wb25lbnRTY29wZWRSZWZzX1NlcnZpY2VSZWZzKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUU5hbWVUcmFuc2xhdG9yMTAoU3RyaW5nIGRvbU5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CQkKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKGRvbU5hbWUsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0VVUkksIENPTU1PTl9QS0cuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxQQVJULCBDT01NT05fUEtHLmdldFFOYW1lX0xvY2FsUGFydCgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQYXJhbVZhbHVlVHlwZTEzKFN0cmluZyBkb21OYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSl7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihkb21OYW1lLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fTkFNRSwgQ09NTU9OX1BLRy5nZXRQYXJhbVZhbHVlX05hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9WQUxVRSwgQ09NTU9OX1BLRy5nZXRQYXJhbVZhbHVlX1ZhbHVlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbigpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dzZGRUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dzZGRUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyN2E1ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Cb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLldlYlNlcnZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5HZW5lcmljVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JRFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUm9vdFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi0KLQotcHVibGljIGNsYXNzIFdzZGRUcmFuc2xhdG9yIGV4dGVuZHMgUm9vdFRyYW5zbGF0b3IgaW1wbGVtZW50cyBXc2RkWG1sTWFwcGVySSwgSjJFRUNvbnN0YW50c3sKLQlwdWJsaWMgc3RhdGljIFdzZGRUcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IFdzZGRUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTA7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTE7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTI7Ci0KLQlwcml2YXRlIHN0YXRpYyBXc2RkUGFja2FnZSBXU0REX1BLRyA9IFdzZGRQYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBXc2NvbW1vblBhY2thZ2UgV1NDT01NT05fUEtHID0gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBDb21tb25QYWNrYWdlIENPTU1PTl9QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkKLQlwcm90ZWN0ZWQgV3NkZFRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKFdFQlNFUlZJQ0VTLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXMoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JICAgIAotCQkKLQotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJaWYgKGNoaWxkcmVuMTAgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWNoaWxkcmVuMTAgPSBjcmVhdGUxMENoaWxkcmVuKCk7Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbjEwOwkKLQkJCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0JCQkJaWYgKGNoaWxkcmVuMTEgPT0gbnVsbCkKLQkJCQkJewotCQkJCQkJY2hpbGRyZW4xMSA9IGNyZWF0ZTExQ2hpbGRyZW4oKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gY2hpbGRyZW4xMTsgCi0JCQlkZWZhdWx0IDoKLQkJCQlpZiAoY2hpbGRyZW4xMiA9PSBudWxsKQotCQkJCXsKLQkJCQkJY2hpbGRyZW4xMiA9IGNyZWF0ZTEyQ2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTI7IAotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEwQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwJCQkKLQkJCWNyZWF0ZTEwV2ViU2VydmljZURlc2NUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTExQ2hpbGRyZW4oKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OUywgSjJFRV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlNfWFNJLCBYU0lfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWFNJX1NDSEVNQV9MT0NBVElPTiwgSjJFRV9OU19VUkwrJyAnK1dlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfTE9DXzFfMSksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFZFUlNJT04sIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfVkVSU0lPTl8xXzEpLAkJCSAgCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwJCQkKLQkJCWNyZWF0ZTExV2ViU2VydmljZURlc2NUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi1wcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEyQ2hpbGRyZW4oKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OUywgSkFWQUVFX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OU19YU0ksIFhTSV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYU0lfU0NIRU1BX0xPQ0FUSU9OLCBKQVZBRUVfTlNfVVJMKycgJytXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX0xPQ18xXzIpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihWRVJTSU9OLCBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX1ZFUlNJT05fMV8yKSwJCQkgIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCQkJCi0JCQljcmVhdGUxMldlYlNlcnZpY2VEZXNjVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTBXZWJTZXJ2aWNlRGVzY1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXRUJTRVJWSUNFX0RFU0NSSVBUSU9OLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWUoKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fU21hbGxJY29uKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0xhcmdlSWNvbigpKSwJCQkJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFdFQlNFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRSwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX0ZJTEUsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Xc2RsRmlsZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKEpBWFJQQ19NQVBQSU5HX0ZJTEUsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9KYXhycGNNYXBwaW5nRmlsZSgpKSwJCQkKLQkJCWNyZWF0ZTEwUG9ydENvbXBvbmVudFRyYW5zbGF0b3IoKQkJCSAgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMVdlYlNlcnZpY2VEZXNjVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXRUJTRVJWSUNFX0RFU0NSSVBUSU9OLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGUxMURlc2NyaXB0aW9uVHJhbnNsYXRvcihXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCkpLAotCQkJY3JlYXRlMTFEaXNwbGF5TmFtZVRyYW5zbGF0b3IoV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpKSwJCQkKLQkJCWNyZWF0ZTExSWNvblRyYW5zbGF0b3IoV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0ljb25UeXBlKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoV0VCU0VSVklDRV9ERVNDUklQVElPTl9OQU1FLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfRklMRSwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dzZGxGaWxlKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoSkFYUlBDX01BUFBJTkdfRklMRSwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0pheHJwY01hcHBpbmdGaWxlKCkpLAkJCQotCQkJY3JlYXRlMTFQb3J0Q29tcG9uZW50VHJhbnNsYXRvcigpCQkJICAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkKLXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEyV2ViU2VydmljZURlc2NUcmFuc2xhdG9yKCkgewotCSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdFQlNFUlZJQ0VfREVTQ1JJUFRJT04sIFdTRERfUEtHLmdldFdlYlNlcnZpY2VzX1dlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCWNyZWF0ZTExRGVzY3JpcHRpb25UcmFuc2xhdG9yKFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvblR5cGUoKSksCi0JCQljcmVhdGUxMURpc3BsYXlOYW1lVHJhbnNsYXRvcihXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWVUeXBlKCkpLAkJCQotCQkJY3JlYXRlMTFJY29uVHJhbnNsYXRvcihXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihXRUJTRVJWSUNFX0RFU0NSSVBUSU9OX05BTUUsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9XZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoV1NETF9GSUxFLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV3NkbEZpbGUoKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihKQVhSUENfTUFQUElOR19GSUxFLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKSksCQkJCi0JCQljcmVhdGUxMlBvcnRDb21wb25lbnRUcmFuc2xhdG9yKCkJCQkgIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwUG9ydENvbXBvbmVudFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihQT1JUX0NPTVBPTkVOVCwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvbigpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfU21hbGxJY29uKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9MYXJnZUljb24oKSksCQkJCQkJCi0JCQluZXcgVHJhbnNsYXRvcihQT1JUX0NPTVBPTkVOVF9OQU1FLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1BvcnRDb21wb25lbnROYW1lKCkpLAotCQkJY3JlYXRlMTBXc2RsUG9ydFRyYW5zbGF0b3IoKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNFUlZJQ0VfRU5QT0lOVF9JTlRFUkZBQ0UsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpLAotCQkJY3JlYXRlU2VydmljZUltcGxCZWFuVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSGFuZGxlcjEwVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMVBvcnRDb21wb25lbnRUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUE9SVF9DT01QT05FTlQsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Qb3J0Q29tcG9uZW50cygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb24oKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWUoKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1NtYWxsSWNvbigpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfTGFyZ2VJY29uKCkpLAkJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFBPUlRfQ09NUE9ORU5UX05BTUUsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfUG9ydENvbXBvbmVudE5hbWUoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9QT1JULCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9FTlBPSU5UX0lOVEVSRkFDRSwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSksCi0JCQljcmVhdGVTZXJ2aWNlSW1wbEJlYW5UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVIYW5kbGVyMTFUcmFuc2xhdG9yKFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfSGFuZGxlcnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMlBvcnRDb21wb25lbnRUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUE9SVF9DT01QT05FTlQsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Qb3J0Q29tcG9uZW50cygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb24oKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWUoKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1NtYWxsSWNvbigpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfTGFyZ2VJY29uKCkpLAkJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFBPUlRfQ09NUE9ORU5UX05BTUUsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfUG9ydENvbXBvbmVudE5hbWUoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9TRVJWSUNFLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1dzZGxTZXJ2aWNlKCkpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFdTRExfUE9SVCwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpKSwKLQkJCW5ldyBCb29sZWFuVHJhbnNsYXRvcihFTkFCTEVfTVRPTSwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9FbmFibGVNdG9tKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUFJPVE9DT0xfQklORElORywgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9Qcm90b2NvbEJpbmRpbmcoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTRVJWSUNFX0VOUE9JTlRfSU5URVJGQUNFLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKSwKLQkJCWNyZWF0ZVNlcnZpY2VJbXBsQmVhblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUhhbmRsZXIxMVRyYW5zbGF0b3IoV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpKSwKLQkJCWNyZWF0ZUhhbmRsZXJDaGFpbnMxMlRyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTBXc2RsUG9ydFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXU0RMX1BPUlQsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgQ09NTU9OX1BLRy5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKSksCi0JCQluZXcgVHJhbnNsYXRvcihMT0NBTFBBUlQsIENPTU1PTl9QS0cuZ2V0UU5hbWVfTG9jYWxQYXJ0KCkpCQkJCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0JCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmljZUltcGxCZWFuVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFUlZJQ0VfSU1QTF9CRUFOLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VJbXBsQmVhbigpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFNlcnZsZXRMaW5rVHJhbnNsYXRvcigpLAotCQkJbmV3IEVKQkxpbmtUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlSGFuZGxlcjEwVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEhBTkRMRVIsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfSGFuZGxlcnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKEhBTkRMRVJfTkFNRSwgV1NERF9QS0cuZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEhBTkRMRVJfQ0xBU1MsIFdTRERfUEtHLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCkpLAkJCQotCQkJY3JlYXRlMTBJbml0UGFyYW1UcmFuc2xhdG9yKCksCi0JCQljcmVhdGUxMFNPQVBIZWFkZXJUcmFuc2xhdG9yKCksCi0JCQluZXcgU09BUFJvbGVUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUhhbmRsZXIxMVRyYW5zbGF0b3IoRVJlZmVyZW5jZSByZWZUeXBlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihIQU5ETEVSLCByZWZUeXBlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCQkJCi0JCQluZXcgVHJhbnNsYXRvcihIQU5ETEVSX05BTUUsIFdTRERfUEtHLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihIQU5ETEVSX0NMQVNTLCBXU0REX1BLRy5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpKSwJCQkKLQkJCWNyZWF0ZTExSW5pdFBhcmFtVHJhbnNsYXRvcigpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFNPQVBfSEVBREVSLCBXU0REX1BLRy5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkpLAotCQkJbmV3IFNPQVBSb2xlVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0JCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlSGFuZGxlckNoYWluczEyVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEhBTkRMRVJfQ0hBSU5TLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJDaGFpbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsJCi0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVIYW5kbGVyQ2hhaW4xMlRyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUhhbmRsZXJDaGFpbjEyVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEhBTkRMRVJfQ0hBSU4sIFdTRERfUEtHLmdldEhhbmRsZXJzQ2hhaW5zX0hhbmRsZXJDaGFpbigpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewkKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNFUlZJQ0VfTkFNRV9QQVRURVJOLCBXU0REX1BLRy5nZXRIYW5kbGVyQ2hhaW5fU2VydmljZU5hbWVQYXR0ZXJuKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUE9SVF9OQU1FX1BBVFRFUk4sIFdTRERfUEtHLmdldEhhbmRsZXJDaGFpbl9Qb3J0TmFtZVBhdHRlcm4oKSksCi0JCQluZXcgVHJhbnNsYXRvcihQUk9UT0NPTF9CSU5ESU5HUywgV1NERF9QS0cuZ2V0SGFuZGxlckNoYWluX1Byb3RvY29sQmluZGluZ3MoKSksCi0JCQljcmVhdGVIYW5kbGVyMTFUcmFuc2xhdG9yKFdTRERfUEtHLmdldEhhbmRsZXJDaGFpbl9IYW5kbGVycygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTBJbml0UGFyYW1UcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSU5JVF9QQVJBTSwgV1NERF9QS0cuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9OQU1FLCBXU0NPTU1PTl9QS0cuZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1ZBTFVFLCBXU0NPTU1PTl9QS0cuZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgV1NDT01NT05fUEtHLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvbigpKQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTFJbml0UGFyYW1UcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSU5JVF9QQVJBTSwgV1NERF9QS0cuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGUxMURlc2NyaXB0aW9uVHJhbnNsYXRvcihXU0NPTU1PTl9QS0cuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uVHlwZXMoKSksCQkJCQkJICAKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX05BTUUsIFdTQ09NTU9OX1BLRy5nZXRJbml0UGFyYW1fUGFyYW1OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fVkFMVUUsIFdTQ09NTU9OX1BLRy5nZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEySW5pdFBhcmFtVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKElOSVRfUEFSQU0sIFdTRERfUEtHLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlMTFEZXNjcmlwdGlvblRyYW5zbGF0b3IoV1NDT01NT05fUEtHLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCkpLAkJCQkJCSAgCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9OQU1FLCBXU0NPTU1PTl9QS0cuZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1ZBTFVFLCBXU0NPTU1PTl9QS0cuZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTBTT0FQSGVhZGVyVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNPQVBfSEVBREVSLCBXU0REX1BLRy5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0VVUkksIENPTU1PTl9QS0cuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxQQVJULCBDT01NT05fUEtHLmdldFFOYW1lX0xvY2FsUGFydCgpKQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTFEZXNjcmlwdGlvblRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihERVNDUklQVElPTiwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihMQU5HLCBDT01NT05fUEtHLmdldERlc2NyaXB0aW9uX0xhbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFRyYW5zbGF0b3IuVEVYVF9BVFRSSUJVVEVfVkFMVUUsIENPTU1PTl9QS0cuZ2V0RGVzY3JpcHRpb25fVmFsdWUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyAgVHJhbnNsYXRvciBjcmVhdGUxMURpc3BsYXlOYW1lVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgYWZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihMQU5HLCBDT01NT05fUEtHLmdldERpc3BsYXlOYW1lX0xhbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFRyYW5zbGF0b3IuVEVYVF9BVFRSSUJVVEVfVkFMVUUsIENPTU1PTl9QS0cuZ2V0RGlzcGxheU5hbWVfVmFsdWUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZTExSWNvblRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihJQ09OLCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKExBTkcsIENPTU1PTl9QS0cuZ2V0SWNvblR5cGVfTGFuZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpLAkJICAKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIENPTU1PTl9QS0cuZ2V0SWNvblR5cGVfU21hbGxJY29uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRJY29uVHlwZV9MYXJnZUljb24oKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dzZGRYbWxNYXBwZXJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dzZGRYbWxNYXBwZXJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzRhYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkWG1sTWFwcGVySS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLS8vaW1wb3J0cyBmb3IgSjJFRSBjb3JlIGNsYXNzZXMKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5EZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGNhdGFsb2cgb2YgYWxsIHRoZSB0YWcgbmFtZXMgd2hpY2ggb2NjdXIgaW4gCi0gKiBhbiB3ZWIgc2VydmljZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEludGVyZmFjZSBzaGFyZWQgYnkgcmVhZGVycyBhbmQgCi0gKiB3cml0ZXJzIHRvIGhhdmUgYWNjZXNzIHRvIGNvbW1vbiBjb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBXc2RkWG1sTWFwcGVySSBleHRlbmRzIFdlYlNlcnZpY2VDb21tb25YbWxNYXBwZXJJCi17Ci0gIHB1YmxpYyBTdHJpbmcgV0VCU0VSVklDRVMgICAgICAgICAgICAgICAgICAgICA9ICJ3ZWJzZXJ2aWNlcyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdFQlNFUlZJQ0VfREVTQ1JJUFRJT04gICAgICAgICAgPSAid2Vic2VydmljZS1kZXNjcmlwdGlvbiI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdFQlNFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRSAgICAgPSAid2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUE9SVF9DT01QT05FTlQgICAgICAgICAgICAgICAgICA9ICJwb3J0LWNvbXBvbmVudCI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBPUlRfQ09NUE9ORU5UX05BTUUgICAgICAgICAgICAgPSAicG9ydC1jb21wb25lbnQtbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgPSAid3NkbC1wb3J0IjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgV1NETF9TRVJWSUNFICAgICAgICAgICAgICAgICAgICA9ICJ3c2RsLXNlcnZpY2UiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBTRVJWSUNFX0lNUExfQkVBTiAgICAgICAgICAgICAgID0gInNlcnZpY2UtaW1wbC1iZWFuIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgU0VSVkxFVF9MSU5LICAgICAgICAgICAgICAgICAgICA9ICJzZXJ2bGV0LWxpbmsiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBFTkFCTEVfTVRPTQkJCQkJCT0gImVuYWJsZS1tdG9tIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUFJPVE9DT0xfQklORElORwkJCQk9ICJwcm90b2NvbC1iaW5kaW5nIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgSEFORExFUl9DSEFJTlMJCQkJCT0gImhhbmRsZXItY2hhaW5zIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgSEFORExFUl9DSEFJTgkJCQkJPSAiaGFuZGxlci1jaGFpbiI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBST1RPQ09MX0JJTkRJTkdTCQkJCT0gInByb3RvY29sLWJpbmRpbmdzIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgU0VSVklDRV9OQU1FX1BBVFRFUk4JCQk9ICJzZXJ2aWNlLW5hbWUtcGF0dGVybiI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBPUlRfTkFNRV9QQVRURVJOCQkJCT0gInBvcnQtbmFtZS1wYXRlcm4iOy8vJE5PTi1OTFMtMSQKLSAgLy9FSkJfTElOSyBpcyBkZWZpbmVkIGluIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySQotICAvL3B1YmxpYyBTdHJpbmcgRUpCX0xJTksgICAgICAgICAgICAgICAgICAgICAgICA9ICJlamItbGluayI7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0NvbGxlY3RpbmdFcnJvckhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9Db2xsZWN0aW5nRXJyb3JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzM3ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0NvbGxlY3RpbmdFcnJvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDMvMTkvMDEgMTE6MTA6MzggQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW5nRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKLQlwcm90ZWN0ZWQgTGlzdCBjYXVnaHRFeGNlcHRpb25zOwotLyoqCi0gKiBDb2xsZWN0aW5nRXJyb3JIYW5kbGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBDb2xsZWN0aW5nRXJyb3JIYW5kbGVyKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyCi0gKi8KLXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpLmFkZChleGNlcHRpb24pOwotfQotLyoqCi0gKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcgotICovCi1wdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpLmFkZChleGNlcHRpb24pOwotfQotcHVibGljIExpc3QgZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpIHsKLQlpZiAoY2F1Z2h0RXhjZXB0aW9ucyA9PSBudWxsKSB7Ci0JCWNhdWdodEV4Y2VwdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCXJldHVybiBjYXVnaHRFeGNlcHRpb25zOwotfQotCi0vKioKLSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyCi0gKi8KLXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQlnZXRDYXVnaHRFeGNlcHRpb25zKCkuYWRkKGV4Y2VwdGlvbik7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0RlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0RlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxOGQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9EZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjYXRhbG9nIG9mIGFsbCB0aGUgdGFnIG5hbWVzIHdoaWNoIG1heSBiZSBzaGFyZWQgaW4gCi0gKiBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgRUpCSmFycywgZWFycywgYW5kIHdhcnMuIEludGVyZmFjZSBzaGFyZWQgYnkgcmVhZGVycyBhbmQgCi0gKiB3cml0ZXJzIHRvIGhhdmUgYWNjZXNzIHRvIGNvbW1vbiBjb25zdGFudHMKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIERJU1BMQVlfTkFNRSA9ICJkaXNwbGF5LW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCX0xJTksgPSAiZWpiLWxpbmsiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5WX0VOVFJZID0gImVudi1lbnRyeSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFTlZfRU5UUllfTkFNRSA9ICJlbnYtZW50cnktbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFTlZfRU5UUllfVFlQRSA9ICJlbnYtZW50cnktdHlwZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFTlZfRU5UUllfVkFMVUUgPSAiZW52LWVudHJ5LXZhbHVlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVKQl9MT0NBTF9SRUYgPSAiZWpiLWxvY2FsLXJlZiI7CS8vJE5PTi1OTFMtMSQJCQkJLy8gSjJFRTEuMwotCVN0cmluZyBFSkJfUkVGID0gImVqYi1yZWYiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCX1JFRl9OQU1FID0gImVqYi1yZWYtbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFSkJfUkVGX1RZUEUgPSAiZWpiLXJlZi10eXBlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEhPTUUgPSAiaG9tZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJQ09OID0gImljb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSUQgPSAiaWQiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTEFSR0VfSUNPTiA9ICJsYXJnZS1pY29uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIExBUkdFX0lDT05fUEFUSCA9ICJpY29uL2xhcmdlLWljb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTE9DQUwgPSAibG9jYWwiOy8vJE5PTi1OTFMtMSQJCQkJCQkJCQkvLyBKMkVFMS4zCi0JU3RyaW5nIExPQ0FMX0hPTUUgPSAibG9jYWwtaG9tZSI7Ly8kTk9OLU5MUy0xJAkJCQkJCS8vIEoyRUUxLjMKLQlTdHJpbmcgUkVNT1RFID0gInJlbW90ZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBSRVNfQVVUSCA9ICJyZXMtYXV0aCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBSRVNfUkVGX05BTUUgPSAicmVzLXJlZi1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFU19TSEFSSU5HX1NDT1BFID0gInJlcy1zaGFyaW5nLXNjb3BlIjsvLyROT04tTkxTLTEkIAkJLy8gSjJFRTEuMyAKLQlTdHJpbmcgUkVTX1RZUEUgPSAicmVzLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVTT1VSQ0VfRU5WX1JFRiA9ICJyZXNvdXJjZS1lbnYtcmVmIjsgLy8kTk9OLU5MUy0xJAkJCS8vIEoyRUUxLjMKLQlTdHJpbmcgUkVTT1VSQ0VfRU5WX1JFRl9OQU1FID0gInJlc291cmNlLWVudi1yZWYtbmFtZSI7Ly8kTk9OLU5MUy0xJCAvLyBKMkVFMS4zCi0JU3RyaW5nIFJFU09VUkNFX0VOVl9SRUZfVFlQRSA9ICJyZXNvdXJjZS1lbnYtcmVmLXR5cGUiOy8vJE5PTi1OTFMtMSQgLy8gSjJFRTEuMwotCVN0cmluZyBSRVNPVVJDRV9SRUYgPSAicmVzb3VyY2UtcmVmIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJPTEVfTElOSyA9ICJyb2xlLWxpbmsiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUk9MRV9OQU1FID0gInJvbGUtbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBSVU5fQVMgPSAicnVuLWFzIjsJLy8kTk9OLU5MUy0xJAkJCQkJCQkvLyBKMkVFMS4zCi0JU3RyaW5nIFNFQ1VSSVRZX0lERU5USVRZID0gInNlY3VyaXR5LWlkZW50aXR5IjsJLy8kTk9OLU5MUy0xJAkJLy8gSjJFRTEuMwotCVN0cmluZyBTRUNVUklUWV9ST0xFID0gInNlY3VyaXR5LXJvbGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0VDVVJJVFlfUk9MRV9SRUYgPSAic2VjdXJpdHktcm9sZS1yZWYiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU01BTExfSUNPTiA9ICJzbWFsbC1pY29uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNNQUxMX0lDT05fUEFUSCA9ICJpY29uL3NtYWxsLWljb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVNFX0NBTExFUl9JREVOVElUWSA9ICJ1c2UtY2FsbGVyLWlkZW50aXR5IjsvLyROT04tTkxTLTEkCQkvLyBKMkVFMS4zCi0JCi0JCi0JLy8JSjJFRSAxLjQKLQlTdHJpbmcgTEFORyA9ICJ4bWw6bGFuZyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBERVBMT1lfRVhUID0gImRlcGxveW1lbnQtZXh0ZW5zaW9uIjsJCS8vJE5PTi1OTFMtMSQJCS8vIEoyRUUxLjQKLQlTdHJpbmcgRVhUX0VMRU1FTlQgPSAiZXh0ZW5zaW9uLWVsZW1lbnQiOwkvLyROT04tTkxTLTEkCQkJLy8gSjJFRTEuNAotCVN0cmluZyBNRVNTQUdFX0RFU1RfUkVGID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIjsvLyROT04tTkxTLTEkCS8vIEoyRUUxLjQKLQlTdHJpbmcgTUVTU0FHRV9ERVNUX1JFRl9OQU1FID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiOy8vJE5PTi1OTFMtMSQJLy8gSjJFRTEuNAotCVN0cmluZyBNRVNTQUdFX0RFU1RfVFlQRSA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiOy8vJE5PTi1OTFMtMSQJCQkvLyBKMkVFMS40Ci0JU3RyaW5nIE1FU1NBR0VfREVTVF9MSU5LID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tbGluayI7CS8vJE5PTi1OTFMtMSQJCS8vIEoyRUUxLjQKLQlTdHJpbmcgTUVTU0FHRV9ERVNUX1VTQUdFID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UiOy8vJE5PTi1OTFMtMSQJCS8vIEoyRUUxLjQKLQlTdHJpbmcgTUVTU0FHRV9ERVNUID0gIm1lc3NhZ2UtZGVzdGluYXRpb24iOwkvLyROT04tTkxTLTEkCQkJLy8gSjJFRTEuNAotCVN0cmluZyBNRVNTQUdFX0RFU1RfTkFNRSA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUiOwkvLyROT04tTkxTLTEkCQkJLy8gSjJFRTEuNAotCVN0cmluZyBTRVJWSUNFX1JFRiA9ICJzZXJ2aWNlLXJlZiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTRVJWSUNFX1JFRl9OQU1FID0gInNlcnZpY2UtcmVmLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPSAic2VydmljZS1pbnRlcmZhY2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgV1NETF9GSUxFID0gIndzZGwtZmlsZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVhSUENfTUFQUElOR19GSUxFID0gImpheHJwYy1tYXBwaW5nLWZpbGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0VSVklDRV9RTkFNRSA9ICJzZXJ2aWNlLXFuYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBPUlRfQ09NUE9ORU5UX1JFRiA9ICJwb3J0LWNvbXBvbmVudC1yZWYiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSEFORExFUiA9ICJoYW5kbGVyIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNFUlZJQ0VfRU5QT0lOVF9JTlRFUkZBQ0UgPSAic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUE9SVF9DT01QT05FTlRfTElOSyA9ICJwb3J0LWNvbXBvbmVudC1saW5rIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEhBTkRMRVJfTkFNRSA9ICJoYW5kbGVyLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSEFORExFUl9DTEFTUyA9ICJoYW5kbGVyLWNsYXNzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEhBTkRMRVJfSU5JVF9QQVJBTSA9ICJpbml0LXBhcmFtIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNPQVBfSEVBREVSID0gInNvYXAtaGVhZGVyIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNPQVBfUk9MRSA9ICJzb2FwLXJvbGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUE9SVF9OQU1FID0gInBvcnQtbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBWRVJTSU9OID0gInZlcnNpb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX05TID0gInhtbG5zIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9OU19YU0kgPSAieG1sbnM6eHNpIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhTSV9TQ0hFTUFfTE9DQVRJT04gPSAieHNpOnNjaGVtYUxvY2F0aW9uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTVVTVFVOREVSU1RBTkQgPSAibXVzdFVuZGVyc3RhbmQiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEFSQU1fTkFNRSA9ICJwYXJhbS1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBBUkFNX1ZBTFVFID0gInBhcmFtLXZhbHVlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIExJU1RFTkVSX0NMQVNTID0gImxpc3RlbmVyLWNsYXNzIjsvLyROT04tTkxTLTEkCS8vIFNlcnZsZXQyLjMKLQkKLQkKLQkKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvRWFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvRWFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzgyZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0VhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGNhdGFsb2cgb2YgYWxsIHRoZSB0YWcgbmFtZXMgd2hpY2ggb2NjdXIgaW4gCi0gKiBhbiBFQVIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJbnRlcmZhY2Ugc2hhcmVkIGJ5IHJlYWRlcnMgYW5kIAotICogd3JpdGVycyB0byBoYXZlIGFjY2VzcyB0byBjb21tb24gY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIGV4dGVuZHMgRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQlTdHJpbmcgQUxUX0REID0gImFsdC1kZCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBBUFBMSUNBVElPTiA9ICJhcHBsaWNhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05URVhUX1JPT1QgPSAiY29udGV4dC1yb290IjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVKQiA9ICJlamIiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQSA9ICJqYXZhIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1PRFVMRSA9ICJtb2R1bGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgV0VCID0gIndlYiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBXRUJfVVJJID0gIndlYi11cmkiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09OTkVDVE9SID0gImNvbm5lY3RvciI7Ly8kTk9OLU5MUy0xJAotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3ZWNiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgY2F0YWxvZyBvZiBhbGwgdGhlIHRhZyBuYW1lcyB3aGljaCBvY2N1ciBpbiAKLSAqIGFuIEVKQiBKYXIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJbnRlcmZhY2Ugc2hhcmVkIGJ5IHJlYWRlcnMgYW5kIAotICogd3JpdGVycyB0byBoYXZlIGFjY2VzcyB0byBjb21tb24gY29uc3RhbnRzCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgZXh0ZW5kcyBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCVN0cmluZyBBQlNUUkFDVF9TQ0hFTUFfTkFNRSA9ICJhYnN0cmFjdC1zY2hlbWEtbmFtZSI7IC8vJE5PTi1OTFMtMSQJLy8gRUpCMi4wCi0JU3RyaW5nIEFDS05PV0xFREdFX01PREUgPSAiYWNrbm93bGVkZ2UtbW9kZSI7Ly8kTk9OLU5MUy0xJCAJCQkvLyBFSkIyLjAKLQlTdHJpbmcgQVNTRU1CTFlfREVTQ1JJUFRPUiA9ICJhc3NlbWJseS1kZXNjcmlwdG9yIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEJFQU4gPSAiQmVhbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDQVNDQURFX0RFTEVURSA9ICJjYXNjYWRlLWRlbGV0ZSI7Ly8kTk9OLU5MUy0xJCAJCQkJLy8gRUpCMi4wCi0JU3RyaW5nIENNUF9GSUVMRCA9ICJjbXAtZmllbGQiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ01QX1ZFUlNJT04gPSAiY21wLXZlcnNpb24iOwkJLy8kTk9OLU5MUy0xJAkJCQkvLyBFSkIyLjAKLQlTdHJpbmcgQ01SX0ZJRUxEID0gImNtci1maWVsZCI7CQkvLyROT04tTkxTLTEkCQkJCQkvLyBFSkIyLjAKLQlTdHJpbmcgQ01SX0ZJRUxEX05BTUUgPSAiY21yLWZpZWxkLW5hbWUiOy8vJE5PTi1OTFMtMSQJCQkJLy8gRUpCMi4wCi0JU3RyaW5nIENNUl9GSUVMRF9UWVBFID0gImNtci1maWVsZC10eXBlIjsvLyROT04tTkxTLTEkCQkJCS8vIEVKQjIuMAotCVN0cmluZyBDT05UQUlORVIgPSAiQ29udGFpbmVyIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlRBSU5FUl9UUkFOU0FDVElPTiA9ICJjb250YWluZXItdHJhbnNhY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVTVElOQVRJT05fVFlQRSA9ICJkZXN0aW5hdGlvbi10eXBlIjsJLy8kTk9OLU5MUy0xJAkJLy8gRUpCMi4wCi0JU3RyaW5nIEVKQl9DTEFTUyA9ICJlamItY2xhc3MiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCX0NMSUVOVF9KQVIgPSAiZWpiLWNsaWVudC1qYXIiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCX0pBUiA9ICJlamItamFyIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVKQl9OQU1FID0gImVqYi1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVKQl9RTCA9ICJlamItcWwiOwkJLy8kTk9OLU5MUy0xJAkJCQkJCS8vIEVKQjIuMAotCVN0cmluZyBFSkJfUkVMQVRJT04gPSAiZWpiLXJlbGF0aW9uIjsvLyROT04tTkxTLTEkCQkJCQkvLyBFSkIyLjAKLQlTdHJpbmcgRUpCX1JFTEFUSU9OX05BTUUgPSAiZWpiLXJlbGF0aW9uLW5hbWUiOwkvLyROT04tTkxTLTEkCQkvLyBFSkIyLjAKLQlTdHJpbmcgRUpCX1JFTEFUSU9OU0hJUF9ST0xFID0gImVqYi1yZWxhdGlvbnNoaXAtcm9sZSI7Ly8kTk9OLU5MUy0xJAkvLyBFSkIyLjAKLQlTdHJpbmcgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX05BTUUgPSAiZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiOy8vJE5PTi1OTFMtMSQgLy8gRUpCMi4wCi0JU3RyaW5nIEVOVEVSUFJJU0VfQkVBTlMgPSAiZW50ZXJwcmlzZS1iZWFucyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFTlRJVFkgPSAiZW50aXR5IjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYQ0xVREVfTElTVCA9ICJleGNsdWRlLWxpc3QiOwkvLyROT04tTkxTLTEkLy8gRUpCMi4wIC0gTU9ERUxFRD8/PwotCVN0cmluZyBGSUVMRF9OQU1FID0gImZpZWxkLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVTU0FHRV9EUklWRU4gPSAibWVzc2FnZS1kcml2ZW4iOwkvLyROT04tTkxTLTEkCQkJLy8gRUpCMi4wCi0JU3RyaW5nIE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OID0gIm1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uIjsgLy8kTk9OLU5MUy0xJC8vIEVKQjIuMAotCVN0cmluZyBNRVNTQUdFX1NFTEVDVE9SID0gIm1lc3NhZ2Utc2VsZWN0b3IiOwkvLyROT04tTkxTLTEkCQkvLyBFSkIyLjAKLQlTdHJpbmcgTUVUSE9EID0gIm1ldGhvZCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVRIT0RfSU5URiA9ICJtZXRob2QtaW50ZiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVRIT0RfTkFNRSA9ICJtZXRob2QtbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVRIT0RfUEFSQU0gPSAibWV0aG9kLXBhcmFtIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1FVEhPRF9QQVJBTVMgPSAibWV0aG9kLXBhcmFtcyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVRIT0RfUEVSTUlTU0lPTiA9ICJtZXRob2QtcGVybWlzc2lvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNVUxUSVBMSUNJVFkgPSAibXVsdGlwbGljaXR5IjsvLyROT04tTkxTLTEkCQkJCQkvLyBFSkIyLjAKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVFlQRSA9ICJwZXJzaXN0ZW5jZS10eXBlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBSSU1fS0VZX0NMQVNTID0gInByaW0ta2V5LWNsYXNzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBSSU1LRVlfRklFTEQgPSAicHJpbWtleS1maWVsZCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBSRUVOVFJBTlQgPSAicmVlbnRyYW50IjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRSA9ICJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UiOy8vJE5PTi1OTFMtMSQgLy8gRUpCMi4wCi0JU3RyaW5nIFJFTEFUSU9OU0hJUFMgPSAicmVsYXRpb25zaGlwcyI7IAkvLyROT04tTkxTLTEkCQkJLy8gRUpCMi4wCi0JU3RyaW5nIFJFU1VMVF9UWVBFX01BUFBJTkcgPSAicmVzdWx0LXR5cGUtbWFwcGluZyI7CS8vJE5PTi1OTFMtMSQJLy8gRUpCMi4wCi0JU3RyaW5nIFFVRVJZID0gInF1ZXJ5IjsJCQkvLyROT04tTkxTLTEkCQkJCQkJLy8gRUpCMi4wCi0JU3RyaW5nIFFVRVJZX01FVEhPRCA9ICJxdWVyeS1tZXRob2QiOwkvLyROT04tTkxTLTEkCQkJCS8vIEVKQjIuMAotCVN0cmluZyBTRVNTSU9OID0gInNlc3Npb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0VTU0lPTl9UWVBFID0gInNlc3Npb24tdHlwZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTVUJTQ1JJUFRJT05fRFVSQUJJTElUWSA9ICJzdWJzY3JpcHRpb24tZHVyYWJpbGl0eSI7Ly8kTk9OLU5MUy0xJCAvLyBFSkIyLjAKLQlTdHJpbmcgVFJBTlNfQVRUUklCVVRFID0gInRyYW5zLWF0dHJpYnV0ZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBUUkFOU0FDVElPTl9UWVBFID0gInRyYW5zYWN0aW9uLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVU5DSEVDS0VEID0gInVuY2hlY2tlZCI7CQkJLy8kTk9OLU5MUy0xJAkJCQkvLyBFSkIyLjAKLQotCS8vRUpCIDIuMQkKLQlTdHJpbmcgU0VSVklDRV9FTkRQT0lOVCA9ICJzZXJ2aWNlLWVuZHBvaW50IjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1FU1NBR0lOR19UWVBFID0gIm1lc3NhZ2luZy10eXBlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1FU1NBR0VfREVTVF9UWVBFID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVNTQUdFX0RFU1RfTElOSyA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQUNUSVZBVElPTl9DT05GID0gImFjdGl2YXRpb24tY29uZmlnIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFDVElWQVRJT05fQ09ORl9QUk9QRVJUWSA9ICJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBBQ1RJVkFUSU9OX0NPTkZfUFJPUEVSVFlfTkFNRSA9ICJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFDVElWQVRJT05fQ09ORl9QUk9QRVJUWV9WQUxVRSA9ICJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSI7Ly8kTk9OLU5MUy0xJAotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9HZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9HZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiYTk3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvR2VuZXJhbFhtbERvY3VtZW50UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTE6NTg6NTAgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIKLXsKLSAgICBwcm90ZWN0ZWQgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2U7Ci0gICAgcHJvdGVjdGVkIEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyOwotICAgIHByb3RlY3RlZCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyOwotICAgIHByb3RlY3RlZCBib29sZWFuIGRvVmFsaWRhdGUgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb0FsbG93SmF2YUVuY29kaW5ncyA9IGZhbHNlOwotCi0vKioKLSAqIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi0gICAgcHVibGljIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlcigpIAotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0vKioKLSAqIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi0gICAgcHVibGljIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlcihJbnB1dFNvdXJjZSBzb3VyY2UpIAotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0SW5wdXRTb3VyY2Uoc291cmNlKTsKLSAgICB9Ci0vKioKLSAqIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi0gICAgcHVibGljIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlcihJbnB1dFNvdXJjZSBzb3VyY2UsIEVudGl0eVJlc29sdmVyIHJlc29sdmVyLCBFcnJvckhhbmRsZXIgaGFuZGxlcikgCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXRJbnB1dFNvdXJjZShzb3VyY2UpOwotICAgICAgICBzZXRFbnRpdHlSZXNvbHZlcihyZXNvbHZlcik7Ci0gICAgICAgIHNldEVycm9ySGFuZGxlcihoYW5kbGVyKTsKLSAgICB9Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDQ6MTggUE0pCi0gKiBAcmV0dXJuIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyCi0gKi8KLSAgICBwcm90ZWN0ZWQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgY3JlYXRlRGVmYXVsdEVudGl0eVJlc29sdmVyKCkgCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDQ6MTggUE0pCi0gKiBAcmV0dXJuIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcgotICovCi0gICAgcHJvdGVjdGVkIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciBjcmVhdGVEZWZhdWx0RXJyb3JIYW5kbGVyKCkgCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVycm9ySGFuZGxlcigpIHsKLSAgICAgICAgCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJCX0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQl0aHJvdyBleGNlcHRpb247Ci0JCQl9Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoZXhjZXB0aW9uKTsKLQkJCX0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBjcmVhdGVOZXdET01QYXJzZXIoKSAKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIHNldEZlYXR1cmVzKGRiZik7Ci0gICAgICAgICAgICByZXR1cm4gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBpZSkKLSAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFhNTFBhcnNlUmVzb3VyY2VIYW5kbGVyLmZhaWxlZF9pbnN0YW50aWF0aW5nX0VYQ18sIChuZXcgT2JqZWN0W10geyJGYWlsZWQgdG8gaW5zdGFudGlhdGUgcGFyc2VyIn0pKSwgaWUpOyAvLyROT04tTkxTLTEkIC8vID0gIkZhaWxlZCBpbnN0YW50aWF0aW5nOiAiCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEyOjAxOjM0IFBNKQotICogQHJldHVybiBib29sZWFuCi0gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkb0FsbG93SmF2YUVuY29kaW5ncygpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvQWxsb3dKYXZhRW5jb2RpbmdzOwotICAgIH0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowMTozNCBQTSkKLSAqIEByZXR1cm4gYm9vbGVhbgotICovCi0gICAgcHVibGljIGJvb2xlYW4gZG9WYWxpZGF0ZSgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvVmFsaWRhdGU7Ci0gICAgfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDE6MzQ6MTQgUE0pCi0gKiBAcmV0dXJuIGphdmEubGFuZy5DbGFzc0xvYWRlcgotICovCi0gICAgcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIAotICAgIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIGlmIChjbCA9PSBudWxsKQotICAgICAgICAgICAgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBpZiAoY2wgPT0gbnVsbCkKLSAgICAgICAgICAgIGNsID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotICAgIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhcnNlRG9jdW1lbnQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGdldERvY3VtZW50KGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkb21QYXJzZXIpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvbVBhcnNlci5uZXdEb2N1bWVudCgpOwotICAgIH0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDQ6MTggUE0pCi0gKiBAcmV0dXJuIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyCi0gKi8KLSAgICBwdWJsaWMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSAKLSAgICB7Ci0gICAgICAgIGlmIChlbnRpdHlSZXNvbHZlciA9PSBudWxsKQotICAgICAgICAgICAgZW50aXR5UmVzb2x2ZXIgPSBjcmVhdGVEZWZhdWx0RW50aXR5UmVzb2x2ZXIoKTsKLSAgICAgICAgcmV0dXJuIGVudGl0eVJlc29sdmVyOwotICAgIH0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowNDoxOCBQTSkKLSAqIEByZXR1cm4gb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyCi0gKi8KLSAgICBwdWJsaWMgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcigpIAotICAgIHsKLSAgICAgICAgaWYgKGVycm9ySGFuZGxlciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBjcmVhdGVEZWZhdWx0RXJyb3JIYW5kbGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycm9ySGFuZGxlcjsKLSAgICB9Ci0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowNDoxOCBQTSkKLSAqIEByZXR1cm4gb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UKLSAqLwotICAgIHB1YmxpYyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSBnZXRJbnB1dFNvdXJjZSgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGlucHV0U291cmNlOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFeGNlcHRpb24oU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgYW5FeGNlcHRpb24pIAotICAgIHsKLSAgICAgICAgaWYgKGFuRXhjZXB0aW9uIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpbnZvY2F0aW9uRXggPQotICAgICAgICAgICAgKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGFuRXhjZXB0aW9uOwotICAgICAgICAgICAgaWYgKGludm9jYXRpb25FeC5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihhTWVzc2FnZSwgaW52b2NhdGlvbkV4LmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmltSGFuZGxlRXhjZXB0aW9uKGFNZXNzYWdlLCBhbkV4Y2VwdGlvbik7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBEb2N1bWVudCBwYXJzZShqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZG9tUGFyc2VyLCBJbnB1dFNvdXJjZSBpcykgCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRvbVBhcnNlci5wYXJzZShpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFhNTFBhcnNlUmVzb3VyY2VIYW5kbGVyLmZhaWxlZF9pbnN0YW50aWF0aW5nX0VYQ18sIChuZXcgT2JqZWN0W10geyJTQVggUGFyc2VyIGVycm9yIn0pKSwgZXgpOyAvLyROT04tTkxTLTEkIC8vID0gIkZhaWxlZCBpbnN0YW50aWF0aW5nOiAiCi0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFhNTFBhcnNlUmVzb3VyY2VIYW5kbGVyLmZhaWxlZF9pbnN0YW50aWF0aW5nX0VYQ18sIChuZXcgT2JqZWN0W10geyJJTyBFeGNlcHRpb24gb24gaW5wdXQgc3RyZWFtIn0pKSwgZXgpOyAvLyROT04tTkxTLTEkIC8vID0gIkZhaWxlZCBpbnN0YW50aWF0aW5nOiAiCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgRG9jdW1lbnQgcGFyc2VEb2N1bWVudCgpIAotICAgIHsKLSAgICAJQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAJdHJ5IHsKLSAgICAJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCQlqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gY3JlYXRlTmV3RE9NUGFyc2VyKCk7Ci0gICAgICAgIAlzZXRFbnRpdHlSZXNvbHZlcihwYXJzZXIpOwotICAgICAgICAJc2V0RXJyb3JIYW5kbGVyKHBhcnNlcik7Ci0gICAgICAgIAlyZXR1cm4gcGFyc2UocGFyc2VyLCBnZXRJbnB1dFNvdXJjZSgpKTsKLQl9IGZpbmFsbHkgewotICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIocHJldkNsYXNzTG9hZGVyKTsKLQl9Ci0gICAgCQotICAgIAkKLSAgICAJCi0gICAgCQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbUhhbmRsZUV4Y2VwdGlvbihTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBhbkV4Y2VwdGlvbikgCi0gICAgewotICAgICAgICBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGFuRXhjZXB0aW9uKTsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYU1lc3NhZ2UpOwotCi0gICAgfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEyOjAxOjM0IFBNKQotICogQHBhcmFtIG5ld0FsbG93SmF2YUVuY29kaW5ncyBib29sZWFuCi0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd0phdmFFbmNvZGluZ3MoYm9vbGVhbiBuZXdBbGxvd0phdmFFbmNvZGluZ3MpIAotICAgIHsKLSAgICAgICAgZG9BbGxvd0phdmFFbmNvZGluZ3MgPSBuZXdBbGxvd0phdmFFbmNvZGluZ3M7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldEVudGl0eVJlc29sdmVyKGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkb21QYXJzZXIpIAotICAgIHsKLSAgICAgICAgaWYgKGdldEVudGl0eVJlc29sdmVyKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZG9tUGFyc2VyLnNldEVudGl0eVJlc29sdmVyKGdldEVudGl0eVJlc29sdmVyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowNDoxOCBQTSkKLSAqIEBwYXJhbSBuZXdFbnRpdHlSZXNvbHZlciBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcgotICovCi0gICAgcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIob3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgbmV3RW50aXR5UmVzb2x2ZXIpIAotICAgIHsKLSAgICAgICAgZW50aXR5UmVzb2x2ZXIgPSBuZXdFbnRpdHlSZXNvbHZlcjsKLSAgICB9Ci0gICAgCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvckhhbmRsZXIoamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRvbVBhcnNlcikgCi0gICAgewotICAgICAgICBpZiAoZ2V0RXJyb3JIYW5kbGVyKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZG9tUGFyc2VyLnNldEVycm9ySGFuZGxlcihnZXRFcnJvckhhbmRsZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEyOjA0OjE4IFBNKQotICogQHBhcmFtIG5ld0Vycm9ySGFuZGxlciBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9ySGFuZGxlcihvcmcueG1sLnNheC5FcnJvckhhbmRsZXIgbmV3RXJyb3JIYW5kbGVyKSAKLSAgICB7Ci0gICAgICAgIGVycm9ySGFuZGxlciA9IG5ld0Vycm9ySGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRGZWF0dXJlcyhqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvbVBhcnNlcikgCi0gICAgewotICAgICAgICB0cnkgewotCQkJZG9tUGFyc2VyLnNldFZhbGlkYXRpbmcoZG9WYWxpZGF0ZSgpKTsKLQkgICAgICAgIGRvbVBhcnNlci5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9hbGxvdy1qYXZhLWVuY29kaW5ncyIsIG5ldyBCb29sZWFuKGRvQWxsb3dKYXZhRW5jb2RpbmdzKCkpKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgZG9tUGFyc2VyLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXModHJ1ZSk7Ci0JCX0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLSAgICB9Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEyOjA0OjE4IFBNKQotICogQHBhcmFtIG5ld0lucHV0U291cmNlIG9yZy54bWwuc2F4LklucHV0U291cmNlCi0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dFNvdXJjZShvcmcueG1sLnNheC5JbnB1dFNvdXJjZSBuZXdJbnB1dFNvdXJjZSkgCi0gICAgewotICAgICAgICBpbnB1dFNvdXJjZSA9IG5ld0lucHV0U291cmNlOwotICAgIH0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowMTozNCBQTSkKLSAqIEBwYXJhbSBuZXdWYWxpZGF0ZSBib29sZWFuCi0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZShib29sZWFuIG5ld1ZhbGlkYXRlKSAKLSAgICB7Ci0gICAgICAgIGRvVmFsaWRhdGUgPSBuZXdWYWxpZGF0ZTsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0oyRUVYTUxSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9KMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjgwOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0oyRUVYTUxSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFWE1MUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiajJlZXhtbCI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBKMkVFWE1MUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZF92YWx1ZXNfYXJlX19fRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSQVJfZmlsZV9zdXBwb3J0X19JT19leGNlcF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZhaWx1cmVfb2NjdXJyZWRfcmVhZGluZ194X0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ19yZXFfZmllbGRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbl9JT19FeGNlcHRpb25fb2NjdXJyZWRfd19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG11c3RfYmVfYm9vbGVhbl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc3VwcG9ydGVkX2VuY29kaW5nX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmFyX2R0ZF9ub3RfZm91bmRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eV9jb2xsZWN0aW9uX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbXVzdF9iZV9pbnRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX3ZhbHVlX2Zvcl9fRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbl9FeGNlcHRpb25fb2NjdXJyZWRfd2hpbF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR0ZF9ub3RfZm91bmRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb3Rfc3VwcG9ydGVkX2luX3RoaXNfcmVsZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlvX2V4X3NhdmluZ19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvdWxkX25vdF9jcmVhdGVfZmlsZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc3VwcG9ydGVkX3R5cGVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBLZXkxOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSjJFRVhNTFJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0oyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0oyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzZiNjRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRVhtbER0REVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgewotCi0JLyoqIEFsbCB0aGUgZHRkcyB0aGF0IHRoaXMgcmVzb2x2ZXIga25vd3MgYWJvdXQ7IGltcG9ydCBzdHJhdGVnaWVzIHJlZ2lzdGVyIHRoZXNlCi0JICogYXQgc3RhcnR1cCAqLyAKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBzdXBwb3J0ZWREdERzOwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyRHREKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLCAieG1sLnhzZCIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJlZ2lzdGVyRHREKCJYTUxTY2hlbWEuZHRkIiwgIlhNTFNjaGVtYS5kdGQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJlZ2lzdGVyRHREKCJkYXRhdHlwZXMuZHRkIiwgImRhdGF0eXBlcy5kdGQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyBzdGF0aWMgSjJFRVhtbER0REVudGl0eVJlc29sdmVyIElOU1RBTkNFID0gbmV3IEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcigpOwotLyoqCi0gKiBFamJYbWxFbnRpdHlSZXNvbHZlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSjJFRVhtbER0REVudGl0eVJlc29sdmVyKCkgewotCXN1cGVyKCk7Ci19Ci1wdWJsaWMgc3RhdGljIE1hcCBnZXRTdXBwb3J0ZWREdERzKCkgewotCWlmIChzdXBwb3J0ZWREdERzID09IG51bGwpCi0JCXN1cHBvcnRlZER0RHMgPSBuZXcgSGFzaE1hcCgpOwotCXJldHVybiBzdXBwb3J0ZWREdERzOwotfQotLyoqCi0gKiBNYXBzIHRoZSBzeXN0ZW0gaWQgZm9yIHRoZSBkdGQgdG8gYSBsb2NhbCBpZCB0byBiZSByZXRyaWV2ZWQgbG9hZGVkIGZyb20gdGhlIGNsYXNzIHBhdGgKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHREKFN0cmluZyBzeXN0ZW1JRCwgU3RyaW5nIGxvY2FsSUQpIHsgCi0gICAgLy9NYWtlIHN1cmUgbG9jYWwgZmlsZSBleGlzdHMgb24gY2xhc3NwYXRoIGZpcnN0LgotCQotCUNsYXNzTG9hZGVyIGxvYWRlciA9IEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOwotCVVSTCB1cmwgPSBudWxsOwotCWlmIChsb2FkZXIgPT0gbnVsbCkgewkgICAgCi0JCXVybCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKGxvY2FsSUQpOwotCX0gZWxzZSB7CSAgICAKLQkJdXJsID0gbG9hZGVyLmdldFJlc291cmNlKGxvY2FsSUQpOwotCX0KLQlpZiAodXJsID09IG51bGwpIHsKLQkJcmV0dXJuOwotCX0KLQlnZXRTdXBwb3J0ZWREdERzKCkucHV0KHN5c3RlbUlELCBsb2NhbElEKTsKLQlnZXRTdXBwb3J0ZWREdERzKCkucHV0KGdldFNob3J0TmFtZShzeXN0ZW1JRCksIGxvY2FsSUQpOwotfQotLyoqCi0gKiBmb3IgYSBzeXN0ZW0gaWQgd2l0aCBhIFVSTCB0aGF0IGJlZ2lucyB3aXRoICJodHRwOi8vamF2YS5zdW4uY29tLyIsIGNoZWNrIHRvIHNlZSBpZiB0aGF0IGlzIGEgcmVjb2duaXplZCBkdGQ7Ci0gKiBpZiBzbywgbG9hZCB0aGUgZHRkIGZyb20gdGhlIGNsYXNzIHBhdGggdXNpbmcgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlcmVkIGR0ZC4KLSAqCi0gKiBAcmV0dXJuIGFuIElucHV0IHNvdXJjZSBvbiBhIGxvY2FsbHkgcmVzb2x2ZWQgZHRkLCBvciBudWxsIG9mIHRoZSBzeXN0ZW1pZCBkb2VzIG5vdCBzdGFydCB3aXRoICJodHRwOi8vamF2YS5zdW4uY29tLyIKLSAqIAotICogQHRocm93cyBTQVhFeGNlcHRpb24gd2l0aCBhIG5lc3RlZCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgdGhlIGR0ZCBpcyBub3QgcmVjb2duaXplZAotICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIHJlc29sdmVkIGR0ZCBjYW5ub3QgYmUgbG9hZGVkIGZyb20gdGhlIGNsYXNzcGF0aAotICovCi1wdWJsaWMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7Ci0JU3RyaW5nIGxvY2FsUmVzb3VyY2VOYW1lID0gbnVsbDsKLQkvL2Jvb2xlYW4gaXNKYXZhU3l0ZW1JZCA9IGZhbHNlOwotCWlmIChzaG91bGRCZVJlZ2lzdGVyZWQoc3lzdGVtSWQpKSB7Ci0JCWxvY2FsUmVzb3VyY2VOYW1lID0gKFN0cmluZylnZXRTdXBwb3J0ZWREdERzKCkuZ2V0KHN5c3RlbUlkKTsKLQkJLy9pc0phdmFTeXRlbUlkID0gdHJ1ZTsJCi0JfSBlbHNlIHsKLQkJU3RyaW5nIHNob3J0TmFtZSA9IGdldFNob3J0TmFtZShzeXN0ZW1JZCk7Ci0JCWxvY2FsUmVzb3VyY2VOYW1lID0gKFN0cmluZylnZXRTdXBwb3J0ZWREdERzKCkuZ2V0KHNob3J0TmFtZSk7Ci0JCWlmIChsb2NhbFJlc291cmNlTmFtZSAhPSBudWxsKQotCQkJc3lzdGVtSWQgPSBsb2NhbFJlc291cmNlTmFtZTsKLQl9Ci0JCQotCWlmIChsb2NhbFJlc291cmNlTmFtZSA9PSBudWxsKSB7Ci0JCXJldHVybiBudWxsOwotCX0gCi0JQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCVVSTCB1cmwgPSBudWxsOwotCWlmIChsb2FkZXIgPT0gbnVsbCkgewkgICAgCi0JCXVybCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKGxvY2FsUmVzb3VyY2VOYW1lKTsKLQl9IGVsc2UgewkgICAgCi0JCXVybCA9IGxvYWRlci5nZXRSZXNvdXJjZShsb2NhbFJlc291cmNlTmFtZSk7Ci0JfQotCQotCQotCWlmICh1cmwgPT0gbnVsbCkgewotCQlTdHJpbmcgbWVzc2FnZSA9IEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIuZHRkX25vdF9mb3VuZF9FWENfLCAobmV3IE9iamVjdFtdIHtsb2NhbFJlc291cmNlTmFtZX0pKTsvLyA9ICJDb3VsZCBub3QgcGFyc2UgeG1sIGJlY2F1c2UgdGhlIHJlc29sdmVkIHJlc291cmNlICJ7MH0iIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBjbGFzc3BhdGgiCi0JCXRocm93IG5ldyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbihtZXNzYWdlKTsKLQl9Ci0JCi0JSW5wdXRTb3VyY2UgcmVzdWx0ID0gbmV3IElucHV0U291cmNlKHVybC50b1N0cmluZygpKTsKLQlyZXN1bHQuc2V0UHVibGljSWQocHVibGljSWQpOwkKLQkvLyBmb3JjZSB0aGUgZW5jb2RpbmcgdG8gYmUgVVRGOAotCXJlc3VsdC5zZXRFbmNvZGluZygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQotCXJldHVybiByZXN1bHQ7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRCZVJlZ2lzdGVyZWQoU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCi0JcmV0dXJuIHN5c3RlbUlkLnN0YXJ0c1dpdGgoSjJFRUNvbnN0YW50cy5KQVZBX1NVTl9DT01fVVJMKSAKLQkJfHwgc3lzdGVtSWQuc3RhcnRzV2l0aChKMkVFQ29uc3RhbnRzLldXV19XM19PUkdfVVJMKQotCQl8fCBzeXN0ZW1JZC5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuV1dXX0lCTV9DT01fVVJMKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBmaWxlbmFtZSBmcm9tIHRoZSB1cmksIG9yIHRoZSBzZWdtZW50IGFmdGVyIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYSBzZXBhcmF0b3IKLSAqLwotcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNob3J0TmFtZShTdHJpbmcgdXJpKSB7Ci0JU3RyaW5nIHRlbXBVUkkgPSB1cmkucmVwbGFjZSgnXFwnLCAnLycpOwotCXdoaWxlICh0ZW1wVVJJLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJdGVtcFVSSSA9IHRlbXBVUkkuc3Vic3RyaW5nKDAsIHRlbXBVUkkubGVuZ3RoKCktMSk7Ci0JaW50IGxhc3RJbmRleCA9IHRlbXBVUkkubGFzdEluZGV4T2YoJy8nKTsKLQlpZiAobGFzdEluZGV4ID09IC0xKQotCQlyZXR1cm4gdXJpOwotCXJldHVybiB1cmkuc3Vic3RyaW5nKGxhc3RJbmRleCsxLCB0ZW1wVVJJLmxlbmd0aCgpKTsKLX0KLX0KLQotCi0KLSAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9NaXNzaW5nUmVxdWlyZWREYXRhRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvTWlzc2luZ1JlcXVpcmVkRGF0YUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDFmMjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9NaXNzaW5nUmVxdWlyZWREYXRhRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi0KLQotcHVibGljIGNsYXNzIE1pc3NpbmdSZXF1aXJlZERhdGFFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMwMTAzOTg1NDU0MjU2MTMwNEw7Ci0vKioKLSAqIE1pc3NpbmdSZXF1aXJlZERhdGFFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIE1pc3NpbmdSZXF1aXJlZERhdGFFeGNlcHRpb24oKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogTWlzc2luZ1JlcXVpcmVkRGF0YUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgTWlzc2luZ1JlcXVpcmVkRGF0YUV4Y2VwdGlvbihTdHJpbmcgcykgewotCXN1cGVyKHMpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiNWQxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb247Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXh0ZW5kcyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbiB7Ci1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzUzNTU5NDcyMDk4NzU5ODE5Nkw7Ci0vKioKLSAqIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGUgamF2YS5sYW5nLkV4Y2VwdGlvbgotICovCi1wdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0Jc3VwZXIoZSk7Ci19Ci0vKioKLSAqIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0Jc3VwZXIocyk7Ci19Ci0vKioKLSAqIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwotICogQHBhcmFtIGUgamF2YS5sYW5nLkV4Y2VwdGlvbgotICovCi1wdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCXN1cGVyKHMsIGUpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9SYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9SYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5OTNjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvUmFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgY2F0YWxvZyBvZiBhbGwgdGhlIHRhZyBuYW1lcyB3aGljaCBvY2N1ciBpbiAKLSAqIGFuIFJBUiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEludGVyZmFjZSBzaGFyZWQgYnkgcmVhZGVycyBhbmQgCi0gKiB3cml0ZXJzIHRvIGhhdmUgYWNjZXNzIHRvIGNvbW1vbiBjb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBSYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgZXh0ZW5kcyBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXB1YmxpYyBTdHJpbmcgQVVUSF9NRUNIQU5JU00gPSAiYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBBVVRIX01FQ0hfVFlQRSA9ICJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09ORklHX1BST1BFUlRZID0gImNvbmZpZy1wcm9wZXJ0eSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09ORklHX1BST1BFUlRZX05BTUUgPSAiY29uZmlnLXByb3BlcnR5LW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTkZJR19QUk9QRVJUWV9WQUxVRSA9ICJjb25maWctcHJvcGVydHktdmFsdWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTkZJR19QUk9QRVJUWV9UWVBFID0gImNvbmZpZy1wcm9wZXJ0eS10eXBlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05ORUNUT1IgPSAiY29ubmVjdG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05ORUNUSU9ORkFDVE9SWV9JTlRFUkZBQ0UgPSAiY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05ORUNUSU9ORkFDVE9SWV9JTVBMX0NMQVNTID0gImNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTk5FQ1RJT05fSU5URVJGQUNFID0gImNvbm5lY3Rpb24taW50ZXJmYWNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05ORUNUSU9OX0lNUExfQ0xBU1MgPSAiY29ubmVjdGlvbi1pbXBsLWNsYXNzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDUkVERU5USUFMX0lOVEVSRkFDRSA9ICJjcmVkZW50aWFsLWludGVyZmFjZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRUlTX1RZUEUgPSAiZWlzLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIExJQ0VOU0UgPSAibGljZW5zZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTElDRU5TRV9SRVFVSVJFRCA9ICJsaWNlbnNlLXJlcXVpcmVkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBNQU5BR0VEQ09OTkVDVElPTkZBQ1RPUllfQ0xBU1MgPSAibWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQgPSAicmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBSRVNPVVJDRUFEQVBURVIgPSAicmVzb3VyY2VhZGFwdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBTRUNVUklUWV9QRVJNSVNTSU9OID0gInNlY3VyaXR5LXBlcm1pc3Npb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFNFQ1VSSVRZX1BFUk1JU1NJT05fU1BFQyA9ICJzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFNQRUNfVkVSU0lPTiA9ICJzcGVjLXZlcnNpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFRSQU5TQUNUSU9OX1NVUFBPUlQgPSAidHJhbnNhY3Rpb24tc3VwcG9ydCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVORE9SX05BTUUgPSAidmVuZG9yLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQkvL0pDQSAxLjUKLQlwdWJsaWMgU3RyaW5nIFJFU09VUkNFQURBUFRFUl9WRVJTSU9OID0gInJlc291cmNlYWRhcHRlci12ZXJzaW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBSRVNPVVJDRUFEQVBURVJfQ0xBU1MgPSAicmVzb3VyY2VhZGFwdGVyLWNsYXNzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBPVVRCT1VORF9SRVNPVVJDRUFEQVBURVIgPSAib3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBJTkJPVU5EX1JFU09VUkNFQURBUFRFUiA9ICJpbmJvdW5kLXJlc291cmNlYWRhcHRlciI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVElPTl9ERUZJTklUSU9OID0gImNvbm5lY3Rpb24tZGVmaW5pdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTUVTU0FHRUFEQVBURVIgPSAibWVzc2FnZWFkYXB0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIE1FU1NBR0VMSVNURU5FUiA9ICJtZXNzYWdlbGlzdGVuZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIE1FU1NBR0VMSVNURU5FUl9UWVBFID0gIm1lc3NhZ2VsaXN0ZW5lci10eXBlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBBQ1RJVkFUSU9OU1BFQyA9ICJhY3RpdmF0aW9uc3BlYyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQUNUSVZBVElPTlNQRUNfQ0xBU1MgPSAiYWN0aXZhdGlvbnNwZWMtY2xhc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWSA9ICJyZXF1aXJlZC1jb25maWctcHJvcGVydHkiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgU3RyaW5nIEFETUlOT0JKRUNUID0gImFkbWlub2JqZWN0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBBRE1JTk9CSkVDVF9DTEFTUyA9ICJhZG1pbm9iamVjdC1jbGFzcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQURNSU5PQkpFQ1RfSU5URVJGQUNFID0gImFkbWlub2JqZWN0LWludGVyZmFjZSI7IC8vJE5PTi1OTFMtMSQKLX0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9XYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9XYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmMGVhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvV2FyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgY2F0YWxvZyBvZiBhbGwgdGhlIHRhZyBuYW1lcyB3aGljaCBvY2N1ciBpbiAKLSAqIGFuIFdBUiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEludGVyZmFjZSBzaGFyZWQgYnkgcmVhZGVycyBhbmQgCi0gKiB3cml0ZXJzIHRvIGhhdmUgYWNjZXNzIHRvIGNvbW1vbiBjb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBXYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgZXh0ZW5kcyBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXB1YmxpYyBTdHJpbmcgQVVUSF9DT05TVFJBSU5UID0gImF1dGgtY29uc3RyYWludCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQVVUSF9NRVRIT0QgPSAiYXV0aC1tZXRob2QiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTlRFWFRfUEFSQU0gPSAiY29udGV4dC1wYXJhbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRElTVFJJQlVUQUJMRSA9ICJkaXN0cmlidXRhYmxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFUlJPUl9DT0RFID0gImVycm9yLWNvZGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVSUk9SX1BBR0UgPSAiZXJyb3ItcGFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRVhDRVBUSU9OX1RZUEUgPSAiZXhjZXB0aW9uLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVYVEVOU0lPTiA9ICJleHRlbnNpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEZJTFRFUiA9ICJmaWx0ZXIiOwkJCS8vJE5PTi1OTFMtMSQJCS8vIFNlcnZsZXQyLjMKLQlwdWJsaWMgU3RyaW5nIEZJTFRFUl9NQVBQSU5HID0gImZpbHRlci1tYXBwaW5nIjsvLyROT04tTkxTLTEkCS8vIFNlcnZsZXQyLjMKLQlwdWJsaWMgU3RyaW5nIEZJTFRFUl9OQU1FID0gImZpbHRlci1uYW1lIjsJCS8vJE5PTi1OTFMtMSQJLy8gU2VydmxldDIuMwotCXB1YmxpYyBTdHJpbmcgRklMVEVSX0NMQVNTID0gImZpbHRlci1jbGFzcyI7Ly8kTk9OLU5MUy0xJAkJLy8gU2VydmxldDIuMwotCXB1YmxpYyBTdHJpbmcgRk9STV9FUlJPUl9QQUdFID0gImZvcm0tZXJyb3ItcGFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRk9STV9MT0dJTl9DT05GSUcgPSAiZm9ybS1sb2dpbi1jb25maWciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEZPUk1fTE9HSU5fUEFHRSA9ICJmb3JtLWxvZ2luLXBhZ2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEhUVFBfTUVUSE9EID0gImh0dHAtbWV0aG9kIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBJTklUX1BBUkFNID0gImluaXQtcGFyYW0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEpTUF9GSUxFID0gImpzcC1maWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBMSVNURU5FUiA9ICJsaXN0ZW5lciI7CS8vJE5PTi1OTFMtMSQJCQkvLyBTZXJ2bGV0Mi4zCi0JcHVibGljIFN0cmluZyBMT0FEX09OX1NUQVJUVVAgPSAibG9hZC1vbi1zdGFydHVwIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBMT0NBVElPTiA9ICJsb2NhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTE9HSU5fQ09ORklHID0gImxvZ2luLWNvbmZpZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTUlNRV9NQVBQSU5HID0gIm1pbWUtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTUlNRV9UWVBFID0gIm1pbWUtdHlwZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUkVBTE1fTkFNRSA9ICJyZWFsbS1uYW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBTRUNVUklUWV9DT05TVFJBSU5UID0gInNlY3VyaXR5LWNvbnN0cmFpbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFNFUlZMRVQgPSAic2VydmxldCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgU0VSVkxFVF9DTEFTUyA9ICJzZXJ2bGV0LWNsYXNzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBTRVJWTEVUX01BUFBJTkcgPSAic2VydmxldC1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBTRVJWTEVUX05BTUUgPSAic2VydmxldC1uYW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBTRVNTSU9OX0NPTkZJRyA9ICJzZXNzaW9uLWNvbmZpZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgU0VTU0lPTl9USU1FT1VUID0gInNlc3Npb24tdGltZW91dCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVEFHTElCID0gInRhZ2xpYiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVEFHTElCX0xPQ0FUSU9OID0gInRhZ2xpYi1sb2NhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVEFHTElCX1VSSSA9ICJ0YWdsaWItdXJpIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBUUkFOU1BPUlRfR1VBUkFOVEVFID0gInRyYW5zcG9ydC1ndWFyYW50ZWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFVSTF9QQVRURVJOID0gInVybC1wYXR0ZXJuIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBVU0VSX0RBVEFfQ09OU1RSQUlOVCA9ICJ1c2VyLWRhdGEtY29uc3RyYWludCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgV0VCX0FQUCA9ICJ3ZWItYXBwIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTiA9ICJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgV0VCX1JFU09VUkNFX05BTUUgPSAid2ViLXJlc291cmNlLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFTENPTUVfRklMRSA9ICJ3ZWxjb21lLWZpbGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFTENPTUVfRklMRV9MSVNUID0gIndlbGNvbWUtZmlsZS1saXN0IjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFN0cmluZyBESVNQQVRDSEVSID0gImRpc3BhdGNoZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIExPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1QgPSAibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkcgPSAibG9jYWxlLWVuY29kaW5nLW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIExPQ0FMRSA9ICJsb2NhbGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVOQ09ESU5HID0gImVuY29kaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBKU1BfQ09ORklHID0gImpzcC1jb25maWciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEpTUF9QUk9QRVJUWV9HUk9VUCA9ICJqc3AtcHJvcGVydHktZ3JvdXAiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVMX0lHTk9SRUQgPSAiZWwtaWdub3JlZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUEFHRV9FTkNPRElORyA9ICJwYWdlLWVuY29kaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBTQ1JJUFRJTkdfSU5WQUxJRCA9ICJzY3JpcHRpbmctaW52YWxpZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSVNfWE1MID0gImlzLXhtbCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSU5DTFVERV9QUkVMVURFID0gImluY2x1ZGUtcHJlbHVkZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSU5DTFVERV9DT0RBID0gImluY2x1ZGUtY29kYSI7Ly8kTk9OLU5MUy0xJAotCQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9XZWJTZXJ2aWNlc0RlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1dlYlNlcnZpY2VzRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ODY4YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1dlYlNlcnZpY2VzRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyA1LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi0vKioKLSAqIEBhdXRob3IgZGZob2x0dHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VzRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIGV4dGVuZHMgRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJewotCS8vMS4zIHNwZWNpZmljIFdlYlNlcnZpY2VzIERECi0JcHVibGljIFN0cmluZyBDT01QX1NDT1BFRF9SRUZTID0gImNvbXBvbmVudC1zY29wZWQtcmVmcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09NUF9DT01QT05FTlRfTkFNRSA9ICJjb21wb25lbnQtbmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgV0VCX1NFUlZJQ0VTX0NMSUVOVCA9ICJ3ZWJzZXJ2aWNlc2NsaWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTE9DQUxQQVJUID0gImxvY2FscGFydCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTkFNRVNQQUNFVVJJID0gIm5hbWVzcGFjZVVSSSI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1hNTFBhcnNlUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvWE1MUGFyc2VSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlZjdiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvWE1MUGFyc2VSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MUGFyc2VSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gInhtbHBhcnNlIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFhNTFBhcnNlUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RfaW52b2tlX2ZhaWxlZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZF90b19sb2FkX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kX25vdF9mb3VuZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZF9pbnN0YW50aWF0aW5nX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VfZXhjZXB0aW9uX29jY3VyZWRfRVhDXzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTFBhcnNlUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1htbERvY3VtZW50UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvWG1sRG9jdW1lbnRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3NTc2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvWG1sRG9jdW1lbnRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDAyLzIxLzAxIDQ6MzQ6MTMgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxEb2N1bWVudFJlYWRlciBleHRlbmRzIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlciB7Ci0vKioKLSAqIFhtbERvY3VtZW50UmVhZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBYbWxEb2N1bWVudFJlYWRlcihJbnB1dFNvdXJjZSBzb3VyY2UpIHsKLQlzdXBlcihzb3VyY2UpOwotCXNldEZsYWdEZWZhdWx0cygpOwotfQotLyoqCi0gKiBYbWxEb2N1bWVudFJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgWG1sRG9jdW1lbnRSZWFkZXIoSW5wdXRTb3VyY2Ugc291cmNlLCBFbnRpdHlSZXNvbHZlciByZXNvbHZlciwgRXJyb3JIYW5kbGVyIGhhbmRsZXIpIHsKLQlzdXBlcihzb3VyY2UsIHJlc29sdmVyLCBoYW5kbGVyKTsKLQlzZXRGbGFnRGVmYXVsdHMoKTsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDAzLzE5LzAxIDEwOjEzOjI2IEFNKQotICogQHJldHVybiBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcgotICovCi1wdWJsaWMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgY3JlYXRlRGVmYXVsdEVudGl0eVJlc29sdmVyKCkgewotCXJldHVybiBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuSU5TVEFOQ0U7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGhhbmRsZUV4Y2VwdGlvbihTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBhbkV4Y2VwdGlvbikgewotCWlmIChhbkV4Y2VwdGlvbiBpbnN0YW5jZW9mIFNBWFBhcnNlRXhjZXB0aW9uKSAKLQkJaGFuZGxlRXhjZXB0aW9uKGFNZXNzYWdlLCAoU0FYUGFyc2VFeGNlcHRpb24pIGFuRXhjZXB0aW9uKTsKLQllbHNlCi0JCXN1cGVyLmhhbmRsZUV4Y2VwdGlvbihhTWVzc2FnZSwgYW5FeGNlcHRpb24pOwotfQotcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFN0cmluZyBhTWVzc2FnZSwgU0FYUGFyc2VFeGNlcHRpb24gcGFyc2VFeGNlcHRpb24pIHsKLQlwcmltSGFuZGxlRXhjZXB0aW9uKEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFhNTFBhcnNlUmVzb3VyY2VIYW5kbGVyLnBhcnNlX2V4Y2VwdGlvbl9vY2N1cmVkX0VYQ18sIChuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKHBhcnNlRXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSksIG5ldyBJbnRlZ2VyKHBhcnNlRXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpKSB9KSksIHBhcnNlRXhjZXB0aW9uKTsgIAotCS8vJE5PTi1OTFMtMSQgPSAiQW4gRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgeG1sOiB7MH0gTGluZSAjOiB7MX0gOkNvbHVtbiAjOiAiCi19Ci1wcm90ZWN0ZWQgdm9pZCBwcmltSGFuZGxlRXhjZXB0aW9uKFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGFuRXhjZXB0aW9uKSB7Ci0JaWYgKGFuRXhjZXB0aW9uIGluc3RhbmNlb2YgRXhjZXB0aW9uKQotCQl0aHJvdyBuZXcgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24oYU1lc3NhZ2UsIChFeGNlcHRpb24pYW5FeGNlcHRpb24pOwotCXN1cGVyLnByaW1IYW5kbGVFeGNlcHRpb24oYU1lc3NhZ2UsIGFuRXhjZXB0aW9uKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldEZsYWdEZWZhdWx0cygpIHsKLQlzZXRBbGxvd0phdmFFbmNvZGluZ3ModHJ1ZSk7Ci0Jc2V0VmFsaWRhdGUodHJ1ZSk7Ci19Ci0gICBwdWJsaWMgc3RhdGljIERvY3VtZW50VHlwZSByZWFkRG9jdW1lbnRUeXBlKElucHV0U3RyZWFtIGluLCBTdHJpbmcgdXJpKSB7Ci0gICAgCUlucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbik7Ci0gICAgCUdlbmVyYWxYbWxEb2N1bWVudFJlYWRlciBhUmVhZGVyID0gIG5ldyBYbWxEb2N1bWVudFJlYWRlcihzb3VyY2UpOwotICAgIAlhUmVhZGVyLnNldFZhbGlkYXRlKGZhbHNlKTsKLSAgICAJRG9jdW1lbnQgYURvY3VtZW50ID0gYVJlYWRlci5wYXJzZURvY3VtZW50KCk7Ci0gICAgCWlmIChhRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAJCXJldHVybiBhRG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BY3RpdmF0aW9uU3BlYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0FjdGl2YXRpb25TcGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTYxZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0FjdGl2YXRpb25TcGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3RpdmF0aW9uIFNwZWM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgYWN0aXZhdGlvbnNwZWNUeXBlIHNwZWNpZmllcyBhbiBhY3RpdmF0aW9uCi0gKiBzcGVjaWZpY2F0aW9uLiAgVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5IHF1YWxpZmllZAotICogSmF2YSBjbGFzcyBuYW1lIG9mIGFuIGFjdGl2YXRpb24gc3BlY2lmaWNhdGlvbiBhbmQgYSBzZXQgb2YKLSAqIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldEFjdGl2YXRpb25TcGVjQ2xhc3MgPGVtPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyA8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldEFjdGl2YXRpb25TcGVjKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2YXRpb25TcGVjIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBTcGVjIENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbGVtZW50IGFjdGl2YXRpb25zcGVjLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgKiAgICAgICAgIHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGFjdGl2YXRpb24KLQkgKiAgICAgICAgIHNwZWNpZmljYXRpb24gY2xhc3MuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCi0JICogICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuQWN0aXZhdGlvblNwZWMgaW50ZXJmYWNlLiBUaGUKLQkgKiAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYQotCSAqICAgICAgICAgSmF2YUJlYW4uCi0JICogCi0JICogICAgICAgICBFeGFtcGxlOgotCSAqICAgICAgICAgICAgIDxhY3RpdmF0aW9uc3BlYy1jbGFzcz5jb20ud29tYmF0LkFjdGl2YXRpb25TcGVjSW1wbAotCSAqICAgICAgICAgICAgIDwvYWN0aXZhdGlvbnNwZWMtY2xhc3M+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZhdGlvblNwZWNDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlY0NsYXNzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2YXRpb25TcGVjQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYyNnZXRBY3RpdmF0aW9uU3BlY0NsYXNzIDxlbT5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvblNwZWNDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZhdGlvblNwZWNDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpOwotCi19IC8vIEFjdGl2YXRpb25TcGVjCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQWRtaW5PYmplY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BZG1pbk9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDdjZWZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BZG1pbk9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkbWluIE9iamVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBhZG1pbm9iamVjdFR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGFuCi0gKiBhZG1pbmlzdGVyZWQgb2JqZWN0LiAgQWRtaW5pc3RlcmVkIG9iamVjdHMgYXJlIHNwZWNpZmljIHRvIGEKLSAqIG1lc3NhZ2luZyBzdHlsZSBvciBtZXNzYWdlIHByb3ZpZGVyLiAgVGhpcyBjb250YWlucwotICogaW5mb3JtYXRpb24gb24gdGhlIEphdmEgdHlwZSBvZiB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5Ci0gKiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LCBpdHMgSmF2YSBjbGFzcyBuYW1lIGFuZCBpdHMKLSAqIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UgPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdCNnZXRBZG1pbk9iamVjdENsYXNzIDxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdCNnZXRDb25maWdQcm9wZXJ0aWVzIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0QWRtaW5PYmplY3QoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWRtaW5PYmplY3QgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRtaW4gT2JqZWN0IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRtaW4gT2JqZWN0IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZQotCSAqICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSBvZiB0aGUKLQkgKiAgICAgICAgIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAgICAgICAgICAgPGFkbWlub2JqZWN0LWludGVyZmFjZT5qYXZheC5qbXMuRGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgPC9hZG1pbm9iamVjdC1pbnRlcmZhY2U+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFkbWluT2JqZWN0SW50ZXJmYWNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0SW50ZXJmYWNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFkbWluT2JqZWN0SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UgPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZG1pbk9iamVjdEludGVyZmFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRtaW4gT2JqZWN0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVsZW1lbnQgYWRtaW5vYmplY3QtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseQotCSAqICAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAgICAgICAgICAgICA8YWRtaW5vYmplY3QtY2xhc3M+Y29tLndvbWJhdC5EZXN0aW5hdGlvbkltcGwKLQkgKiAgICAgICAgICAgICA8L2FkbWlub2JqZWN0LWNsYXNzPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFkbWluT2JqZWN0Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RDbGFzcygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBZG1pbk9iamVjdENsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5PYmplY3RDbGFzcyA8ZW0+QWRtaW4gT2JqZWN0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFkbWluT2JqZWN0Q2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRBZG1pbk9iamVjdF9Db25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29uZmlnUHJvcGVydGllcygpOwotCi19IC8vIEFkbWluT2JqZWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQXV0aGVudGljYXRpb25NZWNoYW5pc20uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWYxMDMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllcyBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBOb3RlIHRoYXQgdGhpcyBzdXBwb3J0IGlzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgbm90IGZvciB0aGUgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBzcGVjaWZpZXMgYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQgZm9yIHRoZSBzdXBwb3J0IG9mIHNlY3VyaXR5IGNvbnRyYWN0IGFuZCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uCi0gKiAKLSAqIE5vdGUgdGhhdCBCYXNpY1Bhc3N3b3JkIG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQotICogamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0gKiBUaGUgS2VyYnY1IG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQotICogamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIGludGVyZmFjZS4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXV0aGVudGljYXRpb25NZWNoYW5pc20gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIDxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIGF0dHJpYnV0ZQotCSAqIFRoZSBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSBzcGVjaWZpZXMgdHlwZSBvZiBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uCi0JICogCi0JICogVGhlIGV4YW1wbGUgdmFsdWVzIGFyZToKLQkgKiAgIC0gQmFzaWNQYXNzd29yZAotCSAqICAgLSBLZXJidjUKLQkgKiAKLQkgKiBBbnkgYWRkaXRpb25hbCBzZWN1cml0eSBtZWNoYW5pc21zIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUKLQkgKiBDb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLQkgKi8KLQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIDxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZQotCSAqIEBzZWUgI2lzU2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkKLQkgKiBAc2VlICN1bnNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpCi0JICogQHNlZSAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkKLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQotCSAqIEBzZWUgI3NldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZShBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQotCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpCi0JICogQHNlZSAjc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIENyZWRlbnRpYWxJbnRlcmZhY2UgYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoZSBpbnRlcmZhY2UgdGhhdCB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBmb3IKLQkgKiB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNyZWRlbnRpYWxzLiBUaGlzIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgYnkKLQkgKiBhcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwgaW50ZXJmYWNlIGl0IHNob3VsZCB1c2UgYXMgcGFydAotCSAqIG9mIHRoZSBzZWN1cml0eSBjb250cmFjdC4KLQkgKiAKLQkgKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZToKLQkgKiAgICBqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsCi0JICogICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsCi0KLQkgKi8KLQlTdHJpbmcgZ2V0Q3JlZGVudGlhbEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENyZWRlbnRpYWxJbnRlcmZhY2UgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRDcmVkZW50aWFsSW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ3VzdG9tQXV0aE1lY2hUeXBlIGF0dHJpYnV0ZQotCSAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgdmFyaWFibGUgdXNlZCB0byBzdG9yZSB0aGUgQXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgd2hlbgotCSAqIGl0IGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIEJhc2ljUGFzc3dvcmQgb3IgS2VyYnY1LiAgQXV0aGVudGljYXRpb25NZWNhbmlzbVR5cGUgCi0JICogaXMgc2V0IHRvICdDdXN0b20nIGluIHRob3NlIGNhc2VzLiAgVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5Ci0JICogcnVudGltZS4gIEl0IGlzIG9ubHkgdXNlZCBieSB0aGUgd3JpdGVyIHRvIHdyaXRlIGJhY2sgb3V0IHRoZSBjdXN0b20KLQkgKiBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgc3RyaW5nIGluIHRoZSBjYXNlIG9mIGN1c3RvbQotCSAqIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSdzLiAgCi0JICogVGhpcyB2YXJpYWJsZSBpcyBpbnRlcm5hbCwgdXNlZCBvbmx5IGJ5IHRoZSByZWFkZXIvL3dyaXRlciBjbGFzc2VzLCBhbmQgY2FuCi0JICogY2hhbmdlIG9yIGRpc2FwcGVhciB3aXRob3V0IG5vdGljZS4gIAotCSAqLwotCVN0cmluZyBnZXRDdXN0b21BdXRoTWVjaFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDdXN0b21BdXRoTWVjaFR5cGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRDdXN0b21BdXRoTWVjaFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDM1MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIHt9Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTSUNfUEFTU1dPUkQ9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VSQlY1PSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QmFzaWMgUGFzc3dvcmQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CYXNpYyBQYXNzd29yZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNCQVNJQ19QQVNTV09SRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIEJBU0lDX1BBU1NXT1JEX0xJVEVSQUwgPSBuZXcgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKEJBU0lDX1BBU1NXT1JELCAiQmFzaWNQYXNzd29yZCIsICJCYXNpY1Bhc3N3b3JkIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+S2VyYnY1PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+S2VyYnY1PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0tFUkJWNQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIEtFUkJWNV9MSVRFUkFMID0gbmV3IEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZShLRVJCVjUsICJLZXJidjUiLCAiS2VyYnY1Iik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlW10gewotCQkJQkFTSUNfUEFTU1dPUkRfTElURVJBTCwKLQkJCUtFUkJWNV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEJBU0lDX1BBU1NXT1JEOiByZXR1cm4gQkFTSUNfUEFTU1dPUkRfTElURVJBTDsKLQkJCWNhc2UgS0VSQlY1OiByZXR1cm4gS0VSQlY1X0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29uZmlnUHJvcGVydHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25maWdQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGY1OWRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25maWdQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFRoZSBjb25maWcgcHJvcGVydHkgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHNpbmdsZQotICogY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBmb3IgYSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuCi0gKiAKLSAqIEVhY2ggTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlIGNyZWF0ZXMgY29ubmVjdGlvbnMgdG8gYSBzcGVjaWZpYyBFSVMgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgY29uZmlndXJlZCBvbiB0aGUgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlLiBUaGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBvbmx5IG9uY2UgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgZXZlbiB0aG91Z2ggYSByZXNvdXJjZSBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBtdWx0aXBsZSBNYW5hZ2VkQ29ubm5lY3Rpb24tRmFjdG9yeSBpbnN0YW5jZXMgKHRoYXQgY3JlYXRlIGNvbm5lY3Rpb25zIHRvIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgRUlTKS4KLSAqIAotICogVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBuYW1lLCB0eXBlCi0gKiBhbmQgYW4gb3B0aW9uYWwgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuIElmIHRoZSByZXNvdXJjZQotICogYWRhcHRlciBwcm92aWRlciBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsdWUgdGhhbiB0aGUgZGVwbG95ZXIgaXMKLSAqIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSB2YWxpZCB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LgotICogCi0gKiBBbnkgYm91bmRzIG9yIHdlbGwtZGVmaW5lZCB2YWx1ZXMgb2YgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbi4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uZmlnUHJvcGVydHkgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogQ29udGFpbnMgdGhlIG5hbWUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LgotCSAqIAotCSAqIFRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkIHByb3BlcnRpZXMgYWxsIG9mIHR5cGUgCi0JICogamF2YS5sYW5nLlN0cmluZy4gVGhlc2UgYXJlIGFzIGZvbGxvd3M6Ci0JICogCi0JICogICAgICBTZXJ2ZXJOYW1lCi0JICogICAgICBQb3J0TnVtYmVyCi0JICogICAgICBVc2VyTmFtZQotCSAqICAgICAgUGFzc3dvcmQKLQkgKiAgICAgIENvbm5lY3Rpb25VUkwKLQkgKiAKLQkgKiBBIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgY2FuIGV4dGVuZCB0aGlzIHByb3BlcnR5IHNldCB0byBpbmNsdWRlIHByb3BlcnRpZXMKLQkgKiBzcGVjaWZpYyB0byB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgaXRzIHVuZGVybHlpbmcgRUlTLgotCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFR5cGUgYXR0cmlidXRlCi0JICogQ29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIHR5cGUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGFzIHJlcXVpcmVkCi0JICogYnkgTWFuYWdlZENvbm5lY3Rpb24tRmFjdG9yeSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGNvbmZpZy1wcm9wZXJ0eS10eXBlOgotCSAqICAgIGphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwKLQkgKiAgICBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LAotCSAqICAgIGphdmEubGFuZy5Mb25nLCBqYXZhLmxhbmcuRmxvYXQsIGphdmEubGFuZy5DaGFyYWN0ZXIKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFR5cGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVmFsdWUgYXR0cmlidXRlCi0JICogQ29udGFpbnMgdGhlIHZhbHVlIG9mIGEgY29uZmlndXJhdGlvbiBlbnRyeS4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBWYWx1ZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0Nvbm5lY3Rpb25EZWZpbml0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29ubmVjdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmMDkzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29ubmVjdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25uZWN0aW9uIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgY29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSBkZWZpbmVzIGEgc2V0IG9mIGNvbm5lY3Rpb24KLSAqIGludGVyZmFjZXMgYW5kIGNsYXNzZXMgcGVydGFpbmluZyB0byBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbgotICogdHlwZS4gVGhpcyBhbHNvIGluY2x1ZGVzIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGZvcgotICogTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlcyB0aGF0IG1heSBiZSBwcm9kdWNlZCBvdXQKLSAqIG9mIHRoaXMgc2V0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyA8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25JbnRlcmZhY2UgPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkltcGxDbGFzcyA8ZW0+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29uZmlnUHJvcGVydGllcyA8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldENvbm5lY3Rpb25EZWZpbml0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25EZWZpbml0aW9uIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCBtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3Mgc3BlY2lmaWVzCi0JICogICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotCSAqICAgICAgICAgaW1wbGVtZW50cyB0aGUKLQkgKiAgICAgICAgIGphdmF4LnJlc291cmNlLnNwaS5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCSAqICAgICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UKLQkgKiAgICAgICAgIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlCi0JICogICAgICAgICBzcGVjaWZpZWQgY29udHJhY3RzLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcwotCSAqICAgICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogICAgICAgICA8bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotCSAqICAgICAgICAgICAgIGNvbS53b21iYXQuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5SW1wbAotCSAqICAgICAgICAgPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIDxlbT5NYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2Ugc3BlY2lmaWVzCi0JICogICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0JICogICAgICAgICBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAgICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeQotCSAqICAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0JICogCi0JICogICAgICAgICBPUgotCSAqIAotCSAqICAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbkZhY3RvcnkKLQkgKiAgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzIHNwZWNpZmllcwotCSAqICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeQotCSAqICAgICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIKLQkgKiAgICAgICAgIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5SW1wbAotCSAqICAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29ubmVjdGlvbi1pbnRlcmZhY2UgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICogICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBpbnRlcmZhY2Ugc3VwcG9ydGVkCi0JICogICAgICAgICBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogICAgICAgICAgICAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uCi0JICogICAgICAgICAgICAgPC9jb25uZWN0aW9uLWludGVyZmFjZT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbm5lY3Rpb25JbnRlcmZhY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25uZWN0aW9uSW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzVHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICogICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBjbGFzcyB0aGF0Ci0JICogICAgICAgICBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbgotCSAqICAgICAgICAgaW50ZXJmYWNlLiAgSXQgaXMgdXNlZCBieSB0aGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzCi0JICogICAgICAgICBlbGVtZW50cy4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogICAgICAgICAgICAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsCi0JICogICAgICAgICAgICAgPC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29ubmVjdGlvbkltcGxDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uSW1wbENsYXNzIDxlbT5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkltcGxDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maWcgUHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb25maWdQcm9wZXJ0aWVzKCk7Ci0KLX0gLy8gQ29ubmVjdGlvbkRlZmluaXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25uZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25uZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiZmEwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29ubmVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotLyoqCi0gKiBUaGUgY29ubmVjdG9yIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzIGdlbmVyYWwgaW5mb3JtYXRpb24gLSB2ZW5kb3IgbmFtZSwgdmVyc2lvbiwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIHN1cHBvcnRlZCwgaWNvbiAtICBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIEl0IGFsc28gaW5jbHVkZXMgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIGVsZW1lbnQgcmVzb3VyY2VhZGFwdGVyLgotCi0gKiBAc2luY2UgMS4wICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3RvciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCi0KLQkvKioKLQkqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuICBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotCSogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGZhaWxzCi0JKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBKMkMgbW9kdWxlIAotCSovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBWZW5kb3JOYW1lIGF0dHJpYnV0ZQotCSAqIFNwZWNpZmllcyB0aGUgbmFtZSBvZiByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIHZlbmRvci4KLQkgKiBFeGFtcGxlOiBXb21iYXQgQ29ycC4KLQkgKi8KLQlTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFZlbmRvck5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRWZW5kb3JOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgU3BlY1ZlcnNpb24gYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcwotCSAqIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3llciB0bwotCSAqIGNvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgYWRhcHRlciB0byBzdXBwb3J0IGRlcGxveW1lbnQgYW5kIHJ1bnRpbWUgcmVxdWlyZW1lbnRzCi0JICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgotCi0JICovCi0JU3RyaW5nIGdldFNwZWNWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU3BlY1ZlcnNpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRTcGVjVmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEVpc1R5cGUgYXR0cmlidXRlCi0JICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgdGhlIEVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyAKLQkgKiBjYW4gYmUgcHJvZHVjdCBuYW1lIG9mIEVJUyBpbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbiBpbmZvLgotCSAqIAotCSAqIFRoaXMgaGVscHMgaW4gaWRlbnRpZnlpbmcgRUlTIGluc3RhbmNlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGgKLQkgKiB0aGlzIHJlc291cmNlIGFkYXB0ZXIuCi0KLQkgKi8KLQlTdHJpbmcgZ2V0RWlzVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEVpc1R5cGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRFaXNUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgdmVyc2lvbnMKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZQotCSAqIGFkYXB0ZXIgcHJvdmlkZXIuCi0JICogCi0JICogRXhhbXBsZTogMS4wCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBWZXJzaW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgTGljZW5zZSByZWZlcmVuY2UKLQkgKiBTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBUaGlzIGVsZW1lbnQKLQkgKiBzcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZQotCSAqIGFkYXB0ZXIsIGFuZCBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGljZW5zaW5nIHRlcm1zIChleGFtcGxlczogZHVyYXRpb24gCi0JICogb2YgbGljZW5zZSwgbnVtYmVyIG9mCi0JICogY29ubmVjdGlvbiByZXN0cmljdGlvbnMpLgotCSAqLwotCUxpY2Vuc2UgZ2V0TGljZW5zZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExpY2Vuc2UgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMaWNlbnNlKExpY2Vuc2UgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgUmVzb3VyY2VBZGFwdGVyIHJlZmVyZW5jZQotCSAqLwotCVJlc291cmNlQWRhcHRlciBnZXRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZXNvdXJjZUFkYXB0ZXIgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZUFkYXB0ZXIoUmVzb3VyY2VBZGFwdGVyIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0Nvbm5lY3RvclJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29ubmVjdG9yUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwZTU2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29ubmVjdG9yUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMzEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKkBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0b3JSZXNvdXJjZSBleHRlbmRzIFhNTFJlc291cmNlIHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbW9kZWwKLQkgKiBAcmV0dXJuIENvbm5lY3RvcgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKCkgOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0luYm91bmRSZXNvdXJjZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzN2IwZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0luYm91bmRSZXNvdXJjZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24KLSAqIGFib3V0IGFuIGluYm91bmQgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBjb250YWlucyBpbmZvcm1hdGlvbgotICogc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyCi0gKiBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBtZXNzYWdlYWRhcHRlciBlbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldE1lc3NhZ2VBZGFwdGVyIDxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5ib3VuZFJlc291cmNlQWRhcHRlciBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIEFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWVzc2FnZWxpc3RlbmVyLXR5cGUgZWxlbWVudCBjb250ZW50IG11c3QgYmUKLQkgKiAgICAgICAgIHVuaXF1ZSBpbiB0aGUgbWVzc2FnZWFkYXB0ZXIuIFNldmVyYWwgbWVzc2FnZWxpc3RlbmVycwotCSAqICAgICAgICAgY2FuIG5vdCB1c2UgdGhlIHNhbWUgbWVzc2FnZWxpc3RlbmVyLXR5cGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWVzc2FnZUFkYXB0ZXIoTWVzc2FnZUFkYXB0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX01lc3NhZ2VBZGFwdGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1lc3NhZ2VBZGFwdGVyIGdldE1lc3NhZ2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlciNnZXRNZXNzYWdlQWRhcHRlciA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1lc3NhZ2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXNzYWdlQWRhcHRlcihNZXNzYWdlQWRhcHRlciB2YWx1ZSk7Ci0KLX0gLy8gSW5ib3VuZFJlc291cmNlQWRhcHRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0pjYUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9KY2FGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYWYyYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0pjYUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmNhRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmNhRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29ubmVjdG9yIHZhbHVlCi0JICovCi0JQ29ubmVjdG9yIGNyZWF0ZUNvbm5lY3RvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBMaWNlbnNlIHZhbHVlCi0JICovCi0JTGljZW5zZSBjcmVhdGVMaWNlbnNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1lc3NhZ2VBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25uZWN0aW9uRGVmaW5pdGlvbiBjcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZG1pbiBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFkbWluIE9iamVjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWRtaW5PYmplY3QgY3JlYXRlQWRtaW5PYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWVzc2FnZUxpc3RlbmVyIGNyZWF0ZU1lc3NhZ2VMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZhdGlvblNwZWMgY3JlYXRlQWN0aXZhdGlvblNwZWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSBjcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBSZXNvdXJjZUFkYXB0ZXIgdmFsdWUKLQkgKi8KLQlSZXNvdXJjZUFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlY3VyaXR5UGVybWlzc2lvbiB2YWx1ZQotCSAqLwotCVNlY3VyaXR5UGVybWlzc2lvbiBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXV0aGVudGljYXRpb25NZWNoYW5pc20gdmFsdWUKLQkgKi8KLQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb25maWdQcm9wZXJ0eSB2YWx1ZQotCSAqLwotCUNvbmZpZ1Byb3BlcnR5IGNyZWF0ZUNvbmZpZ1Byb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIG1ldGhvZCBpcyBOT1QgYXBpLCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuICAKLQkgKiBFTUYgcGFja2FnZSBjbGFzc2VzIHNob3VsZCBiZSBhY2Nlc3MgdmlhIHRoZWlyICJlSU5TVEFOQ0UiIHN0YXRpYyBmaWVsZHMKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUpjYVBhY2thZ2UgZ2V0SmNhUGFja2FnZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvSmNhUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0pjYVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQzZWZmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvSmNhUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoJQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpjYVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiamNhIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RPUl9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RPUl9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RPUl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19TTUFMTF9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfX0RJU1BMQVlfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfX1ZFTkRPUl9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfX1NQRUNfVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19FSVNfVFlQRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19WRVJTSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfX0xJQ0VOU0UgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29ubmVjdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RPUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExJQ0VOU0UgPSA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lOVEVSRkFDRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lNUExfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgQWRhcHRlciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX1JFU09VUkNFX0FEQVBURVJfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUSUVTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVIgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRtaW4gT2JqZWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fQURNSU5fT0JKRUNUUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9QRVJNSVNTSU9OID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTSA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU00gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09ORklHX1BST1BFUlRZID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVFJBTlNBQ1RJT05fU1VQUE9SVF9LSU5EID0gMTU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFID0gMTQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiamNhLnhtaSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKY2FQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NVU1RPTV9BVVRIX01FQ0hfVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05GSUdfUFJPUEVSVFlfX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09ORklHX1BST1BFUlRZX19UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTkZJR19QUk9QRVJUWV9fVkFMVUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05GSUdfUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX1BFUk1JU1NJT05fX1NQRUNJRklDQVRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZWN1cml0eSBQZXJtaXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1BFUk1JU1NJT05fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExJQ0VOU0VfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExJQ0VOU0VfX1JFUVVJUkVEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElDRU5TRV9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGljZW5zZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSUNFTlNFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwgPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkluYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBBZGFwdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVIgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsIDxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gRGVmaW5pdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fREVGSU5JVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc21zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUFkYXB0ZXJJbXBsIDxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlQWRhcHRlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldE1lc3NhZ2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfQURBUFRFUiA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRV9MSVNURU5FUlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9BREFQVEVSX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldENvbm5lY3Rpb25EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTk5FQ1RJT05fREVGSU5JVElPTiA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09ORklHX1BST1BFUlRJRVMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OTkVDVElPTl9ERUZJTklUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsIDxlbT5BZG1pbiBPYmplY3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5BZG1pbk9iamVjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldEFkbWluT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFETUlOX09CSkVDVCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZG1pbiBPYmplY3QgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9DTEFTUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWRtaW4gT2JqZWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFETUlOX09CSkVDVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VMaXN0ZW5lckltcGwgPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlTGlzdGVuZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRNZXNzYWdlTGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9MSVNURU5FUiA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfTElTVEVORVJfX01FU1NBR0VfTElTVEVORVJfVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gU3BlYzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9MSVNURU5FUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25TcGVjSW1wbCA8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWN0aXZhdGlvblNwZWNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRBY3RpdmF0aW9uU3BlYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX1NQRUMgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUSUVTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fU1BFQ19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbCA8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb25uZWN0b3Igb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENvbm5lY3RvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25uZWN0b3JfVmVuZG9yTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25uZWN0b3JfU3BlY1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX0Vpc1R5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBMaWNlbnNlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRMaWNlbnNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldExpY2Vuc2VfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGljZW5zZV9SZXF1aXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5MaWNlbnNlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldExpY2Vuc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlciA8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldE1lc3NhZ2VBZGFwdGVyIDxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlciNnZXRNZXNzYWdlQWRhcHRlcigpCi0JICogQHNlZSAjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9NZXNzYWdlQWRhcHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIDxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRUcmFuc2FjdGlvblN1cHBvcnQgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMgPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25zKCkKLQkgKiBAc2VlICNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkRlZmluaXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKQotCSAqIEBzZWUgI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlciA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWVzc2FnZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXIjZ2V0TWVzc2FnZUxpc3RlbmVycyA8ZW0+TWVzc2FnZSBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyI2dldE1lc3NhZ2VMaXN0ZW5lcnMoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlQWRhcHRlcl9NZXNzYWdlTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24gPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbm5lY3Rpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyA8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpCi0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbm5lY3Rpb25EZWZpbml0aW9uX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKQotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKQotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkKLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkltcGxDbGFzcyA8ZW0+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MoKQotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbmZpZ1Byb3BlcnRpZXMgPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db25maWcgUHJvcGVydGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29uZmlnUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0IDxlbT5BZG1pbiBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWRtaW4gT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBZG1pbk9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UgPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZG1pbiBPYmplY3QgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0I2dldEFkbWluT2JqZWN0SW50ZXJmYWNlKCkKLQkgKiBAc2VlICNnZXRBZG1pbk9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0I2dldEFkbWluT2JqZWN0Q2xhc3MgPGVtPkFkbWluIE9iamVjdCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFkbWluIE9iamVjdCBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdCNnZXRBZG1pbk9iamVjdENsYXNzKCkKLQkgKiBAc2VlICNnZXRBZG1pbk9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdCNnZXRDb25maWdQcm9wZXJ0aWVzIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QjZ2V0Q29uZmlnUHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0QWRtaW5PYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXIgPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1lc3NhZ2VMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldE1lc3NhZ2VMaXN0ZW5lclR5cGUgPGVtPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXIjZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZUxpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlTGlzdGVuZXJfTWVzc2FnZUxpc3RlbmVyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldEFjdGl2YXRpb25TcGVjIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldEFjdGl2YXRpb25TcGVjKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlTGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uU3BlYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3RpdmF0aW9uU3BlYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWMjZ2V0QWN0aXZhdGlvblNwZWNDbGFzcyA8ZW0+QWN0aXZhdGlvbiBTcGVjIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0aXZhdGlvbiBTcGVjIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldEFjdGl2YXRpb25TcGVjQ2xhc3MoKQotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25TcGVjKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlY0NsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyA8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvblNwZWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIDxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJlc291cmNlQWRhcHRlciBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW1wbENsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MgPGVtPlJlc291cmNlIEFkYXB0ZXIgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIDxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBzZWUgI2dldFJlc291cmNlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlciA8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRBZG1pbk9iamVjdHMgPGVtPkFkbWluIE9iamVjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFkbWluIE9iamVjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldEFkbWluT2JqZWN0cygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUFkYXB0ZXJfQWRtaW5PYmplY3RzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlY3VyaXR5UGVybWlzc2lvbiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVBlcm1pc3Npb25fU3BlY2lmaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb24jZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eVBlcm1pc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXV0aGVudGljYXRpb25NZWNoYW5pc20gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29uZmlnUHJvcGVydHkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENvbmZpZ1Byb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25maWdQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0Q29uZmlnUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JSmNhRmFjdG9yeSBnZXRKY2FGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JJbXBsIDxlbT5Db25uZWN0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0Q29ubmVjdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTk5FQ1RPUiA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlbmRvciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OTkVDVE9SX19WRU5ET1JfTkFNRSA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JfVmVuZG9yTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3BlYyBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OTkVDVE9SX19TUEVDX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FaXMgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTk5FQ1RPUl9fRUlTX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX0Vpc1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05ORUNUT1JfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1ZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpY2Vuc2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05ORUNUT1JfX0xJQ0VOU0UgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVIgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuUmVzb3VyY2VBZGFwdGVySW1wbCA8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLlJlc291cmNlQWRhcHRlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZUFkYXB0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVTT1VSQ0VfQURBUFRFUiA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfQURBUFRFUl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lNUExfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUID0gZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEFkYXB0ZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRV9BREFQVEVSX0NMQVNTID0gZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9SZXNvdXJjZUFkYXB0ZXJDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUGVybWlzc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX0FEQVBURVJfX1NFQ1VSSVRZX1BFUk1JU1NJT05TID0gZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9TZWN1cml0eVBlcm1pc3Npb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc21zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TID0gZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVIgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkbWluIE9iamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFMgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWluT2JqZWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsIDxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBVVRIRU5USUNBVElPTl9NRUNIQU5JU00gPSBlSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU00gPSBlSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSA9IGVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNyZWRlbnRpYWwgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DUkVERU5USUFMX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DdXN0b20gQXV0aCBNZWNoIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NVU1RPTV9BVVRIX01FQ0hfVFlQRSA9IGVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DdXN0b21BdXRoTWVjaFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25maWdQcm9wZXJ0eUltcGwgPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbmZpZ1Byb3BlcnR5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldENvbmZpZ1Byb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTkZJR19QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09ORklHX1BST1BFUlRZX19OQU1FID0gZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05GSUdfUFJPUEVSVFlfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05GSUdfUFJPUEVSVFlfX1ZBTFVFID0gZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuU2VjdXJpdHlQZXJtaXNzaW9uSW1wbCA8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5UGVybWlzc2lvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRTZWN1cml0eVBlcm1pc3Npb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VDVVJJVFlfUEVSTUlTU0lPTiA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eVBlcm1pc3Npb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TcGVjaWZpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVVJJVFlfUEVSTUlTU0lPTl9fU1BFQ0lGSUNBVElPTiA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eVBlcm1pc3Npb25fU3BlY2lmaWNhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuTGljZW5zZUltcGwgPGVtPkxpY2Vuc2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5MaWNlbnNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldExpY2Vuc2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTElDRU5TRSA9IGVJTlNUQU5DRS5nZXRMaWNlbnNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJQ0VOU0VfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldExpY2Vuc2VfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElDRU5TRV9fUkVRVUlSRUQgPSBlSU5TVEFOQ0UuZ2V0TGljZW5zZV9SZXF1aXJlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBMSUNFTlNFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0TGljZW5zZV9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkluYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsIDxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSID0gZUlOU1RBTkNFLmdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgQWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSID0gZUlOU1RBTkNFLmdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCA8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIgPSBlSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCA9IGVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gU3VwcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQgPSBlSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIERlZmluaXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT05TID0gZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25EZWZpbml0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyA9IGVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VBZGFwdGVySW1wbCA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUFkYXB0ZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0TWVzc2FnZUFkYXB0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVTU0FHRV9BREFQVEVSID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VBZGFwdGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlQWRhcHRlcl9NZXNzYWdlTGlzdGVuZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwgPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldENvbm5lY3Rpb25EZWZpbml0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTk5FQ1RJT05fREVGSU5JVElPTiA9IGVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTID0gZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUyA9IGVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0aWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5BZG1pbk9iamVjdEltcGwgPGVtPkFkbWluIE9iamVjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFkbWluT2JqZWN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldEFkbWluT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFETUlOX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRtaW4gT2JqZWN0IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRtaW4gT2JqZWN0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0QWRtaW5PYmplY3RfQ29uZmlnUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUxpc3RlbmVySW1wbCA8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VMaXN0ZW5lckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRNZXNzYWdlTGlzdGVuZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVTU0FHRV9MSVNURU5FUiA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlTGlzdGVuZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FU1NBR0VfTElTVEVORVJfX01FU1NBR0VfTElTVEVORVJfVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlTGlzdGVuZXJfTWVzc2FnZUxpc3RlbmVyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBTcGVjPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uU3BlYygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWN0aXZhdGlvblNwZWNJbXBsIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uU3BlY0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRBY3RpdmF0aW9uU3BlYygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVkFUSU9OX1NQRUMgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvblNwZWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25TcGVjX0FjdGl2YXRpb25TcGVjQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUSUVTID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsIDxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydHkgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFID0gZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSA9IGVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRLaW5kIDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0IEtpbmQ8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRLaW5kCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0S2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFRSQU5TQUNUSU9OX1NVUFBPUlRfS0lORCA9IGVJTlNUQU5DRS5nZXRUcmFuc2FjdGlvblN1cHBvcnRLaW5kKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0N1c3RvbUF1dGhNZWNoVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpOwotCi19IC8vSmNhUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0xpY2Vuc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9MaWNlbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZTk0NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0xpY2Vuc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFNwZWNpZmllcyBsaWNlbnNpbmcgcmVxdWlyZW1lbnRzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIFNwZWNpZmllcyB3aGV0aGVyIGEgbGljZW5zZSBpcyByZXF1aXJlZCB0byBkZXBsb3kgYW5kIHVzZSB0aGlzIHJlc291cmNlIGFkYXB0ZXIsIGFuZCBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGljZW5zaW5nIHRlcm1zIChleGFtcGxlczogZHVyYXRpb24gb2YgbGljZW5zZSwgbnVtYmVyIG9mIGNvbm5lY3Rpb24gcmVzdHJpY3Rpb25zKS4KLSAqIEBzaW5jZSAxLjAgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGljZW5zZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSZXF1aXJlZCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzUmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZXF1aXJlZCBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZSNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXF1aXJlZCgpCi0JICogQHNlZSAjaXNSZXF1aXJlZCgpCi0JICogQHNlZSAjc2V0UmVxdWlyZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5MaWNlbnNlI2lzUmVxdWlyZWQgPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVxdWlyZWQoKQotCSAqIEBzZWUgI2lzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3NldFJlcXVpcmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldExpY2Vuc2VfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9NZXNzYWdlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL01lc3NhZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxM2RjOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL01lc3NhZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIEFkYXB0ZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgbWVzc2FnZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAqIG1lc3NhZ2luZyBjYXBhYmlsaXRpZXMgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMKLSAqIGNvbnRhaW5zIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIHJlc291cmNlIGFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUKLSAqIG1lc3NhZ2VsaXN0ZW5lciBlbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlciNnZXRNZXNzYWdlTGlzdGVuZXJzIDxlbT5NZXNzYWdlIExpc3RlbmVyczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0TWVzc2FnZUFkYXB0ZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUFkYXB0ZXIgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgTGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBMaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRNZXNzYWdlQWRhcHRlcl9NZXNzYWdlTGlzdGVuZXJzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRNZXNzYWdlTGlzdGVuZXJzKCk7Ci0KLX0gLy8gTWVzc2FnZUFkYXB0ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9NZXNzYWdlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9NZXNzYWdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyNjYyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvTWVzc2FnZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIExpc3RlbmVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEKLSAqIHNwZWNpZmljIG1lc3NhZ2UgbGlzdGVuZXIgc3VwcG9ydGVkIGJ5IHRoZSBtZXNzYWdpbmcKLSAqIHJlc291cmNlIGFkYXB0ZXIuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUKLSAqIG9mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbgotICogc3BlY2lmaWNhdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldE1lc3NhZ2VMaXN0ZW5lclR5cGUgPGVtPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciNnZXRBY3RpdmF0aW9uU3BlYyA8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRNZXNzYWdlTGlzdGVuZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUxpc3RlbmVyIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBMaXN0ZW5lciBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbGVtZW50IG1lc3NhZ2VsaXN0ZW5lci10eXBlIHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgKiAgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgYSBtZXNzYWdlCi0JICogICAgICAgICBsaXN0ZW5lciBpbnRlcmZhY2UuCi0JICogCi0JICogICAgICAgICBFeGFtcGxlOgotCSAqIAotCSAqICAgICAgICAgICA8bWVzc2FnZWxpc3RlbmVyLXR5cGU+amF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lcgotCSAqICAgICAgICAgICA8L21lc3NhZ2VsaXN0ZW5lci10eXBlPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VMaXN0ZW5lclR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0TWVzc2FnZUxpc3RlbmVyX01lc3NhZ2VMaXN0ZW5lclR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciNnZXRNZXNzYWdlTGlzdGVuZXJUeXBlIDxlbT5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnZUxpc3RlbmVyVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBTcGVjPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY3RpdmF0aW9uU3BlYyhBY3RpdmF0aW9uU3BlYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uU3BlYygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZhdGlvblNwZWMgZ2V0QWN0aXZhdGlvblNwZWMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXIjZ2V0QWN0aXZhdGlvblNwZWMgPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uU3BlYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZhdGlvblNwZWMoQWN0aXZhdGlvblNwZWMgdmFsdWUpOwotCi19IC8vIE1lc3NhZ2VMaXN0ZW5lcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwZGRhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIG91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0Ci0gKiBhbiBvdXRib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkKLSAqIHF1YWxpZmllZCBuYW1lcyBvZiBjbGFzc2VzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZgotICogdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cyBmb3IKLSAqIGNvbm5lY3Rpb24gbWFuYWdlbWVudCwgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydAotICogcHJvdmlkZWQsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkCi0gKiBhbmQgYWRkaXRpb25hbCByZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4KLSAqIAotICogSWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mCi0gKiByZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdAotICogc3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcwotICogcGFydCBvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzCi0gKiB0aGUgc2VjdXJpdHkgcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldFRyYW5zYWN0aW9uU3VwcG9ydCA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldENvbm5lY3Rpb25EZWZpbml0aW9ucyA8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVsZW1lbnQgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IHNwZWNpZmllcwotCSAqICAgICAgICAgd2hldGhlciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cwotCSAqICAgICAgICAgcmUtYXV0aGVudGljYXRpb24gb2YgZXhpc3RpbmcgTWFuYWdlZC0gQ29ubmVjdGlvbgotCSAqICAgICAgICAgaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGZvciB0aGUKLQkgKiAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gYW5kIG5vdCBmb3IgdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhpcyBlbGVtZW50IG11c3QgaGF2ZQotCSAqICAgICAgICAgZWl0aGVyIGEgInRydWUiIG9yICJmYWxzZSIgdmFsdWUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3Vuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydEtpbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRLaW5kCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblN1cHBvcnQoVHJhbnNhY3Rpb25TdXBwb3J0S2luZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRLaW5kCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldFRyYW5zYWN0aW9uU3VwcG9ydCA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25TdXBwb3J0KFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldFRyYW5zYWN0aW9uU3VwcG9ydCA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRLaW5kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIERlZmluaXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIERlZmluaXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkRlZmluaXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc21zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc21zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCk7Ci0KLX0gLy8gT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOTQwNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXF1aXJlZCBDb25maWcgUHJvcGVydHkgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSByZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLSAqIG9mIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgdXNlZCBmb3Igc3BlY2lmeWluZyBhCi0gKiByZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWUuIEl0IGlzIHVzZWQKLSAqIGJ5IHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSBlbGVtZW50cy4KLSAqIAotICogRXhhbXBsZToKLSAqIAotICogPHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eT5EZXN0aW5hdGlvbjwvcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0gLy8gUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9SZXNvdXJjZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9SZXNvdXJjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjY2FhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvUmVzb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHktcXVhbGlmaWVkIG5hbWVzIG9mIGNsYXNzLy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YgdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cywgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm92aWRlZCwgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkIGFuZCBhZGRpdGlvbmFsCi0gKiByZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4KLSAqIAotICogSWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mCi0gKiByZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdAotICogc3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcyBwYXJ0Ci0gKiBvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzIHRoZSBzZWN1cml0eQotICogcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlCi0JICogamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWQtQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMKLQkgKiBwcm92aWRlZCBhcyBwYXJ0IG9mIHJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIAotCSAqIHNwZWNpZmllZCBjb250cmFjdHMuCi0KLQkgKi8KLQlTdHJpbmcgZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlIHN1cHBvcnRlZCAKLQkgKiBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQotCSAqLwotCVN0cmluZyBnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBjbGFzcyB0aGF0Ci0JICogaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLQkgKi8KLQlTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ29ubmVjdGlvbkludGVyZmFjZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENvbm5lY3Rpb25JbnRlcmZhY2UgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRDb25uZWN0aW9uSW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ29ubmVjdGlvbkltcGxDbGFzcyBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIAotCSAqIHJlc291cmNlIGFkYXB0ZXIuCi0JICovCi0JU3RyaW5nIGdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDb25uZWN0aW9uSW1wbENsYXNzIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkltcGxDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFRyYW5zYWN0aW9uU3VwcG9ydCBhdHRyaWJ1dGUKLQkgKiBUaGUgdHJhbnNhY3Rpb24tc3VwcG9ydCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbGV2ZWwgb2YgdHJhbnNhY3Rpb24KLQkgKiBzdXBwb3J0IHByb3ZpZGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotCSAqIFRoZSB2YWx1ZSBvZiB0cmFuc2FjdGlvbi1zdXBwb3J0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICogICBOb1RyYW5zYWN0aW9uCi0JICogICBMb2NhbFRyYW5zYWN0aW9uCi0JICogICBYQVRyYW5zYWN0aW9uCi0JICovCi0JVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBnZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRLaW5kCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRUcmFuc2FjdGlvblN1cHBvcnQgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRLaW5kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25TdXBwb3J0KFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cwotCSAqIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtQ29ubmVjdGlvbiBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMKLQkgKiBpbmZvcm1hdGlvbiBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gYW5kIG5vdCBmb3IgdGhlCi0JICogdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuCi0JICovCi0JYm9vbGVhbiBpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci1jbGFzcyBzcGVjaWZpZXMgdGhlCi0JICogICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzCi0JICogICAgICAgICB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLlJlc291cmNlQWRhcHRlcgotCSAqICAgICAgICAgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZgotCSAqICAgICAgICAgcmVzb3VyY2UgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvcgotCSAqICAgICAgICAgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbgotCSAqICAgICAgICAgb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRSZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyQ2xhc3MoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MgPGVtPlJlc291cmNlIEFkYXB0ZXIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIEFkYXB0ZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc291cmNlQWRhcHRlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBTZWN1cml0eVBlcm1pc3Npb25zIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRTZWN1cml0eVBlcm1pc3Npb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIENvbmZpZ1Byb3BlcnRpZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIFRoZSBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UgZWxlbWVudCBjb250ZW50IG11c3QgYmUKLQkgKiAgICAgICAgIHVuaXF1ZSBpbiB0aGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyLiBNdWx0aXBsZSBjb25uZWN0aW9uLWRlZmluaXRpb25zCi0JICogICAgICAgICBjYW4gbm90IHVzZSB0aGUgc2FtZSBjb25uZWN0aW9uZmFjdG9yeS10eXBlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcihPdXRib3VuZFJlc291cmNlQWRhcHRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPdXRib3VuZFJlc291cmNlQWRhcHRlciBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlciA8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIGdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlciA8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoSW5ib3VuZFJlc291cmNlQWRhcHRlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZG1pbiBPYmplY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkbWluIE9iamVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIE9iamVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRSZXNvdXJjZUFkYXB0ZXJfQWRtaW5PYmplY3RzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0IiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QWRtaW5PYmplY3RzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9TZWN1cml0eVBlcm1pc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9TZWN1cml0eVBlcm1pc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0ODRkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvU2VjdXJpdHlQZXJtaXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBTcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLSAqIAotICogVGhlIHNlY3VyaXR5IHBlcm1pc3Npb24gbGlzdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXJlIG9uZXMgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2UgcmVxdWlyZWQgYnkgdGhlIGRlZmF1bHQgcGVybWlzc2lvbiBzZXQgYXMgc3BlY2lmaWVkIGluIHRoZSBjb25uZWN0b3Igc3BlY2lmaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGNhbiBtZW50aW9uIHNwZWNpZmljIHJlYXNvbiB0aGF0IHJlc291cmNlIGFkYXB0ZXIgcmVxdWlyZXMgYSBnaXZlbiBzZWN1cml0eSBwZXJtaXNzaW9uLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMCAqLwotcHVibGljIGludGVyZmFjZSBTZWN1cml0eVBlcm1pc3Npb24gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgU3BlY2lmaWNhdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZWxlbWVudCBwZXJtaXNzaW9uLXNwZWMgc3BlY2lmaWVzIGEgc2VjdXJpdHkgcGVybWlzc2lvbiBiYXNlZCBvbiB0aGUKLQkgKiBTZWN1cml0eSBwb2xpY3kgZmlsZSBzeW50YXguIAotCi0JICovCi0JU3RyaW5nIGdldFNwZWNpZmljYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTcGVjaWZpY2F0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0U3BlY2lmaWNhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllNzY2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCB7fQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19UUkFOU0FDVElPTj0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9UUkFOU0FDVElPTj0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYQV9UUkFOU0FDVElPTj0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5vIFRyYW5zYWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tm8gVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9fVFJBTlNBQ1RJT04KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgTk9fVFJBTlNBQ1RJT05fTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kKE5PX1RSQU5TQUNUSU9OLCAiTm9UcmFuc2FjdGlvbiIsICJOb1RyYW5zYWN0aW9uIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbCBUcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9UUkFOU0FDVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBMT0NBTF9UUkFOU0FDVElPTl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoTE9DQUxfVFJBTlNBQ1RJT04sICJMb2NhbFRyYW5zYWN0aW9uIiwgIkxvY2FsVHJhbnNhY3Rpb24iKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5YQSBUcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlhBIFRyYW5zYWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1hBX1RSQU5TQUNUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIFhBX1RSQU5TQUNUSU9OX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25TdXBwb3J0S2luZChYQV9UUkFOU0FDVElPTiwgIlhBVHJhbnNhY3Rpb24iLCAiWEFUcmFuc2FjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmRbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVHJhbnNhY3Rpb25TdXBwb3J0S2luZFtdIHsKLQkJCU5PX1RSQU5TQUNUSU9OX0xJVEVSQUwsCi0JCQlMT0NBTF9UUkFOU0FDVElPTl9MSVRFUkFMLAotCQkJWEFfVFJBTlNBQ1RJT05fTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFN1cHBvcnQgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHJhbnNhY3Rpb25TdXBwb3J0S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFN1cHBvcnQgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc2FjdGlvblN1cHBvcnRLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOT19UUkFOU0FDVElPTjogcmV0dXJuIE5PX1RSQU5TQUNUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIExPQ0FMX1RSQU5TQUNUSU9OOiByZXR1cm4gTE9DQUxfVFJBTlNBQ1RJT05fTElURVJBTDsKLQkJCWNhc2UgWEFfVFJBTlNBQ1RJT046IHJldHVybiBYQV9UUkFOU0FDVElPTl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmFuc2FjdGlvblN1cHBvcnRLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9UcmFuc2FjdGlvblN1cHBvcnRLaW5kCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uU3BlY0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25TcGVjSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZkOTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25TcGVjSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3RpdmF0aW9uIFNwZWM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25TcGVjSW1wbCNnZXRBY3RpdmF0aW9uU3BlY0NsYXNzIDxlbT5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25TcGVjSW1wbCNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdGlvblNwZWNJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgQWN0aXZhdGlvblNwZWMgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCkgPGVtPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZhdGlvblNwZWNDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVElPTl9TUEVDX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2YXRpb25TcGVjQ2xhc3MoKSA8ZW0+QWN0aXZhdGlvbiBTcGVjIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2YXRpb25TcGVjQ2xhc3MgPSBBQ1RJVkFUSU9OX1NQRUNfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKSA8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3RpdmF0aW9uU3BlY0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLkFDVElWQVRJT05fU1BFQzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2YXRpb25TcGVjQ2xhc3MoKSB7Ci0JCXJldHVybiBhY3RpdmF0aW9uU3BlY0NsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2YXRpb25TcGVjQ2xhc3MoU3RyaW5nIG5ld0FjdGl2YXRpb25TcGVjQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZEFjdGl2YXRpb25TcGVjQ2xhc3MgPSBhY3RpdmF0aW9uU3BlY0NsYXNzOwotCQlhY3RpdmF0aW9uU3BlY0NsYXNzID0gbmV3QWN0aXZhdGlvblNwZWNDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUywgb2xkQWN0aXZhdGlvblNwZWNDbGFzcywgYWN0aXZhdGlvblNwZWNDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCWlmIChyZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJcmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fUkVRVUlSRURfQ09ORklHX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiByZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fUkVRVUlSRURfQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19BQ1RJVkFUSU9OX1NQRUNfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEFjdGl2YXRpb25TcGVjQ2xhc3MoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTOgotCQkJCXNldEFjdGl2YXRpb25TcGVjQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fUkVRVUlSRURfQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19BQ1RJVkFUSU9OX1NQRUNfQ0xBU1M6Ci0JCQkJc2V0QWN0aXZhdGlvblNwZWNDbGFzcyhBQ1RJVkFUSU9OX1NQRUNfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldFJlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19BQ1RJVkFUSU9OX1NQRUNfQ0xBU1M6Ci0JCQkJcmV0dXJuIEFDVElWQVRJT05fU1BFQ19DTEFTU19FREVGQVVMVCA9PSBudWxsID8gYWN0aXZhdGlvblNwZWNDbGFzcyAhPSBudWxsIDogIUFDVElWQVRJT05fU1BFQ19DTEFTU19FREVGQVVMVC5lcXVhbHMoYWN0aXZhdGlvblNwZWNDbGFzcyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzICE9IG51bGwgJiYgIXJlcXVpcmVkQ29uZmlnUHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhY3RpdmF0aW9uU3BlY0NsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3RpdmF0aW9uU3BlY0NsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQWN0aXZhdGlvblNwZWNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BZG1pbk9iamVjdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0FkbWluT2JqZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmI1ZDc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0FkbWluT2JqZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZG1pbiBPYmplY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFkbWluT2JqZWN0SW1wbCNnZXRBZG1pbk9iamVjdEludGVyZmFjZSA8ZW0+QWRtaW4gT2JqZWN0IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsI2dldEFkbWluT2JqZWN0Q2xhc3MgPGVtPkFkbWluIE9iamVjdCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsI2dldENvbmZpZ1Byb3BlcnRpZXMgPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWRtaW5PYmplY3RJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgQWRtaW5PYmplY3QgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZG1pbk9iamVjdEludGVyZmFjZSgpIDxlbT5BZG1pbiBPYmplY3QgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZG1pbk9iamVjdEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURNSU5fT0JKRUNUX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZG1pbk9iamVjdEludGVyZmFjZSgpIDxlbT5BZG1pbiBPYmplY3QgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZG1pbk9iamVjdEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhZG1pbk9iamVjdEludGVyZmFjZSA9IEFETUlOX09CSkVDVF9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRtaW5PYmplY3RDbGFzcygpIDxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFETUlOX09CSkVDVF9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZG1pbk9iamVjdENsYXNzKCkgPGVtPkFkbWluIE9iamVjdCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRtaW5PYmplY3RDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhZG1pbk9iamVjdENsYXNzID0gQURNSU5fT0JKRUNUX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnUHJvcGVydGllcygpIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29uZmlnUHJvcGVydGllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWRtaW5PYmplY3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5BRE1JTl9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZG1pbk9iamVjdEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGFkbWluT2JqZWN0SW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkbWluT2JqZWN0SW50ZXJmYWNlKFN0cmluZyBuZXdBZG1pbk9iamVjdEludGVyZmFjZSkgewotCQlTdHJpbmcgb2xkQWRtaW5PYmplY3RJbnRlcmZhY2UgPSBhZG1pbk9iamVjdEludGVyZmFjZTsKLQkJYWRtaW5PYmplY3RJbnRlcmZhY2UgPSBuZXdBZG1pbk9iamVjdEludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9JTlRFUkZBQ0UsIG9sZEFkbWluT2JqZWN0SW50ZXJmYWNlLCBhZG1pbk9iamVjdEludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRtaW5PYmplY3RDbGFzcygpIHsKLQkJcmV0dXJuIGFkbWluT2JqZWN0Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRtaW5PYmplY3RDbGFzcyhTdHJpbmcgbmV3QWRtaW5PYmplY3RDbGFzcykgewotCQlTdHJpbmcgb2xkQWRtaW5PYmplY3RDbGFzcyA9IGFkbWluT2JqZWN0Q2xhc3M7Ci0JCWFkbWluT2JqZWN0Q2xhc3MgPSBuZXdBZG1pbk9iamVjdENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0NMQVNTLCBvbGRBZG1pbk9iamVjdENsYXNzLCBhZG1pbk9iamVjdENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCWlmIChjb25maWdQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCWNvbmZpZ1Byb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQ29uZmlnUHJvcGVydHkuY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19DT05GSUdfUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ1Byb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb25maWdQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0QWRtaW5PYmplY3RDbGFzcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRToKLQkJCQlzZXRBZG1pbk9iamVjdEludGVyZmFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfQ0xBU1M6Ci0JCQkJc2V0QWRtaW5PYmplY3RDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRToKLQkJCQlzZXRBZG1pbk9iamVjdEludGVyZmFjZShBRE1JTl9PQkpFQ1RfSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfQ0xBU1M6Ci0JCQkJc2V0QWRtaW5PYmplY3RDbGFzcyhBRE1JTl9PQkpFQ1RfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldENvbmZpZ1Byb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gQURNSU5fT0JKRUNUX0lOVEVSRkFDRV9FREVGQVVMVCA9PSBudWxsID8gYWRtaW5PYmplY3RJbnRlcmZhY2UgIT0gbnVsbCA6ICFBRE1JTl9PQkpFQ1RfSU5URVJGQUNFX0VERUZBVUxULmVxdWFscyhhZG1pbk9iamVjdEludGVyZmFjZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfQ0xBU1M6Ci0JCQkJcmV0dXJuIEFETUlOX09CSkVDVF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gYWRtaW5PYmplY3RDbGFzcyAhPSBudWxsIDogIUFETUlOX09CSkVDVF9DTEFTU19FREVGQVVMVC5lcXVhbHMoYWRtaW5PYmplY3RDbGFzcyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gY29uZmlnUHJvcGVydGllcyAhPSBudWxsICYmICFjb25maWdQcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFkbWluT2JqZWN0SW50ZXJmYWNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhZG1pbk9iamVjdEludGVyZmFjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWRtaW5PYmplY3RDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWRtaW5PYmplY3RDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FkbWluT2JqZWN0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkyMjU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllcyBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBOb3RlIHRoYXQgdGhpcyBzdXBwb3J0IGlzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgbm90IGZvciB0aGUgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBzcGVjaWZpZXMgYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQgZm9yIHRoZSBzdXBwb3J0IG9mIHNlY3VyaXR5IGNvbnRyYWN0IGFuZCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uCi0gKiAKLSAqIE5vdGUgdGhhdCBCYXNpY1Bhc3N3b3JkIG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQotICogamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0gKiBUaGUgS2VyYnY1IG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQotICogamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIGludGVyZmFjZS4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIDxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA9IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEVfRURFRkFVTFQgPSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUuQkFTSUNfUEFTU1dPUkRfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlID0gQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWRlbnRpYWxJbnRlcmZhY2UoKSA8ZW0+Q3JlZGVudGlhbCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWRlbnRpYWxJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSRURFTlRJQUxfSU5URVJGQUNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3JlZGVudGlhbEludGVyZmFjZSA9IENSRURFTlRJQUxfSU5URVJGQUNFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21BdXRoTWVjaFR5cGUoKSA8ZW0+Q3VzdG9tIEF1dGggTWVjaCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXN0b21BdXRoTWVjaFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9BVVRIX01FQ0hfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbUF1dGhNZWNoVHlwZSA9IENVU1RPTV9BVVRIX01FQ0hfVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIHsKLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKFN0cmluZyBuZXdBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSkgewotCQlTdHJpbmcgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc20gPSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLQkJYXV0aGVudGljYXRpb25NZWNoYW5pc20gPSBuZXdBdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTSwgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc20sIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIHNwZWNpZmllcyB0eXBlIG9mIGFuIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4KLQkgKiAKLQkgKiBUaGUgZXhhbXBsZSB2YWx1ZXMgYXJlOgotCSAqICAgLSBCYXNpY1Bhc3N3b3JkCi0JICogICAtIEtlcmJ2NQotCSAqIAotCSAqIEFueSBhZGRpdGlvbmFsIHNlY3VyaXR5IG1lY2hhbmlzbXMgYXJlIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZQotCSAqIENvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotCSAqLwotCXB1YmxpYyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgewotCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZShBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgbmV3QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKSB7Ci0JCUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBvbGRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGU7Ci0JCWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA9IG5ld0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA9PSBudWxsID8gQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEVfRURFRkFVTFQgOiBuZXdBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGU7Ci0JCWJvb2xlYW4gb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldCA9IGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQ7Ci0JCWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEUsIG9sZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSwgYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLCAhb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgewotCQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlID0gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlOwotCQlib29sZWFuIG9sZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQgPSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFU2V0OwotCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPSBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRV9FREVGQVVMVDsKLQkJYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSwgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRV9FREVGQVVMVCwgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgewotCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgdGhlIGludGVyZmFjZSB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGZvcgotCSAqIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3JlZGVudGlhbHMuIFRoaXMgZWxlbWVudCBzaG91bGQgYmUgdXNlZCBieQotCSAqIGFwcGxpY2F0aW9uIHNlcnZlciB0byBmaW5kIG91dCB0aGUgQ3JlZGVudGlhbCBpbnRlcmZhY2UgaXQgc2hvdWxkIHVzZSBhcyBwYXJ0Ci0JICogb2YgdGhlIHNlY3VyaXR5IGNvbnRyYWN0LgotCSAqIAotCSAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOgotCSAqICAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwKLQkgKiAgICBqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwKLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlZGVudGlhbEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGNyZWRlbnRpYWxJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlZGVudGlhbEludGVyZmFjZShTdHJpbmcgbmV3Q3JlZGVudGlhbEludGVyZmFjZSkgewotCQlTdHJpbmcgb2xkQ3JlZGVudGlhbEludGVyZmFjZSA9IGNyZWRlbnRpYWxJbnRlcmZhY2U7Ci0JCWNyZWRlbnRpYWxJbnRlcmZhY2UgPSBuZXdDcmVkZW50aWFsSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0UsIG9sZENyZWRlbnRpYWxJbnRlcmZhY2UsIGNyZWRlbnRpYWxJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXV0aGVudGljYXRpb25NZWNoYW5pc20pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTogIik7Ci0JCWlmIChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyZWRlbnRpYWxJbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyZWRlbnRpYWxJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGN1c3RvbUF1dGhNZWNoVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3VzdG9tQXV0aE1lY2hUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhpcyBpcyBhbiBpbnRlcm5hbCB2YXJpYWJsZSB1c2VkIHRvIHN0b3JlIHRoZSBBdGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSB3aGVuCi0JICogaXQgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gQmFzaWNQYXNzd29yZCBvciBLZXJidjUuICBBdXRoZW50aWNhdGlvbk1lY2FuaXNtVHlwZSAKLQkgKiBpcyBzZXQgdG8gJ0N1c3RvbScgaW4gdGhvc2UgY2FzZXMuICBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgYnkKLQkgKiBydW50aW1lLiAgSXQgaXMgb25seSB1c2VkIGJ5IHRoZSB3cml0ZXIgdG8gd3JpdGUgYmFjayBvdXQgdGhlIGN1c3RvbQotCSAqIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBzdHJpbmcgaW4gdGhlIGNhc2Ugb2YgY3VzdG9tCi0JICogQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlJ3MuICAKLQkgKiBUaGlzIHZhcmlhYmxlIGlzIGludGVybmFsLCB1c2VkIG9ubHkgYnkgdGhlIHJlYWRlci8vd3JpdGVyIGNsYXNzZXMsIGFuZCBjYW4KLQkgKiBjaGFuZ2Ugb3IgZGlzYXBwZWFyIHdpdGhvdXQgbm90aWNlLiAgCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXN0b21BdXRoTWVjaFR5cGUoKSB7Ci0JCXJldHVybiBjdXN0b21BdXRoTWVjaFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9tQXV0aE1lY2hUeXBlKFN0cmluZyBuZXdDdXN0b21BdXRoTWVjaFR5cGUpIHsKLQkJU3RyaW5nIG9sZEN1c3RvbUF1dGhNZWNoVHlwZSA9IGN1c3RvbUF1dGhNZWNoVHlwZTsKLQkJY3VzdG9tQXV0aE1lY2hUeXBlID0gbmV3Q3VzdG9tQXV0aE1lY2hUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1VTVE9NX0FVVEhfTUVDSF9UWVBFLCBvbGRDdXN0b21BdXRoTWVjaFR5cGUsIGN1c3RvbUF1dGhNZWNoVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNOgotCQkJCXJldHVybiBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldENyZWRlbnRpYWxJbnRlcmZhY2UoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NVU1RPTV9BVVRIX01FQ0hfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Q3VzdG9tQXV0aE1lY2hUeXBlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU006Ci0JCQkJc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEU6Ci0JCQkJc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NSRURFTlRJQUxfSU5URVJGQUNFOgotCQkJCXNldENyZWRlbnRpYWxJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1VTVE9NX0FVVEhfTUVDSF9UWVBFOgotCQkJCXNldEN1c3RvbUF1dGhNZWNoVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNOgotCQkJCXNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEU6Ci0JCQkJdW5zZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DUkVERU5USUFMX0lOVEVSRkFDRToKLQkJCQlzZXRDcmVkZW50aWFsSW50ZXJmYWNlKENSRURFTlRJQUxfSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEU6Ci0JCQkJc2V0Q3VzdG9tQXV0aE1lY2hUeXBlKENVU1RPTV9BVVRIX01FQ0hfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTToKLQkJCQlyZXR1cm4gQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX0VERUZBVUxUID09IG51bGwgPyBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSAhPSBudWxsIDogIUFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9FREVGQVVMVC5lcXVhbHMoYXV0aGVudGljYXRpb25NZWNoYW5pc20pOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DUkVERU5USUFMX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gQ1JFREVOVElBTF9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGNyZWRlbnRpYWxJbnRlcmZhY2UgIT0gbnVsbCA6ICFDUkVERU5USUFMX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoY3JlZGVudGlhbEludGVyZmFjZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEU6Ci0JCQkJcmV0dXJuIENVU1RPTV9BVVRIX01FQ0hfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gY3VzdG9tQXV0aE1lY2hUeXBlICE9IG51bGwgOiAhQ1VTVE9NX0FVVEhfTUVDSF9UWVBFX0VERUZBVUxULmVxdWFscyhjdXN0b21BdXRoTWVjaFR5cGUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25maWdQcm9wZXJ0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0NvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTc1YjkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0NvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi0KLS8qKgotICogVGhlIGNvbmZpZyBwcm9wZXJ0eSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgc2luZ2xlCi0gKiBjb25maWd1cmF0aW9uIHByb3BlcnR5IGZvciBhIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZS4KLSAqIAotICogRWFjaCBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UgY3JlYXRlcyBjb25uZWN0aW9ucyB0byBhIHNwZWNpZmljIEVJUyBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBjb25maWd1cmVkIG9uIHRoZSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuIFRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIG9ubHkgb25jZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBldmVuIHRob3VnaCBhIHJlc291cmNlIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIG11bHRpcGxlIE1hbmFnZWRDb25ubmVjdGlvbi1GYWN0b3J5IGluc3RhbmNlcyAodGhhdCBjcmVhdGUgY29ubmVjdGlvbnMgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBFSVMpLgotICogCi0gKiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIG5hbWUsIHR5cGUKLSAqIGFuZCBhbiBvcHRpb25hbCB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gSWYgdGhlIHJlc291cmNlCi0gKiBhZGFwdGVyIHByb3ZpZGVyIGRvZXMgbm90IHNwZWNpZnkgYSB2YWx1ZSB0aGFuIHRoZSBkZXBsb3llciBpcwotICogcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBhIHZhbGlkIHZhbHVlIGZvciBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0gKiAKLSAqIEFueSBib3VuZHMgb3Igd2VsbC1kZWZpbmVkIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZXNjcmliZWQgaW4gdGhlIGRlc2NyaXB0aW9uLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnUHJvcGVydHlJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgQ29uZmlnUHJvcGVydHkgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb25maWdQcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5DT05GSUdfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBDb250YWlucyB0aGUgbmFtZSBvZiBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0JICogCi0JICogVGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgZGVmaW5lcyBhIHNldCBvZiB3ZWxsLWRlZmluZWQgcHJvcGVydGllcyBhbGwgb2YgdHlwZSBqYXZhLmxhbmcuU3RyaW5nLiBUaGVzZSBhcmUgYXMgZm9sbG93czoKLQkgKiAKLQkgKiAgICAgIFNlcnZlck5hbWUKLQkgKiAgICAgIFBvcnROdW1iZXIKLQkgKiAgICAgIFVzZXJOYW1lCi0JICogICAgICBQYXNzd29yZAotCSAqICAgICAgQ29ubmVjdGlvblVSTAotCSAqIAotCSAqIEEgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciBjYW4gZXh0ZW5kIHRoaXMgcHJvcGVydHkgc2V0IHRvIGluY2x1ZGUgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgaXRzIHVuZGVybHlpbmcgRUlTLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQ29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIHR5cGUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGFzIHJlcXVpcmVkIGJ5IE1hbmFnZWRDb25uZWN0aW9uLUZhY3RvcnkgaW5zdGFuY2UuCi0JICogCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBjb25maWctcHJvcGVydHktdHlwZToKLQkgKiAgICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi0JICogICAgamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkJ5dGUsIGphdmEubGFuZy5TaG9ydCwKLQkgKiAgICBqYXZhLmxhbmcuTG9uZywgamF2YS5sYW5nLkZsb2F0LCBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQ29udGFpbnMgdGhlIHZhbHVlIG9mIGEgY29uZmlndXJhdGlvbiBlbnRyeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rpb25EZWZpbml0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMmUxNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIDxlbT5NYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsI2dldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCNnZXRDb25uZWN0aW9uSW1wbENsYXNzIDxlbT5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCNnZXRDb25maWdQcm9wZXJ0aWVzIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENvbm5lY3Rpb25EZWZpbml0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSA8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpIDxlbT5NYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgPSBNQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSA9IENPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgPSBDT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkgPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkgPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25JbnRlcmZhY2UgPSBDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkgPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9JTVBMX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MoKSA8ZW0+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25JbXBsQ2xhc3MgPSBDT05ORUNUSU9OX0lNUExfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25maWdQcm9wZXJ0aWVzKCkgPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb25maWdQcm9wZXJ0aWVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0aW9uRGVmaW5pdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLkNPTk5FQ1RJT05fREVGSU5JVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoU3RyaW5nIG5ld01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKSB7Ci0JCVN0cmluZyBvbGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyA9IG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOwotCQltYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyA9IG5ld01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1MsIG9sZE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzLCBtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZShTdHJpbmcgbmV3Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlID0gY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U7Ci0JCWNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlID0gbmV3Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFLCBvbGRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSwgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkgewotCQlyZXR1cm4gY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoU3RyaW5nIG5ld0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKSB7Ci0JCVN0cmluZyBvbGRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyA9IGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOwotCQljb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyA9IG5ld0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MsIG9sZENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzLCBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25JbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkludGVyZmFjZShTdHJpbmcgbmV3Q29ubmVjdGlvbkludGVyZmFjZSkgewotCQlTdHJpbmcgb2xkQ29ubmVjdGlvbkludGVyZmFjZSA9IGNvbm5lY3Rpb25JbnRlcmZhY2U7Ci0JCWNvbm5lY3Rpb25JbnRlcmZhY2UgPSBuZXdDb25uZWN0aW9uSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UsIG9sZENvbm5lY3Rpb25JbnRlcmZhY2UsIGNvbm5lY3Rpb25JbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uSW1wbENsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25JbXBsQ2xhc3MoU3RyaW5nIG5ld0Nvbm5lY3Rpb25JbXBsQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZENvbm5lY3Rpb25JbXBsQ2xhc3MgPSBjb25uZWN0aW9uSW1wbENsYXNzOwotCQljb25uZWN0aW9uSW1wbENsYXNzID0gbmV3Q29ubmVjdGlvbkltcGxDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUywgb2xkQ29ubmVjdGlvbkltcGxDbGFzcywgY29ubmVjdGlvbkltcGxDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb25maWdQcm9wZXJ0aWVzKCkgewotCQlpZiAoY29uZmlnUHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQljb25maWdQcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENvbmZpZ1Byb3BlcnR5LmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09ORklHX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBjb25maWdQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29uZmlnUHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTOgotCQkJCXJldHVybiBnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTOgotCQkJCXJldHVybiBnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldENvbm5lY3Rpb25JbnRlcmZhY2UoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1M6Ci0JCQkJc2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRToKLQkJCQlzZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUzoKLQkJCQlzZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRToKLQkJCQlzZXRDb25uZWN0aW9uSW50ZXJmYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUzoKLQkJCQlzZXRDb25uZWN0aW9uSW1wbENsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldENvbmZpZ1Byb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldENvbmZpZ1Byb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKLQkJCQlzZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyhNQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRToKLQkJCQlzZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZShDT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUzoKLQkJCQlzZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyhDT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0U6Ci0JCQkJc2V0Q29ubmVjdGlvbkludGVyZmFjZShDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTOgotCQkJCXNldENvbm5lY3Rpb25JbXBsQ2xhc3MoQ09OTkVDVElPTl9JTVBMX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTOgotCQkJCXJldHVybiBNQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgIT0gbnVsbCA6ICFNQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTU19FREVGQVVMVC5lcXVhbHMobWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVCA9PSBudWxsID8gY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgIT0gbnVsbCA6ICFDT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxULmVxdWFscyhjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUzoKLQkJCQlyZXR1cm4gQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzICE9IG51bGwgOiAhQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU5URVJGQUNFOgotCQkJCXJldHVybiBDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVCA9PSBudWxsID8gY29ubmVjdGlvbkludGVyZmFjZSAhPSBudWxsIDogIUNPTk5FQ1RJT05fSU5URVJGQUNFX0VERUZBVUxULmVxdWFscyhjb25uZWN0aW9uSW50ZXJmYWNlKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUzoKLQkJCQlyZXR1cm4gQ09OTkVDVElPTl9JTVBMX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBjb25uZWN0aW9uSW1wbENsYXNzICE9IG51bGwgOiAhQ09OTkVDVElPTl9JTVBMX0NMQVNTX0VERUZBVUxULmVxdWFscyhjb25uZWN0aW9uSW1wbENsYXNzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBjb25maWdQcm9wZXJ0aWVzICE9IG51bGwgJiYgIWNvbmZpZ1Byb3BlcnRpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbkludGVyZmFjZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkludGVyZmFjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbkltcGxDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkltcGxDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Nvbm5lY3Rpb25EZWZpbml0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY3ZGM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlcjsKLQotCi0vKioKLSAqIFRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGVsZW1lbnQgaW5jbHVkZXMgZ2VuZXJhbCBpbmZvcm1hdGlvbiAtIHZlbmRvciBuYW1lLCB2ZXJzaW9uLCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gc3VwcG9ydGVkLCBpY29uIC0gIGFib3V0IHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gSXQgYWxzbyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXIuCi0KLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3RvckltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBDb25uZWN0b3IgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlbmRvck5hbWUoKSA8ZW0+VmVuZG9yIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlbmRvck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVuZG9yTmFtZSA9IFZFTkRPUl9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTcGVjVmVyc2lvbigpIDxlbT5TcGVjIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNwZWNWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDX1ZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjVmVyc2lvbiA9IFNQRUNfVkVSU0lPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWlzVHlwZSgpIDxlbT5FaXMgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWlzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUlTX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlaXNUeXBlID0gRUlTX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBMaWNlbnNlIGxpY2Vuc2UgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUFkYXB0ZXIgcmVzb3VyY2VBZGFwdGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29ubmVjdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLkNPTk5FQ1RPUjsKLQl9Ci0KLQkvKioKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlzdXBlci5zZXREaXNwbGF5TmFtZShuZXdEaXNwbGF5TmFtZSk7Ci0JfQotCQotCS8qKgotCSogVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCXJldHVybiByZXMuZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgdmVuZG9yLgotCSAqIEV4YW1wbGU6IFdvbWJhdCBDb3JwLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuIHZlbmRvck5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVuZG9yTmFtZShTdHJpbmcgbmV3VmVuZG9yTmFtZSkgewotCQlTdHJpbmcgb2xkVmVuZG9yTmFtZSA9IHZlbmRvck5hbWU7Ci0JCXZlbmRvck5hbWUgPSBuZXdWZW5kb3JOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVORE9SX05BTUUsIG9sZFZlbmRvck5hbWUsIHZlbmRvck5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3llciB0byBjb25maWd1cmUgdGhlIHJlc291cmNlIGFkYXB0ZXIgdG8gc3VwcG9ydCBkZXBsb3ltZW50IGFuZCBydW50aW1lIHJlcXVpcmVtZW50cyBvZiB0aGUgY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNWZXJzaW9uKCkgewotCQlyZXR1cm4gc3BlY1ZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlY1ZlcnNpb24oU3RyaW5nIG5ld1NwZWNWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRTcGVjVmVyc2lvbiA9IHNwZWNWZXJzaW9uOwotCQlzcGVjVmVyc2lvbiA9IG5ld1NwZWNWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fU1BFQ19WRVJTSU9OLCBvbGRTcGVjVmVyc2lvbiwgc3BlY1ZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiB0aGUgRUlTLiBGb3IgZXhhbXBsZSwgdGhlIHR5cGUgb2YgYW4gRUlTIGNhbiBiZSBwcm9kdWN0IG5hbWUgb2YgRUlTIGluZGVwZW5kZW50IG9mIGFueSB2ZXJzaW9uIGluZm8uCi0JICogCi0JICogVGhpcyBoZWxwcyBpbiBpZGVudGlmeWluZyBFSVMgaW5zdGFuY2VzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aAotCSAqIHRoaXMgcmVzb3VyY2UgYWRhcHRlci4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWlzVHlwZSgpIHsKLQkJcmV0dXJuIGVpc1R5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWlzVHlwZShTdHJpbmcgbmV3RWlzVHlwZSkgewotCQlTdHJpbmcgb2xkRWlzVHlwZSA9IGVpc1R5cGU7Ci0JCWVpc1R5cGUgPSBuZXdFaXNUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fRUlTX1RZUEUsIG9sZEVpc1R5cGUsIGVpc1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyLgotCSAqIAotCSAqIEV4YW1wbGU6IDEuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyBsaWNlbnNpbmcgcmVxdWlyZW1lbnRzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLCBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGxpY2Vuc2luZyB0ZXJtcyAoZXhhbXBsZXM6IGR1cmF0aW9uIG9mIGxpY2Vuc2UsIG51bWJlciBvZgotCSAqIGNvbm5lY3Rpb24gcmVzdHJpY3Rpb25zKS4KLQkgKi8KLQlwdWJsaWMgTGljZW5zZSBnZXRMaWNlbnNlKCkgewotCQlyZXR1cm4gbGljZW5zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRMaWNlbnNlKExpY2Vuc2UgbmV3TGljZW5zZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlMaWNlbnNlIG9sZExpY2Vuc2UgPSBsaWNlbnNlOwotCQlsaWNlbnNlID0gbmV3TGljZW5zZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0UsIG9sZExpY2Vuc2UsIG5ld0xpY2Vuc2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpY2Vuc2UoTGljZW5zZSBuZXdMaWNlbnNlKSB7Ci0JCWlmIChuZXdMaWNlbnNlICE9IGxpY2Vuc2UpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGxpY2Vuc2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbGljZW5zZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdMaWNlbnNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0xpY2Vuc2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRMaWNlbnNlKG5ld0xpY2Vuc2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0UsIG5ld0xpY2Vuc2UsIG5ld0xpY2Vuc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBZGFwdGVyIGdldFJlc291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIHJlc291cmNlQWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXNvdXJjZUFkYXB0ZXIoUmVzb3VyY2VBZGFwdGVyIG5ld1Jlc291cmNlQWRhcHRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSZXNvdXJjZUFkYXB0ZXIgb2xkUmVzb3VyY2VBZGFwdGVyID0gcmVzb3VyY2VBZGFwdGVyOwotCQlyZXNvdXJjZUFkYXB0ZXIgPSBuZXdSZXNvdXJjZUFkYXB0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19SRVNPVVJDRV9BREFQVEVSLCBvbGRSZXNvdXJjZUFkYXB0ZXIsIG5ld1Jlc291cmNlQWRhcHRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VBZGFwdGVyKFJlc291cmNlQWRhcHRlciBuZXdSZXNvdXJjZUFkYXB0ZXIpIHsKLQkJaWYgKG5ld1Jlc291cmNlQWRhcHRlciAhPSByZXNvdXJjZUFkYXB0ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlc291cmNlQWRhcHRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXNvdXJjZUFkYXB0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVzb3VyY2VBZGFwdGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Jlc291cmNlQWRhcHRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19SRVNPVVJDRV9BREFQVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlc291cmNlQWRhcHRlcihuZXdSZXNvdXJjZUFkYXB0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVIsIG5ld1Jlc291cmNlQWRhcHRlciwgbmV3UmVzb3VyY2VBZGFwdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRMaWNlbnNlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZXNvdXJjZUFkYXB0ZXIobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgotCQkJCXJldHVybiBnZXRWZW5kb3JOYW1lKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19TUEVDX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFNwZWNWZXJzaW9uKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19FSVNfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWlzVHlwZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRToKLQkJCQlyZXR1cm4gZ2V0TGljZW5zZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VBZGFwdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgotCQkJCXNldFZlbmRvck5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fU1BFQ19WRVJTSU9OOgotCQkJCXNldFNwZWNWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0VJU19UWVBFOgotCQkJCXNldEVpc1R5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0U6Ci0JCQkJc2V0TGljZW5zZSgoTGljZW5zZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlzZXRSZXNvdXJjZUFkYXB0ZXIoKFJlc291cmNlQWRhcHRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgotCQkJCXNldFZlbmRvck5hbWUoVkVORE9SX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1NQRUNfVkVSU0lPTjoKLQkJCQlzZXRTcGVjVmVyc2lvbihTUEVDX1ZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0VJU19UWVBFOgotCQkJCXNldEVpc1R5cGUoRUlTX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFOgotCQkJCXNldExpY2Vuc2UoKExpY2Vuc2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlzZXRSZXNvdXJjZUFkYXB0ZXIoKFJlc291cmNlQWRhcHRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgotCQkJCXJldHVybiBWRU5ET1JfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gdmVuZG9yTmFtZSAhPSBudWxsIDogIVZFTkRPUl9OQU1FX0VERUZBVUxULmVxdWFscyh2ZW5kb3JOYW1lKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1NQRUNfVkVSU0lPTjoKLQkJCQlyZXR1cm4gU1BFQ19WRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyBzcGVjVmVyc2lvbiAhPSBudWxsIDogIVNQRUNfVkVSU0lPTl9FREVGQVVMVC5lcXVhbHMoc3BlY1ZlcnNpb24pOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fRUlTX1RZUEU6Ci0JCQkJcmV0dXJuIEVJU19UWVBFX0VERUZBVUxUID09IG51bGwgPyBlaXNUeXBlICE9IG51bGwgOiAhRUlTX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVpc1R5cGUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRToKLQkJCQlyZXR1cm4gbGljZW5zZSAhPSBudWxsOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gcmVzb3VyY2VBZGFwdGVyICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2ZW5kb3JOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZW5kb3JOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcGVjVmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3BlY1ZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVpc1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVpc1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvclJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDNkMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5IHsKLQkKLQkvKioKLQkgKiBNZXRob2QgcmVnaXN0ZXJEdGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckR0ZHMoKSB7Ci0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzAsICJjb25uZWN0b3JfMV8wLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9BTFRfU1lTVEVNSURfMV8wLCAiY29ubmVjdG9yXzEuMC5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU0NIRU1BX0xPQ18xXzUsICJjb25uZWN0b3JfMV81LnhzZCIpOyAvLyROT04tTkxTLTEkCi0JfSAKLQkKLQotCSAKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LgotCSAqIEBwYXJhbSBhUmVuZGVyZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENvbm5lY3RvclJlc291cmNlRmFjdG9yeSgpIHsKLQkJc3VwZXIoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0JfQotIAotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkuCi0JICogQHBhcmFtIGFSZW5kZXJlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOwotCX0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyKQotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdG9yUmVzb3VyY2VJbXBsKHVyaSwgYVJlbmRlcmVyKTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogUmVnaXN0ZXIgbXlzZWxmIHdpdGggdGhlIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCUoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLlJBUl9TSE9SVF9OQU1FLCBuZXcgQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5KGFSZW5kZXJlckZhY3RvcnkpKTsKLQl9Ci0JCi0JLyoqCi0JICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLQkgKiBAc2VlICNyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlhUmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5SQVJfU0hPUlRfTkFNRSwgbmV3IENvbm5lY3RvclJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UuRmFjdG9yeSBnZXRSZWdpc3RlcmVkRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KEoyRUVDb25zdGFudHMuUkFSX0REX1VSSV9PQkopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyY2U2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbm5lY3Rvci5Db25uZWN0b3JUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotcHVibGljIGNsYXNzIENvbm5lY3RvclJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCBpbXBsZW1lbnRzIENvbm5lY3RvclJlc291cmNlewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VJbXBsLgotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gYVJlbmRlcmVyCi0JICovCi0JcHVibGljIENvbm5lY3RvclJlc291cmNlSW1wbChVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIodXJpLCBhUmVuZGVyZXIpOwotCX0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwuCi0JICogQHBhcmFtIGFSZW5kZXJlcgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JSZXNvdXJjZUltcGwoUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKGFSZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcigpIHsKLQkJcmV0dXJuIChDb25uZWN0b3IpIGdldFJvb3RPYmplY3QoKTsKLQl9Ci0KLQkKLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBSQVJfVFlQRTsKLQl9Ci0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1N5c3RlbUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU1lTVEVNSURfMV8wOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfMl9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX0FMVF9TWVNURU1JRF8xXzA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzA7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8zX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfQUxUX1NZU1RFTUlEXzFfMDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfUHVibGljSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9QVUJMSUNJRF8xXzA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9QVUJMSUNJRF8xXzA7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldERvY3R5cGUoKSB7Ci0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoJCi0JCQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX0RPQ1RZUEU7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNzZXREb2N0eXBlVmFsdWVzKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICogVGhpcyBpcyBzZXR0aW5nIHRoZSBtb2R1bGUgdmVyc2lvbiBvbiB0aGUgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlpbnQgdmVyc2lvbiA9IEpDQV8xXzVfSUQ7Ci0JCWlmIChzeXN0ZW1JZCA9PSBudWxsKSAKLQkJCXZlcnNpb24gPSBKQ0FfMV81X0lEOwotCQllbHNlIGlmIChzeXN0ZW1JZC5lcXVhbHMoZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSkpCi0JCQl2ZXJzaW9uID0gSkNBXzFfMF9JRDsKLQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQlzdXBlci5zZXRWZXJzaW9uSUQodmVyc2lvbik7Ci0JfQotCS8qIAotCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7Ci0JCXN1cGVyLnNldFZlcnNpb25JRChpZCk7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCQljYXNlIChKQ0FfMV81X0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEpDQV8xXzBfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JCS8qCi0JCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCkgewotCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIChKMkVFXzFfNF9JRCkgOgotCQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJCQlwcmltU2V0VmVyc2lvbklEKEpDQV8xXzVfSUQpOwotCQkJCQkJYnJlYWs7Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCQlwcmltU2V0VmVyc2lvbklEKEpDQV8xXzBfSUQpOwotCQkJCQkJYnJlYWs7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQkJCQlwcmltU2V0VmVyc2lvbklEKEpDQV8xXzBfSUQpOwotCQkJCX0KLQkJCXN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JCX0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI2dldFJvb3RUcmFuc2xhdG9yKCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIENvbm5lY3RvclRyYW5zbGF0b3IuSU5TVEFOQ0U7Ci0JfQotCS8qIFJldHVybiBKMkVFIHZlcnNpb24gYmFzZWQgb24gbW9kdWxlIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7Ci0JCXN3aXRjaCAoZ2V0TW9kdWxlVmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQlkZWZhdWx0IDoKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlSW1wbCNnZXREZWZhdWx0VmVyc2lvbklEKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiBKQ0FfMV81X0lEOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uaW1wbC5YTUxSZXNvdXJjZUltcGwjc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkgewotCQlDb25uZWN0b3IgY29ubiA9IGdldENvbm5lY3RvcigpOwotCQlpZiAoY29ubiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQotCQlTdHJpbmcgdmVyc2lvbiA9IGNvbm4uZ2V0U3BlY1ZlcnNpb24oKTsKLQkJU3RyaW5nIG5ld1ZlcnNpb24gPSBnZXRNb2R1bGVWZXJzaW9uU3RyaW5nKCk7Ci0JCWlmICghbmV3VmVyc2lvbi5lcXVhbHModmVyc2lvbikpCi0JCQljb25uLnNldFNwZWNWZXJzaW9uKG5ld1ZlcnNpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MGYwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCNnZXRNZXNzYWdlQWRhcHRlciA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlQWRhcHRlcigpIDxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUFkYXB0ZXIgbWVzc2FnZUFkYXB0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VBZGFwdGVyIGdldE1lc3NhZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbWVzc2FnZUFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWVzc2FnZUFkYXB0ZXIoTWVzc2FnZUFkYXB0ZXIgbmV3TWVzc2FnZUFkYXB0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTWVzc2FnZUFkYXB0ZXIgb2xkTWVzc2FnZUFkYXB0ZXIgPSBtZXNzYWdlQWRhcHRlcjsKLQkJbWVzc2FnZUFkYXB0ZXIgPSBuZXdNZXNzYWdlQWRhcHRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUiwgb2xkTWVzc2FnZUFkYXB0ZXIsIG5ld01lc3NhZ2VBZGFwdGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQWRhcHRlcihNZXNzYWdlQWRhcHRlciBuZXdNZXNzYWdlQWRhcHRlcikgewotCQlpZiAobmV3TWVzc2FnZUFkYXB0ZXIgIT0gbWVzc2FnZUFkYXB0ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG1lc3NhZ2VBZGFwdGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1lc3NhZ2VBZGFwdGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TWVzc2FnZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TWVzc2FnZUFkYXB0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1lc3NhZ2VBZGFwdGVyKG5ld01lc3NhZ2VBZGFwdGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVIsIG5ld01lc3NhZ2VBZGFwdGVyLCBuZXdNZXNzYWdlQWRhcHRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRNZXNzYWdlQWRhcHRlcihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSOgotCQkJCXJldHVybiBnZXRNZXNzYWdlQWRhcHRlcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVI6Ci0JCQkJc2V0TWVzc2FnZUFkYXB0ZXIoKE1lc3NhZ2VBZGFwdGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSOgotCQkJCXNldE1lc3NhZ2VBZGFwdGVyKChNZXNzYWdlQWRhcHRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gbWVzc2FnZUFkYXB0ZXIgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9KY2FGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2RiMjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5MaWNlbnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRLaW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpjYUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSmNhRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKY2FGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlKY2FGYWN0b3J5IHRoZUpjYUZhY3RvcnkgPSAoSmNhRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiamNhLnhtaSIpOyAKLQkJCWlmICh0aGVKY2FGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlSmNhRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBKY2FGYWN0b3J5SW1wbCgpOwotCX0KLQotCXB1YmxpYyBKY2FGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1I6IHJldHVybiBjcmVhdGVDb25uZWN0b3IoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSOiByZXR1cm4gY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNOiByZXR1cm4gY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFk6IHJldHVybiBjcmVhdGVDb25maWdQcm9wZXJ0eSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT046IHJldHVybiBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb24oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFOiByZXR1cm4gY3JlYXRlTGljZW5zZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjogcmV0dXJuIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSOiByZXR1cm4gY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVI6IHJldHVybiBjcmVhdGVNZXNzYWdlQWRhcHRlcigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTjogcmV0dXJuIGNyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUOiByZXR1cm4gY3JlYXRlQWRtaW5PYmplY3QoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSOiByZXR1cm4gY3JlYXRlTWVzc2FnZUxpc3RlbmVyKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDOiByZXR1cm4gY3JlYXRlQWN0aXZhdGlvblNwZWMoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRTogcmV0dXJuIGNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5UUkFOU0FDVElPTl9TVVBQT1JUX0tJTkQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZVRyYW5zYWN0aW9uU3VwcG9ydEtpbmRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlRSQU5TQUNUSU9OX1NVUFBPUlRfS0lORDoKLQkJCQlyZXR1cm4gY29udmVydFRyYW5zYWN0aW9uU3VwcG9ydEtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENvbm5lY3RvciBjcmVhdGVDb25uZWN0b3IoKSB7Ci0JCUNvbm5lY3RvckltcGwgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckltcGwoKTsKLQkJcmV0dXJuIGNvbm5lY3RvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTGljZW5zZSBjcmVhdGVMaWNlbnNlKCkgewotCQlMaWNlbnNlSW1wbCBsaWNlbnNlID0gbmV3IExpY2Vuc2VJbXBsKCk7Ci0JCXJldHVybiBsaWNlbnNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCUluYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsIGluYm91bmRSZXNvdXJjZUFkYXB0ZXIgPSBuZXcgSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwoKTsKLQkJcmV0dXJuIGluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIGNyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCQlPdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPSBuZXcgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsKCk7Ci0JCXJldHVybiBvdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUFkYXB0ZXIgY3JlYXRlTWVzc2FnZUFkYXB0ZXIoKSB7Ci0JCU1lc3NhZ2VBZGFwdGVySW1wbCBtZXNzYWdlQWRhcHRlciA9IG5ldyBNZXNzYWdlQWRhcHRlckltcGwoKTsKLQkJcmV0dXJuIG1lc3NhZ2VBZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uRGVmaW5pdGlvbiBjcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbigpIHsKLQkJQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsIGNvbm5lY3Rpb25EZWZpbml0aW9uID0gbmV3IENvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCgpOwotCQlyZXR1cm4gY29ubmVjdGlvbkRlZmluaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkbWluT2JqZWN0IGNyZWF0ZUFkbWluT2JqZWN0KCkgewotCQlBZG1pbk9iamVjdEltcGwgYWRtaW5PYmplY3QgPSBuZXcgQWRtaW5PYmplY3RJbXBsKCk7Ci0JCXJldHVybiBhZG1pbk9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUxpc3RlbmVyIGNyZWF0ZU1lc3NhZ2VMaXN0ZW5lcigpIHsKLQkJTWVzc2FnZUxpc3RlbmVySW1wbCBtZXNzYWdlTGlzdGVuZXIgPSBuZXcgTWVzc2FnZUxpc3RlbmVySW1wbCgpOwotCQlyZXR1cm4gbWVzc2FnZUxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3RpdmF0aW9uU3BlYyBjcmVhdGVBY3RpdmF0aW9uU3BlYygpIHsKLQkJQWN0aXZhdGlvblNwZWNJbXBsIGFjdGl2YXRpb25TcGVjID0gbmV3IEFjdGl2YXRpb25TcGVjSW1wbCgpOwotCQlyZXR1cm4gYWN0aXZhdGlvblNwZWM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIGNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCkgewotCQlSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwgcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgPSBuZXcgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsKCk7Ci0JCXJldHVybiByZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIGNyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgcmVzdWx0ID0gQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBjcmVhdGVUcmFuc2FjdGlvblN1cHBvcnRLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgcmVzdWx0ID0gVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHJhbnNhY3Rpb25TdXBwb3J0S2luZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCkgewotCQlSZXNvdXJjZUFkYXB0ZXJJbXBsIHJlc291cmNlQWRhcHRlciA9IG5ldyBSZXNvdXJjZUFkYXB0ZXJJbXBsKCk7Ci0JCXJldHVybiByZXNvdXJjZUFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFNlY3VyaXR5UGVybWlzc2lvbiBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb24oKSB7Ci0JCVNlY3VyaXR5UGVybWlzc2lvbkltcGwgc2VjdXJpdHlQZXJtaXNzaW9uID0gbmV3IFNlY3VyaXR5UGVybWlzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHNlY3VyaXR5UGVybWlzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXV0aGVudGljYXRpb25NZWNoYW5pc20gY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc20oKSB7Ci0JCUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA9IG5ldyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwoKTsKLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb25maWdQcm9wZXJ0eSBjcmVhdGVDb25maWdQcm9wZXJ0eSgpIHsKLQkJQ29uZmlnUHJvcGVydHlJbXBsIGNvbmZpZ1Byb3BlcnR5ID0gbmV3IENvbmZpZ1Byb3BlcnR5SW1wbCgpOwotCQlyZXR1cm4gY29uZmlnUHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEpjYVBhY2thZ2UgZ2V0SmNhUGFja2FnZSgpIHsKLQkJcmV0dXJuIChKY2FQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKY2FQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYVBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9KY2FQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODAxNjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBKY2FQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEpjYVBhY2thZ2UsIEVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb25uZWN0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVzb3VyY2VBZGFwdGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbmZpZ1Byb3BlcnR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsaWNlbnNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWVzc2FnZUFkYXB0ZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWRtaW5PYmplY3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWVzc2FnZUxpc3RlbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2YXRpb25TcGVjRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB0cmFuc2FjdGlvblN1cHBvcnRLaW5kRUVudW0gPSBudWxsOwotCi0JCSAgIC8qKgotCQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkJICovCi0JcHJpdmF0ZSBKY2FQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmNhUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSmNhUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEpjYVBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVKY2FQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVKY2FQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29ubmVjdG9yKCkgewotCQlyZXR1cm4gY29ubmVjdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX0Vpc1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25uZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0b3JfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbm5lY3Rvcl9MaWNlbnNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TGljZW5zZSgpIHsKLQkJcmV0dXJuIGxpY2Vuc2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGljZW5zZV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxpY2Vuc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaWNlbnNlX1JlcXVpcmVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGljZW5zZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGljZW5zZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9NZXNzYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBtZXNzYWdlQWRhcHRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlQWRhcHRlcl9NZXNzYWdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbm5lY3Rpb25EZWZpbml0aW9uKCkgewotCQlyZXR1cm4gY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkltcGxDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29uZmlnUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBZG1pbk9iamVjdCgpIHsKLQkJcmV0dXJuIGFkbWluT2JqZWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWRtaW5PYmplY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdENsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWRtaW5PYmplY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBZG1pbk9iamVjdF9Db25maWdQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYWRtaW5PYmplY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1lc3NhZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VMaXN0ZW5lckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlTGlzdGVuZXJfTWVzc2FnZUxpc3RlbmVyVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VMaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uU3BlYygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VMaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZhdGlvblNwZWMoKSB7Ci0JCXJldHVybiBhY3RpdmF0aW9uU3BlY0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlY0NsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZhdGlvblNwZWNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhY3RpdmF0aW9uU3BlY0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKSB7Ci0JCXJldHVybiByZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gcmVzb3VyY2VBZGFwdGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlQWRhcHRlckNsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9BZG1pbk9iamVjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN1cml0eVBlcm1pc3Npb24oKSB7Ci0JCXJldHVybiBzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NwZWNpZmljYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIHsKLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbmZpZ1Byb3BlcnR5KCkgewotCQlyZXR1cm4gY29uZmlnUHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRUcmFuc2FjdGlvblN1cHBvcnRLaW5kKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25TdXBwb3J0S2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSB7Ci0JCXJldHVybiBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmNhRmFjdG9yeSBnZXRKY2FGYWN0b3J5KCkgewotCQlyZXR1cm4gKEpjYUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJY29ubmVjdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTk5FQ1RPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29ubmVjdG9yRUNsYXNzLCBDT05ORUNUT1JfX1ZFTkRPUl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fU1BFQ19WRVJTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fRUlTX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3RvckVDbGFzcywgQ09OTkVDVE9SX19WRVJTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fTElDRU5TRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29ubmVjdG9yRUNsYXNzLCBDT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVIpOwotCi0JCXJlc291cmNlQWRhcHRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVNPVVJDRV9BREFQVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX1JFU09VUkNFX0FEQVBURVJfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVElFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19BRE1JTl9PQkpFQ1RTKTsKLQotCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBVVRIRU5USUNBVElPTl9NRUNIQU5JU00pOwotCQljcmVhdGVFQXR0cmlidXRlKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcywgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU00pOwotCQljcmVhdGVFQXR0cmlidXRlKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcywgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DUkVERU5USUFMX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MsIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1VTVE9NX0FVVEhfTUVDSF9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcywgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTlMpOwotCi0JCWNvbmZpZ1Byb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTkZJR19QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29uZmlnUHJvcGVydHlFQ2xhc3MsIENPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX1ZBTFVFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb25maWdQcm9wZXJ0eUVDbGFzcywgQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlMpOwotCi0JCXNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNVUklUWV9QRVJNSVNTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MsIFNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MsIFNFQ1VSSVRZX1BFUk1JU1NJT05fX1NQRUNJRklDQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcywgU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TKTsKLQotCQlsaWNlbnNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKExJQ0VOU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGxpY2Vuc2VFQ2xhc3MsIExJQ0VOU0VfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaWNlbnNlRUNsYXNzLCBMSUNFTlNFX19SRVFVSVJFRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobGljZW5zZUVDbGFzcywgTElDRU5TRV9fREVTQ1JJUFRJT05TKTsKLQotCQlpbmJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVIpOwotCi0JCW91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uob3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVMpOwotCi0JCW1lc3NhZ2VBZGFwdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FU1NBR0VfQURBUFRFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZUFkYXB0ZXJFQ2xhc3MsIE1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRV9MSVNURU5FUlMpOwotCi0JCWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTk5FQ1RJT05fREVGSU5JVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MsIENPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcywgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MsIENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcywgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUyk7Ci0KLQkJYWRtaW5PYmplY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQURNSU5fT0JKRUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhZG1pbk9iamVjdEVDbGFzcywgQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfSU5URVJGQUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhZG1pbk9iamVjdEVDbGFzcywgQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFkbWluT2JqZWN0RUNsYXNzLCBBRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTKTsKLQotCQltZXNzYWdlTGlzdGVuZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9MSVNURU5FUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZUxpc3RlbmVyRUNsYXNzLCBNRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VMaXN0ZW5lckVDbGFzcywgTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDKTsKLQotCQlhY3RpdmF0aW9uU3BlY0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVkFUSU9OX1NQRUMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2YXRpb25TcGVjRUNsYXNzLCBBQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZhdGlvblNwZWNFQ2xhc3MsIEFDVElWQVRJT05fU1BFQ19fUkVRVUlSRURfQ09ORklHX1BST1BFUlRJRVMpOwotCi0JCXJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUVDbGFzcywgUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzLCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRUVudW0gPSBjcmVhdGVFRW51bShBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSk7Ci0JCXRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKFRSQU5TQUNUSU9OX1NVUFBPUlRfS0lORCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQljb25uZWN0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlsaWNlbnNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJbWVzc2FnZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJYWRtaW5PYmplY3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJbWVzc2FnZUxpc3RlbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWFjdGl2YXRpb25TcGVjRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhjb25uZWN0b3JFQ2xhc3MsIENvbm5lY3Rvci5jbGFzcywgIkNvbm5lY3RvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdG9yX1ZlbmRvck5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlbmRvck5hbWUiLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rvcl9TcGVjVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3BlY1ZlcnNpb24iLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rvcl9FaXNUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlaXNUeXBlIiwgbnVsbCwgMCwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0b3JfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKSwgdGhpcy5nZXRMaWNlbnNlKCksIG51bGwsICJsaWNlbnNlIiwgbnVsbCwgMCwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb25uZWN0b3JfUmVzb3VyY2VBZGFwdGVyKCksIHRoaXMuZ2V0UmVzb3VyY2VBZGFwdGVyKCksIG51bGwsICJyZXNvdXJjZUFkYXB0ZXIiLCBudWxsLCAxLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIlJlc291cmNlQWRhcHRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25JbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW1wbENsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25uZWN0aW9uSW1wbENsYXNzIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25TdXBwb3J0S2luZCgpLCAidHJhbnNhY3Rpb25TdXBwb3J0IiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlYXV0aGVudGljYXRpb25TdXBwb3J0IiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9SZXNvdXJjZUFkYXB0ZXJDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VBZGFwdGVyQ2xhc3MiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9TZWN1cml0eVBlcm1pc3Npb25zKCksIHRoaXMuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCksIG51bGwsICJzZWN1cml0eVBlcm1pc3Npb25zIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLCB0aGlzLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCksIG51bGwsICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydGllcygpLCB0aGlzLmdldENvbmZpZ1Byb3BlcnR5KCksIG51bGwsICJjb25maWdQcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIHRoaXMuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSwgbnVsbCwgIm91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlcigpLCB0aGlzLmdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSwgbnVsbCwgImluYm91bmRSZXNvdXJjZUFkYXB0ZXIiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9BZG1pbk9iamVjdHMoKSwgdGhpcy5nZXRBZG1pbk9iamVjdCgpLCBudWxsLCAiYWRtaW5PYmplY3RzIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc20oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIiwgbnVsbCwgMCwgMSwgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpLCB0aGlzLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpLCAiYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIiwgbnVsbCwgMCwgMSwgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQ3JlZGVudGlhbEludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY3JlZGVudGlhbEludGVyZmFjZSIsIG51bGwsIDAsIDEsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DdXN0b21BdXRoTWVjaFR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImN1c3RvbUF1dGhNZWNoVHlwZSIsIG51bGwsIDAsIDEsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb25maWdQcm9wZXJ0eUVDbGFzcywgQ29uZmlnUHJvcGVydHkuY2xhc3MsICJDb25maWdQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbmZpZ1Byb3BlcnR5X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25maWdQcm9wZXJ0eV9WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcywgU2VjdXJpdHlQZXJtaXNzaW9uLmNsYXNzLCAiU2VjdXJpdHlQZXJtaXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVBlcm1pc3Npb25fU3BlY2lmaWNhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3BlY2lmaWNhdGlvbiIsIG51bGwsIDAsIDEsIFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgU2VjdXJpdHlQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobGljZW5zZUVDbGFzcywgTGljZW5zZS5jbGFzcywgIkxpY2Vuc2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExpY2Vuc2VfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgTGljZW5zZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGljZW5zZV9SZXF1aXJlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlcXVpcmVkIiwgbnVsbCwgMCwgMSwgTGljZW5zZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMaWNlbnNlX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTGljZW5zZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICJJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX01lc3NhZ2VBZGFwdGVyKCksIHRoaXMuZ2V0TWVzc2FnZUFkYXB0ZXIoKSwgbnVsbCwgIm1lc3NhZ2VBZGFwdGVyIiwgbnVsbCwgMCwgMSwgSW5ib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBPdXRib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlYXV0aGVudGljYXRpb25TdXBwb3J0IiwgbnVsbCwgMCwgMSwgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25TdXBwb3J0S2luZCgpLCAidHJhbnNhY3Rpb25TdXBwb3J0IiwgbnVsbCwgMCwgMSwgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkRlZmluaXRpb25zKCksIHRoaXMuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKSwgbnVsbCwgImNvbm5lY3Rpb25EZWZpbml0aW9ucyIsIG51bGwsIDAsIC0xLCBPdXRib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCksIHRoaXMuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKSwgbnVsbCwgImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyIsIG51bGwsIDAsIC0xLCBPdXRib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1lc3NhZ2VBZGFwdGVyRUNsYXNzLCBNZXNzYWdlQWRhcHRlci5jbGFzcywgIk1lc3NhZ2VBZGFwdGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlQWRhcHRlcl9NZXNzYWdlTGlzdGVuZXJzKCksIHRoaXMuZ2V0TWVzc2FnZUxpc3RlbmVyKCksIG51bGwsICJtZXNzYWdlTGlzdGVuZXJzIiwgbnVsbCwgMSwgLTEsIE1lc3NhZ2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAiQ29ubmVjdGlvbkRlZmluaXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyIsIG51bGwsIDAsIDEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIiwgbnVsbCwgMCwgMSwgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25JbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkltcGxDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkltcGxDbGFzcyIsIG51bGwsIDAsIDEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0Q29uZmlnUHJvcGVydHkoKSwgbnVsbCwgImNvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhZG1pbk9iamVjdEVDbGFzcywgQWRtaW5PYmplY3QuY2xhc3MsICJBZG1pbk9iamVjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImFkbWluT2JqZWN0SW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgQWRtaW5PYmplY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0Q2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImFkbWluT2JqZWN0Q2xhc3MiLCBudWxsLCAwLCAxLCBBZG1pbk9iamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWRtaW5PYmplY3RfQ29uZmlnUHJvcGVydGllcygpLCB0aGlzLmdldENvbmZpZ1Byb3BlcnR5KCksIG51bGwsICJjb25maWdQcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIEFkbWluT2JqZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWVzc2FnZUxpc3RlbmVyRUNsYXNzLCBNZXNzYWdlTGlzdGVuZXIuY2xhc3MsICJNZXNzYWdlTGlzdGVuZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VMaXN0ZW5lcl9NZXNzYWdlTGlzdGVuZXJUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtZXNzYWdlTGlzdGVuZXJUeXBlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZUxpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlTGlzdGVuZXJfQWN0aXZhdGlvblNwZWMoKSwgdGhpcy5nZXRBY3RpdmF0aW9uU3BlYygpLCBudWxsLCAiYWN0aXZhdGlvblNwZWMiLCBudWxsLCAxLCAxLCBNZXNzYWdlTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhY3RpdmF0aW9uU3BlY0VDbGFzcywgQWN0aXZhdGlvblNwZWMuY2xhc3MsICJBY3RpdmF0aW9uU3BlYyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvblNwZWNDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWN0aXZhdGlvblNwZWNDbGFzcyIsIG51bGwsIDAsIDEsIEFjdGl2YXRpb25TcGVjLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpLCBudWxsLCAicmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIEFjdGl2YXRpb25TcGVjLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVFQ2xhc3MsIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmNsYXNzLCAiUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRUVudW0sIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS5jbGFzcywgIkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRUVudW0sIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS5CQVNJQ19QQVNTV09SRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVFbnVtLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUuS0VSQlY1X0xJVEVSQUwpOwotCi0JCWluaXRFRW51bSh0cmFuc2FjdGlvblN1cHBvcnRLaW5kRUVudW0sIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQuY2xhc3MsICJUcmFuc2FjdGlvblN1cHBvcnRLaW5kIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvblN1cHBvcnRLaW5kRUVudW0sIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQuTk9fVFJBTlNBQ1RJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvblN1cHBvcnRLaW5kRUVudW0sIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQuTE9DQUxfVFJBTlNBQ1RJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvblN1cHBvcnRLaW5kRUVudW0sIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQuWEFfVFJBTlNBQ1RJT05fTElURVJBTCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0N1c3RvbUF1dGhNZWNoVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLX0gLy9KY2FQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTGljZW5zZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0xpY2Vuc2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDQzM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTGljZW5zZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5MaWNlbnNlOwotCi0KLS8qKgotICogU3BlY2lmaWVzIGxpY2Vuc2luZyByZXF1aXJlbWVudHMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gU3BlY2lmaWVzIHdoZXRoZXIgYSBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YgY29ubmVjdGlvbiByZXN0cmljdGlvbnMpLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGljZW5zZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBMaWNlbnNlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXF1aXJlZCgpIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXF1aXJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZCA9IFJFUVVJUkVEX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVxdWlyZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIExpY2Vuc2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuTElDRU5TRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gcmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiBuZXdSZXF1aXJlZCkgewotCQlib29sZWFuIG9sZFJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCXJlcXVpcmVkID0gbmV3UmVxdWlyZWQ7Ci0JCWJvb2xlYW4gb2xkUmVxdWlyZWRFU2V0ID0gcmVxdWlyZWRFU2V0OwotCQlyZXF1aXJlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkxJQ0VOU0VfX1JFUVVJUkVELCBvbGRSZXF1aXJlZCwgcmVxdWlyZWQsICFvbGRSZXF1aXJlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlcXVpcmVkKCkgewotCQlib29sZWFuIG9sZFJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCWJvb2xlYW4gb2xkUmVxdWlyZWRFU2V0ID0gcmVxdWlyZWRFU2V0OwotCQlyZXF1aXJlZCA9IFJFUVVJUkVEX0VERUZBVUxUOwotCQlyZXF1aXJlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKY2FQYWNrYWdlLkxJQ0VOU0VfX1JFUVVJUkVELCBvbGRSZXF1aXJlZCwgUkVRVUlSRURfRURFRkFVTFQsIG9sZFJlcXVpcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZXF1aXJlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fUkVRVUlSRUQ6Ci0JCQkJdW5zZXRSZXF1aXJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNTZXRSZXF1aXJlZCgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcXVpcmVkOiAiKTsKLQkJaWYgKHJlcXVpcmVkRVNldCkgcmVzdWx0LmFwcGVuZChyZXF1aXJlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMmJhMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgQWRhcHRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUFkYXB0ZXJJbXBsI2dldE1lc3NhZ2VMaXN0ZW5lcnMgPGVtPk1lc3NhZ2UgTGlzdGVuZXJzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUFkYXB0ZXJJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTWVzc2FnZUFkYXB0ZXIgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VMaXN0ZW5lcnMoKSA8ZW0+TWVzc2FnZSBMaXN0ZW5lcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZUxpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1lc3NhZ2VMaXN0ZW5lcnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VBZGFwdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuTUVTU0FHRV9BREFQVEVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXNzYWdlTGlzdGVuZXJzKCkgewotCQlpZiAobWVzc2FnZUxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlTGlzdGVuZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VMaXN0ZW5lci5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZUxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VMaXN0ZW5lcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZUxpc3RlbmVycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUzoKLQkJCQlnZXRNZXNzYWdlTGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlTGlzdGVuZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRV9MSVNURU5FUlM6Ci0JCQkJZ2V0TWVzc2FnZUxpc3RlbmVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gbWVzc2FnZUxpc3RlbmVycyAhPSBudWxsICYmICFtZXNzYWdlTGlzdGVuZXJzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vTWVzc2FnZUFkYXB0ZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9NZXNzYWdlTGlzdGVuZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9NZXNzYWdlTGlzdGVuZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NmJkNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUxpc3RlbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgTGlzdGVuZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VMaXN0ZW5lckltcGwjZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSA8ZW0+TWVzc2FnZSBMaXN0ZW5lciBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlTGlzdGVuZXJJbXBsI2dldEFjdGl2YXRpb25TcGVjIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlTGlzdGVuZXJJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgTWVzc2FnZUxpc3RlbmVyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSgpIDxlbT5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfTElTVEVORVJfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlTGlzdGVuZXJUeXBlKCkgPGVtPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlTGlzdGVuZXJUeXBlID0gTUVTU0FHRV9MSVNURU5FUl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZhdGlvblNwZWMoKSA8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uU3BlYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2YXRpb25TcGVjIGFjdGl2YXRpb25TcGVjID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlTGlzdGVuZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5NRVNTQUdFX0xJU1RFTkVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VMaXN0ZW5lclR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZUxpc3RlbmVyVHlwZShTdHJpbmcgbmV3TWVzc2FnZUxpc3RlbmVyVHlwZSkgewotCQlTdHJpbmcgb2xkTWVzc2FnZUxpc3RlbmVyVHlwZSA9IG1lc3NhZ2VMaXN0ZW5lclR5cGU7Ci0JCW1lc3NhZ2VMaXN0ZW5lclR5cGUgPSBuZXdNZXNzYWdlTGlzdGVuZXJUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX01FU1NBR0VfTElTVEVORVJfVFlQRSwgb2xkTWVzc2FnZUxpc3RlbmVyVHlwZSwgbWVzc2FnZUxpc3RlbmVyVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3RpdmF0aW9uU3BlYyBnZXRBY3RpdmF0aW9uU3BlYygpIHsKLQkJcmV0dXJuIGFjdGl2YXRpb25TcGVjOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjdGl2YXRpb25TcGVjKEFjdGl2YXRpb25TcGVjIG5ld0FjdGl2YXRpb25TcGVjLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUFjdGl2YXRpb25TcGVjIG9sZEFjdGl2YXRpb25TcGVjID0gYWN0aXZhdGlvblNwZWM7Ci0JCWFjdGl2YXRpb25TcGVjID0gbmV3QWN0aXZhdGlvblNwZWM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDLCBvbGRBY3RpdmF0aW9uU3BlYywgbmV3QWN0aXZhdGlvblNwZWMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2YXRpb25TcGVjKEFjdGl2YXRpb25TcGVjIG5ld0FjdGl2YXRpb25TcGVjKSB7Ci0JCWlmIChuZXdBY3RpdmF0aW9uU3BlYyAhPSBhY3RpdmF0aW9uU3BlYykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWN0aXZhdGlvblNwZWMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWN0aXZhdGlvblNwZWMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWN0aXZhdGlvblNwZWMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWN0aXZhdGlvblNwZWMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY3RpdmF0aW9uU3BlYyhuZXdBY3RpdmF0aW9uU3BlYywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQywgbmV3QWN0aXZhdGlvblNwZWMsIG5ld0FjdGl2YXRpb25TcGVjKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY3RpdmF0aW9uU3BlYyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX01FU1NBR0VfTElTVEVORVJfVFlQRToKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQzoKLQkJCQlyZXR1cm4gZ2V0QWN0aXZhdGlvblNwZWMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX01FU1NBR0VfTElTVEVORVJfVFlQRToKLQkJCQlzZXRNZXNzYWdlTGlzdGVuZXJUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19BQ1RJVkFUSU9OX1NQRUM6Ci0JCQkJc2V0QWN0aXZhdGlvblNwZWMoKEFjdGl2YXRpb25TcGVjKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX01FU1NBR0VfTElTVEVORVJfVFlQRToKLQkJCQlzZXRNZXNzYWdlTGlzdGVuZXJUeXBlKE1FU1NBR0VfTElTVEVORVJfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQzoKLQkJCQlzZXRBY3RpdmF0aW9uU3BlYygoQWN0aXZhdGlvblNwZWMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRV9MSVNURU5FUl9UWVBFOgotCQkJCXJldHVybiBNRVNTQUdFX0xJU1RFTkVSX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IG1lc3NhZ2VMaXN0ZW5lclR5cGUgIT0gbnVsbCA6ICFNRVNTQUdFX0xJU1RFTkVSX1RZUEVfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2VMaXN0ZW5lclR5cGUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQzoKLQkJCQlyZXR1cm4gYWN0aXZhdGlvblNwZWMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1lc3NhZ2VMaXN0ZW5lclR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1lc3NhZ2VMaXN0ZW5lclR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXNzYWdlTGlzdGVuZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWY5NDJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0S2luZDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsI2dldFRyYW5zYWN0aW9uU3VwcG9ydCA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsI2dldENvbm5lY3Rpb25EZWZpbml0aW9ucyA8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IFJFQVVUSEVOVElDQVRJT05fU1VQUE9SVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKSA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVCA9IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQuTk9fVFJBTlNBQ1RJT05fTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpIDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIHRyYW5zYWN0aW9uU3VwcG9ydCA9IFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFRyYW5zYWN0aW9uIFN1cHBvcnQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25EZWZpbml0aW9ucygpIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25EZWZpbml0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbm5lY3Rpb25EZWZpbml0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gcmVhdXRoZW50aWNhdGlvblN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoYm9vbGVhbiBuZXdSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCkgewotCQlib29sZWFuIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gcmVhdXRoZW50aWNhdGlvblN1cHBvcnQ7Ci0JCXJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gbmV3UmVhdXRoZW50aWNhdGlvblN1cHBvcnQ7Ci0JCWJvb2xlYW4gb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0ID0gcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0OwotCQlyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCwgb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnQsIHJlYXV0aGVudGljYXRpb25TdXBwb3J0LCAhb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIHsKLQkJYm9vbGVhbiBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IHJlYXV0aGVudGljYXRpb25TdXBwb3J0OwotCQlib29sZWFuIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCA9IHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldDsKLQkJcmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPSBSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlRfRURFRkFVTFQ7Ci0JCXJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JULCBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCwgUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUX0VERUZBVUxULCBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIGdldFRyYW5zYWN0aW9uU3VwcG9ydCgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uU3VwcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvblN1cHBvcnQoVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBuZXdUcmFuc2FjdGlvblN1cHBvcnQpIHsKLQkJVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBvbGRUcmFuc2FjdGlvblN1cHBvcnQgPSB0cmFuc2FjdGlvblN1cHBvcnQ7Ci0JCXRyYW5zYWN0aW9uU3VwcG9ydCA9IG5ld1RyYW5zYWN0aW9uU3VwcG9ydCA9PSBudWxsID8gVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVCA6IG5ld1RyYW5zYWN0aW9uU3VwcG9ydDsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblN1cHBvcnRFU2V0ID0gdHJhbnNhY3Rpb25TdXBwb3J0RVNldDsKLQkJdHJhbnNhY3Rpb25TdXBwb3J0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCwgb2xkVHJhbnNhY3Rpb25TdXBwb3J0LCB0cmFuc2FjdGlvblN1cHBvcnQsICFvbGRUcmFuc2FjdGlvblN1cHBvcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKSB7Ci0JCVRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgb2xkVHJhbnNhY3Rpb25TdXBwb3J0ID0gdHJhbnNhY3Rpb25TdXBwb3J0OwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSB0cmFuc2FjdGlvblN1cHBvcnRFU2V0OwotCQl0cmFuc2FjdGlvblN1cHBvcnQgPSBUUkFOU0FDVElPTl9TVVBQT1JUX0VERUZBVUxUOwotCQl0cmFuc2FjdGlvblN1cHBvcnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JULCBvbGRUcmFuc2FjdGlvblN1cHBvcnQsIFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQsIG9sZFRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uU3VwcG9ydCgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbm5lY3Rpb25EZWZpbml0aW9ucygpIHsKLQkJaWYgKGNvbm5lY3Rpb25EZWZpbml0aW9ucyA9PSBudWxsKSB7Ci0JCQljb25uZWN0aW9uRGVmaW5pdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbm5lY3Rpb25EZWZpbml0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkgewotCQlpZiAoYXV0aGVudGljYXRpb25NZWNoYW5pc21zID09IG51bGwpIHsKLQkJCWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TKTsKLQkJfQotCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc21zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVDoKLQkJCQlyZXR1cm4gaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUOgotCQkJCXJldHVybiBnZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT05TOgotCQkJCXJldHVybiBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCXJldHVybiBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVDoKLQkJCQlzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVDoKLQkJCQlzZXRUcmFuc2FjdGlvblN1cHBvcnQoKFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT05TOgotCQkJCWdldENvbm5lY3Rpb25EZWZpbml0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUzoKLQkJCQlnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKS5jbGVhcigpOwotCQkJCWdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQ6Ci0JCQkJdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUOgotCQkJCXVuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fREVGSU5JVElPTlM6Ci0JCQkJZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUzoKLQkJCQlnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVDoKLQkJCQlyZXR1cm4gaXNTZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OUzoKLQkJCQlyZXR1cm4gY29ubmVjdGlvbkRlZmluaXRpb25zICE9IG51bGwgJiYgIWNvbm5lY3Rpb25EZWZpbml0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUzoKLQkJCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc21zICE9IG51bGwgJiYgIWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDogIik7Ci0JCWlmIChyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQpIHJlc3VsdC5hcHBlbmQocmVhdXRoZW50aWNhdGlvblN1cHBvcnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0cmFuc2FjdGlvblN1cHBvcnQ6ICIpOwotCQlpZiAodHJhbnNhY3Rpb25TdXBwb3J0RVNldCkgcmVzdWx0LmFwcGVuZCh0cmFuc2FjdGlvblN1cHBvcnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTdkYzcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXF1aXJlZCBDb25maWcgUHJvcGVydHkgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5MDQ1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQ7Ci0KLQotLyoqCi0gKiBTcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseS1xdWFsaWZpZWQgbmFtZXMgb2YgY2xhc3MvL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZiB0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLCBsZXZlbCBvZiB0cmFuc2FjdGlvbiBzdXBwb3J0IHByb3ZpZGVkLCBjb25maWd1cmFibGUgcHJvcGVydGllcyBmb3IgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlcywgb25lIG9yIG1vcmUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBzdXBwb3J0ZWQgYW5kIGFkZGl0aW9uYWwKLSAqIHJlcXVpcmVkIHNlY3VyaXR5IHBlcm1pc3Npb25zLgotICogCi0gKiBJZiB0aGVyZSBpcyBubyBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gc3BlY2lmaWVkIGFzIHBhcnQgb2YKLSAqIHJlc291cmNlIGFkYXB0ZXIgZWxlbWVudCB0aGVuIHRoZSByZXNvdXJjZSBhZGFwdGVyIGRvZXMgbm90Ci0gKiBzdXBwb3J0IGFueSBzdGFuZGFyZCBzZWN1cml0eSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIGFzIHBhcnQKLSAqIG9mIHNlY3VyaXR5IGNvbnRyYWN0LiBUaGUgYXBwbGljYXRpb24gc2VydmVyIGlnbm9yZXMgdGhlIHNlY3VyaXR5Ci0gKiBwYXJ0IG9mIHRoZSBzeXN0ZW0gY29udHJhY3RzIGluIHRoaXMgY2FzZS4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlQWRhcHRlckltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZXNvdXJjZUFkYXB0ZXIgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkgPGVtPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyA9IE1BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlID0gQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzID0gQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25JbnRlcmZhY2UoKSA8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25JbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fSU5URVJGQUNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbkludGVyZmFjZSA9IENPTk5FQ1RJT05fSU5URVJGQUNFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkgPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9JTVBMX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbkltcGxDbGFzcyA9IENPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQgPSBUcmFuc2FjdGlvblN1cHBvcnRLaW5kLk5PX1RSQU5TQUNUSU9OX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCB0cmFuc2FjdGlvblN1cHBvcnQgPSBUUkFOU0FDVElPTl9TVVBQT1JUX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHJhbnNhY3Rpb24gU3VwcG9ydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNhY3Rpb25TdXBwb3J0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IFJFQVVUSEVOVElDQVRJT05fU1VQUE9SVF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlYXV0aGVudGljYXRpb24gU3VwcG9ydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoKSA8ZW0+UmVzb3VyY2UgQWRhcHRlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0FEQVBURVJfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoKSA8ZW0+UmVzb3VyY2UgQWRhcHRlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VBZGFwdGVyQ2xhc3MgPSBSRVNPVVJDRV9BREFQVEVSX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlY3VyaXR5UGVybWlzc2lvbnMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb25maWdQcm9wZXJ0aWVzID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpIDxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSA8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW5ib3VuZFJlc291cmNlQWRhcHRlciBpbmJvdW5kUmVzb3VyY2VBZGFwdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkbWluT2JqZWN0cygpIDxlbT5BZG1pbiBPYmplY3RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFkbWluT2JqZWN0cyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VBZGFwdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX0FEQVBURVI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGphdmF4LnJlc291cmNlLnNwaS5NYW5hZ2VkLUNvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cy4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSB7Ci0JCXJldHVybiBtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyhTdHJpbmcgbmV3TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzID0gbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3M7Ci0JCW1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzID0gbmV3TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1MsIG9sZE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzLCBtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoU3RyaW5nIG5ld0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKSB7Ci0JCVN0cmluZyBvbGRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSA9IGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlOwotCQljb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSA9IG5ld0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0UsIG9sZENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlLCBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkgewotCQlyZXR1cm4gY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoU3RyaW5nIG5ld0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKSB7Ci0JCVN0cmluZyBvbGRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyA9IGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOwotCQljb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyA9IG5ld0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTLCBvbGRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcywgY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25JbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uSW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25JbnRlcmZhY2UoU3RyaW5nIG5ld0Nvbm5lY3Rpb25JbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZENvbm5lY3Rpb25JbnRlcmZhY2UgPSBjb25uZWN0aW9uSW50ZXJmYWNlOwotCQljb25uZWN0aW9uSW50ZXJmYWNlID0gbmV3Q29ubmVjdGlvbkludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lOVEVSRkFDRSwgb2xkQ29ubmVjdGlvbkludGVyZmFjZSwgY29ubmVjdGlvbkludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uSW1wbENsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25JbXBsQ2xhc3MoU3RyaW5nIG5ld0Nvbm5lY3Rpb25JbXBsQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZENvbm5lY3Rpb25JbXBsQ2xhc3MgPSBjb25uZWN0aW9uSW1wbENsYXNzOwotCQljb25uZWN0aW9uSW1wbENsYXNzID0gbmV3Q29ubmVjdGlvbkltcGxDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lNUExfQ0xBU1MsIG9sZENvbm5lY3Rpb25JbXBsQ2xhc3MsIGNvbm5lY3Rpb25JbXBsQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdHJhbnNhY3Rpb24tc3VwcG9ydCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbGV2ZWwgb2YgdHJhbnNhY3Rpb24KLQkgKiBzdXBwb3J0IHByb3ZpZGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotCSAqIFRoZSB2YWx1ZSBvZiB0cmFuc2FjdGlvbi1zdXBwb3J0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICogICBOb1RyYW5zYWN0aW9uCi0JICogICBMb2NhbFRyYW5zYWN0aW9uCi0JICogICBYQVRyYW5zYWN0aW9uCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25TdXBwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRLaW5kIG5ld1RyYW5zYWN0aW9uU3VwcG9ydCkgewotCQlUcmFuc2FjdGlvblN1cHBvcnRLaW5kIG9sZFRyYW5zYWN0aW9uU3VwcG9ydCA9IHRyYW5zYWN0aW9uU3VwcG9ydDsKLQkJdHJhbnNhY3Rpb25TdXBwb3J0ID0gbmV3VHJhbnNhY3Rpb25TdXBwb3J0ID09IG51bGwgPyBUUkFOU0FDVElPTl9TVVBQT1JUX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25TdXBwb3J0OwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSB0cmFuc2FjdGlvblN1cHBvcnRFU2V0OwotCQl0cmFuc2FjdGlvblN1cHBvcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JULCBvbGRUcmFuc2FjdGlvblN1cHBvcnQsIHRyYW5zYWN0aW9uU3VwcG9ydCwgIW9sZFRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uU3VwcG9ydCgpIHsKLQkJVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBvbGRUcmFuc2FjdGlvblN1cHBvcnQgPSB0cmFuc2FjdGlvblN1cHBvcnQ7Ci0JCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25TdXBwb3J0RVNldCA9IHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQ7Ci0JCXRyYW5zYWN0aW9uU3VwcG9ydCA9IFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQ7Ci0JCXRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQsIG9sZFRyYW5zYWN0aW9uU3VwcG9ydCwgVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVCwgb2xkVHJhbnNhY3Rpb25TdXBwb3J0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25TdXBwb3J0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLUNvbm5lY3Rpb24gaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IGZvciB0aGUgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIHsKLQkJcmV0dXJuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4gbmV3UmVhdXRoZW50aWNhdGlvblN1cHBvcnQpIHsKLQkJYm9vbGVhbiBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IHJlYXV0aGVudGljYXRpb25TdXBwb3J0OwotCQlyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IG5ld1JlYXV0aGVudGljYXRpb25TdXBwb3J0OwotCQlib29sZWFuIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCA9IHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldDsKLQkJcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQsIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0LCByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCwgIW9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSB7Ci0JCWJvb2xlYW4gb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPSByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDsKLQkJYm9vbGVhbiBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQ7Ci0JCXJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUX0VERUZBVUxUOwotCQlyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCwgb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnQsIFJFQVVUSEVOVElDQVRJT05fU1VQUE9SVF9FREVGQVVMVCwgb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIHsKLQkJcmV0dXJuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQWRhcHRlckNsYXNzKCkgewotCQlyZXR1cm4gcmVzb3VyY2VBZGFwdGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoU3RyaW5nIG5ld1Jlc291cmNlQWRhcHRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGRSZXNvdXJjZUFkYXB0ZXJDbGFzcyA9IHJlc291cmNlQWRhcHRlckNsYXNzOwotCQlyZXNvdXJjZUFkYXB0ZXJDbGFzcyA9IG5ld1Jlc291cmNlQWRhcHRlckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFU09VUkNFX0FEQVBURVJfQ0xBU1MsIG9sZFJlc291cmNlQWRhcHRlckNsYXNzLCByZXNvdXJjZUFkYXB0ZXJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTZWN1cml0eVBlcm1pc3Npb25zKCkgewotCQlpZiAoc2VjdXJpdHlQZXJtaXNzaW9ucyA9PSBudWxsKSB7Ci0JCQlzZWN1cml0eVBlcm1pc3Npb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHNlY3VyaXR5UGVybWlzc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpIHsKLQkJaWYgKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyA9PSBudWxsKSB7Ci0JCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyk7Ci0JCX0KLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29uZmlnUHJvcGVydGllcygpIHsKLQkJaWYgKGNvbmZpZ1Byb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJY29uZmlnUHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChDb25maWdQcm9wZXJ0eS5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ1Byb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgbmV3T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgb2xkT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPSBvdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLQkJb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPSBuZXdPdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSLCBvbGRPdXRib3VuZFJlc291cmNlQWRhcHRlciwgbmV3T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIG5ld091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKSB7Ci0JCWlmIChuZXdPdXRib3VuZFJlc291cmNlQWRhcHRlciAhPSBvdXRib3VuZFJlc291cmNlQWRhcHRlcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld091dGJvdW5kUmVzb3VyY2VBZGFwdGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKG5ld091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiwgbmV3T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIsIG5ld091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcihJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIG5ld0luYm91bmRSZXNvdXJjZUFkYXB0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJSW5ib3VuZFJlc291cmNlQWRhcHRlciBvbGRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyID0gaW5ib3VuZFJlc291cmNlQWRhcHRlcjsKLQkJaW5ib3VuZFJlc291cmNlQWRhcHRlciA9IG5ld0luYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSLCBvbGRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyLCBuZXdJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgbmV3SW5ib3VuZFJlc291cmNlQWRhcHRlcikgewotCQlpZiAobmV3SW5ib3VuZFJlc291cmNlQWRhcHRlciAhPSBpbmJvdW5kUmVzb3VyY2VBZGFwdGVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbmJvdW5kUmVzb3VyY2VBZGFwdGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWluYm91bmRSZXNvdXJjZUFkYXB0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW5ib3VuZFJlc291cmNlQWRhcHRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcihuZXdJbmJvdW5kUmVzb3VyY2VBZGFwdGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSLCBuZXdJbmJvdW5kUmVzb3VyY2VBZGFwdGVyLCBuZXdJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFkbWluT2JqZWN0cygpIHsKLQkJaWYgKGFkbWluT2JqZWN0cyA9PSBudWxsKSB7Ci0JCQlhZG1pbk9iamVjdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQWRtaW5PYmplY3QuY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQURNSU5fT0JKRUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGFkbWluT2JqZWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVBlcm1pc3Npb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbmZpZ1Byb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSOgotCQkJCXJldHVybiBiYXNpY1NldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQURNSU5fT0JKRUNUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFkbWluT2JqZWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFOgotCQkJCXJldHVybiBnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTOgotCQkJCXJldHVybiBnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU5URVJGQUNFOgotCQkJCXJldHVybiBnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTOgotCQkJCXJldHVybiBnZXRDb25uZWN0aW9uSW1wbENsYXNzKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVDoKLQkJCQlyZXR1cm4gZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUOgotCQkJCXJldHVybiBpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFU09VUkNFX0FEQVBURVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlQWRhcHRlckNsYXNzKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5UGVybWlzc2lvbnMoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCXJldHVybiBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0Q29uZmlnUHJvcGVydGllcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSOgotCQkJCXJldHVybiBnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQURNSU5fT0JKRUNUUzoKLQkJCQlyZXR1cm4gZ2V0QWRtaW5PYmplY3RzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKLQkJCQlzZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRToKLQkJCQlzZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1M6Ci0JCQkJc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU5URVJGQUNFOgotCQkJCXNldENvbm5lY3Rpb25JbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU1QTF9DTEFTUzoKLQkJCQlzZXRDb25uZWN0aW9uSW1wbENsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUOgotCQkJCXNldFRyYW5zYWN0aW9uU3VwcG9ydCgoVHJhbnNhY3Rpb25TdXBwb3J0S2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVDoKLQkJCQlzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VfQURBUFRFUl9DTEFTUzoKLQkJCQlzZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlM6Ci0JCQkJZ2V0U2VjdXJpdHlQZXJtaXNzaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlQZXJtaXNzaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVM6Ci0JCQkJZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkuY2xlYXIoKTsKLQkJCQlnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlzZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJc2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigoSW5ib3VuZFJlc291cmNlQWRhcHRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFM6Ci0JCQkJZ2V0QWRtaW5PYmplY3RzKCkuY2xlYXIoKTsKLQkJCQlnZXRBZG1pbk9iamVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1M6Ci0JCQkJc2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFOgotCQkJCXNldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKENPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUzoKLQkJCQlzZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyhDT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU5URVJGQUNFOgotCQkJCXNldENvbm5lY3Rpb25JbnRlcmZhY2UoQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lNUExfQ0xBU1M6Ci0JCQkJc2V0Q29ubmVjdGlvbkltcGxDbGFzcyhDT05ORUNUSU9OX0lNUExfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUOgotCQkJCXVuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVDoKLQkJCQl1bnNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFU09VUkNFX0FEQVBURVJfQ0xBU1M6Ci0JCQkJc2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoUkVTT1VSQ0VfQURBUFRFUl9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1NFQ1VSSVRZX1BFUk1JU1NJT05TOgotCQkJCWdldFNlY3VyaXR5UGVybWlzc2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCWdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldENvbmZpZ1Byb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSOgotCQkJCXNldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKChPdXRib3VuZFJlc291cmNlQWRhcHRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSOgotCQkJCXNldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFM6Ci0JCQkJZ2V0QWRtaW5PYmplY3RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKLQkJCQlyZXR1cm4gTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzICE9IG51bGwgOiAhTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFOgotCQkJCXJldHVybiBDT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUID09IG51bGwgPyBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSAhPSBudWxsIDogIUNPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0VfRURFRkFVTFQuZXF1YWxzKGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUzoKLQkJCQlyZXR1cm4gQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzICE9IG51bGwgOiAhQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25JbnRlcmZhY2UgIT0gbnVsbCA6ICFDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkludGVyZmFjZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTOgotCQkJCXJldHVybiBDT05ORUNUSU9OX0lNUExfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25JbXBsQ2xhc3MgIT0gbnVsbCA6ICFDT05ORUNUSU9OX0lNUExfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGNvbm5lY3Rpb25JbXBsQ2xhc3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUOgotCQkJCXJldHVybiBpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VfQURBUFRFUl9DTEFTUzoKLQkJCQlyZXR1cm4gUkVTT1VSQ0VfQURBUFRFUl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VBZGFwdGVyQ2xhc3MgIT0gbnVsbCA6ICFSRVNPVVJDRV9BREFQVEVSX0NMQVNTX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZUFkYXB0ZXJDbGFzcyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5UGVybWlzc2lvbnMgIT0gbnVsbCAmJiAhc2VjdXJpdHlQZXJtaXNzaW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUzoKLQkJCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc21zICE9IG51bGwgJiYgIWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGNvbmZpZ1Byb3BlcnRpZXMgIT0gbnVsbCAmJiAhY29uZmlnUHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIGluYm91bmRSZXNvdXJjZUFkYXB0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BRE1JTl9PQkpFQ1RTOgotCQkJCXJldHVybiBhZG1pbk9iamVjdHMgIT0gbnVsbCAmJiAhYWRtaW5PYmplY3RzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25JbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbXBsQ2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25JbXBsQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRyYW5zYWN0aW9uU3VwcG9ydDogIik7Ci0JCWlmICh0cmFuc2FjdGlvblN1cHBvcnRFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uU3VwcG9ydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYXV0aGVudGljYXRpb25TdXBwb3J0OiAiKTsKLQkJaWYgKHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCkgcmVzdWx0LmFwcGVuZChyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlQWRhcHRlckNsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXNvdXJjZUFkYXB0ZXJDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvU2VjdXJpdHlQZXJtaXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvU2VjdXJpdHlQZXJtaXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2ZkZDFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5UGVybWlzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci0KLQotLyoqCi0gKiBTcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLSAqIAotICogVGhlIHNlY3VyaXR5IHBlcm1pc3Npb24gbGlzdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXJlIG9uZXMgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2UgcmVxdWlyZWQgYnkgdGhlIGRlZmF1bHQgcGVybWlzc2lvbiBzZXQgYXMgc3BlY2lmaWVkIGluIHRoZSBjb25uZWN0b3Igc3BlY2lmaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGNhbiBtZW50aW9uIHNwZWNpZmljIHJlYXNvbiB0aGF0IHJlc291cmNlIGFkYXB0ZXIgcmVxdWlyZXMgYSBnaXZlbiBzZWN1cml0eSBwZXJtaXNzaW9uLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlQZXJtaXNzaW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5UGVybWlzc2lvbiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNwZWNpZmljYXRpb24oKSA8ZW0+U3BlY2lmaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3BlY2lmaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ0lGSUNBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmljYXRpb24gPSBTUEVDSUZJQ0FUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXByb3RlY3RlZCBTZWN1cml0eVBlcm1pc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVVJJVFlfUEVSTUlTU0lPTjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZWxlbWVudCBwZXJtaXNzaW9uLXNwZWMgc3BlY2lmaWVzIGEgc2VjdXJpdHkgcGVybWlzc2lvbiBiYXNlZCBvbiB0aGUgU2VjdXJpdHkgcG9saWN5IGZpbGUgc3ludGF4LiAKLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvbigpIHsKLQkJcmV0dXJuIHNwZWNpZmljYXRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvbihTdHJpbmcgbmV3U3BlY2lmaWNhdGlvbikgewotCQlTdHJpbmcgb2xkU3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247Ci0JCXNwZWNpZmljYXRpb24gPSBuZXdTcGVjaWZpY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX1NQRUNJRklDQVRJT04sIG9sZFNwZWNpZmljYXRpb24sIHNwZWNpZmljYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19TUEVDSUZJQ0FUSU9OOgotCQkJCXJldHVybiBnZXRTcGVjaWZpY2F0aW9uKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19TUEVDSUZJQ0FUSU9OOgotCQkJCXNldFNwZWNpZmljYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX1NQRUNJRklDQVRJT046Ci0JCQkJc2V0U3BlY2lmaWNhdGlvbihTUEVDSUZJQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fU1BFQ0lGSUNBVElPTjoKLQkJCQlyZXR1cm4gU1BFQ0lGSUNBVElPTl9FREVGQVVMVCA9PSBudWxsID8gc3BlY2lmaWNhdGlvbiAhPSBudWxsIDogIVNQRUNJRklDQVRJT05fRURFRkFVTFQuZXF1YWxzKHNwZWNpZmljYXRpb24pOwotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNwZWNpZmljYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNwZWNpZmljYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC91dGlsL0pDQURlc2NyaXB0aW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KQ0FEZXNjcmlwdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODZlNGYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC91dGlsL0pDQURlc2NyaXB0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSkNBRGVzY3JpcHRpb25IZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdGlvbihDb25maWdQcm9wZXJ0eSBwcm9wZXJ0eSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgamNhVmVyc2lvbklEKSB7Ci0JCXN3aXRjaChqY2FWZXJzaW9uSUQpIHsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDogCi0JCSAgICAJcHJvcGVydHkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQkgICAgCWJyZWFrOwotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOiB7Ci0JCSAgICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb25PYmogPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotCQkJCWRlc2NyaXB0aW9uT2JqLnNldFZhbHVlKGRlc2NyaXB0aW9uKTsKLQkJCQlwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbnMoKS5hZGQoZGVzY3JpcHRpb25PYmopOwotCQkgICAgfQotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKENvbmZpZ1Byb3BlcnR5IHByb3BlcnR5LGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlyZXR1cm4gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDogewotCQkJCSBFTGlzdCBsb2NhbGl6ZWREZXNjcmlwdGlvbnMgPSBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbnMoKTsKLQkJCQkgaWYobG9jYWxpemVkRGVzY3JpcHRpb25zID09IG51bGwgfHwgbG9jYWxpemVkRGVzY3JpcHRpb25zLnNpemUoKSA9PSAwKQotCQkJCSAJcmV0dXJuIG51bGw7Ci0JCQkgICAgIERlc2NyaXB0aW9uIGxvY2FsaXplZERlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWxvY2FsaXplZERlc2NyaXB0aW9ucy5nZXQoMCk7Ci0JCQkgICAgIGlmKGxvY2FsaXplZERlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkgICAgIAlyZXR1cm4gbG9jYWxpemVkRGVzY3JpcHRpb24uZ2V0VmFsdWUoKTsKLQkJICAgIH0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKFNlY3VyaXR5UGVybWlzc2lvbiBwcm9wZXJ0eSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgamNhVmVyc2lvbklEKSB7Ci0JCXN3aXRjaChqY2FWZXJzaW9uSUQpIHsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDogCi0JCSAgICAJcHJvcGVydHkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQkgICAgCWJyZWFrOwotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOiB7Ci0JCSAgICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb25PYmogPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotCQkJCWRlc2NyaXB0aW9uT2JqLnNldFZhbHVlKGRlc2NyaXB0aW9uKTsKLQkJCQlwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbnMoKS5hZGQoZGVzY3JpcHRpb25PYmopOwotCQkgICAgfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKFNlY3VyaXR5UGVybWlzc2lvbiBwcm9wZXJ0eSxpbnQgamNhVmVyc2lvbklEKSB7Ci0JCXN3aXRjaChqY2FWZXJzaW9uSUQpIHsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDogCi0JCSAgICAJcmV0dXJuIHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCk7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6IHsKLQkJCQkgRUxpc3QgbG9jYWxpemVkRGVzY3JpcHRpb25zID0gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQkJIGlmKGxvY2FsaXplZERlc2NyaXB0aW9ucyA9PSBudWxsIHx8IGxvY2FsaXplZERlc2NyaXB0aW9ucy5zaXplKCkgPT0gMCkKLQkJCQkgCXJldHVybiBudWxsOwotCQkJICAgICBEZXNjcmlwdGlvbiBsb2NhbGl6ZWREZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilsb2NhbGl6ZWREZXNjcmlwdGlvbnMuZ2V0KDApOwotCQkJICAgICBpZihsb2NhbGl6ZWREZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJICAgICAJcmV0dXJuIGxvY2FsaXplZERlc2NyaXB0aW9uLmdldFZhbHVlKCk7Ci0JCSAgICB9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdGlvbihMaWNlbnNlIHByb3BlcnR5LCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlwcm9wZXJ0eS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6IHsKLQkJICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbk9iaiA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJCXByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpLmFkZChkZXNjcmlwdGlvbk9iaik7Ci0JCSAgICB9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oTGljZW5zZSBwcm9wZXJ0eSxpbnQgamNhVmVyc2lvbklEKSB7Ci0JCXN3aXRjaChqY2FWZXJzaW9uSUQpIHsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDogCi0JCSAgICAJcmV0dXJuIHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCk7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6IHsKLQkJCQkgRUxpc3QgbG9jYWxpemVkRGVzY3JpcHRpb25zID0gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQkJIGlmKGxvY2FsaXplZERlc2NyaXB0aW9ucyA9PSBudWxsIHx8IGxvY2FsaXplZERlc2NyaXB0aW9ucy5zaXplKCkgPT0gMCkKLQkJCQkgCXJldHVybiBudWxsOwotCQkJICAgICBEZXNjcmlwdGlvbiBsb2NhbGl6ZWREZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilsb2NhbGl6ZWREZXNjcmlwdGlvbnMuZ2V0KDApOwotCQkJICAgICBpZihsb2NhbGl6ZWREZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJICAgICAJcmV0dXJuIGxvY2FsaXplZERlc2NyaXB0aW9uLmdldFZhbHVlKCk7Ci0JCSAgICB9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdGlvbihBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBwcm9wZXJ0eSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgamNhVmVyc2lvbklEKSB7Ci0JCXN3aXRjaChqY2FWZXJzaW9uSUQpIHsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDogCi0JCSAgICAJcHJvcGVydHkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQkgICAgCWJyZWFrOwotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOiB7Ci0JCSAgICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb25PYmogPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotCQkJCWRlc2NyaXB0aW9uT2JqLnNldFZhbHVlKGRlc2NyaXB0aW9uKTsKLQkJCQlwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbnMoKS5hZGQoZGVzY3JpcHRpb25PYmopOwotCQkgICAgfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIHByb3BlcnR5LGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlyZXR1cm4gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDogewotCQkJCSBFTGlzdCBsb2NhbGl6ZWREZXNjcmlwdGlvbnMgPSBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbnMoKTsKLQkJCQkgaWYobG9jYWxpemVkRGVzY3JpcHRpb25zID09IG51bGwgfHwgbG9jYWxpemVkRGVzY3JpcHRpb25zLnNpemUoKSA9PSAwKQotCQkJCSAJcmV0dXJuIG51bGw7Ci0JCQkgICAgIERlc2NyaXB0aW9uIGxvY2FsaXplZERlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWxvY2FsaXplZERlc2NyaXB0aW9ucy5nZXQoMCk7Ci0JCQkgICAgIGlmKGxvY2FsaXplZERlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkgICAgIAlyZXR1cm4gbG9jYWxpemVkRGVzY3JpcHRpb24uZ2V0VmFsdWUoKTsKLQkJICAgIH0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIHByb3BlcnR5LCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBqY2FWZXJzaW9uSUQpIHsKLQkJaWYoamNhVmVyc2lvbklEID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQpIHsKLQkgICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uT2JqID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKTsKLQkJCWRlc2NyaXB0aW9uT2JqLnNldFZhbHVlKGRlc2NyaXB0aW9uKTsKLQkJCXByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpLmFkZChkZXNjcmlwdGlvbk9iaik7Ci0JICAgIH0KLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgcHJvcGVydHksaW50IGpjYVZlcnNpb25JRCkgewotCQlpZihqY2FWZXJzaW9uSUQgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCkgewotCQkJIEVMaXN0IGxvY2FsaXplZERlc2NyaXB0aW9ucyA9IHByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpOwotCQkJIGlmKGxvY2FsaXplZERlc2NyaXB0aW9ucyA9PSBudWxsIHx8IGxvY2FsaXplZERlc2NyaXB0aW9ucy5zaXplKCkgPT0gMCkKLQkJCSAJcmV0dXJuIG51bGw7Ci0JCSAgICAgRGVzY3JpcHRpb24gbG9jYWxpemVkRGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pbG9jYWxpemVkRGVzY3JpcHRpb25zLmdldCgwKTsKLQkJICAgICBpZihsb2NhbGl6ZWREZXNjcmlwdGlvbiAhPSBudWxsKQotCQkgICAgIAlyZXR1cm4gbG9jYWxpemVkRGVzY3JpcHRpb24uZ2V0VmFsdWUoKTsKLQkgICAgfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3V0aWwvSmNhQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJkZTE4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgSmNhQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgSmNhUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQlwdWJsaWMgSmNhQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gKEpjYVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KXR5cGUpLmVDbGFzcygpLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBKY2FTd2l0Y2ggc3cgPSBuZXcgSmNhU3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3IoQ29ubmVjdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VMaWNlbnNlKExpY2Vuc2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTGljZW5zZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZUFkYXB0ZXIoUmVzb3VyY2VBZGFwdGVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlQWRhcHRlckFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eVBlcm1pc3Npb24oU2VjdXJpdHlQZXJtaXNzaW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VBdXRoZW50aWNhdGlvbk1lY2hhbmlzbShBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25maWdQcm9wZXJ0eShDb25maWdQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb25maWdQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsgLy8gc3cKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25uZWN0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMaWNlbnNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25maWdQcm9wZXJ0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlR2VuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKY2FTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgSmNhU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlQ29ubmVjdG9yKENvbm5lY3RvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29ubmVjdG9yQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VBZGFwdGVyKFJlc291cmNlQWRhcHRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXV0aGVudGljYXRpb25NZWNoYW5pc20oQXV0aGVudGljYXRpb25NZWNoYW5pc20gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29uZmlnUHJvcGVydHkoQ29uZmlnUHJvcGVydHkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlQZXJtaXNzaW9uKFNlY3VyaXR5UGVybWlzc2lvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTGljZW5zZShMaWNlbnNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMaWNlbnNlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW5ib3VuZFJlc291cmNlQWRhcHRlcihJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJbmJvdW5kUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZUFkYXB0ZXIoTWVzc2FnZUFkYXB0ZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29ubmVjdGlvbkRlZmluaXRpb24oQ29ubmVjdGlvbkRlZmluaXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQWRtaW5PYmplY3QoQWRtaW5PYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFkbWluT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZUxpc3RlbmVyKE1lc3NhZ2VMaXN0ZW5lciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZUxpc3RlbmVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvblNwZWMoQWN0aXZhdGlvblNwZWMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25TcGVjQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckdlbihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25uZWN0b3JBZGFwdGVyR2VuKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMaWNlbnNlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlciA8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciA8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlciA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlQWRhcHRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QgPGVtPkFkbWluIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRtaW5PYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXIgPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlTGlzdGVuZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYyA8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3RpdmF0aW9uU3BlY0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIDxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25maWdQcm9wZXJ0eUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0pjYUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDAyZmQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5MaWNlbnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmNhU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEpjYVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKY2FTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1I6IHsKLQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gKENvbm5lY3Rvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoY29ubmVjdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGNvbm5lY3Rvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoY29ubmVjdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUjogewotCQkJCVJlc291cmNlQWRhcHRlciByZXNvdXJjZUFkYXB0ZXIgPSAoUmVzb3VyY2VBZGFwdGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZUFkYXB0ZXIocmVzb3VyY2VBZGFwdGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChyZXNvdXJjZUFkYXB0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU006IHsKLQkJCQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA9IChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXV0aGVudGljYXRpb25NZWNoYW5pc20oYXV0aGVudGljYXRpb25NZWNoYW5pc20pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZOiB7Ci0JCQkJQ29uZmlnUHJvcGVydHkgY29uZmlnUHJvcGVydHkgPSAoQ29uZmlnUHJvcGVydHkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbmZpZ1Byb3BlcnR5KGNvbmZpZ1Byb3BlcnR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChjb25maWdQcm9wZXJ0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT046IHsKLQkJCQlTZWN1cml0eVBlcm1pc3Npb24gc2VjdXJpdHlQZXJtaXNzaW9uID0gKFNlY3VyaXR5UGVybWlzc2lvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VjdXJpdHlQZXJtaXNzaW9uKHNlY3VyaXR5UGVybWlzc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc2VjdXJpdHlQZXJtaXNzaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRTogewotCQkJCUxpY2Vuc2UgbGljZW5zZSA9IChMaWNlbnNlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMaWNlbnNlKGxpY2Vuc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxpY2Vuc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVI6IHsKLQkJCQlJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIGluYm91bmRSZXNvdXJjZUFkYXB0ZXIgPSAoSW5ib3VuZFJlc291cmNlQWRhcHRlcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW5ib3VuZFJlc291cmNlQWRhcHRlcihpbmJvdW5kUmVzb3VyY2VBZGFwdGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChpbmJvdW5kUmVzb3VyY2VBZGFwdGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjogewotCQkJCU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyID0gKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VPdXRib3VuZFJlc291cmNlQWRhcHRlcihvdXRib3VuZFJlc291cmNlQWRhcHRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qob3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVI6IHsKLQkJCQlNZXNzYWdlQWRhcHRlciBtZXNzYWdlQWRhcHRlciA9IChNZXNzYWdlQWRhcHRlcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZUFkYXB0ZXIobWVzc2FnZUFkYXB0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KG1lc3NhZ2VBZGFwdGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OOiB7Ci0JCQkJQ29ubmVjdGlvbkRlZmluaXRpb24gY29ubmVjdGlvbkRlZmluaXRpb24gPSAoQ29ubmVjdGlvbkRlZmluaXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbm5lY3Rpb25EZWZpbml0aW9uKGNvbm5lY3Rpb25EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChjb25uZWN0aW9uRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVDogewotCQkJCUFkbWluT2JqZWN0IGFkbWluT2JqZWN0ID0gKEFkbWluT2JqZWN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBZG1pbk9iamVjdChhZG1pbk9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoYWRtaW5PYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSOiB7Ci0JCQkJTWVzc2FnZUxpc3RlbmVyIG1lc3NhZ2VMaXN0ZW5lciA9IChNZXNzYWdlTGlzdGVuZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1lc3NhZ2VMaXN0ZW5lcihtZXNzYWdlTGlzdGVuZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KG1lc3NhZ2VMaXN0ZW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQzogewotCQkJCUFjdGl2YXRpb25TcGVjIGFjdGl2YXRpb25TcGVjID0gKEFjdGl2YXRpb25TcGVjKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBY3RpdmF0aW9uU3BlYyhhY3RpdmF0aW9uU3BlYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoYWN0aXZhdGlvblNwZWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRTogewotCQkJCVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlID0gKFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZShyZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QocmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25uZWN0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29ubmVjdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3IoQ29ubmVjdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZUFkYXB0ZXIoUmVzb3VyY2VBZGFwdGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXV0aGVudGljYXRpb25NZWNoYW5pc20oQXV0aGVudGljYXRpb25NZWNoYW5pc20gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25maWcgUHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25maWdQcm9wZXJ0eShDb25maWdQcm9wZXJ0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IFBlcm1pc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlQZXJtaXNzaW9uKFNlY3VyaXR5UGVybWlzc2lvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpY2Vuc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGljZW5zZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTGljZW5zZShMaWNlbnNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW5ib3VuZFJlc291cmNlQWRhcHRlcihJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRib3VuZFJlc291cmNlQWRhcHRlcihPdXRib3VuZFJlc291cmNlQWRhcHRlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VBZGFwdGVyKE1lc3NhZ2VBZGFwdGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29ubmVjdGlvbkRlZmluaXRpb24oQ29ubmVjdGlvbkRlZmluaXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZG1pbiBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWRtaW4gT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBZG1pbk9iamVjdChBZG1pbk9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZUxpc3RlbmVyKE1lc3NhZ2VMaXN0ZW5lciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25TcGVjKEFjdGl2YXRpb25TcGVjIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSmNhU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ODg5N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPkVKQiBBcnRpZmFjdCBFZGl0IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGNvbm5lY3RvciBtb2R1bGUgbW9kZWwgYXBpLiBVc2luZyB0aGlzIGFwaSB0aGUgYXJ0aWZhY3RzIG9mIGFuIGNvbm5lY3RvciBhcHAKLSAgICAgICAgY2FuIGJlIGNyZWF0ZWQgYW5kIGFjY2Vzc2VkLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL0pTUENvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL0pTUENvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2JiYmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9KU1BDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkpTUCBDb25maWc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUganNwLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBwcm92aWRlIGdsb2JhbCBjb25maWd1cmF0aW9uCi0gKiBpbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzCi0gKiB0d28gc3ViZWxlbWVudHMsIHRhZ2xpYiBhbmQganNwLXByb3BlcnR5LWdyb3VwLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWcjZ2V0VGFnTGlicyA8ZW0+VGFnIExpYnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWcjZ2V0UHJvcGVydHlHcm91cHMgPGVtPlByb3BlcnR5IEdyb3VwczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2UjZ2V0SlNQQ29uZmlnKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUENvbmZpZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWcgTGliczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhZyBMaWJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFnIExpYnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BDb25maWdfVGFnTGlicygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGFnTGlicygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydHkgR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydHkgR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydHkgR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2UjZ2V0SlNQQ29uZmlnX1Byb3BlcnR5R3JvdXBzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQcm9wZXJ0eUdyb3VwcygpOwotCi19IC8vIEpTUENvbmZpZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL0pTUFByb3BlcnR5R3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9KU1BQcm9wZXJ0eUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1N2FmZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL0pTUFByb3BlcnR5R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SlNQIFByb3BlcnR5IEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZgotICogZmlsZXMgc28gdGhleSBjYW4gYmUgZ2l2ZW4gZ2xvYmFsIHByb3BlcnR5IGluZm9ybWF0aW9uLgotICogQWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gVGhlCi0gKiBmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGNhbiBiZSBkZXNjcmliZWQ6Ci0gKiAKLSAqIC0gQ29udHJvbCBlbmFibGluZyBvZiBFTCBldmFsdWF0aW9uLiAtIENvbnRyb2wgZW5hYmxpbmcKLSAqIG9mIFNjcmlwdGluZyBlbGVtZW50cy4gLSBJbmRpY2F0ZSBwYWdlRW5jb2RpbmcKLSAqIGluZm9ybWF0aW9uLiAtIEluZGljYXRpbmcgdGhhdCBhIHJlc291cmNlIGlzIGEgSlNQCi0gKiBkb2N1bWVudCAtIFByZWx1ZGUgYW5kIENvZGEgYXV0b21hdGljIGluY2x1ZGVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2dldFVybFBhdHRlcm4gPGVtPlVybCBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc0VsSWdub3JlZCA8ZW0+RWwgSWdub3JlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0UGFnZUVuY29kaW5nIDxlbT5QYWdlIEVuY29kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc1NjcmlwdGluZ0ludmFsaWQgPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc0lzWE1MIDxlbT5JcyBYTUw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2dldEluY2x1ZGVQcmVsdWRlcyA8ZW0+SW5jbHVkZSBQcmVsdWRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZUNvZGFzIDxlbT5JbmNsdWRlIENvZGFzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUFByb3BlcnR5R3JvdXAgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJsIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVybCBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJsIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BQcm9wZXJ0eUdyb3VwX1VybFBhdHRlcm4oKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRVcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbCBJZ25vcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsIElnbm9yZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTElnbm9yZWQKLQkgKiAJcHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuIEJ5IGRlZmF1bHQsCi0JICogCXRoZSBFTCBldmFsdWF0aW9uIGlzIGVuYWJsZWQgZm9yIFdlYgotCSAqIAlBcHBsaWNhdGlvbnMgdXNpbmcgYSBTZXJ2bGV0IDIuNCBvciBncmVhdGVyCi0JICogCXdlYi54bWwsIGFuZCBkaXNhYmxlZCBvdGhlcndpc2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsIElnbm9yZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWxJZ25vcmVkKCkKLQkgKiBAc2VlICN1bnNldEVsSWdub3JlZCgpCi0JICogQHNlZSAjc2V0RWxJZ25vcmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFbElnbm9yZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkIDxlbT5FbCBJZ25vcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbCBJZ25vcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVsSWdub3JlZCgpCi0JICogQHNlZSAjdW5zZXRFbElnbm9yZWQoKQotCSAqIEBzZWUgI2lzRWxJZ25vcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbElnbm9yZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkIDxlbT5FbCBJZ25vcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVsSWdub3JlZCgpCi0JICogQHNlZSAjaXNFbElnbm9yZWQoKQotCSAqIEBzZWUgI3NldEVsSWdub3JlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RWxJZ25vcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkIDxlbT5FbCBJZ25vcmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbCBJZ25vcmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFbElnbm9yZWQoKQotCSAqIEBzZWUgI2lzRWxJZ25vcmVkKCkKLQkgKiBAc2VlICNzZXRFbElnbm9yZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVsSWdub3JlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFnZSBFbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFnZSBFbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsaWQgdmFsdWVzIG9mIHBhZ2UtZW5jb2RpbmcgYXJlIHRob3NlIG9mCi0JICogCXRoZSBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuIEl0IGlzIGEKLQkgKiAJdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudAotCSAqIAllbmNvZGluZ3MgaW4gdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlCi0JICogCXBhZ2UgZGlyZWN0aXZlIG9mIGEgSlNQIHBhZ2UgYW5kIGluIGEgSlNQCi0JICogCWNvbmZpZ3VyYXRpb24gZWxlbWVudCBtYXRjaGluZyB0aGUgcGFnZS4gSXQgaXMKLQkgKiAJYWxzbyBhIHRyYW5zbGF0aW9uLXRpbWUgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQKLQkgKiAJZW5jb2RpbmdzIGluIHRoZSBwcm9sb2cgb2YgYSBkb2N1bWVudCBpbiBYTUwKLQkgKiAJc3ludGF4IGFuZCBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKiAJbWF0Y2hpbmcgdGhlIGRvY3VtZW50LiBJdCBpcyBsZWdhbCB0byBuYW1lIHRoZQotCSAqIAlzYW1lIGVuY29kaW5nIHRocm91Z2ggbXVsaXRwbGUgbWVjaGFuaXNtcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFnZSBFbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFnZUVuY29kaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldEpTUFByb3BlcnR5R3JvdXBfUGFnZUVuY29kaW5nKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhZ2VFbmNvZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0UGFnZUVuY29kaW5nIDxlbT5QYWdlIEVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYWdlIEVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYWdlRW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhZ2VFbmNvZGluZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NyaXB0aW5nIEludmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IGRpc2FibGUgc2NyaXB0aW5nIGluIGEKLQkgKiAJZ3JvdXAgb2YgSlNQIHBhZ2VzLiBCeSBkZWZhdWx0LCBzY3JpcHRpbmcgaXMKLQkgKiAJZW5hYmxlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjdW5zZXRTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICNzZXRTY3JpcHRpbmdJbnZhbGlkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BQcm9wZXJ0eUdyb3VwX1NjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2NyaXB0aW5nSW52YWxpZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjaXNTY3JpcHRpbmdJbnZhbGlkIDxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjdW5zZXRTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICNpc1NjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjcmlwdGluZ0ludmFsaWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzU2NyaXB0aW5nSW52YWxpZCA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U2NyaXB0aW5nSW52YWxpZCgpCi0JICogQHNlZSAjaXNTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICNzZXRTY3JpcHRpbmdJbnZhbGlkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTY3JpcHRpbmdJbnZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzU2NyaXB0aW5nSW52YWxpZCA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAc2VlICNpc1NjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI3NldFNjcmlwdGluZ0ludmFsaWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNjcmlwdGluZ0ludmFsaWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFhNTDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgWE1MPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIHRydWUsIGRlbm90ZXMgdGhhdCB0aGUgZ3JvdXAgb2YgcmVzb3VyY2VzCi0JICogCXRoYXQgbWF0Y2ggdGhlIFVSTCBwYXR0ZXJuIGFyZSBKU1AgZG9jdW1lbnRzLAotCSAqIAlhbmQgdGh1cyBtdXN0IGJlIGludGVycHJldGVkIGFzIFhNTCBkb2N1bWVudHMuCi0JICogCUlmIGZhbHNlLCB0aGUgcmVzb3VyY2VzIGFyZSBhc3N1bWVkIHRvIG5vdCBiZQotCSAqIAlKU1AgZG9jdW1lbnRzLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlciBwcm9wZXJ0eQotCSAqIAlncm91cCB0aGF0IGluZGljYXRlcyBvdGhlcndpc2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFhNTDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1hNTCgpCi0JICogQHNlZSAjdW5zZXRJc1hNTCgpCi0JICogQHNlZSAjc2V0SXNYTUwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldEpTUFByb3BlcnR5R3JvdXBfSXNYTUwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzWE1MKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc0lzWE1MIDxlbT5JcyBYTUw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFhNTDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1hNTCgpCi0JICogQHNlZSAjdW5zZXRJc1hNTCgpCi0JICogQHNlZSAjaXNJc1hNTCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNYTUwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzSXNYTUwgPGVtPklzIFhNTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1hNTCgpCi0JICogQHNlZSAjaXNJc1hNTCgpCi0JICogQHNlZSAjc2V0SXNYTUwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzWE1MKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzSXNYTUwgPGVtPklzIFhNTDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgWE1MPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1hNTCgpCi0JICogQHNlZSAjaXNJc1hNTCgpCi0JICogQHNlZSAjc2V0SXNYTUwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzWE1MKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmNsdWRlIFByZWx1ZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGluY2x1ZGUtcHJlbHVkZSBlbGVtZW50IGlzIGEKLQkgKiAJY29udGV4dC1yZWxhdGl2ZSBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvCi0JICogCWFuIGVsZW1lbnQgaW4gdGhlIFdlYiBBcHBsaWNhdGlvbi4gV2hlbiB0aGUKLQkgKiAJZWxlbWVudCBpcyBwcmVzZW50LCB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlCi0JICogCWF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzIGluIGFuIGluY2x1ZGUKLQkgKiAJZGlyZWN0aXZlKSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggSlNQIHBhZ2UgaW4KLQkgKiAJdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGUgUHJlbHVkZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEluY2x1ZGVQcmVsdWRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5jbHVkZSBDb2RhczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5jbHVkZSBDb2RhczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpbmNsdWRlLWNvZGEgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLQkgKiAJcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotCSAqIAlXZWIgQXBwbGljYXRpb24uIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKLQkgKiAJdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkCi0JICogCShhcyBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGVuZCBvZiBlYWNoCi0JICogCUpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNsdWRlIENvZGFzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2UjZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbmNsdWRlQ29kYXMoKTsKLQotfSAvLyBKU1BQcm9wZXJ0eUdyb3VwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSnNwRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL0pzcEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0NDZhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSnNwRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnNwRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUpzcEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KU1AgQ29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KU1AgQ29uZmlnPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKU1BDb25maWcgY3JlYXRlSlNQQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpTUCBQcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKU1BQcm9wZXJ0eUdyb3VwIGNyZWF0ZUpTUFByb3BlcnR5R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFnIExpYiBSZWYgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFnIExpYiBSZWYgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFnTGliUmVmVHlwZSBjcmVhdGVUYWdMaWJSZWZUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIG1ldGhvZCBpcyBOT1QgYXBpLCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuICAKLQkgKiBFTUYgcGFja2FnZSBjbGFzc2VzIHNob3VsZCBiZSBhY2Nlc3MgdmlhIHRoZWlyICJlSU5TVEFOQ0UiIHN0YXRpYyBmaWVsZHMKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUpzcFBhY2thZ2UgZ2V0SnNwUGFja2FnZSgpOwotCi19IC8vSnNwRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL0pzcFBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9Kc3BQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZGEwYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL0pzcFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogLyoqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnNwUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJqc3AiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAianNwLnhtaSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuanNwIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUpzcFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BDb25maWdJbXBsIDxlbT5KU1AgQ29uZmlnPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQQ29uZmlnSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwjZ2V0SlNQQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpTUF9DT05GSUcgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhZyBMaWJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfQ09ORklHX19UQUdfTElCUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5IEdyb3VwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX0NPTkZJR19fUFJPUEVSVFlfR1JPVVBTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SlNQIENvbmZpZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfQ09ORklHX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQUHJvcGVydHlHcm91cEltcGwgPGVtPkpTUCBQcm9wZXJ0eSBHcm91cDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpTUFByb3BlcnR5R3JvdXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbCNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbCBJZ25vcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZ2UgRW5jb2Rpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkcgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NyaXB0aW5nIEludmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFhNTDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGUgUHJlbHVkZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlIENvZGFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5UYWdMaWJSZWZUeXBlSW1wbCA8ZW0+VGFnIExpYiBSZWYgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYlJlZlR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbCNnZXRUYWdMaWJSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBR19MSUJfUkVGX1RZUEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhZ2xpYiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfVVJJID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnbGliIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX0xPQ0FUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFnIExpYiBSZWYgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX1JFRl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZyA8ZW0+SlNQIENvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KU1AgQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SlNQQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZyNnZXRUYWdMaWJzIDxlbT5UYWcgTGliczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFnIExpYnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnI2dldFRhZ0xpYnMoKQotCSAqIEBzZWUgI2dldEpTUENvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQQ29uZmlnX1RhZ0xpYnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnI2dldFByb3BlcnR5R3JvdXBzIDxlbT5Qcm9wZXJ0eSBHcm91cHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnR5IEdyb3VwczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWcjZ2V0UHJvcGVydHlHcm91cHMoKQotCSAqIEBzZWUgI2dldEpTUENvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQQ29uZmlnX1Byb3BlcnR5R3JvdXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCA8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkpTUCBQcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRKU1BQcm9wZXJ0eUdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0VXJsUGF0dGVybiA8ZW0+VXJsIFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlVybCBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0VXJsUGF0dGVybigpCi0JICogQHNlZSAjZ2V0SlNQUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkIDxlbT5FbCBJZ25vcmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWwgSWdub3JlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkKCkKLQkgKiBAc2VlICNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNnZXRQYWdlRW5jb2RpbmcgPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYWdlIEVuY29kaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0UGFnZUVuY29kaW5nKCkKLQkgKiBAc2VlICNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc1NjcmlwdGluZ0ludmFsaWQgPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc1NjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI2dldEpTUFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc0lzWE1MIDxlbT5JcyBYTUw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBYTUw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc0lzWE1MKCkKLQkgKiBAc2VlICNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX0lzWE1MKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZVByZWx1ZGVzIDxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZVByZWx1ZGVzKCkKLQkgKiBAc2VlICNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2dldEluY2x1ZGVDb2RhcyA8ZW0+SW5jbHVkZSBDb2RhczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW5jbHVkZSBDb2RhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2dldEluY2x1ZGVDb2RhcygpCi0JICogQHNlZSAjZ2V0SlNQUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlIDxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhZyBMaWIgUmVmIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFnTGliUmVmVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZSNnZXRUYWdsaWJVUkkgPGVtPlRhZ2xpYiBVUkk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYWdsaWIgVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUjZ2V0VGFnbGliVVJJKCkKLQkgKiBAc2VlICNnZXRUYWdMaWJSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYlVSSSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZSNnZXRUYWdsaWJMb2NhdGlvbiA8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUjZ2V0VGFnbGliTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldFRhZ0xpYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhZ0xpYlJlZlR5cGVfVGFnbGliTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUpzcEZhY3RvcnkgZ2V0SnNwRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQQ29uZmlnSW1wbCA8ZW0+SlNQIENvbmZpZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpTUENvbmZpZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbCNnZXRKU1BDb25maWcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSlNQX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRKU1BDb25maWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhZyBMaWJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKU1BfQ09ORklHX19UQUdfTElCUyA9IGVJTlNUQU5DRS5nZXRKU1BDb25maWdfVGFnTGlicygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHkgR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKU1BfQ09ORklHX19QUk9QRVJUWV9HUk9VUFMgPSBlSU5TVEFOQ0UuZ2V0SlNQQ29uZmlnX1Byb3BlcnR5R3JvdXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BQcm9wZXJ0eUdyb3VwSW1wbCA8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQUHJvcGVydHlHcm91cEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbCNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpTUF9QUk9QRVJUWV9HUk9VUCA9IGVJTlNUQU5DRS5nZXRKU1BQcm9wZXJ0eUdyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRKU1BQcm9wZXJ0eUdyb3VwX1VybFBhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsIElnbm9yZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQgPSBlSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9FbElnbm9yZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhZ2UgRW5jb2Rpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkcgPSBlSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9QYWdlRW5jb2RpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjcmlwdGluZyBJbnZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRCA9IGVJTlNUQU5DRS5nZXRKU1BQcm9wZXJ0eUdyb3VwX1NjcmlwdGluZ0ludmFsaWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFhNTDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MID0gZUlOU1RBTkNFLmdldEpTUFByb3BlcnR5R3JvdXBfSXNYTUwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGUgUHJlbHVkZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUyA9IGVJTlNUQU5DRS5nZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZSBDb2RhczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTID0gZUlOU1RBTkNFLmdldEpTUFByb3BlcnR5R3JvdXBfSW5jbHVkZUNvZGFzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5UYWdMaWJSZWZUeXBlSW1wbCA8ZW0+VGFnIExpYiBSZWYgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYlJlZlR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwjZ2V0VGFnTGliUmVmVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQUdfTElCX1JFRl9UWVBFID0gZUlOU1RBTkNFLmdldFRhZ0xpYlJlZlR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhZ2xpYiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfVVJJID0gZUlOU1RBTkNFLmdldFRhZ0xpYlJlZlR5cGVfVGFnbGliVVJJKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWdsaWIgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJMb2NhdGlvbigpOwotCi0JfQotCi19IC8vSnNwUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL1RhZ0xpYlJlZlR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9UYWdMaWJSZWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTM3MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL1RhZ0xpYlJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhZyBMaWIgUmVmIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBBIHRhZ2xpYiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIGEgdGFnCi0gKiBsaWJyYXJ5IHRoYXQgaXMgdXNlZCBieSBhIEpTUCBwYWdlIHdpdGhpbiB0aGUgV2ViCi0gKiBBcHBsaWNhdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZSNnZXRUYWdsaWJVUkkgPGVtPlRhZ2xpYiBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlI2dldFRhZ2xpYkxvY2F0aW9uIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldFRhZ0xpYlJlZlR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFnTGliUmVmVHlwZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWdsaWIgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWdsaWIgVVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICBBIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkkgaWRlbnRpZnlpbmcgYQotCSAqICAgICAgICAgdGFnIGxpYnJhcnkgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiAgVGhlIGJvZHkKLQkgKiAgICAgICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbgotCSAqICAgICAgICAgYWJzb2x1dGUgVVJJIHNwZWNpZmljYXRpb24sIG9yIGEgcmVsYXRpdmUgVVJJLgotCSAqICAgICAgICAgVGhlcmUgc2hvdWxkIGJlIG5vIGVudHJpZXMgaW4gd2ViLnhtbCB3aXRoIHRoZQotCSAqICAgICAgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWdsaWIgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWdsaWJVUkkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2UjZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJVUkkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGFnbGliVVJJKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZSNnZXRUYWdsaWJVUkkgPGVtPlRhZ2xpYiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhZ2xpYiBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhZ2xpYlVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFnbGliVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWdsaWIgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiB0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi0JICogICAgICAgICAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCi0JICogICAgICAgICBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYnJhcnkKLQkgKiAgICAgICAgIERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWdsaWJMb2NhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYkxvY2F0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRhZ2xpYkxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZSNnZXRUYWdsaWJMb2NhdGlvbiA8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYWdsaWIgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhZ2xpYkxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYWdsaWJMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRhZ0xpYlJlZlR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pTUENvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pTUENvbmZpZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0NDM3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9KU1BDb25maWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SlNQIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQQ29uZmlnSW1wbCNnZXRUYWdMaWJzIDxlbT5UYWcgTGliczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQQ29uZmlnSW1wbCNnZXRQcm9wZXJ0eUdyb3VwcyA8ZW0+UHJvcGVydHkgR3JvdXBzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29uZmlnSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEpTUENvbmZpZyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnTGlicygpIDxlbT5UYWcgTGliczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdMaWJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGFnTGlicyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0eUdyb3VwcygpIDxlbT5Qcm9wZXJ0eSBHcm91cHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydHlHcm91cHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcm9wZXJ0eUdyb3VwcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSlNQQ29uZmlnSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpzcFBhY2thZ2UuTGl0ZXJhbHMuSlNQX0NPTkZJRzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGFnTGlicygpIHsKLQkJaWYgKHRhZ0xpYnMgPT0gbnVsbCkgewotCQkJdGFnTGlicyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUYWdMaWJSZWZUeXBlLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTKTsKLQkJfQotCQlyZXR1cm4gdGFnTGliczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UHJvcGVydHlHcm91cHMoKSB7Ci0JCWlmIChwcm9wZXJ0eUdyb3VwcyA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eUdyb3VwcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1BST1BFUlRZX0dST1VQUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5R3JvdXBzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRhZ0xpYnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1BST1BFUlRZX0dST1VQUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByb3BlcnR5R3JvdXBzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTOgotCQkJCXJldHVybiBnZXRUYWdMaWJzKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fUFJPUEVSVFlfR1JPVVBTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0eUdyb3VwcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6Ci0JCQkJZ2V0VGFnTGlicygpLmNsZWFyKCk7Ci0JCQkJZ2V0VGFnTGlicygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1BST1BFUlRZX0dST1VQUzoKLQkJCQlnZXRQcm9wZXJ0eUdyb3VwcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydHlHcm91cHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6Ci0JCQkJZ2V0VGFnTGlicygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1BST1BFUlRZX0dST1VQUzoKLQkJCQlnZXRQcm9wZXJ0eUdyb3VwcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6Ci0JCQkJcmV0dXJuIHRhZ0xpYnMgIT0gbnVsbCAmJiAhdGFnTGlicy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fUFJPUEVSVFlfR1JPVVBTOgotCQkJCXJldHVybiBwcm9wZXJ0eUdyb3VwcyAhPSBudWxsICYmICFwcm9wZXJ0eUdyb3Vwcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0pTUENvbmZpZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pTUFByb3BlcnR5R3JvdXBJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9KU1BQcm9wZXJ0eUdyb3VwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzIwZDdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pTUFByb3BlcnR5R3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkpTUCBQcm9wZXJ0eSBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQUHJvcGVydHlHcm91cEltcGwjZ2V0VXJsUGF0dGVybiA8ZW0+VXJsIFBhdHRlcm48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpTUFByb3BlcnR5R3JvdXBJbXBsI2lzRWxJZ25vcmVkIDxlbT5FbCBJZ25vcmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BQcm9wZXJ0eUdyb3VwSW1wbCNnZXRQYWdlRW5jb2RpbmcgPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpTUFByb3BlcnR5R3JvdXBJbXBsI2lzU2NyaXB0aW5nSW52YWxpZCA8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpTUFByb3BlcnR5R3JvdXBJbXBsI2lzSXNYTUwgPGVtPklzIFhNTDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQUHJvcGVydHlHcm91cEltcGwjZ2V0SW5jbHVkZVByZWx1ZGVzIDxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BQcm9wZXJ0eUdyb3VwSW1wbCNnZXRJbmNsdWRlQ29kYXMgPGVtPkluY2x1ZGUgQ29kYXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQcm9wZXJ0eUdyb3VwSW1wbCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIEpTUFByb3BlcnR5R3JvdXAgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVybFBhdHRlcm4oKSA8ZW0+VXJsIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJsUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHVybFBhdHRlcm4gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWxJZ25vcmVkKCkgPGVtPkVsIElnbm9yZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWxJZ25vcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRUxfSUdOT1JFRF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VsSWdub3JlZCgpIDxlbT5FbCBJZ25vcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VsSWdub3JlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWxJZ25vcmVkID0gRUxfSUdOT1JFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRWwgSWdub3JlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWxJZ25vcmVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZ2VFbmNvZGluZygpIDxlbT5QYWdlIEVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWdlRW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfRU5DT0RJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFnZUVuY29kaW5nKCkgPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhZ2VFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYWdlRW5jb2RpbmcgPSBQQUdFX0VOQ09ESU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU2NyaXB0aW5nSW52YWxpZCgpIDxlbT5TY3JpcHRpbmcgSW52YWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTY3JpcHRpbmdJbnZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0NSSVBUSU5HX0lOVkFMSURfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTY3JpcHRpbmdJbnZhbGlkKCkgPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNjcmlwdGluZ0ludmFsaWQgPSBTQ1JJUFRJTkdfSU5WQUxJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU2NyaXB0aW5nIEludmFsaWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNjcmlwdGluZ0ludmFsaWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1hNTCgpIDxlbT5JcyBYTUw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNYTUwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19YTUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNYTUwoKSA8ZW0+SXMgWE1MPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzWE1MKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hNTCA9IElTX1hNTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgWE1MIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hNTEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2x1ZGVQcmVsdWRlcygpIDxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY2x1ZGVQcmVsdWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluY2x1ZGVQcmVsdWRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNsdWRlQ29kYXMoKSA8ZW0+SW5jbHVkZSBDb2RhczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmNsdWRlQ29kYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmNsdWRlQ29kYXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEpTUFByb3BlcnR5R3JvdXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSnNwUGFja2FnZS5MaXRlcmFscy5KU1BfUFJPUEVSVFlfR1JPVVA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFVybFBhdHRlcm4oKSB7Ci0JCWlmICh1cmxQYXR0ZXJuID09IG51bGwpIHsKLQkJCXVybFBhdHRlcm4gPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk4pOwotCQl9Ci0JCXJldHVybiB1cmxQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWxJZ25vcmVkKCkgewotCQlyZXR1cm4gZWxJZ25vcmVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsSWdub3JlZChib29sZWFuIG5ld0VsSWdub3JlZCkgewotCQlib29sZWFuIG9sZEVsSWdub3JlZCA9IGVsSWdub3JlZDsKLQkJZWxJZ25vcmVkID0gbmV3RWxJZ25vcmVkOwotCQlib29sZWFuIG9sZEVsSWdub3JlZEVTZXQgPSBlbElnbm9yZWRFU2V0OwotCQllbElnbm9yZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQsIG9sZEVsSWdub3JlZCwgZWxJZ25vcmVkLCAhb2xkRWxJZ25vcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RWxJZ25vcmVkKCkgewotCQlib29sZWFuIG9sZEVsSWdub3JlZCA9IGVsSWdub3JlZDsKLQkJYm9vbGVhbiBvbGRFbElnbm9yZWRFU2V0ID0gZWxJZ25vcmVkRVNldDsKLQkJZWxJZ25vcmVkID0gRUxfSUdOT1JFRF9FREVGQVVMVDsKLQkJZWxJZ25vcmVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVELCBvbGRFbElnbm9yZWQsIEVMX0lHTk9SRURfRURFRkFVTFQsIG9sZEVsSWdub3JlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEVsSWdub3JlZCgpIHsKLQkJcmV0dXJuIGVsSWdub3JlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlRW5jb2RpbmcoKSB7Ci0JCXJldHVybiBwYWdlRW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZUVuY29kaW5nKFN0cmluZyBuZXdQYWdlRW5jb2RpbmcpIHsKLQkJU3RyaW5nIG9sZFBhZ2VFbmNvZGluZyA9IHBhZ2VFbmNvZGluZzsKLQkJcGFnZUVuY29kaW5nID0gbmV3UGFnZUVuY29kaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORywgb2xkUGFnZUVuY29kaW5nLCBwYWdlRW5jb2RpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NjcmlwdGluZ0ludmFsaWQoKSB7Ci0JCXJldHVybiBzY3JpcHRpbmdJbnZhbGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjcmlwdGluZ0ludmFsaWQoYm9vbGVhbiBuZXdTY3JpcHRpbmdJbnZhbGlkKSB7Ci0JCWJvb2xlYW4gb2xkU2NyaXB0aW5nSW52YWxpZCA9IHNjcmlwdGluZ0ludmFsaWQ7Ci0JCXNjcmlwdGluZ0ludmFsaWQgPSBuZXdTY3JpcHRpbmdJbnZhbGlkOwotCQlib29sZWFuIG9sZFNjcmlwdGluZ0ludmFsaWRFU2V0ID0gc2NyaXB0aW5nSW52YWxpZEVTZXQ7Ci0JCXNjcmlwdGluZ0ludmFsaWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElELCBvbGRTY3JpcHRpbmdJbnZhbGlkLCBzY3JpcHRpbmdJbnZhbGlkLCAhb2xkU2NyaXB0aW5nSW52YWxpZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNjcmlwdGluZ0ludmFsaWQoKSB7Ci0JCWJvb2xlYW4gb2xkU2NyaXB0aW5nSW52YWxpZCA9IHNjcmlwdGluZ0ludmFsaWQ7Ci0JCWJvb2xlYW4gb2xkU2NyaXB0aW5nSW52YWxpZEVTZXQgPSBzY3JpcHRpbmdJbnZhbGlkRVNldDsKLQkJc2NyaXB0aW5nSW52YWxpZCA9IFNDUklQVElOR19JTlZBTElEX0VERUZBVUxUOwotCQlzY3JpcHRpbmdJbnZhbGlkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRCwgb2xkU2NyaXB0aW5nSW52YWxpZCwgU0NSSVBUSU5HX0lOVkFMSURfRURFRkFVTFQsIG9sZFNjcmlwdGluZ0ludmFsaWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTY3JpcHRpbmdJbnZhbGlkKCkgewotCQlyZXR1cm4gc2NyaXB0aW5nSW52YWxpZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1hNTCgpIHsKLQkJcmV0dXJuIGlzWE1MOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzWE1MKGJvb2xlYW4gbmV3SXNYTUwpIHsKLQkJYm9vbGVhbiBvbGRJc1hNTCA9IGlzWE1MOwotCQlpc1hNTCA9IG5ld0lzWE1MOwotCQlib29sZWFuIG9sZElzWE1MRVNldCA9IGlzWE1MRVNldDsKLQkJaXNYTUxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTCwgb2xkSXNYTUwsIGlzWE1MLCAhb2xkSXNYTUxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1hNTCgpIHsKLQkJYm9vbGVhbiBvbGRJc1hNTCA9IGlzWE1MOwotCQlib29sZWFuIG9sZElzWE1MRVNldCA9IGlzWE1MRVNldDsKLQkJaXNYTUwgPSBJU19YTUxfRURFRkFVTFQ7Ci0JCWlzWE1MRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUwsIG9sZElzWE1MLCBJU19YTUxfRURFRkFVTFQsIG9sZElzWE1MRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNYTUwoKSB7Ci0JCXJldHVybiBpc1hNTEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluY2x1ZGVQcmVsdWRlcygpIHsKLQkJaWYgKGluY2x1ZGVQcmVsdWRlcyA9PSBudWxsKSB7Ci0JCQlpbmNsdWRlUHJlbHVkZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUyk7Ci0JCX0KLQkJcmV0dXJuIGluY2x1ZGVQcmVsdWRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW5jbHVkZUNvZGFzKCkgewotCQlpZiAoaW5jbHVkZUNvZGFzID09IG51bGwpIHsKLQkJCWluY2x1ZGVDb2RhcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTKTsKLQkJfQotCQlyZXR1cm4gaW5jbHVkZUNvZGFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOOgotCQkJCXJldHVybiBnZXRVcmxQYXR0ZXJuKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEOgotCQkJCXJldHVybiBpc0VsSWdub3JlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkc6Ci0JCQkJcmV0dXJuIGdldFBhZ2VFbmNvZGluZygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQ6Ci0JCQkJcmV0dXJuIGlzU2NyaXB0aW5nSW52YWxpZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTDoKLQkJCQlyZXR1cm4gaXNJc1hNTCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVM6Ci0JCQkJcmV0dXJuIGdldEluY2x1ZGVQcmVsdWRlcygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUzoKLQkJCQlyZXR1cm4gZ2V0SW5jbHVkZUNvZGFzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOOgotCQkJCWdldFVybFBhdHRlcm4oKS5jbGVhcigpOwotCQkJCWdldFVybFBhdHRlcm4oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQ6Ci0JCQkJc2V0RWxJZ25vcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkc6Ci0JCQkJc2V0UGFnZUVuY29kaW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEOgotCQkJCXNldFNjcmlwdGluZ0ludmFsaWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MOgotCQkJCXNldElzWE1MKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVM6Ci0JCQkJZ2V0SW5jbHVkZVByZWx1ZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmNsdWRlUHJlbHVkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVM6Ci0JCQkJZ2V0SW5jbHVkZUNvZGFzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmNsdWRlQ29kYXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTjoKLQkJCQlnZXRVcmxQYXR0ZXJuKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEOgotCQkJCXVuc2V0RWxJZ25vcmVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORzoKLQkJCQlzZXRQYWdlRW5jb2RpbmcoUEFHRV9FTkNPRElOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQ6Ci0JCQkJdW5zZXRTY3JpcHRpbmdJbnZhbGlkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MOgotCQkJCXVuc2V0SXNYTUwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTOgotCQkJCWdldEluY2x1ZGVQcmVsdWRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUzoKLQkJCQlnZXRJbmNsdWRlQ29kYXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk46Ci0JCQkJcmV0dXJuIHVybFBhdHRlcm4gIT0gbnVsbCAmJiAhdXJsUGF0dGVybi5pc0VtcHR5KCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEOgotCQkJCXJldHVybiBpc1NldEVsSWdub3JlZCgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORzoKLQkJCQlyZXR1cm4gUEFHRV9FTkNPRElOR19FREVGQVVMVCA9PSBudWxsID8gcGFnZUVuY29kaW5nICE9IG51bGwgOiAhUEFHRV9FTkNPRElOR19FREVGQVVMVC5lcXVhbHMocGFnZUVuY29kaW5nKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEOgotCQkJCXJldHVybiBpc1NldFNjcmlwdGluZ0ludmFsaWQoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTDoKLQkJCQlyZXR1cm4gaXNTZXRJc1hNTCgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUzoKLQkJCQlyZXR1cm4gaW5jbHVkZVByZWx1ZGVzICE9IG51bGwgJiYgIWluY2x1ZGVQcmVsdWRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTOgotCQkJCXJldHVybiBpbmNsdWRlQ29kYXMgIT0gbnVsbCAmJiAhaW5jbHVkZUNvZGFzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVybFBhdHRlcm46ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVybFBhdHRlcm4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVsSWdub3JlZDogIik7Ci0JCWlmIChlbElnbm9yZWRFU2V0KSByZXN1bHQuYXBwZW5kKGVsSWdub3JlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhZ2VFbmNvZGluZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFnZUVuY29kaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY3JpcHRpbmdJbnZhbGlkOiAiKTsKLQkJaWYgKHNjcmlwdGluZ0ludmFsaWRFU2V0KSByZXN1bHQuYXBwZW5kKHNjcmlwdGluZ0ludmFsaWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc1hNTDogIik7Ci0JCWlmIChpc1hNTEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNYTUwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbmNsdWRlUHJlbHVkZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluY2x1ZGVQcmVsdWRlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW5jbHVkZUNvZGFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbmNsdWRlQ29kYXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9KU1BQcm9wZXJ0eUdyb3VwSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSnNwRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZTVjNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSnNwRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKc3BGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKc3BGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlKc3BGYWN0b3J5IHRoZUpzcEZhY3RvcnkgPSAoSnNwRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgianNwLnhtaSIpOyAKLQkJCWlmICh0aGVKc3BGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlSnNwRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBKc3BGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpzcEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJRzogcmV0dXJuIGNyZWF0ZUpTUENvbmZpZygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUDogcmV0dXJuIGNyZWF0ZUpTUFByb3BlcnR5R3JvdXAoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFOiByZXR1cm4gY3JlYXRlVGFnTGliUmVmVHlwZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpTUENvbmZpZyBjcmVhdGVKU1BDb25maWcoKSB7Ci0JCUpTUENvbmZpZ0ltcGwganNwQ29uZmlnID0gbmV3IEpTUENvbmZpZ0ltcGwoKTsKLQkJcmV0dXJuIGpzcENvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSlNQUHJvcGVydHlHcm91cCBjcmVhdGVKU1BQcm9wZXJ0eUdyb3VwKCkgewotCQlKU1BQcm9wZXJ0eUdyb3VwSW1wbCBqc3BQcm9wZXJ0eUdyb3VwID0gbmV3IEpTUFByb3BlcnR5R3JvdXBJbXBsKCk7Ci0JCXJldHVybiBqc3BQcm9wZXJ0eUdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYWdMaWJSZWZUeXBlIGNyZWF0ZVRhZ0xpYlJlZlR5cGUoKSB7Ci0JCVRhZ0xpYlJlZlR5cGVJbXBsIHRhZ0xpYlJlZlR5cGUgPSBuZXcgVGFnTGliUmVmVHlwZUltcGwoKTsKLQkJcmV0dXJuIHRhZ0xpYlJlZlR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpzcFBhY2thZ2UgZ2V0SnNwUGFja2FnZSgpIHsKLQkJcmV0dXJuIChKc3BQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpzcFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEpzcFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL0pzcEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSnNwUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1YWRmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpzcFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSnNwUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MganNwQ29uZmlnRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFnTGliUmVmVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSnNwUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIEpzcEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnNwUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSnNwUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEpzcFBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVKc3BQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVKc3BQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SlNQQ29uZmlnKCkgewotCQlyZXR1cm4ganNwQ29uZmlnRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpTUENvbmZpZ19UYWdMaWJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SlNQQ29uZmlnX1Byb3BlcnR5R3JvdXBzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKU1BQcm9wZXJ0eUdyb3VwKCkgewotCQlyZXR1cm4ganNwUHJvcGVydHlHcm91cEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX1VybFBhdHRlcm4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9FbElnbm9yZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9QYWdlRW5jb2RpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9TY3JpcHRpbmdJbnZhbGlkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfSXNYTUwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlUHJlbHVkZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYWdMaWJSZWZUeXBlKCkgewotCQlyZXR1cm4gdGFnTGliUmVmVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYlVSSSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhZ0xpYlJlZlR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYkxvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnTGliUmVmVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BGYWN0b3J5IGdldEpzcEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSnNwRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlqc3BDb25maWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSlNQX0NPTkZJRyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwQ29uZmlnRUNsYXNzLCBKU1BfQ09ORklHX19UQUdfTElCUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwQ29uZmlnRUNsYXNzLCBKU1BfQ09ORklHX19QUk9QRVJUWV9HUk9VUFMpOwotCi0JCWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSlNQX1BST1BFUlRZX0dST1VQKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTKTsKLQotCQl0YWdMaWJSZWZUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBR19MSUJfUkVGX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0xpYlJlZlR5cGVFQ2xhc3MsIFRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0xpYlJlZlR5cGVFQ2xhc3MsIFRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9MT0NBVElPTik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlqc3BDb25maWdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQl0YWdMaWJSZWZUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhqc3BDb25maWdFQ2xhc3MsIEpTUENvbmZpZy5jbGFzcywgIkpTUENvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQQ29uZmlnX1RhZ0xpYnMoKSwgdGhpcy5nZXRUYWdMaWJSZWZUeXBlKCksIG51bGwsICJ0YWdMaWJzIiwgbnVsbCwgMCwgLTEsIEpTUENvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQQ29uZmlnX1Byb3BlcnR5R3JvdXBzKCksIHRoaXMuZ2V0SlNQUHJvcGVydHlHcm91cCgpLCBudWxsLCAicHJvcGVydHlHcm91cHMiLCBudWxsLCAwLCAtMSwgSlNQQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQUHJvcGVydHlHcm91cC5jbGFzcywgIkpTUFByb3BlcnR5R3JvdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJsUGF0dGVybiIsIG51bGwsIDAsIC0xLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImVsSWdub3JlZCIsICJ0cnVlIiwgMCwgMSwgSlNQUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFnZUVuY29kaW5nIiwgbnVsbCwgMCwgMSwgSlNQUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQUHJvcGVydHlHcm91cF9TY3JpcHRpbmdJbnZhbGlkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAic2NyaXB0aW5nSW52YWxpZCIsICJ0cnVlIiwgMCwgMSwgSlNQUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX0lzWE1MKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNYTUwiLCAiZmFsc2UiLCAwLCAxLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfSW5jbHVkZVByZWx1ZGVzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpbmNsdWRlUHJlbHVkZXMiLCBudWxsLCAwLCAtMSwgSlNQUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImluY2x1ZGVDb2RhcyIsIG51bGwsIDAsIC0xLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3ModGFnTGliUmVmVHlwZUVDbGFzcywgVGFnTGliUmVmVHlwZS5jbGFzcywgIlRhZ0xpYlJlZlR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYlJlZlR5cGVfVGFnbGliVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YWdsaWJVUkkiLCBudWxsLCAwLCAxLCBUYWdMaWJSZWZUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYkxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YWdsaWJMb2NhdGlvbiIsIG51bGwsIDAsIDEsIFRhZ0xpYlJlZlR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvL0pzcFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvVGFnTGliUmVmVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhMjQ0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWcgTGliIFJlZiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5UYWdMaWJSZWZUeXBlSW1wbCNnZXRUYWdsaWJVUkkgPGVtPlRhZ2xpYiBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYlJlZlR5cGVJbXBsI2dldFRhZ2xpYkxvY2F0aW9uIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdMaWJSZWZUeXBlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFRhZ0xpYlJlZlR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdsaWJVUkkoKSA8ZW0+VGFnbGliIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnbGliVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdMSUJfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ2xpYlVSSSgpIDxlbT5UYWdsaWIgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdsaWJVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFnbGliVVJJID0gVEFHTElCX1VSSV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdsaWJMb2NhdGlvbigpIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhZ2xpYkxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnbGliTG9jYXRpb24oKSA8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdsaWJMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YWdsaWJMb2NhdGlvbiA9IFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYWdMaWJSZWZUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpzcFBhY2thZ2UuTGl0ZXJhbHMuVEFHX0xJQl9SRUZfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhZ2xpYlVSSSgpIHsKLQkJcmV0dXJuIHRhZ2xpYlVSSTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdsaWJVUkkoU3RyaW5nIG5ld1RhZ2xpYlVSSSkgewotCQlTdHJpbmcgb2xkVGFnbGliVVJJID0gdGFnbGliVVJJOwotCQl0YWdsaWJVUkkgPSBuZXdUYWdsaWJVUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX1VSSSwgb2xkVGFnbGliVVJJLCB0YWdsaWJVUkkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhZ2xpYkxvY2F0aW9uKCkgewotCQlyZXR1cm4gdGFnbGliTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFnbGliTG9jYXRpb24oU3RyaW5nIG5ld1RhZ2xpYkxvY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRUYWdsaWJMb2NhdGlvbiA9IHRhZ2xpYkxvY2F0aW9uOwotCQl0YWdsaWJMb2NhdGlvbiA9IG5ld1RhZ2xpYkxvY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9MT0NBVElPTiwgb2xkVGFnbGliTG9jYXRpb24sIHRhZ2xpYkxvY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9VUkk6Ci0JCQkJcmV0dXJuIGdldFRhZ2xpYlVSSSgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9MT0NBVElPTjoKLQkJCQlyZXR1cm4gZ2V0VGFnbGliTG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9VUkk6Ci0JCQkJc2V0VGFnbGliVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJc2V0VGFnbGliTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfVVJJOgotCQkJCXNldFRhZ2xpYlVSSShUQUdMSUJfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX0xPQ0FUSU9OOgotCQkJCXNldFRhZ2xpYkxvY2F0aW9uKFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX1VSSToKLQkJCQlyZXR1cm4gVEFHTElCX1VSSV9FREVGQVVMVCA9PSBudWxsID8gdGFnbGliVVJJICE9IG51bGwgOiAhVEFHTElCX1VSSV9FREVGQVVMVC5lcXVhbHModGFnbGliVVJJKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJcmV0dXJuIFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gdGFnbGliTG9jYXRpb24gIT0gbnVsbCA6ICFUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKHRhZ2xpYkxvY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRhZ2xpYlVSSTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFnbGliVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YWdsaWJMb2NhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFnbGliTG9jYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UYWdMaWJSZWZUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL3V0aWwvSnNwQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODM3OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL3V0aWwvSnNwQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKc3BQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSnNwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSnNwU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEpzcFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpTUENvbmZpZyhKU1BDb25maWcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpTUENvbmZpZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpTUFByb3BlcnR5R3JvdXAoSlNQUHJvcGVydHlHcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSlNQUHJvcGVydHlHcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0xpYlJlZlR5cGUoVGFnTGliUmVmVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFnTGliUmVmVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnIDxlbT5KU1AgQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQQ29uZmlnQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCA8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpTUFByb3BlcnR5R3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlIDxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZlR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSnNwQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL3V0aWwvSnNwU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNmUyMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL3V0aWwvSnNwU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpzcFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKc3BQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEpzcFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJRzogewotCQkJCUpTUENvbmZpZyBqc3BDb25maWcgPSAoSlNQQ29uZmlnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BDb25maWcoanNwQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChqc3BDb25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVA6IHsKLQkJCQlKU1BQcm9wZXJ0eUdyb3VwIGpzcFByb3BlcnR5R3JvdXAgPSAoSlNQUHJvcGVydHlHcm91cCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSlNQUHJvcGVydHlHcm91cChqc3BQcm9wZXJ0eUdyb3VwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChqc3BQcm9wZXJ0eUdyb3VwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGpzcFByb3BlcnR5R3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGpzcFByb3BlcnR5R3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFOiB7Ci0JCQkJVGFnTGliUmVmVHlwZSB0YWdMaWJSZWZUeXBlID0gKFRhZ0xpYlJlZlR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhZ0xpYlJlZlR5cGUodGFnTGliUmVmVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QodGFnTGliUmVmVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpTUCBDb25maWc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SlNQIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSlNQQ29uZmlnKEpTUENvbmZpZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpTUCBQcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KU1AgUHJvcGVydHkgR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUpTUFByb3BlcnR5R3JvdXAoSlNQUHJvcGVydHlHcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBMaWIgUmVmIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFnIExpYiBSZWYgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFnTGliUmVmVHlwZShUYWdMaWJSZWZUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSnNwU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZmFhODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPkVKQiBBcnRpZmFjdCBFZGl0IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIEpTUCBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSBhcnRpZmFjdHMgb2YgYSBKU1AgYW5kIFRhZ0xpYiByZWYKLSAgICAgICAgY2FuIGJlIGNyZWF0ZWQgYW5kIGFjY2Vzc2VkLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0JvZHlDb250ZW50VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0JvZHlDb250ZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjFhNGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9Cb2R5Q29udGVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBCb2R5Q29udGVudFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHREVQRU5ERU5UID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKU1AgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVNUFRZID0gMjsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TY3JpcHRsZXNzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0NSSVBUTEVTU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9InNjcmlwdGxlc3MiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NSSVBUTEVTUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5UYWdkZXBlbmRlbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5UYWdkZXBlbmRlbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVEFHREVQRU5ERU5UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCb2R5Q29udGVudFR5cGUgVEFHREVQRU5ERU5UX0xJVEVSQUwgPSBuZXcgQm9keUNvbnRlbnRUeXBlKFRBR0RFUEVOREVOVCwgInRhZ2RlcGVuZGVudCIsICJ0YWdkZXBlbmRlbnQiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KU1A8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KU1A8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSlNQCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCb2R5Q29udGVudFR5cGUgSlNQX0xJVEVSQUwgPSBuZXcgQm9keUNvbnRlbnRUeXBlKEpTUCwgIkpTUCIsICJKU1AiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FbXB0eTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVtcHR5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VNUFRZCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCb2R5Q29udGVudFR5cGUgRU1QVFlfTElURVJBTCA9IG5ldyBCb2R5Q29udGVudFR5cGUoRU1QVFksICJlbXB0eSIsICJlbXB0eSIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNjcmlwdGxlc3M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TY3JpcHRsZXNzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NDUklQVExFU1MKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZSBTQ1JJUFRMRVNTX0xJVEVSQUwgPSBuZXcgQm9keUNvbnRlbnRUeXBlKFNDUklQVExFU1MsICJzY3JpcHRsZXNzIiwgInNjcmlwdGxlc3MiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Qm9keSBDb250ZW50IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBCb2R5Q29udGVudFR5cGVbXSB7Ci0JCQlUQUdERVBFTkRFTlRfTElURVJBTCwKLQkJCUpTUF9MSVRFUkFMLAotCQkJRU1QVFlfTElURVJBTCwKLQkJCVNDUklQVExFU1NfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Cb2R5IENvbnRlbnQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Qm9keSBDb250ZW50IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9keUNvbnRlbnRUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJQm9keUNvbnRlbnRUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Qm9keSBDb250ZW50IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCb2R5Q29udGVudFR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlCb2R5Q29udGVudFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJvZHkgQ29udGVudCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9keUNvbnRlbnRUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBUQUdERVBFTkRFTlQ6IHJldHVybiBUQUdERVBFTkRFTlRfTElURVJBTDsKLQkJCWNhc2UgSlNQOiByZXR1cm4gSlNQX0xJVEVSQUw7Ci0JCQljYXNlIEVNUFRZOiByZXR1cm4gRU1QVFlfTElURVJBTDsKLQkJCWNhc2UgU0NSSVBUTEVTUzogcmV0dXJuIFNDUklQVExFU1NfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQm9keUNvbnRlbnRUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9Cb2R5Q29udGVudFR5cGUKLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9FeHRlbnNpYmxlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0V4dGVuc2libGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YjYyYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0V4dGVuc2libGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuc2libGUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRFeHRlbnNpYmxlVHlwZSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJsZVR5cGUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRFeHRlbnNpYmxlVHlwZV9WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEV4dGVuc2libGVUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvRnVuY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9GdW5jdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIwMTQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9GdW5jdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RnVuY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgZnVuY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gZWFjaAotICogZnVuY3Rpb24gaW4gdGhlIHRhZyBsaWJyYXJ5IHRoYXQgaXMgdG8gYmUgZXhwb3NlZCB0byB0aGUgRUwuCi0gKiAKLSAqIFRoZSBmdW5jdGlvbiBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6Ci0gKiAKLSAqIGRlc2NyaXB0aW9uICAgICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0gKiAKLSAqIGRpc3BsYXktbmFtZSAgICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLSAqICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkIGJ5IHRvb2xzCi0gKiAKLSAqIGljb24gICAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKLSAqICAgICAgICAgICAgICAgICAgICAgYnkgdG9vbHMKLSAqIAotICogbmFtZSAgICAgICAgICAgICAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uCi0gKiAKLSAqIGZ1bmN0aW9uLWNsYXNzICAgICAgUHJvdmlkZXMgdGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotICogICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbgotICogCi0gKiBmdW5jdGlvbi1zaWduYXR1cmUgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhCi0gKiAgICAgICAgICAgICAgICAgICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIG9mIHRoZSBKYXZhCi0gKiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbi4KLSAqIAotICogZXhhbXBsZSAgICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgotICogICAgICAgICAgICAgICAgICAgICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgZnVuY3Rpb24KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldFNpZ25hdHVyZSA8ZW0+U2lnbmF0dXJlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldEZ1bmN0aW9uQ2xhc3MgPGVtPkZ1bmN0aW9uIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RnVuY3Rpb25FeHRlbnNpb25zIDxlbT5GdW5jdGlvbiBFeHRlbnNpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRGdW5jdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGdW5jdGlvbiBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXAgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRGdW5jdGlvbl9OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaWduYXR1cmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpZ25hdHVyZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBhcyBpbiB0aGUgSmF2YSBMYW5ndWFnZQotCSAqICAgICAgICAgU3BlY2lmaWNhdGlvbiwgb2YgdGhlIHN0YXRpYyBKYXZhIG1ldGhvZCB0aGF0IGlzCi0JICogICAgICAgICB0byBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb24uCi0JICogCi0JICogICAgICAgICBFeGFtcGxlOgotCSAqIAotCSAqICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWNrTmFtZSggamF2YS5sYW5nLlN0cmluZywgaW50ICkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2lnbmF0dXJlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTaWduYXR1cmUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0RnVuY3Rpb25fU2lnbmF0dXJlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNpZ25hdHVyZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldFNpZ25hdHVyZSA8ZW0+U2lnbmF0dXJlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaWduYXR1cmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2lnbmF0dXJlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KLQkgKiAgICAgICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGFtcGxlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldEZ1bmN0aW9uX0V4YW1wbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXhhbXBsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4YW1wbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4YW1wbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZ1bmN0aW9uIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GdW5jdGlvbiBDbGFzczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmEKLQkgKiAgICAgICAgIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBtZXRob2QgdGhhdCBpbXBsZW1lbnRzCi0JICogICAgICAgICB0aGUgZnVuY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZ1bmN0aW9uIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRGdW5jdGlvbkNsYXNzKEphdmFDbGFzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldEZ1bmN0aW9uX0Z1bmN0aW9uQ2xhc3MoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YUNsYXNzIGdldEZ1bmN0aW9uQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXRGdW5jdGlvbkNsYXNzIDxlbT5GdW5jdGlvbiBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnVuY3Rpb24gQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEZ1bmN0aW9uQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZ1bmN0aW9uQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZ1bmN0aW9uIEV4dGVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZ1bmN0aW9uIEV4dGVuc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GdW5jdGlvbiBFeHRlbnNpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0RnVuY3Rpb25fRnVuY3Rpb25FeHRlbnNpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEZ1bmN0aW9uRXh0ZW5zaW9ucygpOwotCi19IC8vIEZ1bmN0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIwZWI3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVTVEVEID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVF9CRUdJTiA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRfRU5EID0gMjsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ORVNURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ORVNURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTkVTVEVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIE5FU1RFRF9MSVRFUkFMID0gbmV3IEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoTkVTVEVELCAiTkVTVEVEIiwgIk5FU1RFRCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFUIEJFR0lOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QVQgQkVHSU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVRfQkVHSU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgQVRfQkVHSU5fTElURVJBTCA9IG5ldyBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlKEFUX0JFR0lOLCAiQVRfQkVHSU4iLCAiQVRfQkVHSU4iKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BVCBFTkQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BVCBFTkQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVRfRU5ECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIEFUX0VORF9MSVRFUkFMID0gbmV3IEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoQVRfRU5ELCAiQVRfRU5EIiwgIkFUX0VORCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5KU1AgU2NyaXB0aW5nIFZhcmlhYmxlIFNjb3BlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVbXSB7Ci0JCQlORVNURURfTElURVJBTCwKLQkJCUFUX0JFR0lOX0xJVEVSQUwsCi0JCQlBVF9FTkRfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5KU1AgU2NyaXB0aW5nIFZhcmlhYmxlIFNjb3BlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KU1AgU2NyaXB0aW5nIFZhcmlhYmxlIFNjb3BlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SlNQIFNjcmlwdGluZyBWYXJpYWJsZSBTY29wZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KU1AgU2NyaXB0aW5nIFZhcmlhYmxlIFNjb3BlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTkVTVEVEOiByZXR1cm4gTkVTVEVEX0xJVEVSQUw7Ci0JCQljYXNlIEFUX0JFR0lOOiByZXR1cm4gQVRfQkVHSU5fTElURVJBTDsKLQkJCWNhc2UgQVRfRU5EOiByZXR1cm4gQVRfRU5EX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUKLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BUYWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhNzZiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLQotCi0vKioKLSAqIFRoZSB0YWcgZWxlbWVudCBkZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5LiBUaGUgdGFnIGVsZW1lbnQgaGFzIG9uZSBhdHRyaWJ1dGUsIGlkLgotICogVGhlIHRhZyBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6Ci0gKiBuYW1lIC0tIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUKLSAqIHRhZy1jbGFzcyAtLSBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcKLSAqIHRlaS1jbGFzcyAtLSBBbiBvcHRpb25hbCBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0gKiBib2R5LWNvbnRlbnQgLS0gVGhlIGJvZHkgY29udGVudCB0eXBlCi0gKiBkaXNwbGF5LW5hbWUgLS0gQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzCi0gKiBzbWFsbC1pY29uIC0tIE9wdGlvbmFsIHNtYWxsLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotICogbGFyZ2UtaWNvbiAtLSBPcHRpb25hbCBsYXJnZS1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLSAqIGRlc2NyaXB0aW9uIC0tIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotICogdmFyaWFibGUgLS0gT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uCi0gKiBhdHRyaWJ1dGUgLS0gQWxsIGF0dHJpYnV0ZXMgb2YgdGhpcyBhY3Rpb24KLSAqIGV4YW1wbGUgLS0gT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIGFjdGlvbi4KLQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUFRhZyBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXAgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBCb2R5Q29udGVudCBhdHRyaWJ1dGUKLQkgKiBQcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuIFByaW1hcmlseSBpbnRlbmRlZAotCSAqIGZvciB1c2UgYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scy5UaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6Ci0JICogCi0JICogdGFnZGVwZW5kZW50IC0gVGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBpbnRlcnByZXRlZCBieSB0aGUgdGFnIGltcGxlbWVudGF0aW9uCi0JICogaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYQkJZGlmZmVyZW50ICJsYW5nYWdlIiwgZS5nIGVtYmVkZGVkIFNRTAotCSAqIHN0YXRlbWVudHMuCi0JICogCi0JICogSlNQIC0gVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheAotCSAqIAotCSAqIGVtcHR5IC0gVGhlIGJvZHkgbXVzdCBiZSBlbXB0eVRoZSBkZWZhdWx0IChpZiBub3QgZGVmaW5lZCkgaXMgSlNQI1BDREFUQSA6Oj0gCi0JICogdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkKLQkgKi8KLQlCb2R5Q29udGVudFR5cGUgZ2V0Qm9keUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0Qm9keUNvbnRlbnQgPGVtPkJvZHkgQ29udGVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Qm9keSBDb250ZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5Cb2R5Q29udGVudFR5cGUKLQkgKiBAc2VlICNpc1NldEJvZHlDb250ZW50KCkKLQkgKiBAc2VlICN1bnNldEJvZHlDb250ZW50KCkKLQkgKiBAc2VlICNnZXRCb2R5Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Qm9keUNvbnRlbnQoQm9keUNvbnRlbnRUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNnZXRCb2R5Q29udGVudCA8ZW0+Qm9keSBDb250ZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJvZHlDb250ZW50KCkKLQkgKiBAc2VlICNnZXRCb2R5Q29udGVudCgpCi0JICogQHNlZSAjc2V0Qm9keUNvbnRlbnQoQm9keUNvbnRlbnRUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Qm9keUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNnZXRCb2R5Q29udGVudCA8ZW0+Qm9keSBDb250ZW50PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Cb2R5IENvbnRlbnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJvZHlDb250ZW50KCkKLQkgKiBAc2VlICNnZXRCb2R5Q29udGVudCgpCi0JICogQHNlZSAjc2V0Qm9keUNvbnRlbnQoQm9keUNvbnRlbnRUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Qm9keUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBFeGFtcGxlIGF0dHJpYnV0ZQotCSAqIFRoZSBleGFtcGxlIGVsZW1lbnQgcHJvdmlkZXMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlCi0JICogb2YgYSB0YWcuCi0JICovCi0JU3RyaW5nIGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBFeGFtcGxlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RXhhbXBsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldEpTUFRhZ19OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHluYW1pYyBBdHRyaWJ1dGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EeW5hbWljIEF0dHJpYnV0ZXM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHluYW1pYyBBdHRyaWJ1dGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREeW5hbWljQXR0cmlidXRlcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0SlNQVGFnX0R5bmFtaWNBdHRyaWJ1dGVzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0R5bmFtaWNBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2lzRHluYW1pY0F0dHJpYnV0ZXMgPGVtPkR5bmFtaWMgQXR0cmlidXRlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHluYW1pYyBBdHRyaWJ1dGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0R5bmFtaWNBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREeW5hbWljQXR0cmlidXRlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgQXR0cmlidXRlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0QXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBWYXJpYWJsZXMgcmVmZXJlbmNlcwotCSAqIFRoZSB2YXJpYWJsZSBlbGVtZW50IHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzIGRlZmluZWQgYnkgCi0JICogdGhpcyB0YWcuCi0JICogSXQgaXMgYSAodHJhbnNsYXRpb24gdGltZSkgZXJyb3IgZm9yIGFuIGFjdGlvbiB0aGF0IGhhcyBvbmUgb3IgbW9yZSB2YXJpYWJsZQotCSAqIHN1YmVsZW1lbnRzIHRvIGhhdmUgYSBUYWdFeHRyYUluZm8gY2xhc3MgdGhhdCByZXR1cm5zIGEgbm9uLW51bGwgb2JqZWN0LgotCSAqIFRoZSBzdWJlbGVtZW50cyBvZiB2YXJpYWJsZSBhcmUgb2YgdGhlIGZvcm06Ci0JICogbmFtZS1naXZlbiAtLSBUaGUgdmFyaWFibGUgbmFtZSBhcyBhIGNvbnN0YW50Ci0JICogbmFtZS1mcm9tLWF0dHJpYnV0ZSAtLSBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UgKHRyYW5zbGF0aW9uIHRpbWUpIHZhbHVlCi0JICogd2lsbCBnaXZlIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gT25lIG9mIG5hbWUtZ2l2ZW4gb3IgbmFtZWZyb20tYXR0cmlidXRlIGlzCi0JICogcmVxdWlyZWQuCi0JICogdmFyaWFibGUtY2xhc3MgLS0gTmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLiBqYXZhLmxhbmcuU3RyaW5nIGlzCi0JICogZGVmYXVsdC4KLQkgKiBkZWNsYXJlIC0tIFdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIGRlY2xhcmVkIG9yIG5vdC4gVHJ1ZSBpcyB0aGUgZGVmYXVsdC4KLQkgKiBzY29wZSAtLSBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBkZWZpbmVkLiBORVNURUQgaXMgZGVmYXVsdC4KLQotCSAqLwotCUVMaXN0IGdldFZhcmlhYmxlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgVGFnQ2xhc3MgcmVmZXJlbmNlCi0JICogVGhlIHRhZy1jbGFzcyBlbGVtZW50IGluZGljYXRlcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LlRhZwotCSAqIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IgdGhpcyB0YWcuIFRoaXMgZWxlbWVudCBpcwotCSAqIHJlcXVpcmVkLgotCSAqIEByZWdleHAgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQotCi0JICovCi0JSmF2YUNsYXNzIGdldFRhZ0NsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBUYWdDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFRhZ0NsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBUZWlDbGFzcyByZWZlcmVuY2UKLQkgKiBUaGUgdGVpLWNsYXNzIGVsZW1lbnQgaW5kaWNhdGVzIHRoZSBzdWJjbGFzcyBvZgotCSAqIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8gZm9yIHRoaXMgdGFnLiBUaGUgY2xhc3MgaXMgaW5zdGFudGlhdGVkCi0JICogYXQgdHJhbnNsYXRpb24gdGltZS4gVGhpcyBlbGVtZW50IGlzIG9wdGlvbmFsLgotCSAqIEByZWdleHAgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQotCSAqLwotCUphdmFDbGFzcyBnZXRUZWlDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVGVpQ2xhc3MgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRUZWlDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFRhZ0F0dHJpYnV0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFRhZ0F0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQ1ZWM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BUYWdBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiBUaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQVGFnQXR0cmlidXRlIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqIERlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZyBkZWZpbmVkIChyZXF1aXJlZCkuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFJlcXVpcmVkIGF0dHJpYnV0ZQotCSAqIERlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsLgotCSAqLwotCWJvb2xlYW4gaXNSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJlcXVpcmVkIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVxdWlyZWQoKQotCSAqIEBzZWUgI2lzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3NldFJlcXVpcmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlI2lzUmVxdWlyZWQgPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVxdWlyZWQoKQotCSAqIEBzZWUgI2lzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3NldFJlcXVpcmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFJ0RXhwclZhbHVlIGF0dHJpYnV0ZQotCSAqIERlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGNhbiBoYXZlIHNjcmlwdGxldCBleHByZXNzaW9ucyBhc2EgdmFsdWUsIGkuZQotCSAqIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkYXQgcmVxdWVzdCB0aW1lLCBhcwotCSAqIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbnRpbWUuIChvcHRpb25hbCkKLQkgKiBEZWZhdWx0ID0gZmFsc2UKLQkgKi8KLQlib29sZWFuIGlzUnRFeHByVmFsdWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSdEV4cHJWYWx1ZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFJ0RXhwclZhbHVlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlI2lzUnRFeHByVmFsdWUgPGVtPlJ0IEV4cHIgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UnRFeHByVmFsdWUoKQotCSAqIEBzZWUgI2lzUnRFeHByVmFsdWUoKQotCSAqIEBzZWUgI3NldFJ0RXhwclZhbHVlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSdEV4cHJWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlI2lzUnRFeHByVmFsdWUgPGVtPlJ0IEV4cHIgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJ0IEV4cHIgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJ0RXhwclZhbHVlKCkKLQkgKiBAc2VlICNpc1J0RXhwclZhbHVlKCkKLQkgKiBAc2VlICNzZXRSdEV4cHJWYWx1ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UnRFeHByVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZyYWdtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GcmFnbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZyYWdtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGcmFnbWVudChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0SlNQVGFnQXR0cmlidXRlX0ZyYWdtZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0ZyYWdtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlI2lzRnJhZ21lbnQgPGVtPkZyYWdtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GcmFnbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNGcmFnbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnJhZ21lbnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBUeXBlIHJlZmVyZW5jZQotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBlbGVtZW50IGRlc2NyaWJlcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlLgotCSAqIEZvciBzdGF0aWMgdmFsdWVzICh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpIHRoZSB0eXBlIGlzIGFsd2F5cwotCSAqIGphdmEubGFuZy5TdHJpbmcuCi0JICovCi0JSmF2YUNsYXNzIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFR5cGUgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRUeXBlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRKU1BUYWdBdHRyaWJ1dGVfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQVmFyaWFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BWYXJpYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzRhNGRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKU1BWYXJpYWJsZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZUdpdmVuIGF0dHJpYnV0ZQotCSAqIFRoZSBuYW1lLWdpdmVuIGVsZW1lbnQgcHJvdmlkZXMgdGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuCi0JICogCi0JICogT25lIG9mIG5hbWUtZ2l2ZW4gb3IgbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZUdpdmVuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZUdpdmVuIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZUdpdmVuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZUZyb21BdHRyaWJ1dGUgYXR0cmlidXRlCi0JICogVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbi10aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YKLQkgKiB0aGUgdmFyaWFibGUuCi0JICovCi0JU3RyaW5nIGdldE5hbWVGcm9tQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZUZyb21BdHRyaWJ1dGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lRnJvbUF0dHJpYnV0ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlY2xhcmUgYXR0cmlidXRlCi0JICogVGhlIHZhbHVlIG9mIHRoZSBkZWNsYXJlIGVsZW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBpcyB0byAKLQkgKiBiZSBkZWZpbmVkIG9yIG5vdC4gU2VlIFRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4KLQkgKiBUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kIGlzIHRoZSBkZWZhdWx0IGlzIHRydWUuCi0KLQkgKi8KLQlib29sZWFuIGlzRGVjbGFyZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlY2xhcmUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZWNsYXJlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNjb3BlIGF0dHJpYnV0ZQotCSAqLwotCUpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlCi0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjb3BlKEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgVmFyaWFibGVDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0VmFyaWFibGVDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVmFyaWFibGVDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmxlQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRKU1BWYXJpYWJsZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjQ0NGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhZyBGaWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogRGVmaW5lcyBhbiBhY3Rpb24gaW4gdGhpcyB0YWcgbGlicmFyeSB0aGF0IGlzIGltcGxlbWVudGVkCi0gKiBhcyBhIC50YWcgZmlsZS4KLSAqIAotICogVGhlIHRhZy1maWxlIGVsZW1lbnQgaGFzIHR3byByZXF1aXJlZCBzdWJlbGVtZW50czoKLSAqIAotICogbmFtZSAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCi0gKiAKLSAqIHBhdGggICAgV2hlcmUgdG8gZmluZCB0aGUgLnRhZyBmaWxlIGltcGxlbWVudGluZyB0aGlzCi0gKiAgICAgICAgIGFjdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBvcgotICogCXRoZSByb290IG9mIHRoZSBKQVIgZmlsZSBmb3IgYSB0YWcgbGlicmFyeSBwYWNrYWdlZCBpbgotICogCWEgSkFSLiAgVGhpcyBtdXN0IGJlZ2luIHdpdGggL1dFQi1JTkYvdGFncyBpZiB0aGUgLnRhZwotICogCWZpbGUgcmVzaWRlcyBpbiB0aGUgV0FSLCBvciAvTUVUQS1JTkYvdGFncyBpZiB0aGUgLnRhZwotICogCWZpbGUgcmVzaWRlcyBpbiBhIEpBUi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXRQYXRoIDxlbT5QYXRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXRUYWdFeHRlbnNpb25zIDxlbT5UYWcgRXh0ZW5zaW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0VGFnRmlsZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYWdGaWxlIGV4dGVuZHMgRGVzY3JpcHRpb25Hcm91cCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldFRhZ0ZpbGVfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXRoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhdGgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0VGFnRmlsZV9QYXRoKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhdGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldFBhdGggPGVtPlBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhdGgoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXhhbXBsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRUYWdGaWxlX0V4YW1wbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXhhbXBsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhhbXBsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFnIEV4dGVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhZyBFeHRlbnNpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFnIEV4dGVuc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRUYWdGaWxlX1RhZ0V4dGVuc2lvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGFnRXh0ZW5zaW9ucygpOwotCi19IC8vIFRhZ0ZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdMaWIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdMaWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE1OTg3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnTGliLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLQotLyoqCi0gKiBUaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdC4KLQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ0xpYiBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIHsKLQkvKioKLQkgKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgdmVyc2lvbnMKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVGFnTGliVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKiBEZXNjcmliZXMgdGhpcyB2ZXJzaW9uIG51bWJlciBvZiB0aGUgdGFnIGxpYnJhcnkgKGRld2V5IGRlY2ltYWwpLgotCSAqIEByZWdleHAgWzAtOV0qeyAiLiJbMC05XSB9MC4uMwotCSAqLwotCVN0cmluZyBnZXRUYWdMaWJWZXJzaW9uKCk7Ci0KLQkvKioKLQkqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFRhZ0xpYlZlcnNpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRUYWdMaWJWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSnNwVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKiBEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnIGxpYnJhcnkgcmVxdWlyZXMgaW4gb3JkZXIgdG8KLQkgKiBmdW5jdGlvbiAoZGV3ZXkgZGVjaW1hbCkuICBEZWZhdWx0IGlzIDEuMgotCSAqIEByZWdleHAgWzAtOV0qeyAiLiJbMC05XSB9MC4uMwotCSAqLwotCVN0cmluZyBnZXRKc3BWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgSnNwVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEpzcFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBTaG9ydE5hbWUgYXR0cmlidXRlCi0JICogVGhlIHZhbHVlIG9mIHRoZSBzaG9ydC1uYW1lIGVsZW1lbnQgaXMgYSBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieSBhIEpTUAotCSAqIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUKLQkgKiB1c2VkIGFzIHRoZSBwcmVmZXJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMuIERvIG5vdCB1c2Ugd2hpdGUgc3BhY2UsIAotCSAqIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMgb3IgdW5kZXJzY29yZS4KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2hvcnROYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0U2hvcnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgdXJpIGVsZW1lbnQgaXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZXhhY3QgCi0JICogc2VtYW50aWNzIG9mIHRoaXMgdGFnbGlicmFyeS4KLQkgKi8KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VXJpKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFRhZ3MgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFRhZ3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFZhbGlkYXRvciByZWZlcmVuY2UKLQkgKiBUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIAotCSAqIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLQotCSAqLwotCVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFZhbGlkYXRvciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBMaXN0ZW5lcnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldExpc3RlbmVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnVuY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZ1bmN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnVuY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0VGFnTGliX0Z1bmN0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEZ1bmN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFnbGliIEV4dGVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhZ2xpYiBFeHRlbnNpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFnbGliIEV4dGVuc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRUYWdMaWJfVGFnbGliRXh0ZW5zaW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUYWdsaWJFeHRlbnNpb25zKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnbGliRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1RhZ2xpYkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmZDVlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnbGliRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ2xpYkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYWdsaWJGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYkZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFnIExpYjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFnIExpYjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFnTGliIGNyZWF0ZVRhZ0xpYigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KU1AgVGFnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KU1AgVGFnPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKU1BUYWcgY3JlYXRlSlNQVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpTUCBUYWcgQXR0cmlidXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KU1AgVGFnIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSlNQVGFnQXR0cmlidXRlIGNyZWF0ZUpTUFRhZ0F0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWxpZGF0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbGlkYXRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KU1AgVmFyaWFibGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpTUCBWYXJpYWJsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSlNQVmFyaWFibGUgY3JlYXRlSlNQVmFyaWFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RnVuY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZ1bmN0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGdW5jdGlvbiBjcmVhdGVGdW5jdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWcgRmlsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFnIEZpbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhZ0ZpbGUgY3JlYXRlVGFnRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UbGQgRXh0ZW5zaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UbGQgRXh0ZW5zaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUbGRFeHRlbnNpb24gY3JlYXRlVGxkRXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhZ2xpYlBhY2thZ2UgZ2V0VGFnbGliUGFja2FnZSgpOwotCi19IC8vVGFnbGliRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1RhZ2xpYlBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdsaWJQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhODNlODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1RhZ2xpYlBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYWdsaWJQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gInRhZ2xpYiI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gInRhZ2xpYi54bWkiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFnbGliUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ0xpYkltcGwgPGVtPlRhZyBMaWI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdMaWJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRUYWdMaWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFHX0xJQiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnIExpYiBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpzcCBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fSlNQX1ZFUlNJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX1NIT1JUX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fVVJJID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX1RBR1MgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fVkFMSURBVE9SID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fTElTVEVORVJTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bmN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fRlVOQ1RJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhZ2xpYiBFeHRlbnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19UQUdMSUJfRVhURU5TSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWcgTGliPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuSlNQVGFnSW1wbCA8ZW0+SlNQIFRhZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkpTUFRhZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldEpTUFRhZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKU1BfVEFHID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19fSUNPTlMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb2R5IENvbnRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX19CT0RZX0NPTlRFTlQgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX19FWEFNUExFID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19fTkFNRSA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHluYW1pYyBBdHRyaWJ1dGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19fRFlOQU1JQ19BVFRSSUJVVEVTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX19BVFRSSUJVVEVTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfX1ZBUklBQkxFUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19fVEFHX0NMQVNTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZWkgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX19URUlfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkpTUCBUYWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuSlNQVGFnQXR0cmlidXRlSW1wbCA8ZW0+SlNQIFRhZyBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5KU1BUYWdBdHRyaWJ1dGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRKU1BUYWdBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19BVFRSSUJVVEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX0FUVFJJQlVURV9fTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UnQgRXhwciBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfQVRUUklCVVRFX19SVF9FWFBSX1ZBTFVFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJhZ21lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX0FUVFJJQlVURV9fRlJBR01FTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19BVFRSSUJVVEVfX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfQVRUUklCVVRFX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KU1AgVGFnIEF0dHJpYnV0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlZhbGlkYXRvckltcGwgPGVtPlZhbGlkYXRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlZhbGlkYXRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldFZhbGlkYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxJREFUT1IgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkYXRvciBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTElEQVRPUl9fVkFMSURBVE9SX0NMQVNTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTElEQVRPUl9fSU5JVF9QQVJBTVMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTElEQVRPUl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VmFsaWRhdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTElEQVRPUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkpTUFZhcmlhYmxlSW1wbCA8ZW0+SlNQIFZhcmlhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuSlNQVmFyaWFibGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRKU1BWYXJpYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKU1BfVkFSSUFCTEUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWUgR2l2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVkFSSUFCTEVfX05BTUVfR0lWRU4gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lIEZyb20gQXR0cmlidXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX19OQU1FX0ZST01fQVRUUklCVVRFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVjbGFyZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9WQVJJQUJMRV9fREVDTEFSRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX19TQ09QRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmxlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX19WQVJJQUJMRV9DTEFTUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KU1AgVmFyaWFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsIDxlbT5GdW5jdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkZ1bmN0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0RnVuY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRlVOQ1RJT04gPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVU5DVElPTl9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVU5DVElPTl9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVU5DVElPTl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVU5DVElPTl9fTkFNRSA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2lnbmF0dXJlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVOQ1RJT05fX1NJR05BVFVSRSA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX19FWEFNUExFID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdW5jdGlvbiBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX19GVU5DVElPTl9DTEFTUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVuY3Rpb24gRXh0ZW5zaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVOQ1RJT05fX0ZVTkNUSU9OX0VYVEVOU0lPTlMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZ1bmN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdGaWxlSW1wbCA8ZW0+VGFnIEZpbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdGaWxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0VGFnRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQUdfRklMRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX19JQ09OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX19OQU1FID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0ZJTEVfX1BBVEggPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfRklMRV9fRVhBTVBMRSA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnIEV4dGVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX19UQUdfRVhURU5TSU9OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFnIEZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRsZEV4dGVuc2lvbkltcGwgPGVtPlRsZCBFeHRlbnNpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UbGRFeHRlbnNpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRUbGRFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVExEX0VYVEVOU0lPTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVExEX0VYVEVOU0lPTl9fTkFNRVNQQUNFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5zaW9uIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUTERfRVhURU5TSU9OX19FWFRFTlNJT05fRUxFTUVOVFMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UbGQgRXh0ZW5zaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRMRF9FWFRFTlNJT05fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmxlVHlwZUltcGwgPGVtPkV4dGVuc2libGUgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkV4dGVuc2libGVUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0RXh0ZW5zaWJsZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURU5TSUJMRV9UWVBFID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOU0lCTEVfVFlQRV9fVkFMVUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FeHRlbnNpYmxlIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5TSUJMRV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkJvZHlDb250ZW50VHlwZSA8ZW0+Qm9keSBDb250ZW50IFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5Cb2R5Q29udGVudFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldEJvZHlDb250ZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCT0RZX0NPTlRFTlRfVFlQRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIDxlbT5KU1AgU2NyaXB0aW5nIFZhcmlhYmxlIFNjb3BlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0SlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKU1BfU0NSSVBUSU5HX1ZBUklBQkxFX1NDT1BFID0gMTA7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIgPGVtPlRhZyBMaWI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFnIExpYjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhZ0xpYigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldFRhZ0xpYlZlcnNpb24gPGVtPlRhZyBMaWIgVmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhZyBMaWIgVmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0VGFnTGliVmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VGFnTGliKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdMaWJfVGFnTGliVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldEpzcFZlcnNpb24gPGVtPkpzcCBWZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SnNwIFZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldEpzcFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFRhZ0xpYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliX0pzcFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYiNnZXRTaG9ydE5hbWUgPGVtPlNob3J0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaG9ydCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYiNnZXRTaG9ydE5hbWUoKQotCSAqIEBzZWUgI2dldFRhZ0xpYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliX1Nob3J0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldFVyaSA8ZW0+VXJpPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXJpPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYiNnZXRVcmkoKQotCSAqIEBzZWUgI2dldFRhZ0xpYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliX1VyaSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0VGFncyA8ZW0+VGFnczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFnczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0VGFncygpCi0JICogQHNlZSAjZ2V0VGFnTGliKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYWdMaWJfVGFncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldFZhbGlkYXRvciA8ZW0+VmFsaWRhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VmFsaWRhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYiNnZXRWYWxpZGF0b3IoKQotCSAqIEBzZWUgI2dldFRhZ0xpYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFnTGliX1ZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0TGlzdGVuZXJzIDxlbT5MaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxpc3RlbmVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0TGlzdGVuZXJzKCkKLQkgKiBAc2VlICNnZXRUYWdMaWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhZ0xpYl9MaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldEZ1bmN0aW9ucyA8ZW0+RnVuY3Rpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5GdW5jdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldEZ1bmN0aW9ucygpCi0JICogQHNlZSAjZ2V0VGFnTGliKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYWdMaWJfRnVuY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYiNnZXRUYWdsaWJFeHRlbnNpb25zIDxlbT5UYWdsaWIgRXh0ZW5zaW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFnbGliIEV4dGVuc2lvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldFRhZ2xpYkV4dGVuc2lvbnMoKQotCSAqIEBzZWUgI2dldFRhZ0xpYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFnTGliX1RhZ2xpYkV4dGVuc2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcgPGVtPkpTUCBUYWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SlNQIFRhZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEpTUFRhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldEJvZHlDb250ZW50IDxlbT5Cb2R5IENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Cb2R5IENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldEJvZHlDb250ZW50KCkKLQkgKiBAc2VlICNnZXRKU1BUYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFRhZ19Cb2R5Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNnZXRFeGFtcGxlKCkKLQkgKiBAc2VlICNnZXRKU1BUYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFRhZ19FeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldEpTUFRhZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVGFnX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNpc0R5bmFtaWNBdHRyaWJ1dGVzIDxlbT5EeW5hbWljIEF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EeW5hbWljIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2lzRHluYW1pY0F0dHJpYnV0ZXMoKQotCSAqIEBzZWUgI2dldEpTUFRhZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVGFnX0R5bmFtaWNBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNnZXRBdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAc2VlICNnZXRKU1BUYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpTUFRhZ19BdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNnZXRWYXJpYWJsZXMgPGVtPlZhcmlhYmxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VmFyaWFibGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNnZXRWYXJpYWJsZXMoKQotCSAqIEBzZWUgI2dldEpTUFRhZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQVGFnX1ZhcmlhYmxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldFRhZ0NsYXNzIDxlbT5UYWcgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UYWcgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldFRhZ0NsYXNzKCkKLQkgKiBAc2VlICNnZXRKU1BUYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpTUFRhZ19UYWdDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldFRlaUNsYXNzIDxlbT5UZWkgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UZWkgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldFRlaUNsYXNzKCkKLQkgKiBAc2VlICNnZXRKU1BUYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpTUFRhZ19UZWlDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSA8ZW0+SlNQIFRhZyBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SlNQIFRhZyBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRKU1BUYWdBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0SlNQVGFnQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BUYWdBdHRyaWJ1dGVfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlI2lzUmVxdWlyZWQgPGVtPlJlcXVpcmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVxdWlyZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlI2lzUmVxdWlyZWQoKQotCSAqIEBzZWUgI2dldEpTUFRhZ0F0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVGFnQXR0cmlidXRlX1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNSdEV4cHJWYWx1ZSA8ZW0+UnQgRXhwciBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJ0IEV4cHIgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlI2lzUnRFeHByVmFsdWUoKQotCSAqIEBzZWUgI2dldEpTUFRhZ0F0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVGFnQXR0cmlidXRlX1J0RXhwclZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNGcmFnbWVudCA8ZW0+RnJhZ21lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GcmFnbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNGcmFnbWVudCgpCi0JICogQHNlZSAjZ2V0SlNQVGFnQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BUYWdBdHRyaWJ1dGVfRnJhZ21lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0SlNQVGFnQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKU1BUYWdBdHRyaWJ1dGVfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRKU1BUYWdBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpTUFRhZ0F0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3IgPGVtPlZhbGlkYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5WYWxpZGF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWxpZGF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlZhbGlkYXRvciNnZXRWYWxpZGF0b3JDbGFzcyA8ZW0+VmFsaWRhdG9yIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VmFsaWRhdG9yIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlZhbGlkYXRvciNnZXRWYWxpZGF0b3JDbGFzcygpCi0JICogQHNlZSAjZ2V0VmFsaWRhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRWYWxpZGF0b3JfVmFsaWRhdG9yQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Jbml0IFBhcmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3IjZ2V0SW5pdFBhcmFtcygpCi0JICogQHNlZSAjZ2V0VmFsaWRhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRWYWxpZGF0b3JfSW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3IjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3IjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRWYWxpZGF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZhbGlkYXRvcl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSA8ZW0+SlNQIFZhcmlhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkpTUCBWYXJpYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SlNQVmFyaWFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlI2dldE5hbWVHaXZlbiA8ZW0+TmFtZSBHaXZlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWUgR2l2ZW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGUjZ2V0TmFtZUdpdmVuKCkKLQkgKiBAc2VlICNnZXRKU1BWYXJpYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVmFyaWFibGVfTmFtZUdpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNnZXROYW1lRnJvbUF0dHJpYnV0ZSA8ZW0+TmFtZSBGcm9tIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWUgRnJvbSBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGUjZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldEpTUFZhcmlhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BWYXJpYWJsZV9OYW1lRnJvbUF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGUjaXNEZWNsYXJlIDxlbT5EZWNsYXJlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVjbGFyZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNpc0RlY2xhcmUoKQotCSAqIEBzZWUgI2dldEpTUFZhcmlhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BWYXJpYWJsZV9EZWNsYXJlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY29wZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNnZXRTY29wZSgpCi0JICogQHNlZSAjZ2V0SlNQVmFyaWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFZhcmlhYmxlX1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNnZXRWYXJpYWJsZUNsYXNzIDxlbT5WYXJpYWJsZSBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlZhcmlhYmxlIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlI2dldFZhcmlhYmxlQ2xhc3MoKQotCSAqIEBzZWUgI2dldEpTUFZhcmlhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKU1BWYXJpYWJsZV9WYXJpYWJsZUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRKU1BWYXJpYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQVmFyaWFibGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24gPGVtPkZ1bmN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZ1bmN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRGdW5jdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0RnVuY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZ1bmN0aW9uX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldFNpZ25hdHVyZSA8ZW0+U2lnbmF0dXJlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2lnbmF0dXJlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldFNpZ25hdHVyZSgpCi0JICogQHNlZSAjZ2V0RnVuY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZ1bmN0aW9uX1NpZ25hdHVyZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RXhhbXBsZSgpCi0JICogQHNlZSAjZ2V0RnVuY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZ1bmN0aW9uX0V4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldEZ1bmN0aW9uQ2xhc3MgPGVtPkZ1bmN0aW9uIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RnVuY3Rpb24gQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RnVuY3Rpb25DbGFzcygpCi0JICogQHNlZSAjZ2V0RnVuY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZ1bmN0aW9uX0Z1bmN0aW9uQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RnVuY3Rpb25FeHRlbnNpb25zIDxlbT5GdW5jdGlvbiBFeHRlbnNpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5GdW5jdGlvbiBFeHRlbnNpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldEZ1bmN0aW9uRXh0ZW5zaW9ucygpCi0JICogQHNlZSAjZ2V0RnVuY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZ1bmN0aW9uX0Z1bmN0aW9uRXh0ZW5zaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUgPGVtPlRhZyBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhZyBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhZ0ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRUYWdGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdGaWxlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0UGF0aCA8ZW0+UGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhdGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXRQYXRoKCkKLQkgKiBAc2VlICNnZXRUYWdGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdGaWxlX1BhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXRFeGFtcGxlKCkKLQkgKiBAc2VlICNnZXRUYWdGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdGaWxlX0V4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXRUYWdFeHRlbnNpb25zIDxlbT5UYWcgRXh0ZW5zaW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFnIEV4dGVuc2lvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXRUYWdFeHRlbnNpb25zKCkKLQkgKiBAc2VlICNnZXRUYWdGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYWdGaWxlX1RhZ0V4dGVuc2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24gPGVtPlRsZCBFeHRlbnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGxkIEV4dGVuc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRsZEV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uI2dldE5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZXNwYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbiNnZXROYW1lc3BhY2UoKQotCSAqIEBzZWUgI2dldFRsZEV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGxkRXh0ZW5zaW9uX05hbWVzcGFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24jZ2V0RXh0ZW5zaW9uRWxlbWVudHMgPGVtPkV4dGVuc2lvbiBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZW5zaW9uIEVsZW1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbiNnZXRFeHRlbnNpb25FbGVtZW50cygpCi0JICogQHNlZSAjZ2V0VGxkRXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUbGRFeHRlbnNpb25fRXh0ZW5zaW9uRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5FeHRlbnNpYmxlVHlwZSA8ZW0+RXh0ZW5zaWJsZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuc2libGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5FeHRlbnNpYmxlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXh0ZW5zaWJsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRFeHRlbnNpYmxlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5zaWJsZVR5cGVfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkJvZHlDb250ZW50VHlwZSA8ZW0+Qm9keSBDb250ZW50IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Cb2R5IENvbnRlbnQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5Cb2R5Q29udGVudFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0Qm9keUNvbnRlbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIDxlbT5KU1AgU2NyaXB0aW5nIFZhcmlhYmxlIFNjb3BlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+SlNQIFNjcmlwdGluZyBWYXJpYWJsZSBTY29wZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhZ2xpYkZhY3RvcnkgZ2V0VGFnbGliRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdMaWJJbXBsIDxlbT5UYWcgTGliPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnTGliSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldFRhZ0xpYigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQUdfTElCID0gZUlOU1RBTkNFLmdldFRhZ0xpYigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnIExpYiBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OID0gZUlOU1RBTkNFLmdldFRhZ0xpYl9UYWdMaWJWZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Kc3AgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBR19MSUJfX0pTUF9WRVJTSU9OID0gZUlOU1RBTkNFLmdldFRhZ0xpYl9Kc3BWZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFHX0xJQl9fU0hPUlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRUYWdMaWJfU2hvcnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfTElCX19VUkkgPSBlSU5TVEFOQ0UuZ2V0VGFnTGliX1VyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFHX0xJQl9fVEFHUyA9IGVJTlNUQU5DRS5nZXRUYWdMaWJfVGFncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFHX0xJQl9fVkFMSURBVE9SID0gZUlOU1RBTkNFLmdldFRhZ0xpYl9WYWxpZGF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFHX0xJQl9fTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFRhZ0xpYl9MaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZ1bmN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFHX0xJQl9fRlVOQ1RJT05TID0gZUlOU1RBTkNFLmdldFRhZ0xpYl9GdW5jdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhZ2xpYiBFeHRlbnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQUdfTElCX19UQUdMSUJfRVhURU5TSU9OUyA9IGVJTlNUQU5DRS5nZXRUYWdMaWJfVGFnbGliRXh0ZW5zaW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuSlNQVGFnSW1wbCA8ZW0+SlNQIFRhZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkpTUFRhZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRKU1BUYWcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSlNQX1RBRyA9IGVJTlNUQU5DRS5nZXRKU1BUYWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJvZHkgQ29udGVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9UQUdfX0JPRFlfQ09OVEVOVCA9IGVJTlNUQU5DRS5nZXRKU1BUYWdfQm9keUNvbnRlbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfVEFHX19FWEFNUExFID0gZUlOU1RBTkNFLmdldEpTUFRhZ19FeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1RBR19fTkFNRSA9IGVJTlNUQU5DRS5nZXRKU1BUYWdfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RHluYW1pYyBBdHRyaWJ1dGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1RBR19fRFlOQU1JQ19BVFRSSUJVVEVTID0gZUlOU1RBTkNFLmdldEpTUFRhZ19EeW5hbWljQXR0cmlidXRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSlNQX1RBR19fQVRUUklCVVRFUyA9IGVJTlNUQU5DRS5nZXRKU1BUYWdfQXR0cmlidXRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKU1BfVEFHX19WQVJJQUJMRVMgPSBlSU5TVEFOQ0UuZ2V0SlNQVGFnX1ZhcmlhYmxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSlNQX1RBR19fVEFHX0NMQVNTID0gZUlOU1RBTkNFLmdldEpTUFRhZ19UYWdDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVpIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSlNQX1RBR19fVEVJX0NMQVNTID0gZUlOU1RBTkNFLmdldEpTUFRhZ19UZWlDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuSlNQVGFnQXR0cmlidXRlSW1wbCA8ZW0+SlNQIFRhZyBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5KU1BUYWdBdHRyaWJ1dGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0SlNQVGFnQXR0cmlidXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpTUF9UQUdfQVRUUklCVVRFID0gZUlOU1RBTkNFLmdldEpTUFRhZ0F0dHJpYnV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9UQUdfQVRUUklCVVRFX19OQU1FID0gZUlOU1RBTkNFLmdldEpTUFRhZ0F0dHJpYnV0ZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9UQUdfQVRUUklCVVRFX19SRVFVSVJFRCA9IGVJTlNUQU5DRS5nZXRKU1BUYWdBdHRyaWJ1dGVfUmVxdWlyZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJ0IEV4cHIgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKU1BfVEFHX0FUVFJJQlVURV9fUlRfRVhQUl9WQUxVRSA9IGVJTlNUQU5DRS5nZXRKU1BUYWdBdHRyaWJ1dGVfUnRFeHByVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZyYWdtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1RBR19BVFRSSUJVVEVfX0ZSQUdNRU5UID0gZUlOU1RBTkNFLmdldEpTUFRhZ0F0dHJpYnV0ZV9GcmFnbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpTUF9UQUdfQVRUUklCVVRFX19UWVBFID0gZUlOU1RBTkNFLmdldEpTUFRhZ0F0dHJpYnV0ZV9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpTUF9UQUdfQVRUUklCVVRFX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0SlNQVGFnQXR0cmlidXRlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVmFsaWRhdG9ySW1wbCA8ZW0+VmFsaWRhdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVmFsaWRhdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldFZhbGlkYXRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBWQUxJREFUT1IgPSBlSU5TVEFOQ0UuZ2V0VmFsaWRhdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0b3IgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBWQUxJREFUT1JfX1ZBTElEQVRPUl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRWYWxpZGF0b3JfVmFsaWRhdG9yQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBWQUxJREFUT1JfX0lOSVRfUEFSQU1TID0gZUlOU1RBTkNFLmdldFZhbGlkYXRvcl9Jbml0UGFyYW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFZBTElEQVRPUl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldFZhbGlkYXRvcl9EZXNjcmlwdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkpTUFZhcmlhYmxlSW1wbCA8ZW0+SlNQIFZhcmlhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuSlNQVmFyaWFibGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0SlNQVmFyaWFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSlNQX1ZBUklBQkxFID0gZUlOU1RBTkNFLmdldEpTUFZhcmlhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lIEdpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOID0gZUlOU1RBTkNFLmdldEpTUFZhcmlhYmxlX05hbWVHaXZlbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZSBGcm9tIEF0dHJpYnV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9WQVJJQUJMRV9fTkFNRV9GUk9NX0FUVFJJQlVURSA9IGVJTlNUQU5DRS5nZXRKU1BWYXJpYWJsZV9OYW1lRnJvbUF0dHJpYnV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVjbGFyZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9WQVJJQUJMRV9fREVDTEFSRSA9IGVJTlNUQU5DRS5nZXRKU1BWYXJpYWJsZV9EZWNsYXJlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpTUF9WQVJJQUJMRV9fU0NPUEUgPSBlSU5TVEFOQ0UuZ2V0SlNQVmFyaWFibGVfU2NvcGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmxlIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSlNQX1ZBUklBQkxFX19WQVJJQUJMRV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRKU1BWYXJpYWJsZV9WYXJpYWJsZUNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpTUF9WQVJJQUJMRV9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEpTUFZhcmlhYmxlX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsIDxlbT5GdW5jdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkZ1bmN0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsI2dldEZ1bmN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEZVTkNUSU9OID0gZUlOU1RBTkNFLmdldEZ1bmN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRlVOQ1RJT05fX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RnVuY3Rpb25fTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2lnbmF0dXJlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRlVOQ1RJT05fX1NJR05BVFVSRSA9IGVJTlNUQU5DRS5nZXRGdW5jdGlvbl9TaWduYXR1cmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGVU5DVElPTl9fRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRGdW5jdGlvbl9FeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GdW5jdGlvbiBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZVTkNUSU9OX19GVU5DVElPTl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRGdW5jdGlvbl9GdW5jdGlvbkNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GdW5jdGlvbiBFeHRlbnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGVU5DVElPTl9fRlVOQ1RJT05fRVhURU5TSU9OUyA9IGVJTlNUQU5DRS5nZXRGdW5jdGlvbl9GdW5jdGlvbkV4dGVuc2lvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ0ZpbGVJbXBsIDxlbT5UYWcgRmlsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ0ZpbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0VGFnRmlsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQUdfRklMRSA9IGVJTlNUQU5DRS5nZXRUYWdGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFHX0ZJTEVfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0VGFnRmlsZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFHX0ZJTEVfX1BBVEggPSBlSU5TVEFOQ0UuZ2V0VGFnRmlsZV9QYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFHX0ZJTEVfX0VYQU1QTEUgPSBlSU5TVEFOQ0UuZ2V0VGFnRmlsZV9FeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWcgRXh0ZW5zaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFHX0ZJTEVfX1RBR19FWFRFTlNJT05TID0gZUlOU1RBTkNFLmdldFRhZ0ZpbGVfVGFnRXh0ZW5zaW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGxkRXh0ZW5zaW9uSW1wbCA8ZW0+VGxkIEV4dGVuc2lvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRsZEV4dGVuc2lvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRUbGRFeHRlbnNpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVExEX0VYVEVOU0lPTiA9IGVJTlNUQU5DRS5nZXRUbGRFeHRlbnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRMRF9FWFRFTlNJT05fX05BTUVTUEFDRSA9IGVJTlNUQU5DRS5nZXRUbGRFeHRlbnNpb25fTmFtZXNwYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlbnNpb24gRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRMRF9FWFRFTlNJT05fX0VYVEVOU0lPTl9FTEVNRU5UUyA9IGVJTlNUQU5DRS5nZXRUbGRFeHRlbnNpb25fRXh0ZW5zaW9uRWxlbWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkV4dGVuc2libGVUeXBlSW1wbCA8ZW0+RXh0ZW5zaWJsZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRXh0ZW5zaWJsZVR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0RXh0ZW5zaWJsZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhURU5TSUJMRV9UWVBFID0gZUlOU1RBTkNFLmdldEV4dGVuc2libGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVYVEVOU0lCTEVfVFlQRV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RXh0ZW5zaWJsZVR5cGVfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5Cb2R5Q29udGVudFR5cGUgPGVtPkJvZHkgQ29udGVudCBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuQm9keUNvbnRlbnRUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0Qm9keUNvbnRlbnRUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gQk9EWV9DT05URU5UX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Qm9keUNvbnRlbnRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSA8ZW0+SlNQIFNjcmlwdGluZyBWYXJpYWJsZSBTY29wZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gSlNQX1NDUklQVElOR19WQVJJQUJMRV9TQ09QRSA9IGVJTlNUQU5DRS5nZXRKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlKCk7Ci0KLQl9Ci0KLX0gLy9UYWdsaWJQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGxkRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGxkRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMWJkMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1RsZEV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGxkIEV4dGVuc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uI2dldE5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uI2dldEV4dGVuc2lvbkVsZW1lbnRzIDxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5UYWdsaWJQYWNrYWdlI2dldFRsZEV4dGVuc2lvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUbGRFeHRlbnNpb24gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lc3BhY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0VGxkRXh0ZW5zaW9uX05hbWVzcGFjZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lc3BhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuc2lvbiBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5FeHRlbnNpYmxlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuVGFnbGliUGFja2FnZSNnZXRUbGRFeHRlbnNpb25fRXh0ZW5zaW9uRWxlbWVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKTsKLQotfSAvLyBUbGRFeHRlbnNpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9WYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4ZWVmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiBUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0b3IgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgVmFsaWRhdG9yQ2xhc3MgcmVmZXJlbmNlCi0JICogZGVmaW5lcyB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzcyB0aGF0IGNhbiBiZQotCSAqIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0VmFsaWRhdG9yQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFZhbGlkYXRvckNsYXNzIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0VmFsaWRhdG9yQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgSW5pdFBhcmFtcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0SW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLlRhZ2xpYlBhY2thZ2UjZ2V0VmFsaWRhdG9yX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJsZVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9FeHRlbnNpYmxlVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2ZDhjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9FeHRlbnNpYmxlVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuc2libGUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRXh0ZW5zaWJsZVR5cGVJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4dGVuc2libGVUeXBlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4dGVuc2libGVUeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbnNpYmxlVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLkxpdGVyYWxzLkVYVEVOU0lCTEVfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkVYVEVOU0lCTEVfVFlQRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5FWFRFTlNJQkxFX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRVhURU5TSUJMRV9UWVBFX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkVYVEVOU0lCTEVfVFlQRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkVYVEVOU0lCTEVfVFlQRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeHRlbnNpYmxlVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0Z1bmN0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvRnVuY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MDI0MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvRnVuY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GdW5jdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkZ1bmN0aW9uSW1wbCNnZXRTaWduYXR1cmUgPGVtPlNpZ25hdHVyZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkZ1bmN0aW9uSW1wbCNnZXRGdW5jdGlvbkNsYXNzIDxlbT5GdW5jdGlvbiBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsI2dldEZ1bmN0aW9uRXh0ZW5zaW9ucyA8ZW0+RnVuY3Rpb24gRXh0ZW5zaW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZ1bmN0aW9uSW1wbCBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgRnVuY3Rpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpZ25hdHVyZSgpIDxlbT5TaWduYXR1cmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpZ25hdHVyZSgpIDxlbT5TaWduYXR1cmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzaWduYXR1cmUgPSBTSUdOQVRVUkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZSgpIDxlbT5FeGFtcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWEFNUExFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4YW1wbGUoKSA8ZW0+RXhhbXBsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleGFtcGxlID0gRVhBTVBMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bmN0aW9uQ2xhc3MoKSA8ZW0+RnVuY3Rpb24gQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZ1bmN0aW9uQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZnVuY3Rpb25DbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdW5jdGlvbkV4dGVuc2lvbnMoKSA8ZW0+RnVuY3Rpb24gRXh0ZW5zaW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGdW5jdGlvbkV4dGVuc2lvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBmdW5jdGlvbkV4dGVuc2lvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEZ1bmN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuTGl0ZXJhbHMuRlVOQ1RJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQkJcmV0dXJuIHNpZ25hdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaWduYXR1cmUoU3RyaW5nIG5ld1NpZ25hdHVyZSkgewotCQlTdHJpbmcgb2xkU2lnbmF0dXJlID0gc2lnbmF0dXJlOwotCQlzaWduYXR1cmUgPSBuZXdTaWduYXR1cmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX1NJR05BVFVSRSwgb2xkU2lnbmF0dXJlLCBzaWduYXR1cmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4YW1wbGUoU3RyaW5nIG5ld0V4YW1wbGUpIHsKLQkJU3RyaW5nIG9sZEV4YW1wbGUgPSBleGFtcGxlOwotCQlleGFtcGxlID0gbmV3RXhhbXBsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRVhBTVBMRSwgb2xkRXhhbXBsZSwgZXhhbXBsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0RnVuY3Rpb25DbGFzcygpIHsKLQkJaWYgKGZ1bmN0aW9uQ2xhc3MgIT0gbnVsbCAmJiBmdW5jdGlvbkNsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRGdW5jdGlvbkNsYXNzID0gKEludGVybmFsRU9iamVjdClmdW5jdGlvbkNsYXNzOwotCQkJZnVuY3Rpb25DbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRGdW5jdGlvbkNsYXNzKTsKLQkJCWlmIChmdW5jdGlvbkNsYXNzICE9IG9sZEZ1bmN0aW9uQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9DTEFTUywgb2xkRnVuY3Rpb25DbGFzcywgZnVuY3Rpb25DbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmdW5jdGlvbkNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRGdW5jdGlvbkNsYXNzKCkgewotCQlyZXR1cm4gZnVuY3Rpb25DbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGdW5jdGlvbkNsYXNzKEphdmFDbGFzcyBuZXdGdW5jdGlvbkNsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRGdW5jdGlvbkNsYXNzID0gZnVuY3Rpb25DbGFzczsKLQkJZnVuY3Rpb25DbGFzcyA9IG5ld0Z1bmN0aW9uQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTLCBvbGRGdW5jdGlvbkNsYXNzLCBmdW5jdGlvbkNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZ1bmN0aW9uRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZ1bmN0aW9uRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlmdW5jdGlvbkV4dGVuc2lvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGxkRXh0ZW5zaW9uLmNsYXNzLCB0aGlzLCBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TKTsKLQkJfQotCQlyZXR1cm4gZnVuY3Rpb25FeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRlVOQ1RJT05fRVhURU5TSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZ1bmN0aW9uRXh0ZW5zaW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19TSUdOQVRVUkU6Ci0JCQkJcmV0dXJuIGdldFNpZ25hdHVyZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19FWEFNUExFOgotCQkJCXJldHVybiBnZXRFeGFtcGxlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RnVuY3Rpb25DbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldEZ1bmN0aW9uQ2xhc3MoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRlVOQ1RJT05fRVhURU5TSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fU0lHTkFUVVJFOgotCQkJCXNldFNpZ25hdHVyZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0VYQU1QTEU6Ci0JCQkJc2V0RXhhbXBsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTOgotCQkJCXNldEZ1bmN0aW9uQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TOgotCQkJCWdldEZ1bmN0aW9uRXh0ZW5zaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19TSUdOQVRVUkU6Ci0JCQkJc2V0U2lnbmF0dXJlKFNJR05BVFVSRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19FWEFNUExFOgotCQkJCXNldEV4YW1wbGUoRVhBTVBMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9DTEFTUzoKLQkJCQlzZXRGdW5jdGlvbkNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TOgotCQkJCWdldEZ1bmN0aW9uRXh0ZW5zaW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fU0lHTkFUVVJFOgotCQkJCXJldHVybiBTSUdOQVRVUkVfRURFRkFVTFQgPT0gbnVsbCA/IHNpZ25hdHVyZSAhPSBudWxsIDogIVNJR05BVFVSRV9FREVGQVVMVC5lcXVhbHMoc2lnbmF0dXJlKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRVhBTVBMRToKLQkJCQlyZXR1cm4gRVhBTVBMRV9FREVGQVVMVCA9PSBudWxsID8gZXhhbXBsZSAhPSBudWxsIDogIUVYQU1QTEVfRURFRkFVTFQuZXF1YWxzKGV4YW1wbGUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9DTEFTUzoKLQkJCQlyZXR1cm4gZnVuY3Rpb25DbGFzcyAhPSBudWxsOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TOgotCQkJCXJldHVybiBmdW5jdGlvbkV4dGVuc2lvbnMgIT0gbnVsbCAmJiAhZnVuY3Rpb25FeHRlbnNpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNpZ25hdHVyZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2lnbmF0dXJlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGFtcGxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGFtcGxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRnVuY3Rpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BUYWdBdHRyaWJ1dGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BUYWdBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMDQ5ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVGFnQXR0cmlidXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUYWdBdHRyaWJ1dGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgSlNQVGFnQXR0cmlidXRlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXF1aXJlZCgpIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXF1aXJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZCA9IFJFUVVJUkVEX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVxdWlyZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUnRFeHByVmFsdWUoKSA8ZW0+UnQgRXhwciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSdEV4cHJWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJUX0VYUFJfVkFMVUVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJ0RXhwclZhbHVlID0gUlRfRVhQUl9WQUxVRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJ0IEV4cHIgVmFsdWUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJ0RXhwclZhbHVlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRnJhZ21lbnQoKSA8ZW0+RnJhZ21lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRnJhZ21lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGUkFHTUVOVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGcmFnbWVudCgpIDxlbT5GcmFnbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGcmFnbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZnJhZ21lbnQgPSBGUkFHTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgdHlwZSA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIEpTUFRhZ0F0dHJpYnV0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGFnbGliUGFja2FnZS5MaXRlcmFscy5KU1BfVEFHX0FUVFJJQlVURTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZCAocmVxdWlyZWQpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHJlcXVpcmVkOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gbmV3UmVxdWlyZWQpIHsKLQkJYm9vbGVhbiBvbGRSZXF1aXJlZCA9IHJlcXVpcmVkOwotCQlyZXF1aXJlZCA9IG5ld1JlcXVpcmVkOwotCQlib29sZWFuIG9sZFJlcXVpcmVkRVNldCA9IHJlcXVpcmVkRVNldDsKLQkJcmVxdWlyZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fUkVRVUlSRUQsIG9sZFJlcXVpcmVkLCByZXF1aXJlZCwgIW9sZFJlcXVpcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVxdWlyZWQoKSB7Ci0JCWJvb2xlYW4gb2xkUmVxdWlyZWQgPSByZXF1aXJlZDsKLQkJYm9vbGVhbiBvbGRSZXF1aXJlZEVTZXQgPSByZXF1aXJlZEVTZXQ7Ci0JCXJlcXVpcmVkID0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCXJlcXVpcmVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVELCBvbGRSZXF1aXJlZCwgUkVRVUlSRURfRURFRkFVTFQsIG9sZFJlcXVpcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZXF1aXJlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0IGV4cHJlc3Npb25zIGFzYSB2YWx1ZSwgaS5lCi0JICogdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWRhdCByZXF1ZXN0IHRpbWUsIGFzCi0JICogb3Bwb3NlZCB0byBhIHN0YXRpYyB2YWx1ZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9udGltZS4gKG9wdGlvbmFsKQotCSAqIERlZmF1bHQgPSBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUnRFeHByVmFsdWUoKSB7Ci0JCXJldHVybiBydEV4cHJWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSdEV4cHJWYWx1ZShib29sZWFuIG5ld1J0RXhwclZhbHVlKSB7Ci0JCWJvb2xlYW4gb2xkUnRFeHByVmFsdWUgPSBydEV4cHJWYWx1ZTsKLQkJcnRFeHByVmFsdWUgPSBuZXdSdEV4cHJWYWx1ZTsKLQkJYm9vbGVhbiBvbGRSdEV4cHJWYWx1ZUVTZXQgPSBydEV4cHJWYWx1ZUVTZXQ7Ci0JCXJ0RXhwclZhbHVlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JUX0VYUFJfVkFMVUUsIG9sZFJ0RXhwclZhbHVlLCBydEV4cHJWYWx1ZSwgIW9sZFJ0RXhwclZhbHVlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UnRFeHByVmFsdWUoKSB7Ci0JCWJvb2xlYW4gb2xkUnRFeHByVmFsdWUgPSBydEV4cHJWYWx1ZTsKLQkJYm9vbGVhbiBvbGRSdEV4cHJWYWx1ZUVTZXQgPSBydEV4cHJWYWx1ZUVTZXQ7Ci0JCXJ0RXhwclZhbHVlID0gUlRfRVhQUl9WQUxVRV9FREVGQVVMVDsKLQkJcnRFeHByVmFsdWVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fUlRfRVhQUl9WQUxVRSwgb2xkUnRFeHByVmFsdWUsIFJUX0VYUFJfVkFMVUVfRURFRkFVTFQsIG9sZFJ0RXhwclZhbHVlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UnRFeHByVmFsdWUoKSB7Ci0JCXJldHVybiBydEV4cHJWYWx1ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsKLQkJcmV0dXJuIGZyYWdtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyYWdtZW50KGJvb2xlYW4gbmV3RnJhZ21lbnQpIHsKLQkJYm9vbGVhbiBvbGRGcmFnbWVudCA9IGZyYWdtZW50OwotCQlmcmFnbWVudCA9IG5ld0ZyYWdtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19GUkFHTUVOVCwgb2xkRnJhZ21lbnQsIGZyYWdtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHZhbHVlIG9mIHRoZSB0eXBlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUuCi0JICogRm9yIHN0YXRpYyB2YWx1ZXMgKHRob3NlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24gdGltZSkgdGhlIHR5cGUgaXMgYWx3YXlzCi0JICogamF2YS5sYW5nLlN0cmluZy4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFR5cGUoKSB7Ci0JCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVHlwZSA9IChJbnRlcm5hbEVPYmplY3QpdHlwZTsKLQkJCXR5cGUgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkVHlwZSk7Ci0JCQlpZiAodHlwZSAhPSBvbGRUeXBlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEphdmFDbGFzcyBuZXdUeXBlKSB7Ci0JCUphdmFDbGFzcyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SVF9FWFBSX1ZBTFVFOgotCQkJCXJldHVybiBpc1J0RXhwclZhbHVlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19GUkFHTUVOVDoKLQkJCQlyZXR1cm4gaXNGcmFnbWVudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fVFlQRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRUeXBlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SVF9FWFBSX1ZBTFVFOgotCQkJCXNldFJ0RXhwclZhbHVlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fRlJBR01FTlQ6Ci0JCQkJc2V0RnJhZ21lbnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19UWVBFOgotCQkJCXNldFR5cGUoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVEOgotCQkJCXVuc2V0UmVxdWlyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JUX0VYUFJfVkFMVUU6Ci0JCQkJdW5zZXRSdEV4cHJWYWx1ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fRlJBR01FTlQ6Ci0JCQkJc2V0RnJhZ21lbnQoRlJBR01FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fVFlQRToKLQkJCQlzZXRUeXBlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNTZXRSZXF1aXJlZCgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SVF9FWFBSX1ZBTFVFOgotCQkJCXJldHVybiBpc1NldFJ0RXhwclZhbHVlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0ZSQUdNRU5UOgotCQkJCXJldHVybiBmcmFnbWVudCAhPSBGUkFHTUVOVF9FREVGQVVMVDsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fVFlQRToKLQkJCQlyZXR1cm4gdHlwZSAhPSBudWxsOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVxdWlyZWQ6ICIpOwotCQlpZiAocmVxdWlyZWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlcXVpcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcnRFeHByVmFsdWU6ICIpOwotCQlpZiAocnRFeHByVmFsdWVFU2V0KSByZXN1bHQuYXBwZW5kKHJ0RXhwclZhbHVlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZnJhZ21lbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZyYWdtZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVGFnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVGFnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWFkYWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0pTUFRhZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkJvZHlDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotCi0KLS8qKgotICogVGhlIHRhZyBlbGVtZW50IGRlZmluZXMgYW4gYWN0aW9uIGluIHRoaXMgdGFnIGxpYnJhcnkuIFRoZSB0YWcgZWxlbWVudCBoYXMgb25lIGF0dHJpYnV0ZSwgaWQuCi0gKiBUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKLSAqIG5hbWUgLS0gVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQotICogdGFnLWNsYXNzIC0tIFRoZSB0YWcgaGFuZGxlciBjbGFzcyBpbXBsZW1lbnRpbmcgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZwotICogdGVpLWNsYXNzIC0tIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLSAqIGJvZHktY29udGVudCAtLSBUaGUgYm9keSBjb250ZW50IHR5cGUKLSAqIGRpc3BsYXktbmFtZSAtLSBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKLSAqIHNtYWxsLWljb24gLS0gT3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0gKiBsYXJnZS1pY29uIC0tIE9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotICogZGVzY3JpcHRpb24gLS0gT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0gKiB2YXJpYWJsZSAtLSBPcHRpb25hbCBzY3JpcHRpbmcgdmFyaWFibGUgaW5mb3JtYXRpb24KLSAqIGF0dHJpYnV0ZSAtLSBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbgotICogZXhhbXBsZSAtLSBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgYWN0aW9uLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUYWdJbXBsIGV4dGVuZHMgRGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBKU1BUYWcgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvZHlDb250ZW50KCkgPGVtPkJvZHkgQ29udGVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9keUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9keUNvbnRlbnRUeXBlIEJPRFlfQ09OVEVOVF9FREVGQVVMVCA9IEJvZHlDb250ZW50VHlwZS5UQUdERVBFTkRFTlRfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBCb2R5Q29udGVudFR5cGUgYm9keUNvbnRlbnQgPSBCT0RZX0NPTlRFTlRfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCb2R5IENvbnRlbnQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJvZHlDb250ZW50RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4YW1wbGUoKSA8ZW0+RXhhbXBsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhBTVBMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4YW1wbGUgPSBFWEFNUExFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRHluYW1pY0F0dHJpYnV0ZXMoKSA8ZW0+RHluYW1pYyBBdHRyaWJ1dGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0R5bmFtaWNBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRFlOQU1JQ19BVFRSSUJVVEVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0R5bmFtaWNBdHRyaWJ1dGVzKCkgPGVtPkR5bmFtaWMgQXR0cmlidXRlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEeW5hbWljQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZHluYW1pY0F0dHJpYnV0ZXMgPSBEWU5BTUlDX0FUVFJJQlVURVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXR0cmlidXRlcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHZhcmlhYmxlcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyB0YWdDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyB0ZWlDbGFzcyA9IG51bGw7Ci0JcHVibGljIEpTUFRhZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGFnbGliUGFja2FnZS5MaXRlcmFscy5KU1BfVEFHOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFByb3ZpZGVzIGEgaGludCBhcyB0byB0aGUgY29udGVudCBvZiB0aGUgYm9keSBvZiB0aGlzIHRhZy4gUHJpbWFyaWx5IGludGVuZGVkCi0JICogZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLlRoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgdmFsdWVzIHNwZWNpZmllZDoKLQkgKiAKLQkgKiB0YWdkZXBlbmRlbnQgLSBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcgaW1wbGVtZW50YXRpb24KLQkgKiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseSBpbiBhCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMCi0JICogc3RhdGVtZW50cy4KLQkgKiAKLQkgKiBKU1AgLSBUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1Agc3ludGF4Ci0JICogCi0JICogZW1wdHkgLSBUaGUgYm9keSBtdXN0IGJlIGVtcHR5VGhlIGRlZmF1bHQgKGlmIG5vdCBkZWZpbmVkKSBpcyBKU1AjUENEQVRBIDo6PSAKLQkgKiB0YWdkZXBlbmRlbnQgfCBKU1AgfCBlbXB0eQotCSAqLwotCXB1YmxpYyBCb2R5Q29udGVudFR5cGUgZ2V0Qm9keUNvbnRlbnQoKSB7Ci0JCXJldHVybiBib2R5Q29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb2R5Q29udGVudChCb2R5Q29udGVudFR5cGUgbmV3Qm9keUNvbnRlbnQpIHsKLQkJQm9keUNvbnRlbnRUeXBlIG9sZEJvZHlDb250ZW50ID0gYm9keUNvbnRlbnQ7Ci0JCWJvZHlDb250ZW50ID0gbmV3Qm9keUNvbnRlbnQgPT0gbnVsbCA/IEJPRFlfQ09OVEVOVF9FREVGQVVMVCA6IG5ld0JvZHlDb250ZW50OwotCQlib29sZWFuIG9sZEJvZHlDb250ZW50RVNldCA9IGJvZHlDb250ZW50RVNldDsKLQkJYm9keUNvbnRlbnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX19CT0RZX0NPTlRFTlQsIG9sZEJvZHlDb250ZW50LCBib2R5Q29udGVudCwgIW9sZEJvZHlDb250ZW50RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Qm9keUNvbnRlbnQoKSB7Ci0JCUJvZHlDb250ZW50VHlwZSBvbGRCb2R5Q29udGVudCA9IGJvZHlDb250ZW50OwotCQlib29sZWFuIG9sZEJvZHlDb250ZW50RVNldCA9IGJvZHlDb250ZW50RVNldDsKLQkJYm9keUNvbnRlbnQgPSBCT0RZX0NPTlRFTlRfRURFRkFVTFQ7Ci0JCWJvZHlDb250ZW50RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQk9EWV9DT05URU5ULCBvbGRCb2R5Q29udGVudCwgQk9EWV9DT05URU5UX0VERUZBVUxULCBvbGRCb2R5Q29udGVudEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJvZHlDb250ZW50KCkgewotCQlyZXR1cm4gYm9keUNvbnRlbnRFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBleGFtcGxlIGVsZW1lbnQgcHJvdmlkZXMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlCi0JICogb2YgYSB0YWcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGFtcGxlKFN0cmluZyBuZXdFeGFtcGxlKSB7Ci0JCVN0cmluZyBvbGRFeGFtcGxlID0gZXhhbXBsZTsKLQkJZXhhbXBsZSA9IG5ld0V4YW1wbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRVhBTVBMRSwgb2xkRXhhbXBsZSwgZXhhbXBsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWNBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZHluYW1pY0F0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZXMoYm9vbGVhbiBuZXdEeW5hbWljQXR0cmlidXRlcykgewotCQlib29sZWFuIG9sZER5bmFtaWNBdHRyaWJ1dGVzID0gZHluYW1pY0F0dHJpYnV0ZXM7Ci0JCWR5bmFtaWNBdHRyaWJ1dGVzID0gbmV3RHluYW1pY0F0dHJpYnV0ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRFlOQU1JQ19BVFRSSUJVVEVTLCBvbGREeW5hbWljQXR0cmlidXRlcywgZHluYW1pY0F0dHJpYnV0ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJYXR0cmlidXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQVRUUklCVVRFUyk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHZhcmlhYmxlIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgZGVmaW5lZCBieSAKLQkgKiB0aGlzIHRhZy4KLQkgKiBJdCBpcyBhICh0cmFuc2xhdGlvbiB0aW1lKSBlcnJvciBmb3IgYW4gYWN0aW9uIHRoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlCi0JICogc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbyBjbGFzcyB0aGF0IHJldHVybnMgYSBub24tbnVsbCBvYmplY3QuCi0JICogVGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlIGFyZSBvZiB0aGUgZm9ybToKLQkgKiBuYW1lLWdpdmVuIC0tIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKLQkgKiBuYW1lLWZyb20tYXR0cmlidXRlIC0tIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUKLQkgKiB3aWxsIGdpdmUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLiBPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lZnJvbS1hdHRyaWJ1dGUgaXMKLQkgKiByZXF1aXJlZC4KLQkgKiB2YXJpYWJsZS1jbGFzcyAtLSBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuIGphdmEubGFuZy5TdHJpbmcgaXMKLQkgKiBkZWZhdWx0LgotCSAqIGRlY2xhcmUgLS0gV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LiBUcnVlIGlzIHRoZSBkZWZhdWx0LgotCSAqIHNjb3BlIC0tIFRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGRlZmluZWQuIE5FU1RFRCBpcyBkZWZhdWx0LgotCi0JICovCi0JcHVibGljIEVMaXN0IGdldFZhcmlhYmxlcygpIHsKLQkJaWYgKHZhcmlhYmxlcyA9PSBudWxsKSB7Ci0JCQl2YXJpYWJsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSlNQVmFyaWFibGUuY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVkFSSUFCTEVTKTsKLQkJfQotCQlyZXR1cm4gdmFyaWFibGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0YWctY2xhc3MgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5UYWcKLQkgKiB0aGF0IGltcGxlbWVudHMgdGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yIHRoaXMgdGFnLiBUaGlzIGVsZW1lbnQgaXMKLQkgKiByZXF1aXJlZC4KLQkgKiBAcmVnZXhwIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0VGFnQ2xhc3MoKSB7Ci0JCWlmICh0YWdDbGFzcyAhPSBudWxsICYmIHRhZ0NsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRUYWdDbGFzcyA9IChJbnRlcm5hbEVPYmplY3QpdGFnQ2xhc3M7Ci0JCQl0YWdDbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRUYWdDbGFzcyk7Ci0JCQlpZiAodGFnQ2xhc3MgIT0gb2xkVGFnQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RBR19DTEFTUywgb2xkVGFnQ2xhc3MsIHRhZ0NsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhZ0NsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRUYWdDbGFzcygpIHsKLQkJcmV0dXJuIHRhZ0NsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ0NsYXNzKEphdmFDbGFzcyBuZXdUYWdDbGFzcykgewotCQlKYXZhQ2xhc3Mgb2xkVGFnQ2xhc3MgPSB0YWdDbGFzczsKLQkJdGFnQ2xhc3MgPSBuZXdUYWdDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX19UQUdfQ0xBU1MsIG9sZFRhZ0NsYXNzLCB0YWdDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0ZWktY2xhc3MgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHN1YmNsYXNzIG9mCi0JICogamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbyBmb3IgdGhpcyB0YWcuIFRoZSBjbGFzcyBpcyBpbnN0YW50aWF0ZWQKLQkgKiBhdCB0cmFuc2xhdGlvbiB0aW1lLiBUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwuCi0JICogQHJlZ2V4cCBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRUZWlDbGFzcygpIHsKLQkJaWYgKHRlaUNsYXNzICE9IG51bGwgJiYgdGVpQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFRlaUNsYXNzID0gKEludGVybmFsRU9iamVjdCl0ZWlDbGFzczsKLQkJCXRlaUNsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZFRlaUNsYXNzKTsKLQkJCWlmICh0ZWlDbGFzcyAhPSBvbGRUZWlDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEVJX0NMQVNTLCBvbGRUZWlDbGFzcywgdGVpQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGVpQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFRlaUNsYXNzKCkgewotCQlyZXR1cm4gdGVpQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVpQ2xhc3MoSmF2YUNsYXNzIG5ld1RlaUNsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRUZWlDbGFzcyA9IHRlaUNsYXNzOwotCQl0ZWlDbGFzcyA9IG5ld1RlaUNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RFSV9DTEFTUywgb2xkVGVpQ2xhc3MsIHRlaUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19WQVJJQUJMRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRWYXJpYWJsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQk9EWV9DT05URU5UOgotCQkJCXJldHVybiBnZXRCb2R5Q29udGVudCgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0VYQU1QTEU6Ci0JCQkJcmV0dXJuIGdldEV4YW1wbGUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRFlOQU1JQ19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBpc0R5bmFtaWNBdHRyaWJ1dGVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19WQVJJQUJMRVM6Ci0JCQkJcmV0dXJuIGdldFZhcmlhYmxlcygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RBR19DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFRhZ0NsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0VGFnQ2xhc3MoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19URUlfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRUZWlDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldFRlaUNsYXNzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19CT0RZX0NPTlRFTlQ6Ci0JCQkJc2V0Qm9keUNvbnRlbnQoKEJvZHlDb250ZW50VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0VYQU1QTEU6Ci0JCQkJc2V0RXhhbXBsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19EWU5BTUlDX0FUVFJJQlVURVM6Ci0JCQkJc2V0RHluYW1pY0F0dHJpYnV0ZXMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1ZBUklBQkxFUzoKLQkJCQlnZXRWYXJpYWJsZXMoKS5jbGVhcigpOwotCQkJCWdldFZhcmlhYmxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RBR19DTEFTUzoKLQkJCQlzZXRUYWdDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEVJX0NMQVNTOgotCQkJCXNldFRlaUNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQk9EWV9DT05URU5UOgotCQkJCXVuc2V0Qm9keUNvbnRlbnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRVhBTVBMRToKLQkJCQlzZXRFeGFtcGxlKEVYQU1QTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0RZTkFNSUNfQVRUUklCVVRFUzoKLQkJCQlzZXREeW5hbWljQXR0cmlidXRlcyhEWU5BTUlDX0FUVFJJQlVURVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19WQVJJQUJMRVM6Ci0JCQkJZ2V0VmFyaWFibGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEFHX0NMQVNTOgotCQkJCXNldFRhZ0NsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RFSV9DTEFTUzoKLQkJCQlzZXRUZWlDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0JPRFlfQ09OVEVOVDoKLQkJCQlyZXR1cm4gaXNTZXRCb2R5Q29udGVudCgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0VYQU1QTEU6Ci0JCQkJcmV0dXJuIEVYQU1QTEVfRURFRkFVTFQgPT0gbnVsbCA/IGV4YW1wbGUgIT0gbnVsbCA6ICFFWEFNUExFX0VERUZBVUxULmVxdWFscyhleGFtcGxlKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRFlOQU1JQ19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBkeW5hbWljQXR0cmlidXRlcyAhPSBEWU5BTUlDX0FUVFJJQlVURVNfRURFRkFVTFQ7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19WQVJJQUJMRVM6Ci0JCQkJcmV0dXJuIHZhcmlhYmxlcyAhPSBudWxsICYmICF2YXJpYWJsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RBR19DTEFTUzoKLQkJCQlyZXR1cm4gdGFnQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19URUlfQ0xBU1M6Ci0JCQkJcmV0dXJuIHRlaUNsYXNzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChib2R5Q29udGVudDogIik7Ci0JCWlmIChib2R5Q29udGVudEVTZXQpIHJlc3VsdC5hcHBlbmQoYm9keUNvbnRlbnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGFtcGxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGFtcGxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkeW5hbWljQXR0cmlidXRlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHluYW1pY0F0dHJpYnV0ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BWYXJpYWJsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0pTUFZhcmlhYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTA1MzUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0pTUFZhcmlhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUFZhcmlhYmxlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEpTUFZhcmlhYmxlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lR2l2ZW4oKSA8ZW0+TmFtZSBHaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZUdpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0dJVkVOX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZUdpdmVuID0gTkFNRV9HSVZFTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSA8ZW0+TmFtZSBGcm9tIEF0dHJpYnV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRlJPTV9BVFRSSUJVVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lRnJvbUF0dHJpYnV0ZSA9IE5BTUVfRlJPTV9BVFRSSUJVVEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGVjbGFyZSgpIDxlbT5EZWNsYXJlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RlY2xhcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUNMQVJFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWNsYXJlID0gREVDTEFSRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NvcGUoKSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgU0NPUEVfRURFRkFVTFQgPSBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLk5FU1RFRF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgc2NvcGUgPSBTQ09QRV9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHZhcmlhYmxlQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBKU1BWYXJpYWJsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGFnbGliUGFja2FnZS5MaXRlcmFscy5KU1BfVkFSSUFCTEU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIG5hbWUtZ2l2ZW4gZWxlbWVudCBwcm92aWRlcyB0aGUgbmFtZSBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4KLQkgKiAKLQkgKiBPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUdpdmVuKCkgewotCQlyZXR1cm4gbmFtZUdpdmVuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVHaXZlbihTdHJpbmcgbmV3TmFtZUdpdmVuKSB7Ci0JCVN0cmluZyBvbGROYW1lR2l2ZW4gPSBuYW1lR2l2ZW47Ci0JCW5hbWVHaXZlbiA9IG5ld05hbWVHaXZlbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX05BTUVfR0lWRU4sIG9sZE5hbWVHaXZlbiwgbmFtZUdpdmVuKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbi10aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YKLQkgKiB0aGUgdmFyaWFibGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lRnJvbUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIG5hbWVGcm9tQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVGcm9tQXR0cmlidXRlKFN0cmluZyBuZXdOYW1lRnJvbUF0dHJpYnV0ZSkgewotCQlTdHJpbmcgb2xkTmFtZUZyb21BdHRyaWJ1dGUgPSBuYW1lRnJvbUF0dHJpYnV0ZTsKLQkJbmFtZUZyb21BdHRyaWJ1dGUgPSBuZXdOYW1lRnJvbUF0dHJpYnV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX05BTUVfRlJPTV9BVFRSSUJVVEUsIG9sZE5hbWVGcm9tQXR0cmlidXRlLCBuYW1lRnJvbUF0dHJpYnV0ZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgZGVjbGFyZSBlbGVtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgdG8gCi0JICogYmUgZGVmaW5lZCBvciBub3QuIFNlZSBUYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuCi0JICogVGhpcyBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCBpcyB0aGUgZGVmYXVsdCBpcyB0cnVlLgotCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWNsYXJlKCkgewotCQlyZXR1cm4gZGVjbGFyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJlKGJvb2xlYW4gbmV3RGVjbGFyZSkgewotCQlib29sZWFuIG9sZERlY2xhcmUgPSBkZWNsYXJlOwotCQlkZWNsYXJlID0gbmV3RGVjbGFyZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFQ0xBUkUsIG9sZERlY2xhcmUsIGRlY2xhcmUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjb3BlKEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgbmV3U2NvcGUpIHsKLQkJSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBvbGRTY29wZSA9IHNjb3BlOwotCQlzY29wZSA9IG5ld1Njb3BlID09IG51bGwgPyBTQ09QRV9FREVGQVVMVCA6IG5ld1Njb3BlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fU0NPUEUsIG9sZFNjb3BlLCBzY29wZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0VmFyaWFibGVDbGFzcygpIHsKLQkJaWYgKHZhcmlhYmxlQ2xhc3MgIT0gbnVsbCAmJiB2YXJpYWJsZUNsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRWYXJpYWJsZUNsYXNzID0gKEludGVybmFsRU9iamVjdCl2YXJpYWJsZUNsYXNzOwotCQkJdmFyaWFibGVDbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRWYXJpYWJsZUNsYXNzKTsKLQkJCWlmICh2YXJpYWJsZUNsYXNzICE9IG9sZFZhcmlhYmxlQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fVkFSSUFCTEVfQ0xBU1MsIG9sZFZhcmlhYmxlQ2xhc3MsIHZhcmlhYmxlQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFyaWFibGVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0VmFyaWFibGVDbGFzcygpIHsKLQkJcmV0dXJuIHZhcmlhYmxlQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFibGVDbGFzcyhKYXZhQ2xhc3MgbmV3VmFyaWFibGVDbGFzcykgewotCQlKYXZhQ2xhc3Mgb2xkVmFyaWFibGVDbGFzcyA9IHZhcmlhYmxlQ2xhc3M7Ci0JCXZhcmlhYmxlQ2xhc3MgPSBuZXdWYXJpYWJsZUNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fVkFSSUFCTEVfQ0xBU1MsIG9sZFZhcmlhYmxlQ2xhc3MsIHZhcmlhYmxlQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOOgotCQkJCXJldHVybiBnZXROYW1lR2l2ZW4oKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX05BTUVfRlJPTV9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldE5hbWVGcm9tQXR0cmlidXRlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19ERUNMQVJFOgotCQkJCXJldHVybiBpc0RlY2xhcmUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19TQ09QRToKLQkJCQlyZXR1cm4gZ2V0U2NvcGUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1ZBUklBQkxFX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VmFyaWFibGVDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldFZhcmlhYmxlQ2xhc3MoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX05BTUVfR0lWRU46Ci0JCQkJc2V0TmFtZUdpdmVuKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX05BTUVfRlJPTV9BVFRSSUJVVEU6Ci0JCQkJc2V0TmFtZUZyb21BdHRyaWJ1dGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fREVDTEFSRToKLQkJCQlzZXREZWNsYXJlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1NDT1BFOgotCQkJCXNldFNjb3BlKChKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19WQVJJQUJMRV9DTEFTUzoKLQkJCQlzZXRWYXJpYWJsZUNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX05BTUVfR0lWRU46Ci0JCQkJc2V0TmFtZUdpdmVuKE5BTUVfR0lWRU5fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX05BTUVfRlJPTV9BVFRSSUJVVEU6Ci0JCQkJc2V0TmFtZUZyb21BdHRyaWJ1dGUoTkFNRV9GUk9NX0FUVFJJQlVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fREVDTEFSRToKLQkJCQlzZXREZWNsYXJlKERFQ0xBUkVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1NDT1BFOgotCQkJCXNldFNjb3BlKFNDT1BFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19WQVJJQUJMRV9DTEFTUzoKLQkJCQlzZXRWYXJpYWJsZUNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOOgotCQkJCXJldHVybiBOQU1FX0dJVkVOX0VERUZBVUxUID09IG51bGwgPyBuYW1lR2l2ZW4gIT0gbnVsbCA6ICFOQU1FX0dJVkVOX0VERUZBVUxULmVxdWFscyhuYW1lR2l2ZW4pOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fTkFNRV9GUk9NX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gTkFNRV9GUk9NX0FUVFJJQlVURV9FREVGQVVMVCA9PSBudWxsID8gbmFtZUZyb21BdHRyaWJ1dGUgIT0gbnVsbCA6ICFOQU1FX0ZST01fQVRUUklCVVRFX0VERUZBVUxULmVxdWFscyhuYW1lRnJvbUF0dHJpYnV0ZSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19ERUNMQVJFOgotCQkJCXJldHVybiBkZWNsYXJlICE9IERFQ0xBUkVfRURFRkFVTFQ7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19TQ09QRToKLQkJCQlyZXR1cm4gc2NvcGUgIT0gU0NPUEVfRURFRkFVTFQ7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19WQVJJQUJMRV9DTEFTUzoKLQkJCQlyZXR1cm4gdmFyaWFibGVDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWVHaXZlbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZUdpdmVuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lRnJvbUF0dHJpYnV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZUZyb21BdHRyaWJ1dGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlY2xhcmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlY2xhcmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjb3BlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY29wZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ0ZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdGaWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDg2NDI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ0ZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFnIEZpbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ0ZpbGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ0ZpbGVJbXBsI2dldFBhdGggPGVtPlBhdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ0ZpbGVJbXBsI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ0ZpbGVJbXBsI2dldFRhZ0V4dGVuc2lvbnMgPGVtPlRhZyBFeHRlbnNpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFnRmlsZUltcGwgZXh0ZW5kcyBEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIFRhZ0ZpbGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhdGgoKSA8ZW0+UGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXRoKCkgPGVtPlBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGF0aCA9IFBBVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZSgpIDxlbT5FeGFtcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWEFNUExFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4YW1wbGUoKSA8ZW0+RXhhbXBsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleGFtcGxlID0gRVhBTVBMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ0V4dGVuc2lvbnMoKSA8ZW0+VGFnIEV4dGVuc2lvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnRXh0ZW5zaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRhZ0V4dGVuc2lvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhZ0ZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGFnbGliUGFja2FnZS5MaXRlcmFscy5UQUdfRklMRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgbmV3UGF0aCkgewotCQlTdHJpbmcgb2xkUGF0aCA9IHBhdGg7Ci0JCXBhdGggPSBuZXdQYXRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19QQVRILCBvbGRQYXRoLCBwYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGFtcGxlKFN0cmluZyBuZXdFeGFtcGxlKSB7Ci0JCVN0cmluZyBvbGRFeGFtcGxlID0gZXhhbXBsZTsKLQkJZXhhbXBsZSA9IG5ld0V4YW1wbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX0VYQU1QTEUsIG9sZEV4YW1wbGUsIGV4YW1wbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGFnRXh0ZW5zaW9ucygpIHsKLQkJaWYgKHRhZ0V4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJdGFnRXh0ZW5zaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUbGRFeHRlbnNpb24uY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1RBR19FWFRFTlNJT05TKTsKLQkJfQotCQlyZXR1cm4gdGFnRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1RBR19FWFRFTlNJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGFnRXh0ZW5zaW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19QQVRIOgotCQkJCXJldHVybiBnZXRQYXRoKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX0VYQU1QTEU6Ci0JCQkJcmV0dXJuIGdldEV4YW1wbGUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fVEFHX0VYVEVOU0lPTlM6Ci0JCQkJcmV0dXJuIGdldFRhZ0V4dGVuc2lvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19QQVRIOgotCQkJCXNldFBhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19FWEFNUExFOgotCQkJCXNldEV4YW1wbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19UQUdfRVhURU5TSU9OUzoKLQkJCQlnZXRUYWdFeHRlbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRUYWdFeHRlbnNpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19QQVRIOgotCQkJCXNldFBhdGgoUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19FWEFNUExFOgotCQkJCXNldEV4YW1wbGUoRVhBTVBMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19UQUdfRVhURU5TSU9OUzoKLQkJCQlnZXRUYWdFeHRlbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19QQVRIOgotCQkJCXJldHVybiBQQVRIX0VERUZBVUxUID09IG51bGwgPyBwYXRoICE9IG51bGwgOiAhUEFUSF9FREVGQVVMVC5lcXVhbHMocGF0aCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX0VYQU1QTEU6Ci0JCQkJcmV0dXJuIEVYQU1QTEVfRURFRkFVTFQgPT0gbnVsbCA/IGV4YW1wbGUgIT0gbnVsbCA6ICFFWEFNUExFX0VERUZBVUxULmVxdWFscyhleGFtcGxlKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fVEFHX0VYVEVOU0lPTlM6Ci0JCQkJcmV0dXJuIHRhZ0V4dGVuc2lvbnMgIT0gbnVsbCAmJiAhdGFnRXh0ZW5zaW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXRoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGFtcGxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGFtcGxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFnRmlsZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ0xpYkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ0xpYkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmYjEyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdMaWJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlZhbGlkYXRvcjsKLQotCi0vKioKLSAqIFRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LgotCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdMaWJJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgVGFnTGliIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdMaWJWZXJzaW9uKCkgPGVtPlRhZyBMaWIgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnTGliVmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0xJQl9WRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFnTGliVmVyc2lvbiA9IFRBR19MSUJfVkVSU0lPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SnNwVmVyc2lvbigpIDxlbT5Kc3AgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SnNwVmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBqc3BWZXJzaW9uID0gSlNQX1ZFUlNJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNob3J0TmFtZSgpIDxlbT5TaG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzaG9ydE5hbWUgPSBTSE9SVF9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVyaSA9IFVSSV9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGFncyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBsaXN0ZW5lcnMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bmN0aW9ucygpIDxlbT5GdW5jdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnVuY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZnVuY3Rpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ2xpYkV4dGVuc2lvbnMoKSA8ZW0+VGFnbGliIEV4dGVuc2lvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnbGliRXh0ZW5zaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRhZ2xpYkV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHVibGljIFRhZ0xpYkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGFnbGliUGFja2FnZS5MaXRlcmFscy5UQUdfTElCOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIERlc2NyaWJlcyB0aGlzIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB0YWcgbGlicmFyeSAoZGV3ZXkgZGVjaW1hbCkuCi0JICogQHJlZ2V4cCBbMC05XSp7ICIuIlswLTldIH0wLi4zCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdMaWJWZXJzaW9uKCkgewotCQlyZXR1cm4gdGFnTGliVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdMaWJWZXJzaW9uKFN0cmluZyBuZXdUYWdMaWJWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRUYWdMaWJWZXJzaW9uID0gdGFnTGliVmVyc2lvbjsKLQkJdGFnTGliVmVyc2lvbiA9IG5ld1RhZ0xpYlZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OLCBvbGRUYWdMaWJWZXJzaW9uLCB0YWdMaWJWZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZyBsaWJyYXJ5IHJlcXVpcmVzIGluIG9yZGVyIHRvCi0JICogZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpLiAgRGVmYXVsdCBpcyAxLjIKLQkgKiBAcmVnZXhwIFswLTldKnsgIi4iWzAtOV0gfTAuLjMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpzcFZlcnNpb24oKSB7Ci0JCXJldHVybiBqc3BWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpzcFZlcnNpb24oU3RyaW5nIG5ld0pzcFZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZEpzcFZlcnNpb24gPSBqc3BWZXJzaW9uOwotCQlqc3BWZXJzaW9uID0gbmV3SnNwVmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5UQUdfTElCX19KU1BfVkVSU0lPTiwgb2xkSnNwVmVyc2lvbiwganNwVmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgc2hvcnQtbmFtZSBlbGVtZW50IGlzIGEgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkgYSBKU1AKLQkgKiBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhIG1uZW1vbmljIHZhbHVlOyBmb3IgZXhhbXBsZSwgaXQgbWF5IGJlCi0JICogdXNlZCBhcyB0aGUgcHJlZmVyZWQgcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzLiBEbyBub3QgdXNlIHdoaXRlIHNwYWNlLCAKLQkgKiBhbmQgZG8gbm90IHN0YXJ0IHdpdGggZGlnaXRzIG9yIHVuZGVyc2NvcmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0JCXJldHVybiBzaG9ydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvcnROYW1lKFN0cmluZyBuZXdTaG9ydE5hbWUpIHsKLQkJU3RyaW5nIG9sZFNob3J0TmFtZSA9IHNob3J0TmFtZTsKLQkJc2hvcnROYW1lID0gbmV3U2hvcnROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1NIT1JUX05BTUUsIG9sZFNob3J0TmFtZSwgc2hvcnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHZhbHVlIG9mIHRoZSB1cmkgZWxlbWVudCBpcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBleGFjdCAKLQkgKiBzZW1hbnRpY3Mgb2YgdGhpcyB0YWdsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgbmV3VXJpKSB7Ci0JCVN0cmluZyBvbGRVcmkgPSB1cmk7Ci0JCXVyaSA9IG5ld1VyaTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5UQUdfTElCX19VUkksIG9sZFVyaSwgdXJpKSk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJc3VwZXIuc2V0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUpOwotCX0KLQkKLQkvKioKLQlUaGlzIHJldHVybnMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlcy5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGFncygpIHsKLQkJaWYgKHRhZ3MgPT0gbnVsbCkgewotCQkJdGFncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKU1BUYWcuY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHUyk7Ci0JCX0KLQkJcmV0dXJuIHRhZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHZhbGlkYXRvciBlbGVtZW50IHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGFuIG9wdGlvbmFsIHZhbGlkYXRvciB0aGF0IGNhbiBiZSAKLQkgKiB1c2VkIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCi0KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWxpZGF0b3IoVmFsaWRhdG9yIG5ld1ZhbGlkYXRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlWYWxpZGF0b3Igb2xkVmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl2YWxpZGF0b3IgPSBuZXdWYWxpZGF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SLCBvbGRWYWxpZGF0b3IsIG5ld1ZhbGlkYXRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciBuZXdWYWxpZGF0b3IpIHsKLQkJaWYgKG5ld1ZhbGlkYXRvciAhPSB2YWxpZGF0b3IpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl2YWxpZGF0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1ZBTElEQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VmFsaWRhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ZhbGlkYXRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFZhbGlkYXRvcihuZXdWYWxpZGF0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1IsIG5ld1ZhbGlkYXRvciwgbmV3VmFsaWRhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldExpc3RlbmVycygpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlzdGVuZXIuY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fTElTVEVORVJTKTsKLQkJfQotCQlyZXR1cm4gbGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRGdW5jdGlvbnMoKSB7Ci0JCWlmIChmdW5jdGlvbnMgPT0gbnVsbCkgewotCQkJZnVuY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEZ1bmN0aW9uLmNsYXNzLCB0aGlzLCBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0ZVTkNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGZ1bmN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGFnbGliRXh0ZW5zaW9ucygpIHsKLQkJaWYgKHRhZ2xpYkV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJdGFnbGliRXh0ZW5zaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUbGRFeHRlbnNpb24uY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX0VYVEVOU0lPTlMpOwotCQl9Ci0JCXJldHVybiB0YWdsaWJFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGFncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SOgotCQkJCXJldHVybiBiYXNpY1NldFZhbGlkYXRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMaXN0ZW5lcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0ZVTkNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZ1bmN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX0VYVEVOU0lPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYWdsaWJFeHRlbnNpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR19MSUJfVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VGFnTGliVmVyc2lvbigpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0pTUF9WRVJTSU9OOgotCQkJCXJldHVybiBnZXRKc3BWZXJzaW9uKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fU0hPUlRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0U2hvcnROYW1lKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVVJJOgotCQkJCXJldHVybiBnZXRVcmkoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdTOgotCQkJCXJldHVybiBnZXRUYWdzKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SOgotCQkJCXJldHVybiBnZXRWYWxpZGF0b3IoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGdldExpc3RlbmVycygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0ZVTkNUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RnVuY3Rpb25zKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX0VYVEVOU0lPTlM6Ci0JCQkJcmV0dXJuIGdldFRhZ2xpYkV4dGVuc2lvbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR19MSUJfVkVSU0lPTjoKLQkJCQlzZXRUYWdMaWJWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19KU1BfVkVSU0lPTjoKLQkJCQlzZXRKc3BWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19TSE9SVF9OQU1FOgotCQkJCXNldFNob3J0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVVJJOgotCQkJCXNldFVyaSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHUzoKLQkJCQlnZXRUYWdzKCkuY2xlYXIoKTsKLQkJCQlnZXRUYWdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SOgotCQkJCXNldFZhbGlkYXRvcigoVmFsaWRhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fTElTVEVORVJTOgotCQkJCWdldExpc3RlbmVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0TGlzdGVuZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRlVOQ1RJT05TOgotCQkJCWdldEZ1bmN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RnVuY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX0VYVEVOU0lPTlM6Ci0JCQkJZ2V0VGFnbGliRXh0ZW5zaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0VGFnbGliRXh0ZW5zaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdfTElCX1ZFUlNJT046Ci0JCQkJc2V0VGFnTGliVmVyc2lvbihUQUdfTElCX1ZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19KU1BfVkVSU0lPTjoKLQkJCQlzZXRKc3BWZXJzaW9uKEpTUF9WRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fU0hPUlRfTkFNRToKLQkJCQlzZXRTaG9ydE5hbWUoU0hPUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHUzoKLQkJCQlnZXRUYWdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SOgotCQkJCXNldFZhbGlkYXRvcigoVmFsaWRhdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19MSVNURU5FUlM6Ci0JCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRlVOQ1RJT05TOgotCQkJCWdldEZ1bmN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR0xJQl9FWFRFTlNJT05TOgotCQkJCWdldFRhZ2xpYkV4dGVuc2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR19MSUJfVkVSU0lPTjoKLQkJCQlyZXR1cm4gVEFHX0xJQl9WRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB0YWdMaWJWZXJzaW9uICE9IG51bGwgOiAhVEFHX0xJQl9WRVJTSU9OX0VERUZBVUxULmVxdWFscyh0YWdMaWJWZXJzaW9uKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19KU1BfVkVSU0lPTjoKLQkJCQlyZXR1cm4gSlNQX1ZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IGpzcFZlcnNpb24gIT0gbnVsbCA6ICFKU1BfVkVSU0lPTl9FREVGQVVMVC5lcXVhbHMoanNwVmVyc2lvbik7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fU0hPUlRfTkFNRToKLQkJCQlyZXR1cm4gU0hPUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2hvcnROYW1lICE9IG51bGwgOiAhU0hPUlRfTkFNRV9FREVGQVVMVC5lcXVhbHMoc2hvcnROYW1lKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR1M6Ci0JCQkJcmV0dXJuIHRhZ3MgIT0gbnVsbCAmJiAhdGFncy5pc0VtcHR5KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SOgotCQkJCXJldHVybiB2YWxpZGF0b3IgIT0gbnVsbDsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGxpc3RlbmVycyAhPSBudWxsICYmICFsaXN0ZW5lcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0ZVTkNUSU9OUzoKLQkJCQlyZXR1cm4gZnVuY3Rpb25zICE9IG51bGwgJiYgIWZ1bmN0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX0VYVEVOU0lPTlM6Ci0JCQkJcmV0dXJuIHRhZ2xpYkV4dGVuc2lvbnMgIT0gbnVsbCAmJiAhdGFnbGliRXh0ZW5zaW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0YWdMaWJWZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YWdMaWJWZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqc3BWZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqc3BWZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzaG9ydE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNob3J0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXJpOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdsaWJGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnbGliRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkNzM4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdsaWJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuQm9keUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgVGFnbGliRmFjdG9yeSB7Ci0gCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFnbGliRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJVGFnbGliRmFjdG9yeSB0aGVUYWdsaWJGYWN0b3J5ID0gKFRhZ2xpYkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoInRhZ2xpYi54bWkiKTsgCi0JCQlpZiAodGhlVGFnbGliRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVRhZ2xpYkZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgVGFnbGliRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnbGliRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7IAkJCi0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQjogcmV0dXJuIGNyZWF0ZVRhZ0xpYigpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUc6IHJldHVybiBjcmVhdGVKU1BUYWcoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURTogcmV0dXJuIGNyZWF0ZUpTUFRhZ0F0dHJpYnV0ZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUjogcmV0dXJuIGNyZWF0ZVZhbGlkYXRvcigpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRTogcmV0dXJuIGNyZWF0ZUpTUFZhcmlhYmxlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT046IHJldHVybiBjcmVhdGVGdW5jdGlvbigpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFOiByZXR1cm4gY3JlYXRlVGFnRmlsZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT046IHJldHVybiBjcmVhdGVUbGRFeHRlbnNpb24oKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuQk9EWV9DT05URU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUJvZHlDb250ZW50VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9TQ1JJUFRJTkdfVkFSSUFCTEVfU0NPUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuQk9EWV9DT05URU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRCb2R5Q29udGVudFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9TQ1JJUFRJTkdfVkFSSUFCTEVfU0NPUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotcHVibGljIHN0YXRpYyBUYWdsaWJGYWN0b3J5IGdldEFjdGl2ZUZhY3RvcnkoKSB7Ci0JcmV0dXJuIChUYWdsaWJGYWN0b3J5KSBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBUYWdMaWIgY3JlYXRlVGFnTGliKCkgewotCQlUYWdMaWJJbXBsIHRhZ0xpYiA9IG5ldyBUYWdMaWJJbXBsKCk7Ci0JCXJldHVybiB0YWdMaWI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoKSB7Ci0JCVZhbGlkYXRvckltcGwgdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvckltcGwoKTsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSlNQVGFnIGNyZWF0ZUpTUFRhZygpIHsKLQkJSlNQVGFnSW1wbCBqc3BUYWcgPSBuZXcgSlNQVGFnSW1wbCgpOwotCQlyZXR1cm4ganNwVGFnOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKU1BUYWdBdHRyaWJ1dGUgY3JlYXRlSlNQVGFnQXR0cmlidXRlKCkgewotCQlKU1BUYWdBdHRyaWJ1dGVJbXBsIGpzcFRhZ0F0dHJpYnV0ZSA9IG5ldyBKU1BUYWdBdHRyaWJ1dGVJbXBsKCk7Ci0JCXJldHVybiBqc3BUYWdBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEpTUFZhcmlhYmxlIGNyZWF0ZUpTUFZhcmlhYmxlKCkgewotCQlKU1BWYXJpYWJsZUltcGwganNwVmFyaWFibGUgPSBuZXcgSlNQVmFyaWFibGVJbXBsKCk7Ci0JCXJldHVybiBqc3BWYXJpYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oKSB7Ci0JCUZ1bmN0aW9uSW1wbCBmdW5jdGlvbiA9IG5ldyBGdW5jdGlvbkltcGwoKTsKLQkJcmV0dXJuIGZ1bmN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYWdGaWxlIGNyZWF0ZVRhZ0ZpbGUoKSB7Ci0JCVRhZ0ZpbGVJbXBsIHRhZ0ZpbGUgPSBuZXcgVGFnRmlsZUltcGwoKTsKLQkJcmV0dXJuIHRhZ0ZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRsZEV4dGVuc2lvbiBjcmVhdGVUbGRFeHRlbnNpb24oKSB7Ci0JCVRsZEV4dGVuc2lvbkltcGwgdGxkRXh0ZW5zaW9uID0gbmV3IFRsZEV4dGVuc2lvbkltcGwoKTsKLQkJcmV0dXJuIHRsZEV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9keUNvbnRlbnRUeXBlIGNyZWF0ZUJvZHlDb250ZW50VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlCb2R5Q29udGVudFR5cGUgcmVzdWx0ID0gQm9keUNvbnRlbnRUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCb2R5Q29udGVudFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBjcmVhdGVKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgcmVzdWx0ID0gSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBUYWdsaWJQYWNrYWdlIGdldFRhZ2xpYlBhY2thZ2UoKSB7Ci0JCXJldHVybiAoVGFnbGliUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFnbGliUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gVGFnbGliUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ2xpYlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdsaWJQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ5ZjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ2xpYlBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5Cb2R5Q29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgVGFnbGliUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBUYWdsaWJQYWNrYWdlLCBFUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFnTGliRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGpzcFRhZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmFsaWRhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGpzcFZhcmlhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZ1bmN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhZ0ZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGxkRXh0ZW5zaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4dGVuc2libGVUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gYm9keUNvbnRlbnRUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW0gPSBudWxsOwotCi0JCSAgIC8qKgotCQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkJICovCi0JcHJpdmF0ZSBUYWdsaWJQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgVGFnbGliRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFnbGliUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoVGFnbGliUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFRhZ2xpYlBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVUYWdsaWJQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVUYWdsaWJQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFnTGliKCkgewotCQlyZXR1cm4gdGFnTGliRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhZ0xpYl9UYWdMaWJWZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnTGliRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnTGliX0pzcFZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJfU2hvcnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnTGliRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnTGliX1VyaSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhZ0xpYkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhZ0xpYl9UYWdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFnTGliRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFnTGliX1ZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRhZ0xpYkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhZ0xpYl9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYWdMaWJfRnVuY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFnTGliRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFnTGliX1RhZ2xpYkV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRWYWxpZGF0b3JfVmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl2YWxpZGF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRWYWxpZGF0b3JfSW5pdFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXZhbGlkYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhbGlkYXRvcl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl2YWxpZGF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEpTUFRhZygpIHsKLQkJcmV0dXJuIGpzcFRhZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BUYWdfQm9keUNvbnRlbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BUYWdfRXhhbXBsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFRhZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFRhZ19OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwVGFnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQVGFnX0R5bmFtaWNBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwVGFnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SlNQVGFnX0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKU1BUYWdfVmFyaWFibGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwVGFnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SlNQVGFnX1RhZ0NsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwVGFnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SlNQVGFnX1RlaUNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwVGFnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKU1BUYWdBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBqc3BUYWdBdHRyaWJ1dGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQVGFnQXR0cmlidXRlX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BUYWdBdHRyaWJ1dGVfUmVxdWlyZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BUYWdBdHRyaWJ1dGVfUnRFeHByVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BUYWdBdHRyaWJ1dGVfRnJhZ21lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKU1BUYWdBdHRyaWJ1dGVfVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpTUFRhZ0F0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEpTUFZhcmlhYmxlKCkgewotCQlyZXR1cm4ganNwVmFyaWFibGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQVmFyaWFibGVfTmFtZUdpdmVuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwVmFyaWFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BWYXJpYWJsZV9OYW1lRnJvbUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFZhcmlhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQVmFyaWFibGVfRGVjbGFyZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFZhcmlhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQVmFyaWFibGVfU2NvcGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BWYXJpYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpTUFZhcmlhYmxlX1ZhcmlhYmxlQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BWYXJpYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpTUFZhcmlhYmxlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcFZhcmlhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGdW5jdGlvbigpIHsKLQkJcmV0dXJuIGZ1bmN0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZ1bmN0aW9uX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmdW5jdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZ1bmN0aW9uX1NpZ25hdHVyZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZ1bmN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RnVuY3Rpb25fRXhhbXBsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZ1bmN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RnVuY3Rpb25fRnVuY3Rpb25DbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZ1bmN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RnVuY3Rpb25fRnVuY3Rpb25FeHRlbnNpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZnVuY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhZ0ZpbGUoKSB7Ci0JCXJldHVybiB0YWdGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhZ0ZpbGVfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhZ0ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdGaWxlX1BhdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnRmlsZV9FeGFtcGxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhZ0ZpbGVfVGFnRXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRhZ0ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRsZEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIHRsZEV4dGVuc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUbGRFeHRlbnNpb25fTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGxkRXh0ZW5zaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGxkRXh0ZW5zaW9uX0V4dGVuc2lvbkVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGxkRXh0ZW5zaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlbnNpYmxlVHlwZSgpIHsKLQkJcmV0dXJuIGV4dGVuc2libGVUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuc2libGVUeXBlX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXh0ZW5zaWJsZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0Qm9keUNvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gYm9keUNvbnRlbnRUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoKSB7Ci0JCXJldHVybiBqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFRhZ2xpYkZhY3RvcnkgZ2V0VGFnbGliRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChUYWdsaWJGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXRhZ0xpYkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQUdfTElCKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX1RBR19MSUJfVkVSU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnTGliRUNsYXNzLCBUQUdfTElCX19KU1BfVkVSU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnTGliRUNsYXNzLCBUQUdfTElCX19TSE9SVF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX1VSSSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFnTGliRUNsYXNzLCBUQUdfTElCX19UQUdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX1ZBTElEQVRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFnTGliRUNsYXNzLCBUQUdfTElCX19MSVNURU5FUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhZ0xpYkVDbGFzcywgVEFHX0xJQl9fRlVOQ1RJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX1RBR0xJQl9FWFRFTlNJT05TKTsKLQotCQlqc3BUYWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSlNQX1RBRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVGFnRUNsYXNzLCBKU1BfVEFHX19CT0RZX0NPTlRFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFRhZ0VDbGFzcywgSlNQX1RBR19fRVhBTVBMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVGFnRUNsYXNzLCBKU1BfVEFHX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BUYWdFQ2xhc3MsIEpTUF9UQUdfX0RZTkFNSUNfQVRUUklCVVRFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwVGFnRUNsYXNzLCBKU1BfVEFHX19BVFRSSUJVVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BUYWdFQ2xhc3MsIEpTUF9UQUdfX1ZBUklBQkxFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwVGFnRUNsYXNzLCBKU1BfVEFHX19UQUdfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpzcFRhZ0VDbGFzcywgSlNQX1RBR19fVEVJX0NMQVNTKTsKLQotCQlqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSlNQX1RBR19BVFRSSUJVVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFRhZ0F0dHJpYnV0ZUVDbGFzcywgSlNQX1RBR19BVFRSSUJVVEVfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFRhZ0F0dHJpYnV0ZUVDbGFzcywgSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MsIEpTUF9UQUdfQVRUUklCVVRFX19SVF9FWFBSX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MsIEpTUF9UQUdfQVRUUklCVVRFX19GUkFHTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwVGFnQXR0cmlidXRlRUNsYXNzLCBKU1BfVEFHX0FUVFJJQlVURV9fVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwVGFnQXR0cmlidXRlRUNsYXNzLCBKU1BfVEFHX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TKTsKLQotCQl2YWxpZGF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVkFMSURBVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh2YWxpZGF0b3JFQ2xhc3MsIFZBTElEQVRPUl9fVkFMSURBVE9SX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh2YWxpZGF0b3JFQ2xhc3MsIFZBTElEQVRPUl9fSU5JVF9QQVJBTVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHZhbGlkYXRvckVDbGFzcywgVkFMSURBVE9SX19ERVNDUklQVElPTlMpOwotCi0JCWpzcFZhcmlhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpTUF9WQVJJQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVmFyaWFibGVFQ2xhc3MsIEpTUF9WQVJJQUJMRV9fTkFNRV9HSVZFTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVmFyaWFibGVFQ2xhc3MsIEpTUF9WQVJJQUJMRV9fTkFNRV9GUk9NX0FUVFJJQlVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVmFyaWFibGVFQ2xhc3MsIEpTUF9WQVJJQUJMRV9fREVDTEFSRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVmFyaWFibGVFQ2xhc3MsIEpTUF9WQVJJQUJMRV9fU0NPUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpzcFZhcmlhYmxlRUNsYXNzLCBKU1BfVkFSSUFCTEVfX1ZBUklBQkxFX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BWYXJpYWJsZUVDbGFzcywgSlNQX1ZBUklBQkxFX19ERVNDUklQVElPTlMpOwotCi0JCWZ1bmN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEZVTkNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmdW5jdGlvbkVDbGFzcywgRlVOQ1RJT05fX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGZ1bmN0aW9uRUNsYXNzLCBGVU5DVElPTl9fU0lHTkFUVVJFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmdW5jdGlvbkVDbGFzcywgRlVOQ1RJT05fX0VYQU1QTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZ1bmN0aW9uRUNsYXNzLCBGVU5DVElPTl9fRlVOQ1RJT05fQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZ1bmN0aW9uRUNsYXNzLCBGVU5DVElPTl9fRlVOQ1RJT05fRVhURU5TSU9OUyk7Ci0KLQkJdGFnRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQUdfRklMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnRmlsZUVDbGFzcywgVEFHX0ZJTEVfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0ZpbGVFQ2xhc3MsIFRBR19GSUxFX19QQVRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdGaWxlRUNsYXNzLCBUQUdfRklMRV9fRVhBTVBMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFnRmlsZUVDbGFzcywgVEFHX0ZJTEVfX1RBR19FWFRFTlNJT05TKTsKLQotCQl0bGRFeHRlbnNpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVExEX0VYVEVOU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGxkRXh0ZW5zaW9uRUNsYXNzLCBUTERfRVhURU5TSU9OX19OQU1FU1BBQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRsZEV4dGVuc2lvbkVDbGFzcywgVExEX0VYVEVOU0lPTl9fRVhURU5TSU9OX0VMRU1FTlRTKTsKLQotCQlleHRlbnNpYmxlVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFWFRFTlNJQkxFX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGV4dGVuc2libGVUeXBlRUNsYXNzLCBFWFRFTlNJQkxFX1RZUEVfX1ZBTFVFKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJYm9keUNvbnRlbnRUeXBlRUVudW0gPSBjcmVhdGVFRW51bShCT0RZX0NPTlRFTlRfVFlQRSk7Ci0JCWpzcFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVFRW51bSA9IGNyZWF0ZUVFbnVtKEpTUF9TQ1JJUFRJTkdfVkFSSUFCTEVfU0NPUEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQlKYXZhUmVmUGFja2FnZSB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJdGFnTGliRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWpzcFRhZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl2YWxpZGF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJanNwVmFyaWFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZnVuY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbkdyb3VwKCkpOwotCQl0YWdGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJdGxkRXh0ZW5zaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWV4dGVuc2libGVUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh0YWdMaWJFQ2xhc3MsIFRhZ0xpYi5jbGFzcywgIlRhZ0xpYiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX1RhZ0xpYlZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRhZ0xpYlZlcnNpb24iLCBudWxsLCAwLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYl9Kc3BWZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqc3BWZXJzaW9uIiwgbnVsbCwgMCwgMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJfU2hvcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzaG9ydE5hbWUiLCBudWxsLCAwLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYl9VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFnTGliX1RhZ3MoKSwgdGhpcy5nZXRKU1BUYWcoKSwgbnVsbCwgInRhZ3MiLCBudWxsLCAxLCAtMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdMaWJfVmFsaWRhdG9yKCksIHRoaXMuZ2V0VmFsaWRhdG9yKCksIG51bGwsICJ2YWxpZGF0b3IiLCBudWxsLCAwLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYl9MaXN0ZW5lcnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRMaXN0ZW5lcigpLCBudWxsLCAibGlzdGVuZXJzIiwgbnVsbCwgMCwgLTEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFnTGliX0Z1bmN0aW9ucygpLCB0aGlzLmdldEZ1bmN0aW9uKCksIG51bGwsICJmdW5jdGlvbnMiLCBudWxsLCAwLCAtMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdMaWJfVGFnbGliRXh0ZW5zaW9ucygpLCB0aGlzLmdldFRsZEV4dGVuc2lvbigpLCBudWxsLCAidGFnbGliRXh0ZW5zaW9ucyIsIG51bGwsIDAsIC0xLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqc3BUYWdFQ2xhc3MsIEpTUFRhZy5jbGFzcywgIkpTUFRhZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnX0JvZHlDb250ZW50KCksIHRoaXMuZ2V0Qm9keUNvbnRlbnRUeXBlKCksICJib2R5Q29udGVudCIsIG51bGwsIDAsIDEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdfRXhhbXBsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIDEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ19EeW5hbWljQXR0cmlidXRlcygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImR5bmFtaWNBdHRyaWJ1dGVzIiwgbnVsbCwgMCwgMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BUYWdfQXR0cmlidXRlcygpLCB0aGlzLmdldEpTUFRhZ0F0dHJpYnV0ZSgpLCBudWxsLCAiYXR0cmlidXRlcyIsIG51bGwsIDAsIC0xLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpTUFRhZ19WYXJpYWJsZXMoKSwgdGhpcy5nZXRKU1BWYXJpYWJsZSgpLCBudWxsLCAidmFyaWFibGVzIiwgbnVsbCwgMCwgLTEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVGFnX1RhZ0NsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAidGFnQ2xhc3MiLCBudWxsLCAxLCAxLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpTUFRhZ19UZWlDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInRlaUNsYXNzIiwgbnVsbCwgMSwgMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoanNwVGFnQXR0cmlidXRlRUNsYXNzLCBKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsICJKU1BUYWdBdHRyaWJ1dGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ0F0dHJpYnV0ZV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdBdHRyaWJ1dGVfUmVxdWlyZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJyZXF1aXJlZCIsIG51bGwsIDAsIDEsIEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdBdHRyaWJ1dGVfUnRFeHByVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJydEV4cHJWYWx1ZSIsICJmYWxzZSIsIDAsIDEsIEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdBdHRyaWJ1dGVfRnJhZ21lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJmcmFnbWVudCIsIG51bGwsIDAsIDEsIEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVGFnQXR0cmlidXRlX1R5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJ0eXBlIiwgbnVsbCwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BUYWdBdHRyaWJ1dGVfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh2YWxpZGF0b3JFQ2xhc3MsIFZhbGlkYXRvci5jbGFzcywgIlZhbGlkYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VmFsaWRhdG9yX1ZhbGlkYXRvckNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAidmFsaWRhdG9yQ2xhc3MiLCBudWxsLCAwLCAxLCBWYWxpZGF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFZhbGlkYXRvcl9Jbml0UGFyYW1zKCksIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5nZXRJbml0UGFyYW0oKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgVmFsaWRhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRWYWxpZGF0b3JfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBWYWxpZGF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqc3BWYXJpYWJsZUVDbGFzcywgSlNQVmFyaWFibGUuY2xhc3MsICJKU1BWYXJpYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVmFyaWFibGVfTmFtZUdpdmVuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lR2l2ZW4iLCBudWxsLCAwLCAxLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVmFyaWFibGVfTmFtZUZyb21BdHRyaWJ1dGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVGcm9tQXR0cmlidXRlIiwgbnVsbCwgMCwgMSwgSlNQVmFyaWFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFZhcmlhYmxlX0RlY2xhcmUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJkZWNsYXJlIiwgbnVsbCwgMCwgMSwgSlNQVmFyaWFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFZhcmlhYmxlX1Njb3BlKCksIHRoaXMuZ2V0SlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSgpLCAic2NvcGUiLCBudWxsLCAwLCAxLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVmFyaWFibGVfVmFyaWFibGVDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInZhcmlhYmxlQ2xhc3MiLCBudWxsLCAwLCAxLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVmFyaWFibGVfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGZ1bmN0aW9uRUNsYXNzLCBGdW5jdGlvbi5jbGFzcywgIkZ1bmN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGdW5jdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRnVuY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZ1bmN0aW9uX1NpZ25hdHVyZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2lnbmF0dXJlIiwgbnVsbCwgMCwgMSwgRnVuY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZ1bmN0aW9uX0V4YW1wbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImV4YW1wbGUiLCBudWxsLCAwLCAxLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RnVuY3Rpb25fRnVuY3Rpb25DbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImZ1bmN0aW9uQ2xhc3MiLCBudWxsLCAxLCAxLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RnVuY3Rpb25fRnVuY3Rpb25FeHRlbnNpb25zKCksIHRoaXMuZ2V0VGxkRXh0ZW5zaW9uKCksIG51bGwsICJmdW5jdGlvbkV4dGVuc2lvbnMiLCBudWxsLCAwLCAtMSwgRnVuY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0YWdGaWxlRUNsYXNzLCBUYWdGaWxlLmNsYXNzLCAiVGFnRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnRmlsZV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgVGFnRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnRmlsZV9QYXRoKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXRoIiwgbnVsbCwgMCwgMSwgVGFnRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnRmlsZV9FeGFtcGxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJleGFtcGxlIiwgbnVsbCwgMCwgMSwgVGFnRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFnRmlsZV9UYWdFeHRlbnNpb25zKCksIHRoaXMuZ2V0VGxkRXh0ZW5zaW9uKCksIG51bGwsICJ0YWdFeHRlbnNpb25zIiwgbnVsbCwgMCwgLTEsIFRhZ0ZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0bGRFeHRlbnNpb25FQ2xhc3MsIFRsZEV4dGVuc2lvbi5jbGFzcywgIlRsZEV4dGVuc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGxkRXh0ZW5zaW9uX05hbWVzcGFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlIiwgbnVsbCwgMCwgMSwgVGxkRXh0ZW5zaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUbGRFeHRlbnNpb25fRXh0ZW5zaW9uRWxlbWVudHMoKSwgdGhpcy5nZXRFeHRlbnNpYmxlVHlwZSgpLCBudWxsLCAiZXh0ZW5zaW9uRWxlbWVudHMiLCBudWxsLCAxLCAtMSwgVGxkRXh0ZW5zaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXh0ZW5zaWJsZVR5cGVFQ2xhc3MsIEV4dGVuc2libGVUeXBlLmNsYXNzLCAiRXh0ZW5zaWJsZVR5cGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXh0ZW5zaWJsZVR5cGVfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgRXh0ZW5zaWJsZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGJvZHlDb250ZW50VHlwZUVFbnVtLCBCb2R5Q29udGVudFR5cGUuY2xhc3MsICJCb2R5Q29udGVudFR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGJvZHlDb250ZW50VHlwZUVFbnVtLCBCb2R5Q29udGVudFR5cGUuVEFHREVQRU5ERU5UX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5KU1BfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChib2R5Q29udGVudFR5cGVFRW51bSwgQm9keUNvbnRlbnRUeXBlLkVNUFRZX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5TQ1JJUFRMRVNTX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW0sIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuY2xhc3MsICJKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW0sIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuTkVTVEVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoanNwU2NyaXB0aW5nVmFyaWFibGVTY29wZUVFbnVtLCBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLkFUX0JFR0lOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoanNwU2NyaXB0aW5nVmFyaWFibGVTY29wZUVFbnVtLCBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLkFUX0VORF9MSVRFUkFMKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vVGFnbGliUGFja2FnZUltcGwKLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGxkRXh0ZW5zaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGxkRXh0ZW5zaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWUxZDllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RsZEV4dGVuc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRsZCBFeHRlbnNpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRsZEV4dGVuc2lvbkltcGwjZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRsZEV4dGVuc2lvbkltcGwjZ2V0RXh0ZW5zaW9uRWxlbWVudHMgPGVtPkV4dGVuc2lvbiBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRsZEV4dGVuc2lvbkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBUbGRFeHRlbnNpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2UoKSA8ZW0+TmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2UoKSA8ZW0+TmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlID0gTkFNRVNQQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKSA8ZW0+RXh0ZW5zaW9uIEVsZW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuc2lvbkVsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5zaW9uRWxlbWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRsZEV4dGVuc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLkxpdGVyYWxzLlRMRF9FWFRFTlNJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuZXdOYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZE5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJbmFtZXNwYWNlID0gbmV3TmFtZXNwYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX05BTUVTUEFDRSwgb2xkTmFtZXNwYWNlLCBuYW1lc3BhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKSB7Ci0JCWlmIChleHRlbnNpb25FbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlleHRlbnNpb25FbGVtZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbnNpYmxlVHlwZS5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19FWFRFTlNJT05fRUxFTUVOVFMpOwotCQl9Ci0JCXJldHVybiBleHRlbnNpb25FbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTl9fRVhURU5TSU9OX0VMRU1FTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTl9fTkFNRVNQQUNFOgotCQkJCXJldHVybiBnZXROYW1lc3BhY2UoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19FWFRFTlNJT05fRUxFTUVOVFM6Ci0JCQkJcmV0dXJuIGdldEV4dGVuc2lvbkVsZW1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19OQU1FU1BBQ0U6Ci0JCQkJc2V0TmFtZXNwYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19FWFRFTlNJT05fRUxFTUVOVFM6Ci0JCQkJZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuc2lvbkVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX05BTUVTUEFDRToKLQkJCQlzZXROYW1lc3BhY2UoTkFNRVNQQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTl9fRVhURU5TSU9OX0VMRU1FTlRTOgotCQkJCWdldEV4dGVuc2lvbkVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19OQU1FU1BBQ0U6Ci0JCQkJcmV0dXJuIE5BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlICE9IG51bGwgOiAhTkFNRVNQQUNFX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2UpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX0VYVEVOU0lPTl9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gZXh0ZW5zaW9uRWxlbWVudHMgIT0gbnVsbCAmJiAhZXh0ZW5zaW9uRWxlbWVudHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZXNwYWNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lc3BhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UbGRFeHRlbnNpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9WYWxpZGF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9WYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYTQ2YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVmFsaWRhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotCi0KLS8qKgotICogVGhlIHZhbGlkYXRvciBlbGVtZW50IHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGFuIG9wdGlvbmFsIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgdmFsaWRhdG9yQ2xhc3MgPSBudWxsOwotCXB1YmxpYyBWYWxpZGF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuTGl0ZXJhbHMuVkFMSURBVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0VmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCWlmICh2YWxpZGF0b3JDbGFzcyAhPSBudWxsICYmIHZhbGlkYXRvckNsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRWYWxpZGF0b3JDbGFzcyA9IChJbnRlcm5hbEVPYmplY3QpdmFsaWRhdG9yQ2xhc3M7Ci0JCQl2YWxpZGF0b3JDbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRWYWxpZGF0b3JDbGFzcyk7Ci0JCQlpZiAodmFsaWRhdG9yQ2xhc3MgIT0gb2xkVmFsaWRhdG9yQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fVkFMSURBVE9SX0NMQVNTLCBvbGRWYWxpZGF0b3JDbGFzcywgdmFsaWRhdG9yQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsaWRhdG9yQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFZhbGlkYXRvckNsYXNzKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yQ2xhc3MoSmF2YUNsYXNzIG5ld1ZhbGlkYXRvckNsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRWYWxpZGF0b3JDbGFzcyA9IHZhbGlkYXRvckNsYXNzOwotCQl2YWxpZGF0b3JDbGFzcyA9IG5ld1ZhbGlkYXRvckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fVkFMSURBVE9SX0NMQVNTLCBvbGRWYWxpZGF0b3JDbGFzcywgdmFsaWRhdG9yQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW5pdFBhcmFtcygpIHsKLQkJaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkgewotCQkJaW5pdFBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbml0UGFyYW0uY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19JTklUX1BBUkFNUyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRQYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX1ZBTElEQVRPUl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFZhbGlkYXRvckNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0VmFsaWRhdG9yQ2xhc3MoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRJbml0UGFyYW1zKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1M6Ci0JCQkJc2V0VmFsaWRhdG9yQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fVkFMSURBVE9SX0NMQVNTOgotCQkJCXNldFZhbGlkYXRvckNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1M6Ci0JCQkJcmV0dXJuIHZhbGlkYXRvckNsYXNzICE9IG51bGw7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gaW5pdFBhcmFtcyAhPSBudWxsICYmICFpbml0UGFyYW1zLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCXByb3RlY3RlZCBFTGlzdCBpbml0UGFyYW1zPW51bGw7Ci0KLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXByb3RlY3RlZCBib29sZWFuIHNldFZhbGlkYXRvckNsYXNzPWZhbHNlOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL3V0aWwvVGFnbGliQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC91dGlsL1RhZ2xpYkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDQwNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL3V0aWwvVGFnbGliQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yOwotCi0KLQotcHVibGljIGNsYXNzIFRhZ2xpYkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFRhZ2xpYlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHVibGljIFRhZ2xpYkFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSk7Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCl0eXBlKS5lQ2xhc3MoKS5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFnbGliU3dpdGNoIHN3ID0gbmV3IFRhZ2xpYlN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlVGFnTGliKFRhZ0xpYiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUYWdMaWJBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlVmFsaWRhdG9yKFZhbGlkYXRvciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVWYWxpZGF0b3JBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlSlNQVGFnKEpTUFRhZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVKU1BUYWdBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlSlNQVGFnQXR0cmlidXRlKEpTUFRhZ0F0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVKU1BUYWdBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlSlNQVmFyaWFibGUoSlNQVmFyaWFibGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSlNQVmFyaWFibGVBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKXN3LmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFnTGliQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVmFsaWRhdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQVGFnQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQVGFnQXR0cmlidXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQVmFyaWFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZUdlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFnbGliU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IFRhZ2xpYlN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0xpYihUYWdMaWIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhZ0xpYkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpTUFRhZyhKU1BUYWcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpTUFRhZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpTUFRhZ0F0dHJpYnV0ZShKU1BUYWdBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpTUFRhZ0F0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVZhbGlkYXRvcihWYWxpZGF0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbGlkYXRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpTUFZhcmlhYmxlKEpTUFZhcmlhYmxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKU1BWYXJpYWJsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUZ1bmN0aW9uKEZ1bmN0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVGdW5jdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0ZpbGUoVGFnRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFnRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRsZEV4dGVuc2lvbihUbGRFeHRlbnNpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRsZEV4dGVuc2lvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuc2libGVUeXBlKEV4dGVuc2libGVUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbnNpYmxlVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJHZW4oTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFnTGliQWRhcHRlckdlbigpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVmFsaWRhdG9yQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQVGFnQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQVGFnQXR0cmlidXRlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQVmFyaWFibGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiA8ZW0+RnVuY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZ1bmN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSA8ZW0+VGFnIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFnRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbiA8ZW0+VGxkIEV4dGVuc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRsZEV4dGVuc2lvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlIDxlbT5FeHRlbnNpYmxlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuc2libGVUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QgPGVtPkoyRUVFIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1RhZ2xpYkFkYXB0ZXJGYWN0b3J5Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvdXRpbC9UYWdsaWJTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC91dGlsL1RhZ2xpYlN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDFiZDg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC91dGlsL1RhZ2xpYlN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYkZhY3RvcnlJbXBsOwotCi1wdWJsaWMgY2xhc3MgVGFnbGliU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRhZ2xpYlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBUYWdsaWJGYWN0b3J5IGZhY3Rvcnk7Ci0KLQlwdWJsaWMgVGFnbGliU3dpdGNoKCkgewotCQlmYWN0b3J5ID0gKFRhZ2xpYkZhY3RvcnkpVGFnbGliRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQkJbW9kZWxQYWNrYWdlID0gVGFnbGliRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCX0KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQkgICAgIEVDbGFzcyB0aGVFQ2xhc3MgPSB0aGVFT2JqZWN0LmVDbGFzcygpOwotICAgICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgIT0gbW9kZWxQYWNrYWdlKSByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgIAotCQlzd2l0Y2ggKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUI6Ci0JCQkgICAgewotCQkJCVRhZ0xpYiBjYXN0ZWRPYmplY3QgPSAoVGFnTGliKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYWdMaWIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkgICAgfQotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUjoKLQkJCSAgICB7Ci0JCQkJVmFsaWRhdG9yIGNhc3RlZE9iamVjdCA9IChWYWxpZGF0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbGlkYXRvcihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCSAgICB9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBRzoKLQkJCSAgICB7Ci0JCQkJSlNQVGFnIGNhc3RlZE9iamVjdCA9IChKU1BUYWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpTUFRhZyhjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCSAgICB9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEU6Ci0JCQkgICAgewotCQkJCUpTUFRhZ0F0dHJpYnV0ZSBjYXN0ZWRPYmplY3QgPSAoSlNQVGFnQXR0cmlidXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BUYWdBdHRyaWJ1dGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkgICAgfQotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRToKLQkJCSAgICB7Ci0JCQkJSlNQVmFyaWFibGUgY2FzdGVkT2JqZWN0ID0gKEpTUFZhcmlhYmxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BWYXJpYWJsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCSAgICB9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9IC8vIGRvU3dpdGNoCi0KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWIoVGFnTGliIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VWYWxpZGF0b3IoVmFsaWRhdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWcoSlNQVGFnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWdBdHRyaWJ1dGUoSlNQVGFnQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BWYXJpYWJsZShKU1BWYXJpYWJsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaEdlbihFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUI6IHsKLQkJCQlUYWdMaWIgdGFnTGliID0gKFRhZ0xpYil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFnTGliKHRhZ0xpYik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAodGFnTGliKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKHRhZ0xpYik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QodGFnTGliKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBRzogewotCQkJCUpTUFRhZyBqc3BUYWcgPSAoSlNQVGFnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BUYWcoanNwVGFnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGpzcFRhZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoanNwVGFnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEU6IHsKLQkJCQlKU1BUYWdBdHRyaWJ1dGUganNwVGFnQXR0cmlidXRlID0gKEpTUFRhZ0F0dHJpYnV0ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSlNQVGFnQXR0cmlidXRlKGpzcFRhZ0F0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoanNwVGFnQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SOiB7Ci0JCQkJVmFsaWRhdG9yIHZhbGlkYXRvciA9IChWYWxpZGF0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbGlkYXRvcih2YWxpZGF0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHZhbGlkYXRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRTogewotCQkJCUpTUFZhcmlhYmxlIGpzcFZhcmlhYmxlID0gKEpTUFZhcmlhYmxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BWYXJpYWJsZShqc3BWYXJpYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoanNwVmFyaWFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTjogewotCQkJCUZ1bmN0aW9uIGZ1bmN0aW9uID0gKEZ1bmN0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGdW5jdGlvbihmdW5jdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChmdW5jdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZnVuY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRTogewotCQkJCVRhZ0ZpbGUgdGFnRmlsZSA9IChUYWdGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYWdGaWxlKHRhZ0ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAodGFnRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QodGFnRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT046IHsKLQkJCQlUbGRFeHRlbnNpb24gdGxkRXh0ZW5zaW9uID0gKFRsZEV4dGVuc2lvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGxkRXh0ZW5zaW9uKHRsZEV4dGVuc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QodGxkRXh0ZW5zaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRVhURU5TSUJMRV9UWVBFOiB7Ci0JCQkJRXh0ZW5zaWJsZVR5cGUgZXh0ZW5zaWJsZVR5cGUgPSAoRXh0ZW5zaWJsZVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVUeXBlKGV4dGVuc2libGVUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChleHRlbnNpYmxlVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFnTGliR2VuKFRhZ0xpYiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmFsaWRhdG9yR2VuKFZhbGlkYXRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSlNQVGFnR2VuKEpTUFRhZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSlNQVGFnQXR0cmlidXRlR2VuKEpTUFRhZ0F0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSlNQVmFyaWFibGVHZW4oSlNQVmFyaWFibGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GdW5jdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GdW5jdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRnVuY3Rpb24oRnVuY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWcgRmlsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWcgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFnRmlsZShUYWdGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGxkIEV4dGVuc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UbGQgRXh0ZW5zaW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUbGRFeHRlbnNpb24oVGxkRXh0ZW5zaW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJsZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2libGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJsZVR5cGUoRXh0ZW5zaWJsZVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlR2VuKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1RhZ2xpYlN3aXRjaAotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0F1dGhDb25zdHJhaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9BdXRoQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2EyNWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0F1dGhDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFRoZSBhdXRoLWNvbnN0cmFpbnQgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdCBzaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24uIFRoZSByb2xlIHVzZWQgaGVyZSBtdXN0IGFwcGVhciBpbiBhIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQuCi0gKiBAc2luY2UgMS4wCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXV0aENvbnN0cmFpbnQgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGF1dGggY29uc3RyYWludC4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUm9sZXMgYXR0cmlidXRlCi0JICogQSBsaXN0IG9mIHJvbGUgbmFtZXMgZm9yIHRoZSBhdXRoIGNvbnN0cmFpbnQuICBFYWNoIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICogb2YgYSBzZWN1cml0eSByb2xlIChhIFN0cmluZykuCi0KLQkgKi8KLQlFTGlzdCBnZXRSb2xlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgU2VjQ29uc3RyYWludCByZWZlcmVuY2UKLQkgKi8KLQlTZWN1cml0eUNvbnN0cmFpbnQgZ2V0U2VjQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIFNlY0NvbnN0cmFpbnQgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRTZWNDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9BdXRoTWV0aG9kS2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vQXV0aE1ldGhvZEtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxYWI4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9BdXRoTWV0aG9kS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0vKioKLSAqIAotICogQHNpbmNlIDEuMAotICoKLSAqLwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBdXRoTWV0aG9kS2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNQRUNJRklFRCA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTSUMgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0VTVCA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STSA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX0NFUlQgPSA0OwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVOU1BFQ0lGSUVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VU5TUEVDSUZJRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVU5TUEVDSUZJRUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEF1dGhNZXRob2RLaW5kIFVOU1BFQ0lGSUVEX0xJVEVSQUwgPSBuZXcgQXV0aE1ldGhvZEtpbmQoVU5TUEVDSUZJRUQsICJVTlNQRUNJRklFRCIsICJVTlNQRUNJRklFRCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJBU0lDPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QkFTSUM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQkFTSUMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEF1dGhNZXRob2RLaW5kIEJBU0lDX0xJVEVSQUwgPSBuZXcgQXV0aE1ldGhvZEtpbmQoQkFTSUMsICJCQVNJQyIsICJCQVNJQyIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRJR0VTVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRJR0VTVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNESUdFU1QKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEF1dGhNZXRob2RLaW5kIERJR0VTVF9MSVRFUkFMID0gbmV3IEF1dGhNZXRob2RLaW5kKERJR0VTVCwgIkRJR0VTVCIsICJESUdFU1QiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GT1JNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Rk9STTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGT1JNCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoTWV0aG9kS2luZCBGT1JNX0xJVEVSQUwgPSBuZXcgQXV0aE1ldGhvZEtpbmQoRk9STSwgIkZPUk0iLCAiRk9STSIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNMSUVOVCBDRVJUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0xJRU5UIENFUlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0xJRU5UX0NFUlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEF1dGhNZXRob2RLaW5kIENMSUVOVF9DRVJUX0xJVEVSQUwgPSBuZXcgQXV0aE1ldGhvZEtpbmQoQ0xJRU5UX0NFUlQsICJDTElFTlRfQ0VSVCIsICJDTElFTlRfQ0VSVCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5BdXRoIE1ldGhvZCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBdXRoTWV0aG9kS2luZFtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBBdXRoTWV0aG9kS2luZFtdIHsKLQkJCVVOU1BFQ0lGSUVEX0xJVEVSQUwsCi0JCQlCQVNJQ19MSVRFUkFMLAotCQkJRElHRVNUX0xJVEVSQUwsCi0JCQlGT1JNX0xJVEVSQUwsCi0JCQlDTElFTlRfQ0VSVF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkF1dGggTWV0aG9kIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkF1dGggTWV0aG9kIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gbmFtZSBwYXNzZXMgbGl0ZXJhbCBuYW1lCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXV0aE1ldGhvZEtpbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlBdXRoTWV0aG9kS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkF1dGggTWV0aG9kIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRoTWV0aG9kS2luZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUF1dGhNZXRob2RLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BdXRoIE1ldGhvZCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXV0aE1ldGhvZEtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFVOU1BFQ0lGSUVEOiByZXR1cm4gVU5TUEVDSUZJRURfTElURVJBTDsKLQkJCWNhc2UgQkFTSUM6IHJldHVybiBCQVNJQ19MSVRFUkFMOwotCQkJY2FzZSBESUdFU1Q6IHJldHVybiBESUdFU1RfTElURVJBTDsKLQkJCWNhc2UgRk9STTogcmV0dXJuIEZPUk1fTElURVJBTDsKLQkJCWNhc2UgQ0xJRU5UX0NFUlQ6IHJldHVybiBDTElFTlRfQ0VSVF9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBdXRoTWV0aG9kS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vQXV0aE1ldGhvZEtpbmQKLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0NvbnRleHRQYXJhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vQ29udGV4dFBhcmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMGE1ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vQ29udGV4dFBhcmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KLSAqIEBzaW5jZSAxLjAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZXh0UGFyYW0gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFBhcmFtTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLgotCSAqLwotCVN0cmluZyBnZXRQYXJhbU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBQYXJhbU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRQYXJhbU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBQYXJhbVZhbHVlIGF0dHJpYnV0ZQotCSAqIFRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFyYW1WYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFBhcmFtVmFsdWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCVdlYkFwcCBnZXRXZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Rpc3BhdGNoZXJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9EaXNwYXRjaGVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWQwNmEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Rpc3BhdGNoZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0RGlzcGF0Y2hlclR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaXNwYXRjaGVyVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZPUldBUkQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGT1JXQVJEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOQ0xVREU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTkNMVURFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFUVVFU1Q8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVFVRVNUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVSUk9SPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVJST1JfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZPUldBUkQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GT1JXQVJEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZPUldBUkQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpc3BhdGNoZXJUeXBlIEZPUldBUkRfTElURVJBTCA9IG5ldyBEaXNwYXRjaGVyVHlwZShGT1JXQVJELCAiRk9SV0FSRCIsICJGT1JXQVJEIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5DTFVERTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOQ0xVREU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5DTFVERQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGF0Y2hlclR5cGUgSU5DTFVERV9MSVRFUkFMID0gbmV3IERpc3BhdGNoZXJUeXBlKElOQ0xVREUsICJJTkNMVURFIiwgIklOQ0xVREUiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVFVRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVRVUVTVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVFVRVNUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBSRVFVRVNUX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoUkVRVUVTVCwgIlJFUVVFU1QiLCAiUkVRVUVTVCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVSUk9SPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RVJST1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVJST1IKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpc3BhdGNoZXJUeXBlIEVSUk9SX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoRVJST1IsICJFUlJPUiIsICJFUlJPUiIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERpc3BhdGNoZXJUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IERpc3BhdGNoZXJUeXBlW10gewotCQkJRk9SV0FSRF9MSVRFUkFMLAotCQkJSU5DTFVERV9MSVRFUkFMLAotCQkJUkVRVUVTVF9MSVRFUkFMLAotCQkJRVJST1JfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwYXRjaGVyVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURpc3BhdGNoZXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGlzcGF0Y2hlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzcGF0Y2hlclR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEaXNwYXRjaGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGlzcGF0Y2hlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzcGF0Y2hlclR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEZPUldBUkQ6IHJldHVybiBGT1JXQVJEX0xJVEVSQUw7Ci0JCQljYXNlIElOQ0xVREU6IHJldHVybiBJTkNMVURFX0xJVEVSQUw7Ci0JCQljYXNlIFJFUVVFU1Q6IHJldHVybiBSRVFVRVNUX0xJVEVSQUw7Ci0JCQljYXNlIEVSUk9SOiByZXR1cm4gRVJST1JfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlzcGF0Y2hlclR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL0Rpc3BhdGNoZXJUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9FcnJvckNvZGVFcnJvclBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Vycm9yQ29kZUVycm9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGYwNTFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Vycm9yQ29kZUVycm9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVycm9yQ29kZUVycm9yUGFnZSBleHRlbmRzIEVycm9yUGFnZXsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRXJyb3JDb2RlIGF0dHJpYnV0ZQotCSAqIFRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAotCi0JICovCi0JU3RyaW5nIGdldEVycm9yQ29kZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEVycm9yQ29kZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEVycm9yQ29kZShTdHJpbmcgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRXJyb3JQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9FcnJvclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmYmE5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9FcnJvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgZXJyb3ItcGFnZSBlbGVtZW50IGNvbnRhaW5zIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGVycm9yIGNvZGUgb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXJyb3JQYWdlIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi1wdWJsaWMgYm9vbGVhbiBpc0Vycm9yQ29kZSgpOwotcHVibGljIGJvb2xlYW4gaXNFeGNlcHRpb25UeXBlKCk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExvY2F0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHdlYgotCSAqIGFwcGxpY2F0aW9uCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTG9jYXRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCVdlYkFwcCBnZXRXZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFdlYkFwcChXZWJBcHAgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRXhjZXB0aW9uVHlwZUVycm9yUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRXhjZXB0aW9uVHlwZUVycm9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTkwZmMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGNlcHRpb25UeXBlRXJyb3JQYWdlIGV4dGVuZHMgRXJyb3JQYWdlIHsKLQotCi0KLQotcHVibGljIFN0cmluZyBnZXRFeGNlcHRpb25UeXBlTmFtZSgpIDsKLXZvaWQgc2V0RXhjZXB0aW9uVHlwZU5hbWUoU3RyaW5nIGV4Y2VwdGlvblR5cGVOYW1lKSA7Ci0vKioKLSAqIEBkZXByZWNhdGVkIFVzZSBAbGlua3sjc2V0RXhjZXB0aW9uVHlwZU5hbWUoU3RyaW5nKX0KLSAqLwotdm9pZCBzZXRFeGNlcHRpb25UeXBlTmFtZShTdHJpbmcgZXhjZXB0aW9uVHlwZU5hbWUsIFJlc291cmNlU2V0IGNvbnRleHQpIDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFeGNlcHRpb25UeXBlIHJlZmVyZW5jZQotCSAqIFRoZSBleGNlcHRpb24gdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24KLQkgKiB0eXBlLgotCSAqLwotCUphdmFDbGFzcyBnZXRFeGNlcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBFeGNlcHRpb25UeXBlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RXhjZXB0aW9uVHlwZShKYXZhQ2xhc3MgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwYjZkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpbHRlciBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0byBlaXRoZXIgYSBzZXJ2bGV0IG9yIGEgVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZSBmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgotCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmlsdGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXB7Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyQ2xhc3NOYW1lKCk7Ci1wdWJsaWMgdm9pZCBzZXRGaWx0ZXJDbGFzc05hbWUoU3RyaW5nIGZpbHRlckNsYXNzTmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZmlsdGVyLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBtYXAgdGhlIGZpbHRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEluaXRQYXJhbXMgcmVmZXJlbmNlcwotCSAqIFRoZSBpbml0LXBhcmFtcyBjb250YWluIGEgbmFtZS8vdmFsdWUgcGFpcnMgYXMgaW5pdGlhbGl6YXRpb24gcGFyYW1zIGZvciB0aGUKLQkgKiBmaWx0ZXIKLQotCSAqLwotCUVMaXN0IGdldEluaXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEZpbHRlckNsYXNzIHJlZmVyZW5jZQotCSAqIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCi0JICovCi0JSmF2YUNsYXNzIGdldEZpbHRlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGaWx0ZXJDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEZpbHRlckNsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtIFZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXQgUGFyYW0gVmFsdWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMKLQkgKiAgICAgICAgIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtIG9mIGEgc2VydmxldCBmaWx0ZXIKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbSBWYWx1ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0RmlsdGVyX0luaXRQYXJhbVZhbHVlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SW5pdFBhcmFtVmFsdWVzKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9GaWx0ZXJNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9GaWx0ZXJNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjA2NTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRmlsdGVyTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogRGVjbGFyYXRpb24gb2YgdGhlIGZpbHRlciBtYXBwaW5ncyBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIGNvbnRhaW5lciB1c2VzIHRoZSBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgdG8gYSByZXF1ZXN0LCBhbmQgaW4gd2hhdCBvcmRlci4gVGhlIGNvbnRhaW5lciBtYXRjaGVzIHRoZSByZXF1ZXN0IFVSSSB0byBhIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IGl0IG1hdGNoZXMgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIGVpdGhlciBvbiBzZXJ2bGV0LW5hbWUsIG9yIG9uIHVybC1wYXR0ZXJuIGZvciBlYWNoIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIGRlcGVuZGluZyBvbiB3aGljaCBzdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4gd2hpY2ggZmlsdGVycyBhcmUgaW52b2tlZCBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRoYXQgbWF0Y2ggYSByZXF1ZXN0IFVSSSBmb3IgYSBzZXJ2bGV0IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXItbWFwcGluZyBlbGVtZW50cy5UaGUgZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIDxmaWx0ZXJuYW1lPiBzdWItZWxlbWVudHMgb2Ygb25lIG9mIHRoZSA8ZmlsdGVyPiBkZWNsYXJhdGlvbnMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqIAotICogQGludmFyaWFudCBUaGUgZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIEZpbHRlcjo6bmFtZSBvZiBvbmUgb2YgdGhlIEZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXJNYXBwaW5nIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHNlcnZsZXQgdGhhdCB0aGlzIG1hcHBpbmcgYXBwbGllcyB0by4KLSAqLwotcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpOwotLyoqCi0gKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBzZXJ2bGV0IHRoYXQgdGhpcyBtYXBwaW5nIGFwcGxpZXMgdG8uCi0gKi8KLXB1YmxpYyB2b2lkIHNldFNlcnZsZXROYW1lKFN0cmluZyBzZXJ2bGV0TmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFVybFBhdHRlcm4gYXR0cmlidXRlCi0JICogVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBNdXN0IGZvbGxvdwotCSAqIHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMCBvZiB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0VXJsUGF0dGVybigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFVybFBhdHRlcm4gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVcmxQYXR0ZXJuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZX0uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGF0Y2hlciBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGF0Y2hlciBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRGaWx0ZXJNYXBwaW5nX0Rpc3BhdGNoZXJUeXBlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGUiIHVwcGVyPSI0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREaXNwYXRjaGVyVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRmlsdGVyIHJlZmVyZW5jZQotCSAqIFRoZSBmaWx0ZXIgYmVpbmcgbWFwcGVkCi0JICovCi0JRmlsdGVyIGdldEZpbHRlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRmlsdGVyIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RmlsdGVyKEZpbHRlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTZXJ2bGV0IHJlZmVyZW5jZQotCSAqIEFuIG9wdGlvbmFsIHNlcnZsZXQgdGhhdCBpcyBtYXBwZWQgYnkgYSBmaWx0ZXIgbWFwcGluZy4gIHNlcnZsZXROYW1lIGlzIHVzZWQgdG8gCi0JICogcmVzb2x2ZSB0aGUgc2VydmxldCByZWZlcmVuY2UuCi0JICovCi0JU2VydmxldCBnZXRTZXJ2bGV0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTZXJ2bGV0IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0U2VydmxldChTZXJ2bGV0IHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Zvcm1Mb2dpbkNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRm9ybUxvZ2luQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZjE1MWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRm9ybUxvZ2luQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIGZvcm0tbG9naW4tY29uZmlnIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IgcGFnZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGb3JtTG9naW5Db25maWcgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEZvcm1Mb2dpblBhZ2UgYXR0cmlidXRlCi0JICogVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBwYWdlCi0JICogdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlIGZvdW5kCi0JICovCi0JU3RyaW5nIGdldEZvcm1Mb2dpblBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGb3JtTG9naW5QYWdlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Rm9ybUxvZ2luUGFnZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEZvcm1FcnJvclBhZ2UgYXR0cmlidXRlCi0JICogVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciAKLQkgKiBwYWdlIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kCi0JICovCi0JU3RyaW5nIGdldEZvcm1FcnJvclBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGb3JtRXJyb3JQYWdlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Rm9ybUVycm9yUGFnZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgTG9naW5Db25maWcgcmVmZXJlbmNlCi0JICovCi0JTG9naW5Db25maWcgZ2V0TG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExvZ2luQ29uZmlnIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TG9naW5Db25maWcoTG9naW5Db25maWcgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSFRUUE1ldGhvZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0hUVFBNZXRob2RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NTQ0YTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSFRUUE1ldGhvZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAgQGRlcHJlY2F0ZWQgc2luY2UgNC8yNS8yMDAzIHVzZSBsaXN0IG9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb259Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGUjZ2V0SHR0cE1ldGhvZCA8ZW0+SHR0cCBNZXRob2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRIVFRQTWV0aG9kVHlwZSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUE1ldGhvZFR5cGUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHR0cCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkh0dHAgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh0dHAgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIdHRwTWV0aG9kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRIVFRQTWV0aG9kVHlwZV9IdHRwTWV0aG9kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh0dHBNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlI2dldEh0dHBNZXRob2QgPGVtPkh0dHAgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IdHRwIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHR0cE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHR0cE1ldGhvZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEhUVFBNZXRob2RUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9IVFRQTWV0aG9kVHlwZUVudW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0hUVFBNZXRob2RUeXBlRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTQ1NzcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0hUVFBNZXRob2RUeXBlRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5IVFRQIE1ldGhvZCBUeXBlIEVudW08L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldEhUVFBNZXRob2RUeXBlRW51bSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEhUVFBNZXRob2RUeXBlRW51bSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+R0VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGh0dHAtbWV0aG9kIGNvbnRhaW5zIGFuIEhUVFAgbWV0aG9kIChHRVQgfCBQT1NUIHwuLi4pCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0dFVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBPU1Q8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQT1NUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBVVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BVVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVUID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRFTEVURTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0RFTEVURV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkhFQUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNIRUFEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUFEID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9QVElPTlM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPUFRJT05TX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05TID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRSQUNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVFJBQ0VfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQUNFID0gNjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDTCA9IDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTRUxJTkVfQ09OVFJPTCA9IDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklORCA9IDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tJTiA9IDEwOyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEVDS09VVCA9IDExOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBQkVMID0gMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVSR0UgPSAxMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNS0FDVElWSVRZID0gMTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUtXT1JLU1BBQ0UgPSAxNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUJJTkQgPSAxNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBPUlQgPSAxNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUFSQ0ggPSAxODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJJTkQgPSAxOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkNIRUNLT1VUID0gMjA7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURSA9IDIxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fQ09OVFJPTCA9IDIyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDSyA9IDIzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJZRSA9IDI0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTkNFTCA9IDI1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPUFkgPSAyNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUlJFU1BPTlNFID0gMjc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IDI4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVklURSA9IDI5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0sgPSAzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFID0gMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUtDT0wgPSAzMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1ZFID0gMzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZZID0gMzQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJBQ0sgPSAzNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRklORCA9IDM2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BQQVRDSCA9IDM3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1ZJU0lPTkFMUkVTUE9OU0UgPSAzODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSVNIID0gMzk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVESVJFQ1RSRVNQT05TRSA9IDQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFR0lTVEVSID0gNDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVCA9IDQyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFID0gNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VDQ0VTU1JFU1BPTlNFID0gNDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5MT0NLID0gNDU7Ci0JCi0JCi0JCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+R0VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+R0VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0dFVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIEdFVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShHRVQsICJHRVQiLCAiR0VUIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UE9TVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBPU1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUE9TVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFBPU1RfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oUE9TVCwgIlBPU1QiLCAiUE9TVCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBVVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBVVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQVVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBQVVRfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oUFVULCAiUFVUIiwgIlBVVCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRFTEVURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRFTEVURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNERUxFVEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBERUxFVEVfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oREVMRVRFLCAiREVMRVRFIiwgIkRFTEVURSIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkhFQUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5IRUFEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0hFQUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBIRUFEX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKEhFQUQsICJIRUFEIiwgIkhFQUQiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PUFRJT05TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1BUSU9OUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPUFRJT05TCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gT1BUSU9OU19MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShPUFRJT05TLCAiT1BUSU9OUyIsICJPUFRJT05TIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VFJBQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5UUkFDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUUkFDRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFRSQUNFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFRSQUNFLCAiVFJBQ0UiLCAiVFJBQ0UiKTsvLyROT04tTkxTLTEkCi0KLQkvL1dFQkRBViBzdXBwb3J0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gQUNLX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKEFDSywgIkFDSyIsICJBQ0siKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gQUNMX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKEFDTCwgIkFDTCIsICJBQ0wiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gQkFTRUxJTkVfQ09OVFJPTF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShCQVNFTElORV9DT05UUk9MLCAiQkFTRUxJTkUtQ09OVFJPTCIsICJCQVNFTElORS1DT05UUk9MIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIEJJTkRfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oQklORCwgIkJJTkQiLCAiQklORCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBCWUVfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oQllFLCAiQllFIiwgIkJZRSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBDQU5DRUxfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oQ0FOQ0VMLCAiQ0FOQ0VMIiwgIkNBTkNFTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBDSEVDS0lOX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKENIRUNLSU4sICJDSEVDS0lOIiwgIkNIRUNLSU4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gQ0hFQ0tPVVRfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oQ0hFQ0tPVVQsICJDSEVDS09VVCIsICJDSEVDS09VVCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBFUlJPUlJFU1BPTlNFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKEVSUk9SUkVTUE9OU0UsICJFUlJPUlJFU1BPTlNFIiwgIkVSUk9SUkVTUE9OU0UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gSU5GT19MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShJTkZPLCAiSU5GTyIsICJJTkZPIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIElOVklURV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShJTlZJVEUsICJJTlZJVEUiLCAiSU5WSVRFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIExBQkVMX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKExBQkVMLCAiTEFCRUwiLCAiTEFCRUwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gTE9DS19MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShMT0NLLCAiTE9DSyIsICJMT0NLIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIE1FUkdFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKE1FUkdFLCAiTUVSR0UiLCAiTUVSR0UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gTUVTU0FHRV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShNRVNTQUdFLCAiTUVTU0FHRSIsICJNRVNTQUdFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIE1LQUNUSVZJVFlfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oTUtBQ1RJVklUWSwgIk1LQUNUSVZJVFkiLCAiTUtBQ1RJVklUWSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBNS0NPTF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShNS0NPTCwgIk1LQ09MIiwgIk1LQ09MIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIE1LV09SS1NQQUNFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKE1LV09SS1NQQUNFLCAiTUtXT1JLU1BBQ0UiLCAiTUtXT1JLU1BBQ0UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gTU9WRV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShNT1ZFLCAiTU9WRSIsICJNT1ZFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIE5PVElGWV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShOT1RJRlksICJOT1RJRlkiLCAiTk9USUZZIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFBSQUNLX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFBSQUNLLCAiUFJBQ0siLCAiUFJBQ0siKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gUFJPUEZJTkRfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oUFJPUEZJTkQsICJQUk9QRklORCIsICJQUk9QRklORCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBQUk9QUEFUQ0hfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oUFJPUFBBVENILCAiUFJPUFBBVENIIiwgIlBST1BQQVRDSCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBQUk9WSVNJT05BTFJFU1BPTlNFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFBST1ZJU0lPTkFMUkVTUE9OU0UsICJQUk9WSVNJT05BTFJFU1BPTlNFIiwgIlBST1ZJU0lPTkFMUkVTUE9OU0UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gUFVCTElTSF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShQVUJMSVNILCAiUFVCTElTSCIsICJQVUJMSVNIIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFJFQklORF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShSRUJJTkQsICJSRUJJTkQiLCAiUkVCSU5EIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFJFRElSRUNUUkVTUE9OU0VfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oUkVESVJFQ1RSRVNQT05TRSwgIlJFRElSRUNUUkVTUE9OU0UiLCAiUkVESVJFQ1RSRVNQT05TRSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBSRUdJU1RFUl9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShSRUdJU1RFUiwgIlJFR0lTVEVSIiwgIlJFR0lTVEVSIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFJFUE9SVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShSRVBPUlQsICJSRVBPUlQiLCAiUkVQT1JUIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFJFUVVFU1RfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oUkVRVUVTVCwgIlJFUVVFU1QiLCAiUkVRVUVTVCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBSRVNQT05TRV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShSRVNQT05TRSwgIlJFU1BPTlNFIiwgIlJFU1BPTlNFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFNFQVJDSF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShTRUFSQ0gsICJTRUFSQ0giLCAiU0VBUkNIIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFNVQ0NFU1NSRVNQT05TRV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShTVUNDRVNTUkVTUE9OU0UsICJTVUNDRVNTUkVTUE9OU0UiLCAiU1VDQ0VTU1JFU1BPTlNFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFVOQklORF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShVTkJJTkQsICJVTkJJTkQiLCAiVU5CSU5EIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFVOQ0hFQ0tPVVRfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oVU5DSEVDS09VVCwgIlVOQ0hFQ0tPVVQiLCAiVU5DSEVDS09VVCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBVTkxPQ0tfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oVU5MT0NLLCAiVU5MT0NLIiwgIlVOTE9DSyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBVUERBVEVfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oVVBEQVRFLCAiVVBEQVRFIiwgIlVQREFURSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBWRVJTSU9OX0NPTlRST0xfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oVkVSU0lPTl9DT05UUk9MLCAiVkVSU0lPTi1DT05UUk9MIiwgIlZFUlNJT04tQ09OVFJPTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBDT1BZX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKENPUFksICJDT1BZIiwgIkNPUFkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkKLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+SFRUUCBNZXRob2QgVHlwZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW1bXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgSFRUUE1ldGhvZFR5cGVFbnVtW10gewotCQkJR0VUX0xJVEVSQUwsCi0JCQlQT1NUX0xJVEVSQUwsCi0JCQlQVVRfTElURVJBTCwKLQkJCURFTEVURV9MSVRFUkFMLAotCQkJSEVBRF9MSVRFUkFMLAotCQkJT1BUSU9OU19MSVRFUkFMLAotCQkJVFJBQ0VfTElURVJBTCwKLQkJCS8vV0VCREFWIHN1cHBvcnQKLQkJCUFDS19MSVRFUkFMLAotCQkJQUNMX0xJVEVSQUwsCi0JCQlCQVNFTElORV9DT05UUk9MX0xJVEVSQUwsCi0JCQlCSU5EX0xJVEVSQUwsCi0JCQlCWUVfTElURVJBTCwKLQkJCUNBTkNFTF9MSVRFUkFMLAotCQkJQ0hFQ0tJTl9MSVRFUkFMLAotCQkJQ0hFQ0tPVVRfTElURVJBTCwKLQkJCUNPUFlfTElURVJBTCwKLQkJCUVSUk9SUkVTUE9OU0VfTElURVJBTCwKLQkJCUlORk9fTElURVJBTCwKLQkJCUlOVklURV9MSVRFUkFMLAotCQkJTEFCRUxfTElURVJBTCwKLQkJCUxPQ0tfTElURVJBTCwKLQkJCU1FUkdFX0xJVEVSQUwsCi0JCQlNRVNTQUdFX0xJVEVSQUwsCi0JCQlNS0FDVElWSVRZX0xJVEVSQUwsCi0JCQlNS0NPTF9MSVRFUkFMLAotCQkJTUtXT1JLU1BBQ0VfTElURVJBTCwKLQkJCU1PVkVfTElURVJBTCwKLQkJCU5PVElGWV9MSVRFUkFMLAotCQkJUFJBQ0tfTElURVJBTCwKLQkJCVBST1BGSU5EX0xJVEVSQUwsCi0JCQlQUk9QUEFUQ0hfTElURVJBTCwKLQkJCVBST1ZJU0lPTkFMUkVTUE9OU0VfTElURVJBTCwKLQkJCVBVQkxJU0hfTElURVJBTCwKLQkJCVJFQklORF9MSVRFUkFMLAotCQkJUkVESVJFQ1RSRVNQT05TRV9MSVRFUkFMLAotCQkJUkVHSVNURVJfTElURVJBTCwKLQkJCVJFUE9SVF9MSVRFUkFMLAotCQkJUkVRVUVTVF9MSVRFUkFMLAotCQkJUkVTUE9OU0VfTElURVJBTCwKLQkJCVNFQVJDSF9MSVRFUkFMLAotCQkJU1VDQ0VTU1JFU1BPTlNFX0xJVEVSQUwsCi0JCQlVTkJJTkRfTElURVJBTCwKLQkJCVVOQ0hFQ0tPVVRfTElURVJBTCwKLQkJCVVOTE9DS19MSVRFUkFMLAotCQkJVVBEQVRFX0xJVEVSQUwsCi0JCQlWRVJTSU9OX0NPTlRST0xfTElURVJBTAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkhUVFAgTWV0aG9kIFR5cGUgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SFRUUCBNZXRob2QgVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhUVFBNZXRob2RUeXBlRW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUhUVFBNZXRob2RUeXBlRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkhUVFAgTWV0aG9kIFR5cGUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhUVFBNZXRob2RUeXBlRW51bSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUhUVFBNZXRob2RUeXBlRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SFRUUCBNZXRob2QgVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHBhc3NlcyBsaXRlcmFsIHZhbHVlCi0JICogQHJldHVybiBsaXRlcmFsIGluc3RhbmNlCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSFRUUE1ldGhvZFR5cGVFbnVtIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBHRVQ6IHJldHVybiBHRVRfTElURVJBTDsKLQkJCWNhc2UgUE9TVDogcmV0dXJuIFBPU1RfTElURVJBTDsKLQkJCWNhc2UgUFVUOiByZXR1cm4gUFVUX0xJVEVSQUw7Ci0JCQljYXNlIERFTEVURTogcmV0dXJuIERFTEVURV9MSVRFUkFMOwotCQkJY2FzZSBIRUFEOiByZXR1cm4gSEVBRF9MSVRFUkFMOwotCQkJY2FzZSBPUFRJT05TOiByZXR1cm4gT1BUSU9OU19MSVRFUkFMOwotCQkJY2FzZSBUUkFDRTogcmV0dXJuIFRSQUNFX0xJVEVSQUw7Ci0JCQkvL1dFQkRBViBzdXBwb3J0Ci0JCQljYXNlIEFDSyA6IHJldHVybiBBQ0tfTElURVJBTDsgCi0JCQljYXNlIEFDTCA6IHJldHVybiBBQ0xfTElURVJBTDsKLQkJCWNhc2UgQkFTRUxJTkVfQ09OVFJPTCA6IHJldHVybiBCQVNFTElORV9DT05UUk9MX0xJVEVSQUw7Ci0JCQljYXNlIEJJTkQgOiByZXR1cm4gQklORF9MSVRFUkFMOwotCQkJY2FzZSBCWUUgOiByZXR1cm4gQllFX0xJVEVSQUw7Ci0JCQljYXNlIENBTkNFTCA6IHJldHVybiBDQU5DRUxfTElURVJBTDsKLQkJCWNhc2UgQ0hFQ0tJTiA6IHJldHVybiBDSEVDS0lOX0xJVEVSQUw7Ci0JCQljYXNlIENIRUNLT1VUIDogcmV0dXJuIENIRUNLT1VUX0xJVEVSQUw7Ci0JCQljYXNlIENPUFkgOiByZXR1cm4gQ09QWV9MSVRFUkFMOyAgCi0JCQljYXNlIEVSUk9SUkVTUE9OU0UgOiByZXR1cm4gRVJST1JSRVNQT05TRV9MSVRFUkFMOwotCQkJY2FzZSBJTkZPIDogcmV0dXJuIElORk9fTElURVJBTDsKLQkJCWNhc2UgSU5WSVRFIDogcmV0dXJuIElOVklURV9MSVRFUkFMOwotCQkJY2FzZSBMQUJFTCA6IHJldHVybiBMQUJFTF9MSVRFUkFMOwotCQkJY2FzZSBMT0NLIDogcmV0dXJuIExPQ0tfTElURVJBTDsJCQkgCi0JCQljYXNlIE1FUkdFIDogcmV0dXJuIE1FUkdFX0xJVEVSQUw7Ci0JCQljYXNlIE1FU1NBR0UgOiByZXR1cm4gTUVTU0FHRV9MSVRFUkFMOwotCQkJY2FzZSBNS0FDVElWSVRZIDogcmV0dXJuIE1LQUNUSVZJVFlfTElURVJBTDsKLQkJCWNhc2UgTUtDT0wgOiByZXR1cm4gTUtDT0xfTElURVJBTDsJCQkgCi0JCQljYXNlIE1LV09SS1NQQUNFIDogcmV0dXJuIE1LV09SS1NQQUNFX0xJVEVSQUw7Ci0JCQljYXNlIE1PVkUgOiByZXR1cm4gTU9WRV9MSVRFUkFMOwkJIAotCQkJY2FzZSBOT1RJRlkgOiByZXR1cm4gTk9USUZZX0xJVEVSQUw7Ci0JCQljYXNlIFBSQUNLIDogcmV0dXJuIFBSQUNLX0xJVEVSQUw7Ci0JCQljYXNlIFBST1BGSU5EIDogcmV0dXJuIFBST1BGSU5EX0xJVEVSQUw7Ci0JCQljYXNlIFBST1BQQVRDSCA6IHJldHVybiBQUk9QUEFUQ0hfTElURVJBTDsKLQkJCWNhc2UgUFJPVklTSU9OQUxSRVNQT05TRSA6IHJldHVybiBQUk9WSVNJT05BTFJFU1BPTlNFX0xJVEVSQUw7Ci0JCQljYXNlIFBVQkxJU0ggOiByZXR1cm4gUFVCTElTSF9MSVRFUkFMOwotCQkJY2FzZSBSRUJJTkQgOiByZXR1cm4gUkVCSU5EX0xJVEVSQUw7Ci0JCQljYXNlIFJFRElSRUNUUkVTUE9OU0UgOiByZXR1cm4gUkVESVJFQ1RSRVNQT05TRV9MSVRFUkFMOwotCQkJY2FzZSBSRUdJU1RFUiA6IHJldHVybiBSRUdJU1RFUl9MSVRFUkFMOwotCQkJY2FzZSBSRVBPUlQgOiByZXR1cm4gUkVQT1JUX0xJVEVSQUw7Ci0JCQljYXNlIFJFUVVFU1QgOiByZXR1cm4gUkVRVUVTVF9MSVRFUkFMOwotCQkJY2FzZSBSRVNQT05TRSA6IHJldHVybiBSRVNQT05TRV9MSVRFUkFMOwotCQkJY2FzZSBTRUFSQ0ggOiByZXR1cm4gU0VBUkNIX0xJVEVSQUw7Ci0JCQljYXNlIFNVQ0NFU1NSRVNQT05TRSA6IHJldHVybiBTVUNDRVNTUkVTUE9OU0VfTElURVJBTDsKLQkJCWNhc2UgVU5CSU5EIDogcmV0dXJuIFVOQklORF9MSVRFUkFMOwotCQkJY2FzZSBVTkNIRUNLT1VUIDogcmV0dXJuIFVOQ0hFQ0tPVVRfTElURVJBTDsKLQkJCWNhc2UgVU5MT0NLIDogcmV0dXJuIFVOTE9DS19MSVRFUkFMOyAKLQkJCWNhc2UgVVBEQVRFIDogcmV0dXJuIFVQREFURV9MSVRFUkFMOwotCQkJY2FzZSBWRVJTSU9OX0NPTlRST0wgOiByZXR1cm4gVkVSU0lPTl9DT05UUk9MX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEhUVFBNZXRob2RUeXBlRW51bShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vSFRUUE1ldGhvZFR5cGVFbnVtCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Jbml0UGFyYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0luaXRQYXJhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQzOGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0luaXRQYXJhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lLy92YWx1ZSBwYWlyIGFzIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtIG9mIHRoZSBzZXJ2bGV0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5pdFBhcmFtIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBQYXJhbU5hbWUgYXR0cmlidXRlCi0JICogCi0JICogCi0KLQkgKi8KLQlTdHJpbmcgZ2V0UGFyYW1OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUGFyYW1OYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UGFyYW1OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUGFyYW1WYWx1ZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0UGFyYW1WYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFBhcmFtVmFsdWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSlNQVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSlNQVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjNmNGY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0pTUFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUFR5cGUgZXh0ZW5kcyBXZWJUeXBlewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBKc3BGaWxlIGF0dHJpYnV0ZQotCSAqIFRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZSB3aXRoaW4gdGhlIHdlYgotCSAqIGFwcGxpY2F0aW9uLgotCi0JICovCi0JU3RyaW5nIGdldEpzcEZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBKc3BGaWxlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0SnNwRmlsZShTdHJpbmcgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9jYWxFbmNvZGluZ01hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0xvY2FsRW5jb2RpbmdNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZGYzOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9jYWxFbmNvZGluZ01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nI2dldExvY2FsZSA8ZW0+TG9jYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZyNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRMb2NhbEVuY29kaW5nTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2NhbEVuY29kaW5nTWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2FsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2FsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2FsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmcjZ2V0TG9jYWxlIDxlbT5Mb2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9jYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuY29kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW5jb2RpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVuY29kaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZyNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBMb2NhbEVuY29kaW5nTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViNTM4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpOwotCi19IC8vIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9naW5Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0xvZ2luQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOWJkNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9naW5Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiBUaGUgbG9naW4tY29uZmlnIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbmVlZGVkIGJ5IHRoZSBmb3JtIGxvZ2luCi0gKiBtZWNoYW5pc20uCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9naW5Db25maWcgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEF1dGhNZXRob2QgYXR0cmlidXRlCi0JICogVGhlIGF1dGgtbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBmb3IKLQkgKiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0byBnYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcwotCSAqIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbiBjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlCi0JICogYXV0aGVudGljYXRlZCB1c2luZyB0aGUgY29uZmlndXJlZCBtZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBmb3IgdGhpcyBlbGVtZW50IGFyZSAKLQkgKiAiQkFTSUMiLCAiRElHRVNUIiwgIkZPUk0iLCBvciAiQ0xJRU5ULUNFUlQiLgotCSAqLwotCUF1dGhNZXRob2RLaW5kIGdldEF1dGhNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnI2dldEF1dGhNZXRob2QgPGVtPkF1dGggTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoTWV0aG9kS2luZAotCSAqIEBzZWUgI2lzU2V0QXV0aE1ldGhvZCgpCi0JICogQHNlZSAjdW5zZXRBdXRoTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRBdXRoTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRoTWV0aG9kKEF1dGhNZXRob2RLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWcjZ2V0QXV0aE1ldGhvZCA8ZW0+QXV0aCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QXV0aE1ldGhvZCgpCi0JICogQHNlZSAjZ2V0QXV0aE1ldGhvZCgpCi0JICogQHNlZSAjc2V0QXV0aE1ldGhvZChBdXRoTWV0aG9kS2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEF1dGhNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWcjZ2V0QXV0aE1ldGhvZCA8ZW0+QXV0aCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGggTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBdXRoTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRBdXRoTWV0aG9kKCkKLQkgKiBAc2VlICNzZXRBdXRoTWV0aG9kKEF1dGhNZXRob2RLaW5kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QXV0aE1ldGhvZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFJlYWxtTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0byB1c2UgaW4gSFRUUCBCYXNpYwotCSAqIGF1dGhvcml6YXRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0UmVhbG1OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVhbG1OYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UmVhbG1OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRob3JpemF0aW9uIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXV0aG9yaXphdGlvbiBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3JpemF0aW9uIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXV0aG9yaXphdGlvbk1ldGhvZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0TG9naW5Db25maWdfQXV0aG9yaXphdGlvbk1ldGhvZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdXRob3JpemF0aW9uTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZyNnZXRBdXRob3JpemF0aW9uTWV0aG9kIDxlbT5BdXRob3JpemF0aW9uIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yaXphdGlvbiBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF1dGhvcml6YXRpb25NZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhvcml6YXRpb25NZXRob2QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEZvcm1Mb2dpbkNvbmZpZyByZWZlcmVuY2UKLQkgKi8KLQlGb3JtTG9naW5Db25maWcgZ2V0Rm9ybUxvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGb3JtTG9naW5Db25maWcgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL01pbWVNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9NaW1lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzY5ZDcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL01pbWVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIG1pbWUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uIGFuZCBhIG1pbWUgdHlwZS4KLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBNaW1lTWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRXh0ZW5zaW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuIGV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRXh0ZW5zaW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RXh0ZW5zaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTWltZVR5cGUgYXR0cmlidXRlCi0JICogVGhlIG1pbWUtdHlwZSBlbGVtZW50IGNvbnRhaW5zIGEgZGVmaW5lZCBtaW1lIHR5cGUuIGV4YW1wbGU6ICJ0ZXh0Ly9wbGFpbiIKLQkgKi8KLQlTdHJpbmcgZ2V0TWltZVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBNaW1lVHlwZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE1pbWVUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFdlYkFwcChXZWJBcHAgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vUmVzQXV0aFNlcnZsZXRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9SZXNBdXRoU2VydmxldFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0MDliYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9SZXNBdXRoU2VydmxldFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0vKioKLSAqQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzQXV0aFNlcnZsZXRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5FUiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVkxFVCA9IDE7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q09OVEFJTkVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q09OVEFJTkVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRBSU5FUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aFNlcnZsZXRUeXBlIENPTlRBSU5FUl9MSVRFUkFMID0gbmV3IFJlc0F1dGhTZXJ2bGV0VHlwZShDT05UQUlORVIsICJDT05UQUlORVIiLCAiQ09OVEFJTkVSIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VSVkxFVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNFUlZMRVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VSVkxFVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aFNlcnZsZXRUeXBlIFNFUlZMRVRfTElURVJBTCA9IG5ldyBSZXNBdXRoU2VydmxldFR5cGUoU0VSVkxFVCwgIlNFUlZMRVQiLCAiU0VSVkxFVCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgQXV0aCBTZXJ2bGV0IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc0F1dGhTZXJ2bGV0VHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBSZXNBdXRoU2VydmxldFR5cGVbXSB7Ci0JCQlDT05UQUlORVJfTElURVJBTCwKLQkJCVNFUlZMRVRfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgQXV0aCBTZXJ2bGV0IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNBdXRoU2VydmxldFR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlSZXNBdXRoU2VydmxldFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgQXV0aCBTZXJ2bGV0IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNBdXRoU2VydmxldFR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlSZXNBdXRoU2VydmxldFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSBwYXNzZXMgbGl0ZXJhbCB2YWx1ZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc0F1dGhTZXJ2bGV0VHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQ09OVEFJTkVSOiByZXR1cm4gQ09OVEFJTkVSX0xJVEVSQUw7Ci0JCQljYXNlIFNFUlZMRVQ6IHJldHVybiBTRVJWTEVUX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJlc0F1dGhTZXJ2bGV0VHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7Ci0JfQotCi19IC8vUmVzQXV0aFNlcnZsZXRUeXBlCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Sb2xlTmFtZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1JvbGVOYW1lVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjQyOTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1JvbGVOYW1lVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZU5hbWVUeXBlIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSb2xlTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0Um9sZU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSb2xlTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFJvbGVOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZWN1cml0eUNvbnN0cmFpbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1NlY3VyaXR5Q29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmVlYTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1NlY3VyaXR5Q29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucwotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3VyaXR5Q29uc3RyYWludCBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGlzcGxheU5hbWVzCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGlzcGxheU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50I2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFdlYkFwcChXZWJBcHAgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBXZWJSZXNvdXJjZUNvbGxlY3Rpb25zIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBBdXRoQ29uc3RyYWludCByZWZlcmVuY2UKLQkgKi8KLQlBdXRoQ29uc3RyYWludCBnZXRBdXRoQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEF1dGhDb25zdHJhaW50IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0QXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgVXNlckRhdGFDb25zdHJhaW50IHJlZmVyZW5jZQotCSAqLwotCVVzZXJEYXRhQ29uc3RyYWludCBnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBVc2VyRGF0YUNvbnN0cmFpbnQgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERpc3BsYXlOYW1lcygpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzQzY2Q1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1NlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci0KLS8qKgotICogVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhIHNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaXMgcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQgbG9hZGVkLgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXQgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cHsKLQotCi0JLyoqCi0JICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbGlzdCBvZiB0aGUgbWFwcGluZ3MgdGhhdCB0aGlzCi0JICogc2VydmxldCBwYXJ0aWNpcGF0ZXMgaW4uICBTaW5jZSBzZXJ2bGV0TWFwcGluZ3MgaXMgbm90Ci0JICogYSBiaS1kaXJlY3Rpb25hbCBhdHRyaWJ1dGUsIGlmIHlvdSB3YW50IHRvIGFkZCBvciBkZWxldGUgYQotCSAqIG1hcHBpbmcsIHRoaXMgbXVzdCBiZSBkb25lIGluIHRoZSB3ZWItYXBwLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNYXBwaW5ncygpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIFNlcnZsZXQgcGFyYW1ldGVycyBpbiAgamF2YS51dGlsLlByb3BlcnRpZXMKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5Qcm9wZXJ0aWVzCi0JICovCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UGFyYW1zQXNQcm9wZXJ0aWVzKCkgOwotCS8qKgotCSAqIEZpeCB0aGUgcm9sZS1saW5rIG9uIGFueSBjb250YWluZWQgcm9sZSByZWZzCi0JICogQHBhcmFtIGV4aXN0aW5nUm9sZU5hbWUgZXhpc3Rpbmcgcm9sZSBuYW1lCi0JICogQHBhcmFtIG5ld1JvbGVOYW1lIG5ldyByb2xlIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZVN5bmNTZWN1cml0eVJvbGVSZWYoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNlcnZsZXROYW1lIGF0dHJpYnV0ZQotCSAqIFRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIHNlcnZsZXQuCi0JICovCi0JU3RyaW5nIGdldFNlcnZsZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2VydmxldE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRTZXJ2bGV0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExvYWRPblN0YXJ0dXAgYXR0cmlidXRlCi0JICogVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkIG9uIHRoZSAKLQkgKiBzdGFydHVwIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZiB0aGVzZSBlbGVtZW50IG11c3QgYmUKLQkgKiBhIHBvc2l0aXZlIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4KLQkgKiBMb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBoaWdoZXIgaW50ZWdlcnMuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgb3IKLQkgKiBpZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIAotCSAqIGl0IGF0IGFueSB0aW1lIGluIHRoZSBzdGFydHVwIHNlcXVlbmNlLgotCi0JICovCi0JSW50ZWdlciBnZXRMb2FkT25TdGFydHVwKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0I2dldExvYWRPblN0YXJ0dXAgPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExvYWRPblN0YXJ0dXAoKQotCSAqIEBzZWUgI3Vuc2V0TG9hZE9uU3RhcnR1cCgpCi0JICogQHNlZSAjZ2V0TG9hZE9uU3RhcnR1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9hZE9uU3RhcnR1cChJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCNnZXRMb2FkT25TdGFydHVwIDxlbT5Mb2FkIE9uIFN0YXJ0dXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExvYWRPblN0YXJ0dXAoKQotCSAqIEBzZWUgI2dldExvYWRPblN0YXJ0dXAoKQotCSAqIEBzZWUgI3NldExvYWRPblN0YXJ0dXAoSW50ZWdlcikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgdW5zZXRMb2FkT25TdGFydHVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQjZ2V0TG9hZE9uU3RhcnR1cCA8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMb2FkT25TdGFydHVwKCkKLQkgKiBAc2VlICNnZXRMb2FkT25TdGFydHVwKCkKLQkgKiBAc2VlICNzZXRMb2FkT25TdGFydHVwKEludGVnZXIpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzU2V0TG9hZE9uU3RhcnR1cCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCVdlYkFwcCBnZXRXZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFdlYlR5cGUgcmVmZXJlbmNlCi0JICovCi0JV2ViVHlwZSBnZXRXZWJUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViVHlwZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFdlYlR5cGUoV2ViVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFBhcmFtcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFNlY3VyaXR5Um9sZVJlZnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFJ1bkFzIHJlZmVyZW5jZQotCSAqIElmIGRlZmluZWQgZm9yIGEgc2VydmxldCwgb3ZlcnJpZGVzIHRoZSBzZWN1cml0eSBpZGVudGl0eSB1c2VkIHRvIGNhbGwgYW4gRUpCCi0JICogYnkgdGhhdCBzZXJ2bGV0IGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgcm9sZS1uYW1lIGlzIG9uZSBvZiB0aGUgc2VjdXJpdHkKLQkgKiByb2xlcyBhbHJlYWR5IGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotCSAqLwotCVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgZ2V0UnVuQXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSdW5BcyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFJ1bkFzKFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFNlcnZsZXRfSW5pdFBhcmFtcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBqYXZhIHNlcnZsZXQgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmxldAotCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIEphdmFDbGFzcwotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0U2VydmxldENsYXNzKCk7Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldE1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1NlcnZsZXRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MzIwN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIHNlcnZsZXQtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYSBzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuCi0gKiBAc2luY2UgMS4wCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmxldE1hcHBpbmcgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFVybFBhdHRlcm4gYXR0cmlidXRlCi0JICogVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBNdXN0IGZvbGxvdwotCSAqIHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMCBvZiB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0VXJsUGF0dGVybigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFVybFBhdHRlcm4gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVcmxQYXR0ZXJuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiBUaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZQotCSAqIHNlcnZsZXQuIEVhY2ggc2VydmxldCBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYgotCSAqIGFwcGxpY2F0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRTZXJ2bGV0TWFwcGluZ19OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTZXJ2bGV0IHJlZmVyZW5jZQotCSAqLwotCVNlcnZsZXQgZ2V0U2VydmxldCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFNlcnZsZXQgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRTZXJ2bGV0KFNlcnZsZXQgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1NlcnZsZXRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTJjMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXRUeXBlIGV4dGVuZHMgV2ViVHlwZXsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ2xhc3NOYW1lIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRDbGFzc05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDbGFzc05hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1Nlc3Npb25Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1Nlc3Npb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhOTRlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZXNzaW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAqIEBzaW5jZSAxLjAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXNzaW9uQ29uZmlnIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBTZXNzaW9uVGltZW91dCBhdHRyaWJ1dGUKLQkgKiBUaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdCBzZXNzaW9uIHRpbWVvdXQgaW50ZXJ2YWwgZm9yCi0JICogYWxsIHNlc3Npb25zIGNyZWF0ZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBzcGVjaWZpZWQgdGltZW91dCBtdXN0IGJlCi0JICogZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0JICovCi0JaW50IGdldFNlc3Npb25UaW1lb3V0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2Vzc2lvblRpbWVvdXQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRTZXNzaW9uVGltZW91dChpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnI2dldFNlc3Npb25UaW1lb3V0IDxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNlc3Npb25UaW1lb3V0KCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uVGltZW91dCgpCi0JICogQHNlZSAjc2V0U2Vzc2lvblRpbWVvdXQoaW50KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCB1bnNldFNlc3Npb25UaW1lb3V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlc3Npb25Db25maWcjZ2V0U2Vzc2lvblRpbWVvdXQgPGVtPlNlc3Npb24gVGltZW91dDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlc3Npb24gVGltZW91dDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U2Vzc2lvblRpbWVvdXQoKQotCSAqIEBzZWUgI2dldFNlc3Npb25UaW1lb3V0KCkKLQkgKiBAc2VlICNzZXRTZXNzaW9uVGltZW91dChpbnQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzU2V0U2Vzc2lvblRpbWVvdXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9UYWdMaWJSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1RhZ0xpYlJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzIxYjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1RhZ0xpYlJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0vKioKLSAqIFRoZSB0YWdsaWIgZWxlbWVudCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgSlNQIHRhZyBsaWJyYXJ5LgotICogQHZlcnNpb24gc2luY2UgSjJFRTEuNCBkZXByZWNhdGVkLCB1c2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuanNwLlRhZ0xpYlJlZgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ0xpYlJlZiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVGFnbGliVVJJIGF0dHJpYnV0ZQotCSAqIFRoZSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJLCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHdlYi54bWwgCi0JICogZG9jdW1lbnQsIGlkZW50aWZ5aW5nIGEgVGFnIExpYnJhcnkgdXNlZCBpbiB0aGUgV2ViIEFwcGxpY2F0aW9uLgotCSAqLwotCVN0cmluZyBnZXRUYWdsaWJVUkkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBUYWdsaWJVUkkgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRUYWdsaWJVUkkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUYWdsaWJMb2NhdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIChhcyBhIHJlc291cmNlIHJlbGF0aXZlIHRvCi0JICogdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYmFyeSBEZXNjcmlwdGlvbiBmaWxlCi0JICogZm9yIHRoZSB0YWcgbGlicmFyeS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFnbGliTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBUYWdsaWJMb2NhdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFRhZ2xpYkxvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRUYWdMaWJzIDxlbT5UYWcgTGliczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XZWIgQXBwPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgQXBwPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V2ViQXBwKFdlYkFwcCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRUYWdMaWJSZWZfV2ViQXBwKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRUYWdMaWJzCi0JICogQG1vZGVsIG9wcG9zaXRlPSJ0YWdMaWJzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWYjZ2V0V2ViQXBwIDxlbT5XZWIgQXBwPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIEFwcDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OWZmNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLS8qKgotICpAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdSQUwgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkZJREVOVElBTCA9IDI7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBOT05FX0xJVEVSQUwgPSBuZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShOT05FLCAiTk9ORSIsICJOT05FIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5URUdSQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTlRFR1JBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTlRFR1JBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBJTlRFR1JBTF9MSVRFUkFMID0gbmV3IFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoSU5URUdSQUwsICJJTlRFR1JBTCIsICJJTlRFR1JBTCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNPTkZJREVOVElBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNPTkZJREVOVElBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05GSURFTlRJQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgQ09ORklERU5USUFMX0xJVEVSQUwgPSBuZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShDT05GSURFTlRJQUwsICJDT05GSURFTlRJQUwiLCAiQ09ORklERU5USUFMIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlW10gewotCQkJTk9ORV9MSVRFUkFMLAotCQkJSU5URUdSQUxfTElURVJBTCwKLQkJCUNPTkZJREVOVElBTF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSBwYXNzZXMgbGl0ZXJhbCB2YWx1ZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5PTkU6IHJldHVybiBOT05FX0xJVEVSQUw7Ci0JCQljYXNlIElOVEVHUkFMOiByZXR1cm4gSU5URUdSQUxfTElURVJBTDsKLQkJCWNhc2UgQ09ORklERU5USUFMOiByZXR1cm4gQ09ORklERU5USUFMX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUKLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1VSTFBhdHRlcm5UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9VUkxQYXR0ZXJuVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTY0YzNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1VSTFBhdHRlcm5UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBAZGVwcmVjYXRlZCBzaW5jZSA0LzI1LzIwMDMgdXNlIGxpc3Qgb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbn0gCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZSNnZXRVcmxQYXR0ZXJuIDxlbT5VcmwgUGF0dGVybjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVVJMUGF0dGVyblR5cGUjZ2V0UmVzQ29sbGVjdGlvbiA8ZW0+UmVzIENvbGxlY3Rpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRVUkxQYXR0ZXJuVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBVUkxQYXR0ZXJuVHlwZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJsUGF0dGVybiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0VXJsUGF0dGVybigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFVybFBhdHRlcm4gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVcmxQYXR0ZXJuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSZXNDb2xsZWN0aW9uIHJlZmVyZW5jZQotCSAqLwotCVdlYlJlc291cmNlQ29sbGVjdGlvbiBnZXRSZXNDb2xsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVzQ29sbGVjdGlvbiByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFJlc0NvbGxlY3Rpb24oV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1VzZXJEYXRhQ29uc3RyYWludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVXNlckRhdGFDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTM2NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVXNlckRhdGFDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIFRoZSB1c2VyLWRhdGEtY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gaW5kaWNhdGUgaG93IGRhdGEgY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZSBwcm90ZWN0ZWQKLSAqIEBzaW5jZSAxLjAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBVc2VyRGF0YUNvbnN0cmFpbnQgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1c2VyIGRhdGEgY29uc3RyYWludC4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVHJhbnNwb3J0R3VhcmFudGVlIGF0dHJpYnV0ZQotCSAqIFRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiBjbGllbnQgCi0JICogYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yIENPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZQotCSAqIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW55Ci0JICogdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMKLQkgKiB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQKLQkgKiBjYW4ndCBiZSBjaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcwotCSAqIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYSBmYXNoaW9uIHRoYXQgcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbQotCSAqIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZQotCSAqIElOVEVHUkFMIG9yIENPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcyByZXF1aXJlZC4KLQkgKi8KLQlUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGdldFRyYW5zcG9ydEd1YXJhbnRlZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50I2dldFRyYW5zcG9ydEd1YXJhbnRlZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlCi0JICogQHNlZSAjaXNTZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAc2VlICNnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zcG9ydEd1YXJhbnRlZShUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50I2dldFRyYW5zcG9ydEd1YXJhbnRlZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjc2V0VHJhbnNwb3J0R3VhcmFudGVlKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50I2dldFRyYW5zcG9ydEd1YXJhbnRlZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAc2VlICNnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI3NldFRyYW5zcG9ydEd1YXJhbnRlZShUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTZWNDb25zdHJhaW50IHJlZmVyZW5jZQotCSAqLwotCVNlY3VyaXR5Q29uc3RyYWludCBnZXRTZWNDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2VjQ29uc3RyYWludCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFNlY0NvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJBcHAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYkFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmFiYWUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYkFwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnOwotCi0vKioKLSAqIFRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IKLSAqIGEgd2ViIGFwcGxpY2F0aW9uLgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYkFwcCBleHRlbmRzIEpORElFbnZSZWZzR3JvdXB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSBTZWN1cml0eVJvbGUgd2l0aCB0aGUgbmFtZSBwYXNzZWQKLQkgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBTZWN1cml0eVJvbGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NlY3VyaXR5Um9sZShTdHJpbmcgbmFtZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBFcnJvclBhZ2UgaWYgaXQgaGFzIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZQotCSAqIEBwYXJhbSBjb2RlIHRoZSBlcnJvciBjb2RlCi0JICogQHJldHVybiByZWZlcm5jZSB0byBFcnJvclBhZ2UKLQkgKi8KLQlFcnJvclBhZ2UgZ2V0RXJyb3JQYWdlQnlDb2RlKEludGVnZXIgY29kZSkgOwotCQotCS8qKgotCSAqIFJldHVybnMgYW4gRXJyb3JQYWdlIGdpdmVuIGFuIGV4Y2VwdGlvblR5cGUKLQkgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZSB0aGUgamF2YSBFeGNlcHRpb24gVHlwZQotCSAqIEByZXR1cm4gcmVmZXJuY2UgdG8gRXJyb3JQYWdlCi0JICovCi0JRXJyb3JQYWdlIGdldEVycm9yUGFnZUJ5RXhjZXB0aW9uVHlwZShTdHJpbmcgZXhjZXB0aW9uVHlwZSkgOwotCS8qKgotCSAqIEZpbmRzIGEgZmlsdGVyIG1hcHBpbmcgZm9yIGEgc3BlY2lmaWVkIGZpbHRlci4KLQkgKiBAcGFyYW0gYUZpbHRlciBUaGUgZmlsdGVyIHRvIGZpbmQgdGhlIG1hcHBpbmdzIGZvci4KLQkgKiBAcmV0dXJuIFRoZSBmaWx0ZXIgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBmaWx0ZXIsIG9yIG51bGwgaWYgbm8KLQkgKiBtYXBwaW5nIGV4aXN0cyBmb3IgdGhlIGZpbHRlci4KLQkgKi8KLQotCUZpbHRlck1hcHBpbmcgZ2V0RmlsdGVyTWFwcGluZyhGaWx0ZXIgYUZpbHRlcik7Ci0JCi0JLyoqCi0JICogR2V0cyByZWZlcm5jZSB0byB0aGUgaW5zdGFuY2Ugb2YgRmlsdGVyIHdoaWNoIGhhcyB0aGUgc3BlY2lmaWVkIG5hbWUKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgRmlsdGVyIHRvIGxvb2sgZm9yCi0JICogQHJldHVybiByZWZlcm5jZSB0byB0ZWggRmlsdGVyCi0JICovCi0JcHVibGljIEZpbHRlciBnZXRGaWx0ZXJOYW1lZChTdHJpbmcgbmFtZSk7Ci0JLyoqCi0JICogR2V0cyB0aGUgbmFtZXMgb2YgdGhlIGZpbHRlcnMgZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0JICogQHJldHVybiBBIGxpc3Qgb2YgZmlsdGVyIG5hbWVzIChTdHJpbmdzKS4KLQkgKi8KLQotCUxpc3QgZ2V0RmlsdGVyTmFtZXMoKSA7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbWltZSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGV4dGVuc2lvbgotCSAqIEBwYXJhbSBleHRlbnNpb24gdG8gZmluZCB0aGUgbWltZSB0eXBlIGZvci4KLQkgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZQotCSAqLwotCVN0cmluZyBnZXRNaW1lVHlwZShTdHJpbmcgZXh0ZW5zaW9uKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTZWN1cml0eVJvbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLQkgKiBAcGFyYW0gcm9sZU5hbWUgdGhlIG5hbWUgb2YgdGhlIFNlY3VyaXR5Um9sZSB0byBiZSBzZWFyY2hlZCBmb3IKLQkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgbW9kZWwgb2JqZWN0IFNlY3VyaXR5Um9sZQotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGUgZ2V0U2VjdXJpdHlSb2xlTmFtZWQoU3RyaW5nIHJvbGVOYW1lKTsKLQkKLQkvKioKLQkgKiBGaW5kcyBhIHNlcnZsZXQgbWFwcGluZyBmb3IgYSBzcGVjaWZpZWQgc2VydmxldC4KLQkgKiBAcGFyYW0gYVNlcnZsZXQgVGhlIHNlcnZsZXQgdG8gZmluZCB0aGUgbWFwcGluZ3MgZm9yLgotCSAqIEByZXR1cm4gVGhlIHNlcnZsZXQgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2bGV0LCBvciBudWxsIGlmIG5vCi0JICogbWFwcGluZyBleGlzdHMgZm9yIHRoZSBzZXJ2bGV0LgotCSAqLwotCVNlcnZsZXRNYXBwaW5nIGdldFNlcnZsZXRNYXBwaW5nKFNlcnZsZXQgYVNlcnZsZXQpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBTZXJ2bGV0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIAotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBTZXJ2bGV0IHRvIHNlYXJjaCBmb3IKLQkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgbW9kZWwgb2JqZWN0IFNlcnZsZXQKLQkgKi8KLQlwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0TmFtZWQoU3RyaW5nIG5hbWUpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWVzIG9mIHRoZSBzZXJ2bGV0cyBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBzZXJ2bGV0IG5hbWVzIChTdHJpbmdzKS4KLQkgKi8KLQlMaXN0IGdldFNlcnZsZXROYW1lcygpIDsKLQkvKioKLQkgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgV2ViIEFwcCB3YXMgcG9wdWxhdGVkIGZyb20gYW4gU2VydmxldDIuMiBjb21wbGlhbnQgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMl8yRGVzY3JpcHRvcigpOwotCS8qKgotCSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBXZWIgQXBwIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBTZXJ2bGV0Mi4zIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0JICogQHJldHVybiBib29sZWFuCi0JICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24yXzNEZXNjcmlwdG9yKCk7Ci0JLyoqCi0JICogUmVuYW1lIHRoZSBzZWN1cml0eSByb2xlIGlmIGl0IGV4aXN0czsgZm9yIGVhY2ggc2VydmxldCwgZml4IHRoZSByb2xlLWxpbmsgb24gYW55IGNvbnRhaW5lZCByb2xlCi0JICogcmVmcwotCSAqIEBwYXJhbSBleGlzdGluZ1JvbGVOYW1lIGN1cmVudCBzZWN1cml0eSByb2xlIG5hbWUKLQkgKiBAcGFyYW0gbmV3Um9sZU5hbWUgbmV3IHNlY3VyaXR5IHJvbGUgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmFtZVNlY3VyaXR5Um9sZShTdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSwgU3RyaW5nIG5ld1JvbGVOYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGlzdHJpYnV0YWJsZSBhdHRyaWJ1dGUKLQkgKiBUaGUgZGlzdHJpYnV0YWJsZSBlbGVtZW50LCBieSBpdHMgcHJlc2VuY2UgaW4gYSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAotCSAqIGRlc2NyaXB0b3IsIGluZGljYXRlcyB0aGF0IHRoaXMgd2ViIGFwcGxpY2F0aW9uIGlzIHByb2dyYW1tZWQgYXBwcm9wcmlhdGVseSB0bwotCSAqIGJlIGRlcGxveWVkIGludG8gYSBkaXN0cmlidXRlZCBzZXJ2bGV0IGNvbnRhaW5lcgotCSAqLwotCWJvb2xlYW4gaXNEaXN0cmlidXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGlzdHJpYnV0YWJsZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERpc3RyaWJ1dGFibGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNpc0Rpc3RyaWJ1dGFibGUgPGVtPkRpc3RyaWJ1dGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGlzdHJpYnV0YWJsZSgpCi0JICogQHNlZSAjaXNEaXN0cmlidXRhYmxlKCkKLQkgKiBAc2VlICNzZXREaXN0cmlidXRhYmxlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXREaXN0cmlidXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNpc0Rpc3RyaWJ1dGFibGUgPGVtPkRpc3RyaWJ1dGFibGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3RyaWJ1dGFibGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldERpc3RyaWJ1dGFibGUoKQotCSAqIEBzZWUgI2lzRGlzdHJpYnV0YWJsZSgpCi0JICogQHNlZSAjc2V0RGlzdHJpYnV0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGlzdHJpYnV0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRXZWJBcHBfVmVyc2lvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JICpAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB0aGUgZXhjZXB0aW9uIGlzIHRocm93biBpZiBhIHByb2JsZW0gaXMgZW5jb3VudGVyZWQgaW4gZmluZGluZyB0aGUgCi0JICptb2R1bGUgdmVyc2lvbi4gCSogCi0JKiBAcmV0dXJuIHRoZSBtb2R1bGUgdmVyc2lvbiBpZCByZXByZXNlbnRlZCBpbiB0aGUgaW50IGUuZy4gMjIsIDIzLCAyNAotCSovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIDsKLQkvKioKLQkgKlRoaXMgcmV0dXJucyB0aGUgajJlZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIGoyZWUgbGV2ZWwKLQkgKkB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGlmIGEgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZCBpbiBmaW5kaW5nIHRoZSAKLQkgKmoyZWUgdmVyc2lvbi4gCi0JICpAcmV0dXJuIHRoZSBqMmVlIHZlcnNpb24gcmVwcmVzZW50ZWQgaW4gdGhlIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIENvbnRleHRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRDb250ZXh0cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBFcnJvclBhZ2VzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRFcnJvclBhZ2VzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBGaWxlTGlzdCByZWZlcmVuY2UKLQkgKi8KLQlXZWxjb21lRmlsZUxpc3QgZ2V0RmlsZUxpc3QoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIDogVXNlIGdldEVudmlyb25tZW50UHJvcGVydGllcygpCi0JICogQHJldHVybiByZWZlcmVuY2UgdG8gRUxpc3QKLQkgKi8KLQlFTGlzdCBnZXRFbnZFbnRyaWVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRmlsZUxpc3QgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRGaWxlTGlzdChXZWxjb21lRmlsZUxpc3QgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBUYWdMaWJzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRUYWdMaWJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIENvbnN0cmFpbnRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRDb25zdHJhaW50cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgTG9naW5Db25maWcgcmVmZXJlbmNlCi0JICovCi0JTG9naW5Db25maWcgZ2V0TG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMb2dpbkNvbmZpZyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldExvZ2luQ29uZmlnKExvZ2luQ29uZmlnIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTWltZU1hcHBpbmdzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRNaW1lTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNlc3Npb25Db25maWcgcmVmZXJlbmNlCi0JICovCi0JU2Vzc2lvbkNvbmZpZyBnZXRTZXNzaW9uQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2Vzc2lvbkNvbmZpZyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFNlcnZsZXRNYXBwaW5ncyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFNlcnZsZXRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRTZXJ2bGV0cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBTZWN1cml0eVJvbGVzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRTZWN1cml0eVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEZpbHRlcnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEZpbHRlcnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRmlsdGVyTWFwcGluZ3MgcmVmZXJlbmNlcwotCSAqIEZpbHRlciBtYXBwaW5ncyBkZWZpbmVkIGZvciB0aGUgd2ViIGFwcAotCSAqLwotCUVMaXN0IGdldEZpbHRlck1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIExpc3RlbmVycyByZWZlcmVuY2VzCi0JICogVGhlIGxpc3RlbmVycyBjb2xsZWN0aW9uIGNvbnRhaW5zIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIgYXBwbGljYXRpb24KLQkgKiBsaXN0ZW5lciBiZWFucyBpbiB0aGUgd2ViIGFwcC4KLQkgKi8KLQlFTGlzdCBnZXRMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRleHQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGV4dCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZXh0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29udGV4dFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SnNwIENvbmZpZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SnNwIENvbmZpZzwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpzcCBDb25maWc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEpzcENvbmZpZyhKU1BDb25maWcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0V2ViQXBwX0pzcENvbmZpZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKU1BDb25maWcgZ2V0SnNwQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0SnNwQ29uZmlnIDxlbT5Kc3AgQ29uZmlnPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kc3AgQ29uZmlnPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRKc3BDb25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEpzcENvbmZpZyhKU1BDb25maWcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IGdldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJBcHBSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViQXBwUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3NzcxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJBcHBSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYkFwcFJlc291cmNlIGV4dGVuZHMgWE1MUmVzb3VyY2UgewotCQotCS8qKgotCSAqIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBtb2RlbCBvYmplY3QgV2ViQXBwCi0JICogQHJldHVybiByZWZlcmVuY2UgdG8gIG1vZGVsIG9iamVjdCBXZWJBcHAKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBSZXNvdXJjZSBzdXBwb3J0cyB0aGUgV2ViIDIuMiBzcGVjLgotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCWJvb2xlYW4gaXNXZWIyXzIoKTsKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFJlc291cmNlIHN1cHBvcnRzIHRoZSBXZWIgMi4zIHNwZWMuCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JYm9vbGVhbiBpc1dlYjJfMygpOwotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgUmVzb3VyY2Ugc3VwcG9ydHMgdGhlIFdlYiAyLjQgc3BlYy4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlib29sZWFuIGlzV2ViMl80KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYlJlc291cmNlQ29sbGVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZjY4NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0IG9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZiBubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViUmVzb3VyY2VDb2xsZWN0aW9uIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCi0JLyoqCi0JICogQWRkcyBpbnN0YW5jZSBvZiBIVFRQTWV0aG9kVHlwZQotCSAqIEBwYXJhbSBodHRwTWV0aG9kIG5hbWUgb2YgdGhlIGh0dHBNZXRob2QgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkSFRUUChTdHJpbmcgaHR0cE1ldGhvZCk7Ci0JCi0JLyoqCi0JICogQWRkcyBpbnN0YW5jZSBvZiBVUkxQYXR0ZXJuVHlwZQotCSAqIEBwYXJhbSB1cmxQYXR0ZXJuIG5hbWUgb2YgdGhlIHVybCB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRVUkwoU3RyaW5nIHVybFBhdHRlcm4pOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBXZWJSZXNvdXJjZU5hbWUgYXR0cmlidXRlCi0JICogVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24KLQkgKi8KLQlTdHJpbmcgZ2V0V2ViUmVzb3VyY2VOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViUmVzb3VyY2VOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0V2ViUmVzb3VyY2VOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJsIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVybCBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcmwgUGF0dGVybjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybigpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRVcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IdHRwIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bX0uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGVFbnVtfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkh0dHAgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IdHRwIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGVFbnVtIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRIdHRwTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCA6IFVzZSBnZXRIdHRwTWV0aG9kKCk7Ci0JICogQHJldHVybiBMaXN0IG9mIEh0dHBNZXRob2RzCi0JICovCi0JRUxpc3QgZ2V0SFRUUHMoKTsKLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTZWNDb25zdHJhaW50IHJlZmVyZW5jZQotCSAqLwotCQotCQotCVNlY3VyaXR5Q29uc3RyYWludCBnZXRTZWNDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2VjQ29uc3RyYWludCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFNlY0NvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgVVJMcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0VVJMcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYlR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlODdiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlR5cGUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgZGVub3RlcyBhIEpTUAotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSnNwVHlwZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBkZW5vdGVzIGEgc2VydmxldAotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VydmxldFR5cGUoKTsKLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJhcHBsaWNhdGlvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYmFwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWI1MDFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYmFwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViYXBwbGljYXRpb25GYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViYXBwbGljYXRpb25GYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFdlYkFwcCB2YWx1ZQotCSAqLwotCVdlYkFwcCBjcmVhdGVXZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29udGV4dFBhcmFtIHZhbHVlCi0JICovCi0JQ29udGV4dFBhcmFtIGNyZWF0ZUNvbnRleHRQYXJhbSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFcnJvclBhZ2UgdmFsdWUKLQkgKi8KLQlFcnJvclBhZ2UgY3JlYXRlRXJyb3JQYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UgdmFsdWUKLQkgKi8KLQlFeGNlcHRpb25UeXBlRXJyb3JQYWdlIGNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRXJyb3JDb2RlRXJyb3JQYWdlIHZhbHVlCi0JICovCi0JRXJyb3JDb2RlRXJyb3JQYWdlIGNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBXZWxjb21lRmlsZUxpc3QgdmFsdWUKLQkgKi8KLQlXZWxjb21lRmlsZUxpc3QgY3JlYXRlV2VsY29tZUZpbGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFdlbGNvbWVGaWxlIHZhbHVlCi0JICovCi0JV2VsY29tZUZpbGUgY3JlYXRlV2VsY29tZUZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGFnTGliUmVmIHZhbHVlCi0JICovCi0JVGFnTGliUmVmIGNyZWF0ZVRhZ0xpYlJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZWN1cml0eUNvbnN0cmFpbnQgdmFsdWUKLQkgKi8KLQlTZWN1cml0eUNvbnN0cmFpbnQgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFdlYlJlc291cmNlQ29sbGVjdGlvbiB2YWx1ZQotCSAqLwotCVdlYlJlc291cmNlQ29sbGVjdGlvbiBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVVJMUGF0dGVyblR5cGUgdmFsdWUKLQkgKi8KLQlVUkxQYXR0ZXJuVHlwZSBjcmVhdGVVUkxQYXR0ZXJuVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBdXRoQ29uc3RyYWludCB2YWx1ZQotCSAqLwotCUF1dGhDb25zdHJhaW50IGNyZWF0ZUF1dGhDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFVzZXJEYXRhQ29uc3RyYWludCB2YWx1ZQotCSAqLwotCVVzZXJEYXRhQ29uc3RyYWludCBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTG9naW5Db25maWcgdmFsdWUKLQkgKi8KLQlMb2dpbkNvbmZpZyBjcmVhdGVMb2dpbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBGb3JtTG9naW5Db25maWcgdmFsdWUKLQkgKi8KLQlGb3JtTG9naW5Db25maWcgY3JlYXRlRm9ybUxvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1pbWVNYXBwaW5nIHZhbHVlCi0JICovCi0JTWltZU1hcHBpbmcgY3JlYXRlTWltZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2Vzc2lvbkNvbmZpZyB2YWx1ZQotCSAqLwotCVNlc3Npb25Db25maWcgY3JlYXRlU2Vzc2lvbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZXJ2bGV0TWFwcGluZyB2YWx1ZQotCSAqLwotCVNlcnZsZXRNYXBwaW5nIGNyZWF0ZVNlcnZsZXRNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlcnZsZXQgdmFsdWUKLQkgKi8KLQlTZXJ2bGV0IGNyZWF0ZVNlcnZsZXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2VydmxldFR5cGUgdmFsdWUKLQkgKi8KLQlTZXJ2bGV0VHlwZSBjcmVhdGVTZXJ2bGV0VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKU1BUeXBlIHZhbHVlCi0JICovCi0JSlNQVHlwZSBjcmVhdGVKU1BUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEluaXRQYXJhbSB2YWx1ZQotCSAqLwotCUluaXRQYXJhbSBjcmVhdGVJbml0UGFyYW0oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRmlsdGVyIHZhbHVlCi0JICovCi0JRmlsdGVyIGNyZWF0ZUZpbHRlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBGaWx0ZXJNYXBwaW5nIHZhbHVlCi0JICovCi0JRmlsdGVyTWFwcGluZyBjcmVhdGVGaWx0ZXJNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvY2FsRW5jb2RpbmdNYXBwaW5nIGNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhUVFAgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhUVFAgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBNZXRob2RUeXBlIGNyZWF0ZUhUVFBNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJvbGVOYW1lVHlwZSB2YWx1ZQotCSAqLwotCVJvbGVOYW1lVHlwZSBjcmVhdGVSb2xlTmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgbWV0aG9kIGlzIE5PVCBhcGksIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4gIAotCSAqIEVNRiBwYWNrYWdlIGNsYXNzZXMgc2hvdWxkIGJlIGFjY2VzcyB2aWEgdGhlaXIgImVJTlNUQU5DRSIgc3RhdGljIGZpZWxkcwotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViYXBwbGljYXRpb25QYWNrYWdlIGdldFdlYmFwcGxpY2F0aW9uUGFja2FnZSgpOwotCi19Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYmFwcGxpY2F0aW9uUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViYXBwbGljYXRpb25QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjJhZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViYXBwbGljYXRpb25QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCUBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAid2ViYXBwbGljYXRpb24iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0lDT05TID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW52aXJvbm1lbnQgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19SRVNPVVJDRV9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19FSkJfUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX1JFU09VUkNFX0VOVl9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9FTlZfUkVGUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19FSkJfTE9DQUxfUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX0xPQ0FMX1JFRlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19TRVJWSUNFX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19ESVNUUklCVVRBQkxFID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19DT05URVhUUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fRVJST1JfUEFHRVMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0ZJTEVfTElTVCA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fVEFHX0xJQlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0NPTlNUUkFJTlRTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19MT0dJTl9DT05GSUcgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX01JTUVfTUFQUElOR1MgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX1NFU1NJT05fQ09ORklHID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fU0VSVkxFVFMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDExOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19TRUNVUklUWV9ST0xFUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0ZJTFRFUlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19GSUxURVJfTUFQUElOR1MgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19MSVNURU5FUlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZXh0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpzcCBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19KU1BfQ09ORklHID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVCA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V2ViIEFwcDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDIwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRFWFRfUEFSQU0gPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05URVhUX1BBUkFNX19QQVJBTV9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRFWFRfUEFSQU1fX1dFQl9BUFAgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZXh0IFBhcmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFWFRfUEFSQU1fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVSUk9SX1BBR0UgPSA3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFID0gMjI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVSUk9SX0NPREVfRVJST1JfUEFHRSA9IDIzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfTElTVCA9IDY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFTENPTUVfRklMRSA9IDIxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUQUdfTElCX1JFRiA9IDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlQgPSA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTiA9IDEwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVUkxfUEFUVEVSTl9UWVBFID0gMTk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEhUVFBfTUVUSE9EX1RZUEUgPSAyODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVCA9IDExOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVU0VSX0RBVEFfQ09OU1RSQUlOVCA9IDEyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT0dJTl9DT05GSUcgPSAxMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRk9STV9MT0dJTl9DT05GSUcgPSAxNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUlNRV9NQVBQSU5HID0gNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9DT05GSUcgPSA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX01BUFBJTkcgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUID0gMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9fU0VSVkxFVF9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX19MT0FEX09OX1NUQVJUVVAgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfX1dFQl9BUFAgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfX1dFQl9UWVBFID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX19QQVJBTVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9fUlVOX0FTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19JTklUX1BBUkFNUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZXJ2bGV0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX01BUFBJTkdfX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX01BUFBJTkdfX1dFQl9BUFAgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX0NPTkZJR19fV0VCX0FQUCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlc3Npb24gQ29uZmlnPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQ09ORklHX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNSU1FX01BUFBJTkdfX0VYVEVOU0lPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNSU1FX01BUFBJTkdfX01JTUVfVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNSU1FX01BUFBJTkdfX1dFQl9BUFAgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NaW1lIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfTElTVF9fRklMRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFTENPTUVfRklMRV9MSVNUX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFUlJPUl9QQUdFX19MT0NBVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFUlJPUl9QQUdFX19XRUJfQVBQID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXJyb3IgUGFnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFUlJPUl9QQUdFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUQUdfTElCX1JFRl9fVEFHTElCX1VSSSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUQUdfTElCX1JFRl9fVEFHTElCX0xPQ0FUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9SRUZfX1dFQl9BUFAgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWcgTGliIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX1JFRl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHR0cCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SFRUIFBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUX1BTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V2ViIFJlc291cmNlIENvbGxlY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVVUSF9DT05TVFJBSU5UX19ST0xFUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkF1dGggQ29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVVRIX0NPTlNUUkFJTlRfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT0dJTl9DT05GSUdfX1JFQUxNX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yaXphdGlvbiBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0dJTl9DT05GSUdfX0FVVEhPUklaQVRJT05fTUVUSE9EID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHX19XRUJfQVBQID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUcgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Mb2dpbiBDb25maWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZvcm0gTG9naW4gQ29uZmlnPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZPUk1fTE9HSU5fQ09ORklHX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfVFlQRSA9IDE2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX1RZUEUgPSAxNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1RZUEUgPSAxODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSU5JVF9QQVJBTSA9IDE1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJTklUX1BBUkFNX19QQVJBTV9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElOSVRfUEFSQU1fX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkluaXQgUGFyYW08L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5JVF9QQVJBTV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V2ViIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX1RZUEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfVFlQRV9fQ0xBU1NfTkFNRSA9IFdFQl9UWVBFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZsZXQgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX1RZUEVfRkVBVFVSRV9DT1VOVCA9IFdFQl9UWVBFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpTUF9UWVBFX19KU1BfRklMRSA9IFdFQl9UWVBFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkpTUCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBXRUJfVFlQRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlVSTCBQYXR0ZXJuIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVVJMX1BBVFRFUk5fVFlQRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSID0gMjU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTFRFUl9NQVBQSU5HID0gMjQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJPTEVfTkFNRV9UWVBFID0gMjA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJPTEVfTkFNRV9UWVBFX19ST0xFX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIE5hbWUgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05BTUVfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VMQ09NRV9GSUxFX19GSUxFX0xJU1QgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XZWxjb21lIEZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VMQ09NRV9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19MT0NBVElPTiA9IEVSUk9SX1BBR0VfX0xPQ0FUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19XRUJfQVBQID0gRVJST1JfUEFHRV9fV0VCX0FQUDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRSA9IEVSUk9SX1BBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4Y2VwdGlvbiBUeXBlIEVycm9yIFBhZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9GRUFUVVJFX0NPVU5UID0gRVJST1JfUEFHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0xPQ0FUSU9OID0gRVJST1JfUEFHRV9fTE9DQVRJT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVSUk9SX0NPREVfRVJST1JfUEFHRV9fV0VCX0FQUCA9IEVSUk9SX1BBR0VfX1dFQl9BUFA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRVJST1JfQ09ERV9FUlJPUl9QQUdFX19FUlJPUl9DT0RFID0gRVJST1JfUEFHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXJyb3IgQ29kZSBFcnJvciBQYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVSUk9SX0NPREVfRVJST1JfUEFHRV9GRUFUVVJFX0NPVU5UID0gRVJST1JfUEFHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk4gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGF0Y2hlciBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkdfX0ZJTFRFUiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfTUFQUElOR19fU0VSVkxFVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX19JQ09OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTFRFUl9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTFRFUl9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTFRFUl9fTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSX19JTklUX1BBUkFNUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSX19GSUxURVJfQ0xBU1MgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbSBWYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9fSU5JVF9QQVJBTV9WQUxVRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmlsdGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkxvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbCA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTE9DQUxfRU5DT0RJTkdfTUFQUElORyA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuY29kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkcgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPQ0FMX0VOQ09ESU5HX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh0dHAgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9NRVRIT0RfVFlQRV9fSFRUUF9NRVRIT0QgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5IVFRQIE1ldGhvZCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfTUVUSE9EX1RZUEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5SZXNBdXRoU2VydmxldFR5cGUgPGVtPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uUmVzQXV0aFNlcnZsZXRUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0UmVzQXV0aFNlcnZsZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU19BVVRIX1NFUlZMRVRfVFlQRSA9IDI5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW0gPGVtPkhUVFAgTWV0aG9kIFR5cGUgRW51bTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGVFbnVtCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0SFRUUE1ldGhvZFR5cGVFbnVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhUVFBfTUVUSE9EX1RZUEVfRU5VTSA9IDMwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRSA9IDMxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGUgPGVtPkRpc3BhdGNoZXIgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXREaXNwYXRjaGVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNQQVRDSEVSX1RZUEUgPSAzMjsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoTWV0aG9kS2luZCA8ZW0+QXV0aCBNZXRob2QgS2luZDwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aE1ldGhvZEtpbmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRBdXRoTWV0aG9kS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBVVRIX01FVEhPRF9LSU5EID0gMzM7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gIndlYmFwcGxpY2F0aW9uLnhtaSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBXZWJBcHAgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViQXBwX0Rpc3RyaWJ1dGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViQXBwX1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9Db250ZXh0cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9GaWxlTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1RhZ0xpYnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9Db25zdHJhaW50cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWltZU1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlcnZsZXRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ZpbHRlcnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xpc3RlbmVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRDb250ZXh0UGFyYW1zIDxlbT5Db250ZXh0IFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGV4dCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0Q29udGV4dFBhcmFtcygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0SnNwQ29uZmlnIDxlbT5Kc3AgQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SnNwIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRKc3BDb25maWcoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0pzcENvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29udGV4dFBhcmFtIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb250ZXh0UGFyYW0oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4gTmFtZQotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGV4dFBhcmFtX1BhcmFtTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybiBWYWx1ZQotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGV4dFBhcmFtX1BhcmFtVmFsdWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4gRGVzY3JpcHRpb24KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRleHRQYXJhbV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybiBXZWJBcHAKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRleHRQYXJhbV9XZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRXJyb3JQYWdlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFcnJvclBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4gTG9jYXRpb24KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVycm9yUGFnZV9Mb2NhdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybiBXZWJBcHAKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVycm9yUGFnZV9XZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFeGNlcHRpb25UeXBlRXJyb3JQYWdlX0V4Y2VwdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRXJyb3JDb2RlRXJyb3JQYWdlIG9iamVjdAotCSAqLwotCS8qKgotCSAqIEByZXR1cm4gRXJyb3JDb2RlRXJyb3JQYWdlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFcnJvckNvZGVFcnJvclBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4gRXJyb3JDb2RlCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFcnJvckNvZGVFcnJvclBhZ2VfRXJyb3JDb2RlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFdlbGNvbWVGaWxlTGlzdCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0V2VsY29tZUZpbGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlbGNvbWVGaWxlTGlzdF9XZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2VsY29tZUZpbGVMaXN0X0ZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2VsY29tZUZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFdlbGNvbWVGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlbGNvbWVGaWxlX1dlbGNvbWVGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlbGNvbWVGaWxlX0ZpbGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRhZ0xpYlJlZiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFnTGliUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhZ0xpYlJlZl9UYWdsaWJVUkkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliUmVmX1RhZ2xpYkxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWYjZ2V0V2ViQXBwIDxlbT5XZWIgQXBwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPldlYiBBcHA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWYjZ2V0V2ViQXBwKCkKLQkgKiBAc2VlICNnZXRUYWdMaWJSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhZ0xpYlJlZl9XZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2VjdXJpdHlDb25zdHJhaW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRTZWN1cml0eUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50I2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5Q29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X0F1dGhDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50I2dldERpc3BsYXlOYW1lcygpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFdlYlJlc291cmNlQ29sbGVjdGlvbiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldFVybFBhdHRlcm4gPGVtPlVybCBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5VcmwgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRVcmxQYXR0ZXJuKCkKLQkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldEh0dHBNZXRob2QgPGVtPkh0dHAgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5IdHRwIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRIdHRwTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9TZWNDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldFVSTHMgPGVtPlVSIExzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjUvMjAwMyB1c2Uge0BsaW5rICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybigpfQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5VUiBMczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRVUkxzKCkKLQkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VUkxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SFRUUHMgPGVtPkhUVCBQczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZCBzaW5jZSA0LzI1LzIwMDMgdXNlIHtAbGluayAjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2QoKX0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SFRUIFBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldEhUVFBzKCkKLQkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IVFRQcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBVUkxQYXR0ZXJuVHlwZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0VVJMUGF0dGVyblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VVJMUGF0dGVyblR5cGVfVXJsUGF0dGVybigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRVUkxQYXR0ZXJuVHlwZV9SZXNDb2xsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEhUVFBNZXRob2RUeXBlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRIVFRQTWV0aG9kVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZSNnZXRIdHRwTWV0aG9kIDxlbT5IdHRwIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh0dHAgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGUjZ2V0SHR0cE1ldGhvZCgpCi0JICogQHNlZSAjZ2V0SFRUUE1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEhUVFBNZXRob2RUeXBlX0h0dHBNZXRob2QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXV0aENvbnN0cmFpbnQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEF1dGhDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAcmV0dXJuIERlc2NyaXB0aW9uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQHJldHVybiBSb2xlcwotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXV0aENvbnN0cmFpbnRfUm9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEByZXR1cm4gU2VjQ29uc3RyYWludCBvYmplY3QKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEF1dGhDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRBdXRoQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFVzZXJEYXRhQ29uc3RyYWludCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0VXNlckRhdGFDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFVzZXJEYXRhQ29uc3RyYWludF9TZWNDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTG9naW5Db25maWcgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldExvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnI2dldEF1dGhvcml6YXRpb25NZXRob2QgPGVtPkF1dGhvcml6YXRpb24gTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aG9yaXphdGlvbiBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZyNnZXRBdXRob3JpemF0aW9uTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRMb2dpbkNvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9naW5Db25maWdfQXV0aG9yaXphdGlvbk1ldGhvZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb2dpbkNvbmZpZ19XZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEZvcm1Mb2dpbkNvbmZpZyBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0Rm9ybUxvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtTG9naW5QYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZvcm1Mb2dpbkNvbmZpZ19Mb2dpbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNaW1lTWFwcGluZyBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TWltZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1pbWVNYXBwaW5nX01pbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1pbWVNYXBwaW5nX1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZXNzaW9uQ29uZmlnIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRTZXNzaW9uQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkNvbmZpZ19XZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2VydmxldE1hcHBpbmcgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFNlcnZsZXRNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZsZXRNYXBwaW5nX1VybFBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZyNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRTZXJ2bGV0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldE1hcHBpbmdfTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2bGV0TWFwcGluZ19XZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmxldE1hcHBpbmdfU2VydmxldCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZXJ2bGV0IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRTZXJ2bGV0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZsZXRfU2VydmxldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldF9Mb2FkT25TdGFydHVwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRfV2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZsZXRfV2ViVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1BhcmFtcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmxldF9SdW5BcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluaXQgUGFyYW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCNnZXRJbml0UGFyYW1zKCkKLQkgKiBAc2VlICNnZXRTZXJ2bGV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X0luaXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2ViVHlwZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0V2ViVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZXJ2bGV0VHlwZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VydmxldFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmxldFR5cGVfQ2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEpTUFR5cGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEpTUFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVHlwZV9Kc3BGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEluaXRQYXJhbSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SW5pdFBhcmFtKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEluaXRQYXJhbV9QYXJhbU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEZpbHRlciBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbHRlcl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpbHRlcl9Jbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZpbHRlcl9GaWx0ZXJDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlciNnZXRJbml0UGFyYW1WYWx1ZXMgPGVtPkluaXQgUGFyYW0gVmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Jbml0IFBhcmFtIFZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlciNnZXRJbml0UGFyYW1WYWx1ZXMoKQotCSAqIEBzZWUgI2dldEZpbHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmlsdGVyX0luaXRQYXJhbVZhbHVlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBGaWx0ZXJNYXBwaW5nIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRGaWx0ZXJNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlck1hcHBpbmcjZ2V0RGlzcGF0Y2hlclR5cGUgPGVtPkRpc3BhdGNoZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RGlzcGF0Y2hlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZyNnZXREaXNwYXRjaGVyVHlwZSgpCi0JICogQHNlZSAjZ2V0RmlsdGVyTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVyVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWx0ZXJNYXBwaW5nX1NlcnZsZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0I2dldExvY2FsRW5jb2RpbmdNYXBwaW5ncyA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0I2dldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZyA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExvY2FsRW5jb2RpbmdNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nI2dldExvY2FsZSA8ZW0+TG9jYWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmcjZ2V0TG9jYWxlKCkKLQkgKiBAc2VlICNnZXRMb2NhbEVuY29kaW5nTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVuY29kaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmcjZ2V0RW5jb2RpbmcoKQotCSAqIEBzZWUgI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ19FbmNvZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5SZXNBdXRoU2VydmxldFR5cGUgPGVtPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJlc0F1dGhTZXJ2bGV0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRSZXNBdXRoU2VydmxldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGVFbnVtIDxlbT5IVFRQIE1ldGhvZCBUeXBlIEVudW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5IVFRQIE1ldGhvZCBUeXBlIEVudW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0SFRUUE1ldGhvZFR5cGVFbnVtKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJvbGVOYW1lVHlwZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZU5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVOYW1lVHlwZV9Sb2xlTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGUgPGVtPkRpc3BhdGNoZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkRpc3BhdGNoZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkRpc3BhdGNoZXJUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERpc3BhdGNoZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhNZXRob2RLaW5kIDxlbT5BdXRoIE1ldGhvZCBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+QXV0aCBNZXRob2QgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhNZXRob2RLaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldEF1dGhNZXRob2RLaW5kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwgPGVtPldlYiBBcHA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0V2ViQXBwKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFQl9BUFAgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXN0cmlidXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX0FQUF9fRElTVFJJQlVUQUJMRSA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfRGlzdHJpYnV0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9BUFBfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1ZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19DT05URVhUUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfQ29udGV4dHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVycm9yIFBhZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19FUlJPUl9QQUdFUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfRXJyb3JQYWdlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmlsZSBMaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fRklMRV9MSVNUID0gZUlOU1RBTkNFLmdldFdlYkFwcF9GaWxlTGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnIExpYnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1RBR19MSUJTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9UYWdMaWJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fQ09OU1RSQUlOVFMgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2dpbiBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19MT0dJTl9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaW1lIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19NSU1FX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlc3Npb24gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fU0VTU0lPTl9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1NFUlZMRVRTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9TZXJ2bGV0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9TZWN1cml0eVJvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19GSUxURVJTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9GaWx0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXIgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX0FQUF9fTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9MaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19DT05URVhUX1BBUkFNUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SnNwIENvbmZpZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0pTUF9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0pzcENvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TID0gZUlOU1RBTkNFLmdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Db250ZXh0UGFyYW1JbXBsIDxlbT5Db250ZXh0IFBhcmFtPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Db250ZXh0UGFyYW1JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldENvbnRleHRQYXJhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URVhUX1BBUkFNID0gZUlOU1RBTkNFLmdldENvbnRleHRQYXJhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q29udGV4dFBhcmFtX1BhcmFtTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URVhUX1BBUkFNX19QQVJBTV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRDb250ZXh0UGFyYW1fUGFyYW1WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URVhUX1BBUkFNX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb250ZXh0UGFyYW1fRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVYVF9QQVJBTV9fV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRDb250ZXh0UGFyYW1fV2ViQXBwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsIDxlbT5TZXJ2bGV0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRTZXJ2bGV0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFUlZMRVQgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkxFVF9fU0VSVkxFVF9OQU1FID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfU2VydmxldE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvYWQgT24gU3RhcnR1cDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZMRVRfX0xPQURfT05fU1RBUlRVUCA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9fV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X1dlYkFwcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWTEVUX19XRUJfVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X1dlYlR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9fUEFSQU1TID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfUGFyYW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJ1biBBczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZMRVRfX1JVTl9BUyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X1J1bkFzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkxFVF9fSU5JVF9QQVJBTVMgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldF9Jbml0UGFyYW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRNYXBwaW5nSW1wbCA8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0U2VydmxldE1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VSVkxFVF9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFNlcnZsZXRNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0U2VydmxldE1hcHBpbmdfVXJsUGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZMRVRfTUFQUElOR19fTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0TWFwcGluZ19OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZMRVRfTUFQUElOR19fV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0TWFwcGluZ19XZWJBcHAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWTEVUX01BUFBJTkdfX1NFUlZMRVQgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldE1hcHBpbmdfU2VydmxldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5TZXNzaW9uQ29uZmlnSW1wbCA8ZW0+U2Vzc2lvbiBDb25maWc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlNlc3Npb25Db25maWdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFNlc3Npb25Db25maWcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VTU0lPTl9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkNvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUaW1lb3V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVCA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQ29uZmlnX1Nlc3Npb25UaW1lb3V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFU1NJT05fQ09ORklHX19XRUJfQVBQID0gZUlOU1RBTkNFLmdldFNlc3Npb25Db25maWdfV2ViQXBwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1pbWVNYXBwaW5nSW1wbCA8ZW0+TWltZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5NaW1lTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0TWltZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUlNRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldE1pbWVNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlbnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNSU1FX01BUFBJTkdfX0VYVEVOU0lPTiA9IGVJTlNUQU5DRS5nZXRNaW1lTWFwcGluZ19FeHRlbnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1pbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1JTUVfTUFQUElOR19fTUlNRV9UWVBFID0gZUlOU1RBTkNFLmdldE1pbWVNYXBwaW5nX01pbWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1JTUVfTUFQUElOR19fV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRNaW1lTWFwcGluZ19XZWJBcHAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2VsY29tZUZpbGVMaXN0SW1wbCA8ZW0+V2VsY29tZSBGaWxlIExpc3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlbGNvbWVGaWxlTGlzdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0V2VsY29tZUZpbGVMaXN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdFTENPTUVfRklMRV9MSVNUID0gZUlOU1RBTkNFLmdldFdlbGNvbWVGaWxlTGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIEFwcDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZUxpc3RfV2ViQXBwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUxDT01FX0ZJTEVfTElTVF9fRklMRSA9IGVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZUxpc3RfRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5FcnJvclBhZ2VJbXBsIDxlbT5FcnJvciBQYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5FcnJvclBhZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEVycm9yUGFnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFUlJPUl9QQUdFID0gZUlOU1RBTkNFLmdldEVycm9yUGFnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFUlJPUl9QQUdFX19MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRFcnJvclBhZ2VfTG9jYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRVJST1JfUEFHRV9fV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRFcnJvclBhZ2VfV2ViQXBwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlRhZ0xpYlJlZkltcGwgPGVtPlRhZyBMaWIgUmVmPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5UYWdMaWJSZWZJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFRhZ0xpYlJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQUdfTElCX1JFRiA9IGVJTlNUQU5DRS5nZXRUYWdMaWJSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhZ2xpYiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfTElCX1JFRl9fVEFHTElCX1VSSSA9IGVJTlNUQU5DRS5nZXRUYWdMaWJSZWZfVGFnbGliVVJJKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWdsaWIgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQUdfTElCX1JFRl9fVEFHTElCX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldFRhZ0xpYlJlZl9UYWdsaWJMb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIEFwcDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQUdfTElCX1JFRl9fV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRUYWdMaWJSZWZfV2ViQXBwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Q29uc3RyYWludEltcGwgPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlNlY3VyaXR5Q29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFQ1VSSVRZX0NPTlNUUkFJTlQgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFAgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYkFwcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFJlc291cmNlIENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGggQ29uc3RyYWludDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZXIgRGF0YSBDb25zdHJhaW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUyA9IGVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYlJlc291cmNlQ29sbGVjdGlvbkltcGwgPGVtPldlYiBSZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTiA9IGVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBSZXNvdXJjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXJsIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SHR0cCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjIENvbnN0cmFpbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9TZWNDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VUiBMczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSX0xTID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VUkxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SFRUIFBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUX1BTID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IVFRQcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BdXRoQ29uc3RyYWludEltcGwgPGVtPkF1dGggQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXV0aENvbnN0cmFpbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEF1dGhDb25zdHJhaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFVVEhfQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRBdXRoQ29uc3RyYWludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVVUSF9DT05TVFJBSU5UX19ST0xFUyA9IGVJTlNUQU5DRS5nZXRBdXRoQ29uc3RyYWludF9Sb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjIENvbnN0cmFpbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVVUSF9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRBdXRoQ29uc3RyYWludF9TZWNDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsIDxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuVXNlckRhdGFDb25zdHJhaW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVVNFUl9EQVRBX0NPTlNUUkFJTlQgPSBlSU5TVEFOQ0UuZ2V0VXNlckRhdGFDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRSA9IGVJTlNUQU5DRS5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWMgQ29uc3RyYWludDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQgPSBlSU5TVEFOQ0UuZ2V0VXNlckRhdGFDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyA9IGVJTlNUQU5DRS5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkxvZ2luQ29uZmlnSW1wbCA8ZW0+TG9naW4gQ29uZmlnPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Mb2dpbkNvbmZpZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0TG9naW5Db25maWcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTE9HSU5fQ09ORklHID0gZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRoIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0TG9naW5Db25maWdfQXV0aE1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVhbG0gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExPR0lOX0NPTkZJR19fUkVBTE1fTkFNRSA9IGVJTlNUQU5DRS5nZXRMb2dpbkNvbmZpZ19SZWFsbU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcml6YXRpb24gTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9HSU5fQ09ORklHX19BVVRIT1JJWkFUSU9OX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRMb2dpbkNvbmZpZ19BdXRob3JpemF0aW9uTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExPR0lOX0NPTkZJR19fV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRMb2dpbkNvbmZpZ19XZWJBcHAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZvcm0gTG9naW4gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRyA9IGVJTlNUQU5DRS5nZXRMb2dpbkNvbmZpZ19Gb3JtTG9naW5Db25maWcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuRm9ybUxvZ2luQ29uZmlnSW1wbCA8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkZvcm1Mb2dpbkNvbmZpZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0Rm9ybUxvZ2luQ29uZmlnKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEZPUk1fTE9HSU5fQ09ORklHID0gZUlOU1RBTkNFLmdldEZvcm1Mb2dpbkNvbmZpZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Rm9ybSBMb2dpbiBQYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRSA9IGVJTlNUQU5DRS5nZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Rm9ybSBFcnJvciBQYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRSA9IGVJTlNUQU5DRS5nZXRGb3JtTG9naW5Db25maWdfRm9ybUVycm9yUGFnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9naW4gQ29uZmlnPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0Rm9ybUxvZ2luQ29uZmlnX0xvZ2luQ29uZmlnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwgPGVtPkluaXQgUGFyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0SW5pdFBhcmFtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElOSVRfUEFSQU0gPSBlSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSA9IGVJTlNUQU5DRS5nZXRJbml0UGFyYW1fUGFyYW1OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFID0gZUlOU1RBTkNFLmdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOSVRfUEFSQU1fX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJUeXBlSW1wbCA8ZW0+V2ViIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYlR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFdlYlR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0VCX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V2ViVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5TZXJ2bGV0VHlwZUltcGwgPGVtPlNlcnZsZXQgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuU2VydmxldFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFNlcnZsZXRUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFUlZMRVRfVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZMRVRfVFlQRV9fQ0xBU1NfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0VHlwZV9DbGFzc05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuSlNQVHlwZUltcGwgPGVtPkpTUCBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5KU1BUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRKU1BUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpTUF9UWVBFID0gZUlOU1RBTkNFLmdldEpTUFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpzcCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSlNQX1RZUEVfX0pTUF9GSUxFID0gZUlOU1RBTkNFLmdldEpTUFR5cGVfSnNwRmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5VUkxQYXR0ZXJuVHlwZUltcGwgPGVtPlVSTCBQYXR0ZXJuIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlVSTFBhdHRlcm5UeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRVUkxQYXR0ZXJuVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBVUkxfUEFUVEVSTl9UWVBFID0gZUlOU1RBTkNFLmdldFVSTFBhdHRlcm5UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFVSTF9QQVRURVJOX1RZUEVfX1VSTF9QQVRURVJOID0gZUlOU1RBTkNFLmdldFVSTFBhdHRlcm5UeXBlX1VybFBhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcyBDb2xsZWN0aW9uPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OID0gZUlOU1RBTkNFLmdldFVSTFBhdHRlcm5UeXBlX1Jlc0NvbGxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuUm9sZU5hbWVUeXBlSW1wbCA8ZW0+Um9sZSBOYW1lIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLlJvbGVOYW1lVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0Um9sZU5hbWVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfTkFNRV9UWVBFID0gZUlOU1RBTkNFLmdldFJvbGVOYW1lVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9OQU1FX1RZUEVfX1JPTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRSb2xlTmFtZVR5cGVfUm9sZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2VsY29tZUZpbGVJbXBsIDxlbT5XZWxjb21lIEZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlbGNvbWVGaWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRXZWxjb21lRmlsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXRUxDT01FX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0V2VsY29tZUZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlbGNvbWUgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdFTENPTUVfRklMRV9fV0VMQ09NRV9GSUxFID0gZUlOU1RBTkNFLmdldFdlbGNvbWVGaWxlX1dlbGNvbWVGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWxlIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VMQ09NRV9GSUxFX19GSUxFX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0V2VsY29tZUZpbGVfRmlsZUxpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuRXhjZXB0aW9uVHlwZUVycm9yUGFnZUltcGwgPGVtPkV4Y2VwdGlvbiBUeXBlIEVycm9yIFBhZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkV4Y2VwdGlvblR5cGVFcnJvclBhZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRSA9IGVJTlNUQU5DRS5nZXRFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNlcHRpb24gVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5FcnJvckNvZGVFcnJvclBhZ2VJbXBsIDxlbT5FcnJvciBDb2RlIEVycm9yIFBhZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkVycm9yQ29kZUVycm9yUGFnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0RXJyb3JDb2RlRXJyb3JQYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVSUk9SX0NPREVfRVJST1JfUEFHRSA9IGVJTlNUQU5DRS5nZXRFcnJvckNvZGVFcnJvclBhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVycm9yIENvZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0VSUk9SX0NPREUgPSBlSU5TVEFOQ0UuZ2V0RXJyb3JDb2RlRXJyb3JQYWdlX0Vycm9yQ29kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbCA8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkZpbHRlck1hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEZpbHRlck1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRklMVEVSX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXJsIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRklMVEVSX01BUFBJTkdfX0ZJTFRFUiA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJTFRFUl9NQVBQSU5HX19TRVJWTEVUID0gZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfU2VydmxldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsIDxlbT5GaWx0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkZpbHRlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0RmlsdGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEZJTFRFUiA9IGVJTlNUQU5DRS5nZXRGaWx0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUxURVJfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RmlsdGVyX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGSUxURVJfX0lOSVRfUEFSQU1TID0gZUlOU1RBTkNFLmdldEZpbHRlcl9Jbml0UGFyYW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXIgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGSUxURVJfX0ZJTFRFUl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJfRmlsdGVyQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW0gVmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBGSUxURVJfX0lOSVRfUEFSQU1fVkFMVUVTID0gZUlOU1RBTkNFLmdldEZpbHRlcl9Jbml0UGFyYW1WYWx1ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbCA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkxvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbCA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExPQ0FMX0VOQ09ESU5HX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRSA9IGVJTlNUQU5DRS5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ19Mb2NhbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVuY29kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkcgPSBlSU5TVEFOQ0UuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuSFRUUE1ldGhvZFR5cGVJbXBsIDxlbT5IVFRQIE1ldGhvZCBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5IVFRQTWV0aG9kVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0SFRUUE1ldGhvZFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSFRUUF9NRVRIT0RfVFlQRSA9IGVJTlNUQU5DRS5nZXRIVFRQTWV0aG9kVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SHR0cCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBIVFRQX01FVEhPRF9UWVBFX19IVFRQX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRIVFRQTWV0aG9kVHlwZV9IdHRwTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5SZXNBdXRoU2VydmxldFR5cGUgPGVtPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uUmVzQXV0aFNlcnZsZXRUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFJlc0F1dGhTZXJ2bGV0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFJFU19BVVRIX1NFUlZMRVRfVFlQRSA9IGVJTlNUQU5DRS5nZXRSZXNBdXRoU2VydmxldFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bSA8ZW0+SFRUUCBNZXRob2QgVHlwZSBFbnVtPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0SFRUUE1ldGhvZFR5cGVFbnVtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gSFRUUF9NRVRIT0RfVFlQRV9FTlVNID0gZUlOU1RBTkNFLmdldEhUVFBNZXRob2RUeXBlRW51bSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVHJhbnNwb3J0R3VhcmFudGVlVHlwZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBUUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGUgPGVtPkRpc3BhdGNoZXIgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwjZ2V0RGlzcGF0Y2hlclR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBESVNQQVRDSEVSX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RGlzcGF0Y2hlclR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhNZXRob2RLaW5kIDxlbT5BdXRoIE1ldGhvZCBLaW5kPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoTWV0aG9kS2luZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRBdXRoTWV0aG9kS2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIEFVVEhfTUVUSE9EX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0QXV0aE1ldGhvZEtpbmQoKTsKLQotCX0KLQotfSAvL1dlYmFwcGxpY2F0aW9uUGFja2FnZQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2VsY29tZUZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlbGNvbWVGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGJiMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2VsY29tZUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotLyoqCi0gKiBUaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZSBhcyBhIGRlZmF1bHQgd2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKLSAqIEBzaW5jZSAxLjAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWxjb21lRmlsZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgV2VsY29tZUZpbGUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldFdlbGNvbWVGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2VsY29tZUZpbGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRXZWxjb21lRmlsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRmlsZUxpc3QgcmVmZXJlbmNlCi0JICovCi0JV2VsY29tZUZpbGVMaXN0IGdldEZpbGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRmlsZUxpc3QgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRGaWxlTGlzdChXZWxjb21lRmlsZUxpc3QgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2VsY29tZUZpbGVMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWxjb21lRmlsZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhZTk4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWxjb21lRmlsZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLS8qKgotICogVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lIGZpbGVzIGVsZW1lbnRzLgotICogQGdlbmVyYXRlZAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlbGNvbWVGaWxlTGlzdCBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGZpbGUgd2hvc2UgbmFtZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHBhcmFtZXRlcgotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGFkZGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRmlsZU5hbWVkKFN0cmluZyBuYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFdlYkFwcChXZWJBcHAgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBGaWxlIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRGaWxlKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0F1dGhDb25zdHJhaW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BdXRoQ29uc3RyYWludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlYjJjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0F1dGhDb25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoZSBhdXRoLWNvbnN0cmFpbnQgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdCBzaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24uIFRoZSByb2xlIHVzZWQgaGVyZSBtdXN0IGFwcGVhciBpbiBhIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRoQ29uc3RyYWludEltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBBdXRoQ29uc3RyYWludCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJvbGVzID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgQXV0aENvbnN0cmFpbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5BVVRIX0NPTlNUUkFJTlQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgYXV0aCBjb25zdHJhaW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBBIGxpc3Qgb2Ygcm9sZSBuYW1lcyBmb3IgdGhlIGF1dGggY29uc3RyYWludC4gIEVhY2ggZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgKiBvZiBhIHNlY3VyaXR5IHJvbGUgKGEgU3RyaW5nKS4KLQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlcygpIHsKLQkJaWYgKHJvbGVzID09IG51bGwpIHsKLQkJCXJvbGVzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fUk9MRVMpOwotCQl9Ci0JCXJldHVybiByb2xlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlDb25zdHJhaW50IGdldFNlY0NvbnN0cmFpbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChTZWN1cml0eUNvbnN0cmFpbnQpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlY0NvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IG5ld1NlY0NvbnN0cmFpbnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1NlY0NvbnN0cmFpbnQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgbmV3U2VjQ29uc3RyYWludCkgewotCQlpZiAobmV3U2VjQ29uc3RyYWludCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCAmJiBuZXdTZWNDb25zdHJhaW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3U2VjQ29uc3RyYWludCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1NlY0NvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VjQ29uc3RyYWludCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVCwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlY0NvbnN0cmFpbnQobmV3U2VjQ29uc3RyYWludCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCwgbmV3U2VjQ29uc3RyYWludCwgbmV3U2VjQ29uc3RyYWludCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U2VjQ29uc3RyYWludCgoU2VjdXJpdHlDb25zdHJhaW50KW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZWNDb25zdHJhaW50KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1JPTEVTOgotCQkJCXJldHVybiBnZXRSb2xlcygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gZ2V0U2VjQ29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fUk9MRVM6Ci0JCQkJZ2V0Um9sZXMoKS5jbGVhcigpOwotCQkJCWdldFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCXNldFNlY0NvbnN0cmFpbnQoKFNlY3VyaXR5Q29uc3RyYWludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1JPTEVTOgotCQkJCWdldFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCXNldFNlY0NvbnN0cmFpbnQoKFNlY3VyaXR5Q29uc3RyYWludCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fUk9MRVM6Ci0JCQkJcmV0dXJuIHJvbGVzICE9IG51bGwgJiYgIXJvbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGdldFNlY0NvbnN0cmFpbnQoKSAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb2xlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm9sZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0NvbnRleHRQYXJhbUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQ29udGV4dFBhcmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQ3MjU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQ29udGV4dFBhcmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRleHRQYXJhbUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb250ZXh0UGFyYW0gewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtTmFtZSgpIDxlbT5QYXJhbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJhbU5hbWUgPSBQQVJBTV9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbVZhbHVlKCkgPGVtPlBhcmFtIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtVmFsdWUgPSBQQVJBTV9WQUxVRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JcHVibGljIENvbnRleHRQYXJhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkNPTlRFWFRfUEFSQU07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtTmFtZSgpIHsKLQkJcmV0dXJuIHBhcmFtTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbU5hbWUoU3RyaW5nIG5ld1BhcmFtTmFtZSkgewotCQlTdHJpbmcgb2xkUGFyYW1OYW1lID0gcGFyYW1OYW1lOwotCQlwYXJhbU5hbWUgPSBuZXdQYXJhbU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19QQVJBTV9OQU1FLCBvbGRQYXJhbU5hbWUsIHBhcmFtTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtVmFsdWUoKSB7Ci0JCXJldHVybiBwYXJhbVZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtVmFsdWUoU3RyaW5nIG5ld1BhcmFtVmFsdWUpIHsKLQkJU3RyaW5nIG9sZFBhcmFtVmFsdWUgPSBwYXJhbVZhbHVlOwotCQlwYXJhbVZhbHVlID0gbmV3UGFyYW1WYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFLCBvbGRQYXJhbVZhbHVlLCBwYXJhbVZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFAsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCkgewotCQlpZiAobmV3V2ViQXBwICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlYkFwcChuZXdXZWJBcHAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKChXZWJBcHApb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQOgotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVFMsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtTmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtVmFsdWUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJc2V0UGFyYW1OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXNldFBhcmFtVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJc2V0UGFyYW1OYW1lKFBBUkFNX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXNldFBhcmFtVmFsdWUoUEFSQU1fVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fUEFSQU1fTkFNRToKLQkJCQlyZXR1cm4gUEFSQU1fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGFyYW1OYW1lICE9IG51bGwgOiAhUEFSQU1fTkFNRV9FREVGQVVMVC5lcXVhbHMocGFyYW1OYW1lKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXJldHVybiBQQVJBTV9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gcGFyYW1WYWx1ZSAhPSBudWxsIDogIVBBUkFNX1ZBTFVFX0VERUZBVUxULmVxdWFscyhwYXJhbVZhbHVlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhcmFtTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyYW1OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbVZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbVZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Vycm9yQ29kZUVycm9yUGFnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JDb2RlRXJyb3JQYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRlZDM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JDb2RlRXJyb3JQYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvckNvZGVFcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDb2RlRXJyb3JQYWdlSW1wbCBleHRlbmRzIEVycm9yUGFnZUltcGwgaW1wbGVtZW50cyBFcnJvckNvZGVFcnJvclBhZ2UgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVycm9yQ29kZSgpIDxlbT5FcnJvciBDb2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFcnJvckNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0NPREVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlcnJvckNvZGUgPSBFUlJPUl9DT0RFX0VERUZBVUxUOwotCXB1YmxpYyBFcnJvckNvZGVFcnJvclBhZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5FUlJPUl9DT0RFX0VSUk9SX1BBR0U7Ci0JfQotCi0vKioKLSAqIGlzRXJyb3JDb2RlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0Vycm9yQ29kZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZXJyb3ItY29kZSBjb250YWlucyBhbiBIVFRQIGVycm9yIGNvZGUsIGV4OiA0MDQKLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JDb2RlKCkgewotCQlyZXR1cm4gZXJyb3JDb2RlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yQ29kZShTdHJpbmcgbmV3RXJyb3JDb2RlKSB7Ci0JCVN0cmluZyBvbGRFcnJvckNvZGUgPSBlcnJvckNvZGU7Ci0JCWVycm9yQ29kZSA9IG5ld0Vycm9yQ29kZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRV9fRVJST1JfQ09ERSwgb2xkRXJyb3JDb2RlLCBlcnJvckNvZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0VSUk9SX0NPREU6Ci0JCQkJcmV0dXJuIGdldEVycm9yQ29kZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0VSUk9SX0NPREU6Ci0JCQkJc2V0RXJyb3JDb2RlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0VSUk9SX0NPREU6Ci0JCQkJc2V0RXJyb3JDb2RlKEVSUk9SX0NPREVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19FUlJPUl9DT0RFOgotCQkJCXJldHVybiBFUlJPUl9DT0RFX0VERUZBVUxUID09IG51bGwgPyBlcnJvckNvZGUgIT0gbnVsbCA6ICFFUlJPUl9DT0RFX0VERUZBVUxULmVxdWFscyhlcnJvckNvZGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZXJyb3JDb2RlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlcnJvckNvZGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Vycm9yUGFnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JQYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzg1ZGQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JQYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGVycm9yLXBhZ2UgZWxlbWVudCBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlIG9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JQYWdlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVycm9yUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uID0gTE9DQVRJT05fRURFRkFVTFQ7Ci0JcHVibGljIEVycm9yUGFnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkVSUk9SX1BBR0U7Ci0JfQotCi0vKioKLSAqIGlzRXJyb3JDb2RlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0Vycm9yQ29kZSgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKioKLSAqIGlzRXhjZXB0aW9uVHlwZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNFeGNlcHRpb25UeXBlKCkgewotCXJldHVybiBmYWxzZTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGluIHRoZSB3ZWIKLQkgKiBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbmV3TG9jYXRpb24pIHsKLQkJU3RyaW5nIG9sZExvY2F0aW9uID0gbG9jYXRpb247Ci0JCWxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTiwgb2xkTG9jYXRpb24sIGxvY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJBcHApZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHAsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKLQkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdXZWJBcHAgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVMsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXZWJBcHAobmV3V2ViQXBwLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQLCBuZXdXZWJBcHAsIG5ld1dlYkFwcCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFA6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcCgoV2ViQXBwKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTjoKLQkJCQlyZXR1cm4gZ2V0TG9jYXRpb24oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTjoKLQkJCQlzZXRMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fTE9DQVRJT046Ci0JCQkJc2V0TG9jYXRpb24oTE9DQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTjoKLQkJCQlyZXR1cm4gTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxvY2F0aW9uICE9IG51bGwgOiAhTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsb2NhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobG9jYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2UyM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FeGNlcHRpb25UeXBlRXJyb3JQYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25UeXBlRXJyb3JQYWdlSW1wbCBleHRlbmRzIEVycm9yUGFnZUltcGwgaW1wbGVtZW50cyBFeGNlcHRpb25UeXBlRXJyb3JQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZXhjZXB0aW9uVHlwZSA9IG51bGw7Ci0JcHVibGljIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFOwotCX0KLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kIHRvIHNldCB0aGUgRXhjZXB0aW9uVHlwZSB0byBhIEphdmFDbGFzcyBoYXZpbmcgYSBmdWxseSBxdWFsaWZpZWQKLSAqIG5hbWUgc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXIKLSAqLwotcHVibGljIFN0cmluZyBnZXRFeGNlcHRpb25UeXBlTmFtZSgpIHsKLQlnZXRFeGNlcHRpb25UeXBlKCk7Ci0JcmV0dXJuIGV4Y2VwdGlvblR5cGUgPT0gbnVsbCA/IG51bGwgOiBleGNlcHRpb25UeXBlLmdldFF1YWxpZmllZE5hbWUoKTsKLX0vKioKLSAqIEhlbHBlciBtZXRob2QgdG8gc2V0IHRoZSBFeGNlcHRpb25UeXBlIHRvIGEgSmF2YUNsYXNzIGhhdmluZyBhIGZ1bGx5IHF1YWxpZmllZAotICogbmFtZSBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlcgotICovIAotcHVibGljIGJvb2xlYW4gaXNFeGNlcHRpb25UeXBlKCkgewotCXJldHVybiB0cnVlOwotfQotcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uVHlwZU5hbWUoU3RyaW5nIGV4Y2VwdGlvblR5cGVOYW1lKSB7Ci0Jc2V0RXhjZXB0aW9uVHlwZShKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoZXhjZXB0aW9uVHlwZU5hbWUpKTsKLX0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIEBsaW5reyNzZXRFeGNlcHRpb25UeXBlTmFtZShTdHJpbmcpfQotICovCi1wdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25UeXBlTmFtZShTdHJpbmcgZXhjZXB0aW9uVHlwZU5hbWUsIFJlc291cmNlU2V0IGNvbnRleHQpIHsKLQlzZXRFeGNlcHRpb25UeXBlTmFtZShleGNlcHRpb25UeXBlTmFtZSk7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGV4Y2VwdGlvbiB0eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0RXhjZXB0aW9uVHlwZSgpIHsKLQkJaWYgKGV4Y2VwdGlvblR5cGUgIT0gbnVsbCAmJiBleGNlcHRpb25UeXBlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRFeGNlcHRpb25UeXBlID0gKEludGVybmFsRU9iamVjdClleGNlcHRpb25UeXBlOwotCQkJZXhjZXB0aW9uVHlwZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRFeGNlcHRpb25UeXBlKTsKLQkJCWlmIChleGNlcHRpb25UeXBlICE9IG9sZEV4Y2VwdGlvblR5cGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEUsIG9sZEV4Y2VwdGlvblR5cGUsIGV4Y2VwdGlvblR5cGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXhjZXB0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0RXhjZXB0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uVHlwZShKYXZhQ2xhc3MgbmV3RXhjZXB0aW9uVHlwZSkgewotCQlKYXZhQ2xhc3Mgb2xkRXhjZXB0aW9uVHlwZSA9IGV4Y2VwdGlvblR5cGU7Ci0JCWV4Y2VwdGlvblR5cGUgPSBuZXdFeGNlcHRpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEUsIG9sZEV4Y2VwdGlvblR5cGUsIGV4Y2VwdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEV4Y2VwdGlvblR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFeGNlcHRpb25UeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFOgotCQkJCXNldEV4Y2VwdGlvblR5cGUoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFOgotCQkJCXNldEV4Y2VwdGlvblR5cGUoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFOgotCQkJCXJldHVybiBleGNlcHRpb25UeXBlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9GaWx0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0ZpbHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4ZWE5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0ZpbHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWx0ZXIgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBhcHBsaWNhdGlvbi4gVGhlIGZpbHRlciBpcyBtYXBwZWQgdG8gZWl0aGVyIGEgc2VydmxldCBvciBhIFVSTCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCB1c2luZyB0aGUgZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhdCBydW50aW1lIHZpYSB0aGUgRmlsdGVyQ29uZmlnIGludGVyZmFjZS4KLQotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVySW1wbCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIEZpbHRlciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbml0UGFyYW1zID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGZpbHRlckNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0UGFyYW1WYWx1ZXMoKSA8ZW0+SW5pdCBQYXJhbSBWYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdFBhcmFtVmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5pdFBhcmFtVmFsdWVzID0gbnVsbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByb3RlY3RlZCBGaWx0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTFRFUjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBmaWx0ZXIuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBnZXRJbml0UGFyYW1zKCkgaXMgdXNlZCBmb3IgSjJFRTEuMwotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW5pdFBhcmFtcygpIHsKLQkJaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkgewotCQkJaW5pdFBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbml0UGFyYW0uY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0RmlsdGVyQ2xhc3MoKSB7Ci0JCWlmIChmaWx0ZXJDbGFzcyAhPSBudWxsICYmIGZpbHRlckNsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRGaWx0ZXJDbGFzcyA9IChJbnRlcm5hbEVPYmplY3QpZmlsdGVyQ2xhc3M7Ci0JCQlmaWx0ZXJDbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eShvbGRGaWx0ZXJDbGFzcyk7Ci0JCQlpZiAoZmlsdGVyQ2xhc3MgIT0gb2xkRmlsdGVyQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1MsIG9sZEZpbHRlckNsYXNzLCBmaWx0ZXJDbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWx0ZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0RmlsdGVyQ2xhc3MoKSB7Ci0JCXJldHVybiBmaWx0ZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJDbGFzcyhKYXZhQ2xhc3MgbmV3RmlsdGVyQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZEZpbHRlckNsYXNzID0gZmlsdGVyQ2xhc3M7Ci0JCWZpbHRlckNsYXNzID0gbmV3RmlsdGVyQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9DTEFTUywgb2xkRmlsdGVyQ2xhc3MsIGZpbHRlckNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBnZXRJbml0UGFyYW1WYWx1ZXMoKSBpcyB1c2VkIGZvciBKMkVFMS40Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbml0UGFyYW1WYWx1ZXMoKSB7Ci0JCWlmIChpbml0UGFyYW1WYWx1ZXMgPT0gbnVsbCkgewotCQkJaW5pdFBhcmFtVmFsdWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBhcmFtVmFsdWUuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1fVkFMVUVTKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtVmFsdWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTV9WQUxVRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0UGFyYW1WYWx1ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldEluaXRQYXJhbXMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fRklMVEVSX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RmlsdGVyQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRGaWx0ZXJDbGFzcygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNX1ZBTFVFUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdFBhcmFtVmFsdWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1M6Ci0JCQkJc2V0RmlsdGVyQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNX1ZBTFVFUzoKLQkJCQlnZXRJbml0UGFyYW1WYWx1ZXMoKS5jbGVhcigpOwotCQkJCWdldEluaXRQYXJhbVZhbHVlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1M6Ci0JCQkJc2V0RmlsdGVyQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1fVkFMVUVTOgotCQkJCWdldEluaXRQYXJhbVZhbHVlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGluaXRQYXJhbXMgIT0gbnVsbCAmJiAhaW5pdFBhcmFtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9DTEFTUzoKLQkJCQlyZXR1cm4gZmlsdGVyQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTV9WQUxVRVM6Ci0JCQkJcmV0dXJuIGluaXRQYXJhbVZhbHVlcyAhPSBudWxsICYmICFpbml0UGFyYW1WYWx1ZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotcHVibGljIEphdmFDbGFzcyBjcmVhdGVDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSkgewotCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYodGFyZ2V0TmFtZSk7Ci19Ci0KLQotcHVibGljIFN0cmluZyBnZXRGaWx0ZXJDbGFzc05hbWUoKSB7Ci0JZ2V0RmlsdGVyQ2xhc3MoKTsKLQlyZXR1cm4gKGZpbHRlckNsYXNzID09IG51bGwpID8gbnVsbCA6IGZpbHRlckNsYXNzLmdldFF1YWxpZmllZE5hbWUoKTsKLX0KLXB1YmxpYyB2b2lkIHNldEZpbHRlckNsYXNzTmFtZShTdHJpbmcgZmlsdGVyQ2xhc3NOYW1lKSB7Ci0JZVNldChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbHRlcl9GaWx0ZXJDbGFzcygpLCBjcmVhdGVDbGFzc1JlZihmaWx0ZXJDbGFzc05hbWUpKTsKLX0KLX0gLy9GaWx0ZXJJbXBsCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0ZpbHRlck1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0ZpbHRlck1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NjdhODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9GaWx0ZXJNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkRpc3BhdGNoZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIERlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IHRvIGEgcmVxdWVzdCwgYW5kIGluIHdoYXQgb3JkZXIuIFRoZSBjb250YWluZXIgbWF0Y2hlcyB0aGUgcmVxdWVzdCBVUkkgdG8gYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycyB0byBhcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24gc2VydmxldC1uYW1lLCBvciBvbiB1cmwtcGF0dGVybiBmb3IgZWFjaCBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluIHdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluIHdoaWNoIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0aGF0IG1hdGNoIGEgcmVxdWVzdCBVUkkgZm9yIGEgc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlIGZpbHRlci1uYW1lIHZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSA8ZmlsdGVybmFtZT4gc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUgPGZpbHRlcj4gZGVjbGFyYXRpb25zIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gKiAKLSAqIEBpbnZhcmlhbnQgVGhlIGZpbHRlci1uYW1lIHZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSBGaWx0ZXI6Om5hbWUgb2Ygb25lIG9mIHRoZSBGaWx0ZXIgZGVjbGFyYXRpb25zIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJNYXBwaW5nSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEZpbHRlck1hcHBpbmcgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVybFBhdHRlcm4oKSA8ZW0+VXJsIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVybFBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QQVRURVJOX0VERUZBVUxUID0gbnVsbDsKLQotCXByb3RlY3RlZCB0cmFuc2llbnQgU3RyaW5nIHNlcnZsZXROYW1lOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJsUGF0dGVybiA9IFVSTF9QQVRURVJOX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BhdGNoZXJUeXBlKCkgPGVtPkRpc3BhdGNoZXIgVHlwZTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwYXRjaGVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BhdGNoZXJUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmxldCBzZXJ2bGV0ID0gbnVsbDsKLQlwdWJsaWMgRmlsdGVyTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTFRFUl9NQVBQSU5HOwotCX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzZXJ2bGV0IHRoYXQgdGhpcyBtYXBwaW5nIGFwcGxpZXMgdG8uCi0gKi8KLQlwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0KCl7Ci0JU2VydmxldCBsc2VydmxldCA9IHRoaXMuZ2V0U2VydmxldEdlbigpOwotCWlmIChsc2VydmxldCA9PSBudWxsICYmIHNlcnZsZXROYW1lICE9IG51bGwpewotCQlXZWJBcHAgd2ViYXBwID0gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JCWlmICh3ZWJhcHAgIT0gbnVsbCl7Ci0JCQlsc2VydmxldD13ZWJhcHAuZ2V0U2VydmxldE5hbWVkKHNlcnZsZXROYW1lKTsKLQkJCWlmIChsc2VydmxldCAhPSBudWxsKSAKLQkJCQlzZXRTZXJ2bGV0KGxzZXJ2bGV0KTsKLQkJfQotCX0KLQlyZXR1cm4gbHNlcnZsZXQ7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHNlcnZsZXQgdGhhdCB0aGlzIG1hcHBpbmcgYXBwbGllcyB0by4KLSAqLwotcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpewotCVN0cmluZyByZXQgPSBudWxsOwotCWlmIChzZXJ2bGV0TmFtZSAhPSBudWxsKQotCQlyZXQgPSAgc2VydmxldE5hbWU7Ci0KLQlTZXJ2bGV0IGxzZXJ2bGV0ID0gZ2V0U2VydmxldCgpOwotCWlmIChsc2VydmxldCAhPSBudWxsKQotCQlyZXQgPSBsc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpOwotCXJldHVybiByZXQ7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHNlcnZsZXQgdGhhdCB0aGlzIG1hcHBpbmcgYXBwbGllcyB0by4KLSAqLwotcHVibGljIHZvaWQgc2V0U2VydmxldE5hbWUoU3RyaW5nIHNlcnZsZXROYW1lKXsKLQl0aGlzLnNlcnZsZXROYW1lID0gc2VydmxldE5hbWU7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBNdXN0IGZvbGxvdwotCSAqIHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMCBvZiB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybFBhdHRlcm4oKSB7Ci0JCXJldHVybiB1cmxQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVybFBhdHRlcm4oU3RyaW5nIG5ld1VybFBhdHRlcm4pIHsKLQkJU3RyaW5nIG9sZFVybFBhdHRlcm4gPSB1cmxQYXR0ZXJuOwotCQl1cmxQYXR0ZXJuID0gbmV3VXJsUGF0dGVybjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTiwgb2xkVXJsUGF0dGVybiwgdXJsUGF0dGVybikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREaXNwYXRjaGVyVHlwZSgpIHsKLQkJaWYgKGRpc3BhdGNoZXJUeXBlID09IG51bGwpIHsKLQkJCWRpc3BhdGNoZXJUeXBlID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KERpc3BhdGNoZXJUeXBlLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJfVFlQRSk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BhdGNoZXJUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBmaWx0ZXIgYmVpbmcgbWFwcGVkCi0JICovCi0JcHVibGljIEZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEZpbHRlciA9IChJbnRlcm5hbEVPYmplY3QpZmlsdGVyOwotCQkJZmlsdGVyID0gKEZpbHRlcillUmVzb2x2ZVByb3h5KG9sZEZpbHRlcik7Ci0JCQlpZiAoZmlsdGVyICE9IG9sZEZpbHRlcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSLCBvbGRGaWx0ZXIsIGZpbHRlcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZpbHRlciBiYXNpY0dldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoRmlsdGVyIG5ld0ZpbHRlcikgewotCQlGaWx0ZXIgb2xkRmlsdGVyID0gZmlsdGVyOwotCQlmaWx0ZXIgPSBuZXdGaWx0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSLCBvbGRGaWx0ZXIsIGZpbHRlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZsZXQoU2VydmxldCBsKSB7Ci0JCXNlcnZsZXROYW1lID0gbnVsbDsKLQkJc2V0U2VydmxldEdlbihsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0R2VuKFNlcnZsZXQgbmV3U2VydmxldCkgewotCQlTZXJ2bGV0IG9sZFNlcnZsZXQgPSBzZXJ2bGV0OwotCQlzZXJ2bGV0ID0gbmV3U2VydmxldDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19TRVJWTEVULCBvbGRTZXJ2bGV0LCBzZXJ2bGV0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOOgotCQkJCXJldHVybiBnZXRVcmxQYXR0ZXJuKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFOgotCQkJCXJldHVybiBnZXREaXNwYXRjaGVyVHlwZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEZpbHRlcigpOwotCQkJCXJldHVybiBiYXNpY0dldEZpbHRlcigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTZXJ2bGV0KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0U2VydmxldCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk46Ci0JCQkJc2V0VXJsUGF0dGVybigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFOgotCQkJCWdldERpc3BhdGNoZXJUeXBlKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwYXRjaGVyVHlwZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUjoKLQkJCQlzZXRGaWx0ZXIoKEZpbHRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVQ6Ci0JCQkJc2V0U2VydmxldCgoU2VydmxldCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTjoKLQkJCQlzZXRVcmxQYXR0ZXJuKFVSTF9QQVRURVJOX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFOgotCQkJCWdldERpc3BhdGNoZXJUeXBlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSOgotCQkJCXNldEZpbHRlcigoRmlsdGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19TRVJWTEVUOgotCQkJCXNldFNlcnZsZXQoKFNlcnZsZXQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk46Ci0JCQkJcmV0dXJuIFVSTF9QQVRURVJOX0VERUZBVUxUID09IG51bGwgPyB1cmxQYXR0ZXJuICE9IG51bGwgOiAhVVJMX1BBVFRFUk5fRURFRkFVTFQuZXF1YWxzKHVybFBhdHRlcm4pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJfVFlQRToKLQkJCQlyZXR1cm4gZGlzcGF0Y2hlclR5cGUgIT0gbnVsbCAmJiAhZGlzcGF0Y2hlclR5cGUuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUjoKLQkJCQlyZXR1cm4gZmlsdGVyICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fU0VSVkxFVDoKLQkJCQlyZXR1cm4gc2VydmxldCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiAoUmVtb3ZlZCBHZW5lcmF0ZWQgZmxhZyB0byBwcmVzZXJ2ZSBvdmVycmlkZSBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIE5PVCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk46Ci0JCQkJc2V0VXJsUGF0dGVybigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFOgotCQkJCWdldERpc3BhdGNoZXJUeXBlKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwYXRjaGVyVHlwZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUjoKLQkJCQlzZXRGaWx0ZXIoKEZpbHRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVQ6Ci0JCQkJaWYobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0JICAgICAgICAgICAgICAgIHNldFNlcnZsZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCSAgICAgICAgICAgIGVsc2UKLQkgICAgICAgICAgICAgICAgc2V0U2VydmxldCgoU2VydmxldCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVybFBhdHRlcm46ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVybFBhdHRlcm4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpc3BhdGNoZXJUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkaXNwYXRjaGVyVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEFuIG9wdGlvbmFsIHNlcnZsZXQgdGhhdCBpcyBtYXBwZWQgYnkgYSBmaWx0ZXIgbWFwcGluZy4gIHNlcnZsZXROYW1lIGlzIHVzZWQgdG8gcmVzb2x2ZSB0aGUgc2VydmxldCByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldEdlbigpIHsKLQkJaWYgKHNlcnZsZXQgIT0gbnVsbCAmJiBzZXJ2bGV0LmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTZXJ2bGV0ID0gKEludGVybmFsRU9iamVjdClzZXJ2bGV0OwotCQkJc2VydmxldCA9IChTZXJ2bGV0KWVSZXNvbHZlUHJveHkob2xkU2VydmxldCk7Ci0JCQlpZiAoc2VydmxldCAhPSBvbGRTZXJ2bGV0KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19TRVJWTEVULCBvbGRTZXJ2bGV0LCBzZXJ2bGV0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlcnZsZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZsZXQgYmFzaWNHZXRTZXJ2bGV0KCkgewotCQlyZXR1cm4gc2VydmxldDsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Zvcm1Mb2dpbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTlkNTc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRm9ybUxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgZm9ybS1sb2dpbi1jb25maWcgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvciBwYWdlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQgYXV0aGVudGljYXRpb24gaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ybUxvZ2luQ29uZmlnSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEZvcm1Mb2dpbkNvbmZpZyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybUxvZ2luUGFnZSgpIDxlbT5Gb3JtIExvZ2luIFBhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZvcm1Mb2dpblBhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fTE9HSU5fUEFHRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1Mb2dpblBhZ2UgPSBGT1JNX0xPR0lOX1BBR0VfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm1FcnJvclBhZ2UoKSA8ZW0+Rm9ybSBFcnJvciBQYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGb3JtRXJyb3JQYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX0VSUk9SX1BBR0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtRXJyb3JQYWdlID0gRk9STV9FUlJPUl9QQUdFX0VERUZBVUxUOwotCXB1YmxpYyBGb3JtTG9naW5Db25maWdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5GT1JNX0xPR0lOX0NPTkZJRzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAgd2hlcmUgdGhlIHBhZ2UKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1Mb2dpblBhZ2UoKSB7Ci0JCXJldHVybiBmb3JtTG9naW5QYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1Mb2dpblBhZ2UoU3RyaW5nIG5ld0Zvcm1Mb2dpblBhZ2UpIHsKLQkJU3RyaW5nIG9sZEZvcm1Mb2dpblBhZ2UgPSBmb3JtTG9naW5QYWdlOwotCQlmb3JtTG9naW5QYWdlID0gbmV3Rm9ybUxvZ2luUGFnZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0UsIG9sZEZvcm1Mb2dpblBhZ2UsIGZvcm1Mb2dpblBhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAgd2hlcmUgdGhlIGVycm9yIAotCSAqIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiBsb2dpbiBpcyBub3Qgc3VjY2Vzc2Z1bCBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1FcnJvclBhZ2UoKSB7Ci0JCXJldHVybiBmb3JtRXJyb3JQYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1FcnJvclBhZ2UoU3RyaW5nIG5ld0Zvcm1FcnJvclBhZ2UpIHsKLQkJU3RyaW5nIG9sZEZvcm1FcnJvclBhZ2UgPSBmb3JtRXJyb3JQYWdlOwotCQlmb3JtRXJyb3JQYWdlID0gbmV3Rm9ybUVycm9yUGFnZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0UsIG9sZEZvcm1FcnJvclBhZ2UsIGZvcm1FcnJvclBhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgTG9naW5Db25maWcgZ2V0TG9naW5Db25maWcoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChMb2dpbkNvbmZpZyllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TG9naW5Db25maWcoTG9naW5Db25maWcgbmV3TG9naW5Db25maWcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0xvZ2luQ29uZmlnLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRywgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvZ2luQ29uZmlnKExvZ2luQ29uZmlnIG5ld0xvZ2luQ29uZmlnKSB7Ci0JCWlmIChuZXdMb2dpbkNvbmZpZyAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRyAmJiBuZXdMb2dpbkNvbmZpZyAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0xvZ2luQ29uZmlnKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3TG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TG9naW5Db25maWcpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHLCBMb2dpbkNvbmZpZy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRMb2dpbkNvbmZpZyhuZXdMb2dpbkNvbmZpZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRywgbmV3TG9naW5Db25maWcsIG5ld0xvZ2luQ29uZmlnKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRzoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TG9naW5Db25maWcoKExvZ2luQ29uZmlnKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRMb2dpbkNvbmZpZyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRywgTG9naW5Db25maWcuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFOgotCQkJCXJldHVybiBnZXRGb3JtTG9naW5QYWdlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFOgotCQkJCXJldHVybiBnZXRGb3JtRXJyb3JQYWdlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHOgotCQkJCXJldHVybiBnZXRMb2dpbkNvbmZpZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFOgotCQkJCXNldEZvcm1Mb2dpblBhZ2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRToKLQkJCQlzZXRGb3JtRXJyb3JQYWdlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUc6Ci0JCQkJc2V0TG9naW5Db25maWcoKExvZ2luQ29uZmlnKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRToKLQkJCQlzZXRGb3JtTG9naW5QYWdlKEZPUk1fTE9HSU5fUEFHRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRToKLQkJCQlzZXRGb3JtRXJyb3JQYWdlKEZPUk1fRVJST1JfUEFHRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRzoKLQkJCQlzZXRMb2dpbkNvbmZpZygoTG9naW5Db25maWcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFOgotCQkJCXJldHVybiBGT1JNX0xPR0lOX1BBR0VfRURFRkFVTFQgPT0gbnVsbCA/IGZvcm1Mb2dpblBhZ2UgIT0gbnVsbCA6ICFGT1JNX0xPR0lOX1BBR0VfRURFRkFVTFQuZXF1YWxzKGZvcm1Mb2dpblBhZ2UpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRToKLQkJCQlyZXR1cm4gRk9STV9FUlJPUl9QQUdFX0VERUZBVUxUID09IG51bGwgPyBmb3JtRXJyb3JQYWdlICE9IG51bGwgOiAhRk9STV9FUlJPUl9QQUdFX0VERUZBVUxULmVxdWFscyhmb3JtRXJyb3JQYWdlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGdldExvZ2luQ29uZmlnKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZvcm1Mb2dpblBhZ2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZvcm1Mb2dpblBhZ2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZvcm1FcnJvclBhZ2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZvcm1FcnJvclBhZ2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0hUVFBNZXRob2RUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9IVFRQTWV0aG9kVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1NjBjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0hUVFBNZXRob2RUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IVFRQIE1ldGhvZCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkhUVFBNZXRob2RUeXBlSW1wbCNnZXRIdHRwTWV0aG9kIDxlbT5IdHRwIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBNZXRob2RUeXBlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEhUVFBNZXRob2RUeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHR0cE1ldGhvZCgpIDxlbT5IdHRwIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHR0cE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHR0cE1ldGhvZCgpIDxlbT5IdHRwIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHR0cE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBodHRwTWV0aG9kID0gSFRUUF9NRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSFRUUE1ldGhvZFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkhUVFBfTUVUSE9EX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIdHRwTWV0aG9kKCkgewotCQlyZXR1cm4gaHR0cE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIdHRwTWV0aG9kKFN0cmluZyBuZXdIdHRwTWV0aG9kKSB7Ci0JCVN0cmluZyBvbGRIdHRwTWV0aG9kID0gaHR0cE1ldGhvZDsKLQkJaHR0cE1ldGhvZCA9IG5ld0h0dHBNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFX19IVFRQX01FVEhPRCwgb2xkSHR0cE1ldGhvZCwgaHR0cE1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfX0hUVFBfTUVUSE9EOgotCQkJCXJldHVybiBnZXRIdHRwTWV0aG9kKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfX0hUVFBfTUVUSE9EOgotCQkJCXNldEh0dHBNZXRob2QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfX0hUVFBfTUVUSE9EOgotCQkJCXNldEh0dHBNZXRob2QoSFRUUF9NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSFRUUF9NRVRIT0RfVFlQRV9fSFRUUF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIEhUVFBfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBodHRwTWV0aG9kICE9IG51bGwgOiAhSFRUUF9NRVRIT0RfRURFRkFVTFQuZXF1YWxzKGh0dHBNZXRob2QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaHR0cE1ldGhvZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHR0cE1ldGhvZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0hUVFBNZXRob2RUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Jbml0UGFyYW1JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0luaXRQYXJhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4YjY2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0luaXRQYXJhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvL3ZhbHVlIHBhaXIgYXMgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgdGhlIHNlcnZsZXQKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRQYXJhbUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbml0UGFyYW0gewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtTmFtZSgpIDxlbT5QYXJhbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJhbU5hbWUgPSBQQVJBTV9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbVZhbHVlKCkgPGVtPlBhcmFtIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtVmFsdWUgPSBQQVJBTV9WQUxVRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JcHVibGljIEluaXRQYXJhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLklOSVRfUEFSQU07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogCi0JICogCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtTmFtZSgpIHsKLQkJcmV0dXJuIHBhcmFtTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbU5hbWUoU3RyaW5nIG5ld1BhcmFtTmFtZSkgewotCQlTdHJpbmcgb2xkUGFyYW1OYW1lID0gcGFyYW1OYW1lOwotCQlwYXJhbU5hbWUgPSBuZXdQYXJhbU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FLCBvbGRQYXJhbU5hbWUsIHBhcmFtTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIHBhcmFtVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1WYWx1ZShTdHJpbmcgbmV3UGFyYW1WYWx1ZSkgewotCQlTdHJpbmcgb2xkUGFyYW1WYWx1ZSA9IHBhcmFtVmFsdWU7Ci0JCXBhcmFtVmFsdWUgPSBuZXdQYXJhbVZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUUsIG9sZFBhcmFtVmFsdWUsIHBhcmFtVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtTmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtVmFsdWUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgotCQkJCXNldFBhcmFtTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRToKLQkJCQlzZXRQYXJhbVZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgotCQkJCXNldFBhcmFtTmFtZShQQVJBTV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRToKLQkJCQlzZXRQYXJhbVZhbHVlKFBBUkFNX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgotCQkJCXJldHVybiBQQVJBTV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwYXJhbU5hbWUgIT0gbnVsbCA6ICFQQVJBTV9OQU1FX0VERUZBVUxULmVxdWFscyhwYXJhbU5hbWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJcmV0dXJuIFBBUkFNX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBwYXJhbVZhbHVlICE9IG51bGwgOiAhUEFSQU1fVkFMVUVfRURFRkFVTFQuZXF1YWxzKHBhcmFtVmFsdWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwYXJhbU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmFtTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1WYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyYW1WYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9KU1BUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9KU1BUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDIyYzZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSlNQVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSlNQVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlSW1wbCBleHRlbmRzIFdlYlR5cGVJbXBsIGltcGxlbWVudHMgSlNQVHlwZSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SnNwRmlsZSgpIDxlbT5Kc3AgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SnNwRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0ZJTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBqc3BGaWxlID0gSlNQX0ZJTEVfRURFRkFVTFQ7Ci0JcHVibGljIEpTUFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5KU1BfVFlQRTsKLQl9Ci0KLXB1YmxpYyBib29sZWFuIGlzSnNwVHlwZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUgd2l0aGluIHRoZSB3ZWIKLQkgKiBhcHBsaWNhdGlvbi4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNwRmlsZSgpIHsKLQkJcmV0dXJuIGpzcEZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SnNwRmlsZShTdHJpbmcgbmV3SnNwRmlsZSkgewotCQlTdHJpbmcgb2xkSnNwRmlsZSA9IGpzcEZpbGU7Ci0JCWpzcEZpbGUgPSBuZXdKc3BGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSlNQX1RZUEVfX0pTUF9GSUxFLCBvbGRKc3BGaWxlLCBqc3BGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSlNQX1RZUEVfX0pTUF9GSUxFOgotCQkJCXJldHVybiBnZXRKc3BGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkpTUF9UWVBFX19KU1BfRklMRToKLQkJCQlzZXRKc3BGaWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRV9fSlNQX0ZJTEU6Ci0JCQkJc2V0SnNwRmlsZShKU1BfRklMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRV9fSlNQX0ZJTEU6Ci0JCQkJcmV0dXJuIEpTUF9GSUxFX0VERUZBVUxUID09IG51bGwgPyBqc3BGaWxlICE9IG51bGwgOiAhSlNQX0ZJTEVfRURFRkFVTFQuZXF1YWxzKGpzcEZpbGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoanNwRmlsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoanNwRmlsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmZkNTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsI2dldExvY2FsZSA8ZW0+TG9jYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkxvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbCNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBMb2NhbEVuY29kaW5nTWFwcGluZyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsZSgpIDxlbT5Mb2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsZSgpIDxlbT5Mb2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhbGUgPSBMT0NBTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5jb2RpbmcoKSA8ZW0+RW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVuY29kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmNvZGluZygpIDxlbT5FbmNvZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZW5jb2RpbmcgPSBFTkNPRElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTE9DQUxfRU5DT0RJTkdfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsZSgpIHsKLQkJcmV0dXJuIGxvY2FsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGUoU3RyaW5nIG5ld0xvY2FsZSkgewotCQlTdHJpbmcgb2xkTG9jYWxlID0gbG9jYWxlOwotCQlsb2NhbGUgPSBuZXdMb2NhbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19MT0NBTEUsIG9sZExvY2FsZSwgbG9jYWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIGVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBuZXdFbmNvZGluZykgewotCQlTdHJpbmcgb2xkRW5jb2RpbmcgPSBlbmNvZGluZzsKLQkJZW5jb2RpbmcgPSBuZXdFbmNvZGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HLCBvbGRFbmNvZGluZywgZW5jb2RpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19MT0NBTEU6Ci0JCQkJcmV0dXJuIGdldExvY2FsZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkc6Ci0JCQkJcmV0dXJuIGdldEVuY29kaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKLQkJCQlzZXRMb2NhbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkc6Ci0JCQkJc2V0RW5jb2RpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKLQkJCQlzZXRMb2NhbGUoTE9DQUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORzoKLQkJCQlzZXRFbmNvZGluZyhFTkNPRElOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19MT0NBTEU6Ci0JCQkJcmV0dXJuIExPQ0FMRV9FREVGQVVMVCA9PSBudWxsID8gbG9jYWxlICE9IG51bGwgOiAhTE9DQUxFX0VERUZBVUxULmVxdWFscyhsb2NhbGUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkc6Ci0JCQkJcmV0dXJuIEVOQ09ESU5HX0VERUZBVUxUID09IG51bGwgPyBlbmNvZGluZyAhPSBudWxsIDogIUVOQ09ESU5HX0VERUZBVUxULmVxdWFscyhlbmNvZGluZyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsb2NhbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2FsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZW5jb2Rpbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVuY29kaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzlmYWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBsb2NhbEVuY29kaW5nTWFwcGluZ3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKSB7Ci0JCWlmIChsb2NhbEVuY29kaW5nTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJbG9jYWxFbmNvZGluZ01hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExvY2FsRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUyk7Ci0JCX0KLQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1M6Ci0JCQkJZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgotCQkJCWdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgotCQkJCXJldHVybiBsb2NhbEVuY29kaW5nTWFwcGluZ3MgIT0gbnVsbCAmJiAhbG9jYWxFbmNvZGluZ01hcHBpbmdzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2dpbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9naW5Db25maWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjhmNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2dpbkNvbmZpZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhNZXRob2RLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIFRoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4KLSAqIG1lY2hhbmlzbS4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvZ2luQ29uZmlnSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExvZ2luQ29uZmlnIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRoTWV0aG9kKCkgPGVtPkF1dGggTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEF1dGhNZXRob2RLaW5kIEFVVEhfTUVUSE9EX0VERUZBVUxUID0gQXV0aE1ldGhvZEtpbmQuVU5TUEVDSUZJRURfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBBdXRoTWV0aG9kS2luZCBhdXRoTWV0aG9kID0gQVVUSF9NRVRIT0RfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBdXRoIE1ldGhvZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXV0aE1ldGhvZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFsbU5hbWUoKSA8ZW0+UmVhbG0gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhbG1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFMTV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhbG1OYW1lID0gUkVBTE1fTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yaXphdGlvbk1ldGhvZCgpIDxlbT5BdXRob3JpemF0aW9uIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9yaXphdGlvbk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVpBVElPTl9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yaXphdGlvbk1ldGhvZCgpIDxlbT5BdXRob3JpemF0aW9uIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9yaXphdGlvbk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRob3JpemF0aW9uTWV0aG9kID0gQVVUSE9SSVpBVElPTl9NRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRm9ybUxvZ2luQ29uZmlnIGZvcm1Mb2dpbkNvbmZpZyA9IG51bGw7Ci0JcHVibGljIExvZ2luQ29uZmlnSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTE9HSU5fQ09ORklHOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBhdXRoLW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gZm9yCi0JICogdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8gZ2FpbmluZyBhY2Nlc3MgdG8gYW55IHdlYiByZXNvdXJjZXMKLQkgKiB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IGFuIGF1dGhvcml6YXRpb24gY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZQotCSAqIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWVjaGFuaXNtLiBMZWdhbCB2YWx1ZXMgZm9yIHRoaXMgZWxlbWVudCBhcmUgCi0JICogIkJBU0lDIiwgIkRJR0VTVCIsICJGT1JNIiwgb3IgIkNMSUVOVC1DRVJUIi4KLQkgKi8KLQlwdWJsaWMgQXV0aE1ldGhvZEtpbmQgZ2V0QXV0aE1ldGhvZCgpIHsKLQkJcmV0dXJuIGF1dGhNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aE1ldGhvZChBdXRoTWV0aG9kS2luZCBuZXdBdXRoTWV0aG9kKSB7Ci0JCUF1dGhNZXRob2RLaW5kIG9sZEF1dGhNZXRob2QgPSBhdXRoTWV0aG9kOwotCQlhdXRoTWV0aG9kID0gbmV3QXV0aE1ldGhvZCA9PSBudWxsID8gQVVUSF9NRVRIT0RfRURFRkFVTFQgOiBuZXdBdXRoTWV0aG9kOwotCQlib29sZWFuIG9sZEF1dGhNZXRob2RFU2V0ID0gYXV0aE1ldGhvZEVTZXQ7Ci0JCWF1dGhNZXRob2RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0QsIG9sZEF1dGhNZXRob2QsIGF1dGhNZXRob2QsICFvbGRBdXRoTWV0aG9kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QXV0aE1ldGhvZCgpIHsKLQkJQXV0aE1ldGhvZEtpbmQgb2xkQXV0aE1ldGhvZCA9IGF1dGhNZXRob2Q7Ci0JCWJvb2xlYW4gb2xkQXV0aE1ldGhvZEVTZXQgPSBhdXRoTWV0aG9kRVNldDsKLQkJYXV0aE1ldGhvZCA9IEFVVEhfTUVUSE9EX0VERUZBVUxUOwotCQlhdXRoTWV0aG9kRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9ELCBvbGRBdXRoTWV0aG9kLCBBVVRIX01FVEhPRF9FREVGQVVMVCwgb2xkQXV0aE1ldGhvZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF1dGhNZXRob2QoKSB7Ci0JCXJldHVybiBhdXRoTWV0aG9kRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0byB1c2UgaW4gSFRUUCBCYXNpYwotCSAqIGF1dGhvcml6YXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlYWxtTmFtZSgpIHsKLQkJcmV0dXJuIHJlYWxtTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFsbU5hbWUoU3RyaW5nIG5ld1JlYWxtTmFtZSkgewotCQlTdHJpbmcgb2xkUmVhbG1OYW1lID0gcmVhbG1OYW1lOwotCQlyZWFsbU5hbWUgPSBuZXdSZWFsbU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1JFQUxNX05BTUUsIG9sZFJlYWxtTmFtZSwgcmVhbG1OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JpemF0aW9uTWV0aG9kKCkgewotCQlyZXR1cm4gYXV0aG9yaXphdGlvbk1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRob3JpemF0aW9uTWV0aG9kKFN0cmluZyBuZXdBdXRob3JpemF0aW9uTWV0aG9kKSB7Ci0JCVN0cmluZyBvbGRBdXRob3JpemF0aW9uTWV0aG9kID0gYXV0aG9yaXphdGlvbk1ldGhvZDsKLQkJYXV0aG9yaXphdGlvbk1ldGhvZCA9IG5ld0F1dGhvcml6YXRpb25NZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhPUklaQVRJT05fTUVUSE9ELCBvbGRBdXRob3JpemF0aW9uTWV0aG9kLCBhdXRob3JpemF0aW9uTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCWlmIChuZXdXZWJBcHAgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdXZWJBcHAgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V2ViQXBwKG5ld1dlYkFwcCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQLCBuZXdXZWJBcHAsIG5ld1dlYkFwcCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBGb3JtTG9naW5Db25maWcgZ2V0Rm9ybUxvZ2luQ29uZmlnKCkgewotCQlyZXR1cm4gZm9ybUxvZ2luQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgbmV3Rm9ybUxvZ2luQ29uZmlnLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUZvcm1Mb2dpbkNvbmZpZyBvbGRGb3JtTG9naW5Db25maWcgPSBmb3JtTG9naW5Db25maWc7Ci0JCWZvcm1Mb2dpbkNvbmZpZyA9IG5ld0Zvcm1Mb2dpbkNvbmZpZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUcsIG9sZEZvcm1Mb2dpbkNvbmZpZywgbmV3Rm9ybUxvZ2luQ29uZmlnKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIG5ld0Zvcm1Mb2dpbkNvbmZpZykgewotCQlpZiAobmV3Rm9ybUxvZ2luQ29uZmlnICE9IGZvcm1Mb2dpbkNvbmZpZykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZm9ybUxvZ2luQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWZvcm1Mb2dpbkNvbmZpZykuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUcsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3Rm9ybUxvZ2luQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Zvcm1Mb2dpbkNvbmZpZykuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUcsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRGb3JtTG9naW5Db25maWcobmV3Rm9ybUxvZ2luQ29uZmlnLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHLCBuZXdGb3JtTG9naW5Db25maWcsIG5ld0Zvcm1Mb2dpbkNvbmZpZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKChXZWJBcHApb3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRzoKLQkJCQlpZiAoZm9ybUxvZ2luQ29uZmlnICE9IG51bGwpCi0JCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClmb3JtTG9naW5Db25maWcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRywgbnVsbCwgbXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Rm9ybUxvZ2luQ29uZmlnKChGb3JtTG9naW5Db25maWcpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRGb3JtTG9naW5Db25maWcobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9EOgotCQkJCXJldHVybiBnZXRBdXRoTWV0aG9kKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1JFQUxNX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJlYWxtTmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIT1JJWkFUSU9OX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0QXV0aG9yaXphdGlvbk1ldGhvZCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGdldEZvcm1Mb2dpbkNvbmZpZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9EOgotCQkJCXNldEF1dGhNZXRob2QoKEF1dGhNZXRob2RLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1JFQUxNX05BTUU6Ci0JCQkJc2V0UmVhbG1OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSE9SSVpBVElPTl9NRVRIT0Q6Ci0JCQkJc2V0QXV0aG9yaXphdGlvbk1ldGhvZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUc6Ci0JCQkJc2V0Rm9ybUxvZ2luQ29uZmlnKChGb3JtTG9naW5Db25maWcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9EOgotCQkJCXVuc2V0QXV0aE1ldGhvZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fUkVBTE1fTkFNRToKLQkJCQlzZXRSZWFsbU5hbWUoUkVBTE1fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIT1JJWkFUSU9OX01FVEhPRDoKLQkJCQlzZXRBdXRob3JpemF0aW9uTWV0aG9kKEFVVEhPUklaQVRJT05fTUVUSE9EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRzoKLQkJCQlzZXRGb3JtTG9naW5Db25maWcoKEZvcm1Mb2dpbkNvbmZpZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGlzU2V0QXV0aE1ldGhvZCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FOgotCQkJCXJldHVybiBSRUFMTV9OQU1FX0VERUZBVUxUID09IG51bGwgPyByZWFsbU5hbWUgIT0gbnVsbCA6ICFSRUFMTV9OQU1FX0VERUZBVUxULmVxdWFscyhyZWFsbU5hbWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIT1JJWkFUSU9OX01FVEhPRDoKLQkJCQlyZXR1cm4gQVVUSE9SSVpBVElPTl9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvcml6YXRpb25NZXRob2QgIT0gbnVsbCA6ICFBVVRIT1JJWkFUSU9OX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoYXV0aG9yaXphdGlvbk1ldGhvZCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHOgotCQkJCXJldHVybiBmb3JtTG9naW5Db25maWcgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF1dGhNZXRob2Q6ICIpOwotCQlpZiAoYXV0aE1ldGhvZEVTZXQpIHJlc3VsdC5hcHBlbmQoYXV0aE1ldGhvZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYWxtTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVhbG1OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRob3JpemF0aW9uTWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdXRob3JpemF0aW9uTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9NaW1lTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTWltZU1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTI0ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9NaW1lTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIG1pbWUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uIGFuZCBhIG1pbWUgdHlwZS4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1pbWVNYXBwaW5nSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1pbWVNYXBwaW5nIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbnNpb24oKSA8ZW0+RXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvbiA9IEVYVEVOU0lPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWltZVR5cGUoKSA8ZW0+TWltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWltZVR5cGUgPSBNSU1FX1RZUEVfRURFRkFVTFQ7Ci0JcHVibGljIE1pbWVNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTUlNRV9NQVBQSU5HOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuIGV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIG5ld0V4dGVuc2lvbikgewotCQlTdHJpbmcgb2xkRXh0ZW5zaW9uID0gZXh0ZW5zaW9uOwotCQlleHRlbnNpb24gPSBuZXdFeHRlbnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX0VYVEVOU0lPTiwgb2xkRXh0ZW5zaW9uLCBleHRlbnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbWltZS10eXBlIGVsZW1lbnQgY29udGFpbnMgYSBkZWZpbmVkIG1pbWUgdHlwZS4gZXhhbXBsZTogInRleHQvL3BsYWluIgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBtaW1lVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgbmV3TWltZVR5cGUpIHsKLQkJU3RyaW5nIG9sZE1pbWVUeXBlID0gbWltZVR5cGU7Ci0JCW1pbWVUeXBlID0gbmV3TWltZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX01JTUVfVFlQRSwgb2xkTWltZVR5cGUsIG1pbWVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fV0VCX0FQUCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCWlmIChuZXdXZWJBcHAgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdXZWJBcHAgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlYkFwcChuZXdXZWJBcHAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fV0VCX0FQUCwgbmV3V2ViQXBwLCBuZXdXZWJBcHApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcCgoV2ViQXBwKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX0VYVEVOU0lPTjoKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5zaW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX01JTUVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0TWltZVR5cGUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fRVhURU5TSU9OOgotCQkJCXNldEV4dGVuc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX01JTUVfVFlQRToKLQkJCQlzZXRNaW1lVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX0VYVEVOU0lPTjoKLQkJCQlzZXRFeHRlbnNpb24oRVhURU5TSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX01JTUVfVFlQRToKLQkJCQlzZXRNaW1lVHlwZShNSU1FX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fRVhURU5TSU9OOgotCQkJCXJldHVybiBFWFRFTlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVuc2lvbiAhPSBudWxsIDogIUVYVEVOU0lPTl9FREVGQVVMVC5lcXVhbHMoZXh0ZW5zaW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fTUlNRV9UWVBFOgotCQkJCXJldHVybiBNSU1FX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IG1pbWVUeXBlICE9IG51bGwgOiAhTUlNRV9UWVBFX0VERUZBVUxULmVxdWFscyhtaW1lVHlwZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleHRlbnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4dGVuc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWltZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1pbWVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Sb2xlTmFtZVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1JvbGVOYW1lVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4NGExMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1JvbGVOYW1lVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJvbGVOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5hbWVUeXBlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJvbGVOYW1lVHlwZSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcm9sZU5hbWUgPSBST0xFX05BTUVfRURFRkFVTFQ7Ci0JcHVibGljIFJvbGVOYW1lVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLlJPTEVfTkFNRV9UWVBFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWUoKSB7Ci0JCXJldHVybiByb2xlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgbmV3Um9sZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFJvbGVOYW1lID0gcm9sZU5hbWU7Ci0JCXJvbGVOYW1lID0gbmV3Um9sZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5ST0xFX05BTUVfVFlQRV9fUk9MRV9OQU1FLCBvbGRSb2xlTmFtZSwgcm9sZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5ST0xFX05BTUVfVFlQRV9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBnZXRSb2xlTmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5ST0xFX05BTUVfVFlQRV9fUk9MRV9OQU1FOgotCQkJCXNldFJvbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5ST0xFX05BTUVfVFlQRV9fUk9MRV9OQU1FOgotCQkJCXNldFJvbGVOYW1lKFJPTEVfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5ST0xFX05BTUVfVFlQRV9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBST0xFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGVOYW1lICE9IG51bGwgOiAhUk9MRV9OQU1FX0VERUZBVUxULmVxdWFscyhyb2xlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyb2xlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm9sZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGVjMmM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5TZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucwotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlDb25zdHJhaW50SW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5Q29uc3RyYWludCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWUoKSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUExBWV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lKCkgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheU5hbWUgPSBESVNQTEFZX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgd2ViUmVzb3VyY2VDb2xsZWN0aW9ucyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEF1dGhDb25zdHJhaW50IGF1dGhDb25zdHJhaW50ID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVXNlckRhdGFDb25zdHJhaW50IHVzZXJEYXRhQ29uc3RyYWludCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCXB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnRJbXBsKCkgewotCQlzdXBlcigpOwotCQllQWRhcHRlcnMoKS5hZGQobmV3IFNlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXIoKSk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLlNFQ1VSSVRZX0NPTlNUUkFJTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlTdHJpbmcgb2xkRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQkJZGlzcGxheU5hbWUgPSBuZXdEaXNwbGF5TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRSwgb2xkRGlzcGxheU5hbWUsIGRpc3BsYXlOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJBcHApZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHAsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKLQkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdXZWJBcHAgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OU1RSQUlOVFMsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXZWJBcHAobmV3V2ViQXBwLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQLCBuZXdXZWJBcHAsIG5ld1dlYkFwcCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkgewotCQlpZiAod2ViUmVzb3VyY2VDb2xsZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UKTsKLQkJfQotCQlyZXR1cm4gd2ViUmVzb3VyY2VDb2xsZWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQXV0aENvbnN0cmFpbnQgZ2V0QXV0aENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBhdXRoQ29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBdXRoQ29uc3RyYWludChBdXRoQ29uc3RyYWludCBuZXdBdXRoQ29uc3RyYWludCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlBdXRoQ29uc3RyYWludCBvbGRBdXRoQ29uc3RyYWludCA9IGF1dGhDb25zdHJhaW50OwotCQlhdXRoQ29uc3RyYWludCA9IG5ld0F1dGhDb25zdHJhaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5ULCBvbGRBdXRoQ29uc3RyYWludCwgbmV3QXV0aENvbnN0cmFpbnQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG5ld0F1dGhDb25zdHJhaW50KSB7Ci0JCWlmIChuZXdBdXRoQ29uc3RyYWludCAhPSBhdXRoQ29uc3RyYWludCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXV0aENvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYXV0aENvbnN0cmFpbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBBdXRoQ29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3QXV0aENvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXV0aENvbnN0cmFpbnQpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBBdXRoQ29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBdXRoQ29uc3RyYWludChuZXdBdXRoQ29uc3RyYWludCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5ULCBuZXdBdXRoQ29uc3RyYWludCwgbmV3QXV0aENvbnN0cmFpbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgVXNlckRhdGFDb25zdHJhaW50IGdldFVzZXJEYXRhQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIHVzZXJEYXRhQ29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IG5ld1VzZXJEYXRhQ29uc3RyYWludCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlVc2VyRGF0YUNvbnN0cmFpbnQgb2xkVXNlckRhdGFDb25zdHJhaW50ID0gdXNlckRhdGFDb25zdHJhaW50OwotCQl1c2VyRGF0YUNvbnN0cmFpbnQgPSBuZXdVc2VyRGF0YUNvbnN0cmFpbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCwgb2xkVXNlckRhdGFDb25zdHJhaW50LCBuZXdVc2VyRGF0YUNvbnN0cmFpbnQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgbmV3VXNlckRhdGFDb25zdHJhaW50KSB7Ci0JCWlmIChuZXdVc2VyRGF0YUNvbnN0cmFpbnQgIT0gdXNlckRhdGFDb25zdHJhaW50KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh1c2VyRGF0YUNvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdXNlckRhdGFDb25zdHJhaW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBVc2VyRGF0YUNvbnN0cmFpbnQuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1VzZXJEYXRhQ29uc3RyYWludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdVc2VyRGF0YUNvbnN0cmFpbnQpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRVc2VyRGF0YUNvbnN0cmFpbnQobmV3VXNlckRhdGFDb25zdHJhaW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCwgbmV3VXNlckRhdGFDb25zdHJhaW50LCBuZXdVc2VyRGF0YUNvbnN0cmFpbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKChXZWJBcHApb3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQ6Ci0JCQkJaWYgKGF1dGhDb25zdHJhaW50ICE9IG51bGwpCi0JCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhdXRoQ29uc3RyYWludCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQsIG51bGwsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEF1dGhDb25zdHJhaW50KChBdXRoQ29uc3RyYWludClvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVDoKLQkJCQlpZiAodXNlckRhdGFDb25zdHJhaW50ICE9IG51bGwpCi0JCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl1c2VyRGF0YUNvbnN0cmFpbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQsIG51bGwsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFVzZXJEYXRhQ29uc3RyYWludCgoVXNlckRhdGFDb25zdHJhaW50KW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBdXRoQ29uc3RyYWludChudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCXJldHVybiBiYXNpY1NldFVzZXJEYXRhQ29uc3RyYWludChudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlM6Ci0JCQkJcmV0dXJuIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gZ2V0QXV0aENvbnN0cmFpbnQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCXJldHVybiBnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TOgotCQkJCWdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVDoKLQkJCQlzZXRBdXRoQ29uc3RyYWludCgoQXV0aENvbnN0cmFpbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCXNldFVzZXJEYXRhQ29uc3RyYWludCgoVXNlckRhdGFDb25zdHJhaW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKERJU1BMQVlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlM6Ci0JCQkJZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UOgotCQkJCXNldEF1dGhDb25zdHJhaW50KChBdXRoQ29uc3RyYWludCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVDoKLQkJCQlzZXRVc2VyRGF0YUNvbnN0cmFpbnQoKFVzZXJEYXRhQ29uc3RyYWludCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlM6Ci0JCQkJcmV0dXJuIHdlYlJlc291cmNlQ29sbGVjdGlvbnMgIT0gbnVsbCAmJiAhd2ViUmVzb3VyY2VDb2xsZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGF1dGhDb25zdHJhaW50ICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gdXNlckRhdGFDb25zdHJhaW50ICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRpc3BsYXlOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkaXNwbGF5TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4MTNhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEgc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZCBsb2FkZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0SW1wbCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIFNlcnZsZXQgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZsZXROYW1lKCkgPGVtPlNlcnZsZXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmxldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZsZXROYW1lID0gU0VSVkxFVF9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2FkT25TdGFydHVwKCkgPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9hZE9uU3RhcnR1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExPQURfT05fU1RBUlRVUF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBsb2FkT25TdGFydHVwID0gTE9BRF9PTl9TVEFSVFVQX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTG9hZCBPbiBTdGFydHVwIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBib29sZWFuIGxvYWRPblN0YXJ0dXBFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgV2ViVHlwZSB3ZWJUeXBlID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGFyYW1zID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlUmVmcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgcnVuQXMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRQYXJhbXMoKSA8ZW0+SW5pdCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRQYXJhbXMgPSBudWxsOwotCi0JcHVibGljIFNlcnZsZXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5TRVJWTEVUOwotCX0KLQotLyoqCi0gKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIHRoZSBtYXBwaW5ncyB0aGF0IHRoaXMKLSAqIHNlcnZsZXQgcGFydGljaXBhdGVzIGluLiAgU2luY2Ugc2VydmxldE1hcHBpbmdzIGlzIG5vdAotICogYSBiaS1kaXJlY3Rpb25hbCBhdHRyaWJ1dGUsIGlmIHlvdSB3YW50IHRvIGFkZCBvciBkZWxldGUgYQotICogbWFwcGluZywgdGhpcyBtdXN0IGJlIGRvbmUgaW4gdGhlIHdlYi1hcHAuCi0gKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0gKi8KLXB1YmxpYyBMaXN0IGdldE1hcHBpbmdzKCkgewotCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBlQ29udGFpbmVyKCk7Ci0JaWYgKHdlYkFwcCA9PSBudWxsKSByZXR1cm4gbmV3IEJhc2ljRUxpc3QoMCk7Ci0JCi0JRUxpc3QgYWxsTWFwcGluZ3MgPSB3ZWJBcHAuZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0JSXRlcmF0b3IgaSA9IGFsbE1hcHBpbmdzLml0ZXJhdG9yKCk7Ci0JTGlzdCBtYXBwaW5ncyA9IG5ldyBWZWN0b3IoKTsKLQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJU2VydmxldE1hcHBpbmcgbWFwcGluZyA9IChTZXJ2bGV0TWFwcGluZykgaS5uZXh0KCk7Ci0JCWlmIChtYXBwaW5nLmdldFNlcnZsZXQoKSA9PSB0aGlzKQotCQkJbWFwcGluZ3MuYWRkKG1hcHBpbmcpOwotCX0KLQlyZXR1cm4gbWFwcGluZ3M7Ci19Ci0vKioKLSAqIGdldFBhcmFtc0FzUHJvcGVydGllcyBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIFByb3BlcnRpZXMgZ2V0UGFyYW1zQXNQcm9wZXJ0aWVzKCkgewotCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCUxpc3QgbHBhcmFtcyA9IGdldFBhcmFtcygpOwotCUluaXRQYXJhbSBwYXJhbTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxwYXJhbXMuc2l6ZSgpOyBpKyspIHsKLQkJcGFyYW0gPSAoSW5pdFBhcmFtKSBscGFyYW1zLmdldChpKTsKLQkJcHJvcHMuc2V0UHJvcGVydHkocGFyYW0uZ2V0UGFyYW1OYW1lKCksIHBhcmFtLmdldFBhcmFtVmFsdWUoKSk7Ci0JfQotCXJldHVybiBwcm9wczsKLX0KLS8qKgotICogQHNlZSBTZXJ2bGV0Ci0gKi8KLXB1YmxpYyB2b2lkIHJlU3luY1NlY3VyaXR5Um9sZVJlZihqYXZhLmxhbmcuU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIGphdmEubGFuZy5TdHJpbmcgbmV3Um9sZU5hbWUpIHsKLQlMaXN0IHJvbGVSZWZzID0gZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZVJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJU2VjdXJpdHlSb2xlUmVmIHJvbGVSZWYgPSAoU2VjdXJpdHlSb2xlUmVmKSByb2xlUmVmcy5nZXQoaSk7Ci0JCWlmIChyb2xlUmVmLmdldExpbmsoKSAhPSBudWxsICYmIHJvbGVSZWYuZ2V0TGluaygpLmVxdWFscyhleGlzdGluZ1JvbGVOYW1lKSkKLQkJCXJvbGVSZWYuc2V0TGluayhuZXdSb2xlTmFtZSk7Ci0JfQotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIHNlcnZsZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZsZXROYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZsZXROYW1lKFN0cmluZyBuZXdTZXJ2bGV0TmFtZSkgewotCQlTdHJpbmcgb2xkU2VydmxldE5hbWUgPSBzZXJ2bGV0TmFtZTsKLQkJc2VydmxldE5hbWUgPSBuZXdTZXJ2bGV0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfTkFNRSwgb2xkU2VydmxldE5hbWUsIHNlcnZsZXROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlIGVsZW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gTG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZCBiZWZvcmUgaGlnaGVyIGludGVnZXJzLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgaXQgYXQgYW55IHRpbWUgaW4gdGhlIHN0YXJ0dXAgc2VxdWVuY2UuCi0KLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRMb2FkT25TdGFydHVwKCkgewotCQlyZXR1cm4gbG9hZE9uU3RhcnR1cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2FkT25TdGFydHVwKEludGVnZXIgbmV3TG9hZE9uU3RhcnR1cCkgewotCQlJbnRlZ2VyIG9sZExvYWRPblN0YXJ0dXAgPSBsb2FkT25TdGFydHVwOwotCQlsb2FkT25TdGFydHVwID0gbmV3TG9hZE9uU3RhcnR1cDsKLQkJYm9vbGVhbiBvbGRMb2FkT25TdGFydHVwRVNldCA9IGxvYWRPblN0YXJ0dXBFU2V0OwotCQlsb2FkT25TdGFydHVwRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVAsIG9sZExvYWRPblN0YXJ0dXAsIGxvYWRPblN0YXJ0dXAsICFvbGRMb2FkT25TdGFydHVwRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgdW5zZXRMb2FkT25TdGFydHVwKCkgewotCQlJbnRlZ2VyIG9sZExvYWRPblN0YXJ0dXAgPSBsb2FkT25TdGFydHVwOwotCQlib29sZWFuIG9sZExvYWRPblN0YXJ0dXBFU2V0ID0gbG9hZE9uU3RhcnR1cEVTZXQ7Ci0JCWxvYWRPblN0YXJ0dXAgPSBMT0FEX09OX1NUQVJUVVBfRURFRkFVTFQ7Ci0JCWxvYWRPblN0YXJ0dXBFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0xPQURfT05fU1RBUlRVUCwgb2xkTG9hZE9uU3RhcnR1cCwgTE9BRF9PTl9TVEFSVFVQX0VERUZBVUxULCBvbGRMb2FkT25TdGFydHVwRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXRMb2FkT25TdGFydHVwKCkgewotCQlyZXR1cm4gbG9hZE9uU3RhcnR1cEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJBcHApZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHAsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKLQkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdXZWJBcHAgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFMsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXZWJBcHAobmV3V2ViQXBwLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQLCBuZXdXZWJBcHAsIG5ld1dlYkFwcCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWJUeXBlIGdldFdlYlR5cGUoKSB7Ci0JCXJldHVybiB3ZWJUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdlYlR5cGUoV2ViVHlwZSBuZXdXZWJUeXBlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdlYlR5cGUgb2xkV2ViVHlwZSA9IHdlYlR5cGU7Ci0JCXdlYlR5cGUgPSBuZXdXZWJUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEUsIG9sZFdlYlR5cGUsIG5ld1dlYlR5cGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYlR5cGUoV2ViVHlwZSBuZXdXZWJUeXBlKSB7Ci0JCWlmIChuZXdXZWJUeXBlICE9IHdlYlR5cGUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdlYlR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd2ViVHlwZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V2ViVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJUeXBlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlYlR5cGUobmV3V2ViVHlwZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEUsIG5ld1dlYlR5cGUsIG5ld1dlYlR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIGdldFBhcmFtcygpIGlzIHVzZWQgZm9yIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFBhcmFtcygpIHsKLQkJaWYgKHBhcmFtcyA9PSBudWxsKSB7Ci0JCQlwYXJhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5pdFBhcmFtLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gcGFyYW1zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTZWN1cml0eVJvbGVSZWZzKCkgewotCQlpZiAoc2VjdXJpdHlSb2xlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZWN1cml0eVJvbGVSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogSWYgZGVmaW5lZCBmb3IgYSBzZXJ2bGV0LCBvdmVycmlkZXMgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHVzZWQgdG8gY2FsbCBhbiBFSkIgYnkgdGhhdCBzZXJ2bGV0IGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgcm9sZS1uYW1lIGlzIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBnZXRSdW5BcygpIHsKLQkJcmV0dXJuIHJ1bkFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJ1bkFzKFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgbmV3UnVuQXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBvbGRSdW5BcyA9IHJ1bkFzOwotCQlydW5BcyA9IG5ld1J1bkFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTLCBvbGRSdW5BcywgbmV3UnVuQXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bkFzKFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgbmV3UnVuQXMpIHsKLQkJaWYgKG5ld1J1bkFzICE9IHJ1bkFzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChydW5BcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClydW5BcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1J1bkFzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1J1bkFzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1JVTl9BUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSdW5BcyhuZXdSdW5BcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTLCBuZXdSdW5BcywgbmV3UnVuQXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIGdldEluaXRQYXJhbXMoKSBpcyB1c2VkIGZvciBKMkVFMS4zCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbml0UGFyYW1zKCkgewotCQlpZiAoaW5pdFBhcmFtcyA9PSBudWxsKSB7Ci0JCQlpbml0UGFyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBhcmFtVmFsdWUuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19JTklUX1BBUkFNUyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRQYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKChXZWJBcHApb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQOgotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcChudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9UWVBFOgotCQkJCXJldHVybiBiYXNpY1NldFdlYlR5cGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19QQVJBTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQYXJhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UnVuQXMobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluaXRQYXJhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FOgotCQkJCXJldHVybiBnZXRTZXJ2bGV0TmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQOgotCQkJCXJldHVybiBnZXRMb2FkT25TdGFydHVwKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9UWVBFOgotCQkJCXJldHVybiBnZXRXZWJUeXBlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldFBhcmFtcygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6Ci0JCQkJcmV0dXJuIGdldFJ1bkFzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdFBhcmFtcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX05BTUU6Ci0JCQkJc2V0U2VydmxldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQOgotCQkJCXNldExvYWRPblN0YXJ0dXAoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9UWVBFOgotCQkJCXNldFdlYlR5cGUoKFdlYlR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1BBUkFNUzoKLQkJCQlnZXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCWdldFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1JVTl9BUzoKLQkJCQlzZXRSdW5BcygoUnVuQXNTcGVjaWZpZWRJZGVudGl0eSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfTkFNRToKLQkJCQlzZXRTZXJ2bGV0TmFtZShTRVJWTEVUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0xPQURfT05fU1RBUlRVUDoKLQkJCQl1bnNldExvYWRPblN0YXJ0dXAoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9UWVBFOgotCQkJCXNldFdlYlR5cGUoKFdlYlR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUEFSQU1TOgotCQkJCWdldFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1JVTl9BUzoKLQkJCQlzZXRSdW5BcygoUnVuQXNTcGVjaWZpZWRJZGVudGl0eSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfTkFNRToKLQkJCQlyZXR1cm4gU0VSVkxFVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZXJ2bGV0TmFtZSAhPSBudWxsIDogIVNFUlZMRVRfTkFNRV9FREVGQVVMVC5lcXVhbHMoc2VydmxldE5hbWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQOgotCQkJCXJldHVybiBpc1NldExvYWRPblN0YXJ0dXAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfVFlQRToKLQkJCQlyZXR1cm4gd2ViVHlwZSAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUEFSQU1TOgotCQkJCXJldHVybiBwYXJhbXMgIT0gbnVsbCAmJiAhcGFyYW1zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmcyAhPSBudWxsICYmICFzZWN1cml0eVJvbGVSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1JVTl9BUzoKLQkJCQlyZXR1cm4gcnVuQXMgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBpbml0UGFyYW1zICE9IG51bGwgJiYgIWluaXRQYXJhbXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2VydmxldE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcnZsZXROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2FkT25TdGFydHVwOiAiKTsKLQkJaWYgKGxvYWRPblN0YXJ0dXBFU2V0KSByZXN1bHQuYXBwZW5kKGxvYWRPblN0YXJ0dXApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqIAotCSAqIHJldHVybiB0aGUgamF2YSBzZXJ2bGV0IGNsYXNzIGZvciB0aGlzIHNlcnZsZXQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFNlcnZsZXRDbGFzcygpIHsKLQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IG51bGw7Ci0JCVN0cmluZyBqYXZhQ2xhc3NOYW1lID0gbnVsbDsKLQkJLy8gSGFuZGxlIHNlcnZsZXQgY2FzZQotCQlpZiAoZ2V0V2ViVHlwZSgpLmlzU2VydmxldFR5cGUoKSkKLQkJCWphdmFDbGFzc05hbWUgPSAoKFNlcnZsZXRUeXBlKWdldFdlYlR5cGUoKSkuZ2V0Q2xhc3NOYW1lKCk7Ci0JCS8vSGFuZGxlIHRoZSBKU1AgY2FzZQotCQllbHNlIHsKLQkJCVN0cmluZyByZWxQYXRoID0gKChKU1BUeXBlKWdldFdlYlR5cGUoKSkuZ2V0SnNwRmlsZSgpOwotCQkJVVJJIHdlYkFwcFVSSSA9IGdldFdlYkFwcCgpLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJamF2YUNsYXNzTmFtZSA9IHdlYkFwcFVSSS5zZWdtZW50KDEpKyIvIit3ZWJBcHBVUkkuc2VnbWVudCgyKStyZWxQYXRoOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoamF2YUNsYXNzTmFtZSx0aGlzKTsKLQkJcmV0dXJuIGphdmFDbGFzczsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldE1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTI0ZGM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldE1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIHNlcnZsZXQtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYSBzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0TWFwcGluZ0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2bGV0TWFwcGluZyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJsUGF0dGVybigpIDxlbT5VcmwgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJsUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BBVFRFUk5fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1cmxQYXR0ZXJuID0gVVJMX1BBVFRFUk5fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmxldCBzZXJ2bGV0ID0gbnVsbDsKLQlwdWJsaWMgU2VydmxldE1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5TRVJWTEVUX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBNdXN0IGZvbGxvdwotCSAqIHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMCBvZiB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybFBhdHRlcm4oKSB7Ci0JCXJldHVybiB1cmxQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVybFBhdHRlcm4oU3RyaW5nIG5ld1VybFBhdHRlcm4pIHsKLQkJU3RyaW5nIG9sZFVybFBhdHRlcm4gPSB1cmxQYXR0ZXJuOwotCQl1cmxQYXR0ZXJuID0gbmV3VXJsUGF0dGVybjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk4sIG9sZFVybFBhdHRlcm4sIHVybFBhdHRlcm4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJBcHApZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHAsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFAsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCkgewotCQlpZiAobmV3V2ViQXBwICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3V2ViQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXZWJBcHAobmV3V2ViQXBwLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldCgpIHsKLQkJaWYgKHNlcnZsZXQgIT0gbnVsbCAmJiBzZXJ2bGV0LmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTZXJ2bGV0ID0gKEludGVybmFsRU9iamVjdClzZXJ2bGV0OwotCQkJc2VydmxldCA9IChTZXJ2bGV0KWVSZXNvbHZlUHJveHkob2xkU2VydmxldCk7Ci0JCQlpZiAoc2VydmxldCAhPSBvbGRTZXJ2bGV0KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVCwgb2xkU2VydmxldCwgc2VydmxldCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZXJ2bGV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2bGV0IGJhc2ljR2V0U2VydmxldCgpIHsKLQkJcmV0dXJuIHNlcnZsZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmxldChTZXJ2bGV0IG5ld1NlcnZsZXQpIHsKLQkJU2VydmxldCBvbGRTZXJ2bGV0ID0gc2VydmxldDsKLQkJc2VydmxldCA9IG5ld1NlcnZsZXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVQsIG9sZFNlcnZsZXQsIHNlcnZsZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcCgoV2ViQXBwKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOOgotCQkJCXJldHVybiBnZXRVcmxQYXR0ZXJuKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTZXJ2bGV0KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0U2VydmxldCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOOgotCQkJCXNldFVybFBhdHRlcm4oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVQ6Ci0JCQkJc2V0U2VydmxldCgoU2VydmxldCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk46Ci0JCQkJc2V0VXJsUGF0dGVybihVUkxfUEFUVEVSTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVDoKLQkJCQlzZXRTZXJ2bGV0KChTZXJ2bGV0KW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gVVJMX1BBVFRFUk5fRURFRkFVTFQgPT0gbnVsbCA/IHVybFBhdHRlcm4gIT0gbnVsbCA6ICFVUkxfUEFUVEVSTl9FREVGQVVMVC5lcXVhbHModXJsUGF0dGVybik7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVDoKLQkJCQlyZXR1cm4gc2VydmxldCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJsUGF0dGVybjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXJsUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDIzNzIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRUeXBlSW1wbCBleHRlbmRzIFdlYlR5cGVJbXBsIGltcGxlbWVudHMgU2VydmxldFR5cGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzTmFtZSgpIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUgPSBDTEFTU19OQU1FX0VERUZBVUxUOwotCXB1YmxpYyBTZXJ2bGV0VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLlNFUlZMRVRfVFlQRTsKLQl9Ci0KLXB1YmxpYyBib29sZWFuIGlzU2VydmxldFR5cGUoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBuZXdDbGFzc05hbWUpIHsKLQkJU3RyaW5nIG9sZENsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJY2xhc3NOYW1lID0gbmV3Q2xhc3NOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9UWVBFX19DTEFTU19OQU1FLCBvbGRDbGFzc05hbWUsIGNsYXNzTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfVFlQRV9fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfVFlQRV9fQ0xBU1NfTkFNRToKLQkJCQlzZXRDbGFzc05hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfVFlQRV9fQ0xBU1NfTkFNRToKLQkJCQlzZXRDbGFzc05hbWUoQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX1RZUEVfX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIENMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzTmFtZSAhPSBudWxsIDogIUNMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGNsYXNzTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjbGFzc05hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNsYXNzTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2Vzc2lvbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2Vzc2lvbkNvbmZpZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2MjQ1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25Db25maWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25Db25maWdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgU2Vzc2lvbkNvbmZpZyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vzc2lvblRpbWVvdXQoKSA8ZW0+U2Vzc2lvbiBUaW1lb3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXNzaW9uVGltZW91dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9USU1FT1VUX0VERUZBVUxUID0gMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBpbnQgc2Vzc2lvblRpbWVvdXQgPSBTRVNTSU9OX1RJTUVPVVRfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTZXNzaW9uIFRpbWVvdXQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2Vzc2lvblRpbWVvdXRFU2V0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgU2Vzc2lvbkNvbmZpZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLlNFU1NJT05fQ09ORklHOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IKLQkgKiBhbGwgc2Vzc2lvbnMgY3JlYXRlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHNwZWNpZmllZCB0aW1lb3V0IG11c3QgYmUKLQkgKiBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNlc3Npb25UaW1lb3V0KCkgewotCQlyZXR1cm4gc2Vzc2lvblRpbWVvdXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2Vzc2lvblRpbWVvdXQoaW50IG5ld1Nlc3Npb25UaW1lb3V0KSB7Ci0JCWludCBvbGRTZXNzaW9uVGltZW91dCA9IHNlc3Npb25UaW1lb3V0OwotCQlzZXNzaW9uVGltZW91dCA9IG5ld1Nlc3Npb25UaW1lb3V0OwotCQlib29sZWFuIG9sZFNlc3Npb25UaW1lb3V0RVNldCA9IHNlc3Npb25UaW1lb3V0RVNldDsKLQkJc2Vzc2lvblRpbWVvdXRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQsIG9sZFNlc3Npb25UaW1lb3V0LCBzZXNzaW9uVGltZW91dCwgIW9sZFNlc3Npb25UaW1lb3V0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgdW5zZXRTZXNzaW9uVGltZW91dCgpIHsKLQkJaW50IG9sZFNlc3Npb25UaW1lb3V0ID0gc2Vzc2lvblRpbWVvdXQ7Ci0JCWJvb2xlYW4gb2xkU2Vzc2lvblRpbWVvdXRFU2V0ID0gc2Vzc2lvblRpbWVvdXRFU2V0OwotCQlzZXNzaW9uVGltZW91dCA9IFNFU1NJT05fVElNRU9VVF9FREVGQVVMVDsKLQkJc2Vzc2lvblRpbWVvdXRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQsIG9sZFNlc3Npb25UaW1lb3V0LCBTRVNTSU9OX1RJTUVPVVRfRURFRkFVTFQsIG9sZFNlc3Npb25UaW1lb3V0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXRTZXNzaW9uVGltZW91dCgpIHsKLQkJcmV0dXJuIHNlc3Npb25UaW1lb3V0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJBcHApZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHAsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCWlmIChuZXdXZWJBcHAgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVNTSU9OX0NPTkZJRywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlYkFwcChuZXdXZWJBcHAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQLCBuZXdXZWJBcHAsIG5ld1dlYkFwcCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAoKFdlYkFwcClvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQOgotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRTZXNzaW9uVGltZW91dCgpKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVDoKLQkJCQlzZXRTZXNzaW9uVGltZW91dCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVDoKLQkJCQl1bnNldFNlc3Npb25UaW1lb3V0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgotCQkJCXJldHVybiBpc1NldFNlc3Npb25UaW1lb3V0KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlc3Npb25UaW1lb3V0OiAiKTsKLQkJaWYgKHNlc3Npb25UaW1lb3V0RVNldCkgcmVzdWx0LmFwcGVuZChzZXNzaW9uVGltZW91dCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1RhZ0xpYlJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVGFnTGliUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGY4YWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVGFnTGliUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVGFnTGliUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIHRhZ2xpYiBlbGVtZW50IGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBKU1AgdGFnIGxpYnJhcnkuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdMaWJSZWZJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgVGFnTGliUmVmIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdsaWJVUkkoKSA8ZW0+VGFnbGliIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnbGliVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdMSUJfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFnbGliVVJJID0gVEFHTElCX1VSSV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnbGliTG9jYXRpb24oKSA8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdsaWJMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFnbGliTG9jYXRpb24gPSBUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQ7Ci0JcHVibGljIFRhZ0xpYlJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLlRBR19MSUJfUkVGOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJLCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHdlYi54bWwgCi0JICogZG9jdW1lbnQsIGlkZW50aWZ5aW5nIGEgVGFnIExpYnJhcnkgdXNlZCBpbiB0aGUgV2ViIEFwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnbGliVVJJKCkgewotCQlyZXR1cm4gdGFnbGliVVJJOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ2xpYlVSSShTdHJpbmcgbmV3VGFnbGliVVJJKSB7Ci0JCVN0cmluZyBvbGRUYWdsaWJVUkkgPSB0YWdsaWJVUkk7Ci0JCXRhZ2xpYlVSSSA9IG5ld1RhZ2xpYlVSSTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJLCBvbGRUYWdsaWJVUkksIHRhZ2xpYlVSSSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8KLQkgKiB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcgTGliYXJ5IERlc2NyaXB0aW9uIGZpbGUKLQkgKiBmb3IgdGhlIHRhZyBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnbGliTG9jYXRpb24oKSB7Ci0JCXJldHVybiB0YWdsaWJMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdsaWJMb2NhdGlvbihTdHJpbmcgbmV3VGFnbGliTG9jYXRpb24pIHsKLQkJU3RyaW5nIG9sZFRhZ2xpYkxvY2F0aW9uID0gdGFnbGliTG9jYXRpb247Ci0JCXRhZ2xpYkxvY2F0aW9uID0gbmV3VGFnbGliTG9jYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fVEFHTElCX0xPQ0FUSU9OLCBvbGRUYWdsaWJMb2NhdGlvbiwgdGFnbGliTG9jYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJBcHApZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHAsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCWlmIChuZXdXZWJBcHAgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19UQUdfTElCUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlYkFwcChuZXdXZWJBcHAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQLCBuZXdXZWJBcHAsIG5ld1dlYkFwcCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAoKFdlYkFwcClvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQOgotCQkJCXJldHVybiBiYXNpY1NldFdlYkFwcChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1RBR19MSUJTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fVEFHTElCX1VSSToKLQkJCQlyZXR1cm4gZ2V0VGFnbGliVVJJKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fVEFHTElCX0xPQ0FUSU9OOgotCQkJCXJldHVybiBnZXRUYWdsaWJMb2NhdGlvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fVEFHTElCX1VSSToKLQkJCQlzZXRUYWdsaWJVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1RBR0xJQl9MT0NBVElPTjoKLQkJCQlzZXRUYWdsaWJMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJOgotCQkJCXNldFRhZ2xpYlVSSShUQUdMSUJfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fVEFHTElCX0xPQ0FUSU9OOgotCQkJCXNldFRhZ2xpYkxvY2F0aW9uKFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fVEFHTElCX1VSSToKLQkJCQlyZXR1cm4gVEFHTElCX1VSSV9FREVGQVVMVCA9PSBudWxsID8gdGFnbGliVVJJICE9IG51bGwgOiAhVEFHTElCX1VSSV9FREVGQVVMVC5lcXVhbHModGFnbGliVVJJKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJcmV0dXJuIFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gdGFnbGliTG9jYXRpb24gIT0gbnVsbCA6ICFUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKHRhZ2xpYkxvY2F0aW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFnbGliVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YWdsaWJVUkkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhZ2xpYkxvY2F0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YWdsaWJMb2NhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVVJMUGF0dGVyblR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1VSTFBhdHRlcm5UeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzI4NDg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVVJMUGF0dGVyblR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVSTFBhdHRlcm5UeXBlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFVSTFBhdHRlcm5UeXBlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmxQYXR0ZXJuKCkgPGVtPlVybCBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmxQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUEFUVEVSTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVybFBhdHRlcm4gPSBVUkxfUEFUVEVSTl9FREVGQVVMVDsKLQlwdWJsaWMgVVJMUGF0dGVyblR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5VUkxfUEFUVEVSTl9UWVBFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsUGF0dGVybigpIHsKLQkJcmV0dXJuIHVybFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJsUGF0dGVybihTdHJpbmcgbmV3VXJsUGF0dGVybikgewotCQlTdHJpbmcgb2xkVXJsUGF0dGVybiA9IHVybFBhdHRlcm47Ci0JCXVybFBhdHRlcm4gPSBuZXdVcmxQYXR0ZXJuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVVJMX1BBVFRFUk4sIG9sZFVybFBhdHRlcm4sIHVybFBhdHRlcm4pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2ViUmVzb3VyY2VDb2xsZWN0aW9uIGdldFJlc0NvbGxlY3Rpb24oKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXNDb2xsZWN0aW9uKFdlYlJlc291cmNlQ29sbGVjdGlvbiBuZXdSZXNDb2xsZWN0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdSZXNDb2xsZWN0aW9uLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT04sIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNDb2xsZWN0aW9uKFdlYlJlc291cmNlQ29sbGVjdGlvbiBuZXdSZXNDb2xsZWN0aW9uKSB7Ci0JCWlmIChuZXdSZXNDb2xsZWN0aW9uICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTiAmJiBuZXdSZXNDb2xsZWN0aW9uICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3UmVzQ29sbGVjdGlvbikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1Jlc0NvbGxlY3Rpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVzQ29sbGVjdGlvbikuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUywgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlc0NvbGxlY3Rpb24obmV3UmVzQ29sbGVjdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT04sIG5ld1Jlc0NvbGxlY3Rpb24sIG5ld1Jlc0NvbGxlY3Rpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTjoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVzQ29sbGVjdGlvbigoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT046Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVzQ29sbGVjdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUywgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVVJMX1BBVFRFUk46Ci0JCQkJcmV0dXJuIGdldFVybFBhdHRlcm4oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OOgotCQkJCXJldHVybiBnZXRSZXNDb2xsZWN0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1VSTF9QQVRURVJOOgotCQkJCXNldFVybFBhdHRlcm4oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT046Ci0JCQkJc2V0UmVzQ29sbGVjdGlvbigoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVVJMX1BBVFRFUk46Ci0JCQkJc2V0VXJsUGF0dGVybihVUkxfUEFUVEVSTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT046Ci0JCQkJc2V0UmVzQ29sbGVjdGlvbigoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVVJMX1BBVFRFUk46Ci0JCQkJcmV0dXJuIFVSTF9QQVRURVJOX0VERUZBVUxUID09IG51bGwgPyB1cmxQYXR0ZXJuICE9IG51bGwgOiAhVVJMX1BBVFRFUk5fRURFRkFVTFQuZXF1YWxzKHVybFBhdHRlcm4pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT046Ci0JCQkJcmV0dXJuIGdldFJlc0NvbGxlY3Rpb24oKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJsUGF0dGVybjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXJsUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVXNlckRhdGFDb25zdHJhaW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ODM2YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVHJhbnNwb3J0R3VhcmFudGVlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhlIHVzZXItZGF0YS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cgZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVXNlckRhdGFDb25zdHJhaW50SW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFVzZXJEYXRhQ29uc3RyYWludCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpIDxlbT5UcmFuc3BvcnQgR3VhcmFudGVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBUUkFOU1BPUlRfR1VBUkFOVEVFX0VERUZBVUxUID0gVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5OT05FX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSB0cmFuc3BvcnRHdWFyYW50ZWUgPSBUUkFOU1BPUlRfR1VBUkFOVEVFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHJhbnNwb3J0IEd1YXJhbnRlZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNwb3J0R3VhcmFudGVlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIFVzZXJEYXRhQ29uc3RyYWludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLlVTRVJfREFUQV9DT05TVFJBSU5UOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1c2VyIGRhdGEgY29uc3RyYWludC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdHJhbnNwb3J0LWd1YXJhbnRlZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gY2xpZW50IAotCSAqIGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvciBDT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUKLQkgKiBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueQotCSAqIHRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzCi0JICogdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4gc3VjaCBhIHdheSB0aGF0IGl0Ci0JICogY2FuJ3QgYmUgY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMKLQkgKiB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEgZmFzaGlvbiB0aGF0IHByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20KLQkgKiBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSB0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUKLQkgKiBJTlRFR1JBTCBvciBDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgewotCQlyZXR1cm4gdHJhbnNwb3J0R3VhcmFudGVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zcG9ydEd1YXJhbnRlZShUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIG5ld1RyYW5zcG9ydEd1YXJhbnRlZSkgewotCQlUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIG9sZFRyYW5zcG9ydEd1YXJhbnRlZSA9IHRyYW5zcG9ydEd1YXJhbnRlZTsKLQkJdHJhbnNwb3J0R3VhcmFudGVlID0gbmV3VHJhbnNwb3J0R3VhcmFudGVlID09IG51bGwgPyBUUkFOU1BPUlRfR1VBUkFOVEVFX0VERUZBVUxUIDogbmV3VHJhbnNwb3J0R3VhcmFudGVlOwotCQlib29sZWFuIG9sZFRyYW5zcG9ydEd1YXJhbnRlZUVTZXQgPSB0cmFuc3BvcnRHdWFyYW50ZWVFU2V0OwotCQl0cmFuc3BvcnRHdWFyYW50ZWVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFLCBvbGRUcmFuc3BvcnRHdWFyYW50ZWUsIHRyYW5zcG9ydEd1YXJhbnRlZSwgIW9sZFRyYW5zcG9ydEd1YXJhbnRlZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zcG9ydEd1YXJhbnRlZSgpIHsKLQkJVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBvbGRUcmFuc3BvcnRHdWFyYW50ZWUgPSB0cmFuc3BvcnRHdWFyYW50ZWU7Ci0JCWJvb2xlYW4gb2xkVHJhbnNwb3J0R3VhcmFudGVlRVNldCA9IHRyYW5zcG9ydEd1YXJhbnRlZUVTZXQ7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZSA9IFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQ7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUUsIG9sZFRyYW5zcG9ydEd1YXJhbnRlZSwgVFJBTlNQT1JUX0dVQVJBTlRFRV9FREVGQVVMVCwgb2xkVHJhbnNwb3J0R3VhcmFudGVlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgewotCQlyZXR1cm4gdHJhbnNwb3J0R3VhcmFudGVlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlDb25zdHJhaW50IGdldFNlY0NvbnN0cmFpbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFNlY3VyaXR5Q29uc3RyYWludCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VjQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgbmV3U2VjQ29uc3RyYWludCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3U2VjQ29uc3RyYWludCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY0NvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IG5ld1NlY0NvbnN0cmFpbnQpIHsKLQkJaWYgKG5ld1NlY0NvbnN0cmFpbnQgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCAmJiBuZXdTZWNDb25zdHJhaW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3U2VjQ29uc3RyYWludCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1NlY0NvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VjQ29uc3RyYWludCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5ULCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2VjQ29uc3RyYWludChuZXdTZWNDb25zdHJhaW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQsIG5ld1NlY0NvbnN0cmFpbnQsIG5ld1NlY0NvbnN0cmFpbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZWNDb25zdHJhaW50KChTZWN1cml0eUNvbnN0cmFpbnQpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U2VjQ29uc3RyYWludChudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5ULCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRToKLQkJCQlyZXR1cm4gZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGdldFNlY0NvbnN0cmFpbnQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUU6Ci0JCQkJc2V0VHJhbnNwb3J0R3VhcmFudGVlKChUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJc2V0U2VjQ29uc3RyYWludCgoU2VjdXJpdHlDb25zdHJhaW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRToKLQkJCQl1bnNldFRyYW5zcG9ydEd1YXJhbnRlZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlzZXRTZWNDb25zdHJhaW50KChTZWN1cml0eUNvbnN0cmFpbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUU6Ci0JCQkJcmV0dXJuIGlzU2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGdldFNlY0NvbnN0cmFpbnQoKSAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRyYW5zcG9ydEd1YXJhbnRlZTogIik7Ci0JCWlmICh0cmFuc3BvcnRHdWFyYW50ZWVFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zcG9ydEd1YXJhbnRlZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY1ZjI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KTkRJRW52UmVmc0dyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yCi0gKiBhIHdlYiBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFdlYkFwcEltcGwgZXh0ZW5kcyBKTkRJRW52UmVmc0dyb3VwSW1wbCBpbXBsZW1lbnRzIFdlYkFwcCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEaXN0cmlidXRhYmxlKCkgPGVtPkRpc3RyaWJ1dGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGlzdHJpYnV0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU1RSSUJVVEFCTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRpc3RyaWJ1dGFibGUgPSBESVNUUklCVVRBQkxFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRGlzdHJpYnV0YWJsZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzdHJpYnV0YWJsZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbnRleHRzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXJyb3JQYWdlcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFdlbGNvbWVGaWxlTGlzdCBmaWxlTGlzdCA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRhZ0xpYnMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb25zdHJhaW50cyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIExvZ2luQ29uZmlnIGxvZ2luQ29uZmlnID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWltZU1hcHBpbmdzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU2Vzc2lvbkNvbmZpZyBzZXNzaW9uQ29uZmlnID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VydmxldE1hcHBpbmdzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VydmxldHMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWN1cml0eVJvbGVzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZmlsdGVycyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGZpbHRlck1hcHBpbmdzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbGlzdGVuZXJzID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZXh0UGFyYW1zKCkgPGVtPkNvbnRleHQgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRleHRQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb250ZXh0UGFyYW1zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpzcENvbmZpZygpIDxlbT5Kc3AgQ29uZmlnPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKc3BDb25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKU1BDb25maWcganNwQ29uZmlnID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1lc3NhZ2VEZXN0aW5hdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCA9IG51bGw7Ci0KLQlwdWJsaWMgV2ViQXBwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUDsKLQl9Ci0KLS8qKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJBcHAKLSAqLwotcHVibGljIGJvb2xlYW4gY29udGFpbnNTZWN1cml0eVJvbGUoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB7Ci0JcmV0dXJuIGdldFNlY3VyaXR5Um9sZU5hbWVkKG5hbWUpICE9IG51bGw7Ci19Ci1wdWJsaWMgRXJyb3JQYWdlIGdldEVycm9yUGFnZUJ5Q29kZShJbnRlZ2VyIGNvZGUpIHsKLQlMaXN0IGxlcnJvclBhZ2VzID0gZ2V0RXJyb3JQYWdlcygpOwotCVN0cmluZyBjb2RlU3RyaW5nID0gY29kZS50b1N0cmluZygpOwotCUl0ZXJhdG9yIGllID0gbGVycm9yUGFnZXMuaXRlcmF0b3IoKTsKLQl3aGlsZSAoaWUuaGFzTmV4dCgpKSB7Ci0JCUVycm9yUGFnZSBlcCA9IChFcnJvclBhZ2UpIGllLm5leHQoKTsKLQkJaWYgKGVwLmlzRXJyb3JDb2RlKCkpIHsKLQkJCUVycm9yQ29kZUVycm9yUGFnZSBlY2VwID0gKEVycm9yQ29kZUVycm9yUGFnZSkgZXA7Ci0JCQlpZiAoY29kZVN0cmluZy5lcXVhbHMoZWNlcC5nZXRFcnJvckNvZGUoKSkpCi0JCQkJcmV0dXJuIGVjZXA7Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgRXJyb3JQYWdlIGdldEVycm9yUGFnZUJ5RXhjZXB0aW9uVHlwZShTdHJpbmcgZXhjZXB0aW9uVHlwZSkgewotCWlmIChleGNlcHRpb25UeXBlICE9IG51bGwpIHsKLQkJTGlzdCBsZXJyb3JQYWdlcyA9IGdldEVycm9yUGFnZXMoKTsKLQkJSXRlcmF0b3IgaWUgPSBsZXJyb3JQYWdlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaWUuaGFzTmV4dCgpKSB7Ci0JCQlFcnJvclBhZ2UgZXAgPSAoRXJyb3JQYWdlKSBpZS5uZXh0KCk7Ci0JCQlpZiAoZXAuaXNFeGNlcHRpb25UeXBlKCkpIHsKLQkJCQlFeGNlcHRpb25UeXBlRXJyb3JQYWdlIGV0ZXAgPSAoRXhjZXB0aW9uVHlwZUVycm9yUGFnZSkgZXA7Ci0JCQkJaWYgKGV4Y2VwdGlvblR5cGUuZXF1YWxzKGV0ZXAuZ2V0RXhjZXB0aW9uVHlwZU5hbWUoKSkpCi0JCQkJCXJldHVybiBldGVwOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBGaW5kcyBhIGZpbHRlciBtYXBwaW5nIGZvciBhIHNwZWNpZmllZCBmaWx0ZXIuCi0gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gZmluZCB0aGUgbWFwcGluZyBmb3IuCi0gKiBAcmV0dXJuIFRoZSBmaXJzdCBmaWx0ZXIgbWFwcGluZyBmb3VuZCBmb3IgdGhlIHNwZWNpZmllZCBmaWx0ZXIsIG9yIG51bGwgaWYgbm8KLSAqIG1hcHBpbmcgZXhpc3RzIGZvciB0aGUgZmlsdGVyLgotICovCi1wdWJsaWMgRmlsdGVyTWFwcGluZyBnZXRGaWx0ZXJNYXBwaW5nKAotCUZpbHRlciBhRmlsdGVyKSB7Ci0JaWYgKGFGaWx0ZXIgIT0gbnVsbCkgewotCQlMaXN0IG1hcHBpbmdzID0gZ2V0RmlsdGVyTWFwcGluZ3MoKTsKLQkJRmlsdGVyTWFwcGluZyBtYXBwaW5nOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQltYXBwaW5nID0gKEZpbHRlck1hcHBpbmcpIG1hcHBpbmdzLmdldChpKTsKLQkJCWlmIChhRmlsdGVyLmVxdWFscyhtYXBwaW5nLmdldEZpbHRlcigpKSkgCi0JCQkJcmV0dXJuIG1hcHBpbmc7Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIGdldEZpbHRlck5hbWVkIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgRmlsdGVyIGdldEZpbHRlck5hbWVkKGphdmEubGFuZy5TdHJpbmcgbmFtZSkgewotCUxpc3QgbGZpbHRlcnMgPSBnZXRGaWx0ZXJzKCk7Ci0JaWYgKGxmaWx0ZXJzID09IG51bGwgfHwgbGZpbHRlcnMuc2l6ZSgpID09IDApIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCUZpbHRlciBuZXh0OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGZpbHRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJbmV4dCA9IChGaWx0ZXIpIGxmaWx0ZXJzLmdldChpKTsKLQkJaWYgKG5leHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJcmV0dXJuIG5leHQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgTGlzdCBnZXRGaWx0ZXJOYW1lcygpIHsKLQlMaXN0IG5hbWVzLCBsZmlsdGVycyA9IGdldEZpbHRlcnMoKTsKLQluYW1lcyA9IG5ldyBBcnJheUxpc3QobGZpbHRlcnMuc2l6ZSgpKTsKLQlGaWx0ZXIgbmV4dDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxmaWx0ZXJzLnNpemUoKTsgaSsrKSB7Ci0JCW5leHQgPSAoRmlsdGVyKSBsZmlsdGVycy5nZXQoaSk7Ci0JCW5hbWVzLmFkZChuZXh0LmdldE5hbWUoKSk7Ci0JfQotCXJldHVybiBuYW1lczsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbWltZSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGV4dGVuc2lvbgotICogQHBhcmFtIEFuIGV4dGVuc2lvbiB0byBmaW5kIHRoZSBtaW1lIHR5cGUgZm9yLgotICovCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNaW1lVHlwZShqYXZhLmxhbmcuU3RyaW5nIGV4dGVuc2lvbikgewotCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQlMaXN0IG1hcHBpbmdzID0gZ2V0TWltZU1hcHBpbmdzKCk7Ci0JCU1pbWVNYXBwaW5nIG1hcHBpbmc7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCW1hcHBpbmcgPSAoTWltZU1hcHBpbmcpIG1hcHBpbmdzLmdldChpKTsKLQkJCWlmIChleHRlbnNpb24uZXF1YWxzKG1hcHBpbmcuZ2V0RXh0ZW5zaW9uKCkpKQotCQkJCXJldHVybiBtYXBwaW5nLmdldE1pbWVUeXBlKCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgU2VjdXJpdHlSb2xlIGdldFNlY3VyaXR5Um9sZU5hbWVkKFN0cmluZyByb2xlTmFtZSkgewotCWphdmEudXRpbC5MaXN0IHRlbXBSb2xlcyA9IGdldFNlY3VyaXR5Um9sZXMoKTsKLQlTZWN1cml0eVJvbGUgcm9sZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBSb2xlcy5zaXplKCk7IGkrKykgewotCQlyb2xlID0gKFNlY3VyaXR5Um9sZSkgdGVtcFJvbGVzLmdldChpKTsKLQkJaWYgKHJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMocm9sZU5hbWUpKQotCQkJcmV0dXJuIHJvbGU7Ci0JfQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBGaW5kcyBhIHNlcnZsZXQgbWFwcGluZyBmb3IgYSBzcGVjaWZpZWQgc2VydmxldC4KLSAqIEBwYXJhbSBzZXJ2bGV0IFRoZSBzZXJ2bGV0IHRvIGZpbmQgdGhlIG1hcHBpbmdzIGZvci4KLSAqIEByZXR1cm4gVGhlIHNlcnZsZXQgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2bGV0LCBvciBudWxsIGlmIG5vCi0gKiBtYXBwaW5nIGV4aXN0cyBmb3IgdGhlIHNlcnZsZXQuCi0gKi8KLXB1YmxpYyBTZXJ2bGV0TWFwcGluZyBnZXRTZXJ2bGV0TWFwcGluZygKLQlTZXJ2bGV0IGFTZXJ2bGV0KSB7Ci0JaWYgKGFTZXJ2bGV0ICE9IG51bGwpIHsKLQkJTGlzdCBtYXBwaW5ncyA9IGdldFNlcnZsZXRNYXBwaW5ncygpOwotCQlTZXJ2bGV0TWFwcGluZyBtYXBwaW5nOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQltYXBwaW5nID0gKFNlcnZsZXRNYXBwaW5nKSBtYXBwaW5ncy5nZXQoaSk7Ci0JCQlpZiAoYVNlcnZsZXQuZXF1YWxzKG1hcHBpbmcuZ2V0U2VydmxldCgpKSkgCi0JCQkJcmV0dXJuIG1hcHBpbmc7Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIGdldFNlcnZsZXROYW1lZCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldE5hbWVkKGphdmEubGFuZy5TdHJpbmcgbmFtZSkgewotCUxpc3QgbHNlcnZsZXRzID0gZ2V0U2VydmxldHMoKTsKLQlpZiAobHNlcnZsZXRzID09IG51bGwgfHwgbHNlcnZsZXRzLnNpemUoKSA9PSAwKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlTZXJ2bGV0IG5leHQ7Ci0JU3RyaW5nIG5leHROYW1lOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbHNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0JCW5leHQgPSAoU2VydmxldCkgbHNlcnZsZXRzLmdldChpKTsKLQkJbmV4dE5hbWUgPSBuZXh0LmdldFNlcnZsZXROYW1lKCk7Ci0JCWlmIChuZXh0TmFtZSAhPSBudWxsICYmIG5leHROYW1lLmVxdWFscyhuYW1lKSkgewotCQkJcmV0dXJuIG5leHQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgTGlzdCBnZXRTZXJ2bGV0TmFtZXMoKSB7Ci0JTGlzdCBuYW1lcywgbHNlcnZsZXRzID0gZ2V0U2VydmxldHMoKTsKLQluYW1lcyA9IG5ldyBBcnJheUxpc3QobHNlcnZsZXRzLnNpemUoKSk7Ci0JU2VydmxldCBuZXh0OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbHNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0JCW5leHQgPSAoU2VydmxldCkgbHNlcnZsZXRzLmdldChpKTsKLQkJbmFtZXMuYWRkKG5leHQuZ2V0U2VydmxldE5hbWUoKSk7Ci0JfQotCXJldHVybiBuYW1lczsKLX0KLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIFdlYiBBcHAgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIFNlcnZsZXQyLjIgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMl8yRGVzY3JpcHRvcigpIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCVN0cmluZyBzeXN0ZW1JZCA9ICgoWE1MUmVzb3VyY2UpZVJlc291cmNlKCkpLmdldFN5c3RlbUlkKCk7Ci0JcmV0dXJuIHN5c3RlbUlkID09IG51bGwgPyBmYWxzZSA6IHN5c3RlbUlkLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TWVNURU1JRF8yXzIpOwotfQotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgV2ViIEFwcCB3YXMgcG9wdWxhdGVkIGZyb20gYW4gU2VydmxldDIuMyBjb21wbGlhbnQgZGVzY3JpcHRvcgotICogQHJldHVybiBib29sZWFuCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24yXzNEZXNjcmlwdG9yKCkgewotCUNvbW1vblV0aWwuY2hlY2tERE9iamVjdEZvclZlcnNpb24odGhpcyk7Ci0JU3RyaW5nIHN5c3RlbUlkID0gKChYTUxSZXNvdXJjZSllUmVzb3VyY2UoKSkuZ2V0U3lzdGVtSWQoKTsKLQlyZXR1cm4gc3lzdGVtSWQgPT0gbnVsbCA/IGZhbHNlIDogc3lzdGVtSWQuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMyk7Ci19Ci0vKioKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViQXBwCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmFtZVNlY3VyaXR5Um9sZShqYXZhLmxhbmcuU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIGphdmEubGFuZy5TdHJpbmcgbmV3Um9sZU5hbWUpIHsKLQlTZWN1cml0eVJvbGUgcm9sZSA9IGdldFNlY3VyaXR5Um9sZU5hbWVkKGV4aXN0aW5nUm9sZU5hbWUpOwotCWlmIChyb2xlICE9IG51bGwpCi0JCXJvbGUuc2V0Um9sZU5hbWUobmV3Um9sZU5hbWUpOwotCUxpc3QgdGhlU2VydmxldHMgPSBnZXRTZXJ2bGV0cygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlU2VydmxldHMuc2l6ZSgpOyBpKyspewotCQlTZXJ2bGV0IHNlcnZsZXQgPSAoU2VydmxldCl0aGVTZXJ2bGV0cy5nZXQoaSk7Ci0JCXNlcnZsZXQucmVTeW5jU2VjdXJpdHlSb2xlUmVmKGV4aXN0aW5nUm9sZU5hbWUsIG5ld1JvbGVOYW1lKTsKLQl9Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGRpc3RyaWJ1dGFibGUgZWxlbWVudCwgYnkgaXRzIHByZXNlbmNlIGluIGEgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKLQkgKiBkZXNjcmlwdG9yLCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBpcyBwcm9ncmFtbWVkIGFwcHJvcHJpYXRlbHkgdG8KLQkgKiBiZSBkZXBsb3llZCBpbnRvIGEgZGlzdHJpYnV0ZWQgc2VydmxldCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3RyaWJ1dGFibGUoKSB7Ci0JCXJldHVybiBkaXN0cmlidXRhYmxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dGFibGUoYm9vbGVhbiBuZXdEaXN0cmlidXRhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkRGlzdHJpYnV0YWJsZSA9IGRpc3RyaWJ1dGFibGU7Ci0JCWRpc3RyaWJ1dGFibGUgPSBuZXdEaXN0cmlidXRhYmxlOwotCQlib29sZWFuIG9sZERpc3RyaWJ1dGFibGVFU2V0ID0gZGlzdHJpYnV0YWJsZUVTZXQ7Ci0JCWRpc3RyaWJ1dGFibGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEUsIG9sZERpc3RyaWJ1dGFibGUsIGRpc3RyaWJ1dGFibGUsICFvbGREaXN0cmlidXRhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RGlzdHJpYnV0YWJsZSgpIHsKLQkJYm9vbGVhbiBvbGREaXN0cmlidXRhYmxlID0gZGlzdHJpYnV0YWJsZTsKLQkJYm9vbGVhbiBvbGREaXN0cmlidXRhYmxlRVNldCA9IGRpc3RyaWJ1dGFibGVFU2V0OwotCQlkaXN0cmlidXRhYmxlID0gRElTVFJJQlVUQUJMRV9FREVGQVVMVDsKLQkJZGlzdHJpYnV0YWJsZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTVFJJQlVUQUJMRSwgb2xkRGlzdHJpYnV0YWJsZSwgRElTVFJJQlVUQUJMRV9FREVGQVVMVCwgb2xkRGlzdHJpYnV0YWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERpc3RyaWJ1dGFibGUoKSB7Ci0JCXJldHVybiBkaXN0cmlidXRhYmxlRVNldDsKLQl9Ci0KLQkvKioKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlzdXBlci5zZXREaXNwbGF5TmFtZShuZXdEaXNwbGF5TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb250ZXh0cygpIHsKLQkJaWYgKGNvbnRleHRzID09IG51bGwpIHsKLQkJCWNvbnRleHRzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoQ29udGV4dFBhcmFtLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVFMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQKTsKLQkJfQotCQlyZXR1cm4gY29udGV4dHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVycm9yUGFnZXMoKSB7Ci0JCWlmIChlcnJvclBhZ2VzID09IG51bGwpIHsKLQkJCWVycm9yUGFnZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChFcnJvclBhZ2UuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFApOwotCQl9Ci0JCXJldHVybiBlcnJvclBhZ2VzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWxjb21lRmlsZUxpc3QgZ2V0RmlsZUxpc3QoKSB7Ci0JCXJldHVybiBmaWxlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRGaWxlTGlzdChXZWxjb21lRmlsZUxpc3QgbmV3RmlsZUxpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV2VsY29tZUZpbGVMaXN0IG9sZEZpbGVMaXN0ID0gZmlsZUxpc3Q7Ci0JCWZpbGVMaXN0ID0gbmV3RmlsZUxpc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxFX0xJU1QsIG9sZEZpbGVMaXN0LCBuZXdGaWxlTGlzdCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IG5ld0ZpbGVMaXN0KSB7Ci0JCWlmIChuZXdGaWxlTGlzdCAhPSBmaWxlTGlzdCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZmlsZUxpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZmlsZUxpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUCwgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdGaWxlTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdGaWxlTGlzdCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RmlsZUxpc3QobmV3RmlsZUxpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVCwgbmV3RmlsZUxpc3QsIG5ld0ZpbGVMaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRhZ0xpYnMoKSB7Ci0JCWlmICh0YWdMaWJzID09IG51bGwpIHsKLQkJCXRhZ0xpYnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChUYWdMaWJSZWYuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19UQUdfTElCUywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQKTsKLQkJfQotCQlyZXR1cm4gdGFnTGliczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29uc3RyYWludHMoKSB7Ci0JCWlmIChjb25zdHJhaW50cyA9PSBudWxsKSB7Ci0JCQljb25zdHJhaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlNUUkFJTlRTLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnN0cmFpbnRzOwotCX0KLQotCS8qKgotCSogVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLQkqLwotCQotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCS8vIGZpeCBkZWZlY3QgMzI3Niwgd2hlbiByZXNvdXJjZSBpcyB1bmxvYWRlZAotCQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCi0JCQkJaWYgKHZlcnNpb24uZXF1YWxzKCIyLjQiKSkvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOwotCQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMi4zIikpLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRDsKLQkJCQlpZiAodmVyc2lvbi5lcXVhbHMoIjIuMiIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQ7Ci0JCQkKLQkJfQotCQlyZXR1cm4gcmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQotCS8qKgotCSAqVGhpcyByZXR1cm5zIHRoZSBqMmVlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgajJlZSBsZXZlbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCXJldHVybiByZXMuZ2V0SjJFRVZlcnNpb25JRCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBMb2dpbkNvbmZpZyBnZXRMb2dpbkNvbmZpZygpIHsKLQkJcmV0dXJuIGxvZ2luQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldExvZ2luQ29uZmlnKExvZ2luQ29uZmlnIG5ld0xvZ2luQ29uZmlnLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUxvZ2luQ29uZmlnIG9sZExvZ2luQ29uZmlnID0gbG9naW5Db25maWc7Ci0JCWxvZ2luQ29uZmlnID0gbmV3TG9naW5Db25maWc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUcsIG9sZExvZ2luQ29uZmlnLCBuZXdMb2dpbkNvbmZpZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9naW5Db25maWcoTG9naW5Db25maWcgbmV3TG9naW5Db25maWcpIHsKLQkJaWYgKG5ld0xvZ2luQ29uZmlnICE9IGxvZ2luQ29uZmlnKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChsb2dpbkNvbmZpZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClsb2dpbkNvbmZpZykuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUCwgTG9naW5Db25maWcuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0xvZ2luQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0xvZ2luQ29uZmlnKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQLCBMb2dpbkNvbmZpZy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRMb2dpbkNvbmZpZyhuZXdMb2dpbkNvbmZpZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHLCBuZXdMb2dpbkNvbmZpZywgbmV3TG9naW5Db25maWcpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWltZU1hcHBpbmdzKCkgewotCQlpZiAobWltZU1hcHBpbmdzID09IG51bGwpIHsKLQkJCW1pbWVNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KE1pbWVNYXBwaW5nLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUywgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fV0VCX0FQUCk7Ci0JCX0KLQkJcmV0dXJuIG1pbWVNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvbkNvbmZpZyBnZXRTZXNzaW9uQ29uZmlnKCkgewotCQlyZXR1cm4gc2Vzc2lvbkNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZXNzaW9uQ29uZmlnKFNlc3Npb25Db25maWcgbmV3U2Vzc2lvbkNvbmZpZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlTZXNzaW9uQ29uZmlnIG9sZFNlc3Npb25Db25maWcgPSBzZXNzaW9uQ29uZmlnOwotCQlzZXNzaW9uQ29uZmlnID0gbmV3U2Vzc2lvbkNvbmZpZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHLCBvbGRTZXNzaW9uQ29uZmlnLCBuZXdTZXNzaW9uQ29uZmlnKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQ29uZmlnKFNlc3Npb25Db25maWcgbmV3U2Vzc2lvbkNvbmZpZykgewotCQlpZiAobmV3U2Vzc2lvbkNvbmZpZyAhPSBzZXNzaW9uQ29uZmlnKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzZXNzaW9uQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlc3Npb25Db25maWcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUCwgU2Vzc2lvbkNvbmZpZy5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3U2Vzc2lvbkNvbmZpZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZXNzaW9uQ29uZmlnKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFAsIFNlc3Npb25Db25maWcuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2Vzc2lvbkNvbmZpZyhuZXdTZXNzaW9uQ29uZmlnLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVNTSU9OX0NPTkZJRywgbmV3U2Vzc2lvbkNvbmZpZywgbmV3U2Vzc2lvbkNvbmZpZykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTZXJ2bGV0TWFwcGluZ3MoKSB7Ci0JCWlmIChzZXJ2bGV0TWFwcGluZ3MgPT0gbnVsbCkgewotCQkJc2VydmxldE1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoU2VydmxldE1hcHBpbmcuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQKTsKLQkJfQotCQlyZXR1cm4gc2VydmxldE1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTZXJ2bGV0cygpIHsKLQkJaWYgKHNlcnZsZXRzID09IG51bGwpIHsKLQkJCXNlcnZsZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoU2VydmxldC5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUCk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZsZXRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTZWN1cml0eVJvbGVzKCkgewotCQlpZiAoc2VjdXJpdHlSb2xlcyA9PSBudWxsKSB7Ci0JCQlzZWN1cml0eVJvbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlY3VyaXR5Um9sZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gc2VjdXJpdHlSb2xlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RmlsdGVycygpIHsKLQkJaWYgKGZpbHRlcnMgPT0gbnVsbCkgewotCQkJZmlsdGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChGaWx0ZXIuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBGaWx0ZXIgbWFwcGluZ3MgZGVmaW5lZCBmb3IgdGhlIHdlYiBhcHAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RmlsdGVyTWFwcGluZ3MoKSB7Ci0JCWlmIChmaWx0ZXJNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQlmaWx0ZXJNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChGaWx0ZXJNYXBwaW5nLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyTWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGxpc3RlbmVycyBjb2xsZWN0aW9uIGNvbnRhaW5zIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIgYXBwbGljYXRpb24KLQkgKiBsaXN0ZW5lciBiZWFucyBpbiB0aGUgd2ViIGFwcC4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWxpc3RlbmVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaXN0ZW5lci5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xJU1RFTkVSUyk7Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGV4dFBhcmFtcygpIHsKLQkJaWYgKGNvbnRleHRQYXJhbXMgPT0gbnVsbCkgewotCQkJY29udGV4dFBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJhbVZhbHVlLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVMpOwotCQl9Ci0JCXJldHVybiBjb250ZXh0UGFyYW1zOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkOiBVc2UgZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RW52RW50cmllcygpIHsKLQkJCi0JCXJldHVybiBnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSlNQQ29uZmlnIGdldEpzcENvbmZpZygpIHsKLQkJcmV0dXJuIGpzcENvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRKc3BDb25maWcoSlNQQ29uZmlnIG5ld0pzcENvbmZpZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlKU1BDb25maWcgb2xkSnNwQ29uZmlnID0ganNwQ29uZmlnOwotCQlqc3BDb25maWcgPSBuZXdKc3BDb25maWc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHLCBvbGRKc3BDb25maWcsIG5ld0pzcENvbmZpZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SnNwQ29uZmlnKEpTUENvbmZpZyBuZXdKc3BDb25maWcpIHsKLQkJaWYgKG5ld0pzcENvbmZpZyAhPSBqc3BDb25maWcpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGpzcENvbmZpZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClqc3BDb25maWcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJRywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SnNwQ29uZmlnICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0pzcENvbmZpZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEpzcENvbmZpZyhuZXdKc3BDb25maWcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUcsIG5ld0pzcENvbmZpZywgbmV3SnNwQ29uZmlnKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25zID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkgewotCQlyZXR1cm4gbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgbmV3TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBvbGRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgPSBsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Q7Ci0JCWxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCA9IG5ld0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVCwgb2xkTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LCBuZXdMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgbmV3TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KSB7Ci0JCWlmIChuZXdMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgIT0gbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KG5ld0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNULCBuZXdMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QsIG5ld0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGV4dHMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFcnJvclBhZ2VzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVDoKLQkJCQlpZiAoZmlsZUxpc3QgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWZpbGVMaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RmlsZUxpc3QoKFdlbGNvbWVGaWxlTGlzdClvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19UQUdfTElCUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRhZ0xpYnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb25zdHJhaW50cygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUc6Ci0JCQkJaWYgKGxvZ2luQ29uZmlnICE9IG51bGwpCi0JCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClsb2dpbkNvbmZpZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUcsIG51bGwsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldExvZ2luQ29uZmlnKChMb2dpbkNvbmZpZylvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWltZU1hcHBpbmdzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHOgotCQkJCWlmIChzZXNzaW9uQ29uZmlnICE9IG51bGwpCi0JCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXNzaW9uQ29uZmlnKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHLCBudWxsLCBtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXNzaW9uQ29uZmlnKChTZXNzaW9uQ29uZmlnKW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2bGV0TWFwcGluZ3MoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2bGV0cygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGV4dHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFcnJvclBhZ2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRGaWxlTGlzdChudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1RBR19MSUJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGFnTGlicygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnN0cmFpbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRMb2dpbkNvbmZpZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaW1lTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U2Vzc2lvbkNvbmZpZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2bGV0TWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2bGV0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5Um9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbHRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsdGVyTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTElTVEVORVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TGlzdGVuZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGV4dFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHOgotCQkJCXJldHVybiBiYXNpY1NldEpzcENvbmZpZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ESVNUUklCVVRBQkxFOgotCQkJCXJldHVybiBpc0Rpc3RyaWJ1dGFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUzoKLQkJCQlyZXR1cm4gZ2V0Q29udGV4dHMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTOgotCQkJCXJldHVybiBnZXRFcnJvclBhZ2VzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxFX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldEZpbGVMaXN0KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19UQUdfTElCUzoKLQkJCQlyZXR1cm4gZ2V0VGFnTGlicygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuIGdldENvbnN0cmFpbnRzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGdldExvZ2luQ29uZmlnKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRNaW1lTWFwcGluZ3MoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHOgotCQkJCXJldHVybiBnZXRTZXNzaW9uQ29uZmlnKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTOgotCQkJCXJldHVybiBnZXRTZXJ2bGV0cygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZXMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUlM6Ci0JCQkJcmV0dXJuIGdldEZpbHRlcnMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyTWFwcGluZ3MoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZ2V0TGlzdGVuZXJzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0Q29udGV4dFBhcmFtcygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJRzoKLQkJCQlyZXR1cm4gZ2V0SnNwQ29uZmlnKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUOgotCQkJCXJldHVybiBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTVFJJQlVUQUJMRToKLQkJCQlzZXREaXN0cmlidXRhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUzoKLQkJCQlnZXRDb250ZXh0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGV4dHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTOgotCQkJCWdldEVycm9yUGFnZXMoKS5jbGVhcigpOwotCQkJCWdldEVycm9yUGFnZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVDoKLQkJCQlzZXRGaWxlTGlzdCgoV2VsY29tZUZpbGVMaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19UQUdfTElCUzoKLQkJCQlnZXRUYWdMaWJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUYWdMaWJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUzoKLQkJCQlnZXRDb25zdHJhaW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29uc3RyYWludHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJRzoKLQkJCQlzZXRMb2dpbkNvbmZpZygoTG9naW5Db25maWcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6Ci0JCQkJZ2V0TWltZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRNaW1lTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHOgotCQkJCXNldFNlc3Npb25Db25maWcoKFNlc3Npb25Db25maWcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJZ2V0U2VydmxldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2bGV0TWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTOgotCQkJCWdldFNlcnZsZXRzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2bGV0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUzoKLQkJCQlnZXRGaWx0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWx0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1M6Ci0JCQkJZ2V0RmlsdGVyTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldEZpbHRlck1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6Ci0JCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRMaXN0ZW5lcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCWdldENvbnRleHRQYXJhbXMoKS5jbGVhcigpOwotCQkJCWdldENvbnRleHRQYXJhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUc6Ci0JCQkJc2V0SnNwQ29uZmlnKChKU1BDb25maWcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVDoKLQkJCQlzZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEU6Ci0JCQkJdW5zZXREaXN0cmlidXRhYmxlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRTOgotCQkJCWdldENvbnRleHRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUzoKLQkJCQlnZXRFcnJvclBhZ2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxFX0xJU1Q6Ci0JCQkJc2V0RmlsZUxpc3QoKFdlbGNvbWVGaWxlTGlzdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19UQUdfTElCUzoKLQkJCQlnZXRUYWdMaWJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUzoKLQkJCQlnZXRDb25zdHJhaW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHOgotCQkJCXNldExvZ2luQ29uZmlnKChMb2dpbkNvbmZpZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTOgotCQkJCWdldE1pbWVNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUc6Ci0JCQkJc2V0U2Vzc2lvbkNvbmZpZygoU2Vzc2lvbkNvbmZpZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTOgotCQkJCWdldFNlcnZsZXRNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6Ci0JCQkJZ2V0U2VydmxldHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUlM6Ci0JCQkJZ2V0RmlsdGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTOgotCQkJCWdldEZpbHRlck1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6Ci0JCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUX1BBUkFNUzoKLQkJCQlnZXRDb250ZXh0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHOgotCQkJCXNldEpzcENvbmZpZygoSlNQQ29uZmlnKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVDoKLQkJCQlzZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEU6Ci0JCQkJcmV0dXJuIGlzU2V0RGlzdHJpYnV0YWJsZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVFM6Ci0JCQkJcmV0dXJuIGNvbnRleHRzICE9IG51bGwgJiYgIWNvbnRleHRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTOgotCQkJCXJldHVybiBlcnJvclBhZ2VzICE9IG51bGwgJiYgIWVycm9yUGFnZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNUOgotCQkJCXJldHVybiBmaWxlTGlzdCAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVEFHX0xJQlM6Ci0JCQkJcmV0dXJuIHRhZ0xpYnMgIT0gbnVsbCAmJiAhdGFnTGlicy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gY29uc3RyYWludHMgIT0gbnVsbCAmJiAhY29uc3RyYWludHMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHOgotCQkJCXJldHVybiBsb2dpbkNvbmZpZyAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gbWltZU1hcHBpbmdzICE9IG51bGwgJiYgIW1pbWVNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVNTSU9OX0NPTkZJRzoKLQkJCQlyZXR1cm4gc2Vzc2lvbkNvbmZpZyAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gc2VydmxldE1hcHBpbmdzICE9IG51bGwgJiYgIXNlcnZsZXRNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUzoKLQkJCQlyZXR1cm4gc2VydmxldHMgIT0gbnVsbCAmJiAhc2VydmxldHMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZXMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJTOgotCQkJCXJldHVybiBmaWx0ZXJzICE9IG51bGwgJiYgIWZpbHRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTOgotCQkJCXJldHVybiBmaWx0ZXJNYXBwaW5ncyAhPSBudWxsICYmICFmaWx0ZXJNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGxpc3RlbmVycyAhPSBudWxsICYmICFsaXN0ZW5lcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGNvbnRleHRQYXJhbXMgIT0gbnVsbCAmJiAhY29udGV4dFBhcmFtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHOgotCQkJCXJldHVybiBqc3BDb25maWcgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25zICE9IG51bGwgJiYgIW1lc3NhZ2VEZXN0aW5hdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUOgotCQkJCXJldHVybiBsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRpc3RyaWJ1dGFibGU6ICIpOwotCQlpZiAoZGlzdHJpYnV0YWJsZUVTZXQpIHJlc3VsdC5hcHBlbmQoZGlzdHJpYnV0YWJsZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcFJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiNzlmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHBSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5IHsKLQotCS8qKgotCSAqIE1ldGhvZCByZWdpc3RlckR0ZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHRkcygpIHsKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMiwgIndlYi1hcHBfMl8yLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLldFQkFQUF9BTFRfU1lTVEVNSURfMl8yLCAid2ViLWFwcF8yLjIuZHRkIik7CS8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMywgIndlYi1hcHBfMl8zLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLldFQkFQUF9BTFRfU1lTVEVNSURfMl8zLCAid2ViLWFwcF8yLjMuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuV0VCX0FQUF9TQ0hFTUFfTE9DXzJfNCwgIndlYi1hcHBfMl80LnhzZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkpTUF9TQ0hFTUFfTE9DXzJfMCwgImpzcF8yXzAueHNkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiogCi0JICovCi0JcHVibGljIFdlYkFwcFJlc291cmNlRmFjdG9yeSgpIHsKLQkJc3VwZXIoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7IAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVuZGVyZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdlYkFwcFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsgCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlcikKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IFdlYkFwcFJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgeyAKLQkJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1NIT1JUX05BTUUsIG5ldyBXZWJBcHBSZXNvdXJjZUZhY3RvcnkoYVJlbmRlcmVyRmFjdG9yeSkpOwotCX0KLQkKLQkvKioKLQkgKiByZWdpc3RlciB1c2luZyB0aGUgZGVmYXVsdCByZW5kZXJlciBmYWN0b3J5LgotCSAqIEBzZWUgI3JlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKCkgewotCQlyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLQkgKiBAc2VlICNyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewkJCi0JCWFSZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9TSE9SVF9OQU1FLCBuZXcgV2ViQXBwUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZS5GYWN0b3J5IGdldFJlZ2lzdGVyZWRGYWN0b3J5KCkgewotCi0JCVN5c3RlbS5lcnIucHJpbnRsbigiZmV0Y2hpbmcgcmVnaXN0ZXJlZCBmYWN0b3J5IGZvciB3ZWIgYXBwIHVyaSIpOwotCQlyZXR1cm4gSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJX09CSik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcFJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3YWJjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2ViYXBwbGljYXRpb24uV2ViQXBwVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYkFwcFJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFdlYkFwcFJlc291cmNlIHsKLQotCQotCXB1YmxpYyBXZWJBcHBSZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0KLQlwdWJsaWMgV2ViQXBwUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcihhUmVuZGVyZXIpOwotCX0KLQotCQotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlyZXR1cm4gKFdlYkFwcCkgZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1N5c3RlbUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8yOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfMl9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCQVBQX0FMVF9TWVNURU1JRF8yXzI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQkFQUF9QVUJMSUNJRF8yXzM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQkFQUF9TWVNURU1JRF8yXzM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKMkVFX0FsdF8xXzNfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQkFQUF9BTFRfU1lTVEVNSURfMl8zOwotCX0KLQkvKgotCSAqIEBzZWUgV2ViQXBwUmVzb3VyY2UjaXNXZWIyXzIoKQotCSAqIEBkZXByZWNhdGVkIC0gdXNlIGdldE1vZHVsZVZlcnNpb25JRCgpIGFuZCBKMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2ViMl8yKCkgewotCQlyZXR1cm4gZ2V0TW9kdWxlVmVyc2lvbklEKCkgPT0gV0VCXzJfMl9JRDsKLQl9Ci0JLyoKLQkgKiBAc2VlIFdlYkFwcFJlc291cmNlI2lzV2ViMl8zKCkKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBnZXRNb2R1bGVWZXJzaW9uSUQoKSBhbmQgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYjJfMygpIHsKLQkJcmV0dXJuIGdldE1vZHVsZVZlcnNpb25JRCgpID09IFdFQl8yXzNfSUQ7Ci0JfQotCS8qCi0JICogQHNlZSBXZWJBcHBSZXNvdXJjZSNpc1dlYjJfNCgpCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgZ2V0TW9kdWxlVmVyc2lvbklEKCkgYW5kIEoyRUVWZXJzaW9uQ29uc3RhbnRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXZWIyXzQoKSB7Ci0JCXJldHVybiBnZXRNb2R1bGVWZXJzaW9uSUQoKSA9PSBXRUJfMl80X0lEOwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI2dldERvY3R5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZSgpIHsKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgkKLQkJCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfRE9DVFlQRTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gV0VCX0FQUF9UWVBFOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0Um9vdFRyYW5zbGF0b3IoKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gV2ViQXBwVHJhbnNsYXRvci5JTlNUQU5DRTsKLQl9Ci0JLyogUmV0dXJuIEoyRUUgdmVyc2lvbiBiYXNlZCBvbiBtb2R1bGUgdmVyc2lvbgotCSovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewotCQlzd2l0Y2ggKGdldE1vZHVsZVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQlkZWZhdWx0IDoKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJfQotCX0KLQkvKiAKLQkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewotCXN1cGVyLnNldFZlcnNpb25JRChpZCk7Ci0Jc3dpdGNoIChpZCkgewotCQkJY2FzZSAoV0VCXzJfNF9JRCkgOgotCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChXRUJfMl8zX0lEKSA6Ci0JCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgKFdFQl8yXzJfSUQpIDoKLQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8yX1B1YmxpY0lEKCksIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpOwotCQkJCi0JCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JLyoKLQkgKiBCYXNlZCBvbiB0aGUgSjJFRSB2ZXJzaW9uLCB0aGlzIHdpbGwgc2V0IHRoZSBtb2R1bGUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uSUQoaW50IGlkKSB7Ci0Jc3dpdGNoIChpZCkgewotCQljYXNlIChKMkVFXzFfNF9JRCkgOgotCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChXRUJfMl80X0lEKTsKLQkJCQkJYnJlYWs7Ci0JCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJCQlwcmltU2V0VmVyc2lvbklEKFdFQl8yXzNfSUQpOwotCQkJCQlicmVhazsKLQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQkJCXByaW1TZXRWZXJzaW9uSUQoV0VCXzJfMl9JRCk7Ci0JCQl9Ci0JCXN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSUQoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIFdFQl8yXzRfSUQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5pbXBsLlhNTFJlc291cmNlSW1wbCNzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKSB7Ci0JCVdlYkFwcCBhcHAgPSBnZXRXZWJBcHAoKTsKLQkJaWYgKGFwcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQotCQlTdHJpbmcgdmVyc2lvbiA9IGFwcC5nZXRWZXJzaW9uKCk7Ci0JCVN0cmluZyBuZXdWZXJzaW9uID0gZ2V0TW9kdWxlVmVyc2lvblN0cmluZygpOwotCQlpZiAoIW5ld1ZlcnNpb24uZXF1YWxzKHZlcnNpb24pKQotCQkJYXBwLnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYlJlc291cmNlQ29sbGVjdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGJjZmNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBpZGVudGlmeSBhIHN1YnNldCBvZiB0aGUgcmVzb3VyY2VzIGFuZCBIVFRQIG1ldGhvZHMgb24gdGhvc2UgcmVzb3VyY2VzIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYgbm8gSFRUUCBtZXRob2RzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcyB0byBhbGwgSFRUUCBtZXRob2RzLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWJSZXNvdXJjZUNvbGxlY3Rpb24sIEVPYmplY3QgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlJlc291cmNlTmFtZSgpIDxlbT5XZWIgUmVzb3VyY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2ViUmVzb3VyY2VOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUkVTT1VSQ0VfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdlYlJlc291cmNlTmFtZSA9IFdFQl9SRVNPVVJDRV9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmxQYXR0ZXJuKCkgPGVtPlVybCBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVybFBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB1cmxQYXR0ZXJuID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh0dHBNZXRob2QoKSA8ZW0+SHR0cCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHR0cE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGh0dHBNZXRob2QgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHVyTHMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhUVFBzKCkgPGVtPkhUVCBQczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIVFRQcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGh0dFBzID0gbnVsbDsKLQotCXB1YmxpYyBXZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTjsKLQl9Ci0KLS8qKgotICogYWRkSFRUUCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWRkSFRUUChqYXZhLmxhbmcuU3RyaW5nIGFodHRwTWV0aG9kKSB7Ci0JSFRUUE1ldGhvZFR5cGUgaHR0cCA9IGdldEZhY3RvcnkoKS5jcmVhdGVIVFRQTWV0aG9kVHlwZSgpOwotCWh0dHAuc2V0SHR0cE1ldGhvZChhaHR0cE1ldGhvZCk7Ci0JZ2V0SFRUUHMoKS5hZGQoaHR0cCk7Ci19Ci0vKioKLSAqIGFkZFVSTCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWRkVVJMKGphdmEubGFuZy5TdHJpbmcgYXVybFBhdHRlcm4pIHsKLQlVUkxQYXR0ZXJuVHlwZSB1cmwgPSBnZXRGYWN0b3J5KCkuY3JlYXRlVVJMUGF0dGVyblR5cGUoKTsKLQl1cmwuc2V0VXJsUGF0dGVybihhdXJsUGF0dGVybik7Ci0JZ2V0VVJMcygpLmFkZCh1cmwpOwotfQotcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCXJldHVybiAoKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkpLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXZWJSZXNvdXJjZU5hbWUoKSB7Ci0JCXJldHVybiB3ZWJSZXNvdXJjZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViUmVzb3VyY2VOYW1lKFN0cmluZyBuZXdXZWJSZXNvdXJjZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFdlYlJlc291cmNlTmFtZSA9IHdlYlJlc291cmNlTmFtZTsKLQkJd2ViUmVzb3VyY2VOYW1lID0gbmV3V2ViUmVzb3VyY2VOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FLCBvbGRXZWJSZXNvdXJjZU5hbWUsIHdlYlJlc291cmNlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRVcmxQYXR0ZXJuKCkgewotCQlpZiAodXJsUGF0dGVybiA9PSBudWxsKSB7Ci0JCQl1cmxQYXR0ZXJuID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTik7Ci0JCX0KLQkJcmV0dXJuIHVybFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEh0dHBNZXRob2QoKSB7Ci0JCWlmIChodHRwTWV0aG9kID09IG51bGwpIHsKLQkJCWh0dHBNZXRob2QgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoSFRUUE1ldGhvZFR5cGVFbnVtLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EKTsKLQkJfQotCQlyZXR1cm4gaHR0cE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlDb25zdHJhaW50IGdldFNlY0NvbnN0cmFpbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFNlY3VyaXR5Q29uc3RyYWludCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VjQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgbmV3U2VjQ29uc3RyYWludCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3U2VjQ29uc3RyYWludCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY0NvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IG5ld1NlY0NvbnN0cmFpbnQpIHsKLQkJaWYgKG5ld1NlY0NvbnN0cmFpbnQgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVCAmJiBuZXdTZWNDb25zdHJhaW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3U2VjQ29uc3RyYWludCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1NlY0NvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VjQ29uc3RyYWludCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUywgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlY0NvbnN0cmFpbnQobmV3U2VjQ29uc3RyYWludCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5ULCBuZXdTZWNDb25zdHJhaW50LCBuZXdTZWNDb25zdHJhaW50KSk7Ci0JfQotCi0JLyoqCi0JICogIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCB1c2UgZ2V0VXJsUGF0dGVybigpCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRVUkxzKCkgewotCQlpZiAodXJMcyA9PSBudWxsKSB7Ci0JCQl1ckxzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoVVJMUGF0dGVyblR5cGUuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTik7Ci0JCX0KLQkJcmV0dXJuIHVyTHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCB1c2UgZ2V0SHR0cE1ldGhvZHMoKQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SFRUUHMoKSB7Ci0JCWlmIChodHRQcyA9PSBudWxsKSB7Ci0JCQlodHRQcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChIVFRQTWV0aG9kVHlwZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRfUFMpOwotCQl9Ci0JCXJldHVybiBodHRQczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldFNlY0NvbnN0cmFpbnQoKFNlY3VyaXR5Q29uc3RyYWludClvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRVUkxzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UOgotCQkJCXJldHVybiBiYXNpY1NldFNlY0NvbnN0cmFpbnQobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRVUkxzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVF9QUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEhUVFBzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRToKLQkJCQlyZXR1cm4gZ2V0V2ViUmVzb3VyY2VOYW1lKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk46Ci0JCQkJcmV0dXJuIGdldFVybFBhdHRlcm4oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0SHR0cE1ldGhvZCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UOgotCQkJCXJldHVybiBnZXRTZWNDb25zdHJhaW50KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFM6Ci0JCQkJcmV0dXJuIGdldFVSTHMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVF9QUzoKLQkJCQlyZXR1cm4gZ2V0SFRUUHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FOgotCQkJCXNldFdlYlJlc291cmNlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOOgotCQkJCWdldFVybFBhdHRlcm4oKS5jbGVhcigpOwotCQkJCWdldFVybFBhdHRlcm4oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRDoKLQkJCQlnZXRIdHRwTWV0aG9kKCkuY2xlYXIoKTsKLQkJCQlnZXRIdHRwTWV0aG9kKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJc2V0U2VjQ29uc3RyYWludCgoU2VjdXJpdHlDb25zdHJhaW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFM6Ci0JCQkJZ2V0VVJMcygpLmNsZWFyKCk7Ci0JCQkJZ2V0VVJMcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVF9QUzoKLQkJCQlnZXRIVFRQcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SFRUUHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUU6Ci0JCQkJc2V0V2ViUmVzb3VyY2VOYW1lKFdFQl9SRVNPVVJDRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTjoKLQkJCQlnZXRVcmxQYXR0ZXJuKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0Q6Ci0JCQkJZ2V0SHR0cE1ldGhvZCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UOgotCQkJCXNldFNlY0NvbnN0cmFpbnQoKFNlY3VyaXR5Q29uc3RyYWludCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFM6Ci0JCQkJZ2V0VVJMcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRfUFM6Ci0JCQkJZ2V0SFRUUHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FOgotCQkJCXJldHVybiBXRUJfUkVTT1VSQ0VfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gd2ViUmVzb3VyY2VOYW1lICE9IG51bGwgOiAhV0VCX1JFU09VUkNFX05BTUVfRURFRkFVTFQuZXF1YWxzKHdlYlJlc291cmNlTmFtZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk46Ci0JCQkJcmV0dXJuIHVybFBhdHRlcm4gIT0gbnVsbCAmJiAhdXJsUGF0dGVybi5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGh0dHBNZXRob2QgIT0gbnVsbCAmJiAhaHR0cE1ldGhvZC5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGdldFNlY0NvbnN0cmFpbnQoKSAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSX0xTOgotCQkJCXJldHVybiB1ckxzICE9IG51bGwgJiYgIXVyTHMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUX1BTOgotCQkJCXJldHVybiBodHRQcyAhPSBudWxsICYmICFodHRQcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh3ZWJSZXNvdXJjZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdlYlJlc291cmNlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1cmxQYXR0ZXJuOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1cmxQYXR0ZXJuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBodHRwTWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChodHRwTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjM4OTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXZWJUeXBlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYlR5cGUgewotCi0JcHVibGljIFdlYlR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5XRUJfVFlQRTsKLQl9Ci0KLS8qKgotICogaXNKc3BUeXBlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0pzcFR5cGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBpc1NlcnZsZXRUeXBlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1NlcnZsZXRUeXBlKCkgewotCXJldHVybiBmYWxzZTsKLX0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYmFwcGxpY2F0aW9uRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWYwMmFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhNZXRob2RLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkNvbnRleHRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvckNvZGVFcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkV4Y2VwdGlvblR5cGVFcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRm9ybUxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSlNQVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uUmVzQXV0aFNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJvbGVOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVzZXJEYXRhQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYmFwcGxpY2F0aW9uRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgewotIAotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJV2ViYXBwbGljYXRpb25GYWN0b3J5IHRoZVdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IChXZWJhcHBsaWNhdGlvbkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoIndlYmFwcGxpY2F0aW9uLnhtaSIpOyAKLQkJCWlmICh0aGVXZWJhcHBsaWNhdGlvbkZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVXZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1NX1ZFUlNJT04gPSAiMS4xIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7IAkKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFA6IHJldHVybiBjcmVhdGVXZWJBcHAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU06IHJldHVybiBjcmVhdGVDb250ZXh0UGFyYW0oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVQ6IHJldHVybiBjcmVhdGVTZXJ2bGV0KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkc6IHJldHVybiBjcmVhdGVTZXJ2bGV0TWFwcGluZygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUc6IHJldHVybiBjcmVhdGVTZXNzaW9uQ29uZmlnKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkc6IHJldHVybiBjcmVhdGVNaW1lTWFwcGluZygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1Q6IHJldHVybiBjcmVhdGVXZWxjb21lRmlsZUxpc3QoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0U6IHJldHVybiBjcmVhdGVFcnJvclBhZ2UoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGOiByZXR1cm4gY3JlYXRlVGFnTGliUmVmKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UOiByZXR1cm4gY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTjogcmV0dXJuIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UOiByZXR1cm4gY3JlYXRlQXV0aENvbnN0cmFpbnQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UOiByZXR1cm4gY3JlYXRlVXNlckRhdGFDb25zdHJhaW50KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUc6IHJldHVybiBjcmVhdGVMb2dpbkNvbmZpZygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUc6IHJldHVybiBjcmVhdGVGb3JtTG9naW5Db25maWcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU06IHJldHVybiBjcmVhdGVJbml0UGFyYW0oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfVFlQRTogcmV0dXJuIGNyZWF0ZVNlcnZsZXRUeXBlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRTogcmV0dXJuIGNyZWF0ZUpTUFR5cGUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEU6IHJldHVybiBjcmVhdGVVUkxQYXR0ZXJuVHlwZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEU6IHJldHVybiBjcmVhdGVSb2xlTmFtZVR5cGUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRTogcmV0dXJuIGNyZWF0ZVdlbGNvbWVGaWxlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFOiByZXR1cm4gY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFOiByZXR1cm4gY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElORzogcmV0dXJuIGNyZWF0ZUZpbHRlck1hcHBpbmcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUjogcmV0dXJuIGNyZWF0ZUZpbHRlcigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUOiByZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HOiByZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEU6IHJldHVybiBjcmVhdGVIVFRQTWV0aG9kVHlwZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJFU19BVVRIX1NFUlZMRVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUmVzQXV0aFNlcnZsZXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFX0VOVU06Ci0JCQkJcmV0dXJuIGNyZWF0ZUhUVFBNZXRob2RUeXBlRW51bUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5ESVNQQVRDSEVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc3BhdGNoZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX01FVEhPRF9LSU5EOgotCQkJCXJldHVybiBjcmVhdGVBdXRoTWV0aG9kS2luZEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJFU19BVVRIX1NFUlZMRVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFJlc0F1dGhTZXJ2bGV0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFX0VOVU06Ci0JCQkJcmV0dXJuIGNvbnZlcnRIVFRQTWV0aG9kVHlwZUVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VHJhbnNwb3J0R3VhcmFudGVlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5ESVNQQVRDSEVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREaXNwYXRjaGVyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX01FVEhPRF9LSU5EOgotCQkJCXJldHVybiBjb252ZXJ0QXV0aE1ldGhvZEtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi1wdWJsaWMgc3RhdGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBY3RpdmVGYWN0b3J5KCkgewotCXJldHVybiAoV2ViYXBwbGljYXRpb25GYWN0b3J5KSBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBXZWJBcHAgY3JlYXRlV2ViQXBwKCkgewotCQlXZWJBcHBJbXBsIHdlYkFwcCA9IG5ldyBXZWJBcHBJbXBsKCk7Ci0JCXJldHVybiB3ZWJBcHA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENvbnRleHRQYXJhbSBjcmVhdGVDb250ZXh0UGFyYW0oKSB7Ci0JCUNvbnRleHRQYXJhbUltcGwgY29udGV4dFBhcmFtID0gbmV3IENvbnRleHRQYXJhbUltcGwoKTsKLQkJcmV0dXJuIGNvbnRleHRQYXJhbTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRXJyb3JQYWdlIGNyZWF0ZUVycm9yUGFnZSgpIHsKLQkJRXJyb3JQYWdlSW1wbCBlcnJvclBhZ2UgPSBuZXcgRXJyb3JQYWdlSW1wbCgpOwotCQlyZXR1cm4gZXJyb3JQYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYWdMaWJSZWYgY3JlYXRlVGFnTGliUmVmKCkgewotCQlUYWdMaWJSZWZJbXBsIHRhZ0xpYlJlZiA9IG5ldyBUYWdMaWJSZWZJbXBsKCk7Ci0JCXJldHVybiB0YWdMaWJSZWY7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UgY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpIHsKLQkJRXhjZXB0aW9uVHlwZUVycm9yUGFnZUltcGwgZXhjZXB0aW9uVHlwZUVycm9yUGFnZSA9IG5ldyBFeGNlcHRpb25UeXBlRXJyb3JQYWdlSW1wbCgpOwotCQlyZXR1cm4gZXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlRXJyb3JQYWdlIGNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZSgpIHsKLQkJRXJyb3JDb2RlRXJyb3JQYWdlSW1wbCBlcnJvckNvZGVFcnJvclBhZ2UgPSBuZXcgRXJyb3JDb2RlRXJyb3JQYWdlSW1wbCgpOwotCQlyZXR1cm4gZXJyb3JDb2RlRXJyb3JQYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBXZWxjb21lRmlsZUxpc3QgY3JlYXRlV2VsY29tZUZpbGVMaXN0KCkgewotCQlXZWxjb21lRmlsZUxpc3RJbXBsIHdlbGNvbWVGaWxlTGlzdCA9IG5ldyBXZWxjb21lRmlsZUxpc3RJbXBsKCk7Ci0JCXJldHVybiB3ZWxjb21lRmlsZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdlbGNvbWVGaWxlIGNyZWF0ZVdlbGNvbWVGaWxlKCkgewotCQlXZWxjb21lRmlsZUltcGwgd2VsY29tZUZpbGUgPSBuZXcgV2VsY29tZUZpbGVJbXBsKCk7Ci0JCXJldHVybiB3ZWxjb21lRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlDb25zdHJhaW50IGNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludCgpIHsKLQkJU2VjdXJpdHlDb25zdHJhaW50SW1wbCBzZWN1cml0eUNvbnN0cmFpbnQgPSBuZXcgU2VjdXJpdHlDb25zdHJhaW50SW1wbCgpOwotCQlyZXR1cm4gc2VjdXJpdHlDb25zdHJhaW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBXZWJSZXNvdXJjZUNvbGxlY3Rpb24gY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkgewotCQlXZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsIHdlYlJlc291cmNlQ29sbGVjdGlvbiA9IG5ldyBXZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsKCk7Ci0JCXJldHVybiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFVSTFBhdHRlcm5UeXBlIGNyZWF0ZVVSTFBhdHRlcm5UeXBlKCkgewotCQlVUkxQYXR0ZXJuVHlwZUltcGwgdXJsUGF0dGVyblR5cGUgPSBuZXcgVVJMUGF0dGVyblR5cGVJbXBsKCk7Ci0JCXJldHVybiB1cmxQYXR0ZXJuVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXV0aENvbnN0cmFpbnQgY3JlYXRlQXV0aENvbnN0cmFpbnQoKSB7Ci0JCUF1dGhDb25zdHJhaW50SW1wbCBhdXRoQ29uc3RyYWludCA9IG5ldyBBdXRoQ29uc3RyYWludEltcGwoKTsKLQkJcmV0dXJuIGF1dGhDb25zdHJhaW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBVc2VyRGF0YUNvbnN0cmFpbnQgY3JlYXRlVXNlckRhdGFDb25zdHJhaW50KCkgewotCQlVc2VyRGF0YUNvbnN0cmFpbnRJbXBsIHVzZXJEYXRhQ29uc3RyYWludCA9IG5ldyBVc2VyRGF0YUNvbnN0cmFpbnRJbXBsKCk7Ci0JCXJldHVybiB1c2VyRGF0YUNvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvZ2luQ29uZmlnIGNyZWF0ZUxvZ2luQ29uZmlnKCkgewotCQlMb2dpbkNvbmZpZ0ltcGwgbG9naW5Db25maWcgPSBuZXcgTG9naW5Db25maWdJbXBsKCk7Ci0JCXJldHVybiBsb2dpbkNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRm9ybUxvZ2luQ29uZmlnIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZygpIHsKLQkJRm9ybUxvZ2luQ29uZmlnSW1wbCBmb3JtTG9naW5Db25maWcgPSBuZXcgRm9ybUxvZ2luQ29uZmlnSW1wbCgpOwotCQlyZXR1cm4gZm9ybUxvZ2luQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBNaW1lTWFwcGluZyBjcmVhdGVNaW1lTWFwcGluZygpIHsKLQkJTWltZU1hcHBpbmdJbXBsIG1pbWVNYXBwaW5nID0gbmV3IE1pbWVNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gbWltZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFNlc3Npb25Db25maWcgY3JlYXRlU2Vzc2lvbkNvbmZpZygpIHsKLQkJU2Vzc2lvbkNvbmZpZ0ltcGwgc2Vzc2lvbkNvbmZpZyA9IG5ldyBTZXNzaW9uQ29uZmlnSW1wbCgpOwotCQlyZXR1cm4gc2Vzc2lvbkNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2VydmxldE1hcHBpbmcgY3JlYXRlU2VydmxldE1hcHBpbmcoKSB7Ci0JCVNlcnZsZXRNYXBwaW5nSW1wbCBzZXJ2bGV0TWFwcGluZyA9IG5ldyBTZXJ2bGV0TWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIHNlcnZsZXRNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTZXJ2bGV0IGNyZWF0ZVNlcnZsZXQoKSB7Ci0JCVNlcnZsZXRJbXBsIHNlcnZsZXQgPSBuZXcgU2VydmxldEltcGwoKTsKLQkJcmV0dXJuIHNlcnZsZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFNlcnZsZXRUeXBlIGNyZWF0ZVNlcnZsZXRUeXBlKCkgewotCQlTZXJ2bGV0VHlwZUltcGwgc2VydmxldFR5cGUgPSBuZXcgU2VydmxldFR5cGVJbXBsKCk7Ci0JCXJldHVybiBzZXJ2bGV0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSlNQVHlwZSBjcmVhdGVKU1BUeXBlKCkgewotCQlKU1BUeXBlSW1wbCBqc3BUeXBlID0gbmV3IEpTUFR5cGVJbXBsKCk7Ci0JCXJldHVybiBqc3BUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJbml0UGFyYW0gY3JlYXRlSW5pdFBhcmFtKCkgewotCQlJbml0UGFyYW1JbXBsIGluaXRQYXJhbSA9IG5ldyBJbml0UGFyYW1JbXBsKCk7Ci0JCXJldHVybiBpbml0UGFyYW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEZpbHRlciBjcmVhdGVGaWx0ZXIoKSB7Ci0JCUZpbHRlckltcGwgZmlsdGVyID0gbmV3IEZpbHRlckltcGwoKTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyTWFwcGluZyBjcmVhdGVGaWx0ZXJNYXBwaW5nKCkgewotCQlGaWx0ZXJNYXBwaW5nSW1wbCBmaWx0ZXJNYXBwaW5nID0gbmV3IEZpbHRlck1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBmaWx0ZXJNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkgewotCQlMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsIGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCA9IG5ldyBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsKCk7Ci0JCXJldHVybiBsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExvY2FsRW5jb2RpbmdNYXBwaW5nIGNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nKCkgewotCQlMb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwgbG9jYWxFbmNvZGluZ01hcHBpbmcgPSBuZXcgTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBsb2NhbEVuY29kaW5nTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUE1ldGhvZFR5cGUgY3JlYXRlSFRUUE1ldGhvZFR5cGUoKSB7Ci0JCUhUVFBNZXRob2RUeXBlSW1wbCBodHRwTWV0aG9kVHlwZSA9IG5ldyBIVFRQTWV0aG9kVHlwZUltcGwoKTsKLQkJcmV0dXJuIGh0dHBNZXRob2RUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNBdXRoU2VydmxldFR5cGUgY3JlYXRlUmVzQXV0aFNlcnZsZXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVJlc0F1dGhTZXJ2bGV0VHlwZSByZXN1bHQgPSBSZXNBdXRoU2VydmxldFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJlc0F1dGhTZXJ2bGV0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQTWV0aG9kVHlwZUVudW0gY3JlYXRlSFRUUE1ldGhvZFR5cGVFbnVtRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUhUVFBNZXRob2RUeXBlRW51bSByZXN1bHQgPSBIVFRQTWV0aG9kVHlwZUVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEhUVFBNZXRob2RUeXBlRW51bVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGNyZWF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVHJhbnNwb3J0R3VhcmFudGVlVHlwZSByZXN1bHQgPSBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc3BhdGNoZXJUeXBlIGNyZWF0ZURpc3BhdGNoZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCURpc3BhdGNoZXJUeXBlIHJlc3VsdCA9IERpc3BhdGNoZXJUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREaXNwYXRjaGVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBdXRoTWV0aG9kS2luZCBjcmVhdGVBdXRoTWV0aG9kS2luZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlBdXRoTWV0aG9kS2luZCByZXN1bHQgPSBBdXRoTWV0aG9kS2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QXV0aE1ldGhvZEtpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUm9sZU5hbWVUeXBlIGNyZWF0ZVJvbGVOYW1lVHlwZSgpIHsKLQkJUm9sZU5hbWVUeXBlSW1wbCByb2xlTmFtZVR5cGUgPSBuZXcgUm9sZU5hbWVUeXBlSW1wbCgpOwotCQlyZXR1cm4gcm9sZU5hbWVUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBXZWJhcHBsaWNhdGlvblBhY2thZ2UgZ2V0V2ViYXBwbGljYXRpb25QYWNrYWdlKCkgewotCQlyZXR1cm4gKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViYXBwbGljYXRpb25QYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJhY2NmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aE1ldGhvZEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkRpc3BhdGNoZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5NaW1lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5SZXNBdXRoU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uUm9sZU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlc3Npb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVGFnTGliUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVVJMUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgV2ViYXBwbGljYXRpb25QYWNrYWdlLCBFUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2ViQXBwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRleHRQYXJhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZXJ2bGV0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlcnZsZXRNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlc3Npb25Db25maWdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWltZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2VsY29tZUZpbGVMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVycm9yUGFnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YWdMaWJSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhdXRoQ29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9naW5Db25maWdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZm9ybUxvZ2luQ29uZmlnRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluaXRQYXJhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWJUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlcnZsZXRUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGpzcFR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdXJsUGF0dGVyblR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZU5hbWVUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlbGNvbWVGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4Y2VwdGlvblR5cGVFcnJvclBhZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXJyb3JDb2RlRXJyb3JQYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZpbHRlck1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZmlsdGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBodHRwTWV0aG9kVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHJlc0F1dGhTZXJ2bGV0VHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkaXNwYXRjaGVyVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gYXV0aE1ldGhvZEtpbmRFRW51bSA9IG51bGw7Ci0KLQkJICAgLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcml2YXRlIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViYXBwbGljYXRpb25QYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChXZWJhcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2ViQXBwKCkgewotCQlyZXR1cm4gd2ViQXBwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkFwcF9EaXN0cmlidXRhYmxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViQXBwX1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfQ29udGV4dHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRXJyb3JQYWdlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9GaWxlTGlzdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9UYWdMaWJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXNzaW9uQ29uZmlnKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmxldHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ZpbHRlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0NvbnRleHRQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0pzcENvbmZpZygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGV4dFBhcmFtKCkgewotCQlyZXR1cm4gY29udGV4dFBhcmFtRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRleHRQYXJhbV9QYXJhbU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZXh0UGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZXh0UGFyYW1fUGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRleHRQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRleHRQYXJhbV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRleHRQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRleHRQYXJhbV9XZWJBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250ZXh0UGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVycm9yUGFnZSgpIHsKLQkJcmV0dXJuIGVycm9yUGFnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFcnJvclBhZ2VfTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllcnJvclBhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFcnJvclBhZ2VfV2ViQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXJyb3JQYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCkgewotCQlyZXR1cm4gZXhjZXB0aW9uVHlwZUVycm9yUGFnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFeGNlcHRpb25UeXBlRXJyb3JQYWdlX0V4Y2VwdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlleGNlcHRpb25UeXBlRXJyb3JQYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFcnJvckNvZGVFcnJvclBhZ2UoKSB7Ci0JCXJldHVybiBlcnJvckNvZGVFcnJvclBhZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXJyb3JDb2RlRXJyb3JQYWdlX0Vycm9yQ29kZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVycm9yQ29kZUVycm9yUGFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2VsY29tZUZpbGVMaXN0KCkgewotCQlyZXR1cm4gd2VsY29tZUZpbGVMaXN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlbGNvbWVGaWxlTGlzdF9XZWJBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWxjb21lRmlsZUxpc3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWxjb21lRmlsZUxpc3RfRmlsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlbGNvbWVGaWxlTGlzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2VsY29tZUZpbGUoKSB7Ci0JCXJldHVybiB3ZWxjb21lRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWxjb21lRmlsZV9XZWxjb21lRmlsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlbGNvbWVGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2VsY29tZUZpbGVfRmlsZUxpc3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWxjb21lRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFnTGliUmVmKCkgewotCQlyZXR1cm4gdGFnTGliUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhZ0xpYlJlZl9UYWdsaWJVUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJSZWZfVGFnbGliTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYWdMaWJSZWZfV2ViQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFnTGliUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN1cml0eUNvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYkFwcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X0F1dGhDb25zdHJhaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fV2ViUmVzb3VyY2VOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9TZWNDb25zdHJhaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VSTHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0hUVFBzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRVUkxQYXR0ZXJuVHlwZSgpIHsKLQkJcmV0dXJuIHVybFBhdHRlcm5UeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFVSTFBhdHRlcm5UeXBlX1VybFBhdHRlcm4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl1cmxQYXR0ZXJuVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFVSTFBhdHRlcm5UeXBlX1Jlc0NvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl1cmxQYXR0ZXJuVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SFRUUE1ldGhvZFR5cGUoKSB7Ci0JCXJldHVybiBodHRwTWV0aG9kVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIVFRQTWV0aG9kVHlwZV9IdHRwTWV0aG9kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaHR0cE1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEF1dGhDb25zdHJhaW50KCkgewotCQlyZXR1cm4gYXV0aENvbnN0cmFpbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhdXRoQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dGhDb25zdHJhaW50X1JvbGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0aENvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdXRoQ29uc3RyYWludF9TZWNDb25zdHJhaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXV0aENvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdXRoQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VXNlckRhdGFDb25zdHJhaW50KCkgewotCQlyZXR1cm4gdXNlckRhdGFDb25zdHJhaW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXVzZXJEYXRhQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFVzZXJEYXRhQ29uc3RyYWludF9UcmFuc3BvcnRHdWFyYW50ZWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRVc2VyRGF0YUNvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXVzZXJEYXRhQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvZ2luQ29uZmlnKCkgewotCQlyZXR1cm4gbG9naW5Db25maWdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9naW5Db25maWdfQXV0aE1ldGhvZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2dpbkNvbmZpZ19BdXRob3JpemF0aW9uTWV0aG9kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb2dpbkNvbmZpZ19XZWJBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExvZ2luQ29uZmlnX0Zvcm1Mb2dpbkNvbmZpZygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGb3JtTG9naW5Db25maWcoKSB7Ci0JCXJldHVybiBmb3JtTG9naW5Db25maWdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1Mb2dpblBhZ2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmb3JtTG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGb3JtTG9naW5Db25maWdfRm9ybUVycm9yUGFnZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZvcm1Mb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZvcm1Mb2dpbkNvbmZpZ19Mb2dpbkNvbmZpZygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZvcm1Mb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWltZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBtaW1lTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNaW1lTWFwcGluZ19FeHRlbnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltaW1lTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1pbWVNYXBwaW5nX01pbWVUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWltZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNaW1lTWFwcGluZ19XZWJBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltaW1lTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2Vzc2lvbkNvbmZpZygpIHsKLQkJcmV0dXJuIHNlc3Npb25Db25maWdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQ29uZmlnX1dlYkFwcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlcnZsZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gc2VydmxldE1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldE1hcHBpbmdfVXJsUGF0dGVybigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZsZXRNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldE1hcHBpbmdfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZsZXRNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldE1hcHBpbmdfV2ViQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0TWFwcGluZ19TZXJ2bGV0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlcnZsZXQoKSB7Ci0JCXJldHVybiBzZXJ2bGV0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRfU2VydmxldE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldF9Mb2FkT25TdGFydHVwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZsZXRfV2ViQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZsZXRfV2ViVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1BhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9SdW5BcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X0luaXRQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXZWJUeXBlKCkgewotCQlyZXR1cm4gd2ViVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlcnZsZXRUeXBlKCkgewotCQlyZXR1cm4gc2VydmxldFR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldFR5cGVfQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEpTUFR5cGUoKSB7Ci0JCXJldHVybiBqc3BUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFR5cGVfSnNwRmlsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEluaXRQYXJhbSgpIHsKLQkJcmV0dXJuIGluaXRQYXJhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fUGFyYW1OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5pdFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0UGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0UGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWx0ZXJfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbHRlcl9Jbml0UGFyYW1zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsdGVyX0ZpbHRlckNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsdGVyX0luaXRQYXJhbVZhbHVlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RmlsdGVyTWFwcGluZygpIHsKLQkJcmV0dXJuIGZpbHRlck1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsdGVyTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlclR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWx0ZXJNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsdGVyTWFwcGluZ19GaWx0ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWx0ZXJNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsdGVyTWFwcGluZ19TZXJ2bGV0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsdGVyTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkgewotCQlyZXR1cm4gbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdF9Mb2NhbEVuY29kaW5nTWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvY2FsRW5jb2RpbmdNYXBwaW5nKCkgewotCQlyZXR1cm4gbG9jYWxFbmNvZGluZ01hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9jYWxFbmNvZGluZ01hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ19FbmNvZGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxvY2FsRW5jb2RpbmdNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFJlc0F1dGhTZXJ2bGV0VHlwZSgpIHsKLQkJcmV0dXJuIHJlc0F1dGhTZXJ2bGV0VHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRIVFRQTWV0aG9kVHlwZUVudW0oKSB7Ci0JCXJldHVybiBodHRwTWV0aG9kVHlwZUVudW1FRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVOYW1lVHlwZSgpIHsKLQkJcmV0dXJuIHJvbGVOYW1lVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlTmFtZVR5cGVfUm9sZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlTmFtZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpIHsKLQkJcmV0dXJuIHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RGlzcGF0Y2hlclR5cGUoKSB7Ci0JCXJldHVybiBkaXNwYXRjaGVyVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRBdXRoTWV0aG9kS2luZCgpIHsKLQkJcmV0dXJuIGF1dGhNZXRob2RLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoV2ViYXBwbGljYXRpb25GYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXdlYkFwcEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUJfQVBQKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0RJU1RSSUJVVEFCTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fVkVSU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19DT05URVhUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19FUlJPUl9QQUdFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19GSUxFX0xJU1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fVEFHX0xJQlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fQ09OU1RSQUlOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fTE9HSU5fQ09ORklHKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX01JTUVfTUFQUElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fU0VTU0lPTl9DT05GSUcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19TRVJWTEVUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19TRUNVUklUWV9ST0xFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19GSUxURVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19MSVNURU5FUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fSlNQX0NPTkZJRyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QpOwotCi0JCWNvbnRleHRQYXJhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URVhUX1BBUkFNKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZXh0UGFyYW1FQ2xhc3MsIENPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRleHRQYXJhbUVDbGFzcywgQ09OVEVYVF9QQVJBTV9fUEFSQU1fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRleHRQYXJhbUVDbGFzcywgQ09OVEVYVF9QQVJBTV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRleHRQYXJhbUVDbGFzcywgQ09OVEVYVF9QQVJBTV9fV0VCX0FQUCk7Ci0KLQkJc2VydmxldEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWTEVUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19TRVJWTEVUX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX0xPQURfT05fU1RBUlRVUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fV0VCX0FQUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fV0VCX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX1BBUkFNUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19SVU5fQVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX0lOSVRfUEFSQU1TKTsKLQotCQlzZXJ2bGV0TWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWTEVUX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRNYXBwaW5nRUNsYXNzLCBTRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2bGV0TWFwcGluZ0VDbGFzcywgU0VSVkxFVF9NQVBQSU5HX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0TWFwcGluZ0VDbGFzcywgU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0TWFwcGluZ0VDbGFzcywgU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUKTsKLQotCQlzZXNzaW9uQ29uZmlnRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFU1NJT05fQ09ORklHKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQ29uZmlnRUNsYXNzLCBTRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQ29uZmlnRUNsYXNzLCBTRVNTSU9OX0NPTkZJR19fV0VCX0FQUCk7Ci0KLQkJbWltZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUlNRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtaW1lTWFwcGluZ0VDbGFzcywgTUlNRV9NQVBQSU5HX19FWFRFTlNJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1pbWVNYXBwaW5nRUNsYXNzLCBNSU1FX01BUFBJTkdfX01JTUVfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWltZU1hcHBpbmdFQ2xhc3MsIE1JTUVfTUFQUElOR19fV0VCX0FQUCk7Ci0KLQkJd2VsY29tZUZpbGVMaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFTENPTUVfRklMRV9MSVNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWxjb21lRmlsZUxpc3RFQ2xhc3MsIFdFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWxjb21lRmlsZUxpc3RFQ2xhc3MsIFdFTENPTUVfRklMRV9MSVNUX19GSUxFKTsKLQotCQllcnJvclBhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVJST1JfUEFHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXJyb3JQYWdlRUNsYXNzLCBFUlJPUl9QQUdFX19MT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXJyb3JQYWdlRUNsYXNzLCBFUlJPUl9QQUdFX19XRUJfQVBQKTsKLQotCQl0YWdMaWJSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFHX0xJQl9SRUYpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0xpYlJlZkVDbGFzcywgVEFHX0xJQl9SRUZfX1RBR0xJQl9VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0xpYlJlZkVDbGFzcywgVEFHX0xJQl9SRUZfX1RBR0xJQl9MT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFnTGliUmVmRUNsYXNzLCBUQUdfTElCX1JFRl9fV0VCX0FQUCk7Ci0KLQkJc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1VSSVRZX0NPTlNUUkFJTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFApOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTKTsKLQotCQl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VCX1JFU09VUkNFX0NPTExFQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk4pOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUX1BTKTsKLQotCQlhdXRoQ29uc3RyYWludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBVVRIX0NPTlNUUkFJTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhdXRoQ29uc3RyYWludEVDbGFzcywgQVVUSF9DT05TVFJBSU5UX19ST0xFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIEFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJdXNlckRhdGFDb25zdHJhaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFVTRVJfREFUQV9DT05TVFJBSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIFVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodXNlckRhdGFDb25zdHJhaW50RUNsYXNzLCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodXNlckRhdGFDb25zdHJhaW50RUNsYXNzLCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcywgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJbG9naW5Db25maWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9HSU5fQ09ORklHKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb2dpbkNvbmZpZ0VDbGFzcywgTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9naW5Db25maWdFQ2xhc3MsIExPR0lOX0NPTkZJR19fUkVBTE1fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9naW5Db25maWdFQ2xhc3MsIExPR0lOX0NPTkZJR19fQVVUSE9SSVpBVElPTl9NRVRIT0QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxvZ2luQ29uZmlnRUNsYXNzLCBMT0dJTl9DT05GSUdfX1dFQl9BUFApOwotCQljcmVhdGVFUmVmZXJlbmNlKGxvZ2luQ29uZmlnRUNsYXNzLCBMT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHKTsKLQotCQlmb3JtTG9naW5Db25maWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRk9STV9MT0dJTl9DT05GSUcpOwotCQljcmVhdGVFQXR0cmlidXRlKGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcywgRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZm9ybUxvZ2luQ29uZmlnRUNsYXNzLCBGT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmb3JtTG9naW5Db25maWdFQ2xhc3MsIEZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUcpOwotCi0JCWluaXRQYXJhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTklUX1BBUkFNKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbml0UGFyYW1FQ2xhc3MsIElOSVRfUEFSQU1fX1BBUkFNX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRQYXJhbUVDbGFzcywgSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRQYXJhbUVDbGFzcywgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04pOwotCi0JCXdlYlR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VCX1RZUEUpOwotCi0JCXNlcnZsZXRUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZMRVRfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldFR5cGVFQ2xhc3MsIFNFUlZMRVRfVFlQRV9fQ0xBU1NfTkFNRSk7Ci0KLQkJanNwVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKU1BfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVHlwZUVDbGFzcywgSlNQX1RZUEVfX0pTUF9GSUxFKTsKLQotCQl1cmxQYXR0ZXJuVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhVUkxfUEFUVEVSTl9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh1cmxQYXR0ZXJuVHlwZUVDbGFzcywgVVJMX1BBVFRFUk5fVFlQRV9fVVJMX1BBVFRFUk4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHVybFBhdHRlcm5UeXBlRUNsYXNzLCBVUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTik7Ci0KLQkJcm9sZU5hbWVUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfTkFNRV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlTmFtZVR5cGVFQ2xhc3MsIFJPTEVfTkFNRV9UWVBFX19ST0xFX05BTUUpOwotCi0JCXdlbGNvbWVGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFTENPTUVfRklMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2VsY29tZUZpbGVFQ2xhc3MsIFdFTENPTUVfRklMRV9fV0VMQ09NRV9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWxjb21lRmlsZUVDbGFzcywgV0VMQ09NRV9GSUxFX19GSUxFX0xJU1QpOwotCi0JCWV4Y2VwdGlvblR5cGVFcnJvclBhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXhjZXB0aW9uVHlwZUVycm9yUGFnZUVDbGFzcywgRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEUpOwotCi0JCWVycm9yQ29kZUVycm9yUGFnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFUlJPUl9DT0RFX0VSUk9SX1BBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGVycm9yQ29kZUVycm9yUGFnZUVDbGFzcywgRVJST1JfQ09ERV9FUlJPUl9QQUdFX19FUlJPUl9DT0RFKTsKLQotCQlmaWx0ZXJNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEZJTFRFUl9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk4pOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZJTFRFUl9NQVBQSU5HX19GSUxURVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZJTFRFUl9NQVBQSU5HX19TRVJWTEVUKTsKLQotCQlmaWx0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklMVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsdGVyRUNsYXNzLCBGSUxURVJfX0lOSVRfUEFSQU1TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fRklMVEVSX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fSU5JVF9QQVJBTV9WQUxVRVMpOwotCi0JCWxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcywgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUyk7Ci0KLQkJbG9jYWxFbmNvZGluZ01hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9DQUxfRU5DT0RJTkdfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9jYWxFbmNvZGluZ01hcHBpbmdFQ2xhc3MsIExPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9jYWxFbmNvZGluZ01hcHBpbmdFQ2xhc3MsIExPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HKTsKLQotCQlodHRwTWV0aG9kVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIVFRQX01FVEhPRF9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShodHRwTWV0aG9kVHlwZUVDbGFzcywgSFRUUF9NRVRIT0RfVFlQRV9fSFRUUF9NRVRIT0QpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlyZXNBdXRoU2VydmxldFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFJFU19BVVRIX1NFUlZMRVRfVFlQRSk7Ci0JCWh0dHBNZXRob2RUeXBlRW51bUVFbnVtID0gY3JlYXRlRUVudW0oSFRUUF9NRVRIT0RfVFlQRV9FTlVNKTsKLQkJdHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFKTsKLQkJZGlzcGF0Y2hlclR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKERJU1BBVENIRVJfVFlQRSk7Ci0JCWF1dGhNZXRob2RLaW5kRUVudW0gPSBjcmVhdGVFRW51bShBVVRIX01FVEhPRF9LSU5EKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJSnNwUGFja2FnZSB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKTsKLQkJSmF2YVJlZlBhY2thZ2UgdGhlSmF2YVJlZlBhY2thZ2UgPSAoSmF2YVJlZlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl3ZWJBcHBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKTkRJRW52UmVmc0dyb3VwKCkpOwotCQljb250ZXh0UGFyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJc2VydmxldEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQlzZXJ2bGV0TWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlzZXNzaW9uQ29uZmlnRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCW1pbWVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdlbGNvbWVGaWxlTGlzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQllcnJvclBhZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJdGFnTGliUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJYXV0aENvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJdXNlckRhdGFDb25zdHJhaW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWZvcm1Mb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlpbml0UGFyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJd2ViVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlzZXJ2bGV0VHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdlYlR5cGUoKSk7Ci0JCWpzcFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXZWJUeXBlKCkpOwotCQl1cmxQYXR0ZXJuVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlyb2xlTmFtZVR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJd2VsY29tZUZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZXhjZXB0aW9uVHlwZUVycm9yUGFnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVycm9yUGFnZSgpKTsKLQkJZXJyb3JDb2RlRXJyb3JQYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXJyb3JQYWdlKCkpOwotCQlmaWx0ZXJNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWZpbHRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQlsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJbG9jYWxFbmNvZGluZ01hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJaHR0cE1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHdlYkFwcEVDbGFzcywgV2ViQXBwLmNsYXNzLCAiV2ViQXBwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBfRGlzdHJpYnV0YWJsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRpc3RyaWJ1dGFibGUiLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViQXBwX1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Db250ZXh0cygpLCB0aGlzLmdldENvbnRleHRQYXJhbSgpLCB0aGlzLmdldENvbnRleHRQYXJhbV9XZWJBcHAoKSwgImNvbnRleHRzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSwgdGhpcy5nZXRFcnJvclBhZ2UoKSwgdGhpcy5nZXRFcnJvclBhZ2VfV2ViQXBwKCksICJlcnJvclBhZ2VzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ZpbGVMaXN0KCksIHRoaXMuZ2V0V2VsY29tZUZpbGVMaXN0KCksIHRoaXMuZ2V0V2VsY29tZUZpbGVMaXN0X1dlYkFwcCgpLCAiZmlsZUxpc3QiLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9UYWdMaWJzKCksIHRoaXMuZ2V0VGFnTGliUmVmKCksIHRoaXMuZ2V0VGFnTGliUmVmX1dlYkFwcCgpLCAidGFnTGlicyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Db25zdHJhaW50cygpLCB0aGlzLmdldFNlY3VyaXR5Q29uc3RyYWludCgpLCB0aGlzLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJBcHAoKSwgImNvbnN0cmFpbnRzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCksIHRoaXMuZ2V0TG9naW5Db25maWcoKSwgdGhpcy5nZXRMb2dpbkNvbmZpZ19XZWJBcHAoKSwgImxvZ2luQ29uZmlnIiwgbnVsbCwgMCwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTWltZU1hcHBpbmdzKCksIHRoaXMuZ2V0TWltZU1hcHBpbmcoKSwgdGhpcy5nZXRNaW1lTWFwcGluZ19XZWJBcHAoKSwgIm1pbWVNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZXNzaW9uQ29uZmlnKCksIHRoaXMuZ2V0U2Vzc2lvbkNvbmZpZygpLCB0aGlzLmdldFNlc3Npb25Db25maWdfV2ViQXBwKCksICJzZXNzaW9uQ29uZmlnIiwgbnVsbCwgMCwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCksIHRoaXMuZ2V0U2VydmxldE1hcHBpbmcoKSwgdGhpcy5nZXRTZXJ2bGV0TWFwcGluZ19XZWJBcHAoKSwgInNlcnZsZXRNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZXJ2bGV0cygpLCB0aGlzLmdldFNlcnZsZXQoKSwgdGhpcy5nZXRTZXJ2bGV0X1dlYkFwcCgpLCAic2VydmxldHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9GaWx0ZXJzKCksIHRoaXMuZ2V0RmlsdGVyKCksIG51bGwsICJmaWx0ZXJzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCksIHRoaXMuZ2V0RmlsdGVyTWFwcGluZygpLCBudWxsLCAiZmlsdGVyTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTGlzdGVuZXJzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0TGlzdGVuZXIoKSwgbnVsbCwgImxpc3RlbmVycyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiY29udGV4dFBhcmFtcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Kc3BDb25maWcoKSwgdGhlSnNwUGFja2FnZS5nZXRKU1BDb25maWcoKSwgbnVsbCwgImpzcENvbmZpZyIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCksIHRoaXMuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCksIG51bGwsICJsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QiLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb250ZXh0UGFyYW1FQ2xhc3MsIENvbnRleHRQYXJhbS5jbGFzcywgIkNvbnRleHRQYXJhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGV4dFBhcmFtX1BhcmFtTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1OYW1lIiwgbnVsbCwgMCwgMSwgQ29udGV4dFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZXh0UGFyYW1fUGFyYW1WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1WYWx1ZSIsIG51bGwsIDAsIDEsIENvbnRleHRQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGV4dFBhcmFtX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIENvbnRleHRQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGV4dFBhcmFtX1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9Db250ZXh0cygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgQ29udGV4dFBhcmFtLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VydmxldEVDbGFzcywgU2VydmxldC5jbGFzcywgIlNlcnZsZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRfU2VydmxldE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZsZXROYW1lIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9Mb2FkT25TdGFydHVwKCksIGVjb3JlUGFja2FnZS5nZXRFSW50ZWdlck9iamVjdCgpLCAibG9hZE9uU3RhcnR1cCIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfU2VydmxldHMoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfV2ViVHlwZSgpLCB0aGlzLmdldFdlYlR5cGUoKSwgbnVsbCwgIndlYlR5cGUiLCBudWxsLCAxLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X1BhcmFtcygpLCB0aGlzLmdldEluaXRQYXJhbSgpLCBudWxsLCAicGFyYW1zIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZVJlZigpLCBudWxsLCAic2VjdXJpdHlSb2xlUmVmcyIsIG51bGwsIDAsIC0xLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X1J1bkFzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpLCBudWxsLCAicnVuQXMiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X0luaXRQYXJhbXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJpbml0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2bGV0TWFwcGluZ0VDbGFzcywgU2VydmxldE1hcHBpbmcuY2xhc3MsICJTZXJ2bGV0TWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldE1hcHBpbmdfVXJsUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJsUGF0dGVybiIsIG51bGwsIDAsIDEsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0TWFwcGluZ19OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRNYXBwaW5nX1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0TWFwcGluZ19TZXJ2bGV0KCksIHRoaXMuZ2V0U2VydmxldCgpLCBudWxsLCAic2VydmxldCIsIG51bGwsIDEsIDEsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2Vzc2lvbkNvbmZpZ0VDbGFzcywgU2Vzc2lvbkNvbmZpZy5jbGFzcywgIlNlc3Npb25Db25maWciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInNlc3Npb25UaW1lb3V0IiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQ29uZmlnX1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9TZXNzaW9uQ29uZmlnKCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWltZU1hcHBpbmdFQ2xhc3MsIE1pbWVNYXBwaW5nLmNsYXNzLCAiTWltZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1pbWVNYXBwaW5nX0V4dGVuc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXh0ZW5zaW9uIiwgbnVsbCwgMCwgMSwgTWltZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1pbWVNYXBwaW5nX01pbWVUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtaW1lVHlwZSIsIG51bGwsIDAsIDEsIE1pbWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNaW1lTWFwcGluZ19XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfTWltZU1hcHBpbmdzKCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBNaW1lTWFwcGluZy5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdlbGNvbWVGaWxlTGlzdEVDbGFzcywgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCAiV2VsY29tZUZpbGVMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWxjb21lRmlsZUxpc3RfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0ZpbGVMaXN0KCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlbGNvbWVGaWxlTGlzdF9GaWxlKCksIHRoaXMuZ2V0V2VsY29tZUZpbGUoKSwgdGhpcy5nZXRXZWxjb21lRmlsZV9GaWxlTGlzdCgpLCAiZmlsZSIsIG51bGwsIDAsIC0xLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlcnJvclBhZ2VFQ2xhc3MsIEVycm9yUGFnZS5jbGFzcywgIkVycm9yUGFnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXJyb3JQYWdlX0xvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhdGlvbiIsIG51bGwsIDAsIDEsIEVycm9yUGFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXJyb3JQYWdlX1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9FcnJvclBhZ2VzKCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBFcnJvclBhZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0YWdMaWJSZWZFQ2xhc3MsIFRhZ0xpYlJlZi5jbGFzcywgIlRhZ0xpYlJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliUmVmX1RhZ2xpYlVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFnbGliVVJJIiwgbnVsbCwgMCwgMSwgVGFnTGliUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJSZWZfVGFnbGliTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRhZ2xpYkxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgVGFnTGliUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdMaWJSZWZfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX1RhZ0xpYnMoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFRhZ0xpYlJlZi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAiU2VjdXJpdHlDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRpc3BsYXlOYW1lIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCksIHRoaXMuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCksIHRoaXMuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1NlY0NvbnN0cmFpbnQoKSwgIndlYlJlc291cmNlQ29sbGVjdGlvbnMiLCBudWxsLCAxLCAtMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSwgdGhpcy5nZXRBdXRoQ29uc3RyYWludCgpLCB0aGlzLmdldEF1dGhDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSwgImF1dGhDb25zdHJhaW50IiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCksIHRoaXMuZ2V0VXNlckRhdGFDb25zdHJhaW50KCksIHRoaXMuZ2V0VXNlckRhdGFDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSwgInVzZXJEYXRhQ29uc3RyYWludCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lcygpLCB0aGVDb21tb25QYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICJXZWJSZXNvdXJjZUNvbGxlY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndlYlJlc291cmNlTmFtZSIsIG51bGwsIDAsIDEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVybFBhdHRlcm4iLCBudWxsLCAxLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2QoKSwgdGhpcy5nZXRIVFRQTWV0aG9kVHlwZUVudW0oKSwgImh0dHBNZXRob2QiLCBudWxsLCAwLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fU2VjQ29uc3RyYWludCgpLCB0aGlzLmdldFNlY3VyaXR5Q29uc3RyYWludCgpLCB0aGlzLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCksICJzZWNDb25zdHJhaW50IiwgbnVsbCwgMCwgMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVVJMcygpLCB0aGlzLmdldFVSTFBhdHRlcm5UeXBlKCksIHRoaXMuZ2V0VVJMUGF0dGVyblR5cGVfUmVzQ29sbGVjdGlvbigpLCAiVVJMcyIsIG51bGwsIDAsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0hUVFBzKCksIHRoaXMuZ2V0SFRUUE1ldGhvZFR5cGUoKSwgbnVsbCwgIkhUVFBzIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIkF1dGhDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aENvbnN0cmFpbnRfUm9sZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJvbGVzIiwgbnVsbCwgMCwgLTEsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBdXRoQ29uc3RyYWludF9TZWNDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0F1dGhDb25zdHJhaW50KCksICJzZWNDb25zdHJhaW50IiwgbnVsbCwgMCwgMSwgQXV0aENvbnN0cmFpbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQXV0aENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIlVzZXJEYXRhQ29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpLCB0aGlzLmdldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoKSwgInRyYW5zcG9ydEd1YXJhbnRlZSIsIG51bGwsIDAsIDEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpLCB0aGlzLmdldFNlY3VyaXR5Q29uc3RyYWludCgpLCB0aGlzLmdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSwgInNlY0NvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBVc2VyRGF0YUNvbnN0cmFpbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvZ2luQ29uZmlnRUNsYXNzLCBMb2dpbkNvbmZpZy5jbGFzcywgIkxvZ2luQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCksIHRoaXMuZ2V0QXV0aE1ldGhvZEtpbmQoKSwgImF1dGhNZXRob2QiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2dpbkNvbmZpZ19SZWFsbU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlYWxtTmFtZSIsIG51bGwsIDAsIDEsIExvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2dpbkNvbmZpZ19BdXRob3JpemF0aW9uTWV0aG9kKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhdXRob3JpemF0aW9uTWV0aG9kIiwgbnVsbCwgMCwgMSwgTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldExvZ2luQ29uZmlnX1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9Mb2dpbkNvbmZpZygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgTG9naW5Db25maWcuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldExvZ2luQ29uZmlnX0Zvcm1Mb2dpbkNvbmZpZygpLCB0aGlzLmdldEZvcm1Mb2dpbkNvbmZpZygpLCB0aGlzLmdldEZvcm1Mb2dpbkNvbmZpZ19Mb2dpbkNvbmZpZygpLCAiZm9ybUxvZ2luQ29uZmlnIiwgbnVsbCwgMCwgMSwgTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhmb3JtTG9naW5Db25maWdFQ2xhc3MsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgIkZvcm1Mb2dpbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1Mb2dpblBhZ2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZvcm1Mb2dpblBhZ2UiLCBudWxsLCAwLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmb3JtRXJyb3JQYWdlIiwgbnVsbCwgMCwgMSwgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGb3JtTG9naW5Db25maWdfTG9naW5Db25maWcoKSwgdGhpcy5nZXRMb2dpbkNvbmZpZygpLCB0aGlzLmdldExvZ2luQ29uZmlnX0Zvcm1Mb2dpbkNvbmZpZygpLCAibG9naW5Db25maWciLCBudWxsLCAwLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpbml0UGFyYW1FQ2xhc3MsIEluaXRQYXJhbS5jbGFzcywgIkluaXRQYXJhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1OYW1lIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1WYWx1ZSIsIG51bGwsIDAsIDEsIEluaXRQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEluaXRQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdlYlR5cGVFQ2xhc3MsIFdlYlR5cGUuY2xhc3MsICJXZWJUeXBlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2bGV0VHlwZUVDbGFzcywgU2VydmxldFR5cGUuY2xhc3MsICJTZXJ2bGV0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldFR5cGVfQ2xhc3NOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjbGFzc05hbWUiLCBudWxsLCAwLCAxLCBTZXJ2bGV0VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGpzcFR5cGVFQ2xhc3MsIEpTUFR5cGUuY2xhc3MsICJKU1BUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUeXBlX0pzcEZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImpzcEZpbGUiLCBudWxsLCAwLCAxLCBKU1BUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3ModXJsUGF0dGVyblR5cGVFQ2xhc3MsIFVSTFBhdHRlcm5UeXBlLmNsYXNzLCAiVVJMUGF0dGVyblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFVSTFBhdHRlcm5UeXBlX1VybFBhdHRlcm4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVybFBhdHRlcm4iLCBudWxsLCAwLCAxLCBVUkxQYXR0ZXJuVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VVJMUGF0dGVyblR5cGVfUmVzQ29sbGVjdGlvbigpLCB0aGlzLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbigpLCB0aGlzLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VUkxzKCksICJyZXNDb2xsZWN0aW9uIiwgbnVsbCwgMCwgMSwgVVJMUGF0dGVyblR5cGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyb2xlTmFtZVR5cGVFQ2xhc3MsIFJvbGVOYW1lVHlwZS5jbGFzcywgIlJvbGVOYW1lVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZU5hbWVUeXBlX1JvbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyb2xlTmFtZSIsIG51bGwsIDAsIDEsIFJvbGVOYW1lVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdlbGNvbWVGaWxlRUNsYXNzLCBXZWxjb21lRmlsZS5jbGFzcywgIldlbGNvbWVGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWxjb21lRmlsZV9XZWxjb21lRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid2VsY29tZUZpbGUiLCBudWxsLCAwLCAxLCBXZWxjb21lRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2VsY29tZUZpbGVfRmlsZUxpc3QoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3QoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3RfRmlsZSgpLCAiZmlsZUxpc3QiLCBudWxsLCAwLCAxLCBXZWxjb21lRmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGV4Y2VwdGlvblR5cGVFcnJvclBhZ2VFQ2xhc3MsIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UuY2xhc3MsICJFeGNlcHRpb25UeXBlRXJyb3JQYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFeGNlcHRpb25UeXBlRXJyb3JQYWdlX0V4Y2VwdGlvblR5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJleGNlcHRpb25UeXBlIiwgbnVsbCwgMSwgMSwgRXhjZXB0aW9uVHlwZUVycm9yUGFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVycm9yQ29kZUVycm9yUGFnZUVDbGFzcywgRXJyb3JDb2RlRXJyb3JQYWdlLmNsYXNzLCAiRXJyb3JDb2RlRXJyb3JQYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFcnJvckNvZGVFcnJvclBhZ2VfRXJyb3JDb2RlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlcnJvckNvZGUiLCBudWxsLCAwLCAxLCBFcnJvckNvZGVFcnJvclBhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAiRmlsdGVyTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmxQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgRmlsdGVyTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVyVHlwZSgpLCB0aGlzLmdldERpc3BhdGNoZXJUeXBlKCksICJkaXNwYXRjaGVyVHlwZSIsIG51bGwsIDAsIDQsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlck1hcHBpbmdfRmlsdGVyKCksIHRoaXMuZ2V0RmlsdGVyKCksIG51bGwsICJmaWx0ZXIiLCBudWxsLCAxLCAxLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJNYXBwaW5nX1NlcnZsZXQoKSwgdGhpcy5nZXRTZXJ2bGV0KCksIG51bGwsICJzZXJ2bGV0IiwgbnVsbCwgMCwgMSwgRmlsdGVyTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGZpbHRlckVDbGFzcywgRmlsdGVyLmNsYXNzLCAiRmlsdGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSwgdGhpcy5nZXRJbml0UGFyYW0oKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfRmlsdGVyQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJmaWx0ZXJDbGFzcyIsIG51bGwsIDEsIDEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyX0luaXRQYXJhbVZhbHVlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbVZhbHVlcyIsIG51bGwsIDAsIC0xLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RFQ2xhc3MsIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdC5jbGFzcywgIkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpLCB0aGlzLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nKCksIG51bGwsICJsb2NhbEVuY29kaW5nTWFwcGluZ3MiLCBudWxsLCAxLCAtMSwgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobG9jYWxFbmNvZGluZ01hcHBpbmdFQ2xhc3MsIExvY2FsRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCAiTG9jYWxFbmNvZGluZ01hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0xvY2FsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYWxlIiwgbnVsbCwgMCwgMSwgTG9jYWxFbmNvZGluZ01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlbmNvZGluZyIsIG51bGwsIDAsIDEsIExvY2FsRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaHR0cE1ldGhvZFR5cGVFQ2xhc3MsIEhUVFBNZXRob2RUeXBlLmNsYXNzLCAiSFRUUE1ldGhvZFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhUVFBNZXRob2RUeXBlX0h0dHBNZXRob2QoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImh0dHBNZXRob2QiLCBudWxsLCAwLCAxLCBIVFRQTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0ocmVzQXV0aFNlcnZsZXRUeXBlRUVudW0sIFJlc0F1dGhTZXJ2bGV0VHlwZS5jbGFzcywgIlJlc0F1dGhTZXJ2bGV0VHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aFNlcnZsZXRUeXBlRUVudW0sIFJlc0F1dGhTZXJ2bGV0VHlwZS5DT05UQUlORVJfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoU2VydmxldFR5cGVFRW51bSwgUmVzQXV0aFNlcnZsZXRUeXBlLlNFUlZMRVRfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uY2xhc3MsICJIVFRQTWV0aG9kVHlwZUVudW0iKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uR0VUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5QT1NUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5QVVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkRFTEVURV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uSEVBRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uT1BUSU9OU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uVFJBQ0VfTElURVJBTCk7Ci0JCS8vV0VCREFWIHN1cHBvcnQKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uQUNLX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5BQ0xfTElURVJBTCk7IAotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5CQVNFTElORV9DT05UUk9MX0xJVEVSQUwpOyAKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uQklORF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uQllFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5DQU5DRUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkNIRUNLSU5fTElURVJBTCk7IAotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5DSEVDS09VVF9MSVRFUkFMKTsgCi0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkNPUFlfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkVSUk9SUkVTUE9OU0VfTElURVJBTCk7IAotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5JTkZPX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5JTlZJVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkxBQkVMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5MT0NLX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5NRVJHRV9MSVRFUkFMKTsgCi0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLk1FU1NBR0VfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLk1LQUNUSVZJVFlfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLk1LQ09MX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5NS1dPUktTUEFDRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTU9WRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTk9USUZZX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5QUkFDS19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUFJPUEZJTkRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlBST1BQQVRDSF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUFJPVklTSU9OQUxSRVNQT05TRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUFVCTElTSF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUkVCSU5EX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRURJUkVDVFJFU1BPTlNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRUdJU1RFUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUkVQT1JUX0xJVEVSQUwpOyAKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUkVRVUVTVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUkVTUE9OU0VfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlNFQVJDSF9MSVRFUkFMKTsgCi0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlNVQ0NFU1NSRVNQT05TRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uVU5CSU5EX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5VTkNIRUNLT1VUX0xJVEVSQUwpOyAKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uVU5MT0NLX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5VUERBVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlZFUlNJT05fQ09OVFJPTF9MSVRFUkFMKTsgCi0KLQotCQkKLQkJCi0JCWluaXRFRW51bSh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuY2xhc3MsICJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuTk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5JTlRFR1JBTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5DT05GSURFTlRJQUxfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLmNsYXNzLCAiRGlzcGF0Y2hlclR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLkZPUldBUkRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5JTkNMVURFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuUkVRVUVTVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLkVSUk9SX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5jbGFzcywgIkF1dGhNZXRob2RLaW5kIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGF1dGhNZXRob2RLaW5kRUVudW0sIEF1dGhNZXRob2RLaW5kLkJBU0lDX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoYXV0aE1ldGhvZEtpbmRFRW51bSwgQXV0aE1ldGhvZEtpbmQuRElHRVNUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoYXV0aE1ldGhvZEtpbmRFRW51bSwgQXV0aE1ldGhvZEtpbmQuRk9STV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGF1dGhNZXRob2RLaW5kRUVudW0sIEF1dGhNZXRob2RLaW5kLkNMSUVOVF9DRVJUX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2VsY29tZUZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2VjNTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2VsY29tZUZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotCi0vKioKLSAqIFRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlIGFzIGEgZGVmYXVsdCB3ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZUZpbGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgV2VsY29tZUZpbGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlbGNvbWVGaWxlKCkgPGVtPldlbGNvbWUgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2VsY29tZUZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFTENPTUVfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdlbGNvbWVGaWxlID0gV0VMQ09NRV9GSUxFX0VERUZBVUxUOwotCXB1YmxpYyBXZWxjb21lRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLldFTENPTUVfRklMRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlbGNvbWVGaWxlKCkgewotCQlyZXR1cm4gd2VsY29tZUZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2VsY29tZUZpbGUoU3RyaW5nIG5ld1dlbGNvbWVGaWxlKSB7Ci0JCVN0cmluZyBvbGRXZWxjb21lRmlsZSA9IHdlbGNvbWVGaWxlOwotCQl3ZWxjb21lRmlsZSA9IG5ld1dlbGNvbWVGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEUsIG9sZFdlbGNvbWVGaWxlLCB3ZWxjb21lRmlsZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWxjb21lRmlsZUxpc3QgZ2V0RmlsZUxpc3QoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2VsY29tZUZpbGVMaXN0KWVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRGaWxlTGlzdChXZWxjb21lRmlsZUxpc3QgbmV3RmlsZUxpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0ZpbGVMaXN0LCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1QsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTGlzdChXZWxjb21lRmlsZUxpc3QgbmV3RmlsZUxpc3QpIHsKLQkJaWYgKG5ld0ZpbGVMaXN0ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVCAmJiBuZXdGaWxlTGlzdCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0ZpbGVMaXN0KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RmlsZUxpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RmlsZUxpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fRklMRSwgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEZpbGVMaXN0KG5ld0ZpbGVMaXN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVCwgbmV3RmlsZUxpc3QsIG5ld0ZpbGVMaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1Q6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEZpbGVMaXN0KChXZWxjb21lRmlsZUxpc3Qpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRGaWxlTGlzdChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19GSUxFLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX1dFTENPTUVfRklMRToKLQkJCQlyZXR1cm4gZ2V0V2VsY29tZUZpbGUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNUOgotCQkJCXJldHVybiBnZXRGaWxlTGlzdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX1dFTENPTUVfRklMRToKLQkJCQlzZXRXZWxjb21lRmlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVDoKLQkJCQlzZXRGaWxlTGlzdCgoV2VsY29tZUZpbGVMaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEU6Ci0JCQkJc2V0V2VsY29tZUZpbGUoV0VMQ09NRV9GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVDoKLQkJCQlzZXRGaWxlTGlzdCgoV2VsY29tZUZpbGVMaXN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEU6Ci0JCQkJcmV0dXJuIFdFTENPTUVfRklMRV9FREVGQVVMVCA9PSBudWxsID8gd2VsY29tZUZpbGUgIT0gbnVsbCA6ICFXRUxDT01FX0ZJTEVfRURFRkFVTFQuZXF1YWxzKHdlbGNvbWVGaWxlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNUOgotCQkJCXJldHVybiBnZXRGaWxlTGlzdCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh3ZWxjb21lRmlsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQod2VsY29tZUZpbGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2VsY29tZUZpbGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWUzMTdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2VsY29tZUZpbGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLQotLyoqCi0gKiBUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUgZmlsZXMgZWxlbWVudHMuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lRmlsZUxpc3RJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgV2VsY29tZUZpbGVMaXN0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBmaWxlID0gbnVsbDsKLQlwdWJsaWMgV2VsY29tZUZpbGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuV0VMQ09NRV9GSUxFX0xJU1Q7Ci0JfQotCi0vKioKLSAqIGFkZEZpbGVOYW1lZCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWRkRmlsZU5hbWVkKGphdmEubGFuZy5TdHJpbmcgbmFtZSkgewotCVdlbGNvbWVGaWxlIGxmaWxlID0gKChXZWJhcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpKS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVXZWxjb21lRmlsZSgpOwotCWxmaWxlLnNldFdlbGNvbWVGaWxlKG5hbWUpOwotCWdldEZpbGUoKS5hZGQobGZpbGUpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKLQkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3V2ViQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVCwgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlYkFwcChuZXdXZWJBcHAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQLCBuZXdXZWJBcHAsIG5ld1dlYkFwcCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRGaWxlKCkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlmaWxlID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoV2VsY29tZUZpbGUuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fRklMRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNUKTsKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUDoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKChXZWJBcHApb3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX0ZJTEU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX0ZJTEU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVCwgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19GSUxFOgotCQkJCWdldEZpbGUoKS5jbGVhcigpOwotCQkJCWdldEZpbGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fRklMRToKLQkJCQlnZXRGaWxlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKSAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX0ZJTEU6Ci0JCQkJcmV0dXJuIGZpbGUgIT0gbnVsbCAmJiAhZmlsZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvV2ViYXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9XZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTAwYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9XZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJvbGVOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3Q7Ci0KLQotCi1wdWJsaWMgY2xhc3MgV2ViYXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBXZWJhcHBsaWNhdGlvblBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHVibGljIFdlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCl0eXBlKS5lQ2xhc3MoKS5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgV2ViYXBwbGljYXRpb25Td2l0Y2ggc3cgPSBuZXcgV2ViYXBwbGljYXRpb25Td2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVdlYkFwcChXZWJBcHAgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV2ViQXBwQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRleHRQYXJhbShDb250ZXh0UGFyYW0gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGV4dFBhcmFtQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVycm9yUGFnZShFcnJvclBhZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRXJyb3JQYWdlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVycm9yQ29kZUVycm9yUGFnZShFcnJvckNvZGVFcnJvclBhZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVdlbGNvbWVGaWxlTGlzdChXZWxjb21lRmlsZUxpc3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV2VsY29tZUZpbGVMaXN0QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVdlbGNvbWVGaWxlKFdlbGNvbWVGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdlbGNvbWVGaWxlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0xpYlJlZihUYWdMaWJSZWYgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGFnTGliUmVmQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Q29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVVSTFBhdHRlcm5UeXBlKFVSTFBhdHRlcm5UeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVVSTFBhdHRlcm5UeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBNZXRob2RUeXBlKEhUVFBNZXRob2RUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUhUVFBNZXRob2RUeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUF1dGhDb25zdHJhaW50QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVXNlckRhdGFDb25zdHJhaW50QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUxvZ2luQ29uZmlnKExvZ2luQ29uZmlnIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUxvZ2luQ29uZmlnQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRm9ybUxvZ2luQ29uZmlnQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZU1pbWVNYXBwaW5nKE1pbWVNYXBwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1pbWVNYXBwaW5nQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTZXNzaW9uQ29uZmlnQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRNYXBwaW5nKFNlcnZsZXRNYXBwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRNYXBwaW5nQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXQoU2VydmxldCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTZXJ2bGV0QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVdlYlR5cGUoV2ViVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXZWJUeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRUeXBlKFNlcnZsZXRUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRUeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUpTUFR5cGUoSlNQVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVKU1BUeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUluaXRQYXJhbShJbml0UGFyYW0gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSW5pdFBhcmFtQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlcihGaWx0ZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRmlsdGVyQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlck1hcHBpbmcoRmlsdGVyTWFwcGluZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVGaWx0ZXJNYXBwaW5nQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVOYW1lVHlwZShSb2xlTmFtZVR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZU5hbWVUeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsRW5jb2RpbmdNYXBwaW5nKExvY2FsRW5jb2RpbmdNYXBwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nQWRhcHRlcigpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlcilzdy5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4KLQkgKiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYkFwcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRleHRQYXJhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVycm9yUGFnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFcnJvckNvZGVFcnJvclBhZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWxjb21lRmlsZUxpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWxjb21lRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZlR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVUkxQYXR0ZXJuVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhUVFBNZXRob2RUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QgPGVtPkoyRUVFIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRoQ29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvZ2luQ29uZmlnQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRm9ybUxvZ2luQ29uZmlnQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWltZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXNzaW9uQ29uZmlnQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldE1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZsZXRUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluaXRQYXJhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbHRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbHRlck1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMaXN0ZW5lckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVOYW1lVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlR2VuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWJhcHBsaWNhdGlvblN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBXZWJhcHBsaWNhdGlvblN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYkFwcChXZWJBcHAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYkFwcEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRleHRQYXJhbShDb250ZXh0UGFyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRleHRQYXJhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXQoU2VydmxldCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmxldEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRNYXBwaW5nKFNlcnZsZXRNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2bGV0TWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2Vzc2lvbkNvbmZpZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1pbWVNYXBwaW5nKE1pbWVNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNaW1lTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlbGNvbWVGaWxlTGlzdChXZWxjb21lRmlsZUxpc3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlbGNvbWVGaWxlTGlzdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVycm9yUGFnZShFcnJvclBhZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVycm9yUGFnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0xpYlJlZihUYWdMaWJSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhZ0xpYlJlZkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Q29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBdXRoQ29uc3RyYWludEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxvZ2luQ29uZmlnKExvZ2luQ29uZmlnIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb2dpbkNvbmZpZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUluaXRQYXJhbShJbml0UGFyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUluaXRQYXJhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYlR5cGUoV2ViVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRUeXBlKFNlcnZsZXRUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2bGV0VHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpTUFR5cGUoSlNQVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSlNQVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVVSTFBhdHRlcm5UeXBlKFVSTFBhdHRlcm5UeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVVUkxQYXR0ZXJuVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVOYW1lVHlwZShSb2xlTmFtZVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVOYW1lVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlbGNvbWVGaWxlKFdlbGNvbWVGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWxjb21lRmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVycm9yQ29kZUVycm9yUGFnZShFcnJvckNvZGVFcnJvclBhZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlck1hcHBpbmcoRmlsdGVyTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRmlsdGVyTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlcihGaWx0ZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUZpbHRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsRW5jb2RpbmdNYXBwaW5nKExvY2FsRW5jb2RpbmdNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBNZXRob2RUeXBlKEhUVFBNZXRob2RUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVIVFRQTWV0aG9kVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpORElFbnZSZWZzR3JvdXAoSk5ESUVudlJlZnNHcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSk5ESUVudlJlZnNHcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJHZW4oTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViQXBwQWRhcHRlckdlbigpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGV4dFBhcmFtQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXJyb3JQYWdlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlbGNvbWVGaWxlTGlzdEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlbGNvbWVGaWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFnTGliUmVmQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFnTGliUmVmVHlwZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVSTFBhdHRlcm5UeXBlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0aENvbnN0cmFpbnRBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnRBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb2dpbkNvbmZpZ0FkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZ0FkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbWVNYXBwaW5nQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2Vzc2lvbkNvbmZpZ0FkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZsZXRNYXBwaW5nQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlR5cGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0VHlwZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpTUFR5cGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0UGFyYW1BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWx0ZXJBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWx0ZXJNYXBwaW5nQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZyA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwIDxlbT5KTkRJIEVudiBSZWZzIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpORElFbnZSZWZzR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZU5hbWVUeXBlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV2ViYXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9XZWJhcHBsaWNhdGlvblN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9XZWJhcHBsaWNhdGlvblN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2FhOTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvV2ViYXBwbGljYXRpb25Td2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJvbGVOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3Q7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViYXBwbGljYXRpb25Td2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgV2ViYXBwbGljYXRpb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViYXBwbGljYXRpb25Td2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUDogewotCQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJBcHAod2ViQXBwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKTkRJRW52UmVmc0dyb3VwKHdlYkFwcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAod2ViQXBwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKHdlYkFwcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qod2ViQXBwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNOiB7Ci0JCQkJQ29udGV4dFBhcmFtIGNvbnRleHRQYXJhbSA9IChDb250ZXh0UGFyYW0pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbnRleHRQYXJhbShjb250ZXh0UGFyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGNvbnRleHRQYXJhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVDogewotCQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2bGV0KHNlcnZsZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKHNlcnZsZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoc2VydmxldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc2VydmxldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HOiB7Ci0JCQkJU2VydmxldE1hcHBpbmcgc2VydmxldE1hcHBpbmcgPSAoU2VydmxldE1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZsZXRNYXBwaW5nKHNlcnZsZXRNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzZXJ2bGV0TWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUc6IHsKLQkJCQlTZXNzaW9uQ29uZmlnIHNlc3Npb25Db25maWcgPSAoU2Vzc2lvbkNvbmZpZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2Vzc2lvbkNvbmZpZyhzZXNzaW9uQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzZXNzaW9uQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkc6IHsKLQkJCQlNaW1lTWFwcGluZyBtaW1lTWFwcGluZyA9IChNaW1lTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWltZU1hcHBpbmcobWltZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KG1pbWVNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVDogewotCQkJCVdlbGNvbWVGaWxlTGlzdCB3ZWxjb21lRmlsZUxpc3QgPSAoV2VsY29tZUZpbGVMaXN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWxjb21lRmlsZUxpc3Qod2VsY29tZUZpbGVMaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3ZWxjb21lRmlsZUxpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0U6IHsKLQkJCQlFcnJvclBhZ2UgZXJyb3JQYWdlID0gKEVycm9yUGFnZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXJyb3JQYWdlKGVycm9yUGFnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZXJyb3JQYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRjogewotCQkJCVRhZ0xpYlJlZiB0YWdMaWJSZWYgPSAoVGFnTGliUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYWdMaWJSZWYodGFnTGliUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh0YWdMaWJSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlQ6IHsKLQkJCQlTZWN1cml0eUNvbnN0cmFpbnQgc2VjdXJpdHlDb25zdHJhaW50ID0gKFNlY3VyaXR5Q29uc3RyYWludCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VjdXJpdHlDb25zdHJhaW50KHNlY3VyaXR5Q29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc2VjdXJpdHlDb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTjogewotCQkJCVdlYlJlc291cmNlQ29sbGVjdGlvbiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb24gPSAoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJSZXNvdXJjZUNvbGxlY3Rpb24od2ViUmVzb3VyY2VDb2xsZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3ZWJSZXNvdXJjZUNvbGxlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVDogewotCQkJCUF1dGhDb25zdHJhaW50IGF1dGhDb25zdHJhaW50ID0gKEF1dGhDb25zdHJhaW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBdXRoQ29uc3RyYWludChhdXRoQ29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoYXV0aENvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UOiB7Ci0JCQkJVXNlckRhdGFDb25zdHJhaW50IHVzZXJEYXRhQ29uc3RyYWludCA9IChVc2VyRGF0YUNvbnN0cmFpbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVVzZXJEYXRhQ29uc3RyYWludCh1c2VyRGF0YUNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHVzZXJEYXRhQ29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHOiB7Ci0JCQkJTG9naW5Db25maWcgbG9naW5Db25maWcgPSAoTG9naW5Db25maWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvZ2luQ29uZmlnKGxvZ2luQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChsb2dpbkNvbmZpZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUc6IHsKLQkJCQlGb3JtTG9naW5Db25maWcgZm9ybUxvZ2luQ29uZmlnID0gKEZvcm1Mb2dpbkNvbmZpZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRm9ybUxvZ2luQ29uZmlnKGZvcm1Mb2dpbkNvbmZpZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZm9ybUxvZ2luQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNOiB7Ci0JCQkJSW5pdFBhcmFtIGluaXRQYXJhbSA9IChJbml0UGFyYW0pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUluaXRQYXJhbShpbml0UGFyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGluaXRQYXJhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1RZUEU6IHsKLQkJCQlXZWJUeXBlIHdlYlR5cGUgPSAoV2ViVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2ViVHlwZSh3ZWJUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3ZWJUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX1RZUEU6IHsKLQkJCQlTZXJ2bGV0VHlwZSBzZXJ2bGV0VHlwZSA9IChTZXJ2bGV0VHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmxldFR5cGUoc2VydmxldFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdlYlR5cGUoc2VydmxldFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNlcnZsZXRUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRTogewotCQkJCUpTUFR5cGUganNwVHlwZSA9IChKU1BUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BUeXBlKGpzcFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdlYlR5cGUoanNwVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoanNwVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRTogewotCQkJCVVSTFBhdHRlcm5UeXBlIHVybFBhdHRlcm5UeXBlID0gKFVSTFBhdHRlcm5UeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VVUkxQYXR0ZXJuVHlwZSh1cmxQYXR0ZXJuVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QodXJsUGF0dGVyblR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJPTEVfTkFNRV9UWVBFOiB7Ci0JCQkJUm9sZU5hbWVUeXBlIHJvbGVOYW1lVHlwZSA9IChSb2xlTmFtZVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvbGVOYW1lVHlwZShyb2xlTmFtZVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHJvbGVOYW1lVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFOiB7Ci0JCQkJV2VsY29tZUZpbGUgd2VsY29tZUZpbGUgPSAoV2VsY29tZUZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlbGNvbWVGaWxlKHdlbGNvbWVGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3ZWxjb21lRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRTogewotCQkJCUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UgZXhjZXB0aW9uVHlwZUVycm9yUGFnZSA9IChFeGNlcHRpb25UeXBlRXJyb3JQYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeGNlcHRpb25UeXBlRXJyb3JQYWdlKGV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVycm9yUGFnZShleGNlcHRpb25UeXBlRXJyb3JQYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChleGNlcHRpb25UeXBlRXJyb3JQYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0U6IHsKLQkJCQlFcnJvckNvZGVFcnJvclBhZ2UgZXJyb3JDb2RlRXJyb3JQYWdlID0gKEVycm9yQ29kZUVycm9yUGFnZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXJyb3JDb2RlRXJyb3JQYWdlKGVycm9yQ29kZUVycm9yUGFnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXJyb3JQYWdlKGVycm9yQ29kZUVycm9yUGFnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZXJyb3JDb2RlRXJyb3JQYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElORzogewotCQkJCUZpbHRlck1hcHBpbmcgZmlsdGVyTWFwcGluZyA9IChGaWx0ZXJNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGaWx0ZXJNYXBwaW5nKGZpbHRlck1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGZpbHRlck1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUjogewotCQkJCUZpbHRlciBmaWx0ZXIgPSAoRmlsdGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGaWx0ZXIoZmlsdGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChmaWx0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoZmlsdGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChmaWx0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVDogewotCQkJCUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgPSAoTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QobG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkc6IHsKLQkJCQlMb2NhbEVuY29kaW5nTWFwcGluZyBsb2NhbEVuY29kaW5nTWFwcGluZyA9IChMb2NhbEVuY29kaW5nTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9jYWxFbmNvZGluZ01hcHBpbmcobG9jYWxFbmNvZGluZ01hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGxvY2FsRW5jb2RpbmdNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFOiB7Ci0JCQkJSFRUUE1ldGhvZFR5cGUgaHR0cE1ldGhvZFR5cGUgPSAoSFRUUE1ldGhvZFR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhUVFBNZXRob2RUeXBlKGh0dHBNZXRob2RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChodHRwTWV0aG9kVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBBcHA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIEFwcDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2ViQXBwKFdlYkFwcCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRleHQgUGFyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGV4dCBQYXJhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGV4dFBhcmFtKENvbnRleHRQYXJhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmxldChTZXJ2bGV0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmxldE1hcHBpbmcoU2VydmxldE1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXNzaW9uIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXNzaW9uIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWltZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbWUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWltZU1hcHBpbmcoTWltZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVycm9yIFBhZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXJyb3JQYWdlKEVycm9yUGFnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBMaWIgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBMaWIgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWJSZWYoVGFnTGliUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eUNvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIFJlc291cmNlIENvbGxlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIFJlc291cmNlIENvbGxlY3Rpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBdXRoQ29uc3RyYWludChBdXRoQ29uc3RyYWludCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9naW5Db25maWcoTG9naW5Db25maWcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXQgUGFyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5pdCBQYXJhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW5pdFBhcmFtKEluaXRQYXJhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJUeXBlKFdlYlR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2bGV0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0VHlwZShTZXJ2bGV0VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpTUCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpTUCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUeXBlKEpTUFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VUkwgUGF0dGVybiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVSTCBQYXR0ZXJuIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVVSTFBhdHRlcm5UeXBlKFVSTFBhdHRlcm5UeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBOYW1lIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBOYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVOYW1lVHlwZShSb2xlTmFtZVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWxjb21lIEZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VsY29tZSBGaWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWxjb21lRmlsZShXZWxjb21lRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4Y2VwdGlvbiBUeXBlIEVycm9yIFBhZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjZXB0aW9uIFR5cGUgRXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXhjZXB0aW9uVHlwZUVycm9yUGFnZShFeGNlcHRpb25UeXBlRXJyb3JQYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXJyb3IgQ29kZSBFcnJvciBQYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVycm9yIENvZGUgRXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXJyb3JDb2RlRXJyb3JQYWdlKEVycm9yQ29kZUVycm9yUGFnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGaWx0ZXJNYXBwaW5nKEZpbHRlck1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWx0ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGaWx0ZXIoRmlsdGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9jYWxFbmNvZGluZ01hcHBpbmcoTG9jYWxFbmNvZGluZ01hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IVFRQIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhUVFAgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBNZXRob2RUeXBlKEhUVFBNZXRob2RUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSk5ESUVudlJlZnNHcm91cChKTkRJRW52UmVmc0dyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9XZWJhcHBsaWNhdGlvblN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlOGUzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5FSkIgQXJ0aWZhY3QgRWRpdCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIHRoZSBFSkJBcnRpZmFjdEVkaXQgYXBpLiBUaGlzIGFwaSBpcyB1c2VkIHRvIHdvcmsgd2l0aCB0aGUgZW1mIG1vZGVsCi0gICAgICAgIG9mIGEgZmxleGlibGUgZWpiIG1vZHVsZS4gSXQgY29udGFpbnMgYXBpIHRvIHJlYWQgYW5kIHNlcmlhbGl6ZSBvdXQgdGhlIGVtZiBtb2RlbC4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvV2ViU2VydmljZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC9XZWJTZXJ2aWNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTY1NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC9XZWJTZXJ2aWNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV2ViU2VydmljZUNvbnN0YW50cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1hNTF9FTkNPRElORyA9ICJVVEYtOCI7Ly8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfRERfU0hPUlRfTkFNRSAgID0gIndlYnNlcnZpY2VzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9TWVNURU1JRCAgICA9ICJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMvZHRkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMC5kdGQiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfUFVCTElDSUQgPSAiLS8vSUJNIENvcnBvcmF0aW9uLCBJbmMuLy9EVEQgSjJFRSBXZWIgc2VydmljZXMgMS4wLy9FTiI7IC8vJE5PTi1OTFMtMSQgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFX0RPQ1RZUEUgPSAid2Vic2VydmljZXMiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfTE9DXzFfMSA9ICJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfTE9DX1NVTl8xXzEgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX0xPQ18xXzIgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFX1NDSEVNQV9MT0NfU1VOXzFfMiA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkIjsvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRUNMSUVOVF9ERF9TSE9SVF9OQU1FICAgPSAid2Vic2VydmljZXNjbGllbnQueG1sIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFQ0xJRU5UX1NZU1RFTUlEICAgID0gImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy9kdGQvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMC5kdGQiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VDTElFTlRfUFVCTElDSUQgPSAiLS8vSUJNIENvcnBvcmF0aW9uLCBJbmMuLy9EVEQgSjJFRSBXZWIgc2VydmljZXMgY2xpZW50IDEuMC8vRU4iOyAvLyROT04tTkxTLTEkICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRUNMSUVOVF9ET0NUWVBFID0gIndlYnNlcnZpY2VzY2xpZW50IjsvLyROT04tTkxTLTEkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfVEVNUF9ERF9TSE9SVF9OQU1FID0gIndlYnNlcnZpY2VzLXRlbXAueG1sIjsvLyROT04tTkxTLTEkCi0KLSAgLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENNQVBfRERfU0hPUlRfTkFNRSAgID0gIm1hcHBpbmcueG1sIjsgLy8kTk9OLU5MUy0xJCAhIVdlIGRvbid0IGhhdmUgYSBzdGFuZGFyZCBuYW1lISEKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYUlBDTUFQX1NZU1RFTUlEICAgID0gImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy9kdGQvajJlZV9qYXhycGNfbWFwcGluZ18xXzAuZHRkIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENNQVBfUFVCTElDSUQgPSAiLS8vSUJNIENvcnBvcmF0aW9uLCBJbmMuLy9EVEQgSjJFRSBKQVgtUlBDIG1hcHBpbmcgMS4wLy9FTiI7IC8vJE5PTi1OTFMtMSQgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENNQVBfRE9DVFlQRSA9ICJqYXZhLXdzZGwtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENNQVBfU0NIRU1BX0xPQyA9ICJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENNQVBfU0NIRU1BX0xPQ19TVU4gPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QiOy8vJE5PTi1OTFMtMSQKLSAgCi0gIAotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQlNFUlZJQ0VfMV8wX0lEID0gMTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQlNFUlZJQ0VfMV8xX0lEID0gMTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQlNFUlZJQ0VfMV8yX0lEID0gMTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX1ZFUlNJT05fMV8xID0gIjEuMSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFX1NDSEVNQV9WRVJTSU9OXzFfMiA9ICIxLjIiOy8vJE5PTi1OTFMtMSQKLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL1dlYlNlcnZpY2VJbml0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL1dlYlNlcnZpY2VJbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MTg2MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC9XZWJTZXJ2aWNlSW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbDsKLQotCi0KLS8qKgotKiBJbml0aWFsaXplciBjbGFzcyB0byBwcmVyZWdpc3RlciBwYWNrYWdlcywgcmVnaXN0ZXIgcmVzb3VyY2UgZmFjdG9yaWVzLCBhbmQgZHRkcyBmb3IgdGhlIHdlYiBzZXJ2aWNlcyBtb2RlbHMuCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VJbml0Ci17Ci0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkKLSAgewotCi0gICAgaWYgKGluaXRpYWxpemVkKSByZXR1cm47Ci0gCi0KLSAgICAvLyBJbml0aWFsaXplIHRoZSBFY29yZSBwYWNrYWdlLgotICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVjb3JlUGFja2FnZUltcGwuaW5pdCgpOwotCi0gICAgSjJFRUluaXQuaW5pdCgpOyAgICAKLQotICAgIC8vIEluaXRpYWxpemUgcGFja2FnZXMKLSAgICBKYXhycGNtYXBQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQotICAgIC8vIFJlZ2lzdGVyIHJlc291cmNlIGZhY3RvcmllcyBmb3IgeG1sIGRlc2NyaXB0b3JzCi0KLQotICAgIC8vIE5vdCBjYWxsaW5nIEpheHJwY21hcFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpIGJlY2F1c2UgaXQgZG9lcyBub3RoaW5nLiBSZWdpc3RyYXRpb24gbXVzdCBiZSBkb25lIGZvciBlYWNoIGZpbGVuYW1lIGFzIGZvbGxvd3M6Ci0gICAgLy8gSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KGZpbGVuYW1lLCBuZXcgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5KEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsgIAotICAgIC8vIHdoZXJlIGZpbGVuYW1lIGlzIGEgamF2YS5sYW5nLlN0cmluZyBuYW1lIG9mIHRoZSBtYXBwaW5nIGZpbGUKLQotICAgIC8vUmVnaXN0ZXIgRFREcwotICAgIEpheHJwY21hcFJlc291cmNlRmFjdG9yeS5yZWdpc3RlckR0ZHMoKTsKLQotCi0gICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvdXRpbC9EZXNjcmlwdGlvbkdyb3VwSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3V0aWwvRGVzY3JpcHRpb25Hcm91cEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTNjNWM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvdXRpbC9EZXNjcmlwdGlvbkdyb3VwSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci0KLQotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uR3JvdXBIZWxwZXIKLXsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFZhbHVlcyhXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcywgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZXMod2ViU2VydmljZXMsIGl0ZW0sIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoV2ViU2VydmljZXMgd2ViU2VydmljZXMsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIGJvb2xlYW4gZ2V0TGFuZykKLSAgewotICAJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSl3ZWJTZXJ2aWNlcy5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHJldHVybiBnZXREZXNjcmlwdGlvbnMod2ViU2VydmljZXMsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uRElTUExBWV9OQU1FOgotICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWVzKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLlNNQUxMX0lDT046Ci0gICAgICAgIHJldHVybiBnZXRTbWFsbEljb25zKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHJldHVybiBnZXRMYXJnZUljb25zKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgZ2V0TGFuZyk7ICAgICAgICAKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBudWxsOyAgICAgIAotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0RGVzY3JpcHRpb25zKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLQotICAJU3RyaW5nW10gdmFsdWVzID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgT2JqZWN0W10gZGVzY3JpcHRpb25zID0gd2ViU2VydmljZXMuZ2V0RGVzY3JpcHRpb25zKCkudG9BcnJheSgpOwotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1tkZXNjcmlwdGlvbnMubGVuZ3RoXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8ZGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChEZXNjcmlwdGlvbilkZXNjcmlwdGlvbnNbaV0pLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8ZGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChEZXNjcmlwdGlvbilkZXNjcmlwdGlvbnNbaV0pLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAJdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IHdlYlNlcnZpY2VzLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXREaXNwbGF5TmFtZXMoV2ViU2VydmljZXMgd2ViU2VydmljZXMsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nW10gdmFsdWVzID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgT2JqZWN0W10gZGlzcGxheU5hbWVzID0gd2ViU2VydmljZXMuZ2V0RGlzcGxheU5hbWVzKCkudG9BcnJheSgpOwotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1tkaXNwbGF5TmFtZXMubGVuZ3RoXTsgICAgICAKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8ZGlzcGxheU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChEaXNwbGF5TmFtZSlkaXNwbGF5TmFtZXNbaV0pLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8ZGlzcGxheU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChEaXNwbGF5TmFtZSlkaXNwbGF5TmFtZXNbaV0pLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgLy9yZXR1cm4gbnVsbCBzaW5jZSBsYW5ndWFnZSBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEoyRUUgMS4zLgotICAgICAgICB2YWx1ZXNbMF0gPSBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXNbMF0gPSB3ZWJTZXJ2aWNlcy5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRTbWFsbEljb25zKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZ1tdIHZhbHVlcyA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIE9iamVjdFtdIGljb25zID0gd2ViU2VydmljZXMuZ2V0SWNvbnMoKS50b0FycmF5KCk7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nW2ljb25zLmxlbmd0aF07ICAgICAgCi0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGljb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChJY29uVHlwZSlpY29uc1tpXSkuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxpY29ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoSWNvblR5cGUpaWNvbnNbaV0pLmdldFNtYWxsSWNvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IHdlYlNlcnZpY2VzLmdldFNtYWxsSWNvbigpOwotICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRMYXJnZUljb25zKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZ1tdIHZhbHVlcyA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIE9iamVjdFtdIGljb25zID0gd2ViU2VydmljZXMuZ2V0SWNvbnMoKS50b0FycmF5KCk7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nW2ljb25zLmxlbmd0aF07ICAgICAgCi0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGljb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChJY29uVHlwZSlpY29uc1tpXSkuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxpY29ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoSWNvblR5cGUpaWNvbnNbaV0pLmdldExhcmdlSWNvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgLy9yZXR1cm4gbnVsbCBzaW5jZSBsYW5ndWFnZSBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEoyRUUgMS4zLgotICAgICAgICB2YWx1ZXNbMF0gPSBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXNbMF0gPSB3ZWJTZXJ2aWNlcy5nZXRMYXJnZUljb24oKTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gdmFsdWVzOwotICB9Ci0KLQotICAvL1dlYlNlcnZpY2VzRGVzY3JpcHRpb24gbWV0aG9kcwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWx1ZShXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZXNEZXNjcmlwdGlvbiwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZSh3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBpdGVtLCBmYWxzZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbHVlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtLCBib29sZWFuIGdldExhbmcpCi0gIHsKLSAgCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2Upd2ViU2VydmljZXNEZXNjcmlwdGlvbi5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHJldHVybiBnZXREZXNjcmlwdGlvbih3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKLSAgICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lKHdlYlNlcnZpY2VzRGVzY3JpcHRpb24sIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uU01BTExfSUNPTjoKLSAgICAgICAgcmV0dXJuIGdldFNtYWxsSWNvbih3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHJldHVybiBnZXRMYXJnZUljb24od2ViU2VydmljZXNEZXNjcmlwdGlvbiwgaXNKMkVFMTQsIGdldExhbmcpOyAgICAgICAgCi0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbnVsbDsgICAgICAKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VzRGVzY3JpcHRpb24sIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nIHJldCA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIERlc2NyaXB0aW9uVHlwZSBkZXNjVHlwZSA9IHdlYlNlcnZpY2VzRGVzY3JpcHRpb24uZ2V0RGVzY3JpcHRpb25UeXBlKCk7Ci0gICAgICBpZiAoZGVzY1R5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgZGVzY1R5cGUuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGRlc2NUeXBlLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsJCi0gIAotCQlpZiggIWxhbmcgKQotCQl7Ci0JCQlyZXQgPSB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0JCX0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREaXNwbGF5TmFtZShXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZXNEZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0oyRUUxNCwgYm9vbGVhbiBsYW5nKQotICB7Ci0gIAlTdHJpbmcgcmV0ID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgRGlzcGxheU5hbWVUeXBlIGRuVHlwZSA9IHdlYlNlcnZpY2VzRGVzY3JpcHRpb24uZ2V0RGlzcGxheU5hbWVUeXBlKCk7Ci0gICAgICBpZiAoZG5UeXBlIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAobGFuZykKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGRuVHlwZS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgZG5UeXBlLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYoICFsYW5nICkKLSAgICAgIHsKLSAgICAgICAgcmV0ID0gd2ViU2VydmljZXNEZXNjcmlwdGlvbi5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNtYWxsSWNvbihXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZXNEZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0oyRUUxNCwgYm9vbGVhbiBsYW5nKQotICB7Ci0gIAlTdHJpbmcgcmV0ID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgSWNvblR5cGUgaWNvblR5cGUgPSB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLmdldEljb25UeXBlKCk7Ci0gICAgICBpZiAoaWNvblR5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgaWNvblR5cGUuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGljb25UeXBlLmdldFNtYWxsSWNvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiggIWxhbmcpCi0gICAgICB7Ci0gICAgICAJcmV0ID0gIHdlYlNlcnZpY2VzRGVzY3JpcHRpb24uZ2V0U21hbGxJY29uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgICBTdHJpbmcgcmV0ID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgSWNvblR5cGUgaWNvblR5cGUgPSB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLmdldEljb25UeXBlKCk7Ci0gICAgICBpZiAoaWNvblR5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgaWNvblR5cGUuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGljb25UeXBlLmdldExhcmdlSWNvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiggIWxhbmcgKQotICAgICAgewotICAgICAgCXJldCA9ICB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLmdldExhcmdlSWNvbigpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgLy9Qb3J0Q29tcG9uZW50IG1ldGhvZHMKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsdWUoUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlKHBvcnRDb21wb25lbnQsIGl0ZW0sIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsdWUoUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtLCBib29sZWFuIGdldExhbmcpCi0gIHsKLSAgCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpcG9ydENvbXBvbmVudC5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHJldHVybiBnZXREZXNjcmlwdGlvbihwb3J0Q29tcG9uZW50LCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKLSAgICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lKHBvcnRDb21wb25lbnQsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uU01BTExfSUNPTjoKLSAgICAgICAgcmV0dXJuIGdldFNtYWxsSWNvbihwb3J0Q29tcG9uZW50LCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHJldHVybiBnZXRMYXJnZUljb24ocG9ydENvbXBvbmVudCwgaXNKMkVFMTQsIGdldExhbmcpOyAgICAgICAgCi0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbnVsbDsgICAgICAKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZyByZXQgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBEZXNjcmlwdGlvblR5cGUgZGVzY1R5cGUgPSBwb3J0Q29tcG9uZW50LmdldERlc2NyaXB0aW9uVHlwZSgpOwotICAgICAgaWYgKGRlc2NUeXBlIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAobGFuZykKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGRlc2NUeXBlLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgCXJldCA9ICBkZXNjVHlwZS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiggIWxhbmcgKQotICAgICAgewotICAgICAgCXJldCA9ICBwb3J0Q29tcG9uZW50LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZyByZXQgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBEaXNwbGF5TmFtZVR5cGUgZG5UeXBlID0gcG9ydENvbXBvbmVudC5nZXREaXNwbGF5TmFtZVR5cGUoKTsKLSAgICAgIGlmIChkblR5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgZG5UeXBlLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgCXJldCA9ICBkblR5cGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYoICFsYW5nICkKLSAgICAgIHsKLSAgICAgIAlyZXQgPSAgcG9ydENvbXBvbmVudC5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNtYWxsSWNvbihQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nIHJldCA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIEljb25UeXBlIGljb25UeXBlID0gcG9ydENvbXBvbmVudC5nZXRJY29uVHlwZSgpOwotICAgICAgaWYgKGljb25UeXBlIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAobGFuZykKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gaWNvblR5cGUuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gaWNvblR5cGUuZ2V0U21hbGxJY29uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmKCAhbGFuZyApCi0gICAgICB7Ci0gICAgICAJcmV0ID0gcG9ydENvbXBvbmVudC5nZXRTbWFsbEljb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYXJnZUljb24oUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgICBTdHJpbmcgcmV0ID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgSWNvblR5cGUgaWNvblR5cGUgPSBwb3J0Q29tcG9uZW50LmdldEljb25UeXBlKCk7Ci0gICAgICBpZiAoaWNvblR5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSBpY29uVHlwZS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSBpY29uVHlwZS5nZXRMYXJnZUljb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCAhbGFuZyApCi0gICAgICB7Ci0gICAgICAJcmV0ID0gcG9ydENvbXBvbmVudC5nZXRMYXJnZUljb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VmFsdWVzKEhhbmRsZXIgaGFuZGxlciwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZXMoaGFuZGxlciwgaXRlbSwgZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFZhbHVlcyhIYW5kbGVyIGhhbmRsZXIsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIGJvb2xlYW4gZ2V0TGFuZykKLSAgewotICAJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSloYW5kbGVyLmVSZXNvdXJjZSgpOwotICAgIGJvb2xlYW4gaXNKMkVFMTQ9ZmFsc2U7Ci0gICAgaWYgKHJlcy5nZXRKMkVFVmVyc2lvbklEKCk9PUoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotICAgIHsKLSAgICAgIGlzSjJFRTE0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChpdGVtLmdldFZhbHVlKCkpCi0gICAgewotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ERVNDUklQVElPTjoKLSAgICAgICAgcmV0dXJuIGdldERlc2NyaXB0aW9ucyhoYW5kbGVyLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKLSAgICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lcyhoYW5kbGVyLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLlNNQUxMX0lDT046Ci0gICAgICAgIHJldHVybiBnZXRTbWFsbEljb25zKGhhbmRsZXIsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uTEFSR0VfSUNPTjoKLSAgICAgICAgcmV0dXJuIGdldExhcmdlSWNvbnMoaGFuZGxlciwgaXNKMkVFMTQsIGdldExhbmcpOyAgICAgICAgCi0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbnVsbDsgICAgICAKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXREZXNjcmlwdGlvbnMoSGFuZGxlciBoYW5kbGVyLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLQotICAJU3RyaW5nW10gdmFsdWVzID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgT2JqZWN0W10gZGVzY3JpcHRpb25zID0gaGFuZGxlci5nZXREZXNjcmlwdGlvbnMoKS50b0FycmF5KCk7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nW2Rlc2NyaXB0aW9ucy5sZW5ndGhdOyAgICAgIAotICAgICAgaWYgKGxhbmcpCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxkZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKERlc2NyaXB0aW9uKWRlc2NyaXB0aW9uc1tpXSkuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxkZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKERlc2NyaXB0aW9uKWRlc2NyaXB0aW9uc1tpXSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IGhhbmRsZXIuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4gdmFsdWVzOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0RGlzcGxheU5hbWVzKEhhbmRsZXIgaGFuZGxlciwgYm9vbGVhbiBpc0oyRUUxNCwgYm9vbGVhbiBsYW5nKQotICB7Ci0gIAlTdHJpbmdbXSB2YWx1ZXMgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBPYmplY3RbXSBkaXNwbGF5TmFtZXMgPSBoYW5kbGVyLmdldERpc3BsYXlOYW1lcygpLnRvQXJyYXkoKTsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbZGlzcGxheU5hbWVzLmxlbmd0aF07ICAgICAgCi0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGRpc3BsYXlOYW1lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoRGlzcGxheU5hbWUpZGlzcGxheU5hbWVzW2ldKS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGRpc3BsYXlOYW1lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoRGlzcGxheU5hbWUpZGlzcGxheU5hbWVzW2ldKS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgLy9yZXR1cm4gbnVsbCBzaW5jZSBsYW5ndWFnZSBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEoyRUUgMS4zLgotICAgICAgICB2YWx1ZXNbMF0gPSBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXNbMF0gPSBoYW5kbGVyLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlczsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFNtYWxsSWNvbnMoSGFuZGxlciBoYW5kbGVyLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZ1tdIHZhbHVlcyA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIE9iamVjdFtdIGljb25zID0gaGFuZGxlci5nZXRJY29ucygpLnRvQXJyYXkoKTsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbaWNvbnMubGVuZ3RoXTsgICAgICAKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8aWNvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKEljb25UeXBlKWljb25zW2ldKS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGljb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChJY29uVHlwZSlpY29uc1tpXSkuZ2V0U21hbGxJY29uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IGhhbmRsZXIuZ2V0U21hbGxJY29uKCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlczsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldExhcmdlSWNvbnMoSGFuZGxlciBoYW5kbGVyLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZ1tdIHZhbHVlcyA9ICBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBPYmplY3RbXSBpY29ucyA9IGhhbmRsZXIuZ2V0SWNvbnMoKS50b0FycmF5KCk7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nW2ljb25zLmxlbmd0aF07ICAgICAgCi0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGljb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChJY29uVHlwZSlpY29uc1tpXSkuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxpY29ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoSWNvblR5cGUpaWNvbnNbaV0pLmdldExhcmdlSWNvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgLy9yZXR1cm4gbnVsbCBzaW5jZSBsYW5ndWFnZSBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEoyRUUgMS4zLgotICAgICAgICB2YWx1ZXNbMF0gPSBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXNbMF0gPSBoYW5kbGVyLmdldExhcmdlSWNvbigpOwotICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLQotICAvL1NldHRlciBmb3IgV2ViU2VydmljZXMKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSh3ZWJTZXJ2aWNlcywgaXRlbSwgdmFsdWUsIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtLCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSl3ZWJTZXJ2aWNlcy5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ESVNQTEFZX05BTUU6Ci0gICAgICAgIHNldERpc3BsYXlOYW1lKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5TTUFMTF9JQ09OOgotICAgICAgICBzZXRTbWFsbEljb24od2ViU2VydmljZXMsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHNldExhcmdlSWNvbih3ZWJTZXJ2aWNlcywgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsgICAgICAgIAotICAgICAgICAvL2JyZWFrOyAgICAgICAgCi0gICAgICBkZWZhdWx0Oi8vZG8gbm90aGluZyA7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdGlvbihXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcywgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBEZXNjcmlwdGlvbiBvYmplY3QKLSAgICAgIE9iamVjdFtdIGRlc2NyaXB0aW9ucyA9IHdlYlNlcnZpY2VzLmdldERlc2NyaXB0aW9ucygpLnRvQXJyYXkoKTsKLSAgICAgIERlc2NyaXB0aW9uIGZpcnN0RGVzY3JpcHRpb24gPSBudWxsOwotICAgICAgaWYgKGRlc2NyaXB0aW9ucy5sZW5ndGggPCAxKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhIERlc2NyaXB0aW9uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgRGVzY3JpcHRpb24gbmV3RGVzY3JpcHRpb24gPSBmYWN0b3J5LmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGVzY3JpcHRpb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGVzY3JpcHRpb24uc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHdlYlNlcnZpY2VzLmdldERlc2NyaXB0aW9ucygpLmFkZChuZXdEZXNjcmlwdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpcnN0RGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pZGVzY3JpcHRpb25zWzBdOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0RGVzY3JpcHRpb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3REZXNjcmlwdGlvbi5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHdlYlNlcnZpY2VzLnNldERlc2NyaXB0aW9uKHZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERpc3BsYXlOYW1lKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIERpc3BsYXlOYW1lIG9iamVjdAotICAgICAgT2JqZWN0W10gZGlzcGxheU5hbWVzID0gd2ViU2VydmljZXMuZ2V0RGlzcGxheU5hbWVzKCkudG9BcnJheSgpOwotICAgICAgRGlzcGxheU5hbWUgZmlyc3REaXNwbGF5TmFtZSA9IG51bGw7Ci0gICAgICBpZiAoZGlzcGxheU5hbWVzLmxlbmd0aCA8IDEpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGEgRGlzcGxheU5hbWUKLSAgICAgICAgQ29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotICAgICAgICBEaXNwbGF5TmFtZSBuZXdEaXNwbGF5TmFtZSA9IGZhY3RvcnkuY3JlYXRlRGlzcGxheU5hbWUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdEaXNwbGF5TmFtZS5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdEaXNwbGF5TmFtZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3ZWJTZXJ2aWNlcy5nZXREaXNwbGF5TmFtZXMoKS5hZGQobmV3RGlzcGxheU5hbWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdERpc3BsYXlOYW1lID0gKERpc3BsYXlOYW1lKWRpc3BsYXlOYW1lc1swXTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdERpc3BsYXlOYW1lLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0RGlzcGxheU5hbWUuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICB3ZWJTZXJ2aWNlcy5zZXREaXNwbGF5TmFtZSh2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTbWFsbEljb24oV2ViU2VydmljZXMgd2ViU2VydmljZXMsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgSWNvbiBvYmplY3QKLSAgICAgIE9iamVjdFtdIGljb25zID0gd2ViU2VydmljZXMuZ2V0SWNvbnMoKS50b0FycmF5KCk7Ci0gICAgICBJY29uVHlwZSBmaXJzdEljb24gPSBudWxsOwotICAgICAgaWYgKGljb25zLmxlbmd0aCA8IDEpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGFuIEljb24KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotICAgICAgICBJY29uVHlwZSBuZXdJY29uID0gZmFjdG9yeS5jcmVhdGVJY29uVHlwZSgpOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIG5ld0ljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3SWNvbi5zZXRTbWFsbEljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHdlYlNlcnZpY2VzLmdldEljb25zKCkuYWRkKG5ld0ljb24pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdEljb24gPSAoSWNvblR5cGUpaWNvbnNbMF07Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3RJY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0SWNvbi5zZXRTbWFsbEljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICB3ZWJTZXJ2aWNlcy5zZXRTbWFsbEljb24odmFsdWUpOwotICAgIH0KLSAgICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0TGFyZ2VJY29uKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIEljb24gb2JqZWN0Ci0gICAgICBPYmplY3RbXSBpY29ucyA9IHdlYlNlcnZpY2VzLmdldEljb25zKCkudG9BcnJheSgpOwotICAgICAgSWNvblR5cGUgZmlyc3RJY29uID0gbnVsbDsKLSAgICAgIGlmIChpY29ucy5sZW5ndGggPCAxKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhbiBJY29uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgSWNvblR5cGUgbmV3SWNvbiA9IGZhY3RvcnkuY3JlYXRlSWNvblR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdJY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5ld0ljb24uc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICB3ZWJTZXJ2aWNlcy5nZXRJY29ucygpLmFkZChuZXdJY29uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZmlyc3RJY29uID0gKEljb25UeXBlKWljb25zWzBdOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0SWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdEljb24uc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgd2ViU2VydmljZXMuc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotCi0vL1NldHRlcnMgZm9yIFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgaXRlbSwgdmFsdWUsIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gIAlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKXdlYlNlcnZpY2VEZXNjcmlwdGlvbi5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uRElTUExBWV9OQU1FOgotICAgICAgICBzZXREaXNwbGF5TmFtZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLlNNQUxMX0lDT046Ci0gICAgICAgIHNldFNtYWxsSWNvbih3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHNldExhcmdlSWNvbih3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7ICAgICAgICAKLSAgICAgICAgLy9icmVhazsgICAgICAgIAotICAgICAgZGVmYXVsdDoKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgCi0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgRGVzY3JpcHRpb24gb2JqZWN0Ci0gICAgICAKLSAgICAgIERlc2NyaXB0aW9uVHlwZSBkZXNjcmlwdGlvbiA9IHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5nZXREZXNjcmlwdGlvblR5cGUoKTsKLSAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhIERlc2NyaXB0aW9uVHlwZQotICAgICAgICBXc2NvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3Njb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIERlc2NyaXB0aW9uVHlwZSBkZXNjcmlwdGlvbk5ldyA9IGZhY3RvcnkuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCk7Ci0KLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbk5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICAgIGRlc2NyaXB0aW9uTmV3LnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgd2ViU2VydmljZURlc2NyaXB0aW9uLnNldERlc2NyaXB0aW9uVHlwZShkZXNjcmlwdGlvbk5ldyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZGVzY3JpcHRpb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREaXNwbGF5TmFtZShXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZURlc2NyaXB0aW9uLCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIERpc3BsYXlOYW1lIG9iamVjdAotICAgICAgCi0gICAgICBEaXNwbGF5TmFtZVR5cGUgZGlzcGxheU5hbWUgPSB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RGlzcGxheU5hbWVUeXBlKCk7Ci0gICAgICBpZiAoZGlzcGxheU5hbWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYSBEaXNwbGF5TmFtZVR5cGUKLSAgICAgICAgV3Njb21tb25GYWN0b3J5IGZhY3RvcnkgPSBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFdzY29tbW9uRmFjdG9yeSgpOwotICAgICAgICBEaXNwbGF5TmFtZVR5cGUgZGlzcGxheU5hbWVOZXcgPSBmYWN0b3J5LmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lTmV3LnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lTmV3LnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uc2V0RGlzcGxheU5hbWVUeXBlKGRpc3BsYXlOYW1lTmV3KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBkaXNwbGF5TmFtZS5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkaXNwbGF5TmFtZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5zZXREaXNwbGF5TmFtZSh2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTbWFsbEljb24oV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBJY29uIG9iamVjdAotICAgICAgSWNvblR5cGUgaWNvbiA9IHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5nZXRJY29uVHlwZSgpOwotICAgICAgaWYgKGljb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYW4gSWNvbgotICAgICAgICBDb21tb25GYWN0b3J5IGZhY3RvcnkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIEljb25UeXBlIGljb25OZXcgPSBmYWN0b3J5LmNyZWF0ZUljb25UeXBlKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbk5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uTmV3LnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uc2V0SWNvblR5cGUoaWNvbk5ldyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uLnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5zZXRTbWFsbEljb24odmFsdWUpOwotICAgIH0KLSAgICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0TGFyZ2VJY29uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgSWNvbiBvYmplY3QKLSAgICAgIEljb25UeXBlIGljb24gPSB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2V0SWNvblR5cGUoKTsKLSAgICAgIGlmIChpY29uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGFuIEljb24KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotICAgICAgICBJY29uVHlwZSBpY29uTmV3ID0gZmFjdG9yeS5jcmVhdGVJY29uVHlwZSgpOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGljb25OZXcuc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbk5ldy5zZXRMYXJnZUljb24odmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2ViU2VydmljZURlc2NyaXB0aW9uLnNldEljb25UeXBlKGljb25OZXcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbi5zZXRMYXJnZUljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotCi0vL1NldHRlcnMgZm9yIFBvcnRDb21wb25lbnRzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSkKLSAgewotCi0gICAgc2V0VmFsdWUocG9ydENvbXBvbmVudCwgaXRlbSwgdmFsdWUsIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKFBvcnRDb21wb25lbnQgcG9ydENvbXBvbmVudCwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpcG9ydENvbXBvbmVudC5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKHBvcnRDb21wb25lbnQsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKLSAgICAgICAgc2V0RGlzcGxheU5hbWUocG9ydENvbXBvbmVudCwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uU01BTExfSUNPTjoKLSAgICAgICAgc2V0U21hbGxJY29uKHBvcnRDb21wb25lbnQsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHNldExhcmdlSWNvbihwb3J0Q29tcG9uZW50LCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOyAgICAgICAgCi0gICAgICAgIC8vYnJlYWs7ICAgICAgICAKLSAgICAgIGRlZmF1bHQ6IAotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIAotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIERlc2NyaXB0aW9uIG9iamVjdAotICAgICAgCi0gICAgICBEZXNjcmlwdGlvblR5cGUgZGVzY3JpcHRpb24gPSBwb3J0Q29tcG9uZW50LmdldERlc2NyaXB0aW9uVHlwZSgpOwotICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGEgRGVzY3JpcHRpb25UeXBlCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXc2NvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgRGVzY3JpcHRpb25UeXBlIGRlc2NyaXB0aW9uTmV3ID0gZmFjdG9yeS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbk5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbk5ldy5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHBvcnRDb21wb25lbnQuc2V0RGVzY3JpcHRpb25UeXBlKGRlc2NyaXB0aW9uTmV3KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHBvcnRDb21wb25lbnQuc2V0RGVzY3JpcHRpb24odmFsdWUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0RGlzcGxheU5hbWUoUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIERpc3BsYXlOYW1lIG9iamVjdAotICAgICAgCi0gICAgICBEaXNwbGF5TmFtZVR5cGUgZGlzcGxheU5hbWUgPSBwb3J0Q29tcG9uZW50LmdldERpc3BsYXlOYW1lVHlwZSgpOwotICAgICAgaWYgKGRpc3BsYXlOYW1lID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGEgRGlzcGxheU5hbWVUeXBlCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXc2NvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgRGlzcGxheU5hbWVUeXBlIGRpc3BsYXlOYW1lTmV3ID0gZmFjdG9yeS5jcmVhdGVEaXNwbGF5TmFtZVR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBkaXNwbGF5TmFtZU5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkaXNwbGF5TmFtZU5ldy5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcG9ydENvbXBvbmVudC5zZXREaXNwbGF5TmFtZVR5cGUoZGlzcGxheU5hbWVOZXcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgcG9ydENvbXBvbmVudC5zZXREaXNwbGF5TmFtZSh2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTbWFsbEljb24oUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIEljb24gb2JqZWN0Ci0gICAgICBJY29uVHlwZSBpY29uID0gcG9ydENvbXBvbmVudC5nZXRJY29uVHlwZSgpOwotICAgICAgaWYgKGljb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYW4gSWNvbgotICAgICAgICBDb21tb25GYWN0b3J5IGZhY3RvcnkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIEljb25UeXBlIGljb25OZXcgPSBmYWN0b3J5LmNyZWF0ZUljb25UeXBlKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbk5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uTmV3LnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwb3J0Q29tcG9uZW50LnNldEljb25UeXBlKGljb25OZXcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbi5zZXRTbWFsbEljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICBwb3J0Q29tcG9uZW50LnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRMYXJnZUljb24oUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIEljb24gb2JqZWN0Ci0gICAgICBJY29uVHlwZSBpY29uID0gcG9ydENvbXBvbmVudC5nZXRJY29uVHlwZSgpOwotICAgICAgaWYgKGljb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYW4gSWNvbgotICAgICAgICBDb21tb25GYWN0b3J5IGZhY3RvcnkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIEljb25UeXBlIGljb25OZXcgPSBmYWN0b3J5LmNyZWF0ZUljb25UeXBlKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbk5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uTmV3LnNldExhcmdlSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwb3J0Q29tcG9uZW50LnNldEljb25UeXBlKGljb25OZXcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbi5zZXRMYXJnZUljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICBwb3J0Q29tcG9uZW50LnNldExhcmdlSWNvbih2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgLy9TZXR0ZXIgZm9yIEhhbmRsZXJzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShIYW5kbGVyIGhhbmRsZXIsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKGhhbmRsZXIsIGl0ZW0sIHZhbHVlLCBmYWxzZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShIYW5kbGVyIGhhbmRsZXIsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gIAlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKWhhbmRsZXIuZVJlc291cmNlKCk7Ci0gICAgYm9vbGVhbiBpc0oyRUUxND1mYWxzZTsKLSAgICBpZiAocmVzLmdldEoyRUVWZXJzaW9uSUQoKT09SjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpCi0gICAgewotICAgICAgaXNKMkVFMTQgPSB0cnVlOwotICAgIH0KLSAgICAKLSAgICBzd2l0Y2ggKGl0ZW0uZ2V0VmFsdWUoKSkKLSAgICB7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRFU0NSSVBUSU9OOgotICAgICAgICBzZXREZXNjcmlwdGlvbihoYW5kbGVyLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ESVNQTEFZX05BTUU6Ci0gICAgICAgIHNldERpc3BsYXlOYW1lKGhhbmRsZXIsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLlNNQUxMX0lDT046Ci0gICAgICAgIHNldFNtYWxsSWNvbihoYW5kbGVyLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5MQVJHRV9JQ09OOgotICAgICAgICBzZXRMYXJnZUljb24oaGFuZGxlciwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsgICAgICAgIAotICAgICAgICAvL2JyZWFrOyAgICAgICAgCi0gICAgICBkZWZhdWx0Oi8vZG8gbm90aGluZyA7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdGlvbihIYW5kbGVyIGhhbmRsZXIsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgRGVzY3JpcHRpb24gb2JqZWN0Ci0gICAgICBPYmplY3RbXSBkZXNjcmlwdGlvbnMgPSBoYW5kbGVyLmdldERlc2NyaXB0aW9ucygpLnRvQXJyYXkoKTsKLSAgICAgIERlc2NyaXB0aW9uIGZpcnN0RGVzY3JpcHRpb24gPSBudWxsOwotICAgICAgaWYgKGRlc2NyaXB0aW9ucy5sZW5ndGggPCAxKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhIERlc2NyaXB0aW9uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgRGVzY3JpcHRpb24gbmV3RGVzY3JpcHRpb24gPSBmYWN0b3J5LmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGVzY3JpcHRpb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGVzY3JpcHRpb24uc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGhhbmRsZXIuZ2V0RGVzY3JpcHRpb25zKCkuYWRkKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZmlyc3REZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilkZXNjcmlwdGlvbnNbMF07Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3REZXNjcmlwdGlvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdERlc2NyaXB0aW9uLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgaGFuZGxlci5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREaXNwbGF5TmFtZShIYW5kbGVyIGhhbmRsZXIsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgRGlzcGxheU5hbWUgb2JqZWN0Ci0gICAgICBPYmplY3RbXSBkaXNwbGF5TmFtZXMgPSBoYW5kbGVyLmdldERpc3BsYXlOYW1lcygpLnRvQXJyYXkoKTsKLSAgICAgIERpc3BsYXlOYW1lIGZpcnN0RGlzcGxheU5hbWUgPSBudWxsOwotICAgICAgaWYgKGRpc3BsYXlOYW1lcy5sZW5ndGggPCAxKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhIERpc3BsYXlOYW1lCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgRGlzcGxheU5hbWUgbmV3RGlzcGxheU5hbWUgPSBmYWN0b3J5LmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGlzcGxheU5hbWUuc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGlzcGxheU5hbWUuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlci5nZXREaXNwbGF5TmFtZXMoKS5hZGQobmV3RGlzcGxheU5hbWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdERpc3BsYXlOYW1lID0gKERpc3BsYXlOYW1lKWRpc3BsYXlOYW1lc1swXTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdERpc3BsYXlOYW1lLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0RGlzcGxheU5hbWUuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICBoYW5kbGVyLnNldERpc3BsYXlOYW1lKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFNtYWxsSWNvbihIYW5kbGVyIGhhbmRsZXIsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgSWNvbiBvYmplY3QKLSAgICAgIE9iamVjdFtdIGljb25zID0gaGFuZGxlci5nZXRJY29ucygpLnRvQXJyYXkoKTsKLSAgICAgIEljb25UeXBlIGZpcnN0SWNvbiA9IG51bGw7Ci0gICAgICBpZiAoaWNvbnMubGVuZ3RoIDwgMSkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYW4gSWNvbgotICAgICAgICBDb21tb25GYWN0b3J5IGZhY3RvcnkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIEljb25UeXBlIG5ld0ljb24gPSBmYWN0b3J5LmNyZWF0ZUljb25UeXBlKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3SWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdJY29uLnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlci5nZXRJY29ucygpLmFkZChuZXdJY29uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZmlyc3RJY29uID0gKEljb25UeXBlKWljb25zWzBdOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0SWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdEljb24uc2V0U21hbGxJY29uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgaGFuZGxlci5zZXRTbWFsbEljb24odmFsdWUpOwotICAgIH0KLSAgICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0TGFyZ2VJY29uKEhhbmRsZXIgaGFuZGxlciwgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBJY29uIG9iamVjdAotICAgICAgT2JqZWN0W10gaWNvbnMgPSBoYW5kbGVyLmdldEljb25zKCkudG9BcnJheSgpOwotICAgICAgSWNvblR5cGUgZmlyc3RJY29uID0gbnVsbDsKLSAgICAgIGlmIChpY29ucy5sZW5ndGggPCAxKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhbiBJY29uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgSWNvblR5cGUgbmV3SWNvbiA9IGZhY3RvcnkuY3JlYXRlSWNvblR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdJY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5ld0ljb24uc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBoYW5kbGVyLmdldEljb25zKCkuYWRkKG5ld0ljb24pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdEljb24gPSAoSWNvblR5cGUpaWNvbnNbMF07Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3RJY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0SWNvbi5zZXRMYXJnZUljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICBoYW5kbGVyLnNldExhcmdlSWNvbih2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC91dGlsL0Rlc2NyaXB0aW9uR3JvdXBJdGVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3V0aWwvRGVzY3JpcHRpb25Hcm91cEl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzNTkxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3V0aWwvRGVzY3JpcHRpb25Hcm91cEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVzY3JpcHRpb25Hcm91cEl0ZW0gZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVTQ1JJUFRJT04gPSAwOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfTkFNRSA9IDE7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfSUNPTiA9IDI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfSUNPTiA9IDM7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBERVNDUklQVElPTl9MSVRFUkFMID0gbmV3IERlc2NyaXB0aW9uR3JvdXBJdGVtKERFU0NSSVBUSU9OLCAiZGVzY3JpcHRpb24iKTsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gRElTUExBWV9OQU1FX0xJVEVSQUwgPSBuZXcgRGVzY3JpcHRpb25Hcm91cEl0ZW0oRElTUExBWV9OQU1FLCAiZGlzcGxheS1uYW1lIik7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIERlc2NyaXB0aW9uR3JvdXBJdGVtIFNNQUxMX0lDT05fTElURVJBTCA9IG5ldyBEZXNjcmlwdGlvbkdyb3VwSXRlbShTTUFMTF9JQ09OLCAic21hbGwtaWNvbiIpOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBMQVJHRV9JQ09OX0xJVEVSQUwgPSBuZXcgRGVzY3JpcHRpb25Hcm91cEl0ZW0oTEFSR0VfSUNPTiwgImxhcmdlLWljb24iKTsvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVzY3JpcHRpb25Hcm91cEl0ZW1bXSBWQUxVRVNfQVJSQVkgPQotICAgIG5ldyBEZXNjcmlwdGlvbkdyb3VwSXRlbVtdCi0gICAgewotICAgICAgREVTQ1JJUFRJT05fTElURVJBTCwKLSAgICAgIERJU1BMQVlfTkFNRV9MSVRFUkFMLAotICAgICAgU01BTExfSUNPTl9MSVRFUkFMLAotICAgICAgTEFSR0VfSUNPTl9MSVRFUkFMCi0gICAgfTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0gIC8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4gCi0JICogIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqICA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgRGVzY3JpcHRpb25Hcm91cEl0ZW0gZ2V0KFN0cmluZyBuYW1lKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0gICAgewotICAgICAgRGVzY3JpcHRpb25Hcm91cEl0ZW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLiAKLQkgKiAgPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiAgPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIERlc2NyaXB0aW9uR3JvdXBJdGVtIGdldChpbnQgdmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKHZhbHVlKQotICAgIHsKLSAgICAgIGNhc2UgREVTQ1JJUFRJT046IHJldHVybiBERVNDUklQVElPTl9MSVRFUkFMOwotICAgICAgY2FzZSBESVNQTEFZX05BTUU6IHJldHVybiBESVNQTEFZX05BTUVfTElURVJBTDsKLSAgICAgIGNhc2UgU01BTExfSUNPTjogcmV0dXJuIFNNQUxMX0lDT05fTElURVJBTDsKLSAgICAgIGNhc2UgTEFSR0VfSUNPTjogcmV0dXJuIExBUkdFX0lDT05fTElURVJBTDsgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7CQotICB9Ci0KLSAgcHJpdmF0ZSBEZXNjcmlwdGlvbkdyb3VwSXRlbShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIodmFsdWUsIG5hbWUpOwotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC91dGlsL1FOYW1lSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3V0aWwvUU5hbWVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlN2M2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3V0aWwvUU5hbWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLQotCi0KLS8qKgotKiBKU1ItMTA5IHYxLjEgY2hhbmdlZCB0aGUgd2F5IHF1YWxpZmllZCBuYW1lcyBhcmUgcmVwcmVzZW50ZWQuIEFzIGEgcmVzdWx0IHRoZSBFTUYgbW9kZWwgY2hhbmdlZCBhcyB3ZWxsLiAKLSogVGhlIG5ldyBtb2RlbCBpcyBjYXBhYmxlIG9mIHJlYWRpbmcvd3JpdGluZyBib3RoIHYxLjAgYW5kIHYxLjEgZGVzY3JpcHRvcnMgYnV0IHRoZSBRTmFtZSBBUElzIHdvcmsgZGlmZmVyZW50bHkKLSogZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBkZXNjcmlwdG9yLiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIHRvIHNldCB2YWx1ZXMgb24gUU5hbWUncyBpbiBvcmRlcgotKiB0byBoaWRlIGFuZCBpc29sYXRlIHRoZSB2ZXJzaW9uIGNoZWNraW5nIGxvZ2ljLgotKi8KLXB1YmxpYyBjbGFzcyBRTmFtZUhlbHBlcgotewotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBERUZBVUxUX1BSRUZJWD0icGZ4IjsvLyROT04tTkxTLTEkCi0KLSAgLyoKLSAgKiBTZXRzIHRoZSBuYW1lc3BhY2VVUkkgYW5kIHRoZSBsb2NhbHBhcnQgb24gdGhlIHN1cHBsaWVkIFFOYW1lIHRvIHRoZSBzdXBwbGllZCB2YWx1ZXMgcmVzcGVjdGl2ZWx5LgotICAqIEBwYXJhbSBxbmFtZUVPYmplY3QgVGhlIHByb3BlcnRpZXMgb24gdGhpcyBRTmFtZSB3aWxsIGJlIHNldC4gSWYgdGhlIFFOYW1lIGRvZXMgbm90IGJlbG9uZyB0byBhIFJlc291cmNlLAotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZlcnNpb24gaXMgYXNzdW1lZCB0byBiZSBKMkVFIDEuNC4KLSAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIFRoZSBuYW1lc3BhY2VVUkkKLSAgKiBAcGFyYW0gbG9jYWxQYXJ0IFRoZSBsb2NhbFBhcnQKLSAgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJucyB0cnVlIGlmIHZhbHVlcyB3ZXJlIHNldCBzdWNjZXNzZnVsbHkuIEZhbHNlIG90aGVyd2lzZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFFOYW1lTmFtZXNwYWNlVVJJKFFOYW1lIHFuYW1lRU9iamVjdCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIFN0cmluZyBsb2NhbHBhcnQgPSBxbmFtZUVPYmplY3QuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgc2V0UU5hbWVWYWx1ZShxbmFtZUVPYmplY3QsIG5hbWVzcGFjZVVSSSwgbG9jYWxwYXJ0KTsgICAgCi0gIH0KLSAgCi0gIC8qCi0gICogU2V0cyB0aGUgbmFtZXNwYWNlVVJJIGFuZCB0aGUgbG9jYWxwYXJ0IG9uIHRoZSBzdXBwbGllZCBRTmFtZSB0byB0aGUgc3VwcGxpZWQgdmFsdWVzIHJlc3BlY3RpdmVseS4KLSAgKiBAcGFyYW0gcW5hbWVFT2JqZWN0IFRoZSBwcm9wZXJ0aWVzIG9uIHRoaXMgUU5hbWUgd2lsbCBiZSBzZXQuIElmIHRoZSBRTmFtZSBkb2VzIG5vdCBiZWxvbmcgdG8gYSBSZXNvdXJjZSwKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2ZXJzaW9uIGlzIGFzc3VtZWQgdG8gYmUgSjJFRSAxLjQuCi0gICogQHBhcmFtIG5hbWVzcGFjZVVSSSBUaGUgbmFtZXNwYWNlVVJJCi0gICogQHBhcmFtIGxvY2FsUGFydCBUaGUgbG9jYWxQYXJ0Ci0gICogQHJldHVybiBib29sZWFuIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZXMgd2VyZSBzZXQgc3VjY2Vzc2Z1bGx5LiBGYWxzZSBvdGhlcndpc2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRRTmFtZVZhbHVlKFFOYW1lIHFuYW1lRU9iamVjdCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsUGFydCkKLSAgewotICAgIHNldFFOYW1lVmFsdWUocW5hbWVFT2JqZWN0LCBuYW1lc3BhY2VVUkksIGxvY2FsUGFydCwgIiIpOyAvLyROT04tTkxTLTEkICAgCi0gIH0KLQotICAvKioKLSAgKiBTZXRzIHRoZSBuYW1lc3BhY2VVUkksIGxvY2FscGFydCwgYW5kIHByZWZpeCBvbiB0aGUgc3VwcGxpZWQgUU5hbWUgdG8gdGhlIHN1cHBsaWVkIHZhbHVlcyByZXNwZWN0aXZlbHkuCi0gICogQHBhcmFtIHFuYW1lRU9iamVjdCBUaGUgcHJvcGVydGllcyBvbiB0aGlzIFFOYW1lIHdpbGwgYmUgc2V0LiBJZiB0aGUgUU5hbWUgZG9lcyBub3QgYmVsb25nIHRvIGEgUmVzb3VyY2UsCi0gICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmVyc2lvbiBpcyBhc3N1bWVkIHRvIGJlIEoyRUUgMS40LgotICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgVGhlIG5hbWVzcGFjZVVSSQotICAqIEBwYXJhbSBsb2NhbFBhcnQgVGhlIGxvY2FsUGFydAotICAqIEBwYXJhbSBwcmVmaXggVGhlIHByZWZpeC4gVXNlZCBpbiBKU1ItMTA5IHYxLjEgb25seS4gVGhpcyBpcyB0aGUgcHJlZml4IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgcHJlZml4IGlzIG51bGwgb3Igb2YgbGVuZ3RoIDAsIHRoZSBleGlzdGluZyBwcmVmaXggaXMgdXNlZC4gSWYgbm8gcHJlZml4IGV4aXN0cywgYW5kIHRoaXMKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgaXMgYSBKU1ItMTA5IHYxLjEgZGVzY3JpcHRvciB0aGUgZGVmYXVsdCBwcmVmaXggZGVmaW5lZCBpbiBERUZBVUxUX1BSRUZJWCBpcyB1c2VkLgotICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm5zIHRydWUgaWYgdmFsdWVzIHdlcmUgc2V0IHN1Y2Nlc3NmdWxseS4gRmFsc2Ugb3RoZXJ3aXNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UU5hbWVWYWx1ZShRTmFtZSBxbmFtZUVPYmplY3QsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbFBhcnQsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBpbnQgdmVyc2lvbklEOwotICAgIAotICAgIC8vR2V0IHRoZSB2ZXJzaW9uSUQgZnJvbSB0aGUgUU5hbWUncyBSZXNvdXJjZSBpZiBhdmFpbGFibGUKLSAgICBKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKXFuYW1lRU9iamVjdC5lUmVzb3VyY2UoKTsKLSAgICBpZiAocmVzID09IG51bGwpCi0gICAgewotICAgICAgLy91c2UgYSBKMkVFIDEuNCB2ZXJzaW9uIElEIGFzIHRoZSBkZWZhdWx0Ci0gICAgICB2ZXJzaW9uSUQgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHZlcnNpb25JRCA9IHJlcy5nZXRKMkVFVmVyc2lvbklEKCk7Ci0gICAgfQotCi0gICAgc2V0UU5hbWVWYWx1ZShxbmFtZUVPYmplY3QsIG5hbWVzcGFjZVVSSSwgbG9jYWxQYXJ0LCBwcmVmaXgsIHZlcnNpb25JRCk7Ci0gICAgCi0gICAgCi0gIH0KLQotICAvKioKLSAgKiBTZXRzIHRoZSBuYW1lc3BhY2VVUkksIGxvY2FscGFydCwgYW5kIHByZWZpeCBvbiB0aGUgc3VwcGxpZWQgUU5hbWUgdG8gdGhlIHN1cHBsaWVkIHZhbHVlcyByZXNwZWN0aXZlbHkuCi0gICogQHBhcmFtIHFuYW1lRU9iamVjdCBUaGUgcHJvcGVydGllcyBvbiB0aGlzIFFOYW1lIHdpbGwgYmUgc2V0LgotICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgVGhlIG5hbWVzcGFjZVVSSQotICAqIEBwYXJhbSBsb2NhbFBhcnQgVGhlIGxvY2FsUGFydAotICAqIEBwYXJhbSBwcmVmaXggVGhlIHByZWZpeC4gVXNlZCBpbiBKU1ItMTA5IHYxLjEgb25seS4gVGhpcyBpcyB0aGUgcHJlZml4IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgcHJlZml4IGlzIG51bGwgb3Igb2YgbGVuZ3RoIDAsIHRoZSBleGlzdGluZyBwcmVmaXggaXMgdXNlZC4gSWYgbm8gcHJlZml4IGV4aXN0cywgYW5kIHRoaXMKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgaXMgYSBKU1ItMTA5IHYxLjEgZGVzY3JpcHRvciB0aGUgZGVmYXVsdCBwcmVmaXggZGVmaW5lZCBERUZBVUxUX1BSRUZJWCBpcyB1c2VkLgotICAqQHBhcmFtIHZlcnNpb25JRCBUaGUgSjJFRSB2ZXJzaW9uLiBTaG91bGQgYmUgc2V0IHRvIG9uZSBvZiB0aGUgdmVyc2lvbiBJRHMgZGVmaW5lZCBpbiBKMkVFVmVyc2lvbkNvbnN0YW50cy4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJucyB0cnVlIGlmIHZhbHVlcyB3ZXJlIHNldCBzdWNjZXNzZnVsbHkuIEZhbHNlIG90aGVyd2lzZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFFOYW1lVmFsdWUoUU5hbWUgcW5hbWVFT2JqZWN0LCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxQYXJ0LCBTdHJpbmcgcHJlZml4LCBpbnQgdmVyc2lvbklEKQotICB7ICAgICAgCi0KLSAgICBpZiAodmVyc2lvbklEPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkKLSAgICB7Ci0gICAgICAvL2lnbm9yZSB0aGUgcHJlZml4IGFuZCBzZXQgdGhpbmdzIHRoZSBvbGQgd2F5Ci0gICAgICBxbmFtZUVPYmplY3Quc2V0TmFtZXNwYWNlVVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICBxbmFtZUVPYmplY3Quc2V0TG9jYWxQYXJ0KGxvY2FsUGFydCk7ICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9yZXNvdXJjZSBpcyBKMkVFIDEuNAotICAgICAgaWYgKHByZWZpeD09bnVsbCB8fCBwcmVmaXgubGVuZ3RoKCk9PTApCi0gICAgICB7Ci0gICAgICAgIC8vdXNlIHRoZSBleGlzdGluZyBwcmVmaXgKLSAgICAgICAgcHJlZml4ID0gcW5hbWVFT2JqZWN0LmdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotICAgICAgICBpZiAocHJlZml4PT1udWxsIHx8IHByZWZpeC5sZW5ndGgoKT09MCkKLSAgICAgICAgewotICAgICAgICAgIC8vdXNlIHRoZSBkZWZhdWx0IHByZWZpeAotICAgICAgICAgIHByZWZpeCA9IG5ldyBTdHJpbmcoREVGQVVMVF9QUkVGSVgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBxbmFtZUVPYmplY3Quc2V0VmFsdWVzKHByZWZpeCwgbmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQpOwotICAgIAotICAgIH0KLSAgICAKLSAgfQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC93c2RkL1dzZGRSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvd3NkZC9Xc2RkUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWIxYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC93c2RkL1dzZGRSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLldlYlNlcnZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgV3NkZFJlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkKLXsKLQkKLQkgIC8qKgotCSAgKiBXc2RkUmVzb3VyY2VGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICAqLwotCSAgcHVibGljIFdzZGRSZXNvdXJjZUZhY3RvcnkoKSAKLQkgIHsKLQkJICBzdXBlcihSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQkgIH0KLQkKLSAgLyoqCi0gICogV3NkZFJlc291cmNlRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotICAqLwotICBwdWJsaWMgV3NkZFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgCi0gIHsKLQkgIHN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOwotICB9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlcikKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IFdzZGRSZXNvdXJjZUltcGwodXJpLCBhUmVuZGVyZXIpOwotCX0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgbXlzZWxmIHdpdGggdGhlIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLSAgCUoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfRERfU0hPUlRfTkFNRSwgbmV3IFdzZGRSZXNvdXJjZUZhY3RvcnkoYVJlbmRlcmVyRmFjdG9yeSkpOwotICAJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9URU1QX0REX1NIT1JUX05BTUUsIG5ldyBXc2RkUmVzb3VyY2VGYWN0b3J5KGFSZW5kZXJlckZhY3RvcnkpKTsKLSAgfQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9ERF9TSE9SVF9OQU1FLCBuZXcgV3NkZFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0JCWFSZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfVEVNUF9ERF9TSE9SVF9OQU1FLCBuZXcgV3NkZFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0gIH0KLQkKLSAgLyoqCi0gICAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0gICAqIEBzZWUgI3JlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0gIAlyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHJlZ2lzdGVyRHRkcy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHRkcygpIAotICB7Ci0gICAgLy9odHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMvZHRkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMC5kdGQKLSAgCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU1lTVEVNSUQsICJqMmVlX3dlYl9zZXJ2aWNlc18xXzAuZHRkIik7Ly8kTk9OLU5MUy0xJAotCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX0xPQ18xXzEsICJqMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIik7IC8vJE5PTi1OTFMtMSQKLSAgICBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1NDSEVNQV9MT0NfU1VOXzFfMSwgImoyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiKTsgLy8kTk9OLU5MUy0xJAkKLSAgICBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1NDSEVNQV9MT0NfMV8yLCAiamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkIik7IC8vJE5PTi1OTFMtMSQKLSAgICBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1NDSEVNQV9MT0NfU1VOXzFfMiwgImphdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCIpOyAvLyROT04tTkxTLTEkCQotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L0NvbXBvbmVudFNjb3BlZFJlZnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvQ29tcG9uZW50U2NvcGVkUmVmcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdjMTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvQ29tcG9uZW50U2NvcGVkUmVmcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBvbmVudCBTY29wZWQgUmVmczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmcyNnZXRDb21wb25lbnROYW1lIDxlbT5Db21wb25lbnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldENvbXBvbmVudFNjb3BlZFJlZnMoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50U2NvcGVkUmVmcyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21wb25lbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tcG9uZW50IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbXBvbmVudE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnROYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmcyNnZXRDb21wb25lbnROYW1lIDxlbT5Db21wb25lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbXBvbmVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICB2b2lkIHNldENvbXBvbmVudE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRDb21wb25lbnRTY29wZWRSZWZzX1NlcnZpY2VSZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVMaXN0IGdldFNlcnZpY2VSZWZzKCk7Ci0KLX0gLy8gQ29tcG9uZW50U2NvcGVkUmVmcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJhOWM1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGFuZGxlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotICogICAgIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZgotICogICAgIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQKLSAqICAgICB3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KLSAqIAotICogICAgIFVzZWQgaW46IHNlcnZpY2UtcmVmCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldEhhbmRsZXJOYW1lIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRTb2FwUm9sZXMgPGVtPlNvYXAgUm9sZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRQb3J0TmFtZXMgPGVtPlBvcnQgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRIYW5kbGVyQ2xhc3MgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldFNvYXBIZWFkZXJzIDxlbT5Tb2FwIEhlYWRlcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldEhhbmRsZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSGFuZGxlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhbmRsZXIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIG1vZHVsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIYW5kbGVyTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEhhbmRsZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIYW5kbGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFuZGxlck5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgSGVhZGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEhlYWRlcnM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEhlYWRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0U29hcEhlYWRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgUm9sZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgUm9sZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdCB0aGUgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIFJvbGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTb2FwUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcnQgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQgTmFtZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9ydC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgV1NETCBwb3J0LW5hbWUgdGhhdCBhIGhhbmRsZXIgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldEhhbmRsZXJfUG9ydE5hbWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UG9ydE5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYW5kbGVyIENsYXNzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEhhbmRsZXJDbGFzcyhKYXZhQ2xhc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0SGFuZGxlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0SGFuZGxlckNsYXNzIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhhbmRsZXJDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbml0UGFyYW1zKCk7Ci0KLX0gLy8gSGFuZGxlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9Qb3J0Q29tcG9uZW50UmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1BvcnRDb21wb25lbnRSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JiM2ExOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1BvcnRDb21wb25lbnRSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLSAqICAgICBvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotICogICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLSAqICAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0gKiAgICAgYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZiNnZXRQb3J0Q29tcG9uZW50TGluayA8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRSZWYoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9ydENvbXBvbmVudFJlZiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwb3J0LWNvbXBvbmVudC1saW5rIGVsZW1lbnQgbGlua3MgYSBwb3J0LWNvbXBvbmVudC1yZWYgdG8gYQotCSAqICAgICAgICAgc3BlY2lmaWMgcG9ydC1jb21wb25lbnQgcmVxdWlyZWQgdG8gYmUgbWFkZSBhdmFpbGFibGUgYnkgYSBzZXJ2aWNlCi0JICogICAgICAgICByZWZlcmVuY2UuCi0JICogCi0JICogICAgICAgICBUaGUgdmFsdWUgb2YgYSBwb3J0LWNvbXBvbmVudC1saW5rIG11c3QgYmUgdGhlIHBvcnQtY29tcG9uZW50LW5hbWUKLQkgKiAgICAgICAgIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlIG9yIGFub3RoZXIgbW9kdWxlIGluIHRoZSBzYW1lCi0JICogICAgICAgICBhcHBsaWNhdGlvbiB1bml0LiBUaGUgc3ludGF4IGZvciBzcGVjaWZpY2F0aW9uIGZvbGxvd3MgdGhlIHN5bnRheAotCSAqICAgICAgICAgZGVmaW5lZCBmb3IgZWpiLWxpbmsgaW4gdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9ydENvbXBvbmVudExpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3J0Q29tcG9uZW50TGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmI2dldFBvcnRDb21wb25lbnRMaW5rIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9ydENvbXBvbmVudExpbmsoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkCi0JICogICAgICAgICBKYXZhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2Ugb2YgYQotCSAqICAgICAgICAgV1NETCBwb3J0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKEphdmFDbGFzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZiNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSmF2YUNsYXNzIHZhbHVlKTsKLQotfSAvLyBQb3J0Q29tcG9uZW50UmVmCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1NlcnZpY2VSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvU2VydmljZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjk4MTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvU2VydmljZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgc2VydmljZS1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIHJlZmVyZW5jZSB0byBhIFdlYgotICogICAgIHNlcnZpY2UuIEl0IGNvbnRhaW5zIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBkaXNwbGF5IG5hbWUgYW5kCi0gKiAgICAgaWNvbnMsIGEgZGVjbGFyYXRpb24gb2YgdGhlIHJlcXVpcmVkIFNlcnZpY2UgaW50ZXJmYWNlLAotICogICAgIGFuIG9wdGlvbmFsIFdTREwgZG9jdW1lbnQgbG9jYXRpb24sIGFuIG9wdGlvbmFsIHNldAotICogICAgIG9mIEpBWC1SUEMgbWFwcGluZ3MsIGFuIG9wdGlvbmFsIFFOYW1lIGZvciB0aGUgc2VydmljZSBlbGVtZW50LAotICogICAgIGFuIG9wdGlvbmFsIHNldCBvZiBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMgdG8gYmUgcmVzb2x2ZWQKLSAqICAgICBieSB0aGUgY29udGFpbmVyIHRvIGEgV1NETCBwb3J0LCBhbmQgYW4gb3B0aW9uYWwgc2V0IG9mIGhhbmRsZXJzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRTZXJ2aWNlSW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFNlcnZpY2VSZWZOYW1lIDxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0V3NkbEZpbGUgPGVtPldzZGwgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldEpheHJwY01hcHBpbmdGaWxlIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0UG9ydENvbXBvbmVudFJlZnMgPGVtPlBvcnQgQ29tcG9uZW50IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRIYW5kbGVycyA8ZW0+SGFuZGxlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRTZXJ2aWNlUW5hbWUgPGVtPlNlcnZpY2UgUW5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFNlcnZpY2VSZWYoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZVJlZiBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzZXJ2aWNlLXJlZi1uYW1lIGVsZW1lbnQgZGVjbGFyZXMgbG9naWNhbCBuYW1lIHRoYXQgdGhlCi0JICogICAgICAgICBjb21wb25lbnRzIGluIHRoZSBtb2R1bGUgdXNlIHRvIGxvb2sgdXAgdGhlIFdlYiBzZXJ2aWNlLiBJdAotCSAqICAgICAgICAgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc2VydmljZSByZWZlcmVuY2UgbmFtZXMgc3RhcnQgd2l0aAotCSAqICAgICAgICAgInNlcnZpY2UvIi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VydmljZVJlZk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXJ2aWNlUmVmTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFNlcnZpY2VSZWZOYW1lIDxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VydmljZVJlZk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBGaWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIFVSSSBsb2NhdGlvbiBvZiBhIFdTREwgZmlsZS4gVGhlCi0JICogICAgICAgICBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdzZGxGaWxlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFNlcnZpY2VSZWZfV3NkbEZpbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0V3NkbEZpbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXc2RsRmlsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmF4cnBjIE1hcHBpbmcgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci0JICogICAgICAgICBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5Ci0JICogICAgICAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLQkgKiAgICAgICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUgZmlsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SmF4cnBjTWFwcGluZ0ZpbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRKYXhycGNNYXBwaW5nRmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldEpheHJwY01hcHBpbmdGaWxlIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SmF4cnBjTWFwcGluZ0ZpbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgSW50ZXJmYWNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VydmljZS1pbnRlcmZhY2UgZWxlbWVudCBkZWNsYXJlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0JICogICAgICAgICBuYW1lIG9mIHRoZSBKQVgtUlBDIFNlcnZpY2UgaW50ZXJmYWNlIHRoZSBjbGllbnQgZGVwZW5kcyBvbi4KLQkgKiAgICAgICAgIEluIG1vc3QgY2FzZXMgdGhlIHZhbHVlIHdpbGwgYmUgamF2YXgueG1sLnJwYy5TZXJ2aWNlLiAgQSBKQVgtUlBDCi0JICogICAgICAgICBnZW5lcmF0ZWQgU2VydmljZSBJbnRlcmZhY2UgY2xhc3MgbWF5IGFsc28gYmUgc3BlY2lmaWVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U2VydmljZUludGVyZmFjZShKYXZhQ2xhc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YUNsYXNzIGdldFNlcnZpY2VJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRTZXJ2aWNlSW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VJbnRlcmZhY2UoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0JICogICAgICAgICBvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotCSAqICAgICAgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotCSAqICAgICAgICAgSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFBvcnRDb21wb25lbnRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYW5kbGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICBEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLQkgKiAgICAgICAgIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZgotCSAqICAgICAgICAgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotCSAqICAgICAgICAgd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0U2VydmljZVJlZl9IYW5kbGVycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEhhbmRsZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFFuYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFFuYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUW5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VRbmFtZShRTmFtZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlRTmFtZSBnZXRTZXJ2aWNlUW5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRTZXJ2aWNlUW5hbWUgPGVtPlNlcnZpY2UgUW5hbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUW5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VRbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VydmljZVFuYW1lKFFOYW1lIHZhbHVlKTsKLQotfSAvLyBTZXJ2aWNlUmVmCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYlNlcnZpY2VzQ2xpZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYlNlcnZpY2VzQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YTgzMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJTZXJ2aWNlc0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50I2dldENvbXBvbmVudFNjb3BlZFJlZnMgPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRXZWJTZXJ2aWNlc0NsaWVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlc0NsaWVudCBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0V2ViU2VydmljZXNDbGllbnRfQ29tcG9uZW50U2NvcGVkUmVmcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmcyIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVMaXN0IGdldENvbXBvbmVudFNjb3BlZFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRXZWJTZXJ2aWNlc0NsaWVudF9TZXJ2aWNlUmVmcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVMaXN0IGdldFNlcnZpY2VSZWZzKCk7Ci0KLX0gLy8gV2ViU2VydmljZXNDbGllbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvV2ViU2VydmljZXNSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJTZXJ2aWNlc1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDM0MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJTZXJ2aWNlc1Jlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDYsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotCi0vKioKLSAqQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VzUmVzb3VyY2UgZXh0ZW5kcyBYTUxSZXNvdXJjZXsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHJlZmVyZW5jZSB0byB0aGUgbW9kZWwgb2JqZWN0IFdlYlNlcnZpY2VzQ2xpZW50Ci0JICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIG1vZGVsIG9iamVjdCBXZWJTZXJ2aWNlc0NsaWVudAotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlc0NsaWVudCBnZXRXZWJTZXJ2aWNlc0NsaWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMDA0NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmljZSBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZpY2VSZWYgY3JlYXRlU2VydmljZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9ydENvbXBvbmVudFJlZiBjcmVhdGVQb3J0Q29tcG9uZW50UmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhhbmRsZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhhbmRsZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhhbmRsZXIgY3JlYXRlSGFuZGxlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWIgU2VydmljZXMgQ2xpZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWIgU2VydmljZXMgQ2xpZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBXZWJTZXJ2aWNlc0NsaWVudCBjcmVhdGVXZWJTZXJ2aWNlc0NsaWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgQ29tcG9uZW50U2NvcGVkUmVmcyBjcmVhdGVDb21wb25lbnRTY29wZWRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIG1ldGhvZCBpcyBOT1QgYXBpLCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuICAKLQkgKiBFTUYgcGFja2FnZSBjbGFzc2VzIHNob3VsZCBiZSBhY2Nlc3MgdmlhIHRoZWlyICJlSU5TVEFOQ0UiIHN0YXRpYyBmaWVsZHMKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBnZXRXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UoKTsKLQotfSAvL1dlYnNlcnZpY2VfY2xpZW50RmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNTE2Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIC8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCQotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gIndzY2xpZW50IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gIndlYnNlcnZpY2VfY2xpZW50LnhtaSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwgPGVtPlNlcnZpY2UgUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBJbnRlcmZhY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19XU0RMX0ZJTEUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmF4cnBjIE1hcHBpbmcgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fSEFORExFUlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBRbmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbCA8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCNnZXRQb3J0Q29tcG9uZW50UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBPUlRfQ09NUE9ORU5UX1JFRiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9SRUZfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwgPGVtPkhhbmRsZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsI2dldEhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSEFORExFUiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fSEFORExFUl9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgUm9sZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfX1NPQVBfUk9MRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fUE9SVF9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fSEFORExFUl9DTEFTUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fSU5JVF9QQVJBTVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19TT0FQX0hFQURFUlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SGFuZGxlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50SW1wbCA8ZW0+V2ViIFNlcnZpY2VzIENsaWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0NsaWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsI2dldFdlYlNlcnZpY2VzQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IFdFQl9TRVJWSUNFU19DTElFTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBTY29wZWQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBXRUJfU0VSVklDRVNfQ0xJRU5UX19TRVJWSUNFX1JFRlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XZWIgU2VydmljZXMgQ2xpZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFdFQl9TRVJWSUNFU19DTElFTlRfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwgPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRTY29wZWRSZWZzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwjZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBDT01QT05FTlRfU0NPUEVEX1JFRlMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19DT01QT05FTlRfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19TRVJWSUNFX1JFRlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgQ09NUE9ORU5UX1NDT1BFRF9SRUZTX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIDxlbT5TZXJ2aWNlIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VydmljZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0U2VydmljZVJlZk5hbWUgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFNlcnZpY2VSZWZOYW1lKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFdzZGxGaWxlKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRKYXhycGNNYXBwaW5nRmlsZSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFNlcnZpY2VJbnRlcmZhY2UgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0U2VydmljZUludGVyZmFjZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFBvcnRDb21wb25lbnRSZWZzIDxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFBvcnRDb21wb25lbnRSZWZzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SGFuZGxlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0SGFuZGxlcnMoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFNlcnZpY2VRbmFtZSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlNlcnZpY2UgUW5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0U2VydmljZVFuYW1lKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmIDxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQb3J0Q29tcG9uZW50UmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZiNnZXRQb3J0Q29tcG9uZW50TGluayA8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWYjZ2V0UG9ydENvbXBvbmVudExpbmsoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZiNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIgPGVtPkhhbmRsZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SGFuZGxlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SGFuZGxlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhbmRsZXIgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRIYW5kbGVyTmFtZSgpCi0JICogQHNlZSAjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRTb2FwSGVhZGVycyA8ZW0+U29hcCBIZWFkZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Tb2FwIEhlYWRlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0U29hcEhlYWRlcnMoKQotCSAqIEBzZWUgI2dldEhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEhhbmRsZXJfU29hcEhlYWRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0U29hcFJvbGVzIDxlbT5Tb2FwIFJvbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Tb2FwIFJvbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldFNvYXBSb2xlcygpCi0JICogQHNlZSAjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0UG9ydE5hbWVzIDxlbT5Qb3J0IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Qb3J0IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldFBvcnROYW1lcygpCi0JICogQHNlZSAjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SGFuZGxlcl9Qb3J0TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyI2dldEhhbmRsZXJDbGFzcyA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0SGFuZGxlckNsYXNzKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0SW5pdFBhcmFtcygpCi0JICogQHNlZSAjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50IDxlbT5XZWIgU2VydmljZXMgQ2xpZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRXZWJTZXJ2aWNlc0NsaWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQjZ2V0Q29tcG9uZW50U2NvcGVkUmVmcyA8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50I2dldENvbXBvbmVudFNjb3BlZFJlZnMoKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VzQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50I2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlc0NsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZXNDbGllbnRfU2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmcyA8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnMjZ2V0Q29tcG9uZW50TmFtZSA8ZW0+Q29tcG9uZW50IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21wb25lbnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmcyNnZXRDb21wb25lbnROYW1lKCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRTY29wZWRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnMjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzI2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRTY29wZWRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXRDb21wb25lbnRTY29wZWRSZWZzX1NlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkgZ2V0V2Vic2VydmljZV9jbGllbnRGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwgPGVtPlNlcnZpY2UgUmVmPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwjZ2V0U2VydmljZVJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVJWSUNFX1JFRiA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEludGVyZmFjZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9fV1NETF9GSUxFID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpheHJwYyBNYXBwaW5nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9SRUZfX0hBTkRMRVJTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUW5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsIDxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudFJlZkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCNnZXRQb3J0Q29tcG9uZW50UmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBPUlRfQ09NUE9ORU5UX1JFRiA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsIDxlbT5IYW5kbGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwjZ2V0SGFuZGxlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBIQU5ETEVSID0gZUlOU1RBTkNFLmdldEhhbmRsZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEhBTkRMRVJfX0hBTkRMRVJfTkFNRSA9IGVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIFJvbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBIQU5ETEVSX19TT0FQX1JPTEVTID0gZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcFJvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBIQU5ETEVSX19QT1JUX05BTUVTID0gZUlOU1RBTkNFLmdldEhhbmRsZXJfUG9ydE5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSEFORExFUl9fSEFORExFUl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEhBTkRMRVJfX0lOSVRfUEFSQU1TID0gZUlOU1RBTkNFLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBIQU5ETEVSX19TT0FQX0hFQURFUlMgPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50SW1wbCA8ZW0+V2ViIFNlcnZpY2VzIENsaWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0NsaWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCNnZXRXZWJTZXJ2aWNlc0NsaWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXRUJfU0VSVklDRVNfQ0xJRU5UID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9TRVJWSUNFU19DTElFTlRfX0NPTVBPTkVOVF9TQ09QRURfUkVGUyA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc0NsaWVudF9TZXJ2aWNlUmVmcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFNjb3BlZFJlZnNJbXBsIDxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCNnZXRDb21wb25lbnRTY29wZWRSZWZzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTVBPTkVOVF9TQ09QRURfUkVGUyA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRTY29wZWRSZWZzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTVBPTkVOVF9TQ09QRURfUkVGU19fQ09NUE9ORU5UX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTVBPTkVOVF9TQ09QRURfUkVGU19fU0VSVklDRV9SRUZTID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFNjb3BlZFJlZnNfU2VydmljZVJlZnMoKTsKLQotCX0KLQotfSAvL1dlYnNlcnZpY2VfY2xpZW50UGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudFNjb3BlZFJlZnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2MzMwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBvbmVudCBTY29wZWQgUmVmczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFNjb3BlZFJlZnNJbXBsI2dldENvbXBvbmVudE5hbWUgPGVtPkNvbXBvbmVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudFNjb3BlZFJlZnNJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgQ29tcG9uZW50U2NvcGVkUmVmcyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBvbmVudE5hbWUoKSA8ZW0+Q29tcG9uZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBvbmVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBvbmVudE5hbWUoKSA8ZW0+Q29tcG9uZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBvbmVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcG9uZW50TmFtZSA9IENPTVBPTkVOVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZnMoKSA8ZW0+U2VydmljZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUxpc3Qgc2VydmljZVJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIENvbXBvbmVudFNjb3BlZFJlZnNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkxpdGVyYWxzLkNPTVBPTkVOVF9TQ09QRURfUkVGUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKSB7Ci0JCXJldHVybiBjb21wb25lbnROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudE5hbWUoU3RyaW5nIG5ld0NvbXBvbmVudE5hbWUpIHsKLQkJU3RyaW5nIG9sZENvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwotCQljb21wb25lbnROYW1lID0gbmV3Q29tcG9uZW50TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fQ09NUE9ORU5UX05BTUUsIG9sZENvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUxpc3QgZ2V0U2VydmljZVJlZnMoKSB7Ci0JCWlmIChzZXJ2aWNlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19TRVJWSUNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiBzZXJ2aWNlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZpY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19DT01QT05FTlRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fQ09NUE9ORU5UX05BTUU6Ci0JCQkJc2V0Q29tcG9uZW50TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FOgotCQkJCXNldENvbXBvbmVudE5hbWUoQ09NUE9ORU5UX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fQ09NUE9ORU5UX05BTUU6Ci0JCQkJcmV0dXJuIENPTVBPTkVOVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBjb21wb25lbnROYW1lICE9IG51bGwgOiAhQ09NUE9ORU5UX05BTUVfRURFRkFVTFQuZXF1YWxzKGNvbXBvbmVudE5hbWUpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlcnZpY2VSZWZzICE9IG51bGwgJiYgIXNlcnZpY2VSZWZzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbXBvbmVudE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbXBvbmVudE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db21wb25lbnRTY29wZWRSZWZzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUzOWY1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IYW5kbGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsI2dldFNvYXBSb2xlcyA8ZW0+U29hcCBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsI2dldFBvcnROYW1lcyA8ZW0+UG9ydCBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsI2dldEhhbmRsZXJDbGFzcyA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0U29hcEhlYWRlcnMgPGVtPlNvYXAgSGVhZGVyczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgSGFuZGxlciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJOYW1lKCkgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyTmFtZSgpIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGhhbmRsZXJOYW1lID0gSEFORExFUl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcFJvbGVzKCkgPGVtPlNvYXAgUm9sZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U29hcFJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc29hcFJvbGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lcygpIDxlbT5Qb3J0IE5hbWVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnROYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvcnROYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyQ2xhc3MoKSA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGhhbmRsZXJDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0UGFyYW1zKCkgPGVtPkluaXQgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbml0UGFyYW1zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBIZWFkZXJzKCkgPGVtPlNvYXAgSGVhZGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb2FwSGVhZGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNvYXBIZWFkZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIYW5kbGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5MaXRlcmFscy5IQU5ETEVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlck5hbWUoKSB7Ci0JCXJldHVybiBoYW5kbGVyTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYW5kbGVyTmFtZShTdHJpbmcgbmV3SGFuZGxlck5hbWUpIHsKLQkJU3RyaW5nIG9sZEhhbmRsZXJOYW1lID0gaGFuZGxlck5hbWU7Ci0JCWhhbmRsZXJOYW1lID0gbmV3SGFuZGxlck5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUUsIG9sZEhhbmRsZXJOYW1lLCBoYW5kbGVyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTb2FwSGVhZGVycygpIHsKLQkJaWYgKHNvYXBIZWFkZXJzID09IG51bGwpIHsKLQkJCXNvYXBIZWFkZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFFOYW1lLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTKTsKLQkJfQotCQlyZXR1cm4gc29hcEhlYWRlcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNvYXBIZWFkZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXJldHVybiBnZXRIYW5kbGVyTmFtZSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0U29hcFJvbGVzKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19QT1JUX05BTUVTOgotCQkJCXJldHVybiBnZXRQb3J0TmFtZXMoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRIYW5kbGVyQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRIYW5kbGVyQ2xhc3MoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRJbml0UGFyYW1zKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJcmV0dXJuIGdldFNvYXBIZWFkZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlzZXRIYW5kbGVyTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX1JPTEVTOgotCQkJCWdldFNvYXBSb2xlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U29hcFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19QT1JUX05BTUVTOgotCQkJCWdldFBvcnROYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9ydE5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX0NMQVNTOgotCQkJCXNldEhhbmRsZXJDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJZ2V0U29hcEhlYWRlcnMoKS5jbGVhcigpOwotCQkJCWdldFNvYXBIZWFkZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXNldEhhbmRsZXJOYW1lKEhBTkRMRVJfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlnZXRTb2FwUm9sZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1BPUlRfTkFNRVM6Ci0JCQkJZ2V0UG9ydE5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX0NMQVNTOgotCQkJCXNldEhhbmRsZXJDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCWdldEluaXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUzoKLQkJCQlnZXRTb2FwSGVhZGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUU6Ci0JCQkJcmV0dXJuIEhBTkRMRVJfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gaGFuZGxlck5hbWUgIT0gbnVsbCA6ICFIQU5ETEVSX05BTUVfRURFRkFVTFQuZXF1YWxzKGhhbmRsZXJOYW1lKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJcmV0dXJuIHNvYXBSb2xlcyAhPSBudWxsICYmICFzb2FwUm9sZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fUE9SVF9OQU1FUzoKLQkJCQlyZXR1cm4gcG9ydE5hbWVzICE9IG51bGwgJiYgIXBvcnROYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX0NMQVNTOgotCQkJCXJldHVybiBoYW5kbGVyQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBpbml0UGFyYW1zICE9IG51bGwgJiYgIWluaXRQYXJhbXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCXJldHVybiBzb2FwSGVhZGVycyAhPSBudWxsICYmICFzb2FwSGVhZGVycy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTb2FwUm9sZXMoKSB7Ci0JCWlmIChzb2FwUm9sZXMgPT0gbnVsbCkgewotCQkJc29hcFJvbGVzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBzb2FwUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFBvcnROYW1lcygpIHsKLQkJaWYgKHBvcnROYW1lcyA9PSBudWxsKSB7Ci0JCQlwb3J0TmFtZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fUE9SVF9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIHBvcnROYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEhhbmRsZXJDbGFzcygpIHsKLQkJaWYgKGhhbmRsZXJDbGFzcyAhPSBudWxsICYmIGhhbmRsZXJDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkSGFuZGxlckNsYXNzID0gKEludGVybmFsRU9iamVjdCloYW5kbGVyQ2xhc3M7Ci0JCQloYW5kbGVyQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkSGFuZGxlckNsYXNzKTsKLQkJCWlmIChoYW5kbGVyQ2xhc3MgIT0gb2xkSGFuZGxlckNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1MsIG9sZEhhbmRsZXJDbGFzcywgaGFuZGxlckNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0SGFuZGxlckNsYXNzKCkgewotCQlyZXR1cm4gaGFuZGxlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhbmRsZXJDbGFzcyhKYXZhQ2xhc3MgbmV3SGFuZGxlckNsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRIYW5kbGVyQ2xhc3MgPSBoYW5kbGVyQ2xhc3M7Ci0JCWhhbmRsZXJDbGFzcyA9IG5ld0hhbmRsZXJDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1MsIG9sZEhhbmRsZXJDbGFzcywgaGFuZGxlckNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluaXRQYXJhbXMoKSB7Ci0JCWlmIChpbml0UGFyYW1zID09IG51bGwpIHsKLQkJCWluaXRQYXJhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGFyYW1WYWx1ZS5jbGFzcywgdGhpcywgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaGFuZGxlck5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGhhbmRsZXJOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwUm9sZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNvYXBSb2xlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9ydE5hbWVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwb3J0TmFtZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9IYW5kbGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudFJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiOTM4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudFJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5UeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbCNnZXRQb3J0Q29tcG9uZW50TGluayA8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0Q29tcG9uZW50UmVmSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBvcnRDb21wb25lbnRSZWYgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0Q29tcG9uZW50TGluaygpIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0Q29tcG9uZW50TGluaygpIDxlbT5Qb3J0IENvbXBvbmVudCBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwb3J0Q29tcG9uZW50TGluayA9IFBPUlRfQ09NUE9ORU5UX0xJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvcnRDb21wb25lbnRSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkxpdGVyYWxzLlBPUlRfQ09NUE9ORU5UX1JFRjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnRDb21wb25lbnRMaW5rKCkgewotCQlyZXR1cm4gcG9ydENvbXBvbmVudExpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9ydENvbXBvbmVudExpbmsoU3RyaW5nIG5ld1BvcnRDb21wb25lbnRMaW5rKSB7Ci0JCVN0cmluZyBvbGRQb3J0Q29tcG9uZW50TGluayA9IHBvcnRDb21wb25lbnRMaW5rOwotCQlwb3J0Q29tcG9uZW50TGluayA9IG5ld1BvcnRDb21wb25lbnRMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LLCBvbGRQb3J0Q29tcG9uZW50TGluaywgcG9ydENvbXBvbmVudExpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZUdlbigpIHsKLQkJaWYgKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSAhPSBudWxsICYmIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gKEludGVybmFsRU9iamVjdClzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JCQlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJCWlmIChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgIT0gb2xkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQl9Ci0JCi0JcHVibGljIEphdmFDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCXNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZUdlbigpOwotCQlpZiAoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlIT1udWxsKSB7Ci0JCQkvLyBWZXJpZnkgdGhlIGludGVyZmFjZSB0eXBlIGlzIHNldCBjb3JyZWN0bHkgb24gdGhlIFNFSQotCQkJVHlwZUtpbmQgdHlwZUtpbmQgPSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuZ2V0S2luZCgpOwotCQkJaWYgKHR5cGVLaW5kID09IG51bGwgfHwgIXR5cGVLaW5kLmVxdWFscyhUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCkpCi0JCQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlLnNldEtpbmQoVHlwZUtpbmQuSU5URVJGQUNFX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSmF2YUNsYXNzIG5ld1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgewotCQlKYXZhQ2xhc3Mgb2xkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCQlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBuZXdTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFLCBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UsIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSzoKLQkJCQlyZXR1cm4gZ2V0UG9ydENvbXBvbmVudExpbmsoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LOgotCQkJCXNldFBvcnRDb21wb25lbnRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTks6Ci0JCQkJc2V0UG9ydENvbXBvbmVudExpbmsoUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSzoKLQkJCQlyZXR1cm4gUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVCA9PSBudWxsID8gcG9ydENvbXBvbmVudExpbmsgIT0gbnVsbCA6ICFQT1JUX0NPTVBPTkVOVF9MSU5LX0VERUZBVUxULmVxdWFscyhwb3J0Q29tcG9uZW50TGluayk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotCQkJCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBvcnRDb21wb25lbnRMaW5rOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHBvcnRDb21wb25lbnRMaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9ydENvbXBvbmVudFJlZkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODM1MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldFNlcnZpY2VJbnRlcmZhY2UgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0U2VydmljZVJlZk5hbWUgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRQb3J0Q29tcG9uZW50UmVmcyA8ZW0+UG9ydCBDb21wb25lbnQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldFNlcnZpY2VRbmFtZSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VSZWZJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgU2VydmljZVJlZiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUludGVyZmFjZSgpIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBzZXJ2aWNlSW50ZXJmYWNlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmTmFtZSgpIDxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9SRUZfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmTmFtZSgpIDxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlUmVmTmFtZSA9IFNFUlZJQ0VfUkVGX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbEZpbGUoKSA8ZW0+V3NkbCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GSUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxGaWxlKCkgPGVtPldzZGwgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbEZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd3NkbEZpbGUgPSBXU0RMX0ZJTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFJQQ19NQVBQSU5HX0ZJTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgamF4cnBjTWFwcGluZ0ZpbGUgPSBKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydENvbXBvbmVudFJlZnMoKSA8ZW0+UG9ydCBDb21wb25lbnQgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvcnRDb21wb25lbnRSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJzKCkgPGVtPkhhbmRsZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaGFuZGxlcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVFuYW1lKCkgPGVtPlNlcnZpY2UgUW5hbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VRbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFFOYW1lIHNlcnZpY2VRbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZVJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlUmVmTmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWZOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VSZWZOYW1lKFN0cmluZyBuZXdTZXJ2aWNlUmVmTmFtZSkgewotCQlTdHJpbmcgb2xkU2VydmljZVJlZk5hbWUgPSBzZXJ2aWNlUmVmTmFtZTsKLQkJc2VydmljZVJlZk5hbWUgPSBuZXdTZXJ2aWNlUmVmTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FLCBvbGRTZXJ2aWNlUmVmTmFtZSwgc2VydmljZVJlZk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxGaWxlKCkgewotCQlyZXR1cm4gd3NkbEZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V3NkbEZpbGUoU3RyaW5nIG5ld1dzZGxGaWxlKSB7Ci0JCVN0cmluZyBvbGRXc2RsRmlsZSA9IHdzZGxGaWxlOwotCQl3c2RsRmlsZSA9IG5ld1dzZGxGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1dTRExfRklMRSwgb2xkV3NkbEZpbGUsIHdzZGxGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXhycGNNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIGpheHJwY01hcHBpbmdGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpheHJwY01hcHBpbmdGaWxlKFN0cmluZyBuZXdKYXhycGNNYXBwaW5nRmlsZSkgewotCQlTdHJpbmcgb2xkSmF4cnBjTWFwcGluZ0ZpbGUgPSBqYXhycGNNYXBwaW5nRmlsZTsKLQkJamF4cnBjTWFwcGluZ0ZpbGUgPSBuZXdKYXhycGNNYXBwaW5nRmlsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFLCBvbGRKYXhycGNNYXBwaW5nRmlsZSwgamF4cnBjTWFwcGluZ0ZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFNlcnZpY2VJbnRlcmZhY2UoKSB7Ci0JCWlmIChzZXJ2aWNlSW50ZXJmYWNlICE9IG51bGwgJiYgc2VydmljZUludGVyZmFjZS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU2VydmljZUludGVyZmFjZSA9IChJbnRlcm5hbEVPYmplY3Qpc2VydmljZUludGVyZmFjZTsKLQkJCXNlcnZpY2VJbnRlcmZhY2UgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkob2xkU2VydmljZUludGVyZmFjZSk7Ci0JCQlpZiAoc2VydmljZUludGVyZmFjZSAhPSBvbGRTZXJ2aWNlSW50ZXJmYWNlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRSwgb2xkU2VydmljZUludGVyZmFjZSwgc2VydmljZUludGVyZmFjZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZXJ2aWNlSW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRTZXJ2aWNlSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gc2VydmljZUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlKEphdmFDbGFzcyBuZXdTZXJ2aWNlSW50ZXJmYWNlKSB7Ci0JCUphdmFDbGFzcyBvbGRTZXJ2aWNlSW50ZXJmYWNlID0gc2VydmljZUludGVyZmFjZTsKLQkJc2VydmljZUludGVyZmFjZSA9IG5ld1NlcnZpY2VJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VJbnRlcmZhY2UsIHNlcnZpY2VJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UG9ydENvbXBvbmVudFJlZnMoKSB7Ci0JCWlmIChwb3J0Q29tcG9uZW50UmVmcyA9PSBudWxsKSB7Ci0JCQlwb3J0Q29tcG9uZW50UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlMpOwotCQl9Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50UmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SGFuZGxlcnMoKSB7Ci0JCWlmIChoYW5kbGVycyA9PSBudWxsKSB7Ci0JCQloYW5kbGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChIYW5kbGVyLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFFOYW1lIGdldFNlcnZpY2VRbmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VRbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZXJ2aWNlUW5hbWUoUU5hbWUgbmV3U2VydmljZVFuYW1lLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVFOYW1lIG9sZFNlcnZpY2VRbmFtZSA9IHNlcnZpY2VRbmFtZTsKLQkJc2VydmljZVFuYW1lID0gbmV3U2VydmljZVFuYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUUsIG9sZFNlcnZpY2VRbmFtZSwgbmV3U2VydmljZVFuYW1lKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUW5hbWUoUU5hbWUgbmV3U2VydmljZVFuYW1lKSB7Ci0JCWlmIChuZXdTZXJ2aWNlUW5hbWUgIT0gc2VydmljZVFuYW1lKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzZXJ2aWNlUW5hbWUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2VydmljZVFuYW1lKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZXJ2aWNlUW5hbWUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VydmljZVFuYW1lKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlcnZpY2VRbmFtZShuZXdTZXJ2aWNlUW5hbWUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FLCBuZXdTZXJ2aWNlUW5hbWUsIG5ld1NlcnZpY2VRbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9ydENvbXBvbmVudFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SGFuZGxlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U2VydmljZVFuYW1lKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTZXJ2aWNlSW50ZXJmYWNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0U2VydmljZUludGVyZmFjZSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUU6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZOYW1lKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fV1NETF9GSUxFOgotCQkJCXJldHVybiBnZXRXc2RsRmlsZSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEpheHJwY01hcHBpbmdGaWxlKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UG9ydENvbXBvbmVudFJlZnMoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gZ2V0SGFuZGxlcnMoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUW5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfSU5URVJGQUNFOgotCQkJCXNldFNlcnZpY2VJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUU6Ci0JCQkJc2V0U2VydmljZVJlZk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1dTRExfRklMRToKLQkJCQlzZXRXc2RsRmlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRToKLQkJCQlzZXRKYXhycGNNYXBwaW5nRmlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUzoKLQkJCQlnZXRQb3J0Q29tcG9uZW50UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9ydENvbXBvbmVudFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSUzoKLQkJCQlnZXRIYW5kbGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0SGFuZGxlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FOgotCQkJCXNldFNlcnZpY2VRbmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUludGVyZmFjZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FOgotCQkJCXNldFNlcnZpY2VSZWZOYW1lKFNFUlZJQ0VfUkVGX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEU6Ci0JCQkJc2V0V3NkbEZpbGUoV1NETF9GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRToKLQkJCQlzZXRKYXhycGNNYXBwaW5nRmlsZShKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUzoKLQkJCQlnZXRQb3J0Q29tcG9uZW50UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTOgotCQkJCWdldEhhbmRsZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRToKLQkJCQlzZXRTZXJ2aWNlUW5hbWUoKFFOYW1lKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfSU5URVJGQUNFOgotCQkJCXJldHVybiBzZXJ2aWNlSW50ZXJmYWNlICE9IG51bGw7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRToKLQkJCQlyZXR1cm4gU0VSVklDRV9SRUZfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmljZVJlZk5hbWUgIT0gbnVsbCA6ICFTRVJWSUNFX1JFRl9OQU1FX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlUmVmTmFtZSk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fV1NETF9GSUxFOgotCQkJCXJldHVybiBXU0RMX0ZJTEVfRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxGaWxlICE9IG51bGwgOiAhV1NETF9GSUxFX0VERUZBVUxULmVxdWFscyh3c2RsRmlsZSk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRToKLQkJCQlyZXR1cm4gSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVCA9PSBudWxsID8gamF4cnBjTWFwcGluZ0ZpbGUgIT0gbnVsbCA6ICFKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxULmVxdWFscyhqYXhycGNNYXBwaW5nRmlsZSk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUzoKLQkJCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZnMgIT0gbnVsbCAmJiAhcG9ydENvbXBvbmVudFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTOgotCQkJCXJldHVybiBoYW5kbGVycyAhPSBudWxsICYmICFoYW5kbGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRToKLQkJCQlyZXR1cm4gc2VydmljZVFuYW1lICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzZXJ2aWNlUmVmTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VydmljZVJlZk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxGaWxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3c2RsRmlsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamF4cnBjTWFwcGluZ0ZpbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGpheHJwY01hcHBpbmdGaWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VydmljZVJlZkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0NsaWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0NsaWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkZTEwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNDbGllbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2ViIFNlcnZpY2VzIENsaWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50SW1wbCNnZXRDb21wb25lbnRTY29wZWRSZWZzIDxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0NsaWVudEltcGwjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzQ2xpZW50SW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VzQ2xpZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wb25lbnRTY29wZWRSZWZzKCkgPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wb25lbnRTY29wZWRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUxpc3QgY29tcG9uZW50U2NvcGVkUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmcygpIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgV2ViU2VydmljZXNDbGllbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkxpdGVyYWxzLldFQl9TRVJWSUNFU19DTElFTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVMaXN0IGdldENvbXBvbmVudFNjb3BlZFJlZnMoKSB7Ci0JCWlmIChjb21wb25lbnRTY29wZWRSZWZzID09IG51bGwpIHsKLQkJCWNvbXBvbmVudFNjb3BlZFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQ29tcG9uZW50U2NvcGVkUmVmcy5jbGFzcywgdGhpcywgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX0NPTVBPTkVOVF9TQ09QRURfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbXBvbmVudFNjb3BlZFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVMaXN0IGdldFNlcnZpY2VSZWZzKCkgewotCQlpZiAoc2VydmljZVJlZnMgPT0gbnVsbCkgewotCQkJc2VydmljZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZi5jbGFzcywgdGhpcywgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX0NPTVBPTkVOVF9TQ09QRURfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbXBvbmVudFNjb3BlZFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlM6Ci0JCQkJcmV0dXJuIGdldENvbXBvbmVudFNjb3BlZFJlZnMoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTOgotCQkJCWdldENvbXBvbmVudFNjb3BlZFJlZnMoKS5jbGVhcigpOwotCQkJCWdldENvbXBvbmVudFNjb3BlZFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlM6Ci0JCQkJZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX0NPTVBPTkVOVF9TQ09QRURfUkVGUzoKLQkJCQlyZXR1cm4gY29tcG9uZW50U2NvcGVkUmVmcyAhPSBudWxsICYmICFjb21wb25lbnRTY29wZWRSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gc2VydmljZVJlZnMgIT0gbnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9XZWJTZXJ2aWNlc0NsaWVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOGJlYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDYsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeQotICAgIGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSB7Ci0JCi0JLyoqCi0gICAgICogQHBhcmFtIGFSZW5kZXJlckZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkoKSB7Ci0gICAgICAgIHN1cGVyKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotICAgIH0KLQkKLQkJLyoqCi0JCSAqIE1ldGhvZCByZWdpc3RlckR0ZHMuCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEdGRzKCkgewotCQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9TWVNURU1JRF8xXzAsICJqMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8wLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NDSEVNQV9MT0NfMV8xLCAiajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIGFSZW5kZXJlckZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBXZWJTZXJ2aWNlc1Jlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7Ci0JfQotCSAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCQlhUmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NIT1JUTkFNRSwgbmV3IFdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQkgIH0KLSAgICAKLQkvKioKLQkgKiBSZWdpc3RlciBteXNlbGYgd2l0aCB0aGUgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9TSE9SVE5BTUUsIG5ldyBXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCXJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfRERfVVJJX09CSik7Ci0JfQotICAgIAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc1Jlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmI1YzA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc1Jlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzLldlYlNlcnZpY2VzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBXZWJTZXJ2aWNlc1Jlc291cmNlIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiBAcGFyYW0gYVJlbmRlcmVyCi0gICAgICovCi0gICAgcHVibGljIFdlYlNlcnZpY2VzUmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotICAgICAgICBzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFSZW5kZXJlcgotICAgICAqLwotICAgIHB1YmxpYyBXZWJTZXJ2aWNlc1Jlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLSAgICAgICAgc3VwZXIoYVJlbmRlcmVyKTsKLSAgICB9Ci0KLQkJLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZXNDbGllbnQgZ2V0V2ViU2VydmljZXNDbGllbnQoKSB7Ci0JCXJldHVybiAoV2ViU2VydmljZXNDbGllbnQpIGdldFJvb3RPYmplY3QoKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gV0VCX1NFUlZJQ0VTX0NMSUVOVF9UWVBFOwotICAgIH0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfU1lTVEVNSURfMV8wOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NZU1RFTUlEXzFfMDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1BVQkxJQ0lEXzFfMDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9QVUJMSUNJRF8xXzA7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgewotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCQkJCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfRE9DVFlQRTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI3NldERvY3R5cGVWYWx1ZXMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKiBUaGlzIGlzIHNldHRpbmcgdGhlIG1vZHVsZSB2ZXJzaW9uIG9uIHRoZSByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N0eXBlVmFsdWVzKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWludCB2ZXJzaW9uID0gV0VCU0VSVklDRVNfMV8wX0lEOwotCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCXN1cGVyLnNldFZlcnNpb25JRCh2ZXJzaW9uKTsKLQl9Ci0JCS8qIAotCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7Ci0JCXN1cGVyLnNldFZlcnNpb25JRChpZCk7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCQljYXNlIChXRUJTRVJWSUNFU18xXzBfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JLyoKLQkgKiBCYXNlZCBvbiB0aGUgSjJFRSB2ZXJzaW9uLCB0aGlzIHdpbGwgc2V0IHRoZSBtb2R1bGUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uSUQoaW50IGlkKSB7Ci0Jc3dpdGNoIChpZCkgewotCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChXRUJTRVJWSUNFU18xXzBfSUQpOwotCQkJCQlicmVhazsKLQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQkJCXByaW1TZXRWZXJzaW9uSUQoV0VCU0VSVklDRVNfMV8wX0lEKTsKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JLyogUmV0dXJuIEoyRUUgdmVyc2lvbiBiYXNlZCBvbiBtb2R1bGUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHsKLQkJc3dpdGNoIChnZXRNb2R1bGVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJTRVJWSUNFU18xXzBfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI2dldFJvb3RUcmFuc2xhdG9yKCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VzVHJhbnNsYXRvci5JTlNUQU5DRTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gV0VCU0VSVklDRVNfMV8wX0lEOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uaW1wbC5YTUxSZXNvdXJjZUltcGwjc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkgewotCQkvL25vdCBtb2RlbCBmb3IgSjJFRSAxLjQgc28gbm8gb3BlcmF0aW9uIHJlcXVpcmVkLgotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYnNlcnZpY2VfY2xpZW50RmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZGVkMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYnNlcnZpY2VfY2xpZW50RmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IHRoZVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSA9IChXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoIndlYnNlcnZpY2VfY2xpZW50LnhtaSIpOyAKLQkJCWlmICh0aGVXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVXZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGOiByZXR1cm4gY3JlYXRlU2VydmljZVJlZigpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGOiByZXR1cm4gY3JlYXRlUG9ydENvbXBvbmVudFJlZigpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUjogcmV0dXJuIGNyZWF0ZUhhbmRsZXIoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlQ6IHJldHVybiBjcmVhdGVXZWJTZXJ2aWNlc0NsaWVudCgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTOiByZXR1cm4gY3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmcygpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VSZWYgY3JlYXRlU2VydmljZVJlZigpIHsKLQkJU2VydmljZVJlZkltcGwgc2VydmljZVJlZiA9IG5ldyBTZXJ2aWNlUmVmSW1wbCgpOwotCQlyZXR1cm4gc2VydmljZVJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9ydENvbXBvbmVudFJlZiBjcmVhdGVQb3J0Q29tcG9uZW50UmVmKCkgewotCQlQb3J0Q29tcG9uZW50UmVmSW1wbCBwb3J0Q29tcG9uZW50UmVmID0gbmV3IFBvcnRDb21wb25lbnRSZWZJbXBsKCk7Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50UmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIYW5kbGVyIGNyZWF0ZUhhbmRsZXIoKSB7Ci0JCUhhbmRsZXJJbXBsIGhhbmRsZXIgPSBuZXcgSGFuZGxlckltcGwoKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFdlYlNlcnZpY2VzQ2xpZW50IGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50KCkgewotCQlXZWJTZXJ2aWNlc0NsaWVudEltcGwgd2ViU2VydmljZXNDbGllbnQgPSBuZXcgV2ViU2VydmljZXNDbGllbnRJbXBsKCk7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlc0NsaWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQ29tcG9uZW50U2NvcGVkUmVmcyBjcmVhdGVDb21wb25lbnRTY29wZWRSZWZzKCkgewotCQlDb21wb25lbnRTY29wZWRSZWZzSW1wbCBjb21wb25lbnRTY29wZWRSZWZzID0gbmV3IENvbXBvbmVudFNjb3BlZFJlZnNJbXBsKCk7Ci0JCXJldHVybiBjb21wb25lbnRTY29wZWRSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgZ2V0V2Vic2VydmljZV9jbGllbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYTE2NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlcnZpY2VSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcG9ydENvbXBvbmVudFJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBoYW5kbGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgRUNsYXNzIHdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgRUNsYXNzIGNvbXBvbmVudFNjb3BlZFJlZnNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXJ2aWNlUmVmKCkgewotCQlyZXR1cm4gc2VydmljZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX0hhbmRsZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UG9ydENvbXBvbmVudFJlZigpIHsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnRSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBvcnRDb21wb25lbnRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEhhbmRsZXIoKSB7Ci0JCXJldHVybiBoYW5kbGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSloYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIYW5kbGVyX1NvYXBSb2xlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIYW5kbGVyX1BvcnROYW1lcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRIYW5kbGVyX0luaXRQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSloYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRXZWJTZXJ2aWNlc0NsaWVudCgpIHsKLQkJcmV0dXJuIHdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VzQ2xpZW50X0NvbXBvbmVudFNjb3BlZFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJTZXJ2aWNlc0NsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViU2VydmljZXNDbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldENvbXBvbmVudFNjb3BlZFJlZnMoKSB7Ci0JCXJldHVybiBjb21wb25lbnRTY29wZWRSZWZzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvbmVudFNjb3BlZFJlZnNfQ29tcG9uZW50TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvbmVudFNjb3BlZFJlZnNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb25lbnRTY29wZWRSZWZzX1NlcnZpY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29tcG9uZW50U2NvcGVkUmVmc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkgZ2V0V2Vic2VydmljZV9jbGllbnRGYWN0b3J5KCkgewotCQlyZXR1cm4gKFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlzZXJ2aWNlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0VfUkVGKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fV1NETF9GSUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19IQU5ETEVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUUpOwotCi0JCXBvcnRDb21wb25lbnRSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9SVF9DT01QT05FTlRfUkVGKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTkspOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRSZWZFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UpOwotCi0JCWhhbmRsZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSEFORExFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaGFuZGxlckVDbGFzcywgSEFORExFUl9fSEFORExFUl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShoYW5kbGVyRUNsYXNzLCBIQU5ETEVSX19TT0FQX1JPTEVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShoYW5kbGVyRUNsYXNzLCBIQU5ETEVSX19QT1JUX05BTUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShoYW5kbGVyRUNsYXNzLCBIQU5ETEVSX19IQU5ETEVSX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShoYW5kbGVyRUNsYXNzLCBIQU5ETEVSX19JTklUX1BBUkFNUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaGFuZGxlckVDbGFzcywgSEFORExFUl9fU09BUF9IRUFERVJTKTsKLQotCQl3ZWJTZXJ2aWNlc0NsaWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUJfU0VSVklDRVNfQ0xJRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJTZXJ2aWNlc0NsaWVudEVDbGFzcywgV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJTZXJ2aWNlc0NsaWVudEVDbGFzcywgV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTKTsKLQotCQljb21wb25lbnRTY29wZWRSZWZzRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTVBPTkVOVF9TQ09QRURfUkVGUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9uZW50U2NvcGVkUmVmc0VDbGFzcywgQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19DT01QT05FTlRfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29tcG9uZW50U2NvcGVkUmVmc0VDbGFzcywgQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19TRVJWSUNFX1JFRlMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQlKYXZhUmVmUGFja2FnZSB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJcG9ydENvbXBvbmVudFJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQloYW5kbGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCXdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWNvbXBvbmVudFNjb3BlZFJlZnNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHNlcnZpY2VSZWZFQ2xhc3MsIFNlcnZpY2VSZWYuY2xhc3MsICJTZXJ2aWNlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJzZXJ2aWNlSW50ZXJmYWNlIiwgbnVsbCwgMSwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmljZVJlZk5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsRmlsZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImpheHJwY01hcHBpbmdGaWxlIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpLCB0aGlzLmdldFBvcnRDb21wb25lbnRSZWYoKSwgbnVsbCwgInBvcnRDb21wb25lbnRSZWZzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSwgdGhpcy5nZXRIYW5kbGVyKCksIG51bGwsICJoYW5kbGVycyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpLCB0aGVDb21tb25QYWNrYWdlLmdldFFOYW1lKCksIG51bGwsICJzZXJ2aWNlUW5hbWUiLCBudWxsLCAxLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocG9ydENvbXBvbmVudFJlZkVDbGFzcywgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIlBvcnRDb21wb25lbnRSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnRDb21wb25lbnRMaW5rIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaGFuZGxlckVDbGFzcywgSGFuZGxlci5jbGFzcywgIkhhbmRsZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImhhbmRsZXJOYW1lIiwgbnVsbCwgMCwgMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNvYXBSb2xlcyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyX1BvcnROYW1lcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydE5hbWVzIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiaGFuZGxlckNsYXNzIiwgbnVsbCwgMSwgMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSwgbnVsbCwgInNvYXBIZWFkZXJzIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3ZWJTZXJ2aWNlc0NsaWVudEVDbGFzcywgV2ViU2VydmljZXNDbGllbnQuY2xhc3MsICJXZWJTZXJ2aWNlc0NsaWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZXNDbGllbnRfQ29tcG9uZW50U2NvcGVkUmVmcygpLCB0aGlzLmdldENvbXBvbmVudFNjb3BlZFJlZnMoKSwgbnVsbCwgImNvbXBvbmVudFNjb3BlZFJlZnMiLCBudWxsLCAwLCAtMSwgV2ViU2VydmljZXNDbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCksIHRoaXMuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgV2ViU2VydmljZXNDbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb21wb25lbnRTY29wZWRSZWZzRUNsYXNzLCBDb21wb25lbnRTY29wZWRSZWZzLmNsYXNzLCAiQ29tcG9uZW50U2NvcGVkUmVmcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21wb25lbnROYW1lIiwgbnVsbCwgMCwgMSwgQ29tcG9uZW50U2NvcGVkUmVmcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19TZXJ2aWNlUmVmcygpLCB0aGlzLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMSwgLTEsIENvbXBvbmVudFNjb3BlZFJlZnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvL1dlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvdXRpbC9XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL3V0aWwvV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDg5MzVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvdXRpbC9XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdlYnNlcnZpY2VfY2xpZW50U3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IFdlYnNlcnZpY2VfY2xpZW50U3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmljZVJlZihTZXJ2aWNlUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2aWNlUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUG9ydENvbXBvbmVudFJlZihQb3J0Q29tcG9uZW50UmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQb3J0Q29tcG9uZW50UmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSGFuZGxlcihIYW5kbGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVIYW5kbGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViU2VydmljZXNDbGllbnQoV2ViU2VydmljZXNDbGllbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcG9uZW50U2NvcGVkUmVmcyhDb21wb25lbnRTY29wZWRSZWZzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb21wb25lbnRTY29wZWRSZWZzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiA8ZW0+U2VydmljZSBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZiA8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0Q29tcG9uZW50UmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIgPGVtPkhhbmRsZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhhbmRsZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQgPGVtPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJTZXJ2aWNlc0NsaWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzIDxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC91dGlsL1dlYnNlcnZpY2VfY2xpZW50U3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL3V0aWwvV2Vic2VydmljZV9jbGllbnRTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzYmViNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL3V0aWwvV2Vic2VydmljZV9jbGllbnRTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJzZXJ2aWNlX2NsaWVudFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRjogewotCQkJCVNlcnZpY2VSZWYgc2VydmljZVJlZiA9IChTZXJ2aWNlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlUmVmKHNlcnZpY2VSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKHNlcnZpY2VSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoc2VydmljZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc2VydmljZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGOiB7Ci0JCQkJUG9ydENvbXBvbmVudFJlZiBwb3J0Q29tcG9uZW50UmVmID0gKFBvcnRDb21wb25lbnRSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBvcnRDb21wb25lbnRSZWYocG9ydENvbXBvbmVudFJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QocG9ydENvbXBvbmVudFJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUjogewotCQkJCUhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIYW5kbGVyKGhhbmRsZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGhhbmRsZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoaGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoaGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVDogewotCQkJCVdlYlNlcnZpY2VzQ2xpZW50IHdlYlNlcnZpY2VzQ2xpZW50ID0gKFdlYlNlcnZpY2VzQ2xpZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJTZXJ2aWNlc0NsaWVudCh3ZWJTZXJ2aWNlc0NsaWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qod2ViU2VydmljZXNDbGllbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGUzogewotCQkJCUNvbXBvbmVudFNjb3BlZFJlZnMgY29tcG9uZW50U2NvcGVkUmVmcyA9IChDb21wb25lbnRTY29wZWRSZWZzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb21wb25lbnRTY29wZWRSZWZzKGNvbXBvbmVudFNjb3BlZFJlZnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGNvbXBvbmVudFNjb3BlZFJlZnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmljZVJlZihTZXJ2aWNlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUG9ydENvbXBvbmVudFJlZihQb3J0Q29tcG9uZW50UmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGFuZGxlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IYW5kbGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VIYW5kbGVyKEhhbmRsZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWIgU2VydmljZXMgQ2xpZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZVdlYlNlcnZpY2VzQ2xpZW50KFdlYlNlcnZpY2VzQ2xpZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBjYXNlQ29tcG9uZW50U2NvcGVkUmVmcyhDb21wb25lbnRTY29wZWRSZWZzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV2Vic2VydmljZV9jbGllbnRTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjM3ZTBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgd2ViIHNlcnZpY2VzIGNsaWVudCBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSBhcnRpZmFjdHMgb2YgYSB3ZWIgc2VydmljZXMgY2xpZW50Ci0gICAgICAgIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZC4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vRGVzY3JpcHRpb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL0Rlc2NyaXB0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDhiODk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vRGVzY3JpcHRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdGlvbiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldERlc2NyaXB0aW9uVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdGlvblR5cGUgZXh0ZW5kcyBEZXNjcmlwdGlvbiB7Ci0vLyBEZXNjcmlwdGlvblR5cGUKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vRGlzcGxheU5hbWVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL0Rpc3BsYXlOYW1lVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTM0MTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vRGlzcGxheU5hbWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNwbGF5IE5hbWUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSNnZXREaXNwbGF5TmFtZVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheU5hbWVUeXBlIGV4dGVuZHMgRGlzcGxheU5hbWUgewotLy8gRGlzcGxheU5hbWVUeXBlCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL0luaXRQYXJhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Jbml0UGFyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExMzJkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL0luaXRQYXJhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Jbml0IFBhcmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldFBhcmFtTmFtZSA8ZW0+UGFyYW0gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0UGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0RGVzY3JpcHRpb25UeXBlcyA8ZW0+RGVzY3JpcHRpb24gVHlwZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldEluaXRQYXJhbSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbml0UGFyYW0gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW0gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmFtTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSNnZXRJbml0UGFyYW1fUGFyYW1OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRQYXJhbU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldFBhcmFtTmFtZSA8ZW0+UGFyYW0gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcmFtTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFBhcmFtTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmFtVmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFBhcmFtVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldFBhcmFtVmFsdWUgPGVtPlBhcmFtIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uIFR5cGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBUeXBlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFR5cGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uVHlwZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXREZXNjcmlwdGlvblR5cGVzKCk7Ci0KLX0gLy8gSW5pdFBhcmFtCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1BvcnROYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1BvcnROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYjZhNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Qb3J0TmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWUjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0UG9ydE5hbWUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9ydE5hbWUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvcnROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldFBvcnROYW1lX1BvcnROYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRQb3J0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZSNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFBvcnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUG9ydE5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vU09BUEhlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9TT0FQSGVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MmYxNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9TT0FQSGVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TT0FQIEhlYWRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgaGFuZGxlci4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldFNPQVBIZWFkZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEhlYWRlciBleHRlbmRzIFFOYW1lIHsKLS8vIFNPQVBIZWFkZXIKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vU09BUFJvbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vU09BUFJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2ZjkxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1NPQVBSb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TT0FQIFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdCB0aGUgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZSNnZXRTb2FwUm9sZSA8ZW0+U29hcCBSb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSNnZXRTT0FQUm9sZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQUm9sZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIFJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBSb2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgUm9sZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U29hcFJvbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0U09BUFJvbGVfU29hcFJvbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFNvYXBSb2xlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlI2dldFNvYXBSb2xlIDxlbT5Tb2FwIFJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIFJvbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNvYXBSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0U29hcFJvbGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTT0FQUm9sZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Xc2NvbW1vbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vV3Njb21tb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZGEwZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Xc2NvbW1vbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXc2NvbW1vbkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdzY29tbW9uRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25GYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluaXQgUGFyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Jbml0IFBhcmFtPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgSW5pdFBhcmFtIGNyZWF0ZUluaXRQYXJhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TT0FQIEhlYWRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNPQVAgSGVhZGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU09BUEhlYWRlciBjcmVhdGVTT0FQSGVhZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNPQVAgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNPQVAgUm9sZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFNPQVBSb2xlIGNyZWF0ZVNPQVBSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgTmFtZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFBvcnROYW1lIGNyZWF0ZVBvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRGVzY3JpcHRpb25UeXBlIGNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRGlzcGxheU5hbWVUeXBlIGNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBtZXRob2QgaXMgTk9UIGFwaSwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLiAgCi0JICogRU1GIHBhY2thZ2UgY2xhc3NlcyBzaG91bGQgYmUgYWNjZXNzIHZpYSB0aGVpciAiZUlOU1RBTkNFIiBzdGF0aWMgZmllbGRzCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV3Njb21tb25QYWNrYWdlIGdldFdzY29tbW9uUGFja2FnZSgpOwotCi19IC8vV3Njb21tb25GYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1dzY29tbW9uUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Xc2NvbW1vblBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4N2ZkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1dzY29tbW9uUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogKioKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgkKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdzY29tbW9uUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGVOQU1FID0gIndzY29tbW9uIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGVOU19VUkkgPSAid3Njb21tb24ueG1pIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBXc2NvbW1vblBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuSW5pdFBhcmFtSW1wbCA8ZW0+SW5pdCBQYXJhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuSW5pdFBhcmFtSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGwjZ2V0SW5pdFBhcmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBJTklUX1BBUkFNID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBJTklUX1BBUkFNX19QQVJBTV9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IElOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IElOSVRfUEFSQU1fX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVHlwZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT05fVFlQRVMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Jbml0IFBhcmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSU5JVF9QQVJBTV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVySW1wbCA8ZW0+U09BUCBIZWFkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXRTT0FQSGVhZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBTT0FQX0hFQURFUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU09BUF9IRUFERVJfX05BTUVTUEFDRV9VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIFBhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNPQVBfSEVBREVSX19MT0NBTF9QQVJUID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21iaW5lZCBRTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU09BUF9IRUFERVJfX0NPTUJJTkVEX1FOQU1FID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fQ09NQklORURfUU5BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU09BUF9IRUFERVJfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNPQVAgSGVhZGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU09BUF9IRUFERVJfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5TT0FQUm9sZUltcGwgPGVtPlNPQVAgUm9sZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuU09BUFJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXRTT0FQUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgU09BUF9ST0xFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIFJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNPQVBfUk9MRV9fU09BUF9ST0xFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U09BUCBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU09BUF9ST0xFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlBvcnROYW1lSW1wbCA8ZW0+UG9ydCBOYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Qb3J0TmFtZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsI2dldFBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBQT1JUX05BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9OQU1FX19QT1JUX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX05BTUVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25UeXBlSW1wbCA8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25UeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBERVNDUklQVElPTl9UWVBFID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBERVNDUklQVElPTl9UWVBFX19MQU5HID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fTEFORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgREVTQ1JJUFRJT05fVFlQRV9fVkFMVUUgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgREVTQ1JJUFRJT05fVFlQRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lVHlwZUltcGwgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5EaXNwbGF5TmFtZVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXREaXNwbGF5TmFtZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IERJU1BMQVlfTkFNRV9UWVBFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBESVNQTEFZX05BTUVfVFlQRV9fTEFORyA9IENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19MQU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBESVNQTEFZX05BTUVfVFlQRV9fVkFMVUUgPSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBESVNQTEFZX05BTUVfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtIDxlbT5Jbml0IFBhcmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Jbml0IFBhcmFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRJbml0UGFyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0UGFyYW1OYW1lIDxlbT5QYXJhbSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcmFtIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXRQYXJhbU5hbWUoKQotCSAqIEBzZWUgI2dldEluaXRQYXJhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEluaXRQYXJhbV9QYXJhbU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0UGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAc2VlICNnZXRJbml0UGFyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0SW5pdFBhcmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0RGVzY3JpcHRpb25UeXBlcyA8ZW0+RGVzY3JpcHRpb24gVHlwZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbiBUeXBlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldERlc2NyaXB0aW9uVHlwZXMoKQotCSAqIEBzZWUgI2dldEluaXRQYXJhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXIgPGVtPlNPQVAgSGVhZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TT0FQIEhlYWRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFNPQVBIZWFkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGUgPGVtPlNPQVAgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U09BUCBSb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFNPQVBSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGUjZ2V0U29hcFJvbGUgPGVtPlNvYXAgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwIFJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlI2dldFNvYXBSb2xlKCkKLQkgKiBAc2VlICNnZXRTT0FQUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFNPQVBSb2xlX1NvYXBSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRQb3J0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9ydCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZSNnZXRQb3J0TmFtZSgpCi0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0TmFtZV9Qb3J0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGUgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldERlc2NyaXB0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGUgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0RGlzcGxheU5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdzY29tbW9uRmFjdG9yeSBnZXRXc2NvbW1vbkZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Jbml0UGFyYW1JbXBsIDxlbT5Jbml0IFBhcmFtPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXRJbml0UGFyYW0oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSU5JVF9QQVJBTSA9IGVJTlNUQU5DRS5nZXRJbml0UGFyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTklUX1BBUkFNX19QQVJBTV9OQU1FID0gZUlOU1RBTkNFLmdldEluaXRQYXJhbV9QYXJhbU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT05fVFlQRVMgPSBlSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uVHlwZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVySW1wbCA8ZW0+U09BUCBIZWFkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuU09BUEhlYWRlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXRTT0FQSGVhZGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNPQVBfSEVBREVSID0gZUlOU1RBTkNFLmdldFNPQVBIZWFkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5TT0FQUm9sZUltcGwgPGVtPlNPQVAgUm9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5TT0FQUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXRTT0FQUm9sZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTT0FQX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0U09BUFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgUm9sZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNPQVBfUk9MRV9fU09BUF9ST0xFID0gZUlOU1RBTkNFLmdldFNPQVBSb2xlX1NvYXBSb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuUG9ydE5hbWVJbXBsIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuUG9ydE5hbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGwjZ2V0UG9ydE5hbWUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUE9SVF9OQU1FID0gZUlOU1RBTkNFLmdldFBvcnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX05BTUVfX1BPUlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRQb3J0TmFtZV9Qb3J0TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uVHlwZUltcGwgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25UeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsI2dldERlc2NyaXB0aW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lVHlwZUltcGwgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXREaXNwbGF5TmFtZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElTUExBWV9OQU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RGlzcGxheU5hbWVUeXBlKCk7Ci0KLQl9Ci0KLX0gLy9Xc2NvbW1vblBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvblR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25UeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzJlNDMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvblR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb24gVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uVHlwZUltcGwgZXh0ZW5kcyBEZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBEZXNjcmlwdGlvblR5cGUKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBEZXNjcmlwdGlvblR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2NvbW1vblBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRJT05fVFlQRTsKLQl9Ci0KLX0gLy9EZXNjcmlwdGlvblR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rpc3BsYXlOYW1lVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhNzk1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EaXNwbGF5TmFtZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc3BsYXkgTmFtZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzcGxheU5hbWVUeXBlSW1wbCBleHRlbmRzIERpc3BsYXlOYW1lSW1wbCBpbXBsZW1lbnRzIERpc3BsYXlOYW1lVHlwZQotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIERpc3BsYXlOYW1lVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5MaXRlcmFscy5ESVNQTEFZX05BTUVfVFlQRTsKLQl9Ci0KLX0gLy9EaXNwbGF5TmFtZVR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvSW5pdFBhcmFtSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL0luaXRQYXJhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkMmJkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvSW5pdFBhcmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluaXQgUGFyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Jbml0UGFyYW1JbXBsI2dldFBhcmFtTmFtZSA8ZW0+UGFyYW0gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwjZ2V0UGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Jbml0UGFyYW1JbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwjZ2V0RGVzY3JpcHRpb25UeXBlcyA8ZW0+RGVzY3JpcHRpb24gVHlwZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0UGFyYW1JbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgSW5pdFBhcmFtCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtTmFtZSgpIDxlbT5QYXJhbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbU5hbWUoKSA8ZW0+UGFyYW0gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcGFyYW1OYW1lID0gUEFSQU1fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbVZhbHVlKCkgPGVtPlBhcmFtIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtVmFsdWUoKSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwYXJhbVZhbHVlID0gUEFSQU1fVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvblR5cGVzKCkgPGVtPkRlc2NyaXB0aW9uIFR5cGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvblR5cGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9uVHlwZXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgSW5pdFBhcmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3Njb21tb25QYWNrYWdlLkxpdGVyYWxzLklOSVRfUEFSQU07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtTmFtZSgpIHsKLQkJcmV0dXJuIHBhcmFtTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFBhcmFtTmFtZShTdHJpbmcgbmV3UGFyYW1OYW1lKSB7Ci0JCVN0cmluZyBvbGRQYXJhbU5hbWUgPSBwYXJhbU5hbWU7Ci0JCXBhcmFtTmFtZSA9IG5ld1BhcmFtTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUUsIG9sZFBhcmFtTmFtZSwgcGFyYW1OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtVmFsdWUoKSB7Ci0JCXJldHVybiBwYXJhbVZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0UGFyYW1WYWx1ZShTdHJpbmcgbmV3UGFyYW1WYWx1ZSkgewotCQlTdHJpbmcgb2xkUGFyYW1WYWx1ZSA9IHBhcmFtVmFsdWU7Ci0JCXBhcmFtVmFsdWUgPSBuZXdQYXJhbVZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUUsIG9sZFBhcmFtVmFsdWUsIHBhcmFtVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvblR5cGVzKCkgewotCQlpZiAoZGVzY3JpcHRpb25UeXBlcyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvblR5cGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uVHlwZS5jbGFzcywgdGhpcywgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OX1RZUEVTKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25UeXBlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9uVHlwZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgotCQkJCXJldHVybiBnZXRQYXJhbU5hbWUoKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXJldHVybiBnZXRQYXJhbVZhbHVlKCk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OX1RZUEVTOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvblR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJc2V0UGFyYW1OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXNldFBhcmFtVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT05fVFlQRVM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25UeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25UeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJc2V0UGFyYW1OYW1lKFBBUkFNX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXNldFBhcmFtVmFsdWUoUEFSQU1fVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUzoKLQkJCQlnZXREZXNjcmlwdGlvblR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJcmV0dXJuIFBBUkFNX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmFtTmFtZSAhPSBudWxsIDogIVBBUkFNX05BTUVfRURFRkFVTFQuZXF1YWxzKHBhcmFtTmFtZSk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRToKLQkJCQlyZXR1cm4gUEFSQU1fVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmFtVmFsdWUgIT0gbnVsbCA6ICFQQVJBTV9WQUxVRV9FREVGQVVMVC5lcXVhbHMocGFyYW1WYWx1ZSk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OX1RZUEVTOgotCQkJCXJldHVybiBkZXNjcmlwdGlvblR5cGVzICE9IG51bGwgJiYgIWRlc2NyaXB0aW9uVHlwZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwYXJhbU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmFtTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1WYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyYW1WYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSW5pdFBhcmFtSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1BvcnROYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1BvcnROYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2YxMzYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Qb3J0TmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuUG9ydE5hbWVJbXBsI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0TmFtZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBQb3J0TmFtZQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZSgpIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZSgpIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWUgPSBQT1JUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBQb3J0TmFtZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5MaXRlcmFscy5QT1JUX05BTUU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotCQlyZXR1cm4gcG9ydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgbmV3UG9ydE5hbWUpIHsKLQkJU3RyaW5nIG9sZFBvcnROYW1lID0gcG9ydE5hbWU7Ci0JCXBvcnROYW1lID0gbmV3UG9ydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzY29tbW9uUGFja2FnZS5QT1JUX05BTUVfX1BPUlRfTkFNRSwgb2xkUG9ydE5hbWUsIHBvcnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuUE9SVF9OQU1FX19QT1JUX05BTUU6Ci0JCQkJcmV0dXJuIGdldFBvcnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRV9fUE9SVF9OQU1FOgotCQkJCXNldFBvcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5QT1JUX05BTUVfX1BPUlRfTkFNRToKLQkJCQlzZXRQb3J0TmFtZShQT1JUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuUE9SVF9OQU1FX19QT1JUX05BTUU6Ci0JCQkJcmV0dXJuIFBPUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcG9ydE5hbWUgIT0gbnVsbCA6ICFQT1JUX05BTUVfRURFRkFVTFQuZXF1YWxzKHBvcnROYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocG9ydE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvcnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9ydE5hbWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjg0OTMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TT0FQIEhlYWRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBIZWFkZXJJbXBsIGV4dGVuZHMgUU5hbWVJbXBsIGltcGxlbWVudHMgU09BUEhlYWRlcgotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFNPQVBIZWFkZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2NvbW1vblBhY2thZ2UuTGl0ZXJhbHMuU09BUF9IRUFERVI7Ci0JfQotCi19IC8vU09BUEhlYWRlckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9TT0FQUm9sZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9TT0FQUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdjMTA0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvU09BUFJvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNPQVAgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlNPQVBSb2xlSW1wbCNnZXRTb2FwUm9sZSA8ZW0+U29hcCBSb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUFJvbGVJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgU09BUFJvbGUKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcFJvbGUoKSA8ZW0+U29hcCBSb2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U29hcFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX1JPTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcFJvbGUoKSA8ZW0+U29hcCBSb2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U29hcFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNvYXBSb2xlID0gU09BUF9ST0xFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgU09BUFJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2NvbW1vblBhY2thZ2UuTGl0ZXJhbHMuU09BUF9ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTb2FwUm9sZSgpIHsKLQkJcmV0dXJuIHNvYXBSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0U29hcFJvbGUoU3RyaW5nIG5ld1NvYXBSb2xlKSB7Ci0JCVN0cmluZyBvbGRTb2FwUm9sZSA9IHNvYXBSb2xlOwotCQlzb2FwUm9sZSA9IG5ld1NvYXBSb2xlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFX19TT0FQX1JPTEUsIG9sZFNvYXBSb2xlLCBzb2FwUm9sZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRV9fU09BUF9ST0xFOgotCQkJCXJldHVybiBnZXRTb2FwUm9sZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX1JPTEVfX1NPQVBfUk9MRToKLQkJCQlzZXRTb2FwUm9sZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFX19TT0FQX1JPTEU6Ci0JCQkJc2V0U29hcFJvbGUoU09BUF9ST0xFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRV9fU09BUF9ST0xFOgotCQkJCXJldHVybiBTT0FQX1JPTEVfRURFRkFVTFQgPT0gbnVsbCA/IHNvYXBSb2xlICE9IG51bGwgOiAhU09BUF9ST0xFX0VERUZBVUxULmVxdWFscyhzb2FwUm9sZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNvYXBSb2xlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzb2FwUm9sZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NPQVBSb2xlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1dzY29tbW9uRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Xc2NvbW1vbkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjlhMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1dzY29tbW9uRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3Njb21tb25GYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFdzY29tbW9uRmFjdG9yeQotewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdzY29tbW9uRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJV3Njb21tb25GYWN0b3J5IHRoZVdzY29tbW9uRmFjdG9yeSA9IChXc2NvbW1vbkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoIndzY29tbW9uLnhtaSIpOyAKLQkJCWlmICh0aGVXc2NvbW1vbkZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVXc2NvbW1vbkZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgV3Njb21tb25GYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV3Njb21tb25GYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNOiByZXR1cm4gY3JlYXRlSW5pdFBhcmFtKCk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX0hFQURFUjogcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXIoKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRTogcmV0dXJuIGNyZWF0ZVNPQVBSb2xlKCk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5QT1JUX05BTUU6IHJldHVybiBjcmVhdGVQb3J0TmFtZSgpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fVFlQRTogcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX1RZUEU6IHJldHVybiBjcmVhdGVEaXNwbGF5TmFtZVR5cGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEluaXRQYXJhbSBjcmVhdGVJbml0UGFyYW0oKSB7Ci0JCUluaXRQYXJhbUltcGwgaW5pdFBhcmFtID0gbmV3IEluaXRQYXJhbUltcGwoKTsKLQkJcmV0dXJuIGluaXRQYXJhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTT0FQSGVhZGVyIGNyZWF0ZVNPQVBIZWFkZXIoKSB7Ci0JCVNPQVBIZWFkZXJJbXBsIHNvYXBIZWFkZXIgPSBuZXcgU09BUEhlYWRlckltcGwoKTsKLQkJcmV0dXJuIHNvYXBIZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU09BUFJvbGUgY3JlYXRlU09BUFJvbGUoKSB7Ci0JCVNPQVBSb2xlSW1wbCBzb2FwUm9sZSA9IG5ldyBTT0FQUm9sZUltcGwoKTsKLQkJcmV0dXJuIHNvYXBSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFBvcnROYW1lIGNyZWF0ZVBvcnROYW1lKCkgewotCQlQb3J0TmFtZUltcGwgcG9ydE5hbWUgPSBuZXcgUG9ydE5hbWVJbXBsKCk7Ci0JCXJldHVybiBwb3J0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBEZXNjcmlwdGlvblR5cGUgY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkgewotCQlEZXNjcmlwdGlvblR5cGVJbXBsIGRlc2NyaXB0aW9uVHlwZSA9IG5ldyBEZXNjcmlwdGlvblR5cGVJbXBsKCk7Ci0JCXJldHVybiBkZXNjcmlwdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRGlzcGxheU5hbWVUeXBlIGNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpIHsKLQkJRGlzcGxheU5hbWVUeXBlSW1wbCBkaXNwbGF5TmFtZVR5cGUgPSBuZXcgRGlzcGxheU5hbWVUeXBlSW1wbCgpOwotCQlyZXR1cm4gZGlzcGxheU5hbWVUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdzY29tbW9uUGFja2FnZSBnZXRXc2NvbW1vblBhY2thZ2UoKSB7Ci0JCXJldHVybiAoV3Njb21tb25QYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgV3Njb21tb25QYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL1dzY29tbW9uRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Xc2NvbW1vblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvV3Njb21tb25QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDdkODI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Xc2NvbW1vblBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdzY29tbW9uUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBXc2NvbW1vblBhY2thZ2UKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGluaXRQYXJhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHNvYXBIZWFkZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBzb2FwUm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHBvcnROYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRpb25UeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgZGlzcGxheU5hbWVUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIFdzY29tbW9uUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgV3Njb21tb25QYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChXc2NvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgV3Njb21tb25QYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVdzY29tbW9uUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlV3Njb21tb25QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRJbml0UGFyYW0oKSB7Ci0JCXJldHVybiBpbml0UGFyYW1FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fUGFyYW1OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5pdFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWluaXRQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5pdFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluaXRQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRTT0FQSGVhZGVyKCkgewotCQlyZXR1cm4gc29hcEhlYWRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0U09BUFJvbGUoKSB7Ci0JCXJldHVybiBzb2FwUm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBSb2xlX1NvYXBSb2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc29hcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0UG9ydE5hbWUoKSB7Ci0JCXJldHVybiBwb3J0TmFtZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnROYW1lX1BvcnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydE5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0RGVzY3JpcHRpb25UeXBlKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb25UeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXREaXNwbGF5TmFtZVR5cGUoKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV3Njb21tb25GYWN0b3J5IGdldFdzY29tbW9uRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChXc2NvbW1vbkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWluaXRQYXJhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTklUX1BBUkFNKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbml0UGFyYW1FQ2xhc3MsIElOSVRfUEFSQU1fX1BBUkFNX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRQYXJhbUVDbGFzcywgSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRQYXJhbUVDbGFzcywgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGluaXRQYXJhbUVDbGFzcywgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT05fVFlQRVMpOwotCi0JCXNvYXBIZWFkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9IRUFERVIpOwotCi0JCXNvYXBSb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPQVBfUk9MRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc29hcFJvbGVFQ2xhc3MsIFNPQVBfUk9MRV9fU09BUF9ST0xFKTsKLQotCQlwb3J0TmFtZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnROYW1lRUNsYXNzLCBQT1JUX05BTUVfX1BPUlRfTkFNRSk7Ci0KLQkJZGVzY3JpcHRpb25UeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSVBUSU9OX1RZUEUpOwotCi0JCWRpc3BsYXlOYW1lVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESVNQTEFZX05BTUVfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJaW5pdFBhcmFtRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXNvYXBIZWFkZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpKTsKLQkJc29hcFJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcG9ydE5hbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZGVzY3JpcHRpb25UeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWRpc3BsYXlOYW1lVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldERpc3BsYXlOYW1lKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoaW5pdFBhcmFtRUNsYXNzLCBJbml0UGFyYW0uY2xhc3MsICJJbml0UGFyYW0iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRQYXJhbV9QYXJhbU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcmFtTmFtZSIsIG51bGwsIDAsIDEsIEluaXRQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcmFtVmFsdWUiLCBudWxsLCAwLCAxLCBJbml0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRQYXJhbV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBJbml0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCksIHRoaXMuZ2V0RGVzY3JpcHRpb25UeXBlKCksIG51bGwsICJkZXNjcmlwdGlvblR5cGVzIiwgbnVsbCwgMCwgLTEsIEluaXRQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNvYXBIZWFkZXJFQ2xhc3MsIFNPQVBIZWFkZXIuY2xhc3MsICJTT0FQSGVhZGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Moc29hcFJvbGVFQ2xhc3MsIFNPQVBSb2xlLmNsYXNzLCAiU09BUFJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNPQVBSb2xlX1NvYXBSb2xlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzb2FwUm9sZSIsIG51bGwsIDAsIDEsIFNPQVBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocG9ydE5hbWVFQ2xhc3MsIFBvcnROYW1lLmNsYXNzLCAiUG9ydE5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnROYW1lX1BvcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwb3J0TmFtZSIsIG51bGwsIDAsIDEsIFBvcnROYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVzY3JpcHRpb25UeXBlRUNsYXNzLCBEZXNjcmlwdGlvblR5cGUuY2xhc3MsICJEZXNjcmlwdGlvblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhkaXNwbGF5TmFtZVR5cGVFQ2xhc3MsIERpc3BsYXlOYW1lVHlwZS5jbGFzcywgIkRpc3BsYXlOYW1lVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vV3Njb21tb25QYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC91dGlsL1dzY29tbW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvdXRpbC9Xc2NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzYxZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC91dGlsL1dzY29tbW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3Njb21tb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotCi0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBXc2NvbW1vblBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdzY29tbW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdzY29tbW9uU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IFdzY29tbW9uU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlSW5pdFBhcmFtKEluaXRQYXJhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdFBhcmFtQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlcihTT0FQSGVhZGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTT0FQSGVhZGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU09BUFJvbGUoU09BUFJvbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNPQVBSb2xlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUG9ydE5hbWUoUG9ydE5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBvcnROYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25UeXBlKERlc2NyaXB0aW9uVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25UeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGlzcGxheU5hbWVUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUU5hbWUoUU5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVFOYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc3BsYXlOYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0gPGVtPkluaXQgUGFyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluaXRQYXJhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyIDxlbT5TT0FQIEhlYWRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGUgPGVtPlNPQVAgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQUm9sZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnROYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZSA8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25UeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZSA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc3BsYXlOYW1lVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzcGxheU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVRTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Xc2NvbW1vbkFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL3V0aWwvV3Njb21tb25Td2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvdXRpbC9Xc2NvbW1vblN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZjZTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvdXRpbC9Xc2NvbW1vblN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdzY29tbW9uU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgV3Njb21tb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXc2NvbW1vblN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU06IHsKLQkJCQlJbml0UGFyYW0gaW5pdFBhcmFtID0gKEluaXRQYXJhbSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW5pdFBhcmFtKGluaXRQYXJhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoaW5pdFBhcmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX0hFQURFUjogewotCQkJCVNPQVBIZWFkZXIgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyKHNvYXBIZWFkZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVFOYW1lKHNvYXBIZWFkZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNvYXBIZWFkZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRTogewotCQkJCVNPQVBSb2xlIHNvYXBSb2xlID0gKFNPQVBSb2xlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQUm9sZShzb2FwUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qoc29hcFJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRTogewotCQkJCVBvcnROYW1lIHBvcnROYW1lID0gKFBvcnROYW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQb3J0TmFtZShwb3J0TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QocG9ydE5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX1RZUEU6IHsKLQkJCQlEZXNjcmlwdGlvblR5cGUgZGVzY3JpcHRpb25UeXBlID0gKERlc2NyaXB0aW9uVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25UeXBlKGRlc2NyaXB0aW9uVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb24oZGVzY3JpcHRpb25UeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChkZXNjcmlwdGlvblR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9UWVBFOiB7Ci0JCQkJRGlzcGxheU5hbWVUeXBlIGRpc3BsYXlOYW1lVHlwZSA9IChEaXNwbGF5TmFtZVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURpc3BsYXlOYW1lVHlwZShkaXNwbGF5TmFtZVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc3BsYXlOYW1lKGRpc3BsYXlOYW1lVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoZGlzcGxheU5hbWVUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5pdCBQYXJhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Jbml0IFBhcmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSW5pdFBhcmFtKEluaXRQYXJhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNPQVAgSGVhZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNPQVAgSGVhZGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlcihTT0FQSGVhZGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U09BUCBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNPQVAgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBSb2xlKFNPQVBSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBvcnROYW1lKFBvcnROYW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25UeXBlKERlc2NyaXB0aW9uVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KMkVFRSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VEaXNwbGF5TmFtZShEaXNwbGF5TmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlFOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlFOYW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlUU5hbWUoUU5hbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Xc2NvbW1vblN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNmZmYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5FSkIgQXJ0aWZhY3QgRWRpdCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIHRoZSB3ZWIgc2VydmljZXMgY29tbW9uIG1vZGVsIGFwaS4gVXNpbmcgdGhpcyBhcGkgdGhlIGNvbW1vbiB3ZWIgc2VydmljZXMgbW9kZWwgYXJ0aWZhY3RzIChTb2FwSGVhZGVycywgUG9ydHMsIERpc3BsYXlOYW1lLCBJbml0UGFyYW1zIGV0Yy4pIAotICAgICAgICBjYW4gYmUgY3JlYXRlZCBhbmQgYWNjZXNzZWQuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvQmVhbkxpbmsuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9CZWFuTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmM1ZGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9CZWFuTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CZWFuIExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEJlYW5MaW5rKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5MaW5rIGV4dGVuZHMgSjJFRUVPYmplY3QgewotIC8vIEJlYW5MaW5rCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvRUpCTGluay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL0VKQkxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1NDE5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvRUpCTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RUpCIExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEgV2ViIFNlcnZpY2UgRW5kcG9pbnQuCi0gKiAKLSAqIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlLgotICogCi0gKiBVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbgotICogCi0gKiBFeGFtcGxlczoKLSAqIDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0gKiAJPGVqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkI8L2VqYi1saW5rPgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbmsjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRFSkJMaW5rKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkxpbmsgZXh0ZW5kcyBCZWFuTGluayB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIExpbms8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVqYkxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEVKQkxpbmtfRWpiTGluaygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0RWpiTGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbmsjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWpiTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEVqYkxpbmsoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFSkJMaW5rCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1OTZkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGFuZGxlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4KLSAqIAotICogVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJOYW1lIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJDbGFzcyA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldFNvYXBIZWFkZXJzIDxlbT5Tb2FwIEhlYWRlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldFNvYXBSb2xlcyA8ZW0+U29hcCBSb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSGFuZGxlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SGFuZGxlck5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJfSGFuZGxlck5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldEhhbmRsZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRIYW5kbGVyTmFtZSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIYW5kbGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEhhbmRsZXJOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SGFuZGxlckNsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SGFuZGxlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRIYW5kbGVyQ2xhc3MgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRIYW5kbGVyQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW19LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJfSW5pdFBhcmFtcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldEluaXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgSGVhZGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgSGVhZGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgSGVhZGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldFNvYXBIZWFkZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgUm9sZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIFJvbGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJfU29hcFJvbGVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRTb2FwUm9sZXMoKTsKLQotfSAvLyBIYW5kbGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvSGFuZGxlckNoYWluLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvSGFuZGxlckNoYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzkwYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL0hhbmRsZXJDaGFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSGFuZGxlckNoYWluLmphdmEsdiAxLjEgMjAwNy8xMi8xMiAyMjo1NzoxMyBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGFuZGxlciBDaGFpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4KLSAqIAotICogVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4jZ2V0U2VydmljZU5hbWVQYXR0ZXJuIDxlbT5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbiNnZXRQb3J0TmFtZVBhdHRlcm4gPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldFByb3RvY29sQmluZGluZ3MgPGVtPlByb3RvY29sIEJpbmRpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJDaGFpbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIYW5kbGVyQ2hhaW4gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlTmFtZVBhdHRlcm4oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJDaGFpbl9TZXJ2aWNlTmFtZVBhdHRlcm4oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldFNlcnZpY2VOYW1lUGF0dGVybiA8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VOYW1lUGF0dGVybihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBOYW1lIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQb3J0TmFtZVBhdHRlcm4oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJDaGFpbl9Qb3J0TmFtZVBhdHRlcm4oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UG9ydE5hbWVQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldFBvcnROYW1lUGF0dGVybiA8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3J0TmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvcnROYW1lUGF0dGVybihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvdG9jb2wgQmluZGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3RvY29sIEJpbmRpbmdzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdG9jb2wgQmluZGluZ3M8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlckNoYWluX1Byb3RvY29sQmluZGluZ3MoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQcm90b2NvbEJpbmRpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhbmRsZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlckNoYWluX0hhbmRsZXJzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SGFuZGxlcnMoKTsKLQotfSAvLyBIYW5kbGVyQ2hhaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9IYW5kbGVyc0NoYWlucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL0hhbmRsZXJzQ2hhaW5zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YmUwYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL0hhbmRsZXJzQ2hhaW5zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEhhbmRsZXJzQ2hhaW5zLmphdmEsdiAxLjEgMjAwNy8xMi8xMiAyMjo1NzoxMyBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGFuZGxlcnMgQ2hhaW5zPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhIFdlYiBTZXJ2aWNlIEVuZHBvaW50LgotICogCi0gKiBUaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZS4KLSAqIAotICogVXNlZCBpbjogc2VydmljZS1pbXBsLWJlYW4KLSAqIAotICogRXhhbXBsZXM6Ci0gKiA8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgotICogCTxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyc0NoYWlucyNnZXRIYW5kbGVyQ2hhaW4gPGVtPkhhbmRsZXIgQ2hhaW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRIYW5kbGVyc0NoYWlucygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIYW5kbGVyc0NoYWlucyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyIENoYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYW5kbGVyIENoYWluPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBDaGFpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRIYW5kbGVyc0NoYWluc19IYW5kbGVyQ2hhaW4oKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SGFuZGxlckNoYWluKCk7Ci0KLX0gLy8gSGFuZGxlcnNDaGFpbnMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Qb3J0Q29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvUG9ydENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDJlNzg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Qb3J0Q29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgcG9ydC1jb21wb25lbnQgZWxlbWVudCBhc3NvY2lhdGVzIGEgV1NETCBwb3J0IHdpdGggYSBXZWIgc2VydmljZSBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhIGNvbXBvbmVudCwgb3B0aW9uYWwgZGVzY3JpcHRpb24sIG9wdGlvbmFsIGRpc3BsYXkgbmFtZSwgb3B0aW9uYWwgaWNvbmljIHJlcHJlc2VudGF0aW9ucywgV1NETCBwb3J0IFFOYW1lLCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSwgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0UG9ydENvbXBvbmVudE5hbWUgPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFdzZGxQb3J0IDxlbT5Xc2RsIFBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNlcnZpY2VJbXBsQmVhbiA8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREaXNwbGF5TmFtZVR5cGUgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRJY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRXc2RsU2VydmljZSA8ZW0+V3NkbCBTZXJ2aWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNpc0VuYWJsZU10b20gPGVtPkVuYWJsZSBNdG9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRQcm90b2NvbEJpbmRpbmcgPGVtPlByb3RvY29sIEJpbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEhhbmRsZXJDaGFpbnMgPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQb3J0Q29tcG9uZW50IGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQgY29tcG9uZW50J3MgbmFtZS4gVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUgcHJvZHVjZXIgdG8gbmFtZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZSBtb2R1bGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIGFtb25nIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4KLQkgKiAKLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9ydENvbXBvbmVudE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfUG9ydENvbXBvbmVudE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFBvcnRDb21wb25lbnROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRQb3J0Q29tcG9uZW50TmFtZSA8ZW0+UG9ydCBDb21wb25lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UG9ydENvbXBvbmVudE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgcG9ydCBjb21wb25lbnQncyBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZS4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTbWFsbEljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfU21hbGxJY29uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRTbWFsbEljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhcmdlSWNvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9MYXJnZUljb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldExhcmdlSWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERpc3BsYXlOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdzZGxQb3J0KFdTRExQb3J0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExQb3J0IGdldFdzZGxQb3J0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRXc2RsUG9ydCA8ZW0+V3NkbCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsUG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxQb3J0KFdTRExQb3J0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgSW1wbCBCZWFuPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlSW1wbEJlYW4oU2VydmljZUltcGxCZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU2VydmljZUltcGxCZWFuIGdldFNlcnZpY2VJbXBsQmVhbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U2VydmljZUltcGxCZWFuIDxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW1wbEJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRTZXJ2aWNlSW1wbEJlYW4oU2VydmljZUltcGxCZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYW5kbGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfSGFuZGxlcnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRIYW5kbGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb25UeXBlKERlc2NyaXB0aW9uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uVHlwZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRGVzY3JpcHRpb25UeXBlIGdldERlc2NyaXB0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RGVzY3JpcHRpb25UeXBlKERlc2NyaXB0aW9uVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWUgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREaXNwbGF5TmFtZVR5cGUoRGlzcGxheU5hbWVUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWVUeXBlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBEaXNwbGF5TmFtZVR5cGUgZ2V0RGlzcGxheU5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREaXNwbGF5TmFtZVR5cGUgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldERpc3BsYXlOYW1lVHlwZShEaXNwbGF5TmFtZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbiBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb24gVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb24gVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SWNvblR5cGUoSWNvblR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9JY29uVHlwZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgSWNvblR5cGUgZ2V0SWNvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEljb25UeXBlIDxlbT5JY29uIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEljb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWNvblR5cGUoSWNvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBTZXJ2aWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIFNlcnZpY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBTZXJ2aWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXc2RsU2VydmljZShXU0RMU2VydmljZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X1dzZGxTZXJ2aWNlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXU0RMU2VydmljZSBnZXRXc2RsU2VydmljZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0V3NkbFNlcnZpY2UgPGVtPldzZGwgU2VydmljZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBTZXJ2aWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsU2VydmljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V3NkbFNlcnZpY2UoV1NETFNlcnZpY2UgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW5hYmxlIE10b208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbmFibGUgTXRvbTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmFibGUgTXRvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW5hYmxlTXRvbShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfRW5hYmxlTXRvbSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VuYWJsZU10b20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2lzRW5hYmxlTXRvbSA8ZW0+RW5hYmxlIE10b208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVuYWJsZSBNdG9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0VuYWJsZU10b20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVuYWJsZU10b20oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm90b2NvbCBCaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm90b2NvbCBCaW5kaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3RvY29sIEJpbmRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb3RvY29sQmluZGluZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9Qcm90b2NvbEJpbmRpbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvdG9jb2xCaW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRQcm90b2NvbEJpbmRpbmcgPGVtPlByb3RvY29sIEJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb3RvY29sIEJpbmRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb3RvY29sQmluZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvdG9jb2xCaW5kaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyIENoYWluczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEhhbmRsZXJDaGFpbnMoSGFuZGxlcnNDaGFpbnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVyQ2hhaW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhhbmRsZXJzQ2hhaW5zIGdldEhhbmRsZXJDaGFpbnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEhhbmRsZXJDaGFpbnMgPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENoYWluczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFuZGxlckNoYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFuZGxlckNoYWlucyhIYW5kbGVyc0NoYWlucyB2YWx1ZSk7Ci0KLX0gLy8gUG9ydENvbXBvbmVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1NlcnZpY2VJbXBsQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1NlcnZpY2VJbXBsQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzUzMmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9TZXJ2aWNlSW1wbEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgSW1wbCBCZWFuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgZGVmaW5lcyB0aGUgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uQSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNhbiBiZSBhbiBFSkIgYmVhbiBjbGFzcyBvciBKQVgtUlBDIHdlYiBjb21wb25lbnQuIEV4aXN0aW5nIEVKQiBpbXBsZW1lbnRhdGlvbnMgYXJlIGV4cG9zZWQgYXMgYSBXZWIgc2VydmljZSB1c2luZyBhbiBlamItbGluay4KLSAqIAotICogVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0RUVKQkxpbmsgPGVtPkVFSkIgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRFU2VydmxldExpbmsgPGVtPkVTZXJ2bGV0IExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0QmVhbkxpbmsgPGVtPkJlYW4gTGluazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFNlcnZpY2VJbXBsQmVhbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlSW1wbEJlYW4gZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUVKQiBMaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVFSkIgTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FRUpCIExpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVFSkJMaW5rKEVKQkxpbmspCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFSkJMaW5rIGdldEVFSkJMaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuI2dldEVFSkJMaW5rIDxlbT5FRUpCIExpbms8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FRUpCIExpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVFSkJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RUVKQkxpbmsoRUpCTGluayB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FU2VydmxldCBMaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVTZXJ2bGV0IExpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVNlcnZsZXQgTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RVNlcnZsZXRMaW5rKFNlcnZsZXRMaW5rKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFNlcnZsZXRMaW5rIGdldEVTZXJ2bGV0TGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRFU2VydmxldExpbmsgPGVtPkVTZXJ2bGV0IExpbms8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FU2VydmxldCBMaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFU2VydmxldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRFU2VydmxldExpbmsoU2VydmxldExpbmsgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmVhbiBMaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJlYW4gTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CZWFuIExpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEJlYW5MaW5rKEJlYW5MaW5rKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgQmVhbkxpbmsgZ2V0QmVhbkxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0QmVhbkxpbmsgPGVtPkJlYW4gTGluazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QmVhbkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRCZWFuTGluayhCZWFuTGluayB2YWx1ZSk7Ci0KLX0gLy8gU2VydmljZUltcGxCZWFuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvU2VydmxldExpbmsuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9TZXJ2bGV0TGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODcyYzNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9TZXJ2bGV0TGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmxldCBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHNlcnZsZXQtbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGEgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuIGlzIGRlZmluZWQgYXMgYSBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQuCi0gKiAKLSAqIFRoZSB2YWx1ZSBvZiB0aGUgc2VydmxldC1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgc2VydmxldC1uYW1lIG9mIGEgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50IGluIHRoZSBzYW1lIFdBUiBmaWxlLgotICogCi0gKiBVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rI2dldFNlcnZsZXRMaW5rIDxlbT5TZXJ2bGV0IExpbms8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRTZXJ2bGV0TGluaygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2bGV0TGluayBleHRlbmRzIEJlYW5MaW5rIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2bGV0IExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VydmxldExpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRTZXJ2bGV0TGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rI2dldFNlcnZsZXRMaW5rIDxlbT5TZXJ2bGV0IExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2bGV0IExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcnZsZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0U2VydmxldExpbmsoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTZXJ2bGV0TGluawpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dTRExQb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV1NETFBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgxMmRjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV1NETFBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBQb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRGVmaW5lcyB0aGUgbmFtZSBzcGFjZSBhbmQgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBXU0RMIHBvcnQgUU5hbWUuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V1NETFBvcnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFBvcnQgZXh0ZW5kcyBRTmFtZSB7Ci0gLy8gV1NETFBvcnQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9XU0RMU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dTRExTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTkzYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dTRExTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdTRExTZXJ2aWNlLmphdmEsdiAxLjEgMjAwNy8xMi8xMiAyMjo1NzoxMyBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBTZXJ2aWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRGVmaW5lcyB0aGUgbmFtZSBzcGFjZSBhbmQgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBXU0RMIHBvcnQgUU5hbWUuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V1NETFNlcnZpY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFNlcnZpY2UgZXh0ZW5kcyBRTmFtZSB7Ci19IC8vIFdTRExTZXJ2aWNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV2ViU2VydmljZURlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV2ViU2VydmljZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNGQwZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24gZWxlbWVudCBkZWZpbmVzIGEgV1NETCBkb2N1bWVudCBmaWxlIGFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMgZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gIFRoZXJlIG1heSBiZSBtdWx0aXBsZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIG1vZHVsZS4KLSAqIAotICogQWxsIFdTREwgZmlsZSBwb3J0cyBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHBvcnQtY29tcG9uZW50IGVsZW1lbnQgZGVmaW5lZC4KLSAqIAotICogVXNlZCBpbjogd2Vic2VydmljZXMKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0UG9ydENvbXBvbmVudHMgPGVtPlBvcnQgQ29tcG9uZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREZXNjcmlwdGlvblR5cGUgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGlzcGxheU5hbWVUeXBlIDxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRJY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5KYXhycGMgTWFwcGluZyBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGpheHJwYy1tYXBwaW5nLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdCBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIFdTREwgZGVzY3JpcHRpb24gaW4gdGhlIHdzZGwtZmlsZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEpheHJwY01hcHBpbmdGaWxlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldEpheHJwY01hcHBpbmdGaWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldEpheHJwY01hcHBpbmdGaWxlIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRKYXhycGNNYXBwaW5nRmlsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZiBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDIG1hcHBpbmcuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCSAqIAotCSAqIAotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lIDxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIEZpbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHdzZGwtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgV1NETCBmaWxlIGluIHRoZSBtb2R1bGUuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdzZGxGaWxlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV3NkbEZpbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFdzZGxGaWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFdzZGxGaWxlIDxlbT5Xc2RsIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbEZpbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTbWFsbEljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9TbWFsbEljb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFNtYWxsSWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXJnZUljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9MYXJnZUljb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldExhcmdlSWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRMYXJnZUljb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERpc3BsYXlOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Qb3J0Q29tcG9uZW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRQb3J0Q29tcG9uZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb25UeXBlKERlc2NyaXB0aW9uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBEZXNjcmlwdGlvblR5cGUgZ2V0RGVzY3JpcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERlc2NyaXB0aW9uVHlwZSA8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldERlc2NyaXB0aW9uVHlwZShEZXNjcmlwdGlvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWVUeXBlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBEaXNwbGF5TmFtZVR5cGUgZ2V0RGlzcGxheU5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERpc3BsYXlOYW1lVHlwZSA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWNvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJY29uVHlwZShJY29uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEljb25UeXBlIGdldEljb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldEljb25UeXBlIDxlbT5JY29uIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEljb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWNvblR5cGUoSWNvblR5cGUgdmFsdWUpOwotCi19IC8vIFdlYlNlcnZpY2VEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dlYlNlcnZpY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV2ViU2VydmljZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiNmI2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV2ViU2VydmljZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2ViIFNlcnZpY2VzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHdlYnNlcnZpY2VzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIHdlYiBzZXJ2aWNlcyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBXZWIgc2VydmljZSBkZXNjcmlwdGlvbnMgdGhhdCBhcmUgdG8gYmUgZGVwbG95ZWQgaW50byB0aGUgSjJFRSBBcHBsaWNhdGlvbiBTZXJ2ZXIgYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGhleSBoYXZlIG9uIGNvbnRhaW5lciByZXNvdXJjZXMgYW5kIHNlcnZpY2VzLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMgPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VzKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VzIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKTsKLQotfSAvLyBXZWJTZXJ2aWNlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5ZjdiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3NkZEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdzZGRGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlYiBTZXJ2aWNlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlYiBTZXJ2aWNlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdlYlNlcnZpY2VzIGNyZWF0ZVdlYlNlcnZpY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBDb21wb25lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBQb3J0Q29tcG9uZW50IGNyZWF0ZVBvcnRDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBQb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBQb3J0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETFBvcnQgY3JlYXRlV1NETFBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFNlcnZpY2VJbXBsQmVhbiBjcmVhdGVTZXJ2aWNlSW1wbEJlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU2VydmxldExpbmsgY3JlYXRlU2VydmxldExpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RUpCIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FSkIgTGluazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVKQkxpbmsgY3JlYXRlRUpCTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IYW5kbGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGFuZGxlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEhhbmRsZXIgY3JlYXRlSGFuZGxlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CZWFuIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJlYW4gTGluazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmVhbkxpbmsgY3JlYXRlQmVhbkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBTZXJ2aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIFNlcnZpY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdTRExTZXJ2aWNlIGNyZWF0ZVdTRExTZXJ2aWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhhbmRsZXIgQ2hhaW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhhbmRsZXIgQ2hhaW48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhhbmRsZXJDaGFpbiBjcmVhdGVIYW5kbGVyQ2hhaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGFuZGxlcnMgQ2hhaW5zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IYW5kbGVycyBDaGFpbnM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhhbmRsZXJzQ2hhaW5zIGNyZWF0ZUhhbmRsZXJzQ2hhaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIG1ldGhvZCBpcyBOT1QgYXBpLCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuICAKLQkgKiBFTUYgcGFja2FnZSBjbGFzc2VzIHNob3VsZCBiZSBhY2Nlc3MgdmlhIHRoZWlyICJlSU5TVEFOQ0UiIHN0YXRpYyBmaWVsZHMKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXc2RkUGFja2FnZSBnZXRXc2RkUGFja2FnZSgpOwotCi19IC8vV3NkZEZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Xc2RkUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjUwYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiAvKioKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdzZGRQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZU5BTUUgPSAid3NkZCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBlTlNfVVJJID0gIndzZGQueG1pIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdzZGRQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzSW1wbCA8ZW0+V2ViIFNlcnZpY2VzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFdlYlNlcnZpY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFU19fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VTX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRVNfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFU19fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRVNfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFU19fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VTX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBEZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V2ViIFNlcnZpY2VzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VTX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwgPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXhycGMgTWFwcGluZyBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV1NETF9GSUxFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1BPUlRfQ09NUE9ORU5UUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUVfVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb24gVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsIDxlbT5Qb3J0IENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fUE9SVF9DT01QT05FTlRfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgSW1wbCBCZWFuPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9JTVBMX0JFQU4gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fSEFORExFUlMgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT05fVFlQRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZSBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbiBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgU2VydmljZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPUlRfQ09NUE9ORU5UX19XU0RMX1NFUlZJQ0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlIE10b208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9fRU5BQkxFX01UT00gPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvdG9jb2wgQmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPUlRfQ09NUE9ORU5UX19QUk9UT0NPTF9CSU5ESU5HID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2hhaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlRfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV1NETFBvcnRJbXBsIDxlbT5XU0RMIFBvcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV1NETFBvcnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0V1NETFBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9QT1JUX19OQU1FU1BBQ0VfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBQYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfX0xPQ0FMX1BBUlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbWJpbmVkIFFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfX0NPTUJJTkVEX1FOQU1FID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fQ09NQklORURfUU5BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9QT1JUX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XU0RMIFBvcnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsQmVhbkltcGwgPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsQmVhbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlSW1wbEJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfSU1QTF9CRUFOID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRUpCIExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfSU1QTF9CRUFOX19FRUpCX0xJTksgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU2VydmxldCBMaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJlYW4gTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9JTVBMX0JFQU5fX0JFQU5fTElOSyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9JTVBMX0JFQU5fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5CZWFuTGlua0ltcGwgPGVtPkJlYW4gTGluazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5CZWFuTGlua0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRCZWFuTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgQkVBTl9MSU5LID0gODsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CZWFuIExpbms8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBCRUFOX0xJTktfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TGlua0ltcGwgPGVtPlNlcnZsZXQgTGluazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TGlua0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRTZXJ2bGV0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgU0VSVkxFVF9MSU5LID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0IExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LID0gQkVBTl9MSU5LX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZsZXQgTGluazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZMRVRfTElOS19GRUFUVVJFX0NPVU5UID0gQkVBTl9MSU5LX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5FSkJMaW5rSW1wbCA8ZW0+RUpCIExpbms8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuRUpCTGlua0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRFSkJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBFSkJfTElOSyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEVKQl9MSU5LX19FSkJfTElOSyA9IEJFQU5fTElOS19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FSkIgTGluazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEVKQl9MSU5LX0ZFQVRVUkVfQ09VTlQgPSBCRUFOX0xJTktfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsIDxlbT5IYW5kbGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgSEFORExFUiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSEFORExFUl9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSEFORExFUl9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSEFORExFUl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSEFORExFUl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEhBTkRMRVJfX0hBTkRMRVJfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19IQU5ETEVSX0NMQVNTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEhBTkRMRVJfX0lOSVRfUEFSQU1TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgSGVhZGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19TT0FQX0hFQURFUlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19TT0FQX1JPTEVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkhhbmRsZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV1NETFNlcnZpY2VJbXBsIDxlbT5XU0RMIFNlcnZpY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XU0RMU2VydmljZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRXU0RMU2VydmljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXU0RMX1NFUlZJQ0UgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXU0RMX1NFUlZJQ0VfX05BTUVTUEFDRV9VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIFBhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXU0RMX1NFUlZJQ0VfX0xPQ0FMX1BBUlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbWJpbmVkIFFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV1NETF9TRVJWSUNFX19DT01CSU5FRF9RTkFNRSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXU0RMX1NFUlZJQ0VfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwgU2VydmljZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXU0RMX1NFUlZJQ0VfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJDaGFpbkltcGwgPGVtPkhhbmRsZXIgQ2hhaW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVyQ2hhaW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0SGFuZGxlckNoYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhBTkRMRVJfQ0hBSU4gPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3RvY29sIEJpbmRpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX0NIQUlOX19QUk9UT0NPTF9CSU5ESU5HUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX0NIQUlOX19IQU5ETEVSUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2hhaW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9DSEFJTl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJzQ2hhaW5zSW1wbCA8ZW0+SGFuZGxlcnMgQ2hhaW5zPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlcnNDaGFpbnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0SGFuZGxlcnNDaGFpbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSEFORExFUlNfQ0hBSU5TID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlciBDaGFpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUlNfQ0hBSU5TX19IQU5ETEVSX0NIQUlOID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SGFuZGxlcnMgQ2hhaW5zPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJTX0NIQUlOU19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlcyA8ZW0+V2ViIFNlcnZpY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XZWIgU2VydmljZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXZWJTZXJ2aWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlcyNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zIDxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXMjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uIDxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9KYXhycGNNYXBwaW5nRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUgPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0V3NkbEZpbGUoKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Xc2RsRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRTbWFsbEljb24oKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9TbWFsbEljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0TGFyZ2VJY29uKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fTGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFBvcnRDb21wb25lbnRzIDxlbT5Qb3J0IENvbXBvbmVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3J0IENvbXBvbmVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFBvcnRDb21wb25lbnRzKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREZXNjcmlwdGlvblR5cGUgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGVzY3JpcHRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGlzcGxheU5hbWVUeXBlIDxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGlzcGxheU5hbWVUeXBlKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0SWNvblR5cGUgPGVtPkljb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JY29uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldEljb25UeXBlKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50IDxlbT5Qb3J0IENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9ydCBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFBvcnRDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0UG9ydENvbXBvbmVudE5hbWUgPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9ydCBDb21wb25lbnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFBvcnRDb21wb25lbnROYW1lKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9Qb3J0Q29tcG9uZW50TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNtYWxsIEljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRTbWFsbEljb24oKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X1NtYWxsSWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldExhcmdlSWNvbigpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfTGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERpc3BsYXlOYW1lKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRXc2RsUG9ydCA8ZW0+V3NkbCBQb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldzZGwgUG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFdzZGxQb3J0KCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRTZXJ2aWNlSW1wbEJlYW4gPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U2VydmljZUltcGxCZWFuKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlSW1wbEJlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRIYW5kbGVycyA8ZW0+SGFuZGxlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IYW5kbGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEhhbmRsZXJzKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREZXNjcmlwdGlvblR5cGUgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERlc2NyaXB0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERpc3BsYXlOYW1lVHlwZSA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREaXNwbGF5TmFtZVR5cGUoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRJY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkljb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEljb25UeXBlKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9JY29uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRXc2RsU2VydmljZSA8ZW0+V3NkbCBTZXJ2aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V3NkbCBTZXJ2aWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0V3NkbFNlcnZpY2UoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfV3NkbFNlcnZpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjaXNFbmFibGVNdG9tIDxlbT5FbmFibGUgTXRvbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVuYWJsZSBNdG9tPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjaXNFbmFibGVNdG9tKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X0VuYWJsZU10b20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0UHJvdG9jb2xCaW5kaW5nIDxlbT5Qcm90b2NvbCBCaW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvdG9jb2wgQmluZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFByb3RvY29sQmluZGluZygpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9Qcm90b2NvbEJpbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0SGFuZGxlckNoYWlucyA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5IYW5kbGVyIENoYWluczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEhhbmRsZXJDaGFpbnMoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfSGFuZGxlckNoYWlucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0IDxlbT5XU0RMIFBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldTREwgUG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFdTRExQb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuIDxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0U2VydmljZUltcGxCZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0RUVKQkxpbmsgPGVtPkVFSkIgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FRUpCIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuI2dldEVFSkJMaW5rKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW1wbEJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlSW1wbEJlYW5fRUVKQkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRFU2VydmxldExpbmsgPGVtPkVTZXJ2bGV0IExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RVNlcnZsZXQgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0RVNlcnZsZXRMaW5rKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW1wbEJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlSW1wbEJlYW5fRVNlcnZsZXRMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0QmVhbkxpbmsgPGVtPkJlYW4gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5CZWFuIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuI2dldEJlYW5MaW5rKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW1wbEJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluayA8ZW0+U2VydmxldCBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXJ2bGV0IExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRTZXJ2bGV0TGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmsjZ2V0U2VydmxldExpbmsgPGVtPlNlcnZsZXQgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2bGV0IExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmsjZ2V0U2VydmxldExpbmsoKQotCSAqIEBzZWUgI2dldFNlcnZsZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0U2VydmxldExpbmtfU2VydmxldExpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rIDxlbT5FSkIgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RUpCIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEVKQkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbmsjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWpiIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluayNnZXRFamJMaW5rKCkKLQkgKiBAc2VlICNnZXRFSkJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0RUpCTGlua19FamJMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciA8ZW0+SGFuZGxlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SGFuZGxlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0SGFuZGxlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRIYW5kbGVyTmFtZSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhbmRsZXIgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJOYW1lKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRIYW5kbGVyQ2xhc3MgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFuZGxlciBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJDbGFzcygpCi0JICogQHNlZSAjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Jbml0IFBhcmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEluaXRQYXJhbXMoKQotCSAqIEBzZWUgI2dldEhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRIYW5kbGVyX0luaXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRTb2FwSGVhZGVycyA8ZW0+U29hcCBIZWFkZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U29hcCBIZWFkZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0U29hcEhlYWRlcnMoKQotCSAqIEBzZWUgI2dldEhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0U29hcFJvbGVzIDxlbT5Tb2FwIFJvbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U29hcCBSb2xlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldFNvYXBSb2xlcygpCi0JICogQHNlZSAjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEhhbmRsZXJfU29hcFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbmsgPGVtPkJlYW4gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmVhbiBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0QmVhbkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMU2VydmljZSA8ZW0+V1NETCBTZXJ2aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldTREwgU2VydmljZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMU2VydmljZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V1NETFNlcnZpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4gPGVtPkhhbmRsZXIgQ2hhaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SGFuZGxlciBDaGFpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEhhbmRsZXJDaGFpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldFNlcnZpY2VOYW1lUGF0dGVybiA8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4jZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2hhaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEhhbmRsZXJDaGFpbl9TZXJ2aWNlTmFtZVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbiNnZXRQb3J0TmFtZVBhdHRlcm4gPGVtPlBvcnQgTmFtZSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldFBvcnROYW1lUGF0dGVybigpCi0JICogQHNlZSAjZ2V0SGFuZGxlckNoYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRIYW5kbGVyQ2hhaW5fUG9ydE5hbWVQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbiNnZXRQcm90b2NvbEJpbmRpbmdzIDxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UHJvdG9jb2wgQmluZGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldFByb3RvY29sQmluZGluZ3MoKQotCSAqIEBzZWUgI2dldEhhbmRsZXJDaGFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SGFuZGxlckNoYWluX1Byb3RvY29sQmluZGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SGFuZGxlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluI2dldEhhbmRsZXJzKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2hhaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEhhbmRsZXJDaGFpbl9IYW5kbGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJzQ2hhaW5zIDxlbT5IYW5kbGVycyBDaGFpbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SGFuZGxlcnMgQ2hhaW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJzQ2hhaW5zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRIYW5kbGVyc0NoYWlucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyc0NoYWlucyNnZXRIYW5kbGVyQ2hhaW4gPGVtPkhhbmRsZXIgQ2hhaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhhbmRsZXIgQ2hhaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcnNDaGFpbnMjZ2V0SGFuZGxlckNoYWluKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyc0NoYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SGFuZGxlcnNDaGFpbnNfSGFuZGxlckNoYWluKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdzZGRGYWN0b3J5IGdldFdzZGRGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0ltcGwgPGVtPldlYiBTZXJ2aWNlczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRXZWJTZXJ2aWNlcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXRUJfU0VSVklDRVMgPSBlSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXRUJfU0VSVklDRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpheHJwYyBNYXBwaW5nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRSA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dTRExfRklMRSA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV3NkbEZpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fU01BTExfSUNPTiA9IGVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fU21hbGxJY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0xBUkdFX0lDT04gPSBlSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0xhcmdlSWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Qb3J0Q29tcG9uZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZSBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFID0gZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkljb24gVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0ljb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCA8ZW0+UG9ydCBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRQb3J0Q29tcG9uZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBPUlRfQ09NUE9ORU5UID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX0NPTVBPTkVOVF9fUE9SVF9DT01QT05FTlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1BvcnRDb21wb25lbnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfQ09NUE9ORU5UX19TTUFMTF9JQ09OID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfU21hbGxJY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9SVF9DT01QT05FTlRfX0xBUkdFX0lDT04gPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9MYXJnZUljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVCA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEltcGwgQmVhbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTiA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VJbXBsQmVhbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBPUlRfQ09NUE9ORU5UX19IQU5ETEVSUyA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZSBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSWNvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgU2VydmljZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBPUlRfQ09NUE9ORU5UX19XU0RMX1NFUlZJQ0UgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9Xc2RsU2VydmljZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlIE10b208L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX0NPTVBPTkVOVF9fRU5BQkxFX01UT00gPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9FbmFibGVNdG9tKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm90b2NvbCBCaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9SVF9DT01QT05FTlRfX1BST1RPQ09MX0JJTkRJTkcgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9Qcm90b2NvbEJpbmRpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2hhaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSGFuZGxlckNoYWlucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV1NETFBvcnRJbXBsIDxlbT5XU0RMIFBvcnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XU0RMUG9ydEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0V1NETFBvcnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV1NETF9QT1JUID0gZUlOU1RBTkNFLmdldFdTRExQb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbEJlYW5JbXBsIDxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsQmVhbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0U2VydmljZUltcGxCZWFuKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFUlZJQ0VfSU1QTF9CRUFOID0gZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RUVKQiBMaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRUVKQkxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVTZXJ2bGV0IExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRVNlcnZsZXRMaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CZWFuIExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LID0gZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuU2VydmxldExpbmtJbXBsIDxlbT5TZXJ2bGV0IExpbms8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TGlua0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0U2VydmxldExpbmsoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VSVkxFVF9MSU5LID0gZUlOU1RBTkNFLmdldFNlcnZsZXRMaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0IExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0TGlua19TZXJ2bGV0TGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuRUpCTGlua0ltcGwgPGVtPkVKQiBMaW5rPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuRUpCTGlua0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0RUpCTGluaygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFSkJfTElOSyA9IGVJTlNUQU5DRS5nZXRFSkJMaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTGluazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVKQl9MSU5LX19FSkJfTElOSyA9IGVJTlNUQU5DRS5nZXRFSkJMaW5rX0VqYkxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsIDxlbT5IYW5kbGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0SGFuZGxlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBIQU5ETEVSID0gZUlOU1RBTkNFLmdldEhhbmRsZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEhBTkRMRVJfX0hBTkRMRVJfTkFNRSA9IGVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSEFORExFUl9fSEFORExFUl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEhBTkRMRVJfX0lOSVRfUEFSQU1TID0gZUlOU1RBTkNFLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBIQU5ETEVSX19TT0FQX0hFQURFUlMgPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSEFORExFUl9fU09BUF9ST0xFUyA9IGVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBSb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuQmVhbkxpbmtJbXBsIDxlbT5CZWFuIExpbms8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5CZWFuTGlua0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0QmVhbkxpbmsoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQkVBTl9MSU5LID0gZUlOU1RBTkNFLmdldEJlYW5MaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XU0RMU2VydmljZUltcGwgPGVtPldTREwgU2VydmljZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldTRExTZXJ2aWNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRXU0RMU2VydmljZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXU0RMX1NFUlZJQ0UgPSBlSU5TVEFOQ0UuZ2V0V1NETFNlcnZpY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJDaGFpbkltcGwgPGVtPkhhbmRsZXIgQ2hhaW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVyQ2hhaW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldEhhbmRsZXJDaGFpbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBIQU5ETEVSX0NIQUlOID0gZUlOU1RBTkNFLmdldEhhbmRsZXJDaGFpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBIQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRIYW5kbGVyQ2hhaW5fU2VydmljZU5hbWVQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWUgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEhBTkRMRVJfQ0hBSU5fX1BPUlRfTkFNRV9QQVRURVJOID0gZUlOU1RBTkNFLmdldEhhbmRsZXJDaGFpbl9Qb3J0TmFtZVBhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3RvY29sIEJpbmRpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBIQU5ETEVSX0NIQUlOX19QUk9UT0NPTF9CSU5ESU5HUyA9IGVJTlNUQU5DRS5nZXRIYW5kbGVyQ2hhaW5fUHJvdG9jb2xCaW5kaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEhBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTID0gZUlOU1RBTkNFLmdldEhhbmRsZXJDaGFpbl9IYW5kbGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlcnNDaGFpbnNJbXBsIDxlbT5IYW5kbGVycyBDaGFpbnM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVyc0NoYWluc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0SGFuZGxlcnNDaGFpbnMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSEFORExFUlNfQ0hBSU5TID0gZUlOU1RBTkNFLmdldEhhbmRsZXJzQ2hhaW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIENoYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBIQU5ETEVSU19DSEFJTlNfX0hBTkRMRVJfQ0hBSU4gPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlcnNDaGFpbnNfSGFuZGxlckNoYWluKCk7Ci0KLQl9Ci0KLX0gLy9Xc2RkUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjI0MDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Xc2RkUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotCi0vKioKLSAqQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdzZGRSZXNvdXJjZSBleHRlbmRzIFhNTFJlc291cmNlCi17Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUJfU0VSVklDRV9UWVBFID0gNjsKLQotCS8qKgotCSAqIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBtb2RlbCBvYmplY3QgV2ViU2VydmljZXMKLQkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgbW9kZWwgb2JqZWN0IFdlYlNlcnZpY2VzIAotCSAqLwotCVdlYlNlcnZpY2VzIGdldFdlYlNlcnZpY2VzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBXZWJTZXJ2aWNlIGlzIG9mIHZlcnNpb24gMS4wCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXZWJTZXJ2aWNlMV8wKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBXZWJTZXJ2aWNlIGlzIG9mIHZlcnNpb24gMS4xCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXZWJTZXJ2aWNlMV8xKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBXZWJTZXJ2aWNlIGlzIG9mIHZlcnNpb24gMS4yCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXZWJTZXJ2aWNlMV8yKCk7Ci0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvQmVhbkxpbmtJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9CZWFuTGlua0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjYjg1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9CZWFuTGlua0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmVhbiBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmVhbkxpbmtJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgQmVhbkxpbmsKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBCZWFuTGlua0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLkJFQU5fTElOSzsKLQl9Ci0KLX0gLy9CZWFuTGlua0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0VKQkxpbmtJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9FSkJMaW5rSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWY1YjFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0VKQkxpbmtJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVKQiBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5FSkJMaW5rSW1wbCNnZXRFamJMaW5rIDxlbT5FamIgTGluazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQkxpbmtJbXBsIGV4dGVuZHMgQmVhbkxpbmtJbXBsIGltcGxlbWVudHMgRUpCTGluawotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJMaW5rKCkgPGVtPkVqYiBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9MSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkxpbmsoKSA8ZW0+RWpiIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBlamJMaW5rID0gRUpCX0xJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFSkJMaW5rSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3NkZFBhY2thZ2UuTGl0ZXJhbHMuRUpCX0xJTks7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVqYkxpbmsoKSB7Ci0JCXJldHVybiBlamJMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RWpiTGluayhTdHJpbmcgbmV3RWpiTGluaykgewotCQlTdHJpbmcgb2xkRWpiTGluayA9IGVqYkxpbms7Ci0JCWVqYkxpbmsgPSBuZXdFamJMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5FSkJfTElOS19fRUpCX0xJTkssIG9sZEVqYkxpbmssIGVqYkxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkVKQl9MSU5LX19FSkJfTElOSzoKLQkJCQlyZXR1cm4gZ2V0RWpiTGluaygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkVKQl9MSU5LX19FSkJfTElOSzoKLQkJCQlzZXRFamJMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkVKQl9MSU5LX19FSkJfTElOSzoKLQkJCQlzZXRFamJMaW5rKEVKQl9MSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuRUpCX0xJTktfX0VKQl9MSU5LOgotCQkJCXJldHVybiBFSkJfTElOS19FREVGQVVMVCA9PSBudWxsID8gZWpiTGluayAhPSBudWxsIDogIUVKQl9MSU5LX0VERUZBVUxULmVxdWFscyhlamJMaW5rKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZWpiTGluazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWpiTGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0VKQkxpbmtJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9IYW5kbGVyQ2hhaW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9IYW5kbGVyQ2hhaW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTc0NzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlckNoYWluSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSGFuZGxlckNoYWluSW1wbC5qYXZhLHYgMS4xIDIwMDcvMTIvMTIgMjI6NTc6MTMgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IYW5kbGVyIENoYWluPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVyQ2hhaW5JbXBsI2dldFNlcnZpY2VOYW1lUGF0dGVybiA8ZW0+U2VydmljZSBOYW1lIFBhdHRlcm48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJDaGFpbkltcGwjZ2V0UG9ydE5hbWVQYXR0ZXJuIDxlbT5Qb3J0IE5hbWUgUGF0dGVybjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckNoYWluSW1wbCNnZXRQcm90b2NvbEJpbmRpbmdzIDxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckNoYWluSW1wbCNnZXRIYW5kbGVycyA8ZW0+SGFuZGxlcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIYW5kbGVyQ2hhaW5JbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgSGFuZGxlckNoYWluIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkgPGVtPlNlcnZpY2UgTmFtZSBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRV9QQVRURVJOX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VOYW1lUGF0dGVybigpIDxlbT5TZXJ2aWNlIE5hbWUgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VOYW1lUGF0dGVybiA9IFNFUlZJQ0VfTkFNRV9QQVRURVJOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lUGF0dGVybigpIDxlbT5Qb3J0IE5hbWUgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydE5hbWVQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfUEFUVEVSTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZVBhdHRlcm4oKSA8ZW0+UG9ydCBOYW1lIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnROYW1lUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwb3J0TmFtZVBhdHRlcm4gPSBQT1JUX05BTUVfUEFUVEVSTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3RvY29sQmluZGluZ3MoKSA8ZW0+UHJvdG9jb2wgQmluZGluZ3M8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvdG9jb2xCaW5kaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByb3RvY29sQmluZGluZ3M7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVycygpIDxlbT5IYW5kbGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGhhbmRsZXJzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhhbmRsZXJDaGFpbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5IQU5ETEVSX0NIQUlOOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkgewotCQlyZXR1cm4gc2VydmljZU5hbWVQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lUGF0dGVybihTdHJpbmcgbmV3U2VydmljZU5hbWVQYXR0ZXJuKSB7Ci0JCVN0cmluZyBvbGRTZXJ2aWNlTmFtZVBhdHRlcm4gPSBzZXJ2aWNlTmFtZVBhdHRlcm47Ci0JCXNlcnZpY2VOYW1lUGF0dGVybiA9IG5ld1NlcnZpY2VOYW1lUGF0dGVybjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk4sIG9sZFNlcnZpY2VOYW1lUGF0dGVybiwgc2VydmljZU5hbWVQYXR0ZXJuKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiBwb3J0TmFtZVBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9ydE5hbWVQYXR0ZXJuKFN0cmluZyBuZXdQb3J0TmFtZVBhdHRlcm4pIHsKLQkJU3RyaW5nIG9sZFBvcnROYW1lUGF0dGVybiA9IHBvcnROYW1lUGF0dGVybjsKLQkJcG9ydE5hbWVQYXR0ZXJuID0gbmV3UG9ydE5hbWVQYXR0ZXJuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTiwgb2xkUG9ydE5hbWVQYXR0ZXJuLCBwb3J0TmFtZVBhdHRlcm4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UHJvdG9jb2xCaW5kaW5ncygpIHsKLQkJaWYgKHByb3RvY29sQmluZGluZ3MgPT0gbnVsbCkgewotCQkJcHJvdG9jb2xCaW5kaW5ncyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTKTsKLQkJfQotCQlyZXR1cm4gcHJvdG9jb2xCaW5kaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SGFuZGxlcnMoKSB7Ci0JCWlmIChoYW5kbGVycyA9PSBudWxsKSB7Ci0JCQloYW5kbGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChIYW5kbGVyLmNsYXNzLCB0aGlzLCBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19IQU5ETEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRIYW5kbGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk46Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VOYW1lUGF0dGVybigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTjoKLQkJCQlyZXR1cm4gZ2V0UG9ydE5hbWVQYXR0ZXJuKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTOgotCQkJCXJldHVybiBnZXRQcm90b2NvbEJpbmRpbmdzKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTOgotCQkJCXJldHVybiBnZXRIYW5kbGVycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOOgotCQkJCXNldFNlcnZpY2VOYW1lUGF0dGVybigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1BPUlRfTkFNRV9QQVRURVJOOgotCQkJCXNldFBvcnROYW1lUGF0dGVybigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTOgotCQkJCWdldFByb3RvY29sQmluZGluZ3MoKS5jbGVhcigpOwotCQkJCWdldFByb3RvY29sQmluZGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fSEFORExFUlM6Ci0JCQkJZ2V0SGFuZGxlcnMoKS5jbGVhcigpOwotCQkJCWdldEhhbmRsZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTjoKLQkJCQlzZXRTZXJ2aWNlTmFtZVBhdHRlcm4oU0VSVklDRV9OQU1FX1BBVFRFUk5fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fUE9SVF9OQU1FX1BBVFRFUk46Ci0JCQkJc2V0UG9ydE5hbWVQYXR0ZXJuKFBPUlRfTkFNRV9QQVRURVJOX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTOgotCQkJCWdldFByb3RvY29sQmluZGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fSEFORExFUlM6Ci0JCQkJZ2V0SGFuZGxlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTjoKLQkJCQlyZXR1cm4gU0VSVklDRV9OQU1FX1BBVFRFUk5fRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VOYW1lUGF0dGVybiAhPSBudWxsIDogIVNFUlZJQ0VfTkFNRV9QQVRURVJOX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlTmFtZVBhdHRlcm4pOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19QT1JUX05BTUVfUEFUVEVSTjoKLQkJCQlyZXR1cm4gUE9SVF9OQU1FX1BBVFRFUk5fRURFRkFVTFQgPT0gbnVsbCA/IHBvcnROYW1lUGF0dGVybiAhPSBudWxsIDogIVBPUlRfTkFNRV9QQVRURVJOX0VERUZBVUxULmVxdWFscyhwb3J0TmFtZVBhdHRlcm4pOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX0NIQUlOX19QUk9UT0NPTF9CSU5ESU5HUzoKLQkJCQlyZXR1cm4gcHJvdG9jb2xCaW5kaW5ncyAhPSBudWxsICYmICFwcm90b2NvbEJpbmRpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuIGhhbmRsZXJzICE9IG51bGwgJiYgIWhhbmRsZXJzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZpY2VOYW1lUGF0dGVybjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VydmljZU5hbWVQYXR0ZXJuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwb3J0TmFtZVBhdHRlcm46ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvcnROYW1lUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvdG9jb2xCaW5kaW5nczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvdG9jb2xCaW5kaW5ncyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0hhbmRsZXJDaGFpbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9IYW5kbGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRkOTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGFuZGxlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0SGFuZGxlckNsYXNzIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0U29hcEhlYWRlcnMgPGVtPlNvYXAgSGVhZGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0U29hcFJvbGVzIDxlbT5Tb2FwIFJvbGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlckltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBIYW5kbGVyCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJOYW1lKCkgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJOYW1lKCkgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBoYW5kbGVyTmFtZSA9IEhBTkRMRVJfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyQ2xhc3MoKSA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlckNsYXNzKCkgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGhhbmRsZXJDbGFzcyA9IEhBTkRMRVJfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0UGFyYW1zKCkgPGVtPkluaXQgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0UGFyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGluaXRQYXJhbXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwSGVhZGVycygpIDxlbT5Tb2FwIEhlYWRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvYXBIZWFkZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IHNvYXBIZWFkZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcFJvbGVzKCkgPGVtPlNvYXAgUm9sZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvYXBSb2xlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBFTGlzdCBzb2FwUm9sZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBIYW5kbGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3NkZFBhY2thZ2UuTGl0ZXJhbHMuSEFORExFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlck5hbWUoKSB7Ci0JCXJldHVybiBoYW5kbGVyTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJOYW1lKFN0cmluZyBuZXdIYW5kbGVyTmFtZSkgewotCQlTdHJpbmcgb2xkSGFuZGxlck5hbWUgPSBoYW5kbGVyTmFtZTsKLQkJaGFuZGxlck5hbWUgPSBuZXdIYW5kbGVyTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FLCBvbGRIYW5kbGVyTmFtZSwgaGFuZGxlck5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlckNsYXNzKCkgewotCQlyZXR1cm4gaGFuZGxlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNsYXNzKFN0cmluZyBuZXdIYW5kbGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZEhhbmRsZXJDbGFzcyA9IGhhbmRsZXJDbGFzczsKLQkJaGFuZGxlckNsYXNzID0gbmV3SGFuZGxlckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX0NMQVNTLCBvbGRIYW5kbGVyQ2xhc3MsIGhhbmRsZXJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldEluaXRQYXJhbXMoKSB7Ci0JCWlmIChpbml0UGFyYW1zID09IG51bGwpIHsKLQkJCWluaXRQYXJhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5pdFBhcmFtLmNsYXNzLCB0aGlzLCBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRQYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0U29hcEhlYWRlcnMoKSB7Ci0JCWlmIChzb2FwSGVhZGVycyA9PSBudWxsKSB7Ci0JCQlzb2FwSGVhZGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTT0FQSGVhZGVyLmNsYXNzLCB0aGlzLCBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlMpOwotCQl9Ci0JCXJldHVybiBzb2FwSGVhZGVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRTb2FwUm9sZXMoKSB7Ci0JCWlmIChzb2FwUm9sZXMgPT0gbnVsbCkgewotCQkJc29hcFJvbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNPQVBSb2xlLmNsYXNzLCB0aGlzLCBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gc29hcFJvbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U29hcEhlYWRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX1JPTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U29hcFJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUU6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJOYW1lKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJDbGFzcygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdFBhcmFtcygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJcmV0dXJuIGdldFNvYXBIZWFkZXJzKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJcmV0dXJuIGdldFNvYXBSb2xlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlzZXRIYW5kbGVyTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJc2V0SGFuZGxlckNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJZ2V0U29hcEhlYWRlcnMoKS5jbGVhcigpOwotCQkJCWdldFNvYXBIZWFkZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJZ2V0U29hcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTb2FwUm9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlzZXRIYW5kbGVyTmFtZShIQU5ETEVSX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUzoKLQkJCQlzZXRIYW5kbGVyQ2xhc3MoSEFORExFUl9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUzoKLQkJCQlnZXRTb2FwSGVhZGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX1JPTEVTOgotCQkJCWdldFNvYXBSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlyZXR1cm4gSEFORExFUl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBoYW5kbGVyTmFtZSAhPSBudWxsIDogIUhBTkRMRVJfTkFNRV9FREVGQVVMVC5lcXVhbHMoaGFuZGxlck5hbWUpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX0NMQVNTOgotCQkJCXJldHVybiBIQU5ETEVSX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBoYW5kbGVyQ2xhc3MgIT0gbnVsbCA6ICFIQU5ETEVSX0NMQVNTX0VERUZBVUxULmVxdWFscyhoYW5kbGVyQ2xhc3MpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gaW5pdFBhcmFtcyAhPSBudWxsICYmICFpbml0UGFyYW1zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCXJldHVybiBzb2FwSGVhZGVycyAhPSBudWxsICYmICFzb2FwSGVhZGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJcmV0dXJuIHNvYXBSb2xlcyAhPSBudWxsICYmICFzb2FwUm9sZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChoYW5kbGVyTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaGFuZGxlck5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhhbmRsZXJDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaGFuZGxlckNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSGFuZGxlckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJzQ2hhaW5zSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlcnNDaGFpbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTc0YTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlcnNDaGFpbnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBIYW5kbGVyc0NoYWluc0ltcGwuamF2YSx2IDEuMSAyMDA3LzEyLzEyIDIyOjU3OjEzIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJzQ2hhaW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhhbmRsZXJzIENoYWluczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuSGFuZGxlcnNDaGFpbnNJbXBsI2dldEhhbmRsZXJDaGFpbiA8ZW0+SGFuZGxlciBDaGFpbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJzQ2hhaW5zSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJzQ2hhaW5zIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyQ2hhaW4oKSA8ZW0+SGFuZGxlciBDaGFpbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2hhaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBoYW5kbGVyQ2hhaW47Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSGFuZGxlcnNDaGFpbnNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3NkZFBhY2thZ2UuTGl0ZXJhbHMuSEFORExFUlNfQ0hBSU5TOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRIYW5kbGVyQ2hhaW4oKSB7Ci0JCWlmIChoYW5kbGVyQ2hhaW4gPT0gbnVsbCkgewotCQkJaGFuZGxlckNoYWluID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEhhbmRsZXJDaGFpbi5jbGFzcywgdGhpcywgV3NkZFBhY2thZ2UuSEFORExFUlNfQ0hBSU5TX19IQU5ETEVSX0NIQUlOKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlckNoYWluOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUlNfQ0hBSU5TX19IQU5ETEVSX0NIQUlOOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SGFuZGxlckNoYWluKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSU19DSEFJTlNfX0hBTkRMRVJfQ0hBSU46Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJDaGFpbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJTX0NIQUlOU19fSEFORExFUl9DSEFJTjoKLQkJCQlnZXRIYW5kbGVyQ2hhaW4oKS5jbGVhcigpOwotCQkJCWdldEhhbmRsZXJDaGFpbigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUlNfQ0hBSU5TX19IQU5ETEVSX0NIQUlOOgotCQkJCWdldEhhbmRsZXJDaGFpbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJTX0NIQUlOU19fSEFORExFUl9DSEFJTjoKLQkJCQlyZXR1cm4gaGFuZGxlckNoYWluICE9IG51bGwgJiYgIWhhbmRsZXJDaGFpbi5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0hhbmRsZXJzQ2hhaW5zSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MTRiNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcnNDaGFpbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldFBvcnRDb21wb25lbnROYW1lIDxlbT5Qb3J0IENvbXBvbmVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRXc2RsUG9ydCA8ZW0+V3NkbCBQb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRTZXJ2aWNlSW1wbEJlYW4gPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRIYW5kbGVycyA8ZW0+SGFuZGxlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldERlc2NyaXB0aW9uVHlwZSA8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0RGlzcGxheU5hbWVUeXBlIDxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0SWNvblR5cGUgPGVtPkljb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0V3NkbFNlcnZpY2UgPGVtPldzZGwgU2VydmljZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjaXNFbmFibGVNdG9tIDxlbT5FbmFibGUgTXRvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0UHJvdG9jb2xCaW5kaW5nIDxlbT5Qcm90b2NvbCBCaW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRIYW5kbGVyQ2hhaW5zIDxlbT5IYW5kbGVyIENoYWluczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRDb21wb25lbnRJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgUG9ydENvbXBvbmVudAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0Q29tcG9uZW50TmFtZSgpIDxlbT5Qb3J0IENvbXBvbmVudCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX0NPTVBPTkVOVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnROYW1lKCkgPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcG9ydENvbXBvbmVudE5hbWUgPSBQT1JUX0NPTVBPTkVOVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U21hbGxJY29uKCkgPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTTUFMTF9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNtYWxsSWNvbigpIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBzbWFsbEljb24gPSBTTUFMTF9JQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhcmdlSWNvbigpIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFSR0VfSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXJnZUljb24oKSA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbGFyZ2VJY29uID0gTEFSR0VfSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZSgpIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZSgpIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZGlzcGxheU5hbWUgPSBESVNQTEFZX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsUG9ydCgpIDxlbT5Xc2RsIFBvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsUG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMUG9ydCB3c2RsUG9ydDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VJbXBsQmVhbigpIDxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VJbXBsQmVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTZXJ2aWNlSW1wbEJlYW4gc2VydmljZUltcGxCZWFuOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlcnMoKSA8ZW0+SGFuZGxlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGhhbmRsZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25UeXBlKCkgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRGVzY3JpcHRpb25UeXBlIGRlc2NyaXB0aW9uVHlwZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lVHlwZSgpIDxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBEaXNwbGF5TmFtZVR5cGUgZGlzcGxheU5hbWVUeXBlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvblR5cGUoKSA8ZW0+SWNvbiBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWNvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgSWNvblR5cGUgaWNvblR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsU2VydmljZSgpIDxlbT5Xc2RsIFNlcnZpY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxTZXJ2aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETFNlcnZpY2Ugd3NkbFNlcnZpY2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFbmFibGVNdG9tKCkgPGVtPkVuYWJsZSBNdG9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VuYWJsZU10b20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVfTVRPTV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFbmFibGVNdG9tKCkgPGVtPkVuYWJsZSBNdG9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VuYWJsZU10b20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZU10b20gPSBFTkFCTEVfTVRPTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm90b2NvbEJpbmRpbmcoKSA8ZW0+UHJvdG9jb2wgQmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvdG9jb2xCaW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9CSU5ESU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3RvY29sQmluZGluZygpIDxlbT5Qcm90b2NvbCBCaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm90b2NvbEJpbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvdG9jb2xCaW5kaW5nID0gUFJPVE9DT0xfQklORElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJDaGFpbnMoKSA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJDaGFpbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBIYW5kbGVyc0NoYWlucyBoYW5kbGVyQ2hhaW5zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgUG9ydENvbXBvbmVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLlBPUlRfQ09NUE9ORU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQb3J0Q29tcG9uZW50TmFtZSgpIHsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0UG9ydENvbXBvbmVudE5hbWUoU3RyaW5nIG5ld1BvcnRDb21wb25lbnROYW1lKSB7Ci0JCVN0cmluZyBvbGRQb3J0Q29tcG9uZW50TmFtZSA9IHBvcnRDb21wb25lbnROYW1lOwotCQlwb3J0Q29tcG9uZW50TmFtZSA9IG5ld1BvcnRDb21wb25lbnROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fUE9SVF9DT01QT05FTlRfTkFNRSwgb2xkUG9ydENvbXBvbmVudE5hbWUsIHBvcnRDb21wb25lbnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTdHJpbmcgbmV3U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0JCVN0cmluZyBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JCXNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IG5ld1NlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFLCBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UsIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTbWFsbEljb24oKSB7Ci0JCXJldHVybiBzbWFsbEljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIG5ld1NtYWxsSWNvbikgewotCQlTdHJpbmcgb2xkU21hbGxJY29uID0gc21hbGxJY29uOwotCQlzbWFsbEljb24gPSBuZXdTbWFsbEljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TTUFMTF9JQ09OLCBvbGRTbWFsbEljb24sIHNtYWxsSWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7Ci0JCXJldHVybiBsYXJnZUljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRMYXJnZUljb24oU3RyaW5nIG5ld0xhcmdlSWNvbikgewotCQlTdHJpbmcgb2xkTGFyZ2VJY29uID0gbGFyZ2VJY29uOwotCQlsYXJnZUljb24gPSBuZXdMYXJnZUljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19MQVJHRV9JQ09OLCBvbGRMYXJnZUljb24sIGxhcmdlSWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCVN0cmluZyBvbGREaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCQlkaXNwbGF5TmFtZSA9IG5ld0Rpc3BsYXlOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FLCBvbGREaXNwbGF5TmFtZSwgZGlzcGxheU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMUG9ydCBnZXRXc2RsUG9ydCgpIHsKLQkJcmV0dXJuIHdzZGxQb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V3NkbFBvcnQoV1NETFBvcnQgbmV3V3NkbFBvcnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV1NETFBvcnQgb2xkV3NkbFBvcnQgPSB3c2RsUG9ydDsKLQkJd3NkbFBvcnQgPSBuZXdXc2RsUG9ydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVCwgb2xkV3NkbFBvcnQsIG5ld1dzZGxQb3J0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxQb3J0KFdTRExQb3J0IG5ld1dzZGxQb3J0KSB7Ci0JCWlmIChuZXdXc2RsUG9ydCAhPSB3c2RsUG9ydCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod3NkbFBvcnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd3NkbFBvcnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXc2RsUG9ydCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXc2RsUG9ydCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1BPUlQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V3NkbFBvcnQobmV3V3NkbFBvcnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVCwgbmV3V3NkbFBvcnQsIG5ld1dzZGxQb3J0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU2VydmljZUltcGxCZWFuIGdldFNlcnZpY2VJbXBsQmVhbigpIHsKLQkJcmV0dXJuIHNlcnZpY2VJbXBsQmVhbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlcnZpY2VJbXBsQmVhbihTZXJ2aWNlSW1wbEJlYW4gbmV3U2VydmljZUltcGxCZWFuLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlcnZpY2VJbXBsQmVhbiBvbGRTZXJ2aWNlSW1wbEJlYW4gPSBzZXJ2aWNlSW1wbEJlYW47Ci0JCXNlcnZpY2VJbXBsQmVhbiA9IG5ld1NlcnZpY2VJbXBsQmVhbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOLCBvbGRTZXJ2aWNlSW1wbEJlYW4sIG5ld1NlcnZpY2VJbXBsQmVhbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW1wbEJlYW4oU2VydmljZUltcGxCZWFuIG5ld1NlcnZpY2VJbXBsQmVhbikgewotCQlpZiAobmV3U2VydmljZUltcGxCZWFuICE9IHNlcnZpY2VJbXBsQmVhbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VydmljZUltcGxCZWFuICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcnZpY2VJbXBsQmVhbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U2VydmljZUltcGxCZWFuICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlcnZpY2VJbXBsQmVhbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZXJ2aWNlSW1wbEJlYW4obmV3U2VydmljZUltcGxCZWFuLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTiwgbmV3U2VydmljZUltcGxCZWFuLCBuZXdTZXJ2aWNlSW1wbEJlYW4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRIYW5kbGVycygpIHsKLQkJaWYgKGhhbmRsZXJzID09IG51bGwpIHsKLQkJCWhhbmRsZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEhhbmRsZXIuY2xhc3MsIHRoaXMsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIERlc2NyaXB0aW9uVHlwZSBnZXREZXNjcmlwdGlvblR5cGUoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREZXNjcmlwdGlvblR5cGUoRGVzY3JpcHRpb25UeXBlIG5ld0Rlc2NyaXB0aW9uVHlwZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEZXNjcmlwdGlvblR5cGUgb2xkRGVzY3JpcHRpb25UeXBlID0gZGVzY3JpcHRpb25UeXBlOwotCQlkZXNjcmlwdGlvblR5cGUgPSBuZXdEZXNjcmlwdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFLCBvbGREZXNjcmlwdGlvblR5cGUsIG5ld0Rlc2NyaXB0aW9uVHlwZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvblR5cGUoRGVzY3JpcHRpb25UeXBlIG5ld0Rlc2NyaXB0aW9uVHlwZSkgewotCQlpZiAobmV3RGVzY3JpcHRpb25UeXBlICE9IGRlc2NyaXB0aW9uVHlwZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZGVzY3JpcHRpb25UeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlc2NyaXB0aW9uVHlwZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdEZXNjcmlwdGlvblR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGVzY3JpcHRpb25UeXBlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGVzY3JpcHRpb25UeXBlKG5ld0Rlc2NyaXB0aW9uVHlwZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT05fVFlQRSwgbmV3RGVzY3JpcHRpb25UeXBlLCBuZXdEZXNjcmlwdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBEaXNwbGF5TmFtZVR5cGUgZ2V0RGlzcGxheU5hbWVUeXBlKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWVUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSBuZXdEaXNwbGF5TmFtZVR5cGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRGlzcGxheU5hbWVUeXBlIG9sZERpc3BsYXlOYW1lVHlwZSA9IGRpc3BsYXlOYW1lVHlwZTsKLQkJZGlzcGxheU5hbWVUeXBlID0gbmV3RGlzcGxheU5hbWVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUsIG9sZERpc3BsYXlOYW1lVHlwZSwgbmV3RGlzcGxheU5hbWVUeXBlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lVHlwZShEaXNwbGF5TmFtZVR5cGUgbmV3RGlzcGxheU5hbWVUeXBlKSB7Ci0JCWlmIChuZXdEaXNwbGF5TmFtZVR5cGUgIT0gZGlzcGxheU5hbWVUeXBlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkaXNwbGF5TmFtZVR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGlzcGxheU5hbWVUeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdEaXNwbGF5TmFtZVR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGlzcGxheU5hbWVUeXBlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldERpc3BsYXlOYW1lVHlwZShuZXdEaXNwbGF5TmFtZVR5cGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFLCBuZXdEaXNwbGF5TmFtZVR5cGUsIG5ld0Rpc3BsYXlOYW1lVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEljb25UeXBlIGdldEljb25UeXBlKCkgewotCQlyZXR1cm4gaWNvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJY29uVHlwZShJY29uVHlwZSBuZXdJY29uVHlwZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlJY29uVHlwZSBvbGRJY29uVHlwZSA9IGljb25UeXBlOwotCQlpY29uVHlwZSA9IG5ld0ljb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFLCBvbGRJY29uVHlwZSwgbmV3SWNvblR5cGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWNvblR5cGUoSWNvblR5cGUgbmV3SWNvblR5cGUpIHsKLQkJaWYgKG5ld0ljb25UeXBlICE9IGljb25UeXBlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpY29uVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpY29uVHlwZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0ljb25UeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0ljb25UeXBlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJY29uVHlwZShuZXdJY29uVHlwZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFLCBuZXdJY29uVHlwZSwgbmV3SWNvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETFNlcnZpY2UgZ2V0V3NkbFNlcnZpY2UoKSB7Ci0JCXJldHVybiB3c2RsU2VydmljZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXc2RsU2VydmljZShXU0RMU2VydmljZSBuZXdXc2RsU2VydmljZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXU0RMU2VydmljZSBvbGRXc2RsU2VydmljZSA9IHdzZGxTZXJ2aWNlOwotCQl3c2RsU2VydmljZSA9IG5ld1dzZGxTZXJ2aWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9TRVJWSUNFLCBvbGRXc2RsU2VydmljZSwgbmV3V3NkbFNlcnZpY2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdzZGxTZXJ2aWNlKFdTRExTZXJ2aWNlIG5ld1dzZGxTZXJ2aWNlKSB7Ci0JCWlmIChuZXdXc2RsU2VydmljZSAhPSB3c2RsU2VydmljZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod3NkbFNlcnZpY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd3NkbFNlcnZpY2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9TRVJWSUNFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXc2RsU2VydmljZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXc2RsU2VydmljZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1NFUlZJQ0UsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V3NkbFNlcnZpY2UobmV3V3NkbFNlcnZpY2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfU0VSVklDRSwgbmV3V3NkbFNlcnZpY2UsIG5ld1dzZGxTZXJ2aWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVNdG9tKCkgewotCQlyZXR1cm4gZW5hYmxlTXRvbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVNdG9tKGJvb2xlYW4gbmV3RW5hYmxlTXRvbSkgewotCQlib29sZWFuIG9sZEVuYWJsZU10b20gPSBlbmFibGVNdG9tOwotCQllbmFibGVNdG9tID0gbmV3RW5hYmxlTXRvbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0VOQUJMRV9NVE9NLCBvbGRFbmFibGVNdG9tLCBlbmFibGVNdG9tKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm90b2NvbEJpbmRpbmcoKSB7Ci0JCXJldHVybiBwcm90b2NvbEJpbmRpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvdG9jb2xCaW5kaW5nKFN0cmluZyBuZXdQcm90b2NvbEJpbmRpbmcpIHsKLQkJU3RyaW5nIG9sZFByb3RvY29sQmluZGluZyA9IHByb3RvY29sQmluZGluZzsKLQkJcHJvdG9jb2xCaW5kaW5nID0gbmV3UHJvdG9jb2xCaW5kaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fUFJPVE9DT0xfQklORElORywgb2xkUHJvdG9jb2xCaW5kaW5nLCBwcm90b2NvbEJpbmRpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSGFuZGxlcnNDaGFpbnMgZ2V0SGFuZGxlckNoYWlucygpIHsKLQkJcmV0dXJuIGhhbmRsZXJDaGFpbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGFuZGxlckNoYWlucyhIYW5kbGVyc0NoYWlucyBuZXdIYW5kbGVyQ2hhaW5zLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUhhbmRsZXJzQ2hhaW5zIG9sZEhhbmRsZXJDaGFpbnMgPSBoYW5kbGVyQ2hhaW5zOwotCQloYW5kbGVyQ2hhaW5zID0gbmV3SGFuZGxlckNoYWluczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TLCBvbGRIYW5kbGVyQ2hhaW5zLCBuZXdIYW5kbGVyQ2hhaW5zKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2hhaW5zKEhhbmRsZXJzQ2hhaW5zIG5ld0hhbmRsZXJDaGFpbnMpIHsKLQkJaWYgKG5ld0hhbmRsZXJDaGFpbnMgIT0gaGFuZGxlckNoYWlucykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaGFuZGxlckNoYWlucyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCloYW5kbGVyQ2hhaW5zKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdIYW5kbGVyQ2hhaW5zICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0hhbmRsZXJDaGFpbnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUl9DSEFJTlMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SGFuZGxlckNoYWlucyhuZXdIYW5kbGVyQ2hhaW5zLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSX0NIQUlOUywgbmV3SGFuZGxlckNoYWlucywgbmV3SGFuZGxlckNoYWlucykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsUG9ydChudWxsLCBtc2dzKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOOgotCQkJCXJldHVybiBiYXNpY1NldFNlcnZpY2VJbXBsQmVhbihudWxsLCBtc2dzKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SGFuZGxlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT05fVFlQRToKLQkJCQlyZXR1cm4gYmFzaWNTZXREZXNjcmlwdGlvblR5cGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gYmFzaWNTZXREaXNwbGF5TmFtZVR5cGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SWNvblR5cGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1NFUlZJQ0U6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V3NkbFNlcnZpY2UobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSX0NIQUlOUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRIYW5kbGVyQ2hhaW5zKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FOgotCQkJCXJldHVybiBnZXRQb3J0Q29tcG9uZW50TmFtZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U21hbGxJY29uKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUOgotCQkJCXJldHVybiBnZXRXc2RsUG9ydCgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9JTVBMX0JFQU46Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VJbXBsQmVhbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUlM6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJzKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvblR5cGUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZVR5cGUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0SWNvblR5cGUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfU0VSVklDRToKLQkJCQlyZXR1cm4gZ2V0V3NkbFNlcnZpY2UoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0VOQUJMRV9NVE9NOgotCQkJCXJldHVybiBpc0VuYWJsZU10b20oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QUk9UT0NPTF9CSU5ESU5HOgotCQkJCXJldHVybiBnZXRQcm90b2NvbEJpbmRpbmcoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TOgotCQkJCXJldHVybiBnZXRIYW5kbGVyQ2hhaW5zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1BPUlRfQ09NUE9ORU5UX05BTUU6Ci0JCQkJc2V0UG9ydENvbXBvbmVudE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1BPUlQ6Ci0JCQkJc2V0V3NkbFBvcnQoKFdTRExQb3J0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTjoKLQkJCQlzZXRTZXJ2aWNlSW1wbEJlYW4oKFNlcnZpY2VJbXBsQmVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUlM6Ci0JCQkJZ2V0SGFuZGxlcnMoKS5jbGVhcigpOwotCQkJCWdldEhhbmRsZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXNldERlc2NyaXB0aW9uVHlwZSgoRGVzY3JpcHRpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRToKLQkJCQlzZXREaXNwbGF5TmFtZVR5cGUoKERpc3BsYXlOYW1lVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFOgotCQkJCXNldEljb25UeXBlKChJY29uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9TRVJWSUNFOgotCQkJCXNldFdzZGxTZXJ2aWNlKChXU0RMU2VydmljZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRU5BQkxFX01UT006Ci0JCQkJc2V0RW5hYmxlTXRvbSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QUk9UT0NPTF9CSU5ESU5HOgotCQkJCXNldFByb3RvY29sQmluZGluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSX0NIQUlOUzoKLQkJCQlzZXRIYW5kbGVyQ2hhaW5zKChIYW5kbGVyc0NoYWlucyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1BPUlRfQ09NUE9ORU5UX05BTUU6Ci0JCQkJc2V0UG9ydENvbXBvbmVudE5hbWUoUE9SVF9DT01QT05FTlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKERJU1BMQVlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUOgotCQkJCXNldFdzZGxQb3J0KChXU0RMUG9ydCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTjoKLQkJCQlzZXRTZXJ2aWNlSW1wbEJlYW4oKFNlcnZpY2VJbXBsQmVhbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSUzoKLQkJCQlnZXRIYW5kbGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT05fVFlQRToKLQkJCQlzZXREZXNjcmlwdGlvblR5cGUoKERlc2NyaXB0aW9uVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRToKLQkJCQlzZXREaXNwbGF5TmFtZVR5cGUoKERpc3BsYXlOYW1lVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEU6Ci0JCQkJc2V0SWNvblR5cGUoKEljb25UeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfU0VSVklDRToKLQkJCQlzZXRXc2RsU2VydmljZSgoV1NETFNlcnZpY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRU5BQkxFX01UT006Ci0JCQkJc2V0RW5hYmxlTXRvbShFTkFCTEVfTVRPTV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fUFJPVE9DT0xfQklORElORzoKLQkJCQlzZXRQcm90b2NvbEJpbmRpbmcoUFJPVE9DT0xfQklORElOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUl9DSEFJTlM6Ci0JCQkJc2V0SGFuZGxlckNoYWlucygoSGFuZGxlcnNDaGFpbnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FOgotCQkJCXJldHVybiBQT1JUX0NPTVBPTkVOVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwb3J0Q29tcG9uZW50TmFtZSAhPSBudWxsIDogIVBPUlRfQ09NUE9ORU5UX05BTUVfRURFRkFVTFQuZXF1YWxzKHBvcnRDb21wb25lbnROYW1lKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotCQkJCXJldHVybiBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlICE9IG51bGwgOiAhU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQuZXF1YWxzKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gTEFSR0VfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbGFyZ2VJY29uICE9IG51bGwgOiAhTEFSR0VfSUNPTl9FREVGQVVMVC5lcXVhbHMobGFyZ2VJY29uKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1BPUlQ6Ci0JCQkJcmV0dXJuIHdzZGxQb3J0ICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTjoKLQkJCQlyZXR1cm4gc2VydmljZUltcGxCZWFuICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gaGFuZGxlcnMgIT0gbnVsbCAmJiAhaGFuZGxlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT05fVFlQRToKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25UeXBlICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVUeXBlICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEU6Ci0JCQkJcmV0dXJuIGljb25UeXBlICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1NFUlZJQ0U6Ci0JCQkJcmV0dXJuIHdzZGxTZXJ2aWNlICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19FTkFCTEVfTVRPTToKLQkJCQlyZXR1cm4gZW5hYmxlTXRvbSAhPSBFTkFCTEVfTVRPTV9FREVGQVVMVDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1BST1RPQ09MX0JJTkRJTkc6Ci0JCQkJcmV0dXJuIFBST1RPQ09MX0JJTkRJTkdfRURFRkFVTFQgPT0gbnVsbCA/IHByb3RvY29sQmluZGluZyAhPSBudWxsIDogIVBST1RPQ09MX0JJTkRJTkdfRURFRkFVTFQuZXF1YWxzKHByb3RvY29sQmluZGluZyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSX0NIQUlOUzoKLQkJCQlyZXR1cm4gaGFuZGxlckNoYWlucyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwb3J0Q29tcG9uZW50TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9ydENvbXBvbmVudE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzbWFsbEljb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNtYWxsSWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFyZ2VJY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYXJnZUljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlzcGxheU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRpc3BsYXlOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbmFibGVNdG9tOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlbmFibGVNdG9tKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm90b2NvbEJpbmRpbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb3RvY29sQmluZGluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BvcnRDb21wb25lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW1wbEJlYW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW1wbEJlYW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOWI5YzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvU2VydmljZUltcGxCZWFuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBJbXBsIEJlYW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsQmVhbkltcGwjZ2V0RUVKQkxpbmsgPGVtPkVFSkIgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuU2VydmljZUltcGxCZWFuSW1wbCNnZXRFU2VydmxldExpbmsgPGVtPkVTZXJ2bGV0IExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsQmVhbkltcGwjZ2V0QmVhbkxpbmsgPGVtPkJlYW4gTGluazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VJbXBsQmVhbkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2aWNlSW1wbEJlYW4KLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFRUpCTGluaygpIDxlbT5FRUpCIExpbms8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFRUpCTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBFSkJMaW5rIGVFSkJMaW5rOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RVNlcnZsZXRMaW5rKCkgPGVtPkVTZXJ2bGV0IExpbms8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFU2VydmxldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU2VydmxldExpbmsgZVNlcnZsZXRMaW5rOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmVhbkxpbmsoKSA8ZW0+QmVhbiBMaW5rPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmVhbkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgQmVhbkxpbmsgYmVhbkxpbms7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBTZXJ2aWNlSW1wbEJlYW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX0lNUExfQkVBTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFSkJMaW5rIGdldEVFSkJMaW5rKCkgewotCQlyZXR1cm4gZUVKQkxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFRUpCTGluayhFSkJMaW5rIG5ld0VFSkJMaW5rLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUVKQkxpbmsgb2xkRUVKQkxpbmsgPSBlRUpCTGluazsKLQkJZUVKQkxpbmsgPSBuZXdFRUpCTGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSywgb2xkRUVKQkxpbmssIG5ld0VFSkJMaW5rKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldEVFSkJMaW5rKEVKQkxpbmsgbmV3RUVKQkxpbmspIHsKLQkJaWYgKG5ld0VFSkJMaW5rICE9IGVFSkJMaW5rKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlRUpCTGluayAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllRUpCTGluaykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FRUpCX0xJTkssIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0VFSkJMaW5rICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0VFSkJMaW5rKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFRUpCTGluayhuZXdFRUpCTGluaywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LLCBuZXdFRUpCTGluaywgbmV3RUVKQkxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTZXJ2bGV0TGluayBnZXRFU2VydmxldExpbmsoKSB7Ci0JCXJldHVybiBlU2VydmxldExpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFU2VydmxldExpbmsoU2VydmxldExpbmsgbmV3RVNlcnZsZXRMaW5rLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlcnZsZXRMaW5rIG9sZEVTZXJ2bGV0TGluayA9IGVTZXJ2bGV0TGluazsKLQkJZVNlcnZsZXRMaW5rID0gbmV3RVNlcnZsZXRMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSywgb2xkRVNlcnZsZXRMaW5rLCBuZXdFU2VydmxldExpbmspOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RVNlcnZsZXRMaW5rKFNlcnZsZXRMaW5rIG5ld0VTZXJ2bGV0TGluaykgewotCQlpZiAobmV3RVNlcnZsZXRMaW5rICE9IGVTZXJ2bGV0TGluaykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZVNlcnZsZXRMaW5rICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWVTZXJ2bGV0TGluaykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFU2VydmxldExpbmsgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RVNlcnZsZXRMaW5rKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VTRVJWTEVUX0xJTkssIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RVNlcnZsZXRMaW5rKG5ld0VTZXJ2bGV0TGluaywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSywgbmV3RVNlcnZsZXRMaW5rLCBuZXdFU2VydmxldExpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBCZWFuTGluayBnZXRCZWFuTGluaygpIHsKLQkJcmV0dXJuIGJlYW5MaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QmVhbkxpbmsoQmVhbkxpbmsgbmV3QmVhbkxpbmssIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQmVhbkxpbmsgb2xkQmVhbkxpbmsgPSBiZWFuTGluazsKLQkJYmVhbkxpbmsgPSBuZXdCZWFuTGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0JFQU5fTElOSywgb2xkQmVhbkxpbmssIG5ld0JlYW5MaW5rKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldEJlYW5MaW5rKEJlYW5MaW5rIG5ld0JlYW5MaW5rKSB7Ci0JCWlmIChuZXdCZWFuTGluayAhPSBiZWFuTGluaykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYmVhbkxpbmsgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYmVhbkxpbmspLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdCZWFuTGluayAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCZWFuTGluaykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTkssIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QmVhbkxpbmsobmV3QmVhbkxpbmssIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0JFQU5fTElOSywgbmV3QmVhbkxpbmssIG5ld0JlYW5MaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LOgotCQkJCXJldHVybiBiYXNpY1NldEVFSkJMaW5rKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRFU2VydmxldExpbmsobnVsbCwgbXNncyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTks6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QmVhbkxpbmsobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSzoKLQkJCQlyZXR1cm4gZ2V0RUVKQkxpbmsoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VTRVJWTEVUX0xJTks6Ci0JCQkJcmV0dXJuIGdldEVTZXJ2bGV0TGluaygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LOgotCQkJCXJldHVybiBnZXRCZWFuTGluaygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FRUpCX0xJTks6Ci0JCQkJc2V0RUVKQkxpbmsoKEVKQkxpbmspbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VTRVJWTEVUX0xJTks6Ci0JCQkJc2V0RVNlcnZsZXRMaW5rKChTZXJ2bGV0TGluayluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LOgotCQkJCXNldEJlYW5MaW5rKChCZWFuTGluayluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSzoKLQkJCQlzZXRFRUpCTGluaygoRUpCTGluayludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LOgotCQkJCXNldEVTZXJ2bGV0TGluaygoU2VydmxldExpbmspbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LOgotCQkJCXNldEJlYW5MaW5rKChCZWFuTGluayludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSzoKLQkJCQlyZXR1cm4gZUVKQkxpbmsgIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VTRVJWTEVUX0xJTks6Ci0JCQkJcmV0dXJuIGVTZXJ2bGV0TGluayAhPSBudWxsOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LOgotCQkJCXJldHVybiBiZWFuTGluayAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9TZXJ2aWNlSW1wbEJlYW5JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9TZXJ2bGV0TGlua0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1NlcnZsZXRMaW5rSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWE5NWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1NlcnZsZXRMaW5rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmxldCBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TGlua0ltcGwjZ2V0U2VydmxldExpbmsgPGVtPlNlcnZsZXQgTGluazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRMaW5rSW1wbCBleHRlbmRzIEJlYW5MaW5rSW1wbCBpbXBsZW1lbnRzIFNlcnZsZXRMaW5rCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZsZXRMaW5rKCkgPGVtPlNlcnZsZXQgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZsZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9MSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZsZXRMaW5rKCkgPGVtPlNlcnZsZXQgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZsZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2bGV0TGluayA9IFNFUlZMRVRfTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFNlcnZsZXRMaW5rSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3NkZFBhY2thZ2UuTGl0ZXJhbHMuU0VSVkxFVF9MSU5LOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TGluaygpIHsKLQkJcmV0dXJuIHNlcnZsZXRMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmxldExpbmsoU3RyaW5nIG5ld1NlcnZsZXRMaW5rKSB7Ci0JCVN0cmluZyBvbGRTZXJ2bGV0TGluayA9IHNlcnZsZXRMaW5rOwotCQlzZXJ2bGV0TGluayA9IG5ld1NlcnZsZXRMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSywgb2xkU2VydmxldExpbmssIHNlcnZsZXRMaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSzoKLQkJCQlyZXR1cm4gZ2V0U2VydmxldExpbmsoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSzoKLQkJCQlzZXRTZXJ2bGV0TGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSzoKLQkJCQlzZXRTZXJ2bGV0TGluayhTRVJWTEVUX0xJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSzoKLQkJCQlyZXR1cm4gU0VSVkxFVF9MSU5LX0VERUZBVUxUID09IG51bGwgPyBzZXJ2bGV0TGluayAhPSBudWxsIDogIVNFUlZMRVRfTElOS19FREVGQVVMVC5lcXVhbHMoc2VydmxldExpbmspOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzZXJ2bGV0TGluazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VydmxldExpbmspOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2bGV0TGlua0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dTRExQb3J0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV1NETFBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MzBhNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV1NETFBvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgUG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExQb3J0SW1wbCBleHRlbmRzIFFOYW1lSW1wbCBpbXBsZW1lbnRzIFdTRExQb3J0Ci17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETFBvcnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5XU0RMX1BPUlQ7Ci0JfQotCi19IC8vV1NETFBvcnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XU0RMU2VydmljZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dTRExTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmM4MDY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dTRExTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXU0RMU2VydmljZUltcGwuamF2YSx2IDEuMSAyMDA3LzEyLzEyIDIyOjU3OjEzIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgU2VydmljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExTZXJ2aWNlSW1wbCBleHRlbmRzIFFOYW1lSW1wbCBpbXBsZW1lbnRzIFdTRExTZXJ2aWNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETFNlcnZpY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3NkZFBhY2thZ2UuTGl0ZXJhbHMuV1NETF9TRVJWSUNFOwotCX0KLQotfSAvL1dTRExTZXJ2aWNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQyMzk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldEpheHJwY01hcHBpbmdGaWxlIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUgPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0V3NkbEZpbGUgPGVtPldzZGwgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldFBvcnRDb21wb25lbnRzIDxlbT5Qb3J0IENvbXBvbmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0RGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldERpc3BsYXlOYW1lVHlwZSA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0SWNvblR5cGUgPGVtPkljb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWJTZXJ2aWNlRGVzY3JpcHRpb24KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpheHJwY01hcHBpbmdGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGpheHJwY01hcHBpbmdGaWxlID0gSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkgPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkgPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lID0gV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRmlsZSgpIDxlbT5Xc2RsIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRmlsZSgpIDxlbT5Xc2RsIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbEZpbGUgPSBXU0RMX0ZJTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U21hbGxJY29uKCkgPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTTUFMTF9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNtYWxsSWNvbigpIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBzbWFsbEljb24gPSBTTUFMTF9JQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhcmdlSWNvbigpIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFSR0VfSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXJnZUljb24oKSA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbGFyZ2VJY29uID0gTEFSR0VfSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZSgpIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZSgpIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZGlzcGxheU5hbWUgPSBESVNQTEFZX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0Q29tcG9uZW50cygpIDxlbT5Qb3J0IENvbXBvbmVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IHBvcnRDb21wb25lbnRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25UeXBlKCkgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRGVzY3JpcHRpb25UeXBlIGRlc2NyaXB0aW9uVHlwZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lVHlwZSgpIDxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBEaXNwbGF5TmFtZVR5cGUgZGlzcGxheU5hbWVUeXBlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvblR5cGUoKSA8ZW0+SWNvbiBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWNvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgSWNvblR5cGUgaWNvblR5cGU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5XRUJfU0VSVklDRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKSB7Ci0JCXJldHVybiBqYXhycGNNYXBwaW5nRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldEpheHJwY01hcHBpbmdGaWxlKFN0cmluZyBuZXdKYXhycGNNYXBwaW5nRmlsZSkgewotCQlTdHJpbmcgb2xkSmF4cnBjTWFwcGluZ0ZpbGUgPSBqYXhycGNNYXBwaW5nRmlsZTsKLQkJamF4cnBjTWFwcGluZ0ZpbGUgPSBuZXdKYXhycGNNYXBwaW5nRmlsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0pBWFJQQ19NQVBQSU5HX0ZJTEUsIG9sZEpheHJwY01hcHBpbmdGaWxlLCBqYXhycGNNYXBwaW5nRmlsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkgewotCQlyZXR1cm4gd2ViU2VydmljZURlc2NyaXB0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoU3RyaW5nIG5ld1dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUgPSB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lOwotCQl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lID0gbmV3V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUUsIG9sZFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUsIHdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbEZpbGUoKSB7Ci0JCXJldHVybiB3c2RsRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxGaWxlKFN0cmluZyBuZXdXc2RsRmlsZSkgewotCQlTdHJpbmcgb2xkV3NkbEZpbGUgPSB3c2RsRmlsZTsKLQkJd3NkbEZpbGUgPSBuZXdXc2RsRmlsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dTRExfRklMRSwgb2xkV3NkbEZpbGUsIHdzZGxGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbkdlbigpIHsKLQkJcmV0dXJuIHNtYWxsSWNvbjsKLQl9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTbWFsbEljb24oKSB7Ci0gIAlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSAKLSAgCQlyZXR1cm4gZ2V0U21hbGxJY29uR2VuKCk7Ci0gIAkKLSAgCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotICAJCXJldHVybiBnZXRTbWFsbEljb25HZW4oKTsgCi0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLSAgCWRlZmF1bHQgOgotICAJCWlmIChnZXRJY29uVHlwZSgpICE9IG51bGwpCi0gIAkJCXJldHVybiBnZXRJY29uVHlwZSgpLmdldFNtYWxsSWNvbigpOwotICAJfQotICAJcmV0dXJuIG51bGw7Ci0gIH0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0U21hbGxJY29uR2VuKFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJU3RyaW5nIG9sZFNtYWxsSWNvbiA9IHNtYWxsSWNvbjsKLQkJc21hbGxJY29uID0gbmV3U21hbGxJY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fU01BTExfSUNPTiwgb2xkU21hbGxJY29uLCBzbWFsbEljb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uR2VuKCkgewotCQlyZXR1cm4gbGFyZ2VJY29uOwotCX0KLQotICBwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKLSAgCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIAotICAJCXJldHVybiBnZXRMYXJnZUljb25HZW4oKTsKLSAgCQotICAJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0gIAkJcmV0dXJuIGdldExhcmdlSWNvbkdlbigpOyAKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotICAJZGVmYXVsdCA6Ci0gIAkJaWYgKGdldEljb25UeXBlKCkgIT0gbnVsbCkKLSAgCQkJcmV0dXJuIGdldEljb25UeXBlKCkuZ2V0TGFyZ2VJY29uKCk7Ci0gIAl9Ci0gIAlyZXR1cm4gbnVsbDsKLSAgfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRMYXJnZUljb25HZW4oU3RyaW5nIG5ld0xhcmdlSWNvbikgewotCQlTdHJpbmcgb2xkTGFyZ2VJY29uID0gbGFyZ2VJY29uOwotCQlsYXJnZUljb24gPSBuZXdMYXJnZUljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19MQVJHRV9JQ09OLCBvbGRMYXJnZUljb24sIGxhcmdlSWNvbikpOwotCX0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldEoyRUVWZXJzaW9uSUQoKQotICAgKi8KLSAgcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gIAlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKLSAgCWlmIChyZXMgPT0gbnVsbCkKLSAgCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gIAlyZXR1cm4gcmVzLmdldEoyRUVWZXJzaW9uSUQoKTsKLSAgfQotICAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25HZW4oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSAKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbkdlbigpOwotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uR2VuKCk7IAotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJZGVmYXVsdCA6Ci0JCQlpZiAoZ2V0RGVzY3JpcHRpb25UeXBlKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gKChEZXNjcmlwdGlvbilnZXREZXNjcmlwdGlvblR5cGUoKSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uR2VuKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0gIAlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0gIAkJc2V0RGVzY3JpcHRpb25HZW4obmV3RGVzY3JpcHRpb24pOwotICAJCWludGVybmFsU2V0RGVzY3JpcHRpb25UeXBlKG5ld0Rlc2NyaXB0aW9uKTsKLSAgCQlyZXR1cm47Ci0gIAl9Ci0gIAkKLSAgCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotICAJCXNldERlc2NyaXB0aW9uR2VuKG5ld0Rlc2NyaXB0aW9uKTsKLSAgCQlicmVhazsKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotICAJZGVmYXVsdCA6Ci0gIAkJaW50ZXJuYWxTZXREZXNjcmlwdGlvblR5cGUobmV3RGVzY3JpcHRpb24pOyAKLSAgCQlicmVhazsKLSAgCX0KLSAgfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lR2VuKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0gIAlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSAKLSAgCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVHZW4oKTsKLSAgCQotICAJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0gIAkJcmV0dXJuIGdldERpc3BsYXlOYW1lR2VuKCk7IAotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0gIAlkZWZhdWx0IDoKLSAgCQlpZiAoZ2V0RGlzcGxheU5hbWVUeXBlKCkgIT0gbnVsbCkKLSAgCQkJcmV0dXJuICgoRGlzcGxheU5hbWUpZ2V0RGlzcGxheU5hbWVUeXBlKCkpLmdldFZhbHVlKCk7Ci0gIAl9Ci0gIAlyZXR1cm4gbnVsbDsKLSAgfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZUdlbihTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJU3RyaW5nIG9sZERpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0JCWRpc3BsYXlOYW1lID0gbmV3RGlzcGxheU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUUsIG9sZERpc3BsYXlOYW1lLCBkaXNwbGF5TmFtZSkpOwotCX0KLQotICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLSAgCWlmKGVSZXNvdXJjZSgpID09IG51bGwpIHsKLSAgCQlzZXREaXNwbGF5TmFtZUdlbihuZXdEaXNwbGF5TmFtZSk7Ci0gIAkJaW50ZXJuYWxTZXREaXNwbGF5TmFtZVR5cGUobmV3RGlzcGxheU5hbWUpOwotICAJCXJldHVybjsKLSAgCX0KLSAgCQotICAJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0gIAkJc2V0RGlzcGxheU5hbWVHZW4obmV3RGlzcGxheU5hbWUpOwotICAJCWJyZWFrOwotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0gIAlkZWZhdWx0IDoKLSAgCQlpbnRlcm5hbFNldERpc3BsYXlOYW1lVHlwZShuZXdEaXNwbGF5TmFtZSk7Ci0gIAkJYnJlYWs7Ci0gIAl9Ci0gIH0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldFBvcnRDb21wb25lbnRzKCkgewotCQlpZiAocG9ydENvbXBvbmVudHMgPT0gbnVsbCkgewotCQkJcG9ydENvbXBvbmVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUG9ydENvbXBvbmVudC5jbGFzcywgdGhpcywgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1BPUlRfQ09NUE9ORU5UUyk7Ci0JCX0KLQkJcmV0dXJuIHBvcnRDb21wb25lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIERlc2NyaXB0aW9uVHlwZSBnZXREZXNjcmlwdGlvblR5cGUoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREZXNjcmlwdGlvblR5cGUoRGVzY3JpcHRpb25UeXBlIG5ld0Rlc2NyaXB0aW9uVHlwZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEZXNjcmlwdGlvblR5cGUgb2xkRGVzY3JpcHRpb25UeXBlID0gZGVzY3JpcHRpb25UeXBlOwotCQlkZXNjcmlwdGlvblR5cGUgPSBuZXdEZXNjcmlwdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFLCBvbGREZXNjcmlwdGlvblR5cGUsIG5ld0Rlc2NyaXB0aW9uVHlwZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvblR5cGUoRGVzY3JpcHRpb25UeXBlIG5ld0Rlc2NyaXB0aW9uVHlwZSkgewotCQlpZiAobmV3RGVzY3JpcHRpb25UeXBlICE9IGRlc2NyaXB0aW9uVHlwZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZGVzY3JpcHRpb25UeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlc2NyaXB0aW9uVHlwZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdEZXNjcmlwdGlvblR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGVzY3JpcHRpb25UeXBlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGVzY3JpcHRpb25UeXBlKG5ld0Rlc2NyaXB0aW9uVHlwZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT05fVFlQRSwgbmV3RGVzY3JpcHRpb25UeXBlLCBuZXdEZXNjcmlwdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBEaXNwbGF5TmFtZVR5cGUgZ2V0RGlzcGxheU5hbWVUeXBlKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWVUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSBuZXdEaXNwbGF5TmFtZVR5cGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRGlzcGxheU5hbWVUeXBlIG9sZERpc3BsYXlOYW1lVHlwZSA9IGRpc3BsYXlOYW1lVHlwZTsKLQkJZGlzcGxheU5hbWVUeXBlID0gbmV3RGlzcGxheU5hbWVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEUsIG9sZERpc3BsYXlOYW1lVHlwZSwgbmV3RGlzcGxheU5hbWVUeXBlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lVHlwZShEaXNwbGF5TmFtZVR5cGUgbmV3RGlzcGxheU5hbWVUeXBlKSB7Ci0JCWlmIChuZXdEaXNwbGF5TmFtZVR5cGUgIT0gZGlzcGxheU5hbWVUeXBlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkaXNwbGF5TmFtZVR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGlzcGxheU5hbWVUeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdEaXNwbGF5TmFtZVR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGlzcGxheU5hbWVUeXBlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldERpc3BsYXlOYW1lVHlwZShuZXdEaXNwbGF5TmFtZVR5cGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFLCBuZXdEaXNwbGF5TmFtZVR5cGUsIG5ld0Rpc3BsYXlOYW1lVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEljb25UeXBlIGdldEljb25UeXBlKCkgewotCQlyZXR1cm4gaWNvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJY29uVHlwZShJY29uVHlwZSBuZXdJY29uVHlwZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlJY29uVHlwZSBvbGRJY29uVHlwZSA9IGljb25UeXBlOwotCQlpY29uVHlwZSA9IG5ld0ljb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFLCBvbGRJY29uVHlwZSwgbmV3SWNvblR5cGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWNvblR5cGUoSWNvblR5cGUgbmV3SWNvblR5cGUpIHsKLQkJaWYgKG5ld0ljb25UeXBlICE9IGljb25UeXBlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpY29uVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpY29uVHlwZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0ljb25UeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0ljb25UeXBlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJY29uVHlwZShuZXdJY29uVHlwZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFLCBuZXdJY29uVHlwZSwgbmV3SWNvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19QT1JUX0NPTVBPTkVOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQb3J0Q29tcG9uZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXJldHVybiBiYXNpY1NldERlc2NyaXB0aW9uVHlwZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXJldHVybiBiYXNpY1NldERpc3BsYXlOYW1lVHlwZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJY29uVHlwZShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRToKLQkJCQlyZXR1cm4gZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dTRExfRklMRToKLQkJCQlyZXR1cm4gZ2V0V3NkbEZpbGUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0TGFyZ2VJY29uKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1BPUlRfQ09NUE9ORU5UUzoKLQkJCQlyZXR1cm4gZ2V0UG9ydENvbXBvbmVudHMoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uVHlwZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lVHlwZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFOgotCQkJCXJldHVybiBnZXRJY29uVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXNldEpheHJwY01hcHBpbmdGaWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUU6Ci0JCQkJc2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XU0RMX0ZJTEU6Ci0JCQkJc2V0V3NkbEZpbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1BPUlRfQ09NUE9ORU5UUzoKLQkJCQlnZXRQb3J0Q29tcG9uZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9ydENvbXBvbmVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEU6Ci0JCQkJc2V0RGVzY3JpcHRpb25UeXBlKChEZXNjcmlwdGlvblR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXNldERpc3BsYXlOYW1lVHlwZSgoRGlzcGxheU5hbWVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEU6Ci0JCQkJc2V0SWNvblR5cGUoKEljb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRToKLQkJCQlzZXRKYXhycGNNYXBwaW5nRmlsZShKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FOgotCQkJCXNldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV1NETF9GSUxFOgotCQkJCXNldFdzZGxGaWxlKFdTRExfRklMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oU01BTExfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oTEFSR0VfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZShESVNQTEFZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1BPUlRfQ09NUE9ORU5UUzoKLQkJCQlnZXRQb3J0Q29tcG9uZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT05fVFlQRToKLQkJCQlzZXREZXNjcmlwdGlvblR5cGUoKERlc2NyaXB0aW9uVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUVfVFlQRToKLQkJCQlzZXREaXNwbGF5TmFtZVR5cGUoKERpc3BsYXlOYW1lVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEU6Ci0JCQkJc2V0SWNvblR5cGUoKEljb25UeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRToKLQkJCQlyZXR1cm4gSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVCA9PSBudWxsID8gamF4cnBjTWFwcGluZ0ZpbGUgIT0gbnVsbCA6ICFKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxULmVxdWFscyhqYXhycGNNYXBwaW5nRmlsZSk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FOgotCQkJCXJldHVybiBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lICE9IG51bGwgOiAhV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMod2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XU0RMX0ZJTEU6Ci0JCQkJcmV0dXJuIFdTRExfRklMRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbEZpbGUgIT0gbnVsbCA6ICFXU0RMX0ZJTEVfRURFRkFVTFQuZXF1YWxzKHdzZGxGaWxlKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1BPUlRfQ09NUE9ORU5UUzoKLQkJCQlyZXR1cm4gcG9ydENvbXBvbmVudHMgIT0gbnVsbCAmJiAhcG9ydENvbXBvbmVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT05fVFlQRToKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25UeXBlICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVUeXBlICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEU6Ci0JCQkJcmV0dXJuIGljb25UeXBlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGpheHJwY01hcHBpbmdGaWxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqYXhycGNNYXBwaW5nRmlsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd2ViU2VydmljZURlc2NyaXB0aW9uTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQod2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbEZpbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdzZGxGaWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzbWFsbEljb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNtYWxsSWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFyZ2VJY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYXJnZUljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlzcGxheU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRpc3BsYXlOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0Rlc2NyaXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTZXREZXNjcmlwdGlvblR5cGUoU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCURlc2NyaXB0aW9uVHlwZSBuZXdWYWx1ZSA9IG51bGw7Ci0JCWlmKGdldERlc2NyaXB0aW9uVHlwZSgpICE9IG51bGwpIHsKLQkJCW5ld1ZhbHVlID0gZ2V0RGVzY3JpcHRpb25UeXBlKCk7Ci0JCQluZXdWYWx1ZS5zZXRWYWx1ZShuZXdEZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdWYWx1ZSA9IFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCk7Ci0JCQluZXdWYWx1ZS5zZXRWYWx1ZShuZXdEZXNjcmlwdGlvbik7Ci0JCQlzZXREZXNjcmlwdGlvblR5cGUobmV3VmFsdWUpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdEaXNwbGF5TmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2V0RGlzcGxheU5hbWVUeXBlKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlEaXNwbGF5TmFtZVR5cGUgbmV3VmFsdWUgPSBudWxsOwotCQlpZihnZXREaXNwbGF5TmFtZVR5cGUoKSAhPSBudWxsKSB7Ci0JCQluZXdWYWx1ZSA9IGdldERpc3BsYXlOYW1lVHlwZSgpOwotCQkJbmV3VmFsdWUuc2V0VmFsdWUobmV3RGlzcGxheU5hbWUpOwotCQl9Ci0JCWVsc2UgIHsKLQkJCW5ld1ZhbHVlID0gV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZVR5cGUoKTsKLQkJCW5ld1ZhbHVlLnNldFZhbHVlKG5ld0Rpc3BsYXlOYW1lKTsKLQkJCXNldERpc3BsYXlOYW1lVHlwZShuZXdWYWx1ZSk7Ci0JCX0JCQkgIAotCQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3TGFyZ2VJY29uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTZXRMYXJnZUljb25UeXBlKFN0cmluZyBuZXdMYXJnZUljb24pIHsKLQkJSWNvblR5cGUgbmV3VmFsdWUgPSBudWxsOwotCQlpZihnZXRJY29uVHlwZSgpICE9IG51bGwpIHsKLQkJCW5ld1ZhbHVlID0gZ2V0SWNvblR5cGUoKTsKLQkJCW5ld1ZhbHVlLnNldExhcmdlSWNvbihuZXdMYXJnZUljb24pOwotCQl9Ci0JCWVsc2UgewotCQkJbmV3VmFsdWUgPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJY29uVHlwZSgpOwotCQkJbmV3VmFsdWUuc2V0TGFyZ2VJY29uKG5ld0xhcmdlSWNvbik7Ci0JCQlzZXRJY29uVHlwZShuZXdWYWx1ZSk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1NtYWxsSWNvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2V0U21hbGxJY29uVHlwZShTdHJpbmcgbmV3U21hbGxJY29uKSB7Ci0JCUljb25UeXBlIG5ld1ZhbHVlID0gbnVsbDsKLQkJaWYoZ2V0SWNvblR5cGUoKSAhPSBudWxsKSB7Ci0JCQluZXdWYWx1ZSA9IGdldEljb25UeXBlKCk7Ci0JCQluZXdWYWx1ZS5zZXRTbWFsbEljb24obmV3U21hbGxJY29uKTsKLQkJfQotCQllbHNlIHsKLQkJCW5ld1ZhbHVlID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWNvblR5cGUoKTsKLQkJCW5ld1ZhbHVlLnNldFNtYWxsSWNvbihuZXdTbWFsbEljb24pOwotCQkJc2V0SWNvblR5cGUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBuZXdMYXJnZUljb24pIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJc2V0TGFyZ2VJY29uR2VuKG5ld0xhcmdlSWNvbik7Ci0JCQlpbnRlcm5hbFNldExhcmdlSWNvblR5cGUobmV3TGFyZ2VJY29uKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJc2V0TGFyZ2VJY29uR2VuKG5ld0xhcmdlSWNvbik7Ci0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOiAKLQkJCWludGVybmFsU2V0TGFyZ2VJY29uVHlwZShuZXdMYXJnZUljb24pOyAKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJc2V0U21hbGxJY29uR2VuKG5ld1NtYWxsSWNvbik7Ci0JCQlpbnRlcm5hbFNldFNtYWxsSWNvblR5cGUobmV3U21hbGxJY29uKTsgCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCXNldFNtYWxsSWNvbkdlbihuZXdTbWFsbEljb24pOwotCQkJYnJlYWs7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotCQlkZWZhdWx0IDogCi0JCQlpbnRlcm5hbFNldFNtYWxsSWNvblR5cGUobmV3U21hbGxJY29uKTsgCi0JCQlicmVhazsKLQkJfQotCX0KLQotfSAvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDRjMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWIgU2VydmljZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzSW1wbCNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zIDxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc0ltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBXZWJTZXJ2aWNlcwotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IHdlYlNlcnZpY2VEZXNjcmlwdGlvbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXZWJTZXJ2aWNlc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLldFQl9TRVJWSUNFUzsKLQl9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLSAgCXN1cGVyLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKLSAgfQotICAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkgewotCQlpZiAod2ViU2VydmljZURlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgotCQkJCWdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgotCQkJCWdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gd2ViU2VydmljZURlc2NyaXB0aW9ucyAhPSBudWxsICYmICF3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vV2ViU2VydmljZXNJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2FjY2Y3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3NkZEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgV3NkZEZhY3RvcnkKLXsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXc2RkRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJV3NkZEZhY3RvcnkgdGhlV3NkZEZhY3RvcnkgPSAoV3NkZEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoIndzZGQueG1pIik7IAotCQkJaWYgKHRoZVdzZGRGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlV3NkZEZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgV3NkZEZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXc2RkRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVM6IHJldHVybiBjcmVhdGVXZWJTZXJ2aWNlcygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTjogcmV0dXJuIGNyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVDogcmV0dXJuIGNyZWF0ZVBvcnRDb21wb25lbnQoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9QT1JUOiByZXR1cm4gY3JlYXRlV1NETFBvcnQoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU46IHJldHVybiBjcmVhdGVTZXJ2aWNlSW1wbEJlYW4oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVkxFVF9MSU5LOiByZXR1cm4gY3JlYXRlU2VydmxldExpbmsoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuRUpCX0xJTks6IHJldHVybiBjcmVhdGVFSkJMaW5rKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVI6IHJldHVybiBjcmVhdGVIYW5kbGVyKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkJFQU5fTElOSzogcmV0dXJuIGNyZWF0ZUJlYW5MaW5rKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldTRExfU0VSVklDRTogcmV0dXJuIGNyZWF0ZVdTRExTZXJ2aWNlKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU46IHJldHVybiBjcmVhdGVIYW5kbGVyQ2hhaW4oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUlNfQ0hBSU5TOiByZXR1cm4gY3JlYXRlSGFuZGxlcnNDaGFpbnMoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VzIGNyZWF0ZVdlYlNlcnZpY2VzKCkgewotCQlXZWJTZXJ2aWNlc0ltcGwgd2ViU2VydmljZXMgPSBuZXcgV2ViU2VydmljZXNJbXBsKCk7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uKCkgewotCQlXZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIHdlYlNlcnZpY2VEZXNjcmlwdGlvbiA9IG5ldyBXZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgUG9ydENvbXBvbmVudCBjcmVhdGVQb3J0Q29tcG9uZW50KCkgewotCQlQb3J0Q29tcG9uZW50SW1wbCBwb3J0Q29tcG9uZW50ID0gbmV3IFBvcnRDb21wb25lbnRJbXBsKCk7Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExQb3J0IGNyZWF0ZVdTRExQb3J0KCkgewotCQlXU0RMUG9ydEltcGwgd3NkbFBvcnQgPSBuZXcgV1NETFBvcnRJbXBsKCk7Ci0JCXJldHVybiB3c2RsUG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTZXJ2aWNlSW1wbEJlYW4gY3JlYXRlU2VydmljZUltcGxCZWFuKCkgewotCQlTZXJ2aWNlSW1wbEJlYW5JbXBsIHNlcnZpY2VJbXBsQmVhbiA9IG5ldyBTZXJ2aWNlSW1wbEJlYW5JbXBsKCk7Ci0JCXJldHVybiBzZXJ2aWNlSW1wbEJlYW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU2VydmxldExpbmsgY3JlYXRlU2VydmxldExpbmsoKSB7Ci0JCVNlcnZsZXRMaW5rSW1wbCBzZXJ2bGV0TGluayA9IG5ldyBTZXJ2bGV0TGlua0ltcGwoKTsKLQkJcmV0dXJuIHNlcnZsZXRMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVKQkxpbmsgY3JlYXRlRUpCTGluaygpIHsKLQkJRUpCTGlua0ltcGwgZWpiTGluayA9IG5ldyBFSkJMaW5rSW1wbCgpOwotCQlyZXR1cm4gZWpiTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBIYW5kbGVyIGNyZWF0ZUhhbmRsZXIoKSB7Ci0JCUhhbmRsZXJJbXBsIGhhbmRsZXIgPSBuZXcgSGFuZGxlckltcGwoKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJlYW5MaW5rIGNyZWF0ZUJlYW5MaW5rKCkgewotCQlCZWFuTGlua0ltcGwgYmVhbkxpbmsgPSBuZXcgQmVhbkxpbmtJbXBsKCk7Ci0JCXJldHVybiBiZWFuTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETFNlcnZpY2UgY3JlYXRlV1NETFNlcnZpY2UoKSB7Ci0JCVdTRExTZXJ2aWNlSW1wbCB3c2RsU2VydmljZSA9IG5ldyBXU0RMU2VydmljZUltcGwoKTsKLQkJcmV0dXJuIHdzZGxTZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIYW5kbGVyQ2hhaW4gY3JlYXRlSGFuZGxlckNoYWluKCkgewotCQlIYW5kbGVyQ2hhaW5JbXBsIGhhbmRsZXJDaGFpbiA9IG5ldyBIYW5kbGVyQ2hhaW5JbXBsKCk7Ci0JCXJldHVybiBoYW5kbGVyQ2hhaW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhhbmRsZXJzQ2hhaW5zIGNyZWF0ZUhhbmRsZXJzQ2hhaW5zKCkgewotCQlIYW5kbGVyc0NoYWluc0ltcGwgaGFuZGxlcnNDaGFpbnMgPSBuZXcgSGFuZGxlcnNDaGFpbnNJbXBsKCk7Ci0JCXJldHVybiBoYW5kbGVyc0NoYWluczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXc2RkUGFja2FnZSBnZXRXc2RkUGFja2FnZSgpIHsKLQkJcmV0dXJuIChXc2RkUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIFdzZGRQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vV3NkZEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjBhODdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyc0NoYWluczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXc2RkUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBXc2RkUGFja2FnZQotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgd2ViU2VydmljZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBwb3J0Q29tcG9uZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbFBvcnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBzZXJ2bGV0TGlua0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGVqYkxpbmtFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBoYW5kbGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgYmVhbkxpbmtFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd3NkbFNlcnZpY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaGFuZGxlckNoYWluRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGhhbmRsZXJzQ2hhaW5zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBXc2RkUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBXc2RkUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoV3NkZFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFdzZGRQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVXc2RkUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlV3NkZFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFdlYlNlcnZpY2VzKCkgewotCQlyZXR1cm4gd2ViU2VydmljZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViU2VydmljZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0pheHJwY01hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dzZGxGaWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fU21hbGxJY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fTGFyZ2VJY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWVUeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFBvcnRDb21wb25lbnQoKSB7Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9Qb3J0Q29tcG9uZW50TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb25UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZVR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9JY29uVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9Xc2RsU2VydmljZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9FbmFibGVNdG9tKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X1Byb3RvY29sQmluZGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVyQ2hhaW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETFBvcnQoKSB7Ci0JCXJldHVybiB3c2RsUG9ydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0U2VydmljZUltcGxCZWFuKCkgewotCQlyZXR1cm4gc2VydmljZUltcGxCZWFuRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZUltcGxCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlSW1wbEJlYW5fRVNlcnZsZXRMaW5rKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZUltcGxCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0U2VydmxldExpbmsoKSB7Ci0JCXJldHVybiBzZXJ2bGV0TGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldExpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0RUpCTGluaygpIHsKLQkJcmV0dXJuIGVqYkxpbmtFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFSkJMaW5rX0VqYkxpbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJMaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldEhhbmRsZXIoKSB7Ci0JCXJldHVybiBoYW5kbGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldEhhbmRsZXJfU29hcFJvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRCZWFuTGluaygpIHsKLQkJcmV0dXJuIGJlYW5MaW5rRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V1NETFNlcnZpY2UoKSB7Ci0JCXJldHVybiB3c2RsU2VydmljZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEhhbmRsZXJDaGFpbigpIHsKLQkJcmV0dXJuIGhhbmRsZXJDaGFpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIYW5kbGVyQ2hhaW5fU2VydmljZU5hbWVQYXR0ZXJuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaGFuZGxlckNoYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SGFuZGxlckNoYWluX1BvcnROYW1lUGF0dGVybigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWhhbmRsZXJDaGFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEhhbmRsZXJDaGFpbl9Qcm90b2NvbEJpbmRpbmdzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaGFuZGxlckNoYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SGFuZGxlckNoYWluX0hhbmRsZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaGFuZGxlckNoYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRIYW5kbGVyc0NoYWlucygpIHsKLQkJcmV0dXJuIGhhbmRsZXJzQ2hhaW5zRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEhhbmRsZXJzQ2hhaW5zX0hhbmRsZXJDaGFpbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWhhbmRsZXJzQ2hhaW5zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV3NkZEZhY3RvcnkgZ2V0V3NkZEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoV3NkZEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXdlYlNlcnZpY2VzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9TRVJWSUNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViU2VydmljZXNFQ2xhc3MsIFdFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TKTsKLQotCQl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcywgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0pBWFJQQ19NQVBQSU5HX0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcywgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcywgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dTRExfRklMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fU01BTExfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fTEFSR0VfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcywgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUVfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFKTsKLQotCQlwb3J0Q29tcG9uZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPUlRfQ09NUE9ORU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fUE9SVF9DT01QT05FTlRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fU01BTExfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0xBUkdFX0lDT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fSEFORExFUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19XU0RMX1NFUlZJQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19FTkFCTEVfTVRPTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX1BST1RPQ09MX0JJTkRJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19IQU5ETEVSX0NIQUlOUyk7Ci0KLQkJd3NkbFBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV1NETF9QT1JUKTsKLQotCQlzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VSVklDRV9JTVBMX0JFQU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VJbXBsQmVhbkVDbGFzcywgU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZUltcGxCZWFuRUNsYXNzLCBTRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZUltcGxCZWFuRUNsYXNzLCBTRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LKTsKLQotCQlzZXJ2bGV0TGlua0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWTEVUX0xJTkspOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRMaW5rRUNsYXNzLCBTRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSyk7Ci0KLQkJZWpiTGlua0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiTGlua0VDbGFzcywgRUpCX0xJTktfX0VKQl9MSU5LKTsKLQotCQloYW5kbGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEhBTkRMRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX0hBTkRMRVJfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaGFuZGxlckVDbGFzcywgSEFORExFUl9fSEFORExFUl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaGFuZGxlckVDbGFzcywgSEFORExFUl9fSU5JVF9QQVJBTVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX1NPQVBfSEVBREVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaGFuZGxlckVDbGFzcywgSEFORExFUl9fU09BUF9ST0xFUyk7Ci0KLQkJYmVhbkxpbmtFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQkVBTl9MSU5LKTsKLQotCQl3c2RsU2VydmljZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMX1NFUlZJQ0UpOwotCi0JCWhhbmRsZXJDaGFpbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIQU5ETEVSX0NIQUlOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShoYW5kbGVyQ2hhaW5FQ2xhc3MsIEhBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShoYW5kbGVyQ2hhaW5FQ2xhc3MsIEhBTkRMRVJfQ0hBSU5fX1BPUlRfTkFNRV9QQVRURVJOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShoYW5kbGVyQ2hhaW5FQ2xhc3MsIEhBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShoYW5kbGVyQ2hhaW5FQ2xhc3MsIEhBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTKTsKLQotCQloYW5kbGVyc0NoYWluc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIQU5ETEVSU19DSEFJTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGhhbmRsZXJzQ2hhaW5zRUNsYXNzLCBIQU5ETEVSU19DSEFJTlNfX0hBTkRMRVJfQ0hBSU4pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJV3Njb21tb25QYWNrYWdlIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl3ZWJTZXJ2aWNlc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3c2RsUG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldFFOYW1lKCkpOwotCQlzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJc2VydmxldExpbmtFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCZWFuTGluaygpKTsKLQkJZWpiTGlua0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJlYW5MaW5rKCkpOwotCQloYW5kbGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWJlYW5MaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdzZGxTZXJ2aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSk7Ci0JCWhhbmRsZXJDaGFpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQloYW5kbGVyc0NoYWluc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3Mod2ViU2VydmljZXNFQ2xhc3MsIFdlYlNlcnZpY2VzLmNsYXNzLCAiV2ViU2VydmljZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlNlcnZpY2VzX1dlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKSwgbnVsbCwgIndlYlNlcnZpY2VEZXNjcmlwdGlvbnMiLCBudWxsLCAxLCAtMSwgV2ViU2VydmljZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIldlYlNlcnZpY2VEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0pheHJwY01hcHBpbmdGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqYXhycGNNYXBwaW5nRmlsZSIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Xc2RsRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbEZpbGUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9TbWFsbEljb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNtYWxsSWNvbiIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0xhcmdlSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFyZ2VJY29uIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRpc3BsYXlOYW1lIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSwgdGhpcy5nZXRQb3J0Q29tcG9uZW50KCksIG51bGwsICJwb3J0Q29tcG9uZW50cyIsIG51bGwsIDEsIC0xLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvblR5cGUoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uVHlwZSgpLCBudWxsLCAiZGVzY3JpcHRpb25UeXBlIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWVUeXBlKCksIHRoZVdzY29tbW9uUGFja2FnZS5nZXREaXNwbGF5TmFtZVR5cGUoKSwgbnVsbCwgImRpc3BsYXlOYW1lVHlwZSIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0ljb25UeXBlKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0SWNvblR5cGUoKSwgbnVsbCwgImljb25UeXBlIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocG9ydENvbXBvbmVudEVDbGFzcywgUG9ydENvbXBvbmVudC5jbGFzcywgIlBvcnRDb21wb25lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfUG9ydENvbXBvbmVudE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnRDb21wb25lbnROYW1lIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfU21hbGxJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzbWFsbEljb24iLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFyZ2VJY29uIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkaXNwbGF5TmFtZSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKSwgdGhpcy5nZXRXU0RMUG9ydCgpLCBudWxsLCAid3NkbFBvcnQiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VJbXBsQmVhbigpLCB0aGlzLmdldFNlcnZpY2VJbXBsQmVhbigpLCBudWxsLCAic2VydmljZUltcGxCZWFuIiwgbnVsbCwgMSwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpLCB0aGlzLmdldEhhbmRsZXIoKSwgbnVsbCwgImhhbmRsZXJzIiwgbnVsbCwgMCwgLTEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb25UeXBlKCksIHRoZVdzY29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvblR5cGUoKSwgbnVsbCwgImRlc2NyaXB0aW9uVHlwZSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWVUeXBlKCksIHRoZVdzY29tbW9uUGFja2FnZS5nZXREaXNwbGF5TmFtZVR5cGUoKSwgbnVsbCwgImRpc3BsYXlOYW1lVHlwZSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfSWNvblR5cGUoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRJY29uVHlwZSgpLCBudWxsLCAiaWNvblR5cGUiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X1dzZGxTZXJ2aWNlKCksIHRoaXMuZ2V0V1NETFNlcnZpY2UoKSwgbnVsbCwgIndzZGxTZXJ2aWNlIiwgbnVsbCwgMSwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9FbmFibGVNdG9tKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZW5hYmxlTXRvbSIsICIiLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X1Byb3RvY29sQmluZGluZygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJvdG9jb2xCaW5kaW5nIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVyQ2hhaW5zKCksIHRoaXMuZ2V0SGFuZGxlcnNDaGFpbnMoKSwgbnVsbCwgImhhbmRsZXJDaGFpbnMiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod3NkbFBvcnRFQ2xhc3MsIFdTRExQb3J0LmNsYXNzLCAiV1NETFBvcnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MsIFNlcnZpY2VJbXBsQmVhbi5jbGFzcywgIlNlcnZpY2VJbXBsQmVhbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCksIHRoaXMuZ2V0RUpCTGluaygpLCBudWxsLCAiZUVKQkxpbmsiLCBudWxsLCAwLCAxLCBTZXJ2aWNlSW1wbEJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKSwgdGhpcy5nZXRTZXJ2bGV0TGluaygpLCBudWxsLCAiZVNlcnZsZXRMaW5rIiwgbnVsbCwgMCwgMSwgU2VydmljZUltcGxCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSwgdGhpcy5nZXRCZWFuTGluaygpLCBudWxsLCAiYmVhbkxpbmsiLCBudWxsLCAwLCAxLCBTZXJ2aWNlSW1wbEJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2bGV0TGlua0VDbGFzcywgU2VydmxldExpbmsuY2xhc3MsICJTZXJ2bGV0TGluayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldExpbmtfU2VydmxldExpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZsZXRMaW5rIiwgbnVsbCwgMCwgMSwgU2VydmxldExpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJMaW5rRUNsYXNzLCBFSkJMaW5rLmNsYXNzLCAiRUpCTGluayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCTGlua19FamJMaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlamJMaW5rIiwgbnVsbCwgMCwgMSwgRUpCTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGhhbmRsZXJFQ2xhc3MsIEhhbmRsZXIuY2xhc3MsICJIYW5kbGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJoYW5kbGVyTmFtZSIsIG51bGwsIDAsIDEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJoYW5kbGVyQ2xhc3MiLCBudWxsLCAwLCAxLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyX0luaXRQYXJhbXMoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldEluaXRQYXJhbSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCksIHRoZVdzY29tbW9uUGFja2FnZS5nZXRTT0FQSGVhZGVyKCksIG51bGwsICJzb2FwSGVhZGVycyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyX1NvYXBSb2xlcygpLCB0aGVXc2NvbW1vblBhY2thZ2UuZ2V0U09BUFJvbGUoKSwgbnVsbCwgInNvYXBSb2xlcyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYmVhbkxpbmtFQ2xhc3MsIEJlYW5MaW5rLmNsYXNzLCAiQmVhbkxpbmsiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh3c2RsU2VydmljZUVDbGFzcywgV1NETFNlcnZpY2UuY2xhc3MsICJXU0RMU2VydmljZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGhhbmRsZXJDaGFpbkVDbGFzcywgSGFuZGxlckNoYWluLmNsYXNzLCAiSGFuZGxlckNoYWluIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyQ2hhaW5fU2VydmljZU5hbWVQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlTmFtZVBhdHRlcm4iLCBudWxsLCAwLCAxLCBIYW5kbGVyQ2hhaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJDaGFpbl9Qb3J0TmFtZVBhdHRlcm4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lUGF0dGVybiIsIG51bGwsIDAsIDEsIEhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlckNoYWluX1Byb3RvY29sQmluZGluZ3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInByb3RvY29sQmluZGluZ3MiLCBudWxsLCAwLCAtMSwgSGFuZGxlckNoYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyQ2hhaW5fSGFuZGxlcnMoKSwgdGhpcy5nZXRIYW5kbGVyKCksIG51bGwsICJoYW5kbGVycyIsIG51bGwsIDEsIC0xLCBIYW5kbGVyQ2hhaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhoYW5kbGVyc0NoYWluc0VDbGFzcywgSGFuZGxlcnNDaGFpbnMuY2xhc3MsICJIYW5kbGVyc0NoYWlucyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SGFuZGxlcnNDaGFpbnNfSGFuZGxlckNoYWluKCksIHRoaXMuZ2V0SGFuZGxlckNoYWluKCksIG51bGwsICJoYW5kbGVyQ2hhaW4iLCBudWxsLCAwLCAtMSwgSGFuZGxlcnNDaGFpbnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvL1dzZGRQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZFJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTliMzY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlcy5Xc2RkVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLldlYlNlcnZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgV3NkZFJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFdzZGRSZXNvdXJjZQotewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBXc2RkUmVzb3VyY2VJbXBsLgotCSAqLwotCXB1YmxpYyBXc2RkUmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFdzZGRSZXNvdXJjZUltcGwuCi0JICogQHBhcmFtIHVyaQotCSAqLwotCXB1YmxpYyBXc2RkUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcihhUmVuZGVyZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzIGdldFdlYlNlcnZpY2VzKCkgewotCQlyZXR1cm4gKFdlYlNlcnZpY2VzKSBnZXRSb290T2JqZWN0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI2dldFJvb3RUcmFuc2xhdG9yKCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFdzZGRUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlI2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFdFQl9TRVJWSUNFX1RZUEU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0RG9jdHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgCi0JewotCSAgc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIAotCSAgewotCSAgICBjYXNlIChKMkVFXzFfMl9JRCkgOgotCSAgICBjYXNlIChKMkVFXzFfM19JRCkgOgkKLQkgICAgICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX0RPQ1RZUEU7Ci0JICAgIGRlZmF1bHQgOgotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLQl9Ci0KLSAgIHB1YmxpYyBib29sZWFuIGlzV2ViU2VydmljZTFfMCgpCi0gICB7Ci0gICAgICByZXR1cm4gKGdldE1vZHVsZVZlcnNpb25JRCgpPT1XZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEKTsKLSAgIH0KLQotICAgcHVibGljIGJvb2xlYW4gaXNXZWJTZXJ2aWNlMV8xKCkKLSAgIHsKLSAgICAgIHJldHVybiAoZ2V0TW9kdWxlVmVyc2lvbklEKCk9PVdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzFfSUQpOyAgCi0gICB9Ci0gICBwdWJsaWMgYm9vbGVhbiBpc1dlYlNlcnZpY2UxXzIoKQotICAgewotICAgICAgcmV0dXJuIChnZXRNb2R1bGVWZXJzaW9uSUQoKT09V2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMl9JRCk7ICAKLSAgIH0KLQotCS8qIAotCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7Ci0JLy9zdXBlci5zZXRWZXJzaW9uSUQoaWQpOwotCXN3aXRjaCAoaWQpIHsKLQkJCWNhc2UgKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzJfSUQpIDoKLQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCXByaW1TZXRWZXJzaW9uSUQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMl9JRCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8xX0lEKSA6Ci0JCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQlwcmltU2V0VmVyc2lvbklEKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzFfSUQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMF9JRCkgOgotCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJYnJlYWs7CQkJCi0JCX0KLQl9Ci0JLyoKLQkgKiBCYXNlZCBvbiB0aGUgSjJFRSB2ZXJzaW9uLCB0aGlzIHdpbGwgc2V0IHRoZSBtb2R1bGUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uSUQoaW50IGlkKSAKLSAgewotICAgIHN3aXRjaCAoaWQpIHsKLQkgICAgY2FzZSAoSkVFXzVfMF9JRCkgOgotCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8yX0lEKTsKLQkJCQkJYnJlYWs7Ci0gICAgCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0gICAgCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotICAgIAkJCQlwcmltU2V0VmVyc2lvbklEKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzFfSUQpOwotICAgIAkJCQlicmVhazsKLSAgICAJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLSAgICAJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0gICAgCQkJCXByaW1TZXRWZXJzaW9uSUQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMF9JRCk7Ci0gICAgCQkJCWJyZWFrOwotICAgIAljYXNlIChKMkVFXzFfMl9JRCkgOgotICAgIAkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLSAgICAJCQkJcHJpbVNldFZlcnNpb25JRChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEKTsKLSAgICAJCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewotCSAgcmV0dXJuICBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfUFVCTElDSUQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSB7Ci0JICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1NZU1RFTUlEOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1B1YmxpY0lEKCkgewotCSAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9QVUJMSUNJRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1NZU1RFTUlEOwotCX0KLQotCS8qIFJldHVybiBKMkVFIHZlcnNpb24gYmFzZWQgb24gbW9kdWxlIHZlcnNpb24KLQkqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHsKLQkJc3dpdGNoIChnZXRNb2R1bGVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCWNhc2UgV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMV9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJY2FzZSBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8yX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKLQkJCWRlZmF1bHQgOgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlSW1wbCNnZXREZWZhdWx0VmVyc2lvbklEKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEOwotCX0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKLSAgewotICAgIC8vRG8gbm90aGluZyBmb3Igbm93IHNpbmNlIHRoZSByb290IG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgdmVyc2lvbi4KLSAgfQotCi0KLXB1YmxpYyB2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkKLQkJaW50IG15VmVyc2lvbiA9IEoyRUVfMV80X0lEOwotCQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkgewotCQkJbXlWZXJzaW9uID0gcHJpbUdldFZlcnNpb25JRCgpOwotCQkJc2V0TW9kdWxlVmVyc2lvbklEKG15VmVyc2lvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkKLX0KLQotcHJpdmF0ZSBpbnQgcHJpbUdldFZlcnNpb25JRCgpIHsKLQlJRmlsZSBhZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUodGhpcyk7Ci0JSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBudWxsOwotCWlmIChhZmlsZSAhPSBudWxsICYmIGFmaWxlLmV4aXN0cygpKSB7Ci0JCXRyeSB7Ci0JCQlpbiA9IGFmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKGluKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gcXVpY2tQZWVrLmdldFZlcnNpb24oKTsKLQl9IGVsc2V7Ci0JCVN0cmluZyBwYXRoID0gZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgpOwotCQkJCWlmIChpbiAhPSBudWxsKSB7Ci0KLQkJCQkJcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhpbik7Ci0JCQkJCXJldHVybiBxdWlja1BlZWsuZ2V0VmVyc2lvbigpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlMSkgewotCQkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUxKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBnZXRNb2R1bGVWZXJzaW9uSUQoKTsKLX0KLQotICAKLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL3V0aWwvV3NkZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyOTc0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3NkZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIFdzZGRQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXc2RkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gV3NkZFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV3NkZFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBXc2RkU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViU2VydmljZXMoV2ViU2VydmljZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYlNlcnZpY2VzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViU2VydmljZURlc2NyaXB0aW9uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUG9ydENvbXBvbmVudChQb3J0Q29tcG9uZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQb3J0Q29tcG9uZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETFBvcnQoV1NETFBvcnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExQb3J0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmljZUltcGxCZWFuKFNlcnZpY2VJbXBsQmVhbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZUltcGxCZWFuQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldExpbmsoU2VydmxldExpbmsgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRMaW5rQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCTGluayhFSkJMaW5rIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFSkJMaW5rQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSGFuZGxlcihIYW5kbGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVIYW5kbGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQmVhbkxpbmsoQmVhbkxpbmsgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJlYW5MaW5rQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETFNlcnZpY2UoV1NETFNlcnZpY2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExTZXJ2aWNlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSGFuZGxlckNoYWluKEhhbmRsZXJDaGFpbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSGFuZGxlckNoYWluQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSGFuZGxlcnNDaGFpbnMoSGFuZGxlcnNDaGFpbnMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUhhbmRsZXJzQ2hhaW5zQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUU5hbWUoUU5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVFOYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzIDxlbT5XZWIgU2VydmljZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJTZXJ2aWNlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCA8ZW0+UG9ydCBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydCA8ZW0+V1NETCBQb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFBvcnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4gPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VJbXBsQmVhbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rIDxlbT5TZXJ2bGV0IExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0TGlua0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbmsgPGVtPkVKQiBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJMaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciA8ZW0+SGFuZGxlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSGFuZGxlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rIDxlbT5CZWFuIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCZWFuTGlua0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExTZXJ2aWNlIDxlbT5XU0RMIFNlcnZpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExTZXJ2aWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExTZXJ2aWNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlckNoYWluIDxlbT5IYW5kbGVyIENoYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyQ2hhaW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSGFuZGxlckNoYWluQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcnNDaGFpbnMgPGVtPkhhbmRsZXJzIENoYWluczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcnNDaGFpbnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSGFuZGxlcnNDaGFpbnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUgPGVtPlFOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV3NkZEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzUyNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL3V0aWwvV3NkZFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdzZGRTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBXc2RkUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV3NkZFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBXc2RkUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVM6IHsKLQkJCQlXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcyA9IChXZWJTZXJ2aWNlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2ViU2VydmljZXMod2ViU2VydmljZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKHdlYlNlcnZpY2VzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKHdlYlNlcnZpY2VzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3ZWJTZXJ2aWNlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTjogewotCQkJCVdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24gPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJTZXJ2aWNlRGVzY3JpcHRpb24od2ViU2VydmljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3ZWJTZXJ2aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlQ6IHsKLQkJCQlQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQgPSAoUG9ydENvbXBvbmVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUG9ydENvbXBvbmVudChwb3J0Q29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChwb3J0Q29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldTRExfUE9SVDogewotCQkJCVdTRExQb3J0IHdzZGxQb3J0ID0gKFdTRExQb3J0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXU0RMUG9ydCh3c2RsUG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUod3NkbFBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdzZGxQb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOOiB7Ci0JCQkJU2VydmljZUltcGxCZWFuIHNlcnZpY2VJbXBsQmVhbiA9IChTZXJ2aWNlSW1wbEJlYW4pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZpY2VJbXBsQmVhbihzZXJ2aWNlSW1wbEJlYW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNlcnZpY2VJbXBsQmVhbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTks6IHsKLQkJCQlTZXJ2bGV0TGluayBzZXJ2bGV0TGluayA9IChTZXJ2bGV0TGluayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmxldExpbmsoc2VydmxldExpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJlYW5MaW5rKHNlcnZsZXRMaW5rKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzZXJ2bGV0TGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2RkUGFja2FnZS5FSkJfTElOSzogewotCQkJCUVKQkxpbmsgZWpiTGluayA9IChFSkJMaW5rKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJMaW5rKGVqYkxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJlYW5MaW5rKGVqYkxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGVqYkxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUjogewotCQkJCUhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIYW5kbGVyKGhhbmRsZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGhhbmRsZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoaGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoaGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2RkUGFja2FnZS5CRUFOX0xJTks6IHsKLQkJCQlCZWFuTGluayBiZWFuTGluayA9IChCZWFuTGluayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQmVhbkxpbmsoYmVhbkxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGJlYW5MaW5rKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldTRExfU0VSVklDRTogewotCQkJCVdTRExTZXJ2aWNlIHdzZGxTZXJ2aWNlID0gKFdTRExTZXJ2aWNlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXU0RMU2VydmljZSh3c2RsU2VydmljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUod3NkbFNlcnZpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdzZGxTZXJ2aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU46IHsKLQkJCQlIYW5kbGVyQ2hhaW4gaGFuZGxlckNoYWluID0gKEhhbmRsZXJDaGFpbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSGFuZGxlckNoYWluKGhhbmRsZXJDaGFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoaGFuZGxlckNoYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJTX0NIQUlOUzogewotCQkJCUhhbmRsZXJzQ2hhaW5zIGhhbmRsZXJzQ2hhaW5zID0gKEhhbmRsZXJzQ2hhaW5zKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIYW5kbGVyc0NoYWlucyhoYW5kbGVyc0NoYWlucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoaGFuZGxlcnNDaGFpbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBTZXJ2aWNlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBTZXJ2aWNlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVdlYlNlcnZpY2VzKFdlYlNlcnZpY2VzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV2ViU2VydmljZURlc2NyaXB0aW9uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBDb21wb25lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0IENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBvcnRDb21wb25lbnQoUG9ydENvbXBvbmVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBQb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBQb3J0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETFBvcnQoV1NETFBvcnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlSW1wbEJlYW4oU2VydmljZUltcGxCZWFuIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2bGV0IExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2bGV0IExpbms8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0TGluayhTZXJ2bGV0TGluayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgTGluazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUVKQkxpbmsoRUpCTGluayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGFuZGxlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhhbmRsZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VIYW5kbGVyKEhhbmRsZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJlYW4gTGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJlYW4gTGluazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUJlYW5MaW5rKEJlYW5MaW5rIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMIFNlcnZpY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMIFNlcnZpY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdTRExTZXJ2aWNlKFdTRExTZXJ2aWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IYW5kbGVyIENoYWluPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGFuZGxlciBDaGFpbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSGFuZGxlckNoYWluKEhhbmRsZXJDaGFpbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGFuZGxlcnMgQ2hhaW5zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGFuZGxlcnMgQ2hhaW5zPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VIYW5kbGVyc0NoYWlucyhIYW5kbGVyc0NoYWlucyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlFOYW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlUU5hbWUoUU5hbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV3NkZFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWJhOTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5FSkIgQXJ0aWZhY3QgRWRpdCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIHRoZSB3ZWIgc2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvbW1vbiBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSAgd2ViIHNlcnZpY2VzIGRlcG9seW1lbnQgZGVzY3JpcHRvciBtb2RlbCBhcnRpZmFjdHMgKFBvcnRDb21wb25lbnRzLCBIYW5kbGVycywgV1NETFBvcnRzLCBXZWJTZXJ2aWNlcyBEZXNjcmlwdGlvbiBldGMuKSAKLSAgICAgICAgY2FuIGJlIGNyZWF0ZWQgYW5kIGFjY2Vzc2VkLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2plZS9hcHBsaWNhdGlvbi9JQ29tbW9uQXBwbGljYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXBwbGljYXRpb24vSUNvbW1vbkFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MjNhYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2plZS9hcHBsaWNhdGlvbi9JQ29tbW9uQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGludGVyZmFjZSBJQ29tbW9uQXBwbGljYXRpb24gewotCQotCXB1YmxpYyBJQ29tbW9uTW9kdWxlIGdldEZpcnN0RUFSTW9kdWxlKFN0cmluZyB1cmkpOwotCXB1YmxpYyBMaXN0IGdldEVBUk1vZHVsZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2plZS9hcHBsaWNhdGlvbi9JQ29tbW9uTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FwcGxpY2F0aW9uL0lDb21tb25Nb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhNjU2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FwcGxpY2F0aW9uL0lDb21tb25Nb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmFwcGxpY2F0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tb25Nb2R1bGUgewotCQotCXZvaWQgc2V0VXJpKFN0cmluZyB2YWx1ZSk7Ci0KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGlmIHRoaXMgTW9kdWxlIHJlcHJlc2VudHMgYSBDb25uZWN0b3JNb2R1bGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3Rvck1vZHVsZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgYm9vbGVhbiB2YWx1ZSBpZiB0aGlzIE1vZHVsZSByZXByZXNlbnRzIGEgRWpiTW9kdWxlCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFamJNb2R1bGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgaWYgdGhpcyBNb2R1bGUgcmVwcmVzZW50cyBhIEphdmFDbGllbnRNb2R1bGUoQXBwbGljYXRpb25DbGllbnQpCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKYXZhTW9kdWxlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGlmIHRoaXMgTW9kdWxlIHJlcHJlc2VudHMgYSBXZWJNb2R1bGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYk1vZHVsZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUveG1scGFyc2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL3htbHBhcnNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Nzk5ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUveG1scGFyc2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotbWV0aG9kX2ludm9rZV9mYWlsZWRfRVhDXz1JV0FFMDA5NUUgRmFpbGVkIHRvIGludm9rZSB0aGUgbWV0aG9kIG5hbWVkOiB7MH0KLWZhaWxlZF90b19sb2FkX0VYQ189SVdBRTAwOTZFIEZhaWxlZCB0byBsb2FkOiB7MH0KLW1ldGhvZF9ub3RfZm91bmRfRVhDXz1JV0FFMDA5N0UgQ291bGQgbm90IGZpbmQgdGhlIGZvbGxvd2luZyBtZXRob2QgbmFtZWQ6IHswfQotZmFpbGVkX2luc3RhbnRpYXRpbmdfRVhDXz1JV0FFMDA5OEUgRmFpbGVkIGluc3RhbnRpYXRpbmc6IHswfQotcGFyc2VfZXhjZXB0aW9uX29jY3VyZWRfRVhDXz1JV0FFMDA5OUUgQW4gRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgeG1sOiBMaW5lICM6IHswfSA6Q29sdW1uICM6IHsxfQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODRmNTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTFhMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZWpiTW9kZWxFeHRlbmRlciIgbmFtZT0iZWpiTW9kZWxFeHRlbmRlciIgc2NoZW1hPSJzY2hlbWEvZWpiTW9kZWxFeHRlbmRlci5leHNkIi8+Ci0gICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImpuZGlCaW5kaW5nc0hlbHBlcnMiIG5hbWU9ImpuZGlCaW5kaW5nc0hlbHBlcnMiIHNjaGVtYT0ic2NoZW1hL2puZGlCaW5kaW5nc0hlbHBlcnMuZXhzZCIvPgotCi08IS0tSjJFRUluaXQtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEoyRUUgQ29yZSBFeHRlbnNpb24gUG9pbnQgUmVnaXN0cnktLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9ImNvbW1vbi54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9ImFwcGxpY2F0aW9uLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9ImNsaWVudC54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9IndlYmFwcGxpY2F0aW9uLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9ImVqYi54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9ImpjYS54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9ImpzcC54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9IndlYnNlcnZpY2VfY2xpZW50LnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0id3Njb21tb24ueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJ3c2RkLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzcGhlcmUvYXBwc2VydmVyL3NjaGVtYXMvNS4wLjIvd3Njb21tb24ueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmlibS5jb20vd2Vic3BoZXJlL2FwcHNlcnZlci9zY2hlbWFzLzUuMC4yL3dzZGQueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS1BcmNoaXZlSW5pdC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJjb21tb25hcmNoaXZlLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iY29tbW9uYXJjaGl2ZS5sb29zZWNvbmZpZy54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIGEgcGxhY2UgaG9sZGVyIGZvciB0aGUgZnV0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gU2V2ZXJhbCB0aGF0IGhhdmUgbm90IGNoYW5nZWQgYXJlIHN0aWxsIHJlZ2lzdGVyZWQgYXMgIC0tPgotPCEtLSBSZWdpc3RlciBwYWNrYWdlIG1hcHBpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi5wYWNrYWdlVVJJTWFwIj4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iY29tbW9uLnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0iY29tbW9uIj4KLSAgICAgIDwvbWFwPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJhcHBsaWNhdGlvbi54bWkiCi0gICAgICAgICAgICBwcmVmaXg9ImFwcGxpY2F0aW9uIj4KLSAgICAgIDwvbWFwPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJjbGllbnQueG1pIgotICAgICAgICAgICAgcHJlZml4PSJjbGllbnQiPgotICAgICAgPC9tYXA+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9IndlYmFwcGxpY2F0aW9uLnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0id2ViYXBwbGljYXRpb24iPgotICAgICAgPC9tYXA+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9ImVqYi54bWkiCi0gICAgICAgICAgICBwcmVmaXg9ImVqYiI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iamNhLnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0iamNhIj4KLSAgICAgIDwvbWFwPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJ0YWdsaWIueG1pIgotICAgICAgICAgICAgcHJlZml4PSJ0YWdsaWIiPgotICAgICAgPC9tYXA+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9ImpzcC54bWkiCi0gICAgICAgICAgICBwcmVmaXg9ImpzcCI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iY29tbW9uYXJjaGl2ZS54bWkiCi0gICAgICAgICAgICBwcmVmaXg9ImNvbW1vbmFyY2hpdmUiPgotICAgICAgPC9tYXA+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9ImNvbW1vbmFyY2hpdmUubG9vc2Vjb25maWcueG1pIgotICAgICAgICAgICAgcHJlZml4PSJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnIj4KLSAgICAgIDwvbWFwPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iajJlZUFwcGxpY2F0aW9uRXJyb3JDdXN0b21pemVyIgotICAgICAgICAgbmFtZT0iJUoyRUVBcHBsaWNhdGlvbkVycm9yQ3VzdG9taXplciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZXJyb3JDdXN0b21pemVyIj4KLSAgICAgIDxlcnJvckN1c3RvbWl6ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24ueG1sZXJyb3JjdXN0b21pemF0aW9uLkoyRUVFcnJvck1lc3NhZ2VDdXN0b21pemVyIgotICAgICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgCi0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5yZXNvdXJjZUZhY3RvcmllcyI+Ci0gICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwUmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICBzaG9ydFNlZ21lbnQ9IndlYi54bWwiPgotICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAJICAJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViREQiPgotICAgICAgICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgICAgPC9yZXNvdXJjZUZhY3Rvcnk+Ci0gICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphclJlc291cmNlRmFjdG9yeSIKLSAgICAgICAgICAgc2hvcnRTZWdtZW50PSJlamItamFyLnhtbCI+Ci0gICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiREQiPgotICAgICAgICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgICAgPC9yZXNvdXJjZUZhY3Rvcnk+Ci0gICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICBzaG9ydFNlZ21lbnQ9ImFwcGxpY2F0aW9uLWNsaWVudC54bWwiPgotICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGNsaWVudEREIj4KLSAgICAgICAgPC9jb250ZW50VHlwZUJpbmRpbmc+Ci0gICAgIDwvcmVzb3VyY2VGYWN0b3J5PgotICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICBzaG9ydFNlZ21lbnQ9ImFwcGxpY2F0aW9uLnhtbCI+Ci0gICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWFyREQiPgotICAgICAgICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgICAgPC9yZXNvdXJjZUZhY3Rvcnk+Ci0gICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvclJlc291cmNlRmFjdG9yeSIKLSAgICAgICAgICAgc2hvcnRTZWdtZW50PSJyYS54bWwiPgotICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbm5lY3RvckREIj4KLSAgICAgICAgPC9jb250ZW50VHlwZUJpbmRpbmc+Ci0gICAgIDwvcmVzb3VyY2VGYWN0b3J5PgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjg5NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS5ldG9vbHMuajJlZS5jb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9tb2ZqMmVlIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vbW9majJlZSI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vY29tbW9uQXJjaGl2ZSIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L2NvbW1vbkFyY2hpdmUiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0gIAkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L2oyZWUtdmFsaWRhdGlvbiIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L2oyZWUtdmFsaWRhdGlvbiI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQkKLSAgCQk8Y29weSBmaWxlPSIke3BsdWdpbmRpcn0vcGx1Z2luLnByb3BlcnRpZXMiIHRvZGlyPSIke291dHB1dERpcn0iLz4KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2FwcGxpY2F0aW9uLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2FwcGxpY2F0aW9uLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3YjljYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9hcHBsaWNhdGlvbi5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSw5MDEgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk1MA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImFwcGxpY2F0aW9uIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIklETCINCi0JICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODdmM2UwMC04ODI2LTExZTEtMDAwMC0wMDVkOWU2YWRlYzQ6MSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmpzdC5qMmVlIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkibnNVUkkiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiYXBwbGljYXRpb24ueG1pIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkFwcGxpY2F0aW9uIikpKQ0KLSAgICBxdWlkICAgICAgIAkiMzhDMDMwMDgwMTRFIg0KLSAgICB2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg3ZjNlMDAtODgyNi0xMWUxLTAwMDEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhGRjNDMTAwMkE4Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uIg0KLQkgICAgcXVpZHUgICAgICAJIjM4QzA4RjBGMDM4RCIpKQ0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJBcHBsaWNhdGlvbiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4N2YzZTAwLTg4MjYtMTFlMS0wMDAyLTAwNWQ5ZTZhZGVjNDoxIikpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwMzBBODAzQjEiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGFwcGxpY2F0aW9uVHlwZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlDQotfGFwcGxpY2F0aW9uLg0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQUU5MzAwOTQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1M0Y4NTgwMEY3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IA0KLXxUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuNC4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiTW9kdWxlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMDAtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDMyMkMwMDA2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBtb2R1bGUgZWxlbWVudCByZXByZXNlbnRzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhbiBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4gb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuDQotfA0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXJpIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODgwYzRhMC04ODI2LTExZTEtMDAwMS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDMyQjIwMkRBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTcGVjaWZpZXMgdGhlIFVSSSBvZiBhIG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsdEREIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODgwYzRhMC04ODI2LTExZTEtMDAwMi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDMyRTAwMjA0Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIEoyRUUgbW9kdWxlLiBUaGUgVVJJIG11c3Qgc3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgcm9vdCBkaXJlY3RvcnkuIElmIGFsdC1kZCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVwbG95ZXIgbXVzdCByZWFkIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZnJvbSB0aGUgZGVmYXVsdCBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lIHJlcXVpcmVkIGJ5IHRoZSByZXNwZWN0aXZlIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiV2ViTW9kdWxlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMDMtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzkwNDg2MEQwMjdCIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfENvbnRhaW5zIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YgYSB3ZWIgYXBwbGljYXRpb24gbW9kdWxlLg0KLXwNCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMDQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MDQ4NkFFMDFDOSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6TW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzIyQzAwMDYiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb250ZXh0Um9vdCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMDUtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MDQ4NjE0MDM1OCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IHNwZWNpZmllcyB0aGUgY29udGV4dCByb290IG9mIGEgd2ViIGFwcGxpY2F0aW9uDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSmF2YUNsaWVudE1vZHVsZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ODBjNGEwLTg4MjYtMTFlMS0wMDA2LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM5MDQ4NjczMDAxNSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ODBjNGEwLTg4MjYtMTFlMS0wMDA3LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTA0ODZCMjAxRjYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246Ok1vZHVsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMyMkMwMDA2IikpKQ0KLQkob2JqZWN0IENsYXNzICJFamJNb2R1bGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkODgwYzRhMC04ODI2LTExZTEtMDAwOC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOTA0ODY4MzAyNTMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18U3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBlamItamFyLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLg0KLXwNCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMDktMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MDQ4NkI2MDM3OSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6TW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzIyQzAwMDYiKSkpDQotCShvYmplY3QgQ2xhc3MgIkNvbm5lY3Rvck1vZHVsZSINCi0JICAgIHF1aWQgICAgICAgCSIzOTg5NUJDMDAyMjciDQotCSAgICBkb2N1bWVudGF0aW9uIAkiU3BlY2lmaWVzIHRoZSBVUkkgb2YgYSByZXNvdXJjZSBhZGFwdGVyIGFyY2hpdmUgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4iDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NUJDQTAyMTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246Ok1vZHVsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMyMkMwMDA2IikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMGEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDMzRjgwMEIyIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ODBjNGEwLTg4MjYtMTFlMS0wMDBiLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwMzNGOTAxN0MiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkBkZXByZWNhdGVkIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpBcHBsaWNhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMwQTgwM0IxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInNlY3VyaXR5Um9sZXMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ODBjNGEwLTg4MjYtMTFlMS0wMDBjLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwMzNGOTAxN0QiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfENvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiBzZWN1cml0eSByb2xlcyB3aGljaCBhcmUNCi18Z2xvYmFsIHRvIHRoZSBhcHBsaWNhdGlvbi4gDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInNlY3VyaXR5Um9sZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMUZFMDEyRCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uKiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ODBjNGEwLTg4MjYtMTFlMS0wMDBkLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzAzNDAwMDNDMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJhcHBsaWNhdGlvbiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMGUtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzAzNDAxMDJFNiINCi0JCSAgICBsYWJlbCAgICAgIAkiYXBwbGljYXRpb24iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246OkFwcGxpY2F0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzBBODAzQjEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAibW9kdWxlcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDg4MGM0YTAtODgyNi0xMWUxLTAwMGYtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzAzNDAxMDJFNyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGhhdmUgb25lDQotfCAgICAgICAgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlDQotfCAgICAgICAgYXBwbGljYXRpb24gcGFja2FnZS4gQSBtb2R1bGUgZWxlbWVudCBpcyBkZWZpbmVkDQotfCAgICAgICAgYnkgbW9kdWxlVHlwZSBkZWZpbml0aW9uLg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJtb2R1bGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpNb2R1bGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMjJDMDAwNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQXBwbGljYXRpb24gRGlhZ3JhbSINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwMzI1OTAwQkYiDQotCSAgICB0aXRsZSAgICAgIAkiQXBwbGljYXRpb24gRGlhZ3JhbSINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6V2ViTW9kdWxlIiBAMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzMwLCAxNjA4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMTQyLCAxNTA1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM3Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViTW9kdWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDg2MEQwMjdCIg0KLQkJICAgIHdpZHRoICAgICAgCTM5NA0KLQkJICAgIGhlaWdodCAgICAgCTIzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6SmF2YUNsaWVudE1vZHVsZSIgQDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDY3OCwgMTU3NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDU3OCwgMTUwMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyMDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkphdmFDbGllbnRNb2R1bGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0ODY3MzAwMTUiDQotCQkgICAgd2lkdGggICAgICAJMjE4DQotCQkgICAgaGVpZ2h0ICAgICAJMTc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpFamJNb2R1bGUiIEAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MjIsIDE1NzUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSg4NDEsIDE0OTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFamJNb2R1bGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0ODY4MzAyNTMiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpDb25uZWN0b3JNb2R1bGUiIEA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTUwLCAxNTc1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMTA0OSwgMTQ5OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyMDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbm5lY3Rvck1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTYzODQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NUJDMDAyMjciDQotCQkgICAgd2lkdGggICAgICAJMjIwDQotCQkgICAgaGVpZ2h0ICAgICAJMTc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEA1DQotCQkgICAgbG9jYXRpb24gICAJKDIxMDAsIDEwOTcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANQ0KLQkJCWxvY2F0aW9uICAgCSgxNTYyLCA2MzUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxOA0KLQkJCW1heF93aWR0aCAgCTEwNDANCi0JCQlsYWJlbCAgICAgIAkNCi18VGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2U6DQotfA0KLXwtIEluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBQQ0RBVEEsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gdGhlIGRhdGEgbWF5IGUgaWdub3JlZC4NCi18DQotfC0gSW4gZWxlbWVudHMgd2hvc2UgdmFsdWUgaXMgYW4gICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMgY2FzZSBzZW5zaXRpdmUuDQotfA0KLXwtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90IHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZSBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBzZXJ2bGV0IEFQSS4NCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJMTEwMA0KLQkJICAgIGhlaWdodCAgICAgCTkzNykNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIiBANg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTg3LCAxMzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2DQotCQkJbG9jYXRpb24gICAJKDgwOSwgNTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIg0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZSIgQDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMwMCwgMTEwMSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3DQotCQkJbG9jYXRpb24gICAJKDEyMiwgOTQ3KQ0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlSb2xlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMxRkUwMTJEIg0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTMzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6QXBwbGljYXRpb24iIEA4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNjcsIDQzOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4DQotCQkJbG9jYXRpb24gICAJKDExNCwgMjMzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTUwNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQXBwbGljYXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzBBODAzQjEiDQotCQkgICAgd2lkdGggICAgICAJNTI0DQotCQkgICAgaGVpZ2h0ICAgICAJNDM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzU2LCA3OTUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMzRjgwMEIyIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEAxMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkNCi0JCQkgICAgbG9jYXRpb24gICAJKDQsIC0zMDkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0LCA2OTQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIzMQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuNzM1NDI2DQotCQkJCWhlaWdodCAgICAgCTE0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzNGOTAxN0MiDQotCQkJICAgIGNsaWVudCAgICAgCUA5DQotCQkJICAgIHN1cHBsaWVyICAgCUA4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzU2LCA3OTUpDQotCQkJCSgzNTYsIDY1NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTYsIDc5NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM1NiwgNjU3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJCWxvY2F0aW9uICAgCSg0MjMsIDY5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzQ4ODc5DQotCQkJCWhlaWdodCAgICAgCTY3DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZWN1cml0eVJvbGVzIiBAMTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5DQotCQkJICAgIGxvY2F0aW9uICAgCSg0LCAtMzA5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0DQotCQkJCVBhcmVudF9WaWV3IAlAMTMNCi0JCQkJbG9jYXRpb24gICAJKDIxMiwgOTAwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjgzDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZWN1cml0eVJvbGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc1MzYyMw0KLQkJCQloZWlnaHQgICAgIAkxNDUNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMDMzRjkwMTdEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOQ0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM1NiwgNzk1KQ0KLQkJCQkoMzU2LCA5MzQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzU2LCA3OTUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTYsIDkzNCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMw0KLQkJCQlsb2NhdGlvbiAgIAkoNDEyLCA5MDMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3NTM2Mg0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246Ok1vZHVsZSIgQDE2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4MzMsIDEwNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTYNCi0JCQlsb2NhdGlvbiAgIAkoNzAyLCA5NzApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNb2R1bGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzIyQzAwMDYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE2DQotCQkJbG9jYXRpb24gICAJKDcwMiwgMTAzMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTI5NCkNCi0JCSAgICB3aWR0aCAgICAgIAkyODANCi0JCSAgICBoZWlnaHQgICAgIAkyMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoODc4LCA2NjEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDM0MDAwM0MxIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImFwcGxpY2F0aW9uIiBAMTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY1OCwgLTQ5MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE4DQotCQkJCWxvY2F0aW9uICAgCSg3NTgsIDU1OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIzMQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXBwbGljYXRpb24iDQotCQkJCXBjdERpc3QgICAgCTAuNTg0NjE1DQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzAzNDAxMDJFNiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE3DQotCQkJICAgIHN1cHBsaWVyICAgCUA4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODc4LCA2NjEpDQotCQkJCSg4NzgsIDYwMSkNCi0JCQkJKDYyOSwgNjAxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg3OCwgNjYxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjI5LCA2MDEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwDQotCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJbG9jYXRpb24gICAJKDcyMywgNjQzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42OTUzODUNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1vZHVsZXMiIEAyMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNjU4LCAtNDkxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyDQotCQkJCVBhcmVudF9WaWV3IAlAMjENCi0JCQkJbG9jYXRpb24gICAJKDc1MywgOTE0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittb2R1bGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg1MTQ0OQ0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMDM0MDEwMkU3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODc4LCA2NjEpDQotCQkJCSg4NzgsIDk1NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4NzgsIDY2MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg3OCwgOTU3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMw0KLQkJCQlQYXJlbnRfVmlldyAJQDIxDQotCQkJCWxvY2F0aW9uICAgCSg5NDgsIDkxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODYyMzE5DQotCQkJCWhlaWdodCAgICAgCTcwDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI0DQotCQkgICAgbG9jYXRpb24gICAJKDgzMywgMTMyNSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMTYNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoODMzLCAxMzI1KQ0KLQkJCSg4MzMsIDExODYpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDg2QjYwMzc5Ig0KLQkJICAgIGNsaWVudCAgICAgCUAzDQotCQkgICAgc3VwcGxpZXIgICAJQDE2DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDkyMiwgMTQ4NykNCi0JCQkoOTIyLCAxMzI1KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjIsIDE0ODcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkyMiwgMTMyNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDg2QUUwMUM5Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxDQotCQkgICAgc3VwcGxpZXIgICAJQDE2DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDQxOSwgMTQ5MikNCi0JCQkoNDE5LCAxMzI1KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0MTksIDE0OTIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQxOSwgMTMyNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDg2QjIwMUY2Ig0KLQkJICAgIGNsaWVudCAgICAgCUAyDQotCQkgICAgc3VwcGxpZXIgICAJQDE2DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDY3OCwgMTQ4OSkNCi0JCQkoNjc4LCAxMzI1KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzgsIDE0ODkpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY3OCwgMTMyNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI4DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTE2Mzg0DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk1QkNBMDIxOCINCi0JCSAgICBjbGllbnQgICAgIAlANA0KLQkJICAgIHN1cHBsaWVyICAgCUAxNg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMTQxLCAxNDg3KQ0KLQkJCSgxMTQxLCAxMzA2KQ0KLQkJCSg4OTQsIDEzMDYpDQotCQkJKDg5NCwgMTE4NikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTE0MSwgMTQ4NykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk0LCAxMTg2KSkpKSkpDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvY2xpZW50LmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2NsaWVudC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjM3NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvY2xpZW50LmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDE1NzYgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk1MA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImNsaWVudCINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJJREwiDQotCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhlNzI3OTAtODgyNi0xMWUxLTAwMDAtMDA1ZDllNmFkZWM0OjEiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJIm5zVVJJIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgImNsaWVudC54bWkiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiQ2xpZW50IikpKQ0KLSAgICBxdWlkICAgICAgIAkiMzhDMDI4MDcwMEMwIg0KLSAgICB2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhlNzI3OTAtODgyNi0xMWUxLTAwMDEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhGRjNDMTgwMzM2Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uIg0KLQkgICAgcXVpZHUgICAgICAJIjM4QzA4RjBGMDM4RCIpKQ0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJBcHBsaWNhdGlvbkNsaWVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ZTcyNzkwLTg4MjYtMTFlMS0wMDAyLTAwNWQ5ZTZhZGVjNDoxIikpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwMjhBQjAwOUUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGFwcGxpY2F0aW9uLWNsaWVudCBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgRUpCIGNvbXBvbmVudHMgYW5kIGV4dGVybmFsIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQUVGQzAwMDkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1NTlFRUEwMjQxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS40Lg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJSZXNBdXRoQXBwbGljYXRpb25UeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhlNzI3OTAtODgyNi0xMWUxLTAwMDctMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMEEwQzIwMUE1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEFwcGxpY2F0aW9uPTANCi18Q29udGFpbmVyPTENCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhlNzI3OTAtODgyNi0xMWUxLTAwMDktMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDJBNUIwMjExIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ZTcyNzkwLTg4MjYtMTFlMS0wMDBhLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwMkE1RDAwMDIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y2xpZW50OjpBcHBsaWNhdGlvbkNsaWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDI4QUIwMDlFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInJlc291cmNlUmVmcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhlNzI3OTAtODgyNi0xMWUxLTAwMGItMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzAyQTVEMDAwQyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQ29udGFpbnMgZGVjbGFyYXRpb25zIG9mIHRoZSBhcHBsaWNhdGlvbiBjbGllbnRzJ3MgcmVmZXJlbmNlcyB0byBhbiBleHRlcm5hbCByZXNvdXJjZXMuIg0KLQkJICAgIGxhYmVsICAgICAgCSJyZXNvdXJjZVJlZnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNvdXJjZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3OTMwM0M2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhlNzI3OTAtODgyNi0xMWUxLTAwMGMtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDJCNDUwMUQ1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ZTcyNzkwLTg4MjYtMTFlMS0wMDBkLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwMkI0NjAyMUMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y2xpZW50OjpBcHBsaWNhdGlvbkNsaWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDI4QUIwMDlFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVudmlyb25tZW50UHJvcHMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ZTcyNzkwLTg4MjYtMTFlMS0wMDBlLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwMkI0NjAyMjYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQgZW50cmllcy4gRWFjaCBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwgdmFsdWUuIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnZpcm9ubWVudFByb3BzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RW52RW50cnkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzc4MDBFMiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4ZTcyNzkwLTg4MjYtMTFlMS0wMDBmLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzAyQjRCMDAxMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGU3Mjc5MC04ODI2LTExZTEtMDAxMC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDJCNEMwMDQ0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNsaWVudDo6QXBwbGljYXRpb25DbGllbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAyOEFCMDA5RSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlamJSZWZlcmVuY2VzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGU3Mjc5MC04ODI2LTExZTEtMDAxMS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDJCNEMwMDQ1Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxDb250YWlucyBhIGxpc3Qgb2YgZWpiLXJlZiBlbGVtZW50cyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZQ0KLXxiZWFuJ3MgaG9tZS4gDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJImVqYlJlZmVyZW5jZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFamJSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzgyMDJCMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiINCi0JICAgIHF1aWQgICAgICAgCSIzOTg5NUU4RTAwRkQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicmVzb3VyY2VFbnZSZWZzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NUU4RjAzM0EiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbA0KLXxkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLg0KLXwNCi18VXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50DQotfA0KLXxFeGFtcGxlOg0KLXwNCi18PHJlc291cmNlLWVudi1yZWY+DQotfCAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+DQotfCAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPg0KLXw8L3Jlc291cmNlLWVudi1yZWY+DQotfA0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJyZXNvdXJjZUVudlJlZnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNvdXJjZUVudlJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjIwNzIwMEQzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTVFOEYwMzRFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNsaWVudDo6QXBwbGljYXRpb25DbGllbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAyOEFCMDA5RSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCINCi0JICAgIHF1aWQgICAgICAgCSIzOTg5NUYzRDAyOUEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiY2FsbGJhY2tIYW5kbGVyICINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTVGM0UwMUYxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJBIGNsYXNzIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLiINCi0JCSAgICBsYWJlbCAgICAgIAkiY2FsbGJhY2tIYW5kbGVyICINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NUYzRTAyMjMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y2xpZW50OjpBcHBsaWNhdGlvbkNsaWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDI4QUIwMDlFIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCINCi0JICAgIHF1aWQgICAgICAgCSIzRTUzRjRBQzAwNUYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic2VydmljZVJlZnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTNGNEFDMDJGNCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkic2VydmljZVJlZnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlNlcnZpY2VSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyRjU2MDE4NCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUzRjRBQzAzMDgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y2xpZW50OjpBcHBsaWNhdGlvbkNsaWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDI4QUIwMDlFIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMiINCi0JICAgIHF1aWQgICAgICAgCSIzRTUzRjUwNzAxRDIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1M0Y1MDgwMEIxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQ0KLXwgICAgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMNCi18ICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlDQotfCAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUNCi18ICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlDQotfCAgICB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50Lg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJtZXNzYWdlRGVzdGluYXRpb25SZWZzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TWVzc2FnZURlc3RpbmF0aW9uUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMUY1MjAyOEMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1M0Y1MDgwMEJCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNsaWVudDo6QXBwbGljYXRpb25DbGllbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAyOEFCMDA5RSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQiDQotCSAgICBxdWlkICAgICAgIAkiM0U1M0Y1REIwMzcyIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTNGNUREMDAzRiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkibWVzc2FnZURlc3RpbmF0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246Ok1lc3NhZ2VEZXN0aW5hdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIxMTAwMUNGIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTNGNUREMDA1MyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpjbGllbnQ6OkFwcGxpY2F0aW9uQ2xpZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMjhBQjAwOUUiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkNsaWVudCBEaWFncmFtIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzAyOEM2MDBFRCINCi0JICAgIHRpdGxlICAgICAgCSJDbGllbnQgRGlhZ3JhbSINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiIEAxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0NTMsIDcyOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMjc1LCA2NTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIg0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlJlc291cmNlUmVmIiBAMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA5NiwgMjA2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDE2MTksIDE4MTApDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJOTU0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZXNvdXJjZVJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzkzMDNDNiINCi0JCSAgICB3aWR0aCAgICAgIAk5NzINCi0JCSAgICBoZWlnaHQgICAgIAk1MzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFbnZFbnRyeSIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwMjQsIDIwMTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSg3NzgsIDE4MTIpDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDkyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFbnZFbnRyeSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzc4MDBFMiINCi0JCSAgICB3aWR0aCAgICAgIAk1MTANCi0JCSAgICBoZWlnaHQgICAgIAk0MzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFamJSZWYiIEA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDU2LCAyMDY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMTIyNCwgMTgxMCkNCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0NjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVqYlJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzgyMDJCMyINCi0JCSAgICB3aWR0aCAgICAgIAk0ODINCi0JCSAgICBoZWlnaHQgICAgIAk1MzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNvdXJjZUVudlJlZiIgQDUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIyODgsIDY0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJbG9jYXRpb24gICAJKDE5NTEsIDQ4NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk2NzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlc291cmNlRW52UmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxNjM4NA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyMDcyMDBEMyINCi0JCSAgICB3aWR0aCAgICAgIAk2OTINCi0JCSAgICBoZWlnaHQgICAgIAkzMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBANg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDc4MiwgMjE4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYNCi0JCQlsb2NhdGlvbiAgIAkoNjg5LCAxMzkpDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE4Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIHdpZHRoICAgICAgCTIwNA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiIgQDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQzMiwgMjAxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3DQotCQkJbG9jYXRpb24gICAJKDMzNiwgMTk0MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxOTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZpY2VSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkY1NjAxODQiDQotCQkgICAgd2lkdGggICAgICAJMjEwDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TWVzc2FnZURlc3RpbmF0aW9uUmVmIiBAOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MiwgNjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDgNCi0JCQlsb2NhdGlvbiAgIAkoNjM3LCA0NjQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJODcwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlRGVzdGluYXRpb25SZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMUY1MjAyOEMiDQotCQkgICAgd2lkdGggICAgICAJODg4DQotCQkgICAgaGVpZ2h0ICAgICAJMzc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TWVzc2FnZURlc3RpbmF0aW9uIiBAOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgNDk2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDkNCi0JCQlsb2NhdGlvbiAgIAkoMTMyOSwgMzkyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZURlc3RpbmF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIxMTAwMUNGIg0KLQkJICAgIHdpZHRoICAgICAgCTQ5Ng0KLQkJICAgIGhlaWdodCAgICAgCTIzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpjbGllbnQ6OkFwcGxpY2F0aW9uQ2xpZW50IiBAMTANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM4NCwgMTI2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCWxvY2F0aW9uICAgCSgxMzEsIDEwNTgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNTA2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBcHBsaWNhdGlvbkNsaWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAyOEFCMDA5RSINCi0JCSAgICB3aWR0aCAgICAgIAk1MjQNCi0JCSAgICBoZWlnaHQgICAgIAk0MzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTENCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU2NCwgMTMzMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMkE1QjAyMTEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDEyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTENCi0JCQkgICAgbG9jYXRpb24gICAJKDEzMDgsIDI3NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMw0KLQkJCQlQYXJlbnRfVmlldyAJQDEyDQotCQkJCWxvY2F0aW9uICAgCSg4MzEsIDEyODkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMDJBNUQwMDAyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTENCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU2NCwgMTMzMCkNCi0JCQkJKDY0NiwgMTMzMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY0LCAxMzMwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ2LCAxMzMwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyDQotCQkJCWxvY2F0aW9uICAgCSg3ODQsIDEzMDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg1MDEwNw0KLQkJCQloZWlnaHQgICAgIAkyNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAicmVzb3VyY2VSZWZzIiBAMTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTMwOCwgMjc0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2DQotCQkJCVBhcmVudF9WaWV3IAlAMTUNCi0JCQkJbG9jYXRpb24gICAJKDIxNTUsIDE2MzgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3Jlc291cmNlUmVmcyINCi0JCQkJcGN0RGlzdCAgICAJMC44MjY2MDcNCi0JCQkJaGVpZ2h0ICAgICAJMTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzAyQTVEMDAwQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDExDQotCQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU2NCwgMTMzMCkNCi0JCQkJKDIwMTMsIDEzMzApDQotCQkJCSgyMDEzLCAxNzk4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NjQsIDEzMzApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDEzLCAxNzk4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNw0KLQkJCQlQYXJlbnRfVmlldyAJQDE1DQotCQkJCWxvY2F0aW9uICAgCSgyMDY3LCAxNzA2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDE4DQotCQkgICAgbG9jYXRpb24gICAJKDk5MywgMTQ1NCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMkI0NTAxRDUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDE5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTgNCi0JCQkgICAgbG9jYXRpb24gICAJKDExMywgNDE0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwDQotCQkJCVBhcmVudF9WaWV3IAlAMTkNCi0JCQkJbG9jYXRpb24gICAJKDcxNSwgMTQxMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMkI0NjAyMUMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5OTMsIDE0NTQpDQotCQkJCSg2NDYsIDE0NTQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTkzLCAxNDU0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ2LCAxNDU0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE5DQotCQkJCWxvY2F0aW9uICAgCSg3MzUsIDEzOTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc0NjEwOA0KLQkJCQloZWlnaHQgICAgIAk2NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW52aXJvbm1lbnRQcm9wcyIgQDIyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTgNCi0JCQkgICAgbG9jYXRpb24gICAJKDExMywgNDE0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzDQotCQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQkJbG9jYXRpb24gICAJKDEyNDIsIDE1MjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNDgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Vudmlyb25tZW50UHJvcHMiDQotCQkJCXBjdERpc3QgICAgCTAuMzIwODk2DQotCQkJCWhlaWdodCAgICAgCTE4OQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMkI0NjAyMjYiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk5MywgMTQ1NCkNCi0JCQkJKDEwNTMsIDE0NTQpDQotCQkJCSgxMDUzLCAxODAwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk5MywgMTQ1NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwNTMsIDE4MDApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0DQotCQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQkJbG9jYXRpb24gICAJKDExMzEsIDE3MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc4NjAyNQ0KLQkJCQloZWlnaHQgICAgIAk3OA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBAMjUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzMywgMTQxNSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMkI0QjAwMTEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDI2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjUNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zNTEsIDMyNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNw0KLQkJCQlQYXJlbnRfVmlldyAJQDI2DQotCQkJCWxvY2F0aW9uICAgCSg3NjQsIDEzNzQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMDJCNEMwMDQ0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIzMywgMTQxNSkNCi0JCQkJKDY0NiwgMTQxNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMzLCAxNDE1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ2LCAxNDE1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDI2DQotCQkJCWxvY2F0aW9uICAgCSg3MDYsIDEzNjIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiUmVmZXJlbmNlcyIgQDI5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjUNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zNTEsIDMyNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMA0KLQkJCQlQYXJlbnRfVmlldyAJQDI5DQotCQkJCWxvY2F0aW9uICAgCSgxNjE5LCAxNTg2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjg4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlamJSZWZlcmVuY2VzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYzODEzMg0KLQkJCQloZWlnaHQgICAgIAkxODINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMDJCNEMwMDQ1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjMzLCAxNDE1KQ0KLQkJCQkoMTQzNywgMTQxNSkNCi0JCQkJKDE0MzcsIDE3OTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIzMywgMTQxNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzcsIDE3OTgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxDQotCQkJCVBhcmVudF9WaWV3IAlAMjkNCi0JCQkJbG9jYXRpb24gICAJKDE1MzQsIDE3MTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg2NDY2OA0KLQkJCQloZWlnaHQgICAgIAk5Nw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBAMzINCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU0OSwgMTI2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxNjM4NA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NUU4RTAwRkQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicmVzb3VyY2VFbnZSZWZzIiBAMzMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2NSwgMTAxMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNA0KLQkJCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJCWxvY2F0aW9uICAgCSgyMTY5LCA5OTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMzgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3Jlc291cmNlRW52UmVmcyINCi0JCQkJcGN0RGlzdCAgICAJMC43ODk1ODgNCi0JCQkJaGVpZ2h0ICAgICAJMTc5DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODk1RThGMDMzQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDMyDQotCQkJICAgIHN1cHBsaWVyICAgCUA1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU0OSwgMTI2OCkNCi0JCQkJKDE5OTAsIDEyNjgpDQotCQkJCSgxOTkwLCA4MDYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU0OSwgMTI2OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTAsIDgwNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzOCwgOTE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44NzkzNzcNCi0JCQkJaGVpZ2h0ICAgICAJNDgNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDciIEAzNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMTY1LCAxMDEyKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODk1RThGMDM0RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDMyDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1NDksIDEyNjgpDQotCQkJCSg2NDYsIDEyNjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU0OSwgMTI2OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY0NiwgMTI2OCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBAMzcNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzgxLCA3NjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTVGM0QwMjlBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNhbGxiYWNrSGFuZGxlciAiIEAzOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM3DQotCQkJICAgIGxvY2F0aW9uICAgCSgzOTcsIDUwNCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM4DQotCQkJCWxvY2F0aW9uICAgCSg5ODQsIDM1NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY2FsbGJhY2tIYW5kbGVyICINCi0JCQkJcGN0RGlzdCAgICAJMC44OTkyMDkNCi0JCQkJaGVpZ2h0ICAgICAJMjAzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODk1RjNFMDFGMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDM3DQotCQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzgxLCA3NjApDQotCQkJCSg3ODEsIDMwOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODEsIDc2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc4MSwgMzA5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MA0KLQkJCQlQYXJlbnRfVmlldyAJQDM4DQotCQkJCWxvY2F0aW9uICAgCSg3MTgsIDM1MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTA1MTM4DQotCQkJCWhlaWdodCAgICAgCTY0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5IiBANDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzk3LCA1MDQpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTVGM0UwMjIzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzgxLCA3NjApDQotCQkJCSg3ODEsIDEwNzYpDQotCQkJCSg2NDYsIDEwNzYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzgxLCA3NjApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDYsIDEwNzYpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAiIEA0Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgzMjksIDE3MDUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTUzRjRBQzAwNUYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmljZVJlZnMiIEA0Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQyDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTcxLCAxMDI3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0DQotCQkJCVBhcmVudF9WaWV3IAlANDMNCi0JCQkJbG9jYXRpb24gICAJKDE5NiwgMTg0OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI0MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VydmljZVJlZnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjM5MzQ0DQotCQkJCWhlaWdodCAgICAgCTEzNA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTUzRjRBQzAyRjQiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Mg0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDMyOSwgMTcwNSkNCi0JCQkJKDMyOSwgMTkyOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjksIDE3MDUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMjksIDE5MjgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1DQotCQkJCVBhcmVudF9WaWV3IAlANDMNCi0JCQkJbG9jYXRpb24gICAJKDQwMywgMTg1MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNjYzOTM0DQotCQkJCWhlaWdodCAgICAgCTc0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMSIgQDQ2DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDINCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNzEsIDEwMjcpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1M0Y0QUMwMzA4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDINCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzI5LCAxNzA1KQ0KLQkJCQkoMzI5LCAxNDgyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMyOSwgMTcwNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMyOSwgMTQ4MikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDQ3DQotCQkgICAgbG9jYXRpb24gICAJKDg5NiwgMTA4MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNTNGNTA3MDFEMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiBANDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzk2LCA0MDIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkNCi0JCQkJUGFyZW50X1ZpZXcgCUA0OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE0NiwgODc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDc0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittZXNzYWdlRGVzdGluYXRpb25SZWZzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwODc2NQ0KLQkJCQloZWlnaHQgICAgIAkyNTANCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1M0Y1MDgwMEIxIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4OTYsIDEwODApDQotCQkJCSg4OTYsIDgyNykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4OTYsIDEwODApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTYsIDgyNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTANCi0JCQkJUGFyZW50X1ZpZXcgCUA0OA0KLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA4NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwODc2NQ0KLQkJCQloZWlnaHQgICAgIAk2NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMiIEA1MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3DQotCQkJICAgIGxvY2F0aW9uICAgCSgzOTYsIDQwMikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTUzRjUwODAwQkIiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4OTYsIDEwODApDQotCQkJCSg4OTYsIDExNDApDQotCQkJCSg2NDYsIDExNDApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODk2LCAxMDgwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ2LCAxMTQwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0IiBANTINCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQwMSwgMTIwMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNTNGNURCMDM3MiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXNzYWdlRGVzdGluYXRpb25zIiBANTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMywgLTYwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0DQotCQkJCVBhcmVudF9WaWV3IAlANTMNCi0JCQkJbG9jYXRpb24gICAJKDE3NjcsIDY5MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQyNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWVzc2FnZURlc3RpbmF0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC44OTc1NjcNCi0JCQkJaGVpZ2h0ICAgICAJMjAxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTNGNUREMDAzRiINCi0JCQkgICAgY2xpZW50ICAgICAJQDUyDQotCQkJICAgIHN1cHBsaWVyICAgCUA5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQwMSwgMTIwMikNCi0JCQkJKDE1NjYsIDEyMDIpDQotCQkJCSgxNTY2LCA2MTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQwMSwgMTIwMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjYsIDYxMikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUNCi0JCQkJUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4MywgNjc0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MTg5ODcNCi0JCQkJaGVpZ2h0ICAgICAJODQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1IiBANTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMywgLTYwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTNGNUREMDA1MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDUyDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MDEsIDEyMDIpDQotCQkJCSg2NDYsIDEyMDIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQwMSwgMTIwMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY0NiwgMTIwMikpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAicmVzQXV0aCBSZWxhdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwQTBCMTAwNjAiDQotCSAgICB0aXRsZSAgICAgIAkicmVzQXV0aCBSZWxhdGlvbiINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpjbGllbnQ6OlJlc0F1dGhBcHBsaWNhdGlvblR5cGUiIEA1Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc1LCA3MzQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTcNCi0JCQlsb2NhdGlvbiAgIAkoMzEsIDcwOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0ODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlc0F1dGhBcHBsaWNhdGlvblR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1Nw0KLQkJCWxvY2F0aW9uICAgCSgzMSwgNjU4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTBDMjAxQTUiDQotCQkgICAgd2lkdGggICAgICAJNTA2DQotCQkgICAgaGVpZ2h0ICAgICAJMTc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UmVzQXV0aFR5cGVCYXNlIiBANTgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDU4DQotCQkJbG9jYXRpb24gICAJKDk0LCA5MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlc0F1dGhUeXBlQmFzZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDU4DQotCQkJbG9jYXRpb24gICAJKDk0LCA0MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Mw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDlFRDQwMEI0Ig0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTQxOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKSkpKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9jb21tb24uY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvY29tbW9uLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjZTQ0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9jb21tb24uY2F0CisrKyAvZGV2L251bGwKQEAgLTEsNjI4NyArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiY29tbW9uIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmpzdC5qMmVlIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkibnNVUkkiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiY29tbW9uLnhtaSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJDb21tb24iKSkpDQotICAgIHF1aWQgICAgICAgCSIzOEMwOEYwRjAzOEQiDQotICAgIHZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiMzlCN0U0OEMwMDY3Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiIg0KLQkgICAgcXVpZHUgICAgICAJIjM3ODBFMjcyMDMyRCIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzOUFCMkJGMTAwRkEiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbiINCi0JICAgIHF1aWR1ICAgICAgCSIzOEMwMzAwODAxNEUiKSkNCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiRWpiUmVmIg0KLQkgICAgcXVpZCAgICAgICAJIjM3MUJDNzgyMDJCMyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWpiLXJlZlR5cGUgaXMgdXNlZCBieSBlamItcmVmIGVsZW1lbnRzIGZvciB0aGUNCi18ZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlDQotfGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOg0KLXwNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24NCi18ICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mDQotfCAgICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UNCi18ICAgICAgYmVhbg0KLXwgICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4NCi18ICAgIC0gdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkDQotfCAgICAgIGVudGVycHJpc2UgYmVhbg0KLXwgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQ0KLXwgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzcxQkQ0MDAwMTg1Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCIHJlZmVyZW5jZS4gVGhpcyBpcyB0aGUgSk5ESSBuYW1lIHRoYXQgdGhlIHNlcnZsZXQgY29kZSB1c2VzIHRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgZW50ZXJwcmlzZSBiZWFuLg0KLXxFeGFtcGxlOiA8ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3MUJENDEzMDE4QyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4gVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6DQotfDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+DQotfDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJFamJSZWZUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjZGQjAwODEiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJob21lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzNzFCRDQyNTAzMkQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW6ScyBob21lIGludGVyZmFjZS4NCi18RXhhbXBsZTogPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlbW90ZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzcxQkQ0MkUwMDczIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW6ScyByZW1vdGUgaW50ZXJmYWNlLiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGluayINCi0JCSAgICBxdWlkICAgICAgIAkiMzcxQkQ0NUIwMjhBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGFuIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgZW5jb21wYXNzaW5nIEoyRUUgQXBwbGljYXRpb24gcGFja2FnZS4gVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBKMkVFIEFwcGxpY2F0aW9uIHBhY2thZ2UuIA0KLXxFeGFtcGxlOiA8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhCREQ4NzYwMkU1Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zDQotfFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkVudkVudHJ5Ig0KLQkgICAgcXVpZCAgICAgICAJIjM3MUJDNzc4MDBFMiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZW52LWVudHJ5VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYXBwbGljYXRpb24ncw0KLXxlbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsDQotfGRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbg0KLXxvcHRpb25hbCB2YWx1ZS4gIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgb25lIG11c3QgYmUNCi18c3VwcGxpZWQgZHVyaW5nIGRlcGxveW1lbnQuDQotfA0KLXxJdCBpcyB1c2VkIGJ5IGVudi1lbnRyeSBlbGVtZW50cy4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzNzFCRDM3MTAzOTIiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50Lg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzNzFCRDM3ODAxMTEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGENCi18ICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUNCi18ICAgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2Vudg0KLXwgICAgICAgIGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYQ0KLXwgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50LiBUaGUgdW5pcXVlbmVzcw0KLXwgICAgICAgIGNvbnN0cmFpbnRzIG11c3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGRlY2xhcmVkDQotfCAgICAgICAgY29udGV4dC4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18DQotfCAgICAgICAgPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzNzFCRDM4MDAzQTgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbnYtZW50cnktdmFsdWUgZGVzaWduYXRlcyB0aGUgdmFsdWUgb2YgYQ0KLXwgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZQ0KLXwgICAgICAgIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlDQotfCAgICAgICAgY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYQ0KLXwgICAgICAgIHNpbmdsZSBTdHJpbmcgcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwNCi18ICAgICAgICBhIHNpbmdsZSBjaGFyYWN0ZXIuDQotfA0KLXwgICAgICAgIEV4YW1wbGU6DQotfA0KLXwgICAgICAgIDxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QkREODM0MDA5MSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudJJzIGNvZGUuIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6IGphdmEubGFuZy5Cb29sLWVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsIGphdmEubGFuZy5Mb25nLCBhbmQgamF2YS5sYW5nLkZsb2F0LiANCi18RXhhbXBsZTogPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiRW52RW50cnlUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEJERDdBNjAzMTUiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUmVzb3VyY2VSZWYiDQotCSAgICBxdWlkICAgICAgIAkiMzcxQkM3OTMwM0M2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQ0KLXxEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQNCi18Y29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyDQotfGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgdGhlIGluZGljYXRpb24gb2YgdGhlDQotfHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQgYnkgdGhlDQotfERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uDQotfChBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZg0KLXx0aGUgc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlDQotfChTaGFyZWFibGUgb3IgVW5zaGFyZWFibGUpLg0KLXwNCi18RXhhbXBsZToNCi18DQotfDxyZXNvdXJjZS1yZWY+DQotfCAgICA8cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPg0KLXwgICAgPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4NCi18ICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPg0KLXwgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+DQotfDwvcmVzb3VyY2UtcmVmPg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM3MUJENTU4MDMzOCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucw0KLXxUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM3MUJENTVGMDMxMCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhDQotfCAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLg0KLXwgICAgICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQ0KLXwgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4NCi18ICAgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IEZpbGUuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM3MUJENTc1MDI0QSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhDQotfCAgICAgICAgc291cmNlLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIGZ1bGx5IHF1YWxpZmllZA0KLXwgICAgICAgIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlDQotfCAgICAgICAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdXRoIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEJERDhEOTAwQUMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSByZXMtYXV0aCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZSBzaWducyBvbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvciB3aGV0aGVyIHRoZSBDb250YWluZXIgd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIG9uIGJlaGFsZiBvZiB0aGUgYmVhbi4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUgRGVwbG95ZXIuICBUaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOg0KLXw8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPg0KLXw8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiUmVzQXV0aFR5cGVCYXNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwOUVENDAwQjQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaW5rIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE5Qzc0MzAwMDgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzU2hhcmluZ1Njb3BlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMjdGQzAzREIiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSByZXMtc2hhcmluZy1zY29wZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkDQotfHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUNCi18c2hhcmVkLiBUaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50LCBpZiBzcGVjaWZpZWQsIG11c3QgYmUgb25lIG9mIHRoZQ0KLXx0d28gZm9sbG93aW5nOiAgU2hhcmVhYmxlLCBVbnNoYXJlYWJsZQ0KLXwNCi18VGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiUmVzU2hhcmluZ1Njb3BlVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjI4OEMwMEEzIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkVudkVudHJ5VHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzOEJERDdBNjAzMTUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuMyBhZGRlZCBDaGFyYWN0ZXINCi18U3RyaW5nPTANCi18SW50ZWdlcj0xDQotfEJvb2xlYW49Mg0KLXxEb3VibGU9Mw0KLXxCeXRlPTQNCi18U2hvcnQ9NQ0KLXxMb25nPTYNCi18RmxvYXQ9Nw0KLXxDaGFyYWN0ZXI9OA0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiU3RyaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE5QzdEODAwQ0IiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJJbnRlZ2VyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE5QzdEQjAwOUQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJCb29sZWFuIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE5QzdFMjAwRUQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJEb3VibGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTlDN0U0MDFDMyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkJ5dGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTlDN0U2MDBFOSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlNob3J0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE5QzdFRjAyRkYiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJMb25nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE5QzdGMTAzRDQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJGbG9hdCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlBOUM3RjMwMkYxIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ2hhcmFjdGVyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4NkFERDAzQTgiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTZWN1cml0eVJvbGVSZWYiDQotCSAgICBxdWlkICAgICAgIAkiMzcxQkM3QTAwMjVDIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBzZWN1cml0eS1yb2xlLXJlZlR5cGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGENCi18c2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgaW4gYSBjb21wb25lbnQncyBvciBhDQotfERlcGxveW1lbnQgQ29tcG9uZW50J3MgY29kZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuDQotfG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlDQotfGNvZGUsIGFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlDQotfHNlY3VyaXR5IHJvbGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIERlcGxveWVyIG11c3QgY2hvb3NlIGFuDQotfGFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuDQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzNzFCRDRCQzAxMzUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQNCi18ICAgICAgICBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZQ0KLXwgICAgICAgIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2Qgb3IgdGhlDQotfCAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhCREQ4OUQwMUM4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zDQotfFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGluayINCi0JCSAgICBxdWlkICAgICAgIAkiMzhCREQ4QUMwMTM0Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkDQotfCAgICAgICAgc2VjdXJpdHkgcm9sZS4gVGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbg0KLXwgICAgICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUNCi18ICAgICAgICBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlJlc0F1dGhUeXBlQmFzZSINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwOUVENDAwQjQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Q09OVEFJTkVSPTANCi18Q29udGFpbmVyPTENCi18QXBwbGljYXRpb249Mg0KLXxTRVJWTEVUPTMNCi18DQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDb250YWluZXIiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQTZEOEYzMDFFNyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkFwcGxpY2F0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUE2RDkwMDAxNzgiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJTRVJWTEVUIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUFGRUQ4QjAxMzgiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJFamJSZWZUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzEyNkZCMDA4MSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTZXNzaW9uPTANCi18RW50aXR5PTENCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlNlc3Npb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTlDN0M2MDFEMyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkVudGl0eSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlBOUM3Q0QwMjQyIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU2VjdXJpdHlSb2xlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDMxRkUwMTJEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBzZWN1cml0eS1yb2xlVHlwZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5DQotfHJvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZQ0KLXxzZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4NCi18DQotfEV4YW1wbGU6DQotfA0KLXwgICAgPHNlY3VyaXR5LXJvbGU+DQotfCAgICA8ZGVzY3JpcHRpb24+DQotfCAgICAgICAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkDQotfCAgICAgICAgdG8gYWNjZXNzIHRoZSBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLg0KLXwgICAgPC9kZXNjcmlwdGlvbj4NCi18ICAgIDxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4NCi18ICAgIDwvc2VjdXJpdHktcm9sZT4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwMzI2OTAxNTkiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkBkZXByZWNhdGVkIFNlZSBkZXNjcmlwdGlvbnMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJvbGVOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwMzI3RDAxNEQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHJvbGUuIFRoaXMgZWxlbWVudCBtdXN0IGNvbnRhaW4gYSBub24tZW1wdHkgc3RyaW5nLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiUmVzb3VyY2VFbnZSZWYiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjIwNzIwMEQzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSByZXNvdXJjZS1lbnYtcmVmVHlwZSBpcyB1c2VkIHRvIGRlZmluZQ0KLXxyZXNvdXJjZS1lbnYtdHlwZSBlbGVtZW50cy4gIEl0IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQ0KLXxEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0DQotfGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzDQotfGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQ0KLXxyZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuIGluZGljYXRpb24gb2YNCi18dGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5IHRoZQ0KLXxEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLg0KLXwNCi18RXhhbXBsZToNCi18DQotfDxyZXNvdXJjZS1lbnYtcmVmPg0KLXwgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQ0KLXwgICAgPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+DQotfCAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZQ0KLXwgICAgPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+DQotfDwvcmVzb3VyY2UtZW52LXJlZj4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMjFDMjAxNzciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcmVzb3VyY2UgZW52IHJlZi4NCi18DQotfFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuDQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyMUNEMDNDMSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQ0KLXwgICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMNCi18ICAgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluDQotfCAgICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkNCi18ICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QNCi18ICAgICAgICBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJSZXNTaGFyaW5nU2NvcGVUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYyODhDMDBBMyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTaGFyZWFibGU9MA0KLXxVbnNoYXJlYWJsZT0xDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJTaGFyZWFibGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyOEFFMDBBMiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlVuc2hhcmVhYmxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMjhCMDAyN0MiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRUpCTG9jYWxSZWYiDQotCSAgICBxdWlkICAgICAgIAkiMzk4ODYyRTIwMTAxIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjMNCi18VGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3INCi18dGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsDQotfGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoNCi18DQotfCAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uDQotfCAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudA0KLXwgICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4NCi18ICAgIC0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuDQotfCAgICAtIHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZQ0KLXwgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbg0KLXwgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQ0KLXwgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbg0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRTkxRTY2QTAzNzQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFamJSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzgyMDJCMyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2FsSG9tZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QkU5RTEwMzVEIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhbCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QkU5RUMwMEI5Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUnVuQXNTcGVjaWZpZWRJZGVudGl0eSINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMkM5RTAyQzgiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHNlY3VyaXR5LWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzIGlkZW50aXR5IGlzIHRvIGJlIHVzZWQuIEl0ICAgIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMkQwRjAxMzAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eUlkZW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkMwNDAyNDUiKSkpDQotCShvYmplY3QgQ2xhc3MgIklkZW50aXR5Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYyREE0MDA1OCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuDQotfA0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyRERDMDBCMyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucw0KLXxUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBydW4gYXMgaWRlbnRpdHkuDQotfA0KLXxUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyb2xlTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjJERUIwMEYxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLg0KLXwNCi18VGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSWNvblR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QTk5RUUwMDNBIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIGljb24gdHlwZSBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzDQotfHRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiBvcg0KLXxKUEVHIGljb24gaW1hZ2VzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhDQotfEdVSSB0b29sLg0KLXwNCi18VGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQ0KLXxpY29uIGZpbGUgbmFtZXMgYXJlIHByb3ZpZGVkIGluLiBJdHMgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkNCi18YnkgZGVmYXVsdC4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNtYWxsSWNvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QTlBMTYwMjdDIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQ0KLXwgICAgICAgIGNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUNCi18ICAgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQNCi18ICAgICAgICBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUuDQotfA0KLXwgICAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuDQotfCAgICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuDQotfA0KLXwgICAgICAgIEV4YW1wbGU6DQotfA0KLXwgICAgICAgIDxzbWFsbC1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjE2eDE2LmpwZzwvc21hbGwtaWNvbj4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGFyZ2VJY29uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBOUExRDAwRTEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlDQotfCAgICAgICAgY29udGFpbmluZyBhIGxhcmdlDQotfCAgICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZQ0KLXwgICAgICAgIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQNCi18ICAgICAgICBGaWxlLg0KLXwNCi18ICAgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0Lg0KLXwgICAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLg0KLXwNCi18ICAgICAgICBFeGFtcGxlOg0KLXwNCi18ICAgICAgICA8bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+DQotfA0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBOUFDMTAxQzQiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEaXNwbGF5TmFtZSINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBOTkyMjAwMEUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQNCi18dG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQ0KLXxlbGVtZW50cy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLg0KLXwNCi18RXhhbXBsZToNCi18DQotfC4uLg0KLXwgICA8ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiI+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+DQotfA0KLXxUaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0Lg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGFuZyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QTk5M0MwMTA2Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QTk5NTEwMzQxIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTWVzc2FnZURlc3RpbmF0aW9uUmVmIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEMxRjUyMDI4QyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24NCi18b2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBtZXNzYWdlIGRlc3RpbmF0aW9uDQotfGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIERlcGxveW1lbnQgQ29tcG9uZW50J3MNCi18ZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOg0KLXwNCi18ICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uDQotfCAgICAgICAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZQ0KLXwgICAgICAgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQ0KLXwgICAgICAgIC0gYSBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIgdGhlDQotfCAgICAgICAgICBkZXN0aW5hdGlvbiBpcyB1c2VkIGZvcg0KLXwgICAgICAgICAgY29uc3VtaW5nIG9yIHByb2R1Y2luZyBtZXNzYWdlcywgb3IgYm90aA0KLXwgICAgICAgIC0gYSBsaW5rIHRvIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uDQotfA0KLXxFeGFtcGxlczoNCi18DQotfDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4NCi18ICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQ0KLXwgICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT4NCi18ICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQ0KLXwgICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPg0KLXwgICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPkNvbnN1bWVzDQotfCAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPg0KLXwgICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Q29ycG9yYXRlU3RvY2tzDQotfCAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+DQotfDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRDMUY3QzAxRDgiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMxRjkxMDAwMiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMxRjlFMDJBQSINCi0JCSAgICB0eXBlICAgICAgIAkiTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUFFRDFDMjAwQTgiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaW5rIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRDMUZCRjAwRUUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJNZXNzYWdlRGVzdGluYXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiM0U0QzIxMTAwMUNGIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIG1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIHNwZWNpZmllcyBhIG1lc3NhZ2UNCi18ZGVzdGluYXRpb24uIFRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIGRlc2NyaWJlZCBieSB0aGlzDQotfGVsZW1lbnQgaXMgbWFwcGVkIHRvIGEgcGh5c2ljYWwgZGVzdGluYXRpb24gYnkgdGhlIERlcGxveWVyLg0KLXwNCi18VGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gZWxlbWVudCBjb250YWluczoNCi18DQotfCAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbg0KLXwgICAgICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheS1uYW1lDQotfCAgICAgICAgLSBhbiBvcHRpb25hbCBpY29uDQotfCAgICAgICAgLSBhIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZSB3aGljaCBtdXN0IGJlIHVuaXF1ZQ0KLXwgICAgICAgICAgYW1vbmcgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lcyB3aXRoaW4gdGhlIHNhbWUNCi18ICAgICAgICAgIERlcGxveW1lbnQgRmlsZS4NCi18DQotfEV4YW1wbGU6DQotfA0KLXw8bWVzc2FnZS1kZXN0aW5hdGlvbj4NCi18ICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPkNvcnBvcmF0ZVN0b2Nrcw0KLXwgICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPg0KLXw8L21lc3NhZ2UtZGVzdGluYXRpb24+DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNFOUQ1RkM2MDExQyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMkNGQzAzQ0QiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYQ0KLXwgICAgICAgIG5hbWUgZm9yIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgbmFtZSBtdXN0IGJlDQotfCAgICAgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucw0KLXwgICAgICAgIHdpdGhpbiB0aGUgRGVwbG95bWVudCBGaWxlLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUGFyYW1WYWx1ZSINCi0JICAgIHF1aWQgICAgICAgCSIzRTRDMjIxMjAyQzEiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlDQotfHBhcmFtZXRlci92YWx1ZSBsaXN0cy4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMyMjQzMDIxNyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4iDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDI2RDAzQzYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4iDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjc4NjhCRTAyMzYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEZXNjcmlwdGlvbkdyb3VwIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ0NTFGMDFGQiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgZGVzY3JpcHRpb24gcmVsYXRlZA0KLXxlbGVtZW50cyBjb25zaXN0ZW50IGFjcm9zcyBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuDQotCSAgICApDQotCShvYmplY3QgQ2xhc3MgIkpORElFbnZSZWZzR3JvdXAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDUzOTUwMzQ5Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhpcyBncm91cCBrZWVwcyB0aGUgdXNhZ2Ugb2YgdGhlIGNvbnRhaW5lZCBKTkRJIGVudmlyb25tZW50DQotfHJlZmVyZW5jZSBlbGVtZW50cyBjb25zaXN0ZW50IGFjcm9zcyBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuDQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjQwMjNCMUY4MDA2QyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkNCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpDQotCShvYmplY3QgQ2xhc3MgIlNlY3VyaXR5SWRlbnRpdHkiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjJDMDQwMjQ1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcyBpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdA0KLXxjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLg0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4NzFDMjAyNzkiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJVc2VDYWxsZXJJZGVudGl0eSINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMkM5MDAyRjAiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHVzZS1jYWxsZXItaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZHMuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMkQwQTAwN0YiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eUlkZW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkMwNDAyNDUiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRlc2NyaXB0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBkZXNjcmlwdGlvbiB0eXBlIGlzIHVzZWQgYnkgYSBkZXNjcmlwdGlvbiBlbGVtZW50IHRvDQotfHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBlbGVtZW50cw0KLXx0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlDQotfERlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlIGZpbGUgcHJvZHVjZXIgd2FudHMNCi18dG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MNCi18RGVwbG95bWVudCBGaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZQ0KLXx0b29scyB1c2VkIGJ5IHN1Y2ggYSBEZXBsb3ltZW50IEZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5DQotfHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQNCi18Y29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLg0KLXwNCi18VGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlDQotfGRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGluLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKS4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxhbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEE5OEUwMDFBRSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEE5OEU5MDBERiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzRUFFRDFDMjAwQTgiDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ29uc3VtZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQUVEMUREMDE2RiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlByb2R1Y2VzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUFFRDFGNDAxOTAiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDb25zdW1lc1Byb2R1Y2VzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUFFRDFGOTAzMzIiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUU5hbWUiDQotCSAgICBxdWlkICAgICAgIAkiM0YzQkVGNUQwMkMwIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0YzQkVGNzAwMEREIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhbFBhcnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNGM0JFRkRFMDIzMCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tYmluZWRRTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0MzkxRDEwMEZBIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbnRlcm5hbFByZWZpeE9yTnNVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNDM3REQyMDNCNiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkxpc3RlbmVyIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkZCMjYwMDFCRCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IG1vdmVkIGZyb20gd2ViYXBwDQotfA0KLXxEZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4NCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiNDA1OEFFNzkwMTQxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiDQotCSAgICBxdWlkICAgICAgIAkiNDAyM0FERjIwMTk3Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiNDAyM0FFODcwMUQ4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic21hbGxJY29uIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQUUxMzAxNDUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxhcmdlSWNvbiINCi0JCSAgICBxdWlkICAgICAgIAkiNDAyM0FFMUQwMDlGIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiNDAyM0FFMjUwMjlGIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXNwbGF5TmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDAyM0FFMzAwMUM5Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JICAgIHF1aWQgICAgICAgCSIzOTA0NjMyQTAwNUMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiL2xpbmtlZFNlY3VyaXR5Um9sZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzkwNDYzMkIwMTZDIg0KLQkJICAgIGxhYmVsICAgICAgCSIvbGlua2VkU2VjdXJpdHlSb2xlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzFGRTAxMkQiDQotCQkgICAga2V5cyAgICAgICAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCSAgICBxdWlkICAgICAgIAkiMzk4OTYwNTQwMUQzIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSINCi0JCSAgICBxdWlkICAgICAgIAkiMzkwNDYzMkIwMUJDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzdBMDAyNUMiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBxdWlkICAgICAgIAkiMzk4RUQyOTgwMjg1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIi9saW5rZWRFSkIiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OEVEMjlBMDBCMSINCi0JCSAgICBsYWJlbCAgICAgIAkiL2xpbmtlZEVKQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiDQotCQkgICAga2V5cyAgICAgICAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCSAgICBxdWlkICAgICAgIAkiMzk4OTYwNkEwMTE2Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4RUQyOUEwMTUxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RWpiUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzc4MjAyQjMiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiDQotCSAgICBxdWlkICAgICAgIAkiMzk5Nzg0QTcwMkJBIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUNCi18ICAgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZQ0KLXwgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBsYW5ndWFnZSBjbGFzcyBvcg0KLXwgICAgICAgIGludGVyZmFjZS4NCi0JICAgIA0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTc4NEE4MDJBNyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZQ0KLXwgICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlDQotfCAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yDQotfCAgICAgICAgaW50ZXJmYWNlLg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJ0eXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTc4NEE4MDJEMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlJlc291cmNlRW52UmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMjA3MjAwRDMiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjJEQjUwMjNEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImlkZW50aXR5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMkRCNjAxRDEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIk9wdGlvbmFsIHNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4iDQotCQkgICAgbGFiZWwgICAgICAJImlkZW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6SWRlbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyREE0MDA1OCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDciDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYyREI2MDFEMiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzlFMDJDOCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENDMzMjAxNTIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaWNvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0MzM1MDAxNiINCi0JCSAgICBsYWJlbCAgICAgIAkiaWNvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpJY29uVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5RUUwMDNBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkOSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDQzMzUwMDJBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENDM1NDAxMzMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGlzcGxheU5hbWVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDM1NTAxNTIiDQotCQkgICAgbGFiZWwgICAgICAJImRpc3BsYXlOYW1lcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRpc3BsYXlOYW1lIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOTkyMjAwMEUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDQzNTUwMTY2Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMiINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENDM0RDAyNTUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDM0RTAxMkEiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDQzNEUwMTUyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRDMjNFRDAwQzUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRDMjNFRTAxNTMiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QzIzRUUwMTY3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UmVzb3VyY2VSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzkzMDNDNiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QzBCMzcwMDVBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QzBCMzgwMDg0Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTciDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMwQjM4MDA4RSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkVudkVudHJ5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzc3ODAwRTIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNTNFRDkwMDI4OSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTNFRDkxMDFFQSINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUzRUQ5MTAyNjIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGVSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDN0EwMDI1QyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDI2REMwM0U2Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDI2REUwMkRCIg0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyNkRFMDMwMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMxRkUwMTJEIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMiINCi0JICAgIHF1aWQgICAgICAgCSIzRTRDMjM4MDAyOTUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRDMjM4MjAxMUIiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QzIzODIwMTJGIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UmVzb3VyY2VFbnZSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyMDcyMDBEMyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiZGVzY3JpcHRpb25zIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEMwOTc4MDIyRSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMwOTc5MDIzMCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRDMDk3OTAyM0EiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFamJSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzgyMDJCMyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QzIwMjEwMDMxIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QzIwMjEwMUNDIg0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEMyMDIxMDFFMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246Ok1lc3NhZ2VEZXN0aW5hdGlvblJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzFGNTIwMjhDIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNyINCi0JICAgIHF1aWQgICAgICAgCSIzRTU2NzlGRTAwODciDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTU2NzlGRTAzNDQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1Njc5RkUwMzYyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlJZGVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDMDQwMjQ1Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOSINCi0JICAgIHF1aWQgICAgICAgCSIzRTRDMjIyNzAwOTAiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRDMjIyNzAzQzUiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QzIyMjcwM0Q5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UGFyYW1WYWx1ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIyMTIwMkMxIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMSINCi0JICAgIHF1aWQgICAgICAgCSIzRTk1Q0E2NjAwNjUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFOTVDQTY2MDMyQyINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTk1Q0E2NjAzNUUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpJZGVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJEQTQwMDU4Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJSZWZzIHRvIFJlc291cmNlcyINCi0JICAgIHF1aWQgICAgICAgCSIzOTA0NEY4NDAyRTUiDQotCSAgICB0aXRsZSAgICAgIAkiUmVmcyB0byBSZXNvdXJjZXMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTI3MjANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RWpiUmVmVHlwZSIgQDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI1NDUsIDQ0MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDIzODIsIDM1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVqYlJlZlR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDIzODIsIDMwNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyMw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzEyNkZCMDA4MSINCi0JCSAgICB3aWR0aCAgICAgIAkzNDQNCi0JCSAgICBoZWlnaHQgICAgIAkyOTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDINCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQzMiwgMjE0NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDE3MDMsIDE4OTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxMA0KLQkJCW1heF93aWR0aCAgCTE0MjINCi0JCQlsYWJlbCAgICAgIAkNCi18QHZlcnNpb24gSjJFRTEuMyANCi18QURERUQgcmVzU2hhcmluZ1Njb3BlOlJlc1NoYXJpbmdTY29wZVR5cGUNCi18DQotfFRoZSByZXMtc2hhcmluZy1zY29wZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUgc2hhcmVkLiBUaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50LCBpZiBzcGVjaWZpZWQsIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOg0KLXwgICAgIFNoYXJlYWJsZQ0KLXwgICAgIFVuc2hhcmVhYmxlDQotfCAgICANCi18VGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLg0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICB3aWR0aCAgICAgIAkxNDgyDQotCQkgICAgaGVpZ2h0ICAgICAJNTE5KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlJlc1NoYXJpbmdTY29wZVR5cGUiIEAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0NzIsIDIyNTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgyNDksIDIxNjgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDQ2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZXNTaGFyaW5nU2NvcGVUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgyNDksIDIxMTgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyODhDMDBBMyINCi0JCSAgICB3aWR0aCAgICAgIAk0NjQNCi0JCSAgICBoZWlnaHQgICAgIAkyOTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBANA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgY2xpZW50ICAgICAJQDINCi0JCSAgICBzdXBwbGllciAgIAlAMw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNjkwLCAyMjYxKQ0KLQkJCSg3MDQsIDIyNjEpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2OTAsIDIyNjEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDcwNCwgMjI2MSkpDQotCQkob2JqZWN0IE5vdGVWaWV3IEA1DQotCQkgICAgbG9jYXRpb24gICAJKDE5NjMsIDE2OTEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANQ0KLQkJCWxvY2F0aW9uICAgCSgxNDAwLCAxNTk3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTEwOTANCi0JCQlsYWJlbCAgICAgIAkNCi18RGVwcmVjYXRlZDoNCi18ZGVzY3JpcHRpb24gYmVjb21lcyBkZXNjcmlwdGlvbnM6TGlzdDxEZXNjcmlwdGlvblR5cGU+DQotfGxpbmsgYmVjb21lcyA/Pw0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxMTUwDQotCQkgICAgaGVpZ2h0ICAgICAJMjAwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZSIgQDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU5OSwgMTQ1MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2DQotCQkJbG9jYXRpb24gICAJKDE1MTgsIDEzNzUpDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlSb2xlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMxRkUwMTJEIg0KLQkJICAgIGhlaWdodCAgICAgCTE3Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZVJlZiIgQDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI2MjQsIDE0MjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSgyNDQ2LCAxMjk5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlSb2xlUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3QTAwMjVDIg0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTI3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEA4DQotCQkgICAgbG9jYXRpb24gICAJKDIwNjMsIDE0NTQpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDYzMkEwMDVDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIi9saW5rZWRTZWN1cml0eVJvbGUiIEA5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1MSwgMTc0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwDQotCQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkxMiwgMTQ5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrL2xpbmtlZFNlY3VyaXR5Um9sZSINCi0JCQkJcGN0RGlzdCAgICAJMC40MDQ2MjQNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkwNDYzMkIwMTZDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOA0KLQkJCSAgICBzdXBwbGllciAgIAlANg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIwNjMsIDE0NTQpDQotCQkJCSgxNjg5LCAxNDU0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwNjMsIDE0NTQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjg5LCAxNDU0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDkNCi0JCQkJbG9jYXRpb24gICAJKDE3MzksIDE0MDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg2NzA1Mg0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDEyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1MSwgMTc0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzDQotCQkJCVBhcmVudF9WaWV3IAlAMTINCi0JCQkJbG9jYXRpb24gICAJKDIzNjEsIDE0MTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwNw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MDQ2MzJCMDFCQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMDYzLCAxNDU0KQ0KLQkJCQkoMjQzNywgMTQ1NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDYzLCAxNDU0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQzNywgMTQ1NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMg0KLQkJCQlsb2NhdGlvbiAgIAkoMjI5NSwgMTQ1NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTUNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI0NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJuYW1lIDogU3RyaW5nIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAkxMg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFSkJMb2NhbFJlZiIgQDE1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg4LCA3MzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTUNCi0JCQlsb2NhdGlvbiAgIAkoMTA5LCA2MDkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzU4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFSkJMb2NhbFJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NjJFMjAxMDEiDQotCQkgICAgd2lkdGggICAgICAJMzc2DQotCQkgICAgaGVpZ2h0ICAgICAJMjc4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDE2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMjY1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNg0KLQkJCWxvY2F0aW9uICAgCSgxMjE0LCAyNjAyKQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICB3aWR0aCAgICAgIAkyNDYNCi0JCSAgICBoZWlnaHQgICAgIAkxMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNvdXJjZUVudlJlZiIgQDE3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0MTYsIDI2MDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTcNCi0JCQlsb2NhdGlvbiAgIAkoMTUxLCAyNDgxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTUzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUmVzb3VyY2VFbnZSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMjA3MjAwRDMiDQotCQkgICAgd2lkdGggICAgICAJNTQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMjc4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDE4DQotCQkgICAgbG9jYXRpb24gICAJKDk0NywgMjY4MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTk3ODRBNzAyQkEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAidHlwZSIgQDE5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTgNCi0JCQkgICAgbG9jYXRpb24gICAJKDU5NSwgNzc3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwDQotCQkJCVBhcmVudF9WaWV3IAlAMTkNCi0JCQkJbG9jYXRpb24gICAJKDExMjYsIDI3MzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMDgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3R5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuNjk2MzM1DQotCQkJCWhlaWdodCAgICAgCTU2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5OTc4NEE4MDJBNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk0NywgMjY4MSkNCi0JCQkJKDEyMDUsIDI2ODEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTQ3LCAyNjgxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwNSwgMjY4MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjENCi0JCQkJUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE0OSwgMjYyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzgzNjkxDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAMjINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTk1LCA3NzcpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk5Nzg0QTgwMkQwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTQ3LCAyNjgxKQ0KLQkJCQkoNjkwLCAyNjgxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk0NywgMjY4MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY5MCwgMjY4MSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDIzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDcyLCAyNDE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIzDQotCQkJbG9jYXRpb24gICAJKDEzNDQsIDIzMTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkyMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMiIgQDI0DQotCQkgICAgbG9jYXRpb24gICAJKDEwMTIsIDI1MTgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIzODAwMjk1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzIiBAMjUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU3MSwgMTk5NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNg0KLQkJCQlQYXJlbnRfVmlldyAJQDI1DQotCQkJCWxvY2F0aW9uICAgCSg3NTUsIDI0NzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMzgyMDEyRiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI0DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwMTIsIDI1MTgpDQotCQkJCSg2OTAsIDI1MTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAxMiwgMjUxOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY5MCwgMjUxOCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU3MSwgMTk5NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJCWxvY2F0aW9uICAgCSgxMDYyLCAyNDg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuMTU4NDE2DQotCQkJCWhlaWdodCAgICAgCTM1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMzgyMDExQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI0DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwMTIsIDI1MTgpDQotCQkJCSgxMzM1LCAyNTE4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMTIsIDI1MTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzM1LCAyNTE4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJCWxvY2F0aW9uICAgCSgxMjc1LCAyNDg2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44MTg0ODINCi0JCQkJaGVpZ2h0ICAgICAJMzMNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UmVzb3VyY2VSZWYiIEAzMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDk2LCAxNzI4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwDQotCQkJbG9jYXRpb24gICAJKDEwMSwgMTUwNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk3OTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlc291cmNlUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3OTMwM0M2Ig0KLQkJICAgIHdpZHRoICAgICAgCTgwOA0KLQkJICAgIGhlaWdodCAgICAgCTQ2Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAzMQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgY2xpZW50ICAgICAJQDINCi0JCSAgICBzdXBwbGllciAgIAlAMzANCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTY5MCwgMTg5NykNCi0JCQkoOTAwLCAxODk3KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxODk3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDE4OTcpKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAzMg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDMwDQotCQkgICAgc3VwcGxpZXIgICAJQDUNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoOTAwLCAxNzE2KQ0KLQkJCSgxMzg3LCAxNzA0KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIiBAMzMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE2MDAsIDUxMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMw0KLQkJCWxvY2F0aW9uICAgCSgxNDcyLCA0MTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkyMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNCIgQDM0DQotCQkgICAgbG9jYXRpb24gICAJKDgxNSwgNzM1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIzRUQwMEM1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDM1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDMwNywgLTEwODcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyMSwgNTgyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjgxMzQ3DQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEMyM0VFMDE1MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDM0DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDgxNSwgNzM1KQ0KLQkJCQkoODE1LCA2MjIpDQotCQkJCSgxNDYzLCA2MjIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODE1LCA3MzUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDYzLCA2MjIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3DQotCQkJCVBhcmVudF9WaWV3IAlAMzUNCi0JCQkJbG9jYXRpb24gICAJKDEzOTIsIDU4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTA4MDMxDQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNSIgQDM4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDMwNywgLTEwODcpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QzIzRUUwMTY3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODE1LCA3MzUpDQotCQkJCSg4MTUsIDE0OTQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODE1LCA3MzUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTUsIDE0OTQpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iIEAzOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjQ4LCAxOTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzOQ0KLQkJCWxvY2F0aW9uICAgCSgxNTU0LCA4OCkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFbnRlcnByaXNlQmVhbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSINCi0JCSAgICB3aWR0aCAgICAgIAkyMDYNCi0JCSAgICBoZWlnaHQgICAgIAkyMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFamJSZWYiIEA0MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg4LCAyNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDANCi0JCQlsb2NhdGlvbiAgIAkoMTEwLCA3NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVqYlJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzgyMDJCMyINCi0JCSAgICB3aWR0aCAgICAgIAkzNzQNCi0JCSAgICBoZWlnaHQgICAgIAk0MTYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJkZXNjcmlwdGlvbnMiIEA0MQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5NjksIDQwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMwOTc4MDIyRSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEA0Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQxDQotCQkJICAgIGxvY2F0aW9uICAgCSg2ODEsIDE0NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJCWxvY2F0aW9uICAgCSgxMjcwLCAzNjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42MDg2MDINCi0JCQkJaGVpZ2h0ICAgICAJMzYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QzA5NzkwMjMwIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDENCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTY5LCA0MDApDQotCQkJCSgxNDYzLCA0MDApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTY5LCA0MDApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDYzLCA0MDApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0DQotCQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQkJbG9jYXRpb24gICAJKDE0NzUsIDM2MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTEuMDI1ODA2DQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNCIgQDQ1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDENCi0JCQkgICAgbG9jYXRpb24gICAJKDY4MSwgMTQ0KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEMwOTc5MDIzQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQxDQotCQkJICAgIHN1cHBsaWVyICAgCUA0MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk2OSwgNDAwKQ0KLQkJCQkoNDc1LCA0MDApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTY5LCA0MDApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NzUsIDQwMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBANDYNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAxMCwgMTQxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5OEVEMjk4MDI4NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvbGlua2VkRUpCIiBANDcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzM4LCAtMjExKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4DQotCQkJCVBhcmVudF9WaWV3IAlANDcNCi0JCQkJbG9jYXRpb24gICAJKDEzMzYsIDEwMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIyOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrL2xpbmtlZEVKQiINCi0JCQkJcGN0RGlzdCAgICAJMC42MTEyNzYNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4RUQyOUEwMEIxIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDM5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTAxMCwgMTQxKQ0KLQkJCQkoMTU0NSwgMTQxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMTAsIDE0MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NDUsIDE0MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1MCwgMTY0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44MjQ2MDcNCi0JCQkJaGVpZ2h0ICAgICAJMjMNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEA1MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2DQotCQkJICAgIGxvY2F0aW9uICAgCSg3MzgsIC0yMTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOThFRDI5QTAxNTEiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANDANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDEwLCAxNDEpDQotCQkJCSg0NzUsIDE0MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDEwLCAxNDEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NzUsIDE0MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTENCi0JCQkJUGFyZW50X1ZpZXcgCUA1MA0KLQkJCQlsb2NhdGlvbiAgIAkoNjE2LCAxNDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAk1DQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkibmFtZSA6IFN0cmluZyINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJMTINCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1Mg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFOTFFNjZBMDM3NCINCi0JCSAgICBjbGllbnQgICAgIAlAMTUNCi0JCSAgICBzdXBwbGllciAgIAlANDANCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjg4LCA1OTYpDQotCQkJKDI4OCwgNDgwKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJTZWN1cml0eSINCi0JICAgIHF1aWQgICAgICAgCSIzQjc5NTFGODAxOEQiDQotCSAgICB0aXRsZSAgICAgIAkiU2VjdXJpdHkiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQ0KLXwgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZQ0KLXwgICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52DQotfCAgICAgICAgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhDQotfCAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQuIFRoZSB1bmlxdWVuZXNzDQotfCAgICAgICAgY29uc3RyYWludHMgbXVzdCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZGVjbGFyZWQNCi18ICAgICAgICBjb250ZXh0Lg0KLXwNCi18ICAgICAgICBFeGFtcGxlOg0KLXwNCi18ICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4NCi0JICAgIA0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTE4MzcNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6VXNlQ2FsbGVySWRlbnRpdHkiIEA1Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTEyLCAyMTE4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUzDQotCQkJbG9jYXRpb24gICAJKDQxMSwgMjA0MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyMDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlVzZUNhbGxlcklkZW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDOTAwMkYwIg0KLQkJICAgIHdpZHRoICAgICAgCTIyMA0KLQkJICAgIGhlaWdodCAgICAgCTE3OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIiBANTQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQxNiwgMTIzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDU0DQotCQkJbG9jYXRpb24gICAJKDE2NSwgMTAyOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudGVycHJpc2VCZWFuIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkJICAgIHdpZHRoICAgICAgCTUyMA0KLQkJICAgIGhlaWdodCAgICAgCTQzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCIgQDU1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjY0LCAxNTA0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDU1DQotCQkJbG9jYXRpb24gICAJKDEyODEsIDEyNzUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNzY2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZXJ2bGV0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5MTQwMjUxIg0KLQkJICAgIHdpZHRoICAgICAgCTc4NA0KLQkJICAgIGhlaWdodCAgICAgCTQ4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5SWRlbnRpdHkiIEA1Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODY0LCAxNjY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDU2DQotCQkJbG9jYXRpb24gICAJKDY4NiwgMTU4NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlY3VyaXR5SWRlbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkMwNDAyNDUiDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1Nw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyRDBBMDA3RiINCi0JCSAgICBjbGllbnQgICAgIAlANTMNCi0JCSAgICBzdXBwbGllciAgIAlANTYNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNTgwLCAyMDI4KQ0KLQkJCSg3OTIsIDE3NTQpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBANTgNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzA1LCAxNTEwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzFGMDE4RiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEA1OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTU5LCAtMjYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjANCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjI1LCAxNDkwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkMyMDAyNjQiDQotCQkJICAgIGNsaWVudCAgICAgCUA1OA0KLQkJCSAgICBzdXBwbGllciAgIAlANTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3MDUsIDE1MTApDQotCQkJCSg2NDEsIDE0NDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlY3VyaXR5SWRlbnRpdHkiIEA2MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTU5LCAtMjYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjINCi0JCQkJUGFyZW50X1ZpZXcgCUA2MQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTY2LCAxNTc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjk5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZWN1cml0eUlkZW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAktMC42MDM3NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTQ1DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzIwMDI2MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDU4DQotCQkJICAgIHN1cHBsaWVyICAgCUA1Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDcwNSwgMTUxMCkNCi0JCQkJKDc3MCwgMTU3MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjMNCi0JCQkJUGFyZW50X1ZpZXcgCUA2MQ0KLQkJCQlsb2NhdGlvbiAgIAkoODE0LCAxNTE1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44ODk1NzYNCi0JCQkJaGVpZ2h0ICAgICAJNzMNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlUmVmIiBANjQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgMzM2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY0DQotCQkJbG9jYXRpb24gICAJKDE1OCwgMjExKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlSb2xlUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3QTAwMjVDIg0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTI3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZSIgQDY1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTg0LCAzMDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjUNCi0JCQlsb2NhdGlvbiAgIAkoMTQwNiwgMjAyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlSb2xlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMxRkUwMTJEIg0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTIyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEA2Ng0KLQkJICAgIGxvY2F0aW9uICAgCSg5NjAsIDI4MSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NjMyQTAwNUMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDY3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANjYNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zODEsIC0xMDcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjgNCi0JCQkJUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNzA1LCAyMDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwNw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuNTg1MDUyDQotCQkJCWhlaWdodCAgICAgCTc4DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MDQ2MzJCMDFCQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDY2DQotCQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk2MCwgMjgxKQ0KLQkJCQkoNTIzLCAyODEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTYwLCAyODEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MjMsIDI4MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjkNCi0JCQkJUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNjY0LCAyODEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAk1DQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkibmFtZSA6IFN0cmluZyINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJMTINCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIi9saW5rZWRTZWN1cml0eVJvbGUiIEA3MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDY2DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzgxLCAtMTA3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxDQotCQkJCVBhcmVudF9WaWV3IAlANzANCi0JCQkJbG9jYXRpb24gICAJKDExNzIsIDIzOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrL2xpbmtlZFNlY3VyaXR5Um9sZSINCi0JCQkJcGN0RGlzdCAgICAJMC40ODcxMTMNCi0JCQkJaGVpZ2h0ICAgICAJNDQNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkwNDYzMkIwMTZDIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDY1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTYwLCAyODEpDQotCQkJCSgxMzk3LCAyODEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTYwLCAyODEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzk3LCAyODEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyDQotCQkJCVBhcmVudF9WaWV3IAlANzANCi0JCQkJbG9jYXRpb24gICAJKDEzNTEsIDM0MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk2OTA3DQotCQkJCWhlaWdodCAgICAgCTYxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkiIEA3Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEyMCwgMjEyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCWxvY2F0aW9uICAgCSg4OTQsIDIwNzgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDUyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSdW5Bc1NwZWNpZmllZElkZW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDOUUwMkM4Ig0KLQkJICAgIHdpZHRoICAgICAgCTQ3MA0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiIgQDc0DQotCQkgICAgbG9jYXRpb24gICAJKDEzMTMsIDE5MDUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTk4MkEyRTAyNTUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiIiBANzUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2LCAtMTY4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2DQotCQkJCVBhcmVudF9WaWV3IAlANzUNCi0JCQkJbG9jYXRpb24gICAJKDEzOTMsIDE3NTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5OTgyQTJGMDE4RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDc0DQotCQkJICAgIHN1cHBsaWVyICAgCUA1NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMTMsIDE5MDUpDQotCQkJCSgxNDUwLCAxNzQ1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJydW5BcyIgQDc3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDIxNiwgLTE2OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OA0KLQkJCQlQYXJlbnRfVmlldyAJQDc3DQotCQkJCWxvY2F0aW9uICAgCSgxMTcyLCAxOTgzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTM2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitydW5BcyINCi0JCQkJcGN0RGlzdCAgICAJMC43MTczNjANCi0JCQkJaGVpZ2h0ICAgICAJNTcNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk5ODJBMkYwMTg0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDczDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMxMywgMTkwNSkNCi0JCQkJKDExNzMsIDIwNjUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5DQotCQkJCVBhcmVudF9WaWV3IAlANzcNCi0JCQkJbG9jYXRpb24gICAJKDEyOTYsIDIwMTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQzNzk2Mw0KLQkJCQloZWlnaHQgICAgIAk1OA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJEMEYwMTMwIg0KLQkJICAgIGNsaWVudCAgICAgCUA3Mw0KLQkJICAgIHN1cHBsaWVyICAgCUA1Ng0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMDg1LCAyMDY1KQ0KLQkJCSg5MTQsIDE3NTQpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEA4MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEyMCwgODgwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDgxDQotCQkJbG9jYXRpb24gICAJKDk5MiwgNzc4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjciIEA4Mg0KLQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEyODMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTU2NzlGRTAwODciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAODMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTIwLCAtMzg0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0DQotCQkJCVBhcmVudF9WaWV3IAlAODMNCi0JCQkJbG9jYXRpb24gICAJKDExODEsIDExMDcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC43NTA0MDMNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTY3OUZFMDM0NCINCi0JCQkgICAgY2xpZW50ICAgICAJQDgyDQotCQkJICAgIHN1cHBsaWVyICAgCUA4MQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk4NywgMTI4MykNCi0JCQkJKDEwODAsIDk5NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwNywgMTA0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzczNzU4DQotCQkJCWhlaWdodCAgICAgCTU3DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOCIgQDg2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODINCi0JCQkgICAgbG9jYXRpb24gICAJKDEyMCwgLTM4NCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTU2NzlGRTAzNjIiDQotCQkJICAgIGNsaWVudCAgICAgCUA4Mg0KLQkJCSAgICBzdXBwbGllciAgIAlANTYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5ODcsIDEyODMpDQotCQkJCSg4OTIsIDE1NzMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEA4Nw0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODIsIDg2OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNTNFRDkwMDI4OSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEA4OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg3DQotCQkJICAgIGxvY2F0aW9uICAgCSg3NiwgNTEzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5DQotCQkJCVBhcmVudF9WaWV3IAlAODgNCi0JCQkJbG9jYXRpb24gICAJKDgxNCwgODM1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjYyMDg4DQotCQkJCWhlaWdodCAgICAgCTM1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTNFRDkxMDFFQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDg3DQotCQkJICAgIHN1cHBsaWVyICAgCUA4MQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQ4MiwgODY5KQ0KLQkJCQkoOTgzLCA4NjkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDgyLCA4NjkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODMsIDg2OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTANCi0JCQkJUGFyZW50X1ZpZXcgCUA4OA0KLQkJCQlsb2NhdGlvbiAgIAkoOTE5LCA5MjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3Mjg0NQ0KLQkJCQloZWlnaHQgICAgIAk1MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkiIEA5MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg3DQotCQkJICAgIGxvY2F0aW9uICAgCSg3NiwgNTEzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTNFRDkxMDI2MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDg3DQotCQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQ4MiwgODY5KQ0KLQkJCQkoMzc4LCA4NjkpDQotCQkJCSgzNzgsIDQ3MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0ODIsIDg2OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM3OCwgNDczKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwIiBAOTINCi0JCSAgICBsb2NhdGlvbiAgIAkoMTYzNCwgNzUxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyNkRDMDNFNiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMSIgQDkzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTINCi0JCQkgICAgbG9jYXRpb24gICAJKDEzNjQsIC04OSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NA0KLQkJCQlQYXJlbnRfVmlldyAJQDkzDQotCQkJCWxvY2F0aW9uICAgCSgxNTkzLCA0ODUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyNkRFMDMwMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDkyDQotCQkJICAgIHN1cHBsaWVyICAgCUA2NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2MzQsIDc1MSkNCi0JCQkJKDE2MzQsIDQxNykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjM0LCA3NTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjM0LCA0MTcpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDk1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTINCi0JCQkgICAgbG9jYXRpb24gICAJKDEzNjQsIC04OSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDk1DQotCQkJCWxvY2F0aW9uICAgCSgxNDQzLCA3NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC41NzUwMDANCi0JCQkJaGVpZ2h0ICAgICAJMzYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDI2REUwMkRCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDgxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTYzNCwgNzUxKQ0KLQkJCQkoMTYzNCwgODExKQ0KLQkJCQkoMTI1NywgODExKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MzQsIDc1MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNTcsIDgxMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcNCi0JCQkJUGFyZW50X1ZpZXcgCUA5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM0NCwgODQ5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDEwNzUNCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6SWRlbnRpdHkiIEA5OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAzMiwgMjExMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA5OA0KLQkJCWxvY2F0aW9uICAgCSgxNzY3LCAyMDEwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSWRlbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkRBNDAwNTgiDQotCQkgICAgd2lkdGggICAgICAJNTQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMjI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDk5DQotCQkgICAgbG9jYXRpb24gICAJKDE1NTYsIDIxMTkpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJEQjUwMjNEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDciIEAxMDANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI4MiwgOTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxDQotCQkJCVBhcmVudF9WaWV3IAlAMTAwDQotCQkJCWxvY2F0aW9uICAgCSgxMzk1LCAyMDgxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkRCNjAxRDIiDQotCQkJICAgIGNsaWVudCAgICAgCUA5OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANzMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTU2LCAyMTE5KQ0KLQkJCQkoMTM1NSwgMjEyMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHkiIEAxMDINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI4MiwgOTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzDQotCQkJCVBhcmVudF9WaWV3IAlAMTAyDQotCQkJCWxvY2F0aW9uICAgCSgxNjUzLCAyMDc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitpZGVudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC40ODM1MjgNCi0JCQkJaGVpZ2h0ICAgICAJNDMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjJEQjYwMUQxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDk4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU1NiwgMjExOSkNCi0JCQkJKDE3NTcsIDIxMTUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEwMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTY5OSwgMjE1OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzEwMzI3DQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxIiBAMTA1DQotCQkgICAgbG9jYXRpb24gICAJKDIxMjIsIDEwNTcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTk1Q0E2NjAwNjUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMTA2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1DQotCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgLTEwNTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3DQotCQkJCVBhcmVudF9WaWV3IAlAMTA2DQotCQkJCWxvY2F0aW9uICAgCSgxNDExLCAxMDE4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuODM3NjA3DQotCQkJCWhlaWdodCAgICAgCTM2DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFOTVDQTY2MDMyQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAODENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMTIyLCAxMDU3KQ0KLQkJCQkoMjEyMiwgOTgyKQ0KLQkJCQkoMTI1NywgOTgyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIxMjIsIDEwNTcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjU3LCA5ODIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOA0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTMwMiwgOTIwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45NTE4MjYNCi0JCQkJaGVpZ2h0ICAgICAJNjMNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyIiBAMTA5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1DQotCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgLTEwNTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U5NUNBNjYwMzVFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA1DQotCQkJICAgIHN1cHBsaWVyICAgCUA5OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIxMjIsIDEwNTcpDQotCQkJCSgyMTIyLCAxOTk4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIxMjIsIDEwNTcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTIyLCAxOTk4KSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFbnYgRW50cmllcyINCi0JICAgIHF1aWQgICAgICAgCSIzOTk4MjVEOTAyMjgiDQotCSAgICB0aXRsZSAgICAgIAkiRW52IEVudHJpZXMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8NCi18cHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGVsZW1lbnRzDQotfHRoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUNCi18RGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cw0KLXx0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncw0KLXxEZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlDQotfHRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkNCi18dGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdA0KLXxjb250YWlucyB0aGUgZGVzY3JpcHRpb24uDQotfA0KLXxUaGUgbGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUNCi18ZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLg0KLQkgICAgDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMTg2Mw0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFbnZFbnRyeVR5cGUiIEAxMTANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDExMzQsIDE5MjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTEwDQotCQkJbG9jYXRpb24gICAJKDk3MSwgMTY2OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudkVudHJ5VHlwZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDExMA0KLQkJCWxvY2F0aW9uICAgCSg5NzEsIDE2MTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMjMNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QkREN0E2MDMxNSINCi0JCSAgICB3aWR0aCAgICAgIAkzNDQNCi0JCSAgICBoZWlnaHQgICAgIAk2NDINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDExMQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDM0LCAxODk2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDExMQ0KLQkJCWxvY2F0aW9uICAgCSgxNTk2LCAxODE4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTg0MA0KLQkJCWxhYmVsICAgICAgCQ0KLXxAdmVyc2lvbiBKMkVFMS4zDQotfEFEREVEIGphdmEubGFuZy5DaGFyYWN0ZXIgdG8gRW52RW50cnlUeXBlDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICB3aWR0aCAgICAgIAk5MDANCi0JCSAgICBoZWlnaHQgICAgIAkxNjkpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDExMg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIGNsaWVudCAgICAgCUAxMTENCi0JCSAgICBzdXBwbGllciAgIAlAMTEwDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE1ODMsIDE4OTQpDQotCQkJKDEzMDYsIDE4OTQpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1ODMsIDE4OTQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDYsIDE4OTQpKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTEzDQotCQkgICAgbG9jYXRpb24gICAJKDk0MCwgOTQ0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDExMw0KLQkJCWxvY2F0aW9uICAgCSgzODAsIDg3MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxMDg0DQotCQkJbGFiZWwgICAgICAJDQotfERlcHJlY2F0ZWQ6DQotfGRlc2NyaXB0aW9uIGJlY29tZXMgZGVzY3JpcHRpb25zOkxpc3Q8RGVzY3JpcHRpb25UeXBlPg0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxMTQ0DQotCQkgICAgaGVpZ2h0ICAgICAJMTU3KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIiBAMTE0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMjE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDExNA0KLQkJCWxvY2F0aW9uICAgCSgxMzEyLCAxMTE0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RW52RW50cnkiIEAxMTUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM4NCwgMTMyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMTUNCi0JCQlsb2NhdGlvbiAgIAkoMTkzLCAxMTU0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM4Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRW52RW50cnkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzc3ODAwRTIiDQotCQkgICAgd2lkdGggICAgICAJNDAwDQotCQkgICAgaGVpZ2h0ICAgICAJMzcyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDExNg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDExMw0KLQkJICAgIHN1cHBsaWVyICAgCUAxMTUNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoODI2LCAxMDIyKQ0KLQkJCSg1ODQsIDExODkpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYiIEAxMTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTQzLCAxMjY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzBCMzcwMDVBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDExOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDc4LCAxMCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTgNCi0JCQkJbG9jYXRpb24gICAJKDExNTcsIDExOTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42MTIxMDANCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QzBCMzgwMDg0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5NDMsIDEyNjgpDQotCQkJCSgxMzAyLCAxMjI5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjANCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTgNCi0JCQkJbG9jYXRpb24gICAJKDEyMjksIDEyODEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc4MzgzNw0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTciIEAxMjENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ3OCwgMTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QzBCMzgwMDhFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5NDMsIDEyNjgpDQotCQkJCSg1ODQsIDEzMDYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIk5ldyBKMkVFMS40IERhdGF0eXBlcyINCi0JICAgIHF1aWQgICAgICAgCSIzRTRCRTU2MTAxMDciDQotCSAgICB0aXRsZSAgICAgIAkiTmV3IEoyRUUxLjQgRGF0YXR5cGVzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlamItbG9jYWwtcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgZm9yDQotfHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbA0KLXxob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6DQotfA0KLXwgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbg0KLXwgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIERlcGxveW1lbnQNCi18ICAgICAgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuDQotfCAgICAtIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbg0KLXwgICAgLSB0aGUgZXhwZWN0ZWQgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvZiB0aGUNCi18ICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4NCi18ICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUNCi18ICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4NCi0JICAgIA0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTI3MjQNCi0JICAgIG9yaWdpbl95ICAgCTQ4MQ0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgTGFiZWwgQDEyMg0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg1LCAzMTUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTQNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwgQmxhY2siDQotCQkJYm9sZCAgICAgICAJVFJVRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIG5saW5lcyAgICAgCTINCi0JCSAgICBtYXhfd2lkdGggIAkxNjYzDQotCQkgICAgbGFiZWwgICAgICAJDQotfE5ldyB0eXBlcyBhbmQgZGF0YXR5cGVzIGludHJvZHVjZWQgZm9yIEoyRUUxLjQNCi18KENvcnJlc3BvbmRzIHRvIGoyZWVfMV80LnhzZCkNCi0JCSAgICApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIiBAMTIzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyODk4LCAxOTAzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyMw0KLQkJCWxvY2F0aW9uICAgCSgyNTk1LCAxNzk0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYwNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTIzDQotCQkJbG9jYXRpb24gICAJKDI1OTUsIDE3NDQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFQUVEMUMyMDBBOCINCi0JCSAgICB3aWR0aCAgICAgIAk2MjQNCi0JCSAgICBoZWlnaHQgICAgIAkzNDINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSIgQDEyNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk2OCwgMjQxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMjQNCi0JCQlsb2NhdGlvbiAgIAkoMTYyMiwgMjI2MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2OTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlFOYW1lIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NDQ3MDMNCi0JCSAgICBxdWlkdSAgICAgIAkiM0YzQkVGNUQwMkMwIg0KLQkJICAgIHdpZHRoICAgICAgCTcxMA0KLQkJICAgIGhlaWdodCAgICAgCTMzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246Ok1lc3NhZ2VEZXN0aW5hdGlvblJlZiIgQDEyNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk2OCwgMTg4OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMjUNCi0JCQlsb2NhdGlvbiAgIAkoMTUxNSwgMTczMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk5MDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2VEZXN0aW5hdGlvblJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMxRjUyMDI4QyINCi0JCSAgICB3aWR0aCAgICAgIAk5MjQNCi0JCSAgICBoZWlnaHQgICAgIAkzMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIiBAMTI2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMjAyLCA2NDYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTI2DQotCQkJbG9jYXRpb24gICAJKDMwMjMsIDU5NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uR3JvdXAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgd2lkdGggICAgICAJMzc2DQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEAxMjcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM0MjQsIDEwMDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTI3DQotCQkJbG9jYXRpb24gICAJKDMyNTUsIDkwMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICB3aWR0aCAgICAgIAkzNTYNCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNSIgQDEyOA0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzQ1LCAxNDE3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIwMjEwMDMxIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDEyOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjAzLCAtNzc3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzAyMiwgMTE5MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYwNjcxNw0KLQkJCQloZWlnaHQgICAgIAk1Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjAyMTAxQ0MiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyNw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3NDUsIDE0MTcpDQotCQkJCSgzMjQ1LCAxMTE0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjkNCi0JCQkJbG9jYXRpb24gICAJKDMxMjQsIDEyNDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcxMTU2NA0KLQkJCQloZWlnaHQgICAgIAk0NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYiIEAxMzINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgNCi0JCQkgICAgbG9jYXRpb24gICAJKDYwMywgLTc3NykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjAyMTAxRTAiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3NDUsIDE0MTcpDQotCQkJCSgyMjQyLCAxNzE5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyIiBAMTMzDQotCQkgICAgbG9jYXRpb24gICAJKDMyOTUsIDc5OCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDM0RDAyNTUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMiIEAxMzQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMzMsIC03NDcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1DQotCQkJCVBhcmVudF9WaWV3IAlAMTM0DQotCQkJCWxvY2F0aW9uICAgCSgzMjE2LCA3NDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0MzRFMDE1MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTI2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzI5NSwgNzk4KQ0KLQkJCQkoMzIzOSwgNzA4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAxMzYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMzMsIC03NDcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3DQotCQkJCVBhcmVudF9WaWV3IAlAMTM2DQotCQkJCWxvY2F0aW9uICAgCSgzMzA1LCA4OTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDQzNEUwMTJBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzMjk1LCA3OTgpDQotCQkJCSgzMzUxLCA4ODkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOA0KLQkJCQlQYXJlbnRfVmlldyAJQDEzNg0KLQkJCQlsb2NhdGlvbiAgIAkoMzM5MSwgODUyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UGFyYW1WYWx1ZSIgQDEzOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzQ4OCwgMTUzNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzkNCi0JCQlsb2NhdGlvbiAgIAkoMzI1NiwgMTQwNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlBhcmFtVmFsdWUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjIxMjAyQzEiDQotCQkgICAgd2lkdGggICAgICAJNDgyDQotCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkiIEAxNDANCi0JCSAgICBsb2NhdGlvbiAgIAkoMzQ1NCwgMTI1OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMjI3MDA5MCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAxNDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDANCi0JCQkgICAgbG9jYXRpb24gICAJKDE4MywgLTEwNTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyDQotCQkJCVBhcmVudF9WaWV3IAlAMTQxDQotCQkJCWxvY2F0aW9uICAgCSgzMzE3LCAxMTkwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjM3NTc5DQotCQkJCWhlaWdodCAgICAgCTEyOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjIyNzAzQzUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNDANCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyNw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM0NTQsIDEyNTkpDQotCQkJCSgzNDM4LCAxMTI2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDENCi0JCQkJbG9jYXRpb24gICAJKDM0OTQsIDExMzQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAiIEAxNDQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDANCi0JCQkgICAgbG9jYXRpb24gICAJKDE4MywgLTEwNTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QzIyMjcwM0Q5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTQwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMzkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNDU0LCAxMjU5KQ0KLQkJCQkoMzQ3MCwgMTM5MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpNZXNzYWdlRGVzdGluYXRpb24iIEAxNDUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI2MDUsIDExMzQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQ1DQotCQkJbG9jYXRpb24gICAJKDI0MzAsIDEwMjgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlRGVzdGluYXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjExMDAxQ0YiDQotCQkgICAgd2lkdGggICAgICAJMzY4DQotCQkgICAgaGVpZ2h0ICAgICAJMjM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TGlzdGVuZXIiIEAxNDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIwNDgsIDEwODgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQ2DQotCQkJbG9jYXRpb24gICAJKDE5NTcsIDEwMzgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMTgyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJMaXN0ZW5lciIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzQ0NzAzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMjYwMDFCRCINCi0JCSAgICB3aWR0aCAgICAgIAkyMDANCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMTQ3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgODAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0Nw0KLQkJCWxvY2F0aW9uICAgCSgxNDA2LCA3NDYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjI4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgd2lkdGggICAgICAJMjQ2DQotCQkgICAgaGVpZ2h0ICAgICAJMTMyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBAMTQ4DQotCQkgICAgbG9jYXRpb24gICAJKDE3OTQsIDk0OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QzAzRTZDMDM1QSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEAxNDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1MjQsIDgyOSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTANCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDkNCi0JCQkJbG9jYXRpb24gICAJKDE5MzcsIDk4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlDMDNFNkQwMkNGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTQ4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNzk0LCA5NDkpDQotCQkJCSgxOTQ3LCAxMDMxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJsaXN0ZW5lckNsYXNzIiBAMTUxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNTI0LCA4MjkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUyDQotCQkJCVBhcmVudF9WaWV3IAlAMTUxDQotCQkJCWxvY2F0aW9uICAgCSgxNjUzLCA5MjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2xpc3RlbmVyQ2xhc3MiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QzAzRTZEMDJBNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE0OA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTQ3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTc5NCwgOTQ5KQ0KLQkJCQkoMTY0MywgODY2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTENCi0JCQkJbG9jYXRpb24gICAJKDE2ODIsIDgyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6amF2YSIgQDE1NA0KLQkJICAgIGxvY2F0aW9uICAgCSgyOTc2LCAxNDQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE1NA0KLQkJCWxvY2F0aW9uICAgCSgyNzk5LCAxNDA1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM1NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiamF2YSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE1NA0KLQkJCWxvY2F0aW9uICAgCSgyNzk5LCAxMzU1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PG1ldGFtb2RlbD4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGMkMwMDRFIg0KLQkJICAgIHdpZHRoICAgICAgCTM2Ng0KLQkJICAgIGhlaWdodCAgICAgCTE4MikNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIgQDE1NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI5NiwgNzAzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE1NQ0KLQkJCWxvY2F0aW9uICAgCSgxOTUwLCA1NDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjkyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyINCi0JCSAgICB3aWR0aCAgICAgIAk3MTANCi0JCSAgICBoZWlnaHQgICAgIAkzMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1Ng0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBRTg3MDFEOCINCi0JCSAgICBjbGllbnQgICAgIAlAMTU1DQotCQkgICAgc3VwcGxpZXIgICAJQDEyNg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyNjUxLCA2NzkpDQotCQkJKDMwMTMsIDY1NykpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1Nw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjQwNThBRTc5MDE0MSINCi0JCSAgICBjbGllbnQgICAgIAlAMTQ2DQotCQkgICAgc3VwcGxpZXIgICAJQDE1NQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyMDg3LCAxMDI1KQ0KLQkJCSgyMTg3LCA4NzEpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTlENUZDNjAxMUMiDQotCQkgICAgY2xpZW50ICAgICAJQDE0NQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxNTUNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjUxOSwgMTAxNSkNCi0JCQkoMjQxNiwgODcxKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJKMkVFMS40IERlc2NyaXB0aW9uIEdyb3VwcyINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENDU4MDAzQTkiDQotCSAgICB0aXRsZSAgICAgIAkiSjJFRTEuNCBEZXNjcmlwdGlvbiBHcm91cHMiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJNjY5DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBMYWJlbCBAMTU5DQotCQkgICAgbG9jYXRpb24gICAJKDg4LCAyMDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTQNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJVFJVRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIG5saW5lcyAgICAgCTENCi0JCSAgICBtYXhfd2lkdGggIAk2MDANCi0JCSAgICBsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24gR3JvdXBzIikNCi0JCShvYmplY3QgTGFiZWwgQDE2MA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDMsIDMzNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIG5saW5lcyAgICAgCTINCi0JCSAgICBtYXhfd2lkdGggIAkxMjgxDQotCQkgICAgbGFiZWwgICAgICAJIkFuIGFic3RyYWN0IG1peGluIGNsYXNzIGZvciBjb21tb25seSB1c2VkIGRpc3BsYXkgYW5kIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMiKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRpc3BsYXlOYW1lIiBAMTYxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMzMwLCA2NzUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTYxDQotCQkJbG9jYXRpb24gICAJKDIxMTQsIDU3MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRpc3BsYXlOYW1lIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5MjIwMDBFIg0KLQkJICAgIHdpZHRoICAgICAgCTQ1MA0KLQkJICAgIGhlaWdodCAgICAgCTIyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246Okljb25UeXBlIiBAMTYyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDY4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjINCi0JCQlsb2NhdGlvbiAgIAkoNDMxLCA1NTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTEwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJY29uVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OUVFMDAzQSINCi0JCSAgICB3aWR0aCAgICAgIAk1MjgNCi0JCSAgICBoZWlnaHQgICAgIAkyNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDE2Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU2OSwgNjcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2Mw0KLQkJCWxvY2F0aW9uICAgCSgxNDQxLCA1NzApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkyMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIiBAMTY0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDAxLCAxMTQxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2NA0KLQkJCWxvY2F0aW9uICAgCSgxMjIyLCAxMDkxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25Hcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgd2lkdGggICAgICAJMzc2DQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAiIEAxNjUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA4NywgMTE1MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDM1NDAxMzMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGlzcGxheU5hbWVzIiBAMTY2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTY1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNzM1LCA1NzQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY3DQotCQkJCVBhcmVudF9WaWV3IAlAMTY2DQotCQkJCWxvY2F0aW9uICAgCSgyMDQzLCA4NzkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyODYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rpc3BsYXlOYW1lcyINCi0JCQkJcGN0RGlzdCAgICAJMC44MTg2NjINCi0JCQkJaGVpZ2h0ICAgICAJMTgyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0MzU1MDE1MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE2NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTYxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjA4NywgMTE1MCkNCi0JCQkJKDIyMjQsIDExNTApDQotCQkJCSgyMjI0LCA3ODkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA4NywgMTE1MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjQsIDc4OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY4DQotCQkJCVBhcmVudF9WaWV3IAlAMTY2DQotCQkJCWxvY2F0aW9uICAgCSgyMTcxLCA4MzkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEiIEAxNjkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE3MzUsIDU3NCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDM1NTAxNjYiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIwODcsIDExNTApDQotCQkJCSgxNTg5LCAxMTUwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwODcsIDExNTApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTg5LCAxMTUwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgiIEAxNzANCi0JCSAgICBsb2NhdGlvbiAgIAkoOTM3LCAxMDgzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0MzMyMDE1MiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpY29ucyIgQDE3MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTg1LCA1MDcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcyDQotCQkJCVBhcmVudF9WaWV3IAlAMTcxDQotCQkJCWxvY2F0aW9uICAgCSgxMDQ5LCA4NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMzYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2ljb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkxMzY2OQ0KLQkJCQloZWlnaHQgICAgIAkxMTINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDQzMzUwMDE2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTcwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5MzcsIDEwODMpDQotCQkJCSg5MzcsIDgyMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDEwODMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzcsIDgyMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTczDQotCQkJCVBhcmVudF9WaWV3IAlAMTcxDQotCQkJCWxvY2F0aW9uICAgCSg4NjQsIDg0MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTIwODYzDQotCQkJCWhlaWdodCAgICAgCTc0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5IiBAMTc0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwDQotCQkJICAgIGxvY2F0aW9uICAgCSg1ODUsIDUwNykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDMzNTAwMkEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNzANCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDkzNywgMTA4MykNCi0JCQkJKDkzNywgMTE0MykNCi0JCQkJKDEyMTMsIDExNDMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTM3LCAxMDgzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxMywgMTE0MykpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDE3NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTc1LCA5MzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQzNEQwMjU1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDE3Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTIyMywgMzU2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDE3Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwNywgODQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjA4MzkyDQotCQkJCWhlaWdodCAgICAgCTE2OQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDM0RTAxMkEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNzUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1NzUsIDkzMikNCi0JCQkJKDE1NzUsIDc4NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTc1LCA5MzIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTc1LCA3ODYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3OA0KLQkJCQlQYXJlbnRfVmlldyAJQDE3Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyMiwgODAyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzIiBAMTc5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTc1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjIzLCAzNTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDQzNEUwMTUyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTc1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTc1LCA5MzIpDQotCQkJCSgxNTc1LCAxMDc5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NzUsIDkzMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NzUsIDEwNzkpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiIEAxODANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0MjYsIDE2MDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTgwDQotCQkJbG9jYXRpb24gICAJKDEwODAsIDE0NTIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjkyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzQ0NzAzDQotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyINCi0JCSAgICB3aWR0aCAgICAgIAk3MTANCi0JCSAgICBoZWlnaHQgICAgIAkzMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4MQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBRTg3MDFEOCINCi0JCSAgICBjbGllbnQgICAgIAlAMTgwDQotCQkgICAgc3VwcGxpZXIgICAJQDE2NA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNDE2LCAxNDM5KQ0KLQkJCSgxNDA0LCAxMjAzKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJKMkVFMS40IEpOREkgRW52IFJlZnMgR3JvdXAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDU0NzAwMUJEIg0KLQkgICAgdGl0bGUgICAgICAJIkoyRUUxLjQgSk5ESSBFbnYgUmVmcyBHcm91cCINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkxOTU2DQotCSAgICBvcmlnaW5feSAgIAkyMTUwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTgyDQotCQkgICAgbG9jYXRpb24gICAJKDM0NjEsIDIxMDcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTgyDQotCQkJbG9jYXRpb24gICAJKDMxMjMsIDE5ODUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJNjQwDQotCQkJbGFiZWwgICAgICAJDQotfFNlZSBjb21tb24gIlNlY3VyaXR5IiBkaWFncmFtDQotfGZvciBtb3JlIGRldGFpbHMuICBUaGlzIGVsZW1lbnQgaXMgbm93IGNvbW1vbiB0byBtb3JlIHRoYW4ganVzdCB0aGUgZWpiIHNwZWMuDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTcwMA0KLQkJICAgIGhlaWdodCAgICAgCTI1NikNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIiBAMTgzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzQ0LCAyODE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE4Mw0KLQkJCWxvY2F0aW9uICAgCSgxNTY1LCAyNzY2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25Hcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NTFGMDFGQiINCi0JCSAgICB3aWR0aCAgICAgIAkzNzYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eUlkZW50aXR5IiBAMTg0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjY4OCwgMjExMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxODQNCi0JCQlsb2NhdGlvbiAgIAkoMjUzMiwgMjA2NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlY3VyaXR5SWRlbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkMwNDAyNDUiDQotCQkgICAgd2lkdGggICAgICAJMzMwDQotCQkgICAgaGVpZ2h0ICAgICAJMTE3DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDE4NQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDE4Mg0KLQkJICAgIHN1cHBsaWVyICAgCUAxODQNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMzExMCwgMjEwOCkNCi0JCQkoMjg1MywgMjExMCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlNlcnZpY2VSZWYiIEAxODYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyODE2LCAyNjI0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE4Ng0KLQkJCWxvY2F0aW9uICAgCSgyNjk3LCAyNTcwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIzOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZVJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyRjU2MDE4NCINCi0JCSAgICB3aWR0aCAgICAgIAkyNTYNCi0JCSAgICBoZWlnaHQgICAgIAkxMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpNZXNzYWdlRGVzdGluYXRpb25SZWYiIEAxODcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg0OCwgMjM4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxODcNCi0JCQlsb2NhdGlvbiAgIAkoMjYxNywgMjMzNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2VEZXN0aW5hdGlvblJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMxRjUyMDI4QyINCi0JCSAgICB3aWR0aCAgICAgIAk0ODANCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNvdXJjZUVudlJlZiIgQDE4OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3MjAsIDE4NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTg4DQotCQkJbG9jYXRpb24gICAJKDI1NTcsIDE4MTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzI2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZXNvdXJjZUVudlJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyMDcyMDBEMyINCi0JCSAgICB3aWR0aCAgICAgIAkzNDQNCi0JCSAgICBoZWlnaHQgICAgIAkxMTcNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpSZXNvdXJjZVJlZiIgQDE4OQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3NTIsIDE2MzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTg5DQotCQkJbG9jYXRpb24gICAJKDI2MTksIDE1ODYpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI2Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUmVzb3VyY2VSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzc5MzAzQzYiDQotCQkgICAgd2lkdGggICAgICAJMjg0DQotCQkgICAgaGVpZ2h0ICAgICAJMTE3DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RW52RW50cnkiIEAxOTANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzM2LCAxNDI0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE5MA0KLQkJCWxvY2F0aW9uICAgCSgyNjQwLCAxMzc4KQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxOTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudkVudHJ5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3NzgwMEUyIg0KLQkJICAgIHdpZHRoICAgICAgCTIxMA0KLQkJICAgIGhlaWdodCAgICAgCTExNw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkVKQkxvY2FsUmVmIiBAMTkxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjcyMCwgMTIxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxOTENCi0JCQlsb2NhdGlvbiAgIAkoMjU4NiwgMTE3MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQkxvY2FsUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODg2MkUyMDEwMSINCi0JCSAgICB3aWR0aCAgICAgIAkyODYNCi0JCSAgICBoZWlnaHQgICAgIAkxMTcNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFamJSZWYiIEAxOTINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzM2LCA5NzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTkyDQotCQkJbG9jYXRpb24gICAJKDI2NTUsIDkzMCkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFamJSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3ODIwMkIzIg0KLQkJICAgIGhlaWdodCAgICAgCTExNw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkpORElFbnZSZWZzR3JvdXAiIEAxOTMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3NDQsIDI1MjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxOTMNCi0JCQlsb2NhdGlvbiAgIAkoMTU1MywgMjQ3OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzODINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkpORElFbnZSZWZzR3JvdXAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTM5NTAzNDkiDQotCQkgICAgd2lkdGggICAgICAJNDAwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBAMTk0DQotCQkgICAgbG9jYXRpb24gICAJKDIzMTYsIDI1ODcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGQTkwMUM5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZpY2VSZWZzIiBAMTk1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTk0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjk4LCAxNjUwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDE5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjUzMiwgMjY0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI0MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VydmljZVJlZnMiDQotCQkJCXBjdERpc3QgICAgCTAuNTgyNTU1DQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyRkFBMDJDNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE5NA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTg2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjMxNiwgMjU4NykNCi0JCQkJKDI2ODgsIDI1ODcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjMxNiwgMjU4NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2ODgsIDI1ODcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDE5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY1MCwgMjUzNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEAxOTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDEyOTgsIDE2NTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGQUEwMkNGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTk0DQotCQkJICAgIHN1cHBsaWVyICAgCUAxOTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMzE2LCAyNTg3KQ0KLQkJCQkoMTk0NCwgMjU4NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzE2LCAyNTg3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0NCwgMjU4NykpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAxOTkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjIxMywgMjM0NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjNBQTAyNEYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIgQDIwMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NSwgMTQxMCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDENCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDANCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDIyOTUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NzQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21lc3NhZ2VEZXN0aW5hdGlvblJlZnMiDQotCQkJCXBjdERpc3QgICAgCTAuMzE0NDMzDQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyM0FEMDFBQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE5OQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTg3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjIxMywgMjM0NykNCi0JCQkJKDI2MDgsIDIzNDcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjIxMywgMjM0NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDgsIDIzNDcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMg0KLQkJCQlQYXJlbnRfVmlldyAJQDIwMA0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2NywgMjQwMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEAyMDMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOTkNCi0JCQkgICAgbG9jYXRpb24gICAJKDExOTUsIDE0MTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDIzQUQwMUI0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTk5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxOTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjEzLCAyMzQ3KQ0KLQkJCQkoMTkzNiwgMjM0NykNCi0JCQkJKDE5MzYsIDI0NjYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjIxMywgMjM0NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5MzYsIDI0NjYpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBAMjA0DQotCQkgICAgbG9jYXRpb24gICAJKDE5NTEsIDE4NTApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjIwOUYwMEM0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiIgQDIwNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5OSwgMTIyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNg0KLQkJCQlQYXJlbnRfVmlldyAJQDIwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkzMywgMjMzMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjIwOUYwMzk2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjA0DQotCQkJICAgIHN1cHBsaWVyICAgCUAxOTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxOTUxLCAxODUwKQ0KLQkJCQkoMTg5MSwgMTg1MCkNCi0JCQkJKDE4OTEsIDI0NjYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk1MSwgMTg1MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTEsIDI0NjYpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlc291cmNlRW52UmVmcyIgQDIwNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5OSwgMTIyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwOA0KLQkJCQlQYXJlbnRfVmlldyAJQDIwNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMTg5MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMzOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVzb3VyY2VFbnZSZWZzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5ODExMw0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMjA5RjAzOTUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE4OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5NTEsIDE4NTApDQotCQkJCSgyNTQ4LCAxODUwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NTEsIDE4NTApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTQ4LCAxODUwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDkNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDcNCi0JCQkJbG9jYXRpb24gICAJKDI0ODgsIDE3OTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAyMTANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg1NywgMTY1OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMQ0KLQkJCVBhcmVudF9WaWV3IAlAMjEwDQotCQkJbG9jYXRpb24gICAJKDE4NDIsIDE2OTQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSIiDQotCQkJcGN0RGlzdCAgICAJMC4yNTAwMDANCi0JCQloZWlnaHQgICAgIAkzNg0KLQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDEzOSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZXNvdXJjZVJlZnMiIEAyMTINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTANCi0JCQkgICAgbG9jYXRpb24gICAJKDUyOSwgMTQ4MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTINCi0JCQkJbG9jYXRpb24gICAJKDI0NzMsIDE2NDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNjINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3Jlc291cmNlUmVmcyINCi0JCQkJcGN0RGlzdCAgICAJMC44MzA4NzUNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTNCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjEwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxODkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxODU3LCAxNjU4KQ0KLQkJCQkoMTg1NywgMTU5OCkNCi0JCQkJKDI2MTAsIDE1OTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg1NywgMTY1OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2MTAsIDE1OTgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNA0KLQkJCQlQYXJlbnRfVmlldyAJQDIxMg0KLQkJCQlsb2NhdGlvbiAgIAkoMjU1OSwgMTU1MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTcwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTM4MDUzDQotCQkJCWhlaWdodCAgICAgCTQ2DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEAyMTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTANCi0JCQkgICAgbG9jYXRpb24gICAJKDUyOSwgMTQ4MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTUNCi0JCQkJbG9jYXRpb24gICAJKDE5MTYsIDI0MDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC45MjUwMjANCi0JCQkJaGVpZ2h0ICAgICAJNTkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTNBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjEwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxOTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxODU3LCAxNjU4KQ0KLQkJCQkoMTg1NywgMjQ2NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxODU3LCAxNjU4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg1NywgMjQ2NikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAyMTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc5NiwgMTUwOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxOA0KLQkJCVBhcmVudF9WaWV3IAlAMjE3DQotCQkJbG9jYXRpb24gICAJKDE1ODgsIDE1NDQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSIiDQotCQkJcGN0RGlzdCAgICAJLTIuOTY2NjY3DQotCQkJaGVpZ2h0ICAgICAJMzYNCi0JCQlvcmllbnRhdGlvbiAJMSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxMkQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW52aXJvbm1lbnRQcm9wZXJ0aWVzIiBAMjE5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjE3DQotCQkJICAgIGxvY2F0aW9uICAgCSg0MjAsIDk0OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjANCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTkNCi0JCQkJbG9jYXRpb24gICAJKDIzNjEsIDE0NDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1ODYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Vudmlyb25tZW50UHJvcGVydGllcyINCi0JCQkJcGN0RGlzdCAgICAJMC43MTgzNjcNCi0JCQkJaGVpZ2h0ICAgICAJNjINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTJGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjE3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxOTANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNzk2LCAxNTA4KQ0KLQkJCQkoMTc5NiwgMTM4NikNCi0JCQkJKDI2MzEsIDEzODYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc5NiwgMTUwOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzEsIDEzODYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIxOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU0MCwgMTMzMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTcwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTA2MDQwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEAyMjINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTcNCi0JCQkgICAgbG9jYXRpb24gICAJKDQyMCwgOTQ4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyMw0KLQkJCQlQYXJlbnRfVmlldyAJQDIyMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTcwOSwgMjQwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkzMjY1Mw0KLQkJCQloZWlnaHQgICAgIAk4OA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxMkUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE3OTYsIDE1MDgpDQotCQkJCSgxNzk2LCAyNDY1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3OTYsIDE1MDgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzk2LCAyNDY1KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiIgQDIyNA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzQwLCAxNDExKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODg2Mzg0MDE3MiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamJMb2NhbFJlZnMiIEAyMjUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQkgICAgbG9jYXRpb24gICAJKDEzMjQsIDEwNzUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI2DQotCQkJCVBhcmVudF9WaWV3IAlAMjI1DQotCQkJCWxvY2F0aW9uICAgCSgyMzcyLCAxMTQ3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjcwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlamJMb2NhbFJlZnMiDQotCQkJCXBjdERpc3QgICAgCTAuODA1NjMwDQotCQkJCWhlaWdodCAgICAgCTQ4DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODg2Mzg1MDJBQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIyNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTc0MCwgMTQxMSkNCi0JCQkJKDE3NDAsIDExOTQpDQotCQkJCSgyNTc3LCAxMTk0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NDAsIDE0MTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTc3LCAxMTk0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjcNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMjUNCi0JCQkJbG9jYXRpb24gICAJKDI0NzEsIDEyNDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiIiBAMjI4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjI0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMzI0LCAxMDc1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODg2Mzg1MDJCNCINCi0JCQkgICAgY2xpZW50ICAgICAJQDIyNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTc0MCwgMTQxMSkNCi0JCQkJKDE3NDAsIDI0NjYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc0MCwgMTQxMSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDAsIDI0NjYpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBAMjI5DQotCQkgICAgbG9jYXRpb24gICAJKDE2NzcsIDEyNDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzANCi0JCQlQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCWxvY2F0aW9uICAgCSgxNjc3LCAxMTg5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQlhbmNob3IgICAgIAkxDQotCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiIg0KLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJaGVpZ2h0ICAgICAJNjANCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NUFFNDAxRjEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiUmVmcyIgQDIzMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTczLCAxMDA4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMg0KLQkJCQlQYXJlbnRfVmlldyAJQDIzMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQzNywgOTc3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjI2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlamJSZWZzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgyODE5NA0KLQkJCQloZWlnaHQgICAgIAkyNA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NUFFNTAzMDEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2NzcsIDEyNDgpDQotCQkJCSgxNjc3LCAxMDAwKQ0KLQkJCQkoMjY0NiwgMTAwMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc3LCAxMjQ4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY0NiwgMTAwMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMzDQotCQkJCVBhcmVudF9WaWV3IAlAMjMxDQotCQkJCWxvY2F0aW9uICAgCSgyNTQ3LCAxMDQ1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MTkyMzYNCi0JCQkJaGVpZ2h0ICAgICAJNDUNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiIgQDIzNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTczLCAxMDA4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIzNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTcxMiwgMjMyNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg4NjA5NQ0KLQkJCQloZWlnaHQgICAgIAkzNQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NUFFNTAwODAiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2NzcsIDEyNDgpDQotCQkJCSgxNjc3LCAyNDY1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NzcsIDEyNDgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc3LCAyNDY1KSkpKSkpKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9jb21tb25BcmNoaXZlLm1kbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2NvbW1vbkFyY2hpdmUubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWUyYmIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2NvbW1vbkFyY2hpdmUubWRsCisrKyAvZGV2L251bGwKQEAgLTEsOTQyOCArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIklERSINCi0JICAgIHZhbHVlICAgICAgCSJJbnRlcm5hbCBFZGl0b3IiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyINCi0JICAgIHZhbHVlICAgICAgCSIiKSkNCi0gICAgcXVpZCAgICAgICAJIjNBMEIyNDc0MDI1RiINCi0gICAgZW5mb3JjZUNsb3N1cmVBdXRvTG9hZCAJRkFMU0UNCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cw0KLQlyaWdodE1hcmdpbiAJMC4yNTAwMDANCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDANCi0JdG9wTWFyZ2luICAJMC4yNTAwMDANCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMA0KLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDANCi0JY2xpcEljb25MYWJlbHMgCVRSVUUNCi0JYXV0b1Jlc2l6ZSAJVFJVRQ0KLQlzbmFwVG9HcmlkIAlUUlVFDQotCWdyaWRYICAgICAgCTE2DQotCWdyaWRZICAgICAgCTE2DQotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQNCi0JICAgIHNpemUgICAgICAgCTEwDQotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JICAgIHVuZGVybGluZSAgCUZBTFNFDQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkgICAgY29sb3IgICAgICAJMA0KLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0Jc2hvd01lc3NhZ2VOdW0gCTENCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUNCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQ0KLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI2QSINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEIyNDc5MDMzOSINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciDQotCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyNjkiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiM0EwQjI0NzQwMjdEIg0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZWNvcmUiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuZW1mLmVjb3JlXFxtb2RlbFxcb3JnLmVjbGlwc2UuZW1mLkVjb3JlLmNhdCINCi0JCXF1aWQgICAgICAgCSIzOUE1RUQwNDAwNEUiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiYXBwbGljYXRpb24iDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcYXBwbGljYXRpb24uY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM4QzAzMDA4MDE0RSIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJjbGllbnQiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcY2xpZW50LmNhdCINCi0JCXF1aWQgICAgICAgCSIzOEMwMjgwNzAwQzAiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZWpiIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXGVqYnNjaGVtYS5jYXQiDQotCQlxdWlkICAgICAgIAkiMzc4MEUyNzIwMzJEIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndlYmFwcGxpY2F0aW9uIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXHdlYmFwcGxpY2F0aW9uLmNhdCINCi0JCXF1aWQgICAgICAgCSIzOEMwNzZENjAzREQiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiY29tbW9uQXJjaGl2ZUNvcmUiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcY29tbW9uQXJjaGl2ZUNvcmUuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjNBMERCNjhCMDA0NiIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqYXZhIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmplbVxccm9zZVxcZWRvY2phdmEyLmNhdCINCi0JCXF1aWQgICAgICAgCSIzNjU0OUYyQzAwNEUiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiY29tbW9uIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXGNvbW1vbi5jYXQiDQotCQlxdWlkICAgICAgIAkiMzhDMDhGMEYwMzhEIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImpjYSINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFxqY2ExXzAuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjNDNjA5MDQyMDBCQiIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3c2NsaWVudCINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFx3ZWJzZXJ2aWNlc19jbGllbnRfMV8wLmNhdCINCi0JCXF1aWQgICAgICAgCSIzRTREMkY0QjAyQUEiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAianNwIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXGpzcF8yXzAuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjNFNEQ0RjY5MDM2QiIpKQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEIyNDc5MDM2MCINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTY1MA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjplY29yZSIgQDENCi0JCQlsb2NhdGlvbiAgIAkoMTEwNCwgMTYwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDENCi0JCQkgICAgbG9jYXRpb24gICAJKDk2MCwgNzYpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImVjb3JlIikNCi0JCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM5QTVFRDA0MDA0RSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb24iIEAyDQotCQkJbG9jYXRpb24gICAJKDE5MDQsIDgxNikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNzYwLCA3MzIpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImFwcGxpY2F0aW9uIikNCi0JCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM4QzAzMDA4MDE0RSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6Y2xpZW50IiBAMw0KLQkJCWxvY2F0aW9uICAgCSgyMzY4LCAxMTA0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMNCi0JCQkgICAgbG9jYXRpb24gICAJKDIyMjQsIDEwMjApDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImNsaWVudCIpDQotCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzOEMwMjgwNzAwQzAiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVqYiIgQDQNCi0JCQlsb2NhdGlvbiAgIAkoNzUyLCA4NDgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlANA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTk4LCA4MTMpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMzA4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImVqYiIpDQotCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0DQotCQkJICAgIGxvY2F0aW9uICAgCSg1OTgsIDc2MykNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCSAgICBtYXhfd2lkdGggIAkzMDgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiPDxtZXRhbW9kZWw+PiIpDQotCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzNzgwRTI3MjAzMkQiDQotCQkJd2lkdGggICAgICAJMzIwDQotCQkJaGVpZ2h0ICAgICAJMTgyKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uIiBANQ0KLQkJCWxvY2F0aW9uICAgCSgxMjE2LCA4ODApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlANQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MiwgNzk2KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJ3ZWJhcHBsaWNhdGlvbiIpDQotCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzOEMwNzZENjAzREQiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmphdmEiIEA2DQotCQkJbG9jYXRpb24gICAJKDY0MCwgNDE2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDYNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ4NiwgMzgxKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTMwOA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJqYXZhIikNCi0JCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDYNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ4NiwgMzMxKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJICAgIG1heF93aWR0aCAgCTMwOA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSI8PG1ldGFtb2RlbD4+IikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzY1NDlGMkMwMDRFIg0KLQkJCXdpZHRoICAgICAgCTMyMA0KLQkJCWhlaWdodCAgICAgCTE4MikNCi0JCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDcNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlxdWlkdSAgICAgIAkiMzlCRDM2NjAwMEZFIg0KLQkJCWNsaWVudCAgICAgCUA2DQotCQkJc3VwcGxpZXIgICAJQDENCi0JCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkgICAgKDc2OCwgMjcwKQ0KLQkJCSAgICAoNzY4LCAxNTkpDQotCQkJICAgICg5NTMsIDE1OSkpDQotCQkJbGluZV9zdHlsZSAJMw0KLQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzY4LCAyNzApDQotCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1MywgMTU5KSkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojpjb21tb24iIEA4DQotCQkJbG9jYXRpb24gICAJKDEyMDAsIDQzMikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDU2LCAzNDgpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImNvbW1vbiIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM4QzA4RjBGMDM4RCINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA5DQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJcXVpZHUgICAgICAJIjM4RkYzQzE1MDE1MSINCi0JCQljbGllbnQgICAgIAlANQ0KLQkJCXN1cHBsaWVyICAgCUA4DQotCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJICAgICgxMjEwLCA3MzUpDQotCQkJICAgICgxMjAzLCA1MjIpKQ0KLQkJCWxpbmVfc3R5bGUgCTApDQotCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAxMA0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCXF1aWR1ICAgICAgCSIzOEZGM0MxMDAyQTgiDQotCQkJY2xpZW50ICAgICAJQDINCi0JCQlzdXBwbGllciAgIAlAOA0KLQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSAgICAoMTc1NiwgNjcxKQ0KLQkJCSAgICAoMTc1NiwgNTEzKQ0KLQkJCSAgICAoMTM1MCwgNTEzKSkNCi0JCQlsaW5lX3N0eWxlIAkzDQotCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU2LCA2NzEpDQotCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTAsIDUxMykpDQotCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAxMQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCXF1aWR1ICAgICAgCSIzODA1NjdGNTAzODQiDQotCQkJY2xpZW50ICAgICAJQDQNCi0JCQlzdXBwbGllciAgIAlANg0KLQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSAgICAoNzUyLCA3MDIpDQotCQkJICAgICg3NTIsIDUwNykpDQotCQkJbGluZV9zdHlsZSAJMw0KLQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUyLCA3MDIpDQotCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1MiwgNTA3KSkNCi0JCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDEyDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJcXVpZHUgICAgICAJIjM4RkYzQzFDMDI1NiINCi0JCQljbGllbnQgICAgIAlANA0KLQkJCXN1cHBsaWVyICAgCUA4DQotCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJICAgICg4NjMsIDcwMikNCi0JCQkgICAgKDg2MywgNDA2KQ0KLQkJCSAgICAoMTA0OSwgNDA2KSkNCi0JCQlsaW5lX3N0eWxlIAkzDQotCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjMsIDcwMikNCi0JCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA0OSwgNDA2KSkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpqY2EiIEAxMw0KLQkJCWxvY2F0aW9uICAgCSgxNjgwLCAxOTIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1MzYsIDEwOCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiamNhIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiM0M2MDkwNDIwMEJCIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6bG9vc2Vjb25maWciIEAxNA0KLQkJCWxvY2F0aW9uICAgCSgxNzQ0LCAxMTUyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNTAwLCAxMDY4KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTQ4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJsb29zZWNvbmZpZyIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNDNzExNDdFMDMzRCINCi0JCQl3aWR0aCAgICAgIAk1MDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQiIEAxNQ0KLQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAzMzYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDI1MikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkid3NjbGllbnQiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzRTREMkY0QjAyQUEiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmpzcCIgQDE2DQotCQkJbG9jYXRpb24gICAJKDI0NDgsIDMzNikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjMwNCwgMjUyKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJqc3AiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzRTRENEY2OTAzNkIiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMTcNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlxdWlkdSAgICAgIAkiMzhGRjNDMTgwMzM2Ig0KLQkJCWNsaWVudCAgICAgCUAzDQotCQkJc3VwcGxpZXIgICAJQDgNCi0JCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkgICAgKDIyMTksIDk1OSkNCi0JCQkgICAgKDIyMTksIDQ2MikNCi0JCQkgICAgKDEzNTAsIDQ2MikpDQotCQkJbGluZV9zdHlsZSAJMw0KLQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxOSwgOTU5KQ0KLQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzUwLCA0NjIpKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlIiBAMTgNCi0JCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTE4NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTI4LCAxMTAwKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJjb21tb25BcmNoaXZlQ29yZSIpDQotCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzQTBEQjY4QjAwNDYiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkNCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI3RCINCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEIyNDc5MDMzOCINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpDQotCWNhdGVnb3J5ICAgCSJMb2dpY2FsIFZpZXciDQotCXF1aWR1ICAgICAgCSI0MzBBODc3NDAyMkMiKQ0KLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMNCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI3RSINCi0JUHJvY3NORGV2cyAJKGxpc3QNCi0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciDQotCQlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjkxIg0KLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzDQotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkicm9zZUlkIg0KLQkJdmFsdWUgICAgICAJIjc1MzExNzU0MCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIg0KLQkJCXZhbHVlICAgICAgCTgpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJLTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIg0KLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIxIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMyINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI0Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjUiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVCYWNrdXBGaWxlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIHN5bmNocm9uaXplIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJSZXZlcnNlIGVuZ2luZWVyaW5nIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOZXZlciBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5Ig0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkhlYWRlclNvdXJjZUZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5U291cmNlRmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFOU0kgQysrIEV2ZW50IFdhdGNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBTlNJQ29udmVydCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQURBODNfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQWNjZXNzIg0KLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQb2x5bW9ycGhpY1VuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUFjY2VzcyINCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJBXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJUaGVfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzRXF1YWxpdHlPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUVxdWFsaXR5T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNUYXNrIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkxpbWl0ZWRQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFVzZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsVXNlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU3BlYyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQm9keSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb25SZXR1cm4iDQotCQkJCXZhbHVlICAgICAgCTIwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVXNlQ29sb25Ob3RhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTk1X1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUltcGxlbWVudGF0aW9uU2V0IiAyMDgpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvbnRyb2xsZWRfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2NsYXNzfV9SZWNvcmRfS2luZHMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0xpbWl0ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0NsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJNYXliZUFsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIgMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIlN1cGVyY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIkFfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlJbmRleERlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVHlwZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlRXF1YWxpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwiPSINCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJUYWdnZWQiDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVjb3JkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk1peGluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlRhc2siDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVR5cGUiDQotCQkJCXZhbHVlICAgICAgCTIwOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlwbGVUeXBlcyINCi0JCQkJdmFsdWUgICAgICAJMjEzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJVbmNvbnN0cmFpbmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMjI1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbml0aWFsaXphdGlvbk9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIyNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXNzaWdubWVudEZpbmFsaXphdGlvbk9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIyNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjgpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkF1dG8iDQotCQkJCXZhbHVlICAgICAgCTIzMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmNvbXBsZXRlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkluY29tcGxldGVUeXBlU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5jb21wbGV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk5vRGlzY3JpbWluYW50UGFydCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVW5rbm93bkRpc2NyaW1pbmFudFBhcnQiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIktub3duRGlzY3JpbWluYW50UGFydCINCi0JCQkJdmFsdWUgICAgICAJNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmRlZmluaXRlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNQcml2YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsVXNlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxVc2VzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRpbmciDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlCYXJyaWVyQ29uZGl0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJUcnVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nQXNCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2VzcyINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjE3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudENsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkicHJvamVjdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU1BQYWNrYWdlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludENvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRvbWFpblByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbmRleFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVmlld0NvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkpvaW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiY09OVEFJTkVSQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVmlld1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEYXRhYmFzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVhdWx0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQnVmZmVyUG9vbCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiDQotCQkJdmFsdWUgICAgICAJMSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByZWZldGNoU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkxKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFnZVNpemUiDQotCQkJdmFsdWUgICAgICAJNCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1TY2hlbWEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdERvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiREJNUyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNWaWV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW4iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NQUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrT3B0aW9uIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb3JyZWxhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0lkZW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOYXRpdmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSZWxhdGlvbnNoaXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSSU1ldGhvZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVHJpZ2dlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDbHVzdGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIktleUxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja1ByZWRpY2F0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmZXJhbE1vZGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ2hlY2tUaW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luc2VydEV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRUYWJsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk5ld1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmT2xkUm93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3Um93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb3ciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGFuZ3VhZ2UiDQotCQkJdmFsdWUgICAgICAJIlNRTCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlclN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuZWROdWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNPdXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklEIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2hvd0NvZGVnZW5EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY051bUFzdGVyaXNrcyINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIg0KLQkJCXZhbHVlICAgICAgCTgwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk0iDQotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIg0KLQkJCXZhbHVlICAgICAgCSI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxjaGFyc2V0cy5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxqY2UuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcanNzZS5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxydC5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxzdW5yc2FzaWduLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXGV4dFxcZG5zbnMuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcZXh0XFxsZGFwc2VjLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXGV4dFxcbG9jYWxlZGF0YS5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxleHRcXHN1bmpjZV9wcm92aWRlci5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxzZWN1cml0eVxcbG9jYWxfcG9saWN5LmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXHNlY3VyaXR5XFxVU19leHBvcnRfcG9saWN5LmphcjtEOlxcajJzZGsxLjQuMl8wOFxcbGliXFxkdC5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGxpYlxcaHRtbGNvbnZlcnRlci5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGxpYlxcdG9vbHMuamFyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN1biINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk1pY3Jvc29mdCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIklCTSINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkibV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJInNfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJInZvaWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiDQotCQkJdmFsdWUgICAgICAJMykNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1ZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTm90U2hvd1Jvc2VJRERsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJvc2VJRCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFJldHVybkxpbmUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWZlcmVuY2VDbGFzc3BhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVkFKYXZhV29ya2luZ0ZvbGRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5TdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVtb3RlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlbW90ZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJIb21lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkhvbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5U3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkRURExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREVERMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U2VydmxldFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2MiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lSmF2YURvY1RhZ3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTG9jYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTG9jYWxTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VDb250cm9sIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNDQ1NlbGVjdGVkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3RTb3VyY2VSb290Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3ROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNDQ0NvbW1lbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRnVuZGFtZW50YWxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJib29sZWFuOyBjaGFyOyBieXRlOyBzaG9ydDsgaW50OyBsb25nOyBmbG9hdDsgZG91YmxlOyBCb29sZWFuOyBCeXRlOyBDaGFyYWN0ZXI7IERvdWJsZTsgRmxvYXQ7IEludGVnZXI7IExvbmc7IE9iamVjdDsgU2hvcnQ7IFN0cmluZzsgU3RyaW5nQnVmZmVyOyBWb2lkOyBqYXZhLm1hdGguQmlnRGVjaW1hbDsgamF2YS5tYXRoLkJpZ0ludGVnZXI7IGphdmEuc3FsLkRhdGU7IGphdmEuc3FsLlRpbWU7IGphdmEuc3FsLlRpbWVzdGFtcDsgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsgamF2YS51dGlsLkFic3RyYWN0TGlzdDtqYXZhLnV0aWwuQWJzdHJhY3RNYXA7IGphdmEudXRpbC5BYnN0cmFjdFNlcXVlbnRpYWxMaXN0OyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7IGphdmEudXRpbC5BcnJheUxpc3Q7IGphdmEudXRpbC5BcnJheXM7IGphdmEudXRpbC5CaXRTZXQ7IGphdmEudXRpbC5DYWxlbmRhcjsgamF2YS51dGlsLkNvbGxlY3Rpb25zOyBqYXZhLnV0aWwuRGF0ZTsgamF2YS51dGlsLkRhdGU7IGphdmEudXRpbC5EaWN0aW9uYXJ5OyBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsgamF2YS51dGlsLkhhc2hNYXA7IGphdmEudXRpbC5IYXNoU2V0OyBqYXZhLnV0aWwuSGFzaHRhYmxlOyBqYXZhLnV0aWwuTGlua2VkTGlzdDsgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZTsgamF2YS51dGlsLkxvY2FsZTsgamF2YS51dGlsLk9ic2VydmFibGU7IGphdmEudXRpbC5Qcm9wZXJ0aWVzOyBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uOyBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsgamF2YS51dGlsLlJhbmRvbTsgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOyBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmU7IGphdmEudXRpbC5TdGFjazsgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsgamF2YS51dGlsLlRpbWVyOyBqYXZhLnV0aWwuVGltZXJUYXNrOyBqYXZhLnV0aWwuVGltZVpvbmU7IGphdmEudXRpbC5UcmVlTWFwOyBqYXZhLnV0aWwuVHJlZVNldDsgamF2YS51dGlsLlZlY3RvcjsgamF2YS51dGlsLldlYWtIYXNoTWFwIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMi4wIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMS54Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJfSUQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciINCi0JCQkJdmFsdWUgICAgICAJMTkwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSINCi0JCQkJdmFsdWUgICAgICAJMTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlJPVyINCi0JCQkJdmFsdWUgICAgICAJMTcwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiDQotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCINCi0JCQkJdmFsdWUgICAgICAJMTYwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIjIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSI2IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSMkVkaXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNvbXBvbmVudFRlc3QiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMi4xX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjMuMF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5Ig0KLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFic3RyYWN0Qm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3BlY2lhbERlY2xSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZEJvZHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kRGVjbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiDQotCQkJdmFsdWUgICAgICAJMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiDQotCQkJCXZhbHVlICAgICAgCTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiVHlwZUtpbmRzIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImVudW0iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInJlY29yZCINCi0JCQkJdmFsdWUgICAgICAJMTAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibW9kdWxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImRpc3BpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImNvY2xhc3MiDQotCQkJCXZhbHVlICAgICAgCTEwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImFsaWFzIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJ1bmlvbiINCi0JCQkJdmFsdWUgICAgICAJMTA3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibWF4Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTEwOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlS2luZHMiIDEwOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJkbGxuYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiZmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJsaWJyYXJ5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidXVpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxjaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmdTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJhc2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIwIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIxIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiDQotCQkJdmFsdWUgICAgICAJKCJCYXNlU2V0IiAyMjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiDQotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZyINCi0JCQl2YWx1ZSAgICAgIAkoIkluc3RhbmNpbmdTZXQiIDIxOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiQmluYXJ5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJUZXh0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQnlWYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1BcnJheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJRdWlja0ltcG9ydCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wb3J0QmluYXJ5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1B1YmxpY0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiSW50ZXJuYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdERlY2xUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQXNzaWduIEFsbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDb21wb25lbnRQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDbGVhckNhc2UiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSZXF1aXNpdGVQcm8iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJTb0RBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVG9wTGluayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIg0KLQkJCXZhbHVlICAgICAgCTgpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJLTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIg0KLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjMiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCNCINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI1Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCINCi0JCQkJdmFsdWUgICAgICAJNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlQmFja3VwRmlsZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb21tZW50UnVsZXNTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUmV2ZXJzZSBlbmdpbmVlcmluZyBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgc3luY2hyb25pemUiDQotCQkJCXZhbHVlICAgICAgCTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIzMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWwiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmljRm9ybWFsU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRpb25NYXBwaW5nIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NpYXRpb25NYXBwaW5nU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk9iamVjdCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGlvbk1hcHBpbmdTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJOYW1lIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMzIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMjMyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbCINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyaWNGb3JtYWxTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGlvbk1hcHBpbmciDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY2lhdGlvbk1hcHBpbmdTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiT2JqZWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0aW9uTWFwcGluZ1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk5hbWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJCXZhbHVlICAgICAgCTIpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEZXBsb3kiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3Rpb24iDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbURpcmVjdGlvblR5cGVTZXQiIDEwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtRGlyZWN0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJImluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJImlub3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIm91dCINCi0JCQkJdmFsdWUgICAgICAJMTA0KSkpKSkpDQotCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyN0YiKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9jb21tb25BcmNoaXZlQ29yZS5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9jb21tb25BcmNoaXZlQ29yZS5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZTlkMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvY29tbW9uQXJjaGl2ZUNvcmUuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsNDYxNiArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiY29tbW9uQXJjaGl2ZUNvcmUiDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuanN0LmoyZWUiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiQ29tbW9uYXJjaGl2ZSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJIm5zVVJJIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgImNvbW1vbmFyY2hpdmUueG1pIikpKQ0KLSAgICBxdWlkICAgICAgIAkiM0EwREI2OEIwMDQ2Ig0KLSAgICB2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI1QSINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYmV4dCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUFBODY2NjAxOTAiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjVCIg0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwZXh0Ig0KLQkgICAgcXVpZHUgICAgICAJIjM5QjUzNEZEMDI0QyIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNUMiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamJibmQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCOTYwRkMwM0NBIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI2NCINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGJuZCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI5NjEwNjAxMDciKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY1Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y2xpZW50Ym5kIg0KLQkgICAgcXVpZHUgICAgICAJIjM5Qjk2MTRGMDMxRiIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjYiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbmV4dCINCi0JICAgIHF1aWR1ICAgICAgCSIzQTIyRTYwODAzMDMiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY3Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb25ibmQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCOTYxMTUwMkE0IikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI2OCINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmoyY2JuZCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI5NjMyRTAzOEMiKSkNCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiRmlsZSINCi0JICAgIHF1aWQgICAgICAgCSIzQTBEQjc1QjAwRTUiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQTEwMTJEOTAwQUEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxhc3RNb2RpZmllZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiM0ExMDEzMzAwMTYzIg0KLQkJICAgIHR5cGUgICAgICAgCSJsb25nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2l6ZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiM0ExMDEzMzkwMDhBIg0KLQkJICAgIHR5cGUgICAgICAgCSJsb25nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlyZWN0b3J5RW50cnkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNBMzE1MDY0MDA5MiINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yaWdpbmFsVVJJIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkgICAgcXVpZCAgICAgICAJIjNBNDIzNjQwMDMyQyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiQXJjaGl2ZSINCi0JICAgIHF1aWQgICAgICAgCSIzQTBEQjc1RjAxNzciDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQTU0QkY1RDAxOEMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkNvbnRhaW5lciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0E1NEJFNTUwMTZFIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNGQTE3QjUzMDAzOSINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uLioiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkVKQkphckZpbGUiDQotCSAgICBxdWlkICAgICAgIAkiM0EwREJCMjUwMDIyIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0EwREMyN0QwM0JFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzEyMzAxMzYiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiV0FSRmlsZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNBMERCQjQ5MDE4QyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBMERDMjkwMDNFNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6TW9kdWxlRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMxMjMwMTM2IikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkVBUkZpbGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzQTBEQkI3OTAwN0QiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQTM2NDUyMDAwREUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Ok1vZHVsZUZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMERDMTIzMDEzNiIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJBcHBsaWNhdGlvbkNsaWVudEZpbGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzQTBEQkI4MTAxMjgiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQTBEQzI3OTAyMTQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Ok1vZHVsZUZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMERDMTIzMDEzNiIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJNb2R1bGVGaWxlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0EwREMxMjMwMTM2Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0EwREMyQ0UwMEFFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpBcmNoaXZlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQjc1RjAxNzciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiQ29udGFpbmVyIg0KLQkgICAgcXVpZCAgICAgICAJIjNBNTRCRTU1MDE2RSINCi0JICAgIHN0ZXJlb3R5cGUgCSJhYnN0cmFjdCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBNTRDMTY4MDFGQyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREI3NUIwMEU1IikpDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJSZWFkT25seURpcmVjdG9yeSINCi0JICAgIHF1aWQgICAgICAgCSIzQTU0QkVCMDAwNEQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQTU0QkY3NTAyOTUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkNvbnRhaW5lciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0E1NEJFNTUwMTZFIikpKQ0KLQkob2JqZWN0IENsYXNzICJSQVJGaWxlIg0KLQkgICAgcXVpZCAgICAgICAJIjNBNkRFQkNGMDNDNSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBNkRFQkU3MDFDQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6TW9kdWxlRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMxMjMwMTM2IikpKQ0KLQkob2JqZWN0IENsYXNzICJNb2R1bGVSZWYiDQotCSAgICBxdWlkICAgICAgIAkiM0M3MTFFMzAwMTE1Ig0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiRUpCTW9kdWxlUmVmIg0KLQkgICAgcXVpZCAgICAgICAJIjNDNzEyNUE4MDJBNSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNDNzEyQTFEMDE2NSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6TW9kdWxlUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMUUzMDAxMTUiKSkpDQotCShvYmplY3QgQ2xhc3MgIldlYk1vZHVsZVJlZiINCi0JICAgIHF1aWQgICAgICAgCSIzQzcxMjVCMTAyOTMiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQzcxMkEyMDAxRUIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Ok1vZHVsZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M3MTFFMzAwMTE1IikpKQ0KLQkob2JqZWN0IENsYXNzICJDbGllbnRNb2R1bGVSZWYiDQotCSAgICBxdWlkICAgICAgIAkiM0M3MTI1QjkwMjU5Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0M3MTJBMjMwMzFDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNzExRTMwMDExNSIpKSkNCi0JKG9iamVjdCBDbGFzcyAiQ29ubmVjdG9yTW9kdWxlUmVmIg0KLQkgICAgcXVpZCAgICAgICAJIjNDNzEyNUM2MDBFNSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNDNzEyQTJCMDI1RiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6TW9kdWxlUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMUUzMDAxMTUiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBxdWlkICAgICAgIAkiM0EwREMyM0MwMjcwIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIi9tb2R1bGVGaWxlcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzQTBEQzIzRDAxNEYiDQotCQkgICAgbGFiZWwgICAgICAJIi9tb2R1bGVGaWxlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6TW9kdWxlRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMxMjMwMTM2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVhckZpbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBMERDMjNEMDJGRSINCi0JCSAgICBsYWJlbCAgICAgIAkiZWFyRmlsZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RUFSRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCNzkwMDdEIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSINCi0JICAgIHF1aWQgICAgICAgCSIzQTNBOTUzRTAwQTkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibG9hZGluZ0NvbnRhaW5lciINCi0JCSAgICBxdWlkICAgICAgIAkiM0EzQTk1M0YwMDgyIg0KLQkJICAgIGxhYmVsICAgICAgCSJsb2FkaW5nQ29udGFpbmVyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpDb250YWluZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNBNTRCRTU1MDE2RSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQTNBOTUzRjAwQUEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCNzVCMDBFNSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyINCi0JICAgIHF1aWQgICAgICAgCSIzQTU0QkY0RTAwMjIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiY29udGFpbmVyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQTU0QkY0RTAwMjMiDQotCQkgICAgbGFiZWwgICAgICAJImNvbnRhaW5lciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6Q29udGFpbmVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTU0QkU1NTAxNkUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZmlsZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNBNTRCRjRFMDAyNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZmlsZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCNzVCMDBFNSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uKiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCINCi0JICAgIHF1aWQgICAgICAgCSIzQzcxMUVGOTAyRjQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibW9kdWxlRmlsZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M3MTFFRkEwMjRDIg0KLQkJICAgIGxhYmVsICAgICAgCSJtb2R1bGVGaWxlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzEyMzAxMzYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M3MTFFRkEwMjRFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNzExRTMwMDExNSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiINCi0JICAgIHF1aWQgICAgICAgCSIzQzcxMjIyMzAxOUIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibW9kdWxlUmVmcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M3MTIyMjQwMjQ2Ig0KLQkJICAgIGxhYmVsICAgICAgCSJtb2R1bGVSZWZzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNzExRTMwMDExNSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVhckZpbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNzEyMjI0MDI0OCINCi0JCSAgICBsYWJlbCAgICAgIAkiZWFyRmlsZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RUFSRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCNzkwMDdEIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNyINCi0JICAgIHF1aWQgICAgICAgCSIzRjI5N0Q1MDAyNzgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAid2FyRmlsZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0YyOTdENTAwMjc5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJ3YXJGaWxlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpXQVJGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkI0OTAxOEMiKQ0KLQkJKG9iamVjdCBSb2xlICJkZXBsb3ltZW50RGVzY3JpcHRvciINCi0JCSAgICBxdWlkICAgICAgIAkiM0YyOTdENTAwMjdBIg0KLQkJICAgIGxhYmVsICAgICAgCSJkZXBsb3ltZW50RGVzY3JpcHRvciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4Ig0KLQkgICAgcXVpZCAgICAgICAJIjNGMjk3RTI4MDBCNSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlamJKYXJGaWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjI5N0UyODAwQjYiDQotCQkgICAgbGFiZWwgICAgICAJImVqYkphckZpbGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkVKQkphckZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCQjI1MDAyMiIpDQotCQkob2JqZWN0IFJvbGUgImRlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjI5N0UyODAwQjciDQotCQkgICAgbGFiZWwgICAgICAJImRlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCSmFyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzU1RDAxRTEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5Ig0KLQkgICAgcXVpZCAgICAgICAJIjNGMjk3RjZFMDI0NSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlYXJGaWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjI5N0Y2RTAyNDYiDQotCQkgICAgbGFiZWwgICAgICAJImVhckZpbGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkVBUkZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCQjc5MDA3RCIpDQotCQkob2JqZWN0IFJvbGUgImRlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjI5N0Y2RTAyNDciDQotCQkgICAgbGFiZWwgICAgICAJImRlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpBcHBsaWNhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMwQTgwM0IxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAiDQotCSAgICBxdWlkICAgICAgIAkiM0YyOTgzMjEwMzVGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjI5ODMyMjAyODQiDQotCQkgICAgbGFiZWwgICAgICAJImRlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6Q29ubmVjdG9yIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTA5MTAxMEYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEiDQotCQkgICAgcXVpZCAgICAgICAJIjNGMjk4MzIyMDI5OCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6UkFSRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0E2REVCQ0YwM0M1IikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMiINCi0JICAgIHF1aWQgICAgICAgCSIzRjI5ODQ2MjAzOUQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMiDQotCQkgICAgcXVpZCAgICAgICAJIjNGMjk4NDYyMDM5RSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6QXBwbGljYXRpb25DbGllbnRGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkI4MTAxMjgiKQ0KLQkJKG9iamVjdCBSb2xlICJkZXBsb3ltZW50RGVzY3JpcHRvciINCi0JCSAgICBxdWlkICAgICAgIAkiM0YyOTg0NjIwMzlGIg0KLQkJICAgIGxhYmVsICAgICAgCSJkZXBsb3ltZW50RGVzY3JpcHRvciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpjbGllbnQ6OkFwcGxpY2F0aW9uQ2xpZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMjhBQjAwOUUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNCINCi0JICAgIHF1aWQgICAgICAgCSI0MzBBOTI1MjAxMjciDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibW9kdWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MzBBOTI1MzAxNDciDQotCQkgICAgbGFiZWwgICAgICAJIm1vZHVsZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6TW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzIyQzAwMDYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTUiDQotCQkgICAgcXVpZCAgICAgICAJIjQzMEE5MjUzMDE0OSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6TW9kdWxlUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMUUzMDAxMTUiKSkpDQotCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImxvb3NlY29uZmlnIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiTG9vc2Vjb25maWciKSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUiKSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiY29tbW9uYXJjaGl2ZS5sb29zZWNvbmZpZy54bWkiKSkpDQotCSAgICBxdWlkICAgICAgIAkiM0M3MTE0N0UwMzNEIg0KLQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkob2JqZWN0IENsYXNzICJMb29zZUFwcGxpY2F0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzU2RUI0RTAwNkEiDQotCQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJICAgIHF1aWQgICAgICAgCSIzQzc1M0RFRTAwRUEiDQotCQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpsb29zZWNvbmZpZzo6TG9vc2VBcmNoaXZlIg0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkVBQUYwMDZDIikpKQ0KLQkJKG9iamVjdCBDbGFzcyAiTG9vc2VBcmNoaXZlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzU2RUFBRjAwNkMiDQotCQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCShvYmplY3QgT3BlcmF0aW9uICJpc01vZHVsZSINCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNUFCRkMzMDNERSINCi0JCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iDQotCQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCSAgICB1aWQgICAgICAgIAkwKSkNCi0JCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVyaSINCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNTZFQjlDMDFBMyINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmluYXJpZXNQYXRoIg0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M1NkVCQTkwMEJCIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZXNQYXRoIg0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M3MTFERDMwMjBCIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3MgIkxvb3NlTGlicmFyeSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M1QUY3QUMwMDI4Ig0KLQkJICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M1QUY3QzIwMzdDIg0KLQkJCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6bG9vc2Vjb25maWc6Okxvb3NlQXJjaGl2ZSINCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNTZFQUFGMDA2QyIpKSkNCi0JCShvYmplY3QgQ2xhc3MgIkxvb3NlTW9kdWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzVBQkVGRTAyOTAiDQotCQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJICAgIHF1aWQgICAgICAgCSIzQzVBQzAzOTAwRUUiDQotCQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpsb29zZWNvbmZpZzo6TG9vc2VBcmNoaXZlIg0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkVBQUYwMDZDIikpDQotCQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbHRERCINCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNUFCRkZBMDIxQSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCShvYmplY3QgQ2xhc3MgIkxvb3NlQ29uZmlndXJhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M1NkU5MkMwMEJGIikNCi0JCShvYmplY3QgQ2xhc3MgIkxvb3NlV0FSRmlsZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M1QUY3REIwMThFIg0KLQkJICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M1QUY3RjUwMjhGIg0KLQkJCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6bG9vc2Vjb25maWc6Okxvb3NlTW9kdWxlIg0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1QUJFRkUwMjkwIikpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNTZGREU2MDE3MyINCi0JCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkob2JqZWN0IFJvbGUgImFwcGxpY2F0aW9ucyINCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNTZGREU3MDJERCINCi0JCQkgICAgbGFiZWwgICAgICAJImFwcGxpY2F0aW9ucyINCi0JCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZUFwcGxpY2F0aW9uIg0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkVCNEUwMDZBIg0KLQkJCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3Ig0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M1NkZERTcwMkRGIg0KLQkJCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6bG9vc2Vjb25maWc6Okxvb3NlQ29uZmlndXJhdGlvbiINCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNTZFOTJDMDBCRiINCi0JCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOCINCi0JCSAgICBxdWlkICAgICAgIAkiM0M1NkZERUYwMDE4Ig0KLQkJICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCShvYmplY3QgUm9sZSAibG9vc2VBcmNoaXZlcyINCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNTZGREYwMDAyMyINCi0JCQkgICAgbGFiZWwgICAgICAJImxvb3NlQXJjaGl2ZXMiDQotCQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpsb29zZWNvbmZpZzo6TG9vc2VBcmNoaXZlIg0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkVBQUYwMDZDIg0KLQkJCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkob2JqZWN0IFJvbGUgImxvb3NlQXBwIg0KLQkJCSAgICBxdWlkICAgICAgIAkiM0M1NkZERjAwMDI1Ig0KLQkJCSAgICBsYWJlbCAgICAgIAkibG9vc2VBcHAiDQotCQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpsb29zZWNvbmZpZzo6TG9vc2VBcHBsaWNhdGlvbiINCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNTZFQjRFMDA2QSINCi0JCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNUFGODAyMDBERiINCi0JCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkob2JqZWN0IFJvbGUgImxvb3NlTGlicyINCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNUFGODAzMDA4NyINCi0JCQkgICAgbGFiZWwgICAgICAJImxvb3NlTGlicyINCi0JCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZUxpYnJhcnkiDQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzVBRjdBQzAwMjgiDQotCQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCShvYmplY3QgUm9sZSAibG9vc2VXQVIiDQotCQkJICAgIHF1aWQgICAgICAgCSIzQzVBRjgwMzAwODkiDQotCQkJICAgIGxhYmVsICAgICAgCSJsb29zZVdBUiINCi0JCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZVdBUkZpbGUiDQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzVBRjdEQjAxOEUiDQotCQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkpDQotCSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzU2RTkxMjAxNzMiDQotCQkgICAgdGl0bGUgICAgICAJIk1haW4iDQotCQkgICAgem9vbSAgICAgICAJMTAwDQotCQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkJICAgIG9yaWdpbl94ICAgCTANCi0JCSAgICBvcmlnaW5feSAgIAkwDQotCQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpsb29zZWNvbmZpZzo6TG9vc2VDb25maWd1cmF0aW9uIiBAMQ0KLQkJCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkgICAgbG9jYXRpb24gICAJKDM4NCwgMTYwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYyLCAxMTApDQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIkxvb3NlQ29uZmlndXJhdGlvbiIpDQotCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzU2RTkyQzAwQkYiDQotCQkJICAgIHdpZHRoICAgICAgCTQ2Mg0KLQkJCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZUFyY2hpdmUiIEAyDQotCQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxMiwgMjI0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJCWxvY2F0aW9uICAgCSgxMTQxLCAxNzQpDQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzQyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIkxvb3NlQXJjaGl2ZSIpDQotCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzU2RUFBRjAwNkMiDQotCQkJICAgIHdpZHRoICAgICAgCTM2MA0KLQkJCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZUFwcGxpY2F0aW9uIiBAMw0KLQkJCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkgICAgbG9jYXRpb24gICAJKDM2OCwgODQ4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTYxLCA3OTgpDQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDE0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIkxvb3NlQXBwbGljYXRpb24iKQ0KLQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkVCNEUwMDZBIg0KLQkJCSAgICB3aWR0aCAgICAgIAk0MzINCi0JCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkJICAgIGFubm90YXRpb24gCTgNCi0JCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYiIEA0DQotCQkJICAgIGxvY2F0aW9uICAgCSgyODEsIDUwMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNTZGREU2MDE3MyINCi0JCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCShvYmplY3QgUm9sZVZpZXcgImFwcGxpY2F0aW9ucyIgQDUNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANA0KLQkJCQkgICAgbG9jYXRpb24gICAJKC0xMDMsIDM3NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCQljb2xvciAgICAgIAkwDQotCQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTQzLCA2OTQpDQotCQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkJYW5jaG9yICAgICAJMQ0KLQkJCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQkJbmxpbmVzICAgICAJMQ0KLQkJCQkJbWF4X3dpZHRoICAJMjQ3DQotCQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCQlsYWJlbCAgICAgIAkiK2FwcGxpY2F0aW9ucyINCi0JCQkJCXBjdERpc3QgICAgCTAuNjc5Njg4DQotCQkJCQloZWlnaHQgICAgIAkxMzkNCi0JCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkgICAgcXVpZHUgICAgICAJIjNDNTZGREU3MDJERCINCi0JCQkJICAgIGNsaWVudCAgICAgCUA0DQotCQkJCSAgICBzdXBwbGllciAgIAlAMw0KLQkJCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkoMjgxLCA1MDMpDQotCQkJCQkoMjgxLCA3ODYpKQ0KLQkJCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyODEsIDUwMykNCi0JCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODEsIDc4NikNCi0JCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcNCi0JCQkJCVBhcmVudF9WaWV3IAlANQ0KLQkJCQkJbG9jYXRpb24gICAJKDMzNCwgNjQ5KQ0KLQkJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJCWFuY2hvciAgICAgCTINCi0JCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJCW5saW5lcyAgICAgCTENCi0JCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJCXBjdERpc3QgICAgCTAuNTE2ODU0DQotCQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDgNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANA0KLQkJCQkgICAgbG9jYXRpb24gICAJKC0xMDMsIDM3NSkNCi0JCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJICAgIHF1aWR1ICAgICAgCSIzQzU2RkRFNzAyREYiDQotCQkJCSAgICBjbGllbnQgICAgIAlANA0KLQkJCQkgICAgc3VwcGxpZXIgICAJQDENCi0JCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJKDI4MSwgNTAzKQ0KLQkJCQkJKDI4MSwgMjIxKSkNCi0JCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjgxLCA1MDMpDQotCQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxLCAyMjEpKSkpDQotCQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4IiBAOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTQ2LCAyODQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzU2RkRFRjAwMTgiDQotCQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkob2JqZWN0IFJvbGVWaWV3ICJsb29zZUFyY2hpdmVzIiBAMTANCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MiwgLTMyNCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCQljb2xvciAgICAgIAkwDQotCQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIDI0NSkNCi0JCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCQlhbmNob3IgICAgIAkxDQotCQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCQlubGluZXMgICAgIAkxDQotCQkJCQltYXhfd2lkdGggIAkyODUNCi0JCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJCWxhYmVsICAgICAgCSIrbG9vc2VBcmNoaXZlcyINCi0JCQkJCXBjdERpc3QgICAgCTAuNjc2MjQ1DQotCQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQkJb3JpZW50YXRpb24gCTApDQotCQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkZERjAwMDIzIg0KLQkJCQkgICAgY2xpZW50ICAgICAJQDkNCi0JCQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSg1NDYsIDI4NCkNCi0JCQkJCSgxMTMyLCAyODQpKQ0KLQkJCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1NDYsIDI4NCkNCi0JCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMyLCAyODQpDQotCQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQkJbG9jYXRpb24gICAJKDk5NSwgMzI0KQ0KLQkJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJCWFuY2hvciAgICAgCTINCi0JCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJCW5saW5lcyAgICAgCTENCi0JCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJCXBjdERpc3QgICAgCTAuNzY2Mjg0DQotCQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkob2JqZWN0IFJvbGVWaWV3ICJsb29zZUFwcCIgQDEzDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjIsIC0zMjQpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTEwDQotCQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJY29sb3IgICAgICAJMA0KLQkJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzDQotCQkJCQlsb2NhdGlvbiAgIAkoNTY2LCA2MTIpDQotCQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkJYW5jaG9yICAgICAJMQ0KLQkJCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQkJbmxpbmVzICAgICAJMQ0KLQkJCQkJbWF4X3dpZHRoICAJMjA4DQotCQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCQlsYWJlbCAgICAgIAkiK2xvb3NlQXBwIg0KLQkJCQkJcGN0RGlzdCAgICAJMC43MDI0OTUNCi0JCQkJCWhlaWdodCAgICAgCTEwMw0KLQkJCQkJb3JpZW50YXRpb24gCTApDQotCQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCSAgICBxdWlkdSAgICAgIAkiM0M1NkZERjAwMDI1Ig0KLQkJCQkgICAgY2xpZW50ICAgICAJQDkNCi0JCQkJICAgIHN1cHBsaWVyICAgCUAzDQotCQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSg1NDYsIDI4NCkNCi0JCQkJCSg0NjMsIDI4NCkNCi0JCQkJCSg0NjMsIDc4NikpDQotCQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU0NiwgMjg0KQ0KLQkJCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ2MywgNzg2KSkpKQ0KLQkJCShvYmplY3QgTm90ZVZpZXcgQDE1DQotCQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDE2ODApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQsIDE1NDMpDQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCW5saW5lcyAgICAgCTUNCi0JCQkJbWF4X3dpZHRoICAJNzcyDQotCQkJCWxhYmVsICAgICAgCSJBc3N1bXB0aW9uOiAgRm9yIGEgZ2l2ZW4gcnVubmluZyBzZXJ2ZXIsIHRoZXJlIGV4aXN0cyBvbmx5IG9uZSBjb25maWcgd2l0aCBhIHNldCBvZiBhcHBsaWNhdGlvbnMiKQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIHdpZHRoICAgICAgCTgzMg0KLQkJCSAgICBoZWlnaHQgICAgIAkyODcpDQotCQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6bG9vc2Vjb25maWc6Okxvb3NlTW9kdWxlIiBAMTYNCi0JCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA4OTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ2NiwgODQ2KQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMzMg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJMb29zZU1vZHVsZSIpDQotCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzVBQkVGRTAyOTAiDQotCQkJICAgIHdpZHRoICAgICAgCTM1MA0KLQkJCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6Omxvb3NlY29uZmlnOjpMb29zZUxpYnJhcnkiIEAxNw0KLQkJCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkgICAgbG9jYXRpb24gICAJKDkyOCwgOTEyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCVBhcmVudF9WaWV3IAlAMTcNCi0JCQkJbG9jYXRpb24gICAJKDc3NSwgODYyKQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJMb29zZUxpYnJhcnkiKQ0KLQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1QUY3QUMwMDI4Ig0KLQkJCSAgICB3aWR0aCAgICAgIAkzMjQNCi0JCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkJICAgIGFubm90YXRpb24gCTgNCi0JCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpsb29zZWNvbmZpZzo6TG9vc2VXQVJGaWxlIiBAMTgNCi0JCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ4LCAxMzI4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJbG9jYXRpb24gICAJKDE0NjIsIDEyNzgpDQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIkxvb3NlV0FSRmlsZSIpDQotCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzVBRjdEQjAxOEUiDQotCQkJICAgIHdpZHRoICAgICAgCTM5MA0KLQkJCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOSIgQDE5DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDA2LCAxMzEyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1QUY4MDIwMERGIg0KLQkJCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJKG9iamVjdCBSb2xlVmlldyAibG9vc2VMaWJzIiBAMjANCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgtNjQyLCAtMTI4KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCWNvbG9yICAgICAgCTANCi0JCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMA0KLQkJCQkJbG9jYXRpb24gICAJKDc5MSwgMTAxNykNCi0JCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCQlhbmNob3IgICAgIAkxDQotCQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCQlubGluZXMgICAgIAkxDQotCQkJCQltYXhfd2lkdGggIAkxOTYNCi0JCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJCWxhYmVsICAgICAgCSIrbG9vc2VMaWJzIg0KLQkJCQkJcGN0RGlzdCAgICAJMC45MDU5NjMNCi0JCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQkJb3JpZW50YXRpb24gCTApDQotCQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCSAgICBxdWlkdSAgICAgIAkiM0M1QUY4MDMwMDg3Ig0KLQkJCQkgICAgY2xpZW50ICAgICAJQDE5DQotCQkJCSAgICBzdXBwbGllciAgIAlAMTcNCi0JCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJKDEwMDYsIDEzMTIpDQotCQkJCQkoODk3LCAxMzEyKQ0KLQkJCQkJKDg5NywgOTc0KSkNCi0JCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAwNiwgMTMxMikNCi0JCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTcsIDk3NCkNCi0JCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyDQotCQkJCQlQYXJlbnRfVmlldyAJQDIwDQotCQkJCQlsb2NhdGlvbiAgIAkoOTUxLCAxMDE5KQ0KLQkJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJCWFuY2hvciAgICAgCTINCi0JCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJCW5saW5lcyAgICAgCTENCi0JCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkob2JqZWN0IFJvbGVWaWV3ICJsb29zZVdBUiIgQDIzDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoLTY0MiwgLTEyOCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCQljb2xvciAgICAgIAkwDQotCQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjMNCi0JCQkJCWxvY2F0aW9uICAgCSgxMzExLCAxMjcyKQ0KLQkJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJCWFuY2hvciAgICAgCTENCi0JCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJCW5saW5lcyAgICAgCTENCi0JCQkJCW1heF93aWR0aCAgCTIyNg0KLQkJCQkJanVzdGlmeSAgICAJMA0KLQkJCQkJbGFiZWwgICAgICAJIitsb29zZVdBUiINCi0JCQkJCXBjdERpc3QgICAgCTAuNjgzOTczDQotCQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQkJb3JpZW50YXRpb24gCTApDQotCQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCSAgICBxdWlkdSAgICAgIAkiM0M1QUY4MDMwMDg5Ig0KLQkJCQkgICAgY2xpZW50ICAgICAJQDE5DQotCQkJCSAgICBzdXBwbGllciAgIAlAMTgNCi0JCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJKDEwMDYsIDEzMTIpDQotCQkJCQkoMTQ1MywgMTMxMikpDQotCQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMDYsIDEzMTIpDQotCQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1MywgMTMxMikpKSkNCi0JCQkob2JqZWN0IE5vdGVWaWV3IEAyNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MiwgMzIwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCVBhcmVudF9WaWV3IAlAMjUNCi0JCQkJbG9jYXRpb24gICAJKDE3NTUsIDEzMykNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJbmxpbmVzICAgICAJNw0KLQkJCQltYXhfd2lkdGggIAkzNTkNCi0JCQkJbGFiZWwgICAgICAJDQotfHVyaSBpcyBlaXRoZXIgcmVsYXRpdmUgdG8gdGhlIEVBUiByb290IG9yIFdFQi1JTkYvbGliLg0KLXxiaW5hcmllc1BhdGggYW5kIHJlc291cmNlc1BhdGggYXJlIGFic29sdXRlDQotCQkJCSkNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICB3aWR0aCAgICAgIAk0MTkNCi0JCQkgICAgaGVpZ2h0ICAgICAJMzg3KQ0KLQkJCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2DQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1QUY3RjUwMjhGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTYwNiwgMTI2NikNCi0JCQkJKDE2MDYsIDk1OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjA2LCAxMjY2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwNiwgOTU4KSkNCi0JCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjcNCi0JCQkgICAgbG9jYXRpb24gICAJKDEzMTIsIDcwMykNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMTIsIDcwMykNCi0JCQkJKDEzMTIsIDI4NikpKQ0KLQkJCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI4DQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M1QUMwMzkwMEVFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjUwLCA4MzQpDQotCQkJCSgxNjUwLCA3MDMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY1MCwgODM0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY1MCwgNzAzKQ0KLQkJCSAgICBkcmF3U3VwcGxpZXIgCUAyNykNCi0JCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyOQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNUFGN0MyMDM3QyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE3DQotCQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTEzLCA4NTApDQotCQkJCSg5MTMsIDcwMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTMsIDg1MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkxMywgNzAzKQ0KLQkJCSAgICBkcmF3U3VwcGxpZXIgCUAyNykNCi0JCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMA0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNzUzREVFMDBFQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1MTMsIDc4NikNCi0JCQkJKDUxMywgNzAzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDUxMywgNzg2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEzLCA3MDMpDQotCQkJICAgIGRyYXdTdXBwbGllciAJQDI3KSkpKSkpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiY29tbW9uIGFyY2hpdmUiDQotCSAgICBxdWlkICAgICAgIAkiM0EwREI3NTEwMEUxIg0KLQkgICAgdGl0bGUgICAgICAJImNvbW1vbiBhcmNoaXZlIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTkxOQ0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkVKQkphckZpbGUiIEAzMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxNzkyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxDQotCQkJbG9jYXRpb24gICAJKDEzMjEsIDE3NDEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjM4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFSkJKYXJGaWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCQjI1MDAyMiINCi0JCSAgICB3aWR0aCAgICAgIAkyNTYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkFwcGxpY2F0aW9uQ2xpZW50RmlsZSIgQDMyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDE3OTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzINCi0JCQlsb2NhdGlvbiAgIAkoMTYyMCwgMTc0MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MDgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkFwcGxpY2F0aW9uQ2xpZW50RmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkI4MTAxMjgiDQotCQkgICAgd2lkdGggICAgICAJNDI2DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAzMw0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzI4LCAyNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzMNCi0JCQlsb2NhdGlvbiAgIAkoOTA2LCAxMTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk2DQotCQkJbWF4X3dpZHRoICAJODA4DQotCQkJbGFiZWwgICAgICAJIlRoZSBsb2FkaW5nIGNvbnRhaW5lciBpcyB0aGUgb3JpZ2luYWwgY29udGFpbmVyIGZyb20gd2hpY2ggdGhlIGZpbGUgd2FzIG9wZW5lZC4gIElmIHRoZSBmaWxlIGlzIGNvcGllZCBhbmQgdGhlIGNvcHkgYWRkZWQgdG8gYSBuZXcgYXJjaGl2ZSwgdGhlIG5ldyBmaWxlIGNhbiBzdGlsbCBnZXQgYW4gaW5wdXQgc3RyZWFtIG9uIGl0c2VsZiBmcm9tIHRoZSBsb2FkaW5nIGNvbnRhaW5lci4iKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTg2OA0KLQkJICAgIGhlaWdodCAgICAgCTMxOSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OlJlYWRPbmx5RGlyZWN0b3J5IiBAMzQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDg5NiwgMTEzNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNA0KLQkJCWxvY2F0aW9uICAgCSg3MDQsIDEwODUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZWFkT25seURpcmVjdG9yeSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBNTRCRUIwMDA0RCINCi0JCSAgICB3aWR0aCAgICAgIAk0MDINCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkNvbnRhaW5lciIgQDM1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDgzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM1DQotCQkJbG9jYXRpb24gICAJKDMxNSwgODA0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ29udGFpbmVyIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzUNCi0JCQlsb2NhdGlvbiAgIAkoMzE1LCA3NTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8YWJzdHJhY3Q+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBNTRCRTU1MDE2RSINCi0JCSAgICB3aWR0aCAgICAgIAkzNDgNCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkZpbGUiIEAzNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDk2LCAzODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzYNCi0JCQlsb2NhdGlvbiAgIAkoMjU0LCAyMDMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJGaWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCNzVCMDBFNSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzYNCi0JCQlsb2NhdGlvbiAgIAkoMjU0LCAyNjQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTYNCi0JCQltYXhfd2lkdGggIAk0ODEpDQotCQkgICAgd2lkdGggICAgICAJNTAyDQotCQkgICAgaGVpZ2h0ICAgICAJMzg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDM3DQotCQkgICAgbG9jYXRpb24gICAJKDExMywgNjAxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBNTRCRjRFMDAyMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmaWxlcyIgQDM4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzcNCi0JCQkgICAgbG9jYXRpb24gICAJKC01OTEsIC0xMDMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzkNCi0JCQkJUGFyZW50X1ZpZXcgCUAzOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTc0LCAyNzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMDgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2ZpbGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgzMDUzMg0KLQkJCQloZWlnaHQgICAgIAk1MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTU0QkY0RTAwMjQiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTMsIDYwMSkNCi0JCQkJKDExMywgMzIxKQ0KLQkJCQkoMjQ1LCAzMjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTEzLCA2MDEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDUsIDMyMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDANCi0JCQkJUGFyZW50X1ZpZXcgCUAzOA0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzLCAzNzUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29udGFpbmVyIiBANDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU5MSwgLTEwMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDQxDQotCQkJCWxvY2F0aW9uICAgCSgxOTMsIDg2MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29udGFpbmVyIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcyNTM1Mg0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTU0QkY0RTAwMjMiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTMsIDYwMSkNCi0JCQkJKDExMywgODE5KQ0KLQkJCQkoMzA2LCA4MTkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTEzLCA2MDEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDYsIDgxOSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMNCi0JCQkJUGFyZW50X1ZpZXcgCUA0MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQ1LCA3NzEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg1NDQ2MA0KLQkJCQloZWlnaHQgICAgIAk0OQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxIiBANDQNCi0JCSAgICBsb2NhdGlvbiAgIAkoODI4LCA2NzgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EzQTk1M0UwMEE5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImxvYWRpbmdDb250YWluZXIiIEA0NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMzIsIDI5NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMDAzLCA3NTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMjQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2xvYWRpbmdDb250YWluZXIiDQotCQkJCXBjdERpc3QgICAgCTAuMjQ5MzQ0DQotCQkJCWhlaWdodCAgICAgCTE3NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTNBOTUzRjAwODIiDQotCQkJICAgIGNsaWVudCAgICAgCUA0NA0KLQkJCSAgICBzdXBwbGllciAgIAlAMzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4MjgsIDY3OCkNCi0JCQkJKDgyOCwgODIxKQ0KLQkJCQkoNjU0LCA4MjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODI4LCA2NzgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTQsIDgyMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjg2LCA4NzUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMiIgQDQ4DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDQNCi0JCQkgICAgbG9jYXRpb24gICAJKDMzMiwgMjk0KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBM0E5NTNGMDBBQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ0DQotCQkJICAgIHN1cHBsaWVyICAgCUAzNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDgyOCwgNjc4KQ0KLQkJCQkoODI4LCA0NDEpDQotCQkJCSg3NDcsIDQ0MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4MjgsIDY3OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc0NywgNDQxKSkpKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA0OQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDMzDQotCQkgICAgc3VwcGxpZXIgICAJQDQ0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDExMzAsIDQzMSkNCi0JCQkoODI4LCA2NzgpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1MA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBNTRDMTY4MDFGQyINCi0JCSAgICBjbGllbnQgICAgIAlAMzUNCi0JCSAgICBzdXBwbGllciAgIAlAMzYNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNDgzLCA3NDEpDQotCQkJKDQ4OSwgNTc3KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6QXJjaGl2ZSIgQDUxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMzYsIDEyMTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTENCi0JCQlsb2NhdGlvbiAgIAkoOTQsIDExMzUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBcmNoaXZlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCNzVGMDE3NyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANTENCi0JCQlsb2NhdGlvbiAgIAkoOTQsIDExOTYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0ODIpDQotCQkgICAgd2lkdGggICAgICAJNTAyDQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANTINCi0JCSAgICBsb2NhdGlvbiAgIAkoNDgwLCAxMDEzKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAzNQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg0ODAsIDEwMTMpDQotCQkJKDQ4MCwgOTIyKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1Mw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBNTRCRjc1MDI5NSINCi0JCSAgICBjbGllbnQgICAgIAlAMzQNCi0JCSAgICBzdXBwbGllciAgIAlAMzUNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoODUxLCAxMDczKQ0KLQkJCSg4NTEsIDEwMTMpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg1MSwgMTA3MykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODUxLCAxMDEzKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTU0QkY1RDAxOEMiDQotCQkgICAgY2xpZW50ICAgICAJQDUxDQotCQkgICAgc3VwcGxpZXIgICAJQDM1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDI2NiwgMTEyMykNCi0JCQkoMjY2LCAxMDEzKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjYsIDExMjMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2NiwgMTAxMykNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1MikNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OldBUkZpbGUiIEA1NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTY4LCAxNzkyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDU1DQotCQkJbG9jYXRpb24gICAJKDEwNjQsIDE3NDEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjA4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXQVJGaWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERCQjQ5MDE4QyINCi0JCSAgICB3aWR0aCAgICAgIAkyMjYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OlJBUkZpbGUiIEA1Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTI4LCAxNzkyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDU2DQotCQkJbG9jYXRpb24gICAJKDgzNiwgMTc0MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxODQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJBUkZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTZERUJDRjAzQzUiDQotCQkgICAgd2lkdGggICAgICAJMjAyDQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM2LCAxNTEwKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUA1MQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgzMzYsIDE1MTApDQotCQkJKDMzNiwgMTMwOSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6TW9kdWxlRmlsZSIgQDU4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MjgsIDE1MzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1OA0KLQkJCWxvY2F0aW9uICAgCSg4MTcsIDE0ODUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjIyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNb2R1bGVGaWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERDMTIzMDEzNiINCi0JCSAgICB3aWR0aCAgICAgIAkyNDANCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1OQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MjgsIDE3MDYpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDU4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDkyOCwgMTcwNikNCi0JCQkoOTI4LCAxNTk5KSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERDMjdEMDNCRSINCi0JCSAgICBjbGllbnQgICAgIAlAMzENCi0JCSAgICBzdXBwbGllciAgIAlANTgNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTQyNSwgMTcyOSkNCi0JCQkoMTQyNSwgMTcwNikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQyNSwgMTcyOSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQyNSwgMTcwNikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1OSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMyNzkwMjE0Ig0KLQkJICAgIGNsaWVudCAgICAgCUAzMg0KLQkJICAgIHN1cHBsaWVyICAgCUA1OA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNjExLCAxNzI5KQ0KLQkJCSgxNjExLCAxNzA2KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjExLCAxNzI5KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCAxNzA2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDU5KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzJDRTAwQUUiDQotCQkgICAgY2xpZW50ICAgICAJQDU4DQotCQkgICAgc3VwcGxpZXIgICAJQDUxDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDgxNywgMTUzNikNCi0JCQkoODE3LCAxNTEwKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTcsIDE1MzYpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxNywgMTUxMCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1NykNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYzDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMyOTAwM0U0Ig0KLQkJICAgIGNsaWVudCAgICAgCUA1NQ0KLQkJICAgIHN1cHBsaWVyICAgCUA1OA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMTY4LCAxNzI5KQ0KLQkJCSgxMTY4LCAxNzA2KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTY4LCAxNzI5KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTY4LCAxNzA2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDU5KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTZERUJFNzAxQ0IiDQotCQkgICAgY2xpZW50ICAgICAJQDU2DQotCQkgICAgc3VwcGxpZXIgICAJQDU4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDkyOSwgMTcyOSkNCi0JCQkoOTI5LCAxNzA2KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjksIDE3MjkpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkyOSwgMTcwNikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1OSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkVBUkZpbGUiIEA2NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzM2LCAxOTg0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY1DQotCQkJbG9jYXRpb24gICAJKDY0NCwgMTkzMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxODQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVBUkZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCNzkwMDdEIg0KLQkJICAgIHdpZHRoICAgICAgCTIwMg0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEA2Ng0KLQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDE3MjApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMyM0MwMjcwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIi9tb2R1bGVGaWxlcyIgQDY3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANjYNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNjksIDc2MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OA0KLQkJCQlQYXJlbnRfVmlldyAJQDY3DQotCQkJCWxvY2F0aW9uICAgCSg2MjEsIDE4MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiKy9tb2R1bGVGaWxlcyINCi0JCQkJcGN0RGlzdCAgICAJLTAuMzgzMzMzDQotCQkJCWhlaWdodCAgICAgCTI3DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBMERDMjNEMDE0RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDY2DQotCQkJICAgIHN1cHBsaWVyICAgCUA1OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY0NywgMTcyMCkNCi0JCQkJKDY0NywgMTY2MCkNCi0JCQkJKDgyMSwgMTY2MCkNCi0JCQkJKDgyMSwgMTU5OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDcsIDE3MjApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MjEsIDE1OTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY5DQotCQkJCVBhcmVudF9WaWV3IAlANjcNCi0JCQkJbG9jYXRpb24gICAJKDcxNCwgMTY5MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNDMyNTE1DQotCQkJCWhlaWdodCAgICAgCTMxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlYXJGaWxlIiBANzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE2OSwgNzYwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0EwREMyM0QwMkZFIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDY1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjQ3LCAxNzIwKQ0KLQkJCQkoNjQ3LCAxOTIxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0NywgMTcyMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY0NywgMTkyMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzENCi0JCQkJUGFyZW50X1ZpZXcgCUA3MA0KLQkJCQlsb2NhdGlvbiAgIAkoNjEzLCAxODk3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44ODQxNjENCi0JCQkJaGVpZ2h0ICAgICAJMzUNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3Mg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMzY0NTIwMDBERSINCi0JCSAgICBjbGllbnQgICAgIAlANjUNCi0JCSAgICBzdXBwbGllciAgIAlANTgNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNzY5LCAxOTIxKQ0KLQkJCSg3NjksIDE3MDYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc2OSwgMTkyMSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzY5LCAxNzA2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDU5KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6QXBwbGljYXRpb24iIEA3Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDY0LCAyMDMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDczDQotCQkJbG9jYXRpb24gICAJKDE5MDgsIDE5NTMpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMxMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQXBwbGljYXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMwQTgwM0IxIg0KLQkJICAgIHdpZHRoICAgICAgCTMzMA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEA3NA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzY4LCAyMDE1KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGMjk3RjZFMDI0NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXBsb3ltZW50RGVzY3JpcHRvciIgQDc1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDYzMiwgMzEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzYNCi0JCQkJUGFyZW50X1ZpZXcgCUA3NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc5MywgMTk3NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQyMw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVwbG95bWVudERlc2NyaXB0b3IiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGMjk3RjZFMDI0NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDc0DQotCQkJICAgIHN1cHBsaWVyICAgCUA3Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzNjgsIDIwMTUpDQotCQkJCSgxODk5LCAyMDE1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNjgsIDIwMTUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk5LCAyMDE1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDc1DQotCQkJCWxvY2F0aW9uICAgCSgxODQ2LCAyMDY5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVhckZpbGUiIEA3OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDc0DQotCQkJICAgIGxvY2F0aW9uICAgCSg2MzIsIDMxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5DQotCQkJCVBhcmVudF9WaWV3IAlANzgNCi0JCQkJbG9jYXRpb24gICAJKDk0MywgMTk3NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWFyRmlsZSINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyOTdGNkUwMjQ2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDY1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTM2OCwgMjAxNSkNCi0JCQkJKDgzNywgMjAxNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAyMDE1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODM3LCAyMDE1KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6TW9kdWxlUmVmIiBAODANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDYyNCwgMjM4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDgwDQotCQkJbG9jYXRpb24gICAJKDUxNCwgMjMzMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1vZHVsZVJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNzExRTMwMDExNSINCi0JCSAgICB3aWR0aCAgICAgIAkyMzgNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBAODENCi0JCSAgICBsb2NhdGlvbiAgIAkoNDQxLCAxODM1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M3MTFFRjkwMkY0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1vZHVsZUZpbGUiIEA4Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgxDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjEsIC01MzMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODMNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Mg0KLQkJCQlsb2NhdGlvbiAgIAkoNjEyLCAxNTYxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjMyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittb2R1bGVGaWxlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY4MTkyMg0KLQkJCQloZWlnaHQgICAgIAkyNQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMUVGQTAyNEMiDQotCQkJICAgIGNsaWVudCAgICAgCUA4MQ0KLQkJCSAgICBzdXBwbGllciAgIAlANTgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0NDEsIDE4MzUpDQotCQkJCSg0NDEsIDE1ODUpDQotCQkJCSg4MDgsIDE1ODUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDQxLCAxODM1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODA4LCAxNTg1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NA0KLQkJCQlQYXJlbnRfVmlldyAJQDgyDQotCQkJCWxvY2F0aW9uICAgCSg3MzEsIDE2MjMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3NjQ4MQ0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDg1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODENCi0JCQkgICAgbG9jYXRpb24gICAJKDEyMSwgLTUzMykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMUVGQTAyNEUiDQotCQkJICAgIGNsaWVudCAgICAgCUA4MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAODANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0NDEsIDE4MzUpDQotCQkJCSg0NDEsIDIzODgpDQotCQkJCSg1MDUsIDIzODgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDQxLCAxODM1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTA1LCAyMzg4KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEA4Ng0KLQkJICAgIGxvY2F0aW9uICAgCSg3MTYsIDIxODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMjIyMzAxOUIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibW9kdWxlUmVmcyIgQDg3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODYNCi0JCQkgICAgbG9jYXRpb24gICAJKDI1MiwgNDApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoODU3LCAyMjcwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjU0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittb2R1bGVSZWZzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYzNTAzNg0KLQkJCQloZWlnaHQgICAgIAkxNDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M3MTIyMjQwMjQ2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAODYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDgwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzE2LCAyMTg0KQ0KLQkJCQkoNzE2LCAyMzIxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDcxNiwgMjE4NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDcxNiwgMjMyMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNjcwLCAyMjgxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43MTU3MzYNCi0JCQkJaGVpZ2h0ICAgICAJNDcNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVhckZpbGUiIEA5MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg2DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNTIsIDQwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkxDQotCQkJCVBhcmVudF9WaWV3IAlAOTANCi0JCQkJbG9jYXRpb24gICAJKDgwMywgMjE0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWFyRmlsZSINCi0JCQkJcGN0RGlzdCAgICAJMC4zMDE0NzENCi0JCQkJaGVpZ2h0ICAgICAJODcNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M3MTIyMjQwMjQ4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAODYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDY1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzE2LCAyMTg0KQ0KLQkJCQkoNzE2LCAyMDQ3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDcxNiwgMjE4NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDcxNiwgMjA0NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTINCi0JCQkJUGFyZW50X1ZpZXcgCUA5MA0KLQkJCQlsb2NhdGlvbiAgIAkoNzU1LCAyMDY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44NTQ2MjYNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpNb2R1bGUiIEA5Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA0OCwgMjM4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCWxvY2F0aW9uICAgCSgxOTE3LCAyMzM0KQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzIyQzAwMDYiDQotCQkgICAgd2lkdGggICAgICAJMjgwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBAOTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjIyMikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzQwMDAzQzEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibW9kdWxlcyIgQDk1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDI3OCwgMTQ4NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDk1DQotCQkJCWxvY2F0aW9uICAgCSgxOTk5LCAyMjcwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittb2R1bGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQ4NDg0OA0KLQkJCQloZWlnaHQgICAgIAkxMDQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMDM0MDEwMkU3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDkzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjEwMiwgMjIyMikNCi0JCQkJKDIxMDIsIDIzMjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjEwMiwgMjIyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDIsIDIzMjEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3DQotCQkJCVBhcmVudF9WaWV3IAlAOTUNCi0JCQkJbG9jYXRpb24gICAJKDIxNTcsIDIyODgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY3ODAxMA0KLQkJCQloZWlnaHQgICAgIAk1NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXBwbGljYXRpb24iIEA5OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk0DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzgsIDE0ODYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzQwMTAyRTYiDQotCQkJICAgIGNsaWVudCAgICAgCUA5NA0KLQkJCSAgICBzdXBwbGllciAgIAlANzMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMTAyLCAyMjIyKQ0KLQkJCQkoMjEwMiwgMjEyMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTAyLCAyMjIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjEyMykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTkNCi0JCQkJUGFyZW50X1ZpZXcgCUA5OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjE1NiwgMjEzMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0IiBAMTAwDQotCQkgICAgbG9jYXRpb24gICAJKDEzMjUsIDIzODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MzBBOTI1MjAxMjciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibW9kdWxlIiBAMTAxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwDQotCQkJICAgIGxvY2F0aW9uICAgCSg3MDEsIDApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyDQotCQkJCVBhcmVudF9WaWV3IAlAMTAxDQotCQkJCWxvY2F0aW9uICAgCSgxNzkxLCAyMzQzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittb2R1bGUiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjQzMEE5MjUzMDE0NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwMA0KLQkJCSAgICBzdXBwbGllciAgIAlAOTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzI1LCAyMzg0KQ0KLQkJCQkoMTkwNywgMjM4NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzDQotCQkJCVBhcmVudF9WaWV3IAlAMTAxDQotCQkJCWxvY2F0aW9uICAgCSgxODQ5LCAyNDM4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1IiBAMTA0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwDQotCQkJICAgIGxvY2F0aW9uICAgCSg3MDEsIDApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDMwQTkyNTMwMTQ5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTAwDQotCQkJICAgIHN1cHBsaWVyICAgCUA4MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMjUsIDIzODQpDQotCQkJCSg3NDMsIDIzODQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gImRlc2NyaXB0b3JzIg0KLQkgICAgcXVpZCAgICAgICAJIjNBMTAxNUQ3MDI1MCINCi0JICAgIHRpdGxlICAgICAgCSJkZXNjcmlwdG9ycyINCi0JICAgIHpvb20gICAgICAgCTg5DQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTEzNw0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OldBUkZpbGUiIEAxMDUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI1NiwgMTYxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQlsb2NhdGlvbiAgIAkoMTM5LCAxNTYzKQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldBUkZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCNDkwMThDIg0KLQkJICAgIHdpZHRoICAgICAgCTI1Mg0KLQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCIgQDEwNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDA4LCAxODQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNg0KLQkJCWxvY2F0aW9uICAgCSgxMjIzLCAxNzYzKQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZsZXQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5MTQwMjUxIg0KLQkJICAgIHdpZHRoICAgICAgCTM4OA0KLQkJICAgIGhlaWdodCAgICAgCTE3OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIiBAMTA3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQwOCwgMTM5MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDcNCi0JCQlsb2NhdGlvbiAgIAkoMTI0NywgMTMzOSkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzIyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJBcHAiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDcNCi0JCQlsb2NhdGlvbiAgIAkoMTI0NywgMTI4OSkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8Y29tcG9uZW50Pj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIHdpZHRoICAgICAgCTM0MA0KLQkJICAgIGhlaWdodCAgICAgCTIzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEAxMDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoODA5LCAxNTA4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGMjk3RDUwMDI3OCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXBsb3ltZW50RGVzY3JpcHRvciIgQDEwOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIC0zMTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwDQotCQkJCVBhcmVudF9WaWV3IAlAMTA5DQotCQkJCWxvY2F0aW9uICAgCSgxMDc4LCAxNDExKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTQyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXBsb3ltZW50RGVzY3JpcHRvciINCi0JCQkJcGN0RGlzdCAgICAJMC42NDkyMjINCi0JCQkJaGVpZ2h0ICAgICAJNDUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyOTdENTAwMjdBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4MDksIDE1MDgpDQotCQkJCSgxMjM3LCAxNDI0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDkNCi0JCQkJbG9jYXRpb24gICAJKDEyMDMsIDE0ODcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAid2FyRmlsZSIgQDExMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIC0zMTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyOTdENTAwMjc5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4MDksIDE1MDgpDQotCQkJCSgzODIsIDE1OTApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBAMTEzDQotCQkgICAgbG9jYXRpb24gICAJKDE0MDgsIDE2MjgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMjMwMTIwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZsZXRzIiBAMTE0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTA1NiwgLTEwMjgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1DQotCQkJCVBhcmVudF9WaWV3IAlAMTE0DQotCQkJCWxvY2F0aW9uICAgCSgxMzY3LCAxNzI1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjI2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2bGV0cyINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMjQwMkU0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTEzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNDA4LCAxNjI4KQ0KLQkJCQkoMTQwOCwgMTc1MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2DQotCQkJCVBhcmVudF9WaWV3IAlAMTE0DQotCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAxNzM3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndlYkFwcCIgQDExNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEwNTYsIC0xMDI4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOA0KLQkJCQlQYXJlbnRfVmlldyAJQDExNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2NywgMTUzMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIxNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrd2ViQXBwIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUQyNDAyREEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwNw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MDgsIDE2MjgpDQotCQkJCSgxNDA4LCAxNTA3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTcNCi0JCQkJbG9jYXRpb24gICAJKDE0NjIsIDE1MTkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiIgQDEyMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjg4LCAxMDg4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTIwDQotCQkJbG9jYXRpb24gICAJKDIxMDMsIDEwMTEpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRW50ZXJwcmlzZUJlYW4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkJICAgIHdpZHRoICAgICAgCTM4OA0KLQkJICAgIGhlaWdodCAgICAgCTE3OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVKQkphciIgQDEyMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4MTYsIDEwNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTIxDQotCQkJbG9jYXRpb24gICAJKDYyOCwgMTAxNikNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzc2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFSkJKYXIiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMjENCi0JCQlsb2NhdGlvbiAgIAkoNjI4LCA5NjYpDQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzc2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGNvbXBvbmVudD4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNTVEMDFFMSINCi0JCSAgICB3aWR0aCAgICAgIAkzOTQNCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJlamJKYXJUb0VudGVycHJpc2VCZWFucyIgQDEyMg0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTUzLCAxMDc5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzDQotCQkJUGFyZW50X1ZpZXcgCUAxMjINCi0JCQlsb2NhdGlvbiAgIAkoMTU1MywgMTAyMCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlhbmNob3IgICAgIAkxDQotCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJImVqYkphclRvRW50ZXJwcmlzZUJlYW5zIg0KLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJaGVpZ2h0ICAgICAJNjANCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEZGM0QxRjAwM0IiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiSmFyIiBAMTI0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTA4NywgLTUwNSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjQNCi0JCQkJbG9jYXRpb24gICAJKDExMjEsIDExMTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VqYkphciINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhGRjNEMUYwM0NCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTIyDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTUzLCAxMDc5KQ0KLQkJCQkoMTAxMywgMTA3MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2DQotCQkJCVBhcmVudF9WaWV3IAlAMTI0DQotCQkJCWxvY2F0aW9uICAgCSgxMDY4LCAxMDIyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGVycHJpc2VCZWFucyIgQDEyNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEwODcsIC01MDUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4DQotCQkJCVBhcmVudF9WaWV3IAlAMTI3DQotCQkJCWxvY2F0aW9uICAgCSgxOTg1LCAxMTI2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDE5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbnRlcnByaXNlQmVhbnMiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4RkYzRDFGMDM3QSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTIwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU1MywgMTA3OSkNCi0JCQkJKDIwOTMsIDEwODQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzOSwgMTAzMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RUpCSmFyRmlsZSIgQDEzMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM2LCA3MDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTMwDQotCQkJbG9jYXRpb24gICAJKDIwMSwgNjUxKQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQkphckZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCMjUwMDIyIg0KLQkJICAgIHdpZHRoICAgICAgCTI4OA0KLQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgiIEAxMzENCi0JCSAgICBsb2NhdGlvbiAgIAkoNTQxLCA4NjEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0YyOTdFMjgwMEI1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlcGxveW1lbnREZXNjcmlwdG9yIiBAMTMyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzM5LCAtNzcxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMw0KLQkJCQlQYXJlbnRfVmlldyAJQDEzMg0KLQkJCQlsb2NhdGlvbiAgIAkoNjQ3LCA4NzUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1NDINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2RlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYxNzkxNQ0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjI5N0UyODAwQjciDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzENCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDU0MSwgODYxKQ0KLQkJCQkoNjYyLCA5NTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEzMg0KLQkJCQlsb2NhdGlvbiAgIAkoNjkwLCA5MDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk1MzA1Mg0KLQkJCQloZWlnaHQgICAgIAk1OQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiSmFyRmlsZSIgQDEzNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMzOSwgLTc3MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQkJbG9jYXRpb24gICAJKDQyMSwgODIxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjY1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlamJKYXJGaWxlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjI5N0UyODAwQjYiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzENCi0JCQkgICAgc3VwcGxpZXIgICAJQDEzMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDU0MSwgODYxKQ0KLQkJCQkoNDIxLCA3NjkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpBcHBsaWNhdGlvbkNsaWVudEZpbGUiIEAxMzcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk3NiwgNjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzNw0KLQkJCWxvY2F0aW9uICAgCSg3MzUsIDU4NykNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDgyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBcHBsaWNhdGlvbkNsaWVudEZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCODEwMTI4Ig0KLQkJICAgIHdpZHRoICAgICAgCTUwMA0KLQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpjbGllbnQ6OkFwcGxpY2F0aW9uQ2xpZW50IiBAMTM4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIzMjAsIDcwNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzgNCi0JCQlsb2NhdGlvbiAgIAkoMjEyMSwgNjI3KQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzOTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkFwcGxpY2F0aW9uQ2xpZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAyOEFCMDA5RSINCi0JCSAgICB3aWR0aCAgICAgIAk0MTYNCi0JCSAgICBoZWlnaHQgICAgIAkxNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDEzOQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjY5LCA2NjApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0YyOTg0NjIwMzlEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzIiBAMTQwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNzk1LCAxMDApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxDQotCQkJCVBhcmVudF9WaWV3IAlAMTQwDQotCQkJCWxvY2F0aW9uICAgCSgxNDA3LCA2NTUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC41OTE4MDkNCi0JCQkJaGVpZ2h0ICAgICAJNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjI5ODQ2MjAzOUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEzNw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2NjksIDY2MCkNCi0JCQkJKDEyMjYsIDY2MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY5LCA2NjApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjI2LCA2NjApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlcGxveW1lbnREZXNjcmlwdG9yIiBAMTQyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNzk1LCAxMDApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzDQotCQkJCVBhcmVudF9WaWV3IAlAMTQyDQotCQkJCWxvY2F0aW9uICAgCSgyMDIyLCA2MTkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1NDINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2RlcGxveW1lbnREZXNjcmlwdG9yIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjI5ODQ2MjAzOUYiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEzOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2NjksIDY2MCkNCi0JCQkJKDIxMTIsIDY2MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY5LCA2NjApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTEyLCA2NjApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NA0KLQkJCQlQYXJlbnRfVmlldyAJQDE0Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMjA2OCwgNzE0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpSQVJGaWxlIiBAMTQ1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODg4LCAxNjAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0NQ0KLQkJCWxvY2F0aW9uICAgCSgxNzc2LCAxNTQ3KQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJBUkZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTZERUJDRjAzQzUiDQotCQkgICAgd2lkdGggICAgICAJMjQyDQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpjYTo6Q29ubmVjdG9yIiBAMTQ2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI1NDQsIDE2NDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQ2DQotCQkJbG9jYXRpb24gICAJKDI0MTMsIDE1NzEpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ29ubmVjdG9yIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkwOTEwMTBGIg0KLQkJICAgIHdpZHRoICAgICAgCTI4MA0KLQkJICAgIGhlaWdodCAgICAgCTE3OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwIiBAMTQ3DQotCQkgICAgbG9jYXRpb24gICAJKDIyMDYsIDE2MTIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0YyOTgzMjEwMzVGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExIiBAMTQ4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzM4LCAtMzYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ5DQotCQkJCVBhcmVudF9WaWV3IAlAMTQ4DQotCQkJCWxvY2F0aW9uICAgCSgyMDQ5LCAxNTcxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNDgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjI5ODMyMjAyOTgiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNDcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE0NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIyMDYsIDE2MTIpDQotCQkJCSgyMDA5LCAxNjEyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDE2MTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDA5LCAxNjEyKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXBsb3ltZW50RGVzY3JpcHRvciIgQDE1MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMzOCwgLTM2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE1MA0KLQkJCQlsb2NhdGlvbiAgIAkoMjM2MywgMTU3MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVwbG95bWVudERlc2NyaXB0b3IiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGMjk4MzIyMDI4NCINCi0JCQkgICAgY2xpZW50ICAgICAJQDE0Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTQ2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjIwNiwgMTYxMikNCi0JCQkJKDI0MDQsIDE2MTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMTYxMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI0MDQsIDE2MTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDE1MA0KLQkJCQlsb2NhdGlvbiAgIAkoMjM4NCwgMTY2NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6QXBwbGljYXRpb24iIEAxNTMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjYwOCwgMzUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE1Mw0KLQkJCWxvY2F0aW9uICAgCSgyNDU2LCAyNzUpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMwNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQXBwbGljYXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMwQTgwM0IxIg0KLQkJICAgIHdpZHRoICAgICAgCTMyMg0KLQkJICAgIGhlaWdodCAgICAgCTE3OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RUFSRmlsZSIgQDE1NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzg0LCA0MDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTU0DQotCQkJbG9jYXRpb24gICAJKDI3MiwgMzQ4KQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVBUkZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCNzkwMDdEIg0KLQkJICAgIHdpZHRoICAgICAgCTI0Mg0KLQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEAxNTUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ3NiwgMzQ4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGMjk3RjZFMDI0NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXBsb3ltZW50RGVzY3JpcHRvciIgQDE1Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjYwLCAtNjEyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDE1Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjA5OCwgMzEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTQyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXBsb3ltZW50RGVzY3JpcHRvciINCi0JCQkJcGN0RGlzdCAgICAJMC42NDE1NzENCi0JCQkJaGVpZ2h0ICAgICAJMzcNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyOTdGNkUwMjQ3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTU1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNDc2LCAzNDgpDQotCQkJCSgyNDQ3LCAzNDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ3NiwgMzQ4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQ0NywgMzQ4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTYNCi0JCQkJbG9jYXRpb24gICAJKDIzMTMsIDM4OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODYyMDYxDQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlYXJGaWxlIiBAMTU5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTU1DQotCQkJICAgIGxvY2F0aW9uICAgCSg2NjAsIC02MTIpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyOTdGNkUwMjQ2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTU1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNDc2LCAzNDgpDQotCQkJCSg1MDUsIDM0OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDc2LCAzNDgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDUsIDM0OCkpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTW9kdWxlUmVmcyINCi0JICAgIHF1aWQgICAgICAgCSIzQzcxMjU4MjAwNTEiDQotCSAgICB0aXRsZSAgICAgIAkiTW9kdWxlUmVmcyINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RUpCTW9kdWxlUmVmIiBAMTYwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3NjgsIDQxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjANCi0JCQlsb2NhdGlvbiAgIAkoNTkzLCAzNjUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFSkJNb2R1bGVSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMjVBODAyQTUiDQotCQkgICAgd2lkdGggICAgICAJMzY4DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpXZWJNb2R1bGVSZWYiIEAxNjENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk2MCwgNTkyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2MQ0KLQkJCWxvY2F0aW9uICAgCSg3NzksIDU0MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldlYk1vZHVsZVJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNzEyNUIxMDI5MyINCi0JCSAgICB3aWR0aCAgICAgIAkzODANCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkNsaWVudE1vZHVsZVJlZiIgQDE2Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEyMCwgNzg0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2Mg0KLQkJCWxvY2F0aW9uICAgCSg5MzEsIDczMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNsaWVudE1vZHVsZVJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNzEyNUI5MDI1OSINCi0JCSAgICB3aWR0aCAgICAgIAkzOTYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uQXJjaGl2ZUNvcmU6OkNvbm5lY3Rvck1vZHVsZVJlZiIgQDE2Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIxNiwgMTAwOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjMNCi0JCQlsb2NhdGlvbiAgIAkoOTcyLCA5NTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDb25uZWN0b3JNb2R1bGVSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMjVDNjAwRTUiDQotCQkgICAgd2lkdGggICAgICAJNTA2DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpXZWJNb2R1bGUiIEAxNjQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3NjAsIDc1MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjQNCi0JCQlsb2NhdGlvbiAgIAkoMTUxNiwgNjQ4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViTW9kdWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDg2MEQwMjdCIg0KLQkJICAgIHdpZHRoICAgICAgCTUwNg0KLQkJICAgIGhlaWdodCAgICAgCTIzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6SmF2YUNsaWVudE1vZHVsZSIgQDE2NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAwMCwgMTAyNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjUNCi0JCQlsb2NhdGlvbiAgIAkoMTgyMywgOTQ1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsaWVudE1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ4NjczMDAxNSINCi0JCSAgICB3aWR0aCAgICAgIAkzNzINCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb246OkVqYk1vZHVsZSIgQDE2Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTYxNiwgNTEyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2Ng0KLQkJCWxvY2F0aW9uICAgCSgxNDYwLCA0MzMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzEyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFamJNb2R1bGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0ODY4MzAyNTMiDQotCQkgICAgd2lkdGggICAgICAJMzMwDQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uOjpDb25uZWN0b3JNb2R1bGUiIEAxNjcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIyMjQsIDEyOTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTY3DQotCQkJbG9jYXRpb24gICAJKDIwNDQsIDEyMTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDb25uZWN0b3JNb2R1bGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NUJDMDAyMjciDQotCQkgICAgd2lkdGggICAgICAJMzc4DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpXQVJGaWxlIiBAMTY4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNTYsIDU0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjgNCi0JCQlsb2NhdGlvbiAgIAkoMTMzLCA0OTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjQ2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXQVJGaWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCNDkwMThDIg0KLQkJICAgIHdpZHRoICAgICAgCTI2NA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6QXBwbGljYXRpb25DbGllbnRGaWxlIiBAMTY5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNjgsIDczNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjkNCi0JCQlsb2NhdGlvbiAgIAkoMTI4LCA2ODUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDgwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBcHBsaWNhdGlvbkNsaWVudEZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQkI4MTAxMjgiDQotCQkgICAgd2lkdGggICAgICAJNDk4DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpSQVJGaWxlIiBAMTcwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2MDgsIDk0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNzANCi0JCQlsb2NhdGlvbiAgIAkoNDk5LCA4OTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjE4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSQVJGaWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0E2REVCQ0YwM0M1Ig0KLQkJICAgIHdpZHRoICAgICAgCTIzNg0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb25BcmNoaXZlQ29yZTo6RUpCSmFyRmlsZSIgQDE3MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAzNTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTcxDQotCQkJbG9jYXRpb24gICAJKDM2LCAzMDEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjgwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFSkJKYXJGaWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREJCMjUwMDIyIg0KLQkJICAgIHdpZHRoICAgICAgCTI5OA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbjo6TW9kdWxlIiBAMTcyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTY4LCAxNjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTcyDQotCQkJbG9jYXRpb24gICAJKDE3OTMsIDMxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTW9kdWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMyMkMwMDA2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNzINCi0JCQlsb2NhdGlvbiAgIAkoMTg4NywgMjAzKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMCkNCi0JCSAgICB3aWR0aCAgICAgIAkzNjgNCi0JCSAgICBoZWlnaHQgICAgIAkyODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNzMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk2OCwgMzk2KQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxNzINCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTk2OCwgMzk2KQ0KLQkJCSgxOTY4LCAzMDEpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3NA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ4NkI2MDM3OSINCi0JCSAgICBjbGllbnQgICAgIAlAMTY2DQotCQkgICAgc3VwcGxpZXIgICAJQDE3Mg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNjc1LCA0MjEpDQotCQkJKDE2NzUsIDM5NikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY3NSwgNDIxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc1LCAzOTYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTczKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTc1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDg2QUUwMUM5Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxNjQNCi0JCSAgICBzdXBwbGllciAgIAlAMTcyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE3NjYsIDYzNikNCi0JCQkoMTc2NiwgMzk2KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzY2LCA2MzYpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjYsIDM5NikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxNzMpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNzYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0ODZCMjAxRjYiDQotCQkgICAgY2xpZW50ICAgICAJQDE2NQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxNzINCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjAwMCwgOTMzKQ0KLQkJCSgyMDAwLCAzOTYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwMDAsIDkzMykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAwMCwgMzk2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE3MykNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3Nw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk1QkNBMDIxOCINCi0JCSAgICBjbGllbnQgICAgIAlAMTY3DQotCQkgICAgc3VwcGxpZXIgICAJQDE3Mg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyMzUwLCAxMjA0KQ0KLQkJCSgyMzUwLCAzOTYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzNTAsIDEyMDQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzNTAsIDM5NikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxNzMpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVSZWYiIEAxNzgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkyOCwgMTEyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTc4DQotCQkJbG9jYXRpb24gICAJKDc5OCwgNjEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNb2R1bGVSZWYiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMUUzMDAxMTUiDQotCQkgICAgd2lkdGggICAgICAJMjc4DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbkFyY2hpdmVDb3JlOjpNb2R1bGVGaWxlIiBAMTc5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDExMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE3OQ0KLQkJCWxvY2F0aW9uICAgCSgxNDEsIDYxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTW9kdWxlRmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERDMTIzMDEzNiINCi0JCSAgICB3aWR0aCAgICAgIAkyODANCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxODANCi0JCSAgICBsb2NhdGlvbiAgIAkoMjcyLCAyNjYpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDE3OQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyNzIsIDI2NikNCi0JCQkoMjcyLCAxNzUpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4MQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMERDMjkwMDNFNCINCi0JCSAgICBjbGllbnQgICAgIAlAMTY4DQotCQkgICAgc3VwcGxpZXIgICAJQDE3OQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgzMTksIDQ4MSkNCi0JCQkoMzE5LCAyNjYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMxOSwgNDgxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMTksIDI2NikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxODApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxODINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBEQzI3OTAyMTQiDQotCQkgICAgY2xpZW50ICAgICAJQDE2OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxNzkNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMzg0LCA2NzMpDQotCQkJKDM4NCwgMjY2KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzODQsIDY3MykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzg0LCAyNjYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTgwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTgzDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwREMyN0QwM0JFIg0KLQkJICAgIGNsaWVudCAgICAgCUAxNzENCi0JCSAgICBzdXBwbGllciAgIAlAMTc5DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDIyNSwgMjg4KQ0KLQkJCSgyMjUsIDI2NikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI1LCAyODgpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyNSwgMjY2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE4MCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4NA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBNkRFQkU3MDFDQiINCi0JCSAgICBjbGllbnQgICAgIAlAMTcwDQotCQkgICAgc3VwcGxpZXIgICAJQDE3OQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg2MDAsIDg4MSkNCi0JCQkoNjAwLCAyNjYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDYwMCwgODgxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDAsIDI2NikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxODApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDE4NQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2MDAsIDExMikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMUVGOTAyRjQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDE4Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE4NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzYwLCAtMTEyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDE4Ng0KLQkJCQlsb2NhdGlvbiAgIAkoNzUwLCA3MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M3MTFFRkEwMjRFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTg1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNzgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2MDAsIDExMikNCi0JCQkJKDc4OCwgMTEyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtb2R1bGVGaWxlIiBAMTg4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTg1DQotCQkJICAgIGxvY2F0aW9uICAgCSgzNjAsIC0xMTIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg5DQotCQkJCVBhcmVudF9WaWV3IAlAMTg4DQotCQkJCWxvY2F0aW9uICAgCSg0ODksIDczKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjMyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittb2R1bGVGaWxlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU5NDU1Nw0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMUVGQTAyNEMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxODUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE3OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDYwMCwgMTEyKQ0KLQkJCQkoNDEyLCAxMTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MA0KLQkJCQlQYXJlbnRfVmlldyAJQDE4OA0KLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCAxNjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxOTENCi0JCSAgICBsb2NhdGlvbiAgIAkoOTI4LCAyOTcpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDE3OA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg5MjgsIDI5NykNCi0JCQkoOTI4LCAxNzUpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE5Mg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNzEyQTFEMDE2NSINCi0JCSAgICBjbGllbnQgICAgIAlAMTYwDQotCQkgICAgc3VwcGxpZXIgICAJQDE3OA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg4MDksIDM1MykNCi0JCQkoODA5LCAyOTcpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgwOSwgMzUzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDI5NykNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxOTEpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOTMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMkEyMDAxRUIiDQotCQkgICAgY2xpZW50ICAgICAJQDE2MQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxNzgNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoOTc1LCA1MjgpDQotCQkJKDk3NSwgMjk3KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NzUsIDUyOCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTc1LCAyOTcpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTkxKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTk0DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M3MTJBMkIwMjVGIg0KLQkJICAgIGNsaWVudCAgICAgCUAxNjMNCi0JCSAgICBzdXBwbGllciAgIAlAMTc4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDEzNTAsIDk0NCkNCi0JCQkoMTM1MCwgMjk3KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUwLCA5NDQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTAsIDI5NykNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxOTEpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOTUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzcxMkEyMzAzMUMiDQotCQkgICAgY2xpZW50ICAgICAJQDE2Mg0KLQkJICAgIHN1cHBsaWVyICAgCUAxNzgNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTIwMCwgNzIwKQ0KLQkJCSgxMjAwLCAyOTcpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMDAsIDcyMCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwMCwgMjk3KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE5MSkpKSkpDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvZWpic2NoZW1hLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2VqYnNjaGVtYS5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZjA5NDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvZWpic2NoZW1hLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDEzNTc2ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNTANCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4zLjA0MDcuMjgwMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlamIiDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YTI1NjYwLTg4MjYtMTFlMS0wMDAwLTAwNWQ5ZTZhZGVjNDoxIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuanN0LmoyZWUiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJlamIueG1pIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkVqYiIpKSkNCi0gICAgcXVpZCAgICAgICAJIjM3ODBFMjcyMDMyRCINCi0gICAgc3RlcmVvdHlwZSAJIm1ldGFtb2RlbCINCi0gICAgdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0DQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YTI1NjYwLTg4MjYtMTFlMS0wMDAxLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4MDU2N0Y1MDM4NCINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmEiDQotCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGMkMwMDRFIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhhMjU2NjAtODgyNi0xMWUxLTAwMDItMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhGRjNDMUMwMjU2Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uIg0KLQkgICAgcXVpZHUgICAgICAJIjM4QzA4RjBGMDM4RCIpKQ0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJDb250YWluZXJNYW5hZ2VkRW50aXR5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhhMjU2NjAtODgyNi0xMWUxLTAwMDMtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEUzMjMwMTc0Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhhMjU2NjAtODgyNi0xMWUxLTAwMDQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzIzMDE3NSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU2OTcwMzUxIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjAzOUYwMUNEIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4NCi18DQotfEBpbnZhcmlhbnQgVGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IDEueCAsIDIueA0KLXxAZGVmYXVsdCAyLngNCi18DQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBpbml0diAgICAgIAkiMi54Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3RTY2hlbWFOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMUYyMzAyQzYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuDQotfA0KLXxGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkgYmVhbiB3aG9zZSBsb2NhbCBpbnRlcmZhY2UgaXMgY29tLmFjbWUuY29tbWVyY2UuT3JkZXIgbWlnaHQgYmUgT3JkZXIuDQotfA0KLXwNCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIG1vZHVsZSAgICAgCSJDb21wb25lbnQgVmlldzo6ZUJBRk1vZGVsczo6RUpCU2NoZW1hOjpDb250YWluZXJNYW5hZ2VkRW50aXR5QmVhbiINCi0JICAgIHF1aWR1ICAgICAgCSIzNzgwRTM2MzAwOUYiDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIk1ldGhvZFBlcm1pc3Npb24iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGEyNTY2MC04ODI2LTExZTEtMDAwNS0wMDVkOWU2YWRlYzQ6MSIpKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMEQwIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlIHNlY3VyaXR5IHJvbGVzIGFyZSBhbGxvd2VkIHRvIGludm9rZSBvbmUgb3IgbW9yZSBlbnRlcnByaXNlIGJlYW4gbWV0aG9kcy4gVGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBzZWN1cml0eSByb2xlIG5hbWVzLCBhbmQgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cy4gIFRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFuZCB0aGUgbWV0aG9kcyBtdXN0IGJlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGFuZC9vciBob21lIGludGVyZmFjZXMuIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGEyNTY2MC04ODI2LTExZTEtMDAwNi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkyRUQzOTkwMzBFIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zDQotfFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5jaGVja2VkIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTk2QjUyQzAyMDkiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbW9kdWxlICAgICAJIkNvbXBvbmVudCBWaWV3OjplQkFGTW9kZWxzOjpFSkJTY2hlbWE6Ok1ldGhvZFBlcm1pc3Npb24iDQotCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNjMwMEEwIg0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJBc3NlbWJseURlc2NyaXB0b3IiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGEyNTY2MC04ODI2LTExZTEtMDAwNy0wMDVkOWU2YWRlYzQ6MSIpKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMEQ0Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBhc3NlbWJseS1kZXNjcmlwdG9yIGVsZW1lbnQgY29udGFpbnMgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4gQWxsIHRoZSBwYXJ0cyBhcmUgb3B0aW9uYWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIFByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuIg0KLQkgICAgbW9kdWxlICAgICAJIkNvbXBvbmVudCBWaWV3OjplQkFGTW9kZWxzOjpFSkJTY2hlbWE6OkFzc2VtYmx5RGVzY3JpcHRvciINCi0JICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1QjAyQzUiDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIk1ldGhvZFRyYW5zYWN0aW9uIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhhMjU2NjAtODgyNi0xMWUxLTAwMDgtMDA1ZDllNmFkZWM0OjEiKSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzUwMDBERSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJTcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kIGludm9jYXRpb25zLiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS5UaGUgdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHJhbnNhY3Rpb25BdHRyaWJ1dGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YTI1NjYwLTg4MjYtMTFlMS0wMDA5LTAwNWQ5ZTZhZGVjNDoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMERGIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdHJhbnMtYXR0cmlidXRlIGVsZW1lbnQgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QgbWFuYWdlIHRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZCBpbnZvY2F0aW9uIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzIG1ldGhvZC4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc5RjYzNDUwM0MwIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YTI1NjYwLTg4MjYtMTFlMS0wMDBhLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODA1NUMwNTAyOTYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50Lg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbW9kdWxlICAgICAJIkNvbXBvbmVudCBWaWV3OjplQkFGTW9kZWxzOjpFSkJTY2hlbWE6Ok1ldGhvZFRyYW5zYWN0aW9uIg0KLQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzYzMDBBMSINCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU2Vzc2lvbiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YTI1NjYwLTg4MjYtMTFlMS0wMDBiLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3ODBFNUY5MDFFQiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgc2Vzc2lvbi1iZWFuVHlwZSBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZQ0KLXxkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoNCi18DQotfCAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uDQotfCAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQ0KLXwgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlDQotfCAgICAgIGljb24gZmlsZSBuYW1lDQotfCAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuDQotfCAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uDQotfCAgICAtIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGhvbWUgYW5kDQotfCAgICAgIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkNCi18ICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZA0KLXwgICAgICBsb2NhbCBpbnRlcmZhY2VzLCBpZiBhbnkNCi18ICAgIC0gdGhlIG5hbWUgb2YgdGhlIHNlc3Npb24gYmVhbidzIHdlYiBzZXJ2aWNlIGVuZHBvaW50DQotfCAgICAgIGludGVyZmFjZSwgaWYgYW55DQotfCAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcw0KLXwgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlDQotfCAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncw0KLXwgICAgICBlbnZpcm9ubWVudCBlbnRyaWVzDQotfCAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbA0KLXwgICAgICBFSkIgcmVmZXJlbmNlcw0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYg0KLXwgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUNCi18ICAgICAgcmVmZXJlbmNlcw0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkNCi18ICAgICAgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQ0KLXwgICAgICBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzDQotfCAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UNCi18ICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4NCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlDQotfCAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMNCi18DQotfFRoZSBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UNCi18dGhhdCB0aGV5IGFyZSBvbWl0dGVkIHdoZW4gaWYgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUNCi18ZW1wdHkuDQotfA0KLXxFaXRoZXIgYm90aCB0aGUgbG9jYWwtaG9tZSBhbmQgdGhlIGxvY2FsIGVsZW1lbnRzIG9yIGJvdGgNCi18dGhlIGhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIHRoZQ0KLXxzZXNzaW9uIGJlYW4uDQotfA0KLXxUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBpZiB0aGUNCi18YmVhbiBpcyBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4uDQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YTI1NjYwLTg4MjYtMTFlMS0wMDBjLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTMyMzAxMjAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHJhbnNhY3Rpb25UeXBlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGEyNTY2MC04ODI2LTExZTEtMDAwZC0wMDVkOWU2YWRlYzQ6MSIpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFNjI0MDNDRSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLg0KLXwNCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlRyYW5zYWN0aW9uVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdGQ0E0ODcwMkVGIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2Vzc2lvblR5cGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDAwLTAwNWQ5ZTZhZGVjNDoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEU2NUIwMzdEIg0KLQkJICAgIHR5cGUgICAgICAgCSJTZXNzaW9uVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkNBMDcwMTBDIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIG1vZHVsZSAgICAgCSJDb21wb25lbnQgVmlldzo6ZUJBRk1vZGVsczo6RUpCU2NoZW1hOjpTZXNzaW9uQmVhbiINCi0JICAgIHF1aWR1ICAgICAgCSIzNzgwRTgxQTAxNTkiDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkVudGl0eSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDAxLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3ODBFNjk3MDM1MSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZW50aXR5IGVsZW1lbnQgZGVjbGFyZXMgYW4gZW50aXR5IGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjogYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IG9wdGlvbmFsIGRpc3BsYXkgbmFtZTsgb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lOyBhIHVuaXF1ZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbpJzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnk7IHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW6ScyBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UsIGlmIGFueTsgdGhlIGVudGl0eSBiZWFuknMgaW1wbGVtZW50YXRpb24gY2xhc3M7IHRoZSBlbnRpdHkgYmVhbpJzIHBlcnNpc3RlbmNlIG1hbmFnZW1lbnQgdHlwZTsgdGhlIGVudGl0eSBiZWFuknMgcHJpbWFyeSBrZXkgY2xhc3MgbmFtZTsgYW4gaW5kaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW6ScyByZWVudHJhbmN5OyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbpJzIGNtcC12ZXJzaW9uOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbpJzIGFic3RyYWN0IHNjaGVtYSBuYW1lOyBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkczsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQ7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuknMgZW52aXJvbm1lbnQgZW50cmllczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW6ScyBFSkIgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW6ScyBsb2NhbCBFSkIgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW6ScyBtZXRob2RzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbpJzIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuknMgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucyBmb3IgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguDQotfFRoZSBvcHRpb25hbCBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZCBjbXAtdmVyc2lvbiAyLnguIFRoZSBvcHRpb25hbCBwcmlta2V5LWZpZWxkIG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHmScyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4gVGhlIG9wdGlvbmFsIGNtcC12ZXJzaW9uIGVsZW1lbnQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eZJzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGl0cyB2YWx1ZSBkZWZhdWx0cyB0byAyLnguDQotfFRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYgdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4NCi18VGhlIG9wdGlvbmFsIGxvY2FsLWhvbWUgYW5kIGxvY2FsIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuDQotfFRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMi54IGFuZCBxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4gZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZCBmb3IgdGhlIGVudGl0eSBiZWFuLg0KLXxUaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIEF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYNCi18dGhlIGVudGl0eZJzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMS54LCBhbmQgbm9uZSBtdXN0IG5vdCBiZSBwcmVzZW50IGlmIHRoZSBlbnRpdHmScyBwZXJzaXN0ZW5jZS10eXBlIGlzIEJlYW4uDQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDAyLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTgwODAwOTUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVlbnRyYW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAwMy0wMDVkOWU2YWRlYzQ6MSIpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFNkEyMDMxQiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eSBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIG1vZHVsZSAgICAgCSJDb21wb25lbnQgVmlldzo6ZUJBRk1vZGVsczo6RUpCU2NoZW1hOjpFbnRpdHlCZWFuIg0KLQkgICAgcXVpZHUgICAgICAJIjM3ODBFODFBMDE1QSINCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiRW50ZXJwcmlzZUJlYW4iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAwNC0wMDVkOWU2YWRlYzQ6MSIpKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiRmluYWwiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCSAgICB2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KLQkJICAgIHZhbHVlICAgICAgCVRSVUUpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJICAgIHZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEVudGVycHJpc2VKYXZhQmVhbiBpcyBhIGNsYXNzLiAgSXQgY2FuIGhhdmUgaW5zdGFuY2VzLCBzb21lb25lIGNvdWxkIHdyaXRlIGFuIA0KLXxpbnN0YW5jZSBkb2N1bWVudCBjb250YWluaW5nIERlcGFydG1lbnRzIGFuZCBFbXBsb3llZXMuICBJdCBhbHNvIGhhcyANCi18YXR0cmlidXRlcywgb3BlcmF0aW9ucywgYW5kIGFzc29jaWF0aW9ucy4gIFRoZXNlIGFyZSBhY3R1YWxseSBkZXJpdmVkL2ZpbHRlcmVkIA0KLXxmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLiAgRm9yIG1hcHBpbmcgYW5kIGJyb3dzaW5nIA0KLXxwdXJwb3NlcywgdGhvdWdoLCB5b3Ugd291bGQgbGlrZSB0aGUgRUpCIHRvIGFwcGVhciBhcyBhIGNsYXNzLiAgDQotfA0KLXxJbiB0aGlzIGxpZ2h0LCBldmVuIFNlc3Npb24gQmVhbnMgY2FuIGhhdmUgYXNzb2NpYXRpb25zIGFuZCBwcm9wZXJ0aWVzIA0KLXxpbXBsZW1lbnRlZCBieSB0aGVpciBiZWFuLiAgRm9yIGV4YW1wbGUsIGl0IHdvdWxkIGJlIG1lYW5pbmdmdWwgdG8gZGVzY3JpYmUgDQotfGFzc29jaWF0aW9ucyBmcm9tIGEgU2Vzc2lvbiB0byB0aGUgRW50aXRpZXMgd2hpY2ggaXQgdXNlcyB0byBwZXJmb3JtIGl0cyB3b3JrLg0KLXwNCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTRDMzAwOTAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpKTkRJRW52UmVmc0dyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTM5NTAzNDkiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTg4NUQ0OTAyOTAiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBtb2R1bGUgICAgIAkiQ29tcG9uZW50IFZpZXc6OmVCQUZNb2RlbHM6OkVKQlNjaGVtYTo6RW50ZXJwcmlzZUphdmFCZWFuIg0KLQkgICAgcXVpZHUgICAgICAJIjM3ODBFODFBMDE1QiINCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMGItMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzc5RjYzNDUwM0MwIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfE5vdFN1cHBvcnRlZD0xDQotfFN1cHBvcnRzPTINCi18UmVxdWlyZWQ9Mw0KLXxSZXF1aXJlc05ldz00DQotfE1hbmRhdG9yeT01DQotfE5ldmVyPTYNCi18DQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJOb3RTdXBwb3J0ZWQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDBjLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODA1NTczQzAwN0QiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJTdXBwb3J0cyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMGQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MDU1NzRGMDM3MyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlJlcXVpcmVkIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAwZS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgwNTU3NTQwMTdDIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUmVxdWlyZXNOZXciDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDBmLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODA1NTc1RDAxQjEiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJNYW5kYXRvcnkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDEwLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODA1NTc2MTAxQUMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJOZXZlciINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMTEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MDU1NzY5MDEyMiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlRyYW5zYWN0aW9uVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDEyLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RkNBNDg3MDJFRiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxCZWFuPTENCi18Q29udGFpbmVyPTINCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkJlYW4iDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDEzLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODA1NTFEMzAxNTMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDb250YWluZXIiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDE0LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODA1NTFEQzAxMzgiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTZXNzaW9uVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDE1LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3MUJDQTA3MDEwQyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTdGF0ZWZ1bD0xDQotfFN0YXRlbGVzcz0yDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJTdGF0ZWZ1bCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMTYtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3MUJDQTE1MDA4MCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlN0YXRlbGVzcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMTctMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3MUJDQTIyMDExNSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJFSkJNZXRob2RDYXRlZ29yeSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDE4LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4MTBEMDM4MDM0NCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdmFsaWQgRUpCIG1ldGhvZCBjYXRlZ29yeSBuYW1lcyBhcmU6IEVKQkhPTUVNRVRIT0QsIEVKQkNSRUFURU1FVEhPRCwgRUpCRklOREVSTUVUSE9ELCBFSkJSRU1PVEVNRVRIT0QuIg0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJFSkJKYXIiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAxOS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzNzFCQzU1RDAxRTEiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZTsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlDQotfG5hbWU7IG1hbmRhdG9yeSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBpbmNsdWRlZCBlbnRlcnByaXNlIGJlYW5zOyBhIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMsIGlmIGFueTsgYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcjsgYW5kIGFuIG9wdGlvbmFsIG5hbWUgb2YgYW4gZWpiLWNsaWVudC1qYXIgZmlsZSBmb3IgdGhlIGVqYi1qYXIuDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJjb21wb25lbnQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQjE1ODAzNDciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWpiQ2xpZW50SmFyIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAxZS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhCREE4QjAwMEUwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgb3B0aW9uYWwgZWpiLWNsaWVudC1qYXIgZWxlbWVudCBzcGVjaWZpZXMgYSBKQVIgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzcyBmaWxlcyBuZWNlc3NhcnkgZm9yIGEgY2xpZW50IHByb2dyYW0gdG8gYWNjZXNzIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBlamItamFyIGZpbGUuIFRoZSBEZXBsb3llciBzaG91bGQgbWFrZSB0aGUgZWpiLWNsaWVudCBKQVIgZmlsZSBhY2Nlc3NpYmxlIHRvIHRoZSBjbGllbnQncyBjbGFzcy1sb2FkZXIuICBFeGFtcGxlOjxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXI8L2VqYi1jbGllbnQtamFyPg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1NUFFM0IwMjE3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUNCi18ICAgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QNCi18ICAgIGNvbXBseSB3aXRoLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95bWVudCB0b29scw0KLXwgICAgdG8gdmFsaWRhdGUgYSBwYXJ0aWN1bGFyIEVKQiBEZXBsb3ltZW50DQotfCAgICBEZXNjcmlwdG9yIHdpdGggcmVzcGVjdCB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEVKQg0KLXwgICAgc2NoZW1hLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTWV0aG9kRWxlbWVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDFmLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM5MkVEMjJEMDA4QSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MNCi18aG9tZSBvciByZW1vdGUgaW50ZXJmYWNlLCBvciBhIHNldCBvZiBtZXRob2RzLiBUaGUgZWpiLW5hbWUgZWxlbWVudA0KLXxtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiBkZWNsYXJlZCBpbiB0aGUNCi18ZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8NCi18ZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IGlzIGRlZmluZWQgaW4NCi18Ym90aCB0aGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZTsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzDQotfHRoZSBtZXRob2QgbmFtZTsgYW5kIHRoZSBvcHRpb25hbCBtZXRob2QtcGFyYW1zIGVsZW1lbnRzIGlkZW50aWZ5IGENCi18c2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBtZXRob2QgbmFtZS4NCi18DQotfFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHN5bnRheDoNCi18DQotfDEuIAk8bWV0aG9kPg0KLXwJCTxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4NCi18ICAgCQk8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+DQotfAk8L21ldGhvZD4NCi18DQotfCAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNwZWNpZmllZA0KLXwgICBlbnRlcnByaXNlIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcy4NCi18DQotfDIuIAk8bWV0aG9kPg0KLXwJCTxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4NCi18ICAgCQk8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4NCi18CTwvbWV0aG9kPj4NCi18DQotfCAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZiB0aGUNCi18ICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMgd2l0aA0KLXwgICB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mIHRoaXMgc3R5bGUgcmVmZXJzIHRvDQotfCAgIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkIG5hbWUuDQotfA0KLXwNCi18DQotfA0KLXwNCi18My4gCTxtZXRob2Q+DQotfAkJPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPg0KLXwgICAJCTxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPg0KLXwJCTxtZXRob2QtcGFyYW1zPg0KLXwgICAJCQk8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4NCi18ICAgCQkJPG1ldGhvZC1wYXJhbT5QQVJBTS0yPC9tZXRob2QtcGFyYW0+DQotfCAgICAgICAgICAJCQkuLi4NCi18ICAgCQkJPG1ldGhvZC1wYXJhbT5QQVJBTS1uPC9tZXRob2QtcGFyYW0+DQotfAkJPC9tZXRob2QtcGFyYW1zPg0KLXwJPG1ldGhvZD4JDQotfA0KLXwgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhIHNldCBvZg0KLXwgICBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2ggUEFSQU0tbiBhcmUgdGhlDQotfCAgIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZSBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzIChpZg0KLXwgICB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dCBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQNCi18ICAgY29udGFpbnMgbm8gbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlDQotfCAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mIHNxdWFyZQ0KLXwgICBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4NCi18DQotfA0KLXxVc2VkIGluOiBtZXRob2QtcGVybWlzc2lvbiBhbmQgY29udGFpbmVyLXRyYW5zYWN0aW9uDQotfA0KLXxFeGFtcGxlczoNCi18DQotfCAgICBTdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlIG1ldGhvZHMgb2YNCi18CQl0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlczoNCi18DQotfAkJPG1ldGhvZD4NCi18CQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+DQotfAkJCTxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4NCi18CQk8L21ldGhvZD4NCi18DQotfAlTdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlIGNyZWF0ZQ0KLXwJCW1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6DQotfA0KLXwgICAgCQk8bWV0aG9kPg0KLXwJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4NCi18CQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+DQotfAkJPC9tZXRob2Q+DQotfA0KLXwJU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlDQotfAkJY3JlYXRlKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBMYXN0TmFtZSkgbWV0aG9kIG9mIHRoZQ0KLXwJIAlFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLg0KLXwNCi18ICAgIAkJPG1ldGhvZD4NCi18CQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+DQotfAkJCTxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPg0KLXwJCQk8bWV0aG9kLXBhcmFtcz4NCi18CQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPg0KLXwJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+DQotfAkJCTwvbWV0aG9kLXBhcmFtcz4NCi18CQk8L21ldGhvZD4NCi18DQotfAkNCi18CVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoDQotfAltb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kDQotfAkJCWZvb2JhcihjaGFyIHMsIGludCBpLCBpbnRbXSBpYXIsIG15cGFja2FnZS5NeUNsYXNzIG15Y2wsDQotfAkJCQlteXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikNCi18ICAgICAgICB3b3VsZCBiZSBzcGVjaWZpZWQgYXM6DQotfA0KLXwgICAgCQk8bWV0aG9kPg0KLXwJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4NCi18CQkJPG1ldGhvZC1uYW1lPmZvb2JhcjwvbWV0aG9kLW5hbWU+DQotfAkJCTxtZXRob2QtcGFyYW1zPg0KLXwJCQkJPG1ldGhvZC1wYXJhbT5jaGFyPC9tZXRob2QtcGFyYW0+DQotfAkJCQk8bWV0aG9kLXBhcmFtPmludDwvbWV0aG9kLXBhcmFtPg0KLXwJCQkJPG1ldGhvZC1wYXJhbT5pbnRbXTwvbWV0aG9kLXBhcmFtPg0KLXwJCQkJPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzczwvbWV0aG9kLXBhcmFtPg0KLXwJCQkJPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzc1tdW108L21ldGhvZC1wYXJhbT4NCi18CQkJPC9tZXRob2QtcGFyYW1zPg0KLXwJCTwvbWV0aG9kPg0KLXwNCi18CVRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdoZW4gaXQgYmVjb21lcw0KLXwgICBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUNCi18ICAgaW50ZXJmYWNlIGFuZCBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHNpZ25hdHVyZSB0aGF0IGlzDQotfCAgIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UuDQotfA0KLXwJRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudA0KLXwNCi18ICAgCQk8bWV0aG9kPg0KLXwJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4NCi18CQkJPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+DQotfAkJCTxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPg0KLXwJCQk8bWV0aG9kLXBhcmFtcz4NCi18CQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPg0KLXwJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+DQotfAkJCTwvbWV0aG9kLXBhcmFtcz4NCi18CQk8L21ldGhvZD4NCi18DQotfAljYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZA0KLXwgICBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykNCi18ICAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUgaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzDQotfA0KLXwgICAJCTxtZXRob2Q+DQotfAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPg0KLXwJCQk8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+DQotfAkJCTxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPg0KLXwJCQk8bWV0aG9kLXBhcmFtcz4NCi18CQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPg0KLXwJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+DQotfAkJCTwvbWV0aG9kLXBhcmFtcz4NCi18CQk8L21ldGhvZD4NCi18DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAyMC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkyRUQyNjQwMzc4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIG1ldGhvZCwNCi18b3IgdGhlIGFzdGVyaXNrICgqKSBjaGFyYWN0ZXIuIFRoZSBhc3RlcmlzayBpcyB1c2VkIHdoZW4gdGhlIGVsZW1lbnQNCi18ZGVub3RlcyBhbGwgdGhlIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGFuZCBob21lDQotfGludGVyZmFjZXMuDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJtcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMjEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MkVEMjY0MDM5NiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBhIGxpc3Qgb2YgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLiAgSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdGhpcyBpcyBhIHNwYWNlIGRlbGltaXR0ZWQgU3RyaW5nLiAgQSBudWxsIHN0cmluZyBpbmRpY2F0ZXMgYSBnZW5lcmljIG1ldGhvZCBlbGVtZW50IHRoYXQgY2FuIGFwcGx5IHRvIG11bHRpcGxlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lLiAgQW4gZW1wdHkgc3RyaW5nIGluZGljYXRlcyBhIG1ldGhvZCB3aXRoIHplcm8gcGFyYW1ldGVycy4gIEluIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgKHBvc3QgVjUpLCB0aGlzIGZpZWxkIHdpbGwgYmUgZGVwcmVjYXRlZCBhbmQgbWlncmF0ZWQgdG8gdXNlIHRoZSBtdWx0aS12YWx1ZWQgcGFyYW1zIGZpZWxkIGFuZCB0aGUgaXNaZXJvUGFyYW1zIGZsYWcuDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAyMi0wMDVkOWU2YWRlYzQ6MSIpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MkVEMjY0MDNCNCINCi0JCSAgICB0eXBlICAgICAgIAkiTWV0aG9kRWxlbWVudEtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MkVEMkU3MDI0MCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAyMy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODQ2QzIwMzcwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zDQotfFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIk1ldGhvZEVsZW1lbnRLaW5kIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMjQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzkyRUQyRTcwMjQwIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgYWRkZWQgU2VydmljZUVuZHBvaW50DQotfFVuc3BlY2lmaWVkPTANCi18UmVtb3RlPTENCi18SG9tZT0yDQotfExvY2FsPTMNCi18TG9jYWxIb21lPTQNCi18U2VydmljZUVuZHBvaW50PTUNCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlVuc3BlY2lmaWVkIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQ0I0N0EyODAxODAiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUmVtb3RlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAyNi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkyRUQzMTEwMjRBIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkhvbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDQjQ3QTczMDE4OCIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJMb2NhbCINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODZFMEQwMzAxIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkxvY2FsSG9tZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODZFMEYwMjA5IikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlNlcnZpY2VFbmRwb2ludCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDI4QTEwMzMzIikpKQ0KLQkob2JqZWN0IENsYXNzICJDTVBBdHRyaWJ1dGUiDQotCSAgICBxdWlkICAgICAgIAkiM0EyMjg4NjMwMDAzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlc2NyaWJlcyBhIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkLiBUaGUgZmllbGQgZWxlbWVudCBpbmNsdWRlcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsIGFuZCB0aGUgbmFtZSBvZiB0aGUgZmllbGQuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQTIyODg3NzAzNDEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MjM4NDcyMDM5RCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTlBQkMxNTAwRjAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgY21yIGZpZWxkLg0KLXwNCi18VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlJlbGF0aW9uc2hpcHMiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRUY4MTcwM0IzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSByZWxhdGlvbnNoaXBzIGRlc2NyaWJlcyB0aGUgcmVsYXRpb25zaGlwcyBpbiB3aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZSBwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHMgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMDk2NzAyMzkiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgY29sbGVjdGlvbiBvZiByZWxhdGlvbnNoaXBzLg0KLXwNCi18VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlF1ZXJ5Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYwMjcxMDMyNyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcXVlcnkgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgYSBmaW5kZXIgb3Igc2VsZWN0IHF1ZXJ5LiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnk7IHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmaW5kZXIgb3Igc2VsZWN0IG1ldGhvZCBpdCBpcyB1c2VkIGJ5OyBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHJldHVybiB0eXBlIG1hcHBpbmcsIGlmIGFueSwgaWYgdGhlIHF1ZXJ5IGlzIGZvciBhIHNlbGVjdCBtZXRob2Q7IGFuZCB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHF1ZXJ5LiBRdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTCBtdXN0IHVzZSB0aGUgZWpiLXFsIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkNCi18aXMgbm90IGV4cHJlc3NpYmxlIGluIEVKQiBRTCwgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudCBzaG91bGQgYmUgZW1wdHkuDQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjA1MEQwMDREIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zDQotfFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHF1ZXJ5Lg0KLXwNCi18VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWpiUUwiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYwNThDMDM5OSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Q29udGFpbnMgdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzIGEgZmluZGVyIG9yIHNlbGVjdCBxdWVyeS4gVGhpcyBlbGVtZW50IGlzIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhIHF1ZXJ5IGVsZW1lbnQgd2hvc2UgY29udGVudHMgc3BlY2lmeSB0aGUgZmluZGVyIG9yIHRoZSBzZWxlY3QgbWV0aG9kIHRoYXQgdXNlcyB0aGUgcXVlcnkuIFRoZSBjb250ZW50IG11c3QgYmUgYSB2YWxpZCBFSkIgUUwgcXVlcnkgc3RyaW5nIGZvciB0aGUgZW50aXR5IGJlYW4gZm9yIHdoaWNoIHRoZSBxdWVyeSBpcyBzcGVjaWZpZWQuIFRoZSBlamItcWwgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYWxsIHF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMLg0KLXwNCi18QGludmFyaWFudCBUaGUgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIEVKQiBRTCBxdWVyeSBzdHJpbmcgZm9yIHRoZSBlbnRpdHkgYmVhbiBvciBkZXBlbmRlbnQgb2JqZWN0IGNsYXNzIGZvciB3aGljaCB0aGUgcXVlcnkgaXMgc3BlY2lmaWVkLg0KLXxAaW52YXJpYW50IFRoZSBlamItcWwgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYWxsIHF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMLg0KLXwNCi18RXhhbXBsZToNCi18PHF1ZXJ5Pg0KLXw8cXVlcnktbWV0aG9kPg0KLXw8bWV0aG9kLW5hbWU+ZWpiU2VsZWN0UGVuZGluZ0xpbmVpdGVtczwvbWV0aG9kLW5hbWU+DQotfDxtZXRob2QtcGFyYW1zLz4NCi18PC9xdWVyeS1tZXRob2Q+DQotfDxlamItcWw+U0VMRUNUIEVOVElUWShsKQ0KLXxGUk9NIExpbmVJdGVtcyBsDQotfFdIRVJFIGwuc2hpcHBlZCBpcyBGQUxTRQ0KLXw8L2VqYi1xbD4NCi18PC9xdWVyeT4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmV0dXJuVHlwZU1hcHBpbmciDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg3MTA3MDJDQSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvIHNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSB0aGF0IGlzIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgc2VsZWN0IG1ldGhvZCBpcyB0byBiZSBtYXBwZWQgdG8gYW4gRUpCTG9jYWxPYmplY3Qgb3IgRUpCT2JqZWN0IHR5cGUuICBUaGUgdmFsdWUgb2YgdGhlIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCwgaWYgc3BlY2lmaWVkIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcuIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJSZXR1cm5UeXBlTWFwcGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODcwRDMwMjc2Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkVKQlJlbGF0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYwQzAyMDNCRiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS4zDQotfFRoZSBlamItcmVsYXRpb24gZWxlbWVudCBkZXNjcmliZXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UuIEFuIGVqYi1yZWxhdGlvbiBlbGVtZW50IGNvbnRhaW5zIGEgZGVzY3JpcHRpb247IGFuIG9wdGlvbmFsIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQ7IGFuZCBleGFjdGx5IHR3byByZWxhdGlvbnNoaXAgcm9sZSBkZWNsYXJhdGlvbnMsIGRlZmluZWQgYnkgdGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZXMuIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlLg0KLXwNCi18QGludmFyaWFudCBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4NCi18QGludmFyaWFudCBzZWxmLnJlbGF0aW9uc2hpcFJvbGVzLnNpemUgPT0gMg0KLXxAaW52YXJpYW50IHNlbGYucmVsYXRpb25zaGlwUm9sZXNbMF0ubmFtZSAhPSBzZWxmLnJlbGF0aW9uc2hpcFJvbGVzWzFdLm5hbWUNCi18DQotfEBtaWdyYXRpb24gRUpCMS4xIE1vdmVkIGZyb20gZWpiZXh0OjpFamJSZWxhdGlvbnNoaXBSb2xlIGNvbnRhaW5lZCB1bmRlciBlamJleHQ6OkVKQkphckV4dGVuc2lvbg0KLXxAbWlncmF0aW9uIEVKQjEuMSBhZGRlZCBvcHRpb25hbCBhdHRyaWJ1dGUsIGRlc2NyaXB0aW9uOlN0cmluZw0KLXxAbWlncmF0aW9uIEVKQjEuMSBhZGRlZCBvcHRpb25hbCBhdHRyaWJ1dGUsIG5hbWU6U3RyaW5nIChNYXkgaGF2ZSBiZWVuIGluaGVyaXRlZCBmcm9tIFJlZkJhc2VPYmplY3QgcHJldmlvdXNseSkNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMEQ0QTAyQkMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgZWpiIHJlbGF0aW9uLg0KLXwNCi18VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjBENkYwMzdFIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBJZiBzcGVjaWZpZWQsIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlLg0KLXxAaW52YXJpYW50IHNlbGYubmFtZSB1bmlxdWUgd2l0aGluIFNldDxjb2xsZWN0KGVqYkphci5lamJSZWxhdGlvbnMubmFtZSk+DQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJFSkJSZWxhdGlvbnNoaXBSb2xlIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYwREQwMDIzRCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS4zDQotfFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudCBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhIHJlbGF0aW9uc2hpcC4NCi18VGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4gVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOyB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBjbXItZmllbGQsIGlmIGFueSwgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIGFuIGVudGl0eS1iZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMsIGJvdGggcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgbXVzdCBkZWNsYXJlIGEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjbXItZmllbGQgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUgc3BlY2lmaWVzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyB1bmlkaXJlY3Rpb25hbCBpbiBuYXZpZ2FiaWxpdHkgYW5kIHRoYXQgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBpcyAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLg0KLXwNCi18QGludmFyaWFudCBtdWx0aXBsaWNpdHkgIT0gbnVsbA0KLXxAaW52YXJpYW50IHJvbGVTb3VyY2UgIT0gbnVsbA0KLXxAaW52YXJpYW50IENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpbiBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIGVsZW1lbnQgaW4gd2hpY2ggdGhlIHJvbGVTb3VyY2UgZWxlbWVudCBzcGVjaWZpZXMgYSBkZXBlbmRlbnQgb2JqZWN0IGNsYXNzLiANCi18QGludmFyaWFudCBDYXNjYWRlIGRlbGV0ZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIEVKQlJlbGF0aW9uc2hpcFJvbGUgY29udGFpbmVkIGluIGFuIEVKQnJlbGF0aW9uIGluIHdoaWNoIHRoZSBvdGhlciBFSkJSZWxhdGlvbnNoaXBSb2xlIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4NCi18DQotfEV4YW1wbGU6DQotfDxlamItcmVsYXRpb24+DQotfCAgPGVqYi1yZWxhdGlvbi1uYW1lPlByb2R1Y3QtTGluZUl0ZW08L2VqYi1yZWxhdGlvbi1uYW1lPg0KLXwgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+DQotfCAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4NCi18ICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+DQotfCAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPg0KLXwgICAgICA8ZWpiLW5hbWU+UHJvZHVjdEVKQjwvZWpiLW5hbWU+DQotfCAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4NCi18ICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4NCi18Li4uDQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjEwMjYwMUIwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zDQotfFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGVqYiByZWxhdGlvbnNoaXAgcm9sZS4NCi18DQotfFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuDQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJvbGVOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMTE1ODAwNTIiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlZmluZXMgYSBuYW1lIGZvciBhIHJvbGUgdGhhdCBpcyB1bmlxdWUgd2l0aGluIGFuIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUgc2FtZSBuYW1lIGZvciBhIHJvbGUuDQotfA0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtdWx0aXBsaWNpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYxMkU5MDJDRiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbi4NCi18DQotfFRoZSBtdWx0aXBsaWNpdHkgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoNCi18ICAgICBPbmUNCi18ICAgICBNYW55DQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJNdWx0aXBsaWNpdHlLaW5kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTlBRUJDQjAyQjciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjYXNjYWRlRGVsZXRlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMTYxRTAyRUUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYSBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YgYW5vdGhlciBlbnRpdHkgYmVhbi4gVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuIENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gRUpCUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgaW4gYW4gRUpCcmVsYXRpb24gaW4gd2hpY2ggdGhlIG90aGVyIEVKQlJlbGF0aW9uc2hpcFJvbGUgZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLg0KLXwNCi18DQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlJvbGVTb3VyY2UiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjE0NzUwMEU0Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdW5pcXVlbHkgaWRlbnRpZmllcyBhbiBlbnRpdHkgYmVhbi4NCi18QGludmFyaWFudCBUaGUgY29udGVudCBvZiBlYWNoIHJvbGUtc291cmNlIGVsZW1lbnQgc2hhbGwgcmVmZXIgdG8gYW4gZXhpc3RpbmcgZW50aXR5IGJlYW4sIGVudGl0eSBiZWFuIHJlZmVyZW5jZS4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4ODQ5MTAyRUIiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJDTVJGaWVsZCINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMTgxMDAwNEIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuMw0KLXxEZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mIGEgcmVsYXRpb25zaGlwLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIGFuZCB0aGUgY2xhc3MgdHlwZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2Ugb2YgYSByb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgQ01SRmllbGQ6Om5hbWUgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkIGZvciB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3IgbWV0aG9kcyBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIENNUkZpZWxkOjp0eXBlIGVsZW1lbnQgaXMgdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBDTVJGaWVsZHMuIEl0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGlzIHVzZWQgKGEgamF2YSBjbGFzcyBuYW1lKS4NCi18DQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOTlBRDQ2OTAxNzAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpDTVBBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMjI4ODYzMDAwMyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTWVzc2FnZURyaXZlbiINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMzI0ODAxMEIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbg0KLXxiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6DQotfA0KLXwgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbg0KLXwgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUNCi18ICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQ0KLXwgICAgICBpY29uIGZpbGUgbmFtZS4NCi18ICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4NCi18ICAgICAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcg0KLXwgICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzDQotfCAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnaW5nDQotfCAgICAgIHR5cGUNCi18ICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncw0KLXwgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncw0KLXwgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncw0KLXwgICAgICBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcw0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50DQotfCAgICAgIGVudHJpZXMNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcw0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQg0KLXwgICAgICByZWZlcmVuY2VzDQotfCAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIHNlcnZpY2UNCi18ICAgICAgcmVmZXJlbmNlcw0KLXwgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkNCi18ICAgICAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzDQotfCAgICAgIG1ldGhvZHMNCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncw0KLXwgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeQ0KLXwgICAgICByZWZlcmVuY2VzDQotfCAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UNCi18ICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4NCi18ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlDQotfCAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMNCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjMyNTMwMjZGIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRyYW5zYWN0aW9uVHlwZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjMzODcwMTY0Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUuDQotfA0KLXxUaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiBCZWFuLCBDb250YWluZXINCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiVHJhbnNhY3Rpb25UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0ZDQTQ4NzAyRUYiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXNzYWdlU2VsZWN0b3IiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYzMzk2MDEzMyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIG1lc3NhZ2Utc2VsZWN0b3IgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIEpNUyBtZXNzYWdlDQotfHNlbGVjdG9yIHRvIGJlIHVzZWQgaW4gZGV0ZXJtaW5pbmcgd2hpY2ggbWVzc2FnZXMgYSBtZXNzYWdlLWRyaXZlbg0KLXxiZWFuIGlzIHRvIHJlY2VpdmUuDQotfA0KLXxFeGFtcGxlIHZhbHVlOiANCi18Sk1TVHlwZSA9IGBjYXInIEFORCBjb2xvciA9IGBibHVlJyBBTkQgd2VpZ2h0ID4gMjUwMA0KLXwNCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWNrbm93bGVkZ2VNb2RlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMzNBRTAxNjAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBhY2tub3dsZWRnbWVudCBtb2RlIGZvciB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbiBpZiBiZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gaXMgdXNlZCAoaWUuIHNlbGYudHJhbnNhY3Rpb25UeXBlID0gQmVhbikNCi18DQotfFRoZSBhY2tub3dsZWRnZS1tb2RlIHNwZWNpZmllcyB3aGV0aGVyIEpNUyBBVVRPX0FDS05PV0xFREdFIG9yIERVUFNfT0tfQUNLTk9XTEVER0UgbWVzc2FnZSBhY2tub3dsZWRnbWVudCBzZW1hbnRpY3Mgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBvbk1lc3NhZ2UgbWVzc2FnZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdGhhdCB1c2VzIGJlYW4gbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4NCi18DQotfFRoZSBhY2tub3dsZWRnZS1tb2RlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiAgQXV0by1hY2tub3dsZWRnZSwgRHVwcy1vay1hY2tub3dsZWRnZQ0KLXwNCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiQWNrbm93bGVkZ2VNb2RlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMzZENzAzRTQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaW5rIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MDU3QTUyNTAwOEEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfCAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MNCi18CSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaw0KLXwNCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMzNGMTAwNDQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uIGVsZW1lbnQgcHJvdmlkZXMgYWR2aWNlIHRvIHRoZSBEZXBsb3llciBhcyB0byB3aGV0aGVyIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiBpcyBpbnRlbmRlZCBmb3IgYSBRdWV1ZSBvciBhIFRvcGljLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW50ZW5kZWQgZGVzdGluYXRpb24gYW5kIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHdoZXRoZXIgYSBkdXJhYmxlIG9yIG5vbi1kdXJhYmxlIHN1YnNjcmlwdGlvbiBzaG91bGQgYmUgdXNlZCBpZiB0aGUgZGVzdGluYXRpb24tdHlwZSBpcyBqYXZheC5qbXMuVG9waWMuIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYzODZCMDAyRCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGRlc3RpbmF0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIEpNUyBkZXN0aW5hdGlvbi4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZSBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVzdGluYXRpb24uDQotfA0KLXxUaGUgZGVzdGluYXRpb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiBqYXZheC5qbXMuUXVldWUsIGphdmF4Lmptcy5Ub3BpYw0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJEZXN0aW5hdGlvblR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5OTc4RjVDMDEwNiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN1YnNjcmlwdGlvbkR1cmFiaWxpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYzODlCMDA4NyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYSBKTVMgdG9waWMgc3Vic2NyaXB0aW9uIGlzIGludGVuZGVkIHRvIGJlIGR1cmFibGUgb3Igbm9uZHVyYWJsZS4NCi18DQotfFRoZSBzdWJzY3JpcHRpb24tZHVyYWJpbGl0eSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiAgRHVyYWJsZSwgTm9uRHVyYWJsZQ0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzOEYwMDI5QyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJBY2tub3dsZWRnZU1vZGUiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjM2RDcwM0U0Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEF1dG8tYWNrbm93bGVkZ2U9MA0KLXxEdXBzLW9rLWFja25vd2xlZGdlPTENCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkF1dG9BY2tub3dsZWRnZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjM2RkEwM0JDIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiRHVwc09rQWNrbm93bGVkZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYzNzAxMDM4QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMzhGMDAyOUMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RHVyYWJsZT0wDQotfE5vbkR1cmFibGU9MQ0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiRHVyYWJsZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjM5MUIwMUFEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTm9uRHVyYWJsZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjM5MUQwMkRDIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlJldHVyblR5cGVNYXBwaW5nIg0KLQkgICAgcXVpZCAgICAgICAJIjM5ODg3MEQzMDI3NiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxMb2NhbD0wDQotfFJlbW90ZT0xDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJMb2NhbCINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODcwRTQwMkU4Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUmVtb3RlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTlCMEI0RjAwMkEiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRXhjbHVkZUxpc3QiDQotCSAgICBxdWlkICAgICAgIAkiMzk5NzIxNkUwMTQ3Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBleGNsdWRlIGxpc3QgZWxlbWVudCBkZWZpbmVzIGEgc2V0IG9mIG1ldGhvZHMgd2hpY2ggdGhlIEFzc2VtYmxlciBtYXJrcyB0byBiZSB1bmNhbGxhYmxlLiBJdCBjb250YWlucyBvbmUgb3IgbW9yZSBtZXRob2RzLg0KLXwNCi18SWYgdGhlIG1ldGhvZCBwZXJtaXNzaW9uIHJlbGF0aW9uIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBhcmUgaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIG11c3QgY29uc2lkZXIgdGhvc2UgbWV0aG9kcyB0byBiZSB1bmNhbGxhYmxlLg0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTk3MjFBMTAwQTAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEZXN0aW5hdGlvblR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiMzk5NzhGNUMwMTA2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFF1ZXVlPTANCi18VG9waWM9MQ0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUXVldWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTc4RjY4MDM1MiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlRvcGljIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTk3OEY3QzAwMjYiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUXVlcnlNZXRob2QiDQotCSAgICBxdWlkICAgICAgIAkiMzk5QUNEOUMwMkRGIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzk5QUQyMzgwMkE5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyRUQyMkQwMDhBIikpKQ0KLQkob2JqZWN0IENsYXNzICJNdWx0aXBsaWNpdHlLaW5kIg0KLQkgICAgcXVpZCAgICAgICAJIjM5OUFFQkNCMDJCNyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxPbmU9MA0KLXxNYW55PTENCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk9uZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5QUVCRUEwMDMwIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTWFueSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5QUVCRUUwMzc1Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMUExQTAwQkYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgbmFtZS92YWx1ZQ0KLXxjb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4NCi18DQotfFRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhcg0KLXxtZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUEzNjAzNEEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBlbGVtZW50DQotfCAgICAgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24NCi18ICAgICAgICBwcm9wZXJ0eSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxQTQ5MDI0RCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUgZWxlbWVudCBjb250YWlucw0KLXwgICAgICAgIHRoZSBuYW1lIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb2YNCi18ICAgICAgICBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uDQotfA0KLXwgICAgICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkNCi18ICAgICAgICBuYW1lcyBhcmUgcmVjb2duaXplZDogYWNrbm93bGVkZ2VNb2RlLA0KLXwgICAgICAgIG1lc3NhZ2VTZWxlY3RvciwgZGVzdGluYXRpb25UeXBlLCBzdWJzY3JpcHRpb25EdXJhYmlsaXR5DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJBY3RpdmF0aW9uQ29uZmlnIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQxQTdFMDEzMSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBhY3RpdmF0aW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUNCi18ZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuDQotfGluIGl0cyBvcGVyYXRpb25hbCBlbnZpcm9ubWVudC4gVGhpcyBtYXkgaW5jbHVkZSBpbmZvcm1hdGlvbg0KLXxhYm91dCBtZXNzYWdlIGFja25vd2xlZGdlbWVudCwgbWVzc2FnZSBzZWxlY3RvciwgZXhwZWN0ZWQNCi18ZGVzdGluYXRpb24gdHlwZSwgZXRjLg0KLXwNCi18VGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgZXhwcmVzc2VkIGluIHRlcm1zIG9mDQotfG5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLg0KLXwNCi18VGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyDQotfG1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLg0KLQkgICAgKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMjgtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzc4MEUzMjMwMTJEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDI5LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTMyMzAxMkUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpKTkRJRW52UmVmc0dyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTM5NTAzNDkiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDJhLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTMyMzAxMkYiDQotCQkgICAgbGFiZWwgICAgICAJImVudmlyb25tZW50UHJvcGVydGllcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkVudkVudHJ5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzc3ODAwRTIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAyYi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzNzgwRTMyMzAxMzkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMmMtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzIzMDEzQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkpORElFbnZSZWZzR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1Mzk1MDM0OSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInJlc291cmNlUmVmcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMmQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzIzMDEzQiINCi0JCSAgICBsYWJlbCAgICAgIAkicmVzb3VyY2VSZWZzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UmVzb3VyY2VSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzkzMDNDNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiRWpiVG9Sb2xlcyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDJlLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzIzMDE0NCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAyZi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEUzMjMwMTQ1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInNlY3VyaXR5Um9sZVJlZnMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDMwLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTMyMzAxNDYiDQotCQkgICAgbGFiZWwgICAgICAJInNlY3VyaXR5Um9sZVJlZnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGVSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDN0EwMDI1QyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiQXNzZW1ibHlEZXNjcmlwdG9yVG9NZXRob2RQZXJtaXNzaW9ucyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDMxLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzUwMDBEMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJhc3NlbWJseURlc2NyaXB0b3IiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDMyLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTM1MDAwRDIiDQotCQkgICAgbGFiZWwgICAgICAJImFzc2VtYmx5RGVzY3JpcHRvciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkFzc2VtYmx5RGVzY3JpcHRvciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQ0Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIm1ldGhvZFBlcm1pc3Npb25zIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAzMy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMEQzIg0KLQkJICAgIGxhYmVsICAgICAgCSJtZXRob2RQZXJtaXNzaW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6Ok1ldGhvZFBlcm1pc3Npb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBEMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiTWV0aG9kUGVybWlzc2lvblRvTWV0aG9kcyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDM0LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzUwMDBFQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIvbWV0aG9kcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwMzUtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzUwMDBFQiINCi0JCSAgICBsYWJlbCAgICAgIAkiL21ldGhvZHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiL21ldGhvZFBlcm1pc3Npb24iDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDM2LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTM1MDAwRUMiDQotCQkgICAgbGFiZWwgICAgICAJIi9tZXRob2RQZXJtaXNzaW9uIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kUGVybWlzc2lvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikpKQ0KLQkgICAgZGVyaXZlZCAgICAJVFJVRSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiQXNzZW1ibHlEZXNjcmlwdG9yVG9NZXRob2RUcmFuc2FjdGlvbnMiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAzNy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzNzgwRTM1MDAwRDUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiYXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDAzOC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzc4MEUzNTAwMEQ2Ig0KLQkJICAgIGxhYmVsICAgICAgCSJhc3NlbWJseURlc2NyaXB0b3IiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpBc3NlbWJseURlc2NyaXB0b3IiDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBENCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJtZXRob2RUcmFuc2FjdGlvbnMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDM5LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzNzgwRTM1MDAwRDciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2QgaW52b2NhdGlvbnMuICBUaGUgZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLlRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZCBtZXRob2RzLiINCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kVHJhbnNhY3Rpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kVHJhbnNhY3Rpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBERSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDNhLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzUwMDBFMCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIvbWV0aG9kcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwM2ItMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzUwMDBFMSINCi0JCSAgICBsYWJlbCAgICAgIAkiL21ldGhvZHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiL3RyYW5zYWN0aW9ucyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwM2MtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3ODBFMzUwMDBFMiINCi0JCSAgICBsYWJlbCAgICAgIAkiL3RyYW5zYWN0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6Ok1ldGhvZFRyYW5zYWN0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwREUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJlamJDbGFzcyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDNkLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4MEZEQzM0MDJDNyINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZWpiLWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4gIEV4YW1wbGU6IDxlamItY2xhc3M+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZUJlYW48L2VqYi1jbGFzcz4iDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZWpiQ2xhc3MiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDNlLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODBGREMzNTAxRUMiDQotCQkgICAgbGFiZWwgICAgICAJImVqYkNsYXNzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVqYiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwM2YtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MEZEQzM1MDFGNiINCi0JCSAgICBsYWJlbCAgICAgIAkiZWpiIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiaG9tZUludGVyZmFjZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDQwLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4MEZEQzM3MDFDNyINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImhvbWVJbnRlcmZhY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDQxLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODBGREM0NDAxNDMiDQotCQkgICAgbGFiZWwgICAgICAJImhvbWVJbnRlcmZhY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWpiIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDA0Mi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRkRDNDQwMTREIg0KLQkJICAgIGxhYmVsICAgICAgCSJlamIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJyZW1vdGVJbnRlcmZhY2UiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDA0My0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODBGREM0NjAwNkEiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4NCi18RXhhbXBsZToJPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+DQotfA0KLQkgICAgDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicmVtb3RlSW50ZXJmYWNlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDA0NC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRkRDNDcwMTY2Ig0KLQkJICAgIGxhYmVsICAgICAgCSJyZW1vdGVJbnRlcmZhY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWpiIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDA0NS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRkRDNDcwMTY3Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlamIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJwcmltYXJ5S2V5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNDYtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzgwRkREREYwMDZCIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInByaW1hcnlLZXkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDQ3LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODBGRERFMDAxMTciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZCBmb3IgYW4gZW50aXR5IHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBUaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlIG9uZSBvZiB0aGUgZmllbGRzIGRlY2xhcmVkIGluIHRoZSBjbXAtZmllbGQNCi18ZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLiAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyBub3QgdXNlZCBpZiB0aGUgcHJpbWFyeSBrZXkgbWFwcyB0byBtdWx0aXBsZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgKGkuZS4gdGhlIGtleSBpcyBhIGNvbXBvdW5kIGtleSkuIEluIHRoaXMgY2FzZSwgdGhlIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIGFuZCB0aGVpciBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuDQotfEV4YW1wbGVzOjxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4NCi18CTxwcmltLWtleS1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVJRDwvcHJpbS1rZXktY2xhc3M+DQotfAk8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLk9iamVjdDwvcHJpbS1rZXktY2xhc3M+DQotfA0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJwcmltYXJ5S2V5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVqYiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNDgtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MEZEREUwMDEyMSINCi0JCSAgICBsYWJlbCAgICAgIAkiZWpiIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTY5NzAzNTEiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gImphclRvQXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNDktMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhGRjNDRjgwMUVFIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImFzc2VtYmx5RGVzY3JpcHRvciINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNGEtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4RkYzQ0Y5MDI0OSINCi0JCSAgICBsYWJlbCAgICAgIAkiYXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6QXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRDQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlamJKYXIiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDRiLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEZGM0NGOTAyNjciDQotCQkgICAgbGFiZWwgICAgICAJImVqYkphciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVKQkphciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM1NUQwMUUxIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICJlamJKYXJUb0VudGVycHJpc2VCZWFucyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDRjLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4RkYzRDFGMDAzQiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlbnRlcnByaXNlQmVhbnMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDRkLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEZGM0QxRjAzN0EiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiBvbmUgb3IgbW9yZSBlbnRlcnByaXNlIGJlYW5zLiINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50ZXJwcmlzZUJlYW5zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVqYkphciINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNGUtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4RkYzRDFGMDNDQiINCi0JCSAgICBsYWJlbCAgICAgIAkiZWpiSmFyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCSmFyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzU1RDAxRTEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNGE1ZTAtODgyNi0xMWUxLTAwNGYtMDA1ZDllNmFkZWM0OjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzkyRUQxODkwMEZDIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInJvbGVzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI0YTVlMC04ODI2LTExZTEtMDA1MC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkyRUQxOEEwMjhFIg0KLQkJICAgIGxhYmVsICAgICAgCSJyb2xlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5Um9sZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMxRkUwMTJEIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDciDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjRhNWUwLTg4MjYtMTFlMS0wMDUxLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTJFRDE4QTAyRDQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RQZXJtaXNzaW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRDAiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI2MmM4MC04ODI2LTExZTEtMDAwMC0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOTJFRDI4ODAwNzciDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibWV0aG9kRWxlbWVudHMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDAxLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTJFRDI4OTAwMUUiDQotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZEVsZW1lbnRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyRUQyMkQwMDhBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkOSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMDItMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MkVEMjg5MDAyOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6Ok1ldGhvZFBlcm1pc3Npb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBEMCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI2MmM4MC04ODI2LTExZTEtMDAwMy0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOTJFRDQwOTAwRDQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibWV0aG9kRWxlbWVudHMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDA0LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTJFRDQwQTAxOEEiDQotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZEVsZW1lbnRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyRUQyMkQwMDhBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDA1LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTJFRDQwQTAxOUUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RUcmFuc2FjdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMERFIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDA2LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM5MzdENkZGMDExRCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlbnRlcnByaXNlQmVhbiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMDctMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MzdENzAwMDE3OCINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50ZXJwcmlzZUJlYW4iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIm1ldGhvZEVsZW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDA4LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTM3RDcwMDAyMTgiDQotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZEVsZW1lbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDIyRDAwOEEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDA5LTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM5M0VCRkM1MDBCNCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZWN1cml0eVJvbGVzIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI2MmM4MC04ODI2LTExZTEtMDAwYS0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzkzRUJGQzYwMDgzIg0KLQkJICAgIGxhYmVsICAgICAgCSJzZWN1cml0eVJvbGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzFGRTAxMkQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMGItMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5M0VCRkM2MDBDMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkFzc2VtYmx5RGVzY3JpcHRvciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQ0Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDBjLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM5MDQ1QUU0MDFGMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMGQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5MDQ1QUU1MDA4MCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkpORElFbnZSZWZzR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1Mzk1MDM0OSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVqYlJlZnMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDBlLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTA0NUFFNTAzMDEiDQotCQkgICAgbGFiZWwgICAgICAJImVqYlJlZnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpFamJSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNzgyMDJCMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTciDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI2MmM4MC04ODI2LTExZTEtMDAwZi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOTg4MzFDMzAyNDUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicGVyc2lzdGVudEF0dHJpYnV0ZXMiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDEwLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4MzFDNTAxNTciDQotCQkgICAgbGFiZWwgICAgICAJInBlcnNpc3RlbnRBdHRyaWJ1dGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Q01QQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTIyODg2MzAwMDMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmQ4YjYyYzgwLTg4MjYtMTFlMS0wMDExLTAwNWQ5ZTZhZGVjNDoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4MzFDNTAxN0YiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDE3NCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpkOGI2MmM4MC04ODI2LTExZTEtMDAxMi0wMDVkOWU2YWRlYzQ6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOTg4MzIzQjAzNTUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAia2V5QXR0cmlidXRlcyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMTMtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODgzMjNEMDI1RSINCi0JCSAgICBsYWJlbCAgICAgIAkia2V5QXR0cmlidXRlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkNNUEF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EyMjg4NjMwMDAzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6ZDhiNjJjODAtODgyNi0xMWUxLTAwMTQtMDA1ZDllNmFkZWM0OjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODgzMjNEMDI3QyINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Q29udGFpbmVyTWFuYWdlZEVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTc0Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOSINCi0JICAgIHF1aWQgICAgICAgCSIzOUJFRjg4NzAzNzgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicmVsYXRpb25zaGlwTGlzdCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRUY4ODkwMDNDIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcmVsYXRpb25zaGlwcyBjb2xsZWN0aW9uIGRlc2NyaWJlcyB0aGUgcmVsYXRpb25zaGlwcyBpbiB3aGljaCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZSBlbnRpdHkgYmVhbnMgYW5kIGRlcGVuZGVudCBvYmplY3RzIHBhcnRpY2lwYXRlLiBUaGUgcmVsYXRpb25zaGlwcyBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhIGxpc3Qgb2YgZWpiLWVudGl0eS1yZWYgZWxlbWVudHMgKHJlZmVyZW5jZXMgdG8gZW50aXR5IGJlYW5zIHRoYXQgcGFydGljaXBhdGUgaW4gY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcyBidXQgd2hvc2UgYWJzdHJhY3QgcGVyc2lzdGVuY2Ugc2NoZW1hcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBlamItamFyIGZpbGUpOw0KLXxhbmQgYSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4NCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkicmVsYXRpb25zaGlwTGlzdCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OlJlbGF0aW9uc2hpcHMiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkVGODE3MDNCMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVqYkphciINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRUY4ODkwMDNEIg0KLQkJICAgIGxhYmVsICAgICAgCSJlamJKYXIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJKYXIiDQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNTVEMDFFMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYwNTY3MDJDRCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJxdWVyeU1ldGhvZCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjA1NjkwMUVBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcXVlcnktbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtZXRob2QgKERCL1NSL0NNLSJvbiB0aGUgaG9tZSIpIGZvciBhIGZpbmRlciBvcg0KLXxzZWxlY3QgcXVlcnkuDQotfA0KLXxUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0DQotfG1ldGhvZCBpbiB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcyBvciBhIHNlbGVjdCBtZXRob2QgaW4NCi18dGhlIGRlcGVuZGVudCBvYmplY3QgY2xhc3MuDQotfA0KLXxFYWNoIG1ldGhvZC1wYXJhbSBtdXN0IGJlIGRlZmluZWQgZm9yIGEgcXVlcnktbWV0aG9kIHVzaW5nIHRoZQ0KLXxtZXRob2QtcGFyYW1zIGVsZW1lbnQuDQotfA0KLXxVc2VkIGluOiBxdWVyeQ0KLXwNCi18RXhhbXBsZToNCi18DQotfEV4YW1wbGU6DQotfDxxdWVyeT4NCi18ICA8ZGVzY3JpcHRpb24+TWV0aG9kIGZpbmRzIGxhcmdlIG9yZGVyczwvZGVzY3JpcHRpb24+DQotfCAgPHF1ZXJ5LW1ldGhvZD4NCi18ICAgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8L21ldGhvZC1uYW1lPg0KLXwgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPg0KLXwgIDwvcXVlcnktbWV0aG9kPg0KLXwgIDxlamItcWw+U0VMRUNUIEVOVElUWShvKSBGUk9NIE9yZGVyIG8gV0hFUkUgby5hbW91bnQgJmd0OyAxMDAwPC9lamItcWw+DQotfDwvcXVlcnk+DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInF1ZXJ5TWV0aG9kIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6UXVlcnlNZXRob2QiDQotCQkgICAgcXVpZHUgICAgICAJIjM5OUFDRDlDMDJERiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInF1ZXJ5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMDU2OTAxRjQiDQotCQkgICAgbGFiZWwgICAgICAJInF1ZXJ5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6UXVlcnkiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwMjcxMDMyNyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYwQzQwMDE0NyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlamJSZWxhdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYwQzQxMDAxQyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4iDQotCQkgICAgbGFiZWwgICAgICAJImVqYlJlbGF0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVKQlJlbGF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEMwMjAzQkYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJyZWxhdGlvbnNoaXBMaXN0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMEM0MTAwMUQiDQotCQkgICAgbGFiZWwgICAgICAJInJlbGF0aW9uc2hpcExpc3QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpSZWxhdGlvbnNoaXBzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJFRjgxNzAzQjMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMiINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMERFMzAxMzYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicmVsYXRpb25zaGlwUm9sZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYwREUzMDNENSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgZXhhY3RseSB0d28gcmVsYXRpb25zaGlwIHJvbGVzLg0KLXwNCi18QG1pZ3JhdGlvbiBFSkIxLjEgQ29udGFpbm1lbnQgdXNlZCB0byBiZSBieSByZWZlcmVuY2Ugb24gcmVsYXRpb24tLW5vdyBieSB2YWx1ZS4NCi18DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInJlbGF0aW9uc2hpcFJvbGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCUmVsYXRpb25zaGlwUm9sZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjBERDAwMjNEIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIyIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAicmVsYXRpb25zaGlwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMERFMzAzRDYiDQotCQkgICAgbGFiZWwgICAgICAJInJlbGF0aW9uc2hpcCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVKQlJlbGF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEMwMjAzQkYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMyINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMTRFQTAyRkYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic291cmNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMTRFQzAwNTkiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdW5pcXVlbHkgaWRlbnRpZmllcyBhbiBlbnRpdHkgYmVhbi4NCi18QG1pZ3JhdGlvbiBFSkIxLjE6IHdhcyBpYm1lamJleHQ6OkVqYlJlbGF0aW9uc2hpcFJvbGU6OnNvdXJjZUVKQk5hbWUsIGJ1dCB0aGF0IG1heSBub3QgYmUgc3VmZmljaWVudCwgYXMgdGhpcyBjYW4gbm93IHJlZmVyIHRvIGRlcGVuZGVudCBjbGFzcyBuYW1lcyBvciBlamIgcmVmcw0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJzb3VyY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpSb2xlU291cmNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMTQ3NTAwRTQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJyb2xlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMTRFQzAwNUEiDQotCQkgICAgbGFiZWwgICAgICAJInJvbGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJSZWxhdGlvbnNoaXBSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEREMDAyM0QiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNCINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMTgyMDAxQzEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiY21yRmllbGQiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYxODIxMDBEMiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QSBkZWNsYXJhdGlvbiBvZiB0aGUgQ01SRmllbGQsIGlmIGFueSwgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UNCi18DQotfEBtaWdyYXRpb24gRUpCMS4xOiBVc2VkIHRvIGJlIGhhbmRsZWQgdmlhIGlibWVqYmV4dDo6RWpiUm9sZTo6YXR0cmlidXRlcyBsaXN0DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJImNtckZpZWxkIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Q01SRmllbGQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYxODEwMDA0QiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInJvbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYxODIxMDBEQyINCi0JCSAgICBsYWJlbCAgICAgIAkicm9sZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVKQlJlbGF0aW9uc2hpcFJvbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwREQwMDIzRCINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjFCQkQwMkVEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIi9vcHBvc2l0ZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjFCQzAwMzlDIg0KLQkJICAgIGxhYmVsICAgICAgCSIvb3Bwb3NpdGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJSZWxhdGlvbnNoaXBSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEREMDAyM0QiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNiINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjFCQzAwM0E2Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCUmVsYXRpb25zaGlwUm9sZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjBERDAwMjNEIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNyINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMjA5RjAwQzQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicmVzb3VyY2VFbnZSZWZzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMjA5RjAzOTUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEEgbGlzdCBvZiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlcyB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5IHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZS4NCi18DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInJlc291cmNlRW52UmVmcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlJlc291cmNlRW52UmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMjA3MjAwRDMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjIwOUYwMzk2Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Sk5ESUVudlJlZnNHcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDUzOTUwMzQ5Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOSINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMkMxRjAxOEYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic2VjdXJpdHlJZGVudGl0eSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRjJDMjAwMjYzIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQNCi18Y29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4NCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkic2VjdXJpdHlJZGVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlNlY3VyaXR5SWRlbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzA0MDI0NSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGMkMyMDAyNjQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMSINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGMzQwODAxRkYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzdGluYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYzNDA5MDA1MiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGFjdGl2YXRpb25Db25maWcNCi18QW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGludGVuZGVkIGRlc3RpbmF0aW9uIHR5cGUgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4NCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzdGluYXRpb24iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzM0YxMDA0NCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImJlYW4iDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkYzNDA5MDA1QyINCi0JCSAgICBsYWJlbCAgICAgIAkiYmVhbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6Ok1lc3NhZ2VEcml2ZW4iDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzMjQ4MDEwQiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMyIg0KLQkgICAgcXVpZCAgICAgICAJIjM5ODg2Mzg0MDE3MiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlamJMb2NhbFJlZnMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg2Mzg1MDJBQSINCi0JCSAgICBsYWJlbCAgICAgIAkiZWpiTG9jYWxSZWZzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RUpCTG9jYWxSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODg2MkUyMDEwMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4NjM4NTAyQjQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpKTkRJRW52UmVmc0dyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTM5NTAzNDkiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gImxvY2FsSG9tZUludGVyZmFjZSINCi0JICAgIHF1aWQgICAgICAgCSIzOTg4NkMyQjAxOEIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Q29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW6ScyBsb2NhbCBob21lIGludGVyZmFjZS4gIA0KLXxUaGlzIHJlZmVyZW5jZSBpcyBvbmx5IHVzZWQgZm9yIEVudGl0eSBhbmQgU2Vzc2lvbiBiZWFucy4gIE1lc3NhZ2UgRHJpdmVuIGJlYW5zIGlnbm9yZSB0aGUgbG9jYWxIb21lSW50ZXJmYWNlIGlmIHNwZWNpZmllZC4NCi0JICAgIA0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImxvY2FsSG9tZUludGVyZmFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODZDMkMwMkFGIg0KLQkJICAgIGxhYmVsICAgICAgCSJsb2NhbEhvbWVJbnRlcmZhY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzQiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg2QzJDMDJENyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gImxvY2FsSW50ZXJmYWNlIg0KLQkgICAgcXVpZCAgICAgICAJIjM5ODg2Q0MyMDI4MyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxDb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbpJzIGxvY2FsIGludGVyZmFjZS4gIA0KLXxUaGlzIHJlZmVyZW5jZSBpcyBvbmx5IHVzZWQgZm9yIEVudGl0eSBhbmQgU2Vzc2lvbiBiZWFucy4gIE1lc3NhZ2UgRHJpdmVuIGJlYW5zIGlnbm9yZSB0aGUgbG9jYWxJbnRlcmZhY2UgaWYgc3BlY2lmaWVkLg0KLQkgICAgDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibG9jYWxJbnRlcmZhY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg2Q0M2MDBFRSINCi0JCSAgICBsYWJlbCAgICAgIAkibG9jYWxJbnRlcmZhY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg2Q0M2MDEyMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM2Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5ODg4NEMyMDM2RSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlbnRpdHlCZWFuIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4ODRDMzAyN0YiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eUJlYW4iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpDb250YWluZXJNYW5hZ2VkRW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxNzQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzciDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg4NEMzMDI4OSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OlJvbGVTb3VyY2UiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYxNDc1MDBFNCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzgiDQotCSAgICBxdWlkICAgICAgIAkiMzk4ODg2RjUwM0JEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIi9yb2xlcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODg2RjYwMkQ4Ig0KLQkJICAgIGxhYmVsICAgICAgCSIvcm9sZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJSZWxhdGlvbnNoaXBSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEREMDAyM0QiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzkiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODg4NkY2MDJFMiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDE3NCIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDAiDQotCSAgICBxdWlkICAgICAgIAkiMzk5NzIxQjYwMkY5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImV4Y2x1ZGVMaXN0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOTk3MjFCNzAyM0MiDQotCQkgICAgbGFiZWwgICAgICAJImV4Y2x1ZGVMaXN0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RXhjbHVkZUxpc3QiDQotCQkgICAgcXVpZHUgICAgICAJIjM5OTcyMTZFMDE0NyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTk3MjFCNzAyNDYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpBc3NlbWJseURlc2NyaXB0b3IiDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBENCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDIiDQotCSAgICBxdWlkICAgICAgIAkiMzk5NzIyNjUwMUE2Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIm1ldGhvZEVsZW1lbnRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTk3MjI2NjAyODQiDQotCQkgICAgbGFiZWwgICAgICAJIm1ldGhvZEVsZW1lbnRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyRUQyMkQwMDhBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTcyMjY2MDI5OCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkV4Y2x1ZGVMaXN0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTk3MjE2RTAxNDciDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ0Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5OUFFMEZCMDNEMyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJjb2xsZWN0aW9uVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5QUUwRkMwMzhGIg0KLQkJICAgIGxhYmVsICAgICAgCSJjb2xsZWN0aW9uVHlwZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5QUUwRkMwM0I3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Q01SRmllbGQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYxODEwMDA0QiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDYiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDFBRTIwMTVEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImNvbmZpZ1Byb3BlcnRpZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxQUUyMDMzMyINCi0JCSAgICBsYWJlbCAgICAgIAkiY29uZmlnUHJvcGVydGllcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDFBMUEwMEJGIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDciDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxQUUyMDMzNSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkFjdGl2YXRpb25Db25maWciDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQTdFMDEzMSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDgiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDFCMDUwMTQ5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImFjdGl2YXRpb25Db25maWciDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxQjA3MDBBMiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiYWN0aXZhdGlvbkNvbmZpZyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkFjdGl2YXRpb25Db25maWciDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQTdFMDEzMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUIwNzAwQTQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXNzYWdlRHJpdmVuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMzI0ODAxMEIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUwIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQxQkY0MDJFNyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtZXNzYWdlRGVzdGluYXRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUJGNjAwQjkiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJIm1lc3NhZ2VEZXN0aW5hdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpNZXNzYWdlRGVzdGluYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMTEwMDFDRiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUJGNjAwQzMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpBc3NlbWJseURlc2NyaXB0b3IiDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBENCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTIiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDIzQUEwMjRGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyM0FEMDFBQSINCi0JCSAgICBsYWJlbCAgICAgIAkibWVzc2FnZURlc3RpbmF0aW9uUmVmcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246Ok1lc3NhZ2VEZXN0aW5hdGlvblJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzFGNTIwMjhDIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyM0FEMDFCNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkpORElFbnZSZWZzR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1Mzk1MDM0OSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTQiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDI1RDYwMEYwIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVudGl0eSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDI1RDYwMEYxIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpDb250YWluZXJNYW5hZ2VkRW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxNzQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAicXVlcmllcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDI1RDYwMEYyIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IG1vdmVkIGZyb20gQ01FDQotfFRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMi54IGFuZCBxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4gZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZCBmb3IgdGhlIGVudGl0eSBiZWFuLg0KLXwNCi18QGludmFyaWFudCBzZWUgZGVzY3JpcHRpb24NCi18DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInF1ZXJpZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpRdWVyeSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjAyNzEwMzI3Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NSINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMjk4MjAxRTIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibWVzc2FnZURlc3RpbmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjk4MzAyNzAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJIm1lc3NhZ2VEZXN0aW5hdGlvbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDI5ODMwMjdBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWVzc2FnZURyaXZlbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjMyNDgwMTBCIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NyINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMkZBOTAxQzkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic2VydmljZVJlZnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyRkFBMDJDNSINCi0JCSAgICBsYWJlbCAgICAgIAkic2VydmljZVJlZnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlNlcnZpY2VSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyRjU2MDE4NCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU4Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMkZBQTAyQ0YiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpKTkRJRW52UmVmc0dyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTM5NTAzNDkiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU5Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQyRkUxMDFGQyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZXJ2aWNlSW50ZXJmYWNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMkZFNDAxMkUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MNCi18ICAgICAgICBuYW1lIG9mIHRoZSBKQVgtUlBDIFNlcnZpY2UgaW50ZXJmYWNlIHRoZSBjbGllbnQgZGVwZW5kcyBvbi4NCi18ICAgICAgICBJbiBtb3N0IGNhc2VzIHRoZSB2YWx1ZSB3aWxsIGJlIGphdmF4LnhtbC5ycGMuU2VydmljZS4gIEEgSkFYLVJQQw0KLXwgICAgICAgIGdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBjbGFzcyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInNlcnZpY2VJbnRlcmZhY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjAiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyRkU0MDE0QyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGNTYwMTg0IikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MSINCi0JICAgIHF1aWQgICAgICAgCSIzRTU2MkQ5RTAyNTQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibWVzc2FnaW5nVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1NjJEOUYwMTgzIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWVzc2FnZQ0KLXwgICAgICAgIGxpc3RlbmVyIGludGVyZmFjZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbi4gSWYNCi18ICAgICAgICB0aGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcw0KLXwgICAgICAgIGFzc3VtZWQgdG8gYmUgamF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lci4NCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkibWVzc2FnaW5nVHlwZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1NjJEOUYwMTk3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWVzc2FnZURyaXZlbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjMyNDgwMTBCIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MyINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMUFBRDAwQUMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUFBRDAzQTUiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDFBQUQwM0NEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6QWN0aXZhdGlvbkNvbmZpZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDFBN0UwMTMxIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NSINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMUZDQjAxQUEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUZDQzAwQzUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDFGQ0MwMEUzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCUmVsYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwQzAyMDNCRiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjciDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDI4NjAwMjE4Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDI4NjIwMTUyIg0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjgiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyODYyMDE5OCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6Ok1ldGhvZEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MkVEMjJEMDA4QSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjkiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDIxMDMwMENEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDIxMDUwMkVDIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzAiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyMTA1MDMwQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OlJvbGVTb3VyY2UiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYxNDc1MDBFNCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzEiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDFEMUYwMTYxIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDFEMjAwMURBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzIiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQxRDIwMDFFRSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkNNUEF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EyMjg4NjMwMDAzIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MyINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMUZCRjAxQ0IiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUZDMTAwMUYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDFGQzEwMDQ3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6UmVsYXRpb25zaGlwcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRUY4MTcwM0IzIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NSINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMjZCQjAwRkEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjZCQzAyRjAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDI2QkMwMzE4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kUGVybWlzc2lvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQwIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NyINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMjBDMTAyQzYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMjBDNDAwQ0MiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3OCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDIwQzQwMEVBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCUmVsYXRpb25zaGlwUm9sZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjBERDAwMjNEIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3OSINCi0JICAgIHF1aWQgICAgICAgCSIzRTREMUYyMzAwOTAiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTREMUYyMzAzRDkiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDFGMjQwMDBGIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kVHJhbnNhY3Rpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBERSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODEiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDI2NjgwMzE3Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDI2NkEwMEQ1Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkODIiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQyNjZBMDBGMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkV4Y2x1ZGVMaXN0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTk3MjE2RTAxNDciDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgzIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNTY1MDBEMDI1OSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTY1MDBFMDE0MiINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTU2NTAwRTAxNzQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpRdWVyeSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjAyNzEwMzI3Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NSINCi0JICAgIHF1aWQgICAgICAgCSIzRTU2N0NBMjAwN0YiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic2VydmljZUVuZHBvaW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTU2N0NBMzAyMjUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBjb250YWlucyB0aGUNCi18ICAgICAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3Mgd2ViDQotfCAgICAgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIFRoZSBzZXJ2aWNlLWVuZHBvaW50DQotfCAgICAgICAgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGEgc3RhdGVsZXNzDQotfCAgICAgICAgc2Vzc2lvbiBiZWFuLiBUaGUgc3BlY2lmaWVkIGludGVyZmFjZSBtdXN0IGJlIGENCi18ICAgICAgICB2YWxpZCBKQVgtUlBDIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2aWNlRW5kcG9pbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkODYiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTY3Q0EzMDI0MyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OlNlc3Npb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNUY5MDFFQiIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODciDQotCSAgICBxdWlkICAgICAgIAkiM0ZBNjg4NjIwMjY3Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg4Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRkE2ODg2NjAzNUQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpDTVBBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMjI4ODYzMDAwMyINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRkE2ODg2NjAzNUYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiOjpDb250YWluZXJNYW5hZ2VkRW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxNzQiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkwIg0KLQkgICAgcXVpZCAgICAgICAJIjNGQTY5NTg5MDI0MCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJwcmltS2V5RmllbGQiDQotCQkgICAgcXVpZCAgICAgICAJIjNGQTY5NThCMDAwOCINCi0JCSAgICBsYWJlbCAgICAgIAkicHJpbUtleUZpZWxkIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYjo6Q01QQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTIyODg2MzAwMDMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZW50aXR5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRkE2OTU4QjAwMTIiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamI6OkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDE3NCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRUpCIEphciINCi0JICAgIHF1aWQgICAgICAgCSIzNzgwRTI4NzAyNTEiDQotCSAgICB0aXRsZSAgICAgIAkiRUpCIEphciINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxCYXNlZCBvbiB0aGUgTW9zY29uZSBERCwgdHJhbnNsYXRpbmcgY2xhc3MgbmFtZSBlbGVtZW50cyB0byBjbGFzcyByZWZlcmVuY2VzLg0KLXwNCi18Tm90ZSB0aGF0IEVKQi1saW5rcyBvbmx5IGFwcGVhciBpbiB0aGUgZGVwbG95bWVudCBtb2RlbCwgYXQgYW5seXNpcy9kZXNpZ24gdGltZSwgdGhleSBtaWdodCBiZSBkZXJpdmVkIGZyb20gdGhlIGFzc29jaWF0aW9uIHJvbGVzIGZvciB0aGUgRUpCLg0KLXwNCi18QWxzbywgc2VlIG5vdGVzIG9uIEVudGVycHJpc2VKYXZhQmVhbi4NCi0JICAgIA0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTIzNjMNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6U2Vzc2lvbiIgQDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDExMzMsIDE3NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSg3NjYsIDE2MjUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNzM0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZXNzaW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDQ4NTc2MA0KLQkJICAgIGZpbGxfY29sb3IgCTE0NDcyNjQ5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNUY5MDFFQiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSg3NjYsIDE2ODYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk2MzEpDQotCQkgICAgd2lkdGggICAgICAJNzUyDQotCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRpdHkiIEAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzc2LCAxNzU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMTU3NSwgMTY1MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0MDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA0ODU3NjANCi0JCSAgICBmaWxsX2NvbG9yIAkxNDQ3MjY0OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTY5NzAzNTEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMTU3NSwgMTcxMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM0NikNCi0JCSAgICB3aWR0aCAgICAgIAk0MjANCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBMYWJlbCBAMw0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTksIDQ3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEyDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCVRSVUUNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBubGluZXMgICAgIAkxDQotCQkgICAgbWF4X3dpZHRoICAJMTMwMA0KLQkJICAgIGxhYmVsICAgICAgCSJFSkIgMi4xIE1vZGVsIChFSkIyLjAgJiAxLjEgQmFja3dhcmQgQ29tcGF0aWJsZSkiKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBANA0KLQkJICAgIGxvY2F0aW9uICAgCSg1MjYsIDIwNjcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgyNjAsIDIwMDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDk2DQotCQkJbGFiZWwgICAgICAJIlNlZSBkZXRhaWwgb24gc2VwYXJhdGUgY2xhc3MgZGlhZ3JhbXMuLi4iKQ0KLQkJICAgIGZpbGxfY29sb3IgCTE0Njc5ODA3DQotCQkgICAgd2lkdGggICAgICAJNTU2DQotCQkgICAgaGVpZ2h0ICAgICAJMTQzKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIEA1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc3MywgMjE0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJbG9jYXRpb24gICAJKDE1MzcsIDIwOTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDb250YWluZXJNYW5hZ2VkRW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDQ4NTc2MA0KLQkJICAgIGZpbGxfY29sb3IgCTE0NDcyNjQ5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDE3NCINCi0JCSAgICB3aWR0aCAgICAgIAk0OTANCi0JCSAgICBoZWlnaHQgICAgIAkxMDcNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA0ODU3NjANCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTc1Ig0KLQkJICAgIGNsaWVudCAgICAgCUA1DQotCQkgICAgc3VwcGxpZXIgICAJQDINCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTc3NSwgMjA4NykNCi0JCQkoMTc3NSwgMTg3NCkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc3NSwgMjA4NykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NSwgMTg3NCkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6TWVzc2FnZURyaXZlbiIgQDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjc1LCAxNjgzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoMjExOSwgMTY0MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2VEcml2ZW4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMzI0ODAxMEIiDQotCQkgICAgd2lkdGggICAgICAJMzMwDQotCQkgICAgaGVpZ2h0ICAgICAJMTA3DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEA4DQotCQkgICAgbG9jYXRpb24gICAJKDI0MzEsIDE5NzEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOA0KLQkJCWxvY2F0aW9uICAgCSgyMjE4LCAxODY1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTM5MA0KLQkJCWxhYmVsICAgICAgCSJTZWUgRUpCMi4wIE1lc3NhZ2UgRHJpdmVuIEJlYW4gZGlhZ3JhbSBmb3IgZGV0YWlscy4iKQ0KLQkJICAgIGZpbGxfY29sb3IgCTE0Njc5ODA3DQotCQkgICAgd2lkdGggICAgICAJNDUwDQotCQkgICAgaGVpZ2h0ICAgICAJMjI1KQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGNsaWVudCAgICAgCUA4DQotCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjM2OSwgMTg1OCkNCi0JCQkoMjMwMywgMTczNikpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDEwDQotCQkgICAgbG9jYXRpb24gICAJKDE1OTcsIDI0MTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQlsb2NhdGlvbiAgIAkoMTM5NCwgMjMwNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAkzNzENCi0JCQlsYWJlbCAgICAgIAkiU2VlIENvbnRhaW5lciBNYW5hZ2VkIEVudGl0eSBkaWFncmFtIGZvciBkZXRhaWxzLiIpDQotCQkgICAgZmlsbF9jb2xvciAJMTQ2Nzk4MDcNCi0JCSAgICB3aWR0aCAgICAgIAk0MzENCi0JCSAgICBoZWlnaHQgICAgIAkyMjUpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDExDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGNsaWVudCAgICAgCUAxMA0KLQkJICAgIHN1cHBsaWVyICAgCUA1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE2NjksIDIyOTkpDQotCQkJKDE3MzgsIDIxOTMpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IE5vdGVWaWV3IEAxMg0KLQkJICAgIGxvY2F0aW9uICAgCSg4NDUsIDEzODgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTINCi0JCQlsb2NhdGlvbiAgIAkoNjE3LCAxMzA3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTQyMQ0KLQkJCWxhYmVsICAgICAgCSJBZGRlZCBlamJKYXIgYmFjayByZWZlcmVuY2UiKQ0KLQkJICAgIGZpbGxfY29sb3IgCTE0Njc5ODA3DQotCQkgICAgd2lkdGggICAgICAJNDgxDQotCQkgICAgaGVpZ2h0ICAgICAJMTc1KQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzgxLCAzNzgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTMNCi0JCQlsb2NhdGlvbiAgIAkoNjIsIDEzNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTkNCi0JCQltYXhfd2lkdGggIAk2MDMNCi0JCQlsYWJlbCAgICAgIAkNCi18RGVwcmVjYXRpb25zOg0KLXxFSkJKYXI6OmRlc2NyaXB0aW9uDQotfEVKQkphcjo6ZGlzcGxheU5hbWUNCi18RUpCSmFyOjpzbWFsbEljb24NCi18RUpCSmFyOjpsYXJnZUljb24NCi18RW50ZXJwcmlzZUJlYW46OmRlc2NyaXB0aW9uDQotfEVudGVycHJpc2VCZWFuOjpkaXNwbGF5TmFtZQ0KLXxFbnRlcnByaXNlQmVhbjo6c21hbGxJY29uDQotfEVudGVycHJpc2VCZWFuOjpsYXJnZUljb24NCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJNjYzDQotCQkgICAgaGVpZ2h0ICAgICAJNTAwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiIEAxNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI1MCwgMTA0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJbG9jYXRpb24gICAJKDIwNzIsIDk2MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uR3JvdXAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6QXNzZW1ibHlEZXNjcmlwdG9yIiBAMTUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzIyLCA4NDIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTUNCi0JCQlsb2NhdGlvbiAgIAkoMTIxMiwgNzc2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTIyMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQXNzZW1ibHlEZXNjcmlwdG9yIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDQ4NTc2MA0KLQkJICAgIGZpbGxfY29sb3IgCTE0NDcyNjQ5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBENCINCi0JCSAgICB3aWR0aCAgICAgIAkyMzgNCi0JCSAgICBoZWlnaHQgICAgIAkxNTcNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpSZWxhdGlvbnNoaXBzIiBAMTYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMzQsIDE3NDIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTYNCi0JCQlsb2NhdGlvbiAgIAkoMjUzLCAxNjc2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUmVsYXRpb25zaGlwcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkVGODE3MDNCMyINCi0JCSAgICBoZWlnaHQgICAgIAkxNTcNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgY2xpZW50ICAgICAJQDQNCi0JCSAgICBzdXBwbGllciAgIAlAMTYNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNDg0LCAxOTk1KQ0KLQkJCSgzODAsIDE4MjApKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iIEAxOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQwNCwgMTI1OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE4DQotCQkJbG9jYXRpb24gICAJKDExODIsIDEwNzgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDQ0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFbnRlcnByaXNlQmVhbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA0ODU3NjANCi0JCSAgICBmaWxsX2NvbG9yIAkxNDQ3MjY0OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE4DQotCQkJbG9jYXRpb24gICAJKDExODIsIDExMzkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTI1MykNCi0JCSAgICB3aWR0aCAgICAgIAk0NjINCi0JCSAgICBoZWlnaHQgICAgIAkzODYNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE5DQotCQkgICAgbG9jYXRpb24gICAJKDE0MDQsIDE1NDcpDQotCQkgICAgbGluZV9jb2xvciAJMTA0ODU3NjANCi0JCSAgICBmaWxsX2NvbG9yIAkxNDQ3MjY0OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxOA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNDA0LCAxNTQ3KQ0KLQkJCSgxNDA0LCAxNDUyKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDQ4NTc2MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTgwODAwOTUiDQotCQkgICAgY2xpZW50ICAgICAJQDINCi0JCSAgICBzdXBwbGllciAgIAlAMTgNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTg0NywgMTYzNykNCi0JCQkoMTg0NywgMTU0NykpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg0NywgMTYzNykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg0NywgMTU0NykNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxOSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwNDg1NzYwDQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDEyMCINCi0JCSAgICBjbGllbnQgICAgIAlAMQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxOA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMTUzLCAxNjEzKQ0KLQkJCSgxMTUzLCAxNTQ3KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTUzLCAxNjEzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTUzLCAxNTQ3KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE5KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVKQkphciIgQDIyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNjcsIDkzNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCWxvY2F0aW9uICAgCSgxMzAsIDc1MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQkphciIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyDQotCQkJbG9jYXRpb24gICAJKDEzMCwgNzAyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGNvbXBvbmVudD4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDQ4NTc2MA0KLQkJICAgIGZpbGxfY29sb3IgCTE0NDcyNjQ5DQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNTVEMDFFMSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQlsb2NhdGlvbiAgIAkoMTMwLCA4MTMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0MTIpDQotCQkgICAgd2lkdGggICAgICAJNDkyDQotCQkgICAgaGVpZ2h0ICAgICAJNDkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiamFyVG9Bc3NlbWJseURlc2NyaXB0b3IiIEAyMw0KLQkJICAgIGxvY2F0aW9uICAgCSg5MDgsIDgxMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA0ODU3NjANCi0JCSAgICBxdWlkdSAgICAgIAkiMzhGRjNDRjgwMUVFIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImFzc2VtYmx5RGVzY3JpcHRvciIgQDI0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjMNCi0JCQkgICAgbG9jYXRpb24gICAJKDY4NCwgNTcwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1DQotCQkJCVBhcmVudF9WaWV3IAlAMjQNCi0JCQkJbG9jYXRpb24gICAJKDEwMDcsIDc2OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM4Mw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkJCQlwY3REaXN0ICAgIAkwLjMzNTM4NQ0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEZGM0NGOTAyNDkiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5MDgsIDgxMCkNCi0JCQkJKDEyMDMsIDgxMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDgsIDgxMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDMsIDgxMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE0MywgODYzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43OTUxMDcNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVqYkphciIgQDI3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjMNCi0JCQkgICAgbG9jYXRpb24gICAJKDY4NCwgNTcwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4RkYzQ0Y5MDI2NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDIzDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDkwOCwgODEwKQ0KLQkJCQkoNjEzLCA4MTApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTA4LCA4MTApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MTMsIDgxMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOSIgQDI4DQotCQkgICAgbG9jYXRpb24gICAJKDI3OCwgMTQyMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkVGODg3MDM3OCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZWxhdGlvbnNoaXBMaXN0IiBAMjkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU4LCAxMDIyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwDQotCQkJCVBhcmVudF9WaWV3IAlAMjkNCi0JCQkJbG9jYXRpb24gICAJKDQ1MCwgMTU2NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVsYXRpb25zaGlwTGlzdCINCi0JCQkJcGN0RGlzdCAgICAJMC41OTc1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTcyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkVGODg5MDAzQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDI4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3OCwgMTQyMikNCi0JCQkJKDI3OCwgMTY2MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzgsIDE0MjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzgsIDE2NjMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxDQotCQkJCVBhcmVudF9WaWV3IAlAMjkNCi0JCQkJbG9jYXRpb24gICAJKDM0OCwgMTYxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODA1MDMxDQotCQkJCWhlaWdodCAgICAgCTcwDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamJKYXIiIEAzMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTgsIDEwMjIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMg0KLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAxMjUzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTM3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlamJKYXIiDQotCQkJCXBjdERpc3QgICAgCTAuNzA3NjAyDQotCQkJCWhlaWdodCAgICAgCTEwNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJFRjg4OTAwM0QiDQotCQkJICAgIGNsaWVudCAgICAgCUAyOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNzgsIDE0MjIpDQotCQkJCSgyNzgsIDExODIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjc4LCAxNDIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc4LCAxMTgyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNA0KLQkJCQlQYXJlbnRfVmlldyAJQDMyDQotCQkJCWxvY2F0aW9uICAgCSgzMzIsIDEyMDcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJlamJKYXJUb0VudGVycHJpc2VCZWFucyIgQDM1DQotCQkgICAgbG9jYXRpb24gICAJKDg5MywgMTEyMikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA0ODU3NjANCi0JCSAgICBxdWlkdSAgICAgIAkiMzhGRjNEMUYwMDNCIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGVycHJpc2VCZWFucyIgQDM2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUNCi0JCQkgICAgbG9jYXRpb24gICAJKDY2OSwgODgyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3DQotCQkJCVBhcmVudF9WaWV3IAlAMzYNCi0JCQkJbG9jYXRpb24gICAJKDEwMDUsIDExNTkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMzUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGVycHJpc2VCZWFucyINCi0JCQkJcGN0RGlzdCAgICAJMC40MDMyNzkNCi0JCQkJaGVpZ2h0ICAgICAJMzcNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhGRjNEMUYwMzdBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODkzLCAxMTIyKQ0KLQkJCQkoMTE3MywgMTEyMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4OTMsIDExMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTczLCAxMTIyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOA0KLQkJCQlQYXJlbnRfVmlldyAJQDM2DQotCQkJCWxvY2F0aW9uICAgCSgxMDgwLCAxMDg1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC42NjYxMTMNCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVqYkphciIgQDM5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUNCi0JCQkgICAgbG9jYXRpb24gICAJKDY2OSwgODgyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQwDQotCQkJCVBhcmVudF9WaWV3IAlAMzkNCi0JCQkJbG9jYXRpb24gICAJKDY2OSwgMTA4MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEzNw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWpiSmFyIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEZGM0QxRjAzQ0IiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4OTMsIDExMjIpDQotCQkJCSg2MTMsIDExMjIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODkzLCAxMTIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjEzLCAxMTIyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM5DQotCQkJCWxvY2F0aW9uICAgCSg2NDIsIDExNzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBANDINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgY2xpZW50ICAgICAJQDEyDQotCQkgICAgc3VwcGxpZXIgICAJQDQwDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDc5NCwgMTMwMCkNCi0JCQkoNjg0LCAxMTA3KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMzI1MzAyNkYiDQotCQkgICAgY2xpZW50ICAgICAJQDcNCi0JCSAgICBzdXBwbGllciAgIAlAMTgNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjI2OSwgMTYzMCkNCi0JCQkoMjI2OSwgMTUxOSkNCi0JCQkoMTM5NywgMTUxOSkNCi0JCQkoMTM5NywgMTQ1MikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI2OSwgMTYzMCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM5NywgMTQ1MikpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkVudGVycHJpc2UgQmVhbiINCi0JICAgIHF1aWQgICAgICAgCSIzODA1NTMxRDAyQzMiDQotCSAgICB0aXRsZSAgICAgIAkiRW50ZXJwcmlzZSBCZWFuIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFJvbGVzIGFyZSBzaGFyZWQgYnkgbXVsdGlwbGUgRUpCcy4NCi18DQotCSAgICANCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkyMzg4DQotCSAgICBvcmlnaW5feSAgIAk2NTYNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Sk5ESUVudlJlZnNHcm91cCIgQDQ0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0NzgsIDQxOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQ0DQotCQkJbG9jYXRpb24gICAJKDI4MSwgMzM5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSk5ESUVudlJlZnNHcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1Mzk1MDM0OSINCi0JCSAgICB3aWR0aCAgICAgIAk0MTINCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGVSZWYiIEA0NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI4NjgsIDc2NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0NQ0KLQkJCWxvY2F0aW9uICAgCSgyNjQ2LCA2ODApDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQ0NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlSb2xlUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3QTAwMjVDIg0KLQkJICAgIHdpZHRoICAgICAgCTQ2Mg0KLQkJICAgIGhlaWdodCAgICAgCTE5NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEA0Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI4MTcsIDM4OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0Ng0KLQkJCWxvY2F0aW9uICAgCSgyNzAzLCAzMzUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjI4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgd2lkdGggICAgICAJMjQ2DQotCQkgICAgaGVpZ2h0ICAgICAJMTMyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iIEA0Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCA5MjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0Nw0KLQkJCWxvY2F0aW9uICAgCSg3OTEsIDg1MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudGVycHJpc2VCZWFuIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0Nw0KLQkJCWxvY2F0aW9uICAgCSg3OTEsIDkxMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjQ0KQ0KLQkJICAgIHdpZHRoICAgICAgCTMyNA0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiRWpiVG9Sb2xlcyIgQDQ4DQotCQkgICAgbG9jYXRpb24gICAJKDE4NzEsIDg0MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5DQotCQkJUGFyZW50X1ZpZXcgCUA0OA0KLQkJCWxvY2F0aW9uICAgCSgxODY3LCA3NTEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJYW5jaG9yICAgICAJMQ0KLQkJCWFuY2hvcl9sb2MgCTENCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFamJUb1JvbGVzIg0KLQkJCXBjdERpc3QgICAgCTAuNDUwMDAwDQotCQkJaGVpZ2h0ICAgICAJOTENCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxNDQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VjdXJpdHlSb2xlUmVmcyIgQDUwDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDk5MSwgMjk3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxDQotCQkJCVBhcmVudF9WaWV3IAlANTANCi0JCQkJbG9jYXRpb24gICAJKDIzNjcsIDgwMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VjdXJpdHlSb2xlUmVmcyINCi0JCQkJcGN0RGlzdCAgICAJMC42NDg1MjkNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTQ2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTg3MSwgODQxKQ0KLQkJCQkoMjYzNywgODQxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4NzEsIDg0MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDg0MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTINCi0JCQkJUGFyZW50X1ZpZXcgCUA1MA0KLQkJCQlsb2NhdGlvbiAgIAkoMjUzNywgODc4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44NzA2MjkNCi0JCQkJaGVpZ2h0ICAgICAJMzcNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQiIEA1Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4DQotCQkJICAgIGxvY2F0aW9uICAgCSg5OTEsIDI5NykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NA0KLQkJCQlQYXJlbnRfVmlldyAJQDUzDQotCQkJCWxvY2F0aW9uICAgCSgxMjU5LCA4MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTQ1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTg3MSwgODQxKQ0KLQkJCQkoMTEwNiwgODQxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4NzEsIDg0MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMDYsIDg0MSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJlamJDbGFzcyIgQDU1DQotCQkgICAgbG9jYXRpb24gICAJKDE3OTEsIDUzOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2DQotCQkJUGFyZW50X1ZpZXcgCUA1NQ0KLQkJCWxvY2F0aW9uICAgCSgxNzkxLCA0NzkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJYW5jaG9yICAgICAJMQ0KLQkJCWFuY2hvcl9sb2MgCTENCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJlamJDbGFzcyINCi0JCQlwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCWhlaWdodCAgICAgCTYwDQotCQkJb3JpZW50YXRpb24gCTApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDMzQwMkM3Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVqYiIgQDU3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1MjEsIC01NzIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgNCi0JCQkJUGFyZW50X1ZpZXcgCUA1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4MywgNjI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VqYiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDMzUwMUY2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTc5MSwgNTM4KQ0KLQkJCQkoMTA0MSwgNTM4KQ0KLQkJCQkoMTA0MSwgODM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3OTEsIDUzOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDEsIDgzOCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiQ2xhc3MiIEA1OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNTIxLCAtNTcyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwDQotCQkJCVBhcmVudF9WaWV3IAlANTkNCi0JCQkJbG9jYXRpb24gICAJKDI2MzAsIDU4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWpiQ2xhc3MiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4MEZEQzM1MDFFQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDU1DQotCQkJICAgIHN1cHBsaWVyICAgCUA0Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE3OTEsIDUzOCkNCi0JCQkJKDI3NTcsIDUzOCkNCi0JCQkJKDI3NTcsIDQ1NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzkxLCA1MzgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzU3LCA0NTUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxDQotCQkJCVBhcmVudF9WaWV3IAlANTkNCi0JCQkJbG9jYXRpb24gICAJKDI3MzQsIDQ4NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgImhvbWVJbnRlcmZhY2UiIEA2Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTkxLCA2MzQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Mw0KLQkJCVBhcmVudF9WaWV3IAlANjINCi0JCQlsb2NhdGlvbiAgIAkoMTk5MSwgNTc1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiaG9tZUludGVyZmFjZSINCi0JCQlwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCWhlaWdodCAgICAgCTYwDQotCQkJb3JpZW50YXRpb24gCTApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDMzcwMUM3Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVqYiIgQDY0DQotCQkJICAgIFBhcmVudF9WaWV3IAlANjINCi0JCQkgICAgbG9jYXRpb24gICAJKDE3MjEsIC00NzYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjUNCi0JCQkJUGFyZW50X1ZpZXcgCUA2NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTExNiwgNjc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VqYiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDNDQwMTREIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjINCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTk5MSwgNjM0KQ0KLQkJCQkoMTEwMCwgNjM0KQ0KLQkJCQkoMTEwMCwgODM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5OTEsIDYzNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMDAsIDgzOCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaG9tZUludGVyZmFjZSIgQDY2DQotCQkJICAgIFBhcmVudF9WaWV3IAlANjINCi0JCQkgICAgbG9jYXRpb24gICAJKDE3MjEsIC00NzYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjcNCi0JCQkJUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjczMiwgNTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjgzDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitob21lSW50ZXJmYWNlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0ODYxNw0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDNDQwMTQzIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjINCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTk5MSwgNjM0KQ0KLQkJCQkoMjkwNywgNjM0KQ0KLQkJCQkoMjkwNywgNDU1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5OTEsIDYzNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI5MDcsIDQ1NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjgNCi0JCQkJUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjg1NCwgNTY1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAicmVtb3RlSW50ZXJmYWNlIiBANjkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTYxMSwgNDA2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzANCi0JCQlQYXJlbnRfVmlldyAJQDY5DQotCQkJbG9jYXRpb24gICAJKDE2MTEsIDM0NykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlhbmNob3IgICAgIAkxDQotCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJInJlbW90ZUludGVyZmFjZSINCi0JCQlwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCWhlaWdodCAgICAgCTYwDQotCQkJb3JpZW50YXRpb24gCTApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDNDYwMDZBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVqYiIgQDcxDQotCQkJICAgIFBhcmVudF9WaWV3IAlANjkNCi0JCQkgICAgbG9jYXRpb24gICAJKDEzNDEsIC03MDQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzINCi0JCQkJUGFyZW50X1ZpZXcgCUA3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwMiwgNjIxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VqYiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDNDcwMTY3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTYxMSwgNDA2KQ0KLQkJCQkoOTYwLCA0MDYpDQotCQkJCSg5NjAsIDgzOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjExLCA0MDYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjAsIDgzOCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAicmVtb3RlSW50ZXJmYWNlIiBANzMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTM0MSwgLTcwNCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NA0KLQkJCQlQYXJlbnRfVmlldyAJQDczDQotCQkJCWxvY2F0aW9uICAgCSgyNDc2LCA0NDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3JlbW90ZUludGVyZmFjZSINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDNDcwMTY2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTYxMSwgNDA2KQ0KLQkJCQkoMjY5NCwgNDA2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MTEsIDQwNikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2OTQsIDQwNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUNCi0JCQkJUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMjU4NiwgMzUzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAibG9jYWxIb21lSW50ZXJmYWNlIiBANzYNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU1NCwgMjU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzcNCi0JCQlQYXJlbnRfVmlldyAJQDc2DQotCQkJbG9jYXRpb24gICAJKDE1NTQsIDE5NykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlhbmNob3IgICAgIAkxDQotCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJImxvY2FsSG9tZUludGVyZmFjZSINCi0JCQlwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCWhlaWdodCAgICAgCTYwDQotCQkJb3JpZW50YXRpb24gCTApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODZDMkIwMThCIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM0IiBANzgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4NCwgLTg1NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDc4DQotCQkJCWxvY2F0aW9uICAgCSg5NjcsIDU5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODZDMkMwMkQ3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANzYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU1NCwgMjU2KQ0KLQkJCQkoOTI1LCAyNTYpDQotCQkJCSg5MjUsIDgzOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTU0LCAyNTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDgzOCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAibG9jYWxIb21lSW50ZXJmYWNlIiBAODANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4NCwgLTg1NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDgwDQotCQkJCWxvY2F0aW9uICAgCSgyNTIyLCAyOTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNzQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2xvY2FsSG9tZUludGVyZmFjZSINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODZDMkMwMkFGIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU1NCwgMjU2KQ0KLQkJCQkoMjY5OCwgMjU2KQ0KLQkJCQkoMjY5OCwgMzIzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NTQsIDI1NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2OTgsIDMyMykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODINCi0JCQkJUGFyZW50X1ZpZXcgCUA4MA0KLQkJCQlsb2NhdGlvbiAgIAkoMjY0MywgMjAzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAibG9jYWxJbnRlcmZhY2UiIEA4Mw0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjA5LCAxMTMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NA0KLQkJCVBhcmVudF9WaWV3IAlAODMNCi0JCQlsb2NhdGlvbiAgIAkoMTYwOSwgNTQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJYW5jaG9yICAgICAJMQ0KLQkJCWFuY2hvcl9sb2MgCTENCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJsb2NhbEludGVyZmFjZSINCi0JCQlwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCWhlaWdodCAgICAgCTYwDQotCQkJb3JpZW50YXRpb24gCTApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODZDQzIwMjgzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM1IiBAODUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTMzOSwgLTk5NykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDg1DQotCQkJCWxvY2F0aW9uICAgCSg5MzAsIDU0OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODZDQzYwMTIwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTYwOSwgMTEzKQ0KLQkJCQkoODg4LCAxMTMpDQotCQkJCSg4ODgsIDgzOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjA5LCAxMTMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODgsIDgzOCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAibG9jYWxJbnRlcmZhY2UiIEA4Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgzDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMzM5LCAtOTk3KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4DQotCQkJCVBhcmVudF9WaWV3IAlAODcNCi0JCQkJbG9jYXRpb24gICAJKDI3NjYsIDE1NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbG9jYWxJbnRlcmZhY2UiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODg2Q0M2MDBFRSINCi0JCQkgICAgY2xpZW50ICAgICAJQDgzDQotCQkJICAgIHN1cHBsaWVyICAgCUA0Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2MDksIDExMykNCi0JCQkJKDI4NDUsIDExMykNCi0JCQkJKDI4NDUsIDMyMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjA5LCAxMTMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQ1LCAzMjMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5DQotCQkJCVBhcmVudF9WaWV3IAlAODcNCi0JCQkJbG9jYXRpb24gICAJKDI4OTksIDE3OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDU0QzMwMDkwIg0KLQkJICAgIGNsaWVudCAgICAgCUA0Nw0KLQkJICAgIHN1cHBsaWVyICAgCUA0NA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg4NjAsIDgzNykNCi0JCQkoNTYxLCA1MDkpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlJZGVudGl0eSIgQDkxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzI1LCAxMzY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDkxDQotCQkJbG9jYXRpb24gICAJKDE1NDcsIDEyNjIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eUlkZW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDMDQwMjQ1Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA5MQ0KLQkJCWxvY2F0aW9uICAgCSgxNTQ3LCAxMzc3KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzkxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM3NA0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5IiBAOTINCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMyMSwgMTEzOSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMkMxRjAxOEYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAiIEA5Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkyDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTE0LCAtNjcwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk0DQotCQkJCVBhcmVudF9WaWV3IAlAOTMNCi0JCQkJbG9jYXRpb24gICAJKDExMjgsIDEwNzkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzIwMDI2NCINCi0JCQkgICAgY2xpZW50ICAgICAJQDkyDQotCQkJICAgIHN1cHBsaWVyICAgCUA0Nw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMjEsIDExMzkpDQotCQkJCSgxMTA1LCAxMDE4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZWN1cml0eUlkZW50aXR5IiBAOTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTExNCwgLTY3MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDk1DQotCQkJCWxvY2F0aW9uICAgCSgxMjY4LCAxMzQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjk5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZWN1cml0eUlkZW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjIxOTY0NA0KLQkJCQloZWlnaHQgICAgIAkyMDUNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDMjAwMjYzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDkxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMyMSwgMTEzOSkNCi0JCQkJKDE1MzcsIDEyNjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3DQotCQkJCVBhcmVudF9WaWV3IAlAOTUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjYsIDExODUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk1NzA2Mg0KLQkJCQloZWlnaHQgICAgIAk4MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQ29udGFpbmVyIE1hbmFnZWQgRW50aXR5Ig0KLQkgICAgcXVpZCAgICAgICAJIjM4MDU1NTBDMDA4QSINCi0JICAgIHRpdGxlICAgICAgCSJDb250YWluZXIgTWFuYWdlZCBFbnRpdHkiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50Lg0KLXwNCi0JICAgIA0KLQkgICAgem9vbSAgICAgICAJOTUNCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMTE5OA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgTm90ZVZpZXcgQDk4DQotCQkgICAgbG9jYXRpb24gICAJKDIyODgsIDQwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA5OA0KLQkJCWxvY2F0aW9uICAgCSgxOTMyLCAyMTYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk3DQotCQkJbWF4X3dpZHRoICAJNjc3DQotCQkJbGFiZWwgICAgICAJIlRoZSBrZXlGZWF0dXJlcyByZWxhdGlvbnNoaXAgYWxzbyBkZXRlcm1pbmVzIHRoZSBwcmlta2V5LWZpZWxkIHNldHRpbmcuICBJZiB0aGVyZSBpcyBhIHNpbmdsZSBrZXkgZmVhdHVyZSwgd2Ugd2lsbCBkZXBsb3kgdGhhdCB1c2luZyBwcmlta2V5LWZpZWxkLiAgQ29udmVyc2VseSwgaWYgYSBkZXNjcmlwdG9yIHVzZXMgcHJpbWtleS1maWVsZCwgd2Ugd2lsbCBzZXQgYSBzaW5nbGUga2V5RmVhdHVyZS4gICg/IEJNUCBjYXNlID8pIikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAk3MzcNCi0JCSAgICBoZWlnaHQgICAgIAkzODEpDQotCQkob2JqZWN0IE5vdGVWaWV3IEA5OQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDcyLCAxNTY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDk5DQotCQkJbG9jYXRpb24gICAJKDEwNzAsIDEzOTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk3DQotCQkJbWF4X3dpZHRoICAJNzY5DQotCQkJbGFiZWwgICAgICAJIldlIGhhdmUgc3dpdGNoZWQgZnJvbSBleHBsaWNpdGx5IHJlZmVycmluZyBmcm9tIGFuIEVudGl0eSB0byBpdHMgSmF2YSBGaWVsZHMgdG8gZGVyaXZpbmcgdGhhdCBmcm9tIGl0cyBhdHRyaWJ1dGVzIGFuZCBhc3NvY2lhdGlvbiBlbmRzLiAgVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBzdGlsbCBzdXBwb3J0IGxpc3RpbmcgdGhlIGtleSBmaWVsZHMgYW5kIHBlcnNpc3RlbnQgZmllbGRzLCBidXQgbm90IGFkZGluZyBvciByZW1vdmluZyB0aGVtLiIpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJODI5DQotCQkgICAgaGVpZ2h0ICAgICAJMzY5KQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTAwDQotCQkgICAgbG9jYXRpb24gICAJKDYwOCwgMTYwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDANCi0JCQlsb2NhdGlvbiAgIAkoMTg5LCAxNDY1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNg0KLQkJCW1heF93aWR0aCAgCTgwMg0KLQkJCWxhYmVsICAgICAgCSJMZWF2aW5nIHRoZSBrZXlBdHRyaWJ1dGVzIGFuZCBwZXJzaXN0ZW50QXR0cmlidXRlcyByZWxhdGlvbnNoaXBzIHR5cGVkIHRvIGVBdHRyaWJ1dGUgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuICBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0byBiZSB0eXBlZCB0byBDTVBBdHRyaWJ1dGUuIikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAk4NjINCi0JCSAgICBoZWlnaHQgICAgIAkyODMpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAxMDENCi0JCSAgICBsb2NhdGlvbiAgIAkoNDgwLCAxMTUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwMQ0KLQkJCWxvY2F0aW9uICAgCSg2NSwgOTkwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNg0KLQkJCW1heF93aWR0aCAgCTc5NQ0KLQkJCWxhYmVsICAgICAgCQ0KLXxFSkIyLjAgLSANCi18ICBBZGRlZCB2ZXJzaW9uOlN0cmluZw0KLXwgIEFkZGVkIGFic3RyYWN0U2NoZW1hTmFtZTpTdHJpbmcNCi18VE9ETzogT3RoZXIgbmV3IGF0dHJzOg0KLXwgIFNlY3VyaXR5SWRlbnRpdHkNCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgd2lkdGggICAgICAJODU1DQotCQkgICAgaGVpZ2h0ICAgICAJMzM2KQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTAyDQotCQkgICAgbG9jYXRpb24gICAJKDYyNCwgODMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwMg0KLQkJCWxvY2F0aW9uICAgCSg0MjYsIDc0MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkzNjENCi0JCQlsYWJlbCAgICAgIAkiU2VlIGZ1cnRoZXIgZGV0YWlsIGluIEVKQjIuMCAtIFF1ZXJ5IGRpYWdyYW0iKQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHdpZHRoICAgICAgCTQyMQ0KLQkJICAgIGhlaWdodCAgICAgCTE5MSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpRdWVyeSIgQDEwMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgNTc2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwMw0KLQkJCWxvY2F0aW9uICAgCSgzNjcsIDUyNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlF1ZXJ5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjAyNzEwMzI3Ig0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxMDQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGNsaWVudCAgICAgCUAxMDINCi0JCSAgICBzdXBwbGllciAgIAlAMTAzDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDU1OCwgNzM2KQ0KLQkJCSg0OTEsIDYzOSkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVBdHRyaWJ1dGUiIEAxMDUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1ODEsIDIzMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQlsb2NhdGlvbiAgIAkoMTM2OSwgNzcpDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUF0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MjM4NDcyMDM5RCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTA1DQotCQkJbG9jYXRpb24gICAJKDEzNjksIDE5MSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyNzUpDQotCQkgICAgd2lkdGggICAgICAJNDQyDQotCQkgICAgaGVpZ2h0ICAgICAJMzM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6Q01SRmllbGQiIEAxMDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1OTUsIDkyOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDYNCi0JCQlsb2NhdGlvbiAgIAkoMTQ4NSwgODc4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIyMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ01SRmllbGQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjE4MTAwMDRCIg0KLQkJICAgIHdpZHRoICAgICAgCTIzOA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEAxMDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjAwLCAxMjMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNw0KLQkJCWxvY2F0aW9uICAgCSgxNTAzLCAxMTU0KQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxOTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICB3aWR0aCAgICAgIAkyMTINCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NCIgQDEwOA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTk2LCAxMDY2KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5OUFFMEZCMDNEMyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NSIgQDEwOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQsIC0xNjYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwDQotCQkJCVBhcmVudF9WaWV3IAlAMTA5DQotCQkJCWxvY2F0aW9uICAgCSgxNTU0LCAxMDA4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTlBRTBGQzAzQjciDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1OTYsIDEwNjYpDQotCQkJCSgxNTk1LCA5OTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbGxlY3Rpb25UeXBlIiBAMTExDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNCwgLTE2NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTENCi0JCQkJbG9jYXRpb24gICAJKDE0MzIsIDExMTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyOTENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbGxlY3Rpb25UeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU5NzIyNw0KLQkJCQloZWlnaHQgICAgIAkxNjYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk5QUUwRkMwMzhGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTk2LCAxMDY2KQ0KLQkJCQkoMTU5NywgMTE0MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzDQotCQkJCVBhcmVudF9WaWV3IAlAMTExDQotCQkJCWxvY2F0aW9uICAgCSgxNjY4LCAxMTExKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC41OTkzNjANCi0JCQkJaGVpZ2h0ICAgICAJNzENCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEAxMTQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI4NzEsIDcyOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMTQNCi0JCQlsb2NhdGlvbiAgIAkoMjcwNCwgNTk4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDExNA0KLQkJCWxvY2F0aW9uICAgCSgyNzA0LCA3MTIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyODMpDQotCQkgICAgd2lkdGggICAgICAJMzUyDQotCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6Q01QQXR0cmlidXRlIiBAMTE1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTgxLCA2MzApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTE1DQotCQkJbG9jYXRpb24gICAJKDEyOTcsIDUyNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1NjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNNUEF0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMjI4ODYzMDAwMyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTE1DQotCQkJbG9jYXRpb24gICAJKDEyOTcsIDU4NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTU2NSkNCi0JCSAgICB3aWR0aCAgICAgIAk1ODYNCi0JCSAgICBoZWlnaHQgICAgIAkyMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMjI4ODc3MDM0MSINCi0JCSAgICBjbGllbnQgICAgIAlAMTE1DQotCQkgICAgc3VwcGxpZXIgICAJQDEwNQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNTM2LCA1MTQpDQotCQkJKDE1MzYsIDQwMCkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTUzNiwgNTE0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTM2LCA0MDApKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5OUFENDY5MDE3MCINCi0JCSAgICBjbGllbnQgICAgIAlAMTA2DQotCQkgICAgc3VwcGxpZXIgICAJQDExNQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNTYzLCA4NjYpDQotCQkJKDE1NjMsIDc0NSkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU2MywgODY2KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTYzLCA3NDUpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDcxIiBAMTE4DQotCQkgICAgbG9jYXRpb24gICAJKDIyODQsIDY3NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUQxRjAxNjEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMTE5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4DQotCQkJICAgIGxvY2F0aW9uICAgCSg2NzQsIDUxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMA0KLQkJCQlQYXJlbnRfVmlldyAJQDExOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2OSwgNzM0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjk1MTM2DQotCQkJCWhlaWdodCAgICAgCTYwDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxRDIwMDFEQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDExOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTE0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjI4NCwgNjc0KQ0KLQkJCQkoMjY5NSwgNjc0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyODQsIDY3NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2OTUsIDY3NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxDQotCQkJCVBhcmVudF9WaWV3IAlAMTE5DQotCQkJCWxvY2F0aW9uICAgCSgyNTYyLCA2MTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY3NzI3Ng0KLQkJCQloZWlnaHQgICAgIAk2NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzIiIEAxMjINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgNCi0JCQkgICAgbG9jYXRpb24gICAJKDY3NCwgNTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDFEMjAwMUVFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjg0LCA2NzQpDQotCQkJCSgxODc0LCA2NzQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI4NCwgNjc0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg3NCwgNjc0KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIEAxMjMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ0NywgMTc2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyMw0KLQkJCWxvY2F0aW9uICAgCSg3NiwgNzMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNzQyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDb250YWluZXJNYW5hZ2VkRW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTc0Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxMjMNCi0JCQlsb2NhdGlvbiAgIAkoNzYsIDEzMykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTczOSkNCi0JCSAgICB3aWR0aCAgICAgIAk3NjANCi0JCSAgICBoZWlnaHQgICAgIAkyMzANCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxMjQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGNsaWVudCAgICAgCUAxMDENCi0JCSAgICBzdXBwbGllciAgIAlAMTIzDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE3MSwgOTgzKQ0KLQkJCSgxNzEsIDI5MSkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTcxLCA5ODMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3MSwgMjkxKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNyIgQDEyNQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3NTksIDcwOSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4MzFDMzAyNDUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicGVyc2lzdGVudEF0dHJpYnV0ZXMiIEAxMjYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDQwNywgLTQzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNw0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNg0KLQkJCQlsb2NhdGlvbiAgIAkoOTU5LCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3BlcnNpc3RlbnRBdHRyaWJ1dGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjM3ODYwMQ0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4MzFDNTAxNTciDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDc1OSwgNzA5KQ0KLQkJCQkoMTI4OCwgNzA5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc1OSwgNzA5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4OCwgNzA5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjYNCi0JCQkJbG9jYXRpb24gICAJKDEyMzgsIDc0NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTA1MzQwDQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRpdHkiIEAxMjkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDQwNywgLTQzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODMxQzUwMTdGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3NTksIDcwOSkNCi0JCQkJKDY0OCwgNzA5KQ0KLQkJCQkoNjQ4LCAyOTEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzU5LCA3MDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDgsIDI5MSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MCIgQDEzMA0KLQkJICAgIGxvY2F0aW9uICAgCSg5MzksIDUyNykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGQTY5NTg5MDI0MCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwcmltS2V5RmllbGQiIEAxMzENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzANCi0JCQkgICAgbG9jYXRpb24gICAJKDQ5MiwgMzUxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEzMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA5OSwgNDg5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwcmltS2V5RmllbGQiDQotCQkJCXBjdERpc3QgICAgCTAuNDYyMDQ2DQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGQTY5NThCMDAwOCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTE1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTM5LCA1MjcpDQotCQkJCSgxMjg4LCA1MjcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTM5LCA1MjcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg4LCA1MjcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMw0KLQkJCQlQYXJlbnRfVmlldyAJQDEzMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyOCwgNTY3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44MzE2ODMNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGl0eSIgQDEzNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDkyLCAzNTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRkE2OTU4QjAwMTIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzANCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDkzOSwgNTI3KQ0KLQkJCQkoODI1LCA1MjcpDQotCQkJCSg4MjUsIDI5MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzksIDUyNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgyNSwgMjkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4IiBAMTM1DQotCQkgICAgbG9jYXRpb24gICAJKDg0NCwgNjMyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODgzMjNCMDM1NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJrZXlBdHRyaWJ1dGVzIiBAMTM2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1DQotCQkJICAgIGxvY2F0aW9uICAgCSg0OTIsIDQwOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzYNCi0JCQkJbG9jYXRpb24gICAJKDExMDAsIDYwMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIra2V5QXR0cmlidXRlcyINCi0JCQkJcGN0RGlzdCAgICAJMC41NzkwNzANCi0JCQkJaGVpZ2h0ICAgICAJMzENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODMyM0QwMjVFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTM1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4NDQsIDYzMikNCi0JCQkJKDEyODgsIDYzMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDQsIDYzMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyODgsIDYzMikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4DQotCQkJCVBhcmVudF9WaWV3IAlAMTM2DQotCQkJCWxvY2F0aW9uICAgCSgxMjM2LCA2NjMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg4NTk0Mg0KLQkJCQloZWlnaHQgICAgIAkzMQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5IiBAMTM5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1DQotCQkJICAgIGxvY2F0aW9uICAgCSg0OTIsIDQwOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODgzMjNEMDI3QyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTIzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODQ0LCA2MzIpDQotCQkJCSg3NDAsIDYzMikNCi0JCQkJKDc0MCwgMjkxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg0NCwgNjMyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzQwLCAyOTEpKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkFzc2VtYmx5Ig0KLQkgICAgcXVpZCAgICAgICAJIjM3ODBFMjhFMDFCMSINCi0JICAgIHRpdGxlICAgICAgCSJBc3NlbWJseSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxJIGtlcHQgdGhpcyBwb3J0aW9uIG9mIHRoZSBtb2RlbCBzZXBhcmF0ZSB0byByZWZsZWN0IHRoZSBzcGVjLiAgSXQgbWlnaHQgYmUgZWFzaWVyIHRvIHdvcmsgd2l0aCBpZiB3ZSBpbnRlZ3JhdGVkIGl0IG1vcmUgY2xvc2VseSB3aXRoIHRoZSBiZWFucyB3ZSBhcmUgYXNzZW1ibGluZy4gIE9uIHRoZSBvdGhlciBoYW5kLCB0aGlzIHNlcGFyYXRpb24gc3VwcG9ydHMgc3BsaXR0aW5nIHRoZSBjcmVhdGlvbiBhbmQgYXNzZW1ibHkgcm9sZXMuDQotfA0KLXxBbiBhc3NlbWJseSBkZXNjcmlwdG9yIGJhc2ljYWxseSBjb250YWlucyBtZXRob2QgcGVybWlzc2lvbnMgYW5kICJDb250YWluZXIgVHJhbnNhY3Rpb25zIi4gIA0KLXwNCi18SW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgZnVsbCBwb3dlciBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgaW4gdGhlIFhNTCBERCwgd2UgbmVlZCB0byBob2xkIHRoZXNlIG1ldGhvZCBlbGVtZW50cy4gIFRoZSBhY3R1YWwgbWV0aG9kcyB3aWxsIGJlIGRlcml2ZWQuICBLZWVwaW5nIHdpdGggdGhlIG1ldGhvZCBlbGVtZW50LCBhbGwgbWV0aG9kIHdpbGwgYmUgZGVzaWduYXRlZCBieSB0aGUgbmFtZSAiKiIuDQotfA0KLXxUaGUgbWV0aG9kcyByZWxhdGlvbnNoaXAgZnJvbSBNZXRob2RQZXJtaXNzaW9uIGFuZCBNZXRob2RUcmFuc2FjdGlvbiB3aWxsIGJlIGRlcml2ZWQgaW4gaGVscGVyIG1ldGhvZHMuDQotfA0KLXwNCi0JICAgIA0KLQkgICAgem9vbSAgICAgICAJODcNCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMTgzNA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUiIEAxNDANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIxNDcsIDIwMTkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQwDQotCQkJbG9jYXRpb24gICAJKDE4NjYsIDE4MTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDANCi0JCQlsb2NhdGlvbiAgIAkoMTg2NiwgMTc2OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc5RjYzNDUwM0MwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNDANCi0JCQlsb2NhdGlvbiAgIAkoMTg2NiwgMTg4NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNw0KLQkJCW1heF93aWR0aCAgCTI1NikNCi0JCSAgICB3aWR0aCAgICAgIAk1ODANCi0JCSAgICBoZWlnaHQgICAgIAk1MjQNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6Ok1ldGhvZEVsZW1lbnRLaW5kIiBAMTQxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjM5LCAyNDQ1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0MQ0KLQkJCWxvY2F0aW9uICAgCSgxMDAzLCAyMjQ1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kRWxlbWVudEtpbmQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDENCi0JCQlsb2NhdGlvbiAgIAkoMTAwMywgMjE5NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MkVEMkU3MDI0MCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTQxDQotCQkJbG9jYXRpb24gICAJKDEwMDMsIDIzMTApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTcNCi0JCQltYXhfd2lkdGggIAkzMDApDQotCQkgICAgd2lkdGggICAgICAJNDkwDQotCQkgICAgaGVpZ2h0ICAgICAJNTI0DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDE0Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgzNDA3LCA4MDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQyDQotCQkJbG9jYXRpb24gICAJKDMxMTcsIDcyOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk1NDQNCi0JCQlsYWJlbCAgICAgIAkiVGhpcyBpcyB0aGUgY29udGFpbmVyLXRyYW5zYWN0aW9uIGVsZW1lbnQiKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTYwNA0KLQkJICAgIGhlaWdodCAgICAgCTE3MikNCi0JCShvYmplY3QgTm90ZVZpZXcgQDE0Mw0KLQkJICAgIGxvY2F0aW9uICAgCSg1OTQsIDIyNjcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQzDQotCQkJbG9jYXRpb24gICAJKDI0NywgMjE3MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk2NTkNCi0JCQlsYWJlbCAgICAgIAkiTG9jYWwsIExvY2FsSG9tZSBoYXZlIGJlZW4gYWRkZWQgZm9yIEVKQjIuMC4gIFRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlIHZhbGlkIHZhbHVlcyBmb3IgdGhlIG1ldGhvZEludGYgKG1ldGhvZFR5cGUpIGZpZWxkLiIpDQotCQkgICAgbGluZV9jb2xvciAJMTYzODQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHdpZHRoICAgICAgCTcxOQ0KLQkJICAgIGhlaWdodCAgICAgCTIwMSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTQ0DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTE2Mzg0DQotCQkgICAgY2xpZW50ICAgICAJQDE0Mw0KLQkJICAgIHN1cHBsaWVyICAgCUAxNDENCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoOTUzLCAyMzM1KQ0KLQkJCSg5OTQsIDIzMzUpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk1MywgMjMzNSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTk0LCAyMzM1KSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDE0NQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2NzUsIDE5NzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQ1DQotCQkJbG9jYXRpb24gICAJKDQyNSwgMTkxNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0NjQNCi0JCQlsYWJlbCAgICAgIAkiRUpCMi4wIHBmZCAyIGFkZGVkIHVuY2hlY2tlZCBhdHRyaWJ1dGUuIikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgd2lkdGggICAgICAJNTI0DQotCQkgICAgaGVpZ2h0ICAgICAJMTM3KQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMTQ2DQotCQkgICAgbG9jYXRpb24gICAJKDQzMSwgMjYyNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNDYNCi0JCQlsb2NhdGlvbiAgIAkoMTQxLCAyNTAzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTU0NA0KLQkJCWxhYmVsICAgICAgCQ0KLXxAdmVyc2lvbiBKMkVFMS40IA0KLXwNCi18QWRkZWQgU2VydmljZUVuZHBvaW50DQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICB3aWR0aCAgICAgIAk2MDQNCi0JCSAgICBoZWlnaHQgICAgIAkyNTgpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDE0Nw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDE0Ng0KLQkJICAgIHN1cHBsaWVyICAgCUAxNDENCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNzMzLCAyNTU3KQ0KLQkJCSg5OTMsIDI0OTgpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEAxNDgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIwNiwgMjA4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0OA0KLQkJCWxvY2F0aW9uICAgCSgzOCwgNzcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzM2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTQ4DQotCQkJbG9jYXRpb24gICAJKDM4LCAxOTYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkzMDgpDQotCQkgICAgd2lkdGggICAgICAJMzU0DQotCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TWVzc2FnZURlc3RpbmF0aW9uIiBAMTQ5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyOTQ1LCA0MjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQ5DQotCQkJbG9jYXRpb24gICAJKDI3MzksIDMxNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2VEZXN0aW5hdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMTEwMDFDRiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTQ5DQotCQkJbG9jYXRpb24gICAJKDI3MzksIDQzNikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTMxOSkNCi0JCSAgICB3aWR0aCAgICAgIAk0MzANCi0JCSAgICBoZWlnaHQgICAgIAkyMzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGUiIEAxNTANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDI4LCA3ODcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTUwDQotCQkJbG9jYXRpb24gICAJKDg2MCwgNzMzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlSb2xlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzAzMUZFMDEyRCINCi0JCSAgICB3aWR0aCAgICAgIAkzNTQNCi0JCSAgICBoZWlnaHQgICAgIAkxMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiIgQDE1MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDcwLCA3NjcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNTENCi0JCQlsb2NhdGlvbiAgIAkoMTM2MCwgNjkxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTIyMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRW50ZXJwcmlzZUJlYW4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU3MUEwMTBBIg0KLQkJICAgIHdpZHRoICAgICAgCTIzOA0KLQkJICAgIGhlaWdodCAgICAgCTE3Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6Ok1ldGhvZFBlcm1pc3Npb24iIEAxNTINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ2NywgMTEyMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNTINCi0JCQlsb2NhdGlvbiAgIAkoMjU2LCA5OTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDIyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXRob2RQZXJtaXNzaW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNTINCi0JCQlsb2NhdGlvbiAgIAkoMjU2LCAxMDU5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNDY3KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ0MA0KLQkJICAgIGhlaWdodCAgICAgCTI4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxNTMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBjbGllbnQgICAgIAlAMTQ1DQotCQkgICAgc3VwcGxpZXIgICAJQDE1Mg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg1MzUsIDE5MDcpDQotCQkJKDUzNSwgMTI2MikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTM1LCAxOTA3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzUsIDEyNjIpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEAxNTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjQwLCA4NDIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyRUQxODkwMEZDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJvbGVzIiBAMTU1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTU0DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMjAsIDMzMCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTUNCi0JCQkJbG9jYXRpb24gICAJKDc0NSwgODc5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTU5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityb2xlcyINCi0JCQkJcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJMzcNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyRUQxOEEwMjhFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTU0DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNTANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2NDAsIDg0MikNCi0JCQkJKDg1MSwgODQyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0MCwgODQyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODUxLCA4NDIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDE1NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzcwLCA4MDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYyMDY5MA0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNyIgQDE1OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzIwLCAzMzApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU5DQotCQkJCVBhcmVudF9WaWV3IAlAMTU4DQotCQkJCWxvY2F0aW9uICAgCSg1MjgsIDkzOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDE4QTAyRDQiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE1Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY0MCwgODQyKQ0KLQkJCQkoNTY5LCA4NDIpDQotCQkJCSg1NjksIDk4MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDAsIDg0MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU2OSwgOTgyKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc1IiBAMTYwDQotCQkgICAgbG9jYXRpb24gICAJKDY4LCA4MjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDI2QkIwMEZBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDE2MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM5OSwgLTI5NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjINCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjENCi0JCQkJbG9jYXRpb24gICAJKDIxNSwgMzkxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjc5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuOTE3MTg0DQotCQkJCWhlaWdodCAgICAgCTE0Nw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjZCQzAyRjAiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNjANCi0JCQkgICAgc3VwcGxpZXIgICAJQDE0OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY4LCA4MjgpDQotCQkJCSg2OCwgMzUxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY4LCA4MjgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2OCwgMzUxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjENCi0JCQkJbG9jYXRpb24gICAJKDEzNCwgNDQzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDc0NTMNCi0JCQkJaGVpZ2h0ICAgICAJNjYNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc2IiBAMTY0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTYwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzk5LCAtMjk0KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyNkJDMDMxOCINCi0JCQkgICAgY2xpZW50ICAgICAJQDE2MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTUyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjgsIDgyOCkNCi0JCQkJKDY4LCAxMTI3KQ0KLQkJCQkoMjQ3LCAxMTI3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY4LCA4MjgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDcsIDExMjcpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RXhjbHVkZUxpc3QiIEAxNjUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5NDAsIDY1OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjUNCi0JCQlsb2NhdGlvbiAgIAkoMTc0OCwgNTU1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM4NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRXhjbHVkZUxpc3QiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5NzIxNkUwMTQ3Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNjUNCi0JCQlsb2NhdGlvbiAgIAkoMTc0OCwgNjIwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDIzKQ0KLQkJICAgIHdpZHRoICAgICAgCTQwMg0KLQkJICAgIGhlaWdodCAgICAgCTIzMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiIEAxNjYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMyOSwgMTgyNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjYNCi0JCQlsb2NhdGlvbiAgIAkoMTAzNCwgMTU1MSkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTkwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXRob2QiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE2Ng0KLQkJCWxvY2F0aW9uICAgCSgxMDM0LCAxNjcwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJOQ0KLQkJCW1heF93aWR0aCAgCTY0NikNCi0JCSAgICB3aWR0aCAgICAgIAk2MDgNCi0JCSAgICBoZWlnaHQgICAgIAk1NzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJNZXRob2RQZXJtaXNzaW9uVG9NZXRob2RzIiBAMTY3DQotCQkgICAgbG9jYXRpb24gICAJKDYyNCwgMTYxMikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRUEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiL21ldGhvZHMiIEAxNjgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNjcNCi0JCQkgICAgbG9jYXRpb24gICAJKDI5OSwgMTE3MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjgNCi0JCQkJbG9jYXRpb24gICAJKDc2MSwgMTU2OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrL21ldGhvZHMiDQotCQkJCXBjdERpc3QgICAgCTAuMzQyMTA1DQotCQkJCWhlaWdodCAgICAgCTQ1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBFQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE2Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTY2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjI0LCAxNjEyKQ0KLQkJCQkoMTAyNSwgMTYxMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2MjQsIDE2MTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI1LCAxNjEyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzANCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjgNCi0JCQkJbG9jYXRpb24gICAJKDk1MywgMTY3MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTcwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODIyNjgwDQotCQkJCWhlaWdodCAgICAgCTU4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvbWV0aG9kUGVybWlzc2lvbiIgQDE3MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjk5LCAxMTcyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEVDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTY3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2MjQsIDE2MTIpDQotCQkJCSg1NjQsIDE2MTIpDQotCQkJCSg1NjQsIDEyNjIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjI0LCAxNjEyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTY0LCAxMjYyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzINCi0JCQkJUGFyZW50X1ZpZXcgCUAxNzENCi0JCQkJbG9jYXRpb24gICAJKDUyOCwgMTMzMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTcwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODI2OTIzDQotCQkJCWhlaWdodCAgICAgCTM3DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkFzc2VtYmx5RGVzY3JpcHRvciIgQDE3Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTE3MiwgNDE5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE3Mw0KLQkJCWxvY2F0aW9uICAgCSg5NzEsIDM2OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkFzc2VtYmx5RGVzY3JpcHRvciIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBENCINCi0JCSAgICB3aWR0aCAgICAgIAk0MjANCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MCIgQDE3NA0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDU2LCAzODEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDFCRjQwMkU3Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiIEAxNzUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwNDgsIDI1MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNzUNCi0JCQkJbG9jYXRpb24gICAJKDI1MjMsIDMzNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWVzc2FnZURlc3RpbmF0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42OTI3NjINCi0JCQkJaGVpZ2h0ICAgICAJNDUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDFCRjYwMEI5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTc0DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNDkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMDU2LCAzODEpDQotCQkJCSgyNzMwLCAzODEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA1NiwgMzgxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjczMCwgMzgxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNzUNCi0JCQkJbG9jYXRpb24gICAJKDI2NjIsIDQzNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MSIgQDE3OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0OCwgMjUzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQkY2MDBDMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE3NA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTczDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjA1NiwgMzgxKQ0KLQkJCQkoMTM4MiwgMzgxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwNTYsIDM4MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzODIsIDM4MSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDE3OQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCA2MDEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkzRUJGQzUwMEI0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlY3VyaXR5Um9sZXMiIEAxODANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzkNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwOCwgNDczKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE4MA0KLQkJCQlsb2NhdGlvbiAgIAkoOTY5LCA2NzUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNjQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlY3VyaXR5Um9sZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNjE3Mjg0DQotCQkJCWhlaWdodCAgICAgCTE0OA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTNFQkZDNjAwODMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNzkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE1MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMTYsIDYwMSkNCi0JCQkJKDExMTYsIDcyMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE2LCA2MDEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE2LCA3MjEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDE4MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3NSwgNjg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43MDM3MDQNCi0JCQkJaGVpZ2h0ICAgICAJNTkNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0IiBAMTgzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTc5DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDgsIDQ3MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxODMNCi0JCQkJbG9jYXRpb24gICAJKDEwNzUsIDUwNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTNFQkZDNjAwQzAiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNzkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE3Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMTYsIDYwMSkNCi0JCQkJKDExMTYsIDQ4MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE2LCA2MDEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE2LCA0ODIpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiQXNzZW1ibHlEZXNjcmlwdG9yVG9NZXRob2RQZXJtaXNzaW9ucyIgQDE4NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzOTksIDQ1MSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRDEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXNzZW1ibHlEZXNjcmlwdG9yIiBAMTg2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTg1DQotCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg3DQotCQkJCVBhcmVudF9WaWV3IAlAMTg2DQotCQkJCWxvY2F0aW9uICAgCSg2MzIsIDM0OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTUxMg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXNzZW1ibHlEZXNjcmlwdG9yIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQ3MTU2NA0KLQkJCQloZWlnaHQgICAgIAk0NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTM1MDAwRDIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxODUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE3Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM5OSwgNDUxKQ0KLQkJCQkoMzk5LCAzOTEpDQotCQkJCSg5NjIsIDM5MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTksIDQ1MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk2MiwgMzkxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxODYNCi0JCQkJbG9jYXRpb24gICAJKDg5OSwgNDQ1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZFBlcm1pc3Npb25zIiBAMTg5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTg1DQotCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkwDQotCQkJCVBhcmVudF9WaWV3IAlAMTg5DQotCQkJCWxvY2F0aW9uICAgCSgzODgsIDkwNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTUwOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWV0aG9kUGVybWlzc2lvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuODU5MTU1DQotCQkJCWhlaWdodCAgICAgCTEyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBEMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTUyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzk5LCA0NTEpDQotCQkJCSgzOTksIDk4MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTksIDQ1MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM5OSwgOTgyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTENCi0JCQkJUGFyZW50X1ZpZXcgCUAxODkNCi0JCQkJbG9jYXRpb24gICAJKDQ1MywgOTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45Mjk1NzcNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDAiIEAxOTINCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ5OCwgNTg5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5OTcyMUI2MDJGOSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJleGNsdWRlTGlzdCIgQDE5Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDkwLCA0NjEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk0DQotCQkJCVBhcmVudF9WaWV3IAlAMTkzDQotCQkJCWxvY2F0aW9uICAgCSgxNjI2LCA1NDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2V4Y2x1ZGVMaXN0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjUzMDEyMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTk3MjFCNzAyM0MiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0OTgsIDU4OSkNCi0JCQkJKDE3MzksIDU4OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCA1ODkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzM5LCA1ODkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTY4MywgNjI5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NjcwNjgNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQxIiBAMTk2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTkyDQotCQkJICAgIGxvY2F0aW9uICAgCSg0OTAsIDQ2MSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTk3MjFCNzAyNDYiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDE3Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0OTgsIDU4OSkNCi0JCQkJKDEzNjQsIDU4OSkNCi0JCQkJKDEzNjQsIDQ4MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCA1ODkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY0LCA0ODIpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6TWV0aG9kRWxlbWVudCIgQDE5Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI3MCwgMTIyMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxOTcNCi0JCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTA3MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1ldGhvZEVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyRUQyMkQwMDhBIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxOTcNCi0JCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTEzNykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTU2NykNCi0JCSAgICB3aWR0aCAgICAgIAk1NDINCi0JCSAgICBoZWlnaHQgICAgIAkzMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDE5OA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzU2LCA5NTcpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkzN0Q2RkYwMTFEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGVycHJpc2VCZWFuIiBAMTk5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTk4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDY4LCA0ODApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTM3RDcwMDAxNzgiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE1MQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzNTYsIDk1NykNCi0JCQkJKDEzNTYsIDg1NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCA5NTcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU2LCA4NTUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMA0KLQkJCQlQYXJlbnRfVmlldyAJQDE5OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM5NiwgODkxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC42NDg2NDkNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZEVsZW1lbnQiIEAyMDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOTgNCi0JCQkgICAgbG9jYXRpb24gICAJKC00NjgsIDQ4MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MzdENzAwMDIxOCINCi0JCQkgICAgY2xpZW50ICAgICAJQDE5OA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTk3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTM1NiwgOTU3KQ0KLQkJCQkoMTM1NiwgMTA2MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCA5NTcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU2LCAxMDYwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDINCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDENCi0JCQkJbG9jYXRpb24gICAJKDE0MjgsIDEwMjcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5MzMzMw0KLQkJCQloZWlnaHQgICAgIAk3Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBAMjAzDQotCQkgICAgbG9jYXRpb24gICAJKDkzNiwgMjQyOCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDI4ODAwNzciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kRWxlbWVudHMiIEAyMDQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDMNCi0JCQkgICAgbG9jYXRpb24gICAJKDYxNiwgMTkxNikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDUNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDQNCi0JCQkJbG9jYXRpb24gICAJKDExOTEsIDIzODkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0MzMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21ldGhvZEVsZW1lbnRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjE3OTY4OA0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDI4OTAwMUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMDMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5Nw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDkzNiwgMjQyOCkNCi0JCQkJKDEzMTEsIDI0MjgpDQotCQkJCSgxMzExLCAxMzg2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkzNiwgMjQyOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTEsIDEzODYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNg0KLQkJCQlQYXJlbnRfVmlldyAJQDIwNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1NywgMTc1NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzM4NjM2DQotCQkJCWhlaWdodCAgICAgCTQ2DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5IiBAMjA3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjAzDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MTYsIDE5MTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyRUQyODkwMDI4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjAzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5MzYsIDI0MjgpDQotCQkJCSg2ODUsIDI0MjgpDQotCQkJCSg2ODUsIDEyNjIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTM2LCAyNDI4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjg1LCAxMjYyKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQyIiBAMjA4DQotCQkgICAgbG9jYXRpb24gICAJKDE4NTMsIDEwMzcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5NzIyNjUwMUE2Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZEVsZW1lbnRzIiBAMjA5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjA4DQotCQkJICAgIGxvY2F0aW9uICAgCSg3NywgNjY5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMA0KLQkJCQlQYXJlbnRfVmlldyAJQDIwOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2NCwgMTEzOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQzMw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWV0aG9kRWxlbWVudHMiDQotCQkJCXBjdERpc3QgICAgCTAuNDAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5OTcyMjY2MDI4NCINCi0JCQkgICAgY2xpZW50ICAgICAJQDIwOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTk3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTg1MywgMTAzNykNCi0JCQkJKDE4NTMsIDEwOTcpDQotCQkJCSgxNTQxLCAxMDk3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4NTMsIDEwMzcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTQxLCAxMDk3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTENCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDkNCi0JCQkJbG9jYXRpb24gICAJKDE2MzAsIDEwNzMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc2MTcxOQ0KLQkJCQloZWlnaHQgICAgIAkyNQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDMiIEAyMTINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDc3LCA2NjkpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk5NzIyNjYwMjk4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjA4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxODUzLCAxMDM3KQ0KLQkJCQkoMTg1MywgNzc1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4NTMsIDEwMzcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODUzLCA3NzUpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEAyMTMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3ODIsIDE2OTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjEzDQotCQkJbG9jYXRpb24gICAJKDI2MTQsIDE1NjEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzM2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjEzDQotCQkJbG9jYXRpb24gICAJKDI2MTQsIDE2ODApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkzMDkpDQotCQkgICAgd2lkdGggICAgICAJMzU0DQotCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjciIEAyMTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk1MywgMTYyMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjg2MDAyMTgiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMjE1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjE0DQotCQkJICAgIGxvY2F0aW9uICAgCSg2NDksIDQzOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTUNCi0JCQkJbG9jYXRpb24gICAJKDI0NzUsIDE1ODIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDI4NjIwMTUyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjE0DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxOTUzLCAxNjIzKQ0KLQkJCQkoMjYwNSwgMTYyMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTUzLCAxNjIzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwNSwgMTYyMykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE3DQotCQkJCVBhcmVudF9WaWV3IAlAMjE1DQotCQkJCWxvY2F0aW9uICAgCSgyNTQwLCAxNjc3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY4IiBAMjE4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjE0DQotCQkJICAgIGxvY2F0aW9uICAgCSg2NDksIDQzOCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjg2MjAxOTgiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5Nw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5NTMsIDE2MjMpDQotCQkJCSgxODEwLCAxNjIzKQ0KLQkJCQkoMTgxMCwgMTM4MykNCi0JCQkJKDE1NDEsIDEzODMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk1MywgMTYyMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NDEsIDEzODMpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODEiIEAyMTkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg3NCwgNzM3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyNjY4MDMxNyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAyMjANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTkNCi0JCQkgICAgbG9jYXRpb24gICAJKDkzNCwgNzgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIxDQotCQkJCVBhcmVudF9WaWV3IAlAMjIwDQotCQkJCWxvY2F0aW9uICAgCSgzMDE3LCAxNDkzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjc5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuOTMyNDMyDQotCQkJCWhlaWdodCAgICAgCTE0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjY2QTAwRDUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMTkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIxMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI4NzQsIDczNykNCi0JCQkJKDI4NzQsIDE1NDkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjg3NCwgNzM3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg3NCwgMTU0OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIyDQotCQkJCVBhcmVudF9WaWV3IAlAMjIwDQotCQkJCWxvY2F0aW9uICAgCSgyOTI4LCAxNDY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgyIiBAMjIzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjE5DQotCQkJICAgIGxvY2F0aW9uICAgCSg5MzQsIDc4KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyNjZBMDBGMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDIxOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTY1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjg3NCwgNzM3KQ0KLQkJCQkoMjg3NCwgNjU5KQ0KLQkJCQkoMjE0MSwgNjU5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI4NzQsIDczNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNDEsIDY1OSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpNZXRob2RUcmFuc2FjdGlvbiIgQDIyNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc1MiwgMTE1OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQlsb2NhdGlvbiAgIAkoMjMwNSwgMTAzMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk4OTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1ldGhvZFRyYW5zYWN0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMERFIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQlsb2NhdGlvbiAgIAkoMjMwNSwgMTA5NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTk1MikNCi0JCSAgICB3aWR0aCAgICAgIAk5MTINCi0JCSAgICBoZWlnaHQgICAgIAkyODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1IiBAMjI1DQotCQkgICAgbG9jYXRpb24gICAJKDIyOTMsIDE2MTIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEUwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIi9tZXRob2RzIiBAMjI2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjI1DQotCQkJICAgIGxvY2F0aW9uICAgCSg1NDgsIDEyNDMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI3DQotCQkJCVBhcmVudF9WaWV3IAlAMjI2DQotCQkJCWxvY2F0aW9uICAgCSgyMDYwLCAxNTYxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIisvbWV0aG9kcyINCi0JCQkJcGN0RGlzdCAgICAJMC4zNTUyNjMNCi0JCQkJaGVpZ2h0ICAgICAJNTINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEUxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjI1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjkzLCAxNjEyKQ0KLQkJCQkoMTYzMywgMTYxMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjkzLCAxNjEyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMywgMTYxMikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI4DQotCQkJCVBhcmVudF9WaWV3IAlAMjI2DQotCQkJCWxvY2F0aW9uICAgCSgxODA1LCAxNjY2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43Mzg3NzUNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIi90cmFuc2FjdGlvbnMiIEAyMjkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDU0OCwgMTI0MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBFMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDIyNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjI0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjI5MywgMTYxMikNCi0JCQkJKDI2NDAsIDE2MTIpDQotCQkJCSgyNjQwLCAxMjk5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyOTMsIDE2MTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjQwLCAxMjk5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzANCi0JCQkJUGFyZW50X1ZpZXcgCUAyMjkNCi0JCQkJbG9jYXRpb24gICAJKDI1ODcsIDEzOTQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg1ODA4Ng0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMjMxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMTQyDQotCQkgICAgc3VwcGxpZXIgICAJQDIyNA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgzMjQ0LCA4OTQpDQotCQkJKDMwMTAsIDEwMTgpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiQXNzZW1ibHlEZXNjcmlwdG9yVG9NZXRob2RUcmFuc2FjdGlvbnMiIEAyMzINCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMxOCwgNDU2KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBENSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhc3NlbWJseURlc2NyaXB0b3IiIEAyMzMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMzINCi0JCQkgICAgbG9jYXRpb24gICAJKDU3MywgODcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM0DQotCQkJCVBhcmVudF9WaWV3IAlAMjMzDQotCQkJCWxvY2F0aW9uICAgCSgxODE4LCA0MTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1MTINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Fzc2VtYmx5RGVzY3JpcHRvciINCi0JCQkJcGN0RGlzdCAgICAJMC41MzU1MTkNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzNTAwMEQ2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjMyDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNzMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMzE4LCA0NTYpDQotCQkJCSgxMzgyLCA0NTYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjMxOCwgNDU2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM4MiwgNDU2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzUNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMzMNCi0JCQkJbG9jYXRpb24gICAJKDE0NzYsIDUxMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTcwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2RUcmFuc2FjdGlvbnMiIEAyMzYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMzINCi0JCQkgICAgbG9jYXRpb24gICAJKDU3MywgODcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM3DQotCQkJCVBhcmVudF9WaWV3IAlAMjM2DQotCQkJCWxvY2F0aW9uICAgCSgyOTIzLCA5NDcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1MTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21ldGhvZFRyYW5zYWN0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC45MjM2ODQNCi0JCQkJaGVpZ2h0ICAgICAJMjMyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzUwMDBENyINCi0JCQkgICAgY2xpZW50ICAgICAJQDIzMg0KLQkJCSAgICBzdXBwbGllciAgIAlAMjI0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjMxOCwgNDU2KQ0KLQkJCQkoMjY5MSwgNDU2KQ0KLQkJCQkoMjY5MSwgMTAxOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzE4LCA0NTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjkxLCAxMDE5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzgNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMzYNCi0JCQkJbG9jYXRpb24gICAJKDI2MDMsIDk2MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTcwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTM4MzI2DQotCQkJCWhlaWdodCAgICAgCTg5DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwIiBAMjM5DQotCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDEyNjEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyRUQ0MDkwMEQ0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZEVsZW1lbnRzIiBAMjQwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjM5DQotCQkJICAgIGxvY2F0aW9uICAgCSg5NCwgNzgxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNiwgMTIyMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQzMw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWV0aG9kRWxlbWVudHMiDQotCQkJCXBjdERpc3QgICAgCTAuMDM1Mjk0DQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5MkVENDBBMDE4QSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIzOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTk3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTkxOCwgMTI2MSkNCi0JCQkJKDE1NDEsIDEyNjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkxOCwgMTI2MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NDEsIDEyNjEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDI0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTY3MywgMTMxNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNjUzODQ2DQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMSIgQDI0Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIzOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTQsIDc4MSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDQwQTAxOUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMzkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIyNA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5MTgsIDEyNjEpDQotCQkJCSgyMjk2LCAxMjYxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MTgsIDEyNjEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjk2LCAxMjYxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc5IiBAMjQ0DQotCQkgICAgbG9jYXRpb24gICAJKDMxMTksIDE0ODUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDFGMjMwMDkwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDI0NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzc5LCAyOTgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ2DQotCQkJCVBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCWxvY2F0aW9uICAgCSgzMDMxLCAxNDA1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjc5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjc3OTY2DQotCQkJCWhlaWdodCAgICAgCTE0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUYyMzAzRDkiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIxMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDMxMTksIDE0ODUpDQotCQkJCSgzMTE5LCAxNTQ1KQ0KLQkJCQkoMjk1OSwgMTU0NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzMTE5LCAxNDg1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk1OSwgMTU0NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ3DQotCQkJCVBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCWxvY2F0aW9uICAgCSgzMDMxLCAxNjEzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC42NzUyMTQNCi0JCQkJaGVpZ2h0ICAgICAJNjgNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgwIiBAMjQ4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ0DQotCQkJICAgIGxvY2F0aW9uICAgCSg3NzksIDI5OCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUYyNDAwMEYiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIyNA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDMxMTksIDE0ODUpDQotCQkJCSgzMTE5LCAxMjk5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMxMTksIDE0ODUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMTE5LCAxMjk5KSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFSkIgSW1wbGVtZW50YXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiMzgwRkRCN0IwMURBIg0KLQkgICAgdGl0bGUgICAgICAJIkVKQiBJbXBsZW1lbnRhdGlvbiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgc2Vzc2lvbi10eXBlIGVsZW1lbnQgZGVzY3JpYmVzIHdoZXRoZXIgdGhlIHNlc3Npb24gYmVhbiBpcyBhIHN0YXRlZnVsIHNlc3Npb24sIG9yIHN0YXRlbGVzcyBzZXNzaW9uLiINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkxNjMxDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVKQk1ldGhvZENhdGVnb3J5IiBAMjQ5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMDYsIDI2MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNDkNCi0JCQlsb2NhdGlvbiAgIAkoMTkzLCAxODUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjI2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFSkJNZXRob2RDYXRlZ29yeSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4MTBEMDM4MDM0NCINCi0JCSAgICB3aWR0aCAgICAgIAkyNDQNCi0JCSAgICBoZWlnaHQgICAgIAkxNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRpdHkiIEAyNTANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc3MSwgMTc2MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNTANCi0JCQlsb2NhdGlvbiAgIAkoMTY5MCwgMTY4NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNjk3MDM1MSINCi0JCSAgICBoZWlnaHQgICAgIAkxNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFbnRlcnByaXNlQmVhbiIgQDI1MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5ODIsIDExOTQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNTENCi0JCQlsb2NhdGlvbiAgIAkoODI4LCAxMTQ0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMwOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRW50ZXJwcmlzZUJlYW4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTcxQTAxMEEiDQotCQkgICAgd2lkdGggICAgICAJMzI2DQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjUyDQotCQkgICAgbG9jYXRpb24gICAJKDk4MiwgMTQ4MSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMjUxDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDk4MiwgMTQ4MSkNCi0JCQkoOTgyLCAxMjU2KSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTgwODAwOTUiDQotCQkgICAgY2xpZW50ICAgICAJQDI1MA0KLQkJICAgIHN1cHBsaWVyICAgCUAyNTENCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTcxMywgMTY3MykNCi0JCQkoMTcxMywgMTQ4MSkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTcxMywgMTY3MykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcxMywgMTQ4MSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNTIpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDI1NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDM1LCA1NDUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjU0DQotCQkJbG9jYXRpb24gICAJKDg4MSwgMzkwKQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzMDgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjU0DQotCQkJbG9jYXRpb24gICAJKDg4MSwgNTA1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTMzNSkNCi0JCSAgICB3aWR0aCAgICAgIAkzMjYNCi0JCSAgICBoZWlnaHQgICAgIAkzMzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJwcmltYXJ5S2V5IiBAMjU1DQotCQkgICAgbG9jYXRpb24gICAJKDE4MjAsIDc1MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1Ng0KLQkJCVBhcmVudF9WaWV3IAlAMjU1DQotCQkJbG9jYXRpb24gICAJKDE5MzcsIDQxNCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlhbmNob3IgICAgIAkxDQotCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMDQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJInByaW1hcnlLZXkiDQotCQkJcGN0RGlzdCAgICAJMi40NTAwMDANCi0JCQloZWlnaHQgICAgIAkzNDANCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODBGRERERjAwNkIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicHJpbWFyeUtleSIgQDI1Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzY0LCAtNzUxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRERTAwMTE3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjU1DQotCQkJICAgIHN1cHBsaWVyICAgCUAyNTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxODIwLCA3NTMpDQotCQkJCSgxODIwLCA0NTUpDQotCQkJCSgxMTk4LCA0NTUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTgyMCwgNzUzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5OCwgNDU1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNTcNCi0JCQkJbG9jYXRpb24gICAJKDEyOTAsIDQwMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamIiIEAyNTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDM2NCwgLTc1MSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODBGRERFMDAxMjEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI1MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE4MjAsIDc1MykNCi0JCQkJKDE4MjAsIDE2NzMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTgyMCwgNzUzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyMCwgMTY3MykpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJyZW1vdGVJbnRlcmZhY2UiIEAyNjANCi0JCSAgICBsb2NhdGlvbiAgIAkoOTM0LCA5MjEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjENCi0JCQlQYXJlbnRfVmlldyAJQDI2MA0KLQkJCWxvY2F0aW9uICAgCSg5NzQsIDkyMCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlhbmNob3IgICAgIAkxDQotCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJInJlbW90ZUludGVyZmFjZSINCi0JCQlwY3REaXN0ICAgIAkxLjE4MzMzMw0KLQkJCWhlaWdodCAgICAgCTINCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODBGREM0NjAwNkEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicmVtb3RlSW50ZXJmYWNlIiBAMjYyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjYwDQotCQkJICAgIGxvY2F0aW9uICAgCSgzMzUsIDE5MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4MEZEQzQ3MDE2NiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI2MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjU0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTM0LCA5MjEpDQotCQkJCSg5MzQsIDcxMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzQsIDkyMSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkzNCwgNzExKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNjINCi0JCQkJbG9jYXRpb24gICAJKDg4MSwgNzMzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVqYiIgQDI2NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzM1LCAxOTIpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDNDcwMTY3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjYwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyNTENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5MzQsIDkyMSkNCi0JCQkJKDkzNCwgMTEzMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzQsIDkyMSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkzNCwgMTEzMikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJob21lSW50ZXJmYWNlIiBAMjY1DQotCQkgICAgbG9jYXRpb24gICAJKDgxOSwgODY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjY2DQotCQkJUGFyZW50X1ZpZXcgCUAyNjUNCi0JCQlsb2NhdGlvbiAgIAkoODQxLCAxMDEzKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiaG9tZUludGVyZmFjZSINCi0JCQlwY3REaXN0ICAgIAkwLjg4MzMzMw0KLQkJCWhlaWdodCAgICAgCTE0OQ0KLQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4MEZEQzM3MDFDNyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJob21lSW50ZXJmYWNlIiBAMjY3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjY1DQotCQkJICAgIGxvY2F0aW9uICAgCSgyMjcsIDEyOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4MEZEQzQ0MDE0MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDI2NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjU0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODE5LCA4NjQpDQotCQkJCSg4MTksIDgwNCkNCi0JCQkJKDc2NiwgODA0KQ0KLQkJCQkoNzY2LCA2OTkpDQotCQkJCSg4NzIsIDY5OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTksIDg2NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg3MiwgNjk5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjgNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNjcNCi0JCQkJbG9jYXRpb24gICAJKDgzMywgNjY3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44ODE5MTkNCi0JCQkJaGVpZ2h0ICAgICAJMzMNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVqYiIgQDI2OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3LCAxMjgpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDNDQwMTREIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjY1DQotCQkJICAgIHN1cHBsaWVyICAgCUAyNTENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4MTksIDg2NCkNCi0JCQkJKDgxOSwgMTEzMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTksIDg2NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxOSwgMTEzMikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJlamJDbGFzcyIgQDI3MA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTMxLCA5MjEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzENCi0JCQlQYXJlbnRfVmlldyAJQDI3MA0KLQkJCWxvY2F0aW9uICAgCSgxMTI1LCAxMDMxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE1Nw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiZWpiQ2xhc3MiDQotCQkJcGN0RGlzdCAgICAJMC40MDAwMDANCi0JCQloZWlnaHQgICAgIAkxMTANCi0JCQlvcmllbnRhdGlvbiAJMSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODBGREMzNDAyQzciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiQ2xhc3MiIEAyNzINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNzANCi0JCQkgICAgbG9jYXRpb24gICAJKDUzOSwgMTg1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzgwRkRDMzUwMUVDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjcwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyNTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTMxLCA5MjEpDQotCQkJCSgxMTMxLCA3MTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTEzMSwgOTIxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzMSwgNzEyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNzINCi0JCQkJbG9jYXRpb24gICAJKDEwOTEsIDc0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODcwNTUwDQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlamIiIEAyNzQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNzANCi0JCQkgICAgbG9jYXRpb24gICAJKDUzOSwgMTg1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4MEZEQzM1MDFGNiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI3MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjUxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTEzMSwgOTIxKQ0KLQkJCQkoMTEzMSwgMTEzMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTMxLCA5MjEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMxLCAxMTMxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgImxvY2FsSG9tZUludGVyZmFjZSIgQDI3NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDMxLCA5NDEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzYNCi0JCQlQYXJlbnRfVmlldyAJQDI3NQ0KLQkJCWxvY2F0aW9uICAgCSgxMzg1LCA5NzgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkzMjc2OA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlGQUxTRSkNCi0JCQlhbmNob3IgICAgIAkxDQotCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJImxvY2FsSG9tZUludGVyZmFjZSINCi0JCQlwY3REaXN0ICAgIAktMC4yNjY2NjcNCi0JCQloZWlnaHQgICAgIAkzNw0KLQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxNjM4NA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NkMyQjAxOEIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibG9jYWxIb21lSW50ZXJmYWNlIiBAMjc3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjc1DQotCQkJICAgIGxvY2F0aW9uICAgCSg0MzksIC0yNzUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NkMyQzAyQUYiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNzUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI1NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MzEsIDk0MSkNCi0JCQkJKDE0MzEsIDYyNSkNCi0JCQkJKDExOTgsIDYyNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMxLCA5NDEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk4LCA2MjUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3OA0KLQkJCQlQYXJlbnRfVmlldyAJQDI3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI5MCwgNjk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMzI3NjgNCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCUZBTFNFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgzNDc0Ng0KLQkJCQloZWlnaHQgICAgIAk3MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzQiIEAyNzkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNzUNCi0JCQkgICAgbG9jYXRpb24gICAJKDQzOSwgLTI3NSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NkMyQzAyRDciDQotCQkJICAgIGNsaWVudCAgICAgCUAyNzUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI1MQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MzEsIDk0MSkNCi0JCQkJKDE0MzEsIDEyMDQpDQotCQkJCSgxMTQ1LCAxMjA0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MzEsIDk0MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExNDUsIDEyMDQpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAibG9jYWxJbnRlcmZhY2UiIEAyODANCi0JCSAgICBsb2NhdGlvbiAgIAkoNDgxLCA4NzQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODENCi0JCQlQYXJlbnRfVmlldyAJQDI4MA0KLQkJCWxvY2F0aW9uICAgCSg0NTAsIDgzMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTMyNzY4DQotCQkJICAgIGRlZmF1bHRfY29sb3IgCUZBTFNFKQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI0Mw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkibG9jYWxJbnRlcmZhY2UiDQotCQkJcGN0RGlzdCAgICAJLTAuMDE2NjY3DQotCQkJaGVpZ2h0ICAgICAJNDQNCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTYzODQNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODZDQzIwMjgzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImxvY2FsSW50ZXJmYWNlIiBAMjgyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjgwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTExLCAtMzQyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODZDQzYwMEVFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjgwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyNTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0ODEsIDg3NCkNCi0JCQkJKDQ4MSwgNjA2KQ0KLQkJCQkoODcyLCA2MDYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDgxLCA4NzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzIsIDYwNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjgzDQotCQkJCVBhcmVudF9WaWV3IAlAMjgyDQotCQkJCWxvY2F0aW9uICAgCSg3MzYsIDY0OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTMyNzY4DQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlGQUxTRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43OTMzNzUNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM1IiBAMjg0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjgwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTExLCAtMzQyKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODg2Q0M2MDEyMCINCi0JCQkgICAgY2xpZW50ICAgICAJQDI4MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjUxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDgxLCA4NzQpDQotCQkJCSg0ODEsIDExOTQpDQotCQkJCSg4MTksIDExOTQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDgxLCA4NzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTksIDExOTQpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6U2Vzc2lvbiIgQDI4NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjk2LCAxNzYyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI4NQ0KLQkJCWxvY2F0aW9uICAgCSgzNzEsIDE2NjApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZXNzaW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEU1RjkwMUVCIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyODUNCi0JCQlsb2NhdGlvbiAgIAkoMzcxLCAxNzIxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNjcyKQ0KLQkJICAgIHdpZHRoICAgICAgCTY2OA0KLQkJICAgIGhlaWdodCAgICAgCTIyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjg2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc4MEUzMjMwMTIwIg0KLQkJICAgIGNsaWVudCAgICAgCUAyODUNCi0JCSAgICBzdXBwbGllciAgIAlAMjUxDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDcxOSwgMTY0OCkNCi0JCQkoNzE5LCAxNDgxKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDE2NDgpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDcxOSwgMTQ4MSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNTIpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODUiIEAyODcNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTcsIDg2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNTY3Q0EyMDA3RiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2aWNlRW5kcG9pbnQiIEAyODgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODcNCi0JCQkgICAgbG9jYXRpb24gICAJKC02MzAsIC02ODYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg5DQotCQkJCVBhcmVudF9WaWV3IAlAMjg4DQotCQkJCWxvY2F0aW9uICAgCSg3MDEsIDQ3NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMxMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VydmljZUVuZHBvaW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjg0NzgyNg0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTU2N0NBMzAyMjUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyODcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI1NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk3LCA4NjApDQotCQkJCSg5NywgNTE5KQ0KLQkJCQkoODcyLCA1MTkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTcsIDg2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg3MiwgNTE5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTANCi0JCQkJUGFyZW50X1ZpZXcgCUAyODgNCi0JCQkJbG9jYXRpb24gICAJKDc3MSwgNTU3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDk0MjANCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDg2IiBAMjkxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjg3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNjMwLCAtNjg2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1NjdDQTMwMjQzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjg3DQotCQkJICAgIHN1cHBsaWVyICAgCUAyODUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5NywgODYwKQ0KLQkJCQkoOTcsIDE3MTEpDQotCQkJCSgzNjIsIDE3MTEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTcsIDg2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2MiwgMTcxMSkpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRGF0YSBUeXBlcyINCi0JICAgIHF1aWQgICAgICAgCSIzODEwRDY5QzAxRTQiDQotCSAgICB0aXRsZSAgICAgIAkiRGF0YSBUeXBlcyINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OlNlc3Npb25UeXBlIiBAMjkyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDE3NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOTINCi0JCQlsb2NhdGlvbiAgIAkoMTA5LCA5MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlc3Npb25UeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjkyDQotCQkJbG9jYXRpb24gICAJKDEwOSwgNDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDQTA3MDEwQyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjkyDQotCQkJbG9jYXRpb24gICAJKDEwOSwgMTUzKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjMxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM0NA0KLQkJICAgIGhlaWdodCAgICAgCTI5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OlRyYW5zYWN0aW9uVHlwZSIgQDI5Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzA0LCAxOTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjkzDQotCQkJbG9jYXRpb24gICAJKDU0MSwgMTA4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVHJhbnNhY3Rpb25UeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjkzDQotCQkJbG9jYXRpb24gICAJKDU0MSwgNTgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RkNBNDg3MDJFRiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjkzDQotCQkJbG9jYXRpb24gICAJKDU0MSwgMTY5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjMxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM0NA0KLQkJICAgIGhlaWdodCAgICAgCTI5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSIgQDI5NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIxNiwgMjcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI5NA0KLQkJCWxvY2F0aW9uICAgCSg5NzgsIDg4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjk0DQotCQkJbG9jYXRpb24gICAJKDk3OCwgMzgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3OUY2MzQ1MDNDMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjk0DQotCQkJbG9jYXRpb24gICAJKDk3OCwgMTQ5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk3DQotCQkJbWF4X3dpZHRoICAJMzA2KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ5NA0KLQkJICAgIGhlaWdodCAgICAgCTQ5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFSkIyLjEgLSBSZWxhdGlvbnNoaXBzIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkVGOUM0MDM5QyINCi0JICAgIHRpdGxlICAgICAgCSJFSkIyLjEgLSBSZWxhdGlvbnNoaXBzIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTE4NzYNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IExhYmVsIEAyOTUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzEsIDMxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEyDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCVRSVUUNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBubGluZXMgICAgIAkxDQotCQkgICAgbWF4X3dpZHRoICAJNjAwDQotCQkgICAgbGFiZWwgICAgICAJIkVKQiAyLjEgUmVsYXRpb25zaGlwcyIpDQotCQkob2JqZWN0IExhYmVsIEAyOTYNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTAsIDMwNDIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBubGluZXMgICAgIAkzOQ0KLQkJICAgIG1heF93aWR0aCAgCTE5MjUNCi0JCSAgICBsYWJlbCAgICAgIAkNCi18QW4gZW50aXR5IGJlYW4gbWF5IGhhdmUgcmVsYXRpb25zaGlwcyB3aXRoIG90aGVyIGVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlLg0KLXxSZWxhdGlvbnNoaXBzIG1heSBiZSBvbmUtdG8tb25lLCBvbmUtdG8tbWFueSwgb3IgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcHMuDQotfENvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMgY2FuIGV4aXN0IG9ubHkgYW1vbmcgZW50aXR5IGJlYW5zIHdpdGhpbiB0aGUgc2FtZSBsb2NhbCByZWxhdGlvbnNoaXANCi18c2NvcGUsIGFzIGRlZmluZWQgYnkgdGhlIHJlbGF0aW9uc2hpcHMgZWxlbWVudCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBDb250YWluZXIgbWFuYWdlZA0KLXxyZWxhdGlvbnNoaXBzIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIHRoZSBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZSByZWxhdGVkIGJlYW5zLg0KLXwNCi18UmVsYXRpb25zaGlwcyBtYXkgYmUgZWl0aGVyIGJpZGlyZWN0aW9uYWwgb3IgdW5pZGlyZWN0aW9uYWwuIElmIGEgcmVsYXRpb25zaGlwIGlzIGJpZGlyZWN0aW9uYWwsIGl0IGNhbiBiZQ0KLXxuYXZpZ2F0ZWQgaW4gYm90aCBkaXJlY3Rpb25zLCB3aGVyZWFzIGEgdW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGNhbiBiZSBuYXZpZ2F0ZWQgaW4gb25lIGRpcmVjdGlvbg0KLXxvbmx5Lg0KLXwNCi18QSB1bmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAgaXMgaW1wbGVtZW50ZWQgd2l0aCBhIGNtci1maWVsZCBvbiB0aGUgZW50aXR5IGJlYW4gaW5zdGFuY2UgZnJvbSB3aGljaA0KLXxuYXZpZ2F0aW9uIGNhbiB0YWtlIHBsYWNlLCBhbmQgbm8gcmVsYXRlZCBjbXItZmllbGQgb24gdGhlIGVudGl0eSBiZWFuIGluc3RhbmNlIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUNCi18cmVsYXRpb25zaGlwLiBVbmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIGFyZSB0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSBCZWFuIFByb3ZpZGVyIHdpc2hlcyB0byByZXN0cmljdA0KLXx0aGUgdmlzaWJpbGl0eSBvZiBhIHJlbGF0aW9uc2hpcC4NCi18DQotfEFuIGVudGl0eSBiZWFuIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGxvY2FsIGludGVyZmFjZSBjYW4gaGF2ZSBvbmx5IHVuaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgZnJvbSBpdHNlbGYNCi18dG8gb3RoZXIgZW50aXR5IGJlYW5zLiBUaGUgbGFjayBvZiBhIGxvY2FsIGludGVyZmFjZSBwcmV2ZW50cyBvdGhlciBlbnRpdHkgYmVhbnMgZnJvbSBoYXZpbmcgYSByZWxhdGlvbnNoaXANCi18dG8gaXQuDQotfA0KLXxUaGUgYmVhbiBkZXZlbG9wZXIgbmF2aWdhdGVzIG9yIG1hbmlwdWxhdGVzIGxvZ2ljYWwgcmVsYXRpb25zaGlwcyBieSB1c2luZyB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3INCi18bWV0aG9kcyBmb3IgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcCBmaWVsZHMgYW5kIHRoZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiBBUEkgZm9yDQotfGNvbGxlY3Rpb24tdmFsdWVkIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcCBmaWVsZHMuDQotfA0KLXxUaGUgYmVhbiBwcm92aWRlciBtdXN0IGNvbnNpZGVyIHRoZSB0eXBlIGFuZCBjYXJkaW5hbGl0eSBvZiByZWxhdGlvbnNoaXBzIHdoZW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzZXMNCi18YXJlIHByb2dyYW1tZWQuIFRoZSBnZXQgbWV0aG9kIGZvciBhIGNtci1maWVsZCBtdXN0IHJldHVybiBlaXRoZXIgdGhlIGxvY2FsIGludGVyZmFjZSBvZiB0aGUgZW50aXR5IGJlYW4NCi18b3IgYSBjb2xsZWN0aW9uIChtb3JlIHByZWNpc2VseSwgZWl0aGVyIGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQpIG9mIHRoZQ0KLXxzYW1lLiBUaGUgc2V0IG1ldGhvZCBmb3IgdGhlIHJlbGF0aW9uc2hpcCBtdXN0IHRha2UgYXMgYW4gYXJndW1lbnQgdGhlIGVudGl0eSBiZWFuknMgbG9jYWwgaW50ZXJmYWNlIG9yIGENCi18Y29sbGVjdGlvbiBvZiB0aGUgc2FtZS4NCi0JCSAgICApDQotCQkob2JqZWN0IExhYmVsIEAyOTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTAsIDI5NjIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTINCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJVFJVRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIG5saW5lcyAgICAgCTENCi0JCSAgICBtYXhfd2lkdGggIAk2MDANCi0JCSAgICBsYWJlbCAgICAgIAkiUmVnYXJkaW5nIFJlbGF0aW9uc2hpcHMiKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkNNUEF0dHJpYnV0ZSIgQDI5OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODgwLCAyODE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI5OA0KLQkJCWxvY2F0aW9uICAgCSg2MTUsIDI3MTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNTMwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDTVBBdHRyaWJ1dGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTIyODg2MzAwMDMiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDI5OA0KLQkJCWxvY2F0aW9uICAgCSg2MTUsIDI3NzQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1NzIpDQotCQkgICAgd2lkdGggICAgICAJNTQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMjMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6TXVsdGlwbGljaXR5S2luZCIgQDI5OQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjY5MCwgMTUzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOTkNCi0JCQlsb2NhdGlvbiAgIAkoMjUyOCwgMTQ0OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk11bHRpcGxpY2l0eUtpbmQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOTkNCi0JCQlsb2NhdGlvbiAgIAkoMjUyOCwgMTM5OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMyMQ0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5OUFFQkNCMDJCNyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjk5DQotCQkJbG9jYXRpb24gICAJKDI1MjgsIDE1MDkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkxNTkpDQotCQkgICAgd2lkdGggICAgICAJMzQyDQotCQkgICAgaGVpZ2h0ICAgICAJMjkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAzMDANCi0JCSAgICBsb2NhdGlvbiAgIAkoMzMzOSwgMjAxNSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMDANCi0JCQlsb2NhdGlvbiAgIAkoMjU4MywgMTg3MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAkxNDc3DQotCQkJbGFiZWwgICAgICAJIkNDTSAtIFRoaXMgd2FzIG9yaWdpbmFsbHkgbW9kZWxlZCBhcyBhbiBlTXVsdGlwbGljaXR5LCBidXQgaGFzIGJlZW4gc2ltcGxpZmllZCB0byBhIHNwZWNpZmljIHNldCBvZiBlbnVtIHZhbHVlcy4gIFRoZSBlbnVtZXJhdGlvbiB0eXBlIGlzIGRpZmZlcmVudCBmcm9tIGVNdWx0aXBsaWNpdHksIHdoaWNoIGNhcHR1cmVzIG11Y2ggbW9yZSBpbmZvcm1hdGlvbiwgbGlrZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzLiAgSWYgd2UgZmluZCB0aGF0IHRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGNhcHR1cmVkIGJ5IGVNdWx0aXBsaWNpdHkgaXMgcmVxdWlyZWQsIGl0IGNhbiBiZSBhZGRlZCBpbiBhbiBleHRlbnNpb24gdG8gUmVsYXRpb25zaGlwUm9sZS4iKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICB3aWR0aCAgICAgIAkxNTM3DQotCQkgICAgaGVpZ2h0ICAgICAJMzAwKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMzAxDQotCQkgICAgbG9jYXRpb24gICAJKDE5MjQsIDI0MjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzAxDQotCQkJbG9jYXRpb24gICAJKDEzNjcsIDIxNTYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxMA0KLQkJCW1heF93aWR0aCAgCTEwNzgNCi0JCQlsYWJlbCAgICAgIAkNCi18VGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzLiBUaGUgbmFtZSBvZiB0aGUgY21yLWZpZWxkIG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcyB3aG9zZSBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5IGNtci1maWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdCBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuDQotfA0KLXxAaW52YXJpYW50IFRoZSBuYW1lIG9mIHRoZSBjbXItZmllbGQgbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlci4NCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJMTEzOA0KLQkJICAgIGhlaWdodCAgICAgCTU1NikNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMzAyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMzAwDQotCQkgICAgc3VwcGxpZXIgICAJQDI5OQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyNzQ4LCAxODY0KQ0KLQkJCSgyNzQ4LCAxNjc4KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzQ4LCAxODY0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzQ4LCAxNjc4KSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMzAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDE2LCAyNjU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwMw0KLQkJCWxvY2F0aW9uICAgCSgzMjMsIDI1NzcpDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE4Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIHdpZHRoICAgICAgCTIwNA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVKQkphciIgQDMwNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDU0NCwgMjU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwNA0KLQkJCWxvY2F0aW9uICAgCSgzODQsIDIzMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQkphciIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwNA0KLQkJCWxvY2F0aW9uICAgCSgzODQsIDE4MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMxNw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxjb21wb25lbnQ+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDNTVEMDFFMSINCi0JCSAgICB3aWR0aCAgICAgIAkzMzgNCi0JCSAgICBoZWlnaHQgICAgIAkxNzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpDTVJGaWVsZCIgQDMwNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDMyLCAyMzA0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwNQ0KLQkJCWxvY2F0aW9uICAgCSgzMjgsIDIyNTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjA4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDTVJGaWVsZCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYxODEwMDA0QiINCi0JCSAgICB3aWR0aCAgICAgIAkyMjYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMwNg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTlBRDQ2OTAxNzAiDQotCQkgICAgY2xpZW50ICAgICAJQDMwNQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyOTgNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNDg2LCAyMzY2KQ0KLQkJCSg3NzgsIDI3MDApKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDQiIEAzMDcNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDE2LCAyNDY1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5OUFFMEZCMDNEMyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb2xsZWN0aW9uVHlwZSIgQDMwOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMCwgNTkzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMwOA0KLQkJCQlsb2NhdGlvbiAgIAkoMjQ3LCAyNTI5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjkxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb2xsZWN0aW9uVHlwZSINCi0JCQkJcGN0RGlzdCAgICAJMC42NTA4MTMNCi0JCQkJaGVpZ2h0ICAgICAJMTcwDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5OUFFMEZDMDM4RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDMwNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzAzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDE2LCAyNDY1KQ0KLQkJCQkoNDE2LCAyNTY1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQxNiwgMjQ2NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQxNiwgMjU2NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEwDQotCQkJCVBhcmVudF9WaWV3IAlAMzA4DQotCQkJCWxvY2F0aW9uICAgCSg0NzEsIDI1NDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc0NzQ3NQ0KLQkJCQloZWlnaHQgICAgIAk1NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDUiIEAzMTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMDcNCi0JCQkgICAgbG9jYXRpb24gICAJKDAsIDU5MykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTlBRTBGQzAzQjciDQotCQkJICAgIGNsaWVudCAgICAgCUAzMDcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMwNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQxNiwgMjQ2NSkNCi0JCQkJKDQxNiwgMjM2NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0MTYsIDI0NjUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTYsIDIzNjYpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RUpCUmVsYXRpb24iIEAzMTINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDYxNiwgOTkyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxMg0KLQkJCWxvY2F0aW9uICAgCSgzNTEsIDg2NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1MzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQlJlbGF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjBDMDIwM0JGIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzMTINCi0JCQlsb2NhdGlvbiAgIAkoMzUxLCA5MjYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk1NzIpDQotCQkgICAgd2lkdGggICAgICAJNTQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMjc4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6UmVsYXRpb25zaGlwcyIgQDMxMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTI4LCA1NzcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzEzDQotCQkJbG9jYXRpb24gICAJKDI2MywgNDk5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUmVsYXRpb25zaGlwcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkVGODE3MDNCMyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzEzDQotCQkJbG9jYXRpb24gICAJKDI2MywgNTYwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNTcyKQ0KLQkJICAgIHdpZHRoICAgICAgCTU0OA0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMzE0DQotCQkgICAgbG9jYXRpb24gICAJKDU1MCwgNDEzKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJFRjg4NzAzNzgiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiSmFyIiBAMzE1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzE0DQotCQkJICAgIGxvY2F0aW9uICAgCSg1NCwgMTA5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxNg0KLQkJCQlQYXJlbnRfVmlldyAJQDMxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjUzLCAzNjkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMzcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VqYkphciINCi0JCQkJcGN0RGlzdCAgICAJMC42MDgxMDgNCi0JCQkJaGVpZ2h0ICAgICAJMTAzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkVGODg5MDAzRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDMxNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMzA0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTUwLCA0MTMpDQotCQkJCSg1NTAsIDM0MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1NTAsIDQxMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU1MCwgMzQwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTcNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMTUNCi0JCQkJbG9jYXRpb24gICAJKDQ5MywgMzY0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC42NzU2NzYNCi0JCQkJaGVpZ2h0ICAgICAJNTgNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlbGF0aW9uc2hpcExpc3QiIEAzMTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDU0LCAxMDkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE5DQotCQkJCVBhcmVudF9WaWV3IAlAMzE4DQotCQkJCWxvY2F0aW9uICAgCSg3MjUsIDQ1OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVsYXRpb25zaGlwTGlzdCINCi0JCQkJcGN0RGlzdCAgICAJMC42MzczNjMNCi0JCQkJaGVpZ2h0ICAgICAJMTc1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkVGODg5MDAzQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDMxNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMzEzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTUwLCA0MTMpDQotCQkJCSg1NTAsIDQ4NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1NTAsIDQxMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU1MCwgNDg3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjANCi0JCQkJUGFyZW50X1ZpZXcgCUAzMTgNCi0JCQkJbG9jYXRpb24gICAJKDQ4NywgNDYzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42NzAzMzANCi0JCQkJaGVpZ2h0ICAgICAJNjQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAzMjENCi0JCSAgICBsb2NhdGlvbiAgIAkoNjQxLCA3NTkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEM0MDAxNDciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWpiUmVsYXRpb25zIiBAMzIyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzIxDQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzMsIDUwMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMjINCi0JCQkJbG9jYXRpb24gICAJKDQ5MiwgNzkzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlamJSZWxhdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuMzc5MzEwDQotCQkJCWhlaWdodCAgICAgCTE1MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEM0MTAwMUMiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMjENCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY0MSwgNzU5KQ0KLQkJCQkoNjQxLCA4NTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjQxLCA3NTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDEsIDg1MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI0DQotCQkJCVBhcmVudF9WaWV3IAlAMzIyDQotCQkJCWxvY2F0aW9uICAgCSg2OTcsIDgwNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU2DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZWxhdGlvbnNoaXBMaXN0IiBAMzI1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzIxDQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzMsIDUwMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjYNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMjUNCi0JCQkJbG9jYXRpb24gICAJKDg0MCwgNzAxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzA0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityZWxhdGlvbnNoaXBMaXN0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjYyMjIyMg0KLQkJCQloZWlnaHQgICAgIAkxOTkNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjBDNDEwMDFEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzIxDQotCQkJICAgIHN1cHBsaWVyICAgCUAzMTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2NDEsIDc1OSkNCi0JCQkJKDY0MSwgNjY2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0MSwgNzU5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQxLCA2NjYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyNw0KLQkJCQlQYXJlbnRfVmlldyAJQDMyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTY4LCA2OTQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcxMTExMQ0KLQkJCQloZWlnaHQgICAgIAk3NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpFSkJSZWxhdGlvbnNoaXBSb2xlIiBAMzI4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MzcsIDE1NjkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzI4DQotCQkJbG9jYXRpb24gICAJKDI3MiwgMTQyMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQlJlbGF0aW9uc2hpcFJvbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMEREMDAyM0QiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMyOA0KLQkJCWxvY2F0aW9uICAgCSgyNzIsIDE0ODEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAk1NzIpDQotCQkgICAgd2lkdGggICAgICAJNTQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMzIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUiIEAzMjkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAxLCAxOTEwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjFCQkQwMkVEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIi9vcHBvc2l0ZSIgQDMzMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQxMSwgNzc0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMzMA0KLQkJCQlsb2NhdGlvbiAgIAkoNDkzLCAxNzg1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTg4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIisvb3Bwb3NpdGUiDQotCQkJCXBjdERpc3QgICAgCTAuOTA1MTkyDQotCQkJCWhlaWdodCAgICAgCTEyNA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMUJDMDAzOUMiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwMSwgMTkxMCkNCi0JCQkJKDEwMSwgMTk3MCkNCi0JCQkJKDM2OSwgMTk3MCkNCi0JCQkJKDM2OSwgMTczMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDEsIDE5MTApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjksIDE3MzApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2IiBAMzMyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzI5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDExLCA3NzQpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjFCQzAwM0E2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzI5DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDEsIDE5MTApDQotCQkJCSgxMDEsIDE1OTApDQotCQkJCSgyNjMsIDE1OTApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAxLCAxOTEwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzLCAxNTkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0IiBAMzMzDQotCQkgICAgbG9jYXRpb24gICAJKDUwMCwgMTk4NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYxODIwMDFDMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjbXJGaWVsZCIgQDMzNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyLCA4NTApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM1DQotCQkJCVBhcmVudF9WaWV3IAlAMzM0DQotCQkJCWxvY2F0aW9uICAgCSgzODMsIDIxOTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NtckZpZWxkIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwOTUyNA0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjE4MjEwMEQyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzMzDQotCQkJICAgIHN1cHBsaWVyICAgCUAzMDUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1MDAsIDE5ODYpDQotCQkJCSg1MDAsIDIyNDIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTAwLCAxOTg2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTAwLCAyMjQyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzYNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMzQNCi0JCQkJbG9jYXRpb24gICAJKDUzOSwgMjE3OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzUyMjk0DQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyb2xlIiBAMzM3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzMzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTIsIDg1MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzgNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMzcNCi0JCQkJbG9jYXRpb24gICAJKDU3MiwgMTc4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEwNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcm9sZSINCi0JCQkJcGN0RGlzdCAgICAJMC44MDU3MTQNCi0JCQkJaGVpZ2h0ICAgICAJNzINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjE4MjEwMERDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzMzDQotCQkJICAgIHN1cHBsaWVyICAgCUAzMjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1MDAsIDE5ODYpDQotCQkJCSg1MDAsIDE3MzApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTAwLCAxOTg2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTAwLCAxNzMwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyIiBAMzM5DQotCQkgICAgbG9jYXRpb24gICAJKDY0NywgMTI2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYwREUzMDEzNiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZWxhdGlvbnNoaXBSb2xlcyIgQDM0MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxLCA1NjQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQxDQotCQkJCVBhcmVudF9WaWV3IAlAMzQwDQotCQkJCWxvY2F0aW9uICAgCSg0NjAsIDEzNjMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3JlbGF0aW9uc2hpcFJvbGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY4NTE4NQ0KLQkJCQloZWlnaHQgICAgIAkxODgNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjBERTMwM0Q1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzM5DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2NDcsIDEyNjgpDQotCQkJCSg2NDcsIDE0MDcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjQ3LCAxMjY4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ3LCAxNDA3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDINCi0JCQkJUGFyZW50X1ZpZXcgCUAzNDANCi0JCQkJbG9jYXRpb24gICAJKDY4NCwgMTM3NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjIiDQotCQkJCXBjdERpc3QgICAgCTAuNzYxOTA1DQotCQkJCWhlaWdodCAgICAgCTM3DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZWxhdGlvbnNoaXAiIEAzNDMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMzkNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1MSwgNTY0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0NA0KLQkJCQlQYXJlbnRfVmlldyAJQDM0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNDk0LCAxMTkwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjM2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityZWxhdGlvbnNoaXAiDQotCQkJCXBjdERpc3QgICAgCTAuNTc1MzQyDQotCQkJCWhlaWdodCAgICAgCTE1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMERFMzAzRDYiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMzkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY0NywgMTI2OCkNCi0JCQkJKDY0NywgMTEzMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDcsIDEyNjgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDcsIDExMzApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNjg2LCAxMTcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC42OTg2MzANCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEAzNDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1OTYsIDQ3MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNDYNCi0JCQlsb2NhdGlvbiAgIAkoMTQ2OCwgMzQyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDM0Ng0KLQkJCWxvY2F0aW9uICAgCSgxNDY4LCA0NTcpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyODUpDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjUiIEAzNDcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA0MiwgNjEzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQxRkNCMDFBQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAzNDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNDcNCi0JCQkgICAgbG9jYXRpb24gICAJKDUzMSwgLTM3OSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDkNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNDgNCi0JCQkJbG9jYXRpb24gICAJKDEzMTAsIDU5NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY0NTYyMQ0KLQkJCQloZWlnaHQgICAgIAkxNw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUZDQzAwQzUiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNDcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDM0Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwNDIsIDYxMykNCi0JCQkJKDE0NTksIDYxMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQyLCA2MTMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU5LCA2MTMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1MA0KLQkJCQlQYXJlbnRfVmlldyAJQDM0OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2NiwgNjU0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43NzU5NjcNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY2IiBAMzUxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ3DQotCQkJICAgIGxvY2F0aW9uICAgCSg1MzEsIC0zNzkpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDFGQ0MwMEUzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzQ3DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDQyLCA2MTMpDQotCQkJCSg4NjUsIDYxMykNCi0JCQkJKDg2NSwgODUzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNDIsIDYxMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg2NSwgODUzKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDczIiBAMzUyDQotCQkgICAgbG9jYXRpb24gICAJKDExMzAsIDUwNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUZCRjAxQ0IiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMzUzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUyDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MDIsIC03MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNTMNCi0JCQkJbG9jYXRpb24gICAJKDEyOTksIDQ2MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUxMjkwMw0KLQkJCQloZWlnaHQgICAgIAk0NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUZDMTAwMUYiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDM0Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMzAsIDUwNikNCi0JCQkJKDE0NTksIDUwNikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTMwLCA1MDYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU5LCA1MDYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTM0NCwgNTQyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC42NTQ4MzkNCi0JCQkJaGVpZ2h0ICAgICAJMzYNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc0IiBAMzU2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUyDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MDIsIC03MCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUZDMTAwNDciDQotCQkJICAgIGNsaWVudCAgICAgCUAzNTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMzAsIDUwNikNCi0JCQkJKDgwMiwgNTA2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExMzAsIDUwNikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgwMiwgNTA2KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc3IiBAMzU3DQotCQkgICAgbG9jYXRpb24gICAJKDEyODUsIDExNjkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDIwQzEwMkM2Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDM1OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ4LCAtNDAwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM1OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwOSwgNzI0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuODYxNTk2DQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjBDNDAwQ0MiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDM0Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyODUsIDExNjkpDQotCQkJCSgxNTMzLCAxMTY5KQ0KLQkJCQkoMTUzMywgNjEyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyODUsIDExNjkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTMzLCA2MTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2MA0KLQkJCQlQYXJlbnRfVmlldyAJQDM1OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4MSwgNjc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MjE0NDYNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc4IiBAMzYxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzU3DQotCQkJICAgIGxvY2F0aW9uICAgCSg3NDgsIC00MDApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDIwQzQwMEVBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzU3DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjg1LCAxMTY5KQ0KLQkJCQkoNzE5LCAxMTY5KQ0KLQkJCQkoNzE5LCAxNDA4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyODUsIDExNjkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MTksIDE0MDgpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgQDM2Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMyMSwgMTEzOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNjINCi0JCQlsb2NhdGlvbiAgIAkoMTk0OSwgMTAzNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk3NDQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxNzQiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDM2Mg0KLQkJCWxvY2F0aW9uICAgCSgxOTQ5LCAxMDk3KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNzc5KQ0KLQkJICAgIHdpZHRoICAgICAgCTc2Mg0KLQkJICAgIGhlaWdodCAgICAgCTIyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM4IiBAMzYzDQotCQkgICAgbG9jYXRpb24gICAJKDEyOTAsIDEyMzMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODg2RjUwM0JEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIi9yb2xlcyIgQDM2NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM2Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTk2NiwgLTE0MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjUNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNjQNCi0JCQkJbG9jYXRpb24gICAJKDg4MiwgMTM2MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrL3JvbGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5Mjg1Nw0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4ODZGNjAyRDgiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNjMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyOTAsIDEyMzMpDQotCQkJCSgxMDc5LCAxMjMzKQ0KLQkJCQkoMTA3OSwgMTQwMykNCi0JCQkJKDgxMSwgMTQwMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjkwLCAxMjMzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODExLCAxNDAzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjYNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNjQNCi0JCQkJbG9jYXRpb24gICAJKDg3NSwgMTQ0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwNzk0DQotCQkJCWhlaWdodCAgICAgCTM3DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzOSIgQDM2Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM2Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTk2NiwgLTE0MykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4ODZGNjAyRTIiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNjMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDM2Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyOTAsIDEyMzMpDQotCQkJCSgxOTQwLCAxMjMzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyOTAsIDEyMzMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTQwLCAxMjMzKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OlJvbGVTb3VyY2UiIEAzNjgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0NTYsIDE4MDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzY4DQotCQkJbG9jYXRpb24gICAJKDEyNzgsIDE3MDUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSb2xlU291cmNlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjE0NzUwMEU0Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzNjgNCi0JCQlsb2NhdGlvbiAgIAkoMTI3OCwgMTc2NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM5MSkNCi0JCSAgICB3aWR0aCAgICAgIAkzNzQNCi0JCSAgICBoZWlnaHQgICAgIAkyMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMyIgQDM2OQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDQwLCAxNzE3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjE0RUEwMkZGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNvdXJjZSIgQDM3MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTI4LCA1ODEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcxDQotCQkJCVBhcmVudF9WaWV3IAlAMzcwDQotCQkJCWxvY2F0aW9uICAgCSgxMTkxLCAxNjYzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzb3VyY2UiDQotCQkJCXBjdERpc3QgICAgCTAuNjU5Mzg5DQotCQkJCWhlaWdodCAgICAgCTU1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYxNEVDMDA1OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDM2OQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzY4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTA0MCwgMTcxNykNCi0JCQkJKDEyNjksIDE3MTcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA0MCwgMTcxNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjksIDE3MTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDM3MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI0NSwgMTc3MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyb2xlIiBAMzczDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzY5DQotCQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDU4MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzQNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNzMNCi0JCQkJbG9jYXRpb24gICAJKDg4OCwgMTY2MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEwNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcm9sZSINCi0JCQkJcGN0RGlzdCAgICAJMC42NjM3NTUNCi0JCQkJaGVpZ2h0ICAgICAJNTcNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjE0RUMwMDVBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzY5DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDQwLCAxNzE3KQ0KLQkJCQkoODExLCAxNzE3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNDAsIDE3MTcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTEsIDE3MTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoODM1LCAxNzcxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjkiIEAzNzYNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTY0NCwgMTE1MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjEwMzAwQ0QiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMzc3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzc2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxODgsIC02NTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzc4DQotCQkJCVBhcmVudF9WaWV3IAlAMzc3DQotCQkJCWxvY2F0aW9uICAgCSgxNzk3LCA3MjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC43OTA2NTcNCi0JCQkJaGVpZ2h0ICAgICAJMTUzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyMTA1MDJFQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDM3Ng0KLQkJCSAgICBzdXBwbGllciAgIAlAMzQ2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTY0NCwgMTE1MikNCi0JCQkJKDE2NDQsIDYxMikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQ0LCAxMTUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY0NCwgNjEyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzkNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNzcNCi0JCQkJbG9jYXRpb24gICAJKDE2OTgsIDY2NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MCIgQDM4MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM3Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTg4LCAtNjU2KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyMTA1MDMwQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDM3Ng0KLQkJCSAgICBzdXBwbGllciAgIAlAMzY4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTY0NCwgMTE1MikNCi0JCQkJKDE2NDQsIDE2OTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY0NCwgMTE1MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NDQsIDE2OTMpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzYiIEAzODENCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk0MiwgMTY1MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4ODRDMjAzNkUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5QmVhbiIgQDM4Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzEwLCAyNjApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgzDQotCQkJCVBhcmVudF9WaWV3IAlAMzgyDQotCQkJCWxvY2F0aW9uICAgCSgxOTY0LCAxOTE3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjI4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbnRpdHlCZWFuIg0KLQkJCQlwY3REaXN0ICAgIAktMC42NjQ2MzQNCi0JCQkJaGVpZ2h0ICAgICAJMjINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4ODg0QzMwMjdGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzgxDQotCQkJICAgIHN1cHBsaWVyICAgCUAzNjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxOTQyLCAxNjUyKQ0KLQkJCQkoMTk0MiwgMTI1MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTQyLCAxNjUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0MiwgMTI1MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzg0DQotCQkJCVBhcmVudF9WaWV3IAlAMzgyDQotCQkJCWxvY2F0aW9uICAgCSgxOTk2LCAxMjkzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM3IiBAMzg1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzgxDQotCQkJICAgIGxvY2F0aW9uICAgCSg3MTAsIDI2MCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg4ODRDMzAyODkiDQotCQkJICAgIGNsaWVudCAgICAgCUAzODENCi0JCQkgICAgc3VwcGxpZXIgICAJQDM2OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5NDIsIDE2NTIpDQotCQkJCSgxOTQyLCAxNzU0KQ0KLQkJCQkoMTY0MywgMTc1NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTQyLCAxNjUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY0MywgMTc1NCkpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRUpCMi4xIC0gUXVlcnkiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRjI0MUUwMTkzIg0KLQkgICAgdGl0bGUgICAgICAJIkVKQjIuMSAtIFF1ZXJ5Ig0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTMzOA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpSZXR1cm5UeXBlTWFwcGluZyIgQDM4Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzY4LCAxODkxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM4Ng0KLQkJCWxvY2F0aW9uICAgCSgxNjgsIDE4MDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDAwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZXR1cm5UeXBlTWFwcGluZyIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM4Ng0KLQkJCWxvY2F0aW9uICAgCSgxNjgsIDE3NTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTYzODQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4NzBEMzAyNzYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDM4Ng0KLQkJCWxvY2F0aW9uICAgCSgxNjgsIDE4NjgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyMDApDQotCQkgICAgd2lkdGggICAgICAJNDE4DQotCQkgICAgaGVpZ2h0ICAgICAJMjkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IExhYmVsIEAzODcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk5LCA1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxNA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlUUlVFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJICAgIG1heF93aWR0aCAgCTYwMA0KLQkJICAgIGxhYmVsICAgICAgCSJFSkIyLjEgUXVlcnkiKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6Ok1ldGhvZEVsZW1lbnQiIEAzODgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3NTQsIDEwNjMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzg4DQotCQkJbG9jYXRpb24gICAJKDE1MDUsIDkxNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0OTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1ldGhvZEVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTJFRDIyRDAwOEEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDM4OA0KLQkJCWxvY2F0aW9uICAgCSgxNTA1LCA5NzUpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAk1MzIpDQotCQkgICAgd2lkdGggICAgICAJNTE2DQotCQkgICAgaGVpZ2h0ICAgICAJMzIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RW50ZXJwcmlzZUJlYW4iIEAzODkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMwNzIsIDk4MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM4OQ0KLQkJCWxvY2F0aW9uICAgCSgyODU4LCA4MDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDI4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFbnRlcnByaXNlQmVhbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzg5DQotCQkJbG9jYXRpb24gICAJKDI4NTgsIDg2MykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzAzKQ0KLQkJICAgIHdpZHRoICAgICAgCTQ0Ng0KLQkJICAgIGhlaWdodCAgICAgCTM4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyIiBAMzkwDQotCQkgICAgbG9jYXRpb24gICAJKDI0NDYsIDk0NSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTM3RDZGRjAxMUQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kRWxlbWVudCIgQDM5MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE2NCwgNDY1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDM5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE5OCwgOTMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzIyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittZXRob2RFbGVtZW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjYwMDk5OA0KLQkJCQloZWlnaHQgICAgIAk0Nw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTM3RDcwMDAyMTgiDQotCQkJICAgIGNsaWVudCAgICAgCUAzOTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDM4OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI0NDYsIDk0NSkNCi0JCQkJKDI0NDYsIDk3OCkNCi0JCQkJKDIwMTIsIDk3OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDQ2LCA5NDUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDEyLCA5NzgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDM5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MywgMTAyOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODUwMzc0DQotCQkJCWhlaWdodCAgICAgCTUxDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRlcnByaXNlQmVhbiIgQDM5NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE2NCwgNDY1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMjY3MywgODY2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjk5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbnRlcnByaXNlQmVhbiINCi0JCQkJcGN0RGlzdCAgICAJMC41OTk1MDMNCi0JCQkJaGVpZ2h0ICAgICAJNDcNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkzN0Q3MDAwMTc4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzkwDQotCQkJICAgIHN1cHBsaWVyICAgCUAzODkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNDQ2LCA5NDUpDQotCQkJCSgyNDQ2LCA5MTIpDQotCQkJCSgyODQ5LCA5MTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjQ0NiwgOTQ1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg0OSwgOTEyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAzOTQNCi0JCQkJbG9jYXRpb24gICAJKDI4MDQsIDk2NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVudGl0eSIgQDM5Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU5MSwgMzYxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM5Nw0KLQkJCWxvY2F0aW9uICAgCSgxNDA4LCAyNTgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzY2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTY5NzAzNTEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDM5Nw0KLQkJCWxvY2F0aW9uICAgCSgxNDA4LCAzMTkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzODgpDQotCQkgICAgd2lkdGggICAgICAJMzg0DQotCQkgICAgaGVpZ2h0ICAgICAJMjMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTgwODAwOTUiDQotCQkgICAgY2xpZW50ICAgICAJQDM5Nw0KLQkJICAgIHN1cHBsaWVyICAgCUAzODkNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTc4MywgNDQwKQ0KLQkJCSgyODQ4LCA4ODkpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6UXVlcnlNZXRob2QiIEAzOTkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5ODQsIDE0ODEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzk5DQotCQkJbG9jYXRpb24gICAJKDE4OTYsIDE0MDUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTc2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJRdWVyeU1ldGhvZCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTlBQ0Q5QzAyREYiDQotCQkgICAgd2lkdGggICAgICAJMTk0DQotCQkgICAgaGVpZ2h0ICAgICAJMTc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk5QUQyMzgwMkE5Ig0KLQkJICAgIGNsaWVudCAgICAgCUAzOTkNCi0JCSAgICBzdXBwbGllciAgIAlAMzg4DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE5NTMsIDEzOTIpDQotCQkJKDE5NTMsIDEyMjQpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NTMsIDEzOTIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTMsIDEyMjQpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIiBANDAxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTgsIDIwMzcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDAxDQotCQkJbG9jYXRpb24gICAJKDc5MCwgMTkwNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0MDENCi0JCQlsb2NhdGlvbiAgIAkoNzkwLCAyMDIyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjg1KQ0KLQkJICAgIHdpZHRoICAgICAgCTI3NA0KLQkJICAgIGhlaWdodCAgICAgCTI4NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIEA0MDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDY2MCwgMzk3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQwMg0KLQkJCWxvY2F0aW9uICAgCSgyODgsIDI3MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk3NDQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzgwRTMyMzAxNzQiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQwMg0KLQkJCWxvY2F0aW9uICAgCSgyODgsIDMzMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTc3OSkNCi0JCSAgICB3aWR0aCAgICAgIAk3NjINCi0JCSAgICBoZWlnaHQgICAgIAkyNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwMw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFMzIzMDE3NSINCi0JCSAgICBjbGllbnQgICAgIAlANDAyDQotCQkgICAgc3VwcGxpZXIgICAJQDM5Nw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMDQxLCAzNjYpDQotCQkJKDEzOTksIDM2NikpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA0MSwgMzY2KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzk5LCAzNjYpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OlF1ZXJ5IiBANDA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3ODIsIDE0NzgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDA0DQotCQkJbG9jYXRpb24gICAJKDMwNSwgMTM1MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk5NTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlF1ZXJ5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk0MjI3MDcyDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4MzMNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjAyNzEwMzI3Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0MDQNCi0JCQlsb2NhdGlvbiAgIAkoMzA1LCAxNDE0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJOTczKQ0KLQkJICAgIHdpZHRoICAgICAgCTk3Mg0KLQkJICAgIGhlaWdodCAgICAgCTI3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwIiBANDA1DQotCQkgICAgbG9jYXRpb24gICAJKDE1NzcsIDE0NzUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMDU2NzAyQ0QiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicXVlcnlNZXRob2QiIEA0MDYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MDUNCi0JCQkgICAgbG9jYXRpb24gICAJKDEyNTcsIDEzMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MDcNCi0JCQkJUGFyZW50X1ZpZXcgCUA0MDYNCi0JCQkJbG9jYXRpb24gICAJKDE3MjksIDE0MzgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3F1ZXJ5TWV0aG9kIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQ5MTUyNQ0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMDU2OTAxRUEiDQotCQkJICAgIGNsaWVudCAgICAgCUA0MDUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDM5OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1NzcsIDE0NzUpDQotCQkJCSgxODg3LCAxNDc1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NzcsIDE0NzUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODg3LCAxNDc1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MDgNCi0JCQkJUGFyZW50X1ZpZXcgCUA0MDYNCi0JCQkJbG9jYXRpb24gICAJKDE4NTUsIDE1MjkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAicXVlcnkiIEA0MDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MDUNCi0JCQkgICAgbG9jYXRpb24gICAJKDEyNTcsIDEzMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MTANCi0JCQkJUGFyZW50X1ZpZXcgCUA0MDkNCi0JCQkJbG9jYXRpb24gICAJKDEzMzAsIDE0MzQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMzgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3F1ZXJ5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMDU2OTAxRjQiDQotCQkJICAgIGNsaWVudCAgICAgCUA0MDUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwNA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1NzcsIDE0NzUpDQotCQkJCSgxMjY4LCAxNDc1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NzcsIDE0NzUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjY4LCAxNDc1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MTENCi0JCQkJUGFyZW50X1ZpZXcgCUA0MDkNCi0JCQkJbG9jYXRpb24gICAJKDEyOTksIDE1MjkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MyIgQDQxMg0KLQkJICAgIGxvY2F0aW9uICAgCSg4NDksIDE3NTQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTU2NTAwRDAyNTkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBANDEzDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDEyDQotCQkJICAgIGxvY2F0aW9uICAgCSg2NywgMjc2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxNA0KLQkJCQlQYXJlbnRfVmlldyAJQDQxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTAxNSwgMTg0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3NDQwOA0KLQkJCQloZWlnaHQgICAgIAkxNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1NjUwMEUwMTQyIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDEyDQotCQkJICAgIHN1cHBsaWVyICAgCUA0MDENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4NDksIDE3NTQpDQotCQkJCSg4ODMsIDE4OTQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQxMw0KLQkJCQlsb2NhdGlvbiAgIAkoODE4LCAxODUyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC42MDc0NjMNCi0JCQkJaGVpZ2h0ICAgICAJNTUNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDg0IiBANDE2DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDEyDQotCQkJICAgIGxvY2F0aW9uICAgCSg2NywgMjc2KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTY1MDBFMDE3NCINCi0JCQkgICAgY2xpZW50ICAgICAJQDQxMg0KLQkJCSAgICBzdXBwbGllciAgIAlANDA0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODQ5LCAxNzU0KQ0KLQkJCQkoODE1LCAxNjE1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU0IiBANDE3DQotCQkgICAgbG9jYXRpb24gICAJKDYzOCwgMTAxMykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDI1RDYwMEYwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGl0eSIgQDQxOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAtMTcxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQxOA0KLQkJCQlsb2NhdGlvbiAgIAkoNjk2LCA1NzApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMzYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC45MzgyNzINCi0JCQkJaGVpZ2h0ICAgICAJMTE4DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyNUQ2MDBGMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQxNw0KLQkJCSAgICBzdXBwbGllciAgIAlANDAyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjM4LCAxMDEzKQ0KLQkJCQkoNTc4LCAxMDEzKQ0KLQkJCQkoNTc4LCA1MzYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjM4LCAxMDEzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc4LCA1MzYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyMA0KLQkJCQlQYXJlbnRfVmlldyAJQDQxOA0KLQkJCQlsb2NhdGlvbiAgIAkoNTA5LCA1NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkzNDU2OA0KLQkJCQloZWlnaHQgICAgIAk3MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAicXVlcmllcyIgQDQyMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAtMTcxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyMg0KLQkJCQlQYXJlbnRfVmlldyAJQDQyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTEwLCAxMjgzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTU4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitxdWVyaWVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg4Mzk1MQ0KLQkJCQloZWlnaHQgICAgIAkxMTMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDI1RDYwMEYyIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDE3DQotCQkJICAgIHN1cHBsaWVyICAgCUA0MDQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2MzgsIDEwMTMpDQotCQkJCSg3OTcsIDEwMTMpDQotCQkJCSg3OTcsIDEzNDEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjM4LCAxMDEzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzk3LCAxMzQxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MjMNCi0JCQkJUGFyZW50X1ZpZXcgCUA0MjENCi0JCQkJbG9jYXRpb24gICAJKDg4MywgMTMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTU4MDI1DQotCQkJCWhlaWdodCAgICAgCTg2DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFSkIyLjEgLSBNZXNzYWdlIERyaXZlbiBCZWFuIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkYyNzQ5MDMwQyINCi0JICAgIHRpdGxlICAgICAgCSJFSkIyLjEgLSBNZXNzYWdlIERyaXZlbiBCZWFuIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXNzYWdlDQotfCAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLiBJZg0KLXwgICAgICAgIHRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzDQotfCAgICAgICAgYXNzdW1lZCB0byBiZSBqYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyLg0KLQkgICAgDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMTkzMQ0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgTGFiZWwgQDQyNA0KLQkJICAgIGxvY2F0aW9uICAgCSg1MCwgNDEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTINCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJVFJVRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIG5saW5lcyAgICAgCTENCi0JCSAgICBtYXhfd2lkdGggIAk3NjINCi0JCSAgICBsYWJlbCAgICAgIAkiRUpCMi4xIE1lc3NhZ2UgRHJpdmVuIEJlYW4iKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkVudGVycHJpc2VCZWFuIiBANDI1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzk2LCAzNjEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MjUNCi0JCQlsb2NhdGlvbiAgIAkoMjQyLCAzMTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzA4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFbnRlcnByaXNlQmVhbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3ODBFNzFBMDEwQSINCi0JCSAgICB3aWR0aCAgICAgIAkzMjYNCi0JCSAgICBoZWlnaHQgICAgIAkxMTcNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpUcmFuc2FjdGlvblR5cGUiIEA0MjYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MjUsIDQ5NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MjYNCi0JCQlsb2NhdGlvbiAgIAkoMTY1OSwgNDEzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVHJhbnNhY3Rpb25UeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDI2DQotCQkJbG9jYXRpb24gICAJKDE2NTksIDM2MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdGQ0E0ODcwMkVGIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0MjYNCi0JCQlsb2NhdGlvbiAgIAkoMTY1OSwgNDc0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjMxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM1MA0KLQkJICAgIGhlaWdodCAgICAgCTI5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBANDI3DQotCQkgICAgbG9jYXRpb24gICAJKDE2MjYsIDg5NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MjcNCi0JCQlsb2NhdGlvbiAgIAkoMTQ4OCwgNzk3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTI0MA0KLQkJCWxhYmVsICAgICAgCSJXYXMgYWxyZWFkeSB1c2VkL2RlZmluZWQgYnkgU2Vzc2lvbiBiZWFuIikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkzMDANCi0JCSAgICBoZWlnaHQgICAgIAkyMTIpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDQyOA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDQyNw0KLQkJICAgIHN1cHBsaWVyICAgCUA0MjYNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTY3OCwgNzkwKQ0KLQkJCSgxNzUxLCA2NDMpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6QWNrbm93bGVkZ2VNb2RlIiBANDI5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3ODQsIDExNjkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDI5DQotCQkJbG9jYXRpb24gICAJKDU2NCwgMTA4NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkFja25vd2xlZGdlTW9kZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQyOQ0KLQkJCWxvY2F0aW9uICAgCSg1NjQsIDEwMzUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzNkQ3MDNFNCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDI5DQotCQkJbG9jYXRpb24gICAJKDU2NCwgMTE0NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTQ0NikNCi0JCSAgICB3aWR0aCAgICAgIAk0NTgNCi0JCSAgICBoZWlnaHQgICAgIAkyOTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWpiOjpTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCIgQDQzMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA1NiwgMTk2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MzANCi0JCQlsb2NhdGlvbiAgIAkoODA1LCAxODg0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MzANCi0JCQlsb2NhdGlvbiAgIAkoODA1LCAxODM0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTAyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMzhGMDAyOUMiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQzMA0KLQkJCWxvY2F0aW9uICAgCSg4MDUsIDE5NDUpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyNjgpDQotCQkgICAgd2lkdGggICAgICAJNTIwDQotCQkgICAgaGVpZ2h0ICAgICAJMjkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6RGVzdGluYXRpb25UeXBlIiBANDMxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1NDQsIDE5NjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDMxDQotCQkJbG9jYXRpb24gICAJKDM3NiwgMTg4NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc3RpbmF0aW9uVHlwZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQzMQ0KLQkJCWxvY2F0aW9uICAgCSgzNzYsIDE4MzQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTk3OEY1QzAxMDYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQzMQ0KLQkJCWxvY2F0aW9uICAgCSgzNzYsIDE5NDUpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkxNzgpDQotCQkgICAgd2lkdGggICAgICAJMzU0DQotCQkgICAgaGVpZ2h0ICAgICAJMjkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIiBANDMyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1NjgsIDE2MTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDMyDQotCQkJbG9jYXRpb24gICAJKDExMiwgMTQ4OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk5MTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzM0YxMDA0NCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDMyDQotCQkJbG9jYXRpb24gICAJKDExMiwgMTU1MCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTk1MSkNCi0JCSAgICB3aWR0aCAgICAgIAk5MzANCi0JCSAgICBoZWlnaHQgICAgIAkyNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBANDMzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQyOCwgNTQ3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQzMw0KLQkJCWxvY2F0aW9uICAgCSgxMzAzLCA0NTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjUxDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgd2lkdGggICAgICAJMjY5DQotCQkgICAgaGVpZ2h0ICAgICAJMjE5DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IiBANDM0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNjIwLCAxNzk3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQzNA0KLQkJCWxvY2F0aW9uICAgCSgyNDg4LCAxNjcwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTI2NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQTFBMDBCRiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDM0DQotCQkJbG9jYXRpb24gICAJKDI0ODgsIDE3ODEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyOTQpDQotCQkgICAgd2lkdGggICAgICAJMjgyDQotCQkgICAgaGVpZ2h0ICAgICAJMjc4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVqYjo6TWVzc2FnZURyaXZlbiIgQDQzNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTY0LCA3OTkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDM1DQotCQkJbG9jYXRpb24gICAJKDEwNCwgNjUwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTkyMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZURyaXZlbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYzMjQ4MDEwQiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDM1DQotCQkJbG9jYXRpb24gICAJKDEwNCwgNzExKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk1DQotCQkJbWF4X3dpZHRoICAJOTQ0KQ0KLQkJICAgIHdpZHRoICAgICAgCTkzOA0KLQkJICAgIGhlaWdodCAgICAgCTMyMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjMyNTMwMjZGIg0KLQkJICAgIGNsaWVudCAgICAgCUA0MzUNCi0JCSAgICBzdXBwbGllciAgIAlANDI1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDQwNiwgNjM3KQ0KLQkJCSg0MDYsIDQxOSkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDA2LCA2MzcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQwNiwgNDE5KSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMSIgQDQzNw0KLQkJICAgIGxvY2F0aW9uICAgCSgzNTMsIDEyMTgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJNDIyNzA3Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGMzQwODAxRkYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzdGluYXRpb24iIEA0MzgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MzcNCi0JCQkgICAgbG9jYXRpb24gICAJKC00NywgNDE4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQzOA0KLQkJCQlsb2NhdGlvbiAgIAkoNTAyLCAxNDM2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjI4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXN0aW5hdGlvbiINCi0JCQkJcGN0RGlzdCAgICAJMC44NDk4MTcNCi0JCQkJaGVpZ2h0ICAgICAJMTQ5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QkYzNDA5MDA1MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQzNw0KLQkJCSAgICBzdXBwbGllciAgIAlANDMyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzUzLCAxMjE4KQ0KLQkJCQkoMzUzLCAxNDc2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM1MywgMTIxOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM1MywgMTQ3NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQwDQotCQkJCVBhcmVudF9WaWV3IAlANDM4DQotCQkJCWxvY2F0aW9uICAgCSgzMTYsIDE0MjIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5MDk4NA0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYmVhbiIgQDQ0MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQ3LCA0MTgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQyDQotCQkJCVBhcmVudF9WaWV3IAlANDQxDQotCQkJCWxvY2F0aW9uICAgCSg0NDAsIDk5OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEyOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYmVhbiINCi0JCQkJcGN0RGlzdCAgICAJMC44NTcxNDMNCi0JCQkJaGVpZ2h0ICAgICAJODcNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRjM0MDkwMDVDIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDM3DQotCQkJICAgIHN1cHBsaWVyICAgCUA0MzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNTMsIDEyMTgpDQotCQkJCSgzNTMsIDk2MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDEyMTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTMsIDk2MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQzDQotCQkJCVBhcmVudF9WaWV3IAlANDQxDQotCQkJCWxvY2F0aW9uICAgCSgyOTYsIDEwMDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg0NTg2NQ0KLQkJCQloZWlnaHQgICAgIAk1OA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NSIgQDQ0NA0KLQkJICAgIGxvY2F0aW9uICAgCSg5NTEsIDM0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjk4MjAxRTIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWVzc2FnZURlc3RpbmF0aW9uIiBANDQ1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDQ0DQotCQkJICAgIGxvY2F0aW9uICAgCSg0NTQsIC00NjApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQ2DQotCQkJCVBhcmVudF9WaWV3IAlANDQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMTc5LCAyOTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzOTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21lc3NhZ2VEZXN0aW5hdGlvbiINCi0JCQkJcGN0RGlzdCAgICAJMC40MjQxNzYNCi0JCQkJaGVpZ2h0ICAgICAJNDkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDI5ODMwMjcwIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDQ0DQotCQkJICAgIHN1cHBsaWVyICAgCUA0MzMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5NTEsIDM0MCkNCi0JCQkJKDEzOTMsIDM0MCkNCi0JCQkJKDEzOTMsIDQzOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTEsIDM0MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzOTMsIDQzOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQ3DQotCQkJCVBhcmVudF9WaWV3IAlANDQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMzQwLCAzODMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTYiIEA0NDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NDQNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ1NCwgLTQ2MCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMjk4MzAyN0EiDQotCQkJICAgIGNsaWVudCAgICAgCUA0NDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQzNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk1MSwgMzQwKQ0KLQkJCQkoNzA4LCAzNDApDQotCQkJCSg3MDgsIDYzOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTEsIDM0MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDcwOCwgNjM4KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYxIiBANDQ5DQotCQkgICAgbG9jYXRpb24gICAJKDEwNzcsIDU4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTU2MkQ5RTAyNTQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWVzc2FnaW5nVHlwZSIgQDQ1MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTgwLCAtMjE2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyOSwgNTUyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzEyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittZXNzYWdpbmdUeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjI0NTQ1NQ0KLQkJCQloZWlnaHQgICAgIAkzMw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTU2MkQ5RjAxODMiDQotCQkJICAgIGNsaWVudCAgICAgCUA0NDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQzMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwNzcsIDU4NCkNCi0JCQkJKDEyOTQsIDU4NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDc3LCA1ODQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk0LCA1ODQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI0MywgNjM5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NjgxODINCi0JCQkJaGVpZ2h0ICAgICAJNTUNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYyIiBANDUzDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDQ5DQotCQkJICAgIGxvY2F0aW9uICAgCSg1ODAsIC0yMTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1NjJEOUYwMTk3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDQ5DQotCQkJICAgIHN1cHBsaWVyICAgCUA0MzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDc3LCA1ODQpDQotCQkJCSg5MTQsIDU4NCkNCi0JCQkJKDkxNCwgNjM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNzcsIDU4NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkxNCwgNjM4KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIiBANDU0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDkwLCA2ODcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDU0DQotCQkJbG9jYXRpb24gICAJKDIzNjIsIDU1OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA0NTQNCi0JCQlsb2NhdGlvbiAgIAkoMjM2MiwgNjczKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjg1KQ0KLQkJICAgIHdpZHRoICAgICAgCTI3NA0KLQkJICAgIGhlaWdodCAgICAgCTI4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplamI6OkFjdGl2YXRpb25Db25maWciIEA0NTUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4NDgsIDEzODcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDU1DQotCQkJbG9jYXRpb24gICAJKDE3NTIsIDEzMTEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTkyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBY3RpdmF0aW9uQ29uZmlnIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQTdFMDEzMSINCi0JCSAgICB3aWR0aCAgICAgIAkyMTANCi0JCSAgICBoZWlnaHQgICAgIAkxNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NiIgQDQ1Ng0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDQ0LCAxNzEzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQUUyMDE1RCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb25maWdQcm9wZXJ0aWVzIiBANDU3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDU2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxOTYsIDMyNikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTgNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NTcNCi0JCQkJbG9jYXRpb24gICAJKDIyOTksIDE3NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMTQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbmZpZ1Byb3BlcnRpZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNTg1NDgwDQotCQkJCWhlaWdodCAgICAgCTYzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQUUyMDMzMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ1Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANDM0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjA0NCwgMTcxMykNCi0JCQkJKDI0NzksIDE3MTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA0NCwgMTcxMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI0NzksIDE3MTMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMiwgMTY1NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNjQxMTY0DQotCQkJCWhlaWdodCAgICAgCTU4DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NyIgQDQ2MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTk2LCAzMjYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDFBRTIwMzM1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDU2DQotCQkJICAgIHN1cHBsaWVyICAgCUA0NTUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMDQ0LCAxNzEzKQ0KLQkJCQkoMTg0NywgMTcxMykNCi0JCQkJKDE4NDcsIDE0NzUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA0NCwgMTcxMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4NDcsIDE0NzUpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDgiIEA0NjENCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMxOCwgMTE0NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUIwNTAxNDkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYWN0aXZhdGlvbkNvbmZpZyIgQDQ2Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAzNDUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDYzDQotCQkJCVBhcmVudF9WaWV3IAlANDYyDQotCQkJCWxvY2F0aW9uICAgCSgxNTc0LCAxMzE4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzA5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithY3RpdmF0aW9uQ29uZmlnIg0KLQkJCQlwY3REaXN0ICAgIAkwLjczNzYzMQ0KLQkJCQloZWlnaHQgICAgIAk0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUIwNzAwQTIiDQotCQkJICAgIGNsaWVudCAgICAgCUA0NjENCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ1NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMTgsIDExNDUpDQotCQkJCSgxMzE4LCAxMzYyKQ0KLQkJCQkoMTc0MywgMTM2MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzE4LCAxMTQ1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0MywgMTM2MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDY0DQotCQkJCVBhcmVudF9WaWV3IAlANDYyDQotCQkJCWxvY2F0aW9uICAgCSgxNjc5LCAxNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ5IiBANDY1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDYxDQotCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDM0NSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUIwNzAwQTQiDQotCQkJICAgIGNsaWVudCAgICAgCUA0NjENCi0JCQkgICAgc3VwcGxpZXIgICAJQDQzNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMTgsIDExNDUpDQotCQkJCSgxMzE4LCA3ODcpDQotCQkJCSgxMDMzLCA3ODcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTMxOCwgMTE0NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMzMsIDc4NykpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MyIgQDQ2Ng0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTQ5LCA4MDcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDFBQUQwMEFDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDQ2Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxLCAtNTgwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2OA0KLQkJCQlQYXJlbnRfVmlldyAJQDQ2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMjIwMCwgNjY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjkxMDIzDQotCQkJCWhlaWdodCAgICAgCTUxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQxQUFEMDNBNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ2Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANDU0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTk0OSwgODA3KQ0KLQkJCQkoMTk0OSwgNzE4KQ0KLQkJCQkoMjM1MywgNzE4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NDksIDgwNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzNTMsIDcxOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDY5DQotCQkJCVBhcmVudF9WaWV3IAlANDY3DQotCQkJCWxvY2F0aW9uICAgCSgyMjkwLCA3NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3MjY1MQ0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjQiIEA0NzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NjYNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwMSwgLTU4MCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMUFBRDAzQ0QiDQotCQkJICAgIGNsaWVudCAgICAgCUA0NjYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ1NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5NDksIDgwNykNCi0JCQkJKDE5NDksIDEyOTkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk0OSwgODA3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0OSwgMTI5OSkpKSkpKSkpDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvajJlZS5tZGwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9qMmVlLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhYTRkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9qMmVlLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDU4MzQgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk1MA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJJREUiDQotCSAgICB2YWx1ZSAgICAgIAkiSW50ZXJuYWwgRWRpdG9yIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiDQotCSAgICB2YWx1ZSAgICAgIAkiIikpDQotICAgIHF1aWQgICAgICAgCSIzOUVFMEU3RjAxNEMiDQotICAgIGVuZm9yY2VDbG9zdXJlQXV0b0xvYWQgCUZBTFNFDQotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMNCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwDQotCWxlZnRNYXJnaW4gCTAuMjUwMDAwDQotCXRvcE1hcmdpbiAgCTAuMjUwMDAwDQotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDANCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwDQotCWNsaXBJY29uTGFiZWxzIAlUUlVFDQotCWF1dG9SZXNpemUgCVRSVUUNCi0Jc25hcFRvR3JpZCAJRkFMU0UNCi0JZ3JpZFggICAgICAJMTYNCi0JZ3JpZFkgICAgICAJMTYNCi0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udA0KLQkgICAgc2l6ZSAgICAgICAJMTANCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JICAgIGJvbGQgICAgICAgCUZBTFNFDQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCSAgICBjb2xvciAgICAgIAkwDQotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQlzaG93TWVzc2FnZU51bSAJMQ0KLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQ0KLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpDQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3Ig0KLQlxdWlkICAgICAgIAkiMzlFRTBFN0YwMTRFIg0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiMzlFRTBFODAwMUY5Ig0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyINCi0JcXVpZCAgICAgICAJIjM5RUUwRTdGMDE0RCINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciDQotCXF1aWR1ICAgICAgCSIzOUVFMEU3RjAxNEYiDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlY29yZSINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5lbWYuZWNvcmVcXG1vZGVsXFxvcmcuZWNsaXBzZS5lbWYuRWNvcmUuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM5QTVFRDA0MDA0RSIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqYXZhIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmplbVxccm9zZVxcZWRvY2phdmEyLmNhdCINCi0JCXF1aWQgICAgICAgCSIzNjU0OUYyQzAwNEUiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiY2xpZW50Ig0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXGNsaWVudC5jYXQiDQotCQlxdWlkICAgICAgIAkiMzhDMDI4MDcwMEMwIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImFwcGxpY2F0aW9uIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXGFwcGxpY2F0aW9uLmNhdCINCi0JCXF1aWQgICAgICAgCSIzOEMwMzAwODAxNEUiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiY29tbW9uIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXGNvbW1vbi5jYXQiDQotCQlxdWlkICAgICAgIAkiMzhDMDhGMEYwMzhEIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImVqYiINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFxlamJzY2hlbWEuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM3ODBFMjcyMDMyRCIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ0YWdsaWIiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcdGFnbGliXzFfMS5jYXQiDQotCQlxdWlkICAgICAgIAkiMzlBNkJBNUYwMDcwIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndlYmFwcGxpY2F0aW9uIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXHdlYmFwcGxpY2F0aW9uLmNhdCINCi0JCXF1aWQgICAgICAgCSIzOEMwNzZENjAzREQiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiamNhIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXGpjYTFfMC5jYXQiDQotCQlxdWlkICAgICAgIAkiM0M2MDkwNDIwMEJCIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzY2xpZW50Ig0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXHdlYnNlcnZpY2VzX2NsaWVudF8xXzAuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjNFNEQyRjRCMDJBQSIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqc3AiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcanNwXzJfMC5jYXQiDQotCQlxdWlkICAgICAgIAkiM0U0RDRGNjkwMzZCIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzY29tbW9uIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXHdzY29tbW9uLmNhdCINCi0JCXF1aWQgICAgICAgCSIzRTE1QjRDMDAxNkYiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkZCINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFx3c2RkLmNhdCINCi0JCXF1aWQgICAgICAgCSIzRTEwOUVBRDAzMTkiKSkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzOUVFMEU4MDAxRkEiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVjb3JlIiBAMQ0KLQkJCWxvY2F0aW9uICAgCSgyMjUsIDIxOCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxDQotCQkJICAgIGxvY2F0aW9uICAgCSg4MSwgMTM0KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJlY29yZSIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM5QTVFRDA0MDA0RSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6amF2YSIgQDINCi0JCQlsb2NhdGlvbiAgIAkoNjg3LCAyMjIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTMzLCAxODcpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMzA4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImphdmEiKQ0KLQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTMzLCAxMzcpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkgICAgbWF4X3dpZHRoICAJMzA4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJIjw8bWV0YW1vZGVsPj4iKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzNjU0OUYyQzAwNEUiDQotCQkJd2lkdGggICAgICAJMzIwDQotCQkJaGVpZ2h0ICAgICAJMTgyKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmNsaWVudCIgQDMNCi0JCQlsb2NhdGlvbiAgIAkoMTEwOSwgMjMxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMNCi0JCQkgICAgbG9jYXRpb24gICAJKDk2NSwgMTQ3KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJjbGllbnQiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzOEMwMjgwNzAwQzAiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uIiBANA0KLQkJCWxvY2F0aW9uICAgCSgxNTQzLCAyMjIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlANA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OSwgMTM4KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJhcHBsaWNhdGlvbiIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM4QzAzMDA4MDE0RSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6Y29tbW9uIiBANQ0KLQkJCWxvY2F0aW9uICAgCSgxOTY1LCAyMTgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlANQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTM0KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJjb21tb24iKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzOEMwOEYwRjAzOEQiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVqYiIgQDYNCi0JCQlsb2NhdGlvbiAgIAkoMTE4OSwgNjA5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDYNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwMzUsIDU3NCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkzMDgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiZWpiIikNCi0JCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDYNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwMzUsIDUyNCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCSAgICBtYXhfd2lkdGggIAkzMDgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiPDxtZXRhbW9kZWw+PiIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM3ODBFMjcyMDMyRCINCi0JCQl3aWR0aCAgICAgIAkzMjANCi0JCQloZWlnaHQgICAgIAkxODIpDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6dGFnbGliIiBANw0KLQkJCWxvY2F0aW9uICAgCSgxNjIxLCA2MTIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlANw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ3NywgNTI4KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJ0YWdsaWIiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzOUE2QkE1RjAwNzAiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uIiBAOA0KLQkJCWxvY2F0aW9uICAgCSgzMDMsIDYxNCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNTksIDUzMCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkid2ViYXBwbGljYXRpb24iKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzOEMwNzZENjAzREQiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmpjYSIgQDkNCi0JCQlsb2NhdGlvbiAgIAkoNzM3LCA2MjcpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTkzLCA1NDMpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImpjYSIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNDNjA5MDQyMDBCQiINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQiIEAxMA0KLQkJCWxvY2F0aW9uICAgCSgyMDA5LCA2MTgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTANCi0JCQkgICAgbG9jYXRpb24gICAJKDE4NjUsIDUzNCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkid3NjbGllbnQiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzRTREMkY0QjAyQUEiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OndzY29tbW9uIiBAMTENCi0JCQlsb2NhdGlvbiAgIAkoMzI1LCA5MzQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTENCi0JCQkgICAgbG9jYXRpb24gICAJKDE4MSwgODUwKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJ3c2NvbW1vbiIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNFMTVCNEMwMDE2RiINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3NkZCIgQDEyDQotCQkJbG9jYXRpb24gICAJKDc1MCwgOTQwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MDYsIDg1NikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkid3NkZCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNFMTA5RUFEMDMxOSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQ0KLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiMzlFRTBFN0YwMTRGIg0KLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiMzlFRTBFODAwMUY4Ig0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkNCi0JY2F0ZWdvcnkgICAJIkxvZ2ljYWwgVmlldyINCi0JcXVpZHUgICAgICAJIjQzMDc4NjFFMDIzOCIpDQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3Nlcw0KLQlxdWlkICAgICAgIAkiMzlFRTBFN0YwMTUwIg0KLQlQcm9jc05EZXZzIAkobGlzdA0KLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyINCi0JCXF1aWQgICAgICAgCSIzOUVFMEU3RjAxNTIiDQotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3Ig0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMNCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2OSIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJjbGFzc2lmaWVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkieG1sQ29udGVudEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJDb250ZW50S2luZCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRlbnRLaW5kIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJbmFtZSAgICAgICAJIkVtcHR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJbmFtZSAgICAgICAJIk1peGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50T25seSINCi0JCQkJdmFsdWUgICAgICAJNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkib3BlcmF0aW9uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0lEIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRmVhdHVyZUtpbmQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJGZWF0dXJlS2luZCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJbmFtZSAgICAgICAJIkF0dHJpYnV0ZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCINCi0JCQkJdmFsdWUgICAgICAJNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInJlZmVyZW5jZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInhtbE5hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIg0KLQkJCXZhbHVlICAgICAgCTgpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJLTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVCYWNrdXBGaWxlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjMiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCNCINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI1Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCINCi0JCQkJdmFsdWUgICAgICAJNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUmV2ZXJzZSBlbmdpbmVlcmluZyBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgc3luY2hyb25pemUiDQotCQkJCXZhbHVlICAgICAgCTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUmV2RW5nUm9vdERpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIi5oIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiLmNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmV3SW1wbGVtZW50YXRpb25GaWxlRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCSgiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3RyaXBDbGFzc1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk4KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5kZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCS0yKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlQmFja3VwRmlsZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIg0KLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb21tZW50UnVsZXNTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUGFnZVdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTgwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VCcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VzIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUGFja2FnZXMiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJTYW1lIGFzIG1vZGVsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkJyYWNlU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjEiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMiINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjQiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCNSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTWVtYmVyT3JkZXJTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSBGaXJzdCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyIGJ5IGtpbmQiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiDQotCQkJCXZhbHVlICAgICAgCTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOZXZlciBnZW5lcmF0ZSBtb2RlbCBJRHMiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJBbHdheXMgc3luY2hyb25pemUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlJldmVyc2UgZW5naW5lZXJpbmcgb25seSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIHN5bmNocm9uaXplIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHkiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyU291cmNlRmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlTb3VyY2VGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBTlNJQ29udmVydCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTgzX1NPVVJDRSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQWNjZXNzIg0KLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQb2x5bW9ycGhpY1VuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUFjY2VzcyINCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJBXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJUaGVfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzRXF1YWxpdHlPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUVxdWFsaXR5T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNUYXNrIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkxpbWl0ZWRQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFVzZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsVXNlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU3BlYyINCi0JCQkJdmFsdWUgICAgICAJMjI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJMjIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvblJldHVybiINCi0JCQkJdmFsdWUgICAgICAJMjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMzIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMjMyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJpY0Zvcm1hbFNldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0aW9uTWFwcGluZyINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jaWF0aW9uTWFwcGluZ1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJPYmplY3QiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRpb25NYXBwaW5nU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiTmFtZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMikpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVXNlQ29sb25Ob3RhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE5NV9TT1VSQ0UiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUltcGxlbWVudGF0aW9uU2V0IiAyMDgpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmNvbXBsZXRlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkluY29tcGxldGVUeXBlU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2wiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlQ29udHJvbFNldCIgMjI1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb250cm9sbGVkXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlRGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiIDIwOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEtpbmRQYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtjbGFzc31fUmVjb3JkX0tpbmRzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNMaW1pdGVkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlQWNjZXNzVHlwZVNldCIgMjMwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZURlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTWF5YmVBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiIDExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyZW50Q2xhc3NOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTdXBlcmNsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJBXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJUaGVfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZlR5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZlR5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mQWNjZXNzVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFycmF5SW5kZXhEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJQb3NpdGl2ZSByYW5nZSA8PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkZyZWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVR5cGVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUVxdWFsaXR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ij0iDQotCQkJKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVGFnZ2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlY29yZCINCi0JCQkJdmFsdWUgICAgICAJMjEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNaXhpbiINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJUYXNrIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5jb21wbGV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk5vRGlzY3JpbWluYW50UGFydCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVW5rbm93bkRpc2NyaW1pbmFudFBhcnQiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIktub3duRGlzY3JpbWluYW50UGFydCINCi0JCQkJdmFsdWUgICAgICAJNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVR5cGUiDQotCQkJCXZhbHVlICAgICAgCTIwOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlwbGVUeXBlcyINCi0JCQkJdmFsdWUgICAgICAJMjEzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJVbmNvbnN0cmFpbmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMjI1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbml0aWFsaXphdGlvbk9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIyNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXNzaWdubWVudEZpbmFsaXphdGlvbk9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIyNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjgpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkF1dG8iDQotCQkJCXZhbHVlICAgICAgCTIzMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmRlZmluaXRlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNQcml2YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsVXNlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxVc2VzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRpbmciDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlCYXJyaWVyQ29uZGl0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJUcnVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nQXNCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiDQotCQkJCXZhbHVlICAgICAgCTIzMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2VzcyINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMzIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMjMyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbCINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyaWNGb3JtYWxTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGlvbk1hcHBpbmciDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY2lhdGlvbk1hcHBpbmdTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiT2JqZWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0aW9uTWFwcGluZ1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk5hbWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJCXZhbHVlICAgICAgCTIpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjE3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Q2xhc3NXaWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTIxNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3Rpb24iDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbURpcmVjdGlvblR5cGVTZXQiIDEwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtRGlyZWN0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJImluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJImlub3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIm91dCINCi0JCQkJdmFsdWUgICAgICAJMTA0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJInByb2plY3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlZpZXdDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTUFBhY2thZ2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkpvaW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiY09OVEFJTkVSQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGF0YWJhc2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYXJnZXREYXRhYmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZVNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RlYXVsdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkJ1ZmZlclBvb2wiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlbnRTaXplIg0KLQkJCXZhbHVlICAgICAgCTEpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmVmZXRjaFNpemUiDQotCQkJdmFsdWUgICAgICAJMSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhZ2VTaXplIg0KLQkJCXZhbHVlICAgICAgCTQpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJNYW5hZ2VkQnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJMaXN0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1Eb21haW5QYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1Jvb3RTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1Jvb3REb21haW5QYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWFQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGF0YWJhc2VJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRCTVMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVmlldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRG9tYWluIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTUFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTeW5vbnltbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb3JyZWxhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrT3B0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJOb25lIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGVyc2lzdFRvU2VydmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0lkZW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOYXRpdmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSZWxhdGlvbnNoaXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSSU1ldGhvZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVHJpZ2dlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDbHVzdGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIktleUxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja1ByZWRpY2F0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmZXJhbE1vZGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ2hlY2tUaW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luc2VydEV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRUYWJsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk5ld1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmT2xkUm93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3Um93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb3ciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGFuZ3VhZ2UiDQotCQkJdmFsdWUgICAgICAJIlNRTCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlclN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuZWROdWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNPdXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklEIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEZXBsb3kiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTm90U2hvd1Jvc2VJRERsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJvc2VJRCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdEoyRUVKYXZhZG9jIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0VmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFNpbmNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVKYXZhRG9jVGFncyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTSINCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiDQotCQkJdmFsdWUgICAgICAJIjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXGNoYXJzZXRzLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXGpjZS5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxqc3NlLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXHJ0LmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXHN1bnJzYXNpZ24uamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcZXh0XFxkbnNucy5qYXI7RDpcXGoyc2RrMS40LjJfMDhcXGpyZVxcbGliXFxleHRcXGxkYXBzZWMuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcZXh0XFxsb2NhbGVkYXRhLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXGV4dFxcc3VuamNlX3Byb3ZpZGVyLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcanJlXFxsaWJcXHNlY3VyaXR5XFxsb2NhbF9wb2xpY3kuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxqcmVcXGxpYlxcc2VjdXJpdHlcXFVTX2V4cG9ydF9wb2xpY3kuamFyO0Q6XFxqMnNkazEuNC4yXzA4XFxsaWJcXGR0LmphcjtEOlxcajJzZGsxLjQuMl8wOFxcbGliXFxodG1sY29udmVydGVyLmphcjtEOlxcajJzZGsxLjQuMl8wOFxcbGliXFx0b29scy5qYXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlZmVyZW5jZUNsYXNzcGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN1biINCi0JCQkJdmFsdWUgICAgICAJMjAwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVkFKYXZhV29ya2luZ0ZvbGRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJ2b2lkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIg0KLQkJCXZhbHVlICAgICAgCTMpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5TdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVtb3RlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlbW90ZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJIb21lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkhvbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTG9jYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTG9jYWxTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRFRETG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERURExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VDb250cm9sIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNDQ1NlbGVjdGVkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3RTb3VyY2VSb290Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3ROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNDQ0NvbW1lbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRnVuZGFtZW50YWxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJib29sZWFuOyBjaGFyOyBieXRlOyBzaG9ydDsgaW50OyBsb25nOyBmbG9hdDsgZG91YmxlOyBCb29sZWFuOyBCeXRlOyBDaGFyYWN0ZXI7IERvdWJsZTsgRmxvYXQ7IEludGVnZXI7IExvbmc7IE9iamVjdDsgU2hvcnQ7IFN0cmluZzsgU3RyaW5nQnVmZmVyOyBWb2lkOyBqYXZhLm1hdGguQmlnRGVjaW1hbDsgamF2YS5tYXRoLkJpZ0ludGVnZXI7IGphdmEuc3FsLkRhdGU7IGphdmEuc3FsLlRpbWU7IGphdmEuc3FsLlRpbWVzdGFtcDsgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsgamF2YS51dGlsLkFic3RyYWN0TGlzdDtqYXZhLnV0aWwuQWJzdHJhY3RNYXA7IGphdmEudXRpbC5BYnN0cmFjdFNlcXVlbnRpYWxMaXN0OyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7IGphdmEudXRpbC5BcnJheUxpc3Q7IGphdmEudXRpbC5BcnJheXM7IGphdmEudXRpbC5CaXRTZXQ7IGphdmEudXRpbC5DYWxlbmRhcjsgamF2YS51dGlsLkNvbGxlY3Rpb25zOyBqYXZhLnV0aWwuRGF0ZTsgamF2YS51dGlsLkRhdGU7IGphdmEudXRpbC5EaWN0aW9uYXJ5OyBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsgamF2YS51dGlsLkhhc2hNYXA7IGphdmEudXRpbC5IYXNoU2V0OyBqYXZhLnV0aWwuSGFzaHRhYmxlOyBqYXZhLnV0aWwuTGlua2VkTGlzdDsgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZTsgamF2YS51dGlsLkxvY2FsZTsgamF2YS51dGlsLk9ic2VydmFibGU7IGphdmEudXRpbC5Qcm9wZXJ0aWVzOyBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uOyBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsgamF2YS51dGlsLlJhbmRvbTsgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOyBqYXZhLnV0aWwuU2ltcGxlVGltZVpvbmU7IGphdmEudXRpbC5TdGFjazsgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsgamF2YS51dGlsLlRpbWVyOyBqYXZhLnV0aWwuVGltZXJUYXNrOyBqYXZhLnV0aWwuVGltZVpvbmU7IGphdmEudXRpbC5UcmVlTWFwOyBqYXZhLnV0aWwuVHJlZVNldDsgamF2YS51dGlsLlZlY3RvcjsgamF2YS51dGlsLldlYWtIYXNoTWFwIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkh0dHBfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJfSUQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciINCi0JCQkJdmFsdWUgICAgICAJMTkwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSINCi0JCQkJdmFsdWUgICAgICAJMTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlJPVyINCi0JCQkJdmFsdWUgICAgICAJMTcwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiDQotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCINCi0JCQkJdmFsdWUgICAgICAJMTYwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIjIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSI2IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDb21wb25lbnRUZXN0Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVG9wTGluayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIlR5cGVLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJlbnVtIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJyZWNvcmQiDQotCQkJCXZhbHVlICAgICAgCTEwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIm1vZHVsZSINCi0JCQkJdmFsdWUgICAgICAJMTAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiaW50ZXJmYWNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJkaXNwaW50ZXJmYWNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJjb2NsYXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJhbGlhcyINCi0JCQkJdmFsdWUgICAgICAJMTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkidW5pb24iDQotCQkJCXZhbHVlICAgICAgCTEwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIm1heCINCi0JCQkJdmFsdWUgICAgICAJMTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJraW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUtpbmRzIiAxMDkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidXVpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiZGxsbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImFsaWFzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImZpbGVuYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkibGlicmFyeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInV1aWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBmaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJsY2lkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZlcnNpb24gQ29udHJvbCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMjEzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCYXNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMjIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiMCINCi0JCQkJdmFsdWUgICAgICAJMjIzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiMSINCi0JCQkJdmFsdWUgICAgICAJMjI0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIg0KLQkJCXZhbHVlICAgICAgCSgiQmFzZVNldCIgMjIyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmciDQotCQkJdmFsdWUgICAgICAJKCJJbnN0YW5jaW5nU2V0IiAyMTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQ29tcGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiVGV4dCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0JvZHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Qm9keSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5ldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5ldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJ5VmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQnlSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtQXJyYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wb3J0UmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUXVpY2tJbXBvcnQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcG9ydEJpbmFyeSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJXZWIgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1N5c3RlbUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVudGl0eV9QdWJsaWNJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvblZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkludGVybmFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyRW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsRW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1N5c3RlbUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1B1YmxpY0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHREZWNsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbiBBbGwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQ29tcG9uZW50UGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCXF1aWQgICAgICAgCSIzOUVFMEU3RjAxNTEiKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9qMmVlX2NvZGVnZW4uc2NyYXBib29rIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvajJlZV9jb2RlZ2VuLnNjcmFwYm9vawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwNTdlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9qMmVlX2NvZGVnZW4uc2NyYXBib29rCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy9XZWJTcGhlcmUgQ29uZmlnIE1vZGVsIGdlbmVyYXRpb24NCi1TdHJpbmdbXSBhcmdzID0geyJSMlgiLCANCi0iKC1maWxlIiwgImoyZWUubWRsIiwgDQotIi14bWlEaXIiLCAidW1seG1pIiwgDQotIi1uYW1ldXVpZCIsICJ0cnVlIiwgDQotIi1leHRlbnNpb25zIiwgInRydWUiLA0KLSItcGF0aE1hcCIsICJFQ0xJUFNFX1JFU09VUkNFUz1DOi9kZXYvZWNsaXBzZTM1L0lERS9wcm9qZWN0X3Jlc291cmNlcykifTsNCi0vL1N0cmluZ1tdIGFyZ3MgPSB7Ij8ifTsNCi1jb20uaWJtLmV0b29scy5qYXZhLmluaXQuSmF2YUluaXQuZXhlY3V0ZVRvb2xraXQoYXJncykNCi0NCi0vLyBDb3B5IGZpbGVzIHVwIG9uZSBkaXIgdGhlbiBleGVjdXRlLi4uDQotDQotU3RyaW5nW10gYXJncyA9IHsNCi0iLW1vZGVsUHJlZml4IiwiSmF2YVJlZiIsImphdmEiLA0KLSItbW9kZWwiLCAiajJlZS54bWwiLCANCi0iLWRpciIsICJDOi9kZXYvZWNsaXBzZTM1L0lERS9wcm9qZWN0X3Jlc291cmNlcy9lVG9vbHMgRUpCIExpYnJhcmllcy9zcmMiLCANCi0iLXBhY2thZ2UiLCAiY29tLmlibS5ldG9vbHMiLCANCi0vLyBMb2dpY2FsIG5hbWVzIG9mIGxldmVsLTEgcGFja2FnZXMgd2l0aGluIHRoZSBtb2RlbCB3aGljaCB3aWxsIGJlIGdlbmVyYXRlZC4gIE5lc3Rpbmcgbm90IHN1cHBvcnRlZC4NCi0iLWdlbkFkYXB0ZXJzIiwgDQotIi1nZW5QYWNrYWdlIiwgImNvbW1vbiIsICJjb20uaWJtLmV0b29scy5qMmVlIiwiY29tbW9uIiwiY29tbW9uLnhtaSIsDQotIi1nZW5QYWNrYWdlIiwgImVqYiIsImNvbS5pYm0uZXRvb2xzIiwgImVqYiIsImVqYi54bWkiLA0KLSItZ2VuUGFja2FnZSIsICJjbGllbnQiLCJjb20uaWJtLmV0b29scyIsImNsaWVudCIsImNsaWVudC54bWkiLA0KLSItZ2VuUGFja2FnZSIsICJhcHBsaWNhdGlvbiIsImNvbS5pYm0uZXRvb2xzIiwiYXBwbGljYXRpb24iLCJhcHBsaWNhdGlvbi54bWkiLA0KLSItZ2VuUGFja2FnZSIsICJ3ZWJhcHBsaWNhdGlvbiIsImNvbS5pYm0uZXRvb2xzIiwid2ViYXBwbGljYXRpb24iLCJ3ZWJhcHBsaWNhdGlvbi54bWkiLA0KLSItZ2VuUGFja2FnZSIsICJ0YWdsaWIiLCJjb20uaWJtLmV0b29scyIsInRhZ2xpYiIsInRhZ2xpYi54bWkiLA0KLSItcmVmUGFja2FnZSIsICJlY29yZSIsICJjb20uaWJtLmV0b29scy5lbWYiLCANCi0iLTQifTsNCi1jb20uaWJtLmV0b29scy5qYXZhLmluaXQuSmF2YUluaXQuZXhlY3V0ZVUyTShhcmdzKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2pheHJwY21hcC5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS9qYXhycGNtYXAuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUxYTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2pheHJwY21hcC5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NzI4ICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqYXhycGNtYXAiCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkicHJlZml4IgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiSmF4cnBjbWFwIikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkibnNVUkkiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJqYXhycGNtYXAueG1pIikpKQotICAgIHF1aWQgICAgICAgCSIzRTE2MUZBOTAyNjYiCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3MgIkphdmFXU0RMTWFwcGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyMUMzMDE2OCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBKYXZhIG1hcHBpbmcgdG8gYSBrbm93biBXU0RMIGRvY3VtZW50Lkl0IGNvbnRhaW5zIHRoZSBtYXBwaW5nIGJldHdlZW4gcGFja2FnZSBuYW1lcyBhbmQgWE1MIG5hbWVzcGFjZXMsIAotfFdTREwgcm9vdCB0eXBlcyBhbmQgSmF2YSBhcnRpZmFjdHMsIGFuZCB0aGUgc2V0IG9mIG1hcHBpbmdzIGZvciBzZXJ2aWNlcy4KLQkgICAgCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNkE4MDBGNCIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJQYWNrYWdlTWFwcGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyMURCMDM2MCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHBhY2thZ2UtbWFwcGluZyBpbmRpY2F0ZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBqYXZhLXBhY2thZ2UtbmFtZSBhbmQgWE1MIG5hbWVzcGFjZSBpbiB0aGUgV1NETCBkb2N1bWVudC4KLXwKLXxVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotCSAgICAKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI2QjEwMUExIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYWNrYWdlVHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCODNCNTAxNzQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcGFja2FnZS10eXBlIGluZGljYXRlcyB0aGUgSmF2YSBwYWNrYWdlIG5hbWUuIEl0IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4KLXwKLXxVc2VkIGluOiBwYWNrYWdlLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QjgzQzEwMEQxIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkphdmFYTUxUeXBlTWFwcGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyMUVCMDE2RCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIGphdmEteG1sLXR5cGUtbWFwcGluZyBlbGVtZW50IGNvbnRhaW5zIGEgY2xhc3MtdHlwZSB0aGF0IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcywgUU5hbWUgb2YgdGhlIFhNTCByb290IHR5cGUsIHRoZSBXU0RMIHR5cGUgc2NvcGUgdGhlIFFOYW1lIGFwcGxpZXMgdG8gYW5kIHRoZSBzZXQgb2YgdmFyaWFibGUgCi18bWFwcGluZ3MgZm9yIGVhY2ggcHVibGljIHZhcmlhYmxlIHdpdGhpbiB0aGUgSmF2YSBjbGFzcy4KLXwKLXxVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotCSAgICAKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI2QkUwMDY4IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjbGFzc1R5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1Qjg0RDUwMEVDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIGNsYXNzLXR5cGUgZWxlbWVudCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGNsYXNzLgotfAotfFVzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZwotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFuYW1lU2NvcGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1Qjg1MjgwMjkwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHFuYW1lLXNjb3BlIGVsZW1lbnRzIHNjb3BlcyB0aGUgcmVmZXJlbmNlIG9mIGEgUU5hbWUgdG8gdGhlIFdTREwgZWxlbWVudCB0eXBlIGl0IGFwcGxpZXMgdG8uIFRoZSB2YWx1ZSBvZiBxbmFtZS1zY29wZSBtYXkgYmUgc2ltcGxlVHlwZSwgY29tcGxleFR5cGUsIG9yIGVsZW1lbnQuCi18Ci18VXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYW5vbnltb3VzVHlwZVFuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNGOUVGQzRDMDBGRiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJFeGNlcHRpb25NYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjIyMDAwMUM2IgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgZXhjZXB0aW9uLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIHNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uIHR5cGVzIGFuZCB0aGUgd3NkbCBmYXVsdHMuCi18Ci18VGhpcyBlbGVtZW50IHNob3VsZCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlCi18bWFwcGluZyBiZXR3ZWVuIGEgbWV0aG9kIGFuZCBhbiBvcGVyYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhlIG1hcHBpbmcgY29udGV4dC4KLXwKLXxVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nCi0JICAgIAotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjZFNDAxMEEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2VwdGlvblR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QjhCOTYwMkYxIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIGV4Y2VwdGlvbi10eXBlIGVsZW1lbnQgZGVmaW5lcyBKYXZhIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbi4gSXQgbWF5IGJlIGEgc2VydmljZSBzcGVjaWZpYyBleGNlcHRpb24uCi18Ci18SXQgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotfAotfFVzZWQgaW46IGV4Y2VwdGlvbi1tYXBwaW5nCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid3NkbE1lc3NhZ2VQYXJ0TmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRjc1RTY1RjAzMDMiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiU2VydmljZUludGVyZmFjZU1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjIyRDAwOUIiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBob3cgYSBKYXZhIHR5cGUgZm9yIHRoZSBzZXJ2aWNlIGludGVyZmFjZSBtYXBzIHRvIGEgV1NETCBzZXJ2aWNlLgotfAotfFVzZWQgaW46IGphdmEtd3NkbC1tYXBwaW5nCi18Ci0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QjlCNjcwMzI1IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpJbnRlcmZhY2VNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyQkMyMDBERCIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjZFQjAxQUEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlcnZpY2VJbnRlcmZhY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QjlEM0YwMzNDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIGZvciB0aGUgc2VydmljZS4gRm9yIHN0YXRpYyBzZXJ2aWNlcywgaXQgaXMgamF2YXgueG1sLnJwYy5TZXJ2aWNlIGludGVyZmFjZS4gRm9yIGdlbmVyYXRlZCBzZXJ2aWNlLCBpdCB3b3VsZCBiZSB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZSBuYW1lLgotfAotfFRoZSBuYW1lIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLXwKLXxVc2VkIGluOiBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjIyMzgwMjU5IgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyBkZWZpbmVzIGEgdHVwbGUKLXx0byBzcGVjaWZ5IFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0byBXU0RMIHBvcnQgdHlwZXMgYW5kIFdTREwgYmluZGluZ3MuCi18Ci18QW4gaW50ZXJmYWNlIG1heSBiZSBtYXBwZWQgdG8gYSBwb3J0LXR5cGUgYW5kIGJpbmRpbmcgbXVsdGlwbGUgdGltZXMuIFRoaXMgaGFwcGVucyByYXJlbHkuCi18Ci18VXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCOUM5MjAyRUQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkludGVyZmFjZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjJCQzIwMEREIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNzEzMDJGOSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUI5RkM1MDFERSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBmb3IgdGhlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIG5hbWUgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotfAotfFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlBhY2thZ2VUeXBlIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjIyNjkwMEY3IgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjcxQjAwNUIiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhY2thZ2VUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlCMjFDMDIzQSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJDbGFzc1R5cGUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjI3QzAwNUQiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNzIxMDI0RSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2xhc3NUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlCMjY2MDBEMyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJSb290VHlwZVFuYW1lIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjIyOUIwMEMzIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcm9vdC10eXBlLXFuYW1lIGlkZW50aWZpZXMgdGhlIFdTREwgUU5hbWUgb2YgYW4gWE1MIHR5cGUuCi18Ci18VXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0Njc0NEEwMjdDIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlFuYW1lU2NvcGUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjJBQTAyNzMiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNzMyMDA1RCIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicW5hbWVTY29wZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QjJBQTAzRTMiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiVmFyaWFibGVNYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjIyQjkwMzNCIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgdmFyaWFibGUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gYSBKYXZhIGNsYXNzIGRhdGEgbWVtYmVyIG9yIEphdmFCZWFucyBwcm9wZXJ0eSB0byBhbiBYTUwgZWxlbWVudCBuYW1lIG9mIGFuIFhNTCByb290IHR5cGUuIElmIHRoZSBkYXRhLW1lbWJlciBlbGVtZW50IGlzIHByZXNlbnQsIHRoZSBKYXZhIHZhcmlhYmxlIG5hbWUgaXMgYSBwdWJsaWMgZGF0YSBtZW1iZXIuICBJZiBkYXRhLW1lbWJlcgotfGlzIG5vdCBwcmVzZW50LCB0aGUgSmF2YSB2YXJpYWJsZSBuYW1lIGlzIGEgSmF2YUJlYW5zIHByb3BlcnR5LgotfAotfFVzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZwotCSAgICAKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3MzkwMDQ4IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhVmFyaWFibGVOYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUI4NjFEMDM0NiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBqYXZhLXZhcmlhYmxlLW5hbWUgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIHB1YmxpYyBkYXRhIG1lbWJlciBvciAgSmF2YUJlYW5zIHByb3BlcnR5IHdpdGhpbiBhIEphdmEgY2xhc3MuIAotfAotfFVzZWQgaW46IHZhcmlhYmxlLW1hcHBpbmcKLXwKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ4bWxFbGVtZW50TmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCODYzMDAwMzciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgeG1sLWVsZW1lbnQtbmFtZSBlbGVtZW50IGRlZmluZXMgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBXU0RMIGVsZW1lbnQgd2l0aGluIGEgcm9vdCB0eXBlLgotfAotfFVzZWQgaW46IHZhcmlhYmxlLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkYXRhTWVtYmVyIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzRjQ2NzUxODAyOUMiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ4bWxBdHRyaWJ1dGVOYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNGNzVFOTI5MDBBNyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAieG1sV2lsZGNhcmQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNGNzVFQTAyMDJCMiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiRXhjZXB0aW9uVHlwZSIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyMkQzMDFFMiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3M0YwMTdEIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlCNTcxMDIyRCIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJXU0RMTWVzc2FnZSIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyMkUwMDJCRCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHdzZGwtbWVzc2FnZSAgZWxlbWVudCBkZWZpbmVzIGEgV1NETCBtZXNzYWdlIGJ5IGEgUU5BTUUuCi18Ci18VXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjQ2NzIyQjAzQ0IiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIgotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJGaW5hbCIKLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiU3RhdGljIgotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkRXh0ZW5kcyIKLQkJICAgIHZhbHVlICAgICAgCSIiKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZEltcGxlbWVudHMiCi0JCSAgICB2YWx1ZSAgICAgIAkiIikKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCSAgICB2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpKQotCSAgICBxdWlkICAgICAgIAkiM0UxNjIyRUMwMUExIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgY29uc3RydWN0b3ItcGFyYW1ldGVyLW9yZGVyIGVsZW1lbnQgZGVmaW5lcyB0aGUgb3JkZXIgdGhhdCBjb21wbGV4VHlwZSBlbGVtZW50IHZhbHVlcyBhcmUgYXBwbGllZCB0byBhIEphdmEgZXhjZXB0aW9uIGNvbnN0cnVjdG9yLiBFbGVtZW50IG5hbWVzIGFyZSBzcGVjaWZpZWQgZm9yIGVhY2ggcGFyYW1ldGVyIG9mIHRoZSBjb25zdHJ1Y3RvciwgaW5jbHVkaW5nIGVsZW1lbnQgbmFtZXMgb2YgaW5oZXJpdGVkIHR5cGVzIGlmIG5lY2Vzc2FyeS4KLXwKLXxVc2VkIGluOiBleGNlcHRpb24tbWFwcGluZwotCSAgICAKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3NEYwMjNEIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkphdmFWYXJpYWJsZU5hbWUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjM1QzAyNjIiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNzU2MDM5QiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YVZhcmlhYmxlTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QjM2MjAyOUEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiWE1MRWxlbWVudE5hbWUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjNBMTAzOUQiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNzYyMDM2NiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAieG1sRWxlbWVudE5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUIzN0QwMzlCIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkVsZW1lbnROYW1lIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjIzQjkwMDZCIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgZWxlbWVudC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIGNvbXBsZXhUeXBlIGVsZW1lbnQgbmFtZSBhdHRyaWJ1dGUgdmFsdWUuCi18Ci18VXNlZCBpbjogY29uc3RydWN0b3ItcGFyYW1ldGVyLW9yZGVyCi0JICAgIAotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2Mjc2ODAxMTUiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRleHQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUI1QTIwMkQ0IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIldTRExTZXJ2aWNlTmFtZSIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyNDI5MDNBRCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHdzZGwtc2VydmljZS1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBzZXJ2aWNlIG5hbWUgYnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgc2VydmljZS4KLXwKLXxVc2VkIGluOiBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0NjcyQTcwMTQzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlBvcnRNYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjI0M0UwM0EyIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcG9ydC1tYXBwaW5nIGRlZmluZXMgdGhlIG1hcHBpbmcgb2YgdGhlIFdTREwgcG9ydCBuYW1lIGF0dHJpYnV0ZSB0byB0aGUgSmF2YSBuYW1lIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBtZXRob2QgZ2V0PGphdmEtbmFtZT4uCi18Ci18VXNlZCBpbjogc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZwotCSAgICAKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3NzIwMzBEIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwb3J0TmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCOUVDNzAyRUMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcG9ydC1uYW1lIGlzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBuYW1lIGF0dHJpYnV0ZSBvZiBhIFdTREwgcG9ydCBlbGVtZW50LgotfAotfFVzZWQgaW46IHBvcnQtbWFwcGluZwotfAotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmFQb3J0TmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCOUVDRTAwNzUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgamF2YS1wb3J0LW5hbWUgZWxlbWVudCBpcyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgcG9ydCBuYW1lIGluIEphdmEuICBJdCBpcyB1c2VkIGluIGdlbmVyYXRpbmcgdGhlIEdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBtZXRob2QKLXxnZXQ8amF2YS1wb3J0LW5hbWU+LgotfAotfFVzZWQgaW46IHBvcnQtbWFwcGluZwotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiSmF2YVBvcnROYW1lIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjI0QTMwMUM5IgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2Mjc3ODAwNjMiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmFQb3J0TmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QzA5ODAwRTkiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiV1NETFBvcnRUeXBlIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjI0RUIwMzI2IgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgd3NkbC1wb3J0LXR5cGUgZWxlbWVudCBkZWZpbmVzIHRoZSB3c2RsIHBvcnQgdHlwZQotfGJ5IGEgUU5BTUUgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyAgdGhlIHBvcnQgdHlwZS4KLXwKLXxVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0NjcyQzQwMDgzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIldTRExCaW5kaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjI1MDYwMkExIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgd3NkbC1iaW5kaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBiaW5kaW5nCi18YnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgYmluZGluZy4KLXwKLXxVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0NjczN0EwMDMzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjUxNDAxMjQiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBvZiBKYXZhIG1ldGhvZHMgdG8gb3BlcmF0aW9ucyAod2hpY2ggYXJlIG5vdCB1bmlxdWVseSBxdWFsaWZpZWQgYnkgcW5hbWVzKS4KLXwKLXxUaGUgd3NkbC1vcGVyYXRpb24gc2hvdWxkIGJlIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgcG9ydFR5cGUgYW5kIGJpbmRpbmcgaW4gd2hpY2ggdGhpcyBkZWZpbml0aW9uIGlzIGVtYmVkZGVkIHdpdGhpbi4gU2VlIHRoZSBkZWZpbml0aW9ucyBmb3Igc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyBhbmQgCi18c2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyB0byBhY3F1aXJlIHRoZSBwcm9wZXIgY29udGV4dC4gVGhlIHdyYXBwZWQtZWxlbWVudCBpbmRpY2F0b3Igc2hvdWxkIG9ubHkgYmUgc3BlY2lmaWVkIHdoZW4gYSBXU0RMIG1lc3NhZ2Ugd3JhcHMgYW4gZWxlbWVudCB0eXBlLiAgVGhlIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcgaXMgbm90IHNwZWNpZmllZCBmb3Igb25lLXdheSBvcGVyYXRpb25zLgotfAotfFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcKLQkgICAgCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNzhBMDMxQSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YU1ldGhvZE5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QkExNUQwMDc3IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIGphdmEtbWV0aG9kLW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBuYW1lIG9mIGEgSmF2YSBtZXRob2Qgd2l0aGluIGFuIGludGVyZmFjZS4KLXwKLXxVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid3NkbE9wZXJhdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCQTE2NTAyRjkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgd3NkbC1vcGVyYXRpb24gZWxlbWVudCBkZWZpbmVzIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBXU0RMIGRvY3VtZW50LiBJdCBtdXN0IGJlIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byBhIHBvcnQgdHlwZS4KLXwKLXxVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid3JhcHBlZEVsZW1lbnQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNGNDY3NUJGMDI3NCIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiSmF2YU1ldGhvZE5hbWUiCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjUyOTAwQkUiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNzkwMDMwRSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YU1ldGhvZE5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUMzMTEwMTIxIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIldTRExPcGVyYXRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjUzNjAzQzkiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyNzk3MDM0MCIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid3NkbE9wZXJhdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QzJCNDAxOUMiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjU2QTAxNzEiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBhIEphdmEgbWV0aG9kIHBhcmFtZXRlcnMgYW5kIGEgd3NkbC1tZXNzYWdlLgotfAotfFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLQkgICAgCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyN0E3MDNCQSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1Qb3NpdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCQTI2MDAyQzMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcGFyYW0tcG9zaXRpb24gZWxlbWVudCBkZWZpbmVzIHRoZSBwb3NpdGlvbiBvZiBhIHBhcmFtZXRlciB3aXRoaW4gYSBKYXZhIG1ldGhvZC4gIEl0IG11c3QgYmUgYW4gaW50ZWdlciBzdGFydGluZyBmcm9tIDAuCi18Ci18VXNlZCBpbjogbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbVR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QkEyNjkwMzY2IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHBhcmFtLXR5cGUgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgb2YgYSBwYXJhbWV0ZXIgd2l0aGluIGEgSmF2YSBtZXRob2QuIEl0IG11c3QgYmUgZGVmaW5lZCBieSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MuCi18Ci18VXNlZCBpbjogbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmcKLXwKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIldTRExSZXR1cm5WYWx1ZU1hcHBpbmciCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiRmluYWwiCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJICAgIHZhbHVlICAgICAgCVRSVUUpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZEV4dGVuZHMiCi0JCSAgICB2YWx1ZSAgICAgIAkiIikKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRJbXBsZW1lbnRzIgotCQkgICAgdmFsdWUgICAgICAJIiIpCi0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJICAgIG5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkgICAgdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKSkKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyNTg3MDI0MyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcgIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBmb3IgdGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZS4gSXQgZGVmaW5lcyB0aGUgbWFwcGluZyB0byBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kIGl0cyBwYXJ0LiAgVG9nZXRoZXIgdGhleSBkZWZpbmUgdW5pcXVlbHkgdGhlIG1hcHBpbmcgZm9yIGEgc3BlY2lmaWMgcGFyYW1ldGVyLiBQYXJ0cyB3aXRoaW4gYSBtZXNzYWdlIGNvbnRleHQgYXJlIHVuaXF1ZWx5IAotfGlkZW50aWZpZWQgd2l0aCB0aGVpciBuYW1lcy4gVGhlIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgaXMgbm90Ci18c3BlY2lmaWVkIGlmIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZSBvciBPVVQgcGFyYW1ldGVycy4KLXwKLXxVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nCi0JICAgIAotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjdBRDAxNzQiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1ldGhvZFJldHVyblZhbHVlIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUJBNEY2MDFFOSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBtZXRob2QtcmV0dXJuLXZhbHVlICBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB2b2lkIHR5cGUgZm9yIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgdHlwZS4KLXwKLXxVc2VkIGluOiB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid3NkbE1lc3NhZ2VQYXJ0TmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCQTQxRDAyQjIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxJbnRlcnByZXRhdGlvbiBvZiB0aGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBlbGVtZW50IGRlcGVuZHMgb24gd2hldGhlciBvciBub3Qgd3JhcHBlZC1lbGVtZW50IGhhcyBiZWVuIGRlZmluZWQgaW4gdGhlIHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcuICBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBkZWZpbmVzIGEgV1NETCBtZXNzYWdlIHBhcnQuIEl0IHNob3VsZCBhbHdheXMgYmUgaW50ZXJwcmV0ZXIgd2l0aCByZXNwZWN0IHRvIGEgd3NkbC1tZXNzYWdlIGVsZW1lbnQuIElmIHdyYXBwZWQtZWxlbWVudCBpcyBzcGVjaWZpZWQsIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgcmVmZXJzIHRvIGFuIGVsZW1lbnQKLXxuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuCi18Ci18VXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlBhcmFtUG9zaXRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzRTE2MjVDRjAyRjYiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyN0IzMDBEMiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1Qb3NpdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QzQxMTAwNTkiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiUGFyYW1UeXBlIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjI1RTIwMDg1IgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjdCQzAxQzQiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtVHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QzQxQTAzQzIiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiV1NETE1lc3NhZ2VNYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjI1RkEwMzhCIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgd3NkbC1tZXNzYWdlLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIHRvIGEgc3BlY2lmaWMgbWVzc2FnZSBhbmQgaXRzIHBhcnQuIFRvZ2V0aGVyIHRoZXkgZGVmaW5lIHVuaXF1ZWx5IHRoZSBtYXBwaW5nIGZvciBhIHNwZWNpZmljIHBhcmFtZXRlci4gUGFydHMgd2l0aGluIGEgbWVzc2FnZSBjb250ZXh0IGFyZSB1bmlxdWVseSAKLXxpZGVudGlmaWVkIHdpdGggdGhlaXIgbmFtZXMuCi18Ci18VGhlIHBhcmFtZXRlci1tb2RlIGlzIGRlZmluZWQgYnkgdGhlIG1hcHBpbmcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgbWFwcGluZyB3aWxsIGJlIElOLCBPVVQsIG9yIElOT1VULi4gIFRoZSBwcmVzZW5jZSBvZiB0aGUgc29hcC1oZWFkZXIKLXxlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMgbWFwcGVkIHRvIGEgc29hcCBoZWFkZXIgb25seS4gV2hlbiBhYnNlbnQsIGl0IG1lYW5zIHRoYXQgdGhlIHdzZGwtbWVzc2FnZSBpcyBtYXBwZWQgdG8gYSBKYXZhIHBhcmFtZXRlci4gVGhlIHNvYXAgaGVhZGVycyBhcmUgaW50ZXJwcmV0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCi18cHJvdmlkZWQgaW4gdGhlIG1hcHBpbmcuCi18Ci18VXNlZCBpbjogbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmcKLQkgICAgCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTYyN0MzMDAwQiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid3NkbE1lc3NhZ2VQYXJ0TmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTVCQTJBRDAxOUQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxJbnRlcnByZXRhdGlvbiBvZiB0aGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBlbGVtZW50IGRlcGVuZHMgb24gd2hldGhlciBvciBub3Qgd3JhcHBlZC1lbGVtZW50IGhhcyBiZWVuIGRlZmluZWQgaW4gdGhlIHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcuICBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBkZWZpbmVzIGEgV1NETCBtZXNzYWdlIHBhcnQuIEl0IHNob3VsZCBhbHdheXMgYmUgaW50ZXJwcmV0ZXIgd2l0aCByZXNwZWN0IHRvIGEgd3NkbC1tZXNzYWdlIGVsZW1lbnQuIElmIHdyYXBwZWQtZWxlbWVudCBpcyBzcGVjaWZpZWQsIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgcmVmZXJzIHRvIGFuIGVsZW1lbnQKLXxuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuCi18Ci18VXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbWV0ZXJNb2RlIgotCQkgICAgcXVpZCAgICAgICAJIjNFNUJBMzJGMDFDNCIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBwYXJhbWV0ZXItbW9kZSAgZWxlbWVudCBkZWZpbmVzIHRoZSBtb2RlIG9mIHRoZSBwYXJhbWV0ZXIuIEl0IGNhbiBoYXZlIG9ubHkgdGhyZWUgdmFsdWVzLCBJTiwgT1VULCBJTk9VVC4KLXwKLXxVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZwotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNvYXBIZWFkZXIiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNGNDY3NjVCMDBDQiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiV1NETE1lc3NhZ2VQYXJ0TmFtZSIKLQkgICAgcXVpZCAgICAgICAJIjNFMTYyNjI1MDM5NCIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxNjI3REEwMUM1IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3c2RsTWVzc2FnZVBhcnROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlCNEIzMDA0QyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJQYXJhbWV0ZXJNb2RlIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjI2NDgwMEMxIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjdFMTAxNjEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtZXRlck1vZGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUI0Q0IwMTkwIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIk1ldGhvZFJldHVyblZhbHVlIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjI2N0EwMkYwIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZCIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE2MjdGMDAyQ0EiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1ldGhvZFJldHVyblZhbHVlIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlDMzM2MDExNyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJJbnRlcmZhY2VNYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxNjJCQzIwMEREIgotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCIKLQkgICAgcXVpZCAgICAgICAJIjNFMTg4QjBFMDM3MSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicGFja2FnZU1hcHBpbmdzIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTg4QjEwMDJBQyIKLQkJICAgIGxhYmVsICAgICAgCSJwYWNrYWdlTWFwcGluZ3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlBhY2thZ2VNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMURCMDM2MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkiMSIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4OEIxMDAyQjYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkphdmFXU0RMTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjFDMzAxNjgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIgotCSAgICBxdWlkICAgICAgIAkiM0UxODhFQUYwMUY2IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJyb290VHlwZVFuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTg4RUIwMDNBNiIKLQkJICAgIGxhYmVsICAgICAgCSJyb290VHlwZVFuYW1lIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpSb290VHlwZVFuYW1lIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMjlCMDBDMyIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnN0cmFpbnRzIAkiMiIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4OEVCMDAzQTgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkphdmFYTUxUeXBlTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjFFQjAxNkQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0IgotCSAgICBxdWlkICAgICAgIAkiM0UxODhFQzUwMDg0IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJ2YXJpYWJsZU1hcHBpbmdzIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTg4RUM3MDI3MSIKLQkJICAgIGxhYmVsICAgICAgCSJ2YXJpYWJsZU1hcHBpbmdzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpWYXJpYWJsZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyQjkwMzNCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSI0IgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1IgotCQkgICAgcXVpZCAgICAgICAJIjNFMTg4RUM3MDI3MyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SmF2YVhNTFR5cGVNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMUVCMDE2RCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiCi0JICAgIHF1aWQgICAgICAgCSIzRTE4OTE5NDAwQjkiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImphdmFYTUxUeXBlTWFwcGluZ3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxODkxOTUwMzgyIgotCQkgICAgbGFiZWwgICAgICAJImphdmFYTUxUeXBlTWFwcGluZ3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkphdmFYTUxUeXBlTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjFFQjAxNkQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIjIiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDciCi0JCSAgICBxdWlkICAgICAgIAkiM0UxODkxOTUwMzg0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpKYXZhV1NETE1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIxQzMwMTY4IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCIKLQkgICAgcXVpZCAgICAgICAJIjNFMThBMUFFMDBFQiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZXhjZXB0aW9uTWFwcGluZ3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEExQUYwMDFBIgotCQkgICAgbGFiZWwgICAgICAJImV4Y2VwdGlvbk1hcHBpbmdzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpFeGNlcHRpb25NYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMjAwMDFDNiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkiMyIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkOSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4QTFBRjAwMUMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkphdmFXU0RMTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjFDMzAxNjgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCIKLQkgICAgcXVpZCAgICAgICAJIjNFMThBMUI1MDE5RiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAid3NkbE1lc3NhZ2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEExQjYwMjBFIgotCQkgICAgbGFiZWwgICAgICAJIndzZGxNZXNzYWdlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMTWVzc2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjJFMDAyQkQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb25zdHJhaW50cyAJIjIiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBMUI2MDIxMCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6RXhjZXB0aW9uTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjIwMDAxQzYiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMiIKLQkgICAgcXVpZCAgICAgICAJIjNFMThBMUJCMDNFMiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4QTFCRDAwMzciCi0JCSAgICBsYWJlbCAgICAgIAkiY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjJFQzAxQTEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb25zdHJhaW50cyAJIjMiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBMUJEMDAzOSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6RXhjZXB0aW9uTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjIwMDAxQzYiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNCIKLQkgICAgcXVpZCAgICAgICAJIjNFMThBMUQ4MDA2NiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZWxlbWVudE5hbWVzIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBMURBMDAyMyIKLQkJICAgIGxhYmVsICAgICAgCSJlbGVtZW50TmFtZXMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkVsZW1lbnROYW1lIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyM0I5MDA2QiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOEExREEwMDI1IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMkVDMDFBMSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2IgotCSAgICBxdWlkICAgICAgIAkiM0UxOEE1NDMwMjRFIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJpbnRlcmZhY2VNYXBwaW5ncyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4QTU0NDAzMjIiCi0JCSAgICBsYWJlbCAgICAgIAkiaW50ZXJmYWNlTWFwcGluZ3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkludGVyZmFjZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjJCQzIwMEREIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSI0IgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4QTU0NDAzMjQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkphdmFXU0RMTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjFDMzAxNjgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOCIKLQkgICAgcXVpZCAgICAgICAJIjNFMThBNTY4MDA5NiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAid3NkbFNlcnZpY2VOYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNTY4MDNBRCIKLQkJICAgIGxhYmVsICAgICAgCSJ3c2RsU2VydmljZU5hbWUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExTZXJ2aWNlTmFtZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjQyOTAzQUQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb25zdHJhaW50cyAJIjIiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5IgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNTY4MDNBRiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6U2VydmljZUludGVyZmFjZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyMkQwMDlCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAiCi0JICAgIHF1aWQgICAgICAgCSIzRTE4QTU3NTAwNEUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInBvcnRNYXBwaW5ncyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4QTU3NjAwMUQiCi0JCSAgICBsYWJlbCAgICAgIAkicG9ydE1hcHBpbmdzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpQb3J0TWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjQzRTAzQTIiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIjMiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNTc2MDAyNyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6U2VydmljZUludGVyZmFjZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyMkQwMDlCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjIiCi0JICAgIHF1aWQgICAgICAgCSIzRTE4QTU4MzAyMkQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIndzZGxQb3J0VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4QTU4NzAxNEQiCi0JCSAgICBsYWJlbCAgICAgIAkid3NkbFBvcnRUeXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMUG9ydFR5cGUiCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI0RUIwMzI2IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29uc3RyYWludHMgCSIyIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4QTU4NzAxNTciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyMzgwMjU5IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQiCi0JICAgIHF1aWQgICAgICAgCSIzRTE4QTVCRDAzNkQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIndzZGxCaW5kaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNUJFMDM4RCIKLQkJICAgIGxhYmVsICAgICAgCSJ3c2RsQmluZGluZyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETEJpbmRpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1MDYwMkExIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29uc3RyYWludHMgCSIzIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE4QTVCRTAzOTciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmciCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyMzgwMjU5IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYiCi0JICAgIHF1aWQgICAgICAgCSIzRTE4QTVFMzAzNTEiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzIgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNUU1MDJEMiIKLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjUxNDAxMjQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIjQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3IgotCQkgICAgcXVpZCAgICAgICAJIjNFMThBNUU1MDJEQyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjIzODAyNTkiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOCIKLQkgICAgcXVpZCAgICAgICAJIjNFMTlBMDlFMDA1RCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAibWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlBMDlGMDA0QSIKLQkJICAgIGxhYmVsICAgICAgCSJtZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6Ok1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNTZBMDE3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkiNCIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUEwOUYwMDRDIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNTE0MDEyNCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwIgotCSAgICBxdWlkICAgICAgIAkiM0UxOUEwQTMwMjhBIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJ3c2RsUmV0dXJuVmFsdWVNYXBwaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlBMEE0MDM1NCIKLQkJICAgIGxhYmVsICAgICAgCSJ3c2RsUmV0dXJuVmFsdWVNYXBwaW5nIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNTg3MDI0MyIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnN0cmFpbnRzIAkiNSIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzEiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUEwQTQwMzVFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNTE0MDEyNCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMyIgotCSAgICBxdWlkICAgICAgIAkiM0UxOUExMjEwMDhFIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJ3c2RsTWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTE5QTEyMjAwMTciCi0JCSAgICBsYWJlbCAgICAgIAkid3NkbE1lc3NhZ2UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExNZXNzYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMkUwMDJCRCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnN0cmFpbnRzIAkiMiIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzMiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUExMjIwMDIyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNTg3MDI0MyIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM0IgotCSAgICBxdWlkICAgICAgIAkiM0UxOUE1RDQwMUNBIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJ3c2RsTWVzc2FnZU1hcHBpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUE1RDUwMDhCIgotCQkgICAgbGFiZWwgICAgICAJIndzZGxNZXNzYWdlTWFwcGluZyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETE1lc3NhZ2VNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNUZBMDM4QiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnN0cmFpbnRzIAkiMyIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzUiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUE1RDUwMDhEIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpNZXRob2RQYXJhbVBhcnRzTWFwcGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjU2QTAxNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNiIKLQkgICAgcXVpZCAgICAgICAJIjNFMTlBNURCMDAxMSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAid3NkbE1lc3NhZ2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0UxOUE1REIwMzgzIgotCQkgICAgbGFiZWwgICAgICAJIndzZGxNZXNzYWdlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMTWVzc2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjJFMDAyQkQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb25zdHJhaW50cyAJIjEiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM3IgotCQkgICAgcXVpZCAgICAgICAJIjNFMTlBNURCMDM4RSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETE1lc3NhZ2VNYXBwaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNUZBMDM4QiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKSkKLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiUGFja2FnZU1hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE4OEE1QTAyQ0IiCi0JICAgIHRpdGxlICAgICAgCSJQYWNrYWdlTWFwcGluZyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6UGFja2FnZU1hcHBpbmciIEAxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNTYsIDIwOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxCi0JCQlsb2NhdGlvbiAgIAkoODI2LCAxMDApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDYwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUGFja2FnZU1hcHBpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMURCMDM2MCIKLQkJICAgIHdpZHRoICAgICAgCTQ3OAotCQkgICAgaGVpZ2h0ICAgICAJMjM2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SmF2YVdTRExNYXBwaW5nIiBAMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMDQsIDIwOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoMTA5LCAxNDEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzkwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVdTRExNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjFDMzAxNjgiCi0JCSAgICB3aWR0aCAgICAgIAk0MDgKLQkJICAgIGhlaWdodCAgICAgCTE1NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAzCi0JCSAgICBsb2NhdGlvbiAgIAkoNjYyLCAyMDgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE4OEIwRTAzNzEiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhY2thZ2VNYXBwaW5ncyIgQDQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzYyLCAwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANQotCQkJCVBhcmVudF9WaWV3IAlANAotCQkJCWxvY2F0aW9uICAgCSg3MTYsIDg3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI5NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhY2thZ2VNYXBwaW5ncyIKLQkJCQlwY3REaXN0ICAgIAkwLjM0OTcyNwotCQkJCWhlaWdodCAgICAgCTEyMgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTg4QjEwMDJBQyIKLQkJCSAgICBjbGllbnQgICAgIAlAMwotCQkJICAgIHN1cHBsaWVyICAgCUAxCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYKLQkJCQlQYXJlbnRfVmlldyAJQDQKLQkJCQlsb2NhdGlvbiAgIAkoNzQ0LCAxNTEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC41MzU1MTkKLQkJCQloZWlnaHQgICAgIAk1OAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcKLQkJCQlQYXJlbnRfVmlldyAJQDQKLQkJCQlsb2NhdGlvbiAgIAkoNzg2LCAyNTMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJInsxfSIKLQkJCQlwY3REaXN0ICAgIAkwLjgxNDIwOAotCQkJCWhlaWdodCAgICAgCTQ1Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzYyLCAwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxODhCMTAwMkI2IgotCQkJICAgIGNsaWVudCAgICAgCUAzCi0JCQkgICAgc3VwcGxpZXIgICAJQDIKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOQotCQkJCVBhcmVudF9WaWV3IAlAOAotCQkJCWxvY2F0aW9uICAgCSg1MjMsIDI2MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMTA5OQotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiSmF2YVhNTFR5cGVNYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxODhCRjAwMTRBIgotCSAgICB0aXRsZSAgICAgIAkiSmF2YVhNTFR5cGVNYXBwaW5nIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpSb290VHlwZVFuYW1lIiBAMTAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTE4NCwgNzIwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwCi0JCQlsb2NhdGlvbiAgIAkoMTAxOCwgNjc4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlJvb3RUeXBlUW5hbWUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMjlCMDBDMyIKLQkJICAgIHdpZHRoICAgICAgCTM1MAotCQkgICAgaGVpZ2h0ICAgICAJMTA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6VmFyaWFibGVNYXBwaW5nIiBAMTEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTE4NCwgMTIzMikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMQotCQkJbG9jYXRpb24gICAJKDkyMywgMTA2MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJWYXJpYWJsZU1hcHBpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMkI5MDMzQiIKLQkJICAgIHdpZHRoICAgICAgCTU0MAotCQkgICAgaGVpZ2h0ICAgICAJMzU4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SmF2YVhNTFR5cGVNYXBwaW5nIiBAMTIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzIwLCA4NDgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTIKLQkJCWxvY2F0aW9uICAgCSgxNCwgNzIwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYxMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFYTUxUeXBlTWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIxRUIwMTZEIgotCQkgICAgd2lkdGggICAgICAJNjMwCi0JCSAgICBoZWlnaHQgICAgIAkyNzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMTMKLQkJICAgIGxvY2F0aW9uICAgCSg4MjEsIDc3MykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTg4RUFGMDFGNiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGVRbmFtZSIgQDE0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMwotCQkJICAgIGxvY2F0aW9uICAgCSg1MDUsIC03NSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNAotCQkJCWxvY2F0aW9uICAgCSg4OTAsIDcyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNjIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIityb290VHlwZVFuYW1lIgotCQkJCXBjdERpc3QgICAgCTAuNDAzMjMwCi0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4OEVCMDAzQTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDEzCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNAotCQkJCWxvY2F0aW9uICAgCSg5NTYsIDY5MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjc2NzM2MAotCQkJCWhlaWdodCAgICAgCTY0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcKLQkJCQlQYXJlbnRfVmlldyAJQDE0Ci0JCQkJbG9jYXRpb24gICAJKDk4NCwgNjgyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTUwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7Mn0iCi0JCQkJcGN0RGlzdCAgICAJMC45MjUzMDQKLQkJCQloZWlnaHQgICAgIAk2OAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEAxOAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTA1LCAtNzUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4OEVCMDAzQTgiCi0JCQkgICAgY2xpZW50ICAgICAJQDEzCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Ci0JCQkJUGFyZW50X1ZpZXcgCUAxOAotCQkJCWxvY2F0aW9uICAgCSg2NjMsIDg1MSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5NjAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBAMjAKLQkJICAgIGxvY2F0aW9uICAgCSg3NzEsIDEwNDgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE4OEVDNTAwODQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInZhcmlhYmxlTWFwcGluZ3MiIEAyMQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjAKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDUwLCAxOTkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMgotCQkJCVBhcmVudF9WaWV3IAlAMjEKLQkJCQlsb2NhdGlvbiAgIAkoODEyLCAxMTQ5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI5MgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3ZhcmlhYmxlTWFwcGluZ3MiCi0JCQkJcGN0RGlzdCAgICAJMC41MTA2NDgKLQkJCQloZWlnaHQgICAgIAk3NgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTg4RUM3MDI3MSIKLQkJCSAgICBjbGllbnQgICAgIAlAMjAKLQkJCSAgICBzdXBwbGllciAgIAlAMTEKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMKLQkJCQlQYXJlbnRfVmlldyAJQDIxCi0JCQkJbG9jYXRpb24gICAJKDg0NywgMTEwMykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjU5NDg3NAotCQkJCWhlaWdodCAgICAgCTIwCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQKLQkJCQlQYXJlbnRfVmlldyAJQDIxCi0JCQkJbG9jYXRpb24gICAJKDc5NCwgMTExNykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezR9IgotCQkJCXBjdERpc3QgICAgCTAuMzEwODYzCi0JCQkJaGVpZ2h0ICAgICAJNTUKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAMjUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwCi0JCQkgICAgbG9jYXRpb24gICAJKDQ1MCwgMTk5KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxODhFQzcwMjczIgotCQkJICAgIGNsaWVudCAgICAgCUAyMAotCQkJICAgIHN1cHBsaWVyICAgCUAxMgotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNgotCQkJCVBhcmVudF9WaWV3IAlAMjUKLQkJCQlsb2NhdGlvbiAgIAkoNjY2LCA5NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44OTYzMTIKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SmF2YVdTRExNYXBwaW5nIiBAMjcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjcyLCAxNjApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjcKLQkJCWxvY2F0aW9uICAgCSg3NywgOTMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzkwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVdTRExNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjFDMzAxNjgiCi0JCSAgICB3aWR0aCAgICAgIAk0MDgKLQkJICAgIGhlaWdodCAgICAgCTE1NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEAyOAotCQkgICAgbG9jYXRpb24gICAJKDI5MywgNDczKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxODkxOTQwMEI5IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhWE1MVHlwZU1hcHBpbmdzIiBAMjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Ci0JCQkgICAgbG9jYXRpb24gICAJKDIxLCAzMjApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMAotCQkJCVBhcmVudF9WaWV3IAlAMjkKLQkJCQlsb2NhdGlvbiAgIAkoMjY3LCA2NjUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzcwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIramF2YVhNTFR5cGVNYXBwaW5ncyIKLQkJCQlwY3REaXN0ICAgIAkwLjc5Nzc1MwotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxODkxOTUwMzgyIgotCQkJICAgIGNsaWVudCAgICAgCUAyOAotCQkJICAgIHN1cHBsaWVyICAgCUAxMgotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMQotCQkJCVBhcmVudF9WaWV3IAlAMjkKLQkJCQlsb2NhdGlvbiAgIAkoMzYyLCA2ODEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC44OTg4NzYKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDY3NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezJ9IgotCQkJCXBjdERpc3QgICAgCTAuODk4ODc2Ci0JCQkJaGVpZ2h0ICAgICAJMTA4Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNyIgQDMzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOAotCQkJICAgIGxvY2F0aW9uICAgCSgyMSwgMzIwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxODkxOTUwMzg0IgotCQkJICAgIGNsaWVudCAgICAgCUAyOAotCQkJICAgIHN1cHBsaWVyICAgCUAyNwotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNAotCQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCQlsb2NhdGlvbiAgIAkoMzMzLCAyNTgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44OTg0OTYKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UU5hbWUiIEAzNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTg0LCAyMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzUKLQkJCWxvY2F0aW9uICAgCSg4OTgsIDc3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlFOYW1lIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjEKLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiCi0JCSAgICB3aWR0aCAgICAgIAk1OTAKLQkJICAgIGhlaWdodCAgICAgCTMxNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjQ2NzQ0QTAyN0MiCi0JCSAgICBjbGllbnQgICAgIAlAMTAKLQkJICAgIHN1cHBsaWVyICAgCUAzNQotCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFeGNlcHRpb25NYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxODkzNEIwMzlGIgotCSAgICB0aXRsZSAgICAgIAkiRXhjZXB0aW9uTWFwcGluZyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SmF2YVdTRExNYXBwaW5nIiBAMzcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA0LCAxMjgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzcKLQkJCWxvY2F0aW9uICAgCSgxMDksIDYxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFXU0RMTWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIxQzMwMTY4IgotCQkgICAgd2lkdGggICAgICAJNDA4Ci0JCSAgICBoZWlnaHQgICAgIAkxNTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpXU0RMTWVzc2FnZSIgQDM4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNzIsIDY1NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzOAotCQkJbG9jYXRpb24gICAJKDkyMywgNjE0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI5OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIldTRExNZXNzYWdlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjJFMDAyQkQiCi0JCSAgICB3aWR0aCAgICAgIAkzMTYKLQkJICAgIGhlaWdodCAgICAgCTEwNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkV4Y2VwdGlvbk1hcHBpbmciIEAzOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMDQsIDY1NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzOQotCQkJbG9jYXRpb24gICAJKDcsIDU0OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1OTQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFeGNlcHRpb25NYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjIwMDAxQzYiCi0JCSAgICB3aWR0aCAgICAgIAk2MTIKLQkJICAgIGhlaWdodCAgICAgCTIzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgiIEA0MAotCQkgICAgbG9jYXRpb24gICAJKDMwNCwgMzcxKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxOEExQUUwMEVCIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJleGNlcHRpb25NYXBwaW5ncyIgQDQxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MAotCQkJICAgIGxvY2F0aW9uICAgCSgwLCAyNTApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MgotCQkJCVBhcmVudF9WaWV3IAlANDEKLQkJCQlsb2NhdGlvbiAgIAkoMjY1LCA0NzUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzIzCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZXhjZXB0aW9uTWFwcGluZ3MiCi0JCQkJcGN0RGlzdCAgICAJMC42MzEwMTYKLQkJCQloZWlnaHQgICAgIAk0MAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBMUFGMDAxQSIKLQkJCSAgICBjbGllbnQgICAgIAlANDAKLQkJCSAgICBzdXBwbGllciAgIAlAMzkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMKLQkJCQlQYXJlbnRfVmlldyAJQDQxCi0JCQkJbG9jYXRpb24gICAJKDM1OCwgNTE5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTY4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuODkzMDQ4Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NAotCQkJCVBhcmVudF9WaWV3IAlANDEKLQkJCQlsb2NhdGlvbiAgIAkoNDEyLCA1MTkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJInszfSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5MzA0OAotCQkJCWhlaWdodCAgICAgCTEwOAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkiIEA0NQotCQkJICAgIFBhcmVudF9WaWV3IAlANDAKLQkJCSAgICBsb2NhdGlvbiAgIAkoMCwgMjUwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEExQUYwMDFDIgotCQkJICAgIGNsaWVudCAgICAgCUA0MAotCQkJICAgIHN1cHBsaWVyICAgCUAzNwotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NgotCQkJCVBhcmVudF9WaWV3IAlANDUKLQkJCQlsb2NhdGlvbiAgIAkoMzU4LCAyMjMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44OTI0NzMKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAiIEA0NwotCQkgICAgbG9jYXRpb24gICAJKDc2MSwgNjU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxOEExQjUwMTlGIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3c2RsTWVzc2FnZSIgQDQ4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NwotCQkJICAgIGxvY2F0aW9uICAgCSg0NjEsIC02KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkKLQkJCQlQYXJlbnRfVmlldyAJQDQ4Ci0JCQkJbG9jYXRpb24gICAJKDc4NCwgNjE4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3dzZGxNZXNzYWdlIgotCQkJCXBjdERpc3QgICAgCTAuMTU2NDYzCi0JCQkJaGVpZ2h0ICAgICAJMzkKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTFCNjAyMEUiCi0JCQkgICAgY2xpZW50ICAgICAJQDQ3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDM4Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwCi0JCQkJUGFyZW50X1ZpZXcgCUA0OAotCQkJCWxvY2F0aW9uICAgCSg4OTYsIDcxMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5NjU1MgotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTEKLQkJCQlQYXJlbnRfVmlldyAJQDQ4Ci0JCQkJbG9jYXRpb24gICAJKDg2MiwgNzAxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTUwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7Mn0iCi0JCQkJcGN0RGlzdCAgICAJMC42NjY2NjcKLQkJCQloZWlnaHQgICAgIAk0NQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExIiBANTIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3Ci0JCQkgICAgbG9jYXRpb24gICAJKDQ2MSwgLTYpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTFCNjAyMTAiCi0JCQkgICAgY2xpZW50ICAgICAJQDQ3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDM5Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzCi0JCQkJUGFyZW50X1ZpZXcgCUA1MgotCQkJCWxvY2F0aW9uICAgCSg2MjYsIDcxMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5ODYzNQotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpFbGVtZW50TmFtZSIgQDU0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4ODgsIDE0MjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANTQKLQkJCWxvY2F0aW9uICAgCSgxNzM4LCAxMzM2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVsZW1lbnROYW1lIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjNCOTAwNkIiCi0JCSAgICB3aWR0aCAgICAgIAkzMTgKLQkJICAgIGhlaWdodCAgICAgCTE5NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiIEA1NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTUyLCAxMDg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDU1Ci0JCQlsb2NhdGlvbiAgIAkoOTAyLCAxMDIxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMkVDMDFBMSIKLQkJICAgIHdpZHRoICAgICAgCTUxOAotCQkgICAgaGVpZ2h0ICAgICAJMTU0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIiIEA1NgotCQkgICAgbG9jYXRpb24gICAJKDc2OCwgODkyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxOEExQkIwM0UyIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIiBANTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDU2Ci0JCQkgICAgbG9jYXRpb24gICAJKDQ2MywgMjM1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgKLQkJCQlQYXJlbnRfVmlldyAJQDU3Ci0JCQkJbG9jYXRpb24gICAJKDY4OCwgOTk3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQyMgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiCi0JCQkJcGN0RGlzdCAgICAJLTAuMTAyMDAzCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEExQkQwMDM3IgotCQkJICAgIGNsaWVudCAgICAgCUA1NgotCQkJICAgIHN1cHBsaWVyICAgCUA1NQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OQotCQkJCVBhcmVudF9WaWV3IAlANTcKLQkJCQlsb2NhdGlvbiAgIAkoMTAzOSwgOTgwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTY4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTEuMDgyMTMxCi0JCQkJaGVpZ2h0ICAgICAJNDUKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MAotCQkJCVBhcmVudF9WaWV3IAlANTcKLQkJCQlsb2NhdGlvbiAgIAkoOTgzLCA5NDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJInszfSIKLQkJCQlwY3REaXN0ICAgIAkwLjgxNzY3NwotCQkJCWhlaWdodCAgICAgCTU1Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMiIEA2MQotCQkJICAgIFBhcmVudF9WaWV3IAlANTYKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDYzLCAyMzUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTFCRDAwMzkiCi0JCQkgICAgY2xpZW50ICAgICAJQDU2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDM5Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYyCi0JCQkJUGFyZW50X1ZpZXcgCUA2MQotCQkJCWxvY2F0aW9uICAgCSg1ODQsIDczOSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5NjE5NAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNCIgQDYzCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyNSwgMTI1NykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMThBMUQ4MDA2NiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudE5hbWVzIiBANjQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDYzCi0JCQkgICAgbG9jYXRpb24gICAJKDMyMywgLTE2NykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY1Ci0JCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJCWxvY2F0aW9uICAgCSgxNzE4LCAxMjY0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VsZW1lbnROYW1lcyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwNDc4MgotCQkJCWhlaWdodCAgICAgCTc1Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEExREEwMDIzIgotCQkJICAgIGNsaWVudCAgICAgCUA2MwotCQkJICAgIHN1cHBsaWVyICAgCUA1NAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NgotCQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCQlsb2NhdGlvbiAgIAkoMTY3MiwgMTM3NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjgxMDU4MgotCQkJCWhlaWdodCAgICAgCTQ2Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUiIEA2NwotCQkJICAgIFBhcmVudF9WaWV3IAlANjMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzIzLCAtMTY3KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEExREEwMDI1IgotCQkJICAgIGNsaWVudCAgICAgCUA2MwotCQkJICAgIHN1cHBsaWVyICAgCUA1NQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OAotCQkJCVBhcmVudF9WaWV3IAlANjcKLQkJCQlsb2NhdGlvbiAgIAkoMTMyMSwgMTIyMykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMjI1NgotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSIgQDY5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE2MDAsIDE5MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJbG9jYXRpb24gICAJKDEzMTQsIDQ1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlFOYW1lIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjEKLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiCi0JCSAgICB3aWR0aCAgICAgIAk1OTAKLQkJICAgIGhlaWdodCAgICAgCTMxNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzAKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjQ2NzIyQjAzQ0IiCi0JCSAgICBjbGllbnQgICAgIAlAMzgKLQkJICAgIHN1cHBsaWVyICAgCUA2OQotCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJJbnRlcmZhY2VNYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxOEEzRjUwMDAyIgotCSAgICB0aXRsZSAgICAgIAkiSW50ZXJmYWNlTWFwcGluZyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTIwMDEKLQkgICAgb3JpZ2luX3kgICAJMTY2OQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIgQDcxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIxMTIsIDIzMzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzEKLQkJCWxvY2F0aW9uICAgCSgxODA2LCAyMjA4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYxMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNTE0MDEyNCIKLQkJICAgIHdpZHRoICAgICAgCTYzMAotCQkgICAgaGVpZ2h0ICAgICAJMjc2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETFBvcnRUeXBlIiBANzIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA2NCwgMTUwNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3MgotCQkJbG9jYXRpb24gICAJKDE5MDksIDE0NjIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzEwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiV1NETFBvcnRUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjRFQjAzMjYiCi0JCSAgICB3aWR0aCAgICAgIAkzMjgKLQkJICAgIGhlaWdodCAgICAgCTEwNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExCaW5kaW5nIiBANzMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA2NCwgMTg4OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3MwotCQkJbG9jYXRpb24gICAJKDE5MjEsIDE4NDYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjg2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiV1NETEJpbmRpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNTA2MDJBMSIKLQkJICAgIHdpZHRoICAgICAgCTMwNAotCQkgICAgaGVpZ2h0ICAgICAJMTA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyIgQDc0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDExMjAsIDE1MDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzQKLQkJCWxvY2F0aW9uICAgCSg4MDEsIDE0MTYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjM4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIyMzgwMjU5IgotCQkgICAgd2lkdGggICAgICAJNjU2Ci0JCSAgICBoZWlnaHQgICAgIAkxOTYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNiIgQDc1Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTU5MiwgMTg5OSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMThBNUUzMDM1MSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MiIEA3NgotCQkJICAgIFBhcmVudF9WaWV3IAlANzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDc5LCAzOTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NwotCQkJCVBhcmVudF9WaWV3IAlANzYKLQkJCQlsb2NhdGlvbiAgIAkoMTY3MiwgMjE5NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk1MDgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyIKLQkJCQlwY3REaXN0ICAgIAkwLjU0MzAwNgotCQkJCWhlaWdodCAgICAgCTE3NQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBNUU1MDJEMiIKLQkJCSAgICBjbGllbnQgICAgIAlANzUKLQkJCSAgICBzdXBwbGllciAgIAlANzEKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgKLQkJCQlQYXJlbnRfVmlldyAJQDc2Ci0JCQkJbG9jYXRpb24gICAJKDE2OTIsIDIxNTgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC41MjI4MzYKLQkJCQloZWlnaHQgICAgIAkxMzQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQotCQkJCVBhcmVudF9WaWV3IAlANzYKLQkJCQlsb2NhdGlvbiAgIAkoMTg0MywgMjE1MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezR9IgotCQkJCXBjdERpc3QgICAgCTAuNzY1NjkxCi0JCQkJaGVpZ2h0ICAgICAJMzMKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNyIgQDgwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3NQotCQkJICAgIGxvY2F0aW9uICAgCSg0NzksIDM5NCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBNUU1MDJEQyIKLQkJCSAgICBjbGllbnQgICAgIAlANzUKLQkJCSAgICBzdXBwbGllciAgIAlANzQKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEKLQkJCQlQYXJlbnRfVmlldyAJQDgwCi0JCQkJbG9jYXRpb24gICAJKDEzMDgsIDE1OTQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44OTU1ODIKLQkJCQloZWlnaHQgICAgIAk1MgotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIiIEA4MgotCQkgICAgbG9jYXRpb24gICAJKDE2NzMsIDE1MDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTU4MzAyMkQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIndzZGxQb3J0VHlwZSIgQDgzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4MgotCQkJICAgIGxvY2F0aW9uICAgCSg1NDcsIDIpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NAotCQkJCVBhcmVudF9WaWV3IAlAODMKLQkJCQlsb2NhdGlvbiAgIAkoMTg0MywgMTQzMykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMzEKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIit3c2RsUG9ydFR5cGUiCi0JCQkJcGN0RGlzdCAgICAJMC43NTUxODcKLQkJCQloZWlnaHQgICAgIAk3MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBNTg3MDE0RCIKLQkJCSAgICBjbGllbnQgICAgIAlAODIKLQkJCSAgICBzdXBwbGllciAgIAlANzIKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUKLQkJCQlQYXJlbnRfVmlldyAJQDgzCi0JCQkJbG9jYXRpb24gICAJKDE4NzcsIDE1NDMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDY3MDQKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2Ci0JCQkJUGFyZW50X1ZpZXcgCUA4MwotCQkJCWxvY2F0aW9uICAgCSgxODM5LCAxNDcxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7Mn0iCi0JCQkJcGN0RGlzdCAgICAJMC43MzQwMTYKLQkJCQloZWlnaHQgICAgIAkzNAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzIiBAODcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDgyCi0JCQkgICAgbG9jYXRpb24gICAJKDU0NywgMikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBNTg3MDE1NyIKLQkJCSAgICBjbGllbnQgICAgIAlAODIKLQkJCSAgICBzdXBwbGllciAgIAlANzQKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgKLQkJCQlQYXJlbnRfVmlldyAJQDg3Ci0JCQkJbG9jYXRpb24gICAJKDE0NzEsIDE0NTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDE5NjEKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQiIEA4OQotCQkgICAgbG9jYXRpb24gICAJKDE2NDgsIDE3MTgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTAKLQkJCVBhcmVudF9WaWV3IAlAODkKLQkJCWxvY2F0aW9uICAgCSgxNjQ4LCAxNjU5KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJOAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQloaWRkZW4gICAgIAlUUlVFCi0JCQlhbmNob3IgICAgIAkxCi0JCQlhbmNob3JfbG9jIAkxCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIiIKLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQloZWlnaHQgICAgIAk2MAotCQkJb3JpZW50YXRpb24gCTApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxOEE1QkQwMzZEIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3c2RsQmluZGluZyIgQDkxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4OQotCQkJICAgIGxvY2F0aW9uICAgCSg1MjAsIDIyMSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyCi0JCQkJUGFyZW50X1ZpZXcgCUA5MQotCQkJCWxvY2F0aW9uICAgCSgyMDUxLCAxNzkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIwNAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3dzZGxCaW5kaW5nIgotCQkJCXBjdERpc3QgICAgCTEuMjk3ODQ3Ci0JCQkJaGVpZ2h0ICAgICAJODQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTVCRTAzOEQiCi0JCQkgICAgY2xpZW50ICAgICAJQDg5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDczCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzCi0JCQkJUGFyZW50X1ZpZXcgCUA5MQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxODQ4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODY5Njk0Ci0JCQkJaGVpZ2h0ICAgICAJMzAKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NAotCQkJCVBhcmVudF9WaWV3IAlAOTEKLQkJCQlsb2NhdGlvbiAgIAkoMTg5MSwgMTc4MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezN9IgotCQkJCXBjdERpc3QgICAgCTAuODAxNTgyCi0JCQkJaGVpZ2h0ICAgICAJMzQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNSIgQDk1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA4OQotCQkJICAgIGxvY2F0aW9uICAgCSg1MjAsIDIyMSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBNUJFMDM5NyIKLQkJCSAgICBjbGllbnQgICAgIAlAODkKLQkJCSAgICBzdXBwbGllciAgIAlANzQKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTYKLQkJCQlQYXJlbnRfVmlldyAJQDk1Ci0JCQkJbG9jYXRpb24gICAJKDE0MTMsIDE1NjcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44OTE2NDAKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6SW50ZXJmYWNlTWFwcGluZyIgQDk3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI4OCwgMTA4OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA5NwotCQkJbG9jYXRpb24gICAJKDExMywgMTA0NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbnRlcmZhY2VNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MkJDMjAwREQiCi0JCSAgICB3aWR0aCAgICAgIAkzNjgKLQkJICAgIGhlaWdodCAgICAgCTEwNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OkphdmFXU0RMTWFwcGluZyIgQDk4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI4OCwgMTI4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDk4Ci0JCQlsb2NhdGlvbiAgIAkoOTMsIDYxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFXU0RMTWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjIxQzMwMTY4IgotCQkgICAgd2lkdGggICAgICAJNDA4Ci0JCSAgICBoZWlnaHQgICAgIAkxNTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNiIgQDk5Ci0JCSAgICBsb2NhdGlvbiAgIAkoMjg4LCA2MjApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTU0MzAyNEUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImludGVyZmFjZU1hcHBpbmdzIiBAMTAwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5OQotCQkJICAgIGxvY2F0aW9uICAgCSgwLCA0OTYpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDEKLQkJCQlQYXJlbnRfVmlldyAJQDEwMAotCQkJCWxvY2F0aW9uICAgCSgyNDgsIDk1MSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyOTYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbnRlcmZhY2VNYXBwaW5ncyIKLQkJCQlwY3REaXN0ICAgIAkwLjc5ODUyNgotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEE1NDQwMzIyIgotCQkJICAgIGNsaWVudCAgICAgCUA5OQotCQkJICAgIHN1cHBsaWVyICAgCUA5NwotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIKLQkJCQlQYXJlbnRfVmlldyAJQDEwMAotCQkJCWxvY2F0aW9uICAgCSgzNDIsIDk5MykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjg5OTI2MwotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDAKLQkJCQlsb2NhdGlvbiAgIAkoMzk2LCA5OTMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIns0fSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5OTI2MwotCQkJCWhlaWdodCAgICAgCTEwOAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3IiBAMTA0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA5OQotCQkJICAgIGxvY2F0aW9uICAgCSgwLCA0OTYpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTU0NDAzMjQiCi0JCQkgICAgY2xpZW50ICAgICAJQDk5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDk4Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNQotCQkJCVBhcmVudF9WaWV3IAlAMTA0Ci0JCQkJbG9jYXRpb24gICAJKDM0MiwgMjQ3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODk5MjYzCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExTZXJ2aWNlTmFtZSIgQDEwNgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxOTg0LCA3MzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTA2Ci0JCQlsb2NhdGlvbiAgIAkoMTc5NSwgNjk0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM3OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIldTRExTZXJ2aWNlTmFtZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI0MjkwM0FEIgotCQkgICAgd2lkdGggICAgICAJMzk2Ci0JCSAgICBoZWlnaHQgICAgIAkxMDQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpQb3J0TWFwcGluZyIgQDEwNwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxOTIwLCAxMDcyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwNwotCQkJbG9jYXRpb24gICAJKDE2OTgsIDk2NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQb3J0TWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI0M0UwM0EyIgotCQkgICAgd2lkdGggICAgICAJNDYyCi0JCSAgICBoZWlnaHQgICAgIAkyMzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyIgQDEwOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDQwLCA3MzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTA4Ci0JCQlsb2NhdGlvbiAgIAkoNzk5LCA2NDkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDgyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZUludGVyZmFjZU1hcHBpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMjJEMDA5QiIKLQkJICAgIHdpZHRoICAgICAgCTUwMAotCQkgICAgaGVpZ2h0ICAgICAJMTk0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEAxMDkKLQkJICAgIGxvY2F0aW9uICAgCSgxNTM3LCA3MzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTU2ODAwOTYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIndzZGxTZXJ2aWNlTmFtZSIgQDExMAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5Ci0JCQkgICAgbG9jYXRpb24gICAJKDQ4NywgMCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMQotCQkJCVBhcmVudF9WaWV3IAlAMTEwCi0JCQkJbG9jYXRpb24gICAJKDE3MzMsIDYzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyOTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIit3c2RsU2VydmljZU5hbWUiCi0JCQkJcGN0RGlzdCAgICAJMC43ODg1NDYKLQkJCQloZWlnaHQgICAgIAkxMDUKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTU2ODAzQUQiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwOQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDYKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTAKLQkJCQlsb2NhdGlvbiAgIAkoMTc1OCwgNzkwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODkzNzUwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMKLQkJCQlQYXJlbnRfVmlldyAJQDExMAotCQkJCWxvY2F0aW9uICAgCSgxNzQxLCA3MDIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJInsyfSIKLQkJCQlwY3REaXN0ICAgIAkwLjgyODE5NAotCQkJCWhlaWdodCAgICAgCTM1Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkiIEAxMTQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOQotCQkJICAgIGxvY2F0aW9uICAgCSg0ODcsIDApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE4QTU2ODAzQUYiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwOQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDgKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTMxNiwgNzkwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODk5MzcxCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwIiBAMTE2Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4OSwgOTA2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxOEE1NzUwMDRFIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwb3J0TWFwcGluZ3MiIEAxMTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDExNgotCQkJICAgIGxvY2F0aW9uICAgCSg0NTYsIDE2OCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOAotCQkJCVBhcmVudF9WaWV3IAlAMTE3Ci0JCQkJbG9jYXRpb24gICAJKDE2NjAsIDkzMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMjEKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitwb3J0TWFwcGluZ3MiCi0JCQkJcGN0RGlzdCAgICAJMC43OTM4MDQKLQkJCQloZWlnaHQgICAgIAk0MAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMThBNTc2MDAxRCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTE2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDEwNwotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkKLQkJCQlQYXJlbnRfVmlldyAJQDExNwotCQkJCWxvY2F0aW9uICAgCSgxNjQ5LCAxMDIzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTY4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuODk5MzIyCi0JCQkJaGVpZ2h0ICAgICAJNTIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjAKLQkJCQlQYXJlbnRfVmlldyAJQDExNwotCQkJCWxvY2F0aW9uICAgCSgxNjMwLCAxMDc0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7M30iCi0JCQkJcGN0RGlzdCAgICAJMC44OTk1MTYKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMSIgQDEyMQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2Ci0JCQkgICAgbG9jYXRpb24gICAJKDQ1NiwgMTY4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOEE1NzYwMDI3IgotCQkJICAgIGNsaWVudCAgICAgCUAxMTYKLQkJCSAgICBzdXBwbGllciAgIAlAMTA4Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMgotCQkJCVBhcmVudF9WaWV3IAlAMTIxCi0JCQkJbG9jYXRpb24gICAJKDEzMjksIDc5MSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5ODAwNAotCQkJCWhlaWdodCAgICAgCTUyCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyMwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNUI5QjY3MDMyNSIKLQkJICAgIGNsaWVudCAgICAgCUAxMDgKLQkJICAgIHN1cHBsaWVyICAgCUA5NwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U1QjlDOTIwMkVEIgotCQkgICAgY2xpZW50ICAgICAJQDc0Ci0JCSAgICBzdXBwbGllciAgIAlAOTcKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSIgQDEyNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxOTg0LCAyNDApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTgKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTI1Ci0JCQlsb2NhdGlvbiAgIAkoMTY5NywgOTMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTc0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUU5hbWUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc2NjQyMQotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIKLQkJICAgIHdpZHRoICAgICAgCTU5MgotCQkgICAgaGVpZ2h0ICAgICAJMzE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjQ2NzJBNzAxNDMiCi0JCSAgICBjbGllbnQgICAgIAlAMTA2Ci0JCSAgICBzdXBwbGllciAgIAlAMTI1Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjQ2NzJDNDAwODMiCi0JCSAgICBjbGllbnQgICAgIAlANzIKLQkJICAgIHN1cHBsaWVyICAgCUAxMjUKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDIyMjgsIDE1MDQpCi0JCQkoMjY4NiwgMTUwNCkKLQkJCSgyNjc5LCAyMzgpCi0JCQkoMjI4MCwgMjM5KSkKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyOAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNDY3MzdBMDAzMyIKLQkJICAgIGNsaWVudCAgICAgCUA3MwotCQkgICAgc3VwcGxpZXIgICAJQDEyNQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMjIxNiwgMTg4NykKLQkJCSgyNTg2LCAxODg3KQotCQkJKDI1ODYsIDIzNykKLQkJCSgyMjgwLCAyMzgpKQotCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0UxOTlDNTEwMDA5IgotCSAgICB0aXRsZSAgICAgIAkiU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTE1ODkKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciIEAxMjkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc0NCwgNTc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEyOQotCQkJbG9jYXRpb24gICAJKDE0NzgsIDQ2OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXRob2RQYXJhbVBhcnRzTWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1NkEwMTcxIgotCQkgICAgd2lkdGggICAgICAJNTUwCi0JCSAgICBoZWlnaHQgICAgIAkyMzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIiBAMTMwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM2OCwgNTc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEzMAotCQkJbG9jYXRpb24gICAJKDYyLCA0NDgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjEyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxNjI1MTQwMTI0IgotCQkgICAgd2lkdGggICAgICAJNjMwCi0JCSAgICBoZWlnaHQgICAgIAkyNzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOCIgQDEzMQotCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDU3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTlBMDlFMDA1RCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzIiBAMTMyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjk5LCAtMzA1KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzIKLQkJCQlsb2NhdGlvbiAgIAkoMTAyMCwgNTk0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ1MQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK21ldGhvZFBhcmFtUGFydHNNYXBwaW5ncyIKLQkJCQlwY3REaXN0ICAgIAktMC4xNDQxNjAKLQkJCQloZWlnaHQgICAgIAkxOAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTlBMDlGMDA0QSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMxCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyOQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQKLQkJCQlQYXJlbnRfVmlldyAJQDEzMgotCQkJCWxvY2F0aW9uICAgCSgxNDAwLCA2MDgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC44MzA1MDgKLQkJCQloZWlnaHQgICAgIAkzMgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNQotCQkJCVBhcmVudF9WaWV3IAlAMTMyCi0JCQkJbG9jYXRpb24gICAJKDEwNzMsIDU2MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezR9IgotCQkJCXBjdERpc3QgICAgCS0wLjAwNjc2OAotCQkJCWhlaWdodCAgICAgCTE3Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkiIEAxMzYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMQotCQkJICAgIGxvY2F0aW9uICAgCSg2OTksIC0zMDUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE5QTA5RjAwNEMiCi0JCQkgICAgY2xpZW50ICAgICAJQDEzMQotCQkJICAgIHN1cHBsaWVyICAgCUAxMzAKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzYKLQkJCQlsb2NhdGlvbiAgIAkoNzIzLCA1MjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAxMDAKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETE1lc3NhZ2UiIEAxMzgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc3NiwgMTY2NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMzgKLQkJCWxvY2F0aW9uICAgCSgxNjI3LCAxNjIyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI5OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIldTRExNZXNzYWdlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjJFMDAyQkQiCi0JCSAgICB3aWR0aCAgICAgIAkzMTYKLQkJICAgIGhlaWdodCAgICAgCTEwNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExSZXR1cm5WYWx1ZU1hcHBpbmciIEAxMzkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc3NiwgOTkyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAk4Ci0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEzOQotCQkJbG9jYXRpb24gICAJKDE0NzksIDg4NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1OTQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjU4NzAyNDMiCi0JCSAgICB3aWR0aCAgICAgIAk2MTIKLQkJICAgIGhlaWdodCAgICAgCTIzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwIiBAMTQwCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgNzg0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0UxOUEwQTMwMjhBIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3c2RsUmV0dXJuVmFsdWVNYXBwaW5nIiBAMTQxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzE1LCAtODkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIKLQkJCQlQYXJlbnRfVmlldyAJQDE0MQotCQkJCWxvY2F0aW9uICAgCSgxMDI5LCA4MzEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDA2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrd3NkbFJldHVyblZhbHVlTWFwcGluZyIKLQkJCQlwY3REaXN0ICAgIAktMC4wODIwMTYKLQkJCQloZWlnaHQgICAgIAk1OAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFMTlBMEE0MDM1NCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTQwCi0JCQkgICAgc3VwcGxpZXIgICAJQDEzOQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMKLQkJCQlQYXJlbnRfVmlldyAJQDE0MQotCQkJCWxvY2F0aW9uICAgCSgxMzM0LCA5MDIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC42ODMzNTMKLQkJCQloZWlnaHQgICAgIAk0MAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NAotCQkJCVBhcmVudF9WaWV3IAlAMTQxCi0JCQkJbG9jYXRpb24gICAJKDEyMzksIDg5OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezV9IgotCQkJCXBjdERpc3QgICAgCTAuNDU5Njk5Ci0JCQkJaGVpZ2h0ICAgICAJNjQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMSIgQDE0NQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwCi0JCQkgICAgbG9jYXRpb24gICAJKDcxNSwgLTg5KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOUEwQTQwMzVFIgotCQkJICAgIGNsaWVudCAgICAgCUAxNDAKLQkJCSAgICBzdXBwbGllciAgIAlAMTMwCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NgotCQkJCVBhcmVudF9WaWV3IAlAMTQ1Ci0JCQkJbG9jYXRpb24gICAJKDczOSwgNjMxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuODk4NTk2Ci0JCQkJaGVpZ2h0ICAgICAJNTIKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMyIiBAMTQ3Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTc3NiwgMTM2MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTlBMTIxMDA4RSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAid3NkbE1lc3NhZ2UiIEAxNDgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NwotCQkJICAgIGxvY2F0aW9uICAgCSgxMTYsIC00MzIpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDkKLQkJCQlQYXJlbnRfVmlldyAJQDE0OAotCQkJCWxvY2F0aW9uICAgCSgxODE3LCAxNTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3dzZGxNZXNzYWdlIgotCQkJCXBjdERpc3QgICAgCTAuNzk4MTY1Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE5QTEyMjAwMTciCi0JCQkgICAgY2xpZW50ICAgICAJQDE0NwotCQkJICAgIHN1cHBsaWVyICAgCUAxMzgKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDgKLQkJCQlsb2NhdGlvbiAgIAkoMTcyMywgMTU4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5NjAyNAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUxCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDgKLQkJCQlsb2NhdGlvbiAgIAkoMTY2OSwgMTU4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiezJ9IgotCQkJCXBjdERpc3QgICAgCTAuODk2MDI0Ci0JCQkJaGVpZ2h0ICAgICAJMTA4Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzMiIEAxNTIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NwotCQkJICAgIGxvY2F0aW9uICAgCSgxMTYsIC00MzIpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE5QTEyMjAwMjIiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0NwotCQkJICAgIHN1cHBsaWVyICAgCUAxMzkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUzCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTIKLQkJCQlsb2NhdGlvbiAgIAkoMTcyMywgMTEzNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5NjAyNAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciCi0JICAgIHF1aWQgICAgICAgCSIzRTE5QTRFRjAwNzMiCi0JICAgIHRpdGxlICAgICAgCSJNZXRob2RQYXJhbVBhcnRzTWFwcGluZyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJNDMxCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF4cnBjbWFwOjpNZXRob2RQYXJhbVBhcnRzTWFwcGluZyIgQDE1NAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMzYsIDY3MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNTQKLQkJCWxvY2F0aW9uICAgCSg3MCwgNTY0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUzMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE2MjU2QTAxNzEiCi0JCSAgICB3aWR0aCAgICAgIAk1NTAKLQkJICAgIGhlaWdodCAgICAgCTIzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXhycGNtYXA6OldTRExNZXNzYWdlIiBAMTU1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIwNjQsIDY4OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNTUKLQkJCWxvY2F0aW9uICAgCSgxOTE1LCA2NDYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjk4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiV1NETE1lc3NhZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyMkUwMDJCRCIKLQkJICAgIHdpZHRoICAgICAgCTMxNgotCQkgICAgaGVpZ2h0ICAgICAJMTA0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpheHJwY21hcDo6V1NETE1lc3NhZ2VNYXBwaW5nIiBAMTU2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyMzIsIDkxMikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJOAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNTYKLQkJCWxvY2F0aW9uICAgCSg5MzUsIDc4NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1OTQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJXU0RMTWVzc2FnZU1hcHBpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTYyNUZBMDM4QiIKLQkJICAgIHdpZHRoICAgICAgCTYxMgotCQkgICAgaGVpZ2h0ICAgICAJMjc2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzQiIEAxNTcKLQkJICAgIGxvY2F0aW9uICAgCSg3NjgsIDc4NykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFMTlBNUQ0MDFDQSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAid3NkbE1lc3NhZ2VNYXBwaW5nIiBAMTU4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTcKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDMxLCAxMTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTkKLQkJCQlQYXJlbnRfVmlldyAJQDE1OAotCQkJCWxvY2F0aW9uICAgCSg3MjgsIDg1MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzNDgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIit3c2RsTWVzc2FnZU1hcHBpbmciCi0JCQkJcGN0RGlzdCAgICAJLTAuMTQ0NjYwCi0JCQkJaGVpZ2h0ICAgICAJNzQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE5QTVENTAwOEIiCi0JCQkgICAgY2xpZW50ICAgICAJQDE1NwotCQkJICAgIHN1cHBsaWVyICAgCUAxNTYKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYwCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTgKLQkJCQlsb2NhdGlvbiAgIAkoOTI0LCA3NzUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44OTkwMjQKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MQotCQkJCVBhcmVudF9WaWV3IAlAMTU4Ci0JCQkJbG9jYXRpb24gICAJKDg5MywgNzc0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTUwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7M30iCi0JCQkJcGN0RGlzdCAgICAJMC43MjA3MTUKLQkJCQloZWlnaHQgICAgIAk0NgotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM1IiBAMTYyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTcKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDMxLCAxMTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE5QTVENTAwOEQiCi0JCQkgICAgY2xpZW50ICAgICAJQDE1NwotCQkJICAgIHN1cHBsaWVyICAgCUAxNTQKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYzCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjIKLQkJCQlsb2NhdGlvbiAgIAkoNjQyLCA3MDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC44OTMxMTUKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzYiIEAxNjQKLQkJICAgIGxvY2F0aW9uICAgCSgxNzIxLCA3NzkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTE5QTVEQjAwMTEiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIndzZGxNZXNzYWdlIiBAMTY1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNjQKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzgyLCAtMTEzKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNjUKLQkJCQlsb2NhdGlvbiAgIAkoMTc3NSwgNjk4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3dzZGxNZXNzYWdlIgotCQkJCXBjdERpc3QgICAgCTAuMzc4ODg1Ci0JCQkJaGVpZ2h0ICAgICAJNjUKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTE5QTVEQjAzODMiCi0JCQkgICAgY2xpZW50ICAgICAJQDE2NAotCQkJICAgIHN1cHBsaWVyICAgCUAxNTUKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY3Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNjUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4MiwgNjc4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAk4Ci0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTUyNTIyCi0JCQkJaGVpZ2h0ICAgICAJNTcKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjgKLQkJCQlQYXJlbnRfVmlldyAJQDE2NQotCQkJCWxvY2F0aW9uICAgCSgxNzg5LCA2NTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTgKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJInsxfSIKLQkJCQlwY3REaXN0ICAgIAkwLjUxMjMyNwotCQkJCWhlaWdodCAgICAgCTEwMgotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM3IiBAMTY5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNjQKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzgyLCAtMTEzKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxOUE1REIwMzhFIgotCQkJICAgIGNsaWVudCAgICAgCUAxNjQKLQkJCSAgICBzdXBwbGllciAgIAlAMTU2Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3MAotCQkJCVBhcmVudF9WaWV3IAlAMTY5Ci0JCQkJbG9jYXRpb24gICAJKDE1NzMsIDg3NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJOAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5MjQ4OQotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvamNhMV8wLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2pjYTFfMC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZTBiZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvamNhMV8wLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDQzNTMgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk1MA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImpjYSINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJIm5zVVJJIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgImpjYS54bWkiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiSmNhIikpKQ0KLSAgICBxdWlkICAgICAgIAkiM0M2MDkwNDIwMEJCIg0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJDb25uZWN0b3IiDQotCSAgICBxdWlkICAgICAgIAkiM0M2MDkwOTEwMTBGIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGVsZW1lbnQgaW5jbHVkZXMgZ2VuZXJhbCBpbmZvcm1hdGlvbiAtIHZlbmRvciBuYW1lLCB2ZXJzaW9uLCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gc3VwcG9ydGVkLCBpY29uIC0gIGFib3V0IHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gSXQgYWxzbyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXIuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQjA3OTAxMzQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVuZG9yTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkwRjMwMjFFIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTcGVjaWZpZXMgdGhlIG5hbWUgb2YgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciB2ZW5kb3IuDQotfEV4YW1wbGU6IFdvbWJhdCBDb3JwLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzcGVjVmVyc2lvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkwRkMwMTlGIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3llciB0byBjb25maWd1cmUgdGhlIHJlc291cmNlIGFkYXB0ZXIgdG8gc3VwcG9ydCBkZXBsb3ltZW50IGFuZCBydW50aW1lIHJlcXVpcmVtZW50cyBvZiB0aGUgY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlaXNUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTEwMDAxMjMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHRoZSBFSVMuIEZvciBleGFtcGxlLCB0aGUgdHlwZSBvZiBhbiBFSVMgY2FuIGJlIHByb2R1Y3QgbmFtZSBvZiBFSVMgaW5kZXBlbmRlbnQgb2YgYW55IHZlcnNpb24gaW5mby4NCi18DQotfFRoaXMgaGVscHMgaW4gaWRlbnRpZnlpbmcgRUlTIGluc3RhbmNlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGgNCi18dGhpcyByZXNvdXJjZSBhZGFwdGVyLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkxMDYwMTBEIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyLg0KLXwNCi18RXhhbXBsZTogMS41DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJSZXNvdXJjZUFkYXB0ZXIiDQotCSAgICBxdWlkICAgICAgIAkiM0M2MDkxMkEwMkE5Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBvZiBjbGFzcy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YgdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cywgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm92aWRlZCwgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkIGFuZCBhZGRpdGlvbmFsDQotfHJlcXVpcmVkIHNlY3VyaXR5IHBlcm1pc3Npb25zLg0KLXwNCi18SWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mDQotfHJlc291cmNlIGFkYXB0ZXIgZWxlbWVudCB0aGVuIHRoZSByZXNvdXJjZSBhZGFwdGVyIGRvZXMgbm90DQotfHN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMgcGFydA0KLXxvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzIHRoZSBzZWN1cml0eQ0KLXxwYXJ0IG9mIHRoZSBzeXN0ZW0gY29udHJhY3RzIGluIHRoaXMgY2FzZS4NCi18DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkzNjAwM0RBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY29ubmVjdGlvbkRlZmluaXRpb25zLm1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzDQotfFNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZC1Db25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mIHJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMuDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkzNkMwMEMwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY29ubmVjdGlvbkRlZmluaXRpb25zLmNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlDQotfFNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkzNzUwMTNCIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY29ubmVjdGlvbkRlZmluaXRpb25zLmNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzDQotfFNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29ubmVjdGlvbkludGVyZmFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkzN0UwMjFBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY29ubmVjdGlvbkRlZmluaXRpb25zLmNvbm5lY3Rpb25JbnRlcmZhY2UiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbm5lY3Rpb25JbXBsQ2xhc3MiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5Mzk1MDNENiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNvbm5lY3Rpb25EZWZpbml0aW9ucy5jb25uZWN0aW9uSW1wbENsYXNzDQotfFNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHJhbnNhY3Rpb25TdXBwb3J0Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTM5RjAzREEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci50cmFuc2FjdGlvblN1cHBvcnQNCi18VGhlIHRyYW5zYWN0aW9uLXN1cHBvcnQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxldmVsIG9mIHRyYW5zYWN0aW9uDQotfHN1cHBvcnQgcHJvdmlkZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuDQotfFRoZSB2YWx1ZSBvZiB0cmFuc2FjdGlvbi1zdXBwb3J0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6DQotfCAgTm9UcmFuc2FjdGlvbg0KLXwgIExvY2FsVHJhbnNhY3Rpb24NCi18ICBYQVRyYW5zYWN0aW9uDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5OEM4MDM5NCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlYXV0aGVudGljYXRpb25TdXBwb3J0Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTNBODAzMUYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5yZWF1dGhlbnRpY2F0aW9uU3VwcG9ydA0KLXxTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLUNvbm5lY3Rpb24gaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IGZvciB0aGUgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZUFkYXB0ZXJDbGFzcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFEMzMwMkRDIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXItY2xhc3Mgc3BlY2lmaWVzIHRoZQ0KLXwgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMNCi18ICAgICAgICB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLlJlc291cmNlQWRhcHRlcg0KLXwgICAgICAgIGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YNCi18ICAgICAgICByZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yDQotfCAgICAgICAgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbg0KLXwgICAgICAgIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIg0KLQkgICAgcXVpZCAgICAgICAJIjNDNjA5MTQwMDNDRSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWxlbWVudCBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gc3BlY2lmaWVzIGFuIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIE5vdGUgdGhhdCB0aGlzIHN1cHBvcnQgaXMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBub3QgZm9yIHRoZSB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIHNwZWNpZmllcyBhbnkgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyByZXF1aXJlbWVudCBmb3IgdGhlIHN1cHBvcnQgb2Ygc2VjdXJpdHkgY29udHJhY3QgYW5kIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4NCi18DQotfE5vdGUgdGhhdCBCYXNpY1Bhc3N3b3JkIG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQ0KLXxqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsIGludGVyZmFjZS4NCi18VGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUNCi18amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIGludGVyZmFjZS4NCi18DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkxNzYwMzcxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUE5OEYwMzY4Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5MTgyMDA1NyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QGRlcHJlY2F0ZWQgU2VlIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtDQotfA0KLXxUaGUgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLg0KLXwNCi18VGhlIGV4YW1wbGUgdmFsdWVzIGFyZToNCi18ICAtIEJhc2ljUGFzc3dvcmQNCi18ICAtIEtlcmJ2NQ0KLXwNCi18QW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlDQotfENvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkxQzMwMkE5Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY3JlZGVudGlhbEludGVyZmFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkxQUEwMzgwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTcGVjaWZpZXMgdGhlIGludGVyZmFjZSB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGZvciB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNyZWRlbnRpYWxzLiBUaGlzIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgYnkgYXBwbGljYXRpb24gc2VydmVyIHRvIGZpbmQgb3V0IHRoZSBDcmVkZW50aWFsIGludGVyZmFjZSBpdCBzaG91bGQgdXNlIGFzIHBhcnQgb2YgdGhlIHNlY3VyaXR5IGNvbnRyYWN0Lg0KLXwNCi18VGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6DQotfCAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwNCi18ICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjdXN0b21BdXRoTWVjaFR5cGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiM0Q5OUUyMDgwMzhBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAZGVwcmVjYXRlZA0KLXxUaGlzIGlzIGFuIGludGVybmFsIHZhcmlhYmxlIHVzZWQgdG8gc3RvcmUgdGhlIEF0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIHdoZW4gaXQgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gQmFzaWNQYXNzd29yZCBvciBLZXJidjUuICBBdXRoZW50aWNhdGlvbk1lY2FuaXNtVHlwZSBpcyBzZXQgdG8gJ0N1c3RvbScgaW4gdGhvc2UgY2FzZXMuICBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgYnkgcnVudGltZS4gIEl0IGlzIG9ubHkgdXNlZCBieSB0aGUgd3JpdGVyIHRvIHdyaXRlIGJhY2sgb3V0IHRoZSBjdXN0b20gQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIHN0cmluZyBpbiB0aGUgY2FzZSBvZiBjdXN0b20gQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlJ3MuICANCi18VGhpcyB2YXJpYWJsZSBpcyBpbnRlcm5hbCwgdXNlZCBvbmx5IGJ5IHRoZSByZWFkZXIvd3JpdGVyIGNsYXNzZXMsIGFuZCBjYW4gY2hhbmdlIG9yIGRpc2FwcGVhciB3aXRob3V0IG5vdGljZS4gIA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjNDNjA5MUMzMDJBOSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfEJhc2ljUGFzc3dvcmQ9MA0KLXxLZXJidjU9MQ0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQmFzaWNQYXNzd29yZCINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkxRDAwMERDIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiS2VyYnY1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTFENTAxMUYiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiQ29uZmlnUHJvcGVydHkiDQotCSAgICBxdWlkICAgICAgIAkiM0M2MDkyMkMwMTg4Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBjb25maWcgcHJvcGVydHkgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHNpbmdsZQ0KLXxjb25maWd1cmF0aW9uIHByb3BlcnR5IGZvciBhIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZS4NCi18DQotfEVhY2ggTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlIGNyZWF0ZXMgY29ubmVjdGlvbnMgdG8gYSBzcGVjaWZpYyBFSVMgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgY29uZmlndXJlZCBvbiB0aGUgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlLiBUaGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBvbmx5IG9uY2UgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgZXZlbiB0aG91Z2ggYSByZXNvdXJjZSBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBtdWx0aXBsZSBNYW5hZ2VkQ29ubm5lY3Rpb24tRmFjdG9yeSBpbnN0YW5jZXMgKHRoYXQgY3JlYXRlIGNvbm5lY3Rpb25zIHRvIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgRUlTKS4NCi18DQotfFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgbmFtZSwgdHlwZQ0KLXxhbmQgYW4gb3B0aW9uYWwgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuIElmIHRoZSByZXNvdXJjZQ0KLXxhZGFwdGVyIHByb3ZpZGVyIGRvZXMgbm90IHNwZWNpZnkgYSB2YWx1ZSB0aGFuIHRoZSBkZXBsb3llciBpcw0KLXxyZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgdmFsaWQgdmFsdWUgZm9yIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4NCi18DQotfEFueSBib3VuZHMgb3Igd2VsbC1kZWZpbmVkIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZXNjcmliZWQgaW4gdGhlIGRlc2NyaXB0aW9uLg0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTIzMjAzQjciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5MjNGMDE5OSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Q29udGFpbnMgdGhlIG5hbWUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5Lg0KLXwNCi18VGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgZGVmaW5lcyBhIHNldCBvZiB3ZWxsLWRlZmluZWQgcHJvcGVydGllcyBhbGwgb2YgdHlwZSBqYXZhLmxhbmcuU3RyaW5nLiBUaGVzZSBhcmUgYXMgZm9sbG93czoNCi18DQotfCAgICAgU2VydmVyTmFtZQ0KLXwgICAgIFBvcnROdW1iZXINCi18ICAgICBVc2VyTmFtZQ0KLXwgICAgIFBhc3N3b3JkDQotfCAgICAgQ29ubmVjdGlvblVSTA0KLXwNCi18QSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIGNhbiBleHRlbmQgdGhpcyBwcm9wZXJ0eSBzZXQgdG8gaW5jbHVkZSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBpdHMgdW5kZXJseWluZyBFSVMuDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTI0NTAxOTgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfENvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSB0eXBlIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBhcyByZXF1aXJlZCBieSBNYW5hZ2VkQ29ubmVjdGlvbi1GYWN0b3J5IGluc3RhbmNlLg0KLXwNCi18VGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBjb25maWctcHJvcGVydHktdHlwZToNCi18ICAgamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLA0KLXwgICBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LA0KLXwgICBqYXZhLmxhbmcuTG9uZywgamF2YS5sYW5nLkZsb2F0LCBqYXZhLmxhbmcuQ2hhcmFjdGVyDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTI0ODAyREQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBjb250YWlucyB0aGUgdmFsdWUNCi18ICAgICAgICBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuIE5vdGUsIGl0IGlzIHBvc3NpYmxlIGZvciBhDQotfCAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBkZXBsb3llciB0byBvdmVycmlkZSB0aGlzDQotfCAgICAgICAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBkdXJpbmcgZGVwbG95bWVudC4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18ICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPldvbWJhdFNlcnZlcjwvY29uZmlnLXByb3BlcnR5LXZhbHVlPg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiU2VjdXJpdHlQZXJtaXNzaW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNDNjA5M0MxMDBGNCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4NCi18DQotfFRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIGxpc3RlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFyZSBvbmVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZSBkZWZhdWx0IHBlcm1pc3Npb24gc2V0IGFzIHNwZWNpZmllZCBpbiB0aGUgY29ubmVjdG9yIHNwZWNpZmljYXRpb24uIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBjYW4gbWVudGlvbiBzcGVjaWZpYyByZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4gc2VjdXJpdHkgcGVybWlzc2lvbi4NCi18DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk3RTkwMTYyIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzcGVjaWZpY2F0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTdGNTAzQ0MiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbGVtZW50IHBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIGJhc2VkIG9uIHRoZSBTZWN1cml0eSBwb2xpY3kgZmlsZSBzeW50YXguIA0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkxpY2Vuc2UiDQotCSAgICBxdWlkICAgICAgIAkiM0M2MDk1MjkwMDhFIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlNwZWNpZmllcyBsaWNlbnNpbmcgcmVxdWlyZW1lbnRzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIFNwZWNpZmllcyB3aGV0aGVyIGEgbGljZW5zZSBpcyByZXF1aXJlZCB0byBkZXBsb3kgYW5kIHVzZSB0aGlzIHJlc291cmNlIGFkYXB0ZXIsIGFuZCBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGljZW5zaW5nIHRlcm1zIChleGFtcGxlczogZHVyYXRpb24gb2YgbGljZW5zZSwgbnVtYmVyIG9mIGNvbm5lY3Rpb24gcmVzdHJpY3Rpb25zKS4iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5NTNFMDA4NCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QGRlcHJlY2F0ZWQgUmVwbGFjZWQgd2l0aCBkZXNjcmlwdGlvbnMNCi18VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGxpY2Vuc2UuDQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTU5RjAxN0UiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiVHJhbnNhY3Rpb25TdXBwb3J0S2luZCINCi0JICAgIHF1aWQgICAgICAgCSIzQzYwOThDODAzOTQiDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTm9UcmFuc2FjdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk4RDIwMUZFIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTG9jYWxUcmFuc2FjdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk4RDYwMjM1Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiWEFUcmFuc2FjdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk4REIwMjMzIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkluYm91bmRSZXNvdXJjZUFkYXB0ZXIiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUExREQwMjU3Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIGluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24NCi18YWJvdXQgYW4gaW5ib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uDQotfHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlcg0KLXxsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBtZXNzYWdlYWRhcHRlciBlbGVtZW50Lg0KLQkgICAgKQ0KLQkob2JqZWN0IENsYXNzICJPdXRib3VuZFJlc291cmNlQWRhcHRlciINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQTFFNjAyM0MiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQNCi18YW4gb3V0Ym91bmQgcmVzb3VyY2UgYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5DQotfHF1YWxpZmllZCBuYW1lcyBvZiBjbGFzc2VzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZg0KLXx0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzIGZvcg0KLXxjb25uZWN0aW9uIG1hbmFnZW1lbnQsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQNCi18cHJvdmlkZWQsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkDQotfGFuZCBhZGRpdGlvbmFsIHJlcXVpcmVkIHNlY3VyaXR5IHBlcm1pc3Npb25zLg0KLXwNCi18SWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mDQotfHJlc291cmNlIGFkYXB0ZXIgZWxlbWVudCB0aGVuIHRoZSByZXNvdXJjZSBhZGFwdGVyIGRvZXMgbm90DQotfHN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMNCi18cGFydCBvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzDQotfHRoZSBzZWN1cml0eSBwYXJ0IG9mIHRoZSBzeXN0ZW0gY29udHJhY3RzIGluIHRoaXMgY2FzZS4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlYXV0aGVudGljYXRpb25TdXBwb3J0Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQTVCQTAwM0MiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbGVtZW50IHJlYXV0aGVudGljYXRpb24tc3VwcG9ydCBzcGVjaWZpZXMNCi18ICAgICAgICB3aGV0aGVyIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzDQotfCAgICAgICAgcmUtYXV0aGVudGljYXRpb24gb2YgZXhpc3RpbmcgTWFuYWdlZC0gQ29ubmVjdGlvbg0KLXwgICAgICAgIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBmb3IgdGhlDQotfCAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IGZvciB0aGUNCi18ICAgICAgICB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhpcyBlbGVtZW50IG11c3QgaGF2ZQ0KLXwgICAgICAgIGVpdGhlciBhICJ0cnVlIiBvciAiZmFsc2UiIHZhbHVlLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHJhbnNhY3Rpb25TdXBwb3J0Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQTg2MjAyNkIiDQotCQkgICAgdHlwZSAgICAgICAJIlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5OEM4MDM5NCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJNZXNzYWdlQWRhcHRlciINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQTJENjAxRjEiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgbWVzc2FnZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUNCi18bWVzc2FnaW5nIGNhcGFiaWxpdGllcyBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcw0KLXxjb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlDQotfHJlc291cmNlIGFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUNCi18bWVzc2FnZWxpc3RlbmVyIGVsZW1lbnQuDQotCSAgICApDQotCShvYmplY3QgQ2xhc3MgIkNvbm5lY3Rpb25EZWZpbml0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBNENGMDBGMiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIGRlZmluZXMgYSBzZXQgb2YgY29ubmVjdGlvbg0KLXxpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHBlcnRhaW5pbmcgdG8gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24NCi18dHlwZS4gVGhpcyBhbHNvIGluY2x1ZGVzIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGZvcg0KLXxNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2VzIHRoYXQgbWF5IGJlIHByb2R1Y2VkIG91dA0KLXxvZiB0aGlzIHNldC4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQTZDMjAzQUQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbGVtZW50IG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcyBzcGVjaWZpZXMNCi18ICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdA0KLXwgICAgICAgIGltcGxlbWVudHMgdGhlDQotfCAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuDQotfCAgICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UNCi18ICAgICAgICBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZQ0KLXwgICAgICAgIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzDQotfCAgICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18ICAgICAgICA8bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPg0KLXwgICAgICAgICAgICBjb20ud29tYmF0Lk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUltcGwNCi18ICAgICAgICA8L21hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBNzQ4MDM4OCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIHNwZWNpZmllcw0KLXwgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkNCi18ICAgICAgICBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLg0KLXwNCi18ICAgICAgICBFeGFtcGxlOg0KLXwgICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeQ0KLXwgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPg0KLXwNCi18ICAgICAgICBPUg0KLXwNCi18ICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uRmFjdG9yeQ0KLXwgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUE3NTAwMTgwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzIHNwZWNpZmllcw0KLXwgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkNCi18ICAgICAgICBjbGFzcyB0aGF0IGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlcg0KLXwgICAgICAgIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18DQotfCAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwNCi18ICAgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbm5lY3Rpb25JbnRlcmZhY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBNzVFMDFCRCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGNvbm5lY3Rpb24taW50ZXJmYWNlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseQ0KLXwgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uIGludGVyZmFjZSBzdXBwb3J0ZWQNCi18ICAgICAgICBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18DQotfCAgICAgICAgICAgIDxjb25uZWN0aW9uLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbg0KLXwgICAgICAgICAgICA8L2Nvbm5lY3Rpb24taW50ZXJmYWNlPg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25uZWN0aW9uSW1wbENsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQTc3NzAxMTgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3NUeXBlIHNwZWNpZmllcyB0aGUgZnVsbHkNCi18ICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBjbGFzcyB0aGF0DQotfCAgICAgICAgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIENvbm5lY3Rpb24NCi18ICAgICAgICBpbnRlcmZhY2UuICBJdCBpcyB1c2VkIGJ5IHRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3MNCi18ICAgICAgICBlbGVtZW50cy4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18DQotfCAgICAgICAgICAgIDxjb25uZWN0aW9uLWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uSW1wbA0KLXwgICAgICAgICAgICA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkFkbWluT2JqZWN0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBREQ2MDA0QiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfFRoZSBhZG1pbm9iamVjdFR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGFuDQotfGFkbWluaXN0ZXJlZCBvYmplY3QuICBBZG1pbmlzdGVyZWQgb2JqZWN0cyBhcmUgc3BlY2lmaWMgdG8gYQ0KLXxtZXNzYWdpbmcgc3R5bGUgb3IgbWVzc2FnZSBwcm92aWRlci4gIFRoaXMgY29udGFpbnMNCi18aW5mb3JtYXRpb24gb24gdGhlIEphdmEgdHlwZSBvZiB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5DQotfGFuIGFkbWluaXN0ZXJlZCBvYmplY3QsIGl0cyBKYXZhIGNsYXNzIG5hbWUgYW5kIGl0cw0KLXxjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuDQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhZG1pbk9iamVjdEludGVyZmFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUIxMkIwMTg4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZQ0KLXwgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgdGhlDQotfCAgICAgICAgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGFuIGFkbWluaXN0ZXJlZCBvYmplY3QuDQotfA0KLXwgICAgICAgIEV4YW1wbGU6DQotfCAgICAgICAgICA8YWRtaW5vYmplY3QtaW50ZXJmYWNlPmphdmF4Lmptcy5EZXN0aW5hdGlvbg0KLXwgICAgICAgICAgPC9hZG1pbm9iamVjdC1pbnRlcmZhY2U+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFkbWluT2JqZWN0Q2xhc3MiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFCMTMxMDAwMCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVsZW1lbnQgYWRtaW5vYmplY3QtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseQ0KLXwgICAgICAgIHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18ICAgICAgICAgICAgPGFkbWlub2JqZWN0LWNsYXNzPmNvbS53b21iYXQuRGVzdGluYXRpb25JbXBsDQotfCAgICAgICAgICAgIDwvYWRtaW5vYmplY3QtY2xhc3M+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJNZXNzYWdlTGlzdGVuZXIiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUFFQzEwMkZDIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGENCi18c3BlY2lmaWMgbWVzc2FnZSBsaXN0ZW5lciBzdXBwb3J0ZWQgYnkgdGhlIG1lc3NhZ2luZw0KLXxyZXNvdXJjZSBhZGFwdGVyLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlDQotfG9mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbg0KLXxzcGVjaWZpY2F0aW9uLg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVzc2FnZUxpc3RlbmVyVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFFRjkwMUE4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWxlbWVudCBtZXNzYWdlbGlzdGVuZXItdHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5DQotfCAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSBvZiBhIG1lc3NhZ2UNCi18ICAgICAgICBsaXN0ZW5lciBpbnRlcmZhY2UuDQotfA0KLXwgICAgICAgIEV4YW1wbGU6DQotfA0KLXwgICAgICAgICAgPG1lc3NhZ2VsaXN0ZW5lci10eXBlPmphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXINCi18ICAgICAgICAgIDwvbWVzc2FnZWxpc3RlbmVyLXR5cGU+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJBY3RpdmF0aW9uU3BlYyINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQUYzMjAwNDIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgYWN0aXZhdGlvbnNwZWNUeXBlIHNwZWNpZmllcyBhbiBhY3RpdmF0aW9uDQotfHNwZWNpZmljYXRpb24uICBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkgcXVhbGlmaWVkDQotfEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhY3RpdmF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGEgc2V0IG9mDQotfHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZXMuDQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhY3RpdmF0aW9uU3BlY0NsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUY5NDAzQUEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBlbGVtZW50IGFjdGl2YXRpb25zcGVjLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkNCi18ICAgICAgICBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBhY3RpdmF0aW9uDQotfCAgICAgICAgc3BlY2lmaWNhdGlvbiBjbGFzcy4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUNCi18ICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuQWN0aXZhdGlvblNwZWMgaW50ZXJmYWNlLiBUaGUNCi18ICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGENCi18ICAgICAgICBKYXZhQmVhbi4NCi18DQotfCAgICAgICAgRXhhbXBsZToNCi18ICAgICAgICAgICAgPGFjdGl2YXRpb25zcGVjLWNsYXNzPmNvbS53b21iYXQuQWN0aXZhdGlvblNwZWNJbXBsDQotfCAgICAgICAgICAgIDwvYWN0aXZhdGlvbnNwZWMtY2xhc3M+DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQUZENjAxQTYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uDQotfG9mIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgdXNlZCBmb3Igc3BlY2lmeWluZyBhDQotfHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZS4gSXQgaXMgdXNlZA0KLXxieSByZXF1aXJlZC1jb25maWctcHJvcGVydHkgZWxlbWVudHMuDQotfA0KLXxFeGFtcGxlOg0KLXwNCi18PHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eT5EZXN0aW5hdGlvbjwvcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5Pg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUIwMUYwMUJGIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JICAgIHF1aWQgICAgICAgCSIzQzYwOTNDQzAwMUUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic2VjdXJpdHlQZXJtaXNzaW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkzQ0MwMzY3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAZGVwcmVjYXRlZCINCi0JCSAgICBsYWJlbCAgICAgIAkic2VjdXJpdHlQZXJtaXNzaW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OlNlY3VyaXR5UGVybWlzc2lvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkzQzEwMEY0Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDkzQ0MwMzY5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6UmVzb3VyY2VBZGFwdGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTEyQTAyQTkiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBxdWlkICAgICAgIAkiM0M2MDk0MTIwMDI4Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk0MTIwMzkwIg0KLQkJICAgIGxhYmVsICAgICAgCSJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkxNDAwM0NFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk0MTIwMzkyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6UmVzb3VyY2VBZGFwdGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTEyQTAyQTkiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiDQotCSAgICBxdWlkICAgICAgIAkiM0M2MDk0NEMwMEQ2Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImNvbmZpZ1Byb3BlcnRpZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5NDREMDE5NiINCi0JCSAgICBsYWJlbCAgICAgIAkiY29uZmlnUHJvcGVydGllcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkNvbmZpZ1Byb3BlcnR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTIyQzAxODgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzYwOTQ0RDAxOTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MTJBMDJBOSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiINCi0JICAgIHF1aWQgICAgICAgCSIzQzYwOTUzMTAxODAiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibGljZW5zZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk1MzIwMDBFIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYSBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YNCi18Y29ubmVjdGlvbiByZXN0cmljdGlvbnMpLg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJsaWNlbnNlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6TGljZW5zZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDk1MjkwMDhFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk1MzIwMDEwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6Q29ubmVjdG9yIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTA5MTAxMEYiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgiDQotCSAgICBxdWlkICAgICAgIAkiM0M2MDk5ODkwMEMwIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInJlc291cmNlQWRhcHRlciINCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MDk5ODkwMkFCIg0KLQkJICAgIGxhYmVsICAgICAgCSJyZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MTJBMDJBOSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNjA5OTg5MDJCNSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkNvbm5lY3RvciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkwOTEwMTBGIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQTM2MzAzMDIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAib3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBMzY1MDM2OSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlDQotfCAgICAgICAgdW5pcXVlIGluIHRoZSBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIuIE11bHRpcGxlIGNvbm5lY3Rpb24tZGVmaW5pdGlvbnMNCi18ICAgICAgICBjYW4gbm90IHVzZSB0aGUgc2FtZSBjb25uZWN0aW9uZmFjdG9yeS10eXBlLg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJvdXRib3VuZFJlc291cmNlQWRhcHRlciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6Ok91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTFFNjAyM0MiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUEzNjUwMzZCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6UmVzb3VyY2VBZGFwdGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTEyQTAyQTkiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBNERDMDI2RSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJjb25uZWN0aW9uRGVmaW5pdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBNEREMDA1QyINCi0JCSAgICBsYWJlbCAgICAgIAkiY29ubmVjdGlvbkRlZmluaXRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6Q29ubmVjdGlvbkRlZmluaXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBNENGMDBGMiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQTRERDAwNjYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpPdXRib3VuZFJlc291cmNlQWRhcHRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUExRTYwMjNDIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQTU0NDAwRkIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiYXV0aGVudGljYXRpb25NZWNoYW5pc21zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQTU0NTAyOEQiDQotCQkgICAgbGFiZWwgICAgICAJImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTE0MDAzQ0UiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUE1NDUwMjhGIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBMUU2MDIzQyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUE2RjIwMTE3Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImNvbmZpZ1Byb3BlcnRpZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBNkYzMDE2OSINCi0JCSAgICBsYWJlbCAgICAgIAkiY29uZmlnUHJvcGVydGllcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkNvbmZpZ1Byb3BlcnR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTIyQzAxODgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUE2RjMwMTczIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6Q29ubmVjdGlvbkRlZmluaXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBNENGMDBGMiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUFEQ0QwMzZBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImluYm91bmRSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRENGMDMxMiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiaW5ib3VuZFJlc291cmNlQWRhcHRlciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkluYm91bmRSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBMUREMDI1NyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQURDRjAzMTQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpSZXNvdXJjZUFkYXB0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MTJBMDJBOSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUFFMDIwMzIwIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImFkbWluT2JqZWN0cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFFMDQwMTYwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJhZG1pbk9iamVjdHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpBZG1pbk9iamVjdCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFERDYwMDRCIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRTA0MDE2QiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OlJlc291cmNlQWRhcHRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkxMkEwMkE5Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMiINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQUUzODAyNUYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibWVzc2FnZUFkYXB0ZXIiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRTM5MDA5NCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIG1lc3NhZ2VsaXN0ZW5lci10eXBlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlDQotfCAgICAgICAgdW5pcXVlIGluIHRoZSBtZXNzYWdlYWRhcHRlci4gU2V2ZXJhbCBtZXNzYWdlbGlzdGVuZXJzDQotfCAgICAgICAgY2FuIG5vdCB1c2UgdGhlIHNhbWUgbWVzc2FnZWxpc3RlbmVyLXR5cGUuDQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJIm1lc3NhZ2VBZGFwdGVyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6TWVzc2FnZUFkYXB0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBMkQ2MDFGMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUUzOTAwOUUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTFERDAyNTciDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBRUNDMDA3NyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtZXNzYWdlTGlzdGVuZXJzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUVDQzAzQTIiDQotCQkgICAgbGFiZWwgICAgICAJIm1lc3NhZ2VMaXN0ZW5lcnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpNZXNzYWdlTGlzdGVuZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRUMxMDJGQyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUVDQzAzQTQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpNZXNzYWdlQWRhcHRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUEyRDYwMUYxIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNiINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQUY0ODAwMTEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiYWN0aXZhdGlvblNwZWMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRjQ5MDEwMyINCi0JCSAgICBsYWJlbCAgICAgIAkiYWN0aXZhdGlvblNwZWMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpBY3RpdmF0aW9uU3BlYyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFGMzIwMDQyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjciDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRjQ5MDEwNSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6Ok1lc3NhZ2VMaXN0ZW5lciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFFQzEwMkZDIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQUZBQTAyN0YiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUZBQjAzNDkiDQotCQkgICAgbGFiZWwgICAgICAJInJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUZENjAxQTYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFGQUIwMzUzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6QWN0aXZhdGlvblNwZWMiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRjMyMDA0MiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUIxNEEwMkI5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImNvbmZpZ1Byb3BlcnRpZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFCMTRCMDM0NyINCi0JCSAgICBsYWJlbCAgICAgIAkiY29uZmlnUHJvcGVydGllcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkNvbmZpZ1Byb3BlcnR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTIyQzAxODgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUIxNEIwMzUxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6QWRtaW5PYmplY3QiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBREQ2MDA0QiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzIiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUE4QTIwMDFFIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUE4QTMwMDMzIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBOEEzMDAzRCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTE0MDAzQ0UiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEE5Qzg2MDAyQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEE5Qzg2MDNCMCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBOUM4NjAzQjIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpMaWNlbnNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTUyOTAwOEUiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM2Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFBRkVDMDFCQyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBRkY0MDAxOSINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUZGNDAwMjQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amNhOjpSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFGRDYwMUE2Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzOCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRBQUI1QTAzNEEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRBQUI2MTAwQkYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzOSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFCNjEwMEM5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmpjYTo6Q29uZmlnUHJvcGVydHkiDQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MjJDMDE4OCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0QUFBMzIwMkZFIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0QUFBMzQwMDEyIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDEiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEFBQTM0MDAxQyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqY2E6OlNlY3VyaXR5UGVybWlzc2lvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkzQzEwMEY0Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJDb25uZWN0b3IgRGV0YWlscyINCi0JICAgIHF1aWQgICAgICAgCSIzQzYwOTA1RTAwRTQiDQotCSAgICB0aXRsZSAgICAgIAkiQ29ubmVjdG9yIERldGFpbHMiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMTgwOA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgTGFiZWwgQDENCi0JCSAgICBsb2NhdGlvbiAgIAkoNTMsIDQ0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEyDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCVRSVUUNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBubGluZXMgICAgIAkxDQotCQkgICAgbWF4X3dpZHRoICAJOTgxDQotCQkgICAgbGFiZWwgICAgICAJIkpDQSAxLjUgRGVwbG95bWVudCBEZXNjcmlwdG9yIikNCi0JCShvYmplY3QgTm90ZVZpZXcgQDINCi0JCSAgICBsb2NhdGlvbiAgIAkoODcxLCAzNjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSg3MSwgMTg3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNw0KLQkJCW1heF93aWR0aCAgCTE1NjUNCi0JCQlsYWJlbCAgICAgIAkNCi18RGVwcmVjYXRlZDogKE5vdGU6IHRoZSBkZXByZWNhdGVkIHZlcnNpb24gYmVjb21lcyB2b2xhdGlsZSBhbmQgZ2V0cyBpbXBsZW1lbnRhdGlvbiByZWRpcmVjdGVkIGludG8gbGlzdCB3aXRoIG5ldyBKMkVFIHR5cGUpDQotfGRpc3BsYXlOYW1lIHJlcGxhY2VkIHdpdGggZGlzcGxheU5hbWVzOkxpc3Q8RGlzcGxheU5hbWU+DQotfGRlc2NyaXB0aW9uIHJlcGxhY2VkIHdpdGggZGVzY3JpcHRpb25zOkxpc3Q8RGVzY3JpcHRpb25UeXBlPg0KLXxzbWFsbEljb24gcmVwbGFjZWQgd2l0aCBpY29uczpMaXN0PEljb25UeXBlPg0KLXxsYXJnZUljb24gcmVwbGFjZWQgd2l0aCBpY29uczpMaXN0PEljb25UeXBlPg0KLXx2ZXJzaW9uIHJlcGxhY2VkIHdpdGggcmVzb3VyY2VWZXJzaW9uOlN0cmluZw0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxNjI1DQotCQkgICAgaGVpZ2h0ICAgICAJMzc1KQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMw0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzUwLCAxNjI4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoODQzLCAxNTE2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTk3OA0KLQkJCWxhYmVsICAgICAgCSJUaGUgcmVhbCBYTUwgdGFnIGZvciBzcGVjVmVyc2lvbiBpbiBKQ0ExLjUgaXMgPHZlcnNpb24+LiBJbiBKQ0ExLjAgaXQgd2FzIDxzcGVjLXZlcnNpb24+LiAgSW4gb3RoZXIgd29yZHMsIEpDQTEuNSB2ZXJzaW9uIGVsZW1lbnRzIHdpbGwgZGVzZXJpYWxpemUgaW50byB0aGUgc3BlY1ZlcnNpb24gYXR0cmlidXRlLiIpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJMTAzOA0KLQkJICAgIGhlaWdodCAgICAgCTIzNykNCi0JCShvYmplY3QgTm90ZVZpZXcgQDQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjIwMCwgMzU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMTcwOSwgMjQwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTk0Ng0KLQkJCWxhYmVsICAgICAgCQ0KLXxEZXByZWNhdGVkOiAoTm90ZTogdGhlIGRlcHJlY2F0ZWQgdmVyc2lvbiBiZWNvbWVzIHZvbGF0aWxlIGFuZCBnZXRzIGltcGxlbWVudGF0aW9uIHJlZGlyZWN0ZWQgaW50byBsaXN0IHZlcnNpb24pDQotfGRlc2NyaXB0aW9uIHJlcGxhY2VkIHdpdGggZGVzY3JpcHRpb25zOkxpc3Q8U3RyaW5nPg0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxMDA2DQotCQkgICAgaGVpZ2h0ICAgICAJMjQ0KQ0KLQkJKG9iamVjdCBOb3RlVmlldyBANQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDIxLCAxMjUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANQ0KLQkJCWxvY2F0aW9uICAgCSgxNzA4LCAzNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkxMzkwDQotCQkJbGFiZWwgICAgICAJIk1hbnkgZGVzY3JpcHRpdmUgYXR0cmlidXRlcyBoYXZlIGJlZW4gY2hhbmdlZCB0byAnbicgbXVsdGlwbGljaXR5IHRvIHN1cHBvcnQgbG9jYWxpemF0aW9uIG9mIHRleHQgYW5kIGljb25zIikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxNDUwDQotCQkgICAgaGVpZ2h0ICAgICAJMTk0KQ0KLQkJKG9iamVjdCBMYWJlbCBANg0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjMsIDIwODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBubGluZXMgICAgIAkzDQotCQkgICAgbWF4X3dpZHRoICAJODk0DQotCQkgICAgbGFiZWwgICAgICAJDQotfFNFRSAiUkVTT1VSQ0VBREFQVEVSIERFVEFJTFMiIERJQUdSQU0NCi0JCSAgICApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCIgQDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3NDksIDk3MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoMTU3MSwgODk0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25Hcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NTFGMDFGQiINCi0JCSAgICB3aWR0aCAgICAgIAkzNzQNCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpSZXNvdXJjZUFkYXB0ZXIiIEA4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDU3NywgMTk2NykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4DQotCQkJbG9jYXRpb24gICAJKDQwMiwgMTkxNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlc291cmNlQWRhcHRlciIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MTJBMDJBOSINCi0JCSAgICB3aWR0aCAgICAgIAkzNjgNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpDb25uZWN0b3IiIEA5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2MTYsIDEwNTkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCWxvY2F0aW9uICAgCSgzMDksIDgwMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbm5lY3RvciIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MDkxMDEwRiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCWxvY2F0aW9uICAgCSgzMDksIDg2NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTQyOCkNCi0JCSAgICB3aWR0aCAgICAgIAk2MzINCi0JCSAgICBoZWlnaHQgICAgIAk1MzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMTANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUAyDQotCQkgICAgc3VwcGxpZXIgICAJQDkNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoODAxLCA1NTUpDQotCQkJKDcxNCwgNzkwKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxMQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDMNCi0JCSAgICBzdXBwbGllciAgIAlAOQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMTk4LCAxNTA5KQ0KLQkJCSg5MzIsIDEzMDMpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDEyDQotCQkgICAgbG9jYXRpb24gICAJKDUyMiwgMTYxNSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5OTg5MDBDMCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZXNvdXJjZUFkYXB0ZXIiIEAxMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjIsIDEwMjMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMzI1LCAxNjg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzMyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityZXNvdXJjZUFkYXB0ZXIiDQotCQkJCXBjdERpc3QgICAgCTAuMjU2ODgxDQotCQkJCWhlaWdodCAgICAgCTE5OA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTk4OTAyQUIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMg0KLQkJCSAgICBzdXBwbGllciAgIAlAOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDUyMiwgMTYxNSkNCi0JCQkJKDUyMiwgMTkwNCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjIsIDE2MTUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MjIsIDE5MDQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1DQotCQkJCVBhcmVudF9WaWV3IAlAMTMNCi0JCQkJbG9jYXRpb24gICAJKDU2MSwgMTcxNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuMzUwODc3DQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5IiBAMTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTIyLCAxMDIzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNjA5OTg5MDJCNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyDQotCQkJICAgIHN1cHBsaWVyICAgCUA5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTIyLCAxNjE1KQ0KLQkJCQkoNTIyLCAxMzI2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDUyMiwgMTYxNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUyMiwgMTMyNikpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDE3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNjI0LCA3MDYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTcNCi0JCQlsb2NhdGlvbiAgIAkoMjQ4MCwgNTUyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTI4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE3DQotCQkJbG9jYXRpb24gICAJKDI0ODAsIDY1NykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTI4NSkNCi0JCSAgICB3aWR0aCAgICAgIAkzMDYNCi0JCSAgICBoZWlnaHQgICAgIAkzMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpMaWNlbnNlIiBAMTgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MTAsIDcwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxOA0KLQkJCWxvY2F0aW9uICAgCSgxNTIyLCA1OTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTc2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJMaWNlbnNlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDk1MjkwMDhFIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxOA0KLQkJCWxvY2F0aW9uICAgCSgxNTIyLCA2NTUpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk1NzIpDQotCQkgICAgd2lkdGggICAgICAJNTk0DQotCQkgICAgaGVpZ2h0ICAgICAJMjM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDE5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlANA0KLQkJICAgIHN1cHBsaWVyICAgCUAxOA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyMDU5LCA0NzgpDQotCQkJKDE5NDIsIDU4MSkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBAMjANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIyMiwgNzk2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDk1MzEwMTgwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImxpY2Vuc2UiIEAyMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwDQotCQkJICAgIGxvY2F0aW9uICAgCSg4NzAsIDM0OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMg0KLQkJCQlQYXJlbnRfVmlldyAJQDIxDQotCQkJCWxvY2F0aW9uICAgCSgxMzU0LCA3NTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2xpY2Vuc2UiDQotCQkJCXBjdERpc3QgICAgCTAuNDU3NDQ3DQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNjA5NTMyMDAwRSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMjIsIDc5NikNCi0JCQkJKDE1MTMsIDc5NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIyLCA3OTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTEzLCA3OTYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzDQotCQkJCVBhcmVudF9WaWV3IAlAMjENCi0JCQkJbG9jYXRpb24gICAJKDE0NjYsIDg1MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODQxNTQ5DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3IiBAMjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoODcwLCAzNDgpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MDk1MzIwMDEwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjANCi0JCQkgICAgc3VwcGxpZXIgICAJQDkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjIyLCA3OTYpDQotCQkJCSg5MzIsIDc5NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIyLCA3OTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzIsIDc5NikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNCIgQDI1DQotCQkgICAgbG9jYXRpb24gICAJKDIyODksIDY1MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5Qzg2MDAyQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAyNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1DQotCQkJICAgIGxvY2F0aW9uICAgCSg0NzMsIC01MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNw0KLQkJCQlQYXJlbnRfVmlldyAJQDI2DQotCQkJCWxvY2F0aW9uICAgCSgyMzU0LCA2MDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC4zNTY4ODYNCi0JCQkJaGVpZ2h0ICAgICAJNTANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QTlDODYwM0IwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjI4OSwgNjUzKQ0KLQkJCQkoMjQ3MSwgNjUzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyODksIDY1MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI0NzEsIDY1MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjgNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNg0KLQkJCQlsb2NhdGlvbiAgIAkoMjQyOSwgNzA0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43NjcxMjMNCi0JCQkJaGVpZ2h0ICAgICAJNTENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM1IiBAMjkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDczLCAtNTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QTlDODYwM0IyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjI4OSwgNjUzKQ0KLQkJCQkoMjEwNywgNjUzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyODksIDY1MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDcsIDY1MykpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiUmVzb3VyY2UgQWRhcHRlciBEZXRhaWxzIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEFCMjE5MDFCMyINCi0JICAgIHRpdGxlICAgICAgCSJSZXNvdXJjZSBBZGFwdGVyIERldGFpbHMiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJNzMwNQ0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiIEAzMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM2NSwgMTM3OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMA0KLQkJCWxvY2F0aW9uICAgCSgzMDcwLCAxMjk1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU5MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzANCi0JCQlsb2NhdGlvbiAgIAkoMzA3MCwgMTI0NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU5MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkxQzMwMkE5Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzMA0KLQkJCWxvY2F0aW9uICAgCSgzMDcwLCAxMzU2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMzQwKQ0KLQkJICAgIHdpZHRoICAgICAgCTYwOA0KLQkJICAgIGhlaWdodCAgICAgCTI5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQiIEAzMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM0OCwgMjMzOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMQ0KLQkJCWxvY2F0aW9uICAgCSgzMTE4LCAyMjI5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ2MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVHJhbnNhY3Rpb25TdXBwb3J0S2luZCIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxDQotCQkJbG9jYXRpb24gICAJKDMxMTgsIDIxNzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5OEM4MDM5NCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzENCi0JCQlsb2NhdGlvbiAgIAkoMzExOCwgMjI5MCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTM2NSkNCi0JCSAgICB3aWR0aCAgICAgIAk0NzgNCi0JCSAgICBoZWlnaHQgICAgIAkzNDINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTGFiZWwgQDMyDQotCQkgICAgbG9jYXRpb24gICAJKDUzLCA0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMg0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlUUlVFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJICAgIG1heF93aWR0aCAgCTk4MQ0KLQkJICAgIGxhYmVsICAgICAgCQ0KLXxKQ0EgMS41IERlcGxveW1lbnQgRGVzY3JpcHRvcg0KLXxSZXNvdXJjZSBBZGFwdGVyIERldGFpbHMNCi0JCSAgICApDQotCQkob2JqZWN0IE5vdGVWaWV3IEAzMw0KLQkJICAgIGxvY2F0aW9uICAgCSg4NzUsIDM2MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMw0KLQkJCWxvY2F0aW9uICAgCSg3NSwgMTgxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNw0KLQkJCW1heF93aWR0aCAgCTE1NjUNCi0JCQlsYWJlbCAgICAgIAkNCi18RGVwcmVjYXRlZDogKE5vdGU6IHRoZSBkZXByZWNhdGVkIHZlcnNpb24gYmVjb21lcyB2b2xhdGlsZSBhbmQgZ2V0cyBpbXBsZW1lbnRhdGlvbiByZWRpcmVjdGVkIGludG8gbGlzdCB3aXRoIG5ldyBKMkVFIHR5cGUpDQotfGRpc3BsYXlOYW1lIHJlcGxhY2VkIHdpdGggZGlzcGxheU5hbWVzOkxpc3Q8RGlzcGxheU5hbWU+DQotfGRlc2NyaXB0aW9uIHJlcGxhY2VkIHdpdGggZGVzY3JpcHRpb25zOkxpc3Q8RGVzY3JpcHRpb25UeXBlPg0KLXxzbWFsbEljb24gcmVwbGFjZWQgd2l0aCBpY29uczpMaXN0PEljb25UeXBlPg0KLXxsYXJnZUljb24gcmVwbGFjZWQgd2l0aCBpY29uczpMaXN0PEljb25UeXBlPg0KLXx2ZXJzaW9uIHJlcGxhY2VkIHdpdGggcmVzb3VyY2VWZXJzaW9uOlN0cmluZw0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxNjI1DQotCQkgICAgaGVpZ2h0ICAgICAJMzc1KQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMzQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjIwMCwgMzU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM0DQotCQkJbG9jYXRpb24gICAJKDE3MDksIDI0MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk5NDYNCi0JCQlsYWJlbCAgICAgIAkNCi18RGVwcmVjYXRlZDogKE5vdGU6IHRoZSBkZXByZWNhdGVkIHZlcnNpb24gYmVjb21lcyB2b2xhdGlsZSBhbmQgZ2V0cyBpbXBsZW1lbnRhdGlvbiByZWRpcmVjdGVkIGludG8gbGlzdCB2ZXJzaW9uKQ0KLXxkZXNjcmlwdGlvbiByZXBsYWNlZCB3aXRoIGRlc2NyaXB0aW9uczpMaXN0PFN0cmluZz4NCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJMTAwNg0KLQkJICAgIGhlaWdodCAgICAgCTI0NCkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDM1DQotCQkgICAgbG9jYXRpb24gICAJKDI0MjEsIDEyNSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCWxvY2F0aW9uICAgCSgxNzA4LCAzNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkxMzkwDQotCQkJbGFiZWwgICAgICAJIk1hbnkgZGVzY3JpcHRpdmUgYXR0cmlidXRlcyBoYXZlIGJlZW4gY2hhbmdlZCB0byAnbicgbXVsdGlwbGljaXR5IHRvIHN1cHBvcnQgbG9jYWxpemF0aW9uIG9mIHRleHQgYW5kIGljb25zIikNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkxNDUwDQotCQkgICAgaGVpZ2h0ICAgICAJMTk0KQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMzYNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDAxNywgMTg0NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNg0KLQkJCWxvY2F0aW9uICAgCSgzNzgyLCAxNzI5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTQzNA0KLQkJCWxhYmVsICAgICAgCSJOZWVkIHRvIGNoZWNrIGNvbGxhcHNlV2hpdGVzcGFjZSBhdHRyaWJ1dGUiKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTQ5NA0KLQkJICAgIGhlaWdodCAgICAgCTI0NCkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDM3DQotCQkgICAgbG9jYXRpb24gICAJKDIxMzIsIDIwODIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzcNCi0JCQlsb2NhdGlvbiAgIAkoMTkwMywgMTk0NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAk0MjINCi0JCQlsYWJlbCAgICAgIAkNCi18TmVlZCBiYXNpYyB0eXBlLCBBbnlVUkkgKHBsYWNlIHRoaXMgaW4gc2FtZSBwYWNrYWdlIGFzIG5ldyBQYXNzd29yZC0tbWF5YmUgImNvbW1vbi1kYXRhdHlwZXMiKQ0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAk0ODINCi0JCSAgICBoZWlnaHQgICAgIAkyODcpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAzOA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTc1LCA0NzU4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM4DQotCQkJbG9jYXRpb24gICAJKDE3OCwgNDUxNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTkNCi0JCQltYXhfd2lkdGggIAkxOTU5DQotCQkJbGFiZWwgICAgICAJDQotfG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIGlzIHJlcGxhY2VkIGJ5IHJhLm91dGJvdW5kUkEuY29ubmVjdGlvbkRlZmluaXRpb25zLm1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzDQotfGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIGlzIHJlcGxhY2VkIGJ5IHJhLm91dGJvdW5kUkEuY29ubmVjdGlvbkRlZmluaXRpb25zLmNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlDQotfGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIGlzIHJlcGxhY2VkIGJ5IHJhLm91dGJvdW5kUkEuY29ubmVjdGlvbkRlZmluaXRpb25zLmNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzDQotfHRyYW5zYWN0aW9uU3VwcG9ydCBpcyByZXBsYWNlZCBieSByYS5vdXRib3VuZFJBLnRyYW5zYWN0aW9uU3VwcG9ydCANCi18Y29ubmVjdGlvbkludGVyZmFjZSBpcyByZXBsYWNlZCBieSByYS5vdXRib3VuZFJBLmNvbm5lY3Rpb25EZWZpbml0aW9ucy5jb25uZWN0aW9uSW50ZXJmYWNlDQotfGNvbm5lY3Rpb25JbXBsQ2xhc3MgaXMgcmVwbGFjZWQgYnkgcmEub3V0Ym91bmRSQS5jb25uZWN0aW9uRGVmaW5pdGlvbnMuY29ubmVjdGlvbkltcGxDbGFzcw0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAkyMDE5DQotCQkgICAgaGVpZ2h0ICAgICAJNTAwKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMzkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTE1NiwgNTE3NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzOQ0KLQkJCWxvY2F0aW9uICAgCSgzNCwgNTA5NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyMjA5DQotCQkJbGFiZWwgICAgICAJIlJlYWRlcnMgd2lsbCBuZWVkIHRvIGRldGVybWluZSBpZiB0aGUgc3RyaW5nIHR5cGUgY2FuIGJlIGNvbnZlcnRlZCB0byB0aGUgZGF0YXR5cGUgc3BlY2lmaWVkLiBTZWUgdGhlIHNwZWMuIE9yIG1heWJlIGluc3RlYWQgcHJvdmlkZSBoZWxwZXJzIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpZmllZCB0eXBlPyIpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJMjI2OQ0KLQkJICAgIGhlaWdodCAgICAgCTE2OSkNCi0JCShvYmplY3QgTGFiZWwgQDQwDQotCQkgICAgbG9jYXRpb24gICAJKDI0NCwgMjM1MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIG5saW5lcyAgICAgCTUNCi0JCSAgICBtYXhfd2lkdGggIAk0ODgNCi0JCSAgICBsYWJlbCAgICAgIAkiVGhlcmUgYXJlIHNvbWUgdW5pcXVlbmVzcyBjb25zdHJhaW50cyB0aGF0IG11c3QgYmUgdmFsaWRhdGVkIGhlcmUuIikNCi0JCShvYmplY3QgTm90ZVZpZXcgQDQxDQotCQkgICAgbG9jYXRpb24gICAJKDMzODYsIDYyNSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MQ0KLQkJCWxvY2F0aW9uICAgCSgyNzE3LCA1MjIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJMTMwMw0KLQkJCWxhYmVsICAgICAgCQ0KLXxEZXByZWNhdGlvbnMNCi18Y3VzdG9tQXV0aE1lY2hUeXBlIHJlcGxhY2VkIGJ5IGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtDQotfGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSByZXBsYWNlZCBieSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbQ0KLXxkZXNjcmlwdGlvbiByZXBsYWNlZCB3aXRoIGRlc2NyaXB0aW9uczpMaXN0PERlc2NyaXB0aW9uVHlwZT4NCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJMTM2Mw0KLQkJICAgIGhlaWdodCAgICAgCTIxOSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpNZXNzYWdlTGlzdGVuZXIiIEA0Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc3NCwgMzUzNykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCWxvY2F0aW9uICAgCSgyNDc3LCAzNDU2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZUxpc3RlbmVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRUMxMDJGQyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQlsb2NhdGlvbiAgIAkoMjQ3NywgMzUxNykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTU5MSkNCi0JCSAgICB3aWR0aCAgICAgIAk2MTINCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpNZXNzYWdlQWRhcHRlciIgQDQzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzkyLCAzMTM5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQzDQotCQkJbG9jYXRpb24gICAJKDI2MjUsIDMwODgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzM0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlQWRhcHRlciIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTJENjAxRjEiDQotCQkgICAgd2lkdGggICAgICAJMzUyDQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQiIEA0NA0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzQ2LCAzMzIyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRUNDMDA3NyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXNzYWdlTGlzdGVuZXJzIiBANDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMxLCAtNDQ2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2DQotCQkJCVBhcmVudF9WaWV3IAlANDUNCi0JCQkJbG9jYXRpb24gICAJKDI1MzQsIDM0MDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNjcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21lc3NhZ2VMaXN0ZW5lcnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjY2NjY3DQotCQkJCWhlaWdodCAgICAgCTIxMw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUVDQzAzQTIiDQotCQkJICAgIGNsaWVudCAgICAgCUA0NA0KLQkJCSAgICBzdXBwbGllciAgIAlANDINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNzQ2LCAzMzIyKQ0KLQkJCQkoMjc0NiwgMzQ0NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzQ2LCAzMzIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc0NiwgMzQ0NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjgzOCwgMzQwNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNjc3Nzc4DQotCQkJCWhlaWdodCAgICAgCTkyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNSIgQDQ4DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDQNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMSwgLTQ0NikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUVDQzAzQTQiDQotCQkJICAgIGNsaWVudCAgICAgCUA0NA0KLQkJCSAgICBzdXBwbGllciAgIAlANDMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNzQ2LCAzMzIyKQ0KLQkJCQkoMjc0NiwgMzIwMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzQ2LCAzMzIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc0NiwgMzIwMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpBY3RpdmF0aW9uU3BlYyIgQDQ5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzQ5LCAzOTU5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQ5DQotCQkJbG9jYXRpb24gICAJKDI0NjgsIDM4NzgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBY3RpdmF0aW9uU3BlYyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUYzMjAwNDIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQ5DQotCQkJbG9jYXRpb24gICAJKDI0NjgsIDM5MzkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1NjApDQotCQkgICAgd2lkdGggICAgICAJNTgwDQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYiIEA1MA0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzUzLCAzNzQ3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRjQ4MDAxMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhY3RpdmF0aW9uU3BlYyIgQDUxDQotCQkJICAgIFBhcmVudF9WaWV3IAlANTANCi0JCQkgICAgbG9jYXRpb24gICAJKC04NywgLTM3MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDUxDQotCQkJCWxvY2F0aW9uICAgCSgyNTc4LCAzODM1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjk0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithY3RpdmF0aW9uU3BlYyINCi0JCQkJcGN0RGlzdCAgICAJMC43NDE2NTcNCi0JCQkJaGVpZ2h0ICAgICAJMTc2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRjQ5MDEwMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDUwDQotCQkJICAgIHN1cHBsaWVyICAgCUA0OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3NTMsIDM3NDcpDQotCQkJCSgyNzUzLCAzODY2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3NTMsIDM3NDcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzUzLCAzODY2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDUxDQotCQkJCWxvY2F0aW9uICAgCSgyODAxLCAzODM4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NjE5MDUNCi0JCQkJaGVpZ2h0ICAgICAJNDgNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3IiBANTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTg3LCAtMzcxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRjQ5MDEwNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDUwDQotCQkJICAgIHN1cHBsaWVyICAgCUA0Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3NTMsIDM3NDcpDQotCQkJCSgyNzUzLCAzNjI5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3NTMsIDM3NDcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzUzLCAzNjI5KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OkNvbm5lY3Rpb25EZWZpbml0aW9uIiBANTUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMwMjEsIDE5MTUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTUNCi0JCQlsb2NhdGlvbiAgIAkoMjYxOCwgMTczNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk4MDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbm5lY3Rpb25EZWZpbml0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBNENGMDBGMiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANTUNCi0JCQlsb2NhdGlvbiAgIAkoMjYxOCwgMTc5NSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNg0KLQkJCW1heF93aWR0aCAgCTgwMykNCi0JCSAgICB3aWR0aCAgICAgIAk4MjQNCi0JCSAgICBoZWlnaHQgICAgIAkzODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIiBANTYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3MjAsIDMxMjYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANTYNCi0JCQlsb2NhdGlvbiAgIAkoMTQ3NSwgMzA3NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0OTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkluYm91bmRSZXNvdXJjZUFkYXB0ZXIiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUExREQwMjU3Ig0KLQkJICAgIHdpZHRoICAgICAgCTUwOA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyIiBANTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI5NSwgMzEzNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUUzODAyNUYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWVzc2FnZUFkYXB0ZXIiIEA1OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU3DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMTcsIC02MzQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTkNCi0JCQkJUGFyZW50X1ZpZXcgCUA1OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjQzMSwgMzA5MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM0MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWVzc2FnZUFkYXB0ZXIiDQotCQkJCXBjdERpc3QgICAgCTAuNDI1MDAwDQotCQkJCWhlaWdodCAgICAgCTQ1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRTM5MDA5NCINCi0JCQkgICAgY2xpZW50ICAgICAJQDU3DQotCQkJICAgIHN1cHBsaWVyICAgCUA0Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIyOTUsIDMxMzQpDQotCQkJCSgyNjE2LCAzMTM0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyOTUsIDMxMzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjE2LCAzMTM0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MA0KLQkJCQlQYXJlbnRfVmlldyAJQDU4DQotCQkJCWxvY2F0aW9uICAgCSgyNTY3LCAzMTc5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44NTE4MDMNCi0JCQkJaGVpZ2h0ICAgICAJNDUNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzIiBANjENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzE3LCAtNjM0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYyDQotCQkJCVBhcmVudF9WaWV3IAlANjENCi0JCQkJbG9jYXRpb24gICAJKDIwMzgsIDMwOTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUFFMzkwMDlFIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDU2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjI5NSwgMzEzNCkNCi0JCQkJKDE5NzQsIDMxMzQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI5NSwgMzEzNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5NzQsIDMxMzQpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpjYTo6QWRtaW5PYmplY3QiIEA2Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAyNiwgNDA2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCWxvY2F0aW9uICAgCSg3MzcsIDM5NTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTc4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBZG1pbk9iamVjdCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQURENjAwNEIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDYzDQotCQkJbG9jYXRpb24gICAJKDczNywgNDAxNSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTU3NSkNCi0JCSAgICB3aWR0aCAgICAgIAk1OTYNCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSIgQDY0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNzk4LCAzOTEzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY0DQotCQkJbG9jYXRpb24gICAJKDM1MjcsIDM4MzIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTQyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUZENjAxQTYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDY0DQotCQkJbG9jYXRpb24gICAJKDM1MjcsIDM4OTMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyOTQpDQotCQkgICAgd2lkdGggICAgICAJNTYwDQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgiIEA2NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMjc4LCAzOTg0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRkFBMDI3RiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMiIEA2Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDY1DQotCQkJICAgIGxvY2F0aW9uICAgCSg0MjIsIC01OTcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjcNCi0JCQkJUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMzMxMiwgMzkzOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjE0NTY5NQ0KLQkJCQloZWlnaHQgICAgIAk0Nw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUZBQjAzNDkiDQotCQkJICAgIGNsaWVudCAgICAgCUA2NQ0KLQkJCSAgICBzdXBwbGllciAgIAlANjQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzMjc4LCAzOTg0KQ0KLQkJCQkoMzUxOCwgMzk4NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjc4LCAzOTg0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzUxOCwgMzk4NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjgNCi0JCQkJUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMzQ3MCwgNDAzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODAxMzI0DQotCQkJCWhlaWdodCAgICAgCTQ4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOSIgQDY5DQotCQkJICAgIFBhcmVudF9WaWV3IAlANjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDQyMiwgLTU5NykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUZBQjAzNTMiDQotCQkJICAgIGNsaWVudCAgICAgCUA2NQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzMjc4LCAzOTg0KQ0KLQkJCQkoMzAzOSwgMzk4NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjc4LCAzOTg0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzAzOSwgMzk4NCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpDb25maWdQcm9wZXJ0eSIgQDcwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNDYsIDM3NzcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzANCi0JCQlsb2NhdGlvbiAgIAkoNTgsIDM2MjEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTc2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJDb25maWdQcm9wZXJ0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MjJDMDE4OCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANzANCi0JCQlsb2NhdGlvbiAgIAkoNTgsIDM2ODIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAk1NzIpDQotCQkgICAgd2lkdGggICAgICAJNTk0DQotCQkgICAgaGVpZ2h0ICAgICAJMzM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYiIEA3MQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDE5MDMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUE2RjIwMTE3Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbmZpZ1Byb3BlcnRpZXMiIEA3Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDcxDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjE1OSwgLTE1MjkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzMNCi0JCQkJUGFyZW50X1ZpZXcgCUA3Mg0KLQkJCQlsb2NhdGlvbiAgIAkoNTc4LCAzMzg1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzE0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb25maWdQcm9wZXJ0aWVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg4MTg1Mw0KLQkJCQloZWlnaHQgICAgIAkzNg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTZGMzAxNjkiDQotCQkJICAgIGNsaWVudCAgICAgCUA3MQ0KLQkJCSAgICBzdXBwbGllciAgIAlANzANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3MjMsIDE5MDMpDQotCQkJCSg1NDIsIDE5MDMpDQotCQkJCSg1NDIsIDM2MDkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzIzLCAxOTAzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTQyLCAzNjA5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NA0KLQkJCQlQYXJlbnRfVmlldyAJQDcyDQotCQkJCWxvY2F0aW9uICAgCSg1OTYsIDM0MTkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTciIEA3NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDcxDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjE1OSwgLTE1MjkpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUE2RjMwMTczIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzENCi0JCQkgICAgc3VwcGxpZXIgICAJQDU1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzIzLCAxOTAzKQ0KLQkJCQkoMjYwOSwgMTkwMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjMsIDE5MDMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjA5LCAxOTAzKSkpKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA3Ng0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDM5DQotCQkgICAgc3VwcGxpZXIgICAJQDcwDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDEyNSwgNTA5MCkNCi0JCQkoMTI1LCAzOTQ0KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUsIDUwOTApDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNSwgMzk0NCkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAiIEA3Nw0KLQkJICAgIGxvY2F0aW9uICAgCSg0OTEsIDQwNzEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUIxNEEwMkI5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbmZpZ1Byb3BlcnRpZXMiIEA3OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDc3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDA0LCAtMTQzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5DQotCQkJCVBhcmVudF9WaWV3IAlANzgNCi0JCQkJbG9jYXRpb24gICAJKDU0NiwgNDAzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMxNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29uZmlnUHJvcGVydGllcyINCi0JCQkJcGN0RGlzdCAgICAJLTAuMjQwODc2DQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFCMTRCMDM0NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDc3DQotCQkJICAgIHN1cHBsaWVyICAgCUA3MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQ5MSwgNDA3MSkNCi0JCQkJKDM4MSwgNDA3MSkNCi0JCQkJKDM4MSwgMzk0NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTEsIDQwNzEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODEsIDM5NDUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwDQotCQkJCVBhcmVudF9WaWV3IAlANzgNCi0JCQkJbG9jYXRpb24gICAJKDQzNSwgMzk2OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMSIgQDgxDQotCQkJICAgIFBhcmVudF9WaWV3IAlANzcNCi0JCQkgICAgbG9jYXRpb24gICAJKC00MDQsIC0xNDMpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUIxNEIwMzUxIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDkxLCA0MDcxKQ0KLQkJCQkoNzI4LCA0MDcxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ5MSwgNDA3MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDcyOCwgNDA3MSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amNhOjpTZWN1cml0eVBlcm1pc3Npb24iIEA4Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMjUyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4Mg0KLQkJCWxvY2F0aW9uICAgCSgxNDk0LCAyNDIyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlQZXJtaXNzaW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkzQzEwMEY0Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA4Mg0KLQkJCWxvY2F0aW9uICAgCSgxNDk0LCAyNDgzKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNTcyKQ0KLQkJICAgIHdpZHRoICAgICAgCTU5Mg0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6Ok91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIiBAODMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4ODEsIDE2NTcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAODMNCi0JCQlsb2NhdGlvbiAgIAkoMTQ1MCwgMTU1MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk4NjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBMUU2MDIzQyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAODMNCi0JCQlsb2NhdGlvbiAgIAkoMTQ1MCwgMTYxMikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTg2MCkNCi0JCSAgICB3aWR0aCAgICAgIAk4ODANCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDg0DQotCQkgICAgbG9jYXRpb24gICAJKDI1ODEsIDE2MjIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUE0REMwMjZFIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbm5lY3Rpb25EZWZpbml0aW9ucyIgQDg1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODQNCi0JCQkgICAgbG9jYXRpb24gICAJKDkyNSwgLTE4MDcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODYNCi0JCQkJUGFyZW50X1ZpZXcgCUA4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY0OCwgMTU4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQyMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29ubmVjdGlvbkRlZmluaXRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjI2MjU0OA0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTRERDAwNUMiDQotCQkJICAgIGNsaWVudCAgICAgCUA4NA0KLQkJCSAgICBzdXBwbGllciAgIAlANTUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNTgxLCAxNjIyKQ0KLQkJCQkoMjc0MCwgMTYyMikNCi0JCQkJKDI3NDAsIDE3MjIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjU4MSwgMTYyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3NDAsIDE3MjIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3DQotCQkJCVBhcmVudF9WaWV3IAlAODUNCi0JCQkJbG9jYXRpb24gICAJKDI2OTQsIDE2NTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQzOTUxNg0KLQkJCQloZWlnaHQgICAgIAkzNA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMiIEA4OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg0DQotCQkJICAgIGxvY2F0aW9uICAgCSg5MjUsIC0xODA3KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBNEREMDA2NiINCi0JCQkgICAgY2xpZW50ICAgICAJQDg0DQotCQkJICAgIHN1cHBsaWVyICAgCUA4Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI1ODEsIDE2MjIpDQotCQkJCSgyMzIxLCAxNjIyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI1ODEsIDE2MjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzIxLCAxNjIyKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqY2E6OlJlc291cmNlQWRhcHRlciIgQDg5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2MTIsIDEwNDUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAODkNCi0JCQlsb2NhdGlvbiAgIAkoMTgxLCA3ODkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJODYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZXNvdXJjZUFkYXB0ZXIiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTEyQTAyQTkiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDg5DQotCQkJbG9jYXRpb24gICAJKDE4MSwgODUwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk5DQotCQkJbWF4X3dpZHRoICAJODYwKQ0KLQkJICAgIHdpZHRoICAgICAgCTg4MA0KLQkJICAgIGhlaWdodCAgICAgCTUzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwIiBAOTANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA2MCwgMTY0MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTM2MzAzMDIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAib3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiIEA5MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkwDQotCQkJICAgIGxvY2F0aW9uICAgCSg0ODMsIC0zMjQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTINCi0JCQkJUGFyZW50X1ZpZXcgCUA5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgMTc0MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTUwMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiDQotCQkJCXBjdERpc3QgICAgCTAuMjgzNDY1DQotCQkJCWhlaWdodCAgICAgCTk4DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBMzY1MDM2OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDkwDQotCQkJICAgIHN1cHBsaWVyICAgCUA4Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwNjAsIDE2NDMpDQotCQkJCSgxNDQxLCAxNjQzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNjAsIDE2NDMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQxLCAxNjQzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDkxDQotCQkJCWxvY2F0aW9uICAgCSgxNDAzLCAxNjk3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExIiBAOTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDgzLCAtMzI0KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBMzY1MDM2QiINCi0JCQkgICAgY2xpZW50ICAgICAJQDkwDQotCQkJICAgIHN1cHBsaWVyICAgCUA4OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwNjAsIDE2NDMpDQotCQkJCSgxMDAwLCAxNjQzKQ0KLQkJCQkoMTAwMCwgMTMxMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDYwLCAxNjQzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwMCwgMTMxMykpKSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAOTUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUAzOA0KLQkJICAgIHN1cHBsaWVyICAgCUA4OQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyOTEsIDQ1MDcpDQotCQkJKDI5MSwgMTMxMykpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjkxLCA0NTA3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTEsIDEzMTMpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4IiBAOTYNCi0JCSAgICBsb2NhdGlvbiAgIAkoODM0LCAyNTM1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFEQ0QwMzZBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImluYm91bmRSZXNvdXJjZUFkYXB0ZXIiIEA5Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk2DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNTcsIDU2OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OA0KLQkJCQlQYXJlbnRfVmlldyAJQDk3DQotCQkJCWxvY2F0aW9uICAgCSgxMTk5LCAzMDc5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDg5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitpbmJvdW5kUmVzb3VyY2VBZGFwdGVyIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc4MTczOQ0KLQkJCQloZWlnaHQgICAgIAk0Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQURDRjAzMTIiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANTYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4MzQsIDI1MzUpDQotCQkJCSg4MzQsIDMxMjQpDQotCQkJCSgxNDY2LCAzMTI0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgzNCwgMjUzNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjYsIDMxMjQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5DQotCQkJCVBhcmVudF9WaWV3IAlAOTcNCi0JCQkJbG9jYXRpb24gICAJKDEzNDMsIDMxNzgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkiIEAxMDANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjU3LCA1NjgpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUFEQ0YwMzE0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOTYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODM0LCAyNTM1KQ0KLQkJCQkoODM0LCAxMzEzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgzNCwgMjUzNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgzNCwgMTMxMykpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMCIgQDEwMQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3ODcsIDI2MjYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUUwMjAzMjAiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYWRtaW5PYmplY3RzIiBAMTAyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxDQotCQkJICAgIGxvY2F0aW9uICAgCSgyMTAsIDY1OSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDINCi0JCQkJbG9jYXRpb24gICAJKDk2MywgMzg5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYWRtaW5PYmplY3RzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk2NjQ3Mg0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUFFMDQwMTYwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTAxDQotCQkJICAgIHN1cHBsaWVyICAgCUA2Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDc4NywgMjYyNikNCi0JCQkJKDc4NywgMzk0MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDI2MjYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODcsIDM5NDEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEwMg0KLQkJCQlsb2NhdGlvbiAgIAkoNzI4LCAzOTEzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45Nzg4NjMNCi0JCQkJaGVpZ2h0ICAgICAJNjANCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxIiBAMTA1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxDQotCQkJICAgIGxvY2F0aW9uICAgCSgyMTAsIDY1OSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUUwNDAxNkIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDENCi0JCQkgICAgc3VwcGxpZXIgICAJQDg5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzg3LCAyNjI2KQ0KLQkJCQkoNzg3LCAxMzEyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMjYyNikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc4NywgMTMxMikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBAMTA2DQotCQkgICAgbG9jYXRpb24gICAJKDI0NCwgMjQ2MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5NDRDMDBENiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb25maWdQcm9wZXJ0aWVzIiBAMTA3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzQ4LCAxMjQ1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOA0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjQ2LCAzNDA2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzE0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb25maWdQcm9wZXJ0aWVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgyMzc4Mg0KLQkJCQloZWlnaHQgICAgIAkyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNjA5NDREMDE5NiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNg0KLQkJCSAgICBzdXBwbGllciAgIAlANzANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNDQsIDI0NjEpDQotCQkJCSgyNDQsIDM2MDkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjQ0LCAyNDYxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQ0LCAzNjA5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDcNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMzQ5NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODk5NzI3DQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAMTEwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzQ4LCAxMjQ1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNjA5NDREMDE5OCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNg0KLQkJCSAgICBzdXBwbGllciAgIAlAODkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNDQsIDI0NjEpDQotCQkJCSgyNDQsIDEzMTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjQ0LCAyNDYxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQ0LCAxMzEzKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxMTENCi0JCSAgICBsb2NhdGlvbiAgIAkoOTMxLCAyMTc0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MDkzQ0MwMDFFIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlY3VyaXR5UGVybWlzc2lvbnMiIEAxMTINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTENCi0JCQkgICAgbG9jYXRpb24gICAJKDMzOSwgOTU4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMw0KLQkJCQlQYXJlbnRfVmlldyAJQDExMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTI3MSwgMjQ0MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQwNw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VjdXJpdHlQZXJtaXNzaW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC43NTI2ODgNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MDkzQ0MwMzY3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTExDQotCQkJICAgIHN1cHBsaWVyICAgCUA4Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDkzMSwgMjE3NCkNCi0JCQkJKDkzMSwgMjQ4MCkNCi0JCQkJKDE0ODUsIDI0ODApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTMxLCAyMTc0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NSwgMjQ4MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0DQotCQkJCVBhcmVudF9WaWV3IAlAMTEyDQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCAyNTMzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MTAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEAxMTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTENCi0JCQkgICAgbG9jYXRpb24gICAJKDMzOSwgOTU4KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNjA5M0NDMDM2OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDExMQ0KLQkJCSAgICBzdXBwbGllciAgIAlAODkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5MzEsIDIxNzQpDQotCQkJCSg5MzEsIDEzMTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTMxLCAyMTc0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTMxLCAxMzEzKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIiBAMTE2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzc1LCAyNjY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDExNg0KLQkJCWxvY2F0aW9uICAgCSgyNjMxLCAyNTM5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDExNg0KLQkJCWxvY2F0aW9uICAgCSgyNjMxLCAyNjQ0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjg0KQ0KLQkJICAgIHdpZHRoICAgICAgCTMwNg0KLQkJICAgIGhlaWdodCAgICAgCTI4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM2IiBAMTE3DQotCQkgICAgbG9jYXRpb24gICAJKDM4NTYsIDI3ODYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFGRUMwMUJDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDExOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzM3NSwgLTIzMDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5DQotCQkJCVBhcmVudF9WaWV3IAlAMTE4DQotCQkJCWxvY2F0aW9uICAgCSgzMDY2LCAyNzEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuODY3OTA2DQotCQkJCWhlaWdodCAgICAgCTMyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRkY0MDAxOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDExNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTE2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzg1NiwgMjc4NikNCi0JCQkJKDM4NTYsIDI2ODApDQotCQkJCSgyOTI4LCAyNjgwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM4NTYsIDI3ODYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTI4LCAyNjgwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjANCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTgNCi0JCQkJbG9jYXRpb24gICAJKDI5OTAsIDI3NTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0MTI5Mg0KLQkJCQloZWlnaHQgICAgIAk3OA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzciIEAxMjENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcNCi0JCQkgICAgbG9jYXRpb24gICAJKDMzNzUsIC0yMzA4KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBRkY0MDAyNCINCi0JCQkgICAgY2xpZW50ICAgICAJQDExNw0KLQkJCSAgICBzdXBwbGllciAgIAlANjQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzODU2LCAyNzg2KQ0KLQkJCQkoMzg1NiwgMzgyMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzODU2LCAyNzg2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzg1NiwgMzgyMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzOCIgQDEyMg0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAyNzM0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFCNUEwMzRBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDEyMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoODg3LCAtMTA0MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjMNCi0JCQkJbG9jYXRpb24gICAJKDI0NjMsIDI2MzQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC44ODkwNDQNCi0JCQkJaGVpZ2h0ICAgICAJMTAxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBQjYxMDBCRiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTE2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTE5MywgMjczNCkNCi0JCQkJKDI2MjIsIDI3MzQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTE5MywgMjczNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2MjIsIDI3MzQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyMw0KLQkJCQlsb2NhdGlvbiAgIAkoMjU1MCwgMjc4NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTQ5NzU2DQotCQkJCWhlaWdodCAgICAgCTUxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzOSIgQDEyNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoODg3LCAtMTA0MCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUI2MTAwQzkiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjINCi0JCQkgICAgc3VwcGxpZXIgICAJQDcwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTE5MywgMjczNCkNCi0JCQkJKDY0MCwgMjczNCkNCi0JCQkJKDY0MCwgMzYwOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkzLCAyNzM0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQwLCAzNjA5KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQwIiBAMTI3DQotCQkgICAgbG9jYXRpb24gICAJKDIzNDksIDI2MDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QUFBMzIwMkZFIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDEyOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzM4LCAtMjQwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyOA0KLQkJCQlsb2NhdGlvbiAgIAkoMzA4MSwgMjU4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkyLjY4NDk4Mg0KLQkJCQloZWlnaHQgICAgIAkyMQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUEzNDAwMTIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIzNDksIDI2MDApDQotCQkJCSgyNjIyLCAyNjAwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzNDksIDI2MDApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjIyLCAyNjAwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzANCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjgNCi0JCQkJbG9jYXRpb24gICAJKDI1NjMsIDI1NTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc4Mzg4Mw0KLQkJCQloZWlnaHQgICAgIAk0NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDEiIEAxMzENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcNCi0JCQkgICAgbG9jYXRpb24gICAJKDczOCwgLTI0MCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQUEzNDAwMUMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDgyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjM0OSwgMjYwMCkNCi0JCQkJKDIwNzcsIDI2MDApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM0OSwgMjYwMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwNzcsIDI2MDApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpjYTo6QXV0aGVudGljYXRpb25NZWNoYW5pc20iIEAxMzINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIyMzEsIDEwNDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTMyDQotCQkJbG9jYXRpb24gICAJKDE2MzMsIDg1OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxMTk2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNjA5MTQwMDNDRSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTMyDQotCQkJbG9jYXRpb24gICAJKDE2MzMsIDkyMCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNg0KLQkJCW1heF93aWR0aCAgCTExOTQpDQotCQkgICAgd2lkdGggICAgICAJMTIxNA0KLQkJICAgIGhlaWdodCAgICAgCTM4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxMzMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUAzMw0KLQkJICAgIHN1cHBsaWVyICAgCUAxMzINCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTI1MCwgNTQ5KQ0KLQkJCSgxODQ2LCA4NDYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQiIEAxMzQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA0MSwgMTM4NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEFBNTQ0MDBGQiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiIEAxMzUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDM4NSwgLTIwNDMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2DQotCQkJCVBhcmVudF9WaWV3IAlAMTM1DQotCQkJCWxvY2F0aW9uICAgCSgyMzU5LCAxMzE4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTA5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiDQotCQkJCXBjdERpc3QgICAgCTAuNDQ0NDQ0DQotCQkJCWhlaWdodCAgICAgCTMxOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQTU0NTAyOEQiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEzMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIwNDEsIDEzODYpDQotCQkJCSgyMDQxLCAxMjMzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwNDEsIDEzODYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDQxLCAxMjMzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQkJbG9jYXRpb24gICAJKDIxNDIsIDEyNTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgzNDM3MA0KLQkJCQloZWlnaHQgICAgIAkxMDENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1IiBAMTM4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0DQotCQkJICAgIGxvY2F0aW9uICAgCSgzODUsIC0yMDQzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEFBNTQ1MDI4RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzNA0KLQkJCSAgICBzdXBwbGllciAgIAlAODMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMDQxLCAxMzg2KQ0KLQkJCQkoMjA0MSwgMTUzOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDQxLCAxMzg2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA0MSwgMTUzOSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMTM5DQotCQkgICAgbG9jYXRpb24gICAJKDEzMzgsIDEwNTApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzYwOTQxMjAwMjgiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXV0aGVudGljYXRpb25NZWNoYW5pc21zIiBAMTQwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5DQotCQkJICAgIGxvY2F0aW9uICAgCSg3NDYsIC0xNjYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxDQotCQkJCVBhcmVudF9WaWV3IAlAMTQwDQotCQkJCWxvY2F0aW9uICAgCSgxNDEwLCAxMDE4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTA5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiDQotCQkJCXBjdERpc3QgICAgCTAuMjUzMzk0DQotCQkJCWhlaWdodCAgICAgCTMzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNjA5NDEyMDM5MCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTMyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMzOCwgMTA1MCkNCi0JCQkJKDE2MjQsIDEwNTApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTMzOCwgMTA1MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjQsIDEwNTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDE0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU5NSwgMTEwNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODk4NjAxDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMTQzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5DQotCQkJICAgIGxvY2F0aW9uICAgCSg3NDYsIC0xNjYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MDk0MTIwMzkyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTM5DQotCQkJICAgIHN1cHBsaWVyICAgCUA4OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMzgsIDEwNTApDQotCQkJCSgxMDUyLCAxMDUwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzMzgsIDEwNTApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDUyLCAxMDUwKSkpKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxNDQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUA0MQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxMzINCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMzA3OCwgNzM0KQ0KLQkJCSgyNzY1LCA4NDYpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzIiIEAxNDUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzczNCwgMTcwMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBQThBMjAwMUUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMTQ2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNDYzLCAtODAxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDE0Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMCwgMjgzMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAk2LjU2MDk3Ng0KLQkJCQloZWlnaHQgICAgIAkyMDUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUE4QTMwMDMzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTQ1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNzM0LCAxNzAzKQ0KLQkJCQkoMzczNCwgMjYyNSkNCi0JCQkJKDI5MjgsIDI2MjUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzczNCwgMTcwMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI5MjgsIDI2MjUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OA0KLQkJCQlQYXJlbnRfVmlldyAJQDE0Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjk5MywgMjUxNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTYyMTM4DQotCQkJCWhlaWdodCAgICAgCTExMQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzMiIEAxNDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE0NjMsIC04MDEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0QUE4QTMwMDNEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTQ1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMzINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNzM0LCAxNzAzKQ0KLQkJCQkoMzczNCwgODcxKQ0KLQkJCQkoMjgzOCwgODcxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM3MzQsIDE3MDMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODM4LCA4NzEpKSkpKSkpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL2pzcF8yXzAuY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvanNwXzJfMC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNmViN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvanNwXzJfMC5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0Nw0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImpzcCINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiSnNwIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuanN0LmoyZWUiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJqc3AueG1pIikpKQ0KLSAgICBxdWlkICAgICAgIAkiM0U0RDRGNjkwMzZCIg0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJKU1BDb25maWciDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDRBM0EwMUM4Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIGpzcC1jb25maWdUeXBlIGlzIHVzZWQgdG8gcHJvdmlkZSBnbG9iYWwgY29uZmlndXJhdGlvbg0KLXxpbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzDQotfHR3byBzdWJlbGVtZW50cywgdGFnbGliIGFuZCBqc3AtcHJvcGVydHktZ3JvdXAuDQotCSAgICApDQotCShvYmplY3QgQ2xhc3MgIkpTUFByb3BlcnR5R3JvdXAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDRBOTcwMzUzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQNCi18VGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZg0KLXxmaWxlcyBzbyB0aGV5IGNhbiBiZSBnaXZlbiBnbG9iYWwgcHJvcGVydHkgaW5mb3JtYXRpb24uDQotfEFsbCBmaWxlcyBzbyBkZXNjcmliZWQgYXJlIGRlZW1lZCB0byBiZSBKU1AgZmlsZXMuIFRoZQ0KLXxmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGNhbiBiZSBkZXNjcmliZWQ6DQotfA0KLXwtIENvbnRyb2wgZW5hYmxpbmcgb2YgRUwgZXZhbHVhdGlvbi4gLSBDb250cm9sIGVuYWJsaW5nDQotfG9mIFNjcmlwdGluZyBlbGVtZW50cy4gLSBJbmRpY2F0ZSBwYWdlRW5jb2RpbmcNCi18aW5mb3JtYXRpb24uIC0gSW5kaWNhdGluZyB0aGF0IGEgcmVzb3VyY2UgaXMgYSBKU1ANCi18ZG9jdW1lbnQgLSBQcmVsdWRlIGFuZCBDb2RhIGF1dG9tYXRpYyBpbmNsdWRlcy4NCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDRDQ0QwMTQ0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVybFBhdHRlcm4iDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0Q0RDMDIzNiINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxJZ25vcmVkIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENENFMzAyQjgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfENhbiBiZSB1c2VkIHRvIGVhc2lseSBzZXQgdGhlIGlzRUxJZ25vcmVkDQotfAlwcm9wZXJ0eSBvZiBhIGdyb3VwIG9mIEpTUCBwYWdlcy4gQnkgZGVmYXVsdCwNCi18CXRoZSBFTCBldmFsdWF0aW9uIGlzIGVuYWJsZWQgZm9yIFdlYg0KLXwJQXBwbGljYXRpb25zIHVzaW5nIGEgU2VydmxldCAyLjQgb3IgZ3JlYXRlcg0KLXwJd2ViLnhtbCwgYW5kIGRpc2FibGVkIG90aGVyd2lzZS4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBpbml0diAgICAgIAkidHJ1ZSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhZ2VFbmNvZGluZyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDREMzMwMTBFIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdmFsaWQgdmFsdWVzIG9mIHBhZ2UtZW5jb2RpbmcgYXJlIHRob3NlIG9mDQotfAl0aGUgcGFnZUVuY29kaW5nIHBhZ2UgZGlyZWN0aXZlLiBJdCBpcyBhDQotfAl0cmFuc2xhdGlvbi10aW1lIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50DQotfAllbmNvZGluZ3MgaW4gdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlDQotfAlwYWdlIGRpcmVjdGl2ZSBvZiBhIEpTUCBwYWdlIGFuZCBpbiBhIEpTUA0KLXwJY29uZmlndXJhdGlvbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBwYWdlLiBJdCBpcw0KLXwJYWxzbyBhIHRyYW5zbGF0aW9uLXRpbWUgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQNCi18CWVuY29kaW5ncyBpbiB0aGUgcHJvbG9nIG9mIGEgZG9jdW1lbnQgaW4gWE1MDQotfAlzeW50YXggYW5kIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudA0KLXwJbWF0Y2hpbmcgdGhlIGRvY3VtZW50LiBJdCBpcyBsZWdhbCB0byBuYW1lIHRoZQ0KLXwJc2FtZSBlbmNvZGluZyB0aHJvdWdoIG11bGl0cGxlIG1lY2hhbmlzbXMuDQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjcmlwdGluZ0ludmFsaWQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0RDU4MDNFMyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Q2FuIGJlIHVzZWQgdG8gZWFzaWx5IGRpc2FibGUgc2NyaXB0aW5nIGluIGENCi18CWdyb3VwIG9mIEpTUCBwYWdlcy4gQnkgZGVmYXVsdCwgc2NyaXB0aW5nIGlzDQotfAllbmFibGVkLg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGluaXR2ICAgICAgCSJ0cnVlIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaXNYTUwiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0REJBMDAxOCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18SWYgdHJ1ZSwgZGVub3RlcyB0aGF0IHRoZSBncm91cCBvZiByZXNvdXJjZXMNCi18CXRoYXQgbWF0Y2ggdGhlIFVSTCBwYXR0ZXJuIGFyZSBKU1AgZG9jdW1lbnRzLA0KLXwJYW5kIHRodXMgbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBYTUwgZG9jdW1lbnRzLg0KLXwJSWYgZmFsc2UsIHRoZSByZXNvdXJjZXMgYXJlIGFzc3VtZWQgdG8gbm90IGJlDQotfAlKU1AgZG9jdW1lbnRzLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlciBwcm9wZXJ0eQ0KLXwJZ3JvdXAgdGhhdCBpbmRpY2F0ZXMgb3RoZXJ3aXNlLg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGluaXR2ICAgICAgCSJmYWxzZSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluY2x1ZGVQcmVsdWRlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDRFMTcwMEVFIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgaW5jbHVkZS1wcmVsdWRlIGVsZW1lbnQgaXMgYQ0KLXwJY29udGV4dC1yZWxhdGl2ZSBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvDQotfAlhbiBlbGVtZW50IGluIHRoZSBXZWIgQXBwbGljYXRpb24uIFdoZW4gdGhlDQotfAllbGVtZW50IGlzIHByZXNlbnQsIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUNCi18CWF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzIGluIGFuIGluY2x1ZGUNCi18CWRpcmVjdGl2ZSkgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIEpTUCBwYWdlIGluDQotfAl0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4NCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVkZUNvZGFzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENEUzNzAyMzUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBpbmNsdWRlLWNvZGEgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUNCi18CXBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUNCi18CVdlYiBBcHBsaWNhdGlvbi4gV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LA0KLXwJdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkDQotfAkoYXMgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBlbmQgb2YgZWFjaA0KLXwJSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuDQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJUYWdMaWJSZWZUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ0QzM3MDE0OCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40DQotfEEgdGFnbGliIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gYSB0YWcNCi18bGlicmFyeSB0aGF0IGlzIHVzZWQgYnkgYSBKU1AgcGFnZSB3aXRoaW4gdGhlIFdlYg0KLXxBcHBsaWNhdGlvbi4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhZ2xpYlVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDRDNEEwMkNDIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXwgQSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJIGlkZW50aWZ5aW5nIGENCi18ICAgICAgICB0YWcgbGlicmFyeSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uICBUaGUgYm9keQ0KLXwgICAgICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbg0KLXwgICAgICAgIGFic29sdXRlIFVSSSBzcGVjaWZpY2F0aW9uLCBvciBhIHJlbGF0aXZlIFVSSS4NCi18ICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gZW50cmllcyBpbiB3ZWIueG1sIHdpdGggdGhlDQotfCAgICAgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YWdsaWJMb2NhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDRDNEYwM0IwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXx0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uDQotfCAgICAgICAgKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYg0KLXwgICAgICAgIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcgTGlicmFyeQ0KLXwgICAgICAgIERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDRCNTYwMjQ5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInRhZ0xpYnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0QjU3MDA3NCINCi0JCSAgICBsYWJlbCAgICAgIAkidGFnTGlicyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpqc3A6OlRhZ0xpYlJlZlR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QzM3MDE0OCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0QjU3MDA3NiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpqc3A6OkpTUENvbmZpZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRBM0EwMUM4Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ0QzlEMDNEQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJwcm9wZXJ0eUdyb3VwcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDRDOUUwMzRGIg0KLQkJICAgIGxhYmVsICAgICAgCSJwcm9wZXJ0eUdyb3VwcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpqc3A6OkpTUFByb3BlcnR5R3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QTk3MDM1MyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0QzlFMDM1MSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpqc3A6OkpTUENvbmZpZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRBM0EwMUM4Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJKU1BfMl8wIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ0RkEyMDNBOSINCi0JICAgIHRpdGxlICAgICAgCSJKU1BfMl8wIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTUzMQ0KLQkgICAgb3JpZ2luX3kgICAJMTY4NA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6anNwOjpKU1BQcm9wZXJ0eUdyb3VwIiBAMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA1NiwgMTc5MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDU5MSwgMTU2MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk5MzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkpTUFByb3BlcnR5R3JvdXAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRBOTcwMzUzIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDU5MSwgMTYyMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJOA0KLQkJCW1heF93aWR0aCAgCTgwMCkNCi0JCSAgICB3aWR0aCAgICAgIAk5NDgNCi0JCSAgICBoZWlnaHQgICAgIAk0ODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6anNwOjpUYWdMaWJSZWZUeXBlIiBAMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAwMCwgMTY4MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDE3MzcsIDE1NzQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTI2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJUYWdMaWJSZWZUeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QzM3MDE0OCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxNzM3LCAxNjM1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNDQ0KQ0KLQkJICAgIHdpZHRoICAgICAgCTU0NA0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpqc3A6OkpTUENvbmZpZyIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDExODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgxMzgzLCAxMTMzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSlNQQ29uZmlnIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE1Nzc4MDQyDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QTNBMDFDOCINCi0JCSAgICB3aWR0aCAgICAgIAkyOTINCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBANA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDU0LCAxMTY4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENEM5RDAzREEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNzMsIC0xNjEyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYNCi0JCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJCWxvY2F0aW9uICAgCSgxMzEwLCAxMTI3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENEM5RTAzNTEiDQotCQkJICAgIGNsaWVudCAgICAgCUA0DQotCQkJICAgIHN1cHBsaWVyICAgCUAzDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDU0LCAxMTY4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3NCwgMTE2OCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAicHJvcGVydHlHcm91cHMiIEA3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTczLCAtMTYxMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4DQotCQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCQlsb2NhdGlvbiAgIAkoODE5LCAxNTA0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzA4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwcm9wZXJ0eUdyb3VwcyINCi0JCQkJcGN0RGlzdCAgICAJMC44OTk0OTgNCi0JCQkJaGVpZ2h0ICAgICAJMTc2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QzlFMDM0RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDU0LCAxMTY4KQ0KLQkJCQkoOTk0LCAxMTY4KQ0KLQkJCQkoOTk0LCAxNTQ4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNTQsIDExNjgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTQsIDE1NDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkNCi0JCQkJUGFyZW50X1ZpZXcgCUA3DQotCQkJCWxvY2F0aW9uICAgCSgxMDYxLCAxNTA5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MTIwNjANCi0JCQkJaGVpZ2h0ICAgICAJNjcNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDEwDQotCQkgICAgbG9jYXRpb24gICAJKDIwMDYsIDEyMjIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRCNTYwMjQ5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInRhZ0xpYnMiIEAxMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNjc2LCA5MTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwMSwgMTUxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrdGFnTGlicyINCi0JCQkJcGN0RGlzdCAgICAJMC44NjY5OTUNCi0JCQkJaGVpZ2h0ICAgICAJMTA2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QjU3MDA3NCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDA2LCAxMjIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAwNiwgMTU2MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA3MCwgMTUxNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODU5NjA2DQotCQkJCWhlaWdodCAgICAgCTY0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBAMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NiwgOTE2KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QjU3MDA3NiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwDQotCQkJICAgIHN1cHBsaWVyICAgCUAzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjAwNiwgMTIyMikNCi0JCQkJKDIwMDYsIDExNjIpDQotCQkJCSgxNjY2LCAxMTYyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwMDYsIDEyMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY2LCAxMTYyKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIiBAMTUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQxMSwgMTIzMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCWxvY2F0aW9uICAgCSg2NSwgMTA1NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2OTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCWxvY2F0aW9uICAgCSg2NSwgMTE1OSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTQzNykNCi0JCSAgICB3aWR0aCAgICAgIAk3MTANCi0JCSAgICBoZWlnaHQgICAgIAkzODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0Q0NEMDE0NCINCi0JCSAgICBjbGllbnQgICAgIAlAMQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxNQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg1ODIsIDE1NDgpDQotCQkJKDUwOSwgMTU0OCkNCi0JCQkoNTA5LCAxNDI0KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1ODIsIDE1NDgpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUwOSwgMTQyNCkpKSkpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3RhZ2xpYl8xXzEuY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvdGFnbGliXzFfMS5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwY2Q1ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvdGFnbGliXzFfMS5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQ2ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNDcNCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ0YWdsaWIiDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuanN0LmoyZWUiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJ0YWdsaWIueG1pIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIlRhZ2xpYiIpKSkNCi0gICAgcXVpZCAgICAgICAJIjM5QTZCQTVGMDA3MCINCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiVGFnTGliIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JICAgIHF1aWQgICAgICAgCSIzOUE2QkE1RjAwRTgiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6DQotfA0KLXxkZXNjcmlwdGlvbiAgICAgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLA0KLXwgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUNCi18DQotfGRpc3BsYXktbmFtZSAgICB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYQ0KLXwgICAgICAgICAgICAgICAgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZA0KLXwgICAgICAgICAgICAgICAgYnkgdG9vbHMNCi18DQotfGljb24gICAgICAgICAgICBvcHRpb25hbCBpY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMNCi18DQotfHRsaWItdmVyc2lvbiAgICB0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24NCi18DQotfHNob3J0LW5hbWUgICAgICBhIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZQ0KLXwgICAgICAgICAgICAgICAgdXNlZCBieSBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUNCi18ICAgICAgICAgICAgICAgIG5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsDQotfCAgICAgICAgICAgICAgICB0aGUgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkIHByZWZpeA0KLXwgICAgICAgICAgICAgICAgdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMNCi18DQotfHVyaSAgICAgICAgICAgICBhIHVyaSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGlzIHRhZ2xpYg0KLXwNCi18dmFsaWRhdG9yICAgICAgIG9wdGlvbmFsIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5mb3JtYXRpb24NCi18DQotfGxpc3RlbmVyICAgICAgICBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBzcGVjaWZpY2F0aW9uDQotfA0KLXx0YWcgICAgICAgICAgICAgb25lIG9yIG1vcmUgdGFncyBpbiB0aGUgdGFnIGxpYnJhcnkNCi18DQotfHRhZy1maWxlICAgICAgICBvbmUgb3IgbW9yZSB0YWcgZmlsZXMgaW4gdGhlIHRhZyBsaWJyYXJ5DQotfA0KLXxmdW5jdGlvbiAgICAgICAgemVybyBvciBtb3JlIEVMIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMNCi18ICAgICAgICAgICAgICAgIHRhZyBsaWJyYXJ5DQotfA0KLXx0YWdsaWItZXh0ZW5zaW9uIHplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQ0KLXwJCWluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnbGliLCBmb3IgdG9vbA0KLXwJCWNvbnN1bXB0aW9uDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJjb21wb25lbnQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQjEyMTAxRjMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFnTGliVmVyc2lvbiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJICAgIG5hbWUgICAgICAgCSJEZWZhdWx0RGVjbFR5cGUiDQotCQkJICAgIHZhbHVlICAgICAgCSIjSU1QTElFRCIpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE2QkE1RjAxNjAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlc2NyaWJlcyB0aGlzIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB0YWcgbGlicmFyeSAoZGV3ZXkgZGVjaW1hbCkuDQotfEByZWdleHAgWzAtOV0qeyAiLiJbMC05XSB9MC4uMw0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqc3BWZXJzaW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE2QzVGQTAyMjEiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlc2NyaWJlcyB0aGUgSlNQIHZlcnNpb24gKG51bWJlcikgdGhpcyB0YWcgbGlicmFyeSByZXF1aXJlcyBpbiBvcmRlciB0byBmdW5jdGlvbiAoZGV3ZXkgZGVjaW1hbCkuICBEZWZhdWx0IGlzIDEuMg0KLXxAcmVnZXhwIFswLTldKnsgIi4iWzAtOV0gfTAuLjMNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2hvcnROYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE2QzYwMDAxQTciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB2YWx1ZSBvZiB0aGUgc2hvcnQtbmFtZSBlbGVtZW50IGlzIGEgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMuIERvIG5vdCB1c2Ugd2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMgb3IgdW5kZXJzY29yZS4iDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVyaSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlBNkM2MDYwMEM5Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdmFsdWUgb2YgdGhlIHVyaSBlbGVtZW50IGlzIGEgcHVibGljIFVSSSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGV4YWN0IHNlbWFudGljcyBvZiB0aGlzIHRhZ2xpYnJhcnkuIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbW9kdWxlICAgICAJIkNvbXBvbmVudCBWaWV3Ojp3ZWItanNwdGFnbGlicmFyeV8xXzEiDQotCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMEMxIg0KLQkgICAgbGFuZ3VhZ2UgICAJIlhNTF9EVEQiKQ0KLQkob2JqZWN0IENsYXNzICJKU1BUYWciDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkgICAgcXVpZCAgICAgICAJIjM5QTZCQTVGMDEwOCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdGFnIGVsZW1lbnQgZGVmaW5lcyBhbiBhY3Rpb24gaW4gdGhpcyB0YWcgbGlicmFyeS4gVGhlIHRhZyBlbGVtZW50IGhhcyBvbmUgYXR0cmlidXRlLCBpZC4NCi18VGhlIHRhZyBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6DQotfG5hbWUgLS0gVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQ0KLXx0YWctY2xhc3MgLS0gVGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZyBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnDQotfHRlaS1jbGFzcyAtLSBBbiBvcHRpb25hbCBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvDQotfGJvZHktY29udGVudCAtLSBUaGUgYm9keSBjb250ZW50IHR5cGUNCi18ZGlzcGxheS1uYW1lIC0tIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scw0KLXxzbWFsbC1pY29uIC0tIE9wdGlvbmFsIHNtYWxsLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scw0KLXxsYXJnZS1pY29uIC0tIE9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scw0KLXxkZXNjcmlwdGlvbiAtLSBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24NCi18dmFyaWFibGUgLS0gT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uDQotfGF0dHJpYnV0ZSAtLSBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbg0KLXxleGFtcGxlIC0tIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBhY3Rpb24uDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRTVBOTc4RTAwQ0EiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJib2R5Q29udGVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlBNkM5MDQwMTZCIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxQcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuIFByaW1hcmlseSBpbnRlbmRlZCBmb3IgdXNlIGJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMuVGhlcmUgYXJlIGN1cnJlbnRseSB0aHJlZSB2YWx1ZXMgc3BlY2lmaWVkOg0KLXwNCi18dGFnZGVwZW5kZW50IC0gVGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBpbnRlcnByZXRlZCBieSB0aGUgdGFnIGltcGxlbWVudGF0aW9uIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5IGluIGEJCWRpZmZlcmVudCAibGFuZ2FnZSIsIGUuZyBlbWJlZGRlZCBTUUwgc3RhdGVtZW50cy4NCi18DQotfEpTUCAtIFRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUCBzeW50YXgNCi18DQotfGVtcHR5IC0gVGhlIGJvZHkgbXVzdCBiZSBlbXB0eVRoZSBkZWZhdWx0IChpZiBub3QgZGVmaW5lZCkgaXMgSlNQI1BDREFUQSA6Oj0gIHRhZ2RlcGVuZGVudCB8IEpTUCB8IGVtcHR5DQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIkJvZHlDb250ZW50VHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBQkU5NzQwMjdEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhhbXBsZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY3OTkwMTg4Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZXhhbXBsZSBlbGVtZW50IHByb3ZpZGVzIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4iDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNUE5N0Q1MDEyNyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZHluYW1pY0F0dHJpYnV0ZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNUE5QTExMDA5RCINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBtb2R1bGUgICAgIAkiQ29tcG9uZW50IFZpZXc6OndlYi1qc3B0YWdsaWJyYXJ5XzFfMSINCi0JICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAwQzEiDQotCSAgICBsYW5ndWFnZSAgIAkiWE1MX0RURCIpDQotCShvYmplY3QgQ2xhc3MgIkpTUFRhZ0F0dHJpYnV0ZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCSAgICBxdWlkICAgICAgIAkiMzlBNkJBNUYwMTE0Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBhdHRyaWJ1dGUgdGFnIGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZyB0YWciDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlBNkM3NkUwMUYzIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZCAocmVxdWlyZWQpLiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTZDNzcyMDE4MSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicnRFeHByVmFsdWUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTZDNzc2MDIwOSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0IGV4cHJlc3Npb25zIGFzYSB2YWx1ZSwgaS5lIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkYXQgcmVxdWVzdCB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb250aW1lLiAob3B0aW9uYWwpDQotfERlZmF1bHQgPSBmYWxzZQ0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGluaXR2ICAgICAgCSJmYWxzZSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZyYWdtZW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTY3QjhBRTAwOTUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbW9kdWxlICAgICAJIkNvbXBvbmVudCBWaWV3Ojp3ZWItanNwdGFnbGlicmFyeV8xXzEiDQotCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMEMxIg0KLQkgICAgbGFuZ3VhZ2UgICAJIlhNTF9EVEQiKQ0KLQkob2JqZWN0IENsYXNzICJCb2R5Q29udGVudFR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiMzlBQkU5NzQwMjdEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQsIGFkZGVkIFRBR0RFUEVOREVOVCxFTVBUWSxzY3JpcHRsZXNzLFNDUklQVExFU1MNCi18UHJvdmlkZXMgYSBoaW50IGFzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBib2R5IG9mIHRoaXMgdGFnLg0KLXxQcmltYXJpbHkgaW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLg0KLXwNCi18VGhlcmUgYXJlIGN1cnJlbnRseSBmb3VyIHZhbHVlcyBzcGVjaWZpZWQ6DQotfA0KLXx0YWdkZXBlbmRlbnQgICAgVGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBpbnRlcnByZXRlZCBieSB0aGUgdGFnDQotfCAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseQ0KLXwgICAgICAgICAgICAgICAgaW4gYSBkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMDQotfCAgICAgICAgICAgICAgICBzdGF0ZW1lbnRzLg0KLXwNCi18SlNQICAgICAgICAgICAgIFRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUA0KLXwgICAgICAgICAgICAgICAgc3ludGF4Lg0KLXwNCi18ZW1wdHkgICAgICAgICAgIFRoZSBib2R5IG11c3QgYmUgZW1wdHkNCi18DQotfHNjcmlwdGxlc3MgICAgICBUaGUgYm9keSBhY2NlcHRzIG9ubHkgdGVtcGxhdGUgdGV4dCwgRUwNCi18ICAgICAgICAgICAgICAgIEV4cHJlc3Npb25zLCBhbmQgSlNQIGFjdGlvbiBlbGVtZW50cy4gIE5vDQotfCAgICAgICAgICAgICAgICBzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGFsbG93ZWQuDQotfEpTUD0wDQotfGVtcHR5PTENCi18dGFnZGVwZW5kZW50PTINCi18VEFHREVQRU5ERU5UPTMNCi18RU1QVFk9NA0KLXxzY3JpcHRsZXNzPTUNCi18U0NSSVBUTEVTUz02DQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YWdkZXBlbmRlbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQ0QyODA3MDJCMCIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJKU1AiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQ0QyODE1MDA5NCIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbXB0eSINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDI4MUEwMDA1IikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjcmlwdGxlc3MiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQ0QyODIwMDJDMCIpKSkNCi0JKG9iamVjdCBDbGFzcyAiVmFsaWRhdG9yIg0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk2MkNBMDE0QyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4NCi18DQotCSAgICApDQotCShvYmplY3QgQ2xhc3MgIkpTUFZhcmlhYmxlIg0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk2NUE5MDBCMyINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lR2l2ZW4iDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2N0Y4MDM4NCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIG5hbWUtZ2l2ZW4gZWxlbWVudCBwcm92aWRlcyB0aGUgbmFtZSBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4NCi18DQotfE9uZSBvZiBuYW1lLWdpdmVuIG9yIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuDQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVGcm9tQXR0cmlidXRlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5Njg0NDAxMzQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24tdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4iDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlY2xhcmUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2OENBMDI5NSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHZhbHVlIG9mIHRoZSBkZWNsYXJlIGVsZW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBpcyB0byBiZSBkZWZpbmVkIG9yIG5vdC4gU2VlIFRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4NCi18VGhpcyBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCBpcyB0aGUgZGVmYXVsdCBpcyB0cnVlLg0KLXwNCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjb3BlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjkyQTAzQUMiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2OEZEMDI1RCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIg0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk2OEZEMDI1RCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxORVNURUQ9MA0KLXxBVF9CRUdJTj0xDQotfEFUX0VORD0yDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJORVNURUQiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2OTEwMDEwNSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkFUX0JFR0lOIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjkxMzAxNjQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJBVF9FTkQiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2OTE3MDJEMiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJGdW5jdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzRTVBODc1NDAwRTUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgZnVuY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gZWFjaA0KLXxmdW5jdGlvbiBpbiB0aGUgdGFnIGxpYnJhcnkgdGhhdCBpcyB0byBiZSBleHBvc2VkIHRvIHRoZSBFTC4NCi18DQotfFRoZSBmdW5jdGlvbiBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6DQotfA0KLXxkZXNjcmlwdGlvbiAgICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbg0KLXwNCi18ZGlzcGxheS1uYW1lICAgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQ0KLXwgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCBieSB0b29scw0KLXwNCi18aWNvbiAgICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZA0KLXwgICAgICAgICAgICAgICAgICAgIGJ5IHRvb2xzDQotfA0KLXxuYW1lICAgICAgICAgICAgICAgIEEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb24NCi18DQotfGZ1bmN0aW9uLWNsYXNzICAgICAgUHJvdmlkZXMgdGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdA0KLXwgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uDQotfA0KLXxmdW5jdGlvbi1zaWduYXR1cmUgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhDQotfCAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgb2YgdGhlIEphdmENCi18ICAgICAgICAgICAgICAgICAgICBtZXRob2QgdGhhdCBpcyB0byBiZSB1c2VkIHRvIGltcGxlbWVudA0KLXwgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbi4NCi18DQotfGV4YW1wbGUgICAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4NCi18ICAgICAgICAgICAgICAgICAgICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgZnVuY3Rpb24NCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QTg3NkEwMzQwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QTg3ODcwMDY2Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzaWduYXR1cmUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNUE4OThCMDM5RSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18UHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgYXMgaW4gdGhlIEphdmEgTGFuZ3VhZ2UNCi18ICAgICAgICBTcGVjaWZpY2F0aW9uLCBvZiB0aGUgc3RhdGljIEphdmEgbWV0aG9kIHRoYXQgaXMNCi18ICAgICAgICB0byBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb24uDQotfA0KLXwgICAgICAgIEV4YW1wbGU6DQotfA0KLXwgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlja05hbWUoIGphdmEubGFuZy5TdHJpbmcsIGludCApDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4YW1wbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNUE4QUFFMDMwNiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbg0KLXwgICAgICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uLg0KLQkJICAgIA0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiVGFnRmlsZSINCi0JICAgIHF1aWQgICAgICAgCSIzRTVBOTZERTAyOUUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxEZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5IHRoYXQgaXMgaW1wbGVtZW50ZWQNCi18YXMgYSAudGFnIGZpbGUuDQotfA0KLXxUaGUgdGFnLWZpbGUgZWxlbWVudCBoYXMgdHdvIHJlcXVpcmVkIHN1YmVsZW1lbnRzOg0KLXwNCi18bmFtZSAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lDQotfA0KLXxwYXRoICAgIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcw0KLXwgICAgICAgIGFjdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBvcg0KLXwJdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhIHRhZyBsaWJyYXJ5IHBhY2thZ2VkIGluDQotfAlhIEpBUi4gIFRoaXMgbXVzdCBiZWdpbiB3aXRoIC9XRUItSU5GL3RhZ3MgaWYgdGhlIC50YWcNCi18CWZpbGUgcmVzaWRlcyBpbiB0aGUgV0FSLCBvciAvTUVUQS1JTkYvdGFncyBpZiB0aGUgLnRhZw0KLXwJZmlsZSByZXNpZGVzIGluIGEgSkFSLg0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRUNEMkRFNDAxMUUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTVBOTZGODAzQzgiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhdGgiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNUE5NzBFMDBFNCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhhbXBsZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDJERkYwMjJCIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiVGxkRXh0ZW5zaW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNFQ0QyQThEMDE2RiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQ0QyQ0QyMDJDOSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkV4dGVuc2libGVUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjNFQ0QyQzJBMDBGMSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDJDMzgwMUUxIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAidGFnIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JICAgIHF1aWQgICAgICAgCSIzOUE2QkE1RjAxNTYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlBNkJBNUYwMTU3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VGFnTGliIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAwRTgiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJ0YWdzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUE2QkE1RjAxNTgiDQotCQkgICAgbGFiZWwgICAgICAJInRhZ3MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpKU1BUYWciDQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDEwOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiYXR0cmlidXRlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JICAgIHF1aWQgICAgICAgCSIzOUE2QkE1RjAxQkEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlBNkJBNUYwMUJCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQVGFnIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAxMDgiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImF0dHJpYnV0ZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QTZCQTVGMDFCQyINCi0JCSAgICBsYWJlbCAgICAgIAkiYXR0cmlidXRlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkpTUFRhZ0F0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMTE0Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIg0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk2MkUzMDAzQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ2YWxpZGF0b3IiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2MkUzMDMzRCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHZhbGlkYXRvciBlbGVtZW50IHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGFuIG9wdGlvbmFsIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuDQotfA0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJ2YWxpZGF0b3IiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpWYWxpZGF0b3IiDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2MkNBMDE0QyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2MkUzMDM0NyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlRhZ0xpYiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMEU4Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk2MzJFMDFBMCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ2YWxpZGF0b3JDbGFzcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTYzMkUwMzlGIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxkZWZpbmVzIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzIHRoYXQgY2FuIGJlDQotfHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4NCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkidmFsaWRhdG9yQ2xhc3MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTYzMkUwM0QxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VmFsaWRhdG9yIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjJDQTAxNEMiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiDQotCSAgICBxdWlkICAgICAgIAkiMzk4OTYzRjQwMDgyIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImluaXRQYXJhbXMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2M0Y0MDMyQiINCi0JCSAgICBsYWJlbCAgICAgIAkiaW5pdFBhcmFtcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6SW5pdFBhcmFtIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwOEU5RDAzMjUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjNGNDAzMkMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpWYWxpZGF0b3IiDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2MkNBMDE0QyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCINCi0JICAgIHF1aWQgICAgICAgCSIzOTg5NjRFODAzMjIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibGlzdGVuZXJzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjRFOTAyNzkiDQotCQkgICAgbGFiZWwgICAgICAJImxpc3RlbmVycyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246Okxpc3RlbmVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjI2MDAxQkQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5NjRFOTAyODMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpUYWdMaWIiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDBFOCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAiDQotCSAgICBxdWlkICAgICAgIAkiMzk4OTY1QkUwMEY5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInZhcmlhYmxlcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY1QkYwMEU3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdmFyaWFibGUgZWxlbWVudCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcyBkZWZpbmVkIGJ5IHRoaXMgdGFnLg0KLXxJdCBpcyBhICh0cmFuc2xhdGlvbiB0aW1lKSBlcnJvciBmb3IgYW4gYWN0aW9uIHRoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlIHN1YmVsZW1lbnRzIHRvIGhhdmUgYSBUYWdFeHRyYUluZm8gY2xhc3MgdGhhdCByZXR1cm5zIGEgbm9uLW51bGwgb2JqZWN0Lg0KLXxUaGUgc3ViZWxlbWVudHMgb2YgdmFyaWFibGUgYXJlIG9mIHRoZSBmb3JtOg0KLXxuYW1lLWdpdmVuIC0tIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQNCi18bmFtZS1mcm9tLWF0dHJpYnV0ZSAtLSBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UgKHRyYW5zbGF0aW9uIHRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuIE9uZSBvZiBuYW1lLWdpdmVuIG9yIG5hbWVmcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4NCi18dmFyaWFibGUtY2xhc3MgLS0gTmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLiBqYXZhLmxhbmcuU3RyaW5nIGlzIGRlZmF1bHQuDQotfGRlY2xhcmUgLS0gV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LiBUcnVlIGlzIHRoZSBkZWZhdWx0Lg0KLXxzY29wZSAtLSBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBkZWZpbmVkLiBORVNURUQgaXMgZGVmYXVsdC4NCi18DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJInZhcmlhYmxlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkpTUFZhcmlhYmxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjVBOTAwQjMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY1QkYwMEU4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQVGFnIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAxMDgiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIg0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk2NkEzMDMxRiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ0YWdDbGFzcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY2QTQwMjhBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdGFnLWNsYXNzIGVsZW1lbnQgaW5kaWNhdGVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJsdmV0LmpzcC50YWdleHQuVGFnIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IgdGhpcyB0YWcuIFRoaXMgZWxlbWVudCBpcyByZXF1aXJlZC4NCi18QHJlZ2V4cCBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lDQotfA0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJ0YWdDbGFzcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY2QTQwMkM3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQVGFnIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAxMDgiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk2NkMyMDE3NSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ0ZWlDbGFzcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY2QzMwMDVFIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdGVpLWNsYXNzIGVsZW1lbnQgaW5kaWNhdGVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvIGZvciB0aGlzIHRhZy4gVGhlIGNsYXNzIGlzIGluc3RhbnRpYXRlZCBhdCB0cmFuc2xhdGlvbiB0aW1lLiBUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwuDQotfEByZWdleHAgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQ0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJ0ZWlDbGFzcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY2QzMwMDlBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQVGFnIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAxMDgiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk2ODhBMDM2NiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbmFtZSBvZiB0aGUgY2xhc3MgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuDQotfFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbDsgdGhlIGRlZmF1bHQgaXMgamF2YS5sYW5nLlN0cmluZy4NCi18DQotCSAgICANCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ2YXJpYWJsZUNsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5Njg4RDAwMkIiDQotCQkgICAgbGFiZWwgICAgICAJInZhcmlhYmxlQ2xhc3MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTciDQotCQkgICAgcXVpZCAgICAgICAJIjM5ODk2ODhEMDA2NyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkpTUFZhcmlhYmxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjVBOTAwQjMiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5ODk2OTkxMDI3MyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ0eXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg5Njk5MjAwRUUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBlbGVtZW50IGRlc2NyaWJlcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlLg0KLXxGb3Igc3RhdGljIHZhbHVlcyAodGhvc2UgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbiB0aW1lKSB0aGUgdHlwZSBpcyBhbHdheXMgamF2YS5sYW5nLlN0cmluZy4NCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkidHlwZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4OTY5OTIwMTNFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQVGFnQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAxMTQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMCINCi0JICAgIHF1aWQgICAgICAgCSIzRTVBODdDRTAzQzYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZnVuY3Rpb25DbGFzcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QTg3Q0YwMzRGIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxQcm92aWRlcyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmENCi18ICAgICAgICBjbGFzcyBjb250YWluaW5nIHRoZSBzdGF0aWMgbWV0aG9kIHRoYXQgaW1wbGVtZW50cw0KLXwgICAgICAgIHRoZSBmdW5jdGlvbi4NCi0JCSAgICANCi0JCSAgICBsYWJlbCAgICAgIAkiZnVuY3Rpb25DbGFzcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QTg3Q0YwMzZEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6RnVuY3Rpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNUE4NzU0MDBFNSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjIiDQotCSAgICBxdWlkICAgICAgIAkiM0U1QTk4ODEwMDBDIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1QTk4ODEwMjVBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNUE5ODgxMDI4MiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkpTUFRhZ0F0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMTE0Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNCINCi0JICAgIHF1aWQgICAgICAgCSIzRTY3QjM5MTAyN0QiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZnVuY3Rpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTY3QjM5MjAzMjkiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImZ1bmN0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkZ1bmN0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTVBODc1NDAwRTUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U2N0IzOTIwMzJCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VGFnTGliIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAwRTgiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNjdCOUZFMDM0QiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNjdCOUZGMDM5MiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTY3QjlGRjAzQjAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpWYWxpZGF0b3IiDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2MkNBMDE0QyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgiDQotCSAgICBxdWlkICAgICAgIAkiM0U2N0JBQTQwMkIzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U2N0JBQTUwMjk3Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNjdCQUE1MDJCNSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkpTUFZhcmlhYmxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjVBOTAwQjMiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwIg0KLQkgICAgcXVpZCAgICAgICAJIjNFQ0QyQzk3MDAxMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJleHRlbnNpb25FbGVtZW50cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDJDOTcwMUNBIg0KLQkJICAgIGxhYmVsICAgICAgCSJleHRlbnNpb25FbGVtZW50cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkV4dGVuc2libGVUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkMyQTAwRjEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLioiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDJDOTcwMUNDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VGxkRXh0ZW5zaW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkE4RDAxNkYiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFQ0QyRDU3MDFEQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJmdW5jdGlvbkV4dGVuc2lvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQ0QyRDU4MDE2RCINCi0JCSAgICBsYWJlbCAgICAgIAkiZnVuY3Rpb25FeHRlbnNpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6VGxkRXh0ZW5zaW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkE4RDAxNkYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLioiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0VDRDJENTgwMTc4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6RnVuY3Rpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFNUE4NzU0MDBFNSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzQiDQotCSAgICBxdWlkICAgICAgIAkiM0VDRDJFNTQwM0M4Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInRhZ0V4dGVuc2lvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQ0QyRTU5MDA3MiINCi0JCSAgICBsYWJlbCAgICAgIAkidGFnRXh0ZW5zaW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlRsZEV4dGVuc2lvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0VDRDJBOEQwMTZGIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4qIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQ0QyRTU5MDA3QyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlRhZ0ZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNUE5NkRFMDI5RSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzYiDQotCSAgICBxdWlkICAgICAgIAkiM0VDRDJFRTMwMDNGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInRhZ2xpYkV4dGVuc2lvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFQ0QyRUU1MDNEMSINCi0JCSAgICBsYWJlbCAgICAgIAkidGFnbGliRXh0ZW5zaW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlRsZEV4dGVuc2lvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0VDRDJBOEQwMTZGIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4qIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzciDQotCQkgICAgcXVpZCAgICAgICAJIjNFQ0QyRUU1MDNEQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlRhZ0xpYiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMEU4Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJUYWdMaWIiDQotCSAgICBxdWlkICAgICAgIAkiMzlBNkJBODEwMTU1Ig0KLQkgICAgdGl0bGUgICAgICAJIlRhZ0xpYiINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkxOTYyDQotCSAgICBvcmlnaW5feSAgIAkxMzE4DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkJvZHlDb250ZW50VHlwZSIgQDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI1ODksIDM2NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDIzNzQsIDIzMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkJvZHlDb250ZW50VHlwZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMjM3NCwgMTgyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDMwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUFCRTk3NDAyN0QiDQotCQkgICAgd2lkdGggICAgICAJNDQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMzkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSIgQDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMyNTQsIDIyMjcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgyOTgzLCAyMTI0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU0Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMjk4MywgMjA3NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU0Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2OEZEMDI1RCINCi0JCSAgICB3aWR0aCAgICAgIAk1NjANCi0JCSAgICBoZWlnaHQgICAgIAkzMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIiBAMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg0LCA1NzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDEwNiwgNDkzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25Hcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpJbml0UGFyYW0iIEA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTQsIDE5NjcpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSg2NzAsIDE3ODgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJbml0UGFyYW0iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwOEU5RDAzMjUiDQotCQkgICAgd2lkdGggICAgICAJNTA2DQotCQkgICAgaGVpZ2h0ICAgICAJMzgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEA1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjk1LCAyNDE4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUNCi0JCQlsb2NhdGlvbiAgIAkoMTEyNiwgMjI4OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIHdpZHRoICAgICAgCTM1Ng0KLQkJICAgIGhlaWdodCAgICAgCTI4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEA2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM4MSwgMTQ1MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2DQotCQkJbG9jYXRpb24gICAJKDEyNjgsIDEzNzEpDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTIyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICB3aWR0aCAgICAgIAkyNDQNCi0JCSAgICBoZWlnaHQgICAgIAkxODgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpKU1BUYWdBdHRyaWJ1dGUiIEA3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDI0LCAxNzIzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoMTU3OSwgMTU2NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk4OTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkpTUFRhZ0F0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDExNCINCi0JCSAgICB3aWR0aCAgICAgIAk5MDgNCi0JCSAgICBoZWlnaHQgICAgIAkzMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMiIgQDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI5NywgMTk0OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTVBOTg4MTAwMEMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKC03MjcsIDIyNikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMA0KLQkJCQlQYXJlbnRfVmlldyAJQDkNCi0JCQkJbG9jYXRpb24gICAJKDE0MzAsIDIxNTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42MTU4NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTMzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNUE5ODgxMDI1QSINCi0JCQkgICAgY2xpZW50ICAgICAJQDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDUNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDE5NDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAyMjc3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDkNCi0JCQkJbG9jYXRpb24gICAJKDEyNDgsIDIxNTQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYyNTAwMA0KLQkJCQloZWlnaHQgICAgIAk1MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMiIEAxMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKC03MjcsIDIyNikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTVBOTg4MTAyODIiDQotCQkJICAgIGNsaWVudCAgICAgCUA4DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTI5NywgMTk0OSkNCi0JCQkJKDEyOTcsIDE4ODkpDQotCQkJCSgxNTcwLCAxODg5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDE5NDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTcwLCAxODg5KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4IiBAMTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQwMywgMTc0NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5Njk5MTAyNzMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAidHlwZSIgQDE0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xOTcsIDI0MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJCWxvY2F0aW9uICAgCSgxNDc0LCAxNjM3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTA4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit0eXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU1MTU4Nw0KLQkJCQloZWlnaHQgICAgIAk3MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5Njk5MjAwRUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMw0KLQkJCSAgICBzdXBwbGllciAgIAlANg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQwMywgMTc0NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDMsIDE1NDYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2DQotCQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQkJbG9jYXRpb24gICAJKDE0NTcsIDE1NjcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkiIEAxNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTk3LCAyNDEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5Njk5MjAxM0UiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMw0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MDMsIDE3NDUpDQotCQkJCSgxNDAzLCAxODA1KQ0KLQkJCQkoMTU3MCwgMTgwNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDAzLCAxNzQ1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU3MCwgMTgwNSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwOCwgMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCS03LjkyOTU3Nw0KLQkJCQloZWlnaHQgICAgIAkxMDUNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6SlNQVmFyaWFibGUiIEAxOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA5MywgMTcxMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCWxvY2F0aW9uICAgCSgyNTc4LCAxNTMxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTEwMzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkpTUFZhcmlhYmxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2NUE5MDBCMyINCi0JCSAgICB3aWR0aCAgICAgIAkxMDQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMzg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgiIEAyMA0KLQkJICAgIGxvY2F0aW9uICAgCSgyMzg3LCAyMzUxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjNFNjdCQUE0MDJCMyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAyMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTkzLCA2MzkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjINCi0JCQkJUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcxNSwgMjMwNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjczNjczNA0KLQkJCQloZWlnaHQgICAgIAk0Ng0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTY3QkFBNTAyOTciDQotCQkJICAgIGNsaWVudCAgICAgCUAyMA0KLQkJCSAgICBzdXBwbGllciAgIAlANQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM4NywgMjM1MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzMsIDIzNTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzDQotCQkJCVBhcmVudF9WaWV3IAlAMjENCi0JCQkJbG9jYXRpb24gICAJKDE1NjQsIDI0MDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkiIEAyNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTkzLCA2MzkpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U2N0JBQTUwMkI1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjANCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjM4NywgMjM1MSkNCi0JCQkJKDI4NTYsIDIzNTEpDQotCQkJCSgyODU2LCAxOTA1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzODcsIDIzNTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODU2LCAxOTA1KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2IiBAMjUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg1OSwgMjAwMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5Njg4QTAzNjYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAidmFyaWFibGVDbGFzcyIgQDI2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjUNCi0JCQkgICAgbG9jYXRpb24gICAJKC00MTMsIDUzMCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNw0KLQkJCQlQYXJlbnRfVmlldyAJQDI2DQotCQkJCWxvY2F0aW9uICAgCSgxMTkyLCAxNjE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjc5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit2YXJpYWJsZUNsYXNzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkzMDE1NQ0KLQkJCQloZWlnaHQgICAgIAkxMzcNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTY4OEQwMDJCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxODU5LCAyMDAyKQ0KLQkJCQkoMTMyOCwgMjAwMikNCi0JCQkJKDEzMjgsIDE1NDcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg1OSwgMjAwMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDE1NDcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4DQotCQkJCVBhcmVudF9WaWV3IAlAMjYNCi0JCQkJbG9jYXRpb24gICAJKDEyODcsIDE2NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg4NTgwOQ0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTciIEAyOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDEzLCA1MzApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTY4OEQwMDY3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTg1OSwgMjAwMikNCi0JCQkJKDI3NDksIDIwMDIpDQotCQkJCSgyNzQ5LCAxOTA1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4NTksIDIwMDIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzQ5LCAxOTA1KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OkV4dGVuc2libGVUeXBlIiBAMzANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDg4NywgMjU0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwDQotCQkJbG9jYXRpb24gICAJKDcwNiwgMjQ2MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkV4dGVuc2libGVUeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0VDRDJDMkEwMEYxIg0KLQkJICAgIHdpZHRoICAgICAgCTM4MA0KLQkJICAgIGhlaWdodCAgICAgCTE4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlRhZ0ZpbGUiIEAzMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk0NiwgMjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxDQotCQkJbG9jYXRpb24gICAJKDE2MzQsIDEwOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlRhZ0ZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTVBOTZERTAyOUUiDQotCQkgICAgd2lkdGggICAgICAJNjQyDQotCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyREU0MDExRSINCi0JCSAgICBjbGllbnQgICAgIAlAMzENCi0JCSAgICBzdXBwbGllciAgIAlAMw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNjI1LCAxNjIpDQotCQkJKDQxNywgMTYyKQ0KLQkJCSg0MTcsIDQ4MSkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYyNSwgMTYyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTcsIDQ4MSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TGlzdGVuZXIiIEAzMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMxMiwgMTA3MykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMw0KLQkJCWxvY2F0aW9uICAgCSgxMTgwLCA5NzQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjY0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJMaXN0ZW5lciIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMjYwMDFCRCINCi0JCSAgICB3aWR0aCAgICAgIAkyODINCi0JCSAgICBoZWlnaHQgICAgIAkyMjINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAzNA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDI1LCAxMjcxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QzAzRTZDMDM1QSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEAzNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDQxLCAtMTY5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2DQotCQkJCVBhcmVudF9WaWV3IAlAMzUNCi0JCQkJbG9jYXRpb24gICAJKDEzODQsIDEyMDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QzAzRTZEMDJDRiINCi0JCQkgICAgY2xpZW50ICAgICAJQDM0DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MjUsIDEyNzEpDQotCQkJCSgxNDQxLCAxMjcxKQ0KLQkJCQkoMTQ0MSwgMTE4NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI1LCAxMjcxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0MSwgMTE4NCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAibGlzdGVuZXJDbGFzcyIgQDM3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwNDEsIC0xNjkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTUxMywgMTMyNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbGlzdGVuZXJDbGFzcyINCi0JCQkJcGN0RGlzdCAgICAJMC42MDg2OTYNCi0JCQkJaGVpZ2h0ICAgICAJODgNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlDMDNFNkQwMkE3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MjUsIDEyNzEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDI1LCAxMzU5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM3DQotCQkJCWxvY2F0aW9uICAgCSgxNDYzLCAxMzAxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC4zMzU0MDQNCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnRhZ2xpYjo6RnVuY3Rpb24iIEA0MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzIxLCAxNDE1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQwDQotCQkJbG9jYXRpb24gICAJKDksIDEyODQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjI0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJGdW5jdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNUE4NzU0MDBFNSINCi0JCSAgICB3aWR0aCAgICAgIAk2NDINCi0JCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1QTg3NkEwMzQwIg0KLQkJICAgIGNsaWVudCAgICAgCUA0MA0KLQkJICAgIHN1cHBsaWVyICAgCUAzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjgxLCAxMjcyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODEsIDY2MykpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAiIEA0Mg0KLQkJICAgIGxvY2F0aW9uICAgCSg5NTAsIDE0ODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTVBODdDRTAzQzYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZnVuY3Rpb25DbGFzcyIgQDQzDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDINCi0JCQkgICAgbG9jYXRpb24gICAJKDYyOCwgNzUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgMTQ0MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZnVuY3Rpb25DbGFzcyINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1QTg3Q0YwMzRGIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDINCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk1MCwgMTQ4NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNTksIDE0ODQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1DQotCQkJCVBhcmVudF9WaWV3IAlANDMNCi0JCQkJbG9jYXRpb24gICAJKDEyMjgsIDE1MzgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjEiIEA0Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQyDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MjgsIDc1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNUE4N0NGMDM2RCINCi0JCQkgICAgY2xpZW50ICAgICAJQDQyDQotCQkJICAgIHN1cHBsaWVyICAgCUA0MA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTUwLCAxNDg0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQyLCAxNDg0KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlZhbGlkYXRvciIgQDQ3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4NDgsIDEyNTkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDcNCi0JCQlsb2NhdGlvbiAgIAkoNzM0LCAxMjA4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIyOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVmFsaWRhdG9yIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2MkNBMDE0QyINCi0JCSAgICB3aWR0aCAgICAgIAkyNDYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBANDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTUzLCAxNTQ4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2M0Y0MDA4MiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbml0UGFyYW1zIiBANDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0OA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDA5LCA0OTIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTANCi0JCQkJUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCQlsb2NhdGlvbiAgIAkoODE2LCAxNzQxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjI4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitpbml0UGFyYW1zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg1Mjc2MQ0KLQkJCQloZWlnaHQgICAgIAkxMzgNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTYzRjQwMzJCIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk1MywgMTU0OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk1MywgMTc3NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTENCi0JCQkJUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwNywgMTc1MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3IiBANTINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0OA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDA5LCA0OTIpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTYzRjQwMzJDIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTMsIDE1NDgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTMsIDEzMjIpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDUzDQotCQkgICAgbG9jYXRpb24gICAJKDEyMTUsIDEyMjIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTYzMkUwMUEwIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInZhbGlkYXRvckNsYXNzIiBANTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjcxLCAxNjYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUNCi0JCQkJUGFyZW50X1ZpZXcgCUA1NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMywgMTMwOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI5MQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrdmFsaWRhdG9yQ2xhc3MiDQotCQkJCXBjdERpc3QgICAgCTAuMDc4MDY3DQotCQkJCWhlaWdodCAgICAgCTg3DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODk2MzJFMDM5RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDUzDQotCQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIxNSwgMTIyMikNCi0JCQkJKDEzMjIsIDEyMjIpDQotCQkJCSgxMzIyLCAxMzU5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTUsIDEyMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzIyLCAxMzU5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDU0DQotCQkJCWxvY2F0aW9uICAgCSgxMjkxLCAxMjgzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42OTI1NjgNCi0JCQkJaGVpZ2h0ICAgICAJMzINCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEA1Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDUzDQotCQkJICAgIGxvY2F0aW9uICAgCSg2NzEsIDE2NikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjMyRTAzRDEiDQotCQkJICAgIGNsaWVudCAgICAgCUA1Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANDcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTUsIDEyMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NzEsIDEyMjIpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYiIEA1OA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTEyLCAxNjk0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjNFNjdCOUZFMDM0QiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEA1OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU4DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNjQsIDQzNSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MA0KLQkJCQlQYXJlbnRfVmlldyAJQDU5DQotCQkJCWxvY2F0aW9uICAgCSgxMDI5LCAyMjMwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuOTI4NDYwDQotCQkJCWhlaWdodCAgICAgCTE0NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTY3QjlGRjAzOTIiDQotCQkJICAgIGNsaWVudCAgICAgCUA1OA0KLQkJCSAgICBzdXBwbGllciAgIAlANQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMTIsIDE2OTQpDQotCQkJCSgxMTcyLCAxNjk0KQ0KLQkJCQkoMTE3MiwgMjI3NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTEyLCAxNjk0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3MiwgMjI3NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjENCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyNiwgMjIxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNyIgQDYyDQotCQkJICAgIFBhcmVudF9WaWV3IAlANTgNCi0JCQkgICAgbG9jYXRpb24gICAJKDI2NCwgNDM1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNjdCOUZGMDNCMCINCi0JCQkgICAgY2xpZW50ICAgICAJQDU4DQotCQkJICAgIHN1cHBsaWVyICAgCUA0Nw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMTIsIDE2OTQpDQotCQkJCSg4OTQsIDE2OTQpDQotCQkJCSg4OTQsIDEzMjIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTExMiwgMTY5NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg5NCwgMTMyMikpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpKU1BUYWciIEA2Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk5OCwgMTAyMSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCWxvY2F0aW9uICAgCSgxNTE2LCA4NjUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJOTY0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJKU1BUYWciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAxMDgiDQotCQkgICAgd2lkdGggICAgICAJOTgyDQotCQkgICAgaGVpZ2h0ICAgICAJMzM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIiIEA2NA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzYyLCAxMzk4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTY2QTMwMzFGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInRhZ0NsYXNzIiBANjUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4LCA1OTgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjYNCi0JCQkJUGFyZW50X1ZpZXcgCUA2NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY4OSwgMTQzMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrdGFnQ2xhc3MiDQotCQkJCXBjdERpc3QgICAgCTAuMjgzMjYyDQotCQkJCWhlaWdodCAgICAgCTM1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODk2NkE0MDI4QSINCi0JCQkgICAgY2xpZW50ICAgICAJQDY0DQotCQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzYyLCAxMzk4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMywgMTM5OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjcNCi0JCQkJUGFyZW50X1ZpZXcgCUA2NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2MywgMTQzMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzcxOTMwDQotCQkJCWhlaWdodCAgICAgCTM1DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMyIgQDY4DQotCQkJICAgIFBhcmVudF9WaWV3IAlANjQNCi0JCQkgICAgbG9jYXRpb24gICAJKDE3OCwgNTk4KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5ODk2NkE0MDJDNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDY0DQotCQkJICAgIHN1cHBsaWVyICAgCUA2Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE3NjIsIDEzOTgpDQotCQkJCSgxODIyLCAxMzk4KQ0KLQkJCQkoMTgyMiwgMTE4OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzYyLCAxMzk4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyMiwgMTE4OSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNCIgQDY5DQotCQkgICAgbG9jYXRpb24gICAJKDE4NTgsIDE0ODEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjZDMjAxNzUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAidGVpQ2xhc3MiIEA3MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDY5DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzQsIDY4MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDcwDQotCQkJCWxvY2F0aW9uICAgCSgxNjQ5LCAxNTM1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTc4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit0ZWlDbGFzcyINCi0JCQkJcGN0RGlzdCAgICAJMC41ODkyODYNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTY2QzMwMDVFIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4NTgsIDE0ODEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxNDgxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDcwDQotCQkJCWxvY2F0aW9uICAgCSgxNTM5LCAxNTM1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1IiBANzMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc0LCA2ODEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTY2QzMwMDlBIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTg1OCwgMTQ4MSkNCi0JCQkJKDE5MjIsIDE0ODEpDQotCQkJCSgxOTIyLCAxMTg5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4NTgsIDE0ODEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTIyLCAxMTg5KSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTVBOTc4RTAwQ0EiDQotCQkgICAgY2xpZW50ICAgICAJQDYzDQotCQkgICAgc3VwcGxpZXIgICAJQDMNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTU2MiwgODUzKQ0KLQkJCSgxNTYyLCAxMDkpDQotCQkJKDI4NywgMTA5KQ0KLQkJCSgyODcsIDQ4MSkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU2MiwgODUzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODcsIDQ4MSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiYXR0cmlidXRlIiBANzUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAzMSwgMTM3MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDFCQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVzIiBANzYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoODE1LCAzNjMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzcNCi0JCQkJUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjE1MSwgMTUxNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5Mw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXR0cmlidXRlcyINCi0JCQkJcGN0RGlzdCAgICAJMC43ODA0ODgNCi0JCQkJaGVpZ2h0ICAgICAJMTIwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDFCQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDc1DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDMxLCAxMzcxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAzMSwgMTU1NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgNCi0JCQkJUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTk3OCwgMTUzNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBANzkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoODE1LCAzNjMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODANCi0JCQkJUGFyZW50X1ZpZXcgCUA3OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA3MywgMTIyNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMUJCIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYzDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDMxLCAxMzcxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAzMSwgMTE4OCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMCIgQDgxDQotCQkgICAgbG9jYXRpb24gICAJKDI5NDYsIDExMDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4OTY1QkUwMEY5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInZhcmlhYmxlcyIgQDgyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODENCi0JCQkgICAgbG9jYXRpb24gICAJKDEzNjIsIDMwNCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDgyDQotCQkJCWxvY2F0aW9uICAgCSgzMTI4LCAxNDQ5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTgxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit2YXJpYWJsZXMiDQotCQkJCXBjdERpc3QgICAgCTAuODU0NjcxDQotCQkJCWhlaWdodCAgICAgCTEyMg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjVCRjAwRTciDQotCQkJICAgIGNsaWVudCAgICAgCUA4MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyOTQ2LCAxMTA0KQ0KLQkJCQkoMzAwNiwgMTEwNCkNCi0JCQkJKDMwMDYsIDE1MTkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjk0NiwgMTEwNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMwMDYsIDE1MTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0DQotCQkJCVBhcmVudF9WaWV3IAlAODINCi0JCQkJbG9jYXRpb24gICAJKDMwNzYsIDEzODkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcyNjY0NA0KLQkJCQloZWlnaHQgICAgIAk3MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEiIEA4NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgxDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMzYyLCAzMDQpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTY1QkYwMEU4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAODENCi0JCQkgICAgc3VwcGxpZXIgICAJQDYzDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTQ2LCAxMTA0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQ4OSwgMTEwNCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6dGFnbGliOjpUbGRFeHRlbnNpb24iIEA4Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjcxLCAyMjIxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDg2DQotCQkJbG9jYXRpb24gICAJKDMyLCAyMTQwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVGxkRXh0ZW5zaW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0VDRDJBOEQwMTZGIg0KLQkJICAgIHdpZHRoICAgICAgCTQ5Ng0KLQkJICAgIGhlaWdodCAgICAgCTE4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwIiBAODcNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTgwLCAyMzgyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0VDRDJDOTcwMDExIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImV4dGVuc2lvbkVsZW1lbnRzIiBAODgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA5LCAxNjEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkNCi0JCQkJUGFyZW50X1ZpZXcgCUA4OA0KLQkJCQlsb2NhdGlvbiAgIAkoOTA1LCAyNDA1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzc4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitleHRlbnNpb25FbGVtZW50cyINCi0JCQkJcGN0RGlzdCAgICAJMi4wMzQzNDYNCi0JCQkJaGVpZ2h0ICAgICAJMTMxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyQzk3MDFDQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDg3DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMA0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwDQotCQkJCVBhcmVudF9WaWV3IAlAODgNCi0JCQkJbG9jYXRpb24gICAJKDY0MSwgMjQ3MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNjM5OTEzDQotCQkJCWhlaWdodCAgICAgCTUwDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMSIgQDkxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODcNCi0JCQkgICAgbG9jYXRpb24gICAJKDMwOSwgMTYxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyQzk3MDFDQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDg3DQotCQkJICAgIHN1cHBsaWVyICAgCUA4Ng0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzIiIEA5Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgyOTMsIDE4NDIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkQ1NzAxREEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZnVuY3Rpb25FeHRlbnNpb25zIiBAOTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE5LCA0MjcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTk0LCAyMDIxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzcxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitmdW5jdGlvbkV4dGVuc2lvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuNjQzNDkzDQotCQkJCWhlaWdodCAgICAgCTg5DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyRDU4MDE2RCINCi0JCQkgICAgY2xpZW50ICAgICAJQDkyDQotCQkJICAgIHN1cHBsaWVyICAgCUA4Ng0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk1DQotCQkJCVBhcmVudF9WaWV3IAlAOTMNCi0JCQkJbG9jYXRpb24gICAJKDIxNCwgMjA3NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuODM0MTExDQotCQkJCWhlaWdodCAgICAgCTY2DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMyIgQDk2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTINCi0JCQkgICAgbG9jYXRpb24gICAJKC0xOSwgNDI3KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyRDU4MDE3OCINCi0JCQkgICAgY2xpZW50ICAgICAJQDkyDQotCQkJICAgIHN1cHBsaWVyICAgCUA0MA0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzQiIEA5Nw0KLQkJICAgIGxvY2F0aW9uICAgCSg2ODQsIDgzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyRTU0MDNDOCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ0YWdFeHRlbnNpb25zIiBAOTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyNjIsIDU5MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDk4DQotCQkJCWxvY2F0aW9uICAgCSg0ODQsIDIyMjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyODYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3RhZ0V4dGVuc2lvbnMiDQotCQkJCXBjdERpc3QgICAgCTEuMDIyOTcyDQotCQkJCWhlaWdodCAgICAgCTENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0VDRDJFNTkwMDcyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjg0LCA4MzIpDQotCQkJCSg2ODQsIDIyMjUpDQotCQkJCSg1MTksIDIyMjUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjg0LCA4MzIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTksIDIyMjUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMA0KLQkJCQlQYXJlbnRfVmlldyAJQDk4DQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDIyMDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0MjgzOQ0KLQkJCQloZWlnaHQgICAgIAkyNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzUiIEAxMDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyNjIsIDU5MikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRUNEMkU1OTAwN0MiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2ODQsIDgzMikNCi0JCQkJKDY4NCwgMjE2KQ0KLQkJCQkoMTYyNSwgMjE2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY4NCwgODMyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyNSwgMjE2KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp0YWdsaWI6OlRhZ0xpYiIgQDEwMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIyOCwgNTM0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwMg0KLQkJCWxvY2F0aW9uICAgCSg5NjcsIDMwMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlRhZ0xpYiIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwMg0KLQkJCWxvY2F0aW9uICAgCSg5NjcsIDI1MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUyMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxjb21wb25lbnQ+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDBFOCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTAyDQotCQkJbG9jYXRpb24gICAJKDk2NywgMzYxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk1DQotCQkJbWF4X3dpZHRoICAJMCkNCi0JCSAgICB3aWR0aCAgICAgIAk1NDANCi0JCSAgICBoZWlnaHQgICAgIAk1OTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBAMTAzDQotCQkgICAgbG9jYXRpb24gICAJKDEyMzEsIDg5NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjRFODAzMjIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibGlzdGVuZXJzIiBAMTA0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzDQotCQkJICAgIGxvY2F0aW9uICAgCSg1MjcsIDU0MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkJbG9jYXRpb24gICAJKDEzNTAsIDkwMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE4Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbGlzdGVuZXJzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjEwMzQ0OA0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTY0RTkwMjc5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTAzDQotCQkJICAgIHN1cHBsaWVyICAgCUAzMw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgODk1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgOTYxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkJbG9jYXRpb24gICAJKDEyODcsIDk0MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzEyMTIxDQotCQkJCWhlaWdodCAgICAgCTU2DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5IiBAMTA3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzDQotCQkJICAgIGxvY2F0aW9uICAgCSg1MjcsIDU0MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDcNCi0JCQkJbG9jYXRpb24gICAJKDExOTAsIDg0MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjAwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTY0RTkwMjgzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTAzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDg5NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDgyOSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNCIgQDEwOQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MDMsIDc1NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNjdCMzkxMDI3RCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmdW5jdGlvbnMiIEAxMTANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkNCi0JCQkgICAgbG9jYXRpb24gICAJKC03MjUsIDI1NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTANCi0JCQkJbG9jYXRpb24gICAJKDQxMCwgMTE1NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZnVuY3Rpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMjQ0NA0KLQkJCQloZWlnaHQgICAgIAkzNA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTY3QjM5MjAzMjkiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTAzLCA3NTUpDQotCQkJCSg0NDMsIDc1NSkNCi0JCQkJKDQ0MywgMTI3MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MDMsIDc1NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ0MywgMTI3MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyDQotCQkJCVBhcmVudF9WaWV3IAlAMTEwDQotCQkJCWxvY2F0aW9uICAgCSg0OTcsIDEyMTQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUiIEAxMTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkNCi0JCQkgICAgbG9jYXRpb24gICAJKC03MjUsIDI1NSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTY3QjM5MjAzMkIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwMg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTAzLCA3NTUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTgsIDc1NSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMTE0DQotCQkgICAgbG9jYXRpb24gICAJKDg2OSwgOTUzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODk2MkUzMDAzQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ2YWxpZGF0b3IiIEAxMTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDE2NSwgNjAxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNg0KLQkJCQlQYXJlbnRfVmlldyAJQDExNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzUxLCAxMTI2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTgzDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit2YWxpZGF0b3IiDQotCQkJCXBjdERpc3QgICAgCTAuNzE2NzYzDQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTg5NjJFMzAzM0QiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjksIDk1MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg2OSwgMTE5NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3DQotCQkJCVBhcmVudF9WaWV3IAlAMTE1DQotCQkJCWxvY2F0aW9uICAgCSg5NTMsIDExNDcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMzQ2OA0KLQkJCQloZWlnaHQgICAgIAk4NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDExOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1LCA2MDEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk4OTYyRTMwMzQ3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE0DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4NjksIDk1MykNCi0JCQkJKDg2OSwgNzk5KQ0KLQkJCQkoOTU4LCA3OTkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODY5LCA5NTMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTgsIDc5OSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJ0YWciIEAxMTkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkxMCwgNTE4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwDQotCQkJUGFyZW50X1ZpZXcgCUAxMTkNCi0JCQlsb2NhdGlvbiAgIAkoMTkxMCwgNDU5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWFuY2hvciAgICAgCTENCi0JCQlhbmNob3JfbG9jIAkxDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYwMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkidGFnIg0KLQkJCXBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJaGVpZ2h0ICAgICAJNjANCi0JCQlvcmllbnRhdGlvbiAJMCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUE2QkE1RjAxNTYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAidGFncyIgQDEyMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzOCwgLTIzNCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjENCi0JCQkJbG9jYXRpb24gICAJKDIwNTksIDgxMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEwOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrdGFncyINCi0JCQkJcGN0RGlzdCAgICAJMC44OTgxOTANCi0JCQkJaGVpZ2h0ICAgICAJNzINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlBNkJBNUYwMTU4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE5DQotCQkJICAgIHN1cHBsaWVyICAgCUA2Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5MTAsIDUxOCkNCi0JCQkJKDE5ODcsIDUxOCkNCi0JCQkJKDE5ODcsIDg1MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTEwLCA1MTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTg3LCA4NTMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMw0KLQkJCQlQYXJlbnRfVmlldyAJQDEyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkzMywgODE1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDcyNDANCi0JCQkJaGVpZ2h0ICAgICAJNTUNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDAiIEAxMjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkNCi0JCQkgICAgbG9jYXRpb24gICAJKDE2MzgsIC0yMzQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1DQotCQkJCVBhcmVudF9WaWV3IAlAMTI0DQotCQkJCWxvY2F0aW9uICAgCSgxNTgxLCA0NzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QTZCQTVGMDE1NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDExOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTAyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTEwLCA1MTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk4LCA1MTgpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzYiIEAxMjYNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjY1LCAxNDU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0VDRDJFRTMwMDNGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInRhZ2xpYkV4dGVuc2lvbnMiIEAxMjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYNCi0JCQkgICAgbG9jYXRpb24gICAJKC01NjMsIDkyMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjcNCi0JCQkJbG9jYXRpb24gICAJKDU4MSwgMjA1NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMyNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrdGFnbGliRXh0ZW5zaW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC45MjI3NDINCi0JCQkJaGVpZ2h0ICAgICAJMTYzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyRUU1MDNEMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyNg0KLQkJCSAgICBzdXBwbGllciAgIAlAODYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2NjUsIDE0NTYpDQotCQkJCSg2NjUsIDE3ODEpDQotCQkJCSg0MTgsIDE3ODEpDQotCQkJCSg0MTgsIDIxMjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjY1LCAxNDU2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE4LCAyMTI4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjcNCi0JCQkJbG9jYXRpb24gICAJKDM4MCwgMjA2OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTM1ODAwDQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNyIgQDEzMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU2MywgOTIyKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFQ0QyRUU1MDNEQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyNg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTAyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjY1LCAxNDU2KQ0KLQkJCQkoNjY1LCA4MzEpDQotCQkJCSg5NTgsIDgzMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjUsIDE0NTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTgsIDgzMSkpKSkpKSkpDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvdGNnLnB0eSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3RjZy5wdHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTIzZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2UvdGNnLnB0eQorKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoYykgMjAwMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbi4gQUxMIFJJR0hUUyBSRVNFUlZFRAotIyBUaGluIENsaWVudCBHZW5lcmF0b3IgKFRDRykgcHJvcGVydGllcyBmaWxlCi0jCi0ob2JqZWN0IFBldGFsIHZlcnNpb24gNDIpCi0KLShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVENHIgotCQluYW1lICAgICAgIAkicm9zZUlkIgotCQl2YWx1ZSAgICAgIAkiODM3MjYzNjM2IgotCSkKLQkob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVENHIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjk4NDc0NzM5NCIKLQkpCi0JIwotCSMgQ2xhc3MgcHJvcGVydGllcwotCSMJCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlRDRyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkjIEEgZGVzY3JpcHRpb24gdG8gdXNlIHdoZW4gZGlzcGxheWluZyB0aGlzIGNsYXNzJyBuYW1lIG9uIHBhbmVscyBvciB3aXRoaW4gdGV4dC4KLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiRGlzcGxheU5hbWUiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiB1c2VyIHJvbGVzIHdoaWNoIHRoaXMgZmllbGQgaXMgdXNlZCBieSAKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiQXBwbGllc1RvUm9sZXMiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQSBjbGFzc2lmaWNhdGlvbiBvZiB1c2VyIGV4cGVyaWVuY2UgbGV2ZWwgd2hpY2ggd291bGQgdXNlIHRoaXMgdHlwZQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJVc2VyRXhwZXJpZW5jZUxldmVsIgotCQkJCXZhbHVlICAgICAgCSgiVXNlckV4cExldmVsX1NldCIgMTAwKQotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sCQkiVENHIgotCQkJCW5hbWUJCSJVc2VyRXhwTGV2ZWxfU2V0IgotCQkJCXZhbHVlCQkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkJBU0lDIgotCQkJCQkJdmFsdWUgICAgICAJMTAwCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiQURWQU5DRUQiCi0JCQkJCQl2YWx1ZSAgICAgIAkxMDEKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJFWFBFUlQiCi0JCQkJCQl2YWx1ZSAgICAgIAkxMDIKLQkJCQkJKQotCQkJCSkKLQkJCSkKLQkJCSMgQSBkZXNjcmlwdGlvbiB0byB1c2UgZm9yIHRoZSB0aXRsZSBvZiBkZXRhaWwgcGFuZWxzIGNvbnRhaW5pbmcgYW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MuCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlN0ZERldGFpbFBhbmVsVGl0bGUiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQ29udGFpbnMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGUgaWQncyBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYXBwZWFyIG9uIHRoZQotCQkJIyBkZWZhdWx0IGRldGFpbCBwYW5lbCBmb3IgdGhpcyBjbGFzcy4KLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiU3RkRGV0YWlsUGFuZWxGaWVsZHNJbk9yZGVyIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkjIEEgZGVzY3JpcHRpb24gdG8gdXNlIGZvciB0aGUgdGl0bGUgb2YgY29sbGVjdGlvbiBwYW5lbHMgY29udGFpbmluZyBlbGVtZW50cyBvZiB0aGlzIGNsYXNzLgotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJTdGRDb2xsZWN0aW9uUGFuZWxUaXRsZSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBDb250YWlucyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZSBpZCdzIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBhcHBlYXIgb24gdGhlCi0JCQkjIGRlZmF1bHQgY29sbGVjdGlvbiBwYW5lbCBmb3IgdGhpcyBjbGFzcy4KLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiU3RkQ29sbGVjdGlvblBhbmVsRmllbGRzSW5PcmRlciIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBBIHN0cmluZyBjb250YWluaW5nIGF0dHJpYnV0ZSBuYW1lIHBhcmFtZXRlciBzbG90cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHZhbHVlcyBmcm9tIHRoZSBhdHRyaWJ1dGVzLgotCQkJIyBUeXBpY2FsbHkgdXNlZCB0byBjYWxjdWxhdGUgYSB0cmVlIG5vZGUgZGVzY3JpcHRpb24gZm9yIGFuIG9iamVjdC4KLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiRGVzY3JpcHRpb25QYXR0ZXJuIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkjIEEgdXJpIHRvIGNvbnRlbnQgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCBqdXN0IGFib3ZlIHRoZSBkZXNjcmlwdGlvbiBhcmVhIG9mIHRoZSBkZXRhaWwgcGFnZSBmb3IgdGhpcyBjbGFzcwotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJQcmVEZXNjcmlwdGlvbkluY2x1ZGVVUkkiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQSB1cmkgdG8gY29udGVudCB3aGljaCB3aWxsIGJlIGluY2x1ZGVkIGp1c3QgYWJvdmUgdGhlIGZvcm0gYXJlYSBvZiB0aGUgZGV0YWlsIHBhZ2UgZm9yIHRoaXMgY2xhc3MKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiUHJlRm9ybUluY2x1ZGVVUkkiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQSB1cmkgdG8gY29udGVudCB3aGljaCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBmb290ZXIgYXJlYSBvZiB0aGUgZGV0YWlsIHBhZ2UgZm9yIHRoaXMgY2xhc3MKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiRm9vdGVySW5jbHVkZVVSSSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBXaGV0aGVyIHZpZXdzIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgdHlwZQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJTa2lwVmlld0dlbmVyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJRkFMU0UKLQkJCSkKLQkJCSMgVGhlIGljb24gZmlsZSB1cmkgZm9yIHNtYWxsIDE2eDE2IGljb24gcmVwcmVzZW50aW5nIHRoaXMgY2xhc3MuCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlNtYWxsSWNvbiIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBUaGUgaWNvbiBmaWxlIHVyaSBmb3IgbGFyZ2UgMzJ4MzIgaWNvbiByZXByZXNlbnRpbmcgdGhpcyBjbGFzcy4KLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiTGFyZ2VJY29uIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkjIEFuIGFsdGVybmF0ZSB1cmkgKGFic29sdXRlIG9yIHJlbGF0aXZlIHRvIHdlYiBhcHAgcm9vdCkgdG8gaW5jbHVkZSBhcyB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIAotCQkJIyBkZXRhaWwgcGFuZWwuCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkFsdERlc2NyaXB0aW9uVVJJIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCSkKLQkpCi0JIwotCSMgQ2xhc3MgQXR0cmlidXRlIFByb3BlcnRpZXMKLQkjCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlRDRyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJIyBUaGUgbGFiZWwgdGV4dCB0byB1c2Ugd2hlbiBkaXNwbGF5aW5nIHRoaXMgYXR0cmlidXRlICh3aXRob3V0ICc6JykKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiRGlzcGxheU5hbWUiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiSXNSZXF1aXJlZCIKLQkJCQl2YWx1ZSAgICAgIAlUUlVFCi0JCQkpCi0JCQkjIEEgc3RyaW5nIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGdyb3VwIHRoaXMgZmllbGQgd2l0aCBvdGhlciBmaWVsZHMgd2l0aCB0aGUgc2FtZSBjYXRlZ29yeUlkCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkNhdGVnb3J5SWQiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiB1c2VyIHJvbGVzIHdoaWNoIHRoaXMgZmllbGQgaXMgdXNlZCBieSAKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiQXBwbGllc1RvUm9sZXMiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQSBjbGFzc2lmaWNhdGlvbiBvZiB1c2VyIGV4cGVyaWVuY2UgbGV2ZWwgd2hpY2ggd291bGQgdXNlIHRoaXMgdHlwZQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJVc2VyRXhwZXJpZW5jZUxldmVsIgotCQkJCXZhbHVlICAgICAgCSgiVXNlckV4cExldmVsX1NldCIgMTAwKQotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sCQkiVENHIgotCQkJCW5hbWUJCSJVc2VyRXhwTGV2ZWxfU2V0IgotCQkJCXZhbHVlCQkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkJBU0lDIgotCQkJCQkJdmFsdWUgICAgICAJMTAwCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiQURWQU5DRUQiCi0JCQkJCQl2YWx1ZSAgICAgIAkxMDEKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJFWFBFUlQiCi0JCQkJCQl2YWx1ZSAgICAgIAkxMDIKLQkJCQkJKQotCQkJCSkKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRUeXBlIgotCQkJCXZhbHVlICAgICAgCSgiRmllbGRUeXBlX1NldCIgNzEpCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wJCSJUQ0ciCi0JCQkJbmFtZQkJIkZpZWxkVHlwZV9TZXQiCi0JCQkJdmFsdWUJCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiVEVYVF9GSUVMRCIKLQkJCQkJCXZhbHVlICAgICAgCTcxCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiVEVYVF9BUkVBIgotCQkJCQkJdmFsdWUgICAgICAJNzIKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJDT01CT19CT1giCi0JCQkJCQl2YWx1ZSAgICAgIAk3MwotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkxJU1RfQk9YIgotCQkJCQkJdmFsdWUgICAgICAJNzQKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJDSEVDS19CT1giCi0JCQkJCQl2YWx1ZSAgICAgIAk3NQotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIk9QVElPTiIKLQkJCQkJCXZhbHVlICAgICAgCTc2Ci0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiVEVYVF9SRUFEX09OTFkiCi0JCQkJCQl2YWx1ZSAgICAgIAk3NwotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkNVU1RPTSIKLQkJCQkJCXZhbHVlICAgICAgCTc4Ci0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiRklMRSIKLQkJCQkJCXZhbHVlICAgICAgCTc5Ci0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiVVJJIgotCQkJCQkJdmFsdWUgICAgICAJODAKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJQQVNTV09SRCIKLQkJCQkJCXZhbHVlICAgICAgCTgxCi0JCQkJCSkKLQkJCQkpCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIk1heExlbmd0aCIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJCb29sZWFuVmFsdWVLaW5kIgotCQkJCXZhbHVlICAgICAgCSgiQm9vbGVhblZhbHVlS2luZF9TZXQiIDkxKQotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sCQkiVENHIgotCQkJCW5hbWUJCSJCb29sZWFuVmFsdWVLaW5kX1NldCIKLQkJCQl2YWx1ZQkJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJUUlVFX0ZBTFNFIgotCQkJCQkJdmFsdWUgICAgICAJOTEKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJFTkFCTEVfRElTQUJMRSIKLQkJCQkJCXZhbHVlICAgICAgCTkyCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiWUVTX05PIgotCQkJCQkJdmFsdWUgICAgICAJOTMKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJPTl9PRkYiCi0JCQkJCQl2YWx1ZSAgICAgIAk5NAotCQkJCQkpCi0JCQkJKQotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJDb2x1bW5XaWR0aFBlcmNlbnQiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiVmlzaWJsZVNpemUiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiSW5jbHVkZUFjdGlvblVSSSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJJbmNsdWRlSlNQVVJJIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkFsdERlc2NyaXB0aW9uVVJJIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlZhbGlkYXRpb25NaW5WYWx1ZSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJWYWxpZGF0aW9uTWF4VmFsdWUiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiVmFsaWRhdGlvblBhdHRlcm4iCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgQSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHNwZWNpYWwgdmFsaWRhdGlvbiByZXF1aXJlbWVudHMgdGhhdCBhcHBseSB0byB0aGlzIGZpZWxkCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlNwZWNpYWxWYWxpZGF0aW9uUmVxcyIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBUaGUgdmFsaWRhdGlvbiBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSBzcGVjaWFsIHZhbGlkYXRpb24gcmVxdWlyZW1lbnRzIGZvciB0aGlzIGZpZWxkLgotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJTcGVjaWFsVmFsaWRhdGlvbkNsYXNzIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCSkKLQkpCi0JCi0JIwotCSMgUm9sZSBQcm9wZXJ0aWVzCi0JIwotCShvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJUQ0ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkjIFRoZSBsYWJlbCB0ZXh0IHRvIHVzZSB3aGVuIGRpc3BsYXlpbmcgdGhpcyBhdHRyaWJ1dGUgKHdpdGhvdXQgJzonKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJEaXNwbGF5TmFtZSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBTcGVjaWZpZXMgdGhhdCB0aGlzIGZpZWxkIHNob3VsZCBub3QgYXBwZWFyIGluIGFueSB2aWV3cwotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJTa2lwR2VuZXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAlGQUxTRQotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJJc1JlcXVpcmVkIgotCQkJCXZhbHVlICAgICAgCVRSVUUKLQkJCSkKLQkJCSMgV2hldGhlciBvciBub3QgdG8gc2hvdyB0aGlzIGZpZWxkIGluIHRoZSB0cmVlIGlmIGl0IGlzIGEgY29tcG9zaXRlIGZpZWxkIHdpdGggY2FyZCAwLi4xIG9yIDEKLQkJCSMgV2hlbiBGQUxTRSwgdGhlIGNvZGUgZ2VuZXJhdG9yIHNob3VsZCBlbWJlZCB0aGUgZGV0YWlsIHBhZ2Ugb2YgdGhlIGNvbnRhaW5lZCB0eXBlIHdpdGhpbgotCQkJIyB0aGUgZGV0YWlsIHBhZ2Ugb2YgdGhlIGNvbnRhaW5lciB0eXBlLgotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJTaG93Q29tcG9zaXRlSW5UcmVlIgotCQkJCXZhbHVlICAgICAgCVRSVUUKLQkJCSkKLQkJCSMgV2hlbiBUUlVFLCB0aGUgY29kZSBnZW5lcmF0b3Igc2hvdWxkIGVtYmVkIHRoZSBjb2xsZWN0aW9uIHBhZ2Ugb2YgdGhlIGNvbnRhaW5lZCB0eXBlcyB3aXRoaW4KLQkJCSMgdGhlIHByb3BlcnRpZXMgcGFnZSBvZiB0aGUgZGV0YWlsIHBhZ2Ugb2YgdGhlIGNvbnRhaW5lciB0eXBlLgotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJTaG93QXNQcm9wZXJ0aWVzUGFnZSIKLQkJCQl2YWx1ZSAgICAgIAlGQUxTRQotCQkJKQotCQkJIyBBIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIHVzZXIgcm9sZXMgd2hpY2ggdGhpcyBmaWVsZCBpcyB1c2VkIGJ5IAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJBcHBsaWVzVG9Sb2xlcyIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJIyBBIGNsYXNzaWZpY2F0aW9uIG9mIHVzZXIgZXhwZXJpZW5jZSBsZXZlbCB3aGljaCB3b3VsZCB1c2UgdGhpcyB0eXBlCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlVzZXJFeHBlcmllbmNlTGV2ZWwiCi0JCQkJdmFsdWUgICAgICAJKCJVc2VyRXhwTGV2ZWxfU2V0IiAxMDApCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wJCSJUQ0ciCi0JCQkJbmFtZQkJIlVzZXJFeHBMZXZlbF9TZXQiCi0JCQkJdmFsdWUJCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiQkFTSUMiCi0JCQkJCQl2YWx1ZSAgICAgIAkxMDAKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJBRFZBTkNFRCIKLQkJCQkJCXZhbHVlICAgICAgCTEwMQotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkVYUEVSVCIKLQkJCQkJCXZhbHVlICAgICAgCTEwMgotCQkJCQkpCi0JCQkJKQotCQkJKQotCQkJIyBBIHN0cmluZyB3aGljaCBjYW4gYmUgdXNlZCB0byBncm91cCB0aGlzIGZpZWxkIHdpdGggb3RoZXIgZmllbGRzIHdpdGggdGhlIHNhbWUgY2F0ZWdvcnlJZAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJDYXRlZ29yeUlkIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkVHlwZSIKLQkJCQl2YWx1ZSAgICAgIAkoIkZpZWxkVHlwZV9TZXQiIDcxKQotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sCQkiVENHIgotCQkJCW5hbWUJCSJGaWVsZFR5cGVfU2V0IgotCQkJCXZhbHVlCQkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIlRFWFRfRklFTEQiCi0JCQkJCQl2YWx1ZSAgICAgIAk3MQotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIlRFWFRfQVJFQSIKLQkJCQkJCXZhbHVlICAgICAgCTcyCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiQ09NQk9fQk9YIgotCQkJCQkJdmFsdWUgICAgICAJNzMKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJMSVNUX0JPWCIKLQkJCQkJCXZhbHVlICAgICAgCTc0Ci0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiQ0hFQ0tfQk9YIgotCQkJCQkJdmFsdWUgICAgICAJNzUKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJPUFRJT04iCi0JCQkJCQl2YWx1ZSAgICAgIAk3NgotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIlRFWFRfUkVBRF9PTkxZIgotCQkJCQkJdmFsdWUgICAgICAJNzcKLQkJCQkJKQotCQkJCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQkJCW5hbWUgICAgICAgCSJDVVNUT00iCi0JCQkJCQl2YWx1ZSAgICAgIAk3OAotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIkZJTEUiCi0JCQkJCQl2YWx1ZSAgICAgIAk3OQotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIlVSSSIKLQkJCQkJCXZhbHVlICAgICAgCTgwCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiUEFTU1dPUkQiCi0JCQkJCQl2YWx1ZSAgICAgIAk4MQotCQkJCQkpCi0JCQkJKQotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJNYXhMZW5ndGgiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiQm9vbGVhblZhbHVlS2luZCIKLQkJCQl2YWx1ZSAgICAgIAkoIkJvb2xlYW5WYWx1ZUtpbmRfU2V0IiA5MSkKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbAkJIlRDRyIKLQkJCQluYW1lCQkiQm9vbGVhblZhbHVlS2luZF9TZXQiCi0JCQkJdmFsdWUJCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiVFJVRV9GQUxTRSIKLQkJCQkJCXZhbHVlICAgICAgCTkxCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiRU5BQkxFX0RJU0FCTEUiCi0JCQkJCQl2YWx1ZSAgICAgIAk5MgotCQkJCQkpCi0JCQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCQkJbmFtZSAgICAgICAJIllFU19OTyIKLQkJCQkJCXZhbHVlICAgICAgCTkzCi0JCQkJCSkKLQkJCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJCQluYW1lICAgICAgIAkiT05fT0ZGIgotCQkJCQkJdmFsdWUgICAgICAJOTQKLQkJCQkJKQotCQkJCSkKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiQ29sdW1uV2lkdGhQZXJjZW50IgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlZpc2libGVTaXplIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIkluY2x1ZGVBY3Rpb25VUkkiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiSW5jbHVkZUpTUFVSSSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJBbHREZXNjcmlwdGlvblVSSSIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJWYWxpZGF0aW9uTWluVmFsdWUiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiVmFsaWRhdGlvbk1heFZhbHVlIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJUQ0ciCi0JCQkJbmFtZSAgICAgICAJIlZhbGlkYXRpb25QYXR0ZXJuIgotCQkJCXZhbHVlICAgICAgCSIiCi0JCQkpCi0JCQkjIEEgdGV4dCBkZXNjcmlwdGlvbiBvZiBzcGVjaWFsIHZhbGlkYXRpb24gcmVxdWlyZW1lbnRzIHRoYXQgYXBwbHkgdG8gdGhpcyBmaWVsZAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVENHIgotCQkJCW5hbWUgICAgICAgCSJTcGVjaWFsVmFsaWRhdGlvblJlcXMiCi0JCQkJdmFsdWUgICAgICAJIiIKLQkJCSkKLQkJCSMgVGhlIHZhbGlkYXRpb24gY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyB0aGUgc3BlY2lhbCB2YWxpZGF0aW9uIHJlcXVpcmVtZW50cyBmb3IgdGhpcyBmaWVsZC4KLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlRDRyIKLQkJCQluYW1lICAgICAgIAkiU3BlY2lhbFZhbGlkYXRpb25DbGFzcyIKLQkJCQl2YWx1ZSAgICAgIAkiIgotCQkJKQotCQkpCi0JKQotKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2Uvd2ViYXBwbGljYXRpb24uY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2Uvd2ViYXBwbGljYXRpb24uY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2UxZTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dlYmFwcGxpY2F0aW9uLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDEwMzQ3ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNTANCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4zLjA0MDcuMjgwMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3ZWJhcHBsaWNhdGlvbiINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJIm5zVVJJIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIndlYmFwcGxpY2F0aW9uLnhtaSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJXZWJhcHBsaWNhdGlvbiIpKSkNCi0gICAgcXVpZCAgICAgICAJIjM4QzA3NkQ2MDNERCINCi0gICAgdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0DQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzOEZGM0MxNTAxNTEiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb24iDQotCSAgICBxdWlkdSAgICAgIAkiMzhDMDhGMEYwMzhEIikpDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIldlYkFwcCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yDQotfGEgd2ViIGFwcGxpY2F0aW9uLg0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiY29tcG9uZW50Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDU1Q0EwM0UyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Sk5ESUVudlJlZnNHcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDUzOTUwMzQ5IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzdHJpYnV0YWJsZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDc4MkQwMjMxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZGlzdHJpYnV0YWJsZSBlbGVtZW50LCBieSBpdHMgcHJlc2VuY2UgaW4gYSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBpcyBwcm9ncmFtbWVkIGFwcHJvcHJpYXRlbHkgdG8gYmUgZGVwbG95ZWQgaW50byBhIGRpc3RyaWJ1dGVkIHNlcnZsZXQgY29udGFpbmVyIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkJICAgIG5hbWUgICAgICAgCSJGaW5hbCINCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkJICAgIG5hbWUgICAgICAgCSJWb2xhdGlsZSINCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkJICAgIG5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJCSAgICBuYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJCSAgICBuYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCQkgICAgbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJICAgIHZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1N0MyMDE3OSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiQ29udGV4dFBhcmFtIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDc4QjYwMkE2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZA0KLXxUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHdlYiBhcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLg0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1OYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwNzhDNjAyRjAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEBkZXByZWNhdGVkDQotfFRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtVmFsdWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3OERCMDM5QSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QGRlcHJlY2F0ZWQNCi18VGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDc4RUEwMzE5Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAZGVwcmVjYXRlZCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU2VydmxldCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3OTE0MDI1MSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEgc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZCBsb2FkZWQuIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiNDAyM0IxMDQwMzAwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlcnZsZXROYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwNzkzMDAwNjciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIHNlcnZsZXQuIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2FkT25TdGFydHVwIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwNzk1NTAxNDciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YgdGhlc2UgZWxlbWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBMb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBoaWdoZXIgaW50ZWdlcnMuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgb3IgaWYgdGhlIHZhbHVlIHNwZWNpZmllZCBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyLCB0aGUgY29udGFpbmVyIGlzIGZyZWUgdG8gbG9hZCBpdCBhdCBhbnkgdGltZSBpbiB0aGUgc3RhcnR1cCBzZXF1ZW5jZS4NCi18DQotCQkgICAgDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiDQotCQkgICAgdHlwZSAgICAgICAJIkludGVnZXIiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTZXJ2bGV0TWFwcGluZyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3OUJEMDJCOSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhIHNlcnZsZXQgYW5kIGEgdXJsIHBhdHRlcm4iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXJsUGF0dGVybiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDc5REQwMzkxIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIE11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMCBvZiB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4iDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNjdDMjdBMDBENyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZQ0KLXxzZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWINCi18YXBwbGljYXRpb24uDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNlc3Npb25Db25maWciDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwN0E1MzAxQkQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2Vzc2lvblRpbWVvdXQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3QTVCMDIwNSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQNCi18ICAgICAgICBzZXNzaW9uIHRpbWVvdXQgaW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkDQotfCAgICAgICAgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBzcGVjaWZpZWQgdGltZW91dA0KLXwgICAgICAgIG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuDQotfCAgICAgICAgSWYgdGhlIHRpbWVvdXQgaXMgMCBvciBsZXNzLCB0aGUgY29udGFpbmVyIGVuc3VyZXMNCi18ICAgICAgICB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZQ0KLXwgICAgICAgIG91dC4gSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXINCi18ICAgICAgICBtdXN0IHNldCBpdHMgZGVmYXVsdCB0aW1lb3V0IHBlcmlvZC4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiaW50Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiTWltZU1hcHBpbmciDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwN0E3NTAwRkUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIG1pbWUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uIGFuZCBhIG1pbWUgdHlwZS4NCi18DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3QTgzMDAxNyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4gZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0Ig0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaW1lVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdBOEMwMUJGIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbWltZS10eXBlIGVsZW1lbnQgY29udGFpbnMgYSBkZWZpbmVkIG1pbWUgdHlwZS4gZXhhbXBsZTogInRleHQvcGxhaW4iDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIldlbGNvbWVGaWxlTGlzdCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3QUFEMDFBOCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUgZmlsZXMgZWxlbWVudHMuIg0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJFcnJvclBhZ2UiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwN0FDRjAzRTIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGVycm9yLXBhZ2UgZWxlbWVudCBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlIG9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdBRUIwMkFDIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24iDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlRhZ0xpYlJlZiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3QjMwMDJFNyINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMganNwOjpUYWdMaWJSZWYNCi18VGhlIHRhZ2xpYiBlbGVtZW50IGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBKU1AgdGFnIGxpYnJhcnkuDQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YWdsaWJVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3QjM3MDBBMiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QGRlcHJlY2F0ZWQgU2VlIGpzcDo6VGFnTGliUmVmDQotfA0KLXxUaGUgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSwgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSB3ZWIueG1sIGRvY3VtZW50LCBpZGVudGlmeWluZyBhIFRhZyBMaWJyYXJ5IHVzZWQgaW4gdGhlIFdlYiBBcHBsaWNhdGlvbi4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFnbGliTG9jYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3QjRCMDMxOCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QGRlcHJlY2F0ZWQgU2VlIGpzcDo6VGFnTGliUmVmDQotfA0KLXxUaGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIChhcyBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJhcnkgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5Lg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTZWN1cml0eUNvbnN0cmFpbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwN0I2QTAyQUUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucyINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXNwbGF5TmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U4OUQ3RTgwMTJEIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGlzcGxheU5hbWVzIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJXZWJSZXNvdXJjZUNvbGxlY3Rpb24iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwN0I4NzAzQUIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBpZGVudGlmeSBhIHN1YnNldCBvZiB0aGUgcmVzb3VyY2VzIGFuZCBIVFRQIG1ldGhvZHMgb24gdGhvc2UgcmVzb3VyY2VzIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYgbm8gSFRUUCBtZXRob2RzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcyB0byBhbGwgSFRUUCBtZXRob2RzLg0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndlYlJlc291cmNlTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdCQTMwM0QzIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3QkI4MDE1MiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXJsUGF0dGVybiINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbmlxdWUiDQotCQkJICAgIHZhbHVlICAgICAgCUZBTFNFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUxRUEwMzQ1Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIHN0ZXJlb3R5cGUgCSIxLi4qIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJodHRwTWV0aG9kIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTIwMjAxMjMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiDQotCQkgICAgdHlwZSAgICAgICAJIkhUVFBNZXRob2RUeXBlRW51bSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEEyRTIwMEM2Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiQXV0aENvbnN0cmFpbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwN0M4MDAxQTAiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGF1dGgtY29uc3RyYWludFR5cGUgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQNCi18c2hvdWxkIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZQ0KLXxjb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kDQotfHRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzDQotfGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBvciBiZSB0aGUgc3BlY2lhbGx5DQotfHJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcg0KLXxpbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIg0KLXxhbmQgcm9sZW5hbWVzIGFwcGVhciwgdGhlIGNvbnRhaW5lciBpbnRlcnByZXRzIHRoaXMgYXMgYWxsDQotfHJvbGVzLiAgSWYgbm8gcm9sZXMgYXJlIGRlZmluZWQsIG5vIHVzZXIgaXMgYWxsb3dlZCBhY2Nlc3MNCi18dG8gdGhlIHBvcnRpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXNjcmliZWQgYnkgdGhlDQotfGNvbnRhaW5pbmcgc2VjdXJpdHktY29uc3RyYWludC4gIFRoZSBjb250YWluZXIgbWF0Y2hlcw0KLXxyb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZyBhY2Nlc3MuDQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdDOTcwM0I2Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zDQotfEEgZGVzY3JpcHRpb24gb2YgdGhlIGF1dGggY29uc3RyYWludC4NCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicm9sZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QzdBQTk0MDNEOSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QSBsaXN0IG9mIHJvbGUgbmFtZXMgZm9yIHRoZSBhdXRoIGNvbnN0cmFpbnQuICBFYWNoIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZSAoYSBTdHJpbmcpLg0KLXwNCi0JCSAgICANCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiVXNlckRhdGFDb25zdHJhaW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDdDQjgwMEIwIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB1c2VyLWRhdGEtY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gaW5kaWNhdGUgaG93IGRhdGEgY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZSBwcm90ZWN0ZWQiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3Q0M2MDAyRSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucw0KLXxBIGRlc2NyaXB0aW9uIGZvciB0aGUgdXNlciBkYXRhIGNvbnN0cmFpbnQuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRyYW5zcG9ydEd1YXJhbnRlZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdDRDgwMzVGIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgdHJhbnNwb3J0LWd1YXJhbnRlZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvciBDT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkNCi18dHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlIGNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYSBmYXNoaW9uIHRoYXQgcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSB0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IgQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzIHJlcXVpcmVkLg0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NjFBOTAxOEYiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJMb2dpbkNvbmZpZyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA3RDBGMDA2RiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgbG9naW4tY29uZmlnIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbmVlZGVkIGJ5IHRoZSBmb3JtIGxvZ2luDQotfG1lY2hhbmlzbS4NCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF1dGhNZXRob2QiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3RDE3MDA2NiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNCAgZGVwcmVjYXRlZCwgYmVjb21lcyBpbml0UGFyYW1WYWx1ZXMNCi18DQotfA0KLXxUaGUgYXV0aC1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0byBnYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IGFuIGF1dGhvcml6YXRpb24gY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkIG1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGZvciB0aGlzIGVsZW1lbnQgYXJlICJCQVNJQyIsICJESUdFU1QiLCAiRk9STSIsIG9yICJDTElFTlQtQ0VSVCIuDQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIkF1dGhNZXRob2RLaW5kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUUwQTJEODAyOUEiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZWFsbU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA3RDI2MDM0RCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8gdXNlIGluIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbiINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXV0aG9yaXphdGlvbk1ldGhvZCINCi0JCSAgICBxdWlkICAgICAgIAkiM0VFMEE0MzAwMDE0Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJGb3JtTG9naW5Db25maWciDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwN0QzOTAyOTYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGZvcm0tbG9naW4tY29uZmlnIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IgcGFnZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZm9ybUxvZ2luUGFnZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMDdENDQwMTdBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAgd2hlcmUgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlIGZvdW5kIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmb3JtRXJyb3JQYWdlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwN0Q1NzAyMzUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiSW5pdFBhcmFtIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDhFOUQwMzI1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZA0KLXxUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtIG9mIHRoZSBzZXJ2bGV0DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA4RUIzMDMzMCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QGRlcHJlY2F0ZWQNCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtVmFsdWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzA4RUM3MDIyMSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQGRlcHJlY2F0ZWQiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwOEVEOTAxRDciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkBkZXByZWNhdGVkIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJSZXNBdXRoU2VydmxldFR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMDlFRUEwMjY1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfENPTlRBSU5FUj0wDQotfFNFUlZMRVQ9MQ0KLXwNCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkNPTlRBSU5FUiINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5MzAxOTYwMjI2Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiU0VSVkxFVCINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5MzAxOTgwMDBDIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiV2ViVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QzBBMUY3MDI5NCINCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiU2VydmxldFR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMEEyMzIwMzExIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMEEyOEMwMkFEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTFGNzAyOTQiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjbGFzc05hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5MDQ2MDQyMDBENSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiSlNQVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwQTI2NDAyNzMiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwQTI5MDAyNTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYlR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBMUY3MDI5NCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImpzcEZpbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzBBMjc2MDM1NSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiVVJMUGF0dGVyblR5cGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEMwQTJDNTAwNDIiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXJsUGF0dGVybiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMEEyQ0YwMTM2Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJIVFRQTWV0aG9kVHlwZUVudW0iDQotCSAgICBxdWlkICAgICAgIAkiMzhDMEEyRTIwMEM2Ig0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkdFVCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMEEyRkMwMDRCIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgKEdFVCB8IFBPU1QgfC4uLikiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQT1NUIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTIzODAxMzQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQVVQiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1MjM5MDM1MiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkRFTEVURSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUyM0IwMERFIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiSEVBRCINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUyM0MwMzkzIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiT1BUSU9OUyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUyM0YwMDEyIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVFJBQ0UiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1MjQwMDFDQyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlJvbGVOYW1lVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwQTM0MDAxMzkiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicm9sZU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzBBMzQ3MDAzRiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIldlbGNvbWVGaWxlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiMzhDMEE1QTgwMEU5Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlIGFzIGEgZGVmYXVsdCB3ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbA0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndlbGNvbWVGaWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMwQTVCMTAxNkUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiMzkwNDYxQTkwMThGIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfE5PTkU9MQ0KLXxJTlRFR1JBTD0yDQotfENPTkZJREVOVElBTD0zDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJOT05FIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTkzMDE4MjAyMTQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJJTlRFR1JBTCINCi0JCSAgICBxdWlkICAgICAgIAkiMzk5MzAxODMwMzJEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ09ORklERU5USUFMIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTkzMDE4RTAwRTQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRXhjZXB0aW9uVHlwZUVycm9yUGFnZSINCi0JICAgIHF1aWQgICAgICAgCSIzOTg4M0UxMTAxNTQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOTg4M0UzQTAwNTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkVycm9yUGFnZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdBQ0YwM0UyIikpKQ0KLQkob2JqZWN0IENsYXNzICJFcnJvckNvZGVFcnJvclBhZ2UiDQotCSAgICBxdWlkICAgICAgIAkiMzk4ODNFNkMwMjA5Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODNFOTQwMEE4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpFcnJvclBhZ2UiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QUNGMDNFMiIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVycm9yQ29kZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzk4ODNFODIwMkFCIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZXJyb3ItY29kZSBjb250YWlucyBhbiBIVFRQIGVycm9yIGNvZGUsIGV4OiA0MDQNCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJGaWx0ZXJNYXBwaW5nIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkZCMTRDMDNERCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxEZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsIGFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvIGEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uIHNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoIHN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhIHNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZSBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgPGZpbHRlcm5hbWU+IHN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlIDxmaWx0ZXI+IGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLg0KLXwNCi18QGludmFyaWFudCBUaGUgZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIEZpbHRlcjo6bmFtZSBvZiBvbmUgb2YgdGhlIEZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4NCi18DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1cmxQYXR0ZXJuIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGQjE4OTAyMzYiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB1cmwtcGF0dGVybiBlbGVtZW50IGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4gTXVzdCBmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDEwIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLiINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzcGF0Y2hlclR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0NDdFMDM3NiINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uNCINCi0JCSAgICB0eXBlICAgICAgIAkiRGlzcGF0Y2hlclR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NDVCMDM3NiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJGaWx0ZXIiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRkIxNTUwM0NDIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlY2xhcmVzIGEgZmlsdGVyIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvIGVpdGhlciBhIHNlcnZsZXQgb3IgYSBVUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlIGZpbHRlci1uYW1lIHZhbHVlIHRvIHJlZmVyZW5jZS4gRmlsdGVycyBjYW4gYWNjZXNzIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQjA4RTAzNzkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRkIxQkMwMzJBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBmaWx0ZXIuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUgZmlsdGVyLiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRpc3BhdGNoZXJUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ0NDVCMDM3NiINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJGT1JXQVJEIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDQ2NDAwQkMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJJTkNMVURFIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDQ2NzAzQTUiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJSRVFVRVNUIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDQ2OTAyQUUiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJFUlJPUiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDQ0NkIwMTUyIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENTZEQTAyM0UiKQ0KLQkob2JqZWN0IENsYXNzICJMb2NhbEVuY29kaW5nTWFwcGluZyINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENTZGMjAxNzAiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTcwNTAxRjAiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTcwODAyNzYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJIVFRQTWV0aG9kVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNFOTMwQjA1MDA2NSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJodHRwTWV0aG9kIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTkzMEIwNTAwNjYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkF1dGhNZXRob2RLaW5kIg0KLQkgICAgcXVpZCAgICAgICAJIjNFRTBBMkQ4MDI5QSINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJVTlNQRUNJRklFRCINCi0JCSAgICBxdWlkICAgICAgIAkiM0VFMEEyRkUwMzdCIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQkFTSUMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFRTBBMzBGMDMzQSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkRJR0VTVCINCi0JCSAgICBxdWlkICAgICAgIAkiM0VFMEEzMTMwMjNCIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiRk9STSINCi0JCSAgICBxdWlkICAgICAgIAkiM0VFMEEzMTgwMUYyIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ0xJRU5UX0NFUlQiDQotCQkgICAgcXVpZCAgICAgICAJIjNFRTBBMzFBMDM5MCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzExQ0U2MDIxMyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ3ZWJBcHAiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExQ0U4MDAwRCINCi0JCSAgICBsYWJlbCAgICAgIAkid2ViQXBwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJjb250ZXh0cyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFDRTgwMDBFIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAZGVwcmVjYXRlZCBzZWUgY29udGV4dFBhcmFtcyINCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGV4dHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkNvbnRleHRQYXJhbSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc4QjYwMkE2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzExQ0YzMDFBMyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ3ZWJBcHAiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExQ0Y0MDI2RCINCi0JCSAgICBsYWJlbCAgICAgIAkid2ViQXBwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlcnJvclBhZ2VzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMUNGNDAyNzciDQotCQkgICAgbGFiZWwgICAgICAJImVycm9yUGFnZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkVycm9yUGFnZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdBQ0YwM0UyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzExQ0Y3MDM0RSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ3ZWJBcHAiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExQ0Y4MDNCMyINCi0JCSAgICBsYWJlbCAgICAgIAkid2ViQXBwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJmaWxlTGlzdCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFDRjgwM0I0Ig0KLQkJICAgIGxhYmVsICAgICAgCSJmaWxlTGlzdCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2VsY29tZUZpbGVMaXN0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0FBRDAxQTgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTFDRkIwMjgxIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxNCBkZXByZWNhdGVkLCByZXBsYWNlZCBieSB0YWdMaWJSZWZzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndlYkFwcCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFDRkQwMEEzIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJBcHAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInRhZ0xpYnMiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExQ0ZEMDBBNCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QGRlcHJlY2F0ZWQgU2VlIGpzcDo6VGFnTGliUmVmDQotfA0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJ0YWdMaWJzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpUYWdMaWJSZWYiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QjMwMDJFNyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCINCi0JICAgIHF1aWQgICAgICAgCSIzOEMxMUQwMDAxMzQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAid2ViQXBwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMUQwMTAxOEYiDQotCQkgICAgbGFiZWwgICAgICAJIndlYkFwcCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiY29uc3RyYWludHMiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExRDAxMDE5OSINCi0JCSAgICBsYWJlbCAgICAgIAkiY29uc3RyYWludHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlY3VyaXR5Q29uc3RyYWludCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCNkEwMkFFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSINCi0JICAgIHF1aWQgICAgICAgCSIzOEMxMUQxMTAxODgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAid2ViQXBwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMUQxMjAwNjciDQotCQkgICAgbGFiZWwgICAgICAJIndlYkFwcCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAibG9naW5Db25maWciDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExRDEyMDA3MSINCi0JCSAgICBsYWJlbCAgICAgIAkibG9naW5Db25maWciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkxvZ2luQ29uZmlnIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0QwRjAwNkYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMTUwMUMwIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndlYkFwcCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMTcwMjNCIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJBcHAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIm1pbWVNYXBwaW5ncyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMTcwMjQ1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJtaW1lTWFwcGluZ3MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246Ok1pbWVNYXBwaW5nIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0E3NTAwRkUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMUIwMzI3Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndlYkFwcCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMUMwMUYyIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJBcHAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgInNlc3Npb25Db25maWciDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExRDFDMDFGMyINCi0JCSAgICBsYWJlbCAgICAgIAkic2Vzc2lvbkNvbmZpZyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2Vzc2lvbkNvbmZpZyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdBNTMwMUJEIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4Ig0KLQkgICAgcXVpZCAgICAgICAJIjM4QzExRDFGMDJBQiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ3ZWJBcHAiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExRDIwMDI5OCINCi0JCSAgICBsYWJlbCAgICAgIAkid2ViQXBwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJzZXJ2bGV0TWFwcGluZ3MiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExRDIwMDJBMiINCi0JCSAgICBsYWJlbCAgICAgIAkic2VydmxldE1hcHBpbmdzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0TWFwcGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5QkQwMkI5Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5Ig0KLQkgICAgcXVpZCAgICAgICAJIjM4QzExRDIzMDEyMCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ3ZWJBcHAiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExRDI0MDJEQSINCi0JCSAgICBsYWJlbCAgICAgIAkid2ViQXBwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJzZXJ2bGV0cyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMjQwMkU0Ig0KLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2bGV0cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5MTQwMjUxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCINCi0JICAgIHF1aWQgICAgICAgCSIzOEMxMUQyNzAxREEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzExRDI4MDJDMiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAic2VjdXJpdHlSb2xlcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTFEMjgwMkNDIg0KLQkJICAgIGxhYmVsICAgICAgCSJzZWN1cml0eVJvbGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwMzFGRTAxMkQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzEyMUVEMDJENiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZWNDb25zdHJhaW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjFFRTAxRTciDQotCQkgICAgbGFiZWwgICAgICAJInNlY0NvbnN0cmFpbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlY3VyaXR5Q29uc3RyYWludCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCNkEwMkFFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIndlYlJlc291cmNlQ29sbGVjdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzEyMUVFMDFGMSINCi0JCSAgICBsYWJlbCAgICAgIAkid2ViUmVzb3VyY2VDb2xsZWN0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViUmVzb3VyY2VDb2xsZWN0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0I4NzAzQUIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzEyMUYyMDBFOSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzZWNDb25zdHJhaW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjFGMzAzOUQiDQotCQkgICAgbGFiZWwgICAgICAJInNlY0NvbnN0cmFpbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlY3VyaXR5Q29uc3RyYWludCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCNkEwMkFFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImF1dGhDb25zdHJhaW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjFGMzAzQTciDQotCQkgICAgbGFiZWwgICAgICAJImF1dGhDb25zdHJhaW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpBdXRoQ29uc3RyYWludCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdDODAwMUEwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNCINCi0JICAgIHF1aWQgICAgICAgCSIzOEMxMjFGNzAyMDgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic2VjQ29uc3RyYWludCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTIxRjgwMUVDIg0KLQkJICAgIGxhYmVsICAgICAgCSJzZWNDb25zdHJhaW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZWN1cml0eUNvbnN0cmFpbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QjZBMDJBRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJ1c2VyRGF0YUNvbnN0cmFpbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzEyMUY4MDFFRCINCi0JCSAgICBsYWJlbCAgICAgIAkidXNlckRhdGFDb25zdHJhaW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpVc2VyRGF0YUNvbnN0cmFpbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3Q0I4MDBCMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUiDQotCSAgICBxdWlkICAgICAgIAkiMzhDMTIyQUMwMTRBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInNlcnZsZXQiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzEyMkFEMDAwMSINCi0JCSAgICBsYWJlbCAgICAgIAkic2VydmxldCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5MTQwMjUxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAid2ViVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTIyQUQwMDE1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJUeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTFGNzAyOTQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2Ig0KLQkgICAgcXVpZCAgICAgICAJIjM4QzEyMkI1MDFCQiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTIyQjYwMTQ1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAicGFyYW1zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjJCNjAxNTkiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBpbml0UGFyYW1zIg0KLQkJICAgIGxhYmVsICAgICAgCSJwYXJhbXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkluaXRQYXJhbSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDhFOUQwMzI1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOCINCi0JICAgIHF1aWQgICAgICAgCSIzOEMxMjJDMDAxOTkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkiDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzEyMkMxMDI4QiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5MTQwMjUxIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAic2VjdXJpdHlSb2xlUmVmcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTIyQzEwMjlGIg0KLQkJICAgIGxhYmVsICAgICAgCSJzZWN1cml0eVJvbGVSZWZzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlUmVmIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzFCQzdBMDAyNUMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzEyM0FGMDJDNCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJmaWxlTGlzdCINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTIzQjMwMTExIg0KLQkJICAgIGxhYmVsICAgICAgCSJmaWxlTGlzdCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2VsY29tZUZpbGVMaXN0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0FBRDAxQTgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZmlsZSINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTIzQjMwMTFCIg0KLQkJICAgIGxhYmVsICAgICAgCSJmaWxlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWxjb21lRmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEE1QTgwMEU5Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMSINCi0JICAgIHF1aWQgICAgICAgCSIzOEMxMjQwOTAxNzkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicmVzQ29sbGVjdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiMzhDMTI0MEEwMjU2Ig0KLQkJICAgIGxhYmVsICAgICAgCSJyZXNDb2xsZWN0aW9uIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJSZXNvdXJjZUNvbGxlY3Rpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3Qjg3MDNBQiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJVUkxzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjQwQTAyNjAiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyB1cmxQYXR0ZXJuIg0KLQkJICAgIGxhYmVsICAgICAgCSJVUkxzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpVUkxQYXR0ZXJuVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEEyQzUwMDQyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMiINCi0JICAgIHF1aWQgICAgICAgCSIzOEMxMjQ4OTAwQkUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibG9naW5Db25maWciDQotCQkgICAgcXVpZCAgICAgICAJIjM4QzEyNDg5MDMwMyINCi0JCSAgICBsYWJlbCAgICAgIAkibG9naW5Db25maWciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkxvZ2luQ29uZmlnIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0QwRjAwNkYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZm9ybUxvZ2luQ29uZmlnIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOEMxMjQ4OTAzMEQiDQotCQkgICAgbGFiZWwgICAgICAJImZvcm1Mb2dpbkNvbmZpZyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6Rm9ybUxvZ2luQ29uZmlnIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0QzOTAyOTYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzIg0KLQkgICAgcXVpZCAgICAgICAJIjM5MDQ1RTcyMDIwNCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJleGNlcHRpb25UeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTA0NUU3MzAzNjQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBleGNlcHRpb24gdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4iDQotCQkgICAgbGFiZWwgICAgICAJImV4Y2VwdGlvblR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZXJyb3JQYWdlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOTA0NUU3NDAxQzEiDQotCQkgICAgbGFiZWwgICAgICAJImVycm9yUGFnZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RXhjZXB0aW9uVHlwZUVycm9yUGFnZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzk4ODNFMTEwMTU0Ig0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNCINCi0JICAgIHF1aWQgICAgICAgCSIzOTA0NjBBQTAxODkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic2VydmxldCINCi0JCSAgICBxdWlkICAgICAgIAkiMzkwNDYwQUIwMjM0Ig0KLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2bGV0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5MDQ2MEFCMDJCNiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldE1hcHBpbmciDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3OUJEMDJCOSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRkIzQjEwMUNDIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImZpbHRlcnMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QkZCM0IyMDEyMyINCi0JCSAgICBsYWJlbCAgICAgIAkiZmlsdGVycyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RmlsdGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjE1NTAzQ0MiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlCRkIzQjIwMTJEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgiDQotCSAgICBxdWlkICAgICAgIAkiMzlCRkI0MTUwMjk4Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImZpbHRlck1hcHBpbmdzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGQjQxNjAxMjciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkZpbHRlciBtYXBwaW5ncyBkZWZpbmVkIGZvciB0aGUgd2ViIGFwcCINCi0JCSAgICBsYWJlbCAgICAgIAkiZmlsdGVyTWFwcGluZ3MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkZpbHRlck1hcHBpbmciDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMTRDMDNERCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGQjQxNjAxMjgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMCINCi0JICAgIHF1aWQgICAgICAgCSIzOUJGQjU0RDAxRUMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibGlzdGVuZXJzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGQjU0RTAyMTUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBsaXN0ZW5lcnMgY29sbGVjdGlvbiBjb250YWlucyBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW5zIGluIHRoZSB3ZWIgYXBwLiINCi0JCSAgICBsYWJlbCAgICAgIAkibGlzdGVuZXJzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TGlzdGVuZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMjYwMDFCRCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUJGQjU0RTAyMjAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMiINCi0JICAgIHF1aWQgICAgICAgCSIzOUMwMDI2RTAyRDEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaW5pdFBhcmFtcyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlDMDAyNkYwMTYwIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgaW5pdFBhcmFtVmFsdWVzDQotfFRoZSBpbml0LXBhcmFtcyBjb250YWluIGEgbmFtZS92YWx1ZSBwYWlycyBhcyBpbml0aWFsaXphdGlvbiBwYXJhbXMgZm9yIHRoZSBmaWx0ZXINCi18DQotCQkgICAgDQotCQkgICAgbGFiZWwgICAgICAJImluaXRQYXJhbXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkluaXRQYXJhbSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDhFOUQwMzI1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QzAwMjZGMDE2QSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RmlsdGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjE1NTAzQ0MiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM0Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5QzAwNTZBMDI5MyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJmaWx0ZXIiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QzAwNTZCMDMyMSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGZpbHRlciBiZWluZyBtYXBwZWQiDQotCQkgICAgbGFiZWwgICAgICAJImZpbHRlciINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RmlsdGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjE1NTAzQ0MiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzUiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QzAwNTZCMDMyQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RmlsdGVyTWFwcGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkIxNEMwM0REIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNiINCi0JICAgIHF1aWQgICAgICAgCSIzOUMwMDVCQjAwQjkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic2VydmxldCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlDMDA1QkMwMDREIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJBbiBvcHRpb25hbCBzZXJ2bGV0IHRoYXQgaXMgbWFwcGVkIGJ5IGEgZmlsdGVyIG1hcHBpbmcuICBzZXJ2bGV0TmFtZSBpcyB1c2VkIHRvIHJlc29sdmUgdGhlIHNlcnZsZXQgcmVmZXJlbmNlLiINCi0JCSAgICBsYWJlbCAgICAgIAkic2VydmxldCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5MTQwMjUxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUMwMDVCQzAwNjEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkZpbHRlck1hcHBpbmciDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMTRDMDNERCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzgiDQotCSAgICBxdWlkICAgICAgIAkiMzlDMDNDMjgwMzU2Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImZpbHRlckNsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUMwM0MyOTAyNjciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuIg0KLQkJICAgIGxhYmVsICAgICAgCSJmaWx0ZXJDbGFzcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzOSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlDMDNDMjkwMjhGIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpGaWx0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMTU1MDNDQyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDAiDQotCSAgICBxdWlkICAgICAgIAkiMzlDMDNFNkMwMzVBIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImxpc3RlbmVyQ2xhc3MiDQotCQkgICAgcXVpZCAgICAgICAJIjM5QzAzRTZEMDJBNyINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIg0KLQkJICAgIGxhYmVsICAgICAgCSJsaXN0ZW5lckNsYXNzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyINCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUMwM0U2RDAyQ0YiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpMaXN0ZW5lciINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkIyNjAwMUJEIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MiINCi0JICAgIHF1aWQgICAgICAgCSIzOTk4MkEyRTAyNTUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicnVuQXMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTgyQTJGMDE4NCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSWYgZGVmaW5lZCBmb3IgYSBzZXJ2bGV0LCBvdmVycmlkZXMgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHVzZWQgdG8gY2FsbCBhbiBFSkIgYnkgdGhhdCBzZXJ2bGV0IGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgcm9sZS1uYW1lIGlzIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4iDQotCQkgICAgbGFiZWwgICAgICAJInJ1bkFzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UnVuQXNTcGVjaWZpZWRJZGVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDOUUwMkM4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDMiDQotCQkgICAgcXVpZCAgICAgICAJIjM5OTgyQTJGMDE4RSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5MTQwMjUxIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENDJDQTAyN0YiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiY29udGV4dFBhcmFtcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDQyQ0IwMTE4Ig0KLQkJICAgIGxhYmVsICAgICAgCSJjb250ZXh0UGFyYW1zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UGFyYW1WYWx1ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIyMTIwMkMxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0MkNCMDEyMiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ2Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ0M0FBMDAwQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJpbml0UGFyYW1WYWx1ZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0M0FBMDI0NSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXxUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzDQotfCAgICAgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlcg0KLQkJICAgIA0KLQkJICAgIGxhYmVsICAgICAgCSJpbml0UGFyYW1WYWx1ZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpQYXJhbVZhbHVlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjIxMjAyQzEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDQzQUEwMjRGIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpGaWx0ZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMTU1MDNDQyINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDgiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDQ2RTcwMzg3Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImluaXRQYXJhbXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ0NkU5MDAwNSINCi0JCSAgICBsYWJlbCAgICAgIAkiaW5pdFBhcmFtcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlBhcmFtVmFsdWUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMjEyMDJDMSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENDZFOTAwMTkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlcnZsZXQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3OTE0MDI1MSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTAiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDRCRkYwMUMwIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImpzcENvbmZpZyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDRDMDAwMjI1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJqc3BDb25maWciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6anNwOjpKU1BDb25maWciDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QTNBMDFDOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENEMwMDAyMjciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MiINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENTEwMTAyNjQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGlzcGxheU5hbWVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTEwMjAyNUIiDQotCQkgICAgbGFiZWwgICAgICAJImRpc3BsYXlOYW1lcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRpc3BsYXlOYW1lIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOTkyMjAwMEUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUxMDIwMjY1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZWN1cml0eUNvbnN0cmFpbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QjZBMDJBRSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTQiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDU2QTUwMjI0Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NkE2MDI1NyINCi0JCSAgICBsYWJlbCAgICAgIAkibWVzc2FnZURlc3RpbmF0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246Ok1lc3NhZ2VEZXN0aW5hdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIxMTAwMUNGIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NkE2MDI2MSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViQXBwIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzdGQjAzNTIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU2Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NzE0MDM3OCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJsb2NhbEVuY29kaW5nTWFwcGluZ3MiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NzE1MDEzNSINCi0JCSAgICBsYWJlbCAgICAgIAkibG9jYWxFbmNvZGluZ01hcHBpbmdzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpMb2NhbEVuY29kaW5nTWFwcGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDU2RjIwMTcwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTciDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NzE1MDEzRiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTZEQTAyM0UiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU4Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NzJDMDA4MyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1NzJDMDJEQyINCi0JCSAgICBsYWJlbCAgICAgIAkibG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1NkRBMDIzRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTcyQzAyREUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MCINCi0JICAgIHF1aWQgICAgICAgCSIzRTRENTE1MDAxQkQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTRENTE1MTAxQkUiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUxNTEwMURDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpVc2VyRGF0YUNvbnN0cmFpbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3Q0I4MDBCMCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjIiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDUxNEQwMzE3Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUxNEUwMTA2Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1MTRFMDEyNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6QXV0aENvbnN0cmFpbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QzgwMDFBMCINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjQiDQotCSAgICBxdWlkICAgICAgIAkiM0U0RDUxNEIwMDg5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDUxNEIwM0FBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNEQ1MTRCMDNDOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6V2ViUmVzb3VyY2VDb2xsZWN0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0I4NzAzQUIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY2Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFOTMwQjExMDMwQiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJIVFRQcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U5MzBCMTIwMERDIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgaHR0cE1ldGhvZCINCi0JCSAgICBsYWJlbCAgICAgIAkiSFRUUHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkhUVFBNZXRob2RUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTkzMEIwNTAwNjUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJyZXNDb2xsZWN0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTkzMEIxMjAwRTYiDQotCQkgICAgbGFiZWwgICAgICAJInJlc0NvbGxlY3Rpb24iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYlJlc291cmNlQ29sbGVjdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCODcwM0FCIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiV2ViIEFwcGxpY2F0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzA4Qzg4MDI5MiINCi0JICAgIHRpdGxlICAgICAgCSJXZWIgQXBwbGljYXRpb24iDQotCSAgICBkb2N1bWVudGF0aW9uIAkiQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBOb3RlVmlldyBAMQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3ODEsIDMxMTMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSg0NTUsIDI5ODcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJNjE3DQotCQkJbGFiZWwgICAgICAJDQotfHRoZSBzZXJ2bGV0IGNsYXNzIHJlZmVyZW5jZSBpcyByZXNvbHZlZCB2aWEgQmVhbnMuaW5zdGFudGlhdGUoKSwNCi18dGhpcyBpcyBwcm9iYWJseSBhIHJlZmVyZW5jZSB0byBhIEphdmFCZWFuIG9iamVjdA0KLQkJCSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICB3aWR0aCAgICAgIAk2NzcNCi0JCSAgICBoZWlnaHQgICAgIAkyNjQpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZXJ2bGV0VHlwZSIgQDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDI4MzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxMzIwLCAyNzUxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQwMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmxldFR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTIzMjAzMTEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMTMyMCwgMjgxMikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM5NykNCi0JCSAgICB3aWR0aCAgICAgIAk0MTgNCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkpTUFR5cGUiIEAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDAwLCAyODMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoMTg0MywgMjc1MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkpTUFR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTI2NDAyNzMiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoMTg0MywgMjgxMikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTMxMykNCi0JCSAgICB3aWR0aCAgICAgIAkzMzINCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkVycm9yQ29kZUVycm9yUGFnZSIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI0MCwgOTYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMzksIDg3OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVycm9yQ29kZUVycm9yUGFnZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4M0U2QzAyMDkiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMzksIDk0MCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM2OSkNCi0JCSAgICB3aWR0aCAgICAgIAk0MjANCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEyNSwgMTQzMSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJbG9jYXRpb24gICAJKDgzNCwgMTM2OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1NDYNCi0JCQlsYWJlbCAgICAgIAkNCi18REVQUkVDQVRFRDoNCi18Q29udGV4dFBhcmFtDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICB3aWR0aCAgICAgIAk2MDYNCi0JCSAgICBoZWlnaHQgICAgIAkxMzgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Sk5ESUVudlJlZnNHcm91cCIgQDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI5ODcsIDg0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYNCi0JCQlsb2NhdGlvbiAgIAkoMjc5MCwgNzY5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSk5ESUVudlJlZnNHcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1Mzk1MDM0OSINCi0JCSAgICB3aWR0aCAgICAgIAk0MTINCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBANw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjY5LCAxNTIyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoNTc2LCAxNDQzKQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxODYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSINCi0JCSAgICB3aWR0aCAgICAgIAkyMDQNCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkV4Y2VwdGlvblR5cGVFcnJvclBhZ2UiIEA4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDEyMTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOA0KLQkJCWxvY2F0aW9uICAgCSgyMDUsIDExNjUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDg2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFeGNlcHRpb25UeXBlRXJyb3JQYWdlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODgzRTExMDE1NCINCi0JCSAgICB3aWR0aCAgICAgIAk1MDQNCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMyIgQDkNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTg4LCAxMzU0KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ1RTcyMDIwNCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJleGNlcHRpb25UeXBlIiBAMTANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTMyLCA0MTApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQlsb2NhdGlvbiAgIAkoNDE3LCAxMzk3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitleGNlcHRpb25UeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU1NTU1Ng0KLQkJCQloZWlnaHQgICAgIAkxNzINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkwNDVFNzMwMzY0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOQ0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDU4OCwgMTM1NCkNCi0JCQkJKDU4OCwgMTQzMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1ODgsIDEzNTQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODgsIDE0MzEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyDQotCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJbG9jYXRpb24gICAJKDY0MiwgMTQyMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlcnJvclBhZ2UiIEAxMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMzIsIDQxMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NUU3NDAxQzEiDQotCQkJICAgIGNsaWVudCAgICAgCUA5DQotCQkJICAgIHN1cHBsaWVyICAgCUA4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTg4LCAxMzU0KQ0KLQkJCQkoNTg4LCAxMjc4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU4OCwgMTM1NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU4OCwgMTI3OCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkZvcm1Mb2dpbkNvbmZpZyIgQDE0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzOTM2LCAyNDQ4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJbG9jYXRpb24gICAJKDM3MDQsIDIzNDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDY0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJGb3JtTG9naW5Db25maWciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0QzOTAyOTYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJbG9jYXRpb24gICAJKDM3MDQsIDI0MDMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0NjMpDQotCQkgICAgd2lkdGggICAgICAJNDgyDQotCQkgICAgaGVpZ2h0ICAgICAJMjM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJUeXBlIiBAMTUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3NzYsIDI0ODApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCWxvY2F0aW9uICAgCSgxNjc0LCAyNDI5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIwNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBMUY3MDI5NCINCi0JCSAgICB3aWR0aCAgICAgIAkyMjINCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNg0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzc2LCAyNjM1KQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxNQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNzc2LCAyNjM1KQ0KLQkJCSgxNzc2LCAyNTQzKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBMjkwMDI1OCINCi0JCSAgICBjbGllbnQgICAgIAlAMw0KLQkJICAgIHN1cHBsaWVyICAgCUAxNQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxOTQ5LCAyNzM5KQ0KLQkJCSgxOTQ5LCAyNjM1KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTQ5LCAyNzM5KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTQ5LCAyNjM1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE2KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTI4QzAyQUQiDQotCQkgICAgY2xpZW50ICAgICAJQDINCi0JCSAgICBzdXBwbGllciAgIAlAMTUNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTUxOSwgMjczOSkNCi0JCQkoMTUxOSwgMjYzNSkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTUxOSwgMjczOSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUxOSwgMjYzNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxNikNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGVSZWYiIEAxOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQxLCAxNzgyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE5DQotCQkJbG9jYXRpb24gICAJKDQ0LCAxNjAzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlSb2xlUmVmIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzcxQkM3QTAwMjVDIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCWxvY2F0aW9uICAgCSg0NCwgMTcwOCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTM5MSkNCi0JCSAgICB3aWR0aCAgICAgIAk0MTINCi0JCSAgICBoZWlnaHQgICAgIAkzODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkxvY2FsRW5jb2RpbmdNYXBwaW5nIiBAMjANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMyNDgsIDI1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMA0KLQkJCWxvY2F0aW9uICAgCSgzMDIyLCAxNTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDUyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJMb2NhbEVuY29kaW5nTWFwcGluZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTZGMjAxNzAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDIwDQotCQkJbG9jYXRpb24gICAJKDMwMjIsIDIxMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTM1NikNCi0JCSAgICB3aWR0aCAgICAgIAk0NzANCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkNvbnRleHRQYXJhbSIgQDIxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgMTI5NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCWxvY2F0aW9uICAgCSg5NDMsIDEyNTUpDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI5MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ29udGV4dFBhcmFtIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc4QjYwMkE2Ig0KLQkJICAgIHdpZHRoICAgICAgCTMwOA0KLQkJICAgIGhlaWdodCAgICAgCTEwNw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RXJyb3JQYWdlIiBAMjINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMwNCwgNTkyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyDQotCQkJbG9jYXRpb24gICAJKDEzNiwgNTExKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRXJyb3JQYWdlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdBQ0YwM0UyIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCWxvY2F0aW9uICAgCSgxMzYsIDU3MikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTMzNSkNCi0JCSAgICB3aWR0aCAgICAgIAkzNTQNCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyMw0KLQkJICAgIGxvY2F0aW9uICAgCSgzMDQsIDgwMCkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMjINCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMzA0LCA4MDApDQotCQkJKDMwNCwgNjg1KSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5ODgzRTNBMDA1OCINCi0JCSAgICBjbGllbnQgICAgIAlAOA0KLQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg0NDcsIDExNTMpDQotCQkJKDQ0NywgODAwKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDcsIDExNTMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NywgODAwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDIzKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTg4M0U5NDAwQTgiDQotCQkgICAgY2xpZW50ICAgICAJQDQNCi0JCSAgICBzdXBwbGllciAgIAlAMjINCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjA5LCA4NjcpDQotCQkJKDIwOSwgODAwKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDksIDg2NykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5LCA4MDApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWxjb21lRmlsZUxpc3QiIEAyNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMzIwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI2DQotCQkJbG9jYXRpb24gICAJKDEwMCwgMjc5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM0NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2VsY29tZUZpbGVMaXN0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdBQUQwMUE4Ig0KLQkJICAgIHdpZHRoICAgICAgCTM2Mg0KLQkJICAgIGhlaWdodCAgICAgCTEwNw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6VGFnTGliUmVmIiBAMjcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyODAsIDE0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNw0KLQkJCWxvY2F0aW9uICAgCSgxMDU3LCAzOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlRhZ0xpYlJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QjMwMDJFNyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQlsb2NhdGlvbiAgIAkoMTA1NywgOTkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0NDQpDQotCQkgICAgd2lkdGggICAgICAJNDY0DQotCQkgICAgaGVpZ2h0ICAgICAJMjM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpTZWN1cml0eUNvbnN0cmFpbnQiIEAyOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3MTIsIDEyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOA0KLQkJCWxvY2F0aW9uICAgCSgxNTI4LCA4NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlY3VyaXR5Q29uc3RyYWludCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QjZBMDJBRSINCi0JCSAgICB3aWR0aCAgICAgIAkzODYNCi0JCSAgICBoZWlnaHQgICAgIAkxMDcNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkxvZ2luQ29uZmlnIiBAMjkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM4NDAsIDE3OTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjkNCi0JCQlsb2NhdGlvbiAgIAkoMzQ2OSwgMTY2MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk3NDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkxvZ2luQ29uZmlnIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdEMEYwMDZGIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCWxvY2F0aW9uICAgCSgzNDY5LCAxNzIyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJNzQxKQ0KLQkJICAgIHdpZHRoICAgICAgCTc2MA0KLQkJICAgIGhlaWdodCAgICAgCTI4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyIiBAMzANCi0JCSAgICBsb2NhdGlvbiAgIAkoMzkxOCwgMjEzMikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjQ4OTAwQkUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZm9ybUxvZ2luQ29uZmlnIiBAMzENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjkxLCAyNjMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzINCi0JCQkJUGFyZW50X1ZpZXcgCUAzMQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDEwMywgMjI2MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMyNw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZm9ybUxvZ2luQ29uZmlnIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY3MTQ5OA0KLQkJCQloZWlnaHQgICAgIAkxODUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTI0ODkwMzBEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzANCi0JCQkgICAgc3VwcGxpZXIgICAJQDE0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzkxOCwgMjEzMikNCi0JCQkJKDM5MTgsIDIzMjkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzkxOCwgMjEzMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM5MTgsIDIzMjkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzDQotCQkJCVBhcmVudF9WaWV3IAlAMzENCi0JCQkJbG9jYXRpb24gICAJKDM5NzIsIDIzMDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAibG9naW5Db25maWciIEAzNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMwDQotCQkJICAgIGxvY2F0aW9uICAgCSgyOTEsIDI2MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM0DQotCQkJCWxvY2F0aW9uICAgCSg0MDg5LCAyMDMzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjI5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitsb2dpbkNvbmZpZyINCi0JCQkJcGN0RGlzdCAgICAJMC41MDAxMzkNCi0JCQkJaGVpZ2h0ICAgICAJMTcxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyNDg5MDMwMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDMwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM5MTgsIDIxMzIpDQotCQkJCSgzOTE4LCAxOTM1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM5MTgsIDIxMzIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzOTE4LCAxOTM1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNg0KLQkJCQlQYXJlbnRfVmlldyAJQDM0DQotCQkJCWxvY2F0aW9uICAgCSgzOTkyLCAxOTcxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44MjA3NzcNCi0JCQkJaGVpZ2h0ICAgICAJNzQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpNaW1lTWFwcGluZyIgQDM3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyODQ4LCAxODg4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM3DQotCQkJbG9jYXRpb24gICAJKDI2NTYsIDE3ODIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNaW1lTWFwcGluZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QTc1MDBGRSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzcNCi0JCQlsb2NhdGlvbiAgIAkoMjY1NiwgMTg0MykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTM4MSkNCi0JCSAgICB3aWR0aCAgICAgIAk0MDINCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlc3Npb25Db25maWciIEAzOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjY0MCwgMjMwNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzOA0KLQkJCWxvY2F0aW9uICAgCSgyNDMxLCAyMjIzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQxOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2Vzc2lvbkNvbmZpZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QTUzMDFCRCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzgNCi0JCQlsb2NhdGlvbiAgIAkoMjQzMSwgMjI4NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQxNikNCi0JCSAgICB3aWR0aCAgICAgIAk0MzYNCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlcnZsZXRNYXBwaW5nIiBAMzkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5NjgsIDIxOTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzkNCi0JCQlsb2NhdGlvbiAgIAkoMTc4MiwgMjA4NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZsZXRNYXBwaW5nIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5QkQwMkI5Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzOQ0KLQkJCWxvY2F0aW9uICAgCSgxNzgyLCAyMTQ3KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMzY5KQ0KLQkJICAgIHdpZHRoICAgICAgCTM5MA0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VydmxldCIgQDQwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5OTIsIDI0MTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDANCi0JCQlsb2NhdGlvbiAgIAkoNjY2LCAyMzEwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY1Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmxldCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3OTE0MDI1MSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDANCi0JCQlsb2NhdGlvbiAgIAkoNjY2LCAyMzcxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNjUwKQ0KLQkJICAgIHdpZHRoICAgICAgCTY3MA0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBANDENCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ5NiwgMjQ3NSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjJBQzAxNEEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAid2ViVHlwZSIgQDQyDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDENCi0JCQkgICAgbG9jYXRpb24gICAJKDc2MCwgMTcxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzDQotCQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQkJbG9jYXRpb24gICAJKDE1MjMsIDI1MDkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYlR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuMTY2NjY3DQotCQkJCWhlaWdodCAgICAgCTM0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMkFEMDAxNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQxDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0OTYsIDI0NzUpDQotCQkJCSgxNjY1LCAyNDc1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0OTYsIDI0NzUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY1LCAyNDc1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NA0KLQkJCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJCWxvY2F0aW9uICAgCSgxNjQ3LCAyNTI5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZsZXQiIEA0NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQxDQotCQkJICAgIGxvY2F0aW9uICAgCSg3NjAsIDE3MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMkFEMDAwMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQxDQotCQkJICAgIHN1cHBsaWVyICAgCUA0MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0OTYsIDI0NzUpDQotCQkJCSgxMzI3LCAyNDc1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0OTYsIDI0NzUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI3LCAyNDc1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMzY4LCAyNTI2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NjM2MzYNCi0JCQkJaGVpZ2h0ICAgICAJNTENCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQiIEA0Nw0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjA5LCAyMzUyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ2MEFBMDE4OSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2bGV0IiBANDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM5LCAxNDQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkNCi0JCQkJUGFyZW50X1ZpZXcgCUA0OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NywgMjMxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI0NQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VydmxldCINCi0JCQkJcGN0RGlzdCAgICAJMC41NDM0NzgNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkwNDYwQUIwMjM0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTYwOSwgMjM1MikNCi0JCQkJKDEzMjcsIDIzNTIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYwOSwgMjM1MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjcsIDIzNTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwDQotCQkJCVBhcmVudF9WaWV3IAlANDgNCi0JCQkJbG9jYXRpb24gICAJKDEzNTYsIDI0MDYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUiIEA1MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzksIDE0NCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NjBBQjAyQjYiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjA5LCAyMzUyKQ0KLQkJCQkoMTg0OCwgMjM1MikNCi0JCQkJKDE4NDgsIDIzMTApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYwOSwgMjM1MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4NDgsIDIzMTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEA1Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgzNjgsIDIyOTMpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTIyQzAwMTk5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlY3VyaXR5Um9sZVJlZnMiIEA1Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDUyDQotCQkJICAgIGxvY2F0aW9uICAgCSgtNjg4LCAtMTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQNCi0JCQkJUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNTUxLCAyMDQ2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTQwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZWN1cml0eVJvbGVSZWZzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3MDQ5Mg0KLQkJCQloZWlnaHQgICAgIAkxODMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIyQzEwMjlGIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzY4LCAyMjkzKQ0KLQkJCQkoMzY4LCAxOTczKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM2OCwgMjI5MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2OCwgMTk3MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUNCi0JCQkJUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNDM5LCAyMTcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC4zNzcwNDkNCi0JCQkJaGVpZ2h0ICAgICAJNzENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5IiBANTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY4OCwgLTExKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3DQotCQkJCVBhcmVudF9WaWV3IAlANTYNCi0JCQkJbG9jYXRpb24gICAJKDQ2NywgMjI1NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjQ1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC40NTUyODUNCi0JCQkJaGVpZ2h0ICAgICAJOTcNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIyQzEwMjhCIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzY4LCAyMjkzKQ0KLQkJCQkoMzY4LCAyMzUzKQ0KLQkJCQkoNjU3LCAyMzUzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM2OCwgMjI5MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY1NywgMjM1MykpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpTZWN1cml0eVJvbGUiIEA1OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzOCwgMTc3MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1OA0KLQkJCWxvY2F0aW9uICAgCSgxMDQxLCAxNjQxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VjdXJpdHlSb2xlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDMxRkUwMTJEIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA1OA0KLQkJCWxvY2F0aW9uICAgCSgxMDQxLCAxNzQ2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMzkxKQ0KLQkJICAgIHdpZHRoICAgICAgCTQxMg0KLQkJICAgIGhlaWdodCAgICAgCTI4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiIgQDU5DQotCQkgICAgbG9jYXRpb24gICAJKDcxNiwgMTgzNSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0NjMyQTAwNUMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiIiBANjANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM3MiwgMTM5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxDQotCQkJCVBhcmVudF9WaWV3IAlANjANCi0JCQkJbG9jYXRpb24gICAJKDU0MSwgMTc4OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTA1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC42NzExNDENCi0JCQkJaGVpZ2h0ICAgICAJNjMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkwNDYzMkIwMUJDIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzE2LCAxODM1KQ0KLQkJCQkoNzE2LCAxODUxKQ0KLQkJCQkoNDQ3LCAxODUxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDcxNiwgMTgzNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NywgMTg1MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjINCi0JCQkJUGFyZW50X1ZpZXcgCUA2MA0KLQkJCQlsb2NhdGlvbiAgIAkoNTg4LCAxODUxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJNQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIm5hbWUgOiBTdHJpbmciDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTEyDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvbGlua2VkU2VjdXJpdHlSb2xlIiBANjMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM3MiwgMTM5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY0DQotCQkJCVBhcmVudF9WaWV3IAlANjMNCi0JCQkJbG9jYXRpb24gICAJKDg2NiwgMTcyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwMg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrL2xpbmtlZFNlY3VyaXR5Um9sZSINCi0JCQkJcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJOTINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzkwNDYzMkIwMTZDIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDU4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzE2LCAxODM1KQ0KLQkJCQkoNzE2LCAxODE5KQ0KLQkJCQkoMTAzMiwgMTgxOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTYsIDE4MzUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDMyLCAxODE5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDYzDQotCQkJCWxvY2F0aW9uICAgCSg5OTksIDE4NzMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpQYXJhbVZhbHVlIiBANjYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDc3OCwgOTY5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY2DQotCQkJbG9jYXRpb24gICAJKDU4MSwgODE1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUGFyYW1WYWx1ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMjEyMDJDMSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANjYNCi0JCQlsb2NhdGlvbiAgIAkoNTgxLCA5MjApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAkzOTEpDQotCQkgICAgd2lkdGggICAgICAJNDEyDQotCQkgICAgaGVpZ2h0ICAgICAJMzMyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmpzcDo6SlNQQ29uZmlnIiBANjcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDY4OCwgMTkyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY3DQotCQkJbG9jYXRpb24gICAJKDU1MSwgMTE0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSlNQQ29uZmlnIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDRBM0EwMUM4Ig0KLQkJICAgIHdpZHRoICAgICAgCTI5Mg0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246Ok1lc3NhZ2VEZXN0aW5hdGlvbiIgQDY4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMDQwLCAxMTY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY4DQotCQkJbG9jYXRpb24gICAJKDI4MzcsIDEwNjQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDA2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlRGVzdGluYXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1Ng0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjExMDAxQ0YiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDY4DQotCQkJbG9jYXRpb24gICAJKDI4MzcsIDExNjkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyOTQpDQotCQkgICAgd2lkdGggICAgICAJNDI0DQotCQkgICAgaGVpZ2h0ICAgICAJMjMyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QiIEA2OQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAzMiwgMjcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY5DQotCQkJbG9jYXRpb24gICAJKDE3NjksIDIyMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjcxMTkzNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTZEQTAyM0UiDQotCQkgICAgd2lkdGggICAgICAJNTQ0DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTYiIEA3MA0KLQkJICAgIGxvY2F0aW9uICAgCSgyNjU4LCAyNjMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDU3MTQwMzc4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImxvY2FsRW5jb2RpbmdNYXBwaW5ncyIgQDcxDQotCQkJICAgIFBhcmVudF9WaWV3IAlANzANCi0JCQkgICAgbG9jYXRpb24gICAJKDYwNCwgMTMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzINCi0JCQkJUGFyZW50X1ZpZXcgCUA3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcwNCwgMjA4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitsb2NhbEVuY29kaW5nTWFwcGluZ3MiDQotCQkJCXBjdERpc3QgICAgCTAuMTMwMjUyDQotCQkJCWhlaWdodCAgICAgCTU1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1NzE1MDEzNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDcwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI2NTgsIDI2MykNCi0JCQkJKDMwMTIsIDI1OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzMNCi0JCQkJUGFyZW50X1ZpZXcgCUA3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjkyNiwgMzEzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43NTU2MzMNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU3IiBANzQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjA0LCAxMykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTcxNTAxM0YiDQotCQkJICAgIGNsaWVudCAgICAgCUA3MA0KLQkJCSAgICBzdXBwbGllciAgIAlANjkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNjU4LCAyNjMpDQotCQkJCSgyMzA0LCAyNjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpXZWJBcHAiIEA3NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgMTE2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3NQ0KLQkJCWxvY2F0aW9uICAgCSgxNjc5LCAxMDg0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViQXBwIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzUNCi0JCQlsb2NhdGlvbiAgIAkoMTY3OSwgMTAzNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxjb21wb25lbnQ+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3N0ZCMDM1MiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANzUNCi0JCQlsb2NhdGlvbiAgIAkoMTY3OSwgMTE0NSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTQ0NykNCi0JCSAgICB3aWR0aCAgICAgIAk0NjgNCi0JCSAgICBoZWlnaHQgICAgIAkyOTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBANzYNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ1NSwgMTIzNykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUNFNjAyMTMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAid2ViQXBwIiBANzcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNSwgLTE1NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OA0KLQkJCQlQYXJlbnRfVmlldyAJQDc3DQotCQkJCWxvY2F0aW9uICAgCSgxNjIyLCAxMTY5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjY3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3ZWJBcHAiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExQ0U4MDAwRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDc2DQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0NTUsIDEyMzcpDQotCQkJCSgxNjY5LCAxMjA0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDc3DQotCQkJCWxvY2F0aW9uICAgCSgxNjU1LCAxMjYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbnRleHRzIiBAODANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNSwgLTE1NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDgwDQotCQkJCWxvY2F0aW9uICAgCSgxMzYzLCAxMjA1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjg5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb250ZXh0cyINCi0JCQkJcGN0RGlzdCAgICAJMC4zOTY4ODYNCi0JCQkJaGVpZ2h0ICAgICAJNDgNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFDRTgwMDBFIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQ1NSwgMTIzNykNCi0JCQkJKDEyNDIsIDEyNzEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyDQotCQkJCVBhcmVudF9WaWV3IAlAODANCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDEzMDYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcwNzc1MQ0KLQkJCQloZWlnaHQgICAgIAk0Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxIiBAODMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3NSwgODY5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzExQ0YzMDFBMyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJBcHAiIEA4NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgzDQotCQkJICAgIGxvY2F0aW9uICAgCSg3MDcsIC03NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDg0DQotCQkJCWxvY2F0aW9uICAgCSgxNTYzLCAxMDAxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjY3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3ZWJBcHAiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExQ0Y0MDI2RCINCi0JCQkgICAgY2xpZW50ICAgICAJQDgzDQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwNzUsIDg2OSkNCi0JCQkJKDE2NjksIDEwODMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2DQotCQkJCVBhcmVudF9WaWV3IAlAODQNCi0JCQkJbG9jYXRpb24gICAJKDE1OTEsIDExMTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZXJyb3JQYWdlcyIgQDg3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODMNCi0JCQkgICAgbG9jYXRpb24gICAJKDcwNywgLTc1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4DQotCQkJCVBhcmVudF9WaWV3IAlAODcNCi0JCQkJbG9jYXRpb24gICAJKDYxNSwgNjU5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzY0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlcnJvclBhZ2VzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUNGNDAyNzciDQotCQkJICAgIGNsaWVudCAgICAgCUA4Mw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDc1LCA4NjkpDQotCQkJCSg0ODEsIDY1NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNTI1LCA3MjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAOTANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAyMSwgNzA5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzExQ0Y3MDM0RSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJBcHAiIEA5MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkwDQotCQkJICAgIGxvY2F0aW9uICAgCSg2NjksIDE0OSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDkxDQotCQkJCWxvY2F0aW9uICAgCSgxNTU4LCA5NDIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYkFwcCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFDRjgwM0IzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDc1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTAyMSwgNzA5KQ0KLQkJCQkoMTY2OSwgMTA0NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMNCi0JCQkJUGFyZW50X1ZpZXcgCUA5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU3OSwgMTA1OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmaWxlTGlzdCIgQDk0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTANCi0JCQkgICAgbG9jYXRpb24gICAJKDY2OSwgMTQ5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk1DQotCQkJCVBhcmVudF9WaWV3IAlAOTQNCi0JCQkJbG9jYXRpb24gICAJKDUyMywgNDA0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjQxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitmaWxlTGlzdCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFDRjgwM0I0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDI2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTAyMSwgNzA5KQ0KLQkJCQkoMzc0LCAzNzMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk2DQotCQkJCVBhcmVudF9WaWV3IAlAOTQNCi0JCQkJbG9jYXRpb24gICAJKDM4NiwgNDIzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45NTQ5OTMNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDk3DQotCQkgICAgbG9jYXRpb24gICAJKDE1ODIsIDY0MSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUNGQjAyODEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAid2ViQXBwIiBAOTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4NiwgNDAxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5DQotCQkJCVBhcmVudF9WaWV3IAlAOTgNCi0JCQkJbG9jYXRpb24gICAJKDE4MDMsIDkyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2Nw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrd2ViQXBwIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUNGRDAwQTMiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Nw0KLQkJCSAgICBzdXBwbGllciAgIAlANzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTgyLCA2NDEpDQotCQkJCSgxODEzLCAxMDIxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDANCi0JCQkJUGFyZW50X1ZpZXcgCUA5OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTc0NSwgMTAxMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ0YWdMaWJzIiBAMTAxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTcNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwODYsIDQwMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJbG9jYXRpb24gICAJKDE0MzQsIDMxOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI1OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrdGFnTGlicyINCi0JCQkJcGN0RGlzdCAgICAJMC43OTk2NDgNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFDRkQwMEE0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU4MiwgNjQxKQ0KLQkJCQkoMTM1MSwgMjYyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJbG9jYXRpb24gICAJKDEzMjksIDMyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTc0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAxMDQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc5OSwgNjAxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDAwMDEzNCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJBcHAiIEAxMDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkgICAgbG9jYXRpb24gICAJKDY0NywgMzI5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNg0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyMSwgOTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjY3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3ZWJBcHAiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDAxMDE4RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNA0KLQkJCSAgICBzdXBwbGllciAgIAlANzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNzk5LCA2MDEpDQotCQkJCSgxODc3LCAxMDIxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQkJbG9jYXRpb24gICAJKDE5MjIsIDk2OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb25zdHJhaW50cyIgQDEwOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCAzMjkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5DQotCQkJCVBhcmVudF9WaWV3IAlAMTA4DQotCQkJCWxvY2F0aW9uICAgCSgxODY5LCAzNDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNjQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbnN0cmFpbnRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU1ODA3NA0KLQkJCQloZWlnaHQgICAgIAkxMTUNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMDEwMTk5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA0DQotCQkJICAgIHN1cHBsaWVyICAgCUAyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE3OTksIDYwMSkNCi0JCQkJKDE3MjEsIDE4MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwDQotCQkJCVBhcmVudF9WaWV3IAlAMTA4DQotCQkJCWxvY2F0aW9uICAgCSgxODM3LCA0MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQ0OTM1Ng0KLQkJCQloZWlnaHQgICAgIAk3NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExDQotCQkJCVBhcmVudF9WaWV3IAlAMTA4DQotCQkJCWxvY2F0aW9uICAgCSgxODU0LCAyOTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjY5NzMxNw0KLQkJCQloZWlnaHQgICAgIAkxMTENCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDExMg0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzk4LCAxNDU2KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDExMDE4OCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJBcHAiIEAxMTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTINCi0JCQkgICAgbG9jYXRpb24gICAJKDMwLCAtNDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0DQotCQkJCVBhcmVudF9WaWV3IAlAMTEzDQotCQkJCWxvY2F0aW9uICAgCSgyMjgzLCAxMjQ3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjY3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3ZWJBcHAiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDEyMDA2NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDExMg0KLQkJCSAgICBzdXBwbGllciAgIAlANzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNzk4LCAxNDU2KQ0KLQkJCQkoMjEzOCwgMTI0MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1DQotCQkJCVBhcmVudF9WaWV3IAlAMTEzDQotCQkJCWxvY2F0aW9uICAgCSgyMTg4LCAxMzE1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImxvZ2luQ29uZmlnIiBAMTE2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyDQotCQkJICAgIGxvY2F0aW9uICAgCSgzMCwgLTQ4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNw0KLQkJCQlQYXJlbnRfVmlldyAJQDExNg0KLQkJCQlsb2NhdGlvbiAgIAkoMzMzOSwgMTU4NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM2OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbG9naW5Db25maWciDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDEyMDA3MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDExMg0KLQkJCSAgICBzdXBwbGllciAgIAlAMjkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNzk4LCAxNDU2KQ0KLQkJCQkoMzQ1OSwgMTY2OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4DQotCQkJCVBhcmVudF9WaWV3IAlAMTE2DQotCQkJCWxvY2F0aW9uICAgCSgzMzc2LCAxNjk4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDExOQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMzk0LCAxNTQxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDE1MDFDMCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJBcHAiIEAxMjANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkNCi0JCQkgICAgbG9jYXRpb24gICAJKC0yNjIsIC00MTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxDQotCQkJCVBhcmVudF9WaWV3IAlAMTIwDQotCQkJCWxvY2F0aW9uICAgCSgyMTgwLCAxMzI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjY3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3ZWJBcHAiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDE3MDIzQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDExOQ0KLQkJCSAgICBzdXBwbGllciAgIAlANzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMzk0LCAxNTQxKQ0KLQkJCQkoMjA5NSwgMTMxNCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyDQotCQkJCVBhcmVudF9WaWV3IAlAMTIwDQotCQkJCWxvY2F0aW9uICAgCSgyMDk0LCAxMzgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1pbWVNYXBwaW5ncyIgQDEyMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI2MiwgLTQxMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjMNCi0JCQkJbG9jYXRpb24gICAJKDI4NjksIDE3MjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1MDINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21pbWVNYXBwaW5ncyINCi0JCQkJcGN0RGlzdCAgICAJMS4zMDgzMTENCi0JCQkJaGVpZ2h0ICAgICAJMTQxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDE3MDI0NSINCi0JCQkgICAgY2xpZW50ICAgICAJQDExOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMzk0LCAxNTQxKQ0KLQkJCQkoMjY5MywgMTc2OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1DQotCQkJCVBhcmVudF9WaWV3IAlAMTIzDQotCQkJCWxvY2F0aW9uICAgCSgyNjE1LCAxNzc0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44Mzk4MDgNCi0JCQkJaGVpZ2h0ICAgICAJNTENCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNyIgQDEyNg0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjg4LCAxNzYyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDFCMDMyNyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJBcHAiIEAxMjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYNCi0JCQkgICAgbG9jYXRpb24gICAJKDE5MiwgLTYyMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjcNCi0JCQkJbG9jYXRpb24gICAJKDIwMjMsIDE0MjcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYkFwcCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMUMwMUYyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI2DQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIyODgsIDE3NjIpDQotCQkJCSgxOTk4LCAxMzE0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjcNCi0JCQkJbG9jYXRpb24gICAJKDIwNzIsIDEzMzApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2Vzc2lvbkNvbmZpZyIgQDEzMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTkyLCAtNjIyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMjM2MSwgMjE0MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ5Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2Vzc2lvbkNvbmZpZyINCi0JCQkJcGN0RGlzdCAgICAJMC42Njg4NjINCi0JCQkJaGVpZ2h0ICAgICAJMTQ2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDFDMDFGMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyNg0KLQkJCSAgICBzdXBwbGllciAgIAlAMzgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjg4LCAxNzYyKQ0KLQkJCQkoMjU3OSwgMjIxMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyDQotCQkJCVBhcmVudF9WaWV3IAlAMTMwDQotCQkJCWxvY2F0aW9uICAgCSgyNDM3LCAyMDg5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42NjU0NzcNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDEzMw0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTM2LCAxNjkzKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDFGMDJBQiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJBcHAiIEAxMzQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ5NiwgLTcyMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkJbG9jYXRpb24gICAJKDE4NzcsIDEzOTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMDMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYkFwcCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMjAwMjk4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMzDQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5MzYsIDE2OTMpDQotCQkJCSgxOTEzLCAxMzE0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkJbG9jYXRpb24gICAJKDE5NjksIDEzNTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmxldE1hcHBpbmdzIiBAMTM3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzDQotCQkJICAgIGxvY2F0aW9uICAgCSg0OTYsIC03MjMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4DQotCQkJCVBhcmVudF9WaWV3IAlAMTM3DQotCQkJCWxvY2F0aW9uICAgCSgxNzg3LCAyMDMxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTQzDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2bGV0TWFwcGluZ3MiDQotCQkJCXBjdERpc3QgICAgCTAuODU5NzU2DQotCQkJCWhlaWdodCAgICAgCTE3MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUQyMDAyQTIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDM5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTkzNiwgMTY5MykNCi0JCQkJKDE5NjAsIDIwNzMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEzNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTkxNiwgMTk3NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTc0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzQ1NzE1DQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEAxNDANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQzNywgMTgwNSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUQyMzAxMjAiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAid2ViQXBwIiBAMTQxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MzcsIC02NDMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyDQotCQkJCVBhcmVudF9WaWV3IAlAMTQxDQotCQkJCWxvY2F0aW9uICAgCSgxNjkxLCAxMzg5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjY3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3ZWJBcHAiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDI0MDJEQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE0MA0KLQkJCSAgICBzdXBwbGllciAgIAlANzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNDM3LCAxODA1KQ0KLQkJCQkoMTc5NywgMTMxNCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzDQotCQkJCVBhcmVudF9WaWV3IAlAMTQxDQotCQkJCWxvY2F0aW9uICAgCSgxODA1LCAxMzk1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZsZXRzIiBAMTQ0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MzcsIC02NDMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1DQotCQkJCVBhcmVudF9WaWV3IAlAMTQ0DQotCQkJCWxvY2F0aW9uICAgCSgxMjMzLCAyMjA3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjgxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2bGV0cyINCi0JCQkJcGN0RGlzdCAgICAJMC43MzAzNzkNCi0JCQkJaGVpZ2h0ICAgICAJNzMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTFEMjQwMkU0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTQwDQotCQkJICAgIHN1cHBsaWVyICAgCUA0MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MzcsIDE4MDUpDQotCQkJCSgxMDc3LCAyMjk3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDQNCi0JCQkJbG9jYXRpb24gICAJKDExOTUsIDIyNTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgzMzM5MA0KLQkJCQloZWlnaHQgICAgIAk3MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMCIgQDE0Nw0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTY2LCAxNDcxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDI3MDFEQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMSIgQDE0OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5OCwgLTQxNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDgNCi0JCQkJbG9jYXRpb24gICAJKDE2NzcsIDEzMTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2Nw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzExRDI4MDJDMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE0Nw0KLQkJCSAgICBzdXBwbGllciAgIAlANzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTY2LCAxNDcxKQ0KLQkJCQkoMTc0MCwgMTMxNCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwDQotCQkJCVBhcmVudF9WaWV3IAlAMTQ4DQotCQkJCWxvY2F0aW9uICAgCSgxNzU4LCAxMzcwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlY3VyaXR5Um9sZXMiIEAxNTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcNCi0JCQkgICAgbG9jYXRpb24gICAJKDExOTgsIC00MTcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUyDQotCQkJCVBhcmVudF9WaWV3IAlAMTUxDQotCQkJCWxvY2F0aW9uICAgCSgxNDAxLCAxNTY2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDU3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZWN1cml0eVJvbGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMUQyODAyQ0MiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNDcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDU4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU2NiwgMTQ3MSkNCi0JCQkJKDEzOTIsIDE2MjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDE1MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0NiwgMTY1MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTc0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ0IiBAMTU0DQotCQkgICAgbG9jYXRpb24gICAJKDEzMjYsIDEwNjUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDJDQTAyN0YiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29udGV4dFBhcmFtcyIgQDE1NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU3NywgLTEwMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTUNCi0JCQkJbG9jYXRpb24gICAJKDExODYsIDk4MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMxNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29udGV4dFBhcmFtcyINCi0JCQkJcGN0RGlzdCAgICAJMC40Mzc0MzANCi0JCQkJaGVpZ2h0ICAgICAJNTkNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDQyQ0IwMTE4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTU0DQotCQkJICAgIHN1cHBsaWVyICAgCUA2Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMjYsIDEwNjUpDQotCQkJCSg5ODQsIDEwMDQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDE1NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAxMSwgMTA2MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NSIgQDE1OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU3NywgLTEwMikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDJDQjAxMjIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDc1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMyNiwgMTA2NSkNCi0JCQkJKDE2NjksIDExMjYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTAiIEAxNTkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2MSwgNjUxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0QkZGMDFDMCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqc3BDb25maWciIEAxNjANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTkNCi0JCQkgICAgbG9jYXRpb24gICAJKC02NDIsIC01MTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYxDQotCQkJCVBhcmVudF9WaWV3IAlAMTYwDQotCQkJCWxvY2F0aW9uICAgCSg4MjcsIDM4MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIranNwQ29uZmlnIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg2MTUxNg0KLQkJCQloZWlnaHQgICAgIAk2Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENEMwMDAyMjUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNTkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDY3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTI2MSwgNjUxKQ0KLQkJCQkoODAwLCAyODIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDE2MA0KLQkJCQlsb2NhdGlvbiAgIAkoNzYwLCAzMjMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkxLjAxMjQ0Nw0KLQkJCQloZWlnaHQgICAgIAk1Nw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTEiIEAxNjMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTkNCi0JCQkgICAgbG9jYXRpb24gICAJKC02NDIsIC01MTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDRDMDAwMjI3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTU5DQotCQkJICAgIHN1cHBsaWVyICAgCUA3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyNjEsIDY1MSkNCi0JCQkJKDE3MjIsIDEwMjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNjQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDU1Q0EwM0UyIg0KLQkJICAgIGNsaWVudCAgICAgCUA3NQ0KLQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDIxMzgsIDEwOTgpDQotCQkJKDI3ODAsIDkwOCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NCIgQDE2NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDgyLCAxMTY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1NkE1MDIyNCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXNzYWdlRGVzdGluYXRpb25zIiBAMTY2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTY1DQotCQkJICAgIGxvY2F0aW9uICAgCSg1NzksIDEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY3DQotCQkJCVBhcmVudF9WaWV3IAlAMTY2DQotCQkJCWxvY2F0aW9uICAgCSgyNTYyLCAxMTIyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDI0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittZXNzYWdlRGVzdGluYXRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjIzMTg1OQ0KLQkJCQloZWlnaHQgICAgIAk0Nw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTZBNjAyNTciDQotCQkJICAgIGNsaWVudCAgICAgCUAxNjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDY4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjQ4MiwgMTE2OCkNCi0JCQkJKDI4MjcsIDExNjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2OA0KLQkJCQlQYXJlbnRfVmlldyAJQDE2Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjc2OCwgMTIxOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODI3ODU2DQotCQkJCWhlaWdodCAgICAgCTUxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NSIgQDE2OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTc5LCAxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1NkE2MDI2MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE2NQ0KLQkJCSAgICBzdXBwbGllciAgIAlANzUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNDgyLCAxMTY4KQ0KLQkJCQkoMjEzOCwgMTE2OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1OCIgQDE3MA0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTc0LCA2NzgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDU3MkMwMDgzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIgQDE3MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzEsIC00ODkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcyDQotCQkJCVBhcmVudF9WaWV3IAlAMTcxDQotCQkJCWxvY2F0aW9uICAgCSgyMzAwLCAzNzApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0OTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCINCi0JCQkJcGN0RGlzdCAgICAJMS4wMTUzNzQNCi0JCQkJaGVpZ2h0ICAgICAJMjc5DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1NzJDMDJEQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE3MA0KLQkJCSAgICBzdXBwbGllciAgIAlANjkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxOTc0LCA2NzgpDQotCQkJCSgyMDIzLCAzMzUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDE3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTk1MywgMzc1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44NjEwNDUNCi0JCQkJaGVpZ2h0ICAgICAJNjUNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU5IiBAMTc0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwDQotCQkJICAgIGxvY2F0aW9uICAgCSg3MSwgLTQ4OSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTcyQzAyREUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNzANCi0JCQkgICAgc3VwcGxpZXIgICAJQDc1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTk3NCwgNjc4KQ0KLQkJCQkoMTkyNSwgMTAyMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiU2VjdXJpdHkgQ29uc3RyYWludCINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwOERDQjAyMEEiDQotCSAgICB0aXRsZSAgICAgIAkiU2VjdXJpdHkgQ29uc3RyYWludCINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6SFRUUE1ldGhvZFR5cGVFbnVtIiBAMTc1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMDQsIDE4NDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTc1DQotCQkJbG9jYXRpb24gICAJKDc0LCAxNjQzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ2MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSFRUUE1ldGhvZFR5cGVFbnVtIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTc1DQotCQkJbG9jYXRpb24gICAJKDc0LCAxNTkzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEwOTQ5NTU5DQotCQkgICAgZmlsbF9jb2xvciAJMTU3NzgwNDINCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEEyRTIwMEM2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNzUNCi0JCQlsb2NhdGlvbiAgIAkoNzQsIDE3MDQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTgNCi0JCQltYXhfd2lkdGggIAkyMjgpDQotCQkgICAgd2lkdGggICAgICAJNDc4DQotCQkgICAgaGVpZ2h0ICAgICAJNTE4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAxNzYNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjM0LCAxMTg3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE3Ng0KLQkJCWxvY2F0aW9uICAgCSg1NiwgMTAwOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTcNCi0JCQltYXhfd2lkdGggIAkzMjENCi0JCQlsYWJlbCAgICAgIAkNCi18QHZlcnNpb24gSjJFRTEuNA0KLXx1cmxQYXR0ZXJuDQotfGh0dHBNZXRob2QNCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHdpZHRoICAgICAgCTM4MQ0KLQkJICAgIGhlaWdodCAgICAgCTM2OSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUiIEAxNzcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3NTIsIDY4OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNzcNCi0JCQlsb2NhdGlvbiAgIAkoMjUxNCwgNTg1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVHJhbnNwb3J0R3VhcmFudGVlVHlwZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE3Nw0KLQkJCWxvY2F0aW9uICAgCSgyNTE0LCA1MzUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDQ2MUE5MDE4RiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTc3DQotCQkJbG9jYXRpb24gICAJKDI1MTQsIDY0NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTMzOCkNCi0JCSAgICB3aWR0aCAgICAgIAk0OTQNCi0JCSAgICBoZWlnaHQgICAgIAkzMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEaXNwbGF5TmFtZSIgQDE3OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjUwMywgMTc1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE3OA0KLQkJCWxvY2F0aW9uICAgCSgyMjg3LCA0NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRpc3BsYXlOYW1lIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5MjIwMDBFIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNzgNCi0JCQlsb2NhdGlvbiAgIAkoMjI4NywgMTYxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNDY2KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ1MA0KLQkJICAgIGhlaWdodCAgICAgCTI4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6VXNlckRhdGFDb25zdHJhaW50IiBAMTc5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjA4LCAxMjQ4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE3OQ0KLQkJCWxvY2F0aW9uICAgCSgxNzcyLCAxMTQ3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTg3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVXNlckRhdGFDb25zdHJhaW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdDQjgwMEIwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNzkNCi0JCQlsb2NhdGlvbiAgIAkoMTc3MiwgMTIwOCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTg3OCkNCi0JCSAgICB3aWR0aCAgICAgIAk4OTANCi0JCSAgICBoZWlnaHQgICAgIAkyMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkF1dGhDb25zdHJhaW50IiBAMTgwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg4LCA4MzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTgwDQotCQkJbG9jYXRpb24gICAJKDEyODAsIDczMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkF1dGhDb25zdHJhaW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdDODAwMUEwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxODANCi0JCQlsb2NhdGlvbiAgIAkoMTI4MCwgNzkyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNDU2KQ0KLQkJICAgIHdpZHRoICAgICAgCTQzNA0KLQkJICAgIGhlaWdodCAgICAgCTIyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6U2VjdXJpdHlDb25zdHJhaW50IiBAMTgxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAxMjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTgxDQotCQkJbG9jYXRpb24gICAJKDg5MCwgNTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzk2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZWN1cml0eUNvbnN0cmFpbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0I2QTAyQUUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE4MQ0KLQkJCWxvY2F0aW9uICAgCSg4OTAsIDExMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQyOCkNCi0JCSAgICB3aWR0aCAgICAgIAk0MTQNCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MiIgQDE4Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCA4OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTEwMTAyNjQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGlzcGxheU5hbWVzIiBAMTgzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTgyDQotCQkJICAgIGxvY2F0aW9uICAgCSg2OTgsIC00MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxODMNCi0JCQkJbG9jYXRpb24gICAJKDIxMTgsIDQ1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjg2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkaXNwbGF5TmFtZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNjc1NTEwDQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1MTAyMDI1QiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4Mg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTc4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTc4NiwgODgpDQotCQkJCSgyMjc4LCA4OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzg2LCA4OCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyNzgsIDg4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxODMNCi0JCQkJbG9jYXRpb24gICAJKDIyMjgsIDE0MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MyIgQDE4Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE4Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjk4LCAtNDApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDUxMDIwMjY1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTgyDQotCQkJICAgIHN1cHBsaWVyICAgCUAxODENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNzg2LCA4OCkNCi0JCQkJKDEyOTUsIDg4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3ODYsIDg4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NSwgODgpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQiIEAxODcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA5NywgMjM0KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMUY3MDIwOCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZWNDb25zdHJhaW50IiBAMTg4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTg3DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNTcsIC01ODIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg5DQotCQkJCVBhcmVudF9WaWV3IAlAMTg4DQotCQkJCWxvY2F0aW9uICAgCSgxNTk5LCAyMDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlY0NvbnN0cmFpbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNjYyMTkyDQotCQkJCWhlaWdodCAgICAgCTczDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMUY4MDFFQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTgxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjA5NywgMjM0KQ0KLQkJCQkoMjA5NywgMTM1KQ0KLQkJCQkoMTI5NSwgMTM1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwOTcsIDIzNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTUsIDEzNSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkwDQotCQkJCVBhcmVudF9WaWV3IAlAMTg4DQotCQkJCWxvY2F0aW9uICAgCSgxNDc5LCAxMjEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5NjQyMQ0KLQkJCQloZWlnaHQgICAgIAkxNQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAidXNlckRhdGFDb25zdHJhaW50IiBAMTkxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTg3DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNTcsIC01ODIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkyDQotCQkJCVBhcmVudF9WaWV3IAlAMTkxDQotCQkJCWxvY2F0aW9uICAgCSgyMjk2LCA5NTkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3VzZXJEYXRhQ29uc3RyYWludCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDUzNjkNCi0JCQkJaGVpZ2h0ICAgICAJMTk5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMUY4MDFFRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTc5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjA5NywgMjM0KQ0KLQkJCQkoMjA5NywgMTEzNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDk3LCAyMzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk3LCAxMTM1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxOTENCi0JCQkJbG9jYXRpb24gICAJKDIxNTEsIDEwNDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDE5NA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDEyLCA0MjIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTIxRjIwMEU5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlY0NvbnN0cmFpbnQiIEAxOTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDMyNCwgLTM2MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxOTUNCi0JCQkJbG9jYXRpb24gICAJKDE1NDAsIDIxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VjQ29uc3RyYWludCINCi0JCQkJcGN0RGlzdCAgICAJMC42NDgwNjkNCi0JCQkJaGVpZ2h0ICAgICAJMTQ5DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMUYzMDM5RCINCi0JCQkgICAgY2xpZW50ICAgICAJQDE5NA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTgxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQxMiwgNDIyKQ0KLQkJCQkoMTM5MSwgNDIyKQ0KLQkJCQkoMTM5MSwgMTg4KQ0KLQkJCQkoMTI5NSwgMTg4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MTIsIDQyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTUsIDE4OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk3DQotCQkJCVBhcmVudF9WaWV3IAlAMTk1DQotCQkJCWxvY2F0aW9uICAgCSgxMzMwLCAxMzUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXV0aENvbnN0cmFpbnQiIEAxOTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQNCi0JCQkgICAgbG9jYXRpb24gICAJKDMyNCwgLTM2MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxOTgNCi0JCQkJbG9jYXRpb24gICAJKDE1ODYsIDYxMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI4OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXV0aENvbnN0cmFpbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNjYyMzkzDQotCQkJCWhlaWdodCAgICAgCTE1Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjFGMzAzQTciDQotCQkJICAgIGNsaWVudCAgICAgCUAxOTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE4MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MTIsIDQyMikNCi0JCQkJKDE0MzQsIDQyMikNCi0JCQkJKDE0MzQsIDcxOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDEyLCA0MjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDM0LCA3MTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMA0KLQkJCQlQYXJlbnRfVmlldyAJQDE5OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4OCwgNjg3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEAyMDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyNDcsIDE2OTUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjAxDQotCQkJbG9jYXRpb24gICAJKDExMTksIDE1NjYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjAxDQotCQkJbG9jYXRpb24gICAJKDExMTksIDE2ODEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyODQpDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjAiIEAyMDINCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg2MCwgMTYyNSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1MTUwMDFCRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvbnMiIEAyMDMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDINCi0JCQkgICAgbG9jYXRpb24gICAJKC00NCwgODg5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNA0KLQkJCQlQYXJlbnRfVmlldyAJQDIwMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTYxNSwgMTY5OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUxNjIyNA0KLQkJCQloZWlnaHQgICAgIAk3NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTE1MTAxQkUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMDINCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE4NjAsIDE2MjUpDQotCQkJCSgxMzg0LCAxNjI1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4NjAsIDE2MjUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzg0LCAxNjI1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDUNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDMNCi0JCQkJbG9jYXRpb24gICAJKDE0MzIsIDE2NzkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjEiIEAyMDYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDINCi0JCQkgICAgbG9jYXRpb24gICAJKC00NCwgODg5KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1MTUxMDFEQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDIwMg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTc5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTg2MCwgMTYyNSkNCi0JCQkJKDIwNzEsIDE2MjUpDQotCQkJCSgyMDcxLCAxMzYxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4NjAsIDE2MjUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDcxLCAxMzYxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYyIiBAMjA3DQotCQkgICAgbG9jYXRpb24gICAJKDEzMzEsIDEyNjMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENTE0RDAzMTciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25zIiBAMjA4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjA3DQotCQkJICAgIGxvY2F0aW9uICAgCSgxOTUsIDQ5NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDkNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDgNCi0JCQkJbG9jYXRpb24gICAJKDExNDksIDE0MzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42NDkwMDcNCi0JCQkJaGVpZ2h0ICAgICAJMTQzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1MTRFMDEwNiINCi0JCQkgICAgY2xpZW50ICAgICAJQDIwNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjAxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMzMSwgMTI2MykNCi0JCQkJKDEyOTEsIDEyNjMpDQotCQkJCSgxMjkxLCAxNTU0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzMzEsIDEyNjMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjkxLCAxNTU0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTANCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDgNCi0JCQkJbG9jYXRpb24gICAJKDEzNzIsIDE0NjIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcyMTg1NA0KLQkJCQloZWlnaHQgICAgIAk4MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjMiIEAyMTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDcNCi0JCQkgICAgbG9jYXRpb24gICAJKDE5NSwgNDk1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ1MTRFMDEyNCINCi0JCQkgICAgY2xpZW50ICAgICAJQDIwNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTgwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMzMSwgMTI2MykNCi0JCQkJKDEzNzEsIDEyNjMpDQotCQkJCSgxMzcxLCA5NDUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTMzMSwgMTI2MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzEsIDk0NSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYlJlc291cmNlQ29sbGVjdGlvbiIgQDIxMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTkyLCA3MjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjEyDQotCQkJbG9jYXRpb24gICAJKDE1OCwgNTcyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTg2OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViUmVzb3VyY2VDb2xsZWN0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCODcwM0FCIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMTINCi0JCQlsb2NhdGlvbiAgIAkoMTU4LCA2MzMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAk4OTQpDQotCQkgICAgd2lkdGggICAgICAJODg2DQotCQkgICAgaGVpZ2h0ICAgICAJMzIwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIiIEAyMTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDk0LCAxMTApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTIxRUQwMkQ2Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlY0NvbnN0cmFpbnQiIEAyMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDE3NCwgLTY1OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTQNCi0JCQkJbG9jYXRpb24gICAJKDc3MCwgNzEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlY0NvbnN0cmFpbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNzE1NzE5DQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMUVFMDFFNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDIxMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTgxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDk0LCAxMTApDQotCQkJCSg4ODEsIDExMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDExMCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg4MSwgMTEwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTQNCi0JCQkJbG9jYXRpb24gICAJKDg0MiwgMTY0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndlYlJlc291cmNlQ29sbGVjdGlvbnMiIEAyMTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDE3NCwgLTY1OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTcNCi0JCQkJbG9jYXRpb24gICAJKDY4NSwgNTI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkzOTY1NQ0KLQkJCQloZWlnaHQgICAgIAkyNTENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIxRUUwMUYxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjEzDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0OTQsIDExMCkNCi0JCQkJKDQzNCwgMTEwKQ0KLQkJCQkoNDM0LCA1NjApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxMTApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzQsIDU2MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE5DQotCQkJCVBhcmVudF9WaWV3IAlAMjE3DQotCQkJCWxvY2F0aW9uICAgCSg1MDEsIDQ4MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODQ3NzY5DQotCQkJCWhlaWdodCAgICAgCTY3DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAyMjANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUAxNzYNCi0JCSAgICBzdXBwbGllciAgIAlAMjEyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDM3MywgMTAwMikNCi0JCQkoNDY2LCA4ODApKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjQiIEAyMjENCi0JCSAgICBsb2NhdGlvbiAgIAkoNjkxLCAxNDc0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTg0MjE1MDQNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDUxNEIwMDg5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9ucyIgQDIyMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA3LCA3MjIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIzDQotCQkJCVBhcmVudF9WaWV3IAlAMjIyDQotCQkJCWxvY2F0aW9uICAgCSg4ODksIDE2MTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC42MjcyMDQNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDUxNEIwM0FBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjIxDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMDENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2OTEsIDE0NzQpDQotCQkJCSg2OTEsIDE2NDgpDQotCQkJCSgxMTEwLCAxNjQ4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY5MSwgMTQ3NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMTAsIDE2NDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyNA0KLQkJCQlQYXJlbnRfVmlldyAJQDIyMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTY5MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODI4NzE1DQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NSIgQDIyNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA3LCA3MjIpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDUxNEIwM0M4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjIxDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2OTEsIDE0NzQpDQotCQkJCSg2OTEsIDg4MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2OTEsIDE0NzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2OTEsIDg4MCkpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiU2VydmxldCBEZXNjcmlwdG9ycyINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwOEU1QzAxRjUiDQotCSAgICB0aXRsZSAgICAgIAkiU2VydmxldCBEZXNjcmlwdG9ycyINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgc2VydmxldC1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmxldC4iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMTIyMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbkdyb3VwIiBAMjI2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4MzcsIDIwNDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjYNCi0JCQlsb2NhdGlvbiAgIAkoNjU5LCAxOTcwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25Hcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NTFGMDFGQiINCi0JCSAgICB3aWR0aCAgICAgIAkzNzQNCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlcnZsZXRUeXBlIiBAMjI3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDAwLCA5NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjcNCi0JCQlsb2NhdGlvbiAgIAkoMTgxOCwgMTgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzY0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZXJ2bGV0VHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzBBMjMyMDMxMSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjI3DQotCQkJbG9jYXRpb24gICAJKDE4MTgsIDc5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzk3KQ0KLQkJICAgIHdpZHRoICAgICAgCTM4Mg0KLQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6SlNQVHlwZSIgQDIyOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgMTEyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyOA0KLQkJCWxvY2F0aW9uICAgCSgxMjg2LCAzNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkpTUFR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTI2NDAyNzMiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDIyOA0KLQkJCWxvY2F0aW9uICAgCSgxMjg2LCA5NSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTMxMykNCi0JCSAgICB3aWR0aCAgICAgIAkyOTQNCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkluaXRQYXJhbSIgQDIyOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjg4LCAxMTM2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCWxvY2F0aW9uICAgCSg5NCwgMTAxMSkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJbml0UGFyYW0iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwOEU5RDAzMjUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCWxvY2F0aW9uICAgCSg5NCwgMTA3MikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk0MTMpDQotCQkgICAgd2lkdGggICAgICAJNDA2DQotCQkgICAgaGVpZ2h0ICAgICAJMjc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6U2VjdXJpdHlSb2xlUmVmIiBAMjMwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODI0LCA3NTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjMwDQotCQkJbG9jYXRpb24gICAJKDE2NDYsIDU3NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlY3VyaXR5Um9sZVJlZiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjM3MUJDN0EwMDI1QyINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjMwDQotCQkJbG9jYXRpb24gICAJKDE2NDYsIDY4OSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTM5MSkNCi0JCSAgICB3aWR0aCAgICAgIAkzNzQNCi0JCSAgICBoZWlnaHQgICAgIAkzODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYlR5cGUiIEAyMzENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3OTIsIDQxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIzMQ0KLQkJCWxvY2F0aW9uICAgCSgxNjkwLCAzNjYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjA0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJUeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEExRjcwMjk0Ig0KLQkJICAgIHdpZHRoICAgICAgCTIyMg0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEEyOEMwMkFEIg0KLQkJICAgIGNsaWVudCAgICAgCUAyMjcNCi0JCSAgICBzdXBwbGllciAgIAlAMjMxDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE5NDEsIDE4NikNCi0JCQkoMTgzMiwgMzUzKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMzDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEEyOTAwMjU4Ig0KLQkJICAgIGNsaWVudCAgICAgCUAyMjgNCi0JCSAgICBzdXBwbGllciAgIAlAMjMxDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE1MzMsIDIwMikNCi0JCQkoMTcxNiwgMzUzKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkiIEAyMzQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4NDcsIDExNjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjM0DQotCQkJbG9jYXRpb24gICAJKDE2MjIsIDEwNTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSdW5Bc1NwZWNpZmllZElkZW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRjJDOUUwMkM4Ig0KLQkJICAgIHdpZHRoICAgICAgCTQ2OA0KLQkJICAgIGhlaWdodCAgICAgCTI0Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlBhcmFtVmFsdWUiIEAyMzUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ4NCwgMTYzNykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMzUNCi0JCQlsb2NhdGlvbiAgIAkoMzA3LCAxNDg0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUGFyYW1WYWx1ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJODQyMTUwNA0KLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2DQotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMjEyMDJDMSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjM1DQotCQkJbG9jYXRpb24gICAJKDMwNywgMTU5OSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTM5MSkNCi0JCSAgICB3aWR0aCAgICAgIAkzNzINCi0JCSAgICBoZWlnaHQgICAgIAkzMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlcnZsZXQiIEAyMzYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ5NiwgMzM2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIzNg0KLQkJCWxvY2F0aW9uICAgCSgxODYsIDIzNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZsZXQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDIzNg0KLQkJCWxvY2F0aW9uICAgCSgxODYsIDI5NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTY1MCkNCi0JCSAgICB3aWR0aCAgICAgIAk2MzgNCi0JCSAgICBoZWlnaHQgICAgIAkyMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNiIgQDIzNw0KLQkJICAgIGxvY2F0aW9uICAgCSgzOTMsIDcyMykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjJCNTAxQkIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTciIEAyMzgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMzcNCi0JCQkgICAgbG9jYXRpb24gICAJKDczLCAtNDEzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIzOA0KLQkJCQlsb2NhdGlvbiAgIAkoMzA5LCA1MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuNjk4NzE4DQotCQkJCWhlaWdodCAgICAgCTg1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMkI2MDE0NSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIzNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjM2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzkzLCA3MjMpDQotCQkJCSgzOTMsIDQ0OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTMsIDcyMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM5MywgNDQ4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDANCi0JCQkJUGFyZW50X1ZpZXcgCUAyMzgNCi0JCQkJbG9jYXRpb24gICAJKDQ2NSwgNTMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42OTg3MTgNCi0JCQkJaGVpZ2h0ICAgICAJNzINCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcmFtcyIgQDI0MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIzNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIC00MTMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQyDQotCQkJCVBhcmVudF9WaWV3IAlAMjQxDQotCQkJCWxvY2F0aW9uICAgCSg0ODYsIDkxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2NQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcGFyYW1zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcwNzE4Mg0KLQkJCQloZWlnaHQgICAgIAk5Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjJCNjAxNTkiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMzcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIyOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM5MywgNzIzKQ0KLQkJCQkoMzkzLCA5OTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzkzLCA3MjMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzOTMsIDk5OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQzDQotCQkJCVBhcmVudF9WaWV3IAlAMjQxDQotCQkJCWxvY2F0aW9uICAgCSgzNTAsIDkxNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzAwNjM3DQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4IiBAMjQ0DQotCQkgICAgbG9jYXRpb24gICAJKDEzMTAsIDM5NikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjJDMDAxOTkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkiIEAyNDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNDQNCi0JCQkgICAgbG9jYXRpb24gICAJKC01OTQsIC03NzIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ2DQotCQkJCVBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCWxvY2F0aW9uICAgCSg4OTcsIDM2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgzNjQ0OQ0KLQkJCQloZWlnaHQgICAgIAkzNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjJDMTAyOEIiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIzNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMTAsIDM5NikNCi0JCQkJKDgxNSwgMzk2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzMTAsIDM5NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxNSwgMzk2KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZWN1cml0eVJvbGVSZWZzIiBAMjQ3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTk0LCAtNzcyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0OA0KLQkJCQlQYXJlbnRfVmlldyAJQDI0Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTU3MywgMzY1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzM2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZWN1cml0eVJvbGVSZWZzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUzMzgxNg0KLQkJCQloZWlnaHQgICAgIAkzMg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjJDMTAyOUYiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIzMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMTAsIDM5NikNCi0JCQkJKDE2MzksIDM5NikNCi0JCQkJKDE2MzksIDU2MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzEwLCAzOTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjM5LCA1NjIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI0Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTYwMywgNDQ4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43NzA1MzENCi0JCQkJaGVpZ2h0ICAgICAJMzcNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUiIEAyNTANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI0OCwgMzU5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzEyMkFDMDE0QSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJUeXBlIiBAMjUxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjUwDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMTIsIDM5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDI1MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2MiwgNDAyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTg4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3ZWJUeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcyNDM5MA0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjJBRDAwMTUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDIzMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyNDgsIDM1OSkNCi0JCQkJKDE2ODEsIDM1OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjQ4LCAzNTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjgxLCAzNTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDI1MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYzNywgMzA2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZsZXQiIEAyNTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNTANCi0JCQkgICAgbG9jYXRpb24gICAJKDExMiwgMzkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU1DQotCQkJCVBhcmVudF9WaWV3IAlAMjU0DQotCQkJCWxvY2F0aW9uICAgCSg5MDMsIDQwMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0MQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VydmxldCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTIyQUQwMDAxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjUwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMzYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjQ4LCAzNTkpDQotCQkJCSg4MTUsIDM1OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjQ4LCAzNTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTUsIDM1OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU2DQotCQkJCVBhcmVudF9WaWV3IAlAMjU0DQotCQkJCWxvY2F0aW9uICAgCSg4NzcsIDMyMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODU4NTM3DQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQyIiBAMjU3DQotCQkgICAgbG9jYXRpb24gICAJKDc0NiwgMTE2OSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTk4MkEyRTAyNTUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDMiIEAyNTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNTcNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMzQsIDIzOSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNTgNCi0JCQkJbG9jYXRpb24gICAJKDU1OCwgNjIyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTk4MkEyRjAxOEUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIzNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDc0NiwgMTE2OSkNCi0JCQkJKDU5OSwgMTE2OSkNCi0JCQkJKDU5OSwgNDQ5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc0NiwgMTE2OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU5OSwgNDQ5KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJydW5BcyIgQDI2MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMzNCwgMjM5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI2MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUxNiwgMTIyMykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEzNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcnVuQXMiDQotCQkJCXBjdERpc3QgICAgCTAuODg5ODQzDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5OTgyQTJGMDE4NCINCi0JCQkgICAgY2xpZW50ICAgICAJQDI1Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjM0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzQ2LCAxMTY5KQ0KLQkJCQkoMTYxMywgMTE2OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3NDYsIDExNjkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjEzLCAxMTY5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjINCi0JCQkJUGFyZW50X1ZpZXcgCUAyNjANCi0JCQkJbG9jYXRpb24gICAJKDE1NDMsIDExMjYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkxOTg4Ng0KLQkJCQloZWlnaHQgICAgIAk0NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OCIgQDI2Mw0KLQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDk2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDZFNzAzODciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdFBhcmFtcyIgQDI2NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQsIDU3MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjUNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNjQNCi0JCQkJbG9jYXRpb24gICAJKDQwNCwgMTQwNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIyOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIraW5pdFBhcmFtcyINCi0JCQkJcGN0RGlzdCAgICAJMC44NzE2MjINCi0JCQkJaGVpZ2h0ICAgICAJMTI1DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NkU5MDAwNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI2Mw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjM1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTI4LCA5NjApDQotCQkJCSg1MjgsIDE0NzIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTI4LCA5NjApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MjgsIDE0NzIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDI2NA0KLQkJCQlsb2NhdGlvbiAgIAkoNTgyLCAxNDIxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ5IiBAMjY3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjYzDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNCwgNTcwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0NkU5MDAxOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI2Mw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjM2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTI4LCA5NjApDQotCQkJCSg1MjgsIDQ0OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjgsIDk2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUyOCwgNDQ5KSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJXZWxjb21lRmlsZSBSZWxhdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwQTgyMTAyODciDQotCSAgICB0aXRsZSAgICAgIAkiV2VsY29tZUZpbGUgUmVsYXRpb24iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlbGNvbWVGaWxlTGlzdCIgQDI2OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEyMCwgMTkyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI2OA0KLQkJCWxvY2F0aW9uICAgCSg5NDgsIDE0MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNDQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldlbGNvbWVGaWxlTGlzdCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3QUFEMDFBOCINCi0JCSAgICB3aWR0aCAgICAgIAkzNjINCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlbGNvbWVGaWxlIiBAMjY5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA2NzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjY5DQotCQkJbG9jYXRpb24gICAJKDg5NCwgNTk0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2VsY29tZUZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwQTVBODAwRTkiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDI2OQ0KLQkJCWxvY2F0aW9uICAgCSg4OTQsIDY1NSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQxOSkNCi0JCSAgICB3aWR0aCAgICAgIAk0MDYNCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMCIgQDI3MA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDAzLCA0MTcpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTIzQUYwMkM0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImZpbGVMaXN0IiBAMjcxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjcwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtNjksIC0xOTEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcyDQotCQkJCVBhcmVudF9WaWV3IAlAMjcxDQotCQkJCWxvY2F0aW9uICAgCSg4OTksIDI4NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZmlsZUxpc3QiDQotCQkJCXBjdERpc3QgICAgCTAuNzk3MTAxDQotCQkJCWhlaWdodCAgICAgCTEwNQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjNCMzAxMTEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNzANCi0JCQkgICAgc3VwcGxpZXIgICAJQDI2OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwMDMsIDQxNykNCi0JCQkJKDEwMDMsIDI1NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDAzLCA0MTcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDAzLCAyNTQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDI3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3NCwgMjkxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NzUzNjINCi0JCQkJaGVpZ2h0ICAgICAJNzENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImZpbGUiIEAyNzQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNzANCi0JCQkgICAgbG9jYXRpb24gICAJKC02OSwgLTE5MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzUNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNzQNCi0JCQkJbG9jYXRpb24gICAJKDk2MiwgNTQ4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2ZpbGUiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QzEyM0IzMDExQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI3MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjY5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTAwMywgNDE3KQ0KLQkJCQkoMTAwMywgNTgxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMDMsIDQxNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDMsIDU4MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc2DQotCQkJCVBhcmVudF9WaWV3IAlAMjc0DQotCQkJCWxvY2F0aW9uICAgCSgxMDU4LCA1NDMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3Njk3OA0KLQkJCQloZWlnaHQgICAgIAk1NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiV2ViUmVzb3VyY2VDb2xsZWN0aW9uIFJlbGF0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjM4QzBBODYwMDI0MSINCi0JICAgIHRpdGxlICAgICAgCSJXZWJSZXNvdXJjZUNvbGxlY3Rpb24gUmVsYXRpb24iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMTc1DQotCSAgICBvcmlnaW5feSAgIAkxMDYNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpIVFRQTWV0aG9kVHlwZUVudW0iIEAyNzcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4ODgsIDY4OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNzcNCi0JCQlsb2NhdGlvbiAgIAkoMTY1OCwgNDc5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ2MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSFRUUE1ldGhvZFR5cGVFbnVtIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjc3DQotCQkJbG9jYXRpb24gICAJKDE2NTgsIDQyOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ2MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEEyRTIwMEM2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyNzcNCi0JCQlsb2NhdGlvbiAgIAkoMTY1OCwgNTQwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk4DQotCQkJbWF4X3dpZHRoICAJMjI4KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ3OA0KLQkJICAgIGhlaWdodCAgICAgCTU0Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6VVJMUGF0dGVyblR5cGUiIEAyNzgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDY1NiwgODY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI3OA0KLQkJCWxvY2F0aW9uICAgCSg0NzAsIDc4MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlVSTFBhdHRlcm5UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMEEyQzUwMDQyIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyNzgNCi0JCQlsb2NhdGlvbiAgIAkoNDcwLCA4NDQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzNjkpDQotCQkgICAgd2lkdGggICAgICAJMzkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpIVFRQTWV0aG9kVHlwZSIgQDI3OQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM3NiwgODMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI3OQ0KLQkJCWxvY2F0aW9uICAgCSgxMTc2LCA3NTEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDAwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQTWV0aG9kVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFOTMwQjA1MDA2NSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjc5DQotCQkJbG9jYXRpb24gICAJKDExNzYsIDgxMikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM5NykNCi0JCSAgICB3aWR0aCAgICAgIAk0MTgNCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYlJlc291cmNlQ29sbGVjdGlvbiIgQDI4MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA0MCwgMjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI4MA0KLQkJCWxvY2F0aW9uICAgCSg1OTIsIDg0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTg5Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViUmVzb3VyY2VDb2xsZWN0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDdCODcwM0FCIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyODANCi0JCQlsb2NhdGlvbiAgIAkoNTkyLCAxNDUpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAk4OTQpDQotCQkgICAgd2lkdGggICAgICAJOTE0DQotCQkgICAgaGVpZ2h0ICAgICAJMzM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAyODENCi0JCSAgICBsb2NhdGlvbiAgIAkoODI0LCA1ODkpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMTI0MDkwMTc5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlc0NvbGxlY3Rpb24iIEAyODINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODENCi0JCQkgICAgbG9jYXRpb24gICAJKDEzNiwgLTExNSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyODINCi0JCQkJbG9jYXRpb24gICAJKDc1MCwgNDcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjY0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIityZXNDb2xsZWN0aW9uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjI4OTU4OQ0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTI0MEEwMjU2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjgxDQotCQkJICAgIHN1cHBsaWVyICAgCUAyODANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4MjQsIDU4OSkNCi0JCQkJKDkzNSwgNDA4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODQNCi0JCQkJUGFyZW50X1ZpZXcgCUAyODINCi0JCQkJbG9jYXRpb24gICAJKDgxMCwgNTEzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC4yNzQ3MzMNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIlVSTHMiIEAyODUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODENCi0JCQkgICAgbG9jYXRpb24gICAJKDEzNiwgLTExNSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyODUNCi0JCQkJbG9jYXRpb24gICAJKDYyNywgNzExKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTMyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitVUkxzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk3NjIyOQ0KLQkJCQloZWlnaHQgICAgIAkxMDYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTI0MEEwMjYwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjgxDQotCQkJICAgIHN1cHBsaWVyICAgCUAyNzgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4MjQsIDU4OSkNCi0JCQkJKDcxMywgNzcwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODcNCi0JCQkJUGFyZW50X1ZpZXcgCUAyODUNCi0JCQkJbG9jYXRpb24gICAJKDgwMiwgNzM5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC42NjMzMjANCi0JCQkJaGVpZ2h0ICAgICAJNjANCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjYiIEAyODgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIyOCwgNTczKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U5MzBCMTEwMzBCIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIkhUVFBzIiBAMjg5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjg4DQotCQkJICAgIGxvY2F0aW9uICAgCSgxODMsIDMyOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTANCi0JCQkJUGFyZW50X1ZpZXcgCUAyODkNCi0JCQkJbG9jYXRpb24gICAJKDExODksIDY3OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0NQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrSFRUUHMiDQotCQkJCXBjdERpc3QgICAgCTAuMzgxMDEwDQotCQkJCWhlaWdodCAgICAgCTg3DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFOTMwQjEyMDBEQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDI4OA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjc5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIyOCwgNTczKQ0KLQkJCQkoMTMyMiwgNzM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTENCi0JCQkJUGFyZW50X1ZpZXcgCUAyODkNCi0JCQkJbG9jYXRpb24gICAJKDEzNTksIDY5NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZXNDb2xsZWN0aW9uIiBAMjkyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjg4DQotCQkJICAgIGxvY2F0aW9uICAgCSgxODMsIDMyOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyOTINCi0JCQkJbG9jYXRpb24gICAJKDEzMzIsIDQ2OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI1Nw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVzQ29sbGVjdGlvbiINCi0JCQkJcGN0RGlzdCAgICAJMC4yMTgxNjMNCi0JCQkJaGVpZ2h0ICAgICAJMTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFOTMwQjEyMDBFNiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI4OA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjgwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIyOCwgNTczKQ0KLQkJCQkoMTEzNSwgNDA4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAyOTINCi0JCQkJbG9jYXRpb24gICAJKDExMDAsIDQ2NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODI3NTczDQotCQkJCWhlaWdodCAgICAgCTYwDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJsb2dpbkNvbmZpZyBSZWxhdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzOEMwQThCRjAzRTIiDQotCSAgICB0aXRsZSAgICAgIAkibG9naW5Db25maWcgUmVsYXRpb24iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMTMNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpMb2dpbkNvbmZpZyIgQDI5NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEwNCwgMjA4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI5NQ0KLQkJCWxvY2F0aW9uICAgCSg3NTMsIDgzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTcwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTG9naW5Db25maWciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwN0QwRjAwNkYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDI5NQ0KLQkJCWxvY2F0aW9uICAgCSg3NTMsIDE0NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTc0MikNCi0JCSAgICB3aWR0aCAgICAgIAk3MjANCi0JCSAgICBoZWlnaHQgICAgIAkyNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkZvcm1Mb2dpbkNvbmZpZyIgQDI5Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEzNiwgODk2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI5Ng0KLQkJCWxvY2F0aW9uICAgCSg5MTcsIDc5NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkZvcm1Mb2dpbkNvbmZpZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QzA3RDM5MDI5NiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjk2DQotCQkJbG9jYXRpb24gICAJKDkxNywgODU2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNDYzKQ0KLQkJICAgIHdpZHRoICAgICAgCTQ1Ng0KLQkJICAgIGhlaWdodCAgICAgCTIyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyIiBAMjk3DQotCQkgICAgbG9jYXRpb24gICAJKDExMzYsIDU2NCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMxMjQ4OTAwQkUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibG9naW5Db25maWciIEAyOTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOTcNCi0JCQkgICAgbG9jYXRpb24gICAJKDAsIC0zMzIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjk5DQotCQkJCVBhcmVudF9WaWV3IAlAMjk4DQotCQkJCWxvY2F0aW9uICAgCSgxMDA0LCAzNjkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2xvZ2luQ29uZmlnIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5Mjk1Mg0KLQkJCQloZWlnaHQgICAgIAkxMzMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTI0ODkwMzAzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjk3DQotCQkJICAgIHN1cHBsaWVyICAgCUAyOTUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTM2LCA1NjQpDQotCQkJCSgxMTM2LCAzNDUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTEzNiwgNTY0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzNiwgMzQ1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDANCi0JCQkJUGFyZW50X1ZpZXcgCUAyOTgNCi0JCQkJbG9jYXRpb24gICAJKDExOTAsIDM2NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmb3JtTG9naW5Db25maWciIEAzMDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOTcNCi0JCQkgICAgbG9jYXRpb24gICAJKDAsIC0zMzIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAyDQotCQkJCVBhcmVudF9WaWV3IAlAMzAxDQotCQkJCWxvY2F0aW9uICAgCSg5NjgsIDc0OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMyNw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZm9ybUxvZ2luQ29uZmlnIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg0NDA3Mw0KLQkJCQloZWlnaHQgICAgIAkxNjkNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhDMTI0ODkwMzBEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjk3DQotCQkJICAgIHN1cHBsaWVyICAgCUAyOTYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTM2LCA1NjQpDQotCQkJCSgxMTM2LCA3ODMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTEzNiwgNTY0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzNiwgNzgzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMDENCi0JCQkJbG9jYXRpb24gICAJKDExOTAsIDc2MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6QXV0aE1ldGhvZEtpbmQiIEAzMDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM2OCwgNjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwNA0KLQkJCWxvY2F0aW9uICAgCSgxOTAsIDQ5MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkF1dGhNZXRob2RLaW5kIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzA0DQotCQkJbG9jYXRpb24gICAJKDE5MCwgNDQwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzUzDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRUUwQTJEODAyOUEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMwNA0KLQkJCWxvY2F0aW9uICAgCSgxOTAsIDU1MSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNg0KLQkJCW1heF93aWR0aCAgCTMxOSkNCi0JCSAgICB3aWR0aCAgICAgIAkzNzQNCi0JCSAgICBoZWlnaHQgICAgIAk0MjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiZGF0YSB0eXBlcyINCi0JICAgIHF1aWQgICAgICAgCSIzOTA0OEEyNDAzMjEiDQotCSAgICB0aXRsZSAgICAgIAkiZGF0YSB0eXBlcyINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6VHJhbnNwb3J0R3VhcmFudGVlVHlwZSIgQDMwNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzUyLCA0MzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzA1DQotCQkJbG9jYXRpb24gICAJKDExNCwgMzI5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVHJhbnNwb3J0R3VhcmFudGVlVHlwZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwNQ0KLQkJCWxvY2F0aW9uICAgCSgxMTQsIDI3OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNDYxQTkwMThGIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzMDUNCi0JCQlsb2NhdGlvbiAgIAkoMTE0LCAzOTApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAkzMzgpDQotCQkgICAgd2lkdGggICAgICAJNDk0DQotCQkgICAgaGVpZ2h0ICAgICAJMzMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UmVzQXV0aFR5cGVCYXNlIiBAMzA2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDI0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMDYNCi0JCQlsb2NhdGlvbiAgIAkoNzU1LCAxMDgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzc4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJSZXNBdXRoVHlwZUJhc2UiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMDYNCi0JCQlsb2NhdGlvbiAgIAkoNzU1LCA1OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDlFRDQwMEI0Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzMDYNCi0JCQlsb2NhdGlvbiAgIAkoNzU1LCAyMjMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAkyNTkpDQotCQkgICAgd2lkdGggICAgICAJMzk2DQotCQkgICAgaGVpZ2h0ICAgICAJMzg4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpSZXNBdXRoU2VydmxldFR5cGUiIEAzMDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk0NCwgNzM2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwNw0KLQkJCWxvY2F0aW9uICAgCSg3NDEsIDY1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlJlc0F1dGhTZXJ2bGV0VHlwZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwNw0KLQkJCWxvY2F0aW9uICAgCSg3NDEsIDYwNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQwNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDlFRUEwMjY1Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzMDcNCi0JCQlsb2NhdGlvbiAgIAkoNzQxLCA3MTgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyODEpDQotCQkgICAgd2lkdGggICAgICAJNDI0DQotCQkgICAgaGVpZ2h0ICAgICAJMjgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlNlcnZsZXQyLjQgLSBGaWx0ZXJzIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QkZCMTNFMDIxQSINCi0JICAgIHRpdGxlICAgICAgCSJTZXJ2bGV0Mi40IC0gRmlsdGVycyINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBOb3RlVmlldyBAMzA4DQotCQkgICAgbG9jYXRpb24gICAJKDMwNzAsIDIwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTE2Nzc3MjE1DQotCQkJZGVmYXVsdF9jb2xvciAJRkFMU0UpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwOA0KLQkJCWxvY2F0aW9uICAgCSgyNjkxLCA4MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk3MjINCi0JCQlsYWJlbCAgICAgIAkiVE9ETzogSW1wbGVtZW50IGhlbHBlcnMgZm9yIHJlc29sdXRpb24gb2YgU2VydmxldCBhbmQgRmlsdGVyIGZvciBGaWx0ZXJNYXBwaW5nIGJ5IHNlcnZsZXROYW1lIGFuZCBuYW1lLiAgU2luY2Ugd2UgaGF2ZSByZWZzLCB3ZSBtYXkgd2FudCB0byByZW1vdmUgdGhlIG5hbWVzLiIpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTI1NQ0KLQkJICAgIHdpZHRoICAgICAgCTc4Mg0KLQkJICAgIGhlaWdodCAgICAgCTI1MCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlcnZsZXQiIEAzMDkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMTYwLCA1NDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzA5DQotCQkJbG9jYXRpb24gICAJKDIwNzksIDQ5OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZsZXQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEMwNzkxNDAyNTEiDQotCQkgICAgaGVpZ2h0ICAgICAJMTE3DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6TGlzdGVuZXIiIEAzMTANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIyNjcsIDExNSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMTANCi0JCQlsb2NhdGlvbiAgIAkoMjE0NywgMzcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjQwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJMaXN0ZW5lciIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCMjYwMDFCRCINCi0JCSAgICB3aWR0aCAgICAgIAkyNTgNCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMzExDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMzA4DQotCQkgICAgc3VwcGxpZXIgICAJQDMxMA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyNjc4LCAxNTcpDQotCQkJKDIzOTYsIDEyNykpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OkluaXRQYXJhbSIgQDMxMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNTYsIDExNjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzEyDQotCQkJbG9jYXRpb24gICAJKDYyLCAxMDY3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSW5pdFBhcmFtIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDhFOUQwMzI1Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzMTINCi0JCQlsb2NhdGlvbiAgIAkoNjIsIDExMjgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0MTMpDQotCQkgICAgd2lkdGggICAgICAJNDA2DQotCQkgICAgaGVpZ2h0ICAgICAJMjI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpGaWx0ZXJNYXBwaW5nIiBAMzEzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDA4LCA1NzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzEzDQotCQkJbG9jYXRpb24gICAJKDEwMTEsIDQ3NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk3OTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkZpbHRlck1hcHBpbmciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjE0QzAzREQiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMxMw0KLQkJCWxvY2F0aW9uICAgCSgxMDExLCA1MzYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk4MjYpDQotCQkgICAgd2lkdGggICAgICAJODEyDQotCQkgICAgaGVpZ2h0ICAgICAJMjI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzYiIEAzMTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk0MiwgNTM4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5QzAwNUJCMDBCOSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2bGV0IiBAMzE1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzE0DQotCQkJICAgIGxvY2F0aW9uICAgCSg2OTQsIC02KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxNg0KLQkJCQlQYXJlbnRfVmlldyAJQDMxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAwNiwgNDk5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2bGV0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjQ5NzA0MQ0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUMwMDVCQzAwNEQiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMwOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE5NDIsIDUzOCkNCi0JCQkJKDIwNzAsIDUzOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTQyLCA1MzgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDcwLCA1MzgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxNw0KLQkJCQlQYXJlbnRfVmlldyAJQDMxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzNCwgNTkxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43MTU5NzYNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM3IiBAMzE4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzE0DQotCQkJICAgIGxvY2F0aW9uICAgCSg2OTQsIC02KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QzAwNUJDMDA2MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDMxNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMzEzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTk0MiwgNTM4KQ0KLQkJCQkoMTgxNCwgNTM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NDIsIDUzOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTQsIDUzOCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OldlYkFwcCIgQDMxOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkxMiwgMTEyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxOQ0KLQkJCWxvY2F0aW9uICAgCSg4MTgsIDY2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViQXBwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiTm9uZSINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc3RkIwMzUyIg0KLQkJICAgIHdpZHRoICAgICAgCTIwNg0KLQkJICAgIGhlaWdodCAgICAgCTExNw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4IiBAMzIwDQotCQkgICAgbG9jYXRpb24gICAJKDEyMzMsIDIwNykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjQxNTAyOTgiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZmlsdGVyTWFwcGluZ3MiIEAzMjENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMjANCi0JCQkgICAgbG9jYXRpb24gICAJKDMyMSwgOTUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIyDQotCQkJCVBhcmVudF9WaWV3IAlAMzIxDQotCQkJCWxvY2F0aW9uICAgCSgxMzk4LCA0MDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyODYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2ZpbHRlck1hcHBpbmdzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc1NzgxMw0KLQkJCQloZWlnaHQgICAgIAkxNjUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRkI0MTYwMTI3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzIwDQotCQkJICAgIHN1cHBsaWVyICAgCUAzMTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjMzLCAyMDcpDQotCQkJCSgxMjMzLCA0NjMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIzMywgMjA3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMywgNDYzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMjENCi0JCQkJbG9jYXRpb24gICAJKDExNzksIDM5MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzI2NTYzDQotCQkJCWhlaWdodCAgICAgCTU1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOSIgQDMyNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzIxLCA5NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjUNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMjQNCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDE4OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjQxNjAxMjgiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMjANCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMzMsIDIwNykNCi0JCQkJKDEyMzMsIDE0NykNCi0JCQkJKDEwMTUsIDE0NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMzLCAyMDcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDE1LCAxNDcpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAiIEAzMjYNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU3NiwgMTE5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5QkZCNTREMDFFQyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJsaXN0ZW5lcnMiIEAzMjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMjYNCi0JCQkgICAgbG9jYXRpb24gICAJKDY2NCwgNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjgNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMjcNCi0JCQkJbG9jYXRpb24gICAJKDE5MTUsIDE3OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE4Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbGlzdGVuZXJzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYwNTczNQ0KLQkJCQloZWlnaHQgICAgIAk2MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjU0RTAyMTUiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMjYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1NzYsIDExOSkNCi0JCQkJKDIxMzgsIDExOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTc2LCAxMTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTM4LCAxMTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MywgNDkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwNDQxMg0KLQkJCQloZWlnaHQgICAgIAk3MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzEiIEAzMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMjYNCi0JCQkgICAgbG9jYXRpb24gICAJKDY2NCwgNykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjU0RTAyMjAiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMjYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1NzYsIDExOSkNCi0JCQkJKDEwMTUsIDExOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTc2LCAxMTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDE1LCAxMTkpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDMzMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIyNTgsIDkyMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMzENCi0JCQlsb2NhdGlvbiAgIAkoMjE2NSwgODQzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE4Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIg0KLQkJICAgIHdpZHRoICAgICAgCTIwNA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQwIiBAMzMyDQotCQkgICAgbG9jYXRpb24gICAJKDIzMjgsIDUxOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUMwM0U2QzAzNUEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibGlzdGVuZXJDbGFzcyIgQDMzMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDI0LCAzNTgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM0DQotCQkJCVBhcmVudF9WaWV3IAlAMzMzDQotCQkJCWxvY2F0aW9uICAgCSgyMTkxLCA3ODUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2xpc3RlbmVyQ2xhc3MiDQotCQkJCXBjdERpc3QgICAgCTAuODU2MjY5DQotCQkJCWhlaWdodCAgICAgCTEzOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUMwM0U2RDAyQTciDQotCQkJICAgIGNsaWVudCAgICAgCUAzMzINCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIzMjgsIDUxOCkNCi0JCQkJKDIzMjgsIDgzMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzI4LCA1MTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzI4LCA4MzEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMjM4MiwgNzc1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44MjE5MTgNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQxIiBAMzM2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzMyDQotCQkJICAgIGxvY2F0aW9uICAgCSg0MjQsIDM1OCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUMwM0U2RDAyQ0YiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMzINCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIzMjgsIDUxOCkNCi0JCQkJKDIzMjgsIDIwNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzI4LCA1MTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzI4LCAyMDUpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UGFyYW1WYWx1ZSIgQDMzNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzg0LCAxNTM4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMzNw0KLQkJCWxvY2F0aW9uICAgCSgyMDcsIDEzODUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQYXJhbVZhbHVlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAk4NDIxNTA0DQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIyMTIwMkMxIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzMzcNCi0JCQlsb2NhdGlvbiAgIAkoMjA3LCAxNTAwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJMzkxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM3Mg0KLQkJICAgIGhlaWdodCAgICAgCTMzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3ZWJhcHBsaWNhdGlvbjo6RmlsdGVyIiBAMzM4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNjgsIDU3NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMzgNCi0JCQlsb2NhdGlvbiAgIAkoMjM3LCA0OTgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJGaWx0ZXIiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTQyMjcwNzINCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDgzMw0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUJGQjE1NTAzQ0MiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMzOA0KLQkJCWxvY2F0aW9uICAgCSgyMzcsIDU1OSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTI5NCkNCi0JCSAgICB3aWR0aCAgICAgIAkyODANCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMiIgQDMzOQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNjUsIDg2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMjc2OA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUMwMDI2RTAyRDEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdFBhcmFtcyIgQDM0MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTg3LCAyODQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQxDQotCQkJCVBhcmVudF9WaWV3IAlAMzQwDQotCQkJCWxvY2F0aW9uICAgCSgxMjIsIDk3NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIyOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIraW5pdFBhcmFtcyINCi0JCQkJcGN0RGlzdCAgICAJMC42MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJMTQ0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QzAwMjZGMDE2MCINCi0JCQkgICAgY2xpZW50ICAgICAJQDMzOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzEyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjY1LCA4NjApDQotCQkJCSgyNjUsIDEwNTUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjY1LCA4NjApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjUsIDEwNTUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDM0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA5NzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzMiIEAzNDMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMzkNCi0JCQkgICAgbG9jYXRpb24gICAJKC04NywgMjg0KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QzAwMjZGMDE2QSINCi0JCQkgICAgY2xpZW50ICAgICAJQDMzOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzM4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjY1LCA4NjApDQotCQkJCSgyNjUsIDY2NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjUsIDg2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2NSwgNjY2KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM0IiBAMzQ0DQotCQkgICAgbG9jYXRpb24gICAJKDc1NSwgNTM4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5QzAwNTZBMDI5MyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmaWx0ZXIiIEAzNDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNDQNCi0JCQkgICAgbG9jYXRpb24gICAJKC00OTMsIC02KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDM0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjE2LCA0OTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMDYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2ZpbHRlciINCi0JCQkJcGN0RGlzdCAgICAJMC41NjYxNzYNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlDMDA1NkIwMzIxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzQ0DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMzgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3NTUsIDUzOCkNCi0JCQkJKDUwOCwgNTM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc1NSwgNTM4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTA4LCA1MzgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDM0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTYxLCA1OTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc4Njc2NQ0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzUiIEAzNDgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNDQNCi0JCQkgICAgbG9jYXRpb24gICAJKC00OTMsIC02KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5QzAwNTZCMDMyQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDM0NA0KLQkJCSAgICBzdXBwbGllciAgIAlAMzEzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzU1LCA1MzgpDQotCQkJCSgxMDAyLCA1MzgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzU1LCA1MzgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDAyLCA1MzgpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYiIEAzNDkNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDc1LCAxMTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzI3NjgNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCRkIzQjEwMUNDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImZpbHRlcnMiIEAzNTANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNDkNCi0JCQkgICAgbG9jYXRpb24gICAJKC00MzcsIDApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUxDQotCQkJCVBhcmVudF9WaWV3IAlAMzUwDQotCQkJCWxvY2F0aW9uICAgCSg1MDIsIDQzOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEzNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZmlsdGVycyINCi0JCQkJcGN0RGlzdCAgICAJMC44OTM4OTENCi0JCQkJaGVpZ2h0ICAgICAJODcNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRkIzQjIwMTIzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzQ5DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMzgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0NzUsIDExMikNCi0JCQkJKDQxNSwgMTEyKQ0KLQkJCQkoNDE1LCA0ODYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDc1LCAxMTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTUsIDQ4NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUyDQotCQkJCVBhcmVudF9WaWV3IAlAMzUwDQotCQkJCWxvY2F0aW9uICAgCSgzNTgsIDQzOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODkzODkxDQotCQkJCWhlaWdodCAgICAgCTU4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNyIgQDM1Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM0OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQzNywgMCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNTMNCi0JCQkJbG9jYXRpb24gICAJKDY3MiwgNzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC41ODkzNDINCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlCRkIzQjIwMTJEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzQ5DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMTkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0NzUsIDExMikNCi0JCQkJKDgwOSwgMTEyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ3NSwgMTEyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODA5LCAxMTIpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzgiIEAzNTUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIxMSwgODcxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5QzAzQzI4MDM1NiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJmaWx0ZXJDbGFzcyIgQDM1Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAyOTUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU3DQotCQkJCVBhcmVudF9WaWV3IAlAMzU2DQotCQkJCWxvY2F0aW9uICAgCSgxODg2LCA5MjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2ZpbHRlckNsYXNzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcxNDU0Mg0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUMwM0MyOTAyNjciDQotCQkJICAgIGNsaWVudCAgICAgCUAzNTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMTEsIDg3MSkNCi0JCQkJKDIxNTYsIDg3MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjExLCA4NzEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTU2LCA4NzEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OA0KLQkJCQlQYXJlbnRfVmlldyAJQDM1Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjA2MSwgOTI1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM5IiBAMzU5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzU1DQotCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDI5NSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUMwM0MyOTAyOEYiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMTEsIDg3MSkNCi0JCQkJKDkyMiwgODcxKQ0KLQkJCQkoOTIyLCA2MjkpDQotCQkJCSg1MDgsIDYyOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjExLCA4NzEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDgsIDYyOSkpKSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMzYwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMzA4DQotCQkgICAgc3VwcGxpZXIgICAJQDMzOA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyNjc4LCAyNTMpDQotCQkJKDUwOCwgNTU1KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ2IiBAMzYxDQotCQkgICAgbG9jYXRpb24gICAJKDM4NCwgMTAxOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMDk0OTU1OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDNBQTAwMEEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdFBhcmFtVmFsdWVzIiBAMzYyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxDQotCQkJICAgIGxvY2F0aW9uICAgCSgzMiwgNDQzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDM2Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMjE5LCAxMzExKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzIwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitpbml0UGFyYW1WYWx1ZXMiDQotCQkJCXBjdERpc3QgICAgCTAuODI1NDIwDQotCQkJCWhlaWdodCAgICAgCTE2Ng0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDNBQTAyNDUiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNjENCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzNw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM4NCwgMTAxOSkNCi0JCQkJKDM4NCwgMTM3MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzODQsIDEwMTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODQsIDEzNzMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2NA0KLQkJCQlQYXJlbnRfVmlldyAJQDM2Mg0KLQkJCQlsb2NhdGlvbiAgIAkoNDM4LCAxMzM4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ3IiBAMzY1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxDQotCQkJICAgIGxvY2F0aW9uICAgCSgzMiwgNDQzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQ0M0FBMDI0RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDM2MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzM4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzg0LCAxMDE5KQ0KLQkJCQkoMzg0LCA2NjYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzg0LCAxMDE5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzg0LCA2NjYpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndlYmFwcGxpY2F0aW9uOjpEaXNwYXRjaGVyVHlwZSIgQDM2Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjczNiwgNjI0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM2Ng0KLQkJCWxvY2F0aW9uICAgCSgyNTU4LCA0OTgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEaXNwYXRjaGVyVHlwZSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM2Ng0KLQkJCWxvY2F0aW9uICAgCSgyNTU4LCA0NDgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTMNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDQ1QjAzNzYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDM2Ng0KLQkJCWxvY2F0aW9uICAgCSgyNTU4LCA1NTkpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAkyNjApDQotCQkgICAgd2lkdGggICAgICAJMzc0DQotCQkgICAgaGVpZ2h0ICAgICAJMzc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCIgQDM2Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU1MywgMTE4OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM2Nw0KLQkJCWxvY2F0aW9uICAgCSgxMzc0LCAxMTEwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25Hcm91cCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTA5NDk1NTkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNTc3ODA0Mg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgd2lkdGggICAgICAJMzc2DQotCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlNlcnZsZXQyLjQgLSBTZWN1cml0eSINCi0JICAgIHF1aWQgICAgICAgCSIzOTk4MjlDRDAxOTciDQotCSAgICB0aXRsZSAgICAgIAkiU2VydmxldDIuNCAtIFNlY3VyaXR5Ig0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IE5vdGVWaWV3IEAzNjgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEwNCwgNzA0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM2OA0KLQkJCWxvY2F0aW9uICAgCSg4MjUsIDY0MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1MjINCi0JCQlsYWJlbCAgICAgIAkiU2VlIGNvbW1vbjo6U2VjdXJpdHkgZGlhZ3JhbSBmb3IgZnVydGhlciBkZXRhaWxzLiIpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODMzDQotCQkgICAgd2lkdGggICAgICAJNTgyDQotCQkgICAgaGVpZ2h0ICAgICAJMTM4KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkiIEAzNjkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDU2LCAzNjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzY5DQotCQkJbG9jYXRpb24gICAJKDkxOSwgMjg5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTI3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUnVuQXNTcGVjaWZpZWRJZGVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5QkYyQzlFMDJDOCINCi0JCSAgICB3aWR0aCAgICAgIAkyOTINCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMzcwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMzY4DQotCQkgICAgc3VwcGxpZXIgICAJQDM2OQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMDkzLCA2MzQpDQotCQkJKDEwNjgsIDQ1OSkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d2ViYXBwbGljYXRpb246OlNlcnZsZXQiIEAzNzENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMjAsIDM1MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNzENCi0JCQlsb2NhdGlvbiAgIAkoMjM5LCAzMDYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZXJ2bGV0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhDMDc5MTQwMjUxIg0KLQkJICAgIGhlaWdodCAgICAgCTExNw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQyIiBAMzcyDQotCQkgICAgbG9jYXRpb24gICAJKDY2MCwgMzQ3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMyNzY4DQotCQkgICAgcXVpZHUgICAgICAJIjM5OTgyQTJFMDI1NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJydW5BcyIgQDM3Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM3Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzQwLCAtNSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzQNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNzMNCi0JCQkJbG9jYXRpb24gICAJKDgwMywgMzA2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTM2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitydW5BcyINCi0JCQkJcGN0RGlzdCAgICAJMC41NzI4MTYNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk5ODJBMkYwMTg0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzcyDQotCQkJICAgIHN1cHBsaWVyICAgCUAzNjkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2NjAsIDM0NykNCi0JCQkJKDkxMCwgMzQ3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY2MCwgMzQ3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTEwLCAzNDcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoODQ3LCAzODMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc0NzU3Mw0KLQkJCQloZWlnaHQgICAgIAkzNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDMiIEAzNzYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNzINCi0JCQkgICAgbG9jYXRpb24gICAJKDM0MCwgLTUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzk5ODJBMkYwMThFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzcyDQotCQkJICAgIHN1cHBsaWVyICAgCUAzNzENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2NjAsIDM0NykNCi0JCQkJKDQxMCwgMzQ3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY2MCwgMzQ3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDEwLCAzNDcpKSkpDQotCQkob2JqZWN0IExhYmVsIEAzNzcNCi0JCSAgICBsb2NhdGlvbiAgIAkoODAsIDgwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJICAgIG1heF93aWR0aCAgCTExNzMNCi0JCSAgICBsYWJlbCAgICAgIAkiU2VydmxldCAyLjMgaGFzIGludHJvZHVjZWQgUnVuQXMgc2VjdXJpdHkgaWRlbnRpdHkgZm9yIFNlcnZsZXRzOiIpKSkpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dlYnNlcnZpY2UtajJlZS5tZGwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93ZWJzZXJ2aWNlLWoyZWUubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMwMDNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dlYnNlcnZpY2UtajJlZS5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4OTI4ICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3IgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiSURFIgotCSAgICB2YWx1ZSAgICAgIAkiSW50ZXJuYWwgRWRpdG9yIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIgotCSAgICB2YWx1ZSAgICAgIAkiIikpCi0gICAgcXVpZCAgICAgICAJIjNFMTA5RTg4MDMwRiIKLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDAKLQl0b3BNYXJnaW4gIAkwLjI1MDAwMAotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDAKLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDAKLQljbGlwSWNvbkxhYmVscyAJVFJVRQotCWF1dG9SZXNpemUgCVRSVUUKLQlzbmFwVG9HcmlkIAlUUlVFCi0JZ3JpZFggICAgICAJMTYKLQlncmlkWSAgICAgIAkxNgotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQKLQkgICAgc2l6ZSAgICAgICAJMTAKLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCSAgICBib2xkICAgICAgIAlGQUxTRQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCSAgICBjb2xvciAgICAgIAkwCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0Jc2hvd01lc3NhZ2VOdW0gCTEKLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikKLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyIKLQlxdWlkICAgICAgIAkiM0UxMDlFODgwMzExIgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0UxMDlFOEEwMTc4IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciCi0JcXVpZCAgICAgICAJIjNFMTA5RTg4MDMxMCIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciCi0JcXVpZHUgICAgICAJIjNFMTA5RTg4MDMxMiIKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3c2NvbW1vbiIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFx3c2NvbW1vbi5jYXQiCi0JCXF1aWQgICAgICAgCSIzRTE1QjRDMDAxNkYiKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqYXhycGNtYXAiCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcamF4cnBjbWFwLmNhdCIKLQkJcXVpZCAgICAgICAJIjNFMTYxRkE5MDI2NiIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzZGQiCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcd3NkZC5jYXQiCi0JCXF1aWQgICAgICAgCSIzRTEwOUVBRDAzMTkiKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJjb21tb24iCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZVxccm9zZVxcY29tbW9uLmNhdCIKLQkJcXVpZCAgICAgICAJIjM4QzA4RjBGMDM4RCIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImphdmEiCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuamVtXFxyb3NlXFxlZG9jamF2YTIuY2F0IgotCQlxdWlkICAgICAgIAkiMzY1NDlGMkMwMDRFIikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZWNvcmUiCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2UuZW1mLmVjb3JlXFxzcmMtZWNvcmVcXG1vZGVsXFxvcmcuZWNsaXBzZS5lbWYuRWNvcmUuY2F0IgotCQlxdWlkICAgICAgIAkiMzlBNUVEMDQwMDRFIikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZWpiIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmVcXHJvc2VcXGVqYnNjaGVtYS5jYXQiCi0JCXF1aWQgICAgICAgCSIzNzgwRTI3MjAzMkQiKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3ZWJhcHBsaWNhdGlvbiIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFx3ZWJhcHBsaWNhdGlvbi5jYXQiCi0JCXF1aWQgICAgICAgCSIzOEMwNzZENjAzREQiKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3c2NsaWVudCIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFx3ZWJzZXJ2aWNlc19jbGllbnRfMV8wLmNhdCIKLQkJcXVpZCAgICAgICAJIjNFNEQyRjRCMDJBQSIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImpzcCIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlXFxyb3NlXFxqc3BfMl8wLmNhdCIKLQkJcXVpZCAgICAgICAJIjNFNEQ0RjY5MDM2QiIpKQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNFMTVCNDdEMDJFMCIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmNvbW1vbiIgQDEKLQkJCWxvY2F0aW9uICAgCSg2ODgsIDc2OCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMQotCQkJICAgIGxvY2F0aW9uICAgCSg1NDQsIDY4NCkKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJImNvbW1vbiIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiMzhDMDhGMEYwMzhEIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjplY29yZSIgQDIKLQkJCWxvY2F0aW9uICAgCSgxMTA0LCA0OTYpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTYwLCA0MTIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJlY29yZSIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjplamIiIEAzCi0JCQlsb2NhdGlvbiAgIAkoMTEwNCwgNDk2KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzCi0JCQkgICAgbG9jYXRpb24gICAJKDk2MCwgNDYyKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiZWpiIikKLQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzCi0JCQkgICAgbG9jYXRpb24gICAJKDk2MCwgNDEyKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSI8PG1ldGFtb2RlbD4+IikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzNzgwRTI3MjAzMkQiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyIKLQlxdWlkICAgICAgIAkiM0UxMDlFODgwMzEyIgotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzRTEwOUU4QTAxNzciCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3NlcwotCXF1aWQgICAgICAgCSIzRTEwOUU4ODAzMTMiCi0JUHJvY3NORGV2cyAJKGxpc3QKLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyIKLQkJcXVpZCAgICAgICAJIjNFMTA5RTg4MDMxNSIKLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMKLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5oIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIgotCQkJdmFsdWUgICAgICAJOCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJLTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIgotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciIKLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjEiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMyIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjQiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI1IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVCYWNrdXBGaWxlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzIgotCQkJdmFsdWUgICAgICAJKCJDb21tZW50UnVsZXNTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIHN5bmNocm9uaXplIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUmV2ZXJzZSBlbmdpbmVlcmluZyBvbmx5IgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOZXZlciBzeW5jaHJvbml6ZSIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTQpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCS0yKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyIKLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VzIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJTYW1lIGFzIG1vZGVsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIxIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMiIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjMiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI0IgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSBGaXJzdCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJOZXZlciBnZW5lcmF0ZSBtb2RlbCBJRHMiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlQmFja3VwRmlsZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlcyIKLQkJCXZhbHVlICAgICAgCSgiQ29tbWVudFJ1bGVzU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyBzeW5jaHJvbml6ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlJldmVyc2UgZW5naW5lZXJpbmcgb25seSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgc3luY2hyb25pemUiCi0JCQkJdmFsdWUgICAgICAJNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHkiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyU291cmNlRmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQm9keVNvdXJjZUZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFOU0kgQysrIEV2ZW50IFdhdGNoZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFOU0lDb252ZXJ0IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQURBODNfU09VUkNFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NBY2Nlc3MiCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0MykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlBvbHltb3JwaGljVW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJIYW5kbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZUFjY2VzcyIKLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4IgotCQkJdmFsdWUgICAgICAJIkFfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSJUaGlzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJGcmVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0VxdWFsaXR5T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZUVxdWFsaXR5T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzVGFzayIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiTGltaXRlZFByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTW9kZSIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiU3BlYyIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciCi0JCQkJdmFsdWUgICAgICAJMjIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCIKLQkJCQl2YWx1ZSAgICAgIAkyMzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkluIgotCQkJCXZhbHVlICAgICAgCTIwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiT3V0IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiSW5PdXQiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvblJldHVybiIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk1vZGUiCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIzMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiCi0JCQkJdmFsdWUgICAgICAJMjMyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJJbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkluT3V0IgotCQkJCXZhbHVlICAgICAgCTIwMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSIKLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiCi0JCQkJdmFsdWUgICAgICAJMjMzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJBZnRlciIKLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSIKLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIgotCQkJCXZhbHVlICAgICAgCTIzMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSIKLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSIKLQkJCQl2YWx1ZSAgICAgIAkyMzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIgotCQkJCXZhbHVlICAgICAgCTIzNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJVc2VDb2xvbk5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE5NV9TT1VSQ0UiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVJbXBsZW1lbnRhdGlvblNldCIgMjA4KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2wiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29udHJvbGxlZF8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZURlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7Y2xhc3N9X1JlY29yZF9LaW5kcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzTGltaXRlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQ2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTWF5YmVBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IiAxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmVudENsYXNzTmFtZSIKLQkJCXZhbHVlICAgICAgCSJTdXBlcmNsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4IgotCQkJdmFsdWUgICAgICAJIkFfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7YWNjZXNzX3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5SW5kZXhEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIlRoaXMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb3B5IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUeXBlRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUVxdWFsaXR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3F1b3RlfT0ke3F1b3RlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlRhZ2dlZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlY29yZCIKLQkJCQl2YWx1ZSAgICAgIAkyMTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk1peGluIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJUYXNrIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpcGxlVHlwZXMiCi0JCQkJdmFsdWUgICAgICAJMjEzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVW5jb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMjI1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbml0aWFsaXphdGlvbk9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjI2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMjcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkyMjgpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiCi0JCQkJdmFsdWUgICAgICAJMjI5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBdXRvIgotCQkJCXZhbHVlICAgICAgCTIzMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmNvbXBsZXRlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiSW5jb21wbGV0ZVR5cGVTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0MykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluY29tcGxldGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTm9EaXNjcmltaW5hbnRQYXJ0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlVua25vd25EaXNjcmltaW5hbnRQYXJ0IgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIktub3duRGlzY3JpbWluYW50UGFydCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNQcml2YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGluZyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTW9kZSIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJDbGFzc1dpZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW50cnlCYXJyaWVyQ29uZGl0aW9uIgotCQkJdmFsdWUgICAgICAJIlRydWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTcGVjIgotCQkJCXZhbHVlICAgICAgCTIyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmdBc0JvZHkiCi0JCQkJdmFsdWUgICAgICAJMjMxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCIKLQkJCQl2YWx1ZSAgICAgIAkyMzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluIgotCQkJCXZhbHVlICAgICAgCTIwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiT3V0IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW5PdXQiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJNb2RlIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMzIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0IgotCQkJCXZhbHVlICAgICAgCTIzMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW4iCi0JCQkJdmFsdWUgICAgICAJMjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJPdXQiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2VzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIgotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSIKLQkJCQl2YWx1ZSAgICAgIAkyMzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIgotCQkJCXZhbHVlICAgICAgCTIzNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiCi0JCQkJdmFsdWUgICAgICAJMjE2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyMTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Q2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIgotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIgotCQkJCXZhbHVlICAgICAgCTIzMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Q2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIgotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiCi0JCQkJdmFsdWUgICAgICAJMjMzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBZnRlciIKLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50IgotCQkJCXZhbHVlICAgICAgCTIxNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjE3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Q2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIGNvZGUvd2Vic2VydmljZS93ZWJzZXJ2aWNlLWoyZWUubWRsLCBXQ0NNLkoyRUUuV0VCU0VSVklDRVMsIFdDQ00sIDYuMC4wLXRkLWgiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBjb2RlL3dlYnNlcnZpY2Uvd2Vic2VydmljZS1qMmVlLm1kbCwgV0NDTS5KMkVFLldFQlNFUlZJQ0VTLCBXQ0NNLCA2LjAuMC10ZC1oIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9yZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJInByb2plY3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJWaWV3Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNQUGFja2FnZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJKb2luQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEb21haW5QcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGF0YWJhc2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEZWF1bHQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkJ1ZmZlclBvb2wiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiCi0JCQl2YWx1ZSAgICAgIAkxKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJlZmV0Y2hTaXplIgotCQkJdmFsdWUgICAgICAJMSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhZ2VTaXplIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyTGlzdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtU2NoZW1hIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb290RG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWFQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEQk1TIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNWaWV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTUFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29ycmVsYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGVja09wdGlvbiIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NuYXBTaG90IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0lkZW50aXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOYXRpdmUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT0lEIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSZWxhdGlvbnNoaXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSSU1ldGhvZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUcmlnZ2VyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1N0b3JlZFByb2NlZHVyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNDbHVzdGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGaWxsRmFjdG9yIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIktleUxpc3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoZWNrUHJlZGljYXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmZXJhbE1vZGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDaGVja1RpbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luc2VydEV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZUV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RlbGV0ZUV2ZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZPbGRUYWJsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmTmV3VGFibGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk9sZFJvdyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmTmV3Um93IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1JvdyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiV2hlbkNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGFuZ3VhZ2UiCi0JCQl2YWx1ZSAgICAgIAkiU1FMIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByb2NUeXBlIgotCQkJdmFsdWUgICAgICAJIlByb2NlZHVyZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RldGVybWluaXN0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlclN0eWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5lZE51bGwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtZXRlciIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5QYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNPdXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIgQ29tbXVuaWNhdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEZXBsb3kiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImZyYW1ld29yayIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb290RGlyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVByZWZpeGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOb3RTaG93Um9zZUlERGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2hvd0NvZGVnZW5EbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJvc2VJRCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2MiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFJldHVybkxpbmUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVKYXZhRG9jVGFncyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNIgotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVmZXJlbmNlQ2xhc3NwYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN1biIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTWljcm9zb2Z0IgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJJQk0iCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVkFKYXZhV29ya2luZ0ZvbGRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkibV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkic18iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJInZvaWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiCi0JCQl2YWx1ZSAgICAgIAkzKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1NpbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1ZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlbW90ZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlbW90ZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkhvbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJIb21lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbFN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5U3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRFRETG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RFRETG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUNvbnRyb2wiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NTZWxlY3RlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3RTb3VyY2VSb290IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NDb21tZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiX0lEIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uT2ZSRUZTIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIgotCQkJdmFsdWUgICAgICAJKCJNZXRob2RLaW5kU2V0IiAxOTAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPdmVybG9hZElEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTZWxmaXNoIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJFdmVudFNldCIgMTYwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRm9yRWFjaFNldCIgMTcwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlcldoZW5DbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTkwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMTkwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcGVyYXRvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlRyaWdnZXIiCi0JCQkJdmFsdWUgICAgICAJMTkwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIgotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJBRlRFUiIKLQkJCQl2YWx1ZSAgICAgIAkxODAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSIKLQkJCQl2YWx1ZSAgICAgIAkxODAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiCi0JCQkJdmFsdWUgICAgICAJMTgwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlJPVyIKLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCIKLQkJCQl2YWx1ZSAgICAgIAkxNzAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCIKLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIjIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIjYiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1ByaW1hcnlLZXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ29tcG9uZW50VGVzdCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlRvcExpbmsiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIlR5cGVLaW5kcyIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImVudW0iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkicmVjb3JkIgotCQkJCXZhbHVlICAgICAgCTEwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIm1vZHVsZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJpbnRlcmZhY2UiCi0JCQkJdmFsdWUgICAgICAJMTAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiZGlzcGludGVyZmFjZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJjb2NsYXNzIgotCQkJCXZhbHVlICAgICAgCTEwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImFsaWFzIgotCQkJCXZhbHVlICAgICAgCTEwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJInVuaW9uIgotCQkJCXZhbHVlICAgICAgCTEwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIm1heCIKLQkJCQl2YWx1ZSAgICAgIAkxMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJraW5kIgotCQkJdmFsdWUgICAgICAJKCJUeXBlS2luZHMiIDEwOSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ1dWlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiZGxsbmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYWxpYXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJmaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkibGlicmFyeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidXVpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJsY2lkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmdTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIxOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIyMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQmFzZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIihub25lKSIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIwIgotCQkJCXZhbHVlICAgICAgCTIyMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIjEiCi0JCQkJdmFsdWUgICAgICAJMjI0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIgotCQkJdmFsdWUgICAgICAJKCJCYXNlU2V0IiAyMjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSIKLQkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmciCi0JCQl2YWx1ZSAgICAgIAkoIkluc3RhbmNpbmdTZXQiIDIxOSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJUZXh0IgotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEJvZHkiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJ5VmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCeVJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlBhcmFtQXJyYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcG9ydFJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUXVpY2tJbXBvcnQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wb3J0QmluYXJ5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJXZWIgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVudGl0eV9TeXN0ZW1JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVudGl0eV9QdWJsaWNJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJJbnRlcm5hbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyRW50aXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxFbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9TeXN0ZW1JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1B1YmxpY0lEIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RGVjbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQXNzaWduIEFsbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudFBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImNsYXNzaWZpZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sQ29udGVudEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRlbnRLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiQ29udGVudEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVtcHR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJNaXhlZCIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50T25seSIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkib3BlcmF0aW9uTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0lEIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJyZWZlcmVuY2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRmVhdHVyZUtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJGZWF0dXJlS2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkF0dHJpYnV0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbGVtZW50IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSZXF1aXNpdGVQcm8iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlNvREEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlIyRWRpdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjIuMV9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2UoJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2UoJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMy4wX19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgY29kZS93ZWJzZXJ2aWNlL3dlYnNlcnZpY2UtajJlZS5tZGwsIFdDQ00uSjJFRS5XRUJTRVJWSUNFUywgV0NDTTYwVEQiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgY29kZS93ZWJzZXJ2aWNlL3dlYnNlcnZpY2UtajJlZS5tZGwsIFdDQ00uSjJFRS5XRUJTRVJWSUNFUywgV0NDTTYwVEQiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFic3RyYWN0Qm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTcGVjaWFsRGVjbFJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kZW50IgotCQkJdmFsdWUgICAgICAJMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5IgotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiCi0JCQkJdmFsdWUgICAgICAJNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciIKLQkJCQl2YWx1ZSAgICAgIAk3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1EaXJlY3Rpb25UeXBlU2V0IiAxMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJQYXJhbURpcmVjdGlvblR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJImluIgotCQkJCXZhbHVlICAgICAgCTEwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiaW5vdXQiCi0JCQkJdmFsdWUgICAgICAJMTAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJvdXQiCi0JCQkJdmFsdWUgICAgICAJMTA0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2OSIpKQotCXF1aWQgICAgICAgCSIzRTEwOUU4ODAzMTQiKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dlYnNlcnZpY2VzX2NsaWVudF8xXzAuY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2Uvd2Vic2VydmljZXNfY2xpZW50XzFfMC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NDBjZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2Uvd2Vic2VydmljZXNfY2xpZW50XzFfMC5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxODE1ICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3c2NsaWVudCIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJXZWJzZXJ2aWNlX2NsaWVudCIpKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZSIpKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkgICAgbmFtZSAgICAgICAJIm5zVVJJIgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAid2Vic2VydmljZV9jbGllbnQueG1pIikpKQotICAgIHF1aWQgICAgICAgCSIzRTREMkY0QjAyQUEiCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3MgIlNlcnZpY2VSZWYiCi0JICAgIHF1aWQgICAgICAgCSIzRTREMkY1NjAxODQiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViCi18ICAgIHNlcnZpY2UuIEl0IGNvbnRhaW5zIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBkaXNwbGF5IG5hbWUgYW5kCi18ICAgIGljb25zLCBhIGRlY2xhcmF0aW9uIG9mIHRoZSByZXF1aXJlZCBTZXJ2aWNlIGludGVyZmFjZSwKLXwgICAgYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0Ci18ICAgIG9mIEpBWC1SUEMgbWFwcGluZ3MsIGFuIG9wdGlvbmFsIFFOYW1lIGZvciB0aGUgc2VydmljZSBlbGVtZW50LAotfCAgICBhbiBvcHRpb25hbCBzZXQgb2YgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIGJlIHJlc29sdmVkCi18ICAgIGJ5IHRoZSBjb250YWluZXIgdG8gYSBXU0RMIHBvcnQsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgaGFuZGxlcnMuCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAyM0FGMkMwMDFDIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VydmljZVJlZk5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDJGRDMwMUExIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHNlcnZpY2UtcmVmLW5hbWUgZWxlbWVudCBkZWNsYXJlcyBsb2dpY2FsIG5hbWUgdGhhdCB0aGUKLXwgICAgICAgIGNvbXBvbmVudHMgaW4gdGhlIG1vZHVsZSB1c2UgdG8gbG9vayB1cCB0aGUgV2ViIHNlcnZpY2UuIEl0Ci18ICAgICAgICBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzZXJ2aWNlIHJlZmVyZW5jZSBuYW1lcyBzdGFydCB3aXRoCi18ICAgICAgICAic2VydmljZS8iLgotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndzZGxGaWxlIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMDA1MDE5OSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfCBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIFVSSSBsb2NhdGlvbiBvZiBhIFdTREwgZmlsZS4gVGhlCi18ICAgICAgICBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlLgotCQkgICAgCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF4cnBjTWFwcGluZ0ZpbGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMwMUMwM0NEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIGpheHJwYy1tYXBwaW5nLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdAotfCAgICAgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQotfCAgICAgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCi18ICAgICAgICBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlIGZpbGUuCi0JCSAgICAKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUG9ydENvbXBvbmVudFJlZiIKLQkgICAgcXVpZCAgICAgICAJIjNFNEQzMEQ5MDNBNyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLXwgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLXwgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotfCAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi18ICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQkgICAgCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBvcnRDb21wb25lbnRMaW5rIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMTIyMDM0OCIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBwb3J0LWNvbXBvbmVudC1saW5rIGVsZW1lbnQgbGlua3MgYSBwb3J0LWNvbXBvbmVudC1yZWYgdG8gYQotfCAgICAgICAgc3BlY2lmaWMgcG9ydC1jb21wb25lbnQgcmVxdWlyZWQgdG8gYmUgbWFkZSBhdmFpbGFibGUgYnkgYSBzZXJ2aWNlCi18ICAgICAgICByZWZlcmVuY2UuCi18Ci18ICAgICAgICBUaGUgdmFsdWUgb2YgYSBwb3J0LWNvbXBvbmVudC1saW5rIG11c3QgYmUgdGhlIHBvcnQtY29tcG9uZW50LW5hbWUKLXwgICAgICAgIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlIG9yIGFub3RoZXIgbW9kdWxlIGluIHRoZSBzYW1lCi18ICAgICAgICBhcHBsaWNhdGlvbiB1bml0LiBUaGUgc3ludGF4IGZvciBzcGVjaWZpY2F0aW9uIGZvbGxvd3MgdGhlIHN5bnRheAotfCAgICAgICAgZGVmaW5lZCBmb3IgZWpiLWxpbmsgaW4gdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJICAgIAotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJIYW5kbGVyIgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMxNjQwMDcyIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLXwgICAgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmCi18ICAgIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQKLXwgICAgd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi18Ci18ICAgIFVzZWQgaW46IHNlcnZpY2UtcmVmCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAyM0IwMDgwMDA1IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaGFuZGxlck5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMxRUQwMDk3IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgbW9kdWxlLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic29hcFJvbGVzIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMjY2MDI4NSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdCB0aGUgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLiIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwb3J0TmFtZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMyOEEwMzMxIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBwb3J0LW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBXU0RMIHBvcnQtbmFtZSB0aGF0IGEgaGFuZGxlciBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoLiIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiV2ViU2VydmljZXNDbGllbnQiCi0JICAgIHF1aWQgICAgICAgCSIzRjJFQjMwOTAyNjciCi0JICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQiKQotCShvYmplY3QgQ2xhc3MgIkNvbXBvbmVudFNjb3BlZFJlZnMiCi0JICAgIHF1aWQgICAgICAgCSIzRjJFQjQyQTAwQUEiCi0JICAgIGRvY3VtZW50YXRpb24gCSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbXBvbmVudE5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0YyRUI0NTQwMTVGIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCIKLQkgICAgcXVpZCAgICAgICAJIjNFNEQzMTA3MDBFNiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMTA4MDM1NCIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKLXwgICAgICAgIEphdmEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBvZiBhCi18ICAgICAgICBXU0RMIHBvcnQuCi0JCSAgICAKLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzEwODAzNzIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6UG9ydENvbXBvbmVudFJlZiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzBEOTAzQTciKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiIKLQkgICAgcXVpZCAgICAgICAJIjNFNEQzMTNDMDM5RiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicG9ydENvbXBvbmVudFJlZnMiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMxM0QwMjU2IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLXwgICAgICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi18ICAgICAgICB0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci18ICAgICAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi18ICAgICAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0JCSAgICAKLQkJICAgIGxhYmVsICAgICAgCSJwb3J0Q29tcG9uZW50UmVmcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpQb3J0Q29tcG9uZW50UmVmIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMEQ5MDNBNyIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzEzRDAyNjAiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkY1NjAxODQiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0IgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMxNkUwMzFGIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJoYW5kbGVycyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzE2RjAyNTgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXwgRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlCi18ICAgICAgICBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKLXwgICAgICAgIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQKLXwgICAgICAgIHdpdGggYWxsIHBvcnRzIG9mIHRoZSBzZXJ2aWNlLgotCQkgICAgCi0JCSAgICBsYWJlbCAgICAgIAkiaGFuZGxlcnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6SGFuZGxlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzE2NDAwNzIiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMxNkYwMjYyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlNlcnZpY2VSZWYiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGNTYwMTg0IgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiIKLQkgICAgcXVpZCAgICAgICAJIjNFNEQzMUY5MDEyQSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiaGFuZGxlckNsYXNzIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMUZBMDI4MCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJEZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uLiIKLQkJICAgIGxhYmVsICAgICAgCSJoYW5kbGVyQ2xhc3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzFGQTAyQTgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6SGFuZGxlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzE2NDAwNzIiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCIKLQkgICAgcXVpZCAgICAgICAJIjNFNEQzMjIxMDAyRCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiaW5pdFBhcmFtcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzIyMTAxRTYiCi0JCSAgICBsYWJlbCAgICAgIAkiaW5pdFBhcmFtcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UGFyYW1WYWx1ZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTRDMjIxMjAyQzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMyMjEwMUU4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OkhhbmRsZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxNjQwMDcyIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAiCi0JICAgIHF1aWQgICAgICAgCSIzRjJFQjQ4RTAyNzEiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImNvbXBvbmVudFNjb3BlZFJlZnMiCi0JCSAgICBxdWlkICAgICAgIAkiM0YyRUI0OTEwMjc1IgotCQkgICAgbGFiZWwgICAgICAJImNvbXBvbmVudFNjb3BlZFJlZnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6Q29tcG9uZW50U2NvcGVkUmVmcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjJFQjQyQTAwQUEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExIgotCQkgICAgcXVpZCAgICAgICAJIjNGMkVCNDkxMDI3NyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpXZWJTZXJ2aWNlc0NsaWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjJFQjMwOTAyNjciCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMiIKLQkgICAgcXVpZCAgICAgICAJIjNGMkVCNTI0MDNENSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAic2VydmljZVJlZnMiCi0JCSAgICBxdWlkICAgICAgIAkiM0YyRUI1MjcwMTU4IgotCQkgICAgbGFiZWwgICAgICAJInNlcnZpY2VSZWZzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlNlcnZpY2VSZWYiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGNTYwMTg0IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMyIKLQkJICAgIHF1aWQgICAgICAgCSIzRjJFQjUyNzAxNkMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6Q29tcG9uZW50U2NvcGVkUmVmcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjJFQjQyQTAwQUEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNCIKLQkgICAgcXVpZCAgICAgICAJIjNGMkVCNTlCMDA2RiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAic2VydmljZVJlZnMiCi0JCSAgICBxdWlkICAgICAgIAkiM0YyRUI1OUIwMzU0IgotCQkgICAgbGFiZWwgICAgICAJInNlcnZpY2VSZWZzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlNlcnZpY2VSZWYiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGNTYwMTg0IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNSIKLQkJICAgIHF1aWQgICAgICAgCSIzRjJFQjU5QjAzNjgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6V2ViU2VydmljZXNDbGllbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0YyRUIzMDkwMjY3IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYiCi0JICAgIHF1aWQgICAgICAgCSIzRjQzOTJDQzAyRkEiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInNlcnZpY2VRbmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRjQzOTJDRDAyRjEiCi0JCSAgICBsYWJlbCAgICAgIAkic2VydmljZVFuYW1lIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3IgotCQkgICAgcXVpZCAgICAgICAJIjNGNDM5MkNEMDJGQiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpTZXJ2aWNlUmVmIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyRjU2MDE4NCIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4IgotCSAgICBxdWlkICAgICAgIAkiM0Y0MzkzM0MwMkEwIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzb2FwSGVhZGVycyIKLQkJICAgIHF1aWQgICAgICAgCSIzRjQzOTMzRDAxOTMiCi0JCSAgICBsYWJlbCAgICAgIAkic29hcEhlYWRlcnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIgotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkiCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0MzkzM0QwMTlEIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OkhhbmRsZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxNjQwMDcyIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpKQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3NEaWFncmFtICJTZXJ2aWNlIFJlZiIKLQkgICAgcXVpZCAgICAgICAJIjNFNEQzMEEyMDEzMSIKLQkgICAgdGl0bGUgICAgICAJIlNlcnZpY2UgUmVmIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLXwgICAgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmCi18ICAgIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQKLXwgICAgd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi18Ci18ICAgIFVzZWQgaW46IHNlcnZpY2UtcmVmCi0JICAgIAotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMTA1MAotCSAgICBvcmlnaW5feSAgIAkxMzgKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBMYWJlbCBAMQotCQkgICAgbG9jYXRpb24gICAJKDUzLCA1NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTQKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCVRSVUUKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBubGluZXMgICAgIAkxCi0JCSAgICBtYXhfd2lkdGggIAkxMDA2Ci0JCSAgICBsYWJlbCAgICAgIAkiV2ViIFNlcnZpY2VzIENsaWVudCBERCBWMS4xIikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiIEAyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI4MjAsIDE5MTgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDI2NDIsIDE4MzkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzU2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25Hcm91cCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIgotCQkgICAgd2lkdGggICAgICAJMzc0Ci0JCSAgICBoZWlnaHQgICAgIAkxODIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlBvcnRDb21wb25lbnRSZWYiIEAzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDQ2NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMwotCQkJbG9jYXRpb24gICAJKDE2MDcsIDQxNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MzQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQb3J0Q29tcG9uZW50UmVmIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzBEOTAzQTciCi0JCSAgICB3aWR0aCAgICAgIAk0NTIKLQkJICAgIGhlaWdodCAgICAgCTEyNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6Q29tcG9uZW50U2NvcGVkUmVmcyIgQDQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDgwLCAxMTM2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0Ci0JCQlsb2NhdGlvbiAgIAkoMjEyLCAxMDg2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUzNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkNvbXBvbmVudFNjb3BlZFJlZnMiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc0NTcyNwotCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNDJBMDBBQSIKLQkJICAgIHdpZHRoICAgICAgCTU1NAotCQkgICAgaGVpZ2h0ICAgICAJMTI0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpXZWJTZXJ2aWNlc0NsaWVudCIgQDUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAzMDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUKLQkJCWxvY2F0aW9uICAgCSgzNTIsIDI1NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NDgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJXZWJTZXJ2aWNlc0NsaWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2NzQ1NzI3Ci0JCSAgICBxdWlkdSAgICAgIAkiM0YyRUIzMDkwMjY3IgotCQkgICAgd2lkdGggICAgICAJNDY2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMCIgQDYKLQkJICAgIGxvY2F0aW9uICAgCSg1MjcsIDcxOSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNDhFMDI3MSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50U2NvcGVkUmVmcyIgQDcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDYKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE2ODcsIDI5MSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgKLQkJCQlQYXJlbnRfVmlldyAJQDcKLQkJCQlsb2NhdGlvbiAgIAkoNDUzLCA5OTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ0NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2NvbXBvbmVudFNjb3BlZFJlZnMiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNDkxMDI3NSIKLQkJCSAgICBjbGllbnQgICAgIAlANgotCQkJICAgIHN1cHBsaWVyICAgCUA0Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkKLQkJCQlQYXJlbnRfVmlldyAJQDcKLQkJCQlsb2NhdGlvbiAgIAkoNTQ0LCAxMDQzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEiIEAxMAotCQkJICAgIFBhcmVudF9WaWV3IAlANgotCQkJICAgIGxvY2F0aW9uICAgCSgtMTY4NywgMjkxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEKLQkJCQlQYXJlbnRfVmlldyAJQDEwCi0JCQkJbG9jYXRpb24gICAJKDUxOSwgNDMzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzU5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNDkxMDI3NyIKLQkJCSAgICBjbGllbnQgICAgIAlANgotCQkJICAgIHN1cHBsaWVyICAgCUA1Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyCi0JCQkJUGFyZW50X1ZpZXcgCUAxMAotCQkJCWxvY2F0aW9uICAgCSg2MTgsIDQwOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIgQDEzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc2NywgODY4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMwotCQkJbG9jYXRpb24gICAJKDI2MzMsIDgxOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1NgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIHdpZHRoICAgICAgCTI4NgotCQkgICAgaGVpZ2h0ICAgICAJMTI0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDE0Ci0JCSAgICBsb2NhdGlvbiAgIAkoMjU1OCwgNDkxKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxMDcwMEU2IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiIEAxNQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNSwgLTkzKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYKLQkJCQlQYXJlbnRfVmlldyAJQDE1Ci0JCQkJbG9jYXRpb24gICAJKDI5OTksIDY5OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDcwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrc2VydmljZUVuZHBvaW50SW50ZXJmYWNlIgotCQkJCXBjdERpc3QgICAgCTAuNzg2MDcwCi0JCQkJaGVpZ2h0ICAgICAJMjQ5Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxMDgwMzU0IgotCQkJICAgIGNsaWVudCAgICAgCUAxNAotCQkJICAgIHN1cHBsaWVyICAgCUAxMwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyNTU4LCA0OTEpCi0JCQkJKDI3NTAsIDQ5MSkKLQkJCQkoMjc1MCwgODA2KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTU4LCA0OTEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3NTAsIDgwNikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNwotCQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCQlsb2NhdGlvbiAgIAkoMjcxOCwgNjkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjc3NjExOQotCQkJCWhlaWdodCAgICAgCTMzCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDE4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNAotCQkJICAgIGxvY2F0aW9uICAgCSgxNTE1LCAtOTMpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxMDgwMzcyIgotCQkJICAgIGNsaWVudCAgICAgCUAxNAotCQkJICAgIHN1cHBsaWVyICAgCUAzCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjU1OCwgNDkxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDUwLCA0OTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpQYXJhbVZhbHVlIiBAMTkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg4NywgMjU3MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTkKLQkJCWxvY2F0aW9uICAgCSgxNjU1LCAyNDE2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ2NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBhcmFtVmFsdWUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMjYzMjI1NgotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMjEyMDJDMSIKLQkJICAgIHdpZHRoICAgICAgCTQ4MgotCQkgICAgaGVpZ2h0ICAgICAJMzMyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpTZXJ2aWNlUmVmIiBAMjAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgMTEyMCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjAKLQkJCWxvY2F0aW9uICAgCSgxNjk0LCAxMDcwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI2MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNlcnZpY2VSZWYiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyRjU2MDE4NCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDIwCi0JCQlsb2NhdGlvbiAgIAkoMTY5NCwgMTEzMSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk0Ci0JCQltYXhfd2lkdGggIAkwKQotCQkgICAgd2lkdGggICAgICAJMjc4Ci0JCSAgICBoZWlnaHQgICAgIAkxMjQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMjEKLQkJICAgIGxvY2F0aW9uICAgCSgxODI0LCA3OTEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzEzQzAzOUYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInBvcnRDb21wb25lbnRSZWZzIiBAMjIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxCi0JCQkgICAgbG9jYXRpb24gICAJKDc1OSwgLTM4NykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzCi0JCQkJUGFyZW50X1ZpZXcgCUAyMgotCQkJCWxvY2F0aW9uICAgCSgxNjE4LCA2MjIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTM4MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BvcnRDb21wb25lbnRSZWZzIgotCQkJCXBjdERpc3QgICAgCTAuNjQzMDgwCi0JCQkJaGVpZ2h0ICAgICAJMjA3Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxM0QwMjU2IgotCQkJICAgIGNsaWVudCAgICAgCUAyMQotCQkJICAgIHN1cHBsaWVyICAgCUAzCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Ci0JCQkJUGFyZW50X1ZpZXcgCUAyMgotCQkJCWxvY2F0aW9uICAgCSgxODkyLCA1OTkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuNzI2MDgwCi0JCQkJaGVpZ2h0ICAgICAJNjgKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMjUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxCi0JCQkgICAgbG9jYXRpb24gICAJKDc1OSwgLTM4NykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzEzRDAyNjAiCi0JCQkgICAgY2xpZW50ICAgICAJQDIxCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBAMjYKLQkJICAgIGxvY2F0aW9uICAgCSgyMzcwLCAxMDYwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyRkUxMDFGQyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiIiBAMjcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkgICAgbG9jYXRpb24gICAJKDc1MCwgOTQwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjgKLQkJCQlQYXJlbnRfVmlldyAJQDI3Ci0JCQkJbG9jYXRpb24gICAJKDIwNDUsIDEwMTkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0NTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGRTQwMTRDIgotCQkJICAgIGNsaWVudCAgICAgCUAyNgotCQkJICAgIHN1cHBsaWVyICAgCUAyMAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzNzAsIDEwNjApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5NjMsIDEwNjApKQotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmljZUludGVyZmFjZSIgQDI5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNgotCQkJICAgIGxvY2F0aW9uICAgCSg3NTAsIDk0MCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQotCQkJCWxvY2F0aW9uICAgCSgyMjk2LCAxMTY4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMDQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2aWNlSW50ZXJmYWNlIgotCQkJCXBjdERpc3QgICAgCS0wLjE4NTQ4NAotCQkJCWhlaWdodCAgICAgCTEwOAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQyRkU0MDEyRSIKLQkJCSAgICBjbGllbnQgICAgIAlAMjYKLQkJCSAgICBzdXBwbGllciAgIAlAMTMKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMjM3MCwgMTA2MCkKLQkJCQkoMjY0NywgMTA2MCkKLQkJCQkoMjY0NywgOTMwKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzcwLCAxMDYwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjQ3LCA5MzApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEKLQkJCQlQYXJlbnRfVmlldyAJQDI5Ci0JCQkJbG9jYXRpb24gICAJKDI3MDEsIDk3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIiIEAzMgotCQkgICAgbG9jYXRpb24gICAJKDEyMjAsIDExMjYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjJFQjUyNDAzRDUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZpY2VSZWZzIiBAMzMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNTgxLCAtMjApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNAotCQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCQlsb2NhdGlvbiAgIAkoMTU5MCwgMTA4MSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjQwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrc2VydmljZVJlZnMiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNTI3MDE1OCIKLQkJCSAgICBjbGllbnQgICAgIAlAMzIKLQkJCSAgICBzdXBwbGllciAgIAlAMjAKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUKLQkJCQlQYXJlbnRfVmlldyAJQDMzCi0JCQkJbG9jYXRpb24gICAJKDE2MzksIDExNzUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMyIgQDM2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMgotCQkJICAgIGxvY2F0aW9uICAgCSgtMTU4MSwgLTIwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcKLQkJCQlQYXJlbnRfVmlldyAJQDM2Ci0JCQkJbG9jYXRpb24gICAJKDg1MSwgMTA5MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ0NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjJFQjUyNzAxNkMiCi0JCQkgICAgY2xpZW50ICAgICAJQDMyCi0JCQkgICAgc3VwcGxpZXIgICAJQDQKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgKLQkJCQlQYXJlbnRfVmlldyAJQDM2Ci0JCQkJbG9jYXRpb24gICAJKDgwNSwgMTE4NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQiIEAzOQotCQkgICAgbG9jYXRpb24gICAJKDExOTksIDcxMSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNTlCMDA2RiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmljZVJlZnMiIEA0MAotCQkJICAgIFBhcmVudF9WaWV3IAlAMzkKLQkJCSAgICBsb2NhdGlvbiAgIAkoODQzLCA0MjQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MQotCQkJCVBhcmVudF9WaWV3IAlANDAKLQkJCQlsb2NhdGlvbiAgIAkoMTY0NSwgOTUzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2aWNlUmVmcyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyRUI1OUIwMzU0IgotCQkJICAgIGNsaWVudCAgICAgCUAzOQotCQkJICAgIHN1cHBsaWVyICAgCUAyMAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MgotCQkJCVBhcmVudF9WaWV3IAlANDAKLQkJCQlsb2NhdGlvbiAgIAkoMTY0NiwgMTA2NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1IiBANDMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDM5Ci0JCQkgICAgbG9jYXRpb24gICAJKDg0MywgNDI0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQKLQkJCQlQYXJlbnRfVmlldyAJQDQzCi0JCQkJbG9jYXRpb24gICAJKDc1NSwgNDcwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzU5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNTlCMDM2OCIKLQkJCSAgICBjbGllbnQgICAgIAlAMzkKLQkJCSAgICBzdXBwbGllciAgIAlANQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NQotCQkJCVBhcmVudF9WaWV3IAlANDMKLQkJCQlsb2NhdGlvbiAgIAkoNzU0LCAzNTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIiBANDYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoOTM0LCAxODEzKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0NgotCQkJbG9jYXRpb24gICAJKDU4NywgMTYzNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2OTQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJRTmFtZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0YzQkVGNUQwMkMwIgotCQkgICAgd2lkdGggICAgICAJNzEyCi0JCSAgICBoZWlnaHQgICAgIAkzODIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNiIgQDQ3Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTE4MywgMTE4NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNDM5MkNDMDJGQSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmljZVFuYW1lIiBANDgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3Ci0JCQkgICAgbG9jYXRpb24gICAJKC02NDcsIDYzKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkKLQkJCQlQYXJlbnRfVmlldyAJQDQ4Ci0JCQkJbG9jYXRpb24gICAJKDEwNzgsIDE1MjEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NlcnZpY2VRbmFtZSIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y0MzkyQ0QwMkYxIgotCQkJICAgIGNsaWVudCAgICAgCUA0NwotCQkJICAgIHN1cHBsaWVyICAgCUA0NgotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMTgzLCAxMTg0KQotCQkJCSgxMTE5LCAxMTg0KQotCQkJCSgxMTE5LCAxNjIyKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTgzLCAxMTg0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxNjIyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwCi0JCQkJUGFyZW50X1ZpZXcgCUA0OAotCQkJCWxvY2F0aW9uICAgCSgxMTUwLCAxNDU4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjY3NTI5OQotCQkJCWhlaWdodCAgICAgCTMxCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTciIEA1MQotCQkJICAgIFBhcmVudF9WaWV3IAlANDcKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY0NywgNjMpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y0MzkyQ0QwMkZCIgotCQkJICAgIGNsaWVudCAgICAgCUA0NwotCQkJICAgIHN1cHBsaWVyICAgCUAyMAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExODMsIDExODQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2ODUsIDExODQpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OkhhbmRsZXIiIEA1MgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODU2LCAxOTUyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1MgotCQkJbG9jYXRpb24gICAJKDE3NTQsIDE5MDIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjA0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSGFuZGxlciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxNjQwMDcyIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANTIKLQkJCWxvY2F0aW9uICAgCSgxNzU0LCAxOTYzKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTApCi0JCSAgICB3aWR0aCAgICAgIAkyMjIKLQkJICAgIGhlaWdodCAgICAgCTEyNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEA1MwotCQkgICAgbG9jYXRpb24gICAJKDIzODUsIDE0NDcpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzFGOTAxMkEiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImhhbmRsZXJDbGFzcyIgQDU0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA1MwotCQkJICAgIGxvY2F0aW9uICAgCSgxNDA3LCAtNTk0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUKLQkJCQlQYXJlbnRfVmlldyAJQDU0Ci0JCQkJbG9jYXRpb24gICAJKDI2MTMsIDEwMjUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI3NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2hhbmRsZXJDbGFzcyIKLQkJCQlwY3REaXN0ICAgIAkwLjg5NTQwNAotCQkJCWhlaWdodCAgICAgCTE1NAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMUZBMDI4MCIKLQkJCSAgICBjbGllbnQgICAgIAlANTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTMKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMjM4NSwgMTQ0NykKLQkJCQkoMjc2NiwgMTQ0NykKLQkJCQkoMjc2NiwgOTMwKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzg1LCAxNDQ3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzY2LCA5MzApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYKLQkJCQlQYXJlbnRfVmlldyAJQDU0Ci0JCQkJbG9jYXRpb24gICAJKDI4MjAsIDEwMjEpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3IiBANTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDUzCi0JCQkgICAgbG9jYXRpb24gICAJKDE0MDcsIC01OTQpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxRkEwMkE4IgotCQkJICAgIGNsaWVudCAgICAgCUA1MwotCQkJICAgIHN1cHBsaWVyICAgCUA1MgotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyMzg1LCAxNDQ3KQotCQkJCSgxOTMwLCAxNDQ3KQotCQkJCSgxOTMwLCAxODkwKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzg1LCAxNDQ3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTMwLCAxODkwKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOCIgQDU4Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTg4NSwgMjIwOSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMjIxMDAyRCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdFBhcmFtcyIgQDU5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA1OAotCQkJICAgIGxvY2F0aW9uICAgCSg5MDcsIDE2OCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQotCQkJCWxvY2F0aW9uICAgCSgxNzU3LCAyMzA5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbml0UGFyYW1zIgotCQkJCXBjdERpc3QgICAgCTAuNTE1MTUyCi0JCQkJaGVpZ2h0ICAgICAJMTI5Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDMyMjEwMUU2IgotCQkJICAgIGNsaWVudCAgICAgCUA1OAotCQkJICAgIHN1cHBsaWVyICAgCUAxOQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4ODUsIDIyMDkpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4ODUsIDI0MDQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjEKLQkJCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQkJbG9jYXRpb24gICAJKDE5NTgsIDIzNDUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuNjk3OTg3Ci0JCQkJaGVpZ2h0ICAgICAJNzMKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5IiBANjIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Ci0JCQkgICAgbG9jYXRpb24gICAJKDkwNywgMTY4KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMjIxMDFFOCIKLQkJCSAgICBjbGllbnQgICAgIAlANTgKLQkJCSAgICBzdXBwbGllciAgIAlANTIKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxODg1LCAyMjA5KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODg1LCAyMDE0KSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDYzCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc1MCwgMTUzNSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMTZFMDMxRiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaGFuZGxlcnMiIEA2NAotCQkJICAgIFBhcmVudF9WaWV3IAlANjMKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjg1LCAzNTcpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NQotCQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCQlsb2NhdGlvbiAgIAkoMTYwNywgMTc3OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTg2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraGFuZGxlcnMiCi0JCQkJcGN0RGlzdCAgICAJMC42ODUxODUKLQkJCQloZWlnaHQgICAgIAkxNDQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzE2RjAyNTgiCi0JCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCQkgICAgc3VwcGxpZXIgICAJQDUyCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgMTUzNSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgMTg4OSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NgotCQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCQlsb2NhdGlvbiAgIAkoMTgxNywgMTc5NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC43NDA3NDEKLQkJCQloZWlnaHQgICAgIAk2NwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEA2NwotCQkJICAgIFBhcmVudF9WaWV3IAlANjMKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjg1LCAzNTcpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxNkYwMjYyIgotCQkJICAgIGNsaWVudCAgICAgCUA2MwotCQkJICAgIHN1cHBsaWVyICAgCUAyMAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDE1MzUpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDExODEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOCIgQDY4Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTE5NCwgMjAwNykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNDM5MzNDMDJBMCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic29hcEhlYWRlcnMiIEA2OQotCQkJICAgIFBhcmVudF9WaWV3IAlANjgKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY2OCwgNTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MAotCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQlsb2NhdGlvbiAgIAkoODY1LCAyMTIzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNzEKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzb2FwSGVhZGVycyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y0MzkzM0QwMTkzIgotCQkJICAgIGNsaWVudCAgICAgCUA2OAotCQkJICAgIHN1cHBsaWVyICAgCUA0NgotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMTk0LCAyMDA3KQotCQkJCSgxMTM0LCAyMDA3KQotCQkJCSgxMTM0LCAyMTU5KQotCQkJCSg5MDYsIDIxNTkpCi0JCQkJKDkwNiwgMjAwNCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTE5NCwgMjAwNykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTA2LCAyMDA0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxCi0JCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDIwNjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOSIgQDcyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJICAgIGxvY2F0aW9uICAgCSgtNjY4LCA1NCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjQzOTMzRDAxOUQiCi0JCQkgICAgY2xpZW50ICAgICAJQDY4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUyCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTE5NCwgMjAwNykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NSwgMjAwNykpKSkpKSkpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93c2NvbW1vbi5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93c2NvbW1vbi5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTFiNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2Uvd3Njb21tb24uY2F0CisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNTANCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4zLjA0MDcuMjgwMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3c2NvbW1vbiINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIldzY29tbW9uIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkibnNVUkkiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAid3Njb21tb24ueG1pIikpKQ0KLSAgICBxdWlkICAgICAgIAkiM0UxNUI0QzAwMTZGIg0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJJbml0UGFyYW0iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQUM2RTAyODAiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1OYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUyNkM1ODAzNTUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtVmFsdWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QzVEMDAxMyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QzYzMDE3QSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU09BUEhlYWRlciINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNFMTBBQzk5MDIyRiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxEZWZpbmVzIHRoZSBRTmFtZSBvZiBhIFNPQVAgaGVhZGVyIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhlIGhhbmRsZXIuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRjQ2NzE4NzAwNDkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0YzQkVGNUQwMkMwIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNPQVBSb2xlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0UxMEFDQkMwMTY0Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuDQotfA0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic29hcFJvbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFFOUFEMDJENyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiUG9ydE5hbWUiDQotCSAgICBxdWlkICAgICAgIAkiM0UxNUJCQzkwMjA5Ig0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBvcnROYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTE1RTRGNzAwNzYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkRlc2NyaXB0aW9uVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzRjVDQkM2RDAzNTMiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVEREI3RTAwQzEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIikpKQ0KLQkob2JqZWN0IENsYXNzICJEaXNwbGF5TmFtZVR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiM0Y1Q0JDNzgwMjM2Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1RERCODIwMzNEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGlzcGxheU5hbWUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OTIyMDAwRSIpKSkpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2Uvd3NkZC5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93c2RkLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRkNTU3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93c2RkLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDQwMTEgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk1MA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzZGQiDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJXc2RkIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkibnNVUkkiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAid3NkZC54bWkiKSkpDQotICAgIHF1aWQgICAgICAgCSIzRTEwOUVBRDAzMTkiDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIldlYlNlcnZpY2VzIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0UxMDlFRUYwMTJGIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB3ZWJzZXJ2aWNlcyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSB3ZWIgc2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgSXQgc3BlY2lmaWVzIHRoZSBzZXQgb2YgV2ViIHNlcnZpY2UgZGVzY3JpcHRpb25zIHRoYXQgYXJlIHRvIGJlIGRlcGxveWVkIGludG8gdGhlIEoyRUUgQXBwbGljYXRpb24gU2VydmVyIGFuZCB0aGUgZGVwZW5kZW5jaWVzIHRoZXkgaGF2ZSBvbiBjb250YWluZXIgcmVzb3VyY2VzIGFuZCBzZXJ2aWNlcy4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjQwMjNCMEREMDBERCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiV2ViU2VydmljZURlc2NyaXB0aW9uIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0UxMEExNTAwMzEzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgZG9jdW1lbnQgZmlsZSBhbmQgdGhlIHNldCBvZiBQb3J0IGNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBXU0RMIHBvcnRzIGRlZmluZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuICBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBtb2R1bGUuDQotfA0KLXxBbGwgV1NETCBmaWxlIHBvcnRzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcG9ydC1jb21wb25lbnQgZWxlbWVudCBkZWZpbmVkLg0KLXwNCi18VXNlZCBpbjogd2Vic2VydmljZXMNCi18DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXhycGNNYXBwaW5nRmlsZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjZBODEwMTBDIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QThGMDIxQSINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSBpZGVudGlmaWVzIHRoZSBjb2xsZWN0aW9uIG9mIHBvcnQtY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggYSBXU0RMIGZpbGUgYW5kIEpBWC1SUEMgbWFwcGluZy4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuDQotfA0KLXwNCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndzZGxGaWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUyNkFBMjAzOTIiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIFdTREwgZmlsZSBpbiB0aGUgbW9kdWxlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNtYWxsSWNvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1QzkxODIwMDIzIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYXJnZUljb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUM5MTkzMDI3NiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNFNTI2MDE2MyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzcGxheU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNFNTMxMDAzQyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiUG9ydENvbXBvbmVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNFMTBBQjhEMDFGNiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgcG9ydC1jb21wb25lbnQgZWxlbWVudCBhc3NvY2lhdGVzIGEgV1NETCBwb3J0IHdpdGggYSBXZWIgc2VydmljZSBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhIGNvbXBvbmVudCwgb3B0aW9uYWwgZGVzY3JpcHRpb24sIG9wdGlvbmFsIGRpc3BsYXkgbmFtZSwgb3B0aW9uYWwgaWNvbmljIHJlcHJlc2VudGF0aW9ucywgV1NETCBwb3J0IFFOYW1lLCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSwgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuLg0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBvcnRDb21wb25lbnROYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUyNkIxMTAzNDQiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBwb3J0LWNvbXBvbmVudC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEgcG9ydCBjb21wb25lbnQncyBuYW1lLiBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlIG1vZHVsZSBwcm9kdWNlciB0byBuYW1lIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4gaW4gdGhlIG1vZHVsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgYW1vbmcgdGhlIHBvcnQgY29tcG9uZW50IG5hbWVzIGRlZmluZWQgaW4gdGhlIHNhbWUgbW9kdWxlLg0KLXwNCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjZCMTgwMTc3Ig0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBvcnQgY29tcG9uZW50J3MgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UuDQotfA0KLQkJICAgIA0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzbWFsbEljb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUM5MUQxMDM4RCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGFyZ2VJY29uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVDOTFFMzAxOUYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVDRTg1OTAyQkMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRpc3BsYXlOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVDRTg2MjAwNzAiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIldTRExQb3J0Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0UxMEFCQzQwMjA1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlZmluZXMgdGhlIG5hbWUgc3BhY2UgYW5kIGxvY2FsIG5hbWUgcGFydCBvZiB0aGUgV1NETCBwb3J0IFFOYW1lLg0KLXwNCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0MzhDODkwMzYzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UU5hbWUiDQotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTZXJ2aWNlSW1wbEJlYW4iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQUMwQTAwMTYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgZGVmaW5lcyB0aGUgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uQSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNhbiBiZSBhbiBFSkIgYmVhbiBjbGFzcyBvciBKQVgtUlBDIHdlYiBjb21wb25lbnQuIEV4aXN0aW5nIEVKQiBpbXBsZW1lbnRhdGlvbnMgYXJlIGV4cG9zZWQgYXMgYSBXZWIgc2VydmljZSB1c2luZyBhbiBlamItbGluay4NCi18DQotfFVzZWQgaW46IHBvcnQtY29tcG9uZW50DQotfA0KLQkgICAgDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNlcnZsZXRMaW5rIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiRmluYWwiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJICAgIHZhbHVlICAgICAgCVRSVUUpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkgICAgdmFsdWUgICAgICAJVFJVRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIlJlYWRPbmx5Ig0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZEV4dGVuZHMiDQotCQkgICAgdmFsdWUgICAgICAJIiIpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkSW1wbGVtZW50cyINCi0JCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkgICAgdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0UxMEFDMTUwMkUyIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50Lg0KLXwNCi18VGhlIHZhbHVlIG9mIHRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBzZXJ2bGV0LW5hbWUgb2YgYSBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQgaW4gdGhlIHNhbWUgV0FSIGZpbGUuDQotfA0KLXxVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbg0KLXwNCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJICAgIHF1aWQgICAgICAgCSIzRTM5NTNBNTAxMEEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6QmVhbkxpbmsiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMzk1MkU3MDBFQyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlcnZsZXRMaW5rIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExRTkzNTAzOUIiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkVKQkxpbmsiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJGaW5hbCINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkgICAgdmFsdWUgICAgICAJVFJVRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCSAgICB2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkRXh0ZW5kcyINCi0JCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRJbXBsZW1lbnRzIg0KLQkJICAgIHZhbHVlICAgICAgCSIiKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCSAgICB2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQUMyMDAyOEQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhIFdlYiBTZXJ2aWNlIEVuZHBvaW50Lg0KLXwNCi18VGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUuDQotfA0KLXxVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbg0KLXwNCi18RXhhbXBsZXM6DQotfDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+DQotfAk8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+DQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkgICAgcXVpZCAgICAgICAJIjNFMzk1MzhCMDE0QiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpCZWFuTGluayINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UzOTUyRTcwMEVDIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWpiTGluayINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUU5MjQwMDk1Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJIYW5kbGVyIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0UxMEFDM0IwMUQ2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4NCi18DQotfFVzZWQgaW46IHBvcnQtY29tcG9uZW50DQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQUZBMDAwN0QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCINCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaGFuZGxlck5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QkZFMDM0OCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaGFuZGxlckNsYXNzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUyNkMwNTAxMDMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkJlYW5MaW5rIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0UzOTUyRTcwMEVDIg0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgcXVpZCAgICAgICAJIjNFMTFCRDY5MDBFOCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJ3c2RsUG9ydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUJENkEwMzRDIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3c2RsUG9ydCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpXU0RMUG9ydCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCQzQwMjA1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUJENkEwMzU2Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlBvcnRDb21wb25lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQjhEMDFGNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMUJENzQwMjlDIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInNlcnZpY2VJbXBsQmVhbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUJENzYwMkY4Ig0KLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2aWNlSW1wbEJlYW4iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6U2VydmljZUltcGxCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMwQTAwMTYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQkQ3NjAyRkEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6UG9ydENvbXBvbmVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCINCi0JICAgIHF1aWQgICAgICAgCSIzRTExQkQ4MDAzN0UiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaGFuZGxlcnMgIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQkQ4NDAyOTMiDQotCQkgICAgbGFiZWwgICAgICAJImhhbmRsZXJzICINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpIYW5kbGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMzQjAxRDYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQkQ4NDAyOTUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6UG9ydENvbXBvbmVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiINCi0JICAgIHF1aWQgICAgICAgCSIzRTExQzM3MTAzQ0YiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZUVKQkxpbmsiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFDMzczMDE1QiINCi0JCSAgICBsYWJlbCAgICAgIAkiZUVKQkxpbmsiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6RUpCTGluayINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDMjAwMjhEIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUMzNzMwMTVEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlNlcnZpY2VJbXBsQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDMEEwMDE2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCINCi0JICAgIHF1aWQgICAgICAgCSIzRTExQzM3OTAzOEEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZVNlcnZsZXRMaW5rIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQzM3QzAwRDEiDQotCQkgICAgbGFiZWwgICAgICAJImVTZXJ2bGV0TGluayINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpTZXJ2bGV0TGluayINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDMTUwMkUyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkOSINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUMzN0MwMERDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlNlcnZpY2VJbXBsQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDMEEwMDE2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMENBNzMwM0M1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndlYlNlcnZpY2VEZXNjcmlwdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTBDQTc2MDM1MSINCi0JCSAgICBsYWJlbCAgICAgIAkid2ViU2VydmljZURlc2NyaXB0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpXZWJTZXJ2aWNlRGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBMTUwMDMxMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTEwQ0E3NjAzNUIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6V2ViU2VydmljZXMiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTA5RUVGMDEyRiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFMTFCN0M4MDMzRiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJwb3J0Q29tcG9uZW50cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUI3Q0MwMkMzIg0KLQkJICAgIGxhYmVsICAgICAgCSJwb3J0Q29tcG9uZW50cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpQb3J0Q29tcG9uZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUI4RDAxRjYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUI3Q0MwMkNEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OldlYlNlcnZpY2VEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEExNTAwMzEzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMUNFREUwMzFFIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImluaXRQYXJhbXMgIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQ0VFMDAzNzEiDQotCQkgICAgbGFiZWwgICAgICAJImluaXRQYXJhbXMgIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpJbml0UGFyYW0iDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzZFMDI4MCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQ0VFMDAzNzMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6SGFuZGxlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDM0IwMUQ2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMUNFRTgwMDAxIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInNvYXBIZWFkZXJzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQ0VFQTAyOTgiDQotCQkgICAgbGFiZWwgICAgICAJInNvYXBIZWFkZXJzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpTT0FQSGVhZGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUM5OTAyMkYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNyINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUNFRUEwMkEyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OkhhbmRsZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzNCMDFENiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFMzk1MzAyMDE4OSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJiZWFuTGluayINCi0JCSAgICBxdWlkICAgICAgIAkiM0UzOTUzMDUwMDA3Ig0KLQkJICAgIGxhYmVsICAgICAgCSJiZWFuTGluayINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpCZWFuTGluayINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UzOTUyRTcwMEVDIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMzk1MzA1MDAxMSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpTZXJ2aWNlSW1wbEJlYW4iDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzBBMDAxNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwIg0KLQkgICAgcXVpZCAgICAgICAJIjNFNTI3NjM2MDI5MyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJzb2FwUm9sZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI3NjM4MDIyNyINCi0JCSAgICBsYWJlbCAgICAgIAkic29hcFJvbGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpTT0FQUm9sZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDQkMwMTY0Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI3NjM4MDIzMSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpIYW5kbGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMzQjAxRDYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMiINCi0JICAgIHF1aWQgICAgICAgCSIzRjVDQkVBMTAyMzUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25UeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVDQkVBMjAwRDgiDQotCQkgICAgbGFiZWwgICAgICAJImRlc2NyaXB0aW9uVHlwZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NvbW1vbjo6RGVzY3JpcHRpb25UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkM2RDAzNTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1Q0JFQTIwMEUyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlBvcnRDb21wb25lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQjhEMDFGNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNGNUNCRUE3MDBDMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkaXNwbGF5TmFtZVR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNCRUE4MDMxQiINCi0JCSAgICBsYWJlbCAgICAgIAkiZGlzcGxheU5hbWVUeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEaXNwbGF5TmFtZVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzc4MDIzNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVDQkVBODAzMjUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6UG9ydENvbXBvbmVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYiDQotCSAgICBxdWlkICAgICAgIAkiM0Y1Q0JGOEEwMTE0Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9uVHlwZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNCRjhCMDA3NSINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25UeXBlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NvbW1vbjo6RGVzY3JpcHRpb25UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkM2RDAzNTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNyINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1Q0JGOEIwMDg5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpJbml0UGFyYW0iDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzZFMDI4MCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4Ig0KLQkgICAgcXVpZCAgICAgICAJIjNGNUREQkI3MDMxMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvblR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUREQkI4MDI1NSINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25UeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEZXNjcmlwdGlvblR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzZEMDM1MyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVEREJCODAyNjkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6V2ViU2VydmljZURlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMCINCi0JICAgIHF1aWQgICAgICAgCSIzRjVEREJCRTAzOUUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGlzcGxheU5hbWVUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVEREJCRjAzMDkiDQotCQkgICAgbGFiZWwgICAgICAJImRpc3BsYXlOYW1lVHlwZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NvbW1vbjo6RGlzcGxheU5hbWVUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkM3ODAyMzYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1RERCQkYwMzEzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OldlYlNlcnZpY2VEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEExNTAwMzEzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzIiDQotCSAgICBxdWlkICAgICAgIAkiM0Y1RERDNDUwMEY5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImljb25UeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVEREM0NjAwNDYiDQotCQkgICAgbGFiZWwgICAgICAJImljb25UeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6SWNvblR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OUVFMDAzQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVEREM0NjAwNTAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6V2ViU2VydmljZURlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNCINCi0JICAgIHF1aWQgICAgICAgCSIzRjVEREU5NTAxMjIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaWNvblR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNURERTk2MDE2QSINCi0JCSAgICBsYWJlbCAgICAgIAkiaWNvblR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpJY29uVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5RUUwMDNBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNURERTk2MDE3RSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpQb3J0Q29tcG9uZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUI4RDAxRjYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJQb3J0Q29tcG9uZW50Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFMTFCQUQ5MDJBMyINCi0JICAgIHRpdGxlICAgICAgCSJQb3J0Q29tcG9uZW50Ig0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGQ6OkVKQkxpbmsiIEAxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4NzAsIDI3MzQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDcyNSwgMjY2MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyOTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVKQkxpbmsiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMyMDAyOEQiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoNzI1LCAyNzEzKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyODYpDQotCQkgICAgd2lkdGggICAgICAJMzA4DQotCQkgICAgaGVpZ2h0ICAgICAJMTY2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGQ6OlNlcnZsZXRMaW5rIiBAMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU2NywgMjcxOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMTM5MCwgMjY0NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZsZXRMaW5rIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDMTUwMkUyIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDEzOTAsIDI2OTgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM1MCkNCi0JCSAgICB3aWR0aCAgICAgIAkzNzINCi0JCSAgICBoZWlnaHQgICAgIAkxNjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4NTYsIDY3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoMTU3NSwgNTA2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUU5hbWUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc2NjQyMQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoMTU3NSwgNjAyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAk1NTgpDQotCQkgICAgd2lkdGggICAgICAJNTgwDQotCQkgICAgaGVpZ2h0ICAgICAJMzUyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIDEyOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoNjQsIDEwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc2NjQyMQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoNjQsIDEwNikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjUzKQ0KLQkJICAgIHdpZHRoICAgICAgCTI3NA0KLQkJICAgIGhlaWdodCAgICAgCTI1OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRpc3BsYXlOYW1lIiBANQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjQwLCAxMjkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJbG9jYXRpb24gICAJKDQyNCwgMTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDMyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEaXNwbGF5TmFtZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OTIyMDAwRSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANQ0KLQkJCWxvY2F0aW9uICAgCSg0MjQsIDEwNikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNDI4KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ1MA0KLQkJICAgIGhlaWdodCAgICAgCTI1OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpCZWFuTGluayIgQDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyNDEsIDI0MjYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2DQotCQkJbG9jYXRpb24gICAJKDExNTQsIDIzODEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMTc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJCZWFuTGluayIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMzk1MkU3MDBFQyINCi0JCSAgICB3aWR0aCAgICAgIAkxOTINCi0JCSAgICBoZWlnaHQgICAgIAkxMTANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTM5NTM4QjAxNEIiDQotCQkgICAgY2xpZW50ICAgICAJQDENCi0JCSAgICBzdXBwbGllciAgIAlANg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg5NjgsIDI2NTApDQotCQkJKDExNzIsIDI0ODEpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UzOTUzQTUwMTBBIg0KLQkJICAgIGNsaWVudCAgICAgCUAyDQotCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTQ3NCwgMjYzNSkNCi0JCQkoMTMwMiwgMjQ4MSkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6SGFuZGxlciIgQDkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgMjIzOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDkNCi0JCQlsb2NhdGlvbiAgIAkoMTE5LCAyMDY5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSGFuZGxlciIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzNCMDFENiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCWxvY2F0aW9uICAgCSgxMTksIDIxMjEpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTM3NSkNCi0JCSAgICB3aWR0aCAgICAgIAk0NTINCi0JCSAgICBoZWlnaHQgICAgIAkzNjANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6V1NETFBvcnQiIEAxMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgzOSwgMTAzOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJbG9jYXRpb24gICAJKDE3NDcsIDk5MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxODQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldTRExQb3J0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCQzQwMjA1Ig0KLQkJICAgIHdpZHRoICAgICAgCTIwMg0KLQkJICAgIGhlaWdodCAgICAgCTExMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjQzOEM4OTAzNjMiDQotCQkgICAgY2xpZW50ICAgICAJQDEwDQotCQkgICAgc3VwcGxpZXIgICAJQDMNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTg0MSwgOTgzKQ0KLQkJCSgxODQxLCA4NDgpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDk4MykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg0MSwgODQ4KSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6U2VydmljZUltcGxCZWFuIiBAMTINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyMzEsIDE0MDkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMg0KLQkJCWxvY2F0aW9uICAgCSgxMDg4LCAxMzY0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI4Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZUltcGxCZWFuIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDMEEwMDE2Ig0KLQkJICAgIHdpZHRoICAgICAgCTMwNA0KLQkJICAgIGhlaWdodCAgICAgCTExMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4IiBAMTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzNSwgMTkxNykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMzk1MzAyMDE4OSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJiZWFuTGluayIgQDE0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDE5LCAxMjEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTEwMiwgMjE3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitiZWFuTGluayINCi0JCQkJcGN0RGlzdCAgICAJMC41NTk0NDENCi0JCQkJaGVpZ2h0ICAgICAJMTM3DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMzk1MzA1MDAwNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzDQotCQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIzNSwgMTkxNykNCi0JCQkJKDEyNDAsIDIzNzApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2DQotCQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQkJbG9jYXRpb24gICAJKDEzMjUsIDIyNzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzgzMjE3DQotCQkJCWhlaWdodCAgICAgCTg2DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOSIgQDE3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDE5LCAxMjEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTM5NTMwNTAwMTEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjM1LCAxOTE3KQ0KLQkJCQkoMTIzMSwgMTQ2NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4NSwgMTUxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTUxMDUNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEZXNjcmlwdGlvblR5cGUiIEAxOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkyLCA0NjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCWxvY2F0aW9uICAgCSg1NSwgMzk2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JDNkQwMzUzIg0KLQkJICAgIHdpZHRoICAgICAgCTI5Mg0KLQkJICAgIGhlaWdodCAgICAgCTE1Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NvbW1vbjo6RGlzcGxheU5hbWVUeXBlIiBAMjANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDY0MCwgNDY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjANCi0JCQlsb2NhdGlvbiAgIAkoNDkxLCAzOTYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjk4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEaXNwbGF5TmFtZVR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkM3ODAyMzYiDQotCQkgICAgd2lkdGggICAgICAJMzE2DQotCQkgICAgaGVpZ2h0ICAgICAJMTU2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6SWNvblR5cGUiIEAyMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIxNiwgNDAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjENCi0JCQlsb2NhdGlvbiAgIAkoOTYxLCAyNTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTEwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJY29uVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OUVFMDAzQSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjENCi0JCQlsb2NhdGlvbiAgIAkoOTYxLCAzNTMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTUwNikNCi0JCSAgICB3aWR0aCAgICAgIAk1MjgNCi0JCSAgICBoZWlnaHQgICAgIAkzMDYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6UG9ydENvbXBvbmVudCIgQDIyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMzYsIDEwNDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCWxvY2F0aW9uICAgCSgzMiwgODUwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYwOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUG9ydENvbXBvbmVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQjhEMDFGNiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQlsb2NhdGlvbiAgIAkoMzIsIDkwMikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk3DQotCQkJbWF4X3dpZHRoICAJNjA0KQ0KLQkJICAgIHdpZHRoICAgICAgCTYyNg0KLQkJICAgIGhlaWdodCAgICAgCTQwMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAyMw0KLQkJICAgIGxvY2F0aW9uICAgCSgzMzYsIDE2NDkpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTExQkQ4MDAzN0UiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaGFuZGxlcnMgIiBAMjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDE1NDEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjUNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjk2LCAxOTc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNDkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2hhbmRsZXJzICINCi0JCQkJcGN0RGlzdCAgICAJMC43OTkwODINCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUJEODQwMjkzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzMzYsIDE2NDkpDQotCQkJCSgzMzYsIDIwNTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2DQotCQkJCVBhcmVudF9WaWV3IAlAMjQNCi0JCQkJbG9jYXRpb24gICAJKDM5MCwgMjAxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAxMTUNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAyNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIzDQotCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgMTU0MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFCRDg0MDI5NSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIzDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDMzNiwgMTY0OSkNCi0JCQkJKDMzNiwgMTI0MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjgNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMzkwLCAxMjgyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDExNQ0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMjkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMTAzOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTFCRDY5MDBFOCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3c2RsUG9ydCIgQDMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjkNCi0JCQkgICAgbG9jYXRpb24gICAJKDkwOSwgOTIyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxDQotCQkJCVBhcmVudF9WaWV3IAlAMzANCi0JCQkJbG9jYXRpb24gICAJKDE0MjIsIDEwODMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrd3NkbFBvcnQiDQotCQkJCXBjdERpc3QgICAgCTAuNDIxMjk2DQotCQkJCWhlaWdodCAgICAgCTQ1DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFCRDZBMDM0QyINCi0JCQkgICAgY2xpZW50ICAgICAJQDI5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExOTMsIDEwMzgpDQotCQkJCSgxNzM3LCAxMDM4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMg0KLQkJCQlQYXJlbnRfVmlldyAJQDMwDQotCQkJCWxvY2F0aW9uICAgCSgxNzM3LCA5OTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTEuMDAzNjIzDQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBAMzMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTA5LCA5MjIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTExQkQ2QTAzNTYiDQotCQkJICAgIGNsaWVudCAgICAgCUAyOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTkzLCAxMDM4KQ0KLQkJCQkoNjQ5LCAxMDM5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNA0KLQkJCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJCWxvY2F0aW9uICAgCSg3MDcsIDk4OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTQ3MzcNCi0JCQkJaGVpZ2h0ICAgICAJNTINCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDM1DQotCQkgICAgbG9jYXRpb24gICAJKDg3NCwgMTI2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTFCRDc0MDI5QyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2aWNlSW1wbEJlYW4iIEAzNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1DQotCQkJICAgIGxvY2F0aW9uICAgCSg1OTEsIDExNDQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNg0KLQkJCQlsb2NhdGlvbiAgIAkoOTcxLCAxNTM5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNzMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NlcnZpY2VJbXBsQmVhbiINCi0JCQkJcGN0RGlzdCAgICAJMC43OTc1MDcNCi0JCQkJaGVpZ2h0ICAgICAJMjIyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFCRDc2MDJGOCINCi0JCQkgICAgY2xpZW50ICAgICAJQDM1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDg3NCwgMTI2MCkNCi0JCQkJKDExMDAsIDEzNTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4DQotCQkJCVBhcmVudF9WaWV3IAlAMzYNCi0JCQkJbG9jYXRpb24gICAJKDEwNjcsIDEzNzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTEzNTcxDQotCQkJCWhlaWdodCAgICAgCTM1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMzkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTkxLCAxMTQ0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUJENzYwMkZBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODc0LCAxMjYwKQ0KLQkJCQkoNjQ5LCAxMTY4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MA0KLQkJCQlQYXJlbnRfVmlldyAJQDM5DQotCQkJCWxvY2F0aW9uICAgCSg2OTIsIDExMjkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk3NTk1DQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyIiBANDENCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQ4LCA2OTApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkVBMTAyMzUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25UeXBlIiBANDINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTcyLCAtMTMyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzDQotCQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQkJbG9jYXRpb24gICAJKDE3OSwgNjI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9uVHlwZSINCi0JCQkJcGN0RGlzdCAgICAJMC41MDEzMjANCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JFQTIwMEQ4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDENCi0JCQkgICAgc3VwcGxpZXIgICAJQDE5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjQ4LCA2OTApDQotCQkJCSgyMTEsIDU0MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMjY3LCA1ODEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEzNw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY2ODk5NQ0KLQkJCQloZWlnaHQgICAgIAk0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMiIEA0NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQxDQotCQkJICAgIGxvY2F0aW9uICAgCSgtNzIsIC0xMzIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkVBMjAwRTIiDQotCQkJICAgIGNsaWVudCAgICAgCUA0MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNDgsIDY5MCkNCi0JCQkJKDI4NSwgODM5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1DQotCQkJCWxvY2F0aW9uICAgCSgzMzMsIDgxMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTA5NTQNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQiIEA0Nw0KLQkJICAgIGxvY2F0aW9uICAgCSg1MTksIDY5MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCRUE3MDBDMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkaXNwbGF5TmFtZVR5cGUiIEA0OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3DQotCQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIC0xMjQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkNCi0JCQkJUGFyZW50X1ZpZXcgCUA0OA0KLQkJCQlsb2NhdGlvbiAgIAkoNTM0LCA2NjIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI4Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGlzcGxheU5hbWVUeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjE5NDY3NA0KLQkJCQloZWlnaHQgICAgIAkxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNUNCRUE4MDMxQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ3DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDUxOSwgNjkwKQ0KLQkJCQkoNTk4LCA1NDIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwDQotCQkJCVBhcmVudF9WaWV3IAlANDgNCi0JCQkJbG9jYXRpb24gICAJKDY1MiwgNjEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43Nzg1MjcNCi0JCQkJaGVpZ2h0ICAgICAJODENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1IiBANTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTkyLCAtMTI0KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JFQTgwMzI1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTE5LCA2OTApDQotCQkJCSg0NDEsIDgzOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTINCi0JCQkJUGFyZW50X1ZpZXcgCUA1MQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk3LCA4NDkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk4Mjc2DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM0IiBANTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoODA3LCA2OTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREU5NTAxMjIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaWNvblR5cGUiIEA1NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDUzDQotCQkJICAgIGxvY2F0aW9uICAgCSg0NzQsIC0zNDUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUNCi0JCQkJUGFyZW50X1ZpZXcgCUA1NA0KLQkJCQlsb2NhdGlvbiAgIAkoOTQxLCA1NTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIraWNvblR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuNzk5MzI5DQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNURERTk2MDE2QSINCi0JCQkgICAgY2xpZW50ICAgICAJQDUzDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDgwNywgNjk2KQ0KLQkJCQkoMTAwMywgNTUzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDU0DQotCQkJCWxvY2F0aW9uICAgCSgxMDE1LCA2MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwNTc1DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNSIgQDU3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ3NCwgLTM0NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNURERTk2MDE3RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDUzDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDgwNywgNjk2KQ0KLQkJCQkoNjExLCA4MzkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4DQotCQkJCVBhcmVudF9WaWV3IAlANTcNCi0JCQkJbG9jYXRpb24gICAJKDY2MywgODY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1OQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUREQjdFMDBDMSINCi0JCSAgICBjbGllbnQgICAgIAlAMTkNCi0JCSAgICBzdXBwbGllciAgIAlANA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxOTIsIDM4NSkNCi0JCQkoMTkyLCAyNTgpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUREQjgyMDMzRCINCi0JCSAgICBjbGllbnQgICAgIAlAMjANCi0JCSAgICBzdXBwbGllciAgIAlANQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg2NDAsIDM4NSkNCi0JCQkoNjQwLCAyNTgpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIldlYlNlcnZpY2VzIg0KLQkgICAgcXVpZCAgICAgICAJIjNFMTA5RThBMDE4MSINCi0JICAgIHRpdGxlICAgICAgCSJXZWJTZXJ2aWNlcyINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpXZWJTZXJ2aWNlRGVzY3JpcHRpb24iIEA2MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDg0LCAxMjE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjENCi0JCQlsb2NhdGlvbiAgIAkoMTQyLCAxMDAyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY4NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViU2VydmljZURlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEExNTAwMzEzIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA2MQ0KLQkJCWxvY2F0aW9uICAgCSgxNDIsIDEwNTQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJOA0KLQkJCW1heF93aWR0aCAgCTY4MSkNCi0JCSAgICB3aWR0aCAgICAgIAk3MDINCi0JCSAgICBoZWlnaHQgICAgIAk0NDgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6V2ViU2VydmljZXMiIEA2Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDg3LCA2OTApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2Mg0KLQkJCWxvY2F0aW9uICAgCSgzNzQsIDY0NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldlYlNlcnZpY2VzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMDlFRUYwMTJGIg0KLQkJICAgIHdpZHRoICAgICAgCTI0NA0KLQkJICAgIGhlaWdodCAgICAgCTExMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwIiBANjMNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDg1LCA4NjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQ0E3MzAzQzUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAid2ViU2VydmljZURlc2NyaXB0aW9ucyIgQDY0DQotCQkJICAgIFBhcmVudF9WaWV3IAlANjMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMjMsIDU2MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDY0DQotCQkJCWxvY2F0aW9uICAgCSgyMzksIDk4MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzc0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkzODQxNg0KLQkJCQloZWlnaHQgICAgIAkyNDYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMENBNzYwMzUxIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDg1LCA4NjgpDQotCQkJCSg0ODQsIDk5MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjYNCi0JCQkJUGFyZW50X1ZpZXcgCUA2NA0KLQkJCQlsb2NhdGlvbiAgIAkoNTM4LCA5NzgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODk4ODI3DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMSIgQDY3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANjMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMjMsIDU2MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTBDQTc2MDM1QiINCi0JCQkgICAgY2xpZW50ICAgICAJQDYzDQotCQkJICAgIHN1cHBsaWVyICAgCUA2Mg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQ4NSwgODY4KQ0KLQkJCQkoNDg2LCA3NDUpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4DQotCQkJCVBhcmVudF9WaWV3IAlANjcNCi0JCQkJbG9jYXRpb24gICAJKDU0MCwgNzU4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5ODY3OA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIgQDY5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODcsIDI4MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2OQ0KLQkJCWxvY2F0aW9uICAgCSgxNDEsIDEwMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2OTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0FERjIwMTk3Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA2OQ0KLQkJCWxvY2F0aW9uICAgCSgxNDEsIDIxNykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTQzNykNCi0JCSAgICB3aWR0aCAgICAgIAk3MTANCi0JCSAgICBoZWlnaHQgICAgIAkzODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDAyM0IwREQwMEREIg0KLQkJICAgIGNsaWVudCAgICAgCUA2Mg0KLQkJICAgIHN1cHBsaWVyICAgCUA2OQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg0ODcsIDYzNCkNCi0JCQkoNDg3LCA0NzIpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIldlYlNlcnZpY2VEZXNjcmlwdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzRTEwRDY2QjAyRUEiDQotCSAgICB0aXRsZSAgICAgIAkiV2ViU2VydmljZURlc2NyaXB0aW9uIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTI2DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRpc3BsYXlOYW1lIiBANzENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIxNzYsIDY0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcxDQotCQkJbG9jYXRpb24gICAJKDE5NjAsIDUyMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRpc3BsYXlOYW1lIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5MjIwMDBFIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA3MQ0KLQkJCWxvY2F0aW9uICAgCSgxOTYwLCA2MTcpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTQyOCkNCi0JCSAgICB3aWR0aCAgICAgIAk0NTANCi0JCSAgICBoZWlnaHQgICAgIAkyNTgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDcyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDk2LCAzMjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3Mg0KLQkJCWxvY2F0aW9uICAgCSgxOTY4LCAyMDEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANzINCi0JCQlsb2NhdGlvbiAgIAkoMTk2OCwgMjk3KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyNTMpDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjU4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGQ6OlBvcnRDb21wb25lbnQiIEA3Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzk1LCAxNjIxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzMNCi0JCQlsb2NhdGlvbiAgIAkoOTEsIDE0MzEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjA4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQb3J0Q29tcG9uZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCWxvY2F0aW9uICAgCSg5MSwgMTQ4MykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk3DQotCQkJbWF4X3dpZHRoICAJNjA0KQ0KLQkJICAgIHdpZHRoICAgICAgCTYyNg0KLQkJICAgIGhlaWdodCAgICAgCTQwMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NvbW1vbjo6RGVzY3JpcHRpb25UeXBlIiBANzQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0MDgsIDMyMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDc0DQotCQkJbG9jYXRpb24gICAJKDEyNzEsIDI1MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzZEMDM1MyINCi0JCSAgICB3aWR0aCAgICAgIAkyOTINCi0JCSAgICBoZWlnaHQgICAgIAkxNTYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCN0UwMEMxIg0KLQkJICAgIGNsaWVudCAgICAgCUA3NA0KLQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNTU0LCAzMjApDQotCQkJKDE5NTgsIDMyMCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OkRpc3BsYXlOYW1lVHlwZSIgQDc2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCA2NDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCWxvY2F0aW9uICAgCSgxMjc1LCA1NzIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjk4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEaXNwbGF5TmFtZVR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkM3ODAyMzYiDQotCQkgICAgd2lkdGggICAgICAJMzE2DQotCQkgICAgaGVpZ2h0ICAgICAJMTU2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3Nw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUREQjgyMDMzRCINCi0JCSAgICBjbGllbnQgICAgIAlANzYNCi0JCSAgICBzdXBwbGllciAgIAlANzENCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTU4MiwgNjQwKQ0KLQkJCSgxOTUwLCA2NDApKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6SWNvblR5cGUiIEA3OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4OCwgOTkyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzgNCi0JCQlsb2NhdGlvbiAgIAkoMTIzMywgODQ5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUxMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSWNvblR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc2NjQyMQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOTlFRTAwM0EiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDc4DQotCQkJbG9jYXRpb24gICAJKDEyMzMsIDk0NSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJNTA2KQ0KLQkJICAgIHdpZHRoICAgICAgCTUyOA0KLQkJICAgIGhlaWdodCAgICAgCTMwNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpXZWJTZXJ2aWNlRGVzY3JpcHRpb24iIEA3OQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzk1LCA2NDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3OQ0KLQkJCWxvY2F0aW9uICAgCSg1MywgNDMwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY4NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViU2VydmljZURlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEExNTAwMzEzIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA3OQ0KLQkJCWxvY2F0aW9uICAgCSg1MywgNDgyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTgNCi0JCQltYXhfd2lkdGggIAk2ODEpDQotCQkgICAgd2lkdGggICAgICAJNzAyDQotCQkgICAgaGVpZ2h0ICAgICAJNDQ4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIiIEA4MA0KLQkJICAgIGxvY2F0aW9uICAgCSgzOTUsIDExNDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTExQjdDODAzM0YiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicG9ydENvbXBvbmVudHMiIEA4MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgwDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDcsIDk4MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDgxDQotCQkJCWxvY2F0aW9uICAgCSgzNTUsIDEzNjMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcG9ydENvbXBvbmVudHMiDQotCQkJCXBjdERpc3QgICAgCTAuNzk3OTIwDQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFCN0NDMDJDMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDgwDQotCQkJICAgIHN1cHBsaWVyICAgCUA3Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM5NSwgMTE0NCkNCi0JCQkJKDM5NSwgMTQyMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODMNCi0JCQkJUGFyZW50X1ZpZXcgCUA4MQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ5LCAxMzkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5ODk2MA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMiIEA4NA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgwDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDcsIDk4MykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFCN0NDMDJDRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDgwDQotCQkJICAgIHN1cHBsaWVyICAgCUA3OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM5NSwgMTE0NCkNCi0JCQkJKDM5NSwgODY4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDg0DQotCQkJCWxvY2F0aW9uICAgCSg0NDksIDg5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAyOTgNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgiIEA4Ng0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDAzLCA0NDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREJCNzAzMTEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVzY3JpcHRpb25UeXBlIiBAODcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ4LCAtMTg5KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4DQotCQkJCVBhcmVudF9WaWV3IAlAODcNCi0JCQkJbG9jYXRpb24gICAJKDExOTgsIDM0NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjY0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvblR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuNzk2NTMyDQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNUREQkI4MDI1NSINCi0JCQkgICAgY2xpZW50ICAgICAJQDg2DQotCQkJICAgIHN1cHBsaWVyICAgCUA3NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwMDMsIDQ0OCkNCi0JCQkJKDEyNjEsIDM2NikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI1MSwgNDI1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5NjQxNg0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkiIEA5MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg2DQotCQkJICAgIGxvY2F0aW9uICAgCSg2NDgsIC0xODkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREJCODAyNjkiDQotCQkJICAgIGNsaWVudCAgICAgCUA4Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANzkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDAzLCA0NDgpDQotCQkJCSg3NDYsIDUzMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTENCi0JCQkJUGFyZW50X1ZpZXcgCUA5MA0KLQkJCQlsb2NhdGlvbiAgIAkoNzg5LCA1NzQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk0ODc1DQotCQkJCWhlaWdodCAgICAgCTU1DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwIiBAOTINCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAwNSwgNjQxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCQkUwMzlFIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRpc3BsYXlOYW1lVHlwZSIgQDkzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTINCi0JCQkgICAgbG9jYXRpb24gICAJKDY0OSwgMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NA0KLQkJCQlQYXJlbnRfVmlldyAJQDkzDQotCQkJCWxvY2F0aW9uICAgCSgxMjExLCA2MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI5Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGlzcGxheU5hbWVUeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5Njk5Mg0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREJCRjAzMDkiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Mg0KLQkJCSAgICBzdXBwbGllciAgIAlANzYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDA1LCA2NDEpDQotCQkJCSgxMjY1LCA2NDApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk1DQotCQkJCVBhcmVudF9WaWV3IAlAOTMNCi0JCQkJbG9jYXRpb24gICAJKDEyMzgsIDY5NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTg0OTYNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxIiBAOTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ5LCAxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCQkYwMzEzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDc5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTAwNSwgNjQxKQ0KLQkJCQkoNzQ2LCA2NDIpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3DQotCQkJCVBhcmVudF9WaWV3IAlAOTYNCi0JCQkJbG9jYXRpb24gICAJKDc3MiwgNjk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5ODQ5Ng0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMiIgQDk4DQotCQkgICAgbG9jYXRpb24gICAJKDk4NCwgODMwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1RERDNDUwMEY5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImljb25UeXBlIiBAOTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5OA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjMxLCAxODUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwDQotCQkJCVBhcmVudF9WaWV3IAlAOTkNCi0JCQkJbG9jYXRpb24gICAJKDExODcsIDg1MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitpY29uVHlwZSINCi0JCQkJcGN0RGlzdCAgICAJMC43OTUwMDMNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1RERDNDYwMDQ2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDc4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTg0LCA4MzApDQotCQkJCSgxMjIzLCA5MDcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDk5DQotCQkJCWxvY2F0aW9uICAgCSgxMTgzLCA5NTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAxOTQ2DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMyIgQDEwMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk4DQotCQkJICAgIGxvY2F0aW9uICAgCSg2MzEsIDE4NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNUREQzQ2MDA1MCINCi0JCQkgICAgY2xpZW50ICAgICAJQDk4DQotCQkJICAgIHN1cHBsaWVyICAgCUA3OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk4NCwgODMwKQ0KLQkJCQkoNzQ2LCA3NTQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMw0KLQkJCQlQYXJlbnRfVmlldyAJQDEwMg0KLQkJCQlsb2NhdGlvbiAgIAkoNzU4LCA4MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODg5OTE4DQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJIYW5kbGVyIg0KLQkgICAgcXVpZCAgICAgICAJIjNFMTFDQzUwMDMwNCINCi0JICAgIHRpdGxlICAgICAgCSJIYW5kbGVyIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTY5NA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSIgQDEwNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgzNiwgMTAxMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNA0KLQkJCWxvY2F0aW9uICAgCSgxNTU1LCA4NDYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJRTmFtZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxDQotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTA0DQotCQkJbG9jYXRpb24gICAJKDE1NTUsIDk0MikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk1DQotCQkJbWF4X3dpZHRoICAJNTU4KQ0KLQkJICAgIHdpZHRoICAgICAgCTU4MA0KLQkJICAgIGhlaWdodCAgICAgCTM1Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NvbW1vbjo6U09BUEhlYWRlciIgQDEwNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgMTQ1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCWxvY2F0aW9uICAgCSg5NzUsIDEzNzUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMjI2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTT0FQSGVhZGVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDOTkwMjJGIg0KLQkJICAgIHdpZHRoICAgICAgCTI0NA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y0NjcxODcwMDQ5Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxMDUNCi0JCSAgICBzdXBwbGllciAgIAlAMTA0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDEyMTAsIDEzODIpDQotCQkJKDE1NDUsIDExODMpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpTT0FQUm9sZSIgQDEwNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTI4LCAxODQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA3DQotCQkJbG9jYXRpb24gICAJKDM0OCwgMTczNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzNjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNPQVBSb2xlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDQkMwMTY0Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxMDcNCi0JCQlsb2NhdGlvbiAgIAkoMzQ4LCAxODMwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzMTIpDQotCQkgICAgd2lkdGggICAgICAJMzc4DQotCQkgICAgaGVpZ2h0ICAgICAJMjMyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGQ6OkhhbmRsZXIiIEAxMDgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI4MSwgODg0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA4DQotCQkJbG9jYXRpb24gICAJKDYyLCA3NTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDM4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIYW5kbGVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDM0IwMUQ2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQlsb2NhdGlvbiAgIAkoNjIsIDgwOSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMzc1KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ1Ng0KLQkJICAgIGhlaWdodCAgICAgCTI3NQ0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2IiBAMTA5DQotCQkgICAgbG9jYXRpb24gICAJKDcxOSwgMTE5NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTFDRUU4MDAwMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzb2FwSGVhZGVycyIgQDExMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTgyLCAxMDkwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDExMA0KLQkJCQlsb2NhdGlvbiAgIAkoODkyLCAxMzY3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMTMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NvYXBIZWFkZXJzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5OTk3MA0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTExQ0VFQTAyOTgiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwNQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDcxOSwgMTE5NSkNCi0JCQkJKDk2NSwgMTM2OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyDQotCQkJCVBhcmVudF9WaWV3IAlAMTEwDQotCQkJCWxvY2F0aW9uICAgCSg5NzAsIDEzMDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuOTAxMjYwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDExMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTgyLCAxMDkwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUNFRUEwMkEyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3MTksIDExOTUpDQotCQkJCSg0NzUsIDEwMjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNA0KLQkJCQlQYXJlbnRfVmlldyAJQDExMw0KLQkJCQlsb2NhdGlvbiAgIAkoNTMwLCA5OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk3OTU5DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwIiBAMTE1DQotCQkgICAgbG9jYXRpb24gICAJKDQwNiwgMTM3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFNTI3NjM2MDI5MyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzb2FwUm9sZXMiIEAxMTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE4NywgNDEzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNw0KLQkJCQlQYXJlbnRfVmlldyAJQDExNg0KLQkJCQlsb2NhdGlvbiAgIAkoMzc1LCAxNjU1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3NvYXBSb2xlcyINCi0JCQkJcGN0RGlzdCAgICAJMC43MzI5NjgNCi0JCQkJaGVpZ2h0ICAgICAJMTAyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTI3NjM4MDIyNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDExNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDA2LCAxMzcyKQ0KLQkJCQkoNDk3LCAxNzIzKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTYNCi0JCQkJbG9jYXRpb24gICAJKDU3NCwgMTY4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45NDAwODYNCi0JCQkJaGVpZ2h0ICAgICAJODYNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxIiBAMTE5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDQxMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFNTI3NjM4MDIzMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDExNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTA4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDA2LCAxMzcyKQ0KLQkJCQkoMzE1LCAxMDIxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjANCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTkNCi0JCQkJbG9jYXRpb24gICAJKDM3NiwgMTA0MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NvbW1vbjo6RGVzY3JpcHRpb25UeXBlIiBAMTIxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzI4LCA1MjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMjENCi0JCQlsb2NhdGlvbiAgIAkoMTU5MSwgNDYwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JDNkQwMzUzIg0KLQkJICAgIHdpZHRoICAgICAgCTI5Mg0KLQkJICAgIGhlaWdodCAgICAgCTE1Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NvbW1vbjo6SW5pdFBhcmFtIiBAMTIyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDU2LCA5NjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMjINCi0JCQlsb2NhdGlvbiAgIAkoODUwLCA4MTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDEyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJbml0UGFyYW0iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUM2RTAyODAiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDEyMg0KLQkJCWxvY2F0aW9uICAgCSg4NTAsIDkwOSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJMzU2KQ0KLQkJICAgIHdpZHRoICAgICAgCTQzMA0KLQkJICAgIGhlaWdodCAgICAgCTMxNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0IiBAMTIzDQotCQkgICAgbG9jYXRpb24gICAJKDY3NCwgOTIxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMUNFREUwMzFFIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImluaXRQYXJhbXMgIiBAMTI0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzDQotCQkJICAgIGxvY2F0aW9uICAgCSg1MzcsIDgwOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjQNCi0JCQkJbG9jYXRpb24gICAJKDY5NiwgOTQ5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODMNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2luaXRQYXJhbXMgIg0KLQkJCQlwY3REaXN0ICAgIAkwLjE0MzU5MA0KLQkJCQloZWlnaHQgICAgIAkyNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTExQ0VFMDAzNzEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY3NCwgOTIxKQ0KLQkJCQkoODQwLCA5MzYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNg0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNA0KLQkJCQlsb2NhdGlvbiAgIAkoODI4LCA4ODUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODk5MzU5DQotCQkJCWhlaWdodCAgICAgCTUyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNSIgQDEyNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTM3LCA4MDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTExQ0VFMDAzNzMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY3NCwgOTIxKQ0KLQkJCQkoNTA5LCA5MDQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNw0KLQkJCQlsb2NhdGlvbiAgIAkoNTMyLCA4NTUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk5MTI1DQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2IiBAMTI5DQotCQkgICAgbG9jYXRpb24gICAJKDE0MzgsIDcxMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCRjhBMDExNCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvblR5cGVzIiBAMTMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5DQotCQkJICAgIGxvY2F0aW9uICAgCSgzODYsIC0yNDIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxDQotCQkJCVBhcmVudF9WaWV3IAlAMTMwDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA1OTUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25UeXBlcyINCi0JCQkJcGN0RGlzdCAgICAJMC44MDM2OTINCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JGOEIwMDc1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNDM4LCA3MTMpDQotCQkJCSgxNjA1LCA2MDYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTYxNSwgNjYzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5NTI5MA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjciIEAxMzMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkNCi0JCQkgICAgbG9jYXRpb24gICAJKDM4NiwgLTI0MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNUNCRjhCMDA4OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTIyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQzOCwgNzEzKQ0KLQkJCQkoMTI3MSwgODIxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzMNCi0JCQkJbG9jYXRpb24gICAJKDEzMTksIDg1NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTE1MDgNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb24iIEAxMzUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIzNjgsIDUyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzNQ0KLQkJCWxvY2F0aW9uICAgCSgyMjQwLCA0MDkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTM1DQotCQkJbG9jYXRpb24gICAJKDIyNDAsIDUwNSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjUzKQ0KLQkJICAgIHdpZHRoICAgICAgCTI3NA0KLQkJICAgIGhlaWdodCAgICAgCTI1OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uR3JvdXAiIEAxMzYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIyNCwgNDk2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM2DQotCQkJbG9jYXRpb24gICAJKDgyLCA0MjgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbkdyb3VwIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDQ1MUYwMUZCIg0KLQkJICAgIHdpZHRoICAgICAgCTMwMg0KLQkJICAgIGhlaWdodCAgICAgCTE1Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTM3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCN0UwMEMxIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMjENCi0JCSAgICBzdXBwbGllciAgIAlAMTM1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE4NzQsIDUyOCkNCi0JCQkoMjIzMCwgNTI4KSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKSkpKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvc2NoZW1hL2VqYk1vZGVsRXh0ZW5kZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9zY2hlbWEvZWpiTW9kZWxFeHRlbmRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzAxNGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9zY2hlbWEvZWpiTW9kZWxFeHRlbmRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiIGlkPSJlamJNb2RlbEV4dGVuZGVyIiBuYW1lPSJFSkIgTW9kZWwgRXh0ZW5kZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGZvciBhIGhlbHBlciB0byBiZSBjb250cmlidXRlZCBmb3IgZGVyaXZpbmcgdGhlIEpOREkgbmFtZSBvZiBlbnRlcnByaXNlIGJlYW5zLCBhbmQgZm9yIGluaGVyaXRhbmNlIHN1cHBvcnQuICBUaGUgaGVscGVyIGNhbiBiZSBwbHVnZ2VkIGluIGJ5IGFwcGxpY2F0aW9uCi1zZXJ2ZXIgdmVuZG9ycy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWpiTW9kZWxFeHRlbmRlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVqYk1vZGVsRXh0ZW5kZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbmNlIG9mIHRoZSBtb2RlbCBleHRlbmRlcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbkNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdG8gdXNlIHRvIGV4dGVuZCB0aGUgRUpCIG1vZGVsCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9zY2hlbWEvam5kaUJpbmRpbmdzSGVscGVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3NjaGVtYS9qbmRpQmluZGluZ3NIZWxwZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzA0MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3NjaGVtYS9qbmRpQmluZGluZ3NIZWxwZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIgaWQ9ImpuZGlCaW5kaW5nc0hlbHBlcnMiIG5hbWU9ImpuZGlCaW5kaW5nc0hlbHBlcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGZvciBhIGhlbHBlciB0byBiZSBjb250cmlidXRlZCBmb3IgZGVyaXZpbmcgdGhlIEpOREkgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgZW50ZXJwcmlzZSBiZWFucy4gIFRoZSBoZWxwZXIgY2FuIGJlIHBsdWdnZWQgaW4gYnkgYXBwbGljYXRpb24gc2VydmVyIHZlbmRvcnMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImpuZGlCaW5kaW5nc0hlbHBlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJqbmRpQmluZGluZ3NIZWxwZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhpcyBpbnN0YW5jZSBvZiB0aGUgYmluZGluZ3MgaGVscGVyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGVscGVyIGNsYXNzIHVzZXMgaW4gdGhpcyBleHRlbnNpb24KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwuYmluZGluZ3MuQWJzdHJhY3RCaW5kaW5nc0hlbHBlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWFhYTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIgZWxlbWVudCBkZWZpbmVzIHRoZSBvcmRlciB0aGF0IGNvbXBsZXhUeXBlIGVsZW1lbnQgdmFsdWVzIGFyZSBhcHBsaWVkIHRvIGEgSmF2YSBleGNlcHRpb24gY29uc3RydWN0b3IuIEVsZW1lbnQgbmFtZXMgYXJlIHNwZWNpZmllZCBmb3IgZWFjaCBwYXJhbWV0ZXIgb2YgdGhlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgZWxlbWVudCBuYW1lcyBvZiBpbmhlcml0ZWQgdHlwZXMgaWYgbmVjZXNzYXJ5LgotICogCi0gKiBVc2VkIGluOiBleGNlcHRpb24tbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyI2dldEVsZW1lbnROYW1lcyA8ZW0+RWxlbWVudCBOYW1lczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnQgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0VsZW1lbnROYW1lcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRFbGVtZW50TmFtZXMoKTsKLQotfSAvLyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvRWxlbWVudE5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9FbGVtZW50TmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTZjYTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9FbGVtZW50TmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBlbGVtZW50LW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBuYW1lIG9mIGEgY29tcGxleFR5cGUgZWxlbWVudCBuYW1lIGF0dHJpYnV0ZSB2YWx1ZS4KLSAqIAotICogVXNlZCBpbjogY29uc3RydWN0b3ItcGFyYW1ldGVyLW9yZGVyCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZSNnZXRUZXh0IDxlbT5UZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEVsZW1lbnROYW1lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEVsZW1lbnROYW1lX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGV4dDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZXh0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUZXh0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RWxlbWVudE5hbWVfVGV4dCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0VGV4dCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWUjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRleHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRUZXh0KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRWxlbWVudE5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9FeGNlcHRpb25NYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvRXhjZXB0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MwZWYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9FeGNlcHRpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4Y2VwdGlvbiBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIGV4Y2VwdGlvbi1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZSBzZXJ2aWNlIHNwZWNpZmljIGV4Y2VwdGlvbiB0eXBlcyBhbmQgdGhlIHdzZGwgZmF1bHRzLgotICogCi0gKiBUaGlzIGVsZW1lbnQgc2hvdWxkIGJlIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUKLSAqIG1hcHBpbmcgYmV0d2VlbiBhIG1ldGhvZCBhbmQgYW4gb3BlcmF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoZSBtYXBwaW5nIGNvbnRleHQuCi0gKiAKLSAqIFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRFeGNlcHRpb25UeXBlIDxlbT5FeGNlcHRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldFdzZGxNZXNzYWdlIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciA8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEV4Y2VwdGlvbk1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhjZXB0aW9uTWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRFeGNlcHRpb25NYXBwaW5nX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjZXB0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4Y2VwdGlvbi10eXBlIGVsZW1lbnQgZGVmaW5lcyBKYXZhIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbi4gSXQgbWF5IGJlIGEgc2VydmljZSBzcGVjaWZpYyBleGNlcHRpb24uCi0JICogCi0JICogSXQgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCSAqIAotCSAqIFVzZWQgaW46IGV4Y2VwdGlvbi1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNlcHRpb25UeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RXhjZXB0aW9uTWFwcGluZ19FeGNlcHRpb25UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRFeGNlcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldEV4Y2VwdGlvblR5cGUgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4Y2VwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRFeGNlcHRpb25UeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxNZXNzYWdlUGFydE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExNZXNzYWdlIGdldFdzZGxNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldFdzZGxNZXNzYWdlIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbE1lc3NhZ2UoV1NETE1lc3NhZ2UgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciA8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcihDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIHZhbHVlKTsKLQotfSAvLyBFeGNlcHRpb25NYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSW50ZXJmYWNlTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0ludGVyZmFjZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwNTQwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSW50ZXJmYWNlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVyZmFjZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SW50ZXJmYWNlTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnRlcmZhY2VNYXBwaW5nIGV4dGVuZHMgSjJFRUVPYmplY3QgewotIC8vIEludGVyZmFjZU1hcHBpbmcKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXZhV1NETE1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXZhV1NETE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzOWEzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF2YVdTRExNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhIFdTREwgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBlbGVtZW50IGRlc2NyaWJlcyB0aGUgSmF2YSBtYXBwaW5nIHRvIGEga25vd24gV1NETCBkb2N1bWVudC5JdCBjb250YWlucyB0aGUgbWFwcGluZyBiZXR3ZWVuIHBhY2thZ2UgbmFtZXMgYW5kIFhNTCBuYW1lc3BhY2VzLCAKLSAqIFdTREwgcm9vdCB0eXBlcyBhbmQgSmF2YSBhcnRpZmFjdHMsIGFuZCB0aGUgc2V0IG9mIG1hcHBpbmdzIGZvciBzZXJ2aWNlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0UGFja2FnZU1hcHBpbmdzIDxlbT5QYWNrYWdlIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncyA8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldEV4Y2VwdGlvbk1hcHBpbmdzIDxlbT5FeGNlcHRpb24gTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRJbnRlcmZhY2VNYXBwaW5ncyA8ZW0+SW50ZXJmYWNlIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEphdmFXU0RMTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhV1NETE1hcHBpbmcgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVdTRExNYXBwaW5nX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWNrYWdlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYWNrYWdlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFja2FnZSBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVdTRExNYXBwaW5nX1BhY2thZ2VNYXBwaW5ncygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRQYWNrYWdlTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkphdmEgWE1MIFR5cGUgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjZXB0aW9uIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2VwdGlvbiBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2VwdGlvbiBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVdTRExNYXBwaW5nX0V4Y2VwdGlvbk1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRFeGNlcHRpb25NYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyZmFjZSBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyZmFjZSBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRJbnRlcmZhY2VNYXBwaW5ncygpOwotCi19IC8vIEphdmFXU0RMTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0phdmFYTUxUeXBlTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0phdmFYTUxUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzU3MWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXZhWE1MVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBqYXZhLXhtbC10eXBlLW1hcHBpbmcgZWxlbWVudCBjb250YWlucyBhIGNsYXNzLXR5cGUgdGhhdCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MsIFFOYW1lIG9mIHRoZSBYTUwgcm9vdCB0eXBlLCB0aGUgV1NETCB0eXBlIHNjb3BlIHRoZSBRTmFtZSBhcHBsaWVzIHRvIGFuZCB0aGUgc2V0IG9mIHZhcmlhYmxlIAotICogbWFwcGluZ3MgZm9yIGVhY2ggcHVibGljIHZhcmlhYmxlIHdpdGhpbiB0aGUgSmF2YSBjbGFzcy4KLSAqIAotICogVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0Q2xhc3NUeXBlIDxlbT5DbGFzcyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0UW5hbWVTY29wZSA8ZW0+UW5hbWUgU2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRBbm9ueW1vdXNUeXBlUW5hbWUgPGVtPkFub255bW91cyBUeXBlIFFuYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0Um9vdFR5cGVRbmFtZSA8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0VmFyaWFibGVNYXBwaW5ncyA8ZW0+VmFyaWFibGUgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFYTUxUeXBlTWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhWE1MVHlwZU1hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3MgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY2xhc3MtdHlwZSBlbGVtZW50IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIEphdmEgY2xhc3MuCi0JICogCi0JICogVXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEphdmFYTUxUeXBlTWFwcGluZ19DbGFzc1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldENsYXNzVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldENsYXNzVHlwZSA8ZW0+Q2xhc3MgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldENsYXNzVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UW5hbWUgU2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UW5hbWUgU2NvcGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHFuYW1lLXNjb3BlIGVsZW1lbnRzIHNjb3BlcyB0aGUgcmVmZXJlbmNlIG9mIGEgUU5hbWUgdG8gdGhlIFdTREwgZWxlbWVudCB0eXBlIGl0IGFwcGxpZXMgdG8uIFRoZSB2YWx1ZSBvZiBxbmFtZS1zY29wZSBtYXkgYmUgc2ltcGxlVHlwZSwgY29tcGxleFR5cGUsIG9yIGVsZW1lbnQuCi0JICogCi0JICogVXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlFuYW1lIFNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRRbmFtZVNjb3BlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1FuYW1lU2NvcGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFFuYW1lU2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRRbmFtZVNjb3BlIDxlbT5RbmFtZSBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFuYW1lIFNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRRbmFtZVNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UW5hbWVTY29wZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFub255bW91c1R5cGVRbmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEphdmFYTUxUeXBlTWFwcGluZ19Bbm9ueW1vdXNUeXBlUW5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldEFub255bW91c1R5cGVRbmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldEFub255bW91c1R5cGVRbmFtZSA8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QW5vbnltb3VzVHlwZVFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0QW5vbnltb3VzVHlwZVFuYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb290IFR5cGUgUW5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Um9vdFR5cGVRbmFtZShSb290VHlwZVFuYW1lKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhWE1MVHlwZU1hcHBpbmdfUm9vdFR5cGVRbmFtZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFJvb3RUeXBlUW5hbWUgZ2V0Um9vdFR5cGVRbmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldFJvb3RUeXBlUW5hbWUgPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um9vdFR5cGVRbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFJvb3RUeXBlUW5hbWUoUm9vdFR5cGVRbmFtZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJsZSBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmxlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFibGUgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEphdmFYTUxUeXBlTWFwcGluZ19WYXJpYWJsZU1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldFZhcmlhYmxlTWFwcGluZ3MoKTsKLQotfSAvLyBKYXZhWE1MVHlwZU1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQzMTU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheHJwY21hcEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEpheHJwY21hcEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkphdmEgV1NETCBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SmF2YSBXU0RMIE1hcHBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBKYXZhV1NETE1hcHBpbmcgY3JlYXRlSmF2YVdTRExNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFBhY2thZ2VNYXBwaW5nIGNyZWF0ZVBhY2thZ2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEphdmFYTUxUeXBlTWFwcGluZyBjcmVhdGVKYXZhWE1MVHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXhjZXB0aW9uIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGNlcHRpb24gTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEV4Y2VwdGlvbk1hcHBpbmcgY3JlYXRlRXhjZXB0aW9uTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmljZSBJbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIGNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFJvb3RUeXBlUW5hbWUgY3JlYXRlUm9vdFR5cGVRbmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYXJpYWJsZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFyaWFibGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFZhcmlhYmxlTWFwcGluZyBjcmVhdGVWYXJpYWJsZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBNZXNzYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBNZXNzYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETE1lc3NhZ2UgY3JlYXRlV1NETE1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBjcmVhdGVDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQgTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQgTmFtZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVsZW1lbnROYW1lIGNyZWF0ZUVsZW1lbnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwgU2VydmljZSBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMU2VydmljZU5hbWUgY3JlYXRlV1NETFNlcnZpY2VOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFBvcnRNYXBwaW5nIGNyZWF0ZVBvcnRNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwgUG9ydCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBQb3J0IFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMUG9ydFR5cGUgY3JlYXRlV1NETFBvcnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwgQmluZGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwgQmluZGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExCaW5kaW5nIGNyZWF0ZVdTRExCaW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IE1ldGhvZCBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwgT3BlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBPcGVyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMT3BlcmF0aW9uIGNyZWF0ZVdTRExPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIGNyZWF0ZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETFJldHVyblZhbHVlTWFwcGluZyBjcmVhdGVXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMTWVzc2FnZU1hcHBpbmcgY3JlYXRlV1NETE1lc3NhZ2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETE1lc3NhZ2VQYXJ0TmFtZSBjcmVhdGVXU0RMTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBJbnRlcmZhY2VNYXBwaW5nIGNyZWF0ZUludGVyZmFjZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgbWV0aG9kIGlzIE5PVCBhcGksIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4gIAotCSAqIEVNRiBwYWNrYWdlIGNsYXNzZXMgc2hvdWxkIGJlIGFjY2VzcyB2aWEgdGhlaXIgImVJTlNUQU5DRSIgc3RhdGljIGZpZWxkcwotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEpheHJwY21hcFBhY2thZ2UgZ2V0SmF4cnBjbWFwUGFja2FnZSgpOwotCi19IC8vSmF4cnBjbWFwRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcFBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZThiODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhycGNtYXBQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZU5BTUUgPSAiamF4cnBjbWFwIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGVOU19VUkkgPSAiamF4cnBjbWFwLnhtaSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEpheHJwY21hcFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVdTRExNYXBwaW5nSW1wbCA8ZW0+SmF2YSBXU0RMIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldEphdmFXU0RMTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgSkFWQV9XU0RMX01BUFBJTkcgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1dTRExfTUFQUElOR19fSUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBYTUwgVHlwZSBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2VwdGlvbiBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1dTRExfTUFQUElOR19fRVhDRVBUSU9OX01BUFBJTkdTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1MgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIFdTREwgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfV1NETF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5QYWNrYWdlTWFwcGluZ0ltcGwgPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlBhY2thZ2VNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRQYWNrYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgUEFDS0FHRV9NQVBQSU5HID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUEFDS0FHRV9NQVBQSU5HX19JRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2UgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQQUNLQUdFX01BUFBJTkdfX05BTUVTUEFDRV9VUkkgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QYWNrYWdlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQQUNLQUdFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkphdmFYTUxUeXBlTWFwcGluZ0ltcGwgPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkphdmFYTUxUeXBlTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBKQVZBX1hNTF9UWVBFX01BUFBJTkcgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UW5hbWUgU2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfWE1MX1RZUEVfTUFQUElOR19fUU5BTUVfU0NPUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19BTk9OWU1PVVNfVFlQRV9RTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvb3QgVHlwZSBRbmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJsZSBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX1ZBUklBQkxFX01BUFBJTkdTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FeGNlcHRpb25NYXBwaW5nSW1wbCA8ZW0+RXhjZXB0aW9uIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FeGNlcHRpb25NYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRFeGNlcHRpb25NYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBFWENFUFRJT05fTUFQUElORyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEVYQ0VQVElPTl9NQVBQSU5HX19JRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2VwdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFWENFUFRJT05fTUFQUElOR19fRVhDRVBUSU9OX1RZUEUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4Y2VwdGlvbiBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgRVhDRVBUSU9OX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkludGVyZmFjZU1hcHBpbmdJbXBsIDxlbT5JbnRlcmZhY2UgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkludGVyZmFjZU1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldEludGVyZmFjZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IElOVEVSRkFDRV9NQVBQSU5HID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsIDxlbT5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fSUQgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9JTlRFUkZBQ0UgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFNlcnZpY2UgTmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9TRVJWSUNFX05BTUUgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1BPUlRfTUFQUElOR1MgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gSU5URVJGQUNFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0ltcGwgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFBvcnQgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEUgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEJpbmRpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORyA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdTID0gSU5URVJGQUNFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlJvb3RUeXBlUW5hbWVJbXBsIDxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Sb290VHlwZVFuYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRSb290VHlwZVFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBST09UX1RZUEVfUU5BTUUgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFJPT1RfVFlQRV9RTkFNRV9fTkFNRVNQQUNFX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgUGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUk9PVF9UWVBFX1FOQU1FX19MT0NBTF9QQVJUID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21iaW5lZCBRTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUk9PVF9UWVBFX1FOQU1FX19DT01CSU5FRF9RTkFNRSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFJPT1RfVFlQRV9RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUk9PVF9UWVBFX1FOQU1FX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlZhcmlhYmxlTWFwcGluZ0ltcGwgPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFZhcmlhYmxlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgVkFSSUFCTEVfTUFQUElORyA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFZBUklBQkxFX01BUFBJTkdfX0lEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBWYXJpYWJsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBWQVJJQUJMRV9NQVBQSU5HX19KQVZBX1ZBUklBQkxFX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YbWwgRWxlbWVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBWQVJJQUJMRV9NQVBQSU5HX19YTUxfRUxFTUVOVF9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBNZW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFZBUklBQkxFX01BUFBJTkdfX0RBVEFfTUVNQkVSID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WG1sIEF0dHJpYnV0ZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBWQVJJQUJMRV9NQVBQSU5HX19YTUxfQVRUUklCVVRFX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YbWwgV2lsZGNhcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBWQVJJQUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZUltcGwgPGVtPldTREwgTWVzc2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMTWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfX05BTUVTUEFDRV9VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIFBhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9fTE9DQUxfUEFSVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9fQ09NQklORURfUU5BTUUgPSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwgTWVzc2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5RTkFNRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbCA8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FbGVtZW50TmFtZUltcGwgPGVtPkVsZW1lbnQgTmFtZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkVsZW1lbnROYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRFbGVtZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgRUxFTUVOVF9OQU1FID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEVMRU1FTlRfTkFNRV9fSUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFTEVNRU5UX05BTUVfX1RFWFQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFTEVNRU5UX05BTUVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExTZXJ2aWNlTmFtZUltcGwgPGVtPldTREwgU2VydmljZSBOYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFNlcnZpY2VOYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMU2VydmljZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFdTRExfU0VSVklDRV9OQU1FID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9TRVJWSUNFX05BTUVfX05BTUVTUEFDRV9VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIFBhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfU0VSVklDRV9OQU1FX19MT0NBTF9QQVJUID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21iaW5lZCBRTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9TRVJWSUNFX05BTUVfX0NPTUJJTkVEX1FOQU1FID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fQ09NQklORURfUU5BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9TRVJWSUNFX05BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwgU2VydmljZSBOYW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9TRVJWSUNFX05BTUVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUG9ydE1hcHBpbmdJbXBsIDxlbT5Qb3J0IE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Qb3J0TWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0UG9ydE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFBPUlRfTUFQUElORyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX01BUFBJTkdfX0lEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX01BUFBJTkdfX1BPUlRfTkFNRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphdmEgUG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX01BUFBJTkdfX0pBVkFfUE9SVF9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9ydCBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUG9ydFR5cGVJbXBsIDxlbT5XU0RMIFBvcnQgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExQb3J0VHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETFBvcnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfVFlQRSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9UWVBFX19OQU1FU1BBQ0VfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBQYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfVFlQRV9fTE9DQUxfUEFSVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9UWVBFX19DT01CSU5FRF9RTkFNRSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9UWVBFX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XU0RMIFBvcnQgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExCaW5kaW5nSW1wbCA8ZW0+V1NETCBCaW5kaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETEJpbmRpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExCaW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXU0RMX0JJTkRJTkcgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX0JJTkRJTkdfX05BTUVTUEFDRV9VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIFBhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfQklORElOR19fTE9DQUxfUEFSVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfQklORElOR19fQ09NQklORURfUU5BTUUgPSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX0JJTkRJTkdfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwgQmluZGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfQklORElOR19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5RTkFNRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbCA8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkcgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXZhIE1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19KQVZBX01FVEhPRF9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBPcGVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3JhcHBlZCBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMT3BlcmF0aW9uSW1wbCA8ZW0+V1NETCBPcGVyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMT3BlcmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMT3BlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXU0RMX09QRVJBVElPTiA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX09QRVJBVElPTl9fSUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE9wZXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9PUEVSQVRJT05fX1dTRExfT1BFUkFUSU9OID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V1NETCBPcGVyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX09QRVJBVElPTl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsIDxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkcgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX0lEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gUG9zaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9QT1NJVElPTiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9UWVBFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIE1hcHBpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORyA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsIDxlbT5XU0RMIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19JRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX01FVEhPRF9SRVRVUk5fVkFMVUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0UgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XU0RMIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VNYXBwaW5nSW1wbCA8ZW0+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZU1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExNZXNzYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX01BUFBJTkcgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX01BUFBJTkdfX0lEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX01BUFBJTkdfX1BBUkFNRVRFUl9NT0RFID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9NQVBQSU5HX19TT0FQX0hFQURFUiA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRSA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlUGFydE5hbWVJbXBsIDxlbT5XU0RMIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX19JRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9QQVJUX05BTUVfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XU0RMIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcgPGVtPkphdmEgV1NETCBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KYXZhIFdTREwgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEphdmFXU0RMTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRKYXZhV1NETE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRKYXZhV1NETE1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0UGFja2FnZU1hcHBpbmdzIDxlbT5QYWNrYWdlIE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFja2FnZSBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRQYWNrYWdlTWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldEphdmFXU0RMTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEphdmFXU0RMTWFwcGluZ19QYWNrYWdlTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncyA8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0SmF2YVdTRExNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0RXhjZXB0aW9uTWFwcGluZ3MgPGVtPkV4Y2VwdGlvbiBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4Y2VwdGlvbiBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRFeGNlcHRpb25NYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0SmF2YVdTRExNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SmF2YVdTRExNYXBwaW5nX0V4Y2VwdGlvbk1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldEludGVyZmFjZU1hcHBpbmdzIDxlbT5JbnRlcmZhY2UgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2UgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldEphdmFXU0RMTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEphdmFXU0RMTWFwcGluZ19JbnRlcmZhY2VNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcgPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFja2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRQYWNrYWdlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UGFja2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQYWNrYWdlTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXRQYWNrYWdlVHlwZSA8ZW0+UGFja2FnZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhY2thZ2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldFBhY2thZ2VUeXBlKCkKLQkgKiBAc2VlICNnZXRQYWNrYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcjZ2V0TmFtZXNwYWNlVVJJKCkKLQkgKiBAc2VlICNnZXRQYWNrYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBhY2thZ2VNYXBwaW5nX05hbWVzcGFjZVVSSSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nIDxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEphdmFYTUxUeXBlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRKYXZhWE1MVHlwZU1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldENsYXNzVHlwZSA8ZW0+Q2xhc3MgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldENsYXNzVHlwZSgpCi0JICogQHNlZSAjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0NsYXNzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0UW5hbWVTY29wZSA8ZW0+UW5hbWUgU2NvcGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UW5hbWUgU2NvcGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0UW5hbWVTY29wZSgpCi0JICogQHNlZSAjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1FuYW1lU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldEFub255bW91c1R5cGVRbmFtZSA8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0QW5vbnltb3VzVHlwZVFuYW1lKCkKLQkgKiBAc2VlICNnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRKYXZhWE1MVHlwZU1hcHBpbmdfQW5vbnltb3VzVHlwZVFuYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRSb290VHlwZVFuYW1lIDxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldFJvb3RUeXBlUW5hbWUoKQotCSAqIEBzZWUgI2dldEphdmFYTUxUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEphdmFYTUxUeXBlTWFwcGluZ19Sb290VHlwZVFuYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldFZhcmlhYmxlTWFwcGluZ3MgPGVtPlZhcmlhYmxlIE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VmFyaWFibGUgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0VmFyaWFibGVNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcgPGVtPkV4Y2VwdGlvbiBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeGNlcHRpb24gTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRFeGNlcHRpb25NYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEV4Y2VwdGlvbk1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRFeGNlcHRpb25UeXBlIDxlbT5FeGNlcHRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNlcHRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0RXhjZXB0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEV4Y2VwdGlvbk1hcHBpbmdfRXhjZXB0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQHNlZSAjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldFdzZGxNZXNzYWdlIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRXc2RsTWVzc2FnZSgpCi0JICogQHNlZSAjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLQkgKiBAc2VlICNnZXRFeGNlcHRpb25NYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyA8ZW0+U2VydmljZSBJbnRlcmZhY2UgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmljZSBJbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0U2VydmljZUludGVyZmFjZSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbFNlcnZpY2VOYW1lIDxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxTZXJ2aWNlTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRQb3J0TWFwcGluZ3MgPGVtPlBvcnQgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3J0IE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0UG9ydE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxQb3J0VHlwZSA8ZW0+V3NkbCBQb3J0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V3NkbCBQb3J0IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxQb3J0VHlwZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbEJpbmRpbmcgPGVtPldzZGwgQmluZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xc2RsIEJpbmRpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxCaW5kaW5nKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsQmluZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MgPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZSA8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0Um9vdFR5cGVRbmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nIDxlbT5WYXJpYWJsZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5WYXJpYWJsZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0VmFyaWFibGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFZhcmlhYmxlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFZhcmlhYmxlTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0SmF2YVZhcmlhYmxlTmFtZSA8ZW0+SmF2YSBWYXJpYWJsZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkphdmEgVmFyaWFibGUgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRKYXZhVmFyaWFibGVOYW1lKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJsZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRWYXJpYWJsZU1hcHBpbmdfSmF2YVZhcmlhYmxlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0WG1sRWxlbWVudE5hbWUgPGVtPlhtbCBFbGVtZW50IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRYbWxFbGVtZW50TmFtZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX1htbEVsZW1lbnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNpc0RhdGFNZW1iZXIgPGVtPkRhdGEgTWVtYmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGEgTWVtYmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzRGF0YU1lbWJlcigpCi0JICogQHNlZSAjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX0RhdGFNZW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldFhtbEF0dHJpYnV0ZU5hbWUgPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YbWwgQXR0cmlidXRlIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0WG1sQXR0cmlidXRlTmFtZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzWG1sV2lsZGNhcmQgPGVtPlhtbCBXaWxkY2FyZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YbWwgV2lsZGNhcmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjaXNYbWxXaWxkY2FyZCgpCi0JICogQHNlZSAjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX1htbFdpbGRjYXJkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZSA8ZW0+V1NETCBNZXNzYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMIE1lc3NhZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFdTRExNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyI2dldEVsZW1lbnROYW1lcyA8ZW0+RWxlbWVudCBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVsZW1lbnQgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyI2dldEVsZW1lbnROYW1lcygpCi0JICogQHNlZSAjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfRWxlbWVudE5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZSA8ZW0+RWxlbWVudCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEVsZW1lbnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lI2dldElkKCkKLQkgKiBAc2VlICNnZXRFbGVtZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEVsZW1lbnROYW1lX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lI2dldFRleHQgPGVtPlRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lI2dldFRleHQoKQotCSAqIEBzZWUgI2dldEVsZW1lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0RWxlbWVudE5hbWVfVGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lIDxlbT5XU0RMIFNlcnZpY2UgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXU0RMU2VydmljZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nIDxlbT5Qb3J0IE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcnQgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0UG9ydE1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFBvcnRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydE1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRQb3J0TmFtZSgpCi0JICogQHNlZSAjZ2V0UG9ydE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0TWFwcGluZ19Qb3J0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRKYXZhUG9ydE5hbWUgPGVtPkphdmEgUG9ydCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkphdmEgUG9ydCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0SmF2YVBvcnROYW1lKCkKLQkgKiBAc2VlICNnZXRQb3J0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBvcnRNYXBwaW5nX0phdmFQb3J0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlIDxlbT5XU0RMIFBvcnQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBQb3J0IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXU0RMUG9ydFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nIDxlbT5XU0RMIEJpbmRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldTREwgQmluZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0V1NETEJpbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcgPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0SmF2YU1ldGhvZE5hbWUgPGVtPkphdmEgTWV0aG9kIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmF2YSBNZXRob2QgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0SmF2YU1ldGhvZE5hbWUoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0phdmFNZXRob2ROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0V3NkbE9wZXJhdGlvbiA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBPcGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldFdzZGxPcGVyYXRpb24oKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNpc1dyYXBwZWRFbGVtZW50IDxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNpc1dyYXBwZWRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19XcmFwcGVkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzIDxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0V3NkbFJldHVyblZhbHVlTWFwcGluZyA8ZW0+V3NkbCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uIDxlbT5XU0RMIE9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBPcGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0V1NETE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24jZ2V0SWQoKQotCSAqIEBzZWUgI2dldFdTRExPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMT3BlcmF0aW9uX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24jZ2V0V3NkbE9wZXJhdGlvbiA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBPcGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uI2dldFdzZGxPcGVyYXRpb24oKQotCSAqIEBzZWUgI2dldFdTRExPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMT3BlcmF0aW9uX1dzZGxPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIDxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldFBhcmFtUG9zaXRpb24gPGVtPlBhcmFtIFBvc2l0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcmFtIFBvc2l0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1Qb3NpdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldFBhcmFtVHlwZSA8ZW0+UGFyYW0gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJhbSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1UeXBlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRXc2RsTWVzc2FnZU1hcHBpbmcgPGVtPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1dzZGxNZXNzYWdlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyA8ZW0+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRNZXRob2RSZXR1cm5WYWx1ZSA8ZW0+TWV0aG9kIFJldHVybiBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRNZXRob2RSZXR1cm5WYWx1ZSgpCi0JICogQHNlZSAjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBzZWUgI2dldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRXc2RsTWVzc2FnZSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldzZGwgTWVzc2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UoKQotCSAqIEBzZWUgI2dldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcgPGVtPldTREwgTWVzc2FnZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMIE1lc3NhZ2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFdTRExNZXNzYWdlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAc2VlICNnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0UGFyYW1ldGVyTW9kZSA8ZW0+UGFyYW1ldGVyIE1vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyYW1ldGVyIE1vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0UGFyYW1ldGVyTW9kZSgpCi0JICogQHNlZSAjZ2V0V1NETE1lc3NhZ2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1BhcmFtZXRlck1vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldFdzZGxNZXNzYWdlIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldFdzZGxNZXNzYWdlKCkKLQkgKiBAc2VlICNnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2lzU29hcEhlYWRlciA8ZW0+U29hcCBIZWFkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBIZWFkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjaXNTb2FwSGVhZGVyKCkKLQkgKiBAc2VlICNnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfU29hcEhlYWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXU0RMTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExNZXNzYWdlUGFydE5hbWVfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBzZWUgI2dldFdTRExNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZVBhcnROYW1lX1dzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmcgPGVtPkludGVyZmFjZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEpheHJwY21hcEZhY3RvcnkgZ2V0SmF4cnBjbWFwRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsIDxlbT5KYXZhIFdTREwgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVdTRExNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0SmF2YVdTRExNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpBVkFfV1NETF9NQVBQSU5HID0gZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKQVZBX1dTRExfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX1dTRExfTUFQUElOR19fUEFDS0FHRV9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfUGFja2FnZU1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIFhNTCBUeXBlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjZXB0aW9uIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX1dTRExfTUFQUElOR19fRVhDRVBUSU9OX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19FeGNlcHRpb25NYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX1dTRExfTUFQUElOR19fSU5URVJGQUNFX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19JbnRlcmZhY2VNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5QYWNrYWdlTWFwcGluZ0ltcGwgPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUGFja2FnZU1hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRQYWNrYWdlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQQUNLQUdFX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0UGFja2FnZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUEFDS0FHRV9NQVBQSU5HX19JRCA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlTWFwcGluZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UGFja2FnZU1hcHBpbmdfUGFja2FnZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQQUNLQUdFX01BUFBJTkdfX05BTUVTUEFDRV9VUkkgPSBlSU5TVEFOQ0UuZ2V0UGFja2FnZU1hcHBpbmdfTmFtZXNwYWNlVVJJKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkphdmFYTUxUeXBlTWFwcGluZ0ltcGwgPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpBVkFfWE1MX1RZUEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19JRCA9IGVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0NsYXNzVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UW5hbWUgU2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX1FOQU1FX1NDT1BFID0gZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19RbmFtZVNjb3BlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUUgPSBlSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0Fub255bW91c1R5cGVRbmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9vdCBUeXBlIFFuYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUgPSBlSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmxlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX1ZBUklBQkxFX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19WYXJpYWJsZU1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkV4Y2VwdGlvbk1hcHBpbmdJbXBsIDxlbT5FeGNlcHRpb24gTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRXhjZXB0aW9uTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldEV4Y2VwdGlvbk1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhDRVBUSU9OX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFWENFUFRJT05fTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjZXB0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFWENFUFRJT05fTUFQUElOR19fRVhDRVBUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZ19FeGNlcHRpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBFWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFID0gZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIgPSBlSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbCA8ZW0+U2VydmljZSBJbnRlcmZhY2UgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX0lEID0gZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgU2VydmljZSBOYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9TRVJWSUNFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfV3NkbFNlcnZpY2VOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19QT1JUX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX0lEID0gZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgUG9ydCBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsUG9ydFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgQmluZGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IE1ldGhvZCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Sb290VHlwZVFuYW1lSW1wbCA8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Sb290VHlwZVFuYW1lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0Um9vdFR5cGVRbmFtZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST09UX1RZUEVfUU5BTUUgPSBlSU5TVEFOQ0UuZ2V0Um9vdFR5cGVRbmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsIDxlbT5WYXJpYWJsZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRWYXJpYWJsZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVkFSSUFCTEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVkFSSUFCTEVfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIFZhcmlhYmxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBWQVJJQUJMRV9NQVBQSU5HX19KQVZBX1ZBUklBQkxFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX0phdmFWYXJpYWJsZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhtbCBFbGVtZW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBWQVJJQUJMRV9NQVBQSU5HX19YTUxfRUxFTUVOVF9OQU1FID0gZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZ19YbWxFbGVtZW50TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBNZW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBWQVJJQUJMRV9NQVBQSU5HX19EQVRBX01FTUJFUiA9IGVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfRGF0YU1lbWJlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WG1sIEF0dHJpYnV0ZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVkFSSUFCTEVfTUFQUElOR19fWE1MX0FUVFJJQlVURV9OQU1FID0gZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZ19YbWxBdHRyaWJ1dGVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YbWwgV2lsZGNhcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBWQVJJQUJMRV9NQVBQSU5HX19YTUxfV0lMRENBUkQgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX1htbFdpbGRjYXJkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlSW1wbCA8ZW0+V1NETCBNZXNzYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExNZXNzYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdTRExfTUVTU0FHRSA9IGVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbCA8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIgPSBlSU5TVEFOQ0UuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0lEID0gZUlOU1RBTkNFLmdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fRUxFTUVOVF9OQU1FUyA9IGVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0VsZW1lbnROYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FbGVtZW50TmFtZUltcGwgPGVtPkVsZW1lbnQgTmFtZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRWxlbWVudE5hbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRFbGVtZW50TmFtZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTEVNRU5UX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RWxlbWVudE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxFTUVOVF9OQU1FX19JRCA9IGVJTlNUQU5DRS5nZXRFbGVtZW50TmFtZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVMRU1FTlRfTkFNRV9fVEVYVCA9IGVJTlNUQU5DRS5nZXRFbGVtZW50TmFtZV9UZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExTZXJ2aWNlTmFtZUltcGwgPGVtPldTREwgU2VydmljZSBOYW1lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMU2VydmljZU5hbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMU2VydmljZU5hbWUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV1NETF9TRVJWSUNFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0V1NETFNlcnZpY2VOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlBvcnRNYXBwaW5nSW1wbCA8ZW0+UG9ydCBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Qb3J0TWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFBvcnRNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBPUlRfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRQb3J0TWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX01BUFBJTkdfX0lEID0gZUlOU1RBTkNFLmdldFBvcnRNYXBwaW5nX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX01BUFBJTkdfX1BPUlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRQb3J0TWFwcGluZ19Qb3J0TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBQb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX01BUFBJTkdfX0pBVkFfUE9SVF9OQU1FID0gZUlOU1RBTkNFLmdldFBvcnRNYXBwaW5nX0phdmFQb3J0TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUG9ydFR5cGVJbXBsIDxlbT5XU0RMIFBvcnQgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFBvcnRUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETFBvcnRUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdTRExfUE9SVF9UWVBFID0gZUlOU1RBTkNFLmdldFdTRExQb3J0VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMQmluZGluZ0ltcGwgPGVtPldTREwgQmluZGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETEJpbmRpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMQmluZGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXU0RMX0JJTkRJTkcgPSBlSU5TVEFOQ0UuZ2V0V1NETEJpbmRpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwgPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19JRCA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIE1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSkFWQV9NRVRIT0RfTkFNRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0phdmFNZXRob2ROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE9wZXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OID0gZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3JhcHBlZCBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1JBUFBFRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3JhcHBlZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE9wZXJhdGlvbkltcGwgPGVtPldTREwgT3BlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMT3BlcmF0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETE9wZXJhdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXU0RMX09QRVJBVElPTiA9IGVJTlNUQU5DRS5nZXRXU0RMT3BlcmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdTRExfT1BFUkFUSU9OX19JRCA9IGVJTlNUQU5DRS5nZXRXU0RMT3BlcmF0aW9uX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE9wZXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdTRExfT1BFUkFUSU9OX19XU0RMX09QRVJBVElPTiA9IGVJTlNUQU5DRS5nZXRXU0RMT3BlcmF0aW9uX1dzZGxPcGVyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsIDxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtIFBvc2l0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1BPU0lUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtUG9zaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fVFlQRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1dzZGxNZXNzYWdlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbCA8ZW0+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEID0gZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19NRVRIT0RfUkVUVVJOX1ZBTFVFID0gZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FID0gZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFID0gZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VNYXBwaW5nSW1wbCA8ZW0+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExNZXNzYWdlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXU0RMX01FU1NBR0VfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV1NETF9NRVNTQUdFX01BUFBJTkdfX0lEID0gZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FID0gZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdTRExfTUVTU0FHRV9NQVBQSU5HX19QQVJBTUVURVJfTU9ERSA9IGVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfUGFyYW1ldGVyTW9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXU0RMX01FU1NBR0VfTUFQUElOR19fU09BUF9IRUFERVIgPSBlSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1NvYXBIZWFkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0UgPSBlSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlUGFydE5hbWVJbXBsIDxlbT5XU0RMIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZVBhcnROYW1lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXU0RMX01FU1NBR0VfUEFSVF9OQU1FID0gZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlUGFydE5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQgPSBlSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9Xc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkludGVyZmFjZU1hcHBpbmdJbXBsIDxlbT5JbnRlcmZhY2UgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSW50ZXJmYWNlTWFwcGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldEludGVyZmFjZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSU5URVJGQUNFX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0SW50ZXJmYWNlTWFwcGluZygpOwotCi0JfQotCi19IC8vSmF4cnBjbWFwUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwN2Q4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSmF4cnBjbWFwUmVzb3VyY2UgZXh0ZW5kcyBYTUxSZXNvdXJjZQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVhSUENfTUFQX1RZUEUgPSA4OwotCi0gIEphdmFXU0RMTWFwcGluZyBnZXRKYXZhV1NETE1hcHBpbmcoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNKYXhycGNtYXAxXzAoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNKYXhycGNtYXAxXzEoKTsKLSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNzFjNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC5XZWJTZXJ2aWNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeQotewotICAvKioKLSAgKiBKYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLSAgKi8KLSAgcHVibGljIEpheHJwY21hcFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgCi0gIHsKLQkgIHN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOwotICB9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXJldHVybiBuZXcgSmF4cnBjbWFwUmVzb3VyY2VJbXBsKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0gICAgLy9EbyBub3RoaW5nIHNpbmNlIHRoZSBqYXhycGMgbWFwcGluZyBmaWxlIGhhcyBubyBzdGFuZGFyZCBuYW1lLgotICAJLy9KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX0REX1NIT1JUX05BTUUsIG5ldyBXc2RkUmVzb3VyY2VGYWN0b3J5KGFSZW5kZXJlckZhY3RvcnkpKTsKLSAgfQotCQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JICAgIC8vRG8gbm90aGluZyBzaW5jZSB0aGUgamF4cnBjIG1hcHBpbmcgZmlsZSBoYXMgbm8gc3RhbmRhcmQgbmFtZS4KLQkJLy9yZWdpc3RlcldpdGgoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSk7Ci0JfQotCi0gIC8qKgotICAgKiBNZXRob2QgcmVnaXN0ZXJEdGRzLgotICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEdGRzKCkgCi0gIHsKLSAgCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLkpBWFJQQ01BUF9TWVNURU1JRCwgImoyZWVfamF4cnBjX21hcHBpbmdfMV8wLmR0ZCIpOy8vJE5PTi1OTFMtMSQKLQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfU0NIRU1BX0xPQywgImoyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCIpOyAvLyROT04tTkxTLTEkICAJCi0JSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKFdlYlNlcnZpY2VDb25zdGFudHMuSkFYUlBDTUFQX1NDSEVNQV9MT0NfU1VOLCAiajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIik7IC8vJE5PTi1OTFMtMSQgIAkJCQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9NZXRob2RQYXJhbVBhcnRzTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YmZkMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGEgSmF2YSBtZXRob2QgcGFyYW1ldGVycyBhbmQgYSB3c2RsLW1lc3NhZ2UuCi0gKiAKLSAqIFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldFBhcmFtUG9zaXRpb24gPGVtPlBhcmFtIFBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRQYXJhbVR5cGUgPGVtPlBhcmFtIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldFdzZGxNZXNzYWdlTWFwcGluZyA8ZW0+V3NkbCBNZXNzYWdlIE1hcHBpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW0gUG9zaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyYW0gUG9zaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBhcmFtLXBvc2l0aW9uIGVsZW1lbnQgZGVmaW5lcyB0aGUgcG9zaXRpb24gb2YgYSBwYXJhbWV0ZXIgd2l0aGluIGEgSmF2YSBtZXRob2QuICBJdCBtdXN0IGJlIGFuIGludGVnZXIgc3RhcnRpbmcgZnJvbSAwLgotCSAqIAotCSAqIFVzZWQgaW46IG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtIFBvc2l0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJhbVBvc2l0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1Qb3NpdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0UGFyYW1Qb3NpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1Qb3NpdGlvbiA8ZW0+UGFyYW0gUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBQb3NpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyYW1Qb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFBhcmFtUG9zaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmFtIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyYW0gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGFyYW0tdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBvZiBhIHBhcmFtZXRlciB3aXRoaW4gYSBKYXZhIG1ldGhvZC4gSXQgbXVzdCBiZSBkZWZpbmVkIGJ5IGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcy4KLQkgKiAKLQkgKiBVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZwotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJhbVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFBhcmFtVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1UeXBlIDxlbT5QYXJhbSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW0gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyYW1UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UGFyYW1UeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V3NkbE1lc3NhZ2VNYXBwaW5nKFdTRExNZXNzYWdlTWFwcGluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfV3NkbE1lc3NhZ2VNYXBwaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETE1lc3NhZ2VNYXBwaW5nIGdldFdzZGxNZXNzYWdlTWFwcGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nIDxlbT5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsTWVzc2FnZU1hcHBpbmcoV1NETE1lc3NhZ2VNYXBwaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RQYXJhbVBhcnRzTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1BhY2thZ2VNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvUGFja2FnZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4ZDEzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvUGFja2FnZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFja2FnZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHBhY2thZ2UtbWFwcGluZyBpbmRpY2F0ZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBqYXZhLXBhY2thZ2UtbmFtZSBhbmQgWE1MIG5hbWVzcGFjZSBpbiB0aGUgV1NETCBkb2N1bWVudC4KLSAqIAotICogVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldFBhY2thZ2VUeXBlIDxlbT5QYWNrYWdlIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQYWNrYWdlTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYWNrYWdlTWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQYWNrYWdlTWFwcGluZ19JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWNrYWdlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFja2FnZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwYWNrYWdlLXR5cGUgaW5kaWNhdGVzIHRoZSBKYXZhIHBhY2thZ2UgbmFtZS4gSXQgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLgotCSAqIAotCSAqIFVzZWQgaW46IHBhY2thZ2UtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhY2thZ2VUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0UGFja2FnZU1hcHBpbmdfUGFja2FnZVR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFBhY2thZ2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXRQYWNrYWdlVHlwZSA8ZW0+UGFja2FnZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFja2FnZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYWNrYWdlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFBhY2thZ2VUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZXNwYWNlVVJJKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0UGFja2FnZU1hcHBpbmdfTmFtZXNwYWNlVVJJKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFBhY2thZ2VNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvUG9ydE1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Qb3J0TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzUyMzI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Qb3J0TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgcG9ydC1tYXBwaW5nIGRlZmluZXMgdGhlIG1hcHBpbmcgb2YgdGhlIFdTREwgcG9ydCBuYW1lIGF0dHJpYnV0ZSB0byB0aGUgSmF2YSBuYW1lIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBtZXRob2QgZ2V0PGphdmEtbmFtZT4uCi0gKiAKLSAqIFVzZWQgaW46IHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nI2dldEphdmFQb3J0TmFtZSA8ZW0+SmF2YSBQb3J0IE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0UG9ydE1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9ydE1hcHBpbmcgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0UG9ydE1hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9ydC1uYW1lIGlzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBuYW1lIGF0dHJpYnV0ZSBvZiBhIFdTREwgcG9ydCBlbGVtZW50LgotCSAqIAotCSAqIFVzZWQgaW46IHBvcnQtbWFwcGluZwotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvcnROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0UG9ydE1hcHBpbmdfUG9ydE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFBvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFBvcnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5KYXZhIFBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KYXZhIFBvcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgamF2YS1wb3J0LW5hbWUgZWxlbWVudCBpcyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgcG9ydCBuYW1lIGluIEphdmEuICBJdCBpcyB1c2VkIGluIGdlbmVyYXRpbmcgdGhlIEdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBtZXRob2QKLQkgKiBnZXQ8amF2YS1wb3J0LW5hbWU+LgotCSAqIAotCSAqIFVzZWQgaW46IHBvcnQtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIFBvcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SmF2YVBvcnROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0UG9ydE1hcHBpbmdfSmF2YVBvcnROYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRKYXZhUG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nI2dldEphdmFQb3J0TmFtZSA8ZW0+SmF2YSBQb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIFBvcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SmF2YVBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SmF2YVBvcnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUG9ydE1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Sb290VHlwZVFuYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvUm9vdFR5cGVRbmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZhZjJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Sb290VHlwZVFuYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9vdCBUeXBlIFFuYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHJvb3QtdHlwZS1xbmFtZSBpZGVudGlmaWVzIHRoZSBXU0RMIFFOYW1lIG9mIGFuIFhNTCB0eXBlLgotICogCi0gKiBVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFJvb3RUeXBlUW5hbWUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9vdFR5cGVRbmFtZSBleHRlbmRzIFFOYW1lIHsKLS8vIFJvb3RUeXBlUW5hbWUKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTMxM2RmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyBkZWZpbmVzIGEgdHVwbGUKLSAqIHRvIHNwZWNpZnkgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIFdTREwgcG9ydCB0eXBlcyBhbmQgV1NETCBiaW5kaW5ncy4KLSAqIAotICogQW4gaW50ZXJmYWNlIG1heSBiZSBtYXBwZWQgdG8gYSBwb3J0LXR5cGUgYW5kIGJpbmRpbmcgbXVsdGlwbGUgdGltZXMuIFRoaXMgaGFwcGVucyByYXJlbHkuCi0gKiAKLSAqIFVzZWQgaW46IGphdmEtd3NkbC1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRXc2RsUG9ydFR5cGUgPGVtPldzZGwgUG9ydCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxCaW5kaW5nIDxlbT5Xc2RsIEJpbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MgPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyBleHRlbmRzIEludGVyZmFjZU1hcHBpbmcgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgZm9yIHRoZSBlbmRwb2ludCBpbnRlcmZhY2UuIFRoZSBuYW1lIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLQkgKiAKLQkgKiBVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIFBvcnQgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIFBvcnQgVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFBvcnQgVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V3NkbFBvcnRUeXBlKFdTRExQb3J0VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsUG9ydFR5cGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMUG9ydFR5cGUgZ2V0V3NkbFBvcnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxQb3J0VHlwZSA8ZW0+V3NkbCBQb3J0IFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFBvcnQgVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V3NkbFBvcnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbFBvcnRUeXBlKFdTRExQb3J0VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIEJpbmRpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBCaW5kaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgQmluZGluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V3NkbEJpbmRpbmcoV1NETEJpbmRpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbEJpbmRpbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMQmluZGluZyBnZXRXc2RsQmluZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRXc2RsQmluZGluZyA8ZW0+V3NkbCBCaW5kaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBCaW5kaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsQmluZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxCaW5kaW5nKFdTRExCaW5kaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCk7Ci0KLX0gLy8gU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDkyN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgb2YgSmF2YSBtZXRob2RzIHRvIG9wZXJhdGlvbnMgKHdoaWNoIGFyZSBub3QgdW5pcXVlbHkgcXVhbGlmaWVkIGJ5IHFuYW1lcykuCi0gKiAKLSAqIFRoZSB3c2RsLW9wZXJhdGlvbiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBwb3J0VHlwZSBhbmQgYmluZGluZyBpbiB3aGljaCB0aGlzIGRlZmluaXRpb24gaXMgZW1iZWRkZWQgd2l0aGluLiBTZWUgdGhlIGRlZmluaXRpb25zIGZvciBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIGFuZCAKLSAqIHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcgdG8gYWNxdWlyZSB0aGUgcHJvcGVyIGNvbnRleHQuIFRoZSB3cmFwcGVkLWVsZW1lbnQgaW5kaWNhdG9yIHNob3VsZCBvbmx5IGJlIHNwZWNpZmllZCB3aGVuIGEgV1NETCBtZXNzYWdlIHdyYXBzIGFuIGVsZW1lbnQgdHlwZS4gIFRoZSB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nIGlzIG5vdCBzcGVjaWZpZWQgZm9yIG9uZS13YXkgb3BlcmF0aW9ucy4KLSAqIAotICogVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldEphdmFNZXRob2ROYW1lIDxlbT5KYXZhIE1ldGhvZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldFdzZGxPcGVyYXRpb24gPGVtPldzZGwgT3BlcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2lzV3JhcHBlZEVsZW1lbnQgPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MgPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nIDxlbT5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmF2YSBNZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KYXZhIE1ldGhvZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBqYXZhLW1ldGhvZC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIEphdmEgbWV0aG9kIHdpdGhpbiBhbiBpbnRlcmZhY2UuCi0JICogCi0JICogVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIE1ldGhvZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKYXZhTWV0aG9kTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSmF2YU1ldGhvZE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldEphdmFNZXRob2ROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldEphdmFNZXRob2ROYW1lIDxlbT5KYXZhIE1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBNZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SmF2YU1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRKYXZhTWV0aG9kTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBPcGVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBPcGVyYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHdzZGwtb3BlcmF0aW9uIGVsZW1lbnQgZGVmaW5lcyBhbiBvcGVyYXRpb24gd2l0aGluIGEgV1NETCBkb2N1bWVudC4gSXQgbXVzdCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gYSBwb3J0IHR5cGUuCi0JICogCi0JICogVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V3NkbE9wZXJhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0V3NkbE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRXc2RsT3BlcmF0aW9uIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgT3BlcmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXc2RsT3BlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbE9wZXJhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3JhcHBlZCBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0V3JhcHBlZEVsZW1lbnQoKQotCSAqIEBzZWUgI3Vuc2V0V3JhcHBlZEVsZW1lbnQoKQotCSAqIEBzZWUgI3NldFdyYXBwZWRFbGVtZW50KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3JhcHBlZEVsZW1lbnQoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1dyYXBwZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2lzV3JhcHBlZEVsZW1lbnQgPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXcmFwcGVkRWxlbWVudCgpCi0JICogQHNlZSAjdW5zZXRXcmFwcGVkRWxlbWVudCgpCi0JICogQHNlZSAjaXNXcmFwcGVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdyYXBwZWRFbGVtZW50KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2lzV3JhcHBlZEVsZW1lbnQgPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0V3JhcHBlZEVsZW1lbnQoKQotCSAqIEBzZWUgI2lzV3JhcHBlZEVsZW1lbnQoKQotCSAqIEBzZWUgI3NldFdyYXBwZWRFbGVtZW50KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHVuc2V0V3JhcHBlZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNpc1dyYXBwZWRFbGVtZW50IDxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFdyYXBwZWRFbGVtZW50KCkKLQkgKiBAc2VlICNpc1dyYXBwZWRFbGVtZW50KCkKLQkgKiBAc2VlICNzZXRXcmFwcGVkRWxlbWVudChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1NldFdyYXBwZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbFJldHVyblZhbHVlTWFwcGluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETFJldHVyblZhbHVlTWFwcGluZyBnZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgPGVtPldzZGwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbFJldHVyblZhbHVlTWFwcGluZyhXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIHZhbHVlKTsKLQotfSAvLyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvU2VydmljZUludGVyZmFjZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTdiMmUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGhvdyBhIEphdmEgdHlwZSBmb3IgdGhlIHNlcnZpY2UgaW50ZXJmYWNlIG1hcHMgdG8gYSBXU0RMIHNlcnZpY2UuCi0gKiAKLSAqIFVzZWQgaW46IGphdmEtd3NkbC1tYXBwaW5nCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldFNlcnZpY2VJbnRlcmZhY2UgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRXc2RsU2VydmljZU5hbWUgPGVtPldzZGwgU2VydmljZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRQb3J0TWFwcGluZ3MgPGVtPlBvcnQgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZUludGVyZmFjZU1hcHBpbmcgZXh0ZW5kcyBJbnRlcmZhY2VNYXBwaW5nIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VydmljZS1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgZm9yIHRoZSBzZXJ2aWNlLiBGb3Igc3RhdGljIHNlcnZpY2VzLCBpdCBpcyBqYXZheC54bWwucnBjLlNlcnZpY2UgaW50ZXJmYWNlLiBGb3IgZ2VuZXJhdGVkIHNlcnZpY2UsIGl0IHdvdWxkIGJlIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlIG5hbWUuCi0JICogCi0JICogVGhlIG5hbWUgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCSAqIAotCSAqIFVzZWQgaW46IHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VJbnRlcmZhY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRTZXJ2aWNlSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlSW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0U2VydmljZUludGVyZmFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBTZXJ2aWNlIE5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBTZXJ2aWNlIE5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBTZXJ2aWNlIE5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdzZGxTZXJ2aWNlTmFtZShXU0RMU2VydmljZU5hbWUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExTZXJ2aWNlTmFtZSBnZXRXc2RsU2VydmljZU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxTZXJ2aWNlTmFtZSA8ZW0+V3NkbCBTZXJ2aWNlIE5hbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V3NkbFNlcnZpY2VOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbFNlcnZpY2VOYW1lKFdTRExTZXJ2aWNlTmFtZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3J0IE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfUG9ydE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0UG9ydE1hcHBpbmdzKCk7Ci0KLX0gLy8gU2VydmljZUludGVyZmFjZU1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9WYXJpYWJsZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9WYXJpYWJsZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmYmJlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvVmFyaWFibGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhcmlhYmxlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgdmFyaWFibGUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gYSBKYXZhIGNsYXNzIGRhdGEgbWVtYmVyIG9yIEphdmFCZWFucyBwcm9wZXJ0eSB0byBhbiBYTUwgZWxlbWVudCBuYW1lIG9mIGFuIFhNTCByb290IHR5cGUuIElmIHRoZSBkYXRhLW1lbWJlciBlbGVtZW50IGlzIHByZXNlbnQsIHRoZSBKYXZhIHZhcmlhYmxlIG5hbWUgaXMgYSBwdWJsaWMgZGF0YSBtZW1iZXIuICBJZiBkYXRhLW1lbWJlcgotICogaXMgbm90IHByZXNlbnQsIHRoZSBKYXZhIHZhcmlhYmxlIG5hbWUgaXMgYSBKYXZhQmVhbnMgcHJvcGVydHkuCi0gKiAKLSAqIFVzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRKYXZhVmFyaWFibGVOYW1lIDxlbT5KYXZhIFZhcmlhYmxlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRYbWxFbGVtZW50TmFtZSA8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzRGF0YU1lbWJlciA8ZW0+RGF0YSBNZW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRYbWxBdHRyaWJ1dGVOYW1lIDxlbT5YbWwgQXR0cmlidXRlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNpc1htbFdpbGRjYXJkIDxlbT5YbWwgV2lsZGNhcmQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhcmlhYmxlTWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRWYXJpYWJsZU1hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkphdmEgVmFyaWFibGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KYXZhIFZhcmlhYmxlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGphdmEtdmFyaWFibGUtbmFtZSBkZWZpbmVzIHRoZSBuYW1lIG9mIGEgcHVibGljIGRhdGEgbWVtYmVyIG9yICBKYXZhQmVhbnMgcHJvcGVydHkgd2l0aGluIGEgSmF2YSBjbGFzcy4gCi0JICogCi0JICogVXNlZCBpbjogdmFyaWFibGUtbWFwcGluZwotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIFZhcmlhYmxlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEphdmFWYXJpYWJsZU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRWYXJpYWJsZU1hcHBpbmdfSmF2YVZhcmlhYmxlTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SmF2YVZhcmlhYmxlTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldEphdmFWYXJpYWJsZU5hbWUgPGVtPkphdmEgVmFyaWFibGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgVmFyaWFibGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SmF2YVZhcmlhYmxlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEphdmFWYXJpYWJsZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhtbCBFbGVtZW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgeG1sLWVsZW1lbnQtbmFtZSBlbGVtZW50IGRlZmluZXMgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBXU0RMIGVsZW1lbnQgd2l0aGluIGEgcm9vdCB0eXBlLgotCSAqIAotCSAqIFVzZWQgaW46IHZhcmlhYmxlLW1hcHBpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0WG1sRWxlbWVudE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRWYXJpYWJsZU1hcHBpbmdfWG1sRWxlbWVudE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFhtbEVsZW1lbnROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0WG1sRWxlbWVudE5hbWUgPGVtPlhtbCBFbGVtZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YbWwgRWxlbWVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRYbWxFbGVtZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFhtbEVsZW1lbnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhIE1lbWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EYXRhIE1lbWJlcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIE1lbWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREYXRhTWVtYmVyKCkKLQkgKiBAc2VlICN1bnNldERhdGFNZW1iZXIoKQotCSAqIEBzZWUgI3NldERhdGFNZW1iZXIoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0VmFyaWFibGVNYXBwaW5nX0RhdGFNZW1iZXIoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc0RhdGFNZW1iZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNpc0RhdGFNZW1iZXIgPGVtPkRhdGEgTWVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBNZW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGF0YU1lbWJlcigpCi0JICogQHNlZSAjdW5zZXREYXRhTWVtYmVyKCkKLQkgKiBAc2VlICNpc0RhdGFNZW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXREYXRhTWVtYmVyKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjaXNEYXRhTWVtYmVyIDxlbT5EYXRhIE1lbWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGF0YU1lbWJlcigpCi0JICogQHNlZSAjaXNEYXRhTWVtYmVyKCkKLQkgKiBAc2VlICNzZXREYXRhTWVtYmVyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHVuc2V0RGF0YU1lbWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjaXNEYXRhTWVtYmVyIDxlbT5EYXRhIE1lbWJlcjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgTWVtYmVyPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREYXRhTWVtYmVyKCkKLQkgKiBAc2VlICNpc0RhdGFNZW1iZXIoKQotCSAqIEBzZWUgI3NldERhdGFNZW1iZXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGJvb2xlYW4gaXNTZXREYXRhTWVtYmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YbWwgQXR0cmlidXRlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0WG1sQXR0cmlidXRlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFZhcmlhYmxlTWFwcGluZ19YbWxBdHRyaWJ1dGVOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRYbWxBdHRyaWJ1dGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0WG1sQXR0cmlidXRlTmFtZSA8ZW0+WG1sIEF0dHJpYnV0ZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0WG1sQXR0cmlidXRlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WG1sIFdpbGRjYXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhtbCBXaWxkY2FyZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YbWwgV2lsZGNhcmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0WG1sV2lsZGNhcmQoKQotCSAqIEBzZWUgI3Vuc2V0WG1sV2lsZGNhcmQoKQotCSAqIEBzZWUgI3NldFhtbFdpbGRjYXJkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFZhcmlhYmxlTWFwcGluZ19YbWxXaWxkY2FyZCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzWG1sV2lsZGNhcmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNpc1htbFdpbGRjYXJkIDxlbT5YbWwgV2lsZGNhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YbWwgV2lsZGNhcmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0WG1sV2lsZGNhcmQoKQotCSAqIEBzZWUgI3Vuc2V0WG1sV2lsZGNhcmQoKQotCSAqIEBzZWUgI2lzWG1sV2lsZGNhcmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRYbWxXaWxkY2FyZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzWG1sV2lsZGNhcmQgPGVtPlhtbCBXaWxkY2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0WG1sV2lsZGNhcmQoKQotCSAqIEBzZWUgI2lzWG1sV2lsZGNhcmQoKQotCSAqIEBzZWUgI3NldFhtbFdpbGRjYXJkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHVuc2V0WG1sV2lsZGNhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzWG1sV2lsZGNhcmQgPGVtPlhtbCBXaWxkY2FyZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhtbCBXaWxkY2FyZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0WG1sV2lsZGNhcmQoKQotCSAqIEBzZWUgI2lzWG1sV2lsZGNhcmQoKQotCSAqIEBzZWUgI3NldFhtbFdpbGRjYXJkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzU2V0WG1sV2lsZGNhcmQoKTsKLQotfSAvLyBWYXJpYWJsZU1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMQmluZGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzgzZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBCaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHdzZGwtYmluZGluZyBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgYmluZGluZwotICogYnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgYmluZGluZy4KLSAqIAotICogVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETEJpbmRpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETEJpbmRpbmcgZXh0ZW5kcyBRTmFtZSB7Ci0vLyBXU0RMQmluZGluZwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExNZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyMWI5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIE1lc3NhZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgd3NkbC1tZXNzYWdlICBlbGVtZW50IGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgYnkgYSBRTkFNRS4KLSAqIAotICogVXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExNZXNzYWdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExNZXNzYWdlIGV4dGVuZHMgUU5hbWUgewotLy8gV1NETE1lc3NhZ2UKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMTWVzc2FnZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMTWVzc2FnZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyODMyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE1lc3NhZ2VNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgTWVzc2FnZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHdzZGwtbWVzc2FnZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyB0byBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kIGl0cyBwYXJ0LiBUb2dldGhlciB0aGV5IGRlZmluZSB1bmlxdWVseSB0aGUgbWFwcGluZyBmb3IgYSBzcGVjaWZpYyBwYXJhbWV0ZXIuIFBhcnRzIHdpdGhpbiBhIG1lc3NhZ2UgY29udGV4dCBhcmUgdW5pcXVlbHkgCi0gKiBpZGVudGlmaWVkIHdpdGggdGhlaXIgbmFtZXMuCi0gKiAKLSAqIFRoZSBwYXJhbWV0ZXItbW9kZSBpcyBkZWZpbmVkIGJ5IHRoZSBtYXBwaW5nIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG1hcHBpbmcgd2lsbCBiZSBJTiwgT1VULCBvciBJTk9VVC4uICBUaGUgcHJlc2VuY2Ugb2YgdGhlIHNvYXAtaGVhZGVyCi0gKiBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMgbWFwcGVkIHRvIGEgc29hcCBoZWFkZXIgb25seS4gV2hlbiBhYnNlbnQsIGl0IG1lYW5zIHRoYXQgdGhlIHdzZGwtbWVzc2FnZSBpcyBtYXBwZWQgdG8gYSBKYXZhIHBhcmFtZXRlci4gVGhlIHNvYXAgaGVhZGVycyBhcmUgaW50ZXJwcmV0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCi0gKiBwcm92aWRlZCBpbiB0aGUgbWFwcGluZy4KLSAqIAotICogVXNlZCBpbjogbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldFBhcmFtZXRlck1vZGUgPGVtPlBhcmFtZXRlciBNb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjaXNTb2FwSGVhZGVyIDxlbT5Tb2FwIEhlYWRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldFdzZGxNZXNzYWdlIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE1lc3NhZ2VNYXBwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExNZXNzYWdlTWFwcGluZyBleHRlbmRzIEoyRUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMTWVzc2FnZU1hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJbnRlcnByZXRhdGlvbiBvZiB0aGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBlbGVtZW50IGRlcGVuZHMgb24gd2hldGhlciBvciBub3Qgd3JhcHBlZC1lbGVtZW50IGhhcyBiZWVuIGRlZmluZWQgaW4gdGhlIHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcuICBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBkZWZpbmVzIGEgV1NETCBtZXNzYWdlIHBhcnQuIEl0IHNob3VsZCBhbHdheXMgYmUgaW50ZXJwcmV0ZXIgd2l0aCByZXNwZWN0IHRvIGEgd3NkbC1tZXNzYWdlIGVsZW1lbnQuIElmIHdyYXBwZWQtZWxlbWVudCBpcyBzcGVjaWZpZWQsIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgcmVmZXJzIHRvIGFuIGVsZW1lbnQKLQkgKiBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuCi0JICogCi0JICogVXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgTW9kZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGFyYW1ldGVyLW1vZGUgIGVsZW1lbnQgZGVmaW5lcyB0aGUgbW9kZSBvZiB0aGUgcGFyYW1ldGVyLiBJdCBjYW4gaGF2ZSBvbmx5IHRocmVlIHZhbHVlcywgSU4sIE9VVCwgSU5PVVQuCi0JICogCi0JICogVXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW1ldGVyIE1vZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmFtZXRlck1vZGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMTWVzc2FnZU1hcHBpbmdfUGFyYW1ldGVyTW9kZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0UGFyYW1ldGVyTW9kZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldFBhcmFtZXRlck1vZGUgPGVtPlBhcmFtZXRlciBNb2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW1ldGVyIE1vZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcmFtZXRlck1vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRQYXJhbWV0ZXJNb2RlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEhlYWRlcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEhlYWRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTb2FwSGVhZGVyKCkKLQkgKiBAc2VlICN1bnNldFNvYXBIZWFkZXIoKQotCSAqIEBzZWUgI3NldFNvYXBIZWFkZXIoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1NvYXBIZWFkZXIoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1NvYXBIZWFkZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNpc1NvYXBIZWFkZXIgPGVtPlNvYXAgSGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBIZWFkZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U29hcEhlYWRlcigpCi0JICogQHNlZSAjdW5zZXRTb2FwSGVhZGVyKCkKLQkgKiBAc2VlICNpc1NvYXBIZWFkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRTb2FwSGVhZGVyKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjaXNTb2FwSGVhZGVyIDxlbT5Tb2FwIEhlYWRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U29hcEhlYWRlcigpCi0JICogQHNlZSAjaXNTb2FwSGVhZGVyKCkKLQkgKiBAc2VlICNzZXRTb2FwSGVhZGVyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHVuc2V0U29hcEhlYWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjaXNTb2FwSGVhZGVyIDxlbT5Tb2FwIEhlYWRlcjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgSGVhZGVyPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTb2FwSGVhZGVyKCkKLQkgKiBAc2VlICNpc1NvYXBIZWFkZXIoKQotCSAqIEBzZWUgI3NldFNvYXBIZWFkZXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGJvb2xlYW4gaXNTZXRTb2FwSGVhZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V3NkbE1lc3NhZ2UoV1NETE1lc3NhZ2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExNZXNzYWdlIGdldFdzZGxNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSB2YWx1ZSk7Ci0KLX0gLy8gV1NETE1lc3NhZ2VNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE1lc3NhZ2VQYXJ0TmFtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExNZXNzYWdlUGFydE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2ZDBmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE1lc3NhZ2VQYXJ0TmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWUjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMTWVzc2FnZVBhcnROYW1lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExNZXNzYWdlUGFydE5hbWUgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9Xc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdTRExNZXNzYWdlUGFydE5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGM4NzdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBPcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24jZ2V0V3NkbE9wZXJhdGlvbiA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE9wZXJhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMT3BlcmF0aW9uIGV4dGVuZHMgSjJFRUVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExPcGVyYXRpb25fSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIE9wZXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V3NkbE9wZXJhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExPcGVyYXRpb25fV3NkbE9wZXJhdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0V3NkbE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbiNnZXRXc2RsT3BlcmF0aW9uIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgT3BlcmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXc2RsT3BlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbE9wZXJhdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdTRExPcGVyYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMUG9ydFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkM2M2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETFBvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBQb3J0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgd3NkbC1wb3J0LXR5cGUgZWxlbWVudCBkZWZpbmVzIHRoZSB3c2RsIHBvcnQgdHlwZQotICogYnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgcG9ydCB0eXBlLgotICogCi0gKiBVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMUG9ydFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFBvcnRUeXBlIGV4dGVuZHMgUU5hbWUgewotLy8JIFdTRExQb3J0VHlwZQotfSAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETFJldHVyblZhbHVlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTZkMDUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyAgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGZvciB0aGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLiBJdCBkZWZpbmVzIHRoZSBtYXBwaW5nIHRvIGEgc3BlY2lmaWMgbWVzc2FnZSBhbmQgaXRzIHBhcnQuICBUb2dldGhlciB0aGV5IGRlZmluZSB1bmlxdWVseSB0aGUgbWFwcGluZyBmb3IgYSBzcGVjaWZpYyBwYXJhbWV0ZXIuIFBhcnRzIHdpdGhpbiBhIG1lc3NhZ2UgY29udGV4dCBhcmUgdW5pcXVlbHkgCi0gKiBpZGVudGlmaWVkIHdpdGggdGhlaXIgbmFtZXMuIFRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGlzIG5vdAotICogc3BlY2lmaWVkIGlmIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZSBvciBPVVQgcGFyYW1ldGVycy4KLSAqIAotICogVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldE1ldGhvZFJldHVyblZhbHVlIDxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcgZXh0ZW5kcyBKMkVFRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFJldHVybiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWV0aG9kLXJldHVybi12YWx1ZSAgZWxlbWVudCBkZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3Igdm9pZCB0eXBlIGZvciB0aGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHR5cGUuCi0JICogCi0JICogVXNlZCBpbjogd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXRob2RSZXR1cm5WYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldE1ldGhvZFJldHVyblZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldE1ldGhvZFJldHVyblZhbHVlIDxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFJldHVybiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWV0aG9kUmV0dXJuVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRNZXRob2RSZXR1cm5WYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEludGVycHJldGF0aW9uIG9mIHRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGVsZW1lbnQgZGVwZW5kcyBvbiB3aGV0aGVyIG9yIG5vdCB3cmFwcGVkLWVsZW1lbnQgaGFzIGJlZW4gZGVmaW5lZCBpbiB0aGUgc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZy4gIElmIHdyYXBwZWQtZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgcGFydC4gSXQgc2hvdWxkIGFsd2F5cyBiZSBpbnRlcnByZXRlciB3aXRoIHJlc3BlY3QgdG8gYSB3c2RsLW1lc3NhZ2UgZWxlbWVudC4gSWYgd3JhcHBlZC1lbGVtZW50IGlzIHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSByZWZlcnMgdG8gYW4gZWxlbWVudAotCSAqIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLQkgKiAKLQkgKiBVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETE1lc3NhZ2UgZ2V0V3NkbE1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSB2YWx1ZSk7Ci0KLX0gLy8gV1NETFJldHVyblZhbHVlTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExTZXJ2aWNlTmFtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExTZXJ2aWNlTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQyNjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMU2VydmljZU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIFNlcnZpY2UgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSB3c2RsLXNlcnZpY2UtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgc2VydmljZSBuYW1lIGJ5IGEgUU5BTUUgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyAgdGhlIHNlcnZpY2UuCi0gKiAKLSAqIFVzZWQgaW46IHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExTZXJ2aWNlTmFtZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMU2VydmljZU5hbWUgZXh0ZW5kcyBRTmFtZSB7Ci0JLy9EZWZhdWx0Ci19IC8vIFdTRExTZXJ2aWNlTmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDhmYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsI2dldEVsZW1lbnROYW1lcyA8ZW0+RWxlbWVudCBOYW1lczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnROYW1lcygpIDxlbT5FbGVtZW50IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbGVtZW50TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZWxlbWVudE5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFbGVtZW50TmFtZXMoKSB7Ci0JCWlmIChlbGVtZW50TmFtZXMgPT0gbnVsbCkgewotCQkJZWxlbWVudE5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVsZW1lbnROYW1lLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fRUxFTUVOVF9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnROYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWxlbWVudE5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTOgotCQkJCXJldHVybiBnZXRFbGVtZW50TmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fRUxFTUVOVF9OQU1FUzoKLQkJCQlnZXRFbGVtZW50TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldEVsZW1lbnROYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTOgotCQkJCWdldEVsZW1lbnROYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0VMRU1FTlRfTkFNRVM6Ci0JCQkJcmV0dXJuIGVsZW1lbnROYW1lcyAhPSBudWxsICYmICFlbGVtZW50TmFtZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvRWxlbWVudE5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9FbGVtZW50TmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1NDhmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9FbGVtZW50TmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50IE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRWxlbWVudE5hbWVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FbGVtZW50TmFtZUltcGwjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnROYW1lSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVsZW1lbnROYW1lCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHQoKSA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHQoKSA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRleHQgPSBURVhUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRWxlbWVudE5hbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLkVMRU1FTlRfTkFNRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCVN0cmluZyBvbGRUZXh0ID0gdGV4dDsKLQkJdGV4dCA9IG5ld1RleHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19URVhULCBvbGRUZXh0LCB0ZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19URVhUOgotCQkJCXJldHVybiBnZXRUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX1RFWFQ6Ci0JCQkJc2V0VGV4dCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX1RFWFQ6Ci0JCQkJc2V0VGV4dChURVhUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fVEVYVDoKLQkJCQlyZXR1cm4gVEVYVF9FREVGQVVMVCA9PSBudWxsID8gdGV4dCAhPSBudWxsIDogIVRFWFRfRURFRkFVTFQuZXF1YWxzKHRleHQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRleHQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRleHQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FbGVtZW50TmFtZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0V4Y2VwdGlvbk1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9FeGNlcHRpb25NYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzg4ZTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0V4Y2VwdGlvbk1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhjZXB0aW9uIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRXhjZXB0aW9uTWFwcGluZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkV4Y2VwdGlvbk1hcHBpbmdJbXBsI2dldEV4Y2VwdGlvblR5cGUgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkV4Y2VwdGlvbk1hcHBpbmdJbXBsI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRXhjZXB0aW9uTWFwcGluZ0ltcGwjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FeGNlcHRpb25NYXBwaW5nSW1wbCNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25NYXBwaW5nSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjZXB0aW9uVHlwZSgpIDxlbT5FeGNlcHRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4Y2VwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNlcHRpb25UeXBlKCkgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjZXB0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZXhjZXB0aW9uVHlwZSA9IEVYQ0VQVElPTl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxNZXNzYWdlUGFydE5hbWUgPSBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2UoKSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETE1lc3NhZ2Ugd3NkbE1lc3NhZ2UgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFeGNlcHRpb25NYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5FWENFUFRJT05fTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFeGNlcHRpb25UeXBlKCkgewotCQlyZXR1cm4gZXhjZXB0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvblR5cGUoU3RyaW5nIG5ld0V4Y2VwdGlvblR5cGUpIHsKLQkJU3RyaW5nIG9sZEV4Y2VwdGlvblR5cGUgPSBleGNlcHRpb25UeXBlOwotCQlleGNlcHRpb25UeXBlID0gbmV3RXhjZXB0aW9uVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fRVhDRVBUSU9OX1RZUEUsIG9sZEV4Y2VwdGlvblR5cGUsIGV4Y2VwdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIHsKLQkJcmV0dXJuIHdzZGxNZXNzYWdlUGFydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZyBuZXdXc2RsTWVzc2FnZVBhcnROYW1lKSB7Ci0JCVN0cmluZyBvbGRXc2RsTWVzc2FnZVBhcnROYW1lID0gd3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQkJd3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IG5ld1dzZGxNZXNzYWdlUGFydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUsIG9sZFdzZGxNZXNzYWdlUGFydE5hbWUsIHdzZGxNZXNzYWdlUGFydE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMTWVzc2FnZSBnZXRXc2RsTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHdzZGxNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V3NkbE1lc3NhZ2UoV1NETE1lc3NhZ2UgbmV3V3NkbE1lc3NhZ2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV1NETE1lc3NhZ2Ugb2xkV3NkbE1lc3NhZ2UgPSB3c2RsTWVzc2FnZTsKLQkJd3NkbE1lc3NhZ2UgPSBuZXdXc2RsTWVzc2FnZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFLCBvbGRXc2RsTWVzc2FnZSwgbmV3V3NkbE1lc3NhZ2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbE1lc3NhZ2UoV1NETE1lc3NhZ2UgbmV3V3NkbE1lc3NhZ2UpIHsKLQkJaWYgKG5ld1dzZGxNZXNzYWdlICE9IHdzZGxNZXNzYWdlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3c2RsTWVzc2FnZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsTWVzc2FnZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V3NkbE1lc3NhZ2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V3NkbE1lc3NhZ2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V3NkbE1lc3NhZ2UobmV3V3NkbE1lc3NhZ2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFLCBuZXdXc2RsTWVzc2FnZSwgbmV3V3NkbE1lc3NhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcihDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIG5ld0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBvbGRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyID0gY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLQkJY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciA9IG5ld0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiwgb2xkQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciwgbmV3Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgbmV3Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcikgewotCQlpZiAobmV3Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciAhPSBjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKG5ld0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSLCBuZXdDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLCBuZXdDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V3NkbE1lc3NhZ2UobnVsbCwgbXNncyk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19FWENFUFRJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0RXhjZXB0aW9uVHlwZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXJldHVybiBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlyZXR1cm4gZ2V0V3NkbE1lc3NhZ2UoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSOgotCQkJCXJldHVybiBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19FWENFUFRJT05fVFlQRToKLQkJCQlzZXRFeGNlcHRpb25UeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlzZXRXc2RsTWVzc2FnZVBhcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFOgotCQkJCXNldFdzZGxNZXNzYWdlKChXU0RMTWVzc2FnZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVI6Ci0JCQkJc2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fRVhDRVBUSU9OX1RZUEU6Ci0JCQkJc2V0RXhjZXB0aW9uVHlwZShFWENFUFRJT05fVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXNldFdzZGxNZXNzYWdlUGFydE5hbWUoV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJc2V0V3NkbE1lc3NhZ2UoKFdTRExNZXNzYWdlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSOgotCQkJCXNldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19FWENFUFRJT05fVFlQRToKLQkJCQlyZXR1cm4gRVhDRVBUSU9OX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGV4Y2VwdGlvblR5cGUgIT0gbnVsbCA6ICFFWENFUFRJT05fVFlQRV9FREVGQVVMVC5lcXVhbHMoZXhjZXB0aW9uVHlwZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJcmV0dXJuIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxNZXNzYWdlUGFydE5hbWUgIT0gbnVsbCA6ICFXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxULmVxdWFscyh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFOgotCQkJCXJldHVybiB3c2RsTWVzc2FnZSAhPSBudWxsOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVI6Ci0JCQkJcmV0dXJuIGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGNlcHRpb25UeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNlcHRpb25UeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsTWVzc2FnZVBhcnROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXhjZXB0aW9uTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0ludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9JbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjFkY2EwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0ludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW50ZXJmYWNlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcmZhY2VNYXBwaW5nSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEludGVyZmFjZU1hcHBpbmcKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBJbnRlcmZhY2VNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5JTlRFUkZBQ0VfTUFQUElORzsKLQl9Ci0KLX0gLy9JbnRlcmZhY2VNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF2YVdTRExNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF2YVdTRExNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDJjOTdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0phdmFXU0RMTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBXU0RMIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVdTRExNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVdTRExNYXBwaW5nSW1wbCNnZXRQYWNrYWdlTWFwcGluZ3MgPGVtPlBhY2thZ2UgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVdTRExNYXBwaW5nSW1wbCNnZXRKYXZhWE1MVHlwZU1hcHBpbmdzIDxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkphdmFXU0RMTWFwcGluZ0ltcGwjZ2V0RXhjZXB0aW9uTWFwcGluZ3MgPGVtPkV4Y2VwdGlvbiBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsI2dldEludGVyZmFjZU1hcHBpbmdzIDxlbT5JbnRlcmZhY2UgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhV1NETE1hcHBpbmdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgSmF2YVdTRExNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnZU1hcHBpbmdzKCkgPGVtPlBhY2thZ2UgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2VNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBFTGlzdCBwYWNrYWdlTWFwcGluZ3MgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpIDxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhWE1MVHlwZU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGphdmFYTUxUeXBlTWFwcGluZ3MgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjZXB0aW9uTWFwcGluZ3MoKSA8ZW0+RXhjZXB0aW9uIE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNlcHRpb25NYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBFTGlzdCBleGNlcHRpb25NYXBwaW5ncyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmZhY2VNYXBwaW5ncygpIDxlbT5JbnRlcmZhY2UgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGludGVyZmFjZU1hcHBpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEphdmFXU0RMTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9XU0RMX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRQYWNrYWdlTWFwcGluZ3MoKSB7Ci0JCWlmIChwYWNrYWdlTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJcGFja2FnZU1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBhY2thZ2VNYXBwaW5nLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gcGFja2FnZU1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldEphdmFYTUxUeXBlTWFwcGluZ3MoKSB7Ci0JCWlmIChqYXZhWE1MVHlwZU1hcHBpbmdzID09IG51bGwpIHsKLQkJCWphdmFYTUxUeXBlTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19KQVZBX1hNTF9UWVBFX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gamF2YVhNTFR5cGVNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFeGNlcHRpb25NYXBwaW5ncygpIHsKLQkJaWYgKGV4Y2VwdGlvbk1hcHBpbmdzID09IG51bGwpIHsKLQkJCWV4Y2VwdGlvbk1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEV4Y2VwdGlvbk1hcHBpbmcuY2xhc3MsIHRoaXMsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0VYQ0VQVElPTl9NQVBQSU5HUyk7Ci0JCX0KLQkJcmV0dXJuIGV4Y2VwdGlvbk1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldEludGVyZmFjZU1hcHBpbmdzKCkgewotCQlpZiAoaW50ZXJmYWNlTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJaW50ZXJmYWNlTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW50ZXJmYWNlTWFwcGluZy5jbGFzcywgdGhpcywgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSU5URVJGQUNFX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJmYWNlTWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGFja2FnZU1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEphdmFYTUxUeXBlTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeGNlcHRpb25NYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lOVEVSRkFDRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEludGVyZmFjZU1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fUEFDS0FHRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0UGFja2FnZU1hcHBpbmdzKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0pBVkFfWE1MX1RZUEVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldEphdmFYTUxUeXBlTWFwcGluZ3MoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fRVhDRVBUSU9OX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRFeGNlcHRpb25NYXBwaW5ncygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldEludGVyZmFjZU1hcHBpbmdzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTOgotCQkJCWdldFBhY2thZ2VNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGFja2FnZU1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0pBVkFfWE1MX1RZUEVfTUFQUElOR1M6Ci0JCQkJZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1M6Ci0JCQkJZ2V0RXhjZXB0aW9uTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldEV4Y2VwdGlvbk1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lOVEVSRkFDRV9NQVBQSU5HUzoKLQkJCQlnZXRJbnRlcmZhY2VNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX1BBQ0tBR0VfTUFQUElOR1M6Ci0JCQkJZ2V0UGFja2FnZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0pBVkFfWE1MX1RZUEVfTUFQUElOR1M6Ci0JCQkJZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1M6Ci0JCQkJZ2V0RXhjZXB0aW9uTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSU5URVJGQUNFX01BUFBJTkdTOgotCQkJCWdldEludGVyZmFjZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX1BBQ0tBR0VfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIHBhY2thZ2VNYXBwaW5ncyAhPSBudWxsICYmICFwYWNrYWdlTWFwcGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19KQVZBX1hNTF9UWVBFX01BUFBJTkdTOgotCQkJCXJldHVybiBqYXZhWE1MVHlwZU1hcHBpbmdzICE9IG51bGwgJiYgIWphdmFYTUxUeXBlTWFwcGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGV4Y2VwdGlvbk1hcHBpbmdzICE9IG51bGwgJiYgIWV4Y2VwdGlvbk1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSU5URVJGQUNFX01BUFBJTkdTOgotCQkJCXJldHVybiBpbnRlcmZhY2VNYXBwaW5ncyAhPSBudWxsICYmICFpbnRlcmZhY2VNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0phdmFXU0RMTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0phdmFYTUxUeXBlTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0phdmFYTUxUeXBlTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyMGQ5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXZhWE1MVHlwZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmc7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhIFhNTCBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCNnZXRDbGFzc1R5cGUgPGVtPkNsYXNzIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCNnZXRRbmFtZVNjb3BlIDxlbT5RbmFtZSBTY29wZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhWE1MVHlwZU1hcHBpbmdJbXBsI2dldEFub255bW91c1R5cGVRbmFtZSA8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCNnZXRSb290VHlwZVFuYW1lIDxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCNnZXRWYXJpYWJsZU1hcHBpbmdzIDxlbT5WYXJpYWJsZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFYTUxUeXBlTWFwcGluZ0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBKYXZhWE1MVHlwZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NUeXBlKCkgPGVtPkNsYXNzIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzVHlwZSgpIDxlbT5DbGFzcyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjbGFzc1R5cGUgPSBDTEFTU19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFuYW1lU2NvcGUoKSA8ZW0+UW5hbWUgU2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRRbmFtZVNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUU5BTUVfU0NPUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UW5hbWVTY29wZSgpIDxlbT5RbmFtZSBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFFuYW1lU2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHFuYW1lU2NvcGUgPSBRTkFNRV9TQ09QRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbm9ueW1vdXNUeXBlUW5hbWUoKSA8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbm9ueW1vdXNUeXBlUW5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTk9OWU1PVVNfVFlQRV9RTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbm9ueW1vdXNUeXBlUW5hbWUoKSA8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbm9ueW1vdXNUeXBlUW5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGFub255bW91c1R5cGVRbmFtZSA9IEFOT05ZTU9VU19UWVBFX1FOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9vdFR5cGVRbmFtZSgpIDxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb290VHlwZVFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFJvb3RUeXBlUW5hbWUgcm9vdFR5cGVRbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJsZU1hcHBpbmdzKCkgPGVtPlZhcmlhYmxlIE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJsZU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IHZhcmlhYmxlTWFwcGluZ3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5KQVZBX1hNTF9UWVBFX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsYXNzVHlwZSgpIHsKLQkJcmV0dXJuIGNsYXNzVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzVHlwZShTdHJpbmcgbmV3Q2xhc3NUeXBlKSB7Ci0JCVN0cmluZyBvbGRDbGFzc1R5cGUgPSBjbGFzc1R5cGU7Ci0JCWNsYXNzVHlwZSA9IG5ld0NsYXNzVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX1RZUEUsIG9sZENsYXNzVHlwZSwgY2xhc3NUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFFuYW1lU2NvcGUoKSB7Ci0JCXJldHVybiBxbmFtZVNjb3BlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0UW5hbWVTY29wZShTdHJpbmcgbmV3UW5hbWVTY29wZSkgewotCQlTdHJpbmcgb2xkUW5hbWVTY29wZSA9IHFuYW1lU2NvcGU7Ci0JCXFuYW1lU2NvcGUgPSBuZXdRbmFtZVNjb3BlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUU5BTUVfU0NPUEUsIG9sZFFuYW1lU2NvcGUsIHFuYW1lU2NvcGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QW5vbnltb3VzVHlwZVFuYW1lKCkgewotCQlyZXR1cm4gYW5vbnltb3VzVHlwZVFuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzVHlwZVFuYW1lKFN0cmluZyBuZXdBbm9ueW1vdXNUeXBlUW5hbWUpIHsKLQkJU3RyaW5nIG9sZEFub255bW91c1R5cGVRbmFtZSA9IGFub255bW91c1R5cGVRbmFtZTsKLQkJYW5vbnltb3VzVHlwZVFuYW1lID0gbmV3QW5vbnltb3VzVHlwZVFuYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUUsIG9sZEFub255bW91c1R5cGVRbmFtZSwgYW5vbnltb3VzVHlwZVFuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgUm9vdFR5cGVRbmFtZSBnZXRSb290VHlwZVFuYW1lKCkgewotCQlyZXR1cm4gcm9vdFR5cGVRbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJvb3RUeXBlUW5hbWUoUm9vdFR5cGVRbmFtZSBuZXdSb290VHlwZVFuYW1lLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJvb3RUeXBlUW5hbWUgb2xkUm9vdFR5cGVRbmFtZSA9IHJvb3RUeXBlUW5hbWU7Ci0JCXJvb3RUeXBlUW5hbWUgPSBuZXdSb290VHlwZVFuYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUk9PVF9UWVBFX1FOQU1FLCBvbGRSb290VHlwZVFuYW1lLCBuZXdSb290VHlwZVFuYW1lKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFJvb3RUeXBlUW5hbWUoUm9vdFR5cGVRbmFtZSBuZXdSb290VHlwZVFuYW1lKSB7Ci0JCWlmIChuZXdSb290VHlwZVFuYW1lICE9IHJvb3RUeXBlUW5hbWUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJvb3RUeXBlUW5hbWUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpcm9vdFR5cGVRbmFtZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Jvb3RUeXBlUW5hbWUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Um9vdFR5cGVRbmFtZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Um9vdFR5cGVRbmFtZShuZXdSb290VHlwZVFuYW1lLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUsIG5ld1Jvb3RUeXBlUW5hbWUsIG5ld1Jvb3RUeXBlUW5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRWYXJpYWJsZU1hcHBpbmdzKCkgewotCQlpZiAodmFyaWFibGVNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQl2YXJpYWJsZU1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFZhcmlhYmxlTWFwcGluZy5jbGFzcywgdGhpcywgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1ZBUklBQkxFX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gdmFyaWFibGVNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Um9vdFR5cGVRbmFtZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1ZBUklBQkxFX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VmFyaWFibGVNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NUeXBlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19RTkFNRV9TQ09QRToKLQkJCQlyZXR1cm4gZ2V0UW5hbWVTY29wZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUU6Ci0JCQkJcmV0dXJuIGdldEFub255bW91c1R5cGVRbmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUk9PVF9UWVBFX1FOQU1FOgotCQkJCXJldHVybiBnZXRSb290VHlwZVFuYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19WQVJJQUJMRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFibGVNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19UWVBFOgotCQkJCXNldENsYXNzVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19RTkFNRV9TQ09QRToKLQkJCQlzZXRRbmFtZVNjb3BlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0FOT05ZTU9VU19UWVBFX1FOQU1FOgotCQkJCXNldEFub255bW91c1R5cGVRbmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUU6Ci0JCQkJc2V0Um9vdFR5cGVRbmFtZSgoUm9vdFR5cGVRbmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1M6Ci0JCQkJZ2V0VmFyaWFibGVNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFyaWFibGVNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19UWVBFOgotCQkJCXNldENsYXNzVHlwZShDTEFTU19UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19RTkFNRV9TQ09QRToKLQkJCQlzZXRRbmFtZVNjb3BlKFFOQU1FX1NDT1BFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19BTk9OWU1PVVNfVFlQRV9RTkFNRToKLQkJCQlzZXRBbm9ueW1vdXNUeXBlUW5hbWUoQU5PTllNT1VTX1RZUEVfUU5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRToKLQkJCQlzZXRSb290VHlwZVFuYW1lKChSb290VHlwZVFuYW1lKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1ZBUklBQkxFX01BUFBJTkdTOgotCQkJCWdldFZhcmlhYmxlTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19UWVBFOgotCQkJCXJldHVybiBDTEFTU19UWVBFX0VERUZBVUxUID09IG51bGwgPyBjbGFzc1R5cGUgIT0gbnVsbCA6ICFDTEFTU19UWVBFX0VERUZBVUxULmVxdWFscyhjbGFzc1R5cGUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUU5BTUVfU0NPUEU6Ci0JCQkJcmV0dXJuIFFOQU1FX1NDT1BFX0VERUZBVUxUID09IG51bGwgPyBxbmFtZVNjb3BlICE9IG51bGwgOiAhUU5BTUVfU0NPUEVfRURFRkFVTFQuZXF1YWxzKHFuYW1lU2NvcGUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUU6Ci0JCQkJcmV0dXJuIEFOT05ZTU9VU19UWVBFX1FOQU1FX0VERUZBVUxUID09IG51bGwgPyBhbm9ueW1vdXNUeXBlUW5hbWUgIT0gbnVsbCA6ICFBTk9OWU1PVVNfVFlQRV9RTkFNRV9FREVGQVVMVC5lcXVhbHMoYW5vbnltb3VzVHlwZVFuYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRToKLQkJCQlyZXR1cm4gcm9vdFR5cGVRbmFtZSAhPSBudWxsOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIHZhcmlhYmxlTWFwcGluZ3MgIT0gbnVsbCAmJiAhdmFyaWFibGVNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2xhc3NUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjbGFzc1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHFuYW1lU2NvcGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHFuYW1lU2NvcGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFub255bW91c1R5cGVRbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYW5vbnltb3VzVHlwZVFuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSmF2YVhNTFR5cGVNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0pheHJwY21hcEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNmEzMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpheHJwY21hcEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSmF4cnBjbWFwRmFjdG9yeQotewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpheHJwY21hcEZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCUpheHJwY21hcEZhY3RvcnkgdGhlSmF4cnBjbWFwRmFjdG9yeSA9IChKYXhycGNtYXBGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqYXhycGNtYXAueG1pIik7IAotCQkJaWYgKHRoZUpheHJwY21hcEZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVKYXhycGNtYXBGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEpheHJwY21hcEZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBKYXhycGNtYXBGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkc6IHJldHVybiBjcmVhdGVKYXZhV1NETE1hcHBpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkc6IHJldHVybiBjcmVhdGVQYWNrYWdlTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElORzogcmV0dXJuIGNyZWF0ZUphdmFYTUxUeXBlTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HOiByZXR1cm4gY3JlYXRlRXhjZXB0aW9uTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkc6IHJldHVybiBjcmVhdGVTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkc6IHJldHVybiBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUk9PVF9UWVBFX1FOQU1FOiByZXR1cm4gY3JlYXRlUm9vdFR5cGVRbmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkc6IHJldHVybiBjcmVhdGVWYXJpYWJsZU1hcHBpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0U6IHJldHVybiBjcmVhdGVXU0RMTWVzc2FnZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUjogcmV0dXJuIGNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUU6IHJldHVybiBjcmVhdGVFbGVtZW50TmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfU0VSVklDRV9OQU1FOiByZXR1cm4gY3JlYXRlV1NETFNlcnZpY2VOYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HOiByZXR1cm4gY3JlYXRlUG9ydE1hcHBpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1BPUlRfVFlQRTogcmV0dXJuIGNyZWF0ZVdTRExQb3J0VHlwZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfQklORElORzogcmV0dXJuIGNyZWF0ZVdTRExCaW5kaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElORzogcmV0dXJuIGNyZWF0ZVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTjogcmV0dXJuIGNyZWF0ZVdTRExPcGVyYXRpb24oKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElORzogcmV0dXJuIGNyZWF0ZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORzogcmV0dXJuIGNyZWF0ZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElORzogcmV0dXJuIGNyZWF0ZVdTRExNZXNzYWdlTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUU6IHJldHVybiBjcmVhdGVXU0RMTWVzc2FnZVBhcnROYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSU5URVJGQUNFX01BUFBJTkc6IHJldHVybiBjcmVhdGVJbnRlcmZhY2VNYXBwaW5nKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBKYXZhV1NETE1hcHBpbmcgY3JlYXRlSmF2YVdTRExNYXBwaW5nKCkgewotCQlKYXZhV1NETE1hcHBpbmdJbXBsIGphdmFXU0RMTWFwcGluZyA9IG5ldyBKYXZhV1NETE1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBqYXZhV1NETE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgUGFja2FnZU1hcHBpbmcgY3JlYXRlUGFja2FnZU1hcHBpbmcoKSB7Ci0JCVBhY2thZ2VNYXBwaW5nSW1wbCBwYWNrYWdlTWFwcGluZyA9IG5ldyBQYWNrYWdlTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIHBhY2thZ2VNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEphdmFYTUxUeXBlTWFwcGluZyBjcmVhdGVKYXZhWE1MVHlwZU1hcHBpbmcoKSB7Ci0JCUphdmFYTUxUeXBlTWFwcGluZ0ltcGwgamF2YVhNTFR5cGVNYXBwaW5nID0gbmV3IEphdmFYTUxUeXBlTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIGphdmFYTUxUeXBlTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFeGNlcHRpb25NYXBwaW5nIGNyZWF0ZUV4Y2VwdGlvbk1hcHBpbmcoKSB7Ci0JCUV4Y2VwdGlvbk1hcHBpbmdJbXBsIGV4Y2VwdGlvbk1hcHBpbmcgPSBuZXcgRXhjZXB0aW9uTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIGV4Y2VwdGlvbk1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU2VydmljZUludGVyZmFjZU1hcHBpbmcgY3JlYXRlU2VydmljZUludGVyZmFjZU1hcHBpbmcoKSB7Ci0JCVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbCBzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyA9IG5ldyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcgY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpIHsKLQkJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0ltcGwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyA9IG5ldyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBSb290VHlwZVFuYW1lIGNyZWF0ZVJvb3RUeXBlUW5hbWUoKSB7Ci0JCVJvb3RUeXBlUW5hbWVJbXBsIHJvb3RUeXBlUW5hbWUgPSBuZXcgUm9vdFR5cGVRbmFtZUltcGwoKTsKLQkJcmV0dXJuIHJvb3RUeXBlUW5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgVmFyaWFibGVNYXBwaW5nIGNyZWF0ZVZhcmlhYmxlTWFwcGluZygpIHsKLQkJVmFyaWFibGVNYXBwaW5nSW1wbCB2YXJpYWJsZU1hcHBpbmcgPSBuZXcgVmFyaWFibGVNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gdmFyaWFibGVNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExNZXNzYWdlIGNyZWF0ZVdTRExNZXNzYWdlKCkgewotCQlXU0RMTWVzc2FnZUltcGwgd3NkbE1lc3NhZ2UgPSBuZXcgV1NETE1lc3NhZ2VJbXBsKCk7Ci0JCXJldHVybiB3c2RsTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIGNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSB7Ci0JCUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsIGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgPSBuZXcgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwoKTsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRWxlbWVudE5hbWUgY3JlYXRlRWxlbWVudE5hbWUoKSB7Ci0JCUVsZW1lbnROYW1lSW1wbCBlbGVtZW50TmFtZSA9IG5ldyBFbGVtZW50TmFtZUltcGwoKTsKLQkJcmV0dXJuIGVsZW1lbnROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExTZXJ2aWNlTmFtZSBjcmVhdGVXU0RMU2VydmljZU5hbWUoKSB7Ci0JCVdTRExTZXJ2aWNlTmFtZUltcGwgd3NkbFNlcnZpY2VOYW1lID0gbmV3IFdTRExTZXJ2aWNlTmFtZUltcGwoKTsKLQkJcmV0dXJuIHdzZGxTZXJ2aWNlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBQb3J0TWFwcGluZyBjcmVhdGVQb3J0TWFwcGluZygpIHsKLQkJUG9ydE1hcHBpbmdJbXBsIHBvcnRNYXBwaW5nID0gbmV3IFBvcnRNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gcG9ydE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETFBvcnRUeXBlIGNyZWF0ZVdTRExQb3J0VHlwZSgpIHsKLQkJV1NETFBvcnRUeXBlSW1wbCB3c2RsUG9ydFR5cGUgPSBuZXcgV1NETFBvcnRUeXBlSW1wbCgpOwotCQlyZXR1cm4gd3NkbFBvcnRUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExCaW5kaW5nIGNyZWF0ZVdTRExCaW5kaW5nKCkgewotCQlXU0RMQmluZGluZ0ltcGwgd3NkbEJpbmRpbmcgPSBuZXcgV1NETEJpbmRpbmdJbXBsKCk7Ci0JCXJldHVybiB3c2RsQmluZGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIGNyZWF0ZVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKSB7Ci0JCVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcgPSBuZXcgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETE9wZXJhdGlvbiBjcmVhdGVXU0RMT3BlcmF0aW9uKCkgewotCQlXU0RMT3BlcmF0aW9uSW1wbCB3c2RsT3BlcmF0aW9uID0gbmV3IFdTRExPcGVyYXRpb25JbXBsKCk7Ci0JCXJldHVybiB3c2RsT3BlcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIGNyZWF0ZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCkgewotCQlNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwgbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcgPSBuZXcgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQYXJhbVBhcnRzTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIGNyZWF0ZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKSB7Ci0JCVdTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsIHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgPSBuZXcgV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETE1lc3NhZ2VNYXBwaW5nIGNyZWF0ZVdTRExNZXNzYWdlTWFwcGluZygpIHsKLQkJV1NETE1lc3NhZ2VNYXBwaW5nSW1wbCB3c2RsTWVzc2FnZU1hcHBpbmcgPSBuZXcgV1NETE1lc3NhZ2VNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gd3NkbE1lc3NhZ2VNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExNZXNzYWdlUGFydE5hbWUgY3JlYXRlV1NETE1lc3NhZ2VQYXJ0TmFtZSgpIHsKLQkJV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwgd3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IG5ldyBXU0RMTWVzc2FnZVBhcnROYW1lSW1wbCgpOwotCQlyZXR1cm4gd3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBJbnRlcmZhY2VNYXBwaW5nIGNyZWF0ZUludGVyZmFjZU1hcHBpbmcoKSB7Ci0JCUludGVyZmFjZU1hcHBpbmdJbXBsIGludGVyZmFjZU1hcHBpbmcgPSBuZXcgSW50ZXJmYWNlTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIGludGVyZmFjZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgSmF4cnBjbWFwUGFja2FnZSBnZXRKYXhycGNtYXBQYWNrYWdlKCkgewotCQlyZXR1cm4gKEpheHJwY21hcFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBKYXhycGNtYXBQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9KYXhycGNtYXBGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0pheHJwY21hcFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYmU4ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpheHJwY21hcFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF4cnBjbWFwUGFja2FnZQotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgamF2YVdTRExNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgcGFja2FnZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBleGNlcHRpb25NYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgcm9vdFR5cGVRbmFtZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHZhcmlhYmxlTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHdzZGxNZXNzYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGVsZW1lbnROYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbFNlcnZpY2VOYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgcG9ydE1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsUG9ydFR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsQmluZGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsT3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbE1lc3NhZ2VQYXJ0TmFtZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGludGVyZmFjZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBKYXhycGNtYXBQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgSmF4cnBjbWFwUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSmF4cnBjbWFwUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXhycGNtYXBQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJSmF4cnBjbWFwUGFja2FnZUltcGwgdGhlSmF4cnBjbWFwUGFja2FnZSA9IChKYXhycGNtYXBQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBKYXhycGNtYXBQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEpheHJwY21hcFBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlFamJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSnNwUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUpheHJwY21hcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVKYXhycGNtYXBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUpheHJwY21hcFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUpheHJwY21hcFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldEphdmFXU0RMTWFwcGluZygpIHsKLQkJcmV0dXJuIGphdmFXU0RMTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFXU0RMTWFwcGluZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFXU0RMTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YVdTRExNYXBwaW5nX1BhY2thZ2VNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFXU0RMTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhV1NETE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFXU0RMTWFwcGluZ19FeGNlcHRpb25NYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFXU0RMTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YVdTRExNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFBhY2thZ2VNYXBwaW5nKCkgewotCQlyZXR1cm4gcGFja2FnZU1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYWNrYWdlTWFwcGluZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBhY2thZ2VNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYWNrYWdlTWFwcGluZ19QYWNrYWdlVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBhY2thZ2VNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYWNrYWdlTWFwcGluZ19OYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwYWNrYWdlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhWE1MVHlwZU1hcHBpbmdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFYTUxUeXBlTWFwcGluZ19DbGFzc1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFYTUxUeXBlTWFwcGluZ19RbmFtZVNjb3BlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpamF2YVhNTFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhWE1MVHlwZU1hcHBpbmdfQW5vbnltb3VzVHlwZVFuYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpamF2YVhNTFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhWE1MVHlwZU1hcHBpbmdfUm9vdFR5cGVRbmFtZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0RXhjZXB0aW9uTWFwcGluZygpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvbk1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeGNlcHRpb25NYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXhjZXB0aW9uTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXhjZXB0aW9uTWFwcGluZ19FeGNlcHRpb25UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXhjZXB0aW9uTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXhjZXB0aW9uTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV4Y2VwdGlvbk1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldEV4Y2VwdGlvbk1hcHBpbmdfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV4Y2VwdGlvbk1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfV3NkbFNlcnZpY2VOYW1lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsUG9ydFR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0Um9vdFR5cGVRbmFtZSgpIHsKLQkJcmV0dXJuIHJvb3RUeXBlUW5hbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFZhcmlhYmxlTWFwcGluZygpIHsKLQkJcmV0dXJuIHZhcmlhYmxlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFZhcmlhYmxlTWFwcGluZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXZhcmlhYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX0phdmFWYXJpYWJsZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl2YXJpYWJsZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFZhcmlhYmxlTWFwcGluZ19YbWxFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXZhcmlhYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX0RhdGFNZW1iZXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl2YXJpYWJsZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFZhcmlhYmxlTWFwcGluZ19YbWxBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdmFyaWFibGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYXJpYWJsZU1hcHBpbmdfWG1sV2lsZGNhcmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl2YXJpYWJsZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETE1lc3NhZ2UoKSB7Ci0JCXJldHVybiB3c2RsTWVzc2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9FbGVtZW50TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGVtZW50TmFtZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVsZW1lbnROYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGVtZW50TmFtZV9UZXh0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWxlbWVudE5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETFNlcnZpY2VOYW1lKCkgewotCQlyZXR1cm4gd3NkbFNlcnZpY2VOYW1lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRQb3J0TWFwcGluZygpIHsKLQkJcmV0dXJuIHBvcnRNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydE1hcHBpbmdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydE1hcHBpbmdfUG9ydE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydE1hcHBpbmdfSmF2YVBvcnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETFBvcnRUeXBlKCkgewotCQlyZXR1cm4gd3NkbFBvcnRUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRXU0RMQmluZGluZygpIHsKLQkJcmV0dXJuIHdzZGxCaW5kaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCkgewotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0phdmFNZXRob2ROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19XcmFwcGVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRXU0RMT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gd3NkbE9wZXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTRExPcGVyYXRpb25fSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3c2RsT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMT3BlcmF0aW9uX1dzZGxPcGVyYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3c2RsT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCkgewotCQlyZXR1cm4gbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBhcmFtUGFydHNNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVBvc2l0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBhcmFtUGFydHNNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19Xc2RsTWVzc2FnZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RQYXJhbVBhcnRzTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCkgewotCQlyZXR1cm4gd3NkbFJldHVyblZhbHVlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX01ldGhvZFJldHVyblZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbFJldHVyblZhbHVlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbFJldHVyblZhbHVlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETE1lc3NhZ2VNYXBwaW5nKCkgewotCQlyZXR1cm4gd3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdzZGxNZXNzYWdlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1BhcmFtZXRlck1vZGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3c2RsTWVzc2FnZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTRExNZXNzYWdlTWFwcGluZ19Tb2FwSGVhZGVyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3c2RsTWVzc2FnZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZSgpIHsKLQkJcmV0dXJuIHdzZGxNZXNzYWdlUGFydE5hbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZVBhcnROYW1lX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbE1lc3NhZ2VQYXJ0TmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9Xc2RsTWVzc2FnZVBhcnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbE1lc3NhZ2VQYXJ0TmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRJbnRlcmZhY2VNYXBwaW5nKCkgewotCQlyZXR1cm4gaW50ZXJmYWNlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBKYXhycGNtYXBGYWN0b3J5IGdldEpheHJwY21hcEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSmF4cnBjbWFwRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJamF2YVdTRExNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfV1NETF9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhV1NETE1hcHBpbmdFQ2xhc3MsIEpBVkFfV1NETF9NQVBQSU5HX19JRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YVdTRExNYXBwaW5nRUNsYXNzLCBKQVZBX1dTRExfTUFQUElOR19fUEFDS0FHRV9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YVdTRExNYXBwaW5nRUNsYXNzLCBKQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YVdTRExNYXBwaW5nRUNsYXNzLCBKQVZBX1dTRExfTUFQUElOR19fRVhDRVBUSU9OX01BUFBJTkdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhV1NETE1hcHBpbmdFQ2xhc3MsIEpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1MpOwotCi0JCXBhY2thZ2VNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBQ0tBR0VfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGFja2FnZU1hcHBpbmdFQ2xhc3MsIFBBQ0tBR0VfTUFQUElOR19fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHBhY2thZ2VNYXBwaW5nRUNsYXNzLCBQQUNLQUdFX01BUFBJTkdfX1BBQ0tBR0VfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGFja2FnZU1hcHBpbmdFQ2xhc3MsIFBBQ0tBR0VfTUFQUElOR19fTkFNRVNQQUNFX1VSSSk7Ci0KLQkJamF2YVhNTFR5cGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfWE1MX1RZUEVfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoamF2YVhNTFR5cGVNYXBwaW5nRUNsYXNzLCBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MsIEpBVkFfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoamF2YVhNTFR5cGVNYXBwaW5nRUNsYXNzLCBKQVZBX1hNTF9UWVBFX01BUFBJTkdfX1FOQU1FX1NDT1BFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MsIEpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcywgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcywgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19WQVJJQUJMRV9NQVBQSU5HUyk7Ci0KLQkJZXhjZXB0aW9uTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFWENFUFRJT05fTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXhjZXB0aW9uTWFwcGluZ0VDbGFzcywgRVhDRVBUSU9OX01BUFBJTkdfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShleGNlcHRpb25NYXBwaW5nRUNsYXNzLCBFWENFUFRJT05fTUFQUElOR19fRVhDRVBUSU9OX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGV4Y2VwdGlvbk1hcHBpbmdFQ2xhc3MsIEVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShleGNlcHRpb25NYXBwaW5nRUNsYXNzLCBFWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShleGNlcHRpb25NYXBwaW5nRUNsYXNzLCBFWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSKTsKLQotCQlzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0VDbGFzcywgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLCBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MsIFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0VDbGFzcywgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUyk7Ci0KLQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLCBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0VDbGFzcywgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdFQ2xhc3MsIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfUE9SVF9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLCBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX0JJTkRJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdFQ2xhc3MsIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdTKTsKLQotCQlyb290VHlwZVFuYW1lRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPT1RfVFlQRV9RTkFNRSk7Ci0KLQkJdmFyaWFibGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFZBUklBQkxFX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHZhcmlhYmxlTWFwcGluZ0VDbGFzcywgVkFSSUFCTEVfTUFQUElOR19fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHZhcmlhYmxlTWFwcGluZ0VDbGFzcywgVkFSSUFCTEVfTUFQUElOR19fSkFWQV9WQVJJQUJMRV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh2YXJpYWJsZU1hcHBpbmdFQ2xhc3MsIFZBUklBQkxFX01BUFBJTkdfX1hNTF9FTEVNRU5UX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHZhcmlhYmxlTWFwcGluZ0VDbGFzcywgVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHZhcmlhYmxlTWFwcGluZ0VDbGFzcywgVkFSSUFCTEVfTUFQUElOR19fWE1MX0FUVFJJQlVURV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh2YXJpYWJsZU1hcHBpbmdFQ2xhc3MsIFZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRCk7Ci0KLQkJd3NkbE1lc3NhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV1NETF9NRVNTQUdFKTsKLQotCQljb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckVDbGFzcywgQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckVDbGFzcywgQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTKTsKLQotCQllbGVtZW50TmFtZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTEVNRU5UX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVsZW1lbnROYW1lRUNsYXNzLCBFTEVNRU5UX05BTUVfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbGVtZW50TmFtZUVDbGFzcywgRUxFTUVOVF9OQU1FX19URVhUKTsKLQotCQl3c2RsU2VydmljZU5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV1NETF9TRVJWSUNFX05BTUUpOwotCi0JCXBvcnRNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPUlRfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydE1hcHBpbmdFQ2xhc3MsIFBPUlRfTUFQUElOR19fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRNYXBwaW5nRUNsYXNzLCBQT1JUX01BUFBJTkdfX1BPUlRfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydE1hcHBpbmdFQ2xhc3MsIFBPUlRfTUFQUElOR19fSkFWQV9QT1JUX05BTUUpOwotCi0JCXdzZGxQb3J0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMX1BPUlRfVFlQRSk7Ci0KLQkJd3NkbEJpbmRpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV1NETF9CSU5ESU5HKTsKLQotCQlzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MsIFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzLCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19KQVZBX01FVEhPRF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzLCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX09QRVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzcywgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1JBUFBFRF9FTEVNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzLCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MsIFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkcpOwotCi0JCXdzZGxPcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV1NETF9PUEVSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdzZGxPcGVyYXRpb25FQ2xhc3MsIFdTRExfT1BFUkFUSU9OX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod3NkbE9wZXJhdGlvbkVDbGFzcywgV1NETF9PUEVSQVRJT05fX1dTRExfT1BFUkFUSU9OKTsKLQotCQltZXRob2RQYXJhbVBhcnRzTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdFQ2xhc3MsIE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdFQ2xhc3MsIE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9QT1NJVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdFQ2xhc3MsIE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0VDbGFzcywgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HKTsKLQotCQl3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdFQ2xhc3MsIFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzLCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19NRVRIT0RfUkVUVVJOX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzLCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzLCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0UpOwotCi0JCXdzZGxNZXNzYWdlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMX01FU1NBR0VfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzLCBXU0RMX01FU1NBR0VfTUFQUElOR19fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdzZGxNZXNzYWdlTWFwcGluZ0VDbGFzcywgV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdzZGxNZXNzYWdlTWFwcGluZ0VDbGFzcywgV1NETF9NRVNTQUdFX01BUFBJTkdfX1BBUkFNRVRFUl9NT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3c2RsTWVzc2FnZU1hcHBpbmdFQ2xhc3MsIFdTRExfTUVTU0FHRV9NQVBQSU5HX19TT0FQX0hFQURFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzLCBXU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFKTsKLQotCQl3c2RsTWVzc2FnZVBhcnROYW1lRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTRExfTUVTU0FHRV9QQVJUX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdzZGxNZXNzYWdlUGFydE5hbWVFQ2xhc3MsIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3c2RsTWVzc2FnZVBhcnROYW1lRUNsYXNzLCBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FKTsKLQotCQlpbnRlcmZhY2VNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOVEVSRkFDRV9NQVBQSU5HKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlqYXZhV1NETE1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcGFja2FnZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJamF2YVhNTFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWV4Y2VwdGlvbk1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJbnRlcmZhY2VNYXBwaW5nKCkpOwotCQlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SW50ZXJmYWNlTWFwcGluZygpKTsKLQkJcm9vdFR5cGVRbmFtZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldFFOYW1lKCkpOwotCQl2YXJpYWJsZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJd3NkbE1lc3NhZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpKTsKLQkJY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQllbGVtZW50TmFtZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3c2RsU2VydmljZU5hbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpKTsKLQkJcG9ydE1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJd3NkbFBvcnRUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSk7Ci0JCXdzZGxCaW5kaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSk7Ci0JCXNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJd3NkbE9wZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQltZXRob2RQYXJhbVBhcnRzTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdzZGxNZXNzYWdlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3c2RsTWVzc2FnZVBhcnROYW1lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWludGVyZmFjZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGphdmFXU0RMTWFwcGluZ0VDbGFzcywgSmF2YVdTRExNYXBwaW5nLmNsYXNzLCAiSmF2YVdTRExNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhV1NETE1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgSmF2YVdTRExNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhV1NETE1hcHBpbmdfUGFja2FnZU1hcHBpbmdzKCksIHRoaXMuZ2V0UGFja2FnZU1hcHBpbmcoKSwgbnVsbCwgInBhY2thZ2VNYXBwaW5ncyIsIG51bGwsIDEsIC0xLCBKYXZhV1NETE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFXU0RMTWFwcGluZ19KYXZhWE1MVHlwZU1hcHBpbmdzKCksIHRoaXMuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCksIG51bGwsICJqYXZhWE1MVHlwZU1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIEphdmFXU0RMTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVdTRExNYXBwaW5nX0V4Y2VwdGlvbk1hcHBpbmdzKCksIHRoaXMuZ2V0RXhjZXB0aW9uTWFwcGluZygpLCBudWxsLCAiZXhjZXB0aW9uTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgSmF2YVdTRExNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKSwgdGhpcy5nZXRJbnRlcmZhY2VNYXBwaW5nKCksIG51bGwsICJpbnRlcmZhY2VNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBKYXZhV1NETE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwYWNrYWdlTWFwcGluZ0VDbGFzcywgUGFja2FnZU1hcHBpbmcuY2xhc3MsICJQYWNrYWdlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFja2FnZU1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgUGFja2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYWNrYWdlVHlwZSIsIG51bGwsIDAsIDEsIFBhY2thZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQYWNrYWdlTWFwcGluZ19OYW1lc3BhY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVSSSIsIG51bGwsIDAsIDEsIFBhY2thZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoamF2YVhNTFR5cGVNYXBwaW5nRUNsYXNzLCBKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsICJKYXZhWE1MVHlwZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEphdmFYTUxUeXBlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEphdmFYTUxUeXBlTWFwcGluZ19DbGFzc1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNsYXNzVHlwZSIsIG51bGwsIDAsIDEsIEphdmFYTUxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1FuYW1lU2NvcGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInFuYW1lU2NvcGUiLCBudWxsLCAwLCAxLCBKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEphdmFYTUxUeXBlTWFwcGluZ19Bbm9ueW1vdXNUeXBlUW5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImFub255bW91c1R5cGVRbmFtZSIsIG51bGwsIDAsIDEsIEphdmFYTUxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKSwgdGhpcy5nZXRSb290VHlwZVFuYW1lKCksIG51bGwsICJyb290VHlwZVFuYW1lIiwgbnVsbCwgMSwgMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhWE1MVHlwZU1hcHBpbmdfVmFyaWFibGVNYXBwaW5ncygpLCB0aGlzLmdldFZhcmlhYmxlTWFwcGluZygpLCBudWxsLCAidmFyaWFibGVNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhleGNlcHRpb25NYXBwaW5nRUNsYXNzLCBFeGNlcHRpb25NYXBwaW5nLmNsYXNzLCAiRXhjZXB0aW9uTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXhjZXB0aW9uTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBFeGNlcHRpb25NYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFeGNlcHRpb25NYXBwaW5nX0V4Y2VwdGlvblR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImV4Y2VwdGlvblR5cGUiLCBudWxsLCAwLCAxLCBFeGNlcHRpb25NYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxNZXNzYWdlUGFydE5hbWUiLCBudWxsLCAwLCAxLCBFeGNlcHRpb25NYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlKCksIHRoaXMuZ2V0V1NETE1lc3NhZ2UoKSwgbnVsbCwgIndzZGxNZXNzYWdlIiwgbnVsbCwgMSwgMSwgRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCksIHRoaXMuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpLCBudWxsLCAiY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIsIG51bGwsIDAsIDEsIEV4Y2VwdGlvbk1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0VDbGFzcywgU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MsICJTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZpY2VJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfV3NkbFNlcnZpY2VOYW1lKCksIHRoaXMuZ2V0V1NETFNlcnZpY2VOYW1lKCksIG51bGwsICJ3c2RsU2VydmljZU5hbWUiLCBudWxsLCAxLCAxLCBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfUG9ydE1hcHBpbmdzKCksIHRoaXMuZ2V0UG9ydE1hcHBpbmcoKSwgbnVsbCwgInBvcnRNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdFQ2xhc3MsIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuY2xhc3MsICJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxQb3J0VHlwZSgpLCB0aGlzLmdldFdTRExQb3J0VHlwZSgpLCBudWxsLCAid3NkbFBvcnRUeXBlIiwgbnVsbCwgMSwgMSwgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsQmluZGluZygpLCB0aGlzLmdldFdTRExCaW5kaW5nKCksIG51bGwsICJ3c2RsQmluZGluZyIsIG51bGwsIDEsIDEsIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKSwgdGhpcy5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCksIG51bGwsICJzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9vdFR5cGVRbmFtZUVDbGFzcywgUm9vdFR5cGVRbmFtZS5jbGFzcywgIlJvb3RUeXBlUW5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh2YXJpYWJsZU1hcHBpbmdFQ2xhc3MsIFZhcmlhYmxlTWFwcGluZy5jbGFzcywgIlZhcmlhYmxlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VmFyaWFibGVNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFZhcmlhYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VmFyaWFibGVNYXBwaW5nX0phdmFWYXJpYWJsZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImphdmFWYXJpYWJsZU5hbWUiLCBudWxsLCAwLCAxLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19YbWxFbGVtZW50TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAieG1sRWxlbWVudE5hbWUiLCBudWxsLCAwLCAxLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19EYXRhTWVtYmVyKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZGF0YU1lbWJlciIsIG51bGwsIDAsIDEsIFZhcmlhYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRWYXJpYWJsZU1hcHBpbmdfWG1sQXR0cmlidXRlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAieG1sQXR0cmlidXRlTmFtZSIsIG51bGwsIDAsIDEsIFZhcmlhYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VmFyaWFibGVNYXBwaW5nX1htbFdpbGRjYXJkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAieG1sV2lsZGNhcmQiLCBudWxsLCAwLCAxLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdzZGxNZXNzYWdlRUNsYXNzLCBXU0RMTWVzc2FnZS5jbGFzcywgIldTRExNZXNzYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckVDbGFzcywgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlci5jbGFzcywgIkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9FbGVtZW50TmFtZXMoKSwgdGhpcy5nZXRFbGVtZW50TmFtZSgpLCBudWxsLCAiZWxlbWVudE5hbWVzIiwgbnVsbCwgMSwgLTEsIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbGVtZW50TmFtZUVDbGFzcywgRWxlbWVudE5hbWUuY2xhc3MsICJFbGVtZW50TmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWxlbWVudE5hbWVfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgRWxlbWVudE5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVsZW1lbnROYW1lX1RleHQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRleHQiLCBudWxsLCAwLCAxLCBFbGVtZW50TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdzZGxTZXJ2aWNlTmFtZUVDbGFzcywgV1NETFNlcnZpY2VOYW1lLmNsYXNzLCAiV1NETFNlcnZpY2VOYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocG9ydE1hcHBpbmdFQ2xhc3MsIFBvcnRNYXBwaW5nLmNsYXNzLCAiUG9ydE1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFBvcnRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0TWFwcGluZ19Qb3J0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydE5hbWUiLCBudWxsLCAwLCAxLCBQb3J0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydE1hcHBpbmdfSmF2YVBvcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqYXZhUG9ydE5hbWUiLCBudWxsLCAwLCAxLCBQb3J0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdzZGxQb3J0VHlwZUVDbGFzcywgV1NETFBvcnRUeXBlLmNsYXNzLCAiV1NETFBvcnRUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mod3NkbEJpbmRpbmdFQ2xhc3MsIFdTRExCaW5kaW5nLmNsYXNzLCAiV1NETEJpbmRpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzLCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCAiU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0phdmFNZXRob2ROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqYXZhTWV0aG9kTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbE9wZXJhdGlvbiIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3JhcHBlZEVsZW1lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ3cmFwcGVkRWxlbWVudCIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSwgdGhpcy5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpLCBudWxsLCAibWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbFJldHVyblZhbHVlTWFwcGluZygpLCB0aGlzLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKSwgbnVsbCwgIndzZGxSZXR1cm5WYWx1ZU1hcHBpbmciLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod3NkbE9wZXJhdGlvbkVDbGFzcywgV1NETE9wZXJhdGlvbi5jbGFzcywgIldTRExPcGVyYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExPcGVyYXRpb25fSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgV1NETE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE9wZXJhdGlvbl9Xc2RsT3BlcmF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsT3BlcmF0aW9uIiwgbnVsbCwgMCwgMSwgV1NETE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nRUNsYXNzLCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5jbGFzcywgIk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1Qb3NpdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1Qb3NpdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcmFtVHlwZSIsIG51bGwsIDAsIDEsIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19Xc2RsTWVzc2FnZU1hcHBpbmcoKSwgdGhpcy5nZXRXU0RMTWVzc2FnZU1hcHBpbmcoKSwgbnVsbCwgIndzZGxNZXNzYWdlTWFwcGluZyIsIG51bGwsIDEsIDEsIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod3NkbFJldHVyblZhbHVlTWFwcGluZ0VDbGFzcywgV1NETFJldHVyblZhbHVlTWFwcGluZy5jbGFzcywgIldTRExSZXR1cm5WYWx1ZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgV1NETFJldHVyblZhbHVlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19NZXRob2RSZXR1cm5WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWV0aG9kUmV0dXJuVmFsdWUiLCBudWxsLCAwLCAxLCBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxNZXNzYWdlUGFydE5hbWUiLCBudWxsLCAwLCAxLCBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlKCksIHRoaXMuZ2V0V1NETE1lc3NhZ2UoKSwgbnVsbCwgIndzZGxNZXNzYWdlIiwgbnVsbCwgMSwgMSwgV1NETFJldHVyblZhbHVlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdzZGxNZXNzYWdlTWFwcGluZ0VDbGFzcywgV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzLCAiV1NETE1lc3NhZ2VNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMTWVzc2FnZU1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbE1lc3NhZ2VQYXJ0TmFtZSIsIG51bGwsIDAsIDEsIFdTRExNZXNzYWdlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1BhcmFtZXRlck1vZGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcmFtZXRlck1vZGUiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExNZXNzYWdlTWFwcGluZ19Tb2FwSGVhZGVyKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAic29hcEhlYWRlciIsIG51bGwsIDAsIDEsIFdTRExNZXNzYWdlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSwgdGhpcy5nZXRXU0RMTWVzc2FnZSgpLCBudWxsLCAid3NkbE1lc3NhZ2UiLCBudWxsLCAxLCAxLCBXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3c2RsTWVzc2FnZVBhcnROYW1lRUNsYXNzLCBXU0RMTWVzc2FnZVBhcnROYW1lLmNsYXNzLCAiV1NETE1lc3NhZ2VQYXJ0TmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZVBhcnROYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMTWVzc2FnZVBhcnROYW1lX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxNZXNzYWdlUGFydE5hbWUiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZVBhcnROYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaW50ZXJmYWNlTWFwcGluZ0VDbGFzcywgSW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIkludGVyZmFjZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvL0pheHJwY21hcFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXhycGNtYXBSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0pheHJwY21hcFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjc4ZmVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0pheHJwY21hcFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXMuSmF4cnBjbWFwVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLldlYlNlcnZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXhycGNtYXBSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBKYXhycGNtYXBSZXNvdXJjZQotewotCXB1YmxpYyBKYXhycGNtYXBSZXNvdXJjZUltcGwoUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKGFSZW5kZXJlcik7Ci0JfQotCi0JcHVibGljIEpheHJwY21hcFJlc291cmNlSW1wbChVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIodXJpLCBhUmVuZGVyZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JcHVibGljIEphdmFXU0RMTWFwcGluZyBnZXRKYXZhV1NETE1hcHBpbmcoKSB7Ci0JCXJldHVybiAoSmF2YVdTRExNYXBwaW5nKSBnZXRSb290T2JqZWN0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI2dldFJvb3RUcmFuc2xhdG9yKCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIEpheHJwY21hcFRyYW5zbGF0b3IuSU5TVEFOQ0U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlI2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEpBWFJQQ19NQVBfVFlQRTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXREb2N0eXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3R5cGUoKSAKLQl7Ci0JICBzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgCi0JICB7Ci0JICAgIGNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JICAgIGNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCSAgICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLkpBWFJQQ01BUF9ET0NUWVBFOwotCSAgICBkZWZhdWx0IDoKLSAgICAJCXJldHVybiBudWxsOwotICAgICAgfQotCX0KLQotCi0gICBwdWJsaWMgYm9vbGVhbiBpc0pheHJwY21hcDFfMCgpCi0gICB7Ci0gICAgICByZXR1cm4gKGdldE1vZHVsZVZlcnNpb25JRCgpPT1XZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEKTsKLSAgIH0KLQotICAgcHVibGljIGJvb2xlYW4gaXNKYXhycGNtYXAxXzEoKQotICAgewotICAgICAgcmV0dXJuIChnZXRNb2R1bGVWZXJzaW9uSUQoKT09V2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMV9JRCkgOyAgIAotICAgfQotCi0KLQkvKiAKLQkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewotCXN1cGVyLnNldFZlcnNpb25JRChpZCk7Ci0Jc3dpdGNoIChpZCkgewotCQkJY2FzZSAoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMV9JRCkgOgotCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEKSA6Ci0JCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQlicmVhazsJCQkKLQkJfQotCX0KLQkvKgotCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIAotICB7Ci0gICAgc3dpdGNoIChpZCkgewotICAgIAljYXNlIChKMkVFXzFfNF9JRCkgOgotICAgIAkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLSAgICAJCQkJcHJpbVNldFZlcnNpb25JRChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8xX0lEKTsKLSAgICAJCQkJYnJlYWs7Ci0gICAgCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0gICAgCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotICAgIAkJCQlwcmltU2V0VmVyc2lvbklEKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQpOwotICAgIAkJCQlicmVhazsKLSAgICAJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLSAgICAJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0gICAgCQkJCXByaW1TZXRWZXJzaW9uSUQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMF9JRCk7Ci0gICAgCQl9Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpIHsKLQkgIHJldHVybiAgV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfUFVCTElDSUQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSB7Ci0JICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfU1lTVEVNSUQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7Ci0JICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfUFVCTElDSUQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdGFudHMuSkFYUlBDTUFQX1NZU1RFTUlEOwotCX0KLQotCS8qIFJldHVybiBKMkVFIHZlcnNpb24gYmFzZWQgb24gbW9kdWxlIHZlcnNpb24KLQkqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHsKLQkJc3dpdGNoIChnZXRNb2R1bGVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCWNhc2UgV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMV9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJZGVmYXVsdCA6Ci0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCX0KLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSUQoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzFfSUQ7Ci0JfQotCi0gIHByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKLSAgewotICAgIC8vRG8gbm90aGluZyBmb3Igbm93IHNpbmNlIHRoZSByb290IG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgdmVyc2lvbi4KLSAgfQotCi0gICAgCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YjRjMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwjZ2V0UGFyYW1Qb3NpdGlvbiA8ZW0+UGFyYW0gUG9zaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsI2dldFBhcmFtVHlwZSA8ZW0+UGFyYW0gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwjZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nIDxlbT5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtUG9zaXRpb24oKSA8ZW0+UGFyYW0gUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbVBvc2l0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUE9TSVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1Qb3NpdGlvbigpIDxlbT5QYXJhbSBQb3NpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtUG9zaXRpb24gPSBQQVJBTV9QT1NJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbVR5cGUoKSA8ZW0+UGFyYW0gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1UeXBlKCkgPGVtPlBhcmFtIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtVHlwZSA9IFBBUkFNX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTWVzc2FnZU1hcHBpbmcoKSA8ZW0+V3NkbCBNZXNzYWdlIE1hcHBpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETE1lc3NhZ2VNYXBwaW5nIHdzZGxNZXNzYWdlTWFwcGluZyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1Qb3NpdGlvbigpIHsKLQkJcmV0dXJuIHBhcmFtUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJhbVBvc2l0aW9uKFN0cmluZyBuZXdQYXJhbVBvc2l0aW9uKSB7Ci0JCVN0cmluZyBvbGRQYXJhbVBvc2l0aW9uID0gcGFyYW1Qb3NpdGlvbjsKLQkJcGFyYW1Qb3NpdGlvbiA9IG5ld1BhcmFtUG9zaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1BPU0lUSU9OLCBvbGRQYXJhbVBvc2l0aW9uLCBwYXJhbVBvc2l0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtVHlwZSgpIHsKLQkJcmV0dXJuIHBhcmFtVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFBhcmFtVHlwZShTdHJpbmcgbmV3UGFyYW1UeXBlKSB7Ci0JCVN0cmluZyBvbGRQYXJhbVR5cGUgPSBwYXJhbVR5cGU7Ci0JCXBhcmFtVHlwZSA9IG5ld1BhcmFtVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fVFlQRSwgb2xkUGFyYW1UeXBlLCBwYXJhbVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMTWVzc2FnZU1hcHBpbmcgZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nKCkgewotCQlyZXR1cm4gd3NkbE1lc3NhZ2VNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V3NkbE1lc3NhZ2VNYXBwaW5nKFdTRExNZXNzYWdlTWFwcGluZyBuZXdXc2RsTWVzc2FnZU1hcHBpbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV1NETE1lc3NhZ2VNYXBwaW5nIG9sZFdzZGxNZXNzYWdlTWFwcGluZyA9IHdzZGxNZXNzYWdlTWFwcGluZzsKLQkJd3NkbE1lc3NhZ2VNYXBwaW5nID0gbmV3V3NkbE1lc3NhZ2VNYXBwaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORywgb2xkV3NkbE1lc3NhZ2VNYXBwaW5nLCBuZXdXc2RsTWVzc2FnZU1hcHBpbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbE1lc3NhZ2VNYXBwaW5nKFdTRExNZXNzYWdlTWFwcGluZyBuZXdXc2RsTWVzc2FnZU1hcHBpbmcpIHsKLQkJaWYgKG5ld1dzZGxNZXNzYWdlTWFwcGluZyAhPSB3c2RsTWVzc2FnZU1hcHBpbmcpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdzZGxNZXNzYWdlTWFwcGluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsTWVzc2FnZU1hcHBpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V3NkbE1lc3NhZ2VNYXBwaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dzZGxNZXNzYWdlTWFwcGluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdzZGxNZXNzYWdlTWFwcGluZyhuZXdXc2RsTWVzc2FnZU1hcHBpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fV1NETF9NRVNTQUdFX01BUFBJTkcsIG5ld1dzZGxNZXNzYWdlTWFwcGluZywgbmV3V3NkbE1lc3NhZ2VNYXBwaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsTWVzc2FnZU1hcHBpbmcobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1BPU0lUSU9OOgotCQkJCXJldHVybiBnZXRQYXJhbVBvc2l0aW9uKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtVHlwZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORzoKLQkJCQlyZXR1cm4gZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9QT1NJVElPTjoKLQkJCQlzZXRQYXJhbVBvc2l0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fVFlQRToKLQkJCQlzZXRQYXJhbVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORzoKLQkJCQlzZXRXc2RsTWVzc2FnZU1hcHBpbmcoKFdTRExNZXNzYWdlTWFwcGluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fUE9TSVRJT046Ci0JCQkJc2V0UGFyYW1Qb3NpdGlvbihQQVJBTV9QT1NJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9UWVBFOgotCQkJCXNldFBhcmFtVHlwZShQQVJBTV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HOgotCQkJCXNldFdzZGxNZXNzYWdlTWFwcGluZygoV1NETE1lc3NhZ2VNYXBwaW5nKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fUE9TSVRJT046Ci0JCQkJcmV0dXJuIFBBUkFNX1BPU0lUSU9OX0VERUZBVUxUID09IG51bGwgPyBwYXJhbVBvc2l0aW9uICE9IG51bGwgOiAhUEFSQU1fUE9TSVRJT05fRURFRkFVTFQuZXF1YWxzKHBhcmFtUG9zaXRpb24pOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9UWVBFOgotCQkJCXJldHVybiBQQVJBTV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBwYXJhbVR5cGUgIT0gbnVsbCA6ICFQQVJBTV9UWVBFX0VERUZBVUxULmVxdWFscyhwYXJhbVR5cGUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORzoKLQkJCQlyZXR1cm4gd3NkbE1lc3NhZ2VNYXBwaW5nICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1Qb3NpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyYW1Qb3NpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1UeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1BhY2thZ2VNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUGFja2FnZU1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWY0NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUGFja2FnZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFja2FnZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlBhY2thZ2VNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUGFja2FnZU1hcHBpbmdJbXBsI2dldFBhY2thZ2VUeXBlIDxlbT5QYWNrYWdlIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUGFja2FnZU1hcHBpbmdJbXBsI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VNYXBwaW5nSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBhY2thZ2VNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2VUeXBlKCkgPGVtPlBhY2thZ2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2VUeXBlKCkgPGVtPlBhY2thZ2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlVHlwZSA9IFBBQ0tBR0VfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IE5BTUVTUEFDRV9VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBQYWNrYWdlTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuUEFDS0FHRV9NQVBQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlVHlwZSgpIHsKLQkJcmV0dXJuIHBhY2thZ2VUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0UGFja2FnZVR5cGUoU3RyaW5nIG5ld1BhY2thZ2VUeXBlKSB7Ci0JCVN0cmluZyBvbGRQYWNrYWdlVHlwZSA9IHBhY2thZ2VUeXBlOwotCQlwYWNrYWdlVHlwZSA9IG5ld1BhY2thZ2VUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fUEFDS0FHRV9UWVBFLCBvbGRQYWNrYWdlVHlwZSwgcGFja2FnZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuZXdOYW1lc3BhY2VVUkkpIHsKLQkJU3RyaW5nIG9sZE5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLQkJbmFtZXNwYWNlVVJJID0gbmV3TmFtZXNwYWNlVVJJOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fTkFNRVNQQUNFX1VSSSwgb2xkTmFtZXNwYWNlVVJJLCBuYW1lc3BhY2VVUkkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX1BBQ0tBR0VfVFlQRToKLQkJCQlyZXR1cm4gZ2V0UGFja2FnZVR5cGUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX05BTUVTUEFDRV9VUkk6Ci0JCQkJcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEU6Ci0JCQkJc2V0UGFja2FnZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fTkFNRVNQQUNFX1VSSToKLQkJCQlzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEU6Ci0JCQkJc2V0UGFja2FnZVR5cGUoUEFDS0FHRV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19OQU1FU1BBQ0VfVVJJOgotCQkJCXNldE5hbWVzcGFjZVVSSShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fUEFDS0FHRV9UWVBFOgotCQkJCXJldHVybiBQQUNLQUdFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHBhY2thZ2VUeXBlICE9IG51bGwgOiAhUEFDS0FHRV9UWVBFX0VERUZBVUxULmVxdWFscyhwYWNrYWdlVHlwZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19OQU1FU1BBQ0VfVVJJOgotCQkJCXJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhY2thZ2VUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYWNrYWdlVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZXNwYWNlVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVUkkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QYWNrYWdlTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1BvcnRNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUG9ydE1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZjcyMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUG9ydE1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlBvcnRNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUG9ydE1hcHBpbmdJbXBsI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUG9ydE1hcHBpbmdJbXBsI2dldEphdmFQb3J0TmFtZSA8ZW0+SmF2YSBQb3J0IE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0TWFwcGluZ0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBQb3J0TWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZSgpIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZSgpIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWUgPSBQT1JUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVBvcnROYW1lKCkgPGVtPkphdmEgUG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YVBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9QT1JUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVBvcnROYW1lKCkgPGVtPkphdmEgUG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YVBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBqYXZhUG9ydE5hbWUgPSBKQVZBX1BPUlRfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFBvcnRNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5QT1JUX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotCQlyZXR1cm4gcG9ydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgbmV3UG9ydE5hbWUpIHsKLQkJU3RyaW5nIG9sZFBvcnROYW1lID0gcG9ydE5hbWU7Ci0JCXBvcnROYW1lID0gbmV3UG9ydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19QT1JUX05BTUUsIG9sZFBvcnROYW1lLCBwb3J0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRKYXZhUG9ydE5hbWUoKSB7Ci0JCXJldHVybiBqYXZhUG9ydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRKYXZhUG9ydE5hbWUoU3RyaW5nIG5ld0phdmFQb3J0TmFtZSkgewotCQlTdHJpbmcgb2xkSmF2YVBvcnROYW1lID0gamF2YVBvcnROYW1lOwotCQlqYXZhUG9ydE5hbWUgPSBuZXdKYXZhUG9ydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19KQVZBX1BPUlRfTkFNRSwgb2xkSmF2YVBvcnROYW1lLCBqYXZhUG9ydE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX1BPUlRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0UG9ydE5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0pBVkFfUE9SVF9OQU1FOgotCQkJCXJldHVybiBnZXRKYXZhUG9ydE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fUE9SVF9OQU1FOgotCQkJCXNldFBvcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0pBVkFfUE9SVF9OQU1FOgotCQkJCXNldEphdmFQb3J0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX1BPUlRfTkFNRToKLQkJCQlzZXRQb3J0TmFtZShQT1JUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0pBVkFfUE9SVF9OQU1FOgotCQkJCXNldEphdmFQb3J0TmFtZShKQVZBX1BPUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX1BPUlRfTkFNRToKLQkJCQlyZXR1cm4gUE9SVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwb3J0TmFtZSAhPSBudWxsIDogIVBPUlRfTkFNRV9FREVGQVVMVC5lcXVhbHMocG9ydE5hbWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSkFWQV9QT1JUX05BTUU6Ci0JCQkJcmV0dXJuIEpBVkFfUE9SVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBqYXZhUG9ydE5hbWUgIT0gbnVsbCA6ICFKQVZBX1BPUlRfTkFNRV9FREVGQVVMVC5lcXVhbHMoamF2YVBvcnROYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwb3J0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9ydE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGphdmFQb3J0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamF2YVBvcnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9ydE1hcHBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9Sb290VHlwZVFuYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUm9vdFR5cGVRbmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwYjY5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9Sb290VHlwZVFuYW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9vdCBUeXBlIFFuYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9vdFR5cGVRbmFtZUltcGwgZXh0ZW5kcyBRTmFtZUltcGwgaW1wbGVtZW50cyBSb290VHlwZVFuYW1lCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgUm9vdFR5cGVRbmFtZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuUk9PVF9UWVBFX1FOQU1FOwotCX0KLQotfSAvL1Jvb3RUeXBlUW5hbWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxZGVjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0ltcGwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCNnZXRXc2RsUG9ydFR5cGUgPGVtPldzZGwgUG9ydCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsI2dldFdzZGxCaW5kaW5nIDxlbT5Xc2RsIEJpbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0ltcGwjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MgPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0ltcGwgZXh0ZW5kcyBJbnRlcmZhY2VNYXBwaW5nSW1wbCBpbXBsZW1lbnRzIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxQb3J0VHlwZSgpIDxlbT5Xc2RsIFBvcnQgVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxQb3J0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMUG9ydFR5cGUgd3NkbFBvcnRUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxCaW5kaW5nKCkgPGVtPldzZGwgQmluZGluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxCaW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExCaW5kaW5nIHdzZGxCaW5kaW5nID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKFN0cmluZyBuZXdTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gbmV3U2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFLCBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UsIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExQb3J0VHlwZSBnZXRXc2RsUG9ydFR5cGUoKSB7Ci0JCXJldHVybiB3c2RsUG9ydFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXc2RsUG9ydFR5cGUoV1NETFBvcnRUeXBlIG5ld1dzZGxQb3J0VHlwZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXU0RMUG9ydFR5cGUgb2xkV3NkbFBvcnRUeXBlID0gd3NkbFBvcnRUeXBlOwotCQl3c2RsUG9ydFR5cGUgPSBuZXdXc2RsUG9ydFR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEUsIG9sZFdzZGxQb3J0VHlwZSwgbmV3V3NkbFBvcnRUeXBlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxQb3J0VHlwZShXU0RMUG9ydFR5cGUgbmV3V3NkbFBvcnRUeXBlKSB7Ci0JCWlmIChuZXdXc2RsUG9ydFR5cGUgIT0gd3NkbFBvcnRUeXBlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3c2RsUG9ydFR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd3NkbFBvcnRUeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V3NkbFBvcnRUeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dzZGxQb3J0VHlwZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V3NkbFBvcnRUeXBlKG5ld1dzZGxQb3J0VHlwZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfUE9SVF9UWVBFLCBuZXdXc2RsUG9ydFR5cGUsIG5ld1dzZGxQb3J0VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExCaW5kaW5nIGdldFdzZGxCaW5kaW5nKCkgewotCQlyZXR1cm4gd3NkbEJpbmRpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXc2RsQmluZGluZyhXU0RMQmluZGluZyBuZXdXc2RsQmluZGluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXU0RMQmluZGluZyBvbGRXc2RsQmluZGluZyA9IHdzZGxCaW5kaW5nOwotCQl3c2RsQmluZGluZyA9IG5ld1dzZGxCaW5kaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORywgb2xkV3NkbEJpbmRpbmcsIG5ld1dzZGxCaW5kaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxCaW5kaW5nKFdTRExCaW5kaW5nIG5ld1dzZGxCaW5kaW5nKSB7Ci0JCWlmIChuZXdXc2RsQmluZGluZyAhPSB3c2RsQmluZGluZykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod3NkbEJpbmRpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd3NkbEJpbmRpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V3NkbEJpbmRpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V3NkbEJpbmRpbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsQmluZGluZyhuZXdXc2RsQmluZGluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORywgbmV3V3NkbEJpbmRpbmcsIG5ld1dzZGxCaW5kaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKSB7Ci0JCWlmIChzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfUE9SVF9UWVBFOgotCQkJCXJldHVybiBiYXNpY1NldFdzZGxQb3J0VHlwZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX0JJTkRJTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V3NkbEJpbmRpbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFdzZGxQb3J0VHlwZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORzoKLQkJCQlyZXR1cm4gZ2V0V3NkbEJpbmRpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfUE9SVF9UWVBFOgotCQkJCXNldFdzZGxQb3J0VHlwZSgoV1NETFBvcnRUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HOgotCQkJCXNldFdzZGxCaW5kaW5nKChXU0RMQmluZGluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdTOgotCQkJCWdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotCQkJCXNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfUE9SVF9UWVBFOgotCQkJCXNldFdzZGxQb3J0VHlwZSgoV1NETFBvcnRUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX0JJTkRJTkc6Ci0JCQkJc2V0V3NkbEJpbmRpbmcoKFdTRExCaW5kaW5nKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HUzoKLQkJCQlnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUID09IG51bGwgPyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCA6ICFTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRToKLQkJCQlyZXR1cm4gd3NkbFBvcnRUeXBlICE9IG51bGw7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HOgotCQkJCXJldHVybiB3c2RsQmluZGluZyAhPSBudWxsOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdTOgotCQkJCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyAhPSBudWxsICYmICFzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZDA4OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZzsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsI2dldEphdmFNZXRob2ROYW1lIDxlbT5KYXZhIE1ldGhvZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsI2dldFdzZGxPcGVyYXRpb24gPGVtPldzZGwgT3BlcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsI2lzV3JhcHBlZEVsZW1lbnQgPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbCNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MgPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbCNnZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nIDxlbT5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFNZXRob2ROYW1lKCkgPGVtPkphdmEgTWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhTWV0aG9kTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTUVUSE9EX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YU1ldGhvZE5hbWUoKSA8ZW0+SmF2YSBNZXRob2QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBqYXZhTWV0aG9kTmFtZSA9IEpBVkFfTUVUSE9EX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE9wZXJhdGlvbigpIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX09QRVJBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsT3BlcmF0aW9uKCkgPGVtPldzZGwgT3BlcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbE9wZXJhdGlvbiA9IFdTRExfT1BFUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzV3JhcHBlZEVsZW1lbnQoKSA8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNXcmFwcGVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBXUkFQUEVEX0VMRU1FTlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzV3JhcHBlZEVsZW1lbnQoKSA8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNXcmFwcGVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBib29sZWFuIHdyYXBwZWRFbGVtZW50ID0gV1JBUFBFRF9FTEVNRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBXcmFwcGVkIEVsZW1lbnQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gd3JhcHBlZEVsZW1lbnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSA8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSA8ZW0+V3NkbCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETFJldHVyblZhbHVlTWFwcGluZyB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRKYXZhTWV0aG9kTmFtZSgpIHsKLQkJcmV0dXJuIGphdmFNZXRob2ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SmF2YU1ldGhvZE5hbWUoU3RyaW5nIG5ld0phdmFNZXRob2ROYW1lKSB7Ci0JCVN0cmluZyBvbGRKYXZhTWV0aG9kTmFtZSA9IGphdmFNZXRob2ROYW1lOwotCQlqYXZhTWV0aG9kTmFtZSA9IG5ld0phdmFNZXRob2ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0pBVkFfTUVUSE9EX05BTUUsIG9sZEphdmFNZXRob2ROYW1lLCBqYXZhTWV0aG9kTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gd3NkbE9wZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxPcGVyYXRpb24oU3RyaW5nIG5ld1dzZGxPcGVyYXRpb24pIHsKLQkJU3RyaW5nIG9sZFdzZGxPcGVyYXRpb24gPSB3c2RsT3BlcmF0aW9uOwotCQl3c2RsT3BlcmF0aW9uID0gbmV3V3NkbE9wZXJhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX09QRVJBVElPTiwgb2xkV3NkbE9wZXJhdGlvbiwgd3NkbE9wZXJhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXcmFwcGVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIHdyYXBwZWRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3JhcHBlZEVsZW1lbnQoYm9vbGVhbiBuZXdXcmFwcGVkRWxlbWVudCkgewotCQlib29sZWFuIG9sZFdyYXBwZWRFbGVtZW50ID0gd3JhcHBlZEVsZW1lbnQ7Ci0JCXdyYXBwZWRFbGVtZW50ID0gbmV3V3JhcHBlZEVsZW1lbnQ7Ci0JCWJvb2xlYW4gb2xkV3JhcHBlZEVsZW1lbnRFU2V0ID0gd3JhcHBlZEVsZW1lbnRFU2V0OwotCQl3cmFwcGVkRWxlbWVudEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dSQVBQRURfRUxFTUVOVCwgb2xkV3JhcHBlZEVsZW1lbnQsIHdyYXBwZWRFbGVtZW50LCAhb2xkV3JhcHBlZEVsZW1lbnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCB1bnNldFdyYXBwZWRFbGVtZW50KCkgewotCQlib29sZWFuIG9sZFdyYXBwZWRFbGVtZW50ID0gd3JhcHBlZEVsZW1lbnQ7Ci0JCWJvb2xlYW4gb2xkV3JhcHBlZEVsZW1lbnRFU2V0ID0gd3JhcHBlZEVsZW1lbnRFU2V0OwotCQl3cmFwcGVkRWxlbWVudCA9IFdSQVBQRURfRUxFTUVOVF9FREVGQVVMVDsKLQkJd3JhcHBlZEVsZW1lbnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQsIG9sZFdyYXBwZWRFbGVtZW50LCBXUkFQUEVEX0VMRU1FTlRfRURFRkFVTFQsIG9sZFdyYXBwZWRFbGVtZW50RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXRXcmFwcGVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIHdyYXBwZWRFbGVtZW50RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSB7Ci0JCWlmIChtZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIGdldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V3NkbFJldHVyblZhbHVlTWFwcGluZyhXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIG5ld1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV1NETFJldHVyblZhbHVlTWFwcGluZyBvbGRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nID0gd3NkbFJldHVyblZhbHVlTWFwcGluZzsKLQkJd3NkbFJldHVyblZhbHVlTWFwcGluZyA9IG5ld1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORywgb2xkV3NkbFJldHVyblZhbHVlTWFwcGluZywgbmV3V3NkbFJldHVyblZhbHVlTWFwcGluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcgbmV3V3NkbFJldHVyblZhbHVlTWFwcGluZykgewotCQlpZiAobmV3V3NkbFJldHVyblZhbHVlTWFwcGluZyAhPSB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3c2RsUmV0dXJuVmFsdWVNYXBwaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V3NkbFJldHVyblZhbHVlTWFwcGluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKG5ld1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HLCBuZXdXc2RsUmV0dXJuVmFsdWVNYXBwaW5nLCBuZXdXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSkFWQV9NRVRIT0RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0SmF2YU1ldGhvZE5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX09QRVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0V3NkbE9wZXJhdGlvbigpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dSQVBQRURfRUxFTUVOVDoKLQkJCQlyZXR1cm4gaXNXcmFwcGVkRWxlbWVudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkc6Ci0JCQkJcmV0dXJuIGdldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19KQVZBX01FVEhPRF9OQU1FOgotCQkJCXNldEphdmFNZXRob2ROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX09QRVJBVElPTjoKLQkJCQlzZXRXc2RsT3BlcmF0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQ6Ci0JCQkJc2V0V3JhcHBlZEVsZW1lbnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUzoKLQkJCQlnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkc6Ci0JCQkJc2V0V3NkbFJldHVyblZhbHVlTWFwcGluZygoV1NETFJldHVyblZhbHVlTWFwcGluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0pBVkFfTUVUSE9EX05BTUU6Ci0JCQkJc2V0SmF2YU1ldGhvZE5hbWUoSkFWQV9NRVRIT0RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OOgotCQkJCXNldFdzZGxPcGVyYXRpb24oV1NETF9PUEVSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQ6Ci0JCQkJdW5zZXRXcmFwcGVkRWxlbWVudCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR1M6Ci0JCQkJZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORzoKLQkJCQlzZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKChXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0pBVkFfTUVUSE9EX05BTUU6Ci0JCQkJcmV0dXJuIEpBVkFfTUVUSE9EX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGphdmFNZXRob2ROYW1lICE9IG51bGwgOiAhSkFWQV9NRVRIT0RfTkFNRV9FREVGQVVMVC5lcXVhbHMoamF2YU1ldGhvZE5hbWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OOgotCQkJCXJldHVybiBXU0RMX09QRVJBVElPTl9FREVGQVVMVCA9PSBudWxsID8gd3NkbE9wZXJhdGlvbiAhPSBudWxsIDogIVdTRExfT1BFUkFUSU9OX0VERUZBVUxULmVxdWFscyh3c2RsT3BlcmF0aW9uKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGlzU2V0V3JhcHBlZEVsZW1lbnQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIG1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncyAhPSBudWxsICYmICFtZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkc6Ci0JCQkJcmV0dXJuIHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXZhTWV0aG9kTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamF2YU1ldGhvZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxPcGVyYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdzZGxPcGVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdyYXBwZWRFbGVtZW50OiAiKTsKLQkJaWYgKHdyYXBwZWRFbGVtZW50RVNldCkgcmVzdWx0LmFwcGVuZCh3cmFwcGVkRWxlbWVudCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3MzNkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBJbnRlcmZhY2UgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbCNnZXRTZXJ2aWNlSW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwjZ2V0V3NkbFNlcnZpY2VOYW1lIDxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwjZ2V0UG9ydE1hcHBpbmdzIDxlbT5Qb3J0IE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsIGV4dGVuZHMgSW50ZXJmYWNlTWFwcGluZ0ltcGwgaW1wbGVtZW50cyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlSW50ZXJmYWNlID0gU0VSVklDRV9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsU2VydmljZU5hbWUoKSA8ZW0+V3NkbCBTZXJ2aWNlIE5hbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsU2VydmljZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETFNlcnZpY2VOYW1lIHdzZGxTZXJ2aWNlTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TWFwcGluZ3MoKSA8ZW0+UG9ydCBNYXBwaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IHBvcnRNYXBwaW5ncyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBzZXJ2aWNlSW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUludGVyZmFjZShTdHJpbmcgbmV3U2VydmljZUludGVyZmFjZSkgewotCQlTdHJpbmcgb2xkU2VydmljZUludGVyZmFjZSA9IHNlcnZpY2VJbnRlcmZhY2U7Ci0JCXNlcnZpY2VJbnRlcmZhY2UgPSBuZXdTZXJ2aWNlSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfSU5URVJGQUNFLCBvbGRTZXJ2aWNlSW50ZXJmYWNlLCBzZXJ2aWNlSW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETFNlcnZpY2VOYW1lIGdldFdzZGxTZXJ2aWNlTmFtZSgpIHsKLQkJcmV0dXJuIHdzZGxTZXJ2aWNlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdzZGxTZXJ2aWNlTmFtZShXU0RMU2VydmljZU5hbWUgbmV3V3NkbFNlcnZpY2VOYW1lLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdTRExTZXJ2aWNlTmFtZSBvbGRXc2RsU2VydmljZU5hbWUgPSB3c2RsU2VydmljZU5hbWU7Ci0JCXdzZGxTZXJ2aWNlTmFtZSA9IG5ld1dzZGxTZXJ2aWNlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRSwgb2xkV3NkbFNlcnZpY2VOYW1lLCBuZXdXc2RsU2VydmljZU5hbWUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbFNlcnZpY2VOYW1lKFdTRExTZXJ2aWNlTmFtZSBuZXdXc2RsU2VydmljZU5hbWUpIHsKLQkJaWYgKG5ld1dzZGxTZXJ2aWNlTmFtZSAhPSB3c2RsU2VydmljZU5hbWUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdzZGxTZXJ2aWNlTmFtZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsU2VydmljZU5hbWUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXc2RsU2VydmljZU5hbWUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V3NkbFNlcnZpY2VOYW1lKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsU2VydmljZU5hbWUobmV3V3NkbFNlcnZpY2VOYW1lLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9TRVJWSUNFX05BTUUsIG5ld1dzZGxTZXJ2aWNlTmFtZSwgbmV3V3NkbFNlcnZpY2VOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0UG9ydE1hcHBpbmdzKCkgewotCQlpZiAocG9ydE1hcHBpbmdzID09IG51bGwpIHsKLQkJCXBvcnRNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQb3J0TWFwcGluZy5jbGFzcywgdGhpcywgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19QT1JUX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gcG9ydE1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsU2VydmljZU5hbWUobnVsbCwgbXNncyk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvcnRNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0U2VydmljZUludGVyZmFjZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FOgotCQkJCXJldHVybiBnZXRXc2RsU2VydmljZU5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19QT1JUX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRQb3J0TWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlSW50ZXJmYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRToKLQkJCQlzZXRXc2RsU2VydmljZU5hbWUoKFdTRExTZXJ2aWNlTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1BPUlRfTUFQUElOR1M6Ci0JCQkJZ2V0UG9ydE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3J0TWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlSW50ZXJmYWNlKFNFUlZJQ0VfSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9TRVJWSUNFX05BTUU6Ci0JCQkJc2V0V3NkbFNlcnZpY2VOYW1lKChXU0RMU2VydmljZU5hbWUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1BPUlRfTUFQUElOR1M6Ci0JCQkJZ2V0UG9ydE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gU0VSVklDRV9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VJbnRlcmZhY2UgIT0gbnVsbCA6ICFTRVJWSUNFX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZUludGVyZmFjZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9TRVJWSUNFX05BTUU6Ci0JCQkJcmV0dXJuIHdzZGxTZXJ2aWNlTmFtZSAhPSBudWxsOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1BPUlRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIHBvcnRNYXBwaW5ncyAhPSBudWxsICYmICFwb3J0TWFwcGluZ3MuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcnZpY2VJbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcnZpY2VJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1ZhcmlhYmxlTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1ZhcmlhYmxlTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkNjZmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9WYXJpYWJsZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZzsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhcmlhYmxlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuVmFyaWFibGVNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuVmFyaWFibGVNYXBwaW5nSW1wbCNnZXRKYXZhVmFyaWFibGVOYW1lIDxlbT5KYXZhIFZhcmlhYmxlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuVmFyaWFibGVNYXBwaW5nSW1wbCNnZXRYbWxFbGVtZW50TmFtZSA8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsI2lzRGF0YU1lbWJlciA8ZW0+RGF0YSBNZW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuVmFyaWFibGVNYXBwaW5nSW1wbCNnZXRYbWxBdHRyaWJ1dGVOYW1lIDxlbT5YbWwgQXR0cmlidXRlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuVmFyaWFibGVNYXBwaW5nSW1wbCNpc1htbFdpbGRjYXJkIDxlbT5YbWwgV2lsZGNhcmQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJsZU1hcHBpbmdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFyaWFibGVNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFWYXJpYWJsZU5hbWUoKSA8ZW0+SmF2YSBWYXJpYWJsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YVZhcmlhYmxlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfVkFSSUFCTEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhVmFyaWFibGVOYW1lKCkgPGVtPkphdmEgVmFyaWFibGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFWYXJpYWJsZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGphdmFWYXJpYWJsZU5hbWUgPSBKQVZBX1ZBUklBQkxFX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WG1sRWxlbWVudE5hbWUoKSA8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhtbEVsZW1lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYbWxFbGVtZW50TmFtZSgpIDxlbT5YbWwgRWxlbWVudCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WG1sRWxlbWVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHhtbEVsZW1lbnROYW1lID0gWE1MX0VMRU1FTlRfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RhdGFNZW1iZXIoKSA8ZW0+RGF0YSBNZW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RhdGFNZW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREFUQV9NRU1CRVJfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGF0YU1lbWJlcigpIDxlbT5EYXRhIE1lbWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGF0YU1lbWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBib29sZWFuIGRhdGFNZW1iZXIgPSBEQVRBX01FTUJFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRGF0YSBNZW1iZXIgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGF0YU1lbWJlckVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYbWxBdHRyaWJ1dGVOYW1lKCkgPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhtbEF0dHJpYnV0ZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUUklCVVRFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WG1sQXR0cmlidXRlTmFtZSgpIDxlbT5YbWwgQXR0cmlidXRlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB4bWxBdHRyaWJ1dGVOYW1lID0gWE1MX0FUVFJJQlVURV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWG1sV2lsZGNhcmQoKSA8ZW0+WG1sIFdpbGRjYXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNYbWxXaWxkY2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYTUxfV0lMRENBUkRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWG1sV2lsZGNhcmQoKSA8ZW0+WG1sIFdpbGRjYXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNYbWxXaWxkY2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBib29sZWFuIHhtbFdpbGRjYXJkID0gWE1MX1dJTERDQVJEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBYbWwgV2lsZGNhcmQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4geG1sV2lsZGNhcmRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBWYXJpYWJsZU1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLlZBUklBQkxFX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRKYXZhVmFyaWFibGVOYW1lKCkgewotCQlyZXR1cm4gamF2YVZhcmlhYmxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldEphdmFWYXJpYWJsZU5hbWUoU3RyaW5nIG5ld0phdmFWYXJpYWJsZU5hbWUpIHsKLQkJU3RyaW5nIG9sZEphdmFWYXJpYWJsZU5hbWUgPSBqYXZhVmFyaWFibGVOYW1lOwotCQlqYXZhVmFyaWFibGVOYW1lID0gbmV3SmF2YVZhcmlhYmxlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19KQVZBX1ZBUklBQkxFX05BTUUsIG9sZEphdmFWYXJpYWJsZU5hbWUsIGphdmFWYXJpYWJsZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0WG1sRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiB4bWxFbGVtZW50TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFhtbEVsZW1lbnROYW1lKFN0cmluZyBuZXdYbWxFbGVtZW50TmFtZSkgewotCQlTdHJpbmcgb2xkWG1sRWxlbWVudE5hbWUgPSB4bWxFbGVtZW50TmFtZTsKLQkJeG1sRWxlbWVudE5hbWUgPSBuZXdYbWxFbGVtZW50TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfRUxFTUVOVF9OQU1FLCBvbGRYbWxFbGVtZW50TmFtZSwgeG1sRWxlbWVudE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzRGF0YU1lbWJlcigpIHsKLQkJcmV0dXJuIGRhdGFNZW1iZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREYXRhTWVtYmVyKGJvb2xlYW4gbmV3RGF0YU1lbWJlcikgewotCQlib29sZWFuIG9sZERhdGFNZW1iZXIgPSBkYXRhTWVtYmVyOwotCQlkYXRhTWVtYmVyID0gbmV3RGF0YU1lbWJlcjsKLQkJYm9vbGVhbiBvbGREYXRhTWVtYmVyRVNldCA9IGRhdGFNZW1iZXJFU2V0OwotCQlkYXRhTWVtYmVyRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVIsIG9sZERhdGFNZW1iZXIsIGRhdGFNZW1iZXIsICFvbGREYXRhTWVtYmVyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgdW5zZXREYXRhTWVtYmVyKCkgewotCQlib29sZWFuIG9sZERhdGFNZW1iZXIgPSBkYXRhTWVtYmVyOwotCQlib29sZWFuIG9sZERhdGFNZW1iZXJFU2V0ID0gZGF0YU1lbWJlckVTZXQ7Ci0JCWRhdGFNZW1iZXIgPSBEQVRBX01FTUJFUl9FREVGQVVMVDsKLQkJZGF0YU1lbWJlckVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0RBVEFfTUVNQkVSLCBvbGREYXRhTWVtYmVyLCBEQVRBX01FTUJFUl9FREVGQVVMVCwgb2xkRGF0YU1lbWJlckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0RGF0YU1lbWJlcigpIHsKLQkJcmV0dXJuIGRhdGFNZW1iZXJFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRYbWxBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4geG1sQXR0cmlidXRlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFhtbEF0dHJpYnV0ZU5hbWUoU3RyaW5nIG5ld1htbEF0dHJpYnV0ZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFhtbEF0dHJpYnV0ZU5hbWUgPSB4bWxBdHRyaWJ1dGVOYW1lOwotCQl4bWxBdHRyaWJ1dGVOYW1lID0gbmV3WG1sQXR0cmlidXRlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfQVRUUklCVVRFX05BTUUsIG9sZFhtbEF0dHJpYnV0ZU5hbWUsIHhtbEF0dHJpYnV0ZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzWG1sV2lsZGNhcmQoKSB7Ci0JCXJldHVybiB4bWxXaWxkY2FyZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFhtbFdpbGRjYXJkKGJvb2xlYW4gbmV3WG1sV2lsZGNhcmQpIHsKLQkJYm9vbGVhbiBvbGRYbWxXaWxkY2FyZCA9IHhtbFdpbGRjYXJkOwotCQl4bWxXaWxkY2FyZCA9IG5ld1htbFdpbGRjYXJkOwotCQlib29sZWFuIG9sZFhtbFdpbGRjYXJkRVNldCA9IHhtbFdpbGRjYXJkRVNldDsKLQkJeG1sV2lsZGNhcmRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfV0lMRENBUkQsIG9sZFhtbFdpbGRjYXJkLCB4bWxXaWxkY2FyZCwgIW9sZFhtbFdpbGRjYXJkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgdW5zZXRYbWxXaWxkY2FyZCgpIHsKLQkJYm9vbGVhbiBvbGRYbWxXaWxkY2FyZCA9IHhtbFdpbGRjYXJkOwotCQlib29sZWFuIG9sZFhtbFdpbGRjYXJkRVNldCA9IHhtbFdpbGRjYXJkRVNldDsKLQkJeG1sV2lsZGNhcmQgPSBYTUxfV0lMRENBUkRfRURFRkFVTFQ7Ci0JCXhtbFdpbGRjYXJkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX1dJTERDQVJELCBvbGRYbWxXaWxkY2FyZCwgWE1MX1dJTERDQVJEX0VERUZBVUxULCBvbGRYbWxXaWxkY2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0WG1sV2lsZGNhcmQoKSB7Ci0JCXJldHVybiB4bWxXaWxkY2FyZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0pBVkFfVkFSSUFCTEVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0SmF2YVZhcmlhYmxlTmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9FTEVNRU5UX05BTUU6Ci0JCQkJcmV0dXJuIGdldFhtbEVsZW1lbnROYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVI6Ci0JCQkJcmV0dXJuIGlzRGF0YU1lbWJlcigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfQVRUUklCVVRFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFhtbEF0dHJpYnV0ZU5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfV0lMRENBUkQ6Ci0JCQkJcmV0dXJuIGlzWG1sV2lsZGNhcmQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSkFWQV9WQVJJQUJMRV9OQU1FOgotCQkJCXNldEphdmFWYXJpYWJsZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9FTEVNRU5UX05BTUU6Ci0JCQkJc2V0WG1sRWxlbWVudE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0RBVEFfTUVNQkVSOgotCQkJCXNldERhdGFNZW1iZXIoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRToKLQkJCQlzZXRYbWxBdHRyaWJ1dGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfV0lMRENBUkQ6Ci0JCQkJc2V0WG1sV2lsZGNhcmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0pBVkFfVkFSSUFCTEVfTkFNRToKLQkJCQlzZXRKYXZhVmFyaWFibGVOYW1lKEpBVkFfVkFSSUFCTEVfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9FTEVNRU5UX05BTUU6Ci0JCQkJc2V0WG1sRWxlbWVudE5hbWUoWE1MX0VMRU1FTlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0RBVEFfTUVNQkVSOgotCQkJCXVuc2V0RGF0YU1lbWJlcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfQVRUUklCVVRFX05BTUU6Ci0JCQkJc2V0WG1sQXR0cmlidXRlTmFtZShYTUxfQVRUUklCVVRFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfV0lMRENBUkQ6Ci0JCQkJdW5zZXRYbWxXaWxkY2FyZCgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0pBVkFfVkFSSUFCTEVfTkFNRToKLQkJCQlyZXR1cm4gSkFWQV9WQVJJQUJMRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBqYXZhVmFyaWFibGVOYW1lICE9IG51bGwgOiAhSkFWQV9WQVJJQUJMRV9OQU1FX0VERUZBVUxULmVxdWFscyhqYXZhVmFyaWFibGVOYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfRUxFTUVOVF9OQU1FOgotCQkJCXJldHVybiBYTUxfRUxFTUVOVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyB4bWxFbGVtZW50TmFtZSAhPSBudWxsIDogIVhNTF9FTEVNRU5UX05BTUVfRURFRkFVTFQuZXF1YWxzKHhtbEVsZW1lbnROYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19EQVRBX01FTUJFUjoKLQkJCQlyZXR1cm4gaXNTZXREYXRhTWVtYmVyKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0FUVFJJQlVURV9OQU1FOgotCQkJCXJldHVybiBYTUxfQVRUUklCVVRFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHhtbEF0dHJpYnV0ZU5hbWUgIT0gbnVsbCA6ICFYTUxfQVRUUklCVVRFX05BTUVfRURFRkFVTFQuZXF1YWxzKHhtbEF0dHJpYnV0ZU5hbWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRDoKLQkJCQlyZXR1cm4gaXNTZXRYbWxXaWxkY2FyZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGphdmFWYXJpYWJsZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGphdmFWYXJpYWJsZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHhtbEVsZW1lbnROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh4bWxFbGVtZW50TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGF0YU1lbWJlcjogIik7Ci0JCWlmIChkYXRhTWVtYmVyRVNldCkgcmVzdWx0LmFwcGVuZChkYXRhTWVtYmVyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgeG1sQXR0cmlidXRlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoeG1sQXR0cmlidXRlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgeG1sV2lsZGNhcmQ6ICIpOwotCQlpZiAoeG1sV2lsZGNhcmRFU2V0KSByZXN1bHQuYXBwZW5kKHhtbFdpbGRjYXJkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ZhcmlhYmxlTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExCaW5kaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETEJpbmRpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDM1ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETEJpbmRpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZzsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBCaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETEJpbmRpbmdJbXBsIGV4dGVuZHMgUU5hbWVJbXBsIGltcGxlbWVudHMgV1NETEJpbmRpbmcKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMQmluZGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuV1NETF9CSU5ESU5HOwotCX0KLQotfSAvL1dTRExCaW5kaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE1lc3NhZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmNmI0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIE1lc3NhZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMTWVzc2FnZUltcGwgZXh0ZW5kcyBRTmFtZUltcGwgaW1wbGVtZW50cyBXU0RMTWVzc2FnZQotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExNZXNzYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5XU0RMX01FU1NBR0U7Ci0JfQotCi19IC8vV1NETE1lc3NhZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZU1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDIzZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE1lc3NhZ2VNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZzsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgTWVzc2FnZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlTWFwcGluZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlTWFwcGluZ0ltcGwjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZU1hcHBpbmdJbXBsI2dldFBhcmFtZXRlck1vZGUgPGVtPlBhcmFtZXRlciBNb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlTWFwcGluZ0ltcGwjaXNTb2FwSGVhZGVyIDxlbT5Tb2FwIEhlYWRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZU1hcHBpbmdJbXBsI2dldFdzZGxNZXNzYWdlIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMTWVzc2FnZU1hcHBpbmdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgV1NETE1lc3NhZ2VNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxNZXNzYWdlUGFydE5hbWUgPSBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtZXRlck1vZGUoKSA8ZW0+UGFyYW1ldGVyIE1vZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXJNb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01PREVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1ldGVyTW9kZSgpIDxlbT5QYXJhbWV0ZXIgTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtZXRlck1vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtZXRlck1vZGUgPSBQQVJBTUVURVJfTU9ERV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NvYXBIZWFkZXIoKSA8ZW0+U29hcCBIZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NvYXBIZWFkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU09BUF9IRUFERVJfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU29hcEhlYWRlcigpIDxlbT5Tb2FwIEhlYWRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU29hcEhlYWRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNvYXBIZWFkZXIgPSBTT0FQX0hFQURFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU29hcCBIZWFkZXIgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc29hcEhlYWRlckVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlKCkgPGVtPldzZGwgTWVzc2FnZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExNZXNzYWdlIHdzZGxNZXNzYWdlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExNZXNzYWdlTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuV1NETF9NRVNTQUdFX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIHsKLQkJcmV0dXJuIHdzZGxNZXNzYWdlUGFydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZyBuZXdXc2RsTWVzc2FnZVBhcnROYW1lKSB7Ci0JCVN0cmluZyBvbGRXc2RsTWVzc2FnZVBhcnROYW1lID0gd3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQkJd3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IG5ld1dzZGxNZXNzYWdlUGFydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUsIG9sZFdzZGxNZXNzYWdlUGFydE5hbWUsIHdzZGxNZXNzYWdlUGFydE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyTW9kZSgpIHsKLQkJcmV0dXJuIHBhcmFtZXRlck1vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJNb2RlKFN0cmluZyBuZXdQYXJhbWV0ZXJNb2RlKSB7Ci0JCVN0cmluZyBvbGRQYXJhbWV0ZXJNb2RlID0gcGFyYW1ldGVyTW9kZTsKLQkJcGFyYW1ldGVyTW9kZSA9IG5ld1BhcmFtZXRlck1vZGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1BBUkFNRVRFUl9NT0RFLCBvbGRQYXJhbWV0ZXJNb2RlLCBwYXJhbWV0ZXJNb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NvYXBIZWFkZXIoKSB7Ci0JCXJldHVybiBzb2FwSGVhZGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0U29hcEhlYWRlcihib29sZWFuIG5ld1NvYXBIZWFkZXIpIHsKLQkJYm9vbGVhbiBvbGRTb2FwSGVhZGVyID0gc29hcEhlYWRlcjsKLQkJc29hcEhlYWRlciA9IG5ld1NvYXBIZWFkZXI7Ci0JCWJvb2xlYW4gb2xkU29hcEhlYWRlckVTZXQgPSBzb2FwSGVhZGVyRVNldDsKLQkJc29hcEhlYWRlckVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19TT0FQX0hFQURFUiwgb2xkU29hcEhlYWRlciwgc29hcEhlYWRlciwgIW9sZFNvYXBIZWFkZXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCB1bnNldFNvYXBIZWFkZXIoKSB7Ci0JCWJvb2xlYW4gb2xkU29hcEhlYWRlciA9IHNvYXBIZWFkZXI7Ci0JCWJvb2xlYW4gb2xkU29hcEhlYWRlckVTZXQgPSBzb2FwSGVhZGVyRVNldDsKLQkJc29hcEhlYWRlciA9IFNPQVBfSEVBREVSX0VERUZBVUxUOwotCQlzb2FwSGVhZGVyRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1NPQVBfSEVBREVSLCBvbGRTb2FwSGVhZGVyLCBTT0FQX0hFQURFUl9FREVGQVVMVCwgb2xkU29hcEhlYWRlckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0U29hcEhlYWRlcigpIHsKLQkJcmV0dXJuIHNvYXBIZWFkZXJFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExNZXNzYWdlIGdldFdzZGxNZXNzYWdlKCkgewotCQlyZXR1cm4gd3NkbE1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSBuZXdXc2RsTWVzc2FnZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXU0RMTWVzc2FnZSBvbGRXc2RsTWVzc2FnZSA9IHdzZGxNZXNzYWdlOwotCQl3c2RsTWVzc2FnZSA9IG5ld1dzZGxNZXNzYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG9sZFdzZGxNZXNzYWdlLCBuZXdXc2RsTWVzc2FnZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSBuZXdXc2RsTWVzc2FnZSkgewotCQlpZiAobmV3V3NkbE1lc3NhZ2UgIT0gd3NkbE1lc3NhZ2UpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdzZGxNZXNzYWdlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdzZGxNZXNzYWdlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXc2RsTWVzc2FnZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXc2RsTWVzc2FnZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsTWVzc2FnZShuZXdXc2RsTWVzc2FnZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG5ld1dzZGxNZXNzYWdlLCBuZXdXc2RsTWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFOgotCQkJCXJldHVybiBiYXNpY1NldFdzZGxNZXNzYWdlKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXJldHVybiBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1BBUkFNRVRFUl9NT0RFOgotCQkJCXJldHVybiBnZXRQYXJhbWV0ZXJNb2RlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1NPQVBfSEVBREVSOgotCQkJCXJldHVybiBpc1NvYXBIZWFkZXIoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlyZXR1cm4gZ2V0V3NkbE1lc3NhZ2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1BBUkFNRVRFUl9NT0RFOgotCQkJCXNldFBhcmFtZXRlck1vZGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19TT0FQX0hFQURFUjoKLQkJCQlzZXRTb2FwSGVhZGVyKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFOgotCQkJCXNldFdzZGxNZXNzYWdlKChXU0RMTWVzc2FnZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fUEFSQU1FVEVSX01PREU6Ci0JCQkJc2V0UGFyYW1ldGVyTW9kZShQQVJBTUVURVJfTU9ERV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19TT0FQX0hFQURFUjoKLQkJCQl1bnNldFNvYXBIZWFkZXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlzZXRXc2RsTWVzc2FnZSgoV1NETE1lc3NhZ2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXJldHVybiBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyB3c2RsTWVzc2FnZVBhcnROYW1lICE9IG51bGwgOiAhV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVC5lcXVhbHMod3NkbE1lc3NhZ2VQYXJ0TmFtZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1BBUkFNRVRFUl9NT0RFOgotCQkJCXJldHVybiBQQVJBTUVURVJfTU9ERV9FREVGQVVMVCA9PSBudWxsID8gcGFyYW1ldGVyTW9kZSAhPSBudWxsIDogIVBBUkFNRVRFUl9NT0RFX0VERUZBVUxULmVxdWFscyhwYXJhbWV0ZXJNb2RlKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fU09BUF9IRUFERVI6Ci0JCQkJcmV0dXJuIGlzU2V0U29hcEhlYWRlcigpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJcmV0dXJuIHdzZGxNZXNzYWdlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbE1lc3NhZ2VQYXJ0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQod3NkbE1lc3NhZ2VQYXJ0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1ldGVyTW9kZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyYW1ldGVyTW9kZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcEhlYWRlcjogIik7Ci0JCWlmIChzb2FwSGVhZGVyRVNldCkgcmVzdWx0LmFwcGVuZChzb2FwSGVhZGVyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dTRExNZXNzYWdlTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlUGFydE5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZVBhcnROYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWEyMTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlUGFydE5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlUGFydE5hbWVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZVBhcnROYW1lSW1wbCNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwgZXh0ZW5kcyBKMkVFRU9iamVjdEltcGwgaW1wbGVtZW50cyBXU0RMTWVzc2FnZVBhcnROYW1lCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxNZXNzYWdlUGFydE5hbWUgPSBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuV1NETF9NRVNTQUdFX1BBUlRfTkFNRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxNZXNzYWdlUGFydE5hbWUoKSB7Ci0JCXJldHVybiB3c2RsTWVzc2FnZVBhcnROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShTdHJpbmcgbmV3V3NkbE1lc3NhZ2VQYXJ0TmFtZSkgewotCQlTdHJpbmcgb2xkV3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IHdzZGxNZXNzYWdlUGFydE5hbWU7Ci0JCXdzZGxNZXNzYWdlUGFydE5hbWUgPSBuZXdXc2RsTWVzc2FnZVBhcnROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUsIG9sZFdzZGxNZXNzYWdlUGFydE5hbWUsIHdzZGxNZXNzYWdlUGFydE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJcmV0dXJuIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxNZXNzYWdlUGFydE5hbWUgIT0gbnVsbCA6ICFXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxULmVxdWFscyh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsTWVzc2FnZVBhcnROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExPcGVyYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMT3BlcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTZjOWFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExPcGVyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIE9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMT3BlcmF0aW9uSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE9wZXJhdGlvbkltcGwjZ2V0V3NkbE9wZXJhdGlvbiA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMT3BlcmF0aW9uSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdTRExPcGVyYXRpb24KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE9wZXJhdGlvbigpIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX09QRVJBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsT3BlcmF0aW9uKCkgPGVtPldzZGwgT3BlcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbE9wZXJhdGlvbiA9IFdTRExfT1BFUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETE9wZXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuV1NETF9PUEVSQVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIHdzZGxPcGVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsT3BlcmF0aW9uKFN0cmluZyBuZXdXc2RsT3BlcmF0aW9uKSB7Ci0JCVN0cmluZyBvbGRXc2RsT3BlcmF0aW9uID0gd3NkbE9wZXJhdGlvbjsKLQkJd3NkbE9wZXJhdGlvbiA9IG5ld1dzZGxPcGVyYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX1dTRExfT1BFUkFUSU9OLCBvbGRXc2RsT3BlcmF0aW9uLCB3c2RsT3BlcmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfT1BFUkFUSU9OX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fV1NETF9PUEVSQVRJT046Ci0JCQkJcmV0dXJuIGdldFdzZGxPcGVyYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfT1BFUkFUSU9OX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX1dTRExfT1BFUkFUSU9OOgotCQkJCXNldFdzZGxPcGVyYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fV1NETF9PUEVSQVRJT046Ci0JCQkJc2V0V3NkbE9wZXJhdGlvbihXU0RMX09QRVJBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfT1BFUkFUSU9OX19XU0RMX09QRVJBVElPTjoKLQkJCQlyZXR1cm4gV1NETF9PUEVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxPcGVyYXRpb24gIT0gbnVsbCA6ICFXU0RMX09QRVJBVElPTl9FREVGQVVMVC5lcXVhbHMod3NkbE9wZXJhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbE9wZXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQod3NkbE9wZXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dTRExPcGVyYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1M2FhNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETFBvcnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIFBvcnQgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExQb3J0VHlwZUltcGwgZXh0ZW5kcyBRTmFtZUltcGwgaW1wbGVtZW50cyBXU0RMUG9ydFR5cGUKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMUG9ydFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLldTRExfUE9SVF9UWVBFOwotCX0KLQotfSAvL1dTRExQb3J0VHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmM4ZDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRUVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZzsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsI2dldE1ldGhvZFJldHVyblZhbHVlIDxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsIGV4dGVuZHMgSjJFRUVPYmplY3RJbXBsIGltcGxlbWVudHMgV1NETFJldHVyblZhbHVlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RSZXR1cm5WYWx1ZSgpIDxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUmV0dXJuVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUkVUVVJOX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFJldHVyblZhbHVlKCkgPGVtPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RSZXR1cm5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbWV0aG9kUmV0dXJuVmFsdWUgPSBNRVRIT0RfUkVUVVJOX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxNZXNzYWdlUGFydE5hbWUgPSBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2UoKSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETE1lc3NhZ2Ugd3NkbE1lc3NhZ2UgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZFJldHVyblZhbHVlKCkgewotCQlyZXR1cm4gbWV0aG9kUmV0dXJuVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRNZXRob2RSZXR1cm5WYWx1ZShTdHJpbmcgbmV3TWV0aG9kUmV0dXJuVmFsdWUpIHsKLQkJU3RyaW5nIG9sZE1ldGhvZFJldHVyblZhbHVlID0gbWV0aG9kUmV0dXJuVmFsdWU7Ci0JCW1ldGhvZFJldHVyblZhbHVlID0gbmV3TWV0aG9kUmV0dXJuVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fTUVUSE9EX1JFVFVSTl9WQUxVRSwgb2xkTWV0aG9kUmV0dXJuVmFsdWUsIG1ldGhvZFJldHVyblZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxNZXNzYWdlUGFydE5hbWUoKSB7Ci0JCXJldHVybiB3c2RsTWVzc2FnZVBhcnROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShTdHJpbmcgbmV3V3NkbE1lc3NhZ2VQYXJ0TmFtZSkgewotCQlTdHJpbmcgb2xkV3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IHdzZGxNZXNzYWdlUGFydE5hbWU7Ci0JCXdzZGxNZXNzYWdlUGFydE5hbWUgPSBuZXdXc2RsTWVzc2FnZVBhcnROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUsIG9sZFdzZGxNZXNzYWdlUGFydE5hbWUsIHdzZGxNZXNzYWdlUGFydE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMTWVzc2FnZSBnZXRXc2RsTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHdzZGxNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V3NkbE1lc3NhZ2UoV1NETE1lc3NhZ2UgbmV3V3NkbE1lc3NhZ2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV1NETE1lc3NhZ2Ugb2xkV3NkbE1lc3NhZ2UgPSB3c2RsTWVzc2FnZTsKLQkJd3NkbE1lc3NhZ2UgPSBuZXdXc2RsTWVzc2FnZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG9sZFdzZGxNZXNzYWdlLCBuZXdXc2RsTWVzc2FnZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSBuZXdXc2RsTWVzc2FnZSkgewotCQlpZiAobmV3V3NkbE1lc3NhZ2UgIT0gd3NkbE1lc3NhZ2UpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdzZGxNZXNzYWdlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdzZGxNZXNzYWdlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dzZGxNZXNzYWdlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dzZGxNZXNzYWdlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V3NkbE1lc3NhZ2UobmV3V3NkbE1lc3NhZ2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG5ld1dzZGxNZXNzYWdlLCBuZXdXc2RsTWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0V3NkbE1lc3NhZ2UobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19NRVRIT0RfUkVUVVJOX1ZBTFVFOgotCQkJCXJldHVybiBnZXRNZXRob2RSZXR1cm5WYWx1ZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJcmV0dXJuIGdldFdzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJcmV0dXJuIGdldFdzZGxNZXNzYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fTUVUSE9EX1JFVFVSTl9WQUxVRToKLQkJCQlzZXRNZXRob2RSZXR1cm5WYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlzZXRXc2RsTWVzc2FnZVBhcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJc2V0V3NkbE1lc3NhZ2UoKFdTRExNZXNzYWdlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fTUVUSE9EX1JFVFVSTl9WQUxVRToKLQkJCQlzZXRNZXRob2RSZXR1cm5WYWx1ZShNRVRIT0RfUkVUVVJOX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJc2V0V3NkbE1lc3NhZ2UoKFdTRExNZXNzYWdlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX01FVEhPRF9SRVRVUk5fVkFMVUU6Ci0JCQkJcmV0dXJuIE1FVEhPRF9SRVRVUk5fVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IG1ldGhvZFJldHVyblZhbHVlICE9IG51bGwgOiAhTUVUSE9EX1JFVFVSTl9WQUxVRV9FREVGQVVMVC5lcXVhbHMobWV0aG9kUmV0dXJuVmFsdWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJcmV0dXJuIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxNZXNzYWdlUGFydE5hbWUgIT0gbnVsbCA6ICFXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxULmVxdWFscyh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJcmV0dXJuIHdzZGxNZXNzYWdlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0aG9kUmV0dXJuVmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZFJldHVyblZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsTWVzc2FnZVBhcnROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExTZXJ2aWNlTmFtZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExTZXJ2aWNlTmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjZWM0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMU2VydmljZU5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgU2VydmljZSBOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFNlcnZpY2VOYW1lSW1wbCBleHRlbmRzIFFOYW1lSW1wbCBpbXBsZW1lbnRzIFdTRExTZXJ2aWNlTmFtZQotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExTZXJ2aWNlTmFtZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuV1NETF9TRVJWSUNFX05BTUU7Ci0JfQotCi19IC8vV1NETFNlcnZpY2VOYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL3V0aWwvSmF4cnBjbWFwQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC91dGlsL0pheHJwY21hcEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDhkZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL3V0aWwvSmF4cnBjbWFwQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpheHJwY21hcEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIEpheHJwY21hcFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEpheHJwY21hcEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgSmF4cnBjbWFwU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEpheHJwY21hcFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFXU0RMTWFwcGluZyhKYXZhV1NETE1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFXU0RMTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBhY2thZ2VNYXBwaW5nKFBhY2thZ2VNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQYWNrYWdlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFYTUxUeXBlTWFwcGluZyhKYXZhWE1MVHlwZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFYTUxUeXBlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4Y2VwdGlvbk1hcHBpbmcoRXhjZXB0aW9uTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXhjZXB0aW9uTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvb3RUeXBlUW5hbWUoUm9vdFR5cGVRbmFtZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9vdFR5cGVRbmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVZhcmlhYmxlTWFwcGluZyhWYXJpYWJsZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhcmlhYmxlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlKFdTRExNZXNzYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXU0RMTWVzc2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVsZW1lbnROYW1lKEVsZW1lbnROYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFbGVtZW50TmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExTZXJ2aWNlTmFtZShXU0RMU2VydmljZU5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExTZXJ2aWNlTmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBvcnRNYXBwaW5nKFBvcnRNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQb3J0TWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExQb3J0VHlwZShXU0RMUG9ydFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExQb3J0VHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExCaW5kaW5nKFdTRExCaW5kaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXU0RMQmluZGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExPcGVyYXRpb24oV1NETE9wZXJhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETE9wZXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoV1NETFJldHVyblZhbHVlTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETFJldHVyblZhbHVlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlTWFwcGluZyhXU0RMTWVzc2FnZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExNZXNzYWdlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlUGFydE5hbWUoV1NETE1lc3NhZ2VQYXJ0TmFtZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETE1lc3NhZ2VQYXJ0TmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUludGVyZmFjZU1hcHBpbmcoSW50ZXJmYWNlTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVFOYW1lKFFOYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVRTmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyA8ZW0+SmF2YSBXU0RMIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhV1NETE1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nIDxlbT5QYWNrYWdlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcgPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFYTUxUeXBlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyA8ZW0+RXhjZXB0aW9uIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhjZXB0aW9uTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcgPGVtPlNlcnZpY2UgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWUgPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVSb290VHlwZVFuYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcgPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVWYXJpYWJsZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlIDxlbT5XU0RMIE1lc3NhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExNZXNzYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWUgPGVtPkVsZW1lbnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxlbWVudE5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZSA8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMU2VydmljZU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nIDxlbT5Qb3J0IE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGUgPGVtPldTREwgUG9ydCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFBvcnRUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZyA8ZW0+V1NETCBCaW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMQmluZGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyA8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uIDxlbT5XU0RMIE9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMT3BlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyA8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nIDxlbT5XU0RMIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyA8ZW0+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMTWVzc2FnZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWUgPGVtPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE1lc3NhZ2VQYXJ0TmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZyA8ZW0+SW50ZXJmYWNlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IDxlbT5KMkVFRSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUgPGVtPlFOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSmF4cnBjbWFwQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC91dGlsL0pheHJwY21hcFN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL3V0aWwvSmF4cnBjbWFwU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlY2JjMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL3V0aWwvSmF4cnBjbWFwU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWU7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpheHJwY21hcFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIEpheHJwY21hcFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEpheHJwY21hcFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkc6IHsKLQkJCQlKYXZhV1NETE1hcHBpbmcgamF2YVdTRExNYXBwaW5nID0gKEphdmFXU0RMTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSmF2YVdTRExNYXBwaW5nKGphdmFXU0RMTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoamF2YVdTRExNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HOiB7Ci0JCQkJUGFja2FnZU1hcHBpbmcgcGFja2FnZU1hcHBpbmcgPSAoUGFja2FnZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBhY2thZ2VNYXBwaW5nKHBhY2thZ2VNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChwYWNrYWdlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElORzogewotCQkJCUphdmFYTUxUeXBlTWFwcGluZyBqYXZhWE1MVHlwZU1hcHBpbmcgPSAoSmF2YVhNTFR5cGVNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhWE1MVHlwZU1hcHBpbmcoamF2YVhNTFR5cGVNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChqYXZhWE1MVHlwZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElORzogewotCQkJCUV4Y2VwdGlvbk1hcHBpbmcgZXhjZXB0aW9uTWFwcGluZyA9IChFeGNlcHRpb25NYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeGNlcHRpb25NYXBwaW5nKGV4Y2VwdGlvbk1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGV4Y2VwdGlvbk1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HOiB7Ci0JCQkJU2VydmljZUludGVyZmFjZU1hcHBpbmcgc2VydmljZUludGVyZmFjZU1hcHBpbmcgPSAoU2VydmljZUludGVyZmFjZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlcmZhY2VNYXBwaW5nKHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkc6IHsKLQkJCQlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcgPSAoU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyhzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlcmZhY2VNYXBwaW5nKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5ST09UX1RZUEVfUU5BTUU6IHsKLQkJCQlSb290VHlwZVFuYW1lIHJvb3RUeXBlUW5hbWUgPSAoUm9vdFR5cGVRbmFtZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9vdFR5cGVRbmFtZShyb290VHlwZVFuYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VRTmFtZShyb290VHlwZVFuYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChyb290VHlwZVFuYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElORzogewotCQkJCVZhcmlhYmxlTWFwcGluZyB2YXJpYWJsZU1hcHBpbmcgPSAoVmFyaWFibGVNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWYXJpYWJsZU1hcHBpbmcodmFyaWFibGVNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh2YXJpYWJsZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0U6IHsKLQkJCQlXU0RMTWVzc2FnZSB3c2RsTWVzc2FnZSA9IChXU0RMTWVzc2FnZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV1NETE1lc3NhZ2Uod3NkbE1lc3NhZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVFOYW1lKHdzZGxNZXNzYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3c2RsTWVzc2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUjogewotCQkJCUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciA9IChDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUU6IHsKLQkJCQlFbGVtZW50TmFtZSBlbGVtZW50TmFtZSA9IChFbGVtZW50TmFtZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRWxlbWVudE5hbWUoZWxlbWVudE5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KGVsZW1lbnROYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9TRVJWSUNFX05BTUU6IHsKLQkJCQlXU0RMU2VydmljZU5hbWUgd3NkbFNlcnZpY2VOYW1lID0gKFdTRExTZXJ2aWNlTmFtZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV1NETFNlcnZpY2VOYW1lKHdzZGxTZXJ2aWNlTmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUod3NkbFNlcnZpY2VOYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3c2RsU2VydmljZU5hbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkc6IHsKLQkJCQlQb3J0TWFwcGluZyBwb3J0TWFwcGluZyA9IChQb3J0TWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUG9ydE1hcHBpbmcocG9ydE1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHBvcnRNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9QT1JUX1RZUEU6IHsKLQkJCQlXU0RMUG9ydFR5cGUgd3NkbFBvcnRUeXBlID0gKFdTRExQb3J0VHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV1NETFBvcnRUeXBlKHdzZGxQb3J0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUod3NkbFBvcnRUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3c2RsUG9ydFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX0JJTkRJTkc6IHsKLQkJCQlXU0RMQmluZGluZyB3c2RsQmluZGluZyA9IChXU0RMQmluZGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV1NETEJpbmRpbmcod3NkbEJpbmRpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVFOYW1lKHdzZGxCaW5kaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3c2RsQmluZGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkc6IHsKLQkJCQlTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcgPSAoU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyhzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT046IHsKLQkJCQlXU0RMT3BlcmF0aW9uIHdzZGxPcGVyYXRpb24gPSAoV1NETE9wZXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV1NETE9wZXJhdGlvbih3c2RsT3BlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3c2RsT3BlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkc6IHsKLQkJCQlNZXRob2RQYXJhbVBhcnRzTWFwcGluZyBtZXRob2RQYXJhbVBhcnRzTWFwcGluZyA9IChNZXRob2RQYXJhbVBhcnRzTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcobWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORzogewotCQkJCVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcgd3NkbFJldHVyblZhbHVlTWFwcGluZyA9IChXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUoyRUVFT2JqZWN0KHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElORzogewotCQkJCVdTRExNZXNzYWdlTWFwcGluZyB3c2RsTWVzc2FnZU1hcHBpbmcgPSAoV1NETE1lc3NhZ2VNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXU0RMTWVzc2FnZU1hcHBpbmcod3NkbE1lc3NhZ2VNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdCh3c2RsTWVzc2FnZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FOiB7Ci0JCQkJV1NETE1lc3NhZ2VQYXJ0TmFtZSB3c2RsTWVzc2FnZVBhcnROYW1lID0gKFdTRExNZXNzYWdlUGFydE5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdTRExNZXNzYWdlUGFydE5hbWUod3NkbE1lc3NhZ2VQYXJ0TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3Qod3NkbE1lc3NhZ2VQYXJ0TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLklOVEVSRkFDRV9NQVBQSU5HOiB7Ci0JCQkJSW50ZXJmYWNlTWFwcGluZyBpbnRlcmZhY2VNYXBwaW5nID0gKEludGVyZmFjZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUludGVyZmFjZU1hcHBpbmcoaW50ZXJmYWNlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSjJFRUVPYmplY3QoaW50ZXJmYWNlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgV1NETCBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgV1NETCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSmF2YVdTRExNYXBwaW5nKEphdmFXU0RMTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VQYWNrYWdlTWFwcGluZyhQYWNrYWdlTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VKYXZhWE1MVHlwZU1hcHBpbmcoSmF2YVhNTFR5cGVNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjZXB0aW9uIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjZXB0aW9uIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VFeGNlcHRpb25NYXBwaW5nKEV4Y2VwdGlvbk1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyhTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VSb290VHlwZVFuYW1lKFJvb3RUeXBlUW5hbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYXJpYWJsZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VWYXJpYWJsZU1hcHBpbmcoVmFyaWFibGVNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBNZXNzYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgTWVzc2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlKFdTRExNZXNzYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQgTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VFbGVtZW50TmFtZShFbGVtZW50TmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgU2VydmljZSBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgU2VydmljZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETFNlcnZpY2VOYW1lKFdTRExTZXJ2aWNlTmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0IE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0TWFwcGluZyhQb3J0TWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgUG9ydCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgUG9ydCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETFBvcnRUeXBlKFdTRExQb3J0VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgQmluZGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMIEJpbmRpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMQmluZGluZyhXU0RMQmluZGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgT3BlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgT3BlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETE9wZXJhdGlvbihXU0RMT3BlcmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQYXJhbVBhcnRzTWFwcGluZyhNZXRob2RQYXJhbVBhcnRzTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoV1NETFJldHVyblZhbHVlTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETE1lc3NhZ2VNYXBwaW5nKFdTRExNZXNzYWdlTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlUGFydE5hbWUoV1NETE1lc3NhZ2VQYXJ0TmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSW50ZXJmYWNlTWFwcGluZyhJbnRlcmZhY2VNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SjJFRUUgT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVFOYW1lKFFOYW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSmF4cnBjbWFwU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1MDcxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqY2FfdWkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MGQ2ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWpjYXVpLmphcgotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZWM5ZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPmNvbS5pYm0uZXRvb2xzLmN0Yy5qYXZhcHJvamVjdG5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDI4YWI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1RodSBNYXkgMTAgMTg6MzU6MDQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyM2E4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4yMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwucGx1Z2luLkpDQVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndlYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTc1ODZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IGpjYV91aS8sXAotICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZmIzZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGYyNWEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmVjNmJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvRXhwb3J0UkFSQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvRXhwb3J0UkFSQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzBmMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0V4cG9ydFJBUkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLkpDQVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFJBUkFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWwgPSBKQ0FVSU1lc3NhZ2VzLmNvbm5lY3Rvcl9leHBvcnRfYWN0aW9uX2xhYmVsX3VpXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJleHBvcnRfcmFyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBFeHBvcnRSQVJBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRleHQobGFiZWwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQmFzZUFjdGlvbiNwcmltUnVuKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKLQkJQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQoKTsKLQkJSjJFRVVJUGx1Z2luIHBsdWdpbiA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXdpemFyZC5pbml0KHBsdWdpbi5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uKTsKLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHBsdWdpbi5nZXREaWFsb2dTZXR0aW5ncygpKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0lDb25uZWN0b3JBcmNoaXZlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvSUNvbm5lY3RvckFyY2hpdmVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjNWZjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvSUNvbm5lY3RvckFyY2hpdmVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBEZWZpbmVzIGNvbnN0YW50cyBmb3IgQ29ubmVjdG9yIEFyY2hpdmUgb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29ubmVjdG9yQXJjaGl2ZUNvbnN0YW50cyB7Ci0KLQkvL0FjdGlvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfRVhQT1JUX0FDVElPTl9MQUJFTCA9ICIlY29ubmVjdG9yLmV4cG9ydC5hY3Rpb24ubGFiZWxfdWlfIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9HZW5lcmFsCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX1BST0pFQ1RfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29ubmVjdG9yX1Byb2plY3RfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfRklMRV9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb25uZWN0b3JfRmlsZV9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JFX0NPTk5FQ1RPUl9GSUxFX05BTUVTX0lEID0gIkVKQkltcG9ydFdpemFyZFBhZ2UxLlNUT1JFX0NPTk5FQ1RPUl9GSUxFX05BTUVTX0lEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JFX0NPTk5FQ1RPUl9FWFBPUlRfRklMRV9OQU1FUyA9ICJDb25lbmN0b3JFeHBvcnRXaXphcmRQYWdlMS5TVE9SRV9DT05ORUNUT1JfRVhQT1JUX0ZJTEVfTkFNRVMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laX0lNQUdFID0gImNvbm5lY3Rvcl9pbXBvcnRfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBUl9CUk9XU0VfQlVUVE9OX0ZJTFRFUiA9ICIqLnJhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfRVhURU5TSU9OID0gInJhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRVNfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiWWVzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTm9fVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVTVElPTl9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJRdWVzdGlvbl9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX19VSV8gPSAiUmVzb3VyY2VfezB9X2FscmVhZHlfZXhpc3RzLl9fV291bGRfeW91X2xpa2VfdG9fb3ZlcndyaXRlX2l0X1VJXyI7IC8vJE5PTi1OTFMtMSQKLQkvL0ltcG9ydAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbXBvcnRfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfQV9DT05ORUNUT1JfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW1wb3J0X2FfQ29ubmVjdG9yX3Byb2plY3RfZnJvbV90aGVfZmlsZV9zeXN0ZW1fVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfSU5UT19ORVdfT1JfRVhJU1RJTkdfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW1wb3J0X2ludG9fbmV3X29yX2V4aXN0aW5nX0VudGVycHJpc2VfQXBwbGljYXRpb25fcHJvamVjdF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9JTVBPUlRfSURfID0gIkNvbm5lY3RvclByb2plY3RJbXBvcnRQYWdlMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfSU1QT1JUX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvbm5lY3Rvcl9JbXBvcnRfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJUkFSMTAwMCA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmlyYXIxMDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9FeHBvcnQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfRVhQT1JUX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvbm5lY3Rvcl9FeHBvcnRfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfQ09OTkVDVE9SX19VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFeHBvcnRfQ29ubmVjdG9yX1Byb2plY3RfdG9fdGhlX2xvY2FsX2ZpbGVfc3lzdGVtX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0JFTkNIX0lEID0gIkNvbm5lY3RvckV4cG9ydFBhZ2UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFeHBvcnRfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWF9XSVpfSU1BR0UgPSAiY29ubmVjdG9yX2V4cG9ydF93aXoiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJBUjEwMDAgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5lcmFyMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vRXJyb3JzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5BQkxFX1RPX0NPTVBMRVRFX1RIRV9PUEVOX0VSUk9SXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVuYWJsZV90b19jb21wbGV0ZV90aGVfb3BlcmF0aW9uZHVtcF9jYXVzZWRfYnlfdGhpc19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9QUk9CTEVNU19VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbXBvcnRfUHJvYmxlbXNfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfSU1QT1JUX19VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb25uZWN0b3JfSW1wb3J0X0Vycm9yX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0VSUk9SX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkltcG9ydF9FcnJvcl9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRV9KQVJfRklMRV9ET0VTX05PVF9FWElTVF9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfamFyX2ZpbGVfZG9lc19ub3RfZXhpc3Rfb3JfY2Fubm90X2JlX29wZW5lZCxfVUlfIikgKyAvLyROT04tTkxTLTEkCi0JCQkJUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2xpY2tfYnJvd3NlX3RvX3NlbGVjdF9hX3ZhbGlkX2phcl9vcl9lbnRlcl9hX3ZhbGlkX2phcl9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9FWFBPUlRfRVJST1JfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29ubmVjdG9yX0V4cG9ydF9FcnJvcl9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTk5PVF9FWFBPUlRfQ0xPU0VEX1BST0pFQ1RfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2Fubm90X2V4cG9ydF9jbG9zZWRfcHJvamVjdHNfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSYXJfRmlsZV9OYW1lX05lZWRlZF9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJSYXJfRmlsZV9OYW1lX05lZWRlZF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCi19Ly8gSUNvbm5lY3RvckFyY2hpdmVDb25zdGFudHMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9JbXBvcnRSQVJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9JbXBvcnRSQVJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkMGQ2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvSW1wb3J0UkFSQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRSQVJBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkltcG9ydF9SQVIiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gImltcG9ydF9yYXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEltcG9ydFJBUkFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5CYXNlQWN0aW9uI3ByaW1SdW4ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCi0JCUNvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCB3aXphcmQgPSBuZXcgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkKCk7Ci0KLQkJSjJFRVVJUGx1Z2luIHBsdWdpbiA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJd2l6YXJkLmluaXQocGx1Z2luLmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdDb25uZWN0b3JDb21wb25lbnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdDb25uZWN0b3JDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0YTJmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3Q29ubmVjdG9yQ29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkFic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLkpDQVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JQcm9qZWN0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLQotCi0vKioKLSAqIENyZWF0ZXMgYW4gYWN0aW9uIGZvciB0aGUgQ29ubmVjdG9yIHByb2plY3QKLSAqLwotcHVibGljIGNsYXNzIE5ld0Nvbm5lY3RvckNvbXBvbmVudEFjdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbiB7Ci0KLQkvLyBUT0RPIE1ERSAwMi0yOCBGaW5kIGNvcnJlY3QgbGFiZWwKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9IEpDQVVJTWVzc2FnZXMuSkNBX01PRFVMRV9XSVpfVElUTEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAibmV3ZWFyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgTmV3Q29ubmVjdG9yQ29tcG9uZW50QWN0aW9uKCkgewotCQlzZXRUZXh0KExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ly8gTmV3Q29ubmVjdG9yUHJvamVjdEFjdGlvbgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24uCi0JICogCi0JICogQHBhcmFtIElXb3JrYmVuY2gKLQkgKiAgICAgICAgICAgIHdvcmtiZW5jaCAtIFdvcmtiZW5jaCB0byBhZGQgdG8gdGhpcyB3aXphcmQgdG9vLgotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIGxhYmVsIC0gTGFiZWwgZm9yIHByb2plY3QuCi0JICogQHBhcmFtIENsYXNzW10KLQkgKiAgICAgICAgICAgIGFjY2VwdGVkVHlwZXMgLSBMaXN0IG9mIGFjY2VwdGVkIHR5cGVzIGZvciB0aGlzIHdpemFyZAotCSAqLwotCXB1YmxpYyBOZXdDb25uZWN0b3JDb21wb25lbnRBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCwgQ2xhc3NbXSBhY2NlcHRlZFR5cGVzKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaCwgbGFiZWwsIGFjY2VwdGVkVHlwZXMsIGZhbHNlKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ly8gTmV3Q29ubmVjdG9yUHJvamVjdEFjdGlvbgotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBXaXphcmQKLQkgKi8KLQlwcm90ZWN0ZWQgV2l6YXJkIGNyZWF0ZVdpemFyZCgpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0b3JQcm9qZWN0V2l6YXJkKCk7Ci0JfS8vIGNyZWF0ZVdpemFyZAotCi0JLyoqCi0JICogc2hvdWxkQWNjZXB0RWxlbWVudCAtIEFsd2F5cyB0cnVlCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWNjZXB0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOyAvKiBOZXdHcm91cC5pc09uQnVpbGRQYXRoKG9iaikgJiYgIU5ld0dyb3VwLmlzSW5BcmNoaXZlKG9iaik7ICovCi0JfS8vIHNob3VsZEFjY2VwdEVsZW1lbnQKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nVGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfS8vIE5ld0Nvbm5lY3RvclByb2plY3RBY3Rpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9SQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9SQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhNzk2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgicmFyYXJjaGl2ZXVpIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzLCBpbnQgeCkgewotCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9wbHVnaW4vSkNBVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvcGx1Z2luL0pDQVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2E0MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9wbHVnaW4vSkNBVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDE1LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSkNBVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vCVRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSkNBVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBKQ0FVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBKQ0FVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvdXRpbC9KQ0FVSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3V0aWwvSkNBVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDc0N2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvdXRpbC9KQ0FVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLXB1YmxpYyBjbGFzcyBKQ0FVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqY2FfdWkiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSkNBVUlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29ubmVjdG9yX2V4cG9ydF9hY3Rpb25fbGFiZWxfdWlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF85OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTE7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKQ0FVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9MT0FEX0VSUk9SID0gXzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX01PRFVMRV9XSVpfVElUTEUgPSBfMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfVkVSU0lPTl9MQkwgPSBfMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfTU9EVUxFX01BSU5fUEdfVElUTEUgPSBfMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfTU9EVUxFX01BSU5fUEdfREVTQyA9IF80OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9JTVBPUlRfTUFJTl9QR19ERVNDID0gXzU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0lNUE9SVF9NQUlOX1BHX1RJVExFID0gXzY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0ZJTEVfTEJMID0gXzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX01PRFVMRV9MQkwgPSBfODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfRVhQT1JUX01BSU5fUEdfVElUTEUgPSBfOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfRVhQT1JUX01BSU5fUEdfREVTQyA9IF8xMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfRkFDRVRfQ09ORklHVVJBVElPTj0gXzExOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyZWE0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9ucy5Db25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gZXhwb3J0IEoyRUUgQ29ubmVjdG9yIG1vZHVsZSBzdHJ1Y3R1cmVzIAotICogZnJvbSB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggdG8gYSBkZXBsb3lhYmxlIENvbm5lY3RvciAKLSAqIEFyY2hpdmUgKi5yYXIgZmlsZS4gIAotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkIGltcGxlbWVudHMgSUV4cG9ydFdpemFyZCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgCi0JICogbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubyBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgCi0JICogb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMKLQkgKiBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotICAgIH0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIHRoZSBmb2xsb3dpbmcgcGFnZXM6Ci0JICogPHVsPgotCSAqIAk8bGk+IHtAbGluayBSQVJFeHBvcnRQYWdlfSBhcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNNQUlOX1BHfSkgCi0JICogPC91bD4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJYWRkUGFnZShuZXcgUkFSRXhwb3J0UGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRywgZ2V0U2VsZWN0aW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9ICAgCi0JICogCi0JICogPHA+Ci0JICogU2V0cyB1cCB0aGUgZGVmYXVsdCB3aXphcmQgcGFnZSBpbWFnZS4gCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuSkNBX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JfSAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczZTg0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRU1vZHVsZUltcG9ydFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnV0aWwuSkNBVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudEltcG9ydFBhZ2UgZXh0ZW5kcyBKMkVFTW9kdWxlSW1wb3J0UGFnZSB7Ci0KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSkNBVUlNZXNzYWdlcy5KQ0FfSU1QT1JUX01BSU5fUEdfVElUTEUpOwotCQlzZXREZXNjcmlwdGlvbihKQ0FVSU1lc3NhZ2VzLkpDQV9JTVBPUlRfTUFJTl9QR19ERVNDKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkpDQV9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUltcG9ydExhYmVsKCkgewotCQlyZXR1cm4gSkNBVUlNZXNzYWdlcy5KQ0FfRklMRV9MQkw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117IioucmFyIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lc1N0b3JlSUQoKSB7Ci0JCXJldHVybiAiUkFSIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBKQ0FVSU1lc3NhZ2VzLkpDQV9NT0RVTEVfTEJMOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZm9wb3BJRCgpIHsKLQkJcmV0dXJuIElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9SQVJfV0laQVJEX1BBR0U7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlRmFjZXRJRCgpewotCQlyZXR1cm4gSUoyRUVGYWNldENvbnN0YW50cy5KQ0E7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjM5NGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnMuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5JUHJvZHVjdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFdpemFyZCB1c2VkIHRvIGltcG9ydCBKMkVFIENvbm5lY3RvciBtb2R1bGUgc3RydWN0dXJlcyBpbnRvIHRoZSBFY2xpcHNlIFdvcmtiZW5jaCBmcm9tIGFuCi0gKiBleGlzdGluZyBDb25uZWN0b3IgKi5yYXIgZmlsZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCBleHRlbmRzIEoyRUVDb21wb25lbnRJbXBvcnRXaXphcmQgewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8KLQkgKiBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgdGhlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlCi0JICogICAgICAgICAgICBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgYW4ge0BsaW5rIFJBUkltcG9ydFBhZ2V9IGFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJYWRkUGFnZShuZXcgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0UGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRykpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiA8cD4KLQkgKiBTZXRzIHVwIHRoZSBkaWFsb2cgd2luZG93IHRpdGxlIGFuZCBkZWZhdWx0IHdpemFyZCBwYWdlIGltYWdlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBkb0luaXQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLklNUE9SVF9XSVpfVElUTEUpKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuSkNBX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCS8vIHVwZGF0ZUVBUlRvTW9kZWxGcm9tU2VsZWN0aW9uKGdldFNwZWNpZmljRGF0YU1vZGVsKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRNb2R1bGVWYWxpZGF0b3JTdHJpbmdzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EudmFsaWRhdGlvbi5VSUNvbm5lY3RvclZhbGlkYXRvciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0gICAgICAgIHJldHVybiBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9KQ0EpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yRmFjZXRJbnN0YWxsUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yRmFjZXRJbnN0YWxsUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTgzYmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckZhY2V0SW5zdGFsbFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCSAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuSUNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnV0aWwuSkNBVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yRmFjZXRJbnN0YWxsUGFnZSBleHRlbmRzIEoyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlIGltcGxlbWVudHMgSUNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHJpdmF0ZSBMYWJlbCBjb25maWdGb2xkZXJMYWJlbDsKLQlwcml2YXRlIFRleHQgY29uZmlnRm9sZGVyOwotCQotCXByaXZhdGUgVGV4dCBvdXRwdXRGb2xkZXI7Ci0JcHJpdmF0ZSBMYWJlbCBvdXRwdXRGb2xkZXJMYWJlbDsKLQkKLQlwdWJsaWMgQ29ubmVjdG9yRmFjZXRJbnN0YWxsUGFnZSgpIHsKLQkJc3VwZXIoSU1vZHVsZUNvbnN0YW50cy5KU1RfQ09OTkVDVE9SX01PRFVMRSk7Ci0JCXNldFRpdGxlKEpDQVVJTWVzc2FnZXMuSkNBX01PRFVMRV9NQUlOX1BHX1RJVExFKTsKLQkJc2V0RGVzY3JpcHRpb24oSkNBVUlNZXNzYWdlcy5KQ0FfRkFDRVRfQ09ORklHVVJBVElPTik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0VBUl9QUk9KRUNUX05BTUUsIENPTkZJR19GT0xERVIsIE9VVFBVVF9GT0xERVJ9OwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX0NPTk5FQ1RPUl9XSVpBUkRfUDMpOwotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCS8vc2V0dXBFYXJDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotCQljb25maWdGb2xkZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY29uZmlnRm9sZGVyTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5TT1VSQ0VGT0xERVIpKTsKLQkJY29uZmlnRm9sZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCi0JCWNvbmZpZ0ZvbGRlciA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWNvbmZpZ0ZvbGRlci5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0JCWNvbmZpZ0ZvbGRlci5zZXREYXRhKCJsYWJlbCIsIGNvbmZpZ0ZvbGRlckxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoY29uZmlnRm9sZGVyLCBDT05GSUdfRk9MREVSLCBudWxsKTsKLQkJCi0JCW91dHB1dEZvbGRlckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlvdXRwdXRGb2xkZXJMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk9VVFBVVEZPTERFUikpOwotCQlvdXRwdXRGb2xkZXJMYWJlbC5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0JCQotCQlvdXRwdXRGb2xkZXIgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlvdXRwdXRGb2xkZXIuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQlvdXRwdXRGb2xkZXIuc2V0RGF0YSgibGFiZWwiLCB0aGlzLm91dHB1dEZvbGRlckxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQob3V0cHV0Rm9sZGVyLCBPVVRQVVRfRk9MREVSLCBudWxsKTsKLQkJCi0JICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvclByb2plY3RGaXJzdFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvclByb2plY3RGaXJzdFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1ZWU3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JQcm9qZWN0Rmlyc3RQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwudXRpbC5KQ0FVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JQcm9qZWN0Rmlyc3RQYWdlIGV4dGVuZHMgSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlIHsKLQotCXB1YmxpYyBDb25uZWN0b3JQcm9qZWN0Rmlyc3RQYWdlKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIoZGF0YU1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEpDQVVJTWVzc2FnZXMuSkNBX01PRFVMRV9NQUlOX1BHX1RJVExFKTsKLQkJc2V0RGVzY3JpcHRpb24oSkNBVUlNZXNzYWdlcy5KQ0FfTU9EVUxFX01BSU5fUEdfREVTQyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5KQ0FfUFJPSkVDVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5ORVdfQ09OTkVDVE9SX1dJWkFSRF9QMSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVGYWNldElEKCkgewotCQlyZXR1cm4gSUoyRUVGYWNldENvbnN0YW50cy5KQ0E7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JQcm9qZWN0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDMwMzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yUHJvamVjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5wcm9qZWN0LmZhY2V0LkNvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnV0aWwuSkNBVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LklQcm9kdWN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdQcm9qZWN0RGF0YU1vZGVsRmFjZXRXaXphcmQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvclByb2plY3RXaXphcmQgZXh0ZW5kcyBOZXdQcm9qZWN0RGF0YU1vZGVsRmFjZXRXaXphcmQgewotCi0JcHVibGljIENvbm5lY3RvclByb2plY3RXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXNldFdpbmRvd1RpdGxlKEpDQVVJTWVzc2FnZXMuSkNBX01PRFVMRV9XSVpfVElUTEUpOwotCX0KLQkKLQlwdWJsaWMgQ29ubmVjdG9yUHJvamVjdFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoSkNBVUlNZXNzYWdlcy5KQ0FfTU9EVUxFX1dJWl9USVRMRSk7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IENvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJZmluYWwgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShKMkVFVUlQbHVnaW4uUExVR0lOX0lEKTsKLQkJZmluYWwgVVJMIHVybCA9IGJ1bmRsZS5nZXRFbnRyeSgiaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdG9yX3dpei5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSgidGVtcGxhdGUuanN0LmNvbm5lY3RvciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIElXaXphcmRQYWdlIGNyZWF0ZUZpcnN0UGFnZSgpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0b3JQcm9qZWN0Rmlyc3RQYWdlKG1vZGVsLCAiZmlyc3QucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewotICAgICAgICByZXR1cm4gUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfSkNBKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9SQVJFeHBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9SQVJFeHBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjM0ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvUkFSRXhwb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVNb2R1bGVFeHBvcnRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnV0aWwuSkNBVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgUkFSRXhwb3J0UGFnZSBleHRlbmRzIEoyRUVNb2R1bGVFeHBvcnRQYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgUkFSRXhwb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXNldFRpdGxlKEpDQVVJTWVzc2FnZXMuSkNBX0VYUE9SVF9NQUlOX1BHX1RJVExFKTsKLQkJc2V0RGVzY3JpcHRpb24oSkNBVUlNZXNzYWdlcy5KQ0FfRVhQT1JUX01BSU5fUEdfREVTQyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5KQ0FfRVhQT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldFByb2plY3RJbXBvcnRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkpDQV9QUk9KX0xCTCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsdGVyRXhwcmVzc2lvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117IioucmFyIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFRXhwb3J0UGFnZSNpc01ldGFUeXBlU3VwcG9ydGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNZXRhVHlwZVN1cHBvcnRlZChPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIENvbm5lY3RvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRJbmZvcG9wSUQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5mb3BvcElEKCkgewotCQlyZXR1cm4gSUoyRUVVSUNvbnRleHRJZHMuRVhQT1JUX1JBUl9XSVpBUkRfUEFHRTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXBuZW50SUQoKSB7Ci0gICAgICAgIHJldHVybiAiSlNUX0NPTk5FQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDk2NjM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9V1RQIEpDQSBVSSBQbHVnLWluCi1qY2EubW9kdWxlX3VpXz1Db25uZWN0b3IgTW9kdWxlCi1uZXcuamNhLm1vZHVsZS5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIGEgQ29ubmVjdG9yIG1vZHVsZQotY29ubmVjdG9yLmltcG9ydC5kZXNjcmlwdGlvbl91aV89SW1wb3J0IGFuIGV4dGVybmFsIENvbm5lY3RvciBSQVIgZmlsZSBpbnRvIGEgQ29ubmVjdG9yIHByb2plY3QKLWNvbm5lY3Rvci5leHBvcnQuZGVzY3JpcHRpb25fdWlfPUV4cG9ydCBhIENvbm5lY3RvciBwcm9qZWN0IGludG8gYSBDb25uZWN0b3IgUkFSIGZpbGUKLWNvbm5lY3Rvci5qYXIuZmlsZV91aV89UkFSIGZpbGUKLWNvbm5lY3Rvci5tb2R1bGVfdWlfPUNvbm5lY3RvciBNb2R1bGUKLW5ldy5jb25uZWN0b3IubW9kdWxlLmRlc2NyaXB0aW9uX3VpXz1DcmVhdGUgYSBDb25uZWN0b3IgcHJvamVjdAotY29ubmVjdG9yLmltcG9ydC5hY3Rpb24ubGFiZWxfdWlfPUltcG9ydCBSQVIgRmlsZS4uLgotY29ubmVjdG9yLmV4cG9ydC5hY3Rpb24ubGFiZWxfdWlfPUV4cG9ydCBSQVIgRmlsZS4uLgotY29ubmVjdG9yX21vZHVsZV91aV89Q29ubmVjdG9yIFByb2plY3QKLW5ldy5jb25uZWN0b3IubW9kdWxlLmRlc2NyaXB0aW9uX3VpXz1DcmVhdGUgYSBKMkVFIGNvbm5lY3RvciBwcm9qZWN0Ci1jb25uZWN0b3JzLmFjdGlvblNldD1KMkMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjBjMDJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDwhLS0gQ29ubmVjdG9yIE1vZHVsZSBXaXphcmQgLS0+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkoyRUVVSVByb2plY3RXaXphcmRzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJWNvbm5lY3Rvcl9tb2R1bGVfdWlfIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbCIKLSAgICAgICAgICAgIHByb2plY3Q9InRydWUiCi0gICAgICAgICAgICBmaW5hbFBlcnNwZWN0aXZlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgIDxjbGFzcyBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iamF2YWVlcHJvamVjdCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVudUluZGV4IiB2YWx1ZT0iNTAiIC8+Ci0gICAgICAgICA8L2NsYXNzPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJW5ldy5jb25uZWN0b3IubW9kdWxlLmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0gICAgICA8L3dpemFyZD4KLSAgICA8L2V4dGVuc2lvbj4KLTwhLS0gSkNBIEltcG9ydCBXaXphcmQgLS0+IAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWNvbm5lY3Rvci5qYXIuZmlsZV91aV8iPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWNvbm5lY3Rvci5pbXBvcnQuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgICA8L3dpemFyZD4KLSAgICAgPC9leHRlbnNpb24+Ci0KLTwhLS0gSkNBIEV4cG9ydCBXaXphcmQgLS0+IAotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgPHdpemFyZAotICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwiCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudEV4cG9ydFdpemFyZCIKLSAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQiCi0gICAgICAgICAgIG5hbWU9IiVjb25uZWN0b3IuamFyLmZpbGVfdWlfIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVjb25uZWN0b3IuZXhwb3J0LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICAgPC93aXphcmQ+Ci0gICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS53aXphcmRQYWdlcyI+Ci0gICAgICA8d2l6YXJkLXBhZ2VzIGFjdGlvbj0ianN0LmNvbm5lY3Rvci5pbnN0YWxsIj4KLSAgICAgICAgPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yRmFjZXRJbnN0YWxsUGFnZSIvPgotICAgICAgPC93aXphcmQtcGFnZXM+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3Byb3BlcnR5X2ZpbGVzL2pjYV91aS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvcHJvcGVydHlfZmlsZXMvamNhX3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZmY1ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvcHJvcGVydHlfZmlsZXMvamNhX3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLV8wPUZhaWxlZCB0byBmaW5kIHRoZSBpbWFnZSAiezB9Ii4KLV8xPU5ldyBDb25uZWN0b3IgUHJvamVjdAotXzI9SjJDIHZlcnNpb246Ci1fMz1Db25uZWN0b3IgUHJvamVjdAotXzQ9Q3JlYXRlIGEgc3RhbmRhbG9uZSBDb25uZWN0b3IgbW9kdWxlIG9yIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuCi1fNT1JbXBvcnQgYSBDb25uZWN0b3IgbW9kdWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtCi1fNj1Db25uZWN0b3IgSW1wb3J0Ci1fNz1Db25uZWN0b3IgZmlsZToKLV84PUNvbm5lY3RvciBtb2R1bGU6Ci1fOT1Db25uZWN0b3IgRXhwb3J0Ci1fMTA9RXhwb3J0IENvbm5lY3RvciBtb2R1bGUgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotXzExPUNvbmZpZ3VyZSBDb25uZWN0b3IgbW9kdWxlIHNldHRpbmdzLgotY29ubmVjdG9yX2V4cG9ydF9hY3Rpb25fbGFiZWxfdWlfPUV4cG9ydCBSQVIgRmlsZS4uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZWI4MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImpjYS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJyYXJwcm9qZWN0LyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImpjYWVkaXQvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamNhLXZhbGlkYXRpb24vIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjliMzY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1ydW50aW1lCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4NWFhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OWE4MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotI01vbiBGZWIgMTggMTU6NTc6MDkgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNDg0ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjA1LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5WZW5kb3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5hcmNoaXZlLm9wZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5tb2R1bGUudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5wcm9qZWN0LmZhY2V0Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiZGIzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IGpjYS8sXAotICAgICAgICAgICAgICAgICAgICAgICAgIHJhcnByb2plY3QvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBqY2FlZGl0LyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgamNhLXZhbGlkYXRpb24vLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLW91dHB1dC4uID0gYmluLwotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI3MGVkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNPTlRBQ1Q9ZGFuYmVyZ0B1cy5pYm0uY29tCi1Db21wb25lbnRTaG9ydE5hbWU9ZWpiCi1Db21wb25lbnRGdWxsTmFtZT1FSkIKLUNvbXBvbmVudENvbXBldGVuY3k9RU1GCi1KYXZhQ29tcGlsZS4xPXNyY2phcgotQnVpbGRWZXJpZmljYXRpb24uMT1kaXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NGQyZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoIiBkZWZhdWx0PSJwYWNrYWdpbmdQbHVnaW4iIGJhc2VkaXI9Ii4vLi4iPgotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdlRGlyIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGlyZWN0b3J5IiAgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5pZCIgdmFsdWU9ImNvbS5pYm0uZXRvb2xzLmVqYiIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLnZlcnNpb24iICB2YWx1ZT0iIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJwYWNrYWdpbmdQbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSIke3BsdWdpbi5pZH0iLz4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7cGFja2FnZURpcn0vcGx1Z2lucy8ke3BsdWdpbi5pZH1fJHtwbHVnaW4udmVyc2lvbn0iPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3BsdWdpbi5kaXJlY3Rvcnl9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS9lamIuamFyIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkL3dzQnVpbGQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvd3NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzBiODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvd3NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBwcm9qZWN0IFsKLQk8IUVOVElUWSBiYXNlQnVpbGQgU1lTVEVNICJmaWxlOi4uLy4uL3dzQnVpbGREZWYueG1sIj4KLV0+Ci0KLTxwcm9qZWN0IG5hbWU9ImJ1aWxkUGx1Z2luIiBkZWZhdWx0PSJidWlsZCIgYmFzZWRpcj0iLi8uLiI+Ci0KLTwhLS0gaW5jbHVkZSB0aGUgY29tbW9uIHhtbCBidWlsZCBmaWxlIC0tPgotJmJhc2VCdWlsZDsKLQotPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0icHJlcGFyZSIgaWY9InBsdWdpbi5pZCI+Ci0JPGFudGNhbGwgdGFyZ2V0PSJidWlsZGphciI+Ci0JCTxwYXJhbSBuYW1lPSJqYXJuYW1lIiB2YWx1ZT0iJHtkZWZhdWx0amFybmFtZX0iLz4KLQkJPHBhcmFtIG5hbWU9ImphcmNsYXNzcGF0aCIgdmFsdWU9IiR7cGx1Z2luLmNsYXNzcGF0aH0iLz4KLQk8L2FudGNhbGw+Ci08L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzNlMWQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYSI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2YXRpb25TcGVjX3JlcXVpcmVkQ29uZmlnUHJvcGVydGllc19SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZhdGlvblNwZWNfcmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmMTQzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZhdGlvblNwZWNfcmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBZG1pbk9iamVjdF9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBZG1pbk9iamVjdF9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4N2I2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWRtaW5PYmplY3RfY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJiMWVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjdmNGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25maWdQcm9wZXJ0eV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmZpZ1Byb3BlcnR5X2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2N2UwNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmZpZ1Byb3BlcnR5X2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZmRmZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmZpZ1Byb3BlcnR5X2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uX2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uX2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjdlZmU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbl9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0b3JfbGljZW5zZV9MaWNlbnNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0b3JfbGljZW5zZV9MaWNlbnNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmZjQ4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdG9yX2xpY2Vuc2VfTGljZW5zZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdG9yX3Jlc291cmNlQWRhcHRlcl9SZXNvdXJjZUFkYXB0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rvcl9yZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiYmM1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdG9yX3Jlc291cmNlQWRhcHRlcl9SZXNvdXJjZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzM4ZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMzNkNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1MWNhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWVUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczMGJiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWVUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2ljb25zX0ljb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2ljb25zX0ljb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlODhiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcl9tZXNzYWdlQWRhcHRlcl9NZXNzYWdlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcl9tZXNzYWdlQWRhcHRlcl9NZXNzYWdlQWRhcHRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMDFlMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJfbWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxpY2Vuc2VfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMaWNlbnNlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiN2VlZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxpY2Vuc2VfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMaWNlbnNlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxpY2Vuc2VfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDE4ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxpY2Vuc2VfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWVzc2FnZUFkYXB0ZXJfbWVzc2FnZUxpc3RlbmVyc19NZXNzYWdlTGlzdGVuZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1lc3NhZ2VBZGFwdGVyX21lc3NhZ2VMaXN0ZW5lcnNfTWVzc2FnZUxpc3RlbmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1MDUwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWVzc2FnZUFkYXB0ZXJfbWVzc2FnZUxpc3RlbmVyc19NZXNzYWdlTGlzdGVuZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1lc3NhZ2VMaXN0ZW5lcl9hY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWVzc2FnZUxpc3RlbmVyX2FjdGl2YXRpb25TcGVjX0FjdGl2YXRpb25TcGVjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmMzA0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWVzc2FnZUxpc3RlbmVyX2FjdGl2YXRpb25TcGVjX0FjdGl2YXRpb25TcGVjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXNfQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtc19BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGNhYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtc19BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkRlZmluaXRpb25zX0Nvbm5lY3Rpb25EZWZpbml0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uRGVmaW5pdGlvbnNfQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Q2MTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uRGVmaW5pdGlvbnNfQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3ZWVlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkMTg4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2FkbWluT2JqZWN0c19BZG1pbk9iamVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2FkbWluT2JqZWN0c19BZG1pbk9iamVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTkyYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9hZG1pbk9iamVjdHNfQWRtaW5PYmplY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXNfQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXNfQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGU0Njc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfYXV0aGVudGljYXRpb25NZWNoYW5pc21zX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmExNDliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2luYm91bmRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2luYm91bmRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NTdkZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9pbmJvdW5kUmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9vdXRib3VuZFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX291dGJvdW5kUmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0YTEyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX291dGJvdW5kUmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfc2VjdXJpdHlQZXJtaXNzaW9uc19TZWN1cml0eVBlcm1pc3Npb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9zZWN1cml0eVBlcm1pc3Npb25zX1NlY3VyaXR5UGVybWlzc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTRhZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9zZWN1cml0eVBlcm1pc3Npb25zX1NlY3VyaXR5UGVybWlzc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjViZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbl9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbl9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN1cml0eVBlcm1pc3Npb25fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjhmNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbl9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZhdGlvblNwZWMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BY3RpdmF0aW9uU3BlYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWViYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BY3RpdmF0aW9uU3BlYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0FkbWluT2JqZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQWRtaW5PYmplY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzY0M2RhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQWRtaW5PYmplY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2ODgxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29uZmlnUHJvcGVydHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25maWdQcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTNjZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25maWdQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0Nvbm5lY3Rpb25EZWZpbml0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTIyNDYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25uZWN0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25uZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDg3NDc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29ubmVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvSW5ib3VuZFJlc291cmNlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0luYm91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzhmYjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvSW5ib3VuZFJlc291cmNlQWRhcHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0xpY2Vuc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9MaWNlbnNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNGZlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0xpY2Vuc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9NZXNzYWdlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L01lc3NhZ2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0NTUxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L01lc3NhZ2VBZGFwdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvTWVzc2FnZUxpc3RlbmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvTWVzc2FnZUxpc3RlbmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyMjQ2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L01lc3NhZ2VMaXN0ZW5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI4MmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNGZlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VBZGFwdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyNGYzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1Jlc291cmNlQWRhcHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1NlY3VyaXR5UGVybWlzc2lvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1NlY3VyaXR5UGVybWlzc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNmUzYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9TZWN1cml0eVBlcm1pc3Npb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9jb25uZWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L2Nvbm5lY3Rpb25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlZmU2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L2Nvbm5lY3Rpb25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS92YWxpZGF0aW9uL0Nvbm5lY3RvckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3ZhbGlkYXRpb24vQ29ubmVjdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZGM5ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3ZhbGlkYXRpb24vQ29ubmVjdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDIyLCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLQotICogSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLkoyRUVWYWxpZGF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5tb2R1bGVjb3JlLnV0aWwuQ29ubmVjdG9yQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQ29ubmVjdG9yTWVzc2FnZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoUmVwb3J0ZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JIZWxwZXIgZXh0ZW5kcyBKMkVFVmFsaWRhdGlvbkhlbHBlciB7Ci0JcHJvdGVjdGVkIFJBUkZpbGUgcmFyRmlsZTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9ySGVscGVyKCkgewotCQlzdXBlcigpOwotCQlyZWdpc3Rlck1vZGVsKENvbm5lY3Rvck1lc3NhZ2VDb25zdGFudHMuQ09OTkVDVE9SX01PREVMX05BTUUsICJsb2FkUmFyRmlsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBSYXIgZmlsZSBmb3IgdmFsaWRhdGlvbgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGxvYWRSYXJGaWxlKCkgewotCi0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpOwotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXApOwotCQkKLQkJdHJ5IHsKLQkJCXJhckZpbGUgPSAoUkFSRmlsZSkoKENvbm5lY3RvckFydGlmYWN0RWRpdCkgZWRpdCkuYXNBcmNoaXZlKGZhbHNlKTsKLQkJCXJldHVybiByYXJGaWxlOwotCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlMSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlMSk7Ci0JCX1maW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQkKLQkvKioKLQkgKiBHaXZlbiBhIHJlc291cmNlLCByZXR1cm4gaXRzIG5vbi1lY2xpcHNlLXNwZWNpZmljIGxvY2F0aW9uLiBJZiB0aGlzIHJlc291cmNlLCBvciB0eXBlIG9mCi0JICogcmVzb3VyY2UsIGlzbid0IGhhbmRsZWQgYnkgdGhpcyBoZWxwZXIsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuICJyYXIueG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmKHJhckZpbGUgIT0gbnVsbCl7Ci0JCQlyYXJGaWxlLmNsb3NlKCk7Ci0JCQlyYXJGaWxlID0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3ZhbGlkYXRpb24vVUlDb25uZWN0b3JWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS92YWxpZGF0aW9uL1VJQ29ubmVjdG9yVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzEwNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3ZhbGlkYXRpb24vVUlDb25uZWN0b3JWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQ29ubmVjdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUNvbm5lY3RvclZhbGlkYXRvciBleHRlbmRzIENvbm5lY3RvclZhbGlkYXRvciB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBVSUNvbm5lY3RvclZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIHRoZSB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbnsKLQkJCi0JCUlQcm9qZWN0IHByb2ogPSAoKElXb3JrYmVuY2hDb250ZXh0KSBoZWxwZXIpLmdldFByb2plY3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgd2JNb2R1bGUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qKTsKLQkJCi0gICAgICAgIGlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChwcm9qKSkgewotCQkJSVZpcnR1YWxGaWxlIHJhckREID0gd2JNb2R1bGUuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJKTsKLQkJCWlmKCByYXJERC5leGlzdHMoKSkgewkJCQotCQkJCXN0YXR1cyA9ICBzdXBlci52YWxpZGF0ZUluSm9iKGhlbHBlciwgcmVwb3J0ZXIpOwotCQkJfWVsc2V7Ci0JCQkJSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTWVzc2FnZShnZXRCYXNlTmFtZSgpLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBFUlJPUl9JTlZBTElEX0NPTk5FQ1RPUl9GSUxFKTsKLQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIGVycm9yTXNnLmdldFRleHQoIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnKTsKLQkJCX0KLQkJCS8vdmFsaWRhdGVKMkVFMTREb2NUeXBlKGhlbHBlciwgZWRpdE1vZGVsKTsKLQkJfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotCX0KLQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBuYXR1cmUgaXMgY29uc2lzdGVudCB3aXRoIGRvYyB0eXBlLgotCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVKMkVFMTREb2NUeXBlKENvbm5lY3RvckhlbHBlciBoZWxwZXIsIENvbm5lY3RvckVkaXRNb2RlbCBlZGl0TW9kZWwpIHsKLS8vCi0vLwkJaWYgKGVkaXRNb2RlbC5nZXRDb25uZWN0b3JOYXR1cmUoKS5nZXRKMkVFVmVyc2lvbigpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEICYmIGdldENvbm5lY3RvckREKCkuZ2V0VmVyc2lvbklEKCkgPCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEKSB7Ci0vLwkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0vLwkJCXBhcmFtc1swXSA9IERPQ1RZUEVfMV80OwotLy8JCQlwYXJhbXNbMV0gPSBoZWxwZXIuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLS8vCQkJcGFyYW1zWzJdID0gRE9DVFlQRV8xXzM7Ci0vLwkJCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIENPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXywgcGFyYW1zKTsKLS8vCQl9IGVsc2UgaWYgKGVkaXRNb2RlbC5nZXRDb25uZWN0b3JOYXR1cmUoKS5nZXRKMkVFVmVyc2lvbigpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEICYmIGdldENvbm5lY3RvckREKCkuZ2V0VmVyc2lvbklEKCkgIT0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRCkgewotLy8JCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotLy8JCQlwYXJhbXNbMF0gPSBET0NUWVBFXzFfMzsKLS8vCQkJcGFyYW1zWzFdID0gaGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0vLwkJCXBhcmFtc1syXSA9IERPQ1RZUEVfMV80OwotLy8JCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBDT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8sIHBhcmFtcyk7Ci0vLwkJfS8vIGlmCi0vLwl9Ly8gdmFsaWRhdGVEb2NUeXBlVnNOYXR1cmUKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQxNmUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5JQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewotCXB1YmxpYyBDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfSUQpKSB7Ci0JCQlyZXR1cm4gSkNBOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09ORklHX0ZPTERFUikpIHsKLQkJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSjJFRVByZWZlcmVuY2VzLktleXMuSkNBX0NPTlRFTlRfRk9MREVSKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE1PRFVMRV9VUkkpKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpLnJlcGxhY2UoJyAnLCdfJyk7Ci0JCQlyZXR1cm4gcHJvamVjdE5hbWUgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUOyAKLQkJfSBlbHNlIGlmKHByb3BlcnR5TmFtZS5lcXVhbHMoR0VORVJBVEVfREQpKXsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX1lbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9VVFBVVF9GT0xERVIpKSB7Ci0JCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkpDQV9PVVRQVVRfRk9MREVSKTsJCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IGNvbnZlcnRGYWNldFZlcnNpb25Ub0oyRUVWZXJzaW9uKElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0Q29ubmVjdG9yVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9wbHVnaW4vSkNBUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KQ0FSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg0MjljZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KQ0FSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEpDQVJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAicmFyIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEpDQVJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGljZW5zZUl0ZW1Qcm92aWRlcl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01lc3NhZ2VBZGFwdGVyX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01lc3NhZ2VMaXN0ZW5lcl90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BY3RpdmF0aW9uU3BlY190eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BZG1pbk9iamVjdF90eXBlOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSkNBUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9wbHVnaW4vSmNhTW9kdWxlRXh0ZW5zaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9wbHVnaW4vSmNhTW9kdWxlRXh0ZW5zaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2RmMjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pjYU1vZHVsZUV4dGVuc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDI5LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZQotICogR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW47Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVFeHRlbnNpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5KY2FNb2R1bGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBKY2FNb2R1bGVFeHRlbnNpb25JbXBsIGV4dGVuZHMgRWFyTW9kdWxlRXh0ZW5zaW9uSW1wbCBpbXBsZW1lbnRzIEpjYU1vZHVsZUV4dGVuc2lvbiB7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEpjYU1vZHVsZUV4dGVuc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5KY2FNb2R1bGVFeHRlbnNpb24jY3JlYXRlUHJvamVjdEluZm8oKQotCSAqLwotCS8vCXB1YmxpYyBKMkVFSmF2YVByb2plY3RJbmZvIGNyZWF0ZVByb2plY3RJbmZvKCkgewotCS8vCQlyZXR1cm4gbmV3IENvbm5lY3RvclByb2plY3RJbmZvKCk7Ci0JLy8JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkpjYU1vZHVsZUV4dGVuc2lvbiNjcmVhdGVJbXBvcnRPcGVyYXRpb24ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5SQVJGaWxlKQotCSAqLwotCS8vCXB1YmxpYyBKMkVFSW1wb3J0T3BlcmF0aW9uIGNyZWF0ZUltcG9ydE9wZXJhdGlvbihJUHJvamVjdCBwcm9qLCBSQVJGaWxlIHJhckZpbGUpewotCS8vCQlyZXR1cm4gbmV3IFJBUkltcG9ydE9wZXJhdGlvbihwcm9qLCByYXJGaWxlKTsKLQkvLwl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkVhck1vZHVsZUV4dGVuc2lvbiNjcmVhdGVQcm9qZWN0RGF0YU1vZGVsKCkKLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBjcmVhdGVQcm9qZWN0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IENvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uRWFyTW9kdWxlRXh0ZW5zaW9uI2NyZWF0ZUltcG9ydERhdGFNb2RlbCgpCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgY3JlYXRlSW1wb3J0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IENvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pjYVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9wbHVnaW4vSmNhUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNDk3MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9wbHVnaW4vSmNhUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSB0b3AtbGV2ZWwgY2xhc3Mgb2YgdGhlIGoyZWUgcGx1Z2luLgotICogCi0gKiBAc2VlIEFic3RyYWN0VUlQbHVnaW4gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gVUkgcGx1Z2lucwotICovCi0KLXB1YmxpYyBjbGFzcyBKY2FQbHVnaW4gZXh0ZW5kcyBXVFBQbHVnaW4gaW1wbGVtZW50cyBSZXNvdXJjZUxvY2F0b3IgewotCS8vIERlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyCi0JcHJpdmF0ZSBzdGF0aWMgSmNhUGx1Z2luIGluc3Q7Ci0JcHJvdGVjdGVkIGZpbmFsIElQYXRoIGljb25zRm9sZGVyID0gbmV3IFBhdGgoUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkuZ2V0RW50cnkoImljb25zIikuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBWYWxpZGF0aW9uIHBhcnQgb2YgdGhlIHBsdWdpbgotCS8vR2xvYmFsIFJlc291cmNlU2V0IChzb21ld2hhdCBnbG9iYWwpCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElDT05fRElSUyA9IG5ldyBTdHJpbmdbXXsiaWNvbnMvZnVsbC9vYmoxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9jdmlldzE2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL2N0b29sMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvY2xjbDE2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL292cjE2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL2V4dHJhIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL3dpemJhbiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMiLCAvLyROT04tTkxTLTEkCi0JCQkJIiJ9OyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIEoyRUUgcGx1Z2luIGFuZCBjYWNoZSBpdHMgZGVmYXVsdCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBKY2FQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChpbnN0ID09IG51bGwpCi0JCQlpbnN0ID0gdGhpczsKLQl9Ci0KLQotCS8qKgotCSAqIEdldCB0aGUgcGx1Z2luIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIEpjYVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0QmFzZVVSTCgpIHsKLQkJcmV0dXJuIGdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0SW1hZ2VVUkwoa2V5LCBnZXRCdW5kbGUoKSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRJbnN0YWxsVVJMKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpjYVBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBpbnN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGx1Z2luIGRpcmVjdG9yeSBsb2NhdGlvbi0gdGhlIGRpcmVjdG9yeSB0aGF0IGFsbCB0aGUgcGx1Z2lucyBhcmUgbG9jYXRlZCBpbiAoaS5lLgotCSAqIGQ6XGluc3RhbGxkaXJccGx1Z2luKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UGx1Z2luTG9jYXRpb24oU3RyaW5nIHBsdWdpbklkKSB7Ci0vLwkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJUGF0aCBpbnN0YWxsUGF0aCA9IG5ldyBQYXRoKGJ1bmRsZS5nZXRFbnRyeSgiLyIpLnRvRXh0ZXJuYWxGb3JtKCkpLnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgaW5zdGFsbFN0ciA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChpbnN0YWxsUGF0aC50b1N0cmluZygpKSkuZ2V0RmlsZSgpOwotCQkJCXJldHVybiBuZXcgUGF0aChpbnN0YWxsU3RyKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoZ2V0QnVuZGxlKCksIGtleSk7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBzdWJzdGl0dXRpb25zKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgc3Vic3RpdHV0aW9ucyk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW4jZ2V0UGx1Z2luSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UpOwotCX0JCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgYm9vbGVhbiB0cmFuc2xhdGUpIHsKLQkJLy8gVE9ETyBGb3Igbm93Li4uICB0cmFuc2xhdGUgbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gc3Vic3RpdHV0aW9ucywgYm9vbGVhbiB0cmFuc2xhdGUpIHsKLQkJLy8gVE9ETyBGb3Igbm93Li4uICB0cmFuc2xhdGUgbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSxzdWJzdGl0dXRpb25zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNTJiMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB3YXMgbm90IGludGVuZGVkIHRvIGJlIHB1YmxpYyBBUEkuICBQbGVhc2UgdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5JQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllc30gCi0gKiAKLSAqIEBkZXByZWNhdGVkCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm9qZWN0LmZhY2V0LkNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm9qZWN0LmZhY2V0LkNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlY2IxZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0Lld0cFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkNsYXNzcGF0aEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLkNvbm5lY3RvckFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGVsZWdhdGUgZXh0ZW5kcyBKMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX1hNTF9URU1QTEFURV8xMAkJPSAicmFydHAxMC54bWwiOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9YTUxfVEVNUExBVEVfMTUJCT0gInJhcnRwMTUueG1sIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIE9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlJRGF0YU1vZGVsIG1vZGVsID0gKElEYXRhTW9kZWwpIGNvbmZpZzsKLQotCQkJZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQkvLyBBZGQgV1RQIG5hdHVyZXMuCi0KLQkJCVd0cFV0aWxzLmFkZE5hdHVyZXMocHJvamVjdCk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLQotCQkJZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCWZpbmFsIElQYXRoIHBqcGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQotCQkJLy8gU2V0dXAgdGhlIGZsZXhpYmxlIHByb2plY3Qgc3RydWN0dXJlLgotCi0JCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgZmFsc2UpOwotCi0JCQljLmNyZWF0ZSgwLCBudWxsKTsKLQkJCXNldE91dHB1dEZvbGRlcihtb2RlbCwgYyk7Ci0KLQkJCWZpbmFsIElWaXJ0dWFsRm9sZGVyIHJvb3QgPSBjLmdldFJvb3RGb2xkZXIoKTsKLQkJCUlGb2xkZXIgc291cmNlRm9sZGVyID0gbnVsbDsKLQkJCVN0cmluZyBjb25maWdGb2xkZXIgPSBudWxsOwotCQkJY29uZmlnRm9sZGVyID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIpOwotCQkJcm9vdC5jcmVhdGVMaW5rKG5ldyBQYXRoKCIvIiArIGNvbmZpZ0ZvbGRlciksIDAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgY29uZmlnRm9sZGVyTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKTsKLQkJCUlQYXRoIGNvbmZpZ0ZvbGRlcnBhdGggPSBwanBhdGguYXBwZW5kKGNvbmZpZ0ZvbGRlck5hbWUpOwotCQkJc291cmNlRm9sZGVyID0gd3MuZ2V0Um9vdCgpLmdldEZvbGRlcihjb25maWdGb2xkZXJwYXRoKTsKLQotCQkJaWYgKCFzb3VyY2VGb2xkZXIuZ2V0RmlsZShKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nIHZlciA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIpOwotCQkJCWludCBuVmVyID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQodmVyKTsKLQkJCQkKLQkJCQlJRmlsZSBhRmlsZSA9IHNvdXJjZUZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSkpOwotCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGFGaWxlKTsKLQkJCQlTdHJpbmcgdGVtcGxhdGUgPSBuVmVyID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQKLQkJCQkJCT8gQ09OTkVDVE9SX1hNTF9URU1QTEFURV8xMAotCQkJCQkJOiBDT05ORUNUT1JfWE1MX1RFTVBMQVRFXzE1OwotCQkJCUlucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHRlbXBsYXRlKTsKLQkJCQlpZiAoaW4gIT0gbnVsbCAmIG91dCAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlBcmNoaXZlVXRpbC5jb3B5KGluLCBvdXQpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihpb2UpOwotCQkJCQl9IGZpbmFsbHl7Ci0JCQkJCQl0cnl7Ci0JCQkJCQkJaWYobnVsbCAhPSBvdXQpewotCQkJCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQkJCQl9IGlmKG51bGwgIT0gaW4pewotCQkJCQkJCQlpbi5jbG9zZSgpOwotCQkJCQkJCX0KLQkJCQkJCX1jYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGlvZSk7Ci0JCQkJCQl9IAotCQkJCQl9Ci0JCQkJCQotCQkJCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgZWRpdCA9IG5ldyBDb25uZWN0b3JBcnRpZmFjdEVkaXQocHJvamVjdCwgZmFsc2UsIHRydWUpOwotCQkJCQl0cnl7Ci0JCQkJCQlpZiggZWRpdCAhPSBudWxsICl7Ci0JCQkJCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IGVkaXQuZ2V0Q29ubmVjdG9yKCk7Ci0JCQkJCQkJY29ubmVjdG9yLnNldERpc3BsYXlOYW1lKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQkJCQllZGl0LnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCX0KLQkJCQkJfWZpbmFsbHl7Ci0JCQkJCQlpZiggZWRpdCAhPSBudWxsICl7Ci0JCQkJCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvL3dpdGhvdXQgYSB0ZW1wbGF0ZQotCQkJCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQuY3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3IocHJvamVjdCwgblZlcik7Ci0JCQkJfSAvLyBpZgkJCQkKLQkJCX0KLQkJCQotCQkJLy8gYWRkIHNvdXJjZSBmb2xkZXIgbWFwcwotCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY3AgPSBqcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlID0gY3BbaV07Ci0JCQkJaWYgKGNwZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCQlyb290LmNyZWF0ZUxpbmsoY3BlLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLCAwLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUlWaXJ0dWFsRmlsZSB2ZiA9IGMuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKTsKLQkJCUlGaWxlIG1hbmlmZXN0bWYgPSB2Zi5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQkJaWYgKG1hbmlmZXN0bWYgPT0gbnVsbCB8fCAhbWFuaWZlc3RtZi5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWNyZWF0ZU1hbmlmZXN0KHByb2plY3QsIGMuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKSwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFNldHVwIHRoZSBjbGFzc3BhdGguCi0JCQlDbGFzc3BhdGhIZWxwZXIucmVtb3ZlQ2xhc3NwYXRoRW50cmllcyhwcm9qZWN0LCBmdik7Ci0KLQkJCWlmICghQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMocHJvamVjdCwgZnYpKSB7Ci0JCQkJLy8gVE9ETzogU3VwcG9ydCB0aGUgbm8gcnVudGltZSBjYXNlLgotCQkJCS8vIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiwgPHNvbWV0aGluZz4gKTsKLQkJCX0KLQotCQkJaWYoSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzLmdldERlZmF1bHRVc2VFQVJMaWJyYXJpZXMoKSl7Ci0JCQkJZmluYWwgSVBhdGggZWFyTGliQ29udGFpbmVyID0gbmV3IFBhdGgoSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lci5DT05UQUlORVJfSUQpOwotCQkJCWFkZFRvQ2xhc3NwYXRoKGpwcm9qLCBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShlYXJMaWJDb250YWluZXIpKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQkoKElEYXRhTW9kZWxPcGVyYXRpb24pIG1vZGVsLmdldFByb3BlcnR5KEZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuTk9USUZJQ0FUSU9OX09QRVJBVElPTikpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9Ci0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjE0MWQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlIGV4dGVuZHMgSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9YTUxfVEVNUExBVEVfMTAJCT0gInJhcnRwMTAueG1sIjsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfWE1MX1RFTVBMQVRFXzE1CQk9ICJyYXJ0cDE1LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJSURhdGFNb2RlbCBtb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0KLQkJCS8vIEFzc29jaWF0ZSB3aXRoIGFuIEVBUiwgaWYgbmVjZXNzYXJ5LgotCi0JCQlmaW5hbCBTdHJpbmcgZWFyUHJvamVjdE5hbWUgPSAoU3RyaW5nKSBtb2RlbC5nZXRQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSk7Ci0JCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSKSkgewotCQkJCWlmIChlYXJQcm9qZWN0TmFtZSAhPSBudWxsICYmICFlYXJQcm9qZWN0TmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQlTdHJpbmcgdmVyID0gZnYuZ2V0VmVyc2lvblN0cmluZygpOwotCQkJCQlTdHJpbmcgajJlZVZlcnNpb25UZXh0ID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcKLQkJCQkJKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0Q29ubmVjdG9yVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXIpKTsKLQkJCQkJCi0JCQkJCWZpbmFsIFN0cmluZyBtb2R1bGVVUkkgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuTU9EVUxFX1VSSSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MKLSAgICAgICAgICAgICAgICAgICAgICAgID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSBtb2RlbC5nZXRQcm9wZXJ0eSggRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSApOwotCQkJCQkKLQkJCQkJaW5zdGFsbEFuZEFkZE1vZHVsZXRvRUFSKCBqMmVlVmVyc2lvblRleHQsCi0JCQkJCQkJCWVhclByb2plY3ROYW1lLAotCQkJCQkJCQlmcGp3Yy5nZXRQcmltYXJ5UnVudGltZSgpLAotCQkJCQkJCQlwcm9qZWN0LAotCQkJCQkJCQltb2R1bGVVUkksCi0JCQkJCQkJCW1vbml0b3IgKTsKLQotCi0JCQkJfQotCQkJfQotCi0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl9Ci0JCX0KLQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1YWIxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUHJlZmVyZW5jZXMuS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBDb25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxJUHJvamVjdEZhY2V0PiByZXF1aXJlZEZhY2V0cyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RGYWNldD4oKTsKLSAgICAgICAgcmVxdWlyZWRGYWNldHMuYWRkKEphdmFGYWNldFV0aWxzLkpBVkFfRkFDRVQpOwotICAgICAgICByZXF1aXJlZEZhY2V0cy5hZGQoSUoyRUVGYWNldENvbnN0YW50cy5KQ0FfRkFDRVQpOwotICAgICAgICBzZXRQcm9wZXJ0eShSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTiwgcmVxdWlyZWRGYWNldHMpOwotCQkKLQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApOwotCQlJRGF0YU1vZGVsIGphdmFGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChKYXZhRmFjZXRVdGlscy5KQVZBX0ZBQ0VULmdldElkKCkpOwotCQlJRGF0YU1vZGVsIGpjYUZhY2V0ID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKElKMkVFRmFjZXRDb25zdGFudHMuSkNBX0ZBQ0VULmdldElkKCkpOwotCQlTdHJpbmcgamNhUm9vdCA9IGpjYUZhY2V0LmdldFN0cmluZ1Byb3BlcnR5KElDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIpOwotCQlqYXZhRmFjZXQuc2V0UHJvcGVydHkoSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVJfTkFNRSwgamNhUm9vdCk7Ci0JCWphdmFGYWNldC5zZXRQcm9wZXJ0eShJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuREVGQVVMVF9PVVRQVVRfRk9MREVSX05BTUUsIAotCQkJCUoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFN0cmluZyhLZXlzLkpDQV9PVVRQVVRfRk9MREVSKSApOwotCQkKLQkJamNhRmFjZXQuYWRkTGlzdGVuZXIobmV3IElEYXRhTW9kZWxMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJCWlmIChJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCWlmIChpc1Byb3BlcnR5U2V0KEVBUl9QUk9KRUNUX05BTUUpKQotCQkJCQkJc2V0UHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEVBUl9QUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJCX1lbHNlIGlmIChJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCXNldFByb3BlcnR5KEFERF9UT19FQVIsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7CQotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBNT0RVTEVfVVJJICkpewotCQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApOwotCQkJSURhdGFNb2RlbCByYXJGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbCggSUoyRUVGYWNldENvbnN0YW50cy5KQ0EgKTsJCi0JCQlyYXJGYWNldC5zZXRQcm9wZXJ0eSggSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkksIHByb3BlcnR5VmFsdWUgKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0lDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvSUNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwMTQwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvSUNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gZXh0ZW5kcyBJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5jbGFzczsgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvcmFydHAxMC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvcmFydHAxMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNWJjOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L3JhcnRwMTAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBjb25uZWN0b3IgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgQ29ubmVjdG9yIDEuMC8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9jb25uZWN0b3JfMV8wLmR0ZCI+Ci08Y29ubmVjdG9yPgotCTxkaXNwbGF5LW5hbWU+PC9kaXNwbGF5LW5hbWU+Ci0JPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0gCTx2ZW5kb3ItbmFtZT48L3ZlbmRvci1uYW1lPgotICAJPHNwZWMtdmVyc2lvbj48L3NwZWMtdmVyc2lvbj4KLSAgCTxlaXMtdHlwZT48L2Vpcy10eXBlPgotICAJPHZlcnNpb24+PC92ZXJzaW9uPgotICAJPGxpY2Vuc2U+Ci0gIAkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+ICAgCi0gICAgCTxsaWNlbnNlLXJlcXVpcmVkPmZhbHNlPC9saWNlbnNlLXJlcXVpcmVkPiAgIAotICAgIDwvbGljZW5zZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAJPHJlc291cmNlYWRhcHRlcj4KLSAgCQk8bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPjwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAJCTxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+PC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0gICAgCTxjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPjwvY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz4KLSAgICAJPGNvbm5lY3Rpb24taW50ZXJmYWNlPjwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0gICAgCTxjb25uZWN0aW9uLWltcGwtY2xhc3M+PC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0gICAgCTx0cmFuc2FjdGlvbi1zdXBwb3J0PjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLSAgCQk8Y29uZmlnLXByb3BlcnR5PgotICAgICAJCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotICAgICAgCQk8Y29uZmlnLXByb3BlcnR5LW5hbWU+PC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgIAkJPGNvbmZpZy1wcm9wZXJ0eS10eXBlPjwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAJCTxjb25maWctcHJvcGVydHktdmFsdWU+PC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgCSA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAJPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgIAkgCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotICAgICAgCSAJPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPjwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgIAkgCTxjcmVkZW50aWFsLWludGVyZmFjZT48L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgIAk8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAJPHJlYXV0aGVudGljYXRpb24tc3VwcG9ydD5mYWxzZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotICAgIAk8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAJCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotICAgIAkJPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgIAkJPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgCTwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgCTwvcmVzb3VyY2VhZGFwdGVyPgotPC9jb25uZWN0b3I+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvcmFydHAxNS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvcmFydHAxNS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOTU2MWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L3JhcnRwMTUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb25uZWN0b3IgaWQ9IkNvbm5lY3Rvcl9JRCIgdmVyc2lvbj0iMS41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvY29ubmVjdG9yXzFfNS54c2QiPiAKLQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLQk8ZGlzcGxheS1uYW1lPjwvZGlzcGxheS1uYW1lPgotIAk8dmVuZG9yLW5hbWU+PC92ZW5kb3ItbmFtZT4KLSAgCTxlaXMtdHlwZT48L2Vpcy10eXBlPgotICAJPHJlc291cmNlYWRhcHRlci12ZXJzaW9uPjwvcmVzb3VyY2VhZGFwdGVyLXZlcnNpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAJPHJlc291cmNlYWRhcHRlcj4KLSAgCTwvcmVzb3VyY2VhZGFwdGVyPgotPC9jb25uZWN0b3I+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9hcmNoaXZlL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9hcmNoaXZlL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZmYzZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkFwcENsaWVudEFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkoyRUVBcnRpZmFjdEV4cG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRPcGVyYXRpb24gZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRPcGVyYXRpb24gewotCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4cG9ydCgpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgRVhQT1JUX1dPUkspOwotCQl0cnkgewotCQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgY2FmID0gKChDb21tb25hcmNoaXZlUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSkpLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JCQlDb25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxzID0gbmV3IENvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwoZ2V0Q29tcG9uZW50KCkpOwotCQkJbHMuc2V0RXhwb3J0U291cmNlKGlzRXhwb3J0U291cmNlKCkpOwotCQkJc2V0TW9kdWxlRmlsZShjYWYub3BlblJBUkZpbGUobHMsIGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSkpOwotCQkJbHMuc2V0UHJvZ3Jlc3NNb25pdG9yKHN1Yk1vbml0b3IpOwotCQkJZ2V0TW9kdWxlRmlsZSgpLnNhdmVBc05vUmVvcGVuKGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKFNhdmVGYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBleDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihBcHBDbGllbnRBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLkFSQ0hJVkVfT1BFUkFUSU9OX09wZW5pbmdBcmNoaXZlLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN1Yk1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBhcmNoaXZlU3RyaW5nKCkgewotCQkvL1RPRE8gZmlsbCBpbiBzdHJpbmcKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMjIzN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkNvbXBvbmVudExvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLkNvbm5lY3RvckFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbnRhaW5lcjsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIHsKLQotCXByaXZhdGUgaW50IGRvdEphdmFMZW5ndGggPSBBcmNoaXZlVXRpbC5ET1RfSkFWQS5sZW5ndGgoKTsKLQlwcml2YXRlIExpc3QgYWxyZWFkeUluZGV4ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBNYXAgY2xhc3Nlc01hcDsKLQlwcml2YXRlIElGaWxlIGtub3duREQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGtub3duTGliRXh0ZW5zaW9ucyA9IHsiLmphciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiLnppcCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiLnNvIiwgLy8kTk9OLU5MUy0xJAotCQkJCSIubyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiLnNsIiwgLy8kTk9OLU5MUy0xJAotCQkJCSIuZGxsIiwgLy8kTk9OLU5MUy0xJAotCX07Ci0KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50KSB7Ci0JCXRoaXModkNvbXBvbmVudCwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHsKLQkJc3VwZXIodkNvbXBvbmVudCwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwkJCi0JCWtub3duREQgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSkuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGaWxlcygpIHsKLQkJYWRkTmVzdGVkSkFSc0Zyb21Tb3VyY2VSb290cygpOwotCQlhZ2dyZWdhdGVTb3VyY2VGaWxlcygpOwotCQlyZXR1cm4gZmlsZXNIb2xkZXIuZ2V0RmlsZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTmVzdGVkSkFSc0Zyb21Tb3VyY2VSb290cygpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VSb290cyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUNvbnRhaW5lcnModkNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlOwotCQkJdHJ5IHsKLQkJCQlhRmlsZSA9IGdldE5lc3RlZEphcihzb3VyY2VSb290c1tpXSk7Ci0JCQkJaWYgKG51bGwgIT0gYUZpbGUpIHsKLQkJCQkJZmlsZXNIb2xkZXIuYWRkRmlsZShhRmlsZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCi0JcHJpdmF0ZSBGaWxlIGdldE5lc3RlZEphcihJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VSb290KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggb3V0cHV0UGF0aCA9IHNvdXJjZVJvb3QuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKS5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQlpZiAob3V0cHV0UGF0aCA9PSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gdkNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCQl0cnkgewotCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJb3V0cHV0UGF0aCA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQkJaWYgKG91dHB1dFBhdGggPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJSUZvbGRlciBqYXZhT3V0cHV0Rm9sZGVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIob3V0cHV0UGF0aCk7Ci0JCWluZGV4Q2xhc3Nlc0Zvck91dHB1dEZvbGRlcihqYXZhT3V0cHV0Rm9sZGVyKTsKLQkJSUNvbnRhaW5lciBzb3VyY2VDb250YWluZXIgPSAoSUNvbnRhaW5lcikgc291cmNlUm9vdC5nZXRSZXNvdXJjZSgpOwotCi0JCWludCBzb3VyY2VDb250YWluZXJTZWdtZW50Q291bnQgPSBzb3VyY2VDb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnNlZ21lbnRDb3VudCgpOwotCQlib29sZWFuIGlzTW9kdWxlUm9vdCA9IGtub3duREQuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChzb3VyY2VDb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQlTZXQgaUZpbGVzU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJYm9vbGVhbiBmb3VuZEphdmEgPSBnYXRoZXJGaWxlc0ZvckpBUihpRmlsZXNTZXQsIHNvdXJjZUNvbnRhaW5lciwgaXNNb2R1bGVSb290LCBmYWxzZSwgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KTsKLQkJaWYgKCFpc01vZHVsZVJvb3QgfHwgZm91bmRKYXZhKSB7Ci0JCQlMaXN0IGlGaWxlc0xpc3QgPSBDb2xsZWN0aW9ucy5saXN0KENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKGlGaWxlc1NldCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpRmlsZXNMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJZmlsZXNIb2xkZXIucmVtb3ZlSUZpbGUoKElGaWxlKSBpRmlsZXNMaXN0LmdldChpKSk7Ci0JCQl9Ci0JCQlGaWxlIG5lc3RlZEFyY2hpdmUgPSBjcmVhdGVOZXN0ZWRBcmNoaXZlKGlGaWxlc0xpc3QsIHNvdXJjZUNvbnRhaW5lciwgamF2YU91dHB1dEZvbGRlcik7Ci0JCQlyZXR1cm4gbmVzdGVkQXJjaGl2ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2F0aGVyRmlsZXNGb3JKQVIoQ29sbGVjdGlvbiBpRmlsZXMsIElDb250YWluZXIgY3VycmVudCwgYm9vbGVhbiBpc01vZHVsZVJvb3QsIGJvb2xlYW4gZm91bmRKYXZhLCBpbnQgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KSB7Ci0JCUlSZXNvdXJjZVtdIG1lbWJlcnM7Ci0JCXRyeSB7Ci0JCQltZW1iZXJzID0gY3VycmVudC5tZW1iZXJzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY29yZSkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKGNvcmUpOwotCQl9Ci0JCQotCQlJQ29udGFpbmVyIGRkRm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKEoyRUVDb25zdGFudHMuTUVUQV9JTkYpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlcyA9IG1lbWJlcnNbaV07Ci0JCQlpZiAocmVzLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQkJaWYgKCFkZEZvbGRlci5lcXVhbHMocmVzKSkgey8vaWYgaXQncyBub3QgdGhlIGRkIGZvbGRlcgotCQkJCQlmb3VuZEphdmEgPSBnYXRoZXJGaWxlc0ZvckpBUihpRmlsZXMsIChJRm9sZGVyKSByZXMsIGlzTW9kdWxlUm9vdCwgZm91bmRKYXZhLCBzb3VyY2VDb250YWluZXJTZWdtZW50Q291bnQpIHx8IGZvdW5kSmF2YTsKLQkJCQl9Ci0JCQl9IGVsc2Ugey8vIGl0IG11c3QgYmUgYSBmaWxlCi0JCQkJSUZpbGUgc3JjRmlsZSA9IChJRmlsZSkgcmVzOwotCQkJCWlmIChiZWxvbmdzSW5OZXN0ZWRKQVIoc3JjRmlsZSwgaXNNb2R1bGVSb290KSkgewotCQkJCQlpZiAoaXNKYXZhKHNyY0ZpbGUpKSB7Ci0JCQkJCQlpZiAoZXhwb3J0U291cmNlKSB7Ci0JCQkJCQkJaUZpbGVzLmFkZChzcmNGaWxlKTsgLy9kb24ndCBuZWVkIHRvIGNoZWNrIGR1cGxpY2F0ZXMgaGVyZQotCQkJCQkJfQotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHNyY0ZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KS50b1N0cmluZygpOwotCQkJCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUubGVuZ3RoKCkgLSBkb3RKYXZhTGVuZ3RoKTsKLQkJCQkJCUxpc3QgY2xhc3NlcyA9IHJldHJpZXZlQ2xhc3NlcyhjbGFzc05hbWUpOwotCQkJCQkJaWYgKG51bGwgIT0gY2xhc3NlcykgewotCQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY2xhc3Nlcy5pdGVyYXRvcigpOwotCQkJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJSUZpbGUgY2xhenogPSAoSUZpbGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYoIWlGaWxlcy5jb250YWlucyhjbGF6eikpewotCQkJCQkJCQkJLy8uY2xhc3MgbmVlZCB0byBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCQkJCQlpRmlsZXMuYWRkKGNsYXp6KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZighaUZpbGVzLmNvbnRhaW5zKHNyY0ZpbGUpKXsKLQkJCQkJCQkvL2lmIGl0J3Mgbm90IHNyYywgdGhlbiBpdCBjb3VsZCBiZSAuY2xhc3MgYW5kIG5lZWQgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCQkJCWlGaWxlcy5hZGQoc3JjRmlsZSk7Ci0JCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoaXNNb2R1bGVSb290KQotCQkJCQkJZm91bmRKYXZhID0gZm91bmRKYXZhIHx8IGlzSmF2YShzcmNGaWxlKSB8fCBpc0NsYXNzKHNyY0ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZm91bmRKYXZhOwotCX0KLQotCXByaXZhdGUgRmlsZSBjcmVhdGVOZXN0ZWRBcmNoaXZlKExpc3QgZmlsZXMsIElDb250YWluZXIgc291cmNlQ29udGFpbmVyLCBJRm9sZGVyIGphdmFPdXRwdXRGb2xkZXIpIHsKLQkJQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSTG9hZFN0cmF0ZWd5SW1wbCBsb2FkZXIgPSBuZXcgQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSTG9hZFN0cmF0ZWd5SW1wbChmaWxlcywgc291cmNlQ29udGFpbmVyLCBqYXZhT3V0cHV0Rm9sZGVyKTsKLQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9ICgoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCkpLmdldE9wdGlvbnMoKS5jbG9uZVdpdGgobG9hZGVyKTsKLQkJU3RyaW5nIHVyaSA9IGNvbXB1dGVVbmlxdWVBcmNoaXZlVVJJKHNvdXJjZUNvbnRhaW5lcik7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5wcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlVW5pcXVlQXJjaGl2ZVVSSShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaW50IGluY3JlbWVudCA9IDA7Ci0JCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBudWxsOwotCQlkbyB7Ci0JCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZS5sZW5ndGgoKSArIDUpOwotCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQlzYi5hcHBlbmQobmFtZSk7Ci0JCQlpZiAoaW5jcmVtZW50ID4gMCkKLQkJCQlzYi5hcHBlbmQoaW5jcmVtZW50KTsKLQkJCXNiLmFwcGVuZCgiLmphciIpOyAvLyROT04tTkxTLTEkCi0JCQlpbmNyZW1lbnQrKzsKLQkJfSB3aGlsZSAoZmlsZXNIb2xkZXIuY29udGFpbnMoc2IudG9TdHJpbmcoKSkpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmVsb25nc0luTmVzdGVkSkFSKElGaWxlIGlGaWxlLCBib29sZWFuIGlzTW9kdWxlUm9vdCkgewotCQlpZiAoaXNNb2R1bGVSb290ICYmIGlzRGVwbG95bWVudERlc2NyaXB0b3IoaUZpbGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrbm93bkxpYkV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChoYXNFeHRlbnNpb24oaUZpbGUsIGtub3duTGliRXh0ZW5zaW9uc1tpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkgewotCQlpZihhcnRpZmFjdEVkaXQgPT0gbnVsbCl7Ci0JCQlhcnRpZmFjdEVkaXQgPSBDb25uZWN0b3JBcnRpZmFjdEVkaXQuZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZCh2Q29tcG9uZW50KTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluY2x1ZGUoSVZpcnR1YWxDb250YWluZXIgdkNvbnRhaW5lcikgewotCQlib29sZWFuIGlzRERGb2xkZXIgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoSjJFRUNvbnN0YW50cy5NRVRBX0lORikuZXF1YWxzKHZDb250YWluZXIpOwotCQlyZXR1cm4gaXNEREZvbGRlciB8fCAhaW5KYXZhU3JjKHZDb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuICFoYXNFeHRlbnNpb24odXJpLCBBcmNoaXZlVXRpbC5ET1RfQ0xBU1MpICYmICFoYXNFeHRlbnNpb24odXJpLCBBcmNoaXZlVXRpbC5ET1RfSkFWQSk7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhbGwgdGhlIC5jbGFzcyBmaWxlcyBhbmQgaW5kZXggdGhlbSBzbyBpbm5lciBjbGFzc2VzIGNhbiBiZSBsb2NhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRleENsYXNzZXNGb3JPdXRwdXRGb2xkZXIoSUZvbGRlciBqYXZhT3V0cHV0Rm9sZGVyKSB7Ci0JCWlmIChudWxsID09IGphdmFPdXRwdXRGb2xkZXIgfHwgYWxyZWFkeUluZGV4ZWQuY29udGFpbnMoamF2YU91dHB1dEZvbGRlcikpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhbHJlYWR5SW5kZXhlZC5hZGQoamF2YU91dHB1dEZvbGRlcik7Ci0JCWludCBzZWdtZW50Q291bnQgPSBqYXZhT3V0cHV0Rm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKTsKLQkJaW5kZXhDbGFzc2VzKGphdmFPdXRwdXRGb2xkZXIsIHNlZ21lbnRDb3VudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluZGV4Q2xhc3NlcyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBqYXZhT3V0cHV0U2VnbWVudENvdW50KSB7Ci0JCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQlpbmRleENsYXNzKChJRmlsZSkgcmVzb3VyY2UsIGphdmFPdXRwdXRTZWdtZW50Q291bnQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQl0cnkgewotCQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gKChJRm9sZGVyKSByZXNvdXJjZSkubWVtYmVycygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWluZGV4Q2xhc3NlcyhtZW1iZXJzW2ldLCBqYXZhT3V0cHV0U2VnbWVudENvdW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluZGV4Q2xhc3MoSUZpbGUgaUZpbGUsIGludCBqYXZhT3V0cHV0U2VnbWVudENvdW50KSB7Ci0JCWlmICghaXNDbGFzcyhpRmlsZSkpCi0JCQlyZXR1cm47Ci0JCWlmIChjbGFzc2VzTWFwID09IG51bGwpCi0JCQljbGFzc2VzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nIG5hbWUgPSBpRmlsZS5nZXROYW1lKCk7Ci0JCUlQYXRoIHJlbFBhdGggPSBpRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhqYXZhT3V0cHV0U2VnbWVudENvdW50KTsKLQkJU3RyaW5nIGtleSA9IHJlbFBhdGgudG9TdHJpbmcoKTsKLQkJaWYgKG5hbWUuaW5kZXhPZignJCcpICE9IC0xKSB7Ci0JCQlrZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCckJykpOwotCQl9IGVsc2UgewotCQkJa2V5ID0ga2V5LnN1YnN0cmluZygwLCBrZXkuaW5kZXhPZignLicpKTsKLQkJfQotCQlMaXN0IGlubmVycyA9IChMaXN0KSBjbGFzc2VzTWFwLmdldChrZXkpOwotCQlpZiAoaW5uZXJzID09IG51bGwpIHsKLQkJCWlubmVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQljbGFzc2VzTWFwLnB1dChrZXksIGlubmVycyk7Ci0JCX0KLQkJaW5uZXJzLmFkZChpRmlsZSk7Ci0JfQotCi0JcHVibGljIExpc3QgcmV0cmlldmVDbGFzc2VzKFN0cmluZyBrZXkpIHsKLQkJaWYgKGNsYXNzZXNNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKExpc3QpIGNsYXNzZXNNYXAuZ2V0KGtleSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YShJRmlsZSBpRmlsZSkgewotCQlyZXR1cm4gaGFzRXh0ZW5zaW9uKGlGaWxlLCBBcmNoaXZlVXRpbC5ET1RfSkFWQSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3MoSUZpbGUgaUZpbGUpIHsKLQkJcmV0dXJuIGhhc0V4dGVuc2lvbihpRmlsZSwgQXJjaGl2ZVV0aWwuRE9UX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0V4dGVuc2lvbihJRmlsZSBpRmlsZSwgU3RyaW5nIGV4dCkgewotCQlTdHJpbmcgbmFtZSA9IGlGaWxlLmdldE5hbWUoKTsKLQkJcmV0dXJuIGhhc0V4dGVuc2lvbihuYW1lLCBleHQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0KSB7Ci0JCWludCBvZmZzZXQgPSBleHQubGVuZ3RoKCk7Ci0JCXJldHVybiBuYW1lLnJlZ2lvbk1hdGNoZXModHJ1ZSwgbmFtZS5sZW5ndGgoKSAtIG9mZnNldCwgZXh0LCAwLCBvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yKElGaWxlIGlGaWxlKSB7Ci0JCXJldHVybiBrbm93bkRELmVxdWFscyhpRmlsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDQ1MGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3lJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgTG9hZFN0cmF0ZWd5SW1wbCB7Ci0KLQlwcml2YXRlIExpc3QgZmlsZXM7Ci0JcHJpdmF0ZSBpbnQgc291cmNlU2VnbWVudENvdW50OwotCXByaXZhdGUgaW50IG91dHB1dFNlZ21lbnRDb3VudDsKLQlwcml2YXRlIE1hcCB1cmlzVG9JRmlsZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTmVzdGVkSkFSTG9hZFN0cmF0ZWd5SW1wbC4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSTG9hZFN0cmF0ZWd5SW1wbChMaXN0IGZpbGVzLCBJQ29udGFpbmVyIHNvdXJjZUNvbnRhaW5lciwgSUZvbGRlciBqYXZhT3V0cHV0Rm9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZmlsZXMgPSBmaWxlczsKLQkJc291cmNlU2VnbWVudENvdW50ID0gc291cmNlQ29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKTsKLQkJb3V0cHV0U2VnbWVudENvdW50ID0gamF2YU91dHB1dEZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbCNwcmltQ29udGFpbnMoU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhTdHJpbmcgdXJpKSB7Ci0JCS8vIFNob3VsZCBvbmx5IGJlIHVzZWQgYnkgZGlzY3JpbWluYXRvcnMsIGFuZCB3ZSBkb24ndCBkaXNjcmltaW5hdGUgdGhlc2UgYXJjaGl2ZXMKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbCNnZXRGaWxlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RmlsZXMoKSB7Ci0JCXVyaXNUb0lGaWxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgc2l6ZSA9IGZpbGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlGaWxlIGlGaWxlID0gKElGaWxlKSBmaWxlcy5nZXQoaSk7Ci0JCQlJUGF0aCByZWxQYXRoOwotCQkJaWYoQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5pc0NsYXNzKGlGaWxlKSl7Ci0JCQkJcmVsUGF0aCA9IGdldFJlbGF0aXZlUGF0aChpRmlsZSwgb3V0cHV0U2VnbWVudENvdW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVsUGF0aCA9IGdldFJlbGF0aXZlUGF0aChpRmlsZSwgc291cmNlU2VnbWVudENvdW50KTsKLQkJCX0KLQkJCWFkZEZpbGUoaUZpbGUsIHJlbFBhdGgsIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWxlKElGaWxlIGlGaWxlLCBJUGF0aCByZWxQYXRoLCBMaXN0IHJlc3VsdCkgewotCQlGaWxlIGNGaWxlID0gY3JlYXRlRmlsZShpRmlsZSwgcmVsUGF0aCk7Ci0JCXJlc3VsdC5hZGQoY0ZpbGUpOwotCQl1cmlzVG9JRmlsZXMucHV0KGNGaWxlLmdldFVSSSgpLCBpRmlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKElSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGFSZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCX0KLQotCXByaXZhdGUgRmlsZSBjcmVhdGVGaWxlKElGaWxlIGlGaWxlLCBJUGF0aCByZWxQYXRoKSB7Ci0JCUZpbGUgY0ZpbGUgPSBjcmVhdGVGaWxlKHJlbFBhdGgudG9TdHJpbmcoKSk7Ci0JCWNGaWxlLnNldExhc3RNb2RpZmllZChnZXRMYXN0TW9kaWZpZWQoaUZpbGUpKTsKLQkJcmV0dXJuIGNGaWxlOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0UmVsYXRpdmVQYXRoKElGaWxlIGZpbGUsIGludCBwYXJlbnRTZWdtZW50Q291bnQpIHsKLQkJcmV0dXJuIGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMocGFyZW50U2VnbWVudENvdW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5I2dldElucHV0U3RyZWFtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAobnVsbCA9PSB1cmlzVG9JRmlsZXMpIHsKLQkJCWdldEZpbGVzKCk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgdXJpc1RvSUZpbGVzLmdldCh1cmkpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNvcmUpIHsKLQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24odXJpLCBjb3JlKTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHVyaSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQWN0aXZhdGlvblNwZWNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NThkNDA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWN0aXZhdGlvblNwZWN9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBY3RpdmF0aW9uU3BlY0NsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBY3RpdmF0aW9uIFNwZWMgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aXZhdGlvblNwZWNDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQWN0aXZhdGlvblNwZWNfYWN0aXZhdGlvblNwZWNDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3RpdmF0aW9uU3BlY19hY3RpdmF0aW9uU3BlY0NsYXNzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2YXRpb25TcGVjX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvblNwZWNDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvblNwZWNfUmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZhdGlvblNwZWMuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9BY3RpdmF0aW9uU3BlYyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChBY3RpdmF0aW9uU3BlYykgb2JqZWN0KS5nZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBKQ0FSZXNvdXJjZUhhbmRsZXIuX1VJX0FjdGl2YXRpb25TcGVjX3R5cGUgOiAKLQkJCQkJSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9BY3RpdmF0aW9uU3BlY190eXBlICsgIiAiICsgbGFiZWw7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2YXRpb25TcGVjLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUSUVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQkvL3JldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQWRtaW5PYmplY3RJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BZG1pbk9iamVjdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGIwY2FkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BZG1pbk9iamVjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWRtaW5PYmplY3R9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFkbWluT2JqZWN0SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZG1pbk9iamVjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBZG1pbk9iamVjdEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWRtaW5PYmplY3RDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWRtaW4gT2JqZWN0IEludGVyZmFjZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZG1pbk9iamVjdEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQWRtaW5PYmplY3RfYWRtaW5PYmplY3RJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWRtaW5PYmplY3RfYWRtaW5PYmplY3RJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfQWRtaW5PYmplY3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdEludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWRtaW4gT2JqZWN0IENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFkbWluT2JqZWN0Q2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0FkbWluT2JqZWN0X2FkbWluT2JqZWN0Q2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWRtaW5PYmplY3RfYWRtaW5PYmplY3RDbGFzc19mZWF0dXJlIiwgIl9VSV9BZG1pbk9iamVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0Q2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBZG1pbk9iamVjdC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0FkbWluT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFkbWluT2JqZWN0KSBvYmplY3QpLmdldEFkbWluT2JqZWN0SW50ZXJmYWNlKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBKQ0FSZXNvdXJjZUhhbmRsZXIuX1VJX0FkbWluT2JqZWN0X3R5cGUgOiAKLQkJCQkJSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9BZG1pbk9iamVjdF90eXBlICsgIiAiICsgbGFiZWw7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFkbWluT2JqZWN0LmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfQ0xBU1MgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWRtaW5PYmplY3RfQ29uZmlnUHJvcGVydGllcygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25maWdQcm9wZXJ0eSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQkvL3JldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDg2MzE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIHRoZSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBmb3IgY29ubmVjdG9yIHByb2VqY3RzLgotICovCi1wdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIgZXh0ZW5kcyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gQWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5IC0gQWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZS4KLQkgKi8KLQlwdWJsaWMgQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlcgotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQXV0aGVudGljYXRpb25NZWNoYW5pc21Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ3JlZGVudGlhbEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ3VzdG9tQXV0aE1lY2hUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0aGVudGljYXRpb24gTWVjaGFuaXNtIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9mZWF0dXJlIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZSBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVfZmVhdHVyZSIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENyZWRlbnRpYWwgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENyZWRlbnRpYWxJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2NyZWRlbnRpYWxJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fY3JlZGVudGlhbEludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEN1c3RvbSBBdXRoIE1lY2ggVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21BdXRoTWVjaFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2N1c3RvbUF1dGhNZWNoVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9jdXN0b21BdXRoTWVjaFR5cGVfZmVhdHVyZSIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DdXN0b21BdXRoTWVjaFR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JLyoKLQkgKiBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsgaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkgKiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JICogCi0JICogQXV0aGVudGljYXRpb25NZWNoYW5pc20gZl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA9ICgoQXV0aGVudGljYXRpb25NZWNoYW5pc20pb2JqZWN0KTsKLQkgKiBKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOzsgLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiRGVzY3JpcHRpb24iLCAiVGhlCi0JICogZGVzY3JpcHRpb24gcHJvcGVydHkgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSIsCi0JICogcGtnLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUKLQkgKiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJBdXRoZW50aWNhdGlvbgotCSAqIE1lY2hhbmlzbSBUeXBlIiwgIlRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gdHlwZSBwcm9wZXJ0eSBvZiB0aGUgYXV0aGVudGljYXRpb24KLQkgKiBtZWNoYW5pc20iLCBwa2cuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBjcmVkZW50aWFsSW50ZXJmYWNlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiQ3JlZGVudGlhbCBJbnRlcmZhY2UiLAotCSAqICJUaGUgY3JlZGVudGlhbCBpbnRlcmZhY2UgcHJvcGVydHkgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSIsCi0JICogcGtnLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsKLQkgKiAKLQkgKiB9Ly8gaWYgcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOyB9Ly8gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycwotCSAqLwotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfS8vIGdldFBhcmVudAotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9hdXRoX21lY2hhbmlzbV9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJQXV0aGVudGljYXRpb25NZWNoYW5pc20gYXV0aGVudGljYXRpb25NZWNoYW5pc20gPSAoKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKSBvYmplY3QpOwotCQlyZXR1cm4gIkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtICIgKyBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5nZXREZXNjcmlwdGlvbigpOyAvLyROT04tTkxTLTEkCi0JfS8vIGdldFRleHQKLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DUkVERU5USUFMX0lOVEVSRkFDRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBOb3RpZmllcgotCSAqICAgICAgICAgICAgbm90aWZpZXIgLSBOb3RpZmllcyBvZiBjaGFuZ2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgZXZlbnRUeXBlIC0gVGhlIGV2ZW50IHR5cGUuCi0JICogQHBhcmFtIEVPYmplY3QKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgLSBUaGUgcmVmZXJlbmNlIG9iamVjdC4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvbGRWYWx1ZSAtIFRoZSBvbGQgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBuZXdWYWx1ZSAtIFRoZSBuZXcgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBpbmRleCAtIFRoZSBjdXJyZW50IG9mIHRoZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgRU9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7Ci0JCUpjYVBhY2thZ2UgcGtnID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCU5vdGlmaWNhdGlvbiBtc2cgPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCkgbm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZS5lQ29udGFpbm1lbnRGZWF0dXJlKCksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotCQlpZiAoZmVhdHVyZSA9PSBwa2cuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb24oKSB8fCBmZWF0dXJlID09IHBrZy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCkpIHsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0vLyBpZgotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfS8vIG5vdGlmeUNoYW5nZWQKLQotfS8vIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2NhZDA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIENvbmZpZyBwcm9wZXJ0eSBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIEFkYXB0IGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBDb25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcgotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25maWdQcm9wZXJ0eV9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25maWdQcm9wZXJ0eV9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9Db25maWdQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0NvbmZpZ1Byb3BlcnR5X25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uZmlnUHJvcGVydHlfbmFtZV9mZWF0dXJlIiwgIl9VSV9Db25maWdQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X05hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29uZmlnUHJvcGVydHlfdHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25maWdQcm9wZXJ0eV90eXBlX2ZlYXR1cmUiLCAiX1VJX0NvbmZpZ1Byb3BlcnR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFsdWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0NvbmZpZ1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbmZpZ1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX0NvbmZpZ1Byb3BlcnR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfVmFsdWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCS8qCi0JICogcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7IGlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JICogc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCSAqIAotCSAqIENvbmZpZ1Byb3BlcnR5IGZfY29uZmlnUHJvcGVydHkgPSAoKENvbmZpZ1Byb3BlcnR5KW9iamVjdCk7IEpjYVBhY2thZ2UgcGtnID0KLQkgKiBKY2FQYWNrYWdlLmVJTlNUQU5DRTs7IC8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkgKiAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRlc2NyaXB0aW9uIiwgIlRoZQotCSAqIGRlc2NyaXB0aW9uIHByb3BlcnR5IG9mIHRoZSBjb25maWcgcHJvcGVydHkiLCBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIG5hbWUgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJOYW1lIiwgIlRoZSBuYW1lCi0JICogcHJvcGVydHkgb2YgdGhlIGNvbmZpZyBwcm9wZXJ0eSIsIHBrZy5nZXRDb25maWdQcm9wZXJ0eV9OYW1lKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSB0eXBlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiVHlwZSIsICJUaGUgdHlwZQotCSAqIHByb3BlcnR5IG9mIHRoZSBjb25maWcgcHJvcGVydHkiLCBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgdmFsdWUgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJWYWx1ZSIsICJUaGUgdmFsdWUKLQkgKiBwcm9wZXJ0eSBvZiB0aGUgY29uZmlnIHByb3BlcnR5IiwgcGtnLmdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7Ci0JICogCi0JICogfS8vIGlmIHJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsgfS8vIGdldFByb3BlcnR5RGVzY3JpcHRvcnMKLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgQ29uZmlnUHJvcGVydHkuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ly8gZ2V0UGFyZW50Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29uZmlnUHJvcGVydHkuZ2lmLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9jb25maWdfcHJvcF9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRleHQgYmFzZSBvbiB0aGUgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIG9iamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbmZpZ1Byb3BlcnR5IGNvbmZpZ1Byb3BlcnR5ID0gKChDb25maWdQcm9wZXJ0eSkgb2JqZWN0KTsKLQkJaWYgKGNvbmZpZ1Byb3BlcnR5LmdldE5hbWUoKSA9PSBudWxsKQotCQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5Db25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcl9VSV8wOyAKLQkJcmV0dXJuICJDb25maWdQcm9wZXJ0eTogIiArIGNvbmZpZ1Byb3BlcnR5LmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRUZXh0Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29uZmlnUHJvcGVydHkuY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19OQU1FIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1RZUEUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVkFMVUUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBOb3RpZmllcgotCSAqICAgICAgICAgICAgbm90aWZpZXIgLSBOb3RpZmllcyBvZiBjaGFuZ2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgZXZlbnRUeXBlIC0gVGhlIGV2ZW50IHR5cGUuCi0JICogQHBhcmFtIEVPYmplY3QKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgLSBUaGUgcmVmZXJlbmNlIG9iamVjdC4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvbGRWYWx1ZSAtIFRoZSBvbGQgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBuZXdWYWx1ZSAtIFRoZSBuZXcgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBpbmRleCAtIFRoZSBjdXJyZW50IG9mIHRoZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgRU9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7Ci0JCUpjYVBhY2thZ2UgcGtnID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCU5vdGlmaWNhdGlvbiBtc2cgPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCkgbm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZS5lQ29udGFpbm1lbnRGZWF0dXJlKCksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotCQlpZiAoZmVhdHVyZSA9PSBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSB8fCBmZWF0dXJlID09IHBrZy5nZXRDb25maWdQcm9wZXJ0eV9OYW1lKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCkpIHsKLQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCXJldHVybjsKLQkJfS8vIGlmCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ly8gbm90aWZ5Q2hhbmdlZAotCi19Ly8gQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMDMxZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbn1vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkRlZmluaXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbm5lY3Rpb25JbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbm5lY3Rpb25JbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc19mZWF0dXJlIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzcyBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NfZmVhdHVyZSIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29ubmVjdGlvbkludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9jb25uZWN0aW9uSW50ZXJmYWNlX2ZlYXR1cmUiLCAiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBJbXBsIENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25JbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX2Nvbm5lY3Rpb25JbXBsQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkltcGxDbGFzc19mZWF0dXJlIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnRpZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb25uZWN0aW9uRGVmaW5pdGlvbi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0Nvbm5lY3Rpb25EZWZpbml0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb25uZWN0aW9uRGVmaW5pdGlvbikgb2JqZWN0KS5nZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIDogCi0JCQkJCUpDQVJlc291cmNlSGFuZGxlci5fVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZSArICIgIiArIGxhYmVsOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUSUVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnRpZXMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uZmlnUHJvcGVydHkoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJLy9yZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjgwZjc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEgQ29uZW5jdG9yIHByb2plY3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gQWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5IC0gQW4gYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBDb25uZWN0b3JJdGVtUHJvdmlkZXIKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVmVuZG9yTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3BlY1ZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVpc1R5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZlbmRvciBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZlbmRvck5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Nvbm5lY3Rvcl92ZW5kb3JOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Nvbm5lY3Rvcl92ZW5kb3JOYW1lX2ZlYXR1cmUiLCAiX1VJX0Nvbm5lY3Rvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTcGVjIFZlcnNpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY1ZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Nvbm5lY3Rvcl9zcGVjVmVyc2lvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0b3Jfc3BlY1ZlcnNpb25fZmVhdHVyZSIsICJfVUlfQ29ubmVjdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFaXMgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFaXNUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0b3JfZWlzVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0b3JfZWlzVHlwZV9mZWF0dXJlIiwgIl9VSV9Db25uZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfRWlzVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmVyc2lvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0b3JfdmVyc2lvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0b3JfdmVyc2lvbl9mZWF0dXJlIiwgIl9VSV9Db25uZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfVmVyc2lvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgY3VycmVudCBwcm9wZXJ0eQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCS8qCi0JICogcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JICogCi0JICogaWYoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeyBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JICogCi0JICogQ29ubmVjdG9yIGZfY29ubmVjdG9yID0gKChDb25uZWN0b3Ipb2JqZWN0KTsgSmNhUGFja2FnZSBwa2cgPSBKY2FQYWNrYWdlLmVJTlNUQU5DRTs7IC8vIFRoaXMKLQkgKiBpcyBmb3IgdGhlIGRpc3BsYXlOYW1lIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRpc3BsYXkgTmFtZSIsICJUaGUKLQkgKiBkaXNwbGF5IG5hbWUgcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfRGlzcGxheU5hbWUoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiRGVzY3JpcHRpb24iLCAiVGhlCi0JICogZGVzY3JpcHRpb24gcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfRGVzY3JpcHRpb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHNtYWxsSWNvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlNtYWxsIEljb24iLCAiVGhlCi0JICogc21hbGwgaWNvbiBwcm9wZXJ0eSBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9TbWFsbEljb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGxhcmdlSWNvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkxhcmdlIEljb24iLCAiVGhlCi0JICogbGFyZ2UgaWNvbiBwcm9wZXJ0eSBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9MYXJnZUljb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHZlbmRvck5hbWUgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJWZW5kb3IgTmFtZSIsICJUaGUKLQkgKiB2ZW5kb3IgbmFtZSBwcm9wZXJ0eSBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBzcGVjVmVyc2lvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlNwZWMgVmVyc2lvbiIsICJUaGUKLQkgKiBzcGVjIHZlcnNpb24gcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfU3BlY1ZlcnNpb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGVpc1R5cGUgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJFaXMgVHlwZSIsICJUaGUgZWlzCi0JICogdHlwZSBwcm9wZXJ0eSBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9FaXNUeXBlKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSB2ZXJzaW9uIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiVmVyc2lvbiIsICJUaGUgdmVyc2lvbgotCSAqIHByb3BlcnR5IG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX1ZlcnNpb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGxpY2Vuc2UgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJMaWNlbnNlIiwgIlRoZSBsaWNlbnNlCi0JICogb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfTGljZW5zZSgpLCBmYWxzZSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgcmVzb3VyY2VBZGFwdGVyCi0JICogZmVhdHVyZS4gLy8gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiUmVzb3VyY2UgQWRhcHRlciIsCi0JICogIlRoZSByZXNvdXJjZSBhZGFwdGVyIG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpLCBmYWxzZSkpOyB9Ci0JICogcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOyB9Ly8gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycwotCSAqLwotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuIHJlZmVyZW5jZXMuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gT2JqZWN0IHRvIGdldCBjaGlsZHJlbiByZWZlcmVuY2VzIG9mLgotCSAqIEByZXR1cm4gQ29sZWxjdGlvbgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9MaWNlbnNlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfUmVzb3VyY2VBZGFwdGVyKCkpOwotCQl9Ly8gaWYKLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ly8gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBDb25uZWN0b3IuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gT2JqZWN0IHRvIHJldHVybiB0aGUgcGFyZW50IG9mLgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ly8gZ2V0UGFyZW50Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29ubmVjdG9yLmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0IC0KLQkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBpbWFnZSBmb3IuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvY29ubmVjdGlvbl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0JLyoqCi0JICogR2V0IHRoZSBkaXNwbGF5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIG5hbWUgZm9yLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9ICgoQ29ubmVjdG9yKSBvYmplY3QpOwotCQlyZXR1cm4gIkNvbm5lY3RvciAiICsgY29ubmVjdG9yLmdldERpc3BsYXlOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0VGV4dAotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbm5lY3Rvci5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1NQRUNfVkVSU0lPTiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19FSVNfVFlQRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRVJTSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0UgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfTGljZW5zZSgpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaWNlbnNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfUmVzb3VyY2VBZGFwdGVyKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlQWRhcHRlcigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi19Ly8gQ29uZW5jdG9ySXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxMzEwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXJ9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9NZXNzYWdlQWRhcHRlcigpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGU7IAotCQkvL3JldHVybiBnZXRTdHJpbmcoIl9VSV9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZUFkYXB0ZXIoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQkJLy9yZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUVkaXRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FFZGl0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODdjYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FGYWN0b3J5SW1wbDsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgamNhIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIEpjYUVkaXRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEpjYUVkaXRQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgamNhIHBhY2thZ2UuCi0JICovCi0JcHJvdGVjdGVkIEpjYVBhY2thZ2UgamNhUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEpjYUVkaXRQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlzdXBlcihkZXNjcmlwdG9yKTsKLQotCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgotCQkvLwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgb25lIGpjYSBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBKY2FQYWNrYWdlIGdldEpjYVBhY2thZ2UoKSB7Ci0JCXJldHVybiBqY2FQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgb25lIGpjYSBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBKY2FGYWN0b3J5IGdldEpjYUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSmNhRmFjdG9yeSkgamNhUGFja2FnZS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogRG8gaW5pdGlhbGl6YXRpb24gc3R1ZmYgaGVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5zdGFydHVwKCk7Ci0JCWpjYVBhY2thZ2UgPSBKY2FGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBKY2FFZGl0UGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKGdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCksICJpY29ucy8iICsga2V5ICsgIi5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIGxvYWQgaW1hZ2UgZm9yICciICsga2V5ICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSB0cmFuc2xhdGVkIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcigpLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aXRoIGFuIG9iamVjdCBzdWJzdGl0dXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgbmV3IE9iamVjdFtde3MxfSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aXRoIHR3byBvYmplY3Qgc3Vic3RpdHV0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMSwgczJ9KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSB0cmFuc2xhdGVkIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUsIHdpdGggdGhyZWUgb2JqZWN0IHN1YnN0aXR1dGlvbnMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxLCBPYmplY3QgczIsIE9iamVjdCBzMykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMSwgczIsIHMzfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUl0ZW1Qcm92aWRlckFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDA2N2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUl0ZW1Qcm92aWRlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBleHRlbmRlZCBpdGVtIHByb3ZpZGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIENyZWF0ZUNoaWxkQ29tbWFuZH0KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFRoZSBjb21tYW5kcyBhcmUgaW1wbGVtZW50ZWQgdW5pZm9ybWx5IG9uIGFsbCBvdXIgaXRlbSBhZGFwdGVycyB1c2luZyB0aGlzIGNvbW1vbiBiYXNlIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgSmNhSXRlbVByb3ZpZGVyQWRhcHRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgewotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgcGFja2FnZSBmb3IgdGhlIGpjYSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEpjYVBhY2thZ2UgamNhUGFja2FnZSA9IChKY2FQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgZmFjdG9yeSBmb3IgdGhlIGpjYSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEpjYUZhY3RvcnkgamNhRmFjdG9yeSA9IGpjYVBhY2thZ2UuZ2V0SmNhRmFjdG9yeSgpOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYW4gYWRhcHRlciBmYWN0b3J5IGFuZCBhIGRvbWFpbiBub3RpZmllci4KLQkgKi8KLQlwcm90ZWN0ZWQgSmNhSXRlbVByb3ZpZGVyQWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfS8vIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyB0aGUgc3VwcG9ydGVkIGNvbW1hbmRzLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIEBwYXJhbSBFZGl0aW5nRG9tYWluIC0KLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGVkaXRpbmcgZG9tYWluLgotCSAqIEBwYXJhbSBjb21tYW5kQ2xhc3MgLQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29tbWFuZCBjbGFzcy4KLQkgKiBAcGFyYW0gY29tbWFuZFBhcmFtZXRlciAtCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb21tYW5kUGFyYW1ldGVyLgotCSAqIEByZXR1cm4gQ29tbWFuZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGVkaXRpbmdEb21haW4sIGNvbW1hbmRDbGFzcywgY29tbWFuZFBhcmFtZXRlcik7Ci0JfS8vIGNyZWF0ZUNvbW1hbmQKLQotfS8vIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODQ1MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnV0aWwuSmNhQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0Ci0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJ9cy4gVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYKLSAqIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMKLSAqIGFsc28gc3VwcG9ydCBwcm9wZXJ0eSBzaGVldHMsIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllc30uIE5vdGUgdGhhdCBtb3N0IG9mIHRoZQotICogYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEpjYUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBJQ2hhbmdlTm90aWZpZXIuCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IGlzRmFjdG9yeUZvclR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSmNhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ly8gSmNhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCBDb25uZWN0b3IgaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0b3JJdGVtUHJvdmlkZXIgY29ubmVjdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEgQ29ubmVjdG9yLgotCSAqIAotCSAqIEByZXR1cm4gQWRhcHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXIoKSB7Ci0JCWlmIChjb25uZWN0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29ubmVjdG9ySXRlbVByb3ZpZGVyID0gbmV3IENvbm5lY3Rvckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIGNvbm5lY3Rvckl0ZW1Qcm92aWRlcjsKLQl9Ly8gY3JlYXRlQ29ubmVjdG9yQWRhcHRlcgotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIExpY2Vuc2UgaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBMaWNlbnNlSXRlbVByb3ZpZGVyIGxpY2Vuc2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSBMaWNlbnNlLgotCSAqIAotCSAqIEByZXR1cm4gQWRhcHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyKCkgewotCQlpZiAobGljZW5zZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlsaWNlbnNlSXRlbVByb3ZpZGVyID0gbmV3IExpY2Vuc2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0vLyBpZgotCi0JCXJldHVybiBsaWNlbnNlSXRlbVByb3ZpZGVyOwotCX0vLyBjcmVhdGVMaWNlbnNlQWRhcHRlcgotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgaW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCkgewotCQlpZiAoaW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbmJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyID0gbmV3IEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpIHsKLQkJaWYgKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyID0gbmV3IE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VBZGFwdGVyfQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciBtZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuTWVzc2FnZUFkYXB0ZXJ9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlQWRhcHRlckFkYXB0ZXIoKSB7Ci0JCWlmIChtZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciA9IG5ldyBNZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9ufWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyIGNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyID0gbmV3IENvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkFkbWluT2JqZWN0fQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBZG1pbk9iamVjdEl0ZW1Qcm92aWRlciBhZG1pbk9iamVjdEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWRtaW5PYmplY3R9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZG1pbk9iamVjdEFkYXB0ZXIoKSB7Ci0JCWlmIChhZG1pbk9iamVjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhZG1pbk9iamVjdEl0ZW1Qcm92aWRlciA9IG5ldyBBZG1pbk9iamVjdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhZG1pbk9iamVjdEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5NZXNzYWdlTGlzdGVuZXJ9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlciBtZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VMaXN0ZW5lcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VMaXN0ZW5lckFkYXB0ZXIoKSB7Ci0JCWlmIChtZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyID0gbmV3IE1lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWN0aXZhdGlvblNwZWN9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyIGFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5BY3RpdmF0aW9uU3BlY30uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2YXRpb25TcGVjQWRhcHRlcigpIHsKLQkJaWYgKGFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyID0gbmV3IEFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIgcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVBZGFwdGVyKCkgewotCQlpZiAocmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIFJlc291cmNlQWRhcHRlciBpbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciByZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSBSZXNvdXJjZUFkYXB0ZXIuCi0JICogCi0JICogQHJldHVybiBBZGFwdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpIHsKLQkJaWYgKHJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgPSBuZXcgUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ly8gaWYKLQotCQlyZXR1cm4gcmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyOwotCX0vLyBjcmVhdGVSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyCi0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwgU2VjdXJpdHlQZXJtaXNzaW9uIGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyIHNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIFNlY3VyaXR5UGVybWlzc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb25BZGFwdGVyKCkgewotCQlpZiAoc2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlciA9IG5ldyBTZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0vLyBpZgotCi0JCXJldHVybiBzZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXI7Ci0JfS8vIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbkFkYXB0ZXIKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBpbnN0YW5jZXMKLQkgKi8KLQlwcm90ZWN0ZWQgQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIgYXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS4KLQkgKiAKLQkgKiBAcmV0dXJuIEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUFkYXB0ZXIoKSB7Ci0JCWlmIChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlciA9IG5ldyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyOwotCX0vLyBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUFkYXB0ZXIKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCBDb25maWdQcm9wZXJ0eSBpbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIENvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyIGNvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5Db25maWdQcm9wZXJ0eX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uZmlnUHJvcGVydHlBZGFwdGVyKCkgewotCQlpZiAoY29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIgPSBuZXcgQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0vLyBpZgotCi0JCXJldHVybiBjb25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQl9Ly8gY3JlYXRlQ29uZmlnUHJvcGVydHlBZGFwdGVyCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfS8vIGdldFJvb3RBZGFwdGVyRmFjdG9yeQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICogCi0JICogQHJldHVybiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0JfS8vIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgaXQgaXMgYSBmYWN0b3J5IHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICB0eXBlIC0gVGhlIGdpdmVuIHR5cGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpIHx8IHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpOwotCX0vLyBpc0ZhY3RvcnlGb3JUeXBlCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gVGhlIGdpdmVuIG5vdGlmZXIuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgdHlwZSAtIFRoZSBnaXZlbiB0eXBlCi0JICogQHJldHVybiBBZGFwdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfS8vIGFkYXB0Ci0KLQkvKioKLQkgKiBEb2VzIGFkYXB0aW5nLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBnaXZlbiBvYmplY3QuCi0JICogQHBhcmFtIE9qZWN0Ci0JICogICAgICAgICAgICB0eXBlIC0gVGhlIGdpdmVuIHR5cGUuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCS8vIFRoaXMgaXMgYSBrbHVkZ2UgdG8gZGVhbCB3aXRoIGVudW1lcmF0b3JzLCB3aGljaCBjcmFzaCB0aGUgZG9Td2l0Y2guCi0JCS8vCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0ICYmICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfS8vIGlmCi0KLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ly8gaWYKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIG51bGw7Ci0JfS8vIGFkYXB0Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfS8vIHJlbW92ZUxpc3RlbmVyCi0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byBjaGFuZ2UgTm90aWZpZXIgYW5kIHRvIHBhcmVudCBBZGFwdGVyRmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgZ2l2ZW4gb2JqZWN0LgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBnaXZlbiB0eXBlIG9mIGV2ZW50LgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgLSBUaGUgZ2l2ZW4gZmVhdHVyZS4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvbGRWYWx1ZSAtIFRoZSBvbGQgdmFsdWUgb2YgdGhlIGV2ZW50LgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG5yZVZhbHVlIC0gVGhlIG5ldyB2YWx1ZSBvZiB0aGUgZXZlbnQuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQkJfS8vIGlmCi0JfS8vIGZpcmVOb3RpZnlDaGFuZ2VkCi0KLX0vLyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0xpY2Vuc2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9MaWNlbnNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTBmYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0xpY2Vuc2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEgTGljZW5zZSBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWNlbnNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgSmNhSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gQWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaWNlbnNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ly8gTGljZW5zZUl0ZW1Qcm92aWRlcgotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVxdWlyZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9MaWNlbnNlX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xpY2Vuc2VfZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfTGljZW5zZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldExpY2Vuc2VfRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlcXVpcmVkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcXVpcmVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9MaWNlbnNlX3JlcXVpcmVkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xpY2Vuc2VfcmVxdWlyZWRfZmVhdHVyZSIsICJfVUlfTGljZW5zZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldExpY2Vuc2VfUmVxdWlyZWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JLyoKLQkgKiBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsgaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkgKiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JICogCi0JICogTGljZW5zZSBmX2xpY2Vuc2UgPSAoKExpY2Vuc2Upb2JqZWN0KTsgSmNhUGFja2FnZSBwa2cgPSBKY2FQYWNrYWdlLmVJTlNUQU5DRTs7IC8vIFRoaXMgaXMgZm9yCi0JICogdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRlc2NyaXB0aW9uIiwgIlRoZQotCSAqIGRlc2NyaXB0aW9uIHByb3BlcnR5IG9mIHRoZSBsaWNlbnNlIiwgcGtnLmdldExpY2Vuc2VfRGVzY3JpcHRpb24oKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHJlcXVpcmVkIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiUmVxdWlyZWQiLCAiVGhlCi0JICogcmVxdWlyZWQgcHJvcGVydHkgb2YgdGhlIGxpY2Vuc2UiLCBwa2cuZ2V0TGljZW5zZV9SZXF1aXJlZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCSAqIAotCSAqIH0vLyBpZgotCSAqIAotCSAqIHJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsgfS8vIGdldFByb3BlcnR5RGVzY3JpcHRvcnMKLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgTGljZW5zZS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0vLyBnZXRQYXJlbnQKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBMaWNlbnNlLmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9saWNlbnNlX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfS8vIGdldEltYWdlCi0KLQkvKioKLQkgKiBHZXQgdGhlIGRpc3BsYXkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGdldCB0aGUgbmFtZSBmb3IuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlMaWNlbnNlIGxpY2Vuc2UgPSAoKExpY2Vuc2UpIG9iamVjdCk7Ci0JCWlmIChsaWNlbnNlLmdldERlc2NyaXB0aW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuTGljZW5zZUl0ZW1Qcm92aWRlcl9VSV8wOyAKLQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5MaWNlbnNlSXRlbVByb3ZpZGVyX1VJXzAgKyAiOiIgKyBsaWNlbnNlLmdldERlc2NyaXB0aW9uKCk7ICAvLyROT04tTkxTLTEkCi0JfS8vIGdldFRleHQKLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChMaWNlbnNlLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19SRVFVSVJFRCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gTm90aWZpZXMgb2YgY2hhbmdlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBldmVudCB0eXBlLgotCSAqIEBwYXJhbSBFT2JqZWN0Ci0JICogICAgICAgICAgICBmZWF0dXJlIC0gVGhlIHJlZmVyZW5jZSBvYmplY3QuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2xkVmFsdWUgLSBUaGUgb2xkIG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgbmV3VmFsdWUgLSBUaGUgbmV3IG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBvZiB0aGUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgewotCQlKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUuZUNvbnRhaW5tZW50RmVhdHVyZSgpLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLQkJaWYgKGZlYXR1cmUgPT0gcGtnLmdldExpY2Vuc2VfRGVzY3JpcHRpb24oKSB8fCBmZWF0dXJlID09IHBrZy5nZXRMaWNlbnNlX1JlcXVpcmVkKCkpIHsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0vLyBpZgotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfS8vIG5vdGlmeUNoYW5nZWQKLQotfS8vIExpY2Vuc2VJdGVtUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9NZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL01lc3NhZ2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMTM0NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL01lc3NhZ2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VBZGFwdGVyfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUxpc3RlbmVycygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1lc3NhZ2VBZGFwdGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWVzc2FnZUFkYXB0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuX1VJX01lc3NhZ2VBZGFwdGVyX3R5cGU7IAotCQkvL3JldHVybiBnZXRTdHJpbmcoIl9VSV9NZXNzYWdlQWRhcHRlcl90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWVzc2FnZUFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlQWRhcHRlcl9NZXNzYWdlTGlzdGVuZXJzKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2VMaXN0ZW5lcigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQkvL3JldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvTWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvTWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYmMyOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL01lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VMaXN0ZW5lcn1vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTWVzc2FnZUxpc3RlbmVyVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWVzc2FnZSBMaXN0ZW5lciBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1lc3NhZ2VMaXN0ZW5lclR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX01lc3NhZ2VMaXN0ZW5lcl9tZXNzYWdlTGlzdGVuZXJUeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01lc3NhZ2VMaXN0ZW5lcl9tZXNzYWdlTGlzdGVuZXJUeXBlX2ZlYXR1cmUiLCAiX1VJX01lc3NhZ2VMaXN0ZW5lcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VMaXN0ZW5lcl9NZXNzYWdlTGlzdGVuZXJUeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlTGlzdGVuZXJfQWN0aXZhdGlvblNwZWMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXNzYWdlTGlzdGVuZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXNzYWdlTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWVzc2FnZUxpc3RlbmVyKSBvYmplY3QpLmdldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IEpDQVJlc291cmNlSGFuZGxlci5fVUlfTWVzc2FnZUxpc3RlbmVyX3R5cGUgOiAKLQkJCQkJSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9NZXNzYWdlTGlzdGVuZXJfdHlwZSArICIgIiArIGxhYmVsOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXNzYWdlTGlzdGVuZXIuY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRV9MSVNURU5FUl9UWVBFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19BQ1RJVkFUSU9OX1NQRUMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZUxpc3RlbmVyX0FjdGl2YXRpb25TcGVjKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2YXRpb25TcGVjKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCS8vcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gSmNhUGx1Z2luLmdldFBsdWdpbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9PdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjkzMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcn0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVHJhbnNhY3Rpb25TdXBwb3J0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3JlYXV0aGVudGljYXRpb25TdXBwb3J0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3JlYXV0aGVudGljYXRpb25TdXBwb3J0X2ZlYXR1cmUiLCAiX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRyYW5zYWN0aW9uIFN1cHBvcnQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHJhbnNhY3Rpb25TdXBwb3J0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl90cmFuc2FjdGlvblN1cHBvcnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfdHJhbnNhY3Rpb25TdXBwb3J0X2ZlYXR1cmUiLCAiX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBPdXRib3VuZFJlc291cmNlQWRhcHRlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L091dGJvdW5kUmVzb3VyY2VBZGFwdGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvLwkJT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPSAoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpIG9iamVjdDsKLQotCQlyZXR1cm4gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl90eXBlOyAKLQkJLy9yZXR1cm4gZ2V0U3RyaW5nKCJfVUlfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfdHlwZSIpIC8qKyAiICIgKwotCQkvLyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5pc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkqLzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbnMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSmNhUGx1Z2luLmdldFBsdWdpbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmNlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZX0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfbmFtZV9mZWF0dXJlIiwgIl9VSV9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX05hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV90eXBlIDogCi0JCQkJCUpDQVJlc291cmNlSGFuZGxlci5fVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfdHlwZSArICIgIiArIGxhYmVsOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQkvL3JldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTE1YTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1Jlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEgUmVzb3VyY2VBZGFwdGVyIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciBleHRlbmRzIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIFRoZSBhZGFwdCBmYWN0b3J5Ci0JICovCi0JcHVibGljIFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfS8vIFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcgotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uSW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUcmFuc2FjdGlvblN1cHBvcnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlYXV0aGVudGljYXRpb25TdXBwb3J0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXNvdXJjZUFkYXB0ZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3MgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl9tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3MgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25uZWN0aW9uIEludGVyZmFjZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBJbXBsIENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25JbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uSW1wbENsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uSW1wbENsYXNzX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW1wbENsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUcmFuc2FjdGlvbiBTdXBwb3J0IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zYWN0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VBZGFwdGVyX3RyYW5zYWN0aW9uU3VwcG9ydF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHJhbnNhY3Rpb25TdXBwb3J0X2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlYXV0aGVudGljYXRpb24gU3VwcG9ydCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VBZGFwdGVyX3JlYXV0aGVudGljYXRpb25TdXBwb3J0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlQWRhcHRlcl9yZWF1dGhlbnRpY2F0aW9uU3VwcG9ydF9mZWF0dXJlIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlc291cmNlIEFkYXB0ZXIgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VBZGFwdGVyQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl9yZXNvdXJjZUFkYXB0ZXJDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfcmVzb3VyY2VBZGFwdGVyQ2xhc3NfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlQWRhcHRlckNsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCS8qCi0JICogcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7IGlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JICogc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCSAqIAotCSAqIFJlc291cmNlQWRhcHRlciBmX3Jlc291cmNlQWRhcHRlciA9ICgoUmVzb3VyY2VBZGFwdGVyKW9iamVjdCk7IEpjYVBhY2thZ2UgcGtnID0KLQkgKiBKY2FQYWNrYWdlLmVJTlNUQU5DRTs7IC8vIFRoaXMgaXMgZm9yIHRoZSBtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIk1hbmFnZWQgQ29ubmVjdGlvbgotCSAqIEZhY3RvcnkgQ2xhc3MiLCAiVGhlIG1hbmFnZWQgY29ubmVjdGlvbiBmYWN0b3J5IGNsYXNzIHByb3BlcnR5IG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIiwKLQkgKiBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZQotCSAqIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkNvbm5lY3Rpb24gRmFjdG9yeQotCSAqIEludGVyZmFjZSIsICJUaGUgY29ubmVjdGlvbiBmYWN0b3J5IGludGVyZmFjZSBwcm9wZXJ0eSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciIsCi0JICogcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MKLQkgKiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJDb25uZWN0aW9uIEZhY3RvcnkKLQkgKiBJbXBsIENsYXNzIiwgIlRoZSBjb25uZWN0aW9uIGZhY3RvcnkgaW1wbCBjbGFzcyBwcm9wZXJ0eSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciIsCi0JICogcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgY29ubmVjdGlvbkludGVyZmFjZSBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkNvbm5lY3Rpb24gSW50ZXJmYWNlIiwKLQkgKiAiVGhlIGNvbm5lY3Rpb24gaW50ZXJmYWNlIHByb3BlcnR5IG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIiwKLQkgKiBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGNvbm5lY3Rpb25JbXBsQ2xhc3MgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJDb25uZWN0aW9uIEltcGwKLQkgKiBDbGFzcyIsICJUaGUgY29ubmVjdGlvbiBpbXBsIGNsYXNzIHByb3BlcnR5IG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIiwKLQkgKiBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHRyYW5zYWN0aW9uU3VwcG9ydCBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlRyYW5zYWN0aW9uIFN1cHBvcnQiLAotCSAqICJUaGUgdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm9wZXJ0eSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciIsCi0JICogcGtnLmdldFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHJlYXV0aGVudGljYXRpb25TdXBwb3J0Ci0JICogZmVhdHVyZS4gLy8gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiUmVhdXRoZW50aWNhdGlvbgotCSAqIFN1cHBvcnQiLCAiVGhlIHJlYXV0aGVudGljYXRpb24gc3VwcG9ydCBwcm9wZXJ0eSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciIsCi0JICogcGtnLmdldFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCSAqIAotCSAqIH0vLyBpZiByZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7IH0vLyBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzCi0JICovCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCBBZGRDb21tYW5kIGFuZCBSZW1vdmVDb21tYW5kIHN1cHBvcnQgaW4gY3JlYXRlQ29tbWFuZC4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWludCB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZUFkYXB0ZXIpCi0JCQkJdmVyc2lvbiA9ICgoQ29ubmVjdG9yKSAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpKS5nZXRWZXJzaW9uSUQoKTsKLQotCQkJc3dpdGNoICh2ZXJzaW9uKSB7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEIDoKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpKTsKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydGllcygpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEIDoKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWluT2JqZWN0cygpKTsKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9ucygpKTsKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkpOwotCQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCkpOwotCQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ly8gaWYKLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ly8gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBSZXNvdXJjZUFkYXB0ZXIuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ly8gZ2V0UGFyZW50Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUmVzb3VyY2VBZGFwdGVyLmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvcmVzb3VyY2VfYWRhcHRlcl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0JLyoqCi0JICogR2V0IHRoZSBkaXNwbGF5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIG5hbWUgZm9yLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy8JCVJlc291cmNlQWRhcHRlciByZXNvdXJjZUFkYXB0ZXIgPSAoKFJlc291cmNlQWRhcHRlcikgb2JqZWN0KTsKLQkJLy9yZXR1cm4gIlJlc291cmNlQWRhcHRlcjogIiArIHJlc291cmNlQWRhcHRlci5nZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlOyAKLQotCX0vLyBnZXRUZXh0Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2VBZGFwdGVyLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU1QTF9DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRV9BREFQVEVSX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRJRVMgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQURNSU5fT0JKRUNUUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9ucygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eVBlcm1pc3Npb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc20oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbmZpZ1Byb3BlcnR5KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9BZG1pbk9iamVjdHMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWRtaW5PYmplY3QoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gTm90aWZpZXMgb2YgY2hhbmdlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBldmVudCB0eXBlLgotCSAqIEBwYXJhbSBFT2JqZWN0Ci0JICogICAgICAgICAgICBmZWF0dXJlIC0gVGhlIHJlZmVyZW5jZSBvYmplY3QuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2xkVmFsdWUgLSBUaGUgb2xkIG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgbmV3VmFsdWUgLSBUaGUgbmV3IG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBvZiB0aGUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgewotCQlKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUuZUNvbnRhaW5tZW50RmVhdHVyZSgpLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLQkJaWYgKGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW50ZXJmYWNlKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKSkgewotCQkJZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCXJldHVybjsKLQkJfS8vIGlmCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ly8gbm90aWZ5Q2hhbmdlZAotCi19Ly8gUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YjI4NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1NlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEgU2VjdXJpdHlQZXJtaXNzaW9uIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlciBleHRlbmRzIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIFRoZSBhZGFwdCBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBTZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBTZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNwZWNpZmljYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZWN1cml0eVBlcm1pc3Npb25fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdXJpdHlQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1NlY3VyaXR5UGVybWlzc2lvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3BlY2lmaWNhdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZWN1cml0eVBlcm1pc3Npb25fc3BlY2lmaWNhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZWN1cml0eVBlcm1pc3Npb25fc3BlY2lmaWNhdGlvbl9mZWF0dXJlIiwgIl9VSV9TZWN1cml0eVBlcm1pc3Npb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVBlcm1pc3Npb25fU3BlY2lmaWNhdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JLyoKLQkgKiBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsgaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkgKiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JICogCi0JICogU2VjdXJpdHlQZXJtaXNzaW9uIGZfc2VjdXJpdHlQZXJtaXNzaW9uID0gKChTZWN1cml0eVBlcm1pc3Npb24pb2JqZWN0KTsgSmNhUGFja2FnZSBwa2cgPQotCSAqIEpjYVBhY2thZ2UuZUlOU1RBTkNFOzsgLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCSAqIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiRGVzY3JpcHRpb24iLCAiVGhlCi0JICogZGVzY3JpcHRpb24gcHJvcGVydHkgb2YgdGhlIHNlY3VyaXR5IHBlcm1pc3Npb24iLCBwa2cuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCksCi0JICogdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiU3BlY2lmaWNhdGlvbiIsICJUaGUKLQkgKiBzcGVjaWZpY2F0aW9uIHByb3BlcnR5IG9mIHRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIiwKLQkgKiBwa2cuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NwZWNpZmljYXRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7Ci0JICogCi0JICogfS8vIGlmIHJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsgfS8vIGdldFByb3BlcnR5RGVzY3JpcHRvcnMKLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgU2VjdXJpdHlQZXJtaXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfS8vIGdldFBhcmVudAotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlY3VyaXR5UGVybWlzc2lvbi5naWYuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmdWxsL29iajE2L3NlY3VyaXR5X3Blcm1pc3Npb25fb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0SW1hZ2UKLQotCi0JLyoqCi0JICogR2V0IHRoZSBkaXNwbGF5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIG5hbWUgZm9yLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU2VjdXJpdHlQZXJtaXNzaW9uIHNlY3VyaXR5UGVybWlzc2lvbiA9ICgoU2VjdXJpdHlQZXJtaXNzaW9uKSBvYmplY3QpOwotCQlpZiAoc2VjdXJpdHlQZXJtaXNzaW9uLmdldERlc2NyaXB0aW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyX1VJXzA7IAotCQlyZXR1cm4gSkNBUmVzb3VyY2VIYW5kbGVyLlNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcl9VSV8wICsgIjogIiArIHNlY3VyaXR5UGVybWlzc2lvbi5nZXREZXNjcmlwdGlvbigpOyAgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRUZXh0Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VjdXJpdHlQZXJtaXNzaW9uLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19TUEVDSUZJQ0FUSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gTm90aWZpZXMgb2YgY2hhbmdlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBldmVudCB0eXBlLgotCSAqIEBwYXJhbSBFT2JqZWN0Ci0JICogICAgICAgICAgICBmZWF0dXJlIC0gVGhlIHJlZmVyZW5jZSBvYmplY3QuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2xkVmFsdWUgLSBUaGUgb2xkIG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgbmV3VmFsdWUgLSBUaGUgbmV3IG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBvZiB0aGUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgewotCQlKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUuZUNvbnRhaW5tZW50RmVhdHVyZSgpLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLQkJaWYgKGZlYXR1cmUgPT0gcGtnLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFNlY3VyaXR5UGVybWlzc2lvbl9TcGVjaWZpY2F0aW9uKCkpIHsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0vLyBpZgotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfS8vIG5vdGlmeUNoYW5nZWQKLQotfS8vIFNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmOGQ1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY29ubmVjdG9yX3ZhbGlkYXRvcl9VSV89Q29ubmVjdG9yIFZhbGlkYXRvcgotQ09OTl9GQUNFVF9MQUJFTD1KMkMgTW9kdWxlCi1DT05OX0ZBQ0VUX0RFU0NSSVBUSU9OPUVuYWJsZXMgdGhlIHByb2plY3QgdG8gYmUgZGVwbG95ZWQgYXMgYSBKMkMgbW9kdWxlLgotQ09OTl9GQUNFVF9URU1QTEFURT1KMkMgUHJvamVjdAotcGx1Z2luTmFtZT1KQ0EgUGx1Zy1pbgotcGx1Z2luVmVuZG9yPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmNzRhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iSmNhTW9kdWxlRXh0ZW5zaW9uIgotICAgICAgICAgbmFtZT0iSmNhTW9kdWxlRXh0ZW5zaW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkVBUk1vZHVsZUV4dGVuc2lvbiI+Ci0gICAgICA8ZWFyTW9kdWxlRXh0ZW5zaW9uCi0gICAgICAgICAgICBleHRlbnNpb25DbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FNb2R1bGVFeHRlbnNpb25JbXBsIj4KLSAgICAgIDwvZWFyTW9kdWxlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uYWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzLkpjYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0iamNhLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvdmlkZXJzLkpjYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJDb25uZWN0b3JWYWxpZGF0b3IiCi0gICAgICAgICBuYW1lPSIlY29ubmVjdG9yX3ZhbGlkYXRvcl9VSV8iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICA8ZmFjZXQKLSAgICAgICAgICAgICAgIGZhY2V0SWQ9ImpzdC5jb25uZWN0b3IiPgotICAgICAgICAgPC9mYWNldD4KLSAgICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb25uZWN0b3JERCI+Ci0gICAgICAgICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9Ik1BTklGRVNULk1GIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICA8aGVscGVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnZhbGlkYXRpb24uQ29ubmVjdG9ySGVscGVyIj4KLSAgICAgICAgIDwvaGVscGVyPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS52YWxpZGF0aW9uLlVJQ29ubmVjdG9yVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgICAgPHJ1blN0cmF0ZWd5IAotICAgICAgICAgCXByb2plY3Q9InRydWUiPgotICAgICAgICAgPC9ydW5TdHJhdGVneT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWwiPgotICAgICAgPGVkaXRNb2RlbAotICAgICAgICAgICAgZWRpdE1vZGVsSUQ9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeSI+Ci0gICAgICAgICA8ZWRpdE1vZGVsUmVzb3VyY2UKLSAgICAgICAgICAgICAgIGF1dG9sb2FkPSJmYWxzZSIKLSAgICAgICAgICAgICAgIFVSST0iTUVUQS1JTkYvcmEueG1sIi8+Ci0gICAgICA8L2VkaXRNb2RlbD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5hcnRpZmFjdGVkaXQiPgotICAgICAgPGFydGlmYWN0ZWRpdAotICAgICAgICAgICAgdHlwZUlEPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5tb2R1bGVjb3JlLnV0aWwuQ29ubmVjdG9yQXJ0aWZhY3RFZGl0Ij4KLSAgICAgIDwvYXJ0aWZhY3RlZGl0PgotICAgPC9leHRlbnNpb24+IAotICAgCi0gICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPCEtLSBCdWlsZGVyIFByb3ZpZGVyIHJlZ2lzdHJhdGlvbnMtLT4KLSAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIj4KLSAgICAgCTxQcm92aWRlckRlZmluZXNUeXBlCi0gICAgICAJCXByb3ZpZGVyVHlwZT0ianN0LmNvbm5lY3Rvci5idWlsZGVyIgotICAgICAgCQlwcm92aWRlcklEPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5KYXZhQ29tcG9uZW50QnVpbGRlckRhdGFNb2RlbFByb3ZpZGVyIi8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JCi0gIDwhLS0gUHJvamVjdCBGYWNldHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJqc3QuY29ubmVjdG9yIj4KLSAgICAgIDxsYWJlbD4lQ09OTl9GQUNFVF9MQUJFTDwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+JUNPTk5fRkFDRVRfREVTQ1JJUFRJT048L2Rlc2NyaXB0aW9uPgotICAgICAgPGljb24+aWNvbnMvZnVsbC9vYmoxNi9Db25uZWN0b3IuZ2lmPC9pY29uPgotICAgIDwvcHJvamVjdC1mYWNldD4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5jb25uZWN0b3IiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSJbMS4zIi8+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5jb25uZWN0b3IiIHZlcnNpb249IjEuNSI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSJbMS4zIi8+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxhY3Rpb24gZmFjZXQ9ImpzdC5jb25uZWN0b3IiIHZlcnNpb249IjEuMCwxLjUiIHR5cGU9IklOU1RBTEwiIGlkPSJqc3QuY29ubmVjdG9yLmluc3RhbGwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5Db25uZWN0b3JGYWNldEluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgPGNvbmZpZy1mYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5Db25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciIvPgotICAgIDwvYWN0aW9uPgotICAgIAotICAgIDxldmVudC1oYW5kbGVyIGZhY2V0PSJqc3QuY29ubmVjdG9yIiB2ZXJzaW9uPSIxLjAsMS41IiB0eXBlPSJQT1NUX0lOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5Db25uZWN0b3JGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICA8L2V2ZW50LWhhbmRsZXI+Ci0gICAgCi0gICAgPGV2ZW50LWhhbmRsZXIgZmFjZXQ9ImpzdC5jb25uZWN0b3IiIHZlcnNpb249IjEuMCwxLjUiIHR5cGU9IlJVTlRJTUVfQ0hBTkdFRCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRUZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZSIvPgotICAgIDwvZXZlbnQtaGFuZGxlcj4KLSAgICAKLSAgICA8dGVtcGxhdGUgaWQ9InRlbXBsYXRlLmpzdC5jb25uZWN0b3IiPgotICAgICAgPGxhYmVsPiVDT05OX0ZBQ0VUX1RFTVBMQVRFPC9sYWJlbD4KLSAgICAgIDxmaXhlZCBmYWNldD0ianN0LmphdmEiLz4KLSAgICAgIDxmaXhlZCBmYWNldD0ianN0LmNvbm5lY3RvciIvPgotICAgIDwvdGVtcGxhdGU+Ci0KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFTW9kZWxQcm92aWRlciI+Ci0gICAgICAgIDxwcm92aWRlcj4KLSAgICAgICAgCTxtb2RlbFByb3ZpZGVyIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLm1vZHVsZWNvcmUudXRpbC5Db25uZWN0b3JBcnRpZmFjdEVkaXQiLz4JCi0gICAgICAJCTxmYWNldCBpZD0ianN0LmNvbm5lY3RvciIgdmVyc2lvbnM9IjEuMCwxLjUiLz4KLSAgICAgIAk8L3Byb3ZpZGVyPgotICA8L2V4dGVuc2lvbj4JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMmVhM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLnd0cC5qY2EiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJvcGVydHlfZmlsZXMvcmFyLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wcm9wZXJ0eV9maWxlcy9yYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwMTY4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wcm9wZXJ0eV9maWxlcy9yYXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTGljZW5zZUl0ZW1Qcm92aWRlcl9VSV8wPUxpY2Vuc2UKLVNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcl9VSV8wPVNlY3VyaXR5UGVybWlzc2lvbgotQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXJfVUlfMD1Db25maWdQcm9wZXJ0eQotX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlPVJlc291cmNlQWRhcHRlcgotX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGU9T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIKLV9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlPUNvbm5lY3Rpb25EZWZpbml0aW9uCi1fVUlfSW5ib3VuZFJlc291cmNlQWRhcHRlcl90eXBlPUluYm91bmRSZXNvdXJjZUFkYXB0ZXIKLV9VSV9NZXNzYWdlQWRhcHRlcl90eXBlPU1lc3NhZ2VBZGFwdGVyCi1fVUlfTWVzc2FnZUxpc3RlbmVyX3R5cGU9TWVzc2FnZUxpc3RlbmVyCi1fVUlfQWN0aXZhdGlvblNwZWNfdHlwZT1BY3RpdmF0aW9uU3BlYwotX1VJX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX3R5cGU9UmVxdWlyZWRDb25maWdQcm9wZXJ0eQotX1VJX0FkbWluT2JqZWN0X3R5cGU9QWRtaW5PYmplY3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3Byb3BlcnR5X2ZpbGVzL3JhcnZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3Byb3BlcnR5X2ZpbGVzL3JhcnZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3ODc3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wcm9wZXJ0eV9maWxlcy9yYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXz1JV0FFMDA1NEUgRG9jdW1lbnQgdHlwZSB2ZXJzaW9uICJ7MH0iIGZvciByYXIueG1sIGluIHByb2plY3QgInsxfSIgbmVlZHMgdG8gYmUgdmVyc2lvbiAiezJ9Ii4KLUVSUk9SX0lOVkFMSURfQ09OTkVDVE9SX0ZJTEU9IkludmFsaWQgUkFSIEZpbGUiLgotRVJST1JfQ09OTkVDVE9SX1ZBTElEQVRJT05fRkFJTEVEPSJSQVIgVmFsaWRhdGlvbiBmYWlsZWQiLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njg0MDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLmFyY2hpdmUub3BlcmF0aW9ucy5Db25uZWN0b3JDb21wb25lbnRFeHBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlciB7Ci0KLSAgICBwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRPcGVyYXRpb24obW9kZWwpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RUeXBlKCkgewotICAgICAgICByZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuSkNBOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0V3JvbmdDb21wb25lbnRUeXBlU3RyaW5nKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLk5PVF9BX1JBUiwgbmV3IE9iamVjdFtde3Byb2plY3ROYW1lfSk7ICAgICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlRXh0ZW5zaW9uKCkgewotICAgICAgICByZXR1cm4gIi5yYXIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIC8qKgotICAgICAqIEV4cG9ydHMgdGhlIHNwZWNpZmllZCBDb25uZWN0b3IgTW9kdWxlIHByb2plY3QgdG8gdGhlIHNwZWNpZmllZCBDb25uZWN0b3IgUkFSIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbm5lY3RvclByb2plY3ROYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ29ubmVjdG9yIE1vZHVsZSBwcm9qZWN0IHRvIGV4cG9ydC4KLSAgICAgKiBAcGFyYW0gcmFyRmlsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgQ29ubmVjdG9yIFJBUiBmaWxlIGxvY2F0aW9uIHRvIGV4cG9ydCB0aGUgc3BlY2lmaWVkIENvbm5lY3RvcgotICAgICAqICAgICAgICAgICAgTW9kdWxlIHByb2plY3QuCi0gICAgICogQHBhcmFtIG92ZXJ3cml0ZUV4aXN0aW5nCi0gICAgICogICAgICAgICAgICBJZiB0aGlzIGlzIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gYW4gZXhpc3RpbmcgZmlsZSBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5Ci0gICAgICogICAgICAgICAgICA8Y29kZT5lYXJGaWxlTmFtZTwvY29kZT4gd2lsbCBiZSBvdmVyd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gZXhwb3J0U291cmNlCi0gICAgICogICAgICAgICAgICBJZiB0aGlzIGlzIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gYWxsIHNvdXJjZSBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIENvbm5lY3RvcgotICAgICAqICAgICAgICAgICAgTW9kdWxlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBDb25uZWN0b3IgUkFSIGZpbGUuCi0gICAgICogQHBsYW5uZWRmb3IgV1RQIDEuMAotICAgICAqLwotLy8gICAgcHVibGljIHN0YXRpYyB2b2lkIGV4cG9ydFByb2plY3QoU3RyaW5nIGNvbm5lY3RvclByb2plY3ROYW1lLCBTdHJpbmcgcmFyRmlsZU5hbWUsIGJvb2xlYW4gb3ZlcndyaXRlRXhpc3RpbmcsIGJvb2xlYW4gZXhwb3J0U291cmNlKSB7Ci0vLyAgICAgICAgQ29ubmVjdG9yTW9kdWxlRXhwb3J0RGF0YU1vZGVsIGRhdGFNb2RlbCA9IG5ldyBDb25uZWN0b3JNb2R1bGVFeHBvcnREYXRhTW9kZWwoKTsKLS8vICAgICAgICBkYXRhTW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FLCBjb25uZWN0b3JQcm9qZWN0TmFtZSk7Ci0vLyAgICAgICAgZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShPVkVSV1JJVEVfRVhJU1RJTkcsIG92ZXJ3cml0ZUV4aXN0aW5nKTsKLS8vICAgICAgICBkYXRhTW9kZWwuc2V0UHJvcGVydHkoQVJDSElWRV9ERVNUSU5BVElPTiwgcmFyRmlsZU5hbWUpOwotLy8gICAgICAgIGRhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRVhQT1JUX1NPVVJDRV9GSUxFUywgZXhwb3J0U291cmNlKTsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLnJ1bihudWxsKTsKLS8vICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotLy8gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotLy8gICAgICAgIH0KLS8vICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyMmRlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5wcm9qZWN0LmZhY2V0LkNvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRmFjZXREYXRhTW9kZWxNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogVGhpcyBkYXRhTW9kZWwgaXMgdXNlZCBmb3IgdG8gaW1wb3J0IENvbm5lY3RvciBNb2R1bGVzIChmcm9tIFJBUiBmaWxlcykgaW50byB0aGUgd29ya3NwYWNlLgotICogCi0gKiBUaGlzIGNsYXNzIChhbmQgYWxsIGl0cyBmaWVsZHMgYW5kIG1ldGhvZHMpIGlzIGxpa2VseSB0byBjaGFuZ2UgZHVyaW5nIHRoZSBXVFAgMS4wIG1pbGVzdG9uZXMgYXMKLSAqIHRoZSBuZXcgcHJvamVjdCBzdHJ1Y3R1cmVzIGFyZSBhZG9wdGVkLiBVc2UgYXQgeW91ciBvd24gcmlzay4KLSAqIAotICogQHBsYW5uZWRmb3IgV1RQIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIgewotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvL3NldEludFByb3BlcnR5KElDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX1ZFUlNJT04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBYTUxSZXNvdXJjZS5SQVJfVFlQRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuQXJjaGl2ZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0Uub3BlblJBUkZpbGUoZ2V0QXJjaGl2ZU9wdGlvbnMoKSwgdXJpKTsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgY3JlYXRlSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IENvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CQkKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3RvckNvbXBvbmVudEltcG9ydE9wZXJhdGlvbihtb2RlbCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBzZXQgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBUkNISVZFX1dSQVBQRVIpKSB7Ci0JCQlJRGF0YU1vZGVsIG1vZHVsZURNID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKTsKLQkJCWlmIChnZXRBcmNoaXZlV3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZHVsZURNLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCQlJRGF0YU1vZGVsIGpjYUZhY2V0RGF0YU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKCBKMkVFUHJvamVjdFV0aWxpdGllcy5KQ0EgKTsKLQotCQkJCWludCB2ZXJzaW9uID0gZ2V0TW9kdWxlU3BlY1ZlcnNpb24oKTsKLQkJCQlTdHJpbmcgdmVyc2lvblRleHQgPSBKMkVFVmVyc2lvblV0aWwuZ2V0SkNBVGV4dFZlcnNpb24oIHZlcnNpb24gKTsKLQkJCQlqY2FGYWNldERhdGFNb2RlbC5zZXRTdHJpbmdQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCB2ZXJzaW9uVGV4dCk7Ci0JCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZXQ7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDE1ZDM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQ29ubmVjdG9yQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5Db25uZWN0b3JDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5KMkVFQXJ0aWZhY3RJbXBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uIGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0T3BlcmF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfRVhURU5TSU9OID0gIi5qYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlzdXBlci5kb0V4ZWN1dGUobW9uaXRvcik7Ci0JCWFkZEFzc29jaWF0ZUFyY2hpdmVzVG9DbGFzc1BhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFsbCBqYXIgd2l0aGluIHRoZSBmaWxlIHRvIHRoZSBjbGFzc3BhdGguCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXNzb2NpYXRlQXJjaGl2ZXNUb0NsYXNzUGF0aCgpIHsKLQkJTGlzdCA8SUNsYXNzcGF0aEVudHJ5PiBleHRyYUVudHJpZXMgPSBuZXcgQXJyYXlMaXN0IDxJQ2xhc3NwYXRoRW50cnk+ICgpOwotCQkKLQkJTGlzdCA8SUFyY2hpdmVSZXNvdXJjZT4gYXJjaGl2ZVJlc291cmNlcyA9ICgoSUFyY2hpdmUpYXJjaGl2ZVdyYXBwZXIuZ2V0VW5kZXJMeWluZ0FyY2hpdmUoKSkuZ2V0QXJjaGl2ZVJlc291cmNlcygpOwotCQlJVmlydHVhbEZpbGUgdkZpbGUgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZm9yKElBcmNoaXZlUmVzb3VyY2UgYXJjaGl2ZVJlc291cmNlIDogYXJjaGl2ZVJlc291cmNlcyl7Ci0JCQlpZihhcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCkuZW5kc1dpdGgoSkFSX0VYVEVOU0lPTikpewotCQkJCXZGaWxlID0gdmlydHVhbENvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShhcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpKTsKLQkJCQlpZiAodkZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJZmlsZSA9IHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQkJCWV4dHJhRW50cmllcy5hZGQoSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGZpbGUuZ2V0RnVsbFBhdGgoKSwgZmlsZS5nZXRGdWxsUGF0aCgpLCBudWxsLCB0cnVlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlhZGRUb0NsYXNzcGF0aChnZXREYXRhTW9kZWwoKSwgZXh0cmFFbnRyaWVzKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkVG9DbGFzc3BhdGgoSURhdGFNb2RlbCBpbXBvcnRNb2RlbCwgTGlzdCBleHRyYUVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAoZXh0cmFFbnRyaWVzLnNpemUoKSA+IDApIHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZSgoKElWaXJ0dWFsQ29tcG9uZW50KSBpbXBvcnRNb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UKSkuZ2V0UHJvamVjdCgpKTsKLQkJCWFkZFRvQ2xhc3NwYXRoKGV4dHJhRW50cmllcywgamF2YVByb2plY3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRUb0NsYXNzcGF0aChMaXN0IGV4dHJhRW50cmllcywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKGV4dHJhRW50cmllcy5zaXplKCkgPiAwKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBqYXZhQ2xhc3NwYXRoID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlMaXN0IG5vbkR1cGxpY2F0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhRW50cmllcy5zaXplKCk7IGkrKykgewotCQkJCUlDbGFzc3BhdGhFbnRyeSBleHRyYUVudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSkgZXh0cmFFbnRyaWVzLmdldChpKTsKLQkJCQlib29sZWFuIGluY2x1ZGUgPSB0cnVlOwotCQkJCWZvciAoaW50IGogPSAwOyBpbmNsdWRlICYmIGogPCBqYXZhQ2xhc3NwYXRoLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChleHRyYUVudHJ5LmVxdWFscyhqYXZhQ2xhc3NwYXRoW2pdKSkgewotCQkJCQkJaW5jbHVkZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpbmNsdWRlKSB7Ci0JCQkJCW5vbkR1cGxpY2F0ZUxpc3QuYWRkKGV4dHJhRW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChub25EdXBsaWNhdGVMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdKYXZhQ2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtqYXZhQ2xhc3NwYXRoLmxlbmd0aCArIG5vbkR1cGxpY2F0ZUxpc3Quc2l6ZSgpXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGphdmFDbGFzc3BhdGgsIDAsIG5ld0phdmFDbGFzc3BhdGgsIDAsIGphdmFDbGFzc3BhdGgubGVuZ3RoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5vbkR1cGxpY2F0ZUxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJbmV3SmF2YUNsYXNzcGF0aFtqYXZhQ2xhc3NwYXRoLmxlbmd0aCArIGpdID0gKElDbGFzc3BhdGhFbnRyeSkgbm9uRHVwbGljYXRlTGlzdC5nZXQoaik7Ci0JCQkJfQotCQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdKYXZhQ2xhc3NwYXRoLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZVNhdmVTdHJhdGVneShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJQ29ubmVjdG9yQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBzYXZlU3RyYXQgPSBuZXcgQ29ubmVjdG9yQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbChjb21wb25lbnQpOwotCQlyZXR1cm4gc2F2ZVN0cmF0OwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIGdldEFyY2hpdmVTYXZlQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50KXsKLQkJcmV0dXJuIG5ldyBDb25uZWN0b3JDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIodmlydHVhbENvbXBvbmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9JQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9JQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzVhNTRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvSUNvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotLyoqCi0gKiA8cD4KLSAqIElDb25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWwgcHJvdmlkZXMgcHJvcGVydGllcyB0byB0aGUgSURhdGFNb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIAotICogQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuXAotICogTk9URTogVGhlIGFzc29jaWF0ZWQgUHJvdmlkZXIgYW5kIE9wZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGR1cmluZyBNNQotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvSUNvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvSUNvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3Mjg0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0lDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLS8qKgotICogPHA+Ci0gKiBJQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSBJRGF0YU1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgCi0gKiBDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci4KLSAqIE5PVEU6IFRoZSBhc3NvY2lhdGVkIFByb3ZpZGVyIGFuZCBPcGVyYXRpb25zIHdpbGwgYmUgY3JlYXRlZCBkdXJpbmcgTTUKLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXMKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9tb2R1bGUvdXRpbC9Db25uZWN0b3JFZGl0QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL21vZHVsZS91dGlsL0Nvbm5lY3RvckVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQ5ZWQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL21vZHVsZS91dGlsL0Nvbm5lY3RvckVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5tb2R1bGUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLkNvbm5lY3RvckFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckVkaXRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBDb25uZWN0b3JBcnRpZmFjdEVkaXQuQURBUFRFUl9UWVBFIHx8IGFkYXB0ZXJUeXBlID09IEFydGlmYWN0RWRpdC5BREFQVEVSX1RZUEUpIHsKLQkJCUFydGlmYWN0RWRpdE1vZGVsIGVkaXRNb2RlbCA9IChBcnRpZmFjdEVkaXRNb2RlbCkgYWRhcHRhYmxlT2JqZWN0OwotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChlZGl0TW9kZWwuZ2V0UHJvamVjdCgpKSkKLQkJCQlyZXR1cm4gbmV3IENvbm5lY3RvckFydGlmYWN0RWRpdCgoQXJ0aWZhY3RFZGl0TW9kZWwpIGFkYXB0YWJsZU9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tde0FydGlmYWN0RWRpdC5jbGFzcywgQ29ubmVjdG9yRWRpdEFkYXB0ZXJGYWN0b3J5LmNsYXNzfTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvbW9kdWxlY29yZS91dGlsL0Nvbm5lY3RvckFydGlmYWN0RWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvbW9kdWxlY29yZS91dGlsL0Nvbm5lY3RvckFydGlmYWN0RWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY4NDQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL21vZHVsZWNvcmUvdXRpbC9Db25uZWN0b3JBcnRpZmFjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLm1vZHVsZWNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EuYXJjaGl2ZS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSUFydGlmYWN0RWRpdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiBQcm92aWRlcyBhY2Nlc3MgdG8gSjJFRSBDb25uZWN0b3IgbW9kZWxzIHVzaW5nIHRoZSBBcnRpZmFjdEVkaXQgcGF0dGVybi4KLSAqIDxwPgotICogQ2xpZW50cyBzaG91bGQgdXNlIGdldENvbm5lY3RvckFydGlmYWN0Rm9yUmVhZC9Xcml0ZSgpIHRvIGFjcXVpcmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvcnJlY3QKLSAqIGFydGlmYWN0IGVkaXQgY2xhc3MuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGltcGxlbWVudHMgSUFydGlmYWN0RWRpdEZhY3RvcnkgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfQ09OVEVOVF9UWVBFID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbm5lY3RvckREIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPgotCSAqIElkZW50aWZpZXIgdXNlZCB0byBsaW5rIENvbm5lY3RvckFydGlmYWN0RWRpdCB0byBhIENvbm5lY3RvckVkaXRBZGFwdGVyRmFjdG9yeQotCSAqIHtAc2VlIENvbm5lY3RvckVkaXRBZGFwdGVyRmFjdG9yeX0gc3RvcmVkIGluIGFuIEFkYXB0ZXJNYW5nZXIgKEBzZWUgQWRhcHRlck1hbmFnZXIpCi0JICogPC9wPgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBBREFQVEVSX1RZUEUgPSBDb25uZWN0b3JBcnRpZmFjdEVkaXQuY2xhc3M7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlzdXBlcihhTW9kdWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQmluYXJ5Q29tcG9uZW50SGVscGVyIGluaXRCaW5hcnlDb21wb25lbnRIZWxwZXIoSVZpcnR1YWxDb21wb25lbnQgYmluYXJ5TW9kdWxlKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKGJpbmFyeU1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFIYW5kbGUKLQkgKiBAcGFyYW0gdG9BY2Nlc3NBc1JlYWRPbmx5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5LCBib29sZWFuIGZvckNyZWF0ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHksIGZvckNyZWF0ZSwgSjJFRVByb2plY3RVdGlsaXRpZXMuSkNBKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQXJ0aWZhY3RFZGl0TW9kZWwKLQkgKi8KLQotCXB1YmxpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0TW9kZWwgYW5BcnRpZmFjdEVkaXRNb2RlbCkgewotCQlzdXBlcihhbkFydGlmYWN0RWRpdE1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfWZvciBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cG9pbnRpbmcgdG8gYSBtb2R1bGUgZnJvbSB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgICAgIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Ci0JICovCi0KLQlwcm90ZWN0ZWQgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIENvbm5lY3RvclJlc291cmNlIGZyb20gKEBsaW5rIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkKLQkgKi8KLQotCXB1YmxpYyBDb25uZWN0b3JSZXNvdXJjZSBnZXRDb25uZWN0b3JYbWlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChDb25uZWN0b3JSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBmcm9tIHRoZSBBcnRpZmFjdEVkaXRNb2RlbCB1c2luZyBkZWZpbmVkIFVSSS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBSZXNvdXJjZQotCSAqLwotCi0JcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB7Ci0JCWlmIChpc0JpbmFyeSgpKSB7Ci0JCQlyZXR1cm4gZ2V0QmluYXJ5Q29tcG9uZW50SGVscGVyKCkuZ2V0UmVzb3VyY2UoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJX09CSik7Ci0JCX0KLQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJX09CSik7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogT2J0YWlucyB0aGUgQ29ubmVjdG9yIChAc2VlIENvbm5lY3Rvcikgcm9vdCBvYmplY3QgZnJvbSB0aGUgQ29ubmVjdG9yUmVzb3VyY2UuIElmIHRoZSByb290Ci0JICogb2JqZWN0IGRvZXMgbm90IGV4aXN0LCB0aGVuIG9uZSBpcyBjcmVhdGVkIChAbGluawotCSAqIGFkZENvbm5lY3RvcklmTmVjZXNzYXJ5KGdldENvbm5lY3RvclhtaVJlc291cmNlKCkpKS4gVGhlIHJvb3Qgb2JqZWN0IGNvbnRhaW5zIGFsbCBvdGhlcgotCSAqIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkgewotCQlMaXN0IGNvbnRlbnRzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldENvbnRlbnRzKCk7Ci0JCWlmIChjb250ZW50cy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JCWlmIChpc0JpbmFyeSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlhZGRDb25uZWN0b3JJZk5lY2Vzc2FyeShnZXRDb25uZWN0b3JYbWlSZXNvdXJjZSgpKTsKLQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IG9iamVjdCAoQ29ubmVjdG9yKSBhbmQgcG9wdWxhdGVzIHdpdGggZGF0YS4gQWRkcyB0aGUKLQkgKiByb290IG9iamVjdCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJlc291cmNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBwb2ludGluZyB0byBhIHtAc2VlIFhNTFJlc291cmNlfSBOb3RlOiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZAotCSAqICAgICAgICAgICAgZm9yIEpVTklUIC0gbW92ZT8KLQkgKiAgICAgICAgICAgIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0b3JJZk5lY2Vzc2FyeShYTUxSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmIGFSZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbm5lY3RvcigpOwotCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGNvbm5lY3Rvcik7Ci0JCQlVUkkgbW9kdWxlVVJJID0gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRNb2R1bGVVUkkoKTsKLQkJCXRyeSB7Ci0JCQkJY29ubmVjdG9yLnNldERpc3BsYXlOYW1lKFN0cnVjdHVyZUVkaXQuZ2V0RGVwbG95ZWROYW1lKG1vZHVsZVVSSSkpOwotCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlCi0JCQl9Ci0JCQlhUmVzb3VyY2Uuc2V0SUQoY29ubmVjdG9yLCBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9JRCk7Ci0JCQkvLyBUT0RPIGFkZCBtb3JlIG1hbmRhdG9yeSBlbGVtZW50cwotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbQotCSAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmcgY29udGVudAotCSAqICAgICAgICAgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbm5lY3RvckFydGlmYWN0RWRpdCBnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JSZWFkKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCUNvbm5lY3RvckFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGlzVmFsaWRDb25uZWN0b3JNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoYVByb2plY3QpKSkKLQkJCQlhcnRpZmFjdEVkaXQgPSBuZXcgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCB0cnVlLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbm5lY3RvckFydGlmYWN0RWRpdCBnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JXcml0ZShJUHJvamVjdCBhUHJvamVjdCkgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChpc1ZhbGlkQ29ubmVjdG9yTW9kdWxlKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KSkpCi0JCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IENvbm5lY3RvckFydGlmYWN0RWRpdChhUHJvamVjdCwgZmFsc2UsIGZhbHNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIENvbm5lY3RvckFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMKLQkgKiBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIENvbm5lY3RvckFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZwotCSAqICAgICAgICAgY29udGVudCBtb2RlbAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGNvdWxkIG5vdCByZXNvbHZlIHVyaS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbm5lY3RvckFydGlmYWN0RWRpdCBnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYgKGFNb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoYU1vZHVsZS5pc0JpbmFyeSgpKSB7Ci0JCQlyZXR1cm4gbmV3IENvbm5lY3RvckFydGlmYWN0RWRpdChhTW9kdWxlKTsKLQkJfQotCQlyZXR1cm4gZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZChhTW9kdWxlLmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBDb25uZWN0b3JBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzCi0JICogbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIENvbm5lY3RvckFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMKLQkgKiAgICAgICAgIHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbm5lY3RvckFydGlmYWN0RWRpdCBnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCWlmIChhTW9kdWxlID09IG51bGwgfHwgYU1vZHVsZS5pc0JpbmFyeSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JXcml0ZShhTW9kdWxlLmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vZHVsZQotCSAqICAgICAgICAgICAgQSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoV29ya2JlbmNoQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcwotCSAqICAgICAgICAgYSBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDb25uZWN0b3JNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlpZiAoIWlzVmFsaWRFZGl0YWJsZU1vZHVsZShhTW9kdWxlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLyogYW5kIG1hdGNoIHRoZSBKU1RfQ29ubmVjdG9yX01PRFVMRSB0eXBlICovCi0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QoYU1vZHVsZS5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyBKMkVFIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBDb25uZWN0b3JSZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgSjJFRSBTcGVjIHZlcnNpb24KLQkgKi8KLQotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oKSB7Ci0JCXJldHVybiBnZXRDb25uZWN0b3JYbWlSZXNvdXJjZSgpLmdldEoyRUVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIENvbm5lY3RvciBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSkKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcigpIHsKLQkJcmV0dXJuIChDb25uZWN0b3IpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdCgpIHsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdChqYXZhLmxhbmcuSW50ZWdlcikKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoaW50IHZlcnNpb24pIHsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkJQ29ubmVjdG9yUmVzb3VyY2UgcmVzID0gKENvbm5lY3RvclJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXJlcy5zZXRNb2R1bGVWZXJzaW9uSUQodmVyc2lvbik7Ci0JCWFkZENvbm5lY3RvcklmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiAoKENvbm5lY3RvclJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpLmdldFJvb3RPYmplY3QoKTsKLQl9Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZChhQ29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGNyZWF0ZUFydGlmYWN0RWRpdEZvcldyaXRlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIGdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKGFDb21wb25lbnQpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlIGFzQXJjaGl2ZShib29sZWFuIGluY2x1ZGVTb3VyY2UsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmIChpc0JpbmFyeSgpKSB7Ci0JCQlKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyID0gKEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcilnZXRCaW5hcnlDb21wb25lbnRIZWxwZXIoKTsKLQkJCXJldHVybiBoZWxwZXIuYWNjZXNzTGVnYWN5QXJjaGl2ZSgpOwotCQl9IGVsc2UgewotCQkJQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCBsb2FkZXIgPSBuZXcgQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChnZXRDb21wb25lbnQoKSwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwotCQkJbG9hZGVyLnNldEV4cG9ydFNvdXJjZShpbmNsdWRlU291cmNlKTsKLQkJCVN0cmluZyB1cmkgPSBNb2R1bGVVUklVdGlsLmdldEhhbmRsZVN0cmluZyhnZXRDb21wb25lbnQoKSk7Ci0JCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFLm9wZW5SQVJGaWxlKGxvYWRlciwgdXJpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVEZXBsb3ltZW50RGVzY3JpcHRvcihJUHJvamVjdCBwcm9qZWN0LCBpbnQgdmVyc2lvbikgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgamNhRWRpdCA9IG5ldyBDb25uZWN0b3JBcnRpZmFjdEVkaXQocHJvamVjdCwgZmFsc2UsIHRydWUpOwotCQl0cnkgewotCQkJamNhRWRpdC5jcmVhdGVNb2RlbFJvb3QodmVyc2lvbik7Ci0JCQlqY2FFZGl0LnNhdmUobnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlqY2FFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIChJTW9kZWxQcm92aWRlcilnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCX0KLQlwdWJsaWMgdm9pZCBtb2RpZnkoUnVubmFibGUgcnVubmFibGUsIElQYXRoIG1vZGVsUGF0aCkgewotCQlzZXRXcml0YWJsZUVkaXQoZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKSk7Ci0JCXRyeXsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJaWYoIGdldFdyaXRhYmxlRWRpdCgpICE9IG51bGwgKXsKLQkJCQkvLyBBbHdheXMgc2F2ZSByZWdhcmRsZXNzIG9mIHJlc291cmNlIHBhdGggcGFzc2VkIC0gQXJ0aWZhY3RlZGl0cyBzYXZlIHJlc291cmNlcyBhcyBhIHVuaXQKLQkJCQlnZXRXcml0YWJsZUVkaXQoKS5zYXZlSWZOZWNlc3NhcnkoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgKTsKLQkJCX0KLQkJCQotCQl9IGZpbmFsbHkgeyAvL1Byb3Blcmx5IGRpc3Bvc2UgdGhlIHdyaXRlIGFydGlmYWN0IGVkaXQKLQkJCWdldFdyaXRhYmxlRWRpdCgpLmRpc3Bvc2UoKTsKLQkJCXNldFdyaXRhYmxlRWRpdChudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlRGVzY3JpYmVyKCkgewotCQlyZXR1cm4gQ09OTkVDVE9SX0NPTlRFTlRfVFlQRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9tb2R1bGVjb3JlL3V0aWwvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9tb2R1bGVjb3JlL3V0aWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MjhiYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvbW9kdWxlY29yZS91dGlsL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPldlYkFydGlmYWN0RWRpdCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIHRoZSBDb25uZWN0b3JBcnRpZmFjdEVkaXQgYXBpLiBUaGlzIGFwaSBpcyB1c2VkIHRvIHdvcmsgd2l0aCB0aGUgZW1mIG1vZGVsCi0gICAgICAgIG9mIGEgZmxleGlibGUgY29ubmVjdG9yIG1vZHVsZS4gSXQgY29udGFpbnMgYXBpIHRvIHJlYWQgYW5kIHNlcmlhbGl6ZSBvdXQgdGhlIGVtZiBtb2RlbCBmb3IgY29ubmVjdG9yIG1vZHVsZXMuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2R0cHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jZHRwcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTM4OGIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jZHRwcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UtY2R0IHZlcnNpb249IjIuMCI/Pg0KLQ0KLTxjZHRwcm9qZWN0Pg0KLTxkYXRhPg0KLTxpdGVtIGlkPSJjZHRfaW5kZXhlciI+DQotPGluZGV4RW5hYmxlZCBpbmRleFZhbHVlPSJ0cnVlIi8+DQotPC9pdGVtPg0KLTwvZGF0YT4NCi08L2NkdHByb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNTQyOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iajJlZS1uYXZpZ2F0b3IvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyNDZjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWoyZWUtbmF2aWdhdG9yLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1NmQxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuY3RjLmphdmFwcm9qZWN0bmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYWUzZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1RodSBNYXkgMTAgMTg6MzU6MTUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWZkNGNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4yMDQucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luLkoyRUVOYXZpZ2F0b3JQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQbHVnaW4ucHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbjt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlOyBleGNlcHRpb25zPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDU2ZTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNvdXJjZS4uID0gajJlZS1uYXZpZ2F0b3IvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9KMkVFUGVyc3BlY3RpdmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvSjJFRVBlcnNwZWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1NjU2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9KMkVFUGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Njg0MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Nvbm5lY3Rvcmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9jb25uZWN0b3Jncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDNhZjNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Nvbm5lY3Rvcmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9lYXJncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlYjNlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9lYXJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYWRiM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2ZvbGRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFiMjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2V4cG9ydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2V4cG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmODMzMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNjY3ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3MGIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjZDQxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2VqYmphcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWZiM2Q0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkODU5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2Vhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2Vhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTIwMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lamJqYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lamJqYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0YjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWpiamFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmMjVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmMwNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2U4NmExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmVjNmJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDA5YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2RhMjJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlamJwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhYzZiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9qMmVlX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFjZDRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9qMmVlX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmcxLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTExOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmcxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzdmMTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmczLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhODdjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmc0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNmNmYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmc0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwX2RlcGxveS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL29iajE2L3dlYmFwcF9kZXBsb3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzMWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2NsaWVudF9hcHBfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY2xpZW50X2FwcF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmYxY2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY2xpZW50X2FwcF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9jb25uZWN0b3Jfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZTc3YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9jb25uZWN0b3Jfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZWpiX21vZHVsZV9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNTBkNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2VudGVycHJpc2VfYXBwX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2VudGVycHJpc2VfYXBwX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMTljNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlOTYxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vYXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZDdmYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vYXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9jb25uZWN0b3Jfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzFmOGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1ZTc2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2VqYnByb2plY3Rfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2VqYnByb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyYWExZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfYXBwY2xpZW50X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfYXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTUzOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2Vhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzI3ZmE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lamJqYXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lamJqYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjYTc5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWpiamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfcmFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfcmFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDdmMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3Jhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3dhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjUxMjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9hcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9hcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxYTMxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfYXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NzU0ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTIzNTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5ZGZmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfcmFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNDI3NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2NGUyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2pjdV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvamN1X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTczYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvamN1X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zZXJ2bGV0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NlcnZsZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFiZWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NlcnZsZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc2Vzc2lvbkJlYW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2I4YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc2Vzc2lvbkJlYW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NydmNlX2VsZW1fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NydmNlX2VsZW1fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkY2IzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zcnZjZV9lbGVtX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93ZWJncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2ViZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0ZDM2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93ZWJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2Vic2VydmljZWRlc2MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2Vic2VydmljZWRlc2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dlYnNlcnZpY2VkZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dzZGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9uYXZpZ2F0b3IvdWkvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL25hdmlnYXRvci91aS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTk1YjQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL25hdmlnYXRvci91aS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubmF2aWdhdG9yLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm5hdmlnYXRvci51aS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2FkaW5nREROb2RlX0xvYWRpbmdfMF87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYXJQbGFjZUhvbGRlckpvYl9SZW1vdmluZ19wbGFjZV9ob2xkZXJfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfVGhlX2RyYWdnZWRfcHJvamVjdF9jYW5ub3RfYmVfYWRkZWRfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZE1vZHVsZVRvRWFyRHJvcEFzc2lzdGFudF9BZGRpbmdfbW9kdWxlX3RvX2VhXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRVdGlsaXR5SmFyVG9FYXJEcm9wQXNzaXN0YW50X0FkZF9VdGlsaXR5X0phcl90b18wXzsgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnRfSW1wb3J0aW5nX0phdmFfRW50ZXJwcmlzZV9FZGl0aW9uX2FydGlmYWN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfcmVjb2duaXplX2V4dGVuc2lvbl8wXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9wcm9qZWN0XzBfY2Fubm90X2JlX2FjY2Vzc2VfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfQ291bGRfbm90X2FkZF9tb2R1bGVfdG9fRW50ZXJwcmlzZV87Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9uYXZpZ2F0b3IvdWkvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL25hdmlnYXRvci91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjc4ODkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL25hdmlnYXRvci91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1N0cmluZyBleHRlcm5hbGl6YXRpb24sIGtleT12YWx1ZQotI1NhdCBBcHIgMTUgMTY6MTI6MTAgRURUIDIwMDYKLUFkZE1vZHVsZVRvRWFyRHJvcEFzc2lzdGFudF9BZGRpbmdfbW9kdWxlX3RvX2VhXz1BZGRpbmcgbW9kdWxlIHRvIHswfQotQ2xlYXJQbGFjZUhvbGRlckpvYl9SZW1vdmluZ19wbGFjZV9ob2xkZXJfPVJlbW92aW5nIHBsYWNlIGhvbGRlciAuLi4KLUltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50X0NvdWxkX25vdF9yZWNvZ25pemVfZXh0ZW5zaW9uXzBfPUNvdWxkIG5vdCByZWNvZ25pemUgZXh0ZW5zaW9uICJ7MH0iIGFzIGEgSmF2YSBFbnRlcnByaXNlIEVkaXRpb24gYXJ0aWZhY3QuCi1BZGRVdGlsaXR5SmFyVG9FYXJEcm9wQXNzaXN0YW50X0FkZF9VdGlsaXR5X0phcl90b18wXz1BZGQgVXRpbGl0eSBKYXIgdG8gezB9Ci1JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudF9JbXBvcnRpbmdfSmF2YV9FbnRlcnByaXNlX0VkaXRpb25fYXJ0aWZhY3RzPUltcG9ydGluZyBKYXZhIEVudGVycHJpc2UgRWRpdGlvbiBhcnRpZmFjdHMgLi4uCi1BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9wcm9qZWN0XzBfY2Fubm90X2JlX2FjY2Vzc2VfPVRoZSBwcm9qZWN0ICJ7MH0iIGNhbm5vdCBiZSBhY2Nlc3NlZAotQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfZHJhZ2dlZF9wcm9qZWN0X2Nhbm5vdF9iZV9hZGRlZF89VGhlIGRyYWdnZWQgcHJvamVjdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlICouZWFyIGJlY2F1c2UgaXQgaXMgY2xvc2VkLgotQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfYWRkX21vZHVsZV90b19FbnRlcnByaXNlXz1Db3VsZCBub3QgYWRkIG1vZHVsZSB0byBFbnRlcnByaXNlIEFwcGxpY2F0aW9uLgotTG9hZGluZ0RETm9kZV9Mb2FkaW5nXzBfPUxvYWRpbmcgZGVzY3JpcHRvciBmb3IgezB9LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0FwcGxpY2F0aW9uVmlld2VyU29ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvQXBwbGljYXRpb25WaWV3ZXJTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4MWNkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvQXBwbGljYXRpb25WaWV3ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVCaW5hcnlNb2R1bGVzSXRlbVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25WaWV3ZXJTb3J0ZXIgZXh0ZW5kcyBKMkVFVmlld2VyU29ydGVyIHsKLQotCXB1YmxpYyBBcHBsaWNhdGlvblZpZXdlclNvcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCWlmKGUxIGluc3RhbmNlb2YgSjJFRUJpbmFyeU1vZHVsZXNJdGVtUHJvdmlkZXIpewotCQkJcmV0dXJuIDE7Ci0JCX0gZWxzZSBpZihlMiBpbnN0YW5jZW9mIEoyRUVCaW5hcnlNb2R1bGVzSXRlbVByb3ZpZGVyKXsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0NsZWFyUGxhY2VIb2xkZXJKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9DbGVhclBsYWNlSG9sZGVySm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjliMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0NsZWFyUGxhY2VIb2xkZXJKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubmF2aWdhdG9yLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotCi1wdWJsaWMgY2xhc3MgQ2xlYXJQbGFjZUhvbGRlckpvYiBleHRlbmRzIFVJSm9iIHsKLQotCXByaXZhdGUgQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIExvYWRpbmdERE5vZGUgcGxhY2VIb2xkZXI7Ci0JcHJpdmF0ZSBPYmplY3RbXSBjaGlsZHJlbjsKLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwdWJsaWMgQ2xlYXJQbGFjZUhvbGRlckpvYihBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyLCBMb2FkaW5nREROb2RlIHBsYWNlSG9sZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCQlzdXBlcihNZXNzYWdlcy5DbGVhclBsYWNlSG9sZGVySm9iX1JlbW92aW5nX3BsYWNlX2hvbGRlcl8pOwotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJdGhpcy5wbGFjZUhvbGRlciA9IHBsYWNlSG9sZGVyOyAKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQkJc2V0UnVsZShuZXcgTm9uQ29uZmxpY3RpbmdSdWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCXRyeSB7Ci0JCQlpZiggIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpICl7Ci0JCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCXZpZXdlci5yZW1vdmUocGxhY2VIb2xkZXIpOwotCQkJCXZpZXdlci5hZGQocGFyZW50LCBjaGlsZHJlbik7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiggIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpICl7Ci0JCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRUFSQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRUFSQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NWNkYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VBUkNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVtYXBQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgRUFSIG5hdmlnYXRvciBjb250ZW50IHRvIHRoZSBwcm9qZWN0IGV4cGxvcmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBKMkVFQ29udGVudFByb3ZpZGVyIHsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVBUkNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gYVZpZXdlcklkCi0JICovCi0JcHVibGljIEVBUkNvbnRlbnRQcm92aWRlcihTdHJpbmcgYVZpZXdlcklkKSB7Ci0JCXN1cGVyKGFWaWV3ZXJJZCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZmlsdGVyIG91dCBhbnkgbm9uIEFwcGxpY2F0aW9uIEREIG9iamVjdHMgc28gYXMgbm90IHRvIGR1cGxpY2F0ZSBtZXRhIG5vZGVzIGluCi0JICogdGhlIGJpbmFyeSBtb2R1bGVzIGNhc2UuCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBhUGFyZW50RWxlbWVudCkgewotCQlpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdClhUGFyZW50RWxlbWVudDsKLQkJCVN0cmluZyBlbWZQYWNrYWdlID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpLmdldE5zVVJJKCk7Ci0JCQlpZiAoIWVtZlBhY2thZ2UuZXF1YWxzKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSYmCi0JCQkJCSFlbWZQYWNrYWdlLmVxdWFscyhDb21tb25QYWNrYWdlLmVOU19VUkkpJiYhZW1mUGFja2FnZS5lcXVhbHMoTW9kdWxlbWFwUGFja2FnZS5lTlNfVVJJKSkKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFtde307Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKGFQYXJlbnRFbGVtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmMzMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRk1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFTUZNb2RlbE1hbmFnZXIgewotCXByaXZhdGUgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIGZpbmFsIEVNRlJvb3RPYmplY3RQcm92aWRlciBwcm92aWRlcjsKLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0W10gZ2V0TW9kZWxzKCk7Ci0JcHVibGljIGZpbmFsIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQlwdWJsaWMgZmluYWwgRU1GUm9vdE9iamVjdFByb3ZpZGVyIGdldEVNRlJvb3RPYmplY3RQcm92aWRlcigpewotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCXB1YmxpYyBFTUZNb2RlbE1hbmFnZXIoSVByb2plY3QgYVByb2plY3QsIEVNRlJvb3RPYmplY3RQcm92aWRlciBhUHJvdmlkZXIpIHsKLQkJcHJvamVjdCA9IGFQcm9qZWN0OwotCQlwcm92aWRlciA9IGFQcm92aWRlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhJUHJvamVjdCBhZmZlY3RlZFByb2plY3QpIHsKLQkJcHJvdmlkZXIubm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JfQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc3Bvc2UoKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZNb2RlbE1hbmFnZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmJkYTE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZNb2RlbE1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVNRk1vZGVsTWFuYWdlckZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgRU1GTW9kZWxNYW5hZ2VyIGNyZWF0ZUVNRk1vZGVsTWFuYWdlcihJUHJvamVjdCBwcm9qZWN0LCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJYm9vbGVhbiBmbGV4aWJsZSA9ICAoTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpICE9IG51bGwpOwotCQlFTUZNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJaWYgKGZsZXhpYmxlKQotCQkJbW9kZWxNYW5hZ2VyID0gbmV3IEZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyKHByb2plY3QscHJvdmlkZXIpOwotCQllbHNlCi0JCQltb2RlbE1hbmFnZXIgPSBuZXcgTm9uRmxleGlibGVFTUZNb2RlbE1hbmFnZXIocHJvamVjdCxwcm92aWRlcik7Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GUm9vdE9iamVjdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYzMzQ1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GUm9vdE9iamVjdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgRU1GUm9vdE9iamVjdE1hbmFnZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0KLQotCi0JcHJpdmF0ZSBmaW5hbCBNYXAgcHJvamVjdEVkaXRNb2RlbHMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgZmluYWwgTWFwIHByb2plY3RSb290T2JqZWN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIGZpbmFsIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciB7Ci0JCXZvaWQgb25SZWZyZXNoKE9iamVjdCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEVNRlJvb3RPYmplY3RNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHByb2plY3RFZGl0TW9kZWxzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbnVsbDsKLQkJT2JqZWN0W10ga2V5cyA9IHByb2plY3RFZGl0TW9kZWxzLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBwcm9qZWN0RWRpdE1vZGVscy5yZW1vdmUoa2V5c1tpXSk7Ci0JCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQllZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJvb3RPYmplY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJT2JqZWN0IHJvb3RPYmplY3QgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHByb2plY3RSb290T2JqZWN0cykgewotCQkJcm9vdE9iamVjdCA9IHByb2plY3RSb290T2JqZWN0cy5nZXQocHJvamVjdCk7Ci0KLQkJCWlmIChyb290T2JqZWN0ID09IG51bGwgfHwgKChFT2JqZWN0KSByb290T2JqZWN0KS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEVkaXRNb2RlbEZvclByb2plY3QocHJvamVjdCk7Ci0JCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXJvb3RPYmplY3QgPSBlZGl0TW9kZWwuZ2V0UHJpbWFyeVJvb3RPYmplY3QoKTsKLQkJCQkJcHJvamVjdFJvb3RPYmplY3RzLnB1dChwcm9qZWN0LCByb290T2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3RPYmplY3Q7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHByb2plY3RFZGl0TW9kZWxzKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBwcm9qZWN0RWRpdE1vZGVscy5nZXQocHJvamVjdCk7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZiAoZWRpdE1vZGVsID09IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlhcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJCWVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGFydGlmYWN0RWRpdC5nZXRBZGFwdGVyKEVkaXRNb2RlbC5jbGFzcyk7Ci0JCQkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQllZGl0TW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJCQkJYWRkTWFwcGluZyhwcm9qZWN0LCBlZGl0TW9kZWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0IT1udWxsKQotCQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZyhJUHJvamVjdCBwcm9qZWN0LCBFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCXByb2plY3RFZGl0TW9kZWxzLnB1dChwcm9qZWN0LCBlZGl0TW9kZWwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXIjZWRpdE1vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gYW5FdmVudC5nZXRFZGl0TW9kZWwoKS5nZXRQcm9qZWN0KCk7Ci0JCXN3aXRjaCAoYW5FdmVudC5nZXRFdmVudENvZGUoKSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRSA6Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UgOiB7Ci0JCQkJT2JqZWN0IG9sZFJvb3RPYmplY3QgPSBwcm9qZWN0Um9vdE9iamVjdHMucmVtb3ZlKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJaWYgKG9sZFJvb3RPYmplY3QgIT0gbnVsbCkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlNBVkUgOiB7Ci0JCQkJT2JqZWN0IG9sZFJvb3RPYmplY3QgPSBwcm9qZWN0Um9vdE9iamVjdHMuZ2V0KGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJaWYgKG9sZFJvb3RPYmplY3QgPT0gbnVsbCkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFIDoKLQkJCQlkaXNwb3NlQ2FjaGUoYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgbGlzdGVuZXJzLnNpemUoKTsgKyt4KSB7Ci0JCQlJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciByZWZyZXNoSGFuZGxlciA9IChJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lcikgbGlzdGVuZXJzLmdldCh4KTsKLQkJCXJlZnJlc2hIYW5kbGVyLm9uUmVmcmVzaChhUHJvamVjdCk7Ci0JCX0KLQotCX0KLQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCi0JCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbHRhLmFjY2VwdChFTUZSb290T2JqZWN0TWFuYWdlci50aGlzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBzd3RlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHN3dGUpOwotCQkJfSBjYXRjaCAoU1dURXJyb3Igc3d0ZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihzd3RlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJYm9vbGVhbiBwcm9qZWN0T3BlblN0YXRlQ2hhbmdlZCA9ICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApOwotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwgcHJvamVjdE9wZW5TdGF0ZUNoYW5nZWQpCi0JCQkJCQlkaXNwb3NlQ2FjaGUoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlQ2FjaGUoSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0KSB7Ci0JCXN5bmNocm9uaXplZCAocHJvamVjdEVkaXRNb2RlbHMpIHsKLQkJCXByb2plY3RSb290T2JqZWN0cy5yZW1vdmUoYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSRU1PVklORyBlZGl0IG1vZGVsOiAiICsgYWZmZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgcHJvamVjdEVkaXRNb2RlbHMucmVtb3ZlKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUkVNT1ZFRCBlZGl0IG1vZGVsICIgKyBhZmZlY3RlZFByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJCWVkaXRNb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQllZGl0TW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUkVMRUFTRUQgZWRpdCBtb2RlbCAiICsgYWZmZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZyZXNoSGFuZGxlckxpc3RlbmVyKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGdldExpc3RlbmVycygpKSB7Ci0JCQlpZiAoYUxpc3RlbmVyICE9IG51bGwgJiYgIWdldExpc3RlbmVycygpLmNvbnRhaW5zKGFMaXN0ZW5lcikpCi0JCQkJZ2V0TGlzdGVuZXJzKCkuYWRkKGFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWZyZXNoSGFuZGxlckxpc3RlbmVyKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgewotCQkJbGlzdGVuZXJzLnJlbW92ZShhTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDQ6NDI6NTggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GUm9vdE9iamVjdFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GUm9vdE9iamVjdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOTczYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBFTUZSb290T2JqZWN0UHJvdmlkZXIgaW1wbGVtZW50cyAgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvcnsKLQlwcml2YXRlIGZpbmFsIEhhc2hNYXAgZW1mTW9kZWxDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIElSZWZyZXNoSGFuZGxlckxpc3RlbmVyIHsKLQkJdm9pZCBvblJlZnJlc2goT2JqZWN0IGVsZW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEVNRlJvb3RPYmplY3RQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRNb2RlbHMoSVByb2plY3QgcHJvamVjdCl7Ci0JCXRyeSB7Ci0JCQlFTUZNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJCXN5bmNocm9uaXplZCAoZW1mTW9kZWxDYWNoZSkgewotCQkJCW1vZGVsTWFuYWdlciA9IChFTUZNb2RlbE1hbmFnZXIpIGVtZk1vZGVsQ2FjaGUuZ2V0KHByb2plY3QpOwotCQkJCWlmIChtb2RlbE1hbmFnZXIgPT0gbnVsbCkgewotCQkJCQltb2RlbE1hbmFnZXI9IEVNRk1vZGVsTWFuYWdlckZhY3RvcnkuY3JlYXRlRU1GTW9kZWxNYW5hZ2VyKHByb2plY3QsdGhpcykgOwotCQkJCQllbWZNb2RlbENhY2hlLnB1dChwcm9qZWN0LG1vZGVsTWFuYWdlcik7Ci0JCQkJfQotCQkJfQotCQlyZXR1cm4gbW9kZWxNYW5hZ2VyLmdldE1vZGVscygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0xvYWRlZE1vZGVscyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN5bmNocm9uaXplZCAoZW1mTW9kZWxDYWNoZSkgewotCQkJcmV0dXJuIGVtZk1vZGVsQ2FjaGUuZ2V0KHByb2plY3QpICE9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQotCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWx0YS5hY2NlcHQoRU1GUm9vdE9iamVjdFByb3ZpZGVyLnRoaXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIHN3dGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Ioc3d0ZSk7Ci0JCQl9IGNhdGNoIChTV1RFcnJvciBzd3RlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHN3dGUpOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCWJvb2xlYW4gcHJvamVjdE9wZW5TdGF0ZUNoYW5nZWQgPSAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwKTsKLQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8IHByb2plY3RPcGVuU3RhdGVDaGFuZ2VkKSB7Ci0JCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCQkJCWRpc3Bvc2UocHJvamVjdCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2UoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKSByZXR1cm47Ci0JCUVNRk1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSAoRU1GTW9kZWxNYW5hZ2VyKSBlbWZNb2RlbENhY2hlLnJlbW92ZShwcm9qZWN0KTsKLQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQltb2RlbE1hbmFnZXIuZGlzcG9zZSgpOwotCQkJbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJRU1GTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCU9iamVjdFtdIGtleXMgPSBlbWZNb2RlbENhY2hlLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQltb2RlbE1hbmFnZXIgPSAoRU1GTW9kZWxNYW5hZ2VyKSBlbWZNb2RlbENhY2hlLnJlbW92ZShrZXlzW2ldKTsKLQkJCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1vZGVsTWFuYWdlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVByb2plY3QgYVByb2plY3QpIHsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBsaXN0ZW5lcnMuc2l6ZSgpOyArK3gpIHsKLQkJCUlSZWZyZXNoSGFuZGxlckxpc3RlbmVyIHJlZnJlc2hIYW5kbGVyID0gKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyKSBsaXN0ZW5lcnMuZ2V0KHgpOwotCQkJcmVmcmVzaEhhbmRsZXIub25SZWZyZXNoKGFQcm9qZWN0KTsKLQkJfQotCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFJlZnJlc2hIYW5kbGVyTGlzdGVuZXIoSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAoZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWlmIChhTGlzdGVuZXIgIT0gbnVsbCAmJiAhZ2V0TGlzdGVuZXJzKCkuY29udGFpbnMoYUxpc3RlbmVyKSkKLQkJCQlnZXRMaXN0ZW5lcnMoKS5hZGQoYUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIoSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgNDo0Mjo1OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldExpc3RlbmVycygpIHsKLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0ZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNmM2NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0ZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBGbGV4aWJsZUVNRk1vZGVsTWFuYWdlciBleHRlbmRzIEVNRk1vZGVsTWFuYWdlciBpbXBsZW1lbnRzIEVkaXRNb2RlbExpc3RlbmVyewotCi0JcHJpdmF0ZSBMaXN0IHJvb3RPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVCA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0IGFydGlmYWN0RWRpdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBmaW5hbCBNYXAgYXJ0aWZhY3RFZGl0VG9Sb290T2JqZWN0ID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgRmxleGlibGVFTUZNb2RlbE1hbmFnZXIoSVByb2plY3QgYVByb2plY3QsIEVNRlJvb3RPYmplY3RQcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihhUHJvamVjdCxwcm92aWRlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNnZXRNb2RlbHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRNb2RlbHMoKSB7Ci0JCXRyeSB7Ci0JCQotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCWlmICggcHJvamVjdD09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuIEVNUFRZX09CSkVDVDsKLQkJCQotCQkJc3luY2hyb25pemVkIChyb290T2JqZWN0cykgewotCQkJCWlmICghaXNWYWxpZChyb290T2JqZWN0cykpIHsKLQkJCQkJcm9vdE9iamVjdHMgPSBnZXRSb290T2JqZWN0cygpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlpZiAocm9vdE9iamVjdHMgIT0gbnVsbCkgewotCQkJIHJldHVybiByb290T2JqZWN0cy50b0FycmF5KCkgOwotCQl9Ci0JCXJldHVybiBFTVBUWV9PQkpFQ1Q7Ci0JCQkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKExpc3Qgcm9vdE9iamVjdHMpIHsKLQkJaWYgKHJvb3RPYmplY3RzID09IG51bGwgfHwgcm9vdE9iamVjdHMuc2l6ZSgpPT0wKSAKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgeD0wOyB4PCByb290T2JqZWN0cy5zaXplKCk7ICsreCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHJvb3RPYmplY3RzLmdldCh4KTsKLQkJCWlmIChlT2JqZWN0ICE9IG51bGwgJiYgZU9iamVjdC5lUmVzb3VyY2UoKSA9PSBudWxsKSAKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRSb290T2JqZWN0cygpIHsKLQkgIAkgIExpc3QgYXJ0aWZhY3RzID0gZ2V0QXJ0aWZhY3RFZGl0cygpOwotCSAgCSAgTGlzdCBmbGV4aWJsZU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAJICBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkgIAkgIEVPYmplY3QgY29udGVudE1vZGVsUm9vdCA9IG51bGw7Ci0JICAJICBmb3IgKGludCB4PTA7IHg8IGFydGlmYWN0cy5zaXplKCk7ICsreCkgewotCSAgCSAgCSBhcnRpZmFjdEVkaXQgPSAoQXJ0aWZhY3RFZGl0KWFydGlmYWN0cy5nZXQoeCk7Ci0JICAJICAgICBjb250ZW50TW9kZWxSb290ID0gYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsKLQkJCSBpZiAoY29udGVudE1vZGVsUm9vdCAhPSBudWxsKSB7Ci0JCSAgCSAgICAgZmxleGlibGVPYmplY3RzLmFkZChjb250ZW50TW9kZWxSb290KTsKLQkJICAJICAgICBpZiAoIXJvb3RPYmplY3RzLmNvbnRhaW5zKGNvbnRlbnRNb2RlbFJvb3QpKQotCQkgIAkgICAgCSByb290T2JqZWN0cy5hZGQoY29udGVudE1vZGVsUm9vdCk7Ci0JCSAgCSAgICAgYXJ0aWZhY3RFZGl0VG9Sb290T2JqZWN0LnB1dChhcnRpZmFjdEVkaXQsY29udGVudE1vZGVsUm9vdCk7Ci0JCQkgfQotCSAgCSAgfQotCSAgCSAgcmV0dXJuIGZsZXhpYmxlT2JqZWN0czsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXJ0aWZhY3RFZGl0cygpIHsKLQkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJc3luY2hyb25pemVkIChhcnRpZmFjdEVkaXRzKSB7Ci0JCQlpZiAoYXJ0aWZhY3RFZGl0cy5zaXplKCkgPT0wICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCQl0cnl7Ci0JCQkJCWFydGlmYWN0RWRpdCA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJCQlpZihhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJCQkJYXJ0aWZhY3RFZGl0cy5hZGQoYXJ0aWZhY3RFZGl0KTsKLQkJCQkJCWFydGlmYWN0RWRpdC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0czsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuRU1GTW9kZWxNYW5hZ2VyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChhcnRpZmFjdEVkaXRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IHg9MDsgeDwgYXJ0aWZhY3RFZGl0cy5zaXplKCk7ICsreCkgewotCQkJCUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoQXJ0aWZhY3RFZGl0KWFydGlmYWN0RWRpdHMuZ2V0KHgpOwotCQkJCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJCQlhcnRpZmFjdEVkaXQucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9Ci0JCXJvb3RPYmplY3RzLmNsZWFyKCk7Ci0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyI2VkaXRNb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCUlQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCA9IGFuRXZlbnQuZ2V0RWRpdE1vZGVsKCkuZ2V0UHJvamVjdCgpOwotCQkKLQkJc3dpdGNoIChhbkV2ZW50LmdldEV2ZW50Q29kZSgpKSB7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlVOTE9BREVEX1JFU09VUkNFIDoKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSA6IHsKLQkJCQlPYmplY3Qgb2xkUm9vdE9iamVjdCA9IHJlbW92ZVJvb3RPYmplY3QoYW5FdmVudC5nZXRFZGl0TW9kZWwoKSxhZmZlY3RlZFByb2plY3QpOwotCQkJCWdldFJvb3RPYmplY3RzKCk7Ci0JCQkJaWYgKG9sZFJvb3RPYmplY3QgIT0gbnVsbCkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5TQVZFIDogewotCQkJCU9iamVjdCBvbGRSb290T2JqZWN0ID0gZ2V0Um9vdE9iamVjdChhbkV2ZW50LmdldEVkaXRNb2RlbCgpLGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJaWYgKG9sZFJvb3RPYmplY3QgPT0gbnVsbCkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFIDoKLQkJCQkJZGlzcG9zZShhbkV2ZW50LmdldEVkaXRNb2RlbCgpLGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQkKLQl9Ci0KLQkKLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0TW9kZWwKLQkgKiBAcGFyYW0gYWZmZWN0ZWRQcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFJvb3RPYmplY3QoRWRpdE1vZGVsIGVkaXRNb2RlbCwgSVByb2plY3QgcHJvamVjdCkgewotCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gZ2V0QXJ0aWZhY3RFZGl0KGVkaXRNb2RlbCxwcm9qZWN0KTsKLQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYXJ0aWZhY3RFZGl0VG9Sb290T2JqZWN0LmdldChhcnRpZmFjdEVkaXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0TW9kZWwKLQkgKiBAcGFyYW0gYWZmZWN0ZWRQcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IHJlbW92ZVJvb3RPYmplY3QoRWRpdE1vZGVsIGVkaXRNb2RlbCwgSVByb2plY3QgcHJvamVjdCkgewotCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gZ2V0QXJ0aWZhY3RFZGl0KGVkaXRNb2RlbCxwcm9qZWN0KTsKLQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQlyb290T2JqZWN0cy5yZW1vdmUoYXJ0aWZhY3RFZGl0VG9Sb290T2JqZWN0LmdldChhcnRpZmFjdEVkaXQpKTsKLQkJCWFydGlmYWN0RWRpdFRvUm9vdE9iamVjdC5yZW1vdmUoYXJ0aWZhY3RFZGl0KTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZmZlY3RlZFByb2plY3QKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2UoIEVkaXRNb2RlbCBlZGl0TW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IGdldEFydGlmYWN0RWRpdChlZGl0TW9kZWwscHJvamVjdCk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJYXJ0aWZhY3RFZGl0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJYXJ0aWZhY3RFZGl0cy5yZW1vdmUoYXJ0aWZhY3RFZGl0KTsKLQkJCWFydGlmYWN0RWRpdFRvUm9vdE9iamVjdC5yZW1vdmUoYXJ0aWZhY3RFZGl0KTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0KEVkaXRNb2RlbCBlZGl0TW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGFydGlmYWN0RWRpdHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgeD0wOyB4PGFydGlmYWN0RWRpdHMuc2l6ZSgpOyArK3gpIHsKLQkJCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKEFydGlmYWN0RWRpdClhcnRpZmFjdEVkaXRzLmdldCh4KTsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0Lmhhc0VkaXRNb2RlbChlZGl0TW9kZWwpKSAKLQkJCQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0lKMkVFTmF2aWdhdG9yQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSUoyRUVOYXZpZ2F0b3JDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkMGIwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSUoyRUVOYXZpZ2F0b3JDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdWwgNywgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJSjJFRU5hdmlnYXRvckNvbnN0YW50cyB7Ci0KLQlTdHJpbmcgVklFV0VSX0lEID0gIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiOy8vJE5PTi1OTFMtMSQgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSUoyRUVXaXphcmRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRVdpemFyZENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTk0M2MyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRVdpemFyZENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudEltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgQ3JlYXRpb24gSURzIGFyZSB1c2VkIGZvciBhY3Rpdml0eSBmaWx0ZXJpbmcgYW5kIGFzIHN1Y2ggYXJlIGRlY2xhcmVkIG9uIHRoZSBpbmRpdmlkdWFsCi0gKiB3aXphcmRzLiBBbGwgb3RoZXIgSURzIG11c3QgYmUgbWFpbnRhaW5lZCB0byBzdGF5IGluIHN5bmMgd2l0aCB0aGUgdmFsdWVzIGZvdW5kIGluIHRoZSBwbHVnaW4ueG1sCi0gKiBmaWxlcyBvZiB0aGUgcmVzcGVjdGl2ZSBtb2R1bGUgVUkgcGx1Z2lucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSjJFRVdpemFyZENvbnN0YW50cyB7Ci0KLS8vCVN0cmluZyBORVdfRUFSX1BST0pFQ1RfV0laQVJEX0lEID0gRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuV0laQVJEX0lEOwotCi0vLwlTdHJpbmcgTkVXX0FQUENMSUVOVF9QUk9KRUNUX1dJWkFSRF9JRCA9IEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLldJWkFSRF9JRDsKLS8vCi0vLwlTdHJpbmcgTkVXX0pDQV9QUk9KRUNUX1dJWkFSRF9JRCA9IENvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uV2l6YXJkLldJWkFSRF9JRDsKLS8vCi0vLwlTdHJpbmcgTkVXX0VKQl9QUk9KRUNUX1dJWkFSRF9JRCA9IEVKQkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLldJWkFSRF9JRDsKLS8vCi0vLwlTdHJpbmcgTkVXX1dFQl9QUk9KRUNUX1dJWkFSRF9JRCA9IFdlYkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLldJWkFSRF9JRDsKLQotCVN0cmluZyBORVdfRU5URVJQUklTRV9CRUFOX1dJWkFSRF9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudWkudXRpbC5jcmVhdGVFSkJXaXphcmQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgSU1QT1JUX0VBUl9XSVpBUkRfSUQgPSBFQVJDb21wb25lbnRJbXBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIElNUE9SVF9BUFBDTElFTlRfV0laQVJEX0lEID0gQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBJTVBPUlRfQ09OTkVDVE9SX1dJWkFSRF9JRCA9IENvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgSU1QT1JUX0VOVEVSUFJJU0VfQkVBTl9XSVpBUkRfSUQgPSAib3JnLmVjbGlwc2UuanN0LmVqYi51aS5pbnRlcm5hbC53aXphcmQuRUpCQ29tcG9uZW50SW1wb3J0V2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIElNUE9SVF9XRUJfTU9EVUxFX1dJWkFSRF9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBFWFBPUlRfV0VCX01PRFVMRV9XSVpBUkRfSUQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEV4cG9ydFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBJTVBPUlRfVVRJTElUWV9KQVJfV0laQVJEX0lEID0gSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIEVYUE9SVF9FQVJfV0laQVJEX0lEID0gRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBFWFBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9JRCA9IEFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgRVhQT1JUX0NPTk5FQ1RPUl9XSVpBUkRfSUQgPSBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIEVYUE9SVF9FTlRFUlBSSVNFX0JFQU5fV0laQVJEX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkRUpCQ29tcG9uZW50RXhwb3J0V2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUFjdGlvblByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYWEwYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5PcGVuSjJFRVJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25BY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTWVudUNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEoyRUVBY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyICB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUkVTT1VSQ0VfQ0xBU1MgPSBJUmVzb3VyY2UuY2xhc3M7Ci0JCi0JcHJpdmF0ZSBPcGVuSjJFRVJlc291cmNlQWN0aW9uIG9wZW5BY3Rpb247IAotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBKMkVFQWN0aW9uUHJvdmlkZXIoKSB7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5leHRlbnNpb25zLk5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgYUNvbmZpZykgeyAKLQkJb3BlbkFjdGlvbiA9IG5ldyBPcGVuSjJFRVJlc291cmNlQWN0aW9uKCk7IAotCQkKLS8vCQlyZW5hbWVBY3Rpb24gPSBuZXcgSjJFRVJlbmFtZUFjdGlvbihhQ29uZmlnLmdldFZpZXdTaXRlKCksIGFDb25maWcuZ2V0Vmlld1NpdGUoKS5nZXRTaGVsbCgpKTsKLQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLklDb21tb25BY3Rpb25Qcm92aWRlciNzZXRBY3Rpb25Db250ZXh0KG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEFjdGlvbkNvbnRleHQgYUNvbnRleHQpIHsKLQkJCi0JCWlmIChhQ29udGV4dCAhPSBudWxsICYmIGFDb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYUNvbnRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotLy8JCQlyZW5hbWVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCi0JCQlPYmplY3RbXSBhcnJheSA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlpZiAoaXNVdGlsaXR5SmFycyhhcnJheSkpIHsKLQkJCQlKMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlciB1dGlsaXR5SmFySXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJCQlMaXN0IG5ld1NlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgPSAoSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIpIGFycmF5W2ldOwotCQkJCQluZXdTZWxlY3Rpb24uYWRkQWxsKHV0aWxpdHlKYXJJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4obnVsbCkpOwotCQkJCX0KLQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pOwotCQkJfQotCQkJLy9nZW5lcmljRGVsZXRlLnNlbGVjdGlvbkNoYW5nZWQoZ2VuZXJpY0RlbGV0ZSwgc2VsZWN0aW9uKTsKLQkJfQotCQlzdXBlci5zZXRDb250ZXh0KGFDb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmFjdGlvbnMuSUNvbW1vbkFjdGlvblByb3ZpZGVyI2ZpbGxBY3Rpb25CYXJzKG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIHRoZUFjdGlvbkJhcnMpIHsKLS8vCQlpZiAoZ2VuZXJpY0RlbGV0ZS5pc0VuYWJsZWQoKSkKLS8vCQkJdGhlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIGdlbmVyaWNEZWxldGUpOwotCQlpZihvcGVuQWN0aW9uLmlzRW5hYmxlZCgpKSAKLQkJCXRoZUFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJQ29tbW9uQWN0aW9uQ29uc3RhbnRzLk9QRU4sIG9wZW5BY3Rpb24pOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLklDb21tb25BY3Rpb25Qcm92aWRlciNmaWxsQ29udGV4dE1lbnUob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIGFNZW51KSB7Ci0JCWlmIChnZXRDb250ZXh0KCk9PW51bGwgfHwgZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmKCFhZGFwdHNUb1Jlc291cmNlKHNlbGVjdGlvbi50b0FycmF5KCkpKSB7Ci0JCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQkJCWlmIChvcGVuQWN0aW9uLmlzRW5hYmxlZCgpKQotCQkJCWFNZW51Lmluc2VydEFmdGVyKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX09QRU4sIG9wZW5BY3Rpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkYXB0c1RvUmVzb3VyY2UoT2JqZWN0W10gb2JqZWN0cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKG9iamVjdHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAob2JqZWN0c1tpXSBpbnN0YW5jZW9mIElBZGFwdGFibGUgJiYgKCgoSUFkYXB0YWJsZSlvYmplY3RzW2ldKS5nZXRBZGFwdGVyKElSRVNPVVJDRV9DTEFTUykgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc1V0aWxpdHlKYXJzKE9iamVjdFtdIGl0ZW1zKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGl0ZW1zW2ldID09IG51bGwgfHwgaXRlbXNbaV0uZ2V0Q2xhc3MoKSAhPSBKMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlci5jbGFzcykKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0gCi0JIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb21wYXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkMmFiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDIyLCAyMDA1Ci0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcjsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCXByaXZhdGUgSjJFRVZpZXdlclNvcnRlciBqMmVlVmlld1NvcnRlciA9IG5ldyBKMkVFVmlld2VyU29ydGVyKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEudXRpbC5Db21wYXJhdG9yI2NvbXBhcmUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHByb3ZpZGVySGVscGVyTGVmdEFyZyA9IG51bGw7Ci0JCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciBwcm92aWRlckhlbHBlclJpZ2h0QXJnID0gbnVsbDsKLQotCQlpZiAobzEgaW5zdGFuY2VvZiBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpCi0JCQlwcm92aWRlckhlbHBlckxlZnRBcmcgPSAoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBvMTsKLQkJaWYgKG8yIGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcHJvdmlkZXJIZWxwZXJSaWdodEFyZyA9IChKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpIG8yOwotCi0KLQkJLyogaWYgYm90aCBhcmd1bWVudHMgYXJlIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcnMgKi8KLQkJaWYgKHByb3ZpZGVySGVscGVyTGVmdEFyZyAhPSBudWxsICYmIHByb3ZpZGVySGVscGVyUmlnaHRBcmcgIT0gbnVsbCkKLQkJCXJldHVybiBwcm92aWRlckhlbHBlckxlZnRBcmcuZ2V0VGV4dCgpLmNvbXBhcmVUbyhwcm92aWRlckhlbHBlclJpZ2h0QXJnLmdldFRleHQoKSk7Ci0JCS8qIGlmIGV4YWN0bHkgb25lIG9mIHRoZSBhcmd1bWVudHMgYXJlIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcnMgKi8KLQkJZWxzZSBpZiAocHJvdmlkZXJIZWxwZXJMZWZ0QXJnICE9IG51bGwgJiYgbzIgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikKLQkJCXJldHVybiAxOwotCQllbHNlIGlmIChwcm92aWRlckhlbHBlclJpZ2h0QXJnICE9IG51bGwgJiYgbzEgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuIGoyZWVWaWV3U29ydGVyLmNvbXBhcmUobnVsbCwgbzEsIG8yKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEudXRpbC5Db21wYXJhdG9yI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBKMkVFQ29tcGFyYXRvcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiOWZjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5CZWFuQ2xhc3NQcm92aWRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1ldGhvZHNQcm92aWRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZSb290T2JqZWN0UHJvdmlkZXIuSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbi5KMkVFTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5EeW5hbWljQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCi0JcHJpdmF0ZSBmaW5hbCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcm9vdE9iamVjdFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcjsKLQlwcml2YXRlIE1ldGhvZHNQcm92aWRlckRlbGVnYXRlIGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgdmlld2VySWQgPSBudWxsOwotCXByaXZhdGUgQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlcjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcm9vdE9iamVjdFByb3ZpZGVyID0gbmV3IEVNRlJvb3RPYmplY3RQcm92aWRlcigpOwotCQlyb290T2JqZWN0UHJvdmlkZXIuYWRkUmVmcmVzaEhhbmRsZXJMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEoyRUVDb250ZW50UHJvdmlkZXIoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlyb290T2JqZWN0UHJvdmlkZXIgPSBuZXcgRU1GUm9vdE9iamVjdFByb3ZpZGVyKCk7Ci0JCXVwZGF0ZUNvbnRlbnRQcm92aWRlcnMoYVZpZXdlcklkKTsKLQkJcm9vdE9iamVjdFByb3ZpZGVyLmFkZFJlZnJlc2hIYW5kbGVyTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGFuSW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihhbklucHV0RWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgYVBhcmVudEVsZW1lbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUgJiYgIShhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpICYmICEoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXIpCi0JCQkJJiYgIShhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikpIHsKLQkJCXByb2plY3QgPSAoSVByb2plY3QpIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhUGFyZW50RWxlbWVudCk7Ci0KLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkvLyBWZXJpZnkgaWYgdGhlIG1vZGVsICppcyBiZWluZyoKLQkJCQkvLyBsb2FkZWQgYW5kIGp1c3QgcmV0dXJuIHRoZSBwbGFjZSBob2xkZXIKLQkJCQlpZiAoTG9hZGluZ0RETm9kZS5pc0JlaW5nTG9hZGVkKHByb2plY3QpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChMb2FkaW5nREROb2RlLmNyZWF0ZVBsYWNlSG9sZGVyKHByb2plY3QpKTsKLQotCQkJCQkvLyBWZXJpZnkgaWYgdGhlIG1vZGVsIGhhcyBiZWVuIGxvYWRlZCwganVzdCByZXR1cm4gaXQKLQkJCQl9IGVsc2UgaWYgKHJvb3RPYmplY3RQcm92aWRlci5oYXNMb2FkZWRNb2RlbHMocHJvamVjdCkpIHsKLQkJCQkJLyogbW9kZWwgYWxyZWFkeSBsb2FkZWQsIGp1c3QgcmV0dXJuIHRoZSBtb2RlbCAqLwotCQkJCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChyb290T2JqZWN0UHJvdmlkZXIuZ2V0TW9kZWxzKHByb2plY3QpKSk7Ci0KLQkJCQkJLy8gT3RoZXJ3aXNlIHJldHVybiBhIHBsYWNlIGhvbGRlciBub2RlIGFuZCBzdGFydCBsb2FkaW5nCi0JCQkJCS8vIGpvYgotCQkJCX0gZWxzZSB7Ci0JCQkJCUxvYWRpbmdERE5vZGUgcGxhY2VIb2xkZXIgPSBMb2FkaW5nREROb2RlLmNyZWF0ZVBsYWNlSG9sZGVyKHByb2plY3QpOwotCQkJCQkvKgotCQkJCQkgKiB3ZSBuZWVkIHRvIGxvYWQgdGhlIG1vZGVsOyBwb3NzaWJsZSBsb25nIHJ1bm5pbmcKLQkJCQkJICogb3BlcmF0aW9uCi0JCQkJCSAqLwotCQkJCQlpZiAoTG9hZGluZ0RETm9kZS5jYW5CZWdpbkxvYWRpbmcocHJvamVjdCkpCi0JCQkJCQluZXcgTG9hZGluZ0RESm9iKHZpZXdlciwgcGxhY2VIb2xkZXIsIChJQWRhcHRhYmxlKSBhUGFyZW50RWxlbWVudCwgcm9vdE9iamVjdFByb3ZpZGVyKS5zY2hlZHVsZSgpOwotCQkJCQljaGlsZHJlbi5hZGQocGxhY2VIb2xkZXIpOwotCQkJCX0KLQotCQkJfQotCQl9IGVsc2UgaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihhUGFyZW50RWxlbWVudCkpCi0JCQlyZXR1cm4gZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oYVBhcmVudEVsZW1lbnQpOwotCQllbHNlIC8qIGlmIChpc0VNRkVkaXRPYmplY3QoYVBhcmVudEVsZW1lbnQpKSAqL3sKLQkJCU9iamVjdFtdIHNpYmxpbmdzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc2libGluZ3MgPSBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihhUGFyZW50RWxlbWVudCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUoyRUVOYXZpZ2F0b3JQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwkJCX0KLQkJCWlmIChzaWJsaW5ncyAhPSBudWxsKQotCQkJCWNoaWxkcmVuLmFkZEFsbChBcnJheXMuYXNMaXN0KHNpYmxpbmdzKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5wcm92aWRlc0NvbnRlbnRGb3Iob2JqZWN0KSkKLQkJCXJldHVybiBkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJT2JqZWN0IHBhcmVudCA9IGRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJcGFyZW50ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBvYmplY3QpOwotCQl9IGVsc2UgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBCZWFuQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCQlwYXJlbnQgPSAoKEJlYW5DbGFzc1Byb3ZpZGVySGVscGVyKSBvYmplY3QpLmdldEVqYigpOwotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXBhcmVudCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqZWN0KTsJCi0JCQl9Ci0JCX0gCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJcm9vdE9iamVjdFByb3ZpZGVyLnJlbW92ZVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIodGhpcyk7Ci0JCWRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJcm9vdE9iamVjdFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIuZGlzcG9zZSgpOwotCi0JfQotCi0JLyoKLQkgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUucHJvdmlkZXNDb250ZW50Rm9yKGVsZW1lbnQpKQotCQkJcmV0dXJuIGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCQkvKiBlbHNlIGlmIChpc0VNRkVkaXRPYmplY3QoZWxlbWVudCkpICovCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOyAKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFWaWV3ZXIsIE9iamVjdCBhbk9sZElucHV0LCBPYmplY3QgYU5ld0lucHV0KSB7Ci0JCVN0cmluZyBuZXdWaWV3ZXJJZCA9IG51bGw7Ci0JCXZpZXdlciA9IChBYnN0cmFjdFRyZWVWaWV3ZXIpIGFWaWV3ZXI7Ci0JCWlmIChhVmlld2VyIGluc3RhbmNlb2YgQ29tbW9uVmlld2VyKQotCQkJbmV3Vmlld2VySWQgPSAoKENvbW1vblZpZXdlcikgYVZpZXdlcikuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKS5nZXRWaWV3ZXJJZCgpOwotCi0JCWlmIChuZXdWaWV3ZXJJZCAhPSBudWxsICYmICh2aWV3ZXJJZCA9PSBudWxsIHx8ICF2aWV3ZXJJZC5lcXVhbHMobmV3Vmlld2VySWQpKSkKLQkJCXVwZGF0ZUNvbnRlbnRQcm92aWRlcnMobmV3Vmlld2VySWQpOwotCi0JCWRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZChhVmlld2VyLCBhbk9sZElucHV0LCBhTmV3SW5wdXQpOwotCQlkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlci5pbnB1dENoYW5nZWQoYVZpZXdlciwgYW5PbGRJbnB1dCwgYU5ld0lucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlld2VySWQyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRlbnRQcm92aWRlcnMoU3RyaW5nIGFWaWV3ZXJJZCkgewotCi0JCS8qIERpc3Bvc2Ugb2YgdGhlIGV4aXN0aW5nIGNvbnRlbnQgcHJvdmlkZXJzICovCi0JCWlmIChkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyLmRpc3Bvc2UoKTsKLQotCQkvKiBDcmVhdGUgbmV3IGNvbnRlbnQgcHJvdmlkZXJzIHVzaW5nIHRoZSBuZXcgdmlld2VyIGlkICovCi0JCUR5bmFtaWNBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG5ldyBEeW5hbWljQWRhcHRlckZhY3RvcnkoYVZpZXdlcklkKTsKLQkJZGVsZWdhdGVDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpOwotCQlkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlciA9IG5ldyBNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZShhZGFwdGVyRmFjdG9yeSk7Ci0KLQkJLyogUmVtZW1iZXIgdGhlIHZpZXdlciBpZCAqLwotCQl2aWV3ZXJJZCA9IGFWaWV3ZXJJZDsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRlJvb3RPYmplY3RNYW5hZ2VyLklSZWZyZXNoSGFuZGxlckxpc3RlbmVyI29uUmVmcmVzaChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uUmVmcmVzaChmaW5hbCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlVmlld2VyKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkgewotCQkJCSgoQWJzdHJhY3RUcmVlVmlld2VyKSB2aWV3ZXIpLnJlZnJlc2goZWxlbWVudCwgdHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIENyZWF0ZSBhbmQgc2NoZWR1bGUgYSBVSSBKb2IgdG8gdXBkYXRlIHRoZSBOYXZpZ2F0b3IgQ29udGVudCBWaWV3ZXIgKi8KLQkJCQlKb2Igam9iID0gbmV3IFVJSm9iKCJVcGRhdGUgdGhlIE5hdmlnYXRvciBDb250ZW50IFZpZXdlciBKb2IiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCSgoQWJzdHJhY3RUcmVlVmlld2VyKSB2aWV3ZXIpLnJlZnJlc2goZWxlbWVudCwgdHJ1ZSk7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJfQotCQkJCX07Ci0JCQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBuZXcgSVNjaGVkdWxpbmdSdWxlKCkgewotCQkJCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQkJCQkJcmV0dXJuIHJ1bGUgPT0gdGhpczsJCi0JCQkJCX0KLQkJCQkJcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQkJCQkJcmV0dXJuIHJ1bGUgPT0gdGhpczsKLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYgKHJ1bGUgIT0gbnVsbCkgewotCQkJCQlqb2Iuc2V0UnVsZShydWxlKTsKLQkJCQl9Ci0JCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFRU1GQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFRU1GQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxMjgwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUVNRkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDI1LCAyMDA0Ci0gKiAgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFRU1GQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSVJFU09VUkNFX0NMQVNTID0gSVJlc291cmNlLmNsYXNzOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSUZJTEVfQ0xBU1MgPSBJRmlsZS5jbGFzczsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIEVPQkpFQ1RfQ0xBU1MgPSBFT2JqZWN0LmNsYXNzOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKMkVFRU1GQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJaWYgKGFkYXB0ZXJUeXBlID09IElGSUxFX0NMQVNTIHx8IGFkYXB0ZXJUeXBlID09IElSRVNPVVJDRV9DTEFTUykKLQkJCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoRU9iamVjdCkgYWRhcHRhYmxlT2JqZWN0KTsKLQkJCS8vZWxzZSBpZiAoYWRhcHRlclR5cGUgPT0gSVBST0pFQ1RfQ0xBU1MpCi0JCQkvLwlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBhZGFwdGFibGVPYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCi0JICovCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXXtJUkVTT1VSQ0VfQ0xBU1MsIElGSUxFX0NMQVNTfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkM2UwMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5EeW5hbWljQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tbW9uTGFiZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEoyRUVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgSjJFRUxhYmVsUHJvdmlkZXIoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKGFWaWV3ZXJJZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgYVZpZXdlcklkKSB7Ci0JCWRlbGVnYXRlTGFiZWxQcm92aWRlciA9IG5ldyBKMkVFQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKG5ldyBEeW5hbWljQWRhcHRlckZhY3RvcnkoYVZpZXdlcklkKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5leHRlbnNpb25zLklDb21tb25MYWJlbFByb3ZpZGVyI2dldERlc2NyaXB0aW9uKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihPYmplY3QgYW5FbGVtZW50KSB7Ci0JCWlmIChhbkVsZW1lbnQgIT0gbnVsbCAmJiBhbkVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgYW5FbGVtZW50OwotCQkJaWYgKENvbW1vblV0aWwuaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoZU9iaiwgdHJ1ZSAvKiBpbmNsdWRlIGVhcnMgKi8pKSB7Ci0JCQkJSVByb2plY3QgcGFyZW50ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVPYmopOwotCQkJCWlmKGVPYmouZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcGF0aCA9IG5ldyBQYXRoKGVPYmouZVJlc291cmNlKCkuZ2V0VVJJKCkudG9TdHJpbmcoKSkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQkJCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCQkJcmV0dXJuIHBhdGg7Ci0JCQkJCWludCBzdGFydEluZGV4ID0gcGF0aC5pbmRleE9mKHBhcmVudC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQlyZXR1cm4gLTEgPT0gc3RhcnRJbmRleCA/IHBhdGggOiBwYXRoLnN1YnN0cmluZyhzdGFydEluZGV4KTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZ2V0VGV4dChlT2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmVxdWFscyhvYmopOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZCgpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcmV0dXJuICgoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGUpCi0JCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiamFyX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBMb2FkaW5nREROb2RlKQotCQkJcmV0dXJuICgoTG9hZGluZ0RETm9kZSllbGVtZW50KS5nZXRJbWFnZSgpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGRlbGVnYXRlTGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpCi0JCQlyZXR1cm4gKChKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpIGVsZW1lbnQpLmdldFRleHQoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlKQotCQkJcmV0dXJuICgoRmlsZSllbGVtZW50KS5nZXROYW1lKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlyZXR1cm4gKChJUHJvamVjdCllbGVtZW50KS5nZXROYW1lKCk7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBMb2FkaW5nREROb2RlKQotCQkJcmV0dXJuICgoTG9hZGluZ0RETm9kZSllbGVtZW50KS5nZXRUZXh0KCk7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmhhc2hDb2RlKCk7Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBpZCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmlzTGFiZWxQcm9wZXJ0eShvYmplY3QsIGlkKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlTGFiZWxQcm92aWRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGUgYVNpdGUpIHsKLQkJaW5pdGlhbGl6ZShJSjJFRU5hdmlnYXRvckNvbnN0YW50cy5WSUVXRVJfSUQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRU5hdmlnYXRpb25MYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRU5hdmlnYXRpb25MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MjBkOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVOYXZpZ2F0aW9uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRU5hdmlnYXRpb25MYWJlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgSjJFRU5hdmlnYXRpb25MYWJlbFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRVByb2plY3REZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFUHJvamVjdERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjk2NjMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFUHJvamVjdERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbi5KMkVFTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotCi0vKioKLSAqIEoyRUVQcm9qZWN0RGVjb3JhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFUHJvamVjdERlY29yYXRvciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgRUFSOwotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBBUFBDTElFTlQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIERZTkFNSUNXRUI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIEVKQjsKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgQ09OTkVDVE9SOwotICAgICAgCi0gICAgLyogVGhlIGNvbnN0YW50cyBhcmUgZHVwbGljYXRlZCBoZXJlIHRvIGF2b2lkIHBsdWdpbiBsb2FkaW5nLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfRkFDRVQgPSAianN0LmVhciI7IC8vJE5PTi1OTFMtMSQgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9GQUNFVCA9ICJqc3QuYXBwY2xpZW50IjsgLy8kTk9OLU5MUy0xJCAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0ZBQ0VUID0gImpzdC53ZWIiOyAvLyROT04tTkxTLTEkIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfRkFDRVQgPSAianN0LmVqYiI7IC8vJE5PTi1OTFMtMSQgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVUSUxJVFlfRkFDRVQgPSAianN0LnV0aWxpdHkiOyAvLyROT04tTkxTLTEkIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfRkFDRVQgPSAianN0LmNvbm5lY3RvciI7IC8vJE5PTi1OTFMtMSQgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19XRUJfRkFDRVQgPSAid3N0LndlYiI7IC8vJE5PTi1OTFMtMSQgCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRElSID0gImljb25zL2Z1bGwvb3ZyMTYiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgCi0gICAgcHVibGljIEoyRUVQcm9qZWN0RGVjb3JhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotICAgIAkKLSAgICAJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotICAgIAkJZWxlbWVudCA9ICgoSUphdmFQcm9qZWN0KWVsZW1lbnQpLmdldFByb2plY3QoKTsKLSAgICAJfQotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7ICAKLSAgICAJCi0gICAgICAgIAlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50OwotICAgICAgICAJSW1hZ2VEZXNjcmlwdG9yIG92ZXJsYXkgPSBudWxsOwotCQkJaWYgKGhhc0ZhY2V0KHByb2plY3QsIEVBUl9GQUNFVCkpCi0JCQkJb3ZlcmxheT1nZXRFQVIoKTsKLQkJCWVsc2UgaWYgKGhhc0ZhY2V0KHByb2plY3QsIEFQUENMSUVOVF9GQUNFVCkpCi0JCQkJb3ZlcmxheT1nZXRBUFBDTElFTlQoKTsKLQkJCWVsc2UgaWYgKGhhc0ZhY2V0KHByb2plY3QsIFdFQl9GQUNFVCkpCi0JCQkJb3ZlcmxheT1nZXREWU5BTUlDV0VCKCk7Ci0JCQllbHNlIGlmIChoYXNGYWNldChwcm9qZWN0LCBFSkJfRkFDRVQpKQotCQkJCW92ZXJsYXk9Z2V0RUpCKCk7Ci0JCQllbHNlIGlmIChoYXNGYWNldChwcm9qZWN0LCBDT05ORUNUT1JfRkFDRVQpKQotCQkJCW92ZXJsYXk9Z2V0Q09OTkVDVE9SKCk7Ci0JCQllbHNlIGlmIChoYXNGYWNldChwcm9qZWN0LCBTVEFUSUNfV0VCX0ZBQ0VUKSkKLQkJCQlvdmVybGF5PWdldERZTkFNSUNXRUIoKTsKLQkJCWVsc2UgaWYgKGhhc0ZhY2V0KHByb2plY3QsIFVUSUxJVFlfRkFDRVQpKQotCQkJCW92ZXJsYXk9bnVsbDsKLQkJCQotCQkJaWYgKG92ZXJsYXkgIT0gbnVsbCkKLQkJCQlkZWNvcmF0aW9uLmFkZE92ZXJsYXkob3ZlcmxheSk7IAotICAgICAgICB9Ci0JfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0ZhY2V0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldCkgewotCQl0cnkgewotCQkJcmV0dXJuIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChwcm9qZWN0LCBmYWNldCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeyAKLQkJCUoyRUVOYXZpZ2F0b3JQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotICAgIAotICAgIC8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZ2lmID0gIi8iICsga2V5ICsgIi5naWYiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChJQ09OX0RJUikuYXBwZW5kKGdpZik7Ci0JCQlVUkwgZ2lmSW1hZ2VVUkwgPSBGaWxlTG9jYXRvci5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShKMkVFTmF2aWdhdG9yUGx1Z2luLlBMVUdJTl9JRCksIHBhdGgsIG51bGwpOwotCQkJaWYgKGdpZkltYWdlVVJMICE9IG51bGwpCi0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZ2lmSW1hZ2VVUkwpOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEVBUigpIHsKLSAgICAJaWYgKEVBUiA9PSBudWxsKSB7Ci0gICAgCQlFQVIgPSBnZXRJbWFnZURlc2NyaXB0b3IoImVudGVycHJpc2VfYXBwX292ciIpOyAvLyROT04tTkxTLTEkCi0gICAgCX0KLSAgICAJcmV0dXJuIEVBUjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEFQUENMSUVOVCgpIHsKLSAgICAJaWYgKEFQUENMSUVOVCA9PSBudWxsKSB7Ci0gICAgCQlBUFBDTElFTlQgPSBnZXRJbWFnZURlc2NyaXB0b3IoImNsaWVudF9hcHBfb3ZyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJfQotICAgIAlyZXR1cm4gQVBQQ0xJRU5UOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RFlOQU1JQ1dFQigpIHsKLSAgICAJaWYgKERZTkFNSUNXRUIgPT0gbnVsbCkgewotICAgIAkJRFlOQU1JQ1dFQiA9IGdldEltYWdlRGVzY3JpcHRvcigid2ViX21vZHVsZV9vdnIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAl9Ci0gICAgCXJldHVybiBEWU5BTUlDV0VCOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RUpCKCkgewotICAgIAlpZiAoRUpCID09IG51bGwpIHsKLSAgICAJCUVKQiA9IGdldEltYWdlRGVzY3JpcHRvcigiZWpiX21vZHVsZV9vdnIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAl9Ci0gICAgCXJldHVybiBFSkI7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRDT05ORUNUT1IoKSB7Ci0gICAgCWlmIChDT05ORUNUT1IgPT0gbnVsbCkgewotICAgIAkJQ09OTkVDVE9SID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJjb25uZWN0b3Jfb3ZyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJfQotICAgIAlyZXR1cm4gQ09OTkVDVE9SOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRVZpZXdlclNvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVWaWV3ZXJTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzMWJlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRVZpZXdlclNvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuQ29tbW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotcHVibGljIGNsYXNzIEoyRUVWaWV3ZXJTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVWaWV3ZXJTb3J0ZXIuCi0JICovCi0JcHVibGljIEoyRUVWaWV3ZXJTb3J0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdTVCA9ICJvcmcuZWNsaXBzZS53c3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTVCA9ICJvcmcuZWNsaXBzZS5qc3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAc2VlIFZpZXdlclNvcnRlciNjb21wYXJlKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCS8vIENoZWNrIHRvIHNlZSBpZiBlYWNoIG9iamVjdCBpcyBhIGJhc2UgV1NUIG9yIEpTVCBjb3JlIGNvbnRyaWJ1dGlvbgotCQlib29sZWFuIGUxX2lzQ29yZSA9IGlzQ29yZShlMSk7Ci0JCWJvb2xlYW4gZTJfaXNDb3JlID0gaXNDb3JlKGUyKTsKLQkJLy8gSWYgYm90aCBlbGVtZW50cyBhcmUgZnJvbSB0aGUgc2FtZSBjYXRlZ29yeSwgZG8gZGVmYXVsdCBjb21wYXJpc29uCi0JCWlmIChlMV9pc0NvcmUgPT0gZTJfaXNDb3JlKQotCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCQkvLyBJZiBlMSBpcyBjb3JlLCBidXQgbm90IGUyLCBlMSBpcyBsZXNzIHRoYW4gZTIKLQkJZWxzZSBpZiAoZTFfaXNDb3JlKQotCQkJcmV0dXJuIC0xOwotCQkvLyBJZiBlMSBpcyBub3QgY29yZSwgYnV0IGUyIGlzLCBlMSBpcyBncmVhdGVyIHRoYW4gZTIKLQkJZWxzZQotCQkJcmV0dXJuIDE7Ci0JfQotCQotCS8qKgotCSAqIEFueSBjb250cmlidXRpb24gZnJvbSB0aGUgYmFzZSBKU1Qgb3IgV1NUIHBhY2thZ2VzIGlzIGNvbnNpZGVyZWQgY29yZSwgZXZlcnl0aGluZyBlbHNlIGlzCi0JICogYW4gZXh0ZW5zaW9uCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4gaXMgQ29udHJpYnV0aW9uIENvcmU/Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29yZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlDbGFzcyBjbGF6eiA9IGVsZW1lbnQuZ2V0Q2xhc3MoKTsKLQkJCWlmIChjbGF6eiAhPSBudWxsKSB7Ci0JCQkJUGFja2FnZSBwYWNrID0gY2xhenouZ2V0UGFja2FnZSgpOwotCQkJCWlmIChwYWNrICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFjay5nZXROYW1lKCk7Ci0JCQkJCXJldHVybiBwYWNrYWdlTmFtZSE9bnVsbCAmJiAocGFja2FnZU5hbWUuc3RhcnRzV2l0aChXU1QpIHx8IHBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoSlNUKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VudGVycHJpc2VCZWFuKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW47Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIENvbW1vblV0aWwuaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3Qobyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU29ydChPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlyZXR1cm4gKGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KGUxKSAmJiBpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChlMikpIHx8IChpc0VudGVycHJpc2VCZWFuKGUxKSAmJiBpc0VudGVycHJpc2VCZWFuKGUyKSkgfHwgKChlMSBpbnN0YW5jZW9mIElGaWxlKSAmJiAoZTIgaW5zdGFuY2VvZiBJRmlsZSkpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0RESm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0RESm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTY4NTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0xvYWRpbmdEREpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgTG9hZGluZ0RESm9iIGV4dGVuZHMgSm9iIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElQUk9KRUNUX0NMQVNTID0gSVByb2plY3QuY2xhc3M7Ci0KLQlwcml2YXRlIEVNRlJvb3RPYmplY3RQcm92aWRlciByb290T2JqZWN0UHJvdmlkZXI7Ci0JcHJpdmF0ZSBMb2FkaW5nREROb2RlIHBsYWNlSG9sZGVyOwotCXByaXZhdGUgQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIElBZGFwdGFibGUgcGFyZW50OwotCi0JcHVibGljIExvYWRpbmdEREpvYihBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyLCBMb2FkaW5nREROb2RlIHBsYWNlSG9sZGVyLCBJQWRhcHRhYmxlIHBhcmVudCwgRU1GUm9vdE9iamVjdFByb3ZpZGVyIHJvb3RPYmplY3RQcm92aWRlcikgewotCQlzdXBlcihwbGFjZUhvbGRlci5nZXRUZXh0KCkpOwotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJdGhpcy5wbGFjZUhvbGRlciA9IHBsYWNlSG9sZGVyOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5yb290T2JqZWN0UHJvdmlkZXIgPSByb290T2JqZWN0UHJvdmlkZXI7Ci0JCXNldFJ1bGUobmV3IE5vbkNvbmZsaWN0aW5nUnVsZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7IAotCi0JCUxvYWRpbmdERFVJSm9iIHVwZGF0ZVVJSm9iID0gbmV3IExvYWRpbmdERFVJSm9iKHZpZXdlciwgcGxhY2VIb2xkZXIpOwotCQl1cGRhdGVVSUpvYi5zY2hlZHVsZSgpOwotCi0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQl0cnkgewotCQkJSVByb2plY3QgcHJvamVjdCA9ICAoSVByb2plY3QpICBwYXJlbnQuZ2V0QWRhcHRlcihJUFJPSkVDVF9DTEFTUyk7Ci0JCQlPYmplY3RbXSByb290T2JqZWN0cyA9IChyb290T2JqZWN0UHJvdmlkZXIgIT0gbnVsbCkgPyByb290T2JqZWN0UHJvdmlkZXIuZ2V0TW9kZWxzKHByb2plY3QpIDogbnVsbDsKLQkJCWlmIChyb290T2JqZWN0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgeD0wOyB4PCByb290T2JqZWN0cy5sZW5ndGggOyArK3gpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKHJvb3RPYmplY3RzW3hdKTsKLQkJCQl9Ci0JCQkJCi0JCQl9CQkKLQkJfSBmaW5hbGx5IHsgCi0JCQkvKiBkaXNwb3NlIG9mIHRoZSBwbGFjZSBob2xkZXIsIGNhdXNlcyB0aGUgdGVybWluYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBqb2IgKi8KLQkJCXBsYWNlSG9sZGVyLmRpc3Bvc2UoKTsgCi0JCQluZXcgQ2xlYXJQbGFjZUhvbGRlckpvYih2aWV3ZXIsIHBsYWNlSG9sZGVyLCBwYXJlbnQsIGNoaWxkcmVuLnRvQXJyYXkoKSkuc2NoZWR1bGUoKTsKLQkJfQotCQkKLQkJIAotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Mb2FkaW5nREROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0RETm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWJlZTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Mb2FkaW5nREROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5uYXZpZ2F0b3IudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbi5KMkVFTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgTG9hZGluZ0RETm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgbG9hZGluZ09uZTsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgbG9hZGluZ1R3bzsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgbG9hZGluZ1RocmVlOwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBsb2FkaW5nRm91cjsKLQkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNldCBsb2FkaW5nRmlsZXMgPSBuZXcgSGFzaFNldCgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBwbGFjZUhvbGRlcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCWxvYWRpbmdPbmUgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvZXRvb2wxNi9sb2FkaW5nMS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9hZGluZ1R3byA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9ldG9vbDE2L2xvYWRpbmcyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQlsb2FkaW5nVGhyZWUgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvZXRvb2wxNi9sb2FkaW5nMy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9hZGluZ0ZvdXIgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvZXRvb2wxNi9sb2FkaW5nNC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQlKMkVFTmF2aWdhdG9yUGx1Z2luLmxvZ0Vycm9yKDAsIG1zZywgZSk7Ci0JCQlsb2FkaW5nT25lID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCWxvYWRpbmdUd28gPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJbG9hZGluZ1RocmVlID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCWxvYWRpbmdGb3VyID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCX0KLSAKLQlwcml2YXRlIFN0cmluZyB0ZXh0OyAKLQlwcml2YXRlIFN0cmluZyB0ZXh0MTsKLQlwcml2YXRlIFN0cmluZyB0ZXh0MjsKLQlwcml2YXRlIFN0cmluZyB0ZXh0MzsKLQlwcml2YXRlIGludCBjb3VudCA9IDA7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQgPSBmYWxzZTsKLQlwcml2YXRlIElQcm9qZWN0IG1vZGVsUHJvamVjdDsKLQkKLQotCS8qKgotCSAqIFJldHVybiBhIHBsYWNlIGhvbGRlciBub2RlIHRvIHNpdCBpbiB0aGUgdHJlZSB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZS4KLQkgKiBUaGlzIHBsYWNlIGhvbGRlciBub2RlIHdpbGwgYmUgYW5pbWF0ZWQgZm9yIHRoZSB1c2VyJ3MgZW5qb3ltZW50LiAKLQkgKiAgCi0JICogQHBhcmFtIG1vZGVsRmlsZSBUaGUgbW9kZWxGaWxlIHRvIGJlIGxvYWRlZAotCSAqIEByZXR1cm4gQSBuZXcgdW5pcXVlIHBsYWNlIGhvbGRlciBmb3IgdGhpcyBmaWxlIGZvciBhIGdpdmVuIGxvYWQgY3ljbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExvYWRpbmdERE5vZGUgY3JlYXRlUGxhY2VIb2xkZXIoSVByb2plY3QgbW9kZWxGaWxlKSB7Ci0JCUxvYWRpbmdERE5vZGUgbm9kZSA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoTG9hZGluZ0RETm9kZS5jbGFzcykgewotCQkJaWYocGxhY2VIb2xkZXJzLmNvbnRhaW5zS2V5KG1vZGVsRmlsZSkpCi0JCQkJbm9kZSA9IChMb2FkaW5nREROb2RlKSBwbGFjZUhvbGRlcnMuZ2V0KG1vZGVsRmlsZSk7Ci0JCQllbHNlIAkJCQotCQkJCXBsYWNlSG9sZGVycy5wdXQobW9kZWxGaWxlLCBub2RlID0gbmV3IExvYWRpbmdERE5vZGUobW9kZWxGaWxlKSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCQotCXB1YmxpYyBMb2FkaW5nREROb2RlKElQcm9qZWN0IG1vZGVsKSB7Ci0JCXRleHQgPSBOTFMuYmluZChNZXNzYWdlcy5Mb2FkaW5nREROb2RlX0xvYWRpbmdfMF8sIG1vZGVsLmdldE5hbWUoKSk7Ci0JCXRleHQxID0gdGV4dCAgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dDIgPSB0ZXh0ICArICIuLiI7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dDMgPSB0ZXh0ICArICIuLi4iOyAvLyROT04tTkxTLTEkCi0JCW1vZGVsUHJvamVjdCA9IG1vZGVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQotCQlzd2l0Y2ggKCBjb3VudCAlIDQpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIHRleHQ7Ci0JCQljYXNlIDEgOgotCQkJCXJldHVybiB0ZXh0MTsKLQkJCWNhc2UgMiA6Ci0JCQkJcmV0dXJuIHRleHQyOwotCQkJY2FzZSAzIDoKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiB0ZXh0MzsKLQkJfSAKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXN3aXRjaCAoIGNvdW50ID0gKCsrY291bnQgJSA0KSkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UobG9hZGluZ09uZSk7Ci0JCQljYXNlIDEgOgotCQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShsb2FkaW5nVHdvKTsKLQkJCWNhc2UgMiA6Ci0JCQkJcmV0dXJuIEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKGxvYWRpbmdUaHJlZSk7Ci0JCQljYXNlIDMgOgotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKGxvYWRpbmdGb3VyKTsKLQkJfQotCX0gCi0JCi0JCi0JCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIGRpc3Bvc2VkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzeW5jaHJvbml6ZWQgKExvYWRpbmdERE5vZGUuY2xhc3MpIHsKLQkJCWRpc3Bvc2VkID0gdHJ1ZTsKLQkJCXBsYWNlSG9sZGVycy5yZW1vdmUobW9kZWxQcm9qZWN0KTsJCi0JCQlsb2FkaW5nRmlsZXMucmVtb3ZlKG1vZGVsUHJvamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbXBsb3kgYSBUZXN0IGFuZCBTZXQgKFRTVCkgcHJpbWl0aXZlIHRvIGVuc3VyZSAKLQkgKiB0aGF0IG9ubHkgam9iIGlzIHNwYXduZWQgdG8gbG9hZCB0aGUgbW9kZWwgZmlsZQotCSAqICAgCi0JICogCi0JICogQHJldHVybiBUcnVlIG9ubHkgaWYgbm8gb3RoZXIgam9icyBhcmUgdHJ5aW5nIHRvIGxvYWQgdGhpcyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQmVnaW5Mb2FkaW5nKElQcm9qZWN0IG1vZGVsUHJvamVjdCkgewotCQlzeW5jaHJvbml6ZWQgKExvYWRpbmdERE5vZGUuY2xhc3MpIHsgIAotCQkJaWYobG9hZGluZ0ZpbGVzLmNvbnRhaW5zKG1vZGVsUHJvamVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJbG9hZGluZ0ZpbGVzLmFkZChtb2RlbFByb2plY3QpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGEgam9iIGhhcyByZXF1ZXN0ZWQgcGVybWlzc2lvbiB0byBsb2FkIHRoZSBtb2RlbCBmaWxlICAgCi0JICogQHBhcmFtIG1vZGVsRmlsZSBUaGUgbW9kZWwgZmlsZSB0aGF0IHNob3VsZCBiZSBsb2FkZWQKLQkgKiBAcmV0dXJuIFRydWUgb25seSBpZiBhIGpvYiBpcyB0cnlpbmcgdG8gbG9hZCB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmVpbmdMb2FkZWQoSVByb2plY3QgbW9kZWxQcm9qZWN0KSB7Ci0JCXN5bmNocm9uaXplZCAoTG9hZGluZ0RETm9kZS5jbGFzcykgeyAgCi0JCQlyZXR1cm4gbG9hZGluZ0ZpbGVzLmNvbnRhaW5zKG1vZGVsUHJvamVjdCk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0REVUlKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Mb2FkaW5nRERVSUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWRhNGNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Mb2FkaW5nRERVSUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci0KLXB1YmxpYyBjbGFzcyBMb2FkaW5nRERVSUpvYiBleHRlbmRzIFVJSm9iIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVMQVkgPSAyMDA7Ci0JICAKLQlwcml2YXRlIExvYWRpbmdERE5vZGUgcGxhY2VIb2xkZXI7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcjsgCi0JIAotCXB1YmxpYyBMb2FkaW5nRERVSUpvYihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciwgTG9hZGluZ0RETm9kZSBwbGFjZUhvbGRlcikgewotCQlzdXBlcihwbGFjZUhvbGRlci5nZXRUZXh0KCkpOyAKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCXRoaXMucGxhY2VIb2xkZXIgPSBwbGFjZUhvbGRlcjsKLQkJc2V0U3lzdGVtKHRydWUpOwotCQlzZXRSdWxlKG5ldyBOb25Db25mbGljdGluZ1J1bGUoKSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsgIAotCi0JCWlmKCFwbGFjZUhvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXZpZXdlci5yZWZyZXNoKHBsYWNlSG9sZGVyLCB0cnVlKTsJCQkKLQkJCXNjaGVkdWxlKERFTEFZKTsJCQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Ob25Db25mbGljdGluZ1J1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Ob25Db25mbGljdGluZ1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyOTkwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTm9uQ29uZmxpY3RpbmdSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci0KLXB1YmxpYyBjbGFzcyBOb25Db25mbGljdGluZ1J1bGUgaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTm9uQ29uZmxpY3RpbmdSdWxlIElOU1RBTkNFID0gbmV3IE5vbkNvbmZsaWN0aW5nUnVsZSgpOwotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsgCi0JCXJldHVybiBydWxlID09IHRoaXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgeyAKLQkJcmV0dXJuIHJ1bGUgPT0gdGhpczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Ob25GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL05vbkZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMTI5OWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL05vbkZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgTm9uRmxleGlibGVFTUZNb2RlbE1hbmFnZXIgZXh0ZW5kcyBFTUZNb2RlbE1hbmFnZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lcnsKLQotCXByaXZhdGUgRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQlwcml2YXRlIE9iamVjdCByb290T2JqZWN0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVCA9IG5ldyBPYmplY3RbMF07Ci0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIHByb3ZpZGVyCi0JICovCi0JcHVibGljIE5vbkZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyKElQcm9qZWN0IGFQcm9qZWN0LCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIoYVByb2plY3QsIHByb3ZpZGVyKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNnZXRNb2RlbHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRNb2RlbHMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsIHx8ICFnZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gRU1QVFlfT0JKRUNUOwotCQkKLQkJLy9zeW5jaHJvbml6ZWQgKHJvb3RPYmplY3QpIHsKLQkJCWlmIChyb290T2JqZWN0ID09IG51bGwgfHwgKChFT2JqZWN0KSByb290T2JqZWN0KS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEVkaXRNb2RlbCgpOwotCQkJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJCQlyb290T2JqZWN0ID0gZWRpdE1vZGVsLmdldFByaW1hcnlSb290T2JqZWN0KCk7Ci0JCQkJfQotCQkJfQotCQkvL30KLQkJaWYgKHJvb3RPYmplY3Q9PW51bGwpIAotCQkJcmV0dXJuIEVNUFRZX09CSkVDVDsKLQkJZWxzZSB7Ci0JCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsxXTsKLQkJCW9iamVjdHNbMF0gPSByb290T2JqZWN0OwotCQkJcmV0dXJuIG9iamVjdHM7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuRU1GTW9kZWxNYW5hZ2VyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJZWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQllZGl0TW9kZWwgPSBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXIjZWRpdE1vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gYW5FdmVudC5nZXRFZGl0TW9kZWwoKS5nZXRQcm9qZWN0KCk7Ci0JCXN3aXRjaCAoYW5FdmVudC5nZXRFdmVudENvZGUoKSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRSA6Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UgOiAKLQkJCQlpZiAocm9vdE9iamVjdCAhPSBudWxsKXsKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkgICAgIH0KLQkJCQlicmVhazsKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuU0FWRSA6IHsKLQkJCQlpZiAocm9vdE9iamVjdCA9PSBudWxsKQotCQkJCQlub3RpZnlMaXN0ZW5lcnMoYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFIDoKLQkJCQkJZGlzcG9zZSgpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JfQotCQotCQotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWwoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vVE9ETyBmaXggdXAKLQkJLy9zeW5jaHJvbml6ZWQgKGVkaXRNb2RlbCkgewotLy8JCQlpZiAoZWRpdE1vZGVsID09IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotLy8JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldEVkaXRNb2RlbEZvclByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsKLS8vCQkJCUoyRUVOYXR1cmUgbmF0dXJlID0gSjJFRU5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZShwcm9qZWN0KTsKLS8vCQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgewotLy8JCQkJCWVkaXRNb2RlbCA9IG5hdHVyZS5nZXRKMkVFRWRpdE1vZGVsRm9yUmVhZCh0aGlzKTsKLS8vCQkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLS8vCQkJCQkJZWRpdE1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotCQkvL30KLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUNhY2hlKElQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCkgewotCQkvL3N5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7Ci0JCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQllZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQkJZWRpdE1vZGVsID0gbnVsbDsKLQkJCX0KLQkJLy99Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkRXh0ZXJuYWxVdGlsaXR5SmFyRHJvcEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9BZGRFeHRlcm5hbFV0aWxpdHlKYXJEcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZmNhYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9BZGRFeHRlcm5hbFV0aWxpdHlKYXJEcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuUmVzb3VyY2VEcm9wQWRhcHRlckFzc2lzdGFudDsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEFkZEV4dGVybmFsVXRpbGl0eUphckRyb3BBY3Rpb24gZXh0ZW5kcyBSZXNvdXJjZURyb3BBZGFwdGVyQXNzaXN0YW50IHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLm5hdmlnYXRvci5kbmQuUmVzb3VyY2VEcm9wQWN0aW9uI3ZhbGlkYXRlRHJvcChvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLkNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgaW50LCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURyb3AoQ29tbW9uRHJvcEFkYXB0ZXIgZHJvcEFkYXB0ZXIsIE9iamVjdCB0YXJnZXQsIGludCBvcGVyYXRpb24sIFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUpIHsKLQkJLy9UT0RPIHJlZG8gd2l0aCBjb21wb25lbnRzCi0vLwkJaWYgKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlclR5cGUpKSB7Ci0vLwkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcih0YXJnZXQsIElQcm9qZWN0LmNsYXNzKTsKLS8vCQkJdHJ5IHsKLS8vCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkpIHsKLS8vCQkJCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IChTdHJpbmdbXSkgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkubmF0aXZlVG9KYXZhKHRyYW5zZmVyVHlwZSk7Ci0vLwkJCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpCi0vLwkJCQkJCXJldHVybiB0cnVlOwotLy8KLS8vCQkJCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0vLwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VOYW1lcy5sZW5ndGg7IGkrKykKLS8vCQkJCQkJaWYgKCEocmVzdWx0ID0gc291cmNlTmFtZXNbMF0uZW5kc1dpdGgoIi5qYXIiKSkpYnJlYWs7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQlyZXR1cm4gcmVzdWx0OwotLy8JCQkJfQotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YTE3MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkVudGVycHJpc2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm5hdmlnYXRvci51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbi5KMkVFTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuRUFSRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlckFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBsdWdpblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0OwotCi1wdWJsaWMgY2xhc3MgQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudCBleHRlbmRzIENvbW1vbkRyb3BBZGFwdGVyQXNzaXN0YW50IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElQUk9KRUNUX0NMQVNTID0gSVByb2plY3QuY2xhc3M7Ci0KLQlwdWJsaWMgQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRUeXBlKFRyYW5zZmVyRGF0YSBhVHJhbnNmZXJUeXBlKSB7CQotCQlyZXR1cm4gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZShhVHJhbnNmZXJUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBoYW5kbGVEcm9wKENvbW1vbkRyb3BBZGFwdGVyIGFEcm9wQWRhcHRlciwgRHJvcFRhcmdldEV2ZW50IGFEcm9wVGFyZ2V0RXZlbnQsIGZpbmFsIE9iamVjdCBhVGFyZ2V0KSB7Ci0KLQkJaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5pc1N1cHBvcnRlZFR5cGUoYURyb3BBZGFwdGVyLmdldEN1cnJlbnRUcmFuc2ZlcigpKSkgewotCi0JCQlmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCQkKLQkJCUlQcm9qZWN0IGVhclByb2plY3QgPSBnZXRQcm9qZWN0KGFUYXJnZXQpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCk7Ci0KLQkJCUpvYiBhZGRQcm9qZWN0VG9FYXJKb2IgPSBuZXcgSm9iKGdldEpvYlRpdGxlKGVhckNvbXBvbmVudCkpIHsKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IGdldFByb2plY3QoYVRhcmdldCk7Ci0KLQkJCQkJCUxpc3QgcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkgCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIHNlbGVjdGlvbkl0ZXJhdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IHNlbGVjdGlvbkl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3Qgc291cmNlT2JqZWN0ID0gc2VsZWN0aW9uSXRlcmF0b3IubmV4dCgpOwotCi0JCQkJCQkJSVByb2plY3QgcHJvamVjdFRvQWRkID0gZ2V0UHJvamVjdChzb3VyY2VPYmplY3QpOwotCQkJCQkJCWlmIChwcm9qZWN0VG9BZGQgIT0gbnVsbCkgCi0JCQkJCQkJCXByb2plY3RzLmFkZChwcm9qZWN0VG9BZGQpOyAKLQkJCQkJCX0KLQotCQkJCQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBnZXRBZGRNb2R1bGVEYXRhTW9kZWwoZWFyUHJvamVjdCwgcHJvamVjdHMpOwotCQkJCQkJSVVuZG9hYmxlT3BlcmF0aW9uIGRyb3BPcGVyYXRpb24gPSBkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCQkJCQkJc3RhdHVzID0gZHJvcE9wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCi0JCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQlzdGF0dXMgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIG1zZywgZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQl9Ci0JCQl9OwotCQkJc2VydmljZS5zaG93SW5EaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBhZGRQcm9qZWN0VG9FYXJKb2IpOwotCQkJYWRkUHJvamVjdFRvRWFySm9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCQlhZGRQcm9qZWN0VG9FYXJKb2Iuc2NoZWR1bGUoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZURyb3AoT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCi0JCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkgfHwgUGx1Z2luVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkgewotCQkJCQotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gZ2V0UHJvamVjdCh0YXJnZXQpOwotCQkJCWludCBlYXJWZXJzaW9uID0gZ2V0RWFyVmVyc2lvbihlYXJQcm9qZWN0KTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3RydWN0dXJlZFNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlJUHJvamVjdCBwcm9qZWN0VG9BZGQgPSBnZXRQcm9qZWN0KG5leHQpOwotCQkJCQlpZiggKHN0YXR1cyA9IHZhbGlkYXRlUHJvamVjdE1heUJlQWRkZWQoZWFyUHJvamVjdCwgcHJvamVjdFRvQWRkLCBlYXJWZXJzaW9uKSkuaXNPSygpKSAKLQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0TWF5QmVBZGRlZChJUHJvamVjdCBlYXJQcm9qZWN0LCBJUHJvamVjdCBwcm9qZWN0VG9BZGQsIGludCBlYXJWZXJzaW9uKSB7Ci0JCQotCQlpZiAoZWFyUHJvamVjdCA9PSBudWxsIHx8IHByb2plY3RUb0FkZCA9PSBudWxsIHx8IGVhclZlcnNpb24gPCAwKQotCQkJcmV0dXJuIEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgTWVzc2FnZXMuQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfYWRkX21vZHVsZV90b19FbnRlcnByaXNlXywgbnVsbCk7Ci0JCWVsc2UgaWYgKCFlYXJQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlyZXR1cm4gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBOTFMuYmluZChNZXNzYWdlcy5BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9wcm9qZWN0XzBfY2Fubm90X2JlX2FjY2Vzc2VfLCBlYXJQcm9qZWN0LmdldE5hbWUoKSksIG51bGwpOwotCQl9IGVsc2UgaWYgKCFwcm9qZWN0VG9BZGQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIE1lc3NhZ2VzLkFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfVGhlX2RyYWdnZWRfcHJvamVjdF9jYW5ub3RfYmVfYWRkZWRfLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChlYXJWZXJzaW9uID4gMTQpewotCQkJcmV0dXJuIEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgTWVzc2FnZXMuQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfYWRkX21vZHVsZV90b19FbnRlcnByaXNlXywgbnVsbCk7Ci0JCX0KLQotCQlJU3RhdHVzIGlzVmFsaWQgPSB2YWxpZGF0ZVByb2plY3RUb0FkZChwcm9qZWN0VG9BZGQsIGVhclZlcnNpb24pOwotCQlpZiAoIWlzVmFsaWQuaXNPSygpKSB7Ci0JCQlyZXR1cm4gaXNWYWxpZDsKLQkJfQotCQkvLyBUT0RPIENoZWNrIGlmIHRoZSBwcm9qZWN0IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlICouZWFyCi0JCS8vIGlmIChlZGl0TW9kZWwuaGFzTWFwcGluZ1RvUHJvamVjdChwcm9qZWN0VG9BZGQpKSB7Ci0JCS8vIHJldHVybiBmYWxzZTsKLQkJLy8gfSAKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIC0xIG9uIGVycm9yIAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0RWFyVmVyc2lvbihJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JCWludCBlYXJWZXJzaW9uID0gLTE7Ci0JCQotCSAgICBJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3Q7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShlYXJQcm9qZWN0KTsKLQkJCSBJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uID0gZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihFYXJVdGlsaXRpZXMuRU5URVJQUklTRV9BUFBMSUNBVElPTl9GQUNFVCk7Ci0JCQkgZWFyVmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KHZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL25vdGhpbmcgdG8gZG8gdmVyc2lvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBzaW5jZSB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBmYWNldGVkIHByb2plY3QuIAotCQkJSjJFRU5hdmlnYXRvclBsdWdpbi5sb2dFcnJvcigwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGVhclZlcnNpb247Ci0JfQotCQkKLQkvKioKLQkgKiBAcGFyYW0gZmFjZXRlZFByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzRWFyRmFjZXQoSVByb2plY3QgcHJvamVjdCkgewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsgCi0JCX0KLQkJcmV0dXJuIGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwgJiYgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KEVBUkZhY2V0VXRpbHMuRUFSX0ZBQ0VUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGNhbGN1bGF0ZVZhbGlkUHJvamVjdE5hbWUoZmluYWwgU3RyaW5nIG9yaWdpbmFsTmFtZSkgeyAKLQotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJU3RyaW5nIHZhbGlkTmFtZSA9IG9yaWdpbmFsTmFtZTsKLQkJaW50IGNvdW50ID0gMTsKLQkJd2hpbGUgKHJvb3QuZ2V0UHJvamVjdCh2YWxpZE5hbWUpLmV4aXN0cygpKSB7Ci0JCQl2YWxpZE5hbWUgPSBvcmlnaW5hbE5hbWUgKyBjb3VudCsrOwotCQl9Ci0JCXJldHVybiB2YWxpZE5hbWU7CQkJCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0QWRkTW9kdWxlRGF0YU1vZGVsKElQcm9qZWN0IGVhclByb2plY3QsIExpc3QgcHJvamVjdHMpIHsKLQkJSURhdGFNb2RlbCBkYXRhbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCi0JCUlWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2plY3QpOwotCQlNYXAgY29tcG9uZW50VG9VUklNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXBvbmVudCA9IG51bGw7Ci0JCWZvcihJdGVyYXRvciBpdHIgPSBwcm9qZWN0cy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApIHsKLQkJCW1vZHVsZUNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KChJUHJvamVjdClpdHIubmV4dCgpKTsgCi0JCQljb21wb25lbnRzLmFkZChtb2R1bGVDb21wb25lbnQpOwotCQkJY29tcG9uZW50VG9VUklNYXAucHV0KG1vZHVsZUNvbXBvbmVudCwgZ2V0RGVmYXVsdFVSSShtb2R1bGVDb21wb25lbnQpKTsgCi0JCX0JCQotCQlkYXRhbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIGVhckNvbXBvbmVudCk7Ci0JCWRhdGFtb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBjb21wb25lbnRzKTsJCQotCQlkYXRhbW9kZWwuc2V0UHJvcGVydHkoSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLCBjb21wb25lbnRUb1VSSU1hcCk7Ci0JCXJldHVybiBkYXRhbW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRKb2JUaXRsZShJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQpIHsgCi0JCXJldHVybiBOTFMuYmluZChNZXNzYWdlcy5BZGRNb2R1bGVUb0VhckRyb3BBc3Npc3RhbnRfQWRkaW5nX21vZHVsZV90b19lYV8sIGVhckNvbXBvbmVudC5nZXROYW1lKCkpOwotCX0gIAotCQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdFRvQWRkKElQcm9qZWN0IHByb2plY3RUb0FkZCwgaW50IGVhclZlcnNpb24pIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQl0cnkgewotCQkJLy8gY2hlY2sgaWYgdGhlIHByb2plY3QgdG8gYWRkIGlzIG5vdCBhbiBFQVIgaXRzZWxmCi0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdFRvQWRkKTsgIAotCQkJaWYoIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCkgKSAKLQkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCWVsc2UgCi0JCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQotCQkJLy8gY2hlY2sgaWYgdGhlIHByb2plY3QgdG8gYWRkIGlzIHdpdGggSmF2YSBFRSB2ZXJzaW9uIGVxdWFsIG9yIGxlc3NlciB0aGFuIHRoYXQgb2YgdGhlIEVBUgotCQkJU3RyaW5nIHZlclN0ciA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VmVyc2lvbihwcm9qZWN0VG9BZGQpOwotCQkJaWYgKHZlclN0ciAhPSBudWxsKSB7Ci0JCQkJaW50IHZlcnNpb247Ci0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3RUb0FkZCkpCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydEFwcENsaWVudFZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyU3RyKTsKLQkJCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QocHJvamVjdFRvQWRkKSkKLQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0RUpCVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJTdHIpOwotCQkJCWVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdFRvQWRkKSkKLQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0V2ViVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJTdHIpOwotCQkJCWVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChwcm9qZWN0VG9BZGQpKQotCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRDb25uZWN0b3JWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlclN0cik7Ci0JCQkJZWxzZSAKLQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KHZlclN0cik7Ci0JCQkJCi0JCQkJaWYgKHZlcnNpb24gPiBlYXJWZXJzaW9uKSAKLQkJCQkJc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJZWxzZSAKLQkJCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJc3RhdHVzID0gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBtc2csIGUpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JCSAKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBlbGVtZW50KS5nZXRBZGFwdGVyKElQUk9KRUNUX0NMQVNTKTsKLQkJZWxzZQotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKGVsZW1lbnQsIElQUk9KRUNUX0NMQVNTKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBlbGVtZW50KTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEoyRUVJdGVtUHJvdmlkZXIpIHsKLQkJCQlJRmlsZSBhc3NvY2lhdGVkRmlsZSA9ICgoSjJFRUl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRBc3NvY2lhdGVkRmlsZSgpOwotCQkJCWlmKGFzc29jaWF0ZWRGaWxlICE9IG51bGwpCi0JCQkJCXByb2plY3QgPSBhc3NvY2lhdGVkRmlsZS5nZXRQcm9qZWN0KCk7CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRVUkkoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBjb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQlTdHJpbmcgbmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0KLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCW5hbWUgKz0gSU1vZHVsZUV4dGVuc2lvbnMuRE9UX1dBUjsKLQkJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkpIHsKLQkJCW5hbWUgKz0gSU1vZHVsZUV4dGVuc2lvbnMuRE9UX0VBUjsKLQkJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdCkpIHsKLQkJCW5hbWUgKz0gSU1vZHVsZUV4dGVuc2lvbnMuRE9UX1JBUjsKLQkJfSBlbHNlIHsKLQkJCW5hbWUgKz0gSU1vZHVsZUV4dGVuc2lvbnMuRE9UX0pBUjsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvSU1vZHVsZUV4dGVuc2lvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvSU1vZHVsZUV4dGVuc2lvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxOWE0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0lNb2R1bGVFeHRlbnNpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVFeHRlbnNpb25zIHsKLQotCVN0cmluZyBET1RfV0FSID0gIi53YXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERPVF9KQVIgPSIuamFyIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgRE9UX1JBUiA9ICIucmFyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBET1RfRUFSID0gIi5lYXIiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0ltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0ltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDllNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb2plY3Qub3BlcmF0aW9ucy5FSkJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9ucy5Db25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5uYXZpZ2F0b3IudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luLkoyRUVOYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudCBleHRlbmRzIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQgewotCQotCXB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkVHlwZShUcmFuc2ZlckRhdGEgYVRyYW5zZmVyVHlwZSkgeyAKLQkJcmV0dXJuIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShhVHJhbnNmZXJUeXBlKTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgaGFuZGxlRHJvcChDb21tb25Ecm9wQWRhcHRlciBhRHJvcEFkYXB0ZXIsIGZpbmFsIERyb3BUYXJnZXRFdmVudCBhRHJvcFRhcmdldEV2ZW50LCBmaW5hbCBPYmplY3QgYVRhcmdldCkgewkJCi0JCQotCQlpZihGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoYURyb3BBZGFwdGVyLmdldEN1cnJlbnRUcmFuc2ZlcigpKSkgewotCQkJCi0JCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCQotCQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsJIAotCQkJSm9iIGltcG9ydEFydGlmYWN0c0pvYiA9IG5ldyBKb2IoTWVzc2FnZXMuSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnRfSW1wb3J0aW5nX0phdmFfRW50ZXJwcmlzZV9FZGl0aW9uX2FydGlmYWN0cykgewotCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsJCQkJCQotCQkJCQkKLQkJCQkJSVByb2plY3QgdGFyZ2V0RUFSUHJvamVjdCA9IGdldFByb2plY3QoYVRhcmdldCk7Ci0JCQkJCWlmKHRhcmdldEVBUlByb2plY3QgIT0gbnVsbCkgeyAKLQkJCQkJCS8qIElmIHRoaXMgaXNuJ3QgYW4gZWFyIHByb2plY3QsIHdlIGNhbid0IGFkZCB0aGUgbmV3bHkgY3JlYXRlZCBtb2R1bGVzIHRvIGl0LiAqLwotCQkJCQkJaWYoIWhhc0VhckZhY2V0KHRhcmdldEVBUlByb2plY3QpKQotCQkJCQkJCXRhcmdldEVBUlByb2plY3QgPSBudWxsOwotCQkJCQl9IC8qIG90aGVyd2lzZSB3ZSBhc3N1bWUgdGhlIElXb3Jrc3BhY2VSb290IGFuZCBqdXN0IGRvbid0IGFkZCB0aGUgbmV3IG1vZHVsZXMgYW4gYW4gZXhpc3RpbmcgZWFyICovCi0KLQkJCQkJU3RyaW5nW10gbmFtZXMgPSAoU3RyaW5nW10pIGFEcm9wVGFyZ2V0RXZlbnQuZGF0YTsKLQkJCQkJCi0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLkltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50X0ltcG9ydGluZ19KYXZhX0VudGVycHJpc2VfRWRpdGlvbl9hcnRpZmFjdHMsIG5hbWVzLmxlbmd0aCk7Ci0JCQkJCWZpbmFsIE11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhKMkVFTmF2aWdhdG9yUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnRfSW1wb3J0aW5nX0phdmFfRW50ZXJwcmlzZV9FZGl0aW9uX2FydGlmYWN0cywgbnVsbCk7Ci0JCQkJCQotCQkJCQlTdWJQcm9ncmVzc01vbml0b3Igc3VibW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTApOwotCQkJCQlJRGF0YU1vZGVsIGltcG9ydERhdGFNb2RlbCA9IG51bGw7Ci0JCQkJCWJvb2xlYW4gcGVyZm9ybVNpbXBsZUphckNvcHkgPSBmYWxzZTsKLQkJCQkJTGlzdCBzaW1wbGVKYXJzVG9Db3B5TGlzdCA9IG51bGw7Ci0JCQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCQlMaXN0IGNyZWF0ZWRDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IoaW50IGk9MDsgaTxuYW1lcy5sZW5ndGggJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpOyBpKyspIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW1wb3J0RGF0YU1vZGVsID0gbnVsbDsKLQkJCQkJCQlwZXJmb3JtU2ltcGxlSmFyQ29weSA9IGZhbHNlOwotCQkJCQkJCWludCBzZXBhcmF0b3JJbmRleCA9IG5hbWVzW2ldLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCQkJCQkJaW50IGRvdEluZGV4ID0gbmFtZXNbaV0ubGFzdEluZGV4T2YoJy4nKTsKLQkJCQkJCQlpZihzZXBhcmF0b3JJbmRleCA+IDAgJiYgc2VwYXJhdG9ySW5kZXgrMSA8IGRvdEluZGV4KSB7Ci0JCQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IG5hbWVzW2ldLnN1YnN0cmluZyhzZXBhcmF0b3JJbmRleCsxLCBkb3RJbmRleCk7Ci0JCQkJCQkJCWlmKHJvb3QuZ2V0UHJvamVjdChmaWxlbmFtZSkuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCWZpbGVuYW1lID0gY2FsY3VsYXRlVmFsaWRQcm9qZWN0TmFtZShmaWxlbmFtZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IG5hbWVzW2ldLnN1YnN0cmluZyhkb3RJbmRleCk7Ci0JCQkJCQkJCWlmKElNb2R1bGVFeHRlbnNpb25zLkRPVF9XQVIuZXF1YWxzKGV4dGVuc2lvbikpIHsKLQkJCQkJCQkJCWltcG9ydERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCQkJCQkJfSBlbHNlIGlmKElNb2R1bGVFeHRlbnNpb25zLkRPVF9SQVIuZXF1YWxzKGV4dGVuc2lvbikpIHsKLQkJCQkJCQkJCWltcG9ydERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCQkJCQkJfSBlbHNlIGlmKElNb2R1bGVFeHRlbnNpb25zLkRPVF9FQVIuZXF1YWxzKGV4dGVuc2lvbikpIHsKLQkJCQkJCQkJCWltcG9ydERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCQkJCQkJfSBlbHNlIGlmKElNb2R1bGVFeHRlbnNpb25zLkRPVF9KQVIuZXF1YWxzKGV4dGVuc2lvbikpIHsgIAkJCQkJCQkJCQotCQkJCQkJCQkJQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJYXJjaGl2ZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuQXJjaGl2ZShuYW1lc1tpXSk7Ci0JCQkJCQkJCQkJaWYoYXJjaGl2ZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKQotCQkJCQkJCQkJCQlpbXBvcnREYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJCQkJCQkJZWxzZSBpZihhcmNoaXZlLmlzRUpCSmFyRmlsZSgpKQotCQkJCQkJCQkJCQlpbXBvcnREYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRUpCQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJCXBlcmZvcm1TaW1wbGVKYXJDb3B5ID0gdHJ1ZTsgLy9oYW5kbGUgVXRpbGl0eSBqYXJzIGFzIHJlZ3VsYXIgamFycy4KLQkJCQkJCQkJCQkJaWYoc2ltcGxlSmFyc1RvQ29weUxpc3QgPT0gbnVsbCl7Ci0JCQkJCQkJCQkJCQlzaW1wbGVKYXJzVG9Db3B5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCQkJCXNpbXBsZUphcnNUb0NvcHlMaXN0LmFkZChuYW1lc1tpXSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCi0JCQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQkJCWlmKGFyY2hpdmUgIT0gbnVsbCkKLQkJCQkJCQkJCQkJYXJjaGl2ZS5jbG9zZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IAotCQkJCQkJCQkKLQkJCQkJCQkJaWYoaW1wb3J0RGF0YU1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQkJCWltcG9ydERhdGFNb2RlbC5zZXRTdHJpbmdQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBuYW1lc1tpXSk7Ci0JCQkJCQkJCQlpbXBvcnREYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgZmlsZW5hbWUpOwotCQkJCQkJCQkJaW1wb3J0RGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKHN1Ym1vbml0b3IsIG51bGwpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQljcmVhdGVkQ29tcG9uZW50cy5hZGQoKElWaXJ0dWFsQ29tcG9uZW50KSBpbXBvcnREYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVCkpOwotCQkJCQkJCQkJCi0JCQkJCQkJCX0gZWxzZSBpZighcGVyZm9ybVNpbXBsZUphckNvcHkpewotCQkJCQkJCQkJc3RhdHVzLmFkZChKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIE5MUy5iaW5kKE1lc3NhZ2VzLkltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50X0NvdWxkX25vdF9yZWNvZ25pemVfZXh0ZW5zaW9uXzBfLCBleHRlbnNpb24pLCBudWxsKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJfSAKLQkJCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlLmdldE1lc3NhZ2UoKSA6IGUudG9TdHJpbmcoKTsKLQkJCQkJCQlzdGF0dXMuYWRkKEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgbXNnLCBlKSk7Ci0JCQkJCQl9IAkJCQkJCQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZih0YXJnZXRFQVJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCUxpc3QgY3JlYXRlZE1vZHVsZVByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yKGludCBpPTA7IGk8Y3JlYXRlZENvbXBvbmVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIGNyZWF0ZWRDb21wb25lbnRzLmdldChpKTsJCQkJCQkJCi0JCQkJCQkJLyogSWYgdGhpcyBpc24ndCBhbiBlYXIgcHJvamVjdCwgd2UgY2FuJ3QgYWRkIHRoZSBuZXdseSBjcmVhdGVkIG1vZHVsZXMgdG8gaXQuICovCi0JCQkJCQkJaWYoIWhhc0VhckZhY2V0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCQkJCWNyZWF0ZWRNb2R1bGVQcm9qZWN0cy5hZGQoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBnZXRBZGRNb2R1bGVEYXRhTW9kZWwodGFyZ2V0RUFSUHJvamVjdCwgY3JlYXRlZE1vZHVsZVByb2plY3RzKTsKLQkJCQkJCUlVbmRvYWJsZU9wZXJhdGlvbiBkcm9wT3BlcmF0aW9uID0gZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQkJCQkJCUlTdGF0dXMgYWRkUHJvamVjdHNTdGF0dXMgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlhZGRQcm9qZWN0c1N0YXR1cyA9IGRyb3BPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQkJCQlpZihhZGRQcm9qZWN0c1N0YXR1cyAhPSBudWxsKQotCQkJCQkJCQlzdGF0dXMuYWRkKGFkZFByb2plY3RzU3RhdHVzKTsKLQkJCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7IAotCQkJCQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJc3RhdHVzLmFkZChKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIG1zZywgbnVsbCkpOwotCQkJCQkJfQotCQkJCQkJLy9jb3B5IHRoZSBzaW1wbGVKYXJzT3ZlcgotCQkJCQkJaWYoc2ltcGxlSmFyc1RvQ29weUxpc3QgIT0gbnVsbCApewotCQkJCQkJCXRyeXsKLQkJCQkJCQkJZmluYWwgU3RyaW5nIFtdIGphcnNUb0NvcHlBcnJheSA9IG5ldyBTdHJpbmdbc2ltcGxlSmFyc1RvQ29weUxpc3Quc2l6ZSgpXTsKLQkJCQkJCQkJc2ltcGxlSmFyc1RvQ29weUxpc3QudG9BcnJheShqYXJzVG9Db3B5QXJyYXkpOwotCQkJCQkJCQkKLQkJCQkJCQkJQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbihzaGVsbCk7Ci0JCQkJCQkJCW9wZXJhdGlvbi5jb3B5RmlsZXNJbkN1cnJlbnRUaHJlYWQoamFyc1RvQ29weUFycmF5LCB0YXJnZXRFQVJQcm9qZWN0LCBtb25pdG9yKTsKLQkJCQkJCQl9Y2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCXN0YXR1cy5hZGQoSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBtc2csIGUpKTsKLQkJCQkJCQl9IAkKLQkJCQkJCX0JCi0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCi0JCQl9OwotCQkJCi0JCQlzZXJ2aWNlLnNob3dJbkRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGltcG9ydEFydGlmYWN0c0pvYik7Ci0JCQlpbXBvcnRBcnRpZmFjdHNKb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJCWltcG9ydEFydGlmYWN0c0pvYi5zY2hlZHVsZSgpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCX0KLQkKLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRHJvcChPYmplY3QgdGFyZ2V0LCBpbnQgb3BlcmF0aW9uLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCWlmKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlclR5cGUpKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCWlmKHRhcmdldCBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KQkJCi0JCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCWVsc2UgaWYoIChwcm9qZWN0ID0gZ2V0UHJvamVjdCh0YXJnZXQpKSAhPSBudWxsICYmIGhhc0VhckZhY2V0KHByb2plY3QpKQotCQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvSjJFRUltcG9ydERyb3BBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvSjJFRUltcG9ydERyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVkMmNkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0oyRUVJbXBvcnREcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA2LCAyMDA0Ci0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkltcG9ydFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSURyb3BBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFkYXB0YWJpbGl0eVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEoyRUVJbXBvcnREcm9wQWN0aW9uIGltcGxlbWVudHMgSURyb3BBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBBcmNoaXZlT3B0aW9ucyByZWFkT25seUFyY2hpdmVPcHRpb25zOwotCi0JcHVibGljIEoyRUVJbXBvcnREcm9wQWN0aW9uKCkgewotCQlyZWFkT25seUFyY2hpdmVPcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCXJlYWRPbmx5QXJjaGl2ZU9wdGlvbnMuc2V0SXNSZWFkT25seSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZmlsZUV4aXN0c09uRGlzayhTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwgJiYgZmlsZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlqYXZhLmlvLkZpbGUgZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoZmlsZU5hbWUpOwotCQkJcmV0dXJuIGZpbGUuZXhpc3RzKCkgJiYgIWZpbGUuaXNEaXJlY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEcm9wKENvbW1vbkRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyLCBPYmplY3QgdGFyZ2V0LCBpbnQgb3BlcmF0aW9uLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0JCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSAoU3RyaW5nW10pIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlclR5cGUpOwotCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwgfHwgc291cmNlTmFtZXMubGVuZ3RoICE9IDEpIHsgLy9vbmx5IGhhbmRsZSBvbmUgZmlsZSBmb3Igbm93Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJU3RyaW5nIGZpbGVOYW1lID0gc291cmNlTmFtZXNbMF07Ci0JCQlpZiAoIShmaWxlTmFtZS5lbmRzV2l0aCgiLmVhciIpIHx8IGZpbGVOYW1lLmVuZHNXaXRoKCIuamFyIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi53YXIiKSB8fCBmaWxlTmFtZS5lbmRzV2l0aCgiLnJhciIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFmaWxlRXhpc3RzT25EaXNrKGZpbGVOYW1lKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWludCBhcmNoaXZlVHlwZSA9IEltcG9ydFV0aWwuVU5LTk9XTjsKLQkJCUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0JCQl0cnkgewotLy8JCQkJYXJjaGl2ZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoZmlsZU5hbWUpOwotLy8JCQkJYXJjaGl2ZVR5cGUgPSBJbXBvcnRVdGlsLmdldEFyY2hpdmVUeXBlKGFyY2hpdmUpOwotLy8JCQkJU3RyaW5nW10gcG9zc2libGVOYXR1cmVzID0gbnVsbDsKLS8vCQkJCXN3aXRjaCAoYXJjaGl2ZVR5cGUpIHsKLS8vCQkJCQljYXNlIEltcG9ydFV0aWwuRUFSRklMRSA6Ci0vLwkJCQkJCXBvc3NpYmxlTmF0dXJlcyA9IG5ldyBTdHJpbmdbXXtJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRH07Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCWNhc2UgSW1wb3J0VXRpbC5FSkJKQVJGSUxFIDoKLS8vCQkJCQkJcG9zc2libGVOYXR1cmVzID0gbmV3IFN0cmluZ1tde0lFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lELCBJRUpCTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRH07Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCWNhc2UgSW1wb3J0VXRpbC5DTElFTlRKQVJGSUxFIDoKLS8vCQkJCQkJcG9zc2libGVOYXR1cmVzID0gbmV3IFN0cmluZ1tde0lFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lELCBJQXBwbGljYXRpb25DbGllbnROYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEfTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJY2FzZSBJbXBvcnRVdGlsLldBUkZJTEUgOgotLy8JCQkJCQlwb3NzaWJsZU5hdHVyZXMgPSBuZXcgU3RyaW5nW117SUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQsIElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUR9OwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQljYXNlIEltcG9ydFV0aWwuUkFSRklMRSA6Ci0vLwkJCQkJCXBvc3NpYmxlTmF0dXJlcyA9IG5ldyBTdHJpbmdbXXtJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCwgSUNvbm5lY3Rvck5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUR9OwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQlkZWZhdWx0IDoKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8KLS8vCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcih0YXJnZXQsIElQcm9qZWN0LmNsYXNzKTsKLQkJCQkvL1RPRE8gZml4IHVwIHRvIHVzZSBjb21wb25lbnRzIGFuZCBhcnRpZmFjdCBlZGl0cwotLy8JCQkJaWYgKG51bGwgIT0gcHJvamVjdCkgewotLy8JCQkJCXRyeSB7Ci0vLwkJCQkJCWJvb2xlYW4gZm91bmROYXR1cmUgPSBmYWxzZTsKLS8vCQkJCQkJZm9yIChpbnQgaSA9IDA7ICFmb3VuZE5hdHVyZSAmJiBpIDwgcG9zc2libGVOYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUocG9zc2libGVOYXR1cmVzW2ldKSkgewotLy8JCQkJCQkJCWZvdW5kTmF0dXJlID0gdHJ1ZTsKLS8vCQkJCQkJCQlKMkVFTmF0dXJlIG5hdHVyZSA9IChKMkVFTmF0dXJlKSBwcm9qZWN0LmdldE5hdHVyZShwb3NzaWJsZU5hdHVyZXNbaV0pOwotLy8JCQkJCQkJCWludCBwcm9qZWN0SjJFRVZlcnNpb24gPSBuYXR1cmUuZ2V0SjJFRVZlcnNpb24oKTsKLS8vCQkJCQkJCQlpbnQgYXJjaGl2ZU1vZHVsZVZlcnNpb24gPSBBcmNoaXZlVXRpbC5nZXRGYXN0U3BlY1ZlcnNpb24oKE1vZHVsZUZpbGUpIGFyY2hpdmUpOwotLy8JCQkJCQkJCWJvb2xlYW4gZmFpbCA9IGZhbHNlOwotLy8JCQkJCQkJCXN3aXRjaCAoYXJjaGl2ZVR5cGUpIHsKLS8vCQkJCQkJCQkJY2FzZSBJbXBvcnRVdGlsLkVBUkZJTEUgOgotLy8JCQkJCQkJCQljYXNlIEltcG9ydFV0aWwuQ0xJRU5USkFSRklMRSA6Ci0vLwkJCQkJCQkJCQlpZiAocHJvamVjdEoyRUVWZXJzaW9uIDwgYXJjaGl2ZU1vZHVsZVZlcnNpb24pIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJCQljYXNlIEltcG9ydFV0aWwuRUpCSkFSRklMRSA6Ci0vLwkJCQkJCQkJCQlpZiAocHJvamVjdEoyRUVWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEICYmIGFyY2hpdmVNb2R1bGVWZXJzaW9uID4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCkgewotLy8JCQkJCQkJCQkJCWZhaWwgPSB0cnVlOwotLy8JCQkJCQkJCQkJfSBlbHNlIGlmIChwcm9qZWN0SjJFRVZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgJiYgYXJjaGl2ZU1vZHVsZVZlcnNpb24gPiBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9Ci0vLwkJCQkJCQkJCQlicmVhazsKLS8vCQkJCQkJCQkJY2FzZSBJbXBvcnRVdGlsLldBUkZJTEUgOgotLy8JCQkJCQkJCQkJaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0gZWxzZSBpZiAocHJvamVjdEoyRUVWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEICYmIGFyY2hpdmVNb2R1bGVWZXJzaW9uID4gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRCkgewotLy8JCQkJCQkJCQkJCWZhaWwgPSB0cnVlOwotLy8JCQkJCQkJCQkJfQotLy8JCQkJCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCQkJCWNhc2UgSW1wb3J0VXRpbC5SQVJGSUxFIDoKLS8vCQkJCQkJCQkJCWlmIChwcm9qZWN0SjJFRVZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0gZWxzZSBpZiAocHJvamVjdEoyRUVWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEICYmIGFyY2hpdmVNb2R1bGVWZXJzaW9uID4gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRCkgewotLy8JCQkJCQkJCQkJCWZhaWwgPSB0cnVlOwotLy8JCQkJCQkJCQkJfQotLy8JCQkJCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJCWlmIChmYWlsKSB7Ci0vLwkJCQkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQkJaWYgKCFmb3VuZE5hdHVyZSkgewotLy8JCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJCQl9Ci0vLwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAobnVsbCAhPSBhcmNoaXZlICYmIGFyY2hpdmUuaXNPcGVuKCkpIHsKLQkJCQkJYXJjaGl2ZS5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5kbmQuTmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLkNvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBydW4oT2JqZWN0IHNvdXJjZSwgT2JqZWN0IHRhcmdldCkgewotCQkvL1RPRE8gZml4IHVwIGRyYWcgYW5kIGRyb3AgdHJhbnNmZXIKLQkJVHJhbnNmZXJEYXRhIGN1cnJlbnRUcmFuc2ZlciA9IG51bGw7IC8vZHJvcEFkYXB0ZXIuZ2V0Q3VycmVudFRyYW5zZmVyKCk7Ci0JCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoY3VycmVudFRyYW5zZmVyKSkgewotCQkJZmluYWwgU3RyaW5nW10gZmlsZU5hbWVzID0gKFN0cmluZ1tdKSBzb3VyY2U7Ci0JCQlmaW5hbCBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlTmFtZXNbMF07Ci0JCQlEYXRhTW9kZWxXaXphcmQgd2l6YXJkID0gbnVsbDsKLQkJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gbnVsbDsKLQotCQkJaW50IGFyY2hpdmVUeXBlID0gSW1wb3J0VXRpbC5VTktOT1dOOwotCQkJQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYXJjaGl2ZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoZmlsZU5hbWUpOwotCQkJCWFyY2hpdmVUeXBlID0gSW1wb3J0VXRpbC5nZXRBcmNoaXZlVHlwZShhcmNoaXZlKTsKLQkJCQlzd2l0Y2ggKGFyY2hpdmVUeXBlKSB7Ci0JCQkJCWNhc2UgSW1wb3J0VXRpbC5FQVJGSUxFIDoKLQkJCQkJCWRhdGFNb2RlbCA9IG51bGw7Ly9uZXcgRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbXBvcnRVdGlsLkVKQkpBUkZJTEUgOgotCQkJCQkJZGF0YU1vZGVsID0gbnVsbDsvL25ldyBFSkJNb2R1bGVJbXBvcnREYXRhTW9kZWwoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEltcG9ydFV0aWwuQ0xJRU5USkFSRklMRSA6Ci0JCQkJCQlkYXRhTW9kZWwgPSBudWxsOy8vbmV3IEFwcENsaWVudE1vZHVsZUltcG9ydERhdGFNb2RlbCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW1wb3J0VXRpbC5XQVJGSUxFIDoKLQkJCQkJCWRhdGFNb2RlbCA9IG51bGw7Ly9uZXcgV2ViTW9kdWxlSW1wb3J0RGF0YU1vZGVsKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbXBvcnRVdGlsLlJBUkZJTEUgOgotCQkJCQkJZGF0YU1vZGVsID0gbnVsbDsvL25ldyBDb25uZWN0b3JNb2R1bGVJbXBvcnREYXRhTW9kZWwoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAobnVsbCAhPSBhcmNoaXZlICYmIGFyY2hpdmUuaXNPcGVuKCkpIHsKLQkJCQkJYXJjaGl2ZS5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIGZpbGVOYW1lKTsKLQotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgQWRhcHRhYmlsaXR5VXRpbGl0eS5nZXRBZGFwdGVyKHRhcmdldCwgSVByb2plY3QuY2xhc3MpOwotCQkJaWYgKG51bGwgIT0gcHJvamVjdCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChhcmNoaXZlVHlwZSA9PSBJbXBvcnRVdGlsLkVBUkZJTEUgKSB7Ci0JCQkJCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5FQVJfQ09NUE9ORU5UX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQkJCWRhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIHRydWUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXN3aXRjaCAoYXJjaGl2ZVR5cGUpIHsKLQkJCQljYXNlIEltcG9ydFV0aWwuRUFSRklMRSA6Ci0JCQkJCXdpemFyZCA9IG51bGw7Ly9uZXcgRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0V2l6YXJkKChFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwpIGRhdGFNb2RlbCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSW1wb3J0VXRpbC5FSkJKQVJGSUxFIDoKLQkJCQkJd2l6YXJkID0gbnVsbDsvL25ldyBFSkJNb2R1bGVJbXBvcnRXaXphcmQoKEVKQk1vZHVsZUltcG9ydERhdGFNb2RlbCkgZGF0YU1vZGVsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJbXBvcnRVdGlsLkNMSUVOVEpBUkZJTEUgOgotCQkJCQl3aXphcmQgPSBudWxsOy8vbmV3IEFwcENsaWVudE1vZHVsZUltcG9ydFdpemFyZCgoQXBwQ2xpZW50TW9kdWxlSW1wb3J0RGF0YU1vZGVsKSBkYXRhTW9kZWwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcG9ydFV0aWwuV0FSRklMRSA6Ci0JCQkJCXdpemFyZCA9IG51bGw7Ly9uZXcgV2ViTW9kdWxlSW1wb3J0V2l6YXJkKChXZWJNb2R1bGVJbXBvcnREYXRhTW9kZWwpIGRhdGFNb2RlbCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSW1wb3J0VXRpbC5SQVJGSUxFIDoKLQkJCQkJd2l6YXJkID0gbnVsbDsvL25ldyBDb25uZWN0b3JNb2R1bGVJbXBvcnRXaXphcmQoKENvbm5lY3Rvck1vZHVsZUltcG9ydERhdGFNb2RlbCkgZGF0YU1vZGVsKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChudWxsICE9IHdpemFyZCkgewotCQkJCS8vVE9ETyBmaXggdXAgd2l6YXJkIGZvciBkcmFnIGFuZCBkcm9wCi0vLwkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotLy8JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9Nb2R1bGVJZGVudGlmaWVyU2VyaWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9Nb2R1bGVJZGVudGlmaWVyU2VyaWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNjMjg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTW9kdWxlSWRlbnRpZmllclNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFkYXB0YWJpbGl0eVV0aWxpdHk7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlSWRlbnRpZmllclNlcmlhbGl6ZXIgewotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5kbmQuSVNlcmlhbGl6ZXIjdG9CeXRlQXJyYXkoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KE9iamVjdCBkYXRhKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihkYXRhLCBJUHJvamVjdC5jbGFzcyk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvamVjdC5nZXROYW1lKCkuZ2V0Qnl0ZXMoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5kbmQuSVNlcmlhbGl6ZXIjZnJvbUJ5dGVBcnJheShieXRlW10pCi0JICovCi0JcHVibGljIE9iamVjdCBmcm9tQnl0ZUFycmF5KGJ5dGVbXSBkYXRhKSB7Ci0JCVN0cmluZyBuYW1lID0gbmV3IFN0cmluZyhkYXRhKTsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvcGx1Z2luL0oyRUVOYXZpZ2F0b3JQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9wbHVnaW4vSjJFRU5hdmlnYXRvclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Y3MWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9wbHVnaW4vSjJFRU5hdmlnYXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFTmF2aWdhdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEoyRUVOYXZpZ2F0b3JQbHVnaW4gcGx1Z2luOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05TID0gImljb25zLyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgaW1hZ2VzOwotCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEoyRUVOYXZpZ2F0b3JQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSjJFRU5hdmlnYXRvclBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlpbWFnZXMgPSBuZXcgSW1hZ2VSZWdpc3RyeShEaXNwbGF5LmdldERlZmF1bHQoKSk7Ci0JfQotCQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBpbWFnZXMuZ2V0RGVzY3JpcHRvcihyZWxhdGl2ZVBhdGgpOwotCQlpZihkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWRlc2NyaXB0b3IgPSBpbWFnZXMuZ2V0RGVzY3JpcHRvcihyZWxhdGl2ZVBhdGgpOwotCQkJCWlmKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCQlVUkwgaW1hZ2VVcmwgPSBGaWxlTG9jYXRvci5maW5kKGdldEJ1bmRsZSgpLCBuZXcgUGF0aChJQ09OUytyZWxhdGl2ZVBhdGgpLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVcmwpOwotCQkJCX0gCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7IAotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsgCi0KLQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZXMuZ2V0KGRlc2NyaXB0b3IudG9TdHJpbmcoKSk7CQkKLQkJaWYoaW1hZ2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaW1hZ2UgPSBpbWFnZXMuZ2V0KGRlc2NyaXB0b3IudG9TdHJpbmcoKSk7Ci0JCQkJaWYoaW1hZ2UgPT0gbnVsbCkgeyAKLQkJCQkJaW1hZ2VzLnB1dChkZXNjcmlwdG9yLnRvU3RyaW5nKCksIChpbWFnZSA9IGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UodHJ1ZSkpKTsKLQkJCQl9IAotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsgCi0JfQotCQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJaW1hZ2VzLmRpc3Bvc2UoKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBSZWNvcmQgYW4gZXJyb3IgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGFuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLAotCQkJVGhyb3dhYmxlIGFuRXhjZXB0aW9uKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coCi0JCQkJY3JlYXRlRXJyb3JTdGF0dXMoYUNvZGUsIGFNZXNzYWdlLCBhbkV4Y2VwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIFJlY29yZCBhIG1lc3NhZ2UgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJbG9nKGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBzdGF0dXMgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgYVN0YXR1cykgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGFTdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN0YXR1cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbHVnaW4uCi0JICogIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIEEgc3RhdHVzIGNvbmZpZ3VyZWQgd2l0aCB0aGlzIHBsdWdpbidzIGlkIGFuZCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgaW50IGFDb2RlLAotCQkJU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIGFDb2RlLAotCQkJCWFNZXNzYWdlICE9IG51bGwgPyBhTWVzc2FnZSA6ICJObyBtZXNzYWdlLiIsIGV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLAotCQkJVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDI1Y2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QbHVnaW4ubmFtZT1KMkVFIEV4dGVuc2lvbnMgdG8gQ29tbW9uIE5hdmlnYXRvcgotUGx1Z2luLnByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotUGx1Z2luLmRlc2NyaXB0aW9uPUNvbnRhaW5zIEoyRUUgRXh0ZW5zaW9ucyBidWlsdCBvbiB0aGUgQ29tbW9uIE5hdmlnYXRvciBGcmFtZXdvcmsKLWoyZWU9SjJFRQotajJlZS52aWV3X3VpXz1Qcm9qZWN0IEV4cGxvcmVyIAotajJlZS5jYXRlZ29yeV91aV89SjJFRQotRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnM9RW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLUFwcGxpY2F0aW9uX0NsaWVudF9Qcm9qZWN0cz1BcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdHMKLUNvbm5lY3Rvcl9Qcm9qZWN0cz1Db25uZWN0b3IgUHJvamVjdHMKLUVKQl9Qcm9qZWN0cz1FSkIgUHJvamVjdHMKLVdlYl9Qcm9qZWN0cz1EeW5hbWljIFdlYiBQcm9qZWN0cwotT3RoZXJfUHJvamVjdHM9T3RoZXIgUHJvamVjdHMKLUoyRUVfQWRkX01vZHVsZT1KMkVFIEFkZCBNb2R1bGUKLUFkZHNfSjJFRV9tb2R1bGVzX3RvX0VBUl9wcm9qZWN0cz1BZGRzIEoyRUUgbW9kdWxlcyB0byBFQVIgcHJvamVjdHMKLUoyRUVfQWRkX1V0aWxpdHlfSmFyPUoyRUUgQWRkIFV0aWxpdHkgSmFyCi1BZGRzX1V0aWxpdHlfSmFyc190b19FQVJfcHJvamVjdHM9QWRkcyBVdGlsaXR5IEphcnMgdG8gRUFSIHByb2plY3RzCi1KMkVFX1V0aWxpdHlfSmFyX0ltcG9ydD1KMkVFIFV0aWxpdHkgSmFyIEltcG9ydAotSW1wb3J0X2FfamFyX2ZpbGVfVUlfPUltcG9ydCBhIGphciBmaWxlIGludG8gYW4gRUFSIHByb2plY3QgYXMgYSBKMkVFIFV0aWxpdHkgSmFyCi1KMkVFX0ltcG9ydD1KMkVFIEltcG9ydAotSjJFRV9JTVBPUlRfTUVTU0FHRT1JbXBvcnRzIEoyRUUgYXJ0aWZhY3RzOiBFQVJzLCBFSkIgSmFycywgQXBwbGljYXRpb24gQ2xpZW50IEphcnMsIFJBUnMgYW5kIFdBUnMKLWoyZWVQcm9qZWN0RGVjb3JhdG9yPUoyRUUgUHJvamVjdCBEZWNvcmF0b3IKLWoyZWVQcm9qZWN0RGVjb3JhdG9yLmRlc2NyaXB0aW9uPUFkZHMgYSB2ZXJzaW9uIGRlY29yYXRvciB0byBKMkVFIHByb2plY3RzLgotZXh0ZW5zaW9uLmoyZWUubmFtZT1KMkVFIERlcGxveW1lbnQgRGVzY3JpcHRvcnMKLWV4dGVuc2lvbi5hcHBsaWNhdGlvbi5uYW1lPUoyRUUgQXBwbGljYXRpb24gRGVwbG95bWVudCBEZXNjcmlwdG9ycwotZXh0ZW5zaW9uLmFwcGNsaWVudC5uYW1lPUoyRUUgQXBwbGljYXRpb24gQ2xpZW50IERlcGxveW1lbnQgRGVzY3JpcHRvcnMKLWV4dGVuc2lvbi5jb25uZWN0b3IubmFtZT1KMkVFIENvbm5lY3RvciBEZXBsb3ltZW50IERlc2NyaXB0b3JzCi1leHRlbnNpb24uZWpiLm5hbWU9SjJFRSBFSkIgRGVwbG95bWVudCBEZXNjcmlwdG9ycwotZXh0ZW5zaW9uLndlYi5uYW1lPUoyRUUgV2ViIERlcGxveW1lbnQgRGVzY3JpcHRvcnMKLWZpbHRlci5qZXRlbWl0dGVycy5uYW1lPS5KRVRFbWl0dGVycwotZmlsdGVyLmpldGVtaXR0ZXJzLmRlc2NyaXB0aW9uPUhpZGUgLkpFVEVtaXR0ZXJzIHByb2plY3QKLVBST0JMRU1fTUFSS0VSX0xBQkVMX1JFU09VUkNFX0RFQ09SQVRPUj1Qcm9ibGVtIE1hcmtlciBSZXNvdXJjZSBEZWNvcmF0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWEyZjZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAJCSBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdlciI+Ci0gICAgICA8dmlld2VyQ29udGVudEJpbmRpbmcKLSAgICAgICAgIHZpZXdlcklkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIj4KLSAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24gcGF0dGVybj0ib3JnLmVjbGlwc2UuanN0Lm5hdmlnYXRvci5qMmVlLnVpLioiLz4KLSAgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24gcGF0dGVybj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLmZpbHRlcnMuKiIvPgotICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvdmlld2VyQ29udGVudEJpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLQk8bmF2aWdhdG9yQ29udGVudCBuYW1lPSIlZXh0ZW5zaW9uLmFwcGxpY2F0aW9uLm5hbWUiCi0JCXByaW9yaXR5PSJoaWdoZXN0IiBpY29uPSJpY29ucy9lYXJncm91cF9vYmouZ2lmIgotCQlhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0JCWNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVBUkNvbnRlbnRQcm92aWRlciIKLQkJbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVMYWJlbFByb3ZpZGVyIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0Lm5hdmlnYXRvci5qMmVlLnVpLkVBUkREQ29udGVudCI+Ci0JCTx0cmlnZ2VyUG9pbnRzPgotCQkJPG9yPgotCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLmlvLkZpbGUiIC8+Ci0JCQkJPGFuZD4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQk8b3I+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImNvbW1vbi54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImFwcGxpY2F0aW9uLnhtaSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0ibW9kdWxlbWFwLnhtaSIgLz4KLQkJCQkJPC9vcj4KLQkJCQk8L2FuZD4KLQkJCQk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPG9yPgotCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9ImpzdC5lYXI6MS40XSIgLz4KLQkJCQkJCTwvb3I+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9hbmQ+Ci0JCQk8L29yPgotCQk8L3RyaWdnZXJQb2ludHM+Ci0JCTwhLS0gIFRoZSBwb3NzaWJsZUNoaWxkcmVuIGlzIG1vcmUgdmVyYm9zZSB0byBhbGxvdyB0aGUgZHJvcCBoYW5kbGVycyB0byBiZSBpbnZva2VkIGZvciAKLQkJCWNoaWxkcmVuIG5vdCBwcm92aWRlZCBieSB0aGlzIGV4dGVuc2lvbgotCQktLT4KLQkJPHBvc3NpYmxlQ2hpbGRyZW4+Ci0JCQk8b3I+Ci0JCQkJPGluc3RhbmNlb2YgdmFsdWU9ImphdmEuaW8uRmlsZSIgLz4KLQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQk8b3I+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LndlYiIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWpiIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC51dGlsaXR5IiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmFwcGNsaWVudCIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuY29ubmVjdG9yIiAvPgotCQkJCQk8L29yPgotCQkJCTwvYWRhcHQ+Ci0JCQkJPGFuZD4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQk8b3I+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImNvbW1vbi54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImFwcGxpY2F0aW9uLnhtaSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0iY2xpZW50LnhtaSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0ibW9kdWxlbWFwLnhtaSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0iZWpiLnhtaSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0iamNhLnhtaSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0id2ViYXBwbGljYXRpb24ueG1pIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJqc3AueG1pIiAvPgotCQkJCQk8L29yPgotCQkJCTwvYW5kPgotCQkJPC9vcj4KLQkJPC9wb3NzaWJsZUNoaWxkcmVuPgotCQk8Y29tbW9uU29ydGVyCi0JCSAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkFwcGxpY2F0aW9uVmlld2VyU29ydGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5BcHBsaWNhdGlvblZpZXdlclNvcnRlciIgLz4KLQkJPCEtLSAgSGFuZGxlIG9wZW4gcmVxdWVzdHMgLS0+Ci0JCTxhY3Rpb25Qcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFQWN0aW9uUHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLkVBUkFjdGlvblByb3ZpZGVyIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQkJPG9yPgotCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJCXZhbHVlPSJjb21tb24ueG1pIiAvPgotCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJCXZhbHVlPSJhcHBsaWNhdGlvbi54bWkiIC8+Ci0JCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQkJdmFsdWU9Im1vZHVsZW1hcC54bWkiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyIiAvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvYWN0aW9uUHJvdmlkZXI+Ci0JCTxkcm9wQXNzaXN0YW50Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZC5BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5BZGRNb2R1bGVzVG9FQVIiPgotCQkJPHBvc3NpYmxlRHJvcFRhcmdldHM+Ci0JCQkJPG9yPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciIgLz4KLQkJCQk8L29yPgotCQkJPC9wb3NzaWJsZURyb3BUYXJnZXRzPgotCQk8L2Ryb3BBc3Npc3RhbnQ+Ci0JCTxkcm9wQXNzaXN0YW50Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZC5JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuSW1wb3J0SjJFRU1vZHVsZSI+Ci0JCQk8cG9zc2libGVEcm9wVGFyZ2V0cz4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L29yPgotCQkJPC9wb3NzaWJsZURyb3BUYXJnZXRzPgotCQk8L2Ryb3BBc3Npc3RhbnQ+Ci0KLQkJPCEtLSBFQVIgTmV3IC0tPgotCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5uZXdQcm9qZWN0cyIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5FYXJQcm9qZWN0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWpiIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5jb25uZWN0b3IiIC8+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LnV0aWxpdHkiIC8+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LndlYiIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJICA8aW5zdGFuY2VvZiB2YWx1ZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iLz4KLQkJCQkJICA8Y291bnQgdmFsdWU9IjAiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQk8IS0tIEVBUiBJbXBvcnQgLS0+Ci0JCTxjb21tb25XaXphcmQgdHlwZT0iaW1wb3J0IgotCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRJbXBvcnRXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJPCEtLSBVdGlsaXR5IEphciBJbXBvcnQgLS0+Ci0JCTxjb21tb25XaXphcmQgdHlwZT0iaW1wb3J0IgotCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldyI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZSIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0KLQkJPCEtLSBFQVIgZXhwb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImV4cG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iIC8+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCQotCQk8Y29tbW9uV2l6YXJkCi0JCQltZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkubmV3UHJvamVjdHMiIAotCQkJdHlwZT0ibmV3IgotCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5TaW1wbGVXZWJQcm9qZWN0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJICAgIDxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4gCi0JCTxjb21tb25XaXphcmQKLQkJCW1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5uZXdQcm9qZWN0cyIgCi0JCQl0eXBlPSJuZXciCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLndpemFyZC5uZXdKcGFQcm9qZWN0Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJICAgIDxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4JCQkJCQkJCQkJCQotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPiAKLQk8L25hdmlnYXRvckNvbnRlbnQ+Ci0JCi0JPG5hdmlnYXRvckNvbnRlbnQgbmFtZT0iJWV4dGVuc2lvbi5hcHBjbGllbnQubmFtZSIgcHJpb3JpdHk9ImhpZ2hlc3QiCi0JCWljb249Imljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYiIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLQkJY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUNvbnRlbnRQcm92aWRlciIKLQkJbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVMYWJlbFByb3ZpZGVyIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0Lm5hdmlnYXRvci5qMmVlLnVpLkFwcENsaWVudENvbnRlbnQiPgotCQk8dHJpZ2dlclBvaW50cz4KLQkJCTxvcj4KLQkJCQk8YW5kPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJCTxvcj4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0iY2xpZW50LnhtaSIgLz4KLQkJCQkJPC9vcj4KLQkJCQk8L2FuZD4KLQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJdmFsdWU9ImpzdC5hcHBjbGllbnQ6MS40XSIgLz4KLQkJCQk8L2FkYXB0PgotCQkJPC9vcj4KLQkJPC90cmlnZ2VyUG9pbnRzPgotCQk8cG9zc2libGVDaGlsZHJlbj4KLQkJCTxhbmQ+Ci0JCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCTxvcj4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQl2YWx1ZT0iY2xpZW50LnhtaSIgLz4KLQkJCQk8L29yPgotCQkJPC9hbmQ+Ci0JCTwvcG9zc2libGVDaGlsZHJlbj4KLQkJPGNvbW1vblNvcnRlcgotCQkgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFVmlld2VyU29ydGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFVmlld2VyU29ydGVyIiAvPgotCQk8IS0tICBIYW5kbGUgb3BlbiByZXF1ZXN0cyAtLT4KLQkJPGFjdGlvblByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVBY3Rpb25Qcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuQXBwQ2xpZW50QWN0aW9uUHJvdmlkZXIiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YW5kPgotCQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJCQk8b3I+Ci0JCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQkJdmFsdWU9ImNsaWVudC54bWkiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2FjdGlvblByb3ZpZGVyPgotCQkKLQkJPCEtLSBBcHBDbGllbnQgTmV3IC0tPgotCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5uZXdQcm9qZWN0cyIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5hcHBjbGllbnQuQXBwQ2xpZW50UHJvamVjdFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmFwcGNsaWVudCIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJICA8aW5zdGFuY2VvZiB2YWx1ZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iLz4KLQkJCQkJICA8Y291bnQgdmFsdWU9IjAiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQk8IS0tIEFwcCBDbGllbnQgSW1wb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImltcG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJICA8aW5zdGFuY2VvZiB2YWx1ZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iLz4KLQkJCQkJICA8Y291bnQgdmFsdWU9IjAiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQk8IS0tIEFwcCBDbGllbnQgZXhwb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImV4cG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmFwcGNsaWVudCIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50IiAvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCTwvbmF2aWdhdG9yQ29udGVudD4KLQkJCi0JPG5hdmlnYXRvckNvbnRlbnQgbmFtZT0iJWV4dGVuc2lvbi53ZWIubmFtZSIgcHJpb3JpdHk9ImhpZ2hlc3QiCi0JCWljb249Imljb25zL3dlYmdyb3VwX29iai5naWYiIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLQkJY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUNvbnRlbnRQcm92aWRlciIKLQkJbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVMYWJlbFByb3ZpZGVyIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0Lm5hdmlnYXRvci5qMmVlLnVpLldlYkREQ29udGVudCI+Ci0JCTx0cmlnZ2VyUG9pbnRzPgotCQkJPG9yPgotCQkJCTxhbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJPG9yPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJ3ZWJhcHBsaWNhdGlvbi54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImpzcC54bWkiIC8+Ci0JCQkJCTwvb3I+Ci0JCQkJPC9hbmQ+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCXZhbHVlPSJqc3Qud2ViOjIuNF0iIC8+Ci0JCQkJPC9hZGFwdD4KLQkJCTwvb3I+Ci0JCTwvdHJpZ2dlclBvaW50cz4KLQkJPHBvc3NpYmxlQ2hpbGRyZW4+Ci0JCSAgPG9yPgotCQkJPGFuZD4KLQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiLz4KLQkJCQk8b3I+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJdmFsdWU9IndlYmFwcGxpY2F0aW9uLnhtaSIgLz4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQl2YWx1ZT0ianNwLnhtaSIgLz4KLQkJCQk8L29yPgotCQkJPC9hbmQ+Ci0JCSAgPC9vcj4KLQkJPC9wb3NzaWJsZUNoaWxkcmVuPgotCQk8Y29tbW9uU29ydGVyCi0JCSAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiIC8+Ci0JCTwhLS0gIEhhbmRsZSBvcGVuIHJlcXVlc3RzIC0tPgotCQk8YWN0aW9uUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUFjdGlvblByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5XZWJBY3Rpb25Qcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8YW5kPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJCTxvcj4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0id2ViYXBwbGljYXRpb24ueG1pIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJqc3AueG1pIiAvPgotCQkJCQk8L29yPgotCQkJCTwvYW5kPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2FjdGlvblByb3ZpZGVyPgotCQk8YWN0aW9uUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuTmV3QWN0aW9uUHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLldlYk5ld0FjdGlvblByb3ZpZGVyIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5XZWJHcm91cEl0ZW1Qcm92aWRlciIvPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2FjdGlvblByb3ZpZGVyPgotCi0JCTwhLS0gV2ViIE5ldyAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkubmV3UHJvamVjdHMiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViUHJvamVjdFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCQotCQk8IS0tIFdlYiBJbXBvcnQgLS0+Ci0JCTxjb21tb25XaXphcmQgdHlwZT0iaW1wb3J0IgotCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRJbXBvcnRXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJPCEtLSBXZWIgRXhwb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImV4cG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LndlYiIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLldlYkdyb3VwSXRlbVByb3ZpZGVyIiAvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCi0JCTwhLS0gVGhlIGNvbnRyaWJ1dGlvbiBvZiB0aGUgTmV3ICouanNwIHdpemFyZCB0byBGaWxlcywgRm9sZGVycywgYW5kIFByb2plY3RzIAotCQkJaXMgaGFuZGxlZCBpbiBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLiBUaGlzIGNvbnRyaWJ1dGlvbiBhZGRzIHRoZSAKLQkJCXdpemFyZCB0byB0aGUgbW9kZWwgZWxlbWVudHMgY29udHJpYnV0ZWQgYnkgdGhlIEoyRUUgQ29udGVudCBQcm92aWRlciAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQuTmV3SlNQV2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5XZWJHcm91cEl0ZW1Qcm92aWRlciIgLz4KLQotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCIgLz4KLQotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCi0JCTwhLS0gVGhlIGNvbnRyaWJ1dGlvbiBvZiB0aGUgTmV3ICouaHRtbCB3aXphcmQgdG8gRmlsZXMsIEZvbGRlcnMsIGFuZCBQcm9qZWN0cyAKLQkJCWlzIGhhbmRsZWQgaW4gb3JnLmVjbGlwc2UuanN0Lmh0bWwudWkuIFRoaXMgY29udHJpYnV0aW9uIGFkZHMgdGhlIAotCQkJd2l6YXJkIHRvIHRoZSBtb2RlbCBlbGVtZW50cyBjb250cmlidXRlZCBieSB0aGUgSjJFRSBDb250ZW50IFByb3ZpZGVyIC0tPgotCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQuTmV3SFRNTFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViR3JvdXBJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIiAvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQkKLQkJPCEtLSBOZXcgU2VydmxldCAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS53ZWJjbGFzcyIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZFNlcnZsZXRXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LndlYiIvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQkJPG9yPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiLz4KLQkJCQkJCTwvb3I+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5JQ29tcHJlc3NlZE5vZGUiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5XZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXIiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0Ii8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlciIvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nIi8+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCQotCQk8IS0tIE5ldyBGaWx0ZXIgLS0+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkud2ViY2xhc3MiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRGaWx0ZXJXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LndlYiIvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQkJPG9yPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiLz4KLQkJCQkJCTwvb3I+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5JQ29tcHJlc3NlZE5vZGUiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5XZWJGaWx0ZXJzR3JvdXBJdGVtUHJvdmlkZXIiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXIiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5XZWJGaWx0ZXJNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nIi8+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCQotCQk8IS0tIE5ldyBMaXN0ZW5lciAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS53ZWJjbGFzcyIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZExpc3RlbmVyV2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ii8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSUNvbXByZXNzZWROb2RlIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlciIvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lciIvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCTwvbmF2aWdhdG9yQ29udGVudD4KLQk8bmF2aWdhdG9yQ29udGVudCBuYW1lPSIlZXh0ZW5zaW9uLmVqYi5uYW1lIiBwcmlvcml0eT0iaGlnaGVzdCIKLQkJaWNvbj0iaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZiIgYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotCQljb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFQ29udGVudFByb3ZpZGVyIgotCQlsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUxhYmVsUHJvdmlkZXIiCi0JCWlkPSJvcmcuZWNsaXBzZS5qc3QubmF2aWdhdG9yLmoyZWUudWkuRUpCRERDb250ZW50Ij4KLQkJPHRyaWdnZXJQb2ludHM+Ci0JCQk8b3I+Ci0JCQkJPGFuZD4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCXZhbHVlPSJlamIueG1pIiAvPgotCQkJCTwvYW5kPgotCQkJCTxhbmQ+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+IAotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lamI6Mi4xXSIgLz4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4KLQkJCTwvb3I+Ci0JCTwvdHJpZ2dlclBvaW50cz4KLQkJPHBvc3NpYmxlQ2hpbGRyZW4+Ci0JCQk8b3I+Ci0JCQkJPGFuZD4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQk8b3I+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImVqYi54bWkiIC8+Ci0JCQkJCTwvb3I+Ci0JCQkJPC9hbmQ+Ci0JCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIiLz4KLSAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkdyb3VwZWRFSkJJdGVtUHJvdmlkZXIiLz4KLQkJCTwvb3I+Ci0gICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkxvYWRpbmdERE5vZGUiLz4KLQkJPC9wb3NzaWJsZUNoaWxkcmVuPgotCQk8Y29tbW9uU29ydGVyCi0JCSAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiIC8+Ci0JCTwhLS0gIEhhbmRsZSBvcGVuIHJlcXVlc3RzIC0tPgotCQk8YWN0aW9uUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUFjdGlvblByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5FSkJBY3Rpb25Qcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCQl2YWx1ZT0iZWpiLnhtaSIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIi8+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9hY3Rpb25Qcm92aWRlcj4KLQkJPCEtLSAgQnkgZGVmYXVsdCwgYW55dGhpbmcgdGhhdCBjYW4gYWRhcHQgdG8gYW4gSVJlc291cmNlIGdldHMgIE5ldyBBY3Rpb24gUHJvdmlkZXIgKGZyb20gdGhlIFJlc291cmNlcyBleHRlbnNpb24pLAotCQkJc28gd2UganVzdCBuZWVkIHRvIGFkZCBvbmUgZm9yIHRoZSBFSkIgSXRlbSBQcm92aWRlcnMgKHRoZSBncm91cGluZ3MgaW4gdGhlIHRyZWUpIAotCQktLT4KLQkJPGFjdGlvblByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLk5ld0FjdGlvblByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FamJOZXdBY3Rpb25Qcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8aW5zdGFuY2VvZgotCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkdyb3VwZWRFSkJJdGVtUHJvdmlkZXIiIC8+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvYWN0aW9uUHJvdmlkZXI+Ci0KLQkJPCEtLSBFSkIgTmV3IC0tPgotCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5uZXdQcm9qZWN0cyIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aS5wcm9qZWN0LmZhY2V0LkVqYlByb2plY3RXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lamIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJPCEtLSBFSkIgSW1wb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImltcG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5FSkJDb21wb25lbnRJbXBvcnRXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lamIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJPCEtLSBFSkIgRXhwb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImV4cG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5FSkJDb21wb25lbnRFeHBvcnRXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWpiIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIiIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkdyb3VwZWRFSkJJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0KLQkJPCEtLSBBZGQgRW50ZXJwcmlzZSBCZWFuIC0tPgotCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpIgotICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuYW5ub3RhdGlvbi51aS5pbnRlcm5hbC53aXphcmRzLkFkZEVqYldpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxhZGFwdAotCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lamIueGRvY2xldCIgLz4KLQkJCQkJPC9hZGFwdD4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIiIC8+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9ImpzdC5lamIueGRvY2xldCIgLz4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8YW5kPgotCQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUl0ZW1Qcm92aWRlciIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvdmlkZXIucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWpiLnhkb2NsZXQiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotICAJCTxjb21tb25XaXphcmQKLSAgICAgICAgCQltZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aSIKLSAgICAgICAgCQl0eXBlPSJuZXciCi0gICAgICAgIAkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkFkZFNlc3Npb25CZWFuV2l6YXJkIj4KLSAgICAgCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWpiOjMuMCIvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQkJPG9yPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiLz4KLQkJCQkJCTwvb3I+Ci0JCQkJCTwvYW5kPgotCQkJCQk8YW5kPgotCQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphciIgLz4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0ianN0LmVqYjozLjAiIC8+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb3ZpZGVyLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVqYi54ZG9jbGV0IiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotICAJCTwvY29tbW9uV2l6YXJkPgotICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aSIKLSAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkFkZE1lc3NhZ2VEcml2ZW5CZWFuV2l6YXJkIj4KLSAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWpiOjMuMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ij4KLSAgICAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QiPgotICAgICAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ij4KLSAgICAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIiPgotICAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC5lamI6My4wIj4KLSAgICAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvdmlkZXIucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWpiLnhkb2NsZXQiPgotICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICA8L29yPgotICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICA8L2NvbW1vbldpemFyZD4KLQk8L25hdmlnYXRvckNvbnRlbnQ+Ci0JPG5hdmlnYXRvckNvbnRlbnQgbmFtZT0iJWV4dGVuc2lvbi5jb25uZWN0b3IubmFtZSIKLQkJcHJpb3JpdHk9ImhpZ2hlc3QiIGljb249Imljb25zL2Nvbm5lY3Rvcmdyb3VwX29iai5naWYiCi0JCWFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLQkJY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUNvbnRlbnRQcm92aWRlciIKLQkJbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVMYWJlbFByb3ZpZGVyIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0Lm5hdmlnYXRvci5qMmVlLnVpLkNvbm5lY3RvckREQ29udGVudCI+Ci0JCTx0cmlnZ2VyUG9pbnRzPgotCQkJPG9yPgotCQkJCTxhbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQl2YWx1ZT0iamNhLnhtaSIgLz4KLQkJCQk8L2FuZD4KLQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJdmFsdWU9ImpzdC5jb25uZWN0b3IiIC8+Ci0JCQkJPC9hZGFwdD4KLQkJCTwvb3I+Ci0JCTwvdHJpZ2dlclBvaW50cz4KLQkJPHBvc3NpYmxlQ2hpbGRyZW4+Ci0JCQk8YW5kPgotCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQl2YWx1ZT0iamNhLnhtaSIgLz4KLQkJCTwvYW5kPgotCQk8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0JCTxjb21tb25Tb3J0ZXIKLQkJICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVZpZXdlclNvcnRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVZpZXdlclNvcnRlciIgLz4KLQkJPCEtLSAgSGFuZGxlIG9wZW4gcmVxdWVzdHMgLS0+Ci0JCTxhY3Rpb25Qcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFQWN0aW9uUHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLkNvbm5lY3RvckFjdGlvblByb3ZpZGVyIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxhbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQl2YWx1ZT0iamNhLnhtaSIgLz4KLQkJCQk8L2FuZD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9hY3Rpb25Qcm92aWRlcj4KLQotCQk8IS0tIENvbm5lY3RvciBOZXcgLS0+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLm5ld1Byb2plY3RzIgotICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvclByb2plY3RXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5jb25uZWN0b3IiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJPCEtLSBDb25uZWN0b3IgaW1wb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImltcG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmNvbm5lY3RvciIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUFkYXB0ZXJJbXBsIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCTwhLS0gQ29ubmVjdG9yIEV4cG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJleHBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuY29ubmVjdG9yIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLlJlc291cmNlQWRhcHRlckltcGwiIC8+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JPC9uYXZpZ2F0b3JDb250ZW50PgotIDxjb21tb25GaWx0ZXIKLSAgICAgICBhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0gICAgICAgZGVzY3JpcHRpb249IiVmaWx0ZXIuamV0ZW1pdHRlcnMuZGVzY3JpcHRpb24iCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5maWx0ZXJzLmpldGVtaXR0ZXJzIgotICAgICAgIG5hbWU9IiVmaWx0ZXIuamV0ZW1pdHRlcnMubmFtZSI+Ci0gICAgPGZpbHRlckV4cHJlc3Npb24+Ci0gICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmFtZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iLkpFVEVtaXR0ZXJzIi8+Ci0gICAgICAgPC9hZGFwdD4KLSAgICA8L2ZpbHRlckV4cHJlc3Npb24+Ci0gPC9jb21tb25GaWx0ZXI+CQkJCi0gCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICA8ZXh0ZW5zaW9uIAotICAJCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgIDxmYWN0b3J5Ci0gICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0IgotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUVNRkFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIvPgotICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotICAgIDwvZmFjdG9yeT4KLSAgICA8ZmFjdG9yeQotICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRUF0dHJpYnV0ZSIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVFTUZBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiLz4KLSAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotICAgICAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgICAgICAgICAgTGFiZWwgRGVjb3JhdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGxvY2F0aW9uPSJUT1BfTEVGVCIKLSAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgbGFiZWw9IiVqMmVlUHJvamVjdERlY29yYXRvciIKLSAgICAgICAgICAgIHN0YXRlPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFUHJvamVjdERlY29yYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVByb2plY3REZWNvcmF0b3IiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgIDxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgotICAgICAgICAgICAgPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCIvPgotICAgICAgICAgICA8L29yPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWoyZWVQcm9qZWN0RGVjb3JhdG9yLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9kZWNvcmF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbGFiZWw9IiVQUk9CTEVNX01BUktFUl9MQUJFTF9SRVNPVVJDRV9ERUNPUkFUT1IiCi0gICAgICAgICAgICBzdGF0ZT0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQudWkuUHJvYmxlbXNMYWJlbERlY29yYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuamF2YS5yZXNvdXJjZS5kZWNvcmF0b3IiPgotICAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPiAKLSAgICAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgPC9leHRlbnNpb24+ICAKLSAgICAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjczMjA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuajJlZS51aS5uYXZpZ2F0b3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0gIAkJPGNvcHkgZmlsZT0iJHtwbHVnaW5kaXJ9L3BsdWdpbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0ZjQxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2ViLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Indhci12YWxpZGF0aW9uLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndlYmVkaXQvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2VicHJvamVjdC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjliMzY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1ydW50aW1lCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLmpldHByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uamV0cHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjExNjkzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uamV0cHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08amV0LXNldHRpbmdzPgotCTx0ZW1wbGF0ZS1jb250YWluZXI+dGVtcGxhdGVzPC90ZW1wbGF0ZS1jb250YWluZXI+CTxzb3VyY2UtY29udGFpbmVyPndlYjwvc291cmNlLWNvbnRhaW5lcj4KLTwvamV0LXNldHRpbmdzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3Y2YzNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5KRVRCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmpldC5JSkVUTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5YTgxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jTW9uIEZlYiAxOCAxNTo1NzowOSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmMzFhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFdlYiBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4yMDcucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY2xhc3NwYXRoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmRlcGxveWFibGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmpmYWNlcy5leHRlbnNpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5kYXRhbW9kZWwucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIudmFsaWRhdGlvbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuamVlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhMjNjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSB3ZWIvLFwKLSAgICAgICAgICAgd2FyLXZhbGlkYXRpb24vLFwKLSAgICAgICAgICAgd2ViZWRpdC8sXAotICAgICAgICAgICB3ZWJwcm9qZWN0LyxcCi0gICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4YzRiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvU2VydmxldENyZWF0ZUluaXRQYXJhbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9TZXJ2bGV0Q3JlYXRlSW5pdFBhcmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyMjg5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9TZXJ2bGV0Q3JlYXRlSW5pdFBhcmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL1dlYkFwcENyZWF0ZUNvbnRleHRQYXJhbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9XZWJBcHBDcmVhdGVDb250ZXh0UGFyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDUwYTZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL1dlYkFwcENyZWF0ZUNvbnRleHRQYXJhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9XZWJSZXNvdXJjZUNvbGxlY3Rpb25DcmVhdGVVUkxQYXR0ZXJuVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9XZWJSZXNvdXJjZUNvbGxlY3Rpb25DcmVhdGVVUkxQYXR0ZXJuVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNzVlYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvV2ViUmVzb3VyY2VDb2xsZWN0aW9uQ3JlYXRlVVJMUGF0dGVyblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvYXV0aG9yaXR5X2NvbnN0cmFpbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvYXV0aG9yaXR5X2NvbnN0cmFpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjY0YzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2F1dGhvcml0eV9jb25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Vycm9yX2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Vycm9yX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9lcnJvcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9lcnJvcl9wYWdlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Vycm9yX3BhZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTFiMjFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Vycm9yX3BhZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZXJyb3Jjb2RlX2Vycm9ycGFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9lcnJvcmNvZGVfZXJyb3JwYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExYjIxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9lcnJvcmNvZGVfZXJyb3JwYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2V4Y2VwdGlvbl90eXBlX2Vycm9ycGFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9leGNlcHRpb25fdHlwZV9lcnJvcnBhZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQ1NTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2V4Y2VwdGlvbl90eXBlX2Vycm9ycGFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9leHBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2V4cG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzhhMGJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2V4cG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZmllbGQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZmllbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQzOGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2ZpZWxkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2ZpbHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9maWx0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzEyZDFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2ZpbHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9maWx0ZXJfbWFwcGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9maWx0ZXJfbWFwcGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMmUzNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZmlsdGVyX21hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZm9ybV9iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZm9ybV9iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJjMGIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Zvcm1fYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Zvcm1fbG9naW5fY29uZmlnLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Zvcm1fbG9naW5fY29uZmlnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmY2JiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mb3JtX2xvZ2luX2NvbmZpZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQXJyb3dEb3duLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9BcnJvd0Rvd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjJmMmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9BcnJvd0Rvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0Fycm93VXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0Fycm93VXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTQ3OWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9BcnJvd1VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjVlODEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWNhMTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NmZjNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZVR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjZmNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxODEyNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfaWNvbnNfSWNvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUpTUENvbmZpZ19wcm9wZXJ0eUdyb3Vwc19KU1BQcm9wZXJ0eUdyb3VwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVKU1BDb25maWdfcHJvcGVydHlHcm91cHNfSlNQUHJvcGVydHlHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOTdjNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUpTUENvbmZpZ19wcm9wZXJ0eUdyb3Vwc19KU1BQcm9wZXJ0eUdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVKU1BDb25maWdfdGFnTGlic19UYWdMaWJSZWZUeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVKU1BDb25maWdfdGFnTGlic19UYWdMaWJSZWZUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyMjlhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSlNQQ29uZmlnX3RhZ0xpYnNfVGFnTGliUmVmVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvYWRkX2NvbHVtbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvYWRkX2NvbHVtbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NmU1YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2FkZF9jb2x1bW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2Nvbm5lY3Rpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2Nvbm5lY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGVmZTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9jb25uZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9jb252ZXJ0bGlua3Nfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9jb252ZXJ0bGlua3Nfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3NWNiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvY29udmVydGxpbmtzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvZGVmYXVsdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvZGVmYXVsdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYmFjMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2RlZmF1bHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydGZ0cF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydGZ0cF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzY2ZTllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRmdHBfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkODU5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0ZnRwX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0ZnRwX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMGUwNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydGZ0cF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydGh0dHBfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRodHRwX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzY4NzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydGh0dHBfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYzA2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvbWV0aG9kLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9tZXRob2QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzM2NTEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9tZXRob2QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L21ldGhvZHJldHVybi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvbWV0aG9kcmV0dXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyODU5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvbWV0aG9kcmV0dXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3ZWJleF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYmV4X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZTg2ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYmV4X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2VicHJqX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2VicHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NTZiM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L3dhckZpbGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi93YXJGaWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWNiN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L3dhckZpbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWJfYXBwbGljYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYl9hcHBsaWNhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjYwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYl9hcHBsaWNhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvd2ViX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2N0b29sMTYvd2ViX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGQyZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9saW5rc3ZpZXcxNi9tYWlsdG9fdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2xpbmtzdmlldzE2L21haWx0b192aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmMTJmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL2xpbmtzdmlldzE2L21haWx0b192aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvSlNQQ29uZmlnLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvSlNQQ29uZmlnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmMGM0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L0pTUENvbmZpZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L0pTUFByb3BlcnR5R3JvdXAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9KU1BQcm9wZXJ0eUdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxNTU5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L0pTUFByb3BlcnR5R3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9UYWdMaWJSZWZUeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvVGFnTGliUmVmVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNTAwZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9UYWdMaWJSZWZUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvYXNjaWkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9hc2NpaS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMzAyODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9hc2NpaS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L2JpbmFyeS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L2JpbmFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjMzYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9iaW5hcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9lbnZpcm9ubWVudF9lbnRpdHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9lbnZpcm9ubWVudF9lbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA0M2Y5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvZW52aXJvbm1lbnRfZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvamFycHJvamVjdF9kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9qYXJwcm9qZWN0X2RlcGxveS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTRiZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9qYXJwcm9qZWN0X2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L2phdmFfcHJvcGVydGllcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L2phdmFfcHJvcGVydGllcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ODczZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9qYXZhX3Byb3BlcnRpZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9tZXRob2RfcmV0dXJuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvbWV0aG9kX3JldHVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1Mjg1OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9tZXRob2RfcmV0dXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvcHJvamxpYl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9wcm9qbGliX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTJkZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9wcm9qbGliX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi9zZXJ2bGV0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxYmVjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi93ZWIxMl9kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi93ZWIxMl9kZXBsb3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTA3NzQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvd2ViMTJfZGVwbG95LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvd2ViMTNfZGVwbG95LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvb2JqMTYvd2ViMTNfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM1MzlkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L3dlYjEzX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L3dlYnN0YXRpY19kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9vYmoxNi93ZWJzdGF0aWNfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MzFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL29iajE2L3dlYnN0YXRpY19kZXBsb3kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9zYW1wbGUxNi9mb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC9zYW1wbGUxNi9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFiMjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvc2FtcGxlMTYvZm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdGh1bWJuYWlsMTYvZGVmYXVsdEZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC90aHVtYm5haWwxNi9kZWZhdWx0RmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMzAyODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC90aHVtYm5haWwxNi9kZWZhdWx0RmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3RodW1ibmFpbDE2L2RlZmF1bHRGb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC90aHVtYm5haWwxNi9kZWZhdWx0Rm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxYjI2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3RodW1ibmFpbDE2L2RlZmF1bHRGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC92aWV3MTYvY29sb3VycGFsX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC92aWV3MTYvY29sb3VycGFsX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzY0MjQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L2NvbG91cnBhbF92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L2dhbGxlcnlfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3ZpZXcxNi9nYWxsZXJ5X3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjc3OWU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L2dhbGxlcnlfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3ZpZXcxNi9saW5rc192aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L2xpbmtzX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQ5Yzk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L2xpbmtzX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC92aWV3MTYvc2FtcGxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L3NhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTgxZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC92aWV3MTYvc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L3RodW1ibmFpbF92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvdmlldzE2L3RodW1ibmFpbF92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJhYmJjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3ZpZXcxNi90aHVtYm5haWxfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9mdHBpbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2Z0cGltcG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmM4YzNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2Z0cGltcG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vZnRwcHViX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9mdHBwdWJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiMmJkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9mdHBwdWJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2h0dHBpbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2h0dHBpbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjODE4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9odHRwaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9uZXd3ZWJleF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vbmV3d2ViZXhfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3YzI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9uZXd3ZWJleF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk0NGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmV4cG9ydF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vd2FyZXhwb3J0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTEyNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vd2FyZXhwb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi93YXJpbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmltcG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmJlYmU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmltcG9ydF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZ2V0c3RhcnRfYS5HSUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9nZXRzdGFydF9hLkdJRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzMWU2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9nZXRzdGFydF9hLkdJRgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2luaXRpYWxpel9wYXJhbWV0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmE1NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9pbml0aWFsaXpfcGFyYW1ldGVyX2NvbnRleHQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlcl9jb250ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyYTU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9pbml0aWFsaXpfcGFyYW1ldGVyX2NvbnRleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvanNwX2xpYnJhcnlfcmVmZXJlbmNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2pzcF9saWJyYXJ5X3JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5N2I1MGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvanNwX2xpYnJhcnlfcmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2pzcF90eXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2pzcF90eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2MzY3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9qc3BfdHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9rZXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMva2V5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhZjM4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9rZXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMva2V5X2ludGVyZl9vdi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9rZXlfaW50ZXJmX292LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3MDQ0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9rZXlfaW50ZXJmX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL21ldGhFbGVtZW50X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9tZXRoRWxlbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2UyN2NkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL21ldGhFbGVtZW50X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9taW1lX21hcHBpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbWltZV9tYXBwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0Nzc1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9taW1lX21hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbmV3anByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbmV3anByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDEzN2NkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL25ld2pwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL25ld2pwcmpfd2l6XzMyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL25ld2pwcmpfd2l6XzMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzNWVjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9uZXdqcHJqX3dpel8zMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9uZXdzZXJ2bGV0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9uZXdzZXJ2bGV0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWVhZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbmV3c2VydmxldF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbmV3d3Byal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvbmV3d3Byal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTU2YjNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL25ld3dwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3NlY3VyaXR5X2NvbnN0cmFpbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2VjdXJpdHlfY29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTU0MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2VjdXJpdHlfY29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2ZXJfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3NlcnZlcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU4YjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3NlcnZlcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2VydmxldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2bGV0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxYmVjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2bGV0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3NlcnZsZXRfbWFwcGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2bGV0X21hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDk1YWM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3NlcnZsZXRfbWFwcGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2bGV0X3R5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2VydmxldF90eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhOWQyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zZXJ2bGV0X3R5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2hvd2Vycl90c2suZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvc2hvd2Vycl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM2MDY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3Nob3dlcnJfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3Nob3d3YXJuX3Rzay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9zaG93d2Fybl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDAwOWU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3Nob3d3YXJuX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy91cmxfbWFwcGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy91cmxfbWFwcGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNWYwMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvdXJsX21hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvdXJsX3R5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvdXJsX3R5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZjNzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3VybF90eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3VzZXJfZGF0YV9jb25zdHJhaW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3VzZXJfZGF0YV9jb25zdHJhaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkYzljOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy91c2VyX2RhdGFfY29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy91c2VyX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy91c2VyX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4Nzk3ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvdXNlcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2FyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWNiN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2FyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dhcm5fdHNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dhcm5fdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiNzUxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93YXJuX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJfcmVzb3VyY2VfY29sbGVjdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJfcmVzb3VyY2VfY29sbGVjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmE3Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViX3Jlc291cmNlX2NvbGxlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViX3R5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViX3R5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWY2MDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYl90eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8xMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMTIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjQ2YzQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8xMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMTMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzEzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjMjRkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMTMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzE0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8xNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjkxNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzE0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8yMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMjIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJmNDNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8yMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMjMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzIzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiY2UwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJhcHBfMjMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzI0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmFwcF8yNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDQ1YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2ViYXBwXzI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWJncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzRkMzYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlYmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWxjb21lX2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2VsY29tZV9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkYWI4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy93ZWxjb21lX2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2VsY29tZV9saXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3dlbGNvbWVfbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YzcxMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvd2VsY29tZV9saXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3htbF9pbWFnZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy94bWxfaW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDk2Y2JhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL3htbF9pbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmY4ZjFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi13YXJfdmFsaWRhdG9yX1VJXz1XYXIgVmFsaWRhdG9yCi1XRUJfRkFDRVRfTEFCRUw9RHluYW1pYyBXZWIgTW9kdWxlCi1XRUJfRkFDRVRfREVTQ1JJUFRJT049QWRkcyBzdXBwb3J0IGZvciB0aGUgSmF2YSBTZXJ2bGV0IEFQSSwgZm9yIGdlbmVyYXRpb24gb2YgZHluYW1pYyBXZWIgcGFnZSBjb250ZW50LgotV0VCX0ZBQ0VUX1RFTVBMQVRFX0xBQkVMPUR5bmFtaWMgV2ViIFByb2plY3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGIzMjkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAKLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIFdlYiBKU0ZhY2VzIEZpbGUgVVJMIGV4dGVuc2lvbiAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImZpbGVVUkwiIG5hbWU9IkZpbGVVUkwiIHNjaGVtYT0ic2NoZW1hL2ZpbGVVUkwuZXhzZCIvPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIFdlYiBWYWxpZGF0b3IgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IldhclZhbGlkYXRvciIKLSAgICAgICAgIG5hbWU9IiV3YXJfdmFsaWRhdG9yX1VJXyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotICAgICAgPHZhbGlkYXRvcj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgCQk8YW5kPgotICAgICAgICAJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqc3Qud2ViIi8+Ci0JICAJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiB2YWx1ZT0ianN0LndlYjoyLjRdIi8+Ci0JCQk8L2FuZD4KLQkJPC9lbmFibGVtZW50PgotICAgICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYkREIj4KLSAgICAgICAgIDwvY29udGVudFR5cGVCaW5kaW5nPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5qYXIiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSIud2Vic2V0dGluZ3MiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9Ii5jbGFzc3BhdGgiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8aGVscGVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnZhbGlkYXRpb24uVUlXYXJIZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICAgICA8ZGVwZW5kZW50VmFsaWRhdG9yCi0gICAgICAgICAgICAgICBkZXBWYWxWYWx1ZT0idHJ1ZSI+Ci0gICAgICAgICA8L2RlcGVuZGVudFZhbGlkYXRvcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudmFsaWRhdGlvbi5VSVdhclZhbGlkYXRvciI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgICAgIDxydW5TdHJhdGVneSAKLSAgICAgICAgIAlwcm9qZWN0PSJ0cnVlIj4KLSAgICAgICAgIDwvcnVuU3RyYXRlZ3k+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iV2ViTW9kdWxlRXh0ZW5zaW9uIgotICAgICAgICAgbmFtZT0iV2ViTW9kdWxlRXh0ZW5zaW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkVBUk1vZHVsZUV4dGVuc2lvbiI+Ci0gICAgICA8ZWFyTW9kdWxlRXh0ZW5zaW9uCi0gICAgICAgICAgICBleHRlbnNpb25DbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJNb2R1bGVFeHRlbnNpb25JbXBsIj4KLSAgICAgIDwvZWFyTW9kdWxlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uYWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJ3ZWJhcHBsaWNhdGlvbi54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24ucHJvdmlkZXIuV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uYWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLkpzcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0ianNwLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qc3AucHJvdmlkZXIuSnNwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgIFdlYiBUYWcgc2V0IGRlZmluaXRpb25zIGZvciBYRG9jbGV0ICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJXZWJUYWdTZXRzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uVGFnU2V0Ij4KLSAgICAgIDxBbm5vdGF0aW9uVGFnU2V0Ci0gICAgICAgICAgICBuYW1lPSJ3ZWIiPgotICAgICAgPC9Bbm5vdGF0aW9uVGFnU2V0PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJXZWJBbm5vdGF0aW9uSW5mbyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIuQW5ub3RhdGlvblRhZ0luZm8iPgotCSAgPEFubm90YXRpb25UYWdJbmZvCi0gICAgICAgICAgICB0YWdTZXQ9IndlYiIKLSAgICAgICAgICAgIHRhZ05hbWU9ImZpbHRlciIKLSAgICAgICAgICAgIHNjb3BlPSJ0eXBlIj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICBuYW1lPSJuYW1lIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0iZGVzY3JpcHRpb24iPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJkaXNwbGF5LW5hbWUiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJzbWFsbC1pY29uIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0ibGFyZ2UtaWNvbiI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgIDwvQW5ub3RhdGlvblRhZ0luZm8+Ci0gICAgICA8QW5ub3RhdGlvblRhZ0luZm8KLSAgICAgICAgICAgIHRhZ1NldD0id2ViIgotICAgICAgICAgICAgdGFnTmFtZT0iZmlsdGVyLWluaXQtcGFyYW0iCi0gICAgICAgICAgICBzY29wZT0idHlwZSI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgbmFtZT0ibmFtZSI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9InZhbHVlIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0iZGVzY3JpcHRpb24iPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICA8L0Fubm90YXRpb25UYWdJbmZvPgotICAgICAgPEFubm90YXRpb25UYWdJbmZvCi0gICAgICAgICAgICB0YWdTZXQ9IndlYiIKLSAgICAgICAgICAgIHRhZ05hbWU9ImZpbHRlci1tYXBwaW5nIgotICAgICAgICAgICAgc2NvcGU9InR5cGUiPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0idXJsLXBhdHRlcm4iPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJzZXJ2bGV0LW5hbWUiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICA8L0Fubm90YXRpb25UYWdJbmZvPgotICAgICAgPEFubm90YXRpb25UYWdJbmZvCi0gICAgICAgICAgICB0YWdTZXQ9IndlYiIKLSAgICAgICAgICAgIHRhZ05hbWU9InNlcnZsZXQiCi0gICAgICAgICAgICBzY29wZT0idHlwZSI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgbmFtZT0ibmFtZSI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9ImRpc3BsYXktbmFtZSI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9Imljb24iPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJkZXNjcmlwdGlvbiI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9ImxvYWQtb24tc3RhcnR1cCI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9InJ1bi1hcyI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgIDwvQW5ub3RhdGlvblRhZ0luZm8+Ci0gICAgICA8QW5ub3RhdGlvblRhZ0luZm8KLSAgICAgICAgICAgIHRhZ1NldD0id2ViIgotICAgICAgICAgICAgdGFnTmFtZT0ic2VydmxldC1pbml0LXBhcmFtIgotICAgICAgICAgICAgbXVsdGlwbGljaXR5PSIqIgotICAgICAgICAgICAgc2NvcGU9InR5cGUiPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hbWUiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJ2YWx1ZSI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9ImRlc2NyaXB0aW9uIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgPC9Bbm5vdGF0aW9uVGFnSW5mbz4KLSAgICAgIDxBbm5vdGF0aW9uVGFnSW5mbwotICAgICAgICAgICAgdGFnU2V0PSJ3ZWIiCi0gICAgICAgICAgICB0YWdOYW1lPSJzZXJ2bGV0LW1hcHBpbmciCi0gICAgICAgICAgICBtdWx0aXBsaWNpdHk9IioiCi0gICAgICAgICAgICBzY29wZT0idHlwZSI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgbmFtZT0idXJsLXBhdHRlcm4iPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICA8L0Fubm90YXRpb25UYWdJbmZvPgotICAgICAgPEFubm90YXRpb25UYWdJbmZvCi0gICAgICAgICAgICB0YWdTZXQ9IndlYiIKLSAgICAgICAgICAgIHRhZ05hbWU9Imxpc3RlbmVyIgotICAgICAgICAgICAgc2NvcGU9InR5cGUiPgotICAgICAgPC9Bbm5vdGF0aW9uVGFnSW5mbz4KLSAgICAgIDxBbm5vdGF0aW9uVGFnSW5mbwotICAgICAgICAgICAgdGFnU2V0PSJ3ZWIiCi0gICAgICAgICAgICB0YWdOYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLSAgICAgICAgICAgIHNjb3BlPSJ0eXBlIj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICBuYW1lPSJyb2xlLW5hbWUiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgbmFtZT0icm9sZS1saW5rIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgPC9Bbm5vdGF0aW9uVGFnSW5mbz4KLSAgICAgIDxBbm5vdGF0aW9uVGFnSW5mbwotICAgICAgICAgICAgdGFnU2V0PSJ3ZWIiCi0gICAgICAgICAgICB0YWdOYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgc2NvcGU9InR5cGUiPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hbWUiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgbmFtZT0idHlwZSI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9ImRlc2NyaXB0aW9uIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgPC9Bbm5vdGF0aW9uVGFnSW5mbz4KLSAgICAgIDxBbm5vdGF0aW9uVGFnSW5mbwotICAgICAgICAgICAgdGFnU2V0PSJ3ZWIiCi0gICAgICAgICAgICB0YWdOYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICBzY29wZT0idHlwZSI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgbmFtZT0ibmFtZSI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICBuYW1lPSJ0eXBlIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgIG5hbWU9ImF1dGgiPgotICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICA8YXR0cmliCi0gICAgICAgICAgICAgICBuYW1lPSJkZXNjcmlwdGlvbiI+Ci0gICAgICAgICA8L2F0dHJpYj4KLSAgICAgICAgIDxhdHRyaWIKLSAgICAgICAgICAgICAgIG5hbWU9InNjb3BlIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0iam5kaS1uYW1lIj4KLSAgICAgICAgIDwvYXR0cmliPgotICAgICAgPC9Bbm5vdGF0aW9uVGFnSW5mbz4KLSAgICAgIDxBbm5vdGF0aW9uVGFnSW5mbwotICAgICAgICAgICAgdGFnU2V0PSJ3ZWIiCi0gICAgICAgICAgICB0YWdOYW1lPSJzZWN1cml0eS1yb2xlIgotICAgICAgICAgICAgc2NvcGU9InR5cGUiPgotICAgICAgICAgICAgPGF0dHJpYgotICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgIG5hbWU9InJvbGUtbmFtZSI+Ci0gICAgICAgICAJPC9hdHRyaWI+Ci0gICAgICAgICAJPGF0dHJpYgotICAgICAgICAgICAgICAgbmFtZT0iZGVzY3JpcHRpb24iPgotICAgICAgICAgCTwvYXR0cmliPgotICAgICAgPC9Bbm5vdGF0aW9uVGFnSW5mbz4KLSAgICAgIDxBbm5vdGF0aW9uVGFnSW5mbwotICAgICAgICAgICAgdGFnU2V0PSJ3ZWIiCi0gICAgICAgICAgICB0YWdOYW1lPSJlbnYtZW50cnkiCi0gICAgICAgICAgICBzY29wZT0idHlwZSI+Ci0gICAgICAgICAgICA8YXR0cmliIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICAgICA8YXR0cmliIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICA8YXR0cmliIG5hbWU9InR5cGUiIHR5cGU9ImVudW0iPgotICAgICAgICAgICAgCTxlbnVtVmFsdWVzIHZhbHVlPSJqYXZhLmxhbmcuQm9vbGVhbiIvPgotICAgICAgICAgICAgCTxlbnVtVmFsdWVzIHZhbHVlPSJqYXZhLmxhbmcuQnl0ZSIvPgotCQkJCTxlbnVtVmFsdWVzIHZhbHVlPSJqYXZhLmxhbmcuQ2hhcmFjdGVyIi8+Ci0JCQkJPGVudW1WYWx1ZXMgdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLQkJCQk8ZW51bVZhbHVlcyB2YWx1ZT0iamF2YS5sYW5nLlNob3J0Ii8+Ci0JCQkJPGVudW1WYWx1ZXMgdmFsdWU9ImphdmEubGFuZy5JbnRlZ2VyIi8+Ci0JCQkJPGVudW1WYWx1ZXMgdmFsdWU9ImphdmEubGFuZy5Mb25nIi8+Ci0JCQkJPGVudW1WYWx1ZXMgdmFsdWU9ImphdmEubGFuZy5GbG9hdCIvPgotCQkJCTxlbnVtVmFsdWVzIHZhbHVlPSJqYXZhLmxhbmcuRG91YmxlIi8+Ci0JCQk8L2F0dHJpYj4KLSAgICAgICAgICAgIDxhdHRyaWIgbmFtZT0idmFsdWUiLz4KLSAgICAgIDwvQW5ub3RhdGlvblRhZ0luZm8+Ci0gICAgICA8QW5ub3RhdGlvblRhZ0luZm8KLSAgICAgICAgICAgIHRhZ1NldD0id2ViIgotICAgICAgICAgICAgdGFnTmFtZT0iZWpiLXJlZiIKLSAgICAgICAgICAgIHNjb3BlPSJ0eXBlIj4KLSAgICAgICAgICA8YXR0cmliIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICA8YXR0cmliIG5hbWU9InR5cGUiIHR5cGU9ImVudW0iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgIAk8ZW51bVZhbHVlcyB2YWx1ZT0iRW50aXR5Ii8+Ci0gICAgICAgICAgCTxlbnVtVmFsdWVzIHZhbHVlPSJTZXNzaW9uIi8+Ci0gICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICAgPGF0dHJpYiBuYW1lPSJob21lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICAgPGF0dHJpYiBuYW1lPSJyZW1vdGUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICA8YXR0cmliIG5hbWU9ImxpbmsiLz4KLSAgICAgICAgICA8YXR0cmliIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0gICAgICA8L0Fubm90YXRpb25UYWdJbmZvPgotICAgICAgPEFubm90YXRpb25UYWdJbmZvCi0gICAgICAgICAgICB0YWdTZXQ9IndlYiIKLSAgICAgICAgICAgIHRhZ05hbWU9ImVqYi1sb2NhbC1yZWYiCi0gICAgICAgICAgICBzY29wZT0idHlwZSI+Ci0gICAgICAgICAgICA8YXR0cmliIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICA8YXR0cmliIG5hbWU9InR5cGUiIHR5cGU9ImVudW0iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgIAk8ZW51bVZhbHVlcyB2YWx1ZT0iRW50aXR5Ii8+Ci0gICAgICAgICAgCTxlbnVtVmFsdWVzIHZhbHVlPSJTZXNzaW9uIi8+Ci0gICAgICAgICAgPC9hdHRyaWI+Ci0gICAgICAgICAgPGF0dHJpYiBuYW1lPSJob21lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICAgPGF0dHJpYiBuYW1lPSJsb2NhbCIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgIDxhdHRyaWIgbmFtZT0ibGluayIvPgotICAgICAgICAgIDxhdHRyaWIgbmFtZT0iZGVzY3JpcHRpb24iLz4KLSAgICAgIDwvQW5ub3RhdGlvblRhZ0luZm8+ICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLQotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsIj4KLSAgICAgIDxlZGl0TW9kZWwKLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSJqc3Qud2ViIgotICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5KYXZhQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5Ij4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgYXV0b2xvYWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgVVJJPSJXRUItSU5GL3dlYi54bWwiLz4KLSAgICAgIDwvZWRpdE1vZGVsPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuYXJ0aWZhY3RlZGl0Ij4KLSAgICAgIDxhcnRpZmFjdGVkaXQKLSAgICAgICAgICAgIHR5cGVJRD0ianN0LndlYiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdCI+Ci0gICAgICA8L2FydGlmYWN0ZWRpdD4KLSAgIDwvZXh0ZW5zaW9uPiAKLSAgIAotICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDwhLS0gQnVpbGRlciBQcm92aWRlciByZWdpc3RyYXRpb25zLS0+Ci0gICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iPgotICAgICAJPFByb3ZpZGVyRGVmaW5lc1R5cGUKLSAgICAgIAkJcHJvdmlkZXJUeXBlPSJqc3Qud2ViLmJ1aWxkZXIiCi0gICAgICAJCXByb3ZpZGVySUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkphdmFDb21wb25lbnRCdWlsZGVyRGF0YU1vZGVsUHJvdmlkZXIiLz4KLQkJPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIiLz4KLQk8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5EYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiI+Ci0gICAgPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIiPgotICAgIDwvRGF0YU1vZGVsUHJvdmlkZXI+Ci0gPC9leHRlbnNpb24+Ci0gPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iPgotICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlciI+Ci0gICAgPC9EYXRhTW9kZWxQcm92aWRlcj4KLSA8L2V4dGVuc2lvbj4KLQkKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiPgotICAgIDxjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5jbGFzc3BhdGguV2ViQXBwTGlicmFyaWVzQ29udGFpbmVySW5pdGlhbGl6ZXIiCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmNvbnRhaW5lciIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDwhLS0gUHJvamVjdCBGYWNldHMgLS0+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImpzdC53ZWIiPgotICAgICAgPGxhYmVsPiVXRUJfRkFDRVRfTEFCRUw8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPiVXRUJfRkFDRVRfREVTQ1JJUFRJT048L2Rlc2NyaXB0aW9uPgotICAgICAgPGRlZmF1bHQtdmVyc2lvbiB2ZXJzaW9uPSIyLjQiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjIiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxhbmQ+Ci0gICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzEuMyIvPgotICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KLSAgICAgICAgPC9hbmQ+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjMiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxhbmQ+Ci0gICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzEuMyIvPgotICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KLSAgICAgICAgPC9hbmQ+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjQiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxhbmQ+Ci0gICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzEuMyIvPgotICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KLSAgICAgICAgPC9hbmQ+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iMi41Ij4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0ianN0LmphdmEiIHZlcnNpb249Ils1LjAiLz4KLSAgICAgICAgICA8Y29uZmxpY3RzIGdyb3VwPSJtb2R1bGVzIi8+Ci0gICAgICAgIDwvYW5kPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGdyb3VwLW1lbWJlciBpZD0ibW9kdWxlcyIvPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPGFjdGlvbiBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iWzIuMi0yLjVdIiB0eXBlPSJJTlNUQUxMIiBpZD0ianN0LndlYi5pbnN0YWxsIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiLz4KLSAgICA8L2FjdGlvbj4KLQotICAgIDxldmVudC1oYW5kbGVyIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSJbMi4yLTIuNV0iIHR5cGU9IlJVTlRJTUVfQ0hBTkdFRCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRUZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZSIvPgotICAgIDwvZXZlbnQtaGFuZGxlcj4KLSAgICAKLSAgICA8ZXZlbnQtaGFuZGxlciB0eXBlPSJQT1NUX0lOU1RBTEwiIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSJbMi4yLTIuNV0iPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5XZWJGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICA8L2V2ZW50LWhhbmRsZXI+Ci0gICAgCi0gICAgPHRlbXBsYXRlIGlkPSJ0ZW1wbGF0ZS5qc3Qud2ViIj4KLSAgICAgIDxsYWJlbD4lV0VCX0ZBQ0VUX1RFTVBMQVRFX0xBQkVMPC9sYWJlbD4KLSAgICAgIDxmaXhlZCBmYWNldD0ianN0LmphdmEiLz4KLSAgICAgIDxmaXhlZCBmYWNldD0ianN0LndlYiIvPgotICAgIDwvdGVtcGxhdGU+Ci0KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVNb2RlbFByb3ZpZGVyIj4KLSAgICAgICAgPHByb3ZpZGVyPgotICAgICAgICAJPG1vZGVsUHJvdmlkZXIgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdCIvPgkKLSAgICAgIAkJPGZhY2V0IGlkPSJqc3Qud2ViIiB2ZXJzaW9ucz0iMi4yLDIuMywyLjQiLz4KLSAgICAgIAk8L3Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NzhkYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLnd0cC53ZWIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2FydmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2FydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTg4YTdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3Byb3BlcnR5X2ZpbGVzL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNUaGlzIHByb3BlcnRpZXMgZmlsZSBob2xkIGFsbCB0aGUgZXh0ZXJuYWxpc2VkIHN0cmluZ3MgZm9yIGVUb29scyBXQVIgVmFsaWRhdGlvbiBwcm9qZWN0Ci0jIFZhbGlkYXRpb24gcHJvamVjdAotIwotIyBNZXNzYWdlcyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgYXQ6Ci0jICAgICBodHRwOi8vaGFueS5hdXN0aW4uaWJtLmNvbS9tZXNzYWdlcy9pbmRleC5odG1sCi0jCi0jIEJyaWVmbHk6Ci0jICAgICBNRVNTQUdFX0lEPTxDb21wb25lbnRQcmVmaXg+PE1lc3NhZ2VOdW1iZXI+PFR5cGVDb2RlPjogPE1lc3NhZ2VUZXh0PgotIwotIyBUaGUgcHJlZml4IGZvciB0aGlzIGNvbXBvbmVudCBpczoKLSMgICAgIENIS0ogKElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbikKLSMKLSMgTm90ZSB0aGUgIjogIiB0aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgdHlwZSBjb2RlIGFuZCB0aGUgbWVzc2FnZSB0ZXh0LgotIwotIyA6QmVnaW46IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkJlZ2luOgotI0NPTVBPTkVOVFBSRUZJWCBDSEtKCi0jQ09NUE9ORU5UTkFNRUZPUiBDSEtKIElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbgotI0NNVkNQQVRITkFNRSBuY2Yvc3JjL2phdmEvY29tL2libS93ZWJzcGhlcmUvdmFsaWRhdGlvbi93YXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKLSMgOkVuZDogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6RW5kOgotIwotCi0jIDItSnVseS0yMDAxOgotIyAgVGhpcyBmaWxlIGhhcyBiZWVuIHRlc3RlZCB1c2luZyB0aGUgUHJvY2Vzc01zZ0ZpbGUgdG9vbCwgd3JpdHRlbiBieQotIyAgSGFueSBTYWxlbSBhbmQgb3duZWQgYnkgRGVubmlzIEhlYmVydC4gIEFueSBmdXR1cmUgY2hhbmdlcyBzaG91bGQKLSMgIGFsc28gYmUgdmVyaWZpZWQgdXNpbmcgdGhpcyB0b29sLiAgUGxlYXNlIGNvbnRhY3QgRGVubmlzCi0jICAoaGViZXJ0QHVzLmlibS5jb20gb3IgVC9MIDU0My0yNTIwKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfV0FSX1ZBTElEQVRJT05fRkFJTEVEPUNIS0ozMDAwRTogV0FSIFZhbGlkYXRpb24gRmFpbGVkOiB7MH0KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfRFVQTElDQVRFX1JPTEVTPUNIS0oxMDAyRTogRHVwbGljYXRlIHNlY3VyaXR5IHJvbGUgbmFtZWQgezB9LgotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX0pTUD1DSEtKMzAwMUU6IFRoZSBKU1AgZmlsZSwgezB9LCBmb3IgdGhlIHNlcnZsZXQgXCJ7MX1cIiBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NNQUxMX0lDT049Q0hLSjMwMDJFOiBUaGUgPHNtYWxsLWljb24+IGZpbGUsIHswfSwgaXMgbWlzc2luZy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9MQVJHRV9JQ09OPUNIS0ozMDAzRTogVGhlIDxsYXJnZS1pY29uPiBmaWxlLCB7MH0sIGlzIG1pc3NpbmcuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX1NFUlZMRVRfTUFQUElORz1DSEtKMzAwNFc6IFRoZSBzZXJ2bGV0IG1hcHBpbmcgXCJ7MH1cIiByZWZlcnMgdG8gYSBzZXJ2bGV0IHRoYXQgaXMgbm90IGRlZmluZWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTk9fV0VMQ09NRV9GSUxFPUNIS0ozMDA1RTogRW1wdHkgd2VsY29tZSBmaWxlIGxpc3QgZW50cnkuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19XRUxDT01FX0ZJTEU9Q0hLSjMwMDZFOiBXZWxjb21lIGZpbGUgezB9IGlzIG1pc3NpbmcuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19UTEQ9Q0hLSjMwMDdFOiBUaGUgVGFnIExpYnJhcnkgRGVzY3JpcHRvciBGaWxlLCB7MH0sIGlzIG1pc3NpbmcuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0lOVkFMSURfV0FSX0ZJTEU9Q0hLSjMwMDhFOiBNaXNzaW5nIG9yIGludmFsaWQgV0FSIGZpbGUuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX0ZJTFRFUl9NQVBQSU5HPUNIS0ozMDA5RTogVGhlIGZpbHRlciBtYXBwaW5nIFwiezB9XCIgcmVmZXJzIHRvIGEgZmlsdGVyIHRoYXQgaXMgbm90IGRlZmluZWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9XRUxDT01FX0ZJTEU9Q0hLSjMwMTBXOiBXZWxjb21lIEZpbGVzIGNhbm5vdCBiZWdpbiBvciBlbmQgd2l0aCBhIC8uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVdBUl9ERF9QQVJTRV9MSU5FQ09MPUNIS0oxMDA5RTogUGFyc2luZyBFcnJvcjogezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfUEFSU0VfTElORT1DSEtKMTAxMEU6IERlcGxveW1lbnQgRGVzY3JpcHRvciBQYXJzaW5nIGVycm9yLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfUEFSU0VfTk9JTkZPPUNIS0oxMDExRTogRGVwbG95bWVudCBEZXNjcmlwdG9yIFBhcnNpbmcgZXJyb3IuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVdBUl9ERF9DQU5OT1RfT1BFTl9ERD1DSEtKMTAxMkU6IENhbm5vdCBvcGVuIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFZhbGlkYXRpb24gY2Fubm90IGNvbXBsZXRlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVVJMPUNIS0ozMDEzRTogVGhlIFVSTCBNYXBwaW5nIFwiezB9XCIgaXMgaW52YWxpZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFPUNIS0ozMDE0RTogSW52YWxpZCBTZWN1cml0eSByb2xlLWxpbms6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0hUVFBfQ01EPUNIS0ozMDE1RTogSW52YWxpZCBIVFRQIG1ldGhvZDogezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVFJBTlNQT1JUPUNIS0ozMDE2RTogSW52YWxpZCBUcmFuc3BvcnQgR3VyYXJhbnRlZS4gIFZhbGlkIHZhbHVlcyBhcmUgXCJOT05FXCIsIFwiSU5URUdSQUxcIiwgb3IgXCJDT05GSURFTlRJQUxcIi4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0pTUEZJTEVfUkVGPUNIS0ozMDE4RTogVGhlIGpzcC1maWxlIFwiezB9XCIgcmVmZXJlbmNlZCBieSBzZXJ2bGV0IHsxfSBtdXN0IGJlIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLgotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9JTlZBTElEX0NPTlRFWFRfUk9PVD1DSEtKMzAxN0U6IFdlYiBQcm9qZWN0OiB7MH0gaXMgbWFwcGVkIHRvIGFuIGludmFsaWQgQ29udGV4dCByb290OiB7MX0gaW4gRUFSIFByb2plY3Q6IHsyfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX1BBR0U9SVdBRTAwMDFFIENIS0ozMDE5RTogVGhlIExvY2F0aW9uIG9mIHRoZSBFcnJvciBQYWdlIE11c3QgQmVnaW4gd2l0aCBhIC8uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRV9OQU1FPUNIS0ozMDIwRTogSW52YWxpZCBTZWN1cml0eSByb2xlLW5hbWU6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0FVVEhfTUVUSE9EPUNIS0ozMDIxRTogSW52YWxpZCBhdXRoIG1ldGhvZC4gIFZhbGlkIHZhbHVlcyBhcmU6IFwiQkFTSUNcIiwgXCJESUdFU1RcIiwgXCJGT1JNXCIsIG9yIFwiQ0xJRU5ULUNFUlRcIi4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JR05PUkVfRk9STV9MT0dJTj1DSEtKMzAyMkU6ICBBdXRoZW50aWNhdGlvbiBtZXRob2QgaXMgezB9LiAgVGhlIGZvcm0tbG9naW4tY29uZmlnIHZhbHVlcyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIHVzaW5nIEZPUk0gYXV0aGVudGljYXRpb24gbWV0aG9kLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIyPUNIS0ozMDIzRTogIFJlc291cmNlIHJlZiB7MH0gbXVzdCBjb250YWluIHJlcy1hdXRoIG9mICJTRVJWTEVUIiBvciAiQ09OVEFJTkVSIi4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfUkVRVUlSRURfMjM9Q0hLSjMwMjRFOiAgUmVzb3VyY2UgcmVmIHswfSBtdXN0IGNvbnRhaW4gcmVzLWF1dGggb2YgIkFwcGxpY2F0aW9uIiBvciAiQ29udGFpbmVyIi4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMj1DSEtKMzAyNUU6ICBcIkFwcGxpY2F0aW9uXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yLnJlcy1hdXRoIGluIGEgMi4yIGxldmVsIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFVzZSBcIlNFUlZMRVRcIiBpbnN0ZWFkLgotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIzPUNIS0ozMDI2RTogIFwiU0VSVkxFVFwiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvci5yZXMtYXV0aCBpbiBhIDIuMiBsZXZlbCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBVc2UgXCJBcHBsaWNhdGlvblwiIGluc3RlYWQuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FWENFUFRJT05fVFlQRT1DSEtKMzAyN0U6ICBJbnZhbGlkIEV4Y2VwdGlvbiBUeXBlIHswfS4gIFRoZSBleGNlcHRpb24gdHlwZSBtdXN0IGNvbnRhaW4gYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIEphdmEgZXhjZXB0aW9uIHR5cGUuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9NQVBQSU5HPUNIS0o0MDEwVzogRHVwbGljYXRlIFVSTCBtYXBwaW5nIHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfU0VSVkxFVD1DSEtKNDAxMVc6IER1cGxpY2F0ZSBTZXJ2bGV0IEVudHJ5IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TRVNTSU9OX1RJTUVPVVQ9Q0hLSjQwMTJXOiBTZXNzaW9uIFRpbWVvdXQgaXMgbm90IHZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWT1DSEtKNDAxM1c6IER1cGxpY2F0ZSBFbnRyeSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlk9Q0hLSjQwMTRXOiBFbXB0eSBFbnRyeSB7MH0uCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0ZJTFRFUj1DSEtKNDAxNVc6IER1cGxpY2F0ZSBGaWx0ZXIgRW50cnkgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FSkJfUkVGPUNIS0o0MDE2VzogRHVwbGljYXRlIGVqYi1yZWYgZWxlbWVudCBuYW1lZCB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgVGhpcyB3YXMgbWlzc2luZy4gIEl0J3MgZGVmaW5lZCBpbiBjb25zdGFudHMuLi4KLUVSUk9SX0VBUl9VTkNPTlRBSU5FRF9NT0RVTEVfRklMRV9FWENFUFRJT049Q0hLSjQwMTdXOiBFUlJPUiBFQVIgVU5DT05UQUlORUQgTU9EVUxFIEZJTEUgRVhDRVBUSU9OCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9DT0RFPUlXQUUwMDM2RSBDSEtKNDAxOFc6IFVua25vd24gRXJyb3IgQ29kZTogezB9LiAgZXJyb3ItY29kZSBtdXN0IGNvbnRhaW4gYSB2YWxpZCBIVFRQIHN0YXR1cyBjb2RlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfUkVTX1NIQVJJTkdfU0NPUEU9Q0hLSjQwMTlXOiBJbnZhbGlkIHJlcy1zaGFyaW5nLXNjb3BlOyB2YWxpZCB2YWx1ZXMgYXJlIFwiU2hhcmVhYmxlXCIgb3IgXCJVbnNoYXJlYWJsZVwiLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VOVl9FTlRSWT1DSEtKNDAyMFc6IEludmFsaWQgRW52aXJvbm1lbnQgRW50cnkgVHlwZS4gVmFsaWQgdmFsdWVzIGFyZSBcImphdmEubGFuZy5UWVBFXCIsIHdoZXJlIFRZUEUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6IEJvb2xlYW4sIEJ5dGUsIENoYXJhY3RlciwgU3RyaW5nLCBTaG9ydCwgSW50ZWdlciwgTG9uZywgRmxvYXQsIG9yIERvdWJsZS4iCi0jVVNFUkFDVElPTiBOb25lLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0xQX1BST0pFQ1Q9Q0hLSjQwMjFXOiBNaXNzaW5nIFdlYiBMaWJyYXJ5IFByb2plY3QgKHswfSkuICBDaGVjayB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHByb2plY3QgdG8gZml4IHRoaXMgcHJvYmxlbS4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQ09ORkxJQ1RJTkdfV0xQX1BST0pFQ1Q9Q0hLSjQwMjJXOiBUaGUgV2ViIExpYnJhcnkgUHJvamVjdCBKQVIgKHswfSkgY29uZmxpY3RzIHdpdGggYW4gYWN0dWFsIEpBUiBpbiB0aGUgV0VCLUlORi9saWIgZGlyZWN0b3J5LgotTVNHX1NFUlZFUl9UQVJHRVRfTUlTTUFUQ0g9Q0hLSjQwMjNXOiBUaGUgdGFyZ2V0IHNlcnZlciBvZiB0aGUgV2ViIExpYnJhcnkgUHJvamVjdCAoezF9KSBkb2VzIG5vdCBtYXRjaCB0aGF0IG9mIHRoaXMgV2ViIFByb2plY3QgKHswfSkuICBSdW4gdmFsaWRhdGlvbiBvbiB0aGUgV2ViIFByb2plY3QgaWYgeW91IHRoaW5rIHRoYXQgaXMgbm90IHRoZSBjYXNlLgotTUVTU0FHRV9VUkxfUEFUVEVSTl9FTkRfV0lUSF9DQVJSQUlHRV9SRVRVUk49VGhlIFVSTCBwYXR0ZXJuIHN0cmluZyAiezB9IiBlbmRzIHdpdGggYSBpbnZhbGlkIGNhcnJhaWdlIHJldHVybiBmb3Igc2VydmxldCB7MX0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VKQl9SRUZfVFlQRT1DSEtKNDAyM1c6IGVqYi1yZWYtdHlwZSBtdXN0IGJlICdFbnRpdHknIG9yICdTZXNzaW9uJy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotRVJST1JfRFVQTElDQVRFX1dFQl9JTkZfTElCX09USEVSX1BST0pFQ1Q9V2ViIGxpYnJhcnkgcHJvamVjdCBhcmNoaXZlIHswfSBmcm9tIHByb2plY3QgezF9IGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgYXJjaGl2ZSBhbHNvIG1hcHBlZCB0byB0aGUgV0VCLUlORi9saWIgZm9sZGVyLgotRVJST1JfRFVQTElDQVRFX1dFQl9JTkZfTElCPVdlYiBsaWJyYXJ5IHByb2plY3QgYXJjaGl2ZSB7MH0gY29uZmxpY3RzIHdpdGggYW5vdGhlciBhcmNoaXZlIGFsc28gbWFwcGVkIHRvIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIuCi1FUlJPUl9EVVBMSUNBVEVfQ0xBU1NQQVRIX0NPTVBPTkVOVF9VUkk9V2ViIGxpYnJhcnkgVVJJIHswfSBmb3IgY2xhc3NwYXRoIGRlcGVuZGVuY3kgZnJvbSBwcm9qZWN0IHsxfSBtYXBzIHRvIGEgZGlmZmVyZW50IGZpbGUgc3lzdGVtIHBhdGggYXMgYW5vdGhlciBjbGFzc3BhdGggZGVwZW5kZW5jeSB3aXRoIHRoZSBzYW1lIFVSSS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX01JU1NJTkdfRUpCX1JPTEU9Q0hLSjI4MjdXOiAnJ3NlY3VyaXR5LXJvbGUtcmVmJycgZWxlbWVudCB7MH0gZGVmaW5lcyB0aGUgJydyb2xlLWxpbmsnJyBlbGVtZW50IGJ1dCBubyAnJ3NlY3VyaXR5LXJvbGUnJyBlbGVtZW50cyBpbiB0aGUgYXBwbGljYXRpb24gZGVzY3JpcHRvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotb2ZfVHlwZV9TZWN1cml0eV9Sb2xlX05hbWVfNj1vZiBUeXBlIFNlY3VyaXR5IFJvbGUgTmFtZQotV2ViX0FyY2hpdmVfVmFsaWRhdG9yXzg9V2ViIEFyY2hpdmUgVmFsaWRhdG9yCi1vZl9UeXBlX1JvbGVfTmFtZV8xOT1vZiBUeXBlIFJvbGUgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8yNT1vZiBUeXBlIFBhcmFtZXRlciBOYW1lCi1vZl9UeXBlX1BhcmFtZXRlcl9WYWx1ZV8yNj1vZiBUeXBlIFBhcmFtZXRlciBWYWx1ZQotb2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8zMj1vZiBUeXBlIFBhcmFtZXRlciBOYW1lCi1vZl9UeXBlX1BhcmFtZXRlcl9WYWx1ZV8zMz1vZiBUeXBlIFBhcmFtZXRlciBWYWx1ZQotb2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8zOT1vZiBUeXBlIFBhcmFtZXRlciBOYW1lCi1vZl9UeXBlX1BhcmFtZXRlcl9WYWx1ZV80MD1vZiBUeXBlIFBhcmFtZXRlciBWYWx1ZQotb2ZfVHlwZV9lamJfcmVmX25hbWVfNDQ9b2YgVHlwZSBlamItcmVmLW5hbWUKLW9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDc9b2YgVHlwZSBFcnJvciBMb2NhdGlvbgotb2ZfVHlwZV9FcnJvcl9Mb2NhdGlvbl80OT1vZiBUeXBlIEVycm9yIExvY2F0aW9uCi1vZl9UeXBlX01pbWVfRXh0ZW5zaW9uXzU0PW9mIFR5cGUgTWltZSBFeHRlbnNpb24KLW9mX1R5cGVfTWltZV9UeXBlXzU1PW9mIFR5cGUgTWltZSBUeXBlCi1vZl9UeXBlX01pbWVfRXh0ZW5zaW9uX19fNTY9b2YgVHlwZSBNaW1lIEV4dGVuc2lvbjoKLW9mX1R5cGVfV2ViX1Jlc291cmNlX0NvbGxlY3Rpb25fNjQ9b2YgVHlwZSBXZWIgUmVzb3VyY2UgQ29sbGVjdGlvbgotb2ZfVHlwZV9GaWx0ZXJfTmFtZV82Nj1vZiBUeXBlIEZpbHRlciBOYW1lCi1JbnZhbGlkX1VSTF83MD1JbnZhbGlkIFVSTAotSW52YWxpZF9VUkxfNzU9SW52YWxpZCBVUkwKLW9mX1R5cGVfU2VydmxldF9OYW1lXzc3PW9mIFR5cGUgU2VydmxldCBOYW1lCi1vZl9UeXBlX1RhZ2xpYl84MD1vZiBUeXBlIFRhZ2xpYgotb2ZfVHlwZV9UYWdMaWJfX184MT1vZiBUeXBlIFRhZ0xpYjoKLW9mX1R5cGVfV2ViX1Jlc291cmNlX05hbWVfODQ9b2YgVHlwZSBXZWIgUmVzb3VyY2UgTmFtZQotb2ZfVHlwZV9XZWxjb21lX0ZpbGVfTmFtZV9fODc9b2YgVHlwZSBXZWxjb21lIEZpbGUgTmFtZQotb2ZfVHlwZV9FbnZfRW50cnlfTmFtZV9fXzg4PW9mIFR5cGUgRW52aXJvbm1lbnQgRW50cnkgTmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2ViLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wcm9wZXJ0eV9maWxlcy93ZWIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlMjUwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wcm9wZXJ0eV9maWxlcy93ZWIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRVJSX0pBUl9OQU1FX0VNUFRZPVRoZSBKQVIgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfSkFSX05BTUVfRVhJU1Q9VGhlIEpBUiBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0pBVkFfUFJPSkVDVF9OQU1FX0VNUFRZPVRoZSBKYXZhIHByb2plY3QgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfSkFWQV9QUk9KRUNUX05BTUVfRVhJU1Q9VGhlIEphdmEgcHJvamVjdCBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX1NFUlZMRVRfTUFQUElOR19VUkxfUEFUVEVSTl9FTVBUWT1UaGUgc2VydmxldCBtYXBwaW5nIHVybCBwYXR0ZXJuIGNhbm5vdCBiZSBlbXB0eS4KLQotS0VZXzM9VGhlIGZpbHRlciBtYXBwaW5nIHVybCBwYXR0ZXJuIGNhbm5vdCBiZSBlbXB0eS4KLUtFWV80PVRoZSBmaWx0ZXIgbWFwcGluZyB1cmwgcGF0dGVybiAiezB9IiBhbHJlYWR5IGV4aXN0cy4KLUtFWV81PVRoZSBmaWx0ZXIgbWFwcGluZyBzZXJ2bGV0IGNhbm5vdCBiZSBlbXB0eS4KLUtFWV82PVRoZSBmaWx0ZXIgaW5pdCBwYXJhbSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9GSUxURVJfUEFSQU1FVEVSX05BTUVfRVhJU1Q9VGhlIGZpbHRlciBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLUVSUl9GSUxURVJfTUFQUElOR19TRVJWTEVUX0VYSVNUPVRoZSBmaWx0ZXIgbWFwcGluZyBzZXJ2bGV0ICJ7MH0iIGFscmVhZHkgZXhpc3RzLgotRVJSX0ZJTFRFUl9NQVBQSU5HX1NFUlZMRVRfRElTUEFUQ0hFUl9UWVBFU19FTVBUWT1UaGUgZGlzcGF0Y2hlciB0eXBlcyBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfRElTUExBWV9OQU1FX0VNUFRZPVRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9TRVJWTEVUX05BTUVfRVhJU1Q9VGhlIHNlcnZsZXQgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLUVSUl9TRVJWTEVUX0RJU1BMQVlfTkFNRV9FWElTVD1UaGUgc2VydmxldCBkaXNwbGF5IG5hbWUgYWxyZWFkeSBleGlzdHMuCi1FUlJfU0VSVkxFVF9DTEFTU19OQU1FX1VTRUQ9VGhlIGNsYXNzIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIG90aGVyIHNlcnZsZXQuCi1FUlJfU0VSVkxFVF9KQVZBX0NMQVNTX05BTUVfSU5WQUxJRD1DYW5ub3QgdXNlIFNlcnZsZXQgYXMgdGhlIHNlcnZsZXQgY2xhc3MgbmFtZS4KLUVSUl9TRVJWTEVUX01BUFBJTkdfVVJMX1BBVFRFUk5fRVhJU1Q9VGhlIHNlcnZsZXQgVVJMIG1hcHBpbmcgcGF0dGVybiBhbHJlYWR5IGV4aXN0cy4KLUVSUl9TRVJWTEVUX01BUFBJTkdfU0VSVkxFVF9OT1RfRVhJU1Q9VGhlIHNlcnZsZXQgZG9lcyBub3QgZXhpc3QuCi1FUlJfU0VSVkxFVF9QQVJBTUVURVJfTkFNRV9FTVBUWT1UaGUgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfU0VSVkxFVF9QQVJBTUVURVJfTkFNRV9FWElTVD1UaGUgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLUVSUl9TRVJWTEVUX1BBUkFNRVRFUl9WQUxVRV9FTVBUWT1UaGUgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdmFsdWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX1NFUlZMRVRfUEFSQU1FVEVSX1ZBTFVFX0VYSVNUPVRoZSBzZXJ2bGV0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB2YWx1ZSBhbHJlYWR5IGV4aXN0cy4KLQotRVJSX0ZJTFRFUl9ESVNQTEFZX05BTUVfRVhJU1Q9VGhlIGZpbHRlciBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0ZJTFRFUl9OQU1FX0VYSVNUPVRoZSBmaWx0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLUVSUl9GSUxURVJfQ0xBU1NfTkFNRV9VU0VEPVRoZSBjbGFzcyBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBvdGhlciBmaWx0ZXIuCi1FUlJfRklMVEVSX0NMQVNTX05BTUVfSU5WQUxJRD1DYW5ub3QgdXNlIEZpbHRlciBhcyB0aGUgZmlsdGVyIGNsYXNzIG5hbWUuCi0KLUVSUl9MSVNURU5FUl9ESVNQTEFZX05BTUVfRVhJU1Q9VGhlIGxpc3RlbmVyIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1FUlJfTElTVEVORVJfQ0xBU1NfTkFNRV9VU0VEPVRoZSBjbGFzcyBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBvdGhlciBsaXN0ZW5lci4KLUVSUl9MSVNURU5FUl9DTEFTU19OQU1FX0lOVkFMSUQ9Q2Fubm90IHVzZSBMaXN0ZW5lciBhcyB0aGUgbGlzdGVuZXIgY2xhc3MgbmFtZS4KLQotRVJSX0RVUExJQ0FURURfSU5JVF9QQVJBTUVURVI9RHVwbGljYXRlZCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotRVJSX0RVUExJQ0FURURfVVJMX01BUFBJTkc9RHVwbGljYXRlZCBVUkwgbWFwcGluZ3MuCi0KLUVSUl9VUkxfTUFQUElOR19MSVNUX0VNUFRZPVRoZSBVUkwgTWFwcGluZ3MgbGlzdCBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfVVJMX1BBVFRFUk5fSU5WQUxJRD0iezB9IiBpcyB1bnJlc29sdmFibGUgVVJMIHBhdHRlcm4uIFVSTCBwYXR0ZXJucyBzaG91bGQgc3RhcnQgd2l0aCAiLyIgb3IgIiouIi4KLUVSUl9GSUxURVJfTUFQUElOR19FTVBUWT1UaGUgRmlsdGVyIE1hcHBpbmdzIGxpc3QgY2Fubm90IGJlIGVtcHR5LgotICAKLUVSUl9TRVJWTEVUX1JPTEVfUkVGX05BTUVfRU1QVFk9VGhlIHNlcnZsZXQgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfU0VSVkxFVF9ST0xFX1JFRl9OQU1FX0VYSVNUPVRoZSBzZXJ2bGV0IHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1FUlJfU0VSVkxFVF9ST0xFX0xJTktfRU1QVFk9VGhlIHNlcnZsZXQgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgbGluayBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfU0VSVkxFVF9JTlRFUkZBQ0U9VGhlIFNlcnZsZXQgY2xhc3Mgb3IgaXRzIHN1cGVyY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGphdmF4LnNlcnZsZXQuU2VydmxldCBpbnRlcmZhY2UuCi0KLUVSUl9QQUdFX0VOQ09ESU5HX0VNUFRZPVRoZSBwYWdlIGVuY29kaW5nIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9QQUdFX0VOQ09ESU5HX0VYSVNUPVRoZSBwYWdlIGVuY29kaW5nIGFscmVhZHkgZXhpc3RzLgotRVJSX1VSTF9QQVRURVJOX0VYSVNUPVRoZSBVUkwgcGF0dGVybiBleGlzdHMuCi1FUlJfSU5DTFVERV9QUkVMVURFU19FWElTVD1UaGUgaW5jbHVkZSBwcmVsdWRlcyBleGlzdHMuCi1FUlJfSU5DTFVERV9DT0RBU19FWElTVD1UaGUgaW5jbHVkZSBDb2RhcyBleGlzdHMuCi1FUlJfU0VDVVJJVFlfQ09OU1RSQUlOVF9OQU1FX0VNUFRZPVRoZSBzZWN1cml0eSBjb25zdHJhaW50IG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX1NFQ1VSSVRZX0NPTlNUUkFJTlRfTkFNRV9FWElTVD1UaGUgc2VjdXJpdHkgY29uc3RyYWludCBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0NPTlRFWFRfUEFSQU1FVEVSX05BTUVfRU1QVFk9VGhlIGNvbnRleHQgcGFyYW1ldGVyIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX0NPTlRFWFRfUEFSQU1FVEVSX05BTUVfRVhJU1Q9VGhlIGNvbnRleHQgcGFyYW1ldGVyIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1FUlJfUkVTT1VSQ0VfTkFNRV9FTVBUWT1UaGUgd2ViIHJlc291cmNlIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX1JFU09VUkNFX05BTUVfRVhJU1Q9VGhlIHdlYiByZXNvdXJjZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX1VSTF9QQVRURVJOU19FTVBUWT1UaGUgVVJMIHBhdHRlcm5zIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9NSU1FX01BUFBJTkdfRVhURU5TSU9OX0VNUFRZPVRoZSBNaW1lIG1hcHBpbmcgZXh0ZW5zaW9uIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9NSU1FX01BUFBJTkdfRVhURU5TSU9OX0VYSVNUPVRoZSBNaW1lIG1hcHBpbmcgZXh0ZW5zaW9uIGFscmVhZHkgZXhpc3RzLgotRVJSX1dFTENPTUVfUEFHRV9FTVBUWT1UaGUgV2VsY29tZSBmaWxlIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX1dFTENPTUVfUEFHRV9FWElTVD1UaGUgV2VsY29tZSBmaWxlIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gV2VsY29tZSBGaWxlIExpc3QuCi1FUlJfRU5WX0VOVFJZX05BTUVfRU1QVFk9VGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX0VOVl9FTlRSWV9OQU1FX0VYSVNUPVRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0VSUk9SX0NPREVfRU1QVFk9VGhlIGVycm9yIGNvZGUgY2Fubm90IGJlIGVtcHR5LgotRVJSX0VSUk9SX0NPREVfTVVTVF9CRV8zX0RJR0lUUz1UaGUgZXJyb3IgY29kZSBtdXN0IGJlIHRocmVlIGRpZ2l0cy4KLUVSUl9FUlJPUl9QQUdFX0xPQ0FUSU9OX0VNUFRZPVRoZSBlcnJvciBwYWdlIGxvY2F0aW9uIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9FUlJPUl9QQUdFX0xPQ0FUSU9OX0VYSVNUPVRoZSBlcnJvciBwYWdlIGxvY2F0aW9uIGFscmVhZHkgZXhpc3RzLgotRVJSX0VSUk9SX1BBR0VfTE9DQVRJT05fTVVTVF9TVEFSVF9XSVRIX1NMQVNIPVRoZSBlcnJvciBwYWdlIGxvY2F0aW9uIG11c3Qgc3RhcnQgd2l0aCAvLgotRVJSX0VYQ0VQVElPTl9UWVBFX0VNUFRZPVRoZSBleGNlcHRpb24gdHlwZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfRVhDRVBUSU9OX1NFQ1VSSVRZX0lEX05PX0JFQU5TPVRoZSBiZWFuIHNlbGVjdGlvbiBjYW4gbm90IGJlIGVtcHR5LgotRVJSX0VYQ0VQVElPTl9ST0xFX05BTUVfRU1QVFk9VGhlIHJvbGUgbmFtZSBjYW4gbm90IGJlIGVtcHR5LgotRVJSX0xPQ0FMRV9OQU1FX0VNUFRZPVRoZSBsb2NhbGUgY2Fubm90IGJlIGVtcHR5LgotRVJSX0xPQ0FMRV9OQU1FX0VYSVNUPVRoZSBsb2NhbGUgYWxyZWFkeSBleGlzdHMuCi1FUlJfVEFHTElCUkVGX1VSTF9FTVBUWT1UaGUgdGFnIGxpYiByZWYgVVJMIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9UQUdMSUJSRUZfVVJMX0VYSVNUPVRoZSB0YWcgbGliIHJlZiBVUkwgYWxyZWFkeSBleGlzdHMuCi1FUlJfTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FX0VNUFRZPVRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX01FU1NBR0VfREVTVElOQVRJT05fTkFNRV9FWElTVD1UaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0VYQ0VQVElPTl9ST0xFX05BTUVfRU1QVFk9VGhlIHNlY3VyaXR5IHJvbGUgbmFtZXMgY2Fubm90IGJlIGVtcHR5LgotRVJSX0VYQ0VQVElPTl9NRVRIT0RfRUxFTUVOVF9FTVBUWT1UaGUgbWV0aG9kIGVsZW1lbnRzIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9FWENFUFRJT05fTUVUSE9EX1RSQU5TQUNUSU9OX0FUVFJJQlVURVNfRU1QVFk9VGhlIG1ldGhvZCB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGNhbiBub3QgYmUgZW1wdHkuCi1FUlJfU0VSVkxFVF9MSVNUX0VNUFRZPVRoZSBsaXN0IG9mIHNlcnZsZXRzIHRvIGJlIHJlbW92ZWQgY2Fubm90IGJlIGVtcHR5LgotRVJSX0ZJTFRFUl9MSVNUX0VNUFRZPVRoZSBsaXN0IG9mIGZpbHRlcnMgdG8gYmUgcmVtb3ZlZCBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfTElTVEVORVJfTElTVF9FTVBUWT1UaGUgbGlzdCBvZiBsaXN0ZW5lcnMgdG8gYmUgcmVtb3ZlZCBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfTk9fTElTVEVORVJfU0VMRUNURUQ9QXQgbGVhc3Qgb25lIG9mIHRoZSBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXJzIG11c3QgYmUgc2VsZWN0ZWQuIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2ViZWRpdC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2ViZWRpdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDc2ZjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3Byb3BlcnR5X2ZpbGVzL3dlYmVkaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BZGRfRmlsdGVyX01hcHBpbmdfVGl0bGVfVUlfPUFkZCBGaWx0ZXIgTWFwcGluZwotRWRpdF9GaWx0ZXJfTWFwcGluZ19UaXRsZV9VSV89RWRpdCBGaWx0ZXIgTWFwcGluZwotRklMVEVSX01BUFBJTkc9RmlsdGVyIE1hcHBpbmcKLURJU1BBVENIRVJfUj1SCi1ESVNQQVRDSEVSX0Y9RgotRElTUEFUQ0hFUl9JPUkKLURJU1BBVENIRVJfRT1FCi1MSVNURU5FUj1MaXN0ZW5lcgotU2VsZWN0X0Rpc3BhdGNoZXJzX1VJXz1TZWxlY3QgRGlzcGF0Y2hlcnMKLUNvbnRhaW5lcl9TZWxlY3Rpb25fVUlfPUZvbGRlciBTZWxlY3Rpb24KLUNob29zZV9hX0NvbnRhaW5lcl9fVUlfPUNob29zZSBhIEZvbGRlcjoKLUNvbnRhaW5lcl9fVUlfPUZvbGRlcjoKLUJyb3dzZS4uLl9VSV89QnJvd3NlLi4uCi1TdXBlcmNsYXNzX3NlbGVjdGlvbl9VSV89U3VwZXJjbGFzcyBzZWxlY3Rpb24KLUNob29zZV9hX3N1cGVyY2xhc3NfVUlfPUNob29zZSBhIHN1cGVyY2xhc3MKLUFkZC4uLl9VSV89QWRkLi4uCi1SZW1vdmVfVUlfPVJlbW92ZQotTm9fcGFja2FnZXNfdG9fY2hvb3NlX2Zyb21fVUlfPU5vIHBhY2thZ2VzIHRvIGNob29zZSBmcm9tLgotRXJyb3JfRVhDXz1JV0FFMDAxNUUgRXJyb3IKLVNwZWNpZnlfYV9uYW1lX2FuZF9wYWNrYWdlX1VJXz1DcmVhdGUgYSBuZXcgU2VydmxldCBjbGFzcy4KLVdoaWNoX21ldGhvZF9zdHVic193b3VsZF95X1VJXz1XaGljaCBtZXRob2Qgc3R1YnMgd291bGQgeW91IGxpa2UgdG8gY3JlYXRlPwotX19BZGRfdG9fd2ViLnhtbD9fVUlfPUFkZCB0byB3ZWIueG1sPwotX19BZGQuLi5fX19VSV89QWRkCi1fX0RlbGV0ZV9fX1VJXz1EZWxldGUKLUNhbmNlbF9VSV89Q2FuY2VsCi1OZXdfVUlfPU5ldwotTm9uZV9VSV89Tm9uZQotQ3JlYXRlX3RoZV9TZXJ2bGV0X0NsYXNzX1VJXz1DcmVhdGUgdGhlIFNlcnZsZXQgQ2xhc3MKLURlZmluZV90aGVfU2VydmxldF9pbl90aGVfX1VJXz1EZWZpbmUgdGhlIFNlcnZsZXQgaW4gdGhlIERlcGxveW1lbnQgRGVzY3JpcHRvciAod2ViLnhtbCkgRmlsZQotSWRlbnRpZnlfYW55X2luZm9ybWF0aW9uX3RfVUlfPUlkZW50aWZ5IGFueSBpbmZvcm1hdGlvbiB0aGF0IHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBEZXBsb3ltZW50IERlc2NyaXB0b3IgKHdlYi54bWwpIGZpbGUgZm9yIHRoZSBzZXJ2bGV0LgotQ3JlYXRlX1R3b19DaGlsZHJlbl9VSV89Q3JlYXRlIFR3byBDaGlsZHJlbgotQ3JlYXRlX0NoaWxkX1VJXz1DcmVhdGUgQ2hpbGQKLURlc2NyaXB0aW9uX1VJXz1EZXNjcmlwdGlvbgotMmNvbmNhdF9VSV89Q3JlYXRlIGEgbmV3IGNoaWxkIGZvciB0aGUgc2VsZWN0ZWQgezB9LgotNGNvbmNhdF9VSV89Q3JlYXRlIGEgY2hpbGQgb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7MX0uCi02Y29uY2F0X1VJXz1DcmVhdGUgezB9Ci03Y29uY2F0X1VJXz1DcmVhdGUgdHdvIG5ldyBjaGlsZHJlbiBmb3IgdGhlIHNlbGVjdGVkIHswfS4KLThjb25jYXRfVUlfPUNyZWF0ZSB0d28gbmV3IGNoaWxkcmVuIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezF9LgotOWNvbmNhdF9VSV89Q3JlYXRlIFR3byB7MH1zCi0xMWNvbmNhdF9VSV89QXV0aENvbnN0cmFpbnQgezB9Ci0xMmNvbmNhdF9VSV89Q29udGV4dFBhcmFtIHswfQotMTNjb25jYXRfVUlfPUVycm9yUGFnZSB7MH0KLTE0Y29uY2F0X1VJXz1FcnJvciBDb2RlOiB7MH0KLTE1Y29uY2F0X1VJXz1FeGNlcHRpb246IHswfQotNTJjb25jYXRfVUlfPUZvcm1Mb2dpbkNvbmZpZyB7MH0KLTE2Y29uY2F0X1VJXz1Gb3JtTG9naW5Db25maWcgezB9Ci0xN2NvbmNhdF9VSV89SFRUUE1ldGhvZFR5cGUgezB9Ci0xOGNvbmNhdF9VSV89ezB9ID0gezF9Ci0yMWNvbmNhdF9VSV89TG9naW5Db25maWcgezB9Ci0yMmNvbmNhdF9VSV89TWltZU1hcHBpbmcgezB9Ci0yM2NvbmNhdF9VSV89Um9sZU5hbWVUeXBlIHswfQotMjRjb25jYXQ9Q3JlYXRlIGEgY2hpbGQgb2YgdHlwZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24gZm9yIHRoZSBzZWxlY3RlZCB7MH0uCi0yNmNvbmNhdF9VSV89Q3JlYXRlIGEgY2hpbGQgb2YgdHlwZSBJbml0UGFyYW0gZm9yIHRoZSBzZWxlY3RlZCB7MH0uCi0yOGNvbmNhdF9VSV89ezB9IC0+IHsxfQotMzFjb25jYXRfVUlfPVNlc3Npb25Db25maWcgezB9Ci0zMmNvbmNhdF9VSV89VGFnTGliUmVmIHswfQotMzNjb25jYXRfVUlfPVVSTFBhdHRlcm5UeXBlIHswfQotMzRjb25jYXRfVUlfPVVzZXJEYXRhQ29uc3RyYWludCB7MH0KLTM1Y29uY2F0X1VJXz1DcmVhdGUgYSBjaGlsZCBvZiB0eXBlIENvbnRleHRQYXJhbSBmb3IgdGhlIHNlbGVjdGVkIHswfS4KLTM3Y29uY2F0X1VJXz1DcmVhdGUgYSBjaGlsZCBvZiB0eXBlIFVSTFBhdHRlcm5UeXBlIGZvciB0aGUgc2VsZWN0ZWQgezB9LgotMzhjb25jYXRfVUlfPVdlYlJlc291cmNlQ29sbGVjdGlvbiB7MH0KLTQwY29uY2F0X1VJXz1KU1BUeXBlIHswfQotNDFjb25jYXRfVUlfPVNlcnZsZXRUeXBlIHswfQotNDJjb25jYXRfVUlfPUNyZWF0ZSBhIGNoaWxkIG9mIHR5cGUgV2VsY29tZUZpbGUgZm9yIHRoZSBzZWxlY3RlZCB7MH0uCi00NWNvbmNhdF9FUlJPUl89SVdBRTAwMTZFIEVycm9yIHdyaXRpbmcgdG8gd2ViLnhtbDp7MH0KLTUwY29uY2F0X1VJXz17MH0gQ2hhbmdlCi1OZXdfcGFyYW1fVUlfPU5ldyBwYXJhbQotdmFsdWVfVUlfPXZhbHVlCi1OZXdfaW5pdF9wYXJhbV9VSV89TmV3IGluaXQgcGFyYW0KLShOZXdfU2VjdXJpdHlfUm9sZSlfVUlfPShOZXcgU2VjdXJpdHkgUm9sZSkKLU5ld19zZWN1cml0eV9yb2xlX1VJXz1OZXcgc2VjdXJpdHkgcm9sZQotKE5ld19TZXJ2bGV0KV9VSV89KE5ldyBTZXJ2bGV0KQotcGFja2FnZW5hbWUuY2xhc3NuYW1lX1VJXz1wYWNrYWdlbmFtZS5jbGFzc25hbWUKLU5ld19zZXJ2bGV0X1VJXz1OZXcgc2VydmxldAotL3VybC8qX1VJXz0vdXJsLyoKLU5ld19zZXJ2bGV0X21hcHBpbmdfVUlfPU5ldyBzZXJ2bGV0IG1hcHBpbmcKLShOZXdfZmlsZW5hbWUpX1VJXz0oTmV3IGZpbGVuYW1lKQotTmV3X3dlbGNvbWVfZmlsZV9VSV89TmV3IHdlbGNvbWUgZmlsZQotTmV3X3dlbGNvbWVfZmlsZV9saXN0X1VJXz1OZXcgd2VsY29tZSBmaWxlIGxpc3QKLVByb2JsZW1zX09wZW5pbmdfRWRpdG9yX0VSUk9SXz1JV0FFMDAxN0UgUHJvYmxlbXMgT3BlbmluZyBFZGl0b3IKLUxhcmdlX0ljb25fQ2hvb3Nlcl9EaWFsb2dfVUlfPUxhcmdlIEljb24gQ2hvb3NlciBEaWFsb2cKLVNtYWxsX0ljb25fQ2hvb3Nlcl9EaWFsb2dfVUlfPVNtYWxsIEljb24gQ2hvb3NlciBEaWFsb2cKLUJyb3dzZS4uLl9VSV9fVUlfPUJyb3dzZS4uLgotVmFsdWVfX1VJXz1WYWx1ZToKLURlc2NyaXB0aW9uX1VJX19VSV89RGVzY3JpcHRpb24KLUVycm9yX0VYQ19fRVJST1JfPUlXQUUwMDE4RSBFcnJvcgotcm9vdF91bmRlZl9FUlJPUl89SVdBRTAwMTlFIHJvb3QgdW5kZWYKLVBhY2thZ2VfX1VJXz1QYWNrYWdlOgotKGRlZmF1bHQpX1VJXz0oZGVmYXVsdCkKLVNlcnZsZXRfTmFtZV9fVUlfPVNlcnZsZXQgTmFtZToKLVN1cGVyY2xhc3NfX1VJXz1TdXBlcmNsYXNzOgotSW50ZXJmYWNlc19fVUlfPUludGVyZmFjZXM6Ci1Nb2RpZmllcnNfX1VJXz1Nb2RpZmllcnM6Ci1Vc2VfU2luZ2xlX1RocmVhZF9Nb2RlbF9VSV89VXNlIFNpbmdsZSBUaHJlYWQgTW9kZWwKLU9wdGlvbnNfX1VJXz1PcHRpb25zOgotUGFja2FnZV9TZWxlY3Rpb25fVUlfPVBhY2thZ2UgU2VsZWN0aW9uCi1DaG9vc2VfYV9wYWNrYWdlX19VSV89Q2hvb3NlIGEgcGFja2FnZToKLVN1cGVyaW50ZXJmYWNlc19TZWxlY3Rpb25fVUlfPVN1cGVyaW50ZXJmYWNlcyBTZWxlY3Rpb24KLUNob29zZV9pbnRlcmZhY2VzX1VJXz1DaG9vc2UgaW50ZXJmYWNlcwotQ3JlYXRlX3RoZV9TZXJ2bGV0X0NsYXNzX1VJX19VSV89Q3JlYXRlIHRoZSBTZXJ2bGV0IENsYXNzCi1Jbmhlcml0ZWRfYWJzdHJhY3RfbWV0aG9kc19VSV89SW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZHMKLUNvbnN0cnVjdG9yc19mcm9tX3N1cGVyY2xhX1VJXz1Db25zdHJ1Y3RvcnMgZnJvbSBzdXBlcmNsYXNzCi1NYXBwaW5nc19fVUlfPU1hcHBpbmdzOgotVVJMX1VJXz1VUkwKLVVSTF9fVUlfPVVSTDoKLUFkZF9NYXBwaW5nX1VJXz1BZGQgTWFwcGluZwotRGlzcGxheV9OYW1lX19VSV89RGlzcGxheSBuYW1lOgotSW5pdF9QYXJhbWV0ZXJzX19VSV89SW5pdCBQYXJhbWV0ZXJzOgotSW5pdGlhbGl6YXRpb25fcGFyYW1ldGVyX1VJXz1Jbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKLVZhbHVlX1VJXz1WYWx1ZQotUGFyYW1ldGVyX05hbWVfX1VJXz1QYXJhbWV0ZXIgTmFtZToKLVBhcmFtZXRlcl9WYWx1ZV9fVUlfPVBhcmFtZXRlciBWYWx1ZToKLUFkZF9Jbml0aWFsaXphdGlvbl9QYXJhbWV0X1VJXz1BZGQgSW5pdGlhbGl6YXRpb24gUGFyYW1ldGVyCi1PS19VSV89T0sKLShkZWZhdWx0X3BhY2thZ2UpX1VJXz0oZGVmYXVsdCBwYWNrYWdlKQotQXV0aG9yaXplZF9Sb2xlc19VSV89QXV0aG9yaXplZCByb2xlcwotRWRpdC4uLl9VSV89RWRpdC4uLgotKE5ld193ZWJfcmVzb3VyY2VfY29sbGVjdGlfVUlfPShOZXcgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24pCi1OZXdfd2ViX3Jlc291cmNlX2NvbGxlY3Rpb19VSV89TmV3IHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uCi1EZWxldGVfd2ViX3Jlc291cmNlX2NvbGxlY19VSV89RGVsZXRlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uCi1XZWJfUmVzb3VyY2VfQ29sbGVjdGlvbl9VSV89V2ViIHJlc291cmNlIGNvbGxlY3Rpb24KLVdlYl9SZXNvdXJjZV9Db2xsZWN0aW9uc19VSV89V2ViIFJlc291cmNlIENvbGxlY3Rpb25zCi1OZXdfVUlfX1VJXz1BZGQKLURlbGV0ZV9VSV89UmVtb3ZlCi1Vc2VyX0RhdGFfQ29uc3RyYWludF9VSV89VXNlciBkYXRhIGNvbnN0cmFpbnQKLU5ld19zZWN1cml0eV9jb25zdHJhaW50X1VJXz1OZXcgc2VjdXJpdHkgY29uc3RyYWludAotVHJhbnNwb3J0X2d1YXJlbnRlZV9jaGFuZ2VfVUlfPVRyYW5zcG9ydCBndWFyZW50ZWUgY2hhbmdlCi1EZWxldGVfc2VjdXJpdHlfY29uc3RyYWludF9VSV89RGVsZXRlIHNlY3VyaXR5IGNvbnN0cmFpbnQKLVNlY3VyaXR5X2NvbnN0cmFpbnRzX1VJXz1TZWN1cml0eSBjb25zdHJhaW50cwotTmFtZV9VSV89TmFtZQotKE5ld19XZWJfUmVzb3VyY2VfQ29sbGVjdGlfVUlfPShOZXcgV2ViIFJlc291cmNlIENvbGxlY3Rpb24pCi1DaG9vc2VfYV9KU1BfVUlfPUNob29zZSBhIEpTUAotU2VsZWN0X2FfSlNQX2ZpbGVfVUlfPVNlbGVjdCBhIEpTUCBmaWxlCi1DaG9vc2VfYV9zZXJ2bGV0X1VJXz1DaG9vc2UgYSBzZXJ2bGV0Ci1TZWxlY3RfYV9zZXJ2bGV0X2NsYXNzX1VJXz1TZWxlY3QgYSBzZXJ2bGV0IGNsYXNzCi0oTmV3X1VSTClfVUlfPShOZXcgVVJMKQotSWNvbl9jaGFuZ2VfVUlfPUljb24gY2hhbmdlCi1BdXRob3JpemVkX1JvbGVzX19VSV89QXV0aG9yaXplZCByb2xlczoKLURlbGV0ZV9zZXJ2bGV0X21hcHBpbmdzX1VJXz1EZWxldGUgc2VydmxldCBtYXBwaW5ncwotVHlwZV9fVUlfPVR5cGU6Ci1TZXJ2bGV0X2NsYXNzX1VJXz1TZXJ2bGV0IGNsYXNzCi1KU1BfZmlsZV9VSV89SlNQIGZpbGUKLURpc3BsYXlfbmFtZV9fVUlfPURpc3BsYXkgbmFtZToKLURlc2NyaXB0aW9uX19VSV89RGVzY3JpcHRpb246Ci1Jbml0aWFsaXphdGlvbl9fVUlfPUluaXRpYWxpemF0aW9uLi4uCi1JY29uc19fVUlfPUljb25zLi4uCi1EaXNwbGF5X25hbWVfY2hhbmdlX1VJXz1EaXNwbGF5IG5hbWUgY2hhbmdlCi1EZXNjcmlwdGlvbl9jaGFuZ2VfVUlfPURlc2NyaXB0aW9uIGNoYW5nZQotV2ViX3R5cGVfY2hhbmdlX1VJXz1XZWIgdHlwZSBjaGFuZ2UKLVVSTF9NYXBwaW5nc19fVUlfPVVSTCBtYXBwaW5nczoKLU5ldy4uLl9VSV89TmV3Li4uCi1BZGRfVUlfPUFkZAotRGVsZXRlX3NlcnZsZXRzX1VJXz1EZWxldGUgc2VydmxldHMKLVNlcnZsZXRzX1VJXz1TZXJ2bGV0cwotKE5ld19VUkkpX1VJXz0oTmV3IFVSSSkKLS9XRUItSU5GL3RsZHMvKHRhZ2xpYi50bGQpX1VJXz0vV0VCLUlORi90bGRzLyh0YWdsaWIudGxkKQotTmV3X3RhZ2xpYl9VSV89TmV3IHRhZ2xpYgotRGVsZXRlX3RhZ2xpYnNfVUlfPURlbGV0ZSB0YWdsaWJzCi1VUklfVUlfPVVSSQotTG9jYXRpb25fVUlfPUxvY2F0aW9uCi0oTmV3X0NvbnRleHRQYXJhbWV0ZXIpX1VJXz0oTmV3IENvbnRleHRQYXJhbWV0ZXIpCi1OZXdfY29udGV4dF9wYXJhbWV0ZXJfVUlfPU5ldyBjb250ZXh0IHBhcmFtZXRlcgotQ29udGV4dF9wYXJhbWV0ZXJzX19VSV89Q29udGV4dCBwYXJhbWV0ZXJzOgotQ29udGV4dF9QYXJhbWV0ZXJfTmFtZV9VSV89Q29udGV4dCBQYXJhbWV0ZXIgTmFtZQotKE5ld19FeHRlbnNpb24pX1VJXz0oTmV3IEV4dGVuc2lvbikKLU5ld19taW1lX21hcHBpbmdfVUlfPU5ldyBtaW1lIG1hcHBpbmcKLURlbGV0ZV9taW1lX21hcHBpbmdzX1VJXz1EZWxldGUgbWltZSBtYXBwaW5ncwotU2Vzc2lvbl90aW1lX291dF9fVUlfPVNlc3Npb24gdGltZSBvdXQ6Ci1EaXN0cmlidXRhYmxlX1VJXz1EaXN0cmlidXRhYmxlCi1EaXNwbGF5X05hbWVfVUlfPURpc3BsYXkgTmFtZQotU2Vzc2lvbl9Db25maWdfVUlfPVNlc3Npb24gQ29uZmlnCi1TZXNzaW9uX1RpbWVvdXRfVUlfPVNlc3Npb24gVGltZW91dAotTWltZV9tYXBwaW5nc19fVUlfPU1pbWUgbWFwcGluZ3M6Ci1GaWxlX0V4dGVuc2lvbl9VSV89RmlsZSBFeHRlbnNpb24KLU1pbWVfVHlwZV9VSV89TWltZSBUeXBlCi1EZWxldGVfY29udGV4dF9wYXJhbWV0ZXJzX1VJXz1EZWxldGUgY29udGV4dCBwYXJhbWV0ZXJzCi1XZWxjb21lX2ZpbGVfbmFtZV9jaGFuZ2VfVUlfPVdlbGNvbWUgZmlsZSBuYW1lIGNoYW5nZQotKE5ld19XZWxjb21lX0ZpbGUpX1VJXz0oTmV3IFdlbGNvbWUgRmlsZSkKLUNob29zZV9hbl9FcnJvcl9QYWdlX1VJXz1DaG9vc2UgYW4gRXJyb3IgUGFnZQotU2VsZWN0X2FuX0Vycm9yX1BhZ2VfVUlfPVNlbGVjdCBhbiBFcnJvciBQYWdlCi1EZWxldGVfd2VsY29tZV9maWxlc19VSV89RGVsZXRlIHdlbGNvbWUgZmlsZXMKLURlbGV0ZV9lcnJvcl9wYWdlc19VSV89RGVsZXRlIGVycm9yIHBhZ2VzCi1XZWxjb21lX2ZpbGVzX1VJXz1XZWxjb21lIGZpbGVzCi1DaG9vc2VfYV9Mb2dpbl9QYWdlX1VJXz1DaG9vc2UgYSBMb2dpbiBQYWdlCi1TZWxlY3RfYV9Mb2dpbl9QYWdlX1VJXz1TZWxlY3QgYSBMb2dpbiBQYWdlCi1FcnJvcl9tYXBwaW5nX19VSV89RXJyb3IgbWFwcGluZzoKLUVycm9yL0V4Y2VwdGlvbl9VSV89RXJyb3IvRXhjZXB0aW9uCi1Mb2dpbl9VSV89TG9naW4KLVJlYWxtX25hbWVfX1VJXz1SZWFsbSBuYW1lOgotQXV0aGVudGljYXRpb25fbWV0aG9kX19VSV89QXV0aGVudGljYXRpb24gbWV0aG9kOgotTG9naW5fcGFnZV9fVUlfPUxvZ2luIHBhZ2U6Ci1FcnJvcl9wYWdlX19VSV89RXJyb3IgcGFnZToKLU5ld19sb2dpbl9jb25maWdfVUlfPU5ldyBsb2dpbiBjb25maWcKLU5ld19hdXRoX21ldGhvZF9FUlJPUl89SVdBRTAwMjBFIE5ldyBhdXRoIG1ldGhvZAotTmV3X2F1dGhfbWV0aG9kX1VJXz1OZXcgYXV0aCBtZXRob2QKLU5ld19yZWFsbV9uYW1lX1VJXz1OZXcgcmVhbG0gbmFtZQotTmV3X2Zvcm1fbG9naW5fY29uZmlnX1VJXz1OZXcgZm9ybSBsb2dpbiBjb25maWcKLU5ld19mb3JtX2Vycm9yX3BhZ2VfVUlfPU5ldyBmb3JtIGVycm9yIHBhZ2UKLShOZXdfRXJyb3JfQ29kZSlfVUlfPShOZXcgRXJyb3IgQ29kZSkKLU5ld19lcnJvcl9wYWdlX1VJXz1OZXcgZXJyb3IgcGFnZQotUm9sZV9OYW1lX1VJXz1Sb2xlIE5hbWUKLVNlbGVjdF9hbGxfVUlfPVNlbGVjdCBhbGwKLURlc2VsZWN0X2FsbF9VSV89RGVzZWxlY3QgYWxsCi1BdXRob3JpdHlfY29uc3RyYWludF9jaGFuZ19VSV89QXV0aG9yaXR5IGNvbnN0cmFpbnQgY2hhbmdlCi1TZWxlY3RfQXV0aF9Db25zdHJhaW50c19VSV89U2VsZWN0IEF1dGggQ29uc3RyYWludHMKLUxvYWRfb25fc3RhcnR1cF9VSV89TG9hZCBvbiBzdGFydHVwCi1Mb2FkX29yZGVyX19VSV89TG9hZCBvcmRlcjoKLU5ld19wYXJhbWV0ZXJfVUlfPU5ldyBwYXJhbWV0ZXIKLUluaXRpYWxpemF0aW9uX1BhcmFtZXRlcl9VSV89SW5pdGlhbGl6YXRpb24gUGFyYW1ldGVyCi1Mb2FkX29uX3N0YXJ0dXBfY2hhbmdlX1VJXz1Mb2FkIG9uIHN0YXJ0dXAgY2hhbmdlCi1EZWxldGVfcGFyYW1ldGVyX1VJXz1EZWxldGUgcGFyYW1ldGVyCi1Jbml0aWFsaXphdGlvbl9QYXJhbWV0ZXJzX1VJXz1Jbml0aWFsaXphdGlvbiBQYXJhbWV0ZXJzCi1TZWN1cml0eV9yb2xlX2NoYW5nZXNfVUlfPVNlY3VyaXR5IHJvbGUgY2hhbmdlcwotTmV3X3NlY3VyaXR5X3JvbGVfcmVmZXJlbmNfVUlfPU5ldyBzZWN1cml0eSByb2xlIHJlZmVyZW5jZQotcmVtb3ZlX3NlY3VyaXR5X3JvbGVfcmVmZXJfVUlfPXJlbW92ZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZQotU2VsZWN0X0F1dGhvcml6ZWRfUm9sZXNfVUlfPVNlbGVjdCBBdXRob3JpemVkIFJvbGVzCi1OYW1lX19VSV89TmFtZToKLURlbGV0ZV9VUkxfUGF0dGVybnNfVUlfPURlbGV0ZSBVUkwgUGF0dGVybnMKLVVSTF9QYXR0ZXJuc19VSV89VVJMIFBhdHRlcm5zCi1IVFRQX01ldGhvZHNfVUlfPUhUVFAgTWV0aG9kcwotKE5ld19VUkxfcGF0dGVybilfVUlfPShOZXcgVVJMIHBhdHRlcm4pCi1OZXdfVVJMX3BhdHRlcm5fVUlfPU5ldyBVUkwgcGF0dGVybgotV2ViX3Jlc291cmNlX2NvbGxlY3Rpb25fbmFfVUlfPVdlYiByZXNvdXJjZSBjb2xsZWN0aW9uIG5hbWUgY2hhbmdlCi1XZWJfcmVzb3VyY2VfY29sbGVjdGlvbl9kZV9VSV89V2ViIHJlc291cmNlIGNvbGxlY3Rpb24gZGVzY3JpcHRpb24gY2hhbmdlCi1BZGRfaHR0cF9tZXRob2RfdHlwZV9VSV89QWRkIGh0dHAgbWV0aG9kIHR5cGUKLVJlbW92ZV9odHRwX21ldGhvZF90eXBlX1VJXz1SZW1vdmUgaHR0cCBtZXRob2QgdHlwZQotRUpCX3JlZmVyZW5jZXNfVUlfPUVKQiByZWZlcmVuY2VzCi1SZXNvdXJjZV9mYWN0b3J5X3JlZmVyZW5jZV9VSV89UmVzb3VyY2UgcmVmZXJlbmNlcwotSlNQX3RhZ19saWJyYXJpZXNfVUlfPUpTUCB0YWcgbGlicmFyaWVzCi1SZWZlcmVuY2VzX1VJXz1SZWZlcmVuY2VzCi1FbnZpcm9ubWVudF9VSV89RW52aXJvbm1lbnQKLVNvdXJjZV9VSV89U291cmNlCi1FcnJvcl9jcmVhdGluZ19uZXN0ZWRfdGV4dF9FUlJPUl89SVdBRTAwMjFFIEVycm9yIGNyZWF0aW5nIG5lc3RlZCB0ZXh0IGVkaXRvcgotUGFnZXNfVUlfPVBhZ2VzCi1TZWN1cml0eV9VSV89U2VjdXJpdHkKLUdlbmVyYWxfVUlfPUdlbmVyYWwKLVRoZV9kZXNjcmlwdGlvbl9wcm9wZXJ0eV9VSV89VGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5Ci1Sb2xlc19VSV89Um9sZXMKLVRoZV9yb2xlc19wcm9wZXJ0eV9VSV89VGhlIHJvbGVzIHByb3BlcnR5Ci1TZWNDb25zdHJhaW50X1VJXz1TZWNDb25zdHJhaW50Ci1UaGVfc2VjQ29uc3RyYWludF9wcm9wZXJ0eV9VSV89VGhlIHNlY0NvbnN0cmFpbnQgcHJvcGVydHkKLVBhcmFtTmFtZV9VSV89UGFyYW1OYW1lCi1UaGVfcGFyYW1OYW1lX3Byb3BlcnR5X1VJXz1UaGUgcGFyYW1OYW1lIHByb3BlcnR5Ci1QYXJhbVZhbHVlX1VJXz1QYXJhbVZhbHVlCi1UaGVfcGFyYW1WYWx1ZV9wcm9wZXJ0eV9VSV89VGhlIHBhcmFtVmFsdWUgcHJvcGVydHkKLVdlYkFwcF9VSV89V2ViQXBwCi1UaGVfd2ViQXBwX3Byb3BlcnR5X1VJXz1UaGUgd2ViQXBwIHByb3BlcnR5Ci1UaGVfbG9jYXRpb25fcHJvcGVydHlfVUlfPVRoZSBsb2NhdGlvbiBwcm9wZXJ0eQotRXJyb3JDb2RlX1VJXz1FcnJvckNvZGUKLVRoZV9lcnJvckNvZGVfcHJvcGVydHlfVUlfPVRoZSBlcnJvckNvZGUgcHJvcGVydHkKLUV4Y2VwdGlvblR5cGVfVUlfPUV4Y2VwdGlvblR5cGUKLVRoZV9leGNlcHRpb25UeXBlX3Byb3BlcnR5X1VJXz1UaGUgZXhjZXB0aW9uVHlwZSBwcm9wZXJ0eQotRm9ybUxvZ2luUGFnZV9VSV89Rm9ybUxvZ2luUGFnZQotVGhlX2Zvcm1Mb2dpblBhZ2VfcHJvcGVydHlfVUlfPVRoZSBmb3JtTG9naW5QYWdlIHByb3BlcnR5Ci1Gb3JtRXJyb3JQYWdlX1VJXz1Gb3JtRXJyb3JQYWdlCi1UaGVfZm9ybUVycm9yUGFnZV9wcm9wZXJ0eV9VSV89VGhlIGZvcm1FcnJvclBhZ2UgcHJvcGVydHkKLUxvZ2luQ29uZmlnX1VJXz1Mb2dpbkNvbmZpZwotVGhlX2xvZ2luQ29uZmlnX3Byb3BlcnR5X1VJXz1UaGUgbG9naW5Db25maWcgcHJvcGVydHkKLUh0dHBNZXRob2RfVUlfPUh0dHBNZXRob2QKLVRoZV9odHRwTWV0aG9kX3Byb3BlcnR5X1VJXz1UaGUgaHR0cE1ldGhvZCBwcm9wZXJ0eQotUmVzQ29sbGVjdGlvbl9VSV89UmVzQ29sbGVjdGlvbgotVGhlX3Jlc0NvbGxlY3Rpb25fcHJvcGVydHlfVUlfPVRoZSByZXNDb2xsZWN0aW9uIHByb3BlcnR5Ci1BdXRoTWV0aG9kX1VJXz1BdXRoTWV0aG9kCi1UaGVfYXV0aE1ldGhvZF9wcm9wZXJ0eV9VSV89VGhlIGF1dGhNZXRob2QgcHJvcGVydHkKLVJlYWxtTmFtZV9VSV89UmVhbG1OYW1lCi1UaGVfcmVhbG1OYW1lX3Byb3BlcnR5X1VJXz1UaGUgcmVhbG1OYW1lIHByb3BlcnR5Ci1Gb3JtTG9naW5Db25maWdfVUlfPUZvcm1Mb2dpbkNvbmZpZwotVGhlX2Zvcm1Mb2dpbkNvbmZpZ19wcm9wZXJfVUlfPVRoZSBmb3JtTG9naW5Db25maWcgcHJvcGVydHkKLUV4dGVuc2lvbl9VSV89RXh0ZW5zaW9uCi1UaGVfZXh0ZW5zaW9uX3Byb3BlcnR5X1VJXz1UaGUgZXh0ZW5zaW9uIHByb3BlcnR5Ci1NaW1lVHlwZV9VSV89TWltZVR5cGUKLVRoZV9taW1lVHlwZV9wcm9wZXJ0eV9VSV89VGhlIG1pbWVUeXBlIHByb3BlcnR5Ci1Sb2xlTmFtZV9VSV89Um9sZU5hbWUKLVRoZV9yb2xlTmFtZV9wcm9wZXJ0eV9VSV89VGhlIHJvbGVOYW1lIHByb3BlcnR5Ci1BdXRoQ29uc3RyYWludF9VSV89QXV0aENvbnN0cmFpbnQKLVRoZV9hdXRoQ29uc3RyYWludF9wcm9wZXJ0X1VJXz1UaGUgYXV0aENvbnN0cmFpbnQgcHJvcGVydHkKLVVzZXJEYXRhQ29uc3RyYWludF9VSV89VXNlckRhdGFDb25zdHJhaW50Ci1UaGVfdXNlckRhdGFDb25zdHJhaW50X3Byb19VSV89VGhlIHVzZXJEYXRhQ29uc3RyYWludCBwcm9wZXJ0eQotQ3JlYXRlX1dlYlJlc291cmNlQ29sbGVjdGlfVUlfPUNyZWF0ZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24KLVNlY3VyaXR5Q29uc3RyYWludF9VSV89U2VjdXJpdHlDb25zdHJhaW50Ci1TbWFsbEljb25fVUlfPVNtYWxsSWNvbgotU21hbGxfSWNvbl9VSV89U21hbGwgSWNvbgotTGFyZ2VJY29uX1VJXz1MYXJnZUljb24KLUxhcmdlX0ljb25fVUlfPUxhcmdlIEljb24KLVNlcnZsZXROYW1lX1VJXz1TZXJ2bGV0TmFtZQotVGhlX3NlcnZsZXROYW1lX3Byb3BlcnR5X1VJXz1UaGUgc2VydmxldE5hbWUgcHJvcGVydHkKLURpc3BsYXlOYW1lX1VJXz1EaXNwbGF5TmFtZQotVGhlX2Rpc3BsYXlOYW1lX3Byb3BlcnR5X1VJXz1UaGUgZGlzcGxheU5hbWUgcHJvcGVydHkKLUxvYWRPblN0YXJ0dXBfVUlfPUxvYWRPblN0YXJ0dXAKLVRoZV9sb2FkT25TdGFydHVwX3Byb3BlcnR5X1VJXz1UaGUgbG9hZE9uU3RhcnR1cCBwcm9wZXJ0eQotQ3JlYXRlX0luaXRQYXJhbV9VSV89Q3JlYXRlIEluaXRQYXJhbQotPHNlcnZsZXQ+X1VJXz08c2VydmxldD4KLVVybFBhdHRlcm5fVUlfPVVybFBhdHRlcm4KLVRoZV91cmxQYXR0ZXJuX3Byb3BlcnR5X1VJXz1UaGUgdXJsUGF0dGVybiBwcm9wZXJ0eQotU2VydmxldF9VSV89U2VydmxldAotVGhlX3NlcnZsZXRfcHJvcGVydHlfVUlfPVRoZSBzZXJ2bGV0IHByb3BlcnR5Ci1VUkxfcGF0dGVybl9VSV89VVJMIFBhdHRlcm4KLT9fVUlfPT8KLVNlc3Npb25UaW1lb3V0X1VJXz1TZXNzaW9uVGltZW91dAotVGhlX3Nlc3Npb25UaW1lb3V0X3Byb3BlcnRfVUlfPVRoZSBzZXNzaW9uVGltZW91dCBwcm9wZXJ0eQotVGFnbGliVVJJX1VJXz1UYWdsaWJVUkkKLVRoZV90YWdsaWJVUklfcHJvcGVydHlfVUlfPVRoZSB0YWdsaWJVUkkgcHJvcGVydHkKLVRhZ2xpYkxvY2F0aW9uX1VJXz1UYWdsaWJMb2NhdGlvbgotVGhlX3RhZ2xpYkxvY2F0aW9uX3Byb3BlcnRfVUlfPVRoZSB0YWdsaWJMb2NhdGlvbiBwcm9wZXJ0eQotVHJhbnNwb3J0R3VhcmFudGVlX1VJXz1UcmFuc3BvcnRHdWFyYW50ZWUKLVRoZV90cmFuc3BvcnRHdWFyYW50ZWVfcHJvX1VJXz1UaGUgdHJhbnNwb3J0R3VhcmFudGVlIHByb3BlcnR5Ci1UaGVfZGlzdHJpYnV0YWJsZV9wcm9wZXJ0eV9VSV89VGhlIGRpc3RyaWJ1dGFibGUgcHJvcGVydHkKLUZpbGVMaXN0X1VJXz1GaWxlTGlzdAotVGhlX2ZpbGVMaXN0X3Byb3BlcnR5X1VJXz1UaGUgZmlsZUxpc3QgcHJvcGVydHkKLUNyZWF0ZV9Db250ZXh0UGFyYW1fVUlfPUNyZWF0ZSBDb250ZXh0UGFyYW0KLTx3ZWJfYXBwPl9VSV89PHdlYiBhcHA+Ci1XZWJSZXNvdXJjZU5hbWVfVUlfPVdlYlJlc291cmNlTmFtZQotVGhlX3dlYlJlc291cmNlTmFtZV9wcm9wZXJfVUlfPVRoZSB3ZWJSZXNvdXJjZU5hbWUgcHJvcGVydHkKLUNyZWF0ZV9VUkxQYXR0ZXJuVHlwZV9VSV89Q3JlYXRlIFVSTFBhdHRlcm5UeXBlCi1XZWJUeXBlX1VJXz1XZWJUeXBlCi1Kc3BGaWxlX1VJXz1Kc3BGaWxlCi1UaGVfanNwRmlsZV9wcm9wZXJ0eV9VSV89VGhlIGpzcEZpbGUgcHJvcGVydHkKLUNsYXNzTmFtZV9VSV89Q2xhc3NOYW1lCi1UaGVfY2xhc3NOYW1lX3Byb3BlcnR5X1VJXz1UaGUgY2xhc3NOYW1lIHByb3BlcnR5Ci1XZWxjb21lRmlsZV9VSV89V2VsY29tZUZpbGUKLVRoZV93ZWxjb21lRmlsZV9wcm9wZXJ0eV9VSV89VGhlIHdlbGNvbWVGaWxlIHByb3BlcnR5Ci08d2VsY29tZS1maWxlPl9VSV89PHdlbGNvbWUtZmlsZT4KLUNyZWF0ZV9XZWxjb21lRmlsZV9VSV89Q3JlYXRlIFdlbGNvbWVGaWxlCi1XZWxjb21lX0ZpbGVfTGlzdF9VSV89V2VsY29tZSBGaWxlIExpc3QKLUVycm9yX01lc3NhZ2VfTm9fV1JDX0VudHJpZXNfVUlfPUF0IGxlYXN0IG9uZSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyByZXF1aXJlZCBmb3IgYSBzZWN1cml0eSBjb25zdHJhaW50LiBJZiB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbiwgeW91IG11c3QgZGVsZXRlIHRoZSBlbnRpcmUgc2VjdXJpdHkgY29uc3RyYWludC4KLUVycm9yX1RpdGxlX05vX1dSQ19FbnRyaWVzX1VJXz1XZWIgcmVzb3VyY2UgY29sbGVjdGlvbgotcmVxdWlyZWQxY29uY2F0PUNyZWF0ZSBhIGNoaWxkIG9mIHR5cGUgI0NISUxEX0NMQVNTX05BTUUjIGZvciB0aGUgc2VsZWN0ZWQgezB9LgotKE5ld19VUkwpX1VJX19VSV89KE5ldyBVUkwpCi1OZXdfcGFyYW1fVUlfX1VJXz1OZXcgcGFyYW0KLXZhbHVlX1VJX19VSV89dmFsdWUKLVNlbGVjdF9TZXJ2bGV0X29yX0pTUF9VSV89U2VsZWN0IFNlcnZsZXQgb3IgSlNQCi1TZWxlY3RfSlNQX1VJXz1TZWxlY3QgSlNQCi1BZGRfU2VydmxldF9vcl9KU1BfVUlfPUFkZCBTZXJ2bGV0IG9yIEpTUAotQWRkX0pTUF9VSV89QWRkIEpTUAotTmV3X0Vycm9yUGFnZV9VSV89TmV3IEVycm9yUGFnZQotTmV3X0V4Y2VwdGlvblR5cGVfVUlfPU5ldyBFeGNlcHRpb25UeXBlCi1BZGRfU2VydmxldF9VSV89QWRkIFNlcnZsZXQKLVdlYl9OYXR1cmVfUnVudGltZV9kb2VzX25vX0VYQ189SVdBRTAwMjJFIFdlYiBOYXR1cmUgUnVudGltZSBkb2VzIG5vdCBleGlzdC4KLUVkaXRvcl9SZWRpcmVjdGlvbl9VSV89RWRpdG9yIFJlZGlyZWN0aW9uCi1UaGVfc2VsZWN0ZWRfd2ViLnhtbF9maWxlX19FUlJPUl89SVdBRTAwMjNFIFRoZSBzZWxlY3RlZCB3ZWIueG1sIGZpbGUgaXMgbm90IGNvbnRhaW5lZCB3aXRoaW4gYSBXQVIgUHJvamVjdC4gIFRoZXJlZm9yZSwgdGhpcyB3ZWIueG1sIGZpbGUgaXMgbm90IGEgRGVwbG95bWVudCBEZXNjcmlwdG9yIGZvciBhIFdlYiBBcmNoaXZlLCBoZW5jZSB0aGUgWE1MIGVkaXRvciB3aWxsIGJlIG9wZW5lZC4KLVByb2JsZW1zX09wZW5pbmdfRWRpdG9yX1VJXz1Qcm9ibGVtcyBPcGVuaW5nIEVkaXRvcgotQ3JlYXRlXyNDSElMRF9DTEFTU19OQU1FI19VSV89Q3JlYXRlICNDSElMRF9DTEFTU19OQU1FIwotTW92ZV9XZWxjb21lX0ZpbGVzX0Rvd25fVUlfPU1vdmUgV2VsY29tZSBGaWxlcyBEb3duCi1Nb3ZlX1dlbGNvbWVfRmlsZXNfVXBfVUlfPU1vdmUgV2VsY29tZSBGaWxlcyBVcAotRXJyb3Jfb2NjdXJyZWRfZ2V0dGluZ193ZWI9RXJyb3Igb2NjdXJyZWQgZ2V0dGluZyB3ZWIueG1sOiB7MH0KLVNlbGVjdF9DbGFzc19VSV89U2VsZWN0IENsYXNzCi1Db3VsZF9ub3RfdW5pcXVlbHlfbWFwX3RoZV9FUlJPUl89SVdBRTAwMjRFIENvdWxkIG5vdCB1bmlxdWVseSBtYXAgdGhlIGNsYXNzIG5hbWUgdG8gYSBjbGFzcy4KLUluZm9ybWF0aW9uX1VJXz1JbmZvcm1hdGlvbgotVGhlX2Nob3Nlbl9vcGVyYXRpb25faXNfbm9fSU5GT189SVdBRTAwMjVJIFRoZSBjaG9zZW4gb3BlcmF0aW9uIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLgotSk5ESV9OYW1lX1VJXz1KTkRJIE5hbWUKLU5ld19TZXJ2bGV0X1VJXz1OZXcgU2VydmxldAotCi0KLShOZXdfRmlsdGVyKV8xPShOZXcgRmlsdGVyKQotTmV3X2ZpbHRlcl8yPU5ldyBmaWx0ZXIKLU5ld19maWx0ZXJfbWFwcGluZ18xPU5ldyBmaWx0ZXIgbWFwcGluZwotTmV3X2xpc3RlbmVyXzE9TmV3IGxpc3RlbmVyCi1UaGVfbmFtZV9wcm9wZXJ0eV8yPVRoZSBuYW1lIHByb3BlcnR5Ci1UaGVfdmFsdWVfcHJvcGVydHlfND1UaGUgdmFsdWUgcHJvcGVydHkKLVRoZV90YXJnZXRfcHJvcGVydHlfMj1UaGUgdGFyZ2V0IHByb3BlcnR5Ci1UaGVfdHlwZV9wcm9wZXJ0eV80PVRoZSB0eXBlIHByb3BlcnR5Ci1UaGVfRXh0ZXJuYWxDYWNoZUdyb3Vwc19wcm9wZXJ0eV8yPVRoZSBFeHRlcm5hbENhY2hlR3JvdXBzIHByb3BlcnR5Ci1UaGVfSWRHZW5lcmF0b3JfcHJvcGVydHlfND1UaGUgSWRHZW5lcmF0b3IgcHJvcGVydHkKLVRoZV9JbnZhbGlkYXRlT25seV9wcm9wZXJ0eV82PVRoZSBJbnZhbGlkYXRlT25seSBwcm9wZXJ0eQotVGhlX01ldGFkYXRhR2VuZXJhdG9yX3Byb3BlcnR5Xzg9VGhlIE1ldGFkYXRhR2VuZXJhdG9yIHByb3BlcnR5Ci1UaGVfUHJpb3JpdHlfcHJvcGVydHlfMTA9VGhlIFByaW9yaXR5IHByb3BlcnR5Ci1UaGVfUHJvcGVydGllc0dyb3VwTmFtZV9wcm9wZXJ0eV8xMj1UaGUgUHJvcGVydGllc0dyb3VwTmFtZSBwcm9wZXJ0eQotVGhlX1RpbWVvdXRfcHJvcGVydHlfMTQ9VGhlIFRpbWVvdXQgcHJvcGVydHkKLVNtYWxsX18xPVNtYWxsOgotTGFyZ2VfXzM9TGFyZ2U6Ci1DaG9vc2VfU21hbGxfSWNvbl81PUNob29zZSBTbWFsbCBJY29uCi1TZWxlY3RfdGhlX1NtYWxsX0ljb25fNj1TZWxlY3QgdGhlIFNtYWxsIEljb24KLUNob29zZV9MYXJnZV9JY29uXzc9Q2hvb3NlIExhcmdlIEljb24KLVNlbGVjdF90aGVfTGFyZ2VfSWNvbl84PVNlbGVjdCB0aGUgTGFyZ2UgSWNvbgotQ2FjaGluZ19ncm91cF9uYW1lX18xPUNhY2hpbmcgZ3JvdXAgbmFtZToKLVByaW9yaXR5X18yPVByaW9yaXR5OgotVGltZW91dF9fMz1UaW1lb3V0Ogotc2Vjb25kKHMpXzQ9c2Vjb25kKHMpCi1JbnZhbGlkYXRlX29ubHlfNT1JbnZhbGlkYXRlIG9ubHkKLUNhY2hpbmdfZ3JvdXBfbWVtYmVyc19fNj1DYWNoaW5nIGdyb3VwIG1lbWJlcnM6Ci1fU2VydmxldC9KU1BfNz1cIFNlcnZsZXQvSlNQCi1SZW1vdmVfOT1SZW1vdmUKLVVzZV9VUklzX2Zvcl9jYWNoZV9JRF9idWlsZGluZ18xPVVzZSBVUklzIGZvciBjYWNoZSBJRCBidWlsZGluZwotVXNlX3NwZWNpZmllZF9zdHJpbmdfXzI9VXNlIHNwZWNpZmllZCBzdHJpbmc6Ci1WYXJpYWJsZXNfXzM9VmFyaWFibGVzOgotX0lEXzQ9XCBJRAotX1R5cGVfNT1cIFR5cGUKLV9SZXF1aXJlZF82PVwgUmVxdWlyZWQKLUV4dGVybmFsX0NhY2hlX2dyb3Vwc19fMT1FeHRlcm5hbCBDYWNoZSBncm91cHM6Ci1fR3JvdXBfTmFtZV8yPVwgR3JvdXAgTmFtZQotSURfZ2VuZXJhdG9yX18zPUlEIGdlbmVyYXRvcjoKLU1ldGFfZGF0YV9nZW5lcmF0b3JfXzQ9TWV0YSBkYXRhIGdlbmVyYXRvcjoKLVJlbW92ZV82PVJlbW92ZQotQWRkX1NlcnZsZXRfQ2FjaGluZ19Db25maWd1cmF0aW9uXzE9QWRkIFNlcnZsZXQgQ2FjaGluZyBDb25maWd1cmF0aW9uCi1FZGl0X1NlcnZsZXRfQ2FjaGluZ19Db25maWd1cmF0aW9uXzI9RWRpdCBTZXJ2bGV0IENhY2hpbmcgQ29uZmlndXJhdGlvbgotQWRkXzE9QWRkCi1SZW1vdmVfMj1SZW1vdmUKLVVQXzU9VVAKLURPV05fNj1ET1dOCi1BZGRfb3JfUmVtb3ZlX1NlcnZsZXRfb3JfSlNQXzE9QWRkIG9yIFJlbW92ZSBTZXJ2bGV0IG9yIEpTUAotQWRkX29yX1JlbW92ZV9TZWN1cml0eV9Sb2xlXzI9QWRkIG9yIFJlbW92ZSBTZWN1cml0eSBSb2xlCi1BZGRfb3JfUmVtb3ZlX1NlY3VyaXR5X0NvbnN0cmFpbnRfMz1BZGQgb3IgUmVtb3ZlIFNlY3VyaXR5IENvbnN0cmFpbnQKLUFkZF9vcl9SZW1vdmVfRW52aXJvbm1lbnRfVmFyaWFibGVfND1BZGQgb3IgUmVtb3ZlIEVudmlyb25tZW50IFZhcmlhYmxlCi1BZGRfb3JfUmVtb3ZlX0VKQl9SZWZlcmVuY2VfNT1BZGQgb3IgUmVtb3ZlIEVKQiBSZWZlcmVuY2UKLUFkZF9vcl9SZW1vdmVfUmVzb3VyY2VfUmVmZXJlbmNlXzY9QWRkIG9yIFJlbW92ZSBSZXNvdXJjZSBSZWZlcmVuY2UKLUFkZF9vcl9SZW1vdmVfSlNQX1RhZ19MaWJyYXJ5Xzc9QWRkIG9yIFJlbW92ZSBKU1AgVGFnIExpYnJhcnkKLUFkZF9vcl9SZW1vdmVfRXJyb3JfUGFnZV84PUFkZCBvciBSZW1vdmUgRXJyb3IgUGFnZQotQWRkX29yX1JlbW92ZV9FeGNlcHRpb25fUGFnZV85PUFkZCBvciBSZW1vdmUgRXhjZXB0aW9uIFBhZ2UKLUFkZF9vcl9SZW1vdmVfV2VsY29tZV9QYWdlXzEwPUFkZCBvciBSZW1vdmUgV2VsY29tZSBQYWdlCi1BZGRfb3JfUmVtb3ZlX0NvbnRleHRfUGFyYW1ldGVyXzExPUFkZCBvciBSZW1vdmUgQ29udGV4dCBQYXJhbWV0ZXIKLUFkZF9vcl9SZW1vdmVfTWltZV9NYXBwaW5nXzEyPUFkZCBvciBSZW1vdmUgTWltZSBNYXBwaW5nCi1BZGRfb3JfUmVtb3ZlX0ZpbHRlcl8xMz1BZGQgb3IgUmVtb3ZlIEZpbHRlcgotQWRkX29yX1JlbW92ZV9MaXN0ZW5lcl8xND1BZGQgb3IgUmVtb3ZlIExpc3RlbmVyCi1BZGRfb3JfUmVtb3ZlX01pbWVfRmlsdGVyXzE1PUFkZCBvciBSZW1vdmUgTWltZSBGaWx0ZXIKLUFkZF9vcl9SZW1vdmVfRmlsZV9TZXJ2aW5nX0F0dHJpYnV0ZV8xNj1BZGQgb3IgUmVtb3ZlIEZpbGUgU2VydmluZyBBdHRyaWJ1dGUKLUFkZF9vcl9SZW1vdmVfSW52b2tlcl9BdHRyaWJ1dGVfMTc9QWRkIG9yIFJlbW92ZSBJbnZva2VyIEF0dHJpYnV0ZQotQWRkX29yX1JlbW92ZV9KU1BfQXR0cmlidXRlXzE4PUFkZCBvciBSZW1vdmUgSlNQIEF0dHJpYnV0ZQotQWRkX29yX1JlbW92ZV9TZXJ2bGV0X0NhY2hpbmdfQ29uZmlndXJhdGlvbl8xOT1BZGQgb3IgUmVtb3ZlIFNlcnZsZXQgQ2FjaGluZyBDb25maWd1cmF0aW9uCi1GaWx0ZXJfTWFwcGluZ3NfMT1GaWx0ZXIgTWFwcGluZ3MKLVJlYWRfT25seV8yMj1SZWFkIE9ubHkKLVdyaXRhYmxlXzIzPVdyaXRhYmxlCi1SZWFkX29ubHlfZmlsZXNfX19fMjU9UmVhZCBvbmx5IGZpbGVzOgotV2ViX0RlcGxveW1lbnRfRGVzY3JpcHRvcl8yOD1XZWIgRGVwbG95bWVudCBEZXNjcmlwdG9yCi1FbnZpcm9ubWVudF8xPUVudmlyb25tZW50Ci1FbnZpcm9ubWVudF9WYXJpYWJsZXNfMj1FbnZpcm9ubWVudCBWYXJpYWJsZXMKLUV4dGVuc2lvbnNfMT1FeHRlbnNpb25zCi1GaWx0ZXJzXzE9RmlsdGVycwotTGlzdGVuZXJzXzE9TGlzdGVuZXJzCi1NaW1lXzE9TWltZQotTWltZV9NYXBwaW5nc18yPU1pbWUgTWFwcGluZ3MKLU92ZXJ2aWV3XzE9T3ZlcnZpZXcKLVBhZ2VzXzE9UGFnZXMKLVBhcmFtZXRlcnNfMT1QYXJhbWV0ZXJzCi1Db250ZXh0X1BhcmFtZXRlcnNfMj1Db250ZXh0IFBhcmFtZXRlcnMKLVJlZmVyZW5jZXNfMT1SZWZlcmVuY2VzCi1SZWZlcmVuY2VzXzI9UmVmZXJlbmNlcwotRUpCX3JlZmVyZW5jZXNfMz1FSkIgcmVmZXJlbmNlcwotUmVzb3VyY2VfcmVmZXJlbmNlc180PVJlc291cmNlIHJlZmVyZW5jZXMKLUpTUF90YWdfbGlicmFyaWVzXzU9SlNQIHRhZyBsaWJyYXJpZXMKLVNlY3VyaXR5XzE9U2VjdXJpdHkgcm9sZXMKLVNlY3VyaXR5X1JvbGVzXzM9U2VjdXJpdHkgUm9sZXMKLVNlY3VyaXR5X0NvbnN0cmFpbnRzXzQ9U2VjdXJpdHkgQ29uc3RyYWludHMKLVNlcnZsZXRzXzE9U2VydmxldHMKLVNlcnZsZXRzX2FuZF9KU1BzXzI9U2VydmxldHMgYW5kIEpTUHMKLURldGFpbHNfMT1EZXRhaWxzCi1EZXRhaWxzX29mX3RoZV9zZWxlY3RlZF9lbnZpcm9ubWVudF92YXJpYWJsZV9fMj1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBlbnZpcm9ubWVudCB2YXJpYWJsZToKLVR5cGVfXzM9VHlwZToKLVZhbHVlX18xMz1WYWx1ZToKLU1pbWVfVHlwZV9jaGFuZ2VfMTQ9TWltZSBUeXBlIGNoYW5nZQotVmFyaWFibGVzXzE9VmFyaWFibGVzCi1UaGVfZm9sbG93aW5nX2Vudmlyb25tZW50X3ZhcmlhYmxlc19hcmVfcmVsZXZhbnRfdG9fdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHJlbGV2YW50IHRvIHRoaXMgd2ViIGFwcGxpY2F0aW9uOgotKE5ld19WYXJpYWJsZSlfMz0oTmV3IFZhcmlhYmxlKQotRmlsZV9TZXJ2aW5nX0F0dHJpYnV0ZXNfMT1GaWxlIFNlcnZpbmcgQXR0cmlidXRlcwotX05hbWVfMj1cIE5hbWUKLV9WYWx1ZV8zPVwgVmFsdWUKLShuYW1lKV80PShuYW1lKQotKHZhbHVlKV81PSh2YWx1ZSkKLUdlbmVyYWxfMT1HZW5lcmFsCi1SZWxvYWRpbmdfZW5hYmxlZF8yPVJlbG9hZGluZyBlbmFibGVkCi1SZWxvYWRfaW50ZXJ2YWxfXzM9UmVsb2FkIGludGVydmFsOgotRGVmYXVsdF9lcnJvcl9wYWdlX181PURlZmF1bHQgZXJyb3IgcGFnZToKLUFkZGl0aW9uYWxfY2xhc3NfcGF0aF9fNz1BZGRpdGlvbmFsIGNsYXNzIHBhdGg6Ci1GaWxlX3NlcnZpbmdfZW5hYmxlZF85PUZpbGUgc2VydmluZyBlbmFibGVkCi1EaXJlY3RvcnlfYnJvd3NpbmdfZW5hYmxlZF8xMD1EaXJlY3RvcnkgYnJvd3NpbmcgZW5hYmxlZAotU2VydmVfc2VydmxldHNfYnlfY2xhc3NuYW1lXzExPVNlcnZlIHNlcnZsZXRzIGJ5IGNsYXNzbmFtZQotUHJlY29tcGlsZV9KU1BzXzEyPVByZWNvbXBpbGUgSlNQcwotQXV0b21hdGljX1JlcXVlc3RfRW5jb2RpbmdfZW5hYmxlZF8xMz1BdXRvbWF0aWMgUmVxdWVzdCBFbmNvZGluZyBlbmFibGVkCi1BdXRvbWF0aWNfUmVzcG9uc2VfRW5jb2RpbmdfZW5hYmxlZF8xND1BdXRvbWF0aWMgUmVzcG9uc2UgRW5jb2RpbmcgZW5hYmxlZAotQ2hvb3NlX2FfRGVmYXVsdF9FcnJvcl9QYWdlXzE1PUNob29zZSBhIERlZmF1bHQgRXJyb3IgUGFnZQotUmVsb2FkX0VuYWJsZWRfQ2hhbmdlZF8xNj1SZWxvYWQgRW5hYmxlZCBDaGFuZ2VkCi1GaWxlX1NlcnZpbmdfRW5hYmxlZF9DaGFuZ2VkXzE3PUZpbGUgU2VydmluZyBFbmFibGVkIENoYW5nZWQKLURpcmVjdG9yeV9Ccm93c2luZ19FbmFibGVkX0NoYW5nZWRfMTg9RGlyZWN0b3J5IEJyb3dzaW5nIEVuYWJsZWQgQ2hhbmdlZAotU2VydmVfU2VydmxldHNfYnlfY2xhc3NuYW1lX0VuYWJsZWRfQ2hhbmdlZF8xOT1TZXJ2ZSBTZXJ2bGV0cyBieSBjbGFzc25hbWUgRW5hYmxlZCBDaGFuZ2VkCi1QcmVjb21waWxlX0pTUHNfRW5hYmxlZF9DaGFuZ2VkXzIwPVByZWNvbXBpbGUgSlNQcyBFbmFibGVkIENoYW5nZWQKLUF1dG9tYXRpY19SZXF1ZXN0X0VuY29kaW5nX0VuYWJsZWRfQ2hhbmdlZF8yMT1BdXRvbWF0aWMgUmVxdWVzdCBFbmNvZGluZyBFbmFibGVkIENoYW5nZWQKLUF1dG9tYXRpY19SZXNwb25zZV9FbmNvZGluZ19FbmFibGVkX0NoYW5nZWRfMjI9QXV0b21hdGljIFJlc3BvbnNlIEVuY29kaW5nIEVuYWJsZWQgQ2hhbmdlZAotUmVsb2FkX0ludGVydmFsXzI1PVJlbG9hZCBJbnRlcnZhbAotRGVmYXVsdF9FcnJvcl9QYWdlXzI2PURlZmF1bHQgRXJyb3IgUGFnZQotQWRkaXRpb25hbF9DbGFzc3BhdGhfMjc9QWRkaXRpb25hbCBDbGFzc3BhdGgKLUludm9rZXJfQXR0cmlidXRlc18xPUludm9rZXIgQXR0cmlidXRlcwotSlNQX0F0dHJpYnV0ZXNfMT1KU1AgQXR0cmlidXRlcwotTUlNRV9GaWx0ZXJzX18xPU1JTUUgRmlsdGVycwotX1RhcmdldF8yPVwgVGFyZ2V0Ci1fVHlwZV8zPVwgVHlwZQotKHRhcmdldClfND0odGFyZ2V0KQotKHR5cGUpXzU9KHR5cGUpCi1TZXJ2bGV0X0NhY2hpbmdfQ29uZmlndXJhdGlvbnNfMT1TZXJ2bGV0IENhY2hpbmcgQ29uZmlndXJhdGlvbnMKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX2ZpbHRlcl8yPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIGZpbHRlcgotRmlsdGVyX2NsYXNzX18zPUZpbHRlciBjbGFzczoKLURpc3BsYXlfbmFtZV9fNT1EaXNwbGF5IG5hbWU6Ci1GaWx0ZXJfVHlwZV9TZWxlY3Rpb25fNz1GaWx0ZXIgVHlwZSBTZWxlY3Rpb24KLUZpbHRlckl0ZW1Qcm92aWRlcl9VSV8wPUZpbHRlck5hbWUKLUNob29zZV9hX0ZpbHRlcl9UeXBlXzg9Q2hvb3NlIGEgRmlsdGVyIFR5cGUKLVRoZV9mb2xsb3dpbmdfRmlsdGVyc19hcmVfaW5jbHVkZWRfaW5fdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBGaWx0ZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbjoKLUljb25zXzE9SWNvbnMKLVRoZV9mb2xsb3dpbmdfaWNvbnNfcmVwcmVzZW50X3RoZV9zZWxlY3RlZF9maWx0ZXJfXzI9VGhlIGZvbGxvd2luZyBpY29ucyByZXByZXNlbnQgdGhlIHNlbGVjdGVkIGZpbHRlcjoKLUluaXRpYWxpemF0aW9uXzE9SW5pdGlhbGl6YXRpb24KLVRoZV9mb2xsb3dpbmdfRmlsdGVyc193aWxsX2JlX3N0YXJ0ZWRfd2hlbl90aGVfd2ViX2FwcGxpY2F0aW9uX2lzX3N0YXJ0ZWRfXzI9VGhlIGZvbGxvd2luZyBGaWx0ZXJzIHdpbGwgYmUgc3RhcnRlZCB3aGVuIHRoZSB3ZWIgYXBwbGljYXRpb24gaXMgc3RhcnRlZDoKLV9OYW1lXzM9XCBOYW1lCi1fVmFsdWVfND1cIFZhbHVlCi1EZWxldGVfRmlsdGVyX0luaXRfUGFyYW1fNT1EZWxldGUgRmlsdGVyIEluaXQgUGFyYW0KLShuYW1lKV82PShuYW1lKQotKHZhbHVlKV83PSh2YWx1ZSkKLU5ld19Jbml0aWFsaXphdGlvbl9QYXJhbWV0ZXJfOD1OZXcgSW5pdGlhbGl6YXRpb24gUGFyYW1ldGVyCi1TZXJ2bGV0X01hcHBpbmdzXzI9U2VydmxldCBNYXBwaW5ncwotVGhlX2ZvbGxvd2luZ19zZXJ2bGV0c19hcmVfbWFwcGVkX3RvX3RoaXNfZmlsdGVyX18zPVRoZSBmb2xsb3dpbmcgc2VydmxldHMgYXJlIG1hcHBlZCB0byB0aGlzIGZpbHRlcjoKLURlbGV0ZV9maWx0ZXJfbWFwcGluZ3NfND1EZWxldGUgZmlsdGVyIG1hcHBpbmdzCi1OZXdfZmlsdGVyX21hcHBpbmdfNT1OZXcgZmlsdGVyIG1hcHBpbmcKLVVSTF9NYXBwaW5nc18xPVVSTCBNYXBwaW5ncwotVGhlX2ZvbGxvd2luZ19VUkxzX2FyZV9tYXBwZWRfdG9fdGhpc19maWx0ZXJfXzI9VGhlIGZvbGxvd2luZyBVUkxzIGFyZSBtYXBwZWQgdG8gdGhpcyBmaWx0ZXI6Ci1EZWxldGVfZmlsdGVyX21hcHBpbmdzXzM9RGVsZXRlIGZpbHRlciBtYXBwaW5ncwotTmV3X2ZpbHRlcl9tYXBwaW5nXzQ9TmV3IGZpbHRlciBtYXBwaW5nCi1EZXRhaWxzX29mX3RoZV9zZWxlY3RlZF9saXN0ZW5lcl8yPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIGxpc3RlbmVyCi1QYWNrYWdlX18zPVBhY2thZ2U6Ci0oZGVmYXVsdF9wYWNrYWdlKV81PShkZWZhdWx0IHBhY2thZ2UpCi1MaXN0ZW5lcnNfNT1MaXN0ZW5lcnMKLVRoZV9mb2xsb3dpbmdfTGlzdGVuZXJzX2FyZV9pbmNsdWRlZF9pbl90aGlzX3dlYl9hcHBsaWNhdGlvbl9fNj1UaGUgZm9sbG93aW5nIExpc3RlbmVycyBhcmUgaW5jbHVkZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb246Ci1MaXN0ZW5lcl9UeXBlX1NlbGVjdGlvbl8xMD1MaXN0ZW5lciBUeXBlIFNlbGVjdGlvbgotQ2hvb3NlX2FfTGlzdGVuZXJfVHlwZV8xMT1DaG9vc2UgYSBMaXN0ZW5lciBUeXBlCi1EZXRhaWxzX29mX3RoZV9zZWxlY3RlZF9maWxlX2V4dGVuc2lvbl9fMj1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBmaWxlIGV4dGVuc2lvbjoKLU1pbWVfdHlwZV9fMz1NaW1lIHR5cGU6Ci1NaW1lX1R5cGVfY2hhbmdlXzQ9TWltZSBUeXBlIGNoYW5nZQotRmlsZV9FeHRlbnNpb25zXzE9RmlsZSBFeHRlbnNpb25zCi1UaGVfZm9sbG93aW5nX2ZpbGVfZXh0ZW5zaW9uc19hcmVfbWFwcGVkX3RvX01pbWVfdHlwZXNfXzI9VGhlIGZvbGxvd2luZyBmaWxlIGV4dGVuc2lvbnMgYXJlIG1hcHBlZCB0byBNaW1lIHR5cGVzOgotQ29udGV4dF9QYXJhbWV0ZXJzXzE9Q29udGV4dCBQYXJhbWV0ZXJzCi1UaGVfZm9sbG93aW5nX2NvbnRleHRfaW5pdGlhbGl6YXRpb25fcGFyYW1ldGVyc19hcHBseV90b19hbGxfc2VydmxldHNfaW5fdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgYXBwbHkgdG8gYWxsIHNlcnZsZXRzIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uOgotRW52aXJvbm1lbnRfVmFyaWFibGVzXzE9RW52aXJvbm1lbnQgVmFyaWFibGVzCi1UaGVfZm9sbG93aW5nX2ZpbHRlcnNfYXJlX3VzZWRfaW5fdGhpc19hcHBsaWNhdGlvbl9fMj1UaGUgZm9sbG93aW5nIGZpbHRlcnMgYXJlIHVzZWQgaW4gdGhpcyBhcHBsaWNhdGlvbjoKLUdlbmVyYWxfSW5mb3JtYXRpb25fMT1HZW5lcmFsIEluZm9ybWF0aW9uCi1EaXNwbGF5X25hbWVfXzI9RGlzcGxheSBuYW1lOgotRGVzY3JpcHRpb25fXzM9RGVzY3JpcHRpb246Ci1TZXNzaW9uX3RpbWVfb3V0X180PVNlc3Npb24gdGltZSBvdXQ6Ci1EaXN0cmlidXRhYmxlXzU9RGlzdHJpYnV0YWJsZQotRGlzcGxheV9OYW1lXzY9RGlzcGxheSBOYW1lCi1EZXNjcmlwdGlvbl83PURlc2NyaXB0aW9uCi1JY29uc18yPUljb25zCi1UaGVfZm9sbG93aW5nX2ljb25zX3JlcHJlc2VudF90aGlzX3dlYl9hcHBsaWNhdGlvbl9fMz1UaGUgZm9sbG93aW5nIGljb25zIHJlcHJlc2VudCB0aGlzIHdlYiBhcHBsaWNhdGlvbjoKLVRoZV9mb2xsb3dpbmdfbGlzdGVuZXJzX2FyZV91c2VkX2luX3RoaXNfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBsaXN0ZW5lcnMgYXJlIHVzZWQgaW4gdGhpcyBhcHBsaWNhdGlvbjoKLU1pbWVfVHlwZV8xPU1pbWUgVHlwZQotVGhlX2ZvbGxvd2luZ19maWxlX2V4dGVuc2lvbnNfYXJlX21hcHBlZF90b19taW1lX3R5cGVzX18yPVRoZSBmb2xsb3dpbmcgZmlsZSBleHRlbnNpb25zIGFyZSBtYXBwZWQgdG8gbWltZSB0eXBlczoKLVRoaXNfd2ViX2FwcGxpY2F0aW9uX3VzZXNfdGhlX2ZvbGxvd2luZ193ZWxjb21lX2FuZF9lcnJvcl9wYWdlc19fMj1UaGlzIHdlYiBhcHBsaWNhdGlvbiB1c2VzIHRoZSBmb2xsb3dpbmcgd2VsY29tZSBhbmQgZXJyb3IgcGFnZXM6Ci1UaGlzX3dlYl9hcHBsaWNhdGlvbl9yZWZlcmVuY2VzX3RoZV9mb2xsb3dpbmdfcmVzb3VyY2VzX18yPVRoaXMgd2ViIGFwcGxpY2F0aW9uIHJlZmVyZW5jZXMgdGhlIGZvbGxvd2luZyByZXNvdXJjZXM6Ci1UaGVfZm9sbG93aW5nX3NlY3VyaXR5X3JvbGVzX2FuZF9jb25zdHJhaW50c19hcmVfZGVmaW5lZF9mb3JfdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBzZWN1cml0eSByb2xlcyBhbmQgY29uc3RyYWludHMgYXJlIGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uOgotU2VydmxldHNfYW5kX0pTUHNfMT1TZXJ2bGV0cyBhbmQgSlNQcwotVGhlX2ZvbGxvd2luZ19zZXJ2bGV0c19hbmRfSlNQc19hcmVfdXNlZF9pbl90aGlzX2FwcGxpY2F0aW9uX18yPVRoZSBmb2xsb3dpbmcgc2VydmxldHMgYW5kIEpTUHMgYXJlIHVzZWQgaW4gdGhpcyBhcHBsaWNhdGlvbjoKLVVzYWdlXzE9VXNhZ2UKLVRoZV9mb2xsb3dpbmdfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnNfdXNlX3RoaXNfd2ViX21vZHVsZV9fMj1UaGUgZm9sbG93aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb25zIHVzZSB0aGlzIHdlYiBtb2R1bGU6Ci1FcnJvcl9QYWdlc18xPUVycm9yIFBhZ2VzCi1SZXNvdXJjZXNfaW5fdGhlX2ZvbGxvd2luZ19VUkxzX3dpbGxfYmVfYWNjZXNzZWRfaW5fcmVzcG9uc2VfdG9fSFRUUF9lcnJvcl9jb2Rlc19fMj1SZXNvdXJjZXMgaW4gdGhlIGZvbGxvd2luZyBVUkxzIHdpbGwgYmUgYWNjZXNzZWQgaW4gcmVzcG9uc2UgdG8gSFRUUCBlcnJvciBjb2RlczoKLV9FcnJvcl9Db2RlXzM9XCBFcnJvciBDb2RlCi1fVVJMXzQ9XCBVUkwKLUphdmFfRXhjZXB0aW9uX1R5cGVzXzI9SmF2YSBFeGNlcHRpb24gVHlwZXMKLVJlc291cmNlc19pbl90aGVfZm9sbG93aW5nX1VSTHNfd2lsbF9iZV9hY2Nlc3NlZF9pbl9yZXNwb25zZV90b19KYXZhX2V4Y2VwdGlvbl90eXBlc19fMz1SZXNvdXJjZXMgaW4gdGhlIGZvbGxvd2luZyBVUkxzIHdpbGwgYmUgYWNjZXNzZWQgaW4gcmVzcG9uc2UgdG8gSmF2YSBleGNlcHRpb24gdHlwZXM6Ci1fRXhjZXB0aW9uX1R5cGVfND1cIEV4Y2VwdGlvbiBUeXBlCi1fVVJMXzU9XCBVUkwKLUV4Y2VwdGlvbl9UeXBlX1NlbGVjdGlvbl85PUV4Y2VwdGlvbiBUeXBlIFNlbGVjdGlvbgotQ2hvb3NlX2FuX0V4Y2VwdGlvbl9UeXBlXzEwPUNob29zZSBhbiBFeGNlcHRpb24gVHlwZQotTG9naW5fMT1Mb2dpbgotVGhlX2ZvbGxvd2luZ19Mb2dpbl9jb25maWd1cmF0aW9uX3ZhbHVlc19hcmVfdXNlZF9mb3JfdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBMb2dpbiBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmUgdXNlZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb246Ci1SZWFsbV9uYW1lX18zPVJlYWxtIG5hbWU6Ci1BdXRoZW50aWNhdGlvbl9tZXRob2RfXzQ9QXV0aGVudGljYXRpb24gbWV0aG9kOgotTG9naW5fcGFnZV9fNT1Mb2dpbiBwYWdlOgotRXJyb3JfcGFnZV9fOD1FcnJvciBwYWdlOgotV2VsY29tZV9QYWdlc18xPVdlbGNvbWUgUGFnZXMKLVRoZV9zZXJ2ZXJfd2lsbF9zZWFyY2hfZm9yX3RoZV9mb2xsb3dpbmdfcGFnZXMsX2luX3RoaXNfb3JkZXIsX3doZW5fdGhlX3dlYl9hcHBsaWNhdGlvbl9pc19yZWZlcmVuY2VkX18yPVRoZSBzZXJ2ZXIgd2lsbCBzZWFyY2ggZm9yIHRoZSBmb2xsb3dpbmcgcGFnZXMsIGluIHRoaXMgb3JkZXIsIHdoZW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBpcyByZWZlcmVuY2VkOgotVGhlX2ZvbGxvd2luZ19jb250ZXh0X3BhcmFtZXRlcnNfYXJlX2luY2x1ZGVkX2luX3RoaXNfd2ViX2FwcGxpY2F0aW9uX18yPVRoZSBmb2xsb3dpbmcgY29udGV4dCBwYXJhbWV0ZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbjoKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX2NvbnRleHRfcGFyYW1ldGVyX18yPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIGNvbnRleHQgcGFyYW1ldGVyOgotVmFsdWVfXzM9VmFsdWU6Ci1Db250ZXh0X1BhcmFtX1ZhbHVlX2NoYW5nZV80PUNvbnRleHQgUGFyYW0gVmFsdWUgY2hhbmdlCi1XZWJTcGhlcmVfQmluZGluZ3NfMT1XZWJTcGhlcmUgQmluZGluZ3MKLUpORElfTmFtZV9fMj1KTkRJIE5hbWU6Ci1FamJfUmVmX0pORElfTmFtZV9jaGFuZ2VfMz1FamIgUmVmIEpOREkgTmFtZSBjaGFuZ2UKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX0VKQl9yZWZlcmVuY2VfMj1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBFSkIgcmVmZXJlbmNlCi1Ib21lX182PUhvbWU6Ci1SZW1vdGVfXzc9UmVtb3RlOgotRWpiX1JlZl9Ib21lX2NoYW5nZV84PUVqYiBSZWYgSG9tZSBjaGFuZ2UKLUVqYl9SZWZfUmVtb3RlX2NoYW5nZV85PUVqYiBSZWYgUmVtb3RlIGNoYW5nZQotRUpCX1JlZmVyZW5jZV9UeXBlX2NoYW5nZV8xMD1FSkIgUmVmZXJlbmNlIFR5cGUgY2hhbmdlCi1FSkJfUmVmZXJlbmNlc18xPUVKQiBSZWZlcmVuY2VzCi1UaGVfZm9sbG93aW5nX0VKQl9yZWZlcmVuY2VzX2FyZV91c2VkX2luX3RoaXNfd2ViX2FwcGxpY2F0aW9uX18yPVRoZSBmb2xsb3dpbmcgRUpCIHJlZmVyZW5jZXMgYXJlIHVzZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb246Ci1KTkRJX05hbWVfMz1KTkRJIE5hbWUKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX0pTUF90YWdfbGlicmFyeV8yPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIEpTUCB0YWcgbGlicmFyeQotVVJJX18zPVVSSToKLUxvY2F0aW9uX180PUxvY2F0aW9uOgotSlNQX3RhZ19saWJyYXJ5X2xvY2F0aW9uX2NoYW5nZV81PUpTUCB0YWcgbGlicmFyeSBsb2NhdGlvbiBjaGFuZ2UKLUpTUF90YWdfbGlicmFyeV9VUklfY2hhbmdlXzY9SlNQIHRhZyBsaWJyYXJ5IFVSSSBjaGFuZ2UKLUpTUF90YWdfbGlicmFyaWVzXzE9SlNQIHRhZyBsaWJyYXJpZXMKLVRoZV9mb2xsb3dpbmdfSlNQX3RhZ19saWJyYXJpZXNfYXJlX3VzZWRfaW5fdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBKU1AgdGFnIGxpYnJhcmllcyBhcmUgdXNlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbjoKLVJlc291cmNlX1JlZl9KTkRJX05hbWVfY2hhbmdlXzM9UmVzb3VyY2UgUmVmIEpOREkgTmFtZSBjaGFuZ2UKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX3Jlc291cmNlX3JlZmVyZW5jZV8yPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlIHJlZmVyZW5jZQotQXV0aGVudGljYXRpb25fXzQ9QXV0aGVudGljYXRpb246Ci1SZXNvdXJjZV9SZWZlcmVuY2VfVHlwZV9jaGFuZ2VfNz1SZXNvdXJjZSBSZWZlcmVuY2UgVHlwZSBjaGFuZ2UKLVJlc291cmNlX1JlZmVyZW5jZV9BdXRoZW50aWNhdGlvbl9jaGFuZ2VfMTA9UmVzb3VyY2UgUmVmZXJlbmNlIEF1dGhlbnRpY2F0aW9uIGNoYW5nZQotUmVzb3VyY2VfUmVmZXJlbmNlc18xPVJlc291cmNlIFJlZmVyZW5jZXMKLVRoZV9mb2xsb3dpbmdfcmVzb3VyY2VfcmVmZXJlbmNlc19hcmVfdXNlZF9pbl90aGlzX3dlYl9hcHBsaWNhdGlvbl9fMj1UaGUgZm9sbG93aW5nIHJlc291cmNlIHJlZmVyZW5jZXMgYXJlIHVzZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb246Ci0oTmV3X1Jlc291cmNlUmVmKV8zPShOZXcgUmVzb3VyY2VSZWYpCi1KTkRJX05hbWVfND1KTkRJIE5hbWUKLUF1dGhvcml6ZWRfUm9sZXNfMj1BdXRob3JpemVkIFJvbGVzCi1UaGVfZm9sbG93aW5nX3JvbGVzX2FyZV9hdXRob3JpemVkX3RvX2FjY2Vzc190aGVfd2ViX3Jlc291cmNlX2NvbGxlY3Rpb25zX2luX3RoaXNfc2VjdXJpdHlfY29uc3RyYWludF9fMz1UaGUgZm9sbG93aW5nIHJvbGVzIGFyZSBhdXRob3JpemVkIHRvIGFjY2VzcyB0aGUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zIGluIHRoaXMgc2VjdXJpdHkgY29uc3RyYWludDoKLVNlY3VyaXR5X0NvbnN0cmFpbnRzXzE9U2VjdXJpdHkgQ29uc3RyYWludHMKLVRoZXNlX2NvbnN0cmFpbnRzX3ByZXNjcmliZV9hY2Nlc3NfcG9saWNpZXNfZm9yX3NwZWNpZmljX3dlYl9yZXNvdXJjZXNfMj1UaGVzZSBjb25zdHJhaW50cyBwcmVzY3JpYmUgYWNjZXNzIHBvbGljaWVzIGZvciBzcGVjaWZpYyB3ZWIgcmVzb3VyY2VzCi1Vc2VyX0RhdGFfQ29uc3RyYWludF8xPVVzZXIgRGF0YSBDb25zdHJhaW50Ci1UaGVfZm9sbG93aW5nX2FyZV90aGVfdHJhbnNwb3J0X2d1YXJhbnRlZXNfcmVxdWlyZWRfYmV0d2Vlbl9jbGllbnRfYW5kX3NlcnZlcl9mb3JfdGhlX3NlY3VyaXR5X2NvbnN0cmFpbnRfXzI9VGhlIGZvbGxvd2luZyBhcmUgdGhlIHRyYW5zcG9ydCBndWFyYW50ZWVzIHJlcXVpcmVkIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgZm9yIHRoZSBzZWN1cml0eSBjb25zdHJhaW50OgotV2ViX1Jlc291cmNlX0NvbGxlY3Rpb25zXzE9V2ViIFJlc291cmNlIENvbGxlY3Rpb25zCi1UaGVfZm9sbG93aW5nX2RlZmluZV93ZWJfcmVzb3VyY2VzX2FuZF90aGVpcl9IVFRQX21ldGhvZF9mb3JfdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBkZWZpbmUgd2ViIHJlc291cmNlcyBhbmQgdGhlaXIgSFRUUCBtZXRob2QgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uOgotRGV0YWlsc19vZl90aGVfc2VsZWN0ZWRfc2VjdXJpdHlfcm9sZV9fMj1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBzZWN1cml0eSByb2xlOgotU2VjdXJpdHlfUm9sZXNfRGVzY3JpcHRpb25fY2hhbmdlXzU9U2VjdXJpdHkgUm9sZXMgRGVzY3JpcHRpb24gY2hhbmdlCi1TZWN1cml0eV9Sb2xlc18xPVNlY3VyaXR5IFJvbGVzCi1UaGVfZm9sbG93aW5nX3NlY3VyaXR5X3JvbGVzX2FyZV9kZWZpbmVkX2Zvcl90aGlzX3dlYl9hcHBsaWNhdGlvbl9fMj1UaGUgZm9sbG93aW5nIHNlY3VyaXR5IHJvbGVzIGFyZSBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbjoKLUF1dGhvcml6ZWRfcm9sZXNfMj1BdXRob3JpemVkIHJvbGVzCi1UaGVfZm9sbG93aW5nX3JvbGVzX2FyZV9hdXRob3JpemVkX3RvX2FjY2Vzc190aGlzX3NlcnZsZXRfXzM9VGhlIGZvbGxvd2luZyByb2xlcyBhcmUgYXV0aG9yaXplZCB0byBhY2Nlc3MgdGhpcyBzZXJ2bGV0OgotRGV0YWlsc19vZl90aGVfc2VsZWN0ZWRfc2VydmxldF9vcl9KU1BfMj1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBzZXJ2bGV0IG9yIEpTUAotU2VydmxldF9jbGFzc19fMz1TZXJ2bGV0IGNsYXNzOgotV2ViU3BoZXJlX0V4dGVuc2lvbnNfMz1XZWJTcGhlcmUgRXh0ZW5zaW9ucwotT3B0aW9uYWxfV2ViU3BoZXJlX3NwZWNpZmljX2V4dGVuc2lvbnNfdG9fdGhlX1dlYl9EZXBsb3ltZW50X0Rlc2NyaXB0b3JfND1PcHRpb25hbCBXZWJTcGhlcmUgc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byB0aGUgV2ViIERlcGxveW1lbnQgRGVzY3JpcHRvcgotVW5yZXNvbHZlZF9hY3Rpb25fXzU9VW5yZXNvbHZlZCBhY3Rpb246Ci1TZXJ2bGV0X0V4dGVuc2lvbl9DaGFuZ2VfNj1TZXJ2bGV0IEV4dGVuc2lvbiBDaGFuZ2UKLVRoZV9mb2xsb3dpbmdfaWNvbnNfcmVwcmVzZW50X3RoZV9zZWxlY3RlZF9zZXJ2bGV0X29yX0pTUF9fMz1UaGUgZm9sbG93aW5nIGljb25zIHJlcHJlc2VudCB0aGUgc2VsZWN0ZWQgc2VydmxldCBvciBKU1A6Ci1UaGVfZm9sbG93aW5nX1VSTHNfYXJlX21hcHBlZF90b190aGlzX3NlcnZsZXRfXzI9VGhlIGZvbGxvd2luZyBVUkxzIGFyZSBtYXBwZWQgdG8gdGhpcyBzZXJ2bGV0OgotVGhlX2ZvbGxvd2luZ19zZXJ2bGV0c19hbmRfSlNQc19hcmVfaW5jbHVkZWRfaW5fdGhpc193ZWJfYXBwbGljYXRpb25fXzI9VGhlIGZvbGxvd2luZyBzZXJ2bGV0cyBhbmQgSlNQcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb246Ci1UaGVfZmlsdGVyTmFtZV9wcm9wZXJ0eV8zPVRoZSBmaWx0ZXJOYW1lIHByb3BlcnR5Ci1UaGVfZmlsdGVyX3Byb3BlcnR5XzI9VGhlIGZpbHRlciBwcm9wZXJ0eQotVGhlX0xpc3RlbmVyQ2xhc3NfcHJvcGVydHlfMj1UaGUgTGlzdGVuZXJDbGFzcyBwcm9wZXJ0eQotRGV0YWlscy4uLj1EZXRhaWxzLi4uCi1Mb2FkX29uX3N0YXJ0dXBfNT1Mb2FkIG9uIHN0YXJ0dXAKLUxvYWRfb3JkZXJfXzY9TG9hZCBvcmRlcjoKLURlbGV0ZV9TZXJ2bGV0X0luaXRfUGFyYW1fNz1EZWxldGUgU2VydmxldCBJbml0IFBhcmFtCi0obmFtZSlfOD0obmFtZSkKLSh2YWx1ZSlfOT0odmFsdWUpCi1OZXdfSW5pdGlhbGl6YXRpb25fUGFyYW1ldGVyXzEwPU5ldyBJbml0aWFsaXphdGlvbiBQYXJhbWV0ZXIKLUZpbHRlcl9tYXBwaW5nX19fMT1GaWx0ZXIgbWFwcGluZzoKLVNlY3VyaXR5Q29uc3RyYWludF8xPVNlY3VyaXR5Q29uc3RyYWludAotVGhlX2ZvbGxvd2luZ19pbml0aWFsaXphdGlvbl9wYXJhbWV0ZXJzX2FyZV9jb25maWd1cmVkX2Zvcl90aGlzX3NlcnZsZXRfXzE9VGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGFyZSBjb25maWd1cmVkIGZvciB0aGlzIHNlcnZsZXQ6Ci1GaWx0ZXJfbWFwcGluZ190ZXh0PXswfSAtPiB7MX0KLUFkZF9vcl9SZW1vdmVfUmVzb3VyY2VfRW52aXJvbm1lbnRfUmVmZXJlbmNlXzE9QWRkIG9yIFJlbW92ZSBSZXNvdXJjZSBFbnZpcm9ubWVudCBSZWZlcmVuY2UKLU1JTUVfMT1NSU1FCi1NSU1FX01hcHBpbmdzXzI9TUlNRSBNYXBwaW5ncwotUmVzb3VyY2VfRW52aXJvbm1lbnRfMT1SZXNvdXJjZSBFbnZpcm9ubWVudAotQXV0b21hdGljX0ZpbHRlcl9Mb2FkaW5nX2VuYWJsZWRfMT1BdXRvbWF0aWMgRmlsdGVyIExvYWRpbmcgZW5hYmxlZAotQXV0b21hdGljX0ZpbHRlcl9Mb2FkaW5nX0VuYWJsZWRfQ2hhbmdlZF80PUF1dG9tYXRpYyBGaWx0ZXIgTG9hZGluZyBFbmFibGVkIENoYW5nZWQKLVRoZV9mb2xsb3dpbmdfc2VydmxldHNfaGF2ZV90aGlzX2ZpbHRlcl9tYXBwZWRfdG9fdGhlbV8xPVRoZSBmb2xsb3dpbmcgc2VydmxldHMgaGF2ZSB0aGlzIGZpbHRlciBtYXBwZWQgdG8gdGhlbQotVGhlX2ZvbGxvd2luZ19VUkxzX2hhdmVfdGhpc19maWx0ZXJfbWFwcGVkX3RvX3RoZW1fMT1UaGUgZm9sbG93aW5nIFVSTHMgaGF2ZSB0aGlzIGZpbHRlciBtYXBwZWQgdG8gdGhlbQotTUlNRV90eXBlX18xPU1JTUUgdHlwZToKLU1JTUVfVHlwZV9jaGFuZ2VfMj1NSU1FIFR5cGUgY2hhbmdlCi1UaGVfZm9sbG93aW5nX2ZpbGVfZXh0ZW5zaW9uc19hcmVfbWFwcGVkX3RvX01JTUVfdHlwZXNfMT1UaGUgZm9sbG93aW5nIGZpbGUgZXh0ZW5zaW9ucyBhcmUgbWFwcGVkIHRvIE1JTUUgdHlwZXMKLUxvY2F0aW9uXzE9XCBMb2NhdGlvbgotTGlua19fMT1MaW5rOgotRWpiX1JlZl9MaW5rX2NoYW5nZV8yPUVqYiBSZWYgTGluayBjaGFuZ2UKLVJlc291cmNlX0Vudl9SZWZfSk5ESV9OYW1lX2NoYW5nZV8xPVJlc291cmNlIEVudiBSZWYgSk5ESSBOYW1lIGNoYW5nZQotRGV0YWlsc19vZl90aGVfc2VsZWN0ZWRfcmVzb3VyY2VfZW52aXJvbm1lbnRfcmVmZXJlbmNlXzE9RGV0YWlscyBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlCi1UeXBlX1NlbGVjdGlvbl8yPVR5cGUgU2VsZWN0aW9uCi1DaG9vc2VfYV90eXBlXzM9Q2hvb3NlIGEgdHlwZQotUmVzb3VyY2VfRW52aXJvbm1lbnRfUmVmZXJlbmNlc18xPVJlc291cmNlIEVudmlyb25tZW50IFJlZmVyZW5jZXMKLVRoZV9mb2xsb3dpbmdfcmVzb3VyY2VfZW52aXJvbm1lbnRfcmVmZXJlbmNlc19hcmVfdXNlZF9pbl90aGlzX3dlYl9hcHBsaWNhdGlvbl8yPVRoZSBmb2xsb3dpbmcgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlcyBhcmUgdXNlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbgotTmV3X1Jlc291cmNlRW52UmVmXzM9TmV3IFJlc291cmNlRW52UmVmCi1BZGRfU2VydmxldF9FeHRlbnNpb25fMT1BZGQgU2VydmxldCBFeHRlbnNpb24KLV9FUlJPUl9Qcm9ibGVtc19vcGVuaW5nX2VkaXRvcl8zPUlXQUUwMDI2RSBQcm9ibGVtcyBvcGVuaW5nIGVkaXRvcgotX0VSUk9SX0pTUF9maWxlX2RvZXNfbm90X2V4aXN0XzQ9SVdBRTAwMjdFIEpTUCBmaWxlIGRvZXMgbm90IGV4aXN0Ci1fRVJST1JfUHJvYmxlbXNfb3BlbmluZ19lZGl0b3JfNT1JV0FFMDAyOEUgUHJvYmxlbXMgb3BlbmluZyBlZGl0b3IKLV9FUlJPUl9Db3VsZF9ub3RfZmluZF90eXBlX3dpdGhpbl9wcm9qZWN0XzY9SVdBRTAwMjlFIENvdWxkIG5vdCBmaW5kIHR5cGUgd2l0aGluIHByb2plY3QKLV9FUlJPUl9Qcm9ibGVtc19vcGVuaW5nX2VkaXRvcl83PUlXQUUwMDMwRSBQcm9ibGVtcyBvcGVuaW5nIGVkaXRvcgotX0VSUk9SX1Byb2JsZW1zX29wZW5pbmdfZWRpdG9yXzg9SVdBRTAwMzFFIFByb2JsZW1zIG9wZW5pbmcgZWRpdG9yCi1BZGRfVmFyaWFibGVfMT1BZGQgVmFyaWFibGUKLUVkaXRfVmFyaWFibGVfMj1FZGl0IFZhcmlhYmxlCi1EZWZpbmVfYV9uZXdfdmFyaWFibGVfaW5fdGhpc19zZXJ2bGV0X2NhY2hpbmdfY29uZmlndXJhdGlvbl8xPURlZmluZSBhIG5ldyB2YXJpYWJsZSBpbiB0aGlzIHNlcnZsZXQgY2FjaGluZyBjb25maWd1cmF0aW9uCi1WYXJpYWJsZV8yPVZhcmlhYmxlCi1JRF9fMz1JRDoKLVR5cGVfXzQ9VHlwZToKLU1ldGhvZF9fNT1NZXRob2Q6Ci1EYXRhX0lEX182PURhdGEgSUQ6Ci1JbnZhbGlkX0lEX183PUludmFsaWQgSUQ6Ci1SZXF1aXJlZF84PVJlcXVpcmVkCi1BZGRfRXh0ZXJuYWxfQ2FjaGVfR3JvdXBfMT1BZGQgRXh0ZXJuYWwgQ2FjaGUgR3JvdXAKLUFkZF9hbl9leHRlcm5hbF9jYWNoZV9ncm91cF90b190aGlzX3NlcnZsZXRfY2FjaGluZ19jb25maWd1cmF0aW9uXzE9QWRkIGFuIGV4dGVybmFsIGNhY2hlIGdyb3VwIHRvIHRoaXMgc2VydmxldCBjYWNoaW5nIGNvbmZpZ3VyYXRpb24KLUV4dGVybmFsX0NhY2hlX0dyb3VwXzI9RXh0ZXJuYWwgQ2FjaGUgR3JvdXAKLUdyb3VwX05hbWVfXzM9R3JvdXAgTmFtZToKLUdyb3VwX05hbWVfaXNfZW1wdHlfNT1Hcm91cCBOYW1lIGlzIGVtcHR5Ci1DYWNoaW5nX2dyb3VwX25hbWVfaXNfZW1wdHlfMj1DYWNoaW5nIGdyb3VwIG5hbWUgaXMgZW1wdHkKLVByaW9yaXR5X211c3RfYmVfYW5faW50ZWdlcl8zPVByaW9yaXR5IG11c3QgYmUgYW4gaW50ZWdlcgotVGltZW91dF9tdXN0X2JlX2FuX2ludGVnZXJfND1UaW1lb3V0IG11c3QgYmUgYW4gaW50ZWdlcgotRGVmaW5lX2FfbmV3X3NlcnZsZXRfY2FjaGluZ19jb25maWd1cmF0aW9uXzE9RGVmaW5lIGEgbmV3IHNlcnZsZXQgY2FjaGluZyBjb25maWd1cmF0aW9uCi1TZXJ2bGV0X0NhY2hpbmdfQ29uZmlndXJhdGlvbl8yPVNlcnZsZXQgQ2FjaGluZyBDb25maWd1cmF0aW9uCi1UaGVfRGVmYXVsdFBhZ2VfcHJvcGVydHlfMj1UaGUgRGVmYXVsdFBhZ2UgcHJvcGVydHkKLVRoZV9FcnJvclBhZ2VfcHJvcGVydHlfND1UaGUgRXJyb3JQYWdlIHByb3BlcnR5Ci1UaGVfTWltZVR5cGVfcHJvcGVydHlfNj1UaGUgTWltZVR5cGUgcHJvcGVydHkKLVRoZV9OYW1lX3Byb3BlcnR5Xzg9VGhlIE5hbWUgcHJvcGVydHkKLVRoZV9QYWdlc19wcm9wZXJ0eV8xMD1UaGUgUGFnZXMgcHJvcGVydHkKLVRoZV9FeHRlbmRlZFNlcnZsZXRfcHJvcGVydHlfMj1UaGUgRXh0ZW5kZWRTZXJ2bGV0IHByb3BlcnR5Ci1UaGVfTG9jYWxUcmFuc2FjdGlvbl9wcm9wZXJ0eV80PVRoZSBMb2NhbFRyYW5zYWN0aW9uIHByb3BlcnR5Ci1UaGVfTWFya3VwTGFuZ3VhZ2VfcHJvcGVydHlfNj1UaGUgTWFya3VwTGFuZ3VhZ2UgcHJvcGVydHkKLURlZmluZV9BdXRob3JpemF0aW9uX0NvbnN0cmFpbnRfMT1EZWZpbmUgQXV0aG9yaXphdGlvbiBDb25zdHJhaW50Ci1DaG9vc2VfYV9zZXJ2bGV0X18xPUNob29zZSBhIHNlcnZsZXQ6Ci1DaG9vc2VfYV9zZXJ2bGV0X18yPUNob29zZSBhIFNlcnZsZXQ6Ci1NYXRjaGluZ19zZXJ2bGV0c19fMj1NYXRjaGluZyBzZXJ2bGV0czoKLUNob29zZV9hX2ZpbHRlcl9fMT1DaG9vc2UgYSBmaWx0ZXI6Ci1NYXRjaGluZ19maWx0ZXJzX18yPU1hdGNoaW5nIGZpbHRlcnM6Ci1RdWFsaWZpZXJfXzM9UXVhbGlmaWVyOgotQWRkX29yX1JlbW92ZV9FSkJfTG9jYWxfUmVmZXJlbmNlXzE9QWRkIG9yIFJlbW92ZSBFSkIgTG9jYWwgUmVmZXJlbmNlCi1BZGRfb3JfUmVtb3ZlX01hcmt1cF9MYW5ndWFnZV8yPUFkZCBvciBSZW1vdmUgTWFya3VwIExhbmd1YWdlCi1DbG9zZV9lZGl0b3JfMz1DbG9zZSBlZGl0b3IKLUZpbGVfaGFzX2JlZW5fZGVsZXRlZF9mcm9tX3RoZV9maWxlX3N5c3RlbS5fbldoYXRfd291bGRfeW91X2xpa2VfdG9fZG9fXzQ9RmlsZSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLlxuV2hhdCB3b3VsZCB5b3UgbGlrZSB0byBkbz8KLVNhdmVfYW5kX2Nsb3NlX2VkaXRvcl81PVNhdmUgYW5kIGNsb3NlIGVkaXRvcgotQ2xvc2VfZWRpdG9yXzY9Q2xvc2UgZWRpdG9yCi1UaGlzX3dlYi54bWxfZmlsZV9pc19ub3RfYV92YWxpZF9EZXBsb3ltZW50X0Rlc2NyaXB0b3JfZm9yX2FfV2ViX0FyY2hpdmUsX2hlbmNlX3RoZV9YTUxfZWRpdG9yX3dpbGxfYmVfb3BlbmVkXzc9VGhpcyB3ZWIueG1sIGZpbGUgaXMgbm90IGEgdmFsaWQgRGVwbG95bWVudCBEZXNjcmlwdG9yIGZvciBhIFdlYiBBcmNoaXZlLCBoZW5jZSB0aGUgWE1MIGVkaXRvciB3aWxsIGJlIG9wZW5lZC4KLUVKQl8xPUVKQgotRUpCX0xvY2FsXzI9RUpCIExvY2FsCi1SZXNvdXJjZV8zPVJlc291cmNlCi1SZXNvdXJjZV9FbnZpcm9ubWVudF8xXzQ9UmVzb3VyY2VfRW52aXJvbm1lbnRfMQotSlNQX3RhZ19saWJyYXJpZXNfNV81PUpTUF90YWdfbGlicmFyaWVzXzUKLUNob29zZV9hX2ZpbHRlcl9fMT1DaG9vc2UgYSBmaWx0ZXI6Ci1NYXRjaGluZ19maWx0ZXJzX18yPU1hdGNoaW5nIGZpbHRlcnM6Ci1DaG9vc2VfYV9saXN0ZW5lcl9fMT1DaG9vc2UgYSBsaXN0ZW5lcjoKLU1hdGNoaW5nX2xpc3RlbmVyX18yPU1hdGNoaW5nIGxpc3RlbmVyOgotUHJvYmxlbXNfb3BlbmluZ19lZGl0b3JfMj1Qcm9ibGVtcyBvcGVuaW5nIGVkaXRvcgotYXBwbGljYXRpb24ueG1sX2RvZXNfbm90X2V4aXN0XzM9YXBwbGljYXRpb24ueG1sIGRvZXMgbm90IGV4aXN0Ci1SZWZyZXNoXzQ9UmVmcmVzaAotRGV0YWlsc19vZl90aGVfc2VsZWN0ZWRfRUpCX0xvY2FsX3JlZmVyZW5jZV8xPURldGFpbHMgb2YgdGhlIHNlbGVjdGVkIEVKQiBMb2NhbCByZWZlcmVuY2UKLUxvY2FsX2hvbWVfXzI9TG9jYWwgaG9tZToKLUxvY2FsX18zPUxvY2FsOgotRUpCX0xvY2FsX1JlZmVyZW5jZXNfMT1FSkIgTG9jYWwgUmVmZXJlbmNlcwotVGhlX2ZvbGxvd2luZ19FSkJfbG9jYWxfcmVmZXJlbmNlc19hcmVfdXNlZF9pbl90aGlzX3dlYl9hcHBsaWNhdGlvbl8yPVRoZSBmb2xsb3dpbmcgRUpCIGxvY2FsIHJlZmVyZW5jZXMgYXJlIHVzZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24KLShOZXdfRUpCX0xvY2FsX1JlZilfMz0oTmV3IEVKQiBMb2NhbCBSZWYpCi0oTmV3X1Jlc291cmNlRW52UmVmKV8xPShOZXcgUmVzb3VyY2VFbnZSZWYpCi1EZXNjcmlwdGlvbl9fMj1EZXNjcmlwdGlvbjoKLURlc2NyaXB0aW9uX2NoYW5nZV8zPURlc2NyaXB0aW9uIGNoYW5nZQotRGV0YWlsc19vZl90aGVfU2VydmxldF9FeHRlbnNpb25fb2ZfdGhlX3NlbGVjdGVkX3NlcnZsZXRfMT1EZXRhaWxzIG9mIHRoZSBTZXJ2bGV0IEV4dGVuc2lvbiBvZiB0aGUgc2VsZWN0ZWQgc2VydmxldAotTWFya3VwX0xhbmd1YWdlc18yPU1hcmt1cCBMYW5ndWFnZXMKLUxvY2FsX1RyYW5zYWN0aW9uXzM9TG9jYWwgVHJhbnNhY3Rpb24KLURlbGV0ZV9GaWx0ZXJfTWFwcGluZ18xPURlbGV0ZSBGaWx0ZXIgTWFwcGluZwotQWRkX0ZpbHRlcl9NYXBwaW5nc18yPUFkZCBGaWx0ZXIgTWFwcGluZ3MKLUNob29zZV9hX0pTUF9fMT1DaG9vc2UgYSBKU1A6Ci1OYW1lX18yPU5hbWU6Ci1NSU1FX3R5cGVfXzM9TUlNRSB0eXBlOgotRXJyb3JfcGFnZV9fND1FcnJvciBwYWdlOgotQnJvd3NlXzU9QnJvd3NlCi1EZWZhdWx0X3BhZ2VfXzY9RGVmYXVsdCBwYWdlOgotQnJvd3NlXzc9QnJvd3NlCi1QYWdlc19fOD1QYWdlczoKLV9OYW1lXzk9XCBOYW1lCi1fVVJJXzEwPVwgVVJJCi0oTmFtZSlfMTE9KE5hbWUpCi0oVVJJKV8xMj0oVVJJKQotTmFtZV9pc19lbXB0eV8xMz1OYW1lIGlzIGVtcHR5Ci1NSU1FX2lzX2VtcHR5XzE0PU1JTUUgaXMgZW1wdHkKLURlZmluZV9hX25ld19tYXJrdXBfbGFuZ3VhZ2VfZW50cnlfMT1EZWZpbmUgYSBuZXcgbWFya3VwIGxhbmd1YWdlIGVudHJ5Ci1NYXJrdXBfTGFuZ3VhZ2VfMj1NYXJrdXAgTGFuZ3VhZ2UKLUNob29zZV9hX1BhZ2VfMT1DaG9vc2UgYSBQYWdlCi1EZXNjcmlwdGlvbl9fMT1EZXNjcmlwdGlvbjoKLUVudmlyb25tZW50X3ZhcmlhYmxlX3ZhbHVlX2NoYW5nZV8xPUVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlIGNoYW5nZQotRW52aXJvbm1lbnRfdmFyaWFibGVfZGVzY3JpcHRpb25fY2hhbmdlXzI9RW52aXJvbm1lbnQgdmFyaWFibGUgZGVzY3JpcHRpb24gY2hhbmdlCi1EZXNjcmlwdGlvbl9uYW1lX2NoYW5nZV8yPURlc2NyaXB0aW9uIG5hbWUgY2hhbmdlCi1Db250ZXh0X1BhcmFtX0Rlc2NyaXB0aW9uX2NoYW5nZV8xPUNvbnRleHQgUGFyYW0gRGVzY3JpcHRpb24gY2hhbmdlCi1FamJfUmVmX0Rlc2NyaXB0aW9uX2NoYW5nZV8xPUVqYiBSZWYgRGVzY3JpcHRpb24gY2hhbmdlCi1SZXNvdXJjZV9FbnZpcm9ubWVudF9SZWZfRGVzY3JpcHRpb25fY2hhbmdlXzE9UmVzb3VyY2UgRW52aXJvbm1lbnQgUmVmIERlc2NyaXB0aW9uIGNoYW5nZQotUmVzb3VyY2VfUmVmX0Rlc2NyaXB0aW9uX2NoYW5nZV8xPVJlc291cmNlIFJlZiBEZXNjcmlwdGlvbiBjaGFuZ2UKLURldGFpbHNfb2ZfdGhlX3NlbGVjdGVkX3NlY3VyaXR5X2NvbnN0cmFpbnRfMT1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBzZWN1cml0eSBjb25zdHJhaW50Ci1EaXNwbGF5X05hbWVfXzI9RGlzcGxheSBOYW1lOgotU2VjdXJpdHlfQ29uc3RyYWludF9EaXNwbGF5TmFtZV9jaGFuZ2VfMz1TZWN1cml0eSBDb25zdHJhaW50IERpc3BsYXlOYW1lIGNoYW5nZQotRW1wdHlfTGlzdF8yPUVtcHR5IExpc3QKLV9VSV9TZWxlY3RfYV90YWdfbGlicmFyeV90b19hZGRfdG9fdGhlX2RlcGxveW1lbnRfZGVzY3JpcHRvcl8xPVNlbGVjdCBhIHRhZyBsaWJyYXJ5IHRvIGFkZCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1fVUlfQWRkX2FfVGFnX0xpYnJhcnlfMj1BZGQgYSBUYWcgTGlicmFyeQotX1VJX1RhZ19MaWJyYXJpZXNfXzM9VGFnIExpYnJhcmllczoKLV9VSV9BdmFpbGFibGVfQ3VzdG9tX1RhZ3NfXzQ9QXZhaWxhYmxlIEN1c3RvbSBUYWdzOgotX1VJX19UYWdfNT1cIFRhZwotX1VJX19EZXNjcmlwdGlvbl82PVwgRGVzY3JpcHRpb24KLV9VSV9VUklfXzc9VVJJOgotX1VJX1NlbGVjdF9hX1RhZ19MaWJyYXJ5Xzg9U2VsZWN0IGEgVGFnIExpYnJhcnkKLV9VSV9VUklfY2Fubm90X2JlX2VtcHR5XzEwPVVSSSBjYW5ub3QgYmUgZW1wdHkKLUJyb3dzZS4uLl8xPUJyb3dzZS4uLgotQnJvd3NlLi4uXzM9QnJvd3NlLi4uCi1Ccm93c2UuLi5fND1Ccm93c2UuLi4KLVJlbW92ZV9MaW5rXzc9UmVtb3ZlIExpbmsKLUhvbWVfaW50ZXJmYWNlX3NlbGVjdGlvbl84PUhvbWUgaW50ZXJmYWNlIHNlbGVjdGlvbgotTG9jYWxfaW50ZXJmYWNlX3NlbGVjdGlvbl8xMz1Mb2NhbCBpbnRlcmZhY2Ugc2VsZWN0aW9uCi1DaG9vc2VfYW5faW50ZXJmYWNlXzE2PUNob29zZSBhbiBpbnRlcmZhY2UKLU1hdGNoaW5nX2ludGVyZmFjZXNfXzE3PU1hdGNoaW5nIGludGVyZmFjZXM6Ci1TZXRfRUpCX0xvY2FsX1JlZl9MaW5rXzE4PVNldCBFSkIgTG9jYWwgUmVmIExpbmsKLVJlbW92ZV9FSkJfTG9jYWxfUmVmX0xpbmtfMTk9UmVtb3ZlIEVKQiBMb2NhbCBSZWYgTGluawotRUpCX3NlbGVjdGlvbl8zPUVKQiBzZWxlY3Rpb24KLUNob29zZV9hbl9FSkJfND1DaG9vc2UgYW4gRUpCCi1NYXRjaGluZ19FSkJzX181PU1hdGNoaW5nIEVKQnM6Ci1Mb2NhdGlvbl9fNj1Mb2NhdGlvbjoKLUVtcHR5X0xpc3RfMTE9RW1wdHkgTGlzdAotU2V0X0VKQl9SZWZfTGlua184PVNldCBFSkIgUmVmIExpbmsKLVJlbW92ZV9FSkJfUmVmX0xpbmtfOT1SZW1vdmUgRUpCIFJlZiBMaW5rCi1Ib21lX2ludGVyZmFjZV9zZWxlY3Rpb25fMTE9SG9tZSBpbnRlcmZhY2Ugc2VsZWN0aW9uCi1SZW1vdGVfaW50ZXJmYWNlX3NlbGVjdGlvbl8xND1SZW1vdGUgaW50ZXJmYWNlIHNlbGVjdGlvbgotQ2hvb3NlX2FuX2ludGVyZmFjZV8xNz1DaG9vc2UgYW4gaW50ZXJmYWNlCi1NYXRjaGluZ19pbnRlcmZhY2VzX18xOD1NYXRjaGluZyBpbnRlcmZhY2VzOgotU3BlY2lmeV9hbl9FcnJvcl9Db2RlX2FuZF9Mb2NhdGlvbl8xPVNwZWNpZnkgYW4gRXJyb3IgQ29kZSBhbmQgTG9jYXRpb24KLVNwZWNpZnlfYW5fRXhjZXB0aW9uX1R5cGVfYW5kX0xvY2F0aW9uXzI9U3BlY2lmeSBhbiBFeGNlcHRpb24gVHlwZSBhbmQgTG9jYXRpb24KLUFkZF9hbl9FcnJvcl9QYWdlXzM9QWRkIGFuIEVycm9yIFBhZ2UKLUVycm9yX0NvZGVfXzQ9RXJyb3IgQ29kZToKLUV4Y2VwdGlvbl9UeXBlX181PUV4Y2VwdGlvbiBUeXBlOgotU2VsZWN0Li4uXzY9U2VsZWN0Li4uCi1Ccm93c2UuLi5fNz1Ccm93c2UuLi4KLUxvY2F0aW9uX184PUxvY2F0aW9uOgotQnJvd3NlLi4uXzk9QnJvd3NlLi4uCi1FcnJvcl9Db2RlX2lzX2VtcHR5XzEzPUVycm9yIENvZGUgaXMgZW1wdHkKLUV4Y2VwdGlvbl9UeXBlX2lzX2VtcHR5XzE0PUV4Y2VwdGlvbiBUeXBlIGlzIGVtcHR5Ci1Mb2NhdGlvbl9pc19lbXB0eV8xNj1Mb2NhdGlvbiBpcyBlbXB0eQotTG9jYXRpb25fMTg9TG9jYXRpb24KLVNlbGVjdF9hX1BhZ2VfMTk9U2VsZWN0IGEgUGFnZQotQWRkX2FfcGFnZV90b190aGlzX21hcmt1cF9sYW5ndWFnZV8xPUFkZCBhIHBhZ2UgdG8gdGhpcyBtYXJrdXAgbGFuZ3VhZ2UKLVBhZ2VfMj1QYWdlCi1OYW1lX18zPU5hbWU6Ci1VUklfXzQ9VVJJOgotTmFtZV9pc19lbXB0eV84PU5hbWUgaXMgZW1wdHkKLVVSSV9pc19lbXB0eV8xMD1VUkkgaXMgZW1wdHkKLURldGFpbHNfb2ZfdGhlX1NlcnZsZXRfRXh0ZW5zaW9uX2Zvcl90aGVfc2VsZWN0ZWRfc2VydmxldF8xPURldGFpbHMgb2YgdGhlIFNlcnZsZXQgRXh0ZW5zaW9uIGZvciB0aGUgc2VsZWN0ZWQgc2VydmxldAotRGVsZXRlX01hcmt1cF9MYW5ndWFnZV83PURlbGV0ZSBNYXJrdXAgTGFuZ3VhZ2UKLUFkZF9NYXJrdXBfTGFuZ3VhZ2VfZW50cnlfOD1BZGQgTWFya3VwIExhbmd1YWdlIGVudHJ5Ci1FZGl0X01hcmt1cF9MYW5ndWFnZV9lbnRyeV85PUVkaXQgTWFya3VwIExhbmd1YWdlIGVudHJ5Ci1UaGVfbmFtZV9wcm9wZXJ0eV8xPVRoZSBuYW1lIHByb3BlcnR5Ci1UaGVfVVJJX3Byb3BlcnR5XzI9VGhlIFVSSSBwcm9wZXJ0eQotRW1wdHlfTGlzdF8xPUVtcHR5IExpc3QKLVdlYl9MaWJyYXJ5X1Byb2plY3RzXzE9V2ViIExpYnJhcnkgUHJvamVjdHMKLVRoZV9mb2xsb3dpbmdfSkFSc19hcmVfbWFwcGVkX3RvX0phdmFfcHJvamVjdHNfXzI9VGhlIGZvbGxvd2luZyBKQVJzIGFyZSBtYXBwZWQgdG8gSmF2YSBwcm9qZWN0czoKLV9KQVJfTmFtZV8zPVwgSkFSIE5hbWUKLV9KYXZhX1Byb2plY3RfND1cIEphdmEgUHJvamVjdAotRXJyb3JfNT1FcnJvcgotQWRkX1BhZ2VfMT1BZGQgUGFnZQotVXBfMT1VcAotRG93bl8yPURvd24KLVJlc291cmNlX1JlZmVyZW5jZV9TaGFyZWFibGVfY2hhbmdlXzM9UmVzb3VyY2UgUmVmZXJlbmNlIFNoYXJlYWJsZSBjaGFuZ2UKLUVudmlyb25tZW50X3ZhcmlhYmxlX3R5cGVfY2hhbmdlXzE9RW52aXJvbm1lbnQgdmFyaWFibGUgdHlwZSBjaGFuZ2UKLVdlYlNwaGVyZV9FeHRlbnNpb25zXzE9V2ViU3BoZXJlIEV4dGVuc2lvbnMKLUJyb3dzZS4uLl8yPUJyb3dzZS4uLgotUmVtb3ZlX1BhZ2VfMz1SZW1vdmUgUGFnZQotVGFnX0xpYnJhcnlfMT1UYWcgTGlicmFyeQotQ3JlYXRlX1BhZ2VfMT1DcmVhdGUgUGFnZQotQ3JlYXRlX01hcmt1cExhbmd1YWdlXzE9Q3JlYXRlIE1hcmt1cExhbmd1YWdlCi1BZGRfb3JfUmVtb3ZlX1NlcnZsZXRfRXh0ZW5zaW9uXzE9QWRkIG9yIFJlbW92ZSBTZXJ2bGV0IEV4dGVuc2lvbgotX0lORk9fTm9fc2VjdXJpdHlfcm9sZXNfZXhpc3QuXzE9SVdBRTAwMzJJIE5vIHNlY3VyaXR5IHJvbGVzIGV4aXN0LgotX0lORk9fTm9fRW50ZXJwcmlzZV9CZWFuc193aGljaF9pbXBsZW1lbnRfdGhlX3JlbW90ZV9pbnRlcmZhY2VfZXhpc3QuXzE9SVdBRTAwMzNJIE5vIEVudGVycHJpc2UgQmVhbnMgd2hpY2ggaW1wbGVtZW50IHRoZSByZW1vdGUgaW50ZXJmYWNlIGV4aXN0LgotX0lORk9fTm9fRW50ZXJwcmlzZV9CZWFuc193aGljaF9pbXBsZW1lbnRfdGhlX2xvY2FsX2ludGVyZmFjZV9leGlzdC5fMj1JV0FFMDAzNEkgTm8gRW50ZXJwcmlzZSBCZWFucyB3aGljaCBpbXBsZW1lbnQgdGhlIGxvY2FsIGludGVyZmFjZSBleGlzdC4KLV9JTkZPX05vX3NlcnZsZXRzX2V4aXN0X3RvX2FkZC5fMT1JV0FFMDAzNUkgTm8gc2VydmxldHMgZXhpc3QgdG8gYWRkLgotX0lORk9fTm9fY2xhc3Nlc193aGljaF9pbXBsZW1lbnRfamF2YXguc2VydmxldC5GaWx0ZXJfZXhpc3QuXzE9SVdBRTAwMzdJIE5vIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IGphdmF4LnNlcnZsZXQuRmlsdGVyIGV4aXN0LgotX0lORk9fTm9fZmlsdGVyc19leGlzdF90b19hZGQuXzE9SVdBRTAwMzhJIE5vIGZpbHRlcnMgZXhpc3QgdG8gYWRkLgotX0lORk9fTm9fbGlzdGVuZXJzX2V4aXN0X3RvX2FkZC5fMT1JV0FFMDAzOUkgTm8gbGlzdGVuZXJzIGV4aXN0IHRvIGFkZC4KLV9FUlJPUl9FcnJvcl91cGRhdGluZ19XZWJfUHJvcGVydGllc18xPUlXQUUwMDQwRSBFcnJvciB1cGRhdGluZyBXZWIgUHJvcGVydGllcwotX0lORk9fTm9faG9tZV9pbnRlcmZhY2VzX2V4aXN0Ll8xPUlXQUUwMDQxSSBObyBob21lIGludGVyZmFjZXMgZXhpc3QuCi1fSU5GT19Ob19sb2NhbF9pbnRlcmZhY2VzX2V4aXN0Ll8yPUlXQUUwMDQySSBObyBsb2NhbCBpbnRlcmZhY2VzIGV4aXN0LgotX0lORk9fTm9fcmVtb3RlX2ludGVyZmFjZXNfZXhpc3QuXzI9SVdBRTAwNDNJIE5vIHJlbW90ZSBpbnRlcmZhY2VzIGV4aXN0LgotX0lORk9fTm9fdGFnX2xpYnJhcmllc19leGlzdF90b19hZGQuXzE9SVdBRTAwNDRJIE5vIHRhZyBsaWJyYXJpZXMgZXhpc3QgdG8gYWRkLgotX0lORk9fTm9fZXhjZXB0aW9uc19leGlzdF90b19hZGQuXzE9SVdBRTAwNDVJIE5vIGV4Y2VwdGlvbnMgZXhpc3QgdG8gYWRkLgotQWRkX1Jlc291cmNlX1JlZmVyZW5jZV9FeHRlbnNpb25fMz1BZGQgUmVzb3VyY2UgUmVmZXJlbmNlIEV4dGVuc2lvbgotVmlydHVhbF9Ib3N0X05hbWVfXzE9VmlydHVhbCBIb3N0IE5hbWU6Ci1Db25uZWN0aW9uX21hbmFnZW1lbnRfXzE9Q29ubmVjdGlvbiBtYW5hZ2VtZW50OgotSXNvbGF0aW9uX2xldmVsX18yPUlzb2xhdGlvbiBsZXZlbDoKLV9NYXJrdXBfTGFuZ3VhZ2VfMT1cIE1hcmt1cCBMYW5ndWFnZQotX01pbWVfVHlwZV8yPVwgTWltZSBUeXBlCi1Cb3VuZGFyeV9fMz1Cb3VuZGFyeToKLVJlc29sdmVyX180PVJlc29sdmVyOgotVW5yZXNvbHZlZF9BY3Rpb25fXzU9VW5yZXNvbHZlZCBBY3Rpb246Ci1TZWxlY3RfYW5fRXJyb3JfQ29kZV8xPVNlbGVjdCBhbiBFcnJvciBDb2RlCi1Db2RlXzI9Q29kZQotRGVzY3JpcHRpb25fMz1EZXNjcmlwdGlvbgotKl9kZW5vdGVzX2Vycm9yX2NvZGVfbmV3X3RvX0hUVFBfMS4xXzQ9KiBkZW5vdGVzIGVycm9yIGNvZGUgbmV3IHRvIEhUVFAgMS4xCi1Db250aW51ZSpfNj1Db250aW51ZSoKLVN3aXRjaGluZ19Qcm90b2NvbHMqXzg9U3dpdGNoaW5nIFByb3RvY29scyoKLU9LXzEwPU9LCi1DcmVhdGVkXzEyPUNyZWF0ZWQKLUFjY2VwdGVkXzE0PUFjY2VwdGVkCi1Ob24tQXV0aG9yaXRhdGl2ZV9JbmZvcm1hdGlvbipfMTY9Tm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24qCi1Ob19Db250ZW50XzE4PU5vIENvbnRlbnQKLVJlc2V0X0NvbnRlbnQqXzIwPVJlc2V0IENvbnRlbnQqCi1QYXJ0aWFsX0NvbnRlbnQqXzIyPVBhcnRpYWwgQ29udGVudCoKLU11bHRpcGxlX0Nob2ljZXNfMjQ9TXVsdGlwbGUgQ2hvaWNlcwotTW92ZWRfUGVybWFuZW50bHlfMjY9TW92ZWQgUGVybWFuZW50bHkKLUZvdW5kXzI4PUZvdW5kCi1TZWVfT3RoZXIqXzMwPVNlZSBPdGhlcioKLU5vdF9Nb2RpZmllZF8zMj1Ob3QgTW9kaWZpZWQKLVVzZV9Qcm94eSpfMzQ9VXNlIFByb3h5KgotVGVtcG9yYXJ5X1JlZGlyZWN0Kl8zNj1UZW1wb3JhcnkgUmVkaXJlY3QqCi1CYWRfUmVxdWVzdF8zOD1CYWQgUmVxdWVzdAotVW5hdXRob3JpemVkXzQwPVVuYXV0aG9yaXplZAotRm9yYmlkZGVuXzQyPUZvcmJpZGRlbgotTm90X0ZvdW5kXzQ0PU5vdCBGb3VuZAotTWV0aG9kX05vdF9BbGxvd2VkKl80Nj1NZXRob2QgTm90IEFsbG93ZWQqCi1Ob3RfQWNjZXB0YWJsZSpfNDg9Tm90IEFjY2VwdGFibGUqCi1Qcm94eV9BdXRoZW50aWNhdGlvbl9SZXF1aXJlZCpfNTA9UHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQqCi1SZXF1ZXN0X1RpbWVvdXQqXzUyPVJlcXVlc3QgVGltZW91dCoKLUNvbmZsaWN0Kl81ND1Db25mbGljdCoKLUdvbmUqXzU2PUdvbmUqCi1MZW5ndGhfUmVxdWlyZWQqXzU4PUxlbmd0aCBSZXF1aXJlZCoKLVByZWNvbmRpdGlvbl9GYWlsZWQqXzYwPVByZWNvbmRpdGlvbiBGYWlsZWQqCi1SZXF1ZXN0X0VudGl0eV9Ub29fTGFyZ2UqXzYyPVJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZSoKLVJlcXVlc3RfVVJJX1Rvb19Mb25nKl82ND1SZXF1ZXN0IFVSSSBUb28gTG9uZyoKLVVuc3VwcG9ydGVkX01lZGlhX1R5cGUqXzY2PVVuc3VwcG9ydGVkIE1lZGlhIFR5cGUqCi1SZXF1ZXN0ZWRfUmFuZ2VfTm90X1NhdGlzZmlhYmxlKl82OD1SZXF1ZXN0ZWQgUmFuZ2UgTm90IFNhdGlzZmlhYmxlKgotRXhwZWN0YXRpb25fRmFpbGVkKl83MD1FeHBlY3RhdGlvbiBGYWlsZWQqCi1JbnRlcm5hbF9TZXJ2ZXJfRXJyb3JfNzI9SW50ZXJuYWwgU2VydmVyIEVycm9yCi1Ob3RfSW1wbGVtZW50ZWRfNzQ9Tm90IEltcGxlbWVudGVkCi1CYWRfR2F0ZXdheV83Nj1CYWQgR2F0ZXdheQotU2VydmljZV9VbmF2YWlsYWJsZV83OD1TZXJ2aWNlIFVuYXZhaWxhYmxlCi1HYXRld2F5X1RpbWVvdXQqXzgwPUdhdGV3YXkgVGltZW91dCoKLUhUVFBfVmVyc2lvbl9Ob3RfU3VwcG9ydGVkKl84Mj1IVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCoKLUNob29zZV9hX1NlcnZsZXRfMT1DaG9vc2UgYSBTZXJ2bGV0Ci1VbnNwZWNpZmllZF8xPVVuc3BlY2lmaWVkCi1TaGFyaW5nX18xPVNoYXJpbmc6Ci1FcnJvcl9QYWdlXzE9RXJyb3IgUGFnZQotTmV3X0VKQl9SZWY9KE5ldyBFSkIgUmVmKQotc2VsZWN0U1I9U2VsZWN0IGEgU2VjdXJpdHkgUm9sZQotUm9sZV9uYW1lPVJvbGUgbmFtZQotTm9TUj1ObyBTZWN1cml0eSBSb2xlcyBleGlzdC4KLVJlbW92ZVVEQz1SZW1vdmUgVXNlciBEYXRhIENvbnN0cmFpbnQKLVVEQ19kZXNjX2NoYW5nZT1Vc2VyIERhdGEgQ29uc3RyYWludCBkZXNjcmlwdGlvbiBjaGFuZ2VkCi1SdW5fQXM9UnVuIEFzCi1kZXRSdW5Bcz1EZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBzZXJ2bGV0J3MgcnVuLWFzIGVsZW1lbnQKLVNSPVNlY3VyaXR5IHJvbGU6Ci1TZWxlY3Q9U2VsZWN0Li4uCi1SZW1vdmU9UmVtb3ZlCi1SZW1vdmVSQT1SZW1vdmUgcnVuLWFzCi1TZXRSQT1TZXQgcnVuLWFzCi1TZXRSTj1TZXQgcm9sZS1uYW1lCi1TZWN1cml0eVJvbGVSZWZEaWFsb2cuU2VjdXJpdHlfUm9sZV9SZWY9U2VjdXJpdHkgUm9sZSBSZWYKLVNlY3VyaXR5Um9sZVJlZkRpYWxvZy5Sb2xlX25hbWU9Um9sZSBuYW1lOgotU2VjdXJpdHlSb2xlUmVmRGlhbG9nLlJvbGVfbGluaz1Sb2xlIGxpbms6Ci1TZWN1cml0eVJvbGVSZWZEaWFsb2cuRGVzY3JpcHRpb249RGVzY3JpcHRpb246Ci1XZWJhcHBsaWNhdGlvbkVkaXRvci5BZGRfb3JfUmVtb3ZlX1NlY3VyaXR5X1JvbGVfUmVmPUFkZCBvciBSZW1vdmUgU2VjdXJpdHkgUm9sZSBSZWYKLVNlcl9BdXRoU2VjdGlvbi5fTGluaz1cIExpbmsKLVNlcl9BdXRoU2VjdGlvbi5FZGl0X1NlY3VyaXR5X1JvbGVfUmVmPUVkaXQgU2VjdXJpdHkgUm9sZSBSZWYKLXNycl9oZWFkZXI9U2VjdXJpdHkgUm9sZSBSZWZlcmVuY2VzCi1zcnJfZGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXMgYXJlIGRlZmluZWQgZm9yIHRoaXMgc2VydmxldDoKLUxvY2FsX2VuY29kaW5nX21hcHBpbmdfbGlzdF9VSV89TG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgTGlzdAotbG9jYWxfZW5jb2RpbmdfbWFwcGluZ19VSV89TG9jYWxlIEVuY29kaW5nIE1hcHBpbmcKLV9VSV9KU1BDb25maWdfdHlwZT1KU1AgQ29uZmlnCi1fVUlfVGFnTGliUmVmVHlwZV90eXBlPVRhZ0xpYlJlZlR5cGUKLV9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGU9SlNQUHJvcGVydHlHcm91cAotX1VJX0pTUFByb3BlcnR5R3JvdXBfdXJsUGF0dGVybl9mZWF0dXJlPVVSTCBQYXR0ZXJuCi1fVUlfSlNQUHJvcGVydHlHcm91cF9lbElnbm9yZWRfZmVhdHVyZT1FbCBJZ25vcmVkCi1fVUlfSlNQUHJvcGVydHlHcm91cF9wYWdlRW5jb2RpbmdfZmVhdHVyZT1QYWdlIEVuY29kaW5nCi1fVUlfSlNQUHJvcGVydHlHcm91cF9zY3JpcHRpbmdJbnZhbGlkX2ZlYXR1cmU9U2NyaXB0aW5nIEludmFsaWQKLV9VSV9KU1BQcm9wZXJ0eUdyb3VwX2lzWE1MX2ZlYXR1cmU9SXMgWE1MCi1fVUlfSlNQUHJvcGVydHlHcm91cF9pbmNsdWRlUHJlbHVkZXNfZmVhdHVyZT1JbmNsdWRlIFByZWx1ZGVzCi1fVUlfSlNQUHJvcGVydHlHcm91cF9pbmNsdWRlQ29kYXNfZmVhdHVyZT1JbmNsdWRlIENvZGFzCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvc2NoZW1hL2ZpbGVVUkwuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3NjaGVtYS9maWxlVVJMLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmY0NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvc2NoZW1hL2ZpbGVVUkwuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiIgaWQ9ImZpbGVVUkwiIG5hbWU9IkZpbGUgVVJMIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgaXMgZm9yIHRoZSBXZWIgSlNGYWNlcyBGaWxlIFVSTCBleHRlbnNpb24uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZpbGVVUkwiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWxlVVJMIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVuIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJydW4iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHJ1bgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvX2NsYXNzLnRlbXBsYXRlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19jbGFzcy50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0ODgxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvX2NsYXNzLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCUKLQlpZiAobW9kZWwuaXNQdWJsaWMoKSkgeyAKLSU+Ci1wdWJsaWMgCi08JSAKLQl9IAotCi0JaWYgKG1vZGVsLmlzQWJzdHJhY3QoKSkgeyAKLSU+YWJzdHJhY3QgCi08JQotCX0KLQotCWlmIChtb2RlbC5pc0ZpbmFsKCkpIHsKLSU+ZmluYWwgCi08JQotCX0KLSU+Y2xhc3MgPCU9IG1vZGVsLmdldENsYXNzTmFtZSgpICU+Ci08JQotCVN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLSAJaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiBzdXBlckNsYXNzLmxlbmd0aCgpID4gMCkgewotJT4gZXh0ZW5kcyA8JT0gc3VwZXJDbGFzcyAlPgotPCUKLQl9Ci0KLQlMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IG1vZGVsLmdldEludGVyZmFjZXMoKTsgCi0gCWlmICggaW50ZXJmYWNlcy5zaXplKCkgPiAwKSB7IAotJT4gaW1wbGVtZW50cyAKLTwlCi0JfQotCQotIAlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLSAgIAkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotICAgCQlpZiAoaSA+IDApIHsKLSU+LCAKLTwlCi0JCX0KLSU+PCU9IElOVEVSRkFDRSAlPgotPCUKLQl9Ci0lPiB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvX2NvbnN0cnVjdG9ycy50ZW1wbGF0ZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fY29uc3RydWN0b3JzLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjkzOGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fY29uc3RydWN0b3JzLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCUgCi0JaWYgKCFtb2RlbC5oYXNFbXB0eVN1cGVyY2xhc3NDb25zdHJ1Y3RvcigpKSB7IAotJT4KLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIAotICAgICAqLwotICAgIHB1YmxpYyA8JT0gbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgJT4oKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICAgIH0KLTwlIAotCX0gCi0KLQlpZiAobW9kZWwuc2hvdWxkR2VuU3VwZXJjbGFzc0NvbnN0cnVjdG9ycygpKSB7Ci0JCUxpc3Q8Q29uc3RydWN0b3I+IGNvbnN0cnVjdG9ycyA9IG1vZGVsLmdldENvbnN0cnVjdG9ycygpOwotCQlmb3IgKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIDogY29uc3RydWN0b3JzKSB7Ci0JCQlpZiAoY29uc3RydWN0b3IuaXNQdWJsaWMoKSB8fCBjb25zdHJ1Y3Rvci5pc1Byb3RlY3RlZCgpKSB7IAotJT4KLSAgICAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIDwlPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpICU+IzwlPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpICU+KDwlPSBjb25zdHJ1Y3Rvci5nZXRQYXJhbXNGb3JKYXZhZG9jKCkgJT4pCi0gICAgICovCi0gICAgcHVibGljIDwlPSBtb2RlbC5nZXRDbGFzc05hbWUoKSAlPig8JT0gY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9yRGVjbGFyYXRpb24oKSAlPikgewotICAgICAgICBzdXBlcig8JT0gY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9yQ2FsbCgpICU+KTsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0gICAgfQotPCUKLQkJCX0gCi0JCX0gCi0JfSAKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19mbGFncy50ZW1wbGF0ZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fZmxhZ3MudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNmFmZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19mbGFncy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPCUKLQltb2RlbC5yZW1vdmVGbGFncyhDcmVhdGVKYXZhRUVBcnRpZmFjdFRlbXBsYXRlTW9kZWwuRkxBR19RVUFMSUZJRURfU1VQRVJDTEFTU19OQU1FKTsgCi0lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9faW1wb3J0cy50ZW1wbGF0ZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9faW1wb3J0cy50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlN2I0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvX2ltcG9ydHMudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTwlIAotCUNvbGxlY3Rpb248U3RyaW5nPiBpbXBvcnRzID0gbW9kZWwuZ2V0SW1wb3J0cygpOwotCWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAKLSU+Ci1pbXBvcnQgPCU9IGFuSW1wb3J0ICU+OwotPCUgCi0JfQotJT4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19tZXRob2RzLnRlbXBsYXRlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19tZXRob2RzLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmUzZDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fbWV0aG9kcy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwlCi0JaWYgKG1vZGVsLnNob3VsZEltcGxlbWVudEFic3RyYWN0TWV0aG9kcygpKSB7Ci0JCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1vZGVsLmdldFVuaW1wbGVtZW50ZWRNZXRob2RzKCkpIHsgCi0lPgotCi0JLyoqCi0gICAgICogQHNlZSA8JT0gbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSAlPiM8JT0gbWV0aG9kLmdldE5hbWUoKSAlPig8JT0gbWV0aG9kLmdldFBhcmFtc0ZvckphdmFkb2MoKSAlPikKLSAgICAgKi8KLSAgICBwdWJsaWMgPCU9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgJT4gPCU9IG1ldGhvZC5nZXROYW1lKCkgJT4oPCU9IG1ldGhvZC5nZXRQYXJhbXNGb3JEZWNsYXJhdGlvbigpICU+KSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLTwlIAotCQkJU3RyaW5nIGRlZmF1bHRSZXR1cm5WYWx1ZSA9IG1ldGhvZC5nZXREZWZhdWx0UmV0dXJuVmFsdWUoKTsKLQkJCWlmIChkZWZhdWx0UmV0dXJuVmFsdWUgIT0gbnVsbCkgeyAKLSU+Ci0JCQlyZXR1cm4gPCU9IGRlZmF1bHRSZXR1cm5WYWx1ZSAlPjsKLTwlCi0JCQl9IAotJT4KLSAgICB9Ci08JSAKLQkJfQotCX0gCi0lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fcGFja2FnZS50ZW1wbGF0ZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fcGFja2FnZS50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3OWRmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvX3BhY2thZ2UudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTwlCi0JaWYgKG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpICE9IG51bGwgJiYgbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgPiAwKSB7Ci0lPgotcGFja2FnZSA8JT0gbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkgJT47Ci08JQotCX0KLSU+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9maWx0ZXIuamF2YWpldCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9maWx0ZXIuamF2YWpldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgxZmIwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvZmlsdGVyLmphdmFqZXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zIiAKLQlpbXBvcnRzPSJqYXZhLnV0aWwuKiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy4qIiAKLQljbGFzcz0iRmlsdGVyVGVtcGxhdGUiIAotJT4KLTwlIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwgbW9kZWwgPSAoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbCkgYXJndW1lbnQ7ICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfZmxhZ3MudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfcGFja2FnZS50ZW1wbGF0ZSIgJT4KLTwlQCBpbmNsdWRlIGZpbGU9Il9pbXBvcnRzLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0iZmlsdGVyX2NsYXNzSGVhZGVyLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0iX2NsYXNzLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0iX2NvbnN0cnVjdG9ycy50ZW1wbGF0ZSIgJT4KLTwlQCBpbmNsdWRlIGZpbGU9Il9tZXRob2RzLnRlbXBsYXRlIiAlPgotPCUgaWYgKG1vZGVsLnNob3VsZEdlbkRlc3Ryb3koKSkgeyAlPgotCi0JLyoqCi0JICogQHNlZSBGaWx0ZXIjZGVzdHJveSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb0ZpbHRlcigpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIEZpbHRlciNkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCwgU2VydmxldFJlc3BvbnNlLCBGaWx0ZXJDaGFpbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEZpbHRlckNoYWluIGNoYWluKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCS8vIHBsYWNlIHlvdXIgY29kZSBoZXJlCi0KLQkJLy8gcGFzcyB0aGUgcmVxdWVzdCBhbG9uZyB0aGUgZmlsdGVyIGNoYWluCi0JCWNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuSW5pdCgpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIEZpbHRlciNpbml0KEZpbHRlckNvbmZpZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci08JSB9ICU+Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9maWx0ZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvZmlsdGVyX2NsYXNzSGVhZGVyLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDM0NjFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9maWx0ZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioKLSAqIFNlcnZsZXQgRmlsdGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIDwlPSBtb2RlbC5nZXRDbGFzc05hbWUoKSAlPgotPCUgCi0JaWYgKG1vZGVsLmlzQW5ub3RhdGVkKCkpIHsgCi0lPgotICoKLSAqIEB3ZWIuZmlsdGVyCi0gKiAgIG5hbWU9IjwlPSBtb2RlbC5nZXRGaWx0ZXJOYW1lKCkgJT4iCi0gKiAgIGRpc3BsYXktbmFtZT0iPCU9IG1vZGVsLmdldEZpbHRlck5hbWUoKSAlPiIKLTwlCi0JCWlmIChtb2RlbC5nZXREZXNjcmlwdGlvbigpICE9IG51bGwgJiYgbW9kZWwuZ2V0RGVzY3JpcHRpb24oKS5sZW5ndGgoKSA+IDApIHsgCi0lPgotICogICBkZXNjcmlwdGlvbj0iPCU9IG1vZGVsLmdldERlc2NyaXB0aW9uKCkgJT4iCi08JSAKLQkJfSAKLQkJCi0JCUxpc3Q8SUZpbHRlck1hcHBpbmdJdGVtPiBtYXBwaW5ncyA9IG1vZGVsLmdldEZpbHRlck1hcHBpbmdzKCk7Ci0gCQlmb3IgKElGaWx0ZXJNYXBwaW5nSXRlbSBtYXBwaW5nIDogbWFwcGluZ3MpIHsgCi0lPgotICoKLSAqIEB3ZWIuZmlsdGVyLW1hcHBpbmcKLTwlCi0JCQlpZiAobWFwcGluZy5pc1VybFBhdHRlcm5UeXBlKCkpIHsgCi0lPgotICogICB1cmwtcGF0dGVybj0iPCU9IG1hcHBpbmcuZ2V0TmFtZSgpICU+IgotPCUKLQkJCX0gZWxzZSBpZiAobWFwcGluZy5pc1NlcnZsZXROYW1lVHlwZSgpKSB7IAotJT4KLSAqICAgc2VydmxldC1uYW1lPSI8JT0gbWFwcGluZy5nZXROYW1lKCkgJT4iCi08JQotCQkJfQotCQkgCi0JCQlTdHJpbmcgZGlzcGF0Y2hlciA9IG1vZGVsLmdldERpc3BhdGNoZXJMaXN0KG1hcHBpbmcpOwotCQkJaWYgKGRpc3BhdGNoZXIubGVuZ3RoKCkgPiAwKSB7IAotJT4KLSAqICAgZGlzcGF0Y2hlcj0iPCU9IGRpc3BhdGNoZXIgJT4iCi08JSAKLQkJCX0gCi0JCX0gCi0KLQkJTGlzdDxTdHJpbmdbXT4gaW5pdFBhcmFtcyA9IG1vZGVsLmdldEluaXRQYXJhbXMoKTsKLQkJaWYgKGluaXRQYXJhbXMgIT0gbnVsbCAmJiBpbml0UGFyYW1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdFBhcmFtcy5zaXplKCk7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gbW9kZWwuZ2V0SW5pdFBhcmFtKGksIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuTkFNRSk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gbW9kZWwuZ2V0SW5pdFBhcmFtKGksIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuVkFMVUUpOwotCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IG1vZGVsLmdldEluaXRQYXJhbShpLCBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLkRFU0NSSVBUSU9OKTsgCi0lPgotICoKLSAqIEB3ZWIuZmlsdGVyLWluaXQtcGFyYW0KLSAqICAgIG5hbWU9IjwlPSBuYW1lICU+IgotICogICAgdmFsdWU9IjwlPSB2YWx1ZSAlPiIKLTwlCi0JCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgZGVzY3JpcHRpb24ubGVuZ3RoKCkgPiAwKSB7IAotJT4KLSAqICAgIGRlc2NyaXB0aW9uPSI8JT0gZGVzY3JpcHRpb24gJT4iCi08JQotCQkJCX0KLQkJCX0gCi0JCX0gCi0JfQotJT4KLSAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9saXN0ZW5lci5qYXZhamV0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL2xpc3RlbmVyLmphdmFqZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYzg1MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL2xpc3RlbmVyLmphdmFqZXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zIiAKLQlpbXBvcnRzPSJqYXZhLnV0aWwuKiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy4qIiAKLQljbGFzcz0iTGlzdGVuZXJUZW1wbGF0ZSIgCi0lPgotPCUgQ3JlYXRlTGlzdGVuZXJUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbCkgYXJndW1lbnQ7ICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfZmxhZ3MudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfcGFja2FnZS50ZW1wbGF0ZSIgJT4KLTwlQCBpbmNsdWRlIGZpbGU9Il9pbXBvcnRzLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0ibGlzdGVuZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfY2xhc3MudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfY29uc3RydWN0b3JzLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0iX21ldGhvZHMudGVtcGxhdGUiICU+Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvbGlzdGVuZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvbGlzdGVuZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYzI4ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL2xpc3RlbmVyX2NsYXNzSGVhZGVyLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBBcHBsaWNhdGlvbiBMaWZlY3ljbGUgTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgPCU9IG1vZGVsLmdldENsYXNzTmFtZSgpICU+Ci0gKgotPCUgCi0JaWYgKG1vZGVsLmlzQW5ub3RhdGVkKCkpIHsgCi0lPgotICogQHdlYi5saXN0ZW5lcgotPCUgCi0JfQotJT4KLSAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9zZXJ2bGV0LmphdmFqZXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvc2VydmxldC5qYXZhamV0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjhmNmY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9zZXJ2bGV0LmphdmFqZXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotPCVAIGpldCBwYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucyIgCi0JaW1wb3J0cz0iamF2YS51dGlsLiogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuKiIgCi0JY2xhc3M9IlNlcnZsZXRUZW1wbGF0ZSIgCi0lPgotPCUgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwgbW9kZWwgPSAoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAlPgotPCVAIGluY2x1ZGUgZmlsZT0iX2ZsYWdzLnRlbXBsYXRlIiAlPgotPCVAIGluY2x1ZGUgZmlsZT0iX3BhY2thZ2UudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfaW1wb3J0cy50ZW1wbGF0ZSIgJT4KLTwlQCBpbmNsdWRlIGZpbGU9InNlcnZsZXRfY2xhc3NIZWFkZXIudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfY2xhc3MudGVtcGxhdGUiICU+Ci08JSAKLQlpZiAobW9kZWwuaXNHZW5lcmljU2VydmxldFN1cGVyY2xhc3MoKSkgeyAKLSU+Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci08JSAKLQl9IAotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Il9jb25zdHJ1Y3RvcnMudGVtcGxhdGUiICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJfbWV0aG9kcy50ZW1wbGF0ZSIgJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Jbml0KCkpIHsgJT4KLQotCS8qKgotCSAqIEBzZWUgU2VydmxldCNpbml0KFNlcnZsZXRDb25maWcpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotPCUgfSAlPgotPCUgaWYgKG1vZGVsLnNob3VsZEdlbkRlc3Ryb3koKSkgeyAlPgotCi0JLyoqCi0JICogQHNlZSBTZXJ2bGV0I2Rlc3Ryb3koKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuR2V0U2VydmxldENvbmZpZygpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIFNlcnZsZXQjZ2V0U2VydmxldENvbmZpZygpCi0JICovCi0JcHVibGljIFNlcnZsZXRDb25maWcgZ2V0U2VydmxldENvbmZpZygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuR2V0U2VydmxldEluZm8oKSkgeyAlPgotCi0JLyoqCi0JICogQHNlZSBTZXJ2bGV0I2dldFNlcnZsZXRJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRJbmZvKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOyAKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuU2VydmljZSgpICYmICFtb2RlbC5pc0h0dHBTZXJ2bGV0U3VwZXJjbGFzcygpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIFNlcnZsZXQjc2VydmljZShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCi0JICovCi0JcHVibGljIHZvaWQgc2VydmljZShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuU2VydmljZSgpICYmIG1vZGVsLmlzSHR0cFNlcnZsZXRTdXBlcmNsYXNzKCkpIHsgJT4KLQotCS8qKgotCSAqIEBzZWUgSHR0cFNlcnZsZXQjc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotPCUgfSAlPgotPCUgaWYgKG1vZGVsLnNob3VsZEdlbkRvR2V0KCkpIHsgJT4KLQotCS8qKgotCSAqIEBzZWUgSHR0cFNlcnZsZXQjZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci08JSB9ICU+Ci08JSBpZiAobW9kZWwuc2hvdWxkR2VuRG9Qb3N0KCkpIHsgJT4KLQotCS8qKgotCSAqIEBzZWUgSHR0cFNlcnZsZXQjZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb1B1dCgpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvUHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1B1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb0RlbGV0ZSgpKSB7ICU+Ci0KLQkvKioKLQkgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvRGVsZXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb0hlYWQoKSkgeyAlPgotCi0JLyoqCi0JICogQHNlZSBIdHRwU2VydmxldCNkb0hlYWQoSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSGVhZChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb09wdGlvbnMoKSkgeyAlPgotCi0JLyoqCi0JICogQHNlZSBIdHRwU2VydmxldCNkb09wdGlvbnMoSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvT3B0aW9ucyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLTwlIGlmIChtb2RlbC5zaG91bGRHZW5Eb1RyYWNlKCkpIHsgJT4KLQotCS8qKgotCSAqIEBzZWUgSHR0cFNlcnZsZXQjZG9UcmFjZShIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9UcmFjZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLTwlIH0gJT4KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL3NlcnZsZXRfY2xhc3NIZWFkZXIudGVtcGxhdGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvc2VydmxldF9jbGFzc0hlYWRlci50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkMDcwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvc2VydmxldF9jbGFzc0hlYWRlci50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKgotICogU2VydmxldCBpbXBsZW1lbnRhdGlvbiBjbGFzcyA8JT0gbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgJT4KLTwlIAotCWlmIChtb2RlbC5pc0Fubm90YXRlZCgpKSB7IAotJT4KLSAqCi0gKiBAd2ViLnNlcnZsZXQKLSAqICAgbmFtZT0iPCU9IG1vZGVsLmdldFNlcnZsZXROYW1lKCkgJT4iCi0gKiAgIGRpc3BsYXktbmFtZT0iPCU9IG1vZGVsLmdldFNlcnZsZXROYW1lKCkgJT4iCi08JSAKLQkJaWYgKG1vZGVsLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCAmJiBtb2RlbC5nZXREZXNjcmlwdGlvbigpLmxlbmd0aCgpID4gMCkgeyAKLSU+Ci0gKiAgIGRlc2NyaXB0aW9uPSI8JT0gbW9kZWwuZ2V0RGVzY3JpcHRpb24oKSAlPiIKLTwlIAotCQl9IAotCQkKLQkJTGlzdDxTdHJpbmdbXT4gbWFwcGluZ3MgPSBtb2RlbC5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLSAJCWlmIChtYXBwaW5ncyAhPSBudWxsICYmIG1hcHBpbmdzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJpbmcgbWFwID0gbW9kZWwuZ2V0U2VydmxldE1hcHBpbmcoaSk7ICU+Ci0gKgotICogQHdlYi5zZXJ2bGV0LW1hcHBpbmcKLSAqICAgdXJsLXBhdHRlcm49IjwlPSBtYXAgJT4iCi08JSAKLQkJCX0gCi0JCX0KLSAJCUxpc3Q8U3RyaW5nW10+IGluaXRQYXJhbXMgPSBtb2RlbC5nZXRJbml0UGFyYW1zKCk7Ci0gCQlpZiAoaW5pdFBhcmFtcyAhPSBudWxsICYmIGluaXRQYXJhbXMuc2l6ZSgpID4gMCkgewotICAgIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0UGFyYW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBtb2RlbC5nZXRJbml0UGFyYW0oaSwgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuTkFNRSk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gbW9kZWwuZ2V0SW5pdFBhcmFtKGksIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLlZBTFVFKTsKLSAJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gbW9kZWwuZ2V0SW5pdFBhcmFtKGksIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLkRFU0NSSVBUSU9OKTsgCi0lPgotICoKLSAqIEB3ZWIuc2VydmxldC1pbml0LXBhcmFtCi0gKiAgICBuYW1lPSI8JT0gbmFtZSAlPiIKLSAqICAgIHZhbHVlPSI8JT0gdmFsdWUgJT4iCi08JSAKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCAmJiBkZXNjcmlwdGlvbi5sZW5ndGgoKSA+IDApIHsgCi0lPgotICogICAgZGVzY3JpcHRpb249IjwlPSBkZXNjcmlwdGlvbiAlPiIKLTwlCi0JCQkJfQotCQkJfSAKLQkJfSAKLQl9IAotJT4KLSAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dhci12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi92YWxpZGF0aW9uL1VJV2FySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93YXItdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdmFsaWRhdGlvbi9VSVdhckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTMzODE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dhci12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi92YWxpZGF0aW9uL1VJV2FySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMi8yMDAxIDc6MDY6NDMgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFVJV2FySGVscGVyIGV4dGVuZHMgV2FySGVscGVyIHsKLQotCS8qKgotCSAqIFVJV2FySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVJV2FySGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dhci12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi92YWxpZGF0aW9uL1VJV2FyVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93YXItdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdmFsaWRhdGlvbi9VSVdhclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWIyYjdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dhci12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi92YWxpZGF0aW9uL1VJV2FyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnZhbGlkYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLldhclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LldlYlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMC8yLzIwMDEgNjo0Njo1NiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVUlXYXJWYWxpZGF0b3IgZXh0ZW5kcyBXYXJWYWxpZGF0b3IgewotCQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudmFsaWRhdGlvbi5VSVdhckhlbHBlciB3YXJIZWxwZXI7CQotCi0KLQotCi0JLyoqCi0JICogVUlXYXJWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVUlXYXJWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMi8yMDAxIDg6MDE6NDUgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUud2FyLndvcmtiZW5jaGltcGwuVUlXYXJIZWxwZXIKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnZhbGlkYXRpb24uVUlXYXJIZWxwZXIgZ2V0V2FySGVscGVyKCkgewotCQlyZXR1cm4gd2FySGVscGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzIvMjAwMSA4OjAxOjQ1IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdXYXJIZWxwZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS53YXIud29ya2JlbmNoaW1wbC5VSVdhckhlbHBlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdhckhlbHBlcihvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudmFsaWRhdGlvbi5VSVdhckhlbHBlciBuZXdXYXJIZWxwZXIpIHsKLQkJd2FySGVscGVyID0gbmV3V2FySGVscGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzIvMjAwMSA2OjQ5OjI2IFBNKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBGaXJzdCByZW1vdmUgYWxsIHByZXZpb3VzIG1zZy4gZm9yIHRoaXMgcHJvamVjdAotCQkvLwlfcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyxudWxsKTsKLQkJc3VwZXIudmFsaWRhdGUoKTsKLQkJdmFsaWRhdGVFQVJGb3JDb250ZXh0Um9vdCgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzIvMjAwMSA2OjQ5OjI2IFBNKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikKLQkJCXRocm93cyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb24gewotCQkKLQkJc2V0V2FySGVscGVyKChVSVdhckhlbHBlcikgaW5IZWxwZXIpOwotCQlJUHJvamVjdCBwcm9qID0gKChJV29ya2JlbmNoQ29udGV4dCkgd2FySGVscGVyKS5nZXRQcm9qZWN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHdiTW9kdWxlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvaik7Ci0gICAgICAgIGlmKCB3Yk1vZHVsZSAhPSBudWxsICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvaikpIHsgICAgICAgICAgIAkKLSAgICAgICAgCUlWaXJ0dWFsRmlsZSB3ZWJGaWxlID0gd2JNb2R1bGUuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJKTsKLQkJCWlmKCB3ZWJGaWxlLmV4aXN0cygpKSB7Ci0JCQkJc3RhdHVzID0gc3VwZXIudmFsaWRhdGVJbkpvYihpbkhlbHBlciwgaW5SZXBvcnRlcik7Ci0JCQkJdmFsaWRhdGVXZWJJbmZMaWJzKHdiTW9kdWxlKTsKLQkJCX0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotCX0JCi0KLQkvKgotCSAqIEZvciB3ZWIgcHJvamVjdHMsIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMgKGJvdGgKLQkgKiBmcm9tIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aCBhbmQgZnJvbSB0aGUgZXhwb3J0ZWQgY2xhc3NwYXRoIGVudHJpZXMgb2YgcmVmZXJlbmNlZAotCSAqIHV0aWxpdHkgcHJvamVjdHMpIGRvIG5vdCBjb25mbGljdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVXZWJJbmZMaWJzKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCi0JCWZpbmFsIFNldCB3ZWJMaWJNYXBwaW5ncyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQotCQkvLyBnZXQgdGhlIGxpYnMgY3VycmVudGx5IGluIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIKLQkJZmluYWwgSVZpcnR1YWxGb2xkZXIgZm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoV2ViQXJ0aWZhY3RFZGl0LldFQkxJQik7Ci0JCXRyeSB7Ci0JCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gZm9sZGVyLm1lbWJlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHJlc291cmNlc1tpXSBpbnN0YW5jZW9mIElWaXJ0dWFsRmlsZSkgewotCQkJCQlJUmVzb3VyY2VbXSB1bmRlcmx5aW5nUmVzb3VyY2VzID0gcmVzb3VyY2VzW2ldLmdldFVuZGVybHlpbmdSZXNvdXJjZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB1bmRlcmx5aW5nUmVzb3VyY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQl3ZWJMaWJNYXBwaW5ncy5hZGQodW5kZXJseWluZ1Jlc291cmNlc1tqXS5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBzd2FsbG93Ci0JCX0KLQkJZmluYWwgTWFwIGFyY2hpdmVUb1BhdGggPSBuZXcgSGFzaE1hcCgpOwotCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIHdlYkxpYnMgPSBXZWJVdGlsaXRpZXMuZ2V0TGliTW9kdWxlcyhjb21wb25lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdlYkxpYnMubGVuZ3RoOyBpKyspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSB3ZWJMaWJzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJCWlmIChjb21wLmlzQmluYXJ5KCkpIHsKLQkJCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgY29tcDsKLQkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCQlpZiAoIWRpc2tGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCUlGaWxlIHdiRmlsZSA9IGFyY2hpdmVDb21wLmdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCk7Ci0JCQkJCWRpc2tGaWxlID0gbmV3IEZpbGUod2JGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJY2hlY2tMaWJOYW1lKGRpc2tGaWxlLmdldE5hbWUoKSwgbnVsbCwgd2ViTGliTWFwcGluZ3MsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSB3ZWJMaWJzW2ldLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQkJaWYgKGFyY2hpdmVOYW1lICE9IG51bGwgJiYgYXJjaGl2ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCW5hbWUgPSBhcmNoaXZlTmFtZTsKLQkJCQl9IGVsc2UgewotCQkJCQluYW1lID0gY29tcC5nZXROYW1lKCkgKyAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2hlY2tMaWJOYW1lKG5hbWUsIGNvbXAuZ2V0UHJvamVjdCgpLCB3ZWJMaWJNYXBwaW5ncywgdHJ1ZSk7Ci0JCQkJaWYgKGNvbXAgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIGNwUmVmcyA9ICgoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIGNvbXApLmdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3BSZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjcFJlZnNbal07Ci0JCQkJCQlpZiAocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQkJCQkJZmluYWwgU3RyaW5nIGNwQ29tcE5hbWUgPSByZWYuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJCQkJCQljaGVja0xpYk5hbWUoY3BDb21wTmFtZSwgY29tcC5nZXRQcm9qZWN0KCksIHdlYkxpYk1hcHBpbmdzLCBmYWxzZSk7Ci0JCQkJCQkJSVBhdGggY3BFbnRyeVBhdGg9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldENsYXNzcGF0aFZpcnR1YWxSZWZlcmVuY2VMb2NhdGlvbihyZWYpOwotCQkJCQkJCWlmIChjcEVudHJ5UGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJCUlQYXRoIGV4aXN0aW5nUGF0aCA9IChJUGF0aCkgYXJjaGl2ZVRvUGF0aC5nZXQoY3BDb21wTmFtZSk7Ci0JCQkJCQkJCWlmIChleGlzdGluZ1BhdGggIT0gbnVsbCAmJiAhZXhpc3RpbmdQYXRoLmVxdWFscyhjcEVudHJ5UGF0aCkpIHsKLQkJCQkJCQkJCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX0RVUExJQ0FURV9DTEFTU1BBVEhfQ09NUE9ORU5UX1VSSSwgbmV3IFN0cmluZ1tde2NwQ29tcE5hbWUsIGNvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKX0pKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWFyY2hpdmVUb1BhdGgucHV0KGNwQ29tcE5hbWUsIGNwRW50cnlQYXRoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja0xpYk5hbWUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIFNldCB3ZWJMaWJOYW1lcywgZmluYWwgYm9vbGVhbiBhZGROYW1lKSB7Ci0JCWlmICh3ZWJMaWJOYW1lcy5jb250YWlucyhuYW1lKSkgewotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCS8vaWdub3JlIHRoaXMgYmVjYXVzZSBvZiBXQVIgaW1wb3J0IGJyaW5ncyBpbiB0aGUgbGliIGphcnMgYWxvbmcgd2l0aCBwcm9qZWN0cwotCQkJCS8vX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfRFVQTElDQVRFX1dFQl9JTkZfTElCX09USEVSX1BST0pFQ1QsIG5ldyBTdHJpbmdbXXtuYW1lLCBwcm9qZWN0LmdldE5hbWUoKX0pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfRFVQTElDQVRFX1dFQl9JTkZfTElCLCBuZXcgU3RyaW5nW117bmFtZX0pKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChhZGROYW1lKSB7Ci0JCQl3ZWJMaWJOYW1lcy5hZGQobmFtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMi8yMDAxIDY6NDk6MjYgUE0pCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFQVJGb3JDb250ZXh0Um9vdCgpIHsKLQotLy8JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRXYXJIZWxwZXIoKS5nZXRQcm9qZWN0KCk7Ci0vLwkJSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViTmF0dXJlID0gSjJFRVdlYk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0KTsKLS8vCQlTdHJpbmcgY29udGV4dFJvb3QgPSB3ZWJOYXR1cmUuZ2V0Q29udGV4dFJvb3QoKTsKLS8vCi0vLwkJaWYgKHdlYk5hdHVyZSA9PSBudWxsKQotLy8JCQlyZXR1cm47Ci0vLwotLy8JCUVBUk5hdHVyZVJ1bnRpbWUgZWFyUnVudGltZU5hdHVyZVtdID0gd2ViTmF0dXJlLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMoKTsKLQotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUnVudGltZU5hdHVyZS5sZW5ndGg7IGkrKykgewotLy8JCQkvLyBmb3IgZWFjaCBFYXIgUHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoaXMgd2ViIHByb2plY3QgdXBkYXRlIHRoZSBjb250ZXh0IHJvb3QuCi0vLwkJCS8vIGhvbGQgdGhlIG1vZGVsIGFuZCB2YWxpZGF0ZSB0aGUgY29udGV4dCByb290ICYgcmVsZWFzZSB0aGUgbW9kZWwKLS8vCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG51bGw7Ci0vLwkJCXRyeSB7Ci0vLwkJCQllZGl0TW9kZWwgPSBlYXJSdW50aW1lTmF0dXJlW2ldLmdldEVhckVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0vLwkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLS8vCQkJCQlNb2R1bGUgbW9kdWxlID0gbnVsbDsKLS8vCQkJCQlpZiAoKG1vZHVsZSA9IGVhclJ1bnRpbWVOYXR1cmVbaV0uZ2V0TW9kdWxlKHByb2plY3QpKSAhPSBudWxsKSB7Ci0vLwkJCQkJCVN0cmluZyB3ZWJNb2Rjb250ZXh0Um9vdCA9ICgoV2ViTW9kdWxlKSBtb2R1bGUpLmdldENvbnRleHRSb290KCk7Ci0vLwkJCQkJCWlmICh3ZWJNb2Rjb250ZXh0Um9vdCAhPSBudWxsICYmICF3ZWJNb2Rjb250ZXh0Um9vdC5lcXVhbHMoY29udGV4dFJvb3QpKSB7Ci0vLwkJCQkJCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotLy8JCQkJCQkJcGFyYW1zWzBdID0gcHJvamVjdC5nZXROYW1lKCk7Ci0vLwkJCQkJCQlwYXJhbXNbMV0gPSAoKFdlYk1vZHVsZSkgbW9kdWxlKS5nZXRDb250ZXh0Um9vdCgpOwotLy8JCQkJCQkJcGFyYW1zWzJdID0gZWFyUnVudGltZU5hdHVyZVtpXS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotLy8JCQkJCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBFUlJPUl9FQVJfSU5WQUxJRF9DT05URVhUX1JPT1QsIHBhcmFtcyk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0gZmluYWxseSB7Ci0vLwkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLS8vCQkJCQllZGl0TW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLS8vCQkJCQllZGl0TW9kZWwgPSBudWxsOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgdmFsaWRhdGVMaWJNb2R1bGVzLgotCSAqIAotCSAqIAotCSAqLwotCQotCS8vVE9ETyBjcmVhdGUgdmFsaWRhdGlvbiBmb3IgbW9kdWxlcwotLyoJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVMaWJNb2R1bGVzKEoyRUVXZWJOYXR1cmVSdW50aW1lIHdlYk5hdHVyZSkgewotCQlpZiAod2ViTmF0dXJlICE9IG51bGwpIHsKLQkJCUlMaWJNb2R1bGVbXSBsaWJNb2R1bGVzID0gd2ViTmF0dXJlLmdldExpYk1vZHVsZXMoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSB3ZWJOYXR1cmUuZ2V0UHJvamVjdCgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYk1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTGliTW9kdWxlIGxpYiA9IGxpYk1vZHVsZXNbaV07Ci0JCQkJSVByb2plY3QgdFByb2plY3QgPSBsaWIuZ2V0UHJvamVjdCgpOwotCQkJCWlmICh0UHJvamVjdCAhPSBudWxsKSB7IC8vIFByb2plY3QgY291bGQgYmUgbnVsbCBpZiBKYXZhUHJvamVjdCBpcyBkZWxldGVkLCBmb3IKLQkJCQkJCQkJCQkvLyBleGFtcGxlCi0JCQkJCWlmICghdFByb2plY3QuZXhpc3RzKCkgfHwgIXRQcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1dMUF9QUk9KRUNULCBuZXcgU3RyaW5nW117dFByb2plY3QuZ2V0TmFtZSgpfSwgd2ViTmF0dXJlLmdldFByb2plY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlTdHJpbmcgamFyTmFtZSA9IGxpYi5nZXRKYXJOYW1lKCk7Ci0JCQkJSVBhdGggamFyUGF0aCA9IHdlYk5hdHVyZS5nZXRMaWJyYXJ5Rm9sZGVyKCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoamFyTmFtZSk7Ci0JCQkJaWYgKCgoUmVzb3VyY2UpIHByb2plY3QpLmZpbmRFeGlzdGluZ1Jlc291cmNlVmFyaWFudChqYXJQYXRoKSAhPSBudWxsKQotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9DT05GTElDVElOR19XTFBfUFJPSkVDVCwgbmV3IFN0cmluZ1tde2phck5hbWV9LCB3ZWJOYXR1cmUuZ2V0UHJvamVjdCgpKTsKLQkJCX0KLQkJfQotCX0qLwkKLQkKLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpIHsKLQkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSAoKElXb3JrYmVuY2hDb250ZXh0KSBoZWxwZXIpLmdldFByb2plY3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KCBwcm9qZWN0ICk7Ci0JCUlGaWxlIHdlYkRlcGxveW1lbnREZXNjcmlwdG9yID0gbnVsbDsKLQkJaWYoIGNvbXAgIT0gbnVsbCApewotCQkJSVZpcnR1YWxGaWxlIHZmID0gY29tcC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkkpKTsKLQkJCWlmKCB2ZiE9IG51bGwgKXsKLQkJCQl3ZWJEZXBsb3ltZW50RGVzY3JpcHRvciA9IHZmLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdlYkRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dhci12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi92YWxpZGF0aW9uL1dhckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2FyLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3ZhbGlkYXRpb24vV2FySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMWQzODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2FyLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3ZhbGlkYXRpb24vV2FySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi52YWxpZGF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLkoyRUVWYWxpZGF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uV0FSTWVzc2FnZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoUmVwb3J0ZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgV2FySGVscGVyIGV4dGVuZHMgSjJFRVZhbGlkYXRpb25IZWxwZXIgewotCUhhc2h0YWJsZSB3YXJGaWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQlXQVJGaWxlIHdhckZpbGUgPSBudWxsOwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSGVscGVySUQgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS53YXIud29ya2JlbmNoaW1wbC5XYXJIZWxwZXIiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIFdhckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCi0JcHVibGljIFdhckhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQotCQlyZWdpc3Rlck1vZGVsKFdBUk1lc3NhZ2VDb25zdGFudHMuV0FSX01PREVMX05BTUUsICJsb2FkV2FyRmlsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGluZGlyZWN0bHkgZnJvbSB0aGUgV2FyVmFsaWRhdG9yICh2aWEuIHRoZSBXb3JrYmVuY2hSZXBvcnRlcikuIEl0Ci0JICogd2lsbCBleHBlY3QgdGhlIGNvbWluZyBvYmplY3QgdG8gYmUgYSBFT2JqZWN0IGZvciB0aGUgbm9kZSB3aG8gZ2VuZXJhdGVkIHRoaXMgbWVzc2FnZS4gTm90ZToKLQkgKiBUaGlzIG1ldGhvZHMgbWF5IG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgaGlnaGVyIHVwIGluIHRoZSBjbGFzcyBzdGFjay4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVObyhPYmplY3Qgb2JqZWN0KSB7Ci0KLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikgeyAvLyBFcnJvciBkaXNjb3ZlcmVkIHVzaW5nIHRoZSBYTUwgcGFyc2VyCi0JCQlyZXR1cm4gKChJbnRlZ2VyKSBvYmplY3QpLmludFZhbHVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0TGluZU5vKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSByZXNvdXJjZSwgcmV0dXJuIGl0cyBub24tZWNsaXBzZS1zcGVjaWZpYyBsb2NhdGlvbi4gSWYgdGhpcyByZXNvdXJjZSwgb3IgdHlwZSBvZgotCSAqIHJlc291cmNlLCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMgaGVscGVyLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJaWYgKHJlc291cmNlUGF0aCAhPSBudWxsKQotCQkJcmV0dXJuIHJlc291cmNlUGF0aC50b1N0cmluZygpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNpbWlsYXIgdG8gdGhlIGdldEZpbGUoKSBtZXRob2QsIHdlIGtub3cgdGhhdCB3ZSBhcmUgdGFsa2luZyBhYm91dCB3ZWIueG1sLCBidXQgbmVlZCBhIHVuaXF1ZQotCSAqIElELgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIE9iamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQotCQlpZiggb2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgV0FSRmlsZSApewotCQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCQVBQX0lEOwotCQl9Ci0JCXJldHVybiBudWxsOwotLy8JCVN0cmluZyByZXQgPSBudWxsOwotLy8JCWlmIChvYmplY3QgIT0gbnVsbCkgewotLy8JCQlJRmlsZSB3YXJGaWxlID0gKElGaWxlKSB3YXJGaWxlTWFwLmdldChnZXRQcm9qZWN0KCkudG9TdHJpbmcoKSk7Ly8gdmFsaWRhdG9yIGZyYW1ld29yawotLy8JCQkJCQkJCQkJCQkJCQkJCQkJLy8gd2lsbCBjYWxsIGdldEZpbGUoKQotLy8JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmlyc3QuCi0vLwkJCWlmICh3YXJGaWxlICE9IG51bGwpIHsKLS8vCQkJCXJldCA9ICh3YXJGaWxlLnRvU3RyaW5nKCkgKyBIZWxwZXJJRCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIHJldDsKLQl9Ci0KLQkKLQkvL3B1YmxpYyBFT2JqZWN0IGxvYWRXYXJGaWxlKENvbXBvbmVudEhhbmRsZSBoYW5kbGUpIHsKLQlwdWJsaWMgRU9iamVjdCBsb2FkV2FyRmlsZSgpIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpOwotCQkJZWRpdCA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXApOwotCQkJCi0JCQl0cnkgewotCQkJCXdhckZpbGUgPSAoV0FSRmlsZSkoKFdlYkFydGlmYWN0RWRpdCkgZWRpdCkuYXNBcmNoaXZlKGZhbHNlLCB0cnVlLCB0cnVlKTsKLQkJCQlyZXR1cm4gd2FyRmlsZTsKLQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlMSk7Ci0JCQl9Ci0vLwkJCWZpbmFsbHkgewotLy8JCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotLy8JCQkJCWVkaXQuZGlzcG9zZSgpOwotLy8JCQkJfQotLy8JCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JcHVibGljIHZvaWQgY2xlYW51cChXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQllZGl0LmRpc3Bvc2UoKTsKLQkJCWVkaXQgPSBudWxsOwotCQl9CQotCQlpZih3YXJGaWxlICE9IG51bGwpewotCQkJd2FyRmlsZS5jbG9zZSgpOwotCQkJd2FyRmlsZSA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9kZXBsb3lhYmxlcy9Nb2R1bGVBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL01vZHVsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhYjJlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL01vZHVsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDgsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5kZXBsb3lhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuSjJFRUZsZXhQcm9qRGVwbG95YWJsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGJsYW5jZXR0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLSAgICAKLSAgICBKMkVFRmxleFByb2pEZXBsb3lhYmxlIGRlbGVnYXRlOwotCi0gICAgcHVibGljIHZvaWQgc2V0TW9kdWxlRGVsZWdhdGUoSjJFRUZsZXhQcm9qRGVwbG95YWJsZSBtb2R1bGVEZWxlZ2F0ZSkgewotICAgICAgICBkZWxlZ2F0ZSA9IG1vZHVsZURlbGVnYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBKMkVFRmxleFByb2pEZXBsb3lhYmxlIGdldERlbGVnYXRlKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhiMzE1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmpmYWNlcy5leHRlbnNpb24uRmlsZVVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuamZhY2VzLmV4dGVuc2lvbi5GaWxlVVJMRXh0ZW5zaW9uUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLldlYlJlc291cmNlOwotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgV2ViRGVwbG95YWJsZUFydGlmYWN0VXRpbCB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEdFTkVSSUNfU0VSVkxFVF9DTEFTU19UWVBFID0gImphdmF4LnNlcnZsZXQuR2VuZXJpY1NlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBQ1RVU19TRVJWTEVUX0NMQVNTX1RZUEUgPSAib3JnLmFwYWNoZS5jYWN0dXMuc2VydmVyLlNlcnZsZXRUZXN0UmVkaXJlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBXZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChPYmplY3Qgb2JqKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIG9iajsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElNb2R1bGVBcnRpZmFjdCkKLQkJCXJlc291cmNlID0gKChJTW9kdWxlQXJ0aWZhY3QpIG9iaikuZ2V0TW9kdWxlKCkuZ2V0UHJvamVjdCgpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSAoKElBZGFwdGFibGUpIG9iaikuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXNvdXJjZSA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTZXJ2bGV0KSB7Ci0JCQkJU2VydmxldCBzZXJ2bGV0ID0gKChTZXJ2bGV0KSBvYmopOwotCQkJCVJlc291cmNlIHNlcnZSZXNvdXJjZSA9IHNlcnZsZXQuZVJlc291cmNlKCk7Ci0JCQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJSVJlc291cmNlIGVjbGlwZVNlcnZSZXNvcnVjZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoc2VydlJlc291cmNlKTsKLQkJCQkJcmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZWNsaXBlU2VydlJlc29ydWNlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQkJCWlmIChyZXNvdXJjZXNbMF0gIT0gbnVsbCkKLQkJCQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQkJCVN0cmluZyBtYXBwaW5nID0gbnVsbDsKLQkJCQlqYXZhLnV0aWwuTGlzdCBtYXBwaW5ncyA9ICgoU2VydmxldCkgb2JqKS5nZXRNYXBwaW5ncygpOwotCQkJCWlmIChtYXBwaW5ncyAhPSBudWxsICYmICFtYXBwaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJU2VydmxldE1hcHBpbmcgbWFwID0gKFNlcnZsZXRNYXBwaW5nKSBtYXBwaW5ncy5nZXQoMCk7Ci0JCQkJCW1hcHBpbmcgPSBtYXAuZ2V0VXJsUGF0dGVybigpOwotCQkJCX0KLQkJCQlpZiAobWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgbmV3IFBhdGgobWFwcGluZykpOwotCQkJCX0KLQkJCQlXZWJUeXBlIHdlYlR5cGUgPSAoKFNlcnZsZXQpIG9iaikuZ2V0V2ViVHlwZSgpOwotCQkJCWlmICh3ZWJUeXBlLmlzSnNwVHlwZSgpKSB7Ci0JCQkJCXJlc291cmNlID0gKChJUHJvamVjdCkgcmVzb3VyY2UpLmdldEZpbGUoKChKU1BUeXBlKSB3ZWJUeXBlKS5nZXRKc3BGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmICh3ZWJUeXBlLmlzU2VydmxldFR5cGUoKSkgewotCQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKCJzZXJ2bGV0LyIgKyAoKFNlcnZsZXRUeXBlKSB3ZWJUeXBlKS5nZXRDbGFzc05hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJaWYgKGhhc0ludGVyZXN0ZWRDb21wb25lbnRzKHByb2plY3QpKQotCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHByb2plY3QsIG51bGwpLCBwcm9qZWN0LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCX0KLQkJCi0JCWlmICghaGFzSW50ZXJlc3RlZENvbXBvbmVudHMocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCQlpZiAoaXNDYWN0dXNKdW5pdFRlc3QocmVzb3VyY2UpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHJlc291cmNlKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlcy5sZW5ndGggPD0gMCB8fCByZXNvdXJjZXNbMF0gPT0gbnVsbCApCi0JCQlyZXR1cm4gbnVsbDsKLQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0U2VydmxldENsYXNzTmFtZShyZXNvdXJjZSk7Ci0JCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjb21wb25lbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1hcHBpbmcgPSBnZXRTZXJ2bGV0TWFwcGluZyhyZXNvdXJjZSwgdHJ1ZSwgY2xhc3NOYW1lLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKLQkJCWlmIChtYXBwaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKG1hcHBpbmcpKTsKLQkJCX0KLQkJCS8vIGlmIHRoZXJlIGlzIG5vIHNlcnZsZXQgbWFwcGluZywgcHJvdmlkZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBzZXJ2bGV0Ci0JCQkvLyB0aHJvdWdoIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotCQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCBuZXcgUGF0aCgic2VydmxldC8iICsgY2xhc3NOYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJCQlMaXN0IHNlcnZsZXRzID0gd2ViRWRpdC5nZXRXZWJBcHAoKS5nZXRTZXJ2bGV0cygpOwotCQkJCWZvciAoaW50IGk9MDsgaTxzZXJ2bGV0cy5zaXplKCk7IGkrKykgewotCQkJCQlTZXJ2bGV0IHNlcnZsZXQgPSAoU2VydmxldCkgc2VydmxldHMuZ2V0KGkpOwotCQkJCQlXZWJUeXBlIHR5cGUgPSBzZXJ2bGV0LmdldFdlYlR5cGUoKTsKLQkJCQkJaWYgKHR5cGUuaXNKc3BUeXBlKCkpIHsKLQkJCQkJCUpTUFR5cGUganNwID0gKEpTUFR5cGUpdHlwZTsKLQkJCQkJCVN0cmluZyBqc3BQYXRoID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQkJCQkJCWlmIChqc3AuZ2V0SnNwRmlsZSgpLmVxdWFscyhqc3BQYXRoKSkgewotCQkJCQkJCUxpc3QgbWFwcGluZ3MgPSBzZXJ2bGV0LmdldE1hcHBpbmdzKCk7Ci0JCQkJCQkJU3RyaW5nIG1hcHBpbmcgPSBudWxsOwotCQkJCQkJCWlmIChtYXBwaW5ncyAhPSBudWxsICYmICFtYXBwaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJU2VydmxldE1hcHBpbmcgbWFwID0gKFNlcnZsZXRNYXBwaW5nKSBtYXBwaW5ncy5nZXQoMCk7Ci0JCQkJCQkJCW1hcHBpbmcgPSBtYXAuZ2V0VXJsUGF0dGVybigpOwotCQkJCQkJCQlpZiAobWFwcGluZyAhPSBudWxsKSAKLQkJCQkJCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgbmV3IFBhdGgobWFwcGluZykpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLQkJCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLSAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCk7Ci0KLQkJLy8gRXh0ZW5zaW9uIHJlYWQgdG8gZ2V0IHRoZSBjb3JyZWN0IFVSTCBmb3IgSmF2YSBTZXJ2ZXIgRmFjZXMgZmlsZSBpZgotCQkvLyB0aGUganNwIGlzIG9mIHR5cGUganNmYWNlcy4KLQkJRmlsZVVSTCBqc3BVUkwgPSBGaWxlVVJMRXh0ZW5zaW9uUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RmlsZXNVUkwoKTsKLQkJaWYgKGpzcFVSTCAhPSBudWxsKSB7Ci0JCQlJUGF0aCBjb3JyZWN0SlNQUGF0aCA9IGpzcFVSTC5nZXRGaWxlVVJMKHJlc291cmNlLCByZXNvdXJjZVBhdGgpOwotCQkJaWYgKGNvcnJlY3RKU1BQYXRoICE9IG51bGwgJiYgY29ycmVjdEpTUFBhdGgudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApCi0JCQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCBjb3JyZWN0SlNQUGF0aCk7Ci0JCX0KLQkJLy8gcmV0dXJuIFdlYiByZXNvdXJjZSB0eXBlCi0JCQotCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIHJlc291cmNlUGF0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0LCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQikpLml0ZXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBudWxsOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwpCi0JCQljb21wb25lbnROYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldE1vZHVsZVByb2plY3QocHJvamVjdCwgaXRlcmF0b3IpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKLQkJCQlpZiAoZGVwbG95YWJsZS5nZXROYW1lKCkuZXF1YWxzKGNvbXBvbmVudE5hbWUpKSB7Ci0JCQkJCXJldHVybiBkZXBsb3lhYmxlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJdGVyYXRvciBpdGVyYXRvcikgewotCQlJTW9kdWxlIGRlcGxveWFibGUgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKLQkJCQlpZiAoZGVwbG95YWJsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQotCQkJCQlyZXR1cm4gZGVwbG95YWJsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBWZXJ5IHRlbXBvcmFyeSBhcGkgLSBUT0RPIC0gcmlwIHRoaXMgb3V0IGJ5IDEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDYWN0dXNKdW5pdFRlc3QoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBnZXRDbGFzc05hbWVGb3JUeXBlKHJlc291cmNlLCBDQUNUVVNfU0VSVkxFVF9DTEFTU19UWVBFKSAhPSBudWxsOwotCX0KLQotCi0KLQlwcml2YXRlIHN0YXRpYyBJVHlwZVtdIGdldFR5cGVzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpICE9IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlyZXR1cm4gKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50KS5nZXRBbGxUeXBlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2bGV0Q2xhc3NOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lRm9yVHlwZShyZXNvdXJjZSwgR0VORVJJQ19TRVJWTEVUX0NMQVNTX1RZUEUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZUZvclR5cGUoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgc3VwZXJUeXBlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSB8fCBwYXRoID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIHByb2plY3QuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCQlpZiAoIWphdmFQcm9qZWN0LmlzT3BlbigpKQotCQkJCWphdmFQcm9qZWN0Lm9wZW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJCS8vIG91dHB1dCBsb2NhdGlvbiBtYXkgbm90IGJlIG9uIGNsYXNzcGF0aAotCQkJSVBhdGggb3V0cHV0UGF0aCA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQlpZiAob3V0cHV0UGF0aCAhPSBudWxsICYmICJjbGFzcyIuZXF1YWxzKHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSAmJiBvdXRwdXRQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWludCBjb3VudCA9IG91dHB1dFBhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb3VudCk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBpbml0aWFsIHBhcnQgb2YgY2xhc3NwYXRoCi0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc1BhdGhFbnRyeSA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQkJaWYgKGNsYXNzUGF0aEVudHJ5ICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGNsYXNzUGF0aEVudHJ5Lmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJUGF0aCBjbGFzc1BhdGggPSBjbGFzc1BhdGhFbnRyeVtpXS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChjbGFzc1BhdGguaXNQcmVmaXhPZihwYXRoKSkgewotCQkJCQkJaW50IGNvdW50ID0gY2xhc3NQYXRoLnNlZ21lbnRDb3VudCgpOwotCQkJCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb3VudCk7Ci0JCQkJCQlpICs9IHNpemU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCBqYXZhIGVsZW1lbnQKLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IGphdmFQcm9qZWN0LmZpbmRFbGVtZW50KHBhdGgpOwotCi0JCQlJVHlwZVtdIHR5cGVzID0gZ2V0VHlwZXMoamF2YUVsZW1lbnQpOwotCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZTIgPSB0eXBlcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCWlmIChoYXNTdXBlcmNsYXNzKHR5cGVzW2ldLCBzdXBlclR5cGUpKQotCQkJCQkJcmV0dXJuIHR5cGVzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzU3VwZXJjbGFzcyhJVHlwZSB0eXBlLCBTdHJpbmcgc3VwZXJDbGFzc05hbWUpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpOwotCQkJSVR5cGVbXSBzdXBlckNsYXNzZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJjbGFzc2VzKHR5cGUpOwotCi0JCQlpbnQgc2l6ZSA9IHN1cGVyQ2xhc3Nlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChzdXBlckNsYXNzTmFtZS5lcXVhbHMoc3VwZXJDbGFzc2VzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZsZXRNYXBwaW5nKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpc1NlcnZsZXQsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKLQkJaWYgKHR5cGVOYW1lID09IG51bGwgfHwgdHlwZU5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJV2ViQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQlXZWJBcHAgd2ViQXBwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JCQl3ZWJBcHAgPSBlZGl0LmdldFdlYkFwcCgpOwotCQkJaWYgKHdlYkFwcCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB3ZWJBcHAuZ2V0U2VydmxldHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCQkJV2ViVHlwZSB3ZWJUeXBlID0gc2VydmxldC5nZXRXZWJUeXBlKCk7Ci0JCQkJaWYgKHdlYlR5cGUuaXNTZXJ2bGV0VHlwZSgpICYmIGlzU2VydmxldCkgewotCQkJCQlTZXJ2bGV0VHlwZSB0eXBlID0gKFNlcnZsZXRUeXBlKSB3ZWJUeXBlOwotCQkJCQlpZiAodHlwZU5hbWUuZXF1YWxzKHR5cGUuZ2V0Q2xhc3NOYW1lKCkpKQotCQkJCQkJdmFsaWQgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAod2ViVHlwZS5pc0pzcFR5cGUoKSAmJiAhaXNTZXJ2bGV0KSB7Ci0JCQkJCUpTUFR5cGUgdHlwZSA9IChKU1BUeXBlKSB3ZWJUeXBlOwotCQkJCQlpZiAodHlwZU5hbWUuZXF1YWxzKHR5cGUuZ2V0SnNwRmlsZSgpKSkKLQkJCQkJCXZhbGlkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKHZhbGlkKSB7Ci0JCQkJCWphdmEudXRpbC5MaXN0IG1hcHBpbmdzID0gc2VydmxldC5nZXRNYXBwaW5ncygpOwotCQkJCQlpZiAobWFwcGluZ3MgIT0gbnVsbCAmJiAhbWFwcGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJCQlTZXJ2bGV0TWFwcGluZyBtYXAgPSAoU2VydmxldE1hcHBpbmcpIG1hcHBpbmdzLmdldCgwKTsKLQkJCQkJCXJldHVybiBtYXAuZ2V0VXJsUGF0dGVybigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzSW50ZXJlc3RlZENvbXBvbmVudHMoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvZGVwbG95YWJsZXMvV2ViTW9kdWxlQXJ0aWZhY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvZGVwbG95YWJsZXMvV2ViTW9kdWxlQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyMTNhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL1dlYk1vZHVsZUFydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyMSwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmRlcGxveWFibGVzOwotCi0vKioKLSAqICAgIEtleSBDbGFzcyBmb3IgYWRhcHRlciBtYW5hZ2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJNb2R1bGVBcnRpZmFjdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2pmYWNlcy9leHRlbnNpb24vRmlsZVVSTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzdlOTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxMywgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmpmYWNlcy5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbGVVUkwgewotCXB1YmxpYyBJUGF0aCBnZXRGaWxlVVJMKElSZXNvdXJjZSByZXNvdXJjZSwgSVBhdGggZXhpc3RpbmdVUkwpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2pmYWNlcy9leHRlbnNpb24vRmlsZVVSTEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2UyMDc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDEzLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuamZhY2VzLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVVJMRXh0ZW5zaW9uIHsKLQlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0JcHJpdmF0ZSBGaWxlVVJMIGluc3RhbmNlOwotCXByaXZhdGUgYm9vbGVhbiBlcnJvckNvbmRpdGlvbiA9IGZhbHNlOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9VUkxfRVhURU5TSU9OID0gImZpbGVVUkwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOID0gInJ1biI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEZpbGVVUkxFeHRlbnNpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEZpbGVVUkwgZ2V0SW5zdGFuY2UoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodGhpcy5pbnN0YW5jZSA9PSBudWxsICYmICF0aGlzLmVycm9yQ29uZGl0aW9uKQotCQkJCXRoaXMuaW5zdGFuY2UgPSAoRmlsZVVSTCkgdGhpcy5lbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oInJ1biIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aGlzLmVycm9yQ29uZGl0aW9uID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5pbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgRmlsZVVSTEV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIUZJTEVfVVJMX0VYVEVOU0lPTi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXh0ZW5zaW9ucyBtdXN0IGJlIG9mIHRoZSB0eXBlIFwiIiArIEZJTEVfVVJMX0VYVEVOU0lPTiArICJcIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJdGhpcy5pZCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgaWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9qZmFjZXMvZXh0ZW5zaW9uL0ZpbGVVUkxFeHRlbnNpb25SZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMRXh0ZW5zaW9uUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODhjYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9qZmFjZXMvZXh0ZW5zaW9uL0ZpbGVVUkxFeHRlbnNpb25SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDEzLCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmpmYWNlcy5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVGhpcyBjbGFzcyBsb2FkcyBhbGwgdGhlIGV4dGVuc2lvbnMgdGhhdCBkZWZpbmUgdGhlIGNvcnJlY3QgVVJMIHN0cmluZyBmb3IgdGhlIEphdmEgU2VydmVyIEZhY2VzCi0gKiBmaWxlCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVVJMRXh0ZW5zaW9uUmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCXN0YXRpYyBGaWxlVVJMRXh0ZW5zaW9uUmVhZGVyIGluc3RhbmNlID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdCBmaWxlVVJMRXh0ZW5zaW9uczsKLQotCS8qKgotCSAqIEBwYXJhbSByZWdpc3RyeQotCSAqIEBwYXJhbSBwbHVnaW5JRAotCSAqIEBwYXJhbSBleHRlbnNpb25Qb2ludAotCSAqLwotCXB1YmxpYyBGaWxlVVJMRXh0ZW5zaW9uUmVhZGVyKCkgewotCQlzdXBlcihXZWJQbHVnaW4uUExVR0lOX0lELCAiZmlsZVVSTCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChGaWxlVVJMRXh0ZW5zaW9uLkZJTEVfVVJMX0VYVEVOU0lPTi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQlhZGRFeHRlbnNpb24oZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb25zCi0JICogICAgICAgICAgICBUaGUgZXh0ZW5zaW9ucyB0byBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IG5ld0V4dGVuc2lvbikgewotCQlnZXRGaWxlVVJMRXh0ZW5zaW9ucygpLmFkZChuZXcgRmlsZVVSTEV4dGVuc2lvbihuZXdFeHRlbnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvbnMKLQkgKiAgICAgICAgICAgIFRoZSBleHRlbnNpb25zIHRvIHNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVuc2lvblBvaW50KEZpbGVVUkxFeHRlbnNpb25SZWFkZXIgbmV3RXh0ZW5zaW9uKSB7Ci0JCWlmICh0aGlzLmZpbGVVUkxFeHRlbnNpb25zID09IG51bGwpCi0JCQl0aGlzLmZpbGVVUkxFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLmZpbGVVUkxFeHRlbnNpb25zLmFkZChuZXdFeHRlbnNpb24pOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZm9yIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHByaW9yaXRpZXMgb2YgdGhvc2Ugd2hpY2ggYXJlCi0JICogICAgICAgICBhdmFpbGFibGUgYW5kIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgRmlsZVVSTCBnZXRGaWxlc1VSTCgpIHsKLQkJRmlsZVVSTEV4dGVuc2lvbiBmaWxlVVJMRXh0OwotCQlmb3IgKEl0ZXJhdG9yIGZpbGVVUkxFeHRJdHIgPSBnZXRGaWxlVVJMRXh0ZW5zaW9ucygpLml0ZXJhdG9yKCk7IGZpbGVVUkxFeHRJdHIuaGFzTmV4dCgpOykgewotCQkJZmlsZVVSTEV4dCA9IChGaWxlVVJMRXh0ZW5zaW9uKSBmaWxlVVJMRXh0SXRyLm5leHQoKTsKLQkJCXJldHVybiBmaWxlVVJMRXh0LmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRmlsZVVSTEV4dGVuc2lvblJlYWRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZVVSTEV4dGVuc2lvblJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEZpbGVVUkxFeHRlbnNpb25SZWFkZXIoKTsKLQkJCWluc3RhbmNlLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJFeHRlbnNpb25zLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEZpbGVVUkxFeHRlbnNpb25zKCkgewotCQlpZiAodGhpcy5maWxlVVJMRXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJdGhpcy5maWxlVVJMRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHRoaXMuZmlsZVVSTEV4dGVuc2lvbnM7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BYnN0cmFjdFN1cGVydHlwZXNWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BYnN0cmFjdFN1cGVydHlwZXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxY2NlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWJzdHJhY3RTdXBlcnR5cGVzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU1VQRVJDTEFTUzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFN1cGVydHlwZXNWYWxpZGF0b3IgewotCQotCXByaXZhdGUgc3RhdGljIElUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHlDYWNoZSA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0U3VwZXJjbGFzcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFNVUEVSQ0xBU1MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZ2V0SW50ZXJmYWNlcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gKExpc3QpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJTlRFUkZBQ0VTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZSgoSVByb2plY3QpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNTdXBlcmNsYXNzKElEYXRhTW9kZWwgZGF0YU1vZGVsLAotCQkJU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgc3VwZXJUeXBlTmFtZSkgewotCQl0cnkgewotCQkJSVR5cGUgdHlwZSA9IGdldEphdmFQcm9qZWN0KGRhdGFNb2RlbCkuZmluZFR5cGUodHlwZU5hbWUpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCUlUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkgPSBnZXRUeXBlSGllcmFyY2h5KHR5cGUpOwotCQkJCWZvciAoSVR5cGUgc3VwZXJUeXBlIDogdHlwZUhpZXJhcmNoeS5nZXRBbGxTdXBlcmNsYXNzZXModHlwZSkpIHsKLQkJCQkJaWYgKHN1cGVyVHlwZU5hbWUuZXF1YWxzKHN1cGVyVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlXZWJQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNTdXBlckludGVyZmFjZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwKLQkJCVN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHN1cGVyVHlwZU5hbWUpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlIHR5cGUgPSBnZXRKYXZhUHJvamVjdChkYXRhTW9kZWwpLmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQlJVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5ID0gZ2V0VHlwZUhpZXJhcmNoeSh0eXBlKTsKLQkJCQlmb3IgKElUeXBlIHN1cGVyVHlwZSA6IHR5cGVIaWVyYXJjaHkuZ2V0QWxsU3VwZXJJbnRlcmZhY2VzKHR5cGUpKSB7Ci0JCQkJCWlmIChzdXBlclR5cGVOYW1lLmVxdWFscyhzdXBlclR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJV2ViUGx1Z2luLmxvZyhlKTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJVHlwZUhpZXJhcmNoeSBnZXRUeXBlSGllcmFyY2h5KElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodHlwZUhpZXJhcmNoeUNhY2hlID09IG51bGwgfHwgIXR5cGUuZXF1YWxzKHR5cGVIaWVyYXJjaHlDYWNoZS5nZXRUeXBlKCkpKSB7Ci0JCQl0eXBlSGllcmFyY2h5Q2FjaGUgPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkobnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVIaWVyYXJjaHlDYWNoZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRGaWx0ZXJPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRGaWx0ZXJPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwYTM0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWRkRmlsdGVyT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRklMVEVSX01BUFBJTkdTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVRfUEFSQU07Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTQ1JJUFRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRElTUExBWV9OQU1FOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzLCBBZGRGaWx0ZXIgT3BlcmF0aW9uIGlzIGEgSURhdGFNb2RlbE9wZXJhdGlvbiBmb2xsb3dpbmcgdGhlCi0gKiBJRGF0YU1vZGVsIHdpemFyZCBhbmQgb3BlcmF0aW9uIGZyYW1ld29yay4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogVGhpcyBvcGVyYXRpb24gc3ViY2xhc3NlcyB0aGUgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24gc28gdGhlIGNoYW5nZXMKLSAqIG1hZGUgdG8gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtb2RlbHMgYXJlIHNhdmVkIHRvIHRoZSBhcnRpZmFjdCBlZGl0Ci0gKiBtb2RlbC4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbgotICogCi0gKiBJdCBpcyB0aGUgb3BlcmF0aW9uIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gYWRkaW5nIGEgbmV3IGZpbHRlciB0byBhIHdlYgotICogYXBwLiBUaGlzIHVzZXMgdGhlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgdG8gcmV0cmlldmUgcHJvcGVydGllcyBzZXQgYnkgdGhlCi0gKiB1c2VyIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgY3VzdG9tIGZpbHRlci4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiB3aWxsIGFkZCB0aGUgbWV0YWRhdGEgbmVjZXNzYXJ5IGludG8gdGhlIHdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIAotICogVG8gYWN0dWFsbHkgY3JlYXRlIHRoZSBqYXZhIGNsYXNzIGZvciB0aGUgZmlsdGVyLCB0aGUgb3BlcmF0aW9uIHVzZXMgdGhlIE5ld0ZpbHRlckNsYXNzT3BlcmF0aW9uLiAKLSAqIFRoZSBOZXdGaWx0ZXJDbGFzc09wZXJhdGlvbiBzaGFyZXMgdGhlIHNhbWUgZGF0YSBtb2RlbCBwcm92aWRlci4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3RmlsdGVyQ2xhc3NPcGVyYXRpb24KLSAqIAotICogQ2xpZW50cyBtYXkgc3ViY2xhc3MgdGhpcyBvcGVyYXRpb24gdG8gcHJvdmlkZSB0aGVpciBvd24gYmVoYXZpb3Igb24gZmlsdGVyCi0gKiBjcmVhdGlvbi4gVGhlIGV4ZWN1dGUgbWV0aG9kIGNhbiBiZSBleHRlbmRlZCB0byBkbyBzby4gQWxzbywKLSAqIGdlbmVyYXRlRmlsdGVyTWV0YURhdGEgYW5kIGNyZXRlRmlsdGVyQ2xhc3MgYXJlIGV4cG9zZWQuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIEFkZEZpbHRlck9wZXJhdGlvbiBleHRlbmRzIEFkZFdlYkNsYXNzT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIG9wZXJhdGlvbi4KLQkgKiBJdCB3aWxsIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24jQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24oSURhdGFNb2RlbCkKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHJldHVybiBBZGRGaWx0ZXJPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQWRkRmlsdGVyT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uIGdldE5ld0NsYXNzT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IE5ld0ZpbHRlckNsYXNzT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBnZW5lcmF0aW9uIHN0ZXBzIGZvcgotCSAqIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWV0YWRhdGEgZm9yIHRoZSB3ZWIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGlzCi0JICogaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgSjJFRSBtb2RlbHMgdG8gY3JlYXRlIHRoZSBGaWx0ZXIgbW9kZWwgaW5zdGFuY2UsCi0JICogYW55IGluaXQgcGFyYW1zIHNwZWNpZmllZCwgYW5kIGFueSBmaWx0ZXIgbWFwcGluZ3MuIEl0IHRoZW4gYWRkcyB0aGVzZQotCSAqIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gbW9kZWwuIFRoaXMgd2lsbCB0aGVuIGJlIHdyaXR0ZW4gb3V0IHRvIHRoZQotCSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLgotCSAqIAotCSAqIEBzZWUgRmlsdGVyCi0JICogQHNlZSBBZGRGaWx0ZXJPcGVyYXRpb24jY3JlYXRlRmlsdGVyKFN0cmluZykKLQkgKiBAc2VlIEFkZEZpbHRlck9wZXJhdGlvbiNzZXRVcEluaXRQYXJhbXMoTGlzdCwgRmlsdGVyKQotCSAqIEBzZWUgQWRkRmlsdGVyT3BlcmF0aW9uI3NldFVwVVJMTWFwcGluZ3MoTGlzdCwgRmlsdGVyKQotCSAqIAotCSAqIEBwYXJhbSBhTW9kZWwKLQkgKiBAcGFyYW0gcXVhbGlmaWVkQ2xhc3NOYW1lCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVNZXRhRGF0YShJRGF0YU1vZGVsIGFNb2RlbCwgU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSkgewotCQkvLyBTZXQgdXAgdGhlIGZpbHRlciBtb2RlbGxlZCBvYmplY3QKLQkJT2JqZWN0IGZpbHRlciA9IGNyZWF0ZUZpbHRlcihxdWFsaWZpZWRDbGFzc05hbWUpOwotCi0JCS8vIFNldCB1cCB0aGUgSW5pdFBhcmFtcyBpZiBhbnkKLQkJTGlzdCBpbml0UGFyYW1MaXN0ID0gCi0JCSAgICAoTGlzdCkgYU1vZGVsLmdldFByb3BlcnR5KElOSVRfUEFSQU0pOwotCQlpZiAoaW5pdFBhcmFtTGlzdCAhPSBudWxsKQotCQkJc2V0VXBJbml0UGFyYW1zKGluaXRQYXJhbUxpc3QsIGZpbHRlcik7Ci0KLQkJLy8gU2V0IHVwIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaWYgYW55Ci0JCSBMaXN0IGZpbHRlck1hcHBpbmdzTGlzdCA9IAotCQkgICAgIChMaXN0KSBhTW9kZWwuZ2V0UHJvcGVydHkoRklMVEVSX01BUFBJTkdTKTsKLQotICAgICAgICAgaWYgKGZpbHRlck1hcHBpbmdzTGlzdCAhPSBudWxsICYmICFmaWx0ZXJNYXBwaW5nc0xpc3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgIHNldFVwTWFwcGluZ3MoZmlsdGVyTWFwcGluZ3NMaXN0LCBmaWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBwcml2YXRlIHVzZSBvbmx5LiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvCi0JICogY3JlYXRlIHRoZSBmaWx0ZXIgbW9kZWxlZCBvYmplY3QsIHRvIHNldCBhbnkgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4KLQkgKiB0aGUgZGF0YSBtb2RlbCwgYW5kIHRoZW4gdG8gYWRkIHRoZSBmaWx0ZXIgaW5zdGFuY2UgdG8gdGhlIHdlYgotCSAqIGFwcGxpY2F0aW9uIG1vZGVsLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiBJdCB3aWxsCi0JICogbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgQWRkRmlsdGVyT3BlcmF0aW9uI2dlbmVyYXRlRmlsdGVyTWV0YURhdGEoTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWwsCi0JICogICAgICBTdHJpbmcpCi0JICogQHNlZSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkjY3JlYXRlRmlsdGVyKCkKLQkgKiBAc2VlIEZpbHRlcgotCSAqIAotCSAqIEBwYXJhbSBxdWFsaWZpZWRDbGFzc05hbWUKLQkgKiBAcmV0dXJuIEZpbHRlciBpbnN0YW5jZQotCSAqLwotCS8qKgotCSAqIEBwYXJhbSBxdWFsaWZpZWRDbGFzc05hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgY3JlYXRlRmlsdGVyKFN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUpIHsKLQkJLy8gR2V0IHZhbHVlcyBmcm9tIGRhdGEgbW9kZWwKLQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gCi0JCSAgICBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShESVNQTEFZX05BTUUpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAKLQkJICAgIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KERFU0NSSVBUSU9OKTsKLQotCQkvLyBDcmVhdGUgdGhlIGZpbHRlciBpbnN0YW5jZSBhbmQgc2V0IHVwIHRoZSBwYXJhbWV0ZXJzIGZyb20gZGF0YSBtb2RlbAotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLQkJCUZpbHRlciBmaWx0ZXIgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbHRlcigpOwotCQkJZmlsdGVyLnNldE5hbWUoZGlzcGxheU5hbWUpOwotCQkJZmlsdGVyLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLQkJCWZpbHRlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQlmaWx0ZXIuc2V0RmlsdGVyQ2xhc3NOYW1lKHF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLQkJCS8vIEFkZCB0aGUgZmlsdGVyIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gbW9kZWwKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCXdlYkFwcC5nZXRGaWx0ZXJzKCkuYWRkKGZpbHRlcik7Ci0JCQlyZXR1cm4gZmlsdGVyOwotCQl9IGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxPYmplY3Q7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIgZmlsdGVyID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsdGVyKCk7Ci0JCQlEaXNwbGF5TmFtZSBkaXNwbGF5TmFtZU9iaiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0gICAgICAgICAgICBkaXNwbGF5TmFtZU9iai5zZXRWYWx1ZShkaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICBmaWx0ZXIuZ2V0RGlzcGxheU5hbWVzKCkuYWRkKGRpc3BsYXlOYW1lT2JqKTsKLQkJCWZpbHRlci5zZXRGaWx0ZXJOYW1lKGRpc3BsYXlOYW1lKTsKLQkJCWZpbHRlci5zZXRGaWx0ZXJDbGFzcyhxdWFsaWZpZWRDbGFzc05hbWUpOwotCQkJaWYgKHdlYkFwcCAhPSBudWxsKSB7Ci0JCQkJd2ViQXBwLmdldEZpbHRlcnMoKS5hZGQoZmlsdGVyKTsKLQkJCX0KLQkJCS8vIFNob3VsZCBiZSByZXR1cm4gRmlsdGVyJ3MgaW5zdGFuY2UKLQkJCXJldHVybiBmaWx0ZXI7Ci0JCX0KLQkJLy8gUmV0dXJuIHRoZSBmaWx0ZXIgaW5zdGFuY2UKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFueQotCSAqIGluaXQgcGFyYW1zIGZvciB0aGUgbmV3IGZpbHRlciBtZXRhZGF0YS4gSXQgd2lsbCBub3QgYWNjZXB0IG51bGwKLQkgKiBwYXJhbWV0ZXJzLiBUaGUgaW5pdCBwYXJhbXMgYXJlIHNldCBvbiB0aGUgZmlsdGVyIG1vZGVsZWQgb2JqZWN0LgotCSAqIAotCSAqIEBzZWUgQWRkRmlsdGVyT3BlcmF0aW9uI2dlbmVyYXRlRmlsdGVyTWV0YURhdGEoTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWwsCi0JICogICAgICBTdHJpbmcpCi0JICogQHNlZSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkjY3JlYXRlSW5pdFBhcmFtKCkKLQkgKiAKLQkgKiBAcGFyYW0gaW5pdFBhcmFtTGlzdAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VXBJbml0UGFyYW1zKExpc3QgaW5pdFBhcmFtTGlzdCwgT2JqZWN0IGZpbHRlck9iaikgewotCQkvLyBHZXQgdGhlIHdlYiBhcHAgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YSBtb2RlbAotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCUZpbHRlciBmaWx0ZXIgPSAoRmlsdGVyKSBmaWx0ZXJPYmo7Ci0KLQkJCS8vIElmIEoyRUUgMS40LCBhZGQgdGhlIHBhcmFtIHZhbHVlIGFuZCBkZXNjcmlwdGlvbiBpbmZvIGluc3RhbmNlcwotCQkJLy8gdG8gdGhlIGZpbHRlciBpbml0IHBhcmFtcwotCQkJaWYgKHdlYkFwcC5nZXRKMkVFVmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpIHsKLQkJCQlmb3IgKGludCBpUCA9IDA7IGlQIDwgaW5pdFBhcmFtTGlzdC5zaXplKCk7IGlQKyspIHsKLQkJCQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSAoU3RyaW5nW10pIGluaXRQYXJhbUxpc3QuZ2V0KGlQKTsKLQkJCQkJLy8gQ3JlYXRlIDEuNCBjb21tb24gcGFyYW0gdmFsdWUKLQkJCQkJSW5pdFBhcmFtIHBhcmFtID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbml0UGFyYW0oKTsKLQkJCQkJcGFyYW0uc2V0UGFyYW1OYW1lKHN0cmluZ0FycmF5WzBdKTsKLQkJCQkJcGFyYW0uc2V0UGFyYW1WYWx1ZShzdHJpbmdBcnJheVsxXSk7Ci0JCQkJCXBhcmFtLnNldERlc2NyaXB0aW9uKHN0cmluZ0FycmF5WzJdKTsKLQkJCQkJLy8gU2V0IHRoZSBwYXJhbSB0byB0aGUgZmlsdGVyIG1vZGVsIGxpc3Qgb2YgaW5pdCBwYXJhbXMKLQkJCQkJZmlsdGVyLmdldEluaXRQYXJhbXMoKS5hZGQocGFyYW0pOwotCQkJCX0KLQkJCX0KLQkJCS8vIElmIEoyRUUgMS4yIG9yIDEuMywgdXNlIHRoZSBmaWx0ZXIgc3BlY2lmaWMgaW5pdCBwYXJhbSBpbnN0YW5jZXMKLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGlQID0gMDsgaVAgPCBpbml0UGFyYW1MaXN0LnNpemUoKTsgaVArKykgewotCQkJCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IChTdHJpbmdbXSkgaW5pdFBhcmFtTGlzdC5nZXQoaVApOwotCQkJCQkvLyBDcmVhdGUgdGhlIHdlYiBpbml0IHBhcmFtCi0JCQkJCUluaXRQYXJhbSBpcCA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFBhcmFtKCk7Ci0JCQkJCS8vIFNldCB0aGUgcGFyYW0gbmFtZQotCQkJCQlpcC5zZXRQYXJhbU5hbWUoc3RyaW5nQXJyYXlbMF0pOwotCQkJCQkvLyBTZXQgdGhlIHBhcmFtIHZhbHVlCi0JCQkJCWlwLnNldFBhcmFtVmFsdWUoc3RyaW5nQXJyYXlbMV0pOwotCQkJCQkvLyBTZXQgdGhlIHBhcmFtIGRlc2NyaXB0aW9uCi0JCQkJCWlwLnNldERlc2NyaXB0aW9uKHN0cmluZ0FycmF5WzJdKTsKLQkJCQkJLy8gQWRkIHRoZSBpbml0IHBhcmFtIHRvIHRoZSBmaWx0ZXIgbW9kZWwgbGlzdCBvZiBwYXJhbXMKLQkJCQkJZmlsdGVyLmdldEluaXRQYXJhbXMoKS5hZGQoaXApOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgewotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyIGZpbHRlciA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIpIGZpbHRlck9iajsKLQotCQkJZm9yIChpbnQgaVAgPSAwOyBpUCA8IGluaXRQYXJhbUxpc3Quc2l6ZSgpOyBpUCsrKSB7Ci0JCQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSAoU3RyaW5nW10pIGluaXRQYXJhbUxpc3QuZ2V0KGlQKTsKLQkJCQkvLyBDcmVhdGUgMS40IGNvbW1vbiBwYXJhbSB2YWx1ZQotCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlIHBhcmFtID0gCi0JCQkJICAgIEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtVmFsdWUoKTsKLQkJCQlwYXJhbS5zZXRQYXJhbU5hbWUoc3RyaW5nQXJyYXlbMF0pOwotCQkJCXBhcmFtLnNldFBhcmFtVmFsdWUoc3RyaW5nQXJyYXlbMV0pOwotCi0JCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uT2JqID0gCi0JCQkJICAgIEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoc3RyaW5nQXJyYXlbMl0pOwotCQkJCS8vIFNldCB0aGUgZGVzY3JpcHRpb24gb24gdGhlIHBhcmFtCi0JCQkJcGFyYW0uZ2V0RGVzY3JpcHRpb25zKCkuYWRkKGRlc2NyaXB0aW9uT2JqKTsKLQkJCQkvLyBBZGQgdGhlIHBhcmFtIHRvIHRoZSBmaWx0ZXIgbW9kZWwgbGlzdCBvZiBpbml0IHBhcmFtcwotCQkJCWZpbHRlci5nZXRJbml0UGFyYW1zKCkuYWRkKHBhcmFtKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gVGhpcyBtZXRob2QgaXMgdXNlZCB0bwotCSAqIGNyZWF0ZSB0aGUgZmlsdGVyIG1hcHBpbmcgbW9kZWxsZWQgb2JqZWN0cyBzbyB0aGUgbWV0YWRhdGEgZm9yIHRoZQotCSAqIGZpbHRlciBtYXBwaW5ncyBpcyBzdG9yZSBpbiB0aGUgd2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhpcyBtZXRob2QKLQkgKiB3aWxsIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiBUaGUgZmlsdGVyIG1hcHBpbmdzIGFyZSBhZGRlZCB0byB0aGUKLQkgKiB3ZWIgYXBwbGljYXRpb24gbW9kZWxlZCBvYmplY3QuCi0JICogCi0JICogQHNlZSBBZGRGaWx0ZXJPcGVyYXRpb24jZ2VuZXJhdGVGaWx0ZXJNZXRhRGF0YShOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbCwKLQkgKiAgICAgIFN0cmluZykKLQkgKiBAc2VlIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSNjcmVhdGVGaWx0ZXJNYXBwaW5nKCkKLQkgKiAKLQkgKiBAcGFyYW0gdXJsTWFwcGluZ0xpc3QKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFVwTWFwcGluZ3MoTGlzdCBmaWx0ZXJNYXBwaW5nc0xpc3QsIE9iamVjdCBmaWx0ZXJPYmopIHsKLQkJLy8gR2V0IHRoZSB3ZWIgYXBwIG1vZGVsbGVkIG9iamVjdCBmcm9tIHRoZSBkYXRhIG1vZGVsCi0JCS8vIFdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpOwotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCi0JCS8vIENyZWF0ZSB0aGUgZmlsdGVyIG1hcHBpbmdzIGlmIGFueQotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCUZpbHRlciBmaWx0ZXIgPSAoRmlsdGVyKSBmaWx0ZXJPYmo7Ci0JCQlpZiAoZmlsdGVyTWFwcGluZ3NMaXN0ICE9IG51bGwpIAotCQkJICAgIGZvciAoaW50IGlNID0gMDsgaU0gPCBmaWx0ZXJNYXBwaW5nc0xpc3Quc2l6ZSgpOyBpTSsrKSB7Ci0JCQkgICAgICAgIElGaWx0ZXJNYXBwaW5nSXRlbSBmaWx0ZXJNYXBwaW5nID0gKElGaWx0ZXJNYXBwaW5nSXRlbSkgZmlsdGVyTWFwcGluZ3NMaXN0LmdldChpTSk7Ci0JCQkgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlsdGVyIG1hcHBpbmcgaW5zdGFuY2UgZnJvbSB0aGUgd2ViIGZhY3RvcnkKLQkJCSAgICAgICAgRmlsdGVyTWFwcGluZyBtYXBwaW5nID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXJNYXBwaW5nKCk7Ci0JCQkgICAgICAgIC8vIFNldCB0aGUgZmlsdGVyCi0JCQkgICAgICAgIG1hcHBpbmcuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkgICAgICAgIGlmIChmaWx0ZXJNYXBwaW5nLmlzVXJsUGF0dGVyblR5cGUoKSkgewotCQkJICAgICAgICAgICAgLy8gU2V0IHRoZSBVUkwgcGF0dGVybiB0byBtYXAgdGhlIGZpbHRlciB0bwotCQkJICAgICAgICAgICAgbWFwcGluZy5zZXRVcmxQYXR0ZXJuKGZpbHRlck1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJCSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgU2VydmxldCBOYW1lIHRvIG1hcCB0aGUgZmlsdGVyIHRvCi0JCQkgICAgICAgIAlTZXJ2bGV0IHNlcnZsZXQgPSB3ZWJBcHAuZ2V0U2VydmxldE5hbWVkKGZpbHRlck1hcHBpbmcuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcuc2V0U2VydmxldChzZXJ2bGV0KTsKLQkJCSAgICAgICAgfQotCQkJICAgICAgICAvL1NldCBkaXNwYXRjaGVyIG9wdGlvbnMgZm9yIHRoZSBmaWx0ZXIgbWFwcGluZyBpZiBhbnkuCi0JCQkgICAgICAgIGludCBkaXNwYXRjaGVycyA9IGZpbHRlck1hcHBpbmcuZ2V0RGlzcGF0Y2hlcnMoKTsKLQkJCSAgICAgICAgRUxpc3QgZGlzcGF0Y2hlclR5cGVzID0gbWFwcGluZy5nZXREaXNwYXRjaGVyVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLlJFUVVFU1QpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlclR5cGVzLmFkZChEaXNwYXRjaGVyVHlwZS5SRVFVRVNUX0xJVEVSQUwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uRk9SV0FSRCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVyVHlwZXMuYWRkKERpc3BhdGNoZXJUeXBlLkZPUldBUkRfTElURVJBTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5JTkNMVURFKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJUeXBlcy5hZGQoRGlzcGF0Y2hlclR5cGUuSU5DTFVERV9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLkVSUk9SKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJUeXBlcy5hZGQoRGlzcGF0Y2hlclR5cGUuRVJST1JfTElURVJBTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJCSAgICAgICAgLy8gQWRkIHRoZSBmaWx0ZXIgbWFwcGluZyB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIG1vZGVsbGVkIGxpc3QKLQkJCSAgICAgICAgd2ViQXBwLmdldEZpbHRlck1hcHBpbmdzKCkuYWRkKG1hcHBpbmcpOwotCQkJICAgIH0KLQkJfSBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgewotCQkgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIG1vZGVsT2JqZWN0OwotCQkgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyIGZpbHRlciA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIpIGZpbHRlck9iajsKLQotCQkgICAgLy8gQ3JlYXRlIHRoZSBmaWx0ZXIgbWFwcGluZyBpbnN0YW5jZSBmcm9tIHRoZSB3ZWIgZmFjdG9yeQotICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyBtYXBwaW5nID0gbnVsbDsKLQkJCS8vIENyZWF0ZSB0aGUgZmlsdGVyIG1hcHBpbmdzIGlmIGFueQotCQkJaWYgKGZpbHRlck1hcHBpbmdzTGlzdCAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJNYXBwaW5nc0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkgICAgICAgICAgICAgICAgbWFwcGluZyA9IFdlYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbHRlck1hcHBpbmcoKTsKLQkgICAgICAgICAgICAgICAgbWFwcGluZy5zZXRGaWx0ZXJOYW1lKGZpbHRlci5nZXRGaWx0ZXJOYW1lKCkpOwotCSAgICAgICAgICAgICAgICBJRmlsdGVyTWFwcGluZ0l0ZW0gZmlsdGVyTWFwcGluZyA9IChJRmlsdGVyTWFwcGluZ0l0ZW0pIGZpbHRlck1hcHBpbmdzTGlzdC5nZXQoaSk7Ci0JICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXBwaW5nLmdldE1hcHBpbmdUeXBlKCkgPT0gSUZpbHRlck1hcHBpbmdJdGVtLlVSTF9QQVRURVJOKSB7Ci0JICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIFVSTCBwYXR0ZXJuIHRvIG1hcCB0aGUgZmlsdGVyIHRvCi0JICAgICAgICAgICAgICAgICAgICBVcmxQYXR0ZXJuVHlwZSB1cmwgPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVcmxQYXR0ZXJuVHlwZSgpOwotCSAgICAgICAgICAgICAgICAgICAgdXJsLnNldFZhbHVlKGZpbHRlck1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcuZ2V0VXJsUGF0dGVybnMoKS5hZGQodXJsKTsKLQkgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcuZ2V0U2VydmxldE5hbWVzKCkuYWRkKGZpbHRlck1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkgICAgICAgICAgICAgICAgfQotICAJCQkgICAgICAgIC8vU2V0IGRpc3BhdGNoZXIgb3B0aW9ucyBmb3IgdGhlIGZpbHRlciBtYXBwaW5nIGlmIGFueS4JCi0gICAgICAgICAgICAgICAgICAgIGludCBkaXNwYXRjaGVycyA9IGZpbHRlck1hcHBpbmcuZ2V0RGlzcGF0Y2hlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5SRVFVRVNUKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcuZ2V0RGlzcGF0Y2hlcnMoKS5hZGQob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRGlzcGF0Y2hlclR5cGUuUkVRVUVTVF9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLkZPUldBUkQpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5nZXREaXNwYXRjaGVycygpLmFkZChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5EaXNwYXRjaGVyVHlwZS5GT1JXQVJEX0xJVEVSQUwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uSU5DTFVERSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLmdldERpc3BhdGNoZXJzKCkuYWRkKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlLklOQ0xVREVfTElURVJBTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5FUlJPUikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLmdldERpc3BhdGNoZXJzKCkuYWRkKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlLkVSUk9SX0xJVEVSQUwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZmlsdGVyIG1hcHBpbmcgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbCBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIHdlYkFwcC5nZXRGaWx0ZXJNYXBwaW5ncygpLmFkZChtYXBwaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRMaXN0ZW5lck9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZExpc3RlbmVyT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYjgxYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZExpc3RlbmVyT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLk5ld0phdmFFRUFydGlmYWN0Q2xhc3NPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MsIEFkZExpc3RlbmVyT3BlcmF0aW9uIGlzIGEgSURhdGFNb2RlbE9wZXJhdGlvbiBmb2xsb3dpbmcgdGhlIElEYXRhTW9kZWwgd2l6YXJkIGFuZAotICogb3BlcmF0aW9uIGZyYW1ld29yay4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIHN1YmNsYXNzZXMgdGhlIEFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uIHNvIHRoZSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICogbW9kZWxzIGFyZSBzYXZlZCB0byB0aGUgYXJ0aWZhY3QgZWRpdCBtb2RlbC4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbgotICogCi0gKiBJdCBpcyB0aGUgb3BlcmF0aW9uIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gYWRkaW5nIGEgbmV3IGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lciB0bwotICogYSB3ZWIgYXBwLCB3aGV0aGVyIHRoYXQgYmUgYW4gYW5ub3RhdGVkIGxpc3RlbmVyIG9yIGEgbm9uIGFubm90YXRlZCBsaXN0ZW5lci4gIFRoaXMgdXNlcyB0aGUKLSAqIE5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlciB0byByZXRyaWV2ZSBwcm9wZXJ0aWVzIHNldCBieSB0aGUgdXNlciBpbiBvcmRlciB0byBjcmVhdGUgdGhlIGN1c3RvbQotICogbGlzdGVuZXIgY2xhc3MuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBJbiB0aGUgbm9uIGFubm90YXRlZCBjYXNlLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGFkZCB0aGUgbWV0YWRhdGEgbmVjZXNzYXJ5IGludG8gdGhlIHdlYiBkZXBsb3ltZW50Ci0gKiBkZXNjcmlwdG9yLiBJbiB0aGUgYW5ub3RhdGVkIGNhc2UsIGl0IHdpbGwgbm90LCBpdCB3aWxsIGxlYXZlIHRoaXMgdXAgdG8gdGhlIHBhcnNpbmcgb2YgdGhlCi0gKiBhbm5vdGF0aW9ucyB0byBidWlsZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFydGlmYWN0cy4gVG8gYWN0dWFsbHkgY3JlYXRlIHRoZSBqYXZhIGNsYXNzIGZvcgotICogdGhlIGxpc3RlbmVyLCB0aGUgb3BlcmF0aW9uIHVzZXMgdGhlIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24uIFRoZSBOZXdMaXN0ZW5lckNsYXNzT3BlcmF0aW9uIAotICogc2hhcmVzIHRoZSBzYW1lIGRhdGEgbW9kZWwgcHJvdmlkZXIuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24KLSAqIAotICogQ2xpZW50cyBtYXkgc3ViY2xhc3MgdGhpcyBvcGVyYXRpb24gdG8gcHJvdmlkZSB0aGVpciBvd24gYmVoYXZpb3Igb24gbGlzdGVuZXIgY3JlYXRpb24uIFRoZSBleGVjdXRlCi0gKiBtZXRob2QgY2FuIGJlIGV4dGVuZGVkIHRvIGRvIHNvLiBBbHNvLCBnZW5lcmF0ZUxpc3RlbmVyTWV0YURhdGEgYW5kIGNyZXRlTGlzdGVuZXJDbGFzcyBhcmUgZXhwb3NlZC4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWRkTGlzdGVuZXJPcGVyYXRpb24gZXh0ZW5kcyBBZGRXZWJDbGFzc09wZXJhdGlvbiB7Ci0JCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29uc3RydWN0b3Igd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgb3BlcmF0aW9uLgotCSAqIEl0IHdpbGwgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlci4gIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIEBzZWUgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24jQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24oSURhdGFNb2RlbCkKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsIAotCSAqIEByZXR1cm4gQWRkTGlzdGVuZXJPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQWRkTGlzdGVuZXJPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbiBnZXROZXdDbGFzc09wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBOZXdMaXN0ZW5lckNsYXNzT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBnZW5lcmF0aW9uIHN0ZXBzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlCi0JICogbWV0YWRhdGEgZm9yIHRoZSB3ZWIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBKMkVFIG1vZGVscyB0byBjcmVhdGUKLQkgKiB0aGUgTGlzdGVuZXIgbW9kZWwgaW5zdGFuY2UuIEl0IHRoZW4gYWRkcyB0aGVzZSB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIG1vZGVsLiBUaGlzIHdpbGwgdGhlbiBiZSAKLQkgKiB3cml0dGVuIG91dCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUuIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlcnMuCi0JICogQHNlZSBMaXN0ZW5lcgotCSAqIEBzZWUgQWRkTGlzdGVuZXJPcGVyYXRpb24jY3JlYXRlTGlzdGVuZXIoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBhTW9kZWwKLQkgKiBAcGFyYW0gcXVhbGlmaWVkQ2xhc3NOYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVNZXRhRGF0YShJRGF0YU1vZGVsIGFNb2RlbCwgU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSkgewotCQkvLyBTZXQgdXAgdGhlIGxpc3RlbmVyIG1vZGVsZWQgb2JqZWN0Ci0JCWNyZWF0ZUxpc3RlbmVyKHF1YWxpZmllZENsYXNzTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBwcml2YXRlIHVzZSBvbmx5LiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgbGlzdGVuZXIKLQkgKiBtb2RlbGVkIG9iamVjdCwgdG8gc2V0IGFueSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBtb2RlbCwgYW5kIHRoZW4gdG8gYWRkIHRoZQotCSAqIGxpc3RlbmVyIGluc3RhbmNlIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlcnMuCi0JICogSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogQHNlZSBBZGRMaXN0ZW5lck9wZXJhdGlvbiNnZW5lcmF0ZUxpc3RlbmVyTWV0YURhdGEoSURhdGFNb2RlbCwgU3RyaW5nKQotCSAqIEBzZWUgQ29tbW9uRmFjdG9yeSNjcmVhdGVMaXN0ZW5lcigpCi0JICogQHNlZSBMaXN0ZW5lcgotCSAqIAotCSAqIEBwYXJhbSBxdWFsaWZpZWRDbGFzc05hbWUKLQkgKiBAcmV0dXJuIExpc3RlbmVyIGluc3RhbmNlCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgY3JlYXRlTGlzdGVuZXIoU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSkgewotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAgKXsKLQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgaW5zdGFuY2UgYW5kIHNldCB1cCB0aGUgcGFyYW1ldGVycyBmcm9tIGRhdGEgbW9kZWwKLQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGlzdGVuZXIoKTsKLQkJCWxpc3RlbmVyLnNldExpc3RlbmVyQ2xhc3NOYW1lKHF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLQkJCS8vIEFkZCB0aGUgbGlzdGVuZXIgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbAotCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG1vZGVsT2JqZWN0OwotCQkJd2ViQXBwLmdldExpc3RlbmVycygpLmFkZChsaXN0ZW5lcik7Ci0JCQlyZXR1cm4gbGlzdGVuZXI7Ci0JCX0gZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgKXsKLQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgaW5zdGFuY2UgYW5kIHNldCB1cCB0aGUgcGFyYW1ldGVycyBmcm9tIGRhdGEgbW9kZWwKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciBsaXN0ZW5lciA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpc3RlbmVyKCk7Ci0JCQlsaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzKHF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLQkJCS8vIEFkZCB0aGUgbGlzdGVuZXIgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbAotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIG1vZGVsT2JqZWN0OwotCQkJd2ViQXBwLmdldExpc3RlbmVycygpLmFkZChsaXN0ZW5lcik7CQotCQkJcmV0dXJuIGxpc3RlbmVyOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWRkU2VydmxldE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZFNlcnZsZXRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1YzZjOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZFNlcnZsZXRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklUX1BBUkFNOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JU19TRVJWTEVUX1RZUEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVSTF9NQVBQSU5HUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ERVNDUklQVElPTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ESVNQTEFZX05BTUU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFlZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcywgQWRkU2VydmxldCBPcGVyYXRpb24gaXMgYSBJRGF0YU1vZGVsT3BlcmF0aW9uIGZvbGxvd2luZyB0aGUgSURhdGFNb2RlbCB3aXphcmQgYW5kCi0gKiBvcGVyYXRpb24gZnJhbWV3b3JrLgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogVGhpcyBvcGVyYXRpb24gc3ViY2xhc3NlcyB0aGUgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24gc28gdGhlIGNoYW5nZXMgbWFkZSB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gKiBtb2RlbHMgYXJlIHNhdmVkIHRvIHRoZSBhcnRpZmFjdCBlZGl0IG1vZGVsLgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uCi0gKiAKLSAqIEl0IGlzIHRoZSBvcGVyYXRpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBhZGRpbmcgYSBuZXcgc2VydmxldCB0bwotICogYSB3ZWIgYXBwLCB3aGV0aGVyIHRoYXQgYmUgYW4gYW5ub3RhdGVkIHNlcnZsZXQgb3IgYSBub24gYW5ub3RhdGVkIHNlcnZsZXQuICBUaGlzIHVzZXMgdGhlCi0gKiBOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlciB0byByZXRyaWV2ZSBwcm9wZXJ0aWVzIHNldCBieSB0aGUgdXNlciBpbiBvcmRlciB0byBjcmVhdGUgdGhlIGN1c3RvbQotICogc2VydmV0LgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBJbiB0aGUgbm9uIGFubm90YXRlZCBjYXNlLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGFkZCB0aGUgbWV0YWRhdGEgbmVjZXNzYXJ5IGludG8gdGhlIHdlYiBkZXBsb3ltZW50Ci0gKiBkZXNjcmlwdG9yLiAgSW4gdGhlIGFubm90YXRlZCBjYXNlLCBpdCB3aWxsIG5vdCwgaXQgd2lsbCBsZWF2ZSB0aGlzIHVwIHRvIHRoZSBwYXJzaW5nIG9mIHRoZQotICogYW5ub3RhdGlvbnMgdG8gYnVpbGQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhcnRpZmFjdHMuICBUbyBhY3R1YWxseSBjcmVhdGUgdGhlIGphdmEgY2xhc3MgZm9yCi0gKiB0aGUgc2VydmxldCwgdGhlIG9wZXJhdGlvbiB1c2VzIHRoZSBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24uIFRoZSBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24gCi0gKiBzaGFyZXMgdGhlIHNhbWUgZGF0YSBtb2RlbCBwcm92aWRlci4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3U2VydmxldENsYXNzT3BlcmF0aW9uCi0gKiAKLSAqIENsaWVudHMgbWF5IHN1YmNsYXNzIHRoaXMgb3BlcmF0aW9uIHRvIHByb3ZpZGUgdGhlaXIgb3duIGJlaGF2aW91ciBvbiBzZXJ2bGV0IGNyZWF0aW9uLiAgVGhlIGV4ZWN1dGUKLSAqIG1ldGhvZCBjYW4gYmUgZXh0ZW5kZWQgdG8gZG8gc28uIEFsc28sIGdlbmVyYXRlU2VydmxldE1ldGFEYXRhIGFuZCBjcmV0ZVNlcnZsZXRDbGFzcyBhcmUgZXhwb3NlZC4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWRkU2VydmxldE9wZXJhdGlvbiBleHRlbmRzIEFkZFdlYkNsYXNzT3BlcmF0aW9uIHsKLQkKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBvcGVyYXRpb24uCi0JICogSXQgd2lsbCBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVyLiAgSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogQHNlZSBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbiNBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbihJRGF0YU1vZGVsKQotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWwgCi0JICogQHJldHVybiBBZGRTZXJ2bGV0T3BlcmF0aW9uCi0JICovCi0JcHVibGljIEFkZFNlcnZsZXRPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbiBnZXROZXdDbGFzc09wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24oZ2V0RGF0YU1vZGVsKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZU1ldGFEYXRhKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUpIHsKLQkJYm9vbGVhbiBpc1NlcnZsZXRUeXBlID0gbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElTX1NFUlZMRVRfVFlQRSk7Ci0JCWdlbmVyYXRlTWV0YURhdGEobW9kZWwsIHF1YWxpZmllZENsYXNzTmFtZSwgaXNTZXJ2bGV0VHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlaXIgb3duIGdlbmVyYXRpb24gc3RlcHMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUKLQkgKiBtZXRhZGF0YSBmb3IgdGhlIHdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIEoyRUUgbW9kZWxzIHRvIGNyZWF0ZQotCSAqIHRoZSBTZXJ2bGV0IG1vZGVsIGluc3RhbmNlLCBhbnkgaW5pdCBwYXJhbXMgc3BlY2lmaWVkLCBhbmQgYW55IHNlcnZsZXQgbWFwcGluZ3MuICBJdCB0aGVuIGFkZHMgCi0JICogdGhlc2UgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbC4gIFRoaXMgd2lsbCB0aGVuIGJlIHdyaXR0ZW4gb3V0IHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgKiBmaWxlLiAgVGhpcyBtZXRob2QgZG9lcyBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVycy4KLQkgKiBAc2VlIFNlcnZsZXQKLQkgKiBAc2VlIEFkZFNlcnZsZXRPcGVyYXRpb24jY3JlYXRlU2VydmxldChTdHJpbmcsIGJvb2xlYW4pCi0JICogQHNlZSBBZGRTZXJ2bGV0T3BlcmF0aW9uI3NldFVwSW5pdFBhcmFtcyhMaXN0LCBTZXJ2bGV0KQotCSAqIEBzZWUgQWRkU2VydmxldE9wZXJhdGlvbiNzZXRVcFVSTE1hcHBpbmdzKExpc3QsIFNlcnZsZXQpCi0JICogCi0JICogQHBhcmFtIGFNb2RlbAotCSAqIEBwYXJhbSBxdWFsaWZpZWRDbGFzc05hbWUKLQkgKiBAcGFyYW0gaXNTZXJ2bGV0VHlwZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlTWV0YURhdGEoSURhdGFNb2RlbCBhTW9kZWwsIFN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUsIGJvb2xlYW4gaXNTZXJ2bGV0VHlwZSkgewotCQkvLyBTZXQgdXAgdGhlIHNlcnZsZXQgbW9kZWxsZWQgb2JqZWN0Ci0JCU9iamVjdCBzZXJ2bGV0ID0gY3JlYXRlU2VydmxldChxdWFsaWZpZWRDbGFzc05hbWUsIGlzU2VydmxldFR5cGUpOwotCi0JCS8vIFNldCB1cCB0aGUgSW5pdFBhcmFtcyBpZiBhbnkKLQkJTGlzdCBpbml0UGFyYW1MaXN0ID0gKExpc3QpIGFNb2RlbC5nZXRQcm9wZXJ0eShJTklUX1BBUkFNKTsKLQkJaWYgKGluaXRQYXJhbUxpc3QgIT0gbnVsbCkKLQkJCXNldFVwSW5pdFBhcmFtcyhpbml0UGFyYW1MaXN0LCBzZXJ2bGV0KTsKLQkJCi0JCS8vIFNldCB1cCB0aGUgc2VydmxldCBVUkwgbWFwcGluZ3MgaWYgYW55Ci0JCUxpc3QgdXJsTWFwcGluZ0xpc3QgPSAoTGlzdCkgYU1vZGVsLmdldFByb3BlcnR5KFVSTF9NQVBQSU5HUyk7Ci0JCWlmICh1cmxNYXBwaW5nTGlzdCAhPSBudWxsKQotCQkJc2V0VXBVUkxNYXBwaW5ncyh1cmxNYXBwaW5nTGlzdCwgc2VydmxldCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBwcml2YXRlIHVzZSBvbmx5LiAgVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjcmVhdGUgdGhlIHNlcnZsZXQKLQkgKiBtb2RlbGxlZCBvYmplY3QsIHRvIHNldCBhbnkgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgbW9kZWwsIGFuZCB0aGVuIHRvIGFkZCB0aGUKLQkgKiBzZXJ2bGV0IGluc3RhbmNlIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gbW9kZWwuICBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY2NwZXQgbnVsbCBwYXJhbWV0ZXJzLgotCSAqIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIEBzZWUgQWRkU2VydmxldE9wZXJhdGlvbiNnZW5lcmF0ZVNlcnZsZXRNZXRhRGF0YShOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwsIFN0cmluZywgYm9vbGVhbikKLQkgKiBAc2VlIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSNjcmVhdGVTZXJ2bGV0KCkKLQkgKiBAc2VlIFNlcnZsZXQKLQkgKiAKLQkgKiBAcGFyYW0gcXVhbGlmaWVkQ2xhc3NOYW1lCi0JICogQHBhcmFtIGlzU2VydmxldFR5cGUKLQkgKiBAcmV0dXJuIFNlcnZsZXQgaW5zdGFuY2UKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBjcmVhdGVTZXJ2bGV0KFN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUsIGJvb2xlYW4gaXNTZXJ2bGV0VHlwZSkgewotCQkvLyBHZXQgdmFsdWVzIGZyb20gZGF0YSBtb2RlbAotCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShESVNQTEFZX05BTUUpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShERVNDUklQVElPTik7Ci0JCQotCQkvLyBDcmVhdGUgdGhlIHNlcnZsZXQgaW5zdGFuY2UgYW5kIHNldCB1cCB0aGUgcGFyYW1ldGVycyBmcm9tIGRhdGEgbW9kZWwKLQkJT2JqZWN0IG1vZGVsT2JqZWN0ID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwKSB7Ci0JCQotCQkJU2VydmxldCBzZXJ2bGV0ID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0KCk7Ci0JCQlzZXJ2bGV0LnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLQkJCXNlcnZsZXQuc2V0U2VydmxldE5hbWUoZGlzcGxheU5hbWUpOwotCQkJc2VydmxldC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQkvLyBIYW5kbGUgc2VydmxldCBjYXNlCi0JCQlpZiAoaXNTZXJ2bGV0VHlwZSkgewotCQkJCVNlcnZsZXRUeXBlIHNlcnZsZXRUeXBlID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0VHlwZSgpOwotCQkJCXNlcnZsZXRUeXBlLnNldENsYXNzTmFtZShxdWFsaWZpZWRDbGFzc05hbWUpOwotCQkJCXNlcnZsZXQuc2V0V2ViVHlwZShzZXJ2bGV0VHlwZSk7Ci0JCQl9IAotCQkJLy8gSGFuZGxlIEpTUCBjYXNlCi0JCQllbHNlIHsKLQkJCQlKU1BUeXBlIGpzcFR5cGUgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUpTUFR5cGUoKTsKLQkJCQlqc3BUeXBlLnNldEpzcEZpbGUocXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQkJCQlzZXJ2bGV0LnNldFdlYlR5cGUoanNwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBBZGQgdGhlIHNlcnZsZXQgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbAotCQkJCi0JCQkvL1dlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpOwotCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG1vZGVsT2JqZWN0OwotCQkJd2ViQXBwLmdldFNlcnZsZXRzKCkuYWRkKHNlcnZsZXQpOwotCQkJcmV0dXJuIHNlcnZsZXQ7Ci0JCX0gZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIHsKLQkJCQotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCBzZXJ2bGV0ID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldCgpOwotCi0JCQlEaXNwbGF5TmFtZSBkaXNwbGF5TmFtZU9iaiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0JCQlkaXNwbGF5TmFtZU9iai5zZXRWYWx1ZShkaXNwbGF5TmFtZSk7Ci0JCQlzZXJ2bGV0LmdldERpc3BsYXlOYW1lcygpLmFkZChkaXNwbGF5TmFtZU9iaik7Ci0JCQkKLQkJCXNlcnZsZXQuc2V0U2VydmxldE5hbWUoZGlzcGxheU5hbWUpOwotCQkJCi0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb24gZGVzY3JpcHRpb25PYmogPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJc2VydmxldC5nZXREZXNjcmlwdGlvbnMoKS5hZGQoZGVzY3JpcHRpb25PYmopOwotCQkJCi0JCQkvLyBIYW5kbGUgc2VydmxldCBjYXNlCi0JCQlpZiAoaXNTZXJ2bGV0VHlwZSkgewotCQkJCXNlcnZsZXQuc2V0U2VydmxldENsYXNzKHF1YWxpZmllZENsYXNzTmFtZSk7Ci0JCQl9IAotCQkJLy8gSGFuZGxlIEpTUCBjYXNlCi0JCQllbHNlIHsKLQkJCQlzZXJ2bGV0LnNldEpzcEZpbGUocXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQkJCX0KLQkJCS8vIEFkZCB0aGUgc2VydmxldCB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIG1vZGVsCi0JCQkKLQkJCS8vV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIGFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCk7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxPYmplY3Q7Ci0JCQl3ZWJBcHAuZ2V0U2VydmxldHMoKS5hZGQoc2VydmxldCk7CQotCQkJcmV0dXJuIHNlcnZsZXQ7Ci0JCX0KLQkJLy8gUmV0dXJuIHRoZSBzZXJ2bGV0IGluc3RhbmNlCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFueSBpbml0IHBhcmFtcwotCSAqIGZvciB0aGUgbmV3IHNlcnZsZXQgbWV0YWRhdGEuICBJdCB3aWxsIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiAgVGhlIGluaXQgcGFyYW1zIGFyZQotCSAqIHNldCBvbiB0aGUgc2VydmxldCBtb2RlbGxlZCBvYmplY3QuCi0JICogQHNlZSBBZGRTZXJ2bGV0T3BlcmF0aW9uI2dlbmVyYXRlU2VydmxldE1ldGFEYXRhKE5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbCwgU3RyaW5nLCBib29sZWFuKQotCSAqIEBzZWUgV2ViYXBwbGljYXRpb25GYWN0b3J5I2NyZWF0ZUluaXRQYXJhbSgpCi0JICogCi0JICogQHBhcmFtIGluaXRQYXJhbUxpc3QKLQkgKiBAcGFyYW0gc2VydmxldAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRVcEluaXRQYXJhbXMoTGlzdCBpbml0UGFyYW1MaXN0LCBPYmplY3Qgc2VydmxldE9iaikgewotCQkvLyBHZXQgdGhlIHdlYiBhcHAgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YSBtb2RlbAotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBzZXJ2bGV0T2JqOwotCQkJCi0JCQkvLyBJZiBKMkVFIDEuNCwgYWRkIHRoZSBwYXJhbSB2YWx1ZSBhbmQgZGVzY3JpcHRpb24gaW5mbyBpbnN0YW5jZXMgdG8gdGhlIHNlcnZsZXQgaW5pdCBwYXJhbXMKLQkJCWlmICh3ZWJBcHAuZ2V0SjJFRVZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSB7Ci0JCQkJZm9yIChpbnQgaVAgPSAwOyBpUCA8IGluaXRQYXJhbUxpc3Quc2l6ZSgpOyBpUCsrKSB7Ci0JCQkJCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gKFN0cmluZ1tdKSBpbml0UGFyYW1MaXN0LmdldChpUCk7Ci0JCQkJCS8vIENyZWF0ZSAxLjQgY29tbW9uIHBhcmFtIHZhbHVlCi0JCQkJCVBhcmFtVmFsdWUgcGFyYW0gPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbVZhbHVlKCk7Ci0JCQkJCXBhcmFtLnNldE5hbWUoc3RyaW5nQXJyYXlbMF0pOwotCQkJCQlwYXJhbS5zZXRWYWx1ZShzdHJpbmdBcnJheVsxXSk7Ci0JCQkJCS8vIENyZWF0ZSAxLjQgY29tbW9uIGRlc2NyaXB0b24gdmFsdWUKLQkJCQkJRGVzY3JpcHRpb24gZGVzY3JpcHRpb25PYmogPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotCQkJCQlkZXNjcmlwdGlvbk9iai5zZXRWYWx1ZShzdHJpbmdBcnJheVsyXSk7Ci0JCQkJCS8vIFNldCB0aGUgZGVzY3JpcHRpb24gb24gdGhlIHBhcmFtCi0JCQkJCXBhcmFtLmdldERlc2NyaXB0aW9ucygpLmFkZChkZXNjcmlwdGlvbk9iaik7Ci0JCQkJCXBhcmFtLnNldERlc2NyaXB0aW9uKHN0cmluZ0FycmF5WzJdKTsKLQkJCQkJLy8gQWRkIHRoZSBwYXJhbSB0byB0aGUgc2VydmxldCBtb2RlbCBsaXN0IG9mIGluaXQgcGFyYW1zCi0JCQkJCXNlcnZsZXQuZ2V0SW5pdFBhcmFtcygpLmFkZChwYXJhbSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gSWYgSjJFRSAxLjIgb3IgMS4zLCB1c2UgdGhlIHNlcnZsZXQgc3BlY2lmaWMgaW5pdCBwYXJhbSBpbnN0YW5jZXMKLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGlQID0gMDsgaVAgPCBpbml0UGFyYW1MaXN0LnNpemUoKTsgaVArKykgewotCQkJCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IChTdHJpbmdbXSkgaW5pdFBhcmFtTGlzdC5nZXQoaVApOwotCQkJCQkvLyBDcmVhdGUgdGhlIHdlYiBpbml0IHBhcmFtCi0JCQkJCUluaXRQYXJhbSBpcCA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFBhcmFtKCk7Ci0JCQkJCS8vIFNldCB0aGUgcGFyYW0gbmFtZQotCQkJCQlpcC5zZXRQYXJhbU5hbWUoc3RyaW5nQXJyYXlbMF0pOwotCQkJCQkvLyBTZXQgdGhlIHBhcmFtIHZhbHVlCi0JCQkJCWlwLnNldFBhcmFtVmFsdWUoc3RyaW5nQXJyYXlbMV0pOwotCQkJCQkvLyBTZXQgdGhlIHBhcmFtIGRlc2NyaXB0aW9uCi0JCQkJCWlwLnNldERlc2NyaXB0aW9uKHN0cmluZ0FycmF5WzJdKTsKLQkJCQkJLy8gQWRkIHRoZSBpbml0IHBhcmFtIHRvIHRoZSBzZXJ2bGV0IG1vZGVsIGxpc3Qgb2YgcGFyYW1zCi0JCQkJCXNlcnZsZXQuZ2V0UGFyYW1zKCkuYWRkKGlwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIHsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCB3ZWJBcHAgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQgc2VydmxldCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0KSBzZXJ2bGV0T2JqOwotCi0JCQlmb3IgKGludCBpUCA9IDA7IGlQIDwgaW5pdFBhcmFtTGlzdC5zaXplKCk7IGlQKyspIHsKLQkJCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IChTdHJpbmdbXSkgaW5pdFBhcmFtTGlzdC5nZXQoaVApOwotCQkJCS8vIENyZWF0ZSAxLjQgY29tbW9uIHBhcmFtIHZhbHVlCi0JCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWUgcGFyYW09IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtVmFsdWUoKTsKLQkJCQlwYXJhbS5zZXRQYXJhbU5hbWUoc3RyaW5nQXJyYXlbMF0pOwotCQkJCXBhcmFtLnNldFBhcmFtVmFsdWUoc3RyaW5nQXJyYXlbMV0pOwotCi0JCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uT2JqID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKTsKLQkJCQlkZXNjcmlwdGlvbk9iai5zZXRWYWx1ZShzdHJpbmdBcnJheVsyXSk7Ci0JCQkJLy8gU2V0IHRoZSBkZXNjcmlwdGlvbiBvbiB0aGUgcGFyYW0KLQkJCQlwYXJhbS5nZXREZXNjcmlwdGlvbnMoKS5hZGQoZGVzY3JpcHRpb25PYmopOwotCQkJCS8vIEFkZCB0aGUgcGFyYW0gdG8gdGhlIHNlcnZsZXQgbW9kZWwgbGlzdCBvZiBpbml0IHBhcmFtcwotCQkJCXNlcnZsZXQuZ2V0SW5pdFBhcmFtcygpLmFkZChwYXJhbSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiAgVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjcmVhdGUgdGhlIHNlcnZsZXQKLQkgKiBtYXBwaW5nIG1vZGVsbGVkIG9iamVjdHMgc28gdGhlIG1ldGFkYXRhIGZvciB0aGUgc2VydmxldCBtYXBwaW5ncyBpcyBzdG9yZSBpbiB0aGUgd2ViCi0JICogZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhpcyBtZXRob2Qgd2lsbCBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVycy4gIFRoZSBzZXJ2bGV0IG1hcHBpbmdzCi0JICogYXJlIGFkZGVkIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gbW9kZWxsZWQgb2JqZWN0LgotCSAqIEBzZWUgQWRkU2VydmxldE9wZXJhdGlvbiNnZW5lcmF0ZVNlcnZsZXRNZXRhRGF0YShOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwsIFN0cmluZywgYm9vbGVhbikKLQkgKiBAc2VlIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSNjcmVhdGVTZXJ2bGV0TWFwcGluZygpCi0JICogCi0JICogQHBhcmFtIHVybE1hcHBpbmdMaXN0Ci0JICogQHBhcmFtIHNlcnZsZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VXBVUkxNYXBwaW5ncyhMaXN0IHVybE1hcHBpbmdMaXN0LCBPYmplY3Qgc2VydmxldE9iaikgewotCQkvLyBHZXQgdGhlIHdlYiBhcHAgbW9kZWxsZWQgb2JqZWN0IGZyb20gdGhlIGRhdGEgbW9kZWwKLQkJLy9XZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsKLQkJT2JqZWN0IG1vZGVsT2JqZWN0ID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQotCQkvLyBDcmVhdGUgdGhlIHNlcnZsZXQgbWFwcGluZ3MgaWYgYW55Ci0JCWlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCkgewkKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBtb2RlbE9iamVjdDsKLQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBzZXJ2bGV0T2JqOwotCQkJZm9yIChpbnQgaU0gPSAwOyBpTSA8IHVybE1hcHBpbmdMaXN0LnNpemUoKTsgaU0rKykgewotCQkJCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gKFN0cmluZ1tdKSB1cmxNYXBwaW5nTGlzdC5nZXQoaU0pOwotCQkJCS8vIENyZWF0ZSB0aGUgc2VydmxldCBtYXBwaW5nIGluc3RhbmNlIGZyb20gdGhlIHdlYiBmYWN0b3J5Ci0JCQkJU2VydmxldE1hcHBpbmcgbWFwcGluZyA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldE1hcHBpbmcoKTsKLQkJCQkvLyBTZXQgdGhlIHNlcnZsZXQgYW5kIHNlcnZsZXQgbmFtZQotCQkJCW1hcHBpbmcuc2V0U2VydmxldChzZXJ2bGV0KTsKLQkJCQltYXBwaW5nLnNldE5hbWUoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKTsKLQkJCQkvLyBTZXQgdGhlIFVSTCBwYXR0ZXJuIHRvIG1hcCB0aGUgc2VydmxldCB0bwotCQkJCW1hcHBpbmcuc2V0VXJsUGF0dGVybihzdHJpbmdBcnJheVswXSk7Ci0JCQkJLy8gQWRkIHRoZSBzZXJ2bGV0IG1hcHBpbmcgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbGxlZCBsaXN0Ci0JCQkJd2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpLmFkZChtYXBwaW5nKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgewotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIG1vZGVsT2JqZWN0OwotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCBzZXJ2bGV0ID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQpIHNlcnZsZXRPYmo7Ci0JCQkKLQkJCS8vIENyZWF0ZSB0aGUgc2VydmxldCBtYXBwaW5ncyBpZiBhbnkKLQkJCWlmICh1cmxNYXBwaW5nTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJLy8gQ3JlYXRlIHRoZSBzZXJ2bGV0IG1hcHBpbmcgaW5zdGFuY2UgZnJvbSB0aGUgd2ViIGZhY3RvcnkKLQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyBtYXBwaW5nID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldE1hcHBpbmcoKTsKLQotCQkJCW1hcHBpbmcuc2V0U2VydmxldE5hbWUoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHVybE1hcHBpbmdMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gKFN0cmluZ1tdKSB1cmxNYXBwaW5nTGlzdC5nZXQoaSk7Ci0JCQkJCS8vIFNldCB0aGUgVVJMIHBhdHRlcm4gdG8gbWFwIHRoZSBzZXJ2bGV0IHRvCi0JCQkJCVVybFBhdHRlcm5UeXBlIHVybCA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVybFBhdHRlcm5UeXBlKCk7Ci0JCQkJCXVybC5zZXRWYWx1ZShzdHJpbmdBcnJheVswXSk7Ci0JCQkJCW1hcHBpbmcuZ2V0VXJsUGF0dGVybnMoKS5hZGQodXJsKTsKLQkJCQl9Ci0JCQkJLy8gQWRkIHRoZSBzZXJ2bGV0IG1hcHBpbmcgdG8gdGhlIHdlYiBhcHBsaWNhdGlvbiBtb2RlbCBsaXN0Ci0JCQkJd2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpLmFkZChtYXBwaW5nKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZFdlYkNsYXNzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWRkV2ViQ2xhc3NPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3MGYyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWRkV2ViQ2xhc3NPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0REOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRV9FWElTVElOR19DTEFTUzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5BZGRKYXZhRUVBcnRpZmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0LklXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRXZWJDbGFzc09wZXJhdGlvbiBleHRlbmRzIEFkZEphdmFFRUFydGlmYWN0T3BlcmF0aW9uIHsKLQkKLQlwdWJsaWMgQWRkV2ViQ2xhc3NPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBhY3Rpb25zIGR1cmluZwotCSAqIGV4ZWN1dGlvbi4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleGVjdXRlIG1ldGhvZCBkcml2ZXMgdGhlIHJ1bm5pbmcgb2YKLQkgKiB0aGUgb3BlcmF0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uIHdpbGwgY3JlYXRlIHRoZSBmaWx0ZXIgY2xhc3MsIGFuZAotCSAqIHRoZW4gaXQgd2lsbCBjcmVhdGUgdGhlIGZpbHRlciBtZXRhZGF0YSBmb3IgdGhlIHdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIAotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYWNjZXB0IG51bGwgYXMgYSBwYXJhbWV0ZXIuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuQWJzdHJhY3RPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqIEBzZWUgQWRkRmlsdGVyT3BlcmF0aW9uI2NyZWF0ZUZpbHRlckNsYXNzKCkKLQkgKiBAc2VlIEFkZEZpbHRlck9wZXJhdGlvbiNnZW5lcmF0ZUZpbHRlck1ldGFEYXRhKE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsLAotCSAqICAgICAgU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIGluZm8KLQkgKiAgICAgICAgICAgIElBZGFwdGFibGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQotCSAgICBib29sZWFuIHVzZUV4aXN0aW5nID0gbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9FWElTVElOR19DTEFTUyk7Ci0JCVN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDTEFTU19OQU1FKTsKLQotCQkvLyBjcmVhdGUgdGhlIGphdmEgY2xhc3MKLQkJaWYgKCF1c2VFeGlzdGluZykgCi0JCQlxdWFsaWZpZWRDbGFzc05hbWUgPSBjcmVhdGVDbGFzcygpOwotCi0JCS8vIElmIHRoZSBmaWx0ZXIgaXMgbm90IGFubm90YXRlZCwgZ2VuZXJhdGUgdGhlIGZpbHRlciBtZXRhZGF0YSBmb3IgdGhlIERECi0JCWlmICghbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9BTk5PVEFUSU9OUykpCi0JCXsKLQkJCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoR0VORVJBVEVfREQpKQotCQkJewotCQkJCUlEYXRhTW9kZWwgZGRNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKElXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmNsYXNzKTsKLQkJCQlkZE1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9QUk9KRUNULCBnZXRUYXJnZXRQcm9qZWN0KCkpOwotCQkJCWRkTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCQl9Ci0JCQlnZW5lcmF0ZU1ldGFEYXRhKG1vZGVsLCBxdWFsaWZpZWRDbGFzc05hbWUpOwotCQl9Ci0JCQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZU1ldGFEYXRhKElEYXRhTW9kZWwgYU1vZGVsLCBTdHJpbmcgcXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9DcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMjNmYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQUJTVFJBQ1RfTUVUSE9EUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ERVNUUk9ZOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX0ZJTFRFUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5GSUxURVJfTUFQUElOR1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5JVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklUX1BBUkFNOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuREVTVFJPWV9TSUdOQVRVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5ET19GSUxURVJfU0lHTkFUVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuRklMVEVSX0lOSVRfU0lHTkFUVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuTUVUSE9EX0RFU1RST1k7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfRE9fRklMVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuTUVUSE9EX0lOSVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfRklMVEVSX0NIQUlOOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0ZJTFRFUl9DT05GSUc7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfSU9fRVhDRVBUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfRVhDRVBUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFU1BPTlNFOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbCBleHRlbmRzIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU0NSSVBUSU9OID0gMjsKLQotCXB1YmxpYyBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW1wb3J0cygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBzdXBlci5nZXRJbXBvcnRzKCk7Ci0JCQotCQlpZiAoc2hvdWxkR2VuSW5pdCgpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfRklMVEVSX0NPTkZJRyk7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9FWENFUFRJT04pOwotCQl9Ci0JCQotCQlpZiAoc2hvdWxkR2VuRG9GaWx0ZXIoKSkgewotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVCk7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9SRVNQT05TRSk7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfRklMVEVSX0NIQUlOKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9JT19FWENFUFRJT04pOwotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX1NFUlZMRVRfRVhDRVBUSU9OKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJvcGVydHkoQ0xBU1NfTkFNRSkudHJpbSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkluaXQoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfSU5JVCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuRG9GaWx0ZXIoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfRE9fRklMVEVSKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5EZXN0cm95KCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RFU1RST1kpOwotCX0KLQotCXB1YmxpYyBMaXN0PFN0cmluZ1tdPiBnZXRJbml0UGFyYW1zKCkgewotCQlyZXR1cm4gKExpc3QpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJTklUX1BBUkFNKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRQYXJhbShpbnQgaW5kZXgsIGludCB0eXBlKSB7Ci0JCUxpc3Q8U3RyaW5nW10+IHBhcmFtcyA9IGdldEluaXRQYXJhbXMoKTsKLQkJaWYgKGluZGV4IDwgcGFyYW1zLnNpemUoKSkgewotCQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBwYXJhbXMuZ2V0KGluZGV4KTsKLQkJCXJldHVybiBzdHJpbmdBcnJheVt0eXBlXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxJRmlsdGVyTWFwcGluZ0l0ZW0+IGdldEZpbHRlck1hcHBpbmdzKCkgewotCQlyZXR1cm4gKExpc3Q8SUZpbHRlck1hcHBpbmdJdGVtPikgZGF0YU1vZGVsLmdldFByb3BlcnR5KEZJTFRFUl9NQVBQSU5HUyk7Ci0JfQotCi0JcHVibGljIElGaWx0ZXJNYXBwaW5nSXRlbSBnZXRGaWx0ZXJNYXBwaW5nKGludCBpbmRleCkgewotCQlMaXN0PElGaWx0ZXJNYXBwaW5nSXRlbT4gbWFwcGluZ3MgPSBnZXRGaWx0ZXJNYXBwaW5ncygpOwotCQlpZiAoaW5kZXggPCBtYXBwaW5ncy5zaXplKCkpIHsKLQkJICAgIHJldHVybiBtYXBwaW5ncy5nZXQoaW5kZXgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERpc3BhdGNoZXJMaXN0KElGaWx0ZXJNYXBwaW5nSXRlbSBtYXBwaW5nKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQlpbnQgZGlzcGF0Y2hlcnMgPSBtYXBwaW5nLmdldERpc3BhdGNoZXJzKCk7Ci0JCWlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uUkVRVUVTVCkgPiAwKSB7Ci0gICAgICAgICAgICBsaXN0LmFkZChEaXNwYXRjaGVyVHlwZS5SRVFVRVNUX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLkZPUldBUkQpID4gMCkgewotICAgICAgICAgICAgbGlzdC5hZGQoRGlzcGF0Y2hlclR5cGUuRk9SV0FSRF9MSVRFUkFMLmdldExpdGVyYWwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5JTkNMVURFKSA+IDApIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKERpc3BhdGNoZXJUeXBlLklOQ0xVREVfTElURVJBTC5nZXRMaXRlcmFsKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uRVJST1IpID4gMCkgewotICAgICAgICAgICAgbGlzdC5hZGQoRGlzcGF0Y2hlclR5cGUuRVJST1JfTElURVJBTC5nZXRMaXRlcmFsKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAlidWlsZGVyLmFwcGVuZChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICAJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAJCWJ1aWxkZXIuYXBwZW5kKCIsIik7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLQkJCi0JCXJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJaWYgKGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoQUJTVFJBQ1RfTUVUSE9EUykpIHsKLQkJCWlmIChtZXRob2ROYW1lLmVxdWFscyhNRVRIT0RfSU5JVCkpCi0JCQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSU5JVCk7Ci0JCQllbHNlIGlmIChtZXRob2ROYW1lLmVxdWFscyhNRVRIT0RfRE9fRklMVEVSKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShET19GSUxURVIpOwotCQkJZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHMoTUVUSE9EX0RFU1RST1kpKQotCQkJCXJldHVybiBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KERFU1RST1kpOwotCQl9CQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2Q+IGdldFVuaW1wbGVtZW50ZWRNZXRob2RzKCkgewotCQlDb2xsZWN0aW9uPE1ldGhvZD4gdW5pbXBsZW1lbnRlZE1ldGhvZHMgPSBzdXBlci5nZXRVbmltcGxlbWVudGVkTWV0aG9kcygpOwotCQlJdGVyYXRvcjxNZXRob2Q+IGl0ZXJhdG9yID0gdW5pbXBsZW1lbnRlZE1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1ldGhvZCBtZXRob2QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoKE1FVEhPRF9JTklULmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBGSUxURVJfSU5JVF9TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8IAotCQkJCQkoTUVUSE9EX0RFU1RST1kuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpICYmIERFU1RST1lfU0lHTkFUVVJFLmVxdWFscyhtZXRob2QuZ2V0U2lnbmF0dXJlKCkpKSB8fAotCQkJCQkoTUVUSE9EX0RPX0ZJTFRFUi5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgRE9fRklMVEVSX1NJR05BVFVSRS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNkZDRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9DcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQUNUSVZBVElPTl9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9CSU5ESU5HX0VWRU5UOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9CSU5ESU5HX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9FVkVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9DT05URVhUX0FUVFJJQlVURV9FVkVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9FVkVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0FUVFJJQlVURV9FVkVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9FVkVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfTElTVEVORVI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbCBleHRlbmRzIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCB7Ci0JCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbXBvcnRzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IHN1cGVyLmdldEltcG9ydHMoKTsKLQkJCi0JCWlmIChpbXBsZW1lbnRTZXJ2bGV0Q29udGV4dExpc3RlbmVyKCkpIHsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfTElTVEVORVIpOwotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9FVkVOVCk7Ci0JCX0KLQkJCi0JCWlmIChpbXBsZW1lbnRTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyKCkpIHsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0VWRU5UKTsKLQkJfQotCQkKLQkJaWYgKGltcGxlbWVudEh0dHBTZXNzaW9uTGlzdGVuZXIoKSkgewotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9MSVNURU5FUik7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0VWRU5UKTsKLQkJfQotCQkKLQkJaWYgKGltcGxlbWVudEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIoKSkgewotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9BVFRSSUJVVEVfTElTVEVORVIpOwotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9CSU5ESU5HX0VWRU5UKTsKLQkJfQotCQkKLQkJaWYgKGltcGxlbWVudEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyKCkpIHsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQUNUSVZBVElPTl9MSVNURU5FUik7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0VWRU5UKTsKLQkJfQotCQkKLQkJaWYgKGltcGxlbWVudEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyKCkpIHsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQklORElOR19MSVNURU5FUik7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0JJTkRJTkdfRVZFTlQpOwotCQl9Ci0JCQotCQlpZiAoaW1wbGVtZW50U2VydmxldFJlcXVlc3RMaXN0ZW5lcigpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0xJU1RFTkVSKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfRVZFTlQpOwotCQl9Ci0JCQotCQlpZiAoaW1wbGVtZW50U2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lcigpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0FUVFJJQlVURV9MSVNURU5FUik7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0FUVFJJQlVURV9FVkVOVCk7Ci0JCX0KLQkJCi0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBDcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbXBsZW1lbnRTZXJ2bGV0Q29udGV4dExpc3RlbmVyKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW50ZXJmYWNlKFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfTElTVEVORVIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpbXBsZW1lbnRTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW50ZXJmYWNlKFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaW1wbGVtZW50SHR0cFNlc3Npb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGltcGxlbWVudEludGVyZmFjZShRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0xJU1RFTkVSKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaW1wbGVtZW50SHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGltcGxlbWVudEludGVyZmFjZShRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0FUVFJJQlVURV9MSVNURU5FUik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGltcGxlbWVudEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW50ZXJmYWNlKFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQUNUSVZBVElPTl9MSVNURU5FUik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGltcGxlbWVudEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW50ZXJmYWNlKFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQklORElOR19MSVNURU5FUik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGltcGxlbWVudFNlcnZsZXRSZXF1ZXN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbnRlcmZhY2UoUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9MSVNURU5FUik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGltcGxlbWVudFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbnRlcmZhY2UoUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9BVFRSSUJVVEVfTElTVEVORVIpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaW1wbGVtZW50SW50ZXJmYWNlKFN0cmluZyBpZmFjZSkgewotCQlMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IGdldFF1YWxpZmllZEludGVyZmFjZXMoKTsKLQkJaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGludGVyZmFjZXMuY29udGFpbnMoaWZhY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9DcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGQ0OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBLaXJpbCBNaXRvdiwgay5taXRvdkBzYXAuY29tCS0gYnVnIDIwNDE2MAotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNiwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkFCU1RSQUNUX01FVEhPRFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU1RST1k7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX0RFTEVURTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fR0VUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19IRUFEOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19PUFRJT05TOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19QT1NUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19QVVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX1RSQUNFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5HRVRfU0VSVkxFVF9DT05GSUc7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFVF9TRVJWTEVUX0lORk87Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVRfUEFSQU07Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVSTF9NQVBQSU5HUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkRFU1RST1lfU0lHTkFUVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuRE9fREVMRVRFX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkRPX0dFVF9TSUdOQVRVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5ET19IRUFEX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkRPX1BPU1RfU0lHTkFUVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuRE9fUFVUX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkRPX1RSQUNFX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkdFVF9TRVJWTEVUX0NPTkZJR19TSUdOQVRVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5HRVRfU0VSVkxFVF9JTkZPX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLkhUVFBfU0VSVklDRV9TSUdOQVRVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfREVTVFJPWTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9ET19ERUxFVEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfRE9fR0VUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuTUVUSE9EX0RPX0hFQUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfRE9fT1BUSU9OUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9ET19QT1NUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuTUVUSE9EX0RPX1BVVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9ET19UUkFDRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9HRVRfU0VSVkxFVF9DT05GSUc7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfR0VUX1NFUlZMRVRfSU5GTzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9JTklUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuTUVUSE9EX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfVE9fU1RSSU5HOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVNQT05TRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9JT19FWENFUFRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9DT05GSUc7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9FWENFUFRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVTUE9OU0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5TRVJWSUNFX1NJR05BVFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlNFUlZMRVRfSU5JVF9TSUdOQVRVUkU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwgZXh0ZW5kcyBDcmVhdGVXZWJDbGFzc1RlbXBsYXRlTW9kZWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU0NSSVBUSU9OID0gMjsKLQkKLQlwdWJsaWMgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbXBvcnRzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IHN1cGVyLmdldEltcG9ydHMoKTsKLQkJCi0JCWlmIChzaG91bGRHZW5Jbml0KCkpIHsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX0NPTkZJRyk7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9FWENFUFRJT04pOwotCQl9Ci0JCQotCQlpZiAoc2hvdWxkR2VuR2V0U2VydmxldENvbmZpZygpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9DT05GSUcpOwotCQl9Ci0JCQotCQlpZiAoc2hvdWxkR2VuU2VydmljZSgpKSB7Ci0JCQlpZiAoaXNIdHRwU2VydmxldFN1cGVyY2xhc3MoKSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9IVFRQX1NFUlZMRVRfUkVRVUVTVCk7Ci0JCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVNQT05TRSk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1QpOwotCQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9TRVJWTEVUX1JFU1BPTlNFKTsKLQkJCX0KLQkJCQotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX1NFUlZMRVRfRVhDRVBUSU9OKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9JT19FWENFUFRJT04pOwotCQl9Ci0JCQotCQlpZiAoc2hvdWxkR2VuRG9HZXQoKSB8fCBzaG91bGRHZW5Eb1Bvc3QoKSB8fCBzaG91bGRHZW5Eb1B1dCgpIHx8IAotCQkJCXNob3VsZEdlbkRvRGVsZXRlKCkgfHwgc2hvdWxkR2VuRG9IZWFkKCkgfHwgCi0JCQkJc2hvdWxkR2VuRG9PcHRpb25zKCkgfHwgc2hvdWxkR2VuRG9UcmFjZSgpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfSFRUUF9TRVJWTEVUX1JFUVVFU1QpOwotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVNQT05TRSk7Ci0JCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9FWENFUFRJT04pOwotCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0lPX0VYQ0VQVElPTik7Ci0JCX0KLQkJCi0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldE5hbWUoKSB7Ci0JCXJldHVybiBzdXBlci5nZXREaXNwbGF5TmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDbGFzc05hbWUoKX0gaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIHBvc3QgV1RQCi0JICogICAgICAgICAgICAgMy4wLgotCSAqIAotCSAqIEBzZWUgQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsI2dldENsYXNzTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2xhc3NOYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuSW5pdCgpIHsKLQkJcmV0dXJuIGltcGxlbWVudEltcGxlbWVudGVkTWV0aG9kKE1FVEhPRF9JTklUKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5EZXN0cm95KCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RFU1RST1kpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkdldFNlcnZsZXRDb25maWcoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfR0VUX1NFUlZMRVRfQ09ORklHKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5HZXRTZXJ2bGV0SW5mbygpIHsKLQkJcmV0dXJuIGltcGxlbWVudEltcGxlbWVudGVkTWV0aG9kKE1FVEhPRF9HRVRfU0VSVkxFVF9JTkZPKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5TZXJ2aWNlKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX1NFUlZJQ0UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkRvR2V0KCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RPX0dFVCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuRG9Qb3N0KCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RPX1BPU1QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkRvUHV0KCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RPX1BVVCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuRG9EZWxldGUoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfRE9fREVMRVRFKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5Eb0hlYWQoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfRE9fSEVBRCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuRG9PcHRpb25zKCkgewotCQlyZXR1cm4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoTUVUSE9EX0RPX09QVElPTlMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkRvVHJhY2UoKSB7Ci0JCXJldHVybiBpbXBsZW1lbnRJbXBsZW1lbnRlZE1ldGhvZChNRVRIT0RfRE9fVFJBQ0UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRHZW5Ub1N0cmluZygpIHsKLQkJcmV0dXJuIGltcGxlbWVudEltcGxlbWVudGVkTWV0aG9kKE1FVEhPRF9UT19TVFJJTkcpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJpY1NlcnZsZXRTdXBlcmNsYXNzKCkgewotCQlyZXR1cm4gU2VydmxldFN1cGVydHlwZXNWYWxpZGF0b3IuaXNHZW5lcmljU2VydmxldFN1cGVyY2xhc3MoZGF0YU1vZGVsKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNIdHRwU2VydmxldFN1cGVyY2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0h0dHBTZXJ2bGV0U3VwZXJjbGFzcyhkYXRhTW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxTdHJpbmdbXT4gZ2V0SW5pdFBhcmFtcygpIHsKLQkJcmV0dXJuIChMaXN0KSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkoSU5JVF9QQVJBTSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbml0UGFyYW0oaW50IGluZGV4LCBpbnQgdHlwZSkgewotCQlMaXN0PFN0cmluZ1tdPiBwYXJhbXMgPSBnZXRJbml0UGFyYW1zKCk7Ci0JCWlmIChpbmRleCA8IHBhcmFtcy5zaXplKCkpIHsKLQkJCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gcGFyYW1zLmdldChpbmRleCk7Ci0JCQlyZXR1cm4gc3RyaW5nQXJyYXlbdHlwZV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3Q8U3RyaW5nW10+IGdldFNlcnZsZXRNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChMaXN0KSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkoVVJMX01BUFBJTkdTKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRNYXBwaW5nKGludCBpbmRleCkgewotCQlMaXN0PFN0cmluZ1tdPiBtYXBwaW5ncyA9IGdldFNlcnZsZXRNYXBwaW5ncygpOwotCQlpZiAoaW5kZXggPCBtYXBwaW5ncy5zaXplKCkpIHsKLQkJCVN0cmluZ1tdIG1hcCA9IG1hcHBpbmdzLmdldChpbmRleCk7Ci0JCQlyZXR1cm4gbWFwWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldERlc2NyaXB0aW9uKCl9IGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBwb3N0Ci0JICogICAgICAgICAgICAgV1RQIDMuMC4KLQkgKiAKLQkgKiBAc2VlIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBzdXBlci5nZXREZXNjcmlwdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGltcGxlbWVudEltcGxlbWVudGVkTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCWlmIChkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KEFCU1RSQUNUX01FVEhPRFMpKSB7Ci0JCQlpZiAobWV0aG9kTmFtZS5lcXVhbHMoTUVUSE9EX0lOSVQpKQotCQkJCXJldHVybiBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElOSVQpOwotCQkJZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHMoTUVUSE9EX0RFU1RST1kpKQotCQkJCXJldHVybiBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KERFU1RST1kpOwotCQkJZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHMoTUVUSE9EX0dFVF9TRVJWTEVUX0NPTkZJRykpCi0JCQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoR0VUX1NFUlZMRVRfQ09ORklHKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9HRVRfU0VSVkxFVF9JTkZPKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShHRVRfU0VSVkxFVF9JTkZPKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9TRVJWSUNFKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShTRVJWSUNFKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9ET19HRVQpKQotCQkJCXJldHVybiBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KERPX0dFVCk7Ci0JCQllbHNlIGlmIChtZXRob2ROYW1lLmVxdWFscyhNRVRIT0RfRE9fUE9TVCkpCi0JCQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoRE9fUE9TVCk7Ci0JCQllbHNlIGlmIChtZXRob2ROYW1lLmVxdWFscyhNRVRIT0RfRE9fUFVUKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShET19QVVQpOwotCQkJZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHMoTUVUSE9EX0RPX0RFTEVURSkpCi0JCQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoRE9fREVMRVRFKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9ET19IRUFEKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShET19IRUFEKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9ET19PUFRJT05TKSkKLQkJCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShET19PUFRJT05TKTsKLQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9ET19UUkFDRSkpCi0JCQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoRE9fVFJBQ0UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2Q+IGdldFVuaW1wbGVtZW50ZWRNZXRob2RzKCkgewotCQlDb2xsZWN0aW9uPE1ldGhvZD4gdW5pbXBsZW1lbnRlZE1ldGhvZHMgPSBzdXBlci5nZXRVbmltcGxlbWVudGVkTWV0aG9kcygpOwotCQlJdGVyYXRvcjxNZXRob2Q+IGl0ZXJhdG9yID0gdW5pbXBsZW1lbnRlZE1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1ldGhvZCBtZXRob2QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoKE1FVEhPRF9JTklULmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBTRVJWTEVUX0lOSVRfU0lHTkFUVVJFLmVxdWFscyhtZXRob2QuZ2V0U2lnbmF0dXJlKCkpKSB8fCAKLQkJCQkJKE1FVEhPRF9ERVNUUk9ZLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBERVNUUk9ZX1NJR05BVFVSRS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkgfHwKLQkJCQkJKE1FVEhPRF9HRVRfU0VSVkxFVF9DT05GSUcuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpICYmIEdFVF9TRVJWTEVUX0NPTkZJR19TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8Ci0JCQkJCShNRVRIT0RfR0VUX1NFUlZMRVRfSU5GTy5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgR0VUX1NFUlZMRVRfSU5GT19TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8Ci0JCQkJCShNRVRIT0RfU0VSVklDRS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgU0VSVklDRV9TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8Ci0JCQkJCShNRVRIT0RfU0VSVklDRS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgSFRUUF9TRVJWSUNFX1NJR05BVFVSRS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkgfHwKLQkJCQkJKE1FVEhPRF9ET19HRVQuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpICYmIERPX0dFVF9TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8Ci0JCQkJCShNRVRIT0RfRE9fUE9TVC5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgRE9fUE9TVF9TSUdOQVRVUkUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpIHx8Ci0JCQkJCShNRVRIT0RfRE9fUFVULmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBET19QVVRfU0lHTkFUVVJFLmVxdWFscyhtZXRob2QuZ2V0U2lnbmF0dXJlKCkpKSB8fAotCQkJCQkoTUVUSE9EX0RPX0RFTEVURS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgRE9fREVMRVRFX1NJR05BVFVSRS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkgfHwKLQkJCQkJKE1FVEhPRF9ET19IRUFELmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBET19IRUFEX1NJR05BVFVSRS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkgfHwKLQkJCQkJKE1FVEhPRF9ET19PUFRJT05TLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBNRVRIT0RfRE9fT1BUSU9OUy5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkgfHwKLQkJCQkJKE1FVEhPRF9ET19UUkFDRS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgJiYgRE9fVFJBQ0VfU0lHTkFUVVJFLmVxdWFscyhtZXRob2QuZ2V0U2lnbmF0dXJlKCkpKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdW5pbXBsZW1lbnRlZE1ldGhvZHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYTA4YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQ2FybCBBbmRlcnNvbiwgY2NjQHVzLmlibS5jb20gLSBoYW5kbGUgbnVsbCBzdXBlcmNsYXNzIChubyBydW50aW1lKSAoYnVnIDIxNDk1MCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTQ1JJUFRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRElTUExBWV9OQU1FOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCBleHRlbmRzCi0JCUNyZWF0ZUphdmFFRUFydGlmYWN0VGVtcGxhdGVNb2RlbCB7Ci0JCi0JcHVibGljIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KERJU1BMQVlfTkFNRSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoREVTQ1JJUFRJT04pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfQU5OT1RBVElPTlMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0ZpbHRlck1hcHBpbmdJdGVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvRmlsdGVyTWFwcGluZ0l0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzMWEwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvRmlsdGVyTWFwcGluZ0l0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEZpbHRlck1hcHBpbmdJdGVtIGltcGxlbWVudHMgSUZpbHRlck1hcHBpbmdJdGVtIHsKLSAgICAKLSAgICBwcml2YXRlIGludCBtYXBwaW5nVHlwZTsKLSAgICBwcml2YXRlIGludCBkaXNwYXRjaGVyczsKLSAgICBwcml2YXRlIFN0cmluZyBtYXBwaW5nOwotICAgIAotICAgIHB1YmxpYyBGaWx0ZXJNYXBwaW5nSXRlbShpbnQgdHlwZSwgU3RyaW5nIG1hcHBpbmcpIHsKLSAgICAgICAgbWFwcGluZ1R5cGUgPSB0eXBlOwotICAgICAgICB0aGlzLm1hcHBpbmcgPSBtYXBwaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWx0ZXJNYXBwaW5nSXRlbShpbnQgdHlwZSwgU3RyaW5nIG1hcHBpbmcsIGludCBkaXNwYXRjaGVycykgewotICAgICAgICB0aGlzKHR5cGUsIG1hcHBpbmcpOwotICAgICAgICB0aGlzLmRpc3BhdGNoZXJzID0gZGlzcGF0Y2hlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRNYXBwaW5nVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdUeXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VybFBhdHRlcm5UeXBlKCkgewotICAgIAlyZXR1cm4gbWFwcGluZ1R5cGUgPT0gSUZpbHRlck1hcHBpbmdJdGVtLlVSTF9QQVRURVJOOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZsZXROYW1lVHlwZSgpIHsKLSAgICAJcmV0dXJuIG1hcHBpbmdUeXBlID09IElGaWx0ZXJNYXBwaW5nSXRlbS5TRVJWTEVUX05BTUU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXREaXNwYXRjaGVycygpIHsKLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGF0Y2hlcnNBc1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgUkVRVUVTVCkgPiAwKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRJU1BBVENIRVJfUiIpICsgIiAiOyAKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgRk9SV0FSRCkgPiAwKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRJU1BBVENIRVJfRiIpICsgIiAiOyAKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSU5DTFVERSkgPiAwKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRJU1BBVENIRVJfSSIpICsgIiAiOyAKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgRVJST1IpID4gMCkgewotICAgICAgICAgICAgcmVzdWx0ICs9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJESVNQQVRDSEVSX0UiKSArICIgIjsgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50cmltKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGluZzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9GaWx0ZXJTdXBlcnR5cGVzVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvRmlsdGVyU3VwZXJ0eXBlc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjdjNTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9GaWx0ZXJTdXBlcnR5cGVzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9GSUxURVI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBGaWx0ZXJTdXBlcnR5cGVzVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdXBlcnR5cGVzVmFsaWRhdG9yIHsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaWx0ZXJTdXBlcmNsYXNzKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCWlmIChoYXNTdXBlckludGVyZmFjZShkYXRhTW9kZWwsIGdldFN1cGVyY2xhc3MoZGF0YU1vZGVsKSwgUVVBTElGSUVEX0ZJTFRFUikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWZvciAoT2JqZWN0IGlmYWNlIDogZ2V0SW50ZXJmYWNlcyhkYXRhTW9kZWwpKSB7Ci0JCQlpZiAoaGFzU3VwZXJJbnRlcmZhY2UoZGF0YU1vZGVsLCAoU3RyaW5nKSBpZmFjZSwgUVVBTElGSUVEX0ZJTFRFUikpIAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvRmlsdGVyVGVtcGxhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9GaWx0ZXJUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWU1M2FiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9GaWx0ZXJUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVyVGVtcGxhdGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbmw7Ci0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZpbHRlclRlbXBsYXRlIGNyZWF0ZShTdHJpbmcgbGluZVNlcGFyYXRvcikKLSAgewotICAgIG5sID0gbGluZVNlcGFyYXRvcjsKLSAgICBGaWx0ZXJUZW1wbGF0ZSByZXN1bHQgPSBuZXcgRmlsdGVyVGVtcGxhdGUoKTsKLSAgICBubCA9IG51bGw7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgTkwgPSBubCA9PSBudWxsID8gKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpIDogbmw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xID0gInBhY2thZ2UgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zID0gTkw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80ID0gTkwgKyAiaW1wb3J0ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81ID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNiA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOCA9ICIvKioiICsgTkwgKyAiICogU2VydmxldCBGaWx0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzkgPSBOTCArICIgKiIgKyBOTCArICIgKiBAd2ViLmZpbHRlciIgKyBOTCArICIgKiAgIG5hbWU9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTAgPSAiXCIiICsgTkwgKyAiICogICBkaXNwbGF5LW5hbWU9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTEgPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTIgPSBOTCArICIgKiAgIGRlc2NyaXB0aW9uPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEzID0gIlwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE0ID0gTkwgKyAiICoiICsgTkwgKyAiICogQHdlYi5maWx0ZXItbWFwcGluZyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNSA9IE5MICsgIiAqICAgdXJsLXBhdHRlcm49XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTYgPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSBOTCArICIgKiAgIHNlcnZsZXQtbmFtZT1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOCA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOSA9IE5MICsgIiAqICAgZGlzcGF0Y2hlcj1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMCA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMSA9IE5MICsgIiAqIiArIE5MICsgIiAqIEB3ZWIuZmlsdGVyLWluaXQtcGFyYW0iICsgTkwgKyAiICogICAgbmFtZT1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMiA9ICJcIiIgKyBOTCArICIgKiAgICB2YWx1ZT1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMyA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNCA9IE5MICsgIiAqICAgIGRlc2NyaXB0aW9uPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI1ID0gIlwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gTkwgKyAiICovIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI3ID0gTkwgKyAicHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yOCA9ICJhYnN0cmFjdCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjkgPSAiZmluYWwgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMwID0gImNsYXNzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMSA9ICIgZXh0ZW5kcyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzIgPSAiIGltcGxlbWVudHMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMzID0gIiwgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM0ID0gIiB7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM1ID0gTkwgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNiA9ICIoKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM3ID0gTkwgKyAiICAgICAgICIgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBAc2VlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOCA9ICIjIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM5ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDAgPSAiKSIgKyBOTCArICIgICAgICovIiArIE5MICsgIiAgICBwdWJsaWMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQxID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDIgPSAiKSB7IiArIE5MICsgIiAgICAgICAgc3VwZXIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQzID0gIik7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ0ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICIgICAgICogQHNlZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDUgPSAiIyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NiA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ3ID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80OCA9ICIgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ5ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTAgPSAiKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MSA9IE5MICsgIlx0XHRcdHJldHVybiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTIgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MyA9IE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU0ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgRmlsdGVyI2Rlc3Ryb3koKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NSA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEZpbHRlciNkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCwgU2VydmxldFJlc3BvbnNlLCBGaWx0ZXJDaGFpbikiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEZpbHRlckNoYWluIGNoYWluKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdFx0Ly8gcGxhY2UgeW91ciBjb2RlIGhlcmUiICsgTkwgKyAiIiArIE5MICsgIlx0XHQvLyBwYXNzIHRoZSByZXF1ZXN0IGFsb25nIHRoZSBmaWx0ZXIgY2hhaW4iICsgTkwgKyAiXHRcdGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU2ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgRmlsdGVyI2luaXQoRmlsdGVyQ29uZmlnKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU3ID0gTkwgKyBOTCArICJ9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU4ID0gTkw7Ci0KLSAgcHVibGljIFN0cmluZyBnZW5lcmF0ZShPYmplY3QgYXJndW1lbnQpCi0gIHsKLSAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAKLSAgICAKLQltb2RlbC5yZW1vdmVGbGFncyhDcmVhdGVKYXZhRUVBcnRpZmFjdFRlbXBsYXRlTW9kZWwuRkxBR19RVUFMSUZJRURfU1VQRVJDTEFTU19OQU1FKTsgCi0KLSAgICAKLQlpZiAobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkgIT0gbnVsbCAmJiBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKS5sZW5ndGgoKSA+IDApIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yKTsKLSAgICAKLQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMyk7Ci0gICAgIAotCUNvbGxlY3Rpb248U3RyaW5nPiBpbXBvcnRzID0gbW9kZWwuZ2V0SW1wb3J0cygpOwotCWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBhbkltcG9ydCApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81KTsKLSAgICAgCi0JfQotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKTsKLSAgICAgCi0JaWYgKG1vZGVsLmlzQW5ub3RhdGVkKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0RmlsdGVyTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRGaWx0ZXJOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTEpOwotICAgIAotCQlpZiAobW9kZWwuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsICYmIG1vZGVsLmdldERlc2NyaXB0aW9uKCkubGVuZ3RoKCkgPiAwKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEyKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXREZXNjcmlwdGlvbigpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEzKTsKLSAgICAgCi0JCX0gCi0JCQotCQlMaXN0PElGaWx0ZXJNYXBwaW5nSXRlbT4gbWFwcGluZ3MgPSBtb2RlbC5nZXRGaWx0ZXJNYXBwaW5ncygpOwotIAkJZm9yIChJRmlsdGVyTWFwcGluZ0l0ZW0gbWFwcGluZyA6IG1hcHBpbmdzKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE0KTsKLSAgICAKLQkJCWlmIChtYXBwaW5nLmlzVXJsUGF0dGVyblR5cGUoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWFwcGluZy5nZXROYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTYpOwotICAgIAotCQkJfSBlbHNlIGlmIChtYXBwaW5nLmlzU2VydmxldE5hbWVUeXBlKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1hcHBpbmcuZ2V0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE4KTsKLSAgICAKLQkJCX0KLQkJIAotCQkJU3RyaW5nIGRpc3BhdGNoZXIgPSBtb2RlbC5nZXREaXNwYXRjaGVyTGlzdChtYXBwaW5nKTsKLQkJCWlmIChkaXNwYXRjaGVyLmxlbmd0aCgpID4gMCkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xOSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggZGlzcGF0Y2hlciApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMCk7Ci0gICAgIAotCQkJfSAKLQkJfSAKLQotCQlMaXN0PFN0cmluZ1tdPiBpbml0UGFyYW1zID0gbW9kZWwuZ2V0SW5pdFBhcmFtcygpOwotCQlpZiAoaW5pdFBhcmFtcyAhPSBudWxsICYmIGluaXRQYXJhbXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0UGFyYW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBtb2RlbC5nZXRJbml0UGFyYW0oaSwgQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5OQU1FKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBtb2RlbC5nZXRJbml0UGFyYW0oaSwgQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5WQUxVRSk7Ci0JCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gbW9kZWwuZ2V0SW5pdFBhcmFtKGksIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuREVTQ1JJUFRJT04pOyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbmFtZSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggdmFsdWUgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjMpOwotICAgIAotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmIGRlc2NyaXB0aW9uLmxlbmd0aCgpID4gMCkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggZGVzY3JpcHRpb24gKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjUpOwotICAgIAotCQkJCX0KLQkJCX0gCi0JCX0gCi0JfQotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI2KTsKLSAgICAKLQlpZiAobW9kZWwuaXNQdWJsaWMoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNyk7Ci0gICAgIAotCX0gCi0KLQlpZiAobW9kZWwuaXNBYnN0cmFjdCgpKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI4KTsKLSAgICAKLQl9Ci0KLQlpZiAobW9kZWwuaXNGaW5hbCgpKSB7Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjkpOwotICAgIAotCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKTsKLSAgICAKLQlTdHJpbmcgc3VwZXJDbGFzcyA9IG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCk7Ci0gCWlmIChzdXBlckNsYXNzICE9IG51bGwgJiYgc3VwZXJDbGFzcy5sZW5ndGgoKSA+IDApIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggc3VwZXJDbGFzcyApOwotICAgIAotCX0KLQotCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbW9kZWwuZ2V0SW50ZXJmYWNlcygpOyAKLSAJaWYgKCBpbnRlcmZhY2VzLnNpemUoKSA+IDApIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzIpOwotICAgIAotCX0KLQkKLSAJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAJCVN0cmluZyBJTlRFUkZBQ0UgPSAoU3RyaW5nKSBpbnRlcmZhY2VzLmdldChpKTsKLSAgIAkJaWYgKGkgPiAwKSB7Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzMpOwotICAgIAotCQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBJTlRFUkZBQ0UgKTsKLSAgICAKLQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzQpOwotICAgICAKLQlpZiAoIW1vZGVsLmhhc0VtcHR5U3VwZXJjbGFzc0NvbnN0cnVjdG9yKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldENsYXNzTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM2KTsKLSAgICAgCi0JfSAKLQotCWlmIChtb2RlbC5zaG91bGRHZW5TdXBlcmNsYXNzQ29uc3RydWN0b3JzKCkpIHsKLQkJTGlzdDxDb25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JzID0gbW9kZWwuZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCWZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgOiBjb25zdHJ1Y3RvcnMpIHsKLQkJCWlmIChjb25zdHJ1Y3Rvci5pc1B1YmxpYygpIHx8IGNvbnN0cnVjdG9yLmlzUHJvdGVjdGVkKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzgpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckphdmFkb2MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckNhbGwoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Myk7Ci0gICAgCi0JCQl9IAotCQl9IAotCX0gCi0KLSAgICAKLQlpZiAobW9kZWwuc2hvdWxkSW1wbGVtZW50QWJzdHJhY3RNZXRob2RzKCkpIHsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogbW9kZWwuZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZHMoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldE5hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Nik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFBhcmFtc0ZvckphdmFkb2MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Nyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFJldHVyblR5cGUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldE5hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTApOwotICAgICAKLQkJCVN0cmluZyBkZWZhdWx0UmV0dXJuVmFsdWUgPSBtZXRob2QuZ2V0RGVmYXVsdFJldHVyblZhbHVlKCk7Ci0JCQlpZiAoZGVmYXVsdFJldHVyblZhbHVlICE9IG51bGwpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGRlZmF1bHRSZXR1cm5WYWx1ZSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Mik7Ci0gICAgCi0JCQl9IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUzKTsKLSAgICAgCi0JCX0KLQl9IAotCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5EZXN0cm95KCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU0KTsKLSAgICAgfSAKLSAgICAgaWYgKG1vZGVsLnNob3VsZEdlbkRvRmlsdGVyKCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU1KTsKLSAgICAgfSAKLSAgICAgaWYgKG1vZGVsLnNob3VsZEdlbkluaXQoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTYpOwotICAgICB9IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Nyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU4KTsKLSAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JRmlsdGVyTWFwcGluZ0l0ZW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JRmlsdGVyTWFwcGluZ0l0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNmY5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSUZpbHRlck1hcHBpbmdJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbHRlck1hcHBpbmdJdGVtIHsKLQkKLSAgICBwdWJsaWMgc3RhdGljIGludCBVUkxfUEFUVEVSTiA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgU0VSVkxFVF9OQU1FID0gMTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGludCBSRVFVRVNUID0gMSA8PCAxOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IEZPUldBUkQgPSAxIDw8IDI7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgSU5DTFVERSA9IDEgPDwgMzsKLSAgICBwdWJsaWMgc3RhdGljIGludCBFUlJPUiA9IDEgPDwgNDsKLSAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgICBwdWJsaWMgaW50IGdldE1hcHBpbmdUeXBlKCk7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNVcmxQYXR0ZXJuVHlwZSgpOwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmxldE5hbWVUeXBlKCk7Ci0gICAgcHVibGljIGludCBnZXREaXNwYXRjaGVycygpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGF0Y2hlcnNBc1N0cmluZygpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOWM3YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotcHVibGljIGludGVyZmFjZSBJTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi0JLyoqCi0JICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gZ2VuZXJhdGUgdGhlIGluaXQgbWV0aG9kLgotCSAqIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVQgPSAiTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWwuSU5JVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZGVzdHJveSBtZXRob2QuCi0JICogVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTVFJPWSA9ICJOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbC5ERVNUUk9ZIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCBib29sZWFuIHByb3BlcnR5IHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRvIGdlbmVyYXRlIHRoZSBkb0ZpbHRlciBtZXRob2QuCi0JICogVGhlIGRlZmF1bHQgaXMgdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET19GSUxURVIgPSAiTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWwuRE9fRklMVEVSIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCBMaXN0IHByb3BlcnR5IHVzZWQgdG8gY2FjaGUgYWxsIHRoZSBpbml0IHBhcmFtcyBkZWZpbmVkIG9uIHRoZSBmaWx0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9QQVJBTSA9ICJOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbC5JTklUX1BBUkFNIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogT3B0aW9uYWwsIExpc3QgcHJvcGV0eSB1c2VkIHRvIGNhY2hlIGFsbCB0aGUgZmlsdGVyIG1hcHBpbmdzIGZvciB0aGlzIGZpbHRlciBvbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUl9NQVBQSU5HUyA9ICJOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbC5GSUxURVJfTUFQUElOR1MiOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSU5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSU5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MDhlOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lOZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIElOZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMgewotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZjlhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2lyaWwgTWl0b3YsIGsubWl0b3ZAc2FwLmNvbQktIGJ1ZyAyMDQxNjAKLSAqICAgICBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgaW5pdCBtZXRob2QuCi0JICogVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVCA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuSU5JVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZGVzdHJveSBtZXRob2QuIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU1RST1kgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkRFU1RST1kiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZ2V0U2VydmxldEluZm8gbWV0aG9kLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfU0VSVkxFVF9JTkZPID0gIk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbC5HRVRfU0VSVkxFVF9JTkZPIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gZ2VuZXJhdGUgdGhlIGdldFNlcnZsZXRDb25maWcgbWV0aG9kLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfU0VSVkxFVF9DT05GSUcgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkdFVF9TRVJWTEVUX0NPTkZJRyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE9wdGlvbmFsLCBib29sZWFuIHByb3BlcnR5IHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRvIGdlbmVyYXRlIHRoZSBzZXJ2aWNlIG1ldGhvZC4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRSA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuU0VSVklDRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE9wdGlvbmFsLCBib29sZWFuIHByb3BlcnR5IHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRvIGdlbmVyYXRlIHRoZSBkb0dldCBtZXRob2QuIFRoZSBkZWZhdWx0IGlzIHRydWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fR0VUID0gIk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbC5ET19HRVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9Qb3N0IG1ldGhvZC4KLQkgKiBUaGUgZGVmYXVsdCBpcyB0cnVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX1BPU1QgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkRPX1BPU1QiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gZ2VuZXJhdGUgdGhlIGRvUHV0IG1ldGhvZC4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fUFVUID0gIk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbC5ET19QVVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9EZWxldGUgbWV0aG9kLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET19ERUxFVEUgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkRPX0RFTEVURSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9IZWFkIG1ldGhvZC4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fSEVBRCA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuRE9fSEVBRCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9PcHRpb25zIG1ldGhvZC4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fT1BUSU9OUyA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuRE9fT1BUSU9OUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9UcmFjZSBtZXRob2QuIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX1RSQUNFID0gIk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbC5ET19UUkFDRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgYm9vbGVhbiBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgZG9UcmFjZSBtZXRob2QuIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPX1NUUklORyA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuVE9fU1RSSU5HIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBkZXRlcm1pbmUgaWYgYnVpbGRpbmcgSlNQIG9yIHNlcnZsZXQuCi0JICogVGhlIGRlZmF1bHQgaXMgdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19TRVJWTEVUX1RZUEUgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLklTX1NFUlZMRVRfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgTGlzdCBwcm9wZXJ0eSB1c2VkIHRvIGNhY2hlIGFsbCB0aGUgaW5pdCBwYXJhbXMgZGVmaW5lZCBvbiB0aGUgc2VydmxldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUX1BBUkFNID0gIk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbC5JTklUX1BBUkFNIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCBMaXN0IHByb3BldHkgdXNlZCB0byBjYWNoZSBhbGwgdGhlIHNlcnZsZXQgbWFwcGluZ3MgZm9yIHRoaXMgc2VydmxldCBvbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9NQVBQSU5HUyA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuVVJMX01BUFBJTkdTIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRG8gbm90IHNldCEgVGhlIGphdmFqZXQgdGVtcGxhdGUgZmlsZSB1c2VkIGluIGNyZWF0aW5nIHRoZSBhbm5vdGF0ZWQgc2VydmxldCB0ZW1wbGF0ZSBjbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0ZJTEUgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLlRFTVBMQVRFX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogRG8gbm90IHNldCEgVGhlIGphdmFqZXQgdGVtcGxhdGUgZmlsZSB1c2VkIGluIGNyZWF0aW5nIHRoZSBub24tYW5ub3RhdGVkIHNlcnZsZXQgdGVtcGxhdGUgY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fQU5OT1RBVEVEX1RFTVBMQVRFX0ZJTEUgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLk5PTl9BTk5PVEFURURfVEVNUExBVEVfRklMRSI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDBkNDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMsIElBbm5vdGF0aW9uc0RhdGFNb2RlbCB7Ci0KLQkvKioKLQkgKiBSZXF1aXJlZCwgU3RyaW5nIHByb3BlcnR5IG9mIHRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUUgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkRJU1BMQVlfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgU3RyaW5nIHByb3BlcnR5IG9mIHRoZSBkZXNjcmlwdGlvbiBpbmZvIGZvciB0aGUgZmlsdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLkRFU0NSSVBUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCBib29sZWFuIHByb3BlcnR5IHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCB0byBnZW5lcmF0ZSBhIG5ldyBqYXZhIGNsYXNzLgotCSAqIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9FWElTVElOR19DTEFTUyA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuVVNFX0VYSVNUSU5HX0NMQVNTIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0xpc3RlbmVyVGVtcGxhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9MaXN0ZW5lclRlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYTQyOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0xpc3RlbmVyVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIExpc3RlbmVyVGVtcGxhdGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbmw7Ci0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExpc3RlbmVyVGVtcGxhdGUgY3JlYXRlKFN0cmluZyBsaW5lU2VwYXJhdG9yKQotICB7Ci0gICAgbmwgPSBsaW5lU2VwYXJhdG9yOwotICAgIExpc3RlbmVyVGVtcGxhdGUgcmVzdWx0ID0gbmV3IExpc3RlbmVyVGVtcGxhdGUoKTsKLSAgICBubCA9IG51bGw7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgTkwgPSBubCA9PSBudWxsID8gKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpIDogbmw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xID0gInBhY2thZ2UgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zID0gTkw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80ID0gTkwgKyAiaW1wb3J0ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81ID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNiA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOCA9ICIvKioiICsgTkwgKyAiICogQXBwbGljYXRpb24gTGlmZWN5Y2xlIExpc3RlbmVyIGltcGxlbWVudGF0aW9uIGNsYXNzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gTkwgKyAiICoiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTAgPSBOTCArICIgKiBAd2ViLmxpc3RlbmVyIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzExID0gTkwgKyAiICovIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEyID0gTkwgKyAicHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMyA9ICJhYnN0cmFjdCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTQgPSAiZmluYWwgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE1ID0gImNsYXNzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNiA9ICIgZXh0ZW5kcyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSAiIGltcGxlbWVudHMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE4ID0gIiwgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gIiB7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIwID0gTkwgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMSA9ICIoKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIyID0gTkwgKyAiICAgICAgICIgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBAc2VlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMyA9ICIjIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI0ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjUgPSAiKSIgKyBOTCArICIgICAgICovIiArIE5MICsgIiAgICBwdWJsaWMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjcgPSAiKSB7IiArIE5MICsgIiAgICAgICAgc3VwZXIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI4ID0gIik7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI5ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICIgICAgICogQHNlZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzAgPSAiIyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMSA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMyID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMyA9ICIgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM0ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzUgPSAiKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNiA9IE5MICsgIlx0XHRcdHJldHVybiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzcgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOCA9IE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM5ID0gTkwgKyAiXHQiICsgTkwgKyAifSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MCA9IE5MOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoT2JqZWN0IGFyZ3VtZW50KQotICB7Ci0gICAgZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgQ3JlYXRlTGlzdGVuZXJUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbCkgYXJndW1lbnQ7IAotICAgIAotCW1vZGVsLnJlbW92ZUZsYWdzKENyZWF0ZUphdmFFRUFydGlmYWN0VGVtcGxhdGVNb2RlbC5GTEFHX1FVQUxJRklFRF9TVVBFUkNMQVNTX05BTUUpOyAKLQotICAgIAotCWlmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSAhPSBudWxsICYmIG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpLmxlbmd0aCgpID4gMCkgewotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIpOwotICAgIAotCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zKTsKLSAgICAgCi0JQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKCk7Ci0JZm9yIChTdHJpbmcgYW5JbXBvcnQgOiBpbXBvcnRzKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGFuSW1wb3J0ICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUpOwotICAgICAKLQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF85KTsKLSAgICAgCi0JaWYgKG1vZGVsLmlzQW5ub3RhdGVkKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTApOwotICAgICAKLQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTEpOwotICAgIAotCWlmIChtb2RlbC5pc1B1YmxpYygpKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEyKTsKLSAgICAgCi0JfSAKLQotCWlmIChtb2RlbC5pc0Fic3RyYWN0KCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTMpOwotICAgIAotCX0KLQotCWlmIChtb2RlbC5pc0ZpbmFsKCkpIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNCk7Ci0gICAgCi0JfQotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE1KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgIAotCVN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLSAJaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiBzdXBlckNsYXNzLmxlbmd0aCgpID4gMCkgewotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE2KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBzdXBlckNsYXNzICk7Ci0gICAgCi0JfQotCi0JTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAotIAlpZiAoIGludGVyZmFjZXMuc2l6ZSgpID4gMCkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNyk7Ci0gICAgCi0JfQotCQotIAlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLSAgIAkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotICAgCQlpZiAoaSA+IDApIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xOCk7Ci0gICAgCi0JCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIElOVEVSRkFDRSApOwotICAgIAotCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xOSk7Ci0gICAgIAotCWlmICghbW9kZWwuaGFzRW1wdHlTdXBlcmNsYXNzQ29uc3RydWN0b3IoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjEpOwotICAgICAKLQl9IAotCi0JaWYgKG1vZGVsLnNob3VsZEdlblN1cGVyY2xhc3NDb25zdHJ1Y3RvcnMoKSkgewotCQlMaXN0PENvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnMgPSBtb2RlbC5nZXRDb25zdHJ1Y3RvcnMoKTsKLQkJZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA6IGNvbnN0cnVjdG9ycykgewotCQkJaWYgKGNvbnN0cnVjdG9yLmlzUHVibGljKCkgfHwgY29uc3RydWN0b3IuaXNQcm90ZWN0ZWQoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9ySmF2YWRvYygpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI1KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9yRGVjbGFyYXRpb24oKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9yQ2FsbCgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI4KTsKLSAgICAKLQkJCX0gCi0JCX0gCi0JfSAKLQotICAgIAotCWlmIChtb2RlbC5zaG91bGRJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZHMoKSkgewotCQlmb3IgKE1ldGhvZCBtZXRob2QgOiBtb2RlbC5nZXRVbmltcGxlbWVudGVkTWV0aG9kcygpKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI5KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMxKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0UGFyYW1zRm9ySmF2YWRvYygpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMyKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMzKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM0KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0UGFyYW1zRm9yRGVjbGFyYXRpb24oKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNSk7Ci0gICAgIAotCQkJU3RyaW5nIGRlZmF1bHRSZXR1cm5WYWx1ZSA9IG1ldGhvZC5nZXREZWZhdWx0UmV0dXJuVmFsdWUoKTsKLQkJCWlmIChkZWZhdWx0UmV0dXJuVmFsdWUgIT0gbnVsbCkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggZGVmYXVsdFJldHVyblZhbHVlICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM3KTsKLSAgICAKLQkJCX0gCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzgpOwotICAgICAKLQkJfQotCX0gCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MCk7Ci0gICAgcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyMTc0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5BQlNUUkFDVF9NRVRIT0RTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTlRFUkZBQ0VTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TVVBFUkNMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU1RST1k7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fRklMVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTFRFUl9NQVBQSU5HUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVRfUEFSQU07Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRElTUExBWV9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0ZJTFRFUjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLk5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi52YWxpZGF0aW9uLlVybFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzCi0JCU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogU3RyaW5nIGFycmF5IG9mIHRoZSBkZWZhdWx0LCBtaW5pbXVtIHJlcXVpcmVkIGZ1bGx5IHF1YWxpZmllZCBGaWx0ZXIKLQkgKiBpbnRlcmZhY2VzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gRklMVEVSX0lOVEVSRkFDRVMgPSB7IFFVQUxJRklFRF9GSUxURVIgfTsgCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoQUJTVFJBQ1RfTUVUSE9EUy5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKElOSVQuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmIChERVNUUk9ZLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoRE9fRklMVEVSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gT3RoZXJ3aXNlIHJldHVybiBzdXBlciBpbXBsZW1lbnRhdGlvbgotCQlyZXR1cm4gc3VwZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0gICAgCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlaXIgb3duIGRlZmF1bHQgb3BlcmF0aW9uCi0JICogZm9yIHRoaXMgZGF0YSBtb2RlbCBwcm92aWRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZQotCSAqIEFkZEZpbHRlck9wZXJhdGlvbiB0byBkcml2ZSB0aGUgZmlsdGVyIGNyZWF0aW9uLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCi0JICogCi0JICogQHJldHVybiBJRGF0YU1vZGVsT3BlcmF0aW9uIEFkZEZpbHRlck9wZXJhdGlvbgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgQWRkRmlsdGVyT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBkYXRhIG1vZGVsJ3MKLQkgKiBwcm9wZXJ0aWVzIGFzIHZhbGlkIGJhc2UgcHJvcGVydGllcy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5TmFtZXMoKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJLy8gQWRkIGZpbHRlciBzcGVjaWZpYyBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhpcyBkYXRhIG1vZGVsCi0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQkKLQkJcHJvcGVydHlOYW1lcy5hZGQoSU5JVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERFU1RST1kpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChET19GSUxURVIpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChJTklUX1BBUkFNKTsKLSAgICAgICAgcHJvcGVydHlOYW1lcy5hZGQoRklMVEVSX01BUFBJTkdTKTsKLSAgICAgICAgCi0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biBkZWZhdWx0IHZhbHVlcyBmb3IKLQkgKiBhbnkgb2YgdGhlIHByb3BlcnRpZXMgaW4gdGhlIGRhdGEgbW9kZWwgaGllcmFyY2h5LiBUaGlzIG1ldGhvZCBkb2VzIG5vdAotCSAqIGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLiBJdCBtYXkgcmV0dXJuIG51bGwuIFRoaXMgaW1wbGVtZW50YXRpb24gc2V0cwotCSAqIGFubm90YXRpb24gdXNlIHRvIGJlIHRydWUsIGFuZCB0byBnZW5lcmF0ZSBhIGZpbHRlciB3aXRoIGRvRmlsdGVyLgotCSAqIAotCSAqIEBzZWUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIE9iamVjdCBkZWZhdWx0IHZhbHVlIG9mIHByb3BlcnR5Ci0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhERVNUUk9ZKSkKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRE9fRklMVEVSKSkKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU5JVCkpCi0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZJTFRFUl9NQVBQSU5HUykpCi0JCQlyZXR1cm4gZ2V0RGVmYXVsdEZpbHRlck1hcHBpbmcoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTlRFUkZBQ0VTKSkKLQkJCXJldHVybiBnZXRGaWx0ZXJJbnRlcmZhY2VzKCk7Ci0gICAgICAgIAotCQkvLyBPdGhlcndpc2UgY2hlY2sgc3VwZXIgZm9yIGRlZmF1bHQgdmFsdWUgZm9yIHByb3BlcnR5Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IFVybCBNYXBwaW5nIGRlcGVuZGluZyB1cG9uIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlCi0JICogRmlsdGVyCi0JICogCi0JICogQHJldHVybiBMaXN0IGNvbnRhaW50aW5nIHRoZSBkZWZhdWx0IFVybCBNYXBwaW5nCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RGVmYXVsdEZpbHRlck1hcHBpbmcoKSB7Ci0JCUxpc3QgZmlsdGVyTWFwcGluZ3MgPSBudWxsOwotCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIGdldFByb3BlcnR5KERJU1BMQVlfTkFNRSk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJICAgIGZpbHRlck1hcHBpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQkgICAgZmlsdGVyTWFwcGluZ3MuYWRkKG5ldyBGaWx0ZXJNYXBwaW5nSXRlbShGaWx0ZXJNYXBwaW5nSXRlbS5VUkxfUEFUVEVSTiwgIi8iICsgdGV4dCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZpbHRlck1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biB2YWxpZGF0aW9uIG9uIGFueQotCSAqIG9mIHRoZSB2YWxpZCBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW4gdGhlIGhpZXJhcmNoeS4gVGhpcyBpbXBsZW1lbnRhdGlvbgotCSAqIGFkZHMgdmFsaWRhdGlvbiBmb3IgdGhlIGluaXQgcGFyYW1zLCBmaWx0ZXIgbWFwcGluZ3MsIGRpc3BsYXkgbmFtZSwgYW5kCi0JICogZXhpc3RpbmcgY2xhc3MgZmllbGRzIHNwZWNpZmljIHRvIHRoZSBmaWx0ZXIgamF2YSBjbGFzcyBjcmVhdGlvbi4gSXQgZG9lcwotCSAqIG5vdCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gVGhpcyBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyBwcm9wZXJ0eSB2YWx1ZSB2YWxpZD8KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCS8vIElmIG91ciBkZWZhdWx0IGlzIHRoZSBzdXBlcmNsYXNzLCB3ZSBrbm93IGl0IGlzIG9rCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNVUEVSQ0xBU1MpICYmICIiLmVxdWFscyhnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSkKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQkvLyBWYWxpZGF0ZSBpbml0IHBhcmFtcwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTklUX1BBUkFNKSkKLQkJCXJldHVybiB2YWxpZGF0ZUluaXRQYXJhbUxpc3QoKExpc3QpIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkpOwotICAgICAgICAvLyBWYWxpZGF0ZSB1cmwgcGF0dGVybiBhbmQgc2VydmxldCBuYW1lIG1hcHBpbmdzCi0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZJTFRFUl9NQVBQSU5HUykpCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVGaWx0ZXJNYXBwaW5nTGlzdCgoTGlzdCkgZ2V0UHJvcGVydHkoRklMVEVSX01BUFBJTkdTKSk7Ci0JCS8vIFZhbGlkYXRlIHRoZSBmaWx0ZXIgbmFtZSBpbiBERAotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhESVNQTEFZX05BTUUpKQotCQkJcmV0dXJuIHZhbGlkYXRlRGlzcGxheU5hbWUoZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCQotCQkvLyBPdGhlcndpc2UgZGVmZXIgdG8gc3VwZXIgdG8gdmFsaWRhdGUgdGhlIHByb3BlcnR5Ci0JCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gSXQgd2lsbCBiZSB1c2VkIHRvCi0JICogdmFsaWRhdGUgdGhlIGluaXQgcGFyYW1zIGxpc3QgdG8gZW5zdXJlIHRoZXJlIGFyZSBub3QgYW55IGR1cGxpY2F0ZXMuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgYSBudWxsIHBhcmFtdGVyLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHJldHVybiBJU3RhdHVzIGlzIGluaXQgcGFyYW1zIGxpc3QgdmFsaWQ/Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlSW5pdFBhcmFtTGlzdChMaXN0IHByb3ApIHsKLQkJaWYgKHByb3AgIT0gbnVsbCAmJiAhcHJvcC5pc0VtcHR5KCkpIHsKLQkJCS8vIEVuc3VyZSB0aGVyZSBhcmUgbm90IGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBsaXN0Ci0JCQlib29sZWFuIGR1cCA9IGhhc0R1cGxpY2F0ZXNJblN0cmluZ0FycmF5TGlzdChwcm9wKTsKLQkJCWlmIChkdXApIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0RVUExJQ0FURURfSU5JVF9QQVJBTUVURVI7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQl9Ci0JCS8vIFJldHVybiBPSwotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIFRoaXMgd2lsbCB2YWxpZGF0ZSB0aGUKLQkgKiBmaWx0ZXIgbWFwcGluZ3MgbGlzdCBhbmQgZW5zdXJlIHRoZXJlIGFyZSBub3QgZHVwbGljYXRlIGVudHJpZXMuIEl0IHdpbGwKLQkgKiBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcAotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyBmaWx0ZXIgbWFwcGluZyBsaXN0IHZhbGlkPwotCSAqLwotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUZpbHRlck1hcHBpbmdMaXN0KExpc3QgcHJvcCkgewotCQlpZiAocHJvcCAhPSBudWxsICYmICFwcm9wLmlzRW1wdHkoKSkgewotCQkJLy8gRW5zdXJlIHRoZXJlIGFyZSBub3QgZHVwbGljYXRlcyBpbiB0aGUgbWFwcGluZyBsaXN0Ci0JCQlib29sZWFuIGR1cCA9IGhhc0R1cGxpY2F0ZXNJbkZpbHRlck1hcHBpbmdJdGVtTGlzdChwcm9wKTsKLQkJCWlmIChkdXApIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0RVUExJQ0FURURfVVJMX01BUFBJTkc7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQkJU3RyaW5nIGlzVmFsaWRWYWx1ZSA9IHZhbGlkYXRlVmFsdWUocHJvcCk7Ci0JCQlpZiAoaXNWYWxpZFZhbHVlICE9IG51bGwgJiYgaXNWYWxpZFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCU5MUy5iaW5kKFdlYk1lc3NhZ2VzLkVSUl9VUkxfUEFUVEVSTl9JTlZBTElELCBpc1ZhbGlkVmFsdWUpOwotCQkJCVN0cmluZyByZXNvdXJjZVN0cmluZyA9IFdlYk1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKFdlYk1lc3NhZ2VzLkVSUl9VUkxfUEFUVEVSTl9JTlZBTElELCBuZXcgU3RyaW5nW117aXNWYWxpZFZhbHVlfSk7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhyZXNvdXJjZVN0cmluZyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0ZJTFRFUl9NQVBQSU5HX0VNUFRZOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9Ci0JCS8vIFJldHVybiBPSwotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGhhc0R1cGxpY2F0ZXNJbkZpbHRlck1hcHBpbmdJdGVtTGlzdChMaXN0PElGaWx0ZXJNYXBwaW5nSXRlbT4gaW5wdXQpIHsKLQkJLy8gSWYgbGlzdCBpcyBudWxsIG9yIGVtcHR5IHJldHVybiBmYWxzZQotCQlpZiAoaW5wdXQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlpbnQgbiA9IGlucHV0LnNpemUoKTsKLQkJYm9vbGVhbiBkdXAgPSBmYWxzZTsKLQkJLy8gbmVzdGVkIGZvciBsb29wcyB0byBjaGVjayBlYWNoIGVsZW1lbnQgdG8gc2VlIGlmIG90aGVyIGVsZW1lbnRzIGFyZSB0aGUgc2FtZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJSUZpbHRlck1hcHBpbmdJdGVtIGl0ZW0gPSBpbnB1dC5nZXQoaSk7Ci0JICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBuOyBqKyspIHsKLQkgICAgICAgICAgICBJRmlsdGVyTWFwcGluZ0l0ZW0gaXRlbTIgPSAoSUZpbHRlck1hcHBpbmdJdGVtKSBpbnB1dC5nZXQoaik7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0TmFtZSgpLmVxdWFscyhpdGVtMi5nZXROYW1lKCkpICYmIAotICAgICAgICAgICAgICAgIAkJaXRlbS5nZXRNYXBwaW5nVHlwZSgpID09IGl0ZW0yLmdldE1hcHBpbmdUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGR1cCkgYnJlYWs7Ci0JCX0KLQkJLy8gUmV0dXJuIGJvb2xlYW4gc3RhdHVzIGZvciBkdXBsaWNhdGVzCi0JCXJldHVybiBkdXA7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCBwcm92aWRlcyBhIHNpbXBsZQotCSAqIGFsZ29yaXRobSBmb3IgZGV0ZWN0aW5nIGlmIHRoZXJlIGFyZSBpbnZhbGlkIHBhdHRlcm4ncyB2YWx1ZSBpbiBhIGxpc3QuCi0JICogSXQgd2lsbCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4KLQkgKiAKLQkgKiBAc2VlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGVGaWx0ZXJNYXBwaW5nTGlzdChMaXN0KQotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4gU3RyaW5nIGZpcnN0IGludmFsaWQgcGF0dGVybidzIHZhbHVlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVWYWx1ZShMaXN0IHByb3ApIHsKLQkJaWYgKHByb3AgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCWludCBzaXplID0gcHJvcC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRmlsdGVyTWFwcGluZ0l0ZW0gZmlsdGVyTWFwcGluZ1ZhbHVlID0gKElGaWx0ZXJNYXBwaW5nSXRlbSkgcHJvcC5nZXQoaSk7Ci0JCQlpZiAoZmlsdGVyTWFwcGluZ1ZhbHVlLmlzVXJsUGF0dGVyblR5cGUoKSAmJiAKLQkJCQkJIVVybFBhdHRlcm4uaXNWYWxpZChmaWx0ZXJNYXBwaW5nVmFsdWUuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gZmlsdGVyTWFwcGluZ1ZhbHVlLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxpc3Qgb2YgZmlsdGVyIGludGVyZmFjZXMgdG8gYmUgaW1wbGVtZW50ZWQKLQkgKiBmb3IgdGhlIG5ldyBzZXJ2bGV0IGphdmEgY2xhc3MuIEl0IHdpbGwgaW50aWFsaXplIHRoZSBsaXN0IHVzaW5nIGxhenkKLQkgKiBpbml0aWFsaXphdGlvbiB0byB0aGUgbWluaW11bSBpbnRlcmZhY2VzIHJlcXVpcmVkIGJ5IHRoZSBkYXRhIG1vZGVsCi0JICogRklMVEVSX0lOVEVSRkFDRVMuIFRoaXMgbWV0aG9kIHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgI0ZJTFRFUl9JTlRFUkZBQ0VTCi0JICogCi0JICogQHJldHVybiBMaXN0IG9mIHNlcnZsZXQgaW50ZXJmYWNlcyB0byBiZSBpbXBsZW1lbnRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRGaWx0ZXJJbnRlcmZhY2VzKCkgewotCQlpZiAoaW50ZXJmYWNlTGlzdCA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gQWRkIG1pbmltdW0gcmVxdWlyZWQgbGlzdCBvZiBzZXJ2bGV0IGludGVyZmFjZXMgdG8gYmUgaW1wbGVtZW50ZWQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRklMVEVSX0lOVEVSRkFDRVMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnRlcmZhY2VMaXN0LmFkZChGSUxURVJfSU5URVJGQUNFU1tpXSk7Ci0JCQl9Ci0JCX0KLQkJLy8gUmV0dXJuIGludGVyZmFjZSBsaXN0Ci0JCXJldHVybiBpbnRlcmZhY2VMaXN0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gVGhpcyB3aWxsIHZhbGlkYXRlIHdoZXRoZXIKLQkgKiB0aGUgZGlzcGxheSBuYW1lIHNlbGVjdGVkIGlzIGEgdmFsaWQgZGlzcGxheSBuYW1lIGZvciB0aGUgZmlsdGVyIGluIHRoZQotCSAqIHNwZWNpZmllZCB3ZWIgYXBwbGljYXRpb24uIEl0IHdpbGwgbWFrZSBzdXJlIHRoZSBuYW1lIGlzIG5vdCBlbXB0eSBhbmQKLQkgKiB0aGF0IGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgd2ViIGFwcC4gVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQKLQkgKiBudWxsIGFzIGEgcGFyYW1ldGVyLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHJldHVybiBJU3RhdHVzIGlzIGZpbHRlciBkaXNwbGF5IG5hbWUgdmFsaWQ/Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlRGlzcGxheU5hbWUoU3RyaW5nIHByb3ApIHsKLQkJLy8gRW5zdXJlIHRoZSBmaWx0ZXIgZGlzcGxheSBuYW1lIGlzIG5vdCBudWxsIG9yIGVtcHR5Ci0JCWlmIChwcm9wID09IG51bGwgfHwgcHJvcC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJU3RyaW5nIG1zZyA9IFdlYk1lc3NhZ2VzLkVSUl9ESVNQTEFZX05BTUVfRU1QVFk7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQkJaWYgKGdldFRhcmdldFByb2plY3QoKSA9PSBudWxsIHx8IGdldFRhcmdldENvbXBvbmVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQkJCi0JCUlNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihnZXRUYXJnZXRQcm9qZWN0KCkpOwotCQlPYmplY3QgbU9iaiA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JCWlmIChtT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwKSB7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCkgbU9iajsKLQotCQkJTGlzdCBmaWx0ZXJzID0gd2ViQXBwLmdldEZpbHRlcnMoKTsKLQkJCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCQkvLyBFbnN1cmUgdGhlIGRpc3BsYXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0JCQlpZiAoZmlsdGVycyAhPSBudWxsICYmICFmaWx0ZXJzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5zaXplKCk7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9ICgob3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyKSBmaWx0ZXJzLmdldChpKSkuZ2V0TmFtZSgpOwotCQkJCQlpZiAocHJvcC5lcXVhbHMobmFtZSkpCi0JCQkJCQlleGlzdHMgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIElmIHRoZSBmaWx0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhyb3cgYW4gZXJyb3IKLQkJCWlmIChleGlzdHMpIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV2ViTWVzc2FnZXMuRVJSX0ZJTFRFUl9OQU1FX0VYSVNULCBuZXcgU3RyaW5nW117cHJvcH0pOwotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJCX0JCQkKLQkJfSBlbHNlIGlmIChtT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbU9iajsKLQotCQkJTGlzdCBmaWx0ZXJzID0gd2ViQXBwLmdldEZpbHRlcnMoKTsKLQkJCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCQkvLyBFbnN1cmUgdGhlIGRpc3BsYXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0JCQlpZiAoZmlsdGVycyAhPSBudWxsICYmICFmaWx0ZXJzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5zaXplKCk7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9ICgob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyKSBmaWx0ZXJzLmdldChpKSkuZ2V0RmlsdGVyTmFtZSgpOwotCQkJCQlpZiAocHJvcC5lcXVhbHMobmFtZSkpCi0JCQkJCQlleGlzdHMgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIElmIHRoZSBmaWx0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhyb3cgYW4gZXJyb3IKLQkJCWlmIChleGlzdHMpIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV2ViTWVzc2FnZXMuRVJSX0ZJTFRFUl9OQU1FX0VYSVNULCBuZXcgU3RyaW5nW10ge3Byb3B9KTsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCS8vIE90aGVyd2lzZSwgcmV0dXJuIE9LCi0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld0ZpbHRlckNsYXNzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3RmlsdGVyQ2xhc3NPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2NzVkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3RmlsdGVyQ2xhc3NPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogVGhlIE5ld0ZpbHRlckNsYXNzT3BlcmF0aW9uIGlzIGFuIElEYXRhTW9kZWxPcGVyYXRpb24gZm9sbG93aW5nIHRoZQotICogSURhdGFNb2RlbCB3aXphcmQgYW5kIG9wZXJhdGlvbiBmcmFtZXdvcmsuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIEl0IGV4dGVuZHMgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24gdG8gcHJvdmlkZSBmaWx0ZXIgc3BlY2lmaWMgamF2YQotICogY2xhc3MgZ2VuZXJhdGlvbi4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyB1c2VkIGJ5IHRoZSBBZGRGaWx0ZXJPcGVyYXRpb24gdG8gZ2VuZXJhdGUgYW4KLSAqIG5vbiBhbm5vdGF0ZWQgamF2YSBjbGFzcyBmb3IgYW4gYWRkZWQgZmlsdGVyLiBJdCBzaGFyZXMgdGhlCi0gKiBOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHdpdGggdGhlIEFkZEZpbHRlck9wZXJhdGlvbiB0byBzdG9yZSB0aGUKLSAqIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhlIG5ldyBmaWx0ZXIuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkFkZEZpbHRlck9wZXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIEEgV1RQSmV0RW1pdHRlciBmaWx0ZXIgdGVtcGxhdGUgaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNsYXNzIHdpdGggdGhlIGZpbHRlciB0ZW1wbGF0ZS4gCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuV1RQSkVURW1pdHRlcgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5DcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG9wZXJhdGlvbiB0byBwcm92aWRlIHRoZWlyIG93biBzcGVjaWZpYyBmaWx0ZXIKLSAqIGphdmEgY2xhc3MgZ2VuZXJhdGlvbi4gVGhlIGV4ZWN1dGUgbWV0aG9kIG1heSBiZSBleHRlbmRlZCB0byBkbyBzby4gQWxzbywKLSAqIGdlbmVyYXRlVXNpbmdUZW1wbGF0ZXMgaXMgZXhwb3NlZC4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTmV3RmlsdGVyQ2xhc3NPcGVyYXRpb24gZXh0ZW5kcyBOZXdXZWJDbGFzc09wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBmb2xkZXIgbG9jYXRpb24gb2YgdGhlIGZpbHRlciBjcmVhdGlvbiB0ZW1wbGF0ZXMgZGlyZXRvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9GSUxFID0gIi90ZW1wbGF0ZXMvZmlsdGVyLmphdmFqZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEKLQkgKiBOZXdGaWx0ZXJDbGFzc09wZXJhdGlvbi4gQW4gaW5zdGFuY2Ugb2YgdGhlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsCi0JICogc2hvdWxkIGJlIHBhc3NlZCBpbi4gVGhpcyBkb2VzIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90Ci0JICogcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbiNBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbihJRGF0YU1vZGVsKQotCSAqIEBzZWUgTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWwKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHJldHVybiBOZXdGaWx0ZXJDbGFzc09wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBOZXdGaWx0ZXJDbGFzc09wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDcmVhdGVGaWx0ZXJUZW1wbGF0ZSBtb2RlbCB0bwotCSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgV1RQSkVURW1pdHRlci4gVGhpcyBtZXRob2Qgd2lsbCBub3QKLQkgKiByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwKLQkgKiBAc2VlIE5ld0ZpbHRlckNsYXNzT3BlcmF0aW9uI2dlbmVyYXRlVXNpbmdUZW1wbGF0ZXMoSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIElQYWNrYWdlRnJhZ21lbnQpCi0JICogCi0JICogQHJldHVybiBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsCi0JICovCi0JQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwgY3JlYXRlVGVtcGxhdGVNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRlbXBsYXRlRmlsZSgpIHsKLQkJcmV0dXJuIFRFTVBMQVRFX0ZJTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEZpbHRlclRlbXBsYXRlIGdldFRlbXBsYXRlSW1wbGVtZW50YXRpb24oKSB7Ci0JCXJldHVybiBGaWx0ZXJUZW1wbGF0ZS5jcmVhdGUobnVsbCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWNlMmM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQUNUSVZBVElPTl9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9CSU5ESU5HX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9MSVNURU5FUjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBUaGUgTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIGlzIGEgc3ViY2xhc3Mgb2YKLSAqIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgYW5kIGZvbGxvd3MgdGhlIElEYXRhTW9kZWwgT3BlcmF0aW9uIGFuZCBXaXphcmQKLSAqIGZyYW1ld29ya3MuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiAKLSAqIFRoaXMgZGF0YSBtb2RlbCBwcm92aWRlciBpcyBhIHN1YmNsYXNzIG9mIHRoZSBOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLAotICogd2hpY2ggc3RvcmVzIGJhc2UgcHJvcGVydGllcyBuZWNlc3NhcnkgaW4gdGhlIGNyZWF0aW9uIG9mIGEgZGVmYXVsdCBqYXZhCi0gKiBjbGFzcy4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBUaGUgTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVzIG1vcmUgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IKLSAqIGphdmEgY2xhc3MgY3JlYXRpb24gdGhhdCBhcmUgcmVxdWlyZWQgaW4gY3JlYXRpbmcgYSBsaXN0ZW5lciBqYXZhIGNsYXNzLiBUaGUKLSAqIGRhdGEgbW9kZWwgcHJvdmlkZXIgaXMgdXNlZCB0byBzdG9yZSB0aGVzZSB2YWx1ZXMgZm9yIHRoZQotICogTmV3TGlzdGVuZXJDbGFzc09wZXJhdGlvbi4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKiAgICAgIFRoYXQgb3BlcmF0aW9uIHdpbGwgY3JlYXRlIHRoZSBsaXN0ZW5lciBqYXZhIGNsYXNzIGJhc2VkIG9uIHRoZSBzZXR0aW5ncwotICogICAgICBkZWZpbmVkIGhlcmUgaW4gdGhlIGRhdGEgbW9kZWwuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24KLSAqIAotICogVGhpcyBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW1wbGVtZW50cyB0aGUgSUFubm90YXRpb25zRGF0YU1vZGVsIHRvIGdldCB0aGUKLSAqIFVTRV9BTk5PVEFUSU9OUyBwcm9wZXJ0eSBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBvciBub3QgdG8gZ2VuZXJhdGUgYW4KLSAqIGFubm90YXRlZCBqYXZhIGNsYXNzLgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbAotICogCi0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyB0aGlzIGRhdGEgbW9kZWwgcHJvdmlkZXIgdG8gY2FjaGUgYW5kIHByb3ZpZGUgdGhlaXIgb3duCi0gKiBzcGVjaWZpYyBhdHRyaWJ1dGVzLiBUaGV5IHNob3VsZCBhbHNvIHByb3ZpZGUgdGhlaXIgb3duIHZhbGlkYXRpb24gbWV0aG9kcywKLSAqIHByb3BlcnRpZXMgaW50ZXJmYWNlLCBhbmQgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0aWVzIHRoZXkgYWRkLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcwotCQlOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gTElTVEVORVJfSU5URVJGQUNFUyA9IHsKLQkJUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9MSVNURU5FUiwJCi0JCVFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSLAotCQlRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0xJU1RFTkVSLAotCQlRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0FUVFJJQlVURV9MSVNURU5FUiwKLQkJUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9BQ1RJVkFUSU9OX0xJU1RFTkVSLAotCQlRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0JJTkRJTkdfTElTVEVORVIsCi0JCVFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfTElTVEVORVIsCi0JCVFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfQVRUUklCVVRFX0xJU1RFTkVSCi0JfTsKLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biBkZWZhdWx0IG9wZXJhdGlvbgotCSAqIGZvciB0aGlzIGRhdGEgbW9kZWwgcHJvdmlkZXIuIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUKLQkgKiBBZGRMaXN0ZW5lck9wZXJhdGlvbiB0byBkcml2ZSB0aGUgbGlzdGVuZXIgY3JlYXRpb24uIEl0IHdpbGwgbm90IHJldHVybgotCSAqIG51bGwuCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2dldERlZmF1bHRPcGVyYXRpb24oKQotCSAqIAotCSAqIEByZXR1cm4gSURhdGFNb2RlbE9wZXJhdGlvbiBBZGRMaXN0ZW5lck9wZXJhdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgQWRkTGlzdGVuZXJPcGVyYXRpb24oZ2V0RGF0YU1vZGVsKCkpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biB2YWxpZGF0aW9uIG9uIGFueQotCSAqIG9mIHRoZSB2YWxpZCBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW4gdGhlIGhpZXJhcmNoeS4gSXQgZG9lcyBub3QgYWNjZXB0IGEKLQkgKiBudWxsIHBhcmFtZXRlci4gVGhpcyBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyBwcm9wZXJ0eSB2YWx1ZSB2YWxpZD8KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElOVEVSRkFDRVMpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVMaXN0ZW5lcnMoKTsKLQkJfQotCQkKLQkJLy8gT3RoZXJ3aXNlIGRlZmVyIHRvIHN1cGVyIHRvIHZhbGlkYXRlIHRoZSBwcm9wZXJ0eQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXJzIGlzCi0JICogc2VsZWN0ZWQuCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlTGlzdGVuZXJzKCkgewotCQlib29sZWFuIGF0TGVhc3RPbmVTZWxlY3RlZCA9IGZhbHNlOwotCQlPYmplY3QgdmFsdWUgPSBtb2RlbC5nZXRQcm9wZXJ0eShJTlRFUkZBQ0VTKTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpIHsKLQkJCUxpc3QgaW50ZXJmYWNlcyA9IChMaXN0KSB2YWx1ZTsKLQkJCWZvciAoU3RyaW5nIGlmYWNlIDogTElTVEVORVJfSU5URVJGQUNFUykgewotCQkJCWlmIChpbnRlcmZhY2VzLmNvbnRhaW5zKGlmYWNlKSkgeyAKLQkJCQkJYXRMZWFzdE9uZVNlbGVjdGVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoYXRMZWFzdE9uZVNlbGVjdGVkKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtc2cgPSBXZWJNZXNzYWdlcy5FUlJfTk9fTElTVEVORVJfU0VMRUNURUQ7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdMaXN0ZW5lckNsYXNzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3TGlzdGVuZXJDbGFzc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWMyZDM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdMaXN0ZW5lckNsYXNzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFRoZSBOZXdMaXN0ZW5lckNsYXNzT3BlcmF0aW9uIGlzIGFuIElEYXRhTW9kZWxPcGVyYXRpb24gZm9sbG93aW5nIHRoZQotICogSURhdGFNb2RlbCB3aXphcmQgYW5kIG9wZXJhdGlvbiBmcmFtZXdvcmsuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIEl0IGV4dGVuZHMgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24gdG8gcHJvdmlkZSBsaXN0ZW5lciBzcGVjaWZpYyBqYXZhCi0gKiBjbGFzcyBnZW5lcmF0aW9uLgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgYnkgdGhlIEFkZExpc3RlbmVyT3BlcmF0aW9uIHRvIGdlbmVyYXRlIGVpdGhlciBhbgotICogYW5ub3RhdGVkIG9yIG5vbiBhbm5vdGF0ZWQgamF2YSBjbGFzcyBmb3IgYW4gYWRkZWQgYXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVyLiAKLSAqIEl0IHNoYXJlcyB0aGUgTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHdpdGggdGhlIEFkZExpc3RlbmVyT3BlcmF0aW9uIHRvIAotICogc3RvcmUgdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhlIG5ldyBsaXN0ZW5lci4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuQWRkTGlzdGVuZXJPcGVyYXRpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIEluIHRoZSBhbm5vdGF0ZWQgY2FzZSwgYSBXVFBKZXRFbWl0dGVyIGxpc3RlbmVyIHRlbXBsYXRlIGlzIGNyZWF0ZWQgYW5kIHVzZWQKLSAqIHRvIGdlbmVyYXRlIHRoZSBsaXN0ZW5lciBqYXZhIGNsYXNzIHdpdGggdGhlIGVtYmVkZGVkIGFubm90YXRlZCB0YWdzLgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LldUUEpFVEVtaXR0ZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuQ3JlYXRlTGlzdGVuZXJUZW1wbGF0ZU1vZGVsCi0gKiAKLSAqIEluIHRoZSBub24gYW5ub3RhdGVkIGNhc2UsIHRoZSBzYW1lIGVtaXR0ZXIgaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNsYXNzIHdpdGgKLSAqIHRoZSBub24gYW5ub3RhdGVkIGxpc3RlbmVyIHRlbXBsYXRlIHNvIHRoZSBhbm5vdGF0ZWQgdGFncyBhcmUgb21pdHRlZC4KLSAqIAotICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgb3BlcmF0aW9uIHRvIHByb3ZpZGUgdGhlaXIgb3duIHNwZWNpZmljIGxpc3RlbmVyCi0gKiBqYXZhIGNsYXNzIGdlbmVyYXRpb24uIFRoZSBleGVjdXRlIG1ldGhvZCBtYXkgYmUgZXh0ZW5kZWQgdG8gZG8gc28uIEFsc28sCi0gKiBnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzIGlzIGV4cG9zZWQuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24gZXh0ZW5kcyBOZXdXZWJDbGFzc09wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBmb2xkZXIgbG9jYXRpb24gb2YgdGhlIGxpc3RlbmVyIGNyZWF0aW9uIHRlbXBsYXRlcyBkaXJlY3RvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9GSUxFID0gIi90ZW1wbGF0ZXMvbGlzdGVuZXIuamF2YWpldCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYQotCSAqIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24uIEFuIGluc3RhbmNlIG9mIHRoZSBOZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsCi0JICogc2hvdWxkIGJlIHBhc3NlZCBpbi4gVGhpcyBkb2VzIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90Ci0JICogcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbiNBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbihJRGF0YU1vZGVsKQotCSAqIEBzZWUgTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbAotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiBAcmV0dXJuIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTmV3TGlzdGVuZXJDbGFzc09wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwgdG8KLQkgKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFdUUEpFVEVtaXR0ZXIuIFRoaXMgbWV0aG9kIHdpbGwgbm90Ci0JICogcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBDcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwKLQkgKiBAc2VlIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgSVBhY2thZ2VGcmFnbWVudCkKLQkgKiAKLQkgKiBAcmV0dXJuIENyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwgY3JlYXRlVGVtcGxhdGVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwobW9kZWwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGVtcGxhdGVGaWxlKCkgewotCQlyZXR1cm4gVEVNUExBVEVfRklMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdGVuZXJUZW1wbGF0ZSBnZXRUZW1wbGF0ZUltcGxlbWVudGF0aW9uKCkgewotCQlyZXR1cm4gTGlzdGVuZXJUZW1wbGF0ZS5jcmVhdGUobnVsbCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwYzcwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEtpcmlsIE1pdG92LCBrLm1pdG92QHNhcC5jb20JLSBidWcgMjA0MTYwCi0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQUJTVFJBQ1RfTUVUSE9EUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU1VQRVJDTEFTUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTVFJPWTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fREVMRVRFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19HRVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX0hFQUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX09QVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX1BPU1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX1BVVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fVFJBQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFVF9TRVJWTEVUX0NPTkZJRzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuR0VUX1NFUlZMRVRfSU5GTzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5JVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5JVF9QQVJBTTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSVNfU0VSVkxFVF9UWVBFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5OT05fQU5OT1RBVEVEX1RFTVBMQVRFX0ZJTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlRFTVBMQVRFX0ZJTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlRPX1NUUklORzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuVVJMX01BUFBJTkdTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU1BMQVlfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFUlZMRVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIudmFsaWRhdGlvbi5VcmxQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBUaGUgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIgaXMgYSBzdWJjbGFzcyBvZgotICogTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBhbmQgZm9sbG93cyB0aGUgSURhdGFNb2RlbCBPcGVyYXRpb24gYW5kIFdpemFyZAotICogZnJhbWV3b3Jrcy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb24KLSAqIAotICogVGhpcyBkYXRhIG1vZGVsIHByb3ZpZGVyIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIsCi0gKiB3aGljaCBzdG9yZXMgYmFzZSBwcm9wZXJ0aWVzIG5lY2Vzc2FyeSBpbiB0aGUgY3JlYXRpb24gb2YgYSB3ZWIgYXJ0aWZhY3QKLSAqIGNsYXNzLgotICogCi0gKiBAc2VlIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogVGhlIE5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVzIG1vcmUgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IKLSAqIGphdmEgY2xhc3MgY3JlYXRpb24gdGhhdCBhcmUgcmVxdWlyZWQgaW4gY3JlYXRpbmcgYSBzZXJ2bGV0IGphdmEgY2xhc3MuIFRoZQotICogZGF0YSBtb2RlbCBwcm92aWRlciBpcyB1c2VkIHRvIHN0b3JlIHRoZXNlIHZhbHVlcyBmb3IgdGhlCi0gKiBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24uCi0gKiAKLSAqIEBzZWUgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMKLSAqIAotICogVGhhdCBvcGVyYXRpb24gd2lsbCBjcmVhdGUgdGhlIHNlcnZsZXQgamF2YSBjbGFzcyBiYXNlZCBvbiB0aGUgc2V0dGluZ3MKLSAqIGRlZmluZWQgaGVyZSBpbiB0aGUgZGF0YSBtb2RlbC4KLSAqIAotICogQHNlZSBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24KLSAqIAotICogVGhpcyBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW1wbGVtZW50cyB0aGUgSUFubm90YXRpb25zRGF0YU1vZGVsIHRvIGdldCB0aGUKLSAqIFVTRV9BTk5PVEFUSU9OUyBwcm9wZXJ0eSBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBvciBub3QgdG8gZ2VuZXJhdGUgYW4KLSAqIGFubm90YXRlZCBqYXZhIGNsYXNzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFubm90YXRpb25zRGF0YU1vZGVsCi0gKiAKLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIHRoaXMgZGF0YSBtb2RlbCBwcm92aWRlciB0byBjYWNoZSBhbmQgcHJvdmlkZSB0aGVpciBvd24KLSAqIHNwZWNpZmljIGF0dHJpYnV0ZXMuIFRoZXkgc2hvdWxkIGFsc28gcHJvdmlkZSB0aGVpciBvd24gdmFsaWRhdGlvbiBtZXRob2RzLAotICogcHJvcGVydGllcyBpbnRlcmZhY2UsIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHByb3BlcnRpZXMgdGhleSBhZGQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzCi0JCU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhlIGZ1bGx5IHF1YWxpZmllZCBkZWZhdWx0IHNlcnZsZXQgc3VwZXJjbGFzczogSHR0cFNlcnZsZXQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfU1VQRVJDTEFTUyA9IFFVQUxJRklFRF9IVFRQX1NFUlZMRVQ7Ci0JCi0JLyoqCi0JICogU3RyaW5nIGFycmF5IG9mIHRoZSBkZWZhdWx0LCBtaW5pbXVtIHJlcXVpcmVkIGZ1bGx5IHF1YWxpZmllZCBTZXJ2bGV0Ci0JICogaW50ZXJmYWNlcwotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIFNFUlZMRVRfSU5URVJGQUNFUyA9IHsgUVVBTElGSUVEX1NFUlZMRVQgfTsgCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RBVEVEX1RFTVBMQVRFX0RFRkFVTFQgPSAic2VydmxldC5qYXZhamV0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PTl9BTk5PVEFURURfVEVNUExBVEVfREVGQVVMVCA9ICJzZXJ2bGV0LmphdmFqZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gZGVmYXVsdCBvcGVyYXRpb24KLQkgKiBmb3IgdGhpcyBkYXRhIG1vZGVsIHByb3ZpZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlCi0JICogQWRkU2VydmxldE9wZXJhdGlvbiB0byBkcml2ZSB0aGUgc2VydmxldCBjcmVhdGlvbi4gSXQgd2lsbCBub3QgcmV0dXJuCi0JICogbnVsbC4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCi0JICogCi0JICogQHJldHVybiBJRGF0YU1vZGVsT3BlcmF0aW9uIEFkZFNlcnZsZXRPcGVyYXRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEFkZFNlcnZsZXRPcGVyYXRpb24obW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlaXIgb3duIGRhdGEgbW9kZWwncwotCSAqIHByb3BlcnRpZXMgYXMgdmFsaWQgYmFzZSBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQkvLyBBZGQgc2VydmxldCBzcGVjaWZpYyBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhpcyBkYXRhIG1vZGVsCi0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQkKLQkJcHJvcGVydHlOYW1lcy5hZGQoSU5JVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERFU1RST1kpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChHRVRfU0VSVkxFVF9DT05GSUcpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChHRVRfU0VSVkxFVF9JTkZPKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoU0VSVklDRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERPX0dFVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERPX1BPU1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChET19QVVQpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChET19ERUxFVEUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChET19IRUFEKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRE9fT1BUSU9OUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERPX1RSQUNFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVE9fU1RSSU5HKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSVNfU0VSVkxFVF9UWVBFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSU5JVF9QQVJBTSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVSTF9NQVBQSU5HUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE5PTl9BTk5PVEFURURfVEVNUExBVEVfRklMRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFRFTVBMQVRFX0ZJTEUpOwotCQkKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEFCU1RSQUNUX01FVEhPRFMuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0dlbmVyaWNTZXJ2bGV0U3VwZXJjbGFzcyhtb2RlbCk7Ci0JCX0gZWxzZSBpZiAoSU5JVC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCAKLQkJCQlERVNUUk9ZLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IAotCQkJCUdFVF9TRVJWTEVUX0NPTkZJRy5lcXVhbHMocHJvcGVydHlOYW1lKSB8fAotCQkJCUdFVF9TRVJWTEVUX0lORk8uZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgCi0JCQkJU0VSVklDRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJYm9vbGVhbiBnZW5lcmljU2VydmxldCA9IFNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzR2VuZXJpY1NlcnZsZXRTdXBlcmNsYXNzKG1vZGVsKTsKLQkJCWJvb2xlYW4gaW5oZXJpdCA9IG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShBQlNUUkFDVF9NRVRIT0RTKTsKLQkJCXJldHVybiBnZW5lcmljU2VydmxldCAmJiBpbmhlcml0OwotCQl9IGVsc2UgaWYgKERPX0dFVC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCAKLQkJCQlET19QT1NULmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8Ci0JCQkJRE9fUFVULmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8Ci0JCQkJRE9fREVMRVRFLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8Ci0JCQkJRE9fSEVBRC5lcXVhbHMocHJvcGVydHlOYW1lKSB8fAotCQkJCURPX09QVElPTlMuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwKLQkJCQlET19UUkFDRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJYm9vbGVhbiBodHRwU2VydmxldCA9IFNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzSHR0cFNlcnZsZXRTdXBlcmNsYXNzKG1vZGVsKTsKLQkJCWJvb2xlYW4gaW5oZXJpdCA9IG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShBQlNUUkFDVF9NRVRIT0RTKTsKLQkJCXJldHVybiBodHRwU2VydmxldCAmJiBpbmhlcml0OwotCQl9Ci0JCQotCQkvLyBPdGhlcndpc2UgcmV0dXJuIHN1cGVyIGltcGxlbWVudGF0aW9uCi0JCXJldHVybiBzdXBlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biBkZWZhdWx0IHZhbHVlcyBmb3IKLQkgKiBhbnkgb2YgdGhlIHByb3BlcnRpZXMgaW4gdGhlIGRhdGEgbW9kZWwgaGllcmFyY2h5LiBUaGlzIG1ldGhvZCBkb2VzIG5vdAotCSAqIGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLiBJdCBtYXkgcmV0dXJuIG51bGwuIFRoaXMgaW1wbGVtZW50YXRpb24gc2V0cwotCSAqIGFubm90YXRpb24gdXNlIHRvIGJlIHRydWUsIGFuZCB0byBnZW5lcmF0ZSBhIHNlcnZsZXQgd2l0aCBkb0dldCBhbmQKLQkgKiBkb1Bvc3QuCi0JICogCi0JICogQHNlZSBOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcpCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiBPYmplY3QgZGVmYXVsdCB2YWx1ZSBvZiBwcm9wZXJ0eQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJLy8gR2VuZXJhdGUgYSBkb1Bvc3QgYW5kIGRvR2V0IG1ldGhvZHMgYnkgZGVmYXVsdCBvbmx5IGlmIGEgY2xhc3MgCi0JCS8vIGV4dGVuZGluZyBIdHRwU2VydmxldCBpcyBzZWxlY3RlZAotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhET19QT1NUKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKERPX0dFVCkpIHsKLQkJCWlmIChTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0h0dHBTZXJ2bGV0U3VwZXJjbGFzcyhtb2RlbCkpCi0JCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfQotCQkKLQkJLy8gR2VuZXJhdGUgYSBzZXJ2aWNlIG1ldGhvZCBieSBkZWZhdWx0IG9ubHkgaWYgYSBjbGFzcyAKLQkJLy8gbm90IGV4dGVuZGluZyBIdHRwU2VydmxldCBpcyBzZWxlY3RlZAotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTRVJWSUNFKSkgewotCQkJaWYgKCFTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0h0dHBTZXJ2bGV0U3VwZXJjbGFzcyhtb2RlbCkpCi0JCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfQotCQkKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU5JVCkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhERVNUUk9ZKSB8fCAKLQkJCXByb3BlcnR5TmFtZS5lcXVhbHMoR0VUX1NFUlZMRVRfQ09ORklHKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEdFVF9TRVJWTEVUX0lORk8pKSB7Ci0JCQlpZiAoIVNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzR2VuZXJpY1NlcnZsZXRTdXBlcmNsYXNzKG1vZGVsKSkgCi0JCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfQotCQkKLQkJLy8gVXNlIHNlcnZsZXQgYnkgZGVmYXVsdAotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElTX1NFUlZMRVRfVFlQRSkpCi0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERJU1BMQVlfTkFNRSkpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShDTEFTU19OQU1FKTsKLQkJCWlmIChjbGFzc05hbWUuZW5kc1dpdGgoIi5qc3AiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4KzEsY2xhc3NOYW1lLmxlbmd0aCgpLTQpOwotCQkJfSBlbHNlIHsKLQkJCQljbGFzc05hbWUgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShjbGFzc05hbWUpOwotCQkJfQotCQkJcmV0dXJuIGNsYXNzTmFtZTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVSTF9NQVBQSU5HUykpCi0JCQlyZXR1cm4gZ2V0RGVmYXVsdFVybE1hcHBpbmcoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTlRFUkZBQ0VTKSkKLQkJCXJldHVybiBnZXRTZXJ2bGV0SW50ZXJmYWNlcygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNVUEVSQ0xBU1MpKQotCQkJcmV0dXJuIFNFUlZMRVRfU1VQRVJDTEFTUzsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhURU1QTEFURV9GSUxFKSkKLQkJCXJldHVybiBBTk5PVEFURURfVEVNUExBVEVfREVGQVVMVDsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhOT05fQU5OT1RBVEVEX1RFTVBMQVRFX0ZJTEUpKQotCQkJcmV0dXJuIE5PTl9BTk5PVEFURURfVEVNUExBVEVfREVGQVVMVDsKLQkJCi0JCS8vIE90aGVyd2lzZSBjaGVjayBzdXBlciBmb3IgZGVmYXVsdCB2YWx1ZSBmb3IgcHJvcGVydHkKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZWlyIG93biB2YWxpZGF0aW9uIG9uIGFueQotCSAqIG9mIHRoZSB2YWxpZCBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW4gdGhlIGhpZXJhcmNoeS4gVGhpcyBpbXBsZW1lbnRhdGlvbgotCSAqIGFkZHMgdmFsaWRhdGlvbiBmb3IgdGhlIGluaXQgcGFyYW1zLCBzZXJ2bGV0IG1hcHBpbmdzLCBkaXNwbGF5IG5hbWUsIGFuZAotCSAqIGV4aXN0aW5nIGNsYXNzIGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgc2VydmxldCBqYXZhIGNsYXNzIGNyZWF0aW9uLiBJdAotCSAqIGRvZXMgbm90IGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLiBUaGlzIG1ldGhvZCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIElTdGF0dXMgaXMgcHJvcGVydHkgdmFsdWUgdmFsaWQ/Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkvLyBWYWxpZGF0ZSBzdXBlciBjbGFzcwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTVVBFUkNMQVNTKSkgCi0JCQlyZXR1cm4gdmFsaWRhdGVTdXBlckNsYXNzTmFtZShnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJLy8gVmFsaWRhdGUgaW5pdCBwYXJhbXMKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU5JVF9QQVJBTSkpCi0JCQlyZXR1cm4gdmFsaWRhdGVJbml0UGFyYW1MaXN0KChMaXN0KSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJLy8gVmFsaWRhdGUgc2VydmxldCBtYXBwaW5ncwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVUkxfTUFQUElOR1MpKQotCQkJcmV0dXJuIHZhbGlkYXRlVVJMTWFwcGluZ0xpc3QoKExpc3QpIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkpOwotCQkvLyBWYWxpZGF0ZSB0aGUgc2VydmxldCBuYW1lIGluIERECi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERJU1BMQVlfTkFNRSkpCi0JCQlyZXR1cm4gdmFsaWRhdGVEaXNwbGF5TmFtZShnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQotCQkvLyBPdGhlcndpc2UgZGVmZXIgdG8gc3VwZXIgdG8gdmFsaWRhdGUgdGhlIHByb3BlcnR5Ci0JCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkKLQkJaWYgKFNVUEVSQ0xBU1MuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEFCU1RSQUNUX01FVEhPRFMsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShJTklULCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoREVTVFJPWSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEdFVF9TRVJWTEVUX0NPTkZJRywgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEdFVF9TRVJWTEVUX0lORk8sIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShTRVJWSUNFLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fR0VULCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fUE9TVCwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX1BVVCwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX0RFTEVURSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX0hFQUQsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShET19PUFRJT05TLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fVFJBQ0UsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQkKLQkJCWlmICghaGFzU3VwZXJDbGFzcygpKSB7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoQUJTVFJBQ1RfTUVUSE9EUywgbnVsbCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSU5JVCwgbnVsbCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoREVTVFJPWSwgbnVsbCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoR0VUX1NFUlZMRVRfQ09ORklHLCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShHRVRfU0VSVkxFVF9JTkZPLCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShTRVJWSUNFLCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShET19HRVQsIG51bGwpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KERPX1BPU1QsIG51bGwpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KERPX1BVVCwgbnVsbCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoRE9fREVMRVRFLCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShET19IRUFELCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShET19PUFRJT05TLCBudWxsKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShET19UUkFDRSwgbnVsbCk7Ci0JCQl9Ci0JCQkKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEFCU1RSQUNUX01FVEhPRFMsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoSU5JVCwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShERVNUUk9ZLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEdFVF9TRVJWTEVUX0NPTkZJRywgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShHRVRfU0VSVkxFVF9JTkZPLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFNFUlZJQ0UsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fR0VULCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX1BPU1QsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fUFVULCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX0RFTEVURSwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShET19IRUFELCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERPX09QVElPTlMsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE9fVFJBQ0UsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJCi0JCQlpZiAoIVNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzU2VydmxldFN1cGVyY2xhc3MobW9kZWwpKSB7Ci0JCQkJTGlzdCBpZmFjZXMgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSU5URVJGQUNFUyk7Ci0JCQkJaWZhY2VzLmFkZChRVUFMSUZJRURfU0VSVkxFVCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQgfHwgc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlaXIgb3duIHZhbGlkYXRpb24gb2YgdGhlIHNwZWNpZmllZCBqYXZhCi0JICogY2xhc3NuYW1lLiBUaGlzIGltcGxlbWVudGF0aW9uIHdpbGwgZW5zdXJlIHRoZSBjbGFzcyBuYW1lIGlzIG5vdCBzZXQgdG8gU2VydmxldCBhbmQgdGhlbiB3aWxsCi0JICogZm9yd2FyZCBvbiB0byB0aGUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsIHRvIHZhbGlkYXRlIHRoZSBjbGFzcyBuYW1lIGFzIHZhbGlkIGphdmEuIFRoaXMgbWV0aG9kCi0JICogZG9lcyBub3QgYWNjZXB0IG51bGwgYXMgYSBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLiAKLQkgKiBJdCB3aWxsIGNoZWNrIGlmIHRoZSBzdXBlciBjbGFzcyBleHRlbmRzIHRoZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXQgaW50ZXJmYWNlIGFsc28uCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyBqYXZhIGNsYXNzbmFtZSB2YWxpZD8KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVN1cGVyQ2xhc3NOYW1lKFN0cmluZyBzdXBlcmNsYXNzTmFtZSkgewotCQkvL0lmIHRoZSBzZXJ2bGV0IGltcGxlbWVudHMgamF2YXguc2VydmxldC5TZXJ2bGV0LCB3ZSBkbyBub3QgbmVlZCBhIHN1cGVyIGNsYXNzCi0JCWlmIChTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0dlbmVyaWNTZXJ2bGV0U3VwZXJjbGFzcyhtb2RlbCkpCi0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQkJCi0JCS8vIENoZWNrIHRoZSBzdXBlciBjbGFzcyBhcyBhIGphdmEgY2xhc3MKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAoc3VwZXJjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJc3RhdHVzID0gc3VwZXIudmFsaWRhdGUoU1VQRVJDTEFTUyk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCQlpZiAoIVNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzU2VydmxldFN1cGVyY2xhc3MobW9kZWwpKQotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXZWJNZXNzYWdlcy5FUlJfU0VSVkxFVF9JTlRFUkZBQ0UpOwotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IFVybCBNYXBwaW5nIGRlcGVuZGluZyB1cG9uIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIFNlcnZsZXQKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgY29udGFpbnRpbmcgdGhlIGRlZmF1bHQgVXJsIE1hcHBpbmcKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXREZWZhdWx0VXJsTWFwcGluZygpIHsKLQkJTGlzdCB1cmxNYXBwaW5ncyA9IG51bGw7Ci0JCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgZ2V0UHJvcGVydHkoRElTUExBWV9OQU1FKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJdXJsTWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl1cmxNYXBwaW5ncy5hZGQobmV3IFN0cmluZ1tdIHsiLyIgKyB0ZXh0fSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdXJsTWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIGJlIHVzZWQgdG8KLQkgKiB2YWxpZGF0ZSB0aGUgaW5pdCBwYXJhbXMgbGlzdCB0byBlbnN1cmUgdGhlcmUgYXJlIG5vdCBhbnkgZHVwbGljYXRlcy4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGFjY2VwdCBhIG51bGwgcGFyYW10ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHJldHVybiBJU3RhdHVzIGlzIGluaXQgcGFyYW1zIGxpc3QgdmFsaWQ/Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlSW5pdFBhcmFtTGlzdChMaXN0IHByb3ApIHsKLQkJaWYgKHByb3AgIT0gbnVsbCAmJiAhcHJvcC5pc0VtcHR5KCkpIHsKLQkJCS8vIEVuc3VyZSB0aGVyZSBhcmUgbm90IGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBsaXN0Ci0JCQlib29sZWFuIGR1cCA9IGhhc0R1cGxpY2F0ZXNJblN0cmluZ0FycmF5TGlzdChwcm9wKTsKLQkJCWlmIChkdXApIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0RVUExJQ0FURURfSU5JVF9QQVJBTUVURVI7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQl9Ci0JCS8vIFJldHVybiBPSwotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIFRoaXMgd2lsbCB2YWxpZGF0ZSB0aGUKLQkgKiBzZXJ2bGV0IG1hcHBpbmdzIGxpc3QgYW5kIGVuc3VyZSB0aGVyZSBhcmUgbm90IGR1cGxpY2F0ZSBlbnRyaWVzLiBJdCB3aWxsCi0JICogYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHJldHVybiBJU3RhdHVzIGlzIHNlcnZsZXQgbWFwcGluZyBsaXN0IHZhbGlkPwotCSAqLwotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVVSTE1hcHBpbmdMaXN0KExpc3QgcHJvcCkgewotCQlpZiAocHJvcCAhPSBudWxsICYmICFwcm9wLmlzRW1wdHkoKSkgewotCQkJLy8gRW5zdXJlIHRoZXJlIGFyZSBub3QgZHVwbGljYXRlcyBpbiB0aGUgbWFwcGluZyBsaXN0Ci0JCQlib29sZWFuIGR1cCA9IGhhc0R1cGxpY2F0ZXNJblN0cmluZ0FycmF5TGlzdChwcm9wKTsKLQkJCWlmIChkdXApIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0RVUExJQ0FURURfVVJMX01BUFBJTkc7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQkJU3RyaW5nIGlzVmFsaWRWYWx1ZSA9IHZhbGlkYXRlVmFsdWUocHJvcCk7Ci0JCQlpZiAoaXNWYWxpZFZhbHVlICE9IG51bGwgJiYgaXNWYWxpZFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCU5MUy5iaW5kKFdlYk1lc3NhZ2VzLkVSUl9VUkxfUEFUVEVSTl9JTlZBTElELCBpc1ZhbGlkVmFsdWUpOwotCQkJCVN0cmluZyByZXNvdXJjZVN0cmluZyA9IFdlYk1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKFdlYk1lc3NhZ2VzLkVSUl9VUkxfUEFUVEVSTl9JTlZBTElELCBuZXcgU3RyaW5nW117aXNWYWxpZFZhbHVlfSk7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhyZXNvdXJjZVN0cmluZyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX1VSTF9NQVBQSU5HX0xJU1RfRU1QVFk7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQkJLy8gUmV0dXJuIE9LCi0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEl0IHByb3ZpZGVzIGEgc2ltcGxlCi0JICogYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgaWYgdGhlcmUgYXJlIGludmFsaWQgcGF0dGVybidzIHZhbHVlIGluIGEgbGlzdC4KLQkgKiBJdCB3aWxsIGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLgotCSAqIAotCSAqIEBzZWUgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGVVUkxNYXBwaW5nTGlzdChMaXN0KQotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4gU3RyaW5nIGZpcnN0IGludmFsaWQgcGF0dGVybidzIHZhbHVlPwotCSAqLwotCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRlVmFsdWUoTGlzdCBwcm9wKSB7Ci0JCWlmIChwcm9wID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlpbnQgc2l6ZSA9IHByb3Auc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJU3RyaW5nIHVybE1hcHBpbmdWYWx1ZSA9ICgoU3RyaW5nW10pIHByb3AuZ2V0KGkpKVswXTsKLQkJCWlmICghVXJsUGF0dGVybi5pc1ZhbGlkKHVybE1hcHBpbmdWYWx1ZSkpCi0JCQkJcmV0dXJuIHVybE1hcHBpbmdWYWx1ZTsKLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mIHNlcnZsZXQgaW50ZXJmYWNlcyB0byBiZSBpbXBsZW1lbnRlZAotCSAqIGZvciB0aGUgbmV3IHNlcnZsZXQgamF2YSBjbGFzcy4gSXQgd2lsbCBpbnRpYWxpemUgdGhlIGxpc3QgdXNpbmcgbGF6eQotCSAqIGluaXRpYWxpemF0aW9uIHRvIHRoZSBtaW5pbXVtIGludGVyZmFjZXMgcmVxdWlyZWQgYnkgdGhlIGRhdGEgbW9kZWwKLQkgKiBTRVJWTEVUX0lOVEVSRkFDRVMuIFRoaXMgbWV0aG9kIHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgI1NFUlZMRVRfSU5URVJGQUNFUwotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBvZiBzZXJ2bGV0IGludGVyZmFjZXMgdG8gYmUgaW1wbGVtZW50ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0U2VydmxldEludGVyZmFjZXMoKSB7Ci0JCWlmIChpbnRlcmZhY2VMaXN0ID09IG51bGwpIHsKLQkJCWludGVyZmFjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBBZGQgbWluaW11bSByZXF1aXJlZCBsaXN0IG9mIHNlcnZsZXQgaW50ZXJmYWNlcyB0byBiZSBpbXBsZW1lbnRlZAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTRVJWTEVUX0lOVEVSRkFDRVMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnRlcmZhY2VMaXN0LmFkZChTRVJWTEVUX0lOVEVSRkFDRVNbaV0pOwotCQkJfQotCQkJLy8gUmVtb3ZlIHRoZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXQgaW50ZXJmYWNlIGZyb20gdGhlIGxpc3QgaWYgdGhlCi0JCQkvLyBzdXBlcmNsYXNzIGFscmVhZHkgaW1wbGVtZW50cyBpdAotCQkJaWYgKFNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzU2VydmxldFN1cGVyY2xhc3MobW9kZWwpKSB7Ci0JCQkJaW50ZXJmYWNlTGlzdC5yZW1vdmUoUVVBTElGSUVEX1NFUlZMRVQpOwotCQkJfQotCQl9Ci0JCS8vIFJldHVybiBpbnRlcmZhY2UgbGlzdAotCQlyZXR1cm4gaW50ZXJmYWNlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIFRoaXMgd2lsbCB2YWxpZGF0ZSB3aGV0aGVyCi0JICogdGhlIGRpc3BsYXkgbmFtZSBzZWxlY3RlZCBpcyBhIHZhbGlkIGRpc3BsYXkgbmFtZSBmb3IgdGhlIHNlcnZsZXQgaW4gdGhlCi0JICogc3BlY2lmaWVkIHdlYiBhcHBsaWNhdGlvbi4gSXQgd2lsbCBtYWtlIHN1cmUgdGhlIG5hbWUgaXMgbm90IGVtcHR5IGFuZAotCSAqIHRoYXQgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGluIHRoZSB3ZWIgYXBwLiBUaGlzIG1ldGhvZCB3aWxsIGFjY2VwdAotCSAqIG51bGwgYXMgYSBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogQHJldHVybiBJU3RhdHVzIGlzIHNlcnZsZXQgZGlzcGxheSBuYW1lIHZhbGlkPwotCSAqLwotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZURpc3BsYXlOYW1lKFN0cmluZyBwcm9wKSB7Ci0JCS8vIEVuc3VyZSB0aGUgc2VydmxldCBkaXNwbGF5IG5hbWUgaXMgbm90IG51bGwgb3IgZW1wdHkKLQkJaWYgKHByb3AgPT0gbnVsbCB8fCBwcm9wLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuRVJSX0RJU1BMQVlfTkFNRV9FTVBUWTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJfQotCQlpZiAoZ2V0VGFyZ2V0UHJvamVjdCgpID09IG51bGwgfHwgZ2V0VGFyZ2V0Q29tcG9uZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQkKLQkJSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKGdldFRhcmdldFByb2plY3QoKSk7Ci0JCU9iamVjdCBtT2JqID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJaWYgKG1PYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCB3ZWJBcHAgPSAob3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwKSBtT2JqOwotCi0JCQlMaXN0IHNlcnZsZXRzID0gd2ViQXBwLmdldFNlcnZsZXRzKCk7Ci0JCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQkJLy8gRW5zdXJlIHRoZSBkaXNwbGF5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgotCQkJaWYgKHNlcnZsZXRzICE9IG51bGwgJiYgIXNlcnZsZXRzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSAoKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQpIHNlcnZsZXRzLmdldChpKSkuZ2V0U2VydmxldE5hbWUoKTsKLQkJCQkJaWYgKHByb3AuZXF1YWxzKG5hbWUpKQotCQkJCQkJZXhpc3RzID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBJZiB0aGUgc2VydmxldCBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aHJvdyBhbiBlcnJvcgotCQkJaWYgKGV4aXN0cykgewotCQkJCVN0cmluZyBtc2cgPSBXZWJNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhXZWJNZXNzYWdlcy5FUlJfU0VSVkxFVF9OQU1FX0VYSVNULCBuZXcgU3RyaW5nW117cHJvcH0pOwotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJCX0JCQkKLQkJfSBlbHNlIGlmIChtT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbU9iajsKLQotCQkJTGlzdCBzZXJ2bGV0cyA9IHdlYkFwcC5nZXRTZXJ2bGV0cygpOwotCQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJCS8vIEVuc3VyZSB0aGUgZGlzcGxheSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSB3ZWIgYXBwbGljYXRpb24KLQkJCWlmIChzZXJ2bGV0cyAhPSBudWxsICYmICFzZXJ2bGV0cy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0KSBzZXJ2bGV0cy5nZXQoaSkpLmdldFNlcnZsZXROYW1lKCk7Ci0JCQkJCWlmIChwcm9wLmVxdWFscyhuYW1lKSkKLQkJCQkJCWV4aXN0cyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJLy8gSWYgdGhlIHNlcnZsZXQgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhyb3cgYW4gZXJyb3IKLQkJCWlmIChleGlzdHMpIHsKLQkJCQlTdHJpbmcgbXNnID0gV2ViTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoV2ViTWVzc2FnZXMuRVJSX1NFUlZMRVRfTkFNRV9FWElTVCwgbmV3IFN0cmluZ1tde3Byb3B9KTsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCS8vIE90aGVyd2lzZSwgcmV0dXJuIE9LCi0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1NlcnZsZXRDbGFzc09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1NlcnZsZXRDbGFzc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmIxODA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogVGhlIE5ld1NlcnZsZXRDbGFzc09wZXJhdGlvbiBpcyBhbiBJRGF0YU1vZGVsT3BlcmF0aW9uIGZvbGxvd2luZyB0aGUKLSAqIElEYXRhTW9kZWwgd2l6YXJkIGFuZCBvcGVyYXRpb24gZnJhbWV3b3JrLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBJdCBleHRlbmRzIEFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uIHRvIHByb3ZpZGUgc2VydmxldCBzcGVjaWZpYyBqYXZhCi0gKiBjbGFzcyBnZW5lcmF0aW9uLgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgYnkgdGhlIEFkZFNlcnZsZXRPcGVyYXRpb24gdG8gZ2VuZXJhdGUgZWl0aGVyIGFuCi0gKiBhbm5vdGF0ZWQgb3Igbm9uIGFubm90YXRlZCBqYXZhIGNsYXNzIGZvciBhbiBhZGRlZCBzZXJ2bGV0LiBJdCBzaGFyZXMgdGhlCi0gKiBOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlciB3aXRoIHRoZSBBZGRTZXJ2bGV0T3BlcmF0aW9uIHRvIHN0b3JlIHRoZQotICogYXBwcm9wcmlhdGUgcHJvcGVydGllcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGUgbmV3IHNlcnZsZXQuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkFkZFNlcnZsZXRPcGVyYXRpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogSW4gdGhlIGFubm90YXRlZCBjYXNlLCBhIFdUUEpldEVtaXR0ZXIgc2VydmxldCB0ZW1wbGF0ZSBpcyBjcmVhdGVkIGFuZCB1c2VkCi0gKiB0byBnZW5lcmF0ZSB0aGUgc2VydmxldCBqYXZhIGNsYXNzIHdpdGggdGhlIGVtYmVkZGVkIGFubm90YXRlZCB0YWdzLgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LldUUEpFVEVtaXR0ZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwKLSAqIAotICogSW4gdGhlIG5vbiBhbm5vdGF0ZWQgY2FzZSwgdGhlIHNhbWUgZW1pdHRlciBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY2xhc3Mgd2l0aAotICogdGhlIG5vbiBhbm5vdGF0ZWQgc2VydmxldCB0ZW1wbGF0ZSBzbyB0aGUgYW5ub3RhdGVkIHRhZ3MgYXJlIG9taXR0ZWQuCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG9wZXJhdGlvbiB0byBwcm92aWRlIHRoZWlyIG93biBzcGVjaWZpYyBzZXJ2bGV0Ci0gKiBqYXZhIGNsYXNzIGdlbmVyYXRpb24uIFRoZSBleGVjdXRlIG1ldGhvZCBtYXkgYmUgZXh0ZW5kZWQgdG8gZG8gc28uIEFsc28sCi0gKiBnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzIGlzIGV4cG9zZWQuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIE5ld1NlcnZsZXRDbGFzc09wZXJhdGlvbiBleHRlbmRzIE5ld1dlYkNsYXNzT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIGZvbGRlciBsb2NhdGlvbiBvZiB0aGUgc2VydmxldCBjcmVhdGlvbiB0ZW1wbGF0ZXMgZGlyZXRvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9ESVIgPSAiL3RlbXBsYXRlcy8iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogbG9jYXRpb24gb2YgdGhlIHNlcnZsZXQgY3JlYXRpb24gdGVtcGxhdGUgZmlsZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0ZJTEUgPSAiL3RlbXBsYXRlcy9zZXJ2bGV0LmphdmFqZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEKLQkgKiBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24uIEFuIGluc3RhbmNlIG9mIHRoZSBOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwKLQkgKiBzaG91bGQgYmUgcGFzc2VkIGluLiBUaGlzIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlci4gSXQgd2lsbCBub3QKLQkgKiByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIEFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uI0FydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uKElEYXRhTW9kZWwpCi0JICogQHNlZSBOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHJldHVybiBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTmV3U2VydmxldENsYXNzT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZSBtb2RlbCB0bwotCSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgV1RQSkVURW1pdHRlci4gVGhpcyBtZXRob2Qgd2lsbCBub3QKLQkgKiByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsCi0JICogQHNlZSBOZXdTZXJ2bGV0Q2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgSVBhY2thZ2VGcmFnbWVudCkKLQkgKiAKLQkgKiBAcmV0dXJuIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsIGNyZWF0ZVRlbXBsYXRlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwobW9kZWwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRlbXBsYXRlRmlsZSgpIHsKLQkJcmV0dXJuIFRFTVBMQVRFX0ZJTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFNlcnZsZXRUZW1wbGF0ZSBnZXRUZW1wbGF0ZUltcGxlbWVudGF0aW9uKCkgewotCQlyZXR1cm4gU2VydmxldFRlbXBsYXRlLmNyZWF0ZShudWxsKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0NzQwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlNUUlVDVE9SOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRklFUl9BQlNUUkFDVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTU9ESUZJRVJfUFVCTElDOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TVVBFUkNMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU0NSSVBUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU1BMQVlfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5VU0VfRVhJU1RJTkdfQ0xBU1M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQW5ub3RhdGlvbnNEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBUaGUgTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBpcyBhIHN1YmNsYXNzIG9mCi0gKiBOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBhbmQgZm9sbG93cyB0aGUgSURhdGFNb2RlbCBPcGVyYXRpb24gYW5kIFdpemFyZAotICogZnJhbWV3b3Jrcy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb24KLSAqIAotICogVGhpcyBkYXRhIG1vZGVsIHByb3ZpZGVyIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLAotICogd2hpY2ggc3RvcmVzIGJhc2UgcHJvcGVydGllcyBuZWNlc3NhcnkgaW4gdGhlIGNyZWF0aW9uIG9mIGEgZGVmYXVsdCBqYXZhCi0gKiBjbGFzcy4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogVGhlIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXMgbW9yZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBqYXZhCi0gKiBjbGFzcyBjcmVhdGlvbiB0aGF0IGFyZSByZXF1aXJlZCBpbiBjcmVhdGluZyBhIHdlYiBhcnRpZmFjdCBqYXZhIGNsYXNzLiBUaGUKLSAqIGRhdGEgbW9kZWwgcHJvdmlkZXIgaXMgdXNlZCB0byBzdG9yZSB0aGVzZSB2YWx1ZXMgZm9yIHRoZQotICogQWRkV2ViQ2xhc3NPcGVyYXRpb24uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMKLSAqICAgICAgVGhhdCBvcGVyYXRpb24gd2lsbCBjcmVhdGUgdGhlIHdlYiBhcnRpZmFjdCBqYXZhIGNsYXNzIGJhc2VkIG9uIHRoZQotICogICAgICBzZXR0aW5ncyBkZWZpbmVkIGhlcmUgaW4gdGhlIGRhdGEgbW9kZWwuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkFkZFdlYkNsYXNzT3BlcmF0aW9uCi0gKiAKLSAqIFRoaXMgZGF0YSBtb2RlbCBwcm9wZXJ0aWVzIGltcGxlbWVudHMgdGhlIElBbm5vdGF0aW9uc0RhdGFNb2RlbCB0byBnZXQgdGhlCi0gKiBVU0VfQU5OT1RBVElPTlMgcHJvcGVydHkgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90IHRvIGdlbmVyYXRlIGFuCi0gKiBhbm5vdGF0ZWQgamF2YSBjbGFzcy4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQW5ub3RhdGlvbnNEYXRhTW9kZWwKLSAqIAotICogQ2xpZW50cyBjYW4gc3ViY2xhc3MgdGhpcyBkYXRhIG1vZGVsIHByb3ZpZGVyIHRvIGNhY2hlIGFuZCBwcm92aWRlIHRoZWlyIG93bgotICogc3BlY2lmaWMgYXR0cmlidXRlcy4gVGhleSBzaG91bGQgYWxzbyBwcm92aWRlIHRoZWlyIG93biB2YWxpZGF0aW9uIG1ldGhvZHMsCi0gKiBwcm9wZXJ0aWVzIGludGVyZmFjZSwgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcHJvcGVydGllcyB0aGV5IGFkZC4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyICB7Ci0JCi0JLyoqCi0JICogVGhlIGZ1bGx5IHF1YWxpZmllZCBkZWZhdWx0IHN1cGVyY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfU1VQRVJDTEFTUyA9ICIiOyAvLyROT04tTkxTLTEkIAotCi0JLyoqCi0JICogVGhlIGNhY2hlIG9mIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGUgd2ViIGFydGlmYWN0IGphdmEgY2xhc3Mgd2lsbAotCSAqIGltcGxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBpbnRlcmZhY2VMaXN0OwotCQotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZUNhY2hlOwotCXByaXZhdGUgU3RyaW5nIGV4aXN0aW5nQ2xhc3NOYW1lQ2FjaGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHVzZUFubm90YXRpb25zID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlaXIgb3duIGRldGVybWluYXRpb24gb2YKLQkgKiB3aGV0aGVyIG9yIG5vdCBjZXJ0YWluIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRpc2FibGVkIG9yIGVuYWJsZWQuIFRoaXMKLQkgKiBtZXRob2QgZG9lcyBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVyLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4gVGhpcwotCSAqIGltcGxlbWVudGF0aW9uIG1ha2VzIHN1cmUgYW5ub3RhdGlvbiBzdXBwb3J0IGlzIG9ubHkgYWxsb3dlZCBvbiB3ZWIKLQkgKiBwcm9qZWN0cyBvZiBKMkVFIHZlcnNpb24gMS4zIG9yIGhpZ2hlci4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI2lzUHJvcGVydHlFbmFibGVkKFN0cmluZykKLQkgKiBAc2VlIElBbm5vdGF0aW9uc0RhdGFNb2RlbCNVU0VfQU5OT1RBVElPTlMKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiBib29sZWFuIHNob3VsZCBwcm9wZXJ0eSBiZSBlbmFibGVkPwotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJLy8gQW5ub3RhdGlvbnMgc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCBvbiBhIHZhbGlkIGoyZWUgcHJvamVjdCBvZiB2ZXJzaW9uIDEuMyBvciBoaWdoZXIKLQkJaWYgKFVTRV9BTk5PVEFUSU9OUy5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuICFnZXRCb29sZWFuUHJvcGVydHkoVVNFX0VYSVNUSU5HX0NMQVNTKSAmJiBpc0Fubm90YXRpb25zU3VwcG9ydGVkKCk7Ci0JCX0gZWxzZSBpZiAoTU9ESUZJRVJfUFVCTElDLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoTU9ESUZJRVJfQUJTVFJBQ1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmIChDT05TVFJVQ1RPUi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIGhhc1N1cGVyQ2xhc3MoKTsKLQkJfQotCQkvLyBPdGhlcndpc2UgcmV0dXJuIHN1cGVyIGltcGxlbWVudGF0aW9uCi0JCXJldHVybiBzdXBlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlaXIgb3duIGRhdGEgbW9kZWwncwotCSAqIHByb3BlcnRpZXMgYXMgdmFsaWQgYmFzZSBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQkvLyBBZGQgd2ViIGFydGlmYWN0IHNwZWNpZmljIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzIGRhdGEgbW9kZWwKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCQotCQlwcm9wZXJ0eU5hbWVzLmFkZChESVNQTEFZX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChERVNDUklQVElPTik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVTRV9FWElTVElOR19DTEFTUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVTRV9BTk5PVEFUSU9OUyk7Ci0JCQotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gZGVmYXVsdCB2YWx1ZXMgZm9yCi0JICogYW55IG9mIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBkYXRhIG1vZGVsIGhpZXJhcmNoeS4gVGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gSXQgbWF5IHJldHVybiBudWxsLiBUaGlzIGltcGxlbWVudGF0aW9uIHNldHMKLQkgKiBhbm5vdGF0aW9uIHVzZSB0byBiZSB0cnVlLgotCSAqIAotCSAqIEBzZWUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIE9iamVjdCBkZWZhdWx0IHZhbHVlIG9mIHByb3BlcnR5Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhESVNQTEFZX05BTUUpKQotCQkJcmV0dXJuIFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKGdldFN0cmluZ1Byb3BlcnR5KENMQVNTX05BTUUpKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VfQU5OT1RBVElPTlMpKQotCQkJcmV0dXJuIHNob3VsZERlZmF1bHRBbm5vdGF0aW9ucygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNVUEVSQ0xBU1MpKQotCQkJcmV0dXJuIERFRkFVTFRfU1VQRVJDTEFTUzsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VfRVhJU1RJTkdfQ0xBU1MpKQotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OU1RSVUNUT1IpKQotCQkJcmV0dXJuIGhhc1N1cGVyQ2xhc3MoKTsKLQkJCi0JCS8vIE90aGVyd2lzZSBjaGVjayBzdXBlciBmb3IgZGVmYXVsdCB2YWx1ZSBmb3IgcHJvcGVydHkKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlaXIgb3duIHNwZWNpZmljIGJlaGF2aW9yIHdoZW4KLQkgKiBhIGNlcnRhaW4gcHJvcGVydHkgaW4gdGhlIGRhdGEgbW9kZWwgaGllcmFyY2h5IGlzIHNldC4gdGhpcyBtZXRob2QgZG9lcwotCSAqIG5vdCBhY2NlcHQgbnVsbCBmb3IgdGhlIHByb3BlcnR5IG5hbWUsIGJ1dCBpdCB3aWxsIGZvciBwcm9wZXJ0eVZhbHVlLiBJdAotCSAqIHdpbGwgbm90IHJldHVybiBudWxsLiBJdCB3aWxsIHJldHVybiBmYWxzZSBpZiB0aGUgc2V0IGZhaWxzLiBUaGlzCi0JICogaW1wbGVtZW50YXRpb24gdmVyaWZpZXMgdGhlIGRpc3BsYXkgbmFtZSBpcyBzZXQgdG8gdGhlIGNsYXNzIG5hbWUsIHRoYXQKLQkgKiB0aGUgYW5ub3RhdGlvbnMgaXMgZGlzYWJsZWQvZW5hYmxlZCBwcm9wZXJseSwgYW5kIHRoYXQgdGhlIHRhcmdldCBwcm9qZWN0Ci0JICogbmFtZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIHNvdXJjZSBmb2xkZXIgc2V0dGluZy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI3Byb3BlcnR5U2V0KFN0cmluZywKLQkgKiAgICAgIE9iamVjdCkKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gd2FzIHByb3BlcnR5IHNldD8KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQkvLyBJZiBhbm5vdGF0aW9ucyBpcyBjaGFuZ2VkLCBub3RpZnkgYW4gZW5hYmxlbWVudCBjaGFuZ2UKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFX0FOTk9UQVRJT05TKSkgewotCQkJdXNlQW5ub3RhdGlvbnMgPSAoKEJvb2xlYW4pIHByb3BlcnR5VmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCQkJaWYgKHVzZUFubm90YXRpb25zICYmICFpc0Fubm90YXRpb25zU3VwcG9ydGVkKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VfQU5OT1RBVElPTlMsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCX0KLQkJLy8gSWYgdGhlIHNvdXJjZSBmb2xkZXIgaXMgY2hhbmdlZCwgZW5zdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgcHJvamVjdCBuYW1lCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNPVVJDRV9GT0xERVIpKSB7Ci0JCQkvLyBHZXQgdGhlIHByb2plY3QgbmFtZSBmcm9tIHRoZSBzb3VyY2UgZm9sZGVyIG5hbWUKLQkJCVN0cmluZyBzb3VyY2VGb2xkZXIgPSAoU3RyaW5nKSBwcm9wZXJ0eVZhbHVlOwotCQkJaW50IGluZGV4ID0gc291cmNlRm9sZGVyLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gc291cmNlRm9sZGVyOwotCQkJaWYgKGluZGV4ID09IDApCi0JCQkJcHJvamVjdE5hbWUgPSBzb3VyY2VGb2xkZXIuc3Vic3RyaW5nKDEpOwotCQkJaW5kZXggPSBwcm9qZWN0TmFtZS5pbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCXByb2plY3ROYW1lID0gcHJvamVjdE5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQlzZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBDYWxsIHN1cGVyIHRvIHNldCB0aGUgcHJvcGVydHkgb24gdGhlIGRhdGEgbW9kZWwKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQkvLyBJZiBjbGFzcyBuYW1lIGlzIGNoYW5nZWQsIHVwZGF0ZSB0aGUgZGlzcGxheSBuYW1lIHRvIGJlIHRoZSBzYW1lCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENMQVNTX05BTUUpICYmICFtb2RlbC5pc1Byb3BlcnR5U2V0KERJU1BMQVlfTkFNRSkpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERJU1BMQVlfTkFNRSwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCX0KLQkJLy8gQWZ0ZXIgdGhlIHByb3BlcnR5IGlzIHNldCwgaWYgcHJvamVjdCBjaGFuZ2VkLCB1cGRhdGUgdGhlIG5hdHVyZSBhbmQgdGhlIGFubm90YXRpb25zCi0JCS8vIGVuYWJsZW1lbnQKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09NUE9ORU5UX05BTUUpKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VfQU5OT1RBVElPTlMsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCX0KLQkJLy8gQWZ0ZXIgcHJvcGVydHkgaXMgc2V0LCBpZiBhbm5vdGF0aW9ucyBpcyBzZXQgdG8gdHJ1ZSwgdXBkYXRlIGl0cyB2YWx1ZSBiYXNlZCBvbiB0aGUgbmV3Ci0JCS8vIGxldmVsIG9mIHRoZSBwcm9qZWN0Ci0JCWlmIChnZXRCb29sZWFuUHJvcGVydHkoVVNFX0FOTk9UQVRJT05TKSkgewotCQkJaWYgKCFpc0Fubm90YXRpb25zU3VwcG9ydGVkKCkpCi0JCQkJc2V0Qm9vbGVhblByb3BlcnR5KFVTRV9BTk5PVEFUSU9OUywgZmFsc2UpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRV9FWElTVElOR19DTEFTUykpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRV9BTk5PVEFUSU9OUywgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCQotCQkJaWYgKCgoQm9vbGVhbikgcHJvcGVydHlWYWx1ZSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljbGFzc05hbWVDYWNoZSA9IGdldFN0cmluZ1Byb3BlcnR5KENMQVNTX05BTUUpOwotCQkJCXNldFByb3BlcnR5KENMQVNTX05BTUUsIGV4aXN0aW5nQ2xhc3NOYW1lQ2FjaGUpOwotCQkJfSBlbHNlIHsKLQkJCQlleGlzdGluZ0NsYXNzTmFtZUNhY2hlID0gZ2V0U3RyaW5nUHJvcGVydHkoQ0xBU1NfTkFNRSk7Ci0JCQkJc2V0UHJvcGVydHkoQ0xBU1NfTkFNRSwgY2xhc3NOYW1lQ2FjaGUpOwotCQkJfQotCQl9Ci0JCS8vIGlmIHN1cGVyIGNsYXNzIGlzIGNoYW5nZWQsIG5vdGlmeSB0aGUgY29uc3RydWN0b3IgY2hlY2tib3ggdG8gdXBkYXRlCi0JCS8vIGl0cyBlbmFibGVkIHN0YXRlCi0JCWlmIChTVVBFUkNMQVNTLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShDT05TVFJVQ1RPUiwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCWlmICghaGFzU3VwZXJDbGFzcygpKSB7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OU1RSVUNUT1IsIG51bGwpOwotCQkJfQotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQ09OU1RSVUNUT1IsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQl9Ci0JCQotCQkvLyBSZXR1cm4gd2hldGhlciBwcm9wZXJ0eSB3YXMgc2V0Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW5ub3RhdGlvbnMgc2hvdWxkIHRyeSB0byBlbmFibGUKLQkgKiBiYXNlZCBvbiB3b3Jrc3BhY2Ugc2V0dGluZ3MKLQkgKiAKLQkgKiBAcmV0dXJuIGRvZXMgYW55IHZhbGlkIGFubm90YXRpb24gcHJvdmlkZXIgb3IgeGRvY2xldCBoYW5kbGVyIGV4aXN0Ci0JICovCi0JLy9UT0RPIGFkZCB0aGlzIG1ldGhvZCBiYWNrIGluIGZvciBkZWZlY3QgMTQ2Njk2Ci0vLwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm92aWRlckRlZmluZWQoKSB7Ci0vLwkJYm9vbGVhbiBpc0NvbnRyb2xsZXJFbmFibGVkID0gQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5JTlNUQU5DRS5pc0FueUFubm90YXRpb25zU3VwcG9ydGVkKCk7Ci0vLwkJZmluYWwgU3RyaW5nIHByZWZlcnJlZCA9IEFubm90YXRpb25QcmVmZXJlbmNlU3RvcmUuZ2V0UHJvcGVydHkoQW5ub3RhdGlvblByZWZlcmVuY2VTdG9yZS5BTk5PVEFUSU9OUFJPVklERVIpOwotLy8JCUlBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyID0gbnVsbDsKLS8vCQlib29sZWFuIGlzUHJvdmlkZXJFbmFibGVkID0gZmFsc2U7Ci0vLwkJaWYgKHByZWZlcnJlZCAhPSBudWxsKSB7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlhbm5vdGF0aW9uUHJvdmlkZXIgPSBBbm5vdGF0aW9uVXRpbGl0aWVzLmZpbmRBbm5vdGF0aW9uUHJvdmlkZXJCeU5hbWUocHJlZmVycmVkKTsKLS8vCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7IAotLy8JCQkJLy9EZWZhdWx0Ci0vLwkJCX0KLS8vCQkJaWYgKGFubm90YXRpb25Qcm92aWRlciAhPSBudWxsICYmIGFubm90YXRpb25Qcm92aWRlci5pc1ZhbGlkKCkpCi0vLwkJCQlpc1Byb3ZpZGVyRW5hYmxlZCA9IHRydWU7Ci0vLwkJfQotLy8JCXJldHVybiBpc0NvbnRyb2xsZXJFbmFibGVkIHx8IGlzUHJvdmlkZXJFbmFibGVkOwotLy8JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUgaWYgdmFsaWQgYW5ub3RhdGlvbiBwcm92aWRlcnMgZXhpc3QgYW5kIGlmCi0JICogdmFsaWQgcHJvamVjdCB2ZXJzaW9uIGxldmVscyBleGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHNob3VsZCBhbm5vdGF0aW9ucyBiZSBzdXBwb3J0ZWQgZm9yIHRoaXMgcHJvamVjdCBpbiB0aGlzCi0JICogICAgICAgICB3b3Jrc3BhY2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25zU3VwcG9ydGVkKCkgewotCQkvL1RPRE8gYWRkIHRoaXMgY2hlY2sgYmFjayBpbiBmb3IgZGVmZWN0IDE0NjY5NgotLy8JCWlmICghaXNBbm5vdGF0aW9uUHJvdmlkZXJEZWZpbmVkKCkpCi0vLwkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KFBST0pFQ1RfTkFNRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0JCVN0cmluZyBtb2R1bGVOYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoQ09NUE9ORU5UX05BTUUpOwotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8IG1vZHVsZU5hbWUgPT0gbnVsbCB8fCBtb2R1bGVOYW1lLmVxdWFscygiIikpcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGoyZWVWZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQoSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RWZXJzaW9uKHByb2plY3QpKTsKLQkJCi0JCXJldHVybiBqMmVlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gdmFsaWRhdGlvbiBvbiBhbnkKLQkgKiBvZiB0aGUgdmFsaWQgZGF0YSBtb2RlbCBwcm9wZXJ0aWVzIGluIHRoZSBoaWVyYXJjaHkuIEl0IGRvZXMgbm90IGFjY2VwdCBhCi0JICogbnVsbCBwYXJhbWV0ZXIuIFRoaXMgbWV0aG9kIHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIElTdGF0dXMgaXMgcHJvcGVydHkgdmFsdWUgdmFsaWQ/Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTVVBFUkNMQVNTKSkgewotCQkJLy8gSWYgb3VyIGRlZmF1bHQgaXMgdGhlIHN1cGVyY2xhc3MsIHdlIGtub3cgaXQgaXMgb2sKLQkJCWlmIChnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLmVxdWFscyhERUZBVUxUX1NVUEVSQ0xBU1MpKQkJCQotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQl9Ci0JCQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDTEFTU19OQU1FKSkgewotCQkJaWYgKGdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSkubGVuZ3RoKCkgIT0wICYmIGdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfRVhJU1RJTkdfQ0xBU1MpKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIE90aGVyd2lzZSBkZWZlciB0byBzdXBlciB0byB2YWxpZGF0ZSB0aGUgcHJvcGVydHkKLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gSXQgcHJvdmlkZXMgYSBzaW1wbGUKLQkgKiBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBpZiB0aGVyZSBhcmUgZHVwbGljYXRlIGVudHJpZXMgaW4gYSBsaXN0LiBJdCB3aWxsCi0JICogYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZUluaXRQYXJhbUxpc3QoTGlzdCkKLQkgKiBAc2VlIE5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGVVUkxNYXBwaW5nTGlzdChMaXN0KQotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4gYm9vbGVhbiBhcmUgdGhlcmUgZHVwcyBpbiB0aGUgbGlzdD8KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEdXBsaWNhdGVzSW5TdHJpbmdBcnJheUxpc3QoTGlzdCBpbnB1dCkgewotCQkvLyBJZiBsaXN0IGlzIG51bGwgb3IgZW1wdHkgcmV0dXJuIGZhbHNlCi0JCWlmIChpbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgbiA9IGlucHV0LnNpemUoKTsKLQkJYm9vbGVhbiBkdXAgPSBmYWxzZTsKLQkJLy8gbmVzdGVkIGZvciBsb29wcyB0byBjaGVjayBlYWNoIGVsZW1lbnQgdG8gc2VlIGlmIG90aGVyIGVsZW1lbnRzIGFyZSB0aGUgc2FtZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJU3RyaW5nW10gc0FycmF5MSA9IChTdHJpbmdbXSkgaW5wdXQuZ2V0KGkpOwotCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbjsgaisrKSB7Ci0JCQkJU3RyaW5nW10gc0FycmF5MiA9IChTdHJpbmdbXSkgaW5wdXQuZ2V0KGopOwotCQkJCWlmIChpc1R3b1N0cmluZ0FycmF5c0VxdWFsKHNBcnJheTEsIHNBcnJheTIpKSB7Ci0JCQkJCWR1cCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkdXApCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLy8gUmV0dXJuIGJvb2xlYW4gc3RhdHVzIGZvciBkdXBsaWNhdGVzCi0JCXJldHVybiBkdXA7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlCi0JICogdHdvIHN0cmluZyBhcnJheXMgYXJlIGVxdWFsLiBJZiBlaXRoZXIgb2YgdGhlIGFycmF5cyBhcmUgbnVsbCBvciBlbXB0eSwKLQkgKiBpdCByZXR1cm5zIGZhbHNlLgotCSAqIAotCSAqIEBzZWUgTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlciNoYXNEdXBsaWNhdGVzSW5TdHJpbmdBcnJheUxpc3QoTGlzdCkKLQkgKiAKLQkgKiBAcGFyYW0gc0FycmF5MQotCSAqIEBwYXJhbSBzQXJyYXkyCi0JICogQHJldHVybiBib29sZWFuIGFyZSBBcnJheXMgZXF1YWw/Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUd29TdHJpbmdBcnJheXNFcXVhbChTdHJpbmdbXSBzQXJyYXkxLCBTdHJpbmdbXSBzQXJyYXkyKSB7Ci0JCS8vIElmIGVpdGhlciBhcnJheSBpcyBudWxsLCByZXR1cm4gZmFsc2UKLQkJaWYgKHNBcnJheTEgPT0gbnVsbCB8fCBzQXJyYXkyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBuMSA9IHNBcnJheTEubGVuZ3RoOwotCQlpbnQgbjIgPSBzQXJyYXkxLmxlbmd0aDsKLQkJLy8gSWYgZWl0aGVyIGFycmF5IGlzIGVtcHR5LCByZXR1cm4gZmFsc2UKLQkJaWYgKG4xID09IDAgfHwgbjIgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gSWYgdGhleSBkb24ndCBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgcmV0dXJuIGZhbHNlCi0JCWlmIChuMSAhPSBuMikKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gSWYgdGhlaXIgZmlyc3QgZWxlbWVudHMgZG8gbm90IG1hdGNoLCByZXR1cm4gZmFsc2UKLQkJaWYgKCFzQXJyYXkxWzBdLmVxdWFscyhzQXJyYXkyWzBdKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gT3RoZXJ3aXNlIHJldHVybiB0cnVlCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc1N1cGVyQ2xhc3MoKSB7Ci0JCVN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoU1VQRVJDTEFTUyk7Ci0JCXJldHVybiAoc3VwZXJDbGFzcyA9PSBudWxsKSA/IGZhbHNlIDogc3VwZXJDbGFzcy50cmltKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbiBzaG91bGQgdGhlIGRlZmF1bHQgYW5ub3RhdGlvbnMgYmUgdHJ1ZT8KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIHNob3VsZERlZmF1bHRBbm5vdGF0aW9ucygpIHsKLQkJaWYgKHVzZUFubm90YXRpb25zKQotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1dlYkNsYXNzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3V2ViQ2xhc3NPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZjg4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3V2ViQ2xhc3NPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXIuQW5ub3RhdGlvbnNDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuV2ViRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLldGVFdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIFRoZSBOZXdXZWJDbGFzc09wZXJhdGlvbiBpcyBhbiBJRGF0YU1vZGVsT3BlcmF0aW9uIGZvbGxvd2luZyB0aGUgSURhdGFNb2RlbAotICogd2l6YXJkIGFuZCBvcGVyYXRpb24gZnJhbWV3b3JrLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBJdCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHRvIHByb3ZpZGUgd2ViIGFydGlmYWN0IHNwZWNpZmljIGphdmEKLSAqIGNsYXNzIGdlbmVyYXRpb24uCi0gKiBAc2VlIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgYnkgdGhlIEFkZFdlYkNsYXNzT3BlcmF0aW9uIHRvIGdlbmVyYXRlIGVpdGhlciBhbgotICogYW5ub3RhdGVkIG9yIG5vbiBhbm5vdGF0ZWQgamF2YSBjbGFzcyBmb3IgYW4gYWRkZWQgd2ViIGFydGlmYWN0LiBJdCBzaGFyZXMKLSAqIHRoZSBOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIHdpdGggdGhlIEFkZFdlYkNsYXNzT3BlcmF0aW9uIHRvIHN0b3JlIHRoZQotICogYXBwcm9wcmlhdGUgcHJvcGVydGllcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGUgbmV3IHdlYiBhcnRpZmFjdC4KLSAqIAotICogQHNlZSBBZGRXZWJDbGFzc09wZXJhdGlvbgotICogQHNlZSBOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIEluIHRoZSBhbm5vdGF0ZWQgY2FzZSwgYSBXVFBKZXRFbWl0dGVyIGxpc3RlbmVyIHRlbXBsYXRlIGlzIGNyZWF0ZWQgYW5kIHVzZWQKLSAqIHRvIGdlbmVyYXRlIHRoZSBsaXN0ZW5lciBqYXZhIGNsYXNzIHdpdGggdGhlIGVtYmVkZGVkIGFubm90YXRlZCB0YWdzLgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LldUUEpFVEVtaXR0ZXIKLSAqIEBzZWUgQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsCi0gKiAKLSAqIEluIHRoZSBub24gYW5ub3RhdGVkIGNhc2UsIHRoZSBzYW1lIGVtaXR0ZXIgaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNsYXNzIHdpdGgKLSAqIHRoZSBub24gYW5ub3RhdGVkIHdlYiBhcnRpZmFjdCB0ZW1wbGF0ZSBzbyB0aGUgYW5ub3RhdGVkIHRhZ3MgYXJlIG9taXR0ZWQuCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG9wZXJhdGlvbiB0byBwcm92aWRlIHRoZWlyIG93biBzcGVjaWZpYyB3ZWIKLSAqIGFydGlmYWN0IGphdmEgY2xhc3MgZ2VuZXJhdGlvbi4gVGhlIGV4ZWN1dGUgbWV0aG9kIG1heSBiZSBleHRlbmRlZCB0byBkbyBzby4KLSAqIEFsc28sIGdlbmVyYXRlVXNpbmdUZW1wbGF0ZXMgaXMgZXhwb3NlZC4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3V2ViQ2xhc3NPcGVyYXRpb24gZXh0ZW5kcyBOZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIFhEb2NsZXQgZmFjZXQgY29uc3RhbnRzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTVF9XRUJfWERPQ0xFVF9WRVJTSU9OID0gIjEuMi4zIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIHZhcmlhYmxlIGZvciB0aGUgd2ViIHBsdWdpbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QTFVHSU4gPSAiV0VCX1BMVUdJTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYQotCSAqIE5ld1dlYkNsYXNzT3BlcmF0aW9uLiBBbiBpbnN0YW5jZSBvZiB0aGUgTmV3V2ViQ2xhc3NEYXRhTW9kZWwgc2hvdWxkIGJlCi0JICogcGFzc2VkIGluLiBUaGlzIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlci4gSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbiNBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbihJRGF0YU1vZGVsKQotCSAqIEBzZWUgTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbAotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiBAcmV0dXJuIE5ld0xpc3RlbmVyQ2xhc3NPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTmV3V2ViQ2xhc3NPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24gdGVtcGxhdGUgYmFzZWQKLQkgKiBjcmVhdGlvbiBvZiBhbiBhbm5vdGF0ZWQgd2ViIGFydGlmYWN0IGphdmEgY2xhc3MgZmlsZS4gVGhpcyBpbXBsZW1lbnRhdGlvbgotCSAqIHVzZXMgdGhlIGNyZWF0aW9uIG9mIGEgQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsIGFuZCB0aGUgV1RQSmV0RW1pdHRlcgotCSAqIHRvIGNyZWF0ZSB0aGUgamF2YSBjbGFzcyB3aXRoIHRoZSBhbm5vdGF0ZWQgdGFncy4gVGhpcyBtZXRob2QgYWNjZXB0cwotCSAqIG51bGwgZm9yIG1vbml0b3IsIGl0IGRvZXMgbm90IGFjY2VwdCBudWxsIGZvciBmcmFnbWVudC4gSWYgYW5ub3RhdGlvbnMKLQkgKiBhcmUgbm90IGJlaW5nIHVzZWQgdGhlIHRhZ3Mgd2lsbCBiZSBvbWl0dGVkIGZyb20gdGhlIGNsYXNzLgotCSAqIAotCSAqIEBzZWUgQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsCi0JICogQHNlZSAjZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZShDcmVhdGVXZWJDbGFzc1RlbXBsYXRlTW9kZWwsIElQcm9ncmVzc01vbml0b3IpCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gZnJhZ21lbnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFdGVFdyYXBwZWRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCkgdGhyb3dzIFdGVFdyYXBwZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBDcmVhdGUgdGhlIHdlYiBhcnRpZmFjdCB0ZW1wbGF0ZSBtb2RlbAotCQlDcmVhdGVXZWJDbGFzc1RlbXBsYXRlTW9kZWwgdGVtcE1vZGVsID0gY3JlYXRlVGVtcGxhdGVNb2RlbCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCQlTdHJpbmcgc291cmNlOwotCQl0cnkgewotCQkJLy8gZ2VuZXJhdGUgdGhlIGphdmEgc291cmNlIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSBtb2RlbAotCQkJc291cmNlID0gZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZShXZWJQbHVnaW4uZ2V0UGx1Z2luKCksIHRlbXBNb2RlbCwgZ2V0VGVtcGxhdGVGaWxlKCksIGdldFRlbXBsYXRlSW1wbGVtZW50YXRpb24oKSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgV0ZUV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJfQotCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIHRoZSBqYXZhIGZpbGUKLQkJCVN0cmluZyBqYXZhRmlsZU5hbWUgPSB0ZW1wTW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKyBET1RfSkFWQTsKLQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBmcmFnbWVudC5nZXRDb21waWxhdGlvblVuaXQoamF2YUZpbGVOYW1lKTsKLQkJCS8vIEFkZCB0aGUgY29tcGlsYXRpb24gdW5pdCB0byB0aGUgamF2YSBmaWxlCi0JCQlpZiAoY3UgPT0gbnVsbCB8fCAhY3UuZXhpc3RzKCkpCi0JCQkJY3UgPSBmcmFnbWVudC5jcmVhdGVDb21waWxhdGlvblVuaXQoamF2YUZpbGVOYW1lLCBzb3VyY2UsIHRydWUsIG1vbml0b3IpOwotCQkJSUZpbGUgYUZpbGUgPSAoSUZpbGUpIGN1LmdldFJlc291cmNlKCk7Ci0JCQkvLyBMZXQgdGhlIGFubm90YXRpb25zIGNvbnRyb2xsZXIgcHJvY2VzcyB0aGUgYW5ub3RhdGVkIHJlc291cmNlCi0JCQlBbm5vdGF0aW9uc0NvbnRyb2xsZXIgY29udHJvbGxlciA9IEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVyKHByb2plY3QpOwotCQkJaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkKLQkJCQljb250cm9sbGVyLnByb2Nlc3MoYUZpbGUpOwotCQl9Ci0JCQotCQkvLyBBZGQgdGhlIHhkb2NsZXQgZmFjZXQsIGlmIG5lY2Vzc2FyeSwgZm9yIHhkb2NsZXQgbGlzdGVuZXIgY3JlYXRpb24KLQkJdHJ5IHsKLQkJCWluc3RhbGxYRG9jbGV0RmFjZXRJZk5lY2Vzc2FyeShtb25pdG9yLCBwcm9qZWN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXRlRXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIHdpbGwgYWRkIGFuIHdlYmRvY2xldCBmYWNldCB0byB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxYRG9jbGV0RmFjZXQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQlTZXQgZml4ZWRGYWNldHMgPSBmYWNldGVkUHJvamVjdC5nZXRGaXhlZFByb2plY3RGYWNldHMoKTsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCwgSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQl9YRE9DTEVUKTsKLQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSlNUX1dFQl9YRE9DTEVUX1ZFUlNJT04pOwotCQlJRGF0YU1vZGVsIGZkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQlmZG0uc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQotCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIGZkbS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JCW1hcC5hZGQoZG0pOwotCi0JCWZkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJZmFjZXRlZFByb2plY3Quc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKGZpeGVkRmFjZXRzKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIHdpbGwgY2hlY2sgdG8gc2VlIGlmIGl0IG5lZWRzIHRvIGFkZCBhbiAKLQkgKiB3ZWJkb2NsZXQgZmFjZXQgdG8gdGhlIHByb2plY3QuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnN0YWxsWERvY2xldEZhY2V0SWZOZWNlc3NhcnkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQotCQkvLyBJZiBub3QgdXNpbmcgYW5ub3RhdGlvbnMsIGlnbm9yZSB0aGUgeGRvY2xldCBmYWNldAotCQlpZiAoIW1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfQU5OT1RBVElPTlMpKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gSWYgYW4gZXh0ZW5kZWQgYW5ub3RhdGlvbnMgcHJvY2Vzc29yIGlzIGFkZGVkLCBpZ25vcmUgdGhlIGRlZmF1bHQgeGRvY2xldCBvbmUKLQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5JTlNUQU5DRS5nZXREZXNjcmlwdG9yKGdldFRhcmdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7Ci0JCWlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gT3RoZXJ3aXNlIGNoZWNrIGFuZCBzZWUgaWYgdGhlIHhkb2NsZXQgZmFjZXQgaXMgb24gdGhlIHByb2plY3QgeWV0Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJaWYgKCFmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoV2ViRmFjZXRVdGlscy5XRUJfWERPQ0xFVF9GQUNFVCkpCi0JCQlyZXR1cm47Ci0JCQkKLQkJLy8gSW5zdGFsbCB4ZG9jbGV0IGZhY2V0Ci0JCWluc3RhbGxYRG9jbGV0RmFjZXQobW9uaXRvciwgcHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCB0bwotCSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgV1RQSkVURW1pdHRlci4gVGhpcyBtZXRob2Qgd2lsbCBub3QKLQkgKiByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbAotCSAqIEBzZWUgTmV3V2ViQ2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgSVBhY2thZ2VGcmFnbWVudCkKLQkgKiAKLQkgKiBAcmV0dXJuIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDcmVhdGVXZWJDbGFzc1RlbXBsYXRlTW9kZWwgY3JlYXRlVGVtcGxhdGVNb2RlbCgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBmaWxlIHRoYXQgd2lsbCBiZQotCSAqIHBhc3NlZCB0byB0aGUgV1RQSkVURW1pdHRlciB0byBnZW5lcmF0ZSB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24KLQkgKiBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHBhdGggdG8gdGhlIHRlbXBsYXRlIGZpbGUuIAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VGVtcGxhdGVGaWxlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgKiB0aGF0IGlzIHN0YXRpY2FsbHkgY29tcGlsZWQgaW4gdGhlIHBsdWdpbi4gVGhpcyBpbnN0YW5jZSBjYW4gYmUgdXNlZCB0bwotCSAqIGdlbmVyYXRlIHRoZSBhcnRpZmFjdCdzIGNvZGUgd2l0aG91dCB1c2luZyB0aGUgV1RQSkVURW1pdHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRUZW1wbGF0ZUltcGxlbWVudGF0aW9uKCk7Ci0KLQlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50IGdldFRhcmdldENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFRhcmdldFByb2plY3QoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1NlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmxldFN1cGVydHlwZXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxMWE2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmxldFN1cGVydHlwZXNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0dFTkVSSUNfU0VSVkxFVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFUlZMRVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdXBlcnR5cGVzVmFsaWRhdG9yIHsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIdHRwU2VydmxldFN1cGVyY2xhc3MoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKFFVQUxJRklFRF9IVFRQX1NFUlZMRVQuZXF1YWxzKGdldFN1cGVyY2xhc3MoZGF0YU1vZGVsKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmIChoYXNTdXBlcmNsYXNzKGRhdGFNb2RlbCwgZ2V0U3VwZXJjbGFzcyhkYXRhTW9kZWwpLCBRVUFMSUZJRURfSFRUUF9TRVJWTEVUKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dlbmVyaWNTZXJ2bGV0U3VwZXJjbGFzcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAoUVVBTElGSUVEX0hUVFBfU0VSVkxFVC5lcXVhbHMoZ2V0U3VwZXJjbGFzcyhkYXRhTW9kZWwpKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYgKFFVQUxJRklFRF9HRU5FUklDX1NFUlZMRVQuZXF1YWxzKGdldFN1cGVyY2xhc3MoZGF0YU1vZGVsKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmIChoYXNTdXBlcmNsYXNzKGRhdGFNb2RlbCwgZ2V0U3VwZXJjbGFzcyhkYXRhTW9kZWwpLCBRVUFMSUZJRURfR0VORVJJQ19TRVJWTEVUKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZXJ2bGV0U3VwZXJjbGFzcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAoUVVBTElGSUVEX0hUVFBfU0VSVkxFVC5lcXVhbHMoZ2V0U3VwZXJjbGFzcyhkYXRhTW9kZWwpKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYgKFFVQUxJRklFRF9HRU5FUklDX1NFUlZMRVQuZXF1YWxzKGdldFN1cGVyY2xhc3MoZGF0YU1vZGVsKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmIChnZXRJbnRlcmZhY2VzKGRhdGFNb2RlbCkuY29udGFpbnMoUVVBTElGSUVEX1NFUlZMRVQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZiAoaGFzU3VwZXJJbnRlcmZhY2UoZGF0YU1vZGVsLCBnZXRTdXBlcmNsYXNzKGRhdGFNb2RlbCksIFFVQUxJRklFRF9TRVJWTEVUKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJZm9yIChPYmplY3QgaWZhY2UgOiBnZXRJbnRlcmZhY2VzKGRhdGFNb2RlbCkpIHsKLQkJCWlmIChoYXNTdXBlckludGVyZmFjZShkYXRhTW9kZWwsIChTdHJpbmcpIGlmYWNlLCBRVUFMSUZJRURfU0VSVkxFVCkpIAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmxldFRlbXBsYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmxldFRlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODFlMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1NlcnZsZXRUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgU2VydmxldFRlbXBsYXRlCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG5sOwotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTZXJ2bGV0VGVtcGxhdGUgY3JlYXRlKFN0cmluZyBsaW5lU2VwYXJhdG9yKQotICB7Ci0gICAgbmwgPSBsaW5lU2VwYXJhdG9yOwotICAgIFNlcnZsZXRUZW1wbGF0ZSByZXN1bHQgPSBuZXcgU2VydmxldFRlbXBsYXRlKCk7Ci0gICAgbmwgPSBudWxsOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIE5MID0gbmwgPT0gbnVsbCA/IChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKSA6IG5sOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMSA9ICJwYWNrYWdlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNCA9IE5MICsgImltcG9ydCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNSA9ICI7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYgPSBOTDsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzcgPSBOTDsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzggPSAiLyoqIiArIE5MICsgIiAqIFNlcnZsZXQgaW1wbGVtZW50YXRpb24gY2xhc3MgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzkgPSBOTCArICIgKiIgKyBOTCArICIgKiBAd2ViLnNlcnZsZXQiICsgTkwgKyAiICogICBuYW1lPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEwID0gIlwiIiArIE5MICsgIiAqICAgZGlzcGxheS1uYW1lPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzExID0gIlwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEyID0gTkwgKyAiICogICBkZXNjcmlwdGlvbj1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMyA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNCA9IE5MICsgIiAqIiArIE5MICsgIiAqIEB3ZWIuc2VydmxldC1tYXBwaW5nIiArIE5MICsgIiAqICAgdXJsLXBhdHRlcm49XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTUgPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTYgPSBOTCArICIgKiIgKyBOTCArICIgKiBAd2ViLnNlcnZsZXQtaW5pdC1wYXJhbSIgKyBOTCArICIgKiAgICBuYW1lPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE3ID0gIlwiIiArIE5MICsgIiAqICAgIHZhbHVlPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE4ID0gIlwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gTkwgKyAiICogICAgZGVzY3JpcHRpb249XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjAgPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjEgPSBOTCArICIgKi8iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjIgPSBOTCArICJwdWJsaWMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIzID0gImFic3RyYWN0ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNCA9ICJmaW5hbCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjUgPSAiY2xhc3MgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gIiBleHRlbmRzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNyA9ICIgaW1wbGVtZW50cyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjggPSAiLCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjkgPSAiIHsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzAgPSBOTCArICJcdHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMSA9IE5MICsgTkwgKyAiICAgIC8qKiIgKyBOTCArICIgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gIiArIE5MICsgIiAgICAgKi8iICsgTkwgKyAiICAgIHB1YmxpYyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzIgPSAiKCkgeyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YiIgKyBOTCArICIgICAgfSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMyA9IE5MICsgIiAgICAgICAiICsgTkwgKyAiICAgIC8qKiIgKyBOTCArICIgICAgICogQHNlZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzQgPSAiIyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNSA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM2ID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNyA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM4ID0gIikgeyIgKyBOTCArICIgICAgICAgIHN1cGVyKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOSA9ICIpOyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YiIgKyBOTCArICIgICAgfSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MCA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiICAgICAqIEBzZWUgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQxID0gIiMiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDIgPSAiKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MyA9ICIpIiArIE5MICsgIiAgICAgKi8iICsgTkwgKyAiICAgIHB1YmxpYyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDQgPSAiICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NSA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ2ID0gIikgeyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDcgPSBOTCArICJcdFx0XHRyZXR1cm4gIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ4ID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDkgPSBOTCArICIgICAgfSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MCA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIFNlcnZsZXQjaW5pdChTZXJ2bGV0Q29uZmlnKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUxID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgU2VydmxldCNkZXN0cm95KCkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBkZXN0cm95KCkgeyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTIgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBTZXJ2bGV0I2dldFNlcnZsZXRDb25maWcoKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyBTZXJ2bGV0Q29uZmlnIGdldFNlcnZsZXRDb25maWcoKSB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0XHRyZXR1cm4gbnVsbDsiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUzID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgU2VydmxldCNnZXRTZXJ2bGV0SW5mbygpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHVibGljIFN0cmluZyBnZXRTZXJ2bGV0SW5mbygpIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHRcdHJldHVybiBudWxsOyAiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU0ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgU2VydmxldCNzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU1ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgSHR0cFNlcnZsZXQjc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwcm90ZWN0ZWQgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTYgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU3ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgSHR0cFNlcnZsZXQjZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU4ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgSHR0cFNlcnZsZXQjZG9QdXQoSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHByb3RlY3RlZCB2b2lkIGRvUHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTkgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb0RlbGV0ZShIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9EZWxldGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MCA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvSGVhZChIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9IZWFkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjEgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb09wdGlvbnMoSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHByb3RlY3RlZCB2b2lkIGRvT3B0aW9ucyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYyID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgSHR0cFNlcnZsZXQjZG9UcmFjZShIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9UcmFjZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYzID0gTkwgKyBOTCArICJ9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzY0ID0gTkw7Ci0KLSAgcHVibGljIFN0cmluZyBnZW5lcmF0ZShPYmplY3QgYXJndW1lbnQpCi0gIHsKLSAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICBDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbCBtb2RlbCA9IChDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbCkgYXJndW1lbnQ7IAotICAgIAotCW1vZGVsLnJlbW92ZUZsYWdzKENyZWF0ZUphdmFFRUFydGlmYWN0VGVtcGxhdGVNb2RlbC5GTEFHX1FVQUxJRklFRF9TVVBFUkNMQVNTX05BTUUpOyAKLQotICAgIAotCWlmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSAhPSBudWxsICYmIG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpLmxlbmd0aCgpID4gMCkgewotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIpOwotICAgIAotCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zKTsKLSAgICAgCi0JQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKCk7Ci0JZm9yIChTdHJpbmcgYW5JbXBvcnQgOiBpbXBvcnRzKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGFuSW1wb3J0ICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUpOwotICAgICAKLQl9Ci0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgICAKLQlpZiAobW9kZWwuaXNBbm5vdGF0ZWQoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF85KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRTZXJ2bGV0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRTZXJ2bGV0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzExKTsKLSAgICAgCi0JCWlmIChtb2RlbC5nZXREZXNjcmlwdGlvbigpICE9IG51bGwgJiYgbW9kZWwuZ2V0RGVzY3JpcHRpb24oKS5sZW5ndGgoKSA+IDApIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldERlc2NyaXB0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTMpOwotICAgICAKLQkJfSAKLQkJCi0JCUxpc3Q8U3RyaW5nW10+IG1hcHBpbmdzID0gbW9kZWwuZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0gCQlpZiAobWFwcGluZ3MgIT0gbnVsbCAmJiBtYXBwaW5ncy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG1hcCA9IG1vZGVsLmdldFNlcnZsZXRNYXBwaW5nKGkpOyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1hcCApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNSk7Ci0gICAgIAotCQkJfSAKLQkJfQotIAkJTGlzdDxTdHJpbmdbXT4gaW5pdFBhcmFtcyA9IG1vZGVsLmdldEluaXRQYXJhbXMoKTsKLSAJCWlmIChpbml0UGFyYW1zICE9IG51bGwgJiYgaW5pdFBhcmFtcy5zaXplKCkgPiAwKSB7Ci0gICAgCQlmb3IgKGludCBpID0gMDsgaSA8IGluaXRQYXJhbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IG1vZGVsLmdldEluaXRQYXJhbShpLCBDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbC5OQU1FKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBtb2RlbC5nZXRJbml0UGFyYW0oaSwgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuVkFMVUUpOwotIAkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBtb2RlbC5nZXRJbml0UGFyYW0oaSwgQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuREVTQ1JJUFRJT04pOyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbmFtZSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggdmFsdWUgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTgpOwotICAgICAKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCAmJiBkZXNjcmlwdGlvbi5sZW5ndGgoKSA+IDApIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGRlc2NyaXB0aW9uICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIwKTsKLSAgICAKLQkJCQl9Ci0JCQl9IAotCQl9IAotCX0gCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjEpOwotICAgIAotCWlmIChtb2RlbC5pc1B1YmxpYygpKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIyKTsKLSAgICAgCi0JfSAKLQotCWlmIChtb2RlbC5pc0Fic3RyYWN0KCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjMpOwotICAgIAotCX0KLQotCWlmIChtb2RlbC5pc0ZpbmFsKCkpIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNCk7Ci0gICAgCi0JfQotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI1KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgIAotCVN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLSAJaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiBzdXBlckNsYXNzLmxlbmd0aCgpID4gMCkgewotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI2KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBzdXBlckNsYXNzICk7Ci0gICAgCi0JfQotCi0JTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAotIAlpZiAoIGludGVyZmFjZXMuc2l6ZSgpID4gMCkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNyk7Ci0gICAgCi0JfQotCQotIAlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLSAgIAkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotICAgCQlpZiAoaSA+IDApIHsKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOCk7Ci0gICAgCi0JCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIElOVEVSRkFDRSApOwotICAgIAotCX0KLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOSk7Ci0gICAgIAotCWlmIChtb2RlbC5pc0dlbmVyaWNTZXJ2bGV0U3VwZXJjbGFzcygpKSB7IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMwKTsKLSAgICAgCi0JfSAKLQotICAgICAKLQlpZiAoIW1vZGVsLmhhc0VtcHR5U3VwZXJjbGFzc0NvbnN0cnVjdG9yKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldENsYXNzTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMyKTsKLSAgICAgCi0JfSAKLQotCWlmIChtb2RlbC5zaG91bGRHZW5TdXBlcmNsYXNzQ29uc3RydWN0b3JzKCkpIHsKLQkJTGlzdDxDb25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JzID0gbW9kZWwuZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCWZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgOiBjb25zdHJ1Y3RvcnMpIHsKLQkJCWlmIChjb25zdHJ1Y3Rvci5pc1B1YmxpYygpIHx8IGNvbnN0cnVjdG9yLmlzUHJvdGVjdGVkKCkpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzMpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckphdmFkb2MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzgpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckNhbGwoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zOSk7Ci0gICAgCi0JCQl9IAotCQl9IAotCX0gCi0KLSAgICAKLQlpZiAobW9kZWwuc2hvdWxkSW1wbGVtZW50QWJzdHJhY3RNZXRob2RzKCkpIHsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogbW9kZWwuZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZHMoKSkgeyAKLQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldE5hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Mik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFBhcmFtc0ZvckphdmFkb2MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Myk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFJldHVyblR5cGUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldE5hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDYpOwotICAgICAKLQkJCVN0cmluZyBkZWZhdWx0UmV0dXJuVmFsdWUgPSBtZXRob2QuZ2V0RGVmYXVsdFJldHVyblZhbHVlKCk7Ci0JCQlpZiAoZGVmYXVsdFJldHVyblZhbHVlICE9IG51bGwpIHsgCi0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGRlZmF1bHRSZXR1cm5WYWx1ZSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OCk7Ci0gICAgCi0JCQl9IAotCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ5KTsKLSAgICAgCi0JCX0KLQl9IAotCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5Jbml0KCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUwKTsKLSAgICAgfSAKLSAgICAgaWYgKG1vZGVsLnNob3VsZEdlbkRlc3Ryb3koKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTEpOwotICAgICB9IAotICAgICBpZiAobW9kZWwuc2hvdWxkR2VuR2V0U2VydmxldENvbmZpZygpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Mik7Ci0gICAgIH0gCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5HZXRTZXJ2bGV0SW5mbygpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Myk7Ci0gICAgIH0gCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5TZXJ2aWNlKCkgJiYgIW1vZGVsLmlzSHR0cFNlcnZsZXRTdXBlcmNsYXNzKCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU0KTsKLSAgICAgfSAKLSAgICAgaWYgKG1vZGVsLnNob3VsZEdlblNlcnZpY2UoKSAmJiBtb2RlbC5pc0h0dHBTZXJ2bGV0U3VwZXJjbGFzcygpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81NSk7Ci0gICAgIH0gCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5Eb0dldCgpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Nik7Ci0gICAgIH0gCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5Eb1Bvc3QoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTcpOwotICAgICB9IAotICAgICBpZiAobW9kZWwuc2hvdWxkR2VuRG9QdXQoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTgpOwotICAgICB9IAotICAgICBpZiAobW9kZWwuc2hvdWxkR2VuRG9EZWxldGUoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTkpOwotICAgICB9IAotICAgICBpZiAobW9kZWwuc2hvdWxkR2VuRG9IZWFkKCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYwKTsKLSAgICAgfSAKLSAgICAgaWYgKG1vZGVsLnNob3VsZEdlbkRvT3B0aW9ucygpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82MSk7Ci0gICAgIH0gCi0gICAgIGlmIChtb2RlbC5zaG91bGRHZW5Eb1RyYWNlKCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYyKTsKLSAgICAgfSAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjMpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82NCk7Ci0gICAgcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvV2ViTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2RkMTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAid2ViIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdlYk1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfSkFSX05BTUVfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0pBUl9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9KQVZBX1BST0pFQ1RfTkFNRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfSkFWQV9QUk9KRUNUX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0RVUExJQ0FURURfSU5JVF9QQVJBTUVURVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0RVUExJQ0FURURfVVJMX01BUFBJTkc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9NQVBQSU5HX1VSTF9QQVRURVJOX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9GSUxURVJfUEFSQU1FVEVSX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0ZJTFRFUl9NQVBQSU5HX1NFUlZMRVRfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0ZJTFRFUl9NQVBQSU5HX1NFUlZMRVRfRElTUEFUQ0hFUl9UWVBFU19FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9NQVBQSU5HX1VSTF9QQVRURVJOX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9VUkxfTUFQUElOR19MSVNUX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9VUkxfUEFUVEVSTl9JTlZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9GSUxURVJfTUFQUElOR19FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRElTUExBWV9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX0NMQVNTX05BTUVfVVNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9KQVZBX0NMQVNTX05BTUVfSU5WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9NQVBQSU5HX1NFUlZMRVRfTk9UX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX1NFUlZMRVRfRElTUExBWV9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX1BBUkFNRVRFUl9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX1BBUkFNRVRFUl9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX1BBUkFNRVRFUl9WQUxVRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9QQVJBTUVURVJfVkFMVUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX1NFUlZMRVRfUk9MRV9SRUZfTkFNRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9ST0xFX1JFRl9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX1JPTEVfTElOS19FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VSVkxFVF9JTlRFUkZBQ0U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRklMVEVSX0RJU1BMQVlfTkFNRV9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRklMVEVSX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0ZJTFRFUl9DTEFTU19OQU1FX1VTRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0ZJTFRFUl9DTEFTU19OQU1FX0lOVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0xJU1RFTkVSX0RJU1BMQVlfTkFNRV9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfTElTVEVORVJfQ0xBU1NfTkFNRV9VU0VEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9MSVNURU5FUl9DTEFTU19OQU1FX0lOVkFMSUQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfUEFHRV9FTkNPRElOR19FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfUEFHRV9FTkNPRElOR19FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfVVJMX1BBVFRFUk5fRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0lOQ0xVREVfUFJFTFVERVNfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0lOQ0xVREVfQ09EQVNfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX1NFQ1VSSVRZX0NPTlNUUkFJTlRfTkFNRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfU0VDVVJJVFlfQ09OU1RSQUlOVF9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9DT05URVhUX1BBUkFNRVRFUl9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9DT05URVhUX1BBUkFNRVRFUl9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9SRVNPVVJDRV9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9SRVNPVVJDRV9OQU1FX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9VUkxfUEFUVEVSTlNfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX01JTUVfTUFQUElOR19FWFRFTlNJT05fRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX01JTUVfTUFQUElOR19FWFRFTlNJT05fRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX1dFTENPTUVfUEFHRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfV0VMQ09NRV9QQUdFX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9FTlZfRU5UUllfTkFNRV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRU5WX0VOVFJZX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0VSUk9SX0NPREVfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0VSUk9SX0NPREVfTVVTVF9CRV8zX0RJR0lUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRVJST1JfUEFHRV9MT0NBVElPTl9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRVJST1JfUEFHRV9MT0NBVElPTl9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRVJST1JfUEFHRV9MT0NBVElPTl9NVVNUX1NUQVJUX1dJVEhfU0xBU0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0VYQ0VQVElPTl9UWVBFX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9FWENFUFRJT05fU0VDVVJJVFlfSURfTk9fQkVBTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0VYQ0VQVElPTl9ST0xFX05BTUVfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0xPQ0FMRV9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9MT0NBTEVfTkFNRV9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfVEFHTElCUkVGX1VSTF9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfVEFHTElCUkVGX1VSTF9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9NRVNTQUdFX0RFU1RJTkFUSU9OX05BTUVfRVhJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0VYQ0VQVElPTl9NRVRIT0RfRUxFTUVOVF9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJfRVhDRVBUSU9OX01FVEhPRF9UUkFOU0FDVElPTl9BVFRSSUJVVEVTX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9TRVJWTEVUX0xJU1RfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJSX0ZJTFRFUl9MSVNUX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9MSVNURU5FUl9MSVNUX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUl9OT19MSVNURU5FUl9TRUxFQ1RFRDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdlYk1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcGx1Z2luL1dlYk1vZHVsZUV4dGVuc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcGx1Z2luL1dlYk1vZHVsZUV4dGVuc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkM2Y5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3BsdWdpbi9XZWJNb2R1bGVFeHRlbnNpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjksIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlCi0gKiBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVFeHRlbnNpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5XZWJNb2R1bGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFSmF2YVByb2plY3RJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLQotCi1wdWJsaWMgY2xhc3MgV2ViTW9kdWxlRXh0ZW5zaW9uSW1wbCBleHRlbmRzIEVhck1vZHVsZUV4dGVuc2lvbkltcGwgaW1wbGVtZW50cyBXZWJNb2R1bGVFeHRlbnNpb24gewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFdlYk1vZHVsZUV4dGVuc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uV2ViTW9kdWxlRXh0ZW5zaW9uI2NyZWF0ZVByb2plY3RJbmZvKCkKLQkgKi8KLQlwdWJsaWMgSjJFRUphdmFQcm9qZWN0SW5mbyBjcmVhdGVQcm9qZWN0SW5mbygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5XZWJNb2R1bGVFeHRlbnNpb24jYWRkV0xQUHJvamVjdHMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QsCi0JICogICAgICBqYXZhLnV0aWwuU2V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFdMUFByb2plY3RzKElQcm9qZWN0IGFQcm9qZWN0LCBTZXQgcHJvamVjdHNUb0J1aWxkKSB7Ci0JCS8vIEoyRUVXZWJOYXR1cmVSdW50aW1lIG5hdHVyZSA9IEoyRUVXZWJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUoYVByb2plY3QpOwotCQkvLyBpZiAobmF0dXJlID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8gSUxpYk1vZHVsZVtdIGxpYk1vZHVsZXMgPSBuYXR1cmUuZ2V0TGliTW9kdWxlcygpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGxpYk1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJLy8gSVByb2plY3QgcCA9IGxpYk1vZHVsZXNbaV0uZ2V0UHJvamVjdCgpOwotCQkvLyBpZiAocC5pc0FjY2Vzc2libGUoKSkKLQkJLy8gcHJvamVjdHNUb0J1aWxkLmFkZChsaWJNb2R1bGVzW2ldLmdldFByb2plY3QoKSk7Ci0JCS8vIH0KLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLldlYk1vZHVsZUV4dGVuc2lvbiNzZXRDb250ZXh0Um9vdEZvck1vZHVsZU1hcHBpbmcob3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uV2ViTW9kdWxlLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dFJvb3RGb3JNb2R1bGVNYXBwaW5nKFdlYk1vZHVsZSB3ZWJNb2R1bGUsIElQcm9qZWN0IG5lc3RlZFByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJLy8gVE9ETyBtaWdyYXRlIHRvIGZsZXggcHJvamVjdAotCQkJLy8gd2ViRWRpdCA9IChXZWJBcnRpZmFjdEVkaXQpIFN0cnVjdHVyZUVkaXQuZ2V0Rmlyc3RBcnRpZmFjdEVkaXRGb3JSZWFkKCBuZXN0ZWRQcm9qZWN0Ci0JCQkvLyApOwotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkgewotCQkJCXdlYkVkaXQuc2V0U2VydmVyQ29udGV4dFJvb3Qod2ViTW9kdWxlLmdldENvbnRleHRSb290KCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLQkJCQl3ZWJFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQkvLyBpZiAod25yICE9IG51bGwpIHsKLQkJLy8gd25yLnNldENvbnRleHRSb290KHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpKTsKLQkJLy8gfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLldlYk1vZHVsZUV4dGVuc2lvbiNoYXNSdW50aW1lKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCQkvLyByZXR1cm4gSjJFRVdlYk5hdHVyZVJ1bnRpbWVVdGlsaXRpZXMuaGFzSjJFRVJ1bnRpbWUocHJvamVjdCk7Ci0JCS8vIFRvIGRvOiB3b3JrIGJhc2VkIG9uIG1vZHVsZQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gcHVibGljIEoyRUVJbXBvcnRPcGVyYXRpb25PTEQgY3JlYXRlSW1wb3J0T3BlcmF0aW9uKElQcm9qZWN0Ci0JLy8gbmVzdGVkUHJvamVjdCwgV0FSRmlsZSB3YXJGaWxlLCBFQVJJbXBvcnRDb25maWd1cmF0aW9uIGltcG9ydENvbmZpZyl7Ci0JLy8gV2FySW1wb3J0T3BlcmF0aW9uIG9wID0gbmV3IFdhckltcG9ydE9wZXJhdGlvbihuZXN0ZWRQcm9qZWN0LCB3YXJGaWxlKTsKLQkvLyAvL29wLnNldFNlcnZlclRhcmdldChpbmZvLmdldFNlcnZlclRhcmdldCgpKTsKLQkvLyBIYXNoTWFwIG9wTWFwID0gaW1wb3J0Q29uZmlnLmNyZWF0ZVByb2plY3RPcHRpb247Ci0JLy8gaWYob3BNYXAgIT0gbnVsbCAmJiAhb3BNYXAuaXNFbXB0eSgpKQotCS8vIG9wLmNyZWF0ZVdMUHJvamVjdE9wdGlvbnMgPSBvcE1hcDsKLQkvLyByZXR1cm4gb3A7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uV2ViTW9kdWxlRXh0ZW5zaW9uI2dldENvbnRlbnRGb2xkZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5GaWxlKQotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50Rm9sZGVyKElQcm9qZWN0IHByb2plY3QsIElGaWxlIHdlYlNldHRpbmdzRmlsZSkgewotCQlTdHJpbmcgY29udGVudEZvbGRlciA9IG51bGw7Ci0KLQkJLy8gV2ViU2V0dGluZ3Mgd2ViU2V0dGluZ3MgPSBuZXcgV2ViU2V0dGluZ3MocHJvamVjdCwgd2ViU2V0dGluZ3NGaWxlKTsKLQkJLy8gaWYgKHdlYlNldHRpbmdzICE9IG51bGwpIHsKLQkJLy8gY29udGVudEZvbGRlciA9IHdlYlNldHRpbmdzLmdldFdlYkNvbnRlbnROYW1lKCk7Ci0JCS8vIH0KLQkJLy8gVG8gZG86IE5lZWRzIHdvcmsgaGVyZSwgbm8gY29udGVudCBmb2xkZXIgZXhpc3RzIG5vdwotCQlXZWJBcnRpZmFjdEVkaXQgd2ViRWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPIG1pZ3JhdGUgdG8gZmxleCBwcm9qZWN0Ci0JCQkvLyB3ZWJFZGl0ID0gKFdlYkFydGlmYWN0RWRpdCkgU3RydWN0dXJlRWRpdC5nZXRGaXJzdEFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQlpZiAod2ViRWRpdCAhPSBudWxsKSB7Ci0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpCi0JCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudEZvbGRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5XZWJNb2R1bGVFeHRlbnNpb24jY29tcGFyZVdlYkNvbnRleHRSb290KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLk1vZHVsZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbXBhcmVXZWJDb250ZXh0Um9vdChNb2R1bGUgbW9kdWxlLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0Um9vdCA9ICgoV2ViTW9kdWxlKSBtb2R1bGUpLmdldENvbnRleHRSb290KCk7Ci0JCWlmIChjb250ZXh0Um9vdCAhPSBudWxsKQotCQkJcmV0dXJuICgoY29udGV4dFJvb3QpLmVxdWFscyhnZXRTZXJ2ZXJDb250ZXh0Um9vdChwcm9qZWN0KSkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2ZXJDb250ZXh0Um9vdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIFRPRE8gbWlncmF0ZSB0byBmbGV4IHByb2plY3QKLQkJCS8vIHdlYkVkaXQgPSAoV2ViQXJ0aWZhY3RFZGl0KSBTdHJ1Y3R1cmVFZGl0LmdldEZpcnN0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gd2ViRWRpdC5nZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLQkJCQl3ZWJFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVFeHRlbnNpb24jY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkVhck1vZHVsZUV4dGVuc2lvbiNjcmVhdGVJbXBvcnREYXRhTW9kZWwoKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGNyZWF0ZUltcG9ydERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcGx1Z2luL1dlYlBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wbHVnaW4vV2ViUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Yzk3NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wbHVnaW4vV2ViUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudXRpbC5XZWJFZGl0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSB0b3AtbGV2ZWwgY2xhc3Mgb2YgdGhlIGoyZWUgcGx1Z2luLgotICogIAotICovCi0KLXB1YmxpYyBjbGFzcyBXZWJQbHVnaW4gZXh0ZW5kcyBXVFBQbHVnaW4gaW1wbGVtZW50cyBSZXNvdXJjZUxvY2F0b3IgewotCS8vIERlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyCi0JcHJpdmF0ZSBzdGF0aWMgV2ViUGx1Z2luIGluc3Q7Ci0JcHJvdGVjdGVkIGZpbmFsIElQYXRoIGljb25zRm9sZGVyID0gbmV3IFBhdGgoUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkuZ2V0RW50cnkoImljb25zIikuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCS8vIExpbmtzIFZpZXcgcGFydCBvZiB0aGUgcGx1Z2luCi0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LU19CVUlMREVSX0lEID0KLQkvLyAiY29tLmlibS5ldG9vbHMubGlua3MubWFuYWdlbWVudC5saW5rc2J1aWxkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LU19CVUlMREVSX0lEID0gImNvbS5pYm0uZXRvb2xzLndlYnRvb2xzLmFkZGl0aW9ucy5saW5rc2J1aWxkZXIiOyAvLyROT04tTkxTLTEkCi0JLy8gTGliRGlyIENoYW5nZSBMaXN0ZW5lcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQkRJUkNIQU5HRV9CVUlMREVSX0lEID0gImNvbS5pYm0uZXRvb2xzLndlYnRvb2xzLkxpYkRpckJ1aWxkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBMaWJDb3B5IGJ1aWxkZXIgSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJDT1BZX0JVSUxERVJfSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuTGliQ29weUJ1aWxkZXIiOyAvLyROT04tTkxTLTEkCi0JLy8gVmFsaWRhdGlvbiBwYXJ0IG9mIHRoZSBwbHVnaW4KLQkvL0dsb2JhbCBSZXNvdXJjZVNldCAoc29tZXdoYXQgZ2xvYmFsKQotCXByaXZhdGUgc3RhdGljIElQYXRoIGxvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSUNPTl9ESVJTID0gbmV3IFN0cmluZ1tdeyJpY29ucy9mdWxsL29iajE2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL2N2aWV3MTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvY3Rvb2wxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9jbGNsMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvb3ZyMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvZXh0cmEiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvd2l6YmFuIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiIn07IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgSjJFRSBwbHVnaW4gYW5kIGNhY2hlIGl0cyBkZWZhdWx0IGluc3RhbmNlCi0JICovCi0JcHVibGljIFdlYlBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGluc3QgPT0gbnVsbCkKLQkJCWluc3QgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGx1Z2luIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFdlYlBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0QmFzZVVSTCgpIHsKLQkJcmV0dXJuIGdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0SjJFRVdlYlByb2plY3RNaWdyYXRpb25FeHRlbnNpb25zKCkgewotCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwY3QgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChnZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgIkoyRUVXZWJQcm9qZWN0TWlncmF0aW9uRXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9uID0gcGN0LmdldEV4dGVuc2lvbnMoKTsKLQkJTGlzdCByZXQgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGwgPSAwOyBsIDwgZXh0ZW5zaW9uLmxlbmd0aDsgKytsKSB7Ci0JCQlJRXh0ZW5zaW9uIGNvbmZpZyA9IGV4dGVuc2lvbltsXTsKLQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY0VsZW1zID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjRWxlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZCA9IGNFbGVtc1tpXTsKLQkJCQlpZiAoZC5nZXROYW1lKCkuZXF1YWxzKCJtaWdyYXRpb24iKSkgeyAvLyROT04tTkxTLTEkIAotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IG1lID0gZC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJydW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlyZXQuYWRkKG1lKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUgdGhpcyBleHRlbnNpb24sIGtlZXAgZ29pbmcKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXQudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRJbWFnZVVSTChrZXksIGdldEJ1bmRsZSgpKTsKLQl9Ci0KLQkvLyBJU1NVRTogdGhpcyBtZXRob2QgaXMgbmV2ZXIgdXNlZCBpbiBXVFAuIFNlZW1zIG5vIG5lZWQgdG8gYmUgQVBJCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgaW5zdGFsbExvY2F0aW9uID0gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldExvY2F0aW9uKCk7Ci0JCQlsb2NhdGlvbiA9IG5ldyBQYXRoKGluc3RhbGxMb2NhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEluc3RhbGxVUkwoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIGluc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbHVnaW4gZGlyZWN0b3J5IGxvY2F0aW9uLSB0aGUgZGlyZWN0b3J5IHRoYXQgYWxsIHRoZSBwbHVnaW5zIGFyZSBsb2NhdGVkIGluIChpLmUuCi0JICogZDpcaW5zdGFsbGRpclxwbHVnaW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQbHVnaW5Mb2NhdGlvbihTdHJpbmcgcGx1Z2luSWQpIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJUGF0aCBpbnN0YWxsUGF0aCA9IG5ldyBQYXRoKGJ1bmRsZS5nZXRFbnRyeSgiLyIpLnRvRXh0ZXJuYWxGb3JtKCkpLnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCk7ICAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGluc3RhbGxTdHIgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKG5ldyBVUkwoaW5zdGFsbFBhdGgudG9TdHJpbmcoKSkpLmdldEZpbGUoKTsKLQkJCQlyZXR1cm4gbmV3IFBhdGgoaW5zdGFsbFN0cik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBTZXJ2bGV0cyBKYXIgZmlsZSBwYXRoIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcGF0aCB0byB0aGUgc2VydmxldHMgamFyLCBvciBudWxsIGlmIG5ldmVyIHNwZWNpZmllZC4KLQkgKiBAZGVwcmVjYXRlZCAtIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGlzIG5vIGxvbmdlciBvbiB0aGlzIHBsdWdpbiBiZWNhdXNlIG9mIHRoZSBVSSBkZXBlbmRlbmN5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZVNlcnZsZXRzSmFyKCkgewotCQkvLwlyZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKElXZWJUb29saW5nQ29yZUNvbnN0YW50cy5QUk9QX1NFUlZMRVRfSkFSKTsKLQkJcmV0dXJuICJUSElTIElTIFRIRSBXUk9ORyBQQVRIIC0gTkVFRCBUTyBDSEFOR0UgSU1QTEVNRU5UQVRJT04hISEhISI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFNlcnZsZXRzIEphciBmaWxlIHBhdGggcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgZmlsZSBwYXRoIHRvIHRoZSBzZXJ2bGV0cyBqYXIsIG9yIG51bGwgaWYgbmV2ZXIgc3BlY2lmaWVkLgotCSAqIEBkZXByZWNhdGVkIC0gdGhlIHByZWZlcmVuY2Ugc3RvcmUgaXMgbm8gbG9uZ2VyIG9uIHRoaXMgcGx1Z2luIGJlY2F1c2Ugb2YgdGhlIFVJIGRlcGVuZGVuY3kuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmZXJlbmNlV2ViQVNKYXIoKSB7Ci0JCS8vcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhJV2ViVG9vbGluZ0NvcmVDb25zdGFudHMuUFJPUF9XRUJBU19KQVIpOwotCQlyZXR1cm4gIlRISVMgSVMgVEhFIFdST05HIFBBVEggLSBORUVEIFRPIENIQU5HRSBJTVBMRU1FTlRBVElPTiEhISEhIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBpcyBjYWxsZWQgZnJvbSBhbiBvcGVyYXRpb24sIGluIHJlc3BvbnNlIHRvIHNvbWUgb3RoZXIgZXhjZXB0aW9uIHRoYXQgd2FzIGNhdWdodCwKLQkgKiB0aGVuIHRoZSBjbGllbnQgY29kZSBzaG91bGQgdGhyb3cge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndmdC51dGlsLldGVFdyYXBwZWRFeGNlcHRpb259OwotCSAqIG90aGVyd2lzZSB0aGlzIGNhbiBzdGlsbCBiZSB1c2VkIHRvIHNpZ25hbCBzb21lIG90aGVyIGVycm9yIGNvbmRpdGlvbiB3aXRoaW4gdGhlIG9wZXJhdGlvbiwKLQkgKiBvciB0byB0aHJvdyBhIGNvcmUgZXhjZXB0aW9uIGluIGEgY29udGV4dCBvdGhlciB0aGFuIGV4ZWN1dGluZyBhbiBvcGVyYXRpb24KLQkgKiAKLQkgKiBDcmVhdGUgYSBuZXcgSVN0YXR1cyBvZiB0eXBlIEVSUk9SIHVzaW5nIHRoZSBKMkVFUGx1Z2luIElELiBhQ29kZSBpcyBqdXN0IGFuIGludGVybmFsIGNvZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIG5ld0Vycm9yU3RhdHVzKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXdTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYW4gb3BlcmF0aW9uLCBpbiByZXNwb25zZSB0byBzb21lIG90aGVyIGV4Y2VwdGlvbiB0aGF0IHdhcyBjYXVnaHQsCi0JICogdGhlbiB0aGUgY2xpZW50IGNvZGUgc2hvdWxkIHRocm93IHtAbGluayBjb20uaWJtLmV0b29scy53ZnQudXRpbC5XRlRXcmFwcGVkRXhjZXB0aW9ufTsKLQkgKiBvdGhlcndpc2UgdGhpcyBjYW4gc3RpbGwgYmUgdXNlZCB0byBzaWduYWwgc29tZSBvdGhlciBlcnJvciBjb25kaXRpb24gd2l0aGluIHRoZSBvcGVyYXRpb24sCi0JICogb3IgdG8gdGhyb3cgYSBjb3JlIGV4Y2VwdGlvbiBpbiBhIGNvbnRleHQgb3RoZXIgdGhhbiBleGVjdXRpbmcgYW4gb3BlcmF0aW9uCi0JICogCi0JICogQ3JlYXRlIGEgbmV3IElTdGF0dXMgb2YgdHlwZSBFUlJPUiwgY29kZSBPUEVSQVRJT05fRkFJTEVELCB1c2luZyB0aGUgSjJFRVBsdWdpbiBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBuZXdFcnJvclN0YXR1cyhTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ld0Vycm9yU3RhdHVzKDAsIGFNZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYW4gb3BlcmF0aW9uLCBpbiByZXNwb25zZSB0byBzb21lIG90aGVyIGV4Y2VwdGlvbiB0aGF0IHdhcyBjYXVnaHQsCi0JICogdGhlbiB0aGUgY2xpZW50IGNvZGUgc2hvdWxkIHRocm93IHtAbGluayBjb20uaWJtLmV0b29scy53ZnQudXRpbC5XRlRXcmFwcGVkRXhjZXB0aW9ufTsKLQkgKiBvdGhlcndpc2UgdGhpcyBjYW4gc3RpbGwgYmUgdXNlZCB0byBzaWduYWwgc29tZSBvdGhlciBlcnJvciBjb25kaXRpb24gd2l0aGluIHRoZSBvcGVyYXRpb24uCi0JICogCi0JICogQ3JlYXRlIGEgbmV3IElTdGF0dXMgb2YgdHlwZSBFUlJPUiwgY29kZSBPUEVSQVRJT05fRkFJTEVELCB1c2luZyB0aGUgSjJFRVBsdWdpbiBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBuZXdPcGVyYXRpb25GYWlsZWRTdGF0dXMoU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXdTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSVJlc291cmNlU3RhdHVzLk9QRVJBVElPTl9GQUlMRUQsIGFNZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBJU3RhdHVzIHdpdGggYSBzZXZlcml0eSB1c2luZyB0aGUgSjJFRVBsdWdpbiBJRC4gYUNvZGUgaXMganVzdCBhbiBpbnRlcm5hbCBjb2RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBuZXdTdGF0dXMoaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRCdW5kbGUoKSwga2V5KTsKLQl9Ci0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIHN1YnN0aXR1dGlvbnMpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBzdWJzdGl0dXRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCS8vV2ViQXBwUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFKTsKLQkJSUFkYXB0ZXJNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpOwotCQltYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMobmV3IFdlYkVkaXRBZGFwdGVyRmFjdG9yeSgpLCBBcnRpZmFjdEVkaXRNb2RlbC5jbGFzcyk7Ci0JfQotCi0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW4jZ2V0UGx1Z2luSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIEV4Y2VwdGlvbiBlICkKLQl7Ci0JCWZpbmFsIElMb2cgbG9nID0gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKTsKLQkJZmluYWwgU3RyaW5nIG1zZyA9ICJFbmNvdW50ZXJlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4iOwotCQkKLQkJbG9nLmxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIGUgKSApOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBzdWJzdGl0dXRpb25zLCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5LHN1YnN0aXR1dGlvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9JU2VydmxldENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9JU2VydmxldENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc2NDIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvSVNlcnZsZXRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZsZXRDb25zdGFudHMgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9JT19FWENFUFRJT04gPSAiamF2YS5pby5JT0V4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfU0VSVkxFVCA9ICJqYXZheC5zZXJ2bGV0LlNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0dFTkVSSUNfU0VSVkxFVCA9ICJqYXZheC5zZXJ2bGV0LkdlbmVyaWNTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9IVFRQX1NFUlZMRVQgPSAiamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX0VYQ0VQVElPTiA9ICJqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX1NFUlZMRVRfQ09ORklHID0gImphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUID0gImphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX1NFUlZMRVRfUkVTUE9OU0UgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVFVRVNUID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0hUVFBfU0VSVkxFVF9SRVNQT05TRSA9ICJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9GSUxURVIgPSAiamF2YXguc2VydmxldC5GaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0ZJTFRFUl9DT05GSUcgPSAiamF2YXguc2VydmxldC5GaWx0ZXJDb25maWciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0ZJTFRFUl9DSEFJTiA9ICJqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfTElTVEVORVIgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dExpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfRVZFTlQgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSID0gImphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfU0VSVkxFVF9DT05URVhUX0FUVFJJQlVURV9FVkVOVCA9ICJqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9MSVNURU5FUiA9ICJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25MaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0VWRU5UID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkV2ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQVRUUklCVVRFX0xJU1RFTkVSID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9IVFRQX1NFU1NJT05fQklORElOR19FVkVOVCA9ICJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9BQ1RJVkFUSU9OX0xJU1RFTkVSID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0JJTkRJTkdfTElTVEVORVIgPSAiamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfTElTVEVORVIgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdExpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfRVZFTlQgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdEV2ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfQVRUUklCVVRFX0xJU1RFTkVSID0gImphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0FUVFJJQlVURV9FVkVOVCA9ICJqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0lOSVQgPSAiaW5pdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfREVTVFJPWSA9ICJkZXN0cm95IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9HRVRfU0VSVkxFVF9DT05GSUcgPSAiZ2V0U2VydmxldENvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfR0VUX1NFUlZMRVRfSU5GTyA9ICJnZXRTZXJ2bGV0SW5mbyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfU0VSVklDRSA9ICJzZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9ET19HRVQgPSAiZG9HZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0RPX1BPU1QgPSAiZG9Qb3N0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9ET19QVVQgPSAiZG9QdXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0RPX0RFTEVURSA9ICJkb0RlbGV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfRE9fSEVBRCA9ICJkb0hlYWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0RPX09QVElPTlMgPSAiZG9PcHRpb25zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9ET19UUkFDRSA9ICJkb1RyYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9UT19TVFJJTkcgPSAidG9TdHJpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0RPX0ZJTFRFUiA9ICJkb0ZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX0lOSVRfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9TZXJ2bGV0Q29uZmlnOylWIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU1RST1lfU0lHTkFUVVJFID0gIigpViI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfU0VSVkxFVF9DT05GSUdfU0lHTkFUVVJFID0gIigpTGphdmF4L3NlcnZsZXQvU2VydmxldENvbmZpZzsiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1NFUlZMRVRfSU5GT19TSUdOQVRVUkUgPSAiKClMamF2YS9sYW5nL1N0cmluZzsiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9TSUdOQVRVUkUgPSAiKExqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTspViI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1NFUlZJQ0VfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7KVYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fR0VUX1NJR05BVFVSRSA9ICIoTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlOylWIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX1BPU1RfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7KVYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fUFVUX1NJR05BVFVSRSA9ICIoTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlOylWIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX0RFTEVURV9TSUdOQVRVUkUgPSAiKExqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZTspViI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET19IRUFEX1NJR05BVFVSRSA9ICIoTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlOylWIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX09QVElPTlNfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7KVYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fVFJBQ0VfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7KVYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX0lOSVRfU0lHTkFUVVJFID0gIihMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7KVYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fRklMVEVSX1NJR05BVFVSRSA9ICIoTGphdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlO0xqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluOylWIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3ZhbGlkYXRpb24vVXJsUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi92YWxpZGF0aW9uL1VybFBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmNzg5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3ZhbGlkYXRpb24vVXJsUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZCBmb3IgVVJMIHBhdHRlcm5zLgotICogCi0gKiA8cD4KLSAqIENvdWxkIGJlIHVzZWQgYnkgY29tcG9uZW50cyBkZWFsaW5nIHdpdGggVVJMIHBhdHRlcm5zIGxpa2U6IFNlcnZsZXQgYW5kCi0gKiBGaWx0ZXIgd2l6YXJkcywgd2ViLnhtbCB2YWxpZGF0b3JzLCBldGMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3Iga3JhZXYKLSAqLwotcHVibGljIGNsYXNzIFVybFBhdHRlcm4gewotCi0JLyoqCi0JICogVmFsaWRhdGVzIGFuIFVSTCBwYXR0ZXJuLgotCSAqIAotCSAqIEBwYXJhbSB1cmxQYXR0ZXJuCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkwgcGF0dGVybiB0byB2YWxpZGF0ZQotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhdHRlcm4gaXMgYSB2YWxpZCBvbmUsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gLSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHVybFBhdHRlcm4pIHsKLQkJLy8gVVJMIFBhdHRlcm4gbXVzdCBub3QgYmUgZW1wdHkgc3RyaW5nCi0JCWlmICh1cmxQYXR0ZXJuLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gVVJMIFBhdHRlcm4gbXVzdCBub3QgY29udGFpbiBDYXJyaWFnZSBSZXR1cm4gY2hhcmFjdGVycwotCQlpZiAodXJsUGF0dGVybi5pbmRleE9mKCdccicpICE9IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIFVSTCBQYXR0ZXJuIG11c3Qgbm90IGNvbnRhaW4gTmV3IExpbmUgY2hhcmFjdGVycwotCQlpZiAodXJsUGF0dGVybi5pbmRleE9mKCdcbicpICE9IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIFBhdGggTWFwcGluZ3MgbXVzdCBub3QgY29udGFpbiAiKi4iIGNoYXJhY3RlciBzZXF1ZW5jZXMKLQkJaWYgKHVybFBhdHRlcm4uc3RhcnRzV2l0aCgiLyIpKSB7Ci0JCQlpZiAodXJsUGF0dGVybi5pbmRleE9mKCIqLiIpID09IC0xKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIEV4dGVuc2lvbiBNYXBwaW5ncyBtdXN0IG5vdCBjb250YWluICcvJyBjaGFyYWN0ZXJzCi0JCWlmICh1cmxQYXR0ZXJuLnN0YXJ0c1dpdGgoIiouIikpIHsKLQkJCWlmICh1cmxQYXR0ZXJuLmluZGV4T2YoJy8nKSA9PSAtMSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBUaGUgVVJMIFBhdHRlcm4gaXMgbmVpdGhlciBhIFBhdGggTWFwcGluZywgbm9yIEV4dGVuc2lvbiBNYXBwaW5nCi0JCS8vIFRoZXJlZm9yZSwgaXQgaXMgaW52YWxpZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvQXV0aENvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9BdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjU1M2U5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9BdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50fQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgQXV0aENvbnN0cmFpbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBBdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGF1dGhvcml0eV9jb25zdHJhaW50LmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImF1dGhvcml0eV9jb25zdHJhaW50Iik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgc2VjQ29uc3RyYWludCBvZiB0aGUgQXV0aENvbnN0cmFpbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChBdXRoQ29uc3RyYWludCkgb2JqZWN0KS5nZXRTZWNDb25zdHJhaW50KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRlc2NyaXB0aW9uX1VJX19VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJEZXNjcmlwdGlvbiIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZGVzY3JpcHRpb25fcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCkpKTsKLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSByb2xlcyBmZWF0dXJlLgotCQkJLy8KLQkJCVdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IG5ldyBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJvbGVzX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlJvbGVzIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9yb2xlc19wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgcm9sZXMgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0QXV0aENvbnN0cmFpbnRfUm9sZXMoKSwgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQVVUSF9DT05TVFJBSU5UX1JPTEVTX0VESVRPUik7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQocHJvcGVydHlEZXNjcmlwdG9yKTsKLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBzZWNDb25zdHJhaW50IGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VjQ29uc3RyYWludF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJTZWNDb25zdHJhaW50IgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9zZWNDb25zdHJhaW50X3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBzZWNDb25zdHJhaW50IHByb3BlcnR5IgotCQkJCQkJcGtnLmdldEF1dGhDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSkpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhDb25zdHJhaW50X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCAvLyROT04tTkxTLTEkCi0JCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRoQ29uc3RyYWludF9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSJfVUlfQXV0aENvbnN0cmFpbnRfdHlwZSIpLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCksIHRydWUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJvbGVzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9BdXRoQ29uc3RyYWludF9yb2xlc19mZWF0dXJlIiksIGdldFN0cmluZyggLy8kTk9OLU5MUy0xJAotCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXV0aENvbnN0cmFpbnRfcm9sZXNfZmVhdHVyZSIsICJfVUlfQXV0aENvbnN0cmFpbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X1JvbGVzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9ICgoQXV0aENvbnN0cmFpbnQpIG9iamVjdCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCUxpc3QgZGVzY0xpc3QgPSAoKEF1dGhDb25zdHJhaW50KSBvYmplY3QpLmdldERlc2NyaXB0aW9ucygpOwotCQkJaWYgKGRlc2NMaXN0ICE9IG51bGwgJiYgZGVzY0xpc3Quc2l6ZSgpID4gMCkKLQkJCQlkZXNjcmlwdGlvbiA9ICgoRGVzY3JpcHRpb24pIGRlc2NMaXN0LmdldCgwKSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCS8vCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjExY29uY2F0X1VJXyIsIChuZXcKLQkJCS8vIE9iamVjdFtde2Rlc2NyaXB0aW9ufSkpOyAvLyROT04tTkxTLTEkID0gIkF1dGhDb25zdHJhaW50IHswfSIKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBdXRoQ29uc3RyYWludC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IGNvbW1hbmRQYXJhbWV0ZXIuZ2V0RVJlZmVyZW5jZSgpOwotCQlpZiAoc2YgPT0gbnVsbCkgewotCQkJc2YgPSBjb21tYW5kUGFyYW1ldGVyLmdldEVBdHRyaWJ1dGUoKTsKLQkJCWlmIChzZiAhPSBudWxsICYmICFzZi5pc01hbnkoKSkKLQkJCQlzZiA9IG51bGw7Ci0JCX0KLQkJaWYgKHNmICE9IG51bGwpIHsKLQkJCUVPYmplY3Qgb3duZXIgPSBjb21tYW5kUGFyYW1ldGVyLmdldEVPd25lcigpOwotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gY29tbWFuZFBhcmFtZXRlci5nZXRDb2xsZWN0aW9uKCk7Ci0JCQlpZiAoY29tbWFuZENsYXNzID09IEFkZENvbW1hbmQuY2xhc3MpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvd25lciwgc2YsIGNvbGxlY3Rpb24sIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0SW5kZXgoKSk7Ci0JCQl9IGVsc2UgaWYgKGNvbW1hbmRDbGFzcyA9PSBSZW1vdmVDb21tYW5kLmNsYXNzKSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlbW92ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb3duZXIsIHNmLCBjb2xsZWN0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGVkaXRpbmdEb21haW4sIGNvbW1hbmRDbGFzcywgY29tbWFuZFBhcmFtZXRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0NvbnRleHRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0NvbnRleHRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTEwZWY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Db250ZXh0UGFyYW1JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW19Ci0gKiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIENvbnRleHRQYXJhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGluaXRpYWxpel9wYXJhbWV0ZXJfY29udGV4dC5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJpbml0aWFsaXpfcGFyYW1ldGVyX2NvbnRleHQiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSB3ZWJBcHAgb2YgdGhlIENvbnRleHRQYXJhbS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKENvbnRleHRQYXJhbSkgb2JqZWN0KS5nZXRXZWJBcHAoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBwYXJhbU5hbWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQYXJhbU5hbWVfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiUGFyYW1OYW1lIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9wYXJhbU5hbWVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHBhcmFtTmFtZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHBhcmFtVmFsdWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQYXJhbVZhbHVlX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlBhcmFtVmFsdWUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3BhcmFtVmFsdWVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHBhcmFtVmFsdWUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0Q29udGV4dFBhcmFtX1BhcmFtVmFsdWUoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgZGVzY3JpcHRpb24gZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEZXNjcmlwdGlvbl9VSV9fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRGVzY3JpcHRpb24iCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2Rlc2NyaXB0aW9uX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRDb250ZXh0UGFyYW1fRGVzY3JpcHRpb24oKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgd2ViQXBwIGZlYXR1cmUuCi0JCQkvLwotCQkJLyoKLQkJCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJICogV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYkFwcF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJXZWJBcHAiCi0JCQkgKiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3dlYkFwcF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUKLQkJCSAqIHdlYkFwcCBwcm9wZXJ0eSIgcGtnLmdldENvbnRleHRQYXJhbV9XZWJBcHAoKSkpOwotCQkJICovCi0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1OYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db250ZXh0UGFyYW1fcGFyYW1OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRleHRQYXJhbV9wYXJhbU5hbWVfZmVhdHVyZSIsICJfVUlfQ29udGV4dFBhcmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbSBWYWx1ZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbVZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db250ZXh0UGFyYW1fcGFyYW1WYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZXh0UGFyYW1fcGFyYW1WYWx1ZV9mZWF0dXJlIiwgIl9VSV9Db250ZXh0UGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRleHRQYXJhbV9QYXJhbVZhbHVlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29udGV4dFBhcmFtX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRleHRQYXJhbV9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9Db250ZXh0UGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRleHRQYXJhbV9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMTJjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKENvbnRleHRQYXJhbSkgb2JqZWN0KS5nZXRQYXJhbU5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDb250ZXh0UGFyYW0gezB9IgotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb250ZXh0UGFyYW0uY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19QQVJBTV9OQU1FIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgZmFsc2UuIFRoZSBiYXNlIGNsYXNzIGhhcyBhbHJlYWR5IGltcGxlbWVudGVkCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4gSXRlbVByb3ZpZGVyQWRhcHRlci5nZXRDaGlsZHJlbn0KLQkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAotCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMmViYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0Vycm9yQ29kZUVycm9yUGFnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZX0KLSAqIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIEVycm9yQ29kZUVycm9yUGFnZUl0ZW1Qcm92aWRlciBleHRlbmRzIEVycm9yUGFnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgZXJyb3Jjb2RlX2Vycm9ycGFnZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJlcnJvcmNvZGVfZXJyb3JwYWdlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBlcnJvckNvZGUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvckNvZGVfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRXJyb3JDb2RlIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9lcnJvckNvZGVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGVycm9yQ29kZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRFcnJvckNvZGVFcnJvclBhZ2VfRXJyb3JDb2RlKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXJyb3IgQ29kZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvckNvZGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Vycm9yQ29kZUVycm9yUGFnZV9lcnJvckNvZGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRXJyb3JDb2RlRXJyb3JQYWdlX2Vycm9yQ29kZV9mZWF0dXJlIiwgIl9VSV9FcnJvckNvZGVFcnJvclBhZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEVycm9yQ29kZUVycm9yUGFnZV9FcnJvckNvZGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvL3JldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMTRjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKEVycm9yQ29kZUVycm9yUGFnZSkgb2JqZWN0KS5nZXRFcnJvckNvZGUoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gKChFcnJvckNvZGVFcnJvclBhZ2UpIG9iamVjdCkuZ2V0RXJyb3JDb2RlKCkgKyAiIC0+ICIgKyAoKEVycm9yQ29kZUVycm9yUGFnZSkgb2JqZWN0KS5nZXRMb2NhdGlvbigpOyAKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRXJyb3JDb2RlRXJyb3JQYWdlLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19FUlJPUl9DT0RFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9FcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9FcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwZmE1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlfW9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIEVycm9yUGFnZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JQYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgZXJyb3JfcGFnZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJlcnJvcl9wYWdlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgRXJyb3JQYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRXJyb3JQYWdlKSBvYmplY3QpLmdldFdlYkFwcCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGxvY2F0aW9uIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTG9jYXRpb25fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiTG9jYXRpb24iCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2xvY2F0aW9uX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBsb2NhdGlvbiBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRFcnJvclBhZ2VfTG9jYXRpb24oKSkpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTG9jYXRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9jYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Vycm9yUGFnZV9sb2NhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FcnJvclBhZ2VfbG9jYXRpb25fZmVhdHVyZSIsICJfVUlfRXJyb3JQYWdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFcnJvclBhZ2VfTG9jYXRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjEzY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFcnJvclBhZ2UpIG9iamVjdCkuZ2V0TG9jYXRpb24oKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJFcnJvclBhZ2UgezB9IgotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFcnJvclBhZ2UuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59Ci0JICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKLQkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9FeGNlcHRpb25UeXBlRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjEwMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkV4Y2VwdGlvblR5cGVFcnJvclBhZ2V9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uVHlwZUVycm9yUGFnZUl0ZW1Qcm92aWRlciBleHRlbmRzIEVycm9yUGFnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uVHlwZUVycm9yUGFnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGV4Y2VwdGlvbl90eXBlX2Vycm9ycGFnZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJleGNlcHRpb25fdHlwZV9lcnJvcnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGV4Y2VwdGlvblR5cGUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFeGNlcHRpb25UeXBlX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkV4Y2VwdGlvblR5cGUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2V4Y2VwdGlvblR5cGVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGV4Y2VwdGlvblR5cGUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0RXhjZXB0aW9uVHlwZUVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXhjZXB0aW9uIFR5cGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXhjZXB0aW9uVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRXhjZXB0aW9uVHlwZUVycm9yUGFnZV9leGNlcHRpb25UeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VfZXhjZXB0aW9uVHlwZV9mZWF0dXJlIiwgIl9VSV9FeGNlcHRpb25UeXBlRXJyb3JQYWdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25UeXBlRXJyb3JQYWdlX0V4Y2VwdGlvblR5cGUoKSwgdHJ1ZSkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy9yZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjE1Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFeGNlcHRpb25UeXBlRXJyb3JQYWdlKSBvYmplY3QpLmdldEV4Y2VwdGlvblR5cGVOYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiRXhjZXB0aW9uVHlwZUVycm9yUGFnZSB7MH0iCi0JICAgIFN0cmluZyB0eXBlTmFtZSA9ICgoRXhjZXB0aW9uVHlwZUVycm9yUGFnZSkgb2JqZWN0KS5nZXRFeGNlcHRpb25UeXBlTmFtZSgpOwotCSAgICBpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCSAgICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKSsxKTsKLQkgICAgfQotCSAgICByZXR1cm4gdHlwZU5hbWUgKyAiIC0+ICIgKyAoKEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpIG9iamVjdCkuZ2V0TG9jYXRpb24oKTsgCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0ZpbHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0ZpbHRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWM0OTRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9GaWx0ZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIEZpbHRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGEgbmV3IGNoaWxkIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVDaGlsZChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE86IGNoZWNrIHRoYXQgdGhpcyBpcyB3aGF0IHlvdSB3YW50LgotCQlJbml0UGFyYW0gY2hpbGQgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRQYXJhbSgpOwotCi0JCS8vIFRPRE86IGluaXRpYWxpemUgY2hpbGQgaGVyZS4uLgotCi0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kIHtAbGluayBBZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBSZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSAoKEZpbHRlcikgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JCWlmICh3ZWJBcHAuZ2V0SjJFRVZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotCQkJcmVzdWx0LmFkZChwa2cuZ2V0RmlsdGVyX0luaXRQYXJhbVZhbHVlcygpKTsKLQkJZWxzZQotCQkJcmVzdWx0LmFkZChwa2cuZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGltYWdlIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZUluaXRQYXJhbSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICJDcmVhdGUgSW5pdFBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaGVscCB0ZXh0IGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVG9vbFRpcFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjZjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXtyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkID0gIkNyZWF0ZSBhIGNoaWxkIG9mIHR5cGUgSW5pdFBhcmFtIGZvciB0aGUgc2VsZWN0ZWQgezB9LiIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRmlsdGVyLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZpbHRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSB3ZWJBcHAgb2YgdGhlIEZpbHRlci4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHdhcCA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBmaWx0ZXJOYW1lIGZlYXR1cmUuCi0KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZpbHRlckl0ZW1Qcm92aWRlcl9VSV8wIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZmlsdGVyTmFtZV9wcm9wZXJ0eV8zIiksIHdhcC5nZXRGaWx0ZXJfTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0ZpbHRlcl9uYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ZpbHRlcl9uYW1lX2ZlYXR1cmUiLCAiX1VJX0ZpbHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsdGVyX05hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZpbHRlciBDbGFzcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWx0ZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRmlsdGVyX2ZpbHRlckNsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ZpbHRlcl9maWx0ZXJDbGFzc19mZWF0dXJlIiwgIl9VSV9GaWx0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbHRlcl9GaWx0ZXJDbGFzcygpLCB0cnVlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZSBJSXRlbVByb3BlcnR5U291cmNlLmdldFByb3BlcnR5VmFsdWV9YnkKLQkgKiBkZWxlZ2F0aW5nIHRvIHRoZSBkZXNjcmlwdG9yLCB3aGljaCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgdGhlIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogaW50ZXJmYWNlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlPYmplY3QgcmV0ID0gbnVsbDsKLQkJaWYgKGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSBpbnN0YW5jZW9mIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQlyZXQgPSAoKFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkpLmdldFByb3BlcnR5VmFsdWUob2JqZWN0KTsKLQkJfSBlbHNlCi0JCQlyZXQgPSBzdXBlci5nZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCwgcHJvcGVydHkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUZpbHRlciBmaWx0ZXIgPSAoRmlsdGVyKSBvYmplY3Q7Ci0JCVN0cmluZyBuYW1lID0gZmlsdGVyLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSAiPGZpbHRlcj4iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChGaWx0ZXIuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX05BTUUgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1fVkFMVUVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbml0UGFyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsdGVyX0luaXRQYXJhbVZhbHVlcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbVZhbHVlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElJdGVtUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldCBJSXRlbVByb3BlcnR5U291cmNlLmlzUHJvcGVydHlTZXR9Ci0JICogYnkgZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqIGludGVyZmFjZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmIChnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgaW5zdGFuY2VvZiBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgewotCQkJcmV0ID0gKChXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpKS5pc1Byb3BlcnR5U2V0KG9iamVjdCk7Ci0JCX0gZWxzZQotCQkJcmV0ID0gc3VwZXIuaXNQcm9wZXJ0eVNldChvYmplY3QsIHByb3BlcnR5KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSNzZXRQcm9wZXJ0eVZhbHVlIElJdGVtUHJvcGVydHlTb3VyY2Uuc2V0UHJvcGVydHlWYWx1ZX1ieQotCSAqIGRlbGVnYXRpbmcgdG8gdGhlIGRlc2NyaXB0b3IsIHdoaWNoIGlzIGFzc3VtZWQgdG8gc3VwcG9ydCB0aGUgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiBpbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0KLQkJaWYgKGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSBpbnN0YW5jZW9mIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQkoKFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkpLnNldFByb3BlcnR5VmFsdWUob2JqZWN0LCB2YWx1ZSk7Ci0JCX0gZWxzZQotCQkJc3VwZXIuc2V0UHJvcGVydHlWYWx1ZShvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0ZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzMjMzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nfQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGZpbHRlcl9tYXBwaW5nLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZpbHRlcl9tYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgRmlsdGVyTWFwcGluZy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHdhcCA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB1cmxQYXR0ZXJuIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVXJsUGF0dGVybl9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJVcmxQYXR0ZXJuIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV91cmxQYXR0ZXJuX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSB1cmxQYXR0ZXJuIHByb3BlcnR5IgotCQkJCQkJd2FwLmdldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybigpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBmaWx0ZXIgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJGaWx0ZXIiLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2ZpbHRlcl9wcm9wZXJ0eV8yIiksIHdhcC5nZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlcigpLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXJsIFBhdHRlcm4gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXJsUGF0dGVyblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRmlsdGVyTWFwcGluZ191cmxQYXR0ZXJuX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ZpbHRlck1hcHBpbmdfdXJsUGF0dGVybl9mZWF0dXJlIiwgIl9VSV9GaWx0ZXJNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWx0ZXJNYXBwaW5nX1VybFBhdHRlcm4oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpc3BhdGNoZXIgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXNwYXRjaGVyVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRmlsdGVyTWFwcGluZ19kaXNwYXRjaGVyVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9GaWx0ZXJNYXBwaW5nX2Rpc3BhdGNoZXJUeXBlX2ZlYXR1cmUiLCAiX1VJX0ZpbHRlck1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlclR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZpbHRlciBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWx0ZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0ZpbHRlck1hcHBpbmdfZmlsdGVyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ZpbHRlck1hcHBpbmdfZmlsdGVyX2ZlYXR1cmUiLCAiX1VJX0ZpbHRlck1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfRmlsdGVyKCksIHRydWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmxldCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2bGV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9GaWx0ZXJNYXBwaW5nX3NlcnZsZXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRmlsdGVyTWFwcGluZ19zZXJ2bGV0X2ZlYXR1cmUiLCAiX1VJX0ZpbHRlck1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbHRlck1hcHBpbmdfU2VydmxldCgpLCB0cnVlKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlGaWx0ZXJNYXBwaW5nIGZpbHRlck1hcHBpbmcgPSAoRmlsdGVyTWFwcGluZykgb2JqZWN0OwotCQlGaWx0ZXIgZmlsdGVyID0gZmlsdGVyTWFwcGluZy5nZXRGaWx0ZXIoKTsKLQkJU3RyaW5nIGZpbHRlclN0ciA9IChmaWx0ZXIgPT0gbnVsbCkgPyBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiP19VSV8iKSA6IGZpbHRlci5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgPSAiPyIKLQotCQlTdHJpbmcgbWFwVGV4dCA9ICgoRmlsdGVyTWFwcGluZykgb2JqZWN0KS5nZXRVcmxQYXR0ZXJuKCk7Ci0JCWlmIChtYXBUZXh0ID09IG51bGwpIHsKLQkJCVNlcnZsZXQgc2VydmxldCA9IGZpbHRlck1hcHBpbmcuZ2V0U2VydmxldCgpOwotCQkJaWYgKHNlcnZsZXQgIT0gbnVsbCkKLQkJCQltYXBUZXh0ID0gc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpOwotCQl9Ci0JCWlmIChtYXBUZXh0ID09IG51bGwpCi0JCQltYXBUZXh0ID0gIj8iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmlsdGVyX21hcHBpbmdfdGV4dCIsIG5ldyBPYmplY3RbXXttYXBUZXh0LCBmaWx0ZXJTdHJ9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEZpbHRlck1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk4gOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUiA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fU0VSVkxFVCA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgZmFsc2UuIFRoZSBiYXNlIGNsYXNzIGhhcyBhbHJlYWR5IGltcGxlbWVudGVkCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4gSXRlbVByb3ZpZGVyQWRhcHRlci5nZXRDaGlsZHJlbn0KLQkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAotCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZmU4NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0Zvcm1Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZ30KLSAqIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIEZvcm1Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgRm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgZm9ybV9sb2dpbl9jb25maWcuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZm9ybV9sb2dpbl9jb25maWciKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGZvcm1fbG9naW5fY29uZmlnLmdpZi4KLQkgKi8KLQkvL1RPRE8gUmVtb3ZpbmcgdGhlIFVJIGRlcGVuZGVuY3kgYnkgY29tbWVudGluZyBvdXQgdGhpcyBtZXRob2QKLQkvKgotCSAqIHB1YmxpYyBJbWFnZSBnZXRMYWJlbEltYWdlKE9iamVjdCBvYmplY3QpIHsgcmV0dXJuIChJbWFnZSkKLQkgKiBXRUJVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VGcm9tUmVnaXN0cnkoImZvcm1fbG9naW5fY29uZmlnIik7Ly8kTk9OLU5MUy0xJCB9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjUyY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChGb3JtTG9naW5Db25maWcpIG9iamVjdCkuZ2V0Rm9ybUxvZ2luUGFnZSgpfSkpOyAvLyROT04tTkxTLTEkID0gIkZvcm1Mb2dpbkNvbmZpZyB7MH0iCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsb2dpbkNvbmZpZyBvZiB0aGUgRm9ybUxvZ2luQ29uZmlnLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRm9ybUxvZ2luQ29uZmlnKSBvYmplY3QpLmdldExvZ2luQ29uZmlnKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgZm9ybUxvZ2luUGFnZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZvcm1Mb2dpblBhZ2VfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRm9ybUxvZ2luUGFnZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZm9ybUxvZ2luUGFnZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgZm9ybUxvZ2luUGFnZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBmb3JtRXJyb3JQYWdlIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRm9ybUVycm9yUGFnZV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJGb3JtRXJyb3JQYWdlIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9mb3JtRXJyb3JQYWdlX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBmb3JtRXJyb3JQYWdlIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGxvZ2luQ29uZmlnIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTG9naW5Db25maWdfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiTG9naW5Db25maWciCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2xvZ2luQ29uZmlnX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBsb2dpbkNvbmZpZyBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRGb3JtTG9naW5Db25maWdfTG9naW5Db25maWcoKSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBGb3JtIExvZ2luIFBhZ2UgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRm9ybUxvZ2luUGFnZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRm9ybUxvZ2luQ29uZmlnX2Zvcm1Mb2dpblBhZ2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRm9ybUxvZ2luQ29uZmlnX2Zvcm1Mb2dpblBhZ2VfZmVhdHVyZSIsICJfVUlfRm9ybUxvZ2luQ29uZmlnX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRm9ybSBFcnJvciBQYWdlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZvcm1FcnJvclBhZ2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Zvcm1Mb2dpbkNvbmZpZ19mb3JtRXJyb3JQYWdlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Zvcm1Mb2dpbkNvbmZpZ19mb3JtRXJyb3JQYWdlX2ZlYXR1cmUiLCAiX1VJX0Zvcm1Mb2dpbkNvbmZpZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1FcnJvclBhZ2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjE2Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChGb3JtTG9naW5Db25maWcpIG9iamVjdCkuZ2V0Rm9ybUxvZ2luUGFnZSgpfSkpOyAvLyROT04tTkxTLTEkID0gIkZvcm1Mb2dpbkNvbmZpZyB7MH0iCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEZvcm1Mb2dpbkNvbmZpZy5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0UgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59Ci0JICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKLQkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9IVFRQTWV0aG9kVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0hUVFBNZXRob2RUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjhlNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0hUVFBNZXRob2RUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlfQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgSFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIEhUVFBNZXRob2RUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgaHR0cF90eXBlLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImh0dHBfdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJlc0NvbGxlY3Rpb24gb2YgdGhlIEhUVFBNZXRob2RUeXBlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoSFRUUE1ldGhvZFR5cGUpIG9iamVjdCkuZ2V0SHR0cE1ldGhvZCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGh0dHBNZXRob2QgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJIdHRwTWV0aG9kX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkh0dHBNZXRob2QiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2h0dHBNZXRob2RfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGh0dHBNZXRob2QgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0SFRUUE1ldGhvZFR5cGVfSHR0cE1ldGhvZCgpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSByZXNDb2xsZWN0aW9uIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUmVzQ29sbGVjdGlvbl9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJSZXNDb2xsZWN0aW9uIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9yZXNDb2xsZWN0aW9uX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSByZXNDb2xsZWN0aW9uIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldEhUVFBNZXRob2RUeXBlX0h0dHBNZXRob2QoKSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIdHRwIE1ldGhvZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIdHRwTWV0aG9kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9IVFRQTWV0aG9kVHlwZV9odHRwTWV0aG9kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0hUVFBNZXRob2RUeXBlX2h0dHBNZXRob2RfZmVhdHVyZSIsICJfVUlfSFRUUE1ldGhvZFR5cGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBNZXRob2RUeXBlX0h0dHBNZXRob2QoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjE3Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChIVFRQTWV0aG9kVHlwZSkgb2JqZWN0KS5nZXRIdHRwTWV0aG9kKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiSFRUUE1ldGhvZFR5cGUgezB9IgotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChIVFRQTWV0aG9kVHlwZS5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfX0hUVFBfTUVUSE9EIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgZmFsc2UuIFRoZSBiYXNlIGNsYXNzIGhhcyBhbHJlYWR5IGltcGxlbWVudGVkCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4gSXRlbVByb3ZpZGVyQWRhcHRlci5nZXRDaGlsZHJlbn0KLQkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAotCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGE2ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0luaXRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbX1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIEluaXRQYXJhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGluaXRpYWxpel9wYXJhbWV0ZXIuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiaW5pdGlhbGl6X3BhcmFtZXRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBzZXJ2bGV0IG9mIHRoZSBJbml0UGFyYW0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChJbml0UGFyYW0pIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHBhcmFtTmFtZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlBhcmFtTmFtZV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJQYXJhbU5hbWUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3BhcmFtTmFtZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgcGFyYW1OYW1lIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldEluaXRQYXJhbV9QYXJhbU5hbWUoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgcGFyYW1WYWx1ZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlBhcmFtVmFsdWVfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiUGFyYW1WYWx1ZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfcGFyYW1WYWx1ZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgcGFyYW1WYWx1ZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLgotCQkJLy8KLQkJCVdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IG5ldyBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRlc2NyaXB0aW9uX1VJX19VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJEZXNjcmlwdGlvbiIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEZXNjcmlwdGlvbl9VSV9fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRGVzY3JpcHRpb24iCi0JCQkJCQlwa2cuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCksIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yLk1VTFRJTElORV9URVhUX0VESVRPUik7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQocHJvcGVydHlEZXNjcmlwdG9yKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFyYW0gTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0luaXRQYXJhbV9wYXJhbU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSW5pdFBhcmFtX3BhcmFtTmFtZV9mZWF0dXJlIiwgIl9VSV9Jbml0UGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9QYXJhbU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtIFZhbHVlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0luaXRQYXJhbV9wYXJhbVZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0luaXRQYXJhbV9wYXJhbVZhbHVlX2ZlYXR1cmUiLCAiX1VJX0luaXRQYXJhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSW5pdFBhcmFtX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0luaXRQYXJhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZSBJSXRlbVByb3BlcnR5U291cmNlLmdldFByb3BlcnR5VmFsdWV9YnkKLQkgKiBkZWxlZ2F0aW5nIHRvIHRoZSBkZXNjcmlwdG9yLCB3aGljaCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgdGhlIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogaW50ZXJmYWNlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlPYmplY3QgcmV0ID0gbnVsbDsKLQkJaWYgKGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSBpbnN0YW5jZW9mIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQlyZXQgPSAoKFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkpLmdldFByb3BlcnR5VmFsdWUob2JqZWN0KTsKLQkJfSBlbHNlCi0JCQlyZXQgPSBzdXBlci5nZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCwgcHJvcGVydHkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMThjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKEluaXRQYXJhbSkgb2JqZWN0KS5nZXRQYXJhbU5hbWUoKSwgKChJbml0UGFyYW0pIG9iamVjdCkuZ2V0UGFyYW1WYWx1ZSgpfSkpOyAvLyROT04tTkxTLTEkID0gInswfSA9IHsxfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSW5pdFBhcmFtLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRSA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59Ci0JICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKLQkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0IElJdGVtUHJvcGVydHlTb3VyY2UuaXNQcm9wZXJ0eVNldH0KLQkgKiBieSBkZWxlZ2F0aW5nIHRvIHRoZSBkZXNjcmlwdG9yLCB3aGljaCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgdGhlIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogaW50ZXJmYWNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYgKGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSBpbnN0YW5jZW9mIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQlyZXQgPSAoKFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkpLmlzUHJvcGVydHlTZXQob2JqZWN0KTsKLQkJfSBlbHNlCi0JCQlyZXQgPSBzdXBlci5pc1Byb3BlcnR5U2V0KG9iamVjdCwgcHJvcGVydHkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbVByb3BlcnR5U291cmNlI3NldFByb3BlcnR5VmFsdWUgSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5zZXRQcm9wZXJ0eVZhbHVlfWJ5Ci0JICogZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqIGludGVyZmFjZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQotCQlpZiAoZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIGluc3RhbmNlb2YgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKLQkJCSgoV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSkuc2V0UHJvcGVydHlWYWx1ZShvYmplY3QsIHZhbHVlKTsKLQkJfSBlbHNlCi0JCQlzdXBlci5zZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCwgcHJvcGVydHksIHZhbHVlKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9JdGVtSG9sZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSXRlbUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWE0YjQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9JdGVtSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzE4LzIwMDEgNTo1MzowMiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSXRlbUhvbGRlciBleHRlbmRzIEl0ZW1Qcm92aWRlciB7Ci0JcHJvdGVjdGVkIFdlYkFwcCB3ZWJBcHA7Ci0JcHJvdGVjdGVkIFdlYkFydGlmYWN0RWRpdCB3ZWJBcnRpZmFjdEVkaXQ7Ci0KLQlwdWJsaWMgSXRlbUhvbGRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBKYXJob2xkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSXRlbUhvbGRlcihXZWJBcHAgd2ViQXBwKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdlYkFwcCh3ZWJBcHApOwotCX0KLQlwdWJsaWMgSXRlbUhvbGRlcihXZWJBcnRpZmFjdEVkaXQgd2ViQXJ0aWZhY3RFZGl0KSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdlYkFydGlmYWN0RWRpdCh3ZWJBcnRpZmFjdEVkaXQpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCVdlYkFwcCB0ZXN0RWxlbWVudDsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSXRlbUhvbGRlcikgewotCQkJdGVzdEVsZW1lbnQgPSAoKEl0ZW1Ib2xkZXIpIGVsZW1lbnQpLmdldFdlYkFwcCgpOwotCQkJdi5hZGQodGVzdEVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMTgvMjAwMSA2OjAwOjQzIFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLkVKQkphcgotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlyZXR1cm4gd2ViQXBwOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMTgvMjAwMSA2OjAwOjQzIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdKYXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi5FSkJKYXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIGFXZWJBcHApIHsKLQkJd2ViQXBwID0gYVdlYkFwcDsKLQl9Ci0KLQlwdWJsaWMgV2ViQXJ0aWZhY3RFZGl0IGdldFdlYkFydGlmYWN0RWRpdCgpIHsKLQkJcmV0dXJuIHdlYkFydGlmYWN0RWRpdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcnRpZmFjdEVkaXQoV2ViQXJ0aWZhY3RFZGl0IHdlYkFydGlmYWN0RWRpdCkgewotCQl0aGlzLndlYkFydGlmYWN0RWRpdCA9IHdlYkFydGlmYWN0RWRpdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSlNQQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSlNQQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTlmYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUENvbmZpZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpzcC5KU1BDb25maWd9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbmZpZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSlNQQ29uZmlnSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpzcFBhY2thZ2UuZUlOU1RBTkNFLmdldEpTUENvbmZpZ19UYWdMaWJzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBKU1BDb25maWcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJmdWxsL29iajE2L0pTUENvbmZpZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfSlNQQ29uZmlnX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChKU1BDb25maWcuY2xhc3MpKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlMgOgotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1BST1BFUlRZX0dST1VQUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BDb25maWdfVGFnTGlicygpLCBKc3BGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYWdMaWJSZWZUeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKSwgSnNwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSlNQUHJvcGVydHlHcm91cCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUFByb3BlcnR5R3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9KU1BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTE5NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUFByb3BlcnR5R3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpzcC5KU1BQcm9wZXJ0eUdyb3VwfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSlNQUHJvcGVydHlHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRVcmxQYXR0ZXJuUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFbElnbm9yZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhZ2VFbmNvZGluZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2NyaXB0aW5nSW52YWxpZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSXNYTUxQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEluY2x1ZGVQcmVsdWRlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW5jbHVkZUNvZGFzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVcmwgUGF0dGVybiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVcmxQYXR0ZXJuUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3VybFBhdHRlcm5fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSlNQUHJvcGVydHlHcm91cF91cmxQYXR0ZXJuX2ZlYXR1cmUiLCAiX1VJX0pTUFByb3BlcnR5R3JvdXBfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BQcm9wZXJ0eUdyb3VwX1VybFBhdHRlcm4oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVsIElnbm9yZWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWxJZ25vcmVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2VsSWdub3JlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2VsSWdub3JlZF9mZWF0dXJlIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSnNwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9FbElnbm9yZWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhZ2UgRW5jb2RpbmcgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZUVuY29kaW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3BhZ2VFbmNvZGluZ19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3BhZ2VFbmNvZGluZ19mZWF0dXJlIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSnNwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9QYWdlRW5jb2RpbmcoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNjcmlwdGluZyBJbnZhbGlkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNjcmlwdGluZ0ludmFsaWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0pTUFByb3BlcnR5R3JvdXBfc2NyaXB0aW5nSW52YWxpZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3NjcmlwdGluZ0ludmFsaWRfZmVhdHVyZSIsICJfVUlfSlNQUHJvcGVydHlHcm91cF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpzcFBhY2thZ2UuZUlOU1RBTkNFLmdldEpTUFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgWE1MIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzWE1MUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2lzWE1MX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0pTUFByb3BlcnR5R3JvdXBfaXNYTUxfZmVhdHVyZSIsICJfVUlfSlNQUHJvcGVydHlHcm91cF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpzcFBhY2thZ2UuZUlOU1RBTkNFLmdldEpTUFByb3BlcnR5R3JvdXBfSXNYTUwoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluY2x1ZGUgUHJlbHVkZXMgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5jbHVkZVByZWx1ZGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2luY2x1ZGVQcmVsdWRlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2luY2x1ZGVQcmVsdWRlc19mZWF0dXJlIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSnNwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlUHJlbHVkZXMoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluY2x1ZGUgQ29kYXMgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5jbHVkZUNvZGFzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2luY2x1ZGVDb2Rhc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX2luY2x1ZGVDb2Rhc19mZWF0dXJlIiwgIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSnNwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSlNQUHJvcGVydHlHcm91cC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSlNQUHJvcGVydHlHcm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChKU1BQcm9wZXJ0eUdyb3VwKSBvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfSlNQUHJvcGVydHlHcm91cF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEpTUFByb3BlcnR5R3JvdXAuY2xhc3MpKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTiA6Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEIDoKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkcgOgotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQgOgotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MIDoKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVMgOgotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCS8vCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLlJFU09VUkNFX0xPQ0FUT1I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUFR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9KU1BUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmN2FjNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUFR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSlNQVHlwZX1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViVHlwZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgSlNQVHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGpzcF90eXBlLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImpzcF90eXBlIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGpzcEZpbGUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJKc3BGaWxlX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkpzcEZpbGUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2pzcEZpbGVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGpzcEZpbGUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0SlNQVHlwZV9Kc3BGaWxlKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSnNwIEZpbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSnNwRmlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfSlNQVHlwZV9qc3BGaWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0pTUFR5cGVfanNwRmlsZV9mZWF0dXJlIiwgIl9VSV9KU1BUeXBlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BUeXBlX0pzcEZpbGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjQwY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChKU1BUeXBlKSBvYmplY3QpLmdldEpzcEZpbGUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJKU1BUeXBlIHswfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSlNQVHlwZS5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkpTUF9UWVBFX19KU1BfRklMRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSnNwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Kc3BJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjgyZDcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Kc3BJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLnV0aWwuSnNwQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuIFRoZQotICogYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0bwotICoge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKc3BBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5Ci0JICoge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpzcC5KU1BDb25maWd9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEpTUENvbmZpZ0l0ZW1Qcm92aWRlciBqc3BDb25maWdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuanNwLkpTUENvbmZpZ30uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpTUENvbmZpZ0FkYXB0ZXIoKSB7Ci0JCWlmIChqc3BDb25maWdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJanNwQ29uZmlnSXRlbVByb3ZpZGVyID0gbmV3IEpTUENvbmZpZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBqc3BDb25maWdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy5qc3AuSlNQUHJvcGVydHlHcm91cH0KLQkgKiBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSlNQUHJvcGVydHlHcm91cEl0ZW1Qcm92aWRlciBqc3BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpzcC5KU1BQcm9wZXJ0eUdyb3VwfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQUHJvcGVydHlHcm91cEFkYXB0ZXIoKSB7Ci0JCWlmIChqc3BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWpzcFByb3BlcnR5R3JvdXBJdGVtUHJvdmlkZXIgPSBuZXcgSlNQUHJvcGVydHlHcm91cEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBqc3BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMuanNwLlRhZ0xpYlJlZlR5cGV9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIgdGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qc3AuVGFnTGliUmVmVHlwZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZlR5cGVBZGFwdGVyKCkgewotCQlpZiAodGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0YWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2NhbEVuY29kaW5nTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0xvY2FsRW5jb2RpbmdNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjM0NDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0xvY2FsRW5jb2RpbmdNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbEVuY29kaW5nTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTG9jYWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFbmNvZGluZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTG9jYWxlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExvY2FsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTG9jYWxFbmNvZGluZ01hcHBpbmdfbG9jYWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xvY2FsRW5jb2RpbmdNYXBwaW5nX2xvY2FsZV9mZWF0dXJlIiwgIl9VSV9Mb2NhbEVuY29kaW5nTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFbmNvZGluZyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmNvZGluZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTG9jYWxFbmNvZGluZ01hcHBpbmdfZW5jb2RpbmdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTG9jYWxFbmNvZGluZ01hcHBpbmdfZW5jb2RpbmdfZmVhdHVyZSIsICJfVUlfTG9jYWxFbmNvZGluZ01hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIExvY2FsRW5jb2RpbmdNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTG9jYWxFbmNvZGluZ01hcHBpbmciKTsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImxvY2FsX2VuY29kaW5nX21hcHBpbmciKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGVtID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImxvY2FsX2VuY29kaW5nX21hcHBpbmdfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxhYmVsID0gKChMb2NhbEVuY29kaW5nTWFwcGluZykgb2JqZWN0KS5nZXRMb2NhbGUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGxlbSA6IGxlbSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKExvY2FsRW5jb2RpbmdNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2ZGM0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3R9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQkvLwkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIpOwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgibG9jYWxfZW5jb2RpbmdfbWFwcGluZ19saXN0Iik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJMb2NhbF9lbmNvZGluZ19tYXBwaW5nX2xpc3RfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiV2VsY29tZSBGaWxlIExpc3QiCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1MgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0xvZ2luQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YmY5M2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0xvZ2luQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZ31vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgTG9naW5Db25maWdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhIG5ldyBjaGlsZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlQ2hpbGQoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPOiBjcmVhdGUgc29tZSBjaGlsZCBvYmplY3QuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQge0BsaW5rIEFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIFJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZChwa2cuZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vVE9ETyBSZW1vdmluZyBVSSBkZXBlbmRlbmN5IGJ5IGNvbW1lbnRpbmcgb3V0IG1ldGhvZAotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaW1hZ2UgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0Q3JlYXRlQ2hpbGRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBFT2JqZWN0IHJlZk9iamVjdCA9Ci0JICogKEVPYmplY3Qpb2JqZWN0OyByZXR1cm4KLQkgKiBXRUJVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkgKwotCSAqICJDcmVhdGUjQ0hJTERfQ0xBU1NfTkFNRSMiKTsvLyROT04tTkxTLTEkIH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV8jQ0hJTERfQ0xBU1NfTkFNRSNfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlICNDSElMRF9DTEFTU19OQU1FIyIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGhlbHAgdGV4dCBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjFjb25jYXQiLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7Ly8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgYSBjaGlsZCBvZiB0eXBlICNDSElMRF9DTEFTU19OQU1FIyBmb3IgdGhlIHNlbGVjdGVkIHswfS4iIAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBmb3JtX2xvZ2luX2NvbmZpZy5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJmb3JtX2xvZ2luX2NvbmZpZyIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgTG9naW5Db25maWcuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChMb2dpbkNvbmZpZykgb2JqZWN0KS5nZXRXZWJBcHAoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBhdXRoTWV0aG9kIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQXV0aE1ldGhvZF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJBdXRoTWV0aG9kIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9hdXRoTWV0aG9kX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBhdXRoTWV0aG9kIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgcmVhbG1OYW1lIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUmVhbG1OYW1lX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlJlYWxtTmFtZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfcmVhbG1OYW1lX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSByZWFsbU5hbWUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHdlYkFwcCBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYkFwcF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJXZWJBcHAiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3dlYkFwcF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgd2ViQXBwIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldExvZ2luQ29uZmlnX1dlYkFwcCgpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBmb3JtTG9naW5Db25maWcgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGb3JtTG9naW5Db25maWdfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRm9ybUxvZ2luQ29uZmlnIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9mb3JtTG9naW5Db25maWdfcHJvcGVyX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBmb3JtTG9naW5Db25maWcgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0aCBNZXRob2QgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXV0aE1ldGhvZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTG9naW5Db25maWdfYXV0aE1ldGhvZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Mb2dpbkNvbmZpZ19hdXRoTWV0aG9kX2ZlYXR1cmUiLCAiX1VJX0xvZ2luQ29uZmlnX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWFsbSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlYWxtTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTG9naW5Db25maWdfcmVhbG1OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xvZ2luQ29uZmlnX3JlYWxtTmFtZV9mZWF0dXJlIiwgIl9VSV9Mb2dpbkNvbmZpZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdXRob3JpemF0aW9uIE1ldGhvZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdXRob3JpemF0aW9uTWV0aG9kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Mb2dpbkNvbmZpZ19hdXRob3JpemF0aW9uTWV0aG9kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xvZ2luQ29uZmlnX2F1dGhvcml6YXRpb25NZXRob2RfZmVhdHVyZSIsICJfVUlfTG9naW5Db25maWdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX0F1dGhvcml6YXRpb25NZXRob2QoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyMWNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoTG9naW5Db25maWcpIG9iamVjdCkuZ2V0UmVhbG1OYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiTG9naW5Db25maWcgezB9IgotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChMb2dpbkNvbmZpZy5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0QgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSE9SSVpBVElPTl9NRVRIT0QgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvZ2luQ29uZmlnX0Zvcm1Mb2dpbkNvbmZpZygpLCBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvcm1Mb2dpbkNvbmZpZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL01pbWVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTWltZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwODZkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTWltZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmd9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgTWltZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIE1pbWVNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgbWltZV9tYXBwaW5nLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoIm1pbWVfbWFwcGluZyIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgTWltZU1hcHBpbmcuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChNaW1lTWFwcGluZykgb2JqZWN0KS5nZXRXZWJBcHAoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBleHRlbnNpb24gZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFeHRlbnNpb25fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRXh0ZW5zaW9uIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9leHRlbnNpb25fcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGV4dGVuc2lvbiBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRNaW1lTWFwcGluZ19FeHRlbnNpb24oKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgbWltZVR5cGUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNaW1lVHlwZV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJNaW1lVHlwZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfbWltZVR5cGVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIG1pbWVUeXBlIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldE1pbWVNYXBwaW5nX01pbWVUeXBlKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHdlYkFwcCBmZWF0dXJlLgotCQkJLy8KLQkJCS8qCi0JCQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCSAqIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJBcHBfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiV2ViQXBwIgotCQkJICogV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV93ZWJBcHBfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlCi0JCQkgKiB3ZWJBcHAgcHJvcGVydHkiIHBrZy5nZXRNaW1lTWFwcGluZ19XZWJBcHAoKSkpOwotCQkJICovCi0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4dGVuc2lvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX01pbWVNYXBwaW5nX2V4dGVuc2lvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NaW1lTWFwcGluZ19leHRlbnNpb25fZmVhdHVyZSIsICJfVUlfTWltZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbWVNYXBwaW5nX0V4dGVuc2lvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWltZSBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1pbWVUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9NaW1lTWFwcGluZ19taW1lVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NaW1lTWFwcGluZ19taW1lVHlwZV9mZWF0dXJlIiwgIl9VSV9NaW1lTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjIyY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChNaW1lTWFwcGluZykgb2JqZWN0KS5nZXRFeHRlbnNpb24oKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJNaW1lTWFwcGluZyB7MH0iCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1pbWVNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT04gOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19NSU1FX1RZUEUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Sb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Sb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxZjAyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvUm9sZU5hbWVUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGV9Ci0gKiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFJvbGVOYW1lVHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHNlY3VyaXR5X3JvbGVfbmFtZXR5cGUuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2VjdXJpdHlfcm9sZV9uYW1ldHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSByb2xlTmFtZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJvbGVOYW1lX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlJvbGVOYW1lIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9yb2xlTmFtZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgcm9sZU5hbWUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0Um9sZU5hbWVUeXBlX1JvbGVOYW1lKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9sZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvbGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Sb2xlTmFtZVR5cGVfcm9sZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZU5hbWVUeXBlX3JvbGVOYW1lX2ZlYXR1cmUiLCAiX1VJX1JvbGVOYW1lVHlwZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZU5hbWVUeXBlX1JvbGVOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyM2NvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoUm9sZU5hbWVUeXBlKSBvYmplY3QpLmdldFJvbGVOYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiUm9sZU5hbWVUeXBlIHswfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZU5hbWVUeXBlLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEVfX1JPTEVfTkFNRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59Ci0JICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKLQkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDEzNGJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZWN1cml0eUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnR9Ci0gKiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFNlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGEgbmV3IGNoaWxkIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVDaGlsZChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE86IGNoZWNrIHRoYXQgdGhpcyBpcyB3aGF0IHlvdSB3YW50LgotCQlXZWJSZXNvdXJjZUNvbGxlY3Rpb24gY2hpbGQgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpOwotCi0JCS8vIFRPRE86IGluaXRpYWxpemUgY2hpbGQgaGVyZS4uLgotCi0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kIHtAbGluayBBZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBSZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGQocGtnLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkpOwotCQlyZXN1bHQuYWRkKHBrZy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSk7Ci0JCXJlc3VsdC5hZGQocGtnLmdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGltYWdlIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDcmVhdGVfV2ViUmVzb3VyY2VDb2xsZWN0aV9VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgV2ViUmVzb3VyY2VDb2xsZWN0aW9uIgotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaGVscCB0ZXh0IGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVG9vbFRpcFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjRjb25jYXQiLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgY2hpbGQgb2YgdHlwZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24gZm9yIHRoZSBzZWxlY3RlZCB7MH0uIgotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBzZWN1cml0eV9jb25zdHJhaW50LmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNlY3VyaXR5X2NvbnN0cmFpbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgd2ViQXBwIG9mIHRoZSBTZWN1cml0eUNvbnN0cmFpbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChTZWN1cml0eUNvbnN0cmFpbnQpIG9iamVjdCkuZ2V0V2ViQXBwKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgd2ViQXBwIGZlYXR1cmUuCi0JCQkvLwotCQkJLyoKLQkJCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJICogV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYkFwcF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJXZWJBcHAiCi0JCQkgKiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3dlYkFwcF9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUKLQkJCSAqIHdlYkFwcCBwcm9wZXJ0eSIgcGtnLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJBcHAoKSkpOwotCQkJICovCi0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkaXNwbGF5TmFtZSBmZWF0dXJlLgotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGlzcGxheU5hbWVfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiRGlzcGxheU5hbWUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2Rpc3BsYXlOYW1lX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBkaXNwbGF5TmFtZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWUoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgYXV0aENvbnN0cmFpbnQgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBdXRoQ29uc3RyYWludF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJBdXRoQ29uc3RyYWludCIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfYXV0aENvbnN0cmFpbnRfcHJvcGVydF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgYXV0aENvbnN0cmFpbnQgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0F1dGhDb25zdHJhaW50KCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHVzZXJEYXRhQ29uc3RyYWludCBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVzZXJEYXRhQ29uc3RyYWludF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJVc2VyRGF0YUNvbnN0cmFpbnQiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3VzZXJEYXRhQ29uc3RyYWludF9wcm9fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHVzZXJEYXRhQ29uc3RyYWludCBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzcGxheSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZWN1cml0eUNvbnN0cmFpbnRfZGlzcGxheU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdXJpdHlDb25zdHJhaW50X2Rpc3BsYXlOYW1lX2ZlYXR1cmUiLCAiX1VJX1NlY3VyaXR5Q29uc3RyYWludF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBkaXNwbGF5TmFtZSA9ICgoU2VjdXJpdHlDb25zdHJhaW50KSBvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7Ci0JCWlmIChkaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0JCQlMaXN0IGRpc3BsYXlOYW1lTGlzdCA9ICgoU2VjdXJpdHlDb25zdHJhaW50KSBvYmplY3QpLmdldERpc3BsYXlOYW1lcygpOwotCQkJaWYgKGRpc3BsYXlOYW1lTGlzdCAhPSBudWxsICYmIGRpc3BsYXlOYW1lTGlzdC5zaXplKCkgPiAwKQotCQkJCWRpc3BsYXlOYW1lID0gKChEaXNwbGF5TmFtZSkgZGlzcGxheU5hbWVMaXN0LmdldCgwKSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlpZiAoZGlzcGxheU5hbWUgPT0gbnVsbCkKLQkJCWRpc3BsYXlOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICIgIiArIGRpc3BsYXlOYW1lOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRSA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpLCBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdXRoQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVXNlckRhdGFDb25zdHJhaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzcGxheU5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lcygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXJ2bGV0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlODQ4NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotcHVibGljIGNsYXNzIFNlcnZsZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBTZXJ2bGV0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgY2hpbGQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUNoaWxkKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETzogY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgeW91IHdhbnQuCi0JCUluaXRQYXJhbSBjaGlsZCA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFBhcmFtKCk7Ci0KLQkJLy8gVE9ETzogaW5pdGlhbGl6ZSBjaGlsZCBoZXJlLi4uCi0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQge0BsaW5rIEFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIFJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy9yZXN1bHQuYWRkKHBrZy5nZXRTZXJ2bGV0X1dlYlR5cGUoKSk7Ci0JCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSAoKFNlcnZsZXQpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCQlpZiAod2ViQXBwID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlpZiAod2ViQXBwLmdldEoyRUVWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLQkJCXJlc3VsdC5hZGQocGtnLmdldFNlcnZsZXRfSW5pdFBhcmFtcygpKTsKLQkJZWxzZQotCQkJcmVzdWx0LmFkZChwa2cuZ2V0U2VydmxldF9QYXJhbXMoKSk7Ci0JCXJlc3VsdC5hZGQocGtnLmdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpKTsKLQkJcmVzdWx0LmFkZChwa2cuZ2V0U2VydmxldF9SdW5BcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgaW1hZ2UgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKHJlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiQ3JlYXRlSW5pdFBhcmFtIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV9Jbml0UGFyYW1fVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIEluaXRQYXJhbSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGhlbHAgdGV4dCBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI2Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117cmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgYSBjaGlsZCBvZiB0eXBlIEluaXRQYXJhbSBmb3IgdGhlIHNlbGVjdGVkIHswfS4iCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZsZXQuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlXZWJUeXBlIHd0ID0gKChTZXJ2bGV0KSBvYmplY3QpLmdldFdlYlR5cGUoKTsKLQkJaWYgKHd0ICE9IG51bGwgJiYgd3QuaXNKc3BUeXBlKCkpCi0JCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgianNwX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzZXJ2bGV0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgU2VydmxldC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKFNlcnZsZXQpIG9iamVjdCkuZ2V0V2ViQXBwKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgc2VydmxldE5hbWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZXJ2bGV0TmFtZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8kTk9OLU5MUy0xJCA9ICJTZXJ2bGV0TmFtZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfc2VydmxldE5hbWVfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHNlcnZsZXROYW1lIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFNlcnZsZXRfU2VydmxldE5hbWUoKSkpOwotCi0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBsb2FkT25TdGFydHVwIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTG9hZE9uU3RhcnR1cF9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8kTk9OLU5MUy0xJCA9ICJMb2FkT25TdGFydHVwIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9sb2FkT25TdGFydHVwX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBsb2FkT25TdGFydHVwIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpLCBmYWxzZSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2bGV0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmxldE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZsZXRfc2VydmxldE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmxldF9zZXJ2bGV0TmFtZV9mZWF0dXJlIiwgIl9VSV9TZXJ2bGV0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMb2FkIE9uIFN0YXJ0dXAgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9hZE9uU3RhcnR1cFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmxldF9sb2FkT25TdGFydHVwX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZsZXRfbG9hZE9uU3RhcnR1cF9mZWF0dXJlIiwgIl9VSV9TZXJ2bGV0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZSBJSXRlbVByb3BlcnR5U291cmNlLmdldFByb3BlcnR5VmFsdWV9YnkKLQkgKiBkZWxlZ2F0aW5nIHRvIHRoZSBkZXNjcmlwdG9yLCB3aGljaCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgdGhlIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogaW50ZXJmYWNlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlPYmplY3QgcmV0ID0gbnVsbDsKLQkJaWYgKGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSBpbnN0YW5jZW9mIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQlyZXQgPSAoKFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkpLmdldFByb3BlcnR5VmFsdWUob2JqZWN0KTsKLQkJfSBlbHNlCi0JCQlyZXQgPSBzdXBlci5nZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCwgcHJvcGVydHkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBvYmplY3Q7Ci0JCVN0cmluZyBuYW1lID0gc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJbmFtZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI8c2VydmxldD5fVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiPHNlcnZsZXQ+IgotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmxldC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfTkFNRSA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVAgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEUgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUEFSQU1TIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0X1dlYlR5cGUoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0VHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0X1dlYlR5cGUoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKU1BUeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRfUGFyYW1zKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFBhcmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eVJvbGVSZWYoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldF9SdW5BcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRfSW5pdFBhcmFtcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbVZhbHVlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElJdGVtUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldCBJSXRlbVByb3BlcnR5U291cmNlLmlzUHJvcGVydHlTZXR9Ci0JICogYnkgZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqIGludGVyZmFjZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmIChnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgaW5zdGFuY2VvZiBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgewotCQkJcmV0ID0gKChXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpKS5pc1Byb3BlcnR5U2V0KG9iamVjdCk7Ci0JCX0gZWxzZQotCQkJcmV0ID0gc3VwZXIuaXNQcm9wZXJ0eVNldChvYmplY3QsIHByb3BlcnR5KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbVByb3BlcnR5U291cmNlI3NldFByb3BlcnR5VmFsdWUgSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5zZXRQcm9wZXJ0eVZhbHVlfWJ5Ci0JICogZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqIGludGVyZmFjZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQotCQlpZiAoZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIGluc3RhbmNlb2YgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKLQkJCSgoV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSkuc2V0UHJvcGVydHlWYWx1ZShvYmplY3QsIHZhbHVlKTsKLQkJfSBlbHNlCi0JCQlzdXBlci5zZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCwgcHJvcGVydHksIHZhbHVlKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmEyZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nfQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgc2VydmxldF9tYXBwaW5nLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNlcnZsZXRfbWFwcGluZyIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgU2VydmxldE1hcHBpbmcuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChTZXJ2bGV0TWFwcGluZykgb2JqZWN0KS5nZXRXZWJBcHAoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB1cmxQYXR0ZXJuIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVXJsUGF0dGVybl9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJVcmxQYXR0ZXJuIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV91cmxQYXR0ZXJuX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSB1cmxQYXR0ZXJuIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFNlcnZsZXRNYXBwaW5nX1VybFBhdHRlcm4oKSkpOwotCi0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBzZXJ2bGV0IGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VydmxldF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJTZXJ2bGV0IgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9zZXJ2bGV0X3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBzZXJ2bGV0IHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXQoKSwgZmFsc2UpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXJsIFBhdHRlcm4gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXJsUGF0dGVyblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmxldE1hcHBpbmdfdXJsUGF0dGVybl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2bGV0TWFwcGluZ191cmxQYXR0ZXJuX2ZlYXR1cmUiLCAiX1VJX1NlcnZsZXRNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJuKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZsZXRNYXBwaW5nX25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmxldE1hcHBpbmdfbmFtZV9mZWF0dXJlIiwgIl9VSV9TZXJ2bGV0TWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldE1hcHBpbmdfTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmxldCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2bGV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2bGV0TWFwcGluZ19zZXJ2bGV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZsZXRNYXBwaW5nX3NlcnZsZXRfZmVhdHVyZSIsICJfVUlfU2VydmxldE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXQoKSwgZmFsc2UpKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyB1cmxTdHIgPSAoKFNlcnZsZXRNYXBwaW5nKSBvYmplY3QpLmdldFVybFBhdHRlcm4oKTsKLQkJU2VydmxldCBzZXJ2bGV0ID0gKChTZXJ2bGV0TWFwcGluZykgb2JqZWN0KS5nZXRTZXJ2bGV0KCk7Ci0JCVN0cmluZyBzZXJ2bGV0U3RyID0gKHNlcnZsZXQgPT0gbnVsbCkgPyBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiP19VSV8iKSA6IHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCA9ICI/IgotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI4Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117dXJsU3RyLCBzZXJ2bGV0U3RyfSkpOyAvLyROT04tTkxTLTEkID0gIlNlcnZsZXQgbWFwcGluZyAoezB9IC0+IHsxfSkiCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmxldE1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fTkFNRSA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVQgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMzlhODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZX1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYlR5cGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFNlcnZsZXRUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgc2VydmxldF90eXBlLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNlcnZsZXRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgY2xhc3NOYW1lIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2xhc3NOYW1lX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkNsYXNzTmFtZSIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfY2xhc3NOYW1lX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBjbGFzc05hbWUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0U2VydmxldFR5cGVfQ2xhc3NOYW1lKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2xhc3MgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDbGFzc05hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZsZXRUeXBlX2NsYXNzTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2bGV0VHlwZV9jbGFzc05hbWVfZmVhdHVyZSIsICJfVUlfU2VydmxldFR5cGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXRUeXBlX0NsYXNzTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiNDFjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKFNlcnZsZXRUeXBlKSBvYmplY3QpLmdldENsYXNzTmFtZSgpfSkpOyAvLyROT04tTkxTLTEkID0gIlNlcnZsZXRUeXBlIHswfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmxldFR5cGUuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX1RZUEVfX0NMQVNTX05BTUUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1Nlc3Npb25Db25maWdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXNzaW9uQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzhiNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1Nlc3Npb25Db25maWdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZ30KLSAqIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25Db25maWdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFNlc3Npb25Db25maWdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBzZXNzaW9uX2NvbmZpZy5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzZXNzaW9uX2NvbmZpZyIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgU2Vzc2lvbkNvbmZpZy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKFNlc3Npb25Db25maWcpIG9iamVjdCkuZ2V0V2ViQXBwKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgc2Vzc2lvblRpbWVvdXQgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZXNzaW9uVGltZW91dF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJTZXNzaW9uVGltZW91dCIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfc2Vzc2lvblRpbWVvdXRfcHJvcGVydF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgc2Vzc2lvblRpbWVvdXQgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB3ZWJBcHAgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJBcHBfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiV2ViQXBwIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV93ZWJBcHBfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHdlYkFwcCBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRTZXNzaW9uQ29uZmlnX1dlYkFwcCgpKSk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlc3Npb24gVGltZW91dCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXNzaW9uVGltZW91dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2Vzc2lvbkNvbmZpZ19zZXNzaW9uVGltZW91dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXNzaW9uQ29uZmlnX3Nlc3Npb25UaW1lb3V0X2ZlYXR1cmUiLCAiX1VJX1Nlc3Npb25Db25maWdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzMWNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKCgoU2Vzc2lvbkNvbmZpZykgb2JqZWN0KS5nZXRTZXNzaW9uVGltZW91dCgpKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJTZXNzaW9uQ29uZmlnIHswfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2Vzc2lvbkNvbmZpZy5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9UYWdMaWJSZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9UYWdMaWJSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzMzdmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVGFnTGliUmVmSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVGFnTGliUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVGFnTGliUmVmfW9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFRhZ0xpYlJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgVGFnTGliUmVmSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMganNwX2xpYnJhcnlfcmVmZXJlbmNlLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImpzcF9saWJyYXJ5X3JlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgVGFnTGliUmVmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoVGFnTGliUmVmKSBvYmplY3QpLmdldFdlYkFwcCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHRhZ2xpYlVSSSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVSSV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUYWdsaWJVUkkiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3RhZ2xpYlVSSV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgdGFnbGliVVJJIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFRhZ0xpYlJlZl9UYWdsaWJVUkkoKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgdGFnbGliTG9jYXRpb24gZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJMb2NhdGlvbl9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUYWdsaWJMb2NhdGlvbiIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfdGFnbGliTG9jYXRpb25fcHJvcGVydF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgdGFnbGliTG9jYXRpb24gcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0VGFnTGliUmVmX1RhZ2xpYkxvY2F0aW9uKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHdlYkFwcCBmZWF0dXJlLgotCQkJLy8KLQkJCS8qCi0JCQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCSAqIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJBcHBfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiV2ViQXBwIgotCQkJICogV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV93ZWJBcHBfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlCi0JCQkgKiB3ZWJBcHAgcHJvcGVydHkiIHBrZy5nZXRUYWdMaWJSZWZfV2ViQXBwKCkpKTsKLQkJCSAqLwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYWdsaWIgVVJJIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYlVSSVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVGFnTGliUmVmX3RhZ2xpYlVSSV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYWdMaWJSZWZfdGFnbGliVVJJX2ZlYXR1cmUiLCAiX1VJX1RhZ0xpYlJlZl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFnTGliUmVmX1RhZ2xpYlVSSSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFnbGliIExvY2F0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYkxvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9UYWdMaWJSZWZfdGFnbGliTG9jYXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFnTGliUmVmX3RhZ2xpYkxvY2F0aW9uX2ZlYXR1cmUiLCAiX1VJX1RhZ0xpYlJlZl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFnTGliUmVmX1RhZ2xpYkxvY2F0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzMmNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoVGFnTGliUmVmKSBvYmplY3QpLmdldFRhZ2xpYlVSSSgpfSkpOyAvLyROT04tTkxTLTEkID0gIlRhZ0xpYlJlZiB7MH0iCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRhZ0xpYlJlZi5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfTE9DQVRJT04gOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9UYWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDMwY2ZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9UYWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuanNwLlRhZ0xpYlJlZlR5cGV9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVGFnbGliVVJJUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUYWdsaWJMb2NhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFnbGliIFVSSSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdsaWJVUklQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVUklfVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVSSV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYlVSSSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFnbGliIExvY2F0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYkxvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTG9jYXRpb25fVUlfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkxvY2F0aW9uX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUpzcFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhZ0xpYlJlZlR5cGVfVGFnbGliTG9jYXRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGFnTGliUmVmVHlwZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGFnTGliUmVmVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUYWdMaWJSZWZUeXBlKSBvYmplY3QpLmdldFRhZ2xpYlVSSSgpOwotCQlTdHJpbmcgdGxydCA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfVGFnTGliUmVmVHlwZV90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IHRscnQgOiB0bHJ0ICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGFnTGliUmVmVHlwZS5jbGFzcykpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfVVJJIDoKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT04gOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1VSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzMzljMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlfQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgVVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFVSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdXJsX3R5cGUuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgidXJsX3R5cGUiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByZXNDb2xsZWN0aW9uIG9mIHRoZSBVUkxQYXR0ZXJuVHlwZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKFVSTFBhdHRlcm5UeXBlKSBvYmplY3QpLmdldFJlc0NvbGxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB1cmxQYXR0ZXJuIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVXJsUGF0dGVybl9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJVcmxQYXR0ZXJuIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV91cmxQYXR0ZXJuX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSB1cmxQYXR0ZXJuIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFVSTFBhdHRlcm5UeXBlX1VybFBhdHRlcm4oKSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgcmVzQ29sbGVjdGlvbiBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJlc0NvbGxlY3Rpb25fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiUmVzQ29sbGVjdGlvbiIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfcmVzQ29sbGVjdGlvbl9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgcmVzQ29sbGVjdGlvbiBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRVUkxQYXR0ZXJuVHlwZV9SZXNDb2xsZWN0aW9uKCkpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXJsIFBhdHRlcm4gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXJsUGF0dGVyblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVVJMUGF0dGVyblR5cGVfdXJsUGF0dGVybl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9VUkxQYXR0ZXJuVHlwZV91cmxQYXR0ZXJuX2ZlYXR1cmUiLCAiX1VJX1VSTFBhdHRlcm5UeXBlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRVUkxQYXR0ZXJuVHlwZV9VcmxQYXR0ZXJuKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzM2NvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoVVJMUGF0dGVyblR5cGUpIG9iamVjdCkuZ2V0VXJsUGF0dGVybigpfSkpOyAvLyROT04tTkxTLTEkID0gIlVSTFBhdHRlcm5UeXBlIHswfSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVVJMUGF0dGVyblR5cGUuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLiBUaGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBpbXBsZW1lbnRlZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuIEl0ZW1Qcm92aWRlckFkYXB0ZXIuZ2V0Q2hpbGRyZW59Ci0JICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKLQkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1VzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1VzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMwNGIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Vc2VyRGF0YUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50fQotICogb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgVXNlckRhdGFDb25zdHJhaW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBVc2VyRGF0YUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB1c2VyX2RhdGFfY29uc3RyYWludC5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ1c2VyX2RhdGFfY29uc3RyYWludCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBzZWNDb25zdHJhaW50IG9mIHRoZSBVc2VyRGF0YUNvbnN0cmFpbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChVc2VyRGF0YUNvbnN0cmFpbnQpIG9iamVjdCkuZ2V0U2VjQ29uc3RyYWludCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGVzY3JpcHRpb25fVUlfX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkRlc2NyaXB0aW9uIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9kZXNjcmlwdGlvbl9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgZGVzY3JpcHRpb24gcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHRyYW5zcG9ydEd1YXJhbnRlZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRyYW5zcG9ydEd1YXJhbnRlZV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUcmFuc3BvcnRHdWFyYW50ZWUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3RyYW5zcG9ydEd1YXJhbnRlZV9wcm9fVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHRyYW5zcG9ydEd1YXJhbnRlZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHNlY0NvbnN0cmFpbnQgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWNDb25zdHJhaW50X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlNlY0NvbnN0cmFpbnQiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3NlY0NvbnN0cmFpbnRfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHNlY0NvbnN0cmFpbnQgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0VXNlckRhdGFDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVXNlckRhdGFDb25zdHJhaW50X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1VzZXJEYXRhQ29uc3RyYWludF9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9Vc2VyRGF0YUNvbnN0cmFpbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHJhbnNwb3J0IEd1YXJhbnRlZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUcmFuc3BvcnRHdWFyYW50ZWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1VzZXJEYXRhQ29uc3RyYWludF90cmFuc3BvcnRHdWFyYW50ZWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVXNlckRhdGFDb25zdHJhaW50X3RyYW5zcG9ydEd1YXJhbnRlZV9mZWF0dXJlIiwgIl9VSV9Vc2VyRGF0YUNvbnN0cmFpbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludF9UcmFuc3BvcnRHdWFyYW50ZWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzNGNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoVXNlckRhdGFDb25zdHJhaW50KSBvYmplY3QpLmdldFRyYW5zcG9ydEd1YXJhbnRlZSgpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJVc2VyRGF0YUNvbnN0cmFpbnQgezB9IgotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChVc2VyRGF0YUNvbnN0cmFpbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUUgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTgyNzkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VMb2NhdG9yIFJFU09VUkNFX0xPQ0FUT1IgPSBuZXcgUmVzb3VyY2VMb2NhdG9yKCkgewotCQlwdWJsaWMgVVJMIGdldEJhc2VVUkwoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIGFyZzApIHsKLQkJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKGFyZzApOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGFyZzApIHsKLQkJCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhhcmcwKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBhcmcwLCBPYmplY3RbXSBhcmcxKSB7Ci0JCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoYXJnMCwgYXJnMSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgYm9vbGVhbiB0cmFuc2xhdGUpIHsKLQkJCS8vIFRPRE8gRm9yIG5vdy4uLiAgdHJhbnNsYXRlIG5vdCBzdXBwb3J0ZWQKLQkJCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIHN1YnN0aXR1dGlvbnMsIGJvb2xlYW4gdHJhbnNsYXRlKSB7Ci0JCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSxzdWJzdGl0dXRpb25zKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgid2ViZWRpdCIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncywgaW50IHgpIHsKLQotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYkFwcEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYkFwcEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTY1NDhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJBcHBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuSk5ESUVudlJlZnNHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJBcHB9b2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgV2ViQXBwSXRlbVByb3ZpZGVyIGV4dGVuZHMgSk5ESUVudlJlZnNHcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgV2ViQXBwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgY2hpbGQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUNoaWxkKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETzogY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgeW91IHdhbnQuCi0JCUNvbnRleHRQYXJhbSBjaGlsZCA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGV4dFBhcmFtKCk7Ci0KLQkJLy8gVE9ETzogaW5pdGlhbGl6ZSBjaGlsZCBoZXJlLi4uCi0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG9iamVjdDsKLQkJQ29sbGVjdGlvbiBteUNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKHdlYkFwcC5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEKSB7Ci0JCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJCW15Q2hpbGRyZW4uYWRkQWxsKHNlcnZpY2VIZWxwZXIuZ2V0MTNTZXJ2aWNlUmVmcyh3ZWJBcHApKTsKLQkJfQotCQlyZXR1cm4gbXlDaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kIHtAbGluayBBZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBSZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKi8KLQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfQ29udGV4dHMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbGVMaXN0KCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9UYWdMaWJzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9Db25zdHJhaW50cygpKTsKLQkJCS8vY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9Mb2dpbkNvbmZpZygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfTWltZU1hcHBpbmdzKCkpOwotCQkJLy9jaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfU2VydmxldHMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbHRlcnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9MaXN0ZW5lcnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0NvbnRleHRQYXJhbXMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0pzcENvbmZpZygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGltYWdlIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZUNvbnRleHRQYXJhbSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDcmVhdGVfQ29udGV4dFBhcmFtX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIkNyZWF0ZSBDb250ZXh0UGFyYW0iCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBoZWxwIHRleHQgZm9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUb29sVGlwVGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzNWNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgY2hpbGQgb2YgdHlwZSBDb250ZXh0UGFyYW0gZm9yIHRoZSBzZWxlY3RlZCB7MH0uIgotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcga2V5ID0gbnVsbDsKLQkJaWYgKCgoV2ViQXBwKSBvYmplY3QpLmVSZXNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgid2ViX2FwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoICgoKFdlYkFwcCkgb2JqZWN0KS5nZXRWZXJzaW9uSUQoKSkgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEIDoKLQkJCQlrZXkgPSAid2ViYXBwXzIyIjsgLy8kTk9OLU5MUy0xJCAKLQkJCQlicmVhazsKLQotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEIDoKLQkJCQlrZXkgPSAid2ViYXBwXzIzIjsgLy8kTk9OLU5MUy0xJCAKLQkJCQlicmVhazsKLQotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEIDoKLQkJCWRlZmF1bHQgOgotCQkJCWtleSA9ICJ3ZWJhcHBfMjQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2Uoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkaXN0cmlidXRhYmxlIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGlzdHJpYnV0YWJsZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8kTk9OLU5MUy0xJCA9ICJEaXN0cmlidXRhYmxlIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9kaXN0cmlidXRhYmxlX3Byb3BlcnR5X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlRoZSBkaXN0cmlidXRhYmxlIHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFdlYkFwcF9EaXN0cmlidXRhYmxlKCkpKTsKLQotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgZmlsZUxpc3QgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGaWxlTGlzdF9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJGaWxlTGlzdCIKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZmlsZUxpc3RfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIGZpbGVMaXN0IHByb3BlcnR5IgotCQkJCQkJcGtnLmdldFdlYkFwcF9GaWxlTGlzdCgpKSk7Ci0KLQkJCS8qCi0JCQkgKiAvLyBjY2MgLSBmb3IgdXNhYmlsaXR5IHJlYXNvbnMsIHRoZXNlIGRlc2NyaXB0b3JzIGFyZSByZW1vdmVkIGZyb20gdGhlIHByb3BlcnR5Ci0JCQkgKiBzaGVldC4gLy8gVGhpcyBpcyBmb3IgdGhlIGxvZ2luQ29uZmlnIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JCQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkxvZ2luQ29uZmlnIiwKLQkJCSAqICJUaGUgbG9naW5Db25maWcgcHJvcGVydHkiLCBwa2cuZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCkpKTsKLQkJCSAqICAvLyBUaGlzIGlzIGZvciB0aGUgc2Vzc2lvbkNvbmZpZyBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCQkJICogSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkgKiAiU2Vzc2lvbkNvbmZpZyIsICJUaGUgc2Vzc2lvbkNvbmZpZyBwcm9wZXJ0eSIsIHBrZy5nZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZygpKSk7Ci0JCQkgKi8KLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzdHJpYnV0YWJsZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXN0cmlidXRhYmxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJBcHBfZGlzdHJpYnV0YWJsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJBcHBfZGlzdHJpYnV0YWJsZV9mZWF0dXJlIiwgIl9VSV9XZWJBcHBfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9EaXN0cmlidXRhYmxlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWZXJzaW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYkFwcF92ZXJzaW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYkFwcF92ZXJzaW9uX2ZlYXR1cmUiLCAiX1VJX1dlYkFwcF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX1ZlcnNpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG9iamVjdDsKLQkJU3RyaW5nIG5hbWUgPSB3ZWJBcHAuZ2V0RGlzcGxheU5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiPHdlYl9hcHA+X1VJXyIpOyAvLyROT04tTkxTLTEkID0gIjx3ZWIgYXBwPiIKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlYkFwcC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEUgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVkVSU0lPTiA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxFX0xJU1QgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVEFHX0xJQlMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OU1RSQUlOVFMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1MgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUcgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJTIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVMgOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJRyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfQ29udGV4dHMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZXh0UGFyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFcnJvclBhZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9FcnJvclBhZ2VzKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9GaWxlTGlzdCgpLCBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlbGNvbWVGaWxlTGlzdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfVGFnTGlicygpLCBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhZ0xpYlJlZigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfQ29uc3RyYWludHMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eUNvbnN0cmFpbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTG9naW5Db25maWcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpLCBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pbWVNYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9TZXNzaW9uQ29uZmlnKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbkNvbmZpZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldE1hcHBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX1NlcnZsZXRzKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eVJvbGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbHRlcnMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsdGVyTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfTGlzdGVuZXJzKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpc3RlbmVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtVmFsdWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0pzcENvbmZpZygpLCBKc3BGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKU1BDb25maWcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHF1YWxpZnkgPSBmZWF0dXJlID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpIHx8IGZlYXR1cmUgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKTsKLQkJcmV0dXJuIGdldFN0cmluZyhxdWFsaWZ5ID8gIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIgOiAiX1VJX0NyZWF0ZUNoaWxkX3RleHQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJbmV3IE9iamVjdFtde2dldFR5cGVUZXh0KGNoaWxkKSwgZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyOTRhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbn1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFdlYlJlc291cmNlQ29sbGVjdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGEgbmV3IGNoaWxkIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVDaGlsZChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE86IGNoZWNrIHRoYXQgdGhpcyBpcyB3aGF0IHlvdSB3YW50LgotCQlVUkxQYXR0ZXJuVHlwZSBjaGlsZCA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVVJMUGF0dGVyblR5cGUoKTsKLQotCQkvLyBUT0RPOiBpbml0aWFsaXplIGNoaWxkIGhlcmUuLi4KLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZCB7QGxpbmsgQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkKHBrZy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybigpKTsKLQkJcmVzdWx0LmFkZChwa2cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2QoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGltYWdlIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZVVSTFBhdHRlcm5UeXBlIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ3JlYXRlX1VSTFBhdHRlcm5UeXBlX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIkNyZWF0ZSBVUkxQYXR0ZXJuVHlwZSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGhlbHAgdGV4dCBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjM3Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117cmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgYSBjaGlsZCBvZiB0eXBlIFVSTFBhdHRlcm5UeXBlIGZvciB0aGUgc2VsZWN0ZWQgezB9LiIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgd2ViX3Jlc291cmNlX2NvbGxlY3Rpb24uZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid2ViX3Jlc291cmNlX2NvbGxlY3Rpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBzZWNDb25zdHJhaW50IG9mIHRoZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pIG9iamVjdCkuZ2V0U2VjQ29uc3RyYWludCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHdlYlJlc291cmNlTmFtZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYlJlc291cmNlTmFtZV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJXZWJSZXNvdXJjZU5hbWUiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3dlYlJlc291cmNlTmFtZV9wcm9wZXJfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHdlYlJlc291cmNlTmFtZSBwcm9wZXJ0eSIKLQkJCQkJCXBrZy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fV2ViUmVzb3VyY2VOYW1lKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRGVzY3JpcHRpb25fVUlfX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIkRlc2NyaXB0aW9uIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9kZXNjcmlwdGlvbl9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgZGVzY3JpcHRpb24gcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9uKCkpKTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHNlY0NvbnN0cmFpbnQgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWNDb25zdHJhaW50X1VJXyIpLCAvLyROT04tTkxTLTEkID0gIlNlY0NvbnN0cmFpbnQiCi0JCQkJCQlXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX3NlY0NvbnN0cmFpbnRfcHJvcGVydHlfVUlfIiksIC8vJE5PTi1OTFMtMSQgPSAiVGhlIHNlY0NvbnN0cmFpbnQgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1NlY0NvbnN0cmFpbnQoKSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXZWIgUmVzb3VyY2UgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXZWJSZXNvdXJjZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlJlc291cmNlQ29sbGVjdGlvbl93ZWJSZXNvdXJjZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViUmVzb3VyY2VDb2xsZWN0aW9uX3dlYlJlc291cmNlTmFtZV9mZWF0dXJlIiwgIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViUmVzb3VyY2VDb2xsZWN0aW9uX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1dlYlJlc291cmNlQ29sbGVjdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVcmwgUGF0dGVybiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVcmxQYXR0ZXJuUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fdXJsUGF0dGVybl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fdXJsUGF0dGVybl9mZWF0dXJlIiwgIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJuKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIdHRwIE1ldGhvZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIdHRwTWV0aG9kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25faHR0cE1ldGhvZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25faHR0cE1ldGhvZF9mZWF0dXJlIiwgIl9VSV9XZWJSZXNvdXJjZUNvbGxlY3Rpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMzhjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXSB7Ci0JCS8vICgoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKW9iamVjdCkuZ2V0V2ViUmVzb3VyY2VOYW1lKCkgfSkpOyAvLyROT04tTkxTLTEkID0KLQkJLy8gIldlYlJlc291cmNlQ29sbGVjdGlvbiB7MH0iCi0JCXJldHVybiAoKFdlYlJlc291cmNlQ29sbGVjdGlvbikgb2JqZWN0KS5nZXRXZWJSZXNvdXJjZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk4gOgotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUyA6Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TIDoKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRfUFMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoKChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkpLmdldFVSTHMoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVUkxQYXR0ZXJuVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb25zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKCgoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbigpKS5nZXRIdHRwTWV0aG9kKCksIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUE1ldGhvZFR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIjY3JlYXRlQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5DbGFzcywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgQ2xhc3MgY29tbWFuZENsYXNzLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNmID0gY29tbWFuZFBhcmFtZXRlci5nZXRFUmVmZXJlbmNlKCk7Ci0JCWlmIChzZiA9PSBudWxsKSB7Ci0JCQlzZiA9IGNvbW1hbmRQYXJhbWV0ZXIuZ2V0RUF0dHJpYnV0ZSgpOwotCQkJaWYgKHNmICE9IG51bGwgJiYgIXNmLmlzTWFueSgpKQotCQkJCXNmID0gbnVsbDsKLQkJfQotCQlpZiAoc2YgIT0gbnVsbCkgewotCQkJRU9iamVjdCBvd25lciA9IGNvbW1hbmRQYXJhbWV0ZXIuZ2V0RU93bmVyKCk7Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBjb21tYW5kUGFyYW1ldGVyLmdldENvbGxlY3Rpb24oKTsKLQkJCWlmIChjb21tYW5kQ2xhc3MgPT0gQWRkQ29tbWFuZC5jbGFzcykgewotCQkJCXJldHVybiBjcmVhdGVBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG93bmVyLCBzZiwgY29sbGVjdGlvbiwgY29tbWFuZFBhcmFtZXRlci5nZXRJbmRleCgpKTsKLQkJCX0gZWxzZSBpZiAoY29tbWFuZENsYXNzID09IFJlbW92ZUNvbW1hbmQuY2xhc3MpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVtb3ZlQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvd25lciwgc2YsIGNvbGxlY3Rpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZWRpdGluZ0RvbWFpbiwgY29tbWFuZENsYXNzLCBjb21tYW5kUGFyYW1ldGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWEzNjQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xMS8yMDAwIDU6NTQ6MjggUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgSXRlbVByb3BlcnR5RGVzY3JpcHRvciB7Ci0KLQlwcm90ZWN0ZWQgaW50IGNlbGxFZGl0b3JUeXBlID0gLTE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU01BTExfSUNPTl9FRElUT1IgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IExBUkdFX0lDT05fRURJVE9SID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBNVUxUSUxJTkVfVEVYVF9FRElUT1IgPSAzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFVVEhfQ09OU1RSQUlOVF9ST0xFU19FRElUT1IgPSA0OwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIHdoZXJlIHRoZSBjYXRlZ29yeSBhbmQgZmlsdGVyIGZsYWdzIGFyZSBlbXB0eSBhbmQgdGhlIGNlbGwgZWRpdG9yIGlzCi0JICogZGV0ZXJtaW5lZCBmb3IgdGhlIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIFdlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgZGlzcGxheU5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgRVJlZmVyZW5jZVtdIHBhcmVudFJlZmVyZW5jZXMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRpc3BsYXlOYW1lLCBkZXNjcmlwdGlvbiwgcGFyZW50UmVmZXJlbmNlcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIHdoZXJlIHRoZSBjYXRlZ29yeSBpcyBmaWx0ZXIgZmxhZ3MgYXJlIGVtcHR5IGFuZCB0aGUgY2VsbCBlZGl0b3IgaXMKLQkgKiBkZXRlcm1pbmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHN0cnVjdHVyYWwgZmVhdHVyZT4KLQkgKi8KLQlwdWJsaWMgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyBkaXNwbGF5TmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGlzcGxheU5hbWUsIGRlc2NyaXB0aW9uLCBmZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugd2hlcmUgdGhlIGNhdGVnb3J5IGlzIGZpbHRlciBmbGFncyBhcmUgZW1wdHkgYW5kIHRoZSBjZWxsIGVkaXRvciBpcwotCSAqIGRldGVybWluZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgc3RydWN0dXJhbCBmZWF0dXJlPgotCSAqLwotCXB1YmxpYyBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIGRpc3BsYXlOYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgbmV3Q2VsbEVkaXRvclR5cGUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRpc3BsYXlOYW1lLCBkZXNjcmlwdGlvbiwgZmVhdHVyZSk7Ci0JCWNlbGxFZGl0b3JUeXBlID0gbmV3Q2VsbEVkaXRvclR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy9UT0RPIFdlIG5lZWQgdG8gdXNlIHRoZSBDb21tYW5kU3RhY2sgZnJvbSB0aGUgV2ViRWRpdE1vZGVsLgotCQkvLyAgaWYgKGVkaXRpbmdEb21haW4gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRpbmdEb21haW4pCi0JCS8vCSAgKChTdHJ1Y3R1cmVkVGV4dEVkaXRpbmdEb21haW4pIGVkaXRpbmdEb21haW4pLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCS8vICBlbHNlCi0JCS8vCSAgZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yIHR5cGUuCi0JICovCi0JcHVibGljIGludCBnZXRDZWxsRWRpdG9yVHlwZSgpIHsKLQkJcmV0dXJuIGNlbGxFZGl0b3JUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgZGVsZWdhdGVkIGpvYiBvZiBzZXR0aW5nIHRoZSBwcm9wZXJ0eSB0byB0aGUgZ2l2ZW4gdmFsdWUuIEl0IGlzIGltcGxlbWVudGVkIGluCi0JICogYSBnZW5lcmljIHdheSB1c2luZyB0aGUgc3RydWN0dXJhbCBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCUVPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gZ2V0RWRpdGluZ0RvbWFpbihvYmplY3QpOwotCi0JCWlmIChwYXJlbnRSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCUVPYmplY3QgcmVmVmFsdWUgPSAoRU9iamVjdCkgdmFsdWU7Ci0JCQlDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRSZWZlcmVuY2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gcmVmT2JqZWN0LmVHZXQocGFyZW50UmVmZXJlbmNlc1tpXSk7Ci0JCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCQkJZmluYWwgRVJlZmVyZW5jZSBwYXJlbnRSZWZlcmVuY2UgPSBwYXJlbnRSZWZlcmVuY2VzW2ldOwotCQkJCQlpZiAob2xkVmFsdWUgPT0gdmFsdWUpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkvLyBlbHNlIGlmIChyZWZWYWx1ZS5yZWZJc0luc3RhbmNlT2YocGFyZW50UmVmZXJlbmNlLmdldEVUeXBlKCksIHRydWUpKQotCQkJCQllbHNlIGlmIChyZWZWYWx1ZS5lQ2xhc3MoKSA9PSBwYXJlbnRSZWZlcmVuY2UuZ2V0RVR5cGUoKSB8fCByZWZWYWx1ZS5lQ2xhc3MoKS5nZXRFQWxsU3VwZXJUeXBlcygpLmNvbnRhaW5zKHBhcmVudFJlZmVyZW5jZS5nZXRFVHlwZSgpKSkgewotCQkJCQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJCQkJCXJlZk9iamVjdC5lU2V0KHBhcmVudFJlZmVyZW5jZSwgdmFsdWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlDb21tYW5kIHNldENvbW1hbmQgPSBTZXRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCByZWZPYmplY3QsIHBhcmVudFJlZmVyZW5jZSwgdmFsdWUpOwotCQkJCQkJCWV4ZWN1dGVDb21tYW5kKGVkaXRpbmdEb21haW4sIHNldENvbW1hbmQpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJCQkJCXJlZk9iamVjdC5lU2V0KHBhcmVudFJlZmVyZW5jZSwgbnVsbCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlbW92ZUNvbW1hbmQgPSBTZXRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCByZWZPYmplY3QsIHBhcmVudFJlZmVyZW5jZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRSZWZlcmVuY2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgRVJlZmVyZW5jZSBwYXJlbnRSZWZlcmVuY2UgPSBwYXJlbnRSZWZlcmVuY2VzW2ldOwotCQkJCS8vaWYgKHJlZlZhbHVlLnJlZklzSW5zdGFuY2VPZihwYXJlbnRSZWZlcmVuY2UuZ2V0RVR5cGUoKSwgdHJ1ZSkpCi0JCQkJaWYgKHJlZlZhbHVlLmVDbGFzcygpID09IHBhcmVudFJlZmVyZW5jZS5nZXRFVHlwZSgpIHx8IHJlZlZhbHVlLmVDbGFzcygpLmdldEVBbGxTdXBlclR5cGVzKCkuY29udGFpbnMocGFyZW50UmVmZXJlbmNlLmdldEVUeXBlKCkpKSB7Ci0JCQkJCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCQkJCXJlZk9iamVjdC5lU2V0KHBhcmVudFJlZmVyZW5jZXNbaV0sIHZhbHVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChyZW1vdmVDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQlmaW5hbCBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZChDb21wb3VuZENvbW1hbmQuTEFTVF9DT01NQU5EX0FMTCk7Ci0JCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChyZW1vdmVDb21tYW5kKTsKLQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKFNldENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIHJlZk9iamVjdCwgcGFyZW50UmVmZXJlbmNlLCB2YWx1ZSkpOwotCQkJCQkJCWV4ZWN1dGVDb21tYW5kKGVkaXRpbmdEb21haW4sIGNvbXBvdW5kQ29tbWFuZCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWV4ZWN1dGVDb21tYW5kKGVkaXRpbmdEb21haW4sIFNldENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIHJlZk9iamVjdCwgcGFyZW50UmVmZXJlbmNlLCB2YWx1ZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCQlyZWZPYmplY3QuZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWV4ZWN1dGVDb21tYW5kKGVkaXRpbmdEb21haW4sIFNldENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIHJlZk9iamVjdCwgZmVhdHVyZSwgdmFsdWUpKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYlR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljN2NkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViVHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlfW9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFdlYlR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFdlYlR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB3ZWJfdHlwZS5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ3ZWJfdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJLy9XZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTs7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJUeXBlX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIldlYlR5cGUiCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhbHdheXMgcmV0dXJucyBmYWxzZS4gVGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgaW1wbGVtZW50ZWQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbiBJdGVtUHJvdmlkZXJBZGFwdGVyLmdldENoaWxkcmVufQotCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0Ci0JICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTgwMjA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBleHRlbmRlZCBpdGVtIHByb3ZpZGVyIHN1cHBvcnRzIHR3byBhZGRpdGlvbiBmZWF0dXJlcywgKEBsaW5rIENyZWF0ZUNoaWxkQ29tbWFuZH0gYW5kCi0gKiB7QGxpbmsgQ3JlYXRlQ2hpbGRyZW5Db21tYW5kfS4gVGhlc2UgdHdvIGFjdGlvbnMgYXJlIGltcGxlbWVudGVkIHVuaWZvcm1seSBvbiBhbGwgb3VyIGl0ZW0KLSAqIGFkYXB0ZXJzIHVzaW5nIHRoaXMgY29tbW9uIGJhc2UgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbmQgaW5zdGFuY2UgZnJvbSBhbiBhZGFwdGVyIGZhY3RvcnkgYW5kIGEgZG9tYWluIG5vdGlmaWVyLgotCSAqLwotCXByb3RlY3RlZCBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlQ2hpbGQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbmV3IGNoaWxkcmVuIGZvciB7QGxpbmsgQ3JlYXRlQ2hpbGRyZW5Db21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBjcmVhdGVDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVmYXVsdCBjcmVhdGUgY2hpbGQgaW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlDb2xsZWN0aW9uIGFjaGlsZHJlblJlZmVyZW5jZXMgPSBnZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJaWYgKGFjaGlsZHJlblJlZmVyZW5jZXMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJjcmVhdGVfY2hpbGQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKHJlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiQ3JlYXRlIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJKChFUmVmZXJlbmNlKSBhY2hpbGRyZW5SZWZlcmVuY2VzLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRFVHlwZSgpLmdldE5hbWUoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgY3JlYXRlIGNoaWxkcmVuIGxhYmVsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRyZW5UZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy9FT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCUNvbGxlY3Rpb24gYWNoaWxkcmVuUmVmZXJlbmNlcyA9IGdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQlpZiAoYWNoaWxkcmVuUmVmZXJlbmNlcy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDcmVhdGVfVHdvX0NoaWxkcmVuX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIkNyZWF0ZSBUd28gQ2hpbGRyZW4iCi0JCX0KLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI5Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFUmVmZXJlbmNlKSBhY2hpbGRyZW5SZWZlcmVuY2VzLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRFVHlwZSgpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgVHdvIHswfXMiCi0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgY3JlYXRlIGNoaWxkcmVuIGhlbHAgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkcmVuVG9vbFRpcFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCUNvbGxlY3Rpb24gYWNoaWxkcmVuUmVmZXJlbmNlcyA9IGdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQlpZiAoYWNoaWxkcmVuUmVmZXJlbmNlcy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI3Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117cmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgdHdvIG5ldyBjaGlsZHJlbiBmb3IgdGhlIHNlbGVjdGVkIHswfS4iCi0JCX0KLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI4Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFUmVmZXJlbmNlKSBhY2hpbGRyZW5SZWZlcmVuY2VzLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRFVHlwZSgpLmdldE5hbWUoKSwgcmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQkvLyROT04tTkxTLTEkID0gIkNyZWF0ZSB0d28gbmV3IGNoaWxkcmVuIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezF9LiIKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVmYXVsdCBjcmVhdGUgY2hpbGQgbGFiZWwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvL0VPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQkJQ29sbGVjdGlvbiBhY2hpbGRyZW5SZWZlcmVuY2VzID0gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCWlmIChhY2hpbGRyZW5SZWZlcmVuY2VzLnNpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV9DaGlsZF9VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgQ2hpbGQiCi0JCX0KLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI2Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFUmVmZXJlbmNlKSBhY2hpbGRyZW5SZWZlcmVuY2VzLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRFVHlwZSgpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgezB9IgotCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBkZWZhdWx0IGNyZWF0ZSBjaGlsZCBoZWxwIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlDb2xsZWN0aW9uIGFjaGlsZHJlblJlZmVyZW5jZXMgPSBnZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJaWYgKGFjaGlsZHJlblJlZmVyZW5jZXMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMmNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgbmV3IGNoaWxkIGZvciB0aGUgc2VsZWN0ZWQgezB9LiIKLQkJfQotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjRjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKEVSZWZlcmVuY2UpIGFjaGlsZHJlblJlZmVyZW5jZXMuaXRlcmF0b3IoKS5uZXh0KCkpLmdldEVUeXBlKCkuZ2V0TmFtZSgpLCByZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JCS8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgY2hpbGQgb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7MX0uIgotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ViZTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5MaXN0ZW5lckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsLldlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0Ci0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2VyLkNvbnRlbnRWaWV3ZXJ9cy4gVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydAotICogTU9GIGFkYXB0ZXIgbm90aWZpY2lhdGlvbnMgaW50byB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuRG9tYWluRXZlbnR9cy4gVGhlIGFkYXB0ZXJzIGFsc28KLSAqIHN1cHBvcnQgcHJvcGVydHkgc2hlZXRzLCBzZWUge0BsaW5rIGNvbS5pYm0uaXRwLnVpLmFwaS5wcm9wZXJ0eXNoZWV0fS4KLSAqLwotcHVibGljIGNsYXNzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJBcHB9Ci0JICogaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBXZWJBcHBJdGVtUHJvdmlkZXIgd2ViQXBwSXRlbVByb3ZpZGVyOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW19aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBDb250ZXh0UGFyYW1JdGVtUHJvdmlkZXIgY29udGV4dFBhcmFtSXRlbVByb3ZpZGVyOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2V9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBFcnJvclBhZ2VJdGVtUHJvdmlkZXIgZXJyb3JQYWdlSXRlbVByb3ZpZGVyOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZUVycm9yUGFnZUl0ZW1Qcm92aWRlciBleGNlcHRpb25UeXBlRXJyb3JQYWdlSXRlbVByb3ZpZGVyOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRmlsdGVyfQotCSAqIGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgRmlsdGVySXRlbVByb3ZpZGVyIGZpbHRlckl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZ31pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIgZmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgRXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyIGVycm9yQ29kZUVycm9yUGFnZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0fWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgV2VsY29tZUZpbGVMaXN0SXRlbVByb3ZpZGVyIHdlbGNvbWVGaWxlTGlzdEl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGV9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBXZWxjb21lRmlsZUl0ZW1Qcm92aWRlciB3ZWxjb21lRmlsZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVGFnTGliUmVmfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFnTGliUmVmSXRlbVByb3ZpZGVyIHRhZ0xpYlJlZkl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVGFnTGliUmVmVHlwZX1pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIgdGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50fWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlDb25zdHJhaW50SXRlbVByb3ZpZGVyIHNlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9ufWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgV2ViUmVzb3VyY2VDb2xsZWN0aW9uSXRlbVByb3ZpZGVyIHdlYlJlc291cmNlQ29sbGVjdGlvbkl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVVJMUGF0dGVyblR5cGV9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBVUkxQYXR0ZXJuVHlwZUl0ZW1Qcm92aWRlciB1UkxQYXR0ZXJuVHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGV9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBIVFRQTWV0aG9kVHlwZUl0ZW1Qcm92aWRlciBoVFRQTWV0aG9kVHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnR9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBBdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlciBhdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50fWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVXNlckRhdGFDb25zdHJhaW50SXRlbVByb3ZpZGVyIHVzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTG9naW5Db25maWd9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBMb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciBsb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRm9ybUxvZ2luQ29uZmlnfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgRm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyIGZvcm1Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmd9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBNaW1lTWFwcGluZ0l0ZW1Qcm92aWRlciBtaW1lTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZ31pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFNlc3Npb25Db25maWdJdGVtUHJvdmlkZXIgc2Vzc2lvbkNvbmZpZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmd9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBTZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlciBzZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2VydmxldH1pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFNlcnZsZXRJdGVtUHJvdmlkZXIgc2VydmxldEl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViVHlwZX1pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFdlYlR5cGVJdGVtUHJvdmlkZXIgd2ViVHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGV9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBTZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlciBzZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSlNQVHlwZX1pbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIEpTUFR5cGVJdGVtUHJvdmlkZXIgalNQVHlwZUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSW5pdFBhcmFtSXRlbVByb3ZpZGVyIGluaXRQYXJhbUl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTGlzdGVuZXJ9aW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0ZW5lckl0ZW1Qcm92aWRlciBsaXN0ZW5lckl0ZW1Qcm92aWRlcjsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uUm9sZU5hbWVUeXBlfWluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZU5hbWVUeXBlSXRlbVByb3ZpZGVyIHJvbGVOYW1lVHlwZUl0ZW1Qcm92aWRlcjsKLQlwcm90ZWN0ZWQgRGlzcG9zYWJsZSBkaXNwb3NhYmxlID0gbmV3IERpc3Bvc2FibGUoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZG9tYWluIG5vdGlmaWVyLgotCSAqLwotCXB1YmxpYyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgYWRhcHRlcktleSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQodGFyZ2V0LCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgYWRhcHRlclR5cGUpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHROZXcodGFyZ2V0LCBhZGFwdGVyVHlwZSk7Ci0JCWRpc3Bvc2FibGUuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50fS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRoQ29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCWlmIChhdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlciA9IG5ldyBBdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZXh0UGFyYW1BZGFwdGVyKCkgewotCQlpZiAoY29udGV4dFBhcmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnRleHRQYXJhbUl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZXh0UGFyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGV4dFBhcmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5FcnJvckNvZGVFcnJvclBhZ2V9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZUFkYXB0ZXIoKSB7Ci0JCWlmIChlcnJvckNvZGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyID0gbmV3IEVycm9yQ29kZUVycm9yUGFnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlcnJvckNvZGVFcnJvclBhZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXJyb3JQYWdlQWRhcHRlcigpIHsKLQkJaWYgKGVycm9yUGFnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQllcnJvclBhZ2VJdGVtUHJvdmlkZXIgPSBuZXcgRXJyb3JQYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVycm9yUGFnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZUFkYXB0ZXIoKSB7Ci0JCWlmIChleGNlcHRpb25UeXBlRXJyb3JQYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWV4Y2VwdGlvblR5cGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIgPSBuZXcgRXhjZXB0aW9uVHlwZUVycm9yUGFnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBleGNlcHRpb25UeXBlRXJyb3JQYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJ9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbHRlckFkYXB0ZXIoKSB7Ci0JCWlmIChmaWx0ZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZmlsdGVySXRlbVByb3ZpZGVyID0gbmV3IEZpbHRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBmaWx0ZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdH1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIgbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEFkYXB0ZXIoKSB7Ci0JCWlmIChsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SXRlbVByb3ZpZGVyID0gbmV3IExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExvY2FsRW5jb2RpbmdNYXBwaW5nSXRlbVByb3ZpZGVyIGxvY2FsRW5jb2RpbmdNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAobG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgTG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkZpbHRlck1hcHBpbmd9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbHRlck1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoZmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRm9ybUxvZ2luQ29uZmlnfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGb3JtTG9naW5Db25maWdBZGFwdGVyKCkgewotCQlpZiAoZm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZvcm1Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciA9IG5ldyBGb3JtTG9naW5Db25maWdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSFRUUE1ldGhvZFR5cGVBZGFwdGVyKCkgewotCQlpZiAoaFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgSFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5pdFBhcmFtQWRhcHRlcigpIHsKLQkJaWYgKGluaXRQYXJhbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbml0UGFyYW1JdGVtUHJvdmlkZXIgPSBuZXcgSW5pdFBhcmFtSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGluaXRQYXJhbUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTGlzdGVuZXJ9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpc3RlbmVyQWRhcHRlcigpIHsKLQkJaWYgKGxpc3RlbmVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWxpc3RlbmVySXRlbVByb3ZpZGVyID0gbmV3IExpc3RlbmVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGxpc3RlbmVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUeXBlQWRhcHRlcigpIHsKLQkJaWYgKGpTUFR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJalNQVHlwZUl0ZW1Qcm92aWRlciA9IG5ldyBKU1BUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGpTUFR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyIHVybFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb2dpbkNvbmZpZ0FkYXB0ZXIoKSB7Ci0JCWlmIChsb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlsb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciA9IG5ldyBMb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBsb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmd9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbWVNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKG1pbWVNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1pbWVNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IE1pbWVNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1pbWVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGV9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVOYW1lVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZU5hbWVUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVOYW1lVHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludH0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJaWYgKHNlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZWN1cml0eUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPSBuZXcgU2VjdXJpdHlDb25zdHJhaW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2VydmxldH0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldEFkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2bGV0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZsZXRJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmxldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2bGV0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZ30uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldE1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoc2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0VHlwZUFkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSlNQVHlwZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKU1BUeXBlSXRlbVByb3ZpZGVyIGpzcFR5cGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZ30uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2Vzc2lvbkNvbmZpZ0FkYXB0ZXIoKSB7Ci0JCWlmIChzZXNzaW9uQ29uZmlnSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlc3Npb25Db25maWdJdGVtUHJvdmlkZXIgPSBuZXcgU2Vzc2lvbkNvbmZpZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXNzaW9uQ29uZmlnSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWZ9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZkFkYXB0ZXIoKSB7Ci0JCWlmICh0YWdMaWJSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGFnTGliUmVmSXRlbVByb3ZpZGVyID0gbmV3IFRhZ0xpYlJlZkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0YWdMaWJSZWZJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZn0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFnTGliUmVmVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmICh0YWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgVGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0YWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVVJMUGF0dGVyblR5cGVBZGFwdGVyKCkgewotCQlpZiAodVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgVVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhUVFBNZXRob2RUeXBlSXRlbVByb3ZpZGVyIGh0dHBNZXRob2RUeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlVzZXJEYXRhQ29uc3RyYWludH0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVXNlckRhdGFDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJaWYgKHVzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl1c2VyRGF0YUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPSBuZXcgVXNlckRhdGFDb25zdHJhaW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHVzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViQXBwfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJBcHBBZGFwdGVyKCkgewotCQlpZiAod2ViQXBwSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdlYkFwcEl0ZW1Qcm92aWRlciA9IG5ldyBXZWJBcHBJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd2ViQXBwSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb259LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd2ViUmVzb3VyY2VDb2xsZWN0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFdlYlJlc291cmNlQ29sbGVjdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYlR5cGV9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlR5cGVBZGFwdGVyKCkgewotCQlpZiAod2ViVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3ZWJUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFdlYlR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd2ViVHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGV9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlbGNvbWVGaWxlQWRhcHRlcigpIHsKLQkJaWYgKHdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyID0gbmV3IFdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3R9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlbGNvbWVGaWxlTGlzdEFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWxjb21lRmlsZUxpc3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd2VsY29tZUZpbGVMaXN0SXRlbVByb3ZpZGVyID0gbmV3IFdlbGNvbWVGaWxlTGlzdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3ZWxjb21lRmlsZUxpc3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGlzcG9zYWJsZS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpIHx8IHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWxjb21lRmlsZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlbGNvbWVGaWxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTMxYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlbGNvbWVGaWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZX1vYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lRmlsZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKi8KLQlwdWJsaWMgV2VsY29tZUZpbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB3ZWxjb21lX2ZpbGUuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid2VsY29tZV9maWxlIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZmlsZUxpc3Qgb2YgdGhlIFdlbGNvbWVGaWxlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoV2VsY29tZUZpbGUpIG9iamVjdCkuZ2V0RmlsZUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSB3ZWxjb21lRmlsZSBmZWF0dXJlLgotCQkJLy8KLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlbGNvbWVGaWxlX1VJXyIpLCAvLyROT04tTkxTLTEkID0gIldlbGNvbWVGaWxlIgotCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV93ZWxjb21lRmlsZV9wcm9wZXJ0eV9VSV8iKSwgLy8kTk9OLU5MUy0xJCA9ICJUaGUgd2VsY29tZUZpbGUgcHJvcGVydHkiCi0JCQkJCQlwa2cuZ2V0V2VsY29tZUZpbGVfV2VsY29tZUZpbGUoKSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXZWxjb21lIEZpbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2VsY29tZUZpbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlbGNvbWVGaWxlX3dlbGNvbWVGaWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlbGNvbWVGaWxlX3dlbGNvbWVGaWxlX2ZlYXR1cmUiLCAiX1VJX1dlbGNvbWVGaWxlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZV9XZWxjb21lRmlsZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVdlbGNvbWVGaWxlIHdlbGNvbWVGaWxlID0gKFdlbGNvbWVGaWxlKSBvYmplY3Q7Ci0JCVN0cmluZyBuYW1lID0gd2VsY29tZUZpbGUuZ2V0V2VsY29tZUZpbGUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiPHdlbGNvbWUtZmlsZT5fVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiPHdlbGNvbWUtZmlsZT4iCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWxjb21lRmlsZS5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fV0VMQ09NRV9GSUxFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgZmFsc2UuIFRoZSBiYXNlIGNsYXNzIGhhcyBhbHJlYWR5IGltcGxlbWVudGVkCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4gSXRlbVByb3ZpZGVyQWRhcHRlci5nZXRDaGlsZHJlbn0KLQkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAotCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2VsY29tZUZpbGVMaXN0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2VsY29tZUZpbGVMaXN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OTNkMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlbGNvbWVGaWxlTGlzdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3R9Ci0gKiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lRmlsZUxpc3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFdlbGNvbWVGaWxlTGlzdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhIG5ldyBjaGlsZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlQ2hpbGQoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPOiBjaGVjayB0aGF0IHRoaXMgaXMgd2hhdCB5b3Ugd2FudC4KLQkJV2VsY29tZUZpbGUgY2hpbGQgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlbGNvbWVGaWxlKCk7Ci0KLQkJLy8gVE9ETzogaW5pdGlhbGl6ZSBjaGlsZCBoZXJlLi4uCi0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQge0BsaW5rIEFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIFJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZUxpc3RfRmlsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGltYWdlIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShyZWZPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkNyZWF0ZVdlbGNvbWVGaWxlIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ3JlYXRlX1dlbGNvbWVGaWxlX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIkNyZWF0ZSBXZWxjb21lRmlsZSIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGhlbHAgdGV4dCBmb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjQyY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117cmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgYSBjaGlsZCBvZiB0eXBlIFdlbGNvbWVGaWxlIGZvciB0aGUgc2VsZWN0ZWQgezB9LiIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgd2VsY29tZV9saXN0LmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoIndlbGNvbWVfbGlzdCIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgV2VsY29tZUZpbGVMaXN0LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoV2VsY29tZUZpbGVMaXN0KSBvYmplY3QpLmdldFdlYkFwcCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV2VsY29tZV9GaWxlX0xpc3RfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiV2VsY29tZSBGaWxlIExpc3QiCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlbGNvbWVGaWxlTGlzdC5jbGFzcykpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19GSUxFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2VsY29tZUZpbGVMaXN0X0ZpbGUoKSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dUUHJvamVjdFN0cmF0ZWd5VXRpbHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XVFByb2plY3RTdHJhdGVneVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YzA0NzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dUUHJvamVjdFN0cmF0ZWd5VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLQotcHVibGljIGNsYXNzIFdUUHJvamVjdFN0cmF0ZWd5VXRpbHMgewotCXB1YmxpYyBzdGF0aWMgRmlsZSBmaW5kU291cmNlRmlsZShBcmNoaXZlIGFyY2hpdmUsIFN0cmluZyBmaWxlKSB7Ci0JCWlmIChpc0NsYXNzRmlsZShmaWxlKSkKLQkJCXJldHVybiBmaW5kU291cmNlRmlsZUZvckNsYXNzKGFyY2hpdmUsIGZpbGUpOwotCi0JCS8vIExvb2sgaW4gdGhlIENMQVNTRVMgZGlyZWN0b3J5Ci0JCXRyeSB7Ci0JCQlpZiAoIWlzT3V0cHV0RmlsZShmaWxlKSkKLQkJCQlyZXR1cm4gYXJjaGl2ZS5nZXRGaWxlKGZpbGUpOwotCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJLy9EbyBub3RoaW5nCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGZpbmRTb3VyY2VGaWxlRm9yQ2xhc3MoQXJjaGl2ZSBhcmNoaXZlLCBTdHJpbmcgY2xhc3NGaWxlKSB7Ci0JCS8vIExvb2sgaW4gdGhlIENMQVNTRVMgZGlyZWN0b3J5Ci0JCUlQYXRoIGNsYXNzRmlsZVBhdGggPSBuZXcgUGF0aChjbGFzc0ZpbGUpOwotCQlJUGF0aCBzb3VyY2VGaWxlUGF0aCA9IGNsYXNzRmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmFkZEZpbGVFeHRlbnNpb24oImphdmEiKTsvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBhcmNoaXZlLmdldEZpbGUoc291cmNlRmlsZVBhdGgudG9TdHJpbmcoKSk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCXJldHVybiBmaWxlOwotCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJLy9EbyBub3RoaW5nCi0JCX0KLQotCQkvLyBMb29rIGluIHRoZSBMSUIgZGlyZWN0b3J5Ci0JCXNvdXJjZUZpbGVQYXRoID0gbmV3IFBhdGgoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSkuYXBwZW5kKHNvdXJjZUZpbGVQYXRoKTsKLQkJdHJ5IHsKLQkJCUZpbGUgZmlsZSA9IGFyY2hpdmUuZ2V0RmlsZShzb3VyY2VGaWxlUGF0aC50b1N0cmluZygpKTsKLQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJcmV0dXJuIGZpbGU7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL0RvIG5vdGhpbmcKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzRmlsZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiB1cmkuc3RhcnRzV2l0aChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSkgJiYgdXJpLmVuZHNXaXRoKCIuY2xhc3MiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3V0cHV0RmlsZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiB1cmkuc3RhcnRzV2l0aChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU291cmNlRmlsZShTdHJpbmcgdXJpKSB7Ci0JCS8vIEEgZmlsZSBpcyBjb25zaWRlcmVkIGEgamF2YSBzb3VyY2UgZmlsZSBpZiBpdCBpcyBpbiB0aGUKLQkJLy8gV0VCX0lORiBkaXJlY3RvcnkgYW5kIGl0IGRvZXMgbm90IGVuZCB3aXRoIC5jbGFzcy4KLQkJaWYgKHVyaS5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuV0VCX0lORiArICIvIikgJiYgLy8kTk9OLU5MUy0xJAotCQkJCQl1cmkuZW5kc1dpdGgoIi5qYXZhIikpLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VSZWxhdGl2ZShTdHJpbmcgcGF0aFN0cmluZywgU3RyaW5nIHJlbFRvUGF0aFN0cmluZykgewotCQlJUGF0aCByZWxUb1BhdGggPSBuZXcgUGF0aChyZWxUb1BhdGhTdHJpbmcpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aFN0cmluZyk7Ci0KLQkJaWYgKHBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHJlbFRvUGF0aCkgPT0gcmVsVG9QYXRoLnNlZ21lbnRDb3VudCgpKQotCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyZWxUb1BhdGguc2VnbWVudENvdW50KCkpOwotCi0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc0OWI2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuZGF0YW1vZGVsLnByb3BlcnRpZXMuSVdlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBXZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24obW9kZWwpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEVYQ0xVREVfQ09NUElMRV9KU1ApOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChFWENMVURFX0NPTVBJTEVfSlNQLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0VHlwZSgpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V3JvbmdDb21wb25lbnRUeXBlU3RyaW5nKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlyZXR1cm4gRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLk5PVF9BX1dBUiwgbmV3IE9iamVjdFtde3Byb2plY3ROYW1lfSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLndhciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICogRXhwb3J0cyB0aGUgc3BlY2lmaWVkIFdlYiBNb2R1bGUgcHJvamVjdCB0byB0aGUgc3BlY2lmaWVkIFdBUiBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB3ZWJQcm9qZWN0TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIFdlYiBNb2R1bGUgcHJvamVjdCB0byBleHBvcnQuCi0JICogQHBhcmFtIHdhckZpbGVOYW1lCi0JICogICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIFdBUiBmaWxlIGxvY2F0aW9uIHRvIGV4cG9ydCB0aGUgc3BlY2lmaWVkIFdlYiBNb2R1bGUgcHJvamVjdC4KLQkgKiBAcGFyYW0gb3ZlcndyaXRlRXhpc3RpbmcKLQkgKiAgICAgICAgICAgIElmIHRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBhbiBleGlzdGluZyBmaWxlIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkKLQkgKiAgICAgICAgICAgIDxjb2RlPmVhckZpbGVOYW1lPC9jb2RlPiB3aWxsIGJlIG92ZXJ3cml0dGVuLgotCSAqIEBwYXJhbSBleHBvcnRTb3VyY2UKLQkgKiAgICAgICAgICAgIElmIHRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBhbGwgc291cmNlIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgV2ViIE1vZHVsZQotCSAqICAgICAgICAgICAgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIFdBUiBmaWxlLgotCSAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLQkgKi8KLQkvLyBUT0RPOiBkZXRlcm1pbmUgcGxhbiBmb3IgbmV3IERNIFByb3ZpZGVyCi0JLy8gcHVibGljIHN0YXRpYyB2b2lkIGV4cG9ydFByb2plY3QoU3RyaW5nIHdlYlByb2plY3ROYW1lLCBTdHJpbmcgd2FyRmlsZU5hbWUsIGJvb2xlYW4KLQkvLyBvdmVyd3JpdGVFeGlzdGluZywgYm9vbGVhbiBleHBvcnRTb3VyY2UpIHsKLQkvLyBXZWJNb2R1bGVFeHBvcnREYXRhTW9kZWwgZGF0YU1vZGVsID0gbmV3IFdlYk1vZHVsZUV4cG9ydERhdGFNb2RlbCgpOwotCS8vIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUsIHdlYlByb2plY3ROYW1lKTsKLQkvLyBkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KE9WRVJXUklURV9FWElTVElORywgb3ZlcndyaXRlRXhpc3RpbmcpOwotCS8vIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShBUkNISVZFX0RFU1RJTkFUSU9OLCB3YXJGaWxlTmFtZSk7Ci0JLy8gZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShFWFBPUlRfU09VUkNFX0ZJTEVTLCBleHBvcnRTb3VyY2UpOwotCS8vIHRyeSB7Ci0JLy8gZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5ydW4obnVsbCk7Ci0JLy8gfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JLy8gTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCS8vIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkvLyBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JLy8gfQotCS8vIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2MTY3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuSmF2YUVFQXJjaGl2ZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuQXBwQ2xpZW50QXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSjJFRUFydGlmYWN0RXhwb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbiBleHRlbmRzIEoyRUVBcnRpZmFjdEV4cG9ydE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgV2ViQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBXZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhwb3J0KCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCBFWFBPUlRfV09SSyk7Ci0JCUlBcmNoaXZlIGFyY2hpdmVGcm9tQ29tcG9uZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFyY2hpdmVGcm9tQ29tcG9uZW50ID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5vcGVuQXJjaGl2ZShnZXRDb21wb25lbnQoKSk7Ci0JCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5nZXRKYXZhRUVRdWlja1BlZWsoYXJjaGl2ZUZyb21Db21wb25lbnQpOwotCQkJaWYgKHF1aWNrUGVlay5nZXRKYXZhRUVWZXJzaW9uKCkgPT0gSjJFRUNvbnN0YW50cy5KRUVfNV8wX0lEKSB7Ci0JCQkJc2F2ZUFyY2hpdmUoYXJjaGl2ZUZyb21Db21wb25lbnQsIGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSwgc3ViTW9uaXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGNhZiA9ICgoQ29tbW9uYXJjaGl2ZVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpKS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCQkJCVdlYkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwgbHMgPSBuZXcgV2ViQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChnZXRDb21wb25lbnQoKSk7Ci0JCQkJbHMuc2V0RXhwb3J0U291cmNlKGlzRXhwb3J0U291cmNlKCkpOwotCQkJCWxzLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCXNldE1vZHVsZUZpbGUoY2FmLm9wZW5XQVJGaWxlKGxzLCBnZXREZXN0aW5hdGlvblBhdGgoKS50b09TU3RyaW5nKCkpKTsKLQkJCQlnZXRNb2R1bGVGaWxlKCkuZ2V0T3B0aW9ucygpLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0JCQkJbHMuc2V0UHJvZ3Jlc3NNb25pdG9yKHN1Yk1vbml0b3IpOwotCQkJCWdldE1vZHVsZUZpbGUoKS5zYXZlQXNOb1Jlb3BlbihnZXREZXN0aW5hdGlvblBhdGgoKS50b09TU3RyaW5nKCkpOwotCQkJfQotCQl9IGNhdGNoIChTYXZlRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQXBwQ2xpZW50QXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5BUkNISVZFX09QRVJBVElPTl9PcGVuaW5nQXJjaGl2ZSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYXJjaGl2ZUZyb21Db21wb25lbnQgIT0gbnVsbCkKLQkJCQlKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmNsb3NlQXJjaGl2ZShhcmNoaXZlRnJvbUNvbXBvbmVudCk7Ci0KLQkJCXN1Yk1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBhcmNoaXZlU3RyaW5nKCkgewotCQlyZXR1cm4gIldhciBGaWxlIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDI2ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQXJjaGl2ZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuZGF0YW1vZGVsLnByb3BlcnRpZXMuSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgZGF0YU1vZGVsIGlzIHVzZWQgZm9yIHRvIGltcG9ydCBXZWIgTW9kdWxlcyAoZnJvbSBXQVIgZmlsZXMpIGludG8gdGhlIHdvcmtzcGFjZS4KLSAqIAotICogVGhpcyBjbGFzcyAoYW5kIGFsbCBpdHMgZmllbGRzIGFuZCBtZXRob2RzKSBpcyBsaWtlbHkgdG8gY2hhbmdlIGR1cmluZyB0aGUgV1RQIDEuMCBtaWxlc3RvbmVzIGFzCi0gKiB0aGUgbmV3IHByb2plY3Qgc3RydWN0dXJlcyBhcmUgYWRvcHRlZC4gVXNlIGF0IHlvdXIgb3duIHJpc2suCi0gKiAKLSAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoV0VCX0xJQl9NT0RFTFMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChXRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVEKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ09OVEVYVF9ST09UKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhXRUJfTElCX01PREVMUykgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhXRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVEKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFhNTFJlc291cmNlLldFQl9BUFBfVFlQRTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVW5rbm93blR5cGUoSmF2YUVFUXVpY2tQZWVrIGpxcCkgewotCQlqcXAuc2V0VHlwZShKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSk7Ci0JCWpxcC5zZXRWZXJzaW9uKEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzVfSUQpOwotCQlqcXAuc2V0SmF2YUVFVmVyc2lvbihKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlTW9kdWxlVHlwZSgpIHsKLQkJaWYgKGdldEFyY2hpdmVXcmFwcGVyKCkuZ2V0SmF2YUVFUXVpY2tQZWVrKCkuZ2V0VHlwZSgpID09IEoyRUVDb25zdGFudHMuV0VCX1RZUEUpCi0JCQlyZXR1cm4gT0tfU1RBVFVTOwotCi0JCS8vIFRPRE86IFNUUklORyBNT1ZFCi0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJUZW1wIFN0cmluZyBmb3Igbm9uZSBXQVJGaWxlIikpOyAvLyROT04tTkxTLTEkKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBUkNISVZFX1dSQVBQRVIpKSB7Ci0JCQkKLQkJCUlEYXRhTW9kZWwgbW9kdWxlRE0gPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04pOwotCQkJaWYgKGdldEFyY2hpdmVXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCQotCQkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgbW9kdWxlRE0uZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotCQkJCUlEYXRhTW9kZWwgd2ViRmFjZXREYXRhTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCICk7Ci0JCQkJCi0JCQkJaW50IHZlcnNpb24gPSBnZXRNb2R1bGVTcGVjVmVyc2lvbigpOwotCQkJCVN0cmluZyB2ZXJzaW9uVGV4dCA9IEoyRUVWZXJzaW9uVXRpbC5nZXRTZXJ2bGV0VGV4dFZlcnNpb24oIHZlcnNpb24gKTsKLQkJCQl3ZWJGYWNldERhdGFNb2RlbC5zZXRTdHJpbmdQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCB2ZXJzaW9uVGV4dCk7Ci0JCQkJdXBkYXRlSmF2YUZhY2V0VmVyc2lvbigpOwotCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCX0JCQkKLQkJCQotCQkJQXJjaGl2ZVdyYXBwZXIgYXJjaGl2ZVdyYXBwZXIgPSAoQXJjaGl2ZVdyYXBwZXIpIHByb3BlcnR5VmFsdWU7Ci0JCQlpZiAobnVsbCAhPSBhcmNoaXZlV3JhcHBlcikgewotCQkJCUxpc3QgPEFyY2hpdmVXcmFwcGVyPiBsaWJzID0gYXJjaGl2ZVdyYXBwZXIuZ2V0V2ViTGlicygpOwotCQkJCUxpc3QgbmVzdGVkTW9kZWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicy5zaXplKCk7IGkrKykgewotCQkJCQlJRGF0YU1vZGVsIGxvY2FsTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSjJFRVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCQkJbG9jYWxNb2RlbC5zZXRQcm9wZXJ0eShBUkNISVZFX1dSQVBQRVIsIGxpYnMuZ2V0KGkpKTsKLQkJCQkJbG9jYWxNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIGdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSkpOwotCQkJCQlJRGF0YU1vZGVsIGZhY2V0RGF0YU1vZGVsID0gbG9jYWxNb2RlbC5nZXROZXN0ZWRNb2RlbChJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKTsKLQkJCQkJZmFjZXREYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIGZhbHNlKTsKLQkJCQkJbmVzdGVkTW9kZWxzLmFkZChsb2NhbE1vZGVsKTsKLQkJCQl9Ci0JCQkJc2V0UHJvcGVydHkoV0VCX0xJQl9NT0RFTFMsIG5lc3RlZE1vZGVscyk7Ci0JCQl9Ci0JCX1lbHNlIGlmKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OVEVYVF9ST09UKSl7Ci0JCQlJRGF0YU1vZGVsIGNyZWF0aW9uTW9kZWwgPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04pOwotCQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBjcmVhdGlvbk1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCUlEYXRhTW9kZWwgd2ViRmFjZXREYXRhTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCICk7Ci0JCQl3ZWJGYWNldERhdGFNb2RlbC5zZXRTdHJpbmdQcm9wZXJ0eShJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05URVhUX1JPT1QsIChTdHJpbmcpcHJvcGVydHlWYWx1ZSk7Ci0JCX1lbHNlIGlmKHByb3BlcnR5TmFtZS5lcXVhbHMoV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCkpIHsKLQkJCXZhbGlkYXRlTGliTW9kZWxSdW50aW1lcygpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmKEZBQ0VUX1JVTlRJTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpewotCQkJc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQkJCXJldHVybiB2YWxpZGF0ZUxpYk1vZGVsUnVudGltZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlTGliTW9kZWxSdW50aW1lcygpIHsKLQkJTGlzdCBsaWJBcmNoaXZlcyA9IChMaXN0KWdldFByb3BlcnR5KFdFQl9MSUJfQVJDSElWRVNfU0VMRUNURUQpOwotCQlMaXN0IGxpYk1vZGVscyA9IChMaXN0KWdldFByb3BlcnR5KFdFQl9MSUJfTU9ERUxTKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBPS19TVEFUVVM7Ci0JCWZvciAoaW50IGk9MDsgaSA8IGxpYk1vZGVscy5zaXplKCk7IGkrKykgewotCQkJSURhdGFNb2RlbCBsaWJNb2RlbCA9IChJRGF0YU1vZGVsKWxpYk1vZGVscy5nZXQoaSk7Ci0JCQlpZiAobGliQXJjaGl2ZXMuY29udGFpbnMobGliTW9kZWwuZ2V0UHJvcGVydHkoQVJDSElWRV9XUkFQUEVSKSkpewotCQkJCXN0YXR1cyA9IGxpYk1vZGVsLnZhbGlkYXRlUHJvcGVydHkoRkFDRVRfUlVOVElNRSk7Ci0JCQl9Ci0JCQlpZighc3RhdHVzLmlzT0soKSl7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuQXJjaGl2ZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0Uub3BlbldBUkZpbGUoZ2V0QXJjaGl2ZU9wdGlvbnMoKSwgdXJpKTsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgY3JlYXRlSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBXZWJDb21wb25lbnRJbXBvcnRPcGVyYXRpb24obW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJSURhdGFNb2RlbCBjb21wb25lbnRDcmVhdGlvbkRNID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKTsKLQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBjb21wb25lbnRDcmVhdGlvbkRNLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJSURhdGFNb2RlbCB3ZWJGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbCggSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQiApOwkKLQkJd2ViRmFjZXQuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERCwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpICYmIGV2ZW50LmdldERhdGFNb2RlbCgpID09IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTikpIHsKLQkJCU9iamVjdCBwcm9wZXJ0eVZhbHVlID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCUlEYXRhTW9kZWwgbmVzdGVkTW9kZWwgPSBudWxsOwotCQkJTGlzdCBwcm9qZWN0TW9kZWxzID0gKExpc3QpIGdldFByb3BlcnR5KFdFQl9MSUJfTU9ERUxTKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE1vZGVscy5zaXplKCk7IGkrKykgewotCQkJCW5lc3RlZE1vZGVsID0gKElEYXRhTW9kZWwpIHByb2plY3RNb2RlbHMuZ2V0KGkpOwotCQkJCW5lc3RlZE1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZDQ1YWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudEltcG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuV2ViQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5KMkVFQXJ0aWZhY3RJbXBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBXZWJDb21wb25lbnRJbXBvcnRPcGVyYXRpb24gZXh0ZW5kcyBKMkVFQXJ0aWZhY3RJbXBvcnRPcGVyYXRpb24gewotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRJbXBvcnRPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGludCBMSU5LX0NPTVBPTkVOVFNfV09SSyA9IDEwOwotCXByb3RlY3RlZCBmaW5hbCBpbnQgTElCX0ZPTERFUl9XT1JLID0gMjsKLQkKLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVUb3RhbFdvcmsoKSB7Ci0JCWludCBiYXNlV29yayA9IHN1cGVyLmNvbXB1dGVUb3RhbFdvcmsoKSArIExJQl9GT0xERVJfV09SSzsKLQkJTGlzdCBzZWxlY3RlZExpYnMgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCk7Ci0JCUxpc3QgbGliUHJvamVjdHMgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuV0VCX0xJQl9NT0RFTFMpOwotCQlJRGF0YU1vZGVsIGltcG9ydE1vZGVsID0gbnVsbDsKLQkJQXJjaGl2ZVdyYXBwZXIgbGliQXJjaGl2ZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBudWxsICE9IGxpYlByb2plY3RzICYmIGkgPCBsaWJQcm9qZWN0cy5zaXplKCk7IGkrKykgewotCQkJaW1wb3J0TW9kZWwgPSAoSURhdGFNb2RlbCkgbGliUHJvamVjdHMuZ2V0KGkpOwotCQkJbGliQXJjaGl2ZSA9IChBcmNoaXZlV3JhcHBlcikgaW1wb3J0TW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUik7Ci0JCQlpZiAoc2VsZWN0ZWRMaWJzLmNvbnRhaW5zKGxpYkFyY2hpdmUpKSB7Ci0JCQkJYmFzZVdvcmsgKz0gTElOS19DT01QT05FTlRTX1dPUksgKyBQUk9KRUNUX0NSRUFUSU9OX1dPUksgKyBsaWJBcmNoaXZlLmdldFNpemUoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGJhc2VXb3JrOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIuZG9FeGVjdXRlKG1vbml0b3IpOwotCQlJVmlydHVhbEZvbGRlciBsaWJGb2xkZXIgPSB2aXJ0dWFsQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoV2ViQXJ0aWZhY3RFZGl0LldFQkxJQik7Ci0JCWlmICghbGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCWxpYkZvbGRlci5jcmVhdGUoSVJlc291cmNlLkZPUkNFLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIExJQl9GT0xERVJfV09SSykpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbW9uaXRvci53b3JrZWQoTElCX0ZPTERFUl9XT1JLKTsKLQkJfQotCQl0cnkgewotCQkJaW1wb3J0V2ViTGlicmFyeVByb2plY3RzKG1vbml0b3IpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGltcG9ydFdlYkxpYnJhcnlQcm9qZWN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJTGlzdCA8QXJjaGl2ZVdyYXBwZXI+IHNlbGVjdGVkTGlicyA9IChMaXN0PEFyY2hpdmVXcmFwcGVyPikgbW9kZWwuZ2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCk7Ci0JCUxpc3QgPE9iamVjdD4gc2VsZWN0ZWRMaWJzVW5kZXJseWluZ0FyY2hpdmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoQXJjaGl2ZVdyYXBwZXIgbGliOiBzZWxlY3RlZExpYnMpewotCQkJc2VsZWN0ZWRMaWJzVW5kZXJseWluZ0FyY2hpdmVzLmFkZChsaWIuZ2V0VW5kZXJMeWluZ0FyY2hpdmUoKSk7Ci0JCX0KLQkJTGlzdCA8SURhdGFNb2RlbD4gbGliUHJvamVjdHMgPSAoTGlzdCA8SURhdGFNb2RlbD4pIG1vZGVsLmdldFByb3BlcnR5KElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLldFQl9MSUJfTU9ERUxTKTsKLQkJSURhdGFNb2RlbCBpbXBvcnRNb2RlbCA9IG51bGw7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IG5lc3RlZENvbXBvbmVudCA9IG51bGw7Ci0JCUFyY2hpdmVXcmFwcGVyIGxpYkFyY2hpdmUgPSBudWxsOwotCQlMaXN0IHRhcmdldENvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1hcCBjb21wVG9VUklNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgbnVsbCAhPSBsaWJQcm9qZWN0cyAmJiBpIDwgbGliUHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCWltcG9ydE1vZGVsID0gKElEYXRhTW9kZWwpIGxpYlByb2plY3RzLmdldChpKTsKLQkJCWxpYkFyY2hpdmUgPSAoQXJjaGl2ZVdyYXBwZXIpIGltcG9ydE1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpOwotCQkJaWYgKHNlbGVjdGVkTGlic1VuZGVybHlpbmdBcmNoaXZlcy5jb250YWlucyhsaWJBcmNoaXZlLmdldFVuZGVyTHlpbmdBcmNoaXZlKCkpKSB7Ci0JCQkJaW1wb3J0TW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBQUk9KRUNUX0NSRUFUSU9OX1dPUksgKyBsaWJBcmNoaXZlLmdldFNpemUoKSkgLCBpbmZvKTsKLQkJCQluZXN0ZWRDb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIGltcG9ydE1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQpOwotCQkJCXRhcmdldENvbXBvbmVudHMuYWRkKG5lc3RlZENvbXBvbmVudCk7Ci0JCQkJU3RyaW5nIGFyY2hpdmVVUkkgPSBsaWJBcmNoaXZlLmdldFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJCWNvbXBUb1VSSU1hcC5wdXQobmVzdGVkQ29tcG9uZW50LCBhcmNoaXZlVVJJKTsKLQkJCX0KLQkJfQotCQkvKioKLQkJICogVGhlIEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluciB3aWxsIGhhbmRsZSBhZGRpbmcgdGhlc2UgdG8gdGhlIGNsYXNzcGF0aCwgc28gdGhleQotCQkgKiBkb24ndCBuZWVkIHRvIGJlIGFkZGVkIGhlcmUuCi0JCSAqLwotCQlpZiAodGFyZ2V0Q29tcG9uZW50cy5zaXplKCkgPiAwKSB7Ci0JCQlJRGF0YU1vZGVsIGNyZWF0ZVJlZkNvbXBvbmVudHNNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQljcmVhdGVSZWZDb21wb25lbnRzTW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHZpcnR1YWxDb21wb25lbnQpOwotCQkJY3JlYXRlUmVmQ29tcG9uZW50c01vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSCwgIi9XRUItSU5GL2xpYi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlUmVmQ29tcG9uZW50c01vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIHRhcmdldENvbXBvbmVudHMpOwotCQkJY3JlYXRlUmVmQ29tcG9uZW50c01vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLCBjb21wVG9VUklNYXApOwotCQkJY3JlYXRlUmVmQ29tcG9uZW50c01vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgTElOS19DT01QT05FTlRTX1dPUksgKiB0YXJnZXRDb21wb25lbnRzLnNpemUoKSksIGluZm8pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3koSVZpcnR1YWxDb21wb25lbnQgYVZpcnR1YWxDb21wb25lbnQpIHsKLQkJcmV0dXJuIG5ldyBXZWJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKGFWaXJ0dWFsQ29tcG9uZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIGdldEFyY2hpdmVTYXZlQWRhcHRlcigKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQpIHsKLQkJcmV0dXJuIG5ldyBXZWJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIodmlydHVhbENvbXBvbmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzQ3ZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5Db21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LldlYlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgV2ViQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIENvbXBvbmVudExvYWRTdHJhdGVneUltcGwgewotCi0JcHVibGljIFdlYkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQlzdXBlcih2Q29tcG9uZW50KTsKLQl9Ci0JCi0JcHVibGljIFdlYkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCwgYm9vbGVhbiBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewotCQlzdXBlcih2Q29tcG9uZW50LCBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmlsZXMoKSB7Ci0JCXN1cGVyLmdldEZpbGVzKCk7Ci0JCWFkZExvb3NlTGliSkFSc1RvRmlsZXMoKTsKLQkJaWYgKGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB7Ci0JCQlhZGRNYXBwZWRDbGFzc0ZvbGRlcnMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTX1BBVEgpOwotCQl9Ci0JCXJldHVybiBmaWxlc0hvbGRlci5nZXRGaWxlcygpOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldExpYk1vZHVsZXMoKSB7Ci0JCXJldHVybiBXZWJVdGlsaXRpZXMuZ2V0TGliTW9kdWxlcyhnZXRDb21wb25lbnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTG9vc2VMaWJKQVJzVG9GaWxlcygpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBsaWJNb2R1bGVzID0gZ2V0TGliTW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYk1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIGlMaWJNb2R1bGUgPSBsaWJNb2R1bGVzW2ldOwotCQkJSVZpcnR1YWxDb21wb25lbnQgbG9vc2VDb21wb25lbnQgPSBpTGliTW9kdWxlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCWlmIChsb29zZUNvbXBvbmVudC5pc0JpbmFyeSgpKSB7Ci0JCQkJVmlydHVhbEFyY2hpdmVDb21wb25lbnQgYXJjaGl2ZUNvbXAgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIGxvb3NlQ29tcG9uZW50OwotCQkJCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IGFyY2hpdmVDb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJCWlmICghZGlza0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJSUZpbGUgd2JGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJZGlza0ZpbGUgPSBuZXcgRmlsZSh3YkZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlTdHJpbmcgdXJpID0gaUxpYk1vZHVsZS5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkgKyAiLyIgKyBkaXNrRmlsZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRFeHRlcm5hbEZpbGUodXJpLCBkaXNrRmlsZSk7CQkJCQotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCQkJU3RyaW5nIGFyY2hpdmVOYW1lID0gaUxpYk1vZHVsZS5nZXRBcmNoaXZlTmFtZSgpOwotCQkJCWlmIChhcmNoaXZlTmFtZSAhPSBudWxsICYmIGFyY2hpdmVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQluYW1lID0gYXJjaGl2ZU5hbWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbmFtZSA9IGxvb3NlQ29tcG9uZW50LmdldE5hbWUoKSArICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlTdHJpbmcgcHJlZml4ID0gaUxpYk1vZHVsZS5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgcHJlZml4LmNoYXJBdChwcmVmaXgubGVuZ3RoKCkgLSAxKSE9ICcvJykgewotCQkJCQlwcmVmaXggKz0gIi8iOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzKGxvb3NlQ29tcG9uZW50KTsKLQkJCQkKLQkJCQlTdHJpbmcgdXJpID0gcHJlZml4ICsgbmFtZTsKLQkJCQl0cnkgewotCQkJCQlBcmNoaXZlIHV0aWxKQVIgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5hc0FyY2hpdmUodXJpLCBsb29zZUNvbXBvbmVudC5nZXRQcm9qZWN0KCksIGlzRXhwb3J0U291cmNlKCkpOwotCQkJCQlpZiAodXRpbEpBUiA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWZpbGVzSG9sZGVyLmFkZEZpbGUodXRpbEpBUik7Ci0JCQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gb2UpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuVU5BQkxFX1RPX0xPQURfTU9EVUxFX0VSUk9SXywgbmV3IE9iamVjdFtde3VyaSwgZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgb2UuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKX0pOyAvLyROT04tTkxTLTEkCi0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nVHJhY2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSB7Ci0JCWlmKGFydGlmYWN0RWRpdCA9PSBudWxsKXsKLQkJCWFydGlmYWN0RWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHZDb21wb25lbnQpOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmNpZXMoZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCkgewotCQkvLyByZXRyaWV2ZSBhbGwgSmF2YSBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcwotCQlpZiAoaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMgJiYgcmVmZXJlbmNlZENvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIGNwUmVmcyA9ICgoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIHJlZmVyZW5jZWRDb21wb25lbnQpLmdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNwUmVmcy5sZW5ndGg7IGorKykgewotCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IGNwUmVmc1tqXTsKLQkJCQlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IHJlZi5nZXRSdW50aW1lUGF0aCgpOwotCQkJCQotCQkJCS8vIG9ubHkgcHJvY2VzcyAuLi8gbWFwcGluZ3MKLQkJCQlpZiAocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50Ci0JCQkJCQkmJiBydW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEgpKSB7Ci0JCQkJCWZpbmFsIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGNvbXAgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCUZpbGUgY3BFbnRyeUZpbGUgPSBjb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJCQlpZiAoIWNwRW50cnlGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlmaW5hbCBJRmlsZSB3YkZpbGUgPSBjb21wLmdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCk7Ci0JCQkJCQljcEVudHJ5RmlsZSA9IG5ldyBGaWxlKHdiRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJYWRkRXh0ZXJuYWxGaWxlKCJXRUItSU5GL2xpYi8iICsgcmVmLmdldEFyY2hpdmVOYW1lKCksIGNwRW50cnlGaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTcyYTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkoyRUVDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLQotcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBKMkVFQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCB7Ci0KLQlwdWJsaWMgV2ViQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbChJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50KSB7Ci0JCXN1cGVyKHZDb21wb25lbnQpOwotCX0KLQotCS8qKgotCSAqIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNQotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIGFyY2hpdmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3BlcmF0aW9uSGFuZGxlc05lc3RlZChBcmNoaXZlIGFyY2hpdmUpIHsKLQkJcmV0dXJuICFzaG91bGRMaW5rQXNDb21wb25lbnRSZWYoYXJjaGl2ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWRkSW1wb3J0ZWRDbGFzc2VzVG9DbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBmYWxzZTsgLy8gbmV2ZXIgYWRkIHRvIGNsYXNzcGF0aCBiZWNhdXNlIHRoZSB3ZWIgYXBwIGNvbnRhaW5lciB3aWxsIHBpY2sgdGhpcyB1cC4KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEltcG9ydGVkQ2xhc3Nlc1VSSShGaWxlIGFGaWxlKSB7Ci0JCVN0cmluZyB1cmkgPSBhRmlsZS5nZXRVUkkoKTsKLQkJcmV0dXJuIFdUUHJvamVjdFN0cmF0ZWd5VXRpbHMubWFrZVJlbGF0aXZlKHVyaSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBnZXRJbXBvcnRlZENsYXNzZXNSdW50aW1lUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKCIvIiArIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0T3V0cHV0UGF0aEZvckZpbGUoRmlsZSBhRmlsZSkgewotCQlpZiAobnVsbCAhPSBub25TdGFuZGFyZFNvdXJjZUZpbGVzICYmIG5vblN0YW5kYXJkU291cmNlRmlsZXMuY29udGFpbnNLZXkoYUZpbGUpKSB7Ci0JCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQlJVmlydHVhbEZpbGUgdkZpbGUgPSByb290Rm9sZGVyLmdldEZpbGUoKFN0cmluZykgbm9uU3RhbmRhcmRTb3VyY2VGaWxlcy5nZXQoYUZpbGUpKTsKLQkJCUlGaWxlIGlGaWxlID0gdkZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJCXJldHVybiBpRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldE91dHB1dFBhdGhGb3JGaWxlKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1hcCBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gYSBqYXZhIHNvdXJjZSBmaWxlIGlzIG5vdCBpbiB0aGUgc2FtZSBwbGFjZSBhcyB0aGUgLmNsYXNzCi0JICogZmlsZS4gRm9yIGV4YW1wbGUgaWYgYWxsIHRoZSBzb3VyY2UgZmlsZXMgd2VyZSBjb250YWluZWQgaW4gV0VCLUlORi9zb3VyY2UKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIG5vblN0YW5kYXJkU291cmNlRmlsZXM7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NsYXNzV2l0aG91dFNvdXJjZShGaWxlIGFGaWxlKSB7Ci0JCVN0cmluZyBqYXZhVXJpID0gQXJjaGl2ZVV0aWwuY2xhc3NVcmlUb0phdmFVcmkoYUZpbGUuZ2V0VVJJKCkpOwotCQlpZiAoamF2YVVyaSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYXJjaGl2ZS5jb250YWluc0ZpbGUoamF2YVVyaSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBzZWUgaWYgaXQgaXMgYSBKU1AKLQkJU3RyaW5nIGpzcFVyaSA9IGphdmFVcmkuc3Vic3RyaW5nKDAsIGphdmFVcmkuaW5kZXhPZihBcmNoaXZlVXRpbC5ET1RfSkFWQSkpOwotCQlpbnQgbGFzdFNsYXNoID0ganNwVXJpLmxhc3RJbmRleE9mKCcvJyk7Ci0JCWludCBfaW5kZXggPSBsYXN0U2xhc2ggPT0gLTEgPyBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSS5sZW5ndGgoKSA6IGxhc3RTbGFzaCArIDE7Ci0JCWlmIChqc3BVcmkuY2hhckF0KF9pbmRleCkgPT0gJ18nKSB7Ci0JCQlqc3BVcmkgPSBqc3BVcmkuc3Vic3RyaW5nKEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJLmxlbmd0aCgpLCBfaW5kZXgpICsganNwVXJpLnN1YnN0cmluZyhfaW5kZXggKyAxKSArIEFyY2hpdmVVdGlsLkRPVF9KU1A7Ci0JCQlpZiAoYXJjaGl2ZS5jb250YWluc0ZpbGUoanNwVXJpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIHNlZSBpZiB0aGUgc291cmNlIGlzIGluIGFub3RoZXIgZGlyZWN0b3J5Ci0JCUZpbGUgc291cmNlRmlsZSA9ICgoV0FSRmlsZSkgYXJjaGl2ZSkuZ2V0U291cmNlRmlsZShhRmlsZSk7Ci0JCWlmIChudWxsID09IHNvdXJjZUZpbGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChub25TdGFuZGFyZFNvdXJjZUZpbGVzID09IG51bGwpIHsKLQkJCW5vblN0YW5kYXJkU291cmNlRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWlmICghbm9uU3RhbmRhcmRTb3VyY2VGaWxlcy5jb250YWluc0tleShzb3VyY2VGaWxlKSkgewotCQkJbm9uU3RhbmRhcmRTb3VyY2VGaWxlcy5wdXQoc291cmNlRmlsZSwgamF2YVVyaSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzViZjEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUHJlZmVyZW5jZXMuS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci0KLXB1YmxpYyBjbGFzcyBXZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JcHVibGljIFdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotICAgICAgICAKLQkJQ29sbGVjdGlvbjxJUHJvamVjdEZhY2V0PiByZXF1aXJlZEZhY2V0cyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RGYWNldD4oKTsKLSAgICAgICAgcmVxdWlyZWRGYWNldHMuYWRkKEphdmFGYWNldFV0aWxzLkpBVkFfRkFDRVQpOwotICAgICAgICByZXF1aXJlZEZhY2V0cy5hZGQoSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQl9GQUNFVCk7Ci0gICAgICAgIHNldFByb3BlcnR5KFJFUVVJUkVEX0ZBQ0VUU19DT0xMRUNUSU9OLCByZXF1aXJlZEZhY2V0cyk7Ci0KLSAgICAgICAgRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApOwotICAgICAgICBJRGF0YU1vZGVsIGphdmFGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbCggSmF2YUZhY2V0VXRpbHMuSkFWQV9GQUNFVC5nZXRJZCgpICk7Ci0JCUlEYXRhTW9kZWwgd2ViRmFjZXQgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfRkFDRVQuZ2V0SWQoKSApOwotCQlTdHJpbmcgd2ViUm9vdCA9IHdlYkZhY2V0LmdldFN0cmluZ1Byb3BlcnR5KElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIpOwotCQlTdHJpbmcgd2ViU3JjID0gd2ViRmFjZXQuZ2V0U3RyaW5nUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUik7Ci0JCWphdmFGYWNldC5zZXRQcm9wZXJ0eShJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUl9OQU1FLCB3ZWJTcmMpOwotCQlqYXZhRmFjZXQuc2V0UHJvcGVydHkoSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FLAotCQkJCUoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFN0cmluZyhLZXlzLkRZTl9XRUJfT1VUUFVUX0ZPTERFUikgKTsKLQkJCi0JCXdlYkZhY2V0LmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlpZiAoaXNQcm9wZXJ0eVNldChFQVJfUFJPSkVDVF9OQU1FKSkKLQkJCQkJCXNldFByb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCQllbHNlCi0JCQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCQl9ZWxzZSBpZiAoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlzZXRQcm9wZXJ0eShBRERfVE9fRUFSLCBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlpZiggcHJvcGVydHlOYW1lLmVxdWFscyggTU9EVUxFX1VSSSApKXsKLQkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgZ2V0UHJvcGVydHkoRkFDRVRfRE1fTUFQKTsKLQkJCUlEYXRhTW9kZWwgd2ViRmFjZXQgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCICk7CQotCQkJd2ViRmFjZXQuc2V0UHJvcGVydHkoIElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5NT0RVTEVfVVJJLCBwcm9wZXJ0eVZhbHVlICk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTNiYmRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY2xhc3NwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aC5GbGV4aWJsZVByb2plY3RDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJBcHBMaWJyYXJpZXNDb250YWluZXIgCi0gICAgCi0gICAgZXh0ZW5kcyBGbGV4aWJsZVByb2plY3RDb250YWluZXIKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aFtdIHBhdGhzIAotICAgICAgICA9IG5ldyBJUGF0aFtdIHsgbmV3IFBhdGgoICJXRUItSU5GL2xpYiIgKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGF0aCggIldFQi1JTkYvY2xhc3NlcyIgKSB9OwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdGhUeXBlW10gdHlwZXMgCi0gICAgICAgID0gbmV3IFBhdGhUeXBlW10geyBQYXRoVHlwZS5MSUJfRElSRUNUT1JZLCBQYXRoVHlwZS5DTEFTU0VTX0RJUkVDVE9SWSB9OwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRBSU5FUl9JRCAKLSAgICAgICAgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmNvbnRhaW5lciI7Ci0gICAgCi0gICAgcHVibGljIFdlYkFwcExpYnJhcmllc0NvbnRhaW5lciggZmluYWwgSVBhdGggcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QganByb2plY3QgKQotICAgIHsKLSAgICAgICAgIHN1cGVyKCBwYXRoLCBqcHJvamVjdCwgZ2V0UHJvamVjdCggcGF0aCwganByb2plY3QpLCBwYXRocywgdHlwZXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICBpZiggdGhpcy5vd25lci5nZXRQcm9qZWN0KCkgIT0gdGhpcy5wcm9qZWN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKCBSZXNvdXJjZXMubGFiZWxXaXRoUHJvamVjdCwgdGhpcy5wcm9qZWN0LmdldE5hbWUoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlcy5sYWJlbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnN0YWxsKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbmV3IElKYXZhUHJvamVjdFtdIHsgdGhpcy5vd25lciB9OwotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyW10gY29udHMgPSBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHsgdGhpcyB9OwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoIHBhdGgsIHByb2plY3RzLCBjb250cywgbnVsbCApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBKYXZhTW9kZWxFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdlYlBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgICB7Ci0gICAgICAgICggbmV3IFdlYkFwcExpYnJhcmllc0NvbnRhaW5lciggdGhpcy5wYXRoLCB0aGlzLm93bmVyICkgKS5pbnN0YWxsKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVmZXJlbmNlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgIHN0YXRpYyB7Ci0gICAgCXJlZmVyZW5jZU9wdGlvbnMucHV0KCJHRVRfSkFWQV9SRUZTIiwgQm9vbGVhbi5GQUxTRSk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJVmlydHVhbFJlZmVyZW5jZVtdIGNvbXB1dGVSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IHZjKSB7Ci0gICAgCXJldHVybiAoKFZpcnR1YWxDb21wb25lbnQpdmMpLmdldFJlZmVyZW5jZXMocmVmZXJlbmNlT3B0aW9ucyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0IGdldFByb2plY3QoIGZpbmFsIElQYXRoIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIGlmKCBwYXRoLnNlZ21lbnRDb3VudCgpID09IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4ganByb2plY3QuZ2V0UHJvamVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBwYXRoLnNlZ21lbnQoIDEgKTsKLSAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoIG5hbWUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGFiZWxXaXRoUHJvamVjdDsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFdlYkFwcExpYnJhcmllc0NvbnRhaW5lci5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXIucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkY2MxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9jbGFzc3BhdGgvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1sYWJlbCA9IFdlYiBBcHAgTGlicmFyaWVzCi1sYWJlbFdpdGhQcm9qZWN0ID0gV2ViIEFwcCBMaWJyYXJpZXMgW3swfV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9jbGFzc3BhdGgvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXJJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDAyYTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXJJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmNsYXNzcGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoLkZsZXhpYmxlUHJvamVjdENvbnRhaW5lckluaXRpYWxpemVyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJBcHBMaWJyYXJpZXNDb250YWluZXJJbml0aWFsaXplcgotCi0gICAgZXh0ZW5kcyBGbGV4aWJsZVByb2plY3RDb250YWluZXJJbml0aWFsaXplcgotCi17Ci0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSggZmluYWwgSVBhdGggcGF0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qICkKLQotCSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCi0JewotCSAgICAoIG5ldyBXZWJBcHBMaWJyYXJpZXNDb250YWluZXIoIHBhdGgsIGpwcm9qICkgKS5pbnN0YWxsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NsYXNzcGF0aFV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9DbGFzc3BhdGhVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhZTFiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NsYXNzcGF0aFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoVXRpbGl0aWVzIHsKLQotCXN0YXRpYyBwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gYWRkQ2xhc3NwYXRoRW50cmllcyhJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzMSwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllczIpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChlbnRyaWVzMS5sZW5ndGggKyBlbnRyaWVzMi5sZW5ndGgpOwotCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KGVudHJpZXMxKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzMi5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGlDbGFzc3BhdGhFbnRyeSA9IGVudHJpZXMyW2ldOwotCQkJaWYgKCFsaXN0LmNvbnRhaW5zKGlDbGFzc3BhdGhFbnRyeSkpCi0JCQkJbGlzdC5hZGQoaUNsYXNzcGF0aEVudHJ5KTsKLQkJfQotCi0JCUlDbGFzc3BhdGhFbnRyeVtdIHJldCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbGlzdC5zaXplKCldOwotCQlyZXR1cm4gKElDbGFzc3BhdGhFbnRyeVtdKSBsaXN0LnRvQXJyYXkocmV0KTsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIGJvb2xlYW4gZW50cnlFeGlzdHMoSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBJQ2xhc3NwYXRoRW50cnlbXSBjb2wpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2wubGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBvdGhlckVudHJ5ID0gY29sW2ldOwotCQkJaWYgKGVudHJ5LmdldENvbnRlbnRLaW5kKCkgIT0gb3RoZXJFbnRyeS5nZXRDb250ZW50S2luZCgpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgIT0gb3RoZXJFbnRyeS5nZXRFbnRyeUtpbmQoKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKGVudHJ5LmlzRXhwb3J0ZWQoKSAhPSBvdGhlckVudHJ5LmlzRXhwb3J0ZWQoKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCFlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKG90aGVyRW50cnkuZ2V0UGF0aCgpKSkKLQkJCQljb250aW51ZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlbW92ZUNsYXNzcGF0aEVudHJpZXMoSUNsYXNzcGF0aEVudHJ5W10gcmVtb3ZlRnJvbUNvbCwgSUNsYXNzcGF0aEVudHJ5W10gcmVtb3ZlQ29sKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QocmVtb3ZlRnJvbUNvbC5sZW5ndGgpOwotCQkvLwkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZW1vdmVGcm9tQ29sKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdmVGcm9tQ29sLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgaUNsYXNzcGF0aEVudHJ5ID0gcmVtb3ZlRnJvbUNvbFtpXTsKLQkJCWlmICghZW50cnlFeGlzdHMoaUNsYXNzcGF0aEVudHJ5LCByZW1vdmVDb2wpKQotCQkJCWxpc3QuYWRkKGlDbGFzc3BhdGhFbnRyeSk7Ci0JCX0KLQotCQlJQ2xhc3NwYXRoRW50cnlbXSByZXQgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2xpc3Quc2l6ZSgpXTsKLQkJcmV0dXJuIChJQ2xhc3NwYXRoRW50cnlbXSkgbGlzdC50b0FycmF5KHJldCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9Db252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlMmJiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3BlcnRpZXMgewotCQotCQotCXB1YmxpYyBDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ09OVkVSVF9UT19XRUJfVkVSU0lPTik7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9Db252ZXJ0U3RhdGljV2ViVG9EeWFtbmljT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyMWI1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5JV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5XZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5XZWJGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIENvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY09wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIENvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNPcGVyYXRpb24oSURhdGFNb2RlbCBkbSkgewotCQlzdXBlcihkbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJdHJ5IHsKLQkJCQlkb0NvbnZlcnQoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJV2ViUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJCi0JCQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb0NvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCQotCQlTdHJpbmcgc2VsZWN0ZWRWZXJzaW9uID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUNvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlZFUlRfVE9fV0VCX1ZFUlNJT04pOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVCk7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJU2V0IGZpeGVkRmFjZXRzID0gbmV3IEhhc2hTZXQoKTsKLQkJZml4ZWRGYWNldHMuYWRkQWxsKGZhY2V0ZWRQcm9qZWN0LmdldEZpeGVkUHJvamVjdEZhY2V0cygpKTsKLQkJSVByb2plY3RGYWNldCB3ZWJGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLldTVF9XRUJfTU9EVUxFKTsKLQkJZml4ZWRGYWNldHMucmVtb3ZlKHdlYkZhY2V0KTsKLQkJZml4ZWRGYWNldHMuYWRkKFdlYkZhY2V0VXRpbHMuV0VCX0ZBQ0VUKTsKLQkJZml4ZWRGYWNldHMuYWRkKEphdmFGYWNldFV0aWxzLkpBVkFfRkFDRVQpOwotCQlmYWNldGVkUHJvamVjdC5zZXRGaXhlZFByb2plY3RGYWNldHMoZml4ZWRGYWNldHMpOwotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiB3ZWJGdiA9IFdlYkZhY2V0VXRpbHMuV0VCX0ZBQ0VULmdldFZlcnNpb24oc2VsZWN0ZWRWZXJzaW9uKTsKLQkJSVByb2plY3RGYWNldFZlcnNpb24gamF2YUZ2ID0gSmF2YUZhY2V0VXRpbHMuY29tcGlsZXJMZXZlbFRvRmFjZXQoSmF2YUZhY2V0VXRpbHMuZ2V0Q29tcGlsZXJMZXZlbChwcm9qZWN0KSk7Ci0JCUlGYWNldGVkUHJvamVjdC5BY3Rpb24gdW5pbnN0YWxsID0gbmV3IElGYWNldGVkUHJvamVjdC5BY3Rpb24oSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbi5UeXBlLlVOSU5TVEFMTCwgZmFjZXRlZFByb2plY3QuZ2V0SW5zdGFsbGVkVmVyc2lvbih3ZWJGYWNldCksIG51bGwpOwotCQlJRGF0YU1vZGVsIHdlYk1vZGVsQ2ZnID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQl3ZWJNb2RlbENmZy5zZXRCb29sZWFuUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgZmFsc2UpOwotCQkvLyBHZXQgdGhlIGRlZmF1bHQgd2ViIHJvb3QgZm9sZGVyIG5hbWUgKGp1c3QgaW4gY2FzZSB0aGUgLmNvbXBvbmVudCBmaWxlIGRvZXNuJ3QgZXhpc3QgZm9yIHNvbWUgcmVhc29uKQotCQlTdHJpbmcgd2ViUm9vdCA9IHdlYk1vZGVsQ2ZnLmdldFN0cmluZ1Byb3BlcnR5KElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIpOwotCQkKLQkJSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQljLmNyZWF0ZSgwLCBudWxsKTsKLQkJaWYgKGMuZXhpc3RzKCkpIHsKLQkJCS8vIEdldCB0aGUgd2ViIHJvb3QgZm9sZGVyIGZyb20gdGhlIC5jb21wb25lbnQgZmlsZSAKLQkJCUlWaXJ0dWFsRm9sZGVyIHJvb3QgPSBjLmdldFJvb3RGb2xkZXIoKTsKLQkJCXdlYlJvb3QgPSByb290LmdldFVuZGVybHlpbmdGb2xkZXIoKS5nZXROYW1lKCk7Ci0JCQkvLyBTdG9yZSB0aGUgbmFtZSBpbnRvIHRoZSBwcm9wZXJ0aWVzIGZvciB1c2UgZHVyaW5nIGZhY2V0IGluc3RhbAotCQkJd2ViTW9kZWxDZmcuc2V0U3RyaW5nUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUiwgd2ViUm9vdCk7Ci0JCX0KLQotCQlJRGF0YU1vZGVsIGphdmFNb2RlbENmZyA9IG51bGw7Ci0JCWlmIChQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpewotCQkJamF2YU1vZGVsQ2ZnID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCWphdmFNb2RlbENmZy5zZXRQcm9wZXJ0eShJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuREVGQVVMVF9PVVRQVVRfRk9MREVSX05BTUUsCi0JCQkJCXdlYlJvb3QrIi8iKyBKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUyk7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JCQotCQlJRmFjZXRlZFByb2plY3QuQWN0aW9uIGluc3RhbGwgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbihJRmFjZXRlZFByb2plY3QuQWN0aW9uLlR5cGUuSU5TVEFMTCx3ZWJGdix3ZWJNb2RlbENmZyk7Ci0JCUlGYWNldGVkUHJvamVjdC5BY3Rpb24gamF2YUluc3RhbGwgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbihJRmFjZXRlZFByb2plY3QuQWN0aW9uLlR5cGUuSU5TVEFMTCwgamF2YUZ2LCBqYXZhTW9kZWxDZmcpOwotCQlTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJc2V0LmFkZCh1bmluc3RhbGwpOwotCQlzZXQuYWRkKGluc3RhbGwpOwotCQlzZXQuYWRkKGphdmFJbnN0YWxsKTsKLQkJZmFjZXRlZFByb2plY3QubW9kaWZ5KHNldCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JV2ViUHJvamVjdFdpemFyZEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSVdlYlByb2plY3RXaXphcmRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZGUxMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JV2ViUHJvamVjdFdpemFyZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlByb2plY3RXaXphcmRJbmZvIHsKLQkvKioKLQkgKiBBZGRzIGVudHJpZXMgdG8gdGhlIGNsYXNzIHBhdGggZm9yIHRoaXMgcHJvamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvQ2xhc3NwYXRoRW50cmllcyhJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzKTsKLQotCS8qKgotCSAqIEdldCB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgQ3JlYXRpb24gZGF0ZTogKDExLzA5LzAwIDEwOjA1OjI0IEFNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRFQVJQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBuYW1lIG9mIHRoZSB3ZWIgY29udGVudCBmb2xkZXIuIElmIG5vdCBzZXQgdGhlbiByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlYkNvbnRlbnROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHdlYiBjb250ZW50IGZvbGRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkNvbnRlbnROYW1lKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIEdldCB0aGUgbmFtZSBvZiB0aGUgSmF2YSBzb3VyY2UgZm9sZGVyIElmIG5vdCBzZXQgdGhlbiByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFTb3VyY2VOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIEphdmEgc291cmNlIGZvbGRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFTb3VyY2VOYW1lKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBPYmplY3QgZm9yIHRoZSBhc3NvY2F0ZWQgcHJvcGVydGllcyBvciBudWxsCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIFNldCBhbiBPYmplY3QgZm9yIHRoZSBhc3NvY2F0ZWQgcHJvcGVydGllcyBvciBudWxsCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlKTsKLQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSVdlYlRvb2xpbmdDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSVdlYlRvb2xpbmdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1MDUzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lXZWJUb29saW5nQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi0KLQotLyoKLSAqIFRoZSBJQ29uZmlndXJhdGlvbkNvbnN0YW50cyBhcmUgdGhlIGxpc3Qgb2YgdGFncyB0aGF0IGFyZSB1c3VhYmxlIGZvciBzcGVjaWZ5aW5nIGEgd2ViCi0gKiBhcHBsaWNhdGlvbiBwYXJhbWV0ZXJzIHZpYSBYTUwKLSAqIAotICogQHNlZSBXZWJBcHBsaWNhdGlvblNwZWNpZmljYXRpb24gZm9yIHRoZSBmdWxsIERURAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlRvb2xpbmdDb25zdGFudHMgewotCi0JcHVibGljIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBTdHJpbmcgSFRUUF9QQVRIX1BSRUZJWCA9ICJodHRwOi8vIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSU5ERVhfRklMRSA9ICJpbmRleC5odG1sIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSFRUUF9QQVJBTUVURVJfU0VQQVJBVE9SID0gIj8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05URU5UX0xFTkdUSF9IRUFERVJfS0VZID0gIkNvbnRlbnQtTGVuZ3RoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFN0cmluZyBTRU5URU5DRV9URVJNSU5BVE9SID0gIi4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU3RyaW5nIFBPU1RfQ09NTUFORCA9ICJQT1NUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgR0VUX0NPTU1BTkQgPSAiR0VUIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSVdlYlRvb2xpbmdDb3JlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lXZWJUb29saW5nQ29yZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDllYWFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSVdlYlRvb2xpbmdDb3JlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLS8qKgotICogVGhlIElXZWJUb29saW5nQ29yZUNvbnN0YW50cyBhcmUgdGhlIGNvbnN0YW50cyByZXF1aXJlZCBieSB0aGUgSVRQIGNvcmUKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2ViVG9vbGluZ0NvcmVDb25zdGFudHMgewotCXB1YmxpYyBTdHJpbmcgUExVR19JTl9JRCA9ICJjb20uaWJtLmV0b29scy53ZWJ0b29scyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFBST1BfU0VSVkxFVF9KQVIgPSAiY29tLmlibS5ldG9vbHMud2VidG9vbHMuc2VydmxldGphciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFBST1BfV0VCQVNfSkFSID0gImNvbS5pYm0uZXRvb2xzLndlYnRvb2xzLndlYmFzamFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUFJPUF9DTElFTlRfTkFNRSA9ICJjb20uaWJtLmV0b29scy53ZWJ0b29scy5jbGllbnRuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUFJPUF9MSU5LX1NUWUxFID0gImNvbS5pYm0uZXRvb2xzLndlYnRvb2xzLmxpbmtzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFBST1BfTU9ESUZZX0xJTktfUFJPTVBUID0gImNvbS5pYm0uZXRvb2xzLndlYnRvb2xzLm1vZGlmeXByb21wdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFBST1BfQVVUT19NT0RJRllfTElOSyA9ICJjb20uaWJtLmV0b29scy53ZWJ0b29scy5hdXRvbW9kaWZ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSkRUX0lERU5USUZJRVIgPSAib3JnLmVjbGlwc2UuamR0LnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUlVOVElNRV9JREVOVElGSUVSID0gIldlYk5hdHVyZVJ1bnRpbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBET0NfUkVMQVRJVkUgPSAiRE9DX1JFTEFUSVZFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRE9DX1JPT1RfUkVMQVRJVkUgPSAiRE9DX1JPT1RfUkVMQVRJVkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBJQ09OX1BBVEggPSAiaWNvbnMiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9NYXN0ZXJDU1MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTWFzdGVyQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxN2MxYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9NYXN0ZXJDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotCi0KLS8qKgotICogQ29kZSBnZW5lcmF0aW9uIGNsYXNzIGNvbXBpbGVkIGZyb20gdGVtcGxhdGUgZmlsZSBNYXN0ZXJDU1MudHBsCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXN0ZXJDU1MgaW1wbGVtZW50cyBXZWJUb29saW5nVGVtcGxhdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUXzEgPSAiQk9EWVxyXG57XHJcbiAgICBCQUNLR1JPVU5ELUNPTE9SOiAjRkZFNEI1O1xyXG4gICAgQ09MT1I6IGJsYWNrO1xyXG4gICAgRk9OVC1GQU1JTFk6ICdUaW1lcyBOZXcgUm9tYW4nXHJcbn1cclxuSDFcclxue1xyXG4gICAgQ09MT1I6IG5hdnk7XHJcbiAgICBGT05ULUZBTUlMWTogJ1RpbWVzIE5ldyBSb21hbic7XHJcbiAgICBGT05ULVNJWkU6IHgtbGFyZ2U7XHJcbiAgICBGT05ULVdFSUdIVDogYm9sZGVyO1xyXG4gICAgVEVYVC1UUkFOU0ZPUk06IGNhcGl0YWxpemVcclxufVxyXG5IMlxyXG57XHJcbiAgICBDT0xPUjogbmF2eTtcclxuICAgIEZPTlQtRkFNSUxZOiAnVGltZXMgTmV3IFJvbWFuJztcclxuICAgIEZPTlQtU0laRTogbGFyZ2U7XHJcbiAgICBGT05ULVdFSUdIVDogYm9sZGVyO1xyXG4gICAgVEVYVC1UUkFOU0ZPUk06IGNhcGl0YWxpemVcclxufVxyXG5IM1xyXG57XHJcbiAgICBDT0xPUjogbmF2eTtcclxuICAgIEZPTlQtRkFNSUxZOiAnVGltZXMgTmV3IFJvbWFuJztcclxuICAgIEZPTlQtU0laRTogbGFyZ2U7XHJcbiAgICBGT05ULVdFSUdIVDogbGlnaHRlcjtcclxuICAgIFRFWFQtVFJBTlNGT1JNOiBjYXBpdGFsaXplXHJcbn0iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF8yID0gIlxyXG4iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvZGUgZ2VuZXJhdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoVGVtcGxhdGVEYXRhIGRhdGEpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoVEVYVF8xKTsKLQkJc2IuYXBwZW5kKFRFWFRfMik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1JlbGF0aW9uRGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9SZWxhdGlvbkRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNTMwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1JlbGF0aW9uRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi0KLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHN0b3JlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGZpbGVzLiBJbiBwYXJ0aWN1bGFyLCB0aGlzIGlzIGFuIGluTGluayBhbmQgdGhlCi0gKiBmaWxlcyB3aGljaCByZWZlcmVuY2UgaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbkRhdGEgewotCXB1YmxpYyBjbGFzcyBMaW5rIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQotCQlwcml2YXRlIFN0cmluZyB1cmw7Ci0JCXByaXZhdGUgaW50IG9jY3VycmVuY2VzID0gMDsKLQotCQlwdWJsaWMgTGluayhTdHJpbmcgbmV3VXJsLCBpbnQgb2NjKSB7Ci0JCQl1cmwgPSBuZXdVcmw7Ci0JCQlvY2N1cnJlbmNlcyA9IG9jYzsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIGFuIGV4YWN0IGNvcHkgb2YgdGhpcyBvYmplY3QuCi0JCSAqIAotCQkgKiBAcmV0dXJuIENyZWF0ZWQgY2xvbmUgb2JqZWN0Ci0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQkJcmV0dXJuIG5ldyBMaW5rKHVybCwgb2NjdXJyZW5jZXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIHVybCBvZiB0aGUgZmlsZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBpbkxpbmsKLQkJICogCi0JCSAqIEByZXR1cm4gU3RyaW5nCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZmlsZSByZWZlcmVuY2VzIHRoZSBpbkxpbmsKLQkJICogCi0JCSAqIEByZXR1cm4gaW50Ci0JCSAqLwotCQlwdWJsaWMgaW50IGdldE9jY3VycmVuY2VzKCkgewotCQkJcmV0dXJuIG9jY3VycmVuY2VzOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgYWRkT2NjdXJyZW5jZShpbnQgYWRkKSB7Ci0JCQlvY2N1cnJlbmNlcyA9IG9jY3VycmVuY2VzICsgYWRkOwotCQkJcmV0dXJuIG9jY3VycmVuY2VzOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQl9Ci0KLQkvLyBvdXIgcmVsYXRpb25zaGlwIHRhYmxlLiBLZXkgaXMgYSBzdHJpbmcgd2hpY2ggaXMgdGhlIHBhdGggb2YgdGhlIGluTGluaywKLQkvLyB2YWx1ZSBpcyBhIHZlY3RvciBvZiBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgaW5MaW5rLgotCXByb3RlY3RlZCBIYXNodGFibGUgaW5MaW5rc1RhYmxlID0gbnVsbDsKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGFuY2hvcnNUYWJsZSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRfSEFTSF9UQUJMRV9TSVpFID0gMTAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUX0FOQ0hPUlNfSEFTSF9UQUJMRV9TSVpFID0gMTA7Ci0JcHJpdmF0ZSBib29sZWFuIGZpbGVPayA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX1NUQVRFX0ZJTEVfTkFNRSA9ICJsaW5rX3RhYmxlX3N0YXRlcy50eHQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19TRVJWRVJDT05URVhUUk9PVF9GSUxFX05BTUUgPSAibGlua19zY3Jfc3RhdGVzLnR4dCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfTUlTU0lOR19GSUxFID0gIi0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0lOREVYX1NFUEFSQVRPUiA9ICIrIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5DSE9SX0lOREVYX1NFUEFSQVRPUiA9ICIjIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19PQ0NVUkVOQ0VfU0VQQVJBVE9SID0gIi8iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTkNIT1JfU0VQQVJBVE9SID0gIiMjIyMgQU5DSE9SUyAjIyMjIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZWxhdGlvbkRhdGEgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVsYXRpb25EYXRhKCkgewotCQlzdXBlcigpOwotCQlpbkxpbmtzVGFibGUgPSBuZXcgSGFzaHRhYmxlKElOSVRfSEFTSF9UQUJMRV9TSVpFKTsKLQkJYW5jaG9yc1RhYmxlID0gbmV3IEhhc2h0YWJsZShJTklUX0FOQ0hPUlNfSEFTSF9UQUJMRV9TSVpFKTsKLQl9Ci0KLQlwdWJsaWMgTGluayBhZGRJbkxpbmsoU3RyaW5nIGZpbGVfcGF0aCwgU3RyaW5nIHBhcmVudF9wYXRoLCBpbnQgb2NjdXJlbmNlKSB7Ci0JCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoZmlsZV9wYXRoKTsKLQkJaWYgKGluX2xpbmtzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5fbGlua3Muc2l6ZSgpOyBpKyspIHsKLQkJCUxpbmsgaW5sbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOwotCQkJU3RyaW5nIHVybCA9IGlubG5rLmdldFVSTCgpOwotCi0JCQkvLwotCQkJLy8gSW5jcmVtZW50IHRoZSBvY2N1cmVuY2UgYW5kIHJldHVybgotCQkJLy8KLQotCQkJaWYgKHVybC5jb21wYXJlVG8ocGFyZW50X3BhdGgpID09IDApIHsKLQkJCQlpbmxuay5hZGRPY2N1cnJlbmNlKG9jY3VyZW5jZSk7Ci0JCQkJcmV0dXJuIGlubG5rOwotCQkJfQotCQl9Ci0KLQkJLy8KLQkJLy8gVGhlIGxpbmsgZG9lcyBub3QgZXhpc3QsIG5lZWQgdG8gYWRkIGFuIGVudHJ5IGluIHRoZSB0YWJsZSBmb3IgaXQKLQkJLy8KLQotCQlMaW5rIGlubG5rID0gbmV3IExpbmsocGFyZW50X3BhdGgsIG9jY3VyZW5jZSk7Ci0JCWluX2xpbmtzLmFkZEVsZW1lbnQoaW5sbmspOwotCQlyZXR1cm4gaW5sbms7Ci0JfQotCi0JcHVibGljIHZvaWQgY2hhbmdlSW5MaW5rKFN0cmluZyBmaWxlUGF0aCwgYm9vbGVhbiBtaXNzaW5nKSB7Ci0KLQkJaWYgKG1pc3NpbmcpIHsKLQkJCVZlY3RvciBpbmxpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLnJlbW92ZShmaWxlUGF0aCk7Ci0JCQlpbkxpbmtzVGFibGUucHV0KExJTktfTUlTU0lOR19GSUxFICsgZmlsZVBhdGgsIGlubGlua3MpOwotCQl9IGVsc2UgewotCQkJVmVjdG9yIGlubGlua3MgPSAoVmVjdG9yKSBpbkxpbmtzVGFibGUucmVtb3ZlKExJTktfTUlTU0lOR19GSUxFICsgZmlsZVBhdGgpOwotCQkJaW5MaW5rc1RhYmxlLnB1dChmaWxlUGF0aCwgaW5saW5rcyk7Ci0JCX0KLQl9Ci0KLQotCS8qCi0JICogcmV0dXJucyB3aGljaCBwcm9qZWN0cyBkZXBlbmQgb24gdGhpcyBmaWxlIGkuZS4gYW55IHByb2plY3RzIHRoYXQgYXJlIGluIHRoaXMgZmlsZSdzIGxpc3Qgb2YKLQkgKiBpbl9saW5rcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldERlcGVuZGVudFByb2plY3RzKFN0cmluZyBmaWxlX3BhdGgpIHsKLQkJSGFzaHRhYmxlIG91dFByb2plY3RzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlWZWN0b3IgaW5fbGlua3MgPSAoVmVjdG9yKSBpbkxpbmtzVGFibGUuZ2V0KGZpbGVfcGF0aCk7Ci0KLQkJaWYgKGluX2xpbmtzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5fbGlua3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlMaW5rIGlubG5rID0gKExpbmspIGluX2xpbmtzLmVsZW1lbnRBdChpKTsKLQkJCQlTdHJpbmcgdXJsID0gaW5sbmsuZ2V0VVJMKCk7Ci0JCQkJLy8gc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mOiAvUHJvak5hbWUvLi4uLgotCQkJCWlmICh1cmwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCS8vIGtleSBjb3VsZCBiZSB0aGUgZmlsZW5hbWUgb3IgdGhlIG1pc3NpbmcgZmlsZW5hbWUgKCItIiArIGZpbGVuYW1lKQotCQkJCQkvLyB0YWtlIHRoaXMgaW50byBhY2NvdW50IGFuZCBvZmZzZXQgdGhlIGluZGV4IGFjY29yZGluZ2x5Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWludCBvZmZzZXQgPSAxOwotCQkJCQlpZiAodXJsLmNoYXJBdCgwKSA9PSAnLScpIHsKLQkJCQkJCWluZGV4ID0gdXJsLmluZGV4T2YoSVBhdGguU0VQQVJBVE9SLCAyKTsKLQkJCQkJCW9mZnNldCA9IDI7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpbmRleCA9IHVybC5pbmRleE9mKElQYXRoLlNFUEFSQVRPUiwgMSk7Ci0JCQkJCQlvZmZzZXQgPSAxOwotCQkJCQl9Ci0JCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQkJU3RyaW5nIHByb2pOYW1lID0gdXJsLnN1YnN0cmluZyhvZmZzZXQsIGluZGV4KTsKLQkJCQkJCW91dFByb2plY3RzLnB1dChwcm9qTmFtZSwgcHJvak5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBvdXRQcm9qZWN0cy52YWx1ZXMoKTsKLQl9Ci0KLQkvKgotCSAqIHJldHVybnMgd2hpY2ggY3Jvc3MtcHJvamVjdCBmaWxlcyBkZXBlbmQgb24gdGhpcyBmaWxlIGkuZS4gYW55IHByb2plY3RzIHRoYXQgYXJlIGluIHRoaXMKLQkgKiBmaWxlJ3MgbGlzdCBvZiBpbl9saW5rcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldERlcGVuZGVudFByb2plY3RGaWxlcyhTdHJpbmcgcHJvak5hbWUpIHsKLQkJSGFzaHRhYmxlIG91dFByb2plY3RzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCWZvciAoRW51bWVyYXRpb24gYWVudW0gPSBpbkxpbmtzVGFibGUua2V5cygpOyBhZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZykgYWVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCS8vIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZjogL1Byb2pOYW1lLy4uLi4KLQkJCWlmIChwYXRoLmxlbmd0aCgpID4gMCkgewotCQkJCS8vIGlmIHBhdGggaXMgYSBtaXNzaW5nIGZpbGVuYW1lICgiLSIgKyBmaWxlbmFtZSkgdGhlbiBpdCBtZWFucyB0aGF0IGl0IGhhZAotCQkJCS8vIHRvIGNvbWUgZnJvbSB0aGlzIHByb2plY3QgKHRoYXQgaXMsIHRoZSBleHRlcm5hbCBub25leGlzdGVudCBmaWxlIGNvdWxkIG5vdCBoYXZlCi0JCQkJLy8gbGlua2VkIHRvIHRoaXMgcHJvamVjdCkuIFNvLCB3ZSB3aWxsIG5vdCBhZGQgdGhpcyBwYXRoLiBBbHNvLCBzaW5jZSBpdCBpcyBtYXJrZWQKLQkJCQkvLyBicm9rZW4sIGl0IHByb2JhYmx5IHdvbid0IGV4aXN0IHRvIGRvIGFueXRoaW5nIHdpdGggaXQgYW55d2F5LgotCQkJCWlmIChwYXRoLmNoYXJBdCgwKSAhPSAnLScpIHsKLQkJCQkJaW50IGluZGV4ID0gcGF0aC5pbmRleE9mKElQYXRoLlNFUEFSQVRPUiwgMSk7Ci0JCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQkJU3RyaW5nIGN1cnJlbnRQcm9qTmFtZSA9IHBhdGguc3Vic3RyaW5nKDEsIGluZGV4KTsKLQkJCQkJCWlmICghY3VycmVudFByb2pOYW1lLmVxdWFscyhwcm9qTmFtZSkpIHsKLQkJCQkJCQlvdXRQcm9qZWN0cy5wdXQocGF0aCwgcGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG91dFByb2plY3RzLnZhbHVlcygpOwotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbkxpbmtFbnRyeShTdHJpbmcgZmlsZV9wYXRoLCBTdHJpbmcgcGFyZW50X3BhdGgsIGludCBvY2N1cmVuY2UpIHsKLQotCQlWZWN0b3IgaW5fbGlua3MgPSBuZXcgVmVjdG9yKCk7Ci0JCUxpbmsgaW5sbmsgPSBuZXcgTGluayhwYXJlbnRfcGF0aCwgb2NjdXJlbmNlKTsKLQkJaW5fbGlua3MuYWRkRWxlbWVudChpbmxuayk7Ci0JCWluTGlua3NUYWJsZS5wdXQoZmlsZV9wYXRoLCBpbl9saW5rcyk7Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIGR1bXAoKSB7Ci0JCWlmIChmYWxzZSkgewotCQkJaWYgKGluTGlua3NUYWJsZSAhPSBudWxsKSB7Ci0JCQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7IGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCQlTdHJpbmdCdWZmZXIgU3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJCQlTdC5hcHBlbmQoIlxuS2V5PSIgKyBrZXkgKyAiXG4iKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCQlWZWN0b3IgaW5fbGlua3MgPSAoVmVjdG9yKSBpbkxpbmtzVGFibGUuZ2V0KGtleSk7Ci0JCQkJCWludCBuYl9vZl9saW5rcyA9IGluX2xpbmtzLnNpemUoKTsKLQotCQkJCQkvLyBSZXBsYWNlIHRoZSBzdHJpbmcgYnkgaW5kZXgKLQkJCQkJLy8gQWRkIGEgJysnc2VwYXJhdG9yIG9ubHkgZm9yIG1vcmUgdGhhbiBvbmUgbGlua3MgdG8gc2F2ZSBzcGFjZQotCQkJCQkvLwotCi0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYl9vZl9saW5rczsgaSsrKSB7Ci0JCQkJCQlMaW5rIGxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSk7Ci0JCQkJCQlTdC5hcHBlbmQoIlx0VmFsdWU9IiArIGxuay5nZXRVUkwoKSArICJbIiArIGxuay5nZXRPY2N1cnJlbmNlcygpICsgIl0iKTsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0luZm8oU3QudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZHVtcChib29sZWFuIGR1bXApIHsKLQkJaWYgKGR1bXApIHsKLQkJCWlmIChpbkxpbmtzVGFibGUgIT0gbnVsbCkgewotCQkJCWZvciAoRW51bWVyYXRpb24gYWVudW0gPSBpbkxpbmtzVGFibGUua2V5cygpOyBhZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQkJU3RyaW5nQnVmZmVyIFN0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgYWVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCQkJU3QuYXBwZW5kKCJcbktleT0iICsga2V5ICsgIlxuIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChrZXkpOwotCQkJCQlpbnQgbmJfb2ZfbGlua3MgPSBpbl9saW5rcy5zaXplKCk7Ci0KLQkJCQkJLy8gUmVwbGFjZSB0aGUgc3RyaW5nIGJ5IGluZGV4Ci0JCQkJCS8vIEFkZCBhICcrJ3NlcGFyYXRvciBvbmx5IGZvciBtb3JlIHRoYW4gb25lIGxpbmtzIHRvIHNhdmUgc3BhY2UKLQkJCQkJLy8KLQotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmJfb2ZfbGlua3M7IGkrKykgewotCQkJCQkJTGluayBsbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOwotCQkJCQkJU3QuYXBwZW5kKCJcdFZhbHVlPSIgKyBsbmsuZ2V0VVJMKCkgKyAiWyIgKyBsbmsuZ2V0T2NjdXJyZW5jZXMoKSArICJdIik7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihTdC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB1c2VkIGZvciBMaW5rc0J1aWxkZXIgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHZvaWQgZHVtcDIoKSB7Ci0JCWlmIChpbkxpbmtzVGFibGUgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7IGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCVN0cmluZ0J1ZmZlciBTdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgYWVudW0ubmV4dEVsZW1lbnQoKTsKLQotCQkJCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoa2V5KTsKLQkJCQlpbnQgbmJfb2ZfbGlua3MgPSBpbl9saW5rcy5zaXplKCk7Ci0JCQkJU3QuYXBwZW5kKCJcbktleT0iICsga2V5ICsgIiAtLSBudW06IiArIG5iX29mX2xpbmtzICsgIlxuIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS8vIFJlcGxhY2UgdGhlIHN0cmluZyBieSBpbmRleAotCQkJCS8vIEFkZCBhICcrJ3NlcGFyYXRvciBvbmx5IGZvciBtb3JlIHRoYW4gb25lIGxpbmtzIHRvIHNhdmUgc3BhY2UKLQkJCQkvLwotCi0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5iX29mX2xpbmtzOyBpKyspIHsKLQkJCQkJTGluayBsbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOwotCQkJCQlTdC5hcHBlbmQoIlx0VmFsdWU9IiArIGxuay5nZXRVUkwoKSArICJbIiArIGxuay5nZXRPY2N1cnJlbmNlcygpICsgIl0iKTsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKFN0LnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgVmVjdG9yIGdldEluTGlua3MoU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCXJldHVybiAoVmVjdG9yKSBpbkxpbmtzVGFibGUuZ2V0KGZpbGVQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRJbkxpbmtzKFN0cmluZyBmaWxlUGF0aCwgVmVjdG9yIHZlY3RJbkxpbmtzKSB7Ci0KLQkJaWYgKGluTGlua3NUYWJsZSAhPSBudWxsKSB7Ci0JCQlkdW1wKCk7Ci0JCQlWZWN0b3IgaW5fbGlua3MgPSAoVmVjdG9yKSBpbkxpbmtzVGFibGUuZ2V0KGZpbGVQYXRoKTsKLQkJCWlmIChpbl9saW5rcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbl9saW5rcy5zaXplKCk7IGkrKykgewotCQkJCQlMaW5rIGlubG5rID0gKExpbmspICgoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpKS5jbG9uZSgpOwotCQkJCQl2ZWN0SW5MaW5rcy5hZGRFbGVtZW50KGlubG5rKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSGFzaHRhYmxlIGdldEFuY2hvcnNUYWJsZSgpIHsKLQkJcmV0dXJuIGFuY2hvcnNUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIHVzZWQgdG8gc3RvcmUgU2VydmVyQ29udGV4dFJvb3QgZm9yIHRoZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRQcmV2aW91c1NDUkZpbGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IFBhdGgoSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArIHByb2plY3QuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBMSU5LX1NFUlZFUkNPTlRFWFRST09UX0ZJTEVfTkFNRSkudG9GaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSB1c2VkIHRvIHN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgbGluayByZWxhdGlvbnMgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5pby5GaWxlIFRoZSBzdGF0ZSBmaWxlCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IFRoZSBwcm9qZWN0IHRvIGdldCB0aGUgc3RhdGUgZmlsZSBmb3IuCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldFN0YXRlRmlsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgUGF0aChKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgcHJvamVjdC5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIExJTktfU1RBVEVfRklMRV9OQU1FKS50b0ZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJbkxpbmtFbnRyeShTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gaW5MaW5rc1RhYmxlLmNvbnRhaW5zS2V5KHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJ1biB0aHJvdWdoIGFsbCBtaXNzaW5nLWZpbGUgKC0pIFJEIGVudHJpZXMgdG8gc2VlIGlmIGFueSBvZiB0aGVtIGNsb3NlbHkgbWF0Y2ggdGhlIHBhdGggdG8KLQkgKiB0aGlzIGNsYXNzLiBSZXR1cm4gYWxsIG9mIHRoZSBtYXRjaGVzLgotCSAqLwotCXB1YmxpYyBWZWN0b3IgZ2V0UG9zc2libGVNaXNzaW5nRW5kaW5nTWF0Y2hlcyhJUGF0aCBjbGFzc1BhdGgpIHsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJU3RyaW5nIG1hdGNoID0gY2xhc3NQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCW1hdGNoID0gbWF0Y2guc3Vic3RyaW5nKDAsIG1hdGNoLmxlbmd0aCgpIC0gNik7IC8vIGxlbmd0aCBtaW51cyAiLmNsYXNzIgotCi0JCVN0cmluZyBjbGFzc1BhdGhTdHIgPSBjbGFzc1BhdGgudG9TdHJpbmcoKTsKLQkJU3RyaW5nIG1hdGNoaW5nQ2xhc3NQYXRoID0gY2xhc3NQYXRoU3RyLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsIGNsYXNzUGF0aFN0ci5sZW5ndGgoKSAtIDYpOwotCi0JCWZvciAoRW51bWVyYXRpb24gYWVudW0gPSBpbkxpbmtzVGFibGUua2V5cygpOyBhZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZykgYWVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCS8vIGNoZWNrIGlmIHBhdGggZW5kcyB3aXRoIHRoZSBjbGFzcyBuYW1lIHRoYXQgaGFzIGJlZW4gYWRkZWQvcmVtb3ZlZAotCQkJaWYgKHBhdGguc3RhcnRzV2l0aChMSU5LX01JU1NJTkdfRklMRSkgJiYgcGF0aC5lbmRzV2l0aChtYXRjaCkpIHsKLQkJCQkvLyBPSzogc2ltcGxlIG1hdGNoIGZvdW5kOyBub3cgbGV0J3MgbWF0Y2ggd2l0aCBmaW5lciBncmFudWxhcml0eS4KLQkJCQkvLyBUYWtlIHBhdGggYW5kIHB1dCBpdCBpbnRvIGEgZm9ybSB3aGVyZSB3ZSBjYW4gY2hlY2sgaWYgaXQgaXMgYQotCQkJCS8vIGNsb3NlIG1hdGNoIHRvIHRoZSBjbGFzcyB0aGF0IGhhcyBjaGFuZ2VkOgotCQkJCS8vIC9Qcm9qL1dlYiBDb250ZW50L2NvbS5hY21lLkZvbyAtLT4gY29tL2FjbWUvRm9vCi0JCQkJU3RyaW5nIGxpbmtQYXRoOwotCQkJCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoSVBhdGguU0VQQVJBVE9SKTsKLQkJCQlpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggPCBwYXRoLmxlbmd0aCgpIC0gMSkgewotCQkJCQlsaW5rUGF0aCA9IHBhdGguc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGlua1BhdGggPSBwYXRoOwotCQkJCX0KLQkJCQlTdHJpbmcgY2xvc2VNYXRjaCA9IGxpbmtQYXRoLnJlcGxhY2UoJy4nLCBJUGF0aC5TRVBBUkFUT1IpOwotCi0JCQkJaWYgKG1hdGNoaW5nQ2xhc3NQYXRoLmVuZHNXaXRoKGNsb3NlTWF0Y2gpKSB7Ci0JCQkJCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQocGF0aCk7Ci0JCQkJCVN0cmluZyBub25NaXNzaW5nUGF0aCA9IHBhdGguc3Vic3RyaW5nKDEsIHBhdGgubGVuZ3RoKCkpOwotCQkJCQljaGFuZ2VJbkxpbmsobm9uTWlzc2luZ1BhdGgsIGZhbHNlKTsKLQkJCQkJaWYgKGluX2xpbmtzICE9IG51bGwpIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5fbGlua3Muc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlMaW5rIGlubG5rID0gKExpbmspIGluX2xpbmtzLmVsZW1lbnRBdChpKTsKLQkJCQkJCQlTdHJpbmcgdXJsID0gaW5sbmsuZ2V0VVJMKCk7Ci0JCQkJCQkJdi5hZGQodXJsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQotCS8qKgotCSAqIFJ1biB0aHJvdWdoIGFsbCBleGlzdGluZyBSRCBlbnRyaWVzIHRvIHNlZSBpZiBhbnkgb2YgdGhlbSBjbG9zZWx5IG1hdGNoIHRoZSBwYXRoIHRvIHRoaXMKLQkgKiBjbGFzcy4gUmV0dXJuIGFsbCBvZiB0aGUgbWF0Y2hlcy4KLQkgKi8KLQlwdWJsaWMgVmVjdG9yIGdldFBvc3NpYmxlRXhpc3RpbmdFbmRpbmdNYXRjaGVzKElQYXRoIGNsYXNzUGF0aCkgewotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQotCQlTdHJpbmcgbWF0Y2ggPSBjbGFzc1BhdGgubGFzdFNlZ21lbnQoKTsKLQkJbWF0Y2ggPSBtYXRjaC5zdWJzdHJpbmcoMCwgbWF0Y2gubGVuZ3RoKCkgLSA2KTsgLy8gbGVuZ3RoIG1pbnVzICIuY2xhc3MiCi0KLQkJU3RyaW5nIGNsYXNzUGF0aFN0ciA9IGNsYXNzUGF0aC50b1N0cmluZygpOwotCQlTdHJpbmcgbWF0Y2hpbmdDbGFzc1BhdGggPSBjbGFzc1BhdGhTdHIudG9TdHJpbmcoKS5zdWJzdHJpbmcoMCwgY2xhc3NQYXRoU3RyLmxlbmd0aCgpIC0gNik7Ci0KLQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7IGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJLy8gY2hlY2sgaWYgcGF0aCBlbmRzIHdpdGggdGhlIGNsYXNzIG5hbWUgdGhhdCBoYXMgYmVlbiBhZGRlZC9yZW1vdmVkCi0JCQlpZiAocGF0aC5lbmRzV2l0aChtYXRjaCkgJiYgIXBhdGguc3RhcnRzV2l0aChMSU5LX01JU1NJTkdfRklMRSkpIHsKLQkJCQkvLyBPSzogc2ltcGxlIG1hdGNoIGZvdW5kOyBub3cgbGV0J3MgbWF0Y2ggd2l0aCBmaW5lciBncmFudWxhcml0eS4KLQkJCQkvLyBUYWtlIHBhdGggYW5kIHB1dCBpdCBpbnRvIGEgZm9ybSB3aGVyZSB3ZSBjYW4gY2hlY2sgaWYgaXQgaXMgYQotCQkJCS8vIGNsb3NlIG1hdGNoIHRvIHRoZSBjbGFzcyB0aGF0IGhhcyBjaGFuZ2VkOgotCQkJCS8vIC9Qcm9qL1dlYiBDb250ZW50L2NvbS5hY21lLkZvbyAtLT4gY29tL2FjbWUvRm9vCi0JCQkJU3RyaW5nIGxpbmtQYXRoOwotCQkJCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoSVBhdGguU0VQQVJBVE9SKTsKLQkJCQlpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggPCBwYXRoLmxlbmd0aCgpIC0gMSkgewotCQkJCQlsaW5rUGF0aCA9IHBhdGguc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGlua1BhdGggPSBwYXRoOwotCQkJCX0KLQkJCQlTdHJpbmcgY2xvc2VNYXRjaCA9IGxpbmtQYXRoLnJlcGxhY2UoJy4nLCBJUGF0aC5TRVBBUkFUT1IpOwotCi0JCQkJaWYgKG1hdGNoaW5nQ2xhc3NQYXRoLmVuZHNXaXRoKGNsb3NlTWF0Y2gpKSB7Ci0JCQkJCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQocGF0aCk7Ci0JCQkJCWNoYW5nZUluTGluayhwYXRoLCB0cnVlKTsKLQkJCQkJaWYgKGluX2xpbmtzICE9IG51bGwpIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5fbGlua3Muc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlMaW5rIGlubG5rID0gKExpbmspIGluX2xpbmtzLmVsZW1lbnRBdChpKTsKLQkJCQkJCQlTdHJpbmcgdXJsID0gaW5sbmsuZ2V0VVJMKCk7Ci0JCQkJCQkJdi5hZGQodXJsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gdGhyb3VnaCBhbGwgZXhpc3RpbmcgUkQgZW50cmllcyB0byBzZWUgaWYgYW55IG9mIHRoZW0gY2xvc2VseSBtYXRjaCB0aGUgcGF0aCB0byB0aGlzCi0JICogY2xhc3MuIFJlbW92ZSB0aGUgaW5saW5rcyBmb3IgYWxsIHRoZSBtYXRjaGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUluTGlua3NQb3NzaWJsZUV4aXN0aW5nRW5kaW5nTWF0Y2hlcyhJUGF0aCBjbGFzc1BhdGgpIHsKLQkJU3RyaW5nIG1hdGNoID0gY2xhc3NQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCW1hdGNoID0gbWF0Y2guc3Vic3RyaW5nKDAsIG1hdGNoLmxlbmd0aCgpIC0gNik7IC8vIGxlbmd0aCBtaW51cyAiLmNsYXNzIgotCi0JCVN0cmluZyBjbGFzc1BhdGhTdHIgPSBjbGFzc1BhdGgudG9TdHJpbmcoKTsKLQkJU3RyaW5nIG1hdGNoaW5nQ2xhc3NQYXRoID0gY2xhc3NQYXRoU3RyLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsIGNsYXNzUGF0aFN0ci5sZW5ndGgoKSAtIDYpOwotCi0JCWZvciAoRW51bWVyYXRpb24gYWVudW0gPSBpbkxpbmtzVGFibGUua2V5cygpOyBhZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZykgYWVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChwYXRoLmVuZHNXaXRoKG1hdGNoKSAmJiAhcGF0aC5zdGFydHNXaXRoKExJTktfTUlTU0lOR19GSUxFKSkgewotCQkJCS8vIE9LOiBzaW1wbGUgbWF0Y2ggZm91bmQ7IG5vdyBsZXQncyBtYXRjaCB3aXRoIGZpbmVyIGdyYW51bGFyaXR5LgotCQkJCS8vIFRha2UgcGF0aCBhbmQgcHV0IGl0IGludG8gYSBmb3JtIHdoZXJlIHdlIGNhbiBjaGVjayBpZiBpdCBpcyBhCi0JCQkJLy8gY2xvc2UgbWF0Y2ggdG8gdGhlIGNsYXNzIHRoYXQgaGFzIGNoYW5nZWQ6Ci0JCQkJLy8gL1Byb2ovV2ViIENvbnRlbnQvY29tLmFjbWUuRm9vIC0tPiBjb20vYWNtZS9Gb28KLQkJCQlTdHJpbmcgbGlua1BhdGg7Ci0JCQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihJUGF0aC5TRVBBUkFUT1IpOwotCQkJCWlmIChpbmRleCAhPSAtMSAmJiBpbmRleCA8IHBhdGgubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJCWxpbmtQYXRoID0gcGF0aC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsaW5rUGF0aCA9IHBhdGg7Ci0JCQkJfQotCQkJCVN0cmluZyBjbG9zZU1hdGNoID0gbGlua1BhdGgucmVwbGFjZSgnLicsIElQYXRoLlNFUEFSQVRPUik7Ci0KLQkJCQlpZiAobWF0Y2hpbmdDbGFzc1BhdGguZW5kc1dpdGgoY2xvc2VNYXRjaCkpIHsKLQkJCQkJcmVtb3ZlSW5MaW5rcyhwYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGxpbmtzIHRhYmxlcwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWluTGlua3NUYWJsZSA9IG5ldyBIYXNodGFibGUoSU5JVF9IQVNIX1RBQkxFX1NJWkUpOwotCQlhbmNob3JzVGFibGUgPSBuZXcgSGFzaHRhYmxlKElOSVRfQU5DSE9SU19IQVNIX1RBQkxFX1NJWkUpOwotCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBsaW5rcyB0YWJsZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQW5jaG9ycygpIHsKLQkJYW5jaG9yc1RhYmxlID0gbmV3IEhhc2h0YWJsZShJTklUX0FOQ0hPUlNfSEFTSF9UQUJMRV9TSVpFKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGxpbmtzIHRhYmxlcwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVJbkxpbmtzKCkgewotCQlpbkxpbmtzVGFibGUgPSBuZXcgSGFzaHRhYmxlKElOSVRfSEFTSF9UQUJMRV9TSVpFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB0byByZXN0b3JlIGRhdGEgZnJvbSBleGlzdGVkIGFuZCB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaWxlT2soKSB7Ci0JCXJldHVybiBmaWxlT2s7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLQkJcmV0dXJuIChpbkxpbmtzVGFibGUgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3SW5MaW5rRW50cnkoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKCFpbkxpbmtzVGFibGUuY29udGFpbnNLZXkocGF0aCkpCi0JCQlpbkxpbmtzVGFibGUucHV0KHBhdGgsIG5ldyBWZWN0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSW5MaW5rcyhTdHJpbmcgZmlsZV9wYXRoKSB7Ci0KLQkJLy8KLQkJLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBmTGlua3NUYWJsZSB0byByZW1vdmUgYWxsIGluLWxpbmtzIHJlZmVyZW5jZXMKLQkJLy8gZm9yIGZpbGVfcGF0aAotCQkvLwotCi0JCWZvciAoRW51bWVyYXRpb24gYWVudW0gPSBpbkxpbmtzVGFibGUua2V5cygpOyBhZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChrZXkpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluX2xpbmtzLnNpemUoKTsgaSsrKSB7Ci0KLQkJCQlMaW5rIGlubG5rID0gKExpbmspIGluX2xpbmtzLmVsZW1lbnRBdChpKTsKLQkJCQlTdHJpbmcgdXJsID0gaW5sbmsuZ2V0VVJMKCk7Ci0KLQkJCQlpZiAodXJsLmNvbXBhcmVUbyhmaWxlX3BhdGgpID09IDApIHsKLQkJCQkJaW5fbGlua3MucmVtb3ZlRWxlbWVudEF0KGkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvLwotCQkJCS8vIFJlbW92ZSB0aGUgZW50cnkgaW4gdGhlIGZMaW5rc1RhYmxlIGlmIHRoZSBpbi1saW5rCi0JCQkJLy8gb2YgdGhlIGZpbGUgaXMgbm90IGluIHRoZSB3b3JrYmVuY2ggYW5kIGFuIG9ycGhhbiBsaW5rCi0JCQkJLy8gb3RoZXJ3aXNlIHVwZGF0ZSB0aGUgaW4tbGlua3MgZkxpbmtzVGFibGUKLQkJCQkvLwotCQkJfQotCi0JCQlpZiAoaW5fbGlua3MuaXNFbXB0eSgpICYmIGtleS5zdGFydHNXaXRoKExJTktfTUlTU0lOR19GSUxFKSkgewotCQkJCWluTGlua3NUYWJsZS5yZW1vdmUoa2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZkxpbmtzVGFibGUgdG8gcmV0dXJuIGFsbCBvdXQtbGlua3MgcmVmZXJlbmNlcyBmb3IgZmlsZV9wYXRoCi0JICogCi0JICogQHBhcmFtIGZpbGVfcGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRPdXRMaW5rcyhTdHJpbmcgZmlsZV9wYXRoKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEVudW1lcmF0aW9uIGFlbnVtID0gaW5MaW5rc1RhYmxlLmtleXMoKTsgYWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgYWVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoa2V5KTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbl9saW5rcy5zaXplKCk7IGkrKykgewotCi0JCQkJTGluayBpbmxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSk7Ci0JCQkJU3RyaW5nIHVybCA9IGlubG5rLmdldFVSTCgpOwotCi0JCQkJaWYgKHVybC5jb21wYXJlVG8oZmlsZV9wYXRoKSA9PSAwKSB7Ci0JCQkJCWxpc3QuYWRkKGtleSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JLyoqCi0JICogcmV0dXJuIHdoZXRoZXIgb3RoZXIgcmVzb3VyY2VzIGxpbmsgdG8gdGhpcyBmaWxlIG9yIG5vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRCeU90aGVyTGlua3MoU3RyaW5nIGZpbGVfcGF0aCkgewotCi0JCS8vCi0JCS8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZkxpbmtzVGFibGUgdG8gcmVtb3ZlIGFsbCBpbi1saW5rcyByZWZlcmVuY2VzCi0JCS8vIGZvciBmaWxlX3BhdGgKLQkJLy8KLQkJYm9vbGVhbiByZWZlcmVuY2VkID0gZmFsc2U7Ci0JCWZvciAoRW51bWVyYXRpb24gYWVudW0gPSBpbkxpbmtzVGFibGUua2V5cygpOyAhcmVmZXJlbmNlZCAmJiBhZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChrZXkpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluX2xpbmtzLnNpemUoKTsgaSsrKSB7Ci0JCQkJTGluayBpbmxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSk7Ci0JCQkJU3RyaW5nIHVybCA9IGlubG5rLmdldFVSTCgpOwotCi0JCQkJaWYgKHVybC5jb21wYXJlVG8oZmlsZV9wYXRoKSA9PSAwKSB7Ci0JCQkJCXJlZmVyZW5jZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0JfQotCi0KLQkvKgotCSAqIHBlcmZvcm1zIGFzIHJlbW92ZUluTGlua3MoIFN0cmluZyApIC4uLiBCdXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoaXMgYWxzbyBhZGRpdGlvbmFsbHkKLQkgKiByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHByb2plY3RzIHRoYXQgdGhpcyBmaWxlIGlzIGRlcGVuZGVudCB1cG9uLiBUaGlzIGlzIHVzZWZ1bCB0byBnZXQKLQkgKiB0aGlzIGluZm9ybWF0aW9uLCBhbmQgdGhlbiBnbyB0byBhbGwgb2YgdGhvc2UgcHJvamVjdHMnIHJlbGF0aW9uIGRhdGEgYW5kIHRlbGwgdGhlbSB0bwotCSAqIHJlbW92ZUluTGlua3MgZm9yIHRoaXMgZmlsZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiByZW1vdmVJbkxpbmtzRm9yUHJvamVjdHMoU3RyaW5nIGZpbGVfcGF0aCkgewotCi0JCS8vCi0JCS8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZkxpbmtzVGFibGUgdG8gcmVtb3ZlIGFsbCBpbi1saW5rcyByZWZlcmVuY2VzCi0JCS8vIGZvciBmaWxlX3BhdGgKLQkJLy8KLQkJSGFzaHRhYmxlIHByb2plY3RzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlmb3IgKEVudW1lcmF0aW9uIGFlbnVtID0gaW5MaW5rc1RhYmxlLmtleXMoKTsgYWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgYWVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoa2V5KTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbl9saW5rcy5zaXplKCk7IGkrKykgewotCi0JCQkJTGluayBpbmxuayA9IChMaW5rKSBpbl9saW5rcy5lbGVtZW50QXQoaSk7Ci0JCQkJU3RyaW5nIHVybCA9IGlubG5rLmdldFVSTCgpOwotCi0JCQkJaWYgKHVybC5jb21wYXJlVG8oZmlsZV9wYXRoKSA9PSAwKSB7Ci0JCQkJCS8vIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZjogL1Byb2pOYW1lLy4uLi4KLQkJCQkJaWYgKGtleS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCS8vIGtleSBjb3VsZCBiZSB0aGUgZmlsZW5hbWUgb3IgdGhlIG1pc3NpbmcgZmlsZW5hbWUgKCItIiArIGZpbGVuYW1lKQotCQkJCQkJLy8gdGFrZSB0aGlzIGludG8gYWNjb3VudCBhbmQgb2Zmc2V0IHRoZSBpbmRleCBhY2NvcmRpbmdseQotCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCWludCBvZmZzZXQgPSAxOwotCQkJCQkJaWYgKGtleS5jaGFyQXQoMCkgPT0gJy0nKSB7Ci0JCQkJCQkJaW5kZXggPSBrZXkuaW5kZXhPZihJUGF0aC5TRVBBUkFUT1IsIDIpOwotCQkJCQkJCW9mZnNldCA9IDI7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWluZGV4ID0ga2V5LmluZGV4T2YoSVBhdGguU0VQQVJBVE9SLCAxKTsKLQkJCQkJCQlvZmZzZXQgPSAxOwotCQkJCQkJfQotCQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJU3RyaW5nIHByb2pOYW1lID0ga2V5LnN1YnN0cmluZyhvZmZzZXQsIGluZGV4KTsKLQkJCQkJCQlwcm9qZWN0cy5wdXQocHJvak5hbWUsIHByb2pOYW1lKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpbl9saW5rcy5yZW1vdmVFbGVtZW50QXQoaSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8vCi0JCQkJLy8gUmVtb3ZlIHRoZSBlbnRyeSBpbiB0aGUgZkxpbmtzVGFibGUgaWYgdGhlIGluLWxpbmsKLQkJCQkvLyBvZiB0aGUgZmlsZSBpcyBub3QgaW4gdGhlIHdvcmtiZW5jaCBhbmQgYW4gb3JwaGFuIGxpbmsKLQkJCQkvLyBvdGhlcndpc2UgdXBkYXRlIHRoZSBpbi1saW5rcyBmTGlua3NUYWJsZQotCQkJCS8vCi0JCQl9Ci0KLQkJCWlmIChpbl9saW5rcy5pc0VtcHR5KCkgJiYga2V5LnN0YXJ0c1dpdGgoTElOS19NSVNTSU5HX0ZJTEUpKQotCQkJCWluTGlua3NUYWJsZS5yZW1vdmUoa2V5KTsKLQkJfQotCi0JCXJldHVybiBwcm9qZWN0cy52YWx1ZXMoKTsKLQl9Ci0KLQotCi0JLyoqCi0JICogcGVyZm9ybXMgYXMgcmVtb3ZlSW5MaW5rcyggU3RyaW5nICkgLi4uIEJ1dCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgaXQgYWRkaXRpb25hbGx5IHJldHVybnMKLQkgKiB3aGljaCBwcm9qZWN0cyBkZXBlbmQgb24gdGhpcyBmaWxlLiBpLmUuIGFueSBwcm9qZWN0cyB0aGF0IGFyZSBpbiB0aGlzIGZpbGUncyBsaXN0IG9mCi0JICogaW5fbGlua3MKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiByZW1vdmVJbkxpbmtzQW5kR2V0RGVwZW5kZW50UHJvamVjdHMoU3RyaW5nIGZpbGVfcGF0aCkgewotCQkvLwotCQkvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGZMaW5rc1RhYmxlIHRvIHJlbW92ZSBhbGwgaW4tbGlua3MgcmVmZXJlbmNlcwotCQkvLyBmb3IgZmlsZV9wYXRoCi0JCS8vCi0JCUhhc2h0YWJsZSBwcm9qZWN0cyA9IG5ldyBIYXNodGFibGUoKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7IGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQlWZWN0b3IgaW5fbGlua3MgPSAoVmVjdG9yKSBpbkxpbmtzVGFibGUuZ2V0KGtleSk7Ci0KLQkJCWlmIChrZXkuZXF1YWxzKFJlbGF0aW9uRGF0YS5MSU5LX01JU1NJTkdfRklMRSArIGZpbGVfcGF0aCkpIHsKLQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluX2xpbmtzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUxpbmsgaW5sbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOwotCQkJCQlTdHJpbmcgdXJsID0gaW5sbmsuZ2V0VVJMKCk7Ci0KLQkJCQkJaWYgKHVybC5jb21wYXJlVG8oZmlsZV9wYXRoKSA9PSAwKSB7Ci0JCQkJCQlpbmRleCA9IGk7Ci0JCQkJCX0KLQkJCQkJaWYgKHVybC5sZW5ndGgoKSA+IDEpIHsKLQkJCQkJCWludCBwcm9qaW5kZXggPSB1cmwuaW5kZXhPZihJUGF0aC5TRVBBUkFUT1IsIDEpOwotCQkJCQkJaWYgKHByb2ppbmRleCAhPSAtMSkgewotCQkJCQkJCVN0cmluZyBwcm9qTmFtZSA9IHVybC5zdWJzdHJpbmcoMSwgcHJvamluZGV4KTsKLQkJCQkJCQlwcm9qZWN0cy5wdXQocHJvak5hbWUsIHByb2pOYW1lKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJaW5fbGlua3MucmVtb3ZlRWxlbWVudEF0KGluZGV4KTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbl9saW5rcy5zaXplKCk7IGkrKykgewotCi0JCQkJCUxpbmsgaW5sbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOwotCQkJCQlTdHJpbmcgdXJsID0gaW5sbmsuZ2V0VVJMKCk7Ci0KLQkJCQkJaWYgKHVybC5jb21wYXJlVG8oZmlsZV9wYXRoKSA9PSAwKSB7Ci0KLQkJCQkJCWluX2xpbmtzLnJlbW92ZUVsZW1lbnRBdChpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJLy8KLQkJCQkJLy8gUmVtb3ZlIHRoZSBlbnRyeSBpbiB0aGUgZkxpbmtzVGFibGUgaWYgdGhlIGluLWxpbmsKLQkJCQkJLy8gb2YgdGhlIGZpbGUgaXMgbm90IGluIHRoZSB3b3JrYmVuY2ggYW5kIGFuIG9ycGhhbiBsaW5rCi0JCQkJCS8vIG90aGVyd2lzZSB1cGRhdGUgdGhlIGluLWxpbmtzIGZMaW5rc1RhYmxlCi0JCQkJCS8vCi0JCQkJfQotCQkJfQotCi0JCQlpZiAoaW5fbGlua3MuaXNFbXB0eSgpICYmIGtleS5zdGFydHNXaXRoKExJTktfTUlTU0lOR19GSUxFKSkgewotCQkJCWluTGlua3NUYWJsZS5yZW1vdmUoa2V5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdHMudmFsdWVzKCk7Ci0JfQotCi0KLQkvKioKLQkgKiByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gYSBzcGVjaWZpYyBpbkxpbmsuIFdoZW4gcmVtb3ZlT3JwaGFuIGlzIHRydWUgdGhlIGluTGluayBlbnRyeSBpcwotCSAqIHJlbW92ZWQgYXMgd2VsbCwgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSByZWZlcmVjZXMgdG8gaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVJbkxpbmtzKFN0cmluZyBpbkxpbmtFbnRyeSwgU3RyaW5nIGluTGlua1JlZmVyZW5jZSwgYm9vbGVhbiByZW1vdmVPcnBoYW4pIHsKLQotCQlTdHJpbmcga2V5ID0gaW5MaW5rRW50cnk7Ci0JCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoa2V5KTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGluX2xpbmtzLnNpemUoKTsgaSsrKSB7Ci0KLQkJCUxpbmsgaW5sbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOwotCQkJU3RyaW5nIHVybCA9IGlubG5rLmdldFVSTCgpOwotCi0JCQlpZiAodXJsLmNvbXBhcmVUbyhpbkxpbmtSZWZlcmVuY2UpID09IDApIHsKLQkJCQlpbl9saW5rcy5yZW1vdmVFbGVtZW50QXQoaSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLyBJZiB0aGVyZSBhcmUgbm8gbW9yZSByZWZlcmVuY2VzIHRvIHRoZSBpbkxpbmtFbnRyeQotCQkvLyBhbmQgdGhlIGNhbGxlciB3YW50cyB0aGlzIG9ycGhhbiBkZWxldGVkIHRoZW4KLQkJLy8gcmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgdGFibGUKLQkJaWYgKGluX2xpbmtzLmlzRW1wdHkoKSAmJiByZW1vdmVPcnBoYW4pCi0JCQlpbkxpbmtzVGFibGUucmVtb3ZlKGtleSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGlzIGJ1aWxkZXIncyBzYXZlZCBzdGF0ZSBhbmQgcmV0dXJucyB3aGV0aGVyIGl0IHdhcyBzdWNjZXNzZnVsIGluIGRvaW5nIHNvLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlc3RvcmUoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgdGhlIHN0YXRlCi0JCQlGaWxlIHN0YXRlRmlsZSA9IGdldFN0YXRlRmlsZShwcm9qZWN0KTsKLQkJCWlmIChzdGF0ZUZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpbkxpbmtzVGFibGUgPSBuZXcgSGFzaHRhYmxlKElOSVRfSEFTSF9UQUJMRV9TSVpFKTsKLQotCQkJCS8vIHJlYWQgaW5MaW5rc1RhYmxlIGZyb20gc3RhdGVGaWxlCi0JCQkJVmVjdG9yIGtleXMgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJVmVjdG9yIGluZGljZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoc3RhdGVGaWxlKSk7Ci0KLQkJCQkJU3RyaW5nIGxpbmUgPSBudWxsOwotCQkJCQkvLwkJCQl3aGlsZSggKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpICYmICFsaW5lLnN0YXJ0c1dpdGgoCi0JCQkJCS8vIEFOQ0hPUl9TRVBBUkFUT1IgKSApCi0JCQkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgYnVmZmVyID0gbGluZTsKLQotCi0JCQkJCQkvLyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgcG9zc2liaWxpdHkgb2YgbGlua3Mgc3Bhbm5pbmcgbXVsdGlwbGUgbGluZXMsCi0JCQkJCQkvLyBrZWVwIHJlYWRpbmcgdW50aWwgd2UgZmluZCBhIGxpbmUgdGhhdCBzdGFydHMgd2l0aCBhbiBpZGljYXRvcgotCQkJCQkJLy8gdGhhdCB0aGUgbGluayBpcyBmaW5pc2hlZCAoYSBsaW5lIGJlZ2lubmluZyB3LyBMSU5LX0lOREVYX1NFUEFSQVRPUikKLQkJCQkJCWxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJCXdoaWxlIChsaW5lICE9IG51bGwgJiYgIWxpbmUuc3RhcnRzV2l0aChMSU5LX0lOREVYX1NFUEFSQVRPUikpIHsKLQkJCQkJCQlidWZmZXIgPSBidWZmZXIgKyBsaW5lOwotCQkJCQkJCWxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGFkZCBsaW5rIHN0cmluZyAoL015UHJvai9maWxlLmh0bWwpCi0JCQkJCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCQkJCQlrZXlzLmFkZEVsZW1lbnQoYnVmZmVyKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGFkZCByZWZlcmVuY2VzIGxpbmUgKCsyLzMuLi4pCi0JCQkJCQlpZiAobGluZSAhPSBudWxsKSB7Ci0JCQkJCQkJaW5kaWNlcy5hZGRFbGVtZW50KGxpbmUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuU3ludGF4X0Vycm9yX2luX3RoZV9saW5rc19VSV8pOyAvLyROT04tTkxTLTEkID0gIlN5bnRheCBFcnJvciBpbiB0aGUgbGlua3Mgc3RhdGUgZmlsZSIKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBVc2UgdGhpcyB0byBsb2FkIGFuY2hvciBpbmZvcm1hdGlvbgotCQkJCQkvLwkJCQkvLyBOb3cgbGV0J3MgYWRkIGFsbCBvZiB0aGUgZXh0cmEgYW5jaG9yIGluZm9ybWF0aW9uCi0JCQkJCS8vCQkJCWlmICggbGluZSAhPSBudWxsICYmIGxpbmUuc3RhcnRzV2l0aCggQU5DSE9SX1NFUEFSQVRPUiApICkgewotCQkJCQkvLwkJCQkJd2hpbGUoIChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwgKQotCQkJCQkvLwkJCQkJewotCQkJCQkvLwkJCQkJCVN0cmluZyBidWZmZXIgPSBsaW5lOwotCQkJCQkvLwkKLQkJCQkJLy8JCQkJCQkvLyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgcG9zc2liaWxpdHkgb2YgbGlua3Mgc3Bhbm5pbmcgbXVsdGlwbGUgbGluZXMsCi0JCQkJCS8vCQkJCQkJLy8ga2VlcCByZWFkaW5nIHVudGlsIHdlIGZpbmQgYSBsaW5lIHRoYXQgc3RhcnRzIHdpdGggYW4gaWRpY2F0b3IKLQkJCQkJLy8JCQkJCQkvLyB0aGF0IHRoZSBsaW5rIGlzIGZpbmlzaGVkIChhIGxpbmUgYmVnaW5uaW5nIHcvIExJTktfSU5ERVhfU0VQQVJBVE9SKQotCQkJCQkvLwkJCQkJCWxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJLy8JCQkJCQl3aGlsZSAoIGxpbmUgIT0gbnVsbCAmJiAhbGluZS5zdGFydHNXaXRoKCBBTkNIT1JfSU5ERVhfU0VQQVJBVE9SICkgKSB7Ci0JCQkJCS8vCQkJCQkJCWJ1ZmZlciA9IGJ1ZmZlciArIGxpbmU7Ci0JCQkJCS8vCQkJCQkJCWxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJLy8JCQkJCQl9Ci0JCQkJCS8vCi0JCQkJCS8vCQkJCQkJLy8gYWRkIGZpbGUgYW5kIGFsbCBvZiBpdHMgYW5jaG9ycwotCQkJCQkvLwkJCQkJCWlmICggYnVmZmVyICE9IG51bGwgJiYgbGluZSAhPSBudWxsKQotCQkJCQkvLwkJCQkJCXsKLQkJCQkJLy8JCQkJCQkJYW5jaG9yc1RhYmxlLnB1dCggYnVmZmVyLCBsaW5lICk7Ci0JCQkJCS8vCQkJCQkJfQotCQkJCQkvLwkJCQkJCWVsc2UKLQkJCQkJLy8JCQkJCQl7Ci0JCQkJCS8vCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTeW50YXhfRXJyb3JfaW5fdGhlX2xpbmtzX1VJXyIpKTsKLQkJCQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJTeW50YXggRXJyb3IgaW4gdGhlIGxpbmtzIHN0YXRlIGZpbGUiCi0JCQkJCS8vCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJLy8JCQkJCQl9Ci0JCQkJCS8vCQkJCQl9Ci0JCQkJCS8vCQkKLQkJCQkJLy8JCQkJfQotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmZSkgewotCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGZlKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZSkgewotCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGllKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZTIpIHsKLQkJCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGllMik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQotCQkJCS8vCi0JCQkJLy8gUG9wdWxhdGUgdGhlIGhhc2ggaW5MaW5rc1RhYmxlIHdpdGgga2V5cyAoZmlsZSBwYXRocykgYW5kIHZhbHVlcyAoaW4gbGlua3MgZmlsZXMKLQkJCQkvLyBwYXRocykKLQkJCQkvLwotCQkJCWZpbGVPayA9IHRydWU7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5lbGVtZW50QXQoaSk7Ci0JCQkJCQlTdHJpbmcgY29tcGFjdGVkX2luZGljZXMgPSAoU3RyaW5nKSBpbmRpY2VzLmVsZW1lbnRBdChpKTsKLQotCQkJCQkJLy8KLQkJCQkJCS8vIFBhcnNlIHRoZSBpbi1saW5rcyBpbmRleGVzCi0JCQkJCQkvLwotCi0JCQkJCQlpbnQgc2l6ZSA9IGtleXMuc2l6ZSgpOwotCQkJCQkJVmVjdG9yIGluX2xpbmtzID0gbmV3IFZlY3RvcigpOwotCQkJCQkJaWYgKGNvbXBhY3RlZF9pbmRpY2VzICE9IExJTktfSU5ERVhfU0VQQVJBVE9SKSB7Ci0KLQkJCQkJCQkvLyBFeHRyYWN0IGluZGV4ZXMgYW5kIG9jY3VyZW5jZXMKLQotCQkJCQkJCVN0cmluZ1Rva2VuaXplciBzdF9pZHhfb2NjID0gbmV3IFN0cmluZ1Rva2VuaXplcihuZXcgU3RyaW5nKGNvbXBhY3RlZF9pbmRpY2VzKSwgTElOS19JTkRFWF9TRVBBUkFUT1IpOwotCQkJCQkJCXdoaWxlIChzdF9pZHhfb2NjLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCQlTdHJpbmcgaWR4X29jYyA9IG5ldyBTdHJpbmcoc3RfaWR4X29jYy5uZXh0VG9rZW4oKSk7Ci0JCQkJCQkJCWludCBwb3Nfb2NjID0gaWR4X29jYy5pbmRleE9mKExJTktfT0NDVVJFTkNFX1NFUEFSQVRPUik7Ci0JCQkJCQkJCWludCBpbmRleDsKLQkJCQkJCQkJaW50IG9jY3VyZW5jZSA9IDE7Ci0JCQkJCQkJCWlmIChwb3Nfb2NjID09IC0xKSB7Ci0JCQkJCQkJCQlpbmRleCA9IEludGVnZXIudmFsdWVPZihpZHhfb2NjKS5pbnRWYWx1ZSgpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaW5kZXggPSBJbnRlZ2VyLnZhbHVlT2YoaWR4X29jYy5zdWJzdHJpbmcoMCwgcG9zX29jYykpLmludFZhbHVlKCk7Ci0JCQkJCQkJCQlvY2N1cmVuY2UgPSBJbnRlZ2VyLnZhbHVlT2YoaWR4X29jYy5zdWJzdHJpbmcocG9zX29jYyArIDEpKS5pbnRWYWx1ZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSkgewotCQkJCQkJCQkJTGluayBpbmxuayA9IG5ldyBMaW5rKChTdHJpbmcpIGtleXMuZWxlbWVudEF0KGluZGV4KSwgb2NjdXJlbmNlKTsKLQkJCQkJCQkJCWluX2xpbmtzLmFkZEVsZW1lbnQoaW5sbmspOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaW5MaW5rc1RhYmxlLnB1dChrZXksIGluX2xpbmtzKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWZpbGVPayA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIGZpbGVPazsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoaXMgYnVpbGRlcidzIHN0YXRlIHRvIGRpc2sgc28gdGhhdCBpdCBjYW4gYmUgcmVzdGFydGVkIGluIHRoZSBzYW1lIHN0YXRlIGxhdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSVByb2plY3QgcHJvamVjdCkgewotCi0JCUZpbGUgc3RhdGVGaWxlID0gZ2V0U3RhdGVGaWxlKHByb2plY3QpOwotCQlpZiAoaW5MaW5rc1RhYmxlID09IG51bGwpIHsKLQkJCXN0YXRlRmlsZS5kZWxldGUoKTsKLQkJfSBlbHNlIHsKLQotCQkJLy8gUHJlcGFyZSB0aGUgaW5kZXggdmVjdG9yCi0KLQkJCVZlY3RvciBpbmRleF92ZWN0b3IgPSBuZXcgVmVjdG9yKGluTGlua3NUYWJsZS5zaXplKCkpOwotCQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7IGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCWluZGV4X3ZlY3Rvci5hZGRFbGVtZW50KGFlbnVtLm5leHRFbGVtZW50KCkpOwotCQkJfQotCi0JCQkvLyB3cml0ZSBpbkxpbmtzVGFibGUgdG8gc3RhdGVGaWxlCi0KLQkJCXRyeSB7Ci0JCQkJRmlsZSBwYXJlbnRGb2xkZXIgPSBzdGF0ZUZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCWlmICghcGFyZW50Rm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCXBhcmVudEZvbGRlci5ta2RpcnMoKTsKLQkJCQl9Ci0JCQkJUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihzdGF0ZUZpbGUpKSk7Ci0JCQkJZm9yIChFbnVtZXJhdGlvbiBhZW51bSA9IGluTGlua3NUYWJsZS5rZXlzKCk7IGFlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgYWVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCQkJb3V0LnByaW50KGtleSk7Ci0JCQkJCW91dC5wcmludGxuKCk7Ci0JCQkJCW91dC5wcmludChMSU5LX0lOREVYX1NFUEFSQVRPUik7Ci0JCQkJCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoa2V5KTsKLQkJCQkJaW50IG5iX29mX2xpbmtzID0gaW5fbGlua3Muc2l6ZSgpOwotCi0JCQkJCS8vIFJlcGxhY2UgdGhlIHN0cmluZyBieSBpbmRleAotCQkJCQkvLyBBZGQgYSAnKydzZXBhcmF0b3Igb25seSBmb3IgbW9yZSB0aGFuIG9uZSBsaW5rcyB0byBzYXZlIHNwYWNlCi0JCQkJCS8vIEFkZCAnLzxvY2N1cmVuY2U+JyBvbmx5IGlmIG9jY3VyZW5jZSA+IDEgdG8gc2F2ZSBzcGFjZQotCQkJCQkvLwotCi0JCQkJCUxpbmsgbG5rID0gbnVsbDsKLQkJCQkJaW50IG5iX2xua3MgPSAwOwotCQkJCQlpZiAobmJfb2ZfbGlua3MgPiAwKSB7Ci0JCQkJCQlsbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KDApOwotCQkJCQkJb3V0LnByaW50KGluZGV4X3ZlY3Rvci5pbmRleE9mKGxuay5nZXRVUkwoKSkpOwotCQkJCQkJbmJfbG5rcyA9IGxuay5nZXRPY2N1cnJlbmNlcygpOwotCQkJCQkJaWYgKG5iX2xua3MgPiAxKSB7Ci0JCQkJCQkJb3V0LnByaW50KExJTktfT0NDVVJFTkNFX1NFUEFSQVRPUik7Ci0JCQkJCQkJb3V0LnByaW50KG5iX2xua3MpOwotCQkJCQkJfQotCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBuYl9vZl9saW5rczsgaSsrKSB7Ci0JCQkJCQkJb3V0LnByaW50KExJTktfSU5ERVhfU0VQQVJBVE9SKTsKLQkJCQkJCQlsbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOwotCQkJCQkJCW91dC5wcmludChpbmRleF92ZWN0b3IuaW5kZXhPZihsbmsuZ2V0VVJMKCkpKTsKLQkJCQkJCQluYl9sbmtzID0gbG5rLmdldE9jY3VycmVuY2VzKCk7Ci0JCQkJCQkJaWYgKG5iX2xua3MgPiAxKSB7Ci0JCQkJCQkJCW91dC5wcmludChMSU5LX09DQ1VSRU5DRV9TRVBBUkFUT1IpOwotCQkJCQkJCQlvdXQucHJpbnQobmJfbG5rcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW91dC5wcmludGxuKCk7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogdXNlIHRoaXMgdG8gc2F2ZSBvdXQgYW5jaG9yIGluZm9ybWF0aW9uIC8vCi0JCQkJICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgaWYgKCAhYW5jaG9yc1RhYmxlLmlzRW1wdHkoKSApIHsKLQkJCQkgKiBvdXQucHJpbnRsbiggQU5DSE9SX1NFUEFSQVRPUiApOyB9IGZvciAoRW51bWVyYXRpb24gZW51bSA9IGFuY2hvcnNUYWJsZS5rZXlzKCk7Ci0JCQkJICogZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsgU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCQkgKiBvdXQucHJpbnQoa2V5KTsgb3V0LnByaW50bG4oKTsgLy9vdXQucHJpbnQoQU5DSE9SX0lOREVYX1NFUEFSQVRPUik7IG91dC5wcmludGxuKAotCQkJCSAqIGFuY2hvcnNUYWJsZS5nZXQoa2V5KSApOyB9Ci0JCQkJICovCi0KLQkJCQlvdXQuZmx1c2goKTsKLQkJCQlvdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkVycm9yX3doaWxlX3NhdmluZ19saW5rc19zX0VYQ18pOyAvLyROT04tTkxTLTEkID0gIkVycm9yIHdoaWxlIHNhdmluZyBsaW5rcyBzdGF0ZSBmaWxlIgotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMy8yMS8yMDAxIDE6NDU6NTggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0ZpbGVPawotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0RmlsZU9rKGJvb2xlYW4gbmV3RmlsZU9rKSB7Ci0JCWZpbGVPayA9IG5ld0ZpbGVPazsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1NlcnZlclRhcmdldFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmVyVGFyZ2V0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDAzZGM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmVyVGFyZ2V0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDEyLCAyMDAzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQuSVNlcnZlclRhcmdldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLS8qKgotICogQSBjbGFzcyB3aXRoIHNvbWUgdXNlZnVsIG1ldGhvZHMgdGhhdCBzdXBwb3J0IHNlcnZlciB0YXJnZXR0aW5nIGZvciBXZWIgcHJvamVjdHMuCi0gKiAKLSAqIEBhdXRob3IgUHJhdGlrIFNoYWgKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclRhcmdldFV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRJZCA9ICJjb20uaWJtLmV0b29scy53ZWJzcGhlcmUuc2VydmVyVGFyZ2V0LmJhc2UudjUxIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0RXhwcmVzc0lkID0gImNvbS5pYm0uZXRvb2xzLndlYnNwaGVyZS5zZXJ2ZXJUYXJnZXQuZXhwcmVzcy52NTEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0cwotCSAqICAgICAgICAgICAgQSBsaXN0IG9mIElTZXJ2ZXJUYXJnZXRzCi0JICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIHRhcmdldCBzZXJ2ZXIgd2l0aCB0aGUKLQkgKiAgICAgICAgIHtAbGluayAjZ2V0RGVmYXVsdFNlcnZlclRhcmdldElkKCkgZGVmYXVsdCBJZH07IG9yIDAsIGlmIGl0IGNvdWxkIG5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBmaW5kRGVmYXVsdFNlcnZlclRhcmdldEluZGV4KExpc3QgdGFyZ2V0cykgewotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlSdW50aW1lIHRhcmdldCA9IChJUnVudGltZSkgdGFyZ2V0cy5nZXQoaSk7Ci0JCQlpZiAodGFyZ2V0LmdldElkKCkuZXF1YWxzKGdldERlZmF1bHRTZXJ2ZXJUYXJnZXRJZCgpKSkgewotCQkJCWluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgVGhlIElTZXJ2ZXJUYXJnZXQgdGhhdCBoYXMgdG8gYmUgZm91bmQgaW4gdGhlIGdpdmVuIGxpc3Q7IGl0IGNhbiBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbGlzdAotCSAqICAgICAgICAgICAgVGhlIExpc3QgZnJvbSB3aGljaCB0aGUgSVNlcnZlclRhcmdldCBoYXMgdG8gYmUgZm91bmQKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gdGFyZ2V0IGluIHRoZSBnaXZlbiBsaXN0OyBvciAwLCBpZiB0aGUgZ2l2ZW4gdGFyZ2V0IGNvdWxkIG5vdAotCSAqICAgICAgICAgYmUgZm91bmQgaW4gdGhlIGdpdmVuIGxpc3QuIFR3byBJU2VydmVyVGFyZ2V0cyBhcmUgY29uc2lkZXJlZCB0byBiZSBlcXVhbCBpZiB0aGV5Ci0JICogICAgICAgICBoYXZlIHRoZSBzYW1lIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGZpbmRJbmRleE9mKElSdW50aW1lIHRhcmdldCwgTGlzdCBsaXN0KSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJSVJ1bnRpbWUgZWxlbWVudCA9IChJUnVudGltZSkgbGlzdC5nZXQoaSk7Ci0JCQkJaWYgKGVsZW1lbnQuZXF1YWxzKHRhcmdldCkpIHsKLQkJCQkJaW5kZXggPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIElkIG9mIHRoZSB0YXJnZXQgc2VydmVyIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0U2VydmVyVGFyZ2V0SWQoKSB7Ci0JCVN0cmluZyBpZCA9IGRlZmF1bHRFeHByZXNzSWQ7Ci0JCWlmIChKMkVFUGx1Z2luLmlzRUpCU3VwcG9ydEF2YWlsYWJsZSgpKSB7Ci0JCQlpZCA9IGRlZmF1bHRJZDsKLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlzSjJFRTEzCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29uc3RhbnQgZm9yIEoyRUUgdmVyc2lvbiAxLjMgaXMgZGVzaXJlZAotCSAqIEByZXR1cm4gSVNlcnZlclRhcmdldENvbnN0YW50cy5KMkVFXzEyIG9yIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuSjJFRV8xMwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEoyRUVWZXJzaW9uKGJvb2xlYW4gaXNKMkVFMTMpIHsKLQkJcmV0dXJuIGlzSjJFRTEzID8gSVNlcnZlclRhcmdldENvbnN0YW50cy5KMkVFXzEzIDogSVNlcnZlclRhcmdldENvbnN0YW50cy5KMkVFXzEyOwotCX0KLQotCS8qKgotCSAqIEEgY29udmVuaWVudCBtZXRob2QgdGhhdCB0YWtlcyBpbiBhIGxpc3Qgb2YgSVNlcnZlclRhcmdldHMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgbGFiZWxzIG9mCi0JICogdGhlIElTZXJ2ZXJUYXJnZXRzIGluIHRoZSBnaXZlbiBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXJUYXJnZXRzCi0JICogICAgICAgICAgICBUaGUgbGlzdCBvZiBJU2VydmVyVGFyZ2V0cwotCSAqIEByZXR1cm4gQW4gYXJyYXkgbG9mIGxhYmVscyBvZiB0aGUgSVNlcnZlclRhcmdldHMgaW4gdGhlIGdpdmVuIGxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNlcnZlck5hbWVzKExpc3Qgc2VydmVyVGFyZ2V0cykgewotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3NlcnZlclRhcmdldHMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIHNlcnZlclRhcmdldHMuZ2V0KGkpOwotCQkJcmVzdWx0W2ldID0gcnVudGltZS5nZXROYW1lKCkgKyAiICgiICsgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJqTmFtZQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgcHJvamVjdCB3aG9zZSBTZXJ2ZXJUYXJnZXQgaGFzIHRvIGJlIHJldHJpZXZlZDsgaXQgY2FuIGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFNlcnZlclRhcmdldCBvZiB0aGUgZ2l2ZW4gcHJvamVjdDsgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb2plY3QgZG9lcyBub3QKLQkgKiAgICAgICAgIGV4aXN0IG9yIGl0cyBTZXJ2ZXJUYXJnZXQgaXMgbm90IHNwZWNpZmllZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW50aW1lIGdldFNlcnZlclRhcmdldChTdHJpbmcgcHJqTmFtZSkgewotCQlpZiAocHJqTmFtZSAhPSBudWxsICYmICFwcmpOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUlQcm9qZWN0IHByaiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcmpOYW1lKTsKLQkJCWlmIChwcmogIT0gbnVsbCAmJiBwcmouZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcmopLmdldFJ1bnRpbWVUYXJnZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1RlbXBsYXRlRGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9UZW1wbGF0ZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkyZTgwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1RlbXBsYXRlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotCi0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZURhdGEgewotCXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIHd0RmlsZU5hbWUgPSAiIjsvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgd3RDU1NOYW1lID0gIiI7Ly8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIHd0Q29udGFpbmVyTG9jYXRvaW4gPSAiIjsvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgdGFnbGliczsKLQotCS8qKgotCSAqIFRlbXBsYXRlRGF0YSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZURhdGEoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250YWluZXJMb2NhdG9pbigpIHsKLQkJcmV0dXJuIHd0Q29udGFpbmVyTG9jYXRvaW47Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi80LzIwMDEgNToyNDozMCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDU1NOYW1lKCkgewotCQlyZXR1cm4gd3RDU1NOYW1lOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvNC8yMDAxIDU6MjI6NTYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIHd0RmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMTUvMjAwMSA0OjE2OjEwIFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRhZ2xpYnMoKSB7Ci0JCXJldHVybiB0YWdsaWJzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lckxvY2F0b2luKFN0cmluZyBuZXdGaWxlTmFtZSkgewotCQl3dENvbnRhaW5lckxvY2F0b2luID0gbmV3RmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi80LzIwMDEgNToyNDozMCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q1NTTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENTU05hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdDU1NOYW1lKSB7Ci0JCXd0Q1NTTmFtZSA9IG5ld0NTU05hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi80LzIwMDEgNToyMjo1NiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3V3RGaWxlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBuZXdGaWxlTmFtZSkgewotCQl3dEZpbGVOYW1lID0gbmV3RmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMTUvMjAwMSA0OjE2OjEwIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdUYWdsaWJzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFnbGlicyhqYXZhLmxhbmcuU3RyaW5nIG5ld1RhZ2xpYnMpIHsKLQkJdGFnbGlicyA9IG5ld1RhZ2xpYnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvV2ViUHJvcGVydGllc1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvV2ViUHJvcGVydGllc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmNDNlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1dlYlByb3BlcnRpZXNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotcHVibGljIGNsYXNzIFdlYlByb3BlcnRpZXNVdGlsIHsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQkFEX0NIQVJTID0geycvJywgJ1xcJywgJzonfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQkFEX0NIQVJTID0geyc6J307Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KQVZBX1NPVVJDRV9OQU1FID0gIkphdmEgU291cmNlIjsgLy8kTk9OLU5MUy0xJAotCS8vVE9ETyBQb3J0IHRvIGZsZXhpYmxlIHN0cnVjdHVyZQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIHRvIGEgbmV3IHZhbHVlIGlmIGl0IGlzIGRpZmZlcmVudC4gVGhpcyBhcHBsaWVzIHRvIGJvdGggU3RhdGljCi0JICogYW5kIEoyRUUgV2ViIFByb2plY3RzLiBJbiB0aGUgY2FzZSBvZiBhIEoyRUUgUHJvamVjdCwgdGhlIGxpYnJhcnkgY2xhc3NwYXRoIGVudHJpZXMgd2lsbCBiZQotCSAqIG1vZGlmaWVzIHRvIHJlZmxlY3QgdGhlIG5ldyBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIFdlYiBQcm9qZWN0IHRvIHVwZGF0ZQotCSAqIEBwYXJhbSB3ZWJDb250ZW50TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5ldyBuYW1lIGdpdmVuIHRvIHRoZSBXZWIgUHJvamVjdCdzIFdlYiBDb250ZW50IGZvbGRlcgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiAgICAgICAgICAgIEluZGljYXRlcyBwcm9ncmVzcyBvZiB0aGUgdXBkYXRlIG9wZXJhdGlvbgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgd2ViIGNvbnRlbnQgcmVuYW1lIHdhcyBhY3R1YWxseSByZW5hbWVkLCBmYWxzZSBpZiB1bm5lZWRlZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIHRoYXQgb2NjdXJlZCBkdXJpbmcgcmVuYW1pbmcgb2YgdGhlIHRoZSBwcm9qZWN0J3Mgd2ViIGNvbnRlbnQKLQkgKiAgICAgICAgICAgICBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXBkYXRlV2ViQ29udGVudE5hbWVBbmRQcm9wZXJ0aWVzKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB3ZWJDb250ZW50TmFtZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCWlmIChwcm9qZWN0LmV4aXN0cygpICYmIHByb2plY3QuaXNPcGVuKCkpIHsKLQotCQkJLyoKLQkJCSAqIElCYXNlV2ViTmF0dXJlIHdlYk5hdHVyZSA9IEoyRUVXZWJOYXR1cmVSdW50aW1lVXRpbGl0aWVzLmdldFJ1bnRpbWUocHJvamVjdCk7IGlmCi0JCQkgKiAod2ViQ29udGVudE5hbWUgPT0gbnVsbCkgeyBpZiAod2ViTmF0dXJlLmlzU3RhdGljKCkpIHsgd2ViQ29udGVudE5hbWUgPQotCQkJICogSjJFRVdlYk5hdHVyZVJ1bnRpbWVVdGlsaXRpZXMuZ2V0RGVmYXVsdFN0YXRpY1dlYkNvbnRlbnROYW1lKCk7IH0gZWxzZSB7Ci0JCQkgKiB3ZWJDb250ZW50TmFtZSA9IEoyRUVXZWJOYXR1cmVSdW50aW1lVXRpbGl0aWVzLmdldERlZmF1bHRKMkVFV2ViQ29udGVudE5hbWUoKTsgfSB9Ci0JCQkgKi8KLQotCQkJSVBhdGggbmV3UGF0aCA9IG5ldyBQYXRoKHdlYkNvbnRlbnROYW1lKTsKLQkJCWlmIChnZXRNb2R1bGVTZXJ2ZXJSb290KHByb2plY3QpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5lcXVhbHMobmV3UGF0aCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKHByb2plY3QuZXhpc3RzKG5ld1BhdGgpKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJvcmcuZWNsaXBzZS5qc3QuajJlZSIsIElTdGF0dXMuT0ssIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Db3VsZF9ub3RfcmVuYW1lX19fX18yLCBuZXcgT2JqZWN0W117d2ViQ29udGVudE5hbWV9KSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkJfQotCi0JCQltb3ZlV2ViQ29udGVudEZvbGRlcihwcm9qZWN0LCB3ZWJDb250ZW50TmFtZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQkJCXVwZGF0ZVdlYkNvbnRlbnROYW1lUHJvcGVydGllc09ubHkocHJvamVjdCwgd2ViQ29udGVudE5hbWUsIHByb2dyZXNzTW9uaXRvcik7Ci0JCQlzdWNjZXNzID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIGFuZCBTZXJ2ZXIgUm9vdCBOYW1lIGZvciB0aGlzIHdlYiBwcm9qZWN0IG9ubHkuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gd2ViQ29udGVudE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVdlYkNvbnRlbnROYW1lUHJvcGVydGllc09ubHkoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHdlYkNvbnRlbnROYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBuZXdQYXRoID0gbmV3IFBhdGgod2ViQ29udGVudE5hbWUpOwotCQlpZiAoZ2V0TW9kdWxlU2VydmVyUm9vdChwcm9qZWN0KS5lcXVhbHMobmV3UGF0aCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFnZXRNb2R1bGVTZXJ2ZXJSb290KHByb2plY3QpLmVxdWFscyh3ZWJDb250ZW50TmFtZSkpIHsKLQotCQkJLy8gaWYgKHdlYk1vZHVsZUFydGlmYWN0LmlzSjJFRSkgewotCQkJLy8gVXBkYXRlIHRoZSBsaWJyYXJ5IHJlZmVyZW5jZXMKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEplbVByb2plY3RVdGlsaXRpZXMuZ2V0SmF2YVByb2plY3QocHJvamVjdCk7Ci0KLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjbGFzc3BhdGgubGVuZ3RoXTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY2xhc3NwYXRoW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgewotCQkJCQlJQ2xhc3NwYXRoRW50cnkgbGlicmFyeSA9IGNsYXNzcGF0aFtpXTsKLQkJCQkJSVBhdGggbGlicGF0aCA9IGxpYnJhcnkuZ2V0UGF0aCgpOwotCQkJCQlJUGF0aCBtb2RTZXJ2ZXJSb290UGF0aCA9IGdldE1vZHVsZVNlcnZlclJvb3QocHJvamVjdCkuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJaWYgKG1vZFNlcnZlclJvb3RQYXRoLmlzUHJlZml4T2YobGlicGF0aCkpIHsKLQkJCQkJCUlQYXRoIHBydW5lZFBhdGggPSBsaWJwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobW9kU2VydmVyUm9vdFBhdGguc2VnbWVudENvdW50KCkpOwotCQkJCQkJSVBhdGggcmVsV2ViQ29udGVudFBhdGggPSBuZXcgUGF0aCh3ZWJDb250ZW50TmFtZSArICIvIiArIHBydW5lZFBhdGgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUlSZXNvdXJjZSBhYnNXZWJDb250ZW50UGF0aCA9IHByb2plY3QuZ2V0RmlsZShyZWxXZWJDb250ZW50UGF0aCk7Ci0KLQkJCQkJCUlQYXRoIHNyY0F0dGFjaG1lbnRQYXRoID0gbGlicmFyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOwotCQkJCQkJaWYgKG51bGwgIT0gc3JjQXR0YWNobWVudFBhdGgpIHsKLQkJCQkJCQlwcnVuZWRQYXRoID0gc3JjQXR0YWNobWVudFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhtb2RTZXJ2ZXJSb290UGF0aC5zZWdtZW50Q291bnQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlJUmVzb3VyY2UgYWJzV2ViQ29udGVudFNyY0F0dGFjaG1lbnRQYXRoID0gcHJvamVjdC5nZXRGaWxlKHJlbFdlYkNvbnRlbnRQYXRoKTsKLQotCQkJCQkJbmV3Q2xhc3NwYXRoW2ldID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGFic1dlYkNvbnRlbnRQYXRoLmdldEZ1bGxQYXRoKCksIGFic1dlYkNvbnRlbnRTcmNBdHRhY2htZW50UGF0aC5nZXRGdWxsUGF0aCgpLCBsaWJyYXJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpLCBsaWJyYXJ5LmlzRXhwb3J0ZWQoKSk7Ci0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW5ld0NsYXNzcGF0aFtpXSA9IGNsYXNzcGF0aFtpXTsKLQkJCQkJfQotCi0JCQkJfSBlbHNlIHsKLQkJCQkJbmV3Q2xhc3NwYXRoW2ldID0gY2xhc3NwYXRoW2ldOwotCQkJCX0KLQkJCQkvLyB9Ci0KLQkJCQkvLyBTZXQgdGhlIGphdmEgb3V0cHV0IGZvbGRlcgotCQkJCUlGb2xkZXIgb3V0cHV0Rm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoZ2V0TW9kdWxlU2VydmVyUm9vdChwcm9qZWN0KS5nZXRGdWxsUGF0aCgpKTsKLQkJCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBvdXRwdXRGb2xkZXIuZ2V0RnVsbFBhdGgoKSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpKTsKLQkJCX0KLQkJCS8vIHVwZGF0ZSB3ZWJzZXR0aW5ncwotCQkJLy8gVE9ETyBhZGQgdG8gV2ViQXJ0aWZhY3RFZGl0Ci0JCQkvLyB3ZWJOYXR1cmUuc2V0TW9kdWxlU2VydmVyUm9vdE5hbWUod2ViQ29udGVudE5hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTW92ZXMgdGhlIHdlYiBjb250ZW50IGZvbGRlciB0byB0aGUgbmFtZSBpbmRpY2F0ZWQgb25seSBpZiB0aGF0IHBhdGggZG9lc24ndCBhbHJlYWR5IGV4aXN0IGluCi0JICogdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSB3ZWIgcHJvamVjdCB0byBiZSB1cGRhdGVkLgotCSAqIEBwYXJhbSB3ZWJDb250ZW50TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB3ZWIgY29udGVudCBuYW1lCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgSW5kaWNhdGVzIHByb2dyZXNzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiB0aGF0IG9jY3VyZWQgZHVyaW5nIG1vdmUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1vdmVXZWJDb250ZW50Rm9sZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB3ZWJDb250ZW50TmFtZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggbmV3UGF0aCA9IG5ldyBQYXRoKHdlYkNvbnRlbnROYW1lKTsKLQkJaWYgKCFwcm9qZWN0LmV4aXN0cyhuZXdQYXRoKSkgewotCQkJaWYgKG5ld1BhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJZm9yIChpbnQgaSA9IG5ld1BhdGguc2VnbWVudENvdW50KCkgLSAxOyBpID4gMDsgaS0tKSB7Ci0JCQkJCUlQYXRoIHRlbXBQYXRoID0gbmV3UGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoaSk7Ci0JCQkJCUlGb2xkZXIgdGVtcEZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKHRlbXBQYXRoKTsKLQkJCQkJaWYgKCF0ZW1wRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQl0ZW1wRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW5ld1BhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCkuYXBwZW5kKG5ld1BhdGgpOwotCQkJSUNvbnRhaW5lciB3ZWJDb250ZW50Um9vdCA9IGdldE1vZHVsZVNlcnZlclJvb3QocHJvamVjdCk7Ci0JCQlJUGF0aCBvbGRQYXRoID0gd2ViQ29udGVudFJvb3QuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJd2ViQ29udGVudFJvb3QubW92ZShuZXdQYXRoLCBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRQYXRoLnNlZ21lbnRDb3VudCgpOyBpKyspIHsKLQkJCQlJUGF0aCB0ZW1wUGF0aCA9IG9sZFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKGkpOwotCQkJCUlGb2xkZXIgdGVtcEZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKHRlbXBQYXRoKTsKLQkJCQlpZiAodGVtcEZvbGRlci5leGlzdHMoKSAmJiB0ZW1wRm9sZGVyLm1lbWJlcnMoKS5sZW5ndGggPT0gMCkgewotCQkJCQl0ZW1wRm9sZGVyLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTeW5jaG9uaXppZXMgdGhlIGNsYXNzIHBhdGggYW5kIHRoZSBsaWIgZGlyZWN0b3JpZXMgdG8gY2F0Y2ggYW55IGNoYW5nZXMgZnJvbSB0aGUgbGFzdCB1c2UKLQkgKiBDcmVhdGlvbiBkYXRlOiAoNC8xNy8wMSAxMTo0ODoxMiBBTSkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc3luY2goSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCX0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlN5Y2hyb25pemVfQ2xhc3NfUGF0aF9VSV8sIDQpOyAvLyROT04tTkxTLTEkCi0JCQkvLyROT04tTkxTLTEkID0gIlN5Y2hyb25pemUgQ2xhc3MgUGF0aCIKLQotCQkJSUNvbnRhaW5lciBsaWJfZm9sZGVyID0gZ2V0V2ViTGliRm9sZGVyKHByb2plY3QpOwotCQkJLy8gTm90aGluZyB0byBkbyBpZiB0aGUgbGliIGZvbGRlciBkb2VzIG5vdCBleGlzdC4KLQkJCWlmIChsaWJfZm9sZGVyID09IG51bGwgfHwgIWxpYl9mb2xkZXIuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuOwotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJCUlQYXRoIGxpYl9wYXRoID0gbGliX2ZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQlJUGF0aCBsaWJfZnVsbF9wYXRoID0gbGliX2ZvbGRlci5nZXRGdWxsUGF0aCgpOwotCi0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCi0JCQlib29sZWFuIG5lZWRzVG9CZU1vZGlmaWVkID0gZmFsc2U7Ci0JCQkvLyBDcmVhdGUgYSBtYXAgb2YgdGhlIGxpYiBwcm9qZWN0cyBpbiB0aGUgY3VycmVudCBwcm9qZWN0Ci0JCQlIYXNodGFibGUgbGliX2phcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQlJUmVzb3VyY2VbXSBjaGlsZHJlbiA9IGxpYl9mb2xkZXIubWVtYmVycygpOwotCQkJbW9uaXRvci5zdWJUYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkNhdGFsb2dfTGliX0RpcmVjdG9yeV9fVUlfKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8kTk9OLU5MUy0xJCA9ICJDYXRhbG9nIExpYiBEaXJlY3Rvcnk6IgotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCUlSZXNvdXJjZSBjaGlsZCA9IGNoaWxkcmVuW2pdOwotCQkJCS8vIG1vbml0b3Iuc2V0VGFza05hbWUoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2F0YWxvZ19MaWJfRGlyZWN0b3J5X19VSV8iKSArCi0JCQkJLy8gY2hpbGQpOyAvLyROT04tTkxTLTEkID0gIkNhdGFsb2cgTGliIERpcmVjdG9yeToiCi0JCQkJLy8gTWFrZSBzdXJlIGl0IGlzIGEgemlwIG9yIGEgamFyIGZpbGUKLQkJCQlpZiAoY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIChjaGlsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphciIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl8fCBjaGlsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnppcCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWxpYl9qYXJzLnB1dChjaGlsZC5nZXRGdWxsUGF0aCgpLCBjaGlsZCk7Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJbW9uaXRvci5zdWJUYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlVwZGF0ZV9DbGFzc1BhdGhfX1VJXyk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vJE5PTi1OTFMtMSQgPSAiVXBkYXRlIENsYXNzUGF0aDoiCi0JCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBjbGFzc3BhdGggZGlycyBsb29raW5nIGZvciBvbmVzIHRoYXQgbWF5IGhhdmUKLQkJCS8vIGJlZW4gZGVsZXRlZAotCQkJVmVjdG9yIG5ld0NsYXNzUGF0aFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3AubGVuZ3RoOyBqKyspIHsKLQotCQkJCS8vIElmIGl0IGlzIGEgbGliX3BhdGgKLQkJCQlpZiAoY3Bbal0uZ2V0UGF0aCgpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChsaWJfcGF0aC50b1N0cmluZygpKSB8fCBjcFtqXS5nZXRQYXRoKCkudG9TdHJpbmcoKS5zdGFydHNXaXRoKGxpYl9mdWxsX3BhdGgudG9TdHJpbmcoKSkpIHsKLQkJCQkJLy8gSXQgd2FzIGFscmVhZHkgaW4gdGhlIGNsYXNzIHBhdGgKLQkJCQkJaWYgKGxpYl9qYXJzLmdldChjcFtqXS5nZXRQYXRoKCkpICE9IG51bGwpIHsKLQkJCQkJCW5ld0NsYXNzUGF0aFZlY3Rvci5hZGQoY3Bbal0pOwotCQkJCQkJLy8gUmVtb3ZlIGl0IGZyb20gdGhlIGhhc2ggdGFibGUgb2YgcGF0aHMgdG8gYWRkIGJhY2sKLQkJCQkJCS8vIG1vbml0b3Iuc2V0VGFza05hbWUoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2F0YWxvZ19MaWJfRGlyZWN0b3J5X19VSV8iKQotCQkJCQkJLy8gKyBjcFtqXS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkID0gIkNhdGFsb2cgTGliIERpcmVjdG9yeToiCi0JCQkJCQlsaWJfamFycy5yZW1vdmUoY3Bbal0uZ2V0UGF0aCgpKTsKLQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gWW91IGhhdmUgcmVtb3ZlZCBzb21ldGhpbmcgZm9ybSB0aGUgY2xhc3MgcGF0aCB5b3UKLQkJCQkJCS8vIHdpbGwgbmVlZCB0byByZS1idWlsZAotCQkJCQkJLy8gbW9uaXRvci5zZXRUYXNrTmFtZShSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDYXRhbG9nX0xpYl9EaXJlY3RvcnlfUmVtb19VSV8iKQotCQkJCQkJLy8gKyBjcFtqXS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkID0gIkNhdGFsb2cgTGliIERpcmVjdG9yeTpSZW1vdmUgIgotCQkJCQkJbmVlZHNUb0JlTW9kaWZpZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkNhdGFsb2dfTGliX0RpcmVjdG9yeV9fVUlfICsgY3Bbal0uZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyROT04tTkxTLTEkID0gIkNhdGFsb2cgTGliIERpcmVjdG9yeToiCi0JCQkJCW5ld0NsYXNzUGF0aFZlY3Rvci5hZGQoY3Bbal0pOwotCQkJCX0KLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJbW9uaXRvci5zdWJUYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlVwZGF0ZV9DbGFzc1BhdGhfX1VJXyk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vJE5PTi1OTFMtMSQgPSAiVXBkYXRlIENsYXNzUGF0aDoiCi0KLQkJCS8vIEFkZCBhbnkgZW50cmllcyBub3QgYWxyZWFkeSBmb3VuZAotCQkJRW51bWVyYXRpb24gYWVudW0gPSBsaWJfamFycy5rZXlzKCk7Ci0JCQl3aGlsZSAoYWVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBhZW51bS5uZXh0RWxlbWVudCgpOwotCQkJCW5ld0NsYXNzUGF0aFZlY3Rvci5hZGQoSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIG51bGwsIG51bGwpKTsKLQkJCQkvLyBZb3UgaGF2ZSBhZGRlZCBzb21ldGhpbmcgZm9ybSB0aGUgY2xhc3MgcGF0aCB5b3UKLQkJCQkvLyB3aWxsIG5lZWQgdG8gcmUtYnVpbGQKLQkJCQkvLyBtb25pdG9yLnNldFRhc2tOYW1lKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjIzY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W10gewotCQkJCS8vIHBhdGggfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJDYXRhbG9nIExpYiBEaXJlY3Rvcnk6QWRkIHswfSIKLQkJCQluZWVkc1RvQmVNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJbW9uaXRvci5zdWJUYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlNldF9DbGFzc1BhdGhfX1VJXyk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vJE5PTi1OTFMtMSQgPSAiU2V0IENsYXNzUGF0aDoiCi0KLQkJCS8vIFRhbnNmZXIgdGhlIHZlY3RvciB0byBhbiBhcnJheQotCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NQYXRoQXJyYXkgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W25ld0NsYXNzUGF0aFZlY3Rvci5zaXplKCldOwotCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IG5ld0NsYXNzUGF0aEFycmF5Lmxlbmd0aDsgaisrKSB7Ci0JCQkJbmV3Q2xhc3NQYXRoQXJyYXlbal0gPSAoSUNsYXNzcGF0aEVudHJ5KSBuZXdDbGFzc1BhdGhWZWN0b3IuZ2V0KGopOwotCQkJfQotCi0JCQkvLyBPbmx5IGNoYW5nZSB0aGUgY2xhc3MgcGF0aCBpZiB0aGVyZSBoYXMgYmVlbiBhIG1vZGlmaWNhdGlvbgotCQkJaWYgKG5lZWRzVG9CZU1vZGlmaWVkKSB7Ci0KLQkJCQl0cnkgewotCQkJCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NQYXRoQXJyYXksIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCi0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhleCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZXgpOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlQ29udGV4dFJvb3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbnRleHRSb290KSB7Ci0JCWlmIChwcm9qZWN0LmV4aXN0cygpICYmIHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gVE9ETyBtaWdyYXRlIHRvIGZsZXggcHJvamVjdHMKLQkJCQkvLyB3ZWJFZGl0ID0gKFdlYkFydGlmYWN0RWRpdCkgU3RydWN0dXJlRWRpdC5nZXRGaXJzdEFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLQkJCQkJd2ViRWRpdC5zZXRTZXJ2ZXJDb250ZXh0Um9vdChjb250ZXh0Um9vdCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpCi0JCQkJCXdlYkVkaXQuZGlzcG9zZSgpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdAotCSAqLwotCS8qKgotCSAqIFJldHVybnMgYSBlcnJvciBtZXNzYWdlIHRoYXQgc3RhdGVzIHdoZXRoZXIgYSBjb250ZXh0IHJvb3QgaXMgdmFsaWQgb3Igbm90IHJldHVybnMgbnVsbCBpZgotCSAqIGNvbnRleHQgcm9vdCBpcyBmaW5lCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbnRleHRSb290Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVDb250ZXh0Um9vdChTdHJpbmcgY29udGV4dFJvb3QpIHsKLQotCQlpZiAoY29udGV4dFJvb3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCi0JCVN0cmluZyBuYW1lID0gY29udGV4dFJvb3Q7Ci0JCWlmIChuYW1lLmVxdWFscygiIikgfHwgbmFtZSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHRoaXMgd2FzIGFkZGVkIGJlY2F1c2UgdGhlIGVycm9yIG1lc3NhZ2Ugc2hvdWxkbnQgYmUgc2hvd24gaW5pdGlhbGx5LiBJdCBzaG91bGQgYmUKLQkJCS8vIHNob3duIG9ubHkgaWYgY29udGV4dCByb290IGZpZWxkIGlzIGVkaXRlZCB0bwotCQkJZXJyb3JNZXNzYWdlID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuQ29udGV4dF9Sb290X2Nhbm5vdF9iZV9lbXB0eV8yOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCQl9Ci0KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJICogLy8gSlogLSBmaXggdG8gZGVmZWN0IDIwNDI2NCwgIi8iIGlzIHZhbGlkIGluIGNvbnRleHQgcm9vdCBpZiAobmFtZS5pbmRleE9mKCIvLyIpICE9IC0xKSB7Ci0JCSAqIC8vJE5PTi1OTFMtMSQgZXJyb3JNZXNzYWdlID0gIi8vIGFyZSBpbnZhbGlkIGNoYXJhY3RlcnMgaW4gYSByZXNvdXJjZSBuYW1lIjsgcmV0dXJuCi0JCSAqIGVycm9yTWVzc2FnZTsgfQotCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JCWlmIChuYW1lLnRyaW0oKS5lcXVhbHMobmFtZSkpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCAiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXRlciA6IHdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2tlbiA9IHN0b2submV4dFRva2VuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbi5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWlmICghKHRva2VuLmNoYXJBdChpKSA9PSAnXycpICYmICEodG9rZW4uY2hhckF0KGkpID09ICctJykgJiYgISh0b2tlbi5jaGFyQXQoaSkgPT0gJy8nKSAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KHRva2VuLmNoYXJBdChpKSkgPT0gZmFsc2UpIHsKLQkJCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRva2VuLmNoYXJBdChpKSkpIHsKLQkJCQkJCQkvLyBSZW1vdmVkIGJlY2F1c2UgY29udGV4dCByb290cyBjYW4gY29udGFpbiB3aGl0ZSBzcGFjZQotCQkJCQkJCS8vIGVycm9yTWVzc2FnZSA9Ci0JCQkJCQkJLy8gUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX0NvbnRleHRfcm9vdF9jYW5ub3RfY29udGFfVUlfIik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCS8vID0gIiBDb250ZXh0IHJvb3QgY2Fubm90IGNvbnRhaW4gd2hpdGVzcGFjZXMuIgotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllcnJvck1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuVGhlX2NoYXJhY3Rlcl9pc19pbnZhbGlkX2luX2FfY29udGV4dF9yb290LCBuZXcgT2JqZWN0W117KG5ldyBDaGFyYWN0ZXIodG9rZW4uY2hhckF0KGkpKSkudG9TdHJpbmcoKX0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZW4vIGVuZCBvZiBpZihuYW1lLnRyaW0KLQkJZWxzZQotCQkJZXJyb3JNZXNzYWdlID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuTmFtZXNfY2Fubm90X2JlZ2luX29yX2VuZF93aXRoX3doaXRlc3BhY2VfNTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGFueSBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgYXJyYXkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgc3RyLCBjaGFyW10gY2hhcnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHN0ci5pbmRleE9mKGNoYXJzW2ldKSAhPSAtMSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZUZvbGRlck5hbWUoU3RyaW5nIGZvbGRlck5hbWUpIHsKLQkJaWYgKGZvbGRlck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Gb2xkZXJfbmFtZV9jYW5ub3RfYmVfZW1wdHlfMjsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb250YWlucyhmb2xkZXJOYW1lLCBCQURfQ0hBUlMpKQotCQkJcmV0dXJuIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Gb2xkZXJfbmFtZV9pc19ub3RfdmFsaWQsIG5ldyBPYmplY3RbXXtmb2xkZXJOYW1lfSk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlV2ViQ29udGVudE5hbWUoU3RyaW5nIHdlYkNvbnRlbnROYW1lLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgamF2YVNvdXJjZU5hbWUpIHsKLQotCQlTdHJpbmcgbXNnID0gdmFsaWRhdGVGb2xkZXJOYW1lKHdlYkNvbnRlbnROYW1lKTsKLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQotCQlpZiAoamF2YVNvdXJjZU5hbWUgIT0gbnVsbCAmJiB3ZWJDb250ZW50TmFtZS5lcXVhbHMoamF2YVNvdXJjZU5hbWUpKQotCQkJcmV0dXJuIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkZvbGRlcl9uYW1lc19jYW5ub3RfYmVfZXF1YWxfNDsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIElmIGdpdmVuIGEgamF2YSBwcm9qZWN0LCBjaGVjayB0byBtYWtlIHN1cmUgY3VycmVudCBwYWNrYWdlIGZyYWdtZW50Ci0JCS8vIHJvb3QgZm9sZGVycyBkbyBub3Qgb3ZlcmxhcCB3aXRoIG5ldyB3ZWIgY29udGVudCBuYW1lCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEplbVByb2plY3RVdGlsaXRpZXMuZ2V0SmF2YVByb2plY3QocHJvamVjdCk7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3RzW10gPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcm9vdHNbaV07Ci0JCQkJCQlpZiAoIXJvb3QuaXNBcmNoaXZlKCkpIHsKLQkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJCQkJCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCQkJU3RyaW5nIHJvb3RGb2xkZXIgPSBwYXRoLnNlZ21lbnQoMSk7Ci0JCQkJCQkJCWlmICh3ZWJDb250ZW50TmFtZS5lcXVhbHMocm9vdEZvbGRlcikpIHsKLQkJCQkJCQkJCWlmIChyb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkKLQkJCQkJCQkJCQlyZXR1cm4gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRm9sZGVyX25hbWVfY2Fubm90X2JlX3RoZV9zYW1lX2FzX0phdmFfc291cmNlX2ZvbGRlcl81OyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCQkJCXJldHVybiBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Gb2xkZXJfbmFtZV9jYW5ub3RfYmVfdGhlX3NhbWVfYXNfSmF2YV9jbGFzc19mb2xkZXJfNjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBVcGRhdGUgZ2l2ZW4gd2ViIG5hdHVyZSB0byB0aGUgY3VycmVudCB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcGFyYW0gd2ViTmF0dXJlCi0JICogICAgICAgICAgICBUaGUgd2ViIE5hdHVyZSB0aGF0IHNob3VsZCBiZSBleGFtaW5lZC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdW5uZWNlc3NhcnkuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiB0aGF0IG9jY3VyZWQgZHVyaW5nIHRoZSB2ZXJzaW9uIGNoYW5nZSBvcGVyYXRpb24uCi0JICovCi0JLyoKLQkgKiBzdGF0aWMgcHVibGljIGJvb2xlYW4gdXBkYXRlTmF0dXJlVG9DdXJyZW50VmVyc2lvbihKMkVFV2ViTmF0dXJlUnVudGltZSB3ZWJOYXR1cmUpIHRocm93cwotCSAqIENvcmVFeGNlcHRpb24gewotCSAqIAotCSAqIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCSAqIAotCSAqIGlmICh3ZWJOYXR1cmUuZ2V0VmVyc2lvbigpICE9IFdFQi5DVVJSRU5UX1ZFUlNJT04pIHsKLQkgKiB3ZWJOYXR1cmUuc2V0VmVyc2lvbihKMkVFU2V0dGluZ3MuQ1VSUkVOVF9WRVJTSU9OKTsgc3VjY2VzcyA9IHRydWU7IH0KLQkgKiAoKEoyRUVNb2R1bGVXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKQotCSAqIHdlYk5hdHVyZS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpKS5yZWNvbXB1dGVDb250YWluZXJzSWZOZWNlc3NhcnkoKTsKLQkgKiAKLQkgKiByZXR1cm4gc3VjY2VzczsgfQotCSAqLwotCi0JLyoqCi0JICogTW92ZSB0aGUgb2xkIHNvdXJjZSBmb2xkZXIgdG8gdGhlIG5ldyBkZWZhdWx0IGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIFdlYiBQcm9qZWN0IHdlIGFyZSB3b3JraW5nIHdpdGguCi0JICogQHBhcmFtIG9sZFNvdXJjZUZvbGRlcgotCSAqICAgICAgICAgICAgVGhlIG9sZCAiSmF2YSBTb3VyY2UiIGZvbGRlciB0aGF0IHdpbGwgYmUgbW92ZWQuCi0JICogQHBhcmFtIGphdmFTb3VyY2VOYW1lCi0JICogICAgICAgICAgICBUaGUgbmV3IG5hbWUgb2YgdGhlICJKYXZhIFNvdXJjZSIgZm9sZGVyLCBvciBudWxsIGZvciBkZWZhdWx0LgotCSAqIEByZXR1cm4gVGhlIGxvY2F0aW9uIG9mIHRoZSBuZXcgZm9sZGVyLCBvciBudWxsIGlmIG5vIG1vdmUgd2FzIG5lY2Vzc2FyeS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIHRoYXQgb2NjdXJlZCBkdXJpbmcgdGhlIG1vdmUgb3BlcmF0aW9uLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgSUNvbnRhaW5lciB1cGRhdGVKYXZhU291cmNlTmFtZShJUHJvamVjdCBwcm9qZWN0LCBJQ29udGFpbmVyIG9sZFNvdXJjZUZvbGRlciwgU3RyaW5nIGphdmFTb3VyY2VOYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29udGFpbmVyIG5ld1NvdXJjZUZvbGRlciA9IG51bGw7Ci0JCWlmIChvbGRTb3VyY2VGb2xkZXIgIT0gbnVsbCkgewotCQkJSVBhdGggbmV3UGF0aDsKLQkJCWlmIChqYXZhU291cmNlTmFtZSA9PSBudWxsKQotCQkJCW5ld1BhdGggPSBuZXcgUGF0aChERUZBVUxUX0pBVkFfU09VUkNFX05BTUUpOwotCQkJZWxzZQotCQkJCW5ld1BhdGggPSBuZXcgUGF0aChqYXZhU291cmNlTmFtZSk7Ci0KLQkJCS8vIE1ha2Ugc3VyZSBuZXcgcGF0aCBpcyBkaWZmZXJlbnQgZm9ybSBvbGQgcGF0aAotCQkJaWYgKCFwcm9qZWN0LmdldEZvbGRlcihuZXdQYXRoKS5nZXRGdWxsUGF0aCgpLmVxdWFscyhvbGRTb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQlvbGRTb3VyY2VGb2xkZXIubW92ZShuZXdQYXRoLCBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSkpOwotCQkJCUplbVByb2plY3RVdGlsaXRpZXMucmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgocHJvamVjdCwgb2xkU291cmNlRm9sZGVyKTsKLQkJCQluZXdTb3VyY2VGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihuZXdQYXRoKTsKLQkJCQlKZW1Qcm9qZWN0VXRpbGl0aWVzLmFwcGVuZEphdmFDbGFzc1BhdGgocHJvamVjdCwgSmF2YUNvcmUubmV3U291cmNlRW50cnkocHJvamVjdC5nZXRGb2xkZXIobmV3UGF0aCkuZ2V0RnVsbFBhdGgoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdTb3VyY2VGb2xkZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXQgdGhlIHNvdXJjZSBmb2xkZXIgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgbWlncmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgV2ViIFByb2plY3QgdG8gZXhhbWluZS4KLQkgKiBAcmV0dXJuIFRoZSBzb3VyY2UgZm9sZGVyIHRvIHVzZSBpbiBtaWdyYXRpb24sIG9yIG51bGwgaWYgaXQgc2hvdWxkIGJlIHNraXBwZWQuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBJQ29udGFpbmVyIGdldEphdmFTb3VyY2VGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHNvdXJjZVJvb3RzID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRTb3VyY2VDb250YWluZXJzKHByb2plY3QpOwotCQlJQ29udGFpbmVyIG9sZFNvdXJjZUZvbGRlciA9IG51bGw7Ci0KLQkJaWYgKHNvdXJjZVJvb3RzICE9IG51bGwpIHsKLQkJCWlmIChzb3VyY2VSb290cy5zaXplKCkgPT0gMSkgewotCQkJCUlDb250YWluZXIgc291cmNlRm9sZGVyID0gKElDb250YWluZXIpIHNvdXJjZVJvb3RzLmdldCgwKTsKLQkJCQlpZiAoc291cmNlRm9sZGVyIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQlvbGRTb3VyY2VGb2xkZXIgPSBzb3VyY2VGb2xkZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBvbGRTb3VyY2VGb2xkZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRm9sZGVyIGdldE1vZHVsZVNlcnZlclJvb3QoSVByb2plY3QgcHJvamVjdCkgewotCQkvLyBUT0RPIG5lZWQgdG8gaW1wbGVtZW50IG1vZHVsZSBzZXJ2ZXIgcm9vdCBwcm9wZXJseQotCQlJUGF0aCBjb21wUm9vdFBhdGggPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KS5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJcmV0dXJuIHByb2plY3QuZ2V0Rm9sZGVyKGNvbXBSb290UGF0aCk7Ci0JCS8vcmV0dXJuIHByb2plY3QuZ2V0Rm9sZGVyKCJXZWJDb250ZW50Iik7Ci0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxGb2xkZXIgZ2V0V2ViTGliRm9sZGVyKElWaXJ0dWFsQ29tcG9uZW50IHdlYkNvbXBvbmVudCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJfSU5GICsgIi8iICsgImxpYiIpOwotCQlJVmlydHVhbEZvbGRlciBsaWJGb2xkZXIgPSB3ZWJDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcihwYXRoKTsKLQkJcmV0dXJuIGxpYkZvbGRlcjsKLQl9Ci0KLQkvL1RPRE8gZGVsZXRlIGpzaG9sbAotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRXZWJMaWJGb2xkZXIoSVZpcnR1YWxDb21wb25lbnQgd2ViQ29tcG9uZW50KQotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRXZWJMaWJGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0V2ViTGliRm9sZGVyKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7Ci0JfQotCi0JLy8JCi0JLy8gc3RhdGljIHB1YmxpYyBib29sZWFuIGlzSW1wb3J0ZWRDbGFzc2VzSkFSRmlsZUluTGliRGlyKElSZXNvdXJjZSByZXNvdXJjZSkgewotCS8vIGlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5leGlzdHMoKSkKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gcmV0dXJuIHJlc291cmNlLmdldFR5cGUoKSA9PSByZXNvdXJjZS5GSUxFICYmCi0JLy8gcmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKElXZWJOYXR1cmVDb25zdGFudHMuSU1QT1JURURfQ0xBU1NFU19TVUZGSVgpICYmIGlzWmlwKHJlc291cmNlKTsKLQkvLyB9Ci0JLy8JCi0JLy8gc3RhdGljIHB1YmxpYyBib29sZWFuIGlzTGliRGlySkFSRmlsZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkvLyBpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCAhcmVzb3VyY2UuZXhpc3RzKCkpCi0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIHJldHVybiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gcmVzb3VyY2UuRklMRSAmJiBpc1ppcChyZXNvdXJjZSk7Ci0JLy8gfQotCS8vCQotCS8vIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc1ppcChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkvLyBTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCS8vIFppcEZpbGUgemlwID0gbnVsbDsKLQkvLwotCS8vIHRyeSB7Ci0JLy8gemlwID0gbmV3IFppcEZpbGUocGF0aCk7Ci0JLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gbm90QVppcCkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9IGZpbmFsbHkgewotCS8vIGlmICh6aXAgIT0gbnVsbCkgewotCS8vIHRyeSB7Ci0JLy8gemlwLmNsb3NlKCk7Ci0JLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHt9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gemlwICE9IG51bGw7Ci0JLy8gfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvV2ViVG9vbGluZ0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJUb29saW5nRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MGJmODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJUb29saW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLS8qKgotICogVGhlIFdlYlRvb2xpbmdFeGNlcHRpb24gY2xhc3MgaXMgdGhlIGdlbmVyaWMgY2xhc3MgZm9yIGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSB3ZWIgdG9vbGluZy4KLSAqLwotcHVibGljIGNsYXNzIFdlYlRvb2xpbmdFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBWF9FUlJPUl9NRVNTQUdFID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuT3BlcmF0aW9uX2ZhaWxlZF9kdWVfdG9fU0FfRVJST1JfOyAvLyROT04tTkxTLTEkID0gIk9wZXJhdGlvbiBmYWlsZWQgZHVlIHRvIFNBWCBlcnJvcjogIgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElPX0VSUk9SX01FU1NBR0UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5PcGVyYXRpb25fZmFpbGVkX2R1ZV90b19JT19FUlJPUl87IC8vJE5PTi1OTFMtMSQgPSAiT3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gSU8gZXJyb3I6ICIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0VSUk9SX01FU1NBR0UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5PcGVyYXRpb25fZmFpbGVkX2R1ZV90b19Db19FUlJPUl87IC8vJE5PTi1OTFMtMSQgPSAiT3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gQ29yZSBlcnJvcjogIgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTU9ERUxfRVJST1JfTUVTU0FHRSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLk9wZXJhdGlvbl9mYWlsZWRfZHVlX3RvX0phX0VSUk9SXzsgLy8kTk9OLU5MUy0xJCA9ICJPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBKYXZhIE1vZGVsIGVycm9yOiAiCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgV2ViVG9vbGluZ0V4Y2VwdGlvbiB3aXRoIG5vIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFdlYlRvb2xpbmdFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciBmb3IgYSBzdXBwbGllZCBJTyBFeGNlcHRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBXZWJUb29saW5nRXhjZXB0aW9uKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQl0aGlzKElPX0VSUk9SX01FU1NBR0UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFdlYlRvb2xpbmdFeGNlcHRpb24gd2l0aCBlcnJvciBtZXNzYWdlIG9mIHMuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgV2ViVG9vbGluZ0V4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyIHdpdGggdGhlIHN1cHBsaWVkIHByZWFtYmxlIGFuZCB0aGUgbWVzc2FnZSBvZiB0aGUKLQkgKiBleGFtcGxlIGFwcGVuZGVkIHRvIHRoZSBlbmQuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgV2ViVG9vbGluZ0V4Y2VwdGlvbihTdHJpbmcgcHJlYW1ibGUsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJdGhpcyhwcmVhbWJsZSArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgZm9yIGEgc3VwcGxpZWQgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgV2ViVG9vbGluZ0V4Y2VwdGlvbihDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQl0aGlzKENPUkVfRVJST1JfTUVTU0FHRSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyIGZvciBhIHN1cHBsaWVkIEphdmFNb2RlbEV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgV2ViVG9vbGluZ0V4Y2VwdGlvbihKYXZhTW9kZWxFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCXRoaXMoSkFWQV9NT0RFTF9FUlJPUl9NRVNTQUdFLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgZm9yIGEgc3VwcGxpZWQgU0FYIEV4Y2VwdGlvbgotCSAqIAotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIFNBWEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBXZWJUb29saW5nRXhjZXB0aW9uKFNBWEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJdGhpcyhTQVhfRVJST1JfTUVTU0FHRSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1dlYlRvb2xpbmdUZW1wbGF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJUb29saW5nVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5ZjYwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1dlYlRvb2xpbmdUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9uczsKLQotcHVibGljIGludGVyZmFjZSBXZWJUb29saW5nVGVtcGxhdGUgewotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzYvMjAwMCA3OjM1OjM4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBUZW1wbGF0ZURhdGEKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlKFRlbXBsYXRlRGF0YSBkYXRhKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi91dGlsL1dlYkFydGlmYWN0RWRpdFV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdXRpbC9XZWJBcnRpZmFjdEVkaXRVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwMjJmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi91dGlsL1dlYkFydGlmYWN0RWRpdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFdlYkFydGlmYWN0RWRpdFV0aWxpdGllcyB7Ci0JCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBnZXRXZWJDb21wb25lbnQoU2VydmxldCBzZXJ2bGV0KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2VydmxldCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJV2ViQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJCQllZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJCQkJV2ViQXBwIHdlYmFwcCA9IGVkaXQuZ2V0V2ViQXBwKCk7Ci0JCQkJCWlmICh3ZWJhcHAuZ2V0U2VydmxldE5hbWVkKHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKSkgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBjb21wb25lbnQ7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZWRpdCAhPSBudWxsKQotCQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi91dGlsL1dlYkVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdXRpbC9XZWJFZGl0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1NGE5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi91dGlsL1dlYkVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotCi0KLS8qKgotICogPHA+Ci0gKiBBZGFwdHMge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfXMgdG8KLSAqIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi51dGlsLldlYkFydGlmYWN0RWRpdH0mbmJzcDsgZmFjYWRlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdlYkVkaXRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBXZWJBcnRpZmFjdEVkaXQuQURBUFRFUl9UWVBFIHx8IGFkYXB0ZXJUeXBlID09IEFydGlmYWN0RWRpdC5BREFQVEVSX1RZUEUpIHsKLQkJCUFydGlmYWN0RWRpdE1vZGVsIGVkaXRNb2RlbCA9IChBcnRpZmFjdEVkaXRNb2RlbCkgYWRhcHRhYmxlT2JqZWN0OwotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoZWRpdE1vZGVsLmdldFByb2plY3QoKSkpCi0JCQkJcmV0dXJuIG5ldyBXZWJBcnRpZmFjdEVkaXQoKEFydGlmYWN0RWRpdE1vZGVsKSBhZGFwdGFibGVPYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tde0FydGlmYWN0RWRpdC5jbGFzcywgV2ViQXJ0aWZhY3RFZGl0LmNsYXNzfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9jb21wb25lbnRjb3JlL3V0aWwvV2ViQXJ0aWZhY3RFZGl0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9jb21wb25lbnRjb3JlL3V0aWwvV2ViQXJ0aWZhY3RFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZWFhNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvY29tcG9uZW50Y29yZS91dGlsL1dlYkFydGlmYWN0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkVudGVycHJpc2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LldlYlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSUFydGlmYWN0RWRpdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi0KLQotLyoqCi0gKiA8cD4KLSAqIFdlYkFydGlmYWN0RWRpdCBvYnRhaW5zIGEgV2ViIERlcGxveW1lbnQgRGVzY3JpcHRvciBtZXRhbW9kZWwgc3BlY2lmZWMgZGF0YSBmcm9tIGEKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcFJlc291cmNlfSZuYnNwOyB3aGljaCBzdG9yZXMgdGhlIG1ldGFtb2RlbC4gVGhlCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHBSZXNvdXJjZX0mbmJzcDtpcyByZXRyaWV2ZWQgZnJvbSB0aGUKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5BcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDt1c2luZyBhIGNvbnN0YW50IHtAc2VlCi0gKiBKMkVFQ29uc3RhbnRzI1dFQkFQUF9ERF9VUklfT0JKfS4gVGhlIGRlZmluZWQgbWV0aG9kcyBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YKLSAqIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGltcGxlbWVudHMgSUFydGlmYWN0RWRpdEZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9DT05URU5UX1RZUEUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViREQiOwotCS8qKgotCSAqIDxwPgotCSAqIElkZW50aWZpZXIgdXNlZCB0byBsaW5rIFdlYkFydGlmYWN0RWRpdCB0byBhIFdlYkVkaXRBZGFwdGVyRmFjdG9yeSB7QHNlZQotCSAqIFdlYkVkaXRBZGFwdGVyRmFjdG9yeX0gc3RvcmVkIGluIGFuIEFkYXB0ZXJNYW5nZXIgKEBzZWUgQWRhcHRlck1hbmFnZXIpCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gV2ViQXJ0aWZhY3RFZGl0LmNsYXNzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9DT05URU5UID0gIldlYkNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfSU5GID0gIk1FVEEtSU5GIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBJUGF0aCBXRUJMSUIgPSBuZXcgUGF0aCgiL1dFQi1JTkYvbGliIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBXZWJBcnRpZmFjdEVkaXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFdlYkFydGlmYWN0RWRpdChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCXN1cGVyKGFNb2R1bGUpOwotCX0KLQotCXByb3RlY3RlZCBCaW5hcnlDb21wb25lbnRIZWxwZXIgaW5pdEJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBiaW5hcnlNb2R1bGUpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIoYmluYXJ5TW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYUhhbmRsZQotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBXZWJBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFIYW5kbGUKLQkgKiBAcGFyYW0gdG9BY2Nlc3NBc1JlYWRPbmx5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgV2ViQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSwgYm9vbGVhbiBmb3JDcmVhdGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihhUHJvamVjdCwgdG9BY2Nlc3NBc1JlYWRPbmx5LCBmb3JDcmVhdGUsIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYUhhbmRsZQotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBXZWJBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5LCBib29sZWFuIGZvckNyZWF0ZSwgU3RyaW5nIGVkaXRNb2RlbElEKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSwgZm9yQ3JlYXRlLCBlZGl0TW9kZWxJRCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbQotCSAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmcgY29udGVudAotCSAqICAgICAgICAgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYkFydGlmYWN0RWRpdCBnZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdlYkFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGlzVmFsaWRXZWJNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoYVByb2plY3QpKSkKLQkJCQlhcnRpZmFjdEVkaXQgPSBuZXcgV2ViQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCB0cnVlLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYkFydGlmYWN0RWRpdCBnZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZShJUHJvamVjdCBhUHJvamVjdCkgewotCQlXZWJBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChpc1ZhbGlkV2ViTW9kdWxlKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KSkpCi0JCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IFdlYkFydGlmYWN0RWRpdChhUHJvamVjdCwgZmFsc2UsIGZhbHNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIFdlYkFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMKLQkgKiBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV2ViQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFdlYkFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGNvdWxkIG5vdCByZXNvbHZlIHVyaS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYkFydGlmYWN0RWRpdCBnZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYgKGFNb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoYU1vZHVsZS5pc0JpbmFyeSgpKSB7Ci0JCQlyZXR1cm4gbmV3IFdlYkFydGlmYWN0RWRpdChhTW9kdWxlKTsKLQkJfQotCi0JCXJldHVybiBnZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKGFNb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgV2ViQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcwotCSAqIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXZWJBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFdlYkFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJBcnRpZmFjdEVkaXQgZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlpZiAoYU1vZHVsZSA9PSBudWxsIHx8IGFNb2R1bGUuaXNCaW5hcnkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoYU1vZHVsZS5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiAgICAgICAgICAgIEEge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKFdvcmtiZW5jaENvbXBvbmVudCl9YW5kIHRoZSBtb2R1bGVUeXBlSWQgaXMKLQkgKiAgICAgICAgIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV2ViTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1ZhbGlkRWRpdGFibGVNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGFNb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQXJ0aWZhY3RFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgV2ViQXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Zm9yIGFuIGFjY2Vzc2libGUgcHJvamVjdAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1wb2ludGluZyB0byBhIG1vZHVsZSBmcm9tIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0KLQkgKi8KLQlwcm90ZWN0ZWQgV2ViQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0KLQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIEoyRUUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIFdlYkFwcFJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYSBKMkVFIFNwZWMgdmVyc2lvbgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oKSB7Ci0JCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwotCQlyZXR1cm4gKChXZWJBcHBSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogT2J0YWlucyB0aGUgV2ViQXBwIChAc2VlIFdlYkFwcCkgcm9vdCBvYmplY3QgZnJvbSB0aGUgV2ViQXBwUmVzb3VyY2UuIElmIHRoZSByb290IG9iamVjdCBkb2VzCi0JICogbm90IGV4aXN0LCB0aGVuIG9uZSBpcyBjcmVhdGVkIChAbGluayBhZGRXZWJBcHBJZk5lY2Vzc2FyeShnZXRXZWJBcHBsaWNhdGlvblhtaVJlc291cmNlKCkpKS4KLQkgKiBUaGUgcm9vdCBvYmplY3QgY29udGFpbnMgYWxsIG90aGVyIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICogCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJTGlzdCBjb250ZW50cyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRDb250ZW50cygpOwotCQlpZiAoY29udGVudHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCQlpZiAoaXNCaW5hcnkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJYWRkV2ViQXBwSWZOZWNlc3NhcnkoKFdlYkFwcFJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpOwotCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgZnJvbSB0aGUgQXJ0aWZhY3RFZGl0TW9kZWwgdXNpbmcgZGVmaW5lZCBVUkkuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7Ci0JCWlmIChpc0JpbmFyeSgpKSB7Ci0JCQlyZXR1cm4gZ2V0QmluYXJ5Q29tcG9uZW50SGVscGVyKCkuZ2V0UmVzb3VyY2UoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJX09CSik7Ci0JCX0KLQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJX09CSik7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIFNlcnZsZXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBkZXJpdmVkIGZyb20gdGhlIHtAc2VlIFdlYkFwcFJlc291cmNlfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kdWxlIHZlcnNpb24KLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNlcnZsZXRWZXJzaW9uKCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJcmV0dXJuICgoV2ViQXBwUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkuZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBmb3IgdGhlIEpTUCBzcGVjaWZpY2F0aW9uIGxldmVsIGFzc29jaWF0ZWQKLQkgKiB3aXRoIHRoZSBKMkVFIHZlcnNpb24gZm9yIHRoaXMgd29ya2JlbmNoIG1vZHVsZS4gVGhpcyBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIG51bGwgYW5kIHJldHVybnMKLQkgKiAyMCBhcyBkZWZhdWx0LgotCSAqIAotCSAqIEBzZWUgV2ViQXJ0aWZhY3RFZGl0I2dldFNlcnZsZXRWZXJzaW9uKCkKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIEpTUCBsZXZlbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SlNQVmVyc2lvbigpIHsKLQkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7Ci0JCWludCBzZXJ2bGV0VmVyc2lvbiA9IGdldFNlcnZsZXRWZXJzaW9uKCk7Ci0JCWlmIChzZXJ2bGV0VmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpTUF8xXzFfSUQ7Ci0JCWVsc2UgaWYgKHNlcnZsZXRWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpCi0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSlNQXzFfMl9JRDsKLQkJZWxzZQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpTUF8yXzBfSUQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IG9iamVjdCAoV2ViQXBwKSBhbmQgcG9wdWxhdGVzIHdpdGggZGF0YS4gQWRkcyB0aGUgcm9vdAotCSAqIG9iamVjdCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBwb2ludGluZyB0byBhIHtAc2VlIFhNTFJlc291cmNlfQotCSAqIEBwYXJhbSB2ZXJzaW9uCi0JICogICAgICAgICAgICBWZXJzaW9uIHRvIGJlIHNldCBvbiByZXNvdXJjZS4uLi5pZiBudWxsIGRlZmF1bHQgaXMgdGFrZW4KLQkgKiAKLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXZWJBcHBJZk5lY2Vzc2FyeShYTUxSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7Ci0JCWlmIChpc0JpbmFyeSgpKSB7Ci0JCQl0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpOwotCQl9Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJaWYgKGFSZXNvdXJjZS5nZXRDb250ZW50cygpID09IG51bGwgfHwgYVJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJV2ViQXBwIHdlYkFwcE5ldyA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2ViQXBwKCk7Ci0JCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHdlYkFwcE5ldyk7Ci0JCQkJYVJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCQkJfQotCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIGFSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCVVSSSBtb2R1bGVVUkkgPSBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldE1vZHVsZVVSSSgpOwotCQkJdHJ5IHsKLQkJCQl3ZWJBcHAuc2V0RGlzcGxheU5hbWUoU3RydWN0dXJlRWRpdC5nZXREZXBsb3llZE5hbWUobW9kdWxlVVJJKSk7Ci0JCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZ25vcmUKLQkJCX0KLQkJCWFSZXNvdXJjZS5zZXRJRCh3ZWJBcHAsIEoyRUVDb25zdGFudHMuV0VCQVBQX0lEKTsKLQotCQkJV2VsY29tZUZpbGVMaXN0IHdMaXN0ID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZUxpc3QoKTsKLQkJCUxpc3QgZmlsZXMgPSB3TGlzdC5nZXRGaWxlKCk7Ci0JCQlXZWxjb21lRmlsZSBmaWxlID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZSgpOwotCQkJZmlsZS5zZXRXZWxjb21lRmlsZSgiaW5kZXguaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCQlmaWxlID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZSgpOwotCQkJZmlsZS5zZXRXZWxjb21lRmlsZSgiaW5kZXguaHRtIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJCWZpbGUgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlbGNvbWVGaWxlKCk7Ci0JCQlmaWxlLnNldFdlbGNvbWVGaWxlKCJpbmRleC5qc3AiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmlsZXMuYWRkKGZpbGUpOwotCQkJZmlsZSA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2VsY29tZUZpbGUoKTsKLQkJCWZpbGUuc2V0V2VsY29tZUZpbGUoImRlZmF1bHQuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCQlmaWxlID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZSgpOwotCQkJZmlsZS5zZXRXZWxjb21lRmlsZSgiZGVmYXVsdC5odG0iKTsgLy8kTk9OLU5MUy0xJAotCQkJZmlsZXMuYWRkKGZpbGUpOwotCQkJZmlsZSA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2VsY29tZUZpbGUoKTsKLQkJCWZpbGUuc2V0V2VsY29tZUZpbGUoImRlZmF1bHQuanNwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJCQotCQkJd2ViQXBwLnNldEZpbGVMaXN0KHdMaXN0KTsKLQkJCQotCQkJdHJ5IHsKLQkJCQlhUmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7Ci0JCQl9IGNhdGNoIChqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGV4KSB7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UgZm9yIHRoZSBhc3NvY2lhdGVkCi0JICogd29ya2JlbmNoIG1vZHVsZS4gVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgV2ViQXJ0aWZhY3RFZGl0I2dldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZ1bGwgSVBhdGggZm9yIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0RGVwbG95bWVudERlc2NyaXB0b3JQYXRoKCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCXJldHVybiBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgdGhlIHdlYiBhcHAgcmVzb3VyY2UsIGNyZWF0ZSBpdCBpZiBuZWNlc3NhcnksIGFkZCBnZXQgdGhlIHJvb3QKLQkgKiBvYmplY3QsIHRoZSB3ZWIgYXBwIG91dCBvZiB0aGF0IHdlYiBhcHAgcmVzb3VyY2UuIEl0IHdpbGwgY3JlYXRlIHRoZSB3ZWIgYXBwIGluc3RhbmNlIGlmIG5lZWQKLQkgKiBiZSwgYW5kIGFkZCBpdCB0byB0aGUgd2ViIHJlc291cmNlLiBUaGVuLCBpdCByZXR1cm5zIHRoZSB3ZWIgYXBwIG9iamVjdCBhcyB0aGUgbW9kZWwgcm9vdC4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIEVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlT2JqZWN0IGluc3RhbmNlIG9mIHRoZSBtb2RlbCByb290Ci0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIHRoZSB3ZWIgYXBwIHJlc291cmNlLCBjcmVhdGUgaXQgaWYgbmVjZXNzYXJ5LCBhZGQgZ2V0IHRoZSByb290Ci0JICogb2JqZWN0LCBzZXQgdmVyc2lvbiB0aGUgd2ViIGFwcCBvdXQgb2YgdGhhdCB3ZWIgYXBwIHJlc291cmNlLiBJdCB3aWxsIGNyZWF0ZSB0aGUgd2ViIGFwcAotCSAqIGluc3RhbmNlIGlmIG5lZWQgYmUsIGFuZCBhZGQgaXQgdG8gdGhlIHdlYiByZXNvdXJjZS4gVGhlbiwgaXQgcmV0dXJucyB0aGUgd2ViIGFwcCBvYmplY3QgYXMKLQkgKiB0aGUgbW9kZWwgcm9vdC4gVGhpcyBtZXRob2Qgd2lsbCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdCgpCi0JICogCi0JICogQHJldHVybiB0aGUgZU9iamVjdCBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgcm9vdAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdChpbnQgdmVyc2lvbikgewotCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKLQkJaWYgKGlzQmluYXJ5KCkpIHsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkJV2ViQXBwUmVzb3VyY2UgcmVzID0gKFdlYkFwcFJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXJlcy5zZXRNb2R1bGVWZXJzaW9uSUQodmVyc2lvbik7Ci0JCWFkZFdlYkFwcElmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiByZXMuZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogdXNlIHtAbGluayBXZWJVdGlsaXRpZXN9e0BsaW5rICNnZXRMaWJNb2R1bGVzKCl9Ci0JICovCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0TGliTW9kdWxlcygpIHsKLQkJcmV0dXJuIFdlYlV0aWxpdGllcy5nZXRMaWJNb2R1bGVzKGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBhZGQgdGhlIGRlcGVuZGVudCBtb2R1bGVzIGZyb20gdGhlIHBhc3NlZCBpbiBhcnJheSB0byB0aGUgZGVwZW5kZW50bW9kdWxlcwotCSAqIGxpc3Qgb2YgdGhlIGFzc29jaWF0ZWQgd29ya2JlbmNoIG1vZHVsZS4gSXQgd2lsbCBlbnN1cmUgYSBudWxsIGlzIG5vdCBwYXNzZWQgYW5kIGl0IHdpbGwKLQkgKiBlbnN1cmUgdGhlIGRlcGVuZGVudCBtb2R1bGVzIGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgbGlzdC4KLQkgKiAKLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGliTW9kdWxlcwotCSAqICAgICAgICAgICAgYXJyYXkgb2YgZGVwZW5kZW50IG1vZHVsZXMgdG8gYWRkIGFzIHdlYiBsaWJyYXJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaWJNb2R1bGVzKFJlZmVyZW5jZWRDb21wb25lbnRbXSBsaWJNb2R1bGVzKSB7Ci0JCS8vIFRPRE8gLSBOZWVkIHRvIGltcGxlbWVudAotCQkvLyBpZiAobGliTW9kdWxlcz09bnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyBmb3IgKGludCBpPTA7IGk8bGliTW9kdWxlcy5sZW5ndGg7IGkrKykgewotCQkvLyBpZiAoIW1vZHVsZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpLmNvbnRhaW5zKGxpYk1vZHVsZXNbaV0pKQotCQkvLyBtb2R1bGUuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKS5hZGQobGliTW9kdWxlc1tpXSk7Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIHRoZSBjb250ZXh0IHJvb3QgZm9yIHRoaXMgd2ViIHByb2plY3QncyAuY29tcG9uZW50IGZpbGUuIEl0IGlzCi0JICogbWVhbnQgdG8gaGFuZGxlIGEgc3RhbmRhbG9uZSB3ZWIgY2FzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbnRleHRSb290IFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyQ29udGV4dFJvb3QoKSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTZXJ2ZXJDb250ZXh0Um9vdChnZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgdGhlIGNvbnRleHQgcm9vdCBmb3IgdGhpcyB3ZWIgcHJvamVjdCBpbiB0aGUgYXNzb2NpYXRlZCBwYXJhbWV0ZXIncwotCSAqIGFwcGxpY2F0aW9uLnhtbC4gSWYgdGhlIGVhclByb2plY3QgaXMgbnVsbCwgdGhlbiB0aGUgY29udGV4dFJvb3QgZnJvbSB0aGUgLmNvbXBvbmVudCBvZiB0aGUKLQkgKiB3ZWIgcHJvamVjdCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWFyUHJvamVjdAotCSAqIEByZXR1cm4gY29udGV4dFJvb3QgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJDb250ZXh0Um9vdChJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JCWlmIChlYXJQcm9qZWN0ID09IG51bGwgfHwgIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJQcm9qZWN0KSkKLQkJCXJldHVybiBnZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwotCQlFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG51bGw7Ci0JCVN0cmluZyBjb250ZXh0Um9vdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQlpZiAoZWFyRWRpdCAhPSBudWxsKQotCQkJCWNvbnRleHRSb290ID0gZWFyRWRpdC5nZXRXZWJDb250ZXh0Um9vdChnZXRQcm9qZWN0KCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVhckVkaXQgIT0gbnVsbCkKLQkJCQllYXJFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gY29udGV4dFJvb3Q7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIGNvbnRleHQgcm9vdCBmb3IgdGhpcyB3ZWIgcHJvamVjdCBvbiB0aGUgRUFSIHdoaWNoIGlzIHBhc3NlZCBpbi4KLQkgKiBJZiBubyBFQVIgaXMgcGFzc2VkIHRoZSAuY29tcG9uZW50IGZpbGUgZm9yIHRoZSB3ZWIgcHJvamVjdCB3aWxsIGJlIHVwZGF0ZWQuCi0JICogCi0JICogQHBhcmFtIGVhclByb2plY3QKLQkgKiBAcGFyYW0gYUNvbnRleHRSb290Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmVyQ29udGV4dFJvb3QoSVByb2plY3QgZWFyUHJvamVjdCwgU3RyaW5nIGFDb250ZXh0Um9vdCkgewotCQlpZiAoZWFyUHJvamVjdCA9PSBudWxsIHx8ICFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoZWFyUHJvamVjdCkpCi0JCQlzZXRTZXJ2ZXJDb250ZXh0Um9vdChhQ29udGV4dFJvb3QpOwotCQlFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvcldyaXRlKGVhclByb2plY3QpOwotCQkJaWYgKGVhckVkaXQgIT0gbnVsbCkKLQkJCQllYXJFZGl0LnNldFdlYkNvbnRleHRSb290KGdldFByb2plY3QoKSwgYUNvbnRleHRSb290KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlYXJFZGl0ICE9IG51bGwpIHsKLQkJCQllYXJFZGl0LnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQllYXJFZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGNvbnRleHQgcm9vdCBwcm9wZXJ0eSBvbiB0aGUgd2ViIHByb2plY3QncyAuY29tcG9uZW50IGZpbGUgZm9yIHRoZQotCSAqIHN0YW5kYWxvbmUgY2FzZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dFJvb3QKLQkgKiAgICAgICAgICAgIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlckNvbnRleHRSb290KFN0cmluZyBjb250ZXh0Um9vdCkgewotCQlKMkVFUHJvamVjdFV0aWxpdGllcy5zZXRTZXJ2ZXJDb250ZXh0Um9vdChnZXRQcm9qZWN0KCksIGNvbnRleHRSb290KTsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gV2ViQXBwCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwotCi0JCXJldHVybiAoV2ViQXBwKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQl9Ci0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBnZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKGFDb21wb25lbnQpOwotCX0KLQotCi0JcHVibGljIEFydGlmYWN0RWRpdCBjcmVhdGVBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBnZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZShhQ29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZSBhc0FyY2hpdmUoYm9vbGVhbiBpbmNsdWRlU291cmNlLCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlyZXR1cm4gYXNBcmNoaXZlKGluY2x1ZGVTb3VyY2UsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzLCBmYWxzZSk7Ci0JfQotCXB1YmxpYyBBcmNoaXZlIGFzQXJjaGl2ZShib29sZWFuIGluY2x1ZGVTb3VyY2UsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMsIGJvb2xlYW4gcmVhZE9ubHkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwotCQlpZiAoaXNCaW5hcnkoKSkgewotCQkJSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IChKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIpZ2V0QmluYXJ5Q29tcG9uZW50SGVscGVyKCk7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2Vzc0xlZ2FjeUFyY2hpdmUoKTsKLQkJfSBlbHNlIHsKLQkJCVdlYkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwgbG9hZGVyID0gbmV3IFdlYkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwoZ2V0Q29tcG9uZW50KCksIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKLQkJCWxvYWRlci5zZXRFeHBvcnRTb3VyY2UoaW5jbHVkZVNvdXJjZSk7Ci0JCQlsb2FkZXIuc2V0UmVhZE9ubHkocmVhZE9ubHkpOwotCQkJU3RyaW5nIHVyaSA9IE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKGdldENvbXBvbmVudCgpKTsKLQkJCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJCW9wdGlvbnMuc2V0TG9hZFN0cmF0ZWd5KGxvYWRlcik7Ci0JCQlvcHRpb25zLnNldElzUmVhZE9ubHkocmVhZE9ubHkpOwotCQkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuV0FSRmlsZShvcHRpb25zLCB1cmkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QsIGludCB2ZXJzaW9uKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbmV3IFdlYkFydGlmYWN0RWRpdChwcm9qZWN0LCBmYWxzZSwgdHJ1ZSk7Ci0JCXRyeSB7Ci0JCQl3ZWJFZGl0LmNyZWF0ZU1vZGVsUm9vdCh2ZXJzaW9uKTsKLQkJCXdlYkVkaXQuc2F2ZShudWxsKTsKLQkJfSBmaW5hbGx5IHsgIC8vIE1ha2Ugc3VyZSBuZXcgcmVzb3VyY2UgaXMgcmVtb3ZlZCAgLSB0aGUgdXJpIHVzZWQgZm9yIGNyZWF0aW9uIHNob3VsZG4ndCBiZSBjYWNoZWQKLQkJCVJlc291cmNlIG5ld1JlcyA9IHdlYkVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpLmdldFJlc291cmNlcygpLnJlbW92ZShuZXdSZXMpOwotCQkJbmV3UmVzLnVubG9hZCgpOwotCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnkoUnVubmFibGUgcnVubmFibGUsIElQYXRoIG1vZGVsUGF0aCkgewotCQlzZXRXcml0YWJsZUVkaXQoZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKSk7Ci0JCXRyeXsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJaWYoIGdldFdyaXRhYmxlRWRpdCgpICE9IG51bGwgKXsKLQkJCQkvLyBBbHdheXMgc2F2ZSByZWdhcmRsZXNzIG9mIHJlc291cmNlIHBhdGggcGFzc2VkIC0gQXJ0aWZhY3RlZGl0cyBzYXZlIHJlc291cmNlcyBhcyBhIHVuaXQKLQkJCQlnZXRXcml0YWJsZUVkaXQoKS5zYXZlSWZOZWNlc3NhcnkoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgKTsKLQkJCX0KLQkJCQotCQl9ZmluYWxseXsKLQkJCWdldFdyaXRhYmxlRWRpdCgpLmRpc3Bvc2UoKTsKLQkJCXNldFdyaXRhYmxlRWRpdChudWxsKTsKLQkJfQotCX0KLQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSB7Ci0JCXJldHVybiBXRUJfQ09OVEVOVF9UWVBFOwotCX0KLQlwcm90ZWN0ZWQgVVJJIGdldFJvb3RVUkkoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUklfT0JKOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvY29tcG9uZW50Y29yZS91dGlsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvY29tcG9uZW50Y29yZS91dGlsL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTE3YzRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2NvbXBvbmVudGNvcmUvdXRpbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5XZWJBcnRpZmFjdEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgV2ViQXJ0aWZhY3RFZGl0IGFwaS4gVGhpcyBhcGkgaXMgdXNlZCB0byB3b3JrIHdpdGggdGhlIGVtZiBtb2RlbAotICAgICAgICBvZiBhIGZsZXhpYmxlIHdlYiBtb2R1bGUuIEl0IGNvbnRhaW5zIGFwaSB0byByZWFkIGFuZCBzZXJpYWxpemUgb3V0IHRoZSBlbWYgbW9kZWwgZm9yIHdlYiBhcHBsaWNhdGlvbnMuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9kYXRhbW9kZWwvcHJvcGVydGllcy9JQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2ZhZDkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVCA9ICJJQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY1Byb3BlcnRpZXMuUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX1RPX1dFQl9WRVJTSU9OID0gIklDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljUHJvcGVydGllcy5DT05WRVJUX1RPX1dFQl9WRVJTSU9OIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSVdlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lXZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTE1MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSVdlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLS8qKgotICogPHA+Ci0gKiBJV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSBJRGF0YU1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgCi0gKiBXZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci4KLSAqIE5PVEU6IFRoZSBhc3NvY2lhdGVkIFByb3ZpZGVyIGFuZCBPcGVyYXRpb25zIHdpbGwgYmUgY3JlYXRlZCBkdXJpbmcgTTUKLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXMKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMgewotICAgIC8qKgotICAgICAqIFJlcXVpcmVkLCB0eXBlIEJvb2xlYW4gZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gZXhwb3J0IGNvbXBpbGVkIEpTUCBmaWxlcwotICAgICAqIChjb21waWxlZCBmaWxlcyBleGlzdCBpbiAvV0VCLUlORi9jbGFzc2VzIGFzIC5jbGFzcyBhbmQgLmphdmFbZm9yIGRlYnVnXSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX0NPTVBJTEVfSlNQID0gIldlYkV4cG9ydERhdGFNb2RlbC5FWENMVURFX0NPTVBJTEVfSlNQIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9kYXRhbW9kZWwvcHJvcGVydGllcy9JV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4Njk3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9kYXRhbW9kZWwvcHJvcGVydGllcy9JV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSBJRGF0YU1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAqIFdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLiBOT1RFOiBUaGUgYXNzb2NpYXRlZCBQcm92aWRlciBhbmQgT3BlcmF0aW9ucyB3aWxsIGJlIGNyZWF0ZWQKLSAqIGR1cmluZyBNNQotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG9wdGlvbmFsIHtAbGluayBMaXN0fSBwcm9wZXJ0eSBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggbmVzdGVkIHdlYiBsaWJyYXJpZXMgc2hvdWxkIGJlCi0JICogZXhwYW5kZWQgaW50byBwcm9qZWN0cyBkdXJpbmcgaW1wb3J0LiBUaGUgY29udGVudHMgb2YgdGhpcyB7QGxpbmsgTGlzdH0gcHJvcGVydHkgc2hvdWxkIGJlCi0JICoge0BsaW5rIEFyY2hpdmV9cy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCA9ICJXQVJJbXBvcnREYXRhTW9kZWwuV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMge0BsaW5rIExpc3R9IHByb3BlcnR5IHNob3VsZCBub3QgYmUgc2V0IGJ5IGNsaWVudHMuIFRoaXMgbGlzdCBjb250YWlucyB0aGUKLQkgKiB7QGxpbmsgSURhdGFNb2RlbH1zIGZvciBjcmVhdGluZyB0aGUgbmV3IGNvbXBvbmVudHMgdG8gYmUgY3JlYXRlZCBmb3IgZWFjaCBvZiB0aGUgc2VsZWN0ZWQKLQkgKiBhcmNoaXZlcy4gVGhpcyBsaXN0IHdpbGwgY29udGFpbiBvbmUgZW50cnkgZm9yIGVhY2ggd2ViIGxpYiBhcmNoaXZlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdAotCSAqIGlzIHNlbGVjdGVkIGZvciBpbXBvcnQgYnkgdGhlIHtAbGluayAjV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRH0gcHJvcGVydHkuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9MSUJfTU9ERUxTID0gIldBUkltcG9ydERhdGFNb2RlbC5XRUJfTElCX01PREVMUyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfUk9PVCA9ICJJQWRkV2ViQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFWFRfUk9PVCI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvZGF0YW1vZGVsL3Byb3BlcnRpZXMvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3ZTY3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT53ZWIgbW9kdWxlIGRhdGEgbW9kZWwgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgYXBpIHRvIGNyZWF0ZSwgaW1wb3J0IGFuZCBleHBvcnQgd2ViIG1vZHVsZXMuIFRoZSBpbnRlcmZhY2VzIGluIHRoaXMgcGFja2FnZQotICAgICAgICBkZWZpbmUgdGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IG9uIHRoZSB3ZWIgbW9kdWxlcyBkYXRhIG1vZGVscyB0aGF0IGFyZSB1c2UgdG8gcnVuIHRoZSBkYXRhIG1vZGVsIG9wZXJhdGlvbnMgYW5kIGRyaXZlIHRoZSB3aXphcmQgZGF0YSwgdmFsaWRhdGlvbi4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjNDRlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L0lXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5jbGFzczsKLQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9ST09UID0gIklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFWFRfUk9PVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRk9MREVSID0gIklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwMjY4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IG5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQluYW1lcy5hZGQoQ09OVEVYVF9ST09UKTsKLQkJbmFtZXMuYWRkKFNPVVJDRV9GT0xERVIpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05GSUdfRk9MREVSKSkgewotCQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFN0cmluZyhKMkVFUHJlZmVyZW5jZXMuS2V5cy5XRUJfQ09OVEVOVF9GT0xERVIpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU09VUkNFX0ZPTERFUikpIHsKLQkJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSjJFRVByZWZlcmVuY2VzLktleXMuRFlOX1dFQl9TUkNfRk9MREVSKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRFWFRfUk9PVCkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpLnJlcGxhY2UoJyAnLCAnXycpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfSUQpKSB7Ci0JCQlyZXR1cm4gRFlOQU1JQ19XRUI7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhNT0RVTEVfVVJJKSkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKS5yZXBsYWNlKCcgJywgJ18nKTsKLQkJCXJldHVybiBwcm9qZWN0TmFtZSArIElKMkVFTW9kdWxlQ29uc3RhbnRzLldBUl9FWFQ7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhHRU5FUkFURV9ERCkpIHsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbilnZXRQcm9wZXJ0eShGQUNFVF9WRVJTSU9OKTsKLQkJCWlmKGZhY2V0VmVyc2lvbiA9PSBXZWJGYWNldFV0aWxzLldFQl8yNSl7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkRZTkFNSUNfV0VCX0dFTkVSQVRFX0REKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9ZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPVVRQVVRfRk9MREVSKSkgewotCQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFN0cmluZyhKMkVFUHJlZmVyZW5jZXMuS2V5cy5EWU5fV0VCX09VVFBVVF9GT0xERVIpOwkKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKEFERF9UT19FQVIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKENPTlRFWFRfUk9PVCwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJfSBlbHNlIGlmIChGQUNFVF9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKENPTlRFWFRfUk9PVCwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTkZJR19GT0xERVIpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNPVVJDRV9GT0xERVIpKSAKLQkJewotCQkgICAgZmluYWwgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyBqYXZhTW9kZWwgPSBmaW5kSmF2YUZhY2V0SW5zdGFsbENvbmZpZygpOwotCQkgICAgCi0JCSAgICBpZiggamF2YU1vZGVsICE9IG51bGwgKQotCQkgICAgewotCQkgICAgICAgIGZpbmFsIElQYXRoIHNvdXJjZUZvbGRlcgotCQkgICAgICAgICAgICA9IHByb3BlcnR5VmFsdWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgUGF0aCggKFN0cmluZykgcHJvcGVydHlWYWx1ZSApOwotCQkgICAgICAgIAotCQkgICAgICAgIGphdmFNb2RlbC5zZXRTb3VyY2VGb2xkZXIoIHNvdXJjZUZvbGRlciApOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIEphdmFGYWNldEluc3RhbGxDb25maWcgZmluZEphdmFGYWNldEluc3RhbGxDb25maWcoKQotCXsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgCi0gICAgICAgICAgICA9IChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eSggRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSApOwotICAgICAgICAKLSAgICAgICAgaWYoIGZwandjICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QuQWN0aW9uIGphdmFJbnN0YWxsQWN0aW9uCi0gICAgICAgICAgICAgICAgPSBmcGp3Yy5nZXRQcm9qZWN0RmFjZXRBY3Rpb24oIEphdmFGYWNldFV0aWxzLkpBVkFfRkFDRVQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZyA9IGphdmFJbnN0YWxsQWN0aW9uLmdldENvbmZpZygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY29uZmlnIGluc3RhbmNlb2YgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKSBjb25maWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoIGNvbmZpZywgSmF2YUZhY2V0SW5zdGFsbENvbmZpZy5jbGFzcyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBzdXBlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgY29udmVydEZhY2V0VmVyc2lvblRvSjJFRVZlcnNpb24oSVByb2plY3RGYWNldFZlcnNpb24gdmVyc2lvbikgewotCQlyZXR1cm4gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRXZWJWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZS5lcXVhbHMoQ09OVEVYVF9ST09UKSkgewotCQkJcmV0dXJuIHZhbGlkYXRlQ29udGV4dFJvb3QoZ2V0U3RyaW5nUHJvcGVydHkoQ09OVEVYVF9ST09UKSk7Ci0JCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoU09VUkNFX0ZPTERFUikpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gIHZhbGlkYXRlRm9sZGVyTmFtZShnZXRTdHJpbmdQcm9wZXJ0eShTT1VSQ0VfRk9MREVSKSk7Ci0JCQlpZiggc3RhdHVzLmlzT0soKSApewotCQkJCXN0YXR1cyA9IHZhbGlkYXRlRm9sZGVyRm9yQ2hhcmFjdGVycyhnZXRTdHJpbmdQcm9wZXJ0eShTT1VSQ0VfRk9MREVSKSk7Ci0JCQl9CQkJCi0JCQlpZiggc3RhdHVzLmlzT0soKSApewotCQkJCXN0YXR1cyA9IHZhbGlkYXRlU291cmNlQW5kQ29udGVudEZvbGRlclVuaXF1ZW5lc3MoKTsKLQkJCX0KLQkJCWlmKHN0YXR1cy5pc09LKCkpewotCQkJCVN0cmluZyBvdXRmb2xkZXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoT1VUUFVUX0ZPTERFUik7Ci0JCQkJU3RyaW5nIHNyY2ZvbGRlck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShTT1VSQ0VfRk9MREVSKTsKLQkJCQlzdGF0dXMgPSB2YWxpZGF0ZVNvdXJjZUFuZE91dHB1dEZvbGRlckNhc2Uoc3JjZm9sZGVyTmFtZSwgb3V0Zm9sZGVyTmFtZSk7Ci0JCQl9CQkJCQotCQkJcmV0dXJuIHN0YXR1czsJCQkKLQkJCQotCQl9ZWxzZSBpZiAobmFtZS5lcXVhbHMoIENPTkZJR19GT0xERVIgKSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZSggQ09ORklHX0ZPTERFUiApOwotCQkJaWYoIHN0YXR1cy5pc09LKCkgKXsKLQkJCQlzdGF0dXMgPSB2YWxpZGF0ZVNvdXJjZUFuZENvbnRlbnRGb2xkZXJVbmlxdWVuZXNzKCk7Ci0JCQl9Ci0JCQlpZiggc3RhdHVzLmlzT0soKSApewotCQkJCVN0cmluZyBjb25maWdGb2xkZXIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDT05GSUdfRk9MREVSKTsKLQkJCQlTdHJpbmcgb3V0Rm9sZGVyID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoT1VUUFVUX0ZPTERFUik7Ci0JCQkJc3RhdHVzID0gdmFsaWRhdGVXZWJDb25maWdBbmRPdXRwdXRGb2xkZXIoY29uZmlnRm9sZGVyLCBvdXRGb2xkZXIpOwotCQkJfQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfWVsc2UgaWYgKG5hbWUuZXF1YWxzKE9VVFBVVF9GT0xERVIpKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlKE9VVFBVVF9GT0xERVIpOwotCQkJaWYoc3RhdHVzLmlzT0soKSl7Ci0JCQkJU3RyaW5nIGNvbmZpZ0ZvbGRlciA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KENPTkZJR19GT0xERVIpOwotCQkJCVN0cmluZyBvdXRGb2xkZXIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShPVVRQVVRfRk9MREVSKTsKLQkJCQlzdGF0dXMgPSB2YWxpZGF0ZVdlYkNvbmZpZ0FuZE91dHB1dEZvbGRlcihjb25maWdGb2xkZXIsIG91dEZvbGRlcik7Ci0JCQl9Ci0JCQlpZihzdGF0dXMuaXNPSygpKXsKLQkJCQlTdHJpbmcgb3V0Zm9sZGVyTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KE9VVFBVVF9GT0xERVIpOwotCQkJCVN0cmluZyBzcmNmb2xkZXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoU09VUkNFX0ZPTERFUik7Ci0JCQkJc3RhdHVzID0gdmFsaWRhdGVTb3VyY2VBbmRPdXRwdXRGb2xkZXJDYXNlKHNyY2ZvbGRlck5hbWUsIG91dGZvbGRlck5hbWUpOwotCQkJfQkJCQkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJLy8gdGhlIHN1cGVyY2xhc3MgdmFsaWRhdGVzIHRoZSBjb250ZW50IGRpcmVjdG9yeSB3aGljaCBpcyBhY3R1YWxseSBhICJDT05GSUdfRk9MREVSIgotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVDb250ZXh0Um9vdChTdHJpbmcgY29udGV4dFJvb3QpIHsKLQkJaWYgKGNvbnRleHRSb290ID09IG51bGwpIHsKLQkJCXJldHVybiBKMkVFUGx1Z2luLm5ld0Vycm9yU3RhdHVzKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Db250ZXh0X1Jvb3RfY2Fubm90X2JlX2VtcHR5XzIsIG5ldyBPYmplY3RbXXtjb250ZXh0Um9vdH0pLCBudWxsKTsKLQkJfSBlbHNlIGlmIChjb250ZXh0Um9vdC50cmltKCkuZXF1YWxzKGNvbnRleHRSb290KSkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnRleHRSb290LCAiLiIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgdG9rZW4gPSBzdG9rLm5leHRUb2tlbigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoKCk7IGkrKykgewotCQkJCQlpZiAoISh0b2tlbi5jaGFyQXQoaSkgPT0gJ18nKSAmJiAhKHRva2VuLmNoYXJBdChpKSA9PSAnLScpICYmICEodG9rZW4uY2hhckF0KGkpID09ICcvJykgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCh0b2tlbi5jaGFyQXQoaSkpID09IGZhbHNlKSB7Ci0JCQkJCQlPYmplY3RbXSBpbnZhbGlkQ2hhciA9IG5ldyBPYmplY3RbXXsobmV3IENoYXJhY3Rlcih0b2tlbi5jaGFyQXQoaSkpKS50b1N0cmluZygpfTsKLQkJCQkJCVN0cmluZyBlcnJvclN0YXR1cyA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5UaGVfY2hhcmFjdGVyX2lzX2ludmFsaWRfaW5fYV9jb250ZXh0X3Jvb3QsIGludmFsaWRDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoZXJyb3JTdGF0dXMsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UKLQkJCXJldHVybiBKMkVFUGx1Z2luLm5ld0Vycm9yU3RhdHVzKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5OYW1lc19jYW5ub3RfYmVnaW5fb3JfZW5kX3dpdGhfd2hpdGVzcGFjZV81LCBuZXcgT2JqZWN0W117Y29udGV4dFJvb3R9KSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVTb3VyY2VBbmRDb250ZW50Rm9sZGVyVW5pcXVlbmVzcygpewotCQlTdHJpbmcgc3JjRm9sZGVyID0gZ2V0U3RyaW5nUHJvcGVydHkoU09VUkNFX0ZPTERFUik7Ci0JCVN0cmluZyBjb250ZW50Rm9sZGVyID0gZ2V0U3RyaW5nUHJvcGVydHkoIENPTkZJR19GT0xERVIgKTsKLQkJaWYoIHNyY0ZvbGRlciAhPSBudWxsICYmIGNvbnRlbnRGb2xkZXIgIT0gbnVsbCl7Ci0JCQlpZiAoc3JjRm9sZGVyLmVxdWFscyggY29udGVudEZvbGRlciApKXsKLQkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRFlOQU1JQ19XRUJfRElTVElOQ1RfU1JDX1dFQkNPTlRFTlRfRVJST1I7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVdlYkNvbmZpZ0FuZE91dHB1dEZvbGRlcihTdHJpbmcgcmF3Q29uZmlnRm9sZGVyLCBTdHJpbmcgb3V0Rm9sZGVyKXsgCi0JCWlmKCBQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpewotCQkJU3RyaW5nIGV4cGVjdGVkT3V0Rm9sZGVyID0gcmF3Q29uZmlnRm9sZGVyKyIvIitKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUzsKLQkJCWlmKCAhb3V0Rm9sZGVyLmVxdWFscyhleHBlY3RlZE91dEZvbGRlcikgKXsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyggUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRFlOQU1JQ19XRUJfUEVSRk9STUFOQ0VfVkFMSURBVElPTiwKLQkJCQkJCW5ldyBPYmplY3RbXXtleHBlY3RlZE91dEZvbGRlcn0pOwotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlV2FybmluZ1N0YXR1cyhtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcyZjM5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0Lld0cFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkNsYXNzcGF0aEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5jbGFzc3BhdGguV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFdlYkZhY2V0SW5zdGFsbERlbGVnYXRlIGV4dGVuZHMgSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIGZpbmFsIE9iamVjdCBjZmcsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlmaW5hbCBJRGF0YU1vZGVsIG1vZGVsID0gKElEYXRhTW9kZWwpIGNmZzsKLQotCQkJZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQkvLyBBZGQgV1RQIG5hdHVyZXMuCi0KLQkJCVd0cFV0aWxzLmFkZE5hdHVyZXMocHJvamVjdCk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLQotCQkJZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCWZpbmFsIElQYXRoIHBqcGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQotCQkJZmluYWwgSVBhdGggY29udGVudGRpciA9IHNldENvbnRlbnRQcm9wZXJ0eUlmTmVlZGVkKG1vZGVsLCBwanBhdGgsIHByb2plY3QpOwotCQkJbWtkaXJzKHdzLmdldFJvb3QoKS5nZXRGb2xkZXIoY29udGVudGRpcikpOwotCi0JCQlmaW5hbCBJUGF0aCB3ZWJpbmYgPSBjb250ZW50ZGlyLmFwcGVuZCgiV0VCLUlORiIpOyAvLyROT04tTkxTLTEkCi0JCQlJRm9sZGVyIHdlYmluZkZvbGRlciA9IHdzLmdldFJvb3QoKS5nZXRGb2xkZXIod2ViaW5mKTsKLQkJCW1rZGlycyh3ZWJpbmZGb2xkZXIpOwotCi0JCQlmaW5hbCBJUGF0aCB3ZWJpbmZsaWIgPSB3ZWJpbmYuYXBwZW5kKCJsaWIiKTsgLy8kTk9OLU5MUy0xJAotCQkJbWtkaXJzKHdzLmdldFJvb3QoKS5nZXRGb2xkZXIod2ViaW5mbGliKSk7Ci0KLQkJCS8vIFNldHVwIHRoZSBmbGV4aWJsZSBwcm9qZWN0IHN0cnVjdHVyZS4KLQotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIGZhbHNlKTsKLQotCQkJYy5jcmVhdGUoMCwgbnVsbCk7Ci0KLQkJCVN0cmluZyBjb250ZXh0Um9vdCA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFWFRfUk9PVCk7Ci0JCQlzZXRDb250ZXh0Um9vdFByb3BlcnR5SWZOZWVkZWQoYywgY29udGV4dFJvb3QpOwotCQkJLy9zZXRPdXRwdXRGb2xkZXIobW9kZWwsIGMpOwotCQkJc2V0SmF2YU91dHB1dFByb3BlcnR5SWZOZWVkZWQobW9kZWwsIGMpOwotCi0JCQlmaW5hbCBJVmlydHVhbEZvbGRlciB3ZWJyb290ID0gYy5nZXRSb290Rm9sZGVyKCk7Ci0JCQlpZiAod2Vicm9vdC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKCIvIikpKSAvLyROT04tTkxTLTEkCi0JCQkJd2Vicm9vdC5jcmVhdGVMaW5rKG5ldyBQYXRoKCIvIiArIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKSksIDAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmKCBmdiA9PSBXZWJGYWNldFV0aWxzLldFQl8yNSApCi0JCQl7Ci0JCSAgICAgICAgIGlmKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQpKXsKLQkJICAgICAgICAgICAgICAgIGNyZWF0ZVdlYjI1RGVwbG95bWVudERlc2NyaXB0b3IocHJvamVjdCwgZnYsIHdlYmluZkZvbGRlciwgbW9uaXRvcik7Ci0JCSAgICAgICAgICAgIH0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLSAgICAJCQkvLyBDcmVhdGUgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciAod2ViLnhtbCkgaWYgb25lIGRvZXNuJ3QgZXhpc3QKLSAgICAJCQlpZiAoIXdlYmluZkZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIikuZXhpc3RzKCkpIHsgLy8kTk9OLU5MUy0xJAotICAgIAkJCQlTdHJpbmcgdmVyID0gZnYuZ2V0VmVyc2lvblN0cmluZygpOwotICAgIAkJCQlpbnQgblZlciA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KHZlcik7Ci0gICAgCQkJCVdlYkFydGlmYWN0RWRpdC5jcmVhdGVEZXBsb3ltZW50RGVzY3JpcHRvcihwcm9qZWN0LCBuVmVyKTsKLSAgICAJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIFNldCBlbnRyaWVzIGZvciBzcmMgZm9sZGVycwotCQkJZmluYWwgSVZpcnR1YWxGb2xkZXIganNyYyA9IGMuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcigiL1dFQi1JTkYvY2xhc3NlcyIpOyAvLyROT04tTkxTLTEkCi0JCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcGUgPSBjcFtpXTsKLQkJCQlpZiAoY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJCWlmKCBjcGUuZ2V0UGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkuc2VnbWVudENvdW50KCkgPiAwICkKLQkJCQkJCWpzcmMuY3JlYXRlTGluayhjcGUuZ2V0UGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSksIDAsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJSVZpcnR1YWxGaWxlIHZmID0gYy5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOwotCQkJSUZpbGUgbWFuaWZlc3RtZiA9IHZmLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQlpZiAobWFuaWZlc3RtZiA9PSBudWxsIHx8ICFtYW5pZmVzdG1mLmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJY3JlYXRlTWFuaWZlc3QocHJvamVjdCwgYy5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gU2V0dXAgdGhlIGNsYXNzcGF0aC4KLQotCQkJQ2xhc3NwYXRoSGVscGVyLnJlbW92ZUNsYXNzcGF0aEVudHJpZXMocHJvamVjdCwgZnYpOwotCi0JCQlpZiAoIUNsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKHByb2plY3QsIGZ2KSkgewotCQkJCS8vIFRPRE86IFN1cHBvcnQgdGhlIG5vIHJ1bnRpbWUgY2FzZS4KLQkJCQkvLyBDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYsIDxzb21ldGhpbmc+ICk7Ci0JCQl9Ci0KLQkJCS8vIEFkZCB0aGUgd2ViIGxpYnJhcmllcyBjb250YWluZXIuCi0KLQkJCQkJCQotCQkJaWYoSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzLmdldERlZmF1bHRVc2VXZWJBcHBMaWJyYXJpZXMoKSl7Ci0JCQkJZmluYWwgSVBhdGggd2ViTGliQ29udGFpbmVyID0gbmV3IFBhdGgoV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyLkNPTlRBSU5FUl9JRCk7Ci0JCQkJYWRkVG9DbGFzc3BhdGgoanByb2osIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KHdlYkxpYkNvbnRhaW5lcikpOwotCQkJfQotCi0JCQlpZihKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHMuZ2V0RGVmYXVsdFVzZUVBUkxpYnJhcmllcygpKXsKLQkJCQlmaW5hbCBJUGF0aCBlYXJMaWJDb250YWluZXIgPSBuZXcgUGF0aChKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyLkNPTlRBSU5FUl9JRCk7Ci0JCQkJYWRkVG9DbGFzc3BhdGgoanByb2osIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KGVhckxpYkNvbnRhaW5lcikpOwotCQkJfQotCi0JCQl0cnkgewotCQkJCSgoSURhdGFNb2RlbE9wZXJhdGlvbikgbW9kZWwuZ2V0UHJvcGVydHkoRmFjZXREYXRhTW9kZWxQcm92aWRlci5OT1RJRklDQVRJT05fT1BFUkFUSU9OKSkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCi0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29udGV4dFJvb3RQcm9wZXJ0eUlmTmVlZGVkKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGMsIFN0cmluZyBjb250ZXh0Um9vdCkgewotCQlTdHJpbmcgZXhpc3RpbmcgPSBjLmdldE1ldGFQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImNvbnRleHQtcm9vdCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChleGlzdGluZyA9PSBudWxsKQotCQkJYy5zZXRNZXRhUHJvcGVydHkoImNvbnRleHQtcm9vdCIsIGNvbnRleHRSb290KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgSVBhdGggc2V0Q29udGVudFByb3BlcnR5SWZOZWVkZWQoZmluYWwgSURhdGFNb2RlbCBtb2RlbCwgZmluYWwgSVBhdGggcGpwYXRoLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LCBmYWxzZSk7Ci0JCWlmIChjLmV4aXN0cygpKSB7Ci0JCQlpZiggIWMuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5pc1Jvb3QoKSApewotCQkJCXJldHVybiBjLmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwanBhdGguYXBwZW5kKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKSk7Ci0JfQotCQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXZWIyNURlcGxveW1lbnREZXNjcmlwdG9yKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZvbGRlciB3ZWJpbmZGb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgIC8vIENyZWF0ZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yICh3ZWIueG1sKSBpZiBvbmUgZG9lc24ndCBleGlzdAotICAgICAgIElGaWxlIHdlYnhtbEZpbGUgPSB3ZWJpbmZGb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgaWYgKCF3ZWJ4bWxGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBtaW5pbWFsIHdlYi54bWwgZmlsZSwgc28gdGhlIG1vZGVsIGNhbiBiZSBpbml0aWFsaXplZAotICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdlYlhtbENvbnRlbnRzID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHdlYi1hcHAgaWQ9XCJXZWJBcHBfSURcIiB2ZXJzaW9uPVwiMi41XCIgeG1sbnM9XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhzaTpzY2hlbWFMb2NhdGlvbj1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkXCI+XG48L3dlYi1hcHA+IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgd2VieG1sRmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHdlYlhtbENvbnRlbnRzLmdldEJ5dGVzKCJVVEYtOCIpKSwgdHJ1ZSwgbW9uaXRvcik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgCi0gICAgICAgICAgICAgICBmaW5hbCBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCwgZnYpOwotICAgICAgICAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKXsKLSAgIAotICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpc3BsYXktbmFtZSB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgZGlzcGxheU5hbWUgPSAoRGlzcGxheU5hbWUpIEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lLnNldFZhbHVlKHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgd2ViQXBwLmdldERpc3BsYXlOYW1lcygpLmFkZChkaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWxjb21lIGZpbGUgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gd2VsY29tZUZpbGVzID0gQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXguaHRtbCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXguaHRtIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRleC5qc3AiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQuaHRtbCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdC5odG0iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQuanNwIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHdlbGNvbWUtZmlsZS1saXN0IHRhZwotICAgICAgICAgICAgICAgICAgICAgICBXZWxjb21lRmlsZUxpc3Qgd2VsY29tZUZpbGVMaXN0ID0gKFdlbGNvbWVGaWxlTGlzdCkgV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2VsY29tZUZpbGVMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdlbGNvbWVGaWxlTGlzdC5nZXRXZWxjb21lRmlsZXMoKS5hZGRBbGwod2VsY29tZUZpbGVzKTsgCi0gICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcC5nZXRXZWxjb21lRmlsZUxpc3RzKCkuYWRkKHdlbGNvbWVGaWxlTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHByb3ZpZGVyLm1vZGlmeShydW5uYWJsZSwgbnVsbCk7Ci0gICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgfQotCQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBta2RpcnMoZmluYWwgSUZvbGRlciBmb2xkZXIpCi0KLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCi0JewotCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJaWYgKGZvbGRlci5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQlta2RpcnMoKElGb2xkZXIpIGZvbGRlci5nZXRQYXJlbnQoKSk7Ci0JCQl9Ci0KLQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICBJQ29udGFpbmVyIHggPSBmb2xkZXI7Ci0JCSAgICAKLQkJICAgIHdoaWxlKCB4IGluc3RhbmNlb2YgSUZvbGRlciAmJiB4LmlzRGVyaXZlZCgpICkKLQkJICAgIHsKLQkJICAgICAgICB4LnNldERlcml2ZWQoIGZhbHNlICk7Ci0JCSAgICAgICAgeCA9IHguZ2V0UGFyZW50KCk7Ci0JCSAgICB9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEphdmFPdXRwdXRQcm9wZXJ0eUlmTmVlZGVkKElEYXRhTW9kZWwgbW9kZWwsIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGMpIHsKLQkJLy8gTWFrZSBzdXJlIG91dHB1dCBmb2xkZXIgaXMgc2V0IHByb3Blcmx5IGZvciB3ZWIgcHJvamVjdHMsIGFuZCB0aGUgcHJvZHVjdCBzZXR0aW5nIGZvciBzaW5nbGUgcm9vdCBzdHJ1Y3R1cmUgaXMgbWFpbnRhaW5lZC4KLQkJLy8gV2UgbWF5IG5lZWQgdG8gY2hhbmdlIHRoZSBleGlzdGluZyBzZXR1cAotCi0JCWlmIChQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpIHsKLQkJCVN0cmluZyBvdXRwdXRGb2xkZXIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuT1VUUFVUX0ZPTERFUik7Ci0JCQlJSmF2YVByb2plY3QganByb2ogPSBKYXZhQ29yZS5jcmVhdGUoYy5nZXRQcm9qZWN0KCkpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gY3VycmVudCA9IG51bGw7Ci0JCQlib29sZWFuIHdlYmluZiA9IGZhbHNlOwotCQkJSVBhdGggcGpwYXRoID0gYy5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKLQkJCXRyeSB7Ci0JCQkJY3VycmVudCA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCUxpc3QgdXBkYXRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVBhdGggc291cmNlUGF0aCA9IG51bGw7Ci0JCQkJYm9vbGVhbiBjaGFuZ2VOZWVkZWQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY3VycmVudFtpXTsKLQkJCQkJaWYgKChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgJiYgKGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkgIT0gbnVsbCAmJiBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpLnRvU3RyaW5nKCkuaW5kZXhPZihvdXRwdXRGb2xkZXIpID09IC0xKSkgewotCQkJCQkJLy9vdXRwdXQgZGlmZmVyZW50IHRoYW4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkJCQkJCXNvdXJjZVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJCQl1cGRhdGVkTGlzdC5hZGQoSmF2YUNvcmUubmV3U291cmNlRW50cnkoc291cmNlUGF0aCkpOwotCQkJCQkJY2hhbmdlTmVlZGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQl1cGRhdGVkTGlzdC5hZGQoZW50cnkpOwotCQkJCX0KLQkJCQlJUGF0aCBjdXJyZW50RGVmYXVsdE91dHB1dCA9IG51bGw7Ci0JCQkJY3VycmVudERlZmF1bHRPdXRwdXQgPSBqcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJCWlmIChjdXJyZW50RGVmYXVsdE91dHB1dC50b1N0cmluZygpLmluZGV4T2Yob3V0cHV0Rm9sZGVyKSA9PSAtMSkKLQkJCQkJY2hhbmdlTmVlZGVkID0gdHJ1ZTsKLQkJCQlpZiAoY2hhbmdlTmVlZGVkKSB7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIHVwZGF0ZWQgPSAoSUNsYXNzcGF0aEVudHJ5W10pdXBkYXRlZExpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W3VwZGF0ZWRMaXN0LnNpemUoKV0pOwotCQkJCQlJUGF0aCBvdXRkaXIgPSBwanBhdGguYXBwZW5kKG91dHB1dEZvbGRlcik7IAotCQkJCQlqcHJvai5zZXRSYXdDbGFzc3BhdGgodXBkYXRlZCxvdXRkaXIgLG51bGwpOwotCQkJCQlqcHJvai5zYXZlKG51bGwsIHRydWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCS8vIE5vdyBqdXN0IHNldCB0aGUgcHJvcGVydHkKLQkJU3RyaW5nIGV4aXN0aW5nID0gYy5nZXRNZXRhUHJvcGVydGllcygpLmdldFByb3BlcnR5KCJqYXZhLW91dHB1dC1wYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGV4aXN0aW5nID09IG51bGwpCi0JCQlzZXRPdXRwdXRGb2xkZXIobW9kZWwsIGMpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmI4OWY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuTU9EVUxFX1VSSTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFdlYkZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZSBleHRlbmRzIEoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBmaW5hbCBPYmplY3QgY2ZnLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJZmluYWwgSURhdGFNb2RlbCBtb2RlbCA9IChJRGF0YU1vZGVsKSBjZmc7Ci0KLQkJCS8vIEFzc29jaWF0ZSB3aXRoIGFuIEVBUiwgaWYgbmVjZXNzYXJ5LgotCQkJaWYgKCBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX0VBUikgKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGVhclByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSk7Ci0JCQkJCi0JCQkJaWYgKCBlYXJQcm9qZWN0TmFtZSAhPSBudWxsICYmICFlYXJQcm9qZWN0TmFtZS5lcXVhbHMoIiIpICkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQotCQkJCQlTdHJpbmcgdmVyID0gZnYuZ2V0VmVyc2lvblN0cmluZygpOwotCQkJCQkKLQkJCQkJU3RyaW5nIGoyZWVWZXJzaW9uVGV4dCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0V2ViVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXIpKTsKLQkJCQkJZmluYWwgU3RyaW5nIG1vZHVsZVVSSSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KE1PRFVMRV9VUkkpOwotCQkJCQkKLQkJCQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MKLQkJCQkJICAgID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSBtb2RlbC5nZXRQcm9wZXJ0eSggRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSApOwotCQkJCQkKLQkJCQkJaW5zdGFsbEFuZEFkZE1vZHVsZXRvRUFSKCBqMmVlVmVyc2lvblRleHQsCi0JCQkJCQkJCWVhclByb2plY3ROYW1lLAotCQkJCQkJCQlmcGp3Yy5nZXRQcmltYXJ5UnVudGltZSgpLAotCQkJCQkJCQlwcm9qZWN0LAotCQkJCQkJCQltb2R1bGVVUkksCi0JCQkJCQkJCW1vbml0b3IgKTsKLQkJCQkJCi0JCQkJfQotCQkJfQotCi0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2Nzk2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQ2xhc3NwYXRoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV2ViRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlIAotCi0gICAgaW1wbGVtZW50cyBJRGVsZWdhdGUKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCAiIiwgMSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3NwYXRoSGVscGVyLnJlbW92ZUNsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IHRoZSBubyBydW50aW1lIGNhc2UuCi0gICAgICAgICAgICAgICAgLy8gQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2LCA8c29tZXRoaW5nPiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCggMSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRVdGlscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZjI0OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgV2ViRmFjZXRVdGlscyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgV0VCX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gV0VCXzIyID0gV0VCX0ZBQ0VULmdldFZlcnNpb24oIjIuMiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBXRUJfMjMgPSBXRUJfRkFDRVQuZ2V0VmVyc2lvbigiMi4zIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFdFQl8yNCA9IFdFQl9GQUNFVC5nZXRWZXJzaW9uKCIyLjQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gV0VCXzI1ID0gV0VCX0ZBQ0VULmdldFZlcnNpb24oIjIuNSIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IFdFQl9YRE9DTEVUX0ZBQ0VUID0gZ2V0V2ViRG9jbGV0RmFjZXQoKTsKLQkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXQgZ2V0UHJvamVjdEZhY2V0KFN0cmluZyBpZCkgewotCQl0cnkgewotCQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChpZCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSAKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBnZXRXZWJEb2NsZXRGYWNldCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQl9YRE9DTEVUKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIHRoZSB3ZWIgZG9jbGV0IGZhY2V0IGlzIG5vdCBkZWZpbmVkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzgwMDQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5DbGFzc3BhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV2ViRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUgCi0KLSAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgIAotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soICIiLCAxICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGaW5kIHRoZSB2ZXJzaW9uIHRoYXQncyBjdXJyZW50bHkgaW5zdGFsbGVkLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2oKLSAgICAgICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvamVjdCApOwotCi0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBvbGR2ZXIKLSAgICAgICAgICAgICAgICA9IGZwcm9qLmdldEluc3RhbGxlZFZlcnNpb24oIGZ2LmdldFByb2plY3RGYWNldCgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBjbGFzc3BhdGguIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBDbGFzc3BhdGhIZWxwZXIucmVtb3ZlQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgb2xkdmVyICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IHRoZSBubyBydW50aW1lIGNhc2UuCi0gICAgICAgICAgICAgICAgLy8gQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2LCA8c29tZXRoaW5nPiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbXBvbmVudCB2ZXJzaW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLS8vICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotICAgICAgICAgICAgCi0vLyAgICAgICAgICAgIGZpbmFsIFN0cnVjdHVyZUVkaXQgZWRpdCAKLS8vICAgICAgICAgICAgICAgID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoIHByb2plY3QgKTsKLS8vICAgICAgICAgICAgCi0vLyAgICAgICAgICAgIHRyeQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBmaW5hbCBDb21wb25lbnRUeXBlIG9sZGN0eXBlIAotLy8gICAgICAgICAgICAgICAgICAgID0gU3RydWN0dXJlRWRpdC5nZXRDb21wb25lbnRUeXBlKCBjICk7Ci0vLyAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgIGZpbmFsIENvbXBvbmVudFR5cGUgbmV3Y3R5cGUgCi0vLyAgICAgICAgICAgICAgICAgICAgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9uZW50VHlwZSgpOwotLy8gICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICBuZXdjdHlwZS5zZXRDb21wb25lbnRUeXBlSWQoIG9sZGN0eXBlLmdldENvbXBvbmVudFR5cGVJZCgpICk7Ci0vLyAgICAgICAgICAgICAgICBuZXdjdHlwZS5zZXRWZXJzaW9uKCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLS8vICAgICAgICAgICAgICAgIG5ld2N0eXBlLmdldFByb3BlcnRpZXMoKS5hZGRBbGwoIG9sZGN0eXBlLmdldFByb3BlcnRpZXMoKSApOwotLy8gICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVFZGl0LnNldENvbXBvbmVudFR5cGUoIGMsIG5ld2N0eXBlICk7Ci0vLyAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgIGVkaXQuc2F2ZUlmTmVjZXNzYXJ5KCBudWxsICk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgZmluYWxseQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBlZGl0LmRpc3Bvc2UoKTsKLS8vICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCggMSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMjIzYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndlYnNlcnZpY2UvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NGQyODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotd2Vic2VydmljZS5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjZmI0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzNjMWZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNXZWQgTWF5IDMwIDIwOjM0OjE2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiNDY5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwMi5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5WZW5kb3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb25zdGFudHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndzZGQucHJvdmlkZXI7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXI7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjQuMCwxLjUuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGQ1ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc291cmNlLi4gPSB3ZWJzZXJ2aWNlLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwY2IxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZSI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNfc2VydmljZVJlZnNfU2VydmljZVJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNfc2VydmljZVJlZnNfU2VydmljZVJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMGQ4YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb25lbnRTY29wZWRSZWZzX3NlcnZpY2VSZWZzX1NlcnZpY2VSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwNzRmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwNTM1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGRmOGQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZVR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZVR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRkMjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWVUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfaWNvbnNfSWNvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMwMGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19Jbml0UGFyYW0uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX2luaXRQYXJhbXNfSW5pdFBhcmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5ZTRiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19Jbml0UGFyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX2luaXRQYXJhbXNfUGFyYW1WYWx1ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19QYXJhbVZhbHVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyZjJiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19QYXJhbVZhbHVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19RTmFtZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfUU5hbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjkzZTA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19RTmFtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfU09BUEhlYWRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfU09BUEhlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwY2E5NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1NPQVBIZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1dTRExQb3J0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19XU0RMUG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYjlhYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1dTRExQb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwUm9sZXNfU09BUFJvbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBSb2xlc19TT0FQUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWIwYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBSb2xlc19TT0FQUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfZGVzY3JpcHRpb25UeXBlX0Rlc2NyaXB0aW9uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfZGVzY3JpcHRpb25UeXBlX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjAyYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2Rlc2NyaXB0aW9uVHlwZV9EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2Rpc3BsYXlOYW1lVHlwZV9EaXNwbGF5TmFtZVR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2Rpc3BsYXlOYW1lVHlwZV9EaXNwbGF5TmFtZVR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNkNDRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9kaXNwbGF5TmFtZVR5cGVfRGlzcGxheU5hbWVUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9oYW5kbGVyc19IYW5kbGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9oYW5kbGVyc19IYW5kbGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFlZTM2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfaGFuZGxlcnNfSGFuZGxlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfaWNvblR5cGVfSWNvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2ljb25UeXBlX0ljb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwYjdmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfaWNvblR5cGVfSWNvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X3NlcnZpY2VJbXBsQmVhbl9TZXJ2aWNlSW1wbEJlYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X3NlcnZpY2VJbXBsQmVhbl9TZXJ2aWNlSW1wbEJlYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjdlZTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9zZXJ2aWNlSW1wbEJlYW5fU2VydmljZUltcGxCZWFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF93c2RsUG9ydF9XU0RMUG9ydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfd3NkbFBvcnRfV1NETFBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDNmNmRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF93c2RsUG9ydF9XU0RMUG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19CZWFuTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19CZWFuTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YmJjNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fYmVhbkxpbmtfQmVhbkxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fYmVhbkxpbmtfRUpCTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19FSkJMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlNDcwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19FSkJMaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX1NlcnZsZXRMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX1NlcnZsZXRMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNmZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19TZXJ2bGV0TGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9lRUpCTGlua19FSkJMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2VFSkJMaW5rX0VKQkxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U0NzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2VFSkJMaW5rX0VKQkxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fZVNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2VTZXJ2bGV0TGlua19TZXJ2bGV0TGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzZmZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fZVNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9oYW5kbGVyc19IYW5kbGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9oYW5kbGVyc19IYW5kbGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2ODBjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfaGFuZGxlcnNfSGFuZGxlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfcG9ydENvbXBvbmVudFJlZnNfUG9ydENvbXBvbmVudFJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfcG9ydENvbXBvbmVudFJlZnNfUG9ydENvbXBvbmVudFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzE4MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3BvcnRDb21wb25lbnRSZWZzX1BvcnRDb21wb25lbnRSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3NlcnZpY2VRbmFtZV9RTmFtZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfc2VydmljZVFuYW1lX1FOYW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwN2IzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfc2VydmljZVFuYW1lX1FOYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfU09BUEhlYWRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfc2VydmljZVFuYW1lX1NPQVBIZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY5OTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfU09BUEhlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfc2VydmljZVFuYW1lX1dTRExQb3J0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfV1NETFBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmViNDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfV1NETFBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGVzY3JpcHRpb25UeXBlX0Rlc2NyaXB0aW9uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9kZXNjcmlwdGlvblR5cGVfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3NzI0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9kZXNjcmlwdGlvblR5cGVfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX2Rpc3BsYXlOYW1lVHlwZV9EaXNwbGF5TmFtZVR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGlzcGxheU5hbWVUeXBlX0Rpc3BsYXlOYW1lVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDdhODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGlzcGxheU5hbWVUeXBlX0Rpc3BsYXlOYW1lVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9pY29uVHlwZV9JY29uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9pY29uVHlwZV9JY29uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGQ3NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25faWNvblR5cGVfSWNvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25fcG9ydENvbXBvbmVudHNfUG9ydENvbXBvbmVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9wb3J0Q29tcG9uZW50c19Qb3J0Q29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiYzM0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9wb3J0Q29tcG9uZW50c19Qb3J0Q29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNDbGllbnRfY29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnRTY29wZWRSZWZzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNDbGllbnRfY29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnRTY29wZWRSZWZzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0ZDc0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50X2NvbXBvbmVudFNjb3BlZFJlZnNfQ29tcG9uZW50U2NvcGVkUmVmcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50X3NlcnZpY2VSZWZzX1NlcnZpY2VSZWYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlc0NsaWVudF9zZXJ2aWNlUmVmc19TZXJ2aWNlUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmNjg4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50X3NlcnZpY2VSZWZzX1NlcnZpY2VSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlc193ZWJTZXJ2aWNlRGVzY3JpcHRpb25zX1dlYlNlcnZpY2VEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzX3dlYlNlcnZpY2VEZXNjcmlwdGlvbnNfV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyYWQ5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzX3dlYlNlcnZpY2VEZXNjcmlwdGlvbnNfV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0JlYW5MaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0JlYW5MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyNGYzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9CZWFuTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9Db21wb25lbnRTY29wZWRSZWZzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0NvbXBvbmVudFNjb3BlZFJlZnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZlM2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0NvbXBvbmVudFNjb3BlZFJlZnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvRUpCTGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9FSkJMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4NTRlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9FSkJMaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0hhbmRsZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvSGFuZGxlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDU1MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvSGFuZGxlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9Qb3J0Q29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1BvcnRDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjY2NjBlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9Qb3J0Q29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1BvcnRDb21wb25lbnRSZWYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvUG9ydENvbXBvbmVudFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTNjZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvUG9ydENvbXBvbmVudFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TT0FQSGVhZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NPQVBIZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY5OTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NPQVBIZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZUltcGxCZWFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NlcnZpY2VJbXBsQmVhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkODc0NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZUltcGxCZWFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NlcnZpY2VSZWYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZVJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWM0ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2bGV0TGluay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2bGV0TGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZDM4MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmxldExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV1NETFBvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV1NETFBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQxNTk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dTRExQb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VEZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTUzNDVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2RjN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZXNDbGllbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZXNDbGllbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFkNWRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VzQ2xpZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L2luaXRpYWxpel9wYXJhbWV0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmE1NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9zZXJ2bGV0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFiZWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbkJlYW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3Nlc3Npb25CZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2I4YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbkJlYW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NydmNlX2VsZW1fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NydmNlX2VsZW1fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkY2IzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9zcnZjZV9lbGVtX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi93c2RsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3dzZGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3dzZGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L2NvbXBvbmVudHNjb3BlZHJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvY29tcG9uZW50c2NvcGVkcmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYjAyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvY29tcG9uZW50c2NvcGVkcmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9oYW5kbGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9oYW5kbGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4MzM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvaGFuZGxlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvcG9ydGNvbXBvbmVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvcG9ydGNvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MzBlMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3BvcnRjb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3NlcnZpY2VyZWYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3NlcnZpY2VyZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzBjNWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9zZXJ2aWNlcmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi93ZWJzZXJ2aWNlZGVzYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvd2Vic2VydmljZWRlc2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi93ZWJzZXJ2aWNlZGVzYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvd3NjZWRpdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy93c2NlZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmJjNDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy93c2NlZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL3dzZWRpdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy93c2VkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZWMzNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL3dzZWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pbWFnZXMvZm9ybV9iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ltYWdlcy9mb3JtX2Jhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYmMwYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ltYWdlcy9mb3JtX2Jhbm5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaW1hZ2VzL2hvbWVfbmF2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pbWFnZXMvaG9tZV9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBjNjY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pbWFnZXMvaG9tZV9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDdjNDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcm9wZXJ0aWVzIGZvciBjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLmF0ay51aQotIwotIyBFbnRyaWVzIGFyZSBvZiB0aGUgZm9ybSBDT05TVEFOVD1zdHJpbmcKLSMKLSMgRmlsZSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2UuYXRrLnVpL3BsdWdpbi5wcm9wZXJ0aWVzLCB3c2EuZXRvb2xzLndzLnByb3BlcnRpZXMsIGx1bmFyLCAyMDAzMDkyMmEgMjYKLSMgVmVyc2lvbiAxLjI2IDAzLzA5LzA5IDE2OjQxOjQ5Ci0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotCi1wbHVnaW5OYW1lPVdlYiBTZXJ2aWNlIFBsdWctaW4KLXBsdWdpblZlbmRvcj1FY2xpcHNlLm9yZwotCi0KLSMKLSMgRWRpdCBtb2RlbHMKLSMKLVdTRERfRURJVF9NT0RFTF9OQU1FPVdlYiBTZXJ2aWNlcyBFZGl0IE1vZGVsCi1FRElUT1JfRURJVE1PREVMU19XRUJfU0VSVklDRVM9V2ViIFNlcnZpY2VzIEVkaXRvciBFZGl0IE1vZGVsCi1XU0NERF9FRElUX01PREVMX05BTUU9V2ViIFNlcnZpY2VzIENsaWVudCBFZGl0IE1vZGVsCi1FRElUT1JfRURJVE1PREVMU19XRUJfU0VSVklDRVNfQ0xJRU5UPVdlYiBTZXJ2aWNlcyBDbGllbnQgRWRpdG9yIEVkaXQgTW9kZWwKLQotIwotI0NvbW1vbiBFZGl0b3IgTWVzc2FnZXMKLSMKLVRJVExFX1NBVkVfRVJST1I9U2F2ZSBFcnJvcgotTVNHX1NBVkVfRVJST1I9QW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHNhdmUgZWRpdG9yIGNvbnRlbnRzLgotCi0jCi0jIE1lc3NhZ2VzIGluIFdlYlNlcnZpY2VzRWRpdG9yCi0jCi0KLSMKLSMgTWVzc2FnZXMgaW4gV2ViU2VydmljZXNDbGllbnRFZGl0b3IKLSMKLQotCi0KLSMKLSMgTWVzc2FnZXMgaW4gV2ViU2VydmljZXNQYWdlCi0jCi0KLQotIwotIyBNZXNzYWdlcyBpbiBQb3J0Q29tcG9uZW50UGFnZQotIwotCi0KLSMKLSMgTWVzc2FnZXMgaW4gSGFuZGxlclBhZ2UKLSMKLQotCi0jCi0jIE1lc3NhZ2VzIGluIFdlYlNlcnZpY2VzQ2xpZW50UGFnZQotIwotCi0KLSMKLSMgTWVzc2FnZXMgaW4gU2VydmljZVJlZlBhZ2UKLSMKLQotCi0jCi0jIExhYmVscwotIwotTEFCRUxfVU5RVUFMSUZJRURfQ09NUE9ORU5UPTx1bnF1YWxpZmllZD4KLUxBQkVMX1NFUlZMRVRfTElOSz1TZXJ2bGV0IGxpbmsKLQotCi0KLSMKLSMgTGFiZWxzIGZvciB0YWJsZSBsYXlvdXQKLSMKLUxBQkVMX1RBQkxFX05BTUU9TmFtZQotTEFCRUxfVEFCTEVfVkFMVUU9VmFsdWUKLUxBQkVMX1RBQkxFX1NPQVBfUk9MRT1TT0FQIHJvbGUKLUxBQkVMX1RBQkxFX1BPUlRfTkFNRT1Qb3J0IG5hbWUKLUxBQkVMX1RBQkxFX1BPUlRfQ09NUE9ORU5UX0xJTks9UG9ydCBjb21wb25lbnQgbGluawotTEFCRUxfVEFCTEVfREVTQ1JJUFRJT049RGVzY3JpcHRpb24KLQotIwotIyBQYWdlIGFuZCBTZWN0aW9uIHRpdGxlcy9kZXNjcmlwdGlvbnMKLSMKLQotCi0KLQotIwotIyBEaWFsb2cgbGFiZWxzCi0jCi0KLQotIwotIyBUb29sdGlwcwotIwotCi0KLSMKLSMgTGFiZWxzIGZvciBwcm92aWRlcnMKLSMKLV9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZT1XZWIgc2VydmljZSBkZXNjcmlwdGlvbgotX1VJX1BvcnRDb21wb25lbnRfdHlwZT1Qb3J0IGNvbXBvbmVudAotX1VJX0hhbmRsZXJfdHlwZT1IYW5kbGVyCi1fVUlfUG9ydENvbXBvbmVudFJlZl90eXBlPVBvcnQgY29tcG9uZW50IHJlZmVyZW5jZQotX1VJX1NlcnZpY2VSZWZfdHlwZT1TZXJ2aWNlIHJlZmVyZW5jZQotX1VJX1dlYlNlcnZpY2VzQ2xpZW50X3R5cGU9V2ViIHNlcnZpY2VzIGNsaWVudAotX1VJX0NvbXBvbmVudFNjb3BlZFJlZnNfdHlwZT1Db21wb25lbnQgc2NvcGVkIHJlZmVyZW5jZQotX1VJX1dTRExQb3J0X3R5cGU9V1NETCBwb3J0Ci1fVUlfV2ViU2VydmljZXNfdHlwZT1XZWIgc2VydmljZXMKLV9VSV9TZXJ2bGV0TGlua190eXBlPVNlcnZsZXQgbGluawotX1VJX1NlcnZpY2VJbXBsQmVhbl90eXBlPVNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbgotX1VJX0VKQkxpbmtfdHlwZT1FSkIgbGluawotX1VJX0JlYW5MaW5rX3R5cGU9QmVhbiBsaW5rCi1fVUlfU09BUFJvbGVfdHlwZT1TT0FQIHJvbGUKLV9VSV9TT0FQSGVhZGVyX3R5cGU9U09BUCBoZWFkZXIKLV9VSV9Qb3J0TmFtZV90eXBlPVBvcnQgbmFtZQotX1VJX0luaXRQYXJhbV90eXBlPUluaXRpYWwgcGFyYW1ldGVyCi1fVUlfU2VydmljZVJlZl9qYXhycGNNYXBwaW5nRmlsZV9mZWF0dXJlPUpheHJwYyBNYXBwaW5nIEZpbGUKLV9VSV9TZXJ2aWNlUmVmX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmVfZGVzYz1UaGUgamF4cnBjIG1hcHBpbmcgZmlsZS4KLV9VSV9TZXJ2aWNlUmVmX3NlcnZpY2VJbnRlcmZhY2VfZmVhdHVyZT1TZXJ2aWNlIEludGVyZmFjZQotX1VJX1NlcnZpY2VSZWZfc2VydmljZUludGVyZmFjZV9mZWF0dXJlX2Rlc2M9VGhlIHNlcnZpY2UgaW50ZXJmYWNlLgotX1VJX1NlcnZpY2VSZWZfc2VydmljZVJlZk5hbWVfZmVhdHVyZT1OYW1lCi1fVUlfU2VydmljZVJlZl9zZXJ2aWNlUmVmTmFtZV9mZWF0dXJlX2Rlc2M9VGhlIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWUuCi1fVUlfU2VydmljZVJlZl93c2RsRmlsZV9mZWF0dXJlPVdzZGwgRmlsZQotX1VJX1NlcnZpY2VSZWZfd3NkbEZpbGVfZmVhdHVyZV9kZXNjPVRoZSAud3NkbCBmaWxlLgotX1VJX1BvcnRDb21wb25lbnRSZWZfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ZlYXR1cmU9U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLV9VSV9Qb3J0Q29tcG9uZW50UmVmX3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlX2Rlc2M9VGhlIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgotX1VJX1BvcnRDb21wb25lbnRSZWZfcG9ydENvbXBvbmVudExpbmtfZmVhdHVyZT1MaW5rCi1fVUlfUG9ydENvbXBvbmVudFJlZl9wb3J0Q29tcG9uZW50TGlua19mZWF0dXJlX2Rlc2M9VGhlIHBvcnQgY29tcG9uZW50IGxpbmsuCi1fVUlfSGFuZGxlcl9zb2FwUm9sZXNfZmVhdHVyZT1Tb2FwIFJvbGVzCi1fVUlfSGFuZGxlcl9zb2FwUm9sZXNfZmVhdHVyZV9kZXNjPVRoZSBoYW5kbGVyIHNvYXAgcm9sZXMuCi1fVUlfSGFuZGxlcl9wb3J0TmFtZXNfZmVhdHVyZT1Qb3J0IE5hbWVzCi1fVUlfSGFuZGxlcl9wb3J0TmFtZXNfZmVhdHVyZV9kZXNjPVRoZSBoYW5kbGVyIHBvcnQgbmFtZXMuCi1fVUlfSGFuZGxlcl9oYW5kbGVyTmFtZV9mZWF0dXJlPUhhbmRsZXIgTmFtZQotX1VJX0hhbmRsZXJfaGFuZGxlck5hbWVfZmVhdHVyZV9kZXNjPVRoZSBoYW5kbGVyIG5hbWUuCi1fVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZT1IYW5kbGVyIENsYXNzCi1fVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZV9kZXNjPVRoZSBoYW5kbGVyIGNsYXNzLgotX1VJX0luaXRQYXJhbV9wYXJhbU5hbWVfZmVhdHVyZT1OYW1lCi1fVUlfSW5pdFBhcmFtX3BhcmFtTmFtZV9mZWF0dXJlX2Rlc2M9VGhlIGluaXRpYWwgcGFyYW1ldGVyIG5hbWUuCi1fVUlfSW5pdFBhcmFtX2Rlc2NyaXB0aW9uX2ZlYXR1cmU9RGVzY3JpcHRpb24KLV9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZV9kZXNjPVRoZSBpbml0aWFsIHBhcmFtZXRlciBkZXNjcmlwdGlvbi4KLV9VSV9Jbml0UGFyYW1fcGFyYW1WYWx1ZV9mZWF0dXJlPVZhbHVlCi1fVUlfSW5pdFBhcmFtX3BhcmFtVmFsdWVfZmVhdHVyZV9kZXNjPVRoZSBpbml0aWFsIHBhcmFtZXRlciB2YWx1ZS4KLV9VSV9KYXhSUENNaXNzaW5nTW9kZWw9TWFwcGluZyBmaWxlIG5hbWUgdW5rbm93bi4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjZDBiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotPCEtLSAgRHlhbm1pYyBDb250ZW50IFByb3ZpZGVyIGV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uYWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJ3ZWJzZXJ2aWNlX2NsaWVudC54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9IndzY29tbW9uLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgZnVuY3Rpb25Hcm91cElEPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJjbGllbnQueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUZvckNsaWVudCI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9IndlYnNlcnZpY2VfY2xpZW50LnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY2xpZW50LnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnlGb3JXU0NsaWVudCI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9ImVqYi54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS53c2NsaWVudC5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Rm9yRUpCIj4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0id2ViYXBwbGljYXRpb24ueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2Uud3NjbGllbnQucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUZvcldFQiI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uYWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9IndzZGQueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxFeHRlbnNpb24iPgotICAgICAgPGVkaXRNb2RlbEV4dGVuc2lvbgotICAgICAgICAgICAgZWRpdE1vZGVsSUQ9ImpzdC53ZWIiCi0gICAgICAgICAgICBpZD0id2Vic2VydmljZXMud2ViLmVkaXRNb2RlbGV4dGVuc2lvbiI+Ci0gICAgICAgICA8ZWRpdE1vZGVsUmVzb3VyY2UKLSAgICAgICAgICAgICAgIFVSST0iV0VCLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiPgotICAgICAgICAgPC9lZGl0TW9kZWxSZXNvdXJjZT4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJXRUItSU5GL3dlYnNlcnZpY2VzLnhtbCI+Ci0gICAgICAgICA8L2VkaXRNb2RlbFJlc291cmNlPgotICAgICAgPC9lZGl0TW9kZWxFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxFeHRlbnNpb24iPgotICAgICAgPGVkaXRNb2RlbEV4dGVuc2lvbgotICAgICAgICAgICAgZWRpdE1vZGVsSUQ9ImpzdC5lamIiCi0gICAgICAgICAgICBpZD0id2Vic2VydmljZXMuZWpiLmVkaXRNb2RlbGV4dGVuc2lvbiI+Ci0gICAgICAgICA8ZWRpdE1vZGVsUmVzb3VyY2UKLSAgICAgICAgICAgICAgIFVSST0iTUVUQS1JTkYvd2Vic2VydmljZXNjbGllbnQueG1sIj4KLSAgICAgICAgIDwvZWRpdE1vZGVsUmVzb3VyY2U+Ci0gICAgICAgICA8ZWRpdE1vZGVsUmVzb3VyY2UKLSAgICAgICAgICAgICAgIFVSST0iTUVUQS1JTkYvd2Vic2VydmljZXMueG1sIj4KLSAgICAgICAgIDwvZWRpdE1vZGVsUmVzb3VyY2U+Ci0gICAgICA8L2VkaXRNb2RlbEV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbEV4dGVuc2lvbiI+Ci0gICAgICA8ZWRpdE1vZGVsRXh0ZW5zaW9uCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgICAgIGlkPSJ3ZWJzZXJ2aWNlcy5hcHBjbGllbnQuZWRpdE1vZGVsZXh0ZW5zaW9uIj4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJNRVRBLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiPgotICAgICAgICAgPC9lZGl0TW9kZWxSZXNvdXJjZT4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiPgotICAgICAgICAgPC9lZGl0TW9kZWxSZXNvdXJjZT4KLSAgICAgIDwvZWRpdE1vZGVsRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJXU0RMU2VydmljZUhlbHBlciIKLSAgICAgICAgIG5hbWU9IldTRExTZXJ2aWNlSGVscGVyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLldTRExTZXJ2aWNlSGVscGVyIj4KLSAgICAgIDx3c2RsSGVscGVyCi0gICAgICAgICAgICBoZWxwZXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXIuV1NETFNlcnZpY2VIZWxwZXJJbXBsIj4KLSAgICAgIDwvd3NkbEhlbHBlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5yZXNvdXJjZUZhY3RvcmllcyI+Ci0gICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLldzZGRSZXNvdXJjZUZhY3RvcnkiCi0gICAgICAgICAgICBzaG9ydFNlZ21lbnQ9IndlYnNlcnZpY2VzLnhtbCIvPgotICAgICAgPHJlc291cmNlRmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZC5Xc2RkUmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICAgc2hvcnRTZWdtZW50PSJ3ZWJzZXJ2aWNlcy10ZW1wLnhtbCIvPgotICAgICAgPHJlc291cmNlRmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeSIKLSAgICAgICAgICAgIHNob3J0U2VnbWVudD0id2Vic2VydmljZXNjbGllbnQueG1sIi8+IAotICAgPC9leHRlbnNpb24+Ci0gICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnJlc291cmNlRmFjdG9yaWVzIj4KLSAgICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzZGQuV3NkZFJlc291cmNlRmFjdG9yeSIKLSAgICAgICAgICAgIHNob3J0U2VnbWVudD0id2Vic2VydmljZXMueG1sIi8+Ci0gICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLldzZGRSZXNvdXJjZUZhY3RvcnkiCi0gICAgICAgICAgICBzaG9ydFNlZ21lbnQ9IndlYnNlcnZpY2VzLXRlbXAueG1sIi8+Ci0gICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICAgc2hvcnRTZWdtZW50PSJ3ZWJzZXJ2aWNlc2NsaWVudC54bWwiLz4gCi0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNThmMjczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLndlYnNlcnZpY2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wcm9wZXJ0eV9maWxlcy93ZWJzZXJ2aWNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhN2IwYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUVSUl9IQU5ETEVSX0RJU1BMQVlfTkFNRV9FTVBUWT1UaGUgaGFuZGxlciBuYW1lIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9IQU5ETEVSX0RJU1BMQVlfTkFNRV9FWElTVD1UaGUgaGFuZGxlciBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0hBTkRMRVJfUEFSQU1fTkFNRV9FTVBUWT1UaGUgaGFuZGxlciBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfSEFORExFUl9OQU1FU1BBQ0VfVVJMX0VNUFRZPVRoZSBoYW5kbGVyIG5hbWUgc3BhY2UgVVJMIGNhbm5vdCBiZSBlbXB0eS5TZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLjA9U2VydmljZVJlZgotRVJSX0hBTkRMRVJfUEFSQU1fTkFNRV9FWElTVFM9VGhlIHBhcmFtZXRlciBuYW1lIGFscmVhZHkgZXhpc3QuCi1FUlJfSEFORExFUl9OQU1FU1BBQ0VfVVJMX0VYSVNUUz1UaGUgaGFuZGxlciBuYW1lIHNwYWNlIFVSTCBhbHJlYWR5IGV4aXNpdCwgcGxlYXNlIGNoYW5nZSBuYW1lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyQ0NvbWJvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckNDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2Y0M2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyQ0NvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckNDb21ibyBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCXByaXZhdGUgRU9iamVjdCBlT2JqZWN0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBkaXNwbGF5RmVhdHVyZV87Ci0JcHJpdmF0ZSBDQ29tYm8gY29tYm9fOwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHREaXNwbGF5U3RyaW5nXzsKLQotCXB1YmxpYyBBZGFwdGVyQ0NvbWJvKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgZGlzcGxheUZlYXR1cmUsIENDb21ibyBjb21ibywgU3RyaW5nIGRlZmF1bHREaXNwbGF5U3RyaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCWVPYmplY3RfID0gbnVsbDsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCQlkaXNwbGF5RmVhdHVyZV8gPSBkaXNwbGF5RmVhdHVyZTsKLQkJY29tYm9fID0gY29tYm87Ci0JCWNvbWJvXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZGVmYXVsdERpc3BsYXlTdHJpbmdfID0gKGRlZmF1bHREaXNwbGF5U3RyaW5nICE9IG51bGwpID8gZGVmYXVsdERpc3BsYXlTdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBBZGFwdGVyQ0NvbWJvKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgZGlzcGxheUZlYXR1cmUsIENDb21ibyBjb21ibykgewotCQl0aGlzKGZlYXR1cmUsIGRpc3BsYXlGZWF0dXJlLCBjb21ibywgbnVsbCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJDQ29tYm8oRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGRpc3BsYXlGZWF0dXJlLCBDQ29tYm8gY29tYm8pIHsKLQkJdGhpcyhlT2JqZWN0LCBmZWF0dXJlLCBkaXNwbGF5RmVhdHVyZSwgY29tYm8sIG51bGwpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyQ0NvbWJvKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBkaXNwbGF5RmVhdHVyZSwgQ0NvbWJvIGNvbWJvLCBTdHJpbmcgZGVmYXVsdERpc3BsYXlTdHJpbmcpIHsKLQkJdGhpcyhmZWF0dXJlLCBkaXNwbGF5RmVhdHVyZSwgY29tYm8sIGRlZmF1bHREaXNwbGF5U3RyaW5nKTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCU9iamVjdCBub3RpZmllciA9IG1zZy5nZXROb3RpZmllcigpOwotCQlpZiAobm90aWZpZXIgPT0gZU9iamVjdF8pIHsKLQkJCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BREQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKQotCQkJCXBvcHVsYXRlQ29tYm8oKTsKLQkJfSBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IGRpc3BsYXlGZWF0dXJlXykKLQkJCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21ibygpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChjb21ib18uaXNEaXNwb3NlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQkJaW50IHNlbGVjdGlvbkluZGV4ID0gY29tYm9fLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBjb21ib18uZ2V0VGV4dCgpOwotCQkJCWNvbWJvXy5yZW1vdmVBbGwoKTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpIHsKLQkJCQkJRUxpc3QgZUxpc3QgPSAoRUxpc3QpIG9iamVjdDsKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQkJCQljb21ib18uYWRkKHRvRGlzcGxheVN0cmluZygoKEVPYmplY3QpIGl0Lm5leHQoKSkuZUdldChkaXNwbGF5RmVhdHVyZV8pKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbWJvXy5hZGQodG9EaXNwbGF5U3RyaW5nKCgoRU9iamVjdCkgb2JqZWN0KS5lR2V0KGRpc3BsYXlGZWF0dXJlXykpKTsKLQkJCQlpbnQgbmV3SW5kZXggPSBjb21ib18uaW5kZXhPZih0ZXh0KTsKLQkJCQlpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEgJiYgbmV3SW5kZXggIT0gLTEpCi0JCQkJCWNvbWJvXy5zZWxlY3QobmV3SW5kZXgpOwotCQkJCWVsc2UKLQkJCQkJY29tYm9fLnNlbGVjdCgwKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJU3RyaW5nIHMgPSBvYmplY3QudG9TdHJpbmcoKTsKLQkJCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0JCQkJcmV0dXJuIHM7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHREaXNwbGF5U3RyaW5nXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJY29tYm9fLnJlbW92ZUFsbCgpOwotCQl9Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKEVMaXN0KSBvYmplY3QpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkJCSgoRU9iamVjdCkgaXRlbSkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkoKEVPYmplY3QpIG9iamVjdCkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJcG9wdWxhdGVDb21ibygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWlmIChjb21ib18gIT0gbnVsbCAmJiAhY29tYm9fLmlzRGlzcG9zZWQoKSkKLQkJCWNvbWJvXy5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWYwM2RhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRBZGRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kUmVtb3ZlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRWxlbWVudCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByaXZhdGUgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdDsKLQlwcml2YXRlIEVPYmplY3QgcGFyZW50XzsKLQlwcml2YXRlIEVDbGFzcyBjaGlsZEVDbGFzc187Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIGJvb2xlYW4gY2hpbGROaWxsYWJsZV87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmVbXSBmZWF0dXJlc187Ci0JcHJpdmF0ZSBib29sZWFuW10gZmVhdHVyZXNOaWxsYWJsZV87Ci0JcHJpdmF0ZSBUZXh0W10gZmVhdHVyZXNUZXh0c187Ci0JcHJpdmF0ZSBBZGFwdGVyVGV4dFtdIGZlYXR1cmVzQWRhcHRlcnNfOwotCi0JcHVibGljIEFkYXB0ZXJFbGVtZW50KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRUNsYXNzIGNoaWxkRUNsYXNzLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBib29sZWFuIGNoaWxkTmlsbGFibGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzLCBib29sZWFuW10gZmVhdHVyZXNOaWxsYWJsZSwgVGV4dFtdIGZlYXR1cmVzVGV4dHMpIHsKLQkJc3VwZXIoKTsKLQkJYXJ0aWZhY3RFZGl0ID0gYW5BcnRpZmFjdEVkaXQ7Ci0JCXBhcmVudF8gPSBudWxsOwotCQljaGlsZEVDbGFzc18gPSBjaGlsZEVDbGFzczsKLQkJY2hpbGRGZWF0dXJlXyA9IGNoaWxkRmVhdHVyZTsKLQkJY2hpbGROaWxsYWJsZV8gPSBjaGlsZE5pbGxhYmxlOwotCQlmZWF0dXJlc18gPSBmZWF0dXJlczsKLQkJZmVhdHVyZXNOaWxsYWJsZV8gPSBmZWF0dXJlc05pbGxhYmxlOwotCQlmZWF0dXJlc1RleHRzXyA9IGZlYXR1cmVzVGV4dHM7Ci0JCWFkZE1vZGlmeUxpc3RlbmVyKCk7Ci0JCWZlYXR1cmVzQWRhcHRlcnNfID0gbmV3IEFkYXB0ZXJUZXh0W2ZlYXR1cmVzXy5sZW5ndGhdOwotCQluZXdBZGFwdGVycyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckVsZW1lbnQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFT2JqZWN0IHBhcmVudCwgRUNsYXNzIGNoaWxkRUNsYXNzLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBib29sZWFuIGNoaWxkTmlsbGFibGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzLCBib29sZWFuW10gZmVhdHVyZXNOaWxsYWJsZSwgVGV4dFtdIGZlYXR1cmVzVGV4dHMpIHsKLQkJdGhpcyhhbkFydGlmYWN0RWRpdCwgY2hpbGRFQ2xhc3MsIGNoaWxkRmVhdHVyZSwgY2hpbGROaWxsYWJsZSwgZmVhdHVyZXMsIGZlYXR1cmVzTmlsbGFibGUsIGZlYXR1cmVzVGV4dHMpOwotCQlhZGFwdChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBuZXdBZGFwdGVycyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgPT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQkJZmVhdHVyZXNBZGFwdGVyc19baV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBmZWF0dXJlc19baV0sIGZlYXR1cmVzVGV4dHNfW2ldLCBmZWF0dXJlc05pbGxhYmxlX1tpXSk7Ci0JCWVsc2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQkJZmVhdHVyZXNBZGFwdGVyc19baV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBlT2JqZWN0LCBmZWF0dXJlc19baV0sIGZlYXR1cmVzVGV4dHNfW2ldLCBmZWF0dXJlc05pbGxhYmxlX1tpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzVGV4dHNfLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNUZXh0c19baV0uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQlpZiAoKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBjaGlsZEZlYXR1cmVfKSB7Ci0JCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsICYmICFjaGlsZE5pbGxhYmxlXykKLQkJCQljaGlsZCA9IHNldENoaWxkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzQWRhcHRlcnNfLmxlbmd0aDsgaSsrKQotCQkJCWZlYXR1cmVzQWRhcHRlcnNfW2ldLmFkYXB0KGNoaWxkKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlib29sZWFuIGlzVGV4dHNOdWxsID0gaXNUZXh0c051bGwoKTsKLQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCWJvb2xlYW4gY2hpbGRDYW5CZVJlbW92ZWQgPSB0cnVlOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgYWxsZmVhdHVyZXMgPSBjaGlsZEVDbGFzc18uZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoYWxsZmVhdHVyZXMuaGFzTmV4dCgpKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRoaXNGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgYWxsZmVhdHVyZXMubmV4dCgpOwotCQkJCWlmICghYWRhcHRpbmdGZWF0dXJlKHRoaXNGZWF0dXJlKSAmJiBjaGlsZC5lSXNTZXQodGhpc0ZlYXR1cmUpKSB7Ci0JCQkJCWNoaWxkQ2FuQmVSZW1vdmVkID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaXNUZXh0c051bGwgJiYgY2hpbGQgIT0gbnVsbCAmJiBjaGlsZE5pbGxhYmxlXyAmJiBjaGlsZENhbkJlUmVtb3ZlZCkgewotCQkJZGlzcG9zZUFkYXB0ZXJzKCk7Ci0JCQlwYXJlbnRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCUNvbW1hbmRSZW1vdmVFbGVtZW50IGNvbW1hbmQgPSBuZXcgQ29tbWFuZFJlbW92ZUVsZW1lbnQobnVsbCwgbnVsbCwgcGFyZW50XywgY2hpbGRGZWF0dXJlXyk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQlwYXJlbnRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCW5ld0FkYXB0ZXJzKG51bGwpOwotCQl9IGVsc2UgaWYgKCFpc1RleHRzTnVsbCAmJiBjaGlsZCA9PSBudWxsKSB7Ci0JCQlkaXNwb3NlQWRhcHRlcnMoKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJY2hpbGQgPSBjcmVhdGVDaGlsZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc18ubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdGV4dCA9IGZlYXR1cmVzVGV4dHNfW2ldLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotCQkJCQljaGlsZC5lU2V0KGZlYXR1cmVzX1tpXSwgdGV4dCk7Ci0JCQl9Ci0JCQlDb21tYW5kQWRkRWxlbWVudCBjb21tYW5kID0gbmV3IENvbW1hbmRBZGRFbGVtZW50KG51bGwsIG51bGwsIHBhcmVudF8sIGNoaWxkRmVhdHVyZV8sIGNoaWxkKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJbmV3QWRhcHRlcnMoY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVGV4dHNOdWxsKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzVGV4dHNfLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGZlYXR1cmVzVGV4dHNfW2ldLmdldFRleHQoKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAocGFyZW50XyAhPSBudWxsKQotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXBhcmVudF8gPSBlT2JqZWN0OwotCQlFT2JqZWN0IGNoaWxkID0gbnVsbDsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkgewotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQljaGlsZCA9IChFT2JqZWN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCAmJiAhY2hpbGROaWxsYWJsZV8pCi0JCQkJY2hpbGQgPSBzZXRDaGlsZCgpOwotCQl9Ci0JCXJlbW92ZU1vZGlmeUxpc3RlbmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQlmZWF0dXJlc0FkYXB0ZXJzX1tpXS5hZGFwdChjaGlsZCk7Ci0JCWFkZE1vZGlmeUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IHNldENoaWxkKCkgewotCQlFT2JqZWN0IGNoaWxkID0gY3JlYXRlQ2hpbGQoKTsKLQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBjaGlsZCk7Ci0JCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUNoaWxkKCkgewotCQlFRmFjdG9yeSBjaGlsZEZhY3RvcnkgPSBjaGlsZEVDbGFzc18uZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JCUVPYmplY3QgY2hpbGQgPSBjaGlsZEZhY3RvcnkuY3JlYXRlKGNoaWxkRUNsYXNzXyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNfLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWZlYXR1cmVzTmlsbGFibGVfW2ldKQotCQkJCWNoaWxkLmVTZXQoZmVhdHVyZXNfW2ldLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlkaXNwb3NlQWRhcHRlcnMoKTsKLQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZUFkYXB0ZXJzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzQWRhcHRlcnNfLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNBZGFwdGVyc19baV0uZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcigpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1RleHRzXy5sZW5ndGg7IGkrKykKLQkJCWlmIChmZWF0dXJlc1RleHRzX1tpXSAhPSBudWxsICYmICFmZWF0dXJlc1RleHRzX1tpXS5pc0Rpc3Bvc2VkKCkpCi0JCQkJZmVhdHVyZXNUZXh0c19baV0ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkYXB0aW5nRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZXNfID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc18ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmZWF0dXJlID09IGZlYXR1cmVzX1tpXSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyRXhwaXJlc0NDb21iby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJFeHBpcmVzQ0NvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOWU4MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJFeHBpcmVzQ0NvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJFeHBpcmVzQ0NvbWJvIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0XzsKLQlwcml2YXRlIEVPYmplY3QgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBDQ29tYm8geWVhcl87Ci0JcHJpdmF0ZSBDQ29tYm8gbW9udGhfOwotCXByaXZhdGUgQ0NvbWJvIGRheV87Ci0JcHJpdmF0ZSBDQ29tYm8gaG91cl87Ci0JcHJpdmF0ZSBDQ29tYm8gbWludXRlXzsKLQlwcml2YXRlIENDb21ibyBzZWNvbmRfOwotCXByaXZhdGUgQ0NvbWJvIG1zZWNvbmRfOwotCXByaXZhdGUgYm9vbGVhbiBuaWxsYWJsZV87Ci0KLQlwdWJsaWMgQWRhcHRlckV4cGlyZXNDQ29tYm8oQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENDb21ibyB5ZWFyLCBDQ29tYm8gbW9udGgsIENDb21ibyBkYXksIENDb21ibyBob3VyLCBDQ29tYm8gbWludXRlLCBDQ29tYm8gc2Vjb25kLCBDQ29tYm8gbXNlY29uZCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcigpOwotCQlhcnRpZmFjdEVkaXRfID0gYXJ0aWZhY3RFZGl0OwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJeWVhcl8gPSB5ZWFyOwotCQltb250aF8gPSBtb250aDsKLQkJZGF5XyA9IGRheTsKLQkJaG91cl8gPSBob3VyOwotCQltaW51dGVfID0gbWludXRlOwotCQlzZWNvbmRfID0gc2Vjb25kOwotCQltc2Vjb25kXyA9IG1zZWNvbmQ7Ci0JCW5pbGxhYmxlXyA9IG5pbGxhYmxlOwotCQl5ZWFyXy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJbW9udGhfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlkYXlfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlob3VyXy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJbWludXRlXy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJc2Vjb25kXy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJbXNlY29uZF8uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJFeHBpcmVzQ0NvbWJvKEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQsIEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENDb21ibyB5ZWFyLCBDQ29tYm8gbW9udGgsIENDb21ibyBkYXksIENDb21ibyBob3VyLCBDQ29tYm8gbWludXRlLCBDQ29tYm8gc2Vjb25kLCBDQ29tYm8gbXNlY29uZCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQl0aGlzKGFydGlmYWN0RWRpdCwgZmVhdHVyZSwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1zZWNvbmQsIG5pbGxhYmxlKTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQlpZiAoKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCkgJiYgc3luY1RleHRBbmRNb2RlbCgpICYmIG1zZy5nZXRGZWF0dXJlKCkgPT0gZmVhdHVyZV8pCi0JCQlzZXRUZXh0KG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKHN5bmNUZXh0QW5kTW9kZWwoKSkgewotCQkJQ29tbWFuZE1vZGlmeVRleHQgY29tbWFuZCA9IG5ldyBDb21tYW5kTW9kaWZ5VGV4dChudWxsLCBudWxsLCBlT2JqZWN0XywgZmVhdHVyZV8sIGV4cGlyZXMoKSwgbmlsbGFibGVfKTsKLQkJCWFydGlmYWN0RWRpdF8uZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJYXJ0aWZhY3RFZGl0Xy5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBleHBpcmVzKCkgewotCQlyZXR1cm4gIlAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQl5ZWFyXy5nZXRUZXh0KCkgKyAiWSIgKyAvLyROT04tTkxTLTEkCi0JCQkJCW1vbnRoXy5nZXRUZXh0KCkgKyAiTSIgKyAvLyROT04tTkxTLTEkCi0JCQkJCWRheV8uZ2V0VGV4dCgpICsgIkRUIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJaG91cl8uZ2V0VGV4dCgpICsgIkgiICsgLy8kTk9OLU5MUy0xJAotCQkJCQltaW51dGVfLmdldFRleHQoKSArICJNIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJc2Vjb25kXy5nZXRUZXh0KCkgKyAiLiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCW1zZWNvbmRfLmdldFRleHQoKSArICJTIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJc2V0VGV4dCgoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWlmICh5ZWFyXyAhPSBudWxsICYmICF5ZWFyXy5pc0Rpc3Bvc2VkKCkpCi0JCQl5ZWFyXy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKG1vbnRoXyAhPSBudWxsICYmICFtb250aF8uaXNEaXNwb3NlZCgpKQotCQkJbW9udGhfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlpZiAoZGF5XyAhPSBudWxsICYmICFkYXlfLmlzRGlzcG9zZWQoKSkKLQkJCWRheV8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChob3VyXyAhPSBudWxsICYmICFob3VyXy5pc0Rpc3Bvc2VkKCkpCi0JCQlob3VyXy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKG1pbnV0ZV8gIT0gbnVsbCAmJiAhbWludXRlXy5pc0Rpc3Bvc2VkKCkpCi0JCQltaW51dGVfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlpZiAoc2Vjb25kXyAhPSBudWxsICYmICFzZWNvbmRfLmlzRGlzcG9zZWQoKSkKLQkJCXNlY29uZF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChtc2Vjb25kXyAhPSBudWxsICYmICFtc2Vjb25kXy5pc0Rpc3Bvc2VkKCkpCi0JCQltc2Vjb25kXy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzeW5jVGV4dEFuZE1vZGVsKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJU3RyaW5nIG1vZGVsVmFsdWUgPSAoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGV4cGlyZXMoKTsKLQkJCWlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgbW9kZWxWYWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCXJldHVybiAhKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPD0gMCk7Ci0JCQlyZXR1cm4gIShtb2RlbFZhbHVlLmVxdWFscyh2YWx1ZSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGV4dChTdHJpbmcgbW9kZWxWYWx1ZSkgewotCQlpZiAobW9kZWxWYWx1ZSAhPSBudWxsKSB7Ci0JCQlpbnQgeSA9IG1vZGVsVmFsdWUuaW5kZXhPZigiWSIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgbW8gPSBtb2RlbFZhbHVlLmluZGV4T2YoIk0iKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGQgPSBtb2RlbFZhbHVlLmluZGV4T2YoIkQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGggPSBtb2RlbFZhbHVlLmluZGV4T2YoIkgiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IG1pID0gbW9kZWxWYWx1ZS5sYXN0SW5kZXhPZigiTSIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgcyA9IG1vZGVsVmFsdWUuaW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgbXMgPSBtb2RlbFZhbHVlLmluZGV4T2YoIlMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoIXllYXJfLmlzRGlzcG9zZWQoKSAmJiB5ID4gMCkKLQkJCQl5ZWFyXy5zZXRUZXh0KG1vZGVsVmFsdWUuc3Vic3RyaW5nKDEsIHkpKTsKLQkJCWlmICghbW9udGhfLmlzRGlzcG9zZWQoKSAmJiBtbyA+IDApCi0JCQkJbW9udGhfLnNldFRleHQobW9kZWxWYWx1ZS5zdWJzdHJpbmcoeSArIDEsIG1vKSk7Ci0JCQlpZiAoIWRheV8uaXNEaXNwb3NlZCgpICYmIGQgPiAwKQotCQkJCWRheV8uc2V0VGV4dChtb2RlbFZhbHVlLnN1YnN0cmluZyhtbyArIDEsIGQpKTsKLQkJCWlmICghaG91cl8uaXNEaXNwb3NlZCgpICYmIGggPiAwKQotCQkJCWhvdXJfLnNldFRleHQobW9kZWxWYWx1ZS5zdWJzdHJpbmcoZCArIDIsIGgpKTsKLQkJCWlmICghbWludXRlXy5pc0Rpc3Bvc2VkKCkgJiYgbWkgPiAwKQotCQkJCW1pbnV0ZV8uc2V0VGV4dChtb2RlbFZhbHVlLnN1YnN0cmluZyhoICsgMSwgbWkpKTsKLQkJCWlmICghc2Vjb25kXy5pc0Rpc3Bvc2VkKCkgJiYgcyA+IDApCi0JCQkJc2Vjb25kXy5zZXRUZXh0KG1vZGVsVmFsdWUuc3Vic3RyaW5nKG1pICsgMSwgcykpOwotCQkJaWYgKCFtc2Vjb25kXy5pc0Rpc3Bvc2VkKCkgJiYgbXMgPiAwKQotCQkJCW1zZWNvbmRfLnNldFRleHQobW9kZWxWYWx1ZS5zdWJzdHJpbmcocyArIDEsIG1zKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckhhbmRsZXJDbGFzc1RleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVySGFuZGxlckNsYXNzVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2FiNWJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVySGFuZGxlckNsYXNzVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotLyoKLSAqIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRNb2RpZnlIYW5kbGVyQ2xhc3NUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVySGFuZGxlckNsYXNzVGV4dCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0OwotCXByb3RlY3RlZCBIYW5kbGVyIGVPYmplY3RfOwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJvdGVjdGVkIFRleHQgdGV4dF87Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbmlsbGFibGVfOwotCi0JcHVibGljIEFkYXB0ZXJIYW5kbGVyQ2xhc3NUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgVGV4dCB0ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWFydGlmYWN0RWRpdCA9IGFuQXJ0aWZhY3RFZGl0OwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCWZlYXR1cmVfID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpOwotCQl0ZXh0XyA9IHRleHQ7Ci0JCW5pbGxhYmxlXyA9IGZhbHNlOwotCQl0ZXh0Xy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckhhbmRsZXJDbGFzc1RleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBIYW5kbGVyIGVPYmplY3QsIFRleHQgdGV4dCkgewotCQl0aGlzKGFuQXJ0aWZhY3RFZGl0LCB0ZXh0KTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQlpZiAoKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCkgJiYgc3luY1RleHRBbmRNb2RlbCgpICYmIG1zZy5nZXRGZWF0dXJlKCkgPT0gZmVhdHVyZV8pIHsKLQkJCVN0cmluZyBuZXdDbGFzc05hbWUgPSBlT2JqZWN0Xy5nZXRIYW5kbGVyQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJc2V0VGV4dChuZXdDbGFzc05hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChzeW5jVGV4dEFuZE1vZGVsKCkpIHsKLQkJCUNvbW1hbmRNb2RpZnlIYW5kbGVyQ2xhc3NUZXh0IGNvbW1hbmQgPSBuZXcgQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQobnVsbCwgbnVsbCwgZU9iamVjdF8sIHRleHRfLmdldFRleHQoKSk7Ci0JCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCWFydGlmYWN0RWRpdC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoSGFuZGxlciBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlTdHJpbmcgbmV3Q2xhc3NOYW1lID0gZU9iamVjdF8uZ2V0SGFuZGxlckNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCXNldFRleHQobmV3Q2xhc3NOYW1lKTsKLQkJfSBlbHNlCi0JCQlzZXRUZXh0KG51bGwpOwotCX0KLQotCS8qCi0JICogcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeyBmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JICogYWRhcHQoZU9iamVjdCk7IH0KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJaWYgKHRleHRfICE9IG51bGwgJiYgIXRleHRfLmlzRGlzcG9zZWQoKSkKLQkJCXRleHRfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZSA9IGVPYmplY3RfLmdldEhhbmRsZXJDbGFzcygpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQlTdHJpbmcgdGV4dFZhbHVlID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKG1vZGVsVmFsdWUgPT0gbnVsbCB8fCBtb2RlbFZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJcmV0dXJuICEodGV4dFZhbHVlID09IG51bGwgfHwgdGV4dFZhbHVlLmxlbmd0aCgpIDw9IDApOwotCQkJcmV0dXJuICEobW9kZWxWYWx1ZS5lcXVhbHModGV4dFZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICghdGV4dF8uaXNEaXNwb3NlZCgpKSB7Ci0JCQlTdHJpbmcgY3VyclRleHQgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCWlmIChjdXJyVGV4dCAhPSBudWxsICYmIGN1cnJUZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQkJdGV4dF8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoIXRleHQuZXF1YWxzKGN1cnJUZXh0KSkKLQkJCQl0ZXh0Xy5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBqMmVlRWRpdE1vZGVsLgotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0KCkgewotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0TW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBqMmVlRWRpdE1vZGVsIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0KSB7Ci0JCWFydGlmYWN0RWRpdCA9IGFuQXJ0aWZhY3RFZGl0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJMYXllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJMYXllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjlkMGQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyTGF5ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckxheWVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCXByaXZhdGUgRU9iamVjdCBwYXJlbnRfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByaXZhdGUgRUNsYXNzIGNoaWxkRUNsYXNzXzsKLQlwcml2YXRlIEVPYmplY3QgY2hpbGRfOwotCi0JcHVibGljIEFkYXB0ZXJMYXllcihFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVDbGFzcyBjaGlsZEVDbGFzcykgewotCQlzdXBlcigpOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JCWNoaWxkRUNsYXNzXyA9IGNoaWxkRUNsYXNzOwotCQlhZGFwdChwYXJlbnRfKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uQUREIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkKLQkJCWFkYXB0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChjaGlsZF8gIT0gbnVsbCkKLQkJCWNoaWxkXy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXBhcmVudF8gPSBlT2JqZWN0OwotCQlhZGFwdENoaWxkKCk7Ci0JCWlmIChjaGlsZF8gIT0gbnVsbCkKLQkJCWNoaWxkXy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNoaWxkXyAhPSBudWxsKQotCQkJY2hpbGRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRDaGlsZCgpIHsKLQkJcmV0dXJuIGNoaWxkXzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRhcHRDaGlsZCgpIHsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iamVjdCA9IHBhcmVudF8uZUdldChmZWF0dXJlXyk7Ci0JCQlpZiAob2JqZWN0ID09IG51bGwpCi0JCQkJY2hpbGRfID0gY2hpbGRFQ2xhc3NfLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZShjaGlsZEVDbGFzc18pOwotCQkJZWxzZQotCQkJCWNoaWxkXyA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCX0gZWxzZQotCQkJY2hpbGRfID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRhcHRQYXJlbnQoKSB7Ci0JCWlmIChwYXJlbnRfICE9IG51bGwgJiYgY2hpbGRfICE9IG51bGwpIHsKLQkJCUVMaXN0IGNoaWxkRmVhdHVyZXMgPSBjaGlsZEVDbGFzc18uZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkRmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQkJYm9vbGVhbiBpc0ZlYXR1cmVTZXQ7Ci0JCQkJT2JqZWN0IGdyYW5kY2hpbGQgPSBjaGlsZF8uZUdldChjaGlsZEZlYXR1cmUpOwotCQkJCWlmIChncmFuZGNoaWxkICE9IG51bGwgJiYgZ3JhbmRjaGlsZCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJCQlpc0ZlYXR1cmVTZXQgPSAhKChFTGlzdCkgZ3JhbmRjaGlsZCkuaXNFbXB0eSgpOwotCQkJCWVsc2UKLQkJCQkJaXNGZWF0dXJlU2V0ID0gY2hpbGRfLmVJc1NldChjaGlsZEZlYXR1cmUpOwotCQkJCWlmIChpc0ZlYXR1cmVTZXQpIHsKLQkJCQkJcGFyZW50Xy5lU2V0KGZlYXR1cmVfLCBjaGlsZF8pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJcGFyZW50Xy5lVW5zZXQoZmVhdHVyZV8pOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUENSZWZUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclBDUmVmVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzFkMDRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUENSZWZUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5U0VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHJzaW5oYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGVyUENSZWZUZXh0IGV4dGVuZHMgQWRhcHRlclRleHQgewotCXB1YmxpYyBBZGFwdGVyUENSZWZUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFRleHQgdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihhbkFydGlmYWN0RWRpdCwgZmVhdHVyZSwgdGV4dCwgbmlsbGFibGUpOwotCX0KLQotCi0JcHVibGljIEFkYXB0ZXJQQ1JlZlRleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBUZXh0IHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIoYW5BcnRpZmFjdEVkaXQsIGVPYmplY3QsIGZlYXR1cmUsIHRleHQsIG5pbGxhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykgewotCQkJT2JqZWN0IG9iaiA9IGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pOwotCQkJU3RyaW5nIG9ialN0cmluZ1ZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlvYmpTdHJpbmdWYWx1ZSA9IChTdHJpbmcpIG9iajsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSmF2YUNsYXNzKSB7Ci0JCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpIG9iajsKLQkJCQlvYmpTdHJpbmdWYWx1ZSA9IGphdmFDbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJfQotCQkJc2V0VGV4dChvYmpTdHJpbmdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKHN5bmNUZXh0QW5kTW9kZWwoKSkgewotCQkJLy9IYW5kbGUgUG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZmVhdHVyZSBpbiBhIHNwZWNpYWwgd2F5LgotCQkJU3RyaW5nIFNFSUZlYXR1cmVOYW1lID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLmdldE5hbWUoKTsKLQkJCWlmICgoZU9iamVjdF8gaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50UmVmKSAmJiAoZmVhdHVyZV8uZ2V0TmFtZSgpLmVxdWFscyhTRUlGZWF0dXJlTmFtZSkpKSB7Ci0JCQkJQ29tbWFuZE1vZGlmeVNFSSBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlTRUkobnVsbCwgbnVsbCwgKFBvcnRDb21wb25lbnRSZWYpIGVPYmplY3RfLCB0ZXh0Xy5nZXRUZXh0KCksIG5pbGxhYmxlXyk7Ci0JCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQ29tbWFuZE1vZGlmeVRleHQgY29tbWFuZCA9IG5ldyBDb21tYW5kTW9kaWZ5VGV4dChudWxsLCBudWxsLCBlT2JqZWN0XywgZmVhdHVyZV8sIHRleHRfLmdldFRleHQoKSwgbmlsbGFibGVfKTsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCWFydGlmYWN0RWRpdC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlPYmplY3Qgb2JqID0gZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCQlTdHJpbmcgb2JqU3RyaW5nVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCW9ialN0cmluZ1ZhbHVlID0gKFN0cmluZykgb2JqOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBKYXZhQ2xhc3MpIHsKLQkJCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcykgb2JqOwotCQkJCW9ialN0cmluZ1ZhbHVlID0gamF2YUNsYXNzLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQl9Ci0JCQlzZXRUZXh0KG9ialN0cmluZ1ZhbHVlKTsKLQkJfSBlbHNlCi0JCQlzZXRUZXh0KG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZTsKLQkJCS8vSGFuZGxlIFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGZlYXR1cmUgaW4gYSBzcGVjaWFsIHdheS4KLQkJCVN0cmluZyBTRUlGZWF0dXJlTmFtZSA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKS5nZXROYW1lKCk7Ci0JCQlpZiAoKGVPYmplY3RfIGluc3RhbmNlb2YgUG9ydENvbXBvbmVudFJlZikgJiYgKGZlYXR1cmVfLmdldE5hbWUoKS5lcXVhbHMoU0VJRmVhdHVyZU5hbWUpKSkgewotCQkJCW1vZGVsVmFsdWUgPSAoKFBvcnRDb21wb25lbnRSZWYpIGVPYmplY3RfKS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlbFZhbHVlID0gKFN0cmluZykgZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCQl9Ci0JCQlTdHJpbmcgdGV4dFZhbHVlID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKG1vZGVsVmFsdWUgPT0gbnVsbCB8fCBtb2RlbFZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJcmV0dXJuICEodGV4dFZhbHVlID09IG51bGwgfHwgdGV4dFZhbHVlLmxlbmd0aCgpIDw9IDApOwotCQkJcmV0dXJuICEobW9kZWxWYWx1ZS5lcXVhbHModGV4dFZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJRTmFtZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUU5hbWVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMDMwZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJRTmFtZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kQWRkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZFJlbW92ZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotLyoqCi0gKiBHZW5lcmljIGVTZXQncyB3aWxsIG5vdCB3b3JrIHdoZW4gc2V0dGluZyBuYW1lc3BhY2VVUklzIG9uIFFOYW1lJ3Mgc28gQWRhcHRlckVsZW1lbnQgY2Fubm90IGJlCi0gKiB1c2VkIHdoZW4gdGhlIGNoaWxkIGlzIGEgUU5hbWUuIFRoaXMgY2xhc3MgaXMgdmVyeSBzaW1pbGFyIEFkYXB0ZXJFbGVtZW50IGJ1dCBoYXMgc3BlY2lhbAotICogYmVoYXZpb3VyIGZvciBoYW5kbGluZyBRTmFtZSdzLgotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRlclFOYW1lRWxlbWVudCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0OwotCXByaXZhdGUgRU9iamVjdCBwYXJlbnRfOwotCXByaXZhdGUgRUNsYXNzIGNoaWxkRUNsYXNzXzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmVfOwotCXByaXZhdGUgYm9vbGVhbiBjaGlsZE5pbGxhYmxlXzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzXzsKLQlwcml2YXRlIGJvb2xlYW5bXSBmZWF0dXJlc05pbGxhYmxlXzsKLQlwcml2YXRlIFRleHRbXSBmZWF0dXJlc1RleHRzXzsKLQlwcml2YXRlIEFkYXB0ZXJUZXh0W10gZmVhdHVyZXNBZGFwdGVyc187Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFkYXB0ZXJRTmFtZUVsZW1lbnQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFQ2xhc3MgY2hpbGRFQ2xhc3MsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIGJvb2xlYW4gY2hpbGROaWxsYWJsZSwgVGV4dCBuc1VSSVRleHQsIFRleHQgbG9jYWxQYXJ0VGV4dCkgewotCQlzdXBlcigpOwotCQlhcnRpZmFjdEVkaXQgPSBhbkFydGlmYWN0RWRpdDsKLQkJcGFyZW50XyA9IG51bGw7Ci0JCWNoaWxkRUNsYXNzXyA9IGNoaWxkRUNsYXNzOwotCQljaGlsZEZlYXR1cmVfID0gY2hpbGRGZWF0dXJlOwotCQljaGlsZE5pbGxhYmxlXyA9IGNoaWxkTmlsbGFibGU7Ci0JCUNvbW1vblBhY2thZ2UgY29tbW9uUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCS8vIFNldCB1cCBRTmFtZSBmZWF0dXJlcwotCQlmZWF0dXJlc18gPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlWzJdOwotCQlmZWF0dXJlc19bMF0gPSBjb21tb25QS0cuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCk7Ci0JCWZlYXR1cmVzX1sxXSA9IGNvbW1vblBLRy5nZXRRTmFtZV9Mb2NhbFBhcnQoKTsKLQkJZmVhdHVyZXNOaWxsYWJsZV8gPSBuZXcgYm9vbGVhblsyXTsKLQkJZmVhdHVyZXNOaWxsYWJsZV9bMF0gPSBmYWxzZTsKLQkJZmVhdHVyZXNOaWxsYWJsZV9bMV0gPSBmYWxzZTsKLQkJZmVhdHVyZXNUZXh0c18gPSBuZXcgVGV4dFsyXTsKLQkJZmVhdHVyZXNUZXh0c19bMF0gPSBuc1VSSVRleHQ7Ci0JCWZlYXR1cmVzVGV4dHNfWzFdID0gbG9jYWxQYXJ0VGV4dDsKLQkJYWRkTW9kaWZ5TGlzdGVuZXIoKTsKLQkJZmVhdHVyZXNBZGFwdGVyc18gPSBuZXcgQWRhcHRlclRleHRbZmVhdHVyZXNfLmxlbmd0aF07Ci0JCW5ld0FkYXB0ZXJzKG51bGwpOwotCi0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBZGFwdGVyUU5hbWVFbGVtZW50KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRU9iamVjdCBwYXJlbnQsIEVDbGFzcyBjaGlsZEVDbGFzcywgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgYm9vbGVhbiBjaGlsZE5pbGxhYmxlLCBUZXh0IG5zVVJJVGV4dCwgVGV4dCBsb2NhbFBhcnRUZXh0KSB7Ci0JCXRoaXMoYW5BcnRpZmFjdEVkaXQsIGNoaWxkRUNsYXNzLCBjaGlsZEZlYXR1cmUsIGNoaWxkTmlsbGFibGUsIG5zVVJJVGV4dCwgbG9jYWxQYXJ0VGV4dCk7Ci0JCWFkYXB0KHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5ld0FkYXB0ZXJzKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlc0FkYXB0ZXJzX1swXSA9IG5ldyBBZGFwdGVyUU5hbWVUZXh0KGFydGlmYWN0RWRpdCwgZmVhdHVyZXNfWzBdLCBmZWF0dXJlc1RleHRzX1swXSwgZmVhdHVyZXNOaWxsYWJsZV9bMF0pOwotCQkJZmVhdHVyZXNBZGFwdGVyc19bMV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBmZWF0dXJlc19bMV0sIGZlYXR1cmVzVGV4dHNfWzFdLCBmZWF0dXJlc05pbGxhYmxlX1sxXSk7Ci0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlc0FkYXB0ZXJzX1swXSA9IG5ldyBBZGFwdGVyUU5hbWVUZXh0KGFydGlmYWN0RWRpdCwgZU9iamVjdCwgZmVhdHVyZXNfWzBdLCBmZWF0dXJlc1RleHRzX1swXSwgZmVhdHVyZXNOaWxsYWJsZV9bMF0pOwotCQkJZmVhdHVyZXNBZGFwdGVyc19bMV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBlT2JqZWN0LCBmZWF0dXJlc19bMV0sIGZlYXR1cmVzVGV4dHNfWzFdLCBmZWF0dXJlc05pbGxhYmxlX1sxXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNUZXh0c18ubGVuZ3RoOyBpKyspCi0JCQlmZWF0dXJlc1RleHRzX1tpXS5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IGNoaWxkRmVhdHVyZV8pIHsKLQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJaWYgKGNoaWxkID09IG51bGwgJiYgIWNoaWxkTmlsbGFibGVfKQotCQkJCWNoaWxkID0gc2V0Q2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQkJZmVhdHVyZXNBZGFwdGVyc19baV0uYWRhcHQoY2hpbGQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWJvb2xlYW4gaXNUZXh0c051bGwgPSBpc1RleHRzTnVsbCgpOwotCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJYm9vbGVhbiBjaGlsZENhbkJlUmVtb3ZlZCA9IHRydWU7Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBhbGxmZWF0dXJlcyA9IGNoaWxkRUNsYXNzXy5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChhbGxmZWF0dXJlcy5oYXNOZXh0KCkpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgdGhpc0ZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBhbGxmZWF0dXJlcy5uZXh0KCk7Ci0JCQkJaWYgKCFhZGFwdGluZ0ZlYXR1cmUodGhpc0ZlYXR1cmUpICYmIGNoaWxkLmVJc1NldCh0aGlzRmVhdHVyZSkpIHsKLQkJCQkJY2hpbGRDYW5CZVJlbW92ZWQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpc1RleHRzTnVsbCAmJiBjaGlsZCAhPSBudWxsICYmIGNoaWxkTmlsbGFibGVfICYmIGNoaWxkQ2FuQmVSZW1vdmVkKSB7Ci0JCQlkaXNwb3NlQWRhcHRlcnMoKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJQ29tbWFuZFJlbW92ZUVsZW1lbnQgY29tbWFuZCA9IG5ldyBDb21tYW5kUmVtb3ZlRWxlbWVudChudWxsLCBudWxsLCBwYXJlbnRfLCBjaGlsZEZlYXR1cmVfKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJbmV3QWRhcHRlcnMobnVsbCk7Ci0JCX0gZWxzZSBpZiAoIWlzVGV4dHNOdWxsICYmIGNoaWxkID09IG51bGwpIHsKLQkJCWRpc3Bvc2VBZGFwdGVycygpOwotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQljaGlsZCA9IGNyZWF0ZUNoaWxkKCk7Ci0JCQlzZXRGZWF0dXJlc09uQ2hpbGQoY2hpbGQpOwotCQkJLyoKLQkJCSAqIHJlcGxhY2VkIGJ5IHNldEZlYXR1cmVzT25DaGlsZCBmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzXy5sZW5ndGg7IGkrKykgeyBTdHJpbmcKLQkJCSAqIHRleHQgPSBmZWF0dXJlc1RleHRzX1tpXS5nZXRUZXh0KCk7IGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApCi0JCQkgKiBjaGlsZC5lU2V0KGZlYXR1cmVzX1tpXSwgdGV4dCk7IH0KLQkJCSAqLwotCQkJQ29tbWFuZEFkZEVsZW1lbnQgY29tbWFuZCA9IG5ldyBDb21tYW5kQWRkRWxlbWVudChudWxsLCBudWxsLCBwYXJlbnRfLCBjaGlsZEZlYXR1cmVfLCBjaGlsZCk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQlwYXJlbnRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCW5ld0FkYXB0ZXJzKGNoaWxkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1RleHRzTnVsbCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1RleHRzXy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHRleHQgPSBmZWF0dXJlc1RleHRzX1tpXS5nZXRUZXh0KCk7Ci0JCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlwYXJlbnRfID0gZU9iamVjdDsKLQkJRU9iamVjdCBjaGlsZCA9IG51bGw7Ci0JCWlmIChwYXJlbnRfICE9IG51bGwpIHsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJY2hpbGQgPSAoRU9iamVjdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJaWYgKGNoaWxkID09IG51bGwgJiYgIWNoaWxkTmlsbGFibGVfKQotCQkJCWNoaWxkID0gc2V0Q2hpbGQoKTsKLQkJfQotCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzQWRhcHRlcnNfLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNBZGFwdGVyc19baV0uYWRhcHQoY2hpbGQpOwotCQlhZGRNb2RpZnlMaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBzZXRDaGlsZCgpIHsKLQkJRU9iamVjdCBjaGlsZCA9IGNyZWF0ZUNoaWxkKCk7Ci0JCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgY2hpbGQpOwotCQlwYXJlbnRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVDaGlsZCgpIHsKLQkJRUZhY3RvcnkgY2hpbGRGYWN0b3J5ID0gY2hpbGRFQ2xhc3NfLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQlFT2JqZWN0IGNoaWxkID0gY2hpbGRGYWN0b3J5LmNyZWF0ZShjaGlsZEVDbGFzc18pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzXy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFmZWF0dXJlc05pbGxhYmxlX1tpXSkKLQkJCQljaGlsZC5lU2V0KGZlYXR1cmVzX1tpXSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwYXJlbnRfICE9IG51bGwpCi0JCQlwYXJlbnRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZGlzcG9zZUFkYXB0ZXJzKCk7Ci0JCXJlbW92ZU1vZGlmeUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VBZGFwdGVycygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc0FkYXB0ZXJzXy5sZW5ndGg7IGkrKykKLQkJCWZlYXR1cmVzQWRhcHRlcnNfW2ldLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNUZXh0c18ubGVuZ3RoOyBpKyspCi0JCQlpZiAoZmVhdHVyZXNUZXh0c19baV0gIT0gbnVsbCAmJiAhZmVhdHVyZXNUZXh0c19baV0uaXNEaXNwb3NlZCgpKQotCQkJCWZlYXR1cmVzVGV4dHNfW2ldLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGFwdGluZ0ZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmVzXyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNfLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZSA9PSBmZWF0dXJlc19baV0pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGZWF0dXJlc09uQ2hpbGQoRU9iamVjdCBjaGlsZCkgewotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBRTmFtZSkgLy9UaGlzIHdpbGwgYWx3YXlzIGJlIHRydWUuCi0JCXsKLQkJCVFOYW1lIHFuYW1lID0gKFFOYW1lKSBjaGlsZDsKLQkJCVN0cmluZyBuYW1lc3BhY2VVUklWYWx1ZSA9IGZlYXR1cmVzVGV4dHNfWzBdLmdldFRleHQoKTsKLQkJCVN0cmluZyBsb2NhbFBhcnRWYWx1ZSA9IGZlYXR1cmVzVGV4dHNfWzFdLmdldFRleHQoKTsKLQkJCWlmIChuYW1lc3BhY2VVUklWYWx1ZSA9PSBudWxsIHx8IG5hbWVzcGFjZVVSSVZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkvL0p1c3Qgc2V0IHRoZSBsb2NhbCBwYXJ0Ci0JCQkJaWYgKGxvY2FsUGFydFZhbHVlICE9IG51bGwgJiYgbG9jYWxQYXJ0VmFsdWUubGVuZ3RoKCkgPiAwKQotCQkJCQlxbmFtZS5zZXRMb2NhbFBhcnQobG9jYWxQYXJ0VmFsdWUpOwotCi0JCQl9IGVsc2UgewotCQkJCWlmIChsb2NhbFBhcnRWYWx1ZSA9PSBudWxsKQotCQkJCQlsb2NhbFBhcnRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvL1NldCBuYW1lc3BhY2UgYW5kIGxvY2FsIHBhcnQgdXNpbmcgUU5hbWVIZWxwZXIKLQkJCQlRTmFtZUhlbHBlci5zZXRRTmFtZVZhbHVlKHFuYW1lLCBuYW1lc3BhY2VVUklWYWx1ZSwgbG9jYWxQYXJ0VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclFOYW1lVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJRTmFtZVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5NjhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclFOYW1lVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRNb2RpZnlOU1VSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotCi0KLS8qKgotICogU2luY2UgZ2VuZXJpYyBlU2V0J3Mgd2lsbCBub3Qgd29yayBmb3Igc2V0dGluZyBRTmFtZSBuYW1lc3BhY2VVUkkncywgdGhpcyBzdWJjbGFzcydzIHB1cnBvc2UgaXMKLSAqIHRvIG92ZXJyaWRlIHRoZSBiZWhhdmlvdXIgd2hlbiBuZWNlc3NhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGVyUU5hbWVUZXh0IGV4dGVuZHMgQWRhcHRlclRleHQgewotCi0JcHVibGljIEFkYXB0ZXJRTmFtZVRleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgVGV4dCB0ZXh0LCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXN1cGVyKGFuQXJ0aWZhY3RFZGl0LCBmZWF0dXJlLCB0ZXh0LCBuaWxsYWJsZSk7Ci0JfQotCi0KLQlwdWJsaWMgQWRhcHRlclFOYW1lVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFRleHQgdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihhbkFydGlmYWN0RWRpdCwgZU9iamVjdCwgZmVhdHVyZSwgdGV4dCwgbmlsbGFibGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQkvL0hhbmRsZSBRTmFtZV9OYW1lc3BhY2VVUkkgZmVhdHVyZSBpbiBhIHNwZWNpYWwgd2F5LgotCQkJU3RyaW5nIG5hbWVzcGFjZUZlYXR1cmVOYW1lID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkuZ2V0TmFtZSgpOwotCQkJaWYgKChlT2JqZWN0XyBpbnN0YW5jZW9mIFFOYW1lKSAmJiAoZmVhdHVyZV8uZ2V0TmFtZSgpLmVxdWFscyhuYW1lc3BhY2VGZWF0dXJlTmFtZSkpKSB7Ci0JCQkJQ29tbWFuZE1vZGlmeU5TVVJJIGNvbW1hbmQgPSBuZXcgQ29tbWFuZE1vZGlmeU5TVVJJKG51bGwsIG51bGwsIChRTmFtZSkgZU9iamVjdF8sIHRleHRfLmdldFRleHQoKSwgbmlsbGFibGVfKTsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQkJfSAKLQkJCX0gZWxzZSB7Ci0JCQkJQ29tbWFuZE1vZGlmeVRleHQgY29tbWFuZCA9IG5ldyBDb21tYW5kTW9kaWZ5VGV4dChudWxsLCBudWxsLCBlT2JqZWN0XywgZmVhdHVyZV8sIHRleHRfLmdldFRleHQoKSwgbmlsbGFibGVfKTsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQkJfSAKLQkJCX0KLQotCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTE4NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJTZXJ2aWNlSW50ZXJmYWNlVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotLyoKLSAqIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0IGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQ7Ci0JcHJvdGVjdGVkIFNlcnZpY2VSZWYgZU9iamVjdF87Ci0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcm90ZWN0ZWQgVGV4dCB0ZXh0XzsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBuaWxsYWJsZV87Ci0KLQlwdWJsaWMgQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgVGV4dCB0ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWFydGlmYWN0RWRpdCA9IGFuQXJ0aWZhY3RFZGl0OwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCWZlYXR1cmVfID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKTsKLQkJdGV4dF8gPSB0ZXh0OwotCQluaWxsYWJsZV8gPSBmYWxzZTsKLQkJdGV4dF8uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJTZXJ2aWNlSW50ZXJmYWNlVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIFNlcnZpY2VSZWYgZU9iamVjdCwgVGV4dCB0ZXh0KSB7Ci0JCXRoaXMoYW5BcnRpZmFjdEVkaXQsIHRleHQpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykgewotCQkJU3RyaW5nIG5ld0NsYXNzTmFtZSA9IGVPYmplY3RfLmdldFNlcnZpY2VJbnRlcmZhY2UoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJc2V0VGV4dChuZXdDbGFzc05hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChzeW5jVGV4dEFuZE1vZGVsKCkpIHsKLQkJCUNvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dChudWxsLCBudWxsLCBlT2JqZWN0XywgdGV4dF8uZ2V0VGV4dCgpKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KFNlcnZpY2VSZWYgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJaWYgKGVPYmplY3RfLmdldFNlcnZpY2VJbnRlcmZhY2UoKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5ld0NsYXNzTmFtZSA9IGVPYmplY3RfLmdldFNlcnZpY2VJbnRlcmZhY2UoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJCXNldFRleHQobmV3Q2xhc3NOYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0VGV4dChudWxsKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlzZXRUZXh0KG51bGwpOwotCX0KLQotCS8qCi0JICogcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeyBmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JICogYWRhcHQoZU9iamVjdCk7IH0KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJaWYgKHRleHRfICE9IG51bGwgJiYgIXRleHRfLmlzRGlzcG9zZWQoKSkKLQkJCXRleHRfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoZU9iamVjdF8uZ2V0U2VydmljZUludGVyZmFjZSgpICE9IG51bGwpCi0JCQkJbW9kZWxWYWx1ZSA9IGVPYmplY3RfLmdldFNlcnZpY2VJbnRlcmZhY2UoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJU3RyaW5nIHRleHRWYWx1ZSA9IHRleHRfLmdldFRleHQoKTsKLQkJCWlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgbW9kZWxWYWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCXJldHVybiAhKHRleHRWYWx1ZSA9PSBudWxsIHx8IHRleHRWYWx1ZS5sZW5ndGgoKSA8PSAwKTsKLQkJCXJldHVybiAhKG1vZGVsVmFsdWUuZXF1YWxzKHRleHRWYWx1ZSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXRleHRfLmlzRGlzcG9zZWQoKSkgewotCQkJU3RyaW5nIGN1cnJUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDw9IDApIHsKLQkJCQlpZiAoY3VyclRleHQgIT0gbnVsbCAmJiBjdXJyVGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCXRleHRfLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKCF0ZXh0LmVxdWFscyhjdXJyVGV4dCkpCi0JCQkJdGV4dF8uc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGQ0ZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlclRleHQgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgRU9iamVjdCBlT2JqZWN0XzsKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByb3RlY3RlZCBUZXh0IHRleHRfOwotCXByb3RlY3RlZCBib29sZWFuIG5pbGxhYmxlXzsKLQlwcm90ZWN0ZWQgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdDsKLQotCXB1YmxpYyBBZGFwdGVyVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBUZXh0IHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIoKTsKLQkJYXJ0aWZhY3RFZGl0ID0gYW5BcnRpZmFjdEVkaXQ7Ci0JCWVPYmplY3RfID0gbnVsbDsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCQl0ZXh0XyA9IHRleHQ7Ci0JCW5pbGxhYmxlXyA9IG5pbGxhYmxlOwotCQl0ZXh0Xy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlclRleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBUZXh0IHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJdGhpcyhhbkFydGlmYWN0RWRpdCwgZmVhdHVyZSwgdGV4dCwgbmlsbGFibGUpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykKLQkJCXNldFRleHQobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQlDb21tYW5kTW9kaWZ5VGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCBmZWF0dXJlXywgdGV4dF8uZ2V0VGV4dCgpLCBuaWxsYWJsZV8pOwotCQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJc2V0VGV4dCgoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKSk7Ci0JCX0gZWxzZQotCQkJc2V0VGV4dChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWlmICh0ZXh0XyAhPSBudWxsICYmICF0ZXh0Xy5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0Xy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jVGV4dEFuZE1vZGVsKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJU3RyaW5nIG1vZGVsVmFsdWUgPSAoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCVN0cmluZyB0ZXh0VmFsdWUgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAobW9kZWxWYWx1ZSA9PSBudWxsIHx8IG1vZGVsVmFsdWUubGVuZ3RoKCkgPD0gMCkKLQkJCQlyZXR1cm4gISh0ZXh0VmFsdWUgPT0gbnVsbCB8fCB0ZXh0VmFsdWUubGVuZ3RoKCkgPD0gMCk7Ci0JCQlyZXR1cm4gIShtb2RlbFZhbHVlLmVxdWFscyh0ZXh0VmFsdWUpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXRleHRfLmlzRGlzcG9zZWQoKSkgewotCQkJU3RyaW5nIGN1cnJUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDw9IDApIHsKLQkJCQlpZiAoY3VyclRleHQgIT0gbnVsbCAmJiBjdXJyVGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCXRleHRfLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKCF0ZXh0LmVxdWFscyhjdXJyVGV4dCkpCi0JCQkJdGV4dF8uc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgajJlZUVkaXRNb2RlbC4KLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdCgpIHsKLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogICAgICAgICAgICBUaGUgajJlZUVkaXRNb2RlbCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCkgewotCQlhcnRpZmFjdEVkaXQgPSBhbkFydGlmYWN0RWRpdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVGV4dENDb21iby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJUZXh0Q0NvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODIyZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJUZXh0Q0NvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJUZXh0Q0NvbWJvIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0XzsKLQlwcml2YXRlIEVPYmplY3QgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBDQ29tYm8gdGV4dF87Ci0JcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlXzsKLQotCXB1YmxpYyBBZGFwdGVyVGV4dENDb21ibyhBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ0NvbWJvIHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIoKTsKLQkJYXJ0aWZhY3RFZGl0XyA9IGFydGlmYWN0RWRpdDsKLQkJZU9iamVjdF8gPSBudWxsOwotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JCXRleHRfID0gdGV4dDsKLQkJbmlsbGFibGVfID0gbmlsbGFibGU7Ci0JCXRleHRfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyVGV4dENDb21ibyhBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0LCBFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDQ29tYm8gdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQl0aGlzKGFydGlmYWN0RWRpdCwgZmVhdHVyZSwgdGV4dCwgbmlsbGFibGUpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykKLQkJCXNldFRleHQobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQlDb21tYW5kTW9kaWZ5VGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCBmZWF0dXJlXywgdGV4dF8uZ2V0VGV4dCgpLCBuaWxsYWJsZV8pOwotCQkJYXJ0aWZhY3RFZGl0Xy5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXRfLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCXNldFRleHQoKFN0cmluZykgZU9iamVjdF8uZUdldChmZWF0dXJlXykpOwotCQl9IGVsc2UKLQkJCXNldFRleHQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JCWFkYXB0KGVPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlpZiAodGV4dF8gIT0gbnVsbCAmJiAhdGV4dF8uaXNEaXNwb3NlZCgpKQotCQkJdGV4dF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZSA9IChTdHJpbmcpIGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pOwotCQkJU3RyaW5nIHRleHRWYWx1ZSA9IHRleHRfLmdldFRleHQoKTsKLQkJCWlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgbW9kZWxWYWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCXJldHVybiAhKHRleHRWYWx1ZSA9PSBudWxsIHx8IHRleHRWYWx1ZS5sZW5ndGgoKSA8PSAwKTsKLQkJCXJldHVybiAhKG1vZGVsVmFsdWUuZXF1YWxzKHRleHRWYWx1ZSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXRleHRfLmlzRGlzcG9zZWQoKSkgewotCQkJU3RyaW5nIGN1cnJUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDw9IDApIHsKLQkJCQlpZiAoY3VyclRleHQgIT0gbnVsbCAmJiBjdXJyVGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCXRleHRfLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKCF0ZXh0LmVxdWFscyhjdXJyVGV4dCkpCi0JCQkJdGV4dF8uc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDYyOWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJWaWV3ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IGVPYmplY3RfOwotCXByaXZhdGUgVmlld2VyIHZpZXdlcl87Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZmVhdHVyZXNfOwotCi0JcHVibGljIEFkYXB0ZXJWaWV3ZXIoVmlld2VyIHZpZXdlcikgewotCQlzdXBlcigpOwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCXZpZXdlcl8gPSB2aWV3ZXI7Ci0JCWZlYXR1cmVzXyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlclZpZXdlcihFT2JqZWN0IGVPYmplY3QsIFZpZXdlciB2aWV3ZXIpIHsKLQkJdGhpcyh2aWV3ZXIpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uQUREIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkgewotCQkJT2JqZWN0IG5vdGlmaWVyID0gbXNnLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAobm90aWZpZXIgPT0gZU9iamVjdF8pIHsKLQkJCQlpZiAodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLkFERCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSkKLQkJCQkJaW50ZXJuYWxBZGFwdEZlYXR1cmUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgbXNnLmdldEZlYXR1cmUoKSk7Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCQkoKEVPYmplY3QpIG9iamVjdCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCQkJRUxpc3QgZUxpc3QgPSAoRUxpc3QpIG9iamVjdDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlPYmplY3QgaXRlbSA9IGVMaXN0LmdldChpKTsKLQkJCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCQkJCSgoRU9iamVjdCkgaXRlbSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdmlld2VyXy5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCXVuYWRhcHRBbGxDYWNoZWRGZWF0dXJlKCk7Ci0JCX0KLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJcmVhZGFwdEFsbENhY2hlZEZlYXR1cmUoKTsKLQkJfQotCQl2aWV3ZXJfLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKCFmZWF0dXJlc18uY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCWZlYXR1cmVzXy5hZGQoZmVhdHVyZSk7Ci0JCQlpbnRlcm5hbEFkYXB0RmVhdHVyZShmZWF0dXJlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEFkYXB0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJT2JqZWN0IGZlYXR1cmVPYmplY3QgPSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKGZlYXR1cmVPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRUxpc3QgZUFkYXB0ZXJzID0gKChFT2JqZWN0KSBmZWF0dXJlT2JqZWN0KS5lQWRhcHRlcnMoKTsKLQkJCQlpZiAoIWVBZGFwdGVycy5jb250YWlucyh0aGlzKSkKLQkJCQkJZUFkYXB0ZXJzLmFkZCh0aGlzKTsKLQkJCX0gZWxzZSBpZiAoZmVhdHVyZU9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJRUxpc3QgZUxpc3QgPSAoRUxpc3QpIGZlYXR1cmVPYmplY3Q7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gZUxpc3QuZ2V0KGkpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJRUxpc3QgZUFkYXB0ZXJzID0gKChFT2JqZWN0KSBvYmplY3QpLmVBZGFwdGVycygpOwotCQkJCQkJaWYgKCFlQWRhcHRlcnMuY29udGFpbnModGhpcykpCi0JCQkJCQkJZUFkYXB0ZXJzLmFkZCh0aGlzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkYXB0QWxsQ2FjaGVkRmVhdHVyZSgpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMgPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW2ZlYXR1cmVzXy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNbaV0gPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlc18uZ2V0KGkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJaW50ZXJuYWxBZGFwdEZlYXR1cmUoZmVhdHVyZXNbaV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuYWRhcHRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVzXy5yZW1vdmUoZmVhdHVyZSk7Ci0JCWludGVybmFsVW5hZGFwdEZlYXR1cmUoZmVhdHVyZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsVW5hZGFwdEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCU9iamVjdCBmZWF0dXJlT2JqZWN0ID0gZU9iamVjdF8uZUdldChmZWF0dXJlKTsKLQkJCWlmIChmZWF0dXJlT2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkoKEVPYmplY3QpIGZlYXR1cmVPYmplY3QpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCWVsc2UgaWYgKGZlYXR1cmVPYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCUVMaXN0IGVMaXN0ID0gKEVMaXN0KSBmZWF0dXJlT2JqZWN0OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGVMaXN0LmdldChpKTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCQkoKEVPYmplY3QpIG9iamVjdCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmFkYXB0QWxsQ2FjaGVkRmVhdHVyZSgpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMgPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW2ZlYXR1cmVzXy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNbaV0gPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlc18uZ2V0KGkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJaW50ZXJuYWxVbmFkYXB0RmVhdHVyZShmZWF0dXJlc1tpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXVuYWRhcHRBbGxDYWNoZWRGZWF0dXJlKCk7Ci0JCWZlYXR1cmVzXyA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVmlld2VySXRlbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJWaWV3ZXJJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmEzMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJWaWV3ZXJJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyVmlld2VySXRlbSB7Ci0JcHJpdmF0ZSBFTGlzdCBlT2JqZWN0c187Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0KLQlwdWJsaWMgQWRhcHRlclZpZXdlckl0ZW0oRUxpc3QgZU9iamVjdHMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWVPYmplY3RzXyA9IGVPYmplY3RzOwotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJWaWV3ZXJJdGVtKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZU9iamVjdHNfID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJZU9iamVjdHNfLmFkZChlT2JqZWN0KTsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFT2JqZWN0TGlzdCgpIHsKLQkJcmV0dXJuIGVPYmplY3RzXzsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmVfOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZENsaWVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkQ2xpZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGE5NjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkQ2xpZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEFkZENsaWVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgU2VydmljZVJlZiBwYXJlbnRfOwotCXByaXZhdGUgSGFuZGxlciBuZXdDaGlsZF87Ci0KLQkvL3ByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZENsaWVudEhhbmRsZXIoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIFNlcnZpY2VSZWYgcGFyZW50LCBIYW5kbGVyIG5ld0NoaWxkKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCW5ld0NoaWxkXyA9IG5ld0NoaWxkOwotCX0KLQotCXB1YmxpYyBDb21tYW5kQWRkQ2xpZW50SGFuZGxlcihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBwYXJlbnQsIFN0cmluZyBoYW5kbGVyTmFtZSwgSmF2YUNsYXNzIGhhbmRsZXJDbGFzcykgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQluZXdDaGlsZF8gPSBjcmVhdGVOZXdIYW5kbGVyKGhhbmRsZXJOYW1lLCBoYW5kbGVyQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kQWRkQ2xpZW50SGFuZGxlcihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBwYXJlbnQsIFN0cmluZyBoYW5kbGVyTmFtZSwgU3RyaW5nIGhhbmRsZXJDbGFzc05hbWUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJSmF2YUNsYXNzIGhhbmRsZXJDbGFzcyA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZihoYW5kbGVyQ2xhc3NOYW1lKTsKLQkJbmV3Q2hpbGRfID0gY3JlYXRlTmV3SGFuZGxlcihoYW5kbGVyTmFtZSwgaGFuZGxlckNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIEhhbmRsZXIgY3JlYXRlTmV3SGFuZGxlcihTdHJpbmcgaGFuZGxlck5hbWUsIEphdmFDbGFzcyBoYW5kbGVyQ2xhc3MpIHsKLQkJV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IGZhY3RvcnkgPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSgpOwotCQlIYW5kbGVyIG5ld0NoaWxkID0gZmFjdG9yeS5jcmVhdGVIYW5kbGVyKCk7Ci0JCW5ld0NoaWxkLnNldEhhbmRsZXJOYW1lKGhhbmRsZXJOYW1lKTsKLQkJbmV3Q2hpbGQuc2V0SGFuZGxlckNsYXNzKGhhbmRsZXJDbGFzcyk7Ci0JCXJldHVybiBuZXdDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIGluIHtAbGluayAjY2FuRXhlY3V0ZX10byBnaXZlIHRoZSBjb21tYW5kIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWR5IGl0c2VsZgotCSAqIGZvciBleGVjdXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdG9yZWQgaW4ge0BsaW5rICNjYW5FeGVjdXRlfS4gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIGFuZCB0byB5aWVsZCBhIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGFsbCBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gY2FuRXhlY3V0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uIFRoZQotCSAqIHtAbGluayBVbmV4ZWN1dGFibGVDb21tYW5kI0lOU1RBTkNFfS48Y29kZT5jYW5FeGVjdXRlKCk8L2NvZGU+IGFsd2F5cyByZXR1cm5zCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIDxiPm11c3QgPC9iPiBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHdoZW4gPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIHdoZW4KLQkgKiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlwYXJlbnRfLmdldEhhbmRsZXJzKCkuYWRkKG5ld0NoaWxkXyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXBhcmVudF8uZ2V0SGFuZGxlcnMoKS5yZW1vdmUobmV3Q2hpbGRfKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT5yZWRvPC9jb2RlPiB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgPGNvZGU+cmVkbzwvY29kZT4gYmVmb3JlIDxjb2RlPnVuZG88L2NvZGU+IGlzCi0JICogY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmIHlvdSBpbXBsZW1lbnQgPGNvZGU+cmVkbzwvY29kZT4gdG8gY2FsbAotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIGJ5IHRoYXQgZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4gVGhlCi0JICogcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4sIG9yIGFmdGVyIGFuCi0JICogPGNvZGU+dW5kbzwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqIGJ5IHRoZSBjb21tYW5kLiBUeXBpY2FsbHkgc2hvdWxkIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHNlbGVjdGlvbiB0aGF0IHNob3VsZCBiZSBoaWdobGlnaHRlZCB0bwotCSAqIGJlc3QgaWxsdXN0cmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBjb21tYW5kLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiw8Y29kZT5yZWRvPC9jb2RlPiwgb3IgPGNvZGU+dW5kbzwvY29kZT4gaXMgdW5kZWZpbmVkLiBUaGUKLQkgKiByZXN1bHQgbWF5IGJlIGRpZmZlcmVudCBhZnRlciBhbiA8Y29kZT51bmRvPC9jb2RlPiB0aGFuIGl0IGlzIGFmdGVyIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+Ci0JICogb3IgPGNvZGU+cmVkbzwvY29kZT4sIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYWZ0ZXIgZWl0aGVyIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogICAgICAgICBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBhZnRlcgotCSAqIHRoaXMgb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLiBUaGUKLQkgKiByZXN1bHRpbmcgY29tbWFuZCBtYXkganVzdCBiZSB0aGlzLCBpZiB0aGlzIGNvbW1hbmQgaXMgY2FwYWJhYmxlIG9mIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsCi0JICogaXQgd2lsbCBiZSBhIG5ldyBjb21tYW5kIGNyZWF0ZWQgdG8gY29tcG9zZSB0aGUgdHdvLgotCSAqIDxwPgotCSAqIEluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIG9mIHVzYWdlCi0JICogCi0JICogPHByZT4KLQkgKiBDb21tYW5kIHJlc3VsdCA9IHg7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJcmVzdWx0ID0gcmVzdWx0LmNoYWluKHkpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZH1hbmQgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bndyYXAoKX10byBvcHRpbWl6ZSB0aGUgcmVzdWx0OgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG91bmRDb21tYW5kIHN1YmNvbW1hbmRzID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCSAqIHN1YmNvbW1hbmRzLmFwcGVuZCh4KTsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlzdWJjb21tYW5kcy5hcHBlbmQoeSk7Ci0JICogQ29tbWFuZCByZXN1bHQgPSBzdWJjb21tYW5kcy51bndyYXAoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIGdpdmVzIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvbXBvdW5kIGNvbW1hbmQgY29tcG9zZXMgaXQncyByZXN1bHQgYW5kIGFmZmVjdGVkCi0JICogb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gY2hhaW4uCi0JICogQHJldHVybiBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjaGFpbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIHN1cGVyLmNoYWluKGNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRkZWRPYmplY3QoKSB7Ci0JCXJldHVybiBuZXdDaGlsZF87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhN2ZmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kQWRkRWxlbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIE9iamVjdCBuZXdDaGlsZF87Ci0JcHJpdmF0ZSBPYmplY3Qgb2xkQ2hpbGRfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZEVsZW1lbnQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBPYmplY3QgbmV3Q2hpbGQpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJY2hpbGRGZWF0dXJlXyA9IGNoaWxkRmVhdHVyZTsKLQkJbmV3Q2hpbGRfID0gbmV3Q2hpbGQ7Ci0JCW9sZENoaWxkXyA9IG51bGw7Ci0JCW9sZENoaWxkU2V0XyA9IHRydWU7Ci0JfQotCi0JcHVibGljIENvbW1hbmRBZGRFbGVtZW50KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IHBhcmVudCwgRUNsYXNzIGNoaWxkRUNsYXNzLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmVbXSBjaGlsZFByb3BlcnRpZXMsIE9iamVjdFtdIHByb3BlcnR5VmFsdWVzKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCWNoaWxkRmVhdHVyZV8gPSBjaGlsZEZlYXR1cmU7Ci0JCW5ld0NoaWxkXyA9IGNyZWF0ZU5ld0NoaWxkKGNoaWxkRUNsYXNzLCAoY2hpbGRQcm9wZXJ0aWVzICE9IG51bGwpID8gY2hpbGRQcm9wZXJ0aWVzIDogbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVswXSwgKHByb3BlcnR5VmFsdWVzICE9IG51bGwpID8gcHJvcGVydHlWYWx1ZXMgOiBuZXcgT2JqZWN0WzBdKTsKLQkJb2xkQ2hpbGRfID0gbnVsbDsKLQkJb2xkQ2hpbGRTZXRfID0gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBjcmVhdGVOZXdDaGlsZChFQ2xhc3MgY2hpbGRFQ2xhc3MsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGNoaWxkUHJvcGVydGllcywgT2JqZWN0W10gcHJvcGVydHlWYWx1ZXMpIHsKLQkJRUZhY3RvcnkgZUZhY3RvcnkgPSBjaGlsZEVDbGFzcy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQkJRU9iamVjdCBuZXdDaGlsZCA9IGVGYWN0b3J5LmNyZWF0ZShjaGlsZEVDbGFzcyk7Ci0JCWlmIChuZXdDaGlsZCAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0JCQkJbmV3Q2hpbGQuZVNldChjaGlsZFByb3BlcnRpZXNbaV0sIHByb3BlcnR5VmFsdWVzW2ldKTsKLQkJcmV0dXJuIG5ld0NoaWxkOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpKSB7Ci0JCQlpZiAobmV3Q2hpbGRfICE9IG51bGwpCi0JCQkJKChFTGlzdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pKS5hZGQobmV3Q2hpbGRfKTsKLQkJfSBlbHNlIHsKLQkJCW9sZENoaWxkXyA9IHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCW9sZENoaWxkU2V0XyA9IHBhcmVudF8uZUlzU2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJcGFyZW50Xy5lU2V0KGNoaWxkRmVhdHVyZV8sIG5ld0NoaWxkXyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpIHsKLQkJCWlmIChuZXdDaGlsZF8gIT0gbnVsbCkKLQkJCQkoKEVMaXN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXykpLnJlbW92ZShuZXdDaGlsZF8pOwotCQl9IGVsc2UgewotCQkJaWYgKG9sZENoaWxkU2V0XykKLQkJCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgb2xkQ2hpbGRfKTsKLQkJCWVsc2UKLQkJCQlwYXJlbnRfLmVVbnNldChjaGlsZEZlYXR1cmVfKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGRlZE9iamVjdCgpIHsKLQkJcmV0dXJuIG5ld0NoaWxkXzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZFBvcnRDb21wb25lbnRSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkUG9ydENvbXBvbmVudFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzNjMGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkUG9ydENvbXBvbmVudFJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEFkZFBvcnRDb21wb25lbnRSZWYgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgU2VydmljZVJlZiBwYXJlbnRfOwotCXByaXZhdGUgUG9ydENvbXBvbmVudFJlZiBuZXdDaGlsZF87Ci0KLQkvL3ByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZFBvcnRDb21wb25lbnRSZWYoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIFNlcnZpY2VSZWYgcGFyZW50LCBQb3J0Q29tcG9uZW50UmVmIG5ld0NoaWxkKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCW5ld0NoaWxkXyA9IG5ld0NoaWxkOwotCX0KLQotCXB1YmxpYyBDb21tYW5kQWRkUG9ydENvbXBvbmVudFJlZihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBwYXJlbnQsIFN0cmluZyBwb3J0Q29tcG9uZW50TGluaywgSmF2YUNsYXNzIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQluZXdDaGlsZF8gPSBjcmVhdGVOZXdQb3J0Q29tcG9uZW50UmVmKHBvcnRDb21wb25lbnRMaW5rLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kQWRkUG9ydENvbXBvbmVudFJlZihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBwYXJlbnQsIFN0cmluZyBwb3J0Q29tcG9uZW50TGluaywgU3RyaW5nIHNlaU5hbWUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJSmF2YUNsYXNzIHNlaUNsYXNzID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKHNlaU5hbWUpOwotCQluZXdDaGlsZF8gPSBjcmVhdGVOZXdQb3J0Q29tcG9uZW50UmVmKHBvcnRDb21wb25lbnRMaW5rLCBzZWlDbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBQb3J0Q29tcG9uZW50UmVmIGNyZWF0ZU5ld1BvcnRDb21wb25lbnRSZWYoU3RyaW5nIHBvcnRDb21wb25lbnRMaW5rLCBKYXZhQ2xhc3Mgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0JCVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBmYWN0b3J5ID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkoKTsKLQkJUG9ydENvbXBvbmVudFJlZiBuZXdDaGlsZCA9IGZhY3RvcnkuY3JlYXRlUG9ydENvbXBvbmVudFJlZigpOwotCQluZXdDaGlsZC5zZXRQb3J0Q29tcG9uZW50TGluayhwb3J0Q29tcG9uZW50TGluayk7Ci0JCW5ld0NoaWxkLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcGFyZW50Xy5nZXRQb3J0Q29tcG9uZW50UmVmcygpLmFkZChuZXdDaGlsZF8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlwYXJlbnRfLmdldFBvcnRDb21wb25lbnRSZWZzKCkucmVtb3ZlKG5ld0NoaWxkXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkZGVkT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3Q2hpbGRfOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkU2VydmljZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRTZXJ2aWNlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOTIwMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRTZXJ2aWNlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEFkZFNlcnZpY2VSZWYgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgV2ViU2VydmljZXNDbGllbnQgcGFyZW50XzsKLQlwcml2YXRlIFNlcnZpY2VSZWYgbmV3Q2hpbGRfOwotCi0JLy9wcml2YXRlIGJvb2xlYW4gb2xkQ2hpbGRTZXRfOwotCi0JcHVibGljIENvbW1hbmRBZGRTZXJ2aWNlUmVmKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBXZWJTZXJ2aWNlc0NsaWVudCBwYXJlbnQsIFNlcnZpY2VSZWYgbmV3Q2hpbGQpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJbmV3Q2hpbGRfID0gbmV3Q2hpbGQ7Ci0JfQotCi0JcHVibGljIENvbW1hbmRBZGRTZXJ2aWNlUmVmKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBXZWJTZXJ2aWNlc0NsaWVudCBwYXJlbnQsIFN0cmluZyBzZXJ2aWNlUmVmTmFtZSwgSmF2YUNsYXNzIHNlcnZpY2VJbnRlcmZhY2UpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJbmV3Q2hpbGRfID0gY3JlYXRlTmV3U2VydmljZVJlZihzZXJ2aWNlUmVmTmFtZSwgc2VydmljZUludGVyZmFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTZXJ2aWNlUmVmIGNyZWF0ZU5ld1NlcnZpY2VSZWYoU3RyaW5nIHNlcnZpY2VSZWZOYW1lLCBKYXZhQ2xhc3Mgc2VydmljZUludGVyZmFjZSkgewotCQlXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkgZmFjdG9yeSA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2Vic2VydmljZV9jbGllbnRGYWN0b3J5KCk7Ci0JCVNlcnZpY2VSZWYgbmV3Q2hpbGQgPSBmYWN0b3J5LmNyZWF0ZVNlcnZpY2VSZWYoKTsKLQkJbmV3Q2hpbGQuc2V0U2VydmljZVJlZk5hbWUoc2VydmljZVJlZk5hbWUpOwotCQluZXdDaGlsZC5zZXRTZXJ2aWNlSW50ZXJmYWNlKHNlcnZpY2VJbnRlcmZhY2UpOwotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcGFyZW50Xy5nZXRTZXJ2aWNlUmVmcygpLmFkZChuZXdDaGlsZF8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlwYXJlbnRfLmdldFNlcnZpY2VSZWZzKCkucmVtb3ZlKG5ld0NoaWxkXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkZGVkT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3Q2hpbGRfOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjYyNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kTW9kaWZ5RWxlbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmVbXSBwcm9wZXJ0aWVzXzsKLQlwcml2YXRlIE9iamVjdFtdIHByb3BlcnR5VmFsdWVzXzsKLQlwcml2YXRlIE9iamVjdFtdIG9sZFByb3BlcnR5VmFsdWVzXzsKLQotCXB1YmxpYyBDb21tYW5kTW9kaWZ5RWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHByb3BlcnRpZXMsIE9iamVjdFtdIHByb3BlcnR5VmFsdWVzKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCXByb3BlcnRpZXNfID0gcHJvcGVydGllczsKLQkJcHJvcGVydHlWYWx1ZXNfID0gcHJvcGVydHlWYWx1ZXM7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZFByb3BlcnR5VmFsdWVzXyA9IG5ldyBPYmplY3RbcHJvcGVydGllc18ubGVuZ3RoXTsKLQotCQlpZiAocGFyZW50XyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXNfLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb2xkUHJvcGVydHlWYWx1ZXNfW2ldID0gcGFyZW50Xy5lR2V0KHByb3BlcnRpZXNfW2ldKTsKLQkJCQlwYXJlbnRfLmVTZXQocHJvcGVydGllc19baV0sIHByb3BlcnR5VmFsdWVzX1tpXSk7Ci0JCQl9Ci0JCX0KLQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRQcm9wZXJ0eVZhbHVlc18ubGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJlbnRfLmVTZXQocHJvcGVydGllc19baV0sIG9sZFByb3BlcnR5VmFsdWVzX1tpXSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5SGFuZGxlckNsYXNzVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTE0MzZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5SGFuZGxlckNsYXNzVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIENvbW1hbmRNb2RpZnlIYW5kbGVyQ2xhc3NUZXh0IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEhhbmRsZXIgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3VmFsdWVfOwotCXByaXZhdGUgSmF2YUNsYXNzIG9sZFZhbHVlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRJc1NldF87Ci0KLQlwdWJsaWMgQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEhhbmRsZXIgZU9iamVjdCwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJZmVhdHVyZV8gPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCk7Ci0JCWlmIChuZXdWYWx1ZSA9PSBudWxsKQotCQkJbmV3VmFsdWVfID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJbmV3VmFsdWVfID0gbmV3VmFsdWU7Ci0JCW5pbGxhYmxlXyA9IGZhbHNlOwotCQlvbGRWYWx1ZV8gPSBudWxsOwotCQlvbGRJc1NldF8gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZElzU2V0XyA9IGVPYmplY3RfLmVJc1NldChmZWF0dXJlXyk7Ci0JCW9sZFZhbHVlXyA9IGVPYmplY3RfLmdldEhhbmRsZXJDbGFzcygpOwotCQllT2JqZWN0Xy5zZXRIYW5kbGVyQ2xhc3MoSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKG5ld1ZhbHVlXykpOwotCQlpZiAobmlsbGFibGVfICYmIG5ld1ZhbHVlXyA9PSBudWxsKQotCQkJZU9iamVjdF8uZVVuc2V0KGZlYXR1cmVfKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG9sZElzU2V0XykKLQkJCWVPYmplY3RfLnNldEhhbmRsZXJDbGFzcyhvbGRWYWx1ZV8pOwotCQllbHNlCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlOU1VSSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlOU1VSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmEzN2ViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5TlNVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsLlFOYW1lSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZE1vZGlmeU5TVVJJIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIFFOYW1lIGVPYmplY3RfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByaXZhdGUgU3RyaW5nIG5ld1ZhbHVlXzsKLQlwcml2YXRlIE9iamVjdCBvbGRWYWx1ZV87Ci0JcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlXzsKLQlwcml2YXRlIGJvb2xlYW4gb2xkSXNTZXRfOwotCi0JcHVibGljIENvbW1hbmRNb2RpZnlOU1VSSShTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgUU5hbWUgZU9iamVjdCwgU3RyaW5nIG5ld1ZhbHVlLCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJZmVhdHVyZV8gPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKTsKLQkJaWYgKG5pbGxhYmxlICYmIChuZXdWYWx1ZSA9PSBudWxsIHx8IG5ld1ZhbHVlLmxlbmd0aCgpIDw9IDApKQotCQkJbmV3VmFsdWVfID0gbnVsbDsKLQkJZWxzZSBpZiAoIW5pbGxhYmxlICYmIG5ld1ZhbHVlID09IG51bGwpCi0JCQluZXdWYWx1ZV8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQluZXdWYWx1ZV8gPSBuZXdWYWx1ZTsKLQkJbmlsbGFibGVfID0gbmlsbGFibGU7Ci0JCW9sZFZhbHVlXyA9IG51bGw7Ci0JCW9sZElzU2V0XyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkSXNTZXRfID0gZU9iamVjdF8uZUlzU2V0KGZlYXR1cmVfKTsKLQkJb2xkVmFsdWVfID0gZU9iamVjdF8uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVFOYW1lSGVscGVyLnNldFFOYW1lTmFtZXNwYWNlVVJJKGVPYmplY3RfLCBuZXdWYWx1ZV8pOwotCQlpZiAobmlsbGFibGVfICYmIG5ld1ZhbHVlXyA9PSBudWxsKQotCQkJZU9iamVjdF8uZVVuc2V0KGZlYXR1cmVfKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG9sZElzU2V0XykKLQkJCWVPYmplY3RfLmVTZXQoZmVhdHVyZV8sIG9sZFZhbHVlXyk7Ci0JCWVsc2UKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVNFSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlTRUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzMGUwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVNFSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kTW9kaWZ5U0VJIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIFBvcnRDb21wb25lbnRSZWYgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3VmFsdWVfOwotCXByaXZhdGUgT2JqZWN0IG9sZFZhbHVlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRJc1NldF87Ci0KLQotCXB1YmxpYyBDb21tYW5kTW9kaWZ5U0VJKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBQb3J0Q29tcG9uZW50UmVmIGVPYmplY3QsIFN0cmluZyBuZXdWYWx1ZSwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWZlYXR1cmVfID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCQlpZiAobmlsbGFibGUgJiYgKG5ld1ZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUubGVuZ3RoKCkgPD0gMCkpCi0JCQluZXdWYWx1ZV8gPSBudWxsOwotCQllbHNlIGlmICghbmlsbGFibGUgJiYgbmV3VmFsdWUgPT0gbnVsbCkKLQkJCW5ld1ZhbHVlXyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCW5ld1ZhbHVlXyA9IG5ld1ZhbHVlOwotCQluaWxsYWJsZV8gPSBuaWxsYWJsZTsKLQkJb2xkVmFsdWVfID0gbnVsbDsKLQkJb2xkSXNTZXRfID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIGluIHtAbGluayAjY2FuRXhlY3V0ZX10byBnaXZlIHRoZSBjb21tYW5kIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWR5IGl0c2VsZgotCSAqIGZvciBleGVjdXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdG9yZWQgaW4ge0BsaW5rICNjYW5FeGVjdXRlfS4gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIGFuZCB0byB5aWVsZCBhIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGFsbCBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gY2FuRXhlY3V0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uIFRoZQotCSAqIHtAbGluayBVbmV4ZWN1dGFibGVDb21tYW5kI0lOU1RBTkNFfS48Y29kZT5jYW5FeGVjdXRlKCk8L2NvZGU+IGFsd2F5cyByZXR1cm5zCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIDxiPm11c3QgPC9iPiBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHdoZW4gPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIHdoZW4KLQkgKiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRJc1NldF8gPSBlT2JqZWN0Xy5lSXNTZXQoZmVhdHVyZV8pOwotCQlvbGRWYWx1ZV8gPSBlT2JqZWN0Xy5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQkJSmF2YUNsYXNzIG5ld0phdmFDbGFzc18gPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYobmV3VmFsdWVfKTsKLQkJZU9iamVjdF8uc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKG5ld0phdmFDbGFzc18pOwotCQlpZiAobmlsbGFibGVfICYmIG5ld1ZhbHVlXyA9PSBudWxsKQotCQkJZU9iamVjdF8uZVVuc2V0KGZlYXR1cmVfKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG9sZElzU2V0XykKLQkJCWVPYmplY3RfLmVTZXQoZmVhdHVyZV8sIG9sZFZhbHVlXyk7Ci0JCWVsc2UKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODhkMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIENvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVmIGVPYmplY3RfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByaXZhdGUgU3RyaW5nIG5ld1ZhbHVlXzsKLQlwcml2YXRlIEphdmFDbGFzcyBvbGRWYWx1ZV87Ci0JcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlXzsKLQlwcml2YXRlIGJvb2xlYW4gb2xkSXNTZXRfOwotCi0JcHVibGljIENvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBlT2JqZWN0LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlmZWF0dXJlXyA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCk7Ci0JCWlmIChuZXdWYWx1ZSA9PSBudWxsKQotCQkJbmV3VmFsdWVfID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJbmV3VmFsdWVfID0gbmV3VmFsdWU7Ci0JCW5pbGxhYmxlXyA9IGZhbHNlOwotCQlvbGRWYWx1ZV8gPSBudWxsOwotCQlvbGRJc1NldF8gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZElzU2V0XyA9IGVPYmplY3RfLmVJc1NldChmZWF0dXJlXyk7Ci0JCW9sZFZhbHVlXyA9IGVPYmplY3RfLmdldFNlcnZpY2VJbnRlcmZhY2UoKTsKLQkJZU9iamVjdF8uc2V0U2VydmljZUludGVyZmFjZShKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYobmV3VmFsdWVfKSk7Ci0JCWlmIChuaWxsYWJsZV8gJiYgbmV3VmFsdWVfID09IG51bGwpCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAob2xkSXNTZXRfKQotCQkJZU9iamVjdF8uc2V0U2VydmljZUludGVyZmFjZShvbGRWYWx1ZV8pOwotCQllbHNlCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2ZWIwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotcHVibGljIGNsYXNzIENvbW1hbmRNb2RpZnlUZXh0IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEVPYmplY3QgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3VmFsdWVfOwotCXByaXZhdGUgT2JqZWN0IG9sZFZhbHVlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRJc1NldF87Ci0KLQlwdWJsaWMgQ29tbWFuZE1vZGlmeVRleHQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBuZXdWYWx1ZSwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJaWYgKG5pbGxhYmxlICYmIChuZXdWYWx1ZSA9PSBudWxsIHx8IG5ld1ZhbHVlLmxlbmd0aCgpIDw9IDApKQotCQkJbmV3VmFsdWVfID0gbnVsbDsKLQkJZWxzZSBpZiAoIW5pbGxhYmxlICYmIG5ld1ZhbHVlID09IG51bGwpCi0JCQluZXdWYWx1ZV8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQluZXdWYWx1ZV8gPSBuZXdWYWx1ZTsKLQkJbmlsbGFibGVfID0gbmlsbGFibGU7Ci0JCW9sZFZhbHVlXyA9IG51bGw7Ci0JCW9sZElzU2V0XyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkSXNTZXRfID0gZU9iamVjdF8uZUlzU2V0KGZlYXR1cmVfKTsKLQkJb2xkVmFsdWVfID0gZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCWVPYmplY3RfLmVTZXQoZmVhdHVyZV8sIG5ld1ZhbHVlXyk7Ci0JCWlmIChuaWxsYWJsZV8gJiYgbmV3VmFsdWVfID09IG51bGwpCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAob2xkSXNTZXRfKQotCQkJZU9iamVjdF8uZVNldChmZWF0dXJlXywgb2xkVmFsdWVfKTsKLQkJZWxzZQotCQkJZU9iamVjdF8uZVVuc2V0KGZlYXR1cmVfKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT5yZWRvPC9jb2RlPiB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgPGNvZGU+cmVkbzwvY29kZT4gYmVmb3JlIDxjb2RlPnVuZG88L2NvZGU+IGlzCi0JICogY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmIHlvdSBpbXBsZW1lbnQgPGNvZGU+cmVkbzwvY29kZT4gdG8gY2FsbAotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIGJ5IHRoYXQgZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4gVGhlCi0JICogcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4sIG9yIGFmdGVyIGFuCi0JICogPGNvZGU+dW5kbzwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqIGJ5IHRoZSBjb21tYW5kLiBUeXBpY2FsbHkgc2hvdWxkIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHNlbGVjdGlvbiB0aGF0IHNob3VsZCBiZSBoaWdobGlnaHRlZCB0bwotCSAqIGJlc3QgaWxsdXN0cmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBjb21tYW5kLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiw8Y29kZT5yZWRvPC9jb2RlPiwgb3IgPGNvZGU+dW5kbzwvY29kZT4gaXMgdW5kZWZpbmVkLiBUaGUKLQkgKiByZXN1bHQgbWF5IGJlIGRpZmZlcmVudCBhZnRlciBhbiA8Y29kZT51bmRvPC9jb2RlPiB0aGFuIGl0IGlzIGFmdGVyIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+Ci0JICogb3IgPGNvZGU+cmVkbzwvY29kZT4sIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYWZ0ZXIgZWl0aGVyIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogICAgICAgICBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBhZnRlcgotCSAqIHRoaXMgb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLiBUaGUKLQkgKiByZXN1bHRpbmcgY29tbWFuZCBtYXkganVzdCBiZSB0aGlzLCBpZiB0aGlzIGNvbW1hbmQgaXMgY2FwYWJhYmxlIG9mIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsCi0JICogaXQgd2lsbCBiZSBhIG5ldyBjb21tYW5kIGNyZWF0ZWQgdG8gY29tcG9zZSB0aGUgdHdvLgotCSAqIDxwPgotCSAqIEluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIG9mIHVzYWdlCi0JICogCi0JICogPHByZT4KLQkgKiBDb21tYW5kIHJlc3VsdCA9IHg7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJcmVzdWx0ID0gcmVzdWx0LmNoYWluKHkpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZH1hbmQgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bndyYXAoKX10byBvcHRpbWl6ZSB0aGUgcmVzdWx0OgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG91bmRDb21tYW5kIHN1YmNvbW1hbmRzID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCSAqIHN1YmNvbW1hbmRzLmFwcGVuZCh4KTsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlzdWJjb21tYW5kcy5hcHBlbmQoeSk7Ci0JICogQ29tbWFuZCByZXN1bHQgPSBzdWJjb21tYW5kcy51bndyYXAoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIGdpdmVzIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvbXBvdW5kIGNvbW1hbmQgY29tcG9zZXMgaXQncyByZXN1bHQgYW5kIGFmZmVjdGVkCi0JICogb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gY2hhaW4uCi0JICogQHJldHVybiBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjaGFpbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIHN1cGVyLmNoYWluKGNvbW1hbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW92ZVNlcnZpY2VSZWZzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vdmVTZXJ2aWNlUmVmcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTg5M2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW92ZVNlcnZpY2VSZWZzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZE1vdmVTZXJ2aWNlUmVmcyBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHNvdXJjZV87Ci0JcHJpdmF0ZSBFT2JqZWN0IHRhcmdldF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIE9iamVjdFtdIGNoaWxkcmVuXzsKLQlwcml2YXRlIGJvb2xlYW4gaXNDb3B5XzsKLQlwcml2YXRlIE9iamVjdFtdIGNsb25lZENoaWxkcmVuXzsKLQlwcml2YXRlIEVMaXN0IHNlcnZpY2VSZWZzOwotCi0JcHVibGljIENvbW1hbmRNb3ZlU2VydmljZVJlZnMoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IHRhcmdldCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgT2JqZWN0W10gY2hpbGRyZW4sIGJvb2xlYW4gaXNDb3B5LCBFTGlzdCBzZXJ2aWNlUmVmcykgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlzb3VyY2VfID0gc291cmNlOwotCQl0YXJnZXRfID0gdGFyZ2V0OwotCQljaGlsZEZlYXR1cmVfID0gY2hpbGRGZWF0dXJlOwotCQljaGlsZHJlbl8gPSBjaGlsZHJlbjsKLQkJaXNDb3B5XyA9IGlzQ29weTsKLQkJY2xvbmVkQ2hpbGRyZW5fID0gbnVsbDsKLQkJdGhpcy5zZXJ2aWNlUmVmcyA9IHNlcnZpY2VSZWZzOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGNsb25lT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQlFTGlzdCBjbG9uZSA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChFTGlzdCkgb2JqZWN0KS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJY2xvbmUuYWRkKGNsb25lT2JqZWN0KGl0Lm5leHQoKSkpOwotCQkJfQotCQkJcmV0dXJuIGNsb25lOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IHNvdXJjZSA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQlFQ2xhc3MgZUNsYXNzID0gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpOwotCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJCUVGYWN0b3J5IGVGYWN0b3J5ID0gZVBhY2thZ2UuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQkJRU9iamVjdCBjbG9uZSA9IGVGYWN0b3J5LmNyZWF0ZShlQ2xhc3MpOwotCQkJRUxpc3QgZmVhdHVyZXMgPSBlQ2xhc3MuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCQlpZiAoc291cmNlLmVJc1NldChmZWF0dXJlKSkgewotCQkJCQlPYmplY3QgY2xvbmVkRmVhdHVyZSA9IGNsb25lT2JqZWN0KHNvdXJjZS5lR2V0KGZlYXR1cmUpKTsKLQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpCi0JCQkJCQkoKExpc3QpIGNsb25lLmVHZXQoZmVhdHVyZSkpLmFkZEFsbCgoTGlzdCkgY2xvbmVkRmVhdHVyZSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNsb25lLmVTZXQoZmVhdHVyZSwgY2xvbmVkRmVhdHVyZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWNsb25lLmVVbnNldChmZWF0dXJlKTsKLQkJCX0KLQkJCXJldHVybiBjbG9uZTsKLQkJfQotCQlpZiAob2JqZWN0ICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZyhvYmplY3QudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpKQotCQkJZXhlY3V0ZU1hbnkoKTsKLQkJZWxzZQotCQkJZXhlY3V0ZVNpbmdsZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjdXRlU2luZ2xlKCkgewotCQlPYmplY3QgY2hpbGQgPSBzb3VyY2VfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCWlmIChpc0NvcHlfKQotCQkJdGFyZ2V0Xy5lU2V0KGNoaWxkRmVhdHVyZV8sIGNsb25lT2JqZWN0KGNoaWxkKSk7Ci0JCWVsc2UgewotCQkJc291cmNlXy5lVW5zZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQl0YXJnZXRfLmVTZXQoY2hpbGRGZWF0dXJlXywgY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVNYW55KCkgewotCQlFTGlzdCBzb3VyY2VMaXN0OwotCQlpZiAoc291cmNlXyBpbnN0YW5jZW9mIFdlYlNlcnZpY2VzQ2xpZW50KQotCQkJc291cmNlTGlzdCA9IHNlcnZpY2VSZWZzOwotCQllbHNlCi0JCQlzb3VyY2VMaXN0ID0gKEVMaXN0KSBzb3VyY2VfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCUVMaXN0IHRhcmdldExpc3Q7Ci0JCWlmICh0YXJnZXRfIGluc3RhbmNlb2YgV2ViU2VydmljZXNDbGllbnQpCi0JCQl0YXJnZXRMaXN0ID0gc2VydmljZVJlZnM7Ci0JCWVsc2UKLQkJCXRhcmdldExpc3QgPSAoRUxpc3QpIHRhcmdldF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJaWYgKGlzQ29weV8pCi0JCQljbG9uZWRDaGlsZHJlbl8gPSBuZXcgT2JqZWN0W2NoaWxkcmVuXy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuXy5sZW5ndGg7IGkrKykgewotCQkJaW50IGluZGV4ID0gc291cmNlTGlzdC5pbmRleE9mKGNoaWxkcmVuX1tpXSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlpZiAoaXNDb3B5XykgewotCQkJCQljbG9uZWRDaGlsZHJlbl9baV0gPSBjbG9uZU9iamVjdChjaGlsZHJlbl9baV0pOwotCQkJCQl0YXJnZXRMaXN0LmFkZChjbG9uZWRDaGlsZHJlbl9baV0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNvdXJjZUxpc3QucmVtb3ZlKGluZGV4KTsKLQkJCQkJdGFyZ2V0TGlzdC5hZGQoY2hpbGRyZW5fW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpCi0JCQl1bmRvU2luZ2xlKCk7Ci0JCWVsc2UKLQkJCXVuZG9NYW55KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuZG9TaW5nbGUoKSB7Ci0JCU9iamVjdCBjaGlsZCA9IHRhcmdldF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJdGFyZ2V0Xy5lVW5zZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCWlmICghaXNDb3B5XykKLQkJCXNvdXJjZV8uZVNldChjaGlsZEZlYXR1cmVfLCBjaGlsZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuZG9NYW55KCkgewotCQlFTGlzdCBzb3VyY2VMaXN0OwotCQlpZiAoc291cmNlXyBpbnN0YW5jZW9mIFdlYlNlcnZpY2VzQ2xpZW50KQotCQkJc291cmNlTGlzdCA9IHNlcnZpY2VSZWZzOwotCQllbHNlCi0JCQlzb3VyY2VMaXN0ID0gKEVMaXN0KSBzb3VyY2VfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCUVMaXN0IHRhcmdldExpc3Q7Ci0JCWlmICh0YXJnZXRfIGluc3RhbmNlb2YgV2ViU2VydmljZXNDbGllbnQpCi0JCQl0YXJnZXRMaXN0ID0gc2VydmljZVJlZnM7Ci0JCWVsc2UKLQkJCXRhcmdldExpc3QgPSAoRUxpc3QpIHRhcmdldF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJaWYgKGlzQ29weV8pIHsKLQkJCWlmIChjbG9uZWRDaGlsZHJlbl8gIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xvbmVkQ2hpbGRyZW5fLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRhcmdldExpc3QucmVtb3ZlKGNsb25lZENoaWxkcmVuX1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbl8ubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgaW5kZXggPSB0YXJnZXRMaXN0LmluZGV4T2YoY2hpbGRyZW5fW2ldKTsKLQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJdGFyZ2V0TGlzdC5yZW1vdmUoaW5kZXgpOwotCQkJCQlzb3VyY2VMaXN0LmFkZChjaGlsZHJlbl9baV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRSZW1vdmVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFJlbW92ZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwNjE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFJlbW92ZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kUmVtb3ZlRWxlbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBPYmplY3QgY2hpbGRfOwotCXByaXZhdGUgT2JqZWN0IG9sZENoaWxkXzsKLQlwcml2YXRlIGJvb2xlYW4gb2xkQ2hpbGRTZXRfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZV87Ci0JcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlXzsKLQotCXB1YmxpYyBDb21tYW5kUmVtb3ZlRWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUpIHsKLQkJdGhpcyhsYWJlbCwgZGVzY3JpcHRpb24sIHBhcmVudCwgY2hpbGRGZWF0dXJlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZFJlbW92ZUVsZW1lbnQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXRoaXMobGFiZWwsIGRlc2NyaXB0aW9uLCBwYXJlbnQsIG51bGwsIGNoaWxkRmVhdHVyZSwgbmlsbGFibGUpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kUmVtb3ZlRWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSkgewotCQl0aGlzKGxhYmVsLCBkZXNjcmlwdGlvbiwgcGFyZW50LCBjaGlsZCwgY2hpbGRGZWF0dXJlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZFJlbW92ZUVsZW1lbnQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJY2hpbGRfID0gY2hpbGQ7Ci0JCW9sZENoaWxkXyA9IG51bGw7Ci0JCW9sZENoaWxkU2V0XyA9IHRydWU7Ci0JCWNoaWxkRmVhdHVyZV8gPSBjaGlsZEZlYXR1cmU7Ci0JCW5pbGxhYmxlXyA9IG5pbGxhYmxlOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpKSB7Ci0JCQlpZiAoY2hpbGRfICE9IG51bGwpCi0JCQkJKChFTGlzdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pKS5yZW1vdmUoY2hpbGRfKTsKLQkJfSBlbHNlIHsKLQkJCW9sZENoaWxkXyA9IHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCW9sZENoaWxkU2V0XyA9IHBhcmVudF8uZUlzU2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJaWYgKG5pbGxhYmxlXykKLQkJCQlwYXJlbnRfLmVVbnNldChjaGlsZEZlYXR1cmVfKTsKLQkJCWVsc2UKLQkJCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpIHsKLQkJCWlmIChjaGlsZF8gIT0gbnVsbCkKLQkJCQkoKEVMaXN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXykpLmFkZChjaGlsZF8pOwotCQl9IGVsc2UgewotCQkJaWYgKG9sZENoaWxkU2V0XykKLQkJCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgb2xkQ2hpbGRfKTsKLQkJCWVsc2UKLQkJCQlwYXJlbnRfLmVVbnNldChjaGlsZEZlYXR1cmVfKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRTZXRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFNldEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjZWMwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFNldEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kU2V0RWxlbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIE9iamVjdCBuZXdDaGlsZF87Ci0JcHJpdmF0ZSBPYmplY3Qgb2xkQ2hpbGRfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0KLQlwdWJsaWMgQ29tbWFuZFNldEVsZW1lbnQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBPYmplY3QgbmV3Q2hpbGQpIHsKLQkJdGhpcyhsYWJlbCwgZGVzY3JpcHRpb24sIHBhcmVudCwgY2hpbGRGZWF0dXJlLCBuZXdDaGlsZCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIENvbW1hbmRTZXRFbGVtZW50KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgT2JqZWN0IG5ld0NoaWxkLCBPYmplY3Qgb2xkQ2hpbGQpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJY2hpbGRGZWF0dXJlXyA9IGNoaWxkRmVhdHVyZTsKLQkJbmV3Q2hpbGRfID0gbmV3Q2hpbGQ7Ci0JCW9sZENoaWxkXyA9IG9sZENoaWxkOwotCQlvbGRDaGlsZFNldF8gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpICYmICEobmV3Q2hpbGRfIGluc3RhbmNlb2YgRUxpc3QpKSB7Ci0JCQlpZiAob2xkQ2hpbGRfICE9IG51bGwgJiYgbmV3Q2hpbGRfICE9IG51bGwpIHsKLQkJCQlFTGlzdCBlTGlzdCA9IChFTGlzdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJCWludCBpbmRleCA9IGVMaXN0LmluZGV4T2Yob2xkQ2hpbGRfKTsKLQkJCQlpZiAoaW5kZXggIT0gLTEpCi0JCQkJCWVMaXN0LnNldChpbmRleCwgbmV3Q2hpbGRfKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW9sZENoaWxkXyA9IHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCW9sZENoaWxkU2V0XyA9IHBhcmVudF8uZUlzU2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJaWYgKG5ld0NoaWxkXyAhPSBudWxsKQotCQkJCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBuZXdDaGlsZF8pOwotCQkJZWxzZQotCQkJCXBhcmVudF8uZVVuc2V0KGNoaWxkRmVhdHVyZV8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpICYmICEobmV3Q2hpbGRfIGluc3RhbmNlb2YgRUxpc3QpKSB7Ci0JCQlpZiAob2xkQ2hpbGRfICE9IG51bGwgJiYgbmV3Q2hpbGRfICE9IG51bGwpIHsKLQkJCQlFTGlzdCBlTGlzdCA9IChFTGlzdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJCWludCBpbmRleCA9IGVMaXN0LmluZGV4T2YobmV3Q2hpbGRfKTsKLQkJCQlpZiAoaW5kZXggIT0gLTEpCi0JCQkJCWVMaXN0LnNldChpbmRleCwgb2xkQ2hpbGRfKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChvbGRDaGlsZFNldF8pCi0JCQkJcGFyZW50Xy5lU2V0KGNoaWxkRmVhdHVyZV8sIG9sZENoaWxkXyk7Ci0JCQllbHNlCi0JCQkJcGFyZW50Xy5lVW5zZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT5yZWRvPC9jb2RlPiB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgPGNvZGU+cmVkbzwvY29kZT4gYmVmb3JlIDxjb2RlPnVuZG88L2NvZGU+IGlzCi0JICogY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmIHlvdSBpbXBsZW1lbnQgPGNvZGU+cmVkbzwvY29kZT4gdG8gY2FsbAotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIGJ5IHRoYXQgZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4gVGhlCi0JICogcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4sIG9yIGFmdGVyIGFuCi0JICogPGNvZGU+dW5kbzwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqIGJ5IHRoZSBjb21tYW5kLiBUeXBpY2FsbHkgc2hvdWxkIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHNlbGVjdGlvbiB0aGF0IHNob3VsZCBiZSBoaWdobGlnaHRlZCB0bwotCSAqIGJlc3QgaWxsdXN0cmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBjb21tYW5kLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiw8Y29kZT5yZWRvPC9jb2RlPiwgb3IgPGNvZGU+dW5kbzwvY29kZT4gaXMgdW5kZWZpbmVkLiBUaGUKLQkgKiByZXN1bHQgbWF5IGJlIGRpZmZlcmVudCBhZnRlciBhbiA8Y29kZT51bmRvPC9jb2RlPiB0aGFuIGl0IGlzIGFmdGVyIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+Ci0JICogb3IgPGNvZGU+cmVkbzwvY29kZT4sIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYWZ0ZXIgZWl0aGVyIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogICAgICAgICBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBhZnRlcgotCSAqIHRoaXMgb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLiBUaGUKLQkgKiByZXN1bHRpbmcgY29tbWFuZCBtYXkganVzdCBiZSB0aGlzLCBpZiB0aGlzIGNvbW1hbmQgaXMgY2FwYWJhYmxlIG9mIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsCi0JICogaXQgd2lsbCBiZSBhIG5ldyBjb21tYW5kIGNyZWF0ZWQgdG8gY29tcG9zZSB0aGUgdHdvLgotCSAqIDxwPgotCSAqIEluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIG9mIHVzYWdlCi0JICogCi0JICogPHByZT4KLQkgKiBDb21tYW5kIHJlc3VsdCA9IHg7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJcmVzdWx0ID0gcmVzdWx0LmNoYWluKHkpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZH1hbmQgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bndyYXAoKX10byBvcHRpbWl6ZSB0aGUgcmVzdWx0OgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG91bmRDb21tYW5kIHN1YmNvbW1hbmRzID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCSAqIHN1YmNvbW1hbmRzLmFwcGVuZCh4KTsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlzdWJjb21tYW5kcy5hcHBlbmQoeSk7Ci0JICogQ29tbWFuZCByZXN1bHQgPSBzdWJjb21tYW5kcy51bndyYXAoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIGdpdmVzIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvbXBvdW5kIGNvbW1hbmQgY29tcG9zZXMgaXQncyByZXN1bHQgYW5kIGFmZmVjdGVkCi0JICogb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gY2hhaW4uCi0JICogQHJldHVybiBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjaGFpbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIHN1cGVyLmNoYWluKGNvbW1hbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL0pheFJQQ01hcEFydGlmYWN0RWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvSmF4UlBDTWFwQXJ0aWZhY3RFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MDVmYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvSmF4UlBDTWFwQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogV1NEREFydGlmYWN0RWRpdCBvYnRhaW5zIGEgV1MgRGVwbG95bWVudCBEZXNjcmlwdG9yIG1ldGFtb2RlbCBzcGVjaWZlYyBkYXRhIGZyb20gYQotICoge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwOyB3aGljaCBzdG9yZXMgdGhlIG1ldGFtb2RlbC4gVGhlCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2V9Jm5ic3A7aXMgcmV0cmlldmVkIGZyb20gdGhlCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQXJ0aWZhY3RFZGl0TW9kZWx9Jm5ic3A7dXNpbmcgYSBjb25zdGFudCB7QHNlZQotICogSjJFRUNvbnN0YW50cyNFSkJKQVJfRERfVVJJX09CSn0uIFRoZSBkZWZpbmVkIG1ldGhvZHMgZXh0cmFjdCBkYXRhIG9yIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnRzIG9mCi0gKiB0aGUgdW5kZXJseWluZyByZXNvdXJjZS4KLSAqIDwvcD4KLSAqIAotICovIAotcHVibGljIGNsYXNzIEpheFJQQ01hcEFydGlmYWN0RWRpdCBleHRlbmRzIEVudGVycHJpc2VBcnRpZmFjdEVkaXQgewotCQotCS8qKgotCSAqIDxwPgotCSAqIElkZW50aWZpZXIgdXNlZCB0byBsaW5rIFdTRERBcnRpZmFjdEVkaXQgdG8gYSBXc2RkQWRhcHRlckZhY3Rvcnkge0BzZWUKLQkgKiBXc2RkQWRhcHRlckZhY3Rvcnl9IHN0b3JlZCBpbiBhbiBBZGFwdGVyTWFuZ2VyIChAc2VlIEFkYXB0ZXJNYW5hZ2VyKQotCSAqIDwvcD4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gSmF4UlBDTWFwQXJ0aWZhY3RFZGl0LmNsYXNzOwotCQotCi0JLyoqCi0JICogQHBhcmFtIGFIYW5kbGUKLQkgKiBAcGFyYW0gdG9BY2Nlc3NBc1JlYWRPbmx5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQXJ0aWZhY3RFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Tm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC48L3A+Ci0JICogQHBhcmFtIGFOYXR1cmUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX1mb3IgYW4gYWNjZXNzaWJsZSBwcm9qZWN0Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXBvaW50aW5nIHRvIGEgbW9kdWxlIGZyb20gdGhlIGdpdmVuCi0JICogICAgICAgICAgICB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfQotCSAqLyAKLQlwcm90ZWN0ZWQgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBXc2RkUmVzb3VyY2UgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKQotCSAqICAKLQkgKi8KLQotCXB1YmxpYyBKYXhycGNtYXBSZXNvdXJjZSBnZXRKYXhSUENNYXBYbWlSZXNvdXJjZShTdHJpbmcgbWFwcGluZ0ZpbGVQYXRoVVJJKSB7Ci0JCQotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkobWFwcGluZ0ZpbGVQYXRoVVJJKTsKLQkJUmVzb3VyY2VTZXQgcmVzU2V0ID0gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IChXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSkgcmVzU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCXJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KHVyaS5sYXN0U2VnbWVudCgpLCBuZXcgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQotCQlKYXhycGNtYXBSZXNvdXJjZSBqYXhycGNtYXBSZXMgPSAoSmF4cnBjbWFwUmVzb3VyY2UpIHJlc1NldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJCQotCQlyZXR1cm4gamF4cnBjbWFwUmVzOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgSjJFRSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gRUpCUmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgU3BlYyB2ZXJzaW9uCi0JICogIAotCSAqLwotCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbihTdHJpbmcgbWFwcGluZ0ZpbGVQYXRoVVJJKSB7Ci0JCXJldHVybiBnZXRKYXhSUENNYXBYbWlSZXNvdXJjZShtYXBwaW5nRmlsZVBhdGhVUkkpLmdldEoyRUVWZXJzaW9uSUQoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGZyb20gdGhlIEFydGlmYWN0RWRpdE1vZGVsIHVzaW5nIGRlZmluZWQgVVJJLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICogIAotCSAqLwotCi0JcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCQlyZXR1cm4gZ2V0SmF4UlBDTWFwWG1pUmVzb3VyY2UobWFwcGluZ0ZpbGVQYXRoVVJJKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBXZWJTZXJ2aWNlcyBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSkKLQkgKiAgCi0JICovCi0JcHVibGljIEphdmFXU0RMTWFwcGluZyBnZXRKYXZhV1NETE1hcHBpbmcoKSB7Ci0JCXJldHVybiAoSmF2YVdTRExNYXBwaW5nKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogT2J0YWlucyB0aGUgV2ViU2VydmljZXMgKEBzZWUgV2ViU2VydmljZXMpIHJvb3Qgb2JqZWN0IGZyb20gdGhlIFdzZGRSZXNvdXJjZS4gSWYgdGhlIHJvb3Qgb2JqZWN0IGRvZXMKLQkgKiBub3QgZXhpc3QsIHRoZW4gb25lIGlzIGNyZWF0ZWQgKEBsaW5rIGFkZEVKQkphcklmTmVjZXNzYXJ5KGdldEVKQkphclhtaVJlc291cmNlKCkpKS4KLQkgKiBUaGUgcm9vdCBvYmplY3QgY29udGFpbnMgYWxsIG90aGVyIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICogIAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdChTdHJpbmcgbWFwcGluZ0ZpbGVQYXRoVVJJKSB7Ci0JCUxpc3QgY29udGVudHMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKG1hcHBpbmdGaWxlUGF0aFVSSSkuZ2V0Q29udGVudHMoKTsKLQkJaWYgKGNvbnRlbnRzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQkJYWRkSmF2YVdTRExNYXBwaW5nSWZOZWNlc3NhcnkoZ2V0SmF4UlBDTWFwWG1pUmVzb3VyY2UobWFwcGluZ0ZpbGVQYXRoVVJJKSk7Ci0JCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3Qgb2JqZWN0IChXZWJTZXJ2aWNlcykgYW5kIHBvcHVsYXRlcyB3aXRoIGRhdGEuIEFkZHMgdGhlIHJvb3QKLQkgKiBvYmplY3QgdG8gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgcG9pbnRpbmcgdG8gYSB7QHNlZSBYTUxSZXNvdXJjZX0KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhV1NETE1hcHBpbmdJZk5lY2Vzc2FyeShKYXhycGNtYXBSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCSAgICBpZihhUmVzb3VyY2UuZ2V0Q29udGVudHMoKSA9PSBudWxsIHx8IGFSZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCUphdmFXU0RMTWFwcGluZyBtYXAgPSBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhV1NETE1hcHBpbmcoKTsKLQkJCQlhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobWFwKTsKLQkJICAgIH0KLQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0TW9kdWxlVVJJKCk7Ci0JCQl0cnkgewotCQkJCWFSZXNvdXJjZS5zYXZlSWZOZWNlc3NhcnkoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBub3QgYmUgdXNlZCBmb3IgZWRpdGluZy4gSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQKLQkgKiAgICAgICAgIG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhSUENNYXBBcnRpZmFjdEVkaXQgZ2V0SmF4UlBDTWFwQXJ0aWZhY3RFZGl0Rm9yUmVhZChJUHJvamVjdCBhUHJvamVjdCkgewotCQlKYXhSUENNYXBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFydGlmYWN0RWRpdCA9IG5ldyBKYXhSUENNYXBBcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhSUENNYXBBcnRpZmFjdEVkaXQgZ2V0SmF4UlBDTWFwQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXU0REQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIG5vdAotCSAqIGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCi0JICogd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Tm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC48L3A+Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlCi0JICogICAgICAgICAgICBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmcgY29udGVudAotCSAqICAgICAgICAgbW9kZWwKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBjb3VsZCBub3QgcmVzb2x2ZSB1cmkuCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhSUENNYXBBcnRpZmFjdEVkaXQgZ2V0SmF4UlBDTWFwQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gYU1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJCXJldHVybiBuZXcgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KG5hdHVyZSwgYU1vZHVsZSwgdHJ1ZSk7Ci0JfQotCQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgRUpCQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXU0REQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZQotCSAqICAgICAgICAgICAgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpheFJQQ01hcEFydGlmYWN0RWRpdCBnZXRKYXhSUENNYXBBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCQotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJCQlyZXR1cm4gbmV3IEpheFJQQ01hcEFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIGZhbHNlKTsKLQkJCi0JfQotCQotCQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZCB0aGUgbW9kdWxlVHlwZUlkIGlzIGEKLQkgKiAgICAgICAgIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEVKQk1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXZWJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZCB0aGUgbW9kdWxlVHlwZUlkIGlzIGEKLQkgKiAgICAgICAgIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFwcENsaWVudE1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCSAgICByZXR1cm4gY3JlYXRlTW9kZWxSb290KGdldEoyRUVWZXJzaW9uKCksbWFwcGluZ0ZpbGVQYXRoVVJJKTsKLQl9Ci0JCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRW50ZXJwcmlzZUFydGlmYWN0RWRpdCNjcmVhdGVNb2RlbFJvb3QoaW50KQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdChpbnQgdmVyc2lvbixTdHJpbmcgbWFwcGluZ0ZpbGVQYXRoVVJJKSB7Ci0JICAgIEpheHJwY21hcFJlc291cmNlIHJlcyA9IGdldEpheFJQQ01hcFhtaVJlc291cmNlKG1hcHBpbmdGaWxlUGF0aFVSSSk7Ci0JICAgIHJlcy5zZXRNb2R1bGVWZXJzaW9uSUQodmVyc2lvbik7Ci0JICAgIGFkZEphdmFXU0RMTWFwcGluZ0lmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiBnZXRKYXZhV1NETE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCJfVUlfSmF4UlBDTWlzc2luZ01vZGVsIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCJfVUlfSmF4UlBDTWlzc2luZ01vZGVsIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCJfVUlfSmF4UlBDTWlzc2luZ01vZGVsIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbigpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIl9VSV9KYXhSUENNaXNzaW5nTW9kZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBbMTgyNDE3XSBUaGlzIEFydGlmYWN0RWRpdCB3b3JrcyBmb3IgYWxsIHByb2plY3QgdmVyc2lvbnMsIHNvIGp1c3QgcmV0dXJuIHRydWUuCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRQcm9qZWN0VmVyc2lvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTQ0REQXJ0aWZhY3RFZGl0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9XU0NEREFydGlmYWN0RWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWM2NjliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTQ0REQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiA8cD4KLSAqIFdTRERBcnRpZmFjdEVkaXQgb2J0YWlucyBhIFdTIERlcGxveW1lbnQgRGVzY3JpcHRvciBtZXRhbW9kZWwgc3BlY2lmZWMgZGF0YQotICogZnJvbSBhIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZX0mbmJzcDsgd2hpY2ggc3RvcmVzIHRoZQotICogbWV0YW1vZGVsLiBUaGUge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwO2lzIHJldHJpZXZlZAotICogZnJvbSB0aGUge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfSZuYnNwO3VzaW5nCi0gKiBhIGNvbnN0YW50IHtAc2VlIEoyRUVDb25zdGFudHMjRUpCSkFSX0REX1VSSV9PQkp9LiBUaGUgZGVmaW5lZCBtZXRob2RzCi0gKiBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0NEREFydGlmYWN0RWRpdCBleHRlbmRzIEVudGVycHJpc2VBcnRpZmFjdEVkaXQgewotCi0JLyoqCi0JICogPHA+Ci0JICogSWRlbnRpZmllciB1c2VkIHRvIGxpbmsgV1NEREFydGlmYWN0RWRpdCB0byBhIFdzZGRBZGFwdGVyRmFjdG9yeSB7QHNlZQotCSAqIFdzZGRBZGFwdGVyRmFjdG9yeX0gc3RvcmVkIGluIGFuIEFkYXB0ZXJNYW5nZXIgKEBzZWUgQWRhcHRlck1hbmFnZXIpCi0JICogPC9wPgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBBREFQVEVSX1RZUEUgPSBXU0NEREFydGlmYWN0RWRpdC5jbGFzczsKLQotCS8qKgotCSAqIEBwYXJhbSBhSGFuZGxlCi0JICogQHBhcmFtIHRvQWNjZXNzQXNSZWFkT25seQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHVibGljIFdTQ0REQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQXJ0aWZhY3RFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgV1NDRERBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0TW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFOYXR1cmUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX1mb3IgYW4gYWNjZXNzaWJsZSBwcm9qZWN0Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXBvaW50aW5nIHRvIGEgbW9kdWxlIGZyb20KLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfQotCSAqLwotCXB1YmxpYyBXU0NEREFydGlmYWN0RWRpdChNb2R1bGVDb3JlTmF0dXJlIGFOYXR1cmUsIElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB7Ci0JCXN1cGVyKGFOYXR1cmUsIGFNb2R1bGUsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBXc2RkUmVzb3VyY2UgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKQotCSAqLwotCi0JcHVibGljIFdlYlNlcnZpY2VzUmVzb3VyY2UgZ2V0V3NjZGRYbWlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChXZWJTZXJ2aWNlc1Jlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIEoyRUUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIEVKQlJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYSBKMkVFIFNwZWMgdmVyc2lvbgotCSAqLwotCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbigpIHsKLQkJcmV0dXJuIGdldFdzY2RkWG1pUmVzb3VyY2UoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGZyb20gdGhlIEFydGlmYWN0RWRpdE1vZGVsIHVzaW5nCi0JICogZGVmaW5lZCBVUkkuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2UKLQkgKi8KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgewotCQlpZiAoZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKSE9bnVsbCkKLQkJCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFJlc291cmNlKGdldFdlYlNlcnZpY2VzQ2xpZW50WG1sUmVzb3VyY2VVUkkoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0V2ViU2VydmljZXNDbGllbnRYbWxSZXNvdXJjZVVSSSgpIHsKLQkJVVJJIHJlc291cmNlVVJJID0gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1dFQl9JTkZfRERfVVJJX09CSjsKLQkJaWYgKGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKSkpCi0JCQlyZXNvdXJjZVVSSSA9IEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9NRVRBX0lORl9ERF9VUklfT0JKOwotCQllbHNlIGlmIChpc1ZhbGlkRUpCTW9kdWxlKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFByb2plY3QoKSkpKQotCQkJcmVzb3VyY2VVUkkgPSBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfTUVUQV9JTkZfRERfVVJJX09CSjsKLQkJcmV0dXJuIHJlc291cmNlVVJJOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gV2ViU2VydmljZXMgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkpCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzQ2xpZW50IGdldFdlYlNlcnZpY2VzQ2xpZW50KCkgewotCQlyZXR1cm4gKFdlYlNlcnZpY2VzQ2xpZW50KSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBPYnRhaW5zIHRoZSBXZWJTZXJ2aWNlcyAoQHNlZSBXZWJTZXJ2aWNlcykgcm9vdCBvYmplY3QgZnJvbSB0aGUKLQkgKiBXc2RkUmVzb3VyY2UuIElmIHRoZSByb290IG9iamVjdCBkb2VzIG5vdCBleGlzdCwgdGhlbiBvbmUgaXMgY3JlYXRlZAotCSAqIChAbGluayBhZGRFSkJKYXJJZk5lY2Vzc2FyeShnZXRFSkJKYXJYbWlSZXNvdXJjZSgpKSkuIFRoZSByb290IG9iamVjdAotCSAqIGNvbnRhaW5zIGFsbCBvdGhlciByZXNvdXJjZSBkZWZpbmVkIG9iamVjdHMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gRU9iamVjdAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpIHsKLQkJTGlzdCBjb250ZW50cyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRDb250ZW50cygpOwotCQlpZiAoY29udGVudHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCQlhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KGdldFdzY2RkWG1pUmVzb3VyY2UoKSk7Ci0JCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBvYmplY3QgKFdlYlNlcnZpY2VzKSBhbmQgcG9wdWxhdGVzCi0JICogd2l0aCBkYXRhLiBBZGRzIHRoZSByb290IG9iamVjdCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJlc291cmNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBwb2ludGluZyB0byBhIHtAc2VlIFhNTFJlc291cmNlfSBOb3RlOiBUaGlzIG1ldGhvZAotCSAqICAgICAgICAgICAgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIEpVTklUIC0gbW92ZT8KLQkgKiAgICAgICAgICAgIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KFdlYlNlcnZpY2VzUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJaWYgKGFSZXNvdXJjZS5nZXRDb250ZW50cygpID09IG51bGwgfHwgYVJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJV2ViU2VydmljZXNDbGllbnQgd3NfY2xpZW50ID0gV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWJTZXJ2aWNlc0NsaWVudCgpOwotCQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZCh3c19jbGllbnQpOwotCQkJfQotCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRNb2R1bGVVUkkoKTsKLQkJCXRyeSB7Ci0JCQkJYVJlc291cmNlLnNhdmVJZk5lY2Vzc2FyeSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUKLQkgKiBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlCi0JICogcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubwotCSAqIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCi0JICogd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdAotCSAqICAgICAgICAgICAgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NDRERBcnRpZmFjdEVkaXQgZ2V0V1NDRERBcnRpZmFjdEVkaXRGb3JSZWFkKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgV1NDRERBcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kCi0JICogICAgICAgICBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NDRERBcnRpZmFjdEVkaXQgZ2V0V1NDRERBcnRpZmFjdEVkaXRGb3JXcml0ZShJUHJvamVjdCBhUHJvamVjdCkgewotCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IFdTQ0REQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCi0JICogd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGNvdWxkIG5vdCByZXNvbHZlIHVyaS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTQ0REQXJ0aWZhY3RFZGl0IGdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJaWYgKGFNb2R1bGUgIT0gbnVsbCAmJiBpc1ZhbGlkV1NDRERNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gbmV3IFdTQ0REQXJ0aWZhY3RFZGl0KG5hdHVyZSwgYU1vZHVsZSwgdHJ1ZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUKLQkgKiBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgRUpCQXJ0aWZhY3RFZGl0IHRoYXQgYXJlCi0JICogcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubwotCSAqIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIFdTRERBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQgd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQKLQkgKiAgICAgICAgIHBlcnNpc3QgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBXU0NEREFydGlmYWN0RWRpdCBnZXRXU0NEREFydGlmYWN0RWRpdEZvcldyaXRlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJaWYgKGFNb2R1bGUgIT0gbnVsbCAmJiBpc1ZhbGlkV1NDRERNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gbmV3IFdTQ0REQXJ0aWZhY3RFZGl0KG5hdHVyZSwgYU1vZHVsZSwgZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQKLQkgKiAgICAgICAgIHRoZSBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRFSkJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gYUNvbXBvbmVudCAhPW51bGwgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZFdTRERNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZCB0aGUKLQkgKiAgICAgICAgIG1vZHVsZVR5cGVJZCBpcyBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdTQ0RETW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIChpc1ZhbGlkQXBwQ2xpZW50TW9kdWxlKGFDb21wb25lbnQpIHx8IGlzVmFsaWRXZWJNb2R1bGUoYUNvbXBvbmVudCkgfHwgaXNWYWxpZEVKQk1vZHVsZShhQ29tcG9uZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kCi0JICogICAgICAgICB0aGUgbW9kdWxlVHlwZUlkIGlzIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV2ViTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIGFDb21wb25lbnQgIT1udWxsICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZAotCSAqICAgICAgICAgdGhlIG1vZHVsZVR5cGVJZCBpcyBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFwcENsaWVudE1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBhQ29tcG9uZW50ICE9bnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRW50ZXJwcmlzZUFydGlmYWN0RWRpdCNjcmVhdGVNb2RlbFJvb3QoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdCgpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdChpbnQpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7Ci0JCVdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQlyZXMuc2V0TW9kdWxlVmVyc2lvbklEKHZlcnNpb24pOwotCQlhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiBnZXRXZWJTZXJ2aWNlc0NsaWVudCgpOwotCX0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIChJTW9kZWxQcm92aWRlcilnZXRXU0NEREFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIChJTW9kZWxQcm92aWRlcilnZXRXU0NEREFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQl9Ci0JcHVibGljIHZvaWQgbW9kaWZ5KFJ1bm5hYmxlIHJ1bm5hYmxlLCBJUGF0aCBtb2RlbFBhdGgpIHsKLQkJc2V0V3JpdGFibGVFZGl0KGdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKSk7Ci0JCXRyeXsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJaWYoIGdldFdyaXRhYmxlRWRpdCgpICE9IG51bGwgKXsKLQkJCQkvLyBBbHdheXMgc2F2ZSByZWdhcmRsZXNzIG9mIHJlc291cmNlIHBhdGggcGFzc2VkIC0gQXJ0aWZhY3RlZGl0cyBzYXZlIHJlc291cmNlcyBhcyBhIHVuaXQKLQkJCQlnZXRXcml0YWJsZUVkaXQoKS5zYXZlSWZOZWNlc3NhcnkoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgKTsKLQkJCX0KLQkJCQotCQl9IGZpbmFsbHkgeyAvL1Byb3Blcmx5IGRpc3Bvc2UgdGhlIHdyaXRlIGFydGlmYWN0IGVkaXQKLQkJCWdldFdyaXRhYmxlRWRpdCgpLmRpc3Bvc2UoKTsKLQkJCXNldFdyaXRhYmxlRWRpdChudWxsKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZFByb2plY3RWZXJzaW9uKElQcm9qZWN0IHByb2plY3QyKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTRERBcnRpZmFjdEVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTRERBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjNWQ1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9XU0REQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiA8cD4KLSAqIFdTRERBcnRpZmFjdEVkaXQgb2J0YWlucyBhIFdTIERlcGxveW1lbnQgRGVzY3JpcHRvciBtZXRhbW9kZWwgc3BlY2lmZWMgZGF0YQotICogZnJvbSBhIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZX0mbmJzcDsgd2hpY2ggc3RvcmVzIHRoZQotICogbWV0YW1vZGVsLiBUaGUge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwO2lzIHJldHJpZXZlZAotICogZnJvbSB0aGUge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfSZuYnNwO3VzaW5nCi0gKiBhIGNvbnN0YW50IHtAc2VlIEoyRUVDb25zdGFudHMjRUpCSkFSX0REX1VSSV9PQkp9LiBUaGUgZGVmaW5lZCBtZXRob2RzCi0gKiBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0REQXJ0aWZhY3RFZGl0IGV4dGVuZHMgRW50ZXJwcmlzZUFydGlmYWN0RWRpdCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJZGVudGlmaWVyIHVzZWQgdG8gbGluayBXU0REQXJ0aWZhY3RFZGl0IHRvIGEgV3NkZEFkYXB0ZXJGYWN0b3J5IHtAc2VlCi0JICogV3NkZEFkYXB0ZXJGYWN0b3J5fSBzdG9yZWQgaW4gYW4gQWRhcHRlck1hbmdlciAoQHNlZSBBZGFwdGVyTWFuYWdlcikKLQkgKiA8L3A+Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfVFlQRSA9IFdTRERBcnRpZmFjdEVkaXQuY2xhc3M7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0lMX0ZJTEVfRVhUID0gIndzaWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVfRVhUID0gIndzZGwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gYUhhbmRsZQotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBXU0REQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkFydGlmYWN0RWRpdE1vZGVsCi0JICovCi0JcHVibGljIFdTRERBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0TW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFOYXR1cmUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX1mb3IgYW4gYWNjZXNzaWJsZSBwcm9qZWN0Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXBvaW50aW5nIHRvIGEgbW9kdWxlIGZyb20KLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfQotCSAqLwotCXB1YmxpYyBXU0REQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFdzZGRSZXNvdXJjZSBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpCi0JICovCi0KLQlwdWJsaWMgV3NkZFJlc291cmNlIGdldFdzZGRYbWlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChXc2RkUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgSjJFRSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gRUpCUmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgU3BlYyB2ZXJzaW9uCi0JICovCi0KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKCkgewotCQlyZXR1cm4gZ2V0V3NkZFhtaVJlc291cmNlKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBmcm9tIHRoZSBBcnRpZmFjdEVkaXRNb2RlbCB1c2luZwotCSAqIGRlZmluZWQgVVJJLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICovCi0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoZ2V0V2ViU2VydmljZXNYbWxSZXNvdXJjZVVSSSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QsIGludCB2ZXJzaW9uKSB7Ci0JCUVudGVycHJpc2VBcnRpZmFjdEVkaXQgd3NEREVkaXQgPSBuZXcgV1NEREFydGlmYWN0RWRpdChwcm9qZWN0LCBmYWxzZSk7Ci0JCXRyeSB7Ci0JCQl3c0RERWRpdC5jcmVhdGVNb2RlbFJvb3QodmVyc2lvbik7Ci0JCQl3c0RERWRpdC5zYXZlKG51bGwpOwotCQl9IGZpbmFsbHkgeyAgLy8gTWFrZSBzdXJlIG5ldyByZXNvdXJjZSBpcyByZW1vdmVkICAtIHRoZSB1cmkgdXNlZCBmb3IgY3JlYXRpb24gc2hvdWxkbid0IGJlIGNhY2hlZAotCQkJUmVzb3VyY2UgbmV3UmVzID0gd3NEREVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpLmdldFJlc291cmNlcygpLnJlbW92ZShuZXdSZXMpOwotCQkJbmV3UmVzLnVubG9hZCgpOwotCQkJd3NEREVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIFVSSSBnZXRXZWJTZXJ2aWNlc1htbFJlc291cmNlVVJJKCkgewotCi0JCVVSSSByZXNvdXJjZVVSSSA9IEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX1dFQl9JTkZfRERfVVJJX09CSjsKLQkJaWYgKGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoZ2V0Q29tcG9uZW50KCkpKQotCQkJcmVzb3VyY2VVUkkgPSBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19NRVRBX0lORl9ERF9VUklfT0JKOwotCQllbHNlIGlmIChpc1ZhbGlkRUpCTW9kdWxlKGdldENvbXBvbmVudCgpKSkKLQkJCXJlc291cmNlVVJJID0gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfTUVUQV9JTkZfRERfVVJJX09CSjsKLQkJcmV0dXJuIHJlc291cmNlVVJJOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gV2ViU2VydmljZXMgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkpCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzIGdldFdlYlNlcnZpY2VzKCkgewotCQlpZiAoIWdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZ2V0V3NkZFhtaVJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJTZXJ2aWNlcykgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogT2J0YWlucyB0aGUgV2ViU2VydmljZXMgKEBzZWUgV2ViU2VydmljZXMpIHJvb3Qgb2JqZWN0IGZyb20gdGhlCi0JICogV3NkZFJlc291cmNlLiBJZiB0aGUgcm9vdCBvYmplY3QgZG9lcyBub3QgZXhpc3QsIHRoZW4gb25lIGlzIGNyZWF0ZWQKLQkgKiAoQGxpbmsgYWRkRUpCSmFySWZOZWNlc3NhcnkoZ2V0RUpCSmFyWG1pUmVzb3VyY2UoKSkpLiBUaGUgcm9vdCBvYmplY3QKLQkgKiBjb250YWlucyBhbGwgb3RoZXIgcmVzb3VyY2UgZGVmaW5lZCBvYmplY3RzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSB7Ci0JCUxpc3QgY29udGVudHMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0Q29udGVudHMoKTsKLQkJaWYgKGNvbnRlbnRzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQkJYWRkV2ViU2VydmljZXNJZk5lY2Vzc2FyeShnZXRXc2RkWG1pUmVzb3VyY2UoKSk7Ci0JCWlmIChjb250ZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IG9iamVjdCAoV2ViU2VydmljZXMpIGFuZCBwb3B1bGF0ZXMKLQkgKiB3aXRoIGRhdGEuIEFkZHMgdGhlIHJvb3Qgb2JqZWN0IHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHBvaW50aW5nIHRvIGEge0BzZWUgWE1MUmVzb3VyY2V9IE5vdGU6IFRoaXMgbWV0aG9kCi0JICogICAgICAgICAgICBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqICAgICAgICAgICAgPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdlYlNlcnZpY2VzSWZOZWNlc3NhcnkoV3NkZFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChhUmVzb3VyY2UuZ2V0Q29udGVudHMoKSA9PSBudWxsIHx8IGFSZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCVdlYlNlcnZpY2VzIHdzID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlNlcnZpY2VzKCk7Ci0JCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHdzKTsKLQkJCX0KLQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0TW9kdWxlVVJJKCk7Ci0JCQl0cnkgewotCQkJCWFSZXNvdXJjZS5zYXZlSWZOZWNlc3NhcnkoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZQotCSAqIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8KLQkgKiBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZAotCSAqIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTRERBcnRpZmFjdEVkaXQgZ2V0V1NEREFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoYVByb2plY3QpOwotCQlpZiAoY29tcCAhPSBudWxsICYmIGlzVmFsaWRXU0RETW9kdWxlKGNvbXApKSB7Ci0JCQl0cnkgewotCQkJCWFydGlmYWN0RWRpdCA9IG5ldyBXU0REQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCB0cnVlKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kCi0JICogICAgICAgICBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NEREFydGlmYWN0RWRpdCBnZXRXU0REQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoYVByb2plY3QpOwotCQlpZiAoY29tcCAhPSBudWxsICYmIGlzVmFsaWRXU0RETW9kdWxlKGNvbXApKSB7Ci0JCQl0cnkgewotCQkJCWFydGlmYWN0RWRpdCA9IG5ldyBXU0REQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUKLQkgKiBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IGFyZQotCSAqIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8KLQkgKiBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXU0REQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLQkgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMKLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgY291bGQgbm90IHJlc29sdmUgdXJpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NEREFydGlmYWN0RWRpdCBnZXRXU0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCWlmIChhTW9kdWxlICE9IG51bGwgJiYgaXNWYWxpZFdTRERNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gbmV3IFdTRERBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCB0cnVlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBFSkJBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMKLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZAotCSAqICAgICAgICAgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTRERBcnRpZmFjdEVkaXQgZ2V0V1NEREFydGlmYWN0RWRpdEZvcldyaXRlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJaWYgKGFNb2R1bGUgIT0gbnVsbCAmJiBpc1ZhbGlkV1NERE1vZHVsZShhTW9kdWxlKSkKLQkJCXJldHVybiBuZXcgV1NEREFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIGZhbHNlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kCi0JICogICAgICAgICB0aGUgbW9kdWxlVHlwZUlkIGlzIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRUpCTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRXU0RETW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlCi0JICogICAgICAgICBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXU0RETW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIChpc1ZhbGlkQXBwQ2xpZW50TW9kdWxlKGFDb21wb25lbnQpIHx8IGlzVmFsaWRXZWJNb2R1bGUoYUNvbXBvbmVudCkgfHwgaXNWYWxpZEVKQk1vZHVsZShhQ29tcG9uZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kCi0JICogICAgICAgICB0aGUgbW9kdWxlVHlwZUlkIGlzIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV2ViTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZAotCSAqICAgICAgICAgdGhlIG1vZHVsZVR5cGVJZCBpcyBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFwcENsaWVudE1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRW50ZXJwcmlzZUFydGlmYWN0RWRpdCNjcmVhdGVNb2RlbFJvb3QoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdCgpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdChpbnQpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7Ci0JCVdzZGRSZXNvdXJjZSByZXMgPSAoV3NkZFJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXJlcy5zZXRNb2R1bGVWZXJzaW9uSUQodmVyc2lvbik7Ci0JCWFkZFdlYlNlcnZpY2VzSWZOZWNlc3NhcnkocmVzKTsKLQkJcmV0dXJuIGdldFdlYlNlcnZpY2VzKCk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0Q29udGVudE1vZGVsUm9vdCgpIHsKLQkJcmV0dXJuIGdldFdlYlNlcnZpY2VzKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0V1NJTFJlc291cmNlcygpIHsKLQkJZmluYWwgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7IAotCQkKLQkJdHJ5IHsKLQkJCWdldFByb2plY3QoKS5hY2NlcHQobmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCQkKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlpZihwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoV1NJTF9GSUxFX0VYVCkpIHsKLQkJCQkJCUlSZXNvdXJjZSBmaWxlID0gcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCQlJVmlydHVhbFJlc291cmNlW10gdlJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGZpbGUpOwotCQkJCQkJaWYgKHZSZXNvdXJjZXMubGVuZ3RoID4gMCAmJiAhcmVzdWx0LmNvbnRhaW5zKGZpbGUpKQotCQkJCQkJCXJlc3VsdC5hZGQoZmlsZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJfSwgSVJlc291cmNlLk5PTkUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdlYlNlcnZpY2VQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9IAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdTRExSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZXMoV1NETF9GSUxFX0VYVCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFJlc291cmNlcyhTdHJpbmcgZXh0KSB7Ci0JCUxpc3QgcmVzb3VyY2VzID0gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZXMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFVSSSgpLmZpbGVFeHRlbnNpb24oKSAhPSBudWxsICYmIHJlcy5nZXRVUkkoKS5maWxlRXh0ZW5zaW9uKCkuZXF1YWxzKGV4dCkpCi0JCQkJcmVzdWx0LmFkZChyZXMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBXU0RMUmVzb3VyY2UgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0V3NkbFJlc291cmNlKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5lcXVhbHMoIiIpKXJldHVybiBudWxsOyAvLyROT04tTkxTLTEkCi0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXMgPSBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkocGF0aCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKSAmJiBzZXJ2aWNlSGVscGVyICE9IG51bGwgJiYgc2VydmljZUhlbHBlci5pc1dTRExSZXNvdXJjZShyZXMpKQotCQkJcmV0dXJuIHJlczsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldFdTRERBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0V1NEREFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQl9Ci0KLQkvLyBbMTgyNDE3XSBUaGlzIEFydGlmYWN0RWRpdCB3b3JrcyBmb3IgYWxsIHByb2plY3QgdmVyc2lvbnMsIHNvIGp1c3QgcmV0dXJuIHRydWUuCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRQcm9qZWN0VmVyc2lvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgdm9pZCBtb2RpZnkoUnVubmFibGUgcnVubmFibGUsIElQYXRoIG1vZGVsUGF0aCkgewotCQlzZXRXcml0YWJsZUVkaXQoZ2V0V1NEREFydGlmYWN0RWRpdEZvcldyaXRlKGdldFByb2plY3QoKSkpOwotCQl0cnl7Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJCWlmKCBnZXRXcml0YWJsZUVkaXQoKSAhPSBudWxsICl7Ci0JCQkJLy8gQWx3YXlzIHNhdmUgcmVnYXJkbGVzcyBvZiByZXNvdXJjZSBwYXRoIHBhc3NlZCAtIEFydGlmYWN0ZWRpdHMgc2F2ZSByZXNvdXJjZXMgYXMgYSB1bml0Ci0JCQkJZ2V0V3JpdGFibGVFZGl0KCkuc2F2ZUlmTmVjZXNzYXJ5KCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpICk7Ci0JCQl9Ci0JCQkKLQkJfSBmaW5hbGx5IHsgLy9Qcm9wZXJseSBkaXNwb3NlIHRoZSB3cml0ZSBhcnRpZmFjdCBlZGl0Ci0JCQlnZXRXcml0YWJsZUVkaXQoKS5kaXNwb3NlKCk7Ci0JCQlzZXRXcml0YWJsZUVkaXQobnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbnN0YW50cy9BVEtVSUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvQVRLVUlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwMTU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbnN0YW50cy9BVEtVSUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsLlFOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSUNvbnN0YW50cyB7Ci0JLy8gaW5pdC1wYXJhbQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEluaXRQYXJhbU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1RBQkxFX05BTUUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRJbml0UGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfVkFMVUUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfREVTQ1JJUFRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBRTmFtZQotCXByaXZhdGUgU3RyaW5nIERFRkFVTFRfUFJFRklYID0gInBmeCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBERUZBVUxUX05BTUVTUEFDRVVSSSA9ICJOYW1lc3BhY2VVUkkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgREVGQVVMVF9MT0NBTFBBUlQgPSAiTG9jYWxQYXJ0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFN0cmluZyBkZWZhdWx0UHJlZml4KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhERUZBVUxUX1BSRUZJWCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBkZWZhdWx0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhERUZBVUxUX05BTUVTUEFDRVVSSSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBkZWZhdWx0TG9jYWxQYXJ0KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhERUZBVUxUX0xPQ0FMUEFSVCk7Ci0JfQotCi0JLy8gc29hcCByb2xlCi0JcHVibGljIFN0cmluZyBkZWZhdWx0U09BUFJvbGUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1RBQkxFX1NPQVBfUk9MRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHBvcnQgbmFtZQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFBvcnROYW1lKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9UQUJMRV9QT1JUX05BTUUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvL3BvcnQgY29tcG9uZW50Ci0JcHVibGljIFN0cmluZyBkZWZhdWx0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZygiamF2YS5ybWkuUmVtb3RlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vIHBvcnQgY29tcG9uZW50IHJlZgotCXB1YmxpYyBKYXZhQ2xhc3MgZGVmYXVsdENsaWVudFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5ybWkuUmVtb3RlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRQb3J0Q29tcG9uZW50TGluaygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfUE9SVF9DT01QT05FTlRfTElOSyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHNlcnZpY2UtcmVmCi0JcHVibGljIFNlcnZpY2VSZWYgZGVmYXVsdFNlcnZpY2VSZWYoKSB7Ci0JCVNlcnZpY2VSZWYgc2VydmljZVJlZiA9IFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZVJlZigpOwotCQlzZXJ2aWNlUmVmLnNldFNlcnZpY2VSZWZOYW1lKGRlZmF1bHRTZXJ2aWNlUmVmTmFtZSgpKTsKLQkJc2VydmljZVJlZi5zZXRTZXJ2aWNlSW50ZXJmYWNlKGRlZmF1bHRTZXJ2aWNlSW50ZXJmYWNlKCkpOwotCQlyZXR1cm4gc2VydmljZVJlZjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTZXJ2aWNlUmVmTmFtZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigic2VydmljZS8iKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlX1VJX1NlcnZpY2VSZWZfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNsYXNzIGRlZmF1bHRTZXJ2aWNlSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZheC54bWwucnBjLlNlcnZpY2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHBvcnQgY29tcG9uZW50IG5hbWUKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRQb3J0Q29tcG9uZW50TmFtZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHNlcnZpY2UgaW1wbCBiZWFuCi0JcHVibGljIFNlcnZpY2VJbXBsQmVhbiBkZWZhdWx0U2VydmljZUltcGxCZWFuKCkgewotCQlTZXJ2aWNlSW1wbEJlYW4gc2VydmljZUltcGxCZWFuID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VJbXBsQmVhbigpOwotCQlzZXJ2aWNlSW1wbEJlYW4uc2V0RVNlcnZsZXRMaW5rKGRlZmF1bHRTZXJ2bGV0TGluaygpKTsKLQkJcmV0dXJuIHNlcnZpY2VJbXBsQmVhbjsKLQl9Ci0KLQkvLyBzZXJ2bGV0IGxpbmsKLQlwdWJsaWMgU2VydmxldExpbmsgZGVmYXVsdFNlcnZsZXRMaW5rKCkgewotCQlTZXJ2bGV0TGluayBzZXJ2bGV0TGluayA9IFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0TGluaygpOwotCQlzZXJ2bGV0TGluay5zZXRTZXJ2bGV0TGluayhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9TRVJWTEVUX0xJTksiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHNlcnZsZXRMaW5rOwotCX0KLQotCS8vIFdTREwgcG9ydAotCXB1YmxpYyBXU0RMUG9ydCBkZWZhdWx0V1NETFBvcnQoaW50IHZlcnNpb25JRCkgewotCQlXU0RMUG9ydCB3c2RscG9ydCA9IFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydCgpOwotCQlRTmFtZUhlbHBlci5zZXRRTmFtZVZhbHVlKHdzZGxwb3J0LCBkZWZhdWx0TmFtZXNwYWNlVVJJKCksIGRlZmF1bHRMb2NhbFBhcnQoKSwgZGVmYXVsdFByZWZpeCgpLCB2ZXJzaW9uSUQpOwotCQlyZXR1cm4gd3NkbHBvcnQ7Ci0JfQotCi0JLy8gcG9ydCBjb21wb25lbnQKLQlwdWJsaWMgUG9ydENvbXBvbmVudCBkZWZhdWx0UG9ydENvbXBvbmVudChpbnQgdmVyc2lvbklEKSB7Ci0JCVBvcnRDb21wb25lbnQgcG9ydENvbXBvbmVudCA9IFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0Q29tcG9uZW50KCk7Ci0JCXBvcnRDb21wb25lbnQuc2V0UG9ydENvbXBvbmVudE5hbWUoZGVmYXVsdFBvcnRDb21wb25lbnROYW1lKCkpOwotCQlwb3J0Q29tcG9uZW50LnNldFdzZGxQb3J0KGRlZmF1bHRXU0RMUG9ydCh2ZXJzaW9uSUQpKTsKLQkJcG9ydENvbXBvbmVudC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoZGVmYXVsdFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKTsKLQkJcG9ydENvbXBvbmVudC5zZXRTZXJ2aWNlSW1wbEJlYW4oZGVmYXVsdFNlcnZpY2VJbXBsQmVhbigpKTsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnQ7Ci0JfQotCi0JLy8gSkFYIFJQQyBtYXBwaW5nCi0JcHVibGljIFN0cmluZyBkZWZhdWx0SmF4UnBjTWFwcGluZ0ZpbGUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKCJqYXhycGNtYXBwaW5nLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gY29tcG9uZW50IHNjb3BlZCByZWZlcmVuY2UKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRDb21wb25lbnROYW1lKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVfVUlfUG9ydENvbXBvbmVudFJlZl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvSW5mb3BvcENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvSW5mb3BvcENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTIwN2MzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29uc3RhbnRzL0luZm9wb3BDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgSW5mb3BvcENvbnN0YW50cyB7Ci0KLQkvKiogKioqKioqKioqKioqKioqKioqKioqKioqKkluZm9wb3BzIGZvciBwYWdlcyoqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdlYlNlcnZpY2VzUGFnZSgpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIi5FSlNSUDAwMDEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wUG9ydENvbXBvbmVudFBhZ2UoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICIuRUpTUlAwMDAyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTSGFuZGxlclBhZ2UoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICIuRUpTUlAwMDAzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VSZWZQYWdlKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKU1JQMDAwNCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTUkhhbmRsZXJQYWdlKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKU1JQMDAwNSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCi0JLyoqICoqKioqKioqKioqKioqKioqKioqKioqKipJbmZvcG9wcyBmb3Igc2VjdGlvbnMqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcERlc2NyaXB0aW9uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDAxIGZvciB0aGUgZGVzY3JpcHRpb24gdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wRGlzcGxheU5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDIgZm9yIHRoZSBkaXNwbGF5IG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU21hbGxJY29uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDAzIGZvciB0aGUgc21hbGwgaWNvbiBkaXNwbGF5ICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAwMyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BMYXJnZUljb24oKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDQgZm9yIHRoZSBsYXJnZSBpY29uIGRpc3BsYXkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDUgZm9yIHRoZSBXZWIgc2VydmljZSBkZXNjcmlwdGlvbiBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA1IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTRExGaWxlKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA2IGZvciB0aGUgV1NETCBmaWxlIGxvY2F0aW9uIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA2IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcEpBWFJQQ01hcHBpbmdGaWxlKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA3IGZvciB0aGUgSkFYLVJQQyBtYXBwaW5nIGZpbGUgbG9jYXRpb24gdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wUG9ydENvbXBvbmVudE5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDggZm9yIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTRExQb3J0TmFtZXNwYWNlVVJJKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA5IGZvciB0aGUgV1NETCBwb3J0IG5hbWVzcGFjZSBVUkkgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wV1NETFBvcnRMb2NhbHBhcnQoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTAgZm9yIHRoZSBXU0RMIHBvcnQgbG9jYWwgcGFydCB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxMCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMTEgZm9yIHRoZSBmdWxseSBxdWFsaWZpZWQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgY2xhc3MgbmFtZSB0ZXh0Ci0JCSAqIGZpZWxkCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmljZUltcGxCZWFuKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDEyIGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBjbGFzcyBuYW1lIHRleHQKLQkJICogZmllbGQKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxMiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BFSkJMaW5rKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDEzIGZvciB0aGUgdXNlIEVKQiBsaW5rIHJhZGlvIGJ1dHRvbiAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmxldExpbmsoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTQgZm9yIHRoZSB1c2Ugc2VydmxldCBsaW5rIHJhZGlvIGJ1dHRvbiAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wSGFuZGxlck5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTUgZm9yIHRoZSBoYW5kbGVyIG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wSGFuZGxlckNsYXNzKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDE2IGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIGhhbmRsZXIgY2xhc3MgbmFtZSB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxNiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZXJ2aWNlUmVmTmFtZSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxNyBmb3IgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmljZUludGVyZmFjZU5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTggZm9yIHRoZSBzZXJ2aWNlIGludGVyZmFjZSBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDE4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VRTmFtZU5hbWVzcGFjZVVSSSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxOSBmb3IgdGhlIHNlcnZpY2UgcW5hbWUgbmFtc3BhY2UgVVJJIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDE5IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VRTmFtZUxvY2FscGFydCgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAyMCBmb3IgdGhlIHNlcnZpY2UgcW5hbWUgbG9jYWwgcGFydCB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BDb21ib1dlYlNlcnZpY2VEZXNjcmlwdGlvbigpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAyMSBmb3IgdGhlIFdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9uIGRyb3AtZG93biAobGlzdCBvZiBXZWIgc2VydmljZQotCQkgKiBkZXNjcmlwdGlvbnMpCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wQ29tYm9Qb3J0Q29tcG9uZW50KCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDIyIGZvciB0aGUgcG9ydCBjb21wb25lbnQgZHJvcC1kb3duIChsaXN0IG9mIHBvcnQgY29tcG9uZW50cykgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDIyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcENvbWJvQ29tcG9uZW50U2NvcGVkUmVmKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDIzIGZvciB0aGUgY29tcG9uZW50IHNjb3BlZCByZWZlcmVuY2UgZHJvcC1kb3duIChsaXN0IG9mIGNvbXBvbmVudAotCQkgKiBzY29wZWQgcmVmZXJlbmNlKQotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDIzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcENvbWJvU2VydmljZVJlZigpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAyNCBmb3IgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIGRyb3AtZG93biAobGlzdCBvZiBzZXJ2aWNlIHJlZmVyZW5jZXMpICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uV2ViU2VydmljZURlc2NyaXB0aW9uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI1IGZvciB0aGUgV2ViIHNlcnZpY2UgZGVzY3JpcHRpb24gc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXMueG1sIGVkaXRvciAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnRDb21wb25lbnQoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMjYgZm9yIHRoZSBwb3J0IGNvbXBvbmVudCBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlcy54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uSGFuZGxlcldTKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI3IGZvciB0aGUgaGFuZGxlciBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlcy54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uQ29tcG9uZW50U2NvcGVkUmVmKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDI4IGZvciB0aGUgY29tcG9uZW50IHNjb3BlZCByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUKLQkJICogd2Vic2VydmljZXNjbGllbnQueG1sIGVkaXRvcgotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDI4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25TZXJ2aWNlUmVmKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI5IGZvciB0aGUgc2VydmljZSByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sIGVkaXRvciAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnRDb21wb25lbnRSZWYoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzAgZm9yIHRoZSBwb3J0IGNvbXBvbmVudCByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sCi0JCSAqIGVkaXRvcgotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDMwIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25IYW5kbGVyV1NDKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDMxIGZvciB0aGUgaGFuZGxlciBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzMSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uSW5pdFBhcmFtcygpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAzMiBmb3IgdGhlIGluaXRpYWwgcGFyYW1ldGVyIHNlY3Rpb24gaW4gYm90aCB3ZWJzZXJ2aWNlcy54bWwgYW5kCi0JCSAqIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBlZGl0b3IKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzMiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uU09BUEhlYWRlcnMoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzMgZm9yIHRoZSBTT0FQIGhlYWRlciBzZWN0aW9uIGluIGJvdGggd2Vic2VydmljZXMueG1sIGFuZAotCQkgKiB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMzMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblNPQVBSb2xlcygpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAzNCBmb3IgdGhlIFNPQVAgcm9sZSBzZWN0aW9uIGluIGJvdGggd2Vic2VydmljZXMueG1sIGFuZAotCQkgKiB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMzQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnROYW1lcygpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAzNSBmb3IgdGhlIHBvcnQgbmFtZSBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzNSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BSZXNvdXJjZVRyZWUoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzYgZm9yIHRoZSBwb3B1cCBkaWFsb2cgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcmVzb3VyY2UgaW4gdGhlCi0JCSAqIHdvcmtiZW5jaAotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDM2IjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XU0RMSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XU0RMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWIxN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV1NETEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdG8gaGVscCBuYXZpZ2F0ZSBXU0RMIGZpbGVzIHByb3ZpZGVkIGluIHZhcmlvdXMgSlNSLTEwOSBkZXNjcmlwdG9ycwotICovCi1wdWJsaWMgY2xhc3MgV1NETEhlbHBlciB7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHByb2o7Ci0KLQlwdWJsaWMgV1NETEhlbHBlcihJUHJvamVjdCBhUHJvamVjdCkgewotCQl0aGlzLnByb2ogPSBhUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBsaXN0IG9mIHdzZGw6cG9ydEBuYW1lJ3MgY29udGFpbmVkIGluIHRoZSBXU0RMIGZpbGUgcmVmZXJyZWQgdG8gYnkKLQkgKiB0aGUgc3BlY2lmaWVkIDxzZXJ2aWNlLXJlZj4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmljZVJlZk5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSA8c2VydmljZS1yZWY+Ci0JICogQHBhcmFtIGNvbXBTY29wZWRSZWZOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgPGNvbXBvbmVudC1zY29wZWQtcmVmcz4KLQkgKiBAcGFyYW0gd3NjCi0JICogICAgICAgICAgICBUaGUgcm9vdCBvYmplY3Qgb2YgdGhlIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBkZXNjcmlwdG9yCi0JICogQHBhcmFtIGV4Y2x1ZGUKLQkgKiAgICAgICAgICAgIHBvcnQgbmFtZXMgdG8gZXhjbHVkZSBpbiB0aGUgcmV0dXJuZWQgYXJyYXkKLQkgKiBAcmV0dXJuIFN0cmluZ1tdIEFuIGFycmF5IG9mIHdzZGw6cG9ydEBuYW1lcydzLiBudWxsIGlzIHJldHVybmVkIGlmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMKLQkgKiAgICAgICAgIHdpdGggbmF2aWdhdGluZyB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sIG9yIHRoZSBXU0RMLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQb3J0TmFtZXMoU3RyaW5nIHNlcnZpY2VSZWZOYW1lLCBTdHJpbmcgY29tcFNjb3BlZFJlZk5hbWUsIFdlYlNlcnZpY2VzQ2xpZW50IHdzYywgU3RyaW5nW10gZXhjbHVkZSkgewotCQlTZXJ2aWNlUmVmIHNyID0gZ2V0U2VydmljZVJlZihzZXJ2aWNlUmVmTmFtZSwgY29tcFNjb3BlZFJlZk5hbWUsIHdzYyk7Ci0JCWlmIChzciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHdzZGxVUkwgPSBnZXRXU0RMRmlsZVVSTChzcik7Ci0JCWlmICh3c2RsVVJMLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgc2VydmljZUxvY2FsTmFtZSA9IGdldFNlcnZpY2VRbmFtZShzcik7Ci0JCVN0cmluZ1tdIHBvcnROYW1lcyA9IGdldFBvcnROYW1lcyh3c2RsVVJMLCBzZXJ2aWNlTG9jYWxOYW1lKTsKLQkJcG9ydE5hbWVzID0gdHJpbShwb3J0TmFtZXMsIGV4Y2x1ZGUpOwotCQlyZXR1cm4gcG9ydE5hbWVzOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZXNwYWNlIG9mIHRoZSB3c2RsOnNlcnZpY2UgaW4gV1NETCBmaWxlIHJlZmVycmVkIHRvIGJ5IHRoZQotCSAqIHNwZWNpZmllZCA8c2VydmljZS1yZWY+Ci0JICogCi0JICogQHBhcmFtIHNlcnZpY2VSZWZOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgPHNlcnZpY2UtcmVmPgotCSAqIEBwYXJhbSBjb21wU2NvcGVkUmVmTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIDxjb21wb25lbnQtc2NvcGVkLXJlZnM+Ci0JICogQHBhcmFtIHdzYwotCSAqICAgICAgICAgICAgVGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBleGNsdWRlCi0JICogICAgICAgICAgICBwb3J0IG5hbWVzIHRvIGV4Y2x1ZGUgaW4gdGhlIHJldHVybmVkIGFycmF5Ci0JICogQHJldHVybiBTdHJpbmcgVGhlIG5hbWVzcGFjZSBvZiB0aGUgd3NkbDpzZXJ2aWNlLiBudWxsIGlzIHJldHVybmVkIGlmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMKLQkgKiAgICAgICAgIHdpdGggbmF2aWdhdGluZyB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sIG9yIHRoZSBXU0RMLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWVzcGFjZShTdHJpbmcgc2VydmljZVJlZk5hbWUsIFN0cmluZyBjb21wU2NvcGVkUmVmTmFtZSwgV2ViU2VydmljZXNDbGllbnQgd3NjKSB7Ci0JCVNlcnZpY2VSZWYgc3IgPSBnZXRTZXJ2aWNlUmVmKHNlcnZpY2VSZWZOYW1lLCBjb21wU2NvcGVkUmVmTmFtZSwgd3NjKTsKLQkJaWYgKHNyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgd3NkbFVSTCA9IGdldFdTRExGaWxlVVJMKHNyKTsKLQkJaWYgKHdzZGxVUkwubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBzZXJ2aWNlTG9jYWxOYW1lID0gZ2V0U2VydmljZVFuYW1lKHNyKTsKLQkJU3RyaW5nIG5hbWVzcGFjZSA9IGdldFBvcnROYW1lc3BhY2Uod3NkbFVSTCwgc2VydmljZUxvY2FsTmFtZSk7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbGlzdCBvZiB3c2RsOnBvcnRAbmFtZSdzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIHdzZGw6c2VydmljZSBpbgotCSAqIHRoZSBzcGVjaWZpZWQgV1NETCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB3c2RsVVJMCi0JICogICAgICAgICAgICBUaGUgVVJMIG9mIHRoZSBXU0RMIGZpbGUuCi0JICogQHBhcmFtIHNlcnZpY2VMb2NhbE5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSB3c2RsOnNlcnZpY2UgdG8gbG9vayBpbi4KLQkgKiBAcmV0dXJuIFN0cmluZ1tdIEFuIGFycmF5IG9mIHdzZGw6cG9ydEBuYW1lJ3MuIE51bGwgaXMgcmV0dXJuZWQgYSB3c2RsOnNlcnZpY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgIHNwZWNpZmllZCBsb2NhbCBuYW1lIGNvdWxkIG5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGdldFBvcnROYW1lcyhTdHJpbmcgd3NkbFVSTCwgU3RyaW5nIHNlcnZpY2VMb2NhbE5hbWUpIHsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCU9iamVjdCB0YXJnZXRTZXJ2aWNlID0gZ2V0VGFyZ2V0U2VydmljZSh3c2RsVVJMLCBzZXJ2aWNlTG9jYWxOYW1lKTsKLQotCQlpZiAodGFyZ2V0U2VydmljZSA9PSBudWxsKSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0UG9ydE5hbWVzIC4uLiB0YXJnZXRTZXJ2aWNlIG51bGwuIik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCBwb3J0cyA9IHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZVBvcnRzKHRhcmdldFNlcnZpY2UpOwotCQlpbnQgbnVtYmVyT2ZQb3J0cyA9IHBvcnRzLnNpemUoKTsKLQkJU3RyaW5nW10gcG9ydE5hbWVzID0gbmV3IFN0cmluZ1tudW1iZXJPZlBvcnRzXTsKLQkJSXRlcmF0b3IgayA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IG0gPSAwOyBtIDwgbnVtYmVyT2ZQb3J0czsgbSsrKSB7Ci0JCQlPYmplY3QgcG9ydCA9IGsubmV4dCgpOwotCQkJcG9ydE5hbWVzW21dID0gc2VydmljZUhlbHBlci5nZXRQb3J0TmFtZShwb3J0KTsKLQkJfQotCi0JCXJldHVybiBwb3J0TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZXNwYWNlIG9mIHRoZSBzcGVjaWZpZWQgd3NkbDpzZXJ2aWNlIGluIHRoZSBzcGVjaWZpZWQgV1NETCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB3c2RsVVJMCi0JICogICAgICAgICAgICBUaGUgVVJMIG9mIHRoZSBXU0RMIGZpbGUuCi0JICogQHBhcmFtIHNlcnZpY2VMb2NhbE5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSB3c2RsOnNlcnZpY2UgdG8gbG9vayBpbi4KLQkgKiBAcmV0dXJuIFN0cmluZ1tdIEFuIGFycmF5IG9mIHdzZGw6cG9ydEBuYW1lJ3MuIEFuIGVtcHR5IFN0cmluZyBpcyByZXR1cm5lZCBpZiBhIHdzZGw6c2VydmljZQotCSAqICAgICAgICAgd2l0aCB0aGUgc3BlY2lmaWVkIGxvY2FsIG5hbWUgY291bGQgbm90IGJlIGZvdW5kLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBvcnROYW1lc3BhY2UoU3RyaW5nIHdzZGxVUkwsIFN0cmluZyBzZXJ2aWNlTG9jYWxOYW1lKSB7Ci0JCU9iamVjdCB0YXJnZXRTZXJ2aWNlID0gZ2V0VGFyZ2V0U2VydmljZSh3c2RsVVJMLCBzZXJ2aWNlTG9jYWxOYW1lKTsKLQotCQlpZiAodGFyZ2V0U2VydmljZSA9PSBudWxsKSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0UG9ydE5hbWVzcGFjZSAuLi4gdGFyZ2V0U2VydmljZSBudWxsLiIpOwotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKS5nZXRTZXJ2aWNlTmFtZXNwYWNlVVJJKHRhcmdldFNlcnZpY2UpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldFRhcmdldFNlcnZpY2UoU3RyaW5nIHdzZGxVUkwsIFN0cmluZyBzZXJ2aWNlTG9jYWxOYW1lKSB7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlPYmplY3QgZGVmaW5pdGlvbiA9IGdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotCQlpZiAoZGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU9iamVjdCB0YXJnZXRTZXJ2aWNlID0gbnVsbDsKLQkJTWFwIHNlcnZpY2VzID0gc2VydmljZUhlbHBlci5nZXREZWZpbml0aW9uU2VydmljZXMoZGVmaW5pdGlvbik7Ci0JCWlmICghc2VydmljZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoKHNlcnZpY2VMb2NhbE5hbWUgPT0gbnVsbCB8fCBzZXJ2aWNlTG9jYWxOYW1lLmxlbmd0aCgpID09IDApICYmIHNlcnZpY2VzLnNpemUoKSA+IDEpIC8vTXVsdGlwbGUKLQkJCS8vIHNlcnZpY2VzCi0JCQkvLyB3aXRob3V0Ci0JCQkvLyBvbmUKLQkJCS8vIGRlc2lnbmF0ZWQKLQkJCS8vIGlzCi0JCQkvLyBhbgotCQkJLy8gZXJyb3IKLQkJCXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJaWYgKChzZXJ2aWNlTG9jYWxOYW1lID09IG51bGwgfHwgc2VydmljZUxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKSAmJiBzZXJ2aWNlcy5zaXplKCkgPT0gMSkgewotCQkJCS8vUmV0dXJuIHRoZSBwb3J0IG5hbWVzIGluIHRoZSBvbmUgc2VydmljZQotCQkJCUl0ZXJhdG9yIGkgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXRhcmdldFNlcnZpY2UgPSBpLm5leHQoKTsKLQkJCX0gZWxzZSAvL1RoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aWNlcyBidXQgb25lIGlzIGRlc2lnbmF0ZWQKLQkJCXsKLQkJCQlJdGVyYXRvciBqID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoai5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IHNlcnZpY2UgPSBqLm5leHQoKTsKLQkJCQkJU3RyaW5nIHNlcnZpY2VOYW1lID0gc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlTG9jYWxQYXJ0KHNlcnZpY2UpOwotCQkJCQlpZiAoc2VydmljZU5hbWUuZXF1YWxzKHNlcnZpY2VMb2NhbE5hbWUpKSB7Ci0JCQkJCQl0YXJnZXRTZXJ2aWNlID0gc2VydmljZTsKLQkJCQkJCWJyZWFrOyAvL0ZvdW5kIGEgbWF0Y2guIEJyZWFrIG91dCBvZiBsb29wLiBXZSBtdXN0IGJlIGFzc3VtaW5nIHVuaXF1ZSBuYW1lcwotCQkJCQkJLy8gb24gc2VydmljZXMuCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGFyZ2V0U2VydmljZTsKLQotCX0KLQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0V1NETERlZmluaXRpb24oU3RyaW5nIHdzZGxVUkwpIHsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCXJldHVybiBzZXJ2aWNlSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotCQkKLQkJLyp0cnkgewotCQkJV1NETFJlc291cmNlSW1wbCByZXMgPSAoV1NETFJlc291cmNlSW1wbCkgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkod3NkbFVSTCksIHRydWUpOwotCQkJaWYgKHJlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHJlcy5nZXREZWZpbml0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiB3c2RsZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0qLwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgVVJMIG9mIHRoZSA8d3NkbC1maWxlPnNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gPHNlcnZpY2UtcmVmPi4gUmV0dXJucyBhIGJsYW5rCi0JICogU3RyaW5nIGlmIDx3c2RsLWZpbGU+aXMgbm90IHNwZWNpZmllZCBpbiB0aGUgcHJvdmlkZWQgPHNlcnZpY2UtcmVmPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFdTRExGaWxlVVJMKFNlcnZpY2VSZWYgc3IpIHsKLQkJU3RyaW5nIHdzZGxGaWxlUmVsUGF0aCA9IHNyLmdldFdzZGxGaWxlKCk7Ci0JCWlmICh3c2RsRmlsZVJlbFBhdGggPT0gbnVsbCB8fCB3c2RsRmlsZVJlbFBhdGgubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEdldCBhIGhhbmRsZSBvbiB0aGUgV1NETCBmaWxlLgotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qKTsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlJVmlydHVhbEZvbGRlciBtb2R1bGVSb290ID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJSUZpbGUgd3NkbEZpbGUgPSBtb2R1bGVSb290LmdldEZpbGUod3NkbEZpbGVSZWxQYXRoKS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQkJaWYgKCF3c2RsRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy9HZXQgdGhlIGZpbGVVUkwgZnJvbSB3c2RsRmlsZQotCQkJU3RyaW5nIHdzZGxVUkw7Ci0JCQl0cnkgewotCQkJCXdzZGxVUkwgPSB3c2RsRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAod3NkbFVSTCA9PSBudWxsIHx8IHdzZGxVUkwubGVuZ3RoKCkgPT0gMCkKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB3c2RsVVJMOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsIHBhcnQgb2YgdGhlIDxzZXJ2aWNlLXFuYW1lPnNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gPHNlcnZpY2UtcmVmPi4gUmV0dXJucyBhCi0JICogYmxhbmsgU3RyaW5nIGlmIDxzZXJ2aWNlLXFuYW1lPmlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHByb3ZpZGVkIDxzZXJ2aWNlLXJlZj4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTZXJ2aWNlUW5hbWUoU2VydmljZVJlZiBzcikgewotCQlRTmFtZSBzZXJ2aWNlUW5hbWUgPSBzci5nZXRTZXJ2aWNlUW5hbWUoKTsKLQkJaWYgKHNlcnZpY2VRbmFtZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHNlcnZpY2VMb2NhbE5hbWUgPSBzZXJ2aWNlUW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0JCWlmIChzZXJ2aWNlTG9jYWxOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gc2VydmljZUxvY2FsTmFtZTsKLQl9Ci0KLQkvKiBJZiBjb21wU2NvcGVkUmVmTmFtZSBpcyBlbXB0eSBvciBudWxsLCB3ZSBtYXkgaGF2ZSB0byBjaGVjayBhbGwgb2YgdGhlbS4gKi8KLQlwdWJsaWMgU2VydmljZVJlZiBnZXRTZXJ2aWNlUmVmKFN0cmluZyBuYW1lLCBTdHJpbmcgY29tcFNjb3BlZFJlZk5hbWUsIFdlYlNlcnZpY2VzQ2xpZW50IHdzYykgewotCQlJdGVyYXRvciBzZXJ2aWNlUmVmczsKLQkJaWYgKGNvbXBTY29wZWRSZWZOYW1lICE9IG51bGwgJiYgY29tcFNjb3BlZFJlZk5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlDb21wb25lbnRTY29wZWRSZWZzIGNzciA9IGdldENvbXBTY29wZWRSZWYoY29tcFNjb3BlZFJlZk5hbWUsIHdzYyk7Ci0JCQlzZXJ2aWNlUmVmcyA9IGNzci5nZXRTZXJ2aWNlUmVmcygpLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IHdzYy5nZXRTZXJ2aWNlUmVmcygpLml0ZXJhdG9yKCk7Ci0JCQkvL0lmIHRoZXJlIGFyZSBubyBzZXJ2aWNlIHJlZnMgLi4uIGNoZWNrIGFsbCBjb21wb25lbnQtc2NvcGVkLXJlZnMgZm9yIHRoZSBzZXJ2aWNlLXJlZgotCQkJaWYgKCFzZXJ2aWNlUmVmcy5oYXNOZXh0KCkpIHsKLQkJCQlJdGVyYXRvciBjc1JlZnMgPSB3c2MuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpLml0ZXJhdG9yKCk7Ci0KLQkJCQl3aGlsZSAoY3NSZWZzLmhhc05leHQoKSkgewotCQkJCQlDb21wb25lbnRTY29wZWRSZWZzIGNzciA9IChDb21wb25lbnRTY29wZWRSZWZzKSBjc1JlZnMubmV4dCgpOwotCQkJCQlJdGVyYXRvciBzcnMgPSBjc3IuZ2V0U2VydmljZVJlZnMoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoc3JzLmhhc05leHQoKSkgewotCQkJCQkJU2VydmljZVJlZiBzciA9IChTZXJ2aWNlUmVmKSBzcnMubmV4dCgpOwotCQkJCQkJU3RyaW5nIHRoaXNOYW1lID0gc3IuZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJCQkJCWlmICh0aGlzTmFtZS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCQlyZXR1cm4gc3I7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbnVsbDsgLy9Db3VsZCBub3QgZmluZCBpdCBpbiBhbnkgb2YgdGhlIGNvbXBvbmVudC1zY29wZWQtcmVmcwotCQkJfQotCi0JCX0KLQotCQl3aGlsZSAoc2VydmljZVJlZnMuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2aWNlUmVmIHNlcnZpY2VSZWYgPSAoU2VydmljZVJlZikgc2VydmljZVJlZnMubmV4dCgpOwotCQkJU3RyaW5nIHNlcnZpY2VSZWZOYW1lID0gc2VydmljZVJlZi5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotCQkJaWYgKHNlcnZpY2VSZWZOYW1lLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gc2VydmljZVJlZjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXByaXZhdGUgQ29tcG9uZW50U2NvcGVkUmVmcyBnZXRDb21wU2NvcGVkUmVmKFN0cmluZyBuYW1lLCBXZWJTZXJ2aWNlc0NsaWVudCB3c2MpIHsKLQkJSXRlcmF0b3IgY29tcFNjb3BlZFJlZnMgPSB3c2MuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb21wU2NvcGVkUmVmcy5oYXNOZXh0KCkpIHsKLQkJCUNvbXBvbmVudFNjb3BlZFJlZnMgY29tcFNjb3BlZFJlZiA9IChDb21wb25lbnRTY29wZWRSZWZzKSBjb21wU2NvcGVkUmVmcy5uZXh0KCk7Ci0JCQlTdHJpbmcgY29tcFNjb3BlZFJlZk5hbWUgPSBjb21wU2NvcGVkUmVmLmdldENvbXBvbmVudE5hbWUoKTsKLQkJCWlmIChjb21wU2NvcGVkUmVmTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIGNvbXBTY29wZWRSZWY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nW10gdHJpbShTdHJpbmdbXSB2YWx1ZXMsIFN0cmluZ1tdIGV4Y2x1ZGUpIHsKLQkJaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5sZW5ndGggPT0gMCB8fCBleGNsdWRlID09IG51bGwgfHwgZXhjbHVkZS5sZW5ndGggPT0gMCkgLy9ubwotCQkJLy8gY2hhbmdlCi0JCQkvLyByZXF1aXJlZC4KLQkJCS8vIHJldHVybgotCQkJLy8gYXMKLQkJCS8vIGlzLgotCQkJcmV0dXJuIHZhbHVlczsKLQotCQlTdHJpbmdbXSBmaW5hbFZhbHVlczsKLQkJQXJyYXlMaXN0IGZpbmFsTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghY29udGFpbnMoZXhjbHVkZSwgdmFsdWVzW2ldKSkgewotCQkJCWZpbmFsTGlzdC5hZGQodmFsdWVzW2ldKTsKLQkJCX0KLQkJfQotCi0JCWludCBmaW5hbFNpemUgPSBmaW5hbExpc3Quc2l6ZSgpOwotCQlmaW5hbFZhbHVlcyA9IG5ldyBTdHJpbmdbZmluYWxTaXplXTsKLQkJT2JqZWN0W10gZmluYWxBcnJheSA9IGZpbmFsTGlzdC50b0FycmF5KCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZmluYWxTaXplOyBqKyspIHsKLQkJCWZpbmFsVmFsdWVzW2pdID0gKFN0cmluZykgKGZpbmFsQXJyYXlbal0pOwotCQl9Ci0KLQkJcmV0dXJuIGZpbmFsVmFsdWVzOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBhcnJheSBvZiBTdHJpbmcncyBjb250YWlucyB0aGUgc3BlY2lmaWVkIFN0cmluZy4gRmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhTdHJpbmdbXSB2YWx1ZXMsIFN0cmluZyBzKSB7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHZhbHVlc1tpXS5lcXVhbHMocykpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XU0RMU2VydmljZUhlbHBlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dTRExTZXJ2aWNlSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQyZDdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dTRExTZXJ2aWNlSGVscGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV1NETFNlcnZpY2VIZWxwZXJJbXBsIGltcGxlbWVudHMgV1NETFNlcnZpY2VIZWxwZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFdTRExTZXJ2aWNlSGVscGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9IAotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRQb3J0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoT2JqZWN0IHBvcnQpIHsKLQkJUG9ydCBhUG9ydCA9IChQb3J0KXBvcnQ7Ci0JCXJldHVybiBhUG9ydC5nZXROYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZVBvcnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE1hcCBnZXRTZXJ2aWNlUG9ydHMoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZU5hbWVzcGFjZVVSSShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWVzcGFjZVVSSShPYmplY3QgYVNlcnZpY2UpIHsKLQkJU2VydmljZSBzZXJ2aWNlID0oU2VydmljZSlhU2VydmljZTsKLQkJcmV0dXJuIHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRTZXJ2aWNlRGVmaW5pdGlvbkxvY2F0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VydmljZURlZmluaXRpb25Mb2NhdGlvbihFT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRMb2NhdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFBvcnRCaW5kaW5nTmFtZXNwYWNlVVJJKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0QmluZGluZ05hbWVzcGFjZVVSSShPYmplY3QgYVBvcnQpIHsKLQkJUG9ydCBwb3J0ID0gKFBvcnQpYVBvcnQ7Ci0JCXJldHVybiBwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFNlcnZpY2VMb2NhbFBhcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VMb2NhbFBhcnQoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZVFOYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlUU5hbWUoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFFOYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0RGVmaW5pdGlvblNlcnZpY2VzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE1hcCBnZXREZWZpbml0aW9uU2VydmljZXMoT2JqZWN0IGFEZWZpbml0aW9uKSB7Ci0JCURlZmluaXRpb24gZGVmaW5pdGlvbiA9KERlZmluaXRpb24pYURlZmluaXRpb247Ci0JCXJldHVybiBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0V1NETERlZmluaXRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdTRExEZWZpbml0aW9uKFN0cmluZyB3c2RsVVJMKSB7Ci0JCXRyeSB7Ci0JCQlXU0RMUmVzb3VyY2VJbXBsIHJlcyA9IChXU0RMUmVzb3VyY2VJbXBsKSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh3c2RsVVJMKSwgdHJ1ZSk7Ci0JCQlpZiAocmVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gcmVzLmdldERlZmluaXRpb24oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIHdzZGxlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFdTRExEZWZpbml0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdTRExEZWZpbml0aW9uKFJlc291cmNlIHdzZGxSZXNvdXJjZSkgewotCQlyZXR1cm4gKChXU0RMUmVzb3VyY2VJbXBsKXdzZGxSZXNvdXJjZSkuZ2V0RGVmaW5pdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXc2RsU2VydmljZXNGcm9tV3NpbEZpbGUoSUZpbGUgd3NpbCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJV2ViU2VydmljZUVudGl0eSBlbnRpdHkgPSBwYXJzZVdzaWxGaWxlKHdzaWwpOwotCQlpZiAoZW50aXR5ICE9IG51bGwgJiYgZW50aXR5LmdldFR5cGUoKSA9PSBXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTCkgewotCQkJLy8gZ2V0IGFsbCB0aGUgV1NETCByZWZlcmVuY2VzIGZyb20gdGhlIFdTSUwgZW50aXR5Ci0JCQlMaXN0IHdzZGxMaXN0ID0gZW50aXR5LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd3NkbExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJCWlmIChpdGVtICE9IG51bGwgJiYgaXRlbSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFbnRpdHkpIHsKLQkJCQkJaWYgKCgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKSAhPSBudWxsICYmICgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIERlZmluaXRpb24pIHsKLQkJCQkJCURlZmluaXRpb24gZGVmID0gKERlZmluaXRpb24pICgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChkZWYgIT0gbnVsbCAmJiAhZGVmLmdldFNlcnZpY2VzKCkuaXNFbXB0eSgpKQotCQkJCQkJCXJlc3VsdC5hZGRBbGwoZGVmLmdldFNlcnZpY2VzKCkudmFsdWVzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBXZWJTZXJ2aWNlRW50aXR5IHBhcnNlV3NpbEZpbGUoSUZpbGUgd3NpbCkgewotCVdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0JU3RyaW5nIHVybCA9IG51bGw7Ci0JLy8gdmVyaWZ5IHByb3BlciBpbnB1dAotCWlmICh3c2lsID09IG51bGwgfHwgIXdzaWwuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0lMX0VYVCkpCi0JCXJldHVybiBudWxsOwotCS8vIFBhcnNlIHdzaWwgZmlsZSB0byBnZXQgd3NkbCBzZXJ2aWNlcwotCXRyeSB7Ci0JCXVybCA9IHdzaWwuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0JCXBhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlcih1cmwpOwotCQlwYXJzZXIucGFyc2UoV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfV1NJTCB8IFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX1dTREwpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCS8vSWdub3JlCi0JfQotCWlmIChwYXJzZXIgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIHBhcnNlci5nZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkodXJsKTsKLX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2VydmljZShPYmplY3QgYVNlcnZpY2UpIHsKLQkJCi0JCXJldHVybiBhU2VydmljZSBpbnN0YW5jZW9mIFNlcnZpY2U7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzV1NETFJlc291cmNlKE9iamVjdCBhUmVzb3VyY2UpIHsKLQkJCi0JCXJldHVybiBhUmVzb3VyY2UgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRpb24oT2JqZWN0IGFEZWZpbml0aW9uKSB7Ci0JCQotCQlyZXR1cm4gYURlZmluaXRpb24gaW5zdGFuY2VvZiBEZWZpbml0aW9uOwotCX0KLQotCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhFT2JqZWN0IGoyZWVPYmplY3QpIHsKLQkJaWYgKGoyZWVPYmplY3QgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkNsaWVudCkKLQkJCXJldHVybiBXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXQxM1NlcnZpY2VSZWZzKChBcHBsaWNhdGlvbkNsaWVudClqMmVlT2JqZWN0KTsKLQkJZWxzZSBpZiAoajJlZU9iamVjdCBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldDEzU2VydmljZVJlZnMoKEVudGVycHJpc2VCZWFuKWoyZWVPYmplY3QpOwotCQllbHNlIGlmIChqMmVlT2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldDEzU2VydmljZVJlZnMoKFdlYkFwcClqMmVlT2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZUV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1MzMzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VFdmVudCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUZSRVNIID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAwOwotCQotCXByaXZhdGUgaW50IGV2ZW50VHlwZSA9IDA7Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VFdmVudChpbnQgYW5FdmVudFR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJZXZlbnRUeXBlID0gYW5FdmVudFR5cGU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotCQlyZXR1cm4gZXZlbnRUeXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWRjYWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlcjsKLQotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIHdlYlNlcnZpY2VNYW5hZ2VyQ2hhbmdlZChXZWJTZXJ2aWNlRXZlbnQgYW5FdmVudCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlc01hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dlYlNlcnZpY2VzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGZlYjVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dlYlNlcnZpY2VzTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi0KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsLldTQ0REQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsLldTRERBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHBSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc01hbmFnZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd3NBcnRpZmFjdEVkaXRzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIEhhc2hNYXAgd3NDbGllbnRBcnRpZmFjdEVkaXRzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIExpc3Qgd3NBcnRpZmFjdEVkaXRzTGlzdDsKLQlwcml2YXRlIExpc3Qgd3NDbGllbnRBcnRpZmFjdEVkaXRzTGlzdDsKLQlwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlc01hbmFnZXIgSU5TVEFOQ0UgPSBudWxsOwotCXByaXZhdGUgTGlzdCBsaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBMaXN0IHJlbW92ZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzTm90aWZ5aW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHdzQ2xpZW50RWxlbWVudHNDaGFuZ2VkID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gd3NFbGVtZW50c0NoYW5nZWQgPSB0cnVlOwotCXByaXZhdGUgUHJvY2Vzc1Byb2plY3RzV2l0aFdTREwgcHJvY2Vzc05ld1Byb2plY3RzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9FWFQgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0lMX0VYVCA9ICJ3c2lsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgV2ViU2VydmljZXNNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkKLQkJCUlOU1RBTkNFID0gbmV3IFdlYlNlcnZpY2VzTWFuYWdlcigpOwotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyAgYm9vbGVhbiBpc0ZpbGVJbnRlcmVzdGluZyhJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgIT0gbnVsbCAmJiBhRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IGFGaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCXJldHVybiBleHRlbnNpb24uZXF1YWxzKFdTRExfRVhUKSB8fCBleHRlbnNpb24uZXF1YWxzKFdTSUxfRVhUKSAKLQkJCXx8IGFGaWxlLmdldE5hbWUoKS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NIT1JUTkFNRSkgCi0JCQl8fCBhRmlsZS5nZXROYW1lKCkuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0REX1VSSSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQljb2xsZWN0QXJ0aWZhY3RFZGl0cygpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRBcnRpZmFjdEVkaXQoSVByb2plY3QgaGFuZGxlKSB7Ci0JCXN5bmNocm9uaXplZCh3c0FydGlmYWN0RWRpdHMpIHsKLQkJCWlmICghd3NBcnRpZmFjdEVkaXRzLmNvbnRhaW5zS2V5KGhhbmRsZSkpIHsKLQkJCQlXU0REQXJ0aWZhY3RFZGl0IGVkaXQgPSBXU0REQXJ0aWZhY3RFZGl0LmdldFdTRERBcnRpZmFjdEVkaXRGb3JSZWFkKGhhbmRsZSk7Ci0JCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCQlXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcyA9IGVkaXQuZ2V0V2ViU2VydmljZXMoKTsKLQkJCQkJLy8gSWYgdGhlIHByb2plY3QgaGFzIGEgd2Vic2VydmljZS54bWwgd2l0aCBpbnRlcm5hbCBzZXJ2aWNlcyBvciAKLQkJCQkJLy8gaXQgaGFzIC53c2lsIGZpbGVzIHdpdGggZXh0ZXJuYWwgc2VydmljZXMsIHdlIGNhY2hlIHRoZSBhcnRpZmFjdCBlZGl0Ci0JCQkJCWlmICgod2ViU2VydmljZXMgIT0gbnVsbCAmJiAhd2ViU2VydmljZXMuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgfHwgIWVkaXQuZ2V0V1NJTFJlc291cmNlcygpLmlzRW1wdHkoKSkgewotCQkJCQkJZWRpdC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJCXdzQXJ0aWZhY3RFZGl0cy5wdXQoaGFuZGxlLCBlZGl0KTsKLQkJCQkJCXdzRWxlbWVudHNDaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJLy8gT3RoZXJ3aXNlLCBkaXNwb3NlIHRoZSBhcnRpZmFjdCBlZGl0Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlzeW5jaHJvbml6ZWQgKHdzQ2xpZW50QXJ0aWZhY3RFZGl0cykgewotCQkJaWYgKCF3c0NsaWVudEFydGlmYWN0RWRpdHMuY29udGFpbnNLZXkoaGFuZGxlKSkgewotCQkJCVdTQ0REQXJ0aWZhY3RFZGl0IGVkaXQgPSBXU0NEREFydGlmYWN0RWRpdC5nZXRXU0NEREFydGlmYWN0RWRpdEZvclJlYWQoaGFuZGxlKTsKLQkJCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJCVdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gZWRpdC5nZXRXc2NkZFhtaVJlc291cmNlKCk7Ci0JCQkJCWJvb2xlYW4gaXNJbnRlcmVzdGVkID0gZmFsc2U7Ci0JCQkJCS8vIERvZXMgdGhlIHByb2plY3QgaGF2ZSAxLjMgd2ViIHNlcnZpY2UgY2xpZW50cz8KLQkJCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5pc0xvYWRlZCgpICYmIHJlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpICE9IG51bGwpCi0JCQkJCQlpc0ludGVyZXN0ZWQgPSB0cnVlOwotCQkJCQkKLQkJCQkJLy8gRG9lcyB0aGUgcHJvamVjdCBoYXZlIDEuNCB3ZWIgc2VydmljZSBjbGllbnRzPwotCQkJCQlMaXN0IHdzQ2xpZW50RWRpdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXdzQ2xpZW50RWRpdHMuYWRkKGVkaXQpOwotCQkJCQkvL2lmICghZ2V0V29ya3NwYWNlMTRTZXJ2aWNlUmVmcyh3c0NsaWVudEVkaXRzKS5pc0VtcHR5KCkpCi0JCQkJCQlpc0ludGVyZXN0ZWQgPSB0cnVlOwotCQkJCQkKLQkJCQkJLy8gSWYgcHJvamVjdCBoYXMgMS4zIG9yIDEuNCB3ZWIgc2VydmljZSBjbGllbnRzLCBjYWNoZSB0aGUgYXJ0aWZhY3QgZWRpdAotCQkJCQlpZiAoaXNJbnRlcmVzdGVkKSB7Ci0JCQkJCQllZGl0LmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCQkJd3NDbGllbnRBcnRpZmFjdEVkaXRzLnB1dChoYW5kbGUsIGVkaXQpOwotCQkJCQkJd3NDbGllbnRFbGVtZW50c0NoYW5nZWQgPSB0cnVlOwotCQkJCQkvLyBPdGhlcndpc2UsIGRpc3Bvc2UgdGhlIGFydGlmYWN0IGVkaXQJCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGhhbmRsZSkgewotCQlzeW5jaHJvbml6ZWQod3NBcnRpZmFjdEVkaXRzKSB7Ci0JCQlpZiAod3NBcnRpZmFjdEVkaXRzLmNvbnRhaW5zS2V5KGhhbmRsZSkpIHsKLQkJCQlBcnRpZmFjdEVkaXQgZWRpdCA9IChBcnRpZmFjdEVkaXQpIHdzQXJ0aWZhY3RFZGl0cy5nZXQoaGFuZGxlKTsKLQkJCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJCXdzQXJ0aWZhY3RFZGl0cy5yZW1vdmUoaGFuZGxlKTsKLQkJCQkJZWRpdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQkJCXdzRWxlbWVudHNDaGFuZ2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3luY2hyb25pemVkICh3c0NsaWVudEFydGlmYWN0RWRpdHMpIHsKLQkJCWlmICh3c0NsaWVudEFydGlmYWN0RWRpdHMuY29udGFpbnNLZXkoaGFuZGxlKSkgewotCQkJCUFydGlmYWN0RWRpdCBlZGl0ID0gKEFydGlmYWN0RWRpdCkgd3NDbGllbnRBcnRpZmFjdEVkaXRzLmdldChoYW5kbGUpOwotCQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQkJd3NDbGllbnRBcnRpZmFjdEVkaXRzLnJlbW92ZShoYW5kbGUpOwotCQkJCQllZGl0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCQkJd3NDbGllbnRFbGVtZW50c0NoYW5nZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb2xsZWN0QXJ0aWZhY3RFZGl0cygpIHsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQl0cnkgewotCQkJCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSB8fCBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkgfHwgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNTdGF0aWNXZWJQcm9qZWN0KHByb2plY3QpKQotCQkJCQljb250aW51ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlhZGRBcnRpZmFjdEVkaXQoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFydGlmYWN0IGVkaXQgaXRlcmF0b3IgZm9yIHdlYiBzZXJ2aWNlIGFydGlmYWN0IGVkaXRzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFdTQXJ0aWZhY3RFZGl0cygpIHsKLQkJc3luY2hyb25pemVkICh3c0FydGlmYWN0RWRpdHMpIHsKLQkJCWlmICh3c0VsZW1lbnRzQ2hhbmdlZCkgewotCQkJCXdzQXJ0aWZhY3RFZGl0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJd3NBcnRpZmFjdEVkaXRzTGlzdC5hZGRBbGwod3NBcnRpZmFjdEVkaXRzLnZhbHVlcygpKTsKLQkJCQl3c0VsZW1lbnRzQ2hhbmdlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB3c0FydGlmYWN0RWRpdHNMaXN0OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVkaXRNb2RlbHMuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpIHsKLQkJc3luY2hyb25pemVkICh3c0NsaWVudEFydGlmYWN0RWRpdHMpIHsKLQkJCWlmICh3c0NsaWVudEVsZW1lbnRzQ2hhbmdlZCkgewotCQkJCXdzQ2xpZW50QXJ0aWZhY3RFZGl0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJd3NDbGllbnRBcnRpZmFjdEVkaXRzTGlzdC5hZGRBbGwod3NDbGllbnRBcnRpZmFjdEVkaXRzLnZhbHVlcygpKTsKLQkJCQl3c0NsaWVudEVsZW1lbnRzQ2hhbmdlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB3c0NsaWVudEFydGlmYWN0RWRpdHNMaXN0OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYUxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihXZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlpZiAoYUxpc3RlbmVyICE9IG51bGwgJiYgIWdldExpc3RlbmVycygpLmNvbnRhaW5zKGFMaXN0ZW5lcikpCi0JCQlnZXRMaXN0ZW5lcnMoKS5hZGQoYUxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyI2VkaXRNb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCWlmIChhbkV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChhbkV2ZW50LmdldEV2ZW50Q29kZSgpPT1FZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRSkgewotCQkJTGlzdCByZXNvdXJjZXMgPSBhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxyZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQkJaWYgKGlzSW50ZXJlc3RlZEluUmVzb3VyY2UocmVzKSkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkgPT0gRWRpdE1vZGVsRXZlbnQuUFJFX0RJU1BPU0UpIHsKLQkJCUFydGlmYWN0RWRpdE1vZGVsIGVkaXRNb2RlbCA9IChBcnRpZmFjdEVkaXRNb2RlbCkgYW5FdmVudC5nZXRFZGl0TW9kZWwoKTsKLQkJCWlmIChlZGl0TW9kZWwgPT0gbnVsbCB8fCBlZGl0TW9kZWwuZ2V0UHJvamVjdCgpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJcmVtb3ZlQXJ0aWZhY3RFZGl0KGVkaXRNb2RlbC5nZXRQcm9qZWN0KCkpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mCi0JICogCi0JICogQGFuRXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBhbkV2ZW50VHlwZSkgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaXNOb3RpZnlpbmcgPSB0cnVlOwotCQl9Ci0JCXRyeSB7Ci0JCQlXZWJTZXJ2aWNlRXZlbnQgd2ViU2VydmljZUV2ZW50ID0gbnVsbDsKLQkJCQotCQkJc3dpdGNoIChhbkV2ZW50VHlwZSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRToKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuUFJFX0RJU1BPU0U6Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0U6Ci0JCQkJd2ViU2VydmljZUV2ZW50ID0gbmV3IFdlYlNlcnZpY2VFdmVudChXZWJTZXJ2aWNlRXZlbnQuUkVNT1ZFKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKCFnZXRBbGxXb3Jrc3BhY2VTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSB8fCAhZ2V0QWxsV1NETFNlcnZpY2VzKCkuaXNFbXB0eSgpKQotCQkJCQl3ZWJTZXJ2aWNlRXZlbnQgPSBuZXcgV2ViU2VydmljZUV2ZW50KFdlYlNlcnZpY2VFdmVudC5SRUZSRVNIKTsKLQkJCX0KLQkJCUxpc3QgbGlzdCA9IGdldExpc3RlbmVycygpOwotCQkJaWYgKHdlYlNlcnZpY2VFdmVudCE9bnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkoKFdlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXIpIGxpc3QuZ2V0KGkpKS53ZWJTZXJ2aWNlTWFuYWdlckNoYW5nZWQod2ViU2VydmljZUV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpc05vdGlmeWluZyA9IGZhbHNlOwotCQkJCWlmIChyZW1vdmVkTGlzdGVuZXJzICE9IG51bGwgJiYgIXJlbW92ZWRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZExpc3RlbmVycy5zaXplKCk7IGkrKykKLQkJCQkJCWxpc3RlbmVycy5yZW1vdmUocmVtb3ZlZExpc3RlbmVycy5nZXQoaSkpOwotCQkJCQlyZW1vdmVkTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFMaXN0ZW5lciBmcm9tIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlTGlzdGVuZXIoV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJaWYgKGFMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlpZiAoaXNOb3RpZnlpbmcpCi0JCQkJcmV0dXJuIHJlbW92ZWRMaXN0ZW5lcnMuYWRkKGFMaXN0ZW5lcik7Ci0JCQlyZXR1cm4gZ2V0TGlzdGVuZXJzKCkucmVtb3ZlKGFMaXN0ZW5lcik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWxlYXNlQXJ0aWZhY3RFZGl0cygpIHsKLQkJc3luY2hyb25pemVkICh3c0FydGlmYWN0RWRpdHMpIHsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSB3c0FydGlmYWN0RWRpdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVdTRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJCWFydGlmYWN0RWRpdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJd3NBcnRpZmFjdEVkaXRzLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCXN5bmNocm9uaXplZCAod3NDbGllbnRBcnRpZmFjdEVkaXRzKSB7Ci0JCQlJdGVyYXRvciBpdGVyID0gd3NDbGllbnRBcnRpZmFjdEVkaXRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJCWFydGlmYWN0RWRpdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJd3NDbGllbnRBcnRpZmFjdEVkaXRzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJYWNjZXB0RGVsdGEoZXZlbnQpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0RGVsdGEoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkvLyBzZWFyY2ggZm9yIGNoYW5nZXMgdG8gYW55IHByb2plY3RzIHVzaW5nIGEgdmlzaXRvcgotCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWx0YS5hY2NlcHQodGhpcyk7Ci0JCQkJCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybnMgYSBsaXN0IG9mIGludGVybmFsIHdlYiBzZXJ2aWNlcyBkZXNjcmlwdGlvbnMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEludGVybmFsV2ViU2VydmljZXNEZXNjcmlwdGlvbnMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHdlYlNlcnZpY2VzID0gZ2V0SW50ZXJuYWxXZWJTZXJ2aWNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdlYlNlcnZpY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlID0gKFdlYlNlcnZpY2VzKSB3ZWJTZXJ2aWNlcy5nZXQoaSk7Ci0JCQlpZiAod2ViU2VydmljZSAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGRBbGwod2ViU2VydmljZS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbGwgaW50ZXJuYWwgd2ViIHNlcnZpY2VzIGluc3RhbmNlcyBpbiB3b3Jrc3BhY2UKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcm5hbFdlYlNlcnZpY2VzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGdldFdTQXJ0aWZhY3RFZGl0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NEREFydGlmYWN0RWRpdCkgaXRlci5uZXh0KCk7Ci0JCQlXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcyA9IGFydGlmYWN0RWRpdC5nZXRXZWJTZXJ2aWNlcygpOwotCQkJaWYgKHdlYlNlcnZpY2VzICE9IG51bGwpCi0JCQkJcmVzdWx0LmFkZCh3ZWJTZXJ2aWNlcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGludGVybmFsIHdzZGwgc2VydmljZXMgaW4gd3NkbCdzIHBvaW50ZWQgdG8gYnkgd3NkZCdzCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJuYWxXU0RMU2VydmljZXMoKSB7Ci0JCXJldHVybiBnZXRXU0RMU2VydmljZXNGcm9tV1NETFJlc291cmNlcyhnZXRJbnRlcm5hbFdTRExSZXNvdXJjZXMoKSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0SW50ZXJuYWxXU0RMUmVzb3VyY2VzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB3c2RkV2ViU2VydmljZXMgPSBnZXRJbnRlcm5hbFdlYlNlcnZpY2VzRGVzY3JpcHRpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3NkZFdlYlNlcnZpY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZXMgPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKSB3c2RkV2ViU2VydmljZXMuZ2V0KGkpOwotCQkJUmVzb3VyY2Ugd3NkbCA9IGdldFdTRExSZXNvdXJjZSh3ZWJTZXJ2aWNlcyk7Ci0JCQlpZiAod3NkbCAhPSBudWxsICYmICFyZXN1bHQuY29udGFpbnMod3NkbCkpCi0JCQkJcmVzdWx0LmFkZCh3c2RsKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRFeHRlcm5hbFdTRExSZXNvdXJjZXMoKSB7Ci0JCQkvL1RPRE8gZml4IHVwIGZvciBiYXNpcyBvZmYgLndzaWwKLQkJCUxpc3QgcmVzdWx0ID0gZ2V0V29ya3NwYWNlV1NETFJlc291cmNlcygpOwotCQkJcmVzdWx0LnJlbW92ZUFsbChnZXRJbnRlcm5hbFdTRExSZXNvdXJjZXMoKSk7Ci0JCQlMaXN0IHNlcnZpY2VSZWZzID0gZ2V0QWxsV29ya3NwYWNlU2VydmljZVJlZnMoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZXJ2aWNlUmVmcy5zaXplKCk7IGkrKykgewotCQkJCVNlcnZpY2VSZWYgcmVmID0gKFNlcnZpY2VSZWYpIHNlcnZpY2VSZWZzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQlSZXNvdXJjZSByZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShyZWYuZ2V0V3NkbEZpbGUoKSksIHRydWUpOwotCQkJCQlpZiAocmVzICE9bnVsbCAmJiByZXN1bHQuY29udGFpbnMocmVzKSkKLQkJCQkJCXJlc3VsdC5yZW1vdmUocmVzKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2aWNlSW50ZXJuYWwoRU9iamVjdCBzZXJ2aWNlKSB7Ci0JCXJldHVybiBnZXRJbnRlcm5hbFdTRExSZXNvdXJjZXMoKS5jb250YWlucyhnZXRXU0RMUmVzb3VyY2Uoc2VydmljZSkpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRXU0RMU2VydmljZXNGcm9tV1NETFJlc291cmNlcyhMaXN0IHdzZGxSZXNvdXJjZXMpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3NkbFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2Ugd3NkbCA9IChSZXNvdXJjZSkgd3NkbFJlc291cmNlcy5nZXQoaSk7Ci0JCQlMaXN0IHNlcnZpY2VzID0gZ2V0V1NETFNlcnZpY2VzKHdzZGwpOwotCQkJaWYgKHdzZGwgIT0gbnVsbCAmJiBzZXJ2aWNlcyAhPSBudWxsICYmICFzZXJ2aWNlcy5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbChzZXJ2aWNlcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFeHRlcm5hbFdTRExTZXJ2aWNlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBnZXRXc2RsU2VydmljZXNGcm9tV29ya3NwYWNlV1NJTHMoKTsKLQkJcmVzdWx0LnJlbW92ZUFsbChnZXRJbnRlcm5hbFdTRExTZXJ2aWNlcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXc2RsU2VydmljZXNGcm9tV29ya3NwYWNlV1NJTHMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHdzaWxGaWxlcyA9IGdldFdvcmtzcGFjZVdTSUxGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdzaWxGaWxlcy5zaXplKCk7IGkrKykgewotCQkJSUZpbGUgd3NpbCA9IChJRmlsZSkgd3NpbEZpbGVzLmdldChpKTsKLQkJCUxpc3Qgc2VydmljZXMgPSBnZXRXc2RsU2VydmljZXNGcm9tV3NpbEZpbGUod3NpbCk7Ci0JCQlpZiAoIXNlcnZpY2VzLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHNlcnZpY2VzKTsKLQkJfQotCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0V3NkbFNlcnZpY2VzRnJvbVdzaWxGaWxlKElGaWxlIHdzaWwpIHsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCXJldHVybiBzZXJ2aWNlSGVscGVyLmdldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZSh3c2lsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBXU0RMIFNlcnZpY2VzLCBib3RoIGludGVybmFsIGFuZCBleHRlcm5hbAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFsbFdTRExTZXJ2aWNlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0SW50ZXJuYWxXU0RMU2VydmljZXMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0RXh0ZXJuYWxXU0RMU2VydmljZXMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXJlbGVhc2VBcnRpZmFjdEVkaXRzKCk7Ci0JCUlOU1RBTkNFID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0V1NETFJlc291cmNlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlKSB7Ci0JCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHdzZGxGaWxlTmFtZSA9IHdlYlNlcnZpY2UuZ2V0V3NkbEZpbGUoKTsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUod2ViU2VydmljZSkpOwotCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmxlbmd0aD09MCkgcmV0dXJuIHJlczsKLQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBnZXRFeGlzdGluZ1dTRERBcnRpZmFjdEVkaXQocmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7Ci0JCWlmIChhcnRpZmFjdEVkaXQhPW51bGwpIAotCQkJcmVzID0gYXJ0aWZhY3RFZGl0LmdldFdzZGxSZXNvdXJjZSh3c2RsRmlsZU5hbWUpOwotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwcml2YXRlIFdTRERBcnRpZmFjdEVkaXQgZ2V0RXhpc3RpbmdXU0REQXJ0aWZhY3RFZGl0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCB3c0VkaXRzID0gZ2V0V1NBcnRpZmFjdEVkaXRzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx3c0VkaXRzLnNpemUoKTsgaSsrKSB7Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IGVkaXQgPSAoV1NEREFydGlmYWN0RWRpdCkgd3NFZGl0cy5nZXQoaSk7Ci0JCQlpZiAoZWRpdCAhPW51bGwgJiYgZWRpdC5nZXRQcm9qZWN0KCkhPSBudWxsICYmIGVkaXQuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQlyZXR1cm4gZWRpdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBXU0NEREFydGlmYWN0RWRpdCBnZXRFeGlzdGluZ1dTQ0REQXJ0aWZhY3RFZGl0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCB3c0NsaWVudEVkaXRzID0gZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx3c0NsaWVudEVkaXRzLnNpemUoKTsgaSsrKSB7Ci0JCQlXU0NEREFydGlmYWN0RWRpdCBlZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSB3c0NsaWVudEVkaXRzLmdldChpKTsKLQkJCWlmIChlZGl0ICE9bnVsbCAmJiBlZGl0LmdldFByb2plY3QoKSE9IG51bGwgJiYgZWRpdC5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQotCQkJCXJldHVybiBlZGl0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdTRExTZXJ2aWNlcyhSZXNvdXJjZSB3c2RsKSB7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0IGRlZiA9IHNlcnZpY2VIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbCk7Ci0JCWlmIChkZWYgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCXJlc3VsdCA9IG5ldyBBcnJheUxpc3Qoc2VydmljZUhlbHBlci5nZXREZWZpbml0aW9uU2VydmljZXMoZGVmKS52YWx1ZXMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0V1NETFNlcnZpY2VGb3JXZWJTZXJ2aWNlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlKSB7Ci0JCUVPYmplY3Qgc2VydmljZSA9IG51bGw7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlSZXNvdXJjZSB3c2RsID0gZ2V0V1NETFJlc291cmNlKHdlYlNlcnZpY2UpOwotCQlpZiAod3NkbCA9PSBudWxsKSByZXR1cm4gc2VydmljZTsKLQkJT2JqZWN0IGRlZmluaXRpb24gPSBzZXJ2aWNlSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHdzZGwpOwotCQlpZiAoZGVmaW5pdGlvbiA9PSBudWxsKSByZXR1cm4gc2VydmljZTsKLQkJTWFwIHNlcnZpY2VzID0gc2VydmljZUhlbHBlci5nZXREZWZpbml0aW9uU2VydmljZXMoZGVmaW5pdGlvbik7Ci0JCWlmIChzZXJ2aWNlcy5pc0VtcHR5KCkpIHJldHVybiBzZXJ2aWNlOwotCQlQb3J0Q29tcG9uZW50IHBvcnRDb21wID0gbnVsbDsKLQkJaWYgKHdlYlNlcnZpY2UuZ2V0UG9ydENvbXBvbmVudHMoKSE9bnVsbCAmJiB3ZWJTZXJ2aWNlLmdldFBvcnRDb21wb25lbnRzKCkuc2l6ZSgpPjApIHsKLQkJCXBvcnRDb21wID0gKFBvcnRDb21wb25lbnQpIHdlYlNlcnZpY2UuZ2V0UG9ydENvbXBvbmVudHMoKS5nZXQoMCk7Ci0JCQlyZXR1cm4gZ2V0U2VydmljZShwb3J0Q29tcCk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFdTRExSZXNvdXJjZShFT2JqZWN0IHdzZGxTZXJ2aWNlKSB7Ci0JCXJldHVybiB3c2RsU2VydmljZS5lUmVzb3VyY2UoKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRTZXJ2aWNlKFBvcnRDb21wb25lbnQgcG9ydCkgewotCQlMaXN0IHNlcnZpY2VzID0gZ2V0SW50ZXJuYWxXU0RMU2VydmljZXMoKTsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUVPYmplY3Qgc2VydmljZSA9IChFT2JqZWN0KXNlcnZpY2VzLmdldChpKTsKLQkJCWlmIChzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyhzZXJ2aWNlKS5zaXplKCkgPT0gMSkgewotCQkJCU9iamVjdCB3c2RsUG9ydCA9IHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZVBvcnRzKHNlcnZpY2UpLnZhbHVlcygpLnRvQXJyYXkoKVswXTsKLQkJCQlTdHJpbmcgcU5hbWUgPSBzZXJ2aWNlSGVscGVyLmdldFBvcnRCaW5kaW5nTmFtZXNwYWNlVVJJKHdzZGxQb3J0KTsKLQkJCQlpZiAocG9ydC5nZXRXc2RsUG9ydCgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhxTmFtZSkpCi0JCQkJCXJldHVybiBzZXJ2aWNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBQb3J0Q29tcG9uZW50IGdldFBvcnRDb21wb25lbnQoU3RyaW5nIHFOYW1lKSB7Ci0JCUxpc3Qgd3NEZXNjcyA9IGdldEludGVybmFsV2ViU2VydmljZXNEZXNjcmlwdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c0Rlc2NzLnNpemUoKTsgaSsrKSB7Ci0JCQlXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgd3NEZXNjcy5nZXQoaSk7Ci0JCQlMaXN0IHBvcnRzID0gd3NEZXNjLmdldFBvcnRDb21wb25lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBvcnRzLnNpemUoKTsgaisrKSB7Ci0JCQkJUG9ydENvbXBvbmVudCBwb3J0Q29tcCA9IChQb3J0Q29tcG9uZW50KSBwb3J0cy5nZXQoaik7Ci0JCQkJaWYgKHBvcnRDb21wLmdldFdzZGxQb3J0KCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHFOYW1lKSkKLQkJCQkJcmV0dXJuIHBvcnRDb21wOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBQb3J0Q29tcG9uZW50IGdldFBvcnRDb21wb25lbnQoU3RyaW5nIHFOYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3Qgd3NEZXNjcyA9IGdldEludGVybmFsV2ViU2VydmljZXNEZXNjcmlwdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c0Rlc2NzLnNpemUoKTsgaSsrKSB7Ci0JCQlXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgd3NEZXNjcy5nZXQoaSk7Ci0JCQlMaXN0IHBvcnRzID0gd3NEZXNjLmdldFBvcnRDb21wb25lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBvcnRzLnNpemUoKTsgaisrKSB7Ci0JCQkJUG9ydENvbXBvbmVudCBwb3J0Q29tcCA9IChQb3J0Q29tcG9uZW50KSBwb3J0cy5nZXQoaik7Ci0JCQkJaWYgKHByb2plY3QgPT0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHBvcnRDb21wKSkKLQkJCQkJcmV0dXJuIHBvcnRDb21wOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBQb3J0Q29tcG9uZW50IGdldFBvcnRDb21wb25lbnQoRU9iamVjdCB3c2RsU2VydmljZSkgewotCQkvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwb3J0IGluIHRoZSB3c2RsIHNlcnZpY2UsIGZpbmQgdGhlIG1hdGNoaW5nIHBvcnQgY29tcG9uZW50Ci0JCS8vIG90aGVyd2lzZSBpZiBtdWx0aXBsZSBwb3J0cyByZXR1cm4gbnVsbCBiZWNhdXNlIHdlIG5lZWQgbW9yZSBpbmZvcm1hdGlvbgotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJaWYgKHdzZGxTZXJ2aWNlID09IG51bGwgfHwgc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlUG9ydHMod3NkbFNlcnZpY2UpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlUG9ydHMod3NkbFNlcnZpY2UpLnNpemUoKSA+IDApIHsKLQkJCU9iamVjdCBwb3J0ID0gc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlUG9ydHMod3NkbFNlcnZpY2UpLnZhbHVlcygpLnRvQXJyYXkoKVswXTsKLQkJCVN0cmluZyBxTmFtZSA9IHNlcnZpY2VIZWxwZXIuZ2V0UG9ydEJpbmRpbmdOYW1lc3BhY2VVUkkocG9ydCk7Ci0JCQlyZXR1cm4gZ2V0UG9ydENvbXBvbmVudChxTmFtZSwgUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHdzZGxTZXJ2aWNlKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFNlcnZpY2VJbXBsQmVhbiBnZXRTZXJ2aWNlSW1wbEJlYW4oRU9iamVjdCB3c2RsU2VydmljZSkgewotCQlQb3J0Q29tcG9uZW50IHBvcnQgPSBnZXRQb3J0Q29tcG9uZW50KHdzZGxTZXJ2aWNlKTsKLQkJaWYgKHBvcnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcG9ydC5nZXRTZXJ2aWNlSW1wbEJlYW4oKTsKLQl9Ci0KLQlwdWJsaWMgV3NkZFJlc291cmNlIGdldFdzZGRSZXNvdXJjZShFT2JqZWN0IHdzZGxTZXJ2aWNlKSB7Ci0JCVBvcnRDb21wb25lbnQgcG9ydCA9IGdldFBvcnRDb21wb25lbnQod3NkbFNlcnZpY2UpOwotCQlpZiAocG9ydCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV3NkZFJlc291cmNlKSBwb3J0LmVSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKEVPYmplY3Qgd3NkbFNlcnZpY2UpIHsKLQkJUG9ydENvbXBvbmVudCBwb3J0ID0gZ2V0UG9ydENvbXBvbmVudCh3c2RsU2VydmljZSk7Ci0JCWlmIChwb3J0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBvcnQuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWxsV29ya3NwYWNlU2VydmljZVJlZnMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKGdldFdvcmtzcGFjZTEzU2VydmljZVJlZnMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0V29ya3NwYWNlMTRTZXJ2aWNlUmVmcygpKTsKLSAgICByZXN1bHQuYWRkQWxsKGdldFdvcmtzcGFjZUpFRTVTZXJ2aWNlUmVmcygpKTsgIC8vIE5ldywgaW5jbHVkZSBKRUUgNSBzZXJ2aWNlcyB0b28KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXb3Jrc3BhY2UxM1NlcnZpY2VSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJV1NDRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCVdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gYXJ0aWZhY3RFZGl0LmdldFdzY2RkWG1pUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKSAmJiByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChhcnRpZmFjdEVkaXQuZ2V0UHJvamVjdCgpKSkgewotCQkJCQlMaXN0IHNjb3BlZEJlYW5zID0gcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NvcGVkQmVhbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJQ29tcG9uZW50U2NvcGVkUmVmcyByZWZCZWFuID0gKENvbXBvbmVudFNjb3BlZFJlZnMpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCXJlc3VsdC5hZGRBbGwocmVmQmVhbi5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJCQkJfQotCQkJCX0gZWxzZQlyZXN1bHQuYWRkQWxsKHJlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpLmdldFNlcnZpY2VSZWZzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhJUHJvamVjdCBoYW5kbGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IHdzQ2xpZW50QXJ0aWZhY3RFZGl0ID0gZ2V0RXhpc3RpbmdXU0NEREFydGlmYWN0RWRpdChoYW5kbGUpOwotCQlpZiAod3NDbGllbnRBcnRpZmFjdEVkaXQgIT1udWxsKSB7Ci0JCQlXZWJTZXJ2aWNlc1Jlc291cmNlIHJlcyA9IHdzQ2xpZW50QXJ0aWZhY3RFZGl0LmdldFdzY2RkWG1pUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKSAmJiByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKSAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGRBbGwocmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXb3Jrc3BhY2UxNFNlcnZpY2VSZWZzKCkgewotCQlyZXR1cm4gZ2V0V29ya3NwYWNlMTRTZXJ2aWNlUmVmcyhnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKSk7Ci0JfQotICAKLSAgcHVibGljIExpc3QgZ2V0V29ya3NwYWNlSkVFNVNlcnZpY2VSZWZzKCkgewotICAgIHJldHVybiBnZXRXb3Jrc3BhY2VKRUU1U2VydmljZVJlZnMoZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkpOwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0V29ya3NwYWNlSkVFNVNlcnZpY2VSZWZzKExpc3Qgd3NDbGllbnRBcnRpZmFjdEVkaXRzKSB7Ci0gICAgcmV0dXJuIGdldFdvcmtzcGFjZVNlcnZpY2VSZWZzKHdzQ2xpZW50QXJ0aWZhY3RFZGl0cywgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCk7Ci0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0V29ya3NwYWNlMTRTZXJ2aWNlUmVmcyhMaXN0IHdzQ2xpZW50QXJ0aWZhY3RFZGl0cykgewotICAgICByZXR1cm4gZ2V0V29ya3NwYWNlU2VydmljZVJlZnMod3NDbGllbnRBcnRpZmFjdEVkaXRzLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBJbmNsdWRlIEpFRSA1IGFuZC9vciBKMkVFIDEuNCBzZXJ2aWNlIHJlZnMKLSAgICogQHBhcmFtIHdzQ2xpZW50QXJ0aWZhY3RFZGl0cwotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0V29ya3NwYWNlU2VydmljZVJlZnMoTGlzdCB3c0NsaWVudEFydGlmYWN0RWRpdHMsIGludCB0YXJnZXRKRUVMZXZlbCkgewotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3c0NsaWVudEFydGlmYWN0RWRpdHMuaXRlcmF0b3IoKTsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgIFdTQ0REQXJ0aWZhY3RFZGl0IHdzY0FydGlmYWN0RWRpdCA9IChXU0NEREFydGlmYWN0RWRpdCkgaXRlci5uZXh0KCk7Ci0gICAgICAKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSB3c2NBcnRpZmFjdEVkaXQuZ2V0UHJvamVjdCgpOyAgCi0gICAgICAKLSAgICAgIFN0cmluZyBwcm9qZWN0VHlwZSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VHlwZShwcm9qZWN0KTsKLSAgICAgIFN0cmluZyBwcm9qZWN0VmVyc2lvbiA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VmVyc2lvbihwcm9qZWN0KTsKLSAgICAgIGludCAgICBqMmVlTGV2ZWwgPSAgMDsKLSAgICAgIGlmKElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUuZXF1YWxzKHByb2plY3RUeXBlKSl7Ci0gICAgICAgIGoyZWVMZXZlbCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0RUpCVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRChwcm9qZWN0VmVyc2lvbik7Ci0gICAgICB9IGVsc2UgaWYoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRS5lcXVhbHMocHJvamVjdFR5cGUpKXsKLSAgICAgICAgajJlZUxldmVsID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRXZWJWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHByb2plY3RWZXJzaW9uKTsKLSAgICAgIH0gZWxzZSBpZihJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFLmVxdWFscyhwcm9qZWN0VHlwZSkpewotICAgICAgICBqMmVlTGV2ZWwgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydEFwcENsaWVudFZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQocHJvamVjdFZlcnNpb24pOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyB0aGlzIG1ldGhvZCBuZWVkcyB0byBjaGVjayB0aGF0IHByb2plY3QncyBqMmVlIGxldmVsIGlzIDE0Ci0gICAgICBpZihqMmVlTGV2ZWwgIT0gIHRhcmdldEpFRUxldmVsKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIAotICAgICAgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotICAgICAgdHJ5IHsKLSAgICAgICAgRU9iamVjdCByb290T2JqZWN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGFydGlmYWN0RWRpdCE9bnVsbCkKLSAgICAgICAgICByb290T2JqZWN0ID0gYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsKLSAgICAgICAgLy8gaGFuZGxlIEVKQiBwcm9qZWN0IGNhc2UKLSAgICAgICAgaWYgKHJvb3RPYmplY3QgaW5zdGFuY2VvZiBFSkJKYXIpIHsKLSAgICAgICAgICBMaXN0IGNtcHMgPSAoKEVKQkphcikgcm9vdE9iamVjdCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjbXBzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKSBjbXBzLmdldChqKTsKLSAgICAgICAgICAgIGlmIChiZWFuLmdldFNlcnZpY2VSZWZzKCkgIT0gbnVsbCAmJiAhYmVhbi5nZXRTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbChiZWFuLmdldFNlcnZpY2VSZWZzKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBoYW5kbGUgV2ViIFByb2plY3QKLSAgICAgICAgZWxzZSBpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIFdlYkFwcCkgewotICAgICAgICAgIGlmICgoKFdlYkFwcCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKSAhPSBudWxsICYmICEoKFdlYkFwcCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKCgoV2ViQXBwKSByb290T2JqZWN0KS5nZXRTZXJ2aWNlUmVmcygpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBoYW5kbGUgQXBwIGNsaWVudHMKLSAgICAgICAgZWxzZSBpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uQ2xpZW50KSB7Ci0gICAgICAgICAgaWYgKCgoQXBwbGljYXRpb25DbGllbnQpIHJvb3RPYmplY3QpLmdldFNlcnZpY2VSZWZzKCkgIT0gbnVsbCAmJiAhKChBcHBsaWNhdGlvbkNsaWVudCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIHJvb3RPYmplY3QpLmdldFNlcnZpY2VSZWZzKCkpOwotICAgICAgICB9Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICBpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpCi0gICAgICAgICAgYXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0JcHVibGljIGJvb2xlYW4gaXNKMkVFMTQoU2VydmljZVJlZiByZWYpIHsKLQkJcmV0dXJuICEocmVmLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VzQ2xpZW50KTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXb3Jrc3BhY2VXU0lMRmlsZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyID0gZ2V0V1NBcnRpZmFjdEVkaXRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCUxpc3QgZmlsZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V1NJTFJlc291cmNlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlcy5zaXplKCk7IGorKykgewotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGZpbGVzLmdldChqKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIFdTSUxfRVhULmVxdWFscyhmaWxlLmdldEZpbGVFeHRlbnNpb24oKSkpCi0JCQkJCXJlc3VsdC5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXb3Jrc3BhY2VXU0RMUmVzb3VyY2VzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGdldFdTQXJ0aWZhY3RFZGl0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NEREFydGlmYWN0RWRpdCkgaXRlci5uZXh0KCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gYXJ0aWZhY3RFZGl0LmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlMaXN0IHdzZGxSZXNvdXJjZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V1NETFJlc291cmNlcygpOwotCQkJCWlmICh3c2RsUmVzb3VyY2VzICE9IG51bGwgJiYgIXdzZGxSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgd3NkbFJlc291cmNlcy5zaXplKCk7IGorKykgewotCQkJCQkJUmVzb3VyY2Ugd3NkbCA9IChSZXNvdXJjZSkgd3NkbFJlc291cmNlcy5nZXQoaik7Ci0JCQkJCQlpZiAoIXJlc3VsdC5jb250YWlucyh3c2RsKSkKLQkJCQkJCQlyZXN1bHQuYWRkKHdzZGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0V1NETFNlcnZpY2VzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbnRlcm5hbFdzZGxzID0gZ2V0SW50ZXJuYWxXU0RMU2VydmljZXMoKTsKLQkJaWYgKGludGVybmFsV3NkbHMgIT0gbnVsbCAmJiAhaW50ZXJuYWxXc2Rscy5pc0VtcHR5KCkpCi0JCQlyZXN1bHQuYWRkQWxsKGludGVybmFsV3NkbHMpOwotCQkvL1RPRE8gYWRkIGV4dGVybmFscwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiZWFuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldDEzU2VydmljZVJlZnMoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShiZWFuKTsKLQkJaWYgKGZpbGUhPW51bGwpCi0JCQlhcnRpZmFjdEVkaXQgPSBnZXRFeGlzdGluZ1dTQ0REQXJ0aWZhY3RFZGl0KGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKGFydGlmYWN0RWRpdCAhPW51bGwpIHsKLQkJCVdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gYXJ0aWZhY3RFZGl0LmdldFdzY2RkWG1pUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGVqYk5hbWUgPSBiZWFuLmdldE5hbWUoKTsKLQkJCQlMaXN0IHNjb3BlcyA9IHJlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpLmdldENvbXBvbmVudFNjb3BlZFJlZnMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY29wZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUNvbXBvbmVudFNjb3BlZFJlZnMgc2NvcGUgPSAoQ29tcG9uZW50U2NvcGVkUmVmcykgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChzY29wZS5nZXRDb21wb25lbnROYW1lKCkuZXF1YWxzKGVqYk5hbWUpKQotCQkJCQkJcmV0dXJuIHNjb3BlLmdldFNlcnZpY2VSZWZzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbGllbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhBcHBsaWNhdGlvbkNsaWVudCBjbGllbnQpIHsKLQkJSVByb2plY3QgaGFuZGxlID0gZ2V0Q29tcG9uZW50UHJvamVjdChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKGNsaWVudCkpOwotCQlpZiAoaGFuZGxlID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJV1NDRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gZ2V0RXhpc3RpbmdXU0NEREFydGlmYWN0RWRpdChoYW5kbGUpOwotCQlpZiAoYXJ0aWZhY3RFZGl0ICE9bnVsbCkgewotCQkJV2ViU2VydmljZXNSZXNvdXJjZSByZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJV2ViU2VydmljZXNDbGllbnQgd2ViQ2xpZW50ID0gcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0JCQkJaWYgKHdlYkNsaWVudCAhPSBudWxsKQotCQkJCQlyZXR1cm4gd2ViQ2xpZW50LmdldFNlcnZpY2VSZWZzKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdlYmFwcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXQxM1NlcnZpY2VSZWZzKFdlYkFwcCB3ZWJhcHApIHsKLQkJSVByb2plY3QgaGFuZGxlID0gZ2V0Q29tcG9uZW50UHJvamVjdChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHdlYmFwcCkpOwotCQlpZiAoaGFuZGxlID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJV1NDRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gZ2V0RXhpc3RpbmdXU0NEREFydGlmYWN0RWRpdChoYW5kbGUpOwotCQlpZiAoYXJ0aWZhY3RFZGl0ICE9bnVsbCkgewotCQkJV2ViU2VydmljZXNSZXNvdXJjZSByZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJV2ViU2VydmljZXNDbGllbnQgd2ViQ2xpZW50ID0gcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0JCQkJaWYgKHdlYkNsaWVudCAhPSBudWxsKQotCQkJCQlyZXR1cm4gd2ViQ2xpZW50LmdldFNlcnZpY2VSZWZzKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJSVByb2plY3QgcCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkvLyBIYW5kbGUgcHJvamVjdCBhZGRzIGFuZCBwcm9qZWN0IG9wZW5zCi0JCQlpZiAoKGRlbHRhLmdldEtpbmQoKT09SVJlc291cmNlRGVsdGEuQURERUQgfHwgKCgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApICYmIHAuaXNBY2Nlc3NpYmxlKCkpKSkgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHApOwotCQkJCWlmIChjb21wb25lbnQhPW51bGwgJiYgIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwKSAmJiAhSjJFRVByb2plY3RVdGlsaXRpZXMuaXNTdGF0aWNXZWJQcm9qZWN0KHApKSB7Ci0JCQkJCWdldFF1ZXVlZEpvYigpLmFkZFByb2plY3QocCk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBIYW5kbGUgcHJvamVjdCBjbG9zZSBldmVudHMgYW5kIHJlbW92YWxzIAotCQkJZWxzZSBpZiAoKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICAmJiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwKSkKLQkJCQkJfHwgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSl7Ci0JCQkJcmVtb3ZlQXJ0aWZhY3RFZGl0KHApOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIGlzSW50ZXJyZXN0ZWRJbkZpbGUoKElGaWxlKSByZXNvdXJjZSkpIHsKLQkJCS8vIEhhbmRsZSBXU0lMIGFuZCBXU0RMIEZpbGUgYWRkaXRpb25zIGFzIHdlbGwgYXMgd2Vic2VydmljZS54bWwgYW5kIHdlYnNlcnZpY2VjbGllbnQueG1sCi0JCQlpZiAoKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkgfHwgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApKSB7Ci0JCQkJaWYgKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoV1NETF9FWFQpKQotCQkJCSAgICBhZGRlZFdzZGwoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0lMX0VYVCkpCi0JCQkJICAgIGFkZGVkV3NpbCgoSUZpbGUpcmVzb3VyY2UpOwotCQkJCWVsc2UgaWYgKHJlc291cmNlLmdldE5hbWUoKS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NIT1JUTkFNRSkgfHwKLQkJCQkJCXJlc291cmNlLmdldE5hbWUoKS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfRERfVVJJKSkgewotCQkJCQlnZXRRdWV1ZWRKb2IoKS5hZGRQcm9qZWN0KHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQkJfQkKLQkJCX0gCi0JCQkvLyBIYW5kbGUgV1NJTCBvciBXU0RMIGZpbGUgcmVtb3ZhbHMKLQkJCWVsc2UgaWYgKChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgfHwgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgIT0gMCkpIHsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0RMX0VYVCkgfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0lMX0VYVCkpCi0JCQkJbm90aWZ5TGlzdGVuZXJzKEVkaXRNb2RlbEV2ZW50LlVOTE9BREVEX1JFU09VUkNFKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3NQcm9qZWN0c1dpdGhXU0RMIGNyZWF0ZVByb2plY3RzSm9iKCkgewotCQlTZXQgbmV3U2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJUHJvY2Vzc1Byb2plY3RzV2l0aFdTREwgam9iID0gbmV3IFByb2Nlc3NQcm9qZWN0c1dpdGhXU0RMKG5ld1NldCwgRWRpdE1vZGVsRXZlbnQuQURERURfUkVTT1VSQ0UpOwotCQlqb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJam9iLnNldFN5c3RlbSh0cnVlKTsKLQkJcmV0dXJuIGpvYjsKLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3NQcm9qZWN0c1dpdGhXU0RMIGdldFF1ZXVlZEpvYigpIHsKLQkJCi0JCWlmIChwcm9jZXNzTmV3UHJvamVjdHMgIT0gbnVsbCAmJiAocHJvY2Vzc05ld1Byb2plY3RzLmdldFN0YXRlKCkgPT0gSm9iLldBSVRJTkcpKXsKLQkJCXJldHVybiBwcm9jZXNzTmV3UHJvamVjdHM7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9jZXNzTmV3UHJvamVjdHMgPSBjcmVhdGVQcm9qZWN0c0pvYigpOwotCQkJcHJvY2Vzc05ld1Byb2plY3RzLnNjaGVkdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NOZXdQcm9qZWN0czsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzUHJvamVjdHNXaXRoV1NETCBleHRlbmRzIEpvYgotCXsKLQkJcHJpdmF0ZSBTZXQgY3VycmVudFByb2plY3RzOwotCQlwcml2YXRlIGludCBldmVudFR5cGU7Ci0JCQotCQlwdWJsaWMgUHJvY2Vzc1Byb2plY3RzV2l0aFdTREwoU2V0IHAsIGludCBuZXdFdmVudFR5cGUpCi0JCXsKLQkJCXN1cGVyKCJMb2FkaW5nIGFydGlmYWN0IGVkaXQgZm9yIHByb2plY3QiKTsKLQkJCWN1cnJlbnRQcm9qZWN0cyA9IHA7Ci0JCQlldmVudFR5cGUgPSBuZXdFdmVudFR5cGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZFByb2plY3QoSVByb2plY3QgcCkgewotCQkJc3luY2hyb25pemVkKGN1cnJlbnRQcm9qZWN0cykgewotCQkJCWN1cnJlbnRQcm9qZWN0cy5hZGQocCk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkvLyBOdWxsIG91dCBqb2IgZm9yIHByb2Nlc3NpbmcgbmV3IHByb2plY3RzCi0JCQlzeW5jaHJvbml6ZWQgKHByb2Nlc3NOZXdQcm9qZWN0cykgewotCQkJCWlmKHByb2Nlc3NOZXdQcm9qZWN0cyA9PSB0aGlzKXsKLQkJCQkJcHJvY2Vzc05ld1Byb2plY3RzID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY3VycmVudFByb2plY3RzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlJUHJvamVjdCBjdXJyZW50UHJvamVjdCA9IChJUHJvamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWFkZEFydGlmYWN0RWRpdChjdXJyZW50UHJvamVjdCk7Ci0JCQl9Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnRUeXBlKTsKLQkJCQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRlZFdzZGwoSUZpbGUgd3NkbCkgewotCQlpZiAoIXdzZGwuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCUlQcm9qZWN0IGhhbmRsZSA9IGdldENvbXBvbmVudFByb2plY3Qod3NkbCk7Ci0JCWlmIChoYW5kbGUgIT0gbnVsbCkgewotCQkJYWRkQXJ0aWZhY3RFZGl0KGhhbmRsZSk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoRWRpdE1vZGVsRXZlbnQuTE9BREVEX1JFU09VUkNFKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZGVkV3NpbChJRmlsZSB3c2lsKSB7Ci0JCWlmICghd3NpbC5leGlzdHMoKSkKLQkJCXJldHVybjsKLQkJSVByb2plY3QgaGFuZGxlID0gZ2V0Q29tcG9uZW50UHJvamVjdCh3c2lsKTsKLQkJaWYgKGhhbmRsZSAhPSBudWxsKSB7Ci0JCQlhZGRBcnRpZmFjdEVkaXQoaGFuZGxlKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhFZGl0TW9kZWxFdmVudC5MT0FERURfUkVTT1VSQ0UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSVByb2plY3QgZ2V0Q29tcG9uZW50UHJvamVjdChJRmlsZSByZXMpIHsKLQkJaWYgKHJlcz09bnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVzLmdldFByb2plY3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5GaWxlKElGaWxlIGFGaWxlKSB7Ci0JCXJldHVybiBpc0ZpbGVJbnRlcmVzdGluZyhhRmlsZSk7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBvbmx5IHJlc291cmNlcyB3ZWJzZXJ2aWNlIG1hbmFnZXIgaXMgY29uY2VybmVkIGFib3V0IGFyZToKLQkgKiB3ZWJzZXJ2aWNlLnhtbCwgd2Vic2VydmljZWNsaWVudC54bWwsIGFuZCBKMkVFIDEuNCB3ZWIueG1sLCBlamItamFyLXhtbCwgYW5kIGFwcGxpY2F0aW9uLWNsaWVudC54bWwKLQkgKiBAcGFyYW0gcmVzCi0JICogQHJldHVybiBib29sZWFuIGlzSW50ZXJlc3RlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ludGVyZXN0ZWRJblJlc291cmNlKFJlc291cmNlIHJlcykgewotCQlpZiAocmVzIGluc3RhbmNlb2YgV3NkZFJlc291cmNlIHx8IHJlcyBpbnN0YW5jZW9mIFdlYlNlcnZpY2VzUmVzb3VyY2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIEVKQlJlc291cmNlIHx8IHJlcyBpbnN0YW5jZW9mIFdlYkFwcFJlc291cmNlIHx8IHJlcyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpIHsKLQkJCXJldHVybiAoKFhNTFJlc291cmNlKXJlcykuZ2V0SjJFRVZlcnNpb25JRCgpPkoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRTZXJ2aWNlUmVmcyhFSkJKYXIgamFyKSB7Ci0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGJlYW5zID0gamFyLmdldEVudGVycHJpc2VCZWFucygpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiZWFucy5zaXplKCk7IGkrKykgewotCQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGJlYW5zLmdldChpKTsKLQkJCQlsaXN0LmFkZEFsbChnZXRTZXJ2aWNlUmVmcyhiZWFuKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFNlcnZpY2VSZWZzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYmVhbi5nZXRFamJKYXIoKS5nZXRKMkVFVmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpCi0JCQlsaXN0LmFkZEFsbChiZWFuLmdldFNlcnZpY2VSZWZzKCkpOwotCQllbHNlCi0JCQlsaXN0LmFkZEFsbChnZXQxM1NlcnZpY2VSZWZzKGJlYW4pKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0U2VydmljZVJlZnMoV2ViQXBwIHdlYmFwcCkgewotCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWlmICh3ZWJhcHAuZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRCkKLQkJCQlsaXN0LmFkZEFsbCh3ZWJhcHAuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQllbHNlCi0JCQkJbGlzdC5hZGRBbGwoZ2V0MTNTZXJ2aWNlUmVmcyh3ZWJhcHApKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0U2VydmljZVJlZnMoQXBwbGljYXRpb25DbGllbnQgY2xpZW50KSB7Ci0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJaWYgKGNsaWVudC5nZXRKMkVFVmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpCi0JCQkJbGlzdC5hZGRBbGwoY2xpZW50LmdldFNlcnZpY2VSZWZzKCkpOwotCQkJZWxzZQotCQkJCWxpc3QuYWRkQWxsKGdldDEzU2VydmljZVJlZnMoY2xpZW50KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmNDMzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3BsdWdpbi9XZWJTZXJ2aWNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyOCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUGx1Z2luIGV4dGVuZHMgV1RQUGx1Z2luIGltcGxlbWVudHMgUmVzb3VyY2VMb2NhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VQbHVnaW4gc2luZ2xldG9uOwotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQkJc2luZ2xldG9uID0gdGhpczsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbiNnZXRQbHVnaW5JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIFBMVUdJTl9JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCByZXNvdXJjZSBhcyByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGluc3RhbGwKLQkgKiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGltYWdlIGRlc2NyaXB0b3IsIHBvc3NpYmx5IG51bGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJVVJMIGltYWdlVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBuYW1lKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4gRXF1aXZhbGVudCB0byBjYWxsaW5nCi0JICogKEFUS1VJUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigiY29tLmlibS5ldG9vbHMud2Vic2VydmljZS5hdGsudWkiKTsKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBBVEtVSVBsdWdpbiBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBXZWJTZXJ2aWNlUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvcgotCSAqIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluCi0JICogICAgICAgICAgICBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIiB3aGVyZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlCi0JICogICAgICAgICAgICBmb3JtOiAiS0VZID0gdmFsdWUiLgotCSAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKSwga2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IKLQkgKiB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlLiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZyBhcmUgcmVwbGFjZWQgYnkgdGhlCi0JICogZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZQotCSAqIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGZvciBmdXJ0aGVyIGRldGFpbHMgb24gc3Vic3RpdHV0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbgotCSAqICAgICAgICAgICAgbXVzdCBiZSBvZiB0aGUgZm9ybSAiJUtFWSIgd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotCSAqICAgICAgICAgICAgZm9ybTogIktFWSA9IHZhbHVlIi4KLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgVGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIGFzIHJlcXVpcmVkIGJ5IHRoZSBtZXNzYWdlIGluCi0JICogICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyBhbmQgYnkgdGhlIHJ1bGVzIG9mIGNsYXNzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LgotCSAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0TWVzc2FnZShrZXkpLCBhcmdzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTCBmcm9tIHdoaWNoIGFsbCByZXNvdXJjZXMgYXJlIGJhc2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVSTCBmcm9tIHdoaWNoIGFsbCByZXNvdXJjZXMgYXJlIGJhc2VkLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0QmFzZVVSTCgpIHsKLQkJU3RyaW5nIGluc3RhbGxVUkwgPSBnZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKTsKLQkJaWYgKGluc3RhbGxVUkwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGluc3RhbGxVUkwpOwotCQkJCXNiLmFwcGVuZCgicGx1Z2luLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgVVJMKHNiLnRvU3RyaW5nKCkpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICoga2V5LiBUaGUgZGVzY3JpcHRpb24gd2lsbCB0eXBpY2FsbHkgYmUgaW4gdGhlIGZvcm0gb2YgYSBVUkwgdG8gdGhlIGltYWdlIGRhdGEuIENyZWF0aW9uIG9mIGFuCi0JICogYWN0dWFsIGltYWdlIGRlcGVuZHMgb24gdGhlIEdVSSBlbnZpcm9ubWVudDsgd2l0aGluIEVjbGlwc2UsCi0JICogb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5IGNhbiBiZSB1c2VkLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIGltYWdlIHJlc291cmNlLgotCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG9uIHRoZSBpbWFnZSByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihrZXkpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldFBsdWdpblN0YXRlTG9jYXRpb24odGhpcykuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS50b09TU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUGxhdGZvcm0ucmVzb2x2ZShnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpLmdldEZpbGUoKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgc3RyaW5nIHJlc291cmNlLgotCSAqIEByZXR1cm4gdGhlIHN0cmluZyByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRNZXNzYWdlKGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSwgYW5kIHBlZm9ybXMgc3Vic3RpdHV0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBzdHJpbmcuCi0JICogQHBhcmFtIHN1YnN0aXR1dGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHN1YnN0aXR1dGlvbnMuCi0JICogQHJldHVybiBhIHN0cmluZyByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KLQkgKiBAc2VlICNnZXRTdHJpbmcoU3RyaW5nKQotCSAqIEBzZWUgTWVzc2FnZUZvcm1hdCNmb3JtYXQoU3RyaW5nLCBPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBzdWJzdGl0dXRpb25zKSB7Ci0JCXJldHVybiBnZXRNZXNzYWdlKGtleSwgc3Vic3RpdHV0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgZmlyc3QgbG9hZGVkLgotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoaXMgcGx1Z2luIGZhaWxzIHRvIHN0YXJ0LgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBvbmNlIGJ5IHRoZSBwbGF0Zm9ybSB3aGVuIHRoaXMgcGx1Z2luIGlzIHVubG9hZGVkLgotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoaXMgcGx1Z2luIGZhaWxzIHRvIHNodXRkb3duLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgYm9vbGVhbiB0cmFuc2xhdGUpIHsKLQkJLy8gVE9ETyBGb3Igbm93Li4uICB0cmFuc2xhdGUgbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gc3Vic3RpdHV0aW9ucywgYm9vbGVhbiB0cmFuc2xhdGUpIHsKLQkJLy8gVE9ETyBGb3Igbm93Li4uICB0cmFuc2xhdGUgbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSxzdWJzdGl0dXRpb25zKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBSZWNvcmQgYW4gZXJyb3IgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGFuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLAotCQkJVGhyb3dhYmxlIGFuRXhjZXB0aW9uKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKAotCQkJCWNyZWF0ZUVycm9yU3RhdHVzKGFDb2RlLCBhTWVzc2FnZSwgYW5FeGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBtZXNzYWdlIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IGFDb2RlLCBTdHJpbmcgYU1lc3NhZ2UsCi0JCQlUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWxvZyhjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmVjb3JkIGEgc3RhdHVzIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBhU3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIGFTdGF0dXMpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coYVN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBsdWdpbi4KLQkgKiAgCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gQSBzdGF0dXMgY29uZmlndXJlZCB3aXRoIHRoaXMgcGx1Z2luJ3MgaWQgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsCi0JCQlTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgYUNvZGUsCi0JCQkJYU1lc3NhZ2UgIT0gbnVsbCA/IGFNZXNzYWdlIDogIk5vIG1lc3NhZ2UuIiwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIEEgc3RhdHVzIGNvbmZpZ3VyZWQgd2l0aCB0aGlzIHBsdWdpbidzIGlkIGFuZCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3JTdGF0dXMoaW50IGFDb2RlLCBTdHJpbmcgYU1lc3NhZ2UsCi0JCQlUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4M2Y5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3Rvcmllc187Ci0KLQlwdWJsaWMgQVRLVUlBZGFwdGVyRmFjdG9yeSgpIHsKLQkJYWRhcHRlckZhY3Rvcmllc18gPSBuZXcgQWRhcHRlckZhY3RvcnlbNF07Ci0JCWFkYXB0ZXJGYWN0b3JpZXNfWzBdID0gbmV3IFdzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQlhZGFwdGVyRmFjdG9yaWVzX1sxXSA9IG5ldyBBVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkoKTsKLQkJYWRhcHRlckZhY3Rvcmllc19bMl0gPSBuZXcgQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWFkYXB0ZXJGYWN0b3JpZXNfWzNdID0gbmV3IEFUS1VJQ29tbW9uQWRhcHRlckZhY3RvcnkoKTsKLQotCX0KLQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm90aWZpZXIpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckZhY3Rvcmllc18ubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gYWRhcHRlckZhY3Rvcmllc19baV0uYWRhcHQodGFyZ2V0LCB0eXBlKTsKLQkJCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG9iamVjdDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZSh0YXJnZXQsIHR5cGUpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQkJT2JqZWN0IG9iamVjdCA9IGFkYXB0KChPYmplY3QpIHRhcmdldCwgdHlwZSk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKSB7Ci0JCQlyZXR1cm4gKEFkYXB0ZXIpIG9iamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB7QGxpbmsgI2FkYXB0KE9iamVjdCxPYmplY3QpIGFkYXB0KE9iamVjdCwgT2JqZWN0KX1mb3Igb2JqZWN0cyB0aGF0IGFyZW4ndAotCSAqIG5vdGlmaWVycy4KLQkgKiAKLQkgKiBAcGFyYW0gYW4KLQkgKiAgICAgICAgICAgIGFyYml0cmFyeSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBrZXkgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBhZGFwdGVyIHJlcXVpcmVkLgotCSAqIEByZXR1cm4gdGhlIG9iamVjdCBpdHNlbGYuCi0JICogQHNlZSAjYWRhcHQoT2JqZWN0LE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlc29sdmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIHJlc29sdmVFTGlzdCgoRUxpc3QpIG9iamVjdCwgdHlwZSk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIHJlc29sdmVBZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCwgdHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IHJlc29sdmVFTGlzdChFTGlzdCBlTGlzdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGVMaXN0LnNpemUoKSA+IDApCi0JCQlyZXR1cm4gYWRhcHQoZUxpc3QuZ2V0KDApLCB0eXBlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gcmVzb2x2ZUVMaXN0KGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCksIHR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJKChXc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3JpZXNfWzBdKS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCSgoQVRLVUlXc2NkZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yaWVzX1sxXSkuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQkoKEFUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3Rvcmllc19bMl0pLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJKChBVEtVSUNvbW1vbkFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yaWVzX1szXSkuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQ29tbW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmFkMWFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJQ29tbW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIEFUS1VJQ29tbW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFyYW1WYWx1ZUFkYXB0ZXIoKSB7Ci0JCWlmIChwYXJhbVZhbHVlSXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQlwYXJhbVZhbHVlSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQotCQlyZXR1cm4gcGFyYW1WYWx1ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVRTmFtZUFkYXB0ZXIoKSB7Ci0JCWlmIChxTmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlxTmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVFOYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHFOYW1lSXRlbVByb3ZpZGVyOwotCX0KLQotCi0JLyoKLQkgKiBwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQSGVhZGVyQWRhcHRlcigpIHsgaWYgKHNvYXBIZWFkZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkgKiBzb2FwSGVhZGVySXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlcih0aGlzKTsgcmV0dXJuCi0JICogc29hcEhlYWRlckl0ZW1Qcm92aWRlcjsgfQotCSAqIAotCSAqIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBSb2xlQWRhcHRlcigpIHsgaWYgKHNvYXBSb2xlSXRlbVByb3ZpZGVyID09IG51bGwpCi0JICogc29hcFJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsgcmV0dXJuIHNvYXBSb2xlSXRlbVByb3ZpZGVyOyB9Ci0JICogCi0JICogcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydE5hbWVBZGFwdGVyKCkgeyBpZiAocG9ydE5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkgKiBwb3J0TmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVBvcnROYW1lSXRlbVByb3ZpZGVyKHRoaXMpOyByZXR1cm4gcG9ydE5hbWVJdGVtUHJvdmlkZXI7IH0KLQkgKiAgCi0JICovCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxM2YzNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSUNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSUNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIChzICE9IG51bGwpID8gcyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoKChDb21wb25lbnRTY29wZWRSZWZzKSBvYmplY3QpLmdldENvbXBvbmVudE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlIYW5kbGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMmYzMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlIYW5kbGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgSGFuZGxlckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlIYW5kbGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKCgoSGFuZGxlcikgb2JqZWN0KS5nZXRIYW5kbGVyTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBqYXZhQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJcmV0dXJuIChjbGFzc05hbWUgIT0gbnVsbCkgPyBjbGFzc05hbWUgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjBjNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUluaXRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyIGV4dGVuZHMgSW5pdFBhcmFtSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSUluaXRQYXJhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCUluaXRQYXJhbSBpbml0UGFyYW0gPSAoSW5pdFBhcmFtKSBvYmplY3Q7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhpbml0UGFyYW0uZ2V0UGFyYW1OYW1lKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXRQYXJhbVZhbHVlKCkpOwotCQkJY2FzZSAyIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXREZXNjcmlwdGlvbigpKTsKLQkJCWRlZmF1bHQgOgotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlzYi5hcHBlbmQoaW5pdFBhcmFtLmdldFBhcmFtTmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIj0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZChpbml0UGFyYW0uZ2V0UGFyYW1WYWx1ZSgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBhcmFtVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjNDUwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlBhcmFtVmFsdWVJdGVtUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBBVEtVSVBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQYXJhbVZhbHVlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSVBhcmFtVmFsdWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlQYXJhbVZhbHVlIGluaXRQYXJhbSA9IChQYXJhbVZhbHVlKSBvYmplY3Q7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhpbml0UGFyYW0uZ2V0TmFtZSgpKTsKLQkJCWNhc2UgMSA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhpbml0UGFyYW0uZ2V0VmFsdWUoKSk7Ci0JCQljYXNlIDIgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoaW5pdFBhcmFtLmdldERlc2NyaXB0aW9uKCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXNiLmFwcGVuZChpbml0UGFyYW0uZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIj0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZChpbml0UGFyYW0uZ2V0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMWVmMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIFBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVBvcnRDb21wb25lbnRSZWYgcG9ydENvbXBSZWYgPSAoUG9ydENvbXBvbmVudFJlZikgb2JqZWN0OwotCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQljYXNlIDAgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcocG9ydENvbXBSZWYuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHBvcnRDb21wUmVmLmdldFBvcnRDb21wb25lbnRMaW5rKCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhwb3J0Q29tcFJlZi5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBqYXZhQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJcmV0dXJuIChjbGFzc05hbWUgIT0gbnVsbCkgPyBjbGFzc05hbWUgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlQb3J0TmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnROYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZWFiMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnROYW1lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSVBvcnROYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgUG9ydE5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlQb3J0TmFtZSBwb3J0TmFtZSA9IChQb3J0TmFtZSkgb2JqZWN0OwotCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHBvcnROYW1lLmdldFBvcnROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUU5hbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlRTmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjM4MzlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlRTmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlRTmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSVFOYW1lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJUU5hbWUgcW5hbWUgPSAoUU5hbWUpIG9iamVjdDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJCWNhc2UgMSA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJc2IuYXBwZW5kKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJCQlzYi5hcHBlbmQoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZChxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDk3NTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLQotCi0KLQotcHVibGljIGNsYXNzIEFUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlciBleHRlbmRzIFNPQVBIZWFkZXJJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVNPQVBIZWFkZXIgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKSBvYmplY3Q7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJCWNhc2UgMSA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhzb2FwSGVhZGVyLmdldExvY2FsUGFydCgpKTsKLQkJCWRlZmF1bHQgOgotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlzYi5hcHBlbmQoc29hcEhlYWRlci5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCQkJc2IuYXBwZW5kKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzYi5hcHBlbmQoc29hcEhlYWRlci5nZXRMb2NhbFBhcnQoKSk7Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNPQVBSb2xlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyM2QyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTT0FQUm9sZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVNPQVBSb2xlIHNvYXBSb2xlID0gKFNPQVBSb2xlKSBvYmplY3Q7Ci0JCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoc29hcFJvbGUuZ2V0U29hcFJvbGUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU2VydmljZVJlZkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE0YTdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJU2VydmljZVJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIFNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJU2VydmljZVJlZkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZygoKFNlcnZpY2VSZWYpIG9iamVjdCkuZ2V0U2VydmljZVJlZk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIChzICE9IG51bGwpID8gcyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoSmF2YUNsYXNzIGphdmFDbGFzcykgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gamF2YUNsYXNzLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCXJldHVybiAoY2xhc3NOYW1lICE9IG51bGwpID8gY2xhc3NOYW1lIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxZjFhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJZmVhdHVyZSA9IFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuZ2V0V2Vic2VydmljZV9jbGllbnRQYWNrYWdlKCkuZ2V0V2ViU2VydmljZXNDbGllbnRfQ29tcG9uZW50U2NvcGVkUmVmcygpOwotCQlpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLmdldE5hbWUoKSkpCi0JCQlyZXN1bHQuYWRkKFNlY3Rpb25Db21wb25lbnRTY29wZWRSZWZIZWxwZXIuZ2V0V3NDbGllbnQoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdlYlNlcnZpY2VzQ2xpZW50LmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1VOUVVBTElGSUVEX0NPTVBPTkVOVCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXc2NkZEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4N2Q5ZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFdlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyBBVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViU2VydmljZXNDbGllbnRBZGFwdGVyKCkgewotCQlpZiAod2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb25lbnRTY29wZWRSZWZzQWRhcHRlcigpIHsKLQkJaWYgKGNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0Q29tcG9uZW50UmVmQWRhcHRlcigpIHsKLQkJaWYgKHBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NjbGllbnQudXRpbC5XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlUmVmQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gc2VydmljZVJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NjbGllbnQudXRpbC5XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUhhbmRsZXJBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIYW5kbGVyQWRhcHRlcigpIHsKLQkJaWYgKGhhbmRsZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWhhbmRsZXJJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlIYW5kbGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gaGFuZGxlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdzY29tbW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2Zjk0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIEFUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIFdzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyBBVEtVSVdzY29tbW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5pdFBhcmFtQWRhcHRlcigpIHsKLQkJaWYgKGluaXRQYXJhbUl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJaW5pdFBhcmFtSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gaW5pdFBhcmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJBZGFwdGVyKCkgewotCQlpZiAoc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVNPQVBIZWFkZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBzb2FwSGVhZGVySXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBSb2xlQWRhcHRlcigpIHsKLQkJaWYgKHNvYXBSb2xlSXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQlzb2FwUm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVNPQVBSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gc29hcFJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydE5hbWVBZGFwdGVyKCkgewotCQlpZiAocG9ydE5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXBvcnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBwb3J0TmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Fic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2MGNmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Fic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci0KLQotLy8gTm9uLWdlbmVyYXRlZCBwcm92aWRlciBjb2RlCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciB7Ci0JcHVibGljIEFic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBhZGFwdGVyJ3MgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIChzICE9IG51bGwpID8gcyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9CZWFuTGlua0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9CZWFuTGlua0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGMwNDg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQmVhbkxpbmtJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5CZWFuTGlua31vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmVhbkxpbmtJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJlYW5MaW5rSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQmVhbkxpbmsuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9CZWFuTGluayIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyByZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQmVhbkxpbmtfdHlwZSIpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiJV9VSV9CZWFuTGlua190eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Db21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlMjEzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnN9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZENvbXBvbmVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbXBvbmVudCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0NvbXBvbmVudFNjb3BlZFJlZnNfY29tcG9uZW50TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db21wb25lbnRTY29wZWRSZWZzX2NvbXBvbmVudE5hbWVfZmVhdHVyZSIsICJfVUlfQ29tcG9uZW50U2NvcGVkUmVmc190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudFNjb3BlZFJlZnNfU2VydmljZVJlZnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb21wb25lbnRTY29wZWRSZWZzLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvQ29tcG9uZW50U2NvcGVkUmVmcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKENvbXBvbmVudFNjb3BlZFJlZnMpb2JqZWN0KS5nZXRDb21wb25lbnROYW1lKCk7IHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCSAqIGdldFN0cmluZygiX1VJX0NvbXBvbmVudFNjb3BlZFJlZnNfdHlwZSIpIDogZ2V0U3RyaW5nKCJfVUlfQ29tcG9uZW50U2NvcGVkUmVmc190eXBlIikgKyAiICIgKwotCSAqIGxhYmVsOyB9Ci0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29tcG9uZW50U2NvcGVkUmVmcykgb2JqZWN0KS5nZXRDb21wb25lbnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfQ29tcG9uZW50U2NvcGVkUmVmc190eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbXBvbmVudFNjb3BlZFJlZnMuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fU0VSVklDRV9SRUZTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19TZXJ2aWNlUmVmcygpLCBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VSZWYoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNTZmNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcn1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9pZF9mZWF0dXJlIiwgIl9VSV9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9FbGVtZW50TmFtZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcikgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fRUxFTUVOVF9OQU1FUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0VsZW1lbnROYW1lcygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbGVtZW50TmFtZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Rlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjM0ZTZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZX1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVzY3JpcHRpb25UeXBlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVzY3JpcHRpb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaXB0aW9uVHlwZSkgb2JqZWN0KS5nZXRMYW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdGlvblR5cGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdGlvblR5cGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9EaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNzZhZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9EaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5EaXNwbGF5TmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaXNwbGF5TmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaXNwbGF5TmFtZVR5cGUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EaXNwbGF5TmFtZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlzcGxheU5hbWVUeXBlKSBvYmplY3QpLmdldExhbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rpc3BsYXlOYW1lVHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0Rpc3BsYXlOYW1lVHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0VKQkxpbmtJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRUpCTGlua0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2ZiNmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRUpCTGlua0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rfW9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJMaW5rSXRlbVByb3ZpZGVyIGV4dGVuZHMgQmVhbkxpbmtJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUpCTGlua0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRFamJMaW5rUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9FSkJMaW5rX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX0VKQkxpbmtfaWRfZmVhdHVyZSIsICJfVUlfRUpCTGlua190eXBlIiksIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJMaW5rX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFamIgTGluayBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFamJMaW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FSkJMaW5rX2VqYkxpbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRUpCTGlua19lamJMaW5rX2ZlYXR1cmUiLCAiX1VJX0VKQkxpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCTGlua19FamJMaW5rKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEVKQkxpbmsuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L3Nlc3Npb25CZWFuX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChFSkJMaW5rKW9iamVjdCkuZ2V0SWQoKTsgcmV0dXJuIGxhYmVsID09Ci0JICogbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRUpCTGlua190eXBlIikgOiBnZXRTdHJpbmcoIl9VSV9FSkJMaW5rX3R5cGUiKSArICIgIiArCi0JICogbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEVKQkxpbmspIG9iamVjdCkuZ2V0RWpiTGluaygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX0VKQkxpbmtfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRUpCTGluay5jbGFzcykpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuRUpCX0xJTktfX0VKQl9MSU5LIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FbGVtZW50TmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FbGVtZW50TmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjI5ZTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRWxlbWVudE5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudE5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRleHRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FbGVtZW50TmFtZV9pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbGVtZW50TmFtZV9pZF9mZWF0dXJlIiwgIl9VSV9FbGVtZW50TmFtZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEVsZW1lbnROYW1lX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZXh0IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0VsZW1lbnROYW1lX3RleHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxlbWVudE5hbWVfdGV4dF9mZWF0dXJlIiwgIl9VSV9FbGVtZW50TmFtZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEVsZW1lbnROYW1lX1RleHQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRWxlbWVudE5hbWUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9FbGVtZW50TmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFbGVtZW50TmFtZSkgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRWxlbWVudE5hbWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9FbGVtZW50TmFtZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEVsZW1lbnROYW1lLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fVEVYVCA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FeGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0V4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiYjNhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0V4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFeGNlcHRpb25UeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRXhjZXB0aW9uTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FeGNlcHRpb25NYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeGNlcHRpb24gVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGNlcHRpb25UeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FeGNlcHRpb25NYXBwaW5nX2V4Y2VwdGlvblR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRXhjZXB0aW9uTWFwcGluZ19leGNlcHRpb25UeXBlX2ZlYXR1cmUiLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0V4Y2VwdGlvblR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgTWVzc2FnZSBQYXJ0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRXhjZXB0aW9uTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfd3NkbE1lc3NhZ2VQYXJ0TmFtZV9mZWF0dXJlIiwgIl9VSV9FeGNlcHRpb25NYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFeGNlcHRpb25NYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRXhjZXB0aW9uTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFeGNlcHRpb25NYXBwaW5nKSBvYmplY3QpLmdldFdzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9FeGNlcHRpb25NYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRXhjZXB0aW9uTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19FWENFUFRJT05fVFlQRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0UgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMTWVzc2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0hhbmRsZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWM1NWE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LkhhbmRsZXJ9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIYW5kbGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEhhbmRsZXJOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTb2FwUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBvcnROYW1lc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSGFuZGxlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIYW5kbGVyIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFuZGxlck5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9IYW5kbGVyX2hhbmRsZXJOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9oYW5kbGVyTmFtZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvYXAgUm9sZXMgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcFJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9zb2FwUm9sZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9IYW5kbGVyX3NvYXBSb2xlc19mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcFJvbGVzKCksIGZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9ydCBOYW1lcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3J0TmFtZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9IYW5kbGVyX3BvcnROYW1lc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfcG9ydE5hbWVzX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Qb3J0TmFtZXMoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIYW5kbGVyIENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhhbmRsZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfaGFuZGxlckNsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpLCBmYWxzZSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkpOwotLy8JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEhhbmRsZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9vYmoxNi9oYW5kbGVyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKEhhbmRsZXIpb2JqZWN0KS5nZXRIYW5kbGVyTmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfSGFuZGxlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSGFuZGxlcikgb2JqZWN0KS5nZXRIYW5kbGVyTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfdHlwZSIpIDogZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfdHlwZSIpICsgIjogIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEhhbmRsZXIuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUUgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUyA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19QT1JUX05BTUVTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbVZhbHVlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUU5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBIZWFkZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETFBvcnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0luaXRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODAyNDNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdFBhcmFtSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbml0UGFyYW1JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJLy9wZ20gYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhcmFtTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGFyYW1WYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX0luaXRQYXJhbV9pZF9mZWF0dXJlIiksIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsCi0JICogIl9VSV9Jbml0UGFyYW1faWRfZmVhdHVyZSIsICJfVUlfSW5pdFBhcmFtX3R5cGUiKSwKLQkgKiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFyYW0gTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fcGFyYW1OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfSW5pdFBhcmFtX3BhcmFtTmFtZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9QYXJhbU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtIFZhbHVlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fcGFyYW1WYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX0luaXRQYXJhbV9wYXJhbVZhbHVlX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfSW5pdFBhcmFtX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfSW5pdFBhcmFtX2Rlc2NyaXB0aW9uX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkIAotCQkJCQlXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEluaXRQYXJhbS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L2luaXRpYWxpel9wYXJhbWV0ZXIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoSW5pdFBhcmFtKW9iamVjdCkuZ2V0UGFyYW1OYW1lKCk7Ci0JICogcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0luaXRQYXJhbV90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX0luaXRQYXJhbV90eXBlIikgKyAiICIgKyBsYWJlbDsgfSAvKgotCSAqIAotCSAqIC8qKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUluaXRQYXJhbSBpbml0UGFyYW0gPSAoSW5pdFBhcmFtKSBvYmplY3Q7Ci0JCVN0cmluZyBuYW1lID0gaW5pdFBhcmFtLmdldFBhcmFtTmFtZSgpOwotCQlTdHJpbmcgdmFsdWUgPSBpbml0UGFyYW0uZ2V0UGFyYW1WYWx1ZSgpOwotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCB8fCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZ2V0U3RyaW5nKCIlX1VJX0luaXRQYXJhbV90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGxhYmVsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlsYWJlbC5hcHBlbmQobmFtZSk7Ci0JCWxhYmVsLmFwcGVuZCgiPSIpOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsLmFwcGVuZCh2YWx1ZSk7Ci0JCXJldHVybiBsYWJlbC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJbml0UGFyYW0uY2xhc3MpKSB7Ci0JCQkvL3BnbSBjYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19JRDoKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUUgOgotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUUgOgotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT05fVFlQRVMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7IHJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7IH0KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlJbml0UGFyYW0gcGFyYW0gPSAoSW5pdFBhcmFtKSBvYmplY3Q7Ci0JCWlmIChwYXJhbS5nZXRQYXJhbU5hbWUoKSAhPSBudWxsKQotCQkJY2hpbGRyZW4uYWRkKHBhcmFtLmdldFBhcmFtTmFtZSgpKTsKLQkJaWYgKHBhcmFtLmdldFBhcmFtVmFsdWUoKSAhPSBudWxsKQotCQkJY2hpbGRyZW4uYWRkKHBhcmFtLmdldFBhcmFtVmFsdWUoKSk7Ci0JCWlmIChwYXJhbS5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQocGFyYW0uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9JbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMTJjYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9JbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBJbnRlcmZhY2VNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSW50ZXJmYWNlTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0ludGVyZmFjZU1hcHBpbmdfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9KYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc0YWM1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFXU0RMTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KYXZhV1NETE1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfSmF2YVdTRExNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfUGFja2FnZU1hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0V4Y2VwdGlvbk1hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBKYXZhV1NETE1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9KYXZhV1NETE1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSmF2YVdTRExNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9KYXZhV1NETE1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9KYXZhV1NETE1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChKYXZhV1NETE1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fUEFDS0FHRV9NQVBQSU5HUyA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0pBVkFfWE1MX1RZUEVfTUFQUElOR1MgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1MgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1MgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX1BhY2thZ2VNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYWNrYWdlTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVhNTFR5cGVNYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhjZXB0aW9uTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUludGVyZmFjZU1hcHBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19JbnRlcmZhY2VNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9KYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViZTE5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2xhc3NUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRRbmFtZVNjb3BlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBbm9ueW1vdXNUeXBlUW5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2xhc3MgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDbGFzc1R5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19jbGFzc1R5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX2NsYXNzVHlwZV9mZWF0dXJlIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfQ2xhc3NUeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBRbmFtZSBTY29wZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRRbmFtZVNjb3BlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfcW5hbWVTY29wZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfcW5hbWVTY29wZV9mZWF0dXJlIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfUW5hbWVTY29wZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQW5vbnltb3VzIFR5cGUgUW5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5vbnltb3VzVHlwZVFuYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfYW5vbnltb3VzVHlwZVFuYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19hbm9ueW1vdXNUeXBlUW5hbWVfZmVhdHVyZSIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0Fub255bW91c1R5cGVRbmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19WYXJpYWJsZU1hcHBpbmdzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSmF2YVhNTFR5cGVNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSmF2YVhNTFR5cGVNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEphdmFYTUxUeXBlTWFwcGluZykgb2JqZWN0KS5nZXRBbm9ueW1vdXNUeXBlUW5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEphdmFYTUxUeXBlTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX1RZUEUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUU5BTUVfU0NPUEUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUk9PVF9UWVBFX1FOQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1ZBUklBQkxFX01BUFBJTkdTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19Sb290VHlwZVFuYW1lKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvb3RUeXBlUW5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19WYXJpYWJsZU1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVZhcmlhYmxlTWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzZDZlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0pheHJwY21hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC51dGlsLkpheHJwY21hcEFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLiBUaGUKLSAqIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8KLSAqIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgotICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpheHJwY21hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSmF4cnBjbWFwQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIgewotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieQotCSAqIHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpheHJwY21hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXIgamF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFXU0RMTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChqYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJamF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IEphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBqYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyIHBhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFja2FnZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAocGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXIgamF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFYTUxUeXBlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChqYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJamF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IEphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBqYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlciBleGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGNlcHRpb25NYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBFeGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nfWluc3RhbmNlcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmd9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIgcm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9vdFR5cGVRbmFtZUFkYXB0ZXIoKSB7Ci0JCWlmIChyb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyIHZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYXJpYWJsZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAodmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBWYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMTWVzc2FnZUl0ZW1Qcm92aWRlciB3c2RsTWVzc2FnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExNZXNzYWdlQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxNZXNzYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxNZXNzYWdlSXRlbVByb3ZpZGVyID0gbmV3IFdTRExNZXNzYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxNZXNzYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyfWluc3RhbmNlcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIgY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJ9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyQWRhcHRlcigpIHsKLQkJaWYgKGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlciA9IG5ldyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnROYW1lSXRlbVByb3ZpZGVyIGVsZW1lbnROYW1lSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxlbWVudE5hbWVBZGFwdGVyKCkgewotCQlpZiAoZWxlbWVudE5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZWxlbWVudE5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgRWxlbWVudE5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudE5hbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMU2VydmljZU5hbWVJdGVtUHJvdmlkZXIgd3NkbFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExTZXJ2aWNlTmFtZUFkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsU2VydmljZU5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyID0gbmV3IFdTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsU2VydmljZU5hbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyIHBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydE1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAocG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9ydE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMUG9ydFR5cGVJdGVtUHJvdmlkZXIgd3NkbFBvcnRUeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExQb3J0VHlwZUFkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsUG9ydFR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbFBvcnRUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFdTRExQb3J0VHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsUG9ydFR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExCaW5kaW5nSXRlbVByb3ZpZGVyIHdzZGxCaW5kaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETEJpbmRpbmdBZGFwdGVyKCkgewotCQlpZiAod3NkbEJpbmRpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbEJpbmRpbmdJdGVtUHJvdmlkZXIgPSBuZXcgV1NETEJpbmRpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbEJpbmRpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlciBzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMT3BlcmF0aW9uSXRlbVByb3ZpZGVyIHdzZGxPcGVyYXRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExPcGVyYXRpb25BZGFwdGVyKCkgewotCQlpZiAod3NkbE9wZXJhdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsT3BlcmF0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFdTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbE9wZXJhdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmd9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIgbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ30uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nfWluc3RhbmNlcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIgd3NkbFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmd9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMUmV0dXJuVmFsdWVNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgd3NkbE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExNZXNzYWdlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFdTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWV9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlciB3c2RsTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMTWVzc2FnZVBhcnROYW1lQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBXU0RMTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciBpbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfWFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NzI1OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYXJhbVBvc2l0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYXJhbVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbSBQb3NpdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbVBvc2l0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ19wYXJhbVBvc2l0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3BhcmFtUG9zaXRpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVBvc2l0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbSBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfcGFyYW1UeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3BhcmFtVHlwZV9mZWF0dXJlIiwgIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfV3NkbE1lc3NhZ2VNYXBwaW5nKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYXJhbVBhcnRzTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RQYXJhbVBhcnRzTWFwcGluZykgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1BPU0lUSU9OIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fVFlQRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1dzZGxNZXNzYWdlTWFwcGluZygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMTWVzc2FnZU1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzRlOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9QYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGFja2FnZVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE5hbWVzcGFjZVVSSVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BhY2thZ2VNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BhY2thZ2VNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1BhY2thZ2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZU1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhY2thZ2UgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWNrYWdlVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUGFja2FnZU1hcHBpbmdfcGFja2FnZVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGFja2FnZU1hcHBpbmdfcGFja2FnZVR5cGVfZmVhdHVyZSIsICJfVUlfUGFja2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlTWFwcGluZ19QYWNrYWdlVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZXNwYWNlIFVSSSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lc3BhY2VVUklQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BhY2thZ2VNYXBwaW5nX25hbWVzcGFjZVVSSV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QYWNrYWdlTWFwcGluZ19uYW1lc3BhY2VVUklfZmVhdHVyZSIsICJfVUlfUGFja2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlTWFwcGluZ19OYW1lc3BhY2VVUkkoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUGFja2FnZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9QYWNrYWdlTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQYWNrYWdlTWFwcGluZykgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUGFja2FnZU1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9QYWNrYWdlTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBhY2thZ2VNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fUEFDS0FHRV9UWVBFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX05BTUVTUEFDRV9VUkkgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDFkMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudH0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUG9ydENvbXBvbmVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU21hbGxJY29uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRMYXJnZUljb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREaXNwbGF5TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF9pZF9mZWF0dXJlIiksIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsCi0JICogIl9VSV9Qb3J0Q29tcG9uZW50X2lkX2ZlYXR1cmUiLCAiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpLAotCSAqIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3J0IENvbXBvbmVudCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBvcnRDb21wb25lbnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X3BvcnRDb21wb25lbnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRDb21wb25lbnRfcG9ydENvbXBvbmVudE5hbWVfZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1BvcnRDb21wb25lbnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRDb21wb25lbnRfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ZlYXR1cmUiLCAiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNtYWxsIEljb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU21hbGxJY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X3NtYWxsSWNvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3NtYWxsSWNvbl9mZWF0dXJlIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfU21hbGxJY29uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMYXJnZSBJY29uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExhcmdlSWNvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF9sYXJnZUljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydENvbXBvbmVudF9sYXJnZUljb25fZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydENvbXBvbmVudF9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpc3BsYXkgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXNwbGF5TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF9kaXNwbGF5TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0Q29tcG9uZW50X2Rpc3BsYXlOYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VJbXBsQmVhbigpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSGFuZGxlcnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uVHlwZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWVUeXBlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9JY29uVHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBvcnRDb21wb25lbnQuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsgcmV0dXJuCi0JICogZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUG9ydENvbXBvbmVudCIpOyB9Ci0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPQotCSAqICgoUG9ydENvbXBvbmVudClvYmplY3QpLmdldFBvcnRDb21wb25lbnROYW1lKCk7IHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCSAqIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpIDogZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBvcnRDb21wb25lbnQuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL29iajE2L3BvcnRjb21wb25lbnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQb3J0Q29tcG9uZW50KSBvYmplY3QpLmdldFBvcnRDb21wb25lbnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfUG9ydENvbXBvbmVudF90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb3J0Q29tcG9uZW50LmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fUE9SVF9DT01QT05FTlRfTkFNRSA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TTUFMTF9JQ09OIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0xBUkdFX0lDT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVCA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSUyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETFBvcnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VJbXBsQmVhbigpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUltcGxCZWFuKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGFuZGxlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb25UeXBlKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZVR5cGUoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZVR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0ljb25UeXBlKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUljb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDNmMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmfW9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFBvcnRDb21wb25lbnRMaW5rUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgQ29tcG9uZW50IExpbmsgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9ydENvbXBvbmVudExpbmtQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3BvcnRDb21wb25lbnRMaW5rX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfUG9ydENvbXBvbmVudFJlZl9wb3J0Q29tcG9uZW50TGlua19mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX1BvcnRDb21wb25lbnRSZWZfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkIAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIGZhbHNlKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9ydENvbXBvbmVudFJlZi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL29iajE2L3BvcnRjb21wb25lbnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9Ci0JICogKChQb3J0Q29tcG9uZW50UmVmKW9iamVjdCkuZ2V0UG9ydENvbXBvbmVudExpbmsoKTsgcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0KLQkgKiAwID8gZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudFJlZl90eXBlIikgOiBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50UmVmX3R5cGUiKSArICIgIiArCi0JICogbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBvcnRDb21wb25lbnRSZWYpIG9iamVjdCkuZ2V0UG9ydENvbXBvbmVudExpbmsoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvcnRDb21wb25lbnRSZWYuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTksgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDdkOGUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmd9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBvcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRKYXZhUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0TWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0TWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9Qb3J0TWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3J0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRNYXBwaW5nX3BvcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRNYXBwaW5nX3BvcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydE1hcHBpbmdfUG9ydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEphdmEgUG9ydCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydE1hcHBpbmdfamF2YVBvcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRNYXBwaW5nX2phdmFQb3J0TmFtZV9mZWF0dXJlIiwgIl9VSV9Qb3J0TWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRNYXBwaW5nX0phdmFQb3J0TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQb3J0TWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BvcnRNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBvcnRNYXBwaW5nKSBvYmplY3QpLmdldFBvcnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qb3J0TWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9ydE1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19QT1JUX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSkFWQV9QT1JUX05BTUUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwNjMzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnROYW1lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZX0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnROYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3J0TmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQkvL3BnbSBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1BvcnROYW1lX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX1BvcnROYW1lX2lkX2ZlYXR1cmUiLCAiX1VJX1BvcnROYW1lX3R5cGUiKSwgV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0TmFtZV9JZCgpLAotCSAqIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9ydCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBvcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0TmFtZV9wb3J0TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0TmFtZV9wb3J0TmFtZV9mZWF0dXJlIiwgIl9VSV9Qb3J0TmFtZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydE5hbWVfUG9ydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9ydE5hbWUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qb3J0TmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKFBvcnROYW1lKW9iamVjdCkuZ2V0UG9ydE5hbWUoKTsKLQkgKiByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUG9ydE5hbWVfdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9Qb3J0TmFtZV90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBvcnROYW1lKSBvYmplY3QpLmdldFBvcnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfUG9ydE5hbWVfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb3J0TmFtZS5jbGFzcykpIHsKLQkJCS8vcGdtIGNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRV9fSUQ6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5QT1JUX05BTUVfX1BPUlRfTkFNRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsgcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsgfQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Sb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1Jvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhMDZjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1Jvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb290VHlwZVFuYW1lLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9vdFR5cGVRbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb290VHlwZVFuYW1lKSBvYmplY3QpLmdldENvbWJpbmVkUU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Jvb3RUeXBlUW5hbWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb290VHlwZVFuYW1lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU09BUEhlYWRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TT0FQSGVhZGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MTMwMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TT0FQSGVhZGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEhlYWRlckl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNPQVBIZWFkZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTT0FQSGVhZGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU09BUEhlYWRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9Ci0JICogKChTT0FQSGVhZGVyKW9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOyByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkgKiBnZXRTdHJpbmcoIl9VSV9TT0FQSGVhZGVyX3R5cGUiKSA6IGdldFN0cmluZygiX1VJX1NPQVBIZWFkZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTT0FQSGVhZGVyIHNvYXBIZWFkZXIgPSAoU09BUEhlYWRlcikgb2JqZWN0OwotCQlTdHJpbmcgbnNVUkkgPSBzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOwotCQlTdHJpbmcgbG9jYWxwYXJ0ID0gc29hcEhlYWRlci5nZXRMb2NhbFBhcnQoKTsKLQkJaWYgKG5zVVJJID09IG51bGwgfHwgbnNVUkkubGVuZ3RoKCkgPT0gMCB8fCBsb2NhbHBhcnQgPT0gbnVsbCB8fCBsb2NhbHBhcnQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfU09BUEhlYWRlcl90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGxhYmVsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlsYWJlbC5hcHBlbmQobnNVUkkpOwotCQlsYWJlbC5hcHBlbmQoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlsYWJlbC5hcHBlbmQobG9jYWxwYXJ0KTsKLQkJcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBSb2xlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBSb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWQzNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TT0FQUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU09BUFJvbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJLy9wZ20gYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNvYXBSb2xlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9TT0FQUm9sZV9pZF9mZWF0dXJlIiksIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsCi0JICogIl9VSV9TT0FQUm9sZV9pZF9mZWF0dXJlIiwgIl9VSV9TT0FQUm9sZV90eXBlIiksIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUFJvbGVfSWQoKSwKLQkgKiB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvYXAgUm9sZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwUm9sZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU09BUFJvbGVfc29hcFJvbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU09BUFJvbGVfc29hcFJvbGVfZmVhdHVyZSIsICJfVUlfU09BUFJvbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBSb2xlX1NvYXBSb2xlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNPQVBSb2xlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU09BUFJvbGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChTT0FQUm9sZSlvYmplY3QpLmdldElkKCk7IHJldHVybgotCSAqIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NPQVBSb2xlX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfU09BUFJvbGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNPQVBSb2xlKSBvYmplY3QpLmdldFNvYXBSb2xlKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfU09BUFJvbGVfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTT0FQUm9sZS5jbGFzcykpIHsKLQkJCS8vcGdtIGNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRV9fSUQ6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX1JPTEVfX1NPQVBfUk9MRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsgcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsgfQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZWN0aW9uQ29tcG9uZW50U2NvcGVkUmVmSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlY3Rpb25Db21wb25lbnRTY29wZWRSZWZIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0MmM5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlY3Rpb25Db21wb25lbnRTY29wZWRSZWZIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDI5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uQ29tcG9uZW50U2NvcGVkUmVmSGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VzQ2xpZW50IHdzQ2xpZW50OwotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFdzQ2xpZW50KFdlYlNlcnZpY2VzQ2xpZW50IGNsaWVudCkgewotCQl3c0NsaWVudCA9IGNsaWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VzQ2xpZW50IGdldFdzQ2xpZW50KCkgewotCQlyZXR1cm4gd3NDbGllbnQ7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmZiYmFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxQb3J0VHlwZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsQmluZGluZygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZykgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORyA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR1MgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsUG9ydFR5cGUoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETFBvcnRUeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExCaW5kaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDMyNTFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmd9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEphdmFNZXRob2ROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXc2RsT3BlcmF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXcmFwcGVkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSmF2YSBNZXRob2QgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhTWV0aG9kTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19qYXZhTWV0aG9kTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX2phdmFNZXRob2ROYW1lX2ZlYXR1cmUiLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0phdmFNZXRob2ROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIE9wZXJhdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsT3BlcmF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3dzZGxPcGVyYXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ193c2RsT3BlcmF0aW9uX2ZlYXR1cmUiLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxPcGVyYXRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdyYXBwZWQgRWxlbWVudCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXcmFwcGVkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ193cmFwcGVkRWxlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3dyYXBwZWRFbGVtZW50X2ZlYXR1cmUiLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dyYXBwZWRFbGVtZW50KCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX01ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZykgb2JqZWN0KS5nZXRKYXZhTWV0aG9kTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19KQVZBX01FVEhPRF9OQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX09QRVJBVElPTiA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1JBUFBFRF9FTEVNRU5UIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR1MgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkcgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbFJldHVyblZhbHVlTWFwcGluZygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhN2E2ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW59Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW1wbEJlYW5faWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfU2VydmljZUltcGxCZWFuX2lkX2ZlYXR1cmUiLCAiX1VJX1NlcnZpY2VJbXBsQmVhbl90eXBlIiksCi0JICogV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FRUpCTGluaygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2aWNlSW1wbEJlYW4uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi9zcnZjZV9lbGVtX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChTZXJ2aWNlSW1wbEJlYW4pb2JqZWN0KS5nZXRJZCgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW1wbEJlYW5fdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW1wbEJlYW5fdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTZXJ2aWNlSW1wbEJlYW4gc2VydmljZUltcGxCZWFuID0gKFNlcnZpY2VJbXBsQmVhbikgb2JqZWN0OwotCQlTdHJpbmcgZWpiTGluayA9IHNlcnZpY2VJbXBsQmVhbi5nZXRFRUpCTGluaygpLmdldEVqYkxpbmsoKTsKLQkJaWYgKGVqYkxpbmsgIT0gbnVsbCAmJiBlamJMaW5rLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBlamJMaW5rOwotCQlTdHJpbmcgYmVhbkxpbmsgPSBzZXJ2aWNlSW1wbEJlYW4uZ2V0QmVhbkxpbmsoKS50b1N0cmluZygpOwotCQlpZiAoYmVhbkxpbmsgIT0gbnVsbCAmJiBiZWFuTGluay5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gYmVhbkxpbms7Ci0JCVN0cmluZyBzZXJ2bGV0TGluayA9IHNlcnZpY2VJbXBsQmVhbi5nZXRFU2VydmxldExpbmsoKS5nZXRTZXJ2bGV0TGluaygpOwotCQlpZiAoc2VydmxldExpbmsgIT0gbnVsbCAmJiBzZXJ2bGV0TGluay5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gc2VydmxldExpbms7Ci0JCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfU2VydmljZUltcGxCZWFuX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXJ2aWNlSW1wbEJlYW4uY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FRUpCX0xJTksgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTksgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FRUpCTGluaygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUpCTGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZsZXRMaW5rKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCZWFuTGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldExpbmsoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVKQkxpbmsoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHF1YWxpZnkgPSBmZWF0dXJlID09IFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRVNlcnZsZXRMaW5rKCkgfHwgZmVhdHVyZSA9PSBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCkgfHwgZmVhdHVyZSA9PSBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCk7Ci0JCXJldHVybiBnZXRTdHJpbmcocXVhbGlmeSA/ICJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiIDogIl9VSV9DcmVhdGVDaGlsZF90ZXh0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCW5ldyBPYmplY3RbXXtnZXRUeXBlVGV4dChjaGlsZCksIGdldEZlYXR1cmVUZXh0KGZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcil9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlM2QwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZXJ2aWNlSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmljZUludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfc2VydmljZUludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19zZXJ2aWNlSW50ZXJmYWNlX2ZlYXR1cmUiLCAiX1VJX1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfU2VydmljZUludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfV3NkbFNlcnZpY2VOYW1lKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Qb3J0TWFwcGluZ3MoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfSU5URVJGQUNFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETFNlcnZpY2VOYW1lKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Qb3J0TWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydE1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VSZWZFZGl0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkVkaXRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzRhZGQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkVkaXRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VSZWZFZGl0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyIHsKLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgU2VydmljZVJlZkVkaXRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgYXJnMCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhMTU3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5TZXJ2aWNlUmVmfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZVJlZkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTZXJ2aWNlSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZXJ2aWNlUmVmTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbEZpbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEpheHJwY01hcHBpbmdGaWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2aWNlIFJlZiBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VSZWZOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9zZXJ2aWNlUmVmTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfc2VydmljZVJlZk5hbWVfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIEZpbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbEZpbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX3dzZGxGaWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl93c2RsRmlsZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBKYXhycGMgTWFwcGluZyBGaWxlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEpheHJwY01hcHBpbmdGaWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9qYXhycGNNYXBwaW5nRmlsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfamF4cnBjTWFwcGluZ0ZpbGVfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCksIGZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmljZUludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfc2VydmljZUludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfc2VydmljZUludGVyZmFjZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpLCBmYWxzZSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJLy9jaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0hhbmRsZXJzKCkpOwotCQkJLy9jaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2aWNlUmVmLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvc2VydmljZXJlZi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKFNlcnZpY2VSZWYpb2JqZWN0KS5nZXRTZXJ2aWNlUmVmTmFtZSgpOyByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkgKiBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlUmVmX3R5cGUiKSA6IGdldFN0cmluZygiX1VJX1NlcnZpY2VSZWZfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNlcnZpY2VSZWYpIG9iamVjdCkuZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJcmV0dXJuICJTZXJ2aWNlUmVmICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZpY2VSZWYuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRSA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fV1NETF9GSUxFIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSUyA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKSwgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0Q29tcG9uZW50UmVmKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSwgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIYW5kbGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVFOYW1lKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETFBvcnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmxldExpbmtJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmxldExpbmtJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5Njc3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZsZXRMaW5rSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGlua30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyIGV4dGVuZHMgQmVhbkxpbmtJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmxldExpbmtJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkU2VydmxldExpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1NlcnZsZXRMaW5rX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX1NlcnZsZXRMaW5rX2lkX2ZlYXR1cmUiLCAiX1VJX1NlcnZsZXRMaW5rX3R5cGUiKSwKLQkgKiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldExpbmtfSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZsZXQgTGluayBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2bGV0TGlua1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmxldExpbmtfc2VydmxldExpbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmxldExpbmtfc2VydmxldExpbmtfZmVhdHVyZSIsICJfVUlfU2VydmxldExpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldExpbmtfU2VydmxldExpbmsoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU2VydmxldExpbmsuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoU2VydmxldExpbmspb2JqZWN0KS5nZXRJZCgpOyByZXR1cm4KLQkgKiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2bGV0TGlua190eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1NlcnZsZXRMaW5rX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZXJ2bGV0TGluaykgb2JqZWN0KS5nZXRTZXJ2bGV0TGluaygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1NlcnZsZXRMaW5rX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZsZXRMaW5rLmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1ZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9WYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlODE1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1ZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEphdmFWYXJpYWJsZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFhtbEVsZW1lbnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREYXRhTWVtYmVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRYbWxBdHRyaWJ1dGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRYbWxXaWxkY2FyZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1ZhcmlhYmxlTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBKYXZhIFZhcmlhYmxlIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVZhcmlhYmxlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX2phdmFWYXJpYWJsZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFibGVNYXBwaW5nX2phdmFWYXJpYWJsZU5hbWVfZmVhdHVyZSIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX0phdmFWYXJpYWJsZU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFhtbCBFbGVtZW50IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sRWxlbWVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1ZhcmlhYmxlTWFwcGluZ194bWxFbGVtZW50TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfeG1sRWxlbWVudE5hbWVfZmVhdHVyZSIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX1htbEVsZW1lbnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEYXRhIE1lbWJlciBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREYXRhTWVtYmVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfZGF0YU1lbWJlcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfZGF0YU1lbWJlcl9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfRGF0YU1lbWJlcigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWG1sIEF0dHJpYnV0ZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEF0dHJpYnV0ZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1ZhcmlhYmxlTWFwcGluZ194bWxBdHRyaWJ1dGVOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ194bWxBdHRyaWJ1dGVOYW1lX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZ19YbWxBdHRyaWJ1dGVOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBYbWwgV2lsZGNhcmQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sV2lsZGNhcmRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1ZhcmlhYmxlTWFwcGluZ194bWxXaWxkY2FyZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfeG1sV2lsZGNhcmRfZmVhdHVyZSIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX1htbFdpbGRjYXJkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFZhcmlhYmxlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1ZhcmlhYmxlTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChWYXJpYWJsZU1hcHBpbmcpIG9iamVjdCkuZ2V0SmF2YVZhcmlhYmxlTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVmFyaWFibGVNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19KQVZBX1ZBUklBQkxFX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9FTEVNRU5UX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0RBVEFfTUVNQkVSIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfQVRUUklCVVRFX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRCA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMQmluZGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMQmluZGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjlmMTk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETEJpbmRpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmd9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMQmluZGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExCaW5kaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETEJpbmRpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMQmluZGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMQmluZGluZykgb2JqZWN0KS5nZXRDb21iaW5lZFFOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMQmluZGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExCaW5kaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU1NDBiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBRTmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMTWVzc2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExNZXNzYWdlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV1NETE1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETE1lc3NhZ2UpIG9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0ZjhkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGFyYW1ldGVyTW9kZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU29hcEhlYWRlclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIE1lc3NhZ2UgUGFydCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxNZXNzYWdlUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbWV0ZXIgTW9kZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbWV0ZXJNb2RlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfcGFyYW1ldGVyTW9kZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfcGFyYW1ldGVyTW9kZV9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfUGFyYW1ldGVyTW9kZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU29hcCBIZWFkZXIgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcEhlYWRlclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3NvYXBIZWFkZXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3NvYXBIZWFkZXJfZmVhdHVyZSIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1NvYXBIZWFkZXIoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExNZXNzYWdlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExNZXNzYWdlTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMTWVzc2FnZU1hcHBpbmcpIG9iamVjdCkuZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19QQVJBTUVURVJfTU9ERSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1NPQVBfSEVBREVSIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMTWVzc2FnZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNmM1MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWV9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxNZXNzYWdlUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfaWRfZmVhdHVyZSIsICJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlUGFydE5hbWVfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgTWVzc2FnZSBQYXJ0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV93c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfd3NkbE1lc3NhZ2VQYXJ0TmFtZV9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9Xc2RsTWVzc2FnZVBhcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExNZXNzYWdlUGFydE5hbWUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMTWVzc2FnZVBhcnROYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExNZXNzYWdlUGFydE5hbWUpIG9iamVjdCkuZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXU0RMTWVzc2FnZVBhcnROYW1lLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg4MGZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb247Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb259Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMT3BlcmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMT3BlcmF0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXc2RsT3BlcmF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETE9wZXJhdGlvbl9pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMT3BlcmF0aW9uX2lkX2ZlYXR1cmUiLCAiX1VJX1dTRExPcGVyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMT3BlcmF0aW9uX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIE9wZXJhdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsT3BlcmF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMT3BlcmF0aW9uX3dzZGxPcGVyYXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE9wZXJhdGlvbl93c2RsT3BlcmF0aW9uX2ZlYXR1cmUiLCAiX1VJX1dTRExPcGVyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMT3BlcmF0aW9uX1dzZGxPcGVyYXRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETE9wZXJhdGlvbi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExPcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETE9wZXJhdGlvbikgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETE9wZXJhdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExPcGVyYXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXU0RMT3BlcmF0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfT1BFUkFUSU9OX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX1dTRExfT1BFUkFUSU9OIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZTk0MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMUG9ydEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnR9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExQb3J0SXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETFBvcnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMUG9ydC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvd3NkbC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChXU0RMUG9ydClvYmplY3QpLmdldENvbWJpbmVkUU5hbWUoKTsKLQkgKiByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETFBvcnRfdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9XU0RMUG9ydF90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVdTRExQb3J0IHdzZGxwb3J0ID0gKFdTRExQb3J0KSBvYmplY3Q7Ci0JCVN0cmluZyBuc1VSSSA9IHdzZGxwb3J0LmdldE5hbWVzcGFjZVVSSSgpOwotCQlTdHJpbmcgbG9jYWxwYXJ0ID0gd3NkbHBvcnQuZ2V0TG9jYWxQYXJ0KCk7Ci0JCWlmIChuc1VSSSA9PSBudWxsIHx8IG5zVVJJLmxlbmd0aCgpID09IDAgfHwgbG9jYWxwYXJ0ID09IG51bGwgfHwgbG9jYWxwYXJ0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZ2V0U3RyaW5nKCIlX1VJX1dTRExQb3J0X3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWxhYmVsLmFwcGVuZChuc1VSSSk7Ci0JCWxhYmVsLmFwcGVuZCgiIyIpOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsLmFwcGVuZChsb2NhbHBhcnQpOwotCQlyZXR1cm4gbGFiZWwudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMUG9ydFR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3MTdiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETFBvcnRUeXBlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV1NETFBvcnRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExQb3J0VHlwZSkgb2JqZWN0KS5nZXRDb21iaW5lZFFOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMUG9ydFR5cGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9XU0RMUG9ydFR5cGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2MjYxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNZXRob2RSZXR1cm5WYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWV0aG9kIFJldHVybiBWYWx1ZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRob2RSZXR1cm5WYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ19tZXRob2RSZXR1cm5WYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX21ldGhvZFJldHVyblZhbHVlX2ZlYXR1cmUiLCAiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX01ldGhvZFJldHVyblZhbHVlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIE1lc3NhZ2UgUGFydCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxNZXNzYWdlUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfd3NkbE1lc3NhZ2VQYXJ0TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIsICJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcpIG9iamVjdCkuZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19NRVRIT0RfUkVUVVJOX1ZBTFVFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0UgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMTWVzc2FnZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmY1MDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMU2VydmljZU5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBRTmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMU2VydmljZU5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMU2VydmljZU5hbWUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMU2VydmljZU5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETFNlcnZpY2VOYW1lKSBvYmplY3QpLmdldENvbWJpbmVkUU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dTRExTZXJ2aWNlTmFtZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExTZXJ2aWNlTmFtZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1OWU4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbn1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSmF4cnBjTWFwcGluZ0ZpbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxGaWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExhcmdlSWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25faWRfZmVhdHVyZSIpLAotCSAqIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2lkX2ZlYXR1cmUiLAotCSAqICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSmF4cnBjIE1hcHBpbmcgRmlsZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXhycGNNYXBwaW5nRmlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9qYXhycGNNYXBwaW5nRmlsZV9mZWF0dXJlIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0pheHJwY01hcHBpbmdGaWxlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXZWIgU2VydmljZSBEZXNjcmlwdGlvbiBOYW1lIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl93ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl93ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBGaWxlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxGaWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fd3NkbEZpbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3dzZGxGaWxlX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV3NkbEZpbGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNtYWxsIEljb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU21hbGxJY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fc21hbGxJY29uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9zbWFsbEljb25fZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9TbWFsbEljb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExhcmdlIEljb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGFyZ2VJY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fbGFyZ2VJY29uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9sYXJnZUljb25fZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9MYXJnZUljb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpc3BsYXkgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXNwbGF5TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2Rpc3BsYXlOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9kaXNwbGF5TmFtZV9mZWF0dXJlIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsgcmV0dXJuCi0JICogZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV2ViU2VydmljZURlc2NyaXB0aW9uIik7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKFdlYlNlcnZpY2VEZXNjcmlwdGlvbilvYmplY3QpLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKTsgcmV0dXJuIGxhYmVsID09IG51bGwgfHwKLQkgKiBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL29iajE2L3dlYnNlcnZpY2VkZXNjLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV2ViU2VydmljZURlc2NyaXB0aW9uKSBvYmplY3QpLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRSA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dTRExfRklMRSA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19TTUFMTF9JQ09OIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0xBUkdFX0lDT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1BPUlRfQ09NUE9ORU5UUyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0Q29tcG9uZW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZVR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWNvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjNiNjEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50fW9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV2ViU2VydmljZXNDbGllbnQuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XZWJTZXJ2aWNlc0NsaWVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy9yZXR1cm4gZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZXNDbGllbnRfdHlwZSIpOwotCQlyZXR1cm4gZ2V0U3RyaW5nKCIlX1VJX1dlYlNlcnZpY2VzQ2xpZW50X3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcykpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX0NPTVBPTkVOVF9TQ09QRURfUkVGUyA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19TRVJWSUNFX1JFRlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCksIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmcygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc0NsaWVudF9TZXJ2aWNlUmVmcygpLCBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VSZWYoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzMzIzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXN9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VzX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX1dlYlNlcnZpY2VzX2lkX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VzX3R5cGUiKSwKLQkgKiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNfSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV2ViU2VydmljZXMuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XZWJTZXJ2aWNlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKFdlYlNlcnZpY2VzKW9iamVjdCkuZ2V0RGlzcGxheU5hbWUoKTsKLQkgKiByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZXNfdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlc190eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV2ViU2VydmljZXMpIG9iamVjdCkuZ2V0RGlzcGxheU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9XZWJTZXJ2aWNlc190eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWJTZXJ2aWNlcy5jbGFzcykpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzX1dlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjY3MWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeSBleHRlbmRzIFdlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NjbGllbnQudXRpbC5XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlUmVmQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2aWNlUmVmRWRpdG9ySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VSZWZJdGVtUHJvdmlkZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZWQ4MDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLnV0aWwuV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4gVGhlCi0gKiBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvCi0gKiB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5Ci0JICoge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuU2VydmljZVJlZn0KLQkgKiBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZVJlZkl0ZW1Qcm92aWRlciBzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LlNlcnZpY2VSZWZ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlUmVmQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VSZWZJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWZ9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciBwb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWZ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0Q29tcG9uZW50UmVmQWRhcHRlcigpIHsKLQkJaWYgKHBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciA9IG5ldyBQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5IYW5kbGVyfQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIYW5kbGVySXRlbVByb3ZpZGVyIGhhbmRsZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuSGFuZGxlcn0uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhhbmRsZXJBZGFwdGVyKCkgewotCQlpZiAoaGFuZGxlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQloYW5kbGVySXRlbVByb3ZpZGVyID0gbmV3IEhhbmRsZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaGFuZGxlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnR9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIgd2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJTZXJ2aWNlc0NsaWVudEFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciA9IG5ldyBXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmc31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyIGNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmc30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNBZGFwdGVyKCkgewotCQlpZiAoY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyID0gbmV3IENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWFhYjMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgV2Vic2VydmljZS1qMmVlIGVkaXQgcGx1Z2luLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7Ci0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbigpIHsKLQkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltde30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW4gPC9iPi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VQbHVnaW4gewotCQkvKioKLQkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIAotCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCQkgKiAgICAgICAgICAgIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGx1Z2luLgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkJc3VwZXIoZGVzY3JpcHRvcik7Ci0KLQkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCi0JCQkvLwotCQkJcGx1Z2luID0gdGhpczsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg0NTY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC51dGlsLldzY29tbW9uQWRhcHRlckZhY3Rvcnk7Ci0KLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4gVGhlCi0gKiBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvCi0gKiB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV3Njb21tb25BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5Ci0JICoge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbml0UGFyYW1JdGVtUHJvdmlkZXIgaW5pdFBhcmFtSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5pdFBhcmFtQWRhcHRlcigpIHsKLQkJaWYgKGluaXRQYXJhbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbml0UGFyYW1JdGVtUHJvdmlkZXIgPSBuZXcgSW5pdFBhcmFtSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGluaXRQYXJhbUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNPQVBIZWFkZXJJdGVtUHJvdmlkZXIgc29hcEhlYWRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQSGVhZGVyQWRhcHRlcigpIHsKLQkJaWYgKHNvYXBIZWFkZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9IG5ldyBTT0FQSGVhZGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNvYXBIZWFkZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU09BUFJvbGVJdGVtUHJvdmlkZXIgc29hcFJvbGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBSb2xlQWRhcHRlcigpIHsKLQkJaWYgKHNvYXBSb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNvYXBSb2xlSXRlbVByb3ZpZGVyID0gbmV3IFNPQVBSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNvYXBSb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvcnROYW1lSXRlbVByb3ZpZGVyIHBvcnROYW1lSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWV9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0TmFtZUFkYXB0ZXIoKSB7Ci0JCWlmIChwb3J0TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwb3J0TmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBQb3J0TmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwb3J0TmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyIGRlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmIChkZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyID0gbmV3IERlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlciBkaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNwbGF5TmFtZVR5cGVBZGFwdGVyKCkgewotCQlpZiAoZGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlciA9IG5ldyBEaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn1hbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTE5MjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndzZGQucHJvdmlkZXIuSGFuZGxlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwudXRpbC5Xc2RkQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuIFRoZQotICogYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0bwotICoge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV3NkZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyIHdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlc30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlNlcnZpY2VzQWRhcHRlcigpIHsKLQkJaWYgKHdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyID0gbmV3IFdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9ufWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50fWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIgcG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRBZGFwdGVyKCkgewotCQlpZiAocG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyID0gbmV3IFBvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldTRExQb3J0fWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExQb3J0SXRlbVByb3ZpZGVyIHdzZGxQb3J0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExQb3J0QWRhcHRlcigpIHsKLQkJaWYgKHdzZGxQb3J0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxQb3J0SXRlbVByb3ZpZGVyID0gbmV3IFdTRExQb3J0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxQb3J0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFufWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlciBzZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VJbXBsQmVhbkFkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGlua31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2bGV0TGlua0l0ZW1Qcm92aWRlciBzZXJ2bGV0TGlua0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmt9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0TGlua0FkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2bGV0TGlua0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2bGV0TGlua0l0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2bGV0TGlua0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2bGV0TGlua0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkVKQkxpbmt9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUpCTGlua0l0ZW1Qcm92aWRlciBlamJMaW5rSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCTGlua0FkYXB0ZXIoKSB7Ci0JCWlmIChlamJMaW5rSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVqYkxpbmtJdGVtUHJvdmlkZXIgPSBuZXcgRUpCTGlua0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlamJMaW5rSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIYW5kbGVySXRlbVByb3ZpZGVyIGhhbmRsZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkhhbmRsZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIYW5kbGVyQWRhcHRlcigpIHsKLQkJaWYgKGhhbmRsZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaGFuZGxlckl0ZW1Qcm92aWRlciA9IG5ldyBIYW5kbGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGhhbmRsZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5CZWFuTGlua31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCZWFuTGlua0l0ZW1Qcm92aWRlciBiZWFuTGlua0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbmt9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCZWFuTGlua0FkYXB0ZXIoKSB7Ci0JCWlmIChiZWFuTGlua0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQliZWFuTGlua0l0ZW1Qcm92aWRlciA9IG5ldyBCZWFuTGlua0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBiZWFuTGlua0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dzZGQvcHJvdmlkZXIvSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd3NkZC9wcm92aWRlci9IYW5kbGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MjQyYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd3NkZC9wcm92aWRlci9IYW5kbGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud3NkZC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0vKgotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggSGFuZGxlckl0ZW1Qcm92aWRlciBpbiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyCi0gKiBwYWNrYWdlIGFuZCBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIGNsYXNzIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBIYW5kbGVySXRlbVByb3ZpZGVyIGluIAotICogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlciBwYWNrYWdlLgotICovCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcn1vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlckl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhhbmRsZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSGFuZGxlck5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEhhbmRsZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfSGFuZGxlcl9pZF9mZWF0dXJlIiksIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsCi0JICogIl9VSV9IYW5kbGVyX2lkX2ZlYXR1cmUiLCAiX1VJX0hhbmRsZXJfdHlwZSIpLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGFuZGxlciBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhhbmRsZXJOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX2hhbmRsZXJOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0hhbmRsZXJfaGFuZGxlck5hbWVfZmVhdHVyZSIsICJfVUlfSGFuZGxlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIYW5kbGVyIENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhhbmRsZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZSIsICJfVUlfSGFuZGxlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBSb2xlcygpKTsKLQkJCS8vY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBIYW5kbGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7IHJldHVybgotCSAqIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0hhbmRsZXIiKTsgfQotCSAqLwotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChIYW5kbGVyKW9iamVjdCkuZ2V0RGlzcGxheU5hbWUoKTsKLQkgKiByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSGFuZGxlcl90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX0hhbmRsZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSGFuZGxlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvaGFuZGxlci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEhhbmRsZXIpIG9iamVjdCkuZ2V0SGFuZGxlck5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9IYW5kbGVyX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEhhbmRsZXIuY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRSA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1MgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRQYXJhbSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQSGVhZGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQUm9sZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MjJiYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTYzM2U4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qZWUudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyODEwZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNUaHUgTWF5IDEwIDE4OjM2OjQxIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1OTljYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmplZS51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTA2LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuamVlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndlYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEwMywxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAyLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAzLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcywKLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvciwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5hcHBjbGllbnQsCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZG5kLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhciwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIsCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucHJvamVjdC5mYWNldApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5OWJkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4ZTE4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvMzBfZWpiamFyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvMzBfZWpiamFyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YmY1MmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zLzMwX2VqYmphcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2FwcGNsaWVudF81MC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvYXBwY2xpZW50XzUwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzYWIxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvYXBwY2xpZW50XzUwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9hcHBjbGllbnRncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Njg0MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvZWFyXzUwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9lYXJfNTAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjBlMzYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9lYXJfNTAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2Vhcmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlYjNlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9lamJncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYWRiM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2RlcF9kZXNjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZGVwX2Rlc2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWVjYjdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZGVwX2Rlc2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9idXNpbmVzc19sb2NhbF9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9idXNpbmVzc19sb2NhbF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDg3ODI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvYnVzaW5lc3NfbG9jYWxfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvYnVzaW5lc3NfcmVtb3RlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL2J1c2luZXNzX3JlbW90ZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTE0ZTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvYnVzaW5lc3NfcmVtb3RlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL2hvbWVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvaG9tZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2JmZTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvaG9tZV9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9sb2NhbF9ob21lX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL2xvY2FsX2hvbWVfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4MjczNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL2xvY2FsX2hvbWVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvbG9jYWxfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvbG9jYWxfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlMTY1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL2xvY2FsX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL3JlbW90ZV9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9yZW1vdGVfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljOWNhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL3JlbW90ZV9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL3dlYmFwcF8yNS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvd2ViYXBwXzI1LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiOGMxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvd2ViYXBwXzI1LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy93ZWJncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NGQzNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMzAxOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBwcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkKLUJ1bmRsZS1OYW1lLjAgPSBVaSBQbHVnLWluCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotY3JlYXRlX2RlcGxveV9maWxlcz1HZW5lcmF0ZSBEZXBsb3ltZW50IERlc2NyaXB0b3IgU3R1YgotajJlZT1KYXZhIEVFCi1qMmVlLmFjdGlvbnMuZGVzY3JpcHRpb25fdWlfPUFjdGlvbnMgZm9yIEphdmEgRUUgRGV2ZWxvcG1lbnQKLUVOVEVSUFJJU0VfQkVBTl9ERUNPUkFUT1I9SmF2YSBFRSA1IEVudGVycHJpc2UgQmVhbnMgYW5kIEludGVyZmFjZXMgRGVjb3JhdG9yCi1FTlRFUlBSSVNFX0JFQU5fREVDT1JBVE9SLkRFU0NSSVBUSU9OPUphdmEgRUUgNSBFbnRlcnByaXNlIEJlYW5zIGFyZSBkZWNvcmF0ZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHR5cGUgU2Vzc2lvbi9NZXNzYWdlIERyaXZlbi9FbnRpdHkuIFRoZSBzYW1lIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgQnVzaW5lc3MgYW5kIDIueCBpbnRlcmZhY2VzCi1KQVZBX0VFXzVfUFJPQkxFTV9NQVJLRVJfUkVTT1VSQ0VfREVDT1JBVE9SPUphdmEgRUUgNSBQcm9qZWN0IFByb2JsZW0gTWFya2VyIFJlc291cmNlIERlY29yYXRvcgotSkFWQV9FRV81X1BST0JMRU1fTUFSS0VSX1JFU09VUkNFX0RFQ09SQVRPUi5ERVNDUklQVElPTj1SZXNvdXJjZSBEZWNvcmF0b3IgZW5hYmxlcyBlcnJvciBtYXJrZXJzIHRvIGJlIHB1dCBvbiB0aGUgcHJvamVjdCBub2RlLgotamVlUHJvamVjdERlY29yYXRvcj1KYXZhIEVFIDUgUHJvamVjdCBEZWNvcmF0b3IKLWplZVByb2plY3REZWNvcmF0b3IuZGVzY3JpcHRpb249RGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBKYXZhIEVFIDUgcHJvamVjdHMgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA3ZTliOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXMiPgotICAgIDx3aXphcmQtcGFnZXMgYWN0aW9uPSJqc3QuZWFyIzUuMCNpbnN0YWxsIj4KLSAgICAgIDxwYWdlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnByb2plY3QuZmFjZXQuRWFySmF2YUVFRmFjZXRJbnN0YWxsUGFnZSIvPgotICAgIDwvd2l6YXJkLXBhZ2VzPgotICA8L2V4dGVuc2lvbj4KLQotICAgCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgIDwvZmFjdG9yeT4KLQotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIgotICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgICA8YWRhcHRlcgotICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIj4KLSAgICAgICAgICAgPC9hZGFwdGVyPgotICAgICAgICA8L2ZhY3Rvcnk+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ij4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQiPgotICAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgPC9mYWN0b3J5PiAgICAgICAKLSAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICA8L2ZhY3Rvcnk+IAotCi0gICA8L2V4dGVuc2lvbj4gIAotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+IAotICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4gCi0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPiAKLSAgICAgICA8L2ZhY3Rvcnk+Ci0KLQkgICAJPGZhY3RvcnkKLQkgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotCSAgICAgCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciI+Ci0JICAgICAJPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4gCi0JCTwvZmFjdG9yeT4KLQkJCi0JCTxmYWN0b3J5Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLQkgICAgIAlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiI+Ci0JICAgICAJPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4gCi0JICAgCTwvZmFjdG9yeT4KLQkgICAJCQotCQk8ZmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0JICAgICAJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4iPgotCSAgICAgCTxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+IAotCSAgIAk8L2ZhY3Rvcnk+CQotCSAgIAkKLQkgICAJPGZhY3RvcnkKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotCSAgICAgCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4iPgotCSAgICAgCTxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+IAotCSAgIAk8L2ZhY3Rvcnk+ICAgICAgIAotICAgPC9leHRlbnNpb24+IAotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMiPgotICAKLSAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnNlcnZlci5lYXIxIgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIi8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotIAotICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIuZWFyMiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lYXI6NS4wIiAvPgotCQkJIDwvYWRhcHQ+Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIuZWFyMyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgICAJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lYXI6NS4wIiAvPgotCQkJIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUuc2VydmVyLmVhcjQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8d2l0aAotICAgICAgICAgICAgICAgICAgdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgPC9leHRlbnNpb24+Ci0KLQotIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UuZXRvb2xzLnNlcnZlci5jb3JlLm1vZHVsZU9iamVjdEFkYXB0ZXJzIC0tPgotPCEtLSBQdXJwb3NlOiBEZWZpbmUgYWRhcHRlcnMgZm9yIFdlYiByZXNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlQXJ0aWZhY3RBZGFwdGVycyI+ICAKLSAgICAKLSAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS53ZWIuc2VydmVyLndlYnJlc291cmNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPiAgICAgCi0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4gCi0gICAgICAgCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS53ZWIuc2VydmVyLndlYnJlc291cmNlMiIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+ICAgICAgCi0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQiLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgCi0gICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUud2ViLnNlcnZlci53ZWJyZXNvdXJjZTMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+ICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3Qud2ViOjIuNSIgLz4KLQkJCSA8L2FkYXB0PgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+ICAgICAKLSAgICAgICAKLSAgICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUud2ViLnNlcnZlci53ZWJyZXNvdXJjZTQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgICA8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LndlYjoyLjUiIC8+Ci0JCQkgPC9hZGFwdD4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS53ZWIuc2VydmVyLndlYnJlc291cmNlNSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCI+Ci0gICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24ucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3Qud2ViOjIuNSIgLz4gICAgICAgICAgICAgCi0gICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFB1cnBvc2U6IERlZmluZSBhZGFwdGVycyBmb3IgRUpCIHJlc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMiPgotICAgICAgIAotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnNlcnZlci5lamIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5zZXJ2ZXIuZWpiMiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4iLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgIAotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUuc2VydmVyLmVqYjMiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ii8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUuc2VydmVyLmVqYjQiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lamI6My4wIiAvPgotCQkJIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUuc2VydmVyLmVqYjUiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWpiOjMuMCIgLz4KLQkJCSA8L2FkYXB0PgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgIAotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnNlcnZlci5lamI2IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgIAotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnNlcnZlci5lamI3IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuIi8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMiPgotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIuZWpiIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPHdpdGgKLSAgICAgICAgICAgICAgICAgIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWpiOjMuMCI+Ci0gICAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnNlcnZlci5lamI3NyI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDx3aXRoCi0gICAgICAgICAgICAgICAgICB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkdyb3VwRUpCUHJvdmlkZXIiPgotICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLkNyZWF0ZURlcGxveW1lbnRGaWxlc0FjdGlvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5DcmVhdGVEZXBsb3ltZW50RmlsZXNBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvZGVwX2Rlc2MuZ2lmIgotICAgICAgICAgICAgICAgaWQ9ImNyZWF0ZURlcGxveW1lbnRGaWxlcyIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlY3JlYXRlX2RlcGxveV9maWxlcyIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJqYXZlZVVJUG9wdXBNZW51Q2F0ZWdvcnkvc2xvdDIiPgotCQk8L2FjdGlvbj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAJICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lamI6WzMuMCIgLz4KLQkJCQkgIDwvYWRhcHQ+Ci0JCQkJICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWI6WzIuNSIgLz4KLQkJCQkgIDwvYWRhcHQ+Ci0JCQkJICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lYXI6WzUuMCIgLz4KLQkJCQkgIDwvYWRhcHQ+Ci0JCQkJICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5hcHBjbGllbnQ6WzUuMCIgLz4KLQkJCQkgIDwvYWRhcHQ+Ci0JCSAgICA8L29yPgotICAgICAgICAgPC9lbmFibGVtZW50PiAgICAgICAgIAkJICAgCQkKLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9InNob3dfZGVwX3Byb3BfcGFnZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLk1vZHVsZXNOb2RlIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuU2hvd0RlcFByb3BQYWdlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJzaG93X2RlcF9wcm9wX3BhZ2UiCi0gICAgICAgICAgICAgICBsYWJlbD0iQWRkL1JlbW92ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuT3BlcmF0aW9uRXh0ZW5zaW9uIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQiPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsT3BlcmF0aW9uIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkLkIiCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5BIi8+Ci0gCi0gCTwvZXh0ZW5zaW9uPgotICAgIC0tPgotICAgIDxleHRlbnNpb24gIAotCSAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLSAgIDxuYXZpZ2F0b3JDb250ZW50Ci0gICAgICAgICBhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0gICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkVqYjNDb250ZW50UHJvdmlkZXIiCi0gICAgICAgICBpY29uPSJpY29ucy9lamJncm91cF9vYmouZ2lmIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuZWpiIgotICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuRWpiM0xhYmVsUHJvdmlkZXIiCi0gICAgICAgICBuYW1lPSJKRUUgTmF2aWdhdG9yIENvbnRlbnQgRUpCIgotICAgICAgICAgcHJpb3JpdHk9ImhpZ2hlc3QiPgotICAgICA8dHJpZ2dlclBvaW50cz4KLSAgICAgICAgPG9yPgotICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC5lamI6My4wIi8+Ci0gICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC5hcHBjbGllbnQ6NS4wIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICA8L2FkYXB0PgotCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlIiAvPgotCQkgCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGUiIC8+Ci0gIAkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0IiAvPgotICAgPGluc3RhbmNlb2YKLSAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXIiPgotICAgPC9pbnN0YW5jZW9mPgotICAgPGluc3RhbmNlb2YKLSAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgIDwvb3I+Ci0gICAgIDwvdHJpZ2dlclBvaW50cz4KLSAgICAgPHBvc3NpYmxlQ2hpbGRyZW4+Ci0gICAgICAgIDxvcj4KLQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZSIgLz4KLQkJIAk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlIiAvPgotICAJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdCIgLz4KLSAgIDxpbnN0YW5jZW9mCi0gICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyIj4KLSAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgPC9vcj4KLSAgICAgPC9wb3NzaWJsZUNoaWxkcmVuPgotICAgIAotCi0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkiCi0gICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkFkZFNlc3Npb25CZWFuV2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkdyb3VwRWpiU2Vzc2lvbiI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5JbnRlcmZhY2VOb2RlIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlIj4KLSAgICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmJlYW5UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iaXNTZXNzaW9uQmVhbiI+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aSIKLSAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aS5pbnRlcm5hbC53aXphcmQuQWRkTWVzc2FnZURyaXZlbkJlYW5XaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkdyb3VwRUpCUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFamJNZXNzYWdlRHJpdmVuIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4iPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGUiPgotICAgICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuYmVhblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJpc01lc3NhZ2VEcml2ZW5CZWFuIj4KLSAgICAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPjwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIAotICAgICAKLSAgICAgPGFjdGlvblByb3ZpZGVyCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5KRUVBY3Rpb25Qcm92aWRlciIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUudWkuSkVFQWN0aW9uUHJvdmlkZXIiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RERE5vZGUiLz4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuTm9kZSIvPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5JbnRlcmZhY2VOb2RlIi8+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0IiAvPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5hcHBjbGllbnQuR3JvdXBBcHBDbGllbnRQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2FjdGlvblByb3ZpZGVyPgotICAgICAKLQotICAgICA8YWN0aW9uUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuTmV3QWN0aW9uUHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5KRUVOZXdBY3Rpb25zIj4KLQkJCTxlbmFibGVtZW50PgotICAgIDxvcj4KLSAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZSI+Ci0gICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlciI+Ci0gICAgICAgPC9pbnN0YW5jZW9mPgotCi0gICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyIj4KLSAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkFic3RyYWN0U3ViV2ViUHJvdmlkZXJzIj4KLSAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgIDwvaW5zdGFuY2VvZj48L29yPgotCQkJPC9lbmFibGVtZW50PgotCSA8L2FjdGlvblByb3ZpZGVyPgotICAgIAotICAgICA8YWN0aW9uUHJvdmlkZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5SZXNvdXJjZU1nbXRBY3Rpb25Qcm92aWRlciIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5KRUVSZXNvdXJjZU1nbXRBY3Rpb24iPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RERE5vZGUiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2FjdGlvblByb3ZpZGVyPgotICAgICA8YWN0aW9uUHJvdmlkZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5Xb3JrTWFuYWdlbWVudEFjdGlvblByb3ZpZGVyIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLkpFRVdvcmtNZ210QWN0aW9uIj4KLSAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotCi0JCSAgICAgICA8aW5zdGFuY2VvZgotCQkgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3QiPgotCQkgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICA8L2FkYXB0PgotCi0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSAgICAgPGFjdGlvblByb3ZpZGVyCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuUG9ydGluZ0FjdGlvblByb3ZpZGVyIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLkpFRVBvcnRpbmdBY3Rpb24iPgotICAgICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RERE5vZGUiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2FjdGlvblByb3ZpZGVyPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLmV4cG9ydDEiCi0gICAgICAgICAgIHR5cGU9ImV4cG9ydCIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkVKQkNvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFSkJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgCSAKLSAgICAgCSAKLSAgPC9uYXZpZ2F0b3JDb250ZW50PgotICAKLSAgPG5hdmlnYXRvckNvbnRlbnQKLSAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5XZWIyNUNvbnRlbnRQcm92aWRlciIKLSAgICAgICAgaWNvbj0iaWNvbnMvd2ViZ3JvdXBfb2JqLmdpZiIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkud2ViIgotICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5XZWIyNUxhYmVsUHJvdmlkZXIiCi0gICAgICAgIG5hbWU9IkpFRSBOYXZpZ2F0b3IgQ29udGVudCBXRUIiCi0gICAgICAgIHByaW9yaXR5PSJoaWdoZXN0Ij4KLSAgICAgPHRyaWdnZXJQb2ludHM+Ci0gICAgICAgIDxvcj4KLSAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3Qud2ViOjIuNSIvPgotICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICA8L2FkYXB0PgotICAgPGluc3RhbmNlb2YKLSAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgPC9pbnN0YW5jZW9mPgotICAgPGluc3RhbmNlb2YKLSAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXIiPgotICAgPC9pbnN0YW5jZW9mPgotICAgICAgICA8L29yPgotICAgICA8L3RyaWdnZXJQb2ludHM+Ci0gICAgIDxwb3NzaWJsZUNoaWxkcmVuPgotICAgICAgICA8b3I+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXIiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXJ0aWZhY3ROb2RlIj4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3QiPgotICAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgPC9vcj4KLSAgICAgPC9wb3NzaWJsZUNoaWxkcmVuPgotICAgICAKLSAgICAgCi0gICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLlJlc291cmNlTWdtdEFjdGlvblByb3ZpZGVyIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLkpFRVdlYlJlc291cmNlTWdtdEFjdGlvbiI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuQWJzdHJhY3RTdWJXZWJQcm92aWRlcnMiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDwhLS08aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPi0tPgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLldvcmtNYW5hZ2VtZW50QWN0aW9uUHJvdmlkZXIiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuSkVFV2ViV3JrTW5nbW50QWN0aW9uIj4KLSAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5BYnN0cmFjdFN1YldlYlByb3ZpZGVycyI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLQotCQkgICAgICAgPGluc3RhbmNlb2YKLQkJICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0Ij4KLQkJICAgICAgIDwvaW5zdGFuY2VvZj4KLQotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLlBvcnRpbmdBY3Rpb25Qcm92aWRlciIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5KRUVXZWJQb3J0aW5nQWN0aW9uIj4KLSAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5BYnN0cmFjdFN1YldlYlByb3ZpZGVycyI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPi0tPgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgIAotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLndlYmNsYXNzIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkU2VydmxldFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmciPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDwvb3I+PC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS53ZWJjbGFzcyIKLSAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZEZpbHRlcldpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBGaWx0ZXJzSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmciPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0Ij4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8L29yPjwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkud2ViY2xhc3MiCi0gICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRMaXN0ZW5lcldpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPC9vcj48L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3Qud2ViLmV4cG9ydCIKLSAgICAgICAgICAgdHlwZT0iZXhwb3J0IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gIDwvbmF2aWdhdG9yQ29udGVudD4KLSAgPG5hdmlnYXRvckNvbnRlbnQKLSAgICAgICAgYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkVhcjVDb250ZW50UHJvdmlkZXIiCi0gICAgICAgIGljb249Imljb25zL2Vhcmdyb3VwX29iai5naWYiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmVhciIKLSAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuRWFyNUxhYmVsUHJvdmlkZXIiCi0gICAgICAgIG5hbWU9IkpFRSBOYXZpZ2F0b3IgQ29udGVudCBFQVIiCi0gICAgICAgIHByaW9yaXR5PSJoaWdoZXN0Ij4KLSAgICAgPHRyaWdnZXJQb2ludHM+Ci0gICAgICAgIDxvcj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkJ1bmRsZWROb2RlIj4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWFyOjUuMCI+Ci0gICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Nb2R1bGVzTm9kZSI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5CdW5kbGVkTGlic05vZGUiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgIDwvb3I+Ci0gICAgIDwvdHJpZ2dlclBvaW50cz4KLSAgICAgPHBvc3NpYmxlQ2hpbGRyZW4+Ci0gICAgICAgIDxvcj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9ImphdmEuaW8uRmlsZSI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3Qud2ViIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWpiIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QudXRpbGl0eSI+Ci0gICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmVhciI+Ci0gICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmFwcGNsaWVudCI+Ci0gICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmNvbm5lY3RvciI+Ci0gICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Nb2R1bGVzTm9kZSIvPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkJ1bmRsZWROb2RlIi8+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5GaWxlIj4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmFyUGFja2FnZUZyYWdtZW50Um9vdCI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlByb2plY3QiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlIj4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICA8L29yPgotICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0gICAgIDxjb21tb25Tb3J0ZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5BcHBsaWNhdGlvbjVWaWV3ZXJTb3J0ZXIiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLm5hdmlnYXRvci5pbnRlcm5hbC5BcHBsaWNhdGlvblZpZXdlclNvcnRlciI+Ci0gICAgIDwvY29tbW9uU29ydGVyPgotICAgICA8ZHJvcEFzc2lzdGFudAotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZG5kLkFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLm5hdmlnYXRvci51aS5BZGRNb2R1bGVzVG9FQVIiPgotICAgICAgICA8cG9zc2libGVEcm9wVGFyZ2V0cz4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWFyIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5BYnN0cmFjdEVhck5vZGUiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9wb3NzaWJsZURyb3BUYXJnZXRzPgotICAgICA8L2Ryb3BBc3Npc3RhbnQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkiCi0gICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkucHJvamVjdC5mYWNldC5FamJQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj48L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYlByb2plY3RXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LkVhclByb2plY3RXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LmFwcGNsaWVudC5BcHBDbGllbnRQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVhci51aSIKLSAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JQcm9qZWN0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVhci51aS5leHBvcnQiCi0gICAgICAgICAgIHR5cGU9ImV4cG9ydCIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRFeHBvcnRXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpLmltcG9ydCIKLSAgICAgICAgICAgdHlwZT0iaW1wb3J0IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkuaW1wb3J0IgotICAgICAgICAgICB0eXBlPSJpbXBvcnQiCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVhci51aS5pbXBvcnQiCi0gICAgICAgICAgIHR5cGU9ImltcG9ydCIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldyI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkuaW1wb3J0IgotICAgICAgICAgICB0eXBlPSJpbXBvcnQiCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5FSkJDb21wb25lbnRJbXBvcnRXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpLmltcG9ydCIKLSAgICAgICAgICAgdHlwZT0iaW1wb3J0IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEltcG9ydFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkuaW1wb3J0IgotICAgICAgICAgICB0eXBlPSJpbXBvcnQiCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gIDwvbmF2aWdhdG9yQ29udGVudD4KLSAgPG5hdmlnYXRvckNvbnRlbnQKLSAgICAgICAgYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFwcENsaWVudDVDb250ZW50UHJvdmlkZXIiCi0gICAgICAgIGljb249Imljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmFwcGNsaWVudCIKLSAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQXBwQ2xpZW50NUxhYmVsUHJvdmlkZXIiCi0gICAgICAgIG5hbWU9IkpFRSBOYXZpZ2F0b3IgQ29udGVudCBBcHAgQ2xpZW50IgotICAgICAgICBwcmlvcml0eT0iaGlnaGVzdCI+Ci0gICAgIDx0cmlnZ2VyUG9pbnRzPgotICAgICAgICA8b3I+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmFwcGNsaWVudDo1LjAiPgotICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0Ij4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICA8L29yPgotICAgICA8L3RyaWdnZXJQb2ludHM+Ci0gICAgIDxwb3NzaWJsZUNoaWxkcmVuPgotICAgICAgICA8b3I+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0Ij4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC5hcHBjbGllbnQ6NS4wIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICA8L29yPgotICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0gIDwvbmF2aWdhdG9yQ29udGVudD4KLQk8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxhZGFwdGVyCi0gICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIj4KLSAgICAgICAgIDwvYWRhcHRlcj4KLSAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxhZGFwdGVyCi0gICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIj4KLSAgICAgICAgIDwvYWRhcHRlcj4KLSAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGFkYXB0ZXIKLSAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiPgotICAgICAgICAgPC9hZGFwdGVyPgotICAgICAgPC9mYWN0b3J5PgotICAgICAgCi0gICAgCi0gICAgPGZhY3RvcnkKLSAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0IgotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUVNRkFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgotICAgICAgPHZpZXdlckFjdGlvbkJpbmRpbmcgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiPgotICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgPGFjdGlvbkV4dGVuc2lvbiBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLnVpLkpFRUFjdGlvblByb3ZpZGVyIi8+Ci0gICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgPC92aWV3ZXJBY3Rpb25CaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iVE9QX1JJR0hUIgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICBsYWJlbD0iJUVOVEVSUFJJU0VfQkVBTl9ERUNPUkFUT1IiCi0gICAgICAgICAgICBzdGF0ZT0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbkRlY29yYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbkRlY29yYXRvciI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbkludGVyZmFjZU5vZGUiPgotICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlIj4KLSAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlRU5URVJQUklTRV9CRUFOX0RFQ09SQVRPUi5ERVNDUklQVElPTgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgPC9leHRlbnNpb24+ICAKLSAgICAgIDxleHRlbnNpb24KLSAgIAkJIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld2VyIj4KLSAgICAgIDx2aWV3ZXJDb250ZW50QmluZGluZwotICAgICAgICAgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiPgotICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICA8Y29udGVudEV4dGVuc2lvbiBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLioiLz4KLSAgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24gcGF0dGVybj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5maWx0ZXJzLioiLz4KLSAgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24KLSAgICAgICAgICAgICAgICAgcGF0dGVybj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuKiI+Ci0gICAgICAgICAgIDwvY29udGVudEV4dGVuc2lvbj4KLSAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3ZpZXdlckNvbnRlbnRCaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICAgIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICBMYWJlbCBEZWNvcmF0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbG9jYXRpb249IlRPUF9MRUZUIgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICBsYWJlbD0iJWplZVByb2plY3REZWNvcmF0b3IiCi0gICAgICAgICAgICBzdGF0ZT0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVByb2plY3REZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSkVFUHJvamVjdERlY29yYXRvciI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+Ci0gICAgICAgICAgICA8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ii8+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlamVlUHJvamVjdERlY29yYXRvci5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGxhYmVsPSIlSkFWQV9FRV81X1BST0JMRU1fTUFSS0VSX1JFU09VUkNFX0RFQ09SQVRPUiIKLSAgICAgICAgICAgIHN0YXRlPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpkdC51aS5Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUubmF2aWdhdG9yLnVpLmphdmEucmVzb3VyY2UuZGVjb3JhdG9yIj4KLSAgICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4gCi0gICAgICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlSkFWQV9FRV81X1BST0JMRU1fTUFSS0VSX1JFU09VUkNFX0RFQ09SQVRPUi5ERVNDUklQVElPTgotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlUHJvcGVydHlUZXN0ZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5CZWFuTm9kZVByb3BlcnR5VGVzdGVyIgotICAgICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpIgotICAgICAgICAgICAgcHJvcGVydGllcz0iYmVhblR5cGUiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGUiPgotICAgICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgIDwvZXh0ZW5zaW9uPiAgCi0gICAgICAKLSAgICAgIAotICAgICAgCi0gICA8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9DcmVhdGVEZXBsb3ltZW50RmlsZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL0NyZWF0ZURlcGxveW1lbnRGaWxlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmM2MxZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL0NyZWF0ZURlcGxveW1lbnRGaWxlc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuSUFwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0LklDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldC5JRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuSUVhckNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0LklXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIHJhbWFuZGF5Ci0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRGVwbG95bWVudEZpbGVzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24gYWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgYVNlbGVjdGlvbik7Ci0JCWJvb2xlYW4gaXNFbmFibGVkID0gZmFsc2U7Ci0JCWlmIChhU2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFTZWxlY3Rpb247Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJaXNFbmFibGVkID0gaXNWYWxpZFNlbGVjdGlvbihwcm9qZWN0LCBudWxsKTsKLQkJfQotCQlzZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRTZWxlY3Rpb24oSVByb2plY3QgcHJvamVjdCwgU2hlbGwgc2hlbGwpIHsKLQkJcmV0dXJuIChwcm9qZWN0ICE9IG51bGwKLQkJCQkmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pFRVByb2plY3QocHJvamVjdCkKLQkJCQkmJiAhaGFzRGVwbG95bWVudERlc2NyaXB0b3IocHJvamVjdCwgc2hlbGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaW5mb3JtSW52YWxpZFNlbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5mb3JtSW52YWxpZFNlbGVjdGlvbihTaGVsbCBzaGVsbCkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihzaGVsbCwgTWVzc2FnZXMuSU5WQUxJRF9ERVBfREVTQ19TRUxFQ1RJT05fVElUTEUsCi0JCQkJTWVzc2FnZXMuSU5GT1JNX0lOVkFMSURfREVQX0RFU0NfU0VMRUNUSU9OKTsgIAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNEZXBsb3ltZW50RGVzY3JpcHRvcihJUHJvamVjdCBwcm9qZWN0LCBTaGVsbCBzaGVsbCkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCUlQYXRoIGRkRmlsZVBhdGggPSBudWxsOwotCQlpZihKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkpewotCQkJZGRGaWxlUGF0aCA9IG5ldyBQYXRoKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKTsKLQkJfSBlbHNlIGlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChwcm9qZWN0KSl7Ci0JCQlkZEZpbGVQYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKTsKLQkJfSBlbHNlIGlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpewotCQkJZGRGaWxlUGF0aCA9IG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSk7Ci0JCX0gZWxzZSBpZihKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0KSl7Ci0JCQlkZEZpbGVQYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSk7Ci0JCX0KLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmKGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkgIT0gbnVsbAotCQkJCSYmIGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpICE9IG51bGwpewotCQkJSUZpbGUgZGRYbWxGaWxlID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCkuZ2V0RmlsZShkZEZpbGVQYXRoKTsKLQkJCXJldCA9IGRkWG1sRmlsZS5leGlzdHMoKTsKLQkJCWlmKHNoZWxsICE9IG51bGwgJiYgcmV0KQotCQkJCWluZm9ybUludmFsaWRTZWxlY3Rpb24oc2hlbGwpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0KLQkvKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQlpZiAoIXZhbGlkYXRlU2VsZWN0aW9uKHByb2plY3QsIHNoZWxsKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWdldERhdGFNb2RlbChwcm9qZWN0KS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZSggbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKElQcm9qZWN0IHByb2plY3QpIHsKLQkJQ2xhc3MgZGF0YU1vZGVsQ2xhc3MgPSBudWxsOwotCQlpZihKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkpewotCQkJZGF0YU1vZGVsQ2xhc3MgPSBJRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5jbGFzczsKLQkJfSBlbHNlIGlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChwcm9qZWN0KSl7Ci0JCQlkYXRhTW9kZWxDbGFzcyA9IElFSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmNsYXNzOwotCQl9IGVsc2UgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSl7Ci0JCQlkYXRhTW9kZWxDbGFzcyA9IElXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmNsYXNzOwotCQl9IGVsc2UgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvamVjdCkpewotCQkJZGF0YU1vZGVsQ2xhc3MgPSBJQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5jbGFzczsKLQkJfQotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKGRhdGFNb2RlbENsYXNzKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9QUk9KRUNULCBwcm9qZWN0KTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlU2VsZWN0aW9uKElQcm9qZWN0IHByb2plY3QsIFNoZWxsIHNoZWxsKSB7Ci0JCWJvb2xlYW4gdmFsaWRTZWxlY3Rpb24gPSB0cnVlOwotCQlpZiAoIWlzVmFsaWRTZWxlY3Rpb24ocHJvamVjdCwgc2hlbGwpKSB7Ci0JCQl2YWxpZFNlbGVjdGlvbiA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiB2YWxpZFNlbGVjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjMyYWE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX0RFUF9ERVNDX1NFTEVDVElPTl9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTkZPUk1fSU5WQUxJRF9ERVBfREVTQ19TRUxFQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVQTE9ZTUVOVF9ERVNDUklQVE9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFU1NJT05fQkVBTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX0JFQU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfRFJJVkVOX0JFQU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5URVJQUklTRV9CRUFOX0NMQVNTX0RFU0NSSVBUSU9OOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfSVRFTV9QUk9WSURFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMSVNURU5FUl9JVEVNX1BST1ZJREVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTFRFUlNfSVRFTV9QUk9WSURFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGSUxURVJfTUFQUElOR19JVEVNX1BST1ZJREVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfTUFQUElOR19JVEVNX1BST1ZJREVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1BBR0VTX0lURU1fUFJPVklERVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0VMQ09NRV9QQUdFU19JVEVNX1BST1ZJREVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTlRFWFRfUEFSQU1TX0lURU1fUFJPVklERVI7Ci0JCi0JCi0JCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVGRVJFTkNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVU5ETEVEX0xJQlJBUklFU19OT0RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExJQlJBUllfRElSRUNUT1JZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVBUl9NT0RVTEVTX05PREU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUpCTE9DQUxfUkVGRVJFTkNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFSkJfUkVGRVJFTkNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlZJUk9NRU5UX0VOVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfRU5WSVJPTUVOVF9FTlRSSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX1JFRkVSRU5DRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9SRUZFUkVOQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfVGhlX2RyYWdnZWRfcHJvamVjdF9jYW5ub3RfYmVfYWRkZWRfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfVGhlX3Byb2plY3RfMF9jYW5ub3RfYmVfYWNjZXNzZV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfYWRkX21vZHVsZV90b19FbnRlcnByaXNlXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRNb2R1bGVUb0VhckRyb3BBc3Npc3RhbnRfQWRkaW5nX21vZHVsZV90b19lYV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0SkVFTW9kdWxlRHJvcEFzc2lzdGFudF9JbXBvcnRpbmdfSmF2YV9FbnRlcnByaXNlX0VkaXRpb25fYXJ0aWZhY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydEpFRU1vZHVsZURyb3BBc3Npc3RhbnRfQ291bGRfbm90X3JlY29nbml6ZV9leHRlbnNpb25fMF87Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzZGQ2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTgsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBFSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSBleHRlbmRzIE1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXXtJTGF1bmNoYWJsZS5jbGFzc307Ci0JfQotCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBFSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyVXRpbC5nZXRNb2R1bGVPYmplY3Qob2JqKTsKLQl9Ci0JcHVibGljIElNb2R1bGVBcnRpZmFjdFtdIGdldE1vZHVsZUFydGlmYWN0cyhPYmplY3Qgb2JqKSB7Ci0JCQotCQkgaWYgKG9iaiBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKQotCQkJcmV0dXJuIEVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJVdGlsLmdldE1vZHVsZU9iamVjdHMoKFNlc3Npb25CZWFuKSBvYmopOwotCQkgSU1vZHVsZUFydGlmYWN0IGFydGlmYWN0ID0gZ2V0TW9kdWxlQXJ0aWZhY3Qob2JqKTsKLQkJCWlmIChhcnRpZmFjdCAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgSU1vZHVsZUFydGlmYWN0W10geyBhcnRpZmFjdCB9OwotCQkgcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjVmNTY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuSkVFRmxleFByb2pEZXBsb3lhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5FSkJCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLk51bGxNb2R1bGVBcnRpZmFjdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIEVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJVdGlsIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRUpCRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIuCi0JICovCi0JcHVibGljIEVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFSkJKYXIpCi0JCQlyZXR1cm4gZ2V0TW9kdWxlT2JqZWN0KChFSkJKYXIpIG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKQotCQkJcmV0dXJuIGdldE1vZHVsZU9iamVjdCgoU2Vzc2lvbkJlYW4pIG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKQotCQkJcmV0dXJuIGdldE1vZHVsZU9iamVjdCgoTWVzc2FnZURyaXZlbkJlYW4pIG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVudGl0eUJlYW4pCi0JCQlyZXR1cm4gZ2V0TW9kdWxlT2JqZWN0KChFbnRpdHlCZWFuKSBvYmopOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJUHJvamVjdCkgCi0JCQlyZXR1cm4gIGdldE1vZHVsZU9iamVjdCgoSVByb2plY3QpIG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgCi0JCQlyZXR1cm4gIGdldE1vZHVsZU9iamVjdCgoKElKYXZhUHJvamVjdCkgb2JqKS5nZXRQcm9qZWN0KCkpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJRmlsZSkKLQkJCXJldHVybiBnZXRNb2R1bGVPYmplY3QoKElGaWxlKSBvYmopOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQotCQkJcmV0dXJuIGdldE1vZHVsZU9iamVjdCgoSUNvbXBpbGF0aW9uVW5pdCkgb2JqKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc0ludGVyZXN0ZWRDb21wb25lbnRzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCi0JCXRyeSB7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBjdS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCWlmIChoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhwcm9qZWN0KSkgewotCQkJCXJldHVybiBnZXRNb2R1bGVKYXZhT2JqZWN0KGZpbGUpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChFSkJKYXIgZWpiSmFyKSB7Ci0JCUlNb2R1bGUgZGVwID0gZ2V0TW9kdWxlKChFT2JqZWN0KWVqYkphcik7Ci0JCXJldHVybiBjcmVhdGVNb2R1bGVPYmplY3QoZGVwLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChTZXNzaW9uQmVhbiBlamIpIHsKLQkJSU1vZHVsZSBkZXAgPSBnZXRNb2R1bGUoKEVPYmplY3QpZWpiKTsKLQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU9iamVjdChkZXAsIGVqYi5nZXRFamJOYW1lKCksIGZhbHNlLCBmYWxzZSk7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChFbnRpdHlCZWFuIGVqYikgewotCQlJTW9kdWxlIGRlcCA9IGdldE1vZHVsZSgoRU9iamVjdCllamIpOwotCQlyZXR1cm4gY3JlYXRlTW9kdWxlT2JqZWN0KGRlcCwgZWpiLmdldEVqYk5hbWUoKSwgZmFsc2UsIGZhbHNlKTsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KE1lc3NhZ2VEcml2ZW5CZWFuIGVqYikgewotCQlJTW9kdWxlIGRlcCA9IGdldE1vZHVsZSgoRU9iamVjdCllamIpOwotCQlyZXR1cm4gY3JlYXRlTW9kdWxlT2JqZWN0KGRlcCwgZWpiLmdldEVqYk5hbWUoKSwgZmFsc2UsIGZhbHNlKTsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3RbXSBnZXRNb2R1bGVPYmplY3RzKFNlc3Npb25CZWFuIGVqYikgewotCQlMaXN0IG1vZEFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU1vZHVsZSBkZXAgPSBnZXRNb2R1bGUoKEVPYmplY3QpZWpiKTsKLQkJTGlzdCBidXNMb2NhbHMgPSBlamIuZ2V0QnVzaW5lc3NMb2NhbHMoKTsKLQkJTGlzdCBidXNSZW1vdGVzID0gZWpiLmdldEJ1c2luZXNzUmVtb3RlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYnVzTG9jYWxzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBsb2NhbE5hbWUgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQltb2RBcnRpZmFjdHMuYWRkKGNyZWF0ZU1vZHVsZU9iamVjdEZvclNlc3Npb25CZWFuKGRlcCwgZWpiLmdldEVqYk5hbWUoKSwgbG9jYWxOYW1lLCBmYWxzZSx0cnVlKSk7Ci0JCQkKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYnVzUmVtb3Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcmVtb3RlTmFtZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1vZEFydGlmYWN0cy5hZGQoY3JlYXRlTW9kdWxlT2JqZWN0Rm9yU2Vzc2lvbkJlYW4oZGVwLCBlamIuZ2V0RWpiTmFtZSgpLCByZW1vdGVOYW1lLCB0cnVlLCBmYWxzZSkpOwotCQl9Ci0JCXJldHVybiAoSU1vZHVsZUFydGlmYWN0W10pbW9kQXJ0aWZhY3RzLnRvQXJyYXkobmV3IElNb2R1bGVBcnRpZmFjdFttb2RBcnRpZmFjdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGhhc0ludGVyZXN0ZWRDb21wb25lbnRzKHByb2plY3QpKSB7Ci0JCQlJTW9kdWxlIGRlcCA9IGdldE1vZHVsZShwcm9qZWN0LCBudWxsKTsKLQkJCXJldHVybiBjcmVhdGVNb2R1bGVPYmplY3QoZGVwLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChJRmlsZSBmaWxlKSB7Ci0JCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhmaWxlKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlc1swXSAhPSBudWxsIHx8IHJlc291cmNlcy5sZW5ndGggPD0gMCkKLQkJCWNvbXBvbmVudCA9IHJlc291cmNlc1swXS5nZXRDb21wb25lbnQoKTsKLQkJaWYgKGhhc0ludGVyZXN0ZWRDb21wb25lbnRzKGZpbGUuZ2V0UHJvamVjdCgpKSkgewotCQkJU3RyaW5nIGV4dCA9IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJaWYgKCJqYXZhIi5lcXVhbHMoZXh0KSB8fCAiY2xhc3MiLmVxdWFscyhleHQpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlSmF2YU9iamVjdChmaWxlKTsKLQkJCWlmIChmaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpLmVuZHNXaXRoKEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSSkpCi0JCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU9iamVjdChnZXRNb2R1bGUoZmlsZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShFT2JqZWN0IHJlZk9iamVjdCkgewotCQlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHJlZk9iamVjdCk7Ci0JCVJlc291cmNlIHJlZlJlc291cmNlID0gcmVmT2JqZWN0LmVSZXNvdXJjZSgpOwotCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gbnVsbDsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSBlY2xpcGVTZXJ2UmVzb3J1Y2UgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlZlJlc291cmNlKTsKLQkJCXJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGVjbGlwZVNlcnZSZXNvcnVjZSk7Ci0JCQlpZiAocmVzb3VyY2VzWzBdICE9IG51bGwpCi0JCQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gZ2V0TW9kdWxlKHByb2osIGNvbXBvbmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0LCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhKMkVFUHJvamVjdFV0aWxpdGllcy5FSkIpKS5pdGVyYXRvcigpOyAgCi0JCVN0cmluZyBjb21wb25lbnROYW1lID0gbnVsbDsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKQotCQkJY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBnZXRNb2R1bGVQcm9qZWN0KHByb2plY3QsIGl0ZXJhdG9yKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlkZXBsb3lhYmxlID0gKElNb2R1bGUpIG5leHQ7Ci0JCQkJaWYgKGRlcGxveWFibGUuZ2V0TmFtZSgpLmVxdWFscyhjb21wb25lbnROYW1lKSkgewotCQkJCQlyZXR1cm4gZGVwbG95YWJsZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0JCUlNb2R1bGUgZGVwbG95YWJsZSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJZGVwbG95YWJsZSA9IChJTW9kdWxlKSBuZXh0OwotCQkJCWlmIChkZXBsb3lhYmxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpCi0JCQkJCXJldHVybiBkZXBsb3lhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlSmF2YU9iamVjdChJRmlsZSBmaWxlKSB7Ci0KLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpZmlsZS5nZXRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50LmNsYXNzKTsKLQkJCS8vIFRPRE8gd2hhdCBkbyB3ZSByZXR1cm4gZm9yIEphdmEgY2xhc3M/Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGNyZWF0ZU1vZHVsZU9iamVjdChJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGVqYk5hbWUsIGJvb2xlYW4gcmVtb3RlLCBib29sZWFuIGxvY2FsKSB7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGpuZGlOYW1lID0gbnVsbDsKLQkJCWlmIChlamJOYW1lICE9IG51bGwpIHsKLQkJCQltb2R1bGUubG9hZEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCUpFRUZsZXhQcm9qRGVwbG95YWJsZSBtb2R1bGVEZWxlZ2F0ZSA9IChKRUVGbGV4UHJvakRlcGxveWFibGUpbW9kdWxlLmdldEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MpOwotCQkJCWpuZGlOYW1lID0gbW9kdWxlRGVsZWdhdGUuZ2V0Sk5ESU5hbWUoZWpiTmFtZSk7Ci0JCQkJcmV0dXJuIG5ldyBFSkJCZWFuKG1vZHVsZSwgam5kaU5hbWUsIHJlbW90ZSwgbG9jYWwsRUpCQmVhbi5FSkJfMzApOwotCQkJfQotCQkJcmV0dXJuIG5ldyBOdWxsTW9kdWxlQXJ0aWZhY3QobW9kdWxlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBjcmVhdGVNb2R1bGVPYmplY3RGb3JTZXNzaW9uQmVhbihJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGVqYk5hbWUsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBib29sZWFuIHJlbW90ZSwgYm9vbGVhbiBsb2NhbCkgewotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBqbmRpTmFtZSA9IG51bGw7Ci0JCQlpZiAoZWpiTmFtZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlKRUVGbGV4UHJvakRlcGxveWFibGUgbW9kdWxlRGVsZWdhdGUgPSAoSkVFRmxleFByb2pEZXBsb3lhYmxlKW1vZHVsZS5nZXRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzKTsKLQkJCQlqbmRpTmFtZSA9IG1vZHVsZURlbGVnYXRlLmdldEpORElOYW1lKGVqYk5hbWUsIGludGVyZmFjZU5hbWUpOwotCQkJCXJldHVybiBuZXcgRUpCQmVhbihtb2R1bGUsIGpuZGlOYW1lLCByZW1vdGUsIGxvY2FsLEVKQkJlYW4uRUpCXzMwLCBpbnRlcmZhY2VOYW1lKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgTnVsbE1vZHVsZUFydGlmYWN0KG1vZHVsZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlQWRhcHRlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlQWRhcHRlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0OWI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZUFkYXB0ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5OdWxsTW9kdWxlQXJ0aWZhY3Q7Ci0KLS8qKgotICogQ3JlYXRlcyB0aGUgT2JqZWN0IGFkYXB0ZXIgZm9yIGVhciBwcm9qZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIEVudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIuCi0JICovCi0JcHVibGljIEVudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ly8gRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIKLQotCS8qKgotCSAqIEdldHMgdGhlIG9iamVjdCBmb3IgYSB0eXBlIG9mIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmogLSBPYmplY3QgdG8gYWRhcHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uKQotCQkJcmV0dXJuIGdldE1vZHVsZU9iamVjdCgoQXBwbGljYXRpb24pIG9iaik7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJldHVybiBnZXRNb2R1bGVPYmplY3QoKElQcm9qZWN0KSBvYmopOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSUZpbGUpCi0JCQlyZXR1cm4gZ2V0TW9kdWxlT2JqZWN0KChJRmlsZSkgb2JqKTsKLQkJcmV0dXJuIG51bGw7Ci0JfS8vIGdldERlcGxveWFibGVPYmplY3QKLQotCS8qKgotCSAqIEdldHMgdGhlIGRlcGxveWFibGUgb2JqZWN0IGZvciBlYXIgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIEFwcGxpY2F0aW9uCi0JICogICAgICAgICAgICBhcHBsaWNhdGlvbiAtIEVBUiBpbnN0YW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKLQkJSU1vZHVsZSBkZXAgPSBnZXRNb2R1bGUoKEVPYmplY3QpYXBwbGljYXRpb24pOwotCQlyZXR1cm4gY3JlYXRlTW9kdWxlT2JqZWN0KGRlcCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVwbG95YWJsZSBvYmplY3QgZm9yIHByb2plY3QgaW5zdGFuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBJUHJvamVjdAotCSAqICAgICAgICAgICAgcHJvamVjdCAtIFByb2plY3QgaW5zdGFuY2UuCi0JICogQHJldHVybiBJTW9kdWxlT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJSU1vZHVsZSBkZXAgPSBnZXRNb2R1bGUocHJvamVjdCxudWxsKTsKLQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU9iamVjdChkZXApOwotCX0vLyBnZXRNb2R1bGVPYmplY3QKLQotCS8qKgotCSAqIEdldHMgdGhlIGRlcGxveWFibGUgb2JqZWN0IGZvciBmaWxlIGluc3RhbmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gSUZpbGUKLQkgKiAgICAgICAgICAgIGZpbGUgLSBGaWxlIGluc3RhbmNlLgotCSAqIEByZXR1cm4gSU1vZHVsZU9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpLmVuZHNXaXRoKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKSkgewotCQkJewotCQkJCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhmaWxlKTsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQkJCWlmIChyZXNvdXJjZXNbMF0gIT0gbnVsbCB8fCByZXNvdXJjZXMubGVuZ3RoIDw9IDApCi0JCQkJCWNvbXBvbmVudCA9IHJlc291cmNlc1swXS5nZXRDb21wb25lbnQoKTsKLQkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlT2JqZWN0KGdldE1vZHVsZShmaWxlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSk7Ci0JCQl9Ci0JCX0vLyBpZgotCQlyZXR1cm4gbnVsbDsKLQl9Ly8gZ2V0TW9kdWxlT2JqZWN0Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXBsb3lhYmxlIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gRU9iamVjdAotCSAqICAgICAgICAgICAgcmVmT2JqZWN0IC0gVGhlIGN1cnJlbnQgcmVmT2JqZWN0LgotCSAqIEByZXR1cm4gSU1vZHVsZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJSVByb2plY3QgcHJvaiA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChyZWZPYmplY3QpOwotCQlSZXNvdXJjZSBzZXJ2UmVzb3VyY2UgPSByZWZPYmplY3QuZVJlc291cmNlKCk7Ci0JCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBudWxsOwotCQl0cnkgewotCQkJSVJlc291cmNlIGVjbGlwZVNlcnZSZXNvcnVjZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoc2VydlJlc291cmNlKTsKLQkJCXJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGVjbGlwZVNlcnZSZXNvcnVjZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZXNbMF0gIT0gbnVsbCkKLQkJCWNvbXBvbmVudCA9IHJlc291cmNlc1swXS5nZXRDb21wb25lbnQoKTsKLQkJcmV0dXJuIGdldE1vZHVsZShwcm9qLGNvbXBvbmVudCk7Ci0JfQotCi0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0JCUlNb2R1bGUgZGVwbG95YWJsZSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJZGVwbG95YWJsZSA9IChJTW9kdWxlKSBuZXh0OwotCQkJCWlmIChkZXBsb3lhYmxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpCi0JCQkJCXJldHVybiBkZXBsb3lhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoSVByb2plY3QgcHJvamVjdCwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUlNb2R1bGUgZGVwbG95YWJsZSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoSjJFRVByb2plY3RVdGlsaXRpZXMuRU5URVJQUklTRV9BUFBMSUNBVElPTikpLml0ZXJhdG9yKCk7IAotCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IG51bGw7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCkKLQkJCWNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gZ2V0TW9kdWxlUHJvamVjdChwcm9qZWN0LCBpdGVyYXRvcik7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJZGVwbG95YWJsZSA9IChJTW9kdWxlKSBuZXh0OwotCQkJCWlmIChkZXBsb3lhYmxlLmdldE5hbWUoKS5lcXVhbHMoY29tcG9uZW50TmFtZSkpIHsKLQkJCQkJcmV0dXJuIGRlcGxveWFibGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlcGxveWFibGUgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBJTW9kdWxlT2JqZWN0Ci0JICogICAgICAgICAgICBkZXBsb3lhYmxlIC0gVGhlIGN1cnJlbnQgbW9kdWxlIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBjcmVhdGVNb2R1bGVPYmplY3QoSU1vZHVsZSBtb2R1bGUpIHsKLQotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgTnVsbE1vZHVsZUFydGlmYWN0KG1vZHVsZSk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ly8gY3JlYXRlRGVwbG95YWJsZU9iamVjdAotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0QWRhcHRlciNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3RBZGFwdGVyI2dldE9iamVjdENsYXNzTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RDbGFzc05hbWUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0QWRhcHRlciNpc1BsdWdpbkFjdGl2YXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQbHVnaW5BY3RpdmF0ZWQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfS8vIEVudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVPYmplY3RBZGFwdGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNjRhYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTgsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBFbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSAgewotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10ge0lMYXVuY2hhYmxlLmNsYXNzIH07Ci0JfQotCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBFbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlQWRhcHRlclV0aWwuZ2V0TW9kdWxlT2JqZWN0KG9iaik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGMyZDg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIFdlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117SUxhdW5jaGFibGUuY2xhc3N9OwotCX0KLQotCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBXZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsLmdldE1vZHVsZU9iamVjdChvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MWU2OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmpmYWNlcy5leHRlbnNpb24uRmlsZVVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuamZhY2VzLmV4dGVuc2lvbi5GaWxlVVJMRXh0ZW5zaW9uUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuV2ViUmVzb3VyY2U7Ci0KLS8qKgotICogQHZlcnNpb24gMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsIHsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgR0VORVJJQ19TRVJWTEVUX0NMQVNTX1RZUEUgPSAiamF2YXguc2VydmxldC5HZW5lcmljU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FDVFVTX1NFUlZMRVRfQ0xBU1NfVFlQRSA9ICJvcmcuYXBhY2hlLmNhY3R1cy5zZXJ2ZXIuU2VydmxldFRlc3RSZWRpcmVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFdlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KE9iamVjdCBvYmopIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgb2JqOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSU1vZHVsZUFydGlmYWN0KQotCQkJcmVzb3VyY2UgPSAoKElNb2R1bGVBcnRpZmFjdCkgb2JqKS5nZXRNb2R1bGUoKS5nZXRQcm9qZWN0KCk7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJlc291cmNlID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBvYmopOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNlcnZsZXQpIHsKLQkJCQlTZXJ2bGV0SW1wbCBzZXJ2bGV0ID0gKChTZXJ2bGV0SW1wbCkgb2JqKTsKLQkJCQlSZXNvdXJjZSBzZXJ2UmVzb3VyY2UgPSBzZXJ2bGV0LmVSZXNvdXJjZSgpOwotCQkJCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCUlSZXNvdXJjZSBlY2xpcGVTZXJ2UmVzb3J1Y2UgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHNlcnZSZXNvdXJjZSk7Ci0JCQkJCXJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGVjbGlwZVNlcnZSZXNvcnVjZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJCQlpZiAocmVzb3VyY2VzWzBdICE9IG51bGwpCi0JCQkJCWNvbXBvbmVudCA9IHJlc291cmNlc1swXS5nZXRDb21wb25lbnQoKTsKLQkJCQlTdHJpbmcgbWFwcGluZyA9IG51bGw7Ci0JCQkJamF2YS51dGlsLkxpc3QgbWFwcGluZ3MgPSBnZXRTZXJ2bGV0TWFwcGluZ3MocmVzb3VyY2UsIHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCkpOwotCi0JCQkJaWYgKG1hcHBpbmdzICE9IG51bGwgJiYgIW1hcHBpbmdzLmlzRW1wdHkoKSkgewotCQkJCQlTZXJ2bGV0TWFwcGluZyBtYXAgPSAoU2VydmxldE1hcHBpbmcpIG1hcHBpbmdzLmdldCgwKTsKLQkJCQkJVXJsUGF0dGVyblR5cGUgdXJsUGF0dGVybiA9IChVcmxQYXR0ZXJuVHlwZSltYXAuZ2V0VXJsUGF0dGVybnMoKS5nZXQoMCk7Ci0JCQkJCW1hcHBpbmcgPSB1cmxQYXR0ZXJuLmdldFZhbHVlKCk7Ci0JCQkJfQotCQkJCWlmIChtYXBwaW5nICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCBuZXcgUGF0aChtYXBwaW5nKSk7Ci0JCQkJfQotCQkJCQotLy8JCQkJV2ViVHlwZSB3ZWJUeXBlID0gKChTZXJ2bGV0KSBvYmopLmdldFdlYlR5cGUoKTsKLS8vCQkJCWlmICh3ZWJUeXBlLmlzSnNwVHlwZSgpKSB7Ci0vLwkJCQkJcmVzb3VyY2UgPSAoKElQcm9qZWN0KSByZXNvdXJjZSkuZ2V0RmlsZSgoKEpTUFR5cGUpIHdlYlR5cGUpLmdldEpzcEZpbGUoKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCX0gZWxzZSBpZiAod2ViVHlwZS5pc1NlcnZsZXRUeXBlKCkpIHsKLS8vCQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKCJzZXJ2bGV0LyIgKyAoKFNlcnZsZXRUeXBlKSB3ZWJUeXBlKS5nZXRDbGFzc05hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0vLwkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQlpZiAoaGFzSW50ZXJlc3RlZENvbXBvbmVudHMocHJvamVjdCkpCi0JCQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocHJvamVjdCwgbnVsbCksIHByb2plY3QuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJfQotCQkKLQkJaWYgKCFoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhyZXNvdXJjZS5nZXRQcm9qZWN0KCkpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JCWlmIChpc0NhY3R1c0p1bml0VGVzdChyZXNvdXJjZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUGF0aCByZXNvdXJjZVBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMocmVzb3VyY2UpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQlpZiAocmVzb3VyY2VzLmxlbmd0aCA8PSAwIHx8IHJlc291cmNlc1swXSA9PSBudWxsICkKLQkJCXJldHVybiBudWxsOwotCQljb21wb25lbnQgPSByZXNvdXJjZXNbMF0uZ2V0Q29tcG9uZW50KCk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRTZXJ2bGV0Q2xhc3NOYW1lKHJlc291cmNlKTsKLQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWFwcGluZyA9IGdldFNlcnZsZXRNYXBwaW5nKHJlc291cmNlLCB0cnVlLCBjbGFzc05hbWUsIGNvbXBvbmVudC5nZXROYW1lKCkpOwotCQkJaWYgKG1hcHBpbmcgIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgbmV3IFBhdGgobWFwcGluZykpOwotCQkJfQotCQkJLy8gaWYgdGhlcmUgaXMgbm8gc2VydmxldCBtYXBwaW5nLCBwcm92aWRlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIHNlcnZsZXQKLQkJCS8vIHRocm91Z2ggdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0JCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKCJzZXJ2bGV0LyIgKyBjbGFzc05hbWUpKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7Ci0vLwkJCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsKLS8vCQkJdHJ5IHsKLS8vCQkJCXdlYkVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotLy8JCQkJTGlzdCBzZXJ2bGV0cyA9IHdlYkVkaXQuZ2V0V2ViQXBwKCkuZ2V0U2VydmxldHMoKTsKLS8vCQkJCWZvciAoaW50IGk9MDsgaTxzZXJ2bGV0cy5zaXplKCk7IGkrKykgewotLy8JCQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBzZXJ2bGV0cy5nZXQoaSk7Ci0vLwkJCQkJV2ViVHlwZSB0eXBlID0gc2VydmxldC5nZXRXZWJUeXBlKCk7Ci0vLwkJCQkJaWYgKHR5cGUuaXNKc3BUeXBlKCkpIHsKLS8vCQkJCQkJSlNQVHlwZSBqc3AgPSAoSlNQVHlwZSl0eXBlOwotLy8JCQkJCQlTdHJpbmcganNwUGF0aCA9IHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7Ci0vLwkJCQkJCWlmIChqc3AuZ2V0SnNwRmlsZSgpLmVxdWFscyhqc3BQYXRoKSkgewotLy8JCQkJCQkJTGlzdCBtYXBwaW5ncyA9IHNlcnZsZXQuZ2V0TWFwcGluZ3MoKTsKLS8vCQkJCQkJCVN0cmluZyBtYXBwaW5nID0gbnVsbDsKLS8vCQkJCQkJCWlmIChtYXBwaW5ncyAhPSBudWxsICYmICFtYXBwaW5ncy5pc0VtcHR5KCkpIHsKLS8vCQkJCQkJCQlTZXJ2bGV0TWFwcGluZyBtYXAgPSAoU2VydmxldE1hcHBpbmcpIG1hcHBpbmdzLmdldCgwKTsKLS8vCQkJCQkJCQltYXBwaW5nID0gbWFwLmdldFVybFBhdHRlcm4oKTsKLS8vCQkJCQkJCQlpZiAobWFwcGluZyAhPSBudWxsKSAKLS8vCQkJCQkJCQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCBuZXcgUGF0aChtYXBwaW5nKSk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0gZmluYWxseSB7Ci0vLwkJCQlpZiAod2ViRWRpdCAhPSBudWxsKQotLy8JCQkJCXdlYkVkaXQuZGlzcG9zZSgpOwotLy8JCQl9Ci0JCX0KLSAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCk7Ci0gICAgICAgIAotCQl0cnkgey8vYWRkaW5nIHRyeS9jYXRjaCB0byBhdm9pZCBmdXR1cmUgaXNzdWVzIHRoYXQgd291bGQgcmVxdWlyZSBjb21tZW50aW5nIHRoaXMgb3V0LgotCQkJLy8gRXh0ZW5zaW9uIHJlYWQgdG8gZ2V0IHRoZSBjb3JyZWN0IFVSTCBmb3IgSmF2YSBTZXJ2ZXIgRmFjZXMgZmlsZSBpZgotCQkJLy8gdGhlIGpzcCBpcyBvZiB0eXBlIGpzZmFjZXMuCi0JCQlGaWxlVVJMIGpzcFVSTCA9IEZpbGVVUkxFeHRlbnNpb25SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRGaWxlc1VSTCgpOwotCQkJaWYgKGpzcFVSTCAhPSBudWxsKSB7Ci0JCQkJSVBhdGggY29ycmVjdEpTUFBhdGggPSBqc3BVUkwuZ2V0RmlsZVVSTChyZXNvdXJjZSwgcmVzb3VyY2VQYXRoKTsKLQkJCQlpZiAoY29ycmVjdEpTUFBhdGggIT0gbnVsbCAmJiBjb3JyZWN0SlNQUGF0aC50b1N0cmluZygpLmxlbmd0aCgpID4gMCkKLQkJCQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCBjb3JyZWN0SlNQUGF0aCk7Ci0JCQl9Ci0JCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCQotCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIHJlc291cmNlUGF0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0LCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQikpLml0ZXJhdG9yKCk7IAotCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IG51bGw7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCkKLQkJCWNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gZ2V0TW9kdWxlUHJvamVjdChwcm9qZWN0LCBpdGVyYXRvcik7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJZGVwbG95YWJsZSA9IChJTW9kdWxlKSBuZXh0OwotCQkJCWlmIChkZXBsb3lhYmxlLmdldE5hbWUoKS5lcXVhbHMoY29tcG9uZW50TmFtZSkpIHsKLQkJCQkJcmV0dXJuIGRlcGxveWFibGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0JCUlNb2R1bGUgZGVwbG95YWJsZSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJZGVwbG95YWJsZSA9IChJTW9kdWxlKSBuZXh0OwotCQkJCWlmIChkZXBsb3lhYmxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpCi0JCQkJCXJldHVybiBkZXBsb3lhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIFZlcnkgdGVtcG9yYXJ5IGFwaSAtIFRPRE8gLSByaXAgdGhpcyBvdXQgYnkgMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NhY3R1c0p1bml0VGVzdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIGdldENsYXNzTmFtZUZvclR5cGUocmVzb3VyY2UsIENBQ1RVU19TRVJWTEVUX0NMQVNTX1RZUEUpICE9IG51bGw7Ci0JfQotCi0KLQotCXByaXZhdGUgc3RhdGljIElUeXBlW10gZ2V0VHlwZXMoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgIT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCXJldHVybiAoKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQpLmdldEFsbFR5cGVzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZsZXRDbGFzc05hbWUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBnZXRDbGFzc05hbWVGb3JUeXBlKHJlc291cmNlLCBHRU5FUklDX1NFUlZMRVRfQ0xBU1NfVFlQRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRm9yVHlwZShJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBzdXBlclR5cGUpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0cnkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpIHx8IHBhdGggPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcHJvamVjdC5nZXROYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJCWlmICghamF2YVByb2plY3QuaXNPcGVuKCkpCi0JCQkJamF2YVByb2plY3Qub3BlbihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQkJLy8gb3V0cHV0IGxvY2F0aW9uIG1heSBub3QgYmUgb24gY2xhc3NwYXRoCi0JCQlJUGF0aCBvdXRwdXRQYXRoID0gamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJCWlmIChvdXRwdXRQYXRoICE9IG51bGwgJiYgImNsYXNzIi5lcXVhbHMocGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpICYmIG91dHB1dFBhdGguaXNQcmVmaXhPZihwYXRoKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW50IGNvdW50ID0gb3V0cHV0UGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGNvdW50KTsKLQkJCX0KLQotCQkJLy8gcmVtb3ZlIGluaXRpYWwgcGFydCBvZiBjbGFzc3BhdGgKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzUGF0aEVudHJ5ID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCQlpZiAoY2xhc3NQYXRoRW50cnkgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gY2xhc3NQYXRoRW50cnkubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUlQYXRoIGNsYXNzUGF0aCA9IGNsYXNzUGF0aEVudHJ5W2ldLmdldFBhdGgoKTsKLQkJCQkJaWYgKGNsYXNzUGF0aC5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0JCQkJCQlpbnQgY291bnQgPSBjbGFzc1BhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGNvdW50KTsKLQkJCQkJCWkgKz0gc2l6ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gZ2V0IGphdmEgZWxlbWVudAotCQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gamF2YVByb2plY3QuZmluZEVsZW1lbnQocGF0aCk7Ci0KLQkJCUlUeXBlW10gdHlwZXMgPSBnZXRUeXBlcyhqYXZhRWxlbWVudCk7Ci0JCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJCWludCBzaXplMiA9IHR5cGVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKLQkJCQkJaWYgKGhhc1N1cGVyY2xhc3ModHlwZXNbaV0sIHN1cGVyVHlwZSkpCi0JCQkJCQlyZXR1cm4gdHlwZXNbaV0uZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNTdXBlcmNsYXNzKElUeXBlIHR5cGUsIFN0cmluZyBzdXBlckNsYXNzTmFtZSkgewotCQl0cnkgewotCQkJSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7Ci0JCQlJVHlwZVtdIHN1cGVyQ2xhc3NlcyA9IGhpZXJhcmNoeS5nZXRBbGxTdXBlcmNsYXNzZXModHlwZSk7Ci0KLQkJCWludCBzaXplID0gc3VwZXJDbGFzc2VzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHN1cGVyQ2xhc3NOYW1lLmVxdWFscyhzdXBlckNsYXNzZXNbaV0uZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZsZXRNYXBwaW5nKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpc1NlcnZsZXQsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKLQkJaWYgKHR5cGVOYW1lID09IG51bGwgfHwgdHlwZU5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIoIHJlc291cmNlLmdldFByb2plY3QoKSApOwotCQlPYmplY3QgbU9iaiA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JCQotCQlpZiAoIG1PYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApewotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYkFwcD0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbU9iajsKLQkJCUxpc3Qgc2VydmxldHMgPSB3ZWJBcHAuZ2V0U2VydmxldHMoKTsKLQkJCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCQkvLyBFbnN1cmUgdGhlIGRpc3BsYXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0JCQlpZiAoc2VydmxldHMgIT0gbnVsbCAmJiAhc2VydmxldHMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2bGV0cy5zaXplKCk7IGkrKykgewotCQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0IHNlcnZsZXQgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldClzZXJ2bGV0cy5nZXQoaSk7Ci0JCQkJCWlmKCBzZXJ2bGV0LmdldFNlcnZsZXRDbGFzcygpLmVxdWFscyh0eXBlTmFtZSkpewotCQkJCQotCQkJCQkJamF2YS51dGlsLkxpc3QgbWFwcGluZ3MgPSB3ZWJBcHAuZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0JCQkJCQlpZiAobWFwcGluZ3MgIT0gbnVsbCAmJiAhbWFwcGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJSXRlcmF0b3IgaXQgPSBtYXBwaW5ncy5pdGVyYXRvcigpOwotCQkJCQkJCXdoaWxlKCBpdC5oYXNOZXh0KCkgKXsKLQkJCQkJCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcgbWFwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nKSBpdC5uZXh0KCk7Ci0JCQkJCQkJCWlmKCBtYXAuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKSl7Ci0JCQkJCQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGUgdXJsUGF0dGVybiA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGUpbWFwLmdldFVybFBhdHRlcm5zKCkuZ2V0KDApOwotCQkJCQkJCQkJcmV0dXJuICB1cmxQYXR0ZXJuLmdldFZhbHVlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQotCQkJCX0KLQkJCX0KLQotCQkJCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzSW50ZXJlc3RlZENvbXBvbmVudHMoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldFNlcnZsZXRNYXBwaW5ncyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyB0eXBlTmFtZSl7IAotCQlJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIoIHJlc291cmNlLmdldFByb2plY3QoKSApOwotCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcClwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQkKLQkJTGlzdCBzZXJ2bGV0cyA9IHdlYkFwcC5nZXRTZXJ2bGV0cygpOwotCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKHNlcnZsZXRzICE9IG51bGwgJiYgIXNlcnZsZXRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2bGV0cy5zaXplKCk7IGkrKykgewotCQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KXNlcnZsZXRzLmdldChpKTsKLQkJCQlpZiggc2VydmxldC5nZXRTZXJ2bGV0Q2xhc3MoKS5lcXVhbHModHlwZU5hbWUpKXsKLQkJCQotCQkJCQlqYXZhLnV0aWwuTGlzdCBtYXBwaW5ncyA9IHdlYkFwcC5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQkJCQkJaWYgKG1hcHBpbmdzICE9IG51bGwgJiYgIW1hcHBpbmdzLmlzRW1wdHkoKSkgewotCQkJCQkJSXRlcmF0b3IgaXQgPSBtYXBwaW5ncy5pdGVyYXRvcigpOwotCQkJCQkJd2hpbGUoIGl0Lmhhc05leHQoKSApewotCQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nIG1hcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZykgaXQubmV4dCgpOwotCQkJCQkJCWlmKCBtYXAuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKSl7Ci0JCQkJCQkJCWxpc3QuYWRkKG1hcCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3Y2VjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLUlOVkFMSURfREVQX0RFU0NfU0VMRUNUSU9OX1RJVExFPUludmFsaWQgU2VsZWN0aW9uCi1JTkZPUk1fSU5WQUxJRF9ERVBfREVTQ19TRUxFQ1RJT049T25lIG9yIG1vcmUgSmF2YSBFRSBwcm9qZWN0cyBzZWxlY3RlZCBhbHJlYWR5IGhhcyBhIERlcGxveW1lbnQgRGVzY3JpcHRvci4KLQotSU5WQUxJRF9ERVBfREVTQ19TRUxFQ1RJT05fVElUTEU9SW52YWxpZCBTZWxlY3Rpb24KLUlORk9STV9JTlZBTElEX0RFUF9ERVNDX1NFTEVDVElPTj1PbmUgb3IgbW9yZSBKYXZhIEVFIHByb2plY3RzIHNlbGVjdGVkIGFscmVhZHkgaGFzIGEgRGVwbG95bWVudCBEZXNjcmlwdG9yLgotREVQTE9ZTUVOVF9ERVNDUklQVE9SPURlcGxveW1lbnQgRGVzY3JpcHRvcjogCi1TRVNTSU9OX0JFQU5TPVNlc3Npb24gQmVhbnMKLUVOVElUWV9CRUFOUz1FbnRpdHkgQmVhbnMoMS54LTIueCkKLU1FU1NBR0VfRFJJVkVOX0JFQU5TPU1lc3NhZ2UtRHJpdmVuIEJlYW5zCi1BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTPUFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnRpZXMKLUVOVEVSUFJJU0VfQkVBTl9DTEFTU19ERVNDUklQVElPTj1FbnRlcnByaXNlIEJlYW4gQ2xhc3MgLSAKLQotU0VSVkxFVF9JVEVNX1BST1ZJREVSPVNlcnZsZXRzCi1MSVNURU5FUl9JVEVNX1BST1ZJREVSPUxpc3RlbmVycwotRklMVEVSU19JVEVNX1BST1ZJREVSPUZpbHRlcnMKLUZJTFRFUl9NQVBQSU5HX0lURU1fUFJPVklERVI9RmlsdGVyIE1hcHBpbmdzCi1TRVJWTEVUX01BUFBJTkdfSVRFTV9QUk9WSURFUj1TZXJ2bGV0IE1hcHBpbmdzCi1FUlJPUl9QQUdFU19JVEVNX1BST1ZJREVSPUVycm9yIFBhZ2VzCi1XRUxDT01FX1BBR0VTX0lURU1fUFJPVklERVI9V2VsY29tZSBQYWdlcwotQ09OVEVYVF9QQVJBTVNfSVRFTV9QUk9WSURFUj1Db250ZXh0IFBhcmFtZXRlcnMKLUJVTkRMRURfTElCUkFSSUVTX05PREU9QnVuZGxlZCBMaWJyYXJpZXMKLUxJQlJBUllfRElSRUNUT1JZPUxpYnJhcnkgRGlyZWN0b3J5Ci1FQVJfTU9EVUxFU19OT0RFPU1vZHVsZXMKLUVKQkxPQ0FMX1JFRkVSRU5DRVM9RWpiIExvY2FsIFJlZmVyZW5jZXMKLUVKQl9SRUZFUkVOQ0VTPUVqYiBSZWZlcmVuY2VzCi1FTlZJUk9NRU5UX0VOVFJJRVM9RW52aXJvbm1lbnQgRW50cmllcwotUkVTT1VSQ0VfRU5WSVJPTUVOVF9FTlRSSUVTPVJlc291cmNlIEVudmlyb25tZW50IEVudHJpZXMKLVJFU09VUkNFX1JFRkVSRU5DRVM9UmVzb3VyY2UgUmVmZXJlbmNlcwotU0VSVklDRV9SRUZFUkVOQ0VTPVNlcnZpY2UgUmVmZXJlbmNlcwotUkVGRVJFTkNFUz1SZWZlcmVuY2VzCi0KLUFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfVGhlX2RyYWdnZWRfcHJvamVjdF9jYW5ub3RfYmVfYWRkZWRfPVRoZSBkcmFnZ2VkIHByb2plY3QgY2Fubm90IGJlIGFkZGVkCi1BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9wcm9qZWN0XzBfY2Fubm90X2JlX2FjY2Vzc2VfPVRoZSBwcm9qZWN0IGNhbm5vdCBiZSBhY2Nlc3NlZAotQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfYWRkX21vZHVsZV90b19FbnRlcnByaXNlXz1Db3VsZCBub3QgYWRkIG1vZHVsZSB0byBFbnRlcnByaXNlCi1BZGRNb2R1bGVUb0VhckRyb3BBc3Npc3RhbnRfQWRkaW5nX21vZHVsZV90b19lYV89QWRkaW5nIG1vZHVsZSB0byBlYXIKLUltcG9ydEpFRU1vZHVsZURyb3BBc3Npc3RhbnRfSW1wb3J0aW5nX0phdmFfRW50ZXJwcmlzZV9FZGl0aW9uX2FydGlmYWN0cz1JbXBvcnRpbmcgSmF2YSBFbnRlcnByaXNlIEVkaXRpb24gYXJ0aWZhY3RzCi1JbXBvcnRKRUVNb2R1bGVEcm9wQXNzaXN0YW50X0NvdWxkX25vdF9yZWNvZ25pemVfZXh0ZW5zaW9uXzBfPUNvdWxkIG5vdCByZWNvZ25pemUgZXh0ZW5zaW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0Fic3RyYWN0REROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0Fic3RyYWN0REROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNDAyNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BYnN0cmFjdERETm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQWJzdHJhY3QgRGVwbG95bWVudCBEZXNjcmlwdG9yIE5vZGUgaXMgYW4gYWJzdHJhY3Qgd3JhcHBlciBjbGFzcyBmb3IgdGhlIG5vZGVzIGluIHRoZSBEZXBsb3ltZW50Ci0gKiBEZXNjcmlwdG9yIGl0IGNhbiBjb250YWluIGluZm9ybWF0aW9uIGZvciB0aGUgbGFiZWwgcHJvdmlkZXIgc29tZSBkZXNjcmlwdGlvbiBmb3IgdG9vbCB0aXAsIGFuIGltYWdlCi0gKiBhbmQgdGhlIG9iamVjdCB0aGF0IGl0IGlzIHdyYXBwaW5nLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RERE5vZGUgewotCi0JcHJvdGVjdGVkIE9iamVjdCBhZGFwdGVyTm9kZTsKLQlwcm90ZWN0ZWQgSW1hZ2UgaW1hZ2U7Ci0JcHJvdGVjdGVkIFN0cmluZyB0ZXh0OwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlck5vZGUgLSB0aGUgd3JhcHBlZCBvYmplY3QgCi0JICovCi0JcHVibGljIEFic3RyYWN0REROb2RlKE9iamVjdCBhZGFwdGVyTm9kZSl7Ci0JCXRoaXMuYWRhcHRlck5vZGUgPSBhZGFwdGVyTm9kZTsKLQkJaW1hZ2UgPSBudWxsOwotCQl0ZXh0ID0gbnVsbDsKLQkJZGVzY3JpcHRpb24gPSBudWxsOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldENoaWxkcmVuKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNDaGlsZHJlbigpOwotCi0JcHVibGljIHZvaWQgZGVjb3JhdGUoSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotCQkvLyBkbyBub3RoaW5nLCBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZQotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOyAKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXJOb2RlKCkgewotCQlyZXR1cm4gYWRhcHRlck5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVpbml0KEphdmFFRU9iamVjdCBtb2RlbE9iamVjdCkgewotCQlhZGFwdGVyTm9kZSA9IG1vZGVsT2JqZWN0OwotCX0JCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0Fic3RyYWN0R3JvdXBQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BYnN0cmFjdEdyb3VwUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5MWVkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0Fic3RyYWN0R3JvdXBQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBBYnN0cmFjdCBncm91cCBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZSB0aGF0IGhhcyBhIG51bWJlciBvZiBzdWIgbm9kZXMgCi0gKiAobGlrZSBFbnRpdHkgQmVhbnMsIFNlc3Npb24gQmVhbnMsIE1lc3NhZ2UgRHJpdmVuIEJlYW5zKS4KLSAqIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0R3JvdXBQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCXByb3RlY3RlZCBKYXZhRUVPYmplY3QgamF2YWVlOwotCXByb3RlY3RlZCAgU3RyaW5nIHRleHQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZChib29sZWFuIGlzVmFsaWQpIHsKLQkJdGhpcy5pc1ZhbGlkID0gaXNWYWxpZDsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RHcm91cFByb3ZpZGVyKEphdmFFRU9iamVjdCBqYXZhZWUpIHsKLQkJdGhpcy5qYXZhZWUgPSBqYXZhZWU7Ci0JCXRleHQgPSBNZXNzYWdlcy5ERVBMT1lNRU5UX0RFU0NSSVBUT1IgKyBqYXZhZWUudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRDaGlsZHJlbigpOwotCi0JcHVibGljIGFic3RyYWN0IEltYWdlIGdldEltYWdlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0IDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVFT2JqZWN0IGdldEphdmFFRU9iamVjdCgpIHsKLQkJcmV0dXJuIGphdmFlZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXQoSmF2YUVFT2JqZWN0IG1vZGVsT2JqZWN0KSB7Ci0JCXRoaXMuamF2YWVlID0gbW9kZWxPYmplY3Q7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpewotCQlyZXR1cm4gaXNWYWxpZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQXBwQ2xpZW50NUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BcHBDbGllbnQ1Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZGQ0MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BcHBDbGllbnQ1Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmFwcGNsaWVudC5Hcm91cEFwcENsaWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Nb2R1bGVzTm9kZTsKLQotLyoqCi0gKiBFYXIgNS4wIENvbnRlbnQgcHJvdmlkZXIgaXMgRGVwbG95bWVudCBEZXNjcmlwdG9yIGNvbnRlbnQgcHJvdmlkZXIsIAotICogdXNlZCBmb3IgY29uc3RydWN0aW5nIG9mIHRoZSBkZXNjcmlwdG9yIHRyZWUgaW4gcHJvamVjdCBleHBsb3Jlci4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnQ1Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgSkVFNUNvbnRlbnRQcm92aWRlciB7Ci0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGFQYXJlbnRFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBHcm91cEFwcENsaWVudFByb3ZpZGVyKSB7Ci0JCQljaGlsZHJlbi5hZGRBbGwoKChHcm91cEFwcENsaWVudFByb3ZpZGVyKSBhUGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKSk7Ci0JCX0gZWxzZSBpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIGFQYXJlbnRFbGVtZW50KS5nZXRBZGFwdGVyKElQUk9KRUNUX0NMQVNTKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0KSAmJgotCQkJCQlKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pFRVByb2plY3QocHJvamVjdCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoKEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIGdldENhY2hlZENvbnRlbnRQcm92aWRlcihwcm9qZWN0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0KLQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcm91cEFwcENsaWVudFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gISgoR3JvdXBBcHBDbGllbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JCX0gZWxzZSAKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNb2R1bGVzTm9kZSl7Ci0JCQlyZXR1cm4gKChNb2R1bGVzTm9kZSkgb2JqZWN0KS5nZXRFYXJQcm9qZWN0KCk7IAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RHcm91cFByb3ZpZGVyIGdldE5ld0NvbnRlbnRQcm92aWRlckluc3RhbmNlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBHcm91cEFwcENsaWVudFByb3ZpZGVyKChBcHBsaWNhdGlvbkNsaWVudCkgZ2V0Q2FjaGVkTW9kZWxQcm92aWRlcihwcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpLCBwcm9qZWN0KTsKLQl9Ci0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQXBwQ2xpZW50NUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQXBwQ2xpZW50NUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmOTMwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0FwcENsaWVudDVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5hcHBjbGllbnQuR3JvdXBBcHBDbGllbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQXBwbGljYXRpb24gQ2xlbnQgNS4wIExhYmVsIHByb3ZpZGVyIGlzIERlcGxveW1lbnQgRGVzY3JpcHRvciBsYWJlbCBwcm92aWRlciwgCi0gKiB1c2VkIGZvciBkZWNvcmF0aW5nIG9mIHRoZSBkZXNjcmlwdG9yIHRyZWUgaW4gcHJvamVjdCBleHBsb3Jlci4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnQ1TGFiZWxQcm92aWRlciBleHRlbmRzIEoyRUVMYWJlbFByb3ZpZGVyIHsKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgcmV0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcm91cEFwcENsaWVudFByb3ZpZGVyKSB7Ci0JCQlyZXQgPSAoKEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJfSAKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHJldCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgR3JvdXBBcHBDbGllbnRQcm92aWRlcikgewotCQkJcmV0ID0gICgoR3JvdXBBcHBDbGllbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VhcjVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWFyNUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjViYzIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWFyNUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5BYnN0cmFjdEVhck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEFwcGxpY2F0aW9uIENsaWVudCA1LjAgQ29udGVudCBwcm92aWRlciBpcyBEZXBsb3ltZW50IERlc2NyaXB0b3IgY29udGVudCBwcm92aWRlciwgCi0gKiB1c2VkIGZvciBjb25zdHJ1Y3Rpbmcgb2YgdGhlIGRlc2NyaXB0b3IgdHJlZSBpbiBwcm9qZWN0IGV4cGxvcmVyLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIEVhcjVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBKRUU1Q29udGVudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVBUl9ERUZBVUxUX0xJQiA9ICIvbGliIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBMaXN0IGdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoTGlzdCBjb21wb25lbnRUeXBlcywgSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJTGlzdCBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSB2aXJ0dWFsQ29tcG9uZW50OwotCQlpZiAoZWFyQ29tcG9uZW50ICE9IG51bGwgKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZkNvbXBvbmVudHMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlID0gcmVmQ29tcG9uZW50c1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYgKG1vZHVsZSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQkvLyBpZiBjb21wb25lbnQgdHlwZXMgcGFzc2VkIGluIGlzIG51bGwgdGhlbiByZXR1cm4gYWxsIGNvbXBvbmVudHMKLQkJCQlpZiAoY29tcG9uZW50VHlwZXMgPT0gbnVsbCB8fCBjb21wb25lbnRUeXBlcy5zaXplKCkgPT0gMCkgewotCQkJCQljb21wb25lbnRzLmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoY29tcG9uZW50VHlwZXMuY29udGFpbnMoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFQ29tcG9uZW50VHlwZShtb2R1bGUpKSkgewotCQkJCQkJY29tcG9uZW50cy5hZGQocmVmQ29tcG9uZW50c1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbXBvbmVudHM7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0VXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7ICAKLQkJTGlzdCBleHBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzID0gCi0JCQlnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoSjJFRVByb2plY3RVdGlsaXRpZXMuVVRJTElUWSksIGNvbXBvbmVudCwgbnVsbCk7Ci0KLQkJLy8gZmV0Y2ggb3RoZXIgVXRpbGl0eSBKYXJzIGF0dGFjaGVkIHRvIHRoZSBFQVIgcHJvamVjdCAKLQkJTGlzdCBpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VUeXBlcyA9Ci0JCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICAKLQkJCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSwKLQkJCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSwJIAotCQkJCQlJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFIAotCQkJfSk7Ci0KLQkJTGlzdCBpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzID0gCi0JCQlnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZVR5cGVzLCBjb21wb25lbnQsIG51bGwpOwotCi0JCUxpc3QgYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzLmFkZEFsbChleHBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzKTsKLQkJYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMuYWRkQWxsKGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZXMpOwotCi0JCWlmKGFsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKElWaXJ0dWFsUmVmZXJlbmNlW10pIGFsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW2FsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzLnNpemUoKV0pOwotCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVmZXJlbmNlWzBdOwotCi0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBhUGFyZW50RWxlbWVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgR3JvdXBFQVJQcm92aWRlcikgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChHcm91cEVBUlByb3ZpZGVyKWFQYXJlbnRFbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0KLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHByb2plY3RDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCXRyeSB7Ci0JCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsICYmIAotCQkJCQkJZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KAotCQkJCQkJCQlQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSkuZ2V0VmVyc2lvbigKLQkJCQkJCQkJCQlKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMF9URVhUKSkpIHsKLQotCQkJCQlMaXN0IGxpYnMgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoSjJFRVByb2plY3RVdGlsaXRpZXMuVVRJTElUWSksIHByb2plY3RDb21wb25lbnQsCi0JCQkJCQkJbmV3IFBhdGgoIi8iICsgRUFSX0RFRkFVTFRfTElCKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCUFycmF5TGlzdCBidW5kbGVkTGlicyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlBcnJheUxpc3QgYXBwTGlic0luVGhlUm9vdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicy5zaXplKCk7IGkrKykgewotCQkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSAoSVZpcnR1YWxSZWZlcmVuY2UpIGxpYnMuZ2V0KGkpOwotCQkJCQkJCQlJUGF0aCBydW50aW1lUGF0aCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpOwotCi0JCQkJCQkJCWlmIChydW50aW1lUGF0aCAhPSBudWxsICYmIHJ1bnRpbWVQYXRoLnNlZ21lbnQoMCkgIT0gbnVsbCAmJiAKLS8vCQkJCQkJCQkJCXJ1bnRpbWVQYXRoLmVxdWFscyhuZXcgUGF0aChFQVJfREVGQVVMVF9MSUIpKSkgewotCQkJCQkJCQkJIXJ1bnRpbWVQYXRoLmlzUm9vdCgpKSB7Ci0JCQkJCQkJCQlidW5kbGVkTGlicy5hZGQobGlicy5nZXQoaSkpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJYXBwTGlic0luVGhlUm9vdC5hZGQobGlicy5nZXQoaSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCVN0cmluZyBsaWJEaXIgPSBFQVJfREVGQVVMVF9MSUI7Ci0JCQkJCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFUHJvamVjdChwcm9qZWN0KSkgewotCQkJCQkJCQlTdHJpbmcgb2xkTGliRGlyID0gKChBcHBsaWNhdGlvbilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpLmdldE1vZGVsT2JqZWN0KCkpLmdldExpYnJhcnlEaXJlY3RvcnkoKTsKLQkJCQkJCQkJaWYgKG9sZExpYkRpciA9PSBudWxsKSBvbGRMaWJEaXIgPSBFQVJfREVGQVVMVF9MSUI7Ci0JCQkJCQkJCWxpYkRpciA9IG9sZExpYkRpcjsKLQkJCQkJCQl9Ci0vLwotLy8JCQkJCQkJTGlzdCBpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VUeXBlcyA9Ci0vLwkJCQkJCQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAgCi0vLwkJCQkJCQkJCQlJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFLAotLy8JCQkJCQkJCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSwKLS8vCQkJCQkJCQkJCUlNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUsCi0vLwkJCQkJCQkJCQlJTW9kdWxlQ29uc3RhbnRzLkpTVF9DT05ORUNUT1JfTU9EVUxFfSk7Ci0vLwotCi0vLwkJCQkJCQlMaXN0IG1vZHVsZXMgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZVR5cGVzLCBwcm9qZWN0Q29tcG9uZW50LCBuZXcgUGF0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCQkJTW9kdWxlc05vZGUgbW9kdWxlc05vZGUgPSBuZXcgTW9kdWxlc05vZGUocHJvamVjdCk7Ci0KLS8vCQkJCQkJCWNoaWxkcmVuLmFkZChtb2R1bGVzTm9kZSk7Ci0vLwkJCQkJCQljaGlsZHJlbi5hZGQoYnVuZGxlZExpYnNOb2RlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gIkVycm9yIGluIHRoZSBKRUVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKSBmb3IgcGFyZW50OiIgKyAgYVBhcmVudEVsZW1lbnQ7IC8vJE5PTi1OTFMtMSQKLQkJCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IobXNnLCBlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0RWFyTm9kZSkgewotCQkJcmV0dXJuICgoQWJzdHJhY3RFYXJOb2RlKSBhUGFyZW50RWxlbWVudCkuZ2V0TW9kdWxlcygpLnRvQXJyYXkoKTsKLQkJfSBlbHNlIGlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCXByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgYVBhcmVudEVsZW1lbnQpLmdldEFkYXB0ZXIoSVBST0pFQ1RfQ0xBU1MpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkpIHsKLQkJCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3Q7Ci0JCQkJdHJ5IHsKLQkJCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsICYmIAotCQkJCQkJCWZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldCgKLQkJCQkJCQkJCVByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKS5nZXRWZXJzaW9uKAotCQkJCQkJCQkJCQlKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMF9URVhUKSkpIHsKLQkJCQkJCUdyb3VwRUFSUHJvdmlkZXIgZWxlbWVudCA9IChHcm91cEVBUlByb3ZpZGVyKSBnZXRDYWNoZWRDb250ZW50UHJvdmlkZXIocHJvamVjdCk7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIG1zZyA9ICJFcnJvciBpbiB0aGUgSkVFQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKCkgZm9yIHBhcmVudDoiICsgIGFQYXJlbnRFbGVtZW50OyAvLyROT04tTkxTLTEkCi0JCQkJCUpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvcihtc2csIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RFYXJOb2RlKSB7Ci0JCQlyZXR1cm4gKChBYnN0cmFjdEVhck5vZGUpIGVsZW1lbnQpLmdldE1vZHVsZXMoKS5zaXplKCkgPiAwOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcm91cEVBUlByb3ZpZGVyKXsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0RWFyTm9kZSl7Ci0JCQlyZXR1cm4gKChBYnN0cmFjdEVhck5vZGUpIG9iamVjdCkuZ2V0RWFyUHJvamVjdCgpOyAKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RHcm91cFByb3ZpZGVyIGdldE5ld0NvbnRlbnRQcm92aWRlckluc3RhbmNlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBHcm91cEVBUlByb3ZpZGVyKChBcHBsaWNhdGlvbikgZ2V0Q2FjaGVkTW9kZWxQcm92aWRlcihwcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpLCAoRUFSVmlydHVhbENvbXBvbmVudClDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KSk7Ci0JfQotCi0JcHVibGljIEVhckxpYlZpc2l0b3IgZ2V0VmlzaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFYXJMaWJWaXNpdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEVhckxpYlZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0JCXByaXZhdGUgU2V0PElQcm9qZWN0PiBwcm9qZWN0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0PigpOwotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIGFmZmVjdGVkQ2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKElSZXNvdXJjZURlbHRhLkFEREVEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8IElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKTsKLQkJCWlmIChhZmZlY3RlZENoaWxkcmVuICE9IG51bGwpewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoYWZmZWN0ZWRDaGlsZHJlbltpXS5nZXRSZXNvdXJjZSgpICE9IG51bGwgJiYgYWZmZWN0ZWRDaGlsZHJlbltpXS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSAhPSBudWxsCi0JCQkJCQkJJiYgYWZmZWN0ZWRDaGlsZHJlbltpXS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikpeyAvLyROT04tTkxTLTEkCi0JCQkJCQlwcm9qZWN0cy5hZGQoYWZmZWN0ZWRDaGlsZHJlbltpXS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByb3RlY3RlZCBTZXQ8SVByb2plY3Q+IGdldENoYW5nZWRQcm9qZWN0KCkgewotCQkJcmV0dXJuIHByb2plY3RzOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIucmVzb3VyY2VDaGFuZ2VkKGV2ZW50KTsKLQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSl7Ci0JCQlFYXJMaWJWaXNpdG9yIHZpc2l0b3IgPSBnZXRWaXNpdG9yKCk7Ci0JCQlpZiAodmlzaXRvciA9PSBudWxsKXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWV2ZW50LmdldERlbHRhKCkuYWNjZXB0KHZpc2l0b3IpOwotCQkJCVNldDxJUHJvamVjdD4gY2hhbmdlZFByb2plY3QgPSB2aXNpdG9yLmdldENoYW5nZWRQcm9qZWN0KCk7Ci0JCQkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogY2hhbmdlZFByb2plY3QpIHsKLQkJCQkJcHJvamVjdENoYW5nZWQocHJvamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJSkVFVUlQbHVnaW4ubG9nRXJyb3IoIkNvdWxkIG5vdCByZWZyZXNoIGNoYW5nZWQgcHJvamVjdC4iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfSAKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FYXI1TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FYXI1TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDhjOTQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWFyNUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbi5KMkVFTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5kbmQuSU1vZHVsZUV4dGVuc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkFic3RyYWN0RWFyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogRUFSIDUuMCBMYWJlbCBwcm92aWRlciBpcyBEZXBsb3ltZW50IERlc2NyaXB0b3IgbGFiZWwgcHJvdmlkZXIsIAotICogdXNlZCBmb3IgZGVjb3JhdGluZyBvZiB0aGUgZGVzY3JpcHRvciB0cmVlIGluIHByb2plY3QgZXhwbG9yZXIuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgY2xhc3MgRWFyNUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFTGFiZWxQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIElNR19NT0RVTEVTX05PREU7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIElNR19NT0RVTEVfVVRJTDsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgSU1HX01PRFVMRV9XRUI7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIElNR19NT0RVTEVfRUpCOwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBJTUdfTU9EVUxFX0NMSUVOVDsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgSU1HX01PRFVMRV9DT05ORUNUT1I7Ci0KLQlzdGF0aWMgewotCQl0cnkgewotCQkJSU1HX01PRFVMRVNfTk9ERSA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiZm9sZGVyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQlJTUdfTU9EVUxFX1VUSUwgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCgoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJ1dGlsamFyX29iaiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJSU1HX01PRFVMRV9XRUIgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCgoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmdWxsL29iajE2L21vZHVsZV93ZWJfb2JqIikpOyAvLyROT04tTkxTLTEkCi0JCQlJTUdfTU9EVUxFX0VKQiA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvbW9kdWxlX2VqYl9vYmoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlNR19NT0RVTEVfQ0xJRU5UID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgibW9kdWxlX2NsaWVudGFwcF9vYmoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlNR19NT0RVTEVfQ09OTkVDVE9SID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9jb25uZWN0b3JfbW9kdWxlIikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlLmdldE1lc3NhZ2UoKSA6IGUudG9TdHJpbmcoKTsKLQkJCUpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvcihtc2csIGUpOwotCQkJSU1HX01PRFVMRVNfTk9ERSA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlJTUdfTU9EVUxFX1VUSUwgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJSU1HX01PRFVMRV9XRUIgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJSU1HX01PRFVMRV9FSkIgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJSU1HX01PRFVMRV9DTElFTlQgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJSU1HX01PRFVMRV9DT05ORUNUT1IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUltYWdlIHJldCA9IG51bGw7Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEVhck5vZGUpIHsKLQkJCXJldCA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKElNR19NT0RVTEVTX05PREUpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVmlydHVhbFJlZmVyZW5jZSkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKChJVmlydHVhbFJlZmVyZW5jZSkgZWxlbWVudCkuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJaWYgKGNvbXBvbmVudC5pc0JpbmFyeSgpKSB7IAotCQkJCXJldCA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKElNR19NT0RVTEVfVVRJTCk7Ci0JCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViQ29tcG9uZW50KGNvbXBvbmVudCkpIHsKLQkJCQlyZXQgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShJTUdfTU9EVUxFX1dFQik7Ci0JCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJDb21wb25lbnQoY29tcG9uZW50KSkgewotCQkJCXJldCA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKElNR19NT0RVTEVfRUpCKTsKLQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50Q29tcG9uZW50KGNvbXBvbmVudCkpIHsKLQkJCQlyZXQgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShJTUdfTU9EVUxFX0NMSUVOVCk7Ci0JCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FDb21wb25lbnQoY29tcG9uZW50KSkgewotCQkJCXJldCA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKElNR19NT0RVTEVfQ09OTkVDVE9SKTsKLQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJcmV0ID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoSU1HX01PRFVMRV9VVElMKTsKLQkJCX0gZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCQlyZXQgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShJTUdfTU9EVUxFX1VUSUwpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcm91cEVBUlByb3ZpZGVyKXsKLQkJCXJldCA9ICgoR3JvdXBFQVJQcm92aWRlcikgZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlTdHJpbmcgcmV0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEVhck5vZGUpIHsKLQkJCXJldCA9ICAoKEFic3RyYWN0RWFyTm9kZSkgZWxlbWVudCkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVmlydHVhbFJlZmVyZW5jZSkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKChJVmlydHVhbFJlZmVyZW5jZSkgZWxlbWVudCkuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQoY29tcG9uZW50KSkgewotCQkJCWlmICghY29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQkJcmV0ID0gIldlYiAiICsgY29tcG9uZW50LmdldE5hbWUoKSArIElNb2R1bGVFeHRlbnNpb25zLkRPVF9XQVI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChjb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCkpOwotCQkJCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQkNvbXBvbmVudChjb21wb25lbnQpKSB7Ci0JCQkJaWYgKCFjb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJCQlyZXQgPSAiRUpCICIgKyBjb21wb25lbnQuZ2V0TmFtZSgpICsgSU1vZHVsZUV4dGVuc2lvbnMuRE9UX0pBUjsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbXBvbmVudC5nZXREZXBsb3llZE5hbWUoKSk7Ci0JCQkJCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQoY29tcG9uZW50KSl7Ci0JCQkJaWYgKCFjb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJCQlyZXQgPSAiQVBQIENsaWVudCAiICsgY29tcG9uZW50LmdldE5hbWUoKSArIElNb2R1bGVFeHRlbnNpb25zLkRPVF9KQVI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChjb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCkpOwotCQkJCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCQlyZXQgPSAiQ29ubmVjdG9yICIgKyBjb21wb25lbnQuZ2V0TmFtZSgpICsgSU1vZHVsZUV4dGVuc2lvbnMuRE9UX0pBUjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCQlyZXQgPSBjb21wb25lbnQuZ2V0TmFtZSgpICsgSU1vZHVsZUV4dGVuc2lvbnMuRE9UX0pBUjsKLQkJCX0gZWxzZSBpZiAoY29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCB2aXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCljb21wb25lbnQ7Ci0JCQkJU3RyaW5nIGRlcGxveWVkTmFtZSA9IHZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpOwotCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRlcGxveWVkTmFtZSk7Ci0JCQkJcmV0dXJuIHBhdGgubGFzdFNlZ21lbnQoKTsKLQkJCX0KLQkJfSAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdyb3VwRUFSUHJvdmlkZXIpewotCQkJcmV0ID0gKChHcm91cEVBUlByb3ZpZGVyKSBlbGVtZW50KS5nZXRUZXh0KCk7IAotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VqYjNDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWpiM0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmE4MjM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWpiM0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5KbmRpUmVmTm9kZS5LSU5EUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5JbnRlcmZhY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFSkJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogRWpiIDMuMCBDb250ZW50IHByb3ZpZGVyIGlzIERlcGxveW1lbnQgRGVzY3JpcHRvciBjb250ZW50IHByb3ZpZGVyLCAKLSAqIHVzZWQgZm9yIGNvbnN0cnVjdGluZyBvZiB0aGUgZGVzY3JpcHRvciB0cmVlIGluIHByb2plY3QgZXhwbG9yZXIuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgY2xhc3MgRWpiM0NvbnRlbnRQcm92aWRlciBleHRlbmRzIEpFRTVDb250ZW50UHJvdmlkZXIgewotCi0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGFQYXJlbnRFbGVtZW50KSB7Ci0JCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCQlpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIHsKLQkJCUxpc3QgbHN0ID0gKChBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIGFQYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJY2hpbGRyZW4uYWRkQWxsKGxzdCk7Ci0JCX0gZWxzZSBpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdERETm9kZSkgewotCQkJTGlzdCBsc3QgPSAoKEFic3RyYWN0REROb2RlKSBhUGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWNoaWxkcmVuLmFkZEFsbChsc3QpOwotCQl9IGVsc2UgaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pIHsKLQkJCVNlc3Npb25CZWFuIHNiID0gKChTZXNzaW9uQmVhbilhUGFyZW50RWxlbWVudCk7Ci0JCQlhZGRTZXNzaW9uQmVhblN1Yk5vZGVzKHNiLCBjaGlsZHJlbik7Ci0KLQkJfSBlbHNlIGlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEVudGl0eUJlYW4pIHsKLQkJCUVudGl0eUJlYW4gZWIgPSAoKEVudGl0eUJlYW4pYVBhcmVudEVsZW1lbnQpOwotCi0JCQlhZGRFbnRpdHlCZWFuU3ViTm9kZXMoZWIsIGNoaWxkcmVuKTsKLQotCQl9IGVsc2UgaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbkJlYW4pIHsKLQkJCU9iamVjdCBtc2dCZWFuID0gbmV3IEJlYW5Ob2RlKChNZXNzYWdlRHJpdmVuQmVhbikgYVBhcmVudEVsZW1lbnQpOwotCQkJYWRkQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKE1lc3NhZ2VEcml2ZW5CZWFuKSBhUGFyZW50RWxlbWVudCwgY2hpbGRyZW4pOwotCQkJY2hpbGRyZW4uYWRkKG1zZ0JlYW4pOwotCQl9IGVsc2UgCi0JCQlpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBhUGFyZW50RWxlbWVudCkKLQkJCQkuZ2V0QWRhcHRlcihJUFJPSkVDVF9DTEFTUyk7Ci0JCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQlpZiAoaXNFamJNb2R1bGVQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCQlHcm91cEVKQlByb3ZpZGVyIHJvb3QgPSAoR3JvdXBFSkJQcm92aWRlcikgZ2V0Q2FjaGVkQ29udGVudFByb3ZpZGVyKHByb2plY3QpOwotCQkJCQkJY2hpbGRyZW4uYWRkKHJvb3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyhNZXNzYWdlRHJpdmVuQmVhbiBwYXJlbnRFbGVtZW50LAotCQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuKSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50LmdldEFjdGl2YXRpb25Db25maWcoKSAhPSBudWxsICYmIHBhcmVudEVsZW1lbnQuZ2V0QWN0aXZhdGlvbkNvbmZpZygpLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkgIT0gbnVsbCAmJiAhcGFyZW50RWxlbWVudC5nZXRBY3RpdmF0aW9uQ29uZmlnKCkuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyhwYXJlbnRFbGVtZW50LmdldEFjdGl2YXRpb25Db25maWcoKS5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRW50aXR5QmVhblN1Yk5vZGVzKEVudGl0eUJlYW4gZWIsIExpc3Q8T2JqZWN0PiBjaGlsZHJlbikgewotCQlpZiAoZWIuZ2V0TG9jYWwoKSAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5JbnRlcmZhY2VOb2RlKGViLCAoU3RyaW5nKWViLmdldExvY2FsKCksIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkxPQ0FMKSk7Ci0JCX0KLQkJaWYgKGViLmdldExvY2FsSG9tZSgpICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbkludGVyZmFjZU5vZGUoZWIsIChTdHJpbmcpZWIuZ2V0TG9jYWxIb21lKCksIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkxPQ0FMX0hPTUUpKTsKLQkJfQotCi0JCWlmIChlYi5nZXRSZW1vdGUoKSAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5JbnRlcmZhY2VOb2RlKGViLCAoU3RyaW5nKWViLmdldFJlbW90ZSgpLCBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5SRU1PVEUpKTsKLQkJfQotCQlpZiAoZWIuZ2V0SG9tZSgpICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbkludGVyZmFjZU5vZGUoZWIsIChTdHJpbmcpZWIuZ2V0SG9tZSgpLCBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5SRU1PVEVfSE9NRSkpOwotCQl9Ci0KLQotCQljaGlsZHJlbi5hZGQobmV3IEJlYW5Ob2RlKChFbnRpdHlCZWFuKSBlYikpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlc3Npb25CZWFuU3ViTm9kZXMoU2Vzc2lvbkJlYW4gc2IsIExpc3QgY2hpbGRyZW4pIHsKLQkJYWRkQ2xhc3NSZWxhdGVkSW5mbyhzYiwgY2hpbGRyZW4pOwotCQlhZGRTZXNzaW9uSk5ESVJlZkluZm8oc2IsIGNoaWxkcmVuKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU2Vzc2lvbkpORElSZWZJbmZvKFNlc3Npb25CZWFuIHNiLCBMaXN0IGNoaWxkcmVuKSB7Ci0JCWlmIChzYi5nZXRFamJMb2NhbFJlZnMoKSAhPSBudWxsICYmICFzYi5nZXRFamJMb2NhbFJlZnMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShzYi5nZXRFamJMb2NhbFJlZnMoKSwgS0lORFMuRUpCTE9DQUxSRUYpKTsKLQkJfQotCi0JCWlmIChzYi5nZXRFamJSZWZzKCkgIT0gbnVsbCAmJiAhc2IuZ2V0RWpiUmVmcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKHNiLmdldEVqYlJlZnMoKSwgS0lORFMuRUpCUkVGKSk7Ci0JCX0KLQotCQlpZiAoc2IuZ2V0UmVzb3VyY2VFbnZSZWZzKCkgIT0gbnVsbCAmJiAhc2IuZ2V0UmVzb3VyY2VFbnZSZWZzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoc2IuZ2V0UmVzb3VyY2VFbnZSZWZzKCksIEtJTkRTLlJFU0VOVkVOVFkpKTsKLQkJfQotCQlpZiAoc2IuZ2V0RW52RW50cmllcygpICE9IG51bGwgJiYgIXNiLmdldEVudkVudHJpZXMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShzYi5nZXRFbnZFbnRyaWVzKCksIEtJTkRTLkVOVkVOVFJZKSk7Ci0JCX0KLQotCQlpZiAoc2IuZ2V0UmVzb3VyY2VSZWZzKCkgIT0gbnVsbCAmJiAhc2IuZ2V0UmVzb3VyY2VSZWZzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoc2IuZ2V0UmVzb3VyY2VSZWZzKCksIEtJTkRTLlJFU1JFRikpOwotCQl9Ci0KLQkJaWYgKHNiLmdldFNlcnZpY2VSZWZzKCkgIT0gbnVsbCAmJiAhc2IuZ2V0U2VydmljZVJlZnMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShzYi5nZXRTZXJ2aWNlUmVmcygpLCBLSU5EUy5TRVJWSUNFUkVGKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU2Vzc2lvbkpORElSZWZJbmZvKEVudGl0eUJlYW4gZWIsIExpc3QgY2hpbGRyZW4pIHsKLQkJaWYgKGViLmdldEVqYkxvY2FsUmVmcygpICE9IG51bGwgJiYgIWViLmdldEVqYkxvY2FsUmVmcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKGViLmdldEVqYkxvY2FsUmVmcygpLCBLSU5EUy5FSkJMT0NBTFJFRikpOwotCQl9Ci0KLQkJaWYgKGViLmdldEVqYlJlZnMoKSAhPSBudWxsICYmICFlYi5nZXRFamJSZWZzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoZWIuZ2V0RWpiUmVmcygpLCBLSU5EUy5FSkJSRUYpKTsKLQkJfQotCi0JCWlmIChlYi5nZXRSZXNvdXJjZUVudlJlZnMoKSAhPSBudWxsICYmICFlYi5nZXRSZXNvdXJjZUVudlJlZnMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShlYi5nZXRSZXNvdXJjZUVudlJlZnMoKSwgS0lORFMuUkVTRU5WRU5UWSkpOwotCQl9Ci0JCWlmIChlYi5nZXRFbnZFbnRyaWVzKCkgIT0gbnVsbCAmJiAhZWIuZ2V0RW52RW50cmllcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKGViLmdldEVudkVudHJpZXMoKSwgS0lORFMuRU5WRU5UUlkpKTsKLQkJfQotCi0JCWlmIChlYi5nZXRSZXNvdXJjZVJlZnMoKSAhPSBudWxsICYmICFlYi5nZXRSZXNvdXJjZVJlZnMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShlYi5nZXRSZXNvdXJjZVJlZnMoKSwgS0lORFMuUkVTUkVGKSk7Ci0JCX0KLQotCQlpZiAoZWIuZ2V0U2VydmljZVJlZnMoKSAhPSBudWxsICYmICFlYi5nZXRTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKGViLmdldFNlcnZpY2VSZWZzKCksIEtJTkRTLlNFUlZJQ0VSRUYpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc1JlbGF0ZWRJbmZvKFNlc3Npb25CZWFuIHNiLCBMaXN0IGNoaWxkcmVuKSB7Ci0JCWlmIChzYi5nZXRMb2NhbCgpICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbkludGVyZmFjZU5vZGUoc2IsIChTdHJpbmcpc2IuZ2V0TG9jYWwoKSwgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuTE9DQUwpKTsKLQkJfQotCQkKLQkJaWYgKHNiLmdldExvY2FsSG9tZSgpICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbkludGVyZmFjZU5vZGUoc2IsIChTdHJpbmcpc2IuZ2V0TG9jYWxIb21lKCksIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkxPQ0FMX0hPTUUpKTsKLQkJfQotCi0JCWlmIChzYi5nZXRSZW1vdGUoKSAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5JbnRlcmZhY2VOb2RlKHNiLCAoU3RyaW5nKXNiLmdldFJlbW90ZSgpLCBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5SRU1PVEUpKTsKLQkJfQotCQkKLQkJaWYgKHNiLmdldEhvbWUoKSAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5JbnRlcmZhY2VOb2RlKHNiLCAoU3RyaW5nKXNiLmdldEhvbWUoKSwgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuUkVNT1RFX0hPTUUpKTsKLQkJfQotCi0JCWlmIChzYi5nZXRFamJDbGFzcygpICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbk5vZGUoKFNlc3Npb25CZWFuKSBzYikpOwotCQl9Ci0JCQotCQlMaXN0IHIgPSBzYi5nZXRCdXNpbmVzc0xvY2FscygpOwotCQlmb3IgKE9iamVjdCBsb2NhbHMgOiByKSB7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5JbnRlcmZhY2VOb2RlKHNiLCAoU3RyaW5nKWxvY2FscywgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuQlVTU0lORVNTX0xPQ0FMKSk7Ci0JCX0KLQkJCi0JCXIgPSBzYi5nZXRCdXNpbmVzc1JlbW90ZXMoKTsKLQkJZm9yIChPYmplY3QgbG9jYWxzIDogcikgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuSW50ZXJmYWNlTm9kZShzYiwgKFN0cmluZylsb2NhbHMsIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkJVU1NJTkVTU19SRU1PVEUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VqYk1vZHVsZVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJSVByb2plY3RGYWNldFZlcnNpb24gaW5zdGFsbGVkVmVyc2lvbiA9IGZhY2V0ZWRQcm9qZWN0LmdldEluc3RhbGxlZFZlcnNpb24oUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElKMkVFRmFjZXRDb25zdGFudHMuRUpCKS5nZXRWZXJzaW9uKElKMkVFRmFjZXRDb25zdGFudHMuRUpCXzMwLmdldFZlcnNpb25TdHJpbmcoKSkuZ2V0UHJvamVjdEZhY2V0KCkpOwotCQkJcmV0dXJuIGluc3RhbGxlZFZlcnNpb24gIT0gbnVsbDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKRUVVSVBsdWdpbi5sb2dFcnJvcigiQ2FuIG5vdCBhY2NlcyBwcm9qZWN0IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKEFic3RyYWN0R3JvdXBQcm92aWRlcikgZWxlbWVudCkuaGFzQ2hpbGRyZW4oKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RERE5vZGUpIHsKLQkJCXJldHVybiAoKEFic3RyYWN0REROb2RlKSBlbGVtZW50KS5oYXNDaGlsZHJlbigpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVudGl0eUJlYW4pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0R3JvdXBQcm92aWRlciBnZXROZXdDb250ZW50UHJvdmlkZXJJbnN0YW5jZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlNb2RlbFByb3ZpZGVyIGNhY2hlZE1vZGVsUHJvdmlkZXIgPSBnZXRDYWNoZWRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotCQlHcm91cEVKQlByb3ZpZGVyIHJvb3QgPSBuZXcgR3JvdXBFSkJQcm92aWRlcigoRUpCSmFyKSBjYWNoZWRNb2RlbFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCkpOwotCQlyb290LnNldFByb2plY3ROYW1lKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FamIzTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FamIzTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGE4YTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWpiM0xhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLklKMkVFTmF2aWdhdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuTG9hZGluZ0RETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFSkJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5EeW5hbWljQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogRWpiIDMuMCBMYWJlbCBwcm92aWRlciBpcyBEZXBsb3ltZW50IERlc2NyaXB0b3IgbGFiZWwgcHJvdmlkZXIsIAotICogdXNlZCBmb3IgZGVjb3JhdGluZyBvZiB0aGUgZGVzY3JpcHRvciB0cmVlIGluIHByb2plY3QgZXhwbG9yZXIuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgY2xhc3MgRWpiM0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFTGFiZWxQcm92aWRlciB7Ci0KLSAgcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgZGVsZWdhdGVMYWJlbFByb3ZpZGVyOwotICAKLSAgcHVibGljIEVqYjNMYWJlbFByb3ZpZGVyKCkgewotICAgIGRlbGVnYXRlTGFiZWxQcm92aWRlciA9IG5ldyBKMkVFQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKG5ldyBEeW5hbWljQWRhcHRlckZhY3RvcnkoSUoyRUVOYXZpZ2F0b3JDb25zdGFudHMuVklFV0VSX0lEKSk7Ci0gIH0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgcmV0ID0gbnVsbDsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIExvYWRpbmdERE5vZGUpCi0gICAgICAgICAgcmV0dXJuICgoTG9hZGluZ0RETm9kZSllbGVtZW50KS5nZXRJbWFnZSgpOwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KQotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgaWYoZWxlbWVudCBpbnN0YW5jZW9mIEdyb3VwRUpCUHJvdmlkZXIpIHsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSkVFVUlQbHVnaW5JY29ucy5JTUdfRUpCRUVNT0RFTCk7Ci0gICAgICAgIHJldHVybiBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLSAgICAgIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdERETm9kZSl7Ci0gICAgICAgIHJldHVybiAoKEFic3RyYWN0REROb2RlKWVsZW1lbnQgKS5nZXRJbWFnZSgpOwotICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbil7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZXNzaW9uQmVhbl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKXsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIm1lc3NhZ2VfYmVhbl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVudGl0eUJlYW4pewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiY21wRW50aXR5X29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVqYkxvY2FsUmVmIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBFamJSZWYpewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZWpiUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbnZFbnRyeSl7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJyZXNvdXJjZVJlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVzb3VyY2VFbnZSZWYpewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgicmVzb3VyY2VSZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlc291cmNlUmVmKXsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInJlc291cmNlUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKXsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImF0dHJpYnV0ZV9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfSBlbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkpewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiYWNjZXNzX2ludGVudF9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfQotICAgICAgCi0gICAgICAKLSAgICAgICAgCi0gICAgICByZXR1cm4gcmV0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlTdHJpbmcgcmV0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbkJlYW4gfHwgZWxlbWVudCBpbnN0YW5jZW9mIEVudGl0eUJlYW4pIHsKLQkJCXJldCA9IChlbGVtZW50IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pID8gKChTZXNzaW9uQmVhbikgZWxlbWVudCkuZ2V0RWpiTmFtZSgpIDogCi0JCQkgICAgICAgICAgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbikgPyAoKE1lc3NhZ2VEcml2ZW5CZWFuKSBlbGVtZW50KS5nZXRFamJOYW1lKCkgOiAKLQkJCSAgICAgICAgICAgIChlbGVtZW50IGluc3RhbmNlb2YgRW50aXR5QmVhbikgPyAoKEVudGl0eUJlYW4pIGVsZW1lbnQpLmdldEVqYk5hbWUoKSA6IG51bGw7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0REROb2RlKSB7Ci0JCQlyZXQgPSAoKEFic3RyYWN0REROb2RlKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0R3JvdXBQcm92aWRlcikgewotCQkJcmV0ID0gKChBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIGVsZW1lbnQpLmdldFRleHQoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWpiTG9jYWxSZWYgfHwgZWxlbWVudCBpbnN0YW5jZW9mIEVqYlJlZil7Ci0JCSAgcmV0ICA9IGVsZW1lbnQgaW5zdGFuY2VvZiBFamJMb2NhbFJlZiA/ICgoRWpiTG9jYWxSZWYpZWxlbWVudCkuZ2V0RWpiUmVmTmFtZSgpIDogZWxlbWVudCBpbnN0YW5jZW9mIEVqYlJlZiA/ICgoRWpiUmVmKWVsZW1lbnQpLmdldEVqYlJlZk5hbWUoKSA6IG51bGw7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVudkVudHJ5KXsKLQkJICByZXQgPSAoKEVudkVudHJ5KSBlbGVtZW50KS5nZXRFbnZFbnRyeU5hbWUoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVzb3VyY2VFbnZSZWYpewotCQkgIHJldCA9ICgoUmVzb3VyY2VFbnZSZWYpIGVsZW1lbnQpLmdldFJlc291cmNlRW52UmVmTmFtZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZVJlZil7Ci0JCSAgcmV0ID0gKChSZXNvdXJjZVJlZikgZWxlbWVudCkuZ2V0UmVzUmVmTmFtZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKXsKLQkJICByZXQgPSAoKFNlcnZpY2VSZWYpIGVsZW1lbnQpLmdldFNlcnZpY2VSZWZOYW1lKCk7Ci0JCX1lbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkpewotCQkgIHJldCA9ICgoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KWVsZW1lbnQpLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKSArICI6IiArKChBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkpZWxlbWVudCkuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCSAgICB9Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBhbkVsZW1lbnQpIHsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gc3VwZXIuZ2V0RGVzY3JpcHRpb24oYW5FbGVtZW50KTsKLQotCQlpZiAoYW5FbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RERE5vZGUpIHsKLQkJCVN0cmluZyBkZXNjID0gKChBYnN0cmFjdERETm9kZSkgYW5FbGVtZW50KS5nZXREZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCWRlc2NyaXB0aW9uID0gZGVzYzsKLQkJCX0KLQkJfSAKLQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pFRTVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSkVFNUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjBmYTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSkVFNUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuRU1GUm9vdE9iamVjdFByb3ZpZGVyLklSZWZyZXNoSGFuZGxlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKRUU1Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIsIElSZWZyZXNoSGFuZGxlckxpc3RlbmVyLCBJTW9kZWxQcm92aWRlckxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgVmlld2VyIHZpZXdlcjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElQUk9KRUNUX0NMQVNTID0gSVByb2plY3QuY2xhc3M7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIE1hcDxJUHJvamVjdCwgSU1vZGVsUHJvdmlkZXI+IGdyb3VwUHJvdmlkZXJzTWFwID0gbmV3IEhhc2hNYXA8SVByb2plY3QsIElNb2RlbFByb3ZpZGVyPigpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBNYXA8SVByb2plY3QsIEFic3RyYWN0R3JvdXBQcm92aWRlcj4gZ3JvdXBDb250ZW50UHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8SVByb2plY3QsIEFic3RyYWN0R3JvdXBQcm92aWRlcj4oKTsKLQotCi0JcHVibGljIEpFRTVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IGFuT2xkSW5wdXQsIE9iamVjdCBhTmV3SW5wdXQpIHsKLQkJdmlld2VyID0gYVZpZXdlcjsKLQl9Ci0KLQotCXByb3RlY3RlZCBJTW9kZWxQcm92aWRlciBnZXRDYWNoZWRNb2RlbFByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBncm91cFByb3ZpZGVyc01hcC5nZXQocHJvamVjdCk7Ci0JCWlmIChwcm92aWRlciA9PSBudWxsKXsKLQkJCXByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KTsKLQkJCXByb3ZpZGVyLmFkZExpc3RlbmVyKHRoaXMpOwotCQkJZ3JvdXBQcm92aWRlcnNNYXAucHV0KHByb2plY3QscHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RHcm91cFByb3ZpZGVyIGdldENhY2hlZENvbnRlbnRQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUFic3RyYWN0R3JvdXBQcm92aWRlciBwcm92aWRlciA9IGdyb3VwQ29udGVudFByb3ZpZGVycy5nZXQocHJvamVjdCk7Ci0JCWlmIChwcm92aWRlciA9PSBudWxsKXsKLQkJCXByb3ZpZGVyID0gZ2V0TmV3Q29udGVudFByb3ZpZGVySW5zdGFuY2UocHJvamVjdCk7Ci0JCQlncm91cENvbnRlbnRQcm92aWRlcnMucHV0KHByb2plY3QsIHByb3ZpZGVyKTsKLQkJfSBlbHNlIHsKLQkJCU9iamVjdCBtb2RlbE9iamVjdCA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCkuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCWlmIChwcm92aWRlci5nZXRKYXZhRUVPYmplY3QoKSAhPSBtb2RlbE9iamVjdCl7Ci0JCQkJaWYgKG1vZGVsT2JqZWN0ID09IG51bGwpewotCQkJCQlwcm92aWRlci5zZXRWYWxpZChmYWxzZSk7Ci0JCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCQl9Ci0KLQkJCQlwcm92aWRlci5yZWluaXQoKEphdmFFRU9iamVjdCltb2RlbE9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdEdyb3VwUHJvdmlkZXIgZ2V0TmV3Q29udGVudFByb3ZpZGVySW5zdGFuY2UoSVByb2plY3QgcHJvamVjdCk7Ci0KLQotCXB1YmxpYyB2b2lkIHByb2plY3RDaGFuZ2VkKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVJ1bm5hYmxlIHJlZnJlc2hUaHJlYWQgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJCXRyeXsKLQkJCQkJCQlpZiggdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkgKXsKLQkJCQkJCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCQkJCQlJU2VsZWN0aW9uIHNlbCA9ICgoVHJlZVZpZXdlcikgdmlld2VyKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikgKChUcmVlVmlld2VyKSB2aWV3ZXIpCi0JCQkJCQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpKTsKLQkJCQkJCQkJY29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKHByb2plY3QpOwotCQkJCQkJCQkKLQkJCQkJCQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9ICgoVHJlZVZpZXdlcikgdmlld2VyKS5nZXRFeHBhbmRlZEVsZW1lbnRzKCk7Ci0JCQkJCQkJCQotCQkJCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcikucmVmcmVzaChwcm9qZWN0KTsKLQkJCQkJCQkJKChUcmVlVmlld2VyKSB2aWV3ZXIpLnNldFNlbGVjdGlvbihzZWwpOwotCQkJCQkJCQkKLQkJCQkJCQkJQXJyYXlMaXN0PE9iamVjdD4gbmV3RXhwYW5kZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCQkJCQkKLQkJCQkJCQkJQXJyYXlMaXN0PE9iamVjdD4gYWxsRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQkJCQkJZ2V0Vmlld2VyRWxlbWVudHMoYWxsRWxlbWVudHMsICgoVHJlZVZpZXdlcikgdmlld2VyKS5nZXRDb250cm9sKCkpOwotCQkJCQkJCQkKLQkJCQkJCQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50c0FmdGVyUmVmcmVzaCA9ICgoVHJlZVZpZXdlcikgdmlld2VyKS5nZXRFeHBhbmRlZEVsZW1lbnRzKCk7Ci0JCQkJCQkJCW5ld0V4cGFuZGVkRWxlbWVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZXhwYW5kZWRFbGVtZW50c0FmdGVyUmVmcmVzaCkpOwotCQkJCQkJCQlmb3IoaW50IGk9MDtpIDwgZXhwYW5kZWRFbGVtZW50cy5sZW5ndGg7aSsrKXsKLQkJCQkJCQkJCWJvb2xlYW4gZXhwYW5kZWQgPSBmYWxzZTsKLQkJCQkJCQkJCWZvcihpbnQgaj0wO2ogPCBleHBhbmRlZEVsZW1lbnRzQWZ0ZXJSZWZyZXNoLmxlbmd0aDsgaisrKXsKLQkJCQkJCQkJCQlpZihleHBhbmRlZEVsZW1lbnRzW2ldLmVxdWFscyhleHBhbmRlZEVsZW1lbnRzQWZ0ZXJSZWZyZXNoW2pdKSl7Ci0JCQkJCQkJCQkJCWV4cGFuZGVkID0gdHJ1ZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZighZXhwYW5kZWQpewotCQkJCQkJCQkJCWZvcihPYmplY3Qgb2IgOiBhbGxFbGVtZW50cyl7Ci0JCQkJCQkJCQkJCWlmKG9iIGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4KLQkJCQkJCQkJCQkJCQkmJiBleHBhbmRlZEVsZW1lbnRzW2ldIGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pewotCQkJCQkJCQkJCQkJU2Vzc2lvbkJlYW4gYmVhbiA9IChTZXNzaW9uQmVhbikgb2I7Ci0JCQkJCQkJCQkJCQlTZXNzaW9uQmVhbiBiZWFuMiA9IChTZXNzaW9uQmVhbikgZXhwYW5kZWRFbGVtZW50c1tpXTsKLQkJCQkJCQkJCQkJCWlmKGJlYW4uZ2V0RWpiTmFtZSgpLmVxdWFscyhiZWFuMi5nZXRFamJOYW1lKCkpKXsKLQkJCQkJCQkJCQkJCQluZXdFeHBhbmRlZEVsZW1lbnRzLmFkZChvYik7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJaWYob2IgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbgotCQkJCQkJCQkJCQkJCSYmIGV4cGFuZGVkRWxlbWVudHNbaV0gaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbil7Ci0JCQkJCQkJCQkJCQlNZXNzYWdlRHJpdmVuQmVhbiBiZWFuID0gKE1lc3NhZ2VEcml2ZW5CZWFuKSBvYjsKLQkJCQkJCQkJCQkJCU1lc3NhZ2VEcml2ZW5CZWFuIGJlYW4yID0gKE1lc3NhZ2VEcml2ZW5CZWFuKSBleHBhbmRlZEVsZW1lbnRzW2ldOwotCQkJCQkJCQkJCQkJaWYoYmVhbi5nZXRFamJOYW1lKCkuZXF1YWxzKGJlYW4yLmdldEVqYk5hbWUoKSkpewotCQkJCQkJCQkJCQkJCW5ld0V4cGFuZGVkRWxlbWVudHMuYWRkKG9iKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQlpZihvYiBpbnN0YW5jZW9mIEVudGl0eUJlYW4KLQkJCQkJCQkJCQkJCQkmJiBleHBhbmRlZEVsZW1lbnRzW2ldIGluc3RhbmNlb2YgRW50aXR5QmVhbil7Ci0JCQkJCQkJCQkJCQlFbnRpdHlCZWFuIGJlYW4gPSAoRW50aXR5QmVhbikgb2I7Ci0JCQkJCQkJCQkJCQlFbnRpdHlCZWFuIGJlYW4yID0gKEVudGl0eUJlYW4pIGV4cGFuZGVkRWxlbWVudHNbaV07Ci0JCQkJCQkJCQkJCQlpZihiZWFuLmdldEVqYk5hbWUoKS5lcXVhbHMoYmVhbjIuZ2V0RWpiTmFtZSgpKSl7Ci0JCQkJCQkJCQkJCQkJbmV3RXhwYW5kZWRFbGVtZW50cy5hZGQob2IpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCSgoVHJlZVZpZXdlcikgdmlld2VyKS5zZXRFeHBhbmRlZEVsZW1lbnRzKG5ld0V4cGFuZGVkRWxlbWVudHMudG9BcnJheSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQl9ZmluYWxseXsKLQkJCQkJCQlpZiggdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkgKXsKLQkJCQkJCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyZWZyZXNoVGhyZWFkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUpFRVVJUGx1Z2luLmxvZ0Vycm9yKCJFcnJvciBkdXJpbmcgcmVmcmVzaCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0Vmlld2VyRWxlbWVudHMoTGlzdCByZXN1bHQsIFdpZGdldCB3aWRnZXQpIHsKLQkJSXRlbVtdIGl0ZW1zID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlyZXN1bHQuYWRkKGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCWdldFZpZXdlckVsZW1lbnRzKHJlc3VsdCwgaXRlbSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZW1bXSBnZXRDaGlsZHJlbihXaWRnZXQgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0JCQlyZXR1cm4gKChUcmVlSXRlbSkgbykuZ2V0SXRlbXMoKTsKLQkJfQotCQlpZiAobyBpbnN0YW5jZW9mIFRyZWUpIHsKLQkJCXJldHVybiAoKFRyZWUpIG8pLmdldEl0ZW1zKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vZGVsc0NoYW5nZWQoSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCkgewotCQlwcm9qZWN0Q2hhbmdlZChldmVudC5nZXRQcm9qZWN0KCkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgb25SZWZyZXNoKGZpbmFsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKSB7Ci0JCQkJKChBYnN0cmFjdFRyZWVWaWV3ZXIpIHZpZXdlcikucmVmcmVzaChlbGVtZW50LCB0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogQ3JlYXRlIGFuZCBzY2hlZHVsZSBhIFVJIEpvYiB0byB1cGRhdGUgdGhlIE5hdmlnYXRvciBDb250ZW50IFZpZXdlciAqLwotCQkJCUpvYiBqb2IgPSBuZXcgVUlKb2IoIlVwZGF0ZSB0aGUgTmF2aWdhdG9yIENvbnRlbnQgVmlld2VyIEpvYiIpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJKChBYnN0cmFjdFRyZWVWaWV3ZXIpIHZpZXdlcikucmVmcmVzaChlbGVtZW50LCB0cnVlKTsKLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IG5ldyBJU2NoZWR1bGluZ1J1bGUoKSB7Ci0JCQkJCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCQkJCQlyZXR1cm4gcnVsZSA9PSB0aGlzOwkKLQkJCQkJfQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCQkJCQlyZXR1cm4gcnVsZSA9PSB0aGlzOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlpZiAocnVsZSAhPSBudWxsKSB7Ci0JCQkJCWpvYi5zZXRSdWxlKHJ1bGUpOwotCQkJCX0KLQkJCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWdyb3VwUHJvdmlkZXJzTWFwLmNsZWFyKCk7Ci0JCWdyb3VwQ29udGVudFByb3ZpZGVycy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgJiYgZXZlbnQuZ2V0UmVzb3VyY2UoKSAhPSBudWxsICYmIGV2ZW50LmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKXsKLQkJCWdyb3VwQ29udGVudFByb3ZpZGVycy5yZW1vdmUoZXZlbnQuZ2V0UmVzb3VyY2UoKSk7CQotCQkJZ3JvdXBQcm92aWRlcnNNYXAucmVtb3ZlKGV2ZW50LmdldFJlc291cmNlKCkpOwkJCi0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9KRUVBY3Rpb25Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9KRUVBY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTE3ZWI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSkVFQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuSmF2YUVFQXJjaGl2ZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkNvbXBvbmVudEFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbkludGVyZmFjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLk9wZW5XaXRoTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLnBsdWdpbi5Xb3JrYmVuY2hOYXZpZ2F0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25BY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTWVudUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi0vKioKLSAqIFN0YW5kYXJkIG9wZXJhdGlvbnMgSmF2YSBFRSBBY3Rpb24gUHJvdmlkZXIuCi0gKiBJbnRyb2R1Y2VzIHN0YW5kYXJkIG9wZXJhdGlvbnMgZm9yIERlcGxveW1lbnQgZGVzY3JpcHRvciB0cmVlIG5vZGVzLiAobGlrZSBvcGVuKSAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKRUVBY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIHsKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVJFU09VUkNFX0NMQVNTID0gSVJlc291cmNlLmNsYXNzOwotCQotCXByaXZhdGUgT3BlbkpFRVJlc291cmNlQWN0aW9uIG9wZW5BY3Rpb247IAotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBKRUVBY3Rpb25Qcm92aWRlcigpIHsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLklDb21tb25BY3Rpb25Qcm92aWRlciNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmV4dGVuc2lvbnMuTmF2aWdhdG9yQ29udGVudFNlcnZpY2UpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBhQ29uZmlnKSB7CSAgCi0JCW9wZW5BY3Rpb24gPSBuZXcgT3BlbkpFRVJlc291cmNlQWN0aW9uKCk7IAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjc2V0QWN0aW9uQ29udGV4dChvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dChBY3Rpb25Db250ZXh0IGFDb250ZXh0KSB7Ci0JCQotCQlpZiAoYUNvbnRleHQgIT0gbnVsbCAmJiBhQ29udGV4dC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFDb250ZXh0LmdldFNlbGVjdGlvbigpOwotCi0JCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQotCQkJT2JqZWN0W10gYXJyYXkgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJaWYgKGlzVXRpbGl0eUphcnMoYXJyYXkpKSB7Ci0JCQkJSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgdXRpbGl0eUphckl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJTGlzdCBuZXdTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQl1dGlsaXR5SmFySXRlbVByb3ZpZGVyID0gKEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyKSBhcnJheVtpXTsKLQkJCQkJbmV3U2VsZWN0aW9uLmFkZEFsbCh1dGlsaXR5SmFySXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKG51bGwpKTsKLQkJCQl9Ci0JCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCQlzdXBlci5zZXRDb250ZXh0KGFDb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmFjdGlvbnMuSUNvbW1vbkFjdGlvblByb3ZpZGVyI2ZpbGxBY3Rpb25CYXJzKG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIHRoZUFjdGlvbkJhcnMpIHsKLQkJaWYob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkgCi0JCQl0aGVBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSUNvbW1vbkFjdGlvbkNvbnN0YW50cy5PUEVOLCBvcGVuQWN0aW9uKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjZmlsbENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBhTWVudSkgewkJCi0JCWlmIChnZXRDb250ZXh0KCk9PW51bGwgfHwgZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmKCFhZGFwdHNUb1Jlc291cmNlKHNlbGVjdGlvbi50b0FycmF5KCkpKSB7Ci0JCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLS8vCQkJY3JlYXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQkJCWlmIChvcGVuQWN0aW9uLmlzRW5hYmxlZCgpKQotCQkJCWFNZW51Lmluc2VydEFmdGVyKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX09QRU4sIG9wZW5BY3Rpb24pOwotLy8JCQlpZiAoY3JlYXRlQWN0aW9uLmlzRW5hYmxlZCgpKQotLy8JCQkJYU1lbnUuaW5zZXJ0QWZ0ZXIoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTiwgY3JlYXRlQWN0aW9uKTsKLQkJCWFkZE9wZW5XaXRoTWVudShhTWVudSk7Ci0JCQkKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGFwdHNUb1Jlc291cmNlKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihvYmplY3RzW2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKG9iamVjdHNbaV0gaW5zdGFuY2VvZiBJQWRhcHRhYmxlICYmICgoKElBZGFwdGFibGUpb2JqZWN0c1tpXSkuZ2V0QWRhcHRlcihJUkVTT1VSQ0VfQ0xBU1MpICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNVdGlsaXR5SmFycyhPYmplY3RbXSBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpdGVtc1tpXSA9PSBudWxsIHx8IGl0ZW1zW2ldLmdldENsYXNzKCkgIT0gSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIuY2xhc3MpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9IAotCSAKLQlwcml2YXRlIHZvaWQgYWRkT3BlbldpdGhNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcz0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJaWYgKHNzLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuOwotCi0JCU9iamVjdCBzcmNPYmplY3QgPSBzcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJT2JqZWN0IHJlc291cmNlID0gbnVsbDsKLQkJCi0JCWlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXNvdXJjZSA9IG9wZW5FT2JqZWN0KChFT2JqZWN0KSBzcmNPYmplY3QpOwotCQl9IGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEJlYW5JbnRlcmZhY2VOb2RlKSB7Ci0JCQlyZXNvdXJjZSA9ICgoQmVhbkludGVyZmFjZU5vZGUpIHNyY09iamVjdCkuZ2V0X2ZxbigpOwotCQl9IGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEJlYW5Ob2RlKSB7Ci0JCQlyZXNvdXJjZSA9ICgoQmVhbk5vZGUpIHNyY09iamVjdCkuZ2V0RWpiQ2xhc3NRdWFsaWZpZWROYW1lKCk7Ci0KLQkJfSBlbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBXZWJBcHBQcm92aWRlcikgewotCQkJSUZpbGUgZmlsZSA9ICgoV2ViQXBwUHJvdmlkZXIpIHNyY09iamVjdCkuZ2V0RERGaWxlKCk7Ci0JCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSl7CQkJCQotCQkJCXJlc291cmNlID0gZmlsZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBHcm91cEVKQlByb3ZpZGVyKSB7Ci0JCQlyZXNvdXJjZSA9IG9wZW5FT2JqZWN0KChFT2JqZWN0KSAoKEdyb3VwRUpCUHJvdmlkZXIpc3JjT2JqZWN0KS5nZXRFamJKYXIoKSk7Ci0JCX0gZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgR3JvdXBFQVJQcm92aWRlcikgewotCQkJSUZpbGUgZmlsZSA9ICgoR3JvdXBFQVJQcm92aWRlcikgc3JjT2JqZWN0KS5nZXREREZpbGUoKTsKLQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKXsKLQkJCQlyZXNvdXJjZSA9IGZpbGU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICghKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpKQotCQkJcmV0dXJuOyAKLQotCQkvLyBDcmVhdGUgYSBtZW51LgotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJTWVudU1hbmFnZXIgc3VibWVudT0gbmV3IE1lbnVNYW5hZ2VyKFdvcmtiZW5jaE5hdmlnYXRvck1lc3NhZ2VzLk9wZW5BY3Rpb25Qcm92aWRlcl9PcGVuV2l0aE1lbnVfbGFiZWwsIAotCQkJCUlDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX09QRU5fV0lUSCk7IAotCQlzdWJtZW51LmFkZChuZXcgT3BlbldpdGhNZW51KHBhZ2UsIChJRmlsZSkgcmVzb3VyY2UpKTsKLQotCQkvLyBBZGQgdGhlIHN1Ym1lbnUuCi0JCW1lbnUuYXBwZW5kVG9Hcm91cChJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBzdWJtZW51KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUmVzb3VyY2Ugb3BlbkVPYmplY3QoRU9iamVjdCBfc3JjT2JqZWN0KSB7Ci0JCUVPYmplY3Qgcm8gPSAoRU9iamVjdCkgX3NyY09iamVjdDsKLQkJSVJlc291cmNlIHJlc291cmNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIKLQkJLmdldEZpbGUoKEVPYmplY3QpIF9zcmNPYmplY3QpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc291cmNlOwotCQl9IGVsc2UgewotCQkJTW9kdWxlRmlsZSBtb2R1bGVGaWxlID0gQXJjaGl2ZVV0aWwuZ2V0TW9kdWxlRmlsZShybyk7Ci0JCQlpZiAobW9kdWxlRmlsZSAhPSBudWxsKSB7Ci0JCQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG1vZHVsZUZpbGUuZ2V0T3B0aW9ucygpOwotCQkJCWlmIChvcHRpb25zIGluc3RhbmNlb2YgQ29tcG9uZW50QXJjaGl2ZU9wdGlvbnMpIHsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKChDb21wb25lbnRBcmNoaXZlT3B0aW9ucykgb3B0aW9ucykKLQkJCQkJLmdldENvbXBvbmVudCgpOwotLy8JCQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihjb21wb25lbnQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJSUFyY2hpdmUgYXJjaGl2ZSA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuZmluZEFyY2hpdmUocm8pOwotCQkJCWlmKGFyY2hpdmUgIT0gbnVsbCl7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuZmluZENvbXBvbmVudChhcmNoaXZlKTsKLQkJCQkJaWYoY29tcG9uZW50ICE9IG51bGwpewotLy8JCQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoY29tcG9uZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0puZGlSZWZOb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0puZGlSZWZOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOWE1M2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9KbmRpUmVmTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgSk5ESSByZWZlcmVuY2VzLgotICogTGlrZTogRWpiIHJlZmVyZW5jZSwgRWpiIExvY2FsIFJlZmVyZW5jZSwgUmVzb3VyY2UgUmVmZXJlbmNlLCBSZXNvdXJjZSBFbnZpcm9ubWVudCBSZWZlcmVuY2UsCi0gKiBFbnZpcm9ubWVudCBFbnRyeSwgU2VydmljZSBSZWZlcmVuY2UgCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgSm5kaVJlZk5vZGUgZXh0ZW5kcyBBYnN0cmFjdERETm9kZSB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBpbnQga2luZDsKLQotICBwdWJsaWMgY2xhc3MgS0lORFMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVKQkxPQ0FMUkVGID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFSkJSRUYgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVkVOVFJZID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNFTlZFTlRZID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNSRUYgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VSRUYgPSA1OwotICB9Ci0KLSAgcHVibGljIEpuZGlSZWZOb2RlKE9iamVjdCBhZGFwdGVyTm9kZSwgaW50IGtpbmQpIHsKLSAgICBzdXBlcihhZGFwdGVyTm9kZSk7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLQotICB9Ci0KLSAgcHVibGljIGludCBnZXRLaW5kKCkgewotICAgIHJldHVybiBraW5kOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotICAgIHJldHVybiAoTGlzdCkgYWRhcHRlck5vZGU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgIHN3aXRjaCAoa2luZCkgewotICAgIGNhc2UgS0lORFMuRUpCTE9DQUxSRUY6Ci0gICAgICByZXR1cm4gTWVzc2FnZXMuRUpCTE9DQUxfUkVGRVJFTkNFUzsKLQotICAgIGNhc2UgS0lORFMuRUpCUkVGOgotICAgICAgcmV0dXJuIE1lc3NhZ2VzLkVKQl9SRUZFUkVOQ0VTOwotICAgIGNhc2UgS0lORFMuRU5WRU5UUlk6Ci0gICAgICByZXR1cm4gTWVzc2FnZXMuRU5WSVJPTUVOVF9FTlRSSUVTOwotICAgIGNhc2UgS0lORFMuUkVTRU5WRU5UWToKLSAgICAgIHJldHVybiBNZXNzYWdlcy5SRVNPVVJDRV9FTlZJUk9NRU5UX0VOVFJJRVM7Ci0gICAgY2FzZSBLSU5EUy5SRVNSRUY6Ci0gICAgICByZXR1cm4gTWVzc2FnZXMuUkVTT1VSQ0VfUkVGRVJFTkNFUzsKLSAgICBjYXNlIEtJTkRTLlNFUlZJQ0VSRUY6Ci0gICAgICByZXR1cm4gTWVzc2FnZXMuU0VSVklDRV9SRUZFUkVOQ0VTOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuZ2V0VGV4dCgpOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkgewotICAgIHN3aXRjaCAoa2luZCkgewotICAgIGNhc2UgS0lORFMuRUpCTE9DQUxSRUY6ewotICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImVqYlJlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICB9Ci0gICAgY2FzZSBLSU5EUy5FSkJSRUY6ewotICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImVqYlJlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLSAgICAKLSAgICBjYXNlIEtJTkRTLkVOVkVOVFJZOgotICAgICAgewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgicmVzb3VyY2VSZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLSAgICBjYXNlIEtJTkRTLlJFU0VOVkVOVFk6Ci0gICAgICB7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJyZXNvdXJjZVJlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfQotICAgIGNhc2UgS0lORFMuUkVTUkVGOgotICAgICAgewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgicmVzb3VyY2VSZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLSAgICBjYXNlIEtJTkRTLlNFUlZJQ0VSRUY6Ci0gICAgICB7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJyZXNvdXJjZVJlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoKTsKLSAgfQotCi0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL09wZW5KRUVSZXNvdXJjZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9PcGVuSkVFUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3YTVmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL09wZW5KRUVSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5BYnN0cmFjdE9wZW5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5Db21wb25lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkphdmFFRUFyY2hpdmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZS5Db21wb25lbnRBcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuYXBwY2xpZW50Lkdyb3VwQXBwQ2xpZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5JbnRlcmZhY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFSkJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBPcGVuIEFjdGlvbiBmb3IgRGVwbG95bWVudCBkZXNjcmlwdG9yIHRyZWUgbm9kZXMuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIE9wZW5KRUVSZXNvdXJjZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlbkFjdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJjb20uc2FwLmlkZS5qMmVlLnVpLmFjdGlvbnMuT3BlbkpFRVJlc291cmNlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi51aS5qYXZhLkVudGVycHJpc2VCZWFuSmF2YUVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0pBVkFfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmpkdC51aS5Db21waWxhdGlvblVuaXRFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGphdmFFZGl0b3JEZXNjcmlwdG9yOwotCXByb3RlY3RlZCBzdGF0aWMgSUVkaXRvckRlc2NyaXB0b3IgYmFzZUphdmFFZGl0b3JEZXNjcmlwdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLQkgKi8KLQlwdWJsaWMgT3BlbkpFRVJlc291cmNlQWN0aW9uKCkgewotCQlzdXBlcigiT3BlbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aW9uIElELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGdldEphdmFFZGl0b3JEZXNjcmlwdG9yKCkgewotCQlpZiAoamF2YUVkaXRvckRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCWphdmFFZGl0b3JEZXNjcmlwdG9yID0gZmluZEVkaXRvckRlc2NyaXB0b3IoSkFWQV9FRElUT1JfSUQpOwotCQlyZXR1cm4gamF2YUVkaXRvckRlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBnZXRCYXNlSmF2YUVkaXRvckRlc2NyaXB0b3IoKSB7Ci0JCWlmIChiYXNlSmF2YUVkaXRvckRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCWJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvciA9IGZpbmRFZGl0b3JEZXNjcmlwdG9yKEJBU0VfSkFWQV9FRElUT1JfSUQpOwotCQlyZXR1cm4gYmFzZUphdmFFZGl0b3JEZXNjcmlwdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9wZW5BcHByb3ByaWF0ZUVkaXRvcihTdHJpbmcgYykgewotCQlpZihnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKXsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpICgoVHJlZVBhdGgpKChUcmVlU2VsZWN0aW9uKWdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSkuZ2V0UGF0aHMoKVswXSkuZ2V0U2VnbWVudCgwKTsKLQkJCUlUeXBlIGZpbmRUeXBlOwotCQkJdHJ5IHsKLQkJCQlmaW5kVHlwZSA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KS5maW5kVHlwZShjKTsKLQkJCQlpZihmaW5kVHlwZSA9PSBudWxsKXsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoZmluZFR5cGUuZ2V0UmVzb3VyY2UoKSk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpFRVVJUGx1Z2luLmxvZ0Vycm9yKCJFcnJvciBkdXJpbmcgb3BlbiBlZGl0b3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQXBwcm9wcmlhdGVFZGl0b3IoSVZpcnR1YWxDb21wb25lbnQgYykgewotCQlpZiAoYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG51bGw7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWVkaXRvciA9IHBhZ2Uub3BlbkVkaXRvcihuZXcgQ29tcG9uZW50RWRpdG9ySW5wdXQoYyksCi0JCQkJCWN1cnJlbnREZXNjcmlwdG9yLmdldElkKCkpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpCi0JCQkJKChJU2V0U2VsZWN0aW9uVGFyZ2V0KSBlZGl0b3IpCi0JCQkJLnNlbGVjdFJldmVhbChnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZURpYWxvZwotCQkJLm9wZW5FcnJvcigKLQkJCQkJcGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQlKMkVFVUlNZXNzYWdlcwotCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2JsZW1zX09wZW5pbmdfRWRpdG9yX0VSUk9SXyIpLCBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvYmxlbXMgT3BlbmluZyBFZGl0b3IiCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQXBwcm9wcmlhdGVFZGl0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotCQl0cnkgewotCQkJcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlKYXZhVUkub3BlbkluRWRpdG9yKGVsZW1lbnQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZURpYWxvZwotCQkJLm9wZW5FcnJvcigKLQkJCQkJcGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQlKMkVFVUlNZXNzYWdlcwotCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2JsZW1zX09wZW5pbmdfRWRpdG9yX0VSUk9SXyIpLCBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvYmxlbXMgT3BlbmluZyBFZGl0b3IiCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcHByb3ByaWF0ZSBlZGl0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQXBwcm9wcmlhdGVFZGl0b3IoSVJlc291cmNlIHIpIHsKLQkJaWYgKHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG51bGw7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCVN0cmluZyBJRCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKHIuZ2V0TG9jYXRpb24oKQotCQkJCQkudG9Qb3J0YWJsZVN0cmluZygpKS5nZXRJZCgpOwotCQkJZWRpdG9yID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSByKSwgSUQpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpCi0JCQkJKChJU2V0U2VsZWN0aW9uVGFyZ2V0KSBlZGl0b3IpCi0JCQkJLnNlbGVjdFJldmVhbChnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZURpYWxvZwotCQkJLm9wZW5FcnJvcigKLQkJCQkJcGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQlKMkVFVUlNZXNzYWdlcwotCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2JsZW1zX09wZW5pbmdfRWRpdG9yX0VSUk9SXyIpLCBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvYmxlbXMgT3BlbmluZyBFZGl0b3IiCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKCFpc0VuYWJsZWQoKSkKLQkJCXJldHVybjsKLQotCQlpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSB7Ci0JCQkoKEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgc3JjT2JqZWN0KS5vcGVuSW5FZGl0b3IoKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy9bQnVnIDI0MDUxMl0gZGVhbCB3aXRoIGlmIGFueSBvZiB0aGVzZSBub2RlIHR5cGVzIG5kbyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGNsYXNzCi0JCWlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbiB8fAotCQkJCXNyY09iamVjdCBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuIHx8Ci0JCQkJc3JjT2JqZWN0IGluc3RhbmNlb2YgRW50aXR5QmVhbiB8fAotCQkJCXNyY09iamVjdCBpbnN0YW5jZW9mIFNlcnZsZXQgfHwKLQkJCQlzcmNPYmplY3QgaW5zdGFuY2VvZiBGaWx0ZXIgfHwKLQkJCQlzcmNPYmplY3QgaW5zdGFuY2VvZiBMaXN0ZW5lcil7Ci0JCQkKLQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKCBzcmNPYmplY3QgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbiApewotCQkJCVNlc3Npb25CZWFuIGJlYW4gPSAoU2Vzc2lvbkJlYW4pc3JjT2JqZWN0OwotCQkJCW5hbWUgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCQl9IGVsc2UgaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbkJlYW4pewotCQkJCU1lc3NhZ2VEcml2ZW5CZWFuICBiZWFuID0gKE1lc3NhZ2VEcml2ZW5CZWFuKXNyY09iamVjdDsKLQkJCQluYW1lID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQkJfSBlbHNlIGlmKHNyY09iamVjdCBpbnN0YW5jZW9mIEVudGl0eUJlYW4pewotCQkJCUVudGl0eUJlYW4gYmVhbiA9IChFbnRpdHlCZWFuKXNyY09iamVjdDsKLQkJCQluYW1lID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQkJfSBlbHNlIGlmKHNyY09iamVjdCBpbnN0YW5jZW9mIFNlcnZsZXQpewotCQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KXNyY09iamVjdDsKLQkJCQluYW1lID0gc2VydmxldC5nZXRTZXJ2bGV0Q2xhc3MoKTsKLQkJCX0gZWxzZSBpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBGaWx0ZXIpIHsKLQkgICAgICAgIAlGaWx0ZXIgZmlsdGVyID0gKEZpbHRlcilzcmNPYmplY3Q7CQkKLQkgICAgICAgIAluYW1lID0gZmlsdGVyLmdldEZpbHRlckNsYXNzKCk7Ci0JCQl9IGVsc2UgaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgTGlzdGVuZXIpewotCSAgICAgICAgCUxpc3RlbmVyIGxpc3RlbmVyID0gKExpc3RlbmVyKXNyY09iamVjdDsKLQkgICAgICAgIAluYW1lID0gbGlzdGVuZXIuZ2V0TGlzdGVuZXJDbGFzcygpOwotCQkJfQotCQkJCi0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChFT2JqZWN0KXNyY09iamVjdCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwkJCQotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJaWYoamF2YVByb2plY3QuZXhpc3RzKCkpewotCQkJCUlUeXBlIHR5cGUgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vaWYgbmFtZSBpcyBudWxsIHRoZW4gY2FuJ3QgZ2V0IHR5cGUKLQkJCQkJaWYobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQl0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoIG5hbWUgKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy9pZiB0eXBlIGlzIG51bGwgdGhlbiBjYW4ndCBvcGVuIGl0cyBlZGl0b3IsIHNvIG9wZW4gZWRpdG9yIGZvciB0aGUgcmVzb3VyY2UKLQkJCQkJaWYodHlwZSAhPSBudWxsKSB7Ci0JCQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJCUVkaXRvclV0aWxpdHkub3BlbkluRWRpdG9yKGN1KTsKLQkJCQkJfSBlbHNlewotCQkJCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpFRVVJUGx1Z2luLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpFRVVJUGx1Z2luLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCQotCQlpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJb3BlbkVPYmplY3QoKEVPYmplY3QpIHNyY09iamVjdCk7Ci0JCX0gZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgQmVhbkludGVyZmFjZU5vZGUpIHsKLQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcigoKEJlYW5JbnRlcmZhY2VOb2RlKSBzcmNPYmplY3QpLmdldF9mcW4oKSk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgQmVhbk5vZGUpIHsKLQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcigoKEJlYW5Ob2RlKSBzcmNPYmplY3QpLmdldEVqYkNsYXNzUXVhbGlmaWVkTmFtZSgpKTsKLQkJCXJldHVybjsKLQotCQl9IGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIFdlYkFwcFByb3ZpZGVyKSB7Ci0JCQlJRmlsZSBmaWxlID0gKChXZWJBcHBQcm92aWRlcikgc3JjT2JqZWN0KS5nZXREREZpbGUoKTsKLQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKXsJCQkJCi0JCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKGZpbGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBHcm91cEVKQlByb3ZpZGVyKSB7Ci0JCQlvcGVuRU9iamVjdCgoRU9iamVjdCkgKChHcm91cEVKQlByb3ZpZGVyKXNyY09iamVjdCkuZ2V0RWpiSmFyKCkpOwotCQl9IGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEdyb3VwRUFSUHJvdmlkZXIpIHsKLQkJCUlGaWxlIGZpbGUgPSAoKEdyb3VwRUFSUHJvdmlkZXIpIHNyY09iamVjdCkuZ2V0RERGaWxlKCk7Ci0JCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSl7Ci0JCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKGZpbGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkgZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgR3JvdXBBcHBDbGllbnRQcm92aWRlcikgewotCQkJCUlGaWxlIGZpbGUgPSAoKEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIHNyY09iamVjdCkuZ2V0RERGaWxlKCk7Ci0JCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpewotCQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoZmlsZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9ZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgUmVzb3VyY2UpCi0JCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIKLQkJCQkJLmdldEZpbGUoKFJlc291cmNlKSBzcmNPYmplY3QpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVPYmplY3QoRU9iamVjdCBfc3JjT2JqZWN0KSB7Ci0JCUVPYmplY3Qgcm8gPSAoRU9iamVjdCkgX3NyY09iamVjdDsKLQkJSVJlc291cmNlIHJlc291cmNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIKLQkJLmdldEZpbGUoKEVPYmplY3QpIF9zcmNPYmplY3QpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKHJlc291cmNlKTsKLQkJfSBlbHNlIHsKLQkJCU1vZHVsZUZpbGUgbW9kdWxlRmlsZSA9IEFyY2hpdmVVdGlsLmdldE1vZHVsZUZpbGUocm8pOwotCQkJaWYgKG1vZHVsZUZpbGUgIT0gbnVsbCkgewotCQkJCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBtb2R1bGVGaWxlLmdldE9wdGlvbnMoKTsKLQkJCQlpZiAob3B0aW9ucyBpbnN0YW5jZW9mIENvbXBvbmVudEFyY2hpdmVPcHRpb25zKSB7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9ICgoQ29tcG9uZW50QXJjaGl2ZU9wdGlvbnMpIG9wdGlvbnMpCi0JCQkJCS5nZXRDb21wb25lbnQoKTsKLQkJCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKGNvbXBvbmVudCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlJQXJjaGl2ZSBhcmNoaXZlID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5maW5kQXJjaGl2ZShybyk7Ci0JCQkJaWYoYXJjaGl2ZSAhPSBudWxsKXsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5maW5kQ29tcG9uZW50KGFyY2hpdmUpOwotCQkJCQlpZihjb21wb25lbnQgIT0gbnVsbCl7Ci0JCQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoY29tcG9uZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3RydWN0dXJlZCBzZWxlY3Rpb24gaGFzIGNoYW5nZWQgaW4gdGhlIHdvcmtiZW5jaC4gU3ViY2xhc3NlcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZWFjdCB0byB0aGUgY2hhbmdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdGlvbgotCSAqIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGlzIHNlbGVjdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZSBzdXBlciBtZXRob2QgbXVzdCBhbHdheXMgYmUgaW52b2tlZC4KLQkgKiBJZiB0aGUgc3VwZXIgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoaXMgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4gZmFsc2UuCi0JICogCi0JICogQHBhcmFtIHNlbAotCSAqICAgICAgICAgICAgdGhlIG5ldyBzdHJ1Y3R1cmVkIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7Ci0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGlzIGlzIG9uZSBvZiB0aGUgc2VsZWN0aW9ucyB3ZSBjYW4gaGFuZGxlLAotCQkvLyB0aGVuIHNldCB0aGUgc291cmNlIG9iamVjdCBhcyBpcy4gVGhlIHJ1bigpIHdpbGwgZG8gdGhlIGhhcmQgc3R1ZmYuCi0JCU9iamVjdCBvYmogPSBzLmdldEZpcnN0RWxlbWVudCgpOwotCQlzZXRUZXh0KCJPcGVuIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJY3VycmVudERlc2NyaXB0b3IgPSBnZXRKYXZhRWRpdG9yRGVzY3JpcHRvcigpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCZWFuTGluaykKLQkJCWN1cnJlbnREZXNjcmlwdG9yID0gZ2V0QmFzZUphdmFFZGl0b3JEZXNjcmlwdG9yKCk7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEVPYmplY3QpIG9iaik7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gSURFLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSwKLQkJCQkJCWNvbnRlbnRUeXBlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYoKChFT2JqZWN0KSBvYmopLmVSZXNvdXJjZSgpICE9IG51bGwpewotCQkJCQlTdHJpbmcgbmFtZSA9IChuZXcgUGF0aCgoKEVPYmplY3QpIG9iaikuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJCQkudG9TdHJpbmcoKSkpLmxhc3RTZWdtZW50KCk7Ci0JCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihuYW1lLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKFJlc291cmNlKSBvYmopOwotCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gSURFLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQkJY3VycmVudERlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpLAotCQkJCQljb250ZW50VHlwZSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgR3JvdXBFQVJQcm92aWRlcikgewotCQkJSUZpbGUgZmlsZSA9ICgoR3JvdXBFQVJQcm92aWRlcikgb2JqKS5nZXREREZpbGUoKTsKLQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKXsKLQkJCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gSURFLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSwKLQkJCQkJCWNvbnRlbnRUeXBlKTsKLQkJCX1lbHNlewotCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gbnVsbDsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgR3JvdXBBcHBDbGllbnRQcm92aWRlcikgewotCQkJSUZpbGUgZmlsZSA9ICgoR3JvdXBBcHBDbGllbnRQcm92aWRlcikgb2JqKS5nZXREREZpbGUoKTsKLQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKXsKLQkJCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gSURFLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSwKLQkJCQkJCWNvbnRlbnRUeXBlKTsKLQkJCX1lbHNlewotCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gbnVsbDsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV2ViQXBwUHJvdmlkZXIpIHsKLQkJCUlGaWxlIGZpbGUgPSAoKFdlYkFwcFByb3ZpZGVyKSBvYmopLmdldERERmlsZSgpOwotCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpewotCQkJCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCQkJY3VycmVudERlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpLAotCQkJCQkJY29udGVudFR5cGUpOwotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJlYW5Ob2RlKSB7Ci0KLQkJCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQkJSmF2YUVFT2JqZWN0IGVudGVycHJpc2VCZWFuID0gKChCZWFuTm9kZSkgb2JqKS5nZXRFbnRlcnByaXNlQmVhbigpOwotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEVPYmplY3QpZW50ZXJwcmlzZUJlYW4pOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXROYW1lKCksCi0JCQkJCQljb250ZW50VHlwZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmKCgoRU9iamVjdCkgZW50ZXJwcmlzZUJlYW4pLmVSZXNvdXJjZSgpICE9IG51bGwpewotCQkJCQlTdHJpbmcgbmFtZSA9IChuZXcgUGF0aCgoKEVPYmplY3QpIGVudGVycHJpc2VCZWFuKS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCS50b1N0cmluZygpKSkubGFzdFNlZ21lbnQoKTsKLQkJCQkJY3VycmVudERlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKG5hbWUsIG51bGwpOwotCQkJCX0KLQkJCX0gICAgICAKLQkJfSBlbHNlICBpZiAob2JqIGluc3RhbmNlb2YgQmVhbkludGVyZmFjZU5vZGUpIHsKLQotCQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQlKYXZhRUVPYmplY3QgYmVhbkludGVyZmFjZSA9IChKYXZhRUVPYmplY3QpICgoQmVhbkludGVyZmFjZU5vZGUpIG9iaikuZ2V0QWRhcHRlck5vZGUoKTsKLQkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChFT2JqZWN0KWJlYW5JbnRlcmZhY2UpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXROYW1lKCksCi0JCQkJCQljb250ZW50VHlwZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmKCgoRU9iamVjdCkgYmVhbkludGVyZmFjZSkuZVJlc291cmNlKCkgIT0gbnVsbCl7Ci0JCQkJCVN0cmluZyBuYW1lID0gKG5ldyBQYXRoKCgoRU9iamVjdCkgYmVhbkludGVyZmFjZSkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9TdHJpbmcoKSkpLmxhc3RTZWdtZW50KCk7Ci0JCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihuYW1lLCBudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgZnFuID0gKChCZWFuSW50ZXJmYWNlTm9kZSkgb2JqKS5nZXRfZnFuKCk7Ci0JCQkJCWlmIChmcW4gIT0gbnVsbCl7Ci0JCQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoKChCZWFuSW50ZXJmYWNlTm9kZSkgb2JqKS5nZXRUZXh0KCksIG51bGwpOwotLy8JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0QXR0cmlidXRlc0Zyb21EZXNjcmlwdG9yKCk7Ci0JCXNyY09iamVjdCA9IG9iajsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9XZWIyNUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9XZWIyNUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDZlMjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViMjVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlcjsKLQotLyoqCi0gKiBXZWIgMi41IENvbnRlbnQgcHJvdmlkZXIgaXMgRGVwbG95bWVudCBEZXNjcmlwdG9yIGNvbnRlbnQgcHJvdmlkZXIsIAotICogdXNlZCBmb3IgY29uc3RydWN0aW5nIG9mIHRoZSBkZXNjcmlwdG9yIHRyZWUgaW4gcHJvamVjdCBleHBsb3Jlci4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBXZWIyNUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEpFRTVDb250ZW50UHJvdmlkZXIgewotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBhUGFyZW50RWxlbWVudCkgewotCi0JCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBhUGFyZW50RWxlbWVudCkuZ2V0QWRhcHRlcihJUFJPSkVDVF9DTEFTUyk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJQWJzdHJhY3RHcm91cFByb3ZpZGVyIGNhY2hlZENvbnRlbnRQcm92aWRlciA9IGdldENhY2hlZENvbnRlbnRQcm92aWRlcihwcm9qZWN0KTsKLQkJCQlpZiAoY2FjaGVkQ29udGVudFByb3ZpZGVyLmlzVmFsaWQoKSl7Ci0JCQkJCWNoaWxkcmVuLmFkZChjYWNoZWRDb250ZW50UHJvdmlkZXIpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFdlYkFwcFByb3ZpZGVyKXsKLQkJCWNoaWxkcmVuLmFkZEFsbCgoKFdlYkFwcFByb3ZpZGVyKSBhUGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKSk7Ci0JCX0gZWxzZSBpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEdyb3VwUHJvdmlkZXIpewotCQkJY2hpbGRyZW4uYWRkQWxsKCgoQWJzdHJhY3RHcm91cFByb3ZpZGVyKSBhUGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViQXBwUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKFdlYkFwcFByb3ZpZGVyKWVsZW1lbnQpLmlzVmFsaWQoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RHcm91cFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIGVsZW1lbnQpLmhhc0NoaWxkcmVuKCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0R3JvdXBQcm92aWRlciBnZXROZXdDb250ZW50UHJvdmlkZXJJbnN0YW5jZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgV2ViQXBwUHJvdmlkZXIoKFdlYkFwcCkgZ2V0Q2FjaGVkTW9kZWxQcm92aWRlcihwcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpLCBwcm9qZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYjI1TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9XZWIyNUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNWUwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYjI1TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cENvbnRleHRQYXJhbXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwRXJyb3JQYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cEZpbHRlcnNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwTGlzdGVuZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwU2VydmxldEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBTZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFydGlmYWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBXZWIgMi41IExhYmVsIHByb3ZpZGVyIGlzIERlcGxveW1lbnQgRGVzY3JpcHRvciBsYWJlbCBwcm92aWRlciwgCi0gKiB1c2VkIGZvciBkZWNvcmF0aW5nIG9mIHRoZSBkZXNjcmlwdG9yIHRyZWUgaW4gcHJvamVjdCBleHBsb3Jlci4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBXZWIyNUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFTGFiZWxQcm92aWRlciB7Ci0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgcmV0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXZWJBcHBQcm92aWRlcikgewotCQkJcmV0ID0gKChXZWJBcHBQcm92aWRlcikgZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RHcm91cFByb3ZpZGVyKXsKLQkJCXJldCA9ICgoQWJzdHJhY3RHcm91cFByb3ZpZGVyKSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2bGV0KXsKLQkJCXJldCA9IEdyb3VwU2VydmxldEl0ZW1Qcm92aWRlci5nZXRTZXJ2bGV0SW1hZ2UoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmxldE1hcHBpbmcpewotCQkJcmV0ID0gR3JvdXBTZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlci5nZXRTZXJ2bGV0TWFwcGluZ0ltYWdlKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbHRlcil7Ci0JCQlyZXQgPSBHcm91cEZpbHRlcnNJdGVtUHJvdmlkZXIuZ2V0RmlsdGVyc0ltYWdlKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpc3RlbmVyKXsKLQkJCXJldCA9IEdyb3VwTGlzdGVuZXJJdGVtUHJvdmlkZXIuZ2V0TGlzdGVuZXJzSW1hZ2UoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsdGVyTWFwcGluZyl7Ci0JCQlyZXQgPSBHcm91cEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIuZ2V0RmlsdGVyTWFwcGluZ0ltYWdlKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdlYkFydGlmYWN0Tm9kZSl7Ci0JCSAgcmV0ID0gKChXZWJBcnRpZmFjdE5vZGUpZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRXJyb3JQYWdlKXsKLQkJICByZXQgPSBHcm91cEVycm9yUGFnZXNJdGVtUHJvdmlkZXIuZ2V0RXJyb3JQYWdlc0ltYWdlKChFcnJvclBhZ2UpZWxlbWVudCk7IAotICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQYXJhbVZhbHVlKXsKLSAgICAgICAgICByZXQgPSBHcm91cENvbnRleHRQYXJhbXNJdGVtUHJvdmlkZXIuZ2V0Q29udGV4dFBhcmFtc0ltYWdlKCk7IAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldCA9IHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotICAgICAgICB9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCVN0cmluZyByZXQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdlYkFwcFByb3ZpZGVyKSB7Ci0JCQlyZXQgPSAoKFdlYkFwcFByb3ZpZGVyKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0R3JvdXBQcm92aWRlcil7Ci0JCQlyZXQgPSAoKEFic3RyYWN0R3JvdXBQcm92aWRlcikgZWxlbWVudCkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2bGV0KXsKLQkJCXJldCA9ICgoU2VydmxldCkgZWxlbWVudCkuZ2V0U2VydmxldE5hbWUoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmxldE1hcHBpbmcpIHsKLQkJCXJldCA9IGdldFNlcnZsZXRNYXBwaW5nRGlzcGxheSgoU2VydmxldE1hcHBpbmcpIGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWx0ZXIpewotCQkJcmV0ID0gKChGaWx0ZXIpIGVsZW1lbnQpLmdldEZpbHRlck5hbWUoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdGVuZXIpewotCQkJcmV0ID0gKChMaXN0ZW5lcikgZWxlbWVudCkuZ2V0TGlzdGVuZXJDbGFzcygpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWx0ZXJNYXBwaW5nKSB7Ci0JCQlyZXQgPSBnZXRGaWx0ZXJNYXBwaW5nRGlzcGxheSgoRmlsdGVyTWFwcGluZykgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdlYkFydGlmYWN0Tm9kZSkgewotICAgICAgICAgICAgcmV0ID0gKChXZWJBcnRpZmFjdE5vZGUpIGVsZW1lbnQpLmdldFRleHQoKTsgCi0gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVycm9yUGFnZSApewotICAgICAgICAJRXJyb3JQYWdlIHBhZ2UgPSAoKEVycm9yUGFnZSkgZWxlbWVudCk7Ci0JCQlpZiAocGFnZS5nZXRFcnJvckNvZGUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0ID0gcGFnZS5nZXRFeGNlcHRpb25UeXBlKCkgKyAiIC0+ICIgKyBwYWdlLmdldExvY2F0aW9uKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0ID0gcGFnZS5nZXRFcnJvckNvZGUoKSArICIgLT4gIiArIHBhZ2UuZ2V0TG9jYXRpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQYXJhbVZhbHVlKXsKLSAgICAgICAgCXJldCA9ICgoUGFyYW1WYWx1ZSllbGVtZW50KS5nZXRQYXJhbU5hbWUoKSArICIgPSAiICsgKChQYXJhbVZhbHVlKWVsZW1lbnQpLmdldFBhcmFtVmFsdWUoKTsvLyROT04tTkxTLTEkIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAJcmV0ID0gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLSAgICAgICAgfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEZpbHRlck1hcHBpbmdEaXNwbGF5KEZpbHRlck1hcHBpbmcgZWxlbWVudCkgewotCQlVcmxQYXR0ZXJuVHlwZSB1cmxQYXR0ZXJucyA9IG51bGw7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50LmdldFVybFBhdHRlcm5zKCkuc2l6ZSgpID4gMCl7Ci0JCQl1cmxQYXR0ZXJucyA9IChVcmxQYXR0ZXJuVHlwZSkgZWxlbWVudC5nZXRVcmxQYXR0ZXJucygpLmdldCgwKTsKLQkJCXZhbHVlID0gdXJsUGF0dGVybnMuZ2V0VmFsdWUoKTsKLQkJfWVsc2V7Ci0JCQlGZWF0dXJlTWFwIGdyb3VwID0gZWxlbWVudC5nZXRHcm91cCgpOwotCQkJaWYgKGdyb3VwLnNpemUoKSA+MCkgewotCQkJCUVudHJ5IGVudHJ5ID0gZ3JvdXAuZ2V0KDApOwotCQkJCXZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZSArICItPiAiICsgZWxlbWVudC5nZXRGaWx0ZXJOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTZXJ2bGV0TWFwcGluZ0Rpc3BsYXkoU2VydmxldE1hcHBpbmcgZWxlbWVudCkgewotCQlVcmxQYXR0ZXJuVHlwZSB1cmxQYXR0ZXJucyA9IChVcmxQYXR0ZXJuVHlwZSkgZWxlbWVudC5nZXRVcmxQYXR0ZXJucygpLmdldCgwKTsKLQkJcmV0dXJuIHVybFBhdHRlcm5zLmdldFZhbHVlKCkgKyAiLT4gIiArIGVsZW1lbnQuZ2V0U2VydmxldE5hbWUoKTsgLy8kTk9OLU5MUy0xJDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvYXBwY2xpZW50L0dyb3VwQXBwQ2xpZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvYXBwY2xpZW50L0dyb3VwQXBwQ2xpZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmMzJlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2FwcGNsaWVudC9Hcm91cEFwcENsaWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuYXBwY2xpZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci0KLS8qKgotICogQXBwbGljYXRpb24gQ2xpZW50IDUuMCBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZS4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBBcHBDbGllbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlciB7Ci0KLQkKLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0KLQotCXB1YmxpYyBHcm91cEFwcENsaWVudFByb3ZpZGVyKEFwcGxpY2F0aW9uQ2xpZW50IGphdmFlZSwgSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihqYXZhZWUpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX1JFTEFUSVZFX1BBVEggPSAiTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBBUFBfQ0xJRU5UNTA7Ci0KLQlwcml2YXRlIElGaWxlIGRkRmlsZTsKLQotCi0JcHJpdmF0ZSBBcHBsaWNhdGlvbkNsaWVudCBnZXRNb2RlbCgpIHsKLQkJaWYgKHRoaXMuamF2YWVlICE9IG51bGwpCi0JCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50KSB0aGlzLmphdmFlZTsKLQkJSU1vZGVsUHJvdmlkZXIgbW9kZWxQcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyCi0JCS5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotCQlPYmplY3QgbW9kZWxPYmplY3QgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWxPYmplY3QgPSBtb2RlbFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlKRUVVSVBsdWdpbi5sb2dFcnJvcigiRXJyb3IgZHVyaW5nIGluaXRpYWxpemluZyBtb2RlbCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAobW9kZWxPYmplY3QgIT0gbnVsbCAmJiBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uQ2xpZW50KSB7Ci0JCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50KSBtb2RlbE9iamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAodGhpcy5wcm9qZWN0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IE1lc3NhZ2VzLkRFUExPWU1FTlRfREVTQ1JJUFRPUjsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IE1lc3NhZ2VzLkRFUExPWU1FTlRfREVTQ1JJUFRPUiArIHRoaXMucHJvamVjdC5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChqYXZhZWUgIT0gbnVsbCl7Ci0JCQlyZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIGphdmFlZSkuZ2V0RWpiUmVmcygpKTsKLQkJCS8vcmVzdWx0LmFkZEFsbCgoKEFwcGxpY2F0aW9uQ2xpZW50KSBqYXZhZWUpLmdldEVqYkxvY2FsUmVmcygpKTsKLQkJCXJlc3VsdC5hZGRBbGwoKChBcHBsaWNhdGlvbkNsaWVudCkgamF2YWVlKS5nZXRSZXNvdXJjZVJlZnMoKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIGphdmFlZSkuZ2V0UmVzb3VyY2VFbnZSZWZzKCkpOwotCQkJcmVzdWx0LmFkZEFsbCgoKEFwcGxpY2F0aW9uQ2xpZW50KSBqYXZhZWUpLmdldEVudkVudHJpZXMoKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIGphdmFlZSkuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKTsKLQkJCS8vcmVzdWx0LmFkZEFsbCgoKEFwcGxpY2F0aW9uQ2xpZW50KSBqYXZhZWUpLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIGphdmFlZSkuZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKTsKLQkJCXJlc3VsdC5hZGRBbGwoKChBcHBsaWNhdGlvbkNsaWVudCkgamF2YWVlKS5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChBUFBfQ0xJRU5UNTAgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSkVFVUlQbHVnaW5JY29ucy5BUFBfQ0xJRU5UNTApOwotCQkJQVBQX0NMSUVOVDUwID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIEFQUF9DTElFTlQ1MDsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldERERmlsZSgpIHsKLQkJaWYgKGRkRmlsZSAhPSBudWxsKXsKLQkJCXJldHVybiBkZEZpbGU7Ci0JCX0KLQkJSVZpcnR1YWxGb2xkZXIgdmlydHVhbEZvbGRlciA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpLmdldFJvb3RGb2xkZXIoKTsKLQkJZGRGaWxlID0gdmlydHVhbEZvbGRlci5nZXRGaWxlKFBST0pFQ1RfUkVMQVRJVkVfUEFUSCkuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJcmV0dXJuIGRkRmlsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2RuZC9BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2RuZC9BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYmY2YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9kbmQvQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXJQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW4uSjJFRU5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkVBUkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5BYnN0cmFjdEVhck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkJ1bmRsZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkRyb3BBZGFwdGVyQXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGx1Z2luVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogSGFuZGxlcyBkcm9wIG9mIEpFRSByZXNvdXJjZXMgb24gRUFSIHByb2plY3QgdGh1cyBhZGRpbmcgdGhlbSBhcyBtb2R1bGVzLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50IGV4dGVuZHMgQ29tbW9uRHJvcEFkYXB0ZXJBc3Npc3RhbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVBST0pFQ1RfQ0xBU1MgPSBJUHJvamVjdC5jbGFzczsKLQlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBsaWJEaXIgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlQ29uZmxpY3RzID0gZmFsc2U7Ci0KLQlwdWJsaWMgQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZFR5cGUoVHJhbnNmZXJEYXRhIGFUcmFuc2ZlclR5cGUpIHsKLQkJcmV0dXJuIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5pc1N1cHBvcnRlZFR5cGUoYVRyYW5zZmVyVHlwZSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgaGFuZGxlRHJvcChDb21tb25Ecm9wQWRhcHRlciBhRHJvcEFkYXB0ZXIsIERyb3BUYXJnZXRFdmVudCBhRHJvcFRhcmdldEV2ZW50LCBmaW5hbCBPYmplY3QgYVRhcmdldCkgewotCQlpZiAoTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZShhRHJvcEFkYXB0ZXIuZ2V0Q3VycmVudFRyYW5zZmVyKCkpKSB7Ci0JCQlmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCQlyZXNvbHZlQ29uZmxpY3RzID0gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yIHNlbGVjdGlvbkl0ZXJhdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IHNlbGVjdGlvbkl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgc291cmNlT2JqZWN0ID0gc2VsZWN0aW9uSXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChzb3VyY2VPYmplY3QgaW5zdGFuY2VvZiBJVmlydHVhbFJlZmVyZW5jZSkgewotCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSAoSVZpcnR1YWxSZWZlcmVuY2UpIHNvdXJjZU9iamVjdDsKLQkJCQkJLyoKLQkJCQkJICogSWYgYSByZWZlcmVuY2UgaXMgbW92ZWQgZnJvbSB0aGUgcm9vdCB0byB0aGUgbGliCi0JCQkJCSAqIGRpcmVjdG9yeSBjaGVjayBmb3IgY29uZmxpY3RzIHdpdGggcHJvamVjdHMgcmVmZXJlbmNlZCBieQotCQkJCQkgKiB0aGUgZWFyIHJlZmVyZW5jaW5nIHRoZSBzYW1lIGxpYgotCQkJCQkgKi8KLQkJCQkJSVBhdGggbGliRGlyUGF0aCA9IG51bGw7Ci0JCQkJCWlmKGxpYkRpciAhPSBudWxsKQotCQkJCQkJbGliRGlyUGF0aCA9IG5ldyBQYXRoKGxpYkRpcikubWFrZVJlbGF0aXZlKCk7Ci0JCQkJCWlmIChsaWJEaXIubGVuZ3RoKCkgPiAwICYmIGxpYkRpclBhdGggIT0gbnVsbCAmJiAhbGliRGlyUGF0aC5lcXVhbHMocmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCkpKSB7Ci0JCQkJCQlpZiAoaGFzQ29uZmxpY3RpbmdQcm9qZWN0SW5NZXRhSW5mKHJlZmVyZW5jZSkpIHsKLQkJCQkJCQlEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nIGRsZyA9IG5ldyBEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nKGdldFNoZWxsKCksIERlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cuRExHX1RZUEVfMik7Ci0JCQkJCQkJaWYgKGRsZy5vcGVuKCkgPT0gRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZy5CVE5fSURfQ0FOQ0VMKSB7Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXNvbHZlQ29uZmxpY3RzID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobGliRGlyLmxlbmd0aCgpID4gMCl7Ci0JCQkJCQlJUHJvamVjdCBwcm9qZWN0VG9BZGQgPSBnZXRQcm9qZWN0KHNvdXJjZU9iamVjdCk7Ci0JCQkJCQlpZiAoaGFzQ29uZmxpY3RpbmdQcm9qZWN0SW5NZXRhSW5mKHByb2plY3RUb0FkZCkpIHsKLQkJCQkJCQlEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nIGRsZyA9IG5ldyBEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nKGdldFNoZWxsKCksIERlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cuRExHX1RZUEVfMik7Ci0JCQkJCQkJaWYgKGRsZy5vcGVuKCkgPT0gRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZy5CVE5fSURfQ0FOQ0VMKSB7Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXNvbHZlQ29uZmxpY3RzID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlKb2IgYWRkUHJvamVjdFRvRWFySm9iID0gbmV3IEpvYihnZXRKb2JUaXRsZShlYXJDb21wb25lbnQpKSB7Ci0JCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCQkJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQotCQkJCQlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wb25lbnRzVG9BZGQgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwotCQkJCQlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wb25lbnRzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwotCi0JCQkJCWZvciAoSXRlcmF0b3Igc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgc2VsZWN0aW9uSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHNvdXJjZU9iamVjdCA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCQkJaWYgKHNvdXJjZU9iamVjdCBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQkJCQlKYXJQYWNrYWdlRnJhZ21lbnRSb290IGphclBhY2thZ2VGcmFnbWVudCA9IChKYXJQYWNrYWdlRnJhZ21lbnRSb290KSBzb3VyY2VPYmplY3Q7Ci0KLQkJCQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SOwotCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSwgdHlwZSArIGphclBhY2thZ2VGcmFnbWVudC5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJY29tcG9uZW50c1RvQWRkLmFkZChhcmNoaXZlKTsKLQkJCQkJCX0gZWxzZSBpZiAoc291cmNlT2JqZWN0IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpIHsKLQkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSAoSVZpcnR1YWxSZWZlcmVuY2UpIHNvdXJjZU9iamVjdDsKLQkJCQkJCQlpZiAocmVzb2x2ZUNvbmZsaWN0cykgewotCQkJCQkJCQlzdGF0dXMgPSByZXNvbHZlQ29uZmxpY3RzKHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQkJCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZSA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQkJY29tcG9uZW50c1RvUmVtb3ZlLmFkZChhcmNoaXZlKTsKLQkJCQkJCQlzdGF0dXMgPSByZW1vdmVDb21wb25lbnRzRnJvbUVhcihjb21wb25lbnRzVG9SZW1vdmUsIHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkJCQljb21wb25lbnRzVG9BZGQuYWRkKGFyY2hpdmUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0VG9BZGQgPSBnZXRQcm9qZWN0KHNvdXJjZU9iamVjdCk7Ci0JCQkJCQkJaWYgKHJlc29sdmVDb25mbGljdHMpIHsKLQkJCQkJCQkJc3RhdHVzID0gcmVzb2x2ZUNvbmZsaWN0cyhDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0VG9BZGQpKTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWNvbXBvbmVudHNUb0FkZC5hZGQoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdFRvQWRkKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoIWNvbXBvbmVudHNUb0FkZC5pc0VtcHR5KCkpIHsKLQkJCQkJCXN0YXR1cyA9IGFkZENvbXBvbmVudHNUb0Vhcihjb21wb25lbnRzVG9BZGQsIGxpYkRpcik7Ci0JCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCi0JCQl9OwotCQkJc2VydmljZS5zaG93SW5EaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBhZGRQcm9qZWN0VG9FYXJKb2IpOwotCQkJYWRkUHJvamVjdFRvRWFySm9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCQlhZGRQcm9qZWN0VG9FYXJKb2Iuc2NoZWR1bGUoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZURyb3AoT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQlsaWJEaXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlclR5cGUpIHx8IFBsdWdpblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJZWFyUHJvamVjdCA9IGdldFByb2plY3QodGFyZ2V0KTsKLQkJCQlpZiAoZWFyUHJvamVjdCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQl9Ci0JCQkJZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCk7Ci0JCQkJaW50IGVhclZlcnNpb24gPSBnZXRFYXJWZXJzaW9uKGVhclByb2plY3QpOwotCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBCdW5kbGVkTm9kZSAmJiAoKEJ1bmRsZWROb2RlKSB0YXJnZXQpLmdldEJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSgpID09IG51bGwpIHsKLQkJCQkJbGliRGlyID0gKChBcHBsaWNhdGlvbikgTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlYXJQcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpKS5nZXRMaWJyYXJ5RGlyZWN0b3J5KCk7Ci0JCQkJCWlmIChsaWJEaXIgPT0gbnVsbCkgewotCQkJCQkJbGliRGlyID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5FQVJfREVGQVVMVF9MSUJfRElSKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQotCQkJCQkvL2NoZWNrIGlmIGxpYnJhcnkgaXMgcGh5c2ljYWxseSBwcmVzZW50IGluIHRoZSBFYXIgcGF0aAotCQkJCQlpZiAoSVZpcnR1YWxSZWZlcmVuY2UuY2xhc3MuaXNJbnN0YW5jZShuZXh0KSl7Ci0JCQkJCQlJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gKChJVmlydHVhbFJlZmVyZW5jZSluZXh0KS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQlpZiAocmVmZXJlbmNlZENvbXBvbmVudC5pc0JpbmFyeSgpICYmIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LmNsYXNzLmlzSW5zdGFuY2UocmVmZXJlbmNlZENvbXBvbmVudCkpewotCQkJCQkJCWlmIChpc1BoeXNpY2FsbHlBZGRlZCgoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHJlZmVyZW5jZWRDb21wb25lbnQpKXsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpIHsKLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0KLQkJCQkJLyoKLQkJCQkJICogQ2hlY2sgaWYgd2UgdHJ5IHRvIGFkZCBhIEphclBhY2thZ2VGcmFnbWVudCB0aGF0IGlzCi0JCQkJCSAqIGFscmVhZHkgcmVmZXJlbmNlZAotCQkJCQkgKi8KLQkJCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJCQlKYXJQYWNrYWdlRnJhZ21lbnRSb290IGphciA9IChKYXJQYWNrYWdlRnJhZ21lbnRSb290KSBuZXh0OwotCQkJCQkJZm9yIChJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgOiBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpKSB7Ci0JCQkJCQkJaWYgKHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpLmVxdWFscyhqYXIuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0KLQkJCQkJLyoKLQkJCQkJICogQ2hlY2sgaWYgd2UgdHJ5IHRvIGFkZCBhIG1vZHVsZSB0aGF0IGlzIGFscmVhZHkKLQkJCQkJICogcmVmZXJlbmNlZCBieSB0aGUgZWFyIGJ1dCBhdCB0aGUgc2FtZSB0aW1lIGFsbG93IHRvCi0JCQkJCSAqIGNoYW5nZSBpdHMgbG9jYXRpb24gZnJvbSB0aGUgcm9vdCB0byB0aGUgbGliIGRpcmVjdG9yeQotCQkJCQkgKiBhbmQgdGhlIG9wcG9zaXRlLgotCQkJCQkgKi8KLQkJCQkJSVByb2plY3QgcHJvamVjdFRvQWRkID0gZ2V0UHJvamVjdChuZXh0KTsKLQkJCQkJaGFzQ29uZmxpY3RpbmdQcm9qZWN0SW5NZXRhSW5mKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3RUb0FkZCkpOwotCQkJCQl0cnkgewotCQkJCQkJZm9yIChJUHJvamVjdCByZWZlcmVuY2VkUHJvamVjdCA6IGVhclByb2plY3QuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkpIHsKLQkJCQkJCQlpZiAocmVmZXJlbmNlZFByb2plY3QgPT0gcHJvamVjdFRvQWRkKSB7Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlLmdldE1lc3NhZ2UoKSA6IGUudG9TdHJpbmcoKTsKLQkJCQkJCXN0YXR1cyA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgbXNnLCBlKTsKLQkJCQkJfQotCi0JCQkJCWlmICgoc3RhdHVzID0gdmFsaWRhdGVQcm9qZWN0TWF5QmVBZGRlZChlYXJQcm9qZWN0LCBwcm9qZWN0VG9BZGQsIGVhclZlcnNpb24pKS5pc09LKCkpCi0JCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUGh5c2ljYWxseUFkZGVkKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQl0cnkgewotCQkJY29tcG9uZW50LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQkKLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0TWF5QmVBZGRlZChJUHJvamVjdCBlYXJQcm9qZWN0LCBJUHJvamVjdCBwcm9qZWN0VG9BZGQsIGludCBlYXJWZXJzaW9uKSB7Ci0JCWlmIChlYXJQcm9qZWN0ID09IG51bGwgfHwgcHJvamVjdFRvQWRkID09IG51bGwgfHwgZWFyVmVyc2lvbiA8IDApCi0JCQlyZXR1cm4gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBNZXNzYWdlcy5BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X0NvdWxkX25vdF9hZGRfbW9kdWxlX3RvX0VudGVycHJpc2VfLCBudWxsKTsKLQkJZWxzZSBpZiAoIWVhclByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIE5MUy5iaW5kKE1lc3NhZ2VzLkFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfVGhlX3Byb2plY3RfMF9jYW5ub3RfYmVfYWNjZXNzZV8sIGVhclByb2plY3QuZ2V0TmFtZSgpKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoIXByb2plY3RUb0FkZC5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuIEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgTWVzc2FnZXMuQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfZHJhZ2dlZF9wcm9qZWN0X2Nhbm5vdF9iZV9hZGRlZF8sIG51bGwpOwotCQl9Ci0KLQkJSVN0YXR1cyBpc1ZhbGlkID0gdmFsaWRhdGVQcm9qZWN0VG9BZGQocHJvamVjdFRvQWRkLCBlYXJWZXJzaW9uKTsKLQkJaWYgKCFpc1ZhbGlkLmlzT0soKSkgewotCQkJcmV0dXJuIGlzVmFsaWQ7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gLTEgb24gZXJyb3IKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEVhclZlcnNpb24oSVByb2plY3QgZWFyUHJvamVjdCkgewotCQlpbnQgZWFyVmVyc2lvbiA9IC0xOwotCQlJTW9kZWxQcm92aWRlciBtb2RlbFByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlYXJQcm9qZWN0KTsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGVhclByb2plY3QpOwotCi0JCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCkgewotCQkJCWRvdWJsZSBkb3VibGUxID0gRG91YmxlLnBhcnNlRG91YmxlKGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3RGYWNldFZlcnNpb24oRUFSRmFjZXRVdGlscy5FQVJfRkFDRVQpLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCQkJZWFyVmVyc2lvbiA9IChpbnQpIChkb3VibGUxICogMTApOwotCQkJfSBlbHNlIHsKLQkJCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IoIkNvdWxkIG5vdCBhY3F1aXJlIG1vZGVsIGVsZW1lbnRzIGZvciBwcm9qZWN0IFwiIiArIGVhclByb2plY3QuZ2V0TmFtZSgpICsgIlwiLiIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJU3RyaW5nIG1zZyA9IGUxLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZTEuZ2V0TWVzc2FnZSgpIDogZTEudG9TdHJpbmcoKTsKLQkJCUpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvcihtc2csIGUxKTsKLQkJfQotCi0JCXJldHVybiBlYXJWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmYWNldGVkUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBoYXNFYXJGYWNldChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJU3RyaW5nIG1zZyA9IGUxLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZTEuZ2V0TWVzc2FnZSgpIDogZTEudG9TdHJpbmcoKTsKLQkJCUpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvcihtc2csIGUxKTsKLQkJfQotCQlyZXR1cm4gZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoRUFSRmFjZXRVdGlscy5FQVJfRkFDRVQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgY2FsY3VsYXRlVmFsaWRQcm9qZWN0TmFtZShmaW5hbCBTdHJpbmcgb3JpZ2luYWxOYW1lKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlTdHJpbmcgdmFsaWROYW1lID0gb3JpZ2luYWxOYW1lOwotCQlpbnQgY291bnQgPSAxOwotCQl3aGlsZSAocm9vdC5nZXRQcm9qZWN0KHZhbGlkTmFtZSkuZXhpc3RzKCkpIHsKLQkJCXZhbGlkTmFtZSA9IG9yaWdpbmFsTmFtZSArIGNvdW50Kys7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpvYlRpdGxlKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCkgewotCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuQWRkTW9kdWxlVG9FYXJEcm9wQXNzaXN0YW50X0FkZGluZ19tb2R1bGVfdG9fZWFfLCBlYXJDb21wb25lbnQuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3RUb0FkZChJUHJvamVjdCBwcm9qZWN0VG9BZGQsIGludCBlYXJWZXJzaW9uKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBwcm9qZWN0IHRvIGFkZCBpcyBub3QgYW4gRUFSIGl0c2VsZgotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3RUb0FkZCk7Ci0JCQlpZiAoZmFjZXRlZFByb2plY3QgPT0gbnVsbCkgewotCQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3RUb0FkZCwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gamF2YWZhY2V0dmVyc2lvbiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9KQVZBKS5nZXREZWZhdWx0VmVyc2lvbigpOwotCQkJCWZhY2V0ZWRQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQoamF2YWZhY2V0dmVyc2lvbiwgbnVsbCwgbnVsbCk7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gdXRpbGl0eWZhY2V0dmVyc2lvbiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9VVElMSVRZX01PRFVMRSkuZ2V0RGVmYXVsdFZlcnNpb24oKTsKLQkJCQlmYWNldGVkUHJvamVjdC5pbnN0YWxsUHJvamVjdEZhY2V0KHV0aWxpdHlmYWNldHZlcnNpb24sIG51bGwsIG51bGwpOwotCQkJfQotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCkpCi0JCQkJc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQllbHNlCi0JCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQkJLy8gY2hlY2sgaWYgdGhlIHByb2plY3QgdG8gYWRkIGlzIHdpdGggSmF2YSBFRSB2ZXJzaW9uIGVxdWFsIG9yCi0JCQkvLyBsZXNzZXIgdGhhbiB0aGF0IG9mIHRoZSBFQVIKLQkJCVN0cmluZyB2ZXJTdHIgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFZlcnNpb24ocHJvamVjdFRvQWRkKTsKLQkJCWlmICh2ZXJTdHIgIT0gbnVsbCkgewotCQkJCWludCB2ZXJzaW9uOwotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0VG9BZGQpKQotCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRBcHBDbGllbnRWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlclN0cik7Ci0JCQkJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3RUb0FkZCkpCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydEVKQlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyU3RyKTsKLQkJCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3RUb0FkZCkpCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFdlYlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyU3RyKTsKLQkJCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdFRvQWRkKSkKLQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0Q29ubmVjdG9yVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJTdHIpOwotCQkJCWVsc2UKLQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KHZlclN0cik7Ci0KLQkJCQlpZiAodmVyc2lvbiA+IGVhclZlcnNpb24pCi0JCQkJCXN0YXR1cyA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCWVsc2UKLQkJCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJc3RhdHVzID0gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBtc2csIGUpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBlbGVtZW50KS5nZXRBZGFwdGVyKElQUk9KRUNUX0NMQVNTKTsKLQkJZWxzZQotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKGVsZW1lbnQsIElQUk9KRUNUX0NMQVNTKTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0RWFyTm9kZSkgewotCQkJcHJvamVjdCA9ICgoQWJzdHJhY3RFYXJOb2RlKSBlbGVtZW50KS5nZXRFYXJQcm9qZWN0KCk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdyb3VwRUFSUHJvdmlkZXIpIHsKLQkJCXByb2plY3QgPSAoKEdyb3VwRUFSUHJvdmlkZXIpIGVsZW1lbnQpLmdldFByb2plY3QoKTsKLQkJfQotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpIHsKLQkJCXByb2plY3QgPSAoKElWaXJ0dWFsUmVmZXJlbmNlKSBlbGVtZW50KS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpOwotCQl9Ci0KLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKMkVFSXRlbVByb3ZpZGVyKSB7Ci0JCQkJSUZpbGUgYXNzb2NpYXRlZEZpbGUgPSAoKEoyRUVJdGVtUHJvdmlkZXIpIGVsZW1lbnQpLmdldEFzc29jaWF0ZWRGaWxlKCk7Ci0JCQkJaWYgKGFzc29jaWF0ZWRGaWxlICE9IG51bGwpCi0JCQkJCXByb2plY3QgPSBhc3NvY2lhdGVkRmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFVSSShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCVN0cmluZyBuYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLQotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJbmFtZSArPSBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfV0FSOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkgewotCQkJbmFtZSArPSBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfRUFSOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChwcm9qZWN0KSkgewotCQkJbmFtZSArPSBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfUkFSOwotCQl9IGVsc2UgewotCQkJbmFtZSArPSBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfSkFSOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNDb25mbGljdGluZ1Byb2plY3RJbk1ldGFJbmYoT2JqZWN0IGxpYikgewotCQlJUHJvamVjdCBsaWJQcm9qID0gbnVsbDsgCi0JCQlpZiAobGliIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlsaWJQcm9qID0gKElQcm9qZWN0KSBsaWI7IAotCQkJfSBlbHNlIGlmIChsaWIgaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCkgewotCQkJCWxpYlByb2ogPSAoKElWaXJ0dWFsQ29tcG9uZW50KSBsaWIpLmdldFByb2plY3QoKTsgCi0JCQl9IGVsc2UgaWYgKGxpYiBpbnN0YW5jZW9mIElWaXJ0dWFsUmVmZXJlbmNlKXsKLQkJCQlsaWJQcm9qID0gKChJVmlydHVhbFJlZmVyZW5jZSkgbGliKS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpOwotCQkJfQotCQlpZihsaWJQcm9qID09IG51bGwpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlQcm9qZWN0IGVhclByb2plY3QgPSBlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQl0cnkgewotCQkJSVByb2plY3RbXSBlYXJSZWZQcm9qZWN0cyA9IGVhclByb2plY3QuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclJlZlByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoZWFyUmVmUHJvamVjdHNbaV0pICYmICFlYXJSZWZQcm9qZWN0c1tpXS5lcXVhbHMobGliUHJvaikpIHsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY21wMSA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclJlZlByb2plY3RzW2ldKTsKLQkJCQkJaWYgKGNtcDEgPT0gbnVsbCl7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBjbXAxLmdldFJlZmVyZW5jZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAocmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmVxdWFscyhsaWJQcm9qKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJaW50IGsgPSAwOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBhZGRDb21wb25lbnRzVG9FYXIoTGlzdDxJVmlydHVhbENvbXBvbmVudD4gY29tcG9uZW50cywgU3RyaW5nIGxpYkRpcikgewotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCUlEYXRhTW9kZWwgZGF0YW1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0KLQkJTWFwIGNvbXBvbmVudFRvVVJJTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcG9uZW50ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdHIgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQltb2R1bGVDb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIGl0ci5uZXh0KCk7Ci0JCQljb21wb25lbnRUb1VSSU1hcC5wdXQobW9kdWxlQ29tcG9uZW50LCBnZXREZWZhdWx0VVJJKG1vZHVsZUNvbXBvbmVudCkpOwotCQl9Ci0JCWRhdGFtb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgZWFyQ29tcG9uZW50KTsKLQkJZGF0YW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIGNvbXBvbmVudHMpOwotCQlkYXRhbW9kZWwuc2V0UHJvcGVydHkoSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLCBjb21wb25lbnRUb1VSSU1hcCk7Ci0JCVN0cmluZyBsaWJEaXJQYXRoID0gbGliRGlyOyAKLQkJaWYobGliRGlyICE9IG51bGwgJiYgbGliRGlyLmxlbmd0aCgpID4gMCkKLQkJCWxpYkRpclBhdGggPSBuZXcgUGF0aChsaWJEaXIpLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0JCWRhdGFtb2RlbC5zZXRQcm9wZXJ0eShJQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCBsaWJEaXJQYXRoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBkYXRhbW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyByZW1vdmVDb21wb25lbnRzRnJvbUVhcihMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wb25lbnRzLCBTdHJpbmcgbGliRGlyKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJSURhdGFNb2RlbCBkYXRhbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQlkYXRhbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIGVhckNvbXBvbmVudCk7Ci0JCWRhdGFtb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBjb21wb25lbnRzKTsKLQkJdHJ5IHsKLQkJCXN0YXR1cyA9IGRhdGFtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZVJlZmVyZW5jZXMoY29tcG9uZW50cywgbGliRGlyLCBlYXJDb21wb25lbnQpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJlbW92ZVJlZmVyZW5jZXMoTGlzdDxJVmlydHVhbENvbXBvbmVudD4gY29tcG9uZW50cywgU3RyaW5nIGxpYkRpciwgSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50KSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IHNvdXJjZUNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCWZvciAoSVZpcnR1YWxSZWZlcmVuY2UgcmVmIDogcmVmcykgewotCQkJcmVmLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCX0KLQkJTWFwIGNvbXBvbmVudFRvVVJJTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdHIgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIGl0ci5uZXh0KCk7Ci0JCQljb21wb25lbnRUb1VSSU1hcC5wdXQobW9kdWxlQ29tcG9uZW50LCBnZXREZWZhdWx0VVJJKG1vZHVsZUNvbXBvbmVudCkpOwotCQl9Ci0JCWZpbmFsIElEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVAsIGNvbXBvbmVudFRvVVJJTWFwKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHNvdXJjZUNvbXBvbmVudCk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIGNvbXBvbmVudHMpOwotCQlpZiAobGliRGlyLmxlbmd0aCgpID4gMCkgewotCQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCBuZXcgUGF0aChsaWJEaXIpLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJlc29sdmVDb25mbGljdHMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUlQcm9qZWN0IGVhclByb2plY3QgPSBlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQl0cnkgewotCQkJSVByb2plY3RbXSBlYXJSZWZQcm9qZWN0cyA9IGVhclByb2plY3QuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclJlZlByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoZWFyUmVmUHJvamVjdHNbaV0pKSB7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNtcDEgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJSZWZQcm9qZWN0c1tpXSk7Ci0JCQkJCWlmKGNtcDEgPT0gbnVsbCl7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBjbXAxLmdldFJlZmVyZW5jZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAocmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZXF1YWxzKGNvbXBvbmVudCkpIHsKLQkJCQkJCQlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4oKTsKLQkJCQkJCQljb21wb25lbnRzLmFkZChyZWZzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSk7Ci0JCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSByZW1vdmVSZWZlcmVuY2VzKGNvbXBvbmVudHMsIHJlZnNbal0uZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpLCByZWZzW2pdLmdldEVuY2xvc2luZ0NvbXBvbmVudCgpKTsKLQkJCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkJCQl9Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcmVtb3ZlTWFuaWZlc3REZXBlbmRlbmN5KHJlZnNbal0uZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCksIHJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJCQkJCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IobXNnLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWludCBrID0gMDsKLQkJfQotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVNYW5pZmVzdERlcGVuZGVuY3koZmluYWwgSVZpcnR1YWxDb21wb25lbnQgc291cmNlLCBmaW5hbCBJVmlydHVhbENvbXBvbmVudCB0YXJnZXQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlmaW5hbCBTdHJpbmcgc291cmNlUHJvak5hbWUgPSBzb3VyY2UuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHRhcmdldFByb2pOYW1lOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQl0YXJnZXRQcm9qTmFtZSA9ICgoSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB0YXJnZXQpLmdldE5hbWUoKTsKLQkJCVN0cmluZ1tdIHBhdGhTZWdtZW50cyA9IHRhcmdldFByb2pOYW1lLnNwbGl0KCIiICsgSVBhdGguU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJAotCQkJdGFyZ2V0UHJvak5hbWUgPSBwYXRoU2VnbWVudHNbcGF0aFNlZ21lbnRzLmxlbmd0aCAtIDFdOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0UHJvak5hbWUgPSB0YXJnZXQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlmaW5hbCBJRmlsZSBtYW5pZmVzdG1mID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0TWFuaWZlc3RGaWxlKHNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQlmaW5hbCBBcmNoaXZlTWFuaWZlc3QgbWYgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5yZWFkTWFuaWZlc3Qoc291cmNlLmdldFByb2plY3QoKSk7Ci0JCWlmIChtZiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBJRGF0YU1vZGVsIHVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHNvdXJjZVByb2pOYW1lKTsKLQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5NRVJHRSwgZmFsc2UpOwotCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFOSUZFU1RfRklMRSwgbWFuaWZlc3RtZik7Ci0JCVN0cmluZ1tdIGNwID0gbWYuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCUxpc3QgY3BMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmcgY3BUb1JlbW92ZSA9ICh0YXJnZXRQcm9qTmFtZS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKSkgPyAKLQkJCQl0YXJnZXRQcm9qTmFtZSA6IHRhcmdldFByb2pOYW1lICsgSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFjcFtpXS5lcXVhbHMoY3BUb1JlbW92ZSkpIHsKLQkJCQljcExpc3QuYWRkKGNwW2ldKTsKLQkJCX0KLQkJfQotCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuSkFSX0xJU1QsIGNwTGlzdCk7Ci0JCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZG5kL0lNb2R1bGVFeHRlbnNpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2RuZC9JTW9kdWxlRXh0ZW5zaW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmFlMTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZG5kL0lNb2R1bGVFeHRlbnNpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5kbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZUV4dGVuc2lvbnMgewotCi0JU3RyaW5nIERPVF9XQVIgPSAiLndhciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRE9UX0pBUiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgRE9UX1JBUiA9ICIucmFyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBET1RfRUFSID0gIi5lYXIiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9BYnN0cmFjdEVhck5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0Fic3RyYWN0RWFyTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjRmZDk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0Fic3RyYWN0RWFyTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotLyoqCi0gKiBAYXV0aG9yIGdvcm1vdgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWFyTm9kZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFQVJfREVGQVVMVF9MSUIgPSAibGliIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBpbnQgTU9EVUxFU19UWVBFID0gMDsgICAgCi0JcHVibGljIHN0YXRpYyBpbnQgTElCU19UWVBFID0gMTsKLQotCXByb3RlY3RlZCBpbnQgdHlwZTsKLQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VUeXBlcyA9Ci0JCUFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIAotCQkJCUlNb2R1bGVDb25zdGFudHMuSlNUX0FQUENMSUVOVF9NT0RVTEUsCi0JCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSwKLQkJCQlJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFLAotCQkJCUlNb2R1bGVDb25zdGFudHMuSlNUX0NPTk5FQ1RPUl9NT0RVTEV9KTsKLQotCXByaXZhdGUgSVByb2plY3QgZWFyUHJvamVjdDsKLQotCXB1YmxpYyBBYnN0cmFjdEVhck5vZGUoSVByb2plY3QgZWFyUHJvamVjdCkgewotCQl0aGlzLmVhclByb2plY3QgPSBlYXJQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRFYXJQcm9qZWN0KCkgewotCQlyZXR1cm4gZWFyUHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRNb2R1bGVzKCk7Ci0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUZXh0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KExpc3QgY29tcG9uZW50VHlwZXMsIElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gdmlydHVhbENvbXBvbmVudDsKLQkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsICkgewotCQkJSVBhdGggcmVsYXRpdmVSdW50aW1lUGF0aCA9IG51bGw7Ci0JCQlpZiAocnVudGltZVBhdGggIT0gbnVsbCl7Ci0JCQkJcmVsYXRpdmVSdW50aW1lUGF0aCA9IHJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZSgpOwotCQkJfQotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZDb21wb25lbnRzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmQ29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZSA9IHJlZkNvbXBvbmVudHNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmIChtb2R1bGUgPT0gbnVsbCkgY29udGludWU7Ci0JCQkJLy8gaWYgY29tcG9uZW50IHR5cGVzIHBhc3NlZCBpbiBpcyBudWxsIHRoZW4gcmV0dXJuIGFsbCBjb21wb25lbnRzCi0JCQkJaWYgKGNvbXBvbmVudFR5cGVzID09IG51bGwgfHwgY29tcG9uZW50VHlwZXMuc2l6ZSgpID09IDApIHsKLQkJCQkJY29tcG9uZW50cy5hZGQocmVmQ29tcG9uZW50c1tpXSk7Ci0JCQkJfSBlbHNlIGlmIChyZWxhdGl2ZVJ1bnRpbWVQYXRoICE9IG51bGwpewotCQkJCQlJUGF0aCBydW50aW1lUGF0aDIgPSBnZXRSZWFsUnVudGltZVBhdGgocmVmQ29tcG9uZW50c1tpXSk7Ci0JCQkJCWlmICghcmVsYXRpdmVSdW50aW1lUGF0aC5pc0VtcHR5KCkgJiYgcnVudGltZVBhdGgyLm1ha2VSZWxhdGl2ZSgpLmVxdWFscyhyZWxhdGl2ZVJ1bnRpbWVQYXRoKSAmJiBjb21wb25lbnRUeXBlcy5jb250YWlucyhKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVDb21wb25lbnRUeXBlKG1vZHVsZSkpKSB7Ci0JCQkJCQljb21wb25lbnRzLmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcG9uZW50czsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBjb21wbGV0ZSBsaXN0IG9mIHRoZSBiaW5hcmllcyBjb250YWluZWQgaW4gdGhlIGxpYiBkaXIuCi0JICogCi0JICogQHBhcmFtIHZpcnR1YWxDb21wb25lbnQKLQkgKiBAcGFyYW0gcnVudGltZVBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0QmluYXJpZXNJbkxpYkRpcihJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50LCBJUGF0aCBydW50aW1lUGF0aCwgTGlzdCBjb21wb25lbnRUeXBlcykgewotCQlMaXN0IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IHZpcnR1YWxDb21wb25lbnQ7Ci0JCWlmIChlYXJDb21wb25lbnQgIT0gbnVsbCApIHsKLQkJCUlQYXRoIHJlbGF0aXZlUnVudGltZVBhdGggPSBudWxsOwotCQkJaWYgKHJ1bnRpbWVQYXRoICE9IG51bGwpewotCQkJCXJlbGF0aXZlUnVudGltZVBhdGggPSBydW50aW1lUGF0aC5tYWtlUmVsYXRpdmUoKTsKLQkJCX0KLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmQ29tcG9uZW50cyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZkNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGUgPSByZWZDb21wb25lbnRzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiAobW9kdWxlID09IG51bGwpIGNvbnRpbnVlOwotCQkJCS8vIGlmIGNvbXBvbmVudCB0eXBlcyBwYXNzZWQgaW4gaXMgbnVsbCB0aGVuIHJldHVybiBhbGwgY29tcG9uZW50cwotCQkJCWlmIChtb2R1bGUuaXNCaW5hcnkoKSAmJiByZWxhdGl2ZVJ1bnRpbWVQYXRoICE9IG51bGwgJiYgIXJlbGF0aXZlUnVudGltZVBhdGguaXNFbXB0eSgpICYmIGdldFJlYWxSdW50aW1lUGF0aChyZWZDb21wb25lbnRzW2ldKS5tYWtlUmVsYXRpdmUoKS5lcXVhbHMocmVsYXRpdmVSdW50aW1lUGF0aCkpIHsKLQkJCQkJaWYgKGNvbXBvbmVudFR5cGVzICE9IG51bGwgJiYgIWNvbXBvbmVudFR5cGVzLmNvbnRhaW5zKEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUNvbXBvbmVudFR5cGUobW9kdWxlKSkgKSB7Ci0JCQkJCQlpZiAocnVudGltZVBhdGggIT0gbnVsbCAmJiAhcnVudGltZVBhdGguZXF1YWxzKG5ldyBQYXRoKCIvIikpKXsvLyROT04tTkxTLTEkCi0JCQkJCQkJY29tcG9uZW50cy5hZGQocmVmQ29tcG9uZW50c1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb21wb25lbnRzLmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJCQkJfQotCi0KLQkJCQl9IAotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wb25lbnRzOwotCX0KLQkKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbGwgdGhlIGJpbmFyaWVzIGNvbnRhaW5lZCBpbiB0aGUgbGliIGRpci4KLQkgKiBJdCB3aWxsIG5vdCBjb25zaWRlciBtb2R1bGVzIGluIGxpYiBkaXIgYXMgbGlicmFyaWVzIGZvciB0aGF0IHVzZSAKLQkgKiBnZXRCaW5hcmllc0luTGliRGlyKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIElQYXRoIHJ1bnRpbWVQYXRoLCBMaXN0IGNvbXBvbmVudFR5cGVzKQotCSAqIAotCSAqIEBwYXJhbSB2aXJ0dWFsQ29tcG9uZW50Ci0JICogQHBhcmFtIHJ1bnRpbWVQYXRoCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIGl0IGlzIG5vdCByZXR1cm5pbmcgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbGlicmFyaWVzCi0JICogIHVzZTogZ2V0QmluYXJpZXNJbkxpYkRpcihJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50LCBJUGF0aCBydW50aW1lUGF0aCwgTGlzdCBjb21wb25lbnRUeXBlcykKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRCaW5hcmllc0luTGliRGlyKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBnZXRCaW5hcmllc0luTGliRGlyKHZpcnR1YWxDb21wb25lbnQsIHJ1bnRpbWVQYXRoLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlY29tcHV0ZUxpYkZvbGRlcihJUHJvamVjdCBwcm9qZWN0KXsKLQkJSU1vZGVsUHJvdmlkZXIgbW9kZWxQcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0JCU9iamVjdCBtb2RlbE9iamVjdCA9IG1vZGVsUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJaWYgKEFwcGxpY2F0aW9uLmNsYXNzLmlzSW5zdGFuY2UobW9kZWxPYmplY3QpKXsKLQkJCVN0cmluZyBsaWJyYXJ5RGlyZWN0b3J5ID0gKChBcHBsaWNhdGlvbiltb2RlbE9iamVjdCkuZ2V0TGlicmFyeURpcmVjdG9yeSgpOwotCQkJcmV0dXJuIGxpYnJhcnlEaXJlY3RvcnkgIT0gbnVsbCA/IGxpYnJhcnlEaXJlY3RvcnkgOiBFQVJfREVGQVVMVF9MSUI7Ci0JCX0KLQkJcmV0dXJuIEVBUl9ERUZBVUxUX0xJQjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0UmVhbFJ1bnRpbWVQYXRoKElWaXJ0dWFsUmVmZXJlbmNlIHZyKXsKLQkJSVBhdGggcnVudGltZVBhdGgyID0gdnIuZ2V0UnVudGltZVBhdGgoKTsKLQkJaWYodnIuZ2V0QXJjaGl2ZU5hbWUoKSAhPSBudWxsKXsKLQkJCUlQYXRoIG5hbWVQYXRoID0gbmV3IFBhdGggKHZyLmdldEFyY2hpdmVOYW1lKCkpOwotCQkJaWYgKG5hbWVQYXRoLnNlZ21lbnRDb3VudCgpPjEgJiYgcnVudGltZVBhdGgyLnNlZ21lbnRDb3VudCgpPT0wKXsKLQkJCQlydW50aW1lUGF0aDIgPSBuZXcgUGF0aCgiLyIrbmFtZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvUG9ydGFibGVTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcnVudGltZVBhdGgyOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9BcHBsaWNhdGlvbjVWaWV3ZXJTb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0FwcGxpY2F0aW9uNVZpZXdlclNvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2QxMTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0FwcGxpY2F0aW9uNVZpZXdlclNvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuQXBwbGljYXRpb25WaWV3ZXJTb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbjVWaWV3ZXJTb3J0ZXIgZXh0ZW5kcyBBcHBsaWNhdGlvblZpZXdlclNvcnRlciB7Ci0gIAotICBwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLSAgICBpZihlMSBpbnN0YW5jZW9mIEJ1bmRsZWROb2RlKXsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZihlMiBpbnN0YW5jZW9mIEJ1bmRsZWROb2RlKXsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0J1bmRsZWROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9CdW5kbGVkTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWFjODIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0J1bmRsZWROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotLyoqCi0gKiAKLSAqIEJ1bmRsZWQgTGlicmFyaWVzIG5vZGUuIFN1Yi1ub2RlIG9mIEVBUiA1IERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCdW5kbGVkTm9kZSBleHRlbmRzIEFic3RyYWN0RWFyTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gVVRJTElUWSA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoSjJFRVByb2plY3RVdGlsaXRpZXMuVVRJTElUWSk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbm9kZU5hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBCdW5kbGVkTm9kZSBidW5kbGVkTGlic0RpcmVjdG9yeU5vZGU7Ci0KLQkKLQotCXB1YmxpYyBCdW5kbGVkTm9kZShJUHJvamVjdCBlYXJQcm9qZWN0LCBTdHJpbmcgbm9kZU5hbWUsIEJ1bmRsZWROb2RlIGJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSkgewotCQlzdXBlcihlYXJQcm9qZWN0KTsKLQkJdGhpcy5ub2RlTmFtZSA9IG5vZGVOYW1lOwotCQl0aGlzLmJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSA9IGJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZTsKLQkJdHlwZSA9IExJQlNfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbm9kZU5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gbm9kZU5hbWU7Ci0JfQotCi0JcHVibGljIEJ1bmRsZWROb2RlIGdldEJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSgpIHsKLQkJcmV0dXJuIGJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdCBnZXRNb2R1bGVzKCkgewotCQlJVmlydHVhbENvbXBvbmVudCBwcm9qZWN0Q29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0RWFyUHJvamVjdCgpKTsKLQotCQlQYXRoIGxpYlBhdGggPSBuZXcgUGF0aCgiLyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChidW5kbGVkTGlic0RpcmVjdG9yeU5vZGUgPT0gbnVsbCl7Ci0JCQlsaWJQYXRoID0gbmV3IFBhdGgoIi8iICsgcmVjb21wdXRlTGliRm9sZGVyKGdldEVhclByb2plY3QoKSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCUxpc3QgbGlicyA9IGdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoVVRJTElUWSwgcHJvamVjdENvbXBvbmVudCwKLQkJCQlsaWJQYXRoKTsKLQkJbGlicy5hZGRBbGwoZ2V0QmluYXJpZXNJbkxpYkRpcihwcm9qZWN0Q29tcG9uZW50LGxpYlBhdGgsIFVUSUxJVFkpKTsKLQotCQlMaXN0IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicy5zaXplKCk7IGkrKykgewotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gKElWaXJ0dWFsUmVmZXJlbmNlKSBsaWJzLmdldChpKTsKLQkJCQotCQkJSVBhdGggcnVudGltZVBhdGggPSAgZ2V0UmVhbFJ1bnRpbWVQYXRoKHJlZmVyZW5jZSk7Ci0KLQkJCWlmIChydW50aW1lUGF0aCAhPSBudWxsICYmIHJ1bnRpbWVQYXRoLnNlZ21lbnQoMCkgIT0gbnVsbCAmJiAhbGliUGF0aC5tYWtlUmVsYXRpdmUoKS5pc0VtcHR5KCkgJiYKLQkJCQkJcnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCkuZXF1YWxzKGxpYlBhdGgubWFrZVJlbGF0aXZlKCkpKSB7Ci0JCQkJaWYgKGJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSA9PSBudWxsKXsKLQkJCQkJbW9kdWxlcy5hZGQobGlicy5nZXQoaSkpOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlICE9IG51bGwpewotCQkJCQltb2R1bGVzLmFkZChsaWJzLmdldChpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChidW5kbGVkTGlic0RpcmVjdG9yeU5vZGUgIT0gbnVsbCl7Ci0JCQltb2R1bGVzLmFkZChidW5kbGVkTGlic0RpcmVjdG9yeU5vZGUpOwotCQl9Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvR3JvdXBFQVJQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvR3JvdXBFQVJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODVkNDJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0dyb3VwRUFSUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEVhciA1IERlcGxveW1lbnQgZGVzY3JpcHRvciBub2RlLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwRUFSUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEdyb3VwUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUkVMQVRJVkVfUEFUSCA9ICJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUFSX0RFRkFVTFRfTElCID0gImxpYiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBFQVJfSU1BR0U7Ci0JcHJpdmF0ZSBFQVJWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudDsKLQlwcml2YXRlIElGaWxlIGRkRmlsZTsKLQkKLQlwcml2YXRlIEJ1bmRsZWROb2RlIGJ1bmRsZWRMaWJzTm9kZTsKLQlwcml2YXRlIE1vZHVsZXNOb2RlIG1vZHVsZXNOb2RlOwotCQotCXB1YmxpYyBHcm91cEVBUlByb3ZpZGVyKEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBFQVJWaXJ0dWFsQ29tcG9uZW50IHd0cENvbXBvbmVudCkgewotCQlzdXBlcihhcHBsaWNhdGlvbik7Ci0JCWVhckNvbXBvbmVudCA9IHd0cENvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gIkRlcGxveW1lbnQgRGVzY3JpcHRvcjogIiArIGVhckNvbXBvbmVudC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRUFSVmlydHVhbENvbXBvbmVudCBnZXRFQVJWaXJ0dWFsQ29tcG9uZW50KCkgewotCQlyZXR1cm4gdGhpcy5lYXJDb21wb25lbnQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0KLQkJSVZpcnR1YWxDb21wb25lbnQgcHJvamVjdENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQl0cnkgewotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwgJiYgCi0JCQkJCWZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldCgKLQkJCQkJCQlQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSkuZ2V0VmVyc2lvbigKLQkJCQkJCQkJCUoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpKSkgewotCi0JCQkJaWYoYnVuZGxlZExpYnNOb2RlID09IG51bGwpewotCQkJCQlCdW5kbGVkTm9kZSBidW5kbGVkTGlic0RpcmVjdG9yeU5vZGUgPSBuZXcgQnVuZGxlZE5vZGUocHJvamVjdCwgTWVzc2FnZXMuTElCUkFSWV9ESVJFQ1RPUlkgKyAiOiAvIiArIEVBUl9ERUZBVUxUX0xJQiwgbnVsbCk7Ly8kTk9OLU5MUy0xJAotCQkJCQlidW5kbGVkTGlic05vZGUgPSBuZXcgQnVuZGxlZE5vZGUocHJvamVjdCwgTWVzc2FnZXMuQlVORExFRF9MSUJSQVJJRVNfTk9ERSwgYnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobW9kdWxlc05vZGUgPT0gbnVsbCl7Ci0JCQkJCW1vZHVsZXNOb2RlID0gbmV3IE1vZHVsZXNOb2RlKHByb2plY3QpOwotCQkJCX0KLQkJCQkKLQotCQkJCWNoaWxkcmVuLmFkZChtb2R1bGVzTm9kZSk7Ci0JCQkJY2hpbGRyZW4uYWRkKGJ1bmRsZWRMaWJzTm9kZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZyA9ICJFcnJvciBpbiB0aGUgSkVFQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKCkgZm9yIHBhcmVudDoiICsgIHRoaXM7IC8vJE5PTi1OTFMtMSQKLQkJCUpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvcihtc2csIGUpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBnZXRFYXJJbWFnZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RWFySW1hZ2UoKSB7Ci0JCWlmIChFQVJfSU1BR0UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSkVFVUlQbHVnaW5JY29ucy5FQVJfSU1BR0UpOwotCQkJRUFSX0lNQUdFID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIEVBUl9JTUFHRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQl9Ci0JcHVibGljIElGaWxlIGdldERERmlsZSgpIHsKLQkJaWYgKGRkRmlsZSAhPSBudWxsKXsKLQkJCXJldHVybiBkZEZpbGU7Ci0JCX0KLQkJSVZpcnR1YWxGb2xkZXIgdmlydHVhbEZvbGRlciA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFByb2plY3QoKSkuZ2V0Um9vdEZvbGRlcigpOwotCQlkZEZpbGUgPSB2aXJ0dWFsRm9sZGVyLmdldEZpbGUoUFJPSkVDVF9SRUxBVElWRV9QQVRIKS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQlyZXR1cm4gZGRGaWxlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvTW9kdWxlc05vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL01vZHVsZXNOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNjkyZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvTW9kdWxlc05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIAotICogTW9kdWxlcyBzdWItbm9kZSBvZiBFQVIgRGVwbG95bWVudCBkZXNjcmlwdG9yIG5vZGUgSmF2YSBFRSA1IAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZXNOb2RlIGV4dGVuZHMgQWJzdHJhY3RFYXJOb2RlIHsKLQotCXB1YmxpYyBNb2R1bGVzTm9kZShJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JCXN1cGVyKGVhclByb2plY3QpOwotCQl0eXBlID0gTU9EVUxFU19UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JICAgIHJldHVybiBNZXNzYWdlcy5FQVJfTU9EVUxFU19OT0RFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLkVBUl9NT0RVTEVTX05PREU7Ci0JfQotCQotCSBwdWJsaWMgTGlzdCBnZXRNb2R1bGVzKCkgewotCSAgICAJSVZpcnR1YWxDb21wb25lbnQgcHJvamVjdENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldEVhclByb2plY3QoKSk7Ci0JICAgIAlyZXR1cm4gZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VUeXBlcywgcHJvamVjdENvbXBvbmVudCwgbmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQkgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvU2hvd0RlcFByb3BQYWdlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9TaG93RGVwUHJvcFBhZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhMzM5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9TaG93RGVwUHJvcFBhZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlByb3BlcnR5RGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgU2hvd0RlcFByb3BQYWdlQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlCi17Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsOwkKLQkKLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzZWwgPSBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotICAgIH0KLQkgIAotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoc2VsID09IG51bGwpewotCQkJcmV0dXJuOwotCQl9Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIE1vZHVsZXNOb2RlKSB7Ci0JCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gKChNb2R1bGVzTm9kZSlzZWxlY3RlZE9iamVjdCkuZ2V0RWFyUHJvamVjdCgpOwotCQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcm9wZXJ0eURpYWxvZy5jcmVhdGVEaWFsb2dPbihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLgotICAgICAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLCAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY2llc1BhZ2UiLCBlYXJQcm9qZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGRpYWxvZyAhPSBudWxsKSB7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDcxYzliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcy4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyBleHRlbmRzIEFic3RyYWN0REROb2RlIHsKLQotICBwdWJsaWMgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoT2JqZWN0IGFkYXB0ZXJOb2RlKSB7Ci0gICAgc3VwZXIoYWRhcHRlck5vZGUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotICAgIHJldHVybiAoTGlzdCkgYWRhcHRlck5vZGU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VzLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVM7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImFjY2Vzc19pbnRlbnRfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5EZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5EZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJlZDU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9CZWFuRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW5JY29uczsKLQotcHVibGljIGNsYXNzIEJlYW5EZWNvcmF0b3IgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewotCi0JcHVibGljIHZvaWQgZGVjb3JhdGUoT2JqZWN0IGVsZW1lbnQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCZWFuSW50ZXJmYWNlTm9kZSl7Ci0JCQlCZWFuSW50ZXJmYWNlTm9kZSBiZWFuSW50ZXJhY2VOb2RlID0gKEJlYW5JbnRlcmZhY2VOb2RlKSBlbGVtZW50OwotCQkJc3dpdGNoIChiZWFuSW50ZXJhY2VOb2RlLmdldEtpbmQoKSkgewotCQkJY2FzZSBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5CVVNTSU5FU1NfTE9DQUw6Ci0JCQkJYXBwbHlEZWNvcmF0b3IoSkVFVUlQbHVnaW5JY29ucy5CVVNTSU5FU1NfTE9DQUwsIGRlY29yYXRpb24pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5CVVNTSU5FU1NfUkVNT1RFOgotCQkJCWFwcGx5RGVjb3JhdG9yKEpFRVVJUGx1Z2luSWNvbnMuQlVTU0lORVNTX1JFTU9URSwgZGVjb3JhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLlJFTU9URToKLQkJCQlhcHBseURlY29yYXRvcihKRUVVSVBsdWdpbkljb25zLlJFTU9URSwgZGVjb3JhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLlJFTU9URV9IT01FOgotCQkJCWFwcGx5RGVjb3JhdG9yKEpFRVVJUGx1Z2luSWNvbnMuUkVNT1RFX0hPTUUsIGRlY29yYXRpb24pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5MT0NBTDoKLQkJCQlhcHBseURlY29yYXRvcihKRUVVSVBsdWdpbkljb25zLkxPQ0FMLCBkZWNvcmF0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuTE9DQUxfSE9NRToKLQkJCQlhcHBseURlY29yYXRvcihKRUVVSVBsdWdpbkljb25zLkxPQ0FMX0hPTUUsIGRlY29yYXRpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCZWFuTm9kZSl7Ci0JCSAgZGVjb3JhdGlvbi5hZGRPdmVybGF5KEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJlamJfbW9kdWxlX292ciIpKTsgLy8kTk9OLU5MUy0xJAotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXBwbHlEZWNvcmF0b3IoU3RyaW5nIGlkLCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGlkKTsKLQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KGltYWdlRGVzY3JpcHRvcik7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbkludGVyZmFjZU5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5JbnRlcmZhY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZWE0NjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbkludGVyZmFjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RERE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgU2Vzc2lvbiBvciBFbnRpdHkKLSAqIGJlYW5zIGludGVyZmFjZXMgKEJ1c2luZXNzLCBDb21wb25lbnQgYW5kIExvY2FsIGludGVyZmFjZXMpLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgY2xhc3MgQmVhbkludGVyZmFjZU5vZGUgZXh0ZW5kcyBBYnN0cmFjdERETm9kZSB7Ci0KLQlwcml2YXRlIGZpbmFsIGludCBraW5kOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIF9mcW47Ci0KLQlwdWJsaWMgY2xhc3MgS0lORFMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVVNTSU5FU1NfTE9DQUwgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVVNTSU5FU1NfUkVNT1RFID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUwgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9IT01FID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1RFID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1RFX0hPTUUgPSA1OwotCX0KLQotCXB1YmxpYyBCZWFuSW50ZXJmYWNlTm9kZShPYmplY3QgYWRhcHRlck5vZGUsIFN0cmluZyBfZnFuLCBpbnQga2luZCkgewotCQlzdXBlcihhZGFwdGVyTm9kZSk7Ci0JCXRoaXMuX2ZxbiA9IF9mcW47Ci0JCXRoaXMua2luZCA9IGtpbmQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gU2lnbmF0dXJlLmdldFNpbXBsZU5hbWUoX2Zxbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19PQkpTX0NVTklUKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldF9mcW4oKSB7Ci0JCXJldHVybiBfZnFuOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9CZWFuTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1NGY0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9CZWFuTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZSB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IEVudGVycHJpc2UgYmVhbnMuCi0gKiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuTm9kZSBleHRlbmRzIEFic3RyYWN0REROb2RlIHsKLSAgCi0gIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBCRUFOX09WUjsKLSAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIFdFQl9TRVJWSUNFX09WUjsKLSAgCi0gIHB1YmxpYyBCZWFuTm9kZShKYXZhRUVPYmplY3QgYmVhbikgewotICAgIHN1cGVyKGJlYW4pOwotICAgIGltYWdlID0gbnVsbDsKLSAgICBTdHJpbmcgcXVhbGlmaWVkID0gZ2V0RWpiQ2xhc3NRdWFsaWZpZWROYW1lKCk7Ci0gICAgaWYgKHF1YWxpZmllZCAhPSBudWxsKSB7Ci0gICAgICB0ZXh0ID0gU2lnbmF0dXJlLmdldFNpbXBsZU5hbWUocXVhbGlmaWVkKTsKLSAgICAgIGRlc2NyaXB0aW9uID0gTWVzc2FnZXMuRU5URVJQUklTRV9CRUFOX0NMQVNTX0RFU0NSSVBUSU9OICsgcXVhbGlmaWVkOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRFamJDbGFzc1F1YWxpZmllZE5hbWUoKSB7Ci0gICAgaWYgKGFkYXB0ZXJOb2RlIGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pewotICAgICAgcmV0dXJuICgoU2Vzc2lvbkJlYW4pYWRhcHRlck5vZGUpLmdldEVqYkNsYXNzKCk7Ci0gICAgfSBlbHNlIGlmIChhZGFwdGVyTm9kZSBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKXsKLSAgICAgIHJldHVybiAoKE1lc3NhZ2VEcml2ZW5CZWFuKWFkYXB0ZXJOb2RlKS5nZXRFamJDbGFzcygpOwotICAgIH1lbHNlIGlmIChhZGFwdGVyTm9kZSBpbnN0YW5jZW9mIEVudGl0eUJlYW4pewotICAgICAgcmV0dXJuICgoRW50aXR5QmVhbilhZGFwdGVyTm9kZSkuZ2V0RWpiQ2xhc3MoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSmF2YUVFT2JqZWN0IGdldEVudGVycHJpc2VCZWFuKCl7Ci0JICByZXR1cm4gKEphdmFFRU9iamVjdCkgYWRhcHRlck5vZGU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkgewotICAgIHJldHVybiBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19PQkpTX0NVTklUKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5Ob2RlUHJvcGVydHlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5Ob2RlUHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzNTVjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9CZWFuTm9kZVByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotCi1wdWJsaWMgY2xhc3MgQmVhbk5vZGVQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fVFlQRSA9ICJiZWFuVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19TRVNTSU9OX0JFQU4gPSAiaXNTZXNzaW9uQmVhbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19NRVNTQUdFX0RSSVZFTiA9ICJpc01lc3NhZ2VEcml2ZW5CZWFuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywKLQkJCU9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0KLQkJaWYgKCEocmVjZWl2ZXIgaW5zdGFuY2VvZiBCZWFuTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCU9iamVjdCBhZGFwdGVyTm9kZSA9ICgoQmVhbk5vZGUpIHJlY2VpdmVyKS5nZXRBZGFwdGVyTm9kZSgpOwotCi0JCVN0cmluZyB2YWwgPSAoU3RyaW5nKSBleHBlY3RlZFZhbHVlOwotCQlpZiAoQkVBTl9UWVBFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCWlmIChJU19TRVNTSU9OX0JFQU4uZXF1YWxzKHZhbCkpIHsKLQkJCQlyZXR1cm4gaXNTZXNzaW9uQmVhbihhZGFwdGVyTm9kZSk7Ci0JCQl9IGVsc2UgaWYgKElTX01FU1NBR0VfRFJJVkVOLmVxdWFscyh2YWwpKSB7Ci0JCQkJcmV0dXJuIGlzTWVzc2FnZURyaXZlbkJlYW4oYWRhcHRlck5vZGUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNNZXNzYWdlRHJpdmVuQmVhbihPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Nlc3Npb25CZWFuKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0dyb3VwRUpCUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0dyb3VwRUpCUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmM2I5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVKQlByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLS8qKgotICogRGVwbG95bWVudCBEZXNjcmlwdG9yIHJvb3Qgbm9kZS4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBFSkJQcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlciB7Ci0KLQlwcml2YXRlIEdyb3VwRWpiU2Vzc2lvbiBncm91cEVqYlNlc3Npb247Ci0JcHJpdmF0ZSBHcm91cEVqYk1lc3NhZ2VEcml2ZW4gZ3JvdXBFamJNZXNzYWdlRHJpdmVuOwotCXByaXZhdGUgR3JvdXBFamJFbnRpdHkgZ3JvdXBFamJFbnRpdHk7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWUgPSBudWxsOwotCi0KLQlwdWJsaWMgR3JvdXBFSkJQcm92aWRlcihFSkJKYXIgZWpiSmFyKSB7Ci0JCXN1cGVyKGVqYkphcik7Ci0KLQkJZ3JvdXBFamJTZXNzaW9uID0gbmV3IEdyb3VwRWpiU2Vzc2lvbihlamJKYXIpOwotCQlncm91cEVqYk1lc3NhZ2VEcml2ZW4gPSBuZXcgR3JvdXBFamJNZXNzYWdlRHJpdmVuKGVqYkphcik7Ci0JCWdyb3VwRWpiRW50aXR5ID0gbmV3IEdyb3VwRWpiRW50aXR5KGVqYkphcik7Ci0KLQkJY2hpbGRyZW4uYWRkKGdyb3VwRWpiU2Vzc2lvbik7Ci0JCWNoaWxkcmVuLmFkZChncm91cEVqYk1lc3NhZ2VEcml2ZW4pOwotCQljaGlsZHJlbi5hZGQoZ3JvdXBFamJFbnRpdHkpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIEVKQkphciBnZXRFamJKYXIoKSB7Ci0JCXJldHVybiAoRUpCSmFyKSBqYXZhZWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gTWVzc2FnZXMuREVQTE9ZTUVOVF9ERVNDUklQVE9SICsgcHJvamVjdE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHByb2plY3ROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQl0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZWluaXQoSmF2YUVFT2JqZWN0IG1vZGVsT2JqZWN0KSB7Ci0JCXN1cGVyLnJlaW5pdChtb2RlbE9iamVjdCk7Ci0JCWdyb3VwRWpiU2Vzc2lvbi5yZWluaXQobW9kZWxPYmplY3QpOwotCQlncm91cEVqYk1lc3NhZ2VEcml2ZW4ucmVpbml0KG1vZGVsT2JqZWN0KTsKLQkJZ3JvdXBFamJFbnRpdHkucmVpbml0KG1vZGVsT2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYkVudGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvR3JvdXBFamJFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0N2U1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYkVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFuczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBFbnRpdHkgQmVhbnMgZ3JvdXAgRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUgdGhhdCBoYXMgYSBudW1iZXIgb2Ygc3ViIG5vZGVzIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwRWpiRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RERE5vZGUgewotCi0JcHVibGljIEdyb3VwRWpiRW50aXR5KEVKQkphciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLSAgICBpbWFnZSA9IG51bGw7Ci0gICAgdGV4dCA9IE1lc3NhZ2VzLkVOVElUWV9CRUFOUzsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBlbnRpdGllcyA9IG51bGw7Ci0JCSBFbnRlcnByaXNlQmVhbnMgZW50ZXJwcmlzZUJlYW5zID0gKChFSkJKYXIpIGFkYXB0ZXJOb2RlKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJIGlmIChlbnRlcnByaXNlQmVhbnMgIT0gbnVsbCkKLQkJCSBlbnRpdGllcyA9IGVudGVycHJpc2VCZWFucy5nZXRFbnRpdHlCZWFucygpOwotCQlpZiAoZW50aXRpZXMgIT0gbnVsbCAmJiBlbnRpdGllcy5zaXplKCkgPjApewotCQkJY2hpbGRyZW4uYWRkQWxsKGVudGl0aWVzKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJjbXBFbnRpdHlfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvR3JvdXBFamJNZXNzYWdlRHJpdmVuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYk1lc3NhZ2VEcml2ZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhNjY3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYk1lc3NhZ2VEcml2ZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0vKioKLSAqIE1lc3NhZ2UgRHJpdmVuIEJlYW5zIGdyb3VwIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlIHRoYXQgaGFzIGEgbnVtYmVyIG9mIHN1YiBub2RlcyAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cEVqYk1lc3NhZ2VEcml2ZW4gZXh0ZW5kcyBBYnN0cmFjdERETm9kZSB7Ci0KLQlwdWJsaWMgR3JvdXBFamJNZXNzYWdlRHJpdmVuKEVKQkphciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW1hZ2UgPSBudWxsOwotCQl0ZXh0ID0gTWVzc2FnZXMuTUVTU0FHRV9EUklWRU5fQkVBTlM7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbXNnQmVhbnMgPSBudWxsOwotCQlFbnRlcnByaXNlQmVhbnMgZW50ZXJwcmlzZUJlYW5zID0gKChFSkJKYXIpIGFkYXB0ZXJOb2RlKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJIGlmIChlbnRlcnByaXNlQmVhbnMgIT0gbnVsbCkKLQkJCSBtc2dCZWFucyA9IGVudGVycHJpc2VCZWFucy5nZXRNZXNzYWdlRHJpdmVuQmVhbnMoKTsKLQkJaWYgKG1zZ0JlYW5zICE9IG51bGwgJiYgbXNnQmVhbnMuc2l6ZSgpPjApewotCQkJY2hpbGRyZW4uYWRkQWxsKG1zZ0JlYW5zKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgibWVzc2FnZV9iZWFuX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvR3JvdXBFamJTZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYlNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlN2M4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYlNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBTZXNzaW9uIEJlYW5zIGdyb3VwIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlIHRoYXQgaGFzIGEgbnVtYmVyIG9mIHN1YiBub2RlcyAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwRWpiU2Vzc2lvbiBleHRlbmRzIEFic3RyYWN0REROb2RlIHsKLQotCXB1YmxpYyBHcm91cEVqYlNlc3Npb24oRUpCSmFyIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotICAgIGltYWdlID0gbnVsbDsKLSAgICB0ZXh0ID0gTWVzc2FnZXMuU0VTU0lPTl9CRUFOUzsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBzZXNzaW9uQmVhbnMgPSBudWxsOwotCQkgRW50ZXJwcmlzZUJlYW5zIGVudGVycHJpc2VCZWFucyA9ICgoRUpCSmFyKSBhZGFwdGVyTm9kZSkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCSBpZiAoZW50ZXJwcmlzZUJlYW5zICE9IG51bGwpCi0JCQkgc2Vzc2lvbkJlYW5zID0gZW50ZXJwcmlzZUJlYW5zLmdldFNlc3Npb25CZWFucygpOwotCQkgCi0JCWlmIChzZXNzaW9uQmVhbnMgIT0gbnVsbCAmJiBzZXNzaW9uQmVhbnMuc2l6ZSgpPjApewotCQkJY2hpbGRyZW4uYWRkQWxsKHNlc3Npb25CZWFucyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gIXRoaXMuZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZXNzaW9uQmVhbl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cENvbnRleHRQYXJhbXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDRkMjJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBDb250ZXh0IFBhcmFtZXRlcnMgZ3JvdXAgaW4gRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlcnsKLQotICAgIHByaXZhdGUgc3RhdGljIEltYWdlIENPTlRFWFRfUEFSQU1fSU1BR0U7Ci0KLSAgICBwdWJsaWMgR3JvdXBDb250ZXh0UGFyYW1zSXRlbVByb3ZpZGVyKFdlYkFwcCB3ZWJBcHApIHsKLSAgICAgICAgc3VwZXIod2ViQXBwKTsKLSAgICAgICAgdGV4dCA9IE1lc3NhZ2VzLkNPTlRFWFRfUEFSQU1TX0lURU1fUFJPVklERVI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIGlmIChqYXZhZWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gKChXZWJBcHApIGphdmFlZSkuZ2V0Q29udGV4dFBhcmFtcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRleHRQYXJhbXNJbWFnZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gIWdldENoaWxkcmVuKCkuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0Q29udGV4dFBhcmFtc0ltYWdlKCkgewotICAgICAgICBpZiAoQ09OVEVYVF9QQVJBTV9JTUFHRSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShKRUVVSVBsdWdpbkljb25zLkdST1VQX0NPTlRFWFRfUEFSQU0pOwotICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotICAgICAgICAgICAgQ09OVEVYVF9QQVJBTV9JTUFHRSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDT05URVhUX1BBUkFNX0lNQUdFOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBFcnJvclBhZ2VzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cEVycm9yUGFnZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2YThlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cEVycm9yUGFnZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEVycm9yIHBhZ2VzIGdyb3VwIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cEVycm9yUGFnZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEdyb3VwUHJvdmlkZXJ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZSBFUlJPUl9QQUdFUzsKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZSBFWENFUFRJT05fRVJST1JfUEFHRVM7Ci0KLSAgICBwdWJsaWMgR3JvdXBFcnJvclBhZ2VzSXRlbVByb3ZpZGVyKFdlYkFwcCB3ZWJBcHApIHsKLSAgICAgICAgc3VwZXIod2ViQXBwKTsKLSAgICAgICAgdGV4dCA9IE1lc3NhZ2VzLkVSUk9SX1BBR0VTX0lURU1fUFJPVklERVI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIGlmIChqYXZhZWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gKChXZWJBcHApIGphdmFlZSkuZ2V0RXJyb3JQYWdlcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEVycm9yUGFnZXNJbWFnZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gIWdldENoaWxkcmVuKCkuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RXJyb3JQYWdlc0ltYWdlKCkgewotICAgICAgICBpZiAoRVJST1JfUEFHRVMgPT0gbnVsbCkgewotICAgICAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5HUk9VUF9FUlJPUl9QQUdFKTsKLSAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOyAKLSAgICAgICAgICAgIEVSUk9SX1BBR0VTID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEVSUk9SX1BBR0VTOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RXJyb3JQYWdlc0ltYWdlKEVycm9yUGFnZSBlbGVtZW50KSB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRFcnJvckNvZGUoKSAhPSBudWxsKXsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAoRVhDRVBUSU9OX0VSUk9SX1BBR0VTID09IG51bGwpIHsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5HUk9VUF9FUlJPUl9QQUdFKTsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotICAgICAgICBFWENFUFRJT05fRVJST1JfUEFHRVMgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIEVYQ0VQVElPTl9FUlJPUl9QQUdFUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZWVlYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEZpbHRlciBtYXBwaW5ncyBncm91cCBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZS4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEltYWdlIEZJTFRFUl9NQVBQSU5HOwotCi0JcHVibGljIEdyb3VwRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlcihXZWJBcHAgd2ViQXBwKSB7Ci0JCXN1cGVyKHdlYkFwcCk7Ci0JCXRleHQgPSBNZXNzYWdlcy5GSUxURVJfTUFQUElOR19JVEVNX1BST1ZJREVSOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PD8+IGdldENoaWxkcmVuKCkgewotCQlpZiAoamF2YWVlICE9IG51bGwpewotCQkJcmV0dXJuICgoV2ViQXBwKSBqYXZhZWUpLmdldEZpbHRlck1hcHBpbmdzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gZ2V0RmlsdGVyTWFwcGluZ0ltYWdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRGaWx0ZXJNYXBwaW5nSW1hZ2UoKSB7Ci0JCWlmIChGSUxURVJfTUFQUElORyA9PSBudWxsKSB7Ci0JCQlVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShKRUVVSVBsdWdpbkljb25zLkdST1VQX0ZJTFRFUl9NQVBQSU5HKTsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOyAKLQkJCUZJTFRFUl9NQVBQSU5HID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIEZJTFRFUl9NQVBQSU5HOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cEZpbHRlcnNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzhmMjkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBGaWx0ZXJzIGdyb3VwIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cEZpbHRlcnNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEdyb3VwUHJvdmlkZXJ7Ci0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBGSUxURVI7Ci0KLQlwdWJsaWMgR3JvdXBGaWx0ZXJzSXRlbVByb3ZpZGVyKFdlYkFwcCB3ZWJBcHApIHsKLQkJc3VwZXIod2ViQXBwKTsKLQkJdGV4dCA9IE1lc3NhZ2VzLkZJTFRFUlNfSVRFTV9QUk9WSURFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGphdmFlZSAhPSBudWxsKXsKLQkJCXJldHVybiAoKFdlYkFwcCkgamF2YWVlKS5nZXRGaWx0ZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gZ2V0RmlsdGVyc0ltYWdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRGaWx0ZXJzSW1hZ2UoKSB7Ci0JCWlmIChGSUxURVIgPT0gbnVsbCkgewotCQkJVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5GSUxURVJfTUFQUElORyk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsgCi0JCQlGSUxURVIgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gRklMVEVSOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cExpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cExpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDMzODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBMaXN0ZW5lciBncm91cCBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZS4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlcnsKLQotCXByaXZhdGUgc3RhdGljIEltYWdlIExJU1RFTkVSOwotCi0JcHVibGljIEdyb3VwTGlzdGVuZXJJdGVtUHJvdmlkZXIoV2ViQXBwIHdlYkFwcCkgewotCQlzdXBlcih3ZWJBcHApOwotCQl0ZXh0ID0gTWVzc2FnZXMuTElTVEVORVJfSVRFTV9QUk9WSURFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGphdmFlZSAhPSBudWxsKXsKLQkJcmV0dXJuICgoV2ViQXBwKSBqYXZhZWUpLmdldExpc3RlbmVycygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldExpc3RlbmVyc0ltYWdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRMaXN0ZW5lcnNJbWFnZSgpIHsKLQkJaWYgKExJU1RFTkVSID09IG51bGwpIHsKLQkJCVVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKEpFRVVJUGx1Z2luSWNvbnMuR1JPVVBfTElTVEVORVIpOwotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotCQkJTElTVEVORVIgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkgICAgICB9Ci0JICAgICAgcmV0dXJuIExJU1RFTkVSOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBSZWZlcmVuY2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwUmVmZXJlbmNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmM2Y1NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBSZWZlcmVuY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBKTkRJIFJlZmVyZW5jZXMgZ3JvdXAgaW4gRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwUmVmZXJlbmNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgUkVGRVJFTkNFUzsKLQotICAgIHB1YmxpYyBHcm91cFJlZmVyZW5jZUl0ZW1Qcm92aWRlcihXZWJBcHAgd2ViQXBwKSB7Ci0gICAgICAgIHN1cGVyKHdlYkFwcCk7Ci0gICAgICAgIHRleHQgPSBNZXNzYWdlcy5SRUZFUkVOQ0VTOwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKGphdmFlZSAhPSBudWxsKXsKLSAgICAgICAgICByZXN1bHQuYWRkQWxsKCgoV2ViQXBwKSBqYXZhZWUpLmdldEVqYlJlZnMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRFamJMb2NhbFJlZnMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRSZXNvdXJjZVJlZnMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRSZXNvdXJjZUVudlJlZnMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRFbnZFbnRyaWVzKCkpOwotICAgICAgICAgIHJlc3VsdC5hZGRBbGwoKChXZWJBcHApIGphdmFlZSkuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKTsKLSAgICAgICAgICByZXN1bHQuYWRkQWxsKCgoV2ViQXBwKSBqYXZhZWUpLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpOwotICAgICAgICAgIHJlc3VsdC5hZGRBbGwoKChXZWJBcHApIGphdmFlZSkuZ2V0U2VydmljZVJlZnMoKSk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFJlZmVyZW5jZXNJbWFnZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRSZWZlcmVuY2VzSW1hZ2UoKSB7Ci0gICAgICAgIGlmIChSRUZFUkVOQ0VTID09IG51bGwpIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKEpFRVVJUGx1Z2luSWNvbnMuUkVTT1VSQ0VfUkVGRVJFTkNFX09CSik7Ci0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsgCi0gICAgICAgICAgICBSRUZFUkVOQ0VTID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFJFRkVSRU5DRVM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFNlcnZsZXRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwU2VydmxldEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDcyNjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwU2VydmxldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBTZXJ2bGV0cyBncm91cCBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZS4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyewotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgU0VSVkxFVDsKLQotCXB1YmxpYyBHcm91cFNlcnZsZXRJdGVtUHJvdmlkZXIoV2ViQXBwIHdlYkFwcCkgewotCQlzdXBlcih3ZWJBcHApOwotCQl0ZXh0ID0gTWVzc2FnZXMuU0VSVkxFVF9JVEVNX1BST1ZJREVSOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChqYXZhZWUgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gKChXZWJBcHApIGphdmFlZSkuZ2V0U2VydmxldHMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldFNlcnZsZXRJbWFnZSgpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRTZXJ2bGV0SW1hZ2UoKSB7Ci0JCWlmIChTRVJWTEVUID09IG51bGwpIHsKLQkJCVVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKEpFRVVJUGx1Z2luSWNvbnMuR1JPVVBfU0VSVkxFVCk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsgCi0JCQlTRVJWTEVUID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIFNFUlZMRVQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNjE2YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBTZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBTZXJ2bGV0IE1hcHBpbmdzIGdyb3VwIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyewotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgU0VSVkxFVE1BUFBJTkc7Ci0KLQlwdWJsaWMgR3JvdXBTZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlcihXZWJBcHAgd2ViQXBwKSB7Ci0JCXN1cGVyKHdlYkFwcCk7Ci0JCXRleHQgPSBNZXNzYWdlcy5TRVJWTEVUX01BUFBJTkdfSVRFTV9QUk9WSURFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGphdmFlZSAhPSBudWxsKXsKLQkJCXJldHVybiAoKFdlYkFwcCkgamF2YWVlKS5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBnZXRTZXJ2bGV0TWFwcGluZ0ltYWdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRTZXJ2bGV0TWFwcGluZ0ltYWdlKCkgewotCQlpZiAoU0VSVkxFVE1BUFBJTkcgPT0gbnVsbCkgewotCQkJVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5TRVJWTEVUX01BUFBJTkcpOwotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotCQkJU0VSVkxFVE1BUFBJTkcgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gU0VSVkxFVE1BUFBJTkc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFdlbGNvbWVQYWdlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBXZWxjb21lUGFnZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkY2MyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFdlbGNvbWVQYWdlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlbGNvbWVGaWxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBXZWxjb21lIHBhZ2VzIGdyb3VwIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cFdlbGNvbWVQYWdlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlcnsKLQotICAgIHByaXZhdGUgc3RhdGljIEltYWdlIFdFTENPTUVfUEFHRVM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZSBXRUxDT01FX1BBR0U7Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbnVsbDsKLQotICAgIHB1YmxpYyBHcm91cFdlbGNvbWVQYWdlc0l0ZW1Qcm92aWRlcihXZWJBcHAgd2ViQXBwKSB7Ci0gICAgICAgIHN1cGVyKHdlYkFwcCk7Ci0gICAgICAgIHRleHQgPSBNZXNzYWdlcy5XRUxDT01FX1BBR0VTX0lURU1fUFJPVklERVI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCl7Ci0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICAgIH0KLSAgICAgICAgaWYgKGphdmFlZSAhPSBudWxsKXsKLSAgICAgICAgICBMaXN0IHdlbGNvbWVGaWxlTGlzdHMgPSAoKFdlYkFwcCkgamF2YWVlKS5nZXRXZWxjb21lRmlsZUxpc3RzKCk7Ci0gICAgICAgICAgaWYgKHdlbGNvbWVGaWxlTGlzdHMuc2l6ZSgpPjApewotICAgICAgICAgICAgY2hpbGRyZW4gPSAgbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogd2VsY29tZUZpbGVMaXN0cykgewotICAgICAgICAgICAgICBMaXN0IHdlbGNvbWVGaWxlcyA9ICgoV2VsY29tZUZpbGVMaXN0KW9iamVjdCkuZ2V0V2VsY29tZUZpbGVzKCk7Ci0gICAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdDIgOiB3ZWxjb21lRmlsZXMpIHsKLSAgICAgICAgICAgICAgICBpZihvYmplY3QyICE9IG51bGwgJiYgISIiLmVxdWFscyggKChTdHJpbmcpb2JqZWN0MikudHJpbSgpKSl7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChuZXcgV2ViQXJ0aWZhY3ROb2RlKChTdHJpbmcpIG9iamVjdDIsIGdldFdlbGNvbWVQYWdlSW1hZ2UoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwotICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFdlbGNvbWVQYWdlc0ltYWdlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRXZWxjb21lUGFnZXNJbWFnZSgpIHsKLSAgICAgICAgaWYgKFdFTENPTUVfUEFHRVMgPT0gbnVsbCkgewotICAgICAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5HUk9VUF9XRUxDT01FX1BBR0VTKTsKLSAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOyAKLSAgICAgICAgICAgIFdFTENPTUVfUEFHRVMgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV0VMQ09NRV9QQUdFUzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRXZWxjb21lUGFnZUltYWdlKCkgewotICAgICAgaWYgKFdFTENPTUVfUEFHRSA9PSBudWxsKSB7Ci0gICAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5HUk9VUF9XRUxDT01FX1BBR0UpOwotICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOyAKLSAgICAgICAgICBXRUxDT01FX1BBR0UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBXRUxDT01FX1BBR0U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvV2ViQXBwUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL1dlYkFwcFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZThhMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvV2ViQXBwUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci0KLS8qKgotICogQ29udGVudCBhbmQgTGFiZWwgUHJvdmlkZXIgaGVscGVyIGNsYXNzIGZvciBXZWJBcHAgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHBQcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlciB7Ci0gIAotICAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9SRUxBVElWRV9QQVRIID0gIldFQi1JTkYvd2ViLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwcml2YXRlIEdyb3VwRXJyb3JQYWdlc0l0ZW1Qcm92aWRlciBlcnJvcnM7Ci0JcHJpdmF0ZSBHcm91cFNlcnZsZXRJdGVtUHJvdmlkZXIgc2VydmxldHM7Ci0JcHJpdmF0ZSBHcm91cEZpbHRlcnNJdGVtUHJvdmlkZXIgZmlsdGVyczsKLQlwcml2YXRlIEdyb3VwTGlzdGVuZXJJdGVtUHJvdmlkZXIgbGlzdGVuZXJzOwotCXByaXZhdGUgR3JvdXBTZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlciBzZXJ2bGV0TWFwcGluZzsKLQlwcml2YXRlIEdyb3VwRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlciBmaWx0ZXJNYXBwaW5nOwotCXByaXZhdGUgR3JvdXBSZWZlcmVuY2VJdGVtUHJvdmlkZXIgcmVmZXJlbmNlczsKLQlwcml2YXRlIEdyb3VwV2VsY29tZVBhZ2VzSXRlbVByb3ZpZGVyIHdlbGNvbWU7Ci0JcHJpdmF0ZSBHcm91cENvbnRleHRQYXJhbXNJdGVtUHJvdmlkZXIgY29udGV4dFBhcmFtczsKLQkKLQlwcml2YXRlIExpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JcHJpdmF0ZSBJbWFnZSBXRUJfQVBQX0lNQUdFOwotCQotCXByaXZhdGUgSVByb2plY3QgcHJqY3QgPSBudWxsOwotCXByaXZhdGUgSUZpbGUgZGRGaWxlID0gbnVsbDsKLQotCi0gIAotCi0JCi0JcHVibGljIFdlYkFwcFByb3ZpZGVyKFdlYkFwcCB3ZWJBcHAsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIod2ViQXBwKTsKLQkJdGV4dCA9IE1lc3NhZ2VzLkRFUExPWU1FTlRfREVTQ1JJUFRPUiArIHByb2plY3QuZ2V0TmFtZSgpOwotCQljb250ZXh0UGFyYW1zID0gbmV3IEdyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlcih3ZWJBcHApOwotCQllcnJvcnMgPSBuZXcgR3JvdXBFcnJvclBhZ2VzSXRlbVByb3ZpZGVyKHdlYkFwcCk7Ci0JCXNlcnZsZXRzID0gbmV3IEdyb3VwU2VydmxldEl0ZW1Qcm92aWRlcih3ZWJBcHApOwotCQlzZXJ2bGV0TWFwcGluZyA9IG5ldyBHcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyKHdlYkFwcCk7Ci0JCWZpbHRlcnMgPSBuZXcgR3JvdXBGaWx0ZXJzSXRlbVByb3ZpZGVyKHdlYkFwcCk7Ci0JCWZpbHRlck1hcHBpbmcgPSBuZXcgR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyKHdlYkFwcCk7Ci0JCWxpc3RlbmVycyA9IG5ldyBHcm91cExpc3RlbmVySXRlbVByb3ZpZGVyKHdlYkFwcCk7Ci0JCXJlZmVyZW5jZXMgPSBuZXcgR3JvdXBSZWZlcmVuY2VJdGVtUHJvdmlkZXIod2ViQXBwKTsKLQkJd2VsY29tZSA9IG5ldyBHcm91cFdlbGNvbWVQYWdlc0l0ZW1Qcm92aWRlcih3ZWJBcHApOwotCQljaGlsZHJlbi5hZGQoY29udGV4dFBhcmFtcyk7Ci0JCWNoaWxkcmVuLmFkZChlcnJvcnMpOwotCQljaGlsZHJlbi5hZGQoc2VydmxldHMpOwotCQljaGlsZHJlbi5hZGQoZmlsdGVycyk7Ci0JCWNoaWxkcmVuLmFkZChsaXN0ZW5lcnMpOwotCQljaGlsZHJlbi5hZGQoc2VydmxldE1hcHBpbmcpOwotCQljaGlsZHJlbi5hZGQoZmlsdGVyTWFwcGluZyk7Ci0JCWNoaWxkcmVuLmFkZChyZWZlcmVuY2VzKTsKLQkJY2hpbGRyZW4uYWRkKHdlbGNvbWUpOwotCQlwcmpjdCA9IHByb2plY3Q7Ci0JfQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCl7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKXsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKFdFQl9BUFBfSU1BR0UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlV2ViRGVzY3JpcHRvciA9IEpFRVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlRGVzY3JpcHRvcihKRUVVSVBsdWdpbkljb25zLklNR19XRUJFRU1PREVMKTsKLQkJCVdFQl9BUFBfSU1BR0UgPSBpbWFnZVdlYkRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gV0VCX0FQUF9JTUFHRTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpewotCQlyZXR1cm4gcHJqY3Q7Ci0JfQotCXB1YmxpYyBJRmlsZSBnZXREREZpbGUoKSB7Ci0JCWlmIChkZEZpbGUgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gZGRGaWxlOwotCQl9Ci0KLQkJSVZpcnR1YWxGb2xkZXIgdmlydHVhbEZvbGRlciA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFByb2plY3QoKSkuZ2V0Um9vdEZvbGRlcigpOwotCQlyZXR1cm4gdmlydHVhbEZvbGRlci5nZXRGaWxlKFBST0pFQ1RfUkVMQVRJVkVfUEFUSCkuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVpbml0KEphdmFFRU9iamVjdCBtb2RlbE9iamVjdCkgewotCQlzdXBlci5yZWluaXQobW9kZWxPYmplY3QpOwotCQlmb3IgKE9iamVjdCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkoKEFic3RyYWN0R3JvdXBQcm92aWRlciljaGlsZCkucmVpbml0KG1vZGVsT2JqZWN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL1dlYkFydGlmYWN0Tm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvV2ViQXJ0aWZhY3ROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODcwOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvV2ViQXJ0aWZhY3ROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogCi0gKiBXcmFwcGVyIG5vZGUgZm9yIHJlcHJlc2VudGluZyBzdHJpbmcgdmFsdWVzIG9mIHRoZSBtb2RlbCBpbiBEZXBsb3ltZW50IGRlc2NyaXB0b3IgdHJlZS4KLSAqIChlLmcuIFdlbGNvbWUgRmlsZXMpCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgV2ViQXJ0aWZhY3ROb2RlIHsKLQotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXB1YmxpYyBXZWJBcnRpZmFjdE5vZGUoU3RyaW5nIHRleHQsIEltYWdlIGltYWdlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudGV4dCA9IHRleHQ7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3BsdWdpbi9KRUVVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3BsdWdpbi9KRUVVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM4ODM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wbHVnaW4vSkVFVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEpFRVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuamVlLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEpFRVVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSkVFVUlQbHVnaW4oKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBKRUVVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlVUkwgZ2lmSW1hZ2VVUkwgPSBnZXRJbWFnZVVSTChrZXkpOwotCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVVJMIGdldEltYWdlVVJMKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0SW1hZ2VVUkwoa2V5LCBnZXRCdW5kbGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIFJlY29yZCBhIG1lc3NhZ2UgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJbG9nKGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBsdWdpbi4KLQkgKiAgCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gQSBzdGF0dXMgY29uZmlndXJlZCB3aXRoIHRoaXMgcGx1Z2luJ3MgaWQgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsCi0JCQlTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgYUNvZGUsCi0JCQkJYU1lc3NhZ2UgIT0gbnVsbCA/IGFNZXNzYWdlIDogIk5vIG1lc3NhZ2UuIiwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBzdGF0dXMgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgYVN0YXR1cykgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGFTdGF0dXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUpIHsKLQkJbG9nKElTdGF0dXMuRVJST1IsIElTdGF0dXMuRVJST1IsbWVzc2FnZSxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcGx1Z2luL0pFRVVJUGx1Z2luSWNvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wbHVnaW4vSkVFVUlQbHVnaW5JY29ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjllOTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wbHVnaW4vSkVFVUlQbHVnaW5JY29ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIEpFRVVJUGx1Z2luSWNvbnMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU1HX0VKQkVFTU9ERUwgPSAiMzBfZWpiamFyX29iaiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTUdfV0VCRUVNT0RFTCA9ICJ3ZWJhcHBfMjUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9NQVBQSU5HID0gIndlYnVpSWNvbnMvc2VydmxldF9tYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTFRFUl9NQVBQSU5HID0gIndlYnVpSWNvbnMvZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdST1VQX0ZJTFRFUl9NQVBQSU5HID0gIndlYnVpSWNvbnMvZmlsdGVyX21hcHBpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JPVVBfTElTVEVORVIgPSAid2VidWlJY29ucy9saXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUk9VUF9TRVJWTEVUID0gIndlYnVpSWNvbnMvc2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUk9VUF9FUlJPUl9QQUdFID0gIndlYnVpSWNvbnMvZXJyb3JfcGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUk9VUF9DT05URVhUX1BBUkFNID0gIndlYnVpSWNvbnMvaW5pdGlhbGl6X3BhcmFtZXRlcl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdST1VQX1dFTENPTUVfUEFHRVMgPSAid2VidWlJY29ucy93ZWxjb21lX2xpc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JPVVBfV0VMQ09NRV9QQUdFID0gIndlYnVpSWNvbnMvd2VsY29tZV9maWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX1JFRkVSRU5DRV9PQkogPSAicmVzb3VyY2VSZWZfb2JqIjsgLy8kTk9OLU5MUy0xJAotCQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVVNTSU5FU1NfTE9DQUwgPSAib3ZyL2J1c2luZXNzX2xvY2FsX292ciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVVNTSU5FU1NfUkVNT1RFID0gIm92ci9idXNpbmVzc19yZW1vdGVfb3ZyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9URSA9ICJvdnIvcmVtb3RlX292ciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVEVfSE9NRSA9ICJvdnIvaG9tZV9vdnIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTE9DQUwgPSAib3ZyL2xvY2FsX292ciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBTF9IT01FID0gIm92ci9sb2NhbF9ob21lX292ciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQVJfSU1BR0U9ImVhcl81MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBUFBfQ0xJRU5UNTA9ImFwcGNsaWVudF81MCI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvRWFySmF2YUVFRmFjZXRJbnN0YWxsUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvRWFySmF2YUVFRmFjZXRJbnN0YWxsUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2UxZmFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wcm9qZWN0L2ZhY2V0L0VhckphdmFFRUZhY2V0SW5zdGFsbFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5wcm9qZWN0LmZhY2V0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLXB1YmxpYyBjbGFzcyBFYXJKYXZhRUVGYWNldEluc3RhbGxQYWdlIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5FYXJGYWNldEluc3RhbGxQYWdlIHsKLQotCXByb3RlY3RlZCBCdXR0b24gYWRkREQ7Ci0KLQlwdWJsaWMgRWFySmF2YUVFRmFjZXRJbnN0YWxsUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNyZWF0ZUREU2VjdGlvbihjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRERTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlhZGRERCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlhZGRERC5zZXRUZXh0KE1lc3NhZ2VzLkVhckphdmFFRUZhY2V0SW5zdGFsbFBhZ2VfMCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYWRkREQsIEdFTkVSQVRFX0RELCBudWxsKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlhZGRERC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcHJvamVjdC9mYWNldC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZTA4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcHJvamVjdC9mYWNldC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qZWUudWkucHJvamVjdC5mYWNldC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFYXJKYXZhRUVGYWNldEluc3RhbGxQYWdlXzA7Ci0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wcm9qZWN0L2ZhY2V0L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODMwNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUVhckphdmFFRUZhY2V0SW5zdGFsbFBhZ2VfMD1HZW5lcmF0ZSBEZXBsb3ltZW50IERlc2NyaXB0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTZmNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImVhcnByb2plY3QiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqZWVjcmVhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxYjI3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotamF2YUNvbXBpbGVyLi4uYXJncwotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotQGRvdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmVmNWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qZWU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGQyZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSNTYXQgTm92IDEwIDAzOjI4OjQyIEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxOTdjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTYXQgTm92IDEwIDAzOjI4OjQyIEVTVCAyMDA3Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTEKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubWlzc2luZy1wYWNrYWdlcz0yCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MQotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3ODM4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmplZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTA0LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmplZS5KRUVQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAzLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuamVlLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUuY29udGVudHR5cGUsCi0gb3JnLmVjbGlwc2UuanN0LmplZS5pbnRlcm5hbC5kZXBsb3lhYmxlcywKLSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwuY29tbW9uLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2VycywKLSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk5YmRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjc4ZGUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBlYXJwcm9qZWN0LyxcCi0gICAgICAgICAgIGplZWNyZWF0aW9uLyxcCi0gICAgICAgICAgIGNvbW1vbi8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9jb21tb24vQWJzdHJhY3RBbm5vdGF0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9BYnN0cmFjdEFubm90YXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzN2QzMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9BYnN0cmFjdEFubm90YXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JbmplY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFlZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNTaGFyaW5nU2NvcGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotCi0vKioKLSAqIEBhdXRob3IgS2lyaWwgTWl0b3Ygay5taXRvdkBzYXAuY29tCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvbkZhY3RvcnkgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiB0cnVlIGlmICJ2YWx1ZSIgaXMgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNBcnJheU9mT2JqZWN0KE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gT2JqZWN0W10uY2xhc3MuaXNJbnN0YW5jZSh2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRBbm5vdGF0ZWRWYWx1ZShTdHJpbmcgbmFtZSwgSU1lbWJlclZhbHVlUGFpcltdIG1lbWJlclZhbHVlUGFpcnMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlmb3IgKElNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLQkJCWlmIChuYW1lLmVxdWFscyhwYWlyLmdldE1lbWJlck5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gcGFpci5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zSW1wb3J0KElDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIGltcG9ydHQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlmb3IgKElJbXBvcnREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IHVuaXQuZ2V0SW1wb3J0cygpKSB7Ci0JCQlpZiAoZGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoaW1wb3J0dCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIGdpdmVuIDxjb2RlPnRvUmVzb2x2ZTwvY29kZT4gc3RyaW5nIHRvIGFuIElUeXBlIGluIHRoZQotCSAqIGNvbnRleHQgb2YgPGNvZGU+ZGVjbGFyaW5nVHlwZTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZQotCSAqIEBwYXJhbSB0b1Jlc29sdmUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIHRoYXQgc2hvdWxkIGJlIHJlc29sdmVkLgotCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIHR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgc3VjaCB0eXBlIGNhbiBub3QgYmUKLQkgKiAgICAgICAgIHJlc29sdmVkLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRvUmVzb2x2ZSBpcwotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJVHlwZSByZXNvbHZlVHlwZShJVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgdG9SZXNvbHZlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRvUmVzb2x2ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ1tdW10gZnVsbFR5cGVOYW1lID0gZGVjbGFyaW5nVHlwZS5yZXNvbHZlVHlwZSh0b1Jlc29sdmUpOwotCQlpZiAoZnVsbFR5cGVOYW1lICE9IG51bGwpCi0JCQlyZXR1cm4gZGVjbGFyaW5nVHlwZS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGZ1bGxUeXBlTmFtZVswXVswXSwgZnVsbFR5cGVOYW1lWzBdWzFdKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VqYkFubm90YXRpb24oSUFubm90YXRpb24gYW5ub3RhdGlvbiwgTGlzdDxFamJMb2NhbFJlZj4gbG9jYWxSZWZzLCBJTWVtYmVyIG1lbWJlciwKLQkJCUNvbGxlY3Rpb248SVR5cGU+IGRlcGVuZGVkVHlwZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpbnQgbWVtYmVyVHlwZSA9IG1lbWJlci5nZXRFbGVtZW50VHlwZSgpOwotCQlJTWVtYmVyVmFsdWVQYWlyW10gcGFpcnMgPSBhbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKLQotCQlTdHJpbmcgYmVhbkludGVyZmFjZVZhbHVlID0gKFN0cmluZykgZ2V0QW5ub3RhdGVkVmFsdWUoImJlYW5JbnRlcmZhY2UiLCBwYWlycyk7Ci0JCWJlYW5JbnRlcmZhY2VWYWx1ZSA9IGludGVybmFsUHJvY2Vzc0luamVjdGlvbihiZWFuSW50ZXJmYWNlVmFsdWUsIG1lbWJlciwgZGVwZW5kZWRUeXBlcyk7Ci0JCWlmIChiZWFuSW50ZXJmYWNlVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvKgotCQkgKiBUaGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlIHNob3VsZCBiZSB0aGUgdmFsdWUgb2YgdGhlICJuYW1lIgotCQkgKiBhdHRyaWJ1dGUuIElmIHRoZXJlIGlzIG5vICJuYW1lIiBhdHRyaWJ1dGUgdGhlbiB0aGUgbmFtZSBvZiB0aGUKLQkJICogcmVmZXJlbmNlIGlzIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbWVtYmVyLiBDaGVjayB0aGlzIGF0Ci0JCSAqIEVudGVycHJpc2UgSmF2YSBCZWFucywgMy4wLCBTZWN0aW9uIDE0LjEuNS4zCi0JCSAqLwotCQlTdHJpbmcgcmVmTmFtZSA9IChTdHJpbmcpIGdldEFubm90YXRlZFZhbHVlKCJuYW1lIiwgcGFpcnMpOwotCQlpZiAocmVmTmFtZSA9PSBudWxsKSB7Ci0JCQlyZWZOYW1lID0gZ2V0TWVtYmVyUXVhbGlmaWVkTmFtZShtZW1iZXIpOwotCQl9Ci0JCUVqYkxvY2FsUmVmIHJlZiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVqYkxvY2FsUmVmKCk7Ci0JCXJlZi5zZXRFamJSZWZOYW1lKHJlZk5hbWUpOwotCQlsb2NhbFJlZnMuYWRkKHJlZik7Ci0JCXJlZi5zZXRMb2NhbChiZWFuSW50ZXJmYWNlVmFsdWUpOwotCQlyZWYuc2V0TG9jYWxIb21lKGJlYW5JbnRlcmZhY2VWYWx1ZSk7Ci0JCXJlZi5zZXRFamJMaW5rKChTdHJpbmcpIGdldEFubm90YXRlZFZhbHVlKCJiZWFuTmFtZSIsIHBhaXJzKSk7Ci0JCXJlZi5zZXRNYXBwZWROYW1lKChTdHJpbmcpIGdldEFubm90YXRlZFZhbHVlKCJtYXBwZWROYW1lIiwgcGFpcnMpKTsKLQkJaWYgKG1lbWJlclR5cGUgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCB8fCBtZW1iZXJUeXBlID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotCQkJY3JlYXRlSW5qZWN0aW9uVGFyZ2V0KHJlZk5hbWUsIHJlZi5nZXRJbmplY3Rpb25UYXJnZXRzKCksIGFubm90YXRpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUluamVjdGlvblRhcmdldChTdHJpbmcgcmVmTmFtZSwgTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGluamVjdGlvblRhcmdldHMsIElBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJSW5qZWN0aW9uVGFyZ2V0IGluamVjdGlvblRhcmdldCA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluamVjdGlvblRhcmdldCgpOwotCQlpbnQgaW5kZXggPSByZWZOYW1lLmluZGV4T2YoJy8nKTsKLQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQlpbmplY3Rpb25UYXJnZXQuc2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MocmVmTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKLQkJCWluamVjdGlvblRhcmdldC5zZXRJbmplY3Rpb25UYXJnZXROYW1lKHJlZk5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotCQl9IGVsc2UgewotCQkJaW5qZWN0aW9uVGFyZ2V0LnNldEluamVjdGlvblRhcmdldE5hbWUocmVmTmFtZSk7Ci0JCQlpbmplY3Rpb25UYXJnZXQuc2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MoIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpbmplY3Rpb25UYXJnZXRzLmFkZChpbmplY3Rpb25UYXJnZXQpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlIGFubm90YXRpb24gY2FuIGJlIHBsYWNlZCBvbiBjbGFzcywgbWV0aG9kLCBmaWVsZC4KLQkgKiAKLQkgKiBDaGVja3MgYXJlIG1hZGUgaWYgdGhlIHJlc291cmNlIGFubm90YXRpb24gaXMgdmFsaWQuCi0JICogPHA+Ci0JICogSWYgb24gY2xhc3MgdGhlcmUgc2hvdWxkIGJlIGEgInR5cGUiIGF0dHJpYnV0ZS4gSWYgb24gbWV0aG9kIHRoZSBtZXRob2QKLQkgKiBtdXN0IGhhdmUgb25lIHBhcmFtIHdpdGggdHlwZSB0aGF0IGlzIGFuIGludGVyZmFjZS4gSWYgb24gZmllbGQgdGhlIGZpZWxkCi0JICogdHlwZSBtdXN0IGJlIGFuIGludGVyZmFjZS4KLQkgKiAKLQkgKiBJZiB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kL2ZpZWxkIGNhbiBub3QgYmUgcmVzb2x2ZWQgdGhlIHJlc3VsdCB3aWxsCi0JICogY29udGFpbiB0aGUgdW5yZXNvbHZlZCB2YWx1ZS4KLQkgKiAKLQkgKiBJbiBjYXNlIHRoZSB0eXBlIG9mIG1ldGhvZC9maWVsZCBpcyBhcnJheSwgd2lsZGNhcmQsIHNpbXBsZSB0eXBlIHRoaXMgaXMKLQkgKiBub3QgYSBwbGFjZSBmb3IgdGhlIGFubm90YXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIEluIGNhc2Ugb2YgbWV0aG9kL2ZpZWxkIHRoZSB0eXBlIHNwZWNpZmllZCB1c2luZyB0aGUgInR5cGUiIGF0dHJpYnV0ZSBoYXMKLQkgKiBhIGhpZ2hlciBwcmlvcml0eSB0aGF0IHRoZSBtZXRob2QvZmllbGQgdHlwZS4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogT25seSByZXNvbHZlZCB0eXBlcyBhcmUgYWRkZWQgdG8gZGVwZW5kZWRUeXBlcwotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2Vzc2lvbkJlYW4KLQkgKiBAcGFyYW0gbWVtYmVyCi0JICogQHBhcmFtIGFubm90YXRpb24KLQkgKiBAcGFyYW0gZGVwZW5kZWRUeXBlcwotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1Jlc291cmNlUmVmQW5ub3RhdGlvbihJQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBMaXN0PFJlc291cmNlUmVmPiByZXNvdXJjZVJlZnMsIElNZW1iZXIgbWVtYmVyLAotCQkJQ29sbGVjdGlvbjxJVHlwZT4gZGVwZW5kZWRUeXBlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQkJSU1lbWJlclZhbHVlUGFpcltdIHBhaXJzID0gYW5ub3RhdGlvbi5nZXRNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0JCVN0cmluZyBzcGVjaWZpZWRUeXBlID0gKFN0cmluZykgZ2V0QW5ub3RhdGVkVmFsdWUoInR5cGUiLCBwYWlycyk7Ci0JCXNwZWNpZmllZFR5cGUgPSBpbnRlcm5hbFByb2Nlc3NJbmplY3Rpb24oc3BlY2lmaWVkVHlwZSwgbWVtYmVyLCBkZXBlbmRlZFR5cGVzKTsKLQkJaWYgKHNwZWNpZmllZFR5cGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHJlZk5hbWUgPSAoU3RyaW5nKSBnZXRBbm5vdGF0ZWRWYWx1ZSgibmFtZSIsIHBhaXJzKTsKLQkJaWYgKHJlZk5hbWUgPT0gbnVsbCkKLQkJCXJlZk5hbWUgPSBnZXRNZW1iZXJRdWFsaWZpZWROYW1lKG1lbWJlcik7Ci0JCVJlc291cmNlUmVmIHJlZiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlUmVmKCk7Ci0JCXJlZi5zZXRSZXNSZWZOYW1lKHJlZk5hbWUpOwotCQlyZWYuc2V0UmVzVHlwZShzcGVjaWZpZWRUeXBlKTsKLQkJcmVmLnNldE1hcHBlZE5hbWUoKFN0cmluZykgZ2V0QW5ub3RhdGVkVmFsdWUoIm1hcHBlZE5hbWUiLCBwYWlycykpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAoU3RyaW5nKSBnZXRBbm5vdGF0ZWRWYWx1ZSgiZGVzY3JpcHRpb24iLCBwYWlycyk7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlEZXNjcmlwdGlvbiBkZXNjID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKTsKLQkJCWRlc2Muc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJcmVmLmdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZWYuZ2V0RGVzY3JpcHRpb25zKCkuYWRkKGRlc2MpOwotCQl9Ci0JCWlmIChtZW1iZXIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EIHx8IG1lbWJlci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotCQkJY3JlYXRlSW5qZWN0aW9uVGFyZ2V0KHJlZk5hbWUsIHJlZi5nZXRJbmplY3Rpb25UYXJnZXRzKCksIGFubm90YXRpb24pOwotCQl9Ci0JCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGdldEFubm90YXRlZFZhbHVlKCJhdXRoZW50aWNhdGlvblR5cGUiLCBwYWlycyk7Ci0JCS8qCi0JCSAqIHRoZSBkZWZhdWx0IHZhbHVlIGlzIEF1dGhlbnRpY2F0aW9uVHlwZS5BUFBMSUNBVElPTiB3aGljaCBpcyBoYW5kbGVkCi0JCSAqIGJ5IHRoZSBFTUYuIG5vIG5lZWQgdG8gY2hlY2sgZm9yIHRoaXMgdmFsdWUKLQkJICovCi0JCWlmICgiQXV0aGVudGljYXRpb25UeXBlLkNPTlRBSU5FUiIuZXF1YWxzKHZhbHVlKSkgewotCQkJcmVmLnNldFJlc0F1dGgoUmVzQXV0aFR5cGUuQ09OVEFJTkVSX0xJVEVSQUwpOwotCQl9IGVsc2UgaWYgKCJDT05UQUlORVIiLmVxdWFscyh2YWx1ZSkKLQkJCQkmJiBjb250YWluc0ltcG9ydChtZW1iZXIuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJBdXRoZW50aWNhdGlvblR5cGUuQ09OVEFJTkVSIikpIHsKLQkJCXJlZi5zZXRSZXNBdXRoKFJlc0F1dGhUeXBlLkNPTlRBSU5FUl9MSVRFUkFMKTsKLQkJfQotCQlCb29sZWFuIHNoYXJlYWJsZSA9IChCb29sZWFuKSBnZXRBbm5vdGF0ZWRWYWx1ZSgic2hhcmVhYmxlIiwgcGFpcnMpOwotCQkvKgotCQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3Igc2hhcmFibGUgaXMgdHJ1ZS4gQ2hlY2sgYW5kIHByb2Nlc3Mgb25seQotCQkgKiB1bnNoYXJhYmxlCi0JCSAqLwotCQlpZiAoQm9vbGVhbi5GQUxTRS5lcXVhbHMoc2hhcmVhYmxlKSkKLQkJCXJlZi5zZXRSZXNTaGFyaW5nU2NvcGUoUmVzU2hhcmluZ1Njb3BlVHlwZS5VTlNIQVJFQUJMRV9MSVRFUkFMKTsKLQotCQlyZXNvdXJjZVJlZnMuYWRkKHJlZik7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1ldGhvZCBoYXMgdGhlIHRhc2sgb2YgcHJvY2Vzc2luZyB0aGUgbWVtYmVyIGFsb25nIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG1lbWJlciBhbmQgcmV0dXJuIGEgU3RyaW5nLiBUaGUgcmVzdWx0IGlzIHRvIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgdmFsdWUKLQkgKiBmb3IgdGhlIGluamVjdGlvbiBvbiB0aGlzIG1lbWJlci4gVXNhZ2UgYXJlIHRoZQotCSAqIAotCSAqIEBFSkIgYW5kCi0JICogQFJlc291cmNlIGFubm90YXRpb25zLgotCSAqIAotCSAqIDxwPgotCSAqIElmIHRoZSBzcGVjaWZpZWRUeXBlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBtZW1iZXIgaXMgb2YgdHlwZQotCSAqIElKYXZhRWxlbWVudC5UWVBFIHRoZSBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiBJZiB0aGUgdHlwZSBvZiB0aGUgbWVtYmVyIGNhbiBiZSByZXNvbHZlZCBhbmQgaXMgYW4gaW50ZXJmYWNlIHRoZSBtZXRob2QKLQkgKiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LiBIZXJlIHRoZSAidHlwZSIgb2YgdGhlIG1lbWJlciBpcyB0aGUgcmVzdWx0Ci0JICogZnJvbSB7QGxpbmsgI2dldFVucmVzb2x2ZWRUeXBlKElNZW1iZXIpfQotCSAqIDwvcD4KLQkgKiAKLQkgKiAKLQkgKiBPbmx5IGlmIHRoZSBzcGVjaWZpZWRUeXBlIGNhbiBiZSBjYWxjdWxhdGVkIGFuZCBpcyByZXNvbHZlZCBpdCBpcyBhZGRlZAotCSAqIHRvIHRoZSBkZXBlbmRlZFR5cGVzLiBJZiB0aGUgc3BlY2lmaWVkVHlwZSBjYW4gbm90IGJlIHJlc29sdmVkIG5vdGhpbmcgaXMKLQkgKiBhZGRlZCB0byBkZXBlbmRlZFR5cGVzLgotCSAqIAotCSAqIEBzZWUge0BsaW5rICNwcm9jZXNzRWpiQW5ub3RhdGlvbihJQW5ub3RhdGlvbiwgU2Vzc2lvbkJlYW4sIElNZW1iZXIsIENvbGxlY3Rpb24pfQotCSAqIEBzZWUgI3Byb2Nlc3NSZXNvdXJjZVJlZkFubm90YXRpb24oU2Vzc2lvbkJlYW4sIElNZW1iZXIsIElBbm5vdGF0aW9uLAotCSAqICAgICAgQ29sbGVjdGlvbikKLQkgKiAKLQkgKiBAcGFyYW0gc3BlY2lmaWVkVHlwZQotCSAqIEBwYXJhbSBtZW1iZXIKLQkgKiBAcGFyYW0gZGVwZW5kZWRUeXBlcwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGludGVybmFsUHJvY2Vzc0luamVjdGlvbihTdHJpbmcgc3BlY2lmaWVkVHlwZSwgSU1lbWJlciBtZW1iZXIsIENvbGxlY3Rpb248SVR5cGU+IGRlcGVuZGVkVHlwZXMpCi0JCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBtZXRob2RPckZpZWxkID0gbWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRAotCQkJCXx8IG1lbWJlci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRDsKLQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IChJVHlwZSkgKG1lbWJlci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFID8gbWVtYmVyIDogbWVtYmVyCi0JCQkJLmdldERlY2xhcmluZ1R5cGUoKSk7Ci0JCVN0cmluZyBtZW1iZXJUeXBlID0gZ2V0VW5yZXNvbHZlZFR5cGUobWVtYmVyKTsKLQkJLy8gbm90IHR5cGUgZm9yIHRoaXMgbWVtYmVyIGNhbiBiZSByZXRyaWV2ZWQuIElmIG1lbWJlciBpcyBhIG1ldGhvZCBvcgotCQkvLyBmaWVsZCB0aGlzIG1lYW5zIHRoZXJlIGlzIGFuIGVycm9yLgotCQlpZiAoZ2V0Q2xhc3NUeXBlU2lnbmF0dXJlKG1lbWJlclR5cGUpID09IG51bGwgJiYgbWV0aG9kT3JGaWVsZCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGJvdGggdHlwZSBhcmUgbnVsbC4gVGhpcyBpcyBub3QgYSB2YWxpZCBjYXNlLiBUaGlzIHdpbGwgaGFwZW4gZm9yIGEKLQkJLy8gdHlwZSB3aXRob3V0IHNwZWNpZmllZCB0eXBlLgotCQlpZiAoc3BlY2lmaWVkVHlwZSA9PSBudWxsICYmIG1lbWJlclR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUeXBlIHJlc29sdmVkVHlwZSA9IHJlc29sdmVUeXBlKGRlY2xhcmluZ1R5cGUsIG1lbWJlclR5cGUpOwotCQkvLyB3ZSB3ZXJlIGFibGUgdG8gZ2V0IGEgdHlwZSBmb3IgdGhlIHBhcmFtIG9mIGEgbWV0aG9kIG9yIHR5cGUgb2YKLQkJLy8gYSBmaWVsZC4KLQkJLy8gY2hlY2sgaWYgaXQgaXMgYW4gaW50ZXJmYWNlLiBJdCBtaWdodCBub3QgYmUgcmVzb2x2ZWQsIGJ1dCB3ZSBoYXZlIGEKLQkJLy8gdmFsdWUKLQkJLy8gZm9yIHVucmVzb2x2ZWQuCi0JCWlmIChtZXRob2RPckZpZWxkKSB7Ci0JCQkvLyBpZiB0aGUgcmVzb2x2ZWQgdHlwZSBpcyBub3QgbnVsbCBhbmQgaXQgaXMgbm90IGFuIGludGVyZmFjZSB0aGlzCi0JCQkvLyBhbm5vdGF0aW9uIGlzIG5vdCB2YWxpZAotCQkJaWYgKHJlc29sdmVkVHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlc29sdmVkVHlwZS5pc0ludGVyZmFjZSgpKQotCQkJCQltZW1iZXJUeXBlID0gcmVzb2x2ZWRUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCWVsc2UKLQkJCQkJLy8gaW52YWxpZCAtIGlmIHRoZSBtZXRob2QgaXMgd2l0aCBwYXJhbSB0aGF0IGlzIG5vdCBhbgotCQkJCQkvLyBpbnRlcmZhY2UuIE9yIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBpcyBub3QgYW4gaW50ZXJmYWNlLgotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkvLyBmcm9tIG5vdyBvbmUgdXNlIG9ubHkgdGhlIHNwZWNpZmllZCB0eXBlIGZvciB0eXBlIHJlc29sdmluZy4gSWYgdGhlcmUKLQkJLy8gaXMgbm8gc3BlY2lmaWVkIHR5cGUgdXNlIHRoZSBtZW1iZXIgdHlwZS4gVGhlIGNoZWNrIGZvciB3aGV0aGVyIHRoZXkKLQkJLy8gd2VyZSBib3RoIG51bGwgaXMgcHJldmlvdXNseSBtYWRlCi0JCUlUeXBlIHJlc29sdmVkU3BlY2lmaWVkVHlwZSA9IG51bGw7Ci0JCWlmIChzcGVjaWZpZWRUeXBlID09IG51bGwpIHsKLQkJCXNwZWNpZmllZFR5cGUgPSBtZW1iZXJUeXBlOwotCQkJcmVzb2x2ZWRTcGVjaWZpZWRUeXBlID0gcmVzb2x2ZWRUeXBlOwotCQl9IGVsc2UKLQkJCXJlc29sdmVkU3BlY2lmaWVkVHlwZSA9IHJlc29sdmVUeXBlKGRlY2xhcmluZ1R5cGUsIHNwZWNpZmllZFR5cGUpOwotCQlpZiAocmVzb2x2ZWRTcGVjaWZpZWRUeXBlICE9IG51bGwpIHsKLQkJCWlmIChyZXNvbHZlZFNwZWNpZmllZFR5cGUuaXNJbnRlcmZhY2UoKSkgewotCQkJCXNwZWNpZmllZFR5cGUgPSByZXNvbHZlZFNwZWNpZmllZFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJZGVwZW5kZWRUeXBlcy5hZGQocmVzb2x2ZWRTcGVjaWZpZWRUeXBlKTsKLQkJCX0gZWxzZQotCQkJCS8vIHdlIGhhdmUgcmVzb2x2ZWQgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBpdCBpcyBub3QgYW4KLQkJCQkvLyBpbnRlcmZhY2UuIE5vdCBhIHZhbGlkIGFubm90YXRpb24uCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHNwZWNpZmllZFR5cGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHF1YWxpZmllZCBuYW1lIGZvciB0aGlzIG1lbWJlci4gVGhlIG5hbWUgaXMgdG8gYmUKLQkgKiB1c2VkIGFzIGVqYi1yZWYtbmFtZS4KLQkgKiAKLQkgKiBJZiB0aGUgbWVtYmVyIGlzIGEgdHlwZSB0aGVuIGZ1bGx5UXVhbGlmaWVkTmFtZSBvZiB0aGUgdHlwZSBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBJZiB0aGUgbWVtYmVyIGlzIGEgPGNvZGU+ZmllbGQ8L2NvZGU+IGRlY2xhcmVkIGluIGEgPGNvZGU+dHlwZTwvY29kZT4KLQkgKiB0aGVuIHRoZSByZXN1bHQgaXMKLQkgKiA8Y29kZT50eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpICsiLyIgKyBmaWVsZC5lbGVtZW50TmFtZTwvY29kZT4KLQkgKiAKLQkgKiBJZiB0aGUgbWVtYmVyIGlzIGEgPGNvZGU+bWV0aG9kPC9jb2RlPiBkZWNsYXJlZCBpbiBhIDxjb2RlPnR5cGU8L2NvZGU+Ci0JICogYW5kIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoICJzZXQiIHRoZW46IGZvciB0eXBlIG5hbWUgPQotCSAqICJvcmcuZWNsaXBzZS5CZWFuIiBhbmQgbWV0aG9kIG5hbWUgPSAic2V0TWV0aG9kT25lKCkiIHRoZSByZXN1bHQgaXMKLQkgKiAib3JnLmVjbGlwc2UuQmVhbi9tZXRob2RPbmUiCi0JICogCi0JICogQ2hlY2sgdGhpcyBhdCBFbnRlcnByaXNlIEphdmEgQmVhbnMsIDMuMCwgU2VjdGlvbiAxNC4xLjUuMwotCSAqIAotCSAqIEBwYXJhbSBtZW1iZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWVtYmVyUXVhbGlmaWVkTmFtZShJTWVtYmVyIG1lbWJlcikgewotCQlTdHJpbmcgbWVtYmVyTmFtZSA9IG1lbWJlci5nZXRFbGVtZW50TmFtZSgpOwotCQlpbnQgZWxlbWVudFR5cGUgPSBtZW1iZXIuZ2V0RWxlbWVudFR5cGUoKTsKLQkJaWYgKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5NRVRIT0QgJiYgbWVtYmVyTmFtZS5zdGFydHNXaXRoKCJzZXQiKSkgewotCQkJY2hhciBjaCA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtZW1iZXJOYW1lLmNoYXJBdCgzKSk7Ci0JCQltZW1iZXJOYW1lID0gY2ggKyBtZW1iZXJOYW1lLnN1YnN0cmluZyg0KTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LlRZUEUgPyAoKElUeXBlKSBtZW1iZXIpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIDogbWVtYmVyLmdldERlY2xhcmluZ1R5cGUoKQotCQkJCS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKQotCQkJCSsgIi8iICsgbWVtYmVyTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGphdmFlZSB0eXBlIG9mIHRoaXMgbWVtYmVyLiBGb3IgdHlwZXMgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEZvciBtZXRob2RzIHdpdGggb25lIHBhcmFtIHJldHVybiB0aGUgamF2YSB0eXBlIG9mIHRoaXMgcGFyYW0uIEZvciBmaWVsZHMKLQkgKiByZXR1cm4gdGhlIHJldHVybiB0aGUgamF2YSB0eXBlIG9mIHRoZSBmaWVsZC4KLQkgKiAKLQkgKiBJZiB0aGUgcmVzdWx0IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhpcyBtZW1iZXIgaXMgbm90IHZhbGlkIGFuZCBhCi0JICogamF2YWVlIHR5cGUgY2FuIG5vdCBiZSByZXR1cm5lZC4gVGhpcyBtYXkgaGFwcGVuIGZvciBhIG1ldGhvZCB3aXRoIG1vcmUKLQkgKiB0aGVuIG9uZSBwYXJhbSBvciBmb3IgYSBmaWVsZCB3aXRoIGEgY2xhc3MgdHlwZSBvciBwcmltaXRpdmUgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBtZW1iZXIKLQkgKiBAcGFyYW0gbWVtYmVyVHlwZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFVucmVzb2x2ZWRUeXBlKElNZW1iZXIgbWVtYmVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaW50IG1lbWJlclR5cGUgPSBtZW1iZXIuZ2V0RWxlbWVudFR5cGUoKTsKLQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IG1lbWJlci5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCVN0cmluZyB1bnJlc29sdmVkVHlwZU5hbWUgPSBudWxsOwotCQlpZiAobWVtYmVyVHlwZSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLQkJCXVucmVzb2x2ZWRUeXBlTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZygoKElGaWVsZCkgbWVtYmVyKS5nZXRUeXBlU2lnbmF0dXJlKCkpOwotCQl9IGVsc2UgaWYgKG1lbWJlclR5cGUgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotCQkJSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgbWVtYmVyOwotCQkJaWYgKG1ldGhvZC5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKSAhPSAxKQotCQkJCXJldHVybiBudWxsOwotCQkJdW5yZXNvbHZlZFR5cGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdKTsKLQkJfSBlbHNlIGlmIChtZW1iZXJUeXBlID09IElKYXZhRWxlbWVudC5UWVBFKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB1bnJlc29sdmVkVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBzaWduYXR1cmUgZm9yIHRvUmVzb2x2ZSBvbmx5IGlmIHRvUmVzb2x2ZSBpcyBhIGNsYXNzIG9yCi0JICogaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSB0b1Jlc29sdmUKLQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRvUmVzb2x2ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBzaW1wbGUKLQkgKiAgICAgICAgIHR5cGUsIGFycmF5IHR5cGUsIHdpbGRjYXJkIHR5cGUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDbGFzc1R5cGVTaWduYXR1cmUoU3RyaW5nIHRvUmVzb2x2ZSkgewotCQlpZiAodG9SZXNvbHZlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdG9SZXNvbHZlID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUodG9SZXNvbHZlLCBmYWxzZSk7Ci0JCWlmIChTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQodG9SZXNvbHZlKSAhPSBTaWduYXR1cmUuQ0xBU1NfVFlQRV9TSUdOQVRVUkUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRvUmVzb2x2ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVjbGFyZVJvbGVzKFJlc3VsdCByZXN1bHQsIExpc3Q8U2VjdXJpdHlSb2xlUmVmPiBzZWN1cml0eVJvbGVSZWZzLCBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uLAotCQkJSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlNZW1iZXJWYWx1ZVBhaXJbXSBwYWlycyA9IGFubm90YXRpb24uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotCQlPYmplY3QgdmFsdWVzID0gZ2V0QW5ub3RhdGVkVmFsdWUoInZhbHVlIiwgcGFpcnMpOwotCQlpZiAoIWlzQXJyYXlPZk9iamVjdCh2YWx1ZXMpKQotCQkJcmV0dXJuOwotCQlmb3IgKE9iamVjdCByb2xlTmFtZSA6IChPYmplY3RbXSkgdmFsdWVzKSB7Ci0JCQlTZWN1cml0eVJvbGUgcm9sZSA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQkJcm9sZS5zZXRSb2xlTmFtZSgoU3RyaW5nKSByb2xlTmFtZSk7Ci0JCQlyZXN1bHQuZ2V0QWRkaXRpb25hbCgpLmFkZChyb2xlKTsKLQkJCVNlY3VyaXR5Um9sZVJlZiByZWYgPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eVJvbGVSZWYoKTsKLQkJCXJlZi5zZXRSb2xlTmFtZSgoU3RyaW5nKSByb2xlTmFtZSk7Ci0JCQlzZWN1cml0eVJvbGVSZWZzLmFkZChyZWYpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1Jlc291cmNlc0Fubm90YXRpb24oSUFubm90YXRpb24gYW5ub3RhdGlvbiwgTGlzdDxSZXNvdXJjZVJlZj4gcmVzb3VyY2VSZWZzLCBJVHlwZSB0eXBlLAotCQkJQ29sbGVjdGlvbjxJVHlwZT4gZGVwZW5kZWRUeXBlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlNZW1iZXJWYWx1ZVBhaXJbXSBwYWlycyA9IGFubm90YXRpb24uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotCQlpZiAoIWlzQXJyYXlPZk9iamVjdChwYWlyc1swXS5nZXRWYWx1ZSgpKSkKLQkJCXJldHVybjsKLQkJT2JqZWN0W10gdmFsdWVzID0gKE9iamVjdFtdKSBwYWlyc1swXS5nZXRWYWx1ZSgpOwotCQlmb3IgKE9iamVjdCByZXNvdXJjZUFubm90YXRpb24gOiB2YWx1ZXMpIHsKLQkJCXByb2Nlc3NSZXNvdXJjZVJlZkFubm90YXRpb24oKElBbm5vdGF0aW9uKSByZXNvdXJjZUFubm90YXRpb24sIHJlc291cmNlUmVmcywgdHlwZSwgZGVwZW5kZWRUeXBlcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUnVuQXMoSUFubm90YXRpb24gYW5ub3RhdGlvbixSdW5BcyBydW5BcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlNZW1iZXJWYWx1ZVBhaXJbXSBwYWlycyA9IGFubm90YXRpb24uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotCQlpZiAocGFpcnMubGVuZ3RoID09IDEpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGdldEFubm90YXRlZFZhbHVlKCJ2YWx1ZSIsIHBhaXJzKTsKLQkJCXJ1bkFzLnNldFJvbGVOYW1lKHZhbHVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9jb21tb24vQWJzdHJhY3RBbm5vdGF0aW9uTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9BYnN0cmFjdEFubm90YXRpb25Nb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMzdmMzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9BYnN0cmFjdEFubm90YXRpb25Nb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5KRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotCi0vKioKLSAqIEJhc2UgaW1wbGVtZW50YXRpb24gZm9yIG1vZGVsIHByb3ZpZGVycyBiYXNlZCBvbiBhbm5vdGF0aW9ucyBpbiBqYXZhIGZpbGVzLgotICogCi0gKiBMaXN0ZW5lcnMgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCB7QGxpbmsgI2FkZExpc3RlbmVyKElNb2RlbFByb3ZpZGVyTGlzdGVuZXIpfQotICogCi0gKiBAYXV0aG9yIEtpcmlsIE1pdG92IGsubWl0b3ZAc2FwLmNvbQotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25Nb2RlbFByb3ZpZGVyPFQ+IGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIsIElNb2RlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0VYVEVOU0lPTiA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRmluZCB0aGUgc2VjdXJpdHkgcm9sZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBhc3NlbWJseQotCSAqIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGFzc2VtYmx5Ci0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEgc2VjdXJpdHkgcm9sZSB3aXRoIHRoaXMgbmFtZSBjYW4gbm90IGJlCi0JICogICAgICAgICBmb3VuZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFNlY3VyaXR5Um9sZSBmaW5kUm9sZShDb2xsZWN0aW9uPFNlY3VyaXR5Um9sZT4gc2VjdXJpdHlSb2xlcywgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChTZWN1cml0eVJvbGUgcm9sZSA6IHNlY3VyaXR5Um9sZXMpIHsKLQkJCWlmIChyb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiByb2xlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBUIG1vZGVsT2JqZWN0OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPElNb2RlbFByb3ZpZGVyTGlzdGVuZXI+IGxpc3RlbmVyczsKLQotCXByaXZhdGUgTG9jayBsaXN0ZW5lcnNMb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKLQotCXByb3RlY3RlZCBJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3Q7Ci0KLQlwcml2YXRlIE1hbnlUb09uZVJlbGF0aW9uPFNlY3VyaXR5Um9sZVJlZiwgU2VjdXJpdHlSb2xlPiByb2xlc1RvUm9sZXNSZWYgPSBuZXcgTWFueVRvT25lUmVsYXRpb248U2VjdXJpdHlSb2xlUmVmLCBTZWN1cml0eVJvbGU+KCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEFubm90YXRpb25SZWFkZXIgZm9yIHRoaXMgZmFjZXRlZCBwcm9qZWN0LiBBbiBpbGxlZ2FsCi0JICogYXJndW1lbnQgaWYgYSBwcm9qZWN0IHdpdGggdmFsdWUgPGNvZGU+bnVsbDwvY29kZT4gaXMgcGFzc2VkLiBObyBsb2FkaW5nCi0JICogaXMgZG9uZSBpbiB0aGlzIGNvbnN0cnVjdG9yLiBMb2FkaW5nIHRoZSBtb2RlbCBpcyBtYWRlIG9uIGRlbWFuZCB3aGVuCi0JICogY2FsbGluZyB7QGxpbmsgI2dldE1vZGVsT2JqZWN0KCl9LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgZWpiIHByb2plY3QuIENhbiBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RBbm5vdGF0aW9uTW9kZWxQcm92aWRlcihJRmFjZXRlZFByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHByb2plY3QgYXJndW1lbnQgY2FuIG5vdCBiZSBudWxsIik7Ci0JCXRoaXMuZmFjZXRlZFByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyBUIGdldENvbmNyZXRlTW9kZWwoKSB7Ci0JCWlmIChtb2RlbE9iamVjdCA9PSBudWxsKSB7Ci0JCQlwcmVMb2FkKCk7Ci0JCQl0cnkgewotCQkJCWxvYWRNb2RlbCgpOwotCQkJCS8qCi0JCQkJICogQWRkaW5nIHRoZSByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIgYWZ0ZXIgbG9hZGluZyB0aGUgbW9kZWwuCi0JCQkJICogTm8gcmVzb3VyY2UgY2hhbmdlIGV2ZW50IGFyZSBhY2NlcHRhYmxlIHdoaWxlIGxvYWRpbmcgdGhlCi0JCQkJICogbW9kZWwuCi0JCQkJICovCi0JCQkJcG9zdExvYWQoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWxPYmplY3Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdCgpIHsKLQkJcmV0dXJuIGdldENvbmNyZXRlTW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsUGF0aCkgewotCQlyZXR1cm4gZ2V0Q29uY3JldGVNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxvYWRNb2RlbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3N0TG9hZCgpIHsKLQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWQgbGlzdGVuZXJzIHdpdGggdGhpcyBtb2RlbCBldmVudC4gSWYgdGhlCi0JICoge0BsaW5rIElNb2RlbFByb3ZpZGVyRXZlbnQjZ2V0Q2hhbmdlZFJlc291cmNlcygpfSBpcyBlbXB0eSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBtZXRob2QgcmV0dXJucyBpbW1lZGlhdGVseS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCB0aGF0IHNob3VsZCBiZSBzZW5kIHRvIHRoZSBsaXN0ZW5lcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCkgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWxpc3RlbmVyc0xvY2subG9jaygpOwotCQl0cnkgewotCQkJSU1vZGVsUHJvdmlkZXJMaXN0ZW5lcltdIGJhY2t1cCA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJTW9kZWxQcm92aWRlckxpc3RlbmVyW2xpc3RlbmVycy5zaXplKCldKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhiYWNrdXAsIGV2ZW50KTsKLQkJCWJhY2t1cCA9IG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQlsaXN0ZW5lcnNMb2NrLnVubG9jaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4gTm8gbm90aWZpY2F0aW9ucyBjYW4gb2NjdXIgd2hpbGUgY2xlYXJpbmcKLQkgKiB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyTGlzdGVuZXJzKCkgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lcnNMb2NrLmxvY2soKTsKLQkJCWxpc3RlbmVycy5jbGVhcigpOwotCQkJbGlzdGVuZXJzID0gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCWxpc3RlbmVyc0xvY2sudW5sb2NrKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIElNb2RlbFByb3ZpZGVyTGlzdGVuZXJbXSBhTGlzdGVuZXJzLCBmaW5hbCBJTW9kZWxQcm92aWRlckV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkgPT0gbnVsbCB8fCBldmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlmb3IgKGZpbmFsIElNb2RlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIgOiBhTGlzdGVuZXJzKSB7Ci0JCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQlsaXN0ZW5lci5tb2RlbHNDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJTW9kZWxQcm92aWRlckxpc3RlbmVyPiBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJTW9kZWxQcm92aWRlckxpc3RlbmVyPigpOwotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoaXMgaW5zdGFuY2UuIE5vIGxpc3RlbmVycyBjYW4gYmUgYWRkZWQgZHVyaW5nCi0JICogbm90aWZ5aW5nIHRoZSBjdXJyZW50IGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTW9kZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVyc0xvY2subG9jaygpOwotCQl0cnkgewotCQkJZ2V0TW9kZWxPYmplY3QoKTsKLQkJCWdldExpc3RlbmVycygpLmFkZChsaXN0ZW5lcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlsaXN0ZW5lcnNMb2NrLnVubG9jaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGlzIGluc3RhbmNlLiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbAotCSAqIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnNMb2NrLmxvY2soKTsKLQkJdHJ5IHsKLQkJCWdldExpc3RlbmVycygpLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlsaXN0ZW5lcnNMb2NrLnVubG9jaygpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gamF2YVByb2plY3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHByb2plY3QgY29udGFpbnMgcmVzb3VyY2VzIHRoYXQgYXJlIHJlbGF0aXZlIHRvCi0JICogICAgICAgICB0aGUgbW9kZWwuIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHRoZQotCSAqICAgICAgICAgZWpiUHJvamVjdCBvbiB3aGljaCB0aGlzIGluc3RhbmNlIGlzIHdvcmtpbmcgYSA8Y29kZT50cnVlPC9jb2RlPgotCSAqICAgICAgICAgZm9yIGl0cyBjbGllbnQgcHJvamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Byb2plY3RSZWxhdGl2ZShJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwgfHwgZmFjZXRlZFByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZSBpZiAoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmVxdWFscyhmYWNldGVkUHJvamVjdC5nZXRQcm9qZWN0KCkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIHRoZSBjdXJyZW50IGluc3RhbmNlLiBUaGUgYWN0dWFsIGRpc3Bvc2UgbWF5IG9jY3VyIGluIGFub3RoZXIKLQkgKiB0aHJlYWQuIFVzZSB7QGxpbmsgI2FkZExpc3RlbmVyKElNb2RlbFByb3ZpZGVyTGlzdGVuZXIpfSB0byByZWdpc3RlciBhCi0JICogbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGRpc3Bvc2VkLiBBZnRlciBhbGwKLQkgKiB0aGUgbGlzdGVuZXJzIGFyZSBub3RpZmllZCB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMgaXMgY2xlYXJlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJTW9kZWxQcm92aWRlckV2ZW50IG1vZGVsRXZlbnQgPSBjcmVhdGVNb2RlbFByb3ZpZGVyRXZlbnQoKTsKLQkJbW9kZWxFdmVudC5hZGRSZXNvdXJjZShmYWNldGVkUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQltb2RlbEV2ZW50LnNldEV2ZW50Q29kZShJTW9kZWxQcm92aWRlckV2ZW50LlVOTE9BREVEX1JFU09VUkNFKTsKLQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJbW9kZWxPYmplY3QgPSBudWxsOwotCQlub3RpZnlMaXN0ZW5lcnMobW9kZWxFdmVudCk7Ci0JCWNsZWFyTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyBhIHVuaXQgYXMgInJlbW92ZWQiLiBUaGUgbWV0aG9kIGlzIGFsbG93ZWQgbm90IHRvIG1ha2UgY2hlY2tzCi0JICogd2hldGhlciB0aGUgdW5pdCB3YXMgYWRkZWQvcmVtb3ZlZC9jaGFuZ2UuIEl0IGlzIHByb2Nlc3NpbmcgdGhlIHVuaXQgYXMKLQkgKiAicmVtb3ZlZCIuCi0JICogCi0JICogSWYgbm8gbW9kZWwgb2JqZWN0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGZpbGUgIm1vZGVsRXZlbnQiIGlzIG5vdCBjaGFuZ2VkLgotCSAqIAotCSAqIEBzZWUgI3Byb2Nlc3NBZGRlZENvbXBpbGF0aW9uVW5pdChJTW9kZWxQcm92aWRlckV2ZW50LCBJQ29tcGlsYXRpb25Vbml0KQotCSAqIEBwYXJhbSBtb2RlbEV2ZW50Ci0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHJlbW92ZWQuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyBwYXJzaW5nIHRoZSBmaWxlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1JlbW92ZWRDb21waWxhdGlvblVuaXQoSU1vZGVsUHJvdmlkZXJFdmVudCBtb2RlbEV2ZW50LCBJQ29tcGlsYXRpb25Vbml0IHVuaXQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFByb2Nlc3MgYSB1bml0IGFzICJhZGRlZCIuIFRoZSBtZXRob2QgaXMgYWxsb3dlZCBub3QgdG8gbWFrZSBjaGVja3MKLQkgKiB3aGV0aGVyIHRoZSB1bml0IHdhcyBhZGRlZC9yZW1vdmVkL2NoYW5nZS4gSXQgaXMgcHJvY2Vzc2luZyB0aGUgZmlsZSBhcwotCSAqICJhZGRlZCIuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIG1ha2Ugc3VyZSB0aGUKLQkgKiBwcm9jZXNzaW5nIG9mIHRoZSBmaWxlIGFzIGFkZGVkIHdpbGwgbm90IGxlYXZlIHRoZSBtb2RlbCBpbiBhIHdyb25nCi0JICogc3RhdGUuCi0JICogCi0JICogbW9kZWxFdmVudCBpcyBjaGFuZ2VkIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFkZGVkIG1vZGVsT2JqZWN0LgotCSAqIAotCSAqIEBzZWUgI3Byb2Nlc3NSZW1vdmVkQ29tcGlsYXRpb25Vbml0KElNb2RlbFByb3ZpZGVyRXZlbnQsCi0JICogICAgICBJQ29tcGlsYXRpb25Vbml0KQotCSAqIEBwYXJhbSBtb2RlbEV2ZW50Ci0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRoYXQgd2FzIGFkZGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc0FkZGVkQ29tcGlsYXRpb25Vbml0KElNb2RlbFByb3ZpZGVyRXZlbnQgbW9kZWxFdmVudCwgSUNvbXBpbGF0aW9uVW5pdCBmaWxlKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQcm9jZXNzIGEgdW5pdCBhcyAiY2hhbmdlZCIuIFRoZSBtZXRob2QgaXMgYWxsb3dlZCBub3QgdG8gbWFrZSBjaGVja3MKLQkgKiB3aGV0aGVyIHRoZSB1bml0IHdhcyBhZGRlZC9yZW1vdmVkL2NoYW5nZS4gSXQgaXMgcHJvY2Vzc2luZyB0aGUgdW5pdCBhcwotCSAqICJjaGFuZ2VkIi4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gbWFrZSBzdXJlIHRoZQotCSAqIHByb2Nlc3Npbmcgb2YgdGhlIGZpbGUgYXMgImNoYW5nZWQiIHdpbGwgbm90IGxlYXZlIHRoZSBtb2RlbCBpbiBhIHdyb25nCi0JICogc3RhdGUuCi0JICogCi0JICogQHNlZSAjcHJvY2Vzc0FkZGVkQ29tcGlsYXRpb25Vbml0KElNb2RlbFByb3ZpZGVyRXZlbnQsIElDb21waWxhdGlvblVuaXQpCi0JICogQHNlZSAjcHJvY2Vzc1JlbW92ZWRDb21waWxhdGlvblVuaXQoSU1vZGVsUHJvdmlkZXJFdmVudCwKLQkgKiAgICAgIElDb21waWxhdGlvblVuaXQpCi0JICogQHBhcmFtIG1vZGVsRXZlbnQKLQkgKiBAcGFyYW0gdW5pdAotCSAqICAgICAgICAgICAgdGhlIHVudGkgdGhhdCB3YXMgY2hhbmdlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NDaGFuZ2VkQ29tcGlsYXRpb25Vbml0KElNb2RlbFByb3ZpZGVyRXZlbnQgbW9kZWxFdmVudCwgSUNvbXBpbGF0aW9uVW5pdCBmaWxlKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgTXlNb2RlbFByb3ZpZGVyRXZlbnQgY3JlYXRlTW9kZWxQcm92aWRlckV2ZW50KCkgewotCQlyZXR1cm4gbmV3IE15TW9kZWxQcm92aWRlckV2ZW50KDAsIG51bGwsIGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tU0VDVVJJVFkgUk9MRVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29sbGVjdGlvbjxTZWN1cml0eVJvbGU+IGdldFNlY3VyaXR5Um9sZXMoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb2xsZWN0aW9uPFNlY3VyaXR5Um9sZVJlZj4gZ2V0U2VjdXJpdHlSb2xlUmVmcyhKYXZhRUVPYmplY3QgdGFyZ2V0KTsKLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGNvbm5lY3Rpb24gbWFpbnRhaW5lZCBieSB0aGUgZ2l2ZW4gYmVhbiBhbmQgdGhlIHNlY3VyaXR5Ci0JICogcm9sZXMgZGVmaW5lZCBpbiB0aGUgYmVhbi4gSWYgdGhpcyBpcyB0aGUgb25seSBiZWFuIGluIHdoaWNoIHRoZSByb2xlIGlzCi0JICogZGVmaW5lZCwgdGhlIHJvbGUgd2lsbCBhbHNvIGJlIGRlbGV0ZWQuIENhbGxpbmcgdGhpcyBtZXRob2QgbWFrZXMgc2Vuc2UKLQkgKiBvbmx5IGlmIHRoZSBiZWFuIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBhbmQgdGhlIGJlYW4gd2VyZSBjb25uZWN0ZWQgd2l0aAotCSAqIHtAbGluayAjY29ubmVjdFdpdGhSb2xlKFNlY3VyaXR5Um9sZSwgU2Vzc2lvbkJlYW4pfQotCSAqIAotCSAqIDxwPgotCSAqIElmIHRoZSBiZWFuIGlzIG5vdCBvZiB0eXBlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIHRoZQotCSAqIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlICNjb25uZWN0V2l0aFJvbGUoU2VjdXJpdHlSb2xlLCBTZXNzaW9uQmVhbikKLQkgKiBAc2VlICNyb2xlc1RvUm9sZXNSZWYKLQkgKiBAcGFyYW0gYmVhbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2Nvbm5lY3RGcm9tUm9sZXMoSmF2YUVFT2JqZWN0IHRhcmdldCkgewotCQlDb2xsZWN0aW9uPFNlY3VyaXR5Um9sZT4gcm9sZXMgPSBnZXRTZWN1cml0eVJvbGVzKCk7Ci0JCWlmIChyb2xlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDb2xsZWN0aW9uPFNlY3VyaXR5Um9sZVJlZj4gcmVmcyA9IGdldFNlY3VyaXR5Um9sZVJlZnModGFyZ2V0KTsKLQkJaWYgKHJlZnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChTZWN1cml0eVJvbGVSZWYgcmVmIDogcmVmcykgewotCQkJU2VjdXJpdHlSb2xlIHJvbGUgPSByb2xlc1RvUm9sZXNSZWYuZ2V0VGFyZ2V0KHJlZik7Ci0JCQlyb2xlc1RvUm9sZXNSZWYuZGlzY29ubmVjdFNvdXJjZShyZWYpOwotCQkJaWYgKCFyb2xlc1RvUm9sZXNSZWYuY29udGFpbnNUYXJnZXQocm9sZSkpIHsKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkucmVtb3ZlKHJvbGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBzZWN1cml0eSByb2xlIHdhcyBmb3VuZCBpbiB0aGUgZ2l2ZW4gZmlsZS4gQWRkIHRoaXMgc2VjdXJpdHkgcm9sZSB0bwotCSAqIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yLiBJZiB0aGUgZWpiSmFyIGRvZXMgbm90IGhhdmUgYW4gYXNzZW1ibHkKLQkgKiBkZXNjcmlwdG9yIGEgbmV3IG9uZSBpcyBjcmVhdGVkLgotCSAqIAotCSAqIEBzZWUgI2Nvbm5lY3RSb2xlV2l0aEJlYW4oU2VjdXJpdHlSb2xlLCBTZXNzaW9uQmVhbilzCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gc2VjdXJpdHlSb2xlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VjdXJpdHlSb2xlRm91bmQoSmF2YUVFT2JqZWN0IG9iamVjdCwgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZSkgewotCQljb25uZWN0V2l0aFJvbGUoc2VjdXJpdHlSb2xlLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEEgc2VjdXJpdHkgcm9sZSBjYW4gYmUgZGVmaW5lZCBpbiBtb3JlIHRoZSBvbmUgYmVhbi4gQSBiZWFuIGNhbiBkZWZpbmUKLQkgKiBtb3JlIHRoZW4gb25lIHNlY3VyaXR5IHJvbGUuIFRoaXMgbWVhbnMgd2UgaGF2ZSBhIG1hbnktdG8tbWFueSByZWxhdGlvbgotCSAqIGJldHdlZW4gc2Vzc2lvbkJlYW5zIGFuZCBzZWN1cml0eVJvbGVzLgotCSAqIAotCSAqIDxwPgotCSAqIEx1Y2tpbHkgYSBzZXNzaW9uQmVhbiBjb250YWlucyBhIGxpc3Qgb2Ygc2VjdXJpdHlSb2xlUmVmcy4gVGhpcyBtZXRob2QKLQkgKiBjcmVhdGVzIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBzZWN1cml0eVJvbGUgY29udGFpbmVkIGluIHRoZSBhc3NlbWJseQotCSAqIGRlc2NyaXB0b3IgYW5kIHRoZSBzZWN1cml0eSByb2xlIHJlZiBjb250YWluZWQgaW4gdGhlIGJlYW4uCi0JICogCi0JICogSWYgYSBzZWN1cml0eSByb2xlIGlzIGRlZmluZSBvbmx5IGluIG9uZSBiZWFuLCBkZWxldGluZyB0aGUgYmVhbiBtZWFucwotCSAqIGRlbGV0aW5nIHRoZSBzZWN1cml0eSByb2xlLiBCdXQgaWYgdGhlIHNlY3VyaXR5IHJvbGUgaXMgZGVmaW5lZCBpbiB0d28KLQkgKiBiZWFucyBvbmx5IGRlbGV0aW5nIGJvdGggYmVhbnMgd2lsbCByZXN1bHQgaW4gZGVsZXRpbmcgdGhlIHNlY3VyaXR5IHJvbGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI2Rpc2Nvbm5lY3RGcm9tUm9sZXMoSmF2YUVFT2JqZWN0KQotCSAqIEBzZWUgI3JvbGVzVG9Sb2xlc1JlZgotCSAqIEBwYXJhbSBzZWN1cml0eVJvbGUKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbm5lY3RXaXRoUm9sZShTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlLCBKYXZhRUVPYmplY3QgdGFyZ2V0KSB7Ci0JCUNvbGxlY3Rpb248U2VjdXJpdHlSb2xlPiByb2xlcyA9IGdldFNlY3VyaXR5Um9sZXMoKTsKLQkJaWYgKHJvbGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNvbGxlY3Rpb248U2VjdXJpdHlSb2xlUmVmPiByZWZzID0gZ2V0U2VjdXJpdHlSb2xlUmVmcyh0YXJnZXQpOwotCQlpZiAocmVmcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvKgotCQkgKiBJZiB0aGVyZSBpcyBhIHNlY3VyaXR5IHJvbGUgd2l0aCB0aGlzIG5hbWUgdXNlIHRoZSBleGlzdGluZyBzZWN1cml0eQotCQkgKiByb2xlLgotCQkgKi8KLQkJU2VjdXJpdHlSb2xlIHJvbGUgPSBmaW5kUm9sZShyb2xlcywgc2VjdXJpdHlSb2xlLmdldFJvbGVOYW1lKCkpOwotCQlpZiAocm9sZSA9PSBudWxsKSB7Ci0JCQlyb2xlcy5hZGQoc2VjdXJpdHlSb2xlKTsKLQkJCXJvbGUgPSBzZWN1cml0eVJvbGU7Ci0JCX0KLQkJZm9yIChTZWN1cml0eVJvbGVSZWYgcmVmIDogcmVmcykgewotCQkJaWYgKHJlZi5nZXRSb2xlTmFtZSgpLmVxdWFscyhyb2xlLmdldFJvbGVOYW1lKCkpKQotCQkJCXJvbGVzVG9Sb2xlc1JlZi5jb25uZWN0KHJlZiwgcm9sZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChmaW5hbCBFbGVtZW50Q2hhbmdlZEV2ZW50IGphdmFFdmVudCkgewotCQlpZiAoamF2YUV2ZW50LmdldFR5cGUoKSA9PSBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfUkVDT05DSUxFKQotCQkJaW50ZXJuYWxQb3N0UmVjb25jaWxlKGphdmFFdmVudCk7Ci0JCWVsc2UgaWYgKGphdmFFdmVudC5nZXRUeXBlKCkgPT0gRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSkKLQkJCWludGVybmFsUG9zdENoYW5nZShqYXZhRXZlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFBvc3RDaGFuZ2UoRWxlbWVudENoYW5nZWRFdmVudCBqYXZhRXZlbnQpIHsKLQkJSU1vZGVsUHJvdmlkZXJFdmVudCBtb2RlbEV2ZW50ID0gY3JlYXRlTW9kZWxQcm92aWRlckV2ZW50KCk7Ci0JCS8vIGhhbmRsZXMgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSAtIHRoZSBjYXNlIHdoZW4gdGhlCi0JCS8vIGNvbXBpbGF0aW9uIHVuaXQgaGFzIGJlZW4gY2hhbmdlZAotCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkIDogamF2YUV2ZW50LmdldERlbHRhKCkuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQkJcHJvY2Vzc0NoYW5nZWRQcm9qZWN0KG1vZGVsRXZlbnQsIGNoaWxkKTsKLQkJCQlub3RpZnlMaXN0ZW5lcnMobW9kZWxFdmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxQb3N0UmVjb25jaWxlKGZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgamF2YUV2ZW50KSB7Ci0JCUlNb2RlbFByb3ZpZGVyRXZlbnQgbW9kZWxFdmVudCA9IGNyZWF0ZU1vZGVsUHJvdmlkZXJFdmVudCgpOwotCQlpZiAoamF2YUV2ZW50LmdldERlbHRhKCkuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotCQkJcmVjdXJzZXZpbHlQcm9jZXNzQ29tcGlsYXRpb25Vbml0cyhtb2RlbEV2ZW50LCBqYXZhRXZlbnQuZ2V0RGVsdGEoKSk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMobW9kZWxFdmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hhbmdlZFByb2plY3QoSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCwgSUphdmFFbGVtZW50RGVsdGEgcHJvamVjdERlbHRhKSB7Ci0JCWlmICghaXNQcm9qZWN0UmVsYXRpdmUocHJvamVjdERlbHRhLmdldEVsZW1lbnQoKS5nZXRKYXZhUHJvamVjdCgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFzc2VydC5pc1RydWUocHJvamVjdERlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCwKLQkJCQkiQW4gaW52YWxpZCBjaGFuZ2Ugbm90aWZpY2F0aW9uIGhhcyBvY2N1cmVkLiBFbGVtZW50IGlzIDwiICsgcHJvamVjdERlbHRhLmdldEVsZW1lbnQoKSArICI+Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWlmICgoKHByb2plY3REZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9PUEVORUQpICE9IDApCi0JCQkJfHwgcHJvamVjdERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCkgewotCQkJdHJ5IHsKLQkJCQlsb2FkTW9kZWwoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUpFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpbklEKCksIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKChwcm9qZWN0RGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xPU0VEKSAhPSAwKQotCQkJCXx8IHByb2plY3REZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCkgewotCQkJZGlzcG9zZSgpOwotCQl9Ci0KLQkJcHJvY2Vzc0NoYW5nZWRQcm9qZWN0Q2hpbGRyZW4oZXZlbnQsIHByb2plY3REZWx0YSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NoYW5nZWRQcm9qZWN0Q2hpbGRyZW4oSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCwgSUphdmFFbGVtZW50RGVsdGEgcHJvamVjdERlbHRhKSB7Ci0JCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGREZWx0YSA6IHByb2plY3REZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCWlmICghKGNoaWxkRGVsdGEuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoKGNoaWxkRGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pICE9IDApIHsKLQkJCQlyZWN1cnNldmlseVByb2Nlc3NQYWNrYWdlcyhldmVudCwgY2hpbGREZWx0YSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWN1cnNldmlseVByb2Nlc3NQYWNrYWdlcyhJTW9kZWxQcm92aWRlckV2ZW50IG1vZGVsRXZlbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChkZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQl0cnkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnQgZnJhZ21lbnQgPSAoSVBhY2thZ2VGcmFnbWVudCkgZGVsdGEuZ2V0RWxlbWVudCgpOwotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpIHsKLQkJCQkJZm9yIChJQ29tcGlsYXRpb25Vbml0IHVuaXQgOiBmcmFnbWVudC5nZXRDb21waWxhdGlvblVuaXRzKCkpIHsKLQkJCQkJCXByb2Nlc3NBZGRlZENvbXBpbGF0aW9uVW5pdChtb2RlbEV2ZW50LCB1bml0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQpIHsKLQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCQlwcm9jZXNzUmVtb3ZlZFBhY2thZ2UobW9kZWxFdmVudCwgZGVsdGEpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCkgewotCQkJCQlyZWN1cnNldmlseVByb2Nlc3NDb21waWxhdGlvblVuaXRzKG1vZGVsRXZlbnQsIGRlbHRhKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlKRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZygKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5JRCgpLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKSB7Ci0JCQkJcmVjdXJzZXZpbHlQcm9jZXNzUGFja2FnZXMobW9kZWxFdmVudCwgY2hpbGREZWx0YSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzUmVtb3ZlZFBhY2thZ2UoSU1vZGVsUHJvdmlkZXJFdmVudCBtb2RlbEV2ZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgcmVjdXJzZXZpbHlQcm9jZXNzQ29tcGlsYXRpb25Vbml0cyhJTW9kZWxQcm92aWRlckV2ZW50IG1vZGVsRXZlbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChkZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQlpZiAoIWlzUHJvamVjdFJlbGF0aXZlKGRlbHRhLmdldEVsZW1lbnQoKS5nZXRKYXZhUHJvamVjdCgpKSkKLQkJCQlyZXR1cm47Ci0JCQl0cnkgewotCQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0KLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKSB7Ci0JCQkJCXByb2Nlc3NBZGRlZENvbXBpbGF0aW9uVW5pdChtb2RlbEV2ZW50LCB1bml0KTsKLQkJCQl9Ci0JCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCXByb2Nlc3NSZW1vdmVkQ29tcGlsYXRpb25Vbml0KG1vZGVsRXZlbnQsIHVuaXQpOwotCQkJCX0KLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQpIHsKLQkJCQkJaWYgKCgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9SRVNPVVJDRSkgPT0gMCkKLQkJCQkJCQl8fCAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1BSSU1BUllfV09SS0lOR19DT1BZKSA9PSAwKSkgewotCQkJCQkJcHJvY2Vzc0NoYW5nZWRDb21waWxhdGlvblVuaXQobW9kZWxFdmVudCwgdW5pdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlKRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZygKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5JRCgpLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKSB7Ci0JCQkJcmVjdXJzZXZpbHlQcm9jZXNzQ29tcGlsYXRpb25Vbml0cyhtb2RlbEV2ZW50LCBjaGlsZERlbHRhKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZpc2l0SmF2YUZpbGVzKGZpbmFsIENvbGxlY3Rpb248SUNvbXBpbGF0aW9uVW5pdD4gamF2YUZpbGVzLCBmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCByb290KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocm9vdC5nZXRLaW5kKCkgIT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpCi0JCQlyZXR1cm47Ci0JCXJvb3QuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkuYWNjZXB0KG5ldyBJUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJaWYgKHByb3h5LmdldE5hbWUoKS5lbmRzV2l0aCgiLiIgKyBKQVZBX0VYVEVOU0lPTikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCQlpZiAoIXJvb3QuZ2V0SmF2YVByb2plY3QoKS5pc09uQ2xhc3NwYXRoKGZpbGUpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCWlmICghZmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfT05FKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQlqYXZhRmlsZXMuYWRkKEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0sIElDb250YWluZXIuTk9ORSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL0Fic3RyYWN0TWVyZ2VkTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9BYnN0cmFjdE1lcmdlZE1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmMzU1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL0Fic3RyYWN0TWVyZ2VkTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLkpFRVBsdWdpbjsKLQotLyoqCi0gKiBBIGJhc2UgY2xhc3MgZm9yIG1vZGVsIHByb3ZpZGVycyBwcm92aWRpbmcgYSBtZXJnZWQgdmlldyBiZXR3ZWVuIHR3bwotICogZGlmZmVyZW50IG1vZGVsIHByb3ZpZGVycy4gVGhlIGluc3RhbmNlIHdpbGwgYmUgY2FsbGVkICJtZXJnZWRNb2RlbFByb3ZpZGVyIgotICogd2hlcmUgdGhlIHR3byBjb21wb3NlZCBwcm92aWRlcnMgd2lsbCBiZSBjYWxsZWQgImludGVybmFsUHJvdmlkZXJzIgotICogCi0gKiBUaGlzIGNsYXNzIGludHJvZHVjZXMgdGhlIG5vdGF0aW9uIG9mIGEgZGlzcG9zZWQgc3RhdGUuIHtAbGluayAjZGlzcG9zZSgpfSBpcwotICogdXNlZCB0byBkaXNwb3NlIHRoZSBtb2RlbCBwcm92aWRlci4ge0BsaW5rICNpc0Rpc3Bvc2VkKCl9IGlzIHVzZWQgdG8gZ2V0IHRoZQotICogc3RhdGUgb2YgdGhlIHByb3ZpZGVyLiBJZiB0aGUgbWV0aG9kIHtAbGluayAjZ2V0TW9kZWxPYmplY3QoKX0gaXMgY2FsbGVkIGZvcgotICogYSBtb2RlbCBwcm92aWRlciBpbiBhIGRpc3Bvc2VkIHN0YXRlLCB0aGUgcHJvdmlkZXIgc2hvdWxkIHRyeSB0byBtb3ZlIHRvIGEKLSAqIG5vbiBkaXNwb3NlZCBzdGF0ZSBhbmQgcmV0dXJuIGEgY29ycmVjdCBtb2RlbCBvYmplY3QuCi0gKiB7QGxpbmsgI2dldE1vZGVsT2JqZWN0KCl9IGlzIGxvYWRpbmcgdGhlIG1vZGVsLiBTcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gKiB0aHJvdyBleGNlcHRpb25zIHNvIGNhbGxpbmcge0BsaW5rICNnZXRNb2RlbE9iamVjdCgpfSBvbiBhIGRpc3Bvc2VkIHByb3ZpZGVyCi0gKiBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCBjYWxsaW5nIHtAbGluayAjaXNEaXNwb3NlZCgpfSBhZnRlciB0aGF0IHdpbGwgcmV0dXJuCi0gKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0gKiAKLSAqIDxwPgotICogU3ViY2xhc3NlcyBtYXkgZW5hYmxlL2Rpc2FibGUgbm90aWZpY2F0aW9ucyBmcm9tIGludGVybmFsUHJvdmlkZXJzIHdpdGggdGhlCi0gKiBtZXRob2RzIHtAbGluayAjZW5hYmxlSW50ZXJuYWxOb3RpZmljYXRpb25zKCl9IGFuZAotICoge0BsaW5rICNkaXNhYmxlSW50ZXJuYWxOb3RpZmljYXRpb25zKCl9LgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIGludGVybmFsUHJvdmlkZXJzIGFyZSBsb2FkZWQgd2l0aCB7QGxpbmsgI2xvYWREZXBsb3ltZW50RGVzY3JpcHRvck1vZGVsKCl9Ci0gKiBhbmQge0BsaW5rICNsb2FkQW5ub3RhdGlvbk1vZGVsKE9iamVjdCl9LiBUaGlzIG1ldGhvZHMgc2hvdWxkIGJlIG92ZXJyaWRlIHRvCi0gKiBwcm92aWRlIHNwZWNpZmljIG1vZGVsIHByb3ZpZGVycy4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBUaGUgbWVyZ2VkTW9kZWxQcm92aWRlciBpcyBhIGxpc3RlbmVyIHRvIHRoZSBpbnRlcm5hbFByb3ZpZGVycy4gQWZ0ZXIKLSAqIGRpc3Bvc2luZyB0aGUgaW5zdGFuY2Ugb2YgYSBtZXJnZWRNb2RlbFByb3ZpZGVyIGl0IHNob3VsZCBubyBsb25nZXIgYWNjZXB0Ci0gKiBub3RpZmljYXRpb25zIGZyb20gdGhlIGludGVybmFsUHJvdmlkZXJzLiBJdCBzaG91bGQgYWxzbyBwcm9wZXJseSAiZGlzcG9zZSIKLSAqIHRoZSBpbnRlcm5hbFByb3ZpZGVycyBpZiBuZWVkZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgS2lyaWwgTWl0b3Ygay5taXRvdkBzYXAuY29tCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWVyZ2VkTW9kZWxQcm92aWRlcjxUPiBpbXBsZW1lbnRzIElNb2RlbFByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBJTW9kZWxQcm92aWRlciBkZFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIElNb2RlbFByb3ZpZGVyIGFubm90YXRpb25Nb2RlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBjbGFzcyBBbm5vdGF0aW9uTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbFByb3ZpZGVyTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb2RlbHNDaGFuZ2VkKElNb2RlbFByb3ZpZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChpc0Rpc3Bvc2VkKCkgfHwgbWVyZ2VkTW9kZWwgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoc2hvdWxkRGlzcG9zZShldmVudCkpIHsKLQkJCQlkaXNwb3NlKCk7Ci0JCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlBYnN0cmFjdE1lcmdlZE1vZGVsUHJvdmlkZXIudGhpcy5hbm5vdGF0aW9uTW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgWG1sTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbFByb3ZpZGVyTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb2RlbHNDaGFuZ2VkKElNb2RlbFByb3ZpZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChpc0Rpc3Bvc2VkKCkgfHwgbWVyZ2VkTW9kZWwgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoc2hvdWxkRGlzcG9zZShldmVudCkpIHsKLQkJCQltZXJnZWRNb2RlbCA9IG51bGw7Ci0JCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlBYnN0cmFjdE1lcmdlZE1vZGVsUHJvdmlkZXIudGhpcy54bWxNb2RlbENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPElNb2RlbFByb3ZpZGVyTGlzdGVuZXI+IGxpc3RlbmVyczsKLQotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uTW9kZWxMaXN0ZW5lciBhbm5vdGF0aW9uTW9kZWxMaXN0ZW5lcjsKLQlwcml2YXRlIFhtbE1vZGVsTGlzdGVuZXIgeG1sTW9kZWxMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBUIG1lcmdlZE1vZGVsOwotCi0JcHVibGljIEFic3RyYWN0TWVyZ2VkTW9kZWxQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRMaXN0ZW5lcnMoKS5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGVsIG1lcmdlZCBmcm9tIGFubm90YXRpb24gYW5kIHhtbCBtb2RlbC4gSWYgdGhlIHByb2plY3QgaXMKLQkgKiBjbG9zZWQgb3IgZG9lcyBub3QgZXhpc3QgdGhlIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyI2dldE1vZGVsT2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KCkgewotCQlyZXR1cm4gZ2V0TWVyZ2VkTW9kZWwoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyI21vZGlmeShqYXZhLmxhbmcuUnVubmFibGUsCi0JICogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeShSdW5uYWJsZSBydW5uYWJsZSwgSVBhdGggbW9kZWxQYXRoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRMaXN0ZW5lcnMoKS5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUKLQkgKiBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlciN2YWxpZGF0ZUVkaXQob3JnLmVjbGlwc2UuY29yZQotCSAqIC5ydW50aW1lLklQYXRoLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChJUGF0aCBtb2RlbFBhdGgsIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmIChkZFByb3ZpZGVyID09IG51bGwpCi0JCQlnZXRNb2RlbE9iamVjdCgpOwotCQlyZXR1cm4gZGRQcm92aWRlci52YWxpZGF0ZUVkaXQobW9kZWxQYXRoLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgYW5ub3RhdGlvbk1vZGVsIGhhcyBjaGFuZ2VkLiBTZWUgYWxzbwotCSAqIHtAbGluayAjZW5hYmxlSW50ZXJuYWxOb3RpZmljYXRpb25zKCl9IGFuZAotCSAqIHtAbGluayAjZGlzYWJsZUludGVybmFsTm90aWZpY2F0aW9ucygpfQotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFubm90YXRpb25Nb2RlbENoYW5nZWQoSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgeG1sTW9kZWwgaGFzIGNoYW5nZWQuIFNlZSBhbHNvCi0JICoge0BsaW5rICNlbmFibGVJbnRlcm5hbE5vdGlmaWNhdGlvbnMoKX0gYW5kCi0JICoge0BsaW5rICNkaXNhYmxlSW50ZXJuYWxOb3RpZmljYXRpb25zKCl9Ci0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgeG1sTW9kZWxDaGFuZ2VkKElNb2RlbFByb3ZpZGVyRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbWVyZ2VkIHZpZXcgb2YgdGhlIHR3byBwYXNzZWQgbW9kZWxzLgotCSAqIAotCSAqIEBwYXJhbSBkZE1vZGVsCi0JICogQHBhcmFtIGFubm90YXRpb25zTW9kZWwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFQgbWVyZ2UoVCBkZE1vZGVsLCBUIGFubm90YXRpb25zTW9kZWwpOwotCi0JLyoqCi0JICogTG9hZCB0aGUgYW5ub3RhdGlvbiBtb2RlbCBpbiB0aGUgY29udGV4dCBvZiB0aGUgZGRNb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gZGRNb2RlbAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSU1vZGVsUHJvdmlkZXIgbG9hZEFubm90YXRpb25Nb2RlbChUIGRkTW9kZWwpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJTW9kZWxQcm92aWRlciBsb2FkRGVwbG95bWVudERlc2NyaXB0b3JNb2RlbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SU1vZGVsUHJvdmlkZXJMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElNb2RlbFByb3ZpZGVyTGlzdGVuZXI+KCk7Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0JcHJvdGVjdGVkIFQgZ2V0TWVyZ2VkTW9kZWwoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobWVyZ2VkTW9kZWwgPT0gbnVsbCkKLQkJCQltZXJnZWRNb2RlbCA9IGxvYWRNb2RlbCgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUpFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG1lcmdlZE1vZGVsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYSBtZXJnZWQgdmlldyBvZiB0aGUgbW9kZWxzIGZyb20gdGhlIGludGVybmFsUHJvdmlkZXJzLiBUaGlzIG1heQotCSAqICAgICAgICAgaW5jbHVkZSBsb2FkaW5nIHRoZSBpbnRlcm5hbFByb3ZpZGVycy4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgVCBsb2FkTW9kZWwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpID09IGZhbHNlKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIHByb2plY3QgPCIgKyBwcm9qZWN0ICsgIj4gaXMgbm90IGFjY2Vzc2libGUuIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWlmIChkZFByb3ZpZGVyID09IG51bGwpCi0JCQlkZFByb3ZpZGVyID0gbG9hZERlcGxveW1lbnREZXNjcmlwdG9yTW9kZWwoKTsKLQkJaWYgKGRkUHJvdmlkZXIgPT0gbnVsbCB8fCBkZFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoYW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWFubm90YXRpb25Nb2RlbFByb3ZpZGVyID0gbG9hZEFubm90YXRpb25Nb2RlbCgoVCkgZGRQcm92aWRlci5nZXRNb2RlbE9iamVjdCgpKTsKLQkJaWYgKGFubm90YXRpb25Nb2RlbFByb3ZpZGVyID09IG51bGwgfHwgYW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVQgZGRNb2RlbCA9IChUKSBkZFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JCVQgYW5ub3RhdGlvbk1vZGVsID0gKFQpIGFubm90YXRpb25Nb2RlbFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JCW1lcmdlZE1vZGVsID0gY3JlYXRlTmV3TW9kZWxJbnN0YW5jZSgpOwotCQlpbml0TWVyZ2VkTW9kZWxSZXNvdXJjZSgoRU9iamVjdCkgZGRNb2RlbCk7Ci0KLQkJZW5hYmxlSW50ZXJuYWxOb3RpZmljYXRpb25zKCk7Ci0JCXJldHVybiBtZXJnZShkZE1vZGVsLCBhbm5vdGF0aW9uTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBtZXJnZWRNb2RlbAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVCBjcmVhdGVOZXdNb2RlbEluc3RhbmNlKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TWVyZ2VkTW9kZWxSZXNvdXJjZShFT2JqZWN0IGRkTW9kZWwpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2VERCA9IGRkTW9kZWwuZVJlc291cmNlKCk7Ci0JCVJlc291cmNlIHJlc291cmNlTU0gPSAoKEVPYmplY3QpIG1lcmdlZE1vZGVsKS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlREQgIT0gbnVsbCAmJiByZXNvdXJjZU1NID09IG51bGwpIHsKLQkJCVJlc291cmNlSW1wbCByZXNSZXMgPSBuZXcgUmVzb3VyY2VJbXBsKHJlc291cmNlREQuZ2V0VVJJKCkpOwotCQkJcmVzUmVzLmdldENvbnRlbnRzKCkuYWRkKChFT2JqZWN0KSBtZXJnZWRNb2RlbCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoZSBtZXRob2QgaXMgdXNlZCBmb3IgZW5hYmxpbmcgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBpbnRlcm5hbFByb3ZpZGVycy4KLQkgKiBUaGlzIHdpbGwgYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgaW50ZXJuYWxQcm92aWRlcnMgc28gdGhhdAotCSAqIHtAbGluayAjYW5ub3RhdGlvbk1vZGVsQ2hhbmdlZChJTW9kZWxQcm92aWRlckV2ZW50KX0gYW5kCi0JICoge0BsaW5rICN4bWxNb2RlbENoYW5nZWQoSU1vZGVsUHJvdmlkZXJFdmVudCl9IGFyZSBjYWxsZWQgd2hlbiBuZWVkZWQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5hYmxlSW50ZXJuYWxOb3RpZmljYXRpb25zKCkgewotCQl4bWxNb2RlbExpc3RlbmVyID0gbmV3IFhtbE1vZGVsTGlzdGVuZXIoKTsKLQkJZGRQcm92aWRlci5hZGRMaXN0ZW5lcih4bWxNb2RlbExpc3RlbmVyKTsKLQkJYW5ub3RhdGlvbk1vZGVsTGlzdGVuZXIgPSBuZXcgQW5ub3RhdGlvbk1vZGVsTGlzdGVuZXIoKTsKLQkJYW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIuYWRkTGlzdGVuZXIoYW5ub3RhdGlvbk1vZGVsTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIERpc2FibGUgbm90aWZpY2F0aW9ucyBmcm9tIGludGVybmFsUHJvdmlkZXJzLiBTZWUgYWxzbwotCSAqIHtAbGluayAjZW5hYmxlSW50ZXJuYWxOb3RpZmljYXRpb25zKCl9Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZGlzYWJsZUludGVybmFsTm90aWZpY2F0aW9ucygpIHsKLQkJZGRQcm92aWRlci5yZW1vdmVMaXN0ZW5lcih4bWxNb2RlbExpc3RlbmVyKTsKLQkJYW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIoYW5ub3RhdGlvbk1vZGVsTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhmaW5hbCBJTW9kZWxQcm92aWRlckV2ZW50IGV2ZW50KSB7Ci0JCWV2ZW50LnNldE1vZGVsKHRoaXMpOwotCQlldmVudC5zZXRQcm9qZWN0KHByb2plY3QpOwotCQlmaW5hbCBDb2xsZWN0aW9uPElNb2RlbFByb3ZpZGVyTGlzdGVuZXI+IGxpc3RlbmVycyA9IGdldExpc3RlbmVycygpOwotCQlJTW9kZWxQcm92aWRlckxpc3RlbmVyW10gYmFja3VwID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElNb2RlbFByb3ZpZGVyTGlzdGVuZXJbbGlzdGVuZXJzLnNpemUoKV0pOwotCQlmb3IgKGZpbmFsIElNb2RlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIgOiBiYWNrdXApIHsKLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCWxpc3RlbmVyLm1vZGVsc0NoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWJhY2t1cCA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGlzcG9zZShJTW9kZWxQcm92aWRlckV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoZXZlbnQuZ2V0RXZlbnRDb2RlKCkgPT0gSU1vZGVsUHJvdmlkZXJFdmVudC5VTkxPQURFRF9SRVNPVVJDRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcG9zZSBzdGF0ZSBvZiB0aGlzIG1vZGVsIHByb3ZpZGVyLiBXaGVuIHRoZSBwcm92aWRlciBpcwotCSAqIGRpc3Bvc2VkIGl0IGNhbiBub3QgYmUgdXNlZCB1bnRpbCBnZXRNb2RlbE9iamVjdCBpcyBjYWxsZWQgYWdhaW4uCi0JICogCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBwcm92aWRlciBpcyB0byBiZSB0cmVhdGVkIGFzIGRpc3Bvc2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIChkZFByb3ZpZGVyID09IG51bGwgJiYgYW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIgPT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSB0aGUgbW9kZWwgcHJvdmlkZXIuIElmIHRoZSBwcm92aWRlciBpcyBhbHJlYWR5IGRpc3Bvc2VkIHRoZQotCSAqIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgotCSAqIAotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBzZWUgI2lzRGlzcG9zZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChpc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCWRpc2FibGVJbnRlcm5hbE5vdGlmaWNhdGlvbnMoKTsKLQkJZGRQcm92aWRlciA9IG51bGw7Ci0JCWFubm90YXRpb25Nb2RlbFByb3ZpZGVyID0gbnVsbDsKLQkJbWVyZ2VkTW9kZWwgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9NYW55VG9PbmVSZWxhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9NYW55VG9PbmVSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzExMWRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9jb21tb24vTWFueVRvT25lUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEludHJvZHVjZXMgdGhlIG5vdGF0aW9uIG9mIG1hbnktdG8tb25lIHJlbGF0aW9uLiBUaGlzIGlzIHdoZXJlIHRoZSBNIGFuZCBPIG9mCi0gKiB0aGUgdHlwZSBzaWduYXR1cmUgY29tZXMgZnJvbS4KLSAqIAotICogTWFueSB1bmlxdWUgInNvdXJjZSIgb2JqZWN0cyByZWZlciB0byBvbmUgYW5kIG9ubHkgInRhcmdldCIgb2JqZWN0LgotICogCi0gKiBUaGUgY2xhc3MgbWFpbnRhaW5zIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSB0YXJnZXQgYW5kIGFsbCB0aGUgc291cmNlcyB0aGF0Ci0gKiBhcmUgcmVmZXJyaW5nIHRvIGl0LgotICogCi0gKiBAYXV0aG9yIEtpcmlsIE1pdG92IGsubWl0b3ZAc2FwLmNvbQotICogCi0gKiBAcGFyYW0gPE0+Ci0gKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSAic291cmNlIiBvYmplY3RzLgotICogQHBhcmFtIDxPPgotICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgInRhcmdldCIgb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIE1hbnlUb09uZVJlbGF0aW9uPE0sIE8+IHsKLQotCXByaXZhdGUgTWFwPE0sIE8+IG1hbnlUb09uZSA9IG5ldyBIYXNoTWFwPE0sIE8+KCk7Ci0KLQkvKioKLQkgKiBDb25uZWN0cyB0aGUgZ2l2ZW4gc291cmNlIHdpdGggdGhlIGdpdmVuIHRhcmdldC4gSWYgdGhpcyBzb3VyY2Ugd2FzCi0JICogcHJldmlvdXNseSBjb25uZWN0ZWQgd2l0aCBhbm90aGVyIHRhcmdldCB0aGUgb2xkIGNvbm5lY3Rpb24gaXMgbG9zdC4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb25uZWN0KE0gc291cmNlLCBPIHRhcmdldCkgewotCQltYW55VG9PbmUucHV0KHNvdXJjZSwgdGFyZ2V0KTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWxhdGlvbiBjb250YWlucyB0aGUgZ2l2ZW4gc291cmNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNTb3VyY2UoTSBzb3VyY2UpIHsKLQkJcmV0dXJuIG1hbnlUb09uZS5jb250YWluc0tleShzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWxhdGlvbiBjb250YWlucyB0aGUgZ2l2ZW4gdGFyZ2V0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNUYXJnZXQoTyB0YXJnZXQpIHsKLQkJcmV0dXJuIG1hbnlUb09uZS5jb250YWluc1ZhbHVlKHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4gdGhlIHRhcmdldCB3aXRoIHdoaWNoIHRoaXMgc291cmNlIGlzIGNvbm5lY3RlZAotCSAqLwotCXB1YmxpYyBPIGdldFRhcmdldChNIHNvdXJjZSkgewotCQlyZXR1cm4gbWFueVRvT25lLmdldChzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuIGFsbCB0aGUgdGFyZ2V0cyB0aGF0IGFyZSBjb25uZWN0ZWQgd2l0aCB0aGlzIHNvdXJjZSBvciBlbXB0eQotCSAqICAgICAgICAgY29sbGVjdGlvbiBpZiB0aGVyZSBhcmUgbm8gc291cmNlcyBjb25uZWN0ZWQgd2l0aCB0aGlzIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxNPiBnZXRTb3VyY2VzKE8gdGFyZ2V0KSB7Ci0JCUNvbGxlY3Rpb248TT4gZmlsZXMgPSBuZXcgTGlua2VkTGlzdDxNPigpOwotCQlmb3IgKE1hcC5FbnRyeTxNLCBPPiBlbnRyeSA6IG1hbnlUb09uZS5lbnRyeVNldCgpKSB7Ci0JCQlpZiAoZW50cnkuZ2V0VmFsdWUoKS5lcXVhbHModGFyZ2V0KSkKLQkJCQlmaWxlcy5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhpcyBzb3VyY2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldC4KLQkgKiBPdGhlciBzb3VyY2VzIHdpbGwgc3RpbGwgcG9pbnQgdG8gdGhlIHNhbWUgdGFyZ2V0LgotCSAqIAotCSAqIFRoZSB0YXJnZXQgaXMgcmVtb3ZlZCBpZiB0aGlzIHdhcyB0aGUgb25seSBzb3VyY2UgcG9pbnRpbmcgdG8gaXQgYW5kCi0JICoge0BsaW5rICNjb250YWluc1RhcmdldChPYmplY3QpfSB3aWxsIHJldHVybiBmYWxzZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdFNvdXJjZShNIHNvdXJjZSkgewotCQltYW55VG9PbmUucmVtb3ZlKHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gdGFyZ2V0IGZyb20gdGhlIHJlbGF0aW9uLiBBbGwgdGhlIHNvdXJjZXMgdGhhdCBhcmUKLQkgKiBwb2ludGluZyB0byB0aGlzIHRhcmdldCBhcmUgYWxzbyByZW1vdmVkLgotCSAqIAotCSAqIElmIHlvdSB0YWtlIHRoZSAicmVzdWx0IiBvZiB7QGxpbmsgI2dldFNvdXJjZXModGFyZ2V0KX0gYW5kIGFmdGVyIHRoYXQKLQkgKiBjYWxsIHRoaXMgbWV0aG9kIHRoZW4ge0BsaW5rICNjb250YWluc1NvdXJjZShPYmplY3QpfSB3aWxsIHJldHVybgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgZXZlcnkgb2JqZWN0IGluICJyZXN1bHQiLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KE8gdGFyZ2V0KSB7Ci0JCWZvciAoSXRlcmF0b3I8Tz4gaXRlciA9IG1hbnlUb09uZS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChpdGVyLm5leHQoKS5lcXVhbHModGFyZ2V0KSkKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhlIHRhcmdldHMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248Tz4gZ2V0VGFyZ2V0cygpIHsKLQkJcmV0dXJuIG1hbnlUb09uZS52YWx1ZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9jb21tb24vTXlNb2RlbFByb3ZpZGVyRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9jb21tb24vTXlNb2RlbFByb3ZpZGVyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1ZWY3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL015TW9kZWxQcm92aWRlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlckV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgIEtpcmlsIE1pdG92IGsubWl0b3ZAc2FwLmNvbQotICoKLSAqLwotY2xhc3MgTXlNb2RlbFByb3ZpZGVyRXZlbnQgaW1wbGVtZW50cyBJTW9kZWxQcm92aWRlckV2ZW50IHsKLQlwcml2YXRlIElNb2RlbFByb3ZpZGVyIG1vZGVsOwotCXByaXZhdGUgSVByb2plY3QgcHJvajsKLQlwcml2YXRlIGludCBldmVudDsKLQotCXByaXZhdGUgTGlzdCByZXNvdXJjZXM7Ci0KLQlwdWJsaWMgTXlNb2RlbFByb3ZpZGVyRXZlbnQoaW50IGFuRXZlbnRDb2RlLCBJTW9kZWxQcm92aWRlciBtb2RlbCwgSVByb2plY3QgcHJvaikgewotCQlzZXRFdmVudENvZGUoYW5FdmVudENvZGUpOwotCQlzZXRNb2RlbChtb2RlbCk7Ci0JCXNldFByb2plY3QocHJvaik7Ci0JCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcHJvaiA9IHByb2plY3Q7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZShPYmplY3QgcmVzb3VyY2UpIHsKLQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VzKENvbGxlY3Rpb248T2JqZWN0PiBzb21lUmVzb3VyY2VzKSB7Ci0JCXJlc291cmNlcy5hZGRBbGwoc29tZVJlc291cmNlcyk7Ci0KLQl9Ci0KLQlwdWJsaWMgTGlzdDxPYmplY3Q+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIGludCBnZXRFdmVudENvZGUoKSB7Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VkUmVzb3VyY2VzKExpc3Q8T2JqZWN0PiBuZXdDaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV2ZW50Q29kZShpbnQgbmV3RXZlbnRDb2RlKSB7Ci0JCWV2ZW50ID0gbmV3RXZlbnRDb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKElNb2RlbFByb3ZpZGVyIG5ld01vZGVsKSB7Ci0JCW1vZGVsID0gbmV3TW9kZWw7Ci0KLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2o7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL1Jlc3VsdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1MTlhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL1Jlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIEtpcmlsIE1pdG92IGsubWl0b3ZAc2FwLmNvbQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPElUeXBlPiBkZXBlbmRlZFR5cGVzOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEphdmFFRU9iamVjdD4gbW9kZWxPYmplY3RzOwotCi0JcHJpdmF0ZSBKYXZhRUVPYmplY3QgbWFpbk9iamVjdDsKLQotCXB1YmxpYyBSZXN1bHQoKSB7Ci0JCWRlcGVuZGVkVHlwZXMgPSBuZXcgSGFzaFNldDxJVHlwZT4oKTsKLQkJLy8gbW9zdCBvZiB0aGUgdGltZSB0aGVyZSB3aWxsIGJlIG9ubHkgb25lIG9iamVjdCBpbiB0aGUgbW9kZWwgb2JqZWN0cwotCQkvLyBsaXN0LiBFeGNlcHRpb25zIGFyZSBtYWRlIGZvciByZXN1bHRzIHRoYXQgd2lsbCBjb250YWluIHNlY3VyaXR5Ci0JCS8vIHJvbGVzIGZvciBleGFtcGxlLiBUaGlzIGlzIHdheSBoZXJlIHRoZSBtb2RlbE9iamVjdHMgY29sbGVjdGlvbiBpcwotCQkvLyBBcnJheUxpc3Qgd2l0aCBzaXplIDEKLQkJbW9kZWxPYmplY3RzID0gbmV3IEFycmF5TGlzdDxKYXZhRUVPYmplY3Q+KDEpOwotCX0KLQotCXB1YmxpYyBKYXZhRUVPYmplY3QgZ2V0TWFpbk9iamVjdCgpIHsKLQkJcmV0dXJuIG1haW5PYmplY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFpbk9iamVjdChKYXZhRUVPYmplY3QgbWFpbk9iamVjdCkgewotCQl0aGlzLm1haW5PYmplY3QgPSBtYWluT2JqZWN0OwotCQltb2RlbE9iamVjdHMuYWRkKG1haW5PYmplY3QpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPEphdmFFRU9iamVjdD4gZ2V0QWRkaXRpb25hbCgpIHsKLQkJcmV0dXJuIG1vZGVsT2JqZWN0czsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJVHlwZT4gZ2V0RGVwZW5kZWRUeXBlcygpIHsKLQkJcmV0dXJuIGRlcGVuZGVkVHlwZXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBtYWluT2JqZWN0ID09IG51bGwgJiYgZ2V0QWRkaXRpb25hbCgpLmlzRW1wdHkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9CYXNlUmVmc01lcmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvQmFzZVJlZnNNZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzllNDVmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9CYXNlUmVmc01lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBKTkRJIG1lcmdlcnMKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSZWZzTWVyZ2VyIGV4dGVuZHMgTW9kZWxFbGVtZW50c01lcmdlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzCi0JICogCi0JICogQHBhcmFtIGJhc2VMaXN0IC0KLQkgKiAgICAgICAgICAgIGJhc2UgbGlzdCBvZiByZWZlcmVuY2VzIHRoYXQgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgYW5kIGFyZQotCSAqICAgICAgICAgICAgcmVzdWx0IG9mIHRoZSBtZXJnZS4KLQkgKiBAcGFyYW0gdG9NZXJnZUxpc3QgLQotCSAqICAgICAgICAgICAgdG9NZXJnZSBsaXN0IG9mIHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgQmFzZVJlZnNNZXJnZXIoTGlzdCBiYXNlTGlzdCwgTGlzdCB0b01lcmdlTGlzdCkgewotCQlzdXBlcihiYXNlTGlzdCwgdG9NZXJnZUxpc3QpOwotCX0KLQotCS8qKgotCSAqIFdoZW4gYW4gZW50cnkgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIHByZXNlbnQgaW4gYm90aCBsaXN0cywgbWlzc2luZyB2YWx1c2UKLQkgKiBpbiBiYXNlIGFyZSBmaWxsZWQgYnkgdG9NZXJnZSBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBiYXNlTGlzdCAtCi0JICogICAgICAgICAgICBiYXNlIGxpc3Qgb2YgcmVmZXJlbmNlcwotCSAqIEBwYXJhbSB0b01lcmdlTGlzdCAtCi0JICogICAgICAgICAgICB0b01lcmdlIGxpc3Qgb2YgcmVmZXJlbmNlcwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKE9iamVjdCBiYXNlLCBPYmplY3QgdG9NZXJnZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXRMaXN0QmFzZQotCSAqIEBwYXJhbSBpdExpc3RUb01lcmdlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMaXN0IG1lcmdlSW5nZWN0aW9uVGFyZ2V0cyhMaXN0IGl0TGlzdEJhc2UsIExpc3QgaXRMaXN0VG9NZXJnZSkgewotCQkvLyBUT0RPCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjckxpc3RCYXNlCi0JICogQHBhcmFtIGRlc2NyTGlzdFRvTWVyZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgbWVyZ2VEZXNjcmlwdGlvbnMoTGlzdCBkZXNjckxpc3RCYXNlLCBMaXN0IGRlc2NyTGlzdFRvTWVyZ2UpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9FSkJSZWZzTWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9FSkJSZWZzTWVyZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDE1OGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvRUpCUmVmc01lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7Ci0KLS8qKgotICogRWpiUmVmIGFuZCBFamJMb2NhbFJlZiBtZXJnZXIuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBFSkJSZWZzTWVyZ2VyIGV4dGVuZHMgQmFzZVJlZnNNZXJnZXIgewotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgRWpiUmVmcyBtZXJnZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIF9iYXNlRWpiUmVmcyAtIGJhc2UgbGlzdCBvZiByZWZlcmVuY2VzIHRoYXQgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgYW5kIGFyZSByZXN1bHQgb2YgdGhlIG1lcmdlLgotICAgICAqIEBwYXJhbSBfdG9NZXJnZUVqYlJlZnMgLSB0b01lcmdlIGxpc3Qgb2YgcmVmZXJlbmNlcwotICAgICAqLwotICAgIHB1YmxpYyBFSkJSZWZzTWVyZ2VyKExpc3QgX2Jhc2VFamJSZWZzLCBMaXN0IF90b01lcmdlRWpiUmVmcykgewotICAgICAgICBzdXBlcihfYmFzZUVqYlJlZnMsIF90b01lcmdlRWpiUmVmcyk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5tb2RlbC5tZXJnZXJzLmNvbW1vbi5Nb2RlbEVsZW1lbnRzTWVyZ2VyI3Byb2Nlc3MoKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHByb2Nlc3MoKSB0aHJvd3MgTW9kZWxFeGNlcHRpb24gewotICAgICAgICBMaXN0IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoZ2V0VG9NZXJnZUVsZW1ldHMoKSA9PSBudWxsIHx8IGdldFRvTWVyZ2VFbGVtZXRzKCkuaXNFbXB0eSgpKXsKLSAgICAgICAgICByZXR1cm4gd2FybmluZ3M7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IGdldFRvTWVyZ2VFbGVtZXRzKCkpIHsKLSAgICAgICAgICBPYmplY3QgZmluZE1hdGNoaW5nUmVmID0gbnVsbDsKLSAgICAgICAgICBpZihvYmplY3QgaW5zdGFuY2VvZiBFamJMb2NhbFJlZil7Ci0gICAgICAgICAgICBmaW5kTWF0Y2hpbmdSZWYgPSBmaW5kTWF0Y2hpbmdMb2NhbFJlZihnZXRCYXNlRWxlbWVudHMoKSwgb2JqZWN0KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluZE1hdGNoaW5nUmVmID0gZmluZE1hdGNoaW5nUmVmKGdldEJhc2VFbGVtZW50cygpLCBvYmplY3QpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZmluZE1hdGNoaW5nUmVmICE9IG51bGwpewotICAgICAgICAgICAgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoZmluZE1hdGNoaW5nUmVmLCBvYmplY3QpOwotICAgICAgICAgIH0gZWxzZXsKLSAgICAgICAgICAgIGdldEJhc2VFbGVtZW50cygpLmFkZChFY29yZVV0aWwuY29weSgoRU9iamVjdCkgb2JqZWN0KSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB3YXJuaW5nczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBFamJSZWYgZmluZE1hdGNoaW5nUmVmKExpc3QgeG1sUmVmcywKLSAgICAgICAgICAgIE9iamVjdCByZWYpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgCUVqYlJlZiByZXN1bHQgPSBudWxsOwotICAgICAgICBmb3IgKE9iamVjdCBjdXJyZW50WE1MUmVmOiB4bWxSZWZzKSB7Ci0gICAgICAgICAgICBpZiAoaXNNYXRjaGluZ1JlZihjdXJyZW50WE1MUmVmLCByZWYpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKEVqYlJlZikgY3VycmVudFhNTFJlZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBFamJMb2NhbFJlZiBmaW5kTWF0Y2hpbmdMb2NhbFJlZihMaXN0IHhtbFJlZnMsCi0gICAgICAgIE9iamVjdCByZWYpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICBFamJMb2NhbFJlZiByZXN1bHQgPSBudWxsOwotICAgIGZvciAoT2JqZWN0IGN1cnJlbnRYTUxSZWY6IHhtbFJlZnMpIHsKLSAgICAgICAgaWYgKGlzTWF0Y2hpbmdSZWYoY3VycmVudFhNTFJlZiwgcmVmKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gKEVqYkxvY2FsUmVmKSBjdXJyZW50WE1MUmVmOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGluZ1JlZihPYmplY3QgeG1sUmVmLAotICAgICAgICAgICAgT2JqZWN0IGFubm90YXRlZFJlZikgdGhyb3dzIE1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHhtbFJlZk5hbWUgPSAoeG1sUmVmIGluc3RhbmNlb2YgRWpiUmVmKSA/ICgoRWpiUmVmKXhtbFJlZikuZ2V0RWpiUmVmTmFtZSgpIDogKChFamJMb2NhbFJlZil4bWxSZWYpLmdldEVqYlJlZk5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGFubm90YXRlZFJlZk5hbWUgPSAoYW5ub3RhdGVkUmVmIGluc3RhbmNlb2YgRWpiUmVmKSA/ICgoRWpiUmVmKWFubm90YXRlZFJlZikuZ2V0RWpiUmVmTmFtZSgpIDogKChFamJMb2NhbFJlZilhbm5vdGF0ZWRSZWYpLmdldEVqYlJlZk5hbWUoKTsKLSAgICAgICAgaWYgKHhtbFJlZk5hbWUuZXF1YWxzKGFubm90YXRlZFJlZk5hbWUpKSB7Ci0vLyAgICAgICAgICAgIGlmKCFpc01hdGNoaW5nVGFyZ2V0QmVhbih4bWxSZWYsIGFubm90YXRlZFJlZikpewotLy8gICAgICAgICAgICAJLy9UT0RPICAgY2hlY2sgaWYgY29ycmVjdAotLy8gICAgICAgICAgICAJcmV0dXJuIGZhbHNlOwotLy8gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWF0Y2hpbmdUYXJnZXRCZWFuKE9iamVjdCBsb2NhbFJlZiwKLSAgICAgICAgICAgIE9iamVjdCBhbm5vdGF0ZWRSZWYpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsb2NhbFJlZkVKQkxpbmsgPSAobG9jYWxSZWYgaW5zdGFuY2VvZiBFamJSZWYpID8gKChFamJSZWYpbG9jYWxSZWYpLmdldEVqYkxpbmsoKSA6ICgoRWpiTG9jYWxSZWYpbG9jYWxSZWYpLmdldEVqYkxpbmsoKTsKLSAgICAgICAgaWYobG9jYWxSZWZFSkJMaW5rID09IG51bGwpewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSB0b2tlbml6ZUVqYkxpbmsgPSB0b2tlbml6ZUVqYkxpbmsobG9jYWxSZWZFSkJMaW5rKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsUmVmRUpCTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmICh0b2tlbml6ZUVqYkxpbmsgIT0gbnVsbCAmJiB0b2tlbml6ZUVqYkxpbmsubGVuZ3RoPjApewotICAgICAgICAgIGxvY2FsUmVmRUpCTmFtZSA9IHRva2VuaXplRWpiTGlua1sxXTsgIAotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFublJlZlJlZmVyZW5jaW5nQmVhbiA9IGFublJlZlJlZmVyZW5jaW5nQmVhbiA9IChsb2NhbFJlZiBpbnN0YW5jZW9mIEVqYlJlZikgPyAoKEVqYlJlZilsb2NhbFJlZikuZ2V0RWpiTGluaygpIDogKChFamJMb2NhbFJlZilsb2NhbFJlZikuZ2V0RWpiTGluaygpOwotICAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsb2NhbFJlZkVKQk5hbWUgIT0gbnVsbCAmJiBhbm5SZWZSZWZlcmVuY2luZ0JlYW4gIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGxvY2FsUmVmRUpCTmFtZS5lcXVhbHMoYW5uUmVmUmVmZXJlbmNpbmdCZWFuKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0b2tlbml6ZUVqYkxpbmsoU3RyaW5nIGxpbmspIHsKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgCi0gICAgICAgIGludCBpbmRleCA9IGxpbmsuaW5kZXhPZignIycpOwotICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIHJlc3VsdFswXSA9IGxpbmsuc3Vic3RyaW5nKDAsaW5kZXgpOwotICAgICAgICAgICAgcmVzdWx0WzFdID0gbGluay5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHRbMV0gPSBsaW5rOyAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKE9iamVjdCBiYXNlLCBPYmplY3QgdG9NZXJnZSkgewotCSAgaWYoYmFzZSBpbnN0YW5jZW9mIEVqYlJlZil7Ci0JICAgIGNvcHlFamJSZWZQcm9wc0luQmFzZSgoRWpiUmVmKWJhc2UsIChFamJSZWYpdG9NZXJnZSk7Ci0JICB9IGVsc2UgaWYgKGJhc2UgaW5zdGFuY2VvZiBFamJMb2NhbFJlZil7Ci0JICAgIGNvcHlFamJMb2NhbFJlZlByb3BzSW5CYXNlKChFamJMb2NhbFJlZiliYXNlLCAoRWpiTG9jYWxSZWYpdG9NZXJnZSk7Ci0JICB9Ci0JfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5RWpiTG9jYWxSZWZQcm9wc0luQmFzZShFamJMb2NhbFJlZiBiYXNlLCBFamJMb2NhbFJlZiB0b01lcmdlKSB7Ci0gICAgaWYgKGJhc2UuZ2V0RWpiTGluaygpID09IG51bGwpewotICAgICAgYmFzZS5zZXRFamJMaW5rKHRvTWVyZ2UuZ2V0RWpiTGluaygpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGJhc2UuZ2V0TWFwcGVkTmFtZSgpID09IG51bGwpewotICAgICAgYmFzZS5zZXRNYXBwZWROYW1lKHRvTWVyZ2UuZ2V0TWFwcGVkTmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFiYXNlLmlzU2V0RWpiUmVmVHlwZSgpKXsKLSAgICAgIGJhc2Uuc2V0RWpiUmVmVHlwZSh0b01lcmdlLmdldEVqYlJlZlR5cGUoKSk7Ci0gICAgfQotICAgIAotICAgIGlmIChiYXNlLmdldExvY2FsKCkgPT0gbnVsbCl7Ci0gICAgICBiYXNlLnNldExvY2FsKHRvTWVyZ2UuZ2V0TG9jYWwoKSk7Ci0gICAgfQotICAgIAotICAgIGlmIChiYXNlLmdldExvY2FsSG9tZSgpID09IG51bGwpewotICAgICAgYmFzZS5zZXRMb2NhbEhvbWUodG9NZXJnZS5nZXRMb2NhbEhvbWUoKSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlFamJSZWZQcm9wc0luQmFzZShFamJSZWYgYmFzZSwgRWpiUmVmIHRvTWVyZ2UpIHsKLSAgICBpZiAoYmFzZS5nZXRFamJMaW5rKCkgPT0gbnVsbCl7Ci0gICAgICBiYXNlLnNldEVqYkxpbmsodG9NZXJnZS5nZXRFamJMaW5rKCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoYmFzZS5nZXRNYXBwZWROYW1lKCkgPT0gbnVsbCl7Ci0gICAgICBiYXNlLnNldE1hcHBlZE5hbWUodG9NZXJnZS5nZXRNYXBwZWROYW1lKCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoIWJhc2UuaXNTZXRFamJSZWZUeXBlKCkpewotICAgICAgYmFzZS5zZXRFamJSZWZUeXBlKHRvTWVyZ2UuZ2V0RWpiUmVmVHlwZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGJhc2UuZ2V0UmVtb3RlKCkgPT0gbnVsbCl7Ci0gICAgICBiYXNlLnNldFJlbW90ZSh0b01lcmdlLmdldFJlbW90ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGJhc2UuZ2V0SG9tZSgpID09IG51bGwpewotICAgICAgYmFzZS5zZXRIb21lKHRvTWVyZ2UuZ2V0SG9tZSgpKTsKLSAgICB9Ci0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL0VudkVudHJpZXNNZXJnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL0VudkVudHJpZXNNZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1ZTFjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9FbnZFbnRyaWVzTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeTsKLQotLyoqCi0gKiBNZXJnZXMgRW52aXJvbm1lbnQgRW50cmllcy4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIEVudkVudHJpZXNNZXJnZXIgZXh0ZW5kcyBCYXNlUmVmc01lcmdlciB7Ci0KLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcy4gCi0gICAgICogCi0gICAgICogQHBhcmFtIGJhc2VMaXN0IC0gYmFzZSBsaXN0IHdpdGggZW52aXJvbm1lbnQgZW50cmllcwotICAgICAqIEBwYXJhbSB0b01lcmdlTGlzdCAtIHRvTWVyZ2UgbGlzdCB3aXRoIGVudmlyb25tZW50IGVudHJpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgRW52RW50cmllc01lcmdlcihMaXN0IGJhc2VMaXN0LCBMaXN0IHRvTWVyZ2VMaXN0KSB7Ci0gICAgICAgIHN1cGVyKGJhc2VMaXN0LCB0b01lcmdlTGlzdCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIubW9kZWwubWVyZ2Vycy5jb21tb24uTW9kZWxFbGVtZW50c01lcmdlciNwcm9jZXNzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBwcm9jZXNzKCkgdGhyb3dzIE1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCB3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChPYmplY3Qgb1RvTWVyZ2UgOiBnZXRUb01lcmdlRWxlbWV0cygpKSB7Ci0JCQlFbnZFbnRyeSBlbnZFbnRyeSA9IChFbnZFbnRyeSkgb1RvTWVyZ2U7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKE9iamVjdCBvQmFzZSA6IGdldEJhc2VFbGVtZW50cygpKSB7Ci0JCQkJRW52RW50cnkgZW52RW50cnlCYXNlID0gKEVudkVudHJ5KSBvQmFzZTsKLQkJCQlpZiAoZW52RW50cnlCYXNlLmdldEVudkVudHJ5TmFtZSgpLmVxdWFscyhlbnZFbnRyeS5nZXRFbnZFbnRyeU5hbWUoKSkpewotCQkJCQljb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShlbnZFbnRyeUJhc2UsIGVudkVudHJ5KTsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZm91bmQpewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZ2V0QmFzZUVsZW1lbnRzKCkuYWRkKEVjb3JlVXRpbC5jb3B5KChFT2JqZWN0KSBvVG9NZXJnZSkpOwotCQl9Ci0gICAgICAgIHJldHVybiB3YXJuaW5nczsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoRW52RW50cnkgYmFzZUVsZW1lbnQsIEVudkVudHJ5IHRvTWVyZ2VFbGVtZW50KSB7Ci0gICAgCWlmKGJhc2VFbGVtZW50LmdldEVudkVudHJ5VmFsdWUoKSA9PSBudWxsKXsKLSAgICAJCWJhc2VFbGVtZW50LnNldEVudkVudHJ5VmFsdWUodG9NZXJnZUVsZW1lbnQuZ2V0RW52RW50cnlWYWx1ZSgpKTsKLSAgICAJfQotICAgIAkKLSAgICAJaWYoYmFzZUVsZW1lbnQuZ2V0TWFwcGVkTmFtZSgpID09IG51bGwpewotICAgIAkJYmFzZUVsZW1lbnQuc2V0TWFwcGVkTmFtZSh0b01lcmdlRWxlbWVudC5nZXRNYXBwZWROYW1lKCkpOwotICAgIAl9Ci0gICAgCQotICAgIAlpZighYmFzZUVsZW1lbnQuaXNTZXRFbnZFbnRyeVR5cGUoKSl7Ci0gICAgICAgICAgYmFzZUVsZW1lbnQuc2V0RW52RW50cnlUeXBlKHRvTWVyZ2VFbGVtZW50LmdldEVudkVudHJ5VHlwZSgpKTsKLSAgICAgIH0KLQotICAgICAgICBtZXJnZUluZ2VjdGlvblRhcmdldHMoYmFzZUVsZW1lbnQuZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLCB0b01lcmdlRWxlbWVudC5nZXRJbmplY3Rpb25UYXJnZXRzKCkpOwotICAgICAgICBtZXJnZURlc2NyaXB0aW9ucyhiYXNlRWxlbWVudC5nZXREZXNjcmlwdGlvbnMoKSwgdG9NZXJnZUVsZW1lbnQuZ2V0RGVzY3JpcHRpb25zKCkpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShPYmplY3QgYmFzZSwgT2JqZWN0IHRvTWVyZ2UpewotICAgIAljb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZSgoRW52RW50cnkpIGJhc2UsIChFbnZFbnRyeSkgdG9NZXJnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvSU1lcmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvSU1lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWY0NjIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL0lNZXJnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEJhc2UgaW50ZXJmYWNlIGZvciBhbGwgbWVyZ2VyIGNsYXNzZXMuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lcmdlciB7Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgbWV0aG9kIGlzIHRoZSBhY3R1YWwgbWVyZ2UgcHJvY2Vzcy4gSXQgd2lsbCBnZW5lcmF0ZSBsaXN0IG9mIHdhcm5uZ3Mgb3IgdGhyb3cgZXhjZXB0aW9uLgotICAgKiAgCi0gICAqIEByZXR1cm4gbGlzdCBvZiB3YXJuaW5ncyBnYXRoZXJlZCBkdXJpbmcgZXhlY3V0aW9uLgotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IExpc3QgcHJvY2VzcygpIHRocm93cyBFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9KTkRJUmVmc01lcmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvSk5ESVJlZnNNZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0NWE0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9KTkRJUmVmc01lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKLQotLyoqCi0gKiAKLSAqIEpOREkgUmVmZXJlbmNlcyBtZXJnZXIuIEl0IGNhbiBiZSBhcHBsaWVkIG9uIEVudGVycHJpc2UgYmVhbnMgb3IgV2ViIHJlc291cmNlIGFydGlmYWN0cy4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIEpORElSZWZzTWVyZ2VyIGV4dGVuZHMgTW9kZWxFbGVtZW50TWVyZ2VyIHsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYXNlIC0gYmFzZSBsaXN0IG9mIHJlZmVyZW5jZXMgdGhhdCBoYXZlIGhpZ2hlciBwcmlvcml0eSBhbmQgYXJlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuIAotICAgICAqIEBwYXJhbSB0b01lcmdlIC0gdG9NZXJnZSBsaXN0IG9mIHJlZmVyZW5jZXMKLSAgICAgKiBAcGFyYW0ga2luZAotICAgICAqLwotICAgIHB1YmxpYyBKTkRJUmVmc01lcmdlcihKYXZhRUVPYmplY3QgYmFzZSwKLSAgICAgICAgSmF2YUVFT2JqZWN0IHRvTWVyZ2UsIGludCBraW5kKSB7Ci0gICAgICAgIHN1cGVyKGJhc2UsIHRvTWVyZ2UsIGtpbmQpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgU2Vzc2lvbkJlYW4gZ2V0QmFzZVNlc3Npb25CZWFuKCkgewotICAgICAgICByZXR1cm4gKFNlc3Npb25CZWFuKSBnZXRCYXNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIFNlc3Npb25CZWFuIGdldFRvTWVyZ2VTZXNzaW9uQmVhbiAoKSB7Ci0gICAgICAgIHJldHVybiAoU2Vzc2lvbkJlYW4pIGdldFRvTWVyZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIE1lc3NhZ2VEcml2ZW5CZWFuIGdldEJhc2VNZGJCZWFuKCkgewotICAgICAgcmV0dXJuIChNZXNzYWdlRHJpdmVuQmVhbikgZ2V0QmFzZSgpOwotICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgTWVzc2FnZURyaXZlbkJlYW4gZ2V0VG9NZXJnZU1kYkJlYW4gKCkgewotICAgICAgcmV0dXJuIChNZXNzYWdlRHJpdmVuQmVhbikgZ2V0VG9NZXJnZSgpOwotICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIFdlYkFwcCBnZXRCYXNlV2ViQXBwKCkgewotICAgICAgcmV0dXJuIChXZWJBcHApIGdldEJhc2UoKTsKLSAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIFdlYkFwcCBnZXRUb01lcmdlV2ViQXBwKCkgewotICAgICAgcmV0dXJuIChXZWJBcHApIGdldFRvTWVyZ2UoKTsKLSAgfQotCi0gICAgcHVibGljIExpc3QgcHJvY2VzcygpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Qgd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmKGdldEJhc2UoKSBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKXsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IEVudkVudHJpZXNNZXJnZXIoZ2V0QmFzZVNlc3Npb25CZWFuKCkuZ2V0RW52RW50cmllcygpLCBnZXRUb01lcmdlU2Vzc2lvbkJlYW4oKS5nZXRFbnZFbnRyaWVzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBSZXNvdXJjZUVudlJlZnNNZXJnZXIoZ2V0QmFzZVNlc3Npb25CZWFuKCkuZ2V0UmVzb3VyY2VFbnZSZWZzKCksIGdldFRvTWVyZ2VTZXNzaW9uQmVhbigpLmdldFJlc291cmNlRW52UmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgUmVzb3VyY2VSZWZzTWVyZ2VyKGdldEJhc2VTZXNzaW9uQmVhbigpLmdldFJlc291cmNlUmVmcygpLCBnZXRUb01lcmdlU2Vzc2lvbkJlYW4oKS5nZXRSZXNvdXJjZVJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IE1lc3NhZ2VEZXN0aW5hdGlvblJlZnNNZXJnZXIoZ2V0QmFzZVNlc3Npb25CZWFuKCkuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCBnZXRUb01lcmdlU2Vzc2lvbkJlYW4oKS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBTZXJ2aWNlUmVmc01lcmdlcihnZXRCYXNlU2Vzc2lvbkJlYW4oKS5nZXRTZXJ2aWNlUmVmcygpLCBnZXRUb01lcmdlU2Vzc2lvbkJlYW4oKS5nZXRTZXJ2aWNlUmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgUGVyc2lzdGVuY2VDb250ZXh0UmVmc01lcmdlcihnZXRCYXNlU2Vzc2lvbkJlYW4oKS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIGdldFRvTWVyZ2VTZXNzaW9uQmVhbigpLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IFBlcnNpc3RlbmNlVW5pdFJlZnNNZXJnZXIoZ2V0QmFzZVNlc3Npb25CZWFuKCkuZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLCBnZXRUb01lcmdlU2Vzc2lvbkJlYW4oKS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBFSkJSZWZzTWVyZ2VyKGdldEJhc2VTZXNzaW9uQmVhbigpLmdldEVqYkxvY2FsUmVmcygpLCBnZXRUb01lcmdlU2Vzc2lvbkJlYW4oKS5nZXRFamJMb2NhbFJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IEVKQlJlZnNNZXJnZXIoZ2V0QmFzZVNlc3Npb25CZWFuKCkuZ2V0RWpiUmVmcygpLCBnZXRUb01lcmdlU2Vzc2lvbkJlYW4oKS5nZXRFamJSZWZzKCkpLnByb2Nlc3MoKSk7ICAKLSAgICAgICAgfSBlbHNlIGlmKGdldEJhc2UoKSBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKSB7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBFbnZFbnRyaWVzTWVyZ2VyKGdldEJhc2VNZGJCZWFuKCkuZ2V0RW52RW50cmllcygpLCBnZXRUb01lcmdlTWRiQmVhbigpLmdldEVudkVudHJpZXMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IFJlc291cmNlRW52UmVmc01lcmdlcihnZXRCYXNlTWRiQmVhbigpLmdldFJlc291cmNlRW52UmVmcygpLCBnZXRUb01lcmdlTWRiQmVhbigpLmdldFJlc291cmNlRW52UmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgUmVzb3VyY2VSZWZzTWVyZ2VyKGdldEJhc2VNZGJCZWFuKCkuZ2V0UmVzb3VyY2VSZWZzKCksIGdldFRvTWVyZ2VNZGJCZWFuKCkuZ2V0UmVzb3VyY2VSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBNZXNzYWdlRGVzdGluYXRpb25SZWZzTWVyZ2VyKGdldEJhc2VNZGJCZWFuKCkuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCBnZXRUb01lcmdlTWRiQmVhbigpLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IFNlcnZpY2VSZWZzTWVyZ2VyKGdldEJhc2VNZGJCZWFuKCkuZ2V0U2VydmljZVJlZnMoKSwgZ2V0VG9NZXJnZU1kYkJlYW4oKS5nZXRTZXJ2aWNlUmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgUGVyc2lzdGVuY2VDb250ZXh0UmVmc01lcmdlcihnZXRCYXNlTWRiQmVhbigpLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgZ2V0VG9NZXJnZU1kYkJlYW4oKS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBQZXJzaXN0ZW5jZVVuaXRSZWZzTWVyZ2VyKGdldEJhc2VNZGJCZWFuKCkuZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLCBnZXRUb01lcmdlTWRiQmVhbigpLmdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IEVKQlJlZnNNZXJnZXIoZ2V0QmFzZU1kYkJlYW4oKS5nZXRFamJMb2NhbFJlZnMoKSwgZ2V0VG9NZXJnZU1kYkJlYW4oKS5nZXRFamJMb2NhbFJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IEVKQlJlZnNNZXJnZXIoZ2V0QmFzZU1kYkJlYW4oKS5nZXRFamJSZWZzKCksIGdldFRvTWVyZ2VNZGJCZWFuKCkuZ2V0RWpiUmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICB9IGVsc2UgaWYoZ2V0QmFzZSgpIGluc3RhbmNlb2YgV2ViQXBwKSB7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBFbnZFbnRyaWVzTWVyZ2VyKGdldEJhc2VXZWJBcHAoKS5nZXRFbnZFbnRyaWVzKCksIGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRFbnZFbnRyaWVzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBSZXNvdXJjZUVudlJlZnNNZXJnZXIoZ2V0QmFzZVdlYkFwcCgpLmdldFJlc291cmNlRW52UmVmcygpLCBnZXRUb01lcmdlV2ViQXBwKCkuZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBSZXNvdXJjZVJlZnNNZXJnZXIoZ2V0QmFzZVdlYkFwcCgpLmdldFJlc291cmNlUmVmcygpLCBnZXRUb01lcmdlV2ViQXBwKCkuZ2V0UmVzb3VyY2VSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBNZXNzYWdlRGVzdGluYXRpb25SZWZzTWVyZ2VyKGdldEJhc2VXZWJBcHAoKS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBTZXJ2aWNlUmVmc01lcmdlcihnZXRCYXNlV2ViQXBwKCkuZ2V0U2VydmljZVJlZnMoKSwgZ2V0VG9NZXJnZVdlYkFwcCgpLmdldFNlcnZpY2VSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBQZXJzaXN0ZW5jZUNvbnRleHRSZWZzTWVyZ2VyKGdldEJhc2VXZWJBcHAoKS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBQZXJzaXN0ZW5jZVVuaXRSZWZzTWVyZ2VyKGdldEJhc2VXZWJBcHAoKS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCksIGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBFSkJSZWZzTWVyZ2VyKGdldEJhc2VXZWJBcHAoKS5nZXRFamJMb2NhbFJlZnMoKSwgZ2V0VG9NZXJnZVdlYkFwcCgpLmdldEVqYkxvY2FsUmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgRUpCUmVmc01lcmdlcihnZXRCYXNlV2ViQXBwKCkuZ2V0RWpiUmVmcygpLCBnZXRUb01lcmdlV2ViQXBwKCkuZ2V0RWpiUmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3YXJuaW5nczsKLSAgICB9Ci0gfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvTWVzc2FnZURlc3RpbmF0aW9uUmVmc01lcmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvTWVzc2FnZURlc3RpbmF0aW9uUmVmc01lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzE3MjU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL01lc3NhZ2VEZXN0aW5hdGlvblJlZnNNZXJnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLQotLyoqCi0gKiBNZXNzYWdlRGVzdGluYXRpb25SZWZzTWVyZ2VyIG1lcmdlcyBNZXNzYWdlRGVzdGluYXRpb25SZWYgb2JqZWN0cy4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25SZWZzTWVyZ2VyIGV4dGVuZHMgQmFzZVJlZnNNZXJnZXIgewotICAKLSAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFzZSAtIGJhc2UgbGlzdCB3aXRoIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlcy4KLSAgICAgKiAgICAgICAgICAgICAgIHRoYXQgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgYW5kIGFyZSByZXN1bHQgb2YgdGhlIG1lcmdlLiAKLSAgICAgKiBAcGFyYW0gdG9NZXJnZSAtIHRvTWVyZ2UgbGlzdCB0byBiZSBpbXBvcnRlZCBpbiBiYXNlIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblJlZnNNZXJnZXIoTGlzdCBiYXNlLCBMaXN0IHRvTWVyZ2UpIHsKLSAgICAgICAgc3VwZXIoYmFzZSwgdG9NZXJnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBwcm9jZXNzKCkgdGhyb3dzIE1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IG9Ub01lcmdlIDogZ2V0VG9NZXJnZUVsZW1ldHMoKSkgewotCQkJTWVzc2FnZURlc3RpbmF0aW9uUmVmIGVudkVudHJ5ID0gKE1lc3NhZ2VEZXN0aW5hdGlvblJlZikgb1RvTWVyZ2U7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKE9iamVjdCBvQmFzZSA6IGdldEJhc2VFbGVtZW50cygpKSB7Ci0JCQkgIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBlbnZFbnRyeUJhc2UgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKSBvQmFzZTsKLQkJCQlpZiAoZW52RW50cnlCYXNlLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKS5lcXVhbHMoZW52RW50cnkuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpKSl7Ci0JCQkJCWNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKGVudkVudHJ5QmFzZSwgZW52RW50cnkpOwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCl7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlnZXRCYXNlRWxlbWVudHMoKS5hZGQoRWNvcmVVdGlsLmNvcHkoKEVPYmplY3QpIG9Ub01lcmdlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdhcm5pbmdzOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShNZXNzYWdlRGVzdGluYXRpb25SZWYgYmFzZUVsZW1lbnQsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiB0b01lcmdlRWxlbWVudCkgewotICAgIAkKLSAgICAJaWYoYmFzZUVsZW1lbnQuZ2V0TWFwcGVkTmFtZSgpID09IG51bGwpewotICAgIAkJYmFzZUVsZW1lbnQuc2V0TWFwcGVkTmFtZSh0b01lcmdlRWxlbWVudC5nZXRNYXBwZWROYW1lKCkpOwotICAgIAl9Ci0gICAgCQotICAgIAlpZihiYXNlRWxlbWVudC5nZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkgPT0gbnVsbCl7Ci0gICAgICAgICAgYmFzZUVsZW1lbnQuc2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayh0b01lcmdlRWxlbWVudC5nZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKCkpOwotICAgICAgfQotICAgIAkKLSAgICAJaWYoYmFzZUVsZW1lbnQuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpID09IG51bGwpewotICAgICAgICAgIGJhc2VFbGVtZW50LnNldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUodG9NZXJnZUVsZW1lbnQuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpKTsKLSAgICAgIH0KLSAgICAJCi0gICAgCWlmKCFiYXNlRWxlbWVudC5pc1NldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkpewotICAgICAgICAgIGJhc2VFbGVtZW50LnNldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKHRvTWVyZ2VFbGVtZW50LmdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCkpOwotICAgICAgfQotCi0gICAgICAgIG1lcmdlSW5nZWN0aW9uVGFyZ2V0cyhiYXNlRWxlbWVudC5nZXRJbmplY3Rpb25UYXJnZXRzKCksIHRvTWVyZ2VFbGVtZW50LmdldEluamVjdGlvblRhcmdldHMoKSk7Ci0gICAgICAgIG1lcmdlRGVzY3JpcHRpb25zKGJhc2VFbGVtZW50LmdldERlc2NyaXB0aW9ucygpLCB0b01lcmdlRWxlbWVudC5nZXREZXNjcmlwdGlvbnMoKSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKE9iamVjdCBiYXNlLCBPYmplY3QgdG9NZXJnZSl7Ci0gICAgCWNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKChNZXNzYWdlRGVzdGluYXRpb25SZWYpIGJhc2UsIChNZXNzYWdlRGVzdGluYXRpb25SZWYpIHRvTWVyZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL01vZGVsRWxlbWVudE1lcmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvTW9kZWxFbGVtZW50TWVyZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjM3ZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvTW9kZWxFbGVtZW50TWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci0KLS8qKgotICogTW9kZWwgZWxlbWVudCBtZXJnZXIgaXMgYmVhc2UgY2xhc3MgZm9yIEphdmEgRUUgbWVyZ2Vycy4gCi0gKiBJdCBjb250YWlucyB0aGUgYmFzZSBhbmQgdG9NZXJnZSBlbGVtZW50cy4KLSAqIAotICogQmFzZSBlbGVtZW50IGlzIHRoZSBtYWluIGVsZW1lbnQgdGhhdCB2YWx1ZXMgd2lsbCBiZSB0YWtlbiB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkuCi0gKiB0b01lcmdlIGVsZW1lbnQgd2lsbCBnaXZlIGFsbCBvZiBoaXMgZXh0cmEgdmFsdWVzIHRvIGJhc2UuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2RlbEVsZW1lbnRNZXJnZXIgaW1wbGVtZW50cyBJTWVyZ2VyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBBREQgPSAweDE7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgQ0hBTkdFID0gMHgyOwotCQotCXB1YmxpYyBzdGF0aWMgaW50IFJFTU9WRSA9IDB4NDsKLQkKLQlKYXZhRUVPYmplY3QgYmFzZTsKLQlKYXZhRUVPYmplY3QgdG9NZXJnZXI7Ci0KLQlwcml2YXRlIGludCBraW5kOwotCi0JCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgdGhlIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBfYmFzZSBlbGVtZW50IGlzIHRoZSBtYWluIGVsZW1lbnQgdGhhdCB2YWx1ZXMgd2lsbCBiZSB0YWtlbiB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkuCi0JICogQHBhcmFtIF90b01lcmdlIGVsZW1lbnQgd2lsbCBnaXZlIGFsbCBvZiBoaXMgZXh0cmEgdmFsdWVzIHRvIGJhc2UuCi0JICogQHBhcmFtIF9raW5kCi0JICovCi0JcHVibGljIE1vZGVsRWxlbWVudE1lcmdlcihKYXZhRUVPYmplY3QgX2Jhc2UsIEphdmFFRU9iamVjdCBfdG9NZXJnZSwgaW50IF9raW5kKSB7Ci0JCWJhc2UgPSBfYmFzZTsKLQkJdG9NZXJnZXIgPSBfdG9NZXJnZTsKLQkJa2luZCA9IF9raW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgZWxlbWVudCwgd2hpY2ggaXMgYWxzbyB0aGUgbWVyZ2VkIHJlc3VsdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJhc2UgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUVFT2JqZWN0IGdldEJhc2UoKSB7Ci0JCXJldHVybiBiYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdG9NZXJnZSBlbGVtZW50LCB3aGljaCB3aWxsIGJlIG1lcmdlZCBpbiBiYXNlLgotCSAqLwotCXByb3RlY3RlZCBKYXZhRUVPYmplY3QgZ2V0VG9NZXJnZSgpIHsKLQkJcmV0dXJuIHRvTWVyZ2VyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLm1vZGVsLm1lcmdlcnMuTWVyZ2VyI3Byb2Nlc3MoKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IHByb2Nlc3MoKSB0aHJvd3MgTW9kZWxFeGNlcHRpb247Ci0JCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9Nb2RlbEVsZW1lbnRzTWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9Nb2RlbEVsZW1lbnRzTWVyZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzFhYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvTW9kZWxFbGVtZW50c01lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBCYXNlIG1lcmdlciBhZGFwdGVkIHRvIGRlYWwgd2l0aCBMaXN0cy4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEVsZW1lbnRzTWVyZ2VyIGltcGxlbWVudHMgSU1lcmdlciB7Ci0KLSAgICBwcml2YXRlIExpc3QgYmFzZUVsZW1lbnRzOwotICAgIHByaXZhdGUgTGlzdCB0b01lcmdlTGlzdDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gX2Jhc2VMaXN0Ci0gICAgICogQHBhcmFtIF90b01lcmdlTGlzdAotICAgICAqLwotICAgIHB1YmxpYyBNb2RlbEVsZW1lbnRzTWVyZ2VyKExpc3QgX2Jhc2VMaXN0LCBMaXN0IF90b01lcmdlTGlzdCkgewotICAgICAgICBiYXNlRWxlbWVudHMgPSBfYmFzZUxpc3Q7Ci0gICAgICAgIHRvTWVyZ2VMaXN0ID0gX3RvTWVyZ2VMaXN0OwotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRCYXNlRWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBiYXNlRWxlbWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldFRvTWVyZ2VFbGVtZXRzKCkgewotICAgICAgICByZXR1cm4gdG9NZXJnZUxpc3Q7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLm1vZGVsLm1lcmdlcnMuTWVyZ2VyI3Byb2Nlc3MoKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHByb2Nlc3MoKSB0aHJvd3MgTW9kZWxFeGNlcHRpb24gewotICAgICAgICBMaXN0IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOyAKLSAgICAgICAgcmV0dXJuIHdhcm5pbmdzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL01vZGVsRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9Nb2RlbEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTU4ZDBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL01vZGVsRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnM7Ci0KLS8qKgotICogTW9kZWxFeGNlcHRpb24gaXMgdGhyb3duIHdoZW4gaW52YWxpZCB2YWx1ZXMgb3IgaW5jb25zaXN0ZW5jaWVzIGFyZSBkZXRlY3RlZCBpbiB0aGUgbW9kZWwuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTEyMzkyMjMxODE1MjYwNjA3MzhMOwotCi0KLSAgcHVibGljIE1vZGVsRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0gICAgc3VwZXIoZSk7Ci0gIH0KLQotCi0gIHB1YmxpYyBNb2RlbEV4Y2VwdGlvbigpIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1BlcnNpc3RlbmNlQ29udGV4dFJlZnNNZXJnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1BlcnNpc3RlbmNlQ29udGV4dFJlZnNNZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzY2VmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGU7Ci0KLS8qKgotICogTWVyZ2VzIHBlcnNpc3RlbmNlIGNvbnRleHQgcmVmZXJlbmNlcyBhcnRpZmFjdHMuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VDb250ZXh0UmVmc01lcmdlciBleHRlbmRzIEJhc2VSZWZzTWVyZ2VyIHsKLQkKLSAgICAvKioKLSAgICAgKiAgQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcy4gCi0gICAgICogCi0gICAgICogQHBhcmFtIGJhc2UgLSBiYXNlIGxpc3Qgd2l0aCBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZXMuCi0gICAgICogICAgICAgICAgICAgICB0aGF0IGhhdmUgaGlnaGVyIHByaW9yaXR5IGFuZCBhcmUgcmVzdWx0IG9mIHRoZSBtZXJnZS4gCi0gICAgICogQHBhcmFtIHRvTWVyZ2UgLSB0b01lcmdlIGxpc3QgdG8gYmUgaW1wb3J0ZWQgaW4gYmFzZSBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBQZXJzaXN0ZW5jZUNvbnRleHRSZWZzTWVyZ2VyKExpc3QgX2Jhc2UsIExpc3QgX3RvTWVyZ2UpIHsKLSAgICAgICAgc3VwZXIoX2Jhc2UsIF90b01lcmdlKTsKLSAgICB9Ci0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5tb2RlbC5tZXJnZXJzLmNvbW1vbi5Nb2RlbEVsZW1lbnRzTWVyZ2VyI3Byb2Nlc3MoKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHByb2Nlc3MoKSB0aHJvd3MgTW9kZWxFeGNlcHRpb24gewotICAgICAgICBMaXN0IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKE9iamVjdCBvVG9NZXJnZSA6IGdldFRvTWVyZ2VFbGVtZXRzKCkpIHsKLQkJCVBlcnNpc3RlbmNlQ29udGV4dFJlZiBlbnZFbnRyeSA9IChQZXJzaXN0ZW5jZUNvbnRleHRSZWYpIG9Ub01lcmdlOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChPYmplY3Qgb0Jhc2UgOiBnZXRCYXNlRWxlbWVudHMoKSkgewotCQkJCVBlcnNpc3RlbmNlQ29udGV4dFJlZiBlbnZFbnRyeUJhc2UgPSAoUGVyc2lzdGVuY2VDb250ZXh0UmVmKSBvQmFzZTsKLQkJCQlpZiAoZW52RW50cnlCYXNlLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKS5lcXVhbHMoZW52RW50cnkuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpKSl7Ci0JCQkJCWNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKGVudkVudHJ5QmFzZSwgZW52RW50cnkpOwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCl7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlnZXRCYXNlRWxlbWVudHMoKS5hZGQoRWNvcmVVdGlsLmNvcHkoKEVPYmplY3QpIG9Ub01lcmdlKSk7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHdhcm5pbmdzOwotICAgIH0KLSAgICAKLQotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKFBlcnNpc3RlbmNlQ29udGV4dFJlZiBiYXNlRWxlbWVudCwgUGVyc2lzdGVuY2VDb250ZXh0UmVmIHRvTWVyZ2VFbGVtZW50KSB7Ci0gICAgCWlmKGJhc2VFbGVtZW50LmdldFBlcnNpc3RlbmNlVW5pdE5hbWUoKSA9PSBudWxsKXsKLSAgICAJCWJhc2VFbGVtZW50LnNldFBlcnNpc3RlbmNlVW5pdE5hbWUodG9NZXJnZUVsZW1lbnQuZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpKTsKLSAgICAJfQotICAgIAkKLSAgICAJaWYoYmFzZUVsZW1lbnQuZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpID09IG51bGwpewotICAgIAkJYmFzZUVsZW1lbnQuc2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSh0b01lcmdlRWxlbWVudC5nZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkpOwotICAgIAl9Ci0gICAgCQotICAgIAlpZihiYXNlRWxlbWVudC5nZXRNYXBwZWROYW1lKCkgPT0gbnVsbCl7Ci0gICAgICAgICAgYmFzZUVsZW1lbnQuc2V0TWFwcGVkTmFtZSh0b01lcmdlRWxlbWVudC5nZXRNYXBwZWROYW1lKCkpOwotICAgICAgfQotICAgIAkKLSAgICAJY29weU1pc3NpbmdQZXJzaXN0ZW50UHJvcGVydGllc0luQmFzZShiYXNlRWxlbWVudC5nZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMoKSwgdG9NZXJnZUVsZW1lbnQuZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCkpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY29weU1pc3NpbmdQZXJzaXN0ZW50UHJvcGVydGllc0luQmFzZSgKLSAgICAgICAgTGlzdCBwZXJzaXN0ZW5jZVByb3BlcnRpZXMsIExpc3QgcGVyc2lzdGVuY2VQcm9wZXJ0aWVzMikgewotICAgICAgZm9yIChPYmplY3QgbWVyZ2VQcm9wcyA6IHBlcnNpc3RlbmNlUHJvcGVydGllczIpIHsKLSAgICAgICAgUHJvcGVydHlUeXBlIG1Qcm9wID0gKFByb3BlcnR5VHlwZSkgbWVyZ2VQcm9wczsKLSAgICAgICAgaWYoIWNvbnRhaW5zUHJvcGVydHkocGVyc2lzdGVuY2VQcm9wZXJ0aWVzICwgbVByb3ApKXsKLSAgICAgICAgICBwZXJzaXN0ZW5jZVByb3BlcnRpZXMuYWRkKCBtUHJvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc1Byb3BlcnR5KExpc3QgbGlzdCwgUHJvcGVydHlUeXBlIHApewotICAgICAgZm9yIChPYmplY3QgYmFzZVByb3BzIDogbGlzdCkgewotICAgICAgICBQcm9wZXJ0eVR5cGUgYlByb3AgPSAoUHJvcGVydHlUeXBlKSBiYXNlUHJvcHM7Ci0gICAgICAgIGlmKHAuZ2V0TmFtZSgpLmVxdWFscyhiUHJvcC5nZXROYW1lKCkpKXsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoT2JqZWN0IGJhc2UsIE9iamVjdCB0b01lcmdlKXsKLSAgICAJY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoKFBlcnNpc3RlbmNlQ29udGV4dFJlZikgYmFzZSwgKFBlcnNpc3RlbmNlQ29udGV4dFJlZikgdG9NZXJnZSk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvUGVyc2lzdGVuY2VVbml0UmVmc01lcmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvUGVyc2lzdGVuY2VVbml0UmVmc01lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmE5ZDVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1BlcnNpc3RlbmNlVW5pdFJlZnNNZXJnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZjsKLQotLyoqCi0gKiAKLSAqIE1lcmdlcyBwZXJzaXN0ZW5jZSB1bml0IHJlZmVyZW5jZXMgYXJ0aWZhY3RzLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRSZWZzTWVyZ2VyIGV4dGVuZHMgQmFzZVJlZnNNZXJnZXIgewotCQotICAvKioKLSAgICogIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuIAotICAgKiAKLSAgICogQHBhcmFtIGJhc2UgLSBiYXNlIGxpc3Qgd2l0aCBwZXJzaXN0ZW5jZSB1bml0IHJlZmVyZW5jZXMuCi0gICAqICAgICAgICAgICAgICAgdGhhdCBoYXZlIGhpZ2hlciBwcmlvcml0eSBhbmQgYXJlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuIAotICAgKiBAcGFyYW0gdG9NZXJnZSAtIHRvTWVyZ2UgbGlzdCB0byBiZSBpbXBvcnRlZCBpbiBiYXNlIGxpc3QuCi0gICAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRSZWZzTWVyZ2VyKExpc3QgYmFzZSwgTGlzdCB0b01lcmdlKSB7Ci0gICAgICAgIHN1cGVyKGJhc2UsIHRvTWVyZ2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLm1vZGVsLm1lcmdlcnMuY29tbW9uLk1vZGVsRWxlbWVudHNNZXJnZXIjcHJvY2VzcygpCi0gICAgICovCi0gICAgcHVibGljIExpc3QgcHJvY2VzcygpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICBMaXN0IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgZm9yIChPYmplY3Qgb1RvTWVyZ2UgOiBnZXRUb01lcmdlRWxlbWV0cygpKSB7Ci0gICAgICAgICAgUGVyc2lzdGVuY2VVbml0UmVmIHJlc1JlZiA9IChQZXJzaXN0ZW5jZVVuaXRSZWYpIG9Ub01lcmdlOwotICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICBmb3IgKE9iamVjdCBvQmFzZSA6IGdldEJhc2VFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBQZXJzaXN0ZW5jZVVuaXRSZWYgcmVzUmVmQmFzZSA9IChQZXJzaXN0ZW5jZVVuaXRSZWYpIG9CYXNlOwotICAgICAgICAgICAgICBpZiAocmVzUmVmQmFzZS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCkuZXF1YWxzKHJlc1JlZi5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKHJlc1JlZkJhc2UsIHJlc1JlZik7Ci0gICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZm91bmQpewotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZ2V0QmFzZUVsZW1lbnRzKCkuYWRkKEVjb3JlVXRpbC5jb3B5KChFT2JqZWN0KSBvVG9NZXJnZSkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHdhcm5pbmdzOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShQZXJzaXN0ZW5jZVVuaXRSZWYgYmFzZUVsZW1lbnQsIFBlcnNpc3RlbmNlVW5pdFJlZiB0b01lcmdlRWxlbWVudCkgeyAgICAJCi0gICAgCWlmKGJhc2VFbGVtZW50LmdldFBlcnNpc3RlbmNlVW5pdE5hbWUoKSA9PSBudWxsKXsKLSAgICAJCWJhc2VFbGVtZW50LnNldFBlcnNpc3RlbmNlVW5pdE5hbWUodG9NZXJnZUVsZW1lbnQuZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpKTsKLSAgICAJfQotICAgIAlpZihiYXNlRWxlbWVudC5nZXRNYXBwZWROYW1lKCkgPT0gbnVsbCl7Ci0gICAgICAgICAgYmFzZUVsZW1lbnQuc2V0TWFwcGVkTmFtZSh0b01lcmdlRWxlbWVudC5nZXRNYXBwZWROYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShPYmplY3QgYmFzZSwgT2JqZWN0IHRvTWVyZ2UpewotICAgIAljb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZSgoUGVyc2lzdGVuY2VVbml0UmVmKSBiYXNlLCAoUGVyc2lzdGVuY2VVbml0UmVmKSB0b01lcmdlKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9SZXNvdXJjZUVudlJlZnNNZXJnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1Jlc291cmNlRW52UmVmc01lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjk3YTJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1Jlc291cmNlRW52UmVmc01lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWY7Ci0KLS8qKgotICogTWVyZ2VzIFJlc291cmNlIEVudmlyb25tZW50IFJlZmVyZW5jZXMgYXJ0aWZhY3RzLgotICogIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUVudlJlZnNNZXJnZXIgZXh0ZW5kcyBCYXNlUmVmc01lcmdlciB7Ci0gICAgCi0gIC8qKgotICAgKiAgQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcy4gCi0gICAqIAotICAgKiBAcGFyYW0gYmFzZSAtIGJhc2UgbGlzdCB3aXRoIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXMuCi0gICAqICAgICAgICAgICAgICAgdGhhdCBoYXZlIGhpZ2hlciBwcmlvcml0eSBhbmQgYXJlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuIAotICAgKiBAcGFyYW0gdG9NZXJnZSAtIHRvTWVyZ2UgbGlzdCB0byBiZSBpbXBvcnRlZCBpbiBiYXNlIGxpc3QuCi0gICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUVudlJlZnNNZXJnZXIoTGlzdCBiYXNlLCBMaXN0IHRvTWVyZ2UpIHsKLSAgICAgICAgc3VwZXIoYmFzZSwgdG9NZXJnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIubW9kZWwubWVyZ2Vycy5jb21tb24uTW9kZWxFbGVtZW50c01lcmdlciNwcm9jZXNzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBwcm9jZXNzKCkgdGhyb3dzIE1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCB3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChPYmplY3Qgb1RvTWVyZ2UgOiBnZXRUb01lcmdlRWxlbWV0cygpKSB7Ci0JCQlSZXNvdXJjZUVudlJlZiByZXNFbnZSZWYgPSAoUmVzb3VyY2VFbnZSZWYpIG9Ub01lcmdlOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChPYmplY3Qgb0Jhc2UgOiBnZXRCYXNlRWxlbWVudHMoKSkgewotCQkJCVJlc291cmNlRW52UmVmIHJlc291cmNlRW52UmVmQmFzZSA9IChSZXNvdXJjZUVudlJlZikgb0Jhc2U7Ci0JCQkJaWYgKHJlc291cmNlRW52UmVmQmFzZS5nZXRSZXNvdXJjZUVudlJlZk5hbWUoKS5lcXVhbHMocmVzRW52UmVmLmdldFJlc291cmNlRW52UmVmTmFtZSgpKSl7Ci0JCQkJCWNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKHJlc291cmNlRW52UmVmQmFzZSwgcmVzRW52UmVmKTsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZm91bmQpewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZ2V0QmFzZUVsZW1lbnRzKCkuYWRkKEVjb3JlVXRpbC5jb3B5KChFT2JqZWN0KSBvVG9NZXJnZSkpOwotCQl9Ci0gICAgICAgIHJldHVybiB3YXJuaW5nczsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoUmVzb3VyY2VFbnZSZWYgYmFzZVJlZiwgUmVzb3VyY2VFbnZSZWYgdG9NZXJnZVJlZikgewotICAgIAlpZihiYXNlUmVmLmdldFJlc291cmNlRW52UmVmVHlwZSgpID09IG51bGwpewotICAgIAkJYmFzZVJlZi5zZXRSZXNvdXJjZUVudlJlZlR5cGUodG9NZXJnZVJlZi5nZXRSZXNvdXJjZUVudlJlZlR5cGUoKSk7Ci0gICAgCX0KLSAgICAJCi0gICAgCWlmKGJhc2VSZWYuZ2V0TWFwcGVkTmFtZSgpID09IG51bGwpewotICAgIAkJYmFzZVJlZi5zZXRNYXBwZWROYW1lKHRvTWVyZ2VSZWYuZ2V0TWFwcGVkTmFtZSgpKTsKLSAgICAJfQotICAgIAkKLSAgICAgIG1lcmdlSW5nZWN0aW9uVGFyZ2V0cyhiYXNlUmVmLmdldEluamVjdGlvblRhcmdldHMoKSwgdG9NZXJnZVJlZi5nZXRJbmplY3Rpb25UYXJnZXRzKCkpOwotICAgICAgbWVyZ2VEZXNjcmlwdGlvbnMoYmFzZVJlZi5nZXREZXNjcmlwdGlvbnMoKSwgdG9NZXJnZVJlZi5nZXREZXNjcmlwdGlvbnMoKSk7Ci0gICAgfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoT2JqZWN0IGJhc2UsIE9iamVjdCB0b01lcmdlKSB7Ci0JCWNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKChSZXNvdXJjZUVudlJlZikgYmFzZSwgKFJlc291cmNlRW52UmVmKXRvTWVyZ2UpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9SZXNvdXJjZVJlZnNNZXJnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1Jlc291cmNlUmVmc01lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc1Nzk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1Jlc291cmNlUmVmc01lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7Ci0KLS8qKgotICogTWVyZ2VzIFJlc291cmNlIFJlZmVyZW5jZXMgYXJ0aWZhY3RzLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlUmVmc01lcmdlciBleHRlbmRzIEJhc2VSZWZzTWVyZ2VyIHsKLSAgICAKLSAgLyoqCi0gICAqICBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLiAKLSAgICogCi0gICAqIEBwYXJhbSBiYXNlIC0gYmFzZSBsaXN0IHdpdGggcmVzb3VyY2UgcmVmZXJlbmNlcy4KLSAgICogICAgICAgICAgICAgICB0aGF0IGhhdmUgaGlnaGVyIHByaW9yaXR5IGFuZCBhcmUgcmVzdWx0IG9mIHRoZSBtZXJnZS4gCi0gICAqIEBwYXJhbSB0b01lcmdlIC0gdG9NZXJnZSBsaXN0IHRvIGJlIGltcG9ydGVkIGluIGJhc2UgbGlzdC4KLSAgICovCi0JcHVibGljIFJlc291cmNlUmVmc01lcmdlcihMaXN0IGJhc2UsIExpc3QgdG9NZXJnZSkgewotICAgICAgICBzdXBlcihiYXNlLCB0b01lcmdlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5tb2RlbC5tZXJnZXJzLmNvbW1vbi5Nb2RlbEVsZW1lbnRzTWVyZ2VyI3Byb2Nlc3MoKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHByb2Nlc3MoKSB0aHJvd3MgTW9kZWxFeGNlcHRpb24gewotICAgICAgICBMaXN0IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKE9iamVjdCBvVG9NZXJnZSA6IGdldFRvTWVyZ2VFbGVtZXRzKCkpIHsKLQkJCVJlc291cmNlUmVmIHJlc1JlZiA9IChSZXNvdXJjZVJlZikgb1RvTWVyZ2U7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKE9iamVjdCBvQmFzZSA6IGdldEJhc2VFbGVtZW50cygpKSB7Ci0JCQkJUmVzb3VyY2VSZWYgcmVzUmVmQmFzZSA9IChSZXNvdXJjZVJlZikgb0Jhc2U7Ci0JCQkJaWYgKHJlc1JlZkJhc2UuZ2V0UmVzUmVmTmFtZSgpLmVxdWFscyhyZXNSZWYuZ2V0UmVzUmVmTmFtZSgpKSl7Ci0JCQkJCWNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKHJlc1JlZkJhc2UsIHJlc1JlZik7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWdldEJhc2VFbGVtZW50cygpLmFkZChFY29yZVV0aWwuY29weSgoRU9iamVjdCkgb1RvTWVyZ2UpKTsKLQkJfQotICAgICAgICByZXR1cm4gd2FybmluZ3M7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKFJlc291cmNlUmVmIGJhc2VFbGVtZW50LCBSZXNvdXJjZVJlZiB0b01lcmdlRWxlbWVudCkgewotICAgIAlpZihiYXNlRWxlbWVudC5nZXRSZXNUeXBlKCkgPT0gbnVsbCl7Ci0gICAgCQliYXNlRWxlbWVudC5zZXRSZXNUeXBlKHRvTWVyZ2VFbGVtZW50LmdldFJlc1R5cGUoKSk7Ci0gICAgCX0KLSAgICAJCi0gICAgCWlmKCFiYXNlRWxlbWVudC5pc1NldFJlc0F1dGgoKSl7Ci0gICAgCQliYXNlRWxlbWVudC5zZXRSZXNBdXRoKHRvTWVyZ2VFbGVtZW50LmdldFJlc0F1dGgoKSk7Ci0gICAgCX0KLSAgICAJCi0gICAgCWlmKCFiYXNlRWxlbWVudC5pc1NldFJlc1NoYXJpbmdTY29wZSgpKXsKLSAgICAJCWJhc2VFbGVtZW50LnNldFJlc1NoYXJpbmdTY29wZSh0b01lcmdlRWxlbWVudC5nZXRSZXNTaGFyaW5nU2NvcGUoKSk7Ci0gICAgCX0KLSAgICAJCi0gICAgCWlmKGJhc2VFbGVtZW50LmdldE1hcHBlZE5hbWUoKSA9PSBudWxsKXsKLSAgICAJCWJhc2VFbGVtZW50LnNldE1hcHBlZE5hbWUodG9NZXJnZUVsZW1lbnQuZ2V0TWFwcGVkTmFtZSgpKTsKLSAgICAJfQotCi0KLSAgICB9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShPYmplY3QgYmFzZSwgT2JqZWN0IHRvTWVyZ2UpIHsKLQkJY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoKFJlc291cmNlUmVmKSBiYXNlLCAoUmVzb3VyY2VSZWYgKXRvTWVyZ2UpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9TZXJ2aWNlUmVmc01lcmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvU2VydmljZVJlZnNNZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjZTA0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9TZXJ2aWNlUmVmc01lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKLQotLyoqCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VSZWZzTWVyZ2VyIGV4dGVuZHMgQmFzZVJlZnNNZXJnZXIgewotCi0KLSAgLyoqCi0gICAqICBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLiAKLSAgICogCi0gICAqIEBwYXJhbSBiYXNlIC0gYmFzZSBsaXN0IHdpdGggc2VydmljZSByZWZlcmVuY2VzLgotICAgKiAgICAgICAgICAgICAgIHRoYXQgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgYW5kIGFyZSByZXN1bHQgb2YgdGhlIG1lcmdlLiAKLSAgICogQHBhcmFtIHRvTWVyZ2UgLSB0b01lcmdlIGxpc3QgdG8gYmUgaW1wb3J0ZWQgaW4gYmFzZSBsaXN0LgotICAgKi8KLSAgcHVibGljIFNlcnZpY2VSZWZzTWVyZ2VyKExpc3QgX2Jhc2VSZWZzLCBMaXN0IF90b01lcmdlUmVmcykgewotICAgIHN1cGVyKF9iYXNlUmVmcywgX3RvTWVyZ2VSZWZzKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5tb2RlbC5tZXJnZXJzLmNvbW1vbi5Nb2RlbEVsZW1lbnRzTWVyZ2VyI3Byb2Nlc3MoKQotICAgKi8KLSAgcHVibGljIExpc3QgcHJvY2VzcygpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgTGlzdCB3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKE9iamVjdCBvVG9NZXJnZSA6IGdldFRvTWVyZ2VFbGVtZXRzKCkpIHsKLSAgICAgIFNlcnZpY2VSZWYgc2Vydml2Y2VSZWYgPSAoU2VydmljZVJlZikgb1RvTWVyZ2U7Ci0gICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICBmb3IgKE9iamVjdCBvQmFzZSA6IGdldEJhc2VFbGVtZW50cygpKSB7Ci0gICAgICAgIFNlcnZpY2VSZWYgU2VydmljZVJlZkJhc2UgPSAoU2VydmljZVJlZikgb0Jhc2U7Ci0gICAgICAgIGlmIChTZXJ2aWNlUmVmQmFzZS5nZXRTZXJ2aWNlUmVmTmFtZSgpLmVxdWFscyhzZXJ2aXZjZVJlZi5nZXRTZXJ2aWNlUmVmTmFtZSgpKSl7Ci0gICAgICAgICAgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoU2VydmljZVJlZkJhc2UsIHNlcnZpdmNlUmVmKTsKLSAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmb3VuZCl7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZ2V0QmFzZUVsZW1lbnRzKCkuYWRkKEVjb3JlVXRpbC5jb3B5KChFT2JqZWN0KSBvVG9NZXJnZSkpOwotICAgIH0KLSAgICByZXR1cm4gd2FybmluZ3M7Ci0gIH0KLQotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShPYmplY3QgYmFzZSwgT2JqZWN0IHRvTWVyZ2UpIHsKLSAgICBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZSgoU2VydmljZVJlZikgYmFzZSwgKFNlcnZpY2VSZWYpIHRvTWVyZ2UpOwotICB9Ci0gIHByb3RlY3RlZCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKFNlcnZpY2VSZWYgYmFzZSwgU2VydmljZVJlZiB0b01lcmdlKSB7Ci0gICAgaWYgKGJhc2UuZ2V0TWFwcGVkTmFtZSgpID09IG51bGwpewotICAgICAgYmFzZS5zZXRNYXBwZWROYW1lKHRvTWVyZ2UuZ2V0TWFwcGVkTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBpZiAoYmFzZS5nZXRXc2RsRmlsZSgpID09IG51bGwpewotICAgICAgYmFzZS5zZXRXc2RsRmlsZSh0b01lcmdlLmdldFdzZGxGaWxlKCkpOwotICAgIH0KLSAgICAvLwkgIGlmIChiYXNlLmdldFNlcnZpY2VJbnRlcmZhY2UoKS5lcXVhbHMoImphdmF4LnhtbC53cy5TZXJ2aWNlIikpIHsKLSAgICBpZiAoYmFzZS5nZXRTZXJ2aWNlSW50ZXJmYWNlKCkgPT0gbnVsbCkgewotICAgICAgYmFzZS5zZXRTZXJ2aWNlSW50ZXJmYWNlKHRvTWVyZ2UuZ2V0U2VydmljZUludGVyZmFjZSgpKTsKLSAgICB9Ci0gICAgLy8JICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiN2IxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmplZSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmplZSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5lamIiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUud2ViIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvSkVFUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvamVlL0pFRVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA5MWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvSkVFUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBKRUVQbHVnaW4gZXh0ZW5kcyBXVFBQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmplZSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgSkVFUGx1Z2luIHBsdWdpbjsKLQkKLQlwcml2YXRlIEpFRVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSkVFUGx1Z2luKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkVFUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luI2dldFBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBKRUVQcmVmZXJlbmNlcyBnZXRKRUVQcmVmZXJlbmNlcygpIHsKLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMucHJlZmVyZW5jZXMgPSBuZXcgSkVFUHJlZmVyZW5jZXModGhpcyk7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBsdWdpblByZWZlcmVuY2VzKCkgewotCQlnZXRKRUVQcmVmZXJlbmNlcygpLmluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvSkVFUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvSkVFUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1NDgwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvamVlL0pFRVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyNiwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgSkVFUHJlZmVyZW5jZXMgewotCi0JcHVibGljIGludGVyZmFjZSBLZXlzIHsKLQkJCi0JCQotCi0JfQotCi0JCi0KLQkKLQotCXByaXZhdGUgUGx1Z2luIG93bmVyID0gbnVsbDsKLQlwcml2YXRlIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gcGVyc2lzdE9uQ2hhbmdlID0gZmFsc2U7Ci0KLQlwdWJsaWMgSkVFUHJlZmVyZW5jZXMoUGx1Z2luIG93bmVyKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCi0JCS8vIHBsYWNlaG9sZGVyCi0JCS8vIHdlIGhhZCB0byBtb3ZlIGdlbmVyYXRlX2RkIHRvIGpzdC5qMmVlIGFzIGpzdC5qZWUgaXMgbm90IGluIHRoZSBwcmUtcmVxIG9mIG1hbnkgcGx1Zy1pbnMKLQl9Ci0KLQkKLQotCQotCi0JCi0JcHVibGljIHZvaWQgZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCkgewotCQlpZiAoaXNQZXJzaXN0T25DaGFuZ2UoKSkKLQkJCXBlcnNpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJzaXN0KCkgewotCQlnZXRPd25lcigpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGVyc2lzdE9uQ2hhbmdlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdE9uQ2hhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0T25DaGFuZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBlcnNpc3RPbkNoYW5nZQotCSAqICAgICAgICAgICAgVGhlIHBlcnNpc3RPbkNoYW5nZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdE9uQ2hhbmdlKGJvb2xlYW4gcGVyc2lzdE9uQ2hhbmdlKSB7Ci0JCXRoaXMucGVyc2lzdE9uQ2hhbmdlID0gcGVyc2lzdE9uQ2hhbmdlOwotCX0KLQotCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMucHJlZmVyZW5jZXMgPSBnZXRPd25lcigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3duZXIuCi0JICovCi0JcHJpdmF0ZSBQbHVnaW4gZ2V0T3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBib29sZWFuLXZhbHVlZCBwcm9wZXJ0eSB3aXRoIHRoZQotCSAqIGdpdmVuIG5hbWUuCi0JICogVGhlIGdpdmVuIG5hbWUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHRoZSBib29sZWFuLXZhbHVlZCBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBib29sZWFuLXZhbHVlZCBwcm9wZXJ0eSB3aXRoIHRoZQotCSAqIGdpdmVuIG5hbWUuIFRoZSBnaXZlbiBuYW1lIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KRUVEZXBsb3lhYmxlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KRUVEZXBsb3lhYmxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDk1NTZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvSkVFRGVwbG95YWJsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5KMkVFRmxleFByb2pEZXBsb3lhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Qcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlOwotCi0vKioKLSAqIEoyRUUgbW9kdWxlIGZhY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRUVEZXBsb3lhYmxlRmFjdG9yeSBleHRlbmRzIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgewotCXByb3RlY3RlZCBNYXAgPElNb2R1bGUsIE1vZHVsZURlbGVnYXRlPiBtb2R1bGVEZWxlZ2F0ZXMgPSBuZXcgSGFzaE1hcDxJTW9kdWxlLCBNb2R1bGVEZWxlZ2F0ZT4oNSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qc3QuamVlLnNlcnZlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBKRUVEZXBsb3lhYmxlRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIGNyZWF0ZU1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmKGNvbXAgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gY3JlYXRlTW9kdWxlRGVsZWdhdGVzKGNvbXApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZSB7QGxpbmsgI2NyZWF0ZU1vZHVsZShJUHJvamVjdCl9IGluc3RlYWQuCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAcGFyYW0gbmF0dXJlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJTW9kdWxlW10gY3JlYXRlTW9kdWxlcyhNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSkgewotCQlpZihuYXR1cmUgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gY3JlYXRlTW9kdWxlcyhuYXR1cmUuZ2V0UHJvamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTW9kdWxlRGVsZWdhdGUgZ2V0TW9kdWxlRGVsZWdhdGUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTW9kdWxlRGVsZWdhdGUgbWQgPSAoTW9kdWxlRGVsZWdhdGUpIG1vZHVsZURlbGVnYXRlcy5nZXQobW9kdWxlKTsKLQotCQlpZiAobWQgPT0gbnVsbCkgewotCQkJY3JlYXRlTW9kdWxlcyhtb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQkJCW1kID0gKE1vZHVsZURlbGVnYXRlKSBtb2R1bGVEZWxlZ2F0ZXMuZ2V0KG1vZHVsZSk7Ci0JCX0KLQotCQlyZXR1cm4gbWQ7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2R1bGVbXSBjcmVhdGVNb2R1bGVEZWxlZ2F0ZXMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWlmKGNvbXBvbmVudCA9PSBudWxsKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpc3QgcHJvamVjdE1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKRUVQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSBudWxsOwotCQkJCVN0cmluZyB0eXBlID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RUeXBlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCWlmICh0eXBlICE9IG51bGwgJiYgIXR5cGUuZXF1YWxzKCIiKSkgewotCQkJCQlTdHJpbmcgdmVyc2lvbiA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VmVyc2lvbihjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCQkJbW9kdWxlID0gY3JlYXRlTW9kdWxlKGNvbXBvbmVudC5nZXREZXBsb3llZE5hbWUoKSwgY29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpLCB0eXBlLCB2ZXJzaW9uLCBjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCQkJSkVFRmxleFByb2pEZXBsb3lhYmxlIG1vZHVsZURlbGVnYXRlID0gbmV3IEpFRUZsZXhQcm9qRGVwbG95YWJsZShjb21wb25lbnQuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpOwotCQkJCQltb2R1bGVEZWxlZ2F0ZXMucHV0KG1vZHVsZSwgbW9kdWxlRGVsZWdhdGUpOwotCQkJCQlwcm9qZWN0TW9kdWxlcy5hZGQobW9kdWxlKTsKLQkJCQl9Ci0JCQkJLy8gQ2hlY2sgdG8gYWRkIGFueSBiaW5hcnkgbW9kdWxlcwotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OLmVxdWFscyh0eXBlKSkKLQkJCQkJcHJvamVjdE1vZHVsZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY3JlYXRlQmluYXJ5TW9kdWxlcyhjb21wb25lbnQpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOwotCQl9Ci0JCXJldHVybiAoSU1vZHVsZVtdKSBwcm9qZWN0TW9kdWxlcy50b0FycmF5KG5ldyBJTW9kdWxlW3Byb2plY3RNb2R1bGVzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlW10gY3JlYXRlQmluYXJ5TW9kdWxlcyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJTGlzdCBwcm9qZWN0TW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wb25lbnQgPSByZWZlcmVuY2VzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCS8vIElzIHJlZmVyZW5jZWQgY29tcG9uZW50IGEgSjJFRSBiaW5hcnkgbW9kdWxlIGFyY2hpdmUgb3IgYmluYXJ5Ci0JCQkvLyB1dGlsaXR5IHByb2plY3Q/Ci0JCQlpZiAobW9kdWxlQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQotCQkJCUphdmFFRVF1aWNrUGVlayBxcCA9IEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5nZXRKYXZhRUVRdWlja1BlZWsobW9kdWxlQ29tcG9uZW50KTsKLQkJCQkvLyBJZiBpdCBpcyBub3QgYSBqMmVlIG1vZHVsZSBhbmQgdGhlIGNvbXBvbmVudCBwcm9qZWN0IGlzIHRoZQotCQkJCS8vIGVhciwgaXQgaXMganVzdCBhbiBhcmNoaXZlCi0JCQkJLy8gYW5kIHdlIGNhbiBpZ25vcmUgYXMgaXQgd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhlIEVBUgotCQkJCS8vIGRlcGxveWFibGUubWVtYmVycygpIG1ldGhvZAotCQkJCWlmIChxcC5nZXRUeXBlKCkgPT0gSmF2YUVFUXVpY2tQZWVrLlVOS05PV04pIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIG1vZHVsZVR5cGUgPSBudWxsOwotCQkJCVN0cmluZyBtb2R1bGVWZXJzaW9uID0gbnVsbDsKLQotCQkJCXN3aXRjaCAocXAuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU6Ci0JCQkJCW1vZHVsZVR5cGUgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLldFQl9UWVBFOgotCQkJCQltb2R1bGVUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuRUpCX1RZUEU6Ci0JCQkJCW1vZHVsZVR5cGUgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLkVKQjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQ09OTkVDVE9SX1RZUEU6Ci0JCQkJCW1vZHVsZVR5cGUgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLkpDQTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fVFlQRToKLQkJCQkJbW9kdWxlVHlwZSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuRU5URVJQUklTRV9BUFBMSUNBVElPTjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJbW9kdWxlVHlwZSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuVVRJTElUWTsKLQkJCQkJbW9kdWxlVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8wX1RFWFQ7Ci0JCQkJfQotCi0JCQkJaW50IHZlcnNpb24gPSBxcC5nZXRWZXJzaW9uKCk7Ci0JCQkJbW9kdWxlVmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKHZlcnNpb24pOwotCi0JCQkJSU1vZHVsZSBuZXN0ZWRNb2R1bGUgPSBjcmVhdGVNb2R1bGUobW9kdWxlQ29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpLCBtb2R1bGVDb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCksIG1vZHVsZVR5cGUsIG1vZHVsZVZlcnNpb24sIG1vZHVsZUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCWlmIChuZXN0ZWRNb2R1bGUgIT0gbnVsbCkgewotCQkJCQlKMkVFRmxleFByb2pEZXBsb3lhYmxlIG1vZHVsZURlbGVnYXRlID0gbmV3IEoyRUVGbGV4UHJvakRlcGxveWFibGUobW9kdWxlQ29tcG9uZW50LmdldFByb2plY3QoKSwgbW9kdWxlQ29tcG9uZW50KTsKLQkJCQkJbW9kdWxlRGVsZWdhdGVzLnB1dChuZXN0ZWRNb2R1bGUsIG1vZHVsZURlbGVnYXRlKTsKLQkJCQkJcHJvamVjdE1vZHVsZXMuYWRkKG5lc3RlZE1vZHVsZSk7Ci0JCQkJCW1vZHVsZURlbGVnYXRlLmdldFVSSShuZXN0ZWRNb2R1bGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAoSU1vZHVsZVtdKSBwcm9qZWN0TW9kdWxlcy50b0FycmF5KG5ldyBJTW9kdWxlW3Byb2plY3RNb2R1bGVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRoYXQgdGhlIG1vZHVsZSBzaG91bGQgbGlzdGVuIHRvIGZvciBzdGF0ZQotCSAqIGNoYW5nZXMuIFRoZSBwYXRocyBzaG91bGQgYmUgcHJvamVjdCByZWxhdGl2ZSBwYXRocy4gU3ViY2xhc3NlcyBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZSBwYXRocy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgcGF0aHMKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGhbXSBnZXRMaXN0ZW5lclBhdGhzKCkgewotCQlyZXR1cm4gbmV3IElQYXRoW10geyBuZXcgUGF0aCgiLnByb2plY3QiKSwgLy8gbmF0dXJlCi0JCQkJbmV3IFBhdGgoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpLCAvLyBjb21wb25lbnQKLQkJCQluZXcgUGF0aCgiLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnhtbCIpIC8vIGZhY2V0cwotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckNhY2hlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIuY2xlYXJDYWNoZShwcm9qZWN0KTsKLQkJTGlzdDxJTW9kdWxlPiBtb2R1bGVzVG9SZW1vdmUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yPElNb2R1bGU+IGl0ZXJhdG9yID0gbW9kdWxlRGVsZWdhdGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG1vZHVsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKSB7Ci0JCQkJaWYgKG1vZHVsZXNUb1JlbW92ZSA9PSBudWxsKSB7Ci0JCQkJCW1vZHVsZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJCQl9Ci0JCQkJbW9kdWxlc1RvUmVtb3ZlLmFkZChtb2R1bGUpOwotCQkJfQotCQl9Ci0JCWlmIChtb2R1bGVzVG9SZW1vdmUgIT0gbnVsbCkgewotCQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXNUb1JlbW92ZSkgewotCQkJCW1vZHVsZURlbGVnYXRlcy5yZW1vdmUobW9kdWxlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvSkVFRmxleFByb2pEZXBsb3lhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvamVlL2ludGVybmFsL2RlcGxveWFibGVzL0pFRUZsZXhQcm9qRGVwbG95YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTc3OTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvSkVFRmxleFByb2pEZXBsb3lhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklFSkJNb2RlbEV4dGVuZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5KMkVFRmxleFByb2pEZXBsb3lhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSUVBUk1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotLyoqCi0gKiBKRUUgbW9kdWxlIHN1cGVyY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRUVGbGV4UHJvakRlcGxveWFibGUgZXh0ZW5kcyBKMkVFRmxleFByb2pEZXBsb3lhYmxlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKRUVGbGV4UHJvakRlcGxveWFibGUuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gYUNvbXBvbmVudAotCSAqLwotCXB1YmxpYyBKRUVGbGV4UHJvakRlcGxveWFibGUoSVByb2plY3QgcHJvamVjdCwgSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlzdXBlcihwcm9qZWN0LCBhQ29tcG9uZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSkVFRmxleFByb2pEZXBsb3lhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JcHVibGljIEpFRUZsZXhQcm9qRGVwbG95YWJsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHByb2plY3QpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluY2x1ZGVVdGlsaXR5Q29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wLElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcywgSUVBUk1vZGVsUHJvdmlkZXIgbW9kZWwpIHsKLQkJLy8gSWYgdGhlIGNvbXBvbmVudCBtb2R1bGUgaXMgYW4gRUFSIHdlIGtub3cgYWxsIGFyY2hpdmVzIGFyZSBmaWx0ZXJlZCBvdXQgb2YgdmlydHVhbCBjb21wb25lbnQgbWVtYmVycwotCQkvLyBhbmQgd2Ugd2lsbCByZXR1cm4gb25seSB0aG9zZSBhcmNoaXZlcyB3aGljaCBhcmUgbm90IGJpbmFyeSBKMkVFIG1vZHVsZXMgaW4gdGhlIEVBUiBERC4gIFRoZXNlIEoyRUUgbW9kdWxlcyB3aWxsCi0JCS8vIGJlIHJldHVybmVkIGJ5IGdldENoaWxkTW9kdWxlcygpCi0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpCi0JCQlyZXR1cm4gdmlydHVhbENvbXAgIT0gbnVsbCAmJiB2aXJ0dWFsQ29tcC5pc0JpbmFyeSgpICYmICFpc05lc3RlZEoyRUVNb2R1bGUodmlydHVhbENvbXAsIHJlZmVyZW5jZXMsIG1vZGVsKTsKLQkJZWxzZSAKLQkJCXJldHVybiBzdXBlci5zaG91bGRJbmNsdWRlVXRpbGl0eUNvbXBvbmVudCh2aXJ0dWFsQ29tcCwgcmVmZXJlbmNlcywgbnVsbCk7Ci0JfQotCSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lKFN0cmluZyBlamJOYW1lLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewotICAgIAlpZiAoIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkKLSAgICAJCXJldHVybiBudWxsOwotCi0JCUVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBtb2RIZWxwZXIgPSBudWxsOwotCQlFSkJKYXIgamFyID0gbnVsbDsKLQkJCi0JCUlNb2RlbFByb3ZpZGVyIG1vZGVsID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCWphciA9IChFSkJKYXIpIG1vZGVsLmdldE1vZGVsT2JqZWN0KCk7Ci0JCQlTZXNzaW9uQmVhbiBiZWFuID0gZ2V0U2Vzc2lvbkJlYW5OYW1lZChqYXIsIGVqYk5hbWUpOwotCQkJbW9kSGVscGVyID0gSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLklOU1RBTkNFLmdldEVKQk1vZHVsZUV4dGVuc2lvbihudWxsKTsKLQkJCXJldHVybiBtb2RIZWxwZXIgPT0gbnVsbCA/IG51bGwgOiBtb2RIZWxwZXIuZ2V0SmF2YUVFSk5ESU5hbWUoamFyLCBiZWFuLCBpbnRlcmZhY2VOYW1lKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotICAgIC8qKgotICAgICAqIFJldHVybiBMaXN0IG9mIFNlc3Npb24gYmVhbnMgaW4gdGhpcyBqYXIuCi0gICAgICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uQmVhbiBnZXRTZXNzaW9uQmVhbk5hbWVkKEVKQkphciBqYXIsIFN0cmluZyBiZWFuTmFtZSkgewotICAgIAkKLSAgICAJRW50ZXJwcmlzZUJlYW5zIGFsbEJlYW5zID0gamFyLmdldEVudGVycHJpc2VCZWFucygpOwotICAgIAlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsQmVhbnMuZ2V0U2Vzc2lvbkJlYW5zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU2Vzc2lvbkJlYW4gYmVhbiA9IChTZXNzaW9uQmVhbikgaXRlcmF0b3IubmV4dCgpOwotICAgIAkJaWYgKGJlYW4uZ2V0RWpiTmFtZSgpLmVxdWFscyhiZWFuTmFtZSkpCi0gICAgCQkJcmV0dXJuIGJlYW47Ci0gICAgCX0KLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGFpbmVkVVJJKElNb2R1bGUgbW9kdWxlKSB7Ci0gICAgCWlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQgfHwgaXNCaW5hcnlNb2R1bGVBcmNoaXZlKG1vZHVsZSkpCi0gICAgCQlyZXR1cm4gbmV3IFBhdGgobW9kdWxlLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKTsKLSAgICAJCi0gICAgCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChtb2R1bGUuZ2V0UHJvamVjdCgpKTsKLSAgICAJU3RyaW5nIGFVUkkgPSBudWxsOwotICAgIAlpZiAoY29tcCE9bnVsbCAmJiBjb21wb25lbnQhPW51bGwgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkvL1RPRE8gd2hlbiBuZXcgSkVFIG1vZGVsIGFwaSBpcyBhdmFpbGFibGUgbG9vayBhdCB0aGlzIGNvZGUgYWdhaW4KLSAgICAJCS8vIHNlZSBidWcgMTgzMzIwCi0gICAgCQlJVmlydHVhbFJlZmVyZW5jZSBbXSByZWZzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLSAgICAJCWZvcihpbnQgaT0wOyBpPHJlZnMubGVuZ3RoOyBpKyspewotICAgIAkJCWlmKHJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmVxdWFscyhjb21wKSl7Ci0gICAgCQkJCWFVUkkgPSByZWZzW2ldLmdldEFyY2hpdmVOYW1lKCk7Ci0gICAgCQkJCWJyZWFrOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJCUVBUkFydGlmYWN0RWRpdCBlYXJFZGl0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZWFyRWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXBvbmVudCk7Ci0JCQkJaWYgKGVhckVkaXQgIT0gbnVsbCkKLQkJCQkJYVVSSSA9IGVhckVkaXQuZ2V0TW9kdWxlVVJJKGNvbXApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZWFyRWRpdCAhPSBudWxsKQotCQkJCQllYXJFZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLSAgICAJfQotICAgIAlpZiAoYVVSSSAhPW51bGwgJiYgYVVSSS5sZW5ndGgoKT4xICYmIGFVUkkuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0gICAgCQlhVVJJID0gYVVSSS5zdWJzdHJpbmcoMSk7Ci0gICAgCXJldHVybiBhVVJJOwotCX0gCi0gICAgCi0gICAgcHJvdGVjdGVkIElNb2R1bGUgZ2F0aGVyTW9kdWxlUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ICkgewotICAgIAlJTW9kdWxlIG1vZHVsZSA9IHN1cGVyLmdhdGhlck1vZHVsZVJlZmVyZW5jZShjb21wb25lbnQsIHRhcmdldENvbXBvbmVudCk7Ci0gICAgCS8vIEhhbmRsZSBiaW5hcnkgbW9kdWxlIGNvbXBvbmVudHMKLSAgICAJaWYgKHRhcmdldENvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgewotICAgIAkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSB8fCB0YXJnZXRDb21wb25lbnQuZ2V0UHJvamVjdCgpIT1jb21wb25lbnQuZ2V0UHJvamVjdCgpKQotICAgIAkJCW1vZHVsZSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKEpFRURlcGxveWFibGVGYWN0b3J5LklEKyI6Iit0YXJnZXRDb21wb25lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgIAl9Ci0JCXJldHVybiBtb2R1bGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgY29tcG9uZW50IGlzIG5lc3RlZCBKMkVFIG1vZHVsZSBvbiB0aGUgYXBwbGljYXRpb24ueG1sIG9mIHRoaXMgRUFSCi0gICAgICogQHBhcmFtIGFDb21wb25lbnQKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gaXMgcGFzc2VkIGluIGNvbXBvbmVudCBhIG5lc3RlZCBKMkVFIG1vZHVsZSBvbiB0aGlzIEVBUgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc05lc3RlZEoyRUVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCwgSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzLCBJRUFSTW9kZWxQcm92aWRlciBtb2RlbCkgewotICAgIAlpZiAobW9kZWw9PW51bGwpIAotCQkJcmV0dXJuIGZhbHNlOwotCQlBcHBsaWNhdGlvbiBhcHAgPSAoQXBwbGljYXRpb24pbW9kZWwuZ2V0TW9kZWxPYmplY3QoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gZ2V0UmVmZXJlbmNlTmFtZWQocmVmZXJlbmNlcyxhQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCS8vIEVuc3VyZSBtb2R1bGUgVVJJIGV4aXN0cyBvbiBFQVIgREQgZm9yIGJpbmFyeSBhcmNoaXZlCi0JCXJldHVybiBhcHAuZ2V0Rmlyc3RNb2R1bGUocmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCkpICE9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0MTdjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0Lld0cFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWFyY3JlYXRpb24uSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEVhckZhY2V0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIGZpbmFsIE9iamVjdCBjZmcsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlJRGF0YU1vZGVsIG1vZGVsID0gKElEYXRhTW9kZWwpIGNmZzsKLQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQkJLy8gQWRkIFdUUCBuYXR1cmVzLgotCi0JCQlXdHBVdGlscy5hZGROYXR1cmVzdG9FQVIocHJvamVjdCk7Ci0KLQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LCBmYWxzZSk7Ci0JCQljLmNyZWF0ZSgwLCBudWxsKTsKLQotCQkJZmluYWwgSVZpcnR1YWxGb2xkZXIgZWFycm9vdCA9IGMuZ2V0Um9vdEZvbGRlcigpOwotCQkJZWFycm9vdC5jcmVhdGVMaW5rKG5ldyBQYXRoKCIvIiArIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFTlRfRElSKSksIDAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJCXRyeSB7Ci0JCQkJKChJRGF0YU1vZGVsT3BlcmF0aW9uKSBtb2RlbC5nZXRQcm9wZXJ0eShGYWNldERhdGFNb2RlbFByb3ZpZGVyLk5PVElGSUNBVElPTl9PUEVSQVRJT04pKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlpZihtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0REKSl7Ci0JCQkJLy8gQ3JlYXRlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHdlYi54bWwpIGlmIG9uZSBkb2Vzbid0IGV4aXN0Ci0JCQkJSUZpbGUgYXBwWG1sRmlsZSA9IGVhcnJvb3QuZ2V0VW5kZXJseWluZ0ZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpKTsKLQkJCQlpZiAoIWFwcFhtbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKCFhcHBYbWxGaWxlLmdldFBhcmVudCgpLmV4aXN0cygpCi0JCQkJCQkJCSYmIChhcHBYbWxGaWxlLmdldFBhcmVudCgpLmdldFR5cGUoKSA9PSAgSVJlc291cmNlLkZPTERFUikpewotCQkJCQkJCSgoSUZvbGRlcilhcHBYbWxGaWxlLmdldFBhcmVudCgpKS5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCQlmaW5hbCBTdHJpbmcgYXBwWG1sQ29udGVudHMgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48YXBwbGljYXRpb24gaWQ9XCJBcHBsaWNhdGlvbl9JRFwiIHZlcnNpb249XCI1XCIgeG1sbnM9XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhzaTpzY2hlbWFMb2NhdGlvbj1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNS54c2RcIj5cbiA8ZGlzcGxheS1uYW1lPiIgKyBwcm9qZWN0LmdldE5hbWUoKSArICAiPC9kaXNwbGF5LW5hbWU+IFxuIDwvYXBwbGljYXRpb24+ICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWFwcFhtbEZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShhcHBYbWxDb250ZW50cy5nZXRCeXRlcygiVVRGLTgiKSksIHRydWUsIG1vbml0b3IpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhhZDBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWFyY3JlYXRpb24uSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkphdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEVhckZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBmaW5hbCBPYmplY3QgY2ZnLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJSURhdGFNb2RlbCBtb2RlbCA9IChJRGF0YU1vZGVsKSBjZmc7Ci0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCi0JCQlTZXQgZGVwZW5kZW50UHJvamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJZGVwZW5kZW50UHJvamVjdHMuYWRkQWxsKChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5KMkVFX1BST0pFQ1RTX0xJU1QpKTsKLQkJCWRlcGVuZGVudFByb2plY3RzLmFkZEFsbCgoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QUk9KRUNUX0xJU1QpKTsKLQkJCWlmICghZGVwZW5kZW50UHJvamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJTGlzdCBkZXBlbmRlbnRDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdChkZXBlbmRlbnRQcm9qZWN0cy5zaXplKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXBlbmRlbnRQcm9qZWN0cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlQcm9qZWN0IGRlcFByb2plY3QgPSAoSVByb2plY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgZGVwQ29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGRlcFByb2plY3QpOwotCQkJCQlpZiAoZGVwQ29tcCA9PSBudWxsKSB7Ci0JCQkJCQlKYXZhUHJvamVjdE1pZ3JhdGlvbk9wZXJhdGlvbiB1dGlsT3AgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5jcmVhdGVGbGV4SmF2YVByb2plY3RGb3JQcm9qZWN0T3BlcmF0aW9uKGRlcFByb2plY3QpOwotCQkJCQkJdXRpbE9wLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQkJCQlkZXBDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZGVwUHJvamVjdCk7Ci0JCQkJCX0KLQotCQkJCQlkZXBlbmRlbnRDb21wb25lbnRzLmFkZChkZXBDb21wKTsKLQkJCQl9Ci0KLQkJCQlmaW5hbCBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgYyk7Ci0JCQkJTGlzdCBtb2RMaXN0ID0gKExpc3QpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJCQltb2RMaXN0LmFkZEFsbChkZXBlbmRlbnRDb21wb25lbnRzKTsKLQkJCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kTGlzdCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCWZpbmFsbHkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9jb250ZW50dHlwZS9KRUVDb250ZW50RGVzY3JpYmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9jb250ZW50dHlwZS9KRUVDb250ZW50RGVzY3JpYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWZjMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvY29udGVudHR5cGUvSkVFQ29udGVudERlc2NyaWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKLQotLyoqCi0gKiBBIGNvbnRlbnQgZGVzY3JpYmVyIGZvciBkZXRlY3RpbmcgYSBqMmVlIG1vZHVsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSkVFQ29udGVudERlc2NyaWJlciBpbXBsZW1lbnRzIElDb250ZW50RGVzY3JpYmVyIHsKLQlwdWJsaWMgSkVFQ29udGVudERlc2NyaWJlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgSkVFVkVSU0lPTiA9IG5ldyBRdWFsaWZpZWROYW1lKCJqZWUtdmVyc2lvbiIsICI1LjAiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhjb250ZW50cyk7Ci0JCXN3aXRjaCAocXVpY2tQZWVrLmdldFR5cGUoKSkgewotCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9DTElFTlRfVFlQRToKLQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fVFlQRToKLQkJCXN3aXRjaCAocXVpY2tQZWVrLmdldFZlcnNpb24oKSkgewotCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuSkVFXzVfMF9JRDoKLQkJCQlyZXR1cm4gVkFMSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gSU5WQUxJRDsKLQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuRUpCX1RZUEU6Ci0JCQlzd2l0Y2ggKHF1aWNrUGVlay5nZXRWZXJzaW9uKCkpIHsKLQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkVKQl8zXzBfSUQ6Ci0JCQkJcmV0dXJuIFZBTElEOwotCQkJfQotCQkJcmV0dXJuIElOVkFMSUQ7Ci0JCWNhc2UgSmF2YUVFUXVpY2tQZWVrLldFQl9UWVBFOgotCQkJc3dpdGNoIChxdWlja1BlZWsuZ2V0VmVyc2lvbigpKSB7Ci0JCQljYXNlIEphdmFFRVF1aWNrUGVlay5XRUJfMl81X0lEOgotCQkJCXJldHVybiBWQUxJRDsKLQkJCX0KLQkJCXJldHVybiBJTlZBTElEOwotCQl9Ci0KLQkJcmV0dXJuIElOVkFMSUQ7Ci0JfQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCi0JCXJldHVybiBuZXcgUXVhbGlmaWVkTmFtZVtdIHsgSkVFVkVSU0lPTiB9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvQXBwQ2xpZW50NU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL0FwcENsaWVudDVNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MjUwYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvQXBwQ2xpZW50NU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LklBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEFwcENsaWVudDVNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSkVFNU1vZGVsUHJvdmlkZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlQ1X0NPTlRFTlRfVFlQRSA9ICJvcmcuZWNsaXBzZS5qc3QuamVlLmVlNWFwcGNsaWVudEREIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBBcHBDbGllbnQ1TW9kZWxQcm92aWRlcihJUHJvamVjdCBwcm9qKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvaiA9IHByb2o7Ci0JCXNldERlZmF1bHRSZXNvdXJjZVBhdGgobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyI2dldE1vZGVsT2JqZWN0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsUGF0aCkgewotCQlJQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSBhcHBSZXMgPSAoSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpZ2V0TW9kZWxSZXNvdXJjZShtb2RlbFBhdGgpOwotCQlpZiAoYXBwUmVzICE9IG51bGwgJiYgYXBwUmVzLmdldFJvb3RPYmplY3QoKSAhPSBudWxsKSAKLQkJCXJldHVybiBhcHBSZXMuZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSB7Ci0JCXJldHVybiBBUFBDTElFTlQ1X0NPTlRFTlRfVFlQRTsKLQl9Ci0JcHVibGljIHZvaWQgcG9wdWxhdGVSb290KFhNTFJlc291cmNlSW1wbCByZXMsIFN0cmluZyBuYW1lKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IgZGQgPSBBcHBsaWNhdGlvbmNsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJZGQuZ2V0WE1MTlNQcmVmaXhNYXAoKS5wdXQoIiIsIEoyRUVDb25zdGFudHMuSkFWQUVFX05TX1VSTCk7ICAvLyROT04tTkxTLTEkCi0JCWRkLmdldFhNTE5TUHJlZml4TWFwKCkucHV0KCJ4c2kiLCBKMkVFQ29uc3RhbnRzLlhTSV9OU19VUkwpOyAvLyROT04tTkxTLTEkCi0JCWRkLmdldFhTSVNjaGVtYUxvY2F0aW9uKCkucHV0KEoyRUVDb25zdGFudHMuSkFWQUVFX05TX1VSTCwgSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NDSEVNQV9MT0NfNSk7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50IGNsaWVudCA9IEFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXBwbGljYXRpb25DbGllbnQoKTsKLQkJRGlzcGxheU5hbWUgZG4gPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZSgpOwotCQlkbi5zZXRWYWx1ZShuYW1lKTsKLQkJY2xpZW50LmdldERpc3BsYXlOYW1lcygpLmFkZChkbik7Ci0JCWRkLnNldEFwcGxpY2F0aW9uQ2xpZW50KGNsaWVudCk7Ci0JCWNsaWVudC5zZXRWZXJzaW9uKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV9URVhUKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKChFT2JqZWN0KSBkZCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL0FwcENsaWVudDVNb2RlbFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvQXBwQ2xpZW50NU1vZGVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNTc1ODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvQXBwQ2xpZW50NU1vZGVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50NU1vZGVsUHJvdmlkZXJGYWN0b3J5IGltcGxlbWVudHMgSU1vZGVsUHJvdmlkZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEFwcENsaWVudDVNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiBuZXcgQXBwQ2xpZW50NU1vZGVsUHJvdmlkZXIoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9FQVI1TW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvRUFSNU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjZDQ4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9FQVI1TW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JRUFSTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLklBcHBsaWNhdGlvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBFQVI1TW9kZWxQcm92aWRlciBleHRlbmRzIEpFRTVNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUVBUk1vZGVsUHJvdmlkZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQVI1X0NPTlRFTlRfVFlQRSA9ICJvcmcuZWNsaXBzZS5qc3QuamVlLmVlNWVhckREIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBFQVI1TW9kZWxQcm92aWRlcihJUHJvamVjdCBwcm9qKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvaiA9IHByb2o7Ci0JCXNldERlZmF1bHRSZXNvdXJjZVBhdGgobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpKTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZURlc2NyaWJlcigpIHsKLQkJcmV0dXJuIEVBUjVfQ09OVEVOVF9UWVBFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyI2dldE1vZGVsT2JqZWN0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsUGF0aCkgewotCQlJQXBwbGljYXRpb25SZXNvdXJjZSBlYXJSZXMgPSAoSUFwcGxpY2F0aW9uUmVzb3VyY2UpZ2V0TW9kZWxSZXNvdXJjZShtb2RlbFBhdGgpOwotCQlpZiAoZWFyUmVzICE9IG51bGwgJiYgZWFyUmVzLmdldFJvb3RPYmplY3QoKSAhPSBudWxsKSAKLQkJCXJldHVybiBlYXJSZXMuZ2V0QXBwbGljYXRpb24oKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNb2R1bGVVUkkoSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvaik7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIFtdIHJlZnMgPSBjb21wLmdldFJlZmVyZW5jZXMoKTsKLQkJZm9yKGludCBpPTA7IGk8cmVmcy5sZW5ndGg7IGkrKyl7Ci0JCQlpZihyZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5lcXVhbHMobW9kdWxlQ29tcCkpewotCQkJCXJldHVybiByZWZzW2ldLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGNvbnRleHQgcm9vdCBpbiB0aGlzIGFwcGxpY2F0aW9uIGZvciB0aGUgcGFzc2VkIGluIHdlYiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSB3ZWJQcm9qZWN0Ci0JICogQHJldHVybiBjb250ZXh0Um9vdCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlYkNvbnRleHRSb290KElQcm9qZWN0IHdlYlByb2plY3QpIHsKLQkJaWYgKHdlYlByb2plY3QgPT0gbnVsbCB8fCAhSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdCh3ZWJQcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCB3ZWJDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQod2ViUHJvamVjdCk7Ci0JCVN0cmluZyB3ZWJNb2R1bGVVUkkgPSBnZXRNb2R1bGVVUkkod2ViQ29tcCk7Ci0JCWlmICh3ZWJNb2R1bGVVUkkgIT0gbnVsbCkgewotCQkJTW9kdWxlIHdlYk1vZHVsZSA9IChNb2R1bGUpICgoQXBwbGljYXRpb24pZ2V0TW9kZWxPYmplY3QoKSkuZ2V0TW9kdWxlKHdlYk1vZHVsZVVSSSwgbnVsbCk7Ci0JCQlpZiAod2ViTW9kdWxlICE9IG51bGwpCi0JCQkJcmV0dXJuIHdlYk1vZHVsZS5nZXRXZWIoKS5nZXRDb250ZXh0Um9vdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZVJvb3QoWE1MUmVzb3VyY2VJbXBsIHJlcywgU3RyaW5nIG5hbWUpIHsKLQkJQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciBkZCA9IEFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlkZC5nZXRYTUxOU1ByZWZpeE1hcCgpLnB1dCgiIiwgSjJFRUNvbnN0YW50cy5KQVZBRUVfTlNfVVJMKTsgIC8vJE5PTi1OTFMtMSQKLQkJZGQuZ2V0WE1MTlNQcmVmaXhNYXAoKS5wdXQoInhzaSIsIEoyRUVDb25zdGFudHMuWFNJX05TX1VSTCk7IC8vJE5PTi1OTFMtMSQKLQkJZGQuZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5wdXQoSjJFRUNvbnN0YW50cy5KQVZBRUVfTlNfVVJMLCBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NDSEVNQV9MT0NfNSk7Ci0JCUFwcGxpY2F0aW9uIGVhciA9IEFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXBwbGljYXRpb24oKTsKLQkJRGlzcGxheU5hbWUgZG4gPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZSgpOwotCQlkbi5zZXRWYWx1ZShuYW1lKTsKLQkJZWFyLmdldERpc3BsYXlOYW1lcygpLmFkZChkbik7Ci0JCWVhci5zZXRWZXJzaW9uKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV9URVhUKTsKLQkJZGQuc2V0QXBwbGljYXRpb24oZWFyKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKChFT2JqZWN0KSBkZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIGNvbnRleHQgcm9vdCBvbiB0aGUgYXBwbGljYXRpb24gZm9yIHRoZSBwYXNzZWQgaW4gY29udGV4dFJvb3QuCi0JICogCi0JICogQHBhcmFtIHdlYlByb2plY3QKLQkgKiBAcGFyYW0gYUNvbnRleHRSb290Ci0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQ29udGV4dFJvb3QoSVByb2plY3Qgd2ViUHJvamVjdCwgU3RyaW5nIGFDb250ZXh0Um9vdCkgewotCQlpZiAod2ViUHJvamVjdCA9PSBudWxsIHx8ICFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHdlYlByb2plY3QpKQotCQkJcmV0dXJuOwotCQlJVmlydHVhbENvbXBvbmVudCB3ZWJDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQod2ViUHJvamVjdCk7Ci0JCVN0cmluZyB3ZWJNb2R1bGVVUkkgPSBnZXRNb2R1bGVVUkkod2ViQ29tcCk7Ci0JCWlmICh3ZWJNb2R1bGVVUkkgIT0gbnVsbCkgewotCQkJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChXZWJNb2R1bGUpICgoQXBwbGljYXRpb24pZ2V0TW9kZWxPYmplY3QoKSkuZ2V0TW9kdWxlKHdlYk1vZHVsZVVSSSwgbnVsbCk7Ci0JCQlpZiAod2ViTW9kdWxlICE9IG51bGwpCi0JCQkJd2ViTW9kdWxlLnNldENvbnRleHRSb290KGFDb250ZXh0Um9vdCk7Ci0JCQkvLyBUT0RPIC0gc2hvdWxkIHRoaXMgbWV0aG9kIHNhdmU/ICBPciBzaG91bGQgdGhlIGNhbGxlciBiZSByZXF1aXJlZCB0byBzYXZlPwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvRUFSNU1vZGVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9FQVI1TW9kZWxQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2NDgzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9FQVI1TW9kZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFQVI1TW9kZWxQcm92aWRlckZhY3RvcnkgaW1wbGVtZW50cyBJTW9kZWxQcm92aWRlckZhY3RvcnkgewotCi0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgRUFSNU1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIG5ldyBFQVI1TW9kZWxQcm92aWRlcihjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL0pFRTVNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9KRUU1TW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDMwMDk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL0pFRTVNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5GbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkVudGVycHJpc2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXZhZWVSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5KRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5QbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyOwotCi1wdWJsaWMgY2xhc3MgSkVFNU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTW9kZWxQcm92aWRlciwgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIsIFJlc291cmNlU3RhdGVWYWxpZGF0b3IsIElNb2RlbFByb3ZpZGVyTGlzdGVuZXJ7Ci0KLQlwcm90ZWN0ZWQgWE1MUmVzb3VyY2VJbXBsIHdyaXRhYmxlUmVzb3VyY2U7Ci0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2o7Ci0JcHJvdGVjdGVkIElQYXRoIGRlZmF1bHRSZXNvdXJjZVBhdGg7Ci0JcHJvdGVjdGVkIFJlc291cmNlU3RhdGVWYWxpZGF0b3Igc3RhdGVWYWxpZGF0b3I7Ci0JcHJvdGVjdGVkIFJlc291cmNlQWRhcHRlciByZXNvdXJjZUFkYXB0ZXIgPSBuZXcgUmVzb3VyY2VBZGFwdGVyKCk7Ci0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JLy9wcml2YXRlIHN0YXRpYyBib29sZWFuIHJlc291cmNlQ2hhbmdlTGlzdGVuZXJFbmFibGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIExpc3QgbW9kZWxSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQKLQkJCQkJJiYgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChudWxsKSA9PSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEKSB7Ci0JCQkJcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgbm90aWZpY2F0aW9uLmdldE9sZEJvb2xlYW5WYWx1ZSgpLCBub3RpZmljYXRpb24uZ2V0TmV3Qm9vbGVhblZhbHVlKCkpOwotCQkJfSBlbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19NT0RJRklFRCkKLQkJCQlyZXNvdXJjZUNoYW5nZWQoKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEpFRTVNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoSVByb2plY3QgcHJvajIpIHsKLQkJcmV0dXJuIChQcm9qZWN0UmVzb3VyY2VTZXQpV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2opOwotCX0KLQotCXB1YmxpYyBYTUxSZXNvdXJjZUltcGwgZ2V0V3JpdGFibGVSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHdyaXRhYmxlUmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V3JpdGFibGVSZXNvdXJjZShYTUxSZXNvdXJjZUltcGwgd3JpdGFibGVSZXNvdXJjZSkgewotCQl0aGlzLndyaXRhYmxlUmVzb3VyY2UgPSB3cml0YWJsZVJlc291cmNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXNvdXJjZUNoYW5nZWQoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChoYXNMaXN0ZW5lcnMoKSkgewotCQkJaW50IGV2ZW50Q29kZSA9IE1vZGVsUHJvdmlkZXJFdmVudC5LTk9XTl9SRVNPVVJDRVNfQ0hBTkdFRDsKLQkJCU1vZGVsUHJvdmlkZXJFdmVudCBldnQgPSBuZXcgTW9kZWxQcm92aWRlckV2ZW50KGV2ZW50Q29kZSwgdGhpcywgcHJvaik7Ci0JCQlldnQuYWRkUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhldnQpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlc291cmNlSXNMb2FkZWRDaGFuZ2VkKFJlc291cmNlIGFSZXNvdXJjZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlpZiAoaGFzTGlzdGVuZXJzKCkpIHsKLQkJCWludCBldmVudENvZGUgPSBuZXdWYWx1ZSA/IE1vZGVsUHJvdmlkZXJFdmVudC5MT0FERURfUkVTT1VSQ0UgOiBNb2RlbFByb3ZpZGVyRXZlbnQuVU5MT0FERURfUkVTT1VSQ0U7Ci0JCQlNb2RlbFByb3ZpZGVyRXZlbnQgZXZ0ID0gbmV3IE1vZGVsUHJvdmlkZXJFdmVudChldmVudENvZGUsIHRoaXMsIHByb2opOwotCQkJZXZ0LmFkZFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZXZ0KTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgYWRkTWFuYWdlZFJlc291cmNlKFhNTFJlc291cmNlSW1wbCByZXMpIHsKLQkJbW9kZWxSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCWlmICghcmVzLmVBZGFwdGVycygpLmNvbnRhaW5zKHJlc291cmNlQWRhcHRlcikpCi0JCQlyZXMuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlQWRhcHRlcik7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuICFsaXN0ZW5lcnMuaXNFbXB0eSgpOwotCX0KLQkKLQlwcml2YXRlIFVSSSBnZXRNb2R1bGVVUkkoVVJJIHVyaSkgewotCQlVUkkgbW9kdWxldXJpID0gTW9kdWxlVVJJVXRpbC5mdWxseVF1YWxpZnlVUkkocHJvaixnZXRDb250ZW50VHlwZURlc2NyaWJlcigpKTsKLQkJSVBhdGggcmVxdWVzdFBhdGggPSBuZXcgUGF0aChtb2R1bGV1cmkucGF0aCgpKS5hcHBlbmQobmV3IFBhdGgodXJpLnBhdGgoKSkpOwotCQlVUkkgcmVzb3VyY2VVUkkgPSBVUkkuY3JlYXRlVVJJKFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5NT0RVTEVfUFJPVE9DT0wgKyByZXF1ZXN0UGF0aC50b1N0cmluZygpKTsKLQkJcmV0dXJuIHJlc291cmNlVVJJOwotCX0KLQotCXByb3RlY3RlZCBYTUxSZXNvdXJjZUltcGwgZ2V0TW9kZWxSZXNvdXJjZShJUGF0aCBtb2RlbFBhdGgpIHsKLQkJaWYgKHdyaXRhYmxlUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJYWRkTWFuYWdlZFJlc291cmNlKHdyaXRhYmxlUmVzb3VyY2UpOwotCQkJcmV0dXJuIHdyaXRhYmxlUmVzb3VyY2U7Ci0JCX0KLQkJaWYgKChtb2RlbFBhdGggPT0gbnVsbCkgfHwgbW9kZWxQYXRoLmVxdWFscyhJTW9kZWxQcm92aWRlci5GT1JDRVNBVkUpKQotCQkJbW9kZWxQYXRoID0gZ2V0RGVmYXVsdFJlc291cmNlUGF0aCgpOwotCQlQcm9qZWN0UmVzb3VyY2VTZXQgcmVzU2V0ID0gZ2V0UmVzb3VyY2VTZXQocHJvaik7Ci0JCUlWaXJ0dWFsRm9sZGVyIGNvbnRhaW5lciA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2opLmdldFJvb3RGb2xkZXIoKTsKLQkJU3RyaW5nIG1vZGVsUGF0aFVSSSA9IG1vZGVsUGF0aC50b1N0cmluZygpOwotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShtb2RlbFBhdGhVUkkpOwotCQkKLQkJSVBhdGggcHJvalVSSVBhdGggPSBuZXcgUGF0aCgiIik7Ly8kTk9OLU5MUy0xJAotCQlwcm9qVVJJUGF0aCA9IHByb2pVUklQYXRoLmFwcGVuZChjb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJcHJvalVSSVBhdGggPSBwcm9qVVJJUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQlwcm9qVVJJUGF0aCA9IHByb2pVUklQYXRoLmFwcGVuZChtb2RlbFBhdGgpOwotCQlVUkkgcHJvalVSSSA9IFVSSS5jcmVhdGVVUkkocHJvalVSSVBhdGgudG9TdHJpbmcoKSk7Ci0JCVhNTFJlc291cmNlSW1wbCByZXMgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHByb2ouZ2V0RmlsZShwcm9qVVJJLnRvU3RyaW5nKCkpLmV4aXN0cygpKQotCQkJewotCQkJCXJlcyA9IChYTUxSZXNvdXJjZUltcGwpIHJlc1NldC5nZXRSZXNvdXJjZShnZXRNb2R1bGVVUkkodXJpKSx0cnVlKTsKLQkJCQlhZGRNYW5hZ2VkUmVzb3VyY2UocmVzKTsKLS8vCQkJCWlmICghcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lckVuYWJsZWQpCi0vLwkJCQl7Ci0vLwkJCQkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lckVuYWJsZWQgPSB0cnVlOwotLy8JCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCksIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLS8vCQkJCX0KLQkJCX0gZWxzZSB7Ly9GaXJzdCBmaW5kIGluIHJlc291cmNlIHNldCwgdGhlbiBjcmVhdGUgaWYgbm90IGZvdW5kIG5ldyBFbXB0eSBSZXNvdXJjZS4KLQkJCQlYTUxSZXNvdXJjZUltcGwgbmV3UmVzID0gIGNyZWF0ZU1vZGVsUmVzb3VyY2UobW9kZWxQYXRoLCByZXNTZXQsIHByb2pVUkkpOwotCQkJCWFkZE1hbmFnZWRSZXNvdXJjZShuZXdSZXMpOwotCQkJCXJldHVybiBuZXdSZXM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKQotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZSB0aHJvdyBleDsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQotCXByb3RlY3RlZCBYTUxSZXNvdXJjZUltcGwgY3JlYXRlTW9kZWxSZXNvdXJjZShJUGF0aCBtb2RlbFBhdGgsIFByb2plY3RSZXNvdXJjZVNldCByZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQkvLyBGaXJzdCB0cnkgdG8gZmluZCBleGlzdGluZyBjYWNoZWQgcmVzb3VyY2UuCi0JCVhNTFJlc291cmNlSW1wbCByZXMgPSAoWE1MUmVzb3VyY2VJbXBsKXJlc291cmNlU2V0LmdldFJlc291cmNlKGdldE1vZHVsZVVSSSh1cmkpLCBmYWxzZSk7Ci0JCWlmIChyZXMgPT0gbnVsbCB8fCAhcmVzLmlzTG9hZGVkKCkpIHsKLQkJCS8vIENyZWF0ZSB0ZW1wIHJlc291cmNlIGlmIG5vIGZpbGUgZXhpc3RzCi0JCQlyZXM9ICAoWE1MUmVzb3VyY2VJbXBsKSgoRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQpcmVzb3VyY2VTZXQpLmNyZWF0ZVJlc291cmNlKGdldE1vZHVsZVVSSSh1cmkpLFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkodXJpLCBnZXRDb250ZW50VHlwZShnZXRDb250ZW50VHlwZURlc2NyaWJlcigpKSkpOwotCQkJcG9wdWxhdGVSb290KHJlcywgcmVzb3VyY2VTZXQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZVJvb3QoWE1MUmVzb3VyY2VJbXBsIHJlcywgU3RyaW5nIHN0cmluZykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCXByaXZhdGUgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGVEZXNjcmliZXIpIHsKLQkJCi0JCQlpZiAoY29udGVudFR5cGVEZXNjcmliZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVEZXNjcmliZXIpLmdldERlZmF1bHREZXNjcmlwdGlvbigpOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCX0KLQotCXB1YmxpYyBJUGF0aCBnZXREZWZhdWx0UmVzb3VyY2VQYXRoKCkgewotCQlyZXR1cm4gZGVmYXVsdFJlc291cmNlUGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0UmVzb3VyY2VQYXRoKElQYXRoIGRlZmF1bHRSZXNvdXJjZVBhdGgpIHsKLQkJdGhpcy5kZWZhdWx0UmVzb3VyY2VQYXRoID0gZGVmYXVsdFJlc291cmNlUGF0aDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KCkgewotCQlyZXR1cm4gZ2V0TW9kZWxPYmplY3QoZ2V0RGVmYXVsdFJlc291cmNlUGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsUGF0aCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBVc2VkIHRvIG9wdGlvbmFsbHkgZGVmaW5lIGFuIGFzc29jaWF0ZWQgY29udGVudCB0eXBlIGZvciBYTUwgZmlsZSBjcmVhdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlRGVzY3JpYmVyKCkgewotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoSVBhdGggbW9kZWxQYXRoLCBPYmplY3QgY29udGV4dCkgewotCQlpZiAobW9kZWxQYXRoID09IG51bGwpCi0JCQltb2RlbFBhdGggPSBnZXREZWZhdWx0UmVzb3VyY2VQYXRoKCk7Ci0JCUlXb3Jrc3BhY2Ugd29yayA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoZ2V0TW9kZWxSZXNvdXJjZShtb2RlbFBhdGgpKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQlJRmlsZVtdIGZpbGVzID0geyBmaWxlIH07Ci0JCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJCWNvbnRleHQgPSBJV29ya3NwYWNlLlZBTElEQVRFX1BST01QVDsKLQkJCXJldHVybiB3b3JrLnZhbGlkYXRlRWRpdChmaWxlcywgY29udGV4dCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5KFJ1bm5hYmxlIHJ1bm5hYmxlLCBJUGF0aCBtb2RlbFBhdGgpIHsKLQkJLy9BYm91dCB0byBtb2RpZnkgYW5kIHNhdmUgdGhpcyBtb2RlbAotCQl0cnkgewotCQkJSmF2YWVlUmVzb3VyY2VJbXBsIHJlcyA9IChKYXZhZWVSZXNvdXJjZUltcGwpZ2V0TW9kZWxSZXNvdXJjZShtb2RlbFBhdGgpOwotCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCXNldFdyaXRhYmxlUmVzb3VyY2UocmVzKTsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJdHJ5IHsKLQkJCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQkJaWYgKG1vZGVsUGF0aCAhPSBudWxsICYmIG1vZGVsUGF0aC5lcXVhbHMoSU1vZGVsUHJvdmlkZXIuRk9SQ0VTQVZFKSkKLQkJCQkJCXJlcy5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCx0cnVlKTsKLQkJCQkJZWxzZQotCQkJCQkJcmVzLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldFdyaXRhYmxlUmVzb3VyY2UobnVsbCk7Ci0JCX0KLQkJCi0JfQotCi0vLwlwcml2YXRlIGNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0vLwkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0vLwkJCUlSZXNvdXJjZURlbHRhIGRlbHRhPSBldmVudC5nZXREZWx0YSgpOwotLy8JCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBhIGRlbHRhIChzaW5jZSBzb21lIGV2ZW50cyBkb24ndCBoYXZlIG9uZSkKLS8vCQkJaWYgKGRlbHRhICE9IG51bGwpCi0vLwkJCXsKLS8vCQkJCUlSZXNvdXJjZURlbHRhW10gYWZmZWN0ZWRDaGlsZHJlbj0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbihJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCAsIElSZXNvdXJjZS5GSUxFKTsKLS8vCQkJCUlSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSA9IG51bGw7Ci0vLwkJCQlJUmVzb3VyY2UgY2hhbmdlZFJlc291cmNlID0gbnVsbDsgCi0vLwkJCQlJUHJvamVjdCBjaGFuZ2VkUHJvamVjdCA9IG51bGw7Ci0vLwkJCQlJUGF0aCByZXNvdXJjZVBhdGggPSBudWxsOwotLy8KLS8vCQkJCWZvciAoaW50IGk9IDA7IGkgPCBhZmZlY3RlZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJcHJvamVjdERlbHRhID0gYWZmZWN0ZWRDaGlsZHJlbltpXTsKLS8vCQkJCQljaGFuZ2VkUmVzb3VyY2UgPSBwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKTsgCi0vLwkJCQkJY2hhbmdlZFByb2plY3QgPSBjaGFuZ2VkUmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotLy8JCQkJCUhhc2hTZXQ8SVBhdGg+IGN1cnJlbnRSZXNvdXJjZXMgPSBtb2RlbFJlc291cmNlcy5nZXQoY2hhbmdlZFByb2plY3QpOwotLy8JCQkJCS8vIG9ubHkgZGVhbCB3aXRoIHRoZSBwcm9qZWN0cyB0aGF0IGhhdmUgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCAKLS8vCQkJCQlpZiAoY3VycmVudFJlc291cmNlcyAhPSBudWxsKQotLy8JCQkJCXsKLS8vCQkJCQkJLy8gaWYgdGhpcyBpcyBhIHByb2plY3QgZGVsZXRpb24sIHJlbW92ZSB0aGUgcHJvamVjdCBmcm9tIHRoZSBIYXNoTWFwLgotLy8JCQkJCQlpZiAoY2hhbmdlZFJlc291cmNlID09IGNoYW5nZWRQcm9qZWN0ICYmIHByb2plY3REZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkKLS8vCQkJCQkJewotLy8JCQkJCQkJbW9kZWxSZXNvdXJjZXMucmVtb3ZlKGNoYW5nZWRQcm9qZWN0KTsKLS8vCQkJCQkJCS8vIGlmIG1vZGVsUmVzb3VyY2VzIGlzIGVtcHR5LCB3ZSBzaG91bGQgc2VsZi1kZXN0cnVjdAotLy8JCQkJCQkJaWYgKG1vZGVsUmVzb3VyY2VzLmlzRW1wdHkoKSkKLS8vCQkJCQkJCXsKLS8vCQkJCQkJCQlyZXNvdXJjZUNoYW5nZUxpc3RlbmVyRW5hYmxlZCA9IGZhbHNlOwotLy8JCQkJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJCWVsc2UKLS8vCQkJCQkJewotLy8JCQkJCQkJSXRlcmF0b3I8SVBhdGg+IGl0ZXIgPSBjdXJyZW50UmVzb3VyY2VzLml0ZXJhdG9yKCk7Ci0vLwkJCQkJCQlBcnJheUxpc3Q8SVBhdGg+IHRvVW5sb2FkID0gbmV3IEFycmF5TGlzdDxJUGF0aD4oKTsKLS8vCQkJCQkJCS8vIGNoZWNrIGVhY2ggcmVzb3VyY2UgdGhhdCB3YXMgbG9hZGVkIGZyb20gdGhlIHByb2plY3QgdG8gc2VlIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGNoYW5nZQotLy8JCQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotLy8JCQkJCQkJewotLy8JCQkJCQkJCXJlc291cmNlUGF0aCA9IGl0ZXIubmV4dCgpOwotLy8JCQkJCQkJCWlmIChwcm9qZWN0RGVsdGEuZmluZE1lbWJlcihyZXNvdXJjZVBhdGgpICE9IG51bGwpCi0vLwkJCQkJCQkJewotLy8JCQkJCQkJCQkvLyBsaW1pdCB0aGUgbGlzdCBvZiByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlIHVubG9hZGVkIHRvIHRob3NlIHRoYXQgaGF2ZSBjaGFuZ2VkCi0vLwkJCQkJCQkJCXRvVW5sb2FkLmFkZChyZXNvdXJjZVBhdGgpOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLS8vCQkJCQkJCWlmICh0b1VubG9hZC5zaXplKCkgPiAwKQotLy8JCQkJCQkJewotLy8JCQkJCQkJCVJlc291cmNlIGN1cnJlbnQgPSBudWxsOwotLy8JCQkJCQkJCVByb2plY3RSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KGNoYW5nZWRQcm9qZWN0KTsKLS8vCQkJCQkJCQlVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCk7Ci0vLwkJCQkJCQkJSGFzaFNldDxVUkk+IHJlc291cmNlVVJJcyA9IG5ldyBIYXNoU2V0PFVSST4oKTsKLS8vCQkJCQkJCQlpdGVyID0gdG9VbmxvYWQuaXRlcmF0b3IoKTsKLS8vCQkJCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0vLwkJCQkJCQkJewotLy8JCQkJCQkJCQkvLyBjb252ZXJ0IGFsbCBvZiB0aGUgcmVzb3VyY2VzIHRvIFVSSXMgLSB0aGlzIGlzIGEgZmFzdGVyIG1hdGNoIGR1cmluZyB0aGUgY29tcGFyZQotLy8JCQkJCQkJCQlyZXNvdXJjZVVSSXMuYWRkKHVyaUNvbnZlcnRlci5ub3JtYWxpemUoVVJJLmNyZWF0ZVVSSShpdGVyLm5leHQoKS50b1N0cmluZygpKSkpOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCQlJdGVyYXRvcjxSZXNvdXJjZT4gaXRlcjIgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOwotLy8JCQkJCQkJCXdoaWxlIChpdGVyMi5oYXNOZXh0KCkpCi0vLwkJCQkJCQkJewotLy8JCQkJCQkJCQljdXJyZW50ID0gaXRlcjIubmV4dCgpOwotLy8JCQkJCQkJCQlpZiAocmVzb3VyY2VVUklzLmNvbnRhaW5zKGN1cnJlbnQuZ2V0VVJJKCkpKQotLy8JCQkJCQkJCQl7Ci0vLwkJCQkJCQkJCQljdXJyZW50LnVubG9hZCgpOwotLy8JCQkJCQkJCQl9Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkvKioKLQkgKiBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgbmVlZCB0byBiZSBzYXZlZCAoaS5lLiwgbm8gb3RoZXIgcmVmZXJlbmNlcykuCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxzQ2hhbmdlZChJTW9kZWxQcm92aWRlckV2ZW50IGFuRXZlbnQpIHsKLQkJaW50IGNvZGUgPSBhbkV2ZW50LmdldEV2ZW50Q29kZSgpOwotCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCWNhc2UgSU1vZGVsUHJvdmlkZXJFdmVudC5SRU1PVkVEX1JFU09VUkNFIDogewotCQkJCWlmIChoYXNSZXNvdXJjZVJlZmVyZW5jZShhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKSkpCi0JCQkJCXJlbW92ZVJlc291cmNlcyhhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGhhc0xpc3RlbmVycygpKSB7Ci0JCQlhbkV2ZW50LnNldE1vZGVsKHRoaXMpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGFuRXZlbnQpOwotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlcyhMaXN0IGFMaXN0KSB7Ci0JCVJlc291cmNlIHJlczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhTGlzdC5zaXplKCk7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSBhTGlzdC5nZXQoaSk7Ci0JCQlyZW1vdmVSZXNvdXJjZShyZXMpIDsKLQkJfQotCX0KLQkvKioKLQkgKiBSZW1vdmUgcmVmZXJlbmNlIHRvIHRoZSBhUmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJYVJlc291cmNlLmVBZGFwdGVycygpLnJlbW92ZShyZXNvdXJjZUFkYXB0ZXIpOwotCQkJcmV0dXJuIGdldFJlc291cmNlcygpLnJlbW92ZShhUmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYW55IFJlc291cmNlIGluIHRoZSBsaXN0IG9mCi0JICogCi0JICogQHJlc291cmNlcyBpcyByZWZlcmVuY2VkIGJ5IG1lLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1Jlc291cmNlUmVmZXJlbmNlKExpc3QgdFJlc291cmNlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChoYXNSZXNvdXJjZVJlZmVyZW5jZSgoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFSZXNvdXJjZSBpcyByZWZlcmVuY2VkIGJ5IG1lLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1Jlc291cmNlUmVmZXJlbmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCkuY29udGFpbnMoYVJlc291cmNlKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mCi0JICogCi0JICogQGFuRXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElNb2RlbFByb3ZpZGVyRXZlbnQgYW5FdmVudCkgewotCQkKLQkJTm90aWZ5UnVubmVyIG5vdGlmaWVyID0gbmV3IE5vdGlmeVJ1bm5lcihhbkV2ZW50KTsgCi0JCQotCQlPYmplY3RbXSBub3RpZnlMaXN0ID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOyAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3RpZnlMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlub3RpZmllci5zZXRMaXN0ZW5lciggKElNb2RlbFByb3ZpZGVyTGlzdGVuZXIpIG5vdGlmeUxpc3RbaV0gKTsKLQkJCVNhZmVSdW5uZXIucnVuKG5vdGlmaWVyKTsKLQkJfQotCX0KLQlwdWJsaWMgY2xhc3MgTm90aWZ5UnVubmVyIGltcGxlbWVudHMgSVNhZmVSdW5uYWJsZSB7IAotCQkKLQkJcHJpdmF0ZSBmaW5hbCBJTW9kZWxQcm92aWRlckV2ZW50IGV2ZW50OwotCQlwcml2YXRlIElNb2RlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXI7Ci0JCQotCQlwdWJsaWMgTm90aWZ5UnVubmVyKElNb2RlbFByb3ZpZGVyRXZlbnQgZXZlbnQpIHsKLQkJCUFzc2VydC5pc05vdE51bGwoZXZlbnQpOwotCQkJdGhpcy5ldmVudCA9IGV2ZW50OwotCQl9Ci0JCQotCQkKLQkJcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsgCi0JCQlKRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpFRVBsdWdpbi5QTFVHSU5fSUQsIDAsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCWlmKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJbGlzdGVuZXIubW9kZWxzQ2hhbmdlZChldmVudCk7IAotCQl9Ci0JCQotCX0KLQlwdWJsaWMgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciBnZXRTdGF0ZVZhbGlkYXRvcigpIHsKLQkJaWYgKHN0YXRlVmFsaWRhdG9yID09IG51bGwpCi0JCQlzdGF0ZVZhbGlkYXRvciA9IGNyZWF0ZVN0YXRlVmFsaWRhdG9yKCk7Ci0JCXJldHVybiBzdGF0ZVZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlU3RhdGVWYWxpZGF0b3IuCi0JICogCi0JICogQHJldHVybiBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yCi0JICovCi0JcHJpdmF0ZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIGNyZWF0ZVN0YXRlVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGNyZWF0ZUFydGlmYWN0RWRpdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tBY3RpdmF0aW9uKHByZXNlbnRlcik7Ci0JCQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBnZXRTdGF0ZVZhbGlkYXRvcigpLmNoZWNrUmVhZE9ubHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tTYXZlKHByZXNlbnRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZ2V0U3RhdGVWYWxpZGF0b3IoKS5sb3N0QWN0aXZhdGlvbihwcmVzZW50ZXIpOwotCQkKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVN0YXRlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwcmVzZW50ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlyZXR1cm4gZ2V0U3RhdGVWYWxpZGF0b3IoKS52YWxpZGF0ZVN0YXRlKHByZXNlbnRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUoTGlzdCByb05vblJlc291cmNlRmlsZXMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vblJlc291cmNlRmlsZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vblJlc291cmNlSW5jb25zaXN0ZW50RmlsZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vZGVsUmVzb3VyY2VzOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJCi0JCQlMaXN0IGxpc3QgPSBnZXRSZXNvdXJjZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCWlmICgoKFJlc291cmNlKSBsaXN0LmdldChpKSkuaXNNb2RpZmllZCgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9BcHBDbGllbnRDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9BcHBDbGllbnRDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY0NmNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcwotCQlDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IEFwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbihtb2RlbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9BcHBDbGllbnRDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0Y2QxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIEFwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbiBleHRlbmRzCi0JCUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQotCXB1YmxpYyBBcHBDbGllbnRDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlcGxveW1lbnRGaWxlcyhJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWZpbmFsIElNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KTsKLQkJcHJvdmlkZXIubW9kaWZ5KG5ldyBSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJfQotCQl9LCBJTW9kZWxQcm92aWRlci5GT1JDRVNBVkUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9DcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMDhiZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9DcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxPcGVyYXRpb24gZXh0ZW5kcwotCQlBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IChJUHJvamVjdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX1BST0pFQ1QpOwotCQljcmVhdGVEZXBsb3ltZW50RmlsZXModGFyZ2V0UHJvamVjdCwgbW9uaXRvcik7Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVwbG95bWVudEZpbGVzKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0NyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0NyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZWI1ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9DcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMKLQkJQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYoSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQuZXF1YWxzKHByb3BlcnR5TmFtZSkpewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChHRU5FUkFURV9ERCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFRBUkdFVF9QUk9KRUNUKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsT3BlcmF0aW9uKG1vZGVsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAxOTY3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0VKQkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEVKQkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMKLQkJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24obW9kZWwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMzg2ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBFSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24gZXh0ZW5kcwotCQlDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxPcGVyYXRpb24gewotCi0KLQlwdWJsaWMgRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXBsb3ltZW50RmlsZXMoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlmaW5hbCBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0JCXByb3ZpZGVyLm1vZGlmeShuZXcgUnVubmFibGUoKXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCX0KLQkJfSwgSU1vZGVsUHJvdmlkZXIuRk9SQ0VTQVZFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzMjA1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0VhckNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEVhckNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMKLQkJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24obW9kZWwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTJhNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBFYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24gZXh0ZW5kcwotCQlDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxPcGVyYXRpb24gewotCi0KLQlwdWJsaWMgRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXBsb3ltZW50RmlsZXMoSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlmaW5hbCBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0JCQlwcm92aWRlci5tb2RpZnkobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIGNvbXBvbmVudFJlZmVyZW5jZXMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFTW9kdWxlUmVmZXJlbmNlcyhjb21wb25lbnQpOwotCQkJCQlpZihjb21wb25lbnRSZWZlcmVuY2VzICE9IG51bGwgJiYgY29tcG9uZW50UmVmZXJlbmNlcy5sZW5ndGggPiAwKXsJCQkJCQotCQkJCQkJZmluYWwgSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgY29tcG9uZW50KTsKLQkJCQkJCUxpc3QgbW9kTGlzdCA9IChMaXN0KSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50UmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSBjb21wb25lbnRSZWZlcmVuY2VzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCQltb2RMaXN0LmFkZChyZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQkJCX0KLQkJCQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBtb2RMaXN0KTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9LCBJTW9kZWxQcm92aWRlci5GT1JDRVNBVkUpOwotCQkJCQotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSUFwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSUFwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkM2JlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0lBcHBDbGllbnRDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotcHVibGljIGludGVyZmFjZSBJQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzCi0JCUlDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuY2xhc3M7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzYWI1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0lDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcwotCQlJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfUFJPSkVDVCA9ICJJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAgYm9vbGVhbiBwcm9wZXJ0eSBmb3IgSmF2YSBFRSA1IHByb2plY3RzLCB0byBjcmVhdGUvbm90IGNyZWF0ZSBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgCi0JICogIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfREQgPSAiSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQiOyAvLyROT04tTkxTLTEkIAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0lFSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0lFSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZDUwZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9JRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVKQkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcwotCQlJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JLyoqCi0JICogVGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIHVzZWQuICBJdCBpcyBub3QgcGFydCBvZiB0aGUgQVBJIGFuZCBtYXkgYmUgbW9kaWZpZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzIF9wcm92aWRlcl9jbGFzcyA9IEVKQkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0lFYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0lFYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMWQ1OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9JRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVhckNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcwotCQlJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JLyoqCi0JICogVGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIHVzZWQuICBJdCBpcyBub3QgcGFydCBvZiB0aGUgQVBJIGFuZCBtYXkgYmUgbW9kaWZpZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzIF9wcm92aWRlcl9jbGFzcyA9IEVhckNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0lXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0lXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MzMzNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9JV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcwotCQlJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JLyoqCi0JICogVGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIHVzZWQuICBJdCBpcyBub3QgcGFydCBvZiB0aGUgQVBJIGFuZCBtYXkgYmUgbW9kaWZpZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzIF9wcm92aWRlcl9jbGFzcyA9IFdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0pFRUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0pFRUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Y2MxMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9KRUVGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKRUVGYWNldEluc3RhbGxEZWxlZ2F0ZSBleHRlbmRzIEoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZSB7Ci0JLy8gdGhpcyBjbGFzcyB1c2VkIHRvIGhhdmUgbWV0aG9kcyBidXQgbm93IGR1ZSB0byByZWZhY3RvcmluZy9tb2RlbCBzdXBwb3J0IGl0IGRvZXMgbm90LgotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9XZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9XZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjZjN2U0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcwotCQlDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IFdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbihtb2RlbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L1dlYkNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9XZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4NmQ0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L1dlYkNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uIGV4dGVuZHMKLQkJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCi0JcHVibGljIFdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVwbG95bWVudEZpbGVzKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJZmluYWwgSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotCi0JCQlwcm92aWRlci5tb2RpZnkobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCQkJCi0JCQkJCS8vIHdlbGNvbWUgZmlsZSBsaXN0Ci0JCQkJCUxpc3Q8U3RyaW5nPiB3ZWxjb21lRmlsZXMgPSBBcnJheXMuYXNMaXN0KAotCQkJCQkJCSJpbmRleC5odG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSJpbmRleC5odG0iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJImluZGV4LmpzcCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkiZGVmYXVsdC5odG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSJkZWZhdWx0Lmh0bSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkiZGVmYXVsdC5qc3AiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKTsKLQkJCQkJCi0JCQkJCS8vIEFkZCB0aGUgd2VsY29tZS1maWxlLWxpc3QgdGFnCi0JCQkJCVdlbGNvbWVGaWxlTGlzdCB3ZWxjb21lRmlsZUxpc3QgPSAoV2VsY29tZUZpbGVMaXN0KSBXZWJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZUxpc3QoKTsKLQkJCQkJd2VsY29tZUZpbGVMaXN0LmdldFdlbGNvbWVGaWxlcygpLmFkZEFsbCh3ZWxjb21lRmlsZXMpOyAKLQkJCQkJd2ViQXBwLmdldFdlbGNvbWVGaWxlTGlzdHMoKS5hZGQod2VsY29tZUZpbGVMaXN0KTsKLQkJCQl9Ci0JCQl9LCBJTW9kZWxQcm92aWRlci5GT1JDRVNBVkUpOwotCQkJCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2xpY2Vuc2UvYmVya2VsZXlfbGljZW5zZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2xpY2Vuc2UvYmVya2VsZXlfbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjJlNjZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9saWNlbnNlL2JlcmtlbGV5X2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPiAgICAgICAgICAgICAgICAgICAgICAgIAotPHRpdGxlPkxpY2Vuc2U8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxwPgotPGI+Q29weXJpZ2h0IDE5OTQtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCAgUmlnaHRzIFJlc2VydmVkLjwvYj4KLTwvcD4gICAgICAKLTxwPlJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAotYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotPC9wPgotPHVsPgotPGxpPlJlZGlzdHJpYnV0aW9uIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzICAKLWxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLjxicj48YnI+PC9saT4KLTxsaT5SZWRpc3RyaWJ1dGlvbiBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCi10aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciAKLW90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uPC9saT4KLTwvdWw+Ci08cD5OZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gb3IgdGhlIG5hbWVzIG9mIGNvbnRyaWJ1dG9ycyBtYXkgCi1iZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotPC9wPgotPHA+VGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAmcXVvdDtBUyBJUywmcXVvdDsgd2l0aG91dCBhIHdhcnJhbnR5IG9mIGFueSBraW5kLiAKLUFMTCBFWFBSRVNTIE9SIElNUExJRUQgQ09ORElUSU9OUywgUkVQUkVTRU5UQVRJT05TIEFORCBXQVJSQU5USUVTLCBJTkNMVURJTkcgCi1BTlkgSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SIAotTk9OLUlORlJJTkdFTUVOVCwgQVJFIEhFUkVCWSBFWENMVURFRC4gU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiAoJnF1b3Q7U1VOJnF1b3Q7KSAKLUFORCBJVFMgTElDRU5TT1JTIFNIQUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIAotQVMgQSBSRVNVTFQgT0YgVVNJTkcsIE1PRElGWUlORyBPUiBESVNUUklCVVRJTkcgVEhJUyBTT0ZUV0FSRSBPUiBJVFMgCi1ERVJJVkFUSVZFUy4gSU4gTk8gRVZFTlQgV0lMTCBTVU4gT1IgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIEFOWSAKLUxPU1QgUkVWRU5VRSwgUFJPRklUIE9SIERBVEEsIE9SIEZPUiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCAKLUNPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwgT1IgUFVOSVRJVkUgREFNQUdFUywgSE9XRVZFUiBDQVVTRUQgQU5EIAotUkVHQVJETEVTUyBPRiBUSEUgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBPUiAKLUlOQUJJTElUWSBUTyBVU0UgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBTVU4gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi08L3A+Ci08cD5Zb3UgYWNrbm93bGVkZ2UgdGhhdCB0aGlzIHNvZnR3YXJlIGlzIG5vdCBkZXNpZ25lZCwgbGljZW5zZWQgb3IgaW50ZW5kZWQgCi1mb3IgdXNlIGluIHRoZSBkZXNpZ24sIGNvbnN0cnVjdGlvbiwgb3BlcmF0aW9uIG9yIG1haW50ZW5hbmNlIG9mIGFueSBudWNsZWFyIGZhY2lsaXR5LgotPC9wPgotPC9ib2R5PgotPC9odG1sPgotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjMwOWJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS5qc3QuamVlCi1CdW5kbGUtTmFtZS4wID0gSkVFIGNvbW1vbiBQbHVnLWluCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotZWU1ZWpiQ29udGVudFR5cGU9SmF2YSBFRSA1IEVKQiBDb250ZW50Ci1lZTV3ZWJDb250ZW50VHlwZT1KYXZhIEVFIDUgV2ViIENvbnRlbnQKLWVlNWVhckNvbnRlbnRUeXBlPUphdmEgRUUgNSBFQVIgQ29udGVudAotZWU1YXBwY2xpZW50Q29udGVudFR5cGU9SmF2YSBFRSA1IEFwcGxpY2F0aW9uIENsaWVudCBDb250ZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDVhZWFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iamVlTW9kZWxFeHRlbnNpb24iIG5hbWU9IkpFRSBNb2RlbCBFeHRlbnNpb24iIHNjaGVtYT0ic2NoZW1hL2plZU1vZGVsRXh0ZW5zaW9uLmV4c2QiLz4KLQotCTwhLS1KIEVFNSAgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgICAgICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5lYXIiIHZlcnNpb249IjUuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8Y29uZmxpY3RzIGdyb3VwPSJtb2R1bGVzIi8+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0ianN0LmphdmEiLz4KLSAgICAgICAgPC9hbmQ+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+ICAgICAKLSAgICAgICAgICAgICAKLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxhY3Rpb24gZmFjZXQ9ImpzdC5lYXIiIHZlcnNpb249IjUuMCIgdHlwZT0iSU5TVEFMTCIgaWQ9ImpzdC5lYXIjNS4wI2luc3RhbGwiPgotICAgICAgCSAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0LkVhckZhY2V0SW5zdGFsbERlbGVnYXRlIi8+Ci0gIAkJICAgPGNvbmZpZy1mYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciIvPgotICAgIDwvYWN0aW9uPgotICAgICAgCi0gICAgPGV2ZW50LWhhbmRsZXIgZmFjZXQ9ImpzdC5lYXIiIHZlcnNpb249IjUuMCIgdHlwZT0iUE9TVF9JTlNUQUxMIj4KLSAgICAgIAkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuRWFyRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgPC9ldmVudC1oYW5kbGVyPiAgCi0gICAgCi0gICAgPGV2ZW50LWhhbmRsZXIgZmFjZXQ9ImpzdC5lYXIiIHZlcnNpb249IjUuMCIgdHlwZT0iUlVOVElNRV9DSEFOR0VEIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5FYXJGYWNldFJ1bnRpbWVIYW5kbGVyJFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUiLz4KLQk8L2V2ZW50LWhhbmRsZXI+ICAgICAKLSAgICAKLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUucmVzb3VyY2VGYWN0b3JpZXMiPgotICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC51dGlsLldlYlJlc291cmNlRmFjdG9yeUltcGwiCi0gICAgICAgICAgIGlzRGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgIHNob3J0U2VnbWVudD0id2ViLnhtbCI+Ci0gICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmplZS5lZTV3ZWJERCI+Ci0gICAgICAgIDwvY29udGVudFR5cGVCaW5kaW5nPgotICAgICA8L3Jlc291cmNlRmFjdG9yeT4KLSAgICAgPHJlc291cmNlRmFjdG9yeQotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbC5FamJSZXNvdXJjZUZhY3RvcnlJbXBsIgotICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICBzaG9ydFNlZ21lbnQ9ImVqYi1qYXIueG1sIj4KLSAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLmVlNWVqYkREIj4KLSAgICAgICAgPC9jb250ZW50VHlwZUJpbmRpbmc+Ci0gICAgIDwvcmVzb3VyY2VGYWN0b3J5PgotICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLnV0aWwuQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUZhY3RvcnlJbXBsIgotICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICBzaG9ydFNlZ21lbnQ9ImFwcGxpY2F0aW9uLWNsaWVudC54bWwiPgotICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUuZWU1YXBwY2xpZW50REQiPgotICAgICAgICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgICAgPC9yZXNvdXJjZUZhY3Rvcnk+Ci0gICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbC5BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeUltcGwiCi0gICAgICAgICAgIGlzRGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgIHNob3J0U2VnbWVudD0iYXBwbGljYXRpb24ueG1sIj4KLSAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLmVlNWVhckREIj4KLSAgICAgICAgPC9jb250ZW50VHlwZUJpbmRpbmc+Ci0gICAgIDwvcmVzb3VyY2VGYWN0b3J5PgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl81LnhzZCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvanNwIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVGYWN0b3JpZXMiPgotICAgICAgPG1vZHVsZUZhY3RvcnkKLSAgICAgICAgICAgIHByb2plY3RzPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuSkVFRGVwbG95YWJsZUZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIiPgotICAgICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgICAgICAgIHR5cGVzPSJqc3QuZWFyIgotICAgICAgICAgICAgICAgdmVyc2lvbnM9IjUuMCI+Ci0gICAgICAgICA8L21vZHVsZVR5cGU+Ci0gICAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgICAgICAgdHlwZXM9ImpzdC5hcHBjbGllbnQiCi0gICAgICAgICAgICAgICB2ZXJzaW9ucz0iNS4wLDEuMiwxLjMsMS40Ij4KLSAgICAgICAgIDwvbW9kdWxlVHlwZT4KLSAgICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICAgICAgICB0eXBlcz0ianN0LndlYiIKLSAgICAgICAgICAgICAgIHZlcnNpb25zPSIyLjUsMi4yLDIuMywyLjQiPgotICAgICAgICAgPC9tb2R1bGVUeXBlPgotICAgICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgICAgICAgIHR5cGVzPSJqc3QuZWpiIgotICAgICAgICAgICAgICAgdmVyc2lvbnM9IjMuMCwxLjEsMi4wLDIuMSI+Ci0gICAgICAgICA8L21vZHVsZVR5cGU+Ci0gICAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgICAgICAgdHlwZXM9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICAgICAgICB2ZXJzaW9ucz0iMS4wLDEuNSI+Ci0gICAgICAgICA8L21vZHVsZVR5cGU+Ci0gICAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotICAgICAgICAgICAgICAgdmVyc2lvbnM9IjEuMCI+Ci0gICAgICAgICA8L21vZHVsZVR5cGU+ICAgICAgICAgCi0gICAgICA8L21vZHVsZUZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAgICAgIDxjb250ZW50LXR5cGUKLSAgICAgICAgICAgIGZpbGUtbmFtZXM9ImVqYi1qYXIueG1sIgotICAgICAgICAgICAgaWQ9ImVlNWVqYkREIgotICAgICAgICAgICAgYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotICAgICAgICAgICAgbmFtZT0iJWVlNWVqYkNvbnRlbnRUeXBlIgotICAgICAgICAgICAgcHJpb3JpdHk9ImhpZ2giPgotICAgICAgICAgPGRlc2NyaWJlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUuY29udGVudHR5cGUuSkVFQ29udGVudERlc2NyaWJlciI+Ci0gICAgICAgICA8L2Rlc2NyaWJlcj4KLSAgICAgIDwvY29udGVudC10eXBlPgotICAJPC9leHRlbnNpb24+ICAgCi0gIAkKLSAgCSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0gICAgICA8Y29udGVudC10eXBlCi0gICAgICAgICAgICBmaWxlLW5hbWVzPSJ3ZWIueG1sIgotICAgICAgICAgICAgaWQ9ImVlNXdlYkREIgotICAgICAgICAgICAgYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotICAgICAgICAgICAgbmFtZT0iJWVlNXdlYkNvbnRlbnRUeXBlIgotICAgICAgICAgICAgcHJpb3JpdHk9ImhpZ2giPgotICAgICAgICAgPGRlc2NyaWJlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUuY29udGVudHR5cGUuSkVFQ29udGVudERlc2NyaWJlciI+Ci0gICAgICAgICA8L2Rlc2NyaWJlcj4KLSAgICAgIDwvY29udGVudC10eXBlPgotICAJPC9leHRlbnNpb24+ICAgCi0gIAkKLSAgCSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0gICAgICA8Y29udGVudC10eXBlCi0gICAgICAgICAgICBmaWxlLW5hbWVzPSJhcHBsaWNhdGlvbi54bWwiCi0gICAgICAgICAgICBpZD0iZWU1ZWFyREQiCi0gICAgICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0gICAgICAgICAgICBuYW1lPSIlZWU1ZWFyQ29udGVudFR5cGUiCi0gICAgICAgICAgICBwcmlvcml0eT0iaGlnaCI+Ci0gICAgICAgICA8ZGVzY3JpYmVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS5jb250ZW50dHlwZS5KRUVDb250ZW50RGVzY3JpYmVyIj4KLSAgICAgICAgIDwvZGVzY3JpYmVyPgotICAgICAgPC9jb250ZW50LXR5cGU+Ci0gIAk8L2V4dGVuc2lvbj4gICAKLSAgCQotICAJCi0gIAkgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotICAgICAgPGNvbnRlbnQtdHlwZQotICAgICAgICAgICAgZmlsZS1uYW1lcz0iYXBwbGljYXRpb24tY2xpZW50LnhtbCIKLSAgICAgICAgICAgIGlkPSJlZTVhcHBjbGllbnRERCIKLSAgICAgICAgICAgIGJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVlZTVhcHBjbGllbnRDb250ZW50VHlwZSIKLSAgICAgICAgICAgIHByaW9yaXR5PSJoaWdoIj4KLSAgICAgICAgIDxkZXNjcmliZXIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLmNvbnRlbnR0eXBlLkpFRUNvbnRlbnREZXNjcmliZXIiPgotICAgICAgICAgPC9kZXNjcmliZXI+Ci0gICAgICA8L2NvbnRlbnQtdHlwZT4KLSAgCTwvZXh0ZW5zaW9uPiAgCi0gIAkKLSAgCTxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVNb2RlbFByb3ZpZGVyIj4KLSAgICAgIAk8cHJvdmlkZXI+Ci0gICAgICAgIAk8bW9kZWxQcm92aWRlciBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwuRUFSNU1vZGVsUHJvdmlkZXJGYWN0b3J5Ii8+CQotICAgICAgCQk8ZmFjZXQgaWQ9ImpzdC5lYXIiIHZlcnNpb25zPSI1LjAiLz4KLSAgICAgIAk8L3Byb3ZpZGVyPgotICA8L2V4dGVuc2lvbj4gCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVNb2RlbFByb3ZpZGVyIj4KLSAgICAgIAk8cHJvdmlkZXI+Ci0gICAgICAgIAk8bW9kZWxQcm92aWRlciBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwuQXBwQ2xpZW50NU1vZGVsUHJvdmlkZXJGYWN0b3J5Ii8+CQotICAgICAgCQk8ZmFjZXQgaWQ9ImpzdC5hcHBjbGllbnQiIHZlcnNpb25zPSI1LjAiLz4KLSAgICAgIAk8L3Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0gIAkgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvc2NoZW1hL2plZU1vZGVsRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvc2NoZW1hL2plZU1vZGVsRXh0ZW5zaW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNmRhNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL3NjaGVtYS9qZWVNb2RlbEV4dGVuc2lvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qZWUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qZWUiIGlkPSJqZWVNb2RlbEV4dGVuc2lvbiIgbmFtZT0iSkVFIE1vZGVsIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImplZU1vZGVsRXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSUQgdXNlZCB0byBpZGVudGlmeSBhIG1vZGVsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJSkVFTW9kZWwgaW50ZXJmYWNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggaW1wbGVtZW50YXRpb24gaXMgYWN0aXZlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZWIzZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzZXJ2bGV0X3VpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5OTEzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotc2VydmxldHVpLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMDliZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5jb20uaWJtLmV0b29scy5jdGMuamF2YXByb2plY3RuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OWE4MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jTW9uIEZlYiAxOCAxNTo1NzowOSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlY2IzY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwNC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5TZXJ2bGV0VUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5WZW5kb3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53ZWIudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aTtidW5kbGUtdmVyc2lvbj0iMS4wLjEwMCIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiZjU2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zb3VyY2UuLiA9IHNlcnZsZXRfdWkvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDg1OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJjMDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZmlsdGVyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdmaWx0ZXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZjYWZjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdmaWx0ZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2xpc3RlbmVyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdsaXN0ZW5lcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWYyYTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2xpc3RlbmVyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWVhZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3c2VydmxldF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhYzZiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYi13aXotYmFubmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYi13aXotYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5NDRlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWItd2l6LWJhbm5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWItd2l6LWljb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViLXdpei1pY29uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhYzZiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWItd2l6LWljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViamF2YS1pY29uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYmphdmEtaWNvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Y2I0ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViamF2YS1pY29uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvd2FyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvd2FyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlY2I3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL3dhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4YWU5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9V1RQIFNlcnZsZXQgVUkgUGx1Zy1pbgotcGx1Z2luVmVuZG9yPUVjbGlwc2Uub3JnCi1jcmVhdGUud2ViLm1vZHVsZV91aV89Q3JlYXRlIGEgSjJFRSBXZWIgTW9kdWxlCi1jcmVhdGUud2ViLnByb2plY3RfdWlfPUNyZWF0ZSBhIEoyRUUgV2ViIG1vZHVsZQotd2ViLmFjdGlvbnMuZGVzY3JpcHRpb25fdWlfPUFjdGlvbnMgZm9yIEoyRUUgV2ViIERldmVsb3BtZW50Ci1jcmVhdGVfc2VydmxldF91aV89Q3JlYXRlIEphdmEgU2VydmxldCBmaWxlCi13YXIuaW1wb3J0LmRlc2NyaXB0aW9uX3VpXz1JbXBvcnQgYW4gZXh0ZXJuYWwgV0FSIGZpbGUgaW50byBhbiBXZWIgcHJvamVjdAotd2FyLmltcG9ydC5hY3Rpb24uZGVzY3JpcHRpb25fdWlfPUltcG9ydCBXQVIgRmlsZS4uLgotd2FyLmV4cG9ydC5kZXNjcmlwdGlvbl91aV89RXhwb3J0IGEgV2ViIHByb2plY3QgaW50byBhIFdBUiBmaWxlCi13YXIuZXhwb3J0LmFjdGlvbi5kZXNjcmlwdGlvbl91aV89RXhwb3J0IFdBUiBGaWxlLi4uCi1XYXJleHBvcnRXaXphcmQubmFtZT1XQVIgZmlsZQotV2FyZXhwb3J0V2l6YXJkLmRlc2NyaXB0aW9uPUV4cG9ydCBhIFdlYiBNb2R1bGUgaW50byBhbiBleHRlcm5hbCBXQVIgZmlsZQotV2FySW1wb3J0V2l6YXJkLm5hbWU9V0FSIGZpbGUKLVdhckltcG9ydFdpemFyZC5kZXNjcmlwdGlvbj1JbXBvcnQgYW4gZXh0ZXJuYWwgV0FSIGZpbGUgaW50byBhIFdlYiBQcm9qZWN0Ci13ZWIuY2F0ZWdvcnlfdWlfPVdlYgotd2ViLnByb2plY3RfdWlfPUR5bmFtaWMgV2ViIFByb2plY3QKLXN0YXRpYy53ZWIucHJvamVjdF91aV89U3RhdGljIFdlYiBQcm9qZWN0Ci1uZXcud2ViLnByb2plY3QuZGVzY3JpcHRpb25fdWlfPUNyZWF0ZSBhIER5bmFtaWMgV2ViIHByb2plY3QKLUNvbnZlcnRXZWJQcm9qZWN0VHlwZT1Db252ZXJ0IFdlYiBQcm9qZWN0Ci1jb252ZXJ0V2ViUHJvamVjdFR5cGVBY3Rpb24ubGFiZWw9Q29udmVydCB0byBhIER5bmFtaWMgV2ViIHByb2plY3QuLi4KLUNvbnZlcnRXZWJQcm9qZWN0VHlwZUFjdGlvbi50b29sdGlwPVdlYiBNb2R1bGUgQ29udmVyc2lvbiBXaXphcmQKLWNvbnZlcnRUb0R5bmFtaWM9Q29udmVydCB0byBXZWIgTW9kdWxlLi4uCi1TZXJ2bGV0V2ViUmVnaW9uV2l6YXJkLm5hbWU9U2VydmxldAotU2VydmxldFdlYlJlZ2lvbldpemFyZC5kZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgU2VydmxldAotU2VydmxldFdlYlJlZ2lvbldpemFyZC50aXRsZT1OZXcgU2VydmxldAotU2VydmxldF9VSV89U2VydmxldC4uLgotRmlsdGVyV2ViUmVnaW9uV2l6YXJkLm5hbWU9RmlsdGVyCi1GaWx0ZXJXZWJSZWdpb25XaXphcmQuZGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IEZpbHRlcgotc2VydmxldEFubm90YXRpb25EZWNvcmF0b3I9U2VydmxldCBBbm5vdGF0aW9uIERlY29yYXRvcgotc2VydmxldEFubm90YXRpb25EZWNvcmF0b3IuZGVzY3JpcHRpb249QWRkcyBhIGRlY29yYXRvciB0byBhbiBhbm5vdGF0ZWQgc2VydmxldC4KLXdlYi1wcm9qZWN0LXdpemFyZC1uYW1lID0gV2ViIFByb2plY3QKLXdlYi1wcm9qZWN0LXdpemFyZC1kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIFdlYiBwcm9qZWN0Ci13ZWJBcHBMaWJyYXJpZXNDb250YWluZXJOYW1lID0gV2ViIEFwcCBMaWJyYXJpZXMKLQotTGlzdGVuZXJXZWJSZWdpb25XaXphcmQubmFtZT1MaXN0ZW5lcgotTGlzdGVuZXJXZWJSZWdpb25XaXphcmQuZGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IEFwcGxpY2F0aW9uIExpZmVjeWNsZSBMaXN0ZW5lcgotCi1lbmhhbmNlZC5qYXZhLmZvci53ZWIubmFtZT1FbmhhbmNlZCBKYXZhIFJlbmRlcmluZyBmb3IgV2ViCi1qMmVlPUphdmEgRUUKLWoyZWUuYWN0aW9ucy5kZXNjcmlwdGlvbl91aV89QWN0aW9ucyBmb3IgSjJFRSBEZXZlbG9wbWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTkxNmJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDwhLS0gQ3JlYXRlIEphdmEgRUUgUHJvamVjdHMgZHJvcCBkb3duIHRvb2xiYXIgYnV0dG9uIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IiVqMmVlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVqMmVlLmFjdGlvbnMuZGVzY3JpcHRpb25fdWlfIgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJlZU1haW5BY3Rpb25TZXQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuTmV3SmF2YUVFQXJ0aWZhY3QiCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0iSjJFRU1haW4iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5OZXdKYXZhRUVBcnRpZmFjdERyb3BEb3duQWN0aW9uIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VydmxldFdlYlJlZ2lvbldpemFyZC5uYW1lIgotICAgICAgICAgICAgICAgc3R5bGU9InB1bGxkb3duIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJVNlcnZsZXRXZWJSZWdpb25XaXphcmQuZGVzY3JpcHRpb24iIC8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5OZXdKYXZhRUVQcm9qZWN0IgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9IkoyRUVNYWluIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuTmV3SmF2YUVFUHJvamVjdERyb3BEb3duQWN0aW9uIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmIgotICAgICAgICAgICAgICAgbGFiZWw9IiV3ZWIucHJvamVjdF91aV8iCi0gICAgICAgICAgICAgICBzdHlsZT0icHVsbGRvd24iCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlbmV3LndlYi5wcm9qZWN0LmRlc2NyaXB0aW9uX3VpXyIgLz4KLSAgICAgIDwvYWN0aW9uU2V0PiAKLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tIFdlYiBNb2R1bGUgV2l6YXJkIC0tPgotICAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJKMkVFVUlQcm9qZWN0V2l6YXJkcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJXdlYi5jYXRlZ29yeV91aV8iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJXdlYi5wcm9qZWN0X3VpXyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotICAgICAgICAgICAgcHJvamVjdD0idHJ1ZSIKLSAgICAgICAgICAgIGZpbmFsUGVyc3BlY3RpdmU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYlByb2plY3RXaXphcmQiPgotICAgICAgICAgPGNsYXNzIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYlByb2plY3RXaXphcmQiPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJqYXZhZWVwcm9qZWN0IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJtZW51SW5kZXgiIHZhbHVlPSIxMCIgLz4KLSAgICAgICAgIDwvY2xhc3M+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlbmV3LndlYi5wcm9qZWN0LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0gICAgICA8L3dpemFyZD4KLQotICAgICAgPCEtLW5ldyBzZXJ2bGV0IGNvbnRyaWJ1dGlvbi0tPgotIAkgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVTZXJ2bGV0V2ViUmVnaW9uV2l6YXJkLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3c2VydmxldF93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZFNlcnZsZXRXaXphcmQiPgotICAgICAgICAgPGNsYXNzIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkU2VydmxldFdpemFyZCI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImphdmFlZWFydGlmYWN0IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJtZW51SW5kZXgiIHZhbHVlPSIxMCIgLz4KLSAgICAgICAgIDwvY2xhc3M+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlU2VydmxldFdlYlJlZ2lvbldpemFyZC5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgCi0gICAgICA8IS0tbmV3IGZpbHRlciBjb250cmlidXRpb24tLT4gICAgICAKLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld2ZpbHRlcl93aXouZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRGaWx0ZXJXaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlRmlsdGVyV2ViUmVnaW9uV2l6YXJkLm5hbWUiPgotICAgICAgICAgPGNsYXNzIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkRmlsdGVyV2l6YXJkIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iamF2YWVlYXJ0aWZhY3QiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmRleCIgdmFsdWU9IjIwIiAvPgotICAgICAgICAgPC9jbGFzcz4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVGaWx0ZXJXZWJSZWdpb25XaXphcmQuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICAgIAotICAgICAgPCEtLW5ldyBsaXN0ZW5lciBjb250cmlidXRpb24tLT4KLSAJICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlTGlzdGVuZXJXZWJSZWdpb25XaXphcmQubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdsaXN0ZW5lcl93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZExpc3RlbmVyV2l6YXJkIj4KLSAgICAgICAgIDxjbGFzcyBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZExpc3RlbmVyV2l6YXJkIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iamF2YWVlYXJ0aWZhY3QiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmRleCIgdmFsdWU9IjMwIiAvPgotICAgICAgICAgPC9jbGFzcz4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVMaXN0ZW5lcldlYlJlZ2lvbldpemFyZC5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgIDwvZXh0ZW5zaW9uPgotICAgICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiV3ZWIuY2F0ZWdvcnlfdWlfIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiPgotICAgICAgPC9jYXRlZ29yeT4gICAgICAgICAKLSAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlV2FySW1wb3J0V2l6YXJkLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRJbXBvcnRXaXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdhckltcG9ydFdpemFyZC5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICAgIAotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJXdlYi5jYXRlZ29yeV91aV8iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSI+Ci0gICAgICA8L2NhdGVnb3J5PiAgICAgICAgIAotICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVXYXJleHBvcnRXaXphcmQubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV2FyZXhwb3J0V2l6YXJkLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLmV4dGVuZGFibGVXaXphcmQiPgotICAgICAgPGV4dGVuZGFibGVXaXphcmQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5XZWJNb2R1bGVDcmVhdGlvbldpemFyZCI+Ci0gICAgICA8L2V4dGVuZGFibGVXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotCQk8YWN0aW9uU2V0Ci0JCQlsYWJlbD0iJUNvbnZlcnRXZWJQcm9qZWN0VHlwZSIKLQkJCWRlc2NyaXB0aW9uPSIlQ29udmVydFdlYlByb2plY3RUeXBlIgotCQkJdmlzaWJsZT0idHJ1ZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5hY3Rpb25zLkNvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb25TZXQiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlY29udmVydFdlYlByb2plY3RUeXBlQWN0aW9uLmxhYmVsIgotCQkJCXRvb2x0aXA9IiVDb252ZXJ0V2ViUHJvamVjdFR5cGVBY3Rpb24udG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0icHJvamVjdC9hZGRpdGlvbnMiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmFjdGlvbnMuQ29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbiIKLQkJCQllbmFibGVzRm9yPSIxIgotCQkJCWlkPSJjb252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uIj4gICAKLQkJCQk8ZW5hYmxlbWVudD4KLQkJCQkJPGFuZD4KLQkJCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgotCQkJCQkJPCEtLTxvYmplY3RTdGF0ZQotCSAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZmFjZXQiCi0JICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0id3N0LndlYiI+Ci0JICAgICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4gLS0+Ci0JCQkJCTwvYW5kPgotCQkJCTwvZW5hYmxlbWVudD4gICAgICAgICAgICAKLQkJCTwvYWN0aW9uPgotCQk8L2FjdGlvblNldD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZCA9ICJjb252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBsYWJlbD0iJXN0YXRpYy53ZWIucHJvamVjdF91aV8iCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0iQ29udmVydFdlYlByb2plY3RUeXBlIj4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgIG5hbWU9IkNvbnZlcnRXZWJQcm9qZWN0VHlwZSI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgPGFjdGlvbgotCQkJCWxhYmVsPSIlY29udmVydFdlYlByb2plY3RUeXBlQWN0aW9uLmxhYmVsIgotCQkJCXRvb2x0aXA9IiVDb252ZXJ0V2ViUHJvamVjdFR5cGVBY3Rpb24udG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iQ29udmVydFdlYlByb2plY3RUeXBlL0NvbnZlcnRXZWJQcm9qZWN0VHlwZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuYWN0aW9ucy5Db252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uIgotCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJaWQ9ImNvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb24iPgotCQk8L2FjdGlvbj4KLQkJPGVuYWJsZW1lbnQ+Ci0JCSAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJ3c3Qud2ViIiAvPgotCQkJCQk8L2FkYXB0PgotCQk8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gIAotICAgIDwvZXh0ZW5zaW9uPgotCi0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UuZXRvb2xzLnNlcnZlci5jb3JlLm1vZHVsZU9iamVjdEFkYXB0ZXJzIC0tPgotPCEtLSBQdXJwb3NlOiBEZWZpbmUgYWRhcHRlcnMgZm9yIFdlYiByZXNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlQXJ0aWZhY3RBZGFwdGVycyI+ICAKLSAgICAgIAotICAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViLnNlcnZlci53ZWJyZXNvdXJjZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+ICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIi8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPiAKLSAgICAgIAotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWIuc2VydmVyLndlYnJlc291cmNlMiIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPiAgICAgIAotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuU2VydmxldCIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICAgCi0gICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWIuc2VydmVyLndlYnJlc291cmNlMyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+ICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3Qud2ViOjIuNF0iIC8+Ci0JCQkgPC9hZGFwdD4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPiAgICAgCi0gICAgICAgCi0gICAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViLnNlcnZlci53ZWJyZXNvdXJjZTQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWI6Mi40XSIgLz4KLQkJCSA8L2FkYXB0PgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0KLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViLnNlcnZlci53ZWJyZXNvdXJjZTUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgIAotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ij4KLSAgICAgICAgICAgICA8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWI6Mi40XSIgLz4KLQkJCTwvYWRhcHQ+CQkJCSAgICAgICAgICAgICAKLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgPC9mYWN0b3J5PgotICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQiPgotICAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgPC9mYWN0b3J5PgotICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICA8L2ZhY3Rvcnk+IAotICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5TZXJ2bGV0Ij4KLSAgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgICAKLSAgIDwvZXh0ZW5zaW9uPiAgCi0gIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICBMYWJlbCBEZWNvcmF0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+Ci0gICAgICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICAgICBsaWdodHdlaWdodD0idHJ1ZSIKLSAgICAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlc2VydmxldEFubm90YXRpb25EZWNvcmF0b3IiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkudXRpbC5Bbm5vdGF0aW9uSWNvbkRlY29yYXRvciIKLSAgICAgICAgICAgICAgIHN0YXRlPSJ0cnVlIgotICAgICAgICAgICAgICAgbG9jYXRpb249IlRPUF9MRUZUIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnV0aWwuQW5ub3RhdGlvbkljb25EZWNvcmF0b3Jfc2VydmxldCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlc2VydmxldEFubm90YXRpb25EZWNvcmF0b3IuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCI+Ci0gICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2RlY29yYXRvcj4KLSAgICA8L2V4dGVuc2lvbj4gCi0gICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS53aXphcmRQYWdlcyI+Ci0gICAgPHdpemFyZC1wYWdlcyBhY3Rpb249ImpzdC53ZWIuaW5zdGFsbCI+Ci0gICAgICA8cGFnZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldC5XZWJGYWNldEluc3RhbGxQYWdlIi8+Ci0gICAgPC93aXphcmQtcGFnZXM+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmltYWdlcyI+Ci0gICAgPGltYWdlIGZhY2V0PSJqc3Qud2ViIiBwYXRoPSJpY29ucy93YXIuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbgotICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQudWkuY2xhc3NwYXRoQ29udGFpbmVyUGFnZSI+Ci0gICAgPGNsYXNzcGF0aENvbnRhaW5lclBhZ2UKLSAgICAgIG5hbWU9IiV3ZWJBcHBMaWJyYXJpZXNDb250YWluZXJOYW1lIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJBcHBMaWJyYXJpZXNDb250YWluZXJQYWdlIgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5jb250YWluZXIiPgotICAgIDwvY2xhc3NwYXRoQ29udGFpbmVyUGFnZT4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLSAgICAgPG5hdmlnYXRvckNvbnRlbnQKLSAgICAgICAgICAgYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5XZWJKYXZhQ29udGVudFByb3ZpZGVyIgotICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvd2ViamF2YS1pY29uLmdpZiIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLkVuaGFuY2VkSmF2YVJlbmRlcmluZyIKLSAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLldlYkphdmFMYWJlbFByb3ZpZGVyIgotICAgICAgICAgICBuYW1lPSIlZW5oYW5jZWQuamF2YS5mb3Iud2ViLm5hbWUiCi0gICAgICAgICAgIHByaW9yaXR5PSJoaWdoZXIiPgotICAgICAgICA8b3ZlcnJpZGUKLSAgICAgICAgICAgICAgcG9saWN5PSJJbnZva2VPbmx5SWZTdXBwcmVzc2VkRXh0QWxzb1Zpc2libGVBbmRBY3RpdmUiCi0gICAgICAgICAgICAgIHN1cHByZXNzZWRFeHRlbnNpb25JZD0ib3JnLmVjbGlwc2UuamR0LmphdmEudWkuamF2YUNvbnRlbnQiLz4JCQkJCSAgIAotICAgICAgICA8dHJpZ2dlclBvaW50cz4KLSAgICAgICAgCTxvcj4KLQkJCQk8YW5kPgotCQkJCQk8YWRhcHQKLQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTxvcj4gCi0JCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0ianN0LndlYiIgLz4KLQkJCQkJCTwvb3I+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9hbmQ+Ci0JCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5JQ29tcHJlc3NlZE5vZGUiIC8+Ci0JCQk8L29yPiAgICAgICAgCi0gICAgICAgIDwvdHJpZ2dlclBvaW50cz4KLSAgICAgICAgPHBvc3NpYmxlQ2hpbGRyZW4+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5Db21wcmVzc2VkSmF2YVByb2plY3QiLz4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ii8+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ii8+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyIi8+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucGFja2FnZXZpZXcuQ2xhc3NQYXRoQ29udGFpbmVyIi8+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMiLz4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9wb3NzaWJsZUNoaWxkcmVuPiAKLQkJPGFjdGlvblByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLk5ld0FjdGlvblByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLkVuaGFuY2VkSmF2YVJlbmRlcmluZy5hY3Rpb25zLk5ld0FjdGlvblByb3ZpZGVyIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxpbnN0YW5jZW9mCi0JCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSUNvbXByZXNzZWROb2RlIiAvPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2FjdGlvblByb3ZpZGVyPiAgICAgICAgCi0gICAgICAgIDxjb21tb25Tb3J0ZXIKLSAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5Db21wcmVzc2VkSmF2YVNvcnRlciIKLSAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLkVuaGFuY2VkSmF2YVJlbmRlcmluZy5zb3J0ZXIiPgotICAgICAgICAgICA8cGFyZW50RXhwcmVzc2lvbj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5Db21wcmVzc2VkSmF2YVByb2plY3QiLz4KLSAgICAgICAgICAgPC9wYXJlbnRFeHByZXNzaW9uPgotICAgICAgICA8L2NvbW1vblNvcnRlcj4KLSAKLQkJICAgPGNvbW1vbldpemFyZAotCQkgICAgICAgIHR5cGU9Im5ldyIKLQkJICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3UGFja2FnZUNyZWF0aW9uV2l6YXJkIj4KLQkJICAgICA8ZW5hYmxlbWVudD4KLQkJCQk8aW5zdGFuY2VvZgotCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLklDb21wcmVzc2VkTm9kZSIgLz4KLQkJICAgICA8L2VuYWJsZW1lbnQ+Ci0JCSAgPC9jb21tb25XaXphcmQ+Ci0JCSAgPGNvbW1vbldpemFyZAotCQkgICAgICAgIHR5cGU9Im5ldyIKLQkJICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3Q2xhc3NDcmVhdGlvbldpemFyZCI+Ci0JCSAgICAgPGVuYWJsZW1lbnQ+Ci0JCQkJPGluc3RhbmNlb2YKLQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5JQ29tcHJlc3NlZE5vZGUiIC8+Ci0JCSAgICAgPC9lbmFibGVtZW50PgotCQkgIDwvY29tbW9uV2l6YXJkPgotCi0gICAJICAgICAgPGNvbW1vbldpemFyZAotCQkgICAgICAgIHR5cGU9Im5ldyIKLQkJICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3SW50ZXJmYWNlQ3JlYXRpb25XaXphcmQiPgotCQkgICAgIDxlbmFibGVtZW50PgotCQkJCTxpbnN0YW5jZW9mCi0JCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSUNvbXByZXNzZWROb2RlIiAvPgotCQkgICAgIDwvZW5hYmxlbWVudD4KLQkJICA8L2NvbW1vbldpemFyZD4gCi0JCSAgICA8Y29tbW9uV2l6YXJkCi0JCSAgICAgICAgICB0eXBlPSJuZXciCi0JCSAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3U291cmNlRm9sZGVyQ3JlYXRpb25XaXphcmQiPgotCQkJCTxlbmFibGVtZW50PgkJCQkgICAgICAgIAotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5JQ29tcHJlc3NlZE5vZGUiIC8+Ci0JCQkgICAgIDwvZW5hYmxlbWVudD4KLQkJCSA8L2NvbW1vbldpemFyZD4gICAgICAgIAkJCSAKLSAgICAgPC9uYXZpZ2F0b3JDb250ZW50PgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdlciI+Ci0gICAgIDx2aWV3ZXJDb250ZW50QmluZGluZyB2aWV3ZXJJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI+Ci0gICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24gcGF0dGVybj0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuRW5oYW5jZWRKYXZhUmVuZGVyaW5nIi8+Ci0gICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgIDwvdmlld2VyQ29udGVudEJpbmRpbmc+Ci0gIDwvZXh0ZW5zaW9uPgotICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICA8ZmFjdG9yeQotICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQ29tcHJlc3NlZEphdmFQcm9qZWN0IgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLkNvbXByZXNzZWROb2RlQWRhcHRlckZhY3RvcnkiPgotICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiLz4KLSAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ii8+Ci0gICAgIDwvZmFjdG9yeT4KLSAgPC9leHRlbnNpb24+Ci0gIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3Byb3BlcnR5X2ZpbGVzL3dlYl91aS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wcm9wZXJ0eV9maWxlcy93ZWJfdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4Mjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3Byb3BlcnR5X2ZpbGVzL3dlYl91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotXzA9RmFpbGVkIHRvIGZpbmQgdGhlIGltYWdlICJ7MH0iLgotXzE9TmV3IER5bmFtaWMgV2ViIFByb2plY3QKLV8yPVNlcnZsZXQgdmVyc2lvbjoKLV8zPUR5bmFtaWMgV2ViIFByb2plY3QKLV80PUNyZWF0ZSBhIHN0YW5kYWxvbmUgRHluYW1pYyBXZWIgcHJvamVjdCBvciBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbi4KLV81PVdlYiBwcm9qZWN0OgotXzY9V0FSIGZpbGU6Ci1fNz1JbXBvcnQgYSBXQVIgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbQotXzg9V0FSIEltcG9ydAotXzk9V0FSIEV4cG9ydAotXzEwPUV4cG9ydCBXZWIgcHJvamVjdCB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi1fMTE9Q29udGV4dCBSb290OgotXzEyPUNvbnZlcnQgU2ltcGxlIFdlYiB0byBXZWIgTW9kdWxlCi1fMTM9Q29udmVydCBTaW1wbGUgV2ViIHRvIFdlYiBNb2R1bGUuCi1fMTQ9V0FSIEltcG9ydDogV2ViIGxpYnJhcmllcwotXzE1PVNlbGVjdCB0aGUgd2ViIGxpYnJhcnkgamFycyBmcm9tIHRoZSBsaXN0IGJlbG93IHRvIGJlIGltcG9ydGVkIGFzIHdlYiBsaWJyYXJ5IHByb2plY3RzLiAgVW5zZWxlY3RlZCB3ZWIgbGlicmFyaWVzIHdpbGwgYmUgaW1wb3J0ZWQgYXMgamFycyBpbiB0aGUgV0VCLUlORi9saWIgZGlyZWN0b3J5LgotXzE2PVNlbGVjdCBBbGwKLV8xNz1EZXNlbGVjdCBBbGwKLQotQUREX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRT1DcmVhdGUgU2VydmxldAotQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEU9Q3JlYXRlIFNlcnZsZXQKLUFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX0RFU0M9RW50ZXIgc2VydmxldCBkZXBsb3ltZW50IGRlc2NyaXB0b3Igc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0KLUFERF9GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRT1DcmVhdGUgRmlsdGVyCi1BRERfRklMVEVSX1dJWkFSRF9QQUdFX1RJVExFPUNyZWF0ZSBGaWx0ZXIKLUFERF9GSUxURVJfV0laQVJEX1BBR0VfREVTQz1FbnRlciBzZXJ2bGV0IGZpbHRlciBkZXBsb3ltZW50IGRlc2NyaXB0b3Igc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0KLUFERF9MSVNURU5FUl9XSVpBUkRfV0lORE9XX1RJVExFPUNyZWF0ZSBMaXN0ZW5lcgotQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX1RJVExFPUNyZWF0ZSBMaXN0ZW5lcgotQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX0RFU0M9U2VsZWN0IHRoZSBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgZXZlbnRzIHRvIGxpc3RlbiB0by4gCi0KLURJU1BBVENIRVJfUkVRVUVTVD1SRVFVRVNUCi1ESVNQQVRDSEVSX0ZPUldBUkQ9Rk9SV0FSRAotRElTUEFUQ0hFUl9JTkNMVURFPUlOQ0xVREUKLURJU1BBVENIRVJfRVJST1I9RVJST1IKLQotREVGQVVMVF9QQUNLQUdFPShkZWZhdWx0IHBhY2thZ2UpCi1TRUxFQ1RfQ0xBU1NfVElUTEU9U2VsZWN0IENsYXNzCi1NQVBfQ0xBU1NfTkFNRV9UT19DTEFTU19FUlJPUl9NU0c9SVdBRTAwNjBFIENvdWxkIG5vdCB1bmlxdWVseSBtYXAgdGhlIGNsYXNzIG5hbWUgdG8gYSBjbGFzcy4KLUVNUFRZX0xJU1RfTVNHPUVtcHR5IExpc3QKLUFERF9MQUJFTD1BZGQKLVVTRV9FWElTVElOR19TRVJWTEVUX0NMQVNTPVVzZSBhbiBleGlzdGluZyBTZXJ2bGV0IGNsYXNzIG9yIEpTUAotVVNFX0VYSVNUSU5HX0ZJTFRFUl9DTEFTUz1Vc2UgZXhpc3RpbmcgRmlsdGVyIGNsYXNzCi1VU0VfRVhJU1RJTkdfTElTVEVORVJfQ0xBU1M9VXNlIGV4aXN0aW5nIExpc3RlbmVyIGNsYXNzCi1JTklUX1BBUkFNX1RJVExFPUluaXRpYWxpemF0aW9uIFBhcmFtZXRlcnMKLUlOSVRfUEFSQU1fTEFCRUw9SW5pdGlhbGl6YXRpb24gUGFyYW1ldGVyczoKLVVSTF9NQVBQSU5HU19USVRMRT1VUkwgTWFwcGluZ3MKLVVSTF9NQVBQSU5HU19MQUJFTD1VUkwgTWFwcGluZ3M6Ci1DSE9PU0VfU0VSVkxFVF9DTEFTUz1DaG9vc2UgYSBzZXJ2bGV0IGNsYXNzOgotCi1ORVdfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFPU5ldyBTZXJ2bGV0Ci1ORVdfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRT1TZXJ2bGV0Ci1ORVdfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDPUNyZWF0ZSBhIG5ldyBzZXJ2bGV0LgotU0VSVkxFVF9QQUNLQUdFX0xBQkVMPUphdmEgcGFja2FnZToKLVNFUlZMRVRfTkFNRV9MQUJFTD1TZXJ2bGV0IG5hbWU6Ci0KLU5FV19GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRT1OZXcgRmlsdGVyCi1DSE9PU0VfRklMVEVSX0NMQVNTPUNob29zZSBhIGZpbHRlciBjbGFzcwotU0VSVkxFVF9NQVBQSU5HU19MQUJFTD1TZXJ2bGV0IE1hcHBpbmdzOgotRklMVEVSX01BUFBJTkdTX0xBQkVMPUZpbHRlciBNYXBwaW5nczoKLQotQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX0NPTlRFWFRfRVZFTlRTPVNlcnZsZXQgQ29udGV4dCBFdmVudHMKLUFERF9MSVNURU5FUl9XSVpBUkRfSFRUUF9TRVNTSU9OX0VWRU5UUz1IVFRQIFNlc3Npb24gRXZlbnRzCi1BRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfUkVRVUVTVF9FVkVOVFM9U2VydmxldCBSZXF1ZXN0IEV2ZW50cwotQUREX0xJU1RFTkVSX1dJWkFSRF9MSUZFQ1lDTEU9TGlmZWN5Y2xlCi1BRERfTElTVEVORVJfV0laQVJEX0NIQU5HRVNfVE9fQVRUUklCVVRFUz1DaGFuZ2VzIHRvIGF0dHJpYnV0ZXMKLUFERF9MSVNURU5FUl9XSVpBUkRfU0VTU0lPTl9NSUdSQVRJT049U2Vzc2lvbiBtaWdyYXRpb24KLUFERF9MSVNURU5FUl9XSVpBUkRfT0JKRUNUX0JJTkRJTkc9T2JqZWN0IGJpbmRpbmcKLQotQUREX0JVVFRPTl9MQUJFTD1BZGQuLi4KLUVESVRfQlVUVE9OX0xBQkVMPUVkaXQuLi4KLVJFTU9WRV9CVVRUT05fTEFCRUw9UmVtb3ZlCi1VUkxfUEFUVEVSTl9USVRMRT1VUkwgUGF0dGVybnMKLVVSTF9QQVRURVJOX0xBQkVMPVBhdHRlcm46Ci1GT0xERVJfTEFCRUw9Rm9sZGVyOgotSkFWQV9QQUNLQUdFX0xBQkVMPUphdmEgcGFja2FnZToKLUNMQVNTX05BTUVfTEFCRUw9Q2xhc3MgbmFtZToKLVNVUEVSQ0xBU1NfTEFCRUw9U3VwZXJjbGFzczoKLUNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1RJVExFPUNvbnRhaW5lciBTZWxlY3Rpb24KLUNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX0RFU0M9Q2hvb3NlIGEgQ29udGFpbmVyOgotQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVkFMSURBVE9SX01FU0c9Q2hvb3NlIHRoZSBXZWIgQ29udGVudCBGb2xkZXIgb3IgaXRzIHN1YmZvbGRlcgotUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFPVBhY2thZ2UgU2VsZWN0aW9uCi1QQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfREVTQz1DaG9vc2UgYSBwYWNrYWdlOgotUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FPU5vIHBhY2thZ2VzIHRvIGNob29zZSBmcm9tCi1TVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfVElUTEU9U3VwZXJjbGFzcyBTZWxlY3Rpb24KLVNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19ERVNDPUNob29zZSBhIHN1cGVyY2xhc3M6Ci1JTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1JbnRlcmZhY2UgU2VsZWN0aW9uCi1JTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDPUNob29zZSBpbnRlcmZhY2VzOgotSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfTVNHX05PTkU9Jyd7MH0nJyBhZGRlZC4KLUpBVkFfQ0xBU1NfTU9ESUZJRVJTX0xBQkVMPU1vZGlmaWVyczoKLUpBVkFfQ0xBU1NfUFVCTElDX0NIRUNLQk9YX0xBQkVMPVB1YmxpYwotSkFWQV9DTEFTU19BQlNUUkFDVF9DSEVDS0JPWF9MQUJFTD1BYnN0cmFjdAotSkFWQV9DTEFTU19GSU5BTF9DSEVDS0JPWF9MQUJFTD1GaW5hbAotSkFWQV9DTEFTU19JTlRFUkZBQ0VTX0xBQkVMPUludGVyZmFjZXM6Ci1KQVZBX0NMQVNTX01FVEhPRF9TVFVCU19MQUJFTD1XaGljaCBtZXRob2Qgc3R1YnMgd291bGQgeW91IGxpa2UgdG8gY3JlYXRlPwotSkFWQV9DTEFTU19NQUlOX0NIRUNLQk9YX0xBQkVMPXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi1KQVZBX0NMQVNTX0NPTlNUUlVDVE9SX0NIRUNLQk9YX0xBQkVMPUNvbnN0cnVjdG9ycyBmcm9tIHN1cGVyY2xhc3MKLUpBVkFfQ0xBU1NfSU5IRVJJVF9DSEVDS0JPWF9MQUJFTD1Jbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kcwotSkFWQV9DTEFTU19CUk9XRVJfRElBTE9HX1RJVExFPUphdmEgQ2xhc3MgQnJvd3NlcgotSkFWQV9DTEFTU19CUk9XRVJfRElBTE9HX01FU1NBR0U9QnJvd3NlIGZvciBhIEphdmEgY2xhc3MKLQotTkFNRV9USVRMRT1OYW1lCi1OQU1FX0xBQkVMPU5hbWU6Ci1ERVNDUklQVElPTl9USVRMRT1EZXNjcmlwdGlvbgotREVTQ1JJUFRJT05fTEFCRUw9RGVzY3JpcHRpb246Ci1WQUxVRV9USVRMRT1WYWx1ZQotVkFMVUVfTEFCRUw9VmFsdWU6Ci1VUkxfU0VSVkxFVF9MQUJFTD1VUkwgUGF0dGVybiAvIFNlcnZsZXQgTmFtZQotRElTUEFUQ0hFUlNfTEFCRUw9RGlzcGF0Y2hlcnMKLQotQlJPV1NFX0JVVFRPTl9MQUJFTD1Ccm93c2UuLi4KLVJFTU9WRV9CVVRUT049UmVtb3ZlCi1TRUxFQ1RfQUxMX0JVVFRPTj1TZWxlY3QgJkFsbAotQ0xFQVJfQlVUVE9OPSZDbGVhcgotCi1ORVdfSkFWQV9DTEFTU19ERVNUSU5BVElPTl9XSVpBUkRfUEFHRV9ERVNDPVNwZWNpZnkgY2xhc3MgZmlsZSBkZXN0aW5hdGlvbi4KLU5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQz1TcGVjaWZ5IG1vZGlmaWVycywgaW50ZXJmYWNlcyB0byBpbXBsZW1lbnQsIGFuZCBtZXRob2Qgc3R1YnMgdG8gZ2VuZXJhdGUuCi0KLUltcG9ydFdBUkFjdGlvbl9VSV89SW1wb3J0IFdlYiBNb2R1bGUuLi4KLUV4cG9ydFdBUkFjdGlvbl9VSV89RXhwb3J0IFdBUiBmaWxlLi4uCi0KLU5PX1dFQl9QUk9KRUNUUz1ObyBXZWIgUHJvamVjdHMKLQotU0VSVkxFVFMgPVNlcnZsZXRzCi0KLVdFQl9DT05UX05BTUUgPSBXZWJBcHBDb250YWluZXJQYWdlCi1XRUJfQ09OVF9QQUdFX1RJVExFID0gV2ViIEFwcCBMaWJyYXJpZXMgQ29udGFpbmVyCi1XRUJfQ09OVF9QQUdFX0RFU0NSSVBUSU9OID0gVGhpcyBjb250YWluZXIgZHluYW1pY2FsbHkgcG9wdWxhdGVzIGNsYXNzcGF0aCBlbnRyaWVzIGZyb20gdGhlIFdFQi1JTkYvbGliIGFuZCBXRUItSU5GL2NsYXNzZXMgZGlyZWN0b3JpZXMgb2YgYSB3ZWIgYXBwLgotV0VCX0NPTlRfUEFHRV9DT01QX0xBQkVMID0gQ29tcG9uZW50OgotV0VCQ09OVEVOVD1XZWIgQ29udGVudCBmb2xkZXI6Ci0KLQotQ29tcHJlc3NlZF9MaWJyYXJpZXM9IExpYnJhcmllcwotQ29tcHJlc3NlZF9KYXZhUmVzb3VyY2VzPSBKYXZhIFJlc291cmNlc3swfQotCi1Db252ZXJ0VG9XZWJUaXRsZT1Db252ZXJ0IHRvIER5bmFtaWMgV2ViIFByb2plY3QKLVNlbGVjdFdlYlZlcnNpb249U2VsZWN0IGEgRHluYW1pYyBXZWIgbW9kdWxlIHZlcnNpb246CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvSVdlYlVJQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL0lXZWJVSUNvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2MTVmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvSVdlYlVJQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlVJQ29udGV4dElkcyB7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9TRVJWTEVUX1VJID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRFlOQU1JQ19XRUJfUFJPSkVDVF9QQUdFMSA9IFBMVUdJTl9TRVJWTEVUX1VJICsgIndlYncxMDAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19EWU5BTUlDX1dFQl9QUk9KRUNUX1BBR0UyID0gUExVR0lOX1NFUlZMRVRfVUkgKyAid2VidzExMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RZTkFNSUNfV0VCX1BST0pFQ1RfUEFHRTMgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJ3ZWJ3MTIwMCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfSU1QT1JUX1BBR0UxID0gUExVR0lOX1NFUlZMRVRfVUkgKyAid2ViaTEwMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX0lNUE9SVF9QQUdFMiA9IFBMVUdJTl9TRVJWTEVUX1VJICsgIndlYmkxMTAwIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9FWFBPUlRfUEFHRTEgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJ3ZWJlMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJFRElUT1JfU0VSVkxFVF9QQUdFX0FERF9TRVJWTEVUX1dJWkFSRF8xID0gUExVR0lOX1NFUlZMRVRfVUkgKyAic3J2dzEwNTAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCRURJVE9SX1NFUlZMRVRfUEFHRV9BRERfU0VSVkxFVF9XSVpBUkRfMiA9IFBMVUdJTl9TRVJWTEVUX1VJICsgInNydncxMTAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkVESVRPUl9TRVJWTEVUX1BBR0VfQUREX1NFUlZMRVRfV0laQVJEXzMgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJzcnZ3MTIwMCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJFRElUT1JfTElTVEVORVJfUEFHRV9BRERfTElTVEVORVJfV0laQVJEXzEgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJsc3R3MTA1MCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCRURJVE9SX0xJU1RFTkVSX1BBR0VfQUREX0xJU1RFTkVSX1dJWkFSRF8yID0gUExVR0lOX1NFUlZMRVRfVUkgKyAibHN0dzExMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkVESVRPUl9MSVNURU5FUl9QQUdFX0FERF9MSVNURU5FUl9XSVpBUkRfMyA9IFBMVUdJTl9TRVJWTEVUX1VJICsgImxzdHcxMjAwIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkVESVRPUl9GSUxURVJfUEFHRV9BRERfRklMVEVSX1dJWkFSRF8xID0gUExVR0lOX1NFUlZMRVRfVUkgKyAiZmx0dzEwNTAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkVESVRPUl9GSUxURVJfUEFHRV9BRERfRklMVEVSX1dJWkFSRF8yID0gUExVR0lOX1NFUlZMRVRfVUkgKyAiZmx0dzExMDAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkVESVRPUl9GSUxURVJfUEFHRV9BRERfRklMVEVSX1dJWkFSRF8zID0gUExVR0lOX1NFUlZMRVRfVUkgKyAiZmx0dzEyMDAiOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2FjdGlvbnMvQ29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2FjdGlvbnMvQ29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGYxZjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9hY3Rpb25zL0NvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5kYXRhbW9kZWwucHJvcGVydGllcy5JQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkNvbnZlcnRUb1dlYk1vZHVsZVR5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIENvbnZlcnQgYSBzaW1wbGUgc3RhdGljIHdlYiBwcm9qZWN0IHRvIGEgSjJFRSBEeW5hbWljIFdlYiBQcm9qZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb24gPSBudWxsOwotCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCUlXb3JrYmVuY2hXaW5kb3cgZldpbmRvdzsKLQotCS8qKgotCSAqIENvbnZlcnRMaW5rc0RpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIG1ha2Ugc3VyZSBhIHdlYiBwcm9qZWN0IGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRQcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJldHVybiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhdGljV2ViUHJvamVjdChhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogc2VsZWN0aW9uQ2hhbmdlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIGJFbmFibGUgPSBmYWxzZTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQliRW5hYmxlID0gdmFsaWRhdGVTZWxlY3RlZChmU2VsZWN0aW9uKTsKLQkJfQotCQkoKEFjdGlvbikgYWN0aW9uKS5zZXRFbmFibGVkKGJFbmFibGUpOwotCX0KLQotCS8qKgotCSAqIHNlbGVjdGlvbkNoYW5nZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVTZWxlY3RlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZlNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCU9iamVjdCBzZWxlY3RlZFByb2plY3QgPSBmU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoIShzZWxlY3RlZFByb2plY3QgaW5zdGFuY2VvZiBJUHJvamVjdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcHJvamVjdCA9IChJUHJvamVjdCkgc2VsZWN0ZWRQcm9qZWN0OwotCQlyZXR1cm4gaXNWYWxpZFByb2plY3QocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gRGVmYXVsdAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8gRGVmYXVsdAotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtiZW5jaFdpbmRvd3MoKVswXTsKLQkJCUNvbnZlcnRUb1dlYk1vZHVsZVR5cGVEaWFsb2cgZGlhbG9nID0gbmV3IENvbnZlcnRUb1dlYk1vZHVsZVR5cGVEaWFsb2cod2luZG93LmdldFNoZWxsKCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5DQU5DRUwpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlkb0NvbnZlcnQoQ29udmVydFRvV2ViTW9kdWxlVHlwZURpYWxvZy5nZXRTZWxlY3RlZFZlcnNpb24oKSk7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9Db252ZXJ0KFN0cmluZyBzZWxlY3RlZFZlcnNpb24pIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKElDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllcy5jbGFzcyk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNULCBwcm9qZWN0KTsKLQkJbW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUNvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlZFUlRfVE9fV0VCX1ZFUlNJT04sIENvbnZlcnRUb1dlYk1vZHVsZVR5cGVEaWFsb2cuZ2V0U2VsZWN0ZWRWZXJzaW9uKCkpOwotCQltb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdXZWJDb21wb25lbnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dlYkNvbXBvbmVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTFlZjQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dlYkNvbXBvbmVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYlByb2plY3RXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotcHVibGljIGNsYXNzIE5ld1dlYkNvbXBvbmVudEFjdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLldFQl9NT0RVTEVfV0laX1RJVExFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gIndhcl93aXoiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIE5ld1dlYkNvbXBvbmVudEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChMQUJFTCk7IAotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQkKLQlwdWJsaWMgTmV3V2ViQ29tcG9uZW50QWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIENsYXNzW10gYWN0aXZhdGVkT25UeXBlcywgYm9vbGVhbiBhY2NlcHRFbXB0eVNlbGVjdGlvbikgewotCQlzdXBlcih3b3JrYmVuY2gsIGxhYmVsLCBhY3RpdmF0ZWRPblR5cGVzLCBhY2NlcHRFbXB0eVNlbGVjdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCQotCXB1YmxpYyBOZXdXZWJDb21wb25lbnRBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBhY2NlcHRFbXB0eVNlbGVjdGlvbikgewotCQlzdXBlcih3b3JrYmVuY2gsIGxhYmVsLCBhY2NlcHRFbXB0eVNlbGVjdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFdpemFyZCBjcmVhdGVXaXphcmQoKSB7Ci0JCXJldHVybiBuZXcgV2ViUHJvamVjdFdpemFyZCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBY2NlcHRFbGVtZW50KE9iamVjdCBvYmopIHsgCi0JCXJldHVybiB0cnVlOyAvKiBOZXdHcm91cC5pc09uQnVpbGRQYXRoKG9iaikgJiYgIU5ld0dyb3VwLmlzSW5BcmNoaXZlKG9iaik7ICovCi0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nVGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmNGMwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIFdlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117SUxhdW5jaGFibGUuY2xhc3N9OwotCX0KLQotCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBXZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsLmdldE1vZHVsZU9iamVjdChvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkSmF2YUxpYnJhcmllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkSmF2YUxpYnJhcmllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzYzODAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIENvbXByZXNzZWRKYXZhTGlicmFyaWVzIGltcGxlbWVudHMgSUNvbXByZXNzZWROb2RlIHsKLQkKLQkKLQlwcml2YXRlIENvbXByZXNzZWRKYXZhUHJvamVjdCBjb21wcmVzc2VkUHJvamVjdDsKLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JcHVibGljIENvbXByZXNzZWRKYXZhTGlicmFyaWVzKENvbXByZXNzZWRKYXZhUHJvamVjdCBjb21wcmVzc2VkUHJvamVjdCkgeyAKLQkJdGhpcy5jb21wcmVzc2VkUHJvamVjdCA9IGNvbXByZXNzZWRQcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7IAotCQlpZihpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZSA9IEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0xJQlJBUlkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsJCQotCQlyZXR1cm4gV0VCVUlNZXNzYWdlcy5Db21wcmVzc2VkX0xpYnJhcmllczsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKElUcmVlQ29udGVudFByb3ZpZGVyIGRlbGVnYXRlQ29udGVudFByb3ZpZGVyKSB7Ci0JCQotCQlMaXN0IGNsYXNzcGF0aENvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIGRlbGVnYXRlQ2hpbGRyZW4gPSBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihjb21wcmVzc2VkUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbGVnYXRlQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkZWxlZ2F0ZUNoaWxkcmVuW2ldIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQl0cnkgewotCQkJCQlJQ2xhc3NwYXRoRW50cnkgcmF3Q2xhc3NwYXRoRW50cnkgPSAoKElQYWNrYWdlRnJhZ21lbnRSb290KSBkZWxlZ2F0ZUNoaWxkcmVuW2ldKS5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpOwotCQkJCQlpZiAocmF3Q2xhc3NwYXRoRW50cnkuZ2V0RW50cnlLaW5kKCkgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgJiYgCi0JCQkJCQkJCXJhd0NsYXNzcGF0aEVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKQotCQkJCQkJY2xhc3NwYXRoQ29udGFpbmVycy5hZGQoZGVsZWdhdGVDaGlsZHJlbltpXSk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIShkZWxlZ2F0ZUNoaWxkcmVuW2ldIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSAmJiAhKGRlbGVnYXRlQ2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpKSB7Ci0JCQkJY2xhc3NwYXRoQ29udGFpbmVycy5hZGQoZGVsZWdhdGVDaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNsYXNzcGF0aENvbnRhaW5lcnMudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBDb21wcmVzc2VkSmF2YVByb2plY3QgZ2V0Q29tcHJlc3NlZFByb2plY3QoKSB7Ci0JCXJldHVybiBjb21wcmVzc2VkUHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KCkgeyAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWRKYXZhUHJvamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkSmF2YVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmMDI1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWRKYXZhUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5TZXJ2bGV0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDb21wcmVzc2VkSmF2YVByb2plY3QgaW1wbGVtZW50cyBJQ29tcHJlc3NlZE5vZGUsIElBZGFwdGFibGUgeyAKLQkKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBDb21wcmVzc2VkSmF2YUxpYnJhcmllcyBjb21wcmVzc2VkTGlicmFyaWVzOwotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7IAotIAotCXB1YmxpYyBDb21wcmVzc2VkSmF2YVByb2plY3QoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsgCi0KLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmKGltYWdlID09IG51bGwpCi0JCQlpbWFnZSA9IEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1BBQ0tGUkFHX1JPT1QpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGRldGVybWluZUxhYmVsKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZsYXR0ZW5pbmdTb3VyY2VGb2xkZXIoKSB7Ci0JCXJldHVybiBnZXROb25FeHRlcm5hbFNvdXJjZUZvbGRlcnMoKS5zaXplKCkgPT0gMTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBkZXRlcm1pbmVMYWJlbCgpIHsKLQkJTGlzdCBub25leHRTb3VyY2VGb2xkZXJzID0gZ2V0Tm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzKCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHNpbmdsZVJvb3QgPSBudWxsOwotCQlpZiAobm9uZXh0U291cmNlRm9sZGVycy5zaXplKCkgPT0gMSkgewotCQkJc2luZ2xlUm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgbm9uZXh0U291cmNlRm9sZGVycy5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIE5MUy5iaW5kKFdFQlVJTWVzc2FnZXMuQ29tcHJlc3NlZF9KYXZhUmVzb3VyY2VzLCAoKHNpbmdsZVJvb3QgIT0gbnVsbCkgPyAiOiAiICsgc2luZ2xlUm9vdC5nZXRFbGVtZW50TmFtZSgpIDogIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihJVHJlZUNvbnRlbnRQcm92aWRlciBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcikgewotCQkKLQkJTGlzdCBub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMgPSBnZXROb25FeHRlcm5hbFNvdXJjZUZvbGRlcnMoKTsKLQkJaWYgKG5vbkV4dGVybmFsU291cmNlRm9sZGVycy5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0W10gc291cmNlRm9sZGVyQ2hpbGRyZW4gPSBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMuZ2V0KDApKTsKLQkJCW5vbkV4dGVybmFsU291cmNlRm9sZGVycy5jbGVhcigpOwotCQkJbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNvdXJjZUZvbGRlckNoaWxkcmVuKSk7Ci0JCX0gCi0JCW5vbkV4dGVybmFsU291cmNlRm9sZGVycy5hZGQoZ2V0Q29tcHJlc3NlZEphdmFMaWJyYXJpZXMoKSk7Ci0JCXJldHVybiBub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vbkV4dGVybmFsU291cmNlRm9sZGVycygpIHsKLQkJTGlzdCBub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMgPSBudWxsOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHNvdXJjZUZvbGRlcnM7Ci0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgalByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlzb3VyY2VGb2xkZXJzID0galByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJCW5vbkV4dGVybmFsU291cmNlRm9sZGVycyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChzb3VyY2VGb2xkZXJzKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJvb3QuaXNFeHRlcm5hbCgpIHx8IHJvb3QuaXNBcmNoaXZlKCkgfHwgcm9vdC5nZXRLaW5kKCk9PUlQYWNrYWdlRnJhZ21lbnRSb290LktfQklOQVJZKQotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJU2VydmxldFVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzICE9IG51bGwgPyBub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQlwdWJsaWMgQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMgZ2V0Q29tcHJlc3NlZEphdmFMaWJyYXJpZXMoKSB7CQkKLQkJaWYoY29tcHJlc3NlZExpYnJhcmllcyA9PSBudWxsKSAKLQkJCWNvbXByZXNzZWRMaWJyYXJpZXMgPSBuZXcgQ29tcHJlc3NlZEphdmFMaWJyYXJpZXModGhpcyk7Ci0JCXJldHVybiBjb21wcmVzc2VkTGlicmFyaWVzOwotCQkKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeyAKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KCkgewotCQlMaXN0IG5vbkV4dGVybmFsU291cmNlRm9sZGVycyA9IGdldE5vbkV4dGVybmFsU291cmNlRm9sZGVycygpOwotCQlpZiAobm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzLnNpemUoKSA9PSAxKSB7Ci0JCQlyZXR1cm4gKElKYXZhRWxlbWVudCkgbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzLmdldCgwKTsKLQkJfQotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkSmF2YVNvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkSmF2YVNvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzgxNDg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZEphdmFTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudFNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLQotcHVibGljIGNsYXNzIENvbXByZXNzZWRKYXZhU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQkKLQlwcml2YXRlIEphdmFFbGVtZW50U29ydGVyIHNvcnRlciA9IG5ldyBKYXZhRWxlbWVudFNvcnRlcigpOwotCQotCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IGVsZW1lbnQpIHsgCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wcmVzc2VkSmF2YUxpYnJhcmllcykKLQkJCXJldHVybiAxOwotCQllbHNlIHJldHVybiAwOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaWYoZTEgaW5zdGFuY2VvZiBDb21wcmVzc2VkSmF2YUxpYnJhcmllcykKLQkJCXJldHVybiAxOwotCQllbHNlIGlmKGUyIGluc3RhbmNlb2YgQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMpCi0JCQlyZXR1cm4gLTE7Ci0JCQotCQlyZXR1cm4gc29ydGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWROb2RlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTczYjA4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWROb2RlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLQotLy8gCi1wdWJsaWMgY2xhc3MgQ29tcHJlc3NlZE5vZGVBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSUpBVkFfUFJPSkVDVF9DTEFTUyA9IElKYXZhUHJvamVjdC5jbGFzczsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJSkFWQV9FTEVNRU5UX0NMQVNTID0gSUphdmFFbGVtZW50LmNsYXNzOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9MSVNUID0gbmV3IENsYXNzW10geyBJSkFWQV9QUk9KRUNUX0NMQVNTIH07Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgQ29tcHJlc3NlZEphdmFQcm9qZWN0KSB7Ci0JCQlpZihhZGFwdGVyVHlwZSA9PSBJSkFWQV9QUk9KRUNUX0NMQVNTKSB7Ci0JCQkJcmV0dXJuICgoQ29tcHJlc3NlZEphdmFQcm9qZWN0KWFkYXB0YWJsZU9iamVjdCkuZ2V0UHJvamVjdCgpOwotCQkJfSBlbHNlIGlmIChhZGFwdGVyVHlwZSA9PSBJSkFWQV9FTEVNRU5UX0NMQVNTKSB7Ci0JCQkJcmV0dXJuICgoQ29tcHJlc3NlZEphdmFQcm9qZWN0KWFkYXB0YWJsZU9iamVjdCkuZ2V0SmF2YUVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsgCi0JCXJldHVybiBBREFQVEVSX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0lDb21wcmVzc2VkTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9JQ29tcHJlc3NlZE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxYmI3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0lDb21wcmVzc2VkTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiAKLSAqIFByb3ZpZGVzIGEgc2ltcGxlIGludGVyZmFjZSB0aGF0IGlzIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgcmVuZGVyaW5nIG9mIEphdmEgZWxlbWVudHMgdG8gYSBmb3JtYXQKLSAqIHRoYXQgaXMgZnJpZW5kbGllciBmb3IgV2ViIFByb2plY3RzLgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXByZXNzZWROb2RlICAgewotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGltYWdlIHRvIGRpc3BsYXkgZm9yIHRoaXMgbm9kZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHRleHQgbGFiZWwgdG8gZGlzcGxheSBmb3IgdGhpcyBub2RlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcgotCSAqICAgICAgICAgICAgVGhlIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCBzaG91bGQgdXNlZCBmb3IgYW55IGNoaWxkcmVuIHRoYXQgSSBjYW5ub3QgcHJvdmlkZQotCSAqICAgICAgICAgICAgY2hpbGRyZW4gZm9yLgotCSAqIEByZXR1cm4gVGhlIGNoaWxkcmVuIGVpdGhlciBmcm9tIG1lIG9yIHRoZSBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oSVRyZWVDb250ZW50UHJvdmlkZXIgZGVsZWdhdGVDb250ZW50UHJvdmlkZXIpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgSmF2YSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUsIGlmIGFueS4KLQkgKi8KLQlwdWJsaWMgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYkphdmFDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViSmF2YUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjljYjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViSmF2YUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZsZXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklQaXBlbGluZWRUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5QaXBlbGluZWRTaGFwZU1vZGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUGlwZWxpbmVkVmlld2VyVXBkYXRlOwotCi1wdWJsaWMgY2xhc3MgV2ViSmF2YUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElQaXBlbGluZWRUcmVlQ29udGVudFByb3ZpZGVyICB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBOT19DSElMRFJFTiA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRVhURU5TSU9OX0lEID0gIm9yZy5lY2xpcHNlLmpkdC5qYXZhLnVpLmphdmFDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBKRFQgbGlrZXMgdG8gbWFrZSBpdCBpbnRlcmVzdGluZyBzbyBqdXN0IG9uZSBvZiB0aGVpciB2aWV3ZXIgdHlwZXMgaXMgbWFkZSBpbnRlcm5hbCBUbyBhdm9pZAotCSAqIHRoZSBkZXBlbmRlbmN5LCB3ZSB1c2Ugc29tZSByZWZsZWN0aW9uIGhlcmUgdG8gZmlsdGVyIHRoZSB0eXBlLgotCSAqLwotCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgSU5URVJOQUxfQ09OVEFJTkVSX0NMQVNTOwotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlJTlRFUk5BTF9DT05UQUlORVJfQ0xBU1MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucGFja2FnZXZpZXcuQ2xhc3NQYXRoQ29udGFpbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCS8vIGlnbm9yZSBpZiB0aGUgY2xhc3MgaGFzIGJlZW4gcmVtb3ZlZCBvciByZW5hbWVkLgotCQkJSU5URVJOQUxfQ09OVEFJTkVSX0NMQVNTID0gbnVsbDsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBDb21tb25WaWV3ZXIgY29tbW9uVmlld2VyOwotCXByaXZhdGUgSVRyZWVDb250ZW50UHJvdmlkZXIgZGVsZWdhdGVDb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBNYXAgY29tcHJlc3NlZE5vZGVzID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyB2b2lkIGdldFBpcGVsaW5lZENoaWxkcmVuKE9iamVjdCBhUGFyZW50LCBTZXQgdGhlQ3VycmVudENoaWxkcmVuKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoYVBhcmVudCBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICgoSVByb2plY3QpYVBhcmVudCkuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdCgoSVByb2plY3QpYVBhcmVudCkpIHsKLQkJCQljbGVhbkphdmFDb250cmlidXRpb24odGhlQ3VycmVudENoaWxkcmVuKTsKLQkJCQl0aGVDdXJyZW50Q2hpbGRyZW4uYWRkKGdldENvbXByZXNzZWROb2RlKChJUHJvamVjdClhUGFyZW50KSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU2VydmxldFVJUGx1Z2luLmxvZyhlKTsKLQkJfSAKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW5KYXZhQ29udHJpYnV0aW9uKFNldCB0aGVDdXJyZW50Q2hpbGRyZW4pIHsKLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGVDdXJyZW50Q2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElSZXNvdXJjZSAmJiAoKGVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUoKElSZXNvdXJjZSkgY2hpbGQpKSAhPSBudWxsKSAmJiBlbGVtZW50LmV4aXN0cygpKQotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQllbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJZWxzZSBpZiAoSU5URVJOQUxfQ09OVEFJTkVSX0NMQVNTICE9IG51bGwgJiYgSU5URVJOQUxfQ09OVEFJTkVSX0NMQVNTLmlzSW5zdGFuY2UoY2hpbGQpKQotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbXByZXNzZWRKYXZhUHJvamVjdCBnZXRDb21wcmVzc2VkTm9kZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmICghSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCQlDb21wcmVzc2VkSmF2YVByb2plY3QgcmVzdWx0ID0gKENvbXByZXNzZWRKYXZhUHJvamVjdCkgY29tcHJlc3NlZE5vZGVzLmdldChwcm9qZWN0KTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQljb21wcmVzc2VkTm9kZXMucHV0KHByb2plY3QsIHJlc3VsdCA9IG5ldyBDb21wcmVzc2VkSmF2YVByb2plY3QoY29tbW9uVmlld2VyLCBwcm9qZWN0KSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRQaXBlbGluZWRFbGVtZW50cyhPYmplY3QgYW5JbnB1dCwgU2V0IHRoZUN1cnJlbnRFbGVtZW50cykgeyAKLQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGlwZWxpbmVkUGFyZW50KE9iamVjdCBhbk9iamVjdCwgT2JqZWN0IGFTdWdnZXN0ZWRQYXJlbnQpIHsKLQotCQl0cnkgewotCQkJaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBhbk9iamVjdDsKLQkJCQlpZiAoIXJvb3QuaXNFeHRlcm5hbCgpKSB7Ci0JCQkJCWlmKCBhU3VnZ2VzdGVkUGFyZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0ICkgewotCQkJCQkJcmV0dXJuIGdldENvbXByZXNzZWROb2RlKCAoKElKYXZhUHJvamVjdCkgYVN1Z2dlc3RlZFBhcmVudCkuZ2V0UHJvamVjdCgpICk7Ci0JCQkJCX0gZWxzZSBpZiAoIGFTdWdnZXN0ZWRQYXJlbnQgaW5zdGFuY2VvZiBJUHJvamVjdCAmJiAoKElQcm9qZWN0KWFTdWdnZXN0ZWRQYXJlbnQpLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoKElQcm9qZWN0KWFTdWdnZXN0ZWRQYXJlbnQpICl7Ci0JCQkJCQlyZXR1cm4gZ2V0Q29tcHJlc3NlZE5vZGUoICgoSVByb2plY3QpIGFTdWdnZXN0ZWRQYXJlbnQpICk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYoSU5URVJOQUxfQ09OVEFJTkVSX0NMQVNTLmlzSW5zdGFuY2UoYW5PYmplY3QpKSB7Ci0JCQkJaWYoIGFTdWdnZXN0ZWRQYXJlbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QgKSB7Ci0JCQkJCXJldHVybiBnZXRDb21wcmVzc2VkTm9kZSggKChJSmF2YVByb2plY3QpIGFTdWdnZXN0ZWRQYXJlbnQpLmdldFByb2plY3QoKSApLmdldENvbXByZXNzZWRKYXZhTGlicmFyaWVzKCk7Ci0JCQkJfSBlbHNlIGlmICggYVN1Z2dlc3RlZFBhcmVudCBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICgoSVByb2plY3QpYVN1Z2dlc3RlZFBhcmVudCkuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdCgoSVByb2plY3QpYVN1Z2dlc3RlZFBhcmVudCkpewotCQkJCQlyZXR1cm4gZ2V0Q29tcHJlc3NlZE5vZGUoICgoSVByb2plY3QpIGFTdWdnZXN0ZWRQYXJlbnQpICkuZ2V0Q29tcHJlc3NlZEphdmFMaWJyYXJpZXMoKTsKLQkJCQl9IAotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZsZXRVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBQaXBlbGluZWRTaGFwZU1vZGlmaWNhdGlvbiBpbnRlcmNlcHRBZGQoUGlwZWxpbmVkU2hhcGVNb2RpZmljYXRpb24gYW5BZGRNb2RpZmljYXRpb24pIHsKLQkJT2JqZWN0IHBhcmVudCA9IGFuQWRkTW9kaWZpY2F0aW9uLmdldFBhcmVudCgpOwotCQkKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VGb2xkZXIgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHBhcmVudDsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHNvdXJjZUZvbGRlci5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSkpIHsKLQkJCQlDb21wcmVzc2VkSmF2YVByb2plY3QgY29tcHJlc3NlZE5vZGUgPSBnZXRDb21wcmVzc2VkTm9kZShzb3VyY2VGb2xkZXIuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQkJCWlmKGNvbXByZXNzZWROb2RlLmlzRmxhdHRlbmluZ1NvdXJjZUZvbGRlcigpKSB7Ci0JCQkJCWFuQWRkTW9kaWZpY2F0aW9uLnNldFBhcmVudChjb21wcmVzc2VkTm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9IAotCQkKLQkJcmV0dXJuIGFuQWRkTW9kaWZpY2F0aW9uOwotCX0KLQkKLQotCXB1YmxpYyBQaXBlbGluZWRTaGFwZU1vZGlmaWNhdGlvbiBpbnRlcmNlcHRSZW1vdmUoUGlwZWxpbmVkU2hhcGVNb2RpZmljYXRpb24gYVJlbW92ZU1vZGlmaWNhdGlvbikgewotCi0JCU9iamVjdCBwYXJlbnQgPSBhUmVtb3ZlTW9kaWZpY2F0aW9uLmdldFBhcmVudCgpOwotCQkKLQkJU2V0IGNoaWxkcmVuID0gYVJlbW92ZU1vZGlmaWNhdGlvbi5nZXRDaGlsZHJlbigpOwotCQkKLQkJZm9yIChPYmplY3QgY2hpbGQgOiBjaGlsZHJlbikgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUZvbGRlcil7Ci0JCQkJdHJ5IHsKLQkJCQkJSVBhY2thZ2VGcmFnbWVudCBsb2NhdGVQYWNrYWdlRnJhZ21lbnQgPSBsb2NhdGVQYWNrYWdlRnJhZ21lbnQoKElGb2xkZXIpY2hpbGQpOwotCQkJCQlpZihsb2NhdGVQYWNrYWdlRnJhZ21lbnQgIT0gbnVsbCl7Ci0JCQkJCQlhUmVtb3ZlTW9kaWZpY2F0aW9uLmdldENoaWxkcmVuKCkucmVtb3ZlKGNoaWxkKTsKLQkJCQkJCWFSZW1vdmVNb2RpZmljYXRpb24uZ2V0Q2hpbGRyZW4oKS5hZGQobG9jYXRlUGFja2FnZUZyYWdtZW50KTsKLQkJCQkJCQotCQkJCQkJcmV0dXJuIGFSZW1vdmVNb2RpZmljYXRpb247Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VGb2xkZXIgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHBhcmVudDsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHNvdXJjZUZvbGRlci5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSkpIHsKLQkJCQlDb21wcmVzc2VkSmF2YVByb2plY3QgY29tcHJlc3NlZE5vZGUgPSBnZXRDb21wcmVzc2VkTm9kZShzb3VyY2VGb2xkZXIuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQkJCWlmKGNvbXByZXNzZWROb2RlLmlzRmxhdHRlbmluZ1NvdXJjZUZvbGRlcigpKSB7Ci0JCQkJCWFSZW1vdmVNb2RpZmljYXRpb24uc2V0UGFyZW50KGNvbXByZXNzZWROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSAKLQkJCi0JCXJldHVybiBhUmVtb3ZlTW9kaWZpY2F0aW9uOwotCX0KLQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBsb2NhdGVQYWNrYWdlRnJhZ21lbnQoSUZvbGRlciBjaGlsZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShjaGlsZC5nZXRQcm9qZWN0KCkpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkKLQkJSUphdmFFbGVtZW50IGVsZW0gPSBKYXZhQ29yZS5jcmVhdGUoY2hpbGQpOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpZWxlbTsKLQkJCWZvciAoSUphdmFFbGVtZW50IGphdmFFbGVtID0gcGFja2FnZUZyYWdtZW50IDsgamF2YUVsZW0gIT0gbnVsbCA7IGphdmFFbGVtID0gamF2YUVsZW0uZ2V0UGFyZW50KCkpIHsKLQkJCQlpZiAoamF2YUVsZW0gaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBmcmFnbWVudFJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpamF2YUVsZW07Ci0JCQkJCWlmICghZnJhZ21lbnRSb290LmlzUmVhZE9ubHkoKSAmJiAhZnJhZ21lbnRSb290LmlzRXh0ZXJuYWwoKSkgewotCQkJCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbnRlcmNlcHRSZWZyZXNoKFBpcGVsaW5lZFZpZXdlclVwZGF0ZSBhUmVmcmVzaFN5bmNocm9uaXphdGlvbikgewotCQkKLQkJU2V0IHJlZnJlc2hUYXJnZXRzID0gYVJlZnJlc2hTeW5jaHJvbml6YXRpb24uZ2V0UmVmcmVzaFRhcmdldHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmcmVzaFRhcmdldHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcmVmcmVzaFRhcmdldCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZnJlc2hUYXJnZXQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUZvbGRlciA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcmVmcmVzaFRhcmdldDsKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChzb3VyY2VGb2xkZXIuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCUNvbXByZXNzZWRKYXZhUHJvamVjdCBjb21wcmVzc2VkTm9kZSA9IGdldENvbXByZXNzZWROb2RlKHNvdXJjZUZvbGRlci5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCQkJCWlmKGNvbXByZXNzZWROb2RlLmlzRmxhdHRlbmluZ1NvdXJjZUZvbGRlcigpKSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOyAvLyB2b2lkcyB0aGUgaXRlciBidXQgaXMgb2theSBiZWNhdXNlIHdlJ3JlIGRvbmUgd2l0aCBpdAotCQkJCQkJcmVmcmVzaFRhcmdldHMuYWRkKGNvbXByZXNzZWROb2RlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpbnRlcmNlcHRVcGRhdGUoUGlwZWxpbmVkVmlld2VyVXBkYXRlIGFuVXBkYXRlU3luY2hyb25pemF0aW9uKSB7Ci0JCVNldCByZWZyZXNoVGFyZ2V0cyA9IGFuVXBkYXRlU3luY2hyb25pemF0aW9uLmdldFJlZnJlc2hUYXJnZXRzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZnJlc2hUYXJnZXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHJlZnJlc2hUYXJnZXQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWZyZXNoVGFyZ2V0IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VGb2xkZXIgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHJlZnJlc2hUYXJnZXQ7Ci0JCQkJaWYgKHNvdXJjZUZvbGRlci5nZXRKYXZhUHJvamVjdCgpIT1udWxsICYmIHNvdXJjZUZvbGRlci5nZXRKYXZhUHJvamVjdCgpLmV4aXN0cygpICYmIHNvdXJjZUZvbGRlci5nZXRKYXZhUHJvamVjdCgpLmlzT3BlbigpICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3Qoc291cmNlRm9sZGVyLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSkgewotCQkJCQlDb21wcmVzc2VkSmF2YVByb2plY3QgY29tcHJlc3NlZE5vZGUgPSBnZXRDb21wcmVzc2VkTm9kZShzb3VyY2VGb2xkZXIuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQkJCQlpZihjb21wcmVzc2VkTm9kZS5pc0ZsYXR0ZW5pbmdTb3VyY2VGb2xkZXIoKSkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsgLy8gdm9pZHMgdGhlIGl0ZXJhdG9yOyBidXQgaXMgb2theSBiZWNhdXNlIHdlJ3JlIGRvbmUgd2l0aCBpdAotCQkJCQkJcmVmcmVzaFRhcmdldHMuYWRkKGNvbXByZXNzZWROb2RlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7IAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlIGFTaXRlKSB7IAotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAoZGVsZWdhdGVDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb21wcmVzc2VkSmF2YVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKChDb21wcmVzc2VkSmF2YVByb2plY3QpcGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oZGVsZWdhdGVDb250ZW50UHJvdmlkZXIpOwotCQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMpIHsgCi0JCQkJcmV0dXJuICgoQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMpcGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oZGVsZWdhdGVDb250ZW50UHJvdmlkZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBOT19DSElMRFJFTjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXByZXNzZWRKYXZhUHJvamVjdCkKLQkJCXJldHVybiAoKENvbXByZXNzZWRKYXZhUHJvamVjdCkgZWxlbWVudCkuZ2V0UHJvamVjdCgpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXByZXNzZWRKYXZhTGlicmFyaWVzKSAKLQkJCXJldHVybiAoKENvbXByZXNzZWRKYXZhTGlicmFyaWVzKSBlbGVtZW50KS5nZXRDb21wcmVzc2VkUHJvamVjdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wcmVzc2VkSmF2YVByb2plY3QgfHwgZWxlbWVudCBpbnN0YW5jZW9mIENvbXByZXNzZWRKYXZhTGlicmFyaWVzKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gTk9fQ0hJTERSRU47Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsgCi0JCWNvbXByZXNzZWROb2Rlcy5jbGVhcigpOyAKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIENvbW1vblZpZXdlcikgewotCQkJY29tbW9uVmlld2VyID0gKENvbW1vblZpZXdlcikgdmlld2VyOwotCQkJSU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIHNlcnZpY2UgPSBjb21tb25WaWV3ZXIuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKTsKLQkJCUlOYXZpZ2F0b3JDb250ZW50RXh0ZW5zaW9uIGphdmFleHQgPSBzZXJ2aWNlLmdldENvbnRlbnRFeHRlbnNpb25CeUlkKEpBVkFfRVhURU5TSU9OX0lEKTsKLQkJCWlmIChqYXZhZXh0ICE9IG51bGwpCi0JCQkJZGVsZWdhdGVDb250ZW50UHJvdmlkZXIgPSBqYXZhZXh0LmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJY29tcHJlc3NlZE5vZGVzLmNsZWFyKCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgewotCi0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDbGFzc3BhdGhDb250YWluZXIoT2JqZWN0IG8pIHsJCQotCQlyZXR1cm4gSU5URVJOQUxfQ09OVEFJTkVSX0NMQVNTICE9IG51bGwgJiYgSU5URVJOQUxfQ09OVEFJTkVSX0NMQVNTLmlzSW5zdGFuY2Uobyk7Ci0JfSAKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9XZWJKYXZhTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9XZWJKYXZhTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdlZDVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViSmF2YUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJvYmxlbXNMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBXZWJKYXZhTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQkKLQlwcml2YXRlIElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IgPSBuZXcgUHJvYmxlbXNMYWJlbERlY29yYXRvcigpOwotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElDb21wcmVzc2VkTm9kZSkKLQkJCWltYWdlID0gKChJQ29tcHJlc3NlZE5vZGUpZWxlbWVudCkuZ2V0SW1hZ2UoKTsgCi0JCQotCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBudWxsOwotCQlpZihpbWFnZSAhPSBudWxsICYmICggamF2YUVsZW1lbnQgPSAoKElDb21wcmVzc2VkTm9kZSllbGVtZW50KS5nZXRKYXZhRWxlbWVudCgpKSAhPSBudWxsICkgewkJCQotCQkJaW1hZ2UgPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgamF2YUVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSUNvbXByZXNzZWROb2RlKQotCQkJdGV4dCA9ICgoSUNvbXByZXNzZWROb2RlKWVsZW1lbnQpLmdldExhYmVsKCk7IAotCi0JCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IG51bGw7Ci0JCWlmKHRleHQgIT0gbnVsbCAmJiAoIGphdmFFbGVtZW50ID0gKChJQ29tcHJlc3NlZE5vZGUpZWxlbWVudCkuZ2V0SmF2YUVsZW1lbnQoKSkgIT0gbnVsbCApIHsKLQkJCXRleHQgPSBkZWNvcmF0b3IuZGVjb3JhdGVUZXh0KHRleHQsIGphdmFFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7IAotCi0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsgCi0JCWRlY29yYXRvci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsgCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7IAotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvcGx1Z2luL1NlcnZsZXRVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3BsdWdpbi9TZXJ2bGV0VUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0NWFiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvcGx1Z2luL1NlcnZsZXRVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0VUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkiOyAvLyROT04tTkxTLTEkCi0JLy8JVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZXJ2bGV0VUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgU2VydmxldFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2bGV0VUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpICsgIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgZSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgSVN0YXR1cyBzdGF0dXMgKQotICAgIHsKLSAgICAgICAgZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyggc3RhdHVzICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3BsdWdpbi9XRUJVSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvcGx1Z2luL1dFQlVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyZWVjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvcGx1Z2luL1dFQlVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi1wdWJsaWMgY2xhc3MgV0VCVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAid2ViX3VpIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdFQlVJTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FV19TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZPTERFUl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUkxfTUFQUElOR1NfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJMX01BUFBJTkdTX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfTUFQUElOR1NfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRklMVEVSX01BUFBJTkdTX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSTF9TRVJWTEVUX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU1BBVENIRVJTX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfTU9ESUZJRVJTX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNVUEVSQ0xBU1NfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCX0NPTlRfUEFHRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX1BBQ0tBR0VfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQUJTVFJBQ1RfQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX01BSU5fQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU1QVFlfTElTVF9NU0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0V0FSQWN0aW9uX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT19XRUJfUFJPSkVDVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfTVNHX05PTkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQlJPV0VSX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19QVUJMSUNfQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJMX1BBVFRFUk5fTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCX0NPTlRfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUkxfUEFUVEVSTl9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19WQUxJREFUT1JfTUVTRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERVNDUklQVElPTl9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERVNDUklQVElPTl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVU0VfRVhJU1RJTkdfU0VSVkxFVF9DTEFTUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVU0VfRVhJU1RJTkdfRklMVEVSX0NMQVNTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRV9FWElTVElOR19MSVNURU5FUl9DTEFTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0ZJTkFMX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX0RFU0M7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFTEVDVF9DTEFTU19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0JST1dFUl9ESUFMT0dfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRXQVJBY3Rpb25fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF85OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9QQUNLQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUF9DTEFTU19OQU1FX1RPX0NMQVNTX0VSUk9SX01TRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCUk9XU0VfQlVUVE9OX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5JVF9QQVJBTV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTklUX1BBUkFNX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfTkFNRV9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDTEFTU19OQU1FX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9QQUNLQUdFX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzEzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0JVVFRPTl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFRElUX0JVVFRPTl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVkVfQlVUVE9OX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FV19TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTkVXX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5BTUVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkFNRV9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxVRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxVRV9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJfQ09OVF9QQUdFX0NPTVBfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0hPT1NFX1NFUlZMRVRfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0hPT1NFX0ZJTFRFUl9DTEFTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfSU5IRVJJVF9DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJfQ09OVF9QQUdFX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfSU5URVJGQUNFU19MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJDT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFTEVDVF9BTExfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENMRUFSX0JVVFRPTjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21wcmVzc2VkX0xpYnJhcmllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21wcmVzc2VkX0phdmFSZXNvdXJjZXM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydFRvV2ViVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0V2ViVmVyc2lvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1dJTkRPV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1BBR0VfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX0NPTlRFWFRfRVZFTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfSFRUUF9TRVNTSU9OX0VWRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfUkVRVUVTVF9FVkVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9MSUZFQ1lDTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9DSEFOR0VTX1RPX0FUVFJJQlVURVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9TRVNTSU9OX01JR1JBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX09CSkVDVF9CSU5ESU5HOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU1BBVENIRVJfUkVRVUVTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBESVNQQVRDSEVSX0ZPUldBUkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRElTUEFUQ0hFUl9JTkNMVURFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU1BBVENIRVJfRVJST1I7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBXRUJVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9MT0FEX0VSUk9SID0gXzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRV9XSVpfVElUTEUgPSBfMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfVkVSU0lPTl9MQkwgPSBfMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUFJPSkVDVF9NQUlOX1BHX1RJVExFID0gXzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BST0pFQ1RfTUFJTl9QR19ERVNDID0gXzQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BST0pFQ1RfTEJMID0gXzU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0ZJTEVfTEJMID0gXzY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lNUE9SVF9NQUlOX1BHX0RFU0MgPSBfNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU1QT1JUX01BSU5fUEdfVElUTEUgPSBfODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfRVhQT1JUX01BSU5fUEdfVElUTEUgPSBfOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfRVhQT1JUX01BSU5fUEdfREVTQyA9IF8xMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU1QT1JUX0NPTlRFWFRfUk9PVCA9IF8xMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQ09OVkVSVF9NQUlOX1BHX0RFU0MgPSBfMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0NPTlZFUlRfTUFJTl9QR19USVRMRSA9IF8xMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU1QT1JUX1dFQl9MSUJfUEdfVElUTEUgPSBfMTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lNUE9SVF9XRUJfTElCX1BHX0RFU0MgPSBfMTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX0lNUE9SVF9TRUxFQ1RfQUxMX0xJQlNfQlVUVE9OID0gXzE2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9JTVBPUlRfREVTRUxFQ1RfQUxMX0xJQlNfQlVUVE9OID0gXzE3OwotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRFZGl0RmlsdGVyTWFwcGluZ0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRFZGl0RmlsdGVyTWFwcGluZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDdlYmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkRWRpdEZpbHRlck1hcHBpbmdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkVSUk9SOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5GT1JXQVJEOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5JTkNMVURFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5VUkxfUEFUVEVSTl9MQUJFTDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlR3b0FycmF5UXVpY2tTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuRmlsdGVyTWFwcGluZ0l0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSUZpbHRlck1hcHBpbmdJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5TZXJ2bGV0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uU3RhdHVzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmxheW91dC5DZWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg3LzMwLzIwMDEgMTE6MTY6MzYgQU0pCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRFZGl0RmlsdGVyTWFwcGluZ0RpYWxvZyBleHRlbmRzIFNlbGVjdGlvblN0YXR1c0RpYWxvZyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsJCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZVJlbmRlcmVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSW1hZ2UgU0VSVkxFVF9JQ09OID0gCi0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCgoVVJMKSBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzZXJ2bGV0IikpLmNyZWF0ZUltYWdlKCk7Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIGVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gU0VSVkxFVF9JQ09OOwotICAgICAgICB9Ci0KLQl9Ci0JCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VSVkxFVCA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVVJMX1BBVFRFUk4gPSAxOwotCXByb3RlY3RlZCBCdXR0b24gZlNlcnZsZXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmVVJMUGF0dGVybkJ1dHRvbjsKLQlwcm90ZWN0ZWQgaW50IGZTZWxlY3Rpb24gPSAtMTsKLQlwcm90ZWN0ZWQgUGFnZUJvb2sgZlBhZ2VCb29rID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29udHJvbCBmVVJMUGF0dGVybkNvbnRyb2wgPSBudWxsOwotCXByb3RlY3RlZCBDb250cm9sIGZTZXJ2bGV0Q29udHJvbCA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBmQ2hpbGQgPSBudWxsOwotCS8vIGNvbnN0cnVjdGlvbiBwYXJhbWV0ZXJzCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZlJ1bm5hYmxlQ29udGV4dDsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgZkVsZW1lbnRSZW5kZXJlcjsKLQlwcml2YXRlIE9iamVjdFtdIGZFbGVtZW50czsKLQlwcml2YXRlIGJvb2xlYW4gZklnbm9yZUNhc2UgPSB0cnVlOwotCXByaXZhdGUgU3RyaW5nIGZVcHBlckxpc3RMYWJlbDsKLQotCS8vIFNXVCB3aWRnZXRzCi0JcHJpdmF0ZSBUYWJsZSBmVXBwZXJMaXN0OwotCXByb3RlY3RlZCBUZXh0IGZVUkxUZXh0OwotCXByaXZhdGUgU3RyaW5nW10gZlNlcnZsZXROYW1lczsKLQlwcml2YXRlIFN0cmluZ1tdIGZSZW5kZXJlZFN0cmluZ3M7Ci0JcHJpdmF0ZSBpbnQgZGlzcGF0Y2hlcnM7Ci0JcHJpdmF0ZSBCdXR0b24gZlJlcXVlc3Q7Ci0JcHJpdmF0ZSBCdXR0b24gZkZvcndhcmQ7Ci0JcHJpdmF0ZSBCdXR0b24gZkluY2x1ZGU7Ci0JcHJpdmF0ZSBCdXR0b24gZkVyb3JyOwotCXByaXZhdGUgSUZpbHRlck1hcHBpbmdJdGVtIHNlbGVjdGVkSXRlbTsKLQotCS8qKgotCSAqIE11bHRpU2VsZWN0RmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHBhcmVudCBTaGVsbAotCSAqIEBwYXJhbSB0aXRsZSBTdHJpbmcKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLQkgKiBAcGFyZW50IGV4dGVuc2lvbnMgU3RyaW5nW10KLQkgKiBAcGFyYW0gYWxsb3dNdWx0aXBsZSBib29sZWFuCi0JICovCi0JcHVibGljIEFkZEVkaXRGaWx0ZXJNYXBwaW5nRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBJUHJvamVjdCBwcm9qZWN0LCAKLQkgICAgICAgIExpc3Q8SUZpbHRlck1hcHBpbmdJdGVtPiBlbGVtZW50cywgSUZpbHRlck1hcHBpbmdJdGVtIGl0ZW0pIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJc2VsZWN0ZWRJdGVtID0gaXRlbTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuUkVTSVpFKTsKLQotCQlpZiAodGl0bGUgPT0gbnVsbCkKLQkJCXNldFRpdGxlKFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGaWxlX1NlbGVjdGlvbl9VSV8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBzZXRUaXRsZSh0aXRsZSk7Ci0JCQotCQlTdGF0dXMgY3VyclN0YXR1cyA9IG5ldyBTdGF0dXMoU3RhdHVzLk9LLCBTZXJ2bGV0VUlQbHVnaW4uUExVR0lOX0lELCBTdGF0dXMuT0ssICIiLCBudWxsKTsKLQkJCi0JCXVwZGF0ZVN0YXR1cyhjdXJyU3RhdHVzKTsKLQkJZkVsZW1lbnRSZW5kZXJlciA9IG5ldyBUeXBlUmVuZGVyZXIoKTsKLQkJZlJ1bm5hYmxlQ29udGV4dCA9IFNlcnZsZXRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCXRyeSB7Ci0gICAgICAgICAgICBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0gICAgICAgICAgICBPYmplY3QgbU9iaiA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBzZXJ2bGV0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGlmIChtT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwKSB7Ci0gICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIG1PYmo7Ci0gICAgICAgICAgICAgICAgTGlzdDxTZXJ2bGV0PiBzZXJ2bGV0cyA9IHdlYkFwcC5nZXRTZXJ2bGV0cygpOwotICAgICAgICAgICAgICAgIGZvciAoU2VydmxldCBzZXJ2bGV0IDogc2VydmxldHMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlcnZsZXROYW1lLmVxdWFscyhpdGVtICE9IG51bGwgPyBpdGVtLmdldE5hbWUoKSA6IG51bGwpICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWxyZWFkeUFkZGVkKHNlcnZsZXROYW1lLCBlbGVtZW50cykpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0c0xpc3QuYWRkKHNlcnZsZXROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1PYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIHsKLSAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSBtT2JqOwotICAgICAgICAgICAgICAgIExpc3Q8b3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldD4gc2VydmxldHMgPSB3ZWJBcHAuZ2V0U2VydmxldHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQgc2VydmxldCA6IHNlcnZsZXRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2bGV0TmFtZSA9IHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXJ2bGV0TmFtZS5lcXVhbHMoaXRlbSAhPSBudWxsID8gaXRlbS5nZXROYW1lKCkgOiBudWxsKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FscmVhZHlBZGRlZChzZXJ2bGV0TmFtZSwgZWxlbWVudHMpKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmxldHNMaXN0LmFkZChzZXJ2bGV0TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgZlNlcnZsZXROYW1lcyA9IChTdHJpbmdbXSkgc2VydmxldHNMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tzZXJ2bGV0c0xpc3Quc2l6ZSgpXSk7Ci0gICAgICAgICAgICBzZXJ2bGV0c0xpc3QgPSBudWxsOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU2VydmxldFVJUGx1Z2luLmxvZyhlKTsKLSAgICAgICAgfQotCX0KLQkKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBbHJlYWR5QWRkZWQoU3RyaW5nIHNlcnZsZXQsIExpc3Q8SUZpbHRlck1hcHBpbmdJdGVtPiBlbGVtZW50cykgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSUZpbHRlck1hcHBpbmdJdGVtIGl0ZW0gPSAoSUZpbHRlck1hcHBpbmdJdGVtKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoaXRlbS5pc1NlcnZsZXROYW1lVHlwZSgpICYmIGl0ZW0uZ2V0TmFtZSgpLmVxdWFscyhzZXJ2bGV0KSkgCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBwcml2YXRlCi0JICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlc3VsdCgpIHsKLSAgICAgICAgaWYgKGZTZWxlY3Rpb24gPT0gVVJMX1BBVFRFUk4pIHsKLSAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7ICAgICAgICAgICAKLSAgICAgICAgICAgIGRpc3BhdGNoZXJzID0gZ2V0RGlzcGF0Y2hlcnMoKTsKLSAgICAgICAgICAgIEZpbHRlck1hcHBpbmdJdGVtIG1hcHBpbmdJdGVtID0gCi0gICAgICAgICAgICAgICAgbmV3IEZpbHRlck1hcHBpbmdJdGVtKEZpbHRlck1hcHBpbmdJdGVtLlVSTF9QQVRURVJOLCBmVVJMVGV4dC5nZXRUZXh0KCkudHJpbSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJzKTsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQobWFwcGluZ0l0ZW0pOwotICAgICAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmxldE5hbWUgPSAoU3RyaW5nKSBnZXRXaWRnZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChzZXJ2bGV0TmFtZSA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdF9DbGFzc19VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJTZWxlY3QgQ2xhc3MiCi0vLyAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ291bGRfbm90X3VuaXF1ZWx5X21hcF90aGVfRVJST1JfIik7IC8vJE5PTi1OTFMtMSQgPSAiQ291bGQgbm90IHVuaXF1ZWx5IG1hcCB0aGUgY2xhc3MgbmFtZSB0byBhIGNsYXNzLiIKLS8vICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgc2V0UmVzdWx0KG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkaXNwYXRjaGVycyA9IGdldERpc3BhdGNoZXJzKCk7Ci0gICAgICAgICAgICAgICAgamF2YS51dGlsLkxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgxKTsKLSAgICAgICAgICAgICAgICBGaWx0ZXJNYXBwaW5nSXRlbSBtYXBwaW5nSXRlbSA9IAotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyTWFwcGluZ0l0ZW0oRmlsdGVyTWFwcGluZ0l0ZW0uU0VSVkxFVF9OQU1FLCBzZXJ2bGV0TmFtZSwgZGlzcGF0Y2hlcnMpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobWFwcGluZ0l0ZW0pOwotICAgICAgICAgICAgICAgIHNldFJlc3VsdChyZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0RGlzcGF0Y2hlcnMoKSB7Ci0gICAgICAgIGludCBkaXNwYXRjaGVycyA9IDA7Ci0gICAgICAgIGlmIChmUmVxdWVzdC5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgZGlzcGF0Y2hlcnMgfD0gSUZpbHRlck1hcHBpbmdJdGVtLlJFUVVFU1Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZGb3J3YXJkLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBkaXNwYXRjaGVycyB8PSBJRmlsdGVyTWFwcGluZ0l0ZW0uRk9SV0FSRDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZkluY2x1ZGUuZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIGRpc3BhdGNoZXJzIHw9IElGaWx0ZXJNYXBwaW5nSXRlbS5JTkNMVURFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmRXJvcnIuZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIGRpc3BhdGNoZXJzIHw9IElGaWx0ZXJNYXBwaW5nSXRlbS5FUlJPUjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlzcGF0Y2hlcnM7Ci0gICAgfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZEl0ZW0gPT0gbnVsbCAmJiAoZlNlcnZsZXROYW1lcyAhPSBudWxsICYmIGZTZXJ2bGV0TmFtZXMubGVuZ3RoID4gMCkpIGZTZWxlY3Rpb24gPSBTRVJWTEVUOyAKLQkJdXBkYXRlT2tTdGF0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIGRpYWxvZydzIAotCSAqIGJ1dHRvbiBiYXIuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kCi0JICogbGF5cyBvdXQgYSBidXR0b24gYmFyIGFuZCBjYWxscyB0aGUgPGNvZGU+Y3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcjwvY29kZT4KLQkgKiBmcmFtZXdvcmsgbWV0aG9kIHRvIHBvcHVsYXRlIGl0LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGJ1dHRvbiBiYXIKLQkgKiBAcmV0dXJuIHRoZSBidXR0b24gYmFyIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCi0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZTIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCS8vIGNyZWF0ZSBhIGxheW91dCB3aXRoIHNwYWNpbmcgYW5kIG1hcmdpbnMgYXBwcm9wcmlhdGUgZm9yIHRoZSBmb250IHNpemUuCi0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMDsgLy8gdGhpcyBpcyBpbmNyZW1lbnRlZCBieSBjcmVhdGVCdXR0b24KLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQotCQljb21wb3NpdGUyLnNldExheW91dChsYXlvdXQpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQljb21wb3NpdGUyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY29tcG9zaXRlMi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCS8vIEFkZCB0aGUgYnV0dG9ucyB0byB0aGUgYnV0dG9uIGJhci4KLQkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihjb21wb3NpdGUyKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKgotCSAqIEBwcml2YXRlCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0KLQkJZkNoaWxkID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmQ2hpbGQsICJjb20uaWJtLmV0b29scy53ZWJhcHBsaWNhdGlvbmVkaXQud2VieDIwMTAiKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDI7Ci0JCWdsLm1hcmdpbkhlaWdodCA9IDA7Ci0JCWZDaGlsZC5zZXRMYXlvdXQoZ2wpOwotCi0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlmQ2hpbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBXZWIgVHlwZSByYWRpbyBidXR0b25zIGFuZCB0ZXh0IGZpZWxkcy4KLQkJZlNlcnZsZXRCdXR0b24gPSBuZXcgQnV0dG9uKGZDaGlsZCwgU1dULlJBRElPKTsKLQkJZlNlcnZsZXRCdXR0b24uc2V0VGV4dChXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VydmxldF9VSV8iKSk7IC8vJE5PTi1OTFMtMSQgPSBTZXJ2bGV0Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWZTZXJ2bGV0QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlmU2VydmxldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlmVVJMUGF0dGVybkJ1dHRvbiA9IG5ldyBCdXR0b24oZkNoaWxkLCBTV1QuUkFESU8pOwotCQlmVVJMUGF0dGVybkJ1dHRvbi5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVUkxfcGF0dGVybl9VSV8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZlVSTFBhdHRlcm5CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZVUkxQYXR0ZXJuQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vQ3JlYXRlIFVSTCBQYXR0ZXJuIHBhZ2UgCi0JCWZQYWdlQm9vayA9IG5ldyBQYWdlQm9vayhmQ2hpbGQsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmUGFnZUJvb2suc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShmUGFnZUJvb2ssIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLSAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIAotICAgICAgICBMYWJlbCBtZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsLnNldFRleHQoVVJMX1BBVFRFUk5fTEFCRUwpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgZlVSTFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIHNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLSAgICAgICAgc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICAgICAgZlVSTFRleHQuc2V0TGF5b3V0RGF0YShzcGVjKTsKLSAgICAgICAgTGlzdGVuZXIgbCA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZU9rU3RhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZlVSTFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbCk7Ci0gICAgICAgIGZVUkxQYXR0ZXJuQ29udHJvbCA9IGNvbXBvc2l0ZTsKLQotICAgICAgICAvL0NyZWF0ZSBTZXJ2bGV0IHBhZ2UKLSAgICAgICAgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShmUGFnZUJvb2ssIFNXVC5OT05FKTsKLSAgICAgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0gICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIG1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0VGV4dChXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2hvb3NlX2Ffc2VydmxldF9fMiIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGZVcHBlckxpc3QgPSBjcmVhdGVVcHBlckxpc3QoY29tcG9zaXRlKTsKLQotICAgICAgICBmU2VydmxldENvbnRyb2wgPSBjb21wb3NpdGU7Ci0KLSAgICAgICAgLy9DcmVhdGUgRGlzcGF0Y2hlcnMgY29udHJvbAotICAgICAgICBHcm91cCBkaXNwYXRjaGVycyA9IG5ldyBHcm91cChmQ2hpbGQsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICBkaXNwYXRjaGVycy5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWxlY3RfRGlzcGF0Y2hlcnNfVUlfIikpOwotICAgICAgICBkaXNwYXRjaGVycy5zZXRMYXlvdXQobmV3IENlbGxMYXlvdXQoMikuc2V0TWFyZ2lucygxMCwxMCkuc2V0U3BhY2luZyg1LDUpKTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBkaXNwYXRjaGVycy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgZlJlcXVlc3QgPSBuZXcgQnV0dG9uKGRpc3BhdGNoZXJzLCBTV1QuQ0hFQ0spOwotICAgICAgICBmUmVxdWVzdC5zZXRUZXh0KFJFUVVFU1QpOwotICAgICAgICBmRm9yd2FyZCA9IG5ldyBCdXR0b24oZGlzcGF0Y2hlcnMsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGZGb3J3YXJkLnNldFRleHQoRk9SV0FSRCk7Ci0gICAgICAgIGZJbmNsdWRlID0gbmV3IEJ1dHRvbihkaXNwYXRjaGVycywgU1dULkNIRUNLKTsKLSAgICAgICAgZkluY2x1ZGUuc2V0VGV4dChJTkNMVURFKTsKLSAgICAgICAgZkVyb3JyID0gbmV3IEJ1dHRvbihkaXNwYXRjaGVycywgU1dULkNIRUNLKTsKLSAgICAgICAgZkVyb3JyLnNldFRleHQoRVJST1IpOwotICAgICAgICAKLSAgICAgICAgaWYgKHNlbGVjdGVkSXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtLmlzVXJsUGF0dGVyblR5cGUoKSkgewotICAgICAgICAgICAgICAgIGZTZWxlY3Rpb24gPSBVUkxfUEFUVEVSTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZlNlbGVjdGlvbiA9IFNFUlZMRVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZlNlcnZsZXROYW1lcyA9PSBudWxsIHx8IGZTZXJ2bGV0TmFtZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICBmU2VsZWN0aW9uID0gVVJMX1BBVFRFUk47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVXBwZXJMaXN0V2lkZ2V0KCk7Ci0KLSAgICAgICAgZlNlcnZsZXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgaWYgKGZTZWxlY3Rpb24gPT0gVVJMX1BBVFRFUk4pIHsKLSAgICAgICAgICAgIGZVUkxQYXR0ZXJuQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIGZQYWdlQm9vay5zaG93UGFnZShmVVJMUGF0dGVybkNvbnRyb2wpOwotICAgICAgICAgICAgZlNlcnZsZXRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChmU2VydmxldE5hbWVzID09IG51bGwgfHwgZlNlcnZsZXROYW1lcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgIGZTZXJ2bGV0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZlVSTFRleHQuc2V0VGV4dChzZWxlY3RlZEl0ZW0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBzZXREaXNwYXRjaGVycyhzZWxlY3RlZEl0ZW0uZ2V0RGlzcGF0Y2hlcnMoKSk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZTZXJ2bGV0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIGZQYWdlQm9vay5zaG93UGFnZShmU2VydmxldENvbnRyb2wpOwotICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZlVwcGVyTGlzdC5zZXRTZWxlY3Rpb24oZ2V0U2VydmxldEluZGV4KGZVcHBlckxpc3QsIHNlbGVjdGVkSXRlbS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICBzZXREaXNwYXRjaGVycyhzZWxlY3RlZEl0ZW0uZ2V0RGlzcGF0Y2hlcnMoKSk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCQl1cGRhdGVPa1N0YXRlKCk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotICAgIHByaXZhdGUgaW50IGdldFNlcnZsZXRJbmRleChUYWJsZSBsaXN0LCBTdHJpbmcgbmFtZSkgewotICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IGxpc3QuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgaWYgKHRhYmxlSXRlbS5nZXRUZXh0KCkuZXF1YWxzKG5hbWUpKSByZXR1cm4gaTsgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNwYXRjaGVycyhpbnQgZGlzcGF0Y2hlcnMpIHsKLSAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5SRVFVRVNUKSA+IDApIHsKLSAgICAgICAgICAgIGZSZXF1ZXN0LnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLkZPUldBUkQpID4gMCkgewotICAgICAgICAgICAgZkZvcndhcmQuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uSU5DTFVERSkgPiAwKSB7Ci0gICAgICAgICAgICBmSW5jbHVkZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5FUlJPUikgPiAwKSB7Ci0gICAgICAgICAgICBmRXJvcnIuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3Qgd2lkZ2V0IGFuZCBzZXRzIGxheW91dCBkYXRhLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdAotCSAqLwotCXByaXZhdGUgVGFibGUgY3JlYXRlVXBwZXJMaXN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGZVcHBlckxpc3RMYWJlbCAhPSBudWxsKQotCQkJIChuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkpLnNldFRleHQoZlVwcGVyTGlzdExhYmVsKTsKLQotCQlUYWJsZSBsaXN0ID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0vLwkJbGlzdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotLy8JCQkJaGFuZGxlVXBwZXJTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0vLwkJCX0KLS8vCQl9KTsKLQkJbGlzdC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3VibGVDbGljaywgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJaGFuZGxlVXBwZXJEb3VibGVDbGljaygpOwotCQkJfQotCQl9KTsKLQkJbGlzdC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJZkVsZW1lbnRSZW5kZXJlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0JCXNwZWMud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDUwKTsKLQkJc3BlYy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg0KTsKLQkJc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsaXN0LnNldExheW91dERhdGEoc3BlYyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGUgYnV0dG9uIHRoYXQgaXMgJ3ByZXNzZWQnIG9uIGRvdWJsZUNsaWNrIGluIHRoZSBsaXN0cy4KLQkgKiBCeSBkZWZhdWx0IGl0IGlzIHRoZSBPSyBidXR0b24uCi0JICogT3ZlcnJpZGUgdG8gY2hhbmdlIHRoaXMgc2V0dGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRCdXR0b25JRCgpIHsKLQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuT0tfSUQ7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gZlNlbGVjdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRXaWRnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZVcHBlckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyBmRWxlbWVudHNbaW5kZXhdIDogbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlTG93ZXJEb3VibGVDbGljaygpIHsKLQkJaWYgKGdldFdpZGdldFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQlidXR0b25QcmVzc2VkKGdldERlZmF1bHRCdXR0b25JRCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlTG93ZXJTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQl1cGRhdGVPa1N0YXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZVVwcGVyRG91YmxlQ2xpY2soKSB7Ci0JCWlmIChnZXRXaWRnZXRTZWxlY3Rpb24oKSAhPSBudWxsKQotCQkJYnV0dG9uUHJlc3NlZChnZXREZWZhdWx0QnV0dG9uSUQoKSk7Ci0JfQotCQotCXB1YmxpYyBpbnQgb3BlbigpIHsKLSAgICAgICAgaWYgKGZTZXJ2bGV0TmFtZXMgPT0gbnVsbCB8fCBmU2VydmxldE5hbWVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICBmU2VsZWN0aW9uID0gVVJMX1BBVFRFUk47Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRFbGVtZW50cyhmU2VydmxldE5hbWVzKTsKLSAgICAgICAgc2V0SW5pdGlhbFNlbGVjdGlvbnMobmV3IE9iamVjdFtdIHsgIiIgfSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKiBAcGFyYW0gcCBvcmcuZWNsaXBzZS5qZmFjZS5lbGVtZW50cy5JSW5kZXhlZFByb3BlcnR5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSByZW5kZXJTdHJpbmdzKE9iamVjdFtdIHApIHsKLQkJU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbcC5sZW5ndGhdOwotCQlpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJc3RyaW5nc1tpXSA9IGZFbGVtZW50UmVuZGVyZXIuZ2V0VGV4dChwW2ldKTsKLQkJfQotCQluZXcgVHdvQXJyYXlRdWlja1NvcnRlcihmSWdub3JlQ2FzZSkuc29ydChzdHJpbmdzLCBwKTsKLQkJcmV0dXJuIHN0cmluZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkgICAgaWYgKGVsZW1lbnRzID09IG51bGwpIGVsZW1lbnRzID0gbmV3IE9iamVjdFswXTsgCi0JCWZFbGVtZW50cyA9IGVsZW1lbnRzOwotCQlmUmVuZGVyZWRTdHJpbmdzID0gcmVuZGVyU3RyaW5ncyhmRWxlbWVudHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSXRlbShpbnQgbmV3U2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVPa1N0YXRlKCkgewotCQlCdXR0b24gb2tCdXR0b24gPSBnZXRPa0J1dHRvbigpOwotCQlpZiAob2tCdXR0b24gIT0gbnVsbCkKLQkJICAgIGlmIChmU2VsZWN0aW9uID09IFNFUlZMRVQpIHsKLQkJICAgICAgICBva0J1dHRvbi5zZXRFbmFibGVkKGdldFdpZGdldFNlbGVjdGlvbigpICE9IG51bGwpOwotCQkgICAgfSBlbHNlIHsKLQkJICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZlVSTFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsJCSAgICAgICAgCi0JCSAgICAgICAgb2tCdXR0b24uc2V0RW5hYmxlZChyZXN1bHQubGVuZ3RoKCkgPiAwKTsKLQkJICAgIH0KLQl9Ci0JCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVVwcGVyTGlzdFdpZGdldCgpIHsKLSAgICAgICAgZlVwcGVyTGlzdC5zZXRSZWRyYXcoZmFsc2UpOwotICAgICAgICBmVXBwZXJMaXN0LmNsZWFyQWxsKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZlJlbmRlcmVkU3RyaW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGFibGVJdGVtIHRpID0gbmV3IFRhYmxlSXRlbShmVXBwZXJMaXN0LCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICB0aS5zZXRUZXh0KGZSZW5kZXJlZFN0cmluZ3NbaV0pOwotICAgICAgICAgICAgLy8gWFhYOiAxRzY1TERHOiBKRlVJRjpXSU4yMDAwIC0gSUxhYmVsUHJvdmlkZXIgdXNlZCBvdXRzaWRlIGEgdmlld2VyCi0gICAgICAgICAgICBJbWFnZSBpbWcgPSBmRWxlbWVudFJlbmRlcmVyLmdldEltYWdlKGZSZW5kZXJlZFN0cmluZ3NbaV0pOwotICAgICAgICAgICAgdGkuc2V0SW1hZ2UoaW1nKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZlVwcGVyTGlzdC5nZXRJdGVtQ291bnQoKSA+IDApIHsKLSAgICAgICAgICAgIGZVcHBlckxpc3Quc2V0U2VsZWN0aW9uKDApOwotICAgICAgICB9Ci0gICAgICAgIGZVcHBlckxpc3Quc2V0UmVkcmF3KHRydWUpOwotICAgIH0KLQkKLQkvKioKLQkgKiBTZW50IHdoZW4gZGVmYXVsdCBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBjb250cm9sLgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBvbiBzb21lIHBsYXRmb3JtcyBkZWZhdWx0IHNlbGVjdGlvbiBvY2N1cnMKLQkgKiBpbiBhIExpc3Qgd2hlbiB0aGUgdXNlciBkb3VibGUtY2xpY2tzIGFuIGl0ZW0gb3IgdHlwZXMKLQkgKiByZXR1cm4gaW4gYSBUZXh0LgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBlIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlZmF1bHQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBTZW50IHdoZW4gc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUgY29udHJvbC4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgb24gc29tZSBwbGF0Zm9ybXMgc2VsZWN0aW9uIG9jY3VycyBpbgotCSAqIGEgTGlzdCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBvciBpdGVtcy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gZSBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSBmVVJMUGF0dGVybkJ1dHRvbikgewotCQkJZlNlbGVjdGlvbiA9IFVSTF9QQVRURVJOOwotCQkJZlBhZ2VCb29rLnNob3dQYWdlKGZVUkxQYXR0ZXJuQ29udHJvbCk7Ci0JCQl1cGRhdGVPa1N0YXRlKCk7Ci0JCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gZlNlcnZsZXRCdXR0b24pIHsKLQkJCWZTZWxlY3Rpb24gPSBTRVJWTEVUOwotCQkJZlBhZ2VCb29rLnNob3dQYWdlKGZTZXJ2bGV0Q29udHJvbCk7Ci0JCQlnZXRTaGVsbCgpLnBhY2soKTsKLQkJfSBlbHNlCi0JCQlmU2VsZWN0aW9uID0gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRGaWx0ZXJXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkRmlsdGVyV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4N2ZlZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRGaWx0ZXJXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ORVdfSkFWQV9DTEFTU19ERVNUSU5BVElPTl9XSVpBUkRfUEFHRV9ERVNDOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ORVdfSkFWQV9DTEFTU19PUFRJT05TX1dJWkFSRF9QQUdFX0RFU0M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5JV2ViVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiBOZXcgc2VydmxldCBmaWx0ZXIgd2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRGaWx0ZXJXaXphcmQgZXh0ZW5kcyBOZXdXZWJBcnRpZmFjdFdpemFyZCB7Ci0JCi0gICAgcHVibGljIEFkZEZpbHRlcldpemFyZCgpIHsKLSAgICAgICAgdGhpcyhudWxsKTsKLSAgICB9Ci0KLQlwdWJsaWMgQWRkRmlsdGVyV2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBBRERfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldEltYWdlRnJvbUoyRUVQbHVnaW4oIm5ld2ZpbHRlcl93aXoiKTsgLy8kTk9OLU5MUy0xJAotCX0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlOZXdGaWx0ZXJDbGFzc1dpemFyZFBhZ2UgcGFnZTEgPSBuZXcgTmV3RmlsdGVyQ2xhc3NXaXphcmRQYWdlKAotCQkgICAgICAgIGdldERhdGFNb2RlbCgpLAotCQkgICAgICAgIFBBR0VfT05FLAotCQkgICAgICAgIE5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0MsCi0JCQkJQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9USVRMRSwgCi0JCQkJSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIpOwotCQlwYWdlMS5zZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XRUJFRElUT1JfRklMVEVSX1BBR0VfQUREX0ZJTFRFUl9XSVpBUkRfMSk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCi0JCUFkZEZpbHRlcldpemFyZFBhZ2UgcGFnZTIgPSBuZXcgQWRkRmlsdGVyV2l6YXJkUGFnZShnZXREYXRhTW9kZWwoKSwgUEFHRV9UV08pOwotCQlwYWdlMi5zZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XRUJFRElUT1JfRklMVEVSX1BBR0VfQUREX0ZJTFRFUl9XSVpBUkRfMik7Ci0JCWFkZFBhZ2UocGFnZTIpOwotICAgICAgICAKLSAgICAgICAgTmV3RmlsdGVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSBwYWdlMyA9IG5ldyBOZXdGaWx0ZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlKAotICAgICAgICAgICAgICAgIGdldERhdGFNb2RlbCgpLCAKLSAgICAgICAgICAgICAgICBQQUdFX1RIUkVFLAotICAgICAgICAgICAgICAgIE5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQywKLSAgICAgICAgICAgICAgICBBRERfRklMVEVSX1dJWkFSRF9QQUdFX1RJVExFKTsKLSAgICAgICAgcGFnZTMuc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0VCRURJVE9SX0ZJTFRFUl9QQUdFX0FERF9GSUxURVJfV0laQVJEXzMpOwotICAgICAgICBhZGRQYWdlKHBhZ2UzKTsKLQl9Ci0gICAgCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgIAkvL29wZW4gbmV3IGZpbHRlciBjbGFzcyBpbiBqYXZhIGVkaXRvcgotICAgICAgICBvcGVuSmF2YUNsYXNzKCk7Ci0gICAgfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRGaWx0ZXJXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZEZpbHRlcldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5MzNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZEZpbHRlcldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRklMVEVSX01BUFBJTkdTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVRfUEFSQU07Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTQ1JJUFRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRElTUExBWV9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRV9FWElTVElOR19DTEFTUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0JVVFRPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9ERVNDOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfRklMVEVSX1dJWkFSRF9QQUdFX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ERVNDUklQVElPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuREVTQ1JJUFRJT05fVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkRJU1BBVENIRVJTX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5FRElUX0JVVFRPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuSU5JVF9QQVJBTV9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuSU5JVF9QQVJBTV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkFNRV9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkFNRV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTk9fV0VCX1BST0pFQ1RTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5SRU1PVkVfQlVUVE9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5VUkxfU0VSVkxFVF9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVkFMVUVfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlZBTFVFX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5GaWx0ZXJNYXBwaW5nSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JRmlsdGVyTWFwcGluZ0l0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLlN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogRmlsdGVyIFdpemFyZCBTZXR0aW5nIFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEFkZEZpbHRlcldpemFyZFBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIHsKLQkKLQlmaW5hbCBzdGF0aWMgU3RyaW5nW10gRklMVEVSRVhURU5TSU9OUyA9IHsiamF2YSJ9OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRleHQgZGlzcGxheU5hbWVUZXh0OwotCi0JRmlsdGVyTWFwcGluZ3NBcnJheVRhYmxlV2l6YXJkU2VjdGlvbiBtYXBwaW5nU2VjdGlvbjsKLQotCXB1YmxpYyBBZGRGaWx0ZXJXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXREZXNjcmlwdGlvbihBRERfRklMVEVSX1dJWkFSRF9QQUdFX0RFU0MpOwotCQlzZXRUaXRsZShBRERfRklMVEVSX1dJWkFSRF9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBESVNQTEFZX05BTUUsIAotCQkgICAgICAgIElOSVRfUEFSQU0sIAotCQkgICAgICAgIEZJTFRFUl9NQVBQSU5HUyB9OwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY3JlYXRlTmFtZURlc2NyaXB0aW9uKGNvbXBvc2l0ZSk7Ci0JCQotCQlTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbkNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IFN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uQ2FsbGJhY2soKTsKLQkJU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24gaW5pdFNlY3Rpb24gPSBuZXcgU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24oCi0JCQkJY29tcG9zaXRlLCAKLQkJCQlJTklUX1BBUkFNX0xBQkVMLCAKLQkJCQlJTklUX1BBUkFNX1RJVExFLCAKLQkJCQlBRERfQlVUVE9OX0xBQkVMLCAKLQkJCQlFRElUX0JVVFRPTl9MQUJFTCwgCi0JCQkJUkVNT1ZFX0JVVFRPTl9MQUJFTCwgCi0JCQkJbmV3IFN0cmluZ1tdIHsgTkFNRV9USVRMRSwgVkFMVUVfVElUTEUsIERFU0NSSVBUSU9OX1RJVExFIH0sIAotCQkJCW5ldyBTdHJpbmdbXSB7IE5BTUVfTEFCRUwsIFZBTFVFX0xBQkVMLCBERVNDUklQVElPTl9MQUJFTCB9LCAKLQkJCQludWxsLC8vIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImluaXRpYWxpel9wYXJhbWV0ZXIiKSwKLQkJCQltb2RlbCwgCi0JCQkJSU5JVF9QQVJBTSk7Ci0JCWluaXRTZWN0aW9uLnNldENhbGxiYWNrKGNhbGxiYWNrKTsKLQkJCi0JCVN0cmluZ1tdIGJ1dHRvbnMgPSBuZXcgU3RyaW5nW10gewotCQkgICAgICAgIEFERF9CVVRUT05fTEFCRUwsIAotCQkgICAgICAgIEVESVRfQlVUVE9OX0xBQkVMLCAKLQkJICAgICAgICBSRU1PVkVfQlVUVE9OX0xBQkVMCi0JCX07Ci0JCVN0cmluZ1tdIGNvbHVtbk5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLQkJICAgICAgICBudWxsLAotCQkgICAgICAgIFVSTF9TRVJWTEVUX0xBQkVMLAotCQkgICAgICAgIERJU1BBVENIRVJTX0xBQkVMCi0JCX07Ci0JCW1hcHBpbmdTZWN0aW9uID0gbmV3IEZpbHRlck1hcHBpbmdzQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24oY29tcG9zaXRlLCAKLQkJICAgICAgICAgbW9kZWwsIEZJTFRFUl9NQVBQSU5HUyk7Ci0KLQkJU3RyaW5nIHRleHQgPSBkaXNwbGF5TmFtZVRleHQuZ2V0VGV4dCgpOwotCQkvLyBTZXQgZGVmYXVsdCBVUkwgUGF0dGVybgotCQlMaXN0IGlucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnB1dC5hZGQobmV3IEZpbHRlck1hcHBpbmdJdGVtKElGaWx0ZXJNYXBwaW5nSXRlbS5VUkxfUEFUVEVSTiwgIi8iICsgdGV4dCkpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtYXBwaW5nU2VjdGlvbiAhPSBudWxsKQotCQkgICAgbWFwcGluZ1NlY3Rpb24uc2V0SW5wdXQoaW5wdXQpOwotCQlkaXNwbGF5TmFtZVRleHQuc2V0Rm9jdXMoKTsKLQotCQlJU3RhdHVzIHByb2plY3RTdGF0dXMgPSB2YWxpZGF0ZVByb2plY3ROYW1lKCk7Ci0JCWlmICghcHJvamVjdFN0YXR1cy5pc09LKCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShwcm9qZWN0U3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQljb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdE5hbWUoKSB7Ci0JCS8vIGNoZWNrIGZvciBlbXB0eQotCQlpZiAobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSA9PSBudWxsIHx8IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoTk9fV0VCX1BST0pFQ1RTKTsKLQkJfQotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOYW1lRGVzY3JpcHRpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCS8vIGRpc3BsYXkgbmFtZQotCQlMYWJlbCBkaXNwbGF5TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlkaXNwbGF5TmFtZUxhYmVsLnNldFRleHQoTkFNRV9MQUJFTCk7Ci0JCWRpc3BsYXlOYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJZGlzcGxheU5hbWVUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWRpc3BsYXlOYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGlzcGxheU5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCVN0cmluZyB0ZXh0ID0gZGlzcGxheU5hbWVUZXh0LmdldFRleHQoKTsKLQkJCQkvLyBTZXQgZGVmYXVsdCBVUkwgUGF0dGVybgotCQkJCUxpc3QgaW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaW5wdXQuYWRkKG5ldyBGaWx0ZXJNYXBwaW5nSXRlbShJRmlsdGVyTWFwcGluZ0l0ZW0uVVJMX1BBVFRFUk4sICIvIiArIHRleHQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChtYXBwaW5nU2VjdGlvbiAhPSBudWxsKQotCQkJCSAgICBtYXBwaW5nU2VjdGlvbi5zZXRJbnB1dChpbnB1dCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChkaXNwbGF5TmFtZVRleHQsIERJU1BMQVlfTkFNRSwgbnVsbCk7Ci0KLQkJLy8gZGVzY3JpcHRpb24KLQkJTGFiZWwgZGVzY0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlkZXNjTGFiZWwuc2V0VGV4dChERVNDUklQVElPTl9MQUJFTCk7Ci0JCWRlc2NMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQlUZXh0IGRlc2NUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWRlc2NUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoZGVzY1RleHQsIERFU0NSSVBUSU9OLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWVUZXh0LmdldFRleHQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7Ci0JCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVVNFX0VYSVNUSU5HX0NMQVNTKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLmNhbkZsaXBUb05leHRQYWdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHNob3dWYWxpZGF0aW9uRXJyb3JzT25FbnRlcigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRMaXN0ZW5lcldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRMaXN0ZW5lcldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjkwMDIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkTGlzdGVuZXJXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfTElTVEVORVJfV0laQVJEX1dJTkRPV19USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkVXX0pBVkFfQ0xBU1NfT1BUSU9OU19XSVpBUkRfUEFHRV9ERVNDOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5JV2ViVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiBOZXcgYXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVyIHdpemFyZAotICovCi1wdWJsaWMgY2xhc3MgQWRkTGlzdGVuZXJXaXphcmQgZXh0ZW5kcyBOZXdXZWJBcnRpZmFjdFdpemFyZCB7Ci0JCi0JcHVibGljIEFkZExpc3RlbmVyV2l6YXJkKCkgewotCSAgICB0aGlzKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgQWRkTGlzdGVuZXJXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIEFERF9MSVNURU5FUl9XSVpBUkRfV0lORE9XX1RJVExFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBnZXRJbWFnZUZyb21KMkVFUGx1Z2luKCJuZXdsaXN0ZW5lcl93aXoiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlOZXdMaXN0ZW5lckNsYXNzV2l6YXJkUGFnZSBwYWdlMSA9IG5ldyBOZXdMaXN0ZW5lckNsYXNzV2l6YXJkUGFnZSgKLQkJCQlnZXREYXRhTW9kZWwoKSwgCi0JCQkJUEFHRV9PTkUsCi0JCQkJTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQywKLQkJCQlBRERfTElTVEVORVJfV0laQVJEX1BBR0VfVElUTEUsIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCKTsKLQkJcGFnZTEuc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0VCRURJVE9SX0xJU1RFTkVSX1BBR0VfQUREX0xJU1RFTkVSX1dJWkFSRF8xKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0JCUFkZExpc3RlbmVyV2l6YXJkUGFnZSBwYWdlMiA9IG5ldyBBZGRMaXN0ZW5lcldpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksIFBBR0VfVFdPKTsKLQkJcGFnZTIuc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0VCRURJVE9SX0xJU1RFTkVSX1BBR0VfQUREX0xJU1RFTkVSX1dJWkFSRF8yKTsKLQkJYWRkUGFnZShwYWdlMik7Ci0JCU5ld0xpc3RlbmVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSBwYWdlMyA9IG5ldyBOZXdMaXN0ZW5lckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UoCi0JCQkJZ2V0RGF0YU1vZGVsKCksIAotCQkJCVBBR0VfVEhSRUUsCi0JCQkJTkVXX0pBVkFfQ0xBU1NfT1BUSU9OU19XSVpBUkRfUEFHRV9ERVNDLAotCQkJCUFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9USVRMRSk7Ci0JCXBhZ2UzLnNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldFQkVESVRPUl9MSVNURU5FUl9QQUdFX0FERF9MSVNURU5FUl9XSVpBUkRfMyk7Ci0JCWFkZFBhZ2UocGFnZTMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3N0UGVyZm9ybUZpbmlzaCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gb3BlbiBuZXcgbGlzdGVuZXIgY2xhc3MgaW4gamF2YSBlZGl0b3IKLQkJb3BlbkphdmFDbGFzcygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IE5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkTGlzdGVuZXJXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZExpc3RlbmVyV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2MxNzg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkTGlzdGVuZXJXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTlRFUkZBQ0VTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuTElTVEVORVJfSU5URVJGQUNFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQUNUSVZBVElPTl9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9CSU5ESU5HX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfQVRUUklCVVRFX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9MSVNURU5FUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0xJU1RFTkVSX1dJWkFSRF9DSEFOR0VTX1RPX0FUVFJJQlVURVM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9MSVNURU5FUl9XSVpBUkRfSFRUUF9TRVNTSU9OX0VWRU5UUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0xJU1RFTkVSX1dJWkFSRF9MSUZFQ1lDTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9MSVNURU5FUl9XSVpBUkRfT0JKRUNUX0JJTkRJTkc7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9ERVNDOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfTElTVEVORVJfV0laQVJEX1BBR0VfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9DT05URVhUX0VWRU5UUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX1JFUVVFU1RfRVZFTlRTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfTElTVEVORVJfV0laQVJEX1NFU1NJT05fTUlHUkFUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5DTEVBUl9CVVRUT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlNFTEVDVF9BTExfQlVUVE9OOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBBZGRMaXN0ZW5lcldpemFyZFBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlICB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0lOVEVSRkFDRSA9IEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX09CSlNfSU5URVJGQUNFKTsKLQotCXByb3RlY3RlZCBTZXJ2bGV0RGF0YU1vZGVsU3luY0hlbHBlciBzeW5jaEhlbHBlcjsKLQkKLQlwdWJsaWMgQWRkTGlzdGVuZXJXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXREZXNjcmlwdGlvbihBRERfTElTVEVORVJfV0laQVJEX1BBR0VfREVTQyk7Ci0JCXNldFRpdGxlKEFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9USVRMRSk7Ci0JCXN5bmNoSGVscGVyID0gaW5pdGlhbGl6ZVN5bmNoSGVscGVyKG1vZGVsKTsKLQl9Ci0JCi0JcHVibGljIFNlcnZsZXREYXRhTW9kZWxTeW5jSGVscGVyIGluaXRpYWxpemVTeW5jaEhlbHBlcihJRGF0YU1vZGVsIGRtKSB7Ci0JCXJldHVybiBuZXcgU2VydmxldERhdGFNb2RlbFN5bmNIZWxwZXIoZG0pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNyZWF0ZVNlcnZsZXRDb250ZXh0RXZlbnRzKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUh0dHBTZXNzaW9uRXZlbnRzKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVNlcnZsZXRSZXF1ZXN0RXZlbnRzKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVNlbGVjdEFsbEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IAotCQkJCUlOVEVSRkFDRVMKLQkJfTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVudGVyKCkgewotCQlzdXBlci5lbnRlcigpOwotCQlzeW5jaEhlbHBlci5zeW5jaFVJV2l0aE1vZGVsKElOVEVSRkFDRVMsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlcnZsZXRDb250ZXh0RXZlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIEFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9DT05URVhUX0VWRU5UUyk7Ci0KLQkJY3JlYXRlRXZlbnRMaXN0ZW5lclJvdyhncm91cCwgCi0JCQkJQUREX0xJU1RFTkVSX1dJWkFSRF9MSUZFQ1lDTEUsIAotCQkJCVFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfTElTVEVORVIsCi0JCQkJSU5URVJGQUNFUyk7Ci0KLQkJY3JlYXRlRXZlbnRMaXN0ZW5lclJvdyhncm91cCwgCi0JCQkJQUREX0xJU1RFTkVSX1dJWkFSRF9DSEFOR0VTX1RPX0FUVFJJQlVURVMsIAotCQkJCVFVQUxJRklFRF9TRVJWTEVUX0NPTlRFWFRfQVRUUklCVVRFX0xJU1RFTkVSLCAKLQkJCQlJTlRFUkZBQ0VTKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUh0dHBTZXNzaW9uRXZlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIEFERF9MSVNURU5FUl9XSVpBUkRfSFRUUF9TRVNTSU9OX0VWRU5UUyk7Ci0JCQotCQljcmVhdGVFdmVudExpc3RlbmVyUm93KGdyb3VwLCAKLQkJCQlBRERfTElTVEVORVJfV0laQVJEX0xJRkVDWUNMRSwgCi0JCQkJUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9MSVNURU5FUiwgCi0JCQkJSU5URVJGQUNFUyk7Ci0JCQotCQljcmVhdGVFdmVudExpc3RlbmVyUm93KGdyb3VwLCAKLQkJCQlBRERfTElTVEVORVJfV0laQVJEX0NIQU5HRVNfVE9fQVRUUklCVVRFUywgCi0JCQkJUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9BVFRSSUJVVEVfTElTVEVORVIsIAotCQkJCUlOVEVSRkFDRVMpOwotCQkKLQkJY3JlYXRlRXZlbnRMaXN0ZW5lclJvdyhncm91cCwgCi0JCQkJQUREX0xJU1RFTkVSX1dJWkFSRF9TRVNTSU9OX01JR1JBVElPTiwgCi0JCQkJUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9BQ1RJVkFUSU9OX0xJU1RFTkVSLCAKLQkJCQlJTlRFUkZBQ0VTKTsKLQkJCi0JCWNyZWF0ZUV2ZW50TGlzdGVuZXJSb3coZ3JvdXAsIAotCQkJCUFERF9MSVNURU5FUl9XSVpBUkRfT0JKRUNUX0JJTkRJTkcsIAotCQkJCVFVQUxJRklFRF9IVFRQX1NFU1NJT05fQklORElOR19MSVNURU5FUiwgCi0JCQkJSU5URVJGQUNFUyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZXJ2bGV0UmVxdWVzdEV2ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCBBRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfUkVRVUVTVF9FVkVOVFMpOwotCQkKLQkJY3JlYXRlRXZlbnRMaXN0ZW5lclJvdyhncm91cCwgCi0JCQkJQUREX0xJU1RFTkVSX1dJWkFSRF9MSUZFQ1lDTEUsIAotCQkJCVFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfTElTVEVORVIsIAotCQkJCUlOVEVSRkFDRVMpOwotCi0JCWNyZWF0ZUV2ZW50TGlzdGVuZXJSb3coZ3JvdXAsIAotCQkJCUFERF9MSVNURU5FUl9XSVpBUkRfQ0hBTkdFU19UT19BVFRSSUJVVEVTLCAKLQkJCQlRVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0FUVFJJQlVURV9MSVNURU5FUiwgCi0JCQkJSU5URVJGQUNFUyk7Ci0JfQotCQotCXByaXZhdGUgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWdyb3VwLnNldFRleHQodGV4dCk7Ci0JCQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFdmVudExpc3RlbmVyUm93KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBldmVudCwgU3RyaW5nIGxpc3RlbmVyLCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJY3JlYXRlQ2hlY2tib3gocGFyZW50LCBldmVudCwgbGlzdGVuZXIsIHByb3BlcnR5KTsKLQkJY3JlYXRlSW50ZXJmYWNlSWNvbihwYXJlbnQpOwotCQljcmVhdGVJbnRlcmZhY2VMYWJlbChwYXJlbnQsIGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJCi0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgdHJ1ZSkpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGJ1dHRvbiwgdmFsdWUsIHByb3BlcnR5LCBudWxsKTsKLQkJCi0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByaXZhdGUgTGFiZWwgY3JlYXRlSW50ZXJmYWNlSWNvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNTA7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuUklHSFQpOwotCQlsYWJlbC5zZXRJbWFnZShJTUdfSU5URVJGQUNFKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVJbnRlcmZhY2VMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJCi0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlbGVjdEFsbEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQkKLQkJQnV0dG9uIHNlbGVjdEFsbCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbC5zZXRUZXh0KFNFTEVDVF9BTExfQlVUVE9OKTsKLQkJc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdEFsbCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBjbGVhciA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWNsZWFyLnNldFRleHQoQ0xFQVJfQlVUVE9OKTsKLQkJY2xlYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlU2VsZWN0Tm9uZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0QWxsKCkgewotCQlMaXN0IGludGVyZmFjZXMgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSU5URVJGQUNFUyk7Ci0JCWlmIChpbnRlcmZhY2VzID09IG51bGwpIHsKLQkJCWludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShJTlRFUkZBQ0VTLCBpbnRlcmZhY2VzKTsKLQkJfQotCQkKLQkJZm9yIChTdHJpbmcgaWZhY2UgOiBMSVNURU5FUl9JTlRFUkZBQ0VTKSB7Ci0JCQlpZiAoIWludGVyZmFjZXMuY29udGFpbnMoaWZhY2UpKSB7Ci0JCQkJaW50ZXJmYWNlcy5hZGQoaWZhY2UpOwotCQkJfQotCQl9Ci0JCQotCQlzeW5jaEhlbHBlci5zeW5jaFVJV2l0aE1vZGVsKElOVEVSRkFDRVMsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKElOVEVSRkFDRVMsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdE5vbmUoKSB7Ci0JCUxpc3QgaW50ZXJmYWNlcyA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJTlRFUkZBQ0VTKTsKLQkJaWYgKGludGVyZmFjZXMgPT0gbnVsbCkgewotCQkJaW50ZXJmYWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KElOVEVSRkFDRVMsIGludGVyZmFjZXMpOwotCQl9Ci0JCQotCQlpbnRlcmZhY2VzLnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KExJU1RFTkVSX0lOVEVSRkFDRVMpKTsKLQkJCi0JCXN5bmNoSGVscGVyLnN5bmNoVUlXaXRoTW9kZWwoSU5URVJGQUNFUywgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoSU5URVJGQUNFUywgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkU2VydmxldFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRTZXJ2bGV0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYTM1ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRTZXJ2bGV0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSVNfU0VSVkxFVF9UWVBFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkVXX0pBVkFfQ0xBU1NfT1BUSU9OU19XSVpBUkRfUEFHRV9ERVNDOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuSVdlYlVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogTmV3IHNlcnZsZXQgd2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRTZXJ2bGV0V2l6YXJkIGV4dGVuZHMgTmV3V2ViQXJ0aWZhY3RXaXphcmQgewotCQotCXB1YmxpYyBBZGRTZXJ2bGV0V2l6YXJkKCkgewotCSAgICB0aGlzKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgQWRkU2VydmxldFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gQUREX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlKCkgewotCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoIm5ld3NlcnZsZXRfd2l6Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJTmV3U2VydmxldENsYXNzV2l6YXJkUGFnZSBwYWdlMSA9IG5ldyBOZXdTZXJ2bGV0Q2xhc3NXaXphcmRQYWdlKAotCQkJCWdldERhdGFNb2RlbCgpLCAKLQkJCQlQQUdFX09ORSwKLQkJCQlORVdfSkFWQV9DTEFTU19ERVNUSU5BVElPTl9XSVpBUkRfUEFHRV9ERVNDLAotCQkJCUFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFLCBKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQik7Ci0JCXBhZ2UxLnNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldFQkVESVRPUl9TRVJWTEVUX1BBR0VfQUREX1NFUlZMRVRfV0laQVJEXzEpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQkJQWRkU2VydmxldFdpemFyZFBhZ2UgcGFnZTIgPSBuZXcgQWRkU2VydmxldFdpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksIFBBR0VfVFdPKTsKLQkJcGFnZTIuc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0VCRURJVE9SX1NFUlZMRVRfUEFHRV9BRERfU0VSVkxFVF9XSVpBUkRfMik7Ci0JCWFkZFBhZ2UocGFnZTIpOwotCQlOZXdTZXJ2bGV0Q2xhc3NPcHRpb25zV2l6YXJkUGFnZSBwYWdlMyA9IG5ldyBOZXdTZXJ2bGV0Q2xhc3NPcHRpb25zV2l6YXJkUGFnZSgKLQkJCQlnZXREYXRhTW9kZWwoKSwgCi0JCQkJUEFHRV9USFJFRSwKLQkJCQlORVdfSkFWQV9DTEFTU19PUFRJT05TX1dJWkFSRF9QQUdFX0RFU0MsCi0JCQkJQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEUpOwotCQlwYWdlMy5zZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XRUJFRElUT1JfU0VSVkxFVF9QQUdFX0FERF9TRVJWTEVUX1dJWkFSRF8zKTsKLQkJYWRkUGFnZShwYWdlMyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlib29sZWFuIGlzU2VydmxldCA9IGdldERhdGFNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShJU19TRVJWTEVUX1RZUEUpOwotCQlpZiAoaXNTZXJ2bGV0KSB7Ci0JCQkvLyBvcGVuIG5ldyBzZXJ2bGV0IGNsYXNzIGluIGphdmEgZWRpdG9yCi0JCQlvcGVuSmF2YUNsYXNzKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBvcGVuIG5ldyBqc3AgZmlsZSBpbiBqc3AgZWRpdG9yCi0JCQlvcGVuV2ViRmlsZSgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZFNlcnZsZXRXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZFNlcnZsZXRXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODYxY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRTZXJ2bGV0V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklUX1BBUkFNOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5VUkxfTUFQUElOR1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTQ1JJUFRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRElTUExBWV9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRV9FWElTVElOR19DTEFTUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0JVVFRPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkRFU0NSSVBUSU9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ERVNDUklQVElPTl9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuRURJVF9CVVRUT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLklOSVRfUEFSQU1fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLklOSVRfUEFSQU1fVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5BTUVfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5BTUVfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5PX1dFQl9QUk9KRUNUUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuUkVNT1ZFX0JVVFRPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVVJMX01BUFBJTkdTX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5VUkxfTUFQUElOR1NfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlVSTF9QQVRURVJOX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5VUkxfUEFUVEVSTl9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVkFMVUVfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlZBTFVFX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBTZXJ2bGV0IFdpemFyZCBTZXR0aW5nIFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEFkZFNlcnZsZXRXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0JZmluYWwgc3RhdGljIFN0cmluZ1tdIEpTUEVYVEVOU0lPTlMgPSB7ImpzcCJ9OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRleHQgZGlzcGxheU5hbWVUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbiB1cmxTZWN0aW9uOwotCi0JcHVibGljIEFkZFNlcnZsZXRXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXREZXNjcmlwdGlvbihBRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDKTsKLQkJdGhpcy5zZXRUaXRsZShBRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgRElTUExBWV9OQU1FLCBJTklUX1BBUkFNLCBVUkxfTUFQUElOR1MgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNyZWF0ZU5hbWVEZXNjcmlwdGlvbihjb21wb3NpdGUpOwotCQkKLQkJU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb25DYWxsYmFjayBjYWxsYmFjayA9IG5ldyBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbkNhbGxiYWNrKCk7Ci0JCVN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uIGluaXRTZWN0aW9uID0gbmV3IFN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uKAotCQkJCWNvbXBvc2l0ZSwgCi0JCQkJSU5JVF9QQVJBTV9MQUJFTCwgCi0JCQkJSU5JVF9QQVJBTV9USVRMRSwgCi0JCQkJQUREX0JVVFRPTl9MQUJFTCwgCi0JCQkJRURJVF9CVVRUT05fTEFCRUwsIAotCQkJCVJFTU9WRV9CVVRUT05fTEFCRUwsIAotCQkJCW5ldyBTdHJpbmdbXSB7IE5BTUVfVElUTEUsIFZBTFVFX1RJVExFLCBERVNDUklQVElPTl9USVRMRSB9LCAKLQkJCQluZXcgU3RyaW5nW10geyBOQU1FX0xBQkVMLCBWQUxVRV9MQUJFTCwgREVTQ1JJUFRJT05fTEFCRUwgfSwgCi0JCQkJbnVsbCwvLyBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJpbml0aWFsaXpfcGFyYW1ldGVyIiksCi0JCQkJbW9kZWwsIAotCQkJCUlOSVRfUEFSQU0pOwotCQlpbml0U2VjdGlvbi5zZXRDYWxsYmFjayhjYWxsYmFjayk7Ci0JCXVybFNlY3Rpb24gPSBuZXcgU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24oCi0JCQkJY29tcG9zaXRlLCAKLQkJCQlVUkxfTUFQUElOR1NfTEFCRUwsIAotCQkJCVVSTF9NQVBQSU5HU19USVRMRSwgCi0JCQkJQUREX0JVVFRPTl9MQUJFTCwgCi0JCQkJRURJVF9CVVRUT05fTEFCRUwsIAotCQkJCVJFTU9WRV9CVVRUT05fTEFCRUwsCi0JCQkJbmV3IFN0cmluZ1tdIHsgVVJMX1BBVFRFUk5fVElUTEUgfSwgCi0JCQkJbmV3IFN0cmluZ1tdIHsgVVJMX1BBVFRFUk5fTEFCRUwgfSwgCi0JCQkJbnVsbCwvLyBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ1cmxfdHlwZSIpLAotCQkJCW1vZGVsLCAKLQkJCQlVUkxfTUFQUElOR1MpOwotCQl1cmxTZWN0aW9uLnNldENhbGxiYWNrKGNhbGxiYWNrKTsKLQkJCi0JCVN0cmluZyB0ZXh0ID0gZGlzcGxheU5hbWVUZXh0LmdldFRleHQoKTsKLQkJLy8gU2V0IGRlZmF1bHQgVVJMIFBhdHRlcm4KLQkJTGlzdCBpbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5wdXQuYWRkKG5ldyBTdHJpbmdbXXsiLyIgKyB0ZXh0fSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHVybFNlY3Rpb24gIT0gbnVsbCkKLQkJCXVybFNlY3Rpb24uc2V0SW5wdXQoaW5wdXQpOwotCQlkaXNwbGF5TmFtZVRleHQuc2V0Rm9jdXMoKTsKLQotCQlJU3RhdHVzIHByb2plY3RTdGF0dXMgPSB2YWxpZGF0ZVByb2plY3ROYW1lKCk7Ci0JCWlmICghcHJvamVjdFN0YXR1cy5pc09LKCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShwcm9qZWN0U3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQljb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdE5hbWUoKSB7Ci0JCS8vIGNoZWNrIGZvciBlbXB0eQotCQlpZiAobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSA9PSBudWxsIHx8IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoTk9fV0VCX1BST0pFQ1RTKTsKLQkJfQotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOYW1lRGVzY3JpcHRpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCS8vIGRpc3BsYXkgbmFtZQotCQlMYWJlbCBkaXNwbGF5TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlkaXNwbGF5TmFtZUxhYmVsLnNldFRleHQoTkFNRV9MQUJFTCk7Ci0JCWRpc3BsYXlOYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJZGlzcGxheU5hbWVUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWRpc3BsYXlOYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGlzcGxheU5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCVN0cmluZyB0ZXh0ID0gZGlzcGxheU5hbWVUZXh0LmdldFRleHQoKTsKLQkJCQkvLyBTZXQgZGVmYXVsdCBVUkwgUGF0dGVybgotCQkJCUxpc3QgaW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaW5wdXQuYWRkKG5ldyBTdHJpbmdbXXsiLyIgKyB0ZXh0fSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAodXJsU2VjdGlvbiAhPSBudWxsKQotCQkJCQl1cmxTZWN0aW9uLnNldElucHV0KGlucHV0KTsKLQkJCX0KLQotCQl9KTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGRpc3BsYXlOYW1lVGV4dCwgRElTUExBWV9OQU1FLCBudWxsKTsKLQotCQkvLyBkZXNjcmlwdGlvbgotCQlMYWJlbCBkZXNjTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWRlc2NMYWJlbC5zZXRUZXh0KERFU0NSSVBUSU9OX0xBQkVMKTsKLQkJZGVzY0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCVRleHQgZGVzY1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZGVzY1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChkZXNjVGV4dCwgREVTQ1JJUFRJT04sIG51bGwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZVRleHQuZ2V0VGV4dCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfRVhJU1RJTkdfQ0xBU1MpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwZXIuY2FuRmxpcFRvTmV4dFBhZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZVdlYkxpYlByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZVdlYkxpYlByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTVlNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVXZWJMaWJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BdmFpbGFibGVKYXJzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgQXZhaWxhYmxlV2ViTGliUHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgQXZhaWxhYmxlV2ViTGliUHJvdmlkZXIoKSB7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFyY2hpdmVXcmFwcGVyKSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9ICgoQXJjaGl2ZVdyYXBwZXIpIGlucHV0RWxlbWVudCkuZ2V0V2ViTGlicygpLnRvQXJyYXkoKTsKLQkJCUFycmF5cy5zb3J0KGFycmF5LCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJcmV0dXJuIGdldENvbHVtblRleHQobzEsIDApLmNvbXBhcmVUbyhnZXRDb2x1bW5UZXh0KG8yLCAwKSk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gQXZhaWxhYmxlSmFyc1Byb3ZpZGVyLmdldFV0aWxJbWFnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCUFyY2hpdmVXcmFwcGVyIHdyYXBwZXIgPSAoQXJjaGl2ZVdyYXBwZXIpZWxlbWVudDsKLQkJcmV0dXJuIHdyYXBwZXIuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9Db252ZXJ0VG9XZWJNb2R1bGVUeXBlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0NvbnZlcnRUb1dlYk1vZHVsZVR5cGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0ZDdjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0NvbnZlcnRUb1dlYk1vZHVsZVR5cGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LklTaGVsbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBDb252ZXJ0VG9XZWJNb2R1bGVUeXBlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQkKLQlwcml2YXRlIFN0cmluZyBmU2hlbGxUaXRsZSA9IElXZWJXaXphcmRDb25zdGFudHMuQ09OVkVSVF9UT19XRUJfVElUTEU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkxhYmVsVGV4dCA9IElXZWJXaXphcmRDb25zdGFudHMuU0VMRUNUX1dFQl9WRVJTSU9OOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmU2VsZWN0aW9uPSBudWxsOwotCXByaXZhdGUgU3RyaW5nW10gZkFsbG93ZWRTdHJpbmdzID0gbmV3IFN0cmluZ1tdIHtKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMl9URVhULCBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfM19URVhULCBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNF9URVhULCBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNV9URVhUfTsKLQlwcml2YXRlIGludCBmSW5pdGlhbFNlbGVjdGlvbkluZGV4ID0gZkFsbG93ZWRTdHJpbmdzLmxlbmd0aC0xOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlbGVjdGVkVmVyc2lvbigpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIENvbnZlcnRUb1dlYk1vZHVsZVR5cGVEaWFsb2coSVNoZWxsUHJvdmlkZXIgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCX0KLQotCXB1YmxpYyBDb252ZXJ0VG9XZWJNb2R1bGVUeXBlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KGZTaGVsbFRpdGxlKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJQ29tcG9zaXRlIGlubmVyQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaW5uZXJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCUdyaWRMYXlvdXQgZ2w9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdsLm51bUNvbHVtbnM9IDI7Ci0JCWlubmVyQ29tcG9zaXRlLnNldExheW91dChnbCk7Ci0JCQotCQlMYWJlbCBsYWJlbD0gbmV3IExhYmVsKGlubmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZkxhYmVsVGV4dCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCWZpbmFsIENvbWJvIGNvbWJvPSBuZXcgQ29tYm8oaW5uZXJDb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZBbGxvd2VkU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJY29tYm8uYWRkKGZBbGxvd2VkU3RyaW5nc1tpXSk7Ci0JCX0KLQkJY29tYm8uc2VsZWN0KGZJbml0aWFsU2VsZWN0aW9uSW5kZXgpOwotCQlmU2VsZWN0aW9uPSBjb21iby5nZXRJdGVtKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZTZWxlY3Rpb249IGNvbWJvLmdldEl0ZW0oY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvRmlsdGVyTWFwcGluZ3NBcnJheVRhYmxlV2l6YXJkU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9GaWx0ZXJNYXBwaW5nc0FycmF5VGFibGVXaXphcmRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYTdmZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9GaWx0ZXJNYXBwaW5nc0FycmF5VGFibGVXaXphcmRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfQlVUVE9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ESVNQQVRDSEVSU19MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuRURJVF9CVVRUT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkZJTFRFUl9NQVBQSU5HU19MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuUkVNT1ZFX0JVVFRPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVVJMX1NFUlZMRVRfTEFCRUw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuRmlsdGVyTWFwcGluZ0l0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSUZpbHRlck1hcHBpbmdJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIEZpbHRlck1hcHBpbmdzQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24gZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JcHJvdGVjdGVkIGNsYXNzIFN0cmluZ0FycmF5TGlzdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlyZXR1cm4gKChMaXN0PEZpbHRlck1hcHBpbmdJdGVtPikgZWxlbWVudCkudG9BcnJheSgpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhVmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJLy9EZWZhdWx0IG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy9EZWZhdWx0IG5vdGhpbmcKLQkJfQotCX0KLQlwcm90ZWN0ZWQgY2xhc3MgU3RyaW5nQXJyYXlMaXN0TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbWFnZSBVUkxfUEFUVEVSTl9JQ09OID0gCi0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCgoVVJMKSBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ1cmxfbWFwcGluZyIpKS5jcmVhdGVJbWFnZSgpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEltYWdlIFNFUlZMRVRfSUNPTiA9IAotICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoKFVSTCkgV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2VydmxldCIpKS5jcmVhdGVJbWFnZSgpOwotCi0gICAgICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCSAgICBpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkgICAgICAgIEZpbHRlck1hcHBpbmdJdGVtIGl0ZW0gPSAoRmlsdGVyTWFwcGluZ0l0ZW0pIGVsZW1lbnQ7Ci0JCSAgICAgICAgaWYgKGl0ZW0uaXNTZXJ2bGV0TmFtZVR5cGUoKSkgewotCQkgICAgICAgICAgICByZXR1cm4gU0VSVkxFVF9JQ09OOwotCQkgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5pc1VybFBhdHRlcm5UeXBlKCkpIHsKLQkJICAgICAgICAgICAgcmV0dXJuIFVSTF9QQVRURVJOX0lDT047Ci0JCSAgICAgICAgfQotCQkgICAgICAgIAotCQkgICAgfQotCQkgICAgcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCSAgICBpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkgICAgICAgIHJldHVybiAoKEZpbHRlck1hcHBpbmdJdGVtKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCSAgICB9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJICAgICAgICByZXR1cm4gKChGaWx0ZXJNYXBwaW5nSXRlbSkgZWxlbWVudCkuZ2V0RGlzcGF0Y2hlcnNBc1N0cmluZygpOwotCQkgICAgfQotCQkgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotCX0KLQkKLQlmaW5hbCBzdGF0aWMgaW50IElDT05fV0lEVEggPSAyNTsKLQlmaW5hbCBzdGF0aWMgaW50IERJU1BBVENIRVJTX1dJRFRIID0gMTAwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJQ09OX1BST1AgPSAiSUNPTl9QUk9QIjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFNRV9QUk9QID0gIk5BTUVfUFJPUCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERJU1BBVENIRVJTX1BST1AgPSAiRElTUEFUQ0hFUlNfUFJPUCI7Ci0JCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCXByaXZhdGUgSURhdGFNb2RlbCBtb2RlbDsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0KLSAgICBwdWJsaWMgRmlsdGVyTWFwcGluZ3NBcnJheVRhYmxlV2l6YXJkU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCSAgICAKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgCi0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICBMYWJlbCB0aXRsZUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5MRUZUKTsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRUZXh0KEZJTFRFUl9NQVBQSU5HU19MQUJFTCk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHRpdGxlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgICBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLSAgICAgICAgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLSAgICAgICAgdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIHZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFN0cmluZ0FycmF5TGlzdENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFN0cmluZ0FycmF5TGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJZmluYWwgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTlVMTCk7Ci0gICAgICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBidXR0b25Db21wby5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgYnV0dG9uQ29tcG8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCi0gICAgICAgIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG8sIFNXVC5QVVNIKTsKLSAgICAgICAgYWRkQnV0dG9uLnNldFRleHQoQUREX0JVVFRPTl9MQUJFTCk7Ci0gICAgICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICAgICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIC8vRG8gbm90aGluZwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBlZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wbywgU1dULlBVU0gpOwotICAgICAgICBlZGl0QnV0dG9uLnNldFRleHQoRURJVF9CVVRUT05fTEFCRUwpOwotICAgICAgICBlZGl0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgICAgICBlZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRWRpdEJ1dHRvblNlbGVjdGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAvL0RvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wbywgU1dULlBVU0gpOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0VGV4dChSRU1PVkVfQlVUVE9OX0xBQkVMKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgICAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy9EbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoZWRpdEJ1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCWJvb2xlYW4gZW5hYmxlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDE7Ci0JCQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQl9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0JCWlmIChlZGl0QnV0dG9uICE9IG51bGwpIHsKLQkJCXZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWhhbmRsZUVkaXRCdXR0b25TZWxlY3RlZCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotICAgICAgICBUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQl0YWJsZUNvbHVtbi5zZXRXaWR0aChJQ09OX1dJRFRIKTsKLQkJdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLQkJdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgdGFibGVDb2x1bW4uc2V0VGV4dChVUkxfU0VSVkxFVF9MQUJFTCk7Ci0gICAgICAgIHRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICAgICAgdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgdGFibGVDb2x1bW4uc2V0VGV4dChESVNQQVRDSEVSU19MQUJFTCk7Ci0gICAgICAgIHRhYmxlQ29sdW1uLnNldFdpZHRoKERJU1BBVENIRVJTX1dJRFRIKTsKLSAgICAgICAgdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLSAgICAgICAgdmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHtJQ09OX1BST1AsIE5BTUVfUFJPUCwgRElTUEFUQ0hFUlNfUFJPUH0pOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0aGlzLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCSAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkgICAgICAgIFRhYmxlIHRhYmxlID0gdmlld2VyLmdldFRhYmxlKCk7Ci0JCSAgICAgICAgVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQkgICAgICAgIFBvaW50IGJ1dHRvbkFyZWEgPSBidXR0b25Db21wby5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkgICAgICAgIFJlY3RhbmdsZSBhcmVhID0gdGFibGUuZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkgICAgICAgIFBvaW50IHByZWZlcnJlZFNpemUgPSB2aWV3ZXIuZ2V0VGFibGUoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkgICAgICAgIGludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyKnRhYmxlLmdldEJvcmRlcldpZHRoKCkgLSBidXR0b25BcmVhLnggLSBjb2x1bW5zLmxlbmd0aCoyOwotCQkgICAgICAgIGlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKSB7Ci0JCSAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0JCSAgICAgICAgICAgIC8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJICAgICAgICAgICAgUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJICAgICAgICAgICAgd2lkdGggLT0gdkJhclNpemUueDsKLQkJICAgICAgICB9Ci0JCSAgICAgICAgUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICAgICAgICAgIGlmIChvbGRTaXplLnggPiBhcmVhLndpZHRoKSB7Ci0JCSAgICAgICAgICAgICAgICAvLyB0YWJsZSBpcyBnZXR0aW5nIHNtYWxsZXIgc28gbWFrZSB0aGUgY29sdW1ucyAKLQkJICAgICAgICAgICAgICAgIC8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkgICAgICAgICAgICAgICAgLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCSAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSBjb2x1bW5zW2ldLnNldFdpZHRoKHdpZHRoIC0gSUNPTl9XSURUSCAtIERJU1BBVENIRVJTX1dJRFRIKTsKLQkJICAgICAgICAgICAgICAgIHRhYmxlLnNldFNpemUoYXJlYS53aWR0aCAtIGJ1dHRvbkFyZWEueCAtIGNvbHVtbnMubGVuZ3RoKjIsIGFyZWEuaGVpZ2h0KTsKLQkJICAgICAgICAgICAgfSBlbHNlIHsKLQkJICAgICAgICAgICAgICAgIC8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlIAotCQkgICAgICAgICAgICAgICAgLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJICAgICAgICAgICAgICAgIC8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkgICAgICAgICAgICAgICAgdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoIC0gYnV0dG9uQXJlYS54IC0gY29sdW1ucy5sZW5ndGgqMiwgYXJlYS5oZWlnaHQpOwotCQkgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkgY29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aCAtIElDT05fV0lEVEggLSBESVNQQVRDSEVSU19XSURUSCk7Ci0JCSAgICAgICAgICAgIH0KLQkJICAgICAgICB9Ci0JCSAgICB9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZCgpIHsKLQkgICAgU3RyaW5nIHRpdGxlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFkZF9GaWx0ZXJfTWFwcGluZ19UaXRsZV9VSV8iKTsKLQkgICAgSVByb2plY3QgcCA9IChJUHJvamVjdCkgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVCk7Ci0JICAgIExpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHZpZXdlci5nZXRJbnB1dCgpOwotCSAgICBBZGRFZGl0RmlsdGVyTWFwcGluZ0RpYWxvZyBkaWFsb2cgPSAKLQkgICAgICAgIG5ldyBBZGRFZGl0RmlsdGVyTWFwcGluZ0RpYWxvZyhnZXRTaGVsbCgpLCB0aXRsZSwgcCwgdmFsdWVMaXN0LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQkKLQkJYWRkRmlsdGVyTWFwcGluZygocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCA+IDApID8gKElGaWx0ZXJNYXBwaW5nSXRlbSkgcmVzdWx0WzBdIDogbnVsbCk7Ci0JfQotCi0gICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFZGl0QnV0dG9uU2VsZWN0ZWQoKSB7Ci0gICAgICAgICBTdHJpbmcgdGl0bGUgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRWRpdF9GaWx0ZXJfTWFwcGluZ19UaXRsZV9VSV8iKTsKLQkJSVNlbGVjdGlvbiBzID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIShzIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHM7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm47Ci0JCUxpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHZpZXdlci5nZXRJbnB1dCgpOwotCQlPYmplY3Qgc2VsZWN0ZWRPYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCUZpbHRlck1hcHBpbmdJdGVtIHZhbHVlID0gKEZpbHRlck1hcHBpbmdJdGVtKSBzZWxlY3RlZE9iajsKLQkJSVByb2plY3QgcCA9IChJUHJvamVjdCkgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVCk7Ci0JCUFkZEVkaXRGaWx0ZXJNYXBwaW5nRGlhbG9nIGRpYWxvZyA9IAotICAgICAgICAgICAgbmV3IEFkZEVkaXRGaWx0ZXJNYXBwaW5nRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCBwLCB2YWx1ZUxpc3QsIHZhbHVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCWVkaXRGaWx0ZXJNYXBwaW5nKHZhbHVlLCAoSUZpbHRlck1hcHBpbmdJdGVtKSByZXN1bHRbMF0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSB8fCAhKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybjsKLQkJTGlzdCBzZWxlY3RlZE9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9MaXN0KCk7Ci0JCXJlbW92ZUZpbHRlck1hcHBpbmdzKHNlbGVjdGVkT2JqKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEZpbHRlck1hcHBpbmcoSUZpbHRlck1hcHBpbmdJdGVtIGZpbHRlck1hcHBpbmcpIHsKLQkJaWYgKGZpbHRlck1hcHBpbmcgPT0gbnVsbCkgcmV0dXJuOwotCQlMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLQkJaWYgKHZhbHVlTGlzdCA9PSBudWxsKSB7Ci0JCQl2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJdmFsdWVMaXN0LmFkZChmaWx0ZXJNYXBwaW5nKTsKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVkaXRGaWx0ZXJNYXBwaW5nKElGaWx0ZXJNYXBwaW5nSXRlbSBvbGRGaWx0ZXJNYXBwaW5nLCBJRmlsdGVyTWFwcGluZ0l0ZW0gbmV3RmlsdGVyTWFwcGluZykgewotCQlpZiAobmV3RmlsdGVyTWFwcGluZyA9PSBudWxsKSByZXR1cm47CQkKLQkJTGlzdCB2YWx1ZUxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0JCWlmICh2YWx1ZUxpc3QgPT0gbnVsbCkgewotCQkJdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWludCBpbmRleCA9IHZhbHVlTGlzdC5pbmRleE9mKG9sZEZpbHRlck1hcHBpbmcpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXZhbHVlTGlzdC5hZGQobmV3RmlsdGVyTWFwcGluZyk7Ci0JCX0gZWxzZSB7Ci0JCQl2YWx1ZUxpc3Quc2V0KGluZGV4LCBuZXdGaWx0ZXJNYXBwaW5nKTsKLQkJfQotCQkKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRmlsdGVyTWFwcGluZ3MoQ29sbGVjdGlvbiBzZWxlY3RlZEZpbHRlck1hcHBpbmdzKSB7Ci0JCUxpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHZpZXdlci5nZXRJbnB1dCgpOwotCQl2YWx1ZUxpc3QucmVtb3ZlQWxsKHNlbGVjdGVkRmlsdGVyTWFwcGluZ3MpOwotCQlzZXRJbnB1dCh2YWx1ZUxpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucHV0KExpc3QgaW5wdXQpIHsKLQkJdmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJLy8gQ3JlYXRlIGEgbmV3IGxpc3QgdG8gdHJpZ2dlciBwcm9wZXJ0eSBjaGFuZ2UKLQkJTGlzdCBuZXdJbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbmV3SW5wdXQuYWRkQWxsKGlucHV0KTsKLQkJbW9kZWwuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBuZXdJbnB1dCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldElucHV0KCkgewotCSAgICBMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLSAgICAgICAgaWYgKHZhbHVlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlTGlzdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvSVdlYldpemFyZENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9JV2ViV2l6YXJkQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Mjc1MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9JV2ViV2l6YXJkQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYldpemFyZENvbnN0YW50cyB7Ci0JCi0JLy8gQWRkU2VydmxldFdpemFyZAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLkFERF9TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLkFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLkFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX0RFU0M7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX1BBQ0tBR0UgPSBXRUJVSU1lc3NhZ2VzLkRFRkFVTFRfUEFDS0FHRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRUxFQ1RfQ0xBU1NfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLlNFTEVDVF9DTEFTU19USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQVBfQ0xBU1NfTkFNRV9UT19DTEFTU19FUlJPUl9NU0cgPSBXRUJVSU1lc3NhZ2VzLk1BUF9DTEFTU19OQU1FX1RPX0NMQVNTX0VSUk9SX01TRzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTVBUWV9MSVNUX01TRyA9IFdFQlVJTWVzc2FnZXMuRU1QVFlfTElTVF9NU0c7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5BRERfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFX0VYSVNUSU5HX1NFUlZMRVRfQ0xBU1MgPSBXRUJVSU1lc3NhZ2VzLlVTRV9FWElTVElOR19TRVJWTEVUX0NMQVNTOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOSVRfUEFSQU1fVElUTEUgPSBXRUJVSU1lc3NhZ2VzLklOSVRfUEFSQU1fVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5JVF9QQVJBTV9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuSU5JVF9QQVJBTV9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVUkxfTUFQUElOR1NfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLlVSTF9NQVBQSU5HU19USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVUkxfTUFQUElOR1NfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLlVSTF9NQVBQSU5HU19MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSE9PU0VfU0VSVkxFVF9DTEFTUyA9IFdFQlVJTWVzc2FnZXMuQ0hPT1NFX1NFUlZMRVRfQ0xBU1M7Ci0JCi0JLy8gTmV3U2VydmxldFdpemFyZAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLk5FV19TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLk5FV19TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19TRVJWTEVUX1dJWkFSRF9QQUdFX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLk5FV19TRVJWTEVUX1dJWkFSRF9QQUdFX0RFU0M7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9QQUNLQUdFX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5TRVJWTEVUX1BBQ0tBR0VfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9OQU1FX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5TRVJWTEVUX05BTUVfTEFCRUw7Ci0JCi0gICAgLy8gQWRkRmlsdGVyV2l6YXJkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFID0gV0VCVUlNZXNzYWdlcy5BRERfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9USVRMRSA9IFdFQlVJTWVzc2FnZXMuQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfRklMVEVSX1dJWkFSRF9QQUdFX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLkFERF9GSUxURVJfV0laQVJEX1BBR0VfREVTQzsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRV9FWElTVElOR19GSUxURVJfQ0xBU1MgPSBXRUJVSU1lc3NhZ2VzLlVTRV9FWElTVElOR19GSUxURVJfQ0xBU1M7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hPT1NFX0ZJTFRFUl9DTEFTUyA9IFdFQlVJTWVzc2FnZXMuQ0hPT1NFX0ZJTFRFUl9DTEFTUzsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRVJWTEVUX01BUFBJTkdTX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5TRVJWTEVUX01BUFBJTkdTX0xBQkVMOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTFRFUl9NQVBQSU5HU19MQUJFTCA9IFdFQlVJTWVzc2FnZXMuRklMVEVSX01BUFBJTkdTX0xBQkVMOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVSTF9TRVJWTEVUX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5VUkxfU0VSVkxFVF9MQUJFTDsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESVNQQVRDSEVSU19MQUJFTCA9IFdFQlVJTWVzc2FnZXMuRElTUEFUQ0hFUlNfTEFCRUw7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVRVUVTVCA9IFdFQlVJTWVzc2FnZXMuRElTUEFUQ0hFUl9SRVFVRVNUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZPUldBUkQgPSBXRUJVSU1lc3NhZ2VzLkRJU1BBVENIRVJfRk9SV0FSRDsgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5DTFVERSA9IFdFQlVJTWVzc2FnZXMuRElTUEFUQ0hFUl9JTkNMVURFOyAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUiA9IFdFQlVJTWVzc2FnZXMuRElTUEFUQ0hFUl9FUlJPUjsgCi0gICAgCi0gICAgLy8gTmV3RmlsdGVyV2l6YXJkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFID0gV0VCVUlNZXNzYWdlcy5ORVdfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0KLQkvLyBBZGRMaXN0ZW5lcldpemFyZAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfV0lORE9XX1RJVExFID0gV0VCVUlNZXNzYWdlcy5BRERfTElTVEVORVJfV0laQVJEX1dJTkRPV19USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1BBR0VfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLkFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1BBR0VfREVTQyA9IFdFQlVJTWVzc2FnZXMuQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX0RFU0M7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VfRVhJU1RJTkdfTElTVEVORVJfQ0xBU1MgPSBXRUJVSU1lc3NhZ2VzLlVTRV9FWElTVElOR19MSVNURU5FUl9DTEFTUzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfQ09OVEVYVF9FVkVOVFMgPSBXRUJVSU1lc3NhZ2VzLkFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9DT05URVhUX0VWRU5UUzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX0hUVFBfU0VTU0lPTl9FVkVOVFMgPSBXRUJVSU1lc3NhZ2VzLkFERF9MSVNURU5FUl9XSVpBUkRfSFRUUF9TRVNTSU9OX0VWRU5UUzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfUkVRVUVTVF9FVkVOVFMgPSBXRUJVSU1lc3NhZ2VzLkFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9SRVFVRVNUX0VWRU5UUzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX0xJRkVDWUNMRSA9IFdFQlVJTWVzc2FnZXMuQUREX0xJU1RFTkVSX1dJWkFSRF9MSUZFQ1lDTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9DSEFOR0VTX1RPX0FUVFJJQlVURVMgPSBXRUJVSU1lc3NhZ2VzLkFERF9MSVNURU5FUl9XSVpBUkRfQ0hBTkdFU19UT19BVFRSSUJVVEVTOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfU0VTU0lPTl9NSUdSQVRJT04gPSBXRUJVSU1lc3NhZ2VzLkFERF9MSVNURU5FUl9XSVpBUkRfU0VTU0lPTl9NSUdSQVRJT047Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9PQkpFQ1RfQklORElORyA9IFdFQlVJTWVzc2FnZXMuQUREX0xJU1RFTkVSX1dJWkFSRF9PQkpFQ1RfQklORElORzsKLQkKLQkvLyBjb21tb24KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfQlVUVE9OX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5BRERfQlVUVE9OX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVESVRfQlVUVE9OX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5FRElUX0JVVFRPTl9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRU1PVkVfQlVUVE9OX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5SRU1PVkVfQlVUVE9OX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVSTF9QQVRURVJOX1RJVExFID0gV0VCVUlNZXNzYWdlcy5VUkxfUEFUVEVSTl9USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVUkxfUEFUVEVSTl9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuVVJMX1BBVFRFUk5fTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9MREVSX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5GT0xERVJfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9QQUNLQUdFX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5KQVZBX1BBQ0tBR0VfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfTkFNRV9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuQ0xBU1NfTkFNRV9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVVBFUkNMQVNTX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5TVVBFUkNMQVNTX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1RJVExFID0gV0VCVUlNZXNzYWdlcy5DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19ERVNDID0gV0VCVUlNZXNzYWdlcy5DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19ERVNDOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1ZBTElEQVRPUl9NRVNHID0gV0VCVUlNZXNzYWdlcy5DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19WQUxJREFUT1JfTUVTRzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfREVTQyA9IFdFQlVJTWVzc2FnZXMuUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX0RFU0M7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FID0gV0VCVUlNZXNzYWdlcy5QQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfTVNHX05PTkU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX1RJVExFID0gV0VCVUlNZXNzYWdlcy5TVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLlNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19ERVNDOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFID0gV0VCVUlNZXNzYWdlcy5JTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDID0gV0VCVUlNZXNzYWdlcy5JTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FID0gV0VCVUlNZXNzYWdlcy5JTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX01PRElGSUVSU19MQUJFTCA9IFdFQlVJTWVzc2FnZXMuSkFWQV9DTEFTU19NT0RJRklFUlNfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19JTlRFUkZBQ0VTX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0lOVEVSRkFDRVNfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfUFVCTElDX0NIRUNLQk9YX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5KQVZBX0NMQVNTX1BVQkxJQ19DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0FCU1RSQUNUX0NIRUNLQk9YX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0FCU1RSQUNUX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfRklOQUxfQ0hFQ0tCT1hfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfRklOQUxfQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX01BSU5fQ0hFQ0tCT1hfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfSU5IRVJJVF9DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0JST1dFUl9ESUFMT0dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfQlJPV0VSX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0JST1dFUl9ESUFMT0dfTUVTU0FHRSA9IFdFQlVJTWVzc2FnZXMuSkFWQV9DTEFTU19CUk9XRVJfRElBTE9HX01FU1NBR0U7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOQU1FX1RJVExFID0gV0VCVUlNZXNzYWdlcy5OQU1FX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLk5BTUVfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT05fVElUTEUgPSBXRUJVSU1lc3NhZ2VzLkRFU0NSSVBUSU9OX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5ERVNDUklQVElPTl9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxVRV9USVRMRSA9IFdFQlVJTWVzc2FnZXMuVkFMVUVfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMVUVfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLlZBTFVFX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQlJPV1NFX0JVVFRPTl9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuQlJPV1NFX0JVVFRPTl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfQlVUVE9OID0gV0VCVUlNZXNzYWdlcy5SRU1PVkVfQlVUVE9OOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFTEVDVF9BTExfQlVUVE9OID0gV0VCVUlNZXNzYWdlcy5TRUxFQ1RfQUxMX0JVVFRPTjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEVBUl9CVVRUT04gPSBXRUJVSU1lc3NhZ2VzLkNMRUFSX0JVVFRPTjsKLQkKLSAgICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBORVdfSkFWQV9DTEFTU19ERVNUSU5BVElPTl9XSVpBUkRfUEFHRV9ERVNDID0gV0VCVUlNZXNzYWdlcy5ORVdfSkFWQV9DTEFTU19ERVNUSU5BVElPTl9XSVpBUkRfUEFHRV9ERVNDOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQyA9IFdFQlVJTWVzc2FnZXMuTkVXX0pBVkFfQ0xBU1NfT1BUSU9OU19XSVpBUkRfUEFHRV9ERVNDOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEltcG9ydFdBUkFjdGlvbl9VSV8gPSBXRUJVSU1lc3NhZ2VzLkltcG9ydFdBUkFjdGlvbl9VSV87Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRXhwb3J0V0FSQWN0aW9uX1VJXyA9IFdFQlVJTWVzc2FnZXMuRXhwb3J0V0FSQWN0aW9uX1VJXzsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT19XRUJfUFJPSkVDVFMgPSBXRUJVSU1lc3NhZ2VzLk5PX1dFQl9QUk9KRUNUUzsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUUyA9IFdFQlVJTWVzc2FnZXMuU0VSVkxFVFM7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9UT19XRUJfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLkNvbnZlcnRUb1dlYlRpdGxlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9XRUJfVkVSU0lPTiA9IFdFQlVJTWVzc2FnZXMuU2VsZWN0V2ViVmVyc2lvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczNmNiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL011bHRpU2VsZWN0RmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuREVGQVVMVF9QQUNLQUdFOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuVHdvQXJyYXlRdWlja1NvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlR5cGVkRmlsZVZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZsZXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDcvMzAvMjAwMSAxMToxNjozNiBBTSkKLSAqLwotcHVibGljIGNsYXNzIE11bHRpU2VsZWN0RmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMKLQkJRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFja2FnZVJlbmRlcmVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXByaXZhdGUgZmluYWwgSW1hZ2UgUEFDS0FHRV9JQ09OID0gSmF2YVVJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfUEFDS0FHRSk7IAotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLQkJCVN0cmluZyBwID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQkJaWYgKCIiLmVxdWFscyhwKSkgLy8kTk9OLU5MUy0xJAotCQkJCXAgPSBERUZBVUxUX1BBQ0tBR0U7Ci0JCQlyZXR1cm4gKHAgKyAiIC0gIiArIHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gUEFDS0FHRV9JQ09OOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZVJlbmRlcmVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXByaXZhdGUgZmluYWwgSW1hZ2UgQ0xBU1NfSUNPTiA9IEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0NMQVNTKTsgCi0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlJVHlwZSBlID0gKChJVHlwZSkgZWxlbWVudCk7Ci0JCQlyZXR1cm4gZS5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gQ0xBU1NfSUNPTjsKLQkJfQotCi0JfQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEpTUCA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VSVkxFVCA9IDE7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmU2VydmxldEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZKU1BCdXR0b247Ci0JcHJvdGVjdGVkIGludCBmU2VsZWN0aW9uID0gLTE7Ci0JcHJvdGVjdGVkIFBhZ2VCb29rIGZQYWdlQm9vayA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbnRyb2wgZkpzcENvbnRyb2wgPSBudWxsOwotCXByb3RlY3RlZCBDb250cm9sIGZTZXJ2bGV0Q29udHJvbCA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBmQ2hpbGQgPSBudWxsOwotCS8vIGNvbnN0cnVjdGlvbiBwYXJhbWV0ZXJzCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZlJ1bm5hYmxlQ29udGV4dDsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgZkVsZW1lbnRSZW5kZXJlcjsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgZlF1YWxpZmllclJlbmRlcmVyOwotCXByaXZhdGUgT2JqZWN0W10gZkVsZW1lbnRzOwotCXByaXZhdGUgYm9vbGVhbiBmSWdub3JlQ2FzZSA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlVwcGVyTGlzdExhYmVsOwotCXByaXZhdGUgU3RyaW5nIGZMb3dlckxpc3RMYWJlbDsKLQkvLyBTV1Qgd2lkZ2V0cwotCXByaXZhdGUgVGFibGUgZlVwcGVyTGlzdDsKLQlwcml2YXRlIFRhYmxlIGZMb3dlckxpc3Q7Ci0JcHJvdGVjdGVkIFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBJVHlwZVtdIGZJVDsKLQlwcml2YXRlIFN0cmluZ1tdIGZSZW5kZXJlZFN0cmluZ3M7Ci0JcHJpdmF0ZSBpbnRbXSBmRWxlbWVudE1hcDsKLQlwcml2YXRlIEludGVnZXJbXSBmUXVhbGlmaWVyTWFwOwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIGZMb2NhbFZhbGlkYXRvciA9IG51bGw7Ci0JLyoqCi0JICogTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gcGFyZW50IFNoZWxsCi0JICogQHBhcmFtIHRpdGxlIFN0cmluZwotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqIEBwYXJlbnQgZXh0ZW5zaW9ucyBTdHJpbmdbXQotCSAqIEBwYXJhbSBhbGxvd011bHRpcGxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBleHRlbnNpb25zLCBib29sZWFuIGFsbG93TXVsdGlwbGUsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIocGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgZXh0ZW5zaW9ucywgYWxsb3dNdWx0aXBsZSk7Ci0JCXNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7Ci0KLQkJaWYgKHRpdGxlID09IG51bGwpCi0JCQlzZXRUaXRsZShXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmlsZV9TZWxlY3Rpb25fVUlfIikpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQltZXNzYWdlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdF9hX2ZpbGVfX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JCXNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCXNldEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0JCWFkZEZpbHRlcihuZXcgVHlwZWRGaWxlVmlld2VyRmlsdGVyKGV4dGVuc2lvbnMpKTsKLQkJZkxvY2FsVmFsaWRhdG9yID0gbmV3IFNpbXBsZVR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcihuZXcgQ2xhc3NbXSB7IElGaWxlLmNsYXNzIH0sIGFsbG93TXVsdGlwbGUpOwotCQlzZXRWYWxpZGF0b3IoZkxvY2FsVmFsaWRhdG9yKTsKLQkJCi0JCS8vU3RhdHVzSW5mbyBjdXJyU3RhdHVzID0gbmV3IFN0YXR1c0luZm8oKTsKLQkJLy9jdXJyU3RhdHVzLnNldE9LKCk7Ci0JCVN0YXR1cyBjdXJyU3RhdHVzID0gbmV3IFN0YXR1cyhTdGF0dXMuT0ssIFNlcnZsZXRVSVBsdWdpbi5QTFVHSU5fSUQsIFN0YXR1cy5PSywgIiIsIG51bGwpOwotCQkKLQkJdXBkYXRlU3RhdHVzKGN1cnJTdGF0dXMpOwotCQlmRWxlbWVudFJlbmRlcmVyID0gbmV3IFR5cGVSZW5kZXJlcigpOwotCQlmUXVhbGlmaWVyUmVuZGVyZXIgPSBuZXcgUGFja2FnZVJlbmRlcmVyKCk7Ci0JCWZSdW5uYWJsZUNvbnRleHQgPSBTZXJ2bGV0VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQl0cnkgewotCQkJSUphdmFFbGVtZW50IGplbGVtID0gbnVsbDsKLQkJCUlQcm9qZWN0IHByb2ogPSBudWxsOwotCQkJamVsZW0gPSAoSUphdmFFbGVtZW50KSBwcm9qZWN0LmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKLQkJCWlmIChqZWxlbSA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgcHJvamVjdC5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJcHJvaiA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCQkJaWYgKHByb2ogIT0gbnVsbCkgewotCQkJCQkJamVsZW0gPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZS5jcmVhdGUocHJvaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlJSmF2YVByb2plY3QganAgPSBqZWxlbS5nZXRKYXZhUHJvamVjdCgpOwotCi0JCQlJVHlwZSBzZXJ2bGV0VHlwZSA9IGpwLmZpbmRUeXBlKFFVQUxJRklFRF9TRVJWTEVUKTsKLQkJCS8vIG5leHQgMyBsaW5lcyBmaXggZGVmZWN0IDE3NzY4NgotCQkJaWYgKHNlcnZsZXRUeXBlID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUFycmF5TGlzdCBzZXJ2bGV0Q2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlUeXBlSGllcmFyY2h5IHRIID0gc2VydmxldFR5cGUubmV3VHlwZUhpZXJhcmNoeShqcCwgbnVsbCk7Ci0JCQlJVHlwZVtdIHR5cGVzID0gdEguZ2V0QWxsU3VidHlwZXMoc2VydmxldFR5cGUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh0eXBlc1tpXS5pc0NsYXNzKCkgJiYgIXNlcnZsZXRDbGFzc2VzLmNvbnRhaW5zKHR5cGVzW2ldKSkKLQkJCQkJc2VydmxldENsYXNzZXMuYWRkKHR5cGVzW2ldKTsKLQkJCX0KLQkJCWZJVCA9IChJVHlwZVtdKSBzZXJ2bGV0Q2xhc3Nlcy50b0FycmF5KG5ldyBJVHlwZVtzZXJ2bGV0Q2xhc3Nlcy5zaXplKCldKTsKLQkJCXNlcnZsZXRDbGFzc2VzID0gbnVsbDsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU2VydmxldFVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcHJpdmF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVSZXN1bHQoKSB7Ci0JCWlmIChmU2VsZWN0aW9uID09IEpTUCkgewotCQkJc3VwZXIuY29tcHV0ZVJlc3VsdCgpOwotCQl9IGVsc2UgewotCQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgZ2V0V2lkZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VsZWN0X0NsYXNzX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIlNlbGVjdCBDbGFzcyIKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ291bGRfbm90X3VuaXF1ZWx5X21hcF90aGVfRVJST1JfIik7IC8vJE5PTi1OTFMtMSQgPSAiQ291bGQgbm90IHVuaXF1ZWx5IG1hcCB0aGUgY2xhc3MgbmFtZSB0byBhIGNsYXNzLiIKLQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCQkJCQlzZXRSZXN1bHQobnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJamF2YS51dGlsLkxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQkJcmVzdWx0LmFkZCh0eXBlKTsKLQkJCQkJc2V0UmVzdWx0KHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCWZUZXh0LnNldEZvY3VzKCk7Ci0JCXJlbWF0Y2goIiIpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZU9rU3RhdGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBkaWFsb2cncyAKLQkgKiBidXR0b24gYmFyLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotCSAqIGxheXMgb3V0IGEgYnV0dG9uIGJhciBhbmQgY2FsbHMgdGhlIDxjb2RlPmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXI8L2NvZGU+Ci0JICogZnJhbWV3b3JrIG1ldGhvZCB0byBwb3B1bGF0ZSBpdC4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBidXR0b24gYmFyCi0JICogQHJldHVybiB0aGUgYnV0dG9uIGJhciBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCi0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZTIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCS8vIGNyZWF0ZSBhIGxheW91dCB3aXRoIHNwYWNpbmcgYW5kIG1hcmdpbnMgYXBwcm9wcmlhdGUgZm9yIHRoZSBmb250IHNpemUuCi0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMDsgLy8gdGhpcyBpcyBpbmNyZW1lbnRlZCBieSBjcmVhdGVCdXR0b24KLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQotCQljb21wb3NpdGUyLnNldExheW91dChsYXlvdXQpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQljb21wb3NpdGUyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY29tcG9zaXRlMi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCS8vIEFkZCB0aGUgYnV0dG9ucyB0byB0aGUgYnV0dG9uIGJhci4KLQkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihjb21wb3NpdGUyKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKgotCSAqIEBwcml2YXRlCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0KLQkJZkNoaWxkID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmQ2hpbGQsICJjb20uaWJtLmV0b29scy53ZWJhcHBsaWNhdGlvbmVkaXQud2VieDIwMTAiKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDI7Ci0JCWdsLm1hcmdpbkhlaWdodCA9IDA7Ci0JCWZDaGlsZC5zZXRMYXlvdXQoZ2wpOwotCi0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlmQ2hpbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBXZWIgVHlwZSByYWRpbyBidXR0b25zIGFuZCB0ZXh0IGZpZWxkcy4KLQkJZlNlcnZsZXRCdXR0b24gPSBuZXcgQnV0dG9uKGZDaGlsZCwgU1dULlJBRElPKTsKLQkJZlNlcnZsZXRCdXR0b24uc2V0VGV4dChXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VydmxldF9VSV8iKSk7IC8vJE5PTi1OTFMtMSQgPSBTZXJ2bGV0Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWZTZXJ2bGV0QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlmU2VydmxldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlmSlNQQnV0dG9uID0gbmV3IEJ1dHRvbihmQ2hpbGQsIFNXVC5SQURJTyk7Ci0JCWZKU1BCdXR0b24uc2V0VGV4dCgiSlNQIik7IC8vJE5PTi1OTFMtMSQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZkpTUEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkpTUEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlpZiAoZlNlbGVjdGlvbiA9PSBKU1ApCi0JCQlmSlNQQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZWxzZSB7Ci0JCQlmU2VydmxldEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmU2VsZWN0aW9uID0gU0VSVkxFVDsKLQkJfQotCi0JCWZQYWdlQm9vayA9IG5ldyBQYWdlQm9vayhmQ2hpbGQsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmUGFnZUJvb2suc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZKc3BDb250cm9sID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShmUGFnZUJvb2spOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGZQYWdlQm9vaywgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQlMYWJlbCBtZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbWVzc2FnZUxhYmVsLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNob29zZV9hX3NlcnZsZXRfXzEiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmVGV4dCA9IGNyZWF0ZVRleHQoY29tcG9zaXRlKTsKLQotCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbWVzc2FnZUxhYmVsLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk1hdGNoaW5nX3NlcnZsZXRzX18yIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZlVwcGVyTGlzdCA9IGNyZWF0ZVVwcGVyTGlzdChjb21wb3NpdGUpOwotCi0JCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQltZXNzYWdlTGFiZWwuc2V0VGV4dChXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUXVhbGlmaWVyX18zIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZkxvd2VyTGlzdCA9IGNyZWF0ZUxvd2VyTGlzdChjb21wb3NpdGUpOwotCi0JCWZTZXJ2bGV0Q29udHJvbCA9IGNvbXBvc2l0ZTsKLQotCQlpZiAoZlNlbGVjdGlvbiA9PSBKU1ApCi0JCQlmUGFnZUJvb2suc2hvd1BhZ2UoZkpzcENvbnRyb2wpOwotCQllbHNlCi0JCQlmUGFnZUJvb2suc2hvd1BhZ2UoZlNlcnZsZXRDb250cm9sKTsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCB3aWRnZXQgYW5kIHNldHMgbGF5b3V0IGRhdGEuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0Ci0JICovCi0JcHJpdmF0ZSBUYWJsZSBjcmVhdGVMb3dlckxpc3QoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZkxvd2VyTGlzdExhYmVsICE9IG51bGwpCi0JCQkgKG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKSkuc2V0VGV4dChmTG93ZXJMaXN0TGFiZWwpOwotCi0JCVRhYmxlIGxpc3QgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJbGlzdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQloYW5kbGVMb3dlclNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWxpc3QuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCWhhbmRsZUxvd2VyRG91YmxlQ2xpY2soKTsKLQkJCX0KLQkJfSk7Ci0JCWxpc3QuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWZRdWFsaWZpZXJSZW5kZXJlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0JCXNwZWMud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDUwKTsKLQkJc3BlYy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsaXN0LnNldExheW91dERhdGEoc3BlYyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0ZXh0IHdpZGdldCBhbmQgc2V0cyBsYXlvdXQgZGF0YS4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQKLQkgKi8KLQlwcml2YXRlIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLQkJc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQl0ZXh0LnNldExheW91dERhdGEoc3BlYyk7Ci0JCUxpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQlyZW1hdGNoKGZUZXh0LmdldFRleHQoKSk7Ci0JCQl9Ci0JCX07Ci0JCXRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsaXN0IHdpZGdldCBhbmQgc2V0cyBsYXlvdXQgZGF0YS4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QKLQkgKi8KLQlwcml2YXRlIFRhYmxlIGNyZWF0ZVVwcGVyTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChmVXBwZXJMaXN0TGFiZWwgIT0gbnVsbCkKLQkJCSAobmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpKS5zZXRUZXh0KGZVcHBlckxpc3RMYWJlbCk7Ci0KLQkJVGFibGUgbGlzdCA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlsaXN0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCWhhbmRsZVVwcGVyU2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJbGlzdC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3VibGVDbGljaywgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJaGFuZGxlVXBwZXJEb3VibGVDbGljaygpOwotCQkJfQotCQl9KTsKLQkJbGlzdC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJZkVsZW1lbnRSZW5kZXJlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0JCXNwZWMud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDUwKTsKLQkJc3BlYy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxNSk7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGlzdC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgSUQgb2YgdGhlIGJ1dHRvbiB0aGF0IGlzICdwcmVzc2VkJyBvbiBkb3VibGVDbGljayBpbiB0aGUgbGlzdHMuCi0JICogQnkgZGVmYXVsdCBpdCBpcyB0aGUgT0sgYnV0dG9uLgotCSAqIE92ZXJyaWRlIHRvIGNoYW5nZSB0aGlzIHNldHRpbmcuCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0QnV0dG9uSUQoKSB7Ci0JCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb247Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgewotCQlpbnQgaSA9IGZMb3dlckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGZRdWFsaWZpZXJNYXAgIT0gbnVsbCkgewotCQkJaWYgKGZRdWFsaWZpZXJNYXAubGVuZ3RoID09IDEpCi0JCQkJaSA9IDA7Ci0JCQlpZiAoaSA8IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gCi0JCQlJbnRlZ2VyIGluZGV4ID0gZlF1YWxpZmllck1hcFtpXTsKLQkJCXJldHVybiBmRWxlbWVudHNbaW5kZXguaW50VmFsdWUoKV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZUxvd2VyRG91YmxlQ2xpY2soKSB7Ci0JCWlmIChnZXRXaWRnZXRTZWxlY3Rpb24oKSAhPSBudWxsKQotCQkJYnV0dG9uUHJlc3NlZChnZXREZWZhdWx0QnV0dG9uSUQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZUxvd2VyU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJdXBkYXRlT2tTdGF0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVVcHBlckRvdWJsZUNsaWNrKCkgewotCQlpZiAoZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkKLQkJCWJ1dHRvblByZXNzZWQoZ2V0RGVmYXVsdEJ1dHRvbklEKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVVcHBlclNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCWludCBzZWxlY3Rpb24gPSBmVXBwZXJMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChzZWxlY3Rpb24gPj0gMCkgewotCQkJaW50IGkgPSBmRWxlbWVudE1hcFtzZWxlY3Rpb25dOwotCQkJaW50IGsgPSBpOwotCQkJaW50IGxlbmd0aCA9IGZSZW5kZXJlZFN0cmluZ3MubGVuZ3RoOwotCQkJd2hpbGUgKGsgPCBsZW5ndGggJiYgZlJlbmRlcmVkU3RyaW5nc1trXS5lcXVhbHMoZlJlbmRlcmVkU3RyaW5nc1tpXSkpIHsKLQkJCQlrKys7Ci0JCQl9Ci0JCQl1cGRhdGVMb3dlckxpc3RXaWRnZXQoaSwgayk7Ci0JCX0gZWxzZQotCQkJdXBkYXRlTG93ZXJMaXN0V2lkZ2V0KDAsIDApOwotCX0KLQkKLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0KLQkJaWYgKGZJVCA9PSBudWxsIHx8IGZJVC5sZW5ndGggPT0gMCkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0U2hlbGwoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVtcHR5X0xpc3RfMSIpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX0lORk9fTm9fc2VydmxldHNfZXhpc3RfdG9fYWRkLl8xIikpOyAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gQ0FOQ0VMOwotCQl9Ci0KLQkJc2V0RWxlbWVudHMoZklUKTsKLQkJc2V0SW5pdGlhbFNlbGVjdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogdXBkYXRlIHRoZSBsaXN0IHRvIHJlZmxlY3QgYSBuZXcgbWF0Y2ggc3RyaW5nLgotCSAqIEBwYXJhbSBtYXRjaFN0cmluZyBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtYXRjaChTdHJpbmcgbWF0Y2hTdHJpbmcpIHsKLQkJaW50IGsgPSAwOwotCQlTdHJpbmcgdGV4dCA9IGZUZXh0LmdldFRleHQoKTsKLQkJU3RyaW5nTWF0Y2hlciBtYXRjaGVyID0gbmV3IFN0cmluZ01hdGNoZXIodGV4dCArICIqIiwgZklnbm9yZUNhc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGFzdFN0cmluZyA9IG51bGw7Ci0JCWludCBsZW5ndGggPSBmRWxlbWVudHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQl3aGlsZSAoaSA8IGxlbmd0aCAmJiBmUmVuZGVyZWRTdHJpbmdzW2ldLmVxdWFscyhsYXN0U3RyaW5nKSkKLQkJCQlpKys7Ci0JCQlpZiAoaSA8IGxlbmd0aCkgewotCQkJCWxhc3RTdHJpbmcgPSBmUmVuZGVyZWRTdHJpbmdzW2ldOwotCQkJCWlmIChtYXRjaGVyLm1hdGNoKGZSZW5kZXJlZFN0cmluZ3NbaV0pKSB7Ci0JCQkJCWZFbGVtZW50TWFwW2tdID0gaTsKLQkJCQkJaysrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmRWxlbWVudE1hcFtrXSA9IC0xOwotCi0JCXVwZGF0ZVVwcGVyTGlzdFdpZGdldChmRWxlbWVudE1hcCwgayk7Ci0JfQotCQotCS8qKgotCQkgKiAKLQkJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkJICogQHBhcmFtIHAgb3JnLmVjbGlwc2UuamZhY2UuZWxlbWVudHMuSUluZGV4ZWRQcm9wZXJ0eQotCQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIHJlbmRlclN0cmluZ3MoT2JqZWN0W10gcCkgewotCQlTdHJpbmdbXSBzdHJpbmdzID0gbmV3IFN0cmluZ1twLmxlbmd0aF07Ci0JCWludCBzaXplID0gc3RyaW5ncy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzdHJpbmdzW2ldID0gZkVsZW1lbnRSZW5kZXJlci5nZXRUZXh0KHBbaV0pOwotCQl9Ci0JCW5ldyBUd29BcnJheVF1aWNrU29ydGVyKGZJZ25vcmVDYXNlKS5zb3J0KHN0cmluZ3MsIHApOwotCQlyZXR1cm4gc3RyaW5nczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cykgewotCQlmRWxlbWVudHMgPSBlbGVtZW50czsKLQkJZkVsZW1lbnRNYXAgPSBuZXcgaW50W2ZFbGVtZW50cy5sZW5ndGggKyAxXTsKLQkJZlJlbmRlcmVkU3RyaW5ncyA9IHJlbmRlclN0cmluZ3MoZkVsZW1lbnRzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEl0ZW0oaW50IG5ld1NlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVMb3dlckxpc3RXaWRnZXQoaW50IGZyb20sIGludCB0bykgewotCQlmTG93ZXJMaXN0LnJlbW92ZUFsbCgpOwotCQlmUXVhbGlmaWVyTWFwID0gbmV3IEludGVnZXJbdG8gLSBmcm9tXTsKLQkJU3RyaW5nW10gcXVhbGlmaWVycyA9IG5ldyBTdHJpbmdbdG8gLSBmcm9tXTsKLQkJZm9yIChpbnQgaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7Ci0JCQkvLyBYWFg6IDFHNjVMREc6IEpGVUlGOldJTjIwMDAgLSBJTGFiZWxQcm92aWRlciB1c2VkIG91dHNpZGUgYSB2aWV3ZXIKLQkJCXF1YWxpZmllcnNbaSAtIGZyb21dID0gZlF1YWxpZmllclJlbmRlcmVyLmdldFRleHQoZkVsZW1lbnRzW2ldKTsKLQkJCWZRdWFsaWZpZXJNYXBbaSAtIGZyb21dID0gbmV3IEludGVnZXIoaSk7Ci0JCX0KLQotCQluZXcgVHdvQXJyYXlRdWlja1NvcnRlcihmSWdub3JlQ2FzZSkuc29ydChxdWFsaWZpZXJzLCBmUXVhbGlmaWVyTWFwKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvIC0gZnJvbTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKGZMb3dlckxpc3QsIGkpOwotCQkJdGkuc2V0VGV4dChxdWFsaWZpZXJzW2ldKTsKLQkJCS8vIFhYWDogMUc2NUxERzogSkZVSUY6V0lOMjAwMCAtIElMYWJlbFByb3ZpZGVyIHVzZWQgb3V0c2lkZSBhIHZpZXdlcgotCQkJSW1hZ2UgaW1nID0gZlF1YWxpZmllclJlbmRlcmVyLmdldEltYWdlKGZFbGVtZW50c1tmcm9tICsgaV0pOwotCQkJaWYgKGltZyAhPSBudWxsKQotCQkJCXRpLnNldEltYWdlKGltZyk7Ci0JCX0KLQotCQlpZiAoZkxvd2VyTGlzdC5nZXRJdGVtQ291bnQoKSA+IDApCi0JCQlmTG93ZXJMaXN0LnNldFNlbGVjdGlvbigwKTsKLQkJdXBkYXRlT2tTdGF0ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlT2tTdGF0ZSgpIHsKLQkJQnV0dG9uIG9rQnV0dG9uID0gZ2V0T2tCdXR0b24oKTsKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpCi0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGdldFdpZGdldFNlbGVjdGlvbigpICE9IG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlVXBwZXJMaXN0V2lkZ2V0KGludFtdIGluZGljZXMsIGludCBzaXplKSB7Ci0JCWZVcHBlckxpc3Quc2V0UmVkcmF3KGZhbHNlKTsKLQkJaW50IGl0ZW1Db3VudCA9IGZVcHBlckxpc3QuZ2V0SXRlbUNvdW50KCk7Ci0JCWlmIChzaXplIDwgaXRlbUNvdW50KQotCQkJZlVwcGVyTGlzdC5yZW1vdmUoMCwgaXRlbUNvdW50IC0gc2l6ZSAtIDEpOwotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGZVcHBlckxpc3QuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVRhYmxlSXRlbSB0aSA9IG51bGw7Ci0JCQlpZiAoaSA8IGl0ZW1Db3VudCkKLQkJCQl0aSA9IGl0ZW1zW2ldOwotCQkJZWxzZQotCQkJCXRpID0gbmV3IFRhYmxlSXRlbShmVXBwZXJMaXN0LCBpKTsKLQkJCXRpLnNldFRleHQoZlJlbmRlcmVkU3RyaW5nc1tpbmRpY2VzW2ldXSk7Ci0JCQkvLyBYWFg6IDFHNjVMREc6IEpGVUlGOldJTjIwMDAgLSBJTGFiZWxQcm92aWRlciB1c2VkIG91dHNpZGUgYSB2aWV3ZXIKLQkJCUltYWdlIGltZyA9IGZFbGVtZW50UmVuZGVyZXIuZ2V0SW1hZ2UoZkVsZW1lbnRzW2luZGljZXNbaV1dKTsKLQkJCWlmIChpbWcgIT0gbnVsbCkKLQkJCQl0aS5zZXRJbWFnZShpbWcpOwotCQl9Ci0JCWlmIChmVXBwZXJMaXN0LmdldEl0ZW1Db3VudCgpID4gMCkKLQkJCWZVcHBlckxpc3Quc2V0U2VsZWN0aW9uKDApOwotCQlmVXBwZXJMaXN0LnNldFJlZHJhdyh0cnVlKTsKLQkJaGFuZGxlVXBwZXJTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCQotCS8qKgotCSAqIFNlbnQgd2hlbiBkZWZhdWx0IHNlbGVjdGlvbiBvY2N1cnMgaW4gdGhlIGNvbnRyb2wuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIG9uIHNvbWUgcGxhdGZvcm1zIGRlZmF1bHQgc2VsZWN0aW9uIG9jY3VycwotCSAqIGluIGEgTGlzdCB3aGVuIHRoZSB1c2VyIGRvdWJsZS1jbGlja3MgYW4gaXRlbSBvciB0eXBlcwotCSAqIHJldHVybiBpbiBhIFRleHQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGUgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGVmYXVsdCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIFNlbnQgd2hlbiBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBjb250cm9sLgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBvbiBzb21lIHBsYXRmb3JtcyBzZWxlY3Rpb24gb2NjdXJzIGluCi0JICogYSBMaXN0IHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtIG9yIGl0ZW1zLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBlIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IGZKU1BCdXR0b24pIHsKLQkJCWZTZWxlY3Rpb24gPSBKU1A7Ci0JCQlmUGFnZUJvb2suc2hvd1BhZ2UoZkpzcENvbnRyb2wpOwotCQkJdXBkYXRlT0tTdGF0dXMoKTsKLQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBmU2VydmxldEJ1dHRvbikgewotCQkJZlNlbGVjdGlvbiA9IFNFUlZMRVQ7Ci0JCQlmUGFnZUJvb2suc2hvd1BhZ2UoZlNlcnZsZXRDb250cm9sKTsKLQkJfSBlbHNlCi0JCQlmU2VsZWN0aW9uID0gLTE7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cjdXBkYXRlT0tTdGF0dXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9LU3RhdHVzKCkgewotCQlzdXBlci51cGRhdGVPS1N0YXR1cygpOwotCQlCdXR0b24gb2tCdXR0b24gPSBnZXRPa0J1dHRvbigpOwotCQlpZiAob2tCdXR0b24gIT0gbnVsbCkKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZkxvY2FsVmFsaWRhdG9yLnZhbGlkYXRlKGdldFJlc3VsdCgpKS5pc09LKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9NdWx0aVNlbGVjdEZpbHRlcmVkRmlsdGVyRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9NdWx0aVNlbGVjdEZpbHRlcmVkRmlsdGVyRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQyMDg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbHRlckZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfRklMVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ERUZBVUxUX1BBQ0tBR0U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5GaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5Ud29BcnJheVF1aWNrU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuVHlwZWRGaWxlVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDcvMzAvMjAwMSAxMToxNjozNiBBTSkKLSAqLwotcHVibGljIGNsYXNzIE11bHRpU2VsZWN0RmlsdGVyZWRGaWx0ZXJGaWxlU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMKLQkJRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nIHsKLQkKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhY2thZ2VSZW5kZXJlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwcml2YXRlIGZpbmFsIEltYWdlIFBBQ0tBR0VfSUNPTiA9IEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1BBQ0tBR0UpOyAKLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgcCA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCWlmICgiIi5lcXVhbHMocCkpIC8vJE5PTi1OTFMtMSQKLQkJCQlwID0gREVGQVVMVF9QQUNLQUdFOwotCQkJcmV0dXJuIChwICsgIiAtICIgKyB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldFBhcmVudCgpLmdldFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIFBBQ0tBR0VfSUNPTjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVSZW5kZXJlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwcml2YXRlIGZpbmFsIEltYWdlIENMQVNTX0lDT04gPSBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19DTEFTUyk7IAotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJSVR5cGUgZSA9ICgoSVR5cGUpIGVsZW1lbnQpOwotCQkJcmV0dXJuIGUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIENMQVNTX0lDT047Ci0JCX0KLQotCX0KLQlwcm90ZWN0ZWQgUGFnZUJvb2sgZlBhZ2VCb29rID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29udHJvbCBmU2VydmxldENvbnRyb2wgPSBudWxsOwotCXByb3RlY3RlZCBDb21wb3NpdGUgZkNoaWxkID0gbnVsbDsKLQkvLyBjb25zdHJ1Y3Rpb24gcGFyYW1ldGVycwotCXByb3RlY3RlZCBJUnVubmFibGVDb250ZXh0IGZSdW5uYWJsZUNvbnRleHQ7Ci0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGZFbGVtZW50UmVuZGVyZXI7Ci0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGZRdWFsaWZpZXJSZW5kZXJlcjsKLQlwcml2YXRlIE9iamVjdFtdIGZFbGVtZW50czsKLQlwcml2YXRlIGJvb2xlYW4gZklnbm9yZUNhc2UgPSB0cnVlOwotCXByaXZhdGUgU3RyaW5nIGZVcHBlckxpc3RMYWJlbDsKLQlwcml2YXRlIFN0cmluZyBmTG93ZXJMaXN0TGFiZWw7Ci0JLy8gU1dUIHdpZGdldHMKLQlwcml2YXRlIFRhYmxlIGZVcHBlckxpc3Q7Ci0JcHJpdmF0ZSBUYWJsZSBmTG93ZXJMaXN0OwotCXByb3RlY3RlZCBUZXh0IGZUZXh0OwotCXByaXZhdGUgSVR5cGVbXSBmSVQ7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmUmVuZGVyZWRTdHJpbmdzOwotCXByaXZhdGUgaW50W10gZkVsZW1lbnRNYXA7Ci0JcHJpdmF0ZSBJbnRlZ2VyW10gZlF1YWxpZmllck1hcDsKLQotCXByaXZhdGUgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBmTG9jYWxWYWxpZGF0b3IgPSBudWxsOwotCS8qKgotCSAqIFRoaXMgaXMgYSBzZWxlY3Rpb24gZGlhbG9nIGZvciBhdmFpbGFibGUgc2VydmxldC4KLQkgKiBAcGFyYW0gcGFyZW50IFNoZWxsCi0JICogQHBhcmFtIHRpdGxlIFN0cmluZwotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqIEBwYXJlbnQgZXh0ZW5zaW9ucyBTdHJpbmdbXQotCSAqIEBwYXJhbSBhbGxvd011bHRpcGxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbHRlckZpbGVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBleHRlbnNpb25zLCBib29sZWFuIGFsbG93TXVsdGlwbGUsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIocGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgZXh0ZW5zaW9ucywgYWxsb3dNdWx0aXBsZSk7Ci0JCXNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7Ci0KLQkJaWYgKHRpdGxlID09IG51bGwpCi0JCQlzZXRUaXRsZShXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmlsZV9TZWxlY3Rpb25fVUlfIikpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQltZXNzYWdlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdF9hX2ZpbGVfX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JCXNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCXNldEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0JCWFkZEZpbHRlcihuZXcgVHlwZWRGaWxlVmlld2VyRmlsdGVyKGV4dGVuc2lvbnMpKTsKLQkJZkxvY2FsVmFsaWRhdG9yID0gbmV3IFNpbXBsZVR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcihuZXcgQ2xhc3NbXSB7IElGaWxlLmNsYXNzIH0sIGFsbG93TXVsdGlwbGUpOwotCQlzZXRWYWxpZGF0b3IoZkxvY2FsVmFsaWRhdG9yKTsKLQkJCi0JCS8vU3RhdHVzSW5mbyBjdXJyU3RhdHVzID0gbmV3IFN0YXR1c0luZm8oKTsKLQkJLy9jdXJyU3RhdHVzLnNldE9LKCk7Ci0JCVN0YXR1cyBjdXJyU3RhdHVzID0gbmV3IFN0YXR1cyhTdGF0dXMuT0ssIFNlcnZsZXRVSVBsdWdpbi5QTFVHSU5fSUQsIFN0YXR1cy5PSywgIiIsIG51bGwpOwotCQkKLQkJdXBkYXRlU3RhdHVzKGN1cnJTdGF0dXMpOwotCQlmRWxlbWVudFJlbmRlcmVyID0gbmV3IFR5cGVSZW5kZXJlcigpOwotCQlmUXVhbGlmaWVyUmVuZGVyZXIgPSBuZXcgUGFja2FnZVJlbmRlcmVyKCk7Ci0JCWZSdW5uYWJsZUNvbnRleHQgPSBTZXJ2bGV0VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQl0cnkgewotCQkJSUphdmFFbGVtZW50IGplbGVtID0gbnVsbDsKLQkJCUlQcm9qZWN0IHByb2ogPSBudWxsOwotCQkJamVsZW0gPSAoSUphdmFFbGVtZW50KSBwcm9qZWN0LmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKLQkJCWlmIChqZWxlbSA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgcHJvamVjdC5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJcHJvaiA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCQkJaWYgKHByb2ogIT0gbnVsbCkgewotCQkJCQkJamVsZW0gPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZS5jcmVhdGUocHJvaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlJSmF2YVByb2plY3QganAgPSBqZWxlbS5nZXRKYXZhUHJvamVjdCgpOwotCQkJIElUeXBlIGZpbHRlclR5cGUgPSBqcC5maW5kVHlwZShRVUFMSUZJRURfRklMVEVSKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gbmV4dCAzIGxpbmVzIGZpeCBkZWZlY3QgMTc3Njg2Ci0JCQlpZiAoZmlsdGVyVHlwZSA9PSBudWxsKSB7Ci0JCQkgICAgcmV0dXJuOwotCQkJfQotCQkJQXJyYXlMaXN0IGZpbHRlckNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJVHlwZUhpZXJhcmNoeSB0SCA9IGZpbHRlclR5cGUubmV3VHlwZUhpZXJhcmNoeShqcCwgbnVsbCk7Ci0JCQlJVHlwZVtdIHR5cGVzID0gdEguZ2V0QWxsU3VidHlwZXMoZmlsdGVyVHlwZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkgICAgaWYgKHR5cGVzW2ldLmlzQ2xhc3MoKSAmJiAhZmlsdGVyQ2xhc3Nlcy5jb250YWlucyh0eXBlc1tpXSkpCi0JCQkgICAgICAgIGZpbHRlckNsYXNzZXMuYWRkKHR5cGVzW2ldKTsKLQkJCX0KLQkJCWZJVCA9IChJVHlwZVtdKSBmaWx0ZXJDbGFzc2VzLnRvQXJyYXkobmV3IElUeXBlW2ZpbHRlckNsYXNzZXMuc2l6ZSgpXSk7Ci0JCQlmaWx0ZXJDbGFzc2VzID0gbnVsbDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZsZXRVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHByaXZhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVzdWx0KCkgewotCSAgICBJVHlwZSB0eXBlID0gKElUeXBlKSBnZXRXaWRnZXRTZWxlY3Rpb24oKTsKLQkgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotCSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotCSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWxlY3RfQ2xhc3NfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiU2VsZWN0IENsYXNzIgotCSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvdWxkX25vdF91bmlxdWVseV9tYXBfdGhlX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkID0gIkNvdWxkIG5vdCB1bmlxdWVseSBtYXAgdGhlIGNsYXNzIG5hbWUgdG8gYSBjbGFzcy4iCi0JICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCSAgICAgICAgICAgIHNldFJlc3VsdChudWxsKTsKLQkgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgICAgICAgamF2YS51dGlsLkxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkgICAgICAgICAgICByZXN1bHQuYWRkKHR5cGUpOwotCSAgICAgICAgICAgIHNldFJlc3VsdChyZXN1bHQpOwotCSAgICAgICAgfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCWZUZXh0LnNldEZvY3VzKCk7Ci0JCXJlbWF0Y2goIiIpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZU9rU3RhdGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBkaWFsb2cncyAKLQkgKiBidXR0b24gYmFyLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotCSAqIGxheXMgb3V0IGEgYnV0dG9uIGJhciBhbmQgY2FsbHMgdGhlIDxjb2RlPmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXI8L2NvZGU+Ci0JICogZnJhbWV3b3JrIG1ldGhvZCB0byBwb3B1bGF0ZSBpdC4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBidXR0b24gYmFyCi0JICogQHJldHVybiB0aGUgYnV0dG9uIGJhciBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0KLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUyID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQkvLyBjcmVhdGUgYSBsYXlvdXQgd2l0aCBzcGFjaW5nIGFuZCBtYXJnaW5zIGFwcHJvcHJpYXRlIGZvciB0aGUgZm9udCBzaXplLgotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDA7IC8vIHRoaXMgaXMgaW5jcmVtZW50ZWQgYnkgY3JlYXRlQnV0dG9uCi0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0KLQkJY29tcG9zaXRlMi5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJY29tcG9zaXRlMi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNvbXBvc2l0ZTIuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQkvLyBBZGQgdGhlIGJ1dHRvbnMgdG8gdGhlIGJ1dHRvbiBiYXIuCi0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoY29tcG9zaXRlMik7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JLyoKLQkgKiBAcHJpdmF0ZQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCWZDaGlsZCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZkNoaWxkLCAiY29tLmlibS5ldG9vbHMud2ViYXBwbGljYXRpb25lZGl0LndlYngyMDEwIik7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdsLm51bUNvbHVtbnMgPSAyOwotCQlnbC5tYXJnaW5IZWlnaHQgPSA1OwotCQlmQ2hpbGQuc2V0TGF5b3V0KGdsKTsKLQotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWZDaGlsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soZkNoaWxkLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlBhZ2VCb29rLnNldExheW91dERhdGEoZ2QpOwotCQlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGZQYWdlQm9vayk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZlBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCUxhYmVsIG1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0VGV4dChXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2hvb3NlX2FfZmlsdGVyX18xIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgZlRleHQgPSBjcmVhdGVUZXh0KGNvbXBvc2l0ZSk7Ci0KLQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNYXRjaGluZ19maWx0ZXJzX18yIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZlVwcGVyTGlzdCA9IGNyZWF0ZVVwcGVyTGlzdChjb21wb3NpdGUpOwotCi0JCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQltZXNzYWdlTGFiZWwuc2V0VGV4dChXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUXVhbGlmaWVyX18zIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZkxvd2VyTGlzdCA9IGNyZWF0ZUxvd2VyTGlzdChjb21wb3NpdGUpOwotCi0JCWZTZXJ2bGV0Q29udHJvbCA9IGNvbXBvc2l0ZTsKLQotCQlmUGFnZUJvb2suc2hvd1BhZ2UoZlNlcnZsZXRDb250cm9sKTsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCB3aWRnZXQgYW5kIHNldHMgbGF5b3V0IGRhdGEuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0Ci0JICovCi0JcHJpdmF0ZSBUYWJsZSBjcmVhdGVMb3dlckxpc3QoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZkxvd2VyTGlzdExhYmVsICE9IG51bGwpCi0JCQkgKG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKSkuc2V0VGV4dChmTG93ZXJMaXN0TGFiZWwpOwotCi0JCVRhYmxlIGxpc3QgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJbGlzdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQloYW5kbGVMb3dlclNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWxpc3QuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCWhhbmRsZUxvd2VyRG91YmxlQ2xpY2soKTsKLQkJCX0KLQkJfSk7Ci0JCWxpc3QuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWZRdWFsaWZpZXJSZW5kZXJlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0JCXNwZWMud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDUwKTsKLQkJc3BlYy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsaXN0LnNldExheW91dERhdGEoc3BlYyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0ZXh0IHdpZGdldCBhbmQgc2V0cyBsYXlvdXQgZGF0YS4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQKLQkgKi8KLQlwcml2YXRlIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLQkJc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQl0ZXh0LnNldExheW91dERhdGEoc3BlYyk7Ci0JCUxpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQlyZW1hdGNoKGZUZXh0LmdldFRleHQoKSk7Ci0JCQl9Ci0JCX07Ci0JCXRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsaXN0IHdpZGdldCBhbmQgc2V0cyBsYXlvdXQgZGF0YS4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QKLQkgKi8KLQlwcml2YXRlIFRhYmxlIGNyZWF0ZVVwcGVyTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChmVXBwZXJMaXN0TGFiZWwgIT0gbnVsbCkKLQkJCSAobmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpKS5zZXRUZXh0KGZVcHBlckxpc3RMYWJlbCk7Ci0KLQkJVGFibGUgbGlzdCA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlsaXN0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCWhhbmRsZVVwcGVyU2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJbGlzdC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3VibGVDbGljaywgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJaGFuZGxlVXBwZXJEb3VibGVDbGljaygpOwotCQkJfQotCQl9KTsKLQkJbGlzdC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJZkVsZW1lbnRSZW5kZXJlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0JCXNwZWMud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDUwKTsKLQkJc3BlYy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxNSk7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGlzdC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgSUQgb2YgdGhlIGJ1dHRvbiB0aGF0IGlzICdwcmVzc2VkJyBvbiBkb3VibGVDbGljayBpbiB0aGUgbGlzdHMuCi0JICogQnkgZGVmYXVsdCBpdCBpcyB0aGUgT0sgYnV0dG9uLgotCSAqIE92ZXJyaWRlIHRvIGNoYW5nZSB0aGlzIHNldHRpbmcuCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0QnV0dG9uSUQoKSB7Ci0JCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFdpZGdldFNlbGVjdGlvbigpIHsKLQkJaW50IGkgPSBmTG93ZXJMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChmUXVhbGlmaWVyTWFwICE9IG51bGwpIHsKLQkJCWlmIChmUXVhbGlmaWVyTWFwLmxlbmd0aCA9PSAxKQotCQkJCWkgPSAwOwotCQkJaWYgKGkgPCAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IAotCQkJSW50ZWdlciBpbmRleCA9IGZRdWFsaWZpZXJNYXBbaV07Ci0JCQlyZXR1cm4gZkVsZW1lbnRzW2luZGV4LmludFZhbHVlKCldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVMb3dlckRvdWJsZUNsaWNrKCkgewotCQlpZiAoZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkKLQkJCWJ1dHRvblByZXNzZWQoZ2V0RGVmYXVsdEJ1dHRvbklEKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVMb3dlclNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCXVwZGF0ZU9rU3RhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlVXBwZXJEb3VibGVDbGljaygpIHsKLQkJaWYgKGdldFdpZGdldFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQlidXR0b25QcmVzc2VkKGdldERlZmF1bHRCdXR0b25JRCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlVXBwZXJTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQlpbnQgc2VsZWN0aW9uID0gZlVwcGVyTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoc2VsZWN0aW9uID49IDApIHsKLQkJCWludCBpID0gZkVsZW1lbnRNYXBbc2VsZWN0aW9uXTsKLQkJCWludCBrID0gaTsKLQkJCWludCBsZW5ndGggPSBmUmVuZGVyZWRTdHJpbmdzLmxlbmd0aDsKLQkJCXdoaWxlIChrIDwgbGVuZ3RoICYmIGZSZW5kZXJlZFN0cmluZ3Nba10uZXF1YWxzKGZSZW5kZXJlZFN0cmluZ3NbaV0pKSB7Ci0JCQkJaysrOwotCQkJfQotCQkJdXBkYXRlTG93ZXJMaXN0V2lkZ2V0KGksIGspOwotCQl9IGVsc2UKLQkJCXVwZGF0ZUxvd2VyTGlzdFdpZGdldCgwLCAwKTsKLQl9Ci0JCi0JcHVibGljIGludCBvcGVuKCkgewotCQlpZiAoZklUID09IG51bGwgfHwgZklULmxlbmd0aCA9PSAwKSB7Ci0JCSAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRTaGVsbCgpLCAKLQkJICAgICAgICAgICAgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVtcHR5X0xpc3RfMSIpLCAKLQkJICAgICAgICAgICAgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9JTkZPX05vX2ZpbHRlcnNfZXhpc3RfdG9fYWRkLl8xIikpOyAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gQ0FOQ0VMOwotCQl9Ci0KLQkJc2V0RWxlbWVudHMoZklUKTsKLQkJc2V0SW5pdGlhbFNlbGVjdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogdXBkYXRlIHRoZSBsaXN0IHRvIHJlZmxlY3QgYSBuZXcgbWF0Y2ggc3RyaW5nLgotCSAqIEBwYXJhbSBtYXRjaFN0cmluZyBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtYXRjaChTdHJpbmcgbWF0Y2hTdHJpbmcpIHsKLQkJaW50IGsgPSAwOwotCQlTdHJpbmcgdGV4dCA9IGZUZXh0LmdldFRleHQoKTsKLQkJU3RyaW5nTWF0Y2hlciBtYXRjaGVyID0gbmV3IFN0cmluZ01hdGNoZXIodGV4dCArICIqIiwgZklnbm9yZUNhc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGFzdFN0cmluZyA9IG51bGw7Ci0JCWludCBsZW5ndGggPSBmRWxlbWVudHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQl3aGlsZSAoaSA8IGxlbmd0aCAmJiBmUmVuZGVyZWRTdHJpbmdzW2ldLmVxdWFscyhsYXN0U3RyaW5nKSkKLQkJCQlpKys7Ci0JCQlpZiAoaSA8IGxlbmd0aCkgewotCQkJCWxhc3RTdHJpbmcgPSBmUmVuZGVyZWRTdHJpbmdzW2ldOwotCQkJCWlmIChtYXRjaGVyLm1hdGNoKGZSZW5kZXJlZFN0cmluZ3NbaV0pKSB7Ci0JCQkJCWZFbGVtZW50TWFwW2tdID0gaTsKLQkJCQkJaysrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmRWxlbWVudE1hcFtrXSA9IC0xOwotCi0JCXVwZGF0ZVVwcGVyTGlzdFdpZGdldChmRWxlbWVudE1hcCwgayk7Ci0JfQotCQotCS8qKgotCQkgKiAKLQkJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkJICogQHBhcmFtIHAgb3JnLmVjbGlwc2UuamZhY2UuZWxlbWVudHMuSUluZGV4ZWRQcm9wZXJ0eQotCQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIHJlbmRlclN0cmluZ3MoT2JqZWN0W10gcCkgewotCQlTdHJpbmdbXSBzdHJpbmdzID0gbmV3IFN0cmluZ1twLmxlbmd0aF07Ci0JCWludCBzaXplID0gc3RyaW5ncy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzdHJpbmdzW2ldID0gZkVsZW1lbnRSZW5kZXJlci5nZXRUZXh0KHBbaV0pOwotCQl9Ci0JCW5ldyBUd29BcnJheVF1aWNrU29ydGVyKGZJZ25vcmVDYXNlKS5zb3J0KHN0cmluZ3MsIHApOwotCQlyZXR1cm4gc3RyaW5nczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cykgewotCQlmRWxlbWVudHMgPSBlbGVtZW50czsKLQkJZkVsZW1lbnRNYXAgPSBuZXcgaW50W2ZFbGVtZW50cy5sZW5ndGggKyAxXTsKLQkJZlJlbmRlcmVkU3RyaW5ncyA9IHJlbmRlclN0cmluZ3MoZkVsZW1lbnRzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTG93ZXJMaXN0V2lkZ2V0KGludCBmcm9tLCBpbnQgdG8pIHsKLQkJZkxvd2VyTGlzdC5yZW1vdmVBbGwoKTsKLQkJZlF1YWxpZmllck1hcCA9IG5ldyBJbnRlZ2VyW3RvIC0gZnJvbV07Ci0JCVN0cmluZ1tdIHF1YWxpZmllcnMgPSBuZXcgU3RyaW5nW3RvIC0gZnJvbV07Ci0JCWZvciAoaW50IGkgPSBmcm9tOyBpIDwgdG87IGkrKykgewotCQkJLy8gWFhYOiAxRzY1TERHOiBKRlVJRjpXSU4yMDAwIC0gSUxhYmVsUHJvdmlkZXIgdXNlZCBvdXRzaWRlIGEgdmlld2VyCi0JCQlxdWFsaWZpZXJzW2kgLSBmcm9tXSA9IGZRdWFsaWZpZXJSZW5kZXJlci5nZXRUZXh0KGZFbGVtZW50c1tpXSk7Ci0JCQlmUXVhbGlmaWVyTWFwW2kgLSBmcm9tXSA9IG5ldyBJbnRlZ2VyKGkpOwotCQl9Ci0KLQkJbmV3IFR3b0FycmF5UXVpY2tTb3J0ZXIoZklnbm9yZUNhc2UpLnNvcnQocXVhbGlmaWVycywgZlF1YWxpZmllck1hcCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0byAtIGZyb207IGkrKykgewotCQkJVGFibGVJdGVtIHRpID0gbmV3IFRhYmxlSXRlbShmTG93ZXJMaXN0LCBpKTsKLQkJCXRpLnNldFRleHQocXVhbGlmaWVyc1tpXSk7Ci0JCQkvLyBYWFg6IDFHNjVMREc6IEpGVUlGOldJTjIwMDAgLSBJTGFiZWxQcm92aWRlciB1c2VkIG91dHNpZGUgYSB2aWV3ZXIKLQkJCUltYWdlIGltZyA9IGZRdWFsaWZpZXJSZW5kZXJlci5nZXRJbWFnZShmRWxlbWVudHNbZnJvbSArIGldKTsKLQkJCWlmIChpbWcgIT0gbnVsbCkKLQkJCQl0aS5zZXRJbWFnZShpbWcpOwotCQl9Ci0KLQkJaWYgKGZMb3dlckxpc3QuZ2V0SXRlbUNvdW50KCkgPiAwKQotCQkJZkxvd2VyTGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JCXVwZGF0ZU9rU3RhdGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU9rU3RhdGUoKSB7Ci0JCUJ1dHRvbiBva0J1dHRvbiA9IGdldE9rQnV0dG9uKCk7Ci0JCWlmIChva0J1dHRvbiAhPSBudWxsKQotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChnZXRXaWRnZXRTZWxlY3Rpb24oKSAhPSBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVVwcGVyTGlzdFdpZGdldChpbnRbXSBpbmRpY2VzLCBpbnQgc2l6ZSkgewotCQlmVXBwZXJMaXN0LnNldFJlZHJhdyhmYWxzZSk7Ci0JCWludCBpdGVtQ291bnQgPSBmVXBwZXJMaXN0LmdldEl0ZW1Db3VudCgpOwotCQlpZiAoc2l6ZSA8IGl0ZW1Db3VudCkKLQkJCWZVcHBlckxpc3QucmVtb3ZlKDAsIGl0ZW1Db3VudCAtIHNpemUgLSAxKTsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSBmVXBwZXJMaXN0LmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBudWxsOwotCQkJaWYgKGkgPCBpdGVtQ291bnQpCi0JCQkJdGkgPSBpdGVtc1tpXTsKLQkJCWVsc2UKLQkJCQl0aSA9IG5ldyBUYWJsZUl0ZW0oZlVwcGVyTGlzdCwgaSk7Ci0JCQl0aS5zZXRUZXh0KGZSZW5kZXJlZFN0cmluZ3NbaW5kaWNlc1tpXV0pOwotCQkJLy8gWFhYOiAxRzY1TERHOiBKRlVJRjpXSU4yMDAwIC0gSUxhYmVsUHJvdmlkZXIgdXNlZCBvdXRzaWRlIGEgdmlld2VyCi0JCQlJbWFnZSBpbWcgPSBmRWxlbWVudFJlbmRlcmVyLmdldEltYWdlKGZFbGVtZW50c1tpbmRpY2VzW2ldXSk7Ci0JCQlpZiAoaW1nICE9IG51bGwpCi0JCQkJdGkuc2V0SW1hZ2UoaW1nKTsKLQkJfQotCQlpZiAoZlVwcGVyTGlzdC5nZXRJdGVtQ291bnQoKSA+IDApCi0JCQlmVXBwZXJMaXN0LnNldFNlbGVjdGlvbigwKTsKLQkJZlVwcGVyTGlzdC5zZXRSZWRyYXcodHJ1ZSk7Ci0JCWhhbmRsZVVwcGVyU2VsZWN0aW9uQ2hhbmdlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZW50IHdoZW4gZGVmYXVsdCBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBjb250cm9sLgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBvbiBzb21lIHBsYXRmb3JtcyBkZWZhdWx0IHNlbGVjdGlvbiBvY2N1cnMKLQkgKiBpbiBhIExpc3Qgd2hlbiB0aGUgdXNlciBkb3VibGUtY2xpY2tzIGFuIGl0ZW0gb3IgdHlwZXMKLQkgKiByZXR1cm4gaW4gYSBUZXh0LgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBlIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlZmF1bHQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nI3VwZGF0ZU9LU3RhdHVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPS1N0YXR1cygpIHsKLQkJc3VwZXIudXBkYXRlT0tTdGF0dXMoKTsKLQkJQnV0dG9uIG9rQnV0dG9uID0gZ2V0T2tCdXR0b24oKTsKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpCi0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGZMb2NhbFZhbGlkYXRvci52YWxpZGF0ZShnZXRSZXN1bHQoKSkuaXNPSygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3RmlsdGVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdGaWx0ZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YTU5YzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdGaWx0ZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU1RST1k7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fRklMVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfRklMVEVSOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5GaWx0ZXJTdXBlcnR5cGVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBOZXdGaWx0ZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlIGV4dGVuZHMKLQkJTmV3V2ViQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQotCXByb3RlY3RlZCBCdXR0b24gaW5pdEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlc3Ryb3lCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkb0ZpbHRlckJ1dHRvbjsKLQkKLQlwdWJsaWMgTmV3RmlsdGVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHBhZ2VEZXNjLCBwYWdlVGl0bGUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB3aXRoIGFsbCB0aGUgc3R1YnMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTdHVic0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVN0dWJzQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKG1ldGhvZFN0dWJzLCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlpbml0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlpbml0QnV0dG9uLnNldFRleHQoIiZpbml0Iik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChpbml0QnV0dG9uLCBJTklULCBudWxsKTsKLQotCQlkZXN0cm95QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkZXN0cm95QnV0dG9uLnNldFRleHQoImRlc3RybyZ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkZXN0cm95QnV0dG9uLCBERVNUUk9ZLCBudWxsKTsKLQotCQlkb0ZpbHRlckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZG9GaWx0ZXJCdXR0b24uc2V0VGV4dCgiZG8mRmlsdGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkb0ZpbHRlckJ1dHRvbiwgRE9fRklMVEVSLCBudWxsKTsKLQkJCi0JCWludGVyZmFjZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQotCQkvLyBpZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5LCB0aGVuIHRoZSByZW1vdmUgYnV0dG9uIGlzIGRpc2FibGVkCi0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGlmIHRoZSBzZWxlY3Rpb24gaXMgbm9uLWVtcHR5IGFuZCB0aGUgZmlsdGVyIGV4dGVuZHMgYSBjbGFzcyB3aGljaAotCQkvLyBpbXBsZW1lbnRzIGphdmF4LnNlcnZsZXQuRmlsdGVyLCB0aGVuIHRoZSByZW1vdmUgYnV0dG9uIGlzIGVuYWJsZWQKLQkJaWYgKEZpbHRlclN1cGVydHlwZXNWYWxpZGF0b3IuaXNGaWx0ZXJTdXBlcmNsYXNzKG1vZGVsKSkgewotCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0gCi0JCQotCQkvLyBpZiB0aGUgc2VsZWN0aW9uIGlzIG5vbi1lbXB0eSBhbmQgdGhlIGZpbHRlciBkb2VzIG5vdCBleHRlbmQgYSBjbGFzcwotCQkvLyB3aGljaCBpbXBsZW1lbnRzIGphdmF4LnNlcnZsZXQuRmlsdGVyLCB0aGVuIHRoZSByZW1vdmUgYnV0dG9uIGlzCi0JCS8vIGRpc2FibGVkIG9ubHkgaWYgdGhlIEZpbHRlciBpbnRlcmZhY2UgaXMgaW4gdGhlIHNlbGVjdGlvbgotCQlJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJaWYgKFFVQUxJRklFRF9GSUxURVIuZXF1YWxzKGl0ZXIubmV4dCgpKSkKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGluIGFsbCBvdGhlciBjYXNlcyB0aGUgcmVtb3ZlIGJ1dHRvbiBpcyBlbmFibGVkCi0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3RmlsdGVyQ2xhc3NXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0ZpbHRlckNsYXNzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTkwZTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3RmlsdGVyQ2xhc3NXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuVVNFX0VYSVNUSU5HX0NMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5DSE9PU0VfRklMVEVSX0NMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ORVdfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlVTRV9FWElTVElOR19GSUxURVJfQ0xBU1M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLldlYkZpbHRlcnNHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmV3RmlsdGVyQ2xhc3NXaXphcmRQYWdlIGV4dGVuZHMgTmV3V2ViQ2xhc3NXaXphcmRQYWdlIHsKLQkKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBGSUxURVJFWFRFTlNJT05TID0geyAiamF2YSIgfTsgLy8kTk9OLU5MUy0xJAotICAgIAotCXB1YmxpYyBOZXdGaWx0ZXJDbGFzc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFnZURlc2MsIFN0cmluZyBwYWdlVGl0bGUsIFN0cmluZyBtb2R1bGVUeXBlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgcGFnZURlc2MsIHBhZ2VUaXRsZSwgbW9kdWxlVHlwZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlRXhpc3RpbmdDaGVja2JveFRleHQoKSB7Ci0JCXJldHVybiBVU0VfRVhJU1RJTkdfRklMVEVSX0NMQVNTOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZUV4aXN0aW5nUHJvcGVydHkoKSB7Ci0JCXJldHVybiBVU0VfRVhJU1RJTkdfQ0xBU1M7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRFeHRlbmRlZFNlbGVjdGVkUHJvamVjdChPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBXZWJGaWx0ZXJzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSgoV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyKSBzZWxlY3Rpb24pLmdldFBhcmVudCgpOwotCQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh3ZWJBcHApOwotCQl9ZWxzZSBpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBXZWJBcHBQcm92aWRlcil7Ci0JCQlyZXR1cm4gKChXZWJBcHBQcm92aWRlcikgc2VsZWN0aW9uKS5nZXRQcm9qZWN0KCk7Ci0JCX0gaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgR3JvdXBGaWx0ZXJzSXRlbVByb3ZpZGVyKXsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCB3ZWJBcHAgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSAoKEdyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlcikgc2VsZWN0aW9uKS5nZXRKYXZhRUVPYmplY3QoKTsKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qod2ViQXBwKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KHNlbGVjdGlvbik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNsYXNzQnV0dG9uU2VsZWN0ZWQoKSB7Ci0gICAgICAgIGdldENvbnRyb2woKS5zZXRDdXJzb3IobmV3IEN1cnNvcihnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKSk7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwotICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgICAgTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbHRlckZpbGVTZWxlY3Rpb25EaWFsb2cgbXMgPSBuZXcgTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbHRlckZpbGVTZWxlY3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBORVdfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEUsCi0gICAgICAgICAgICAgICAgQ0hPT1NFX0ZJTFRFUl9DTEFTUywgCi0gICAgICAgICAgICAgICAgRklMVEVSRVhURU5TSU9OUywgCi0gICAgICAgICAgICAgICAgZmFsc2UsIAotICAgICAgICAgICAgICAgIHByb2plY3QpOwotICAgICAgICBJQ29udGFpbmVyIHJvb3QgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLSAgICAgICAgbXMuc2V0SW5wdXQocm9vdCk7Ci0gICAgICAgIG1zLm9wZW4oKTsKLSAgICAgICAgaWYgKG1zLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgIFN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSkgbXMuZ2V0Rmlyc3RSZXN1bHQoKTsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBxdWFsaWZpZWRDbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhpc3RpbmdDbGFzc1RleHQuc2V0VGV4dChxdWFsaWZpZWRDbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGdldENvbnRyb2woKS5zZXRDdXJzb3IobnVsbCk7Ci0gICAgfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdMaXN0ZW5lckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3TGlzdGVuZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNGQyNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdMaXN0ZW5lckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBOZXdMaXN0ZW5lckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UgZXh0ZW5kcyBOZXdXZWJDbGFzc09wdGlvbnNXaXphcmRQYWdlICB7Ci0JCi0JcHVibGljIE5ld0xpc3RlbmVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHBhZ2VEZXNjLCBwYWdlVGl0bGUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3TGlzdGVuZXJDbGFzc1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3TGlzdGVuZXJDbGFzc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmYzMzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0xpc3RlbmVyQ2xhc3NXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuVVNFX0VYSVNUSU5HX0NMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5VU0VfRVhJU1RJTkdfTElTVEVORVJfQ0xBU1M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwTGlzdGVuZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBOZXdMaXN0ZW5lckNsYXNzV2l6YXJkUGFnZSBleHRlbmRzIE5ld1dlYkNsYXNzV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgTmV3TGlzdGVuZXJDbGFzc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFnZURlc2MsIFN0cmluZyBwYWdlVGl0bGUsIFN0cmluZyBtb2R1bGVUeXBlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgcGFnZURlc2MsIHBhZ2VUaXRsZSwgbW9kdWxlVHlwZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlRXhpc3RpbmdDaGVja2JveFRleHQoKSB7Ci0JCXJldHVybiBVU0VfRVhJU1RJTkdfTElTVEVORVJfQ0xBU1M7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlRXhpc3RpbmdQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIFVTRV9FWElTVElOR19DTEFTUzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQkKLQkJZXhpc3RpbmdCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0RXh0ZW5kZWRTZWxlY3RlZFByb2plY3QoT2JqZWN0IHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApKChXZWJMaXN0ZW5lckdyb3VwSXRlbVByb3ZpZGVyKSBzZWxlY3Rpb24pLmdldFBhcmVudCgpOwotCQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh3ZWJBcHApOwotCQl9ZWxzZSBpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBXZWJBcHBQcm92aWRlcil7Ci0JCQlyZXR1cm4gKChXZWJBcHBQcm92aWRlcikgc2VsZWN0aW9uKS5nZXRQcm9qZWN0KCk7Ci0JCX0gZWxzZSBpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBHcm91cExpc3RlbmVySXRlbVByb3ZpZGVyKXsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCB3ZWJBcHAgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSAoKEdyb3VwTGlzdGVuZXJJdGVtUHJvdmlkZXIpIHNlbGVjdGlvbikuZ2V0SmF2YUVFT2JqZWN0KCk7Ci0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHdlYkFwcCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRFeHRlbmRlZFNlbGVjdGVkUHJvamVjdChzZWxlY3Rpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDbGFzc0J1dHRvblNlbGVjdGVkKCkgewotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3U2VydmxldENsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3U2VydmxldENsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3MjIzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZsZXRDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gYnVnIDE0MjUwMAotICogICAgIEtpcmlsIE1pdG92LCBrLm1pdG92QHNhcC5jb20JLSBidWcgMjA0MTYwCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5TZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2bGV0Q2xhc3NPcHRpb25zV2l6YXJkUGFnZSBleHRlbmRzCi0JCU5ld1dlYkNsYXNzT3B0aW9uc1dpemFyZFBhZ2UgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGluaXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXN0cm95QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZ2V0Q29uZmlnQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZ2V0SW5mb0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHNlcnZpY2VCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkb0dldEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvUG9zdEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvUHV0QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZG9EZWxldGVCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkb0hlYWRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkb09wdGlvbnNCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkb1RyYWNlQnV0dG9uOwotCQotCXB1YmxpYyBOZXdTZXJ2bGV0Q2xhc3NPcHRpb25zV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHBhZ2VEZXNjLCBwYWdlVGl0bGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKLQkJc3VwZXIuZW50ZXIoKTsKLQkJCi0JCWJvb2xlYW4gaHR0cFNlcnZsZXQgPSBTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0h0dHBTZXJ2bGV0U3VwZXJjbGFzcyhtb2RlbCk7Ci0JCWRvR2V0QnV0dG9uLnNldFZpc2libGUoaHR0cFNlcnZsZXQpOwotCQlkb1Bvc3RCdXR0b24uc2V0VmlzaWJsZShodHRwU2VydmxldCk7Ci0JCWRvUHV0QnV0dG9uLnNldFZpc2libGUoaHR0cFNlcnZsZXQpOwotCQlkb0RlbGV0ZUJ1dHRvbi5zZXRWaXNpYmxlKGh0dHBTZXJ2bGV0KTsKLQkJZG9IZWFkQnV0dG9uLnNldFZpc2libGUoaHR0cFNlcnZsZXQpOwotCQlkb09wdGlvbnNCdXR0b24uc2V0VmlzaWJsZShodHRwU2VydmxldCk7Ci0JCWRvVHJhY2VCdXR0b24uc2V0VmlzaWJsZShodHRwU2VydmxldCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgY29tcG9zaXRlIHdpdGggYWxsIHRoZSBzdHVicwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVN0dWJzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlU3R1YnNDb21wb3NpdGUocGFyZW50KTsKLQkJCi0JCWluaGVyaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gZW5hYmxlID0gaW5oZXJpdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCQllbmFibGVHZW5lcmljU2VydmxldEJ1dHRvbnMoZW5hYmxlKTsKLQkJCQllbmFibGVIdHRwU2VydmxldEJ1dHRvbnMoZW5hYmxlKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJCQotCQkJcHJpdmF0ZSB2b2lkIGVuYWJsZUdlbmVyaWNTZXJ2bGV0QnV0dG9ucyhib29sZWFuIGVuYWJsZSkgewotCQkJCWlmIChTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0dlbmVyaWNTZXJ2bGV0U3VwZXJjbGFzcyhtb2RlbCkpIHsKLQkJCQkJaW5pdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJCWRlc3Ryb3lCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCQlnZXRDb25maWdCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCQlnZXRJbmZvQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQkJc2VydmljZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlwcml2YXRlIHZvaWQgZW5hYmxlSHR0cFNlcnZsZXRCdXR0b25zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCQkJZG9HZXRCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWRvUG9zdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJZG9QdXRCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWRvRGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQlkb0hlYWRCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWRvT3B0aW9uc0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJZG9UcmFjZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKG1ldGhvZFN0dWJzLCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlpbml0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlpbml0QnV0dG9uLnNldFRleHQoIiZpbml0Iik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChpbml0QnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTklULCBudWxsKTsKLQotCQlkZXN0cm95QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkZXN0cm95QnV0dG9uLnNldFRleHQoImRlc3RybyZ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkZXN0cm95QnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ERVNUUk9ZLCBudWxsKTsKLQotCQlnZXRDb25maWdCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWdldENvbmZpZ0J1dHRvbi5zZXRUZXh0KCJnZXRTZXJ2bGV0JkNvbmZpZyIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZ2V0Q29uZmlnQnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5HRVRfU0VSVkxFVF9DT05GSUcsIG51bGwpOwotCi0JCWdldEluZm9CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWdldEluZm9CdXR0b24uc2V0VGV4dCgiZ2V0U2VydmxldEkmbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChnZXRJbmZvQnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5HRVRfU0VSVkxFVF9JTkZPLCBudWxsKTsKLQkJCi0JCXNlcnZpY2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCXNlcnZpY2VCdXR0b24uc2V0VGV4dCgiJnNlcnZpY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KHNlcnZpY2VCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNFUlZJQ0UsIG51bGwpOwotCQkKLQkJZG9HZXRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWRvR2V0QnV0dG9uLnNldFRleHQoImRvJkdldCIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZG9HZXRCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX0dFVCwgbnVsbCk7Ci0KLQkJZG9Qb3N0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkb1Bvc3RCdXR0b24uc2V0VGV4dCgiZG8mUG9zdCIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZG9Qb3N0QnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19QT1NULCBudWxsKTsKLQotCQlkb1B1dEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZG9QdXRCdXR0b24uc2V0VGV4dCgiZG9QJnV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkb1B1dEJ1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fUFVULCBudWxsKTsKLQotCQlkb0RlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZG9EZWxldGVCdXR0b24uc2V0VGV4dCgiZG8mRGVsZXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkb0RlbGV0ZUJ1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fREVMRVRFLCBudWxsKTsKLQotCQlkb0hlYWRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWRvSGVhZEJ1dHRvbi5zZXRUZXh0KCJkbyZIZWFkIik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkb0hlYWRCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX0hFQUQsIG51bGwpOwotCi0JCWRvT3B0aW9uc0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZG9PcHRpb25zQnV0dG9uLnNldFRleHQoImRvJk9wdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRvT3B0aW9uc0J1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fT1BUSU9OUywgbnVsbCk7Ci0KLQkJZG9UcmFjZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZG9UcmFjZUJ1dHRvbi5zZXRUZXh0KCJkbyZUcmFjZSIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZG9UcmFjZUJ1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fVFJBQ0UsIG51bGwpOwotCQkKLQkJaW50ZXJmYWNlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCi0JICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChjYW5SZW1vdmVTZWxlY3RlZEludGVyZmFjZXMoc2VsZWN0aW9uKSk7Ci0JfQotCQotCXByb3RlY3RlZCBLZXlMaXN0ZW5lciBnZXRJbnRlcmZhY2VLZXlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBLZXlMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5rZXlDb2RlID09IFNXVC5ERUwpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBpbnRlcmZhY2VWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChjYW5SZW1vdmVTZWxlY3RlZEludGVyZmFjZXMoc2VsZWN0aW9uKSkgewotCQkJCQkJaGFuZGxlSW50ZXJmYWNlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVtb3ZlU2VsZWN0ZWRJbnRlcmZhY2VzKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBpZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5LCB0aGVuIHJlbW92ZSBpcyBub3QgcG9zc2libGUKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gaWYgdGhlIHNlbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIHRoZSBzZXJ2bGV0IGV4dGVuZHMgR2VuZXJpY1NlcnZsZXQsIHRoZW4KLQkJLy8gcmVtb3ZlIGlzIHBvc3NpYmxlIAotCQlpZiAoU2VydmxldFN1cGVydHlwZXNWYWxpZGF0b3IuaXNHZW5lcmljU2VydmxldFN1cGVyY2xhc3MobW9kZWwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSAKLQkJCi0JCS8vIGlmIHRoZSBzZWxlY3Rpb24gaXMgbm9uLWVtcHR5IGFuZCB0aGUgc2VydmxldCBkb2VzIG5vdCBleHRlbmQgR2VuZXJpY1NlcnZsZXQsIAotCQkvLyB0aGVuIHJlbW92ZSBpcyBub3QgcG9zc2libGUgb25seSBpZiB0aGUgU2VydmxldCBpbnRlcmZhY2UgaXMgaW4gdGhlIHNlbGVjdGlvbgotCQlJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJaWYgKFFVQUxJRklFRF9TRVJWTEVULmVxdWFscyhpdGVyLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbiBhbGwgb3RoZXIgY2FzZXMgcmVtb3ZlIGlzIHBvc3NpYmxlCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3U2VydmxldENsYXNzV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2bGV0Q2xhc3NXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYjdmNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2bGV0Q2xhc3NXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklTX1NFUlZMRVRfVFlQRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5VU0VfRVhJU1RJTkdfQ0xBU1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkNIT09TRV9TRVJWTEVUX0NMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ORVdfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5VU0VfRVhJU1RJTkdfU0VSVkxFVF9DTEFTUzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLldlYlNlcnZsZXRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwU2VydmxldEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmV3U2VydmxldENsYXNzV2l6YXJkUGFnZSBleHRlbmRzIE5ld1dlYkNsYXNzV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBKU1BFWFRFTlNJT05TID0geyAianNwIiB9OyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIE5ld1NlcnZsZXRDbGFzc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFnZURlc2MsIFN0cmluZyBwYWdlVGl0bGUsIFN0cmluZyBtb2R1bGVUeXBlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgcGFnZURlc2MsIHBhZ2VUaXRsZSwgbW9kdWxlVHlwZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlRXhpc3RpbmdDaGVja2JveFRleHQoKSB7Ci0JCXJldHVybiBVU0VfRVhJU1RJTkdfU0VSVkxFVF9DTEFTUzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VFeGlzdGluZ1Byb3BlcnR5KCkgewotCQlyZXR1cm4gVVNFX0VYSVNUSU5HX0NMQVNTOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRFeHRlbmRlZFNlbGVjdGVkUHJvamVjdChPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBXZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSAoKFdlYlNlcnZsZXRHcm91cEl0ZW1Qcm92aWRlcikgc2VsZWN0aW9uKS5nZXRQYXJlbnQoKTsKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qod2ViQXBwKTsKLQkJfSBlbHNlIGlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFdlYkFwcFByb3ZpZGVyKXsKLQkJCXJldHVybiAoKFdlYkFwcFByb3ZpZGVyKSBzZWxlY3Rpb24pLmdldFByb2plY3QoKTsKLQkJfSBlbHNlIGlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEdyb3VwU2VydmxldEl0ZW1Qcm92aWRlcil7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgKChHcm91cFNlcnZsZXRJdGVtUHJvdmlkZXIpIHNlbGVjdGlvbikuZ2V0SmF2YUVFT2JqZWN0KCk7Ci0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHdlYkFwcCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRFeHRlbmRlZFNlbGVjdGVkUHJvamVjdChzZWxlY3Rpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDbGFzc0J1dHRvblNlbGVjdGVkKCkgewotCQlnZXRDb250cm9sKCkuc2V0Q3Vyc29yKG5ldyBDdXJzb3IoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfV0FJVCkpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCU11bHRpU2VsZWN0RmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nIG1zID0gbmV3IE11bHRpU2VsZWN0RmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nKAotCQkJCWdldFNoZWxsKCksCi0JCQkJTkVXX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRSwKLQkJCQlDSE9PU0VfU0VSVkxFVF9DTEFTUywgCi0JCQkJSlNQRVhURU5TSU9OUywgCi0JCQkJZmFsc2UsIAotCQkJCXByb2plY3QpOwotCQlJQ29udGFpbmVyIHJvb3QgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQkJbXMuc2V0SW5wdXQocm9vdCk7Ci0JCW1zLm9wZW4oKTsKLQkJaWYgKG1zLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCVN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG1zLmdldFNlbGVjdGVkSXRlbSgpID09IE11bHRpU2VsZWN0RmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nLkpTUCkgewotCQkJCU9iamVjdCBvYmogPSBtcy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIG9iajsKLQkJCQkJCUlQYXRoIHBGdWxsID0gZmlsZS5nZXRGdWxsUGF0aCgpOwotCQkJCQkJSVBhdGggcEJhc2UgPSByb290LmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQlJUGF0aCBwYXRoID0gcEZ1bGwucmVtb3ZlRmlyc3RTZWdtZW50cyhwQmFzZS5zZWdtZW50Q291bnQoKSk7Ci0JCQkJCQlxdWFsaWZpZWRDbGFzc05hbWUgPSBwYXRoLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJU19TRVJWTEVUX1RZUEUsIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IAotCQkJZWxzZSB7Ci0JCQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgbXMuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCXF1YWxpZmllZENsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJCW1vZGVsLnNldFByb3BlcnR5KElTX1NFUlZMRVRfVFlQRSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCX0KLQkJCX0KLQkJCWV4aXN0aW5nQ2xhc3NUZXh0LnNldFRleHQocXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQkJfQotCQlnZXRDb250cm9sKCkuc2V0Q3Vyc29yKG51bGwpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViQXJ0aWZhY3RXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViQXJ0aWZhY3RXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxODQ2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYkFydGlmYWN0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU19OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5PUEVOX0lOX0VESVRPUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUVVBTElGSUVEX0NMQVNTX05BTUU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVFZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5TZXJ2bGV0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3V2ViQXJ0aWZhY3RXaXphcmQgZXh0ZW5kcyBOZXdXZWJXaXphcmQgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfT05FID0gInBhZ2VPbmUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9UV08gPSAicGFnZVR3byI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1RIUkVFID0gInBhZ2VUaHJlZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBOZXdXZWJBcnRpZmFjdFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJc2V0V2luZG93VGl0bGUoZ2V0VGl0bGUoKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGdldEltYWdlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJ1bkZvcmtlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiBnZXREYXRhTW9kZWwoKS5pc1ZhbGlkKCk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VGl0bGUoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlKCk7Ci0JCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZUZyb21KMkVFUGx1Z2luKFN0cmluZyBrZXkpIHsKLQkJVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKGtleSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG9wZW5KYXZhQ2xhc3MoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoUVVBTElGSUVEX0NMQVNTX05BTUUpOwotCQkJSVByb2plY3QgcCA9IChJUHJvamVjdCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoUFJPSkVDVCk7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKMkVFRWRpdG9yVXRpbGl0eS5nZXRKYXZhUHJvamVjdChwKTsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGphdmFQcm9qZWN0LmZpbmRUeXBlKGNsYXNzTmFtZSkuZ2V0UmVzb3VyY2UoKTsKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBjYW50T3BlbikgewotCQkJU2VydmxldFVJUGx1Z2luLmxvZyhjYW50T3Blbik7Ci0JCX0JCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIG9wZW5XZWJGaWxlKCkgewotCQl0cnkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KENMQVNTX05BTUUpOwotCQkJSVByb2plY3QgcCA9IChJUHJvamVjdCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoUFJPSkVDVCk7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwKTsKLQkJCUlDb250YWluZXIgd2ViQ29udGVudCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotCQkJSUZpbGUgZmlsZSA9IHdlYkNvbnRlbnQuZ2V0RmlsZShuZXcgUGF0aChjbGFzc05hbWUpKTsKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBjYW50T3BlbikgewotCQkJU2VydmxldFVJUGx1Z2luLmxvZyhjYW50T3Blbik7Ci0JCX0JCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChnZXREYXRhTW9kZWwoKS5nZXRCb29sZWFuUHJvcGVydHkoT1BFTl9JTl9FRElUT1IpKSB7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJCVNlcnZsZXRVSVBsdWdpbi5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYkNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1NWNjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYkNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQUJTVFJBQ1RfTUVUSE9EUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ09OU1RSVUNUT1I7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOVEVSRkFDRVM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkpBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkpBVkFfQ0xBU1NfSU5IRVJJVF9DSEVDS0JPWF9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuTmV3SmF2YUNsYXNzT3B0aW9uc1dpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIE5ld1dlYkNsYXNzT3B0aW9uc1dpemFyZFBhZ2UgZXh0ZW5kcyBOZXdKYXZhQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSAgewotCQotCXByb3RlY3RlZCBDb21wb3NpdGUgbWV0aG9kU3R1YnM7Ci0JCi0JcHVibGljIE5ld1dlYkNsYXNzT3B0aW9uc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFnZURlc2MsIFN0cmluZyBwYWdlVGl0bGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBwYWdlRGVzYywgcGFnZVRpdGxlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgSU5URVJGQUNFUyB9OwotCX0KLQkKLQlAT3ZlcnJpZGUJCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3R1YnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBzdHViTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXN0dWJMYWJlbC5zZXRUZXh0KEpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3R1YkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbWV0aG9kU3R1YnMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQltZXRob2RTdHVicy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDE1OwotCQltZXRob2RTdHVicy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNvbnN0cnVjdG9yQnV0dG9uID0gbmV3IEJ1dHRvbihtZXRob2RTdHVicywgU1dULkNIRUNLKTsKLQkJY29uc3RydWN0b3JCdXR0b24uc2V0VGV4dChKQVZBX0NMQVNTX0NPTlNUUlVDVE9SX0NIRUNLQk9YX0xBQkVMKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChjb25zdHJ1Y3RvckJ1dHRvbiwgQ09OU1RSVUNUT1IsIG51bGwpOwotCQkKLQkJaW5oZXJpdEJ1dHRvbiA9IG5ldyBCdXR0b24obWV0aG9kU3R1YnMsIFNXVC5DSEVDSyk7Ci0JCWluaGVyaXRCdXR0b24uc2V0VGV4dChKQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUwpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGluaGVyaXRCdXR0b24sIEFCU1RSQUNUX01FVEhPRFMsIG51bGwpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViQ2xhc3NXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYkNsYXNzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTdlZjk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViQ2xhc3NXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkJST1dTRV9CVVRUT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkNMQVNTX05BTUVfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5OZXdKYXZhQ2xhc3NXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLkNvbXByZXNzZWRKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3V2ViQ2xhc3NXaXphcmRQYWdlIGV4dGVuZHMgTmV3SmF2YUNsYXNzV2l6YXJkUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAgYW5ub3RhdGlvbnNHcm91cDsKLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGV4aXN0aW5nQ2xhc3NCdXR0b247Ci0JcHJvdGVjdGVkIExhYmVsIGV4aXN0aW5nQ2xhc3NMYWJlbDsKLQlwcm90ZWN0ZWQgVGV4dCBleGlzdGluZ0NsYXNzVGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGV4aXN0aW5nQnV0dG9uOwotCQotCXB1YmxpYyBOZXdXZWJDbGFzc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgcGFnZURlc2MsIFN0cmluZyBwYWdlVGl0bGUsIFN0cmluZyBtb2R1bGVUeXBlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgcGFnZURlc2MsIHBhZ2VUaXRsZSwgbW9kdWxlVHlwZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQkJCi0JCXByb2plY3ROYW1lTGFiZWwuc2V0VGV4dChXRUJVSU1lc3NhZ2VzLldFQl9QUk9KRUNUX0xCTCk7Ci0JCQotCQlhZGRTZXBlcmF0b3IoY29tcG9zaXRlLCAzKTsKLQkJY3JlYXRlVXNlRXhpc3RpbmdHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVBbm5vdGF0aW9uc0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0RXh0ZW5kZWRTZWxlY3RlZFByb2plY3QoT2JqZWN0IHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgQ29tcHJlc3NlZEphdmFQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKChDb21wcmVzc2VkSmF2YVByb2plY3QpIHNlbGVjdGlvbikuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KHNlbGVjdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VXNlRXhpc3RpbmdDaGVja2JveFRleHQoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFVzZUV4aXN0aW5nUHJvcGVydHkoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVDbGFzc0J1dHRvblNlbGVjdGVkKCk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFubm90YXRpb25zIGdyb3VwIGFuZCBzZXQgZGVmYXVsdCBlbmFibGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25zR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoaXNXZWJEb2NsZXRQcm9qZWN0KCkpIHsKLQkJCWFubm90YXRpb25zR3JvdXAgPSBuZXcgQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAocGFyZW50LCBtb2RlbCwgSjJFRVByb2plY3RVdGlsaXRpZXMuRUpCLmVxdWFscyhwcm9qZWN0VHlwZSksCi0JCQkJCUoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCLmVxdWFscyhwcm9qZWN0VHlwZSkpOwotCQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KFBST0pFQ1RfTkFNRSkpCi0JCQkJcmV0dXJuOwotCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpKTsKLQkJCWFubm90YXRpb25zR3JvdXAuc2V0RW5hYmxlbWVudChwcm9qZWN0KTsKLQkJCS8vIGFubm90YXRpb25zR3JvdXAuc2V0VXNlQW5ub3RhdGlvbnModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3QgYSBXZWIgRG9jbGV0IHByb2plY3QgLSBtYWtlIHN1cmUgdGhhdCB0aGUgVVNFX0FOTk9UQVRJT05TIHByb3BlcnR5IGlzIG9mZgotCQkJbW9kZWwuc2V0UHJvcGVydHkoVVNFX0FOTk9UQVRJT05TLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVXNlRXhpc3RpbmdHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWV4aXN0aW5nQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWV4aXN0aW5nQnV0dG9uLnNldFRleHQoZ2V0VXNlRXhpc3RpbmdDaGVja2JveFRleHQoKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWV4aXN0aW5nQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZXhpc3RpbmdCdXR0b24sIGdldFVzZUV4aXN0aW5nUHJvcGVydHkoKSwgbnVsbCk7Ci0JCWV4aXN0aW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUV4aXN0aW5nQnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlleGlzdGluZ0NsYXNzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWV4aXN0aW5nQ2xhc3NMYWJlbC5zZXRUZXh0KENMQVNTX05BTUVfTEFCRUwpOwotCQlleGlzdGluZ0NsYXNzTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJZXhpc3RpbmdDbGFzc0xhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWV4aXN0aW5nQ2xhc3NUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlleGlzdGluZ0NsYXNzVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZXhpc3RpbmdDbGFzc1RleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChleGlzdGluZ0NsYXNzVGV4dCwgQ0xBU1NfTkFNRSwgbnVsbCk7Ci0KLQkJZXhpc3RpbmdDbGFzc0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWV4aXN0aW5nQ2xhc3NCdXR0b24uc2V0VGV4dChCUk9XU0VfQlVUVE9OX0xBQkVMKTsKLQkJZXhpc3RpbmdDbGFzc0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJZXhpc3RpbmdDbGFzc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZXhpc3RpbmdDbGFzc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVDbGFzc0J1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhpc3RpbmdCdXR0b25TZWxlY3RlZCgpIHsKLQkJYm9vbGVhbiBlbmFibGUgPSBleGlzdGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJZXhpc3RpbmdDbGFzc0xhYmVsLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZXhpc3RpbmdDbGFzc0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCXBhY2thZ2VUZXh0LnNldEVuYWJsZWQoIWVuYWJsZSk7Ci0JCXBhY2thZ2VCdXR0b24uc2V0RW5hYmxlZCghZW5hYmxlKTsKLQkJcGFja2FnZUxhYmVsLnNldEVuYWJsZWQoIWVuYWJsZSk7Ci0JCWNsYXNzVGV4dC5zZXRFbmFibGVkKCFlbmFibGUpOwotCQljbGFzc0xhYmVsLnNldEVuYWJsZWQoIWVuYWJsZSk7Ci0JCXN1cGVyVGV4dC5zZXRFbmFibGVkKCFlbmFibGUpOwotCQlzdXBlckJ1dHRvbi5zZXRFbmFibGVkKCFlbmFibGUpOwotCQlzdXBlckxhYmVsLnNldEVuYWJsZWQoIWVuYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzV2ViRG9jbGV0UHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJaWYocHJvamVjdE5hbWUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHByb2plY3ROYW1lLnRyaW0oKSkpewotCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQl0cnkgewotCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQlyZXR1cm4gZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KFdlYkZhY2V0VXRpbHMuV0VCX1hET0NMRVRfRkFDRVQpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU2VydmxldFVJUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcm9qZWN0UmVxdWlyZW1lbnRzKElQcm9qZWN0IHByb2plY3QpCi0JewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYoY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKSAhPSBudWxsCi0JCQkJJiYgY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCkgIT0gbnVsbCl7Ci0JCQlJRmlsZSBkZFhtbEZpbGUgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKS5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSkpOwotCQkJaWYgKCFkZFhtbEZpbGUuZXhpc3RzKCkpCi0JCQl7Ci0JCQkJLy8gYWRkIGEgZmxhZyBpbnRvIHRoZSBtb2RlbCB0byBjcmVhdGUgdGhlIEREIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wZXJhdGlvbgotCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShHRU5FUkFURV9ERCwgQm9vbGVhbi5UUlVFKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBkb24ndCBjcmVhdGUgYSBERCwgc2luY2Ugb25lIGFscmVhZHkgZXhpc3RzLgotCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShHRU5FUkFURV9ERCwgQm9vbGVhbi5GQUxTRSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNmZiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZsZXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdXZWJXaXphcmQgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqLwotCXB1YmxpYyBOZXdXZWJXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBOZXdXZWJXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWdldERhdGFNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFNlcnZsZXRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJcmV0dXJuIChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU2VydmxldERhdGFNb2RlbFN5bmNIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU2VydmxldERhdGFNb2RlbFN5bmNIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhMDc3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1NlcnZsZXREYXRhTW9kZWxTeW5jSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLQotcHVibGljIGNsYXNzIFNlcnZsZXREYXRhTW9kZWxTeW5jSGVscGVyIGV4dGVuZHMgRGF0YU1vZGVsU3luY2hIZWxwZXIgewotCXByb3RlY3RlZCBNYXAgd2lkZ2V0VG9WYWx1ZUhhc2g7Ci0JcHJvdGVjdGVkIE11bHRpcGxlQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciBtdWx0aXBsZUNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQlwdWJsaWMgU2VydmxldERhdGFNb2RlbFN5bmNIZWxwZXIoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIFVJIHRvIGhhdmUgdGhlIHByb3BlcnR5IHZhbHVlIGRlZmluZWQgaW4gdGhlIG1vZGVsCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBsaW5rIElEYXRhTW9kZWxMaXN0ZW5lciBmb3IgdGhlIGZsYWcgdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNoVUlXaXRoTW9kZWwoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgaW50IGZsYWcpIHsKLQkJaWYgKG51bGwgIT0gcHJvcGVydHlUb1dpZGdldEhhc2ggJiYgcHJvcGVydHlUb1dpZGdldEhhc2guY29udGFpbnNLZXkocHJvcGVydHlOYW1lKSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9iamVjdCBvYmogPSBwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5nZXQocHJvcGVydHlOYW1lKTsKLQkJCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCQkJCUxpc3Qgd2lkZ2V0cyA9IChMaXN0KSBvYmo7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2lkZ2V0cy5zaXplKCk7IGkrKykgewotCQkJCQkJCQkJY3VycmVudFdpZGdldCA9IChXaWRnZXQpIHdpZGdldHMuZ2V0KGkpOwotCQkJCQkJCQkJc3luY2hVSVdpdGhNb2RlbChwcm9wZXJ0eU5hbWUsIGZsYWcsIGN1cnJlbnRXaWRnZXQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY3VycmVudFdpZGdldCA9IChXaWRnZXQpIG9iajsKLQkJCQkJCQkJc3luY2hVSVdpdGhNb2RlbChwcm9wZXJ0eU5hbWUsIGZsYWcsIGN1cnJlbnRXaWRnZXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWN1cnJlbnRXaWRnZXQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hVSVdpdGhNb2RlbChmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBpbnQgZmxhZywgV2lkZ2V0IGN1cnJlbnRXaWRnZXQpIHsKLQkJaWYgKGN1cnJlbnRXaWRnZXQgIT0gbnVsbCAmJiBjdXJyZW50V2lkZ2V0ICE9IGN1cnJlbnRXaWRnZXRGcm9tRXZlbnQpIHsKLQkJCS8vV2UgbXVzdCBob2xkIGEgY29weSBpbiBhIHRlbXAgdmFyaWFibGUgYmVjYXVzZSBzZXR0aW5nIHRoZSB3aWRnZXQgdmFsdWUKLQkJCS8vbWF5IHRyaWdnZXIgYW4gZXZlbnQgdGhhdCB3aWxsIGNhdXNlIHRoaXMgbWV0aG9kIHRvIGJlIGNhbGxlZCBhZ2Fpbi4KLQkJCVdpZGdldCB3aWRnZXQgPSBjdXJyZW50V2lkZ2V0OwotCQkJdHJ5IHsKLQkJCQlpZ25vcmVNb2RpZnlFdmVudCA9IHRydWU7Ci0JCQkJaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBUZXh0KQotCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChUZXh0KSBjdXJyZW50V2lkZ2V0KTsKLQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoQ29tYm8pIGN1cnJlbnRXaWRnZXQpOwotCQkJCX0gZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIEJ1dHRvbikKLQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoQnV0dG9uKSBjdXJyZW50V2lkZ2V0KTsKLQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgTGFiZWwpCi0JCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKExhYmVsKSBjdXJyZW50V2lkZ2V0KTsKLQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCkgY3VycmVudFdpZGdldCk7Ci0JCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIFRhYmxlKQotCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChUYWJsZSkgY3VycmVudFdpZGdldCk7Ci0JCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIFRyZWUpCi0JCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKFRyZWUpIGN1cnJlbnRXaWRnZXQpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZ25vcmVNb2RpZnlFdmVudCA9IGZhbHNlOwotCQkJfQotCQkJLy9QYXNzIHRoZSBjb3B5IG9mIHRoZSBjdXJyZW50V2lkZ2V0Ci0JCQlzZXRFbmFibGVtZW50KChDb250cm9sKSB3aWRnZXQsIGRhdGFNb2RlbC5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgQnV0dG9uIGJ1dHRvbikgewotCQlpZiAoKGJ1dHRvbi5nZXRTdHlsZSgpICYgU1dULkNIRUNLKSA9PSBTV1QuQ0hFQ0spIHsKLQkJCU9iamVjdCBwcm9wZXJ0eVZhbHVlID0gZGF0YU1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIGphdmEudXRpbC5MaXN0KSB7Ci0JCQkJTGlzdCB2YWx1ZSA9IChMaXN0KSBwcm9wZXJ0eVZhbHVlOwotCQkJCU9iamVjdCBidXR0b25WYWx1ZSA9IHdpZGdldFRvVmFsdWVIYXNoLmdldChidXR0b24pOwotCQkJCWJvb2xlYW4gZXhpc3RzID0gdmFsdWUuY29udGFpbnMoYnV0dG9uVmFsdWUpOwotCQkJCWlmIChidXR0b24uZ2V0U2VsZWN0aW9uKCkgIT0gZXhpc3RzKSB7Ci0JCQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24oZXhpc3RzKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgTXVsdGlwbGVDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChjdXJyZW50V2lkZ2V0ID09IGJ1dHRvbikKLQkJCQlyZXR1cm47Ci0JCQl0cnkgewotCQkJCWN1cnJlbnRXaWRnZXRGcm9tRXZlbnQgPSBidXR0b247Ci0JCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIHdpZGdldFRvUHJvcGVydHlIYXNoLmdldChidXR0b24pOwotCQkJCU9iamVjdCBwcm9wZXJ0eVZhbHVlID0gd2lkZ2V0VG9WYWx1ZUhhc2guZ2V0KGJ1dHRvbik7Ci0JCQkJCi0JCQkJT2JqZWN0IGNvbnRlbnRzID0gZGF0YU1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQkJCi0JCQkJaWYgKGNvbnRlbnRzID09IG51bGwpIHsKLQkJCQkJY29udGVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJfQotCQkJCWlmIChjb250ZW50cyBpbnN0YW5jZW9mIGphdmEudXRpbC5MaXN0KSB7Ci0JCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBjb250ZW50czsKLQkJCQkJaWYgKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKHByb3BlcnR5VmFsdWUpKSAKLQkJCQkJCQlsaXN0LmFkZChwcm9wZXJ0eVZhbHVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxpc3QucmVtb3ZlKHByb3BlcnR5VmFsdWUpOwotCQkJCQl9Ci0JCQkJCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbGlzdCk7Ci0JCQkJCWRhdGFNb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQljdXJyZW50V2lkZ2V0RnJvbUV2ZW50ID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hDaGVja2JveChCdXR0b24gY2hlY2tib3gsIFN0cmluZyB0ZXh0VmFsdWUsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzZXRDb21wb3NpdGVWYWx1ZShjaGVja2JveCwgdGV4dFZhbHVlKTsKLQkJc3luY2hDb21wb3NpdGUoY2hlY2tib3gsIHByb3BlcnR5TmFtZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCQlpZiAobXVsdGlwbGVDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwpIHsKLQkJCW11bHRpcGxlQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBNdWx0aXBsZUNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJfQotCQljaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihtdWx0aXBsZUNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb21wb3NpdGVWYWx1ZShXaWRnZXQgd2lkZ2V0LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHdpZGdldFRvVmFsdWVIYXNoID09IG51bGwpCi0JCQl3aWRnZXRUb1ZhbHVlSGFzaCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdpZGdldFRvVmFsdWVIYXNoLnB1dCh3aWRnZXQsIHZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hDb21wb3NpdGUoV2lkZ2V0IHdpZGdldCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcENvbnRyb2xzKSB7Ci0JCWlmIChudWxsID09IHdpZGdldFRvUHJvcGVydHlIYXNoKQotCQkJd2lkZ2V0VG9Qcm9wZXJ0eUhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAocHJvcGVydHlUb1dpZGdldEhhc2ggPT0gbnVsbCkKLQkJCXByb3BlcnR5VG9XaWRnZXRIYXNoID0gbmV3IEhhc2hNYXAoKTsKLQkJd2lkZ2V0VG9Qcm9wZXJ0eUhhc2gucHV0KHdpZGdldCwgcHJvcGVydHlOYW1lKTsKLQkJT2JqZWN0IHZhbHVlID0gcHJvcGVydHlUb1dpZGdldEhhc2guZ2V0KHByb3BlcnR5TmFtZSk7Ci0JCUxpc3Qgd2lkZ2V0czsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpKSB7Ci0JCQl3aWRnZXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJd2lkZ2V0cyA9IChMaXN0KSB2YWx1ZTsKLQkJfQotCQl3aWRnZXRzLmFkZCh3aWRnZXQpOwotCQlwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5wdXQocHJvcGVydHlOYW1lLCB3aWRnZXRzKTsKLQkJCi0JCWlmIChkZXBDb250cm9scyAhPSBudWxsKSB7Ci0JCQlpZiAod2lkZ2V0VG9EZXBDb250cm9scyA9PSBudWxsKQotCQkJCXdpZGdldFRvRGVwQ29udHJvbHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJd2lkZ2V0VG9EZXBDb250cm9scy5wdXQod2lkZ2V0LCBkZXBDb250cm9scyk7Ci0JCX0KLQkJc3luY2hVSVdpdGhNb2RlbChwcm9wZXJ0eU5hbWUsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TaW1wbGVUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU2ltcGxlVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNWNjYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TaW1wbGVUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5TZXJ2bGV0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIGEgPGNvZGU+SVNlbGVjdGlvblZhbGlkYXRvcjwvY29kZT4gdG8gdmFsaWRhdGUgdGhlIHR5cGUKLSAqIG9mIGFuIGVsZW1lbnQuIEVtcHR5IHNlbGVjdGlvbnMgYXJlIG5vdCBhY2NlcHRlZC4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvciBpbXBsZW1lbnRzIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBJU3RhdHVzIGZnRXJyb3JTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZsZXRVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVN0YXR1cyBmZ09LU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBTZXJ2bGV0VUlQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ2xhc3NbXSBmQWNjZXB0ZWRUeXBlczsKLQlwcml2YXRlIGJvb2xlYW4gZkFsbG93TXVsdGlwbGVTZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWNjZXB0ZWRUeXBlcwotCSAqICAgICAgICAgICAgVGhlIHR5cGVzIGFjY2VwdGVkIGJ5IHRoZSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gYWxsb3dNdWx0aXBsZVNlbGVjdGlvbgotCSAqICAgICAgICAgICAgSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgdmFsaWRhdG9yIGFsbG93cwotCSAqICAgICAgICAgICAgbXVsdGlwbGUgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IoQ2xhc3NbXSBhY2NlcHRlZFR5cGVzLCBib29sZWFuIGFsbG93TXVsdGlwbGVTZWxlY3Rpb24pIHsKLQkJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydC5pc05vdE51bGwoYWNjZXB0ZWRUeXBlcyk7Ci0JCWZBY2NlcHRlZFR5cGVzID0gYWNjZXB0ZWRUeXBlczsKLQkJZkFsbG93TXVsdGlwbGVTZWxlY3Rpb24gPSBhbGxvd011bHRpcGxlU2VsZWN0aW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25WYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCWlmIChpc1ZhbGlkKGVsZW1lbnRzKSkgewotCQkJcmV0dXJuIGZnT0tTdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIGZnRXJyb3JTdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzT2ZBY2NlcHRlZFR5cGUoT2JqZWN0IG8pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQWNjZXB0ZWRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZBY2NlcHRlZFR5cGVzW2ldLmlzSW5zdGFuY2UobykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghZkFsbG93TXVsdGlwbGVTZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmxlbmd0aCAhPSAxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IG8gPSBzZWxlY3Rpb25baV07Ci0JCQlpZiAoIWlzT2ZBY2NlcHRlZFR5cGUobykpICB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb25DYWxsYmFjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbkNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWY2YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbkNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5TdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbi5TdHJpbmdBcnJheURpYWxvZ0NhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPlN0cmluZ0FycmF5RGlhbG9nQ2FsbGJhY2s8L2NvZGU+IGludGVyZmFjZSBmb3IgCi0gKiBib3RoICJJbml0aWFsaXphdGlvbiBQYXJhbWV0ZXJzIiBhbmQgIlVSTCBNYXBwaW5ncyIgdGFibGUgdmlld3MuIAotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb25DYWxsYmFjayBpbXBsZW1lbnRzCi0JCVN0cmluZ0FycmF5RGlhbG9nQ2FsbGJhY2sgewotCi0JLyoqCi0JICogVGhlIGZpcnN0IHRleHQgZmllbGQgc2hvdWxkIG5vdCBiZSBlbXB0eS4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoVGV4dFtdIHRleHRzKSB7Ci0JCWlmICh0ZXh0cy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gdGV4dHNbMF0uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFRyaW1zIHRoZSB0ZXh0IHZhbHVlcy4gCi0JICovCi0JcHVibGljIFN0cmluZ1tdIHJldHJpZXZlUmVzdWx0U3RyaW5ncyhUZXh0W10gdGV4dHMpIHsKLQkJaW50IG4gPSB0ZXh0cy5sZW5ndGg7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSB0ZXh0c1tpXS5nZXRUZXh0KCkudHJpbSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ01hdGNoZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU3RyaW5nTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQzMDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU3RyaW5nTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICAKLSAqICAgICBOb3RlOiB0aGlzIGNsYXNzIHdhcyBjb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qc3QuaW50ZXJuYWwudWkudXRpbAotICogICAgIEl0IGhhcyBtdWNoIHJlcXVlc3RlZCBhcyBhbiBBUEkgc2luY2UgdGhlcmUgYXJlIGEgZG96ZW4gc3VjaCBjb3BpZXMgdGhyb3VnaG91dCAKLSAqICAgICBFY2xpcHNlIGFuZCByZWxhdGVkIHByb2plY3RzLiAoU3VjaCBhcywgc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjIxNCkKLSAqICAgICBUaGVzZSByZXF1ZXN0cyBoYXZlIGJlZW4gcmVqZWN0ZWQgc2luY2UsIGFsbCB1c2VycyBzaG91bGQgZXZlbnR1YWxseSBtaWdyYXRlIHRvIHVzZSBqYXZheC5yZWd4Ci0gKiAgICAgY291bnRlcnBhcnRzIGluc3RlYWQuICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBBIHN0cmluZyBwYXR0ZXJuIG1hdGNoZXIuIFN1cHBvcnRzICcqJyBhbmQgJz8nIHdpbGRjYXJkcy4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ01hdGNoZXIgewotCXByb3RlY3RlZCBTdHJpbmcgZlBhdHRlcm47Ci0JcHJvdGVjdGVkIGludCBmTGVuZ3RoOyAvLyBwYXR0ZXJuIGxlbmd0aAotCXByb3RlY3RlZCBib29sZWFuIGZJZ25vcmVXaWxkQ2FyZHM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZklnbm9yZUNhc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkhhc0xlYWRpbmdTdGFyOwotCXByb3RlY3RlZCBib29sZWFuIGZIYXNUcmFpbGluZ1N0YXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBmU2VnbWVudHNbXTsgLy90aGUgZ2l2ZW4gcGF0dGVybiBpcyBzcGxpdCBpbnRvICogc2VwYXJhdGVkIHNlZ21lbnRzCi0KLQkvKiBib3VuZGFyeSB2YWx1ZSBiZXlvbmQgd2hpY2ggd2UgZG9uJ3QgbmVlZCB0byBzZWFyY2ggaW4gdGhlIHRleHQgKi8KLQlwcm90ZWN0ZWQgaW50IGZCb3VuZD0gMDsKLQkKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBmU2luZ2xlV2lsZENhcmQ9ICdcdTAwMDAnOwotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUG9zaXRpb24gewotCQlpbnQgc3RhcnQ7IC8vaW5jbHVzaXZlCi0JCWludCBlbmQ7IC8vZXhjbHVzaXZlCi0JCXB1YmxpYyBQb3NpdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCXRoaXMuc3RhcnQ9IHN0YXJ0OwotCQkJdGhpcy5lbmQ9IGVuZDsKLQkJfQotCQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQkJcmV0dXJuIHN0YXJ0OwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQkJcmV0dXJuIGVuZDsKLQkJfQotCX0KLQkvKioKLQkgKiBTdHJpbmdNYXRjaGVyIGNvbnN0cnVjdG9yIHRha2VzIGluIGEgU3RyaW5nIG9iamVjdCB0aGF0IGlzIGEgc2ltcGxlIAotCSAqIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIG1heSBjb250YWluICcqJyBmb3IgMCBhbmQgbWFueSBjaGFyYWN0ZXJzIGFuZAotCSAqICc/JyBmb3IgZXhhY3RseSBvbmUgY2hhcmFjdGVyLiAgCi0JICoKLQkgKiBMaXRlcmFsICcqJyBhbmQgJz8nIGNoYXJhY3RlcnMgbXVzdCBiZSBlc2NhcGVkIGluIHRoZSBwYXR0ZXJuIAotCSAqIGUuZy4sICJcKiIgbWVhbnMgbGl0ZXJhbCAiKiIsIGV0Yy4KLQkgKgotCSAqIEVzY2FwaW5nIGFueSBvdGhlciBjaGFyYWN0ZXIgKGluY2x1ZGluZyB0aGUgZXNjYXBlIGNoYXJhY3RlciBpdHNlbGYpLCAKLQkgKiBqdXN0IHJlc3VsdHMgaW4gdGhhdCBjaGFyYWN0ZXIgaW4gdGhlIHBhdHRlcm4uCi0JICogZS5nLiwgIlxhIiBtZWFucyAiYSIgYW5kICJcXCIgbWVhbnMgIlwiCi0JICoKLQkgKiBJZiBpbnZva2luZyB0aGUgU3RyaW5nTWF0Y2hlciB3aXRoIHN0cmluZyBsaXRlcmFscyBpbiBKYXZhLCBkb24ndCBmb3JnZXQKLQkgKiBlc2NhcGUgY2hhcmFjdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgIlxcIi4KLQkgKgotCSAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRvIG1hdGNoIHRleHQgYWdhaW5zdAotCSAqIEBwYXJhbSBpZ25vcmVDYXNlIGlmIHRydWUsIGNhc2UgaXMgaWdub3JlZAotCSAqIEBwYXJhbSBpZ25vcmVXaWxkQ2FyZHMgaWYgdHJ1ZSwgd2lsZCBjYXJkcyBhbmQgdGhlaXIgZXNjYXBlIHNlcXVlbmNlcyBhcmUgaWdub3JlZAotCSAqIAkJICAoZXZlcnl0aGluZyBpcyB0YWtlbiBsaXRlcmFsbHkpLgotCSAqLwotCXB1YmxpYyBTdHJpbmdNYXRjaGVyKFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIGlnbm9yZUNhc2UsIGJvb2xlYW4gaWdub3JlV2lsZENhcmRzKSB7Ci0JCWlmIChwYXR0ZXJuID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCWZJZ25vcmVDYXNlPSBpZ25vcmVDYXNlOwotCQlmSWdub3JlV2lsZENhcmRzPSBpZ25vcmVXaWxkQ2FyZHM7Ci0JCWZQYXR0ZXJuPSBwYXR0ZXJuOwotCQlmTGVuZ3RoPSBwYXR0ZXJuLmxlbmd0aCgpOwotCQkKLQkJaWYgKGZJZ25vcmVXaWxkQ2FyZHMpIHsKLQkJCXBhcnNlTm9XaWxkQ2FyZHMoKTsKLQkJfSBlbHNlIHsKLQkJCXBhcnNlV2lsZENhcmRzKCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgcGF0dGVybiBiZXR3ZWVuIDxjb2RlPnN0YXJ0PC9jb2RlKShpbmNsdXNpdmUpIAotCSAqIGFuZCA8Y29kZT5lbmQ8L2NvZGU+KGV4Y2x1c2l2ZSkuICAKLQkgKiBAcGFyYW0gdGV4dCB0aGUgU3RyaW5nIG9iamVjdCB0byBzZWFyY2ggaW4gCi0JICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgc2VhcmNoIHJhbmdlLCBpbmNsdXNpdmUKLQkgKiBAcGFyYW0gZW5kIHRoZSBlbmRpbmcgaW5kZXggb2YgdGhlIHNlYXJjaCByYW5nZSwgZXhjbHVzaXZlCi0JICogQHJldHVybiBhbiA8Y29kZT5TdHJpbmdNYXRjaGVyLlBvc2l0aW9uPC9jb2RlPiBvYmplY3QgdGhhdCBrZWVwcyB0aGUgc3RhcnRpbmcgCi0JICogKGluY2x1c2l2ZSkgYW5kIGVuZGluZyBwb3NpdGlvbnMgKGV4Y2x1c2l2ZSkgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIAotCSAqIHBhdHRlcm4gaW4gdGhlIHNwZWNpZmllZCByYW5nZSBvZiB0aGUgdGV4dDsgcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kIG9yIHN1YnRleHQKLQkgKiBpcyBlbXB0eSAoc3RhcnQ9PWVuZCkuIEEgcGFpciBvZiB6ZXJvcyBpcyByZXR1cm5lZCBpZiBwYXR0ZXJuIGlzIGVtcHR5IHN0cmluZwotCSAqIE5vdGUgdGhhdCBmb3IgcGF0dGVybiBsaWtlICIqYWJjKiIgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzdGFycywgcG9zaXRpb24gb2YgImFiYyIKLQkgKiBpcyByZXR1cm5lZC4gRm9yIGEgcGF0dGVybiBsaWtlIio/PyoiIGluIHRleHQgImFiY2RmIiwgKDEsMykgaXMgcmV0dXJuZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nTWF0Y2hlci5Qb3NpdGlvbiBmaW5kKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQotCQlpbnQgdGxlbj0gdGV4dC5sZW5ndGgoKTsKLQkJaWYgKHN0YXJ0IDwgMCkKLQkJCXN0YXJ0PSAwOwotCQlpZiAoZW5kID4gdGxlbikKLQkJCWVuZD0gdGxlbjsKLQkJaWYgKGVuZCA8IDAgfHxzdGFydCA+PSBlbmQgKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmTGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbmV3IFBvc2l0aW9uKHN0YXJ0LCBzdGFydCk7Ci0JCWlmIChmSWdub3JlV2lsZENhcmRzKSB7Ci0JCQlpbnQgeD0gcG9zSW4odGV4dCwgc3RhcnQsIGVuZCk7Ci0JCQlpZiAoeCA8IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gbmV3IFBvc2l0aW9uKHgsIHgrZkxlbmd0aCk7Ci0JCX0KLQotCQlpbnQgc2VnQ291bnQ9IGZTZWdtZW50cy5sZW5ndGg7Ci0JCWlmIChzZWdDb3VudCA9PSAwKS8vcGF0dGVybiBjb250YWlucyBvbmx5ICcqJyhzKQotCQkJcmV0dXJuIG5ldyBQb3NpdGlvbiAoc3RhcnQsIGVuZCk7Ci0JCQkJCQotCQlpbnQgY3VyUG9zPSBzdGFydDsKLQkJaW50IG1hdGNoU3RhcnQ9IC0xOwotCQlpbnQgaTsKLQkJZm9yIChpPSAwOyBpIDwgc2VnQ291bnQgJiYgY3VyUG9zIDwgZW5kOyArK2kpIHsKLQkJCVN0cmluZyBjdXJyZW50PSBmU2VnbWVudHNbaV07Ci0JCQlpbnQgbmV4dE1hdGNoPSByZWdFeHBQb3NJbih0ZXh0LCBjdXJQb3MsIGVuZCwgY3VycmVudCk7Ci0JCQlpZiAobmV4dE1hdGNoIDwgMCApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZihpID09IDApCi0JCQkJbWF0Y2hTdGFydD0gbmV4dE1hdGNoOwotCQkJY3VyUG9zPSBuZXh0TWF0Y2ggKyBjdXJyZW50Lmxlbmd0aCgpOwotCQl9Ci0JCWlmIChpIDwgc2VnQ291bnQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBQb3NpdGlvbihtYXRjaFN0YXJ0LCBjdXJQb3MpOwotCX0KLQkvKioKLQkgKiBtYXRjaCB0aGUgZ2l2ZW4gPGNvZGU+dGV4dDwvY29kZT4gd2l0aCB0aGUgcGF0dGVybiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgbWF0Y2hlZCBlaXRoZXJ3aXNlIGZhbHNlCi0JICogQHBhcmFtIHRleHQgYSBTdHJpbmcgb2JqZWN0IAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBtYXRjaCh0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpKTsKLQl9Ci0JLyoqCi0JICogR2l2ZW4gdGhlIHN0YXJ0aW5nIChpbmNsdXNpdmUpIGFuZCB0aGUgZW5kaW5nIChleGNsdXNpdmUpIHBvc2l0aW9ucyBpbiB0aGUgICAKLQkgKiA8Y29kZT50ZXh0PC9jb2RlPiwgZGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBzdWJzdHJpbmcgbWF0Y2hlcyB3aXRoIGFQYXR0ZXJuICAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwb3J0aW9uIG9mIHRoZSB0ZXh0IG1hdGNoZXMgdGhlIHBhdHRlcm4KLQkgKiBAcGFyYW0gdGV4dCBhIFN0cmluZyBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgc3Vic3RyaW5nIHRvIG1hdGNoIAotCSAqIEBwYXJhbSBzdGFydCBtYXJrcyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gKGluY2x1c2l2ZSkgb2YgdGhlIHN1YnN0cmluZwotCSAqIEBwYXJhbSBlbmQgbWFya3MgdGhlIGVuZGluZyBpbmRleCAoZXhjbHVzaXZlKSBvZiB0aGUgc3Vic3RyaW5nIAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKG51bGwgPT0gdGV4dCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQotCQlpZiAoc3RhcnQgPiBlbmQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoZklnbm9yZVdpbGRDYXJkcykKLQkJCXJldHVybiAoZW5kIC0gc3RhcnQgPT0gZkxlbmd0aCkgJiYgZlBhdHRlcm4ucmVnaW9uTWF0Y2hlcyhmSWdub3JlQ2FzZSwgMCwgdGV4dCwgc3RhcnQsIGZMZW5ndGgpOwotCQlpbnQgc2VnQ291bnQ9IGZTZWdtZW50cy5sZW5ndGg7Ci0JCWlmIChzZWdDb3VudCA9PSAwICYmIChmSGFzTGVhZGluZ1N0YXIgfHwgZkhhc1RyYWlsaW5nU3RhcikpICAvLyBwYXR0ZXJuIGNvbnRhaW5zIG9ubHkgJyonKHMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHN0YXJ0ID09IGVuZCkKLQkJCXJldHVybiBmTGVuZ3RoID09IDA7Ci0JCWlmIChmTGVuZ3RoID09IDApCi0JCQlyZXR1cm4gc3RhcnQgPT0gZW5kOwkKLQkJIAotCQlpbnQgdGxlbj0gdGV4dC5sZW5ndGgoKTsKLQkJaWYgKHN0YXJ0IDwgMCkKLQkJCXN0YXJ0PSAwOwotCQlpZiAoZW5kID4gdGxlbikKLQkJCWVuZD0gdGxlbjsgCi0JCQkJCQotCQlpbnQgdEN1clBvcz0gc3RhcnQ7Ci0JCWludCBib3VuZD0gZW5kIC0gZkJvdW5kOwotCQlpZiAoIGJvdW5kIDwgMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGk9MDsKLQkJU3RyaW5nIGN1cnJlbnQ9IGZTZWdtZW50c1tpXTsKLQkJaW50IHNlZ0xlbmd0aD0gY3VycmVudC5sZW5ndGgoKTsKLQotCQkvKiBwcm9jZXNzIGZpcnN0IHNlZ21lbnQgKi8KLQkJaWYgKCFmSGFzTGVhZGluZ1N0YXIpeyAKLQkJCWlmKCFyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIHN0YXJ0LCBjdXJyZW50LCAwLCBzZWdMZW5ndGgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQkrK2k7Ci0JCQkJdEN1clBvcz0gdEN1clBvcyArIHNlZ0xlbmd0aDsKLQkJCX0KLQkJfQotCQlpZiAoKGZTZWdtZW50cy5sZW5ndGggPT0gMSkgJiYgKCFmSGFzTGVhZGluZ1N0YXIpICYmICghZkhhc1RyYWlsaW5nU3RhcikpIHsKLQkJCS8vIG9ubHkgb25lIHNlZ21lbnQgdG8gbWF0Y2gsIG5vIHdpbGRjYXJkcyBzcGVjaWZpZWQKLQkJCXJldHVybiB0Q3VyUG9zID09IGVuZDsKLQkJfQotCQkvKiBwcm9jZXNzIG1pZGRsZSBzZWdtZW50cyAqLwkKLQkJd2hpbGUgKGkgPCBzZWdDb3VudCkgewotCQkJY3VycmVudD0gZlNlZ21lbnRzW2ldOwotCQkJaW50IGN1cnJlbnRNYXRjaDsKLQkJCWludCBrPSBjdXJyZW50LmluZGV4T2YoZlNpbmdsZVdpbGRDYXJkKTsKLQkJCWlmIChrIDwgMCkgewotCQkJCWN1cnJlbnRNYXRjaD0gdGV4dFBvc0luKHRleHQsIHRDdXJQb3MsIGVuZCwgY3VycmVudCk7Ci0JCQkJaWYgKGN1cnJlbnRNYXRjaCA8IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7IAotCQkJCWN1cnJlbnRNYXRjaD0gcmVnRXhwUG9zSW4odGV4dCwgdEN1clBvcywgZW5kLCBjdXJyZW50KTsKLQkJCQlpZiAoY3VycmVudE1hdGNoIDwgMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJdEN1clBvcz0gY3VycmVudE1hdGNoICsgY3VycmVudC5sZW5ndGgoKTsKLQkJCWkrKzsKLQkJfQotCi0JCS8qIHByb2Nlc3MgZmluYWwgc2VnbWVudCAqLwotCQlpZiAoIWZIYXNUcmFpbGluZ1N0YXIgJiYgdEN1clBvcyAhPSBlbmQpIHsKLQkJCWludCBjbGVuPSBjdXJyZW50Lmxlbmd0aCgpOwotCQkJcmV0dXJuIHJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgZW5kIC0gY2xlbiwgY3VycmVudCwgMCwgY2xlbik7Ci0JCX0KLQkJcmV0dXJuIGkgPT0gc2VnQ291bnQgOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgZ2l2ZW4gcGF0dGVybiBpbnRvIHNlZ21lbnRzIHNlcGVyYXRlZCBieSB3aWxkY2FyZCAnKicgY2hhcmFjdGVycy4KLQkgKiBTaW5jZSB3aWxkY2FyZHMgYXJlIG5vdCBiZWluZyB1c2VkIGluIHRoaXMgY2FzZSwgdGhlIHBhdHRlcm4gY29uc2lzdHMgb2YgYSBzaW5nbGUgc2VnbWVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VOb1dpbGRDYXJkcygpIHsKLQkJZlNlZ21lbnRzPSBuZXcgU3RyaW5nWzFdOwotCQlmU2VnbWVudHNbMF09IGZQYXR0ZXJuOwotCQlmQm91bmQ9IGZMZW5ndGg7Ci0JfQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gcGF0dGVybiBpbnRvIHNlZ21lbnRzIHNlcGVyYXRlZCBieSB3aWxkY2FyZCAnKicgY2hhcmFjdGVycy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VXaWxkQ2FyZHMoKSB7Ci0JCWlmKGZQYXR0ZXJuLnN0YXJ0c1dpdGgoIioiKSkvLyROT04tTkxTLTEkCi0JCQlmSGFzTGVhZGluZ1N0YXI9IHRydWU7Ci0JCWlmKGZQYXR0ZXJuLmVuZHNXaXRoKCIqIikpIHsvLyROT04tTkxTLTEkCi0JCQkvKiBtYWtlIHN1cmUgaXQncyBub3QgYW4gZXNjYXBlZCB3aWxkY2FyZCAqLwotCQkJaWYgKGZMZW5ndGggPiAxICYmIGZQYXR0ZXJuLmNoYXJBdChmTGVuZ3RoIC0gMikgIT0gJ1xcJykgewotCQkJCWZIYXNUcmFpbGluZ1N0YXI9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlWZWN0b3IgdGVtcD0gbmV3IFZlY3RvcigpOwotCi0JCWludCBwb3M9IDA7Ci0JCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUgKHBvcyA8IGZMZW5ndGgpIHsKLQkJCWNoYXIgYz0gZlBhdHRlcm4uY2hhckF0KHBvcysrKTsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ1xcJzoKLQkJCQkJaWYgKHBvcyA+PSBmTGVuZ3RoKSB7Ci0JCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY2hhciBuZXh0PSBmUGF0dGVybi5jaGFyQXQocG9zKyspOwotCQkJCQkJLyogaWYgaXQncyBhbiBlc2NhcGUgc2VxdWVuY2UgKi8KLQkJCQkJCWlmIChuZXh0ID09ICcqJyB8fCBuZXh0ID09ICc/JyB8fCBuZXh0ID09ICdcXCcpIHsKLQkJCQkJCQlidWYuYXBwZW5kKG5leHQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvKiBub3QgYW4gZXNjYXBlIHNlcXVlbmNlLCBqdXN0IGluc2VydCBsaXRlcmFsbHkgKi8KLQkJCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCQkJCWJ1Zi5hcHBlbmQobmV4dCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQlicmVhazsKLQkJCQljYXNlICcqJzoKLQkJCQkJaWYgKGJ1Zi5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCS8qIG5ldyBzZWdtZW50ICovCi0JCQkJCQl0ZW1wLmFkZEVsZW1lbnQoYnVmLnRvU3RyaW5nKCkpOwotCQkJCQkJZkJvdW5kICs9IGJ1Zi5sZW5ndGgoKTsKLQkJCQkJCWJ1Zi5zZXRMZW5ndGgoMCk7Ci0JCQkJCX0KLQkJCQlicmVhazsKLQkJCQljYXNlICc/JzoKLQkJCQkJLyogYXBwZW5kIHNwZWNpYWwgY2hhcmFjdGVyIHJlcHJlc2VudGluZyBzaW5nbGUgbWF0Y2ggd2lsZGNhcmQgKi8KLQkJCQkJYnVmLmFwcGVuZChmU2luZ2xlV2lsZENhcmQpOwotCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBhZGQgbGFzdCBidWZmZXIgdG8gc2VnbWVudCBsaXN0ICovCi0JCWlmIChidWYubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0ZW1wLmFkZEVsZW1lbnQoYnVmLnRvU3RyaW5nKCkpOwotCQkJZkJvdW5kICs9IGJ1Zi5sZW5ndGgoKTsKLQkJfQotCQkJCi0JCWZTZWdtZW50cz0gbmV3IFN0cmluZ1t0ZW1wLnNpemUoKV07Ci0JCXRlbXAuY29weUludG8oZlNlZ21lbnRzKTsKLQl9Ci0JLyoqIAotCSAqIEBwYXJhbSB0ZXh0IGEgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIG5vIHdpbGRjYXJkCi0JICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKLQkgKiBAcGFyYW0gZW5kIHRoZSBzdG9wcGluZyBwb2ludCBvZiBzZWFyY2gsIGV4Y2x1c2l2ZQotCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYgbm90IGZvdW5kIAotCSAqLwotCXByb3RlY3RlZCBpbnQgcG9zSW4oU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgey8vbm8gd2lsZCBjYXJkIGluIHBhdHRlcm4KLQkJaW50IG1heD0gZW5kIC0gZkxlbmd0aDsKLQkJCi0JCWlmICghZklnbm9yZUNhc2UpIHsKLQkJCWludCBpPSB0ZXh0LmluZGV4T2YoZlBhdHRlcm4sIHN0YXJ0KTsKLQkJCWlmIChpID09IC0xIHx8IGkgPiBtYXgpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0dXJuIGk7Ci0JCX0KLQkJCi0JCWZvciAoaW50IGk9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7Ci0JCQlpZiAodGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIGksIGZQYXR0ZXJuLCAwLCBmTGVuZ3RoKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQkKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiogCi0JICogQHBhcmFtIHRleHQgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IG9ubHkgY29udGFpbiAnPycocykKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotCSAqIEBwYXJhbSBlbmQgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0JICogQHBhcmFtIHAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IGNvbnRhaW5zICc/JwotCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYgbm90IGZvdW5kIAotCSAqLwotCXByb3RlY3RlZCBpbnQgcmVnRXhwUG9zSW4oU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIHApIHsKLQkJaW50IHBsZW49IHAubGVuZ3RoKCk7Ci0JCQotCQlpbnQgbWF4PSBlbmQgLSBwbGVuOwotCQlmb3IgKGludCBpPSBzdGFydDsgaSA8PSBtYXg7ICsraSkgewotCQkJaWYgKHJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgaSwgcCwgMCwgcGxlbikpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCQotCXByb3RlY3RlZCBib29sZWFuIHJlZ0V4cFJlZ2lvbk1hdGNoZXMoU3RyaW5nIHRleHQsIGludCB0U3RhcnQsIFN0cmluZyBwLCBpbnQgcFN0YXJ0LCBpbnQgcGxlbikgewotCQl3aGlsZSAocGxlbi0tID4gMCkgewotCQkJY2hhciB0Y2hhcj0gdGV4dC5jaGFyQXQodFN0YXJ0KyspOwotCQkJY2hhciBwY2hhcj0gcC5jaGFyQXQocFN0YXJ0KyspOwotCi0JCQkvKiBwcm9jZXNzIHdpbGQgY2FyZHMgKi8KLQkJCWlmICghZklnbm9yZVdpbGRDYXJkcykgewotCQkJCS8qIHNraXAgc2luZ2xlIHdpbGQgY2FyZHMgKi8KLQkJCQlpZiAocGNoYXIgPT0gZlNpbmdsZVdpbGRDYXJkKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwY2hhciA9PSB0Y2hhcikKLQkJCQljb250aW51ZTsKLQkJCWlmIChmSWdub3JlQ2FzZSkgewotCQkJCWlmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UodGNoYXIpID09IENoYXJhY3Rlci50b1VwcGVyQ2FzZShwY2hhcikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCS8vIGNvbXBhcmluZyBhZnRlciBjb252ZXJ0aW5nIHRvIHVwcGVyIGNhc2UgZG9lc24ndCBoYW5kbGUgYWxsIGNhc2VzOwotCQkJCS8vIGFsc28gY29tcGFyZSBhZnRlciBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2UKLQkJCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHRjaGFyKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UocGNoYXIpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqIAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gbWF0Y2gKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotCSAqIEBwYXJhbSBlbmQgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0JICogQHBhcmFtIHAgYSBzdHJpbmcgdGhhdCBoYXMgbm8gd2lsZGNhcmQKLQkgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdCBmb3VuZCAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHRleHRQb3NJbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcCkgeyAKLQkJCi0JCWludCBwbGVuPSBwLmxlbmd0aCgpOwotCQlpbnQgbWF4PSBlbmQgLSBwbGVuOwotCQkKLQkJaWYgKCFmSWdub3JlQ2FzZSkgewotCQkJaW50IGk9IHRleHQuaW5kZXhPZihwLCBzdGFydCk7Ci0JCQlpZiAoaSA9PSAtMSB8fCBpID4gbWF4KQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiBpOwotCQl9Ci0JCQotCQlmb3IgKGludCBpPSBzdGFydDsgaSA8PSBtYXg7ICsraSkgewotCQkJaWYgKHRleHQucmVnaW9uTWF0Y2hlcyh0cnVlLCBpLCBwLCAwLCBwbGVuKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQkKLQkJcmV0dXJuIC0xOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXJQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OThhOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXJQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5JQ2xhc3NwYXRoQ29udGFpbmVyUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5JQ2xhc3NwYXRoQ29udGFpbmVyUGFnZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdFbGVtZW50V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY2xhc3NwYXRoLldlYkFwcExpYnJhcmllc0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5XZWJGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5TZXJ2bGV0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIFdlYkFwcExpYnJhcmllc0NvbnRhaW5lclBhZ2UgCi0KLSAgICBleHRlbmRzIE5ld0VsZW1lbnRXaXphcmRQYWdlIAotICAgIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lclBhZ2UsIElDbGFzc3BhdGhDb250YWluZXJQYWdlRXh0ZW5zaW9uIAotICAgIAotewotICAgIHByaXZhdGUgSVByb2plY3Qgb3duZXJQcm9qZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIGxpYnNQcm9qZWN0TmFtZTsKLSAgICBwcml2YXRlIENvbWJvIHByb2plY3RzQ29tYm87Ci0gICAgCi0gICAgcHVibGljIFdlYkFwcExpYnJhcmllc0NvbnRhaW5lclBhZ2UoKSAKLSAgICB7Ci0gICAgICAgIHN1cGVyKCAiV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyUGFnZSIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgc2V0VGl0bGUoIFJlc291cmNlcy5wYWdlVGl0bGUgKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIFJlc291cmNlcy5wYWdlRGVzY3JpcHRpb24gKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElDbGFzc3BhdGhFbnRyeSBnZXRTZWxlY3Rpb24oKSAKLSAgICB7Ci0gICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aCggV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyLkNPTlRBSU5FUl9JRCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gdGhpcy5wcm9qZWN0c0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIGlmKGluZGV4ICE9IC0xKXsKLQkgICAgICAgIGZpbmFsIFN0cmluZyBzZWxlY3RlZFByb2plY3ROYW1lID0gdGhpcy5wcm9qZWN0c0NvbWJvLmdldEl0ZW0oIGluZGV4ICk7Ci0JICAgICAgICAKLQkgICAgICAgIGlmKCB0aGlzLm93bmVyUHJvamVjdCA9PSBudWxsIHx8IAotCSAgICAgICAgICAgICEgc2VsZWN0ZWRQcm9qZWN0TmFtZS5lcXVhbHMoIHRoaXMub3duZXJQcm9qZWN0LmdldE5hbWUoKSApICkKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBwYXRoID0gcGF0aC5hcHBlbmQoIHNlbGVjdGVkUHJvamVjdE5hbWUgKTsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KCBwYXRoICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKCBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlbnRyeSApIAotICAgIHsKLSAgICAgICAgZmluYWwgSVBhdGggcGF0aCA9IGNwZW50cnkgPT0gbnVsbCA/IG51bGwgOiBjcGVudHJ5LmdldFBhdGgoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBwYXRoID09IG51bGwgfHwgcGF0aC5zZWdtZW50Q291bnQoKSA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMub3duZXJQcm9qZWN0ICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubGlic1Byb2plY3ROYW1lID0gdGhpcy5vd25lclByb2plY3QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5saWJzUHJvamVjdE5hbWUgPSBwYXRoLnNlZ21lbnQoIDEgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKCBmaW5hbCBDb21wb3NpdGUgcGFyZW50ICkgCi0gICAgewotICAgICAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTk9ORSApOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBuZXcgR3JpZExheW91dCggMiwgZmFsc2UgKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIGNvbXBvc2l0ZSwgU1dULk5PTkUgKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCggUmVzb3VyY2VzLnByb2plY3RzTGFiZWwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHdlYlByb2plY3RzID0gZ2V0V2ViUHJvamVjdHMoKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucHJvamVjdHNDb21ibyA9IG5ldyBDb21ibyggY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgICAgIHRoaXMucHJvamVjdHNDb21iby5zZXRJdGVtcyggd2ViUHJvamVjdHMgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIGludCBpbmRleDsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLm93bmVyUHJvamVjdCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5kZXggPSBpbmRleE9mKCB3ZWJQcm9qZWN0cywgdGhpcy5saWJzUHJvamVjdE5hbWUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLnByb2plY3RzQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGluZGV4ICE9IC0xICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wcm9qZWN0c0NvbWJvLnNlbGVjdCggaW5kZXggKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIGdkLm1pbmltdW1XaWR0aCA9IDEwMDsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucHJvamVjdHNDb21iby5zZXRMYXlvdXREYXRhKCBnZCApOwotICAgICAgICAKLSAgICAgICAgc2V0Q29udHJvbCggY29tcG9zaXRlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGZpbmlzaCgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoIGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjdXJyZW50RW50cmllcyApIAotICAgIHsKLSAgICAgICAgdGhpcy5vd25lclByb2plY3QgPSAoIHByb2plY3QgPT0gbnVsbCA/IG51bGwgOiBwcm9qZWN0LmdldFByb2plY3QoKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRXZWJQcm9qZWN0cygpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU2V0IHByb2plY3RzCi0gICAgICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRGYWNldGVkUHJvamVjdHMoIFdlYkZhY2V0VXRpbHMuV0VCX0ZBQ0VUICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1sgcHJvamVjdHMuc2l6ZSgpIF07Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSXRlcmF0b3IgaXRyID0gcHJvamVjdHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2ogPSAoSUZhY2V0ZWRQcm9qZWN0KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIG5hbWVzWyBpIF0gPSBmcHJvai5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBBcnJheXMuc29ydCggbmFtZXMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG5hbWVzOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXJ2bGV0VUlQbHVnaW4ubG9nKCBlLmdldFN0YXR1cygpICk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1sgMCBdOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCBpbmRleE9mKCBmaW5hbCBTdHJpbmdbXSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0ciApCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGFycmF5WyBpIF0uZXF1YWxzKCBzdHIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFnZVRpdGxlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlRGVzY3JpcHRpb247Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2plY3RzTGFiZWw7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBXZWJBcHBMaWJyYXJpZXNDb250YWluZXJQYWdlLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXJQYWdlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lclBhZ2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2MjFhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lclBhZ2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBhZ2VUaXRsZSA9IFdlYiBBcHAgTGlicmFyaWVzCi1wYWdlRGVzY3JpcHRpb24gPSBUaGlzIGNvbnRhaW5lciBkeW5hbWljYWxseSBtYW5hZ2VzIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0eXBlcyBpbiB0aGUgV0VCLUlORi9saWIgYW5kIFdFQi1JTkYvY2xhc3NlcyBkaXJlY3Rvcmllcy4KLXByb2plY3RzTGFiZWwgPSBQcm9qZWN0OlwgCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEV4cG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50RXhwb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTcxNmNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50RXhwb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVNb2R1bGVFeHBvcnRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLklXZWJVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgV2ViQ29tcG9uZW50RXhwb3J0UGFnZSBleHRlbmRzIEoyRUVNb2R1bGVFeHBvcnRQYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgV2ViQ29tcG9uZW50RXhwb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXNldFRpdGxlKFdFQlVJTWVzc2FnZXMuV0VCX0VYUE9SVF9NQUlOX1BHX1RJVExFKTsKLQkJc2V0RGVzY3JpcHRpb24oV0VCVUlNZXNzYWdlcy5XRUJfRVhQT1JUX01BSU5fUEdfREVTQyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5XRUJfRVhQT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQkJc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0FSX0VYUE9SVF9QQUdFMSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0UHJvamVjdEltcG9ydExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXBvbmVudExhYmVsKCkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuV0VCX1BST0pfTEJMKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWx0ZXJFeHByZXNzaW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiKi53YXIifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVFeHBvcnRQYWdlI2lzTWV0YVR5cGVTdXBwb3J0ZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc01ldGFUeXBlU3VwcG9ydGVkKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG5lbnRJRCgpIHsKLQkJcmV0dXJuICJKU1RfV0VCIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMjFmMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVBcnRpZmFjdEV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFdpemFyZCB1c2VkIHRvIGV4cG9ydCBKMkVFIFdlYiBBcHBsaWNhdGlvbiBtb2R1bGUgc3RydWN0dXJlcyAKLSAqIGZyb20gdGhlIEVjbGlwc2UgV29ya2JlbmNoIHRvIGEgZGVwbG95YWJsZSBXZWIgQXBwbGljYXRpb24gCi0gKiBBcmNoaXZlICoud2FyIGZpbGUuICAKLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdlYkNvbXBvbmVudEV4cG9ydFdpemFyZCBleHRlbmRzIEoyRUVBcnRpZmFjdEV4cG9ydFdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQgewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIAotCSAqIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8gb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIAotCSAqIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzCi0JICogYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRFeHBvcnRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotICAgIAotICAgIHByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFdlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7Ci0gICAgfQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIGZvbGxvd2luZyBwYWdlczoKLQkgKiA8dWw+Ci0JICogCTxsaT4ge0BsaW5rIFdlYkNvbXBvbmVudEV4cG9ydFBhZ2V9IGFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KSAKLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBXZWJDb21wb25lbnRFeHBvcnRQYWdlKGdldERhdGFNb2RlbCgpLCBNQUlOX1BHLCBnZXRTZWxlY3Rpb24oKSkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30gICAKLQkgKiAKLQkgKiA8cD4KLQkgKiBTZXRzIHVwIHRoZSBkZWZhdWx0IHdpemFyZCBwYWdlIGltYWdlLiAKLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9Jbml0KCkgewotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5XRUJfRVhQT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmU5Y2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRU1vZHVsZUltcG9ydFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuSVdlYlVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViQ29tcG9uZW50SW1wb3J0UGFnZSBleHRlbmRzIEoyRUVNb2R1bGVJbXBvcnRQYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgV2ViQ29tcG9uZW50SW1wb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoV0VCVUlNZXNzYWdlcy5XRUJfSU1QT1JUX01BSU5fUEdfVElUTEUpOwotCQlzZXREZXNjcmlwdGlvbihXRUJVSU1lc3NhZ2VzLldFQl9JTVBPUlRfTUFJTl9QR19ERVNDKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLldFQl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCQlzZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XQVJfSU1QT1JUX1BBR0UxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIFdFQlVJTWVzc2FnZXMuV0VCX0ZJTEVfTEJMOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLndhciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBXRUJVSU1lc3NhZ2VzLldFQl9QUk9KRUNUX0xCTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIFRPRE86IGltcGxlbWVudCB3aXRoIG5ldyBpbXBvcnQgd2l6YXJkcwotCQkvLyBuZXcgQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoY29tcG9zaXRlLCBnZXRXZWJEYXRhTW9kZWwoKSwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlRmFjZXRJRCgpewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUI7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0V2ViTGlic1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0V2ViTGlic1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkYTZkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFdlYkxpYnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQXJjaGl2ZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVJbXBvcnRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5kYXRhbW9kZWwucHJvcGVydGllcy5JV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5JV2ViVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJDb21wb25lbnRJbXBvcnRXZWJMaWJzUGFnZSBleHRlbmRzIEoyRUVJbXBvcnRQYWdlIHsKLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JcHJvdGVjdGVkIEFyY2hpdmVXcmFwcGVyIGFyY2hpdmVXcmFwcGVyOwotCXB1YmxpYyBDaGVja2JveFRhYmxlVmlld2VyIGF2YWlsYWJsZUpBUnNWaWV3ZXI7Ci0JcHVibGljIGJvb2xlYW4gdXRpbEphclNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRJbXBvcnRXZWJMaWJzUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoV0VCVUlNZXNzYWdlcy5XRUJfSU1QT1JUX1dFQl9MSUJfUEdfVElUTEUpOwotCQlzZXREZXNjcmlwdGlvbihXRUJVSU1lc3NhZ2VzLldFQl9JTVBPUlRfV0VCX0xJQl9QR19ERVNDKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLldFQl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0FSX0lNUE9SVF9QQUdFMik7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNyZWF0ZUF2YWlsYWJsZUphcnNMaXN0KGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUJ1dHRvbnNHcm91cChjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogVXBkYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBhbGwgYnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbkVuYWJsZW1lbnRzKCkgewotCQl1dGlsSmFyU2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXZhaWxhYmxlSmFyc0xpc3QoQ29tcG9zaXRlIGxpc3RHcm91cCkgewotCQlhdmFpbGFibGVKQVJzVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QobGlzdEdyb3VwLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDIwMDsKLQkJZ0RhdGEuaGVpZ2h0SGludCA9IDgwOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJQXZhaWxhYmxlV2ViTGliUHJvdmlkZXIgbGlic1Byb3ZpZGVyID0gbmV3IEF2YWlsYWJsZVdlYkxpYlByb3ZpZGVyKCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGxpYnNQcm92aWRlcik7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsaWJzUHJvdmlkZXIpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlhdmFpbGFibGVKQVJDaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKTsKLQkJCX0KLQkJfSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCi0JCW1vZGVsLmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLldFQl9MSUJfQVJDSElWRVNfU0VMRUNURUQpKSB7Ci0JCQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKCgoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCkpLnRvQXJyYXkoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCkgewotCQlBcnJheUxpc3QgZW1wdHlTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KDIpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5XRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVELCBlbXB0eVNlbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCUFycmF5TGlzdCBhbGxTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KDIpOwotCQlPYmplY3Qgc2VsZWN0aW9uID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IChudWxsICE9IChzZWxlY3Rpb24gPSBhdmFpbGFibGVKQVJzVmlld2VyLmdldEVsZW1lbnRBdChpKSkpOyBpKyspIHsKLQkJCWFsbFNlbGVjdGlvbi5hZGQoc2VsZWN0aW9uKTsKLQkJfQotCQltb2RlbC5zZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5XRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVELCBhbGxTZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNHcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBidXR0b25Hcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChXRUJVSU1lc3NhZ2VzLldBUl9JTVBPUlRfU0VMRUNUX0FMTF9MSUJTX0JVVFRPTik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJZ2QuaGVpZ2h0SGludCA9IFNXVC5ERUZBVUxUOwotCQlnZC53aWR0aEhpbnQgPSBTV1QuREVGQVVMVDsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlU2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChXRUJVSU1lc3NhZ2VzLldBUl9JTVBPUlRfREVTRUxFQ1RfQUxMX0xJQlNfQlVUVE9OKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlnZC5oZWlnaHRIaW50ID0gU1dULkRFRkFVTFQ7Ci0JCWdkLndpZHRoSGludCA9IFNXVC5ERUZBVUxUOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoRUFSRmlsZUlmTmVjZXNzYXJ5KCkgewotCQlpZiAoaXNFQVJGaWxlQ2hhbmdlZCgpKSB7Ci0JCQlhcmNoaXZlV3JhcHBlciA9IChBcmNoaXZlV3JhcHBlcikgbW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUik7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRKQVJzQ29tcG9zaXRlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsR3JheWVkKCFlbmFibGVkKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0SW5wdXQoYXJjaGl2ZVdyYXBwZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRUFSRmlsZUNoYW5nZWQoKSB7Ci0JCXJldHVybiBhcmNoaXZlV3JhcHBlciAhPSBtb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9XUkFQUEVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKLQkJc3VwZXIuZW50ZXIoKTsKLQkJcmVmcmVzaEVBUkZpbGVJZk5lY2Vzc2FyeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGF2YWlsYWJsZUpBUkNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCwgZ2V0SkFSc0ZvclByb2plY3RzKCkpOwotCQl2YWxpZGF0ZVBhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRKQVJzRm9yUHJvamVjdHMoKSB7Ci0JCXJlZnJlc2hFQVJGaWxlSWZOZWNlc3NhcnkoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhdmFpbGFibGVKQVJzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gYVN0cmluZyA9PSBudWxsIHx8IGFTdHJpbmcubGVuZ3RoKCkgPT0gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117fTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCQkvLyBUaGlzIHBhZ2UgZG9lc24ndCBpbXBsZW1lbnQuLi4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJLy8gVGhpcyBwYWdlIGRvZXNuJ3QgaW1wbGVtZW50Li4uCi0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OWYxYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5JUHJvZHVjdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFdpemFyZCB1c2VkIHRvIGltcG9ydCBKMkVFIFdlYiBBcHBsaWNhdGlvbiBtb2R1bGUgc3RydWN0dXJlcyBpbnRvIHRoZSBFY2xpcHNlIFdvcmtiZW5jaCBmcm9tIGFuCi0gKiBleGlzdGluZyBXZWIgQXBwbGljYXRpb24gKi53YXIgZmlsZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdlYkNvbXBvbmVudEltcG9ydFdpemFyZCBleHRlbmRzIEoyRUVDb21wb25lbnRJbXBvcnRXaXphcmQgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0xJQlNfUEcgPSAiV0VCX0xJQlNfUEciOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8KLQkgKiBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRJbXBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgdGhlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlCi0JICogICAgICAgICAgICBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgYW4ge0BsaW5rIFdBUkltcG9ydFBhZ2V9IGFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJYWRkUGFnZShuZXcgV2ViQ29tcG9uZW50SW1wb3J0UGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRykpOwotCQlhZGRQYWdlKG5ldyBXZWJDb21wb25lbnRJbXBvcnRXZWJMaWJzUGFnZShnZXREYXRhTW9kZWwoKSwgV0VCX0xJQlNfUEcpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogU2V0cyB1cCB0aGUgZGlhbG9nIHdpbmRvdyB0aXRsZSBhbmQgZGVmYXVsdCB3aXphcmQgcGFnZSBpbWFnZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZG9Jbml0KCkgewotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5JTVBPUlRfV0laX1RJVExFKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLldFQl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCQkvLyB1cGRhdGVFQVJUb01vZGVsRnJvbVNlbGVjdGlvbihnZXRTcGVjaWZpY0RhdGFNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kdWxlVmFsaWRhdG9yU3RyaW5ncygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnZhbGlkYXRpb24uVUlXYXJWYWxpZGF0b3IifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0JLy8gLy8gSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsIHByb2pDcmVhdGlvbk1vZGVsID0KLQkvLyAvLyBnZXRTcGVjaWZpY0RhdGFNb2RlbCgpLmdldEoyRUVNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbCgpOwotCS8vIC8vIHJldHVybiBwcm9qQ3JlYXRpb25Nb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5GSU5BTF9QRVJTUEVDVElWRSk7Ci0JLy8gcmV0dXJuIGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkZJTkFMX1BFUlNQRUNUSVZFKTsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewotICAgICAgICByZXR1cm4gUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfV0VCKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJGYWNldEluc3RhbGxQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJGYWNldEluc3RhbGxQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjNlNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuSVdlYlVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXZWJGYWNldEluc3RhbGxQYWdlIGV4dGVuZHMgSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2UgaW1wbGVtZW50cyBJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JcHJpdmF0ZSBMYWJlbCBjb250ZXh0Um9vdExhYmVsOwotCXByaXZhdGUgVGV4dCBjb250ZXh0Um9vdDsKLQlwcml2YXRlIExhYmVsIGNvbnRlbnREaXJMYWJlbDsKLQlwcml2YXRlIFRleHQgY29udGVudERpcjsKLQlwcml2YXRlIFRleHQgc291cmNlRGlyOwotCXByaXZhdGUgTGFiZWwgc291cmNlRGlyTGFiZWw7Ci0JCi0JcHJpdmF0ZSBUZXh0IG91dHB1dEZvbGRlcjsKLQlwcml2YXRlIExhYmVsIG91dHB1dEZvbGRlckxhYmVsOwotCQotCXB1YmxpYyBXZWJGYWNldEluc3RhbGxQYWdlKCkgewotCQlzdXBlcigid2ViLmZhY2V0Lmluc3RhbGwucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKFJlc291cmNlcy5wYWdlVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihSZXNvdXJjZXMucGFnZURlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuTkVXX0RZTkFNSUNfV0VCX1BST0pFQ1RfUEFHRTMpOwotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCXRoaXMuY29udGV4dFJvb3RMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGhpcy5jb250ZXh0Um9vdExhYmVsLnNldFRleHQoUmVzb3VyY2VzLmNvbnRleHRSb290TGFiZWwpOwotCQl0aGlzLmNvbnRleHRSb290TGFiZWwuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCi0JCXRoaXMuY29udGV4dFJvb3QgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl0aGlzLmNvbnRleHRSb290LnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJdGhpcy5jb250ZXh0Um9vdC5zZXREYXRhKCJsYWJlbCIsIHRoaXMuY29udGV4dFJvb3RMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGNvbnRleHRSb290LCBDT05URVhUX1JPT1QsIG5ldyBDb250cm9sW117Y29udGV4dFJvb3RMYWJlbH0pOwotCi0JCXRoaXMuY29udGVudERpckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl0aGlzLmNvbnRlbnREaXJMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5jb250ZW50RGlyTGFiZWwpOwotCQl0aGlzLmNvbnRlbnREaXJMYWJlbC5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0KLQkJdGhpcy5jb250ZW50RGlyID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdGhpcy5jb250ZW50RGlyLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJdGhpcy5jb250ZW50RGlyLnNldERhdGEoImxhYmVsIiwgdGhpcy5jb250ZW50RGlyTGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChjb250ZW50RGlyLCBDT05GSUdfRk9MREVSLCBudWxsKTsKLQkJCi0JCXRoaXMuc291cmNlRGlyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRoaXMuc291cmNlRGlyTGFiZWwuc2V0VGV4dChSZXNvdXJjZXMuc291cmNlRGlyTGFiZWwpOwotCQl0aGlzLnNvdXJjZURpckxhYmVsLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJCi0JCXRoaXMuc291cmNlRGlyID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdGhpcy5zb3VyY2VEaXIuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQl0aGlzLnNvdXJjZURpci5zZXREYXRhKCJsYWJlbCIsIHRoaXMuc291cmNlRGlyTGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChzb3VyY2VEaXIsIFNPVVJDRV9GT0xERVIsIG51bGwpOwotCQkKLQkJb3V0cHV0Rm9sZGVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW91dHB1dEZvbGRlckxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuT1VUUFVURk9MREVSKSk7Ci0JCW91dHB1dEZvbGRlckxhYmVsLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJCi0JCW91dHB1dEZvbGRlciA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCW91dHB1dEZvbGRlci5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0JCW91dHB1dEZvbGRlci5zZXREYXRhKCJsYWJlbCIsIHRoaXMub3V0cHV0Rm9sZGVyTGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChvdXRwdXRGb2xkZXIsIE9VVFBVVF9GT0xERVIsIG51bGwpOwotCQkKLQkJY3JlYXRlR2VuZXJhdGVEZXNjcmlwdG9yQ29udHJvbCggY29tcG9zaXRlICk7Ci0JCXJlZ2lzdGVyRmFjZXRWZXJzaW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLSAgICAgICAgCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZhY2V0VmVyc2lvbkNoYW5nZWRFdmVudCgpCi0JewotCSAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbikgdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eSggRkFDRVRfVkVSU0lPTiApOwotCSAgICB0aGlzLmFkZERELnNldFZpc2libGUoIGZ2ID09IFdlYkZhY2V0VXRpbHMuV0VCXzI1ICk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtFQVJfUFJPSkVDVF9OQU1FLCBDT05URVhUX1JPT1QsIENPTkZJR19GT0xERVIsIFNPVVJDRV9GT0xERVIsIE9VVFBVVF9GT0xERVJ9OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VUaXRsZTsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgcGFnZURlc2NyaXB0aW9uOwotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZXh0Um9vdExhYmVsOwotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZXh0Um9vdExhYmVsSW52YWxpZDsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGVudERpckxhYmVsOwotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZW50RGlyTGFiZWxJbnZhbGlkOwotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBzb3VyY2VEaXJMYWJlbDsKLQotCi0JCXN0YXRpYyB7Ci0JCQlpbml0aWFsaXplTWVzc2FnZXMoV2ViRmFjZXRJbnN0YWxsUGFnZS5jbGFzcy5nZXROYW1lKCksIFJlc291cmNlcy5jbGFzcyk7Ci0JCX0KLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3ZmE0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhZ2VUaXRsZSA9IFdlYiBNb2R1bGUKLXBhZ2VEZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB3ZWIgbW9kdWxlIHNldHRpbmdzLgotY29udGV4dFJvb3RMYWJlbCA9IENvbnRleHQgUm9vdDoKLWNvbnRleHRSb290TGFiZWxJbnZhbGlkID0gQ29udGV4dCBSb290IChpbnZhbGlkKToKLWNvbnRlbnREaXJMYWJlbCA9IENvbnRlbnQgRGlyZWN0b3J5OgotY29udGVudERpckxhYmVsSW52YWxpZCA9IENvbnRlbnQgRGlyZWN0b3J5IChpbnZhbGlkKToKLXNvdXJjZURpckxhYmVsID0gSmF2YSBTb3VyY2UgRGlyZWN0b3J5OgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViUHJvamVjdEZpcnN0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViUHJvamVjdEZpcnN0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzU3NGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9wcm9qZWN0L2ZhY2V0L1dlYlByb2plY3RGaXJzdFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5XZWJGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLklXZWJVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViUHJvamVjdEZpcnN0UGFnZSBleHRlbmRzIEoyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgV2ViUHJvamVjdEZpcnN0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoV0VCVUlNZXNzYWdlcy5XRUJfUFJPSkVDVF9NQUlOX1BHX1RJVExFKTsKLQkJc2V0RGVzY3JpcHRpb24oV0VCVUlNZXNzYWdlcy5XRUJfUFJPSkVDVF9NQUlOX1BHX0RFU0MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuV0VCX1BST0pFQ1RfV0laQVJEX0JBTk5FUikpOwotCQlzZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5ORVdfRFlOQU1JQ19XRUJfUFJPSkVDVF9QQUdFMSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVGYWNldElEKCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUI7Ci0JfQotCQotCXByb3RlY3RlZCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldEZhY2V0Q29uZmlndXJhdGlvbiggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gcHJpbWFyeUZhY2V0VmVyc2lvbiApCi0JewotCSAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiggMiApOwotCSAgICAKLQkgICAgZmFjZXRzLmFkZCggcHJpbWFyeUZhY2V0VmVyc2lvbiApOwotCSAgICAKLQkgICAgaWYoIHByaW1hcnlGYWNldFZlcnNpb24gPT0gV2ViRmFjZXRVdGlscy5XRUJfMjUgKQotCSAgICB7Ci0JICAgICAgICBmYWNldHMuYWRkKCBKYXZhRmFjZXRVdGlscy5KQVZBXzUwICk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiggcHJpbWFyeUZhY2V0VmVyc2lvbiA9PSBXZWJGYWNldFV0aWxzLldFQl8yNCApCi0JICAgIHsKLQkgICAgICAgIGZhY2V0cy5hZGQoIEphdmFGYWNldFV0aWxzLkpBVkFfMTQgKTsKLQkgICAgfQotCSAgICBlbHNlIGlmKCBwcmltYXJ5RmFjZXRWZXJzaW9uID09IFdlYkZhY2V0VXRpbHMuV0VCXzIzIHx8Ci0JICAgICAgICAgICAgIHByaW1hcnlGYWNldFZlcnNpb24gPT0gV2ViRmFjZXRVdGlscy5XRUJfMjIgKQotCSAgICB7Ci0JICAgICAgICBmYWNldHMuYWRkKCBKYXZhRmFjZXRVdGlscy5KQVZBXzEzICk7Ci0JICAgIH0KLQkgICAgCi0JICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIGZhY2V0cyApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViUHJvamVjdFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViUHJvamVjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDE0N2ZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9wcm9qZWN0L2ZhY2V0L1dlYlByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5JUHJvZHVjdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJQcm9qZWN0V2l6YXJkIGV4dGVuZHMgTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkIHsKLQotCXB1YmxpYyBXZWJQcm9qZWN0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShXRUJVSU1lc3NhZ2VzLldFQl9NT0RVTEVfV0laX1RJVExFKTsKLQl9Ci0JCi0JcHVibGljIFdlYlByb2plY3RXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKFdFQlVJTWVzc2FnZXMuV0VCX01PRFVMRV9XSVpfVElUTEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoKSB7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgICByZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JICAgIH0KLQkgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLQkgICAgewotCSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICB9Ci0JfQotCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoInRlbXBsYXRlLmpzdC53ZWIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJV2l6YXJkUGFnZSBjcmVhdGVGaXJzdFBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgV2ViUHJvamVjdEZpcnN0UGFnZShtb2RlbCwgImZpcnN0LnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlmaW5hbCBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aSIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFVSTCB1cmwgPSBidW5kbGUuZ2V0RW50cnkoImljb25zL2Z1bGwvY3Rvb2wxNi93ZWItd2l6LWJhbm5lci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0gICAgICAgIHJldHVybiBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9XRUIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YTkwZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InN0YXRpY193ZWJfcHJvamVjdCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTAwODRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4NjU0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjY1YzFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jVGh1IE1heSAxMCAxODozOToxOCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3ZDEwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndlYjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwNy5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuV1NUV2ViUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldCwKLSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZmFjZXQsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5vcGVyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1ODUwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBzdGF0aWNfd2ViX3Byb2plY3QvLFwKLSAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTIwN2NiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud2ViIj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL29iajE2L3dlYl9hcHBsaWNhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvaWNvbnMvZnVsbC9vYmoxNi93ZWJfYXBwbGljYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWY2MDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL29iajE2L3dlYl9hcHBsaWNhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvaWNvbnMvZnVsbC9vYmoxNi93ZWJzdGF0aWNfZGVwbG95LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL29iajE2L3dlYnN0YXRpY19kZXBsb3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzMWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL29iajE2L3dlYnN0YXRpY19kZXBsb3kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL3dpemJhbi9uZXd3cHJqX3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGQwOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhNjg5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLgotIyBBbGwgUmlnaHRzIFJlc2VydmVkLgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lLjAgPSBTaW1wbGUgV2ViIFBsdWctaW4KLQotU0lNUExFX1dFQl9MQUJFTD1TdGF0aWMgV2ViIE1vZHVsZQotU0lNUExFX1dFQl9ERVNDUklQVElPTj1FbmFibGVzIHRoZSBwcm9qZWN0IHRvIGJlIGRlcGxveWVkIGFzIGEgc3RhdGljIHdlYiBtb2R1bGUuCi1TSU1QTEVfV0VCX1RFTVBMQVRFPVN0YXRpYyBXZWIgUHJvamVjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZDhiNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJ1bnRpbWVQcmVzZXRNYXBwaW5ncyIgbmFtZT0iUnVudGltZSBQcmVzZXQgTWFwcGluZ3MgRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS9ydW50aW1lUHJlc2V0TWFwcGluZ3MuZXhzZCIvPiAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlRmFjdG9yaWVzIj4KLSAgICAgIDxtb2R1bGVGYWN0b3J5Ci0gICAgICAgICAgICBwcm9qZWN0cz0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzLlN0YXRpY1dlYkRlcGxveWFibGVGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuc3RhdGljIj4KLSAgICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICAgICAgICB2ZXJzaW9ucz0iMS4wLCAxLjIsIDEuMywgMS40IgotICAgICAgICAgICAgICAgdHlwZXM9IndzdC53ZWIiPgotICAgICAgICAgPC9tb2R1bGVUeXBlPgotICAgICAgPC9tb2R1bGVGYWN0b3J5PgotICAgICA8L2V4dGVuc2lvbj4KLSAgICAgCi0gICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIj4KLSAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYi5zZXJ2ZXIud2Vic3RhdGljMSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzLlN0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJ3c3Qud2ViIiAvPgotCQkJIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYi5zZXJ2ZXIud2Vic3RhdGljMiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzLlN0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJ3c3Qud2ViIiAvPgotCQkJIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPiAgIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlcy5TdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlciIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzLklTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdCIvPgotICAgICAgICA8L2ZhY3Rvcnk+ICAgIAotICAgPC9leHRlbnNpb24+IAotICAgCi0gICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDwhLS0gQnVpbGRlciBQcm92aWRlciByZWdpc3RyYXRpb25zLS0+Ci0gICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iPgotICAgICAJPFByb3ZpZGVyRGVmaW5lc1R5cGUKLSAgICAgIAkJcHJvdmlkZXJUeXBlPSJ3c3Qud2ViLmJ1aWxkZXIiCi0gICAgICAJCXByb3ZpZGVySUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLldvcmtiZW5jaENvbXBvbmVudEJ1aWxkZXJEYXRhTW9kZWxQcm92aWRlciIvPgotCQk8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbi5TaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwub3BlcmF0aW9uLlNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIiLz4KLQk8L2V4dGVuc2lvbj4KLQkKLSAgPCEtLSBQcm9qZWN0IEZhY2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9IndzdC53ZWIiPgotICAgICAgPGxhYmVsPiVTSU1QTEVfV0VCX0xBQkVMPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj4lU0lNUExFX1dFQl9ERVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaGlkZS52ZXJzaW9uIiB2YWx1ZT0idHJ1ZSIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9IndzdC53ZWIiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8YWN0aW9uIHR5cGU9Imluc3RhbGwiIGlkPSJ3c3Qud2ViLmluc3RhbGwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlNpbXBsZVdlYkZhY2V0SW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICAgIDxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgICAgPGFjdGlvbiB0eXBlPSJ1bmluc3RhbGwiIGlkPSJ3c3Qud2ViLnVuaW5zdGFsbCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuU2ltcGxlV2ViRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgICA8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlNpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8Y29uZmxpY3RzIGdyb3VwPSJtb2R1bGVzIi8+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgICAgIAotICAgIDx0ZW1wbGF0ZSBpZD0idGVtcGxhdGUud3N0LndlYiI+Ci0gICAgICA8bGFiZWw+JVNJTVBMRV9XRUJfVEVNUExBVEU8L2xhYmVsPgotICAgICAgPGZpeGVkIGZhY2V0PSJ3c3Qud2ViIi8+Ci0gICAgPC90ZW1wbGF0ZT4KLQotICA8L2V4dGVuc2lvbj4JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9wcm9wZXJ0eV9maWxlcy9zdGF0aWN3ZWJwcm9qZWN0LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcHJvcGVydHlfZmlsZXMvc3RhdGljd2VicHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTc0NWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9wcm9wZXJ0eV9maWxlcy9zdGF0aWN3ZWJwcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1TdGF0aWNXZWJQcm9qZWN0Q3JlYXRpb25XaXphcmRfV2l6YXJkX1RpdGxlPU5ldyBTdGF0aWMgV2ViIFByb2plY3QKLVN0YXRpY1dlYlByb2plY3RXaXphcmRCYXNlUGFnZV9QYWdlX0Rlc2NyaXB0aW9uPUNyZWF0ZSBhIFdlYiBwcm9qZWN0IGZvciBzaW1wbGUgY29udGVudCAoSFRNTCBmaWxlcykgb25seS4KLVN0YXRpY1dlYlNldHRpbmdzUHJvcGVydGllc1BhZ2VfV2ViX0NvbnRlbnRfTGFiZWw9V2ViIGNvbnRlbnQgZm9sZGVyIG5hbWU6Ci1TdGF0aWNDb250ZXh0Um9vdENvbXBvc2l0ZV9Db250ZXh0X1Jvb3RfTGFiZWw9Q29udGV4dCByb290Ci1TdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2VfUGFnZV9UaXRsZT1TdGF0aWMgV2ViIFByb2plY3QKLVN0YXRpY1dlYlNldHRpbmdzUHJvcGVydGllc1BhZ2VfTm90X2F2YWlsYWJsZV9mb3JfY2xvc2VkX3Byb2plY3RzPVdlYiBzZXR0aW5ncyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYSBjbG9zZWQgcHJvamVjdC4KLVRhcmdldFJ1bnRpbWU9VGFyZ2V0IFJ1bnRpbWUKLU5ld0RvdERvdERvdD1OJmV3Li4uCi1JbnZhbGlkU2VydmVyVGFyZ2V0PUludmFsaWQgdGFyZ2V0IHNlcnZlciBzZWxlY3RlZC4KLUNvbmZpZ3VyZVNldHRpbmdzPUNvbmZpZ3VyZSBTdGF0aWMgV2ViIG1vZHVsZSBzZXR0aW5ncy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc2NoZW1hL3J1bnRpbWVQcmVzZXRNYXBwaW5ncy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3NjaGVtYS9ydW50aW1lUHJlc2V0TWFwcGluZ3MuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyNzExNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc2NoZW1hL3J1bnRpbWVQcmVzZXRNYXBwaW5ncy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC53ZWIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndlYiIgaWQ9IlJ1bnRpbWVQcmVzZXRNYXBwaW5ncyIgbmFtZT0iUnVudGltZSBQcmVzZXQgTWFwcGluZ3MgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGRlZmF1bHQgZmFjZXQgcHJlc2V0IGZvciBhbnkgUnVudGltZSBUeXBlIElELCBGYWNldCBJRCAmYW1wOyBGYWN0IFZlcnNpb24gY29tYmluYXRpb24uICBGb3IgZXhhbXBsZSwgZ2l2ZW4gcnVudGltZSB0eXBlIFgsIGZhY2V0IGpzdC53ZWIsIGFuZCB2ZXJzaW9uIDIuNCwgdGhlIHByZXNldCBZIHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0IHdoZXJlIGFzIGdpdmVuIHJ1bnRpbWUgdHlwZSBYLCBmYWNldCBqc3Qud2ViLCBhbmQgdmVyc2lvbiAyLjUsIHRoZSBwcmVzZXQgWiBzaG91bGQgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdC4KLQotRm9yIGVhY2ggb2YgdGhlIGZvdXIgZmFjZXRSdW50aW1lVHlwZUlELCBmYWNldFJ1bnRpbWVWZXJzaW9uLCBmYWNldElELCBmYWNldFZlcnNpb24gdGhlIGZvbGxvd2luZyBwYXR0ZXJuIGlzIHVzZWQgdG8gZWFzZSB0aGUgZGVmaW5pdGlvbiBwcm9jZXNzLiAgVGhlIHBhdHRlcm4gc3BlY2lmaWVkIGFsbG93cyBhIGNvbW1hIGRlbGltaW5hdGVkIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLiAgRm9yIGV4YW1wbGUgdG8gbWF0Y2ggb25seSAmcXVvdDsxLjAmcXVvdDsgdGhlIHBhdHRlcm4gc2hvdWxkIGJlICZxdW90OzEuMCZxdW90Oy4gIFRvIG1hdGNoIG11bHRpcGxlIHZhbHVlcywgc2F5IDEuMCwgMi4wLCBhbmQgMy4wLCB1c2UgJnF1b3Q7MS4wLDIuMCwzLjAmcXVvdDsuICBBc3RlcmVzdHMgbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSBtdWx0aXBsZSB2YWx1ZXMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7MS4qJnF1b3Q7IHdpbGwgbWF0Y2ggYW55IHZhbHVlcyBzdGFydGluZyB3aXRoICZhcG9zOzEuJmFwb3M7IGluY2x1ZGluZyAxLiwgMS4wLCAxLjEsIDEuMiwgYnV0IG5vdCAxICBMaWtld2lzZSwgJnF1b3Q7Ki4wJnF1b3Q7IHdpbGwgbWF0Y2ggYW55IHZhbHVlcyBlbmRpbmcgd2l0aCAmYXBvczsuMCZhcG9zOyBpbmNsdWRpbmcgMS4wLCAyLjAsIDMuMCwgYnV0IG5vdCAxIG9yIDAgIEFzdGVyaXN0cyBtYXkgYmUgYWRkZWQgYm90aCBhdCB0aGUgYmVnaW5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZywgc28gJnF1b3Q7KjAwKiZxdW90OyB3aWxsIG1hdGNoIGFueSBzdHJpbmcgdGhhdCBjb250YWlucyAmYXBvczswMCZhcG9zOyBzdWNoIGFzIDAwLCAxMDAsIDEwMDEuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtYXBwaW5nIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1hcHBpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEVhY2ggbWFwcGluZyBlbGVtZW50IGRlZmluZWRzIGEgbWFwcGluZyBmcm9tIChydW50aW1laWQsIGZhY2V0aWQsIGZhY2V0dmVyc2lvbikgdG8gcHJlc2V0aWQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY2V0UnVudGltZVR5cGVJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBGb2xsb3dzIHRoZSBwYXR0ZXJuIG91dGxpbmVkIGluIHRoZSBvdmVydmlldwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY2V0UnVudGltZVZlcnNpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRm9sbG93cyB0aGUgcGF0dGVybiBvdXRsaW5lZCBpbiB0aGUgb3ZlcnZpZXcKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWNldElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEZvbGxvd3MgdGhlIHBhdHRlcm4gb3V0bGluZWQgaW4gdGhlIG92ZXJ2aWV3Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjZXRWZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEZvbGxvd3MgdGhlIHBhdHRlcm4gb3V0bGluZWQgaW4gdGhlIG92ZXJ2aWV3Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlc2V0SUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L0lQcm9kdWN0Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L0lQcm9kdWN0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTJiYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9JUHJvZHVjdENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0OwotCi0vKioKLSAqIFRoZXNlIGNvbnN0YW50cyBkZWZpbmUgdGhlIHNldCBvZiBwcm9wZXJ0aWVzIHRoYXQgdGhpcyBwbHVnaW5nIGV4cGVjdHMgdG8KLSAqIGJlIGF2YWlsYWJsZSB2aWEgPGNvZGU+SVByb2R1Y3QuZ2V0UHJvcGVydHkoU3RyaW5nKTwvY29kZT4uIFRoZSBzdGF0dXMgb2YKLSAqIHRoaXMgaW50ZXJmYWNlIGFuZCB0aGUgZmFjaWxpdGllcyBvZmZlcmVkIGlzIGhpZ2hseSBwcm92aXNpb25hbC4gCi0gKiBQcm9kdWN0aXphdGlvbiBzdXBwb3J0IHdpbGwgYmUgcmV2aWV3ZWQgYW5kIHBvc3NpYmx5IG1vZGlmaWVkIGluIGZ1dHVyZSAKLSAqIHJlbGVhc2VzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdCNnZXRQcm9wZXJ0eShTdHJpbmcpCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUHJvZHVjdENvbnN0YW50cyB7ICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fQ09OVEVOVF9GT0xERVIgPSAiZWFyQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQ09OVEVOVF9GT0xERVIgPSAid2ViQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfQ09OVEVOVF9GT0xERVIgPSAiZWpiQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0NPTlRFTlRfRk9MREVSID0gImFwcENsaWVudENvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0NPTlRFTlRfRk9MREVSID0gImpjYUNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TT1VSQ0VfRk9MREVSID0gImRlZmF1bHRTb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1RPX0VBUl9CWV9ERUZBVUxUID0gImFkZFRvRWFyQnlEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GT0xERVIgPSAib3V0cHV0Rm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9TSU5HTEVfUk9PVF9TVFJVQ1RVUkUgPSAidXNlU2luZ2xlUm9vdFN0cnVjdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9QRVJTUEVDVElWRV9ISUVSQVJDSFlfVklFVyA9ICJpZFBlcnNwZWN0aXZlSGllcmFyY2h5VmlldyI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOX1dFQl9PVVRQVVRfRk9MREVSID0gImR5bldlYk91dHB1dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfT1VUUFVUX0ZPTERFUiA9ICJlamJPdXRwdXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9PVVRQVVRfRk9MREVSID0gImFwcENsaWVudE91dHB1dCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfT1VUUFVUX0ZPTERFUiA9ICJqY2FPdXRwdXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRJTElUWV9PVVRQVVRfRk9MREVSID0idXRpbE91dHB1dCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAKLSAgICAKLQkvKioKLSAgICAgKiBBbHRlcnMgdGhlIGZpbmFsIHBlcnNwZWN0aXZlIHVzZWQgYnkgdGhlIGZvbGxvd2luZyBuZXcgcHJvamVjdCB3aXphcmRzCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxfUEVSU1BFQ1RJVkVfV0VCID0gImZpbmFsUGVyc3BlY3RpdmVXZWIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxfUEVSU1BFQ1RJVkVfRUpCID0gImZpbmFsUGVyc3BlY3RpdmVFamIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxfUEVSU1BFQ1RJVkVfRUFSID0gImZpbmFsUGVyc3BlY3RpdmVFYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxfUEVSU1BFQ1RJVkVfQVBQQ0xJRU5UID0gImZpbmFsUGVyc3BlY3RpdmVBcHBDbGllbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxfUEVSU1BFQ1RJVkVfSkNBID0gImZpbmFsUGVyc3BlY3RpdmVKY2EiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxfUEVSU1BFQ1RJVkVfVVRJTElUWSA9ICJmaW5hbFBlcnNwZWN0aXZlVXRpbGl0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRV9TVEFUSUNXRUIgPSAiZmluYWxQZXJzcGVjdGl2ZVN0YXRpY1dlYiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBYmlsaXR5IHRvIGRlZmF1bHQgaW5pdGlhbCBydW50aW1lcyBjaG9zZW4gaW4gd2l6YXJkcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUlVOVElNRV8xID0gImRlZmF1bHRSdW50aW1lMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JVTlRJTUVfMiA9ICJkZWZhdWx0UnVudGltZTIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SVU5USU1FXzMgPSAiZGVmYXVsdFJ1bnRpbWUzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdFUl9TWU5DX0ZPUl9XRUJTRVJWSUNFUyA9ICJ2aWV3ZXJTeW5jRm9yV2Vic2VydmljZXMiOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L0lTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L0lTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMzI2M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9JU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gU2ltcGxlV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5jbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRElSID0gIklTdGF0aWNXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFTlRfRElSIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfUk9PVCA9ICJJU3RhdGljV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05URVhUX1JPT1QiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1Byb2R1Y3RNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1Byb2R1Y3RNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OWFhMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9Qcm9kdWN0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuUnVudGltZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcm9kdWN0TWFuYWdlciB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IHZhbHVlcyBmb3IgV1RQIGxldmVsIHByb2R1Y3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fQ09OVEVOVF9GT0xERVIgPSAiRWFyQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0NPTlRFTlRfRk9MREVSID0gIldlYkNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9DT05URU5UX0ZPTERFUiA9ICJlamJNb2R1bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfQ09OVEVOVF9GT0xERVIgPSAiYXBwQ2xpZW50TW9kdWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfQ09OVEVOVF9GT0xERVIgPSAiY29ubmVjdG9yTW9kdWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPVVJDRV9GT0xERVIgPSAic3JjIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVE9fRUFSX0JZX0RFRkFVTFQgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GT0xERVIgPSAiYnVpbGQvY2xhc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX1NJTkdMRV9ST09UX1NUUlVDVFVSRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV0VSX1NZTkNfRk9SX1dFQlNFUlZJQ0VTID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BFUlNQRUNUSVZFX0hJRVJBUkNIWV9WSUVXID0gIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkFMX1BFUlNQRUNUSVZFID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJVTlRJTUVfU0VQQVJBVE9SID0gJzonOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUlVOVElNRV9LRVlTID0gCi0JCQkJCQkJbmV3IFN0cmluZ1tde0lQcm9kdWN0Q29uc3RhbnRzLkRFRkFVTFRfUlVOVElNRV8xLAotCQkJCQkJCQkJCUlQcm9kdWN0Q29uc3RhbnRzLkRFRkFVTFRfUlVOVElNRV8yLAotCQkJCQkJCQkJCUlQcm9kdWN0Q29uc3RhbnRzLkRFRkFVTFRfUlVOVElNRV8zfTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgYXNzb2NpYXRlZCBrZXkgZnJvbSB0aGUgUGxhdGZvcm0gUHJvZHVjdCByZWdpc3RyeSBvciByZXR1cm4gdGhlCi0JICogV1RQIGRlZmF1bHQgZm9yIHRoZSBKMkVFIGNhc2VzLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiBwcm9kdWN0J3MgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlpZiAoUGxhdGZvcm0uZ2V0UHJvZHVjdCgpIT1udWxsKQotCQkJdmFsdWUgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkFQUExJQ0FUSU9OX0NPTlRFTlRfRk9MREVSKSkKLQkJCQlyZXR1cm4gQVBQTElDQVRJT05fQ09OVEVOVF9GT0xERVI7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLldFQl9DT05URU5UX0ZPTERFUikpCi0JCQkJcmV0dXJuIFdFQl9DT05URU5UX0ZPTERFUjsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuRUpCX0NPTlRFTlRfRk9MREVSKSkKLQkJCQlyZXR1cm4gRUpCX0NPTlRFTlRfRk9MREVSOwotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvZHVjdENvbnN0YW50cy5BUFBfQ0xJRU5UX0NPTlRFTlRfRk9MREVSKSkKLQkJCQlyZXR1cm4gQVBQX0NMSUVOVF9DT05URU5UX0ZPTERFUjsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuSkNBX0NPTlRFTlRfRk9MREVSKSkKLQkJCQlyZXR1cm4gSkNBX0NPTlRFTlRfRk9MREVSOwotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvZHVjdENvbnN0YW50cy5ERUZBVUxUX1NPVVJDRV9GT0xERVIpKQotCQkJCXJldHVybiBERUZBVUxUX1NPVVJDRV9GT0xERVI7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkFERF9UT19FQVJfQllfREVGQVVMVCkpCi0JCQkJcmV0dXJuIEFERF9UT19FQVJfQllfREVGQVVMVDsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuVVNFX1NJTkdMRV9ST09UX1NUUlVDVFVSRSkpCi0JCQkJcmV0dXJuIFVTRV9TSU5HTEVfUk9PVF9TVFJVQ1RVUkU7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLlZJRVdFUl9TWU5DX0ZPUl9XRUJTRVJWSUNFUykpCi0JCQkJcmV0dXJuIFZJRVdFUl9TWU5DX0ZPUl9XRUJTRVJWSUNFUzsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuT1VUUFVUX0ZPTERFUikpCi0JCQkJcmV0dXJuIE9VVFBVVF9GT0xERVI7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLklEX1BFUlNQRUNUSVZFX0hJRVJBUkNIWV9WSUVXKSkKLQkJCQlyZXR1cm4gSURfUEVSU1BFQ1RJVkVfSElFUkFSQ0hZX1ZJRVc7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX0FQUENMSUVOVCkpCi0JCQkJcmV0dXJuIEZJTkFMX1BFUlNQRUNUSVZFOwotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9FQVIpKQotCQkJCXJldHVybiBGSU5BTF9QRVJTUEVDVElWRTsKLQkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfRUpCKSkKLQkJCQlyZXR1cm4gRklOQUxfUEVSU1BFQ1RJVkU7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX0pDQSkpCi0JCQkJcmV0dXJuIEZJTkFMX1BFUlNQRUNUSVZFOwotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9TVEFUSUNXRUIpKQotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9VVElMSVRZKSkKLQkJCQlyZXR1cm4gRklOQUxfUEVSU1BFQ1RJVkU7Ci0JCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX1dFQikpCi0JCQkJcmV0dXJuIEZJTkFMX1BFUlNQRUNUSVZFOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZEFkZFRvRUFSQnlEZWZhdWx0KCkgewotCQlTdHJpbmcgdmFsdWUgPSBnZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BRERfVE9fRUFSX0JZX0RFRkFVTFQpOwotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFVzZVNpbmdsZVJvb3RTdHJ1Y3R1cmUoKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLlVTRV9TSU5HTEVfUk9PVF9TVFJVQ1RVUkUpOwotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFVzZVZpZXdlclN5bmNGb3JXZWJzZXJ2aWNlcygpIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuVklFV0VSX1NZTkNfRk9SX1dFQlNFUlZJQ0VTKTsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0Lyo8SVJ1bnRpbWU+Ki8gZ2V0RGVmYXVsdFJ1bnRpbWVzKCkgewotCQlMaXN0IHRoZVJ1bnRpbWVzID0gbnVsbDsKLQkJU2V0IHJ1bnRpbWVzID0gUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZXMoKTsKLQkJaWYgKCFydW50aW1lcy5pc0VtcHR5KCkpIHsKLQkJCUlSdW50aW1lIGRlZmF1bHRSdW50aW1lID0gbnVsbDsKLQkJCS8vCUZpcnN0IGNoZWNrIGlmIGRlZmF1bHRzIGFyZSBkZWZpbmVkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IERFRkFVTFRfUlVOVElNRV9LRVlTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZGVmYXVsdFJ1bnRpbWUgPSBnZXRNYXRjaGluZ1J1bnRpbWUoREVGQVVMVF9SVU5USU1FX0tFWVNbaV0sIHJ1bnRpbWVzKTsKLQkJCQlpZiAoZGVmYXVsdFJ1bnRpbWUgIT0gbnVsbCkgewotCQkJCQlpZiAodGhlUnVudGltZXMgPT0gbnVsbCkgewotCQkJCQkJdGhlUnVudGltZXMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQkJCQl9Ci0JCQkJCXRoZVJ1bnRpbWVzLmFkZChkZWZhdWx0UnVudGltZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0aGVSdW50aW1lcyA9PSBudWxsKSB7Ci0JCQl0aGVSdW50aW1lcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIHRoZVJ1bnRpbWVzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUnVudGltZSBnZXRNYXRjaGluZ1J1bnRpbWUoU3RyaW5nIGRlZmF1bHRQcm9kdWN0UnVudGltZVByb3BlcnR5LCBTZXQgcnVudGltZXMpIHsKLQkJU3RyaW5nIGRlZmF1bHRQcm9kdWN0UnVudGltZUtleSA9IGdldFByb3BlcnR5KGRlZmF1bHRQcm9kdWN0UnVudGltZVByb3BlcnR5KTsKLQkJaWYgKGRlZmF1bHRQcm9kdWN0UnVudGltZUtleSA9PSBudWxsIHx8IGRlZmF1bHRQcm9kdWN0UnVudGltZUtleS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvL1RoZSBkZWZhdWx0UHJvZHVjdFJ1bnRpbWVLZXkgbmVlZHMgdG8gYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQKLQkJLy88ZmFjZXQgcnVudGltZSBpZD46PGZhY2V0IHZlcnNpb24+LgotCQlpbnQgc2VwZXJhdG9ySW5kZXggPSBkZWZhdWx0UHJvZHVjdFJ1bnRpbWVLZXkuaW5kZXhPZihSVU5USU1FX1NFUEFSQVRPUik7Ci0JCWlmIChzZXBlcmF0b3JJbmRleCA8IDAgJiYgc2VwZXJhdG9ySW5kZXggPCBkZWZhdWx0UHJvZHVjdFJ1bnRpbWVLZXkubGVuZ3RoKCkpIHsKLQkJCS8vQ29uc2lkZXIgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGhlcmUuCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkludmFsaWQgZGVmYXVsdCBwcm9kdWN0IHJ1bnRpbWUgaWQuICBJdCBzaG91bGQgZm9sbG93IHRoZSBmb3JtYXQgPGZhY2V0IHJ1bnRpbWUgaWQ+OjxmYWNldCB2ZXJzaW9uPi4gIElkIHByb2Nlc3NlZDogIiArIGRlZmF1bHRQcm9kdWN0UnVudGltZUtleSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgZGVmYXVsdFJ1bnRpbWVJRCA9IGRlZmF1bHRQcm9kdWN0UnVudGltZUtleS5zdWJzdHJpbmcoMCwgc2VwZXJhdG9ySW5kZXgpOwotCQlTdHJpbmcgZGVmYXVsdEZhY2V0VmVyc2lvbiA9IGRlZmF1bHRQcm9kdWN0UnVudGltZUtleS5zdWJzdHJpbmcoc2VwZXJhdG9ySW5kZXggKyAxKTsKLQkJZm9yIChJdGVyYXRvciBydW50aW1lSXQgPSBydW50aW1lcy5pdGVyYXRvcigpOyBydW50aW1lSXQuaGFzTmV4dCgpOykgewotCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgcnVudGltZUl0Lm5leHQoKTsKLQkJCUxpc3QgcnVudGltZUNvbXBzID0gcnVudGltZS5nZXRSdW50aW1lQ29tcG9uZW50cygpOwotCQkJaWYgKCFydW50aW1lQ29tcHMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBjb21wc0l0ZXIgPSBydW50aW1lQ29tcHMuaXRlcmF0b3IoKTsgY29tcHNJdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSVJ1bnRpbWVDb21wb25lbnQgcnVudGltZUNvbXAgPSAoSVJ1bnRpbWVDb21wb25lbnQpIGNvbXBzSXRlci5uZXh0KCk7Ci0JCQkJCWlmIChkZWZhdWx0UnVudGltZUlELmVxdWFscyhydW50aW1lQ29tcC5nZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpLmdldElkKCkpICYmCi0JCQkJCQkoZGVmYXVsdEZhY2V0VmVyc2lvbi5lcXVhbHMocnVudGltZUNvbXAuZ2V0UnVudGltZUNvbXBvbmVudFZlcnNpb24oKS5nZXRWZXJzaW9uU3RyaW5nKCkpKSkgewotCQkJCQkJCXJldHVybiBydW50aW1lOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vTm8gbWF0Y2hlcyBmb3VuZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmM0NTJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBuYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJbmFtZXMuYWRkKENPTlRFTlRfRElSKTsKLQkJbmFtZXMuYWRkKENPTlRFWFRfUk9PVCk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRFTlRfRElSKSkgewotCQkJcmV0dXJuICJXZWJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OVEVYVF9ST09UKSkgewotCQkJcmV0dXJuIGdldFByb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGQUNFVF9JRCkpIHsKLQkJCXJldHVybiBJTW9kdWxlQ29uc3RhbnRzLldTVF9XRUJfTU9EVUxFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKEZBQ0VUX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQ09OVEVYVF9ST09ULCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjNTZmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1NpbXBsZVdlYkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCUlEYXRhTW9kZWwgbW9kZWwgPSAoSURhdGFNb2RlbCkgY29uZmlnOwotCQkJYWRkTmF0dXJlcyhwcm9qZWN0KTsKLQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LCBmYWxzZSk7Ci0JCQljLmNyZWF0ZSgwLCBudWxsKTsKLQkJCQotCQkJZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCWZpbmFsIElQYXRoIHBqcGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkJCWZpbmFsIElQYXRoIGNvbnRlbnRkaXIgPSBzZXRDb250ZW50UHJvcGVydHlJZk5lZWRlZChtb2RlbCwgcGpwYXRoLCBwcm9qZWN0KTsKLQkJCW1rZGlycyh3cy5nZXRSb290KCkuZ2V0Rm9sZGVyKGNvbnRlbnRkaXIpKTsKLQkJCQotCQkJZmluYWwgSVZpcnR1YWxGb2xkZXIgd2Vicm9vdCA9IGMuZ2V0Um9vdEZvbGRlcigpOwotCQkJaWYgKHdlYnJvb3QuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmVxdWFscyhuZXcgUGF0aCgiLyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJd2Vicm9vdC5jcmVhdGVMaW5rKG5ldyBQYXRoKCIvIiArIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFTlRfRElSKSksIDAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCUNvbXBvbmVudFV0aWxpdGllcy5zZXRTZXJ2ZXJDb250ZXh0Um9vdChwcm9qZWN0LG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFWFRfUk9PVCkpOwotCQkJCi0JCQl0cnkgewotCQkJCSgoSURhdGFNb2RlbE9wZXJhdGlvbikgbW9kZWwuZ2V0UHJvcGVydHkoRmFjZXREYXRhTW9kZWxQcm92aWRlci5OT1RJRklDQVRJT05fT1BFUkFUSU9OKSkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElQYXRoIHNldENvbnRlbnRQcm9wZXJ0eUlmTmVlZGVkKGZpbmFsIElEYXRhTW9kZWwgbW9kZWwsIGZpbmFsIElQYXRoIHBqcGF0aCwgSVByb2plY3QgcHJvamVjdCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmIChjLmV4aXN0cygpKSB7Ci0JCQlpZiggIWMuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5pc1Jvb3QoKSApewotCQkJCXJldHVybiBjLmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwanBhdGguYXBwZW5kKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFTlRfRElSKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5hdHVyZXMoZmluYWwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCWZpbmFsIFN0cmluZ1tdIGN1cnJlbnQgPSBkZXNjLmdldE5hdHVyZUlkcygpOwotCQlmaW5hbCBTdHJpbmdbXSByZXBsYWNlbWVudCA9IG5ldyBTdHJpbmdbY3VycmVudC5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShjdXJyZW50LCAwLCByZXBsYWNlbWVudCwgMCwgY3VycmVudC5sZW5ndGgpOwotCQlyZXBsYWNlbWVudFtjdXJyZW50Lmxlbmd0aF0gPSBJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQ7Ci0JCWRlc2Muc2V0TmF0dXJlSWRzKHJlcGxhY2VtZW50KTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBta2RpcnMoZmluYWwgSUZvbGRlciBmb2xkZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCWlmIChmb2xkZXIuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJbWtkaXJzKChJRm9sZGVyKSBmb2xkZXIuZ2V0UGFyZW50KCkpOwotCQkJfQotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1NpbXBsZVdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0OWY2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1NpbXBsZVdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JcHVibGljIFNpbXBsZVdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotICAgICAgICBDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXQ+IHJlcXVpcmVkRmFjZXRzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdEZhY2V0PigpOwotICAgICAgICByZXF1aXJlZEZhY2V0cy5hZGQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEUpKTsKLSAgICAgICAgc2V0UHJvcGVydHkoUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04sIHJlcXVpcmVkRmFjZXRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDU3OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVdlYkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0JcHVibGljIFNpbXBsZVdlYkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCS8vIFJlbW92ZSB0aGUgLmNvbXBvbmVudCBmaWxlCi0JCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLQkJCWZpbGUuZGVsZXRlKHRydWUsIG1vbml0b3IpOwotCQkJCi0JCQkvLyBSZW1vdmUgdGhlIG1vZHVsZSBjb3JlIG5hdHVyZQotCQkJUHJvamVjdFV0aWxpdGllcy5yZW1vdmVOYXR1cmVGcm9tUHJvamVjdChwcm9qZWN0LCBJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9EZWxlZ2F0ZUNvbmZpZ3VyYXRpb25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvRGVsZWdhdGVDb25maWd1cmF0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjhiZDQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9EZWxlZ2F0ZUNvbmZpZ3VyYXRpb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMTQsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgdXNlci1kZWZpbmVkIGNvbnRlbnRzIG9mIGFuIGV4dGVuc2lvbiBpbiBhIHBsdWctaW4gbWFuaWZlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0ZUNvbmZpZ3VyYXRpb25FbGVtZW50IGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHsKLQotCXByaXZhdGUgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlbGVnYXRlRWxlbWVudDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRUdBVEVfTkFNRSA9ICJkZWxlZ2F0ZUNvbmZpZ3VyYXRpb25FbGVtZW50IjsgLy8kTk9OLU5MUy0xJCAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRUdBVEVfTkFNRVNQQUNFID0gImRlbGVnYXRlQ29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFR0FURV9OVUxMX1NUUklORyA9ICJkZWxlZ2F0ZUNvbmZpZ3VyYXRpb25FbGVtZW50OiBOVUxMIjsgLy8kTk9OLU5MUy0xJCAKLQotCXB1YmxpYyBEZWxlZ2F0ZUNvbmZpZ3VyYXRpb25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBhRGVsZWdhdGUpIHsKLQkJZGVsZWdhdGVFbGVtZW50ID0gYURlbGVnYXRlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWxlZ2F0ZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZGVsZWdhdGVFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24ocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZGVsZWdhdGVFbGVtZW50LmVxdWFscyhvYmopOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlQXNJcyhTdHJpbmcgbmFtZSkgdGhyb3dzIEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChkZWxlZ2F0ZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZGVsZWdhdGVFbGVtZW50LmdldEF0dHJpYnV0ZUFzSXMobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbMF07Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0Q2hpbGRyZW4oU3RyaW5nIG5hbWUpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDb25maWd1cmF0aW9uRWxlbWVudFswXTsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXRDaGlsZHJlbihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIElFeHRlbnNpb24gZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkgdGhyb3dzIEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChkZWxlZ2F0ZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgdGhyb3dzIEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChkZWxlZ2F0ZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBERUxFR0FURV9OQU1FOwotCQlyZXR1cm4gZGVsZWdhdGVFbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIERFTEVHQVRFX05BTUVTUEFDRTsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXROYW1lc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUFzSXMoKSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuZ2V0VmFsdWVBc0lzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuaXNWYWxpZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIERFTEVHQVRFX05VTExfU1RSSU5HOwotCQlyZXR1cm4gZGVsZWdhdGVFbGVtZW50LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCB0b0VxdWlub3goKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb250cmlidXRvciBnZXRDb250cmlidXRvcigpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uKCk7Ci0JCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZUlkZW50aWZpZXIoKSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIERFTEVHQVRFX05BTUVTUEFDRTsKLQkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL0lTaW1wbGVXZWJNb2R1bGVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9JU2ltcGxlV2ViTW9kdWxlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OGUyNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL0lTaW1wbGVXZWJNb2R1bGVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBJU2ltcGxlV2ViTW9kdWxlQ29uc3RhbnRzCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR19JTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud2ViIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19QUk9KRUNUX1RZUEUgPSAiU1RBVElDIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ESVJFQ1RPUlkgPSAidGhlbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19ESVJFQ1RPUlkgPSAiV0VCLUlORiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX0RJUkVDVE9SWSA9ICJsaWIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NFU19ESVJFQ1RPUlkgPSAiY2xhc3NlcyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9JV1NUV2ViUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9JV1NUV2ViUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0ZTdhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvSVdTVFdlYlByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdTVFdlYlByZWZlcmVuY2VzIHsKLQlTdHJpbmcgUFJFRl9TVEFUSUNXRUJDT05URU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2Uuc3RhdGljV2ViQ29udGVudE5hbWUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzI3ZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1Jlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJzdGF0aWN3ZWJwcm9qZWN0IjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhdGljV2ViUHJvamVjdENyZWF0aW9uV2l6YXJkX1dpemFyZF9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2VfUGFnZV9EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGF0aWNXZWJTZXR0aW5nc1Byb3BlcnRpZXNQYWdlX1dlYl9Db250ZW50X0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YXRpY0NvbnRleHRSb290Q29tcG9zaXRlX0NvbnRleHRfUm9vdF9MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2VfUGFnZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGF0aWNXZWJTZXR0aW5nc1Byb3BlcnRpZXNQYWdlX05vdF9hdmFpbGFibGVfZm9yX2Nsb3NlZF9wcm9qZWN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRSdW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RvdERvdERvdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkU2VydmVyVGFyZ2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZVNldHRpbmdzOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dTVFdlYlBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dTVFdlYlBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODU2ZTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XU1RXZWJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IGphdmEubGFuZy5UaHJvd2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgV1NUV2ViUGx1Z2luIGV4dGVuZHMgUGx1Z2luCi17Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdTVFdlYlBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIFdTVFdlYlByZWZlcmVuY2VzIHByZWZlcmVuY2VzOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fQlVJTERFUl9JRCA9IFZhbGlkYXRpb25QbHVnaW4uVkFMSURBVElPTl9CVUlMREVSX0lEOyAvLyBwbHVnaW4KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElDT05fRElSUyA9IG5ldyBTdHJpbmdbXXsiaWNvbnMvZnVsbC9vYmoxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9jdG9vbDE2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL3dpemJhbiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMiLCAvLyROT04tTkxTLTEkCi0JCQkJIiJ9OyAvLyROT04tTkxTLTEkCi0KLQkvL3RoZSBJRCBmb3IgdGhpcyBwbHVnaW4gKGFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgbG9nZ2luZyBxdWlja2ZpeCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LndlYiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFdTVFdlYlBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBXU1RXZWJQbHVnaW4gZ2V0RGVmYXVsdCgpCi0JewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSB7Ci0JCWdldFdTVFdlYlByZWZlcmVuY2VzKCkuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBXU1RXZWJQcmVmZXJlbmNlcyBnZXRXU1RXZWJQcmVmZXJlbmNlcygpIHsKLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMucHJlZmVyZW5jZXMgPSBuZXcgV1NUV2ViUHJlZmVyZW5jZXModGhpcyk7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHNldmVyaXR5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoUExVR0lOX0lELElTdGF0dXMuRVJST1IsbmV3IElTdGF0dXNbXXtleGNlcHRpb24uZ2V0U3RhdHVzKCl9LG1lc3NhZ2UsZXhjZXB0aW9uKTsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIHN0YXR1cyApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XU1RXZWJQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dTVFdlYlByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNTI1NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dTVFdlYlByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotCi1wdWJsaWMgY2xhc3MgV1NUV2ViUHJlZmVyZW5jZXMgewotCXB1YmxpYyBpbnRlcmZhY2UgS2V5cyB7Ci0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVElDX1dFQl9DT05URU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2Uuc3RhdGljV2ViQ29udGVudE5hbWUiOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyBpbnRlcmZhY2UgVmFsdWVzIHsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSAiV2ViQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHVibGljIGludGVyZmFjZSBEZWZhdWx0cyB7Ci0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVElDX1dFQl9DT05URU5UID0gVmFsdWVzLlNUQVRJQ19XRUJfQ09OVEVOVDsKLQl9Ci0JcHJpdmF0ZSBQbHVnaW4gb3duZXIgPSBudWxsOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBwZXJzaXN0T25DaGFuZ2UgPSBmYWxzZTsKLQkKLQlwdWJsaWMgV1NUV2ViUHJlZmVyZW5jZXMoUGx1Z2luIG93bmVyKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuU1RBVElDX1dFQl9DT05URU5ULCBEZWZhdWx0cy5TVEFUSUNfV0VCX0NPTlRFTlQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFN0YXRpY1dlYkNvbnRlbnRGb2xkZXJOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdGF0aWNXZWJDb250ZW50Rm9sZGVyTmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShLZXlzLlNUQVRJQ19XRUJfQ09OVEVOVCwgdmFsdWUpOwotCQlmaXJlUHJlZmVyZW5jZUNoYW5nZWQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCkgewotCQlpZiAoaXNQZXJzaXN0T25DaGFuZ2UoKSkKLQkJCXBlcnNpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJzaXN0KCkgewotCQlnZXRPd25lcigpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGVyc2lzdE9uQ2hhbmdlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdE9uQ2hhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0T25DaGFuZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBlcnNpc3RPbkNoYW5nZQotCSAqICAgICAgICAgICAgVGhlIHBlcnNpc3RPbkNoYW5nZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdE9uQ2hhbmdlKGJvb2xlYW4gcGVyc2lzdE9uQ2hhbmdlKSB7Ci0JCXRoaXMucGVyc2lzdE9uQ2hhbmdlID0gcGVyc2lzdE9uQ2hhbmdlOwotCX0KLQotCXByaXZhdGUgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmICh0aGlzLnByZWZlcmVuY2VzID09IG51bGwpCi0JCQl0aGlzLnByZWZlcmVuY2VzID0gZ2V0T3duZXIoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdGhpcy5wcmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG93bmVyLgotCSAqLwotCXByaXZhdGUgUGx1Z2luIGdldE93bmVyKCkgewotCQlyZXR1cm4gdGhpcy5vd25lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvV2ViUHJvcGVydGllc1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XZWJQcm9wZXJ0aWVzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjI0OTgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XZWJQcm9wZXJ0aWVzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJQcm9wZXJ0aWVzVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEJBRF9DSEFSUyA9IHsnLycsICdcXCcsICc6J307Ci0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ci0JICovCi0JLyoqCi0JICogUmV0dXJucyBhIGVycm9yIG1lc3NhZ2UgdGhhdCBzdGF0ZXMgd2hldGhlciBhIGNvbnRleHQgcm9vdCBpcyB2YWxpZCBvciBub3QgcmV0dXJucyBudWxsIGlmCi0JICogY29udGV4dCByb290IGlzIGZpbmUKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29udGV4dFJvb3QKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZUNvbnRleHRSb290KFN0cmluZyBjb250ZXh0Um9vdCkgewotCi0JCWlmIChjb250ZXh0Um9vdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBjb250ZXh0Um9vdDsKLQkJaWYgKG5hbWUuZXF1YWxzKCIiKSB8fCBuYW1lID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gIHRoaXMgd2FzIGFkZGVkIGJlY2F1c2UgdGhlIGVycm9yIG1lc3NhZ2Ugc2hvdWxkbnQgYmUgc2hvd24gaW5pdGlhbGx5LiBJdCBzaG91bGQgYmUKLQkJCS8vIHNob3duIG9ubHkgaWYgY29udGV4dCByb290IGZpZWxkIGlzIGVkaXRlZCB0bwotCQkJZXJyb3JNZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLlN0YXRpY1dlYlByb2plY3RXaXphcmRCYXNlUGFnZV9QYWdlX1RpdGxlOyAKLQkJCQotCQkJLy9lcnJvck1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvbnRleHRfUm9vdF9jYW5ub3RfYmVfZW1wdHlfMiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCQl9Ci0KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJICogLy8gSlogLSBmaXggdG8gZGVmZWN0IDIwNDI2NCwgIi8iIGlzIHZhbGlkIGluIGNvbnRleHQgcm9vdCBpZiAobmFtZS5pbmRleE9mKCIvLyIpICE9IC0xKSB7Ci0JCSAqIC8vJE5PTi1OTFMtMSQgZXJyb3JNZXNzYWdlID0gIi8vIGFyZSBpbnZhbGlkIGNoYXJhY3RlcnMgaW4gYSByZXNvdXJjZSBuYW1lIjsgcmV0dXJuCi0JCSAqIGVycm9yTWVzc2FnZTsKLQkJICogIH0KLQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCQlpZiAobmFtZS50cmltKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmFtZSwgIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0ZXIgOiB3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgdG9rZW4gPSBzdG9rLm5leHRUb2tlbigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoKCk7IGkrKykgewotCQkJCQlpZiAoISh0b2tlbi5jaGFyQXQoaSkgPT0gJ18nKSAmJiAhKHRva2VuLmNoYXJBdChpKSA9PSAnLScpICYmICEodG9rZW4uY2hhckF0KGkpID09ICcvJykgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCh0b2tlbi5jaGFyQXQoaSkpID09IGZhbHNlKSB7Ci0JCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0b2tlbi5jaGFyQXQoaSkpKSB7Ci0JCQkJCQkJLy9SZW1vdmVkIGJlY2F1c2UgY29udGV4dCByb290cyBjYW4gY29udGFpbiB3aGl0ZSBzcGFjZQotCQkJCQkJCS8vZXJyb3JNZXNzYWdlID0KLQkJCQkJCQkvLwlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfQ29udGV4dF9yb290X2Nhbm5vdF9jb250YV9VSV8iKTsvLyROT04tTkxTLTEkCi0JCQkJCQkJLy8gPSAiIENvbnRleHQgcm9vdCBjYW5ub3QgY29udGFpbiB3aGl0ZXNwYWNlcy4iCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVycm9yTWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5TdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2VfUGFnZV9UaXRsZTsgCi0JCQkJCQkJCi0JCQkJCQkJLy9lcnJvck1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9jaGFyYWN0ZXJfaXNfaW52YWxpZF9pbl9hX2NvbnRleHRfcm9vdCIsIG5ldyBPYmplY3RbXXsobmV3IENoYXJhY3Rlcih0b2tlbi5jaGFyQXQoaSkpKS50b1N0cmluZygpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhayBvdXRlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSAvLyBlbi8gZW5kIG9mIGlmKG5hbWUudHJpbQotCQllbHNlCi0JCQllcnJvck1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuU3RhdGljV2ViUHJvamVjdFdpemFyZEJhc2VQYWdlX1BhZ2VfVGl0bGU7IAotCQkJLy9lcnJvck1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk5hbWVzX2Nhbm5vdF9iZWdpbl9vcl9lbmRfd2l0aF93aGl0ZXNwYWNlXzUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGFueSBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgYXJyYXkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgc3RyLCBjaGFyW10gY2hhcnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHN0ci5pbmRleE9mKGNoYXJzW2ldKSAhPSAtMSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZUZvbGRlck5hbWUoU3RyaW5nIGZvbGRlck5hbWUpIHsKLQkJaWYgKGZvbGRlck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBSZXNvdXJjZUhhbmRsZXIuU3RhdGljV2ViUHJvamVjdFdpemFyZEJhc2VQYWdlX1BhZ2VfVGl0bGU7IAotCQkJCi0JCQkvL3JldHVybiBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZvbGRlcl9uYW1lX2Nhbm5vdF9iZV9lbXB0eV8yIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY29udGFpbnMoZm9sZGVyTmFtZSwgQkFEX0NIQVJTKSkKLQkJCXJldHVybiBSZXNvdXJjZUhhbmRsZXIuU3RhdGljV2ViUHJvamVjdFdpemFyZEJhc2VQYWdlX1BhZ2VfVGl0bGU7IAotCQkJCi0JCQkvL3JldHVybiBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZvbGRlcl9uYW1lX2lzX25vdF92YWxpZCIsIG5ldyBPYmplY3RbXXtmb2xkZXJOYW1lfSk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9Db21wb25lbnREZXBsb3lhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvQ29tcG9uZW50RGVwbG95YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzUxMzYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9Db21wb25lbnREZXBsb3lhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Qcm9qZWN0TW9kdWxlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50RGVwbG95YWJsZSBleHRlbmRzIFByb2plY3RNb2R1bGUgewotCi0JcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3QgbWVtYmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgQ29tcG9uZW50RGVwbG95YWJsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMocHJvamVjdCxDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KSk7Ci0JfQotCQotCXB1YmxpYyBDb21wb25lbnREZXBsb3lhYmxlKElQcm9qZWN0IHByb2plY3QsIElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJc3VwZXIocHJvamVjdCk7Ci0JCXRoaXMuY29tcG9uZW50ID0gYUNvbXBvbmVudDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUoyRUVNb2R1bGUjaXNCaW5hcnkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmluYXJ5KCkgewotCQlpZiAoY29tcG9uZW50PT1udWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gY29tcG9uZW50LmlzQmluYXJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCB0aGUgcmVzb3VyY2VzIGZyb20gbXIgdG8gdGhlIGV4aXN0aW5nIHJlc291cmNlcyBpbiBNb2R1bGUgRm9sZGVyIG1mCi0JICogQHBhcmFtIE1vZHVsZUZvbGRlciBtZgotCSAqIEBwYXJhbSBJTW9kdWxlUmVzb3VyY2VbXSBtcgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRNZW1iZXJzVG9Nb2R1bGVGb2xkZXIoTW9kdWxlRm9sZGVyIG1mLCBJTW9kdWxlUmVzb3VyY2VbXSBtcikgewotCQkvLyBJZiB0aGUgZm9sZGVyIGlzIG51bGwgb3IgdGhlIHJlc291cmNlcyB0byBhZGQgYXJlIG51bGwgb3IgZW1wdHksIGJhaWwgYW5kIHJldHVybgotCQlpZiAobWYgPT0gbnVsbCB8fCBtciA9PSBudWxsIHx8IG1yLmxlbmd0aD09MCkgCi0JCQlyZXR1cm47Ci0JCS8vIEdldCB0aGUgZXhpc3RpbmcgbWVtYmVycyBpbiB0aGUgbW9kdWxlIGZvbGRlcgotCQlJTW9kdWxlUmVzb3VyY2VbXSBtZl9tZW1iZXJzID0gbWYubWVtYmVycygpOwotCQlpbnQgbWZfc2l6ZSA9IDA7Ci0JCS8vIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBleGlzdGluZyBtZW1iZXJzIGluIHRoZSBtb2R1bGUgZm9sZGVyCi0JCWlmIChtZl9tZW1iZXJzICE9IG51bGwpCi0JCQltZl9zaXplID0gbWZfbWVtYmVycy5sZW5ndGg7Ci0JCS8vIENyZWF0ZSBhIG5ldyBhcnJheSB0byBzZXQgb24gdGhlIG1vZHVsZSBmb2xkZXIgd2hpY2ggd2lsbCBjb21iaW5lIHRoZSBleGlzdGluZyBhbmQKLQkJLy8gbmV3IG1vZHVsZSByZXNvdXJjZXMKLQkJSU1vZHVsZVJlc291cmNlW10gcmVzID0gbmV3IElNb2R1bGVSZXNvdXJjZVttZl9zaXplICsgbXIubGVuZ3RoXTsKLQkJLy8gQ29weSB0aGUgZXhpc3RpbmcgbWVtYmVycyBpbnRvIHRoZSBhcnJheSBpZiB0aGVyZSBhcmUgYW55Ci0JCWlmIChtZl9tZW1iZXJzICE9IG51bGwgJiYgbWZfc2l6ZSA+IDApCi0JCQlTeXN0ZW0uYXJyYXljb3B5KG1mX21lbWJlcnMsIDAsIHJlcywgMCwgbWZfc2l6ZSk7Ci0JCS8vIENvcHkgdGhlIG5ldyBtZW1iZXJzIGludG8gdGhlIGFycmF5Ci0JCVN5c3RlbS5hcnJheWNvcHkobXIsIDAsIHJlcywgbWZfc2l6ZSwgbXIubGVuZ3RoKTsKLQkJLy8gU2V0IHRoZSBuZXcgbWVtYmVycyBhcnJheSBvbiB0aGUgbW9kdWxlIGZvbGRlcgotCQltZi5zZXRNZW1iZXJzKHJlcyk7Ci0JfQotCi0JIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoaWxkIG1vZHVsZXMgb2YgdGhpcyBtb2R1bGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVtdCi0gICAgICovCi0gICAgcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRNb2R1bGVzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcygpIHsKLQkJTGlzdCBtb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLQkgICAgCUlWaXJ0dWFsUmVmZXJlbmNlW10gY29tcG9uZW50cyA9IGdldFJlZmVyZW5jZXMoY29tcG9uZW50KTsKLQkgICAgCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbXBvbmVudHNbaV07Ci0JCQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsICYmIHJlZmVyZW5jZS5nZXREZXBlbmRlbmN5VHlwZSgpPT1JVmlydHVhbFJlZmVyZW5jZS5ERVBFTkRFTkNZX1RZUEVfVVNFUykgewotCQkJCQlJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCUlNb2R1bGUgbW9kdWxlID0gZ2F0aGVyTW9kdWxlUmVmZXJlbmNlKGNvbXBvbmVudCwgdmlydHVhbENvbXApOwotCQkJCQlpZiAobW9kdWxlICE9IG51bGwgJiYgIW1vZHVsZXMuY29udGFpbnMobW9kdWxlKSkKLQkJCQkJCW1vZHVsZXMuYWRkKG1vZHVsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICAgIHJldHVybiAoSU1vZHVsZVtdKSBtb2R1bGVzLnRvQXJyYXkobmV3IElNb2R1bGVbbW9kdWxlcy5zaXplKCldKTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0gICAgCXJldHVybiBhQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElNb2R1bGUgZ2F0aGVyTW9kdWxlUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ICkgewotICAgIAkvLyBIYW5kbGUgd29ya3NwYWNlIHByb2plY3QgbW9kdWxlIGNvbXBvbmVudHMKLQkJaWYgKHRhcmdldENvbXBvbmVudCAhPSBudWxsICYmIHRhcmdldENvbXBvbmVudC5nZXRQcm9qZWN0KCkhPWNvbXBvbmVudC5nZXRQcm9qZWN0KCkpIHsKLQkJCWlmICghdGFyZ2V0Q29tcG9uZW50LmlzQmluYXJ5KCkpCi0JCQkJcmV0dXJuIFNlcnZlclV0aWwuZ2V0TW9kdWxlKHRhcmdldENvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBGaW5kIHRoZSBtb2R1bGUgcmVzb3VyY2VzIGZvciBhIGdpdmVuIGNvbnRhaW5lciBhbmQgcGF0aC4gSW5zZXJ0cyBpbiB0aGUgamF2YSBjb250YWluZXJzCi0JICogYXQgYSBnaXZlbiBwYXRoIGlmIG5vdCBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBjb250IGEgY29udGFpbmVyCi0JICogQHBhcmFtIHBhdGggdGhlIGN1cnJlbnQgbW9kdWxlIHJlbGF0aXZlIHBhdGgKLQkgKiBAcGFyYW0gamF2YVBhdGggdGhlIHBhdGggd2hlcmUgSmF2YSByZXNvdXJjZXMgZml0IGluIHRoZSByb290Ci0JICogQHBhcmFtIGphdmFDb250Ci0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIG1vZHVsZSByZXNvdXJjZXMKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gZ2V0TWVtYmVycyhJQ29udGFpbmVyIGNvbnQsIElQYXRoIHBhdGgsIElQYXRoIGphdmFQYXRoLCBJQ29udGFpbmVyW10gamF2YUNvbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlW10gcmVzID0gY29udC5tZW1iZXJzKCk7Ci0JCWludCBzaXplMiA9IHJlcy5sZW5ndGg7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZTIpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCWlmIChyZXNbal0gaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJSUNvbnRhaW5lciBjYyA9IChJQ29udGFpbmVyKSByZXNbal07Ci0JCQkJCi0JCQkJSVBhdGggbmV3UGF0aCA9IHBhdGguYXBwZW5kKGNjLmdldE5hbWUoKSkubWFrZVJlbGF0aXZlKCk7Ci0JCQkJLy8gUmV0cmlldmUgYWxyZWFkeSBleGlzdGluZyBtb2R1bGUgZm9sZGVyIGlmIGFwcGxpY2FibGUKLQkJCQlNb2R1bGVGb2xkZXIgbWYgPSAoTW9kdWxlRm9sZGVyKSBnZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKG1lbWJlcnMsbmV3UGF0aCk7Ci0JCQkJaWYgKG1mID09IG51bGwpIHsKLQkJCQkJbWYgPSBuZXcgTW9kdWxlRm9sZGVyKGNjLCBjYy5nZXROYW1lKCksIHBhdGgpOwotCQkJCQlNb2R1bGVGb2xkZXIgcGFyZW50ID0gKE1vZHVsZUZvbGRlcikgZ2V0RXhpc3RpbmdNb2R1bGVSZXNvdXJjZShtZW1iZXJzLCBwYXRoKTsKLQkJCQkJaWYgKHBhdGguaXNFbXB0eSgpKQotCQkJCQkJbWVtYmVycy5hZGQobWYpOwotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJCQlwYXJlbnQgPSBlbnN1cmVQYXJlbnRFeGlzdHMocGF0aCwgY2MpOwotCQkJCQkJYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKHBhcmVudCwgbmV3IElNb2R1bGVSZXNvdXJjZVtdIHttZn0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gZ2V0TWVtYmVycyhjYywgbmV3UGF0aCwgamF2YVBhdGgsIGphdmFDb250KTsKLQkJCQkKLQkJCQlpZiAoamF2YVBhdGggIT0gbnVsbCAmJiBuZXdQYXRoLmlzUHJlZml4T2YoamF2YVBhdGgpKQotCQkJCQltciA9IGhhbmRsZUphdmFQYXRoKHBhdGgsIGphdmFQYXRoLCBuZXdQYXRoLCBqYXZhQ29udCwgbXIsIGNjKTsKLQotCQkJCWFkZE1lbWJlcnNUb01vZHVsZUZvbGRlcihtZiwgbXIpOwotCQkJCQotCQkJfSBlbHNlIHsKLQkJCQlJRmlsZSBmID0gKElGaWxlKSByZXNbal07Ci0JCQkJLy8gSGFuZGxlIHRoZSBkZWZhdWx0IHBhY2thZ2UgY2FzZQotCQkJCWlmIChwYXRoLmVxdWFscyhqYXZhUGF0aCkpIHsKLQkJCQkJTW9kdWxlRm9sZGVyIG1Gb2xkZXIgPSAoTW9kdWxlRm9sZGVyKSBnZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKG1lbWJlcnMsamF2YVBhdGgpOwotCQkJCQlJTW9kdWxlRmlsZSBtRmlsZSA9IGNyZWF0ZU1vZHVsZUZpbGUoZiwgamF2YVBhdGgpOwotCQkJCQlpZiAobUZvbGRlciAhPSBudWxsKQotCQkJCQkJYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKG1Gb2xkZXIsbmV3IElNb2R1bGVSZXNvdXJjZVtde21GaWxlfSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWxpc3QuYWRkKG1GaWxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJTW9kdWxlRmlsZSBtZiA9IGNyZWF0ZU1vZHVsZUZpbGUoZiwgcGF0aCk7Ci0JCQkJCWxpc3QuYWRkKG1mKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBuZXcgSU1vZHVsZVJlc291cmNlW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KG1yKTsKLQkJcmV0dXJuIG1yOwotCX0KLQkKLQlwcm90ZWN0ZWQgSU1vZHVsZUZpbGUgY3JlYXRlTW9kdWxlRmlsZShmaW5hbCBJRmlsZSBmaWxlLCBmaW5hbCBJUGF0aCBwYXRoKSB7Ci0JCXJldHVybiBuZXcgTW9kdWxlRmlsZShmaWxlLCBmaWxlLmdldE5hbWUoKSwgcGF0aCwgZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpICsgZmlsZS5nZXRMb2NhbFRpbWVTdGFtcCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGdldE1lbWJlcnMoSVZpcnR1YWxDb250YWluZXIgY29udCwgSVBhdGggcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVmlydHVhbFJlc291cmNlW10gcmVzID0gY29udC5tZW1iZXJzKCk7Ci0JCWludCBzaXplMiA9IHJlcy5sZW5ndGg7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZTIpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCWlmIChyZXNbal0gaW5zdGFuY2VvZiBJVmlydHVhbENvbnRhaW5lcikgewotCQkJCUlWaXJ0dWFsQ29udGFpbmVyIGNjID0gKElWaXJ0dWFsQ29udGFpbmVyKSByZXNbal07Ci0JCQkJLy8gUmV0cmlldmUgYWxyZWFkeSBleGlzdGluZyBtb2R1bGUgZm9sZGVyIGlmIGFwcGxpY2FibGUKLQkJCQlNb2R1bGVGb2xkZXIgbWYgPSAoTW9kdWxlRm9sZGVyKSBnZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKG1lbWJlcnMscGF0aC5hcHBlbmQobmV3IFBhdGgoY2MuZ2V0TmFtZSgpKS5tYWtlUmVsYXRpdmUoKSkpOwotCQkJCWlmIChtZiA9PSBudWxsKSB7Ci0JCQkJCW1mID0gbmV3IE1vZHVsZUZvbGRlcigoSUNvbnRhaW5lciljYy5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSwgY2MuZ2V0TmFtZSgpLCBwYXRoKTsKLQkJCQkJTW9kdWxlRm9sZGVyIHBhcmVudCA9IChNb2R1bGVGb2xkZXIpIGdldEV4aXN0aW5nTW9kdWxlUmVzb3VyY2UobWVtYmVycywgcGF0aCk7Ci0JCQkJCWlmIChwYXRoLmlzRW1wdHkoKSkKLQkJCQkJCW1lbWJlcnMuYWRkKG1mKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQkJCQkJcGFyZW50ID0gZW5zdXJlUGFyZW50RXhpc3RzKHBhdGgsIChJQ29udGFpbmVyKWNjLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpKTsKLQkJCQkJCWFkZE1lbWJlcnNUb01vZHVsZUZvbGRlcihwYXJlbnQsIG5ldyBJTW9kdWxlUmVzb3VyY2VbXSB7bWZ9KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IGdldE1lbWJlcnMoY2MsIHBhdGguYXBwZW5kKGNjLmdldE5hbWUoKSkpOwotCQkJCWFkZE1lbWJlcnNUb01vZHVsZUZvbGRlcihtZiwgbXIpOwotCQkJfSBlbHNlIHsKLQkJCQlJRmlsZSBmID0gKElGaWxlKSByZXNbal0uZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCQkJSU1vZHVsZUZpbGUgbWYgPSBudWxsOwotCQkJCWlmIChzaG91bGRBZGRDb21wb25lbnRGaWxlKGYpKSB7Ci0JCQkJCW1mID0gY3JlYXRlTW9kdWxlRmlsZShmLCBwYXRoKTsKLQkJCQkJbGlzdC5hZGQobWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkobXIpOwotCQlyZXR1cm4gbXI7Ci0JfQotCQotCXByb3RlY3RlZCBNb2R1bGVGb2xkZXIgZW5zdXJlUGFyZW50RXhpc3RzKElQYXRoIHBhdGgsIElDb250YWluZXIgY2MpIHsKLQkJTW9kdWxlRm9sZGVyIHBhcmVudCA9IChNb2R1bGVGb2xkZXIpIGdldEV4aXN0aW5nTW9kdWxlUmVzb3VyY2UobWVtYmVycywgcGF0aCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbGRlck5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQlJUGF0aCBmb2xkZXJQYXRoID0gUGF0aC5FTVBUWTsKLQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpPjEpCi0JCQkJZm9sZGVyUGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJcGFyZW50ID0gbmV3IE1vZHVsZUZvbGRlcihjYywgZm9sZGVyTmFtZSwgZm9sZGVyUGF0aCk7Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKT4xKQotCQkJCWFkZE1lbWJlcnNUb01vZHVsZUZvbGRlcihlbnN1cmVQYXJlbnRFeGlzdHMocGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksY2MpLCBuZXcgSU1vZHVsZVJlc291cmNlW10ge3BhcmVudH0pOwotCQkJZWxzZQotCQkJCW1lbWJlcnMuYWRkKHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLiAgUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRvIGFkZCB0aGlzIGZpbGUKLQkgKiB0byB0aGUgbWVtYmVycyBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBib29sZWFuIHNob3VsZCBhZGQgZmlsZT8KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBZGRDb21wb25lbnRGaWxlKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoZSBjdXJyZW50IGNhY2hlIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbW9kdWxlIHJlc291cmNlIGZvcgotCSAqIHRoZSBnaXZlbiBwYXRoLgotCSAqIEBwYXJhbSBhTGlzdAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybiBhbiBleGlzdGluZyBtb2R1bGVSZXNvdXJjZSBmcm9tIHRoZSBjYWNoZWQgcmVzdWx0Ci0JICovCi0JIAotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2UgZ2V0RXhpc3RpbmdNb2R1bGVSZXNvdXJjZShMaXN0IGFMaXN0LCBJUGF0aCBwYXRoKSB7IAotICAgIAkvLyBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgcmV0dXJuIG51bGwKLSAgICAJaWYgKGFMaXN0PT1udWxsIHx8IGFMaXN0LmlzRW1wdHkoKSB8fCBwYXRoID09IG51bGwpCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJLy8gT3RoZXJ3aXNlIHJlY3Vyc2l2ZWx5IGNoZWNrIHRvIHNlZSBpZiBnaXZlbiByZXNvdXJjZSBtYXRjaGVzIGN1cnJlbnQgcmVzb3VyY2Ugb3IgaWYgaXQgaXMgYSBjaGlsZAotICAgIAlTdHJpbmdbXSBwYXRoU2VnbWVudHMgPSBwYXRoLnNlZ21lbnRzKCk7IAotICAgIAlJTW9kdWxlUmVzb3VyY2UgbW9kdWxlUmVzb3VyY2UgPSBudWxsOwotICAgIAkKLSAgICAJaWYocGF0aFNlZ21lbnRzLmxlbmd0aCA9PSAwKQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCWZvciAoSXRlcmF0b3IgaXRlciA9IGFMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgIAkJbW9kdWxlUmVzb3VyY2UgPSAoSU1vZHVsZVJlc291cmNlKSBpdGVyLm5leHQoKTsgICAgIAkKLSAgICAJCVN0cmluZ1tdIG1vZHVsZVNlZ21lbnRzID0gbW9kdWxlUmVzb3VyY2UuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuc2VnbWVudHMoKTsKLSAgICAJCS8vIElmIHRoZSBsYXN0IHNlZ21lbnQgaW4gcGFzc2VkIGluIHBhdGggZXF1YWxzIHRoZSBtb2R1bGUgcmVzb3VyY2UgbmFtZSAKLSAgICAJCS8vIGFuZCBzZWdtZW50IGNvdW50IGlzIHRoZSBzYW1lIGFuZCB0aGUgcGF0aCBzZWdtZW50cyBzdGFydCB3aXRoIHRoZSBtb2R1bGUgcGF0aCBzZWdtZW50cwotICAgIAkJLy8gdGhlbiB3ZSBoYXZlIGEgbWF0Y2ggYW5kIHdlIHJldHVybiB0aGUgZXhpc3RpbmcgbW9kdWxlUmVzb3VyY2UKLSAgICAJCWlmIChwYXRoU2VnbWVudHNbcGF0aFNlZ21lbnRzLmxlbmd0aCAtIDFdLmVxdWFscyhtb2R1bGVSZXNvdXJjZS5nZXROYW1lKCkpICYmIAotCQkgICAgCQkobW9kdWxlU2VnbWVudHMubGVuZ3RoICsgMSkgPT0gcGF0aFNlZ21lbnRzLmxlbmd0aCAmJiAKLQkJICAgIAkJc3RhcnRzV2l0aChtb2R1bGVTZWdtZW50cywgcGF0aFNlZ21lbnRzKSkKLQkJICAgIAlyZXR1cm4gbW9kdWxlUmVzb3VyY2U7IAotICAgIAkJCi0gICAgCQkvLyBPdGhlcndpc2UsIGlmIGl0IGlzIGEgZm9sZGVyLCBjaGVjayBpdHMgY2hpbGRyZW4gZm9yIHRoZSBleGlzdGluZyByZXNvdXJjZSBwYXRoCi0gICAgCQkvLyBidXQgb25seSBjaGVjayBpZiB0aGUgYmVnaW5uaW5nIHNlZ21lbnRzIGFyZSBhIG1hdGNoCi0JICAgIAlpZihtb2R1bGVSZXNvdXJjZSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIgJiYgCi0JICAgIAkJCXN0YXJ0c1dpdGgobW9kdWxlU2VnbWVudHMsIHBhdGhTZWdtZW50cykgJiYgcGF0aFNlZ21lbnRzLmxlbmd0aCA+IG1vZHVsZVNlZ21lbnRzLmxlbmd0aCAmJgotCSAgICAJCQltb2R1bGVSZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKHBhdGhTZWdtZW50c1ttb2R1bGVTZWdtZW50cy5sZW5ndGggPiAwID8gbW9kdWxlU2VnbWVudHMubGVuZ3RoIDogMF0pKQkgICAgCSAgCi0gICAgCQkJaWYgKCgoSU1vZHVsZUZvbGRlciltb2R1bGVSZXNvdXJjZSkubWVtYmVycygpIT1udWxsKQotICAgIAkJCQlyZXR1cm4gZ2V0RXhpc3RpbmdNb2R1bGVSZXNvdXJjZShBcnJheXMuYXNMaXN0KCgoSU1vZHVsZUZvbGRlciltb2R1bGVSZXNvdXJjZSkubWVtYmVycygpKSxwYXRoKTsJCQotICAgIAl9Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYmVnaW5uaW5nU2VnbWVudHMKLQkgKiBAcGFyYW0gdGVzdFNlZ21lbnRzCi0JICogQHJldHVybiBUcnVlIGlmIGJlZ2lubmluZ1NlZ21lbnRzW2ldID09IHRlc3RTZWdtZW50c1tpXSBmb3IgYWxsIDA8PWk8YmVnaW5uaW5nU2VnbWVudHNbaV0gCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHN0YXJ0c1dpdGgoU3RyaW5nW10gYmVnaW5uaW5nU2VnbWVudHMsIFN0cmluZ1tdIHRlc3RTZWdtZW50cykgeyAKLQkJZm9yKGludCBpPTA7IGkgPCBiZWdpbm5pbmdTZWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYoIWJlZ2lubmluZ1NlZ21lbnRzW2ldLmVxdWFscyh0ZXN0U2VnbWVudHNbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gaGFuZGxlSmF2YVBhdGgoSVBhdGggcGF0aCwgSVBhdGggamF2YVBhdGgsIElQYXRoIGN1clBhdGgsIElDb250YWluZXJbXSBqYXZhQ29udCwgSU1vZHVsZVJlc291cmNlW10gbXIsIElDb250YWluZXIgY2MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy9zdWJjbGFzc2VzIG1heSBvdmVycmlkZQotCQlyZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZVtde307Ci0JfQotCQotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltZW1iZXJzLmNsZWFyKCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKTsKLQkJaWYgKHZjICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsRm9sZGVyIHZGb2xkZXIgPSB2Yy5nZXRSb290Rm9sZGVyKCk7Ci0JCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IGdldE1lbWJlcnModkZvbGRlciwgUGF0aC5FTVBUWSk7Ci0JCQlpbnQgc2l6ZSA9IG1yLmxlbmd0aDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJbWVtYmVycy5hZGQobXJbal0pOwotCQkJfQotCQkJYWRkVXRpbE1lbWJlcnModmMpOwotCQl9Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbWVtYmVycy5zaXplKCldOwotCQltZW1iZXJzLnRvQXJyYXkobXIpOwotCQlyZXR1cm4gbXI7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluY2x1ZGVVdGlsaXR5Q29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wLCBJVmlydHVhbFJlZmVyZW5jZVtdIGNvbXBvbmVudHMsIEFydGlmYWN0RWRpdCBlZGl0KSB7Ci0JCXJldHVybiB2aXJ0dWFsQ29tcCAhPSBudWxsICYmIHZpcnR1YWxDb21wLmlzQmluYXJ5KCkgJiYgdmlydHVhbENvbXAuZ2V0UHJvamVjdCgpPT1jb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVdGlsTWVtYmVycyhJVmlydHVhbENvbXBvbmVudCB2YykgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gZ2V0Q29tcG9uZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpOwotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBjb21wb25lbnRzID0gdmMuZ2V0UmVmZXJlbmNlcygpOwotCSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JICAgIAkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29tcG9uZW50c1tpXTsKLQkJCQlJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYgKHNob3VsZEluY2x1ZGVVdGlsaXR5Q29tcG9uZW50KHZpcnR1YWxDb21wLGNvbXBvbmVudHMsZWRpdCkpIHsKLQkJCQkJYWRkVXRpbE1lbWJlcih2YywgcmVmZXJlbmNlLCByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQkJfQotCSAgICAJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQhPW51bGwpCi0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXRpbE1lbWJlcihJVmlydHVhbENvbXBvbmVudCBwYXJlbnQsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJSU1vZHVsZUZpbGUgbWYgPSBudWxsOwotCQlmaW5hbCBTdHJpbmcgYXJjaGl2ZU5hbWUgPSByZWZlcmVuY2UuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXAgPSByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQlmaW5hbCBJUGF0aCBhcmNoaXZlUGF0aCA9ICgoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpdmlydHVhbENvbXApLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQlpZiAoYXJjaGl2ZVBhdGggIT0gbnVsbCkgeyAvL0luIFdvcmtzcGFjZQotCQkJSUZpbGUgdXRpbEZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYXJjaGl2ZVBhdGgpOwotCQkJU3RyaW5nIG5hbWUgPSBudWxsICE9IGFyY2hpdmVOYW1lID8gYXJjaGl2ZU5hbWUgOiB1dGlsRmlsZS5nZXROYW1lKCk7Ci0JCQltZiA9IG5ldyBNb2R1bGVGaWxlKHV0aWxGaWxlLCBuYW1lLCBydW50aW1lUGF0aC5tYWtlUmVsYXRpdmUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlGaWxlIGV4dEZpbGUgPSAoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KXZpcnR1YWxDb21wKS5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCVN0cmluZyBuYW1lID0gbnVsbCAhPSBhcmNoaXZlTmFtZSA/IGFyY2hpdmVOYW1lIDogZXh0RmlsZS5nZXROYW1lKCk7Ci0JCQltZiA9IG5ldyBNb2R1bGVGaWxlKGV4dEZpbGUsIG5hbWUsIHJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZSgpKTsKLQkJfQotCQlpZiAobWYgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlNb2R1bGVSZXNvdXJjZSBtb2R1bGVQYXJlbnQgPSBnZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKG1lbWJlcnMsIG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKTsKLQkJaWYgKG1vZHVsZVBhcmVudCAhPSBudWxsICYmIG1vZHVsZVBhcmVudCBpbnN0YW5jZW9mIE1vZHVsZUZvbGRlcikgewotCQkJYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKChNb2R1bGVGb2xkZXIpbW9kdWxlUGFyZW50LCBuZXcgSU1vZHVsZVJlc291cmNlW117bWZ9KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtZi5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5pc0VtcHR5KCkpIHsKLQkJCQltZW1iZXJzLmFkZChtZik7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtb2R1bGVQYXJlbnQgPT0gbnVsbCkgewotCQkJCQltb2R1bGVQYXJlbnQgPSBlbnN1cmVQYXJlbnRFeGlzdHMobWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCksIChJQ29udGFpbmVyKXBhcmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpOwotCQkJCX0KLQkJCQlhZGRNZW1iZXJzVG9Nb2R1bGVGb2xkZXIoKE1vZHVsZUZvbGRlciltb2R1bGVQYXJlbnQsIG5ldyBJTW9kdWxlUmVzb3VyY2VbXSB7bWZ9KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgQXJ0aWZhY3RFZGl0IGdldENvbXBvbmVudEFydGlmYWN0RWRpdEZvclJlYWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1Byb2plY3RPZlR5cGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHR5cGVJRCkgewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoZmFjZXRlZFByb2plY3QgIT1udWxsICYmIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCh0eXBlSUQpKSB7Ci0JCQlJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCh0eXBlSUQpOwotCQkJcmV0dXJuIHByb2plY3RGYWNldCE9bnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXJzIGZvciB0aGUgcmVzb3VyY2VzIGluIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiByZXNvdXJjZSBmb2xkZXJzCi0JICovCi0JcHVibGljIElDb250YWluZXJbXSBnZXRSZXNvdXJjZUZvbGRlcnMoKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKTsKLQkJaWYgKHZjICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsRm9sZGVyIHZGb2xkZXIgPSB2Yy5nZXRSb290Rm9sZGVyKCk7Ci0JCQlpZiAodkZvbGRlciAhPSBudWxsKQotCQkJCXJldHVybiB2Rm9sZGVyLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ29udGFpbmVyW117fTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9JU3RhdGljV2ViTW9kdWxlQXJ0aWZhY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9JU3RhdGljV2ViTW9kdWxlQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkNWJmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvSVN0YXRpY1dlYk1vZHVsZUFydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotcHVibGljIGludGVyZmFjZSBJU3RhdGljV2ViTW9kdWxlQXJ0aWZhY3QgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3MjA3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLklTdGF0aWNXZWI7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0aWNXZWJEZXBsb3lhYmxlIGV4dGVuZHMgQ29tcG9uZW50RGVwbG95YWJsZSBpbXBsZW1lbnRzIElTdGF0aWNXZWIgewotCi0JcHVibGljIFN0YXRpY1dlYkRlcGxveWFibGUoSVByb2plY3QgcHJvamVjdCwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXN1cGVyKHByb2plY3QpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHRSb290KCkgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gY29tcG9uZW50LmdldE1ldGFQcm9wZXJ0aWVzKCk7Ci0JCWlmKHByb3BzLmNvbnRhaW5zS2V5KCJjb250ZXh0LXJvb3QiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KCJjb250ZXh0LXJvb3QiKTsgLy8kTk9OLU5MUy0xJAotCSAgICByZXR1cm4gY29tcG9uZW50LmdldE5hbWUoKTsKLSAgICB9Ci0JCi0JIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKElNb2R1bGUgbW9kdWxlKSB7Ci0JICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChtb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQkgICAgU3RyaW5nIGFVUkkgPSBudWxsOwotCSAgICBpZiAoY29tcCAhPW51bGwpIHsKLQkgICAgCWlmICghY29tcC5pc0JpbmFyeSgpICYmIGlzUHJvamVjdE9mVHlwZShtb2R1bGUuZ2V0UHJvamVjdCgpLElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEUpKSB7Ci0gICAgICAgIAkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gY29tcG9uZW50LmdldFJlZmVyZW5jZShjb21wLmdldE5hbWUoKSk7Ci0gICAgICAgIAkJYVVSSSA9IHJlZi5nZXRSdW50aW1lUGF0aCgpLmFwcGVuZChjb21wLmdldE5hbWUoKSsiLndhciIpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCX0KLQkgICAgfQotCSAgICAJCi0gICAgCWlmIChhVVJJICE9bnVsbCAmJiBhVVJJLmxlbmd0aCgpPjEgJiYgYVVSSS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLSAgICAJCWFVUkkgPSBhVVJJLnN1YnN0cmluZygxKTsKLSAgICAJcmV0dXJuIGFVUkk7Ci0JIH0KLQkgCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQlpZiAoZmFjZXRlZFByb2plY3QgIT1udWxsICYmIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZChJTW9kdWxlQ29uc3RhbnRzLldTVF9XRUJfTU9EVUxFKSkgewotCQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEUpOwotCQkJCXJldHVybiBmYWNldGVkUHJvamVjdC5nZXRJbnN0YWxsZWRWZXJzaW9uKHByb2plY3RGYWNldCkuZ2V0VmVyc2lvblN0cmluZygpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gIjEuMCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MGQ1M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIFN0YXRpY1dlYkRlcGxveWFibGVGYWN0b3J5IGV4dGVuZHMgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuc3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBBcnJheUxpc3QgbW9kdWxlRGVsZWdhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoKLQkgKiBAc2VlIERlcGxveWFibGVQcm9qZWN0RmFjdG9yeURlbGVnYXRlI2dldEZhY3RvcnlJRCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCQotCS8qKgotCSAqIFVzZSB7QGxpbmsgI2NyZWF0ZU1vZHVsZXMoSVByb2plY3QpfSBpbnN0ZWFkLgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIG5hdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIGNyZWF0ZU1vZHVsZXMoTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUpIHsKLQkJaWYobmF0dXJlICE9IG51bGwpewotCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZXMobmF0dXJlLmdldFByb2plY3QoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvamVjdCByZXByZXNlbnRzIGEgZGVwbG95YWJsZSBwcm9qZWN0IG9mIHRoaXMgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkTW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChmYWNldGVkUHJvamVjdCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCUlQcm9qZWN0RmFjZXQgd2ViRmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRSk7Ci0JCQlyZXR1cm4gZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KHdlYkZhY2V0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSNnZXRNb2R1bGVEZWxlZ2F0ZShvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRGVsZWdhdGUgZ2V0TW9kdWxlRGVsZWdhdGUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kdWxlRGVsZWdhdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTW9kdWxlRGVsZWdhdGUgZWxlbWVudCA9IChNb2R1bGVEZWxlZ2F0ZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobW9kdWxlID09IGVsZW1lbnQuZ2V0TW9kdWxlKCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIGNyZWF0ZU1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYoY29tcG9uZW50ICE9IG51bGwpewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlRGVsZWdhdGVzKGNvbXBvbmVudCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkud3JpdGUoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2R1bGVbXSBjcmVhdGVNb2R1bGVEZWxlZ2F0ZXMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKGNvbXBvbmVudCA9PSBudWxsKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0YXRpY1dlYkRlcGxveWFibGUgbW9kdWxlRGVsZWdhdGUgPSBudWxsOwotCQlJTW9kdWxlIG1vZHVsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZihpc1ZhbGlkTW9kdWxlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJbW9kdWxlRGVsZWdhdGUgPSBuZXcgU3RhdGljV2ViRGVwbG95YWJsZShjb21wb25lbnQuZ2V0UHJvamVjdCgpLGNvbXBvbmVudCk7Ci0JCQkJbW9kdWxlID0gY3JlYXRlTW9kdWxlKGNvbXBvbmVudC5nZXROYW1lKCksIGNvbXBvbmVudC5nZXROYW1lKCksIElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEUsIG1vZHVsZURlbGVnYXRlLmdldFZlcnNpb24oKSwgbW9kdWxlRGVsZWdhdGUuZ2V0UHJvamVjdCgpKTsKLQkJCQltb2R1bGVEZWxlZ2F0ZS5pbml0aWFsaXplKG1vZHVsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkud3JpdGUoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCQlpZiAoZ2V0TW9kdWxlRGVsZWdhdGUobW9kdWxlKSA9PSBudWxsKQotCQkJCQltb2R1bGVEZWxlZ2F0ZXMuYWRkKG1vZHVsZURlbGVnYXRlKTsKLQkJCX0KLQkJfQotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBJTW9kdWxlW10ge21vZHVsZX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRoYXQgdGhlIG1vZHVsZSBzaG91bGQgbGlzdGVuIHRvCi0JICogZm9yIHN0YXRlIGNoYW5nZXMuIFRoZSBwYXRocyBzaG91bGQgYmUgcHJvamVjdCByZWxhdGl2ZSBwYXRocy4KLQkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZSBwYXRocy4KLQkgKgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBwYXRocwotCSAqLwotCXByb3RlY3RlZCBJUGF0aFtdIGdldExpc3RlbmVyUGF0aHMoKSB7Ci0JCXJldHVybiBuZXcgSVBhdGhbXSB7Ci0JCQluZXcgUGF0aCgiLnByb2plY3QiKSwgLy8gbmF0dXJlIC8vJE5PTi1OTFMtMSQKLQkJCW5ldyBQYXRoKFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FKSwgLy8gY29tcG9uZW50Ci0JCQluZXcgUGF0aCgiLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnhtbCIpIC8vIGZhY2V0cyAvLyROT04tTkxTLTEkCi0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5OTM4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIFN0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyIGV4dGVuZHMgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLQotewotCi0JcHVibGljIFN0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tde0lTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdC5jbGFzc307Ci0JfQotCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBTdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlclV0aWwuZ2V0TW9kdWxlT2JqZWN0KG9iaik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3OTE2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLldlYlJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXJVdGlsIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGV4dGVuc2lvbnNUb0V4Y2x1ZGUgPSBuZXcgU3RyaW5nW117InNxbCIsICJ4bWkifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0Jc3RhdGljIFN0cmluZyBJTkZPX0RJUkVDVE9SWSA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KE9iamVjdCBvYmopIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgb2JqOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSAoKElBZGFwdGFibGUpIG9iaikuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCWlmIChoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhwcm9qZWN0KSkKLQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShwcm9qZWN0KSwgbmV3IFBhdGgoIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7CQotCQl9Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHJlc291cmNlKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhaGFzSW50ZXJlc3RlZENvbXBvbmVudHMocHJvamVjdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJLy8gZGV0ZXJtaW5lIHBhdGgKLQkJSVBhdGggcm9vdFBhdGggPSBjb21wLmdldFJvb3RGb2xkZXIoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCUlQYXRoIHJlc291cmNlUGF0aCA9IHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQotCQkvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHJlc291cmNlIGlzIHVuZGVyIHRoZSB3ZWJBcHBsaWNhdGlvbiBkaXJlY3RvcnkKLQkJaWYgKHJlc291cmNlUGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMocm9vdFBhdGgpICE9IHJvb3RQYXRoLnNlZ21lbnRDb3VudCgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gRG8gbm90IGFsbG93IHJlc291cmNlIHVuZGVyIHRoZSB3ZWItaW5mIGRpcmVjdG9yeQotCQlyZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyb290UGF0aC5zZWdtZW50Q291bnQoKSk7Ci0JCWlmIChyZXNvdXJjZVBhdGguc2VnbWVudENvdW50KCkgPiAxICYmIHJlc291cmNlUGF0aC5zZWdtZW50KDApLmVxdWFscyhJTkZPX0RJUkVDVE9SWSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoc2hvdWxkRXhjbHVkZShyZXNvdXJjZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyByZXR1cm4gV2ViIHJlc291cmNlIHR5cGUKLQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocHJvamVjdCksIHJlc291cmNlUGF0aCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2Qgc2hvdWxkRXhjbHVkZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3VsZEV4Y2x1ZGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVN0cmluZyBmaWxlRXh0ID0gcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOwotCi0JCS8vIEV4Y2x1ZGUgZmlsZXMgb2YgY2VydGFpbiBleHRlbnNpb25zCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uc1RvRXhjbHVkZS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNUb0V4Y2x1ZGVbaV07Ci0JCQlpZiAoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoZmlsZUV4dCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoaGFzSW50ZXJlc3RlZENvbXBvbmVudHMocHJvamVjdCkpCi0JCQlyZXR1cm4gU2VydmVyVXRpbC5nZXRNb2R1bGUocHJvamVjdCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzSW50ZXJlc3RlZENvbXBvbmVudHMoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNQcm9qZWN0T2ZUeXBlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSUQpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsICYmIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCh0eXBlSUQpKSB7Ci0JCQlJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCh0eXBlSUQpOwotCQkJcmV0dXJuIHByb2plY3RGYWNldCAhPSBudWxsICYmIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChwcm9qZWN0RmFjZXQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZmFjZXQvTWFwcGluZ0Rlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9mYWNldC9NYXBwaW5nRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzQ5MDQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9mYWNldC9NYXBwaW5nRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE1hcHBpbmdEZXNjcmlwdG9yIHsKLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLQlwdWJsaWMgTWFwcGluZ0Rlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotCX0KLQotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkuQVRUUklCVVRFX0lEKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGYWNldFJ1bnRpbWVUeXBlSUQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShSdW50aW1lUHJlc2V0TWFwcGluZ1JlZ2lzdHJ5LkFUVFJJQlVURV9GQUNFVF9SVU5USU1FX1RZUEVfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjZXRSdW50aW1lVmVyc2lvbigpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkuQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVkVSU0lPTik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjZXRJRCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkuQVRUUklCVVRFX0ZBQ0VUX0lEKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZhY2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkuQVRUUklCVVRFX0ZBQ0VUX1ZFUlNJT04pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2V0SUQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShSdW50aW1lUHJlc2V0TWFwcGluZ1JlZ2lzdHJ5LkFUVFJJQlVURV9QUkVTRVRfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmLmFwcGVuZCgiaWQ6Iik7Ci0JCWJ1ZmYuYXBwZW5kKGdldElEKCkpOwotCQlidWZmLmFwcGVuZCgiIGZhY2V0UnVudGltZVR5cGVJRDoiKTsKLQkJYnVmZi5hcHBlbmQoZ2V0RmFjZXRSdW50aW1lVHlwZUlEKCkpOwotCQlidWZmLmFwcGVuZCgiIGZhY2V0UnVudGltZVZlcnNpb246Iik7Ci0JCWJ1ZmYuYXBwZW5kKGdldEZhY2V0UnVudGltZVZlcnNpb24oKSk7Ci0JCWJ1ZmYuYXBwZW5kKCIgZmFjZXRJRDoiKTsKLQkJYnVmZi5hcHBlbmQoZ2V0RmFjZXRJRCgpKTsKLQkJYnVmZi5hcHBlbmQoIiBmYWNldFZlcnNpb246Iik7Ci0JCWJ1ZmYuYXBwZW5kKGdldEZhY2V0VmVyc2lvbigpKTsKLQkJYnVmZi5hcHBlbmQoIiBwcmVzZXRJRDoiKTsKLQkJYnVmZi5hcHBlbmQoZ2V0UHJlc2V0SUQoKSk7Ci0JCXJldHVybiBidWZmLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZmFjZXQvUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2ZhY2V0L1J1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3MzIyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZmFjZXQvUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLldTVFdlYlBsdWdpbjsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlQgPSAicnVudGltZVByZXNldE1hcHBpbmdzIjsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9NQVBQSU5HID0gIm1hcHBpbmciOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSUQgPSAiaWQiOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9UWVBFX0lEID0gImZhY2V0UnVudGltZVR5cGVJRCI7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9GQUNFVF9SVU5USU1FX1ZFUlNJT04gPSAiZmFjZXRSdW50aW1lVmVyc2lvbiI7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9GQUNFVF9JRCA9ICJmYWNldElEIjsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0ZBQ0VUX1ZFUlNJT04gPSAiZmFjZXRWZXJzaW9uIjsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1BSRVNFVF9JRCA9ICJwcmVzZXRJRCI7Ci0KLQlwdWJsaWMgc3RhdGljIFJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeSgpOwotCi0JcHJpdmF0ZSBMaXN0PE1hcHBpbmdEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyA9IG51bGw7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNldElEKFN0cmluZyBmYWNldFJ1bnRpbWVUeXBlSUQsCi0JCQlTdHJpbmcgZmFjZXRSdW50aW1lVmVyc2lvbiwgU3RyaW5nIGZhY2V0SUQsIFN0cmluZyBmYWNldFZlcnNpb24pIHsKLQkJaWYgKGRlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXJlYWREZXNjcmlwdG9ycygpOwotCQl9Ci0JCWZvciAoTWFwcGluZ0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7Ci0JCQlpZihtYXRjaGVzKGZhY2V0UnVudGltZVR5cGVJRCwgZGVzY3JpcHRvci5nZXRGYWNldFJ1bnRpbWVUeXBlSUQoKSkgJiYKLQkJCSAgIG1hdGNoZXMoZmFjZXRSdW50aW1lVmVyc2lvbiwgZGVzY3JpcHRvci5nZXRGYWNldFJ1bnRpbWVWZXJzaW9uKCkpICYmCi0JCQkgICBtYXRjaGVzKGZhY2V0SUQsIGRlc2NyaXB0b3IuZ2V0RmFjZXRJRCgpKSAmJgotCQkJICAgbWF0Y2hlcyhmYWNldFZlcnNpb24sIGRlc2NyaXB0b3IuZ2V0RmFjZXRWZXJzaW9uKCkpKXsKLQkJCQlyZXR1cm4gZGVzY3JpcHRvci5nZXRQcmVzZXRJRCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgbWF0Y2hlZCBieSB0aGUgcGF0dGVybiBUaGUgcGF0dGVybiBjb25zaXN0cwotCSAqIG9mIGEgY29tbW9uIGRlbGltaW5hdGVkIGxpc3Qgb2Ygc2ltcGxlIHBhdHRlcm5zIEVhY2ggc2ltcGxlIHBhdHRlcm4gaGFzCi0JICogYW4gb3B0aW9uYWwgc3RhcnRpbmcgb3IgZW5kaW5nICogc28gYSBTdHJpbmcuc3RhcnRzV2l0aCgpIG9yCi0JICogU3RyaW5nLmVuZHNXaXRoKCkuIEJvdGggbWF5IGJlIGNvbWJpbmVkIHRvIGNvbXB1dGUgYSBTdHJpbmcuaW5kZXhPZigpICE9Ci0JICogLTEKLQkgKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgdmFsdWUsIFN0cmluZyBwYXR0ZXJuKXsKLQkJU3RyaW5nVG9rZW5pemVyIHN0clRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVybiwgIiwiKTsKLQkJd2hpbGUoc3RyVG9rLmhhc01vcmVUb2tlbnMoKSl7Ci0JCQlTdHJpbmcgc2ltcGxlUGF0dGVybiA9IHN0clRvay5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpZihzaW1wbGVQYXR0ZXJuLnN0YXJ0c1dpdGgoIioiKSl7Ci0JCQkJaWYoc2ltcGxlUGF0dGVybi5sZW5ndGgoKSA8IDIpewotCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gaS5lLiAqCi0JCQkJfQotCQkJCWlmKHNpbXBsZVBhdHRlcm4uZW5kc1dpdGgoIioiKSl7Ci0JCQkJCWlmKHNpbXBsZVBhdHRlcm4ubGVuZ3RoKCkgPCAzKXsgCi0JCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gaS5lLiAqKgotCQkJCQl9Ci0JCQkJCWlmKHZhbHVlLmluZGV4T2Yoc2ltcGxlUGF0dGVybi5zdWJzdHJpbmcoMSwgc2ltcGxlUGF0dGVybi5sZW5ndGgoKS0yKSkgIT0gLTEpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZih2YWx1ZS5lbmRzV2l0aChzaW1wbGVQYXR0ZXJuLnN1YnN0cmluZygxKSkpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYoc2ltcGxlUGF0dGVybi5lbmRzV2l0aCgiKiIpKXsKLQkJCQlpZih2YWx1ZS5zdGFydHNXaXRoKHNpbXBsZVBhdHRlcm4uc3Vic3RyaW5nKDAsIHNpbXBsZVBhdHRlcm4ubGVuZ3RoKCktMikpKXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmKHZhbHVlLmVxdWFscyhzaW1wbGVQYXR0ZXJuKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0IDxTdHJpbmc+IGdldFN0YXRpY1Rva2VucyhTdHJpbmcgcGF0dGVybil7Ci0JCUxpc3QgPFN0cmluZz4gc3RhdGljVG9rZW5zID0gbmV3IEFycmF5TGlzdCA8U3RyaW5nPiAoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0clRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVybiwgIiwiKTsKLQkJd2hpbGUoc3RyVG9rLmhhc01vcmVUb2tlbnMoKSl7Ci0JCQlTdHJpbmcgc2ltcGxlUGF0dGVybiA9IHN0clRvay5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpZighc2ltcGxlUGF0dGVybi5zdGFydHNXaXRoKCIqIikgJiYgIXNpbXBsZVBhdHRlcm4uZW5kc1dpdGgoIioiKSl7Ci0JCQkJc3RhdGljVG9rZW5zLmFkZChzaW1wbGVQYXR0ZXJuKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdGljVG9rZW5zOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgcmVhZERlc2NyaXB0b3JzKCkgewotCQlkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8TWFwcGluZ0Rlc2NyaXB0b3I+KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoV1NUV2ViUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UKTsKLQkJaWYgKHBvaW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAoRUxFTUVOVF9NQVBQSU5HLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfSUQpOwotCQkJCWlmIChudWxsID09IGlkIHx8IGlkLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBpcyBtaXNzaW5nIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0lEKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHJ1bnRpbWVJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9GQUNFVF9SVU5USU1FX1RZUEVfSUQpOwotCQkJCWlmIChudWxsID09IHJ1bnRpbWVJRCB8fCBydW50aW1lSUQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFeHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQgKyAiIEVsZW1lbnQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIGlzIG1pc3NpbmcgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9UWVBFX0lEKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJTGlzdCA8U3RyaW5nPiBzdGF0aWNSdW50aW1lSURzID0gZ2V0U3RhdGljVG9rZW5zKHJ1bnRpbWVJRCk7Ci0JCQkJTGlzdCA8SVJ1bnRpbWVDb21wb25lbnRUeXBlPiBzdGF0aWNSdW50aW1lVHlwZXMgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lQ29tcG9uZW50VHlwZT4oKTsKLQkJCQlmb3IoU3RyaW5nIHN0YXRpY1J1bnRpbWVJRCA6IHN0YXRpY1J1bnRpbWVJRHMpewotCQkJCQl0cnkgewotCQkJCQkJSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJ1bnRpbWVUeXBlID0gUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoc3RhdGljUnVudGltZUlEKTsKLQkJCQkJCWlmKHJ1bnRpbWVUeXBlICE9IG51bGwpewotCQkJCQkJCXN0YXRpY1J1bnRpbWVUeXBlcy5hZGQocnVudGltZVR5cGUpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFeHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQgKyAiIEVsZW1lbnQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIGRlZmluZWQgaW52YWxpZCBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9GQUNFVF9SVU5USU1FX1RZUEVfSUQgKyAiOiAiICsgcnVudGltZUlEICsiIHVuYWJsZSB0byByZXNvbHZlIHJ1bnRpbWU6ICIrc3RhdGljUnVudGltZUlELCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkJCi0JCQkJU3RyaW5nIHJ1bnRpbWVWZXJzaW9uU3RyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVkVSU0lPTik7Ci0JCQkJaWYgKG51bGwgPT0gcnVudGltZVZlcnNpb25TdHIgfHwgcnVudGltZVZlcnNpb25TdHIudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFeHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQgKyAiIEVsZW1lbnQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIGlzIG1pc3NpbmcgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9WRVJTSU9OKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmKCFzdGF0aWNSdW50aW1lVHlwZXMuaXNFbXB0eSgpKXsKLQkJCQkJTGlzdCA8U3RyaW5nPiBzdGF0aWNSdW50aW1lVmVyc2lvbnMgPSBnZXRTdGF0aWNUb2tlbnMocnVudGltZVZlcnNpb25TdHIpOwotCQkJCQlmb3IoU3RyaW5nIHN0YXRpY1ZlcnNpb24gOiBzdGF0aWNSdW50aW1lVmVyc2lvbnMpewotCQkJCQkJYm9vbGVhbiBmb3VuZFZlcnNpb24gPSBmYWxzZTsKLQkJCQkJCWZvcihpbnQgaz0wO2s8c3RhdGljUnVudGltZVR5cGVzLnNpemUoKSAmJiAhZm91bmRWZXJzaW9uO2srKyl7Ci0JCQkJCQkJSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJ1bnRpbWVUeXBlID0gc3RhdGljUnVudGltZVR5cGVzLmdldChrKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlJUnVudGltZUNvbXBvbmVudFZlcnNpb24gdmVyc2lvbiA9IHJ1bnRpbWVUeXBlLmdldFZlcnNpb24oc3RhdGljVmVyc2lvbik7Ci0JCQkJCQkJCWZvdW5kVmVyc2lvbiA9IHRydWU7Ci0JCQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy9lYXQgaXQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZighZm91bmRWZXJzaW9uKXsKLQkJCQkJCQlTdHJpbmdCdWZmZXIgdmFsaWRWZXJzaW9ucyA9IG5ldyBTdHJpbmdCdWZmZXIoIiB2YWxpZCB2ZXJzaW9ucyBpbmNsdWRlOiAiKTsKLQkJCQkJCQlmb3IoSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJ1bnRpbWVUeXBlIDogc3RhdGljUnVudGltZVR5cGVzKSB7Ci0JCQkJCQkJCXZhbGlkVmVyc2lvbnMuYXBwZW5kKCJcbiIpOwotCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZChydW50aW1lVHlwZS5nZXRJZCgpKTsKLQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoIjogIik7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3I8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiBpdGVyYXRvciA9IHJ1bnRpbWVUeXBlLmdldFZlcnNpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoaXRlcmF0b3IubmV4dCgpLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCQkJCQkJCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoIiAiKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgZGVmaW5lZCBpbnZhbGlkIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVkVSU0lPTiArICI6ICIgKyBzdGF0aWNWZXJzaW9uCi0JCQkJCQkJCQkrIHZhbGlkVmVyc2lvbnMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCVN0cmluZyBmYWNldElEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0ZBQ0VUX0lEKTsKLQkJCQlpZiAobnVsbCA9PSBmYWNldElEIHx8IGZhY2V0SUQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFeHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQgKyAiIEVsZW1lbnQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIGlzIG1pc3NpbmcgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfSUQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJTGlzdCA8U3RyaW5nPiBzdGF0aWNGYWNldElEcyA9IGdldFN0YXRpY1Rva2VucyhmYWNldElEKTsKLQkJCQlMaXN0IDxJUHJvamVjdEZhY2V0PiBzdGF0aWNGYWNldHMgPSBuZXcgQXJyYXlMaXN0IDxJUHJvamVjdEZhY2V0PigpOwotCQkJCWZvcihTdHJpbmcgc3RhdGljRmFjZXRJRDpzdGF0aWNGYWNldElEcyl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KHN0YXRpY0ZhY2V0SUQpOwotCQkJCQkJaWYobnVsbCAhPSBmYWNldCl7Ci0JCQkJCQkJc3RhdGljRmFjZXRzLmFkZChmYWNldCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgZGVmaW5lZCBpbnZhbGlkIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0ZBQ0VUX0lEICsgIjogIiArIHN0YXRpY0ZhY2V0SUQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCVN0cmluZyBmYWNldFZlcnNpb25TdHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfRkFDRVRfVkVSU0lPTik7Ci0JCQkJaWYgKG51bGwgPT0gZmFjZXRWZXJzaW9uU3RyIHx8IGZhY2V0VmVyc2lvblN0ci50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgaXMgbWlzc2luZyBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9GQUNFVF9WRVJTSU9OKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCUxpc3QgPFN0cmluZz5zdGF0aWNGYWNldFZlcnNpb25TdHJzID0gZ2V0U3RhdGljVG9rZW5zKGZhY2V0VmVyc2lvblN0cik7Ci0JCQkJaWYoIXN0YXRpY0ZhY2V0cy5pc0VtcHR5KCkgJiYgIXN0YXRpY0ZhY2V0VmVyc2lvblN0cnMuaXNFbXB0eSgpKXsKLQkJCQkJZm9yKFN0cmluZyBzdGF0aWNGYWNldFZlcnNpb246c3RhdGljRmFjZXRWZXJzaW9uU3Rycyl7Ci0JCQkJCQlib29sZWFuIGZvdW5kRmFjZXRWZXJzaW9uID0gZmFsc2U7Ci0JCQkJCQlmb3IoaW50IGs9MDtrPCBzdGF0aWNGYWNldHMuc2l6ZSgpICYmICFmb3VuZEZhY2V0VmVyc2lvbjsgaysrKSB7Ci0JCQkJCQkJSVByb2plY3RGYWNldCBzdGF0aWNGYWNldCA9IHN0YXRpY0ZhY2V0cy5nZXQoayk7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSVByb2plY3RGYWNldFZlcnNpb24gc3RhdGljVmVyc2lvbiA9IHN0YXRpY0ZhY2V0LmdldFZlcnNpb24oc3RhdGljRmFjZXRWZXJzaW9uKTsKLQkJCQkJCQkJaWYoc3RhdGljVmVyc2lvbiAhPSBudWxsKXsKLQkJCQkJCQkJCWZvdW5kRmFjZXRWZXJzaW9uID0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vZWF0IGl0Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoIWZvdW5kRmFjZXRWZXJzaW9uKXsKLQkJCQkJCQlTdHJpbmdCdWZmZXIgdmFsaWRWZXJzaW9ucyA9IG5ldyBTdHJpbmdCdWZmZXIoIiB2YWxpZCB2ZXJzaW9ucyBpbmNsdWRlOiAiKTsKLQkJCQkJCQlmb3IoSVByb2plY3RGYWNldCBzdGF0aWNGYWNldDpzdGF0aWNGYWNldHMpewotCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZCgiXG4iKTsKLQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoc3RhdGljRmFjZXQuZ2V0SWQoKSk7Ci0JCQkJCQkJCXZhbGlkVmVyc2lvbnMuYXBwZW5kKCI6ICIpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBpdGVyYXRvciA9IHN0YXRpY0ZhY2V0LmdldFZlcnNpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoaXRlcmF0b3IubmV4dCgpLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCQkJCQkJCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoIiAiKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgZGVmaW5lZCBpbnZhbGlkIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0ZBQ0VUX1ZFUlNJT04gKyAiOiAiICsgc3RhdGljRmFjZXRWZXJzaW9uCi0JCQkJCQkJCQkrIHZhbGlkVmVyc2lvbnMpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9CQotCQkJCX0KLQkJCQlTdHJpbmcgcHJlc2V0SUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfUFJFU0VUX0lEKTsKLQkJCQlpZiAobnVsbCA9PSBwcmVzZXRJRCB8fCBwcmVzZXRJRC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgaXMgbWlzc2luZyBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9QUkVTRVRfSUQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0KHByZXNldElEKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgZGVmaW5lZCBpbnZhbGlkIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX1BSRVNFVF9JRCArICI6ICIgKyBwcmVzZXRJRCwgZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlNYXBwaW5nRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IE1hcHBpbmdEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJCWRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFbGVtZW50cyBtdXN0IGJlIG5hbWVkOiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiB3aXRoaW4gdGhlIGV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCk7Ci0JCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFbGVtZW50OiAiICsgZWxlbWVudC5nZXROYW1lKCkgKyAiIGlzIGludmFsaWQgd2l0aGluIHRoZSBleHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQpOwotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL29wZXJhdGlvbi9JV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL0lXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3NjIyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL0lXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHtAbGluayBJU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm9wZXJ0aWVzfQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUID0gIklXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9ST09UID0gIklXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVYVF9ST09UIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL1dlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGFhZmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5TZXJ2ZXJDb250ZXh0Um9vdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkge0BsaW5rIFNlcnZlckNvbnRleHRSb290RGF0YU1vZGVsUHJvdmlkZXJ9Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVEYXRhTW9kZWxQcm92aWRlciAKLSBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIKLSBpbXBsZW1lbnRzIElXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLQlwdWJsaWMgV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVEYXRhTW9kZWxQcm92aWRlcigpewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IG5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQluYW1lcy5hZGQoUFJPSkVDVCk7Ci0JCW5hbWVzLmFkZChDT05URVhUX1JPT1QpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVPcGVyYXRpb24obW9kZWwpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxYWUyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL1dlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwub3BlcmF0aW9uOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uU2VydmVyQ29udGV4dFJvb3RVcGRhdGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0KLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIAotICogICBSZXBsYWNlZCBieSB7QGxpbmsgU2VydmVyQ29udGV4dFJvb3RVcGRhdGVPcGVyYXRpb259IAotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVPcGVyYXRpb24gCi0gZXh0ZW5kcyAgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi0gaW1wbGVtZW50cyBJV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVEYXRhTW9kZWxQcm9wZXJ0aWVzewotCQotCi0JcHVibGljIFdlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KW1vZGVsLmdldFByb3BlcnR5KCBJV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QgKTsKLQkJU3RyaW5nIGNvbnRleHRSb290ID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoIElXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVYVF9ST09UICk7Ci0JCWlmIChjb250ZXh0Um9vdCAhPSBudWxsKSB7Ci0JCQlDb21wb25lbnRVdGlsaXRpZXMuc2V0U2VydmVyQ29udGV4dFJvb3QocHJvamVjdCwgY29udGV4dFJvb3QpOwkJCQotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi19Cg==